@curless/sinocare-demo 0.61.0 → 0.62.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/index.js +1926 -2216
- package/dist/index.js.map +1 -1
- package/package.json +9 -7
- package/dist/__tests__/checkout-card.test.d.ts +0 -2
- package/dist/__tests__/checkout-card.test.d.ts.map +0 -1
- package/dist/__tests__/checkout-card.test.js +0 -315
- package/dist/__tests__/checkout-card.test.js.map +0 -1
- package/dist/checkout-card.generated.d.ts +0 -2
- package/dist/checkout-card.generated.d.ts.map +0 -1
- package/dist/checkout-card.generated.js +0 -6
- package/dist/checkout-card.generated.js.map +0 -1
- package/dist/index.d.ts +0 -3
- package/dist/index.d.ts.map +0 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../../../packages/internal/sinocare-storefront/src/catalog.ts","../../../packages/internal/sinocare-storefront/src/card.ts","../../../packages/internal/sinocare-storefront/src/checkout.ts","../../../packages/internal/sinocare-storefront/src/instructions.ts","../../../packages/internal/sinocare-storefront/src/tools.ts","../../../packages/internal/sinocare-storefront/src/views.ts","../src/checkout-card.generated.ts"],"sourcesContent":["#!/usr/bin/env node\n// Buyer-side AP2: sign the PaymentMandate as a real ES256 JWS bound to the cart.\nimport { createHash } from 'node:crypto';\nimport { readFileSync, renameSync, rmSync, writeFileSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\n// What this storefront and the wallet connector say and show in common — the\n// aisles, the card metadata, the model instructions, the twelve shared tools,\n// and the catalogue/order views. Private to this repo, so it is bundled into\n// dist rather than resolved by name (see tsup.config.ts).\nimport {\n CARD_MIME,\n type CheckoutGroup,\n type Product,\n type ToolDef,\n buildInstructions,\n categoryQuery,\n checkoutView,\n ordersView,\n priceDisplayOf,\n productsView,\n resolveProduct,\n servesCardUri,\n storefrontTools,\n uiMeta,\n widgetMeta,\n} from '@agentbank/sinocare-storefront';\n// Buyer-side MPP · Tempo — parse the 402 challenge, pay the on-chain TIP-20\n// transfer, build the Payment credential. Same SDK, different subpath.\nimport {\n type AcpClientOptions,\n completeCheckout,\n purchaseOf,\n readCheckoutSession,\n totalOf,\n} from '@curless/agentbank-protocols/acp';\nimport {\n type Ap2IntentMandate,\n signIntentMandate,\n signPaymentMandate,\n} from '@curless/agentbank-protocols/ap2';\n// Buyer-side USDC-over-Solana x402 — build + partially sign an SPL transfer, the\n// facilitator co-signs feePayer + submits. Same SDK, different subpath.\nimport {\n type SolanaX402Requirements,\n addressFromSecretKey,\n secretKeyFromString,\n signSolanaX402Payment,\n} from '@curless/agentbank-protocols/solana';\nimport { payMppTempoChallenge } from '@curless/agentbank-protocols/tempo';\n// Buyer-side x402 lives in the SDK — sign EIP-3009, encode X-PAYMENT, read USDC\n// balance. The demo never hand-rolls the signing.\nimport {\n type Eip712Signer,\n type X402PaymentRequirements,\n cdpAccountSigner,\n encodeXPaymentHeader,\n signX402Payment,\n signerFromPrivateKey,\n usdcBalance,\n} from '@curless/agentbank-protocols/x402';\n// Buyer-side RLUSD/XRPL x402 — sign an Ed25519 Payment, encode X-PAYMENT. Same\n// SDK, different subpath. encodeXPaymentHeader collides with /x402's, so alias it.\nimport {\n type XrplPaymentRequirements,\n encodeXPaymentHeader as encodeXrplXPaymentHeader,\n signXrplPayment,\n} from '@curless/agentbank-protocols/xrpl';\nimport { type PaymentCredential, createBuyerSession } from '@curless/agentbank-sdk';\nimport { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport {\n CallToolRequestSchema,\n ListResourcesRequestSchema,\n ListToolsRequestSchema,\n ReadResourceRequestSchema,\n} from '@modelcontextprotocol/sdk/types.js';\nimport type { Hex } from 'viem';\nimport { generatePrivateKey } from 'viem/accounts';\nimport { Client as XrplClient, Wallet as XrplWallet } from 'xrpl';\n// The checkout MCP App card (a single self-contained HTML), built from\n// examples/sinocare-demo/widget and served as a ui:// resource.\nimport { CHECKOUT_CARD_HTML } from './checkout-card.generated.js';\n\n// @curless/sinocare-demo — a SIMULATED \"Sinocare\" storefront MCP for the BUYER.\n// Ordering is end-to-end agentic:\n// 1. browse + place an order via Sinocare's merchant backend\n// (mcp.curless.ai/sinocare) — the merchant prices it and opens a\n// merchant-quoted ACP checkout session with its own key;\n// 2. THIS buyer agent completes the charge over ACP with its own payment\n// credential (test card) — the merchant set the price, the agent pays.\n// The storefront never sees the merchant's key; it holds only its OWN buyer\n// token, exactly like a real agent buyer.\n//\n// Run (Claude Desktop / any MCP client):\n// npx -y @curless/sinocare-demo\n// with env:\n// AGENTBANK_AGENT_TOKEN the buyer's agentbank agent key (agb_…, agent:execute).\n// SINOCARE_BUYER_NAME / SINOCARE_BUYER_EMAIL who this agent buys for (optional;\n// unset = anonymous orders, as before)\n// Use a TEST, no-org key (the demo org is shared).\n// AGENTBANK_API_URL base URL (default https://mcp.curless.ai; set\n// http://localhost:3000 for local dev).\n// AGENTBANK_PAYMENT_TOKEN delegated card token (default pm_card_visa).\n// Real ACP credential (optional) — mint a Shared Payment Token per order\n// instead of reusing a plain card token. This is what a buyer's WALLET does\n// when an agent asks to spend: the token is scoped to one seller, one amount,\n// one currency and a short expiry, so it can buy nothing else.\n// STRIPE_AGENT_SECRET_KEY the BUYER side's Stripe key (the wallet's PSP).\n// Must be a DIFFERENT Stripe account from the\n// seller's — an SPT cannot be granted to yourself.\n// AGENTBANK_SELLER_PROFILE the seller's Stripe profile id (profile_…) that\n// the gateway redeems with.\n// STRIPE_AGENT_PAYMENT_METHOD optional pm_… to mint from; in test mode a\n// throwaway one is created from tok_visa.\n// Set all of these and buy_sinocare_product_acp pays with a real spt_; leave\n// them unset and it falls back to AGENTBANK_PAYMENT_TOKEN.\n// Two guards, both OFF by default — an order here is one click in the card,\n// and a Sinocare room is €1,280–2,900:\n// SINOCARE_ALLOW_LIVE_WALLET=1 allow minting with a LIVE key (REAL money).\n// SINOCARE_WALLET_FALLBACK=1 if minting fails, pay with the plain card\n// token instead of failing the order.\n// Without them a live key refuses to mint, and a mint failure fails the\n// order rather than silently paying with an unscoped credential.\n// x402 USDC (EVM) — pick ONE signer:\n// X402_SIGNER=cdp a CDP Server Wallet, zero raw key (for MAINNET);\n// needs CDP_API_KEY_ID/_SECRET/_WALLET_SECRET.\n// X402_PAYER_PRIVATE_KEY a local funded wallet key (testnet or mainnet).\n// The gateway's mode (test/live key) decides the network it quotes; fund the\n// buyer wallet with USDC on that network.\n// x402 RLUSD (XRP Ledger) — for buy_sinocare_product_rlusd / xrpl_buyer_wallet:\n// XRPL_BUYER_SEED an `sEd…` testnet seed (Ed25519) holding RLUSD + a\n// little test XRP for the fee/reserve.\n// XRPL_TESTNET_WSS RPC (default wss://s.altnet.rippletest.net:51233).\n// XRPL_RLUSD_ISSUER RLUSD issuer r-address (default = testnet issuer).\n//\n// IMPORTANT: only JSON-RPC may be written to stdout (the MCP stdio transport).\n// Never console.log here — diagnostics go to stderr.\n\nconst API_BASE = (process.env.AGENTBANK_API_URL ?? 'https://mcp.curless.ai').replace(/\\/$/, '');\nconst SINOCARE = `${API_BASE}/sinocare`;\n\n// The buyer's ACP client. Every order below reads the session's real total\n// and completes through this rather than hand-writing /acp/... — the two calls\n// were written out twice already, and both copies re-derived that the\n// authoritative amount is on the session, not in the backend's display string.\nconst acp = (merchantId: string): AcpClientOptions => {\n // Throw rather than send an empty bearer. Every caller below already refuses\n // to open a checkout without a token, so reaching here without one is a bug\n // in this file — and an empty Authorization header would surface as a 401\n // from the gateway, which reads like a credential problem on the buyer's end.\n if (!TOKEN) throw new Error('AGENTBANK_AGENT_TOKEN is not set');\n return { baseUrl: API_BASE, merchantId, token: TOKEN };\n};\nconst TOKEN = process.env.AGENTBANK_AGENT_TOKEN;\n\n// WHO this agent is buying for. A buyer agent is the only party that knows its\n// user's identity — the merchant never meets them — so it is the only place this\n// can enter the system. Sent on every checkout, and from there it reaches the\n// order, the card provider's customer record, the Curless mirror and the Shopify\n// order.\n//\n// Unset → nothing is sent, and every order stays anonymous exactly as before.\n// Deliberately NOT defaulted to a placeholder: a fabricated buyer would travel\n// into a merchant's financial records and Shopify would email the address.\nconst BUYER = (() => {\n const name = process.env.SINOCARE_BUYER_NAME?.trim();\n const email = process.env.SINOCARE_BUYER_EMAIL?.trim();\n if (!name && !email) return undefined;\n return { ...(name ? { name } : {}), ...(email ? { email } : {}) };\n})();\nconst PAYMENT_TOKEN = process.env.AGENTBANK_PAYMENT_TOKEN ?? 'pm_card_visa';\nconst STRIPE_AGENT_KEY = process.env.STRIPE_AGENT_SECRET_KEY;\nconst SELLER_PROFILE = process.env.AGENTBANK_SELLER_PROFILE;\n\n// The BUYER's Curless wallet, signed into at runtime by the person buying —\n// not configuration. Two ways to pay by card now sit side by side: the agent's\n// own Stripe key (STRIPE_AGENT_SECRET_KEY above, the demo's original path), and\n// this, where the credential is minted from the card the buyer bound and capped\n// by the limits the buyer set. Both stay: the wallet is the one being built,\n// and the agent-key path is what still works when nobody has signed in.\nconst wallet = createBuyerSession({ baseUrl: API_BASE });\n\n// One browser sign-in at a time, shared by whoever asks. Two cards (or a card\n// and the model) each starting their own would show the person two different\n// codes for the same wallet, and only one of them would ever complete.\nlet pending: Awaited<ReturnType<typeof wallet.startDeviceLogin>> | null = null;\n\n/**\n * The signed-in wallet owner, as a buyer block — or undefined when nobody is\n * signed in (the agent-key ACP path, which keeps SINOCARE_BUYER_EMAIL).\n */\nconst walletBuyer = (): { buyer: { email: string; name?: string } } | undefined => {\n const who = wallet.current();\n if (!who) return undefined;\n return { buyer: { email: who.email, ...(who.name ? { name: who.name } : {}) } };\n};\n\n// Whether a sign-in was ever STARTED here. `pending` alone cannot say: it is\n// null both before anyone begins and after one times out, and reporting those\n// two as the same thing is how \"nobody has signed in yet\" got told to someone\n// as \"your code expired\".\nlet loginEverStarted = false;\n\nconst pendingLogin = async (): Promise<NonNullable<typeof pending>> => {\n if (pending) return pending;\n const started = await wallet.startDeviceLogin();\n pending = started;\n loginEverStarted = true;\n // The session adopts itself when the person finishes; this just clears the\n // slot so a later sign-in starts fresh. Errors are the poller's to report —\n // swallowing them here would leave a dead login pinned forever.\n started\n .wait()\n .catch(() => undefined)\n .finally(() => {\n pending = null;\n });\n return started;\n};\n\n// The gateway's spend-policy reasons, said to the PERSON. Mirrors the codes\n// `evaluatePolicy` emits; anything unmapped falls through to the gateway's own\n// wording rather than being swallowed, so a new code shows up as English text\n// instead of disappearing.\n// The gateway's refusals, said to the PERSON — each with its OWN next step.\n// One shared \"想付的话可以先调高限额\" tail was wrong for every reason that is\n// not a limit: it told someone whose wallet has no card at all to go raise a\n// cap, which sends them to the wrong screen and leaves the actual problem\n// unmentioned.\nconst REFUSALS: Array<[RegExp, string, string]> = [\n [/per_transaction_limit/, '超过了你设的单笔上限', '可以在钱包里调高单笔上限。'],\n [/daily_limit/, '超过了你设的当日上限', '可以调高当日上限,或者明天再来。'],\n [/monthly_limit/, '超过了你设的当月上限', '可以调高当月上限,或者下个月再来。'],\n [/merchant_not_allowed/, '这个商家不在你的白名单里', '把它加进白名单就能付。'],\n [/mcc_not_allowed/, '这个商家类别不在你的白名单里', '把这个类别加进白名单就能付。'],\n [\n /no approval step yet/,\n '金额超过了你设的\"需要我批准\"的门槛,而现在还没有审批环节',\n '把这个门槛调高或清掉就能付。',\n ],\n [/no card is bound/, '这个钱包还没绑卡', '去钱包页面绑一张卡再回来付。'],\n];\n\n// A wallet refusal is not a payment failure, and the difference matters to the\n// person: nothing was charged. Rendered through the card's `message`, so it has\n// to be JSON and it has to be readable.\nconst walletRefusal = (\n err: Error,\n): { content: Array<{ type: 'text'; text: string }>; isError: true } => {\n const raw = err.message;\n const hit = REFUSALS.find(([re]) => re.test(raw));\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n walletRefused: true,\n message: hit\n ? `钱包没付这笔 —— ${hit[1]}。没有扣款。${hit[2]}`\n : `钱包没付这笔:${raw}。没有扣款。`,\n // The wallet page is where every one of these is fixed, so the card\n // can hand the person somewhere to go rather than a dead end.\n walletUrl: `${API_BASE}/buyer/wallet`,\n next: \"this is the BUYER'S OWN limit, not a payment failure. Tell them which limit stopped it and offer to raise it with wallet_set_limits — do NOT retry with another payment method.\",\n }),\n },\n ],\n isError: true,\n };\n};\nconst AGENT_PM = process.env.STRIPE_AGENT_PAYMENT_METHOD;\nconst STRIPE_AGENT_SECRET_KEY_IS_LIVE = !!STRIPE_AGENT_KEY?.startsWith('sk_live_');\n// Two deliberate escape hatches, both off by default:\n// SINOCARE_ALLOW_LIVE_WALLET=1 — mint with a live key (real money, see below).\n// SINOCARE_WALLET_FALLBACK=1 — if minting fails, pay with the plain card\n// token anyway instead of failing the order.\nconst WALLET_LIVE_OK = process.env.SINOCARE_ALLOW_LIVE_WALLET === '1';\nconst WALLET_FALLBACK_OK = process.env.SINOCARE_WALLET_FALLBACK === '1';\n\n// Mint a REAL ACP Shared Payment Token for exactly this order — the buyer\n// wallet's half of agentic commerce. Scoped to the seller's profile, this\n// amount, this currency, 15 minutes; the agent can spend it nowhere else.\n// Returns null when the wallet side isn't configured, so the demo falls back to\n// the plain card token it has always used. Plain fetch — no Stripe SDK here.\n// ⚠️ The throwaway card is minted FRESH per order, deliberately. A\n// PaymentMethod built from a single-use token (tok_visa) and never attached to\n// a Customer is CONSUMED once a PaymentIntent draws on it — Stripe then refuses\n// to issue an SPT against it (\"The payment method is in a consumed or deleted\n// state\"). Caching one per process therefore broke every order after the\n// first. One extra test-mode API call per order is the price of a wallet that\n// works twice.\n\nconst mintSharedPaymentToken = async (\n amountMinor: number,\n currency: string,\n): Promise<string | null> => {\n if (!STRIPE_AGENT_KEY || !SELLER_PROFILE) return null;\n // A live key here means a order charges a REAL card for the full product\n // price (€1,280–2,900) the moment someone clicks pay in the card — with no\n // confirmation step anywhere. Refuse unless that is explicitly what you want.\n if (STRIPE_AGENT_SECRET_KEY_IS_LIVE && !WALLET_LIVE_OK) {\n throw new Error(\n 'refusing to mint with a LIVE Stripe key — a order would charge a real card for the full product price. Set SINOCARE_ALLOW_LIVE_WALLET=1 if that is genuinely intended.',\n );\n }\n const post = async (\n path: string,\n body: Record<string, string>,\n preview = false,\n ): Promise<Record<string, unknown>> => {\n const res = await fetch(`https://api.stripe.com/v1/${path}`, {\n method: 'POST',\n headers: {\n authorization: `Bearer ${STRIPE_AGENT_KEY}`,\n 'content-type': 'application/x-www-form-urlencoded',\n ...(preview ? { 'stripe-version': '2026-04-22.preview' } : {}),\n },\n body: new URLSearchParams(body),\n });\n const json = (await res.json()) as { id?: string; error?: { message?: string } };\n if (!res.ok) throw new Error(`stripe ${path} -> ${res.status}: ${json.error?.message ?? ''}`);\n return json as Record<string, unknown>;\n };\n // The card the token draws on. A real wallet uses the customer's saved card;\n // in test mode a fresh throwaway one stands in for every order (see above).\n const pm =\n AGENT_PM ??\n String((await post('payment_methods', { type: 'card', 'card[token]': 'tok_visa' })).id);\n const spt = await post(\n 'shared_payment/issued_tokens',\n {\n payment_method: pm,\n 'seller_details[network_business_profile]': SELLER_PROFILE,\n 'usage_limits[currency]': currency.toLowerCase(),\n 'usage_limits[max_amount]': String(amountMinor),\n 'usage_limits[expires_at]': String(Math.floor(Date.now() / 1000) + 900),\n },\n true,\n ).catch((err: unknown) => {\n // A PINNED card hits the same one-shot wall, and there we can't just mint a\n // new one — say so instead of surfacing Stripe's bare message.\n if (AGENT_PM && /consumed or deleted/i.test(String(err))) {\n throw new Error(\n `STRIPE_AGENT_PAYMENT_METHOD (${AGENT_PM}) is spent — a payment method built from a single-use token can back exactly one charge. Unset it and the demo mints a fresh throwaway card per order, or pin one attached to a Customer.`,\n );\n }\n throw err;\n });\n return String(spt.id);\n};\n\n// Sinocare backend (public — no buyer token; the merchant key lives there).\nconst backend = async <T>(path: string, init: RequestInit = {}): Promise<T> => {\n const res = await fetch(`${SINOCARE}${path}`, {\n ...init,\n headers: { 'content-type': 'application/json', ...(init.headers ?? {}) },\n });\n if (!res.ok) {\n throw new Error(\n `sinocare-backend ${path} -> ${res.status}: ${await res.text().catch(() => '')}`,\n );\n }\n return (await res.json()) as T;\n};\n\n// --- x402 (stablecoin) payment --------------------------------------------\n// x402 settles USDC. The amount is now MERCHANT-QUOTED: sinocare-backend opens a\n// merchant-quoted x402 session via the SDK and sets the USDC price (a small\n// fixed test charge on testnet). The buyer just signs + pays the session — it\n// never computes or passes the amount.\n\n// The buyer's x402 signer, resolved once and cached:\n// • X402_SIGNER=cdp → a Coinbase CDP Server Wallet (zero raw key; for\n// mainnet — needs CDP_API_KEY_ID/_SECRET/_WALLET_SECRET)\n// • X402_PAYER_PRIVATE_KEY → a local key (testnet/mainnet)\n// • neither → null (signX402 falls back to a throwaway key,\n// which only settles under a STUB facilitator)\n// Returning the Eip712Signer (address + signTypedData) lets both the balance\n// pre-flight and the wallet tool read .address regardless of signer kind.\nconst useCdpSigner = process.env.X402_SIGNER === 'cdp';\nlet buyerSignerPromise: Promise<Eip712Signer | null> | undefined;\nconst buyerSigner = (): Promise<Eip712Signer | null> => {\n buyerSignerPromise ??= (async () => {\n if (useCdpSigner) return cdpAccountSigner();\n const k = process.env.X402_PAYER_PRIVATE_KEY as Hex | undefined;\n return k ? signerFromPrivateKey(k) : null;\n })();\n return buyerSignerPromise;\n};\nconst fmtUsdc = (baseUnits: bigint): string => `${(Number(baseUnits) / 1e6).toFixed(2)} USDC`;\n\n// Answer an x402 402 challenge: sign an EIP-3009 transferWithAuthorization (via\n// the buyer x402 SDK) → base64 X-PAYMENT header. With a REAL facilitator (Base\n// Sepolia or mainnet) the signer must hold USDC on that chain — configure a CDP\n// wallet or X402_PAYER_PRIVATE_KEY; without either a throwaway key signs, which\n// only settles under a STUB facilitator.\nconst signX402 = async (r: X402PaymentRequirements): Promise<string> => {\n const signer = (await buyerSigner()) ?? (await signerFromPrivateKey(generatePrivateKey()));\n return encodeXPaymentHeader(await signX402Payment({ signer, requirements: r }));\n};\n\n// --- RLUSD (XRP Ledger) x402 payment --------------------------------------\n// The buyer's XRPL wallet, from XRPL_BUYER_SEED (an `sEd…` seed → Ed25519). A\n// real buyer holds this in a wallet; the demo derives it from env. Null when\n// unset — the RLUSD tool then tells the user to configure it. Unlike USDC there\n// is no throwaway fallback: settling RLUSD needs a funded, trust-lined account.\nconst XRPL_SEED = process.env.XRPL_BUYER_SEED;\nconst XRPL_RPC = process.env.XRPL_TESTNET_WSS ?? 'wss://s.altnet.rippletest.net:51233';\nlet xrplWalletCache: XrplWallet | null = null;\nconst xrplBuyer = (): XrplWallet | null => {\n if (xrplWalletCache) return xrplWalletCache;\n if (!XRPL_SEED) return null;\n xrplWalletCache = XrplWallet.fromSeed(XRPL_SEED);\n return xrplWalletCache;\n};\n\n// USDC-over-Solana buyer: SOLANA_BUYER_SECRET is a devnet Solana secret key (a\n// solana-keygen JSON array or a base58 string) holding devnet USDC. Cached as a\n// promise (base58 decode is async). SOLANA_RPC fetches balances + a blockhash.\nconst SOLANA_RPC = process.env.SOLANA_RPC_URL ?? 'https://api.devnet.solana.com';\nlet solanaSecretPromise: Promise<Uint8Array | null> | undefined;\nconst solanaBuyerSecret = (): Promise<Uint8Array | null> => {\n solanaSecretPromise ??= (async () => {\n const s = process.env.SOLANA_BUYER_SECRET;\n if (!s) return null;\n try {\n return await secretKeyFromString(s);\n } catch {\n return null;\n }\n })();\n return solanaSecretPromise;\n};\n\n// The buyer's USDC balance (base units) across its token accounts for a mint, via\n// a raw Solana JSON-RPC call (no SPL SDK). null on any RPC error → skip pre-flight.\nconst solanaUsdcBalance = async (owner: string, mint: string): Promise<number | null> => {\n try {\n const res = await fetch(SOLANA_RPC, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({\n jsonrpc: '2.0',\n id: 1,\n method: 'getTokenAccountsByOwner',\n params: [owner, { mint }, { encoding: 'jsonParsed' }],\n }),\n });\n // biome-ignore lint/suspicious/noExplicitAny: raw JSON-RPC shape\n const j = (await res.json()) as any;\n const accounts = j?.result?.value ?? [];\n let total = 0;\n for (const a of accounts) {\n total += Number(a?.account?.data?.parsed?.info?.tokenAmount?.amount ?? 0);\n }\n return total;\n } catch {\n return null;\n }\n};\n\n// Skyfire KYAPay — the BUYER mints a Skyfire-SIGNED PAY token (Skyfire's key signs\n// it; unlike the crypto rails the buyer can't self-sign) and presents it to the\n// MERCHANT backend, which charges it via the merchant SDK. SKYFIRE_BUYER_API_KEY\n// mints (buyer agent key from the Skyfire dashboard); SKYFIRE_SELLER_SERVICE_ID is\n// the seller service the payment authorizes. The agentbank key that verifies +\n// charges is the MERCHANT backend's, not the demo's.\nconst SKYFIRE_API = process.env.SKYFIRE_API_URL ?? 'https://api.skyfire.xyz';\nconst SKYFIRE_BUYER_API_KEY = process.env.SKYFIRE_BUYER_API_KEY;\nconst SKYFIRE_SELLER_SERVICE_ID = process.env.SKYFIRE_SELLER_SERVICE_ID;\n// A small fixed test charge (USD quote → settles USDC). Pin with SKYFIRE_TEST_AMOUNT.\n// 0.001 keeps each test charge tiny so a small Skyfire balance covers many runs.\nconst SKYFIRE_TEST_AMOUNT = process.env.SKYFIRE_TEST_AMOUNT ?? '0.001';\n\n// --- MPP · Tempo — on-chain TIP-20 settlement (Tempo payments chain, testnet) ---\n// MPP's `tempo` method: agentbank answers with a 402 whose signed challenge carries\n// the on-chain terms; the buyer wallet (TEMPO_BUYER_PRIVATE_KEY, funded pathUSD via\n// the Tempo faucet) pays with transferWithMemo; agentbank verifies the transfer\n// on-chain by tx hash. The buyer side (pay + credential) is the SDK\n// @curless/agentbank-protocols/tempo — the demo only holds config. A tiny fixed\n// amount so a small balance covers many runs.\nconst TEMPO_RPC = process.env.TEMPO_RPC_URL ?? 'https://rpc.moderato.tempo.xyz';\nconst TEMPO_BUYER_PRIVATE_KEY = process.env.TEMPO_BUYER_PRIVATE_KEY as Hex | undefined;\nconst MPP_TEMPO_TEST_AMOUNT = Number(process.env.MPP_TEMPO_TEST_AMOUNT ?? 10000); // 0.01 pathUSD (6dp)\n\n// Mint a Skyfire PAY token (Skyfire ES256-signs it) authorizing `amountUsd` to our\n// seller service — returned as a JWT the buyer presents in the x-kyapay-token header.\nconst mintSkyfirePayToken = async (amountUsd: string): Promise<string> => {\n if (!SKYFIRE_BUYER_API_KEY) throw new Error('set SKYFIRE_BUYER_API_KEY');\n if (!SKYFIRE_SELLER_SERVICE_ID) throw new Error('set SKYFIRE_SELLER_SERVICE_ID');\n const expiresAt = Math.floor(Date.now() / 1000) + 300;\n const res = await fetch(`${SKYFIRE_API}/api/v1/tokens`, {\n method: 'POST',\n headers: { 'content-type': 'application/json', 'skyfire-api-key': SKYFIRE_BUYER_API_KEY },\n body: JSON.stringify({\n type: 'pay',\n buyerTag: `sinocare-${Date.now()}`,\n tokenAmount: amountUsd,\n sellerServiceId: SKYFIRE_SELLER_SERVICE_ID,\n expiresAt,\n }),\n });\n if (!res.ok) {\n throw new Error(`skyfire mint -> ${res.status}: ${(await res.text()).slice(0, 200)}`);\n }\n const { token } = (await res.json()) as { token?: string };\n if (!token) throw new Error('skyfire mint returned no token');\n return token;\n};\n\n// Run a callback with a connected XRPL client, always disconnecting after — so a\n// order opens ONE connection for the balance pre-flight AND the signing autofill\n// instead of one each.\nconst withXrplClient = async <T>(fn: (c: XrplClient) => Promise<T>): Promise<T> => {\n const client = new XrplClient(XRPL_RPC);\n await client.connect();\n try {\n return await fn(client);\n } finally {\n await client.disconnect().catch(() => undefined);\n }\n};\n\n// Read the buyer's balance of an XRPL IOU (RLUSD) via account_lines — the trust\n// line to the issuer for that currency. Returns the decimal string balance, '0'\n// if no trust line / no funds. Uses the caller's connected client.\nconst rlusdBalance = async (\n client: XrplClient,\n owner: string,\n currencyHex: string,\n issuer: string,\n): Promise<string> => {\n try {\n const res = await client.request({ command: 'account_lines', account: owner, peer: issuer });\n const line = res.result.lines.find((l) => l.currency === currencyHex && l.account === issuer);\n return line?.balance ?? '0';\n } catch {\n return '0';\n }\n};\n\n// Answer an XRPL x402 402 challenge: sign a standard Payment (Ed25519, invoice\n// bound as a Memo) via the buyer /xrpl SDK → base64 X-PAYMENT, using the caller's\n// connected client for autofill. The wallet must hold RLUSD + a little test XRP.\nconst signXrpl = async (\n client: XrplClient,\n r: XrplPaymentRequirements,\n wallet: XrplWallet,\n): Promise<string> =>\n encodeXrplXPaymentHeader(await signXrplPayment({ requirements: r, wallet, client }));\n\n// A standing AP2 IntentMandate (delegated order authority). The user signs it\n// ONCE via authorize_agent_budget; buy_sinocare_product_ucp then attaches it so\n// the agent can complete orders within the cap without confirming each one.\n// In-memory for the session (a real buyer wallet would persist + re-sign it).\ntype AgentBudget = { mandate: Ap2IntentMandate; maxAmountEur: number; expiresAt: string };\n\n// Persist the standing authorization across restarts. It's a delegation the user\n// signs ONCE (authorize_agent_budget); keeping it only in memory meant a process\n// restart silently dropped the cap, letting an over-budget order slip through.\n// The mandate is a self-contained signed JWS, so persisting + re-presenting it\n// stays cryptographically valid (we store it, we don't re-sign). Keyed to the\n// agent token so a different buyer can't inherit a stale grant; an expired grant\n// is dropped on load. Override the path with SINOCARE_DEMO_BUDGET_FILE.\nconst BUDGET_FILE =\n process.env.SINOCARE_DEMO_BUDGET_FILE ?? join(homedir(), '.agentbank-sinocare-budget.json');\nconst tokenFp = TOKEN ? createHash('sha256').update(TOKEN).digest('hex').slice(0, 16) : '';\n\nconst saveBudget = (b: AgentBudget | null): void => {\n try {\n // mode 0o600: the file holds a signed IntentMandate (a bearer authorization);\n // keep it owner-only, not world-readable, even in a demo home dir.\n if (b)\n writeFileSync(BUDGET_FILE, JSON.stringify({ tokenFp, budget: b }), {\n encoding: 'utf8',\n mode: 0o600,\n });\n else rmSync(BUDGET_FILE, { force: true });\n } catch {\n /* best-effort: a demo persistence hiccup must never break order */\n }\n};\n\nconst loadBudget = (): AgentBudget | null => {\n try {\n const saved = JSON.parse(readFileSync(BUDGET_FILE, 'utf8')) as {\n tokenFp?: string;\n budget?: AgentBudget;\n };\n const b = saved.budget;\n // Ignore a grant signed for a different token, or one that has expired.\n if (saved.tokenFp !== tokenFp || !b?.expiresAt || Date.parse(b.expiresAt) < Date.now()) {\n rmSync(BUDGET_FILE, { force: true });\n return null;\n }\n return b;\n } catch {\n return null;\n }\n};\n\nlet agentBudget: AgentBudget | null = loadBudget();\n\n// The last checkout the card was opened for. The MCP-App host doesn't reliably\n// deliver the initial tool result to the widget (it self-heals by re-invoking\n// start_sinocare_checkout with NO args) — so we replay the last pick here, or the\n// card would hang on \"Loading…\". Mirrors the merchant card's read-tools-work-\n// with-empty-args behavior.\ntype CheckoutPick = {\n sku: string;\n name: string;\n priceEur: string;\n quantity: number;\n imageUrl?: string;\n externalShopify?: boolean; // the external link lands on Shopify checkout\n // Has THIS pick been paid? Drives picker-vs-receipt on rehydrate without\n // deleting the order record — a fresh re-open of an already-ordered product\n // stays a picker (ordered=false) while its past receipt is kept intact.\n ordered?: boolean;\n};\nlet lastCheckout: CheckoutPick | null = null;\n\n// Completed orders, by sku — so a checkout card that gets REHYDRATED (the host\n// re-invokes start_sinocare_checkout when the user leaves the conversation and\n// comes back) shows the receipt for that product instead of resetting to the\n// payment picker. Ordering hands off to the conversation (card → sendMessage →\n// the agent runs buy_sinocare_product_*), so the card's own DOM \"已发起\" note is\n// lost on reload; without this the reloaded card always re-rendered the picker\n// even though the product was already paid for. In-memory for the process (same\n// lifetime + same-process assumption as lastCheckout — one long-lived stdio\n// server per Claude session). Keyed by sku, which the card passes to book_* with\n// the exact sku it opened the checkout for, so the keys line up. PERSISTED to\n// disk (see below): without that, opening the card from another conversation — a\n// fresh stdio process with an empty map — lost every order, so a paid product's\n// card rehydrated to the payment picker as if never ordered.\ntype OrderReceipt = {\n sku: string;\n name: string;\n protocol?: string;\n total?: string; // human total: amountDisplay / priceEur / paidUsdc / paidRlusd\n status?: string;\n orderId?: string;\n txHash?: string;\n explorer?: string;\n message?: string;\n};\nconst completedOrders = new Map<string, OrderReceipt>();\n\n// Persist the card's checkout state (last pick + order receipts) across restarts\n// and conversations, so returning to a paid product's card shows its receipt\n// instead of resetting to the picker — and so a fresh \"buy it again\" starts\n// clean. Keyed to the agent token so a different buyer starts empty. Override the\n// path with SINOCARE_DEMO_STATE_FILE.\nconst STATE_FILE =\n process.env.SINOCARE_DEMO_STATE_FILE ?? join(homedir(), '.agentbank-sinocare-checkout.json');\nconst saveCheckoutState = (): void => {\n // No buyer token → no stable identity to key on. Persisting under an empty\n // tokenFp would pool every anonymous buyer into one shared file (and let one\n // clobber another), so keep this session's state in memory only.\n if (!tokenFp) return;\n try {\n // Read-merge-write: a sibling process (another conversation for the SAME\n // buyer) may have ordered between our startup snapshot and now. Union its\n // orders with ours — ours wins ties (we just acted) — so our stale\n // snapshot never clobbers a order another conversation recorded.\n const merged = new Map(completedOrders);\n try {\n const disk = JSON.parse(readFileSync(STATE_FILE, 'utf8')) as {\n tokenFp?: string;\n orders?: Array<[string, OrderReceipt]>;\n /** Pre-2026-08-21 spelling. Read, never written — see the loader below. */\n bookings?: Array<[string, OrderReceipt]>;\n };\n if (disk.tokenFp === tokenFp) {\n for (const [k, v] of disk.orders ?? disk.bookings ?? [])\n if (!merged.has(k)) merged.set(k, v);\n }\n } catch {\n /* no readable prior file — just write ours */\n }\n // Fold the union back into memory so this long-lived process also sees a\n // sibling conversation's orders on its next rehydrate (no restart needed).\n for (const [k, v] of merged) if (!completedOrders.has(k)) completedOrders.set(k, v);\n // Atomic replace: write a temp then rename, so a concurrent reader never\n // observes a half-written file.\n const tmp = `${STATE_FILE}.${process.pid}.tmp`;\n writeFileSync(tmp, JSON.stringify({ tokenFp, lastCheckout, orders: [...merged] }), {\n encoding: 'utf8',\n mode: 0o600,\n });\n renameSync(tmp, STATE_FILE);\n } catch {\n /* best-effort: a demo persistence hiccup must never break the card */\n }\n};\nif (tokenFp) {\n try {\n const saved = JSON.parse(readFileSync(STATE_FILE, 'utf8')) as {\n tokenFp?: string;\n lastCheckout?: CheckoutPick | null;\n orders?: Array<[string, OrderReceipt]>;\n /**\n * The key this file used before 2026-08-21, when the demo still spoke the\n * resort vocabulary it was forked from. Read so an existing state file\n * keeps its receipts — `orders ?? []` alone would read every one of them\n * as absent and silently drop the lot on the next write.\n */\n bookings?: Array<[string, OrderReceipt]>;\n };\n // Ignore state saved under a different buyer token.\n if (saved.tokenFp === tokenFp) {\n // ⚠️ `orders` ONLY. `lastCheckout` is deliberately NOT restored.\n //\n // It exists for one case: a card self-healing with no arguments, where\n // the server replays the last pick so the widget fills instead of\n // hanging. Restored from disk it does that to a card belonging to a\n // DIFFERENT product — restart the app, ask for a new hotel, and the card\n // renders the previous order's receipt, which reads as having ordered\n // something you did not.\n //\n // `orders` is safe to restore because it is keyed by sku: it is only\n // ever consulted for a product someone actually asked about.\n for (const [k, v] of saved.orders ?? saved.bookings ?? []) completedOrders.set(k, v);\n }\n } catch {\n /* no persisted state yet — start empty */\n }\n}\n\n// Record a completed order (only when it actually settled) and return the tool\n// result — so every buy_sinocare_product_* success is remembered for rehydration\n// in ONE place. Pulls the human fields off the result value the tool already\n// built (total shape differs by rail: total / paidUsdc / paidRlusd / priceEur).\nconst finishOrder = (\n sku: string,\n value: Record<string, unknown> & {\n ordered?: boolean;\n /**\n * What ACTUALLY paid — required, so a new payment path cannot forget it.\n *\n * The card used to label a receipt with the button the person clicked. When\n * a chosen method could not go through and the order settled another way,\n * that filed the charge under a method with no part in it: four real\n * payments were shown as \"paid by the Curless wallet\" while the wallet had\n * never been signed in.\n */\n payer: string;\n },\n) => {\n if (sku && value.ordered) {\n // Record the sale on the Shopify side, if the catalog is Shopify-backed.\n // Fire-and-forget: the order already settled through agentbank, so a\n // writeback failure must never affect the tool result. The backend no-ops\n // when Shopify isn't configured, so this is safe to call unconditionally.\n void backend('/shopify-order', {\n method: 'POST',\n body: JSON.stringify({\n sku,\n quantity: value.quantity,\n protocol: value.protocol,\n // Canonical writeback idempotency key: the settled order/PI id (also the\n // searchable Shopify tag), falling back to the checkout session id so\n // EVERY protocol dedups. A missing key means no dedup, and a hung-call\n // re-fire would then create a duplicate Shopify order.\n orderId: value.orderId ?? value.sessionId ?? value.paymentIntentId,\n // So the Shopify order lands under a customer, not anonymously.\n ...(BUYER ? { buyer: BUYER } : {}),\n }),\n }).catch(() => {});\n completedOrders.set(sku, {\n sku,\n name: String(value.product ?? ''),\n protocol: value.protocol as string | undefined,\n total: (value.total ?? value.paidUsdc ?? value.paidRlusd ?? value.priceEur) as\n | string\n | undefined,\n status: value.status as string | undefined,\n orderId: value.orderId as string | undefined,\n txHash: value.txHash as string | undefined,\n explorer: value.explorer as string | undefined,\n message: value.message as string | undefined,\n });\n // Mark this pick as paid so a later rehydrate resolves to the receipt — not\n // by the presence of a order record (which we now keep across re-opens),\n // but by whether THIS checkout was actually completed.\n if (lastCheckout?.sku === sku) lastCheckout.ordered = true;\n saveCheckoutState();\n }\n return text(value);\n};\n\n// ── what the checkout card offers ────────────────────────────────────────────\n/**\n * The two axes agentbank spans (money × protocol), laid out by GROUP.\n *\n * ⚠️ This is SERVER-side now, and that is what lets one card serve both shops:\n * the wallet connector sends its own three rows to the same card. A card that\n * hard-codes the payment table has to be forked per storefront, which is\n * exactly how there came to be two of them.\n *\n * • Curless 钱包 — first, and standing alone. Filing it under \"卡 · Stripe\"\n * would describe the plumbing rather than the choice:\n * everything below is how the AGENT pays, this is how the\n * PERSON pays. Three rows, because there are three\n * genuinely different ways a wallet reaches a merchant,\n * and which applies is decided by what the BUYER has\n * installed. Least-setup-required is last.\n * • 外链 — the other thing a PERSON does: leave the conversation\n * and pay on the merchant's own page.\n * • 卡 · Stripe — ACP / UCP. No coin/chain axis, so the protocol is the row.\n * • 稳定币 · 公链 — USDC·Base / USDC·Solana / RLUSD·XRPL. The chain is\n * independent of the PROTOCOL: bare x402 AND a UCP session\n * both settle any chain, so each row offers the protocol as\n * a sub-choice. UCP therefore appears under both 卡 and\n * 稳定币 — that is the two-axis point.\n * • 稳定币 · Agent 原生 — Skyfire and MPP·Tempo. These are STABLECOINS TOO; they\n * were once titled by protocol, which flipped the axis and\n * made them look like a different KIND of money. Skyfire\n * settles USDC on BASE — the same coin and chain as the\n * x402 row above. What differs is CUSTODY, not the money:\n * x402 = the buyer signs from their OWN wallet (EIP-3009);\n * Skyfire = the buyer PRE-FUNDS a Skyfire wallet and\n * Skyfire signs on their behalf, which is why that rail\n * reports a remaining balance and never a tx hash.\n */\nconst SINOCARE_GROUPS: CheckoutGroup[] = [\n {\n label: 'Curless 钱包',\n rows: [\n {\n title: 'Curless 买家钱包',\n sub: '登录后用自己绑的卡 · 受自己设的限额约束',\n actions: [{ label: '付款', tool: 'buy_sinocare_product_wallet' }],\n },\n {\n title: '钱包连接器(独立 MCP)',\n sub: '你自己装的 Curless 钱包铸凭据 · 在聊天里完成',\n actions: [{ label: '在聊天里付款', tool: 'start_sinocare_wallet_handoff', chat: true }],\n },\n {\n title: '浏览器里确认付款',\n sub: '什么都不用装 · 打开链接看清金额再批准',\n actions: [{ label: '生成付款链接', tool: 'pay_sinocare_hosted' }],\n },\n ],\n },\n {\n label: '外链 · 商家收银台',\n rows: [\n {\n title: 'Shopify / Payment Link',\n sub: '在浏览器里打开商家的收银页 · 卡',\n actions: [{ label: '打开付款页', tool: 'create_sinocare_payment_link', ext: true }],\n },\n ],\n },\n {\n label: '卡 · Stripe',\n rows: [\n {\n title: 'ACP',\n sub: 'Stripe 卡轨 · 对话内',\n actions: [{ label: '付款', tool: 'buy_sinocare_product_acp' }],\n },\n {\n title: 'UCP',\n sub: 'AP2 授权 · Stripe 卡轨 · 对话内',\n actions: [{ label: '付款', tool: 'buy_sinocare_product_ucp', args: { pay: 'card' } }],\n },\n ],\n },\n {\n label: '稳定币 · 公链(x402 / UCP)',\n rows: [\n {\n title: 'USDC · Base',\n sub: 'EVM · EIP-3009 签',\n actions: [\n { label: 'x402', tool: 'buy_sinocare_product_x402' },\n { label: '经 UCP', tool: 'buy_sinocare_product_ucp', args: { pay: 'usdc' } },\n ],\n },\n {\n title: 'USDC · Solana',\n sub: 'SVM · 部分签 · facilitator 代付 gas',\n actions: [\n { label: 'x402', tool: 'buy_sinocare_product_x402', args: { chain: 'solana' } },\n { label: '经 UCP', tool: 'buy_sinocare_product_ucp', args: { pay: 'usdc-sol' } },\n ],\n },\n {\n title: 'RLUSD · XRP Ledger',\n sub: 'Ed25519 签 · 自建 facilitator',\n actions: [\n { label: 'x402', tool: 'buy_sinocare_product_rlusd' },\n { label: '经 UCP', tool: 'buy_sinocare_product_ucp', args: { pay: 'rlusd' } },\n ],\n },\n ],\n },\n {\n label: '稳定币 · Agent 原生协议',\n rows: [\n {\n title: 'USDC · Base(Skyfire 托管)',\n sub: 'Skyfire 签 JWT · KYA 身份 + 付款授权 · 买家预充值余额',\n actions: [{ label: 'KYAPay', tool: 'buy_sinocare_product_skyfire' }],\n },\n {\n title: 'pathUSD · Tempo',\n sub: 'HTTP-402 · 链上 TIP-20 transferWithMemo',\n actions: [{ label: 'MPP', tool: 'buy_sinocare_product_mpp' }],\n },\n ],\n },\n];\n\n/**\n * The payment table for THIS product. The 外链 row names Shopify only when this\n * product is Shopify-backed (its link lands on Shopify's own checkout); the\n * static wording stays generic otherwise, so the label never lies.\n */\nconst groupsFor = (pick: CheckoutPick): CheckoutGroup[] =>\n pick.externalShopify !== true\n ? SINOCARE_GROUPS\n : SINOCARE_GROUPS.map((g) =>\n g.label.startsWith('外链')\n ? {\n ...g,\n rows: g.rows.map((r) => ({\n ...r,\n title: 'Shopify 结账',\n sub: '在 Shopify 收银台支付(Shopify Payments)',\n actions: r.actions.map((a) => ({ ...a, label: '去 Shopify 支付' })),\n })),\n }\n : g,\n );\n\n/**\n * The checkout card's payload for a pick — the picker, or the receipt when THIS\n * checkout is the one that was paid.\n */\nconst pickView = (pick: CheckoutPick, r?: OrderReceipt) =>\n checkoutView({\n product: {\n sku: pick.sku,\n name: pick.name,\n priceDisplay: pick.priceEur,\n imageUrl: pick.imageUrl,\n },\n quantity: pick.quantity,\n groups: groupsFor(pick),\n lang: 'zh',\n receipt: r && {\n protocol: r.protocol,\n total: r.total ?? pick.priceEur,\n status: r.status,\n orderId: r.orderId,\n txHash: r.txHash,\n explorer: r.explorer,\n message: r.message,\n },\n });\n\n// MCP App card (a single ui:// resource, TWO views chosen by structuredContent.\n// view). start_sinocare_checkout → the payment-method picker; list_my_orders → the\n// buyer's orders (each refundable). Both advertise it on BOTH their tool\n// definition AND their result via _meta.ui.resourceUri (mirrors the merchant card\n// — the host needs it on the tool to know it renders a widget); each returns its\n// data as structuredContent, and the card calls the book_* / request_refund /\n// create_sinocare_payment_link tools back.\n// ⚠️ BUMP THIS WHENEVER widget/ CHANGES. The host caches the card's HTML by\n// this URI, so shipping new widget code under the old one leaves every\n// existing conversation rendering the previous build — the server returns\n// corrected data and the old JS draws the old picture. Three widget changes\n// went out today without a bump, and the receipt/picker fix appeared to have\n// no effect at all because of it.\nconst CHECKOUT_URI_PREFIX = 'ui://sinocare/';\nconst CHECKOUT_URI = `${CHECKOUT_URI_PREFIX}card-v33.html`;\n// The mime type, the two host namespaces and the image allow-list all live in\n// the shared package now. Each of them fails SILENTLY when wrong — an omitted\n// `resourceDomains` blocks every product photo before it leaves the starting\n// line — and two copies meant a fix could look applied while this shop still\n// rendered a row of broken images.\nconst CHECKOUT_UI_META = uiMeta(CHECKOUT_URI);\n// No `widgetDomain`: this one is stdio and has no public origin to name.\nconst WIDGET_META = widgetMeta();\n\n// The twelve tools BOTH Sinocare storefronts advertise — same names, same\n// schemas, same wording. They were two tables until 2026-08-14, and the copies\n// had drifted into telling two models two different things about the same\n// purchase: one was told a wallet refusal must stop the sale, the other was not.\n// Only the checkout card's payment vocabulary is ours.\nconst SHARED_TOOLS = storefrontTools({\n checkoutOffers:\n 'It offers Card (ACP) / UCP / USDC (x402) / RLUSD (XRP Ledger) in the conversation, the buyer\\u2019s own Curless wallet, and an external hosted Payment Link page.',\n});\n\n// This storefront's own — the other six rails, the AP2 standing authorization\n// and the two on-chain wallet read-outs. The wallet connector advertises none\n// of them, which is the entire difference between the two shops.\nconst RAIL_TOOLS: ToolDef[] = [\n {\n name: 'create_sinocare_payment_link',\n description:\n \"Create a Payment Link for a product — a PUBLIC hosted checkout page (like a Stripe Payment Link) the user opens in a browser to pay (test-mode card). Returns the URL. Mostly invoked by the checkout card's 'Payment Link' button; the external-link payment path.\",\n inputSchema: {\n type: 'object',\n required: ['sku'],\n properties: {\n sku: { type: 'string' },\n quantity: { type: 'integer', description: 'how many, default 1' },\n },\n },\n },\n {\n name: 'buy_sinocare_product_acp',\n description:\n 'Buy a Sinocare product over ACP (Agentic Commerce Protocol) — Sinocare prices the product and opens a merchant-quoted checkout session; this agent completes it with a delegated card credential, settling on the card rail (test mode). One of THREE ways to pay: ACP (card) / UCP (card) / x402 (USDC). The card rail is an implementation detail, not a separate payment choice. Returns the ordered order.',\n inputSchema: {\n type: 'object',\n required: ['sku'],\n properties: {\n sku: { type: 'string' },\n quantity: { type: 'integer', description: 'how many, default 1' },\n },\n },\n },\n {\n name: 'buy_sinocare_product_ucp',\n description:\n 'Buy a Sinocare product over UCP (Universal Commerce Protocol, ucp.dev) — Sinocare prices it and opens a UCP checkout session. UCP \"supports x402\", and x402 is chain-agnostic, so the SAME UCP session settles FOUR ways (pass `pay`): `card` (default) → the agent authorizes with an AP2 PaymentMandate bound to the cart, settled on the card rail (test mode, same as ACP); `usdc` → the gateway freezes an x402 challenge and the agent pays with a signed EIP-3009 X-PAYMENT (USDC on Base/EVM); `usdc-sol` → same, on Solana — the agent partially signs an SPL transfer the facilitator co-signs + submits (USDC on Solana, buyer needs no SOL); `rlusd` → an XRPL x402 challenge, a signed XRPL Payment (Ed25519, no gas), on the XRP Ledger. The three stablecoin ways all settle on-chain over the stablecoin rail — currency + chain just pick the rail. The standing authorization (authorize_agent_budget) is attached on the card path. Returns the ordered order.',\n inputSchema: {\n type: 'object',\n required: ['sku'],\n properties: {\n sku: { type: 'string' },\n quantity: { type: 'integer', description: 'how many, default 1' },\n pay: {\n type: 'string',\n enum: ['card', 'usdc', 'usdc-sol', 'rlusd'],\n description:\n 'payment method for this UCP session: card (default), usdc (x402 · USDC on Base/EVM), usdc-sol (x402 · USDC on Solana), or rlusd (x402 · RLUSD on the XRP Ledger)',\n },\n },\n },\n },\n {\n name: 'authorize_agent_budget',\n description:\n 'Delegate autonomous Sinocare order to this agent via an AP2 IntentMandate: you sign a STANDING authorization (a spend cap per order + a time window) ONCE, and the agent can then complete UCP orders within it without confirming each purchase. Bookings over the cap (or after it expires) are rejected by the gateway. This is the AP2 \"user authorizes intent, agent acts within it\" delegation.',\n inputSchema: {\n type: 'object',\n required: ['maxAmountEur'],\n properties: {\n maxAmountEur: {\n type: 'number',\n description: 'spend cap PER order, in EUR (e.g. 2000)',\n },\n hours: {\n type: 'integer',\n description: 'how long the authorization lasts, in hours (default 24)',\n },\n },\n },\n },\n {\n name: 'agent_budget_status',\n description:\n 'Show the current standing AP2 order authorization (spend cap + expiry), or that none is set.',\n inputSchema: { type: 'object', properties: {} },\n },\n {\n name: 'revoke_agent_budget',\n description:\n 'Revoke the standing AP2 purchase authorization — the agent must get a fresh one (authorize_agent_budget) to buy autonomously again.',\n inputSchema: { type: 'object', properties: {} },\n },\n {\n name: 'buy_sinocare_product_x402',\n description:\n 'Buy a Sinocare product and pay in USDC over x402. `chain` picks the USDC chain: `base` (default) → EVM, a signed EIP-3009 authorization; `solana` → an SVM transfer the buyer partially signs and the facilitator co-signs (feePayer) + submits (buyer needs no SOL). The merchant receives USDC at its address on that chain. Returns the order + the USDC amount paid (+ the Solana tx on the solana path).',\n inputSchema: {\n type: 'object',\n required: ['sku'],\n properties: {\n sku: { type: 'string' },\n quantity: { type: 'integer', description: 'how many, default 1' },\n chain: {\n type: 'string',\n enum: ['base', 'solana'],\n description: 'USDC chain: base (default, EVM) or solana',\n },\n },\n },\n },\n {\n name: 'x402_buyer_wallet',\n description:\n 'Show the wallet that pays for x402 (USDC) orders — its address and USDC balance on Base Sepolia (testnet) + Base (mainnet), and where to top it up. Use this to check funds before order with USDC.',\n inputSchema: { type: 'object', properties: {} },\n },\n {\n name: 'buy_sinocare_product_rlusd',\n description:\n \"Buy a Sinocare product and pay in RLUSD (Ripple USD) over x402 on the XRP Ledger. Sinocare opens a merchant-quoted RLUSD session; this agent signs a standard XRPL Payment (Ed25519, no gas — the buyer pays the tiny XRPL fee) and Curless's self-hosted facilitator submits it on-ledger. Same x402 protocol as the USDC tool, different chain. Returns the order + the RLUSD amount paid + the XRPL tx.\",\n inputSchema: {\n type: 'object',\n required: ['sku'],\n properties: {\n sku: { type: 'string' },\n quantity: { type: 'integer', description: 'how many, default 1' },\n },\n },\n },\n {\n name: 'buy_sinocare_product_skyfire',\n description:\n \"Buy a Sinocare product over Skyfire KYAPay (agent-native JWT payments). The buyer mints a Skyfire-SIGNED PAY token (via Skyfire, authorizing a small USDC charge to Sinocare — unlike the crypto rails the buyer can't self-sign, Skyfire signs it) and presents it to the Sinocare merchant backend, which charges it via the merchant SDK; agentbank verifies it against Skyfire's live JWKS — proving the agent's identity (Know Your Agent) AND the payment authorization — and records the USDC payment intent. PRODUCTION Skyfire (real token, real verify). Needs SKYFIRE_BUYER_API_KEY + SKYFIRE_SELLER_SERVICE_ID (to mint). Returns the verification + the recorded payment intent (agentbank verifies + records the authorization; it does not auto-capture).\",\n inputSchema: {\n type: 'object',\n required: ['sku'],\n properties: {\n sku: { type: 'string' },\n quantity: { type: 'integer', description: 'how many, default 1' },\n },\n },\n },\n {\n name: 'buy_sinocare_product_mpp',\n description:\n \"Buy a Sinocare product over MPP (Machine Payments Protocol) settled on the Tempo payments chain. agentbank answers the unpaid request with an HTTP-402 Payment challenge whose SIGNED terms carry the on-chain payment (TIP-20 pathUSD token, merchant recipient, memo=challenge binding); the buyer's Tempo wallet pays it with transferWithMemo; the credential proves it by tx HASH and agentbank VERIFIES the on-chain transfer read-only, then captures the payment intent. Real Tempo testnet, on-chain stablecoin — no card, no gateway signing. Needs AGENTBANK_AGENT_TOKEN + TEMPO_BUYER_PRIVATE_KEY (a funded Tempo testnet key).\",\n inputSchema: {\n type: 'object',\n required: ['sku'],\n properties: {\n sku: { type: 'string' },\n quantity: { type: 'integer', description: 'how many, default 1' },\n },\n },\n },\n {\n name: 'xrpl_buyer_wallet',\n description:\n 'Show the XRPL wallet that pays for RLUSD orders — its classic r-address and RLUSD trust-line balance on the XRP Ledger testnet. Use this to check funds before order with RLUSD.',\n inputSchema: { type: 'object', properties: {} },\n },\n];\n\nconst TOOLS: ToolDef[] = [...SHARED_TOOLS, ...RAIL_TOOLS];\n\n// ⚠️ A card declaration is a promise that THIS result is renderable by THAT\n// card, so it goes only on tools whose result the card can draw. Attaching it\n// to everything told the host that a product LIST renders the checkout card:\n// the host drew the card, the card found no view it knew, and it sat on\n// \"Loading…\" for ever under a tool that had answered perfectly.\nconst CARD_TOOLS = new Set(['list_sinocare_products', 'start_sinocare_checkout', 'list_my_orders']);\n\nconst text = (value: unknown) => ({\n content: [{ type: 'text' as const, text: JSON.stringify(value, null, 2) }],\n});\n\n// Server instructions — hosts (Claude Desktop) inject these into the model's\n// context. The point: when the user wants to buy, OPEN THE CARD, don't retype\n// the payment menu as prose. Left to its own devices the model reads the seven\n// buy_* tools and helpfully lists ACP / UCP / x402 / RLUSD as a text bullet\n// list and asks — but the whole UX is the visual card, where the user clicks a\n// method and pays in place. So make the card the default and the text list a\n// non-UI fallback only.\n//\n// The shape and the hard rules are shared with the wallet connector; the\n// payment sentence is not, and must not be — that shop has one method in three\n// shapes and this one has seven rails to explain.\nconst INSTRUCTIONS = buildInstructions({\n opening:\n 'Sinocare storefront (buyer side). The card IS the shop. When the user wants to buy something — \"buy\", \"order\", \"我要买…\", \"再来一盒试纸\" — call start_sinocare_checkout (pass the product `sku`, or a `query` name such as \"Safe-Accu\") to open the visual checkout card, where they pick a payment method and pay by clicking.',\n paymentCard:\n 'Do NOT enumerate the payment methods (ACP / UCP / x402 / RLUSD / Curless wallet / Payment Link) as text and ask which one — that is what the card is for.',\n orderedField: 'ordered',\n extra: [\n 'Call the buy_sinocare_product_* tools directly only when the card is unavailable or the user explicitly asked for a specific rail in a plain-text flow.',\n ],\n});\n\nconst server = new Server(\n { name: 'sinocare', version: '0.5.0' },\n { capabilities: { tools: {}, resources: {} }, instructions: INSTRUCTIONS },\n);\n\nserver.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: TOOLS.map((t) => (CARD_TOOLS.has(t.name) ? { ...t, _meta: CHECKOUT_UI_META } : t)),\n}));\n\nserver.setRequestHandler(ListResourcesRequestSchema, async () => ({\n resources: [\n { uri: CHECKOUT_URI, name: 'Sinocare checkout', mimeType: CARD_MIME, _meta: WIDGET_META },\n ],\n}));\nserver.setRequestHandler(ReadResourceRequestSchema, async (req) => {\n // ANY version of our card uri gets the CURRENT card — see the note in the\n // wallet connector. Bumping the uri busts a host's cache; refusing the old\n // one turns a stale card into \"there was a problem displaying content\", with\n // nothing the person can do about it.\n const asked = req.params.uri;\n if (!servesCardUri(CHECKOUT_URI_PREFIX, asked)) throw new Error(`unknown resource: ${asked}`);\n return {\n contents: [{ uri: asked, mimeType: CARD_MIME, text: CHECKOUT_CARD_HTML, _meta: WIDGET_META }],\n };\n});\n\nserver.setRequestHandler(CallToolRequestSchema, async (req) => {\n const args = (req.params.arguments ?? {}) as Record<string, unknown>;\n try {\n if (req.params.name === 'list_sinocare_products') {\n // `products`, and a `view` the card dispatches on. This returned\n // `{currency, count, products}` — the product storefront's shape, left\n // behind by a rename that changed identifiers and not payloads. The card\n // reads `products`, got undefined, and drew nothing.\n // The aisles and the \"an unknown one means all of them\" rule are shared\n // with the wallet connector — they were written out four times between\n // the two shops, and adding an aisle only ever fixed half of them.\n const { items } = await backend<{ items: Product[] }>(\n `/catalog${categoryQuery(args.category)}`,\n );\n const view = productsView(items);\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(view) }],\n structuredContent: view,\n _meta: CHECKOUT_UI_META,\n };\n }\n\n if (req.params.name === 'get_sinocare_product') {\n const sku = String(args.sku ?? '');\n const product = await backend<Product>(`/catalog/${encodeURIComponent(sku)}`);\n return text(product);\n }\n\n // Visual checkout: return the MCP App card (payment picker) + the product as\n // structuredContent. The card's buttons call the book_* /\n // create_sinocare_payment_link tools; the card renders their results.\n if (req.params.name === 'start_sinocare_checkout') {\n // Accept a `sku` (exact) OR a `query`/`product`/`name` (e.g. \"Safe AQ Smart\")\n // so the agent doesn't need the exact sku to open the card.\n const idOrName = String(args.sku ?? args.query ?? args.product ?? args.name ?? '').trim();\n const quantity = Math.max(Number(args.quantity) || 1, 1);\n // The card sets __rehydrate when it re-invokes to fill itself (reload /\n // self-heal), never on a fresh agent-initiated checkout. Only on rehydrate\n // do we show a completed order's receipt instead of the picker — so an\n // explicit \"buy X again\" from the agent still opens the picker.\n const rehydrate =\n args.__rehydrate === true || args.__rehydrate === 1 || args.__rehydrate === '1';\n\n // No product given = the card self-healing (empty-arg re-invoke) — replay the\n // last pick so the widget fills in instead of hanging on \"Loading…\". If that\n // last checkout has since been ordered, show its receipt on rehydrate.\n if (!idOrName) {\n if (rehydrate && lastCheckout?.ordered) {\n const receipt = completedOrders.get(lastCheckout.sku);\n if (receipt) {\n return {\n content: [{ type: 'text' as const, text: `Ordered ${lastCheckout.name}.` }],\n structuredContent: pickView(lastCheckout, receipt),\n _meta: CHECKOUT_UI_META,\n };\n }\n }\n // Nothing to replay: answer \"pick a product\" rather than volunteering\n // whichever one came last. The card shows its own empty state.\n if (!lastCheckout) {\n return {\n content: [\n {\n type: 'text' as const,\n text: 'Pick a product first (list_sinocare_products), then open its checkout.',\n },\n ],\n isError: true,\n };\n }\n return {\n content: [{ type: 'text' as const, text: `Checkout for ${lastCheckout.name}.` }],\n structuredContent: pickView(lastCheckout),\n _meta: CHECKOUT_UI_META,\n };\n }\n\n // Resolve: try the exact sku first, then the shared resolver over the\n // catalog. It never guesses between several matches — \"Safe-Accu\" and\n // \"Safe-Accu2\" differ by one character, and this card ends in a charge.\n let product: Product | null = null;\n let candidates: Product[] = [];\n try {\n product = await backend<Product>(`/catalog/${encodeURIComponent(idOrName)}`);\n } catch {\n const { items } = await backend<{ items: Product[] }>('/catalog');\n const match = resolveProduct(items, { sku: idOrName });\n if (match.kind === 'found') product = match.product;\n else if (match.kind === 'ambiguous') candidates = match.candidates;\n }\n if (!product) {\n return {\n content: [\n {\n type: 'text' as const,\n // Says 商品 / 目录, not 度假村. This storefront was forked from a\n // resort demo and inherited its vocabulary wholesale, in a shop\n // that sells blood-glucose meters — a miss the buyer reads.\n text: candidates.length\n ? `“${idOrName}” 对上了 ${candidates.length} 件商品 —— 说清是哪件:${candidates\n .map((c) => `${c.name}(${c.sku})`)\n .join('、')}`\n : `目录里没有 “${idOrName}” —— 用 list_sinocare_products 看可选项,或传它的 sku。`,\n },\n ],\n isError: true,\n };\n }\n\n const priceEur = priceDisplayOf(product);\n // Rehydrating an already-BOOKED product's card → show its receipt, not the\n // picker (fixes: pay, leave the conversation, come back, and the card had\n // reset to the payment selection). The card self-heals by re-invoking with\n // its ORIGINAL args (the sku) + __rehydrate. EXCEPTION: a deliberate \"buy\n // it again\" is a fresh (non-rehydrate) open that leaves THIS sku's pick\n // unordered; its immediate self-heal must resolve to the picker, so suppress\n // the receipt only while this sku is the one being freshly re-opened. Past\n // receipts are kept intact (never deleted), so #6's cross-conversation\n // records — and OTHER ordered cards in the same conversation — still\n // rehydrate to their receipts.\n // Is THIS checkout paid? Not \"has this product ever been bought\".\n //\n // The receipt used to be looked up by sku, which treats a product as a\n // purchase. It is not: opening a checkout for something you ordered last\n // week is a NEW order. With 42 of 44 products recorded, that lookup made\n // almost every card render as an already-paid receipt the moment it\n // self-healed — no payment involved — and hid the payment picker behind\n // a order that had happened days ago.\n //\n // So the question is answered by the checkout in hand: the pick we just\n // had open, for this same product, that was actually paid. A fresh open\n // replaces it with an unpaid one (below), which is what makes \"buy it\n // again\" resolve to the picker.\n const rehydratedReceipt =\n rehydrate && lastCheckout?.sku === product.sku && lastCheckout.ordered\n ? completedOrders.get(product.sku)\n : undefined;\n lastCheckout = {\n sku: product.sku,\n name: product.name,\n priceEur,\n quantity,\n imageUrl: product.imageUrl,\n externalShopify: product.source === 'shopify',\n // Preserve ordered only when rehydrating a paid pick; a fresh open is a\n // new, unpaid order (ordered stays falsy → the card shows the picker).\n ordered: rehydratedReceipt ? true : undefined,\n };\n saveCheckoutState(); // persist the new lastCheckout across processes\n const receipt = rehydratedReceipt;\n if (receipt) {\n return {\n content: [{ type: 'text' as const, text: `Ordered ${product.name} (${priceEur}).` }],\n structuredContent: pickView(lastCheckout, receipt),\n _meta: CHECKOUT_UI_META,\n };\n }\n return {\n content: [\n {\n type: 'text' as const,\n text: `Checkout for ${product.name} (${priceEur}). Pick a payment method in the card — Card (ACP) / UCP / USDC (x402) / RLUSD (XRP Ledger), or a Payment Link (hosted page).`,\n },\n ],\n structuredContent: pickView(lastCheckout),\n _meta: CHECKOUT_UI_META,\n };\n }\n\n if (req.params.name === 'create_sinocare_payment_link') {\n const sku = String(args.sku ?? '');\n const quantity = Math.max(Number(args.quantity) || 1, 1);\n const link = await backend<{ url: string; amountDisplay: string; name: string }>(\n '/checkout-link',\n {\n method: 'POST',\n // Paying from the wallet means the WALLET's owner is the buyer, so\n // the merchant records that email. Otherwise the order is filed under\n // SINOCARE_BUYER_EMAIL and never appears in the wallet's own 订单 —\n // \"我的订单\" is joined on the email the order was placed with.\n body: JSON.stringify({\n sku,\n quantity,\n ...(walletBuyer() ?? (BUYER ? { buyer: BUYER } : {})),\n }),\n },\n );\n return text({\n url: link.url,\n amountDisplay: link.amountDisplay,\n name: link.name,\n message: `Payment page for ${link.name} — open ${link.url} to pay (${link.amountDisplay}).`,\n });\n }\n\n if (req.params.name === 'curless_wallet_logout') {\n const who = wallet.current();\n await wallet.logout();\n // Drop the pending browser sign-in too, if one is mid-flight — otherwise\n // \"signed out\" would be followed by that login completing and silently\n // signing them back in.\n pending = null;\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n signedOut: true,\n was: who?.email ?? null,\n message: who ? `已退出 ${who.email}。` : '本来就没有登录。',\n }),\n },\n ],\n };\n }\n\n if (req.params.name === 'curless_wallet_login_status') {\n const who = wallet.current();\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(\n who\n ? { signedIn: true, email: who.email, mode: who.mode, wallet: 'storefront' }\n : {\n signedIn: false,\n // Three answers, not two. \"waiting\" is a sign-in in flight,\n // \"expired\" is one that ran out, and neither is \"nobody\n // started one\" — which used to be reported as expired and\n // read back to the person as \"your code timed out\" when\n // they had never been given a code.\n waiting: Boolean(pending),\n expired: !pending && loginEverStarted,\n neverStarted: !pending && !loginEverStarted,\n // WHICH wallet. This storefront holds its own buyer session\n // for the in-card method; a separately-installed Curless\n // wallet connector holds a different one, and this tool can\n // say nothing about that. Reported as contradicting each\n // other otherwise — reasonably, since both were called \"the\n // wallet\".\n wallet: 'storefront',\n note: 'this is the session THIS storefront holds (the in-card wallet method). A separately-installed Curless wallet connector has its own session — ask that connector, not this tool.',\n },\n ),\n },\n ],\n };\n }\n\n // ACP, twice over: the agent mints the credential from ITS OWN Stripe key\n // (buy_sinocare_product_acp), or the buyer's Curless wallet mints it from the\n // card that buyer bound (buy_sinocare_product_wallet). Everything after the\n // credential — the session, the complete, the writeback — is identical, so\n // it is one handler: two code paths would drift, and the difference that\n // matters is only WHERE the token comes from and WHOSE limits applied.\n if (\n req.params.name === 'buy_sinocare_product_acp' ||\n req.params.name === 'buy_sinocare_product_wallet'\n ) {\n const viaWallet = req.params.name === 'buy_sinocare_product_wallet';\n // Check the signature BEFORE asking Sinocare to price anything. Opening a\n // checkout session we already know cannot be paid leaves the merchant an\n // order that will never complete, and shows the person a backend error\n // when the actual problem is that nobody signed in.\n if (viaWallet && !wallet.current()) {\n // Start the browser sign-in HERE, before Sinocare is asked to price\n // anything: a checkout session opened for someone who cannot pay is an\n // order the merchant will never see completed.\n //\n // JSON, not prose — the card renders `message` and the model reads\n // `next`. Prose fails the card's JSON.parse and gets shown to the person\n // verbatim, which is how an instruction meant for the model once ended\n // up on screen in English.\n const login = await pendingLogin();\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n needsLogin: true,\n loginUrl: login.verificationUriComplete,\n userCode: login.userCode,\n message:\n '在浏览器里登录你的 Curless 钱包,登录完这张卡会自己接上。登录后就能用你自己绑的卡付款,并受你自己设的限额约束。',\n next: 'show the person the login link; the card polls on its own. Do NOT ask them for an email here — the sign-in happens in their browser.',\n }),\n },\n ],\n isError: true,\n };\n }\n\n const sku = String(args.sku ?? '');\n const quantity = Math.max(Number(args.quantity) || 1, 1);\n // 1. Sinocare prices the product + opens a merchant-quoted ACP session.\n const session = await backend<{\n sessionId: string;\n merchantId: string;\n name: string;\n amountDisplay: string;\n }>('/checkout-acp', {\n method: 'POST',\n body: JSON.stringify({ sku, quantity, ...(BUYER ? { buyer: BUYER } : {}) }),\n });\n // 2. Ask the buyer's wallet for a credential scoped to THIS order. The\n // session's real total has to come off the session itself — the backend\n // only hands back a display string (\"€1,920\"), and an SPT's cap is an\n // integer in minor units. No wallet configured → keep the card token.\n let token = PAYMENT_TOKEN;\n if (viaWallet) {\n // The buyer's wallet decides. It reads the same real total off the ACP\n // session, checks the limits THAT PERSON set, and mints against the card\n // THEY bound — so a refusal here is the buyer's own cap, not a payment\n // failure, and it is reported that way rather than retried around.\n const { amount, currency } = totalOf(\n await readCheckoutSession(acp(session.merchantId), session.sessionId),\n );\n let credential: PaymentCredential;\n try {\n credential = await wallet.payCredential({\n amount,\n currency,\n merchantRef: session.merchantId,\n });\n } catch (err) {\n // The checkout session stays open and unpaid, which is correct — the\n // person may raise their limit and pay it. Nothing was charged.\n return walletRefusal(err as Error);\n }\n token = credential.token;\n process.stderr.write(\n `sinocare-demo: wallet minted ${credential.token} for ${amount} ${currency}\\n`,\n );\n } else if (!STRIPE_AGENT_KEY || !SELLER_PROFILE) {\n // Say so once, out loud: a silent fallback here looks identical to a\n // successful SPT payment from the outside (the seller mints its own pm_\n // either way), which is exactly how you end up believing you tested\n // something you didn't.\n process.stderr.write(\n 'sinocare-demo: paying ACP with the plain card token — set STRIPE_AGENT_SECRET_KEY and AGENTBANK_SELLER_PROFILE to mint a real SPT per order\\n',\n );\n } else {\n // Which fetch failed matters, and node's \"fetch failed\" hides the real\n // reason in .cause — without both you get a message that says nothing.\n let step = 'read session';\n try {\n const { amount, currency } = totalOf(\n await readCheckoutSession(acp(session.merchantId), session.sessionId),\n );\n step = 'mint SPT';\n const minted = await mintSharedPaymentToken(amount, currency);\n if (minted) {\n token = minted;\n process.stderr.write(`sinocare-demo: minted ${minted} for ${amount} ${currency}\\n`);\n }\n } catch (err) {\n const e = err as Error & { cause?: { code?: string; message?: string } };\n const why = e.cause?.code ?? e.cause?.message ?? '';\n const what = `SPT FAILED at [${step}]: ${e.message}${why ? ` (cause: ${why})` : ''}`;\n // Strict by default. Configuring a wallet says you want a credential\n // bound to THIS seller, amount and expiry; quietly paying with an\n // unscoped card token instead is a downgrade, not graceful\n // degradation — and the order still succeeds, so nobody notices.\n if (!WALLET_FALLBACK_OK) {\n throw new Error(\n `${what} — refusing to fall back to an unscoped card token. Set SINOCARE_WALLET_FALLBACK=1 to allow that.`,\n );\n }\n process.stderr.write(`sinocare-demo: ${what} — falling back to ${PAYMENT_TOKEN}\\n`);\n }\n }\n // 3. This buyer agent completes the charge over ACP with that credential.\n const order = (await completeCheckout(acp(session.merchantId), session.sessionId, token)) as {\n status?: string;\n order?: { id?: string };\n };\n return finishOrder(sku, {\n ordered: order.status === 'completed',\n product: session.name,\n quantity,\n total: session.amountDisplay,\n protocol: 'acp',\n payer: viaWallet ? 'curless-wallet' : 'agent-key',\n status: order.status,\n // An ACP complete can omit order.id; fall back to the (always-present,\n // stable) checkout session id so the writeback always has a dedup key.\n orderId: order.order?.id ?? session.sessionId,\n message: `Ordered ${session.name} × ${quantity} — ${session.amountDisplay} charged (${order.status}).`,\n });\n }\n\n // ── mode 2 · step 1: open a checkout for a wallet this server cannot reach ──\n if (req.params.name === 'start_sinocare_wallet_handoff') {\n if (!TOKEN) {\n return text({ error: 'sinocare-demo: AGENTBANK_AGENT_TOKEN is not set' });\n }\n const sku = String(args.sku ?? '');\n const quantity = Math.max(Number(args.quantity) || 1, 1);\n const session = await backend<{\n sessionId: string;\n merchantId: string;\n name: string;\n amountDisplay: string;\n }>('/checkout-acp', {\n method: 'POST',\n body: JSON.stringify({ sku, quantity, ...(BUYER ? { buyer: BUYER } : {}) }),\n });\n // The authoritative total, off the session — the backend's amountDisplay\n // is a string for a human (\"€1,920\") and a credential is capped by an\n // integer in minor units.\n const { amount, currency } = totalOf(\n await readCheckoutSession(acp(session.merchantId), session.sessionId),\n );\n return text({\n // This OPENED a checkout; it did not pay for one. Said explicitly\n // because a result that mentions neither used to render as a receipt.\n ordered: false,\n awaitingPayment: true,\n message: '结账已开好。接下来在你自己的 Curless 钱包连接器里铸一张凭据,再回来完成付款。',\n sessionId: session.sessionId,\n merchantId: session.merchantId,\n amount,\n currency,\n product: session.name,\n total: session.amountDisplay,\n // Spells out the sign-in step. Without it the model calls\n // wallet_pay_credential, gets \"nobody is signed in\", and has to invent\n // what to do next — which is how a order the person asked to pay\n // from their own wallet ends up settled some other way.\n next: `on the Curless wallet connector: if nobody is signed in, call wallet_login FIRST, show the person the link it returns, and wait until they say they have finished in their browser. Then wallet_pay_credential({ amount: ${amount}, currency: \"${currency}\", merchantRef: \"${session.merchantId}\" }), then pay_sinocare_with_token({ sessionId: \"${session.sessionId}\", merchantId: \"${session.merchantId}\", token }). If the wallet still refuses, STOP and tell the person what it said — do not pay this another way.`,\n });\n }\n\n // ── mode 2 · step 2: the merchant completes, with its own key ──\n if (req.params.name === 'pay_sinocare_with_token') {\n if (!TOKEN) {\n return text({ error: 'sinocare-demo: AGENTBANK_AGENT_TOKEN is not set' });\n }\n const sessionId = String(args.sessionId ?? '');\n const token = String(args.token ?? '');\n const merchantId = String(args.merchantId ?? '');\n if (!sessionId || !token || !merchantId) {\n return text({ error: 'pay_sinocare_with_token needs sessionId, merchantId and token' });\n }\n // What this checkout was for comes off the checkout, not out of this\n // process's memory — the confirmation can arrive in a different one.\n const bought = purchaseOf(await readCheckoutSession(acp(merchantId), sessionId));\n const order = (await completeCheckout(acp(merchantId), sessionId, token)) as {\n status?: string;\n order?: { id?: string };\n };\n const ordered = order.status === 'completed';\n // Same exit as the other ten order paths. Returning a bare result here\n // is what let someone pay the same holiday three times: the card had no\n // idea it had been bought, so it rehydrated to the picker.\n return finishOrder(bought?.sku ?? '', {\n ordered,\n product: bought?.name,\n quantity: bought?.quantity,\n protocol: 'acp',\n payer: 'curless-wallet (separate connector)',\n status: order.status,\n orderId: order.order?.id ?? sessionId,\n message: `Checkout ${sessionId} completed with the credential the wallet minted (${order.status}).`,\n });\n }\n\n // ── mode 3: hand the person a link and let them approve in a browser ──\n if (req.params.name === 'pay_sinocare_hosted') {\n if (!TOKEN) {\n return text({ error: 'sinocare-demo: AGENTBANK_AGENT_TOKEN is not set' });\n }\n const sku = String(args.sku ?? '');\n const quantity = Math.max(Number(args.quantity) || 1, 1);\n const session = await backend<{\n sessionId: string;\n merchantId: string;\n name: string;\n amountDisplay: string;\n }>('/checkout-acp', {\n method: 'POST',\n body: JSON.stringify({ sku, quantity, ...(BUYER ? { buyer: BUYER } : {}) }),\n });\n return text({\n ordered: false,\n awaitingPayment: true,\n message: '在浏览器里打开这个链接,看清金额再批准。这里还没有扣任何款。',\n payUrl: `${API_BASE}/buyer/pay?session=${encodeURIComponent(session.sessionId)}`,\n sessionId: session.sessionId,\n product: session.name,\n total: session.amountDisplay,\n // Say plainly that nothing has been paid yet. A tool that returns a\n // link and a product name reads like a receipt if it does not.\n paid: false,\n merchantId: session.merchantId,\n next: 'show the person this link. Nothing has been charged yet — they approve it in their browser. Then call get_sinocare_order_status with this sessionId.',\n });\n }\n\n if (req.params.name === 'get_sinocare_order_status') {\n if (!TOKEN) {\n return text({ error: 'sinocare-demo: AGENTBANK_AGENT_TOKEN is not set' });\n }\n const sessionId = String(args.sessionId ?? '');\n const merchantId = String(args.merchantId ?? '');\n const session = await readCheckoutSession(acp(merchantId), sessionId);\n const paid = session.status === 'completed';\n const bought = purchaseOf(session);\n // The approval happened in a browser, so THIS is the only moment the demo\n // learns of it. Record the order here or it is never recorded at all.\n return finishOrder(paid ? (bought?.sku ?? '') : '', {\n ordered: paid,\n paid,\n sessionId,\n status: session.status,\n product: bought?.name,\n quantity: bought?.quantity,\n protocol: 'acp',\n payer: 'curless-wallet (hosted approval)',\n orderId: sessionId,\n message: paid\n ? 'Paid — the buyer approved it in their browser.'\n : 'Not paid yet. They have not finished approving it.',\n });\n }\n\n if (req.params.name === 'buy_sinocare_product_ucp') {\n if (!TOKEN) {\n return {\n content: [{ type: 'text', text: 'set AGENTBANK_AGENT_TOKEN (a test agent:execute key)' }],\n isError: true,\n };\n }\n const sku = String(args.sku ?? '');\n const quantity = Math.max(Number(args.quantity) || 1, 1);\n const pay =\n args.pay === 'usdc'\n ? 'usdc'\n : args.pay === 'usdc-sol'\n ? 'usdc-sol'\n : args.pay === 'rlusd'\n ? 'rlusd'\n : 'card';\n\n // USDC path: the merchant quotes the UCP session in USDC (a small test\n // charge); the gateway freezes an x402 challenge on it, and this buyer pays\n // with an X-PAYMENT (EIP-3009) at /complete — settled over the stablecoin\n // rail, same money-movement as buy_sinocare_product_x402 but via a UCP\n // session (one protocol, two payment methods).\n if (pay === 'usdc') {\n const session = await backend<{\n sessionId: string;\n merchantId: string;\n name: string;\n amount: number;\n amountDisplay: string;\n x402?: { accepts: X402PaymentRequirements[] };\n }>('/checkout-ucp', {\n method: 'POST',\n body: JSON.stringify({ sku, quantity, pay: 'usdc', ...(BUYER ? { buyer: BUYER } : {}) }),\n });\n const reqs = session.x402?.accepts?.[0];\n if (!reqs) throw new Error('USDC UCP session missing its x402 requirements');\n\n // Pre-flight balance check (skipped in throwaway-key / STUB mode).\n const buyer = await buyerSigner();\n if (buyer) {\n const have = await usdcBalance({\n network: reqs.network,\n owner: buyer.address,\n token: reqs.asset,\n });\n if (have < BigInt(session.amount)) {\n const onTestnet = reqs.network === 'base-sepolia';\n return text({\n ordered: false,\n reason: 'insufficient_usdc',\n wallet: buyer.address,\n network: reqs.network,\n have: fmtUsdc(have),\n need: fmtUsdc(BigInt(session.amount)),\n faucet: onTestnet ? 'https://faucet.circle.com' : undefined,\n message: `Buyer wallet ${buyer.address} has ${fmtUsdc(have)} on ${reqs.network}, needs ${fmtUsdc(BigInt(session.amount))}.${onTestnet ? ' Top up at https://faucet.circle.com and retry.' : ' Fund it with USDC on Base and retry.'}`,\n });\n }\n }\n\n // Sign the frozen challenge, then complete the UCP session with an\n // X-PAYMENT header — the gateway settles it over the stablecoin rail.\n const xPayment = await signX402(reqs);\n const paidRes = await fetch(\n `${API_BASE}/ucp/${encodeURIComponent(session.merchantId)}/checkout-sessions/${encodeURIComponent(session.sessionId)}/complete`,\n {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n authorization: `Bearer ${TOKEN}`,\n 'x-payment': xPayment,\n },\n body: JSON.stringify({ payment: {} }),\n },\n );\n const paid = (await paidRes.json()) as { status?: string; id?: string };\n if (paidRes.status !== 200) {\n throw new Error(`ucp usdc settle -> ${paidRes.status}: ${JSON.stringify(paid)}`);\n }\n const paidUsdc = fmtUsdc(BigInt(session.amount));\n return finishOrder(sku, {\n ordered: paid.status === 'completed',\n product: session.name,\n quantity,\n protocol: 'ucp',\n payer: 'agent-key (UCP)',\n payWith: 'usdc',\n paidUsdc: `${paidUsdc} (fixed test charge, merchant-quoted)`,\n payTo: reqs.payTo,\n network: reqs.network,\n paymentAuthorization: 'x402 EIP-3009 (signed + settled over the stablecoin rail)',\n status: paid.status,\n orderId: paid.id,\n sessionId: session.sessionId,\n message: `Ordered ${session.name} × ${quantity} — paid ${paidUsdc} via UCP + USDC (x402) to ${reqs.payTo} (${paid.status}).`,\n });\n }\n\n // USDC-on-Solana path: the merchant quotes the UCP session in USDC on Solana;\n // the gateway freezes an SVM x402 challenge on it, and this buyer PARTIALLY\n // signs an SPL transfer (facilitator co-signs feePayer + submits) at /complete —\n // same UCP wire as the EVM USDC path, only the chain flips. Proves \"UCP supports\n // x402\" is chain-agnostic.\n if (pay === 'usdc-sol') {\n const secretKey = await solanaBuyerSecret();\n if (!secretKey) {\n return {\n content: [\n {\n type: 'text',\n text: 'set SOLANA_BUYER_SECRET (a devnet Solana secret key holding USDC) to pay USDC-on-Solana over UCP',\n },\n ],\n isError: true,\n };\n }\n const session = await backend<{\n sessionId: string;\n merchantId: string;\n name: string;\n amount: number;\n amountDisplay: string;\n x402?: { accepts: SolanaX402Requirements[] };\n }>('/checkout-ucp', {\n method: 'POST',\n body: JSON.stringify({\n sku,\n quantity,\n pay: 'usdc-sol',\n ...(BUYER ? { buyer: BUYER } : {}),\n }),\n });\n const reqs = session.x402?.accepts?.[0];\n if (!reqs) throw new Error('USDC-Solana UCP session missing its x402 requirements');\n\n const owner = await addressFromSecretKey(secretKey);\n const have = await solanaUsdcBalance(owner, reqs.asset);\n const need = Number(reqs.maxAmountRequired);\n if (have !== null && have < need) {\n return text({\n ordered: false,\n reason: 'insufficient_usdc_solana',\n wallet: owner,\n network: reqs.network,\n have: `${(have / 1e6).toFixed(6)} USDC`,\n need: `${(need / 1e6).toFixed(6)} USDC`,\n faucet: 'https://faucet.circle.com',\n message: `Buyer wallet ${owner} has ${(have / 1e6).toFixed(6)} USDC on ${reqs.network}, needs ${(need / 1e6).toFixed(6)}. Top up devnet USDC at https://faucet.circle.com (Solana Devnet) and retry.`,\n });\n }\n\n // Partially sign the frozen SVM challenge, then complete the UCP session with\n // the X-PAYMENT — the gateway settles it over the stablecoin rail (x402.org).\n const xPayment = await signSolanaX402Payment({\n requirements: reqs,\n secretKey,\n rpcUrl: SOLANA_RPC,\n });\n const paidRes = await fetch(\n `${API_BASE}/ucp/${encodeURIComponent(session.merchantId)}/checkout-sessions/${encodeURIComponent(session.sessionId)}/complete`,\n {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n authorization: `Bearer ${TOKEN}`,\n 'x-payment': xPayment,\n },\n body: JSON.stringify({ payment: {} }),\n },\n );\n const paid = (await paidRes.json()) as { status?: string; id?: string };\n if (paidRes.status !== 200) {\n throw new Error(`ucp usdc-sol settle -> ${paidRes.status}: ${JSON.stringify(paid)}`);\n }\n const paidUsdc = `${(need / 1e6).toFixed(6)} USDC`;\n return finishOrder(sku, {\n ordered: paid.status === 'completed',\n product: session.name,\n quantity,\n protocol: 'ucp',\n payer: 'agent-key (UCP)',\n payWith: 'usdc-sol',\n paidUsdc: `${paidUsdc} (fixed test charge, merchant-quoted)`,\n payTo: reqs.payTo,\n network: reqs.network,\n paymentAuthorization:\n 'x402 SVM transfer (partially signed; facilitator co-signs feePayer + submits)',\n status: paid.status,\n orderId: paid.id,\n sessionId: session.sessionId,\n message: `Ordered ${session.name} × ${quantity} — paid ${paidUsdc} via UCP + USDC on Solana to ${reqs.payTo} (${paid.status}).`,\n });\n }\n\n // RLUSD path: the merchant quotes the UCP session in RLUSD; the gateway\n // freezes an XRPL x402 challenge on it, and this buyer signs a standard XRPL\n // Payment (Ed25519, no gas — buyer pays the tiny XRPL fee) which the self-\n // hosted facilitator submits on-ledger. Same money-movement as\n // buy_sinocare_product_rlusd, but over a UCP session — the SAME UCP wire the\n // card/USDC paths use, only the currency flips the chain to the XRP Ledger.\n if (pay === 'rlusd') {\n const wallet = xrplBuyer();\n if (!wallet) {\n return {\n content: [\n {\n type: 'text',\n text: 'set XRPL_BUYER_SEED (an sEd… testnet seed holding RLUSD + a little test XRP) to pay RLUSD orders',\n },\n ],\n isError: true,\n };\n }\n const session = await backend<{\n sessionId: string;\n merchantId: string;\n name: string;\n amount: number;\n amountDisplay: string;\n x402?: { accepts: XrplPaymentRequirements[] };\n }>('/checkout-ucp', {\n method: 'POST',\n body: JSON.stringify({ sku, quantity, pay: 'rlusd', ...(BUYER ? { buyer: BUYER } : {}) }),\n });\n const reqs = session.x402?.accepts?.[0];\n if (!reqs) throw new Error('RLUSD UCP session missing its x402 requirements');\n\n // One XRPL connection for the balance pre-flight AND the signing autofill\n // (same as buy_sinocare_product_rlusd): sign the merchant's frozen quote.\n const issuer = reqs.extra?.issuer;\n const preflight = await withXrplClient(async (client) => {\n const have = issuer\n ? await rlusdBalance(client, wallet.classicAddress, reqs.asset, issuer)\n : '0';\n if (Number(have) < Number(reqs.maxAmountRequired)) {\n return { have, xPayment: null as string | null };\n }\n return { have, xPayment: await signXrpl(client, reqs, wallet) };\n });\n if (preflight.xPayment === null) {\n return text({\n ordered: false,\n reason: 'insufficient_rlusd',\n wallet: wallet.classicAddress,\n network: reqs.network,\n have: `${preflight.have} RLUSD`,\n need: `${reqs.maxAmountRequired} RLUSD`,\n message: `Buyer wallet ${wallet.classicAddress} holds ${preflight.have} RLUSD, needs ${reqs.maxAmountRequired}. Fund it with testnet RLUSD (+ a little test XRP for the fee) and retry.`,\n });\n }\n\n // Complete the UCP session with the signed XRPL Payment as an X-PAYMENT —\n // the gateway settles it over the stablecoin rail (XRPL facilitator).\n const paidRes = await fetch(\n `${API_BASE}/ucp/${encodeURIComponent(session.merchantId)}/checkout-sessions/${encodeURIComponent(session.sessionId)}/complete`,\n {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n authorization: `Bearer ${TOKEN}`,\n 'x-payment': preflight.xPayment,\n },\n body: JSON.stringify({ payment: {} }),\n },\n );\n const paid = (await paidRes.json()) as { status?: string; id?: string };\n if (paidRes.status !== 200) {\n throw new Error(`ucp rlusd settle -> ${paidRes.status}: ${JSON.stringify(paid)}`);\n }\n return finishOrder(sku, {\n ordered: paid.status === 'completed',\n product: session.name,\n quantity,\n protocol: 'ucp',\n payer: 'agent-key (UCP)',\n payWith: 'rlusd',\n paidRlusd: `${reqs.maxAmountRequired} RLUSD (fixed test charge, merchant-quoted)`,\n payTo: reqs.payTo,\n network: reqs.network,\n paymentAuthorization:\n 'x402 XRPL Payment (Ed25519, signed + settled over the stablecoin rail)',\n status: paid.status,\n orderId: paid.id,\n sessionId: session.sessionId,\n message: `Ordered ${session.name} × ${quantity} — paid ${reqs.maxAmountRequired} RLUSD via UCP + RLUSD (x402 on the XRP Ledger) to ${reqs.payTo} (${paid.status}).`,\n });\n }\n\n // CARD path (default).\n // 1. Sinocare prices the product + opens a merchant-quoted UCP session,\n // returning a merchant-signed AP2 CartMandate for it.\n const session = await backend<{\n sessionId: string;\n merchantId: string;\n name: string;\n amount: number;\n currency: string;\n amountDisplay: string;\n cartMandate: { cartHash: string };\n }>('/checkout-ucp', {\n method: 'POST',\n body: JSON.stringify({ sku, quantity, ...(BUYER ? { buyer: BUYER } : {}) }),\n });\n // 2. This buyer agent authorizes payment with an AP2 PaymentMandate — a\n // real ES256 JWS bound to the cart's hash (UCP AP2 Mandates extension).\n // Programmatic completion, no human trusted-UI handoff; the gateway\n // cryptographically verifies the mandate, then settles on the card rail.\n const paymentMandate = await signPaymentMandate({\n cartHash: session.cartMandate.cartHash,\n method: { handler: 'card', type: 'card', credential: PAYMENT_TOKEN },\n amount: session.amount,\n currency: session.currency,\n });\n // Attach the standing authorization if one is active — the gateway then\n // checks this order is within the user's delegated cap. Drop it if expired.\n const mandate: { payment_mandate: typeof paymentMandate; intent_mandate?: Ap2IntentMandate } =\n { payment_mandate: paymentMandate };\n let underAuthorization = false;\n if (agentBudget) {\n if (Date.parse(agentBudget.expiresAt) < Date.now()) {\n agentBudget = null; // expired — buy normally (no standing auth)\n saveBudget(null);\n } else {\n mandate.intent_mandate = agentBudget.mandate;\n underAuthorization = true;\n }\n }\n const url = `${API_BASE}/ucp/${encodeURIComponent(session.merchantId)}/checkout-sessions/${encodeURIComponent(session.sessionId)}/complete`;\n const res = await fetch(url, {\n method: 'POST',\n headers: { 'content-type': 'application/json', authorization: `Bearer ${TOKEN}` },\n body: JSON.stringify({ payment: { mandate } }),\n });\n if (!res.ok) {\n const errText = await res.text().catch(() => '');\n // A standing-authorization rejection (over cap / expired) → a clean,\n // explanatory result instead of a raw error, so the agent can react.\n if (\n underAuthorization &&\n /intent mandate rejected|exceeds_intent_max_amount|intent_mandate_expired/.test(errText)\n ) {\n return text({\n ordered: false,\n blockedBy: 'standing-authorization',\n product: session.name,\n total: session.amountDisplay,\n authorizedCap: `€${agentBudget?.maxAmountEur.toLocaleString('en-IE')}`,\n message: `Blocked: ${session.name} (${session.amountDisplay}) is over your standing authorization (cap €${agentBudget?.maxAmountEur}, or it expired). Raise it with authorize_agent_budget, or book a cheaper product.`,\n });\n }\n throw new Error(`ucp complete -> ${res.status}: ${errText}`);\n }\n const out = (await res.json()) as { status?: string; id?: string };\n return finishOrder(sku, {\n ordered: out.status === 'completed',\n product: session.name,\n quantity,\n total: session.amountDisplay,\n protocol: 'ucp',\n payer: 'agent-key (UCP)',\n // The payment was ALWAYS authorized by a signed AP2 PaymentMandate — this\n // says so explicitly so it can't be misread as \"unauthorized\".\n paymentAuthorization: 'AP2 PaymentMandate (signed + verified)',\n // The OPTIONAL standing budget (authorize_agent_budget): applied here, or\n // not set for this order. \"not set\" ≠ unauthorized — see above.\n standingBudget: underAuthorization\n ? `applied (within your €${agentBudget?.maxAmountEur} cap, no per-order confirm)`\n : 'not set',\n status: out.status,\n orderId: out.id,\n message: `Ordered ${session.name} × ${quantity} — ${session.amountDisplay} charged via UCP + AP2 PaymentMandate (${out.status})${underAuthorization ? ` — under your standing €${agentBudget?.maxAmountEur} authorization, no per-order confirm` : ''}.`,\n });\n }\n\n if (req.params.name === 'buy_sinocare_product_x402') {\n if (!TOKEN) {\n return {\n content: [{ type: 'text', text: 'set AGENTBANK_AGENT_TOKEN (a test agent:execute key)' }],\n isError: true,\n };\n }\n const sku = String(args.sku ?? '');\n const quantity = Math.max(Number(args.quantity) || 1, 1);\n\n // Solana path (chain=solana): USDC over Solana (SVM). The merchant quotes a\n // Solana USDC session; this buyer builds + PARTIALLY signs an SPL transfer,\n // the x402.org facilitator co-signs as feePayer + sponsors the fee + submits.\n // Same merchant-quoted session shape as the EVM/USDC path, only the chain flips.\n if (args.chain === 'solana') {\n const secretKey = await solanaBuyerSecret();\n if (!secretKey) {\n return {\n content: [\n {\n type: 'text',\n text: 'set SOLANA_BUYER_SECRET (a devnet Solana secret key — solana-keygen JSON array or base58 — holding devnet USDC) to pay USDC-on-Solana orders',\n },\n ],\n isError: true,\n };\n }\n const { merchantId } = await backend<{ merchantId: string }>('/health');\n const session = await backend<{\n sessionId: string;\n name: string;\n accepts: SolanaX402Requirements[];\n amount: number;\n payTo: string;\n network: string;\n priceEur?: string;\n }>('/checkout-x402', {\n method: 'POST',\n body: JSON.stringify({ sku, quantity, currency: 'USDC', chain: 'solana' }),\n });\n const reqs = session.accepts?.[0];\n if (!reqs) throw new Error('merchant Solana USDC session missing payment requirements');\n\n // Balance pre-flight (skip on RPC error) against the merchant's quote.\n const owner = await addressFromSecretKey(secretKey);\n const have = await solanaUsdcBalance(owner, reqs.asset);\n const need = Number(reqs.maxAmountRequired);\n if (have !== null && have < need) {\n return text({\n ordered: false,\n reason: 'insufficient_usdc_solana',\n wallet: owner,\n network: reqs.network,\n have: `${(have / 1e6).toFixed(6)} USDC`,\n need: `${(need / 1e6).toFixed(6)} USDC`,\n faucet: 'https://faucet.circle.com',\n message: `Buyer wallet ${owner} has ${(have / 1e6).toFixed(6)} USDC on ${reqs.network}, needs ${(need / 1e6).toFixed(6)}. Top up devnet USDC at https://faucet.circle.com (Solana Devnet) and retry.`,\n });\n }\n\n // Sign the frozen quote (facilitator sponsors the fee), then pay { sessionId }.\n const xPayment = await signSolanaX402Payment({\n requirements: reqs,\n secretKey,\n rpcUrl: SOLANA_RPC,\n });\n const paidRes = await fetch(`${API_BASE}/x402/${encodeURIComponent(merchantId)}/checkout`, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n authorization: `Bearer ${TOKEN}`,\n 'x-payment': xPayment,\n },\n body: JSON.stringify({ sessionId: session.sessionId }),\n });\n const paid = (await paidRes.json()) as {\n status?: string;\n txHash?: string;\n paymentIntentId?: string;\n };\n if (paidRes.status !== 200) {\n throw new Error(`solana x402 settle -> ${paidRes.status}: ${JSON.stringify(paid)}`);\n }\n const paidUsdc = `${(need / 1e6).toFixed(6)} USDC`;\n const cluster = reqs.network === 'solana-devnet' ? '?cluster=devnet' : '';\n // finishOrder (not text) so a Solana order is recorded like every other\n // rail — the card rehydrates to a receipt on reload instead of the picker.\n return finishOrder(sku, {\n ordered: paid.status === 'captured',\n product: session.name,\n quantity,\n protocol: 'x402',\n payer: 'buyer chain wallet (x402)',\n priceEur: session.priceEur,\n paidUsdc: `${paidUsdc} (fixed test charge, merchant-quoted)`,\n payTo: reqs.payTo,\n network: reqs.network,\n paymentAuthorization:\n 'x402 SVM transfer (partially signed; facilitator co-signs feePayer + submits + sponsors gas)',\n status: paid.status,\n txHash: paid.txHash,\n explorer: paid.txHash\n ? `https://explorer.solana.com/tx/${paid.txHash}${cluster}`\n : undefined,\n paymentIntentId: paid.paymentIntentId,\n sessionId: session.sessionId,\n message: `Ordered ${session.name} × ${quantity} — paid ${paidUsdc} via x402 · USDC on Solana to ${reqs.payTo} (${paid.status}).`,\n });\n }\n\n const { merchantId } = await backend<{ merchantId: string }>('/health');\n\n // The MERCHANT opens a merchant-quoted x402 session — IT sets the USDC\n // price (the gateway has no Sinocare catalog). We just pay it; we never\n // compute or pass the amount. Same shape as the ACP `/checkout-acp` flow.\n const session = await backend<{\n sessionId: string;\n name: string;\n accepts: X402PaymentRequirements[];\n amount: number;\n payTo: string;\n network: string;\n priceEur?: string;\n }>('/checkout-x402', {\n method: 'POST',\n body: JSON.stringify({ sku, quantity, ...(BUYER ? { buyer: BUYER } : {}) }),\n });\n const reqs = session.accepts?.[0];\n if (!reqs) throw new Error('merchant x402 session missing payment requirements');\n\n // Pre-flight: a real payer key + a real facilitator + an empty wallet = a\n // cryptic on-chain decline. Check the balance first (skipped in throwaway-\n // key / STUB mode) against the MERCHANT's quoted amount.\n const buyer = await buyerSigner();\n if (buyer) {\n const have = await usdcBalance({\n network: reqs.network,\n owner: buyer.address,\n token: reqs.asset,\n });\n if (have < BigInt(session.amount)) {\n const onTestnet = reqs.network === 'base-sepolia';\n return text({\n ordered: false,\n reason: 'insufficient_usdc',\n wallet: buyer.address,\n network: reqs.network,\n have: fmtUsdc(have),\n need: fmtUsdc(BigInt(session.amount)),\n faucet: onTestnet ? 'https://faucet.circle.com' : undefined,\n message: `Buyer wallet ${buyer.address} has ${fmtUsdc(have)} on ${reqs.network}, needs ${fmtUsdc(BigInt(session.amount))}.${onTestnet ? ' Top up at https://faucet.circle.com (20 USDC / 2h) and retry.' : ' Fund it with USDC on Base and retry.'}`,\n });\n }\n }\n\n // Sign the merchant's frozen quote, then pay the session — the amount is\n // set by the merchant; we just reference { sessionId }.\n const xPayment = await signX402(reqs);\n const paidRes = await fetch(`${API_BASE}/x402/${encodeURIComponent(merchantId)}/checkout`, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n authorization: `Bearer ${TOKEN}`,\n 'x-payment': xPayment,\n },\n body: JSON.stringify({ sessionId: session.sessionId }),\n });\n const paid = (await paidRes.json()) as {\n status?: string;\n txHash?: string;\n paymentIntentId?: string;\n };\n if (paidRes.status !== 200) {\n throw new Error(`x402 settle -> ${paidRes.status}: ${JSON.stringify(paid)}`);\n }\n const paidUsdc = fmtUsdc(BigInt(session.amount));\n return finishOrder(sku, {\n ordered: paid.status === 'captured',\n product: session.name,\n quantity,\n protocol: 'x402',\n payer: 'buyer chain wallet (x402)',\n priceEur: session.priceEur,\n paidUsdc: `${paidUsdc} (fixed test charge, merchant-quoted)`,\n payTo: reqs.payTo,\n network: reqs.network,\n status: paid.status,\n txHash: paid.txHash,\n paymentIntentId: paid.paymentIntentId,\n sessionId: session.sessionId,\n message: `Ordered ${session.name} × ${quantity} — paid ${paidUsdc} via x402 (merchant-quoted) to ${reqs.payTo} (${paid.status}).`,\n });\n }\n\n if (req.params.name === 'x402_buyer_wallet') {\n const buyer = await buyerSigner();\n if (!buyer) {\n return text({\n configured: false,\n message:\n 'No buyer signer configured — x402 signs with a throwaway, unfunded key (only settles under a STUB facilitator). Set X402_SIGNER=cdp (+ CDP_API_KEY_ID/_SECRET/_WALLET_SECRET) for a CDP Server Wallet, or X402_PAYER_PRIVATE_KEY for a local key, to pay real testnet/mainnet USDC.',\n });\n }\n const [sepolia, mainnet] = await Promise.all([\n usdcBalance({ network: 'base-sepolia', owner: buyer.address }),\n usdcBalance({ network: 'base', owner: buyer.address }),\n ]);\n return text({\n address: buyer.address,\n balances: { 'base-sepolia': fmtUsdc(sepolia), base: fmtUsdc(mainnet) },\n faucet: 'https://faucet.circle.com (Base Sepolia USDC — 20 / 2h per address)',\n note: 'Fund this address with USDC to pay for x402 orders. Testnet: use the faucet. Mainnet: send real USDC on Base.',\n });\n }\n\n if (req.params.name === 'buy_sinocare_product_rlusd') {\n if (!TOKEN) {\n return {\n content: [{ type: 'text', text: 'set AGENTBANK_AGENT_TOKEN (a test agent:execute key)' }],\n isError: true,\n };\n }\n const wallet = xrplBuyer();\n if (!wallet) {\n return {\n content: [\n {\n type: 'text',\n text: 'set XRPL_BUYER_SEED (an sEd… testnet seed holding RLUSD + a little test XRP) to pay RLUSD orders',\n },\n ],\n isError: true,\n };\n }\n const sku = String(args.sku ?? '');\n const quantity = Math.max(Number(args.quantity) || 1, 1);\n const { merchantId } = await backend<{ merchantId: string }>('/health');\n\n // The MERCHANT opens a merchant-quoted RLUSD session — IT sets the price\n // (the gateway holds no Sinocare catalog). We just pay it. Same shape as the\n // USDC x402 flow, only `currency: 'RLUSD'` flips the chain to the XRP Ledger.\n const session = await backend<{\n sessionId: string;\n name: string;\n accepts: XrplPaymentRequirements[];\n amount: number;\n payTo: string;\n network: string;\n priceEur?: string;\n }>('/checkout-x402', {\n method: 'POST',\n body: JSON.stringify({ sku, quantity, currency: 'RLUSD' }),\n });\n const reqs = session.accepts?.[0];\n if (!reqs) throw new Error('merchant RLUSD session missing payment requirements');\n\n // One XRPL connection for both the balance pre-flight AND the signing\n // autofill. Pre-flight catches an unfunded / trust-line-less wallet before\n // we bother signing; on enough balance we sign the merchant's frozen quote.\n const issuer = reqs.extra?.issuer;\n const preflight = await withXrplClient(async (client) => {\n const have = issuer\n ? await rlusdBalance(client, wallet.classicAddress, reqs.asset, issuer)\n : '0';\n if (Number(have) < Number(reqs.maxAmountRequired)) {\n return { have, xPayment: null as string | null };\n }\n return { have, xPayment: await signXrpl(client, reqs, wallet) };\n });\n if (preflight.xPayment === null) {\n return text({\n ordered: false,\n reason: 'insufficient_rlusd',\n wallet: wallet.classicAddress,\n network: reqs.network,\n have: `${preflight.have} RLUSD`,\n need: `${reqs.maxAmountRequired} RLUSD`,\n message: `Buyer wallet ${wallet.classicAddress} holds ${preflight.have} RLUSD, needs ${reqs.maxAmountRequired}. Fund it with testnet RLUSD (+ a little test XRP for the fee) and retry.`,\n });\n }\n\n // Pay the session (amount is merchant-set; we just reference { sessionId }).\n const xPayment = preflight.xPayment;\n const paidRes = await fetch(`${API_BASE}/x402/${encodeURIComponent(merchantId)}/checkout`, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n authorization: `Bearer ${TOKEN}`,\n 'x-payment': xPayment,\n },\n body: JSON.stringify({ sessionId: session.sessionId }),\n });\n const paid = (await paidRes.json()) as {\n status?: string;\n txHash?: string;\n paymentIntentId?: string;\n };\n if (paidRes.status !== 200) {\n throw new Error(`rlusd settle -> ${paidRes.status}: ${JSON.stringify(paid)}`);\n }\n return finishOrder(sku, {\n ordered: paid.status === 'captured',\n product: session.name,\n quantity,\n protocol: 'x402',\n payer: 'buyer chain wallet (x402)',\n priceEur: session.priceEur,\n paidRlusd: `${reqs.maxAmountRequired} RLUSD (fixed test charge, merchant-quoted)`,\n payTo: reqs.payTo,\n network: reqs.network,\n status: paid.status,\n txHash: paid.txHash,\n explorer: paid.txHash ? `https://testnet.xrpl.org/transactions/${paid.txHash}` : undefined,\n paymentIntentId: paid.paymentIntentId,\n sessionId: session.sessionId,\n message: `Ordered ${session.name} × ${quantity} — paid ${reqs.maxAmountRequired} RLUSD via x402 on the XRP Ledger to ${reqs.payTo} (${paid.status}).`,\n });\n }\n\n if (req.params.name === 'buy_sinocare_product_skyfire') {\n if (!SKYFIRE_BUYER_API_KEY || !SKYFIRE_SELLER_SERVICE_ID) {\n return {\n content: [\n {\n type: 'text',\n text: 'set SKYFIRE_BUYER_API_KEY + SKYFIRE_SELLER_SERVICE_ID to mint a Skyfire pay token (the merchant backend charges it via the merchant SDK)',\n },\n ],\n isError: true,\n };\n }\n const sku = String(args.sku ?? '');\n const quantity = Math.max(Number(args.quantity) || 1, 1);\n const product = await backend<Product>(`/catalog/${encodeURIComponent(sku)}`).catch(\n () => null,\n );\n const productName = product?.name ?? sku;\n\n // The BUYER mints a Skyfire-signed PAY token (Skyfire's key signs it — the\n // buyer can't self-sign), then presents it to the MERCHANT backend, which\n // charges it via the merchant SDK (checkout.chargeSkyfire → the gateway\n // verifies it against Skyfire's live JWKS and records/settles). Three-layer:\n // buyer mints, merchant charges — the demo never calls the gateway directly.\n const token = await mintSkyfirePayToken(SKYFIRE_TEST_AMOUNT);\n const out = await backend<{\n agent?: { verified?: boolean; subject?: string };\n paymentIntentId?: string;\n status?: string;\n currency?: string;\n amount?: number;\n // True when a seller-charge redeemed the token (real USDC moved); false =\n // verified + recorded ('initiated', no money).\n settled?: boolean;\n }>('/checkout-skyfire', { method: 'POST', body: JSON.stringify({ sku, token }) });\n const amountStr =\n out.amount != null && out.currency\n ? `${(out.amount / 1e6).toFixed(6)} ${out.currency}`\n : `~${SKYFIRE_TEST_AMOUNT} USD`;\n const status = out.status ?? 'initiated';\n const captured = out.settled === true || status === 'captured';\n // Two terminal states, both a successful order: CAPTURED (seller-charge\n // configured → real USDC moved) vs VERIFIED+RECORDED (no seller key → PI\n // initiated, no money moved).\n const message = captured\n ? `Ordered ${productName} × ${quantity} via Skyfire KYAPay — ${amountStr} charged (Skyfire redeemed the PAY token buyer → seller) and the payment intent is captured (PI ${status}). agentbank verified the agent + payment authorization against Skyfire's live JWKS, then settled it via Skyfire seller-charge.`\n : `Ordered ${productName} × ${quantity} via Skyfire KYAPay — ${amountStr} verified against Skyfire's live JWKS + recorded (PI ${status}). agentbank verified the agent + payment authorization and recorded it; no seller key is configured, so it did not auto-capture and no money moved.`;\n return finishOrder(sku, {\n ordered: out.agent?.verified === true,\n product: productName,\n quantity,\n protocol: 'skyfire',\n payer: 'skyfire buyer token',\n paidUsdc: captured\n ? `${amountStr} (Skyfire KYAPay — charged, captured)`\n : `${amountStr} (Skyfire KYAPay authorization, recorded)`,\n buyerAgent: out.agent?.subject,\n paymentAuthorization:\n 'Skyfire KYAPay PAY token (Skyfire ES256-signed, verified against the live JWKS)',\n status,\n orderId: out.paymentIntentId,\n message,\n });\n }\n\n if (req.params.name === 'buy_sinocare_product_mpp') {\n if (!TEMPO_BUYER_PRIVATE_KEY) {\n return {\n content: [\n {\n type: 'text',\n text: 'set TEMPO_BUYER_PRIVATE_KEY (a funded Tempo testnet key) to pay via MPP · Tempo',\n },\n ],\n isError: true,\n };\n }\n const sku = String(args.sku ?? '');\n const quantity = Math.max(Number(args.quantity) || 1, 1);\n const product = await backend<Product>(`/catalog/${encodeURIComponent(sku)}`).catch(\n () => null,\n );\n const productName = product?.name ?? sku;\n\n // Three-layer MPP · Tempo — the demo talks only to the MERCHANT backend,\n // which mediates the HTTP-402 dance via the merchant SDK (checkout.openMPP):\n // 1. ask the backend to open the charge → it returns the 402 challenge;\n // 2. the buyer pays it on Tempo (SDK @curless/agentbank-protocols/tempo);\n // 3. hand the credential back to the backend → it settles.\n const opened = await backend<{ status: string; wwwAuthenticate?: string }>('/checkout-mpp', {\n method: 'POST',\n body: JSON.stringify({ sku }),\n });\n if (opened.status !== 'payment_required' || !opened.wwwAuthenticate) {\n throw new Error(`mpp open expected a challenge, got ${JSON.stringify(opened)}`);\n }\n const { credential, txHash } = await payMppTempoChallenge({\n wwwAuthenticate: opened.wwwAuthenticate,\n privateKey: TEMPO_BUYER_PRIVATE_KEY,\n rpcUrl: TEMPO_RPC,\n }).catch((e: unknown) => {\n throw new Error(\n `mpp tempo pay failed (${(e as Error).message}) — is the gateway's TEMPO_RECIPIENT set + the buyer wallet funded?`,\n );\n });\n const out = await backend<{\n status?: string;\n paymentIntentId?: string;\n amount?: number;\n currency?: string;\n }>('/checkout-mpp', { method: 'POST', body: JSON.stringify({ sku, credential }) });\n const paidStr = `${(MPP_TEMPO_TEST_AMOUNT / 1e6).toFixed(6)} pathUSD (Tempo TIP-20, on-chain)`;\n const settled = out.status === 'settled';\n return finishOrder(sku, {\n ordered: settled,\n product: productName,\n quantity,\n protocol: 'mpp',\n payer: 'buyer chain wallet (MPP·Tempo)',\n total: paidStr,\n paidUsdc: paidStr,\n status: settled ? 'captured' : out.status,\n orderId: out.paymentIntentId,\n txHash,\n message: `Ordered ${productName} × ${quantity} via MPP · Tempo — paid ${paidStr} to Sinocare on the Tempo chain (tx ${txHash.slice(0, 14)}…). The merchant backend issued the HTTP-402 challenge (via the merchant SDK) and, after the buyer paid on-chain, VERIFIED the TIP-20 transfer by hash — capturing the payment intent${out.paymentIntentId ? ` (PI ${out.paymentIntentId})` : ''}.`,\n });\n }\n\n if (req.params.name === 'xrpl_buyer_wallet') {\n const wallet = xrplBuyer();\n if (!wallet) {\n return text({\n configured: false,\n message:\n 'No XRPL buyer wallet — set XRPL_BUYER_SEED (an sEd… testnet seed) to pay RLUSD orders. Fund it with testnet RLUSD (a trust line to the RLUSD issuer) + a little test XRP for the fee/reserve.',\n });\n }\n const issuer = process.env.XRPL_RLUSD_ISSUER ?? 'rQhWct2fv4Vc4KRjRgMrxa8xPN9Zx9iLKV';\n const RLUSD_HEX = '524C555344000000000000000000000000000000';\n const have = await withXrplClient((client) =>\n rlusdBalance(client, wallet.classicAddress, RLUSD_HEX, issuer),\n );\n return text({\n address: wallet.classicAddress,\n network: 'xrpl:1 (testnet)',\n rlusd: `${have} RLUSD`,\n issuer,\n explorer: `https://testnet.xrpl.org/accounts/${wallet.classicAddress}`,\n note: 'Fund this address with testnet RLUSD (needs a trust line to the RLUSD issuer) + a little test XRP for the fee/reserve to pay RLUSD orders.',\n });\n }\n\n if (req.params.name === 'list_my_orders') {\n // The merchant backend lists its orders (single-merchant demo = my orders).\n const { orders } = await backend<{\n orders: Array<{\n id: string;\n status: string;\n amount: number;\n currency: string;\n protocol: string;\n lineItems?: Array<{ name: string; quantity: number }>;\n createdAt: string;\n // Set when a refund has already been asked for on this order.\n refundRequest?: { id: string; status: string } | null;\n }>;\n }>('/orders');\n // Shared with the wallet connector: the currency scaling (a 50000 RLUSD\n // order is 0.05, not 500 — the amount is minor units at the CURRENCY's\n // own scale) and the rule that a pending refund request outranks the\n // payment status, because this list is where the buyer decides whether to\n // ask, and `paid` beside a live 申请退款 button invites a second request.\n const view = ordersView(orders);\n // Render the orders CARD (structuredContent + _meta), not a plain JSON table —\n // the card lists each order with a 申请退款 button.\n return {\n content: [\n {\n type: 'text' as const,\n text: orders.length\n ? `You have ${orders.length} Sinocare order(s) — shown in the card (each settled one has a 申请退款 button).`\n : 'No Sinocare orders yet.',\n },\n ],\n structuredContent: view,\n _meta: CHECKOUT_UI_META,\n };\n }\n\n if (req.params.name === 'request_refund') {\n if (!TOKEN) {\n return {\n content: [{ type: 'text', text: 'set AGENTBANK_AGENT_TOKEN (a test agent:execute key)' }],\n isError: true,\n };\n }\n const orderId = String(args.orderId ?? '');\n if (!orderId) throw new Error('orderId is required (from list_my_orders)');\n // The BUYER asks the gateway directly (its own agent token) — the merchant\n // then approves/rejects from its MCP. Money moves only on approval+Curless.\n const res = await fetch(`${API_BASE}/v1/refund-requests`, {\n method: 'POST',\n headers: { 'content-type': 'application/json', authorization: `Bearer ${TOKEN}` },\n body: JSON.stringify({ orderId, reason: args.reason ? String(args.reason) : undefined }),\n });\n const out = (await res.json()) as {\n refundRequest?: { id: string; status: string };\n error?: { message?: string; type?: string } | string;\n message?: string;\n };\n if (!res.ok) {\n // The gateway's typed errors carry a message written for a human (\"this\n // order has already been refunded\", \"already has an open refund\n // request\"). Surface THAT — a raw JSON dump of the envelope is what the\n // buyer used to get, which tells them nothing about what to do next.\n const detail =\n (typeof out.error === 'object' && out.error?.message) ||\n (typeof out.error === 'string' ? out.error : '') ||\n out.message ||\n `HTTP ${res.status}`;\n throw new Error(String(detail));\n }\n return text({\n requested: true,\n refundRequestId: out.refundRequest?.id,\n status: out.refundRequest?.status,\n message: `Refund requested for ${orderId}. Sinocare will review and approve or reject it.`,\n });\n }\n\n if (req.params.name === 'authorize_agent_budget') {\n const maxAmountEur = Number(args.maxAmountEur);\n if (!Number.isFinite(maxAmountEur) || maxAmountEur <= 0) {\n throw new Error('maxAmountEur must be a positive number (EUR)');\n }\n const hours = Math.max(1, Math.floor(Number(args.hours) || 24));\n const expiresAt = new Date(Date.now() + hours * 3_600_000).toISOString();\n const maxAmount = Math.round(maxAmountEur * 100); // EUR minor units (cents)\n // The user signs the delegation as a real AP2 IntentMandate (ES256 JWS).\n const mandate = await signIntentMandate({\n prompt: `Autonomous Sinocare order — up to €${maxAmountEur} for ${hours}h`,\n constraints: { maxAmount },\n expiresAt,\n });\n agentBudget = { mandate, maxAmountEur, expiresAt };\n saveBudget(agentBudget); // survive a process restart\n return text({\n authorized: true,\n maxBudgetPerOrder: `€${maxAmountEur.toLocaleString('en-IE')}`,\n expiresAt,\n message: `Agent authorized to buy from Sinocare up to €${maxAmountEur} per order until ${expiresAt}. It can now complete UCP purchases under that cap without asking you to confirm each one; over-cap or expired purchases are rejected by the gateway.`,\n });\n }\n\n if (req.params.name === 'agent_budget_status') {\n if (!agentBudget || Date.parse(agentBudget.expiresAt) < Date.now()) {\n agentBudget = null;\n saveBudget(null);\n return text({\n authorized: false,\n message: 'No active order authorization — use authorize_agent_budget to delegate one.',\n });\n }\n return text({\n authorized: true,\n maxBudgetPerOrder: `€${agentBudget.maxAmountEur.toLocaleString('en-IE')}`,\n expiresAt: agentBudget.expiresAt,\n });\n }\n\n if (req.params.name === 'revoke_agent_budget') {\n const had = agentBudget !== null;\n agentBudget = null;\n saveBudget(null);\n return text({\n revoked: had,\n message: had\n ? 'Purchase authorization revoked — the agent needs a fresh one to buy autonomously.'\n : 'No authorization was set.',\n });\n }\n\n return { content: [{ type: 'text', text: `unknown tool: ${req.params.name}` }], isError: true };\n } catch (err) {\n return { content: [{ type: 'text', text: `Error: ${(err as Error).message}` }], isError: true };\n }\n});\n\nawait server.connect(new StdioServerTransport());\n","/**\n * The Sinocare catalogue, as both storefronts read it.\n *\n * The aisles were written out four times — twice in a tool's `enum`, twice in a\n * filter — and adding `analyzer` fixed two of the four. The shop then answered\n * \"analyzer\" with the whole catalogue on one storefront and with the right two\n * products on the other, which reads as a bug in the catalogue rather than in\n * the two lists that had drifted apart.\n */\n\n/**\n * The aisles a product can be in. ONE list: the tool schemas and the filters\n * are all built from it, so a new aisle cannot be half-added.\n */\nexport const CATEGORIES = ['meter', 'cgm', 'analyzer', 'strips', 'lancets', 'accessory'] as const;\n\nexport type Category = (typeof CATEGORIES)[number];\n\nexport const isCategory = (value: unknown): value is Category =>\n typeof value === 'string' && (CATEGORIES as readonly string[]).includes(value);\n\n/**\n * A product as the merchant backend spells it.\n *\n * These field names are the MERCHANT's, not ours. A card that renamed\n * `priceDisplay` to `priceEur` on the way through rendered a product with no\n * price at all — and a checkout that does not show what it costs is the one\n * thing it must never be.\n */\nexport type Product = {\n sku: string;\n name: string;\n category?: string;\n price?: number;\n currency?: string;\n priceDisplay?: string;\n description?: string;\n imageUrl?: string;\n source?: string;\n};\n\n/** The `category` property, for a tool's inputSchema. Built from CATEGORIES. */\nexport const categoryProperty = {\n type: 'string',\n enum: [...CATEGORIES],\n description: 'narrow to one aisle',\n} as const;\n\n/**\n * Narrow a catalogue to one aisle.\n *\n * An UNKNOWN category returns everything. A shop that answers a typo with \"no\n * products\" reads as an empty shop, and the person cannot tell the difference\n * between \"we do not sell that\" and \"you spelled it wrong\".\n */\nexport const filterByCategory = <T extends { category?: unknown }>(\n items: readonly T[],\n raw: unknown,\n): T[] => {\n const wanted = typeof raw === 'string' ? raw.trim().toLowerCase() : '';\n if (!isCategory(wanted)) return [...items];\n return items.filter((item) => String(item.category ?? '') === wanted);\n};\n\n/** The `?category=` a backend catalogue call should carry, or '' for all of it. */\nexport const categoryQuery = (raw: unknown): string => {\n const wanted = typeof raw === 'string' ? raw.trim().toLowerCase() : '';\n return isCategory(wanted) ? `?category=${encodeURIComponent(wanted)}` : '';\n};\n\n/** What a product costs, as a person reads it. */\nexport const priceDisplayOf = (product: Product): string =>\n product.priceDisplay ?? `€${((product.price ?? 0) / 100).toLocaleString('en-IE')}`;\n\n/**\n * Minor units at the CURRENCY's own scale — 2 for fiat, 6 for the stablecoins\n * this gateway settles. Dividing everything by 100 turns a 50000 RLUSD order\n * into 500 instead of 0.05, which is the same mistake in the direction that\n * costs the most.\n */\nconst decimals = (currency: string): number =>\n ['USDC', 'RLUSD', 'USDT'].includes(currency.toUpperCase()) ? 6 : 2;\n\n/** An amount in minor units, as a person reads it. */\nexport const formatMinor = (amount: number, currency: string): string => {\n const dp = decimals(currency);\n return `${(amount / 10 ** dp).toLocaleString('en-IE', { maximumFractionDigits: dp })} ${currency}`;\n};\n\n/**\n * Which product someone meant.\n *\n * ⚠️ An ambiguous name is NEVER guessed. \"Safe-Accu\" and \"Safe-Accu2\" differ by\n * one character, and every caller of this ends in a checkout — one of them in a\n * charge. Taking the first of several matches is how the wrong box of strips\n * gets paid for, so several matches is an answer ('ambiguous') with the\n * candidates attached, not a pick.\n *\n * In order: the exact sku, then an exact name, then the only product where what\n * was typed ends on a WORD BOUNDARY, then the only product that contains it at\n * all.\n *\n * That third step is what makes \"Safe-Accu\" answerable in a catalogue that also\n * sells \"Safe-Accu2\": the query is a whole token of the first name and only\n * part of a token in the second, so this is a distinction, not a coin toss.\n * Without it the one product name the instructions tell the model to try came\n * back as \"matches 2 products — say which one\".\n */\nexport type ProductMatch =\n | { kind: 'found'; product: Product }\n | { kind: 'ambiguous'; candidates: Product[] }\n | { kind: 'none' };\n\nexport const resolveProduct = (\n items: readonly Product[],\n query: { sku?: unknown; query?: unknown },\n): ProductMatch => {\n const sku = String(query.sku ?? '').trim();\n if (sku) {\n const bySku = items.find((it) => it.sku.toLowerCase() === sku.toLowerCase());\n if (bySku) return { kind: 'found', product: bySku };\n }\n // A sku that matched nothing may still be a NAME — hosts and people both pass\n // one in the `sku` field, and refusing to look would answer \"no such product\"\n // for something on the shelf.\n const typed = (sku || String(query.query ?? '')).trim().toLowerCase();\n if (!typed) return { kind: 'none' };\n\n const exact = items.filter((it) => it.name.trim().toLowerCase() === typed);\n if (exact.length === 1 && exact[0]) return { kind: 'found', product: exact[0] };\n\n const partial = items.filter((it) => it.name.toLowerCase().includes(typed));\n if (partial.length === 1 && partial[0]) return { kind: 'found', product: partial[0] };\n if (!partial.length) return { kind: 'none' };\n\n // Does what was typed END a word in this name? \"safe-accu\" does in \"Safe-Accu\n // Blood Glucose…\" (a space follows) and does not in \"Safe-Accu2 …\" (a digit\n // does).\n const onWordBoundary = partial.filter((it) => {\n const name = it.name.toLowerCase();\n let at = name.indexOf(typed);\n while (at !== -1) {\n const after = name[at + typed.length];\n if (after === undefined || !/[a-z0-9]/.test(after)) return true;\n at = name.indexOf(typed, at + 1);\n }\n return false;\n });\n if (onWordBoundary.length === 1 && onWordBoundary[0]) {\n return { kind: 'found', product: onWordBoundary[0] };\n }\n return { kind: 'ambiguous', candidates: partial };\n};\n","/**\n * What a storefront has to say about its checkout card, and to two different\n * hosts at once.\n *\n * Both storefronts serve the same card under their own `ui://` uri, and both\n * had their own copy of this metadata. The copies drifted in the two places\n * that fail SILENTLY — the image allow-list and the ChatGPT keys — so one shop\n * showed photos and the other showed nothing, with no error anywhere.\n */\n\n/**\n * ⚠️ `text/html;profile=mcp-app`.\n *\n * `text/html+skybridge` is a plausible near-miss that fails silently: the host\n * stops recognising the resource as a card and answers \"there was a problem\n * displaying content\".\n */\nexport const CARD_MIME = 'text/html;profile=mcp-app';\n\n/**\n * WHERE THE CARD MAY LOAD IMAGES FROM.\n *\n * ⚠️ An MCP App runs in a sandboxed iframe and the spec is explicit: an empty\n * or omitted `resourceDomains` means NO network resources. Every product photo\n * is then blocked before it leaves the starting line — not by the CDN, not by\n * the markup — and the grid renders as broken-image icons. That exact omission\n * cost three rounds of \"the pictures still aren't showing\" on the moody\n * storefront, chased through theories about the CDN, and then cost it again\n * here because the fix landed in one storefront's copy.\n *\n * The catalogue is served from a Shopify store, and Shopify re-hosts whatever\n * image a product was created with, so the photos come off Shopify's CDN.\n */\nexport const IMAGE_ORIGINS = ['https://cdn.shopify.com'];\n\n/**\n * \"This tool's result is renderable by that card.\"\n *\n * ⚠️ Declare it ONLY on tools whose result the card can actually draw.\n * Blanket-attaching it told the host that a product LIST renders the checkout\n * card: the host drew the card, the card got `{products:[…]}` with no view it\n * knew, and it sat on \"Loading…\" for ever — under a tool that had worked\n * perfectly and returned exactly what was asked for.\n *\n * Both host namespaces, because they read different ones: `ui.resourceUri` is\n * MCP Apps (Claude), `openai/outputTemplate` is ChatGPT's Apps SDK, and\n * `openai/widgetAccessible` is what lets the rendered card call back into these\n * tools — which is the entire interaction, so without it every click in the\n * card does nothing.\n */\nexport const uiMeta = (cardUri: string) => ({\n ui: { resourceUri: cardUri },\n 'ui/resourceUri': cardUri,\n 'openai/outputTemplate': cardUri,\n 'openai/widgetAccessible': true,\n});\n\n/**\n * The card resource's own metadata: what it may load, and (remote storefronts\n * only) the origin it is served from.\n *\n * `widgetDomain` is for a storefront that HAS a public origin. A stdio server\n * has none — passing its gateway URL there would name an origin the card is not\n * served from.\n */\nexport const widgetMeta = (opts: { widgetDomain?: string; imageOrigins?: string[] } = {}) => {\n const resourceDomains = opts.imageOrigins ?? IMAGE_ORIGINS;\n return {\n ui: { csp: { resourceDomains, connectDomains: [] } },\n 'openai/widgetCSP': { connect_domains: [], resource_domains: resourceDomains },\n ...(opts.widgetDomain ? { 'openai/widgetDomain': opts.widgetDomain } : {}),\n };\n};\n\n/**\n * Does this storefront serve the uri a host is asking for?\n *\n * ⚠️ ANY version of OUR card uri gets the CURRENT card.\n *\n * Versioning the uri busts host caches — that is why it is bumped. But a host\n * that cached an OLD uri keeps asking for it, and answering \"unknown resource\"\n * turns a merely stale card into a broken one: the host reports \"there was a\n * problem displaying content\" and there is nothing the person can do about it.\n * So the bump keeps its job (a new uri is a cache miss and fetches fresh) and\n * loses its sting (an old uri still gets a card).\n */\nexport const servesCardUri = (prefix: string, asked: string): boolean => asked.startsWith(prefix);\n","/**\n * WHAT THE CHECKOUT CARD IS HANDED, and what it may draw.\n *\n * The card used to know both shops: one copy hard-coded seven rails in a\n * `GROUPS` table, the other hard-coded three wallet rows in a `ROWS` table, and\n * each knew the tool names to call. A card that knows its shop is a card that\n * has to be forked per shop — which is how there came to be two of them.\n *\n * So the shop sends its own payment table and the card draws whatever arrives.\n * The card knows how a group, a row and an action LOOK; it does not know what\n * this shop sells or how it takes money.\n */\nimport type { Product } from './catalog.js';\n\n/** One clickable thing in a payment row — a tool call, or a link out. */\nexport type CheckoutAction = {\n label: string;\n /** The tool this button calls. It must be a tool of THIS server. */\n tool: string;\n /** Merged over `{sku, quantity}` when the button is pressed. */\n args?: Record<string, unknown>;\n /** Opens a URL from the result rather than rendering a receipt. */\n ext?: boolean;\n /**\n * Finish this one in the CONVERSATION, not in the card.\n *\n * A widget may only call tools on the server that gave it —\n * `callServerTool` takes a tool name and no server — so a credential living\n * in a separately-installed wallet connector is out of reach. Dressed up as\n * a click-to-pay button it produced a card that opened a checkout, said\n * \"one step left\", and left the person with nothing to press.\n */\n chat?: boolean;\n};\n\n/**\n * One row of the picker.\n *\n * ONE consistent axis wherever money has a denomination: the title is WHAT you\n * pay and WHERE it settles, the actions are WHICH protocol carries it. A card\n * rail is the exception, and only because it has no coin/chain axis at all.\n */\nexport type CheckoutRow = {\n title: string;\n sub: string;\n actions: CheckoutAction[];\n};\n\nexport type CheckoutGroup = { label: string; rows: CheckoutRow[] };\n\n/** A settled order, as the card shows it back. */\nexport type CheckoutReceipt = {\n /** What ACTUALLY paid, as the SERVER reports it — never the button clicked. */\n payer?: string;\n total?: string;\n protocol?: string;\n status?: string;\n orderId?: string;\n txHash?: string;\n explorer?: string;\n message?: string;\n};\n\n/**\n * The checkout card's payload.\n *\n * ⚠️ `product` is nested, and its fields are the MERCHANT's own names. Copying\n * the price into a `priceEur` on the way through is what once rendered a\n * product with no price at all, and a checkout that does not show what it\n * costs is the one thing it must never be.\n */\nexport type CheckoutView = {\n view: 'checkout';\n product: Pick<Product, 'sku' | 'name' | 'priceDisplay' | 'imageUrl'>;\n quantity: number;\n groups: CheckoutGroup[];\n /**\n * Set ONLY when THIS checkout was paid — not when this product has ever been\n * bought. Looking it up by sku treats a product as a purchase: on an account\n * that had bought 42 of 44 products, almost every card rendered as an\n * already-paid receipt the moment it self-healed, hiding the payment options\n * behind an order from days earlier.\n */\n receipt?: CheckoutReceipt | null;\n /** Which language the card's own chrome speaks. Default English. */\n lang?: CardLang;\n};\n\nexport const checkoutView = (input: {\n product: Pick<Product, 'sku' | 'name' | 'priceDisplay' | 'imageUrl'>;\n quantity?: number;\n groups: CheckoutGroup[];\n receipt?: CheckoutReceipt | null;\n lang?: CardLang;\n}): CheckoutView => ({\n view: 'checkout',\n product: input.product,\n quantity: Math.max(input.quantity ?? 1, 1),\n groups: input.groups,\n receipt: input.receipt ?? null,\n ...(input.lang ? { lang: input.lang } : {}),\n});\n\n// ── the card's own words ─────────────────────────────────────────────────────\n/**\n * The strings the CARD owns, in the languages the two shops speak.\n *\n * Everything a SHOP says — group labels, row titles, button labels, every\n * `message` — comes from that shop over the wire, so the two keep their own\n * voice. These fifteen are the card's own furniture, and they are here rather\n * than in the widget because one widget source is built to one file: a card\n * that hard-coded them would have to be forked to speak the other language,\n * which is the fork this whole change removes.\n */\nexport type CardLang = 'en' | 'zh';\n\nexport type CardCopy = {\n loading: string;\n opening: string;\n /** `{method}` — the row the person clicked. */\n paying: string;\n emptyCatalog: string;\n noOrders: string;\n /** `{count}` — how many products are on the shelf. */\n productCount: string;\n /** `{product}` — what the receipt is for, when the server sent no message. */\n orderedFallback: string;\n /** `{product}` — the one sentence the card says on the person's behalf. */\n handOffAsk: string;\n back: string;\n orderAgain: string;\n viewOrders: string;\n ordered: string;\n notCompleted: string;\n oneStepLeft: string;\n signIn: string;\n signInGo: string;\n signInWait: string;\n /** `{email}` — who just finished signing in, while the payment goes through. */\n signedInPaying: string;\n signInExpired: string;\n /**\n * Never having started a sign-in is NOT a timeout. Telling someone their code\n * expired when they were never given one sends them looking for a mistake\n * they did not make.\n */\n signInNeverStarted: string;\n ordersFailed: string;\n walletSaidNo: string;\n openWallet: string;\n goPay: string;\n payWait: string;\n payTimeout: string;\n handedOver: string;\n handedOverBody: string;\n handedOverWait: string;\n refund: string;\n refunding: string;\n refundFailed: string;\n onChainTx: string;\n paidBy: string;\n cannotOpen: string;\n cardFailed: string;\n nothingToShow: string;\n nothingToShowBody: string;\n refresh: string;\n ordersTitle: string;\n};\n\nexport const CARD_COPY: Record<CardLang, CardCopy> = {\n en: {\n loading: 'Loading…',\n opening: 'Opening checkout…',\n paying: 'Paying via {method}…',\n emptyCatalog: 'Nothing in the catalog.',\n noOrders: 'No orders yet — pick something from the catalog first.',\n productCount: '{count} products',\n orderedFallback: 'Ordered {product}',\n handOffAsk: 'Buy {product} with Curless wallet',\n back: '← Choose another way',\n orderAgain: 'Order another',\n viewOrders: 'View my orders →',\n ordered: 'Ordered',\n notCompleted: 'Not completed',\n oneStepLeft: 'One step left',\n signIn: 'Sign in to Curless',\n signInGo: 'Sign in ↗',\n signInWait:\n 'This card reconnects on its own once you are in. Binding a card happens there too.',\n signedInPaying: 'Signed in as {email} — paying…',\n signInExpired: 'That sign-in timed out — start it again above.',\n signInNeverStarted: 'No sign-in started yet — use the link above.',\n ordersFailed: 'Could not load your orders.',\n walletSaidNo: 'Wallet said no',\n openWallet: 'Open wallet ↗',\n goPay: 'Go pay ↗',\n payWait: 'Approve it in your browser and this card turns into a receipt on its own.',\n payTimeout: 'No payment received yet. Once you have paid, check “my orders”.',\n handedOver: 'Handed to your assistant',\n handedOverBody:\n 'This one is paid from the Curless wallet connector you installed — the credential lives there, and this card cannot reach it.',\n handedOverWait:\n 'Your assistant will open the checkout, get you signed in if needed, and confirm the amount with you before anything is charged.',\n refund: 'Request a refund',\n refunding: 'Working…',\n refundFailed: 'The refund request failed',\n onChainTx: 'On-chain tx:',\n paidBy: 'Paid by:',\n cannotOpen: 'Could not open the checkout',\n cardFailed: 'The card could not load',\n nothingToShow: 'Nothing to show here',\n nothingToShowBody: 'Ask for a product by name, or for the catalog.',\n refresh: 'Refresh',\n ordersTitle: 'My orders',\n },\n zh: {\n loading: '加载中…',\n opening: '正在开结账…',\n paying: '正在通过 {method} 结算…',\n emptyCatalog: '目录里没有商品。',\n noOrders: '还没有订单 —— 先从目录里挑一件。',\n productCount: '{count} 件商品',\n orderedFallback: '已下单 {product}',\n handOffAsk: '用 Curless 钱包买{product}',\n back: '← 换个支付方式',\n orderAgain: '再订一次',\n viewOrders: '查看我的订单 →',\n ordered: '已下单',\n notCompleted: '未完成',\n oneStepLeft: '还差一步',\n signIn: '登录 Curless 钱包',\n signInGo: '去登录 ↗',\n signInWait: '登录完这张卡会自己接上。绑卡也在同一个页面里。',\n signedInPaying: '已登录 {email} —— 正在付款…',\n signInExpired: '登录超时了,点上面重新来一次。',\n signInNeverStarted: '还没开始登录 —— 点上面那个链接。',\n ordersFailed: '订单加载失败。',\n walletSaidNo: '钱包未放行',\n openWallet: '打开钱包 ↗',\n goPay: '去付款 ↗',\n payWait: '在浏览器里批准后,这张卡会自己变成收据。',\n payTimeout: '还没收到付款。付完点一下\"我的订单\"看看。',\n handedOver: '交给助手继续',\n handedOverBody:\n '这笔要用你自己装的 Curless 钱包连接器付 —— 凭据在那个连接器里,这张卡够不到它。',\n handedOverWait: '助手会先让你登录钱包,再铸一张凭据完成付款,扣款前会跟你确认金额。',\n refund: '申请退款',\n refunding: '处理中…',\n refundFailed: '退款申请失败',\n onChainTx: '链上交易:',\n paidBy: '付款方式:',\n cannotOpen: '打不开结账',\n cardFailed: '卡片加载失败',\n nothingToShow: '这里没有可显示的内容',\n nothingToShowBody: '说出商品名字,或者让我打开目录。',\n refresh: '刷新',\n ordersTitle: '我的订单',\n },\n};\n","/**\n * The storefront's `instructions` — a SPEC FOR THE MODEL, not documentation.\n *\n * The host injects this into the model's context, so every rule here is load-\n * bearing. Left to itself the model reads the tool list, renders the catalogue\n * card, and then ALSO pops a chooser asking which product to buy — over a grid\n * where every tile already has a Buy button. A card the model talks over has\n * replaced nothing.\n *\n * ⚠️ The two storefronts do NOT say the same thing, and must not.\n *\n * The seven-rail demo has to explain a choice between ACP / UCP / x402 /\n * RLUSD / Payment Link; the wallet connector has three wallet shapes and no\n * rails at all. What they share is the SHAPE and the handful of rules that\n * were each learned by watching the model get it wrong. So the payment\n * sentence is the caller's, and everything around it is fixed here.\n */\nexport type InstructionOptions = {\n /** One line: whose shop this is, and that the card IS the shop. */\n opening: string;\n /**\n * How THIS storefront's checkout card lets someone pay, and the matching\n * \"do not retype the options as text\" rule. The one genuinely different\n * paragraph.\n */\n paymentCard: string;\n /**\n * The field a tool sets when an order actually went through. Named because\n * the closing rule quotes it, and the two storefronts spell it differently\n * (`ordered` here, `booked` in the older seven-rail demo).\n */\n orderedField?: string;\n /** Anything only this storefront needs — a hand-off chain, a rail fallback. */\n extra?: string[];\n};\n\nexport const buildInstructions = (opts: InstructionOptions): string =>\n [\n opts.opening,\n // Every one of these was added after watching the model do the opposite.\n 'To show what is for sale, call list_sinocare_products ONCE and STOP. Do NOT then ask which one, and do NOT retype the products as a numbered list — the person picks by tapping Buy in the card. Say at most one short line, e.g. \"Here is the Sinocare catalog — tap Buy on any of them.\"',\n opts.paymentCard,\n 'Only fall back to describing things in prose if the card genuinely cannot be shown (a host with no UI).',\n 'When the person names a product, open its checkout directly rather than asking them to confirm. If the name is ambiguous or unknown, show the catalog card and let them pick a tile.',\n 'IN THE CHAT, “buy with Curless wallet” means start_sinocare_wallet_handoff. Pass the product when you have it — the card puts it in that message for you; with no product named at all, call the tool with no arguments and let it try. The other two wallet paths are driven by the CARD: the person taps them and the card finishes in place, so do not run those from the chat.',\n ...(opts.extra ?? []),\n `Nothing is charged until the person acts. A tool that opens a checkout returns \\`${opts.orderedField ?? 'ordered'}: false\\` — report it as opened, never as bought.`,\n ].join('\\n');\n","/**\n * The tools BOTH Sinocare storefronts advertise, in one place.\n *\n * A tool description is read by a model deciding whether to move money, which\n * is why the two copies drifting mattered: the same tool told one host that a\n * wallet refusal must stop the purchase and told the other nothing at all.\n * Both tables also carried `quantity: 'number of guests/weeks'` — left over\n * from a resort demo, in a shop that sells boxes of test strips.\n *\n * The seven-rail demo adds its own rail tools on top of these; only the\n * checkout card's payment vocabulary is genuinely per-storefront, so that one\n * sentence is a parameter and everything else is fixed.\n */\nimport { categoryProperty } from './catalog.js';\n\nexport type ToolDef = {\n name: string;\n description: string;\n inputSchema: {\n type: 'object';\n properties: Record<string, unknown>;\n required?: string[];\n };\n};\n\n/** `quantity`, in a shop that sells boxes of things. */\nconst quantity = { type: 'integer', description: 'how many, default 1' } as const;\n\nconst sku = {\n type: 'string',\n description: \"the product's exact sku (from list_sinocare_products)\",\n};\nconst query = {\n type: 'string',\n description:\n \"the product NAME (e.g. 'Safe AQ Smart') — used when the exact sku is not known; resolved against the live catalog. Pass `sku` OR `query`.\",\n};\n\nexport type StorefrontToolOptions = {\n /**\n * What the checkout card offers, in this storefront's own vocabulary — the\n * three wallet shapes, or the seven rails. Appended to a fixed description,\n * because \"open the card instead of listing the options as text\" is the same\n * instruction in both shops and only the list differs.\n */\n checkoutOffers: string;\n};\n\n/**\n * The tools both storefronts advertise, in the order a buyer meets them.\n *\n * ⚠️ Every name here must have a dispatch case on both sides. A range-edit once\n * deleted four cases while the table still advertised them, and the server\n * answered \"unknown tool\" for tools it had just listed.\n */\nexport const storefrontTools = (opts: StorefrontToolOptions): ToolDef[] => [\n {\n name: 'list_sinocare_products',\n description:\n 'Browse the Sinocare catalog AS A CARD — every tile opens a checkout for that product, so the person picks and pays in one place. Prefer this over listing the catalog as text. Optional `category` filter: meter | cgm | analyzer | strips | lancets | accessory.',\n inputSchema: {\n type: 'object',\n properties: { category: categoryProperty },\n },\n },\n {\n name: 'get_sinocare_product',\n description:\n 'One Sinocare product by its sku (from list_sinocare_products), with its price and what is in the box.',\n inputSchema: {\n type: 'object',\n properties: { sku },\n required: ['sku'],\n },\n },\n {\n name: 'start_sinocare_checkout',\n description: `THE DEFAULT WAY TO BUY. Open the visual checkout card for a product, so the person picks how to pay by clicking IN THE CARD instead of typing. ${opts.checkoutOffers} When someone wants to buy, CALL THIS — do not list the payment options as text and ask which one. Identify the product: pass its \\`sku\\` OR a \\`query\\` name (e.g. 'Safe-Accu'). To show the whole catalog instead, call list_sinocare_products — it renders as a card too, and every tile opens that product's checkout.`,\n inputSchema: {\n type: 'object',\n properties: { sku, query, quantity },\n },\n },\n {\n name: 'buy_sinocare_product_wallet',\n description:\n 'Order and pay in one call, from the Curless wallet THIS storefront holds a session for: the wallet mints a credential from the card THEY bound, capped by the limits THEY set, scoped to this seller and this amount for 15 minutes. If nobody is signed in it returns a browser sign-in link and orders nothing — show the person the link; the card polls on its own and pays once they finish. Do NOT ask them for a password in the chat. ⚠️ If the wallet refuses — over their own limit, no card bound — say what it said and STOP; do not pay for this another way. ⚠️ THE CARD DRIVES THIS ONE — the person taps it and the card finishes it in place. From the CHAT, when someone says “buy with Curless wallet”, use start_sinocare_wallet_handoff instead: that is the path that runs through you. Reach for this only when there is no card at all.',\n inputSchema: {\n type: 'object',\n properties: { sku, quantity },\n required: ['sku'],\n },\n },\n {\n name: 'start_sinocare_wallet_handoff',\n description:\n \"HAND-OFF, step 1 — what “Buy with Curless wallet” in the chat means. Pass the sku or product name whenever you have one; the card writes the product into that message, so usually you do. If the person genuinely named nothing, call this with no arguments: the server falls back to a checkout opened on THIS connection, and answers with the product and amount either way — confirm that with them before minting any credential. Open a Sinocare checkout to be paid by a SEPARATELY-INSTALLED Curless wallet connector. Returns {sessionId, merchantId, amount, currency} and charges nothing. Next: call that connector's `wallet_pay_credential` with exactly this amount, currency and merchantRef=merchantId, then pass the token it returns to `pay_sinocare_with_token`. This needs that connector installed; only if it is genuinely absent fall back to buy_sinocare_product_wallet or pay_sinocare_hosted. ⚠️ If the wallet refuses — not signed in, over their own limit, no card bound — STOP and repeat what it said. Do NOT pay for this another way: they chose to pay from their own wallet, and settling it elsewhere spends different money and reports it as theirs.\",\n inputSchema: {\n type: 'object',\n properties: { sku, query, quantity },\n },\n },\n {\n name: 'pay_sinocare_with_token',\n description:\n 'HAND-OFF, step 2. Complete a checkout opened by start_sinocare_wallet_handoff using a credential minted elsewhere (a Stripe shared payment token, spt_…). Sinocare completes with its own merchant key and never sees a card. WHEN THE PERSON NAMES NO PRODUCT — “buy with Curless wallet”, “pay for this” — CALL THIS WITH NO ARGUMENTS. The storefront resolves whichever product they just opened a card for, and names it back to you; it refuses when there is none. Do NOT ask which item first: the server knows, and a tool result from a card never reached you.',\n inputSchema: {\n type: 'object',\n properties: {\n sessionId: { type: 'string', description: 'from start_sinocare_wallet_handoff' },\n merchantId: { type: 'string', description: 'from start_sinocare_wallet_handoff' },\n token: { type: 'string', description: 'spt_… from the wallet' },\n },\n required: ['sessionId', 'merchantId', 'token'],\n },\n },\n {\n name: 'pay_sinocare_hosted',\n description:\n 'HOSTED. Open a checkout and hand back a link the person approves in their own browser — they see the amount and the merchant before anything is charged, and the gateway completes it. Needs nothing installed anywhere. Nothing is charged by this call: poll get_sinocare_order_status afterwards, do not claim it is paid until that says so, and do not pay for it another way while they are still on the page. ⚠️ THE CARD DRIVES THIS ONE — the person taps it and the card finishes it in place. From the CHAT, when someone says “buy with Curless wallet”, use start_sinocare_wallet_handoff instead: that is the path that runs through you. Reach for this only when there is no card at all.',\n inputSchema: {\n type: 'object',\n properties: { sku, quantity },\n required: ['sku'],\n },\n },\n {\n name: 'get_sinocare_order_status',\n description:\n 'Has this checkout been paid? Use after pay_sinocare_hosted — the approval happens in a browser and this server is never told when it does. `completed` means the money moved.',\n inputSchema: {\n type: 'object',\n properties: {\n sessionId: { type: 'string' },\n merchantId: { type: 'string', description: 'from the tool that opened this checkout' },\n },\n required: ['sessionId', 'merchantId'],\n },\n },\n {\n name: 'curless_wallet_login_status',\n description:\n 'Is anyone signed into the wallet THIS storefront holds? A separately-installed Curless wallet connector has its own session and this tool knows nothing about it — ask that connector instead. The checkout card polls this by itself; you do not normally need to.',\n inputSchema: { type: 'object', properties: {} },\n },\n {\n name: 'curless_wallet_logout',\n description:\n 'Sign out of the wallet session this storefront holds, and revoke it so it cannot be used again. Use when the person asks to sign out, or is done and someone else may use this machine. Says nothing about a separately-installed wallet connector.',\n inputSchema: { type: 'object', properties: {} },\n },\n {\n name: 'list_my_orders',\n description:\n 'Orders placed through this storefront, newest first, with id, product, amount and status. Renders as a card where each settled order has a refund button; the order id is what request_refund takes.',\n inputSchema: { type: 'object', properties: {} },\n },\n {\n name: 'request_refund',\n description:\n 'Ask Sinocare to refund an order. Pass the order id (ord_…) from list_my_orders and an optional reason. The buyer asks; the merchant approves from its own tools, and money moves only on approval.',\n inputSchema: {\n type: 'object',\n properties: {\n orderId: { type: 'string', description: 'order id from list_my_orders (ord_…)' },\n reason: { type: 'string' },\n },\n required: ['orderId'],\n },\n },\n];\n","/**\n * What a tool result LOOKS like to the card.\n *\n * `view` is the card's dispatch key, and both storefronts were building these\n * shapes by hand. The catalogue view once came back as the merchant card's\n * `{currency, count, products}` after a rename that changed identifiers and not\n * payloads — the card read `products`, got undefined, and drew nothing.\n */\nimport { type Product, formatMinor } from './catalog.js';\n\n/** The catalogue, as the card's product grid reads it. */\nexport const productsView = (products: readonly Product[]) => ({\n view: 'products' as const,\n count: products.length,\n products: [...products],\n});\n\n/** An order as the merchant backend lists it. */\nexport type BackendOrder = {\n id: string;\n status: string;\n amount: number;\n currency: string;\n protocol?: string;\n lineItems?: Array<{ name: string; quantity: number }>;\n createdAt?: string;\n /** Set when a refund has already been asked for on this order. */\n refundRequest?: { id: string; status: string } | null;\n};\n\n/** One order as the card's list reads it. */\nexport type OrderRow = {\n orderId: string;\n status: string;\n refundPending: boolean;\n product: string;\n total: string;\n protocol?: string;\n date: string;\n};\n\n/**\n * The buyer's orders, as the card's list reads them.\n *\n * A PENDING refund request outranks the payment status here, because this list\n * is where the buyer decides whether to ask. `paid` beside a live \"request\n * refund\" button, on an order they already asked about, invites them to ask\n * twice. `refundPending` is a flag rather than a substring of the status, so\n * the button and the wording cannot drift apart when the gateway gains a new\n * refund-ish status tomorrow.\n */\nexport const ordersView = (orders: readonly BackendOrder[]) => ({\n view: 'orders' as const,\n orders: orders.map(\n (o): OrderRow => ({\n orderId: o.id,\n status: o.refundRequest\n ? o.refundRequest.status === 'approved'\n ? 'refund approved'\n : 'refund requested'\n : o.status,\n refundPending: Boolean(o.refundRequest),\n product: o.lineItems?.map((li) => `${li.name} ×${li.quantity}`).join(', ') ?? '',\n total: formatMinor(Number(o.amount ?? 0), String(o.currency ?? 'EUR')),\n protocol: o.protocol,\n date: o.createdAt?.slice(0, 10) ?? '',\n }),\n ),\n});\n","// GENERATED by packages/internal/sinocare-storefront/widget (`npm run build`).\n// Do not edit by hand, and do not edit the OTHER storefront's copy either — both\n// are emitted from the one card source, and they are byte-identical on purpose.\n// A single self-contained HTML (Vite + vite-plugin-singlefile, with the MCP Apps\n// SDK bundled), base64-embedded so it is bundler-safe.\n//\n// ⚠️ After regenerating, BUMP THE CARD URI in each server. A host caches the\n// card's HTML by that uri, so new card code under the old one leaves every\n// existing conversation rendering the previous build — the server returns\n// corrected data and the old JS draws the old picture, which is\n// indistinguishable from \"the fix did not work\".\nexport const CHECKOUT_CARD_HTML: string = Buffer.from(\n 'PCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0idXRmLTgiIC8+CiAgICA8c3R5bGU+CiAgICAgIC8qIFRoZW1lIG9mZiB0aGUgSE9TVCdzIG93biBkZXNpZ24gdG9rZW5zICh0aGUgTUNQIEFwcHMgU0RLIGluamVjdHMgdGhlbSksCiAgICAgICAgIHNvIHRoZSBjYXJkIHNpdHMgbmF0aXZlbHkgaW5zaWRlIENsYXVkZSDigJQgbGlnaHQvZGFyaywgZm9udHMgYW5kIHJhZGlpCiAgICAgICAgIGFsbCBtYXRjaCB3aXRob3V0IHRoaXMgY2FyZCBrbm93aW5nIHdoaWNoIGlzIGluIGZvcmNlLiBUaGUgZmFsbGJhY2tzCiAgICAgICAgIGFyZSB3aGF0IGEgaG9zdCB0aGF0IGluamVjdHMgbm90aGluZyBnZXRzLiAqLwogICAgICA6cm9vdCB7CiAgICAgICAgLS1iZzogdmFyKC0tY29sb3ItYmFja2dyb3VuZC1wcmltYXJ5LCAjZmZmZmZmKTsKICAgICAgICAtLWJnLXNvZnQ6IHZhcigtLWNvbG9yLWJhY2tncm91bmQtc2Vjb25kYXJ5LCAjZjZmOGZhKTsKICAgICAgICAtLWZnOiB2YXIoLS1jb2xvci10ZXh0LXByaW1hcnksICMxYTFmMzYpOwogICAgICAgIC0tZmctc29mdDogdmFyKC0tY29sb3ItdGV4dC1zZWNvbmRhcnksICM2OTczODYpOwogICAgICAgIC0tZmctZmFpbnQ6IHZhcigtLWNvbG9yLXRleHQtdGVydGlhcnksICM4NzkyYTIpOwogICAgICAgIC0tbGluZTogdmFyKC0tY29sb3ItYm9yZGVyLXByaW1hcnksICNlM2U4ZWUpOwogICAgICAgIC0tZ29vZDogdmFyKC0tY29sb3ItdGV4dC1zdWNjZXNzLCAjMWE3ZjVhKTsKICAgICAgICAtLWdvb2QtYmc6IHZhcigtLWNvbG9yLWJhY2tncm91bmQtc3VjY2VzcywgI2RkZjNlNCk7CiAgICAgICAgLS1iYWQ6IHZhcigtLWNvbG9yLXRleHQtZGFuZ2VyLCAjYjMyNjFlKTsKICAgICAgICAtLWJhZC1iZzogdmFyKC0tY29sb3ItYmFja2dyb3VuZC1kYW5nZXIsICNmYmU2ZTQpOwogICAgICAgIC0td2FybjogdmFyKC0tY29sb3ItdGV4dC13YXJuaW5nLCAjOGE1YTAwKTsKICAgICAgICAtLXdhcm4tYmc6IHZhcigtLWNvbG9yLWJhY2tncm91bmQtd2FybmluZywgI2ZkZjBkNSk7CiAgICAgICAgLS1ibHVlOiB2YXIoLS1jb2xvci10ZXh0LWFjY2VudCwgIzI1NjNlYik7CiAgICAgICAgLS1saW5rOiB2YXIoLS1jb2xvci10ZXh0LWxpbmssIHZhcigtLWNvbG9yLXRleHQtYWNjZW50LCAjMjU2M2ViKSk7CiAgICAgICAgLS1yYWRpdXM6IHZhcigtLWJvcmRlci1yYWRpdXMtbGcsIDE0cHgpOwogICAgICAgIC0tcmFkaXVzLXNtOiB2YXIoLS1ib3JkZXItcmFkaXVzLXNtLCA5cHgpOwogICAgICAgIC0tZm9udDogdmFyKC0tZm9udC1zYW5zLCBzeXN0ZW0tdWksIC1hcHBsZS1zeXN0ZW0sICdTZWdvZSBVSScsIFJvYm90bywgc2Fucy1zZXJpZik7CiAgICAgICAgLS1tb25vOiB2YXIoLS1mb250LW1vbm8sIHVpLW1vbm9zcGFjZSwgJ1NGIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlKTsKICAgICAgfQogICAgICAqIHsgYm94LXNpemluZzogYm9yZGVyLWJveDsgfQogICAgICBib2R5IHsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgZm9udC1mYW1pbHk6IHZhcigtLWZvbnQpOwogICAgICAgIGNvbG9yOiB2YXIoLS1mZyk7CiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICAgICAgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7CiAgICAgIH0KICAgICAgLmNhcmQgewogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWxpbmUpOwogICAgICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cyk7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tYmcpOwogICAgICAgIGJveC1zaGFkb3c6IDAgMXB4IDJweCByZ2JhKDEwLCAyMCwgNDAsIDAuMDQpLCAwIDJweCA1cHggcmdiYSgxMCwgMjAsIDQwLCAwLjA0KTsKICAgICAgICBtYXgtd2lkdGg6IDQ2MHB4OwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KICAgICAgLmhlYWQgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGJhc2VsaW5lOwogICAgICAgIGdhcDogOHB4OwogICAgICAgIHBhZGRpbmc6IDE1cHggMjBweCAwOwogICAgICB9CiAgICAgIC5oZWFkIC50aXRsZSB7IGZvbnQtc2l6ZTogMTVweDsgZm9udC13ZWlnaHQ6IDY1MDsgfQogICAgICAuaGVhZCAubWVyY2hhbnQgewogICAgICAgIG1hcmdpbi1sZWZ0OiBhdXRvOwogICAgICAgIGZvbnQtZmFtaWx5OiB2YXIoLS1tb25vKTsKICAgICAgICBmb250LXNpemU6IDExcHg7CiAgICAgICAgY29sb3I6IHZhcigtLWZnLXNvZnQpOwogICAgICB9CiAgICAgIC8qIFJlZnJlc2gg4oCUIGFuIG9yZGVycyBjYXJkIGlzIHRoZSBzbmFwc2hvdCBvZiBvbmUgdG9vbCBjYWxsLCBhbmQgYSByZWZ1bmQKICAgICAgICAgc3RhdHVzIGNoYW5nZXMgd2hpbGUgeW91IGFyZSBsb29raW5nIGF0IGl0ICh0aGUgbWVyY2hhbnQgYXBwcm92ZXMsIHRoZW4KICAgICAgICAgdGhlIGdhdGV3YXkgc2lnbmFscyBjb21wbGV0aW9uKS4gV2l0aG91dCB0aGlzIGJ1dHRvbiB0aGUgb25seSB3YXkgdG8KICAgICAgICAgc2VlIHRoZSBuZXcgc3RhdGUgaXMgdG8gZ28gYmFjayB0byB0aGUgY2hhdCBhbmQgYXNrIGZvciB0aGUgbGlzdCBhZ2Fpbi4KICAgICAgICAgT25seSB0aGUgb3JkZXJzIHZpZXcgc2V0cyBvbmUuICovCiAgICAgIC5oZWFkIC5yZWZyZXNoIHsKICAgICAgICBtYXJnaW4tbGVmdDogOHB4OwogICAgICAgIGFsaWduLXNlbGY6IGNlbnRlcjsKICAgICAgICBmbGV4OiBub25lOwogICAgICAgIGRpc3BsYXk6IGdyaWQ7CiAgICAgICAgcGxhY2UtaXRlbXM6IGNlbnRlcjsKICAgICAgICB3aWR0aDogMjRweDsKICAgICAgICBoZWlnaHQ6IDI0cHg7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1saW5lKTsKICAgICAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1iZyk7CiAgICAgICAgY29sb3I6IHZhcigtLWZnLXNvZnQpOwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICB0cmFuc2l0aW9uOiBib3JkZXItY29sb3IgLjEycywgYmFja2dyb3VuZCAuMTJzLCBjb2xvciAuMTJzOwogICAgICB9CiAgICAgIC5oZWFkIC5yZWZyZXNoOmhvdmVyOm5vdCg6ZGlzYWJsZWQpIHsgY29sb3I6IHZhcigtLWZnKTsgYm9yZGVyLWNvbG9yOiB2YXIoLS1mZy1zb2Z0KTsgfQogICAgICAuaGVhZCAucmVmcmVzaDpkaXNhYmxlZCB7IGN1cnNvcjogZGVmYXVsdDsgb3BhY2l0eTogLjY7IH0KICAgICAgLmhlYWQgLnJlZnJlc2hbaGlkZGVuXSB7IGRpc3BsYXk6IG5vbmU7IH0KICAgICAgLmhlYWQgLnJlZnJlc2ggc3ZnIHsgd2lkdGg6IDEzcHg7IGhlaWdodDogMTNweDsgZGlzcGxheTogYmxvY2s7IH0KICAgICAgLyogQSByZWZyZXNoIG1vc3RseSBjb21lcyBiYWNrIGxvb2tpbmcgaWRlbnRpY2FsIOKAlCB3aXRob3V0IHRoZSBzcGluIGl0CiAgICAgICAgIHJlYWRzIGFzIG5vdGhpbmcgaGF2aW5nIGhhcHBlbmVkLCBhbmQgcGVvcGxlIHByZXNzIGl0IGFnYWluLiAqLwogICAgICAuaGVhZCAucmVmcmVzaC5idXN5IHN2ZyB7IGFuaW1hdGlvbjogY20tc3BpbiAuN3MgbGluZWFyIGluZmluaXRlOyB9CiAgICAgIEBrZXlmcmFtZXMgY20tc3BpbiB7IHRvIHsgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTsgfSB9CiAgICAgICNjb250ZW50IHsgcGFkZGluZzogNnB4IDIwcHggMThweDsgfQogICAgICAuaGVybyB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxNTBweDsKICAgICAgICAvKiBjb250YWluLCBub3QgY292ZXI6IGNvdmVyIGZpbGxzIHRoZSBib3ggYnkgQ1VUVElORyB0aGUgcGljdHVyZSwKICAgICAgICAgICBhbmQgb24gYSBwcm9kdWN0IHNob3Qgd2hhdCBpdCBjdXRzIG9mZiBpcyB0aGUgcHJvZHVjdC4gKi8KICAgICAgICBvYmplY3QtZml0OiBjb250YWluOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CiAgICAgICAgbWFyZ2luOiAycHggMCAxMnB4OwogICAgICB9CiAgICAgIC5wcmljZSB7CiAgICAgICAgZm9udC1zaXplOiAyNnB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICAgICAgbGV0dGVyLXNwYWNpbmc6IC0wLjAxZW07CiAgICAgICAgbWFyZ2luOiA2cHggMCAycHg7CiAgICAgIH0KICAgICAgLnN1YiB7IGZvbnQtc2l6ZTogMTIuNXB4OyBjb2xvcjogdmFyKC0tZmctc29mdCk7IG1hcmdpbi1ib3R0b206IDEwcHg7IH0KICAgICAgLyogQSBwYXltZW50IGdyb3VwJ3MgaGVhZGVyLiBObyB0ZXh0LXRyYW5zZm9ybSDigJQgYSBwcm90b2NvbCBuYW1lIGxpa2UKICAgICAgICAgIng0MDIiIGlzIGRlbGliZXJhdGVseSBsb3dlcmNhc2UsIGFuZCB1cHBlcmNhc2luZyBpdCBnaXZlcyAiWDQwMiIuICovCiAgICAgIC5ncm91cC1sYWJlbCB7CiAgICAgICAgZm9udC1zaXplOiAxMXB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgICAgY29sb3I6IHZhcigtLWZnLWZhaW50KTsKICAgICAgICBsZXR0ZXItc3BhY2luZzogMC4wM2VtOwogICAgICAgIG1hcmdpbjogMTRweCAwIDdweDsKICAgICAgfQogICAgICAuZ3JvdXAtbGFiZWw6Zmlyc3Qtb2YtdHlwZSB7IG1hcmdpbi10b3A6IDRweDsgfQogICAgICAvKiBQYXltZW50IHJvd3M6IGEgdGl0bGUgKyBzdWIgb24gdGhlIGxlZnQsIG9uZS1vci1tb3JlIGFjdGlvbiBwaWxscyBvbgogICAgICAgICB0aGUgcmlnaHQgKHRoZSBwcm90b2NvbCBzdWItY2hvaWNlKS4gKi8KICAgICAgLnJvd3MgeyBkaXNwbGF5OiBncmlkOyBnYXA6IDhweDsgfQogICAgICAucm93IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgLyogd3JhcCwgc28gYW4gaW5saW5lIGVycm9yICguby1lcnIsIGZsZXgtYmFzaXM6MTAwJSkgZHJvcHMgdG8gaXRzIG93bgogICAgICAgICAgIGxpbmUgaW5zdGVhZCBvZiBiZWluZyBzcXVlZXplZCBpbiBiZXNpZGUgdGhlIHN0YXR1cyBwaWxsICovCiAgICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgICAgIGdhcDogMTBweDsKICAgICAgICBwYWRkaW5nOiAxMXB4IDE0cHg7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbGluZSk7CiAgICAgICAgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzLXNtKTsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1iZy1zb2Z0KTsKICAgICAgfQogICAgICAucm93LW1haW4geyBkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBnYXA6IDJweDsgbWluLXdpZHRoOiAwOyB9CiAgICAgIC5yLXRpdGxlIHsgZm9udC13ZWlnaHQ6IDYwMDsgZm9udC1zaXplOiAxMy41cHg7IH0KICAgICAgLnItc3ViIHsgY29sb3I6IHZhcigtLWZnLXNvZnQpOyBmb250LXNpemU6IDEycHg7IH0KICAgICAgLyogYWxpZ24taXRlbXM6Y2VudGVyLCBOT1QgdGhlIGRlZmF1bHQgc3RyZXRjaCDigJQgYSBzdHJldGNoZWQgLm9zdGF0IHBpbGwKICAgICAgICAgZ3Jvd3MgdG8gdGhlIG5laWdoYm91cmluZyBidXR0b24ncyBoZWlnaHQgYW5kIHJlYWRzIGFzIGEgdGFsbCBsb3BzaWRlZAogICAgICAgICBvdmFsLCBidXQgb25seSBvbiByb3dzIHRoYXQgSEFWRSBhIGJ1dHRvbiwgd2hpY2ggaXMgd2h5IGl0IGxvb2tlZCBsaWtlCiAgICAgICAgIGEgb25lLXJvdyBnbGl0Y2guICovCiAgICAgIC5yb3ctYWN0cyB7IG1hcmdpbi1sZWZ0OiBhdXRvOyBkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDZweDsgZmxleC1zaHJpbms6IDA7IH0KICAgICAgLmFjdCB7CiAgICAgICAgcGFkZGluZzogN3B4IDEycHg7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbGluZSk7CiAgICAgICAgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tYmcpOwogICAgICAgIGNvbG9yOiB2YXIoLS1mZyk7CiAgICAgICAgZm9udC1mYW1pbHk6IHZhcigtLWZvbnQpOwogICAgICAgIGZvbnQtc2l6ZTogMTIuNXB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1NTA7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgdHJhbnNpdGlvbjogYm9yZGVyLWNvbG9yIC4xMnMsIGJhY2tncm91bmQgLjEycywgY29sb3IgLjEyczsKICAgICAgfQogICAgICAuYWN0OmhvdmVyIHsgYm9yZGVyLWNvbG9yOiB2YXIoLS1ibHVlKTsgY29sb3I6IHZhcigtLWJsdWUpOyB9CiAgICAgIC8qIFRoZSBvbmUgYWN0aW9uIG9uIHRoZSBzY3JlZW4g4oCUIGEgYm9yZGVyZWQgZ2hvc3QgYnV0dG9uIG5leHQgdG8gYSB0ZXh0CiAgICAgICAgIGZpZWxkIHJlYWRzIGFzIG9wdGlvbmFsLCBhbmQgdGhpcyBvbmUgaXMgdGhlIHdob2xlIHBvaW50IG9mIHRoZSBzdGF0ZS4gKi8KICAgICAgLmFjdC5wcmltYXJ5IHsgYmFja2dyb3VuZDogdmFyKC0tYmx1ZSk7IGNvbG9yOiAjZmZmOyBib3JkZXItY29sb3I6IHZhcigtLWJsdWUpOyB9CiAgICAgIC5hY3QucHJpbWFyeTpob3ZlciB7IGNvbG9yOiAjZmZmOyBvcGFjaXR5OiAuOTsgfQogICAgICAuYWN0OmRpc2FibGVkIHsgb3BhY2l0eTogLjU1OyBjdXJzb3I6IGRlZmF1bHQ7IH0KICAgICAgLmFjdC5leHQgeyBjb2xvcjogdmFyKC0tbGluayk7IGJvcmRlci1jb2xvcjogdmFyKC0tbGluayk7IH0KICAgICAgLmFjdC5leHQ6aG92ZXIgeyBiYWNrZ3JvdW5kOiB2YXIoLS1ibHVlKTsgY29sb3I6ICNmZmY7IGJvcmRlci1jb2xvcjogdmFyKC0tYmx1ZSk7IH0KICAgICAgLyogT3JkZXIgc3RhdHVzIHBpbGwgKG9yZGVycyB2aWV3KSAqLwogICAgICAub2xpc3QgeyBtYXJnaW4tdG9wOiAycHg7IH0KICAgICAgLm9zdGF0IHsKICAgICAgICBmb250LXNpemU6IDExcHg7IGZvbnQtd2VpZ2h0OiA2MDA7IHBhZGRpbmc6IDNweCA5cHg7IGJvcmRlci1yYWRpdXM6IDk5OXB4OwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgIH0KICAgICAgLm9zdGF0Lm9rIHsgY29sb3I6IHZhcigtLWdvb2QpOyBiYWNrZ3JvdW5kOiB2YXIoLS1nb29kLWJnKTsgfQogICAgICAub3N0YXQud2FybiB7IGNvbG9yOiB2YXIoLS1iYWQpOyBiYWNrZ3JvdW5kOiB2YXIoLS1iYWQtYmcpOyB9CiAgICAgIC5vc3RhdC5tdXRlZCB7IGNvbG9yOiB2YXIoLS1mZy1zb2Z0KTsgYmFja2dyb3VuZDogdmFyKC0tYmctc29mdCk7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWxpbmUpOyB9CiAgICAgIC8qIFdoeSBhIHJlZnVuZCByZXF1ZXN0IGZhaWxlZCwgb24gdGhlIHJvdyBpdCBiZWxvbmdzIHRvLiBTaWxlbmNlIG1hZGUgdGhlCiAgICAgICAgIGJ1eWVyIHJldHJ5IHNvbWV0aGluZyB0aGF0IGNvdWxkIG5ldmVyIHN1Y2NlZWQuICovCiAgICAgIC5vLWVyciB7CiAgICAgICAgZmxleC1iYXNpczogMTAwJTsgbWFyZ2luLXRvcDogNnB4OyBmb250LXNpemU6IDEycHg7IGxpbmUtaGVpZ2h0OiAxLjQ1OwogICAgICAgIGNvbG9yOiB2YXIoLS1iYWQpOyBiYWNrZ3JvdW5kOiB2YXIoLS1iZy1zb2Z0KTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tbGluZSk7CiAgICAgICAgYm9yZGVyLXJhZGl1czogOHB4OyBwYWRkaW5nOiA3cHggOXB4OyBvdmVyZmxvdy13cmFwOiBhbnl3aGVyZTsKICAgICAgfQogICAgICAvKiBSZXN1bHQgc3RhdGVzICovCiAgICAgIC5yZXN1bHQgeyBwYWRkaW5nOiA0cHggMCAycHg7IH0KICAgICAgLmJhZGdlIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiA2cHg7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OyBmb250LXdlaWdodDogNjAwOyBwYWRkaW5nOiA0cHggMTBweDsgYm9yZGVyLXJhZGl1czogOTk5cHg7CiAgICAgIH0KICAgICAgLmJhZGdlLm9rIHsgY29sb3I6IHZhcigtLWdvb2QpOyBiYWNrZ3JvdW5kOiB2YXIoLS1nb29kLWJnKTsgfQogICAgICAuYmFkZ2UuZXJyIHsgY29sb3I6IHZhcigtLWJhZCk7IGJhY2tncm91bmQ6IHZhcigtLWJhZC1iZyk7IH0KICAgICAgLyogTmVpdGhlciBzdWNjZXNzIG5vciBmYWlsdXJlOiBzb21ldGhpbmcgdGhlIHBlcnNvbiBzdGlsbCBoYXMgdG8gZG8uIFJlZAogICAgICAgICB3b3VsZCB0ZWxsIHRoZW0gdGhlIHBheW1lbnQgYnJva2UsIGFuZCBpdCBkaWQgbm90IOKAlCBub3RoaW5nIHdhcwogICAgICAgICBjaGFyZ2VkLCBwcmljZWQsIG9yIGV2ZW4gYXR0ZW1wdGVkLiAqLwogICAgICAuYmFkZ2UudG9kbyB7IGNvbG9yOiB2YXIoLS13YXJuKTsgYmFja2dyb3VuZDogdmFyKC0td2Fybi1iZyk7IH0KICAgICAgLmxvZ2lucm93IHsgZGlzcGxheTogZmxleDsgZ2FwOiA4cHg7IG1hcmdpbjogMTJweCAwIDRweDsgZmxleC13cmFwOiB3cmFwOyBhbGlnbi1pdGVtczogY2VudGVyOyB9CiAgICAgIC5lcnItbGluZSB7IGNvbG9yOiB2YXIoLS1iYWQpOyBmb250LXNpemU6IDEzcHg7IG1hcmdpbi10b3A6IDZweDsgfQogICAgICAvKiBTaG93biBzbyB0aGUgcGVyc29uIGNhbiBjaGVjayBpdCBhZ2FpbnN0IHRoZSBicm93c2VyIHBhZ2Ug4oCUIHRoZSBjb2RlIGlzCiAgICAgICAgIGEgY29uZmlybWF0aW9uLCBub3QgYSBzZWNyZXQsIGFuZCBpdCBpcyB3aGF0IHN0b3BzIGEgbGluayBzZW50IGJ5CiAgICAgICAgIHNvbWVvbmUgZWxzZSBmcm9tIGJlaW5nIGFwcHJvdmVkIHNpbGVudGx5LiAqLwogICAgICAudWNvZGUgeyBmb250OiA2MDAgMTNweCB2YXIoLS1tb25vKTsgbGV0dGVyLXNwYWNpbmc6IC4wOGVtOyBjb2xvcjogdmFyKC0tZmctc29mdCk7CiAgICAgICAgICAgICAgIHBhZGRpbmc6IDhweCAxMXB4OyBib3JkZXI6IDFweCBkYXNoZWQgdmFyKC0tbGluZSk7IGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1zbSk7IH0KICAgICAgLndhaXRpbmcgeyBjb2xvcjogdmFyKC0tZmctZmFpbnQpOyBmb250LXNpemU6IDEyLjVweDsgbWFyZ2luLXRvcDogMTBweDsgfQogICAgICAucmVzdWx0IC5saW5lIHsgZm9udC1zaXplOiAxM3B4OyBtYXJnaW46IDEycHggMCA0cHg7IGxpbmUtaGVpZ2h0OiAxLjU7IH0KICAgICAgLnJlc3VsdCAubW9ubyB7IGZvbnQtZmFtaWx5OiB2YXIoLS1tb25vKTsgZm9udC1zaXplOiAxMS41cHg7IGNvbG9yOiB2YXIoLS1mZy1zb2Z0KTsgd29yZC1icmVhazogYnJlYWstYWxsOyB9CiAgICAgIC5yZXN1bHQgYS50eCwgLnJlc3VsdCAudHggeyBjb2xvcjogdmFyKC0tbGluayk7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgY3Vyc29yOiBwb2ludGVyOyB9CiAgICAgIC8qIFRoZSBjYXRhbG9ndWUgbGluayB1bmRlciBhIGNoZWNrb3V0LiBTY29wZWQgYC5yZXN1bHQgYnV0dG9uLmJhY2tgCiAgICAgICAgIGJlbG93IHN0eWxlcyB0aGUgb25lIGluc2lkZSBhIFJFU1VMVDsgdGhpcyBvbmUgc2l0cyB1bmRlciB0aGUgcGF5bWVudAogICAgICAgICByb3dzLCB3aGVyZSBhIGJvcmRlcmVkIGJveCBjb21wZXRlcyB3aXRoIHRoZSB0aGluZyBpdCBzaXRzIGJlbmVhdGgg4oCUCiAgICAgICAgIHRoZSBidXR0b25zIHRoYXQgYWN0dWFsbHkgdGFrZSBtb25leS4gQSBxdWlldCB0ZXh0IGxpbmsgaW5zdGVhZC4gKi8KICAgICAgYnV0dG9uLmJhY2sgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIG1hcmdpbjogMTRweCBhdXRvIDJweDsKICAgICAgICBwYWRkaW5nOiA0cHggMnB4OwogICAgICAgIGJvcmRlcjogMDsKICAgICAgICBiYWNrZ3JvdW5kOiBub25lOwogICAgICAgIGNvbG9yOiB2YXIoLS1mZy1mYWludCk7CiAgICAgICAgZm9udDogaW5oZXJpdDsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICB9CiAgICAgIGJ1dHRvbi5iYWNrOmhvdmVyIHsgY29sb3I6IHZhcigtLWZnLXNvZnQpOyB9CiAgICAgIC5yZXN1bHQgYnV0dG9uLmJhY2sgewogICAgICAgIG1hcmdpbi10b3A6IDE0cHg7IHBhZGRpbmc6IDhweCAxNHB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1saW5lKTsKICAgICAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtc20pOyBiYWNrZ3JvdW5kOiB2YXIoLS1iZy1zb2Z0KTsgY29sb3I6IHZhcigtLWZnLXNvZnQpOwogICAgICAgIGZvbnQtc2l6ZTogMTJweDsgY3Vyc29yOiBwb2ludGVyOwogICAgICB9CiAgICAgIC8qIFByaW1hcnkgZm9yd2FyZCBDVEEgYWZ0ZXIgYSBzdWNjZXNzZnVsIG9yZGVyIOKGkiB2aWV3IG9yZGVycyAqLwogICAgICAucmVzdWx0IGJ1dHRvbi5nbyB7CiAgICAgICAgbWFyZ2luLXRvcDogMTRweDsgcGFkZGluZzogOXB4IDE2cHg7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJsdWUpOwogICAgICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1zbSk7IGJhY2tncm91bmQ6IHZhcigtLWJsdWUpOyBjb2xvcjogI2ZmZjsKICAgICAgICBmb250LXNpemU6IDEyLjVweDsgZm9udC13ZWlnaHQ6IDYwMDsgY3Vyc29yOiBwb2ludGVyOwogICAgICB9CiAgICAgIC5yZXN1bHQgYnV0dG9uLmdvOmhvdmVyIHsgZmlsdGVyOiBicmlnaHRuZXNzKDAuOTYpOyB9CiAgICAgIC8qIFJlY2VpcHQgQ1RBcyBzaWRlIGJ5IHNpZGUuIENhbmNlbHMgdGhlIGJ1dHRvbnMnIG93biBtYXJnaW4tdG9wIHNvIHRoZQogICAgICAgICByb3cgYWxpZ25zLiAqLwogICAgICAucmVzdWx0IC5jdGEtcm93IHsgZGlzcGxheTogZmxleDsgZ2FwOiAxMHB4OyBhbGlnbi1pdGVtczogc3RyZXRjaDsgZmxleC13cmFwOiB3cmFwOyB9CiAgICAgIC5yZXN1bHQgLmN0YS1yb3cgYnV0dG9uIHsgbWFyZ2luLXRvcDogMTRweDsgfQogICAgICAvKiBBIHNlY29uZGFyeSBzaXR0aW5nIE5FWFQgVE8gYSBwcmltYXJ5IGhhcyB0byBzaGFyZSB0aGUgcHJpbWFyeSdzIGJveCDigJQKICAgICAgICAgc2FtZSBwYWRkaW5nLCBzYW1lIHNpemUsIHNhbWUgd2VpZ2h0LiBgLmJhY2tgIGlzIHR1bmVkIGZvciBzdGFuZGluZwogICAgICAgICBhbG9uZSBhdCB0aGUgYm90dG9tIG9mIGEgdmlldyAoc21hbGxlciwgcXVpZXRlcik7IHJldXNlZCBpbiBhIHBhaXIgaXQKICAgICAgICAgY2FtZSBvdXQgc2hvcnRlciBhbmQgbGlnaHRlciB0aGFuIHRoZSBidXR0b24gYmVzaWRlIGl0LCB3aGljaCByZWFkcyBhcwogICAgICAgICBhbiB1bmZpbmlzaGVkIGNvbnRyb2wgcmF0aGVyIHRoYW4gdGhlIG90aGVyIGhhbGYgb2YgYSBjaG9pY2UuIE9ubHkgdGhlCiAgICAgICAgIGNvbG91ciBzZXBhcmF0ZXMgdGhlbS4gKi8KICAgICAgLnJlc3VsdCAuY3RhLXJvdyBidXR0b24uYmFjayB7CiAgICAgICAgcGFkZGluZzogOXB4IDE2cHg7CiAgICAgICAgZm9udC1zaXplOiAxMi41cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1saW5lKTsKICAgICAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtc20pOwogICAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgICAgIGNvbG9yOiB2YXIoLS1mZy1zb2Z0KTsKICAgICAgfQogICAgICAucmVzdWx0IC5jdGEtcm93IGJ1dHRvbi5iYWNrOmhvdmVyIHsgYm9yZGVyLWNvbG9yOiB2YXIoLS1ibHVlKTsgY29sb3I6IHZhcigtLWJsdWUpOyB9CiAgICAgIC5lbXB0eSB7IGNvbG9yOiB2YXIoLS1mZy1mYWludCk7IGZvbnQtc2l6ZTogMTNweDsgcGFkZGluZzogMTRweCAwOyB9CiAgICAgIC5zcGluIHsgY29sb3I6IHZhcigtLWZnLXNvZnQpOyBmb250LXNpemU6IDEzcHg7IHBhZGRpbmc6IDEwcHggMDsgfQogICAgICAvKiBUaGUgcHJvZHVjdCBncmlkLiBDb2x1bW4gY291bnQgaXMgbGVmdCB0byBhdXRvLWZpdCDigJQgdGhlIGNhcmQgaXMgYSB2ZXJ5CiAgICAgICAgIGRpZmZlcmVudCB3aWR0aCBpbiBkaWZmZXJlbnQgaG9zdHMsIGFuZCBhIGhhcmQtY29kZWQgMyBvdmVyZmxvd3MKICAgICAgICAgc2lkZXdheXMgaW4gYSBuYXJyb3cgb25lLiAqLwogICAgICAucGdyaWQgewogICAgICAgIGRpc3BsYXk6IGdyaWQ7CiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoYXV0by1maXQsIG1pbm1heCgxMTJweCwgMWZyKSk7CiAgICAgICAgZ2FwOiAxMHB4OwogICAgICAgIHBhZGRpbmc6IDEycHggMCA0cHg7CiAgICAgIH0KICAgICAgLnBjZWxsIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgZ2FwOiA2cHg7CiAgICAgICAgcGFkZGluZzogMTBweDsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1saW5lKTsKICAgICAgICBib3JkZXItcmFkaXVzOiAxMHB4OwogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLWJnKTsKICAgICAgICBtaW4td2lkdGg6IDA7CiAgICAgIH0KICAgICAgLnBjZWxsIC5waW1nIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDc2cHg7CiAgICAgICAgb2JqZWN0LWZpdDogY29udGFpbjsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1iZy1zb2Z0KTsKICAgICAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICAgIH0KICAgICAgLnBjZWxsIC5waW1nLm5vbmUgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICBmb250LXNpemU6IDEwLjVweDsKICAgICAgICBsZXR0ZXItc3BhY2luZzogMC4wNGVtOwogICAgICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICAgICAgY29sb3I6IHZhcigtLWZnLWZhaW50KTsKICAgICAgfQogICAgICAucGNlbGwgLnBuYW1lIHsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDU2MDsKICAgICAgICBsaW5lLWhlaWdodDogMS4zNTsKICAgICAgICAvKiBOYW1lcyBkaWZmZXIgaW4gbGVuZ3RoOyB1bmNsYW1wZWQgdGhleSBzdHJldGNoIGVhY2ggY2VsbCB0byBpdHMgb3duCiAgICAgICAgICAgaGVpZ2h0LiAqLwogICAgICAgIGRpc3BsYXk6IC13ZWJraXQtYm94OwogICAgICAgIC13ZWJraXQtbGluZS1jbGFtcDogMjsKICAgICAgICAtd2Via2l0LWJveC1vcmllbnQ6IHZlcnRpY2FsOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KICAgICAgLnBjZWxsIC5wbWV0YSB7IGZvbnQtc2l6ZTogMTFweDsgbWFyZ2luLXRvcDogYXV0bzsgY29sb3I6IHZhcigtLWZnLXNvZnQpOyBmb250LWZhbWlseTogdmFyKC0tbW9ubyk7IH0KICAgICAgLnBjZWxsIC5wYnV5IHsgd2lkdGg6IDEwMCU7IHBhZGRpbmc6IDVweCAwOyB9CiAgICA8L3N0eWxlPgogICAgPHNjcmlwdCB0eXBlPSJtb2R1bGUiIGNyb3Nzb3JpZ2luPihmdW5jdGlvbigpe2NvbnN0IG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgibGluayIpLnJlbExpc3Q7aWYobiYmbi5zdXBwb3J0cyYmbi5zdXBwb3J0cygibW9kdWxlcHJlbG9hZCIpKXJldHVybjtmb3IoY29uc3QgZSBvZiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdsaW5rW3JlbD0ibW9kdWxlcHJlbG9hZCJdJykpbyhlKTtuZXcgTXV0YXRpb25PYnNlcnZlcihlPT57Zm9yKGNvbnN0IGkgb2YgZSlpZihpLnR5cGU9PT0iY2hpbGRMaXN0Iilmb3IoY29uc3QgYSBvZiBpLmFkZGVkTm9kZXMpYS50YWdOYW1lPT09IkxJTksiJiZhLnJlbD09PSJtb2R1bGVwcmVsb2FkIiYmbyhhKX0pLm9ic2VydmUoZG9jdW1lbnQse2NoaWxkTGlzdDohMCxzdWJ0cmVlOiEwfSk7ZnVuY3Rpb24gcihlKXtjb25zdCBpPXt9O3JldHVybiBlLmludGVncml0eSYmKGkuaW50ZWdyaXR5PWUuaW50ZWdyaXR5KSxlLnJlZmVycmVyUG9saWN5JiYoaS5yZWZlcnJlclBvbGljeT1lLnJlZmVycmVyUG9saWN5KSxlLmNyb3NzT3JpZ2luPT09InVzZS1jcmVkZW50aWFscyI/aS5jcmVkZW50aWFscz0iaW5jbHVkZSI6ZS5jcm9zc09yaWdpbj09PSJhbm9ueW1vdXMiP2kuY3JlZGVudGlhbHM9Im9taXQiOmkuY3JlZGVudGlhbHM9InNhbWUtb3JpZ2luIixpfWZ1bmN0aW9uIG8oZSl7aWYoZS5lcClyZXR1cm47ZS5lcD0hMDtjb25zdCBpPXIoZSk7ZmV0Y2goZS5ocmVmLGkpfX0pKCk7Y29uc3QgUm09Im1vZHVsZXByZWxvYWQiLENtPWZ1bmN0aW9uKHQsbil7cmV0dXJuIG5ldyBVUkwodCxuKS5ocmVmfSxwcz17fSxBbT1mdW5jdGlvbihuLHIsbyl7bGV0IGU9UHJvbWlzZS5yZXNvbHZlKCk7aWYociYmci5sZW5ndGg+MCl7bGV0IGE9ZnVuY3Rpb24obCl7cmV0dXJuIFByb21pc2UuYWxsKGwubWFwKGc9PlByb21pc2UucmVzb2x2ZShnKS50aGVuKHY9Pih7c3RhdHVzOiJmdWxmaWxsZWQiLHZhbHVlOnZ9KSx2PT4oe3N0YXR1czoicmVqZWN0ZWQiLHJlYXNvbjp2fSkpKSl9O2NvbnN0IHM9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImxpbmsiKSxjPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIm1ldGFbcHJvcGVydHk9Y3NwLW5vbmNlXSIpLHU9Yz8ubm9uY2V8fGM/LmdldEF0dHJpYnV0ZSgibm9uY2UiKTtlPWEoci5tYXAobD0+e2lmKGw9Q20obCxvKSxsIGluIHBzKXJldHVybjtwc1tsXT0hMDtjb25zdCBnPWwuZW5kc1dpdGgoIi5jc3MiKSx2PWc/J1tyZWw9InN0eWxlc2hlZXQiXSc6IiI7aWYoISFvKWZvcihsZXQgSD1zLmxlbmd0aC0xO0g+PTA7SC0tKXtjb25zdCBMPXNbSF07aWYoTC5ocmVmPT09bCYmKCFnfHxMLnJlbD09PSJzdHlsZXNoZWV0IikpcmV0dXJufWVsc2UgaWYoZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgbGlua1tocmVmPSIke2x9Il0ke3Z9YCkpcmV0dXJuO2NvbnN0IHk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgibGluayIpO2lmKHkucmVsPWc/InN0eWxlc2hlZXQiOlJtLGd8fCh5LmFzPSJzY3JpcHQiKSx5LmNyb3NzT3JpZ2luPSIiLHkuaHJlZj1sLHUmJnkuc2V0QXR0cmlidXRlKCJub25jZSIsdSksZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZCh5KSxnKXJldHVybiBuZXcgUHJvbWlzZSgoSCxMKT0+e3kuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsSCkseS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsKCk9PkwobmV3IEVycm9yKGBVbmFibGUgdG8gcHJlbG9hZCBDU1MgZm9yICR7bH1gKSkpfSl9KSl9ZnVuY3Rpb24gaShhKXtjb25zdCBzPW5ldyBFdmVudCgidml0ZTpwcmVsb2FkRXJyb3IiLHtjYW5jZWxhYmxlOiEwfSk7aWYocy5wYXlsb2FkPWEsd2luZG93LmRpc3BhdGNoRXZlbnQocyksIXMuZGVmYXVsdFByZXZlbnRlZCl0aHJvdyBhfXJldHVybiBlLnRoZW4oYT0+e2Zvcihjb25zdCBzIG9mIGF8fFtdKXMuc3RhdHVzPT09InJlamVjdGVkIiYmaShzLnJlYXNvbik7cmV0dXJuIG4oKS5jYXRjaChpKX0pfTt2YXIgZnM7Y29uc3QgZmk9T2JqZWN0LmZyZWV6ZSh7c3RhdHVzOiJhYm9ydGVkIn0pO2Z1bmN0aW9uIGQodCxuLHIpe2Z1bmN0aW9uIG8ocyxjKXtpZihzLl96b2R8fE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzLCJfem9kIix7dmFsdWU6e2RlZjpjLGNvbnN0cjphLHRyYWl0czpuZXcgU2V0fSxlbnVtZXJhYmxlOiExfSkscy5fem9kLnRyYWl0cy5oYXModCkpcmV0dXJuO3MuX3pvZC50cmFpdHMuYWRkKHQpLG4ocyxjKTtjb25zdCB1PWEucHJvdG90eXBlLGw9T2JqZWN0LmtleXModSk7Zm9yKGxldCBnPTA7ZzxsLmxlbmd0aDtnKyspe2NvbnN0IHY9bFtnXTt2IGluIHN8fChzW3ZdPXVbdl0uYmluZChzKSl9fWNvbnN0IGU9cj8uUGFyZW50Pz9PYmplY3Q7Y2xhc3MgaSBleHRlbmRzIGV7fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShpLCJuYW1lIix7dmFsdWU6dH0pO2Z1bmN0aW9uIGEocyl7dmFyIGM7Y29uc3QgdT1yPy5QYXJlbnQ/bmV3IGk6dGhpcztvKHUscyksKGM9dS5fem9kKS5kZWZlcnJlZD8/KGMuZGVmZXJyZWQ9W10pO2Zvcihjb25zdCBsIG9mIHUuX3pvZC5kZWZlcnJlZClsKCk7cmV0dXJuIHV9cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLCJpbml0Iix7dmFsdWU6b30pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLFN5bWJvbC5oYXNJbnN0YW5jZSx7dmFsdWU6cz0+cj8uUGFyZW50JiZzIGluc3RhbmNlb2Ygci5QYXJlbnQ/ITA6cz8uX3pvZD8udHJhaXRzPy5oYXModCl9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoYSwibmFtZSIse3ZhbHVlOnR9KSxhfWNvbnN0IGdpPVN5bWJvbCgiem9kX2JyYW5kIik7Y2xhc3MgTmUgZXh0ZW5kcyBFcnJvcntjb25zdHJ1Y3Rvcigpe3N1cGVyKCJFbmNvdW50ZXJlZCBQcm9taXNlIGR1cmluZyBzeW5jaHJvbm91cyBwYXJzZS4gVXNlIC5wYXJzZUFzeW5jKCkgaW5zdGVhZC4iKX19Y2xhc3MgV24gZXh0ZW5kcyBFcnJvcntjb25zdHJ1Y3RvcihuKXtzdXBlcihgRW5jb3VudGVyZWQgdW5pZGlyZWN0aW9uYWwgdHJhbnNmb3JtIGR1cmluZyBlbmNvZGU6ICR7bn1gKSx0aGlzLm5hbWU9IlpvZEVuY29kZUVycm9yIn19KGZzPWdsb2JhbFRoaXMpLl9fem9kX2dsb2JhbENvbmZpZz8/KGZzLl9fem9kX2dsb2JhbENvbmZpZz17fSk7Y29uc3Qga3Q9Z2xvYmFsVGhpcy5fX3pvZF9nbG9iYWxDb25maWc7ZnVuY3Rpb24gSyh0KXtyZXR1cm4gdCYmT2JqZWN0LmFzc2lnbihrdCx0KSxrdH1mdW5jdGlvbiBMbSh0KXtyZXR1cm4gdH1mdW5jdGlvbiBNbSh0KXtyZXR1cm4gdH1mdW5jdGlvbiBxbSh0KXt9ZnVuY3Rpb24gRm0odCl7dGhyb3cgbmV3IEVycm9yKCJVbmV4cGVjdGVkIHZhbHVlIGluIGV4aGF1c3RpdmUgY2hlY2siKX1mdW5jdGlvbiBKbSh0KXt9ZnVuY3Rpb24gdmkodCl7Y29uc3Qgbj1PYmplY3QudmFsdWVzKHQpLmZpbHRlcihvPT50eXBlb2Ygbz09Im51bWJlciIpO3JldHVybiBPYmplY3QuZW50cmllcyh0KS5maWx0ZXIoKFtvLGVdKT0+bi5pbmRleE9mKCtvKT09PS0xKS5tYXAoKFtvLGVdKT0+ZSl9ZnVuY3Rpb24gXyh0LG49InwiKXtyZXR1cm4gdC5tYXAocj0+UyhyKSkuam9pbihuKX1mdW5jdGlvbiBSbih0LG4pe3JldHVybiB0eXBlb2Ygbj09ImJpZ2ludCI/bi50b1N0cmluZygpOm59ZnVuY3Rpb24gVHQodCl7cmV0dXJue2dldCB2YWx1ZSgpe3tjb25zdCBuPXQoKTtyZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsInZhbHVlIix7dmFsdWU6bn0pLG59fX19ZnVuY3Rpb24gQWUodCl7cmV0dXJuIHQ9PW51bGx9ZnVuY3Rpb24gQm4odCl7Y29uc3Qgbj10LnN0YXJ0c1dpdGgoIl4iKT8xOjAscj10LmVuZHNXaXRoKCIkIik/dC5sZW5ndGgtMTp0Lmxlbmd0aDtyZXR1cm4gdC5zbGljZShuLHIpfWZ1bmN0aW9uIFdzKHQsbil7Y29uc3Qgcj10L24sbz1NYXRoLnJvdW5kKHIpLGU9TnVtYmVyLkVQU0lMT04qTWF0aC5tYXgoTWF0aC5hYnMociksMSk7cmV0dXJuIE1hdGguYWJzKHItbyk8ZT8wOnItb31jb25zdCBncz1TeW1ib2woImV2YWx1YXRpbmciKTtmdW5jdGlvbiBPKHQsbixyKXtsZXQgbztPYmplY3QuZGVmaW5lUHJvcGVydHkodCxuLHtnZXQoKXtpZihvIT09Z3MpcmV0dXJuIG89PT12b2lkIDAmJihvPWdzLG89cigpKSxvfSxzZXQoZSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsbix7dmFsdWU6ZX0pfSxjb25maWd1cmFibGU6ITB9KX1mdW5jdGlvbiBIbSh0KXtyZXR1cm4gT2JqZWN0LmNyZWF0ZShPYmplY3QuZ2V0UHJvdG90eXBlT2YodCksT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnModCkpfWZ1bmN0aW9uIHhlKHQsbixyKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxuLHt2YWx1ZTpyLHdyaXRhYmxlOiEwLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSl9ZnVuY3Rpb24gJGUoLi4udCl7Y29uc3Qgbj17fTtmb3IoY29uc3QgciBvZiB0KXtjb25zdCBvPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHIpO09iamVjdC5hc3NpZ24obixvKX1yZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoe30sbil9ZnVuY3Rpb24gV20odCl7cmV0dXJuICRlKHQuX3pvZC5kZWYpfWZ1bmN0aW9uIEJtKHQsbil7cmV0dXJuIG4/bi5yZWR1Y2UoKHIsbyk9PnI/LltvXSx0KTp0fWZ1bmN0aW9uIFZtKHQpe2NvbnN0IG49T2JqZWN0LmtleXModCkscj1uLm1hcChvPT50W29dKTtyZXR1cm4gUHJvbWlzZS5hbGwocikudGhlbihvPT57Y29uc3QgZT17fTtmb3IobGV0IGk9MDtpPG4ubGVuZ3RoO2krKyllW25baV1dPW9baV07cmV0dXJuIGV9KX1mdW5jdGlvbiBLbSh0PTEwKXtjb25zdCBuPSJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiI7bGV0IHI9IiI7Zm9yKGxldCBvPTA7bzx0O28rKylyKz1uW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpuLmxlbmd0aCldO3JldHVybiByfWZ1bmN0aW9uIHNpKHQpe3JldHVybiBKU09OLnN0cmluZ2lmeSh0KX1mdW5jdGlvbiBCcyh0KXtyZXR1cm4gdC50b0xvd2VyQ2FzZSgpLnRyaW0oKS5yZXBsYWNlKC9bXlx3XHMtXS9nLCIiKS5yZXBsYWNlKC9bXHNfLV0rL2csIi0iKS5yZXBsYWNlKC9eLSt8LSskL2csIiIpfWNvbnN0IGhpPSJjYXB0dXJlU3RhY2tUcmFjZSJpbiBFcnJvcj9FcnJvci5jYXB0dXJlU3RhY2tUcmFjZTooLi4udCk9Pnt9O2Z1bmN0aW9uIEhlKHQpe3JldHVybiB0eXBlb2YgdD09Im9iamVjdCImJnQhPT1udWxsJiYhQXJyYXkuaXNBcnJheSh0KX1jb25zdCBWcz1UdCgoKT0+e2lmKGt0LmppdGxlc3N8fHR5cGVvZiBuYXZpZ2F0b3I8InUiJiZuYXZpZ2F0b3I/LnVzZXJBZ2VudD8uaW5jbHVkZXMoIkNsb3VkZmxhcmUiKSlyZXR1cm4hMTt0cnl7Y29uc3QgdD1GdW5jdGlvbjtyZXR1cm4gbmV3IHQoIiIpLCEwfWNhdGNoe3JldHVybiExfX0pO2Z1bmN0aW9uIERlKHQpe2lmKEhlKHQpPT09ITEpcmV0dXJuITE7Y29uc3Qgbj10LmNvbnN0cnVjdG9yO2lmKG49PT12b2lkIDB8fHR5cGVvZiBuIT0iZnVuY3Rpb24iKXJldHVybiEwO2NvbnN0IHI9bi5wcm90b3R5cGU7cmV0dXJuIShIZShyKT09PSExfHxPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwociwiaXNQcm90b3R5cGVPZiIpPT09ITEpfWZ1bmN0aW9uIFZuKHQpe3JldHVybiBEZSh0KT97Li4udH06QXJyYXkuaXNBcnJheSh0KT9bLi4udF06dCBpbnN0YW5jZW9mIE1hcD9uZXcgTWFwKHQpOnQgaW5zdGFuY2VvZiBTZXQ/bmV3IFNldCh0KTp0fWZ1bmN0aW9uIEdtKHQpe2xldCBuPTA7Zm9yKGNvbnN0IHIgaW4gdClPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxyKSYmbisrO3JldHVybiBufWNvbnN0IFhtPXQ9Pntjb25zdCBuPXR5cGVvZiB0O3N3aXRjaChuKXtjYXNlInVuZGVmaW5lZCI6cmV0dXJuInVuZGVmaW5lZCI7Y2FzZSJzdHJpbmciOnJldHVybiJzdHJpbmciO2Nhc2UibnVtYmVyIjpyZXR1cm4gTnVtYmVyLmlzTmFOKHQpPyJuYW4iOiJudW1iZXIiO2Nhc2UiYm9vbGVhbiI6cmV0dXJuImJvb2xlYW4iO2Nhc2UiZnVuY3Rpb24iOnJldHVybiJmdW5jdGlvbiI7Y2FzZSJiaWdpbnQiOnJldHVybiJiaWdpbnQiO2Nhc2Uic3ltYm9sIjpyZXR1cm4ic3ltYm9sIjtjYXNlIm9iamVjdCI6cmV0dXJuIEFycmF5LmlzQXJyYXkodCk/ImFycmF5Ijp0PT09bnVsbD8ibnVsbCI6dC50aGVuJiZ0eXBlb2YgdC50aGVuPT0iZnVuY3Rpb24iJiZ0LmNhdGNoJiZ0eXBlb2YgdC5jYXRjaD09ImZ1bmN0aW9uIj8icHJvbWlzZSI6dHlwZW9mIE1hcDwidSImJnQgaW5zdGFuY2VvZiBNYXA/Im1hcCI6dHlwZW9mIFNldDwidSImJnQgaW5zdGFuY2VvZiBTZXQ/InNldCI6dHlwZW9mIERhdGU8InUiJiZ0IGluc3RhbmNlb2YgRGF0ZT8iZGF0ZSI6dHlwZW9mIEZpbGU8InUiJiZ0IGluc3RhbmNlb2YgRmlsZT8iZmlsZSI6Im9iamVjdCI7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gZGF0YSB0eXBlOiAke259YCl9fSxDbj1uZXcgU2V0KFsic3RyaW5nIiwibnVtYmVyIiwic3ltYm9sIl0pLEtzPW5ldyBTZXQoWyJzdHJpbmciLCJudW1iZXIiLCJiaWdpbnQiLCJib29sZWFuIiwic3ltYm9sIiwidW5kZWZpbmVkIl0pO2Z1bmN0aW9uIGJlKHQpe3JldHVybiB0LnJlcGxhY2UoL1suKis/XiR7fSgpfFtcXVxcXS9nLCJcXCQmIil9ZnVuY3Rpb24gZGUodCxuLHIpe2NvbnN0IG89bmV3IHQuX3pvZC5jb25zdHIobj8/dC5fem9kLmRlZik7cmV0dXJuKCFufHxyPy5wYXJlbnQpJiYoby5fem9kLnBhcmVudD10KSxvfWZ1bmN0aW9uIGgodCl7Y29uc3Qgbj10O2lmKCFuKXJldHVybnt9O2lmKHR5cGVvZiBuPT0ic3RyaW5nIilyZXR1cm57ZXJyb3I6KCk9Pm59O2lmKG4/Lm1lc3NhZ2UhPT12b2lkIDApe2lmKG4/LmVycm9yIT09dm9pZCAwKXRocm93IG5ldyBFcnJvcigiQ2Fubm90IHNwZWNpZnkgYm90aCBgbWVzc2FnZWAgYW5kIGBlcnJvcmAgcGFyYW1zIik7bi5lcnJvcj1uLm1lc3NhZ2V9cmV0dXJuIGRlbGV0ZSBuLm1lc3NhZ2UsdHlwZW9mIG4uZXJyb3I9PSJzdHJpbmciP3suLi5uLGVycm9yOigpPT5uLmVycm9yfTpufWZ1bmN0aW9uIFltKHQpe2xldCBuO3JldHVybiBuZXcgUHJveHkoe30se2dldChyLG8sZSl7cmV0dXJuIG4/PyhuPXQoKSksUmVmbGVjdC5nZXQobixvLGUpfSxzZXQocixvLGUsaSl7cmV0dXJuIG4/PyhuPXQoKSksUmVmbGVjdC5zZXQobixvLGUsaSl9LGhhcyhyLG8pe3JldHVybiBuPz8obj10KCkpLFJlZmxlY3QuaGFzKG4sbyl9LGRlbGV0ZVByb3BlcnR5KHIsbyl7cmV0dXJuIG4/PyhuPXQoKSksUmVmbGVjdC5kZWxldGVQcm9wZXJ0eShuLG8pfSxvd25LZXlzKHIpe3JldHVybiBuPz8obj10KCkpLFJlZmxlY3Qub3duS2V5cyhuKX0sZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHIsbyl7cmV0dXJuIG4/PyhuPXQoKSksUmVmbGVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobixvKX0sZGVmaW5lUHJvcGVydHkocixvLGUpe3JldHVybiBuPz8obj10KCkpLFJlZmxlY3QuZGVmaW5lUHJvcGVydHkobixvLGUpfX0pfWZ1bmN0aW9uIFModCl7cmV0dXJuIHR5cGVvZiB0PT0iYmlnaW50Ij90LnRvU3RyaW5nKCkrIm4iOnR5cGVvZiB0PT0ic3RyaW5nIj9gIiR7dH0iYDpgJHt0fWB9ZnVuY3Rpb24gR3ModCl7cmV0dXJuIE9iamVjdC5rZXlzKHQpLmZpbHRlcihuPT50W25dLl96b2Qub3B0aW49PT0ib3B0aW9uYWwiJiZ0W25dLl96b2Qub3B0b3V0PT09Im9wdGlvbmFsIil9Y29uc3QgWHM9e3NhZmVpbnQ6W051bWJlci5NSU5fU0FGRV9JTlRFR0VSLE51bWJlci5NQVhfU0FGRV9JTlRFR0VSXSxpbnQzMjpbLTIxNDc0ODM2NDgsMjE0NzQ4MzY0N10sdWludDMyOlswLDQyOTQ5NjcyOTVdLGZsb2F0MzI6Wy0zNDAyODIzNDY2Mzg1Mjg4NmUyMiwzNDAyODIzNDY2Mzg1Mjg4NmUyMl0sZmxvYXQ2NDpbLU51bWJlci5NQVhfVkFMVUUsTnVtYmVyLk1BWF9WQUxVRV19LFlzPXtpbnQ2NDpbQmlnSW50KCItOTIyMzM3MjAzNjg1NDc3NTgwOCIpLEJpZ0ludCgiOTIyMzM3MjAzNjg1NDc3NTgwNyIpXSx1aW50NjQ6W0JpZ0ludCgwKSxCaWdJbnQoIjE4NDQ2NzQ0MDczNzA5NTUxNjE1IildfTtmdW5jdGlvbiBRcyh0LG4pe2NvbnN0IHI9dC5fem9kLmRlZixvPXIuY2hlY2tzO2lmKG8mJm8ubGVuZ3RoPjApdGhyb3cgbmV3IEVycm9yKCIucGljaygpIGNhbm5vdCBiZSB1c2VkIG9uIG9iamVjdCBzY2hlbWFzIGNvbnRhaW5pbmcgcmVmaW5lbWVudHMiKTtjb25zdCBpPSRlKHQuX3pvZC5kZWYse2dldCBzaGFwZSgpe2NvbnN0IGE9e307Zm9yKGNvbnN0IHMgaW4gbil7aWYoIShzIGluIHIuc2hhcGUpKXRocm93IG5ldyBFcnJvcihgVW5yZWNvZ25pemVkIGtleTogIiR7c30iYCk7bltzXSYmKGFbc109ci5zaGFwZVtzXSl9cmV0dXJuIHhlKHRoaXMsInNoYXBlIixhKSxhfSxjaGVja3M6W119KTtyZXR1cm4gZGUodCxpKX1mdW5jdGlvbiBlYyh0LG4pe2NvbnN0IHI9dC5fem9kLmRlZixvPXIuY2hlY2tzO2lmKG8mJm8ubGVuZ3RoPjApdGhyb3cgbmV3IEVycm9yKCIub21pdCgpIGNhbm5vdCBiZSB1c2VkIG9uIG9iamVjdCBzY2hlbWFzIGNvbnRhaW5pbmcgcmVmaW5lbWVudHMiKTtjb25zdCBpPSRlKHQuX3pvZC5kZWYse2dldCBzaGFwZSgpe2NvbnN0IGE9ey4uLnQuX3pvZC5kZWYuc2hhcGV9O2Zvcihjb25zdCBzIGluIG4pe2lmKCEocyBpbiByLnNoYXBlKSl0aHJvdyBuZXcgRXJyb3IoYFVucmVjb2duaXplZCBrZXk6ICIke3N9ImApO25bc10mJmRlbGV0ZSBhW3NdfXJldHVybiB4ZSh0aGlzLCJzaGFwZSIsYSksYX0sY2hlY2tzOltdfSk7cmV0dXJuIGRlKHQsaSl9ZnVuY3Rpb24gdGModCxuKXtpZighRGUobikpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGlucHV0IHRvIGV4dGVuZDogZXhwZWN0ZWQgYSBwbGFpbiBvYmplY3QiKTtjb25zdCByPXQuX3pvZC5kZWYuY2hlY2tzO2lmKHImJnIubGVuZ3RoPjApe2NvbnN0IGk9dC5fem9kLmRlZi5zaGFwZTtmb3IoY29uc3QgYSBpbiBuKWlmKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoaSxhKSE9PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBvdmVyd3JpdGUga2V5cyBvbiBvYmplY3Qgc2NoZW1hcyBjb250YWluaW5nIHJlZmluZW1lbnRzLiBVc2UgYC5zYWZlRXh0ZW5kKClgIGluc3RlYWQuIil9Y29uc3QgZT0kZSh0Ll96b2QuZGVmLHtnZXQgc2hhcGUoKXtjb25zdCBpPXsuLi50Ll96b2QuZGVmLnNoYXBlLC4uLm59O3JldHVybiB4ZSh0aGlzLCJzaGFwZSIsaSksaX19KTtyZXR1cm4gZGUodCxlKX1mdW5jdGlvbiBuYyh0LG4pe2lmKCFEZShuKSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgaW5wdXQgdG8gc2FmZUV4dGVuZDogZXhwZWN0ZWQgYSBwbGFpbiBvYmplY3QiKTtjb25zdCByPSRlKHQuX3pvZC5kZWYse2dldCBzaGFwZSgpe2NvbnN0IG89ey4uLnQuX3pvZC5kZWYuc2hhcGUsLi4ubn07cmV0dXJuIHhlKHRoaXMsInNoYXBlIixvKSxvfX0pO3JldHVybiBkZSh0LHIpfWZ1bmN0aW9uIHJjKHQsbil7aWYodC5fem9kLmRlZi5jaGVja3M/Lmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIi5tZXJnZSgpIGNhbm5vdCBiZSB1c2VkIG9uIG9iamVjdCBzY2hlbWFzIGNvbnRhaW5pbmcgcmVmaW5lbWVudHMuIFVzZSAuc2FmZUV4dGVuZCgpIGluc3RlYWQuIik7Y29uc3Qgcj0kZSh0Ll96b2QuZGVmLHtnZXQgc2hhcGUoKXtjb25zdCBvPXsuLi50Ll96b2QuZGVmLnNoYXBlLC4uLm4uX3pvZC5kZWYuc2hhcGV9O3JldHVybiB4ZSh0aGlzLCJzaGFwZSIsbyksb30sZ2V0IGNhdGNoYWxsKCl7cmV0dXJuIG4uX3pvZC5kZWYuY2F0Y2hhbGx9LGNoZWNrczpuLl96b2QuZGVmLmNoZWNrcz8/W119KTtyZXR1cm4gZGUodCxyKX1mdW5jdGlvbiBpYyh0LG4scil7Y29uc3QgZT1uLl96b2QuZGVmLmNoZWNrcztpZihlJiZlLmxlbmd0aD4wKXRocm93IG5ldyBFcnJvcigiLnBhcnRpYWwoKSBjYW5ub3QgYmUgdXNlZCBvbiBvYmplY3Qgc2NoZW1hcyBjb250YWluaW5nIHJlZmluZW1lbnRzIik7Y29uc3QgYT0kZShuLl96b2QuZGVmLHtnZXQgc2hhcGUoKXtjb25zdCBzPW4uX3pvZC5kZWYuc2hhcGUsYz17Li4uc307aWYocilmb3IoY29uc3QgdSBpbiByKXtpZighKHUgaW4gcykpdGhyb3cgbmV3IEVycm9yKGBVbnJlY29nbml6ZWQga2V5OiAiJHt1fSJgKTtyW3VdJiYoY1t1XT10P25ldyB0KHt0eXBlOiJvcHRpb25hbCIsaW5uZXJUeXBlOnNbdV19KTpzW3VdKX1lbHNlIGZvcihjb25zdCB1IGluIHMpY1t1XT10P25ldyB0KHt0eXBlOiJvcHRpb25hbCIsaW5uZXJUeXBlOnNbdV19KTpzW3VdO3JldHVybiB4ZSh0aGlzLCJzaGFwZSIsYyksY30sY2hlY2tzOltdfSk7cmV0dXJuIGRlKG4sYSl9ZnVuY3Rpb24gb2ModCxuLHIpe2NvbnN0IG89JGUobi5fem9kLmRlZix7Z2V0IHNoYXBlKCl7Y29uc3QgZT1uLl96b2QuZGVmLnNoYXBlLGk9ey4uLmV9O2lmKHIpZm9yKGNvbnN0IGEgaW4gcil7aWYoIShhIGluIGkpKXRocm93IG5ldyBFcnJvcihgVW5yZWNvZ25pemVkIGtleTogIiR7YX0iYCk7clthXSYmKGlbYV09bmV3IHQoe3R5cGU6Im5vbm9wdGlvbmFsIixpbm5lclR5cGU6ZVthXX0pKX1lbHNlIGZvcihjb25zdCBhIGluIGUpaVthXT1uZXcgdCh7dHlwZToibm9ub3B0aW9uYWwiLGlubmVyVHlwZTplW2FdfSk7cmV0dXJuIHhlKHRoaXMsInNoYXBlIixpKSxpfX0pO3JldHVybiBkZShuLG8pfWZ1bmN0aW9uIFBlKHQsbj0wKXtpZih0LmFib3J0ZWQ9PT0hMClyZXR1cm4hMDtmb3IobGV0IHI9bjtyPHQuaXNzdWVzLmxlbmd0aDtyKyspaWYodC5pc3N1ZXNbcl0/LmNvbnRpbnVlIT09ITApcmV0dXJuITA7cmV0dXJuITF9ZnVuY3Rpb24gYWModCxuPTApe2lmKHQuYWJvcnRlZD09PSEwKXJldHVybiEwO2ZvcihsZXQgcj1uO3I8dC5pc3N1ZXMubGVuZ3RoO3IrKylpZih0Lmlzc3Vlc1tyXT8uY29udGludWU9PT0hMSlyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBmZSh0LG4pe3JldHVybiBuLm1hcChyPT57dmFyIG87cmV0dXJuKG89cikucGF0aD8/KG8ucGF0aD1bXSksci5wYXRoLnVuc2hpZnQodCkscn0pfWZ1bmN0aW9uICR0KHQpe3JldHVybiB0eXBlb2YgdD09InN0cmluZyI/dDp0Py5tZXNzYWdlfWZ1bmN0aW9uIGxlKHQsbixyKXtjb25zdCBvPXQubWVzc2FnZT90Lm1lc3NhZ2U6JHQodC5pbnN0Py5fem9kLmRlZj8uZXJyb3I/Lih0KSk/PyR0KG4/LmVycm9yPy4odCkpPz8kdChyLmN1c3RvbUVycm9yPy4odCkpPz8kdChyLmxvY2FsZUVycm9yPy4odCkpPz8iSW52YWxpZCBpbnB1dCIse2luc3Q6ZSxjb250aW51ZTppLGlucHV0OmEsLi4uc309dDtyZXR1cm4gcy5wYXRoPz8ocy5wYXRoPVtdKSxzLm1lc3NhZ2U9byxuPy5yZXBvcnRJbnB1dCYmKHMuaW5wdXQ9YSksc31mdW5jdGlvbiBLbih0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIFNldD8ic2V0Ijp0IGluc3RhbmNlb2YgTWFwPyJtYXAiOnQgaW5zdGFuY2VvZiBGaWxlPyJmaWxlIjoidW5rbm93biJ9ZnVuY3Rpb24gR24odCl7cmV0dXJuIEFycmF5LmlzQXJyYXkodCk/ImFycmF5Ijp0eXBlb2YgdD09InN0cmluZyI/InN0cmluZyI6InVua25vd24ifWZ1bmN0aW9uIHcodCl7Y29uc3Qgbj10eXBlb2YgdDtzd2l0Y2gobil7Y2FzZSJudW1iZXIiOnJldHVybiBOdW1iZXIuaXNOYU4odCk/Im5hbiI6Im51bWJlciI7Y2FzZSJvYmplY3QiOntpZih0PT09bnVsbClyZXR1cm4ibnVsbCI7aWYoQXJyYXkuaXNBcnJheSh0KSlyZXR1cm4iYXJyYXkiO2NvbnN0IHI9dDtpZihyJiZPYmplY3QuZ2V0UHJvdG90eXBlT2YocikhPT1PYmplY3QucHJvdG90eXBlJiYiY29uc3RydWN0b3IiaW4gciYmci5jb25zdHJ1Y3RvcilyZXR1cm4gci5jb25zdHJ1Y3Rvci5uYW1lfX1yZXR1cm4gbn1mdW5jdGlvbiBXZSguLi50KXtjb25zdFtuLHIsb109dDtyZXR1cm4gdHlwZW9mIG49PSJzdHJpbmciP3ttZXNzYWdlOm4sY29kZToiY3VzdG9tIixpbnB1dDpyLGluc3Q6b306ey4uLm59fWZ1bmN0aW9uIFFtKHQpe3JldHVybiBPYmplY3QuZW50cmllcyh0KS5maWx0ZXIoKFtuLHJdKT0+TnVtYmVyLmlzTmFOKE51bWJlci5wYXJzZUludChuLDEwKSkpLm1hcChuPT5uWzFdKX1mdW5jdGlvbiBzYyh0KXtjb25zdCBuPWF0b2IodCkscj1uZXcgVWludDhBcnJheShuLmxlbmd0aCk7Zm9yKGxldCBvPTA7bzxuLmxlbmd0aDtvKyspcltvXT1uLmNoYXJDb2RlQXQobyk7cmV0dXJuIHJ9ZnVuY3Rpb24gY2ModCl7bGV0IG49IiI7Zm9yKGxldCByPTA7cjx0Lmxlbmd0aDtyKyspbis9U3RyaW5nLmZyb21DaGFyQ29kZSh0W3JdKTtyZXR1cm4gYnRvYShuKX1mdW5jdGlvbiBlcCh0KXtjb25zdCBuPXQucmVwbGFjZSgvLS9nLCIrIikucmVwbGFjZSgvXy9nLCIvIikscj0iPSIucmVwZWF0KCg0LW4ubGVuZ3RoJTQpJTQpO3JldHVybiBzYyhuK3IpfWZ1bmN0aW9uIHRwKHQpe3JldHVybiBjYyh0KS5yZXBsYWNlKC9cKy9nLCItIikucmVwbGFjZSgvXC8vZywiXyIpLnJlcGxhY2UoLz0vZywiIil9ZnVuY3Rpb24gbnAodCl7Y29uc3Qgbj10LnJlcGxhY2UoL14weC8sIiIpO2lmKG4ubGVuZ3RoJTIhPT0wKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBoZXggc3RyaW5nIGxlbmd0aCIpO2NvbnN0IHI9bmV3IFVpbnQ4QXJyYXkobi5sZW5ndGgvMik7Zm9yKGxldCBvPTA7bzxuLmxlbmd0aDtvKz0yKXJbby8yXT1OdW1iZXIucGFyc2VJbnQobi5zbGljZShvLG8rMiksMTYpO3JldHVybiByfWZ1bmN0aW9uIHJwKHQpe3JldHVybiBBcnJheS5mcm9tKHQpLm1hcChuPT5uLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCIwIikpLmpvaW4oIiIpfWNsYXNzIGlwe2NvbnN0cnVjdG9yKC4uLm4pe319Y29uc3QgJGk9T2JqZWN0LmZyZWV6ZShPYmplY3QuZGVmaW5lUHJvcGVydHkoe19fcHJvdG9fXzpudWxsLEJJR0lOVF9GT1JNQVRfUkFOR0VTOllzLENsYXNzOmlwLE5VTUJFUl9GT1JNQVRfUkFOR0VTOlhzLGFib3J0ZWQ6UGUsYWxsb3dzRXZhbDpWcyxhc3NlcnQ6Sm0sYXNzZXJ0RXF1YWw6TG0sYXNzZXJ0SXM6cW0sYXNzZXJ0TmV2ZXI6Rm0sYXNzZXJ0Tm90RXF1YWw6TW0sYXNzaWduUHJvcDp4ZSxiYXNlNjRUb1VpbnQ4QXJyYXk6c2MsYmFzZTY0dXJsVG9VaW50OEFycmF5OmVwLGNhY2hlZDpUdCxjYXB0dXJlU3RhY2tUcmFjZTpoaSxjbGVhbkVudW06UW0sY2xlYW5SZWdleDpCbixjbG9uZTpkZSxjbG9uZURlZjpXbSxjcmVhdGVUcmFuc3BhcmVudFByb3h5OlltLGRlZmluZUxhenk6Tyxlc2M6c2ksZXNjYXBlUmVnZXg6YmUsZXhwbGljaXRseUFib3J0ZWQ6YWMsZXh0ZW5kOnRjLGZpbmFsaXplSXNzdWU6bGUsZmxvYXRTYWZlUmVtYWluZGVyOldzLGdldEVsZW1lbnRBdFBhdGg6Qm0sZ2V0RW51bVZhbHVlczp2aSxnZXRMZW5ndGhhYmxlT3JpZ2luOkduLGdldFBhcnNlZFR5cGU6WG0sZ2V0U2l6YWJsZU9yaWdpbjpLbixoZXhUb1VpbnQ4QXJyYXk6bnAsaXNPYmplY3Q6SGUsaXNQbGFpbk9iamVjdDpEZSxpc3N1ZTpXZSxqb2luVmFsdWVzOl8sanNvblN0cmluZ2lmeVJlcGxhY2VyOlJuLG1lcmdlOnJjLG1lcmdlRGVmczokZSxub3JtYWxpemVQYXJhbXM6aCxudWxsaXNoOkFlLG51bUtleXM6R20sb2JqZWN0Q2xvbmU6SG0sb21pdDplYyxvcHRpb25hbEtleXM6R3MscGFyc2VkVHlwZTp3LHBhcnRpYWw6aWMscGljazpRcyxwcmVmaXhJc3N1ZXM6ZmUscHJpbWl0aXZlVHlwZXM6S3MscHJvbWlzZUFsbE9iamVjdDpWbSxwcm9wZXJ0eUtleVR5cGVzOkNuLHJhbmRvbVN0cmluZzpLbSxyZXF1aXJlZDpvYyxzYWZlRXh0ZW5kOm5jLHNoYWxsb3dDbG9uZTpWbixzbHVnaWZ5OkJzLHN0cmluZ2lmeVByaW1pdGl2ZTpTLHVpbnQ4QXJyYXlUb0Jhc2U2NDpjYyx1aW50OEFycmF5VG9CYXNlNjR1cmw6dHAsdWludDhBcnJheVRvSGV4OnJwLHVud3JhcE1lc3NhZ2U6JHR9LFN5bWJvbC50b1N0cmluZ1RhZyx7dmFsdWU6Ik1vZHVsZSJ9KSksdWM9KHQsbik9Pnt0Lm5hbWU9IiRab2RFcnJvciIsT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl96b2QiLHt2YWx1ZTp0Ll96b2QsZW51bWVyYWJsZTohMX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJpc3N1ZXMiLHt2YWx1ZTpuLGVudW1lcmFibGU6ITF9KSx0Lm1lc3NhZ2U9SlNPTi5zdHJpbmdpZnkobixSbiwyKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCwidG9TdHJpbmciLHt2YWx1ZTooKT0+dC5tZXNzYWdlLGVudW1lcmFibGU6ITF9KX0sX2k9ZCgiJFpvZEVycm9yIix1YyksbWU9ZCgiJFpvZEVycm9yIix1Yyx7UGFyZW50OkVycm9yfSk7ZnVuY3Rpb24gWG4odCxuPXI9PnIubWVzc2FnZSl7Y29uc3Qgcj17fSxvPVtdO2Zvcihjb25zdCBlIG9mIHQuaXNzdWVzKWUucGF0aC5sZW5ndGg+MD8ocltlLnBhdGhbMF1dPXJbZS5wYXRoWzBdXXx8W10scltlLnBhdGhbMF1dLnB1c2gobihlKSkpOm8ucHVzaChuKGUpKTtyZXR1cm57Zm9ybUVycm9yczpvLGZpZWxkRXJyb3JzOnJ9fWZ1bmN0aW9uIFluKHQsbj1yPT5yLm1lc3NhZ2Upe2NvbnN0IHI9e19lcnJvcnM6W119LG89KGUsaT1bXSk9Pntmb3IoY29uc3QgYSBvZiBlLmlzc3VlcylpZihhLmNvZGU9PT0iaW52YWxpZF91bmlvbiImJmEuZXJyb3JzLmxlbmd0aClhLmVycm9ycy5tYXAocz0+byh7aXNzdWVzOnN9LFsuLi5pLC4uLmEucGF0aF0pKTtlbHNlIGlmKGEuY29kZT09PSJpbnZhbGlkX2tleSIpbyh7aXNzdWVzOmEuaXNzdWVzfSxbLi4uaSwuLi5hLnBhdGhdKTtlbHNlIGlmKGEuY29kZT09PSJpbnZhbGlkX2VsZW1lbnQiKW8oe2lzc3VlczphLmlzc3Vlc30sWy4uLmksLi4uYS5wYXRoXSk7ZWxzZXtjb25zdCBzPVsuLi5pLC4uLmEucGF0aF07aWYocy5sZW5ndGg9PT0wKXIuX2Vycm9ycy5wdXNoKG4oYSkpO2Vsc2V7bGV0IGM9cix1PTA7Zm9yKDt1PHMubGVuZ3RoOyl7Y29uc3QgbD1zW3VdO3U9PT1zLmxlbmd0aC0xPyhjW2xdPWNbbF18fHtfZXJyb3JzOltdfSxjW2xdLl9lcnJvcnMucHVzaChuKGEpKSk6Y1tsXT1jW2xdfHx7X2Vycm9yczpbXX0sYz1jW2xdLHUrK319fX07cmV0dXJuIG8odCkscn1mdW5jdGlvbiBiaSh0LG49cj0+ci5tZXNzYWdlKXtjb25zdCByPXtlcnJvcnM6W119LG89KGUsaT1bXSk9Pnt2YXIgYSxzO2Zvcihjb25zdCBjIG9mIGUuaXNzdWVzKWlmKGMuY29kZT09PSJpbnZhbGlkX3VuaW9uIiYmYy5lcnJvcnMubGVuZ3RoKWMuZXJyb3JzLm1hcCh1PT5vKHtpc3N1ZXM6dX0sWy4uLmksLi4uYy5wYXRoXSkpO2Vsc2UgaWYoYy5jb2RlPT09ImludmFsaWRfa2V5IilvKHtpc3N1ZXM6Yy5pc3N1ZXN9LFsuLi5pLC4uLmMucGF0aF0pO2Vsc2UgaWYoYy5jb2RlPT09ImludmFsaWRfZWxlbWVudCIpbyh7aXNzdWVzOmMuaXNzdWVzfSxbLi4uaSwuLi5jLnBhdGhdKTtlbHNle2NvbnN0IHU9Wy4uLmksLi4uYy5wYXRoXTtpZih1Lmxlbmd0aD09PTApe3IuZXJyb3JzLnB1c2gobihjKSk7Y29udGludWV9bGV0IGw9cixnPTA7Zm9yKDtnPHUubGVuZ3RoOyl7Y29uc3Qgdj11W2ddLCQ9Zz09PXUubGVuZ3RoLTE7dHlwZW9mIHY9PSJzdHJpbmciPyhsLnByb3BlcnRpZXM/PyhsLnByb3BlcnRpZXM9e30pLChhPWwucHJvcGVydGllcylbdl0/PyhhW3ZdPXtlcnJvcnM6W119KSxsPWwucHJvcGVydGllc1t2XSk6KGwuaXRlbXM/PyhsLml0ZW1zPVtdKSwocz1sLml0ZW1zKVt2XT8/KHNbdl09e2Vycm9yczpbXX0pLGw9bC5pdGVtc1t2XSksJCYmbC5lcnJvcnMucHVzaChuKGMpKSxnKyt9fX07cmV0dXJuIG8odCkscn1mdW5jdGlvbiBsYyh0KXtjb25zdCBuPVtdLHI9dC5tYXAobz0+dHlwZW9mIG89PSJvYmplY3QiP28ua2V5Om8pO2Zvcihjb25zdCBvIG9mIHIpdHlwZW9mIG89PSJudW1iZXIiP24ucHVzaChgWyR7b31dYCk6dHlwZW9mIG89PSJzeW1ib2wiP24ucHVzaChgWyR7SlNPTi5zdHJpbmdpZnkoU3RyaW5nKG8pKX1dYCk6L1teXHckXS8udGVzdChvKT9uLnB1c2goYFske0pTT04uc3RyaW5naWZ5KG8pfV1gKToobi5sZW5ndGgmJm4ucHVzaCgiLiIpLG4ucHVzaChvKSk7cmV0dXJuIG4uam9pbigiIil9ZnVuY3Rpb24geWkodCl7Y29uc3Qgbj1bXSxyPVsuLi50Lmlzc3Vlc10uc29ydCgobyxlKT0+KG8ucGF0aD8/W10pLmxlbmd0aC0oZS5wYXRoPz9bXSkubGVuZ3RoKTtmb3IoY29uc3QgbyBvZiByKW4ucHVzaChg4pyWICR7by5tZXNzYWdlfWApLG8ucGF0aD8ubGVuZ3RoJiZuLnB1c2goYCAg4oaSIGF0ICR7bGMoby5wYXRoKX1gKTtyZXR1cm4gbi5qb2luKGAKYCl9Y29uc3QganQ9dD0+KG4scixvLGUpPT57Y29uc3QgaT1vP3suLi5vLGFzeW5jOiExfTp7YXN5bmM6ITF9LGE9bi5fem9kLnJ1bih7dmFsdWU6cixpc3N1ZXM6W119LGkpO2lmKGEgaW5zdGFuY2VvZiBQcm9taXNlKXRocm93IG5ldyBOZTtpZihhLmlzc3Vlcy5sZW5ndGgpe2NvbnN0IHM9bmV3KGU/LkVycj8/dCkoYS5pc3N1ZXMubWFwKGM9PmxlKGMsaSxLKCkpKSk7dGhyb3cgaGkocyxlPy5jYWxsZWUpLHN9cmV0dXJuIGEudmFsdWV9LGNpPWp0KG1lKSxPdD10PT5hc3luYyhuLHIsbyxlKT0+e2NvbnN0IGk9bz97Li4ubyxhc3luYzohMH06e2FzeW5jOiEwfTtsZXQgYT1uLl96b2QucnVuKHt2YWx1ZTpyLGlzc3VlczpbXX0saSk7aWYoYSBpbnN0YW5jZW9mIFByb21pc2UmJihhPWF3YWl0IGEpLGEuaXNzdWVzLmxlbmd0aCl7Y29uc3Qgcz1uZXcoZT8uRXJyPz90KShhLmlzc3Vlcy5tYXAoYz0+bGUoYyxpLEsoKSkpKTt0aHJvdyBoaShzLGU/LmNhbGxlZSksc31yZXR1cm4gYS52YWx1ZX0sdWk9T3QobWUpLFV0PXQ9PihuLHIsbyk9Pntjb25zdCBlPW8/ey4uLm8sYXN5bmM6ITF9Onthc3luYzohMX0saT1uLl96b2QucnVuKHt2YWx1ZTpyLGlzc3VlczpbXX0sZSk7aWYoaSBpbnN0YW5jZW9mIFByb21pc2UpdGhyb3cgbmV3IE5lO3JldHVybiBpLmlzc3Vlcy5sZW5ndGg/e3N1Y2Nlc3M6ITEsZXJyb3I6bmV3KHQ/P19pKShpLmlzc3Vlcy5tYXAoYT0+bGUoYSxlLEsoKSkpKX06e3N1Y2Nlc3M6ITAsZGF0YTppLnZhbHVlfX0sa2k9VXQobWUpLFB0PXQ9PmFzeW5jKG4scixvKT0+e2NvbnN0IGU9bz97Li4ubyxhc3luYzohMH06e2FzeW5jOiEwfTtsZXQgaT1uLl96b2QucnVuKHt2YWx1ZTpyLGlzc3VlczpbXX0sZSk7cmV0dXJuIGkgaW5zdGFuY2VvZiBQcm9taXNlJiYoaT1hd2FpdCBpKSxpLmlzc3Vlcy5sZW5ndGg/e3N1Y2Nlc3M6ITEsZXJyb3I6bmV3IHQoaS5pc3N1ZXMubWFwKGE9PmxlKGEsZSxLKCkpKSl9OntzdWNjZXNzOiEwLGRhdGE6aS52YWx1ZX19LGRjPVB0KG1lKSxTaT10PT4obixyLG8pPT57Y29uc3QgZT1vP3suLi5vLGRpcmVjdGlvbjoiYmFja3dhcmQifTp7ZGlyZWN0aW9uOiJiYWNrd2FyZCJ9O3JldHVybiBqdCh0KShuLHIsZSl9LG9wPVNpKG1lKSx3aT10PT4obixyLG8pPT5qdCh0KShuLHIsbyksYXA9d2kobWUpLElpPXQ9PmFzeW5jKG4scixvKT0+e2NvbnN0IGU9bz97Li4ubyxkaXJlY3Rpb246ImJhY2t3YXJkIn06e2RpcmVjdGlvbjoiYmFja3dhcmQifTtyZXR1cm4gT3QodCkobixyLGUpfSxzcD1JaShtZSksemk9dD0+YXN5bmMobixyLG8pPT5PdCh0KShuLHIsbyksY3A9emkobWUpLHhpPXQ9PihuLHIsbyk9Pntjb25zdCBlPW8/ey4uLm8sZGlyZWN0aW9uOiJiYWNrd2FyZCJ9OntkaXJlY3Rpb246ImJhY2t3YXJkIn07cmV0dXJuIFV0KHQpKG4scixlKX0sdXA9eGkobWUpLFRpPXQ9PihuLHIsbyk9PlV0KHQpKG4scixvKSxscD1UaShtZSksamk9dD0+YXN5bmMobixyLG8pPT57Y29uc3QgZT1vP3suLi5vLGRpcmVjdGlvbjoiYmFja3dhcmQifTp7ZGlyZWN0aW9uOiJiYWNrd2FyZCJ9O3JldHVybiBQdCh0KShuLHIsZSl9LGRwPWppKG1lKSxPaT10PT5hc3luYyhuLHIsbyk9PlB0KHQpKG4scixvKSxtcD1PaShtZSksbWM9L15bY0NdWzAtOWEtel17Nix9JC8scGM9L15bMC05YS16XSskLyxmYz0vXlswLTlBLUhKS01OUC1UVi1aYS1oamttbnAtdHYtel17MjZ9JC8sZ2M9L15bMC05YS12QS1WXXsyMH0kLyx2Yz0vXltBLVphLXowLTldezI3fSQvLGhjPS9eW2EtekEtWjAtOV8tXXsyMX0kLywkYz0vXlAoPzooXGQrVyl8KD8hLipXKSg/PVxkfFRcZCkoXGQrWSk/KFxkK00pPyhcZCtEKT8oVCg/PVxkKShcZCtIKT8oXGQrTSk/KFxkKyhbLixdXGQrKT9TKT8pPykkLyxwcD0vXlstK10/UCg/ISQpKD86KD86Wy0rXT9cZCtZKXwoPzpbLStdP1xkK1suLF1cZCtZJCkpPyg/Oig/OlstK10/XGQrTSl8KD86Wy0rXT9cZCtbLixdXGQrTSQpKT8oPzooPzpbLStdP1xkK1cpfCg/OlstK10/XGQrWy4sXVxkK1ckKSk/KD86KD86Wy0rXT9cZCtEKXwoPzpbLStdP1xkK1suLF1cZCtEJCkpPyg/OlQoPz1bXGQrLV0pKD86KD86Wy0rXT9cZCtIKXwoPzpbLStdP1xkK1suLF1cZCtIJCkpPyg/Oig/OlstK10/XGQrTSl8KD86Wy0rXT9cZCtbLixdXGQrTSQpKT8oPzpbLStdP1xkKyg/OlsuLF1cZCspP1MpPyk/PyQvLF9jPS9eKFswLTlhLWZBLUZdezh9LVswLTlhLWZBLUZdezR9LVswLTlhLWZBLUZdezR9LVswLTlhLWZBLUZdezR9LVswLTlhLWZBLUZdezEyfSkkLyxCZT10PT50P25ldyBSZWdFeHAoYF4oWzAtOWEtZkEtRl17OH0tWzAtOWEtZkEtRl17NH0tJHt0fVswLTlhLWZBLUZdezN9LVs4OWFiQUJdWzAtOWEtZkEtRl17M30tWzAtOWEtZkEtRl17MTJ9KSRgKTovXihbMC05YS1mQS1GXXs4fS1bMC05YS1mQS1GXXs0fS1bMS04XVswLTlhLWZBLUZdezN9LVs4OWFiQUJdWzAtOWEtZkEtRl17M30tWzAtOWEtZkEtRl17MTJ9fDAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMHxmZmZmZmZmZi1mZmZmLWZmZmYtZmZmZi1mZmZmZmZmZmZmZmYpJC8sZnA9QmUoNCksZ3A9QmUoNiksdnA9QmUoNyksYmM9L14oPyFcLikoPyEuKlwuXC4pKFtBLVphLXowLTlfJytcLVwuXSopW0EtWmEtejAtOV8rLV1AKFtBLVphLXowLTldW0EtWmEtejAtOVwtXSpcLikrW0EtWmEtel17Mix9JC8saHA9L15bYS16QS1aMC05LiEjJCUmJyorLz0/Xl9ge3x9fi1dK0BbYS16QS1aMC05XSg/OlthLXpBLVowLTktXXswLDYxfVthLXpBLVowLTldKT8oPzpcLlthLXpBLVowLTldKD86W2EtekEtWjAtOS1dezAsNjF9W2EtekEtWjAtOV0pPykqJC8sJHA9L14oKFtePD4oKVxbXF1cXC4sOzpcc0AiXSsoXC5bXjw+KClcW1xdXFwuLDs6XHNAIl0rKSopfCgiLisiKSlAKChcW1swLTldezEsM31cLlswLTldezEsM31cLlswLTldezEsM31cLlswLTldezEsM31dKXwoKFthLXpBLVpcLTAtOV0rXC4pK1thLXpBLVpdezIsfSkpJC8seWM9L15bXlxzQCJdezEsNjR9QFteXHNAXXsxLDI1NX0kL3UsX3A9eWMsYnA9L15bYS16QS1aMC05LiEjJCUmJyorLz0/Xl9ge3x9fi1dK0BbYS16QS1aMC05XSg/OlthLXpBLVowLTktXXswLDYxfVthLXpBLVowLTldKT8oPzpcLlthLXpBLVowLTldKD86W2EtekEtWjAtOS1dezAsNjF9W2EtekEtWjAtOV0pPykqJC8seXA9Il4oXFxwe0V4dGVuZGVkX1BpY3RvZ3JhcGhpY318XFxwe0Vtb2ppX0NvbXBvbmVudH0pKyQiO2Z1bmN0aW9uIGtjKCl7cmV0dXJuIG5ldyBSZWdFeHAoeXAsInUiKX1jb25zdCBTYz0vXig/Oig/OjI1WzAtNV18MlswLTRdWzAtOV18MVswLTldWzAtOV18WzEtOV1bMC05XXxbMC05XSlcLil7M30oPzoyNVswLTVdfDJbMC00XVswLTldfDFbMC05XVswLTldfFsxLTldWzAtOV18WzAtOV0pJC8sd2M9L14oKFswLTlhLWZBLUZdezEsNH06KXs3fVswLTlhLWZBLUZdezEsNH18KFswLTlhLWZBLUZdezEsNH06KXsxLDd9OnwoWzAtOWEtZkEtRl17MSw0fTopezEsNn06WzAtOWEtZkEtRl17MSw0fXwoWzAtOWEtZkEtRl17MSw0fTopezEsNX0oOlswLTlhLWZBLUZdezEsNH0pezEsMn18KFswLTlhLWZBLUZdezEsNH06KXsxLDR9KDpbMC05YS1mQS1GXXsxLDR9KXsxLDN9fChbMC05YS1mQS1GXXsxLDR9Oil7MSwzfSg6WzAtOWEtZkEtRl17MSw0fSl7MSw0fXwoWzAtOWEtZkEtRl17MSw0fTopezEsMn0oOlswLTlhLWZBLUZdezEsNH0pezEsNX18WzAtOWEtZkEtRl17MSw0fTooKDpbMC05YS1mQS1GXXsxLDR9KXsxLDZ9KXw6KCg6WzAtOWEtZkEtRl17MSw0fSl7MSw3fXw6KSkkLyxJYz10PT57Y29uc3Qgbj1iZSh0Pz8iOiIpO3JldHVybiBuZXcgUmVnRXhwKGBeKD86WzAtOUEtRl17Mn0ke259KXs1fVswLTlBLUZdezJ9JHxeKD86WzAtOWEtZl17Mn0ke259KXs1fVswLTlhLWZdezJ9JGApfSx6Yz0vXigoMjVbMC01XXwyWzAtNF1bMC05XXwxWzAtOV1bMC05XXxbMS05XVswLTldfFswLTldKVwuKXszfSgyNVswLTVdfDJbMC00XVswLTldfDFbMC05XVswLTldfFsxLTldWzAtOV18WzAtOV0pXC8oWzAtOV18WzEtMl1bMC05XXwzWzAtMl0pJC8seGM9L14oKFswLTlhLWZBLUZdezEsNH06KXs3fVswLTlhLWZBLUZdezEsNH18Ojp8KFswLTlhLWZBLUZdezEsNH0pPzo6KFswLTlhLWZBLUZdezEsNH06Pyl7MCw2fSlcLygxMlswLThdfDFbMDFdWzAtOV18WzEtOV0/WzAtOV0pJC8sVGM9L14kfF4oPzpbMC05YS16QS1aKy9dezR9KSooPzooPzpbMC05YS16QS1aKy9dezJ9PT0pfCg/OlswLTlhLXpBLVorL117M309KSk/JC8sVWk9L15bQS1aYS16MC05Xy1dKiQvLGpjPS9eKD89LnsxLDI1M31cLj8kKVthLXpBLVowLTldKD86W2EtekEtWjAtOS1dezAsNjF9W2EtekEtWjAtOV0pPyg/OlwuW2EtekEtWjAtOV0oPzpbLTAtOWEtekEtWl17MCw2MX1bMC05YS16QS1aXSk/KSpcLj8kLyxPYz0vXihbYS16QS1aMC05XSg/OlthLXpBLVowLTktXXswLDYxfVthLXpBLVowLTldKT9cLikrW2EtekEtWl17Mix9JC8sUGk9L15odHRwcz8kLyxVYz0vXlwrWzEtOV1cZHs2LDE0fSQvLFBjPSIoPzooPzpcXGRcXGRbMjQ2OF1bMDQ4XXxcXGRcXGRbMTM1NzldWzI2XXxcXGRcXGQwWzQ4XXxbMDI0NjhdWzA0OF0wMHxbMTM1NzldWzI2XTAwKS0wMi0yOXxcXGR7NH0tKD86KD86MFsxMzU3OF18MVswMl0pLSg/OjBbMS05XXxbMTJdXFxkfDNbMDFdKXwoPzowWzQ2OV18MTEpLSg/OjBbMS05XXxbMTJdXFxkfDMwKXwoPzowMiktKD86MFsxLTldfDFcXGR8MlswLThdKSkpIixOYz1uZXcgUmVnRXhwKGBeJHtQY30kYCk7ZnVuY3Rpb24gRGModCl7Y29uc3Qgbj0iKD86WzAxXVxcZHwyWzAtM10pOlswLTVdXFxkIjtyZXR1cm4gdHlwZW9mIHQucHJlY2lzaW9uPT0ibnVtYmVyIj90LnByZWNpc2lvbj09PS0xP2Ake259YDp0LnByZWNpc2lvbj09PTA/YCR7bn06WzAtNV1cXGRgOmAke259OlswLTVdXFxkXFwuXFxkeyR7dC5wcmVjaXNpb259fWA6YCR7bn0oPzo6WzAtNV1cXGQoPzpcXC5cXGQrKT8pP2B9ZnVuY3Rpb24gRWModCl7cmV0dXJuIG5ldyBSZWdFeHAoYF4ke0RjKHQpfSRgKX1mdW5jdGlvbiBaYyh0KXtjb25zdCBuPURjKHtwcmVjaXNpb246dC5wcmVjaXNpb259KSxyPVsiWiJdO3QubG9jYWwmJnIucHVzaCgiIiksdC5vZmZzZXQmJnIucHVzaCgiKFsrLV0oPzpbMDFdXFxkfDJbMC0zXSk6WzAtNV1cXGQpIik7Y29uc3Qgbz1gJHtufSg/OiR7ci5qb2luKCJ8Iil9KWA7cmV0dXJuIG5ldyBSZWdFeHAoYF4ke1BjfVQoPzoke299KSRgKX1jb25zdCBSYz10PT57Y29uc3Qgbj10P2BbXFxzXFxTXXske3Q/Lm1pbmltdW0/PzB9LCR7dD8ubWF4aW11bT8/IiJ9fWA6IltcXHNcXFNdKiI7cmV0dXJuIG5ldyBSZWdFeHAoYF4ke259JGApfSxDYz0vXi0/XGQrbj8kLyxBYz0vXi0/XGQrJC8sTmk9L14tP1xkKyg/OlwuXGQrKT8kLyxMYz0vXig/OnRydWV8ZmFsc2UpJC9pLE1jPS9ebnVsbCQvaSxxYz0vXnVuZGVmaW5lZCQvaSxGYz0vXlteQS1aXSokLyxKYz0vXlteYS16XSokLyxIYz0vXlswLTlhLWZBLUZdKiQvO2Z1bmN0aW9uIE50KHQsbil7cmV0dXJuIG5ldyBSZWdFeHAoYF5bQS1aYS16MC05Ky9deyR7dH19JHtufSRgKX1mdW5jdGlvbiBEdCh0KXtyZXR1cm4gbmV3IFJlZ0V4cChgXltBLVphLXowLTlfLV17JHt0fX0kYCl9Y29uc3Qga3A9L15bMC05YS1mQS1GXXszMn0kLyxTcD1OdCgyMiwiPT0iKSx3cD1EdCgyMiksSXA9L15bMC05YS1mQS1GXXs0MH0kLyx6cD1OdCgyNywiPSIpLHhwPUR0KDI3KSxUcD0vXlswLTlhLWZBLUZdezY0fSQvLGpwPU50KDQzLCI9IiksT3A9RHQoNDMpLFVwPS9eWzAtOWEtZkEtRl17OTZ9JC8sUHA9TnQoNjQsIiIpLE5wPUR0KDY0KSxEcD0vXlswLTlhLWZBLUZdezEyOH0kLyxFcD1OdCg4NiwiPT0iKSxacD1EdCg4NiksUW49T2JqZWN0LmZyZWV6ZShPYmplY3QuZGVmaW5lUHJvcGVydHkoe19fcHJvdG9fXzpudWxsLGJhc2U2NDpUYyxiYXNlNjR1cmw6VWksYmlnaW50OkNjLGJvb2xlYW46TGMsYnJvd3NlckVtYWlsOmJwLGNpZHJ2NDp6YyxjaWRydjY6eGMsY3VpZDptYyxjdWlkMjpwYyxkYXRlOk5jLGRhdGV0aW1lOlpjLGRvbWFpbjpPYyxkdXJhdGlvbjokYyxlMTY0OlVjLGVtYWlsOmJjLGVtb2ppOmtjLGV4dGVuZGVkRHVyYXRpb246cHAsZ3VpZDpfYyxoZXg6SGMsaG9zdG5hbWU6amMsaHRtbDVFbWFpbDpocCxodHRwUHJvdG9jb2w6UGksaWRuRW1haWw6X3AsaW50ZWdlcjpBYyxpcHY0OlNjLGlwdjY6d2Msa3N1aWQ6dmMsbG93ZXJjYXNlOkZjLG1hYzpJYyxtZDVfYmFzZTY0OlNwLG1kNV9iYXNlNjR1cmw6d3AsbWQ1X2hleDprcCxuYW5vaWQ6aGMsbnVsbDpNYyxudW1iZXI6TmkscmZjNTMyMkVtYWlsOiRwLHNoYTFfYmFzZTY0OnpwLHNoYTFfYmFzZTY0dXJsOnhwLHNoYTFfaGV4OklwLHNoYTI1Nl9iYXNlNjQ6anAsc2hhMjU2X2Jhc2U2NHVybDpPcCxzaGEyNTZfaGV4OlRwLHNoYTM4NF9iYXNlNjQ6UHAsc2hhMzg0X2Jhc2U2NHVybDpOcCxzaGEzODRfaGV4OlVwLHNoYTUxMl9iYXNlNjQ6RXAsc2hhNTEyX2Jhc2U2NHVybDpacCxzaGE1MTJfaGV4OkRwLHN0cmluZzpSYyx0aW1lOkVjLHVsaWQ6ZmMsdW5kZWZpbmVkOnFjLHVuaWNvZGVFbWFpbDp5Yyx1cHBlcmNhc2U6SmMsdXVpZDpCZSx1dWlkNDpmcCx1dWlkNjpncCx1dWlkNzp2cCx4aWQ6Z2N9LFN5bWJvbC50b1N0cmluZ1RhZyx7dmFsdWU6Ik1vZHVsZSJ9KSksSj1kKCIkWm9kQ2hlY2siLCh0LG4pPT57dmFyIHI7dC5fem9kPz8odC5fem9kPXt9KSx0Ll96b2QuZGVmPW4sKHI9dC5fem9kKS5vbmF0dGFjaD8/KHIub25hdHRhY2g9W10pfSksV2M9e251bWJlcjoibnVtYmVyIixiaWdpbnQ6ImJpZ2ludCIsb2JqZWN0OiJkYXRlIn0sRGk9ZCgiJFpvZENoZWNrTGVzc1RoYW4iLCh0LG4pPT57Si5pbml0KHQsbik7Y29uc3Qgcj1XY1t0eXBlb2Ygbi52YWx1ZV07dC5fem9kLm9uYXR0YWNoLnB1c2gobz0+e2NvbnN0IGU9by5fem9kLmJhZyxpPShuLmluY2x1c2l2ZT9lLm1heGltdW06ZS5leGNsdXNpdmVNYXhpbXVtKT8/TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO24udmFsdWU8aSYmKG4uaW5jbHVzaXZlP2UubWF4aW11bT1uLnZhbHVlOmUuZXhjbHVzaXZlTWF4aW11bT1uLnZhbHVlKX0pLHQuX3pvZC5jaGVjaz1vPT57KG4uaW5jbHVzaXZlP28udmFsdWU8PW4udmFsdWU6by52YWx1ZTxuLnZhbHVlKXx8by5pc3N1ZXMucHVzaCh7b3JpZ2luOnIsY29kZToidG9vX2JpZyIsbWF4aW11bTp0eXBlb2Ygbi52YWx1ZT09Im9iamVjdCI/bi52YWx1ZS5nZXRUaW1lKCk6bi52YWx1ZSxpbnB1dDpvLnZhbHVlLGluY2x1c2l2ZTpuLmluY2x1c2l2ZSxpbnN0OnQsY29udGludWU6IW4uYWJvcnR9KX19KSxFaT1kKCIkWm9kQ2hlY2tHcmVhdGVyVGhhbiIsKHQsbik9PntKLmluaXQodCxuKTtjb25zdCByPVdjW3R5cGVvZiBuLnZhbHVlXTt0Ll96b2Qub25hdHRhY2gucHVzaChvPT57Y29uc3QgZT1vLl96b2QuYmFnLGk9KG4uaW5jbHVzaXZlP2UubWluaW11bTplLmV4Y2x1c2l2ZU1pbmltdW0pPz9OdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFk7bi52YWx1ZT5pJiYobi5pbmNsdXNpdmU/ZS5taW5pbXVtPW4udmFsdWU6ZS5leGNsdXNpdmVNaW5pbXVtPW4udmFsdWUpfSksdC5fem9kLmNoZWNrPW89Pnsobi5pbmNsdXNpdmU/by52YWx1ZT49bi52YWx1ZTpvLnZhbHVlPm4udmFsdWUpfHxvLmlzc3Vlcy5wdXNoKHtvcmlnaW46cixjb2RlOiJ0b29fc21hbGwiLG1pbmltdW06dHlwZW9mIG4udmFsdWU9PSJvYmplY3QiP24udmFsdWUuZ2V0VGltZSgpOm4udmFsdWUsaW5wdXQ6by52YWx1ZSxpbmNsdXNpdmU6bi5pbmNsdXNpdmUsaW5zdDp0LGNvbnRpbnVlOiFuLmFib3J0fSl9fSksQmM9ZCgiJFpvZENoZWNrTXVsdGlwbGVPZiIsKHQsbik9PntKLmluaXQodCxuKSx0Ll96b2Qub25hdHRhY2gucHVzaChyPT57dmFyIG87KG89ci5fem9kLmJhZykubXVsdGlwbGVPZj8/KG8ubXVsdGlwbGVPZj1uLnZhbHVlKX0pLHQuX3pvZC5jaGVjaz1yPT57aWYodHlwZW9mIHIudmFsdWUhPXR5cGVvZiBuLnZhbHVlKXRocm93IG5ldyBFcnJvcigiQ2Fubm90IG1peCBudW1iZXIgYW5kIGJpZ2ludCBpbiBtdWx0aXBsZV9vZiBjaGVjay4iKTsodHlwZW9mIHIudmFsdWU9PSJiaWdpbnQiP3IudmFsdWUlbi52YWx1ZT09PUJpZ0ludCgwKTpXcyhyLnZhbHVlLG4udmFsdWUpPT09MCl8fHIuaXNzdWVzLnB1c2goe29yaWdpbjp0eXBlb2Ygci52YWx1ZSxjb2RlOiJub3RfbXVsdGlwbGVfb2YiLGRpdmlzb3I6bi52YWx1ZSxpbnB1dDpyLnZhbHVlLGluc3Q6dCxjb250aW51ZTohbi5hYm9ydH0pfX0pLFZjPWQoIiRab2RDaGVja051bWJlckZvcm1hdCIsKHQsbik9PntKLmluaXQodCxuKSxuLmZvcm1hdD1uLmZvcm1hdHx8ImZsb2F0NjQiO2NvbnN0IHI9bi5mb3JtYXQ/LmluY2x1ZGVzKCJpbnQiKSxvPXI/ImludCI6Im51bWJlciIsW2UsaV09WHNbbi5mb3JtYXRdO3QuX3pvZC5vbmF0dGFjaC5wdXNoKGE9Pntjb25zdCBzPWEuX3pvZC5iYWc7cy5mb3JtYXQ9bi5mb3JtYXQscy5taW5pbXVtPWUscy5tYXhpbXVtPWksciYmKHMucGF0dGVybj1BYyl9KSx0Ll96b2QuY2hlY2s9YT0+e2NvbnN0IHM9YS52YWx1ZTtpZihyKXtpZighTnVtYmVyLmlzSW50ZWdlcihzKSl7YS5pc3N1ZXMucHVzaCh7ZXhwZWN0ZWQ6byxmb3JtYXQ6bi5mb3JtYXQsY29kZToiaW52YWxpZF90eXBlIixjb250aW51ZTohMSxpbnB1dDpzLGluc3Q6dH0pO3JldHVybn1pZighTnVtYmVyLmlzU2FmZUludGVnZXIocykpe3M+MD9hLmlzc3Vlcy5wdXNoKHtpbnB1dDpzLGNvZGU6InRvb19iaWciLG1heGltdW06TnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIsbm90ZToiSW50ZWdlcnMgbXVzdCBiZSB3aXRoaW4gdGhlIHNhZmUgaW50ZWdlciByYW5nZS4iLGluc3Q6dCxvcmlnaW46byxpbmNsdXNpdmU6ITAsY29udGludWU6IW4uYWJvcnR9KTphLmlzc3Vlcy5wdXNoKHtpbnB1dDpzLGNvZGU6InRvb19zbWFsbCIsbWluaW11bTpOdW1iZXIuTUlOX1NBRkVfSU5URUdFUixub3RlOiJJbnRlZ2VycyBtdXN0IGJlIHdpdGhpbiB0aGUgc2FmZSBpbnRlZ2VyIHJhbmdlLiIsaW5zdDp0LG9yaWdpbjpvLGluY2x1c2l2ZTohMCxjb250aW51ZTohbi5hYm9ydH0pO3JldHVybn19czxlJiZhLmlzc3Vlcy5wdXNoKHtvcmlnaW46Im51bWJlciIsaW5wdXQ6cyxjb2RlOiJ0b29fc21hbGwiLG1pbmltdW06ZSxpbmNsdXNpdmU6ITAsaW5zdDp0LGNvbnRpbnVlOiFuLmFib3J0fSkscz5pJiZhLmlzc3Vlcy5wdXNoKHtvcmlnaW46Im51bWJlciIsaW5wdXQ6cyxjb2RlOiJ0b29fYmlnIixtYXhpbXVtOmksaW5jbHVzaXZlOiEwLGluc3Q6dCxjb250aW51ZTohbi5hYm9ydH0pfX0pLEtjPWQoIiRab2RDaGVja0JpZ0ludEZvcm1hdCIsKHQsbik9PntKLmluaXQodCxuKTtjb25zdFtyLG9dPVlzW24uZm9ybWF0XTt0Ll96b2Qub25hdHRhY2gucHVzaChlPT57Y29uc3QgaT1lLl96b2QuYmFnO2kuZm9ybWF0PW4uZm9ybWF0LGkubWluaW11bT1yLGkubWF4aW11bT1vfSksdC5fem9kLmNoZWNrPWU9Pntjb25zdCBpPWUudmFsdWU7aTxyJiZlLmlzc3Vlcy5wdXNoKHtvcmlnaW46ImJpZ2ludCIsaW5wdXQ6aSxjb2RlOiJ0b29fc21hbGwiLG1pbmltdW06cixpbmNsdXNpdmU6ITAsaW5zdDp0LGNvbnRpbnVlOiFuLmFib3J0fSksaT5vJiZlLmlzc3Vlcy5wdXNoKHtvcmlnaW46ImJpZ2ludCIsaW5wdXQ6aSxjb2RlOiJ0b29fYmlnIixtYXhpbXVtOm8saW5jbHVzaXZlOiEwLGluc3Q6dCxjb250aW51ZTohbi5hYm9ydH0pfX0pLEdjPWQoIiRab2RDaGVja01heFNpemUiLCh0LG4pPT57dmFyIHI7Si5pbml0KHQsbiksKHI9dC5fem9kLmRlZikud2hlbj8/KHIud2hlbj1vPT57Y29uc3QgZT1vLnZhbHVlO3JldHVybiFBZShlKSYmZS5zaXplIT09dm9pZCAwfSksdC5fem9kLm9uYXR0YWNoLnB1c2gobz0+e2NvbnN0IGU9by5fem9kLmJhZy5tYXhpbXVtPz9OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7bi5tYXhpbXVtPGUmJihvLl96b2QuYmFnLm1heGltdW09bi5tYXhpbXVtKX0pLHQuX3pvZC5jaGVjaz1vPT57Y29uc3QgZT1vLnZhbHVlO2Uuc2l6ZTw9bi5tYXhpbXVtfHxvLmlzc3Vlcy5wdXNoKHtvcmlnaW46S24oZSksY29kZToidG9vX2JpZyIsbWF4aW11bTpuLm1heGltdW0saW5jbHVzaXZlOiEwLGlucHV0OmUsaW5zdDp0LGNvbnRpbnVlOiFuLmFib3J0fSl9fSksWGM9ZCgiJFpvZENoZWNrTWluU2l6ZSIsKHQsbik9Pnt2YXIgcjtKLmluaXQodCxuKSwocj10Ll96b2QuZGVmKS53aGVuPz8oci53aGVuPW89Pntjb25zdCBlPW8udmFsdWU7cmV0dXJuIUFlKGUpJiZlLnNpemUhPT12b2lkIDB9KSx0Ll96b2Qub25hdHRhY2gucHVzaChvPT57Y29uc3QgZT1vLl96b2QuYmFnLm1pbmltdW0/P051bWJlci5ORUdBVElWRV9JTkZJTklUWTtuLm1pbmltdW0+ZSYmKG8uX3pvZC5iYWcubWluaW11bT1uLm1pbmltdW0pfSksdC5fem9kLmNoZWNrPW89Pntjb25zdCBlPW8udmFsdWU7ZS5zaXplPj1uLm1pbmltdW18fG8uaXNzdWVzLnB1c2goe29yaWdpbjpLbihlKSxjb2RlOiJ0b29fc21hbGwiLG1pbmltdW06bi5taW5pbXVtLGluY2x1c2l2ZTohMCxpbnB1dDplLGluc3Q6dCxjb250aW51ZTohbi5hYm9ydH0pfX0pLFljPWQoIiRab2RDaGVja1NpemVFcXVhbHMiLCh0LG4pPT57dmFyIHI7Si5pbml0KHQsbiksKHI9dC5fem9kLmRlZikud2hlbj8/KHIud2hlbj1vPT57Y29uc3QgZT1vLnZhbHVlO3JldHVybiFBZShlKSYmZS5zaXplIT09dm9pZCAwfSksdC5fem9kLm9uYXR0YWNoLnB1c2gobz0+e2NvbnN0IGU9by5fem9kLmJhZztlLm1pbmltdW09bi5zaXplLGUubWF4aW11bT1uLnNpemUsZS5zaXplPW4uc2l6ZX0pLHQuX3pvZC5jaGVjaz1vPT57Y29uc3QgZT1vLnZhbHVlLGk9ZS5zaXplO2lmKGk9PT1uLnNpemUpcmV0dXJuO2NvbnN0IGE9aT5uLnNpemU7by5pc3N1ZXMucHVzaCh7b3JpZ2luOktuKGUpLC4uLmE/e2NvZGU6InRvb19iaWciLG1heGltdW06bi5zaXplfTp7Y29kZToidG9vX3NtYWxsIixtaW5pbXVtOm4uc2l6ZX0saW5jbHVzaXZlOiEwLGV4YWN0OiEwLGlucHV0Om8udmFsdWUsaW5zdDp0LGNvbnRpbnVlOiFuLmFib3J0fSl9fSksUWM9ZCgiJFpvZENoZWNrTWF4TGVuZ3RoIiwodCxuKT0+e3ZhciByO0ouaW5pdCh0LG4pLChyPXQuX3pvZC5kZWYpLndoZW4/PyhyLndoZW49bz0+e2NvbnN0IGU9by52YWx1ZTtyZXR1cm4hQWUoZSkmJmUubGVuZ3RoIT09dm9pZCAwfSksdC5fem9kLm9uYXR0YWNoLnB1c2gobz0+e2NvbnN0IGU9by5fem9kLmJhZy5tYXhpbXVtPz9OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7bi5tYXhpbXVtPGUmJihvLl96b2QuYmFnLm1heGltdW09bi5tYXhpbXVtKX0pLHQuX3pvZC5jaGVjaz1vPT57Y29uc3QgZT1vLnZhbHVlO2lmKGUubGVuZ3RoPD1uLm1heGltdW0pcmV0dXJuO2NvbnN0IGE9R24oZSk7by5pc3N1ZXMucHVzaCh7b3JpZ2luOmEsY29kZToidG9vX2JpZyIsbWF4aW11bTpuLm1heGltdW0saW5jbHVzaXZlOiEwLGlucHV0OmUsaW5zdDp0LGNvbnRpbnVlOiFuLmFib3J0fSl9fSksZXU9ZCgiJFpvZENoZWNrTWluTGVuZ3RoIiwodCxuKT0+e3ZhciByO0ouaW5pdCh0LG4pLChyPXQuX3pvZC5kZWYpLndoZW4/PyhyLndoZW49bz0+e2NvbnN0IGU9by52YWx1ZTtyZXR1cm4hQWUoZSkmJmUubGVuZ3RoIT09dm9pZCAwfSksdC5fem9kLm9uYXR0YWNoLnB1c2gobz0+e2NvbnN0IGU9by5fem9kLmJhZy5taW5pbXVtPz9OdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFk7bi5taW5pbXVtPmUmJihvLl96b2QuYmFnLm1pbmltdW09bi5taW5pbXVtKX0pLHQuX3pvZC5jaGVjaz1vPT57Y29uc3QgZT1vLnZhbHVlO2lmKGUubGVuZ3RoPj1uLm1pbmltdW0pcmV0dXJuO2NvbnN0IGE9R24oZSk7by5pc3N1ZXMucHVzaCh7b3JpZ2luOmEsY29kZToidG9vX3NtYWxsIixtaW5pbXVtOm4ubWluaW11bSxpbmNsdXNpdmU6ITAsaW5wdXQ6ZSxpbnN0OnQsY29udGludWU6IW4uYWJvcnR9KX19KSx0dT1kKCIkWm9kQ2hlY2tMZW5ndGhFcXVhbHMiLCh0LG4pPT57dmFyIHI7Si5pbml0KHQsbiksKHI9dC5fem9kLmRlZikud2hlbj8/KHIud2hlbj1vPT57Y29uc3QgZT1vLnZhbHVlO3JldHVybiFBZShlKSYmZS5sZW5ndGghPT12b2lkIDB9KSx0Ll96b2Qub25hdHRhY2gucHVzaChvPT57Y29uc3QgZT1vLl96b2QuYmFnO2UubWluaW11bT1uLmxlbmd0aCxlLm1heGltdW09bi5sZW5ndGgsZS5sZW5ndGg9bi5sZW5ndGh9KSx0Ll96b2QuY2hlY2s9bz0+e2NvbnN0IGU9by52YWx1ZSxpPWUubGVuZ3RoO2lmKGk9PT1uLmxlbmd0aClyZXR1cm47Y29uc3QgYT1HbihlKSxzPWk+bi5sZW5ndGg7by5pc3N1ZXMucHVzaCh7b3JpZ2luOmEsLi4ucz97Y29kZToidG9vX2JpZyIsbWF4aW11bTpuLmxlbmd0aH06e2NvZGU6InRvb19zbWFsbCIsbWluaW11bTpuLmxlbmd0aH0saW5jbHVzaXZlOiEwLGV4YWN0OiEwLGlucHV0Om8udmFsdWUsaW5zdDp0LGNvbnRpbnVlOiFuLmFib3J0fSl9fSksRXQ9ZCgiJFpvZENoZWNrU3RyaW5nRm9ybWF0IiwodCxuKT0+e3ZhciByLG87Si5pbml0KHQsbiksdC5fem9kLm9uYXR0YWNoLnB1c2goZT0+e2NvbnN0IGk9ZS5fem9kLmJhZztpLmZvcm1hdD1uLmZvcm1hdCxuLnBhdHRlcm4mJihpLnBhdHRlcm5zPz8oaS5wYXR0ZXJucz1uZXcgU2V0KSxpLnBhdHRlcm5zLmFkZChuLnBhdHRlcm4pKX0pLG4ucGF0dGVybj8ocj10Ll96b2QpLmNoZWNrPz8oci5jaGVjaz1lPT57bi5wYXR0ZXJuLmxhc3RJbmRleD0wLCFuLnBhdHRlcm4udGVzdChlLnZhbHVlKSYmZS5pc3N1ZXMucHVzaCh7b3JpZ2luOiJzdHJpbmciLGNvZGU6ImludmFsaWRfZm9ybWF0Iixmb3JtYXQ6bi5mb3JtYXQsaW5wdXQ6ZS52YWx1ZSwuLi5uLnBhdHRlcm4/e3BhdHRlcm46bi5wYXR0ZXJuLnRvU3RyaW5nKCl9Ont9LGluc3Q6dCxjb250aW51ZTohbi5hYm9ydH0pfSk6KG89dC5fem9kKS5jaGVjaz8/KG8uY2hlY2s9KCk9Pnt9KX0pLG51PWQoIiRab2RDaGVja1JlZ2V4IiwodCxuKT0+e0V0LmluaXQodCxuKSx0Ll96b2QuY2hlY2s9cj0+e24ucGF0dGVybi5sYXN0SW5kZXg9MCwhbi5wYXR0ZXJuLnRlc3Qoci52YWx1ZSkmJnIuaXNzdWVzLnB1c2goe29yaWdpbjoic3RyaW5nIixjb2RlOiJpbnZhbGlkX2Zvcm1hdCIsZm9ybWF0OiJyZWdleCIsaW5wdXQ6ci52YWx1ZSxwYXR0ZXJuOm4ucGF0dGVybi50b1N0cmluZygpLGluc3Q6dCxjb250aW51ZTohbi5hYm9ydH0pfX0pLHJ1PWQoIiRab2RDaGVja0xvd2VyQ2FzZSIsKHQsbik9PntuLnBhdHRlcm4/PyhuLnBhdHRlcm49RmMpLEV0LmluaXQodCxuKX0pLGl1PWQoIiRab2RDaGVja1VwcGVyQ2FzZSIsKHQsbik9PntuLnBhdHRlcm4/PyhuLnBhdHRlcm49SmMpLEV0LmluaXQodCxuKX0pLG91PWQoIiRab2RDaGVja0luY2x1ZGVzIiwodCxuKT0+e0ouaW5pdCh0LG4pO2NvbnN0IHI9YmUobi5pbmNsdWRlcyksbz1uZXcgUmVnRXhwKHR5cGVvZiBuLnBvc2l0aW9uPT0ibnVtYmVyIj9gXi57JHtuLnBvc2l0aW9ufX0ke3J9YDpyKTtuLnBhdHRlcm49byx0Ll96b2Qub25hdHRhY2gucHVzaChlPT57Y29uc3QgaT1lLl96b2QuYmFnO2kucGF0dGVybnM/PyhpLnBhdHRlcm5zPW5ldyBTZXQpLGkucGF0dGVybnMuYWRkKG8pfSksdC5fem9kLmNoZWNrPWU9PntlLnZhbHVlLmluY2x1ZGVzKG4uaW5jbHVkZXMsbi5wb3NpdGlvbil8fGUuaXNzdWVzLnB1c2goe29yaWdpbjoic3RyaW5nIixjb2RlOiJpbnZhbGlkX2Zvcm1hdCIsZm9ybWF0OiJpbmNsdWRlcyIsaW5jbHVkZXM6bi5pbmNsdWRlcyxpbnB1dDplLnZhbHVlLGluc3Q6dCxjb250aW51ZTohbi5hYm9ydH0pfX0pLGF1PWQoIiRab2RDaGVja1N0YXJ0c1dpdGgiLCh0LG4pPT57Si5pbml0KHQsbik7Y29uc3Qgcj1uZXcgUmVnRXhwKGBeJHtiZShuLnByZWZpeCl9LipgKTtuLnBhdHRlcm4/PyhuLnBhdHRlcm49ciksdC5fem9kLm9uYXR0YWNoLnB1c2gobz0+e2NvbnN0IGU9by5fem9kLmJhZztlLnBhdHRlcm5zPz8oZS5wYXR0ZXJucz1uZXcgU2V0KSxlLnBhdHRlcm5zLmFkZChyKX0pLHQuX3pvZC5jaGVjaz1vPT57by52YWx1ZS5zdGFydHNXaXRoKG4ucHJlZml4KXx8by5pc3N1ZXMucHVzaCh7b3JpZ2luOiJzdHJpbmciLGNvZGU6ImludmFsaWRfZm9ybWF0Iixmb3JtYXQ6InN0YXJ0c193aXRoIixwcmVmaXg6bi5wcmVmaXgsaW5wdXQ6by52YWx1ZSxpbnN0OnQsY29udGludWU6IW4uYWJvcnR9KX19KSxzdT1kKCIkWm9kQ2hlY2tFbmRzV2l0aCIsKHQsbik9PntKLmluaXQodCxuKTtjb25zdCByPW5ldyBSZWdFeHAoYC4qJHtiZShuLnN1ZmZpeCl9JGApO24ucGF0dGVybj8/KG4ucGF0dGVybj1yKSx0Ll96b2Qub25hdHRhY2gucHVzaChvPT57Y29uc3QgZT1vLl96b2QuYmFnO2UucGF0dGVybnM/PyhlLnBhdHRlcm5zPW5ldyBTZXQpLGUucGF0dGVybnMuYWRkKHIpfSksdC5fem9kLmNoZWNrPW89PntvLnZhbHVlLmVuZHNXaXRoKG4uc3VmZml4KXx8by5pc3N1ZXMucHVzaCh7b3JpZ2luOiJzdHJpbmciLGNvZGU6ImludmFsaWRfZm9ybWF0Iixmb3JtYXQ6ImVuZHNfd2l0aCIsc3VmZml4Om4uc3VmZml4LGlucHV0Om8udmFsdWUsaW5zdDp0LGNvbnRpbnVlOiFuLmFib3J0fSl9fSk7ZnVuY3Rpb24gdnModCxuLHIpe3QuaXNzdWVzLmxlbmd0aCYmbi5pc3N1ZXMucHVzaCguLi5mZShyLHQuaXNzdWVzKSl9Y29uc3QgY3U9ZCgiJFpvZENoZWNrUHJvcGVydHkiLCh0LG4pPT57Si5pbml0KHQsbiksdC5fem9kLmNoZWNrPXI9Pntjb25zdCBvPW4uc2NoZW1hLl96b2QucnVuKHt2YWx1ZTpyLnZhbHVlW24ucHJvcGVydHldLGlzc3VlczpbXX0se30pO2lmKG8gaW5zdGFuY2VvZiBQcm9taXNlKXJldHVybiBvLnRoZW4oZT0+dnMoZSxyLG4ucHJvcGVydHkpKTt2cyhvLHIsbi5wcm9wZXJ0eSl9fSksdXU9ZCgiJFpvZENoZWNrTWltZVR5cGUiLCh0LG4pPT57Si5pbml0KHQsbik7Y29uc3Qgcj1uZXcgU2V0KG4ubWltZSk7dC5fem9kLm9uYXR0YWNoLnB1c2gobz0+e28uX3pvZC5iYWcubWltZT1uLm1pbWV9KSx0Ll96b2QuY2hlY2s9bz0+e3IuaGFzKG8udmFsdWUudHlwZSl8fG8uaXNzdWVzLnB1c2goe2NvZGU6ImludmFsaWRfdmFsdWUiLHZhbHVlczpuLm1pbWUsaW5wdXQ6by52YWx1ZS50eXBlLGluc3Q6dCxjb250aW51ZTohbi5hYm9ydH0pfX0pLGx1PWQoIiRab2RDaGVja092ZXJ3cml0ZSIsKHQsbik9PntKLmluaXQodCxuKSx0Ll96b2QuY2hlY2s9cj0+e3IudmFsdWU9bi50eChyLnZhbHVlKX19KTtjbGFzcyBkdXtjb25zdHJ1Y3RvcihuPVtdKXt0aGlzLmNvbnRlbnQ9W10sdGhpcy5pbmRlbnQ9MCx0aGlzJiYodGhpcy5hcmdzPW4pfWluZGVudGVkKG4pe3RoaXMuaW5kZW50Kz0xLG4odGhpcyksdGhpcy5pbmRlbnQtPTF9d3JpdGUobil7aWYodHlwZW9mIG49PSJmdW5jdGlvbiIpe24odGhpcyx7ZXhlY3V0aW9uOiJzeW5jIn0pLG4odGhpcyx7ZXhlY3V0aW9uOiJhc3luYyJ9KTtyZXR1cm59Y29uc3Qgbz1uLnNwbGl0KGAKYCkuZmlsdGVyKGE9PmEpLGU9TWF0aC5taW4oLi4uby5tYXAoYT0+YS5sZW5ndGgtYS50cmltU3RhcnQoKS5sZW5ndGgpKSxpPW8ubWFwKGE9PmEuc2xpY2UoZSkpLm1hcChhPT4iICIucmVwZWF0KHRoaXMuaW5kZW50KjIpK2EpO2Zvcihjb25zdCBhIG9mIGkpdGhpcy5jb250ZW50LnB1c2goYSl9Y29tcGlsZSgpe2NvbnN0IG49RnVuY3Rpb24scj10aGlzPy5hcmdzLGU9Wy4uLih0aGlzPy5jb250ZW50Pz9bIiJdKS5tYXAoaT0+YCAgJHtpfWApXTtyZXR1cm4gbmV3IG4oLi4ucixlLmpvaW4oYApgKSl9fWNvbnN0IG11PXttYWpvcjo0LG1pbm9yOjQscGF0Y2g6M30seD1kKCIkWm9kVHlwZSIsKHQsbik9Pnt2YXIgcjt0Pz8odD17fSksdC5fem9kLmRlZj1uLHQuX3pvZC5iYWc9dC5fem9kLmJhZ3x8e30sdC5fem9kLnZlcnNpb249bXU7Y29uc3Qgbz1bLi4udC5fem9kLmRlZi5jaGVja3M/P1tdXTt0Ll96b2QudHJhaXRzLmhhcygiJFpvZENoZWNrIikmJm8udW5zaGlmdCh0KTtmb3IoY29uc3QgZSBvZiBvKWZvcihjb25zdCBpIG9mIGUuX3pvZC5vbmF0dGFjaClpKHQpO2lmKG8ubGVuZ3RoPT09MCkocj10Ll96b2QpLmRlZmVycmVkPz8oci5kZWZlcnJlZD1bXSksdC5fem9kLmRlZmVycmVkPy5wdXNoKCgpPT57dC5fem9kLnJ1bj10Ll96b2QucGFyc2V9KTtlbHNle2NvbnN0IGU9KGEscyxjKT0+e2xldCB1PVBlKGEpLGw7Zm9yKGNvbnN0IGcgb2Ygcyl7aWYoZy5fem9kLmRlZi53aGVuKXtpZihhYyhhKXx8IWcuX3pvZC5kZWYud2hlbihhKSljb250aW51ZX1lbHNlIGlmKHUpY29udGludWU7Y29uc3Qgdj1hLmlzc3Vlcy5sZW5ndGgsJD1nLl96b2QuY2hlY2soYSk7aWYoJCBpbnN0YW5jZW9mIFByb21pc2UmJmM/LmFzeW5jPT09ITEpdGhyb3cgbmV3IE5lO2lmKGx8fCQgaW5zdGFuY2VvZiBQcm9taXNlKWw9KGw/P1Byb21pc2UucmVzb2x2ZSgpKS50aGVuKGFzeW5jKCk9Pnthd2FpdCAkLGEuaXNzdWVzLmxlbmd0aCE9PXYmJih1fHwodT1QZShhLHYpKSl9KTtlbHNle2lmKGEuaXNzdWVzLmxlbmd0aD09PXYpY29udGludWU7dXx8KHU9UGUoYSx2KSl9fXJldHVybiBsP2wudGhlbigoKT0+YSk6YX0saT0oYSxzLGMpPT57aWYoUGUoYSkpcmV0dXJuIGEuYWJvcnRlZD0hMCxhO2NvbnN0IHU9ZShzLG8sYyk7aWYodSBpbnN0YW5jZW9mIFByb21pc2Upe2lmKGMuYXN5bmM9PT0hMSl0aHJvdyBuZXcgTmU7cmV0dXJuIHUudGhlbihsPT50Ll96b2QucGFyc2UobCxjKSl9cmV0dXJuIHQuX3pvZC5wYXJzZSh1LGMpfTt0Ll96b2QucnVuPShhLHMpPT57aWYocy5za2lwQ2hlY2tzKXJldHVybiB0Ll96b2QucGFyc2UoYSxzKTtpZihzLmRpcmVjdGlvbj09PSJiYWNrd2FyZCIpe2NvbnN0IHU9dC5fem9kLnBhcnNlKHt2YWx1ZTphLnZhbHVlLGlzc3VlczpbXX0sey4uLnMsc2tpcENoZWNrczohMH0pO3JldHVybiB1IGluc3RhbmNlb2YgUHJvbWlzZT91LnRoZW4obD0+aShsLGEscykpOmkodSxhLHMpfWNvbnN0IGM9dC5fem9kLnBhcnNlKGEscyk7aWYoYyBpbnN0YW5jZW9mIFByb21pc2Upe2lmKHMuYXN5bmM9PT0hMSl0aHJvdyBuZXcgTmU7cmV0dXJuIGMudGhlbih1PT5lKHUsbyxzKSl9cmV0dXJuIGUoYyxvLHMpfX1PKHQsIn5zdGFuZGFyZCIsKCk9Pih7dmFsaWRhdGU6ZT0+e3RyeXtjb25zdCBpPWtpKHQsZSk7cmV0dXJuIGkuc3VjY2Vzcz97dmFsdWU6aS5kYXRhfTp7aXNzdWVzOmkuZXJyb3I/Lmlzc3Vlc319Y2F0Y2h7cmV0dXJuIGRjKHQsZSkudGhlbihhPT5hLnN1Y2Nlc3M/e3ZhbHVlOmEuZGF0YX06e2lzc3VlczphLmVycm9yPy5pc3N1ZXN9KX19LHZlbmRvcjoiem9kIix2ZXJzaW9uOjF9KSl9KSxadD1kKCIkWm9kU3RyaW5nIiwodCxuKT0+e3guaW5pdCh0LG4pLHQuX3pvZC5wYXR0ZXJuPVsuLi50Py5fem9kLmJhZz8ucGF0dGVybnM/P1tdXS5wb3AoKT8/UmModC5fem9kLmJhZyksdC5fem9kLnBhcnNlPShyLG8pPT57aWYobi5jb2VyY2UpdHJ5e3IudmFsdWU9U3RyaW5nKHIudmFsdWUpfWNhdGNoe31yZXR1cm4gdHlwZW9mIHIudmFsdWU9PSJzdHJpbmcifHxyLmlzc3Vlcy5wdXNoKHtleHBlY3RlZDoic3RyaW5nIixjb2RlOiJpbnZhbGlkX3R5cGUiLGlucHV0OnIudmFsdWUsaW5zdDp0fSkscn19KSxGPWQoIiRab2RTdHJpbmdGb3JtYXQiLCh0LG4pPT57RXQuaW5pdCh0LG4pLFp0LmluaXQodCxuKX0pLHB1PWQoIiRab2RHVUlEIiwodCxuKT0+e24ucGF0dGVybj8/KG4ucGF0dGVybj1fYyksRi5pbml0KHQsbil9KSxmdT1kKCIkWm9kVVVJRCIsKHQsbik9PntpZihuLnZlcnNpb24pe2NvbnN0IG89e3YxOjEsdjI6Mix2MzozLHY0OjQsdjU6NSx2Njo2LHY3Ojcsdjg6OH1bbi52ZXJzaW9uXTtpZihvPT09dm9pZCAwKXRocm93IG5ldyBFcnJvcihgSW52YWxpZCBVVUlEIHZlcnNpb246ICIke24udmVyc2lvbn0iYCk7bi5wYXR0ZXJuPz8obi5wYXR0ZXJuPUJlKG8pKX1lbHNlIG4ucGF0dGVybj8/KG4ucGF0dGVybj1CZSgpKTtGLmluaXQodCxuKX0pLGd1PWQoIiRab2RFbWFpbCIsKHQsbik9PntuLnBhdHRlcm4/PyhuLnBhdHRlcm49YmMpLEYuaW5pdCh0LG4pfSksdnU9ZCgiJFpvZFVSTCIsKHQsbik9PntGLmluaXQodCxuKSx0Ll96b2QuY2hlY2s9cj0+e3RyeXtjb25zdCBvPXIudmFsdWUudHJpbSgpO2lmKCFuLm5vcm1hbGl6ZSYmbi5wcm90b2NvbD8uc291cmNlPT09UGkuc291cmNlJiYhL15odHRwcz86XC9cLy9pLnRlc3Qobykpe3IuaXNzdWVzLnB1c2goe2NvZGU6ImludmFsaWRfZm9ybWF0Iixmb3JtYXQ6InVybCIsbm90ZToiSW52YWxpZCBVUkwgZm9ybWF0IixpbnB1dDpyLnZhbHVlLGluc3Q6dCxjb250aW51ZTohbi5hYm9ydH0pO3JldHVybn1jb25zdCBlPW5ldyBVUkwobyk7bi5ob3N0bmFtZSYmKG4uaG9zdG5hbWUubGFzdEluZGV4PTAsbi5ob3N0bmFtZS50ZXN0KGUuaG9zdG5hbWUpfHxyLmlzc3Vlcy5wdXNoKHtjb2RlOiJpbnZhbGlkX2Zvcm1hdCIsZm9ybWF0OiJ1cmwiLG5vdGU6IkludmFsaWQgaG9zdG5hbWUiLHBhdHRlcm46bi5ob3N0bmFtZS5zb3VyY2UsaW5wdXQ6ci52YWx1ZSxpbnN0OnQsY29udGludWU6IW4uYWJvcnR9KSksbi5wcm90b2NvbCYmKG4ucHJvdG9jb2wubGFzdEluZGV4PTAsbi5wcm90b2NvbC50ZXN0KGUucHJvdG9jb2wuZW5kc1dpdGgoIjoiKT9lLnByb3RvY29sLnNsaWNlKDAsLTEpOmUucHJvdG9jb2wpfHxyLmlzc3Vlcy5wdXNoKHtjb2RlOiJpbnZhbGlkX2Zvcm1hdCIsZm9ybWF0OiJ1cmwiLG5vdGU6IkludmFsaWQgcHJvdG9jb2wiLHBhdHRlcm46bi5wcm90b2NvbC5zb3VyY2UsaW5wdXQ6ci52YWx1ZSxpbnN0OnQsY29udGludWU6IW4uYWJvcnR9KSksbi5ub3JtYWxpemU/ci52YWx1ZT1lLmhyZWY6ci52YWx1ZT1vO3JldHVybn1jYXRjaHtyLmlzc3Vlcy5wdXNoKHtjb2RlOiJpbnZhbGlkX2Zvcm1hdCIsZm9ybWF0OiJ1cmwiLGlucHV0OnIudmFsdWUsaW5zdDp0LGNvbnRpbnVlOiFuLmFib3J0fSl9fX0pLGh1PWQoIiRab2RFbW9qaSIsKHQsbik9PntuLnBhdHRlcm4/PyhuLnBhdHRlcm49a2MoKSksRi5pbml0KHQsbil9KSwkdT1kKCIkWm9kTmFub0lEIiwodCxuKT0+e24ucGF0dGVybj8/KG4ucGF0dGVybj1oYyksRi5pbml0KHQsbil9KSxfdT1kKCIkWm9kQ1VJRCIsKHQsbik9PntuLnBhdHRlcm4/PyhuLnBhdHRlcm49bWMpLEYuaW5pdCh0LG4pfSksYnU9ZCgiJFpvZENVSUQyIiwodCxuKT0+e24ucGF0dGVybj8/KG4ucGF0dGVybj1wYyksRi5pbml0KHQsbil9KSx5dT1kKCIkWm9kVUxJRCIsKHQsbik9PntuLnBhdHRlcm4/PyhuLnBhdHRlcm49ZmMpLEYuaW5pdCh0LG4pfSksa3U9ZCgiJFpvZFhJRCIsKHQsbik9PntuLnBhdHRlcm4/PyhuLnBhdHRlcm49Z2MpLEYuaW5pdCh0LG4pfSksU3U9ZCgiJFpvZEtTVUlEIiwodCxuKT0+e24ucGF0dGVybj8/KG4ucGF0dGVybj12YyksRi5pbml0KHQsbil9KSx3dT1kKCIkWm9kSVNPRGF0ZVRpbWUiLCh0LG4pPT57bi5wYXR0ZXJuPz8obi5wYXR0ZXJuPVpjKG4pKSxGLmluaXQodCxuKX0pLEl1PWQoIiRab2RJU09EYXRlIiwodCxuKT0+e24ucGF0dGVybj8/KG4ucGF0dGVybj1OYyksRi5pbml0KHQsbil9KSx6dT1kKCIkWm9kSVNPVGltZSIsKHQsbik9PntuLnBhdHRlcm4/PyhuLnBhdHRlcm49RWMobikpLEYuaW5pdCh0LG4pfSkseHU9ZCgiJFpvZElTT0R1cmF0aW9uIiwodCxuKT0+e24ucGF0dGVybj8/KG4ucGF0dGVybj0kYyksRi5pbml0KHQsbil9KSxUdT1kKCIkWm9kSVB2NCIsKHQsbik9PntuLnBhdHRlcm4/PyhuLnBhdHRlcm49U2MpLEYuaW5pdCh0LG4pLHQuX3pvZC5iYWcuZm9ybWF0PSJpcHY0In0pLGp1PWQoIiRab2RJUHY2IiwodCxuKT0+e24ucGF0dGVybj8/KG4ucGF0dGVybj13YyksRi5pbml0KHQsbiksdC5fem9kLmJhZy5mb3JtYXQ9ImlwdjYiLHQuX3pvZC5jaGVjaz1yPT57dHJ5e25ldyBVUkwoYGh0dHA6Ly9bJHtyLnZhbHVlfV1gKX1jYXRjaHtyLmlzc3Vlcy5wdXNoKHtjb2RlOiJpbnZhbGlkX2Zvcm1hdCIsZm9ybWF0OiJpcHY2IixpbnB1dDpyLnZhbHVlLGluc3Q6dCxjb250aW51ZTohbi5hYm9ydH0pfX19KSxPdT1kKCIkWm9kTUFDIiwodCxuKT0+e24ucGF0dGVybj8/KG4ucGF0dGVybj1JYyhuLmRlbGltaXRlcikpLEYuaW5pdCh0LG4pLHQuX3pvZC5iYWcuZm9ybWF0PSJtYWMifSksVXU9ZCgiJFpvZENJRFJ2NCIsKHQsbik9PntuLnBhdHRlcm4/PyhuLnBhdHRlcm49emMpLEYuaW5pdCh0LG4pfSksUHU9ZCgiJFpvZENJRFJ2NiIsKHQsbik9PntuLnBhdHRlcm4/PyhuLnBhdHRlcm49eGMpLEYuaW5pdCh0LG4pLHQuX3pvZC5jaGVjaz1yPT57Y29uc3Qgbz1yLnZhbHVlLnNwbGl0KCIvIik7dHJ5e2lmKG8ubGVuZ3RoIT09Mil0aHJvdyBuZXcgRXJyb3I7Y29uc3RbZSxpXT1vO2lmKCFpKXRocm93IG5ldyBFcnJvcjtjb25zdCBhPU51bWJlcihpKTtpZihgJHthfWAhPT1pKXRocm93IG5ldyBFcnJvcjtpZihhPDB8fGE+MTI4KXRocm93IG5ldyBFcnJvcjtuZXcgVVJMKGBodHRwOi8vWyR7ZX1dYCl9Y2F0Y2h7ci5pc3N1ZXMucHVzaCh7Y29kZToiaW52YWxpZF9mb3JtYXQiLGZvcm1hdDoiY2lkcnY2IixpbnB1dDpyLnZhbHVlLGluc3Q6dCxjb250aW51ZTohbi5hYm9ydH0pfX19KTtmdW5jdGlvbiBaaSh0KXtpZih0PT09IiIpcmV0dXJuITA7aWYoL1xzLy50ZXN0KHQpfHx0Lmxlbmd0aCU0IT09MClyZXR1cm4hMTt0cnl7cmV0dXJuIGF0b2IodCksITB9Y2F0Y2h7cmV0dXJuITF9fWNvbnN0IE51PWQoIiRab2RCYXNlNjQiLCh0LG4pPT57bi5wYXR0ZXJuPz8obi5wYXR0ZXJuPVRjKSxGLmluaXQodCxuKSx0Ll96b2QuYmFnLmNvbnRlbnRFbmNvZGluZz0iYmFzZTY0Iix0Ll96b2QuY2hlY2s9cj0+e1ppKHIudmFsdWUpfHxyLmlzc3Vlcy5wdXNoKHtjb2RlOiJpbnZhbGlkX2Zvcm1hdCIsZm9ybWF0OiJiYXNlNjQiLGlucHV0OnIudmFsdWUsaW5zdDp0LGNvbnRpbnVlOiFuLmFib3J0fSl9fSk7ZnVuY3Rpb24gRHUodCl7aWYoIVVpLnRlc3QodCkpcmV0dXJuITE7Y29uc3Qgbj10LnJlcGxhY2UoL1stX10vZyxvPT5vPT09Ii0iPyIrIjoiLyIpLHI9bi5wYWRFbmQoTWF0aC5jZWlsKG4ubGVuZ3RoLzQpKjQsIj0iKTtyZXR1cm4gWmkocil9Y29uc3QgRXU9ZCgiJFpvZEJhc2U2NFVSTCIsKHQsbik9PntuLnBhdHRlcm4/PyhuLnBhdHRlcm49VWkpLEYuaW5pdCh0LG4pLHQuX3pvZC5iYWcuY29udGVudEVuY29kaW5nPSJiYXNlNjR1cmwiLHQuX3pvZC5jaGVjaz1yPT57RHUoci52YWx1ZSl8fHIuaXNzdWVzLnB1c2goe2NvZGU6ImludmFsaWRfZm9ybWF0Iixmb3JtYXQ6ImJhc2U2NHVybCIsaW5wdXQ6ci52YWx1ZSxpbnN0OnQsY29udGludWU6IW4uYWJvcnR9KX19KSxadT1kKCIkWm9kRTE2NCIsKHQsbik9PntuLnBhdHRlcm4/PyhuLnBhdHRlcm49VWMpLEYuaW5pdCh0LG4pfSk7ZnVuY3Rpb24gUnUodCxuPW51bGwpe3RyeXtjb25zdCByPXQuc3BsaXQoIi4iKTtpZihyLmxlbmd0aCE9PTMpcmV0dXJuITE7Y29uc3Rbb109cjtpZighbylyZXR1cm4hMTtjb25zdCBlPUpTT04ucGFyc2UoYXRvYihvKSk7cmV0dXJuISgidHlwImluIGUmJmU/LnR5cCE9PSJKV1QifHwhZS5hbGd8fG4mJighKCJhbGciaW4gZSl8fGUuYWxnIT09bikpfWNhdGNoe3JldHVybiExfX1jb25zdCBDdT1kKCIkWm9kSldUIiwodCxuKT0+e0YuaW5pdCh0LG4pLHQuX3pvZC5jaGVjaz1yPT57UnUoci52YWx1ZSxuLmFsZyl8fHIuaXNzdWVzLnB1c2goe2NvZGU6ImludmFsaWRfZm9ybWF0Iixmb3JtYXQ6Imp3dCIsaW5wdXQ6ci52YWx1ZSxpbnN0OnQsY29udGludWU6IW4uYWJvcnR9KX19KSxBdT1kKCIkWm9kQ3VzdG9tU3RyaW5nRm9ybWF0IiwodCxuKT0+e0YuaW5pdCh0LG4pLHQuX3pvZC5jaGVjaz1yPT57bi5mbihyLnZhbHVlKXx8ci5pc3N1ZXMucHVzaCh7Y29kZToiaW52YWxpZF9mb3JtYXQiLGZvcm1hdDpuLmZvcm1hdCxpbnB1dDpyLnZhbHVlLGluc3Q6dCxjb250aW51ZTohbi5hYm9ydH0pfX0pLFJpPWQoIiRab2ROdW1iZXIiLCh0LG4pPT57eC5pbml0KHQsbiksdC5fem9kLnBhdHRlcm49dC5fem9kLmJhZy5wYXR0ZXJuPz9OaSx0Ll96b2QucGFyc2U9KHIsbyk9PntpZihuLmNvZXJjZSl0cnl7ci52YWx1ZT1OdW1iZXIoci52YWx1ZSl9Y2F0Y2h7fWNvbnN0IGU9ci52YWx1ZTtpZih0eXBlb2YgZT09Im51bWJlciImJiFOdW1iZXIuaXNOYU4oZSkmJk51bWJlci5pc0Zpbml0ZShlKSlyZXR1cm4gcjtjb25zdCBpPXR5cGVvZiBlPT0ibnVtYmVyIj9OdW1iZXIuaXNOYU4oZSk/Ik5hTiI6TnVtYmVyLmlzRmluaXRlKGUpP3ZvaWQgMDoiSW5maW5pdHkiOnZvaWQgMDtyZXR1cm4gci5pc3N1ZXMucHVzaCh7ZXhwZWN0ZWQ6Im51bWJlciIsY29kZToiaW52YWxpZF90eXBlIixpbnB1dDplLGluc3Q6dCwuLi5pP3tyZWNlaXZlZDppfTp7fX0pLHJ9fSksTHU9ZCgiJFpvZE51bWJlckZvcm1hdCIsKHQsbik9PntWYy5pbml0KHQsbiksUmkuaW5pdCh0LG4pfSksQ2k9ZCgiJFpvZEJvb2xlYW4iLCh0LG4pPT57eC5pbml0KHQsbiksdC5fem9kLnBhdHRlcm49TGMsdC5fem9kLnBhcnNlPShyLG8pPT57aWYobi5jb2VyY2UpdHJ5e3IudmFsdWU9ISFyLnZhbHVlfWNhdGNoe31jb25zdCBlPXIudmFsdWU7cmV0dXJuIHR5cGVvZiBlPT0iYm9vbGVhbiJ8fHIuaXNzdWVzLnB1c2goe2V4cGVjdGVkOiJib29sZWFuIixjb2RlOiJpbnZhbGlkX3R5cGUiLGlucHV0OmUsaW5zdDp0fSkscn19KSxBaT1kKCIkWm9kQmlnSW50IiwodCxuKT0+e3guaW5pdCh0LG4pLHQuX3pvZC5wYXR0ZXJuPUNjLHQuX3pvZC5wYXJzZT0ocixvKT0+e2lmKG4uY29lcmNlKXRyeXtyLnZhbHVlPUJpZ0ludChyLnZhbHVlKX1jYXRjaHt9cmV0dXJuIHR5cGVvZiByLnZhbHVlPT0iYmlnaW50Inx8ci5pc3N1ZXMucHVzaCh7ZXhwZWN0ZWQ6ImJpZ2ludCIsY29kZToiaW52YWxpZF90eXBlIixpbnB1dDpyLnZhbHVlLGluc3Q6dH0pLHJ9fSksTXU9ZCgiJFpvZEJpZ0ludEZvcm1hdCIsKHQsbik9PntLYy5pbml0KHQsbiksQWkuaW5pdCh0LG4pfSkscXU9ZCgiJFpvZFN5bWJvbCIsKHQsbik9Pnt4LmluaXQodCxuKSx0Ll96b2QucGFyc2U9KHIsbyk9Pntjb25zdCBlPXIudmFsdWU7cmV0dXJuIHR5cGVvZiBlPT0ic3ltYm9sInx8ci5pc3N1ZXMucHVzaCh7ZXhwZWN0ZWQ6InN5bWJvbCIsY29kZToiaW52YWxpZF90eXBlIixpbnB1dDplLGluc3Q6dH0pLHJ9fSksRnU9ZCgiJFpvZFVuZGVmaW5lZCIsKHQsbik9Pnt4LmluaXQodCxuKSx0Ll96b2QucGF0dGVybj1xYyx0Ll96b2QudmFsdWVzPW5ldyBTZXQoW3ZvaWQgMF0pLHQuX3pvZC5wYXJzZT0ocixvKT0+e2NvbnN0IGU9ci52YWx1ZTtyZXR1cm4gdHlwZW9mIGU+InUifHxyLmlzc3Vlcy5wdXNoKHtleHBlY3RlZDoidW5kZWZpbmVkIixjb2RlOiJpbnZhbGlkX3R5cGUiLGlucHV0OmUsaW5zdDp0fSkscn19KSxKdT1kKCIkWm9kTnVsbCIsKHQsbik9Pnt4LmluaXQodCxuKSx0Ll96b2QucGF0dGVybj1NYyx0Ll96b2QudmFsdWVzPW5ldyBTZXQoW251bGxdKSx0Ll96b2QucGFyc2U9KHIsbyk9Pntjb25zdCBlPXIudmFsdWU7cmV0dXJuIGU9PT1udWxsfHxyLmlzc3Vlcy5wdXNoKHtleHBlY3RlZDoibnVsbCIsY29kZToiaW52YWxpZF90eXBlIixpbnB1dDplLGluc3Q6dH0pLHJ9fSksSHU9ZCgiJFpvZEFueSIsKHQsbik9Pnt4LmluaXQodCxuKSx0Ll96b2QucGFyc2U9cj0+cn0pLFd1PWQoIiRab2RVbmtub3duIiwodCxuKT0+e3guaW5pdCh0LG4pLHQuX3pvZC5wYXJzZT1yPT5yfSksQnU9ZCgiJFpvZE5ldmVyIiwodCxuKT0+e3guaW5pdCh0LG4pLHQuX3pvZC5wYXJzZT0ocixvKT0+KHIuaXNzdWVzLnB1c2goe2V4cGVjdGVkOiJuZXZlciIsY29kZToiaW52YWxpZF90eXBlIixpbnB1dDpyLnZhbHVlLGluc3Q6dH0pLHIpfSksVnU9ZCgiJFpvZFZvaWQiLCh0LG4pPT57eC5pbml0KHQsbiksdC5fem9kLnBhcnNlPShyLG8pPT57Y29uc3QgZT1yLnZhbHVlO3JldHVybiB0eXBlb2YgZT4idSJ8fHIuaXNzdWVzLnB1c2goe2V4cGVjdGVkOiJ2b2lkIixjb2RlOiJpbnZhbGlkX3R5cGUiLGlucHV0OmUsaW5zdDp0fSkscn19KSxLdT1kKCIkWm9kRGF0ZSIsKHQsbik9Pnt4LmluaXQodCxuKSx0Ll96b2QucGFyc2U9KHIsbyk9PntpZihuLmNvZXJjZSl0cnl7ci52YWx1ZT1uZXcgRGF0ZShyLnZhbHVlKX1jYXRjaHt9Y29uc3QgZT1yLnZhbHVlLGk9ZSBpbnN0YW5jZW9mIERhdGU7cmV0dXJuIGkmJiFOdW1iZXIuaXNOYU4oZS5nZXRUaW1lKCkpfHxyLmlzc3Vlcy5wdXNoKHtleHBlY3RlZDoiZGF0ZSIsY29kZToiaW52YWxpZF90eXBlIixpbnB1dDplLC4uLmk/e3JlY2VpdmVkOiJJbnZhbGlkIERhdGUifTp7fSxpbnN0OnR9KSxyfX0pO2Z1bmN0aW9uIGhzKHQsbixyKXt0Lmlzc3Vlcy5sZW5ndGgmJm4uaXNzdWVzLnB1c2goLi4uZmUocix0Lmlzc3VlcykpLG4udmFsdWVbcl09dC52YWx1ZX1jb25zdCBHdT1kKCIkWm9kQXJyYXkiLCh0LG4pPT57eC5pbml0KHQsbiksdC5fem9kLnBhcnNlPShyLG8pPT57Y29uc3QgZT1yLnZhbHVlO2lmKCFBcnJheS5pc0FycmF5KGUpKXJldHVybiByLmlzc3Vlcy5wdXNoKHtleHBlY3RlZDoiYXJyYXkiLGNvZGU6ImludmFsaWRfdHlwZSIsaW5wdXQ6ZSxpbnN0OnR9KSxyO3IudmFsdWU9QXJyYXkoZS5sZW5ndGgpO2NvbnN0IGk9W107Zm9yKGxldCBhPTA7YTxlLmxlbmd0aDthKyspe2NvbnN0IHM9ZVthXSxjPW4uZWxlbWVudC5fem9kLnJ1bih7dmFsdWU6cyxpc3N1ZXM6W119LG8pO2MgaW5zdGFuY2VvZiBQcm9taXNlP2kucHVzaChjLnRoZW4odT0+aHModSxyLGEpKSk6aHMoYyxyLGEpfXJldHVybiBpLmxlbmd0aD9Qcm9taXNlLmFsbChpKS50aGVuKCgpPT5yKTpyfX0pO2Z1bmN0aW9uIEFuKHQsbixyLG8sZSxpKXtjb25zdCBhPXIgaW4gbztpZih0Lmlzc3Vlcy5sZW5ndGgpe2lmKGUmJmkmJiFhKXJldHVybjtuLmlzc3Vlcy5wdXNoKC4uLmZlKHIsdC5pc3N1ZXMpKX1pZighYSYmIWUpe3QuaXNzdWVzLmxlbmd0aHx8bi5pc3N1ZXMucHVzaCh7Y29kZToiaW52YWxpZF90eXBlIixleHBlY3RlZDoibm9ub3B0aW9uYWwiLGlucHV0OnZvaWQgMCxwYXRoOltyXX0pO3JldHVybn10LnZhbHVlPT09dm9pZCAwP2EmJihuLnZhbHVlW3JdPXZvaWQgMCk6bi52YWx1ZVtyXT10LnZhbHVlfWZ1bmN0aW9uIFh1KHQpe2NvbnN0IG49T2JqZWN0LmtleXModC5zaGFwZSk7Zm9yKGNvbnN0IG8gb2YgbilpZighdC5zaGFwZT8uW29dPy5fem9kPy50cmFpdHM/LmhhcygiJFpvZFR5cGUiKSl0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZWxlbWVudCBhdCBrZXkgIiR7b30iOiBleHBlY3RlZCBhIFpvZCBzY2hlbWFgKTtjb25zdCByPUdzKHQuc2hhcGUpO3JldHVybnsuLi50LGtleXM6bixrZXlTZXQ6bmV3IFNldChuKSxudW1LZXlzOm4ubGVuZ3RoLG9wdGlvbmFsS2V5czpuZXcgU2V0KHIpfX1mdW5jdGlvbiBZdSh0LG4scixvLGUsaSl7Y29uc3QgYT1bXSxzPWUua2V5U2V0LGM9ZS5jYXRjaGFsbC5fem9kLHU9Yy5kZWYudHlwZSxsPWMub3B0aW49PT0ib3B0aW9uYWwiLGc9Yy5vcHRvdXQ9PT0ib3B0aW9uYWwiO2Zvcihjb25zdCB2IGluIG4pe2lmKHY9PT0iX19wcm90b19fInx8cy5oYXModikpY29udGludWU7aWYodT09PSJuZXZlciIpe2EucHVzaCh2KTtjb250aW51ZX1jb25zdCAkPWMucnVuKHt2YWx1ZTpuW3ZdLGlzc3VlczpbXX0sbyk7JCBpbnN0YW5jZW9mIFByb21pc2U/dC5wdXNoKCQudGhlbih5PT5Bbih5LHIsdixuLGwsZykpKTpBbigkLHIsdixuLGwsZyl9cmV0dXJuIGEubGVuZ3RoJiZyLmlzc3Vlcy5wdXNoKHtjb2RlOiJ1bnJlY29nbml6ZWRfa2V5cyIsa2V5czphLGlucHV0Om4saW5zdDppfSksdC5sZW5ndGg/UHJvbWlzZS5hbGwodCkudGhlbigoKT0+cik6cn1jb25zdCBRdT1kKCIkWm9kT2JqZWN0IiwodCxuKT0+e2lmKHguaW5pdCh0LG4pLCFPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG4sInNoYXBlIik/LmdldCl7Y29uc3Qgcz1uLnNoYXBlO09iamVjdC5kZWZpbmVQcm9wZXJ0eShuLCJzaGFwZSIse2dldDooKT0+e2NvbnN0IGM9ey4uLnN9O3JldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkobiwic2hhcGUiLHt2YWx1ZTpjfSksY319KX1jb25zdCBvPVR0KCgpPT5YdShuKSk7Tyh0Ll96b2QsInByb3BWYWx1ZXMiLCgpPT57Y29uc3Qgcz1uLnNoYXBlLGM9e307Zm9yKGNvbnN0IHUgaW4gcyl7Y29uc3QgbD1zW3VdLl96b2Q7aWYobC52YWx1ZXMpe2NbdV0/PyhjW3VdPW5ldyBTZXQpO2Zvcihjb25zdCBnIG9mIGwudmFsdWVzKWNbdV0uYWRkKGcpfX1yZXR1cm4gY30pO2NvbnN0IGU9SGUsaT1uLmNhdGNoYWxsO2xldCBhO3QuX3pvZC5wYXJzZT0ocyxjKT0+e2E/PyhhPW8udmFsdWUpO2NvbnN0IHU9cy52YWx1ZTtpZighZSh1KSlyZXR1cm4gcy5pc3N1ZXMucHVzaCh7ZXhwZWN0ZWQ6Im9iamVjdCIsY29kZToiaW52YWxpZF90eXBlIixpbnB1dDp1LGluc3Q6dH0pLHM7cy52YWx1ZT17fTtjb25zdCBsPVtdLGc9YS5zaGFwZTtmb3IoY29uc3QgdiBvZiBhLmtleXMpe2NvbnN0ICQ9Z1t2XSx5PSQuX3pvZC5vcHRpbj09PSJvcHRpb25hbCIsSD0kLl96b2Qub3B0b3V0PT09Im9wdGlvbmFsIixMPSQuX3pvZC5ydW4oe3ZhbHVlOnVbdl0saXNzdWVzOltdfSxjKTtMIGluc3RhbmNlb2YgUHJvbWlzZT9sLnB1c2goTC50aGVuKHFlPT5BbihxZSxzLHYsdSx5LEgpKSk6QW4oTCxzLHYsdSx5LEgpfXJldHVybiBpP1l1KGwsdSxzLGMsby52YWx1ZSx0KTpsLmxlbmd0aD9Qcm9taXNlLmFsbChsKS50aGVuKCgpPT5zKTpzfX0pLGVsPWQoIiRab2RPYmplY3RKSVQiLCh0LG4pPT57UXUuaW5pdCh0LG4pO2NvbnN0IHI9dC5fem9kLnBhcnNlLG89VHQoKCk9Plh1KG4pKSxlPXY9Pntjb25zdCAkPW5ldyBkdShbInNoYXBlIiwicGF5bG9hZCIsImN0eCJdKSx5PW8udmFsdWUsSD1XPT57Y29uc3QgTT1zaShXKTtyZXR1cm5gc2hhcGVbJHtNfV0uX3pvZC5ydW4oeyB2YWx1ZTogaW5wdXRbJHtNfV0sIGlzc3VlczogW10gfSwgY3R4KWB9OyQud3JpdGUoImNvbnN0IGlucHV0ID0gcGF5bG9hZC52YWx1ZTsiKTtjb25zdCBMPU9iamVjdC5jcmVhdGUobnVsbCk7bGV0IHFlPTA7Zm9yKGNvbnN0IFcgb2YgeS5rZXlzKUxbV109YGtleV8ke3FlKyt9YDskLndyaXRlKCJjb25zdCBuZXdSZXN1bHQgPSB7fTsiKTtmb3IoY29uc3QgVyBvZiB5LmtleXMpe2NvbnN0IE09TFtXXSxYPXNpKFcpLGRzPXZbV10sbXM9ZHM/Ll96b2Q/Lm9wdGluPT09Im9wdGlvbmFsIixabT1kcz8uX3pvZD8ub3B0b3V0PT09Im9wdGlvbmFsIjskLndyaXRlKGBjb25zdCAke019ID0gJHtIKFcpfTtgKSxtcyYmWm0/JC53cml0ZShgCiAgICAgICAgaWYgKCR7TX0uaXNzdWVzLmxlbmd0aCkgewogICAgICAgICAgaWYgKCR7WH0gaW4gaW5wdXQpIHsKICAgICAgICAgICAgcGF5bG9hZC5pc3N1ZXMgPSBwYXlsb2FkLmlzc3Vlcy5jb25jYXQoJHtNfS5pc3N1ZXMubWFwKGlzcyA9PiAoewogICAgICAgICAgICAgIC4uLmlzcywKICAgICAgICAgICAgICBwYXRoOiBpc3MucGF0aCA/IFske1h9LCAuLi5pc3MucGF0aF0gOiBbJHtYfV0KICAgICAgICAgICAgfSkpKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYgKCR7TX0udmFsdWUgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgaWYgKCR7WH0gaW4gaW5wdXQpIHsKICAgICAgICAgICAgbmV3UmVzdWx0WyR7WH1dID0gdW5kZWZpbmVkOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBuZXdSZXN1bHRbJHtYfV0gPSAke019LnZhbHVlOwogICAgICAgIH0KICAgICAgICAKICAgICAgYCk6bXM/JC53cml0ZShgCiAgICAgICAgaWYgKCR7TX0uaXNzdWVzLmxlbmd0aCkgewogICAgICAgICAgcGF5bG9hZC5pc3N1ZXMgPSBwYXlsb2FkLmlzc3Vlcy5jb25jYXQoJHtNfS5pc3N1ZXMubWFwKGlzcyA9PiAoewogICAgICAgICAgICAuLi5pc3MsCiAgICAgICAgICAgIHBhdGg6IGlzcy5wYXRoID8gWyR7WH0sIC4uLmlzcy5wYXRoXSA6IFske1h9XQogICAgICAgICAgfSkpKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYgKCR7TX0udmFsdWUgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgaWYgKCR7WH0gaW4gaW5wdXQpIHsKICAgICAgICAgICAgbmV3UmVzdWx0WyR7WH1dID0gdW5kZWZpbmVkOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBuZXdSZXN1bHRbJHtYfV0gPSAke019LnZhbHVlOwogICAgICAgIH0KICAgICAgICAKICAgICAgYCk6JC53cml0ZShgCiAgICAgICAgY29uc3QgJHtNfV9wcmVzZW50ID0gJHtYfSBpbiBpbnB1dDsKICAgICAgICBpZiAoJHtNfS5pc3N1ZXMubGVuZ3RoKSB7CiAgICAgICAgICBwYXlsb2FkLmlzc3VlcyA9IHBheWxvYWQuaXNzdWVzLmNvbmNhdCgke019Lmlzc3Vlcy5tYXAoaXNzID0+ICh7CiAgICAgICAgICAgIC4uLmlzcywKICAgICAgICAgICAgcGF0aDogaXNzLnBhdGggPyBbJHtYfSwgLi4uaXNzLnBhdGhdIDogWyR7WH1dCiAgICAgICAgICB9KSkpOwogICAgICAgIH0KICAgICAgICBpZiAoISR7TX1fcHJlc2VudCAmJiAhJHtNfS5pc3N1ZXMubGVuZ3RoKSB7CiAgICAgICAgICBwYXlsb2FkLmlzc3Vlcy5wdXNoKHsKICAgICAgICAgICAgY29kZTogImludmFsaWRfdHlwZSIsCiAgICAgICAgICAgIGV4cGVjdGVkOiAibm9ub3B0aW9uYWwiLAogICAgICAgICAgICBpbnB1dDogdW5kZWZpbmVkLAogICAgICAgICAgICBwYXRoOiBbJHtYfV0KICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgaWYgKCR7TX1fcHJlc2VudCkgewogICAgICAgICAgaWYgKCR7TX0udmFsdWUgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICBuZXdSZXN1bHRbJHtYfV0gPSB1bmRlZmluZWQ7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBuZXdSZXN1bHRbJHtYfV0gPSAke019LnZhbHVlOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgIGApfSQud3JpdGUoInBheWxvYWQudmFsdWUgPSBuZXdSZXN1bHQ7IiksJC53cml0ZSgicmV0dXJuIHBheWxvYWQ7Iik7Y29uc3QgRz0kLmNvbXBpbGUoKTtyZXR1cm4oVyxNKT0+Ryh2LFcsTSl9O2xldCBpO2NvbnN0IGE9SGUscz0ha3Quaml0bGVzcyx1PXMmJlZzLnZhbHVlLGw9bi5jYXRjaGFsbDtsZXQgZzt0Ll96b2QucGFyc2U9KHYsJCk9PntnPz8oZz1vLnZhbHVlKTtjb25zdCB5PXYudmFsdWU7cmV0dXJuIGEoeSk/cyYmdSYmJD8uYXN5bmM9PT0hMSYmJC5qaXRsZXNzIT09ITA/KGl8fChpPWUobi5zaGFwZSkpLHY9aSh2LCQpLGw/WXUoW10seSx2LCQsZyx0KTp2KTpyKHYsJCk6KHYuaXNzdWVzLnB1c2goe2V4cGVjdGVkOiJvYmplY3QiLGNvZGU6ImludmFsaWRfdHlwZSIsaW5wdXQ6eSxpbnN0OnR9KSx2KX19KTtmdW5jdGlvbiAkcyh0LG4scixvKXtmb3IoY29uc3QgaSBvZiB0KWlmKGkuaXNzdWVzLmxlbmd0aD09PTApcmV0dXJuIG4udmFsdWU9aS52YWx1ZSxuO2NvbnN0IGU9dC5maWx0ZXIoaT0+IVBlKGkpKTtyZXR1cm4gZS5sZW5ndGg9PT0xPyhuLnZhbHVlPWVbMF0udmFsdWUsZVswXSk6KG4uaXNzdWVzLnB1c2goe2NvZGU6ImludmFsaWRfdW5pb24iLGlucHV0Om4udmFsdWUsaW5zdDpyLGVycm9yczp0Lm1hcChpPT5pLmlzc3Vlcy5tYXAoYT0+bGUoYSxvLEsoKSkpKX0pLG4pfWNvbnN0IGVyPWQoIiRab2RVbmlvbiIsKHQsbik9Pnt4LmluaXQodCxuKSxPKHQuX3pvZCwib3B0aW4iLCgpPT5uLm9wdGlvbnMuc29tZShvPT5vLl96b2Qub3B0aW49PT0ib3B0aW9uYWwiKT8ib3B0aW9uYWwiOnZvaWQgMCksTyh0Ll96b2QsIm9wdG91dCIsKCk9Pm4ub3B0aW9ucy5zb21lKG89Pm8uX3pvZC5vcHRvdXQ9PT0ib3B0aW9uYWwiKT8ib3B0aW9uYWwiOnZvaWQgMCksTyh0Ll96b2QsInZhbHVlcyIsKCk9PntpZihuLm9wdGlvbnMuZXZlcnkobz0+by5fem9kLnZhbHVlcykpcmV0dXJuIG5ldyBTZXQobi5vcHRpb25zLmZsYXRNYXAobz0+QXJyYXkuZnJvbShvLl96b2QudmFsdWVzKSkpfSksTyh0Ll96b2QsInBhdHRlcm4iLCgpPT57aWYobi5vcHRpb25zLmV2ZXJ5KG89Pm8uX3pvZC5wYXR0ZXJuKSl7Y29uc3Qgbz1uLm9wdGlvbnMubWFwKGU9PmUuX3pvZC5wYXR0ZXJuKTtyZXR1cm4gbmV3IFJlZ0V4cChgXigke28ubWFwKGU9PkJuKGUuc291cmNlKSkuam9pbigifCIpfSkkYCl9fSk7Y29uc3Qgcj1uLm9wdGlvbnMubGVuZ3RoPT09MT9uLm9wdGlvbnNbMF0uX3pvZC5ydW46bnVsbDt0Ll96b2QucGFyc2U9KG8sZSk9PntpZihyKXJldHVybiByKG8sZSk7bGV0IGk9ITE7Y29uc3QgYT1bXTtmb3IoY29uc3QgcyBvZiBuLm9wdGlvbnMpe2NvbnN0IGM9cy5fem9kLnJ1bih7dmFsdWU6by52YWx1ZSxpc3N1ZXM6W119LGUpO2lmKGMgaW5zdGFuY2VvZiBQcm9taXNlKWEucHVzaChjKSxpPSEwO2Vsc2V7aWYoYy5pc3N1ZXMubGVuZ3RoPT09MClyZXR1cm4gYzthLnB1c2goYyl9fXJldHVybiBpP1Byb21pc2UuYWxsKGEpLnRoZW4ocz0+JHMocyxvLHQsZSkpOiRzKGEsbyx0LGUpfX0pO2Z1bmN0aW9uIF9zKHQsbixyLG8pe2NvbnN0IGU9dC5maWx0ZXIoaT0+aS5pc3N1ZXMubGVuZ3RoPT09MCk7cmV0dXJuIGUubGVuZ3RoPT09MT8obi52YWx1ZT1lWzBdLnZhbHVlLG4pOihlLmxlbmd0aD09PTA/bi5pc3N1ZXMucHVzaCh7Y29kZToiaW52YWxpZF91bmlvbiIsaW5wdXQ6bi52YWx1ZSxpbnN0OnIsZXJyb3JzOnQubWFwKGk9PmkuaXNzdWVzLm1hcChhPT5sZShhLG8sSygpKSkpfSk6bi5pc3N1ZXMucHVzaCh7Y29kZToiaW52YWxpZF91bmlvbiIsaW5wdXQ6bi52YWx1ZSxpbnN0OnIsZXJyb3JzOltdLGluY2x1c2l2ZTohMX0pLG4pfWNvbnN0IHRsPWQoIiRab2RYb3IiLCh0LG4pPT57ZXIuaW5pdCh0LG4pLG4uaW5jbHVzaXZlPSExO2NvbnN0IHI9bi5vcHRpb25zLmxlbmd0aD09PTE/bi5vcHRpb25zWzBdLl96b2QucnVuOm51bGw7dC5fem9kLnBhcnNlPShvLGUpPT57aWYocilyZXR1cm4gcihvLGUpO2xldCBpPSExO2NvbnN0IGE9W107Zm9yKGNvbnN0IHMgb2Ygbi5vcHRpb25zKXtjb25zdCBjPXMuX3pvZC5ydW4oe3ZhbHVlOm8udmFsdWUsaXNzdWVzOltdfSxlKTtjIGluc3RhbmNlb2YgUHJvbWlzZT8oYS5wdXNoKGMpLGk9ITApOmEucHVzaChjKX1yZXR1cm4gaT9Qcm9taXNlLmFsbChhKS50aGVuKHM9Pl9zKHMsbyx0LGUpKTpfcyhhLG8sdCxlKX19KSxubD1kKCIkWm9kRGlzY3JpbWluYXRlZFVuaW9uIiwodCxuKT0+e24uaW5jbHVzaXZlPSExLGVyLmluaXQodCxuKTtjb25zdCByPXQuX3pvZC5wYXJzZTtPKHQuX3pvZCwicHJvcFZhbHVlcyIsKCk9Pntjb25zdCBlPXt9O2Zvcihjb25zdCBpIG9mIG4ub3B0aW9ucyl7Y29uc3QgYT1pLl96b2QucHJvcFZhbHVlcztpZighYXx8T2JqZWN0LmtleXMoYSkubGVuZ3RoPT09MCl0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZGlzY3JpbWluYXRlZCB1bmlvbiBvcHRpb24gYXQgaW5kZXggIiR7bi5vcHRpb25zLmluZGV4T2YoaSl9ImApO2Zvcihjb25zdFtzLGNdb2YgT2JqZWN0LmVudHJpZXMoYSkpe2Vbc118fChlW3NdPW5ldyBTZXQpO2Zvcihjb25zdCB1IG9mIGMpZVtzXS5hZGQodSl9fXJldHVybiBlfSk7Y29uc3Qgbz1UdCgoKT0+e2NvbnN0IGU9bi5vcHRpb25zLGk9bmV3IE1hcDtmb3IoY29uc3QgYSBvZiBlKXtjb25zdCBzPWEuX3pvZC5wcm9wVmFsdWVzPy5bbi5kaXNjcmltaW5hdG9yXTtpZighc3x8cy5zaXplPT09MCl0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZGlzY3JpbWluYXRlZCB1bmlvbiBvcHRpb24gYXQgaW5kZXggIiR7bi5vcHRpb25zLmluZGV4T2YoYSl9ImApO2Zvcihjb25zdCBjIG9mIHMpe2lmKGkuaGFzKGMpKXRocm93IG5ldyBFcnJvcihgRHVwbGljYXRlIGRpc2NyaW1pbmF0b3IgdmFsdWUgIiR7U3RyaW5nKGMpfSJgKTtpLnNldChjLGEpfX1yZXR1cm4gaX0pO3QuX3pvZC5wYXJzZT0oZSxpKT0+e2NvbnN0IGE9ZS52YWx1ZTtpZighSGUoYSkpcmV0dXJuIGUuaXNzdWVzLnB1c2goe2NvZGU6ImludmFsaWRfdHlwZSIsZXhwZWN0ZWQ6Im9iamVjdCIsaW5wdXQ6YSxpbnN0OnR9KSxlO2NvbnN0IHM9by52YWx1ZS5nZXQoYT8uW24uZGlzY3JpbWluYXRvcl0pO3JldHVybiBzP3MuX3pvZC5ydW4oZSxpKTpuLnVuaW9uRmFsbGJhY2t8fGkuZGlyZWN0aW9uPT09ImJhY2t3YXJkIj9yKGUsaSk6KGUuaXNzdWVzLnB1c2goe2NvZGU6ImludmFsaWRfdW5pb24iLGVycm9yczpbXSxub3RlOiJObyBtYXRjaGluZyBkaXNjcmltaW5hdG9yIixkaXNjcmltaW5hdG9yOm4uZGlzY3JpbWluYXRvcixvcHRpb25zOkFycmF5LmZyb20oby52YWx1ZS5rZXlzKCkpLGlucHV0OmEscGF0aDpbbi5kaXNjcmltaW5hdG9yXSxpbnN0OnR9KSxlKX19KSxybD1kKCIkWm9kSW50ZXJzZWN0aW9uIiwodCxuKT0+e3guaW5pdCh0LG4pLHQuX3pvZC5wYXJzZT0ocixvKT0+e2NvbnN0IGU9ci52YWx1ZSxpPW4ubGVmdC5fem9kLnJ1bih7dmFsdWU6ZSxpc3N1ZXM6W119LG8pLGE9bi5yaWdodC5fem9kLnJ1bih7dmFsdWU6ZSxpc3N1ZXM6W119LG8pO3JldHVybiBpIGluc3RhbmNlb2YgUHJvbWlzZXx8YSBpbnN0YW5jZW9mIFByb21pc2U/UHJvbWlzZS5hbGwoW2ksYV0pLnRoZW4oKFtjLHVdKT0+YnMocixjLHUpKTpicyhyLGksYSl9fSk7ZnVuY3Rpb24gbGkodCxuKXtpZih0PT09bilyZXR1cm57dmFsaWQ6ITAsZGF0YTp0fTtpZih0IGluc3RhbmNlb2YgRGF0ZSYmbiBpbnN0YW5jZW9mIERhdGUmJit0PT0rbilyZXR1cm57dmFsaWQ6ITAsZGF0YTp0fTtpZihEZSh0KSYmRGUobikpe2NvbnN0IHI9T2JqZWN0LmtleXMobiksbz1PYmplY3Qua2V5cyh0KS5maWx0ZXIoaT0+ci5pbmRleE9mKGkpIT09LTEpLGU9ey4uLnQsLi4ubn07Zm9yKGNvbnN0IGkgb2Ygbyl7Y29uc3QgYT1saSh0W2ldLG5baV0pO2lmKCFhLnZhbGlkKXJldHVybnt2YWxpZDohMSxtZXJnZUVycm9yUGF0aDpbaSwuLi5hLm1lcmdlRXJyb3JQYXRoXX07ZVtpXT1hLmRhdGF9cmV0dXJue3ZhbGlkOiEwLGRhdGE6ZX19aWYoQXJyYXkuaXNBcnJheSh0KSYmQXJyYXkuaXNBcnJheShuKSl7aWYodC5sZW5ndGghPT1uLmxlbmd0aClyZXR1cm57dmFsaWQ6ITEsbWVyZ2VFcnJvclBhdGg6W119O2NvbnN0IHI9W107Zm9yKGxldCBvPTA7bzx0Lmxlbmd0aDtvKyspe2NvbnN0IGU9dFtvXSxpPW5bb10sYT1saShlLGkpO2lmKCFhLnZhbGlkKXJldHVybnt2YWxpZDohMSxtZXJnZUVycm9yUGF0aDpbbywuLi5hLm1lcmdlRXJyb3JQYXRoXX07ci5wdXNoKGEuZGF0YSl9cmV0dXJue3ZhbGlkOiEwLGRhdGE6cn19cmV0dXJue3ZhbGlkOiExLG1lcmdlRXJyb3JQYXRoOltdfX1mdW5jdGlvbiBicyh0LG4scil7Y29uc3Qgbz1uZXcgTWFwO2xldCBlO2Zvcihjb25zdCBzIG9mIG4uaXNzdWVzKWlmKHMuY29kZT09PSJ1bnJlY29nbml6ZWRfa2V5cyIpe2U/PyhlPXMpO2Zvcihjb25zdCBjIG9mIHMua2V5cylvLmhhcyhjKXx8by5zZXQoYyx7fSksby5nZXQoYykubD0hMH1lbHNlIHQuaXNzdWVzLnB1c2gocyk7Zm9yKGNvbnN0IHMgb2Ygci5pc3N1ZXMpaWYocy5jb2RlPT09InVucmVjb2duaXplZF9rZXlzIilmb3IoY29uc3QgYyBvZiBzLmtleXMpby5oYXMoYyl8fG8uc2V0KGMse30pLG8uZ2V0KGMpLnI9ITA7ZWxzZSB0Lmlzc3Vlcy5wdXNoKHMpO2NvbnN0IGk9Wy4uLm9dLmZpbHRlcigoWyxzXSk9PnMubCYmcy5yKS5tYXAoKFtzXSk9PnMpO2lmKGkubGVuZ3RoJiZlJiZ0Lmlzc3Vlcy5wdXNoKHsuLi5lLGtleXM6aX0pLFBlKHQpKXJldHVybiB0O2NvbnN0IGE9bGkobi52YWx1ZSxyLnZhbHVlKTtpZighYS52YWxpZCl0aHJvdyBuZXcgRXJyb3IoYFVubWVyZ2FibGUgaW50ZXJzZWN0aW9uLiBFcnJvciBwYXRoOiAke0pTT04uc3RyaW5naWZ5KGEubWVyZ2VFcnJvclBhdGgpfWApO3JldHVybiB0LnZhbHVlPWEuZGF0YSx0fWNvbnN0IExpPWQoIiRab2RUdXBsZSIsKHQsbik9Pnt4LmluaXQodCxuKTtjb25zdCByPW4uaXRlbXM7dC5fem9kLnBhcnNlPShvLGUpPT57Y29uc3QgaT1vLnZhbHVlO2lmKCFBcnJheS5pc0FycmF5KGkpKXJldHVybiBvLmlzc3Vlcy5wdXNoKHtpbnB1dDppLGluc3Q6dCxleHBlY3RlZDoidHVwbGUiLGNvZGU6ImludmFsaWRfdHlwZSJ9KSxvO28udmFsdWU9W107Y29uc3QgYT1bXSxzPXlzKHIsIm9wdGluIiksYz15cyhyLCJvcHRvdXQiKTtpZighbi5yZXN0KXtpZihpLmxlbmd0aDxzKXJldHVybiBvLmlzc3Vlcy5wdXNoKHtjb2RlOiJ0b29fc21hbGwiLG1pbmltdW06cyxpbmNsdXNpdmU6ITAsaW5wdXQ6aSxpbnN0OnQsb3JpZ2luOiJhcnJheSJ9KSxvO2kubGVuZ3RoPnIubGVuZ3RoJiZvLmlzc3Vlcy5wdXNoKHtjb2RlOiJ0b29fYmlnIixtYXhpbXVtOnIubGVuZ3RoLGluY2x1c2l2ZTohMCxpbnB1dDppLGluc3Q6dCxvcmlnaW46ImFycmF5In0pfWNvbnN0IHU9bmV3IEFycmF5KHIubGVuZ3RoKTtmb3IobGV0IGw9MDtsPHIubGVuZ3RoO2wrKyl7Y29uc3QgZz1yW2xdLl96b2QucnVuKHt2YWx1ZTppW2xdLGlzc3VlczpbXX0sZSk7ZyBpbnN0YW5jZW9mIFByb21pc2U/YS5wdXNoKGcudGhlbih2PT57dVtsXT12fSkpOnVbbF09Z31pZihuLnJlc3Qpe2xldCBsPXIubGVuZ3RoLTE7Y29uc3QgZz1pLnNsaWNlKHIubGVuZ3RoKTtmb3IoY29uc3QgdiBvZiBnKXtsKys7Y29uc3QgJD1uLnJlc3QuX3pvZC5ydW4oe3ZhbHVlOnYsaXNzdWVzOltdfSxlKTskIGluc3RhbmNlb2YgUHJvbWlzZT9hLnB1c2goJC50aGVuKHk9PmtzKHksbyxsKSkpOmtzKCQsbyxsKX19cmV0dXJuIGEubGVuZ3RoP1Byb21pc2UuYWxsKGEpLnRoZW4oKCk9PlNzKHUsbyxyLGksYykpOlNzKHUsbyxyLGksYyl9fSk7ZnVuY3Rpb24geXModCxuKXtmb3IobGV0IHI9dC5sZW5ndGgtMTtyPj0wO3ItLSlpZih0W3JdLl96b2Rbbl0hPT0ib3B0aW9uYWwiKXJldHVybiByKzE7cmV0dXJuIDB9ZnVuY3Rpb24ga3ModCxuLHIpe3QuaXNzdWVzLmxlbmd0aCYmbi5pc3N1ZXMucHVzaCguLi5mZShyLHQuaXNzdWVzKSksbi52YWx1ZVtyXT10LnZhbHVlfWZ1bmN0aW9uIFNzKHQsbixyLG8sZSl7Zm9yKGxldCBpPTA7aTxyLmxlbmd0aDtpKyspe2NvbnN0IGE9dFtpXSxzPWk8by5sZW5ndGg7aWYoYS5pc3N1ZXMubGVuZ3RoKXtpZighcyYmaT49ZSl7bi52YWx1ZS5sZW5ndGg9aTticmVha31uLmlzc3Vlcy5wdXNoKC4uLmZlKGksYS5pc3N1ZXMpKX1uLnZhbHVlW2ldPWEudmFsdWV9Zm9yKGxldCBpPW4udmFsdWUubGVuZ3RoLTE7aT49by5sZW5ndGgmJihyW2ldLl96b2Qub3B0b3V0PT09Im9wdGlvbmFsIiYmbi52YWx1ZVtpXT09PXZvaWQgMCk7aS0tKW4udmFsdWUubGVuZ3RoPWk7cmV0dXJuIG59Y29uc3QgaWw9ZCgiJFpvZFJlY29yZCIsKHQsbik9Pnt4LmluaXQodCxuKSx0Ll96b2QucGFyc2U9KHIsbyk9Pntjb25zdCBlPXIudmFsdWU7aWYoIURlKGUpKXJldHVybiByLmlzc3Vlcy5wdXNoKHtleHBlY3RlZDoicmVjb3JkIixjb2RlOiJpbnZhbGlkX3R5cGUiLGlucHV0OmUsaW5zdDp0fSkscjtjb25zdCBpPVtdLGE9bi5rZXlUeXBlLl96b2QudmFsdWVzO2lmKGEpe3IudmFsdWU9e307Y29uc3Qgcz1uZXcgU2V0O2Zvcihjb25zdCB1IG9mIGEpaWYodHlwZW9mIHU9PSJzdHJpbmcifHx0eXBlb2YgdT09Im51bWJlciJ8fHR5cGVvZiB1PT0ic3ltYm9sIil7cy5hZGQodHlwZW9mIHU9PSJudW1iZXIiP3UudG9TdHJpbmcoKTp1KTtjb25zdCBsPW4ua2V5VHlwZS5fem9kLnJ1bih7dmFsdWU6dSxpc3N1ZXM6W119LG8pO2lmKGwgaW5zdGFuY2VvZiBQcm9taXNlKXRocm93IG5ldyBFcnJvcigiQXN5bmMgc2NoZW1hcyBub3Qgc3VwcG9ydGVkIGluIG9iamVjdCBrZXlzIGN1cnJlbnRseSIpO2lmKGwuaXNzdWVzLmxlbmd0aCl7ci5pc3N1ZXMucHVzaCh7Y29kZToiaW52YWxpZF9rZXkiLG9yaWdpbjoicmVjb3JkIixpc3N1ZXM6bC5pc3N1ZXMubWFwKCQ9PmxlKCQsbyxLKCkpKSxpbnB1dDp1LHBhdGg6W3VdLGluc3Q6dH0pO2NvbnRpbnVlfWNvbnN0IGc9bC52YWx1ZSx2PW4udmFsdWVUeXBlLl96b2QucnVuKHt2YWx1ZTplW3VdLGlzc3VlczpbXX0sbyk7diBpbnN0YW5jZW9mIFByb21pc2U/aS5wdXNoKHYudGhlbigkPT57JC5pc3N1ZXMubGVuZ3RoJiZyLmlzc3Vlcy5wdXNoKC4uLmZlKHUsJC5pc3N1ZXMpKSxyLnZhbHVlW2ddPSQudmFsdWV9KSk6KHYuaXNzdWVzLmxlbmd0aCYmci5pc3N1ZXMucHVzaCguLi5mZSh1LHYuaXNzdWVzKSksci52YWx1ZVtnXT12LnZhbHVlKX1sZXQgYztmb3IoY29uc3QgdSBpbiBlKXMuaGFzKHUpfHwoYz1jPz9bXSxjLnB1c2godSkpO2MmJmMubGVuZ3RoPjAmJnIuaXNzdWVzLnB1c2goe2NvZGU6InVucmVjb2duaXplZF9rZXlzIixpbnB1dDplLGluc3Q6dCxrZXlzOmN9KX1lbHNle3IudmFsdWU9e307Zm9yKGNvbnN0IHMgb2YgUmVmbGVjdC5vd25LZXlzKGUpKXtpZihzPT09Il9fcHJvdG9fXyJ8fCFPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoZSxzKSljb250aW51ZTtsZXQgYz1uLmtleVR5cGUuX3pvZC5ydW4oe3ZhbHVlOnMsaXNzdWVzOltdfSxvKTtpZihjIGluc3RhbmNlb2YgUHJvbWlzZSl0aHJvdyBuZXcgRXJyb3IoIkFzeW5jIHNjaGVtYXMgbm90IHN1cHBvcnRlZCBpbiBvYmplY3Qga2V5cyBjdXJyZW50bHkiKTtpZih0eXBlb2Ygcz09InN0cmluZyImJk5pLnRlc3QocykmJmMuaXNzdWVzLmxlbmd0aCl7Y29uc3QgZz1uLmtleVR5cGUuX3pvZC5ydW4oe3ZhbHVlOk51bWJlcihzKSxpc3N1ZXM6W119LG8pO2lmKGcgaW5zdGFuY2VvZiBQcm9taXNlKXRocm93IG5ldyBFcnJvcigiQXN5bmMgc2NoZW1hcyBub3Qgc3VwcG9ydGVkIGluIG9iamVjdCBrZXlzIGN1cnJlbnRseSIpO2cuaXNzdWVzLmxlbmd0aD09PTAmJihjPWcpfWlmKGMuaXNzdWVzLmxlbmd0aCl7bi5tb2RlPT09Imxvb3NlIj9yLnZhbHVlW3NdPWVbc106ci5pc3N1ZXMucHVzaCh7Y29kZToiaW52YWxpZF9rZXkiLG9yaWdpbjoicmVjb3JkIixpc3N1ZXM6Yy5pc3N1ZXMubWFwKGc9PmxlKGcsbyxLKCkpKSxpbnB1dDpzLHBhdGg6W3NdLGluc3Q6dH0pO2NvbnRpbnVlfWNvbnN0IGw9bi52YWx1ZVR5cGUuX3pvZC5ydW4oe3ZhbHVlOmVbc10saXNzdWVzOltdfSxvKTtsIGluc3RhbmNlb2YgUHJvbWlzZT9pLnB1c2gobC50aGVuKGc9PntnLmlzc3Vlcy5sZW5ndGgmJnIuaXNzdWVzLnB1c2goLi4uZmUocyxnLmlzc3VlcykpLHIudmFsdWVbYy52YWx1ZV09Zy52YWx1ZX0pKToobC5pc3N1ZXMubGVuZ3RoJiZyLmlzc3Vlcy5wdXNoKC4uLmZlKHMsbC5pc3N1ZXMpKSxyLnZhbHVlW2MudmFsdWVdPWwudmFsdWUpfX1yZXR1cm4gaS5sZW5ndGg/UHJvbWlzZS5hbGwoaSkudGhlbigoKT0+cik6cn19KSxvbD1kKCIkWm9kTWFwIiwodCxuKT0+e3guaW5pdCh0LG4pLHQuX3pvZC5wYXJzZT0ocixvKT0+e2NvbnN0IGU9ci52YWx1ZTtpZighKGUgaW5zdGFuY2VvZiBNYXApKXJldHVybiByLmlzc3Vlcy5wdXNoKHtleHBlY3RlZDoibWFwIixjb2RlOiJpbnZhbGlkX3R5cGUiLGlucHV0OmUsaW5zdDp0fSkscjtjb25zdCBpPVtdO3IudmFsdWU9bmV3IE1hcDtmb3IoY29uc3RbYSxzXW9mIGUpe2NvbnN0IGM9bi5rZXlUeXBlLl96b2QucnVuKHt2YWx1ZTphLGlzc3VlczpbXX0sbyksdT1uLnZhbHVlVHlwZS5fem9kLnJ1bih7dmFsdWU6cyxpc3N1ZXM6W119LG8pO2MgaW5zdGFuY2VvZiBQcm9taXNlfHx1IGluc3RhbmNlb2YgUHJvbWlzZT9pLnB1c2goUHJvbWlzZS5hbGwoW2MsdV0pLnRoZW4oKFtsLGddKT0+e3dzKGwsZyxyLGEsZSx0LG8pfSkpOndzKGMsdSxyLGEsZSx0LG8pfXJldHVybiBpLmxlbmd0aD9Qcm9taXNlLmFsbChpKS50aGVuKCgpPT5yKTpyfX0pO2Z1bmN0aW9uIHdzKHQsbixyLG8sZSxpLGEpe3QuaXNzdWVzLmxlbmd0aCYmKENuLmhhcyh0eXBlb2Ygbyk/ci5pc3N1ZXMucHVzaCguLi5mZShvLHQuaXNzdWVzKSk6ci5pc3N1ZXMucHVzaCh7Y29kZToiaW52YWxpZF9rZXkiLG9yaWdpbjoibWFwIixpbnB1dDplLGluc3Q6aSxpc3N1ZXM6dC5pc3N1ZXMubWFwKHM9PmxlKHMsYSxLKCkpKX0pKSxuLmlzc3Vlcy5sZW5ndGgmJihDbi5oYXModHlwZW9mIG8pP3IuaXNzdWVzLnB1c2goLi4uZmUobyxuLmlzc3VlcykpOnIuaXNzdWVzLnB1c2goe29yaWdpbjoibWFwIixjb2RlOiJpbnZhbGlkX2VsZW1lbnQiLGlucHV0OmUsaW5zdDppLGtleTpvLGlzc3VlczpuLmlzc3Vlcy5tYXAocz0+bGUocyxhLEsoKSkpfSkpLHIudmFsdWUuc2V0KHQudmFsdWUsbi52YWx1ZSl9Y29uc3QgYWw9ZCgiJFpvZFNldCIsKHQsbik9Pnt4LmluaXQodCxuKSx0Ll96b2QucGFyc2U9KHIsbyk9Pntjb25zdCBlPXIudmFsdWU7aWYoIShlIGluc3RhbmNlb2YgU2V0KSlyZXR1cm4gci5pc3N1ZXMucHVzaCh7aW5wdXQ6ZSxpbnN0OnQsZXhwZWN0ZWQ6InNldCIsY29kZToiaW52YWxpZF90eXBlIn0pLHI7Y29uc3QgaT1bXTtyLnZhbHVlPW5ldyBTZXQ7Zm9yKGNvbnN0IGEgb2YgZSl7Y29uc3Qgcz1uLnZhbHVlVHlwZS5fem9kLnJ1bih7dmFsdWU6YSxpc3N1ZXM6W119LG8pO3MgaW5zdGFuY2VvZiBQcm9taXNlP2kucHVzaChzLnRoZW4oYz0+SXMoYyxyKSkpOklzKHMscil9cmV0dXJuIGkubGVuZ3RoP1Byb21pc2UuYWxsKGkpLnRoZW4oKCk9PnIpOnJ9fSk7ZnVuY3Rpb24gSXModCxuKXt0Lmlzc3Vlcy5sZW5ndGgmJm4uaXNzdWVzLnB1c2goLi4udC5pc3N1ZXMpLG4udmFsdWUuYWRkKHQudmFsdWUpfWNvbnN0IHNsPWQoIiRab2RFbnVtIiwodCxuKT0+e3guaW5pdCh0LG4pO2NvbnN0IHI9dmkobi5lbnRyaWVzKSxvPW5ldyBTZXQocik7dC5fem9kLnZhbHVlcz1vLHQuX3pvZC5wYXR0ZXJuPW5ldyBSZWdFeHAoYF4oJHtyLmZpbHRlcihlPT5Dbi5oYXModHlwZW9mIGUpKS5tYXAoZT0+dHlwZW9mIGU9PSJzdHJpbmciP2JlKGUpOmUudG9TdHJpbmcoKSkuam9pbigifCIpfSkkYCksdC5fem9kLnBhcnNlPShlLGkpPT57Y29uc3QgYT1lLnZhbHVlO3JldHVybiBvLmhhcyhhKXx8ZS5pc3N1ZXMucHVzaCh7Y29kZToiaW52YWxpZF92YWx1ZSIsdmFsdWVzOnIsaW5wdXQ6YSxpbnN0OnR9KSxlfX0pLGNsPWQoIiRab2RMaXRlcmFsIiwodCxuKT0+e2lmKHguaW5pdCh0LG4pLG4udmFsdWVzLmxlbmd0aD09PTApdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgY3JlYXRlIGxpdGVyYWwgc2NoZW1hIHdpdGggbm8gdmFsaWQgdmFsdWVzIik7Y29uc3Qgcj1uZXcgU2V0KG4udmFsdWVzKTt0Ll96b2QudmFsdWVzPXIsdC5fem9kLnBhdHRlcm49bmV3IFJlZ0V4cChgXigke24udmFsdWVzLm1hcChvPT50eXBlb2Ygbz09InN0cmluZyI/YmUobyk6bz9iZShvLnRvU3RyaW5nKCkpOlN0cmluZyhvKSkuam9pbigifCIpfSkkYCksdC5fem9kLnBhcnNlPShvLGUpPT57Y29uc3QgaT1vLnZhbHVlO3JldHVybiByLmhhcyhpKXx8by5pc3N1ZXMucHVzaCh7Y29kZToiaW52YWxpZF92YWx1ZSIsdmFsdWVzOm4udmFsdWVzLGlucHV0OmksaW5zdDp0fSksb319KSx1bD1kKCIkWm9kRmlsZSIsKHQsbik9Pnt4LmluaXQodCxuKSx0Ll96b2QucGFyc2U9KHIsbyk9Pntjb25zdCBlPXIudmFsdWU7cmV0dXJuIGUgaW5zdGFuY2VvZiBGaWxlfHxyLmlzc3Vlcy5wdXNoKHtleHBlY3RlZDoiZmlsZSIsY29kZToiaW52YWxpZF90eXBlIixpbnB1dDplLGluc3Q6dH0pLHJ9fSksbGw9ZCgiJFpvZFRyYW5zZm9ybSIsKHQsbik9Pnt4LmluaXQodCxuKSx0Ll96b2Qub3B0aW49Im9wdGlvbmFsIix0Ll96b2QucGFyc2U9KHIsbyk9PntpZihvLmRpcmVjdGlvbj09PSJiYWNrd2FyZCIpdGhyb3cgbmV3IFduKHQuY29uc3RydWN0b3IubmFtZSk7Y29uc3QgZT1uLnRyYW5zZm9ybShyLnZhbHVlLHIpO2lmKG8uYXN5bmMpcmV0dXJuKGUgaW5zdGFuY2VvZiBQcm9taXNlP2U6UHJvbWlzZS5yZXNvbHZlKGUpKS50aGVuKGE9PihyLnZhbHVlPWEsci5mYWxsYmFjaz0hMCxyKSk7aWYoZSBpbnN0YW5jZW9mIFByb21pc2UpdGhyb3cgbmV3IE5lO3JldHVybiByLnZhbHVlPWUsci5mYWxsYmFjaz0hMCxyfX0pO2Z1bmN0aW9uIHpzKHQsbil7cmV0dXJuIG49PT12b2lkIDAmJih0Lmlzc3Vlcy5sZW5ndGh8fHQuZmFsbGJhY2spP3tpc3N1ZXM6W10sdmFsdWU6dm9pZCAwfTp0fWNvbnN0IE1pPWQoIiRab2RPcHRpb25hbCIsKHQsbik9Pnt4LmluaXQodCxuKSx0Ll96b2Qub3B0aW49Im9wdGlvbmFsIix0Ll96b2Qub3B0b3V0PSJvcHRpb25hbCIsTyh0Ll96b2QsInZhbHVlcyIsKCk9Pm4uaW5uZXJUeXBlLl96b2QudmFsdWVzP25ldyBTZXQoWy4uLm4uaW5uZXJUeXBlLl96b2QudmFsdWVzLHZvaWQgMF0pOnZvaWQgMCksTyh0Ll96b2QsInBhdHRlcm4iLCgpPT57Y29uc3Qgcj1uLmlubmVyVHlwZS5fem9kLnBhdHRlcm47cmV0dXJuIHI/bmV3IFJlZ0V4cChgXigke0JuKHIuc291cmNlKX0pPyRgKTp2b2lkIDB9KSx0Ll96b2QucGFyc2U9KHIsbyk9PntpZihuLmlubmVyVHlwZS5fem9kLm9wdGluPT09Im9wdGlvbmFsIil7Y29uc3QgZT1yLnZhbHVlLGk9bi5pbm5lclR5cGUuX3pvZC5ydW4ocixvKTtyZXR1cm4gaSBpbnN0YW5jZW9mIFByb21pc2U/aS50aGVuKGE9PnpzKGEsZSkpOnpzKGksZSl9cmV0dXJuIHIudmFsdWU9PT12b2lkIDA/cjpuLmlubmVyVHlwZS5fem9kLnJ1bihyLG8pfX0pLGRsPWQoIiRab2RFeGFjdE9wdGlvbmFsIiwodCxuKT0+e01pLmluaXQodCxuKSxPKHQuX3pvZCwidmFsdWVzIiwoKT0+bi5pbm5lclR5cGUuX3pvZC52YWx1ZXMpLE8odC5fem9kLCJwYXR0ZXJuIiwoKT0+bi5pbm5lclR5cGUuX3pvZC5wYXR0ZXJuKSx0Ll96b2QucGFyc2U9KHIsbyk9Pm4uaW5uZXJUeXBlLl96b2QucnVuKHIsbyl9KSxtbD1kKCIkWm9kTnVsbGFibGUiLCh0LG4pPT57eC5pbml0KHQsbiksTyh0Ll96b2QsIm9wdGluIiwoKT0+bi5pbm5lclR5cGUuX3pvZC5vcHRpbiksTyh0Ll96b2QsIm9wdG91dCIsKCk9Pm4uaW5uZXJUeXBlLl96b2Qub3B0b3V0KSxPKHQuX3pvZCwicGF0dGVybiIsKCk9Pntjb25zdCByPW4uaW5uZXJUeXBlLl96b2QucGF0dGVybjtyZXR1cm4gcj9uZXcgUmVnRXhwKGBeKCR7Qm4oci5zb3VyY2UpfXxudWxsKSRgKTp2b2lkIDB9KSxPKHQuX3pvZCwidmFsdWVzIiwoKT0+bi5pbm5lclR5cGUuX3pvZC52YWx1ZXM/bmV3IFNldChbLi4ubi5pbm5lclR5cGUuX3pvZC52YWx1ZXMsbnVsbF0pOnZvaWQgMCksdC5fem9kLnBhcnNlPShyLG8pPT5yLnZhbHVlPT09bnVsbD9yOm4uaW5uZXJUeXBlLl96b2QucnVuKHIsbyl9KSxwbD1kKCIkWm9kRGVmYXVsdCIsKHQsbik9Pnt4LmluaXQodCxuKSx0Ll96b2Qub3B0aW49Im9wdGlvbmFsIixPKHQuX3pvZCwidmFsdWVzIiwoKT0+bi5pbm5lclR5cGUuX3pvZC52YWx1ZXMpLHQuX3pvZC5wYXJzZT0ocixvKT0+e2lmKG8uZGlyZWN0aW9uPT09ImJhY2t3YXJkIilyZXR1cm4gbi5pbm5lclR5cGUuX3pvZC5ydW4ocixvKTtpZihyLnZhbHVlPT09dm9pZCAwKXJldHVybiByLnZhbHVlPW4uZGVmYXVsdFZhbHVlLHI7Y29uc3QgZT1uLmlubmVyVHlwZS5fem9kLnJ1bihyLG8pO3JldHVybiBlIGluc3RhbmNlb2YgUHJvbWlzZT9lLnRoZW4oaT0+eHMoaSxuKSk6eHMoZSxuKX19KTtmdW5jdGlvbiB4cyh0LG4pe3JldHVybiB0LnZhbHVlPT09dm9pZCAwJiYodC52YWx1ZT1uLmRlZmF1bHRWYWx1ZSksdH1jb25zdCBmbD1kKCIkWm9kUHJlZmF1bHQiLCh0LG4pPT57eC5pbml0KHQsbiksdC5fem9kLm9wdGluPSJvcHRpb25hbCIsTyh0Ll96b2QsInZhbHVlcyIsKCk9Pm4uaW5uZXJUeXBlLl96b2QudmFsdWVzKSx0Ll96b2QucGFyc2U9KHIsbyk9PihvLmRpcmVjdGlvbj09PSJiYWNrd2FyZCJ8fHIudmFsdWU9PT12b2lkIDAmJihyLnZhbHVlPW4uZGVmYXVsdFZhbHVlKSxuLmlubmVyVHlwZS5fem9kLnJ1bihyLG8pKX0pLGdsPWQoIiRab2ROb25PcHRpb25hbCIsKHQsbik9Pnt4LmluaXQodCxuKSxPKHQuX3pvZCwidmFsdWVzIiwoKT0+e2NvbnN0IHI9bi5pbm5lclR5cGUuX3pvZC52YWx1ZXM7cmV0dXJuIHI/bmV3IFNldChbLi4ucl0uZmlsdGVyKG89Pm8hPT12b2lkIDApKTp2b2lkIDB9KSx0Ll96b2QucGFyc2U9KHIsbyk9Pntjb25zdCBlPW4uaW5uZXJUeXBlLl96b2QucnVuKHIsbyk7cmV0dXJuIGUgaW5zdGFuY2VvZiBQcm9taXNlP2UudGhlbihpPT5UcyhpLHQpKTpUcyhlLHQpfX0pO2Z1bmN0aW9uIFRzKHQsbil7cmV0dXJuIXQuaXNzdWVzLmxlbmd0aCYmdC52YWx1ZT09PXZvaWQgMCYmdC5pc3N1ZXMucHVzaCh7Y29kZToiaW52YWxpZF90eXBlIixleHBlY3RlZDoibm9ub3B0aW9uYWwiLGlucHV0OnQudmFsdWUsaW5zdDpufSksdH1jb25zdCB2bD1kKCIkWm9kU3VjY2VzcyIsKHQsbik9Pnt4LmluaXQodCxuKSx0Ll96b2QucGFyc2U9KHIsbyk9PntpZihvLmRpcmVjdGlvbj09PSJiYWNrd2FyZCIpdGhyb3cgbmV3IFduKCJab2RTdWNjZXNzIik7Y29uc3QgZT1uLmlubmVyVHlwZS5fem9kLnJ1bihyLG8pO3JldHVybiBlIGluc3RhbmNlb2YgUHJvbWlzZT9lLnRoZW4oaT0+KHIudmFsdWU9aS5pc3N1ZXMubGVuZ3RoPT09MCxyKSk6KHIudmFsdWU9ZS5pc3N1ZXMubGVuZ3RoPT09MCxyKX19KSxobD1kKCIkWm9kQ2F0Y2giLCh0LG4pPT57eC5pbml0KHQsbiksdC5fem9kLm9wdGluPSJvcHRpb25hbCIsTyh0Ll96b2QsIm9wdG91dCIsKCk9Pm4uaW5uZXJUeXBlLl96b2Qub3B0b3V0KSxPKHQuX3pvZCwidmFsdWVzIiwoKT0+bi5pbm5lclR5cGUuX3pvZC52YWx1ZXMpLHQuX3pvZC5wYXJzZT0ocixvKT0+e2lmKG8uZGlyZWN0aW9uPT09ImJhY2t3YXJkIilyZXR1cm4gbi5pbm5lclR5cGUuX3pvZC5ydW4ocixvKTtjb25zdCBlPW4uaW5uZXJUeXBlLl96b2QucnVuKHIsbyk7cmV0dXJuIGUgaW5zdGFuY2VvZiBQcm9taXNlP2UudGhlbihpPT4oci52YWx1ZT1pLnZhbHVlLGkuaXNzdWVzLmxlbmd0aCYmKHIudmFsdWU9bi5jYXRjaFZhbHVlKHsuLi5yLGVycm9yOntpc3N1ZXM6aS5pc3N1ZXMubWFwKGE9PmxlKGEsbyxLKCkpKX0saW5wdXQ6ci52YWx1ZX0pLHIuaXNzdWVzPVtdLHIuZmFsbGJhY2s9ITApLHIpKTooci52YWx1ZT1lLnZhbHVlLGUuaXNzdWVzLmxlbmd0aCYmKHIudmFsdWU9bi5jYXRjaFZhbHVlKHsuLi5yLGVycm9yOntpc3N1ZXM6ZS5pc3N1ZXMubWFwKGk9PmxlKGksbyxLKCkpKX0saW5wdXQ6ci52YWx1ZX0pLHIuaXNzdWVzPVtdLHIuZmFsbGJhY2s9ITApLHIpfX0pLCRsPWQoIiRab2ROYU4iLCh0LG4pPT57eC5pbml0KHQsbiksdC5fem9kLnBhcnNlPShyLG8pPT4oKHR5cGVvZiByLnZhbHVlIT0ibnVtYmVyInx8IU51bWJlci5pc05hTihyLnZhbHVlKSkmJnIuaXNzdWVzLnB1c2goe2lucHV0OnIudmFsdWUsaW5zdDp0LGV4cGVjdGVkOiJuYW4iLGNvZGU6ImludmFsaWRfdHlwZSJ9KSxyKX0pLHFpPWQoIiRab2RQaXBlIiwodCxuKT0+e3guaW5pdCh0LG4pLE8odC5fem9kLCJ2YWx1ZXMiLCgpPT5uLmluLl96b2QudmFsdWVzKSxPKHQuX3pvZCwib3B0aW4iLCgpPT5uLmluLl96b2Qub3B0aW4pLE8odC5fem9kLCJvcHRvdXQiLCgpPT5uLm91dC5fem9kLm9wdG91dCksTyh0Ll96b2QsInByb3BWYWx1ZXMiLCgpPT5uLmluLl96b2QucHJvcFZhbHVlcyksdC5fem9kLnBhcnNlPShyLG8pPT57aWYoby5kaXJlY3Rpb249PT0iYmFja3dhcmQiKXtjb25zdCBpPW4ub3V0Ll96b2QucnVuKHIsbyk7cmV0dXJuIGkgaW5zdGFuY2VvZiBQcm9taXNlP2kudGhlbihhPT5ObihhLG4uaW4sbykpOk5uKGksbi5pbixvKX1jb25zdCBlPW4uaW4uX3pvZC5ydW4ocixvKTtyZXR1cm4gZSBpbnN0YW5jZW9mIFByb21pc2U/ZS50aGVuKGk9Pk5uKGksbi5vdXQsbykpOk5uKGUsbi5vdXQsbyl9fSk7ZnVuY3Rpb24gTm4odCxuLHIpe3JldHVybiB0Lmlzc3Vlcy5sZW5ndGg/KHQuYWJvcnRlZD0hMCx0KTpuLl96b2QucnVuKHt2YWx1ZTp0LnZhbHVlLGlzc3Vlczp0Lmlzc3VlcyxmYWxsYmFjazp0LmZhbGxiYWNrfSxyKX1jb25zdCBGaT1kKCIkWm9kQ29kZWMiLCh0LG4pPT57eC5pbml0KHQsbiksTyh0Ll96b2QsInZhbHVlcyIsKCk9Pm4uaW4uX3pvZC52YWx1ZXMpLE8odC5fem9kLCJvcHRpbiIsKCk9Pm4uaW4uX3pvZC5vcHRpbiksTyh0Ll96b2QsIm9wdG91dCIsKCk9Pm4ub3V0Ll96b2Qub3B0b3V0KSxPKHQuX3pvZCwicHJvcFZhbHVlcyIsKCk9Pm4uaW4uX3pvZC5wcm9wVmFsdWVzKSx0Ll96b2QucGFyc2U9KHIsbyk9PntpZigoby5kaXJlY3Rpb258fCJmb3J3YXJkIik9PT0iZm9yd2FyZCIpe2NvbnN0IGk9bi5pbi5fem9kLnJ1bihyLG8pO3JldHVybiBpIGluc3RhbmNlb2YgUHJvbWlzZT9pLnRoZW4oYT0+RG4oYSxuLG8pKTpEbihpLG4sbyl9ZWxzZXtjb25zdCBpPW4ub3V0Ll96b2QucnVuKHIsbyk7cmV0dXJuIGkgaW5zdGFuY2VvZiBQcm9taXNlP2kudGhlbihhPT5EbihhLG4sbykpOkRuKGksbixvKX19fSk7ZnVuY3Rpb24gRG4odCxuLHIpe2lmKHQuaXNzdWVzLmxlbmd0aClyZXR1cm4gdC5hYm9ydGVkPSEwLHQ7aWYoKHIuZGlyZWN0aW9ufHwiZm9yd2FyZCIpPT09ImZvcndhcmQiKXtjb25zdCBlPW4udHJhbnNmb3JtKHQudmFsdWUsdCk7cmV0dXJuIGUgaW5zdGFuY2VvZiBQcm9taXNlP2UudGhlbihpPT5Fbih0LGksbi5vdXQscikpOkVuKHQsZSxuLm91dCxyKX1lbHNle2NvbnN0IGU9bi5yZXZlcnNlVHJhbnNmb3JtKHQudmFsdWUsdCk7cmV0dXJuIGUgaW5zdGFuY2VvZiBQcm9taXNlP2UudGhlbihpPT5Fbih0LGksbi5pbixyKSk6RW4odCxlLG4uaW4scil9fWZ1bmN0aW9uIEVuKHQsbixyLG8pe3JldHVybiB0Lmlzc3Vlcy5sZW5ndGg/KHQuYWJvcnRlZD0hMCx0KTpyLl96b2QucnVuKHt2YWx1ZTpuLGlzc3Vlczp0Lmlzc3Vlc30sbyl9Y29uc3QgX2w9ZCgiJFpvZFByZXByb2Nlc3MiLCh0LG4pPT57cWkuaW5pdCh0LG4pfSksYmw9ZCgiJFpvZFJlYWRvbmx5IiwodCxuKT0+e3guaW5pdCh0LG4pLE8odC5fem9kLCJwcm9wVmFsdWVzIiwoKT0+bi5pbm5lclR5cGUuX3pvZC5wcm9wVmFsdWVzKSxPKHQuX3pvZCwidmFsdWVzIiwoKT0+bi5pbm5lclR5cGUuX3pvZC52YWx1ZXMpLE8odC5fem9kLCJvcHRpbiIsKCk9Pm4uaW5uZXJUeXBlPy5fem9kPy5vcHRpbiksTyh0Ll96b2QsIm9wdG91dCIsKCk9Pm4uaW5uZXJUeXBlPy5fem9kPy5vcHRvdXQpLHQuX3pvZC5wYXJzZT0ocixvKT0+e2lmKG8uZGlyZWN0aW9uPT09ImJhY2t3YXJkIilyZXR1cm4gbi5pbm5lclR5cGUuX3pvZC5ydW4ocixvKTtjb25zdCBlPW4uaW5uZXJUeXBlLl96b2QucnVuKHIsbyk7cmV0dXJuIGUgaW5zdGFuY2VvZiBQcm9taXNlP2UudGhlbihqcyk6anMoZSl9fSk7ZnVuY3Rpb24ganModCl7cmV0dXJuIHQudmFsdWU9T2JqZWN0LmZyZWV6ZSh0LnZhbHVlKSx0fWNvbnN0IHlsPWQoIiRab2RUZW1wbGF0ZUxpdGVyYWwiLCh0LG4pPT57eC5pbml0KHQsbik7Y29uc3Qgcj1bXTtmb3IoY29uc3QgbyBvZiBuLnBhcnRzKWlmKHR5cGVvZiBvPT0ib2JqZWN0IiYmbyE9PW51bGwpe2lmKCFvLl96b2QucGF0dGVybil0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgdGVtcGxhdGUgbGl0ZXJhbCBwYXJ0LCBubyBwYXR0ZXJuIGZvdW5kOiAke1suLi5vLl96b2QudHJhaXRzXS5zaGlmdCgpfWApO2NvbnN0IGU9by5fem9kLnBhdHRlcm4gaW5zdGFuY2VvZiBSZWdFeHA/by5fem9kLnBhdHRlcm4uc291cmNlOm8uX3pvZC5wYXR0ZXJuO2lmKCFlKXRocm93IG5ldyBFcnJvcihgSW52YWxpZCB0ZW1wbGF0ZSBsaXRlcmFsIHBhcnQ6ICR7by5fem9kLnRyYWl0c31gKTtjb25zdCBpPWUuc3RhcnRzV2l0aCgiXiIpPzE6MCxhPWUuZW5kc1dpdGgoIiQiKT9lLmxlbmd0aC0xOmUubGVuZ3RoO3IucHVzaChlLnNsaWNlKGksYSkpfWVsc2UgaWYobz09PW51bGx8fEtzLmhhcyh0eXBlb2Ygbykpci5wdXNoKGJlKGAke299YCkpO2Vsc2UgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHRlbXBsYXRlIGxpdGVyYWwgcGFydDogJHtvfWApO3QuX3pvZC5wYXR0ZXJuPW5ldyBSZWdFeHAoYF4ke3Iuam9pbigiIil9JGApLHQuX3pvZC5wYXJzZT0obyxlKT0+dHlwZW9mIG8udmFsdWUhPSJzdHJpbmciPyhvLmlzc3Vlcy5wdXNoKHtpbnB1dDpvLnZhbHVlLGluc3Q6dCxleHBlY3RlZDoic3RyaW5nIixjb2RlOiJpbnZhbGlkX3R5cGUifSksbyk6KHQuX3pvZC5wYXR0ZXJuLmxhc3RJbmRleD0wLHQuX3pvZC5wYXR0ZXJuLnRlc3Qoby52YWx1ZSl8fG8uaXNzdWVzLnB1c2goe2lucHV0Om8udmFsdWUsaW5zdDp0LGNvZGU6ImludmFsaWRfZm9ybWF0Iixmb3JtYXQ6bi5mb3JtYXQ/PyJ0ZW1wbGF0ZV9saXRlcmFsIixwYXR0ZXJuOnQuX3pvZC5wYXR0ZXJuLnNvdXJjZX0pLG8pfSksa2w9ZCgiJFpvZEZ1bmN0aW9uIiwodCxuKT0+KHguaW5pdCh0LG4pLHQuX2RlZj1uLHQuX3pvZC5kZWY9bix0LmltcGxlbWVudD1yPT57aWYodHlwZW9mIHIhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IEVycm9yKCJpbXBsZW1lbnQoKSBtdXN0IGJlIGNhbGxlZCB3aXRoIGEgZnVuY3Rpb24iKTtyZXR1cm4gZnVuY3Rpb24oLi4ubyl7Y29uc3QgZT10Ll9kZWYuaW5wdXQ/Y2kodC5fZGVmLmlucHV0LG8pOm8saT1SZWZsZWN0LmFwcGx5KHIsdGhpcyxlKTtyZXR1cm4gdC5fZGVmLm91dHB1dD9jaSh0Ll9kZWYub3V0cHV0LGkpOml9fSx0LmltcGxlbWVudEFzeW5jPXI9PntpZih0eXBlb2YgciE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgRXJyb3IoImltcGxlbWVudEFzeW5jKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBhIGZ1bmN0aW9uIik7cmV0dXJuIGFzeW5jIGZ1bmN0aW9uKC4uLm8pe2NvbnN0IGU9dC5fZGVmLmlucHV0P2F3YWl0IHVpKHQuX2RlZi5pbnB1dCxvKTpvLGk9YXdhaXQgUmVmbGVjdC5hcHBseShyLHRoaXMsZSk7cmV0dXJuIHQuX2RlZi5vdXRwdXQ/YXdhaXQgdWkodC5fZGVmLm91dHB1dCxpKTppfX0sdC5fem9kLnBhcnNlPShyLG8pPT50eXBlb2Ygci52YWx1ZSE9ImZ1bmN0aW9uIj8oci5pc3N1ZXMucHVzaCh7Y29kZToiaW52YWxpZF90eXBlIixleHBlY3RlZDoiZnVuY3Rpb24iLGlucHV0OnIudmFsdWUsaW5zdDp0fSkscik6KHQuX2RlZi5vdXRwdXQmJnQuX2RlZi5vdXRwdXQuX3pvZC5kZWYudHlwZT09PSJwcm9taXNlIj9yLnZhbHVlPXQuaW1wbGVtZW50QXN5bmMoci52YWx1ZSk6ci52YWx1ZT10LmltcGxlbWVudChyLnZhbHVlKSxyKSx0LmlucHV0PSguLi5yKT0+e2NvbnN0IG89dC5jb25zdHJ1Y3RvcjtyZXR1cm4gQXJyYXkuaXNBcnJheShyWzBdKT9uZXcgbyh7dHlwZToiZnVuY3Rpb24iLGlucHV0Om5ldyBMaSh7dHlwZToidHVwbGUiLGl0ZW1zOnJbMF0scmVzdDpyWzFdfSksb3V0cHV0OnQuX2RlZi5vdXRwdXR9KTpuZXcgbyh7dHlwZToiZnVuY3Rpb24iLGlucHV0OnJbMF0sb3V0cHV0OnQuX2RlZi5vdXRwdXR9KX0sdC5vdXRwdXQ9cj0+e2NvbnN0IG89dC5jb25zdHJ1Y3RvcjtyZXR1cm4gbmV3IG8oe3R5cGU6ImZ1bmN0aW9uIixpbnB1dDp0Ll9kZWYuaW5wdXQsb3V0cHV0OnJ9KX0sdCkpLFNsPWQoIiRab2RQcm9taXNlIiwodCxuKT0+e3guaW5pdCh0LG4pLHQuX3pvZC5wYXJzZT0ocixvKT0+UHJvbWlzZS5yZXNvbHZlKHIudmFsdWUpLnRoZW4oZT0+bi5pbm5lclR5cGUuX3pvZC5ydW4oe3ZhbHVlOmUsaXNzdWVzOltdfSxvKSl9KSx3bD1kKCIkWm9kTGF6eSIsKHQsbik9Pnt4LmluaXQodCxuKSxPKHQuX3pvZCwiaW5uZXJUeXBlIiwoKT0+e2NvbnN0IHI9bjtyZXR1cm4gci5fY2FjaGVkSW5uZXJ8fChyLl9jYWNoZWRJbm5lcj1uLmdldHRlcigpKSxyLl9jYWNoZWRJbm5lcn0pLE8odC5fem9kLCJwYXR0ZXJuIiwoKT0+dC5fem9kLmlubmVyVHlwZT8uX3pvZD8ucGF0dGVybiksTyh0Ll96b2QsInByb3BWYWx1ZXMiLCgpPT50Ll96b2QuaW5uZXJUeXBlPy5fem9kPy5wcm9wVmFsdWVzKSxPKHQuX3pvZCwib3B0aW4iLCgpPT50Ll96b2QuaW5uZXJUeXBlPy5fem9kPy5vcHRpbj8/dm9pZCAwKSxPKHQuX3pvZCwib3B0b3V0IiwoKT0+dC5fem9kLmlubmVyVHlwZT8uX3pvZD8ub3B0b3V0Pz92b2lkIDApLHQuX3pvZC5wYXJzZT0ocixvKT0+dC5fem9kLmlubmVyVHlwZS5fem9kLnJ1bihyLG8pfSksSWw9ZCgiJFpvZEN1c3RvbSIsKHQsbik9PntKLmluaXQodCxuKSx4LmluaXQodCxuKSx0Ll96b2QucGFyc2U9KHIsbyk9PnIsdC5fem9kLmNoZWNrPXI9Pntjb25zdCBvPXIudmFsdWUsZT1uLmZuKG8pO2lmKGUgaW5zdGFuY2VvZiBQcm9taXNlKXJldHVybiBlLnRoZW4oaT0+T3MoaSxyLG8sdCkpO09zKGUscixvLHQpfX0pO2Z1bmN0aW9uIE9zKHQsbixyLG8pe2lmKCF0KXtjb25zdCBlPXtjb2RlOiJjdXN0b20iLGlucHV0OnIsaW5zdDpvLHBhdGg6Wy4uLm8uX3pvZC5kZWYucGF0aD8/W11dLGNvbnRpbnVlOiFvLl96b2QuZGVmLmFib3J0fTtvLl96b2QuZGVmLnBhcmFtcyYmKGUucGFyYW1zPW8uX3pvZC5kZWYucGFyYW1zKSxuLmlzc3Vlcy5wdXNoKFdlKGUpKX19Y29uc3QgUnA9KCk9Pntjb25zdCB0PXtzdHJpbmc6e3VuaXQ6Itit2LHZgSIsdmVyYjoi2KPZhiDZitit2YjZiiJ9LGZpbGU6e3VuaXQ6Itio2KfZitiqIix2ZXJiOiLYo9mGINmK2K3ZiNmKIn0sYXJyYXk6e3VuaXQ6Iti52YbYtdixIix2ZXJiOiLYo9mGINmK2K3ZiNmKIn0sc2V0Ont1bml0OiLYudmG2LXYsSIsdmVyYjoi2KPZhiDZitit2YjZiiJ9fTtmdW5jdGlvbiBuKGUpe3JldHVybiB0W2VdPz9udWxsfWNvbnN0IHI9e3JlZ2V4OiLZhdiv2K7ZhCIsZW1haWw6Itio2LHZitivINil2YTZg9iq2LHZiNmG2YoiLHVybDoi2LHYp9io2LciLGVtb2ppOiLYpdmK2YXZiNis2YoiLHV1aWQ6IlVVSUQiLHV1aWR2NDoiVVVJRHY0Iix1dWlkdjY6IlVVSUR2NiIsbmFub2lkOiJuYW5vaWQiLGd1aWQ6IkdVSUQiLGN1aWQ6ImN1aWQiLGN1aWQyOiJjdWlkMiIsdWxpZDoiVUxJRCIseGlkOiJYSUQiLGtzdWlkOiJLU1VJRCIsZGF0ZXRpbWU6Itiq2KfYsdmK2K4g2YjZiNmC2Kog2KjZhdi52YrYp9ixIElTTyIsZGF0ZToi2KrYp9ix2YrYriDYqNmF2LnZitin2LEgSVNPIix0aW1lOiLZiNmC2Kog2KjZhdi52YrYp9ixIElTTyIsZHVyYXRpb246ItmF2K/YqSDYqNmF2LnZitin2LEgSVNPIixpcHY0OiLYudmG2YjYp9mGIElQdjQiLGlwdjY6Iti52YbZiNin2YYgSVB2NiIsY2lkcnY0OiLZhdiv2Ykg2LnZhtin2YjZitmGINio2LXZiti62KkgSVB2NCIsY2lkcnY2OiLZhdiv2Ykg2LnZhtin2YjZitmGINio2LXZiti62KkgSVB2NiIsYmFzZTY0OiLZhtmO2LUg2KjYqtix2YXZitiyIGJhc2U2NC1lbmNvZGVkIixiYXNlNjR1cmw6ItmG2Y7YtSDYqNiq2LHZhdmK2LIgYmFzZTY0dXJsLWVuY29kZWQiLGpzb25fc3RyaW5nOiLZhtmO2LUg2LnZhNmJINmH2YrYptipIEpTT04iLGUxNjQ6Itix2YLZhSDZh9in2KrZgSDYqNmF2LnZitin2LEgRS4xNjQiLGp3dDoiSldUIix0ZW1wbGF0ZV9saXRlcmFsOiLZhdiv2K7ZhCJ9LG89e25hbjoiTmFOIn07cmV0dXJuIGU9Pntzd2l0Y2goZS5jb2RlKXtjYXNlImludmFsaWRfdHlwZSI6e2NvbnN0IGk9b1tlLmV4cGVjdGVkXT8/ZS5leHBlY3RlZCxhPXcoZS5pbnB1dCkscz1vW2FdPz9hO3JldHVybi9eW0EtWl0vLnRlc3QoZS5leHBlY3RlZCk/YNmF2K/YrtmE2KfYqiDYutmK2LEg2YXZgtio2YjZhNipOiDZitmB2KrYsdi2INil2K/Yrtin2YQgaW5zdGFuY2VvZiAke2UuZXhwZWN0ZWR92Iwg2YjZhNmD2YYg2KrZhSDYpdiv2K7Yp9mEICR7c31gOmDZhdiv2K7ZhNin2Kog2LrZitixINmF2YLYqNmI2YTYqTog2YrZgdiq2LHYtiDYpdiv2K7Yp9mEICR7aX3YjCDZiNmE2YPZhiDYqtmFINil2K/Yrtin2YQgJHtzfWB9Y2FzZSJpbnZhbGlkX3ZhbHVlIjpyZXR1cm4gZS52YWx1ZXMubGVuZ3RoPT09MT9g2YXYr9iu2YTYp9iqINi62YrYsSDZhdmC2KjZiNmE2Kk6INmK2YHYqtix2LYg2KXYr9iu2KfZhCAke1MoZS52YWx1ZXNbMF0pfWA6YNin2K7YqtmK2KfYsSDYutmK2LEg2YXZgtio2YjZhDog2YrYqtmI2YLYuSDYp9mG2KrZgtin2KEg2KPYrdivINmH2LDZhyDYp9mE2K7Zitin2LHYp9iqOiAke18oZS52YWx1ZXMsInwiKX1gO2Nhc2UidG9vX2JpZyI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ijw9IjoiPCIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9gINij2YPYqNixINmF2YYg2KfZhNmE2KfYstmFOiDZitmB2KrYsdi2INij2YYg2KrZg9mI2YYgJHtlLm9yaWdpbj8/Itin2YTZgtmK2YXYqSJ9ICR7aX0gJHtlLm1heGltdW0udG9TdHJpbmcoKX0gJHthLnVuaXQ/PyLYudmG2LXYsSJ9YDpg2KPZg9io2LEg2YXZhiDYp9mE2YTYp9iy2YU6INmK2YHYqtix2LYg2KPZhiDYqtmD2YjZhiAke2Uub3JpZ2luPz8i2KfZhNmC2YrZhdipIn0gJHtpfSAke2UubWF4aW11bS50b1N0cmluZygpfWB9Y2FzZSJ0b29fc21hbGwiOntjb25zdCBpPWUuaW5jbHVzaXZlPyI+PSI6Ij4iLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YNij2LXYutixINmF2YYg2KfZhNmE2KfYstmFOiDZitmB2KrYsdi2INmE2YAgJHtlLm9yaWdpbn0g2KPZhiDZitmD2YjZhiAke2l9ICR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0fWA6YNij2LXYutixINmF2YYg2KfZhNmE2KfYstmFOiDZitmB2KrYsdi2INmE2YAgJHtlLm9yaWdpbn0g2KPZhiDZitmD2YjZhiAke2l9ICR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9YH1jYXNlImludmFsaWRfZm9ybWF0Ijp7Y29uc3QgaT1lO3JldHVybiBpLmZvcm1hdD09PSJzdGFydHNfd2l0aCI/YNmG2Y7YtSDYutmK2LEg2YXZgtio2YjZhDog2YrYrNioINij2YYg2YrYqNiv2KMg2KjZgCAiJHtlLnByZWZpeH0iYDppLmZvcm1hdD09PSJlbmRzX3dpdGgiP2DZhtmO2LUg2LrZitixINmF2YLYqNmI2YQ6INmK2KzYqCDYo9mGINmK2YbYqtmH2Yog2KjZgCAiJHtpLnN1ZmZpeH0iYDppLmZvcm1hdD09PSJpbmNsdWRlcyI/YNmG2Y7YtSDYutmK2LEg2YXZgtio2YjZhDog2YrYrNioINij2YYg2YrYqti22YXZkdmO2YYgIiR7aS5pbmNsdWRlc30iYDppLmZvcm1hdD09PSJyZWdleCI/YNmG2Y7YtSDYutmK2LEg2YXZgtio2YjZhDog2YrYrNioINij2YYg2YrYt9in2KjZgiDYp9mE2YbZhdi3ICR7aS5wYXR0ZXJufWA6YCR7cltpLmZvcm1hdF0/P2UuZm9ybWF0fSDYutmK2LEg2YXZgtio2YjZhGB9Y2FzZSJub3RfbXVsdGlwbGVfb2YiOnJldHVybmDYsdmC2YUg2LrZitixINmF2YLYqNmI2YQ6INmK2KzYqCDYo9mGINmK2YPZiNmGINmF2YYg2YXYttin2LnZgdin2KogJHtlLmRpdmlzb3J9YDtjYXNlInVucmVjb2duaXplZF9rZXlzIjpyZXR1cm5g2YXYudix2YEke2Uua2V5cy5sZW5ndGg+MT8i2KfYqiI6IiJ9INi62LHZitioJHtlLmtleXMubGVuZ3RoPjE/ItipIjoiIn06ICR7XyhlLmtleXMsItiMICIpfWA7Y2FzZSJpbnZhbGlkX2tleSI6cmV0dXJuYNmF2LnYsdmBINi62YrYsSDZhdmC2KjZiNmEINmB2YogJHtlLm9yaWdpbn1gO2Nhc2UiaW52YWxpZF91bmlvbiI6cmV0dXJuItmF2K/YrtmEINi62YrYsSDZhdmC2KjZiNmEIjtjYXNlImludmFsaWRfZWxlbWVudCI6cmV0dXJuYNmF2K/YrtmEINi62YrYsSDZhdmC2KjZiNmEINmB2YogJHtlLm9yaWdpbn1gO2RlZmF1bHQ6cmV0dXJuItmF2K/YrtmEINi62YrYsSDZhdmC2KjZiNmEIn19fTtmdW5jdGlvbiBDcCgpe3JldHVybntsb2NhbGVFcnJvcjpScCgpfX1jb25zdCBBcD0oKT0+e2NvbnN0IHQ9e3N0cmluZzp7dW5pdDoic2ltdm9sIix2ZXJiOiJvbG1hbMSxZMSxciJ9LGZpbGU6e3VuaXQ6ImJheXQiLHZlcmI6Im9sbWFsxLFkxLFyIn0sYXJyYXk6e3VuaXQ6ImVsZW1lbnQiLHZlcmI6Im9sbWFsxLFkxLFyIn0sc2V0Ont1bml0OiJlbGVtZW50Iix2ZXJiOiJvbG1hbMSxZMSxciJ9fTtmdW5jdGlvbiBuKGUpe3JldHVybiB0W2VdPz9udWxsfWNvbnN0IHI9e3JlZ2V4OiJpbnB1dCIsZW1haWw6ImVtYWlsIGFkZHJlc3MiLHVybDoiVVJMIixlbW9qaToiZW1vamkiLHV1aWQ6IlVVSUQiLHV1aWR2NDoiVVVJRHY0Iix1dWlkdjY6IlVVSUR2NiIsbmFub2lkOiJuYW5vaWQiLGd1aWQ6IkdVSUQiLGN1aWQ6ImN1aWQiLGN1aWQyOiJjdWlkMiIsdWxpZDoiVUxJRCIseGlkOiJYSUQiLGtzdWlkOiJLU1VJRCIsZGF0ZXRpbWU6IklTTyBkYXRldGltZSIsZGF0ZToiSVNPIGRhdGUiLHRpbWU6IklTTyB0aW1lIixkdXJhdGlvbjoiSVNPIGR1cmF0aW9uIixpcHY0OiJJUHY0IGFkZHJlc3MiLGlwdjY6IklQdjYgYWRkcmVzcyIsY2lkcnY0OiJJUHY0IHJhbmdlIixjaWRydjY6IklQdjYgcmFuZ2UiLGJhc2U2NDoiYmFzZTY0LWVuY29kZWQgc3RyaW5nIixiYXNlNjR1cmw6ImJhc2U2NHVybC1lbmNvZGVkIHN0cmluZyIsanNvbl9zdHJpbmc6IkpTT04gc3RyaW5nIixlMTY0OiJFLjE2NCBudW1iZXIiLGp3dDoiSldUIix0ZW1wbGF0ZV9saXRlcmFsOiJpbnB1dCJ9LG89e25hbjoiTmFOIn07cmV0dXJuIGU9Pntzd2l0Y2goZS5jb2RlKXtjYXNlImludmFsaWRfdHlwZSI6e2NvbnN0IGk9b1tlLmV4cGVjdGVkXT8/ZS5leHBlY3RlZCxhPXcoZS5pbnB1dCkscz1vW2FdPz9hO3JldHVybi9eW0EtWl0vLnRlc3QoZS5leHBlY3RlZCk/YFlhbmzEscWfIGTJmXnJmXI6IGfDtnpsyZluaWzJmW4gaW5zdGFuY2VvZiAke2UuZXhwZWN0ZWR9LCBkYXhpbCBvbGFuICR7c31gOmBZYW5sxLHFnyBkyZl5yZlyOiBnw7Z6bMmZbmlsyZluICR7aX0sIGRheGlsIG9sYW4gJHtzfWB9Y2FzZSJpbnZhbGlkX3ZhbHVlIjpyZXR1cm4gZS52YWx1ZXMubGVuZ3RoPT09MT9gWWFubMSxxZ8gZMmZecmZcjogZ8O2emzJmW5pbMmZbiAke1MoZS52YWx1ZXNbMF0pfWA6YFlhbmzEscWfIHNlw6dpbTogYcWfYcSfxLFkYWvEsWxhcmRhbiBiaXJpIG9sbWFsxLFkxLFyOiAke18oZS52YWx1ZXMsInwiKX1gO2Nhc2UidG9vX2JpZyI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ijw9IjoiPCIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9gw4dveCBiw7Z5w7xrOiBnw7Z6bMmZbmlsyZluICR7ZS5vcmlnaW4/PyJkyZl5yZlyIn0gJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0Pz8iZWxlbWVudCJ9YDpgw4dveCBiw7Z5w7xrOiBnw7Z6bMmZbmlsyZluICR7ZS5vcmlnaW4/PyJkyZl5yZlyIn0gJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9YH1jYXNlInRvb19zbWFsbCI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ij49IjoiPiIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9gw4dveCBracOnaWs6IGfDtnpsyZluaWzJmW4gJHtlLm9yaWdpbn0gJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0fWA6YMOHb3gga2nDp2lrOiBnw7Z6bMmZbmlsyZluICR7ZS5vcmlnaW59ICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfWB9Y2FzZSJpbnZhbGlkX2Zvcm1hdCI6e2NvbnN0IGk9ZTtyZXR1cm4gaS5mb3JtYXQ9PT0ic3RhcnRzX3dpdGgiP2BZYW5sxLHFnyBtyZl0bjogIiR7aS5wcmVmaXh9IiBpbMmZIGJhxZ9sYW1hbMSxZMSxcmA6aS5mb3JtYXQ9PT0iZW5kc193aXRoIj9gWWFubMSxxZ8gbcmZdG46ICIke2kuc3VmZml4fSIgaWzJmSBiaXRtyZlsaWRpcmA6aS5mb3JtYXQ9PT0iaW5jbHVkZXMiP2BZYW5sxLHFnyBtyZl0bjogIiR7aS5pbmNsdWRlc30iIGRheGlsIG9sbWFsxLFkxLFyYDppLmZvcm1hdD09PSJyZWdleCI/YFlhbmzEscWfIG3JmXRuOiAke2kucGF0dGVybn0gxZ9hYmxvbnVuYSB1ecSfdW4gb2xtYWzEsWTEsXJgOmBZYW5sxLHFnyAke3JbaS5mb3JtYXRdPz9lLmZvcm1hdH1gfWNhc2Uibm90X211bHRpcGxlX29mIjpyZXR1cm5gWWFubMSxxZ8gyZlkyZlkOiAke2UuZGl2aXNvcn0gaWzJmSBiw7Zsw7xuyZkgYmlsyZluIG9sbWFsxLFkxLFyYDtjYXNlInVucmVjb2duaXplZF9rZXlzIjpyZXR1cm5gVGFuxLFubWF5YW4gYcOnYXIke2Uua2V5cy5sZW5ndGg+MT8ibGFyIjoiIn06ICR7XyhlLmtleXMsIiwgIil9YDtjYXNlImludmFsaWRfa2V5IjpyZXR1cm5gJHtlLm9yaWdpbn0gZGF4aWxpbmTJmSB5YW5sxLHFnyBhw6dhcmA7Y2FzZSJpbnZhbGlkX3VuaW9uIjpyZXR1cm4iWWFubMSxxZ8gZMmZecmZciI7Y2FzZSJpbnZhbGlkX2VsZW1lbnQiOnJldHVybmAke2Uub3JpZ2lufSBkYXhpbGluZMmZIHlhbmzEscWfIGTJmXnJmXJgO2RlZmF1bHQ6cmV0dXJuIllhbmzEscWfIGTJmXnJmXIifX19O2Z1bmN0aW9uIExwKCl7cmV0dXJue2xvY2FsZUVycm9yOkFwKCl9fWZ1bmN0aW9uIFVzKHQsbixyLG8pe2NvbnN0IGU9TWF0aC5hYnModCksaT1lJTEwLGE9ZSUxMDA7cmV0dXJuIGE+PTExJiZhPD0xOT9vOmk9PT0xP246aT49MiYmaTw9ND9yOm99Y29uc3QgTXA9KCk9Pntjb25zdCB0PXtzdHJpbmc6e3VuaXQ6e29uZToi0YHRltC80LLQsNC7IixmZXc6ItGB0ZbQvNCy0LDQu9GLIixtYW55OiLRgdGW0LzQstCw0LvQsNGeIn0sdmVyYjoi0LzQtdGG0YwifSxhcnJheTp7dW5pdDp7b25lOiLRjdC70LXQvNC10L3RgiIsZmV3OiLRjdC70LXQvNC10L3RgtGLIixtYW55OiLRjdC70LXQvNC10L3RgtCw0Z4ifSx2ZXJiOiLQvNC10YbRjCJ9LHNldDp7dW5pdDp7b25lOiLRjdC70LXQvNC10L3RgiIsZmV3OiLRjdC70LXQvNC10L3RgtGLIixtYW55OiLRjdC70LXQvNC10L3RgtCw0Z4ifSx2ZXJiOiLQvNC10YbRjCJ9LGZpbGU6e3VuaXQ6e29uZToi0LHQsNC50YIiLGZldzoi0LHQsNC50YLRiyIsbWFueToi0LHQsNC50YLQsNGeIn0sdmVyYjoi0LzQtdGG0YwifX07ZnVuY3Rpb24gbihlKXtyZXR1cm4gdFtlXT8/bnVsbH1jb25zdCByPXtyZWdleDoi0YPQstC+0LQiLGVtYWlsOiJlbWFpbCDQsNC00YDQsNGBIix1cmw6IlVSTCIsZW1vamk6ItGN0LzQvtC00LfRliIsdXVpZDoiVVVJRCIsdXVpZHY0OiJVVUlEdjQiLHV1aWR2NjoiVVVJRHY2IixuYW5vaWQ6Im5hbm9pZCIsZ3VpZDoiR1VJRCIsY3VpZDoiY3VpZCIsY3VpZDI6ImN1aWQyIix1bGlkOiJVTElEIix4aWQ6IlhJRCIsa3N1aWQ6IktTVUlEIixkYXRldGltZToiSVNPINC00LDRgtCwINGWINGH0LDRgSIsZGF0ZToiSVNPINC00LDRgtCwIix0aW1lOiJJU08g0YfQsNGBIixkdXJhdGlvbjoiSVNPINC/0YDQsNGG0Y/Qs9C70LDRgdGG0YwiLGlwdjQ6IklQdjQg0LDQtNGA0LDRgSIsaXB2NjoiSVB2NiDQsNC00YDQsNGBIixjaWRydjQ6IklQdjQg0LTRi9GP0L/QsNC30L7QvSIsY2lkcnY2OiJJUHY2INC00YvRj9C/0LDQt9C+0L0iLGJhc2U2NDoi0YDQsNC00L7QuiDRgyDRhNCw0YDQvNCw0YbQtSBiYXNlNjQiLGJhc2U2NHVybDoi0YDQsNC00L7QuiDRgyDRhNCw0YDQvNCw0YbQtSBiYXNlNjR1cmwiLGpzb25fc3RyaW5nOiJKU09OINGA0LDQtNC+0LoiLGUxNjQ6ItC90YPQvNCw0YAgRS4xNjQiLGp3dDoiSldUIix0ZW1wbGF0ZV9saXRlcmFsOiLRg9Cy0L7QtCJ9LG89e25hbjoiTmFOIixudW1iZXI6ItC70ZbQuiIsYXJyYXk6ItC80LDRgdGW0Z4ifTtyZXR1cm4gZT0+e3N3aXRjaChlLmNvZGUpe2Nhc2UiaW52YWxpZF90eXBlIjp7Y29uc3QgaT1vW2UuZXhwZWN0ZWRdPz9lLmV4cGVjdGVkLGE9dyhlLmlucHV0KSxzPW9bYV0/P2E7cmV0dXJuL15bQS1aXS8udGVzdChlLmV4cGVjdGVkKT9g0J3Rj9C/0YDQsNCy0ZbQu9GM0L3RiyDRntCy0L7QtDog0YfQsNC60LDRntGB0Y8gaW5zdGFuY2VvZiAke2UuZXhwZWN0ZWR9LCDQsNGC0YDRi9C80LDQvdCwICR7c31gOmDQndGP0L/RgNCw0LLRltC70YzQvdGLINGe0LLQvtC0OiDRh9Cw0LrQsNGe0YHRjyAke2l9LCDQsNGC0YDRi9C80LDQvdCwICR7c31gfWNhc2UiaW52YWxpZF92YWx1ZSI6cmV0dXJuIGUudmFsdWVzLmxlbmd0aD09PTE/YNCd0Y/Qv9GA0LDQstGW0LvRjNC90Ysg0Z7QstC+0LQ6INGH0LDQutCw0LvQsNGB0Y8gJHtTKGUudmFsdWVzWzBdKX1gOmDQndGP0L/RgNCw0LLRltC70YzQvdGLINCy0LDRgNGL0Y/QvdGCOiDRh9Cw0LrQsNGe0YHRjyDQsNC00LfRltC9INC3ICR7XyhlLnZhbHVlcywifCIpfWA7Y2FzZSJ0b29fYmlnIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPD0iOiI8IixhPW4oZS5vcmlnaW4pO2lmKGEpe2NvbnN0IHM9TnVtYmVyKGUubWF4aW11bSksYz1VcyhzLGEudW5pdC5vbmUsYS51bml0LmZldyxhLnVuaXQubWFueSk7cmV0dXJuYNCX0LDQvdCw0LTRgtCwINCy0Y/Qu9GW0LrRljog0YfQsNC60LDQu9Cw0YHRjywg0YjRgtC+ICR7ZS5vcmlnaW4/PyLQt9C90LDRh9GN0L3QvdC1In0g0L/QsNCy0ZbQvdC90LAgJHthLnZlcmJ9ICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfSAke2N9YH1yZXR1cm5g0JfQsNC90LDQtNGC0LAg0LLRj9C70ZbQutGWOiDRh9Cw0LrQsNC70LDRgdGPLCDRiNGC0L4gJHtlLm9yaWdpbj8/ItC30L3QsNGH0Y3QvdC90LUifSDQv9Cw0LLRltC90L3QsCDQsdGL0YbRjCAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX1gfWNhc2UidG9vX3NtYWxsIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPj0iOiI+IixhPW4oZS5vcmlnaW4pO2lmKGEpe2NvbnN0IHM9TnVtYmVyKGUubWluaW11bSksYz1VcyhzLGEudW5pdC5vbmUsYS51bml0LmZldyxhLnVuaXQubWFueSk7cmV0dXJuYNCX0LDQvdCw0LTRgtCwINC80LDQu9GLOiDRh9Cw0LrQsNC70LDRgdGPLCDRiNGC0L4gJHtlLm9yaWdpbn0g0L/QsNCy0ZbQvdC90LAgJHthLnZlcmJ9ICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfSAke2N9YH1yZXR1cm5g0JfQsNC90LDQtNGC0LAg0LzQsNC70Ys6INGH0LDQutCw0LvQsNGB0Y8sINGI0YLQviAke2Uub3JpZ2lufSDQv9Cw0LLRltC90L3QsCDQsdGL0YbRjCAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX1gfWNhc2UiaW52YWxpZF9mb3JtYXQiOntjb25zdCBpPWU7cmV0dXJuIGkuZm9ybWF0PT09InN0YXJ0c193aXRoIj9g0J3Rj9C/0YDQsNCy0ZbQu9GM0L3RiyDRgNCw0LTQvtC6OiDQv9Cw0LLRltC90LXQvSDQv9Cw0YfRi9C90LDRhtGG0LAg0LcgIiR7aS5wcmVmaXh9ImA6aS5mb3JtYXQ9PT0iZW5kc193aXRoIj9g0J3Rj9C/0YDQsNCy0ZbQu9GM0L3RiyDRgNCw0LTQvtC6OiDQv9Cw0LLRltC90LXQvSDQt9Cw0LrQsNC90YfQstCw0YbRhtCwINC90LAgIiR7aS5zdWZmaXh9ImA6aS5mb3JtYXQ9PT0iaW5jbHVkZXMiP2DQndGP0L/RgNCw0LLRltC70YzQvdGLINGA0LDQtNC+0Lo6INC/0LDQstGW0L3QtdC9INC30LzRj9GI0YfQsNGG0YwgIiR7aS5pbmNsdWRlc30iYDppLmZvcm1hdD09PSJyZWdleCI/YNCd0Y/Qv9GA0LDQstGW0LvRjNC90Ysg0YDQsNC00L7Qujog0L/QsNCy0ZbQvdC10L0g0LDQtNC/0LDQstGP0LTQsNGG0Ywg0YjQsNCx0LvQvtC90YMgJHtpLnBhdHRlcm59YDpg0J3Rj9C/0YDQsNCy0ZbQu9GM0L3RiyAke3JbaS5mb3JtYXRdPz9lLmZvcm1hdH1gfWNhc2Uibm90X211bHRpcGxlX29mIjpyZXR1cm5g0J3Rj9C/0YDQsNCy0ZbQu9GM0L3RiyDQu9GW0Lo6INC/0LDQstGW0L3QtdC9INCx0YvRhtGMINC60YDQsNGC0L3Ri9C8ICR7ZS5kaXZpc29yfWA7Y2FzZSJ1bnJlY29nbml6ZWRfa2V5cyI6cmV0dXJuYNCd0LXRgNCw0YHQv9Cw0LfQvdCw0L3RiyAke2Uua2V5cy5sZW5ndGg+MT8i0LrQu9GO0YfRiyI6ItC60LvRjtGHIn06ICR7XyhlLmtleXMsIiwgIil9YDtjYXNlImludmFsaWRfa2V5IjpyZXR1cm5g0J3Rj9C/0YDQsNCy0ZbQu9GM0L3RiyDQutC70Y7RhyDRgyAke2Uub3JpZ2lufWA7Y2FzZSJpbnZhbGlkX3VuaW9uIjpyZXR1cm4i0J3Rj9C/0YDQsNCy0ZbQu9GM0L3RiyDRntCy0L7QtCI7Y2FzZSJpbnZhbGlkX2VsZW1lbnQiOnJldHVybmDQndGP0L/RgNCw0LLRltC70YzQvdCw0LUg0LfQvdCw0YfRjdC90L3QtSDRniAke2Uub3JpZ2lufWA7ZGVmYXVsdDpyZXR1cm4i0J3Rj9C/0YDQsNCy0ZbQu9GM0L3RiyDRntCy0L7QtCJ9fX07ZnVuY3Rpb24gcXAoKXtyZXR1cm57bG9jYWxlRXJyb3I6TXAoKX19Y29uc3QgRnA9KCk9Pntjb25zdCB0PXtzdHJpbmc6e3VuaXQ6ItGB0LjQvNCy0L7Qu9CwIix2ZXJiOiLQtNCwINGB0YrQtNGK0YDQttCwIn0sZmlsZTp7dW5pdDoi0LHQsNC50YLQsCIsdmVyYjoi0LTQsCDRgdGK0LTRitGA0LbQsCJ9LGFycmF5Ont1bml0OiLQtdC70LXQvNC10L3RgtCwIix2ZXJiOiLQtNCwINGB0YrQtNGK0YDQttCwIn0sc2V0Ont1bml0OiLQtdC70LXQvNC10L3RgtCwIix2ZXJiOiLQtNCwINGB0YrQtNGK0YDQttCwIn19O2Z1bmN0aW9uIG4oZSl7cmV0dXJuIHRbZV0/P251bGx9Y29uc3Qgcj17cmVnZXg6ItCy0YXQvtC0IixlbWFpbDoi0LjQvNC10LnQuyDQsNC00YDQtdGBIix1cmw6IlVSTCIsZW1vamk6ItC10LzQvtC00LbQuCIsdXVpZDoiVVVJRCIsdXVpZHY0OiJVVUlEdjQiLHV1aWR2NjoiVVVJRHY2IixuYW5vaWQ6Im5hbm9pZCIsZ3VpZDoiR1VJRCIsY3VpZDoiY3VpZCIsY3VpZDI6ImN1aWQyIix1bGlkOiJVTElEIix4aWQ6IlhJRCIsa3N1aWQ6IktTVUlEIixkYXRldGltZToiSVNPINCy0YDQtdC80LUiLGRhdGU6IklTTyDQtNCw0YLQsCIsdGltZToiSVNPINCy0YDQtdC80LUiLGR1cmF0aW9uOiJJU08g0L/RgNC+0LTRitC70LbQuNGC0LXQu9C90L7RgdGCIixpcHY0OiJJUHY0INCw0LTRgNC10YEiLGlwdjY6IklQdjYg0LDQtNGA0LXRgSIsY2lkcnY0OiJJUHY0INC00LjQsNC/0LDQt9C+0L0iLGNpZHJ2NjoiSVB2NiDQtNC40LDQv9Cw0LfQvtC9IixiYXNlNjQ6ImJhc2U2NC3QutC+0LTQuNGA0LDQvSDQvdC40LciLGJhc2U2NHVybDoiYmFzZTY0dXJsLdC60L7QtNC40YDQsNC9INC90LjQtyIsanNvbl9zdHJpbmc6IkpTT04g0L3QuNC3IixlMTY0OiJFLjE2NCDQvdC+0LzQtdGAIixqd3Q6IkpXVCIsdGVtcGxhdGVfbGl0ZXJhbDoi0LLRhdC+0LQifSxvPXtuYW46Ik5hTiIsbnVtYmVyOiLRh9C40YHQu9C+IixhcnJheToi0LzQsNGB0LjQsiJ9O3JldHVybiBlPT57c3dpdGNoKGUuY29kZSl7Y2FzZSJpbnZhbGlkX3R5cGUiOntjb25zdCBpPW9bZS5leHBlY3RlZF0/P2UuZXhwZWN0ZWQsYT13KGUuaW5wdXQpLHM9b1thXT8/YTtyZXR1cm4vXltBLVpdLy50ZXN0KGUuZXhwZWN0ZWQpP2DQndC10LLQsNC70LjQtNC10L0g0LLRhdC+0LQ6INC+0YfQsNC60LLQsNC9IGluc3RhbmNlb2YgJHtlLmV4cGVjdGVkfSwg0L/QvtC70YPRh9C10L0gJHtzfWA6YNCd0LXQstCw0LvQuNC00LXQvSDQstGF0L7QtDog0L7Rh9Cw0LrQstCw0L0gJHtpfSwg0L/QvtC70YPRh9C10L0gJHtzfWB9Y2FzZSJpbnZhbGlkX3ZhbHVlIjpyZXR1cm4gZS52YWx1ZXMubGVuZ3RoPT09MT9g0J3QtdCy0LDQu9C40LTQtdC9INCy0YXQvtC0OiDQvtGH0LDQutCy0LDQvSAke1MoZS52YWx1ZXNbMF0pfWA6YNCd0LXQstCw0LvQuNC00L3QsCDQvtC/0YbQuNGPOiDQvtGH0LDQutCy0LDQvdC+INC10LTQvdC+INC+0YIgJHtfKGUudmFsdWVzLCJ8Iil9YDtjYXNlInRvb19iaWciOntjb25zdCBpPWUuaW5jbHVzaXZlPyI8PSI6IjwiLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YNCi0LLRitGA0LTQtSDQs9C+0LvRj9C80L46INC+0YfQsNC60LLQsCDRgdC1ICR7ZS5vcmlnaW4/PyLRgdGC0L7QudC90L7RgdGCIn0g0LTQsCDRgdGK0LTRitGA0LbQsCAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX0gJHthLnVuaXQ/PyLQtdC70LXQvNC10L3RgtCwIn1gOmDQotCy0YrRgNC00LUg0LPQvtC70Y/QvNC+OiDQvtGH0LDQutCy0LAg0YHQtSAke2Uub3JpZ2luPz8i0YHRgtC+0LnQvdC+0YHRgiJ9INC00LAg0LHRitC00LUgJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9YH1jYXNlInRvb19zbWFsbCI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ij49IjoiPiIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9g0KLQstGK0YDQtNC1INC80LDQu9C60L46INC+0YfQsNC60LLQsCDRgdC1ICR7ZS5vcmlnaW59INC00LAg0YHRitC00YrRgNC20LAgJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0fWA6YNCi0LLRitGA0LTQtSDQvNCw0LvQutC+OiDQvtGH0LDQutCy0LAg0YHQtSAke2Uub3JpZ2lufSDQtNCwINCx0YrQtNC1ICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfWB9Y2FzZSJpbnZhbGlkX2Zvcm1hdCI6e2NvbnN0IGk9ZTtpZihpLmZvcm1hdD09PSJzdGFydHNfd2l0aCIpcmV0dXJuYNCd0LXQstCw0LvQuNC00LXQvSDQvdC40Lc6INGC0YDRj9Cx0LLQsCDQtNCwINC30LDQv9C+0YfQstCwINGBICIke2kucHJlZml4fSJgO2lmKGkuZm9ybWF0PT09ImVuZHNfd2l0aCIpcmV0dXJuYNCd0LXQstCw0LvQuNC00LXQvSDQvdC40Lc6INGC0YDRj9Cx0LLQsCDQtNCwINC30LDQstGK0YDRiNCy0LAg0YEgIiR7aS5zdWZmaXh9ImA7aWYoaS5mb3JtYXQ9PT0iaW5jbHVkZXMiKXJldHVybmDQndC10LLQsNC70LjQtNC10L0g0L3QuNC3OiDRgtGA0Y/QsdCy0LAg0LTQsCDQstC60LvRjtGH0LLQsCAiJHtpLmluY2x1ZGVzfSJgO2lmKGkuZm9ybWF0PT09InJlZ2V4IilyZXR1cm5g0J3QtdCy0LDQu9C40LTQtdC9INC90LjQtzog0YLRgNGP0LHQstCwINC00LAg0YHRitCy0L/QsNC00LAg0YEgJHtpLnBhdHRlcm59YDtsZXQgYT0i0J3QtdCy0LDQu9C40LTQtdC9IjtyZXR1cm4gaS5mb3JtYXQ9PT0iZW1vamkiJiYoYT0i0J3QtdCy0LDQu9C40LTQvdC+IiksaS5mb3JtYXQ9PT0iZGF0ZXRpbWUiJiYoYT0i0J3QtdCy0LDQu9C40LTQvdC+IiksaS5mb3JtYXQ9PT0iZGF0ZSImJihhPSLQndC10LLQsNC70LjQtNC90LAiKSxpLmZvcm1hdD09PSJ0aW1lIiYmKGE9ItCd0LXQstCw0LvQuNC00L3QviIpLGkuZm9ybWF0PT09ImR1cmF0aW9uIiYmKGE9ItCd0LXQstCw0LvQuNC00L3QsCIpLGAke2F9ICR7cltpLmZvcm1hdF0/P2UuZm9ybWF0fWB9Y2FzZSJub3RfbXVsdGlwbGVfb2YiOnJldHVybmDQndC10LLQsNC70LjQtNC90L4g0YfQuNGB0LvQvjog0YLRgNGP0LHQstCwINC00LAg0LHRitC00LUg0LrRgNCw0YLQvdC+INC90LAgJHtlLmRpdmlzb3J9YDtjYXNlInVucmVjb2duaXplZF9rZXlzIjpyZXR1cm5g0J3QtdGA0LDQt9C/0L7Qt9C90LDRgiR7ZS5rZXlzLmxlbmd0aD4xPyLQuCI6IiJ9INC60LvRjtGHJHtlLmtleXMubGVuZ3RoPjE/ItC+0LLQtSI6IiJ9OiAke18oZS5rZXlzLCIsICIpfWA7Y2FzZSJpbnZhbGlkX2tleSI6cmV0dXJuYNCd0LXQstCw0LvQuNC00LXQvSDQutC70Y7RhyDQsiAke2Uub3JpZ2lufWA7Y2FzZSJpbnZhbGlkX3VuaW9uIjpyZXR1cm4i0J3QtdCy0LDQu9C40LTQtdC9INCy0YXQvtC0IjtjYXNlImludmFsaWRfZWxlbWVudCI6cmV0dXJuYNCd0LXQstCw0LvQuNC00L3QsCDRgdGC0L7QudC90L7RgdGCINCyICR7ZS5vcmlnaW59YDtkZWZhdWx0OnJldHVybiLQndC10LLQsNC70LjQtNC10L0g0LLRhdC+0LQifX19O2Z1bmN0aW9uIEpwKCl7cmV0dXJue2xvY2FsZUVycm9yOkZwKCl9fWNvbnN0IEhwPSgpPT57Y29uc3QgdD17c3RyaW5nOnt1bml0OiJjYXLDoGN0ZXJzIix2ZXJiOiJjb250ZW5pciJ9LGZpbGU6e3VuaXQ6ImJ5dGVzIix2ZXJiOiJjb250ZW5pciJ9LGFycmF5Ont1bml0OiJlbGVtZW50cyIsdmVyYjoiY29udGVuaXIifSxzZXQ6e3VuaXQ6ImVsZW1lbnRzIix2ZXJiOiJjb250ZW5pciJ9fTtmdW5jdGlvbiBuKGUpe3JldHVybiB0W2VdPz9udWxsfWNvbnN0IHI9e3JlZ2V4OiJlbnRyYWRhIixlbWFpbDoiYWRyZcOnYSBlbGVjdHLDsm5pY2EiLHVybDoiVVJMIixlbW9qaToiZW1vamkiLHV1aWQ6IlVVSUQiLHV1aWR2NDoiVVVJRHY0Iix1dWlkdjY6IlVVSUR2NiIsbmFub2lkOiJuYW5vaWQiLGd1aWQ6IkdVSUQiLGN1aWQ6ImN1aWQiLGN1aWQyOiJjdWlkMiIsdWxpZDoiVUxJRCIseGlkOiJYSUQiLGtzdWlkOiJLU1VJRCIsZGF0ZXRpbWU6ImRhdGEgaSBob3JhIElTTyIsZGF0ZToiZGF0YSBJU08iLHRpbWU6ImhvcmEgSVNPIixkdXJhdGlvbjoiZHVyYWRhIElTTyIsaXB2NDoiYWRyZcOnYSBJUHY0IixpcHY2OiJhZHJlw6dhIElQdjYiLGNpZHJ2NDoicmFuZyBJUHY0IixjaWRydjY6InJhbmcgSVB2NiIsYmFzZTY0OiJjYWRlbmEgY29kaWZpY2FkYSBlbiBiYXNlNjQiLGJhc2U2NHVybDoiY2FkZW5hIGNvZGlmaWNhZGEgZW4gYmFzZTY0dXJsIixqc29uX3N0cmluZzoiY2FkZW5hIEpTT04iLGUxNjQ6Im7Dum1lcm8gRS4xNjQiLGp3dDoiSldUIix0ZW1wbGF0ZV9saXRlcmFsOiJlbnRyYWRhIn0sbz17bmFuOiJOYU4ifTtyZXR1cm4gZT0+e3N3aXRjaChlLmNvZGUpe2Nhc2UiaW52YWxpZF90eXBlIjp7Y29uc3QgaT1vW2UuZXhwZWN0ZWRdPz9lLmV4cGVjdGVkLGE9dyhlLmlucHV0KSxzPW9bYV0/P2E7cmV0dXJuL15bQS1aXS8udGVzdChlLmV4cGVjdGVkKT9gVGlwdXMgaW52w6BsaWQ6IHMnZXNwZXJhdmEgaW5zdGFuY2VvZiAke2UuZXhwZWN0ZWR9LCBzJ2hhIHJlYnV0ICR7c31gOmBUaXB1cyBpbnbDoGxpZDogcydlc3BlcmF2YSAke2l9LCBzJ2hhIHJlYnV0ICR7c31gfWNhc2UiaW52YWxpZF92YWx1ZSI6cmV0dXJuIGUudmFsdWVzLmxlbmd0aD09PTE/YFZhbG9yIGludsOgbGlkOiBzJ2VzcGVyYXZhICR7UyhlLnZhbHVlc1swXSl9YDpgT3BjacOzIGludsOgbGlkYTogcydlc3BlcmF2YSB1bmEgZGUgJHtfKGUudmFsdWVzLCIgbyAiKX1gO2Nhc2UidG9vX2JpZyI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/ImNvbSBhIG3DoHhpbSI6Im1lbnlzIGRlIixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2BNYXNzYSBncmFuOiBzJ2VzcGVyYXZhIHF1ZSAke2Uub3JpZ2luPz8iZWwgdmFsb3IifSBjb250aW5ndcOpcyAke2l9ICR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0Pz8iZWxlbWVudHMifWA6YE1hc3NhIGdyYW46IHMnZXNwZXJhdmEgcXVlICR7ZS5vcmlnaW4/PyJlbCB2YWxvciJ9IGZvcyAke2l9ICR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9YH1jYXNlInRvb19zbWFsbCI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/ImNvbSBhIG3DrW5pbSI6Im3DqXMgZGUiLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YE1hc3NhIHBldGl0OiBzJ2VzcGVyYXZhIHF1ZSAke2Uub3JpZ2lufSBjb250aW5ndcOpcyAke2l9ICR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0fWA6YE1hc3NhIHBldGl0OiBzJ2VzcGVyYXZhIHF1ZSAke2Uub3JpZ2lufSBmb3MgJHtpfSAke2UubWluaW11bS50b1N0cmluZygpfWB9Y2FzZSJpbnZhbGlkX2Zvcm1hdCI6e2NvbnN0IGk9ZTtyZXR1cm4gaS5mb3JtYXQ9PT0ic3RhcnRzX3dpdGgiP2BGb3JtYXQgaW52w6BsaWQ6IGhhIGRlIGNvbWVuw6dhciBhbWIgIiR7aS5wcmVmaXh9ImA6aS5mb3JtYXQ9PT0iZW5kc193aXRoIj9gRm9ybWF0IGludsOgbGlkOiBoYSBkJ2FjYWJhciBhbWIgIiR7aS5zdWZmaXh9ImA6aS5mb3JtYXQ9PT0iaW5jbHVkZXMiP2BGb3JtYXQgaW52w6BsaWQ6IGhhIGQnaW5jbG91cmUgIiR7aS5pbmNsdWRlc30iYDppLmZvcm1hdD09PSJyZWdleCI/YEZvcm1hdCBpbnbDoGxpZDogaGEgZGUgY29pbmNpZGlyIGFtYiBlbCBwYXRyw7MgJHtpLnBhdHRlcm59YDpgRm9ybWF0IGludsOgbGlkIHBlciBhICR7cltpLmZvcm1hdF0/P2UuZm9ybWF0fWB9Y2FzZSJub3RfbXVsdGlwbGVfb2YiOnJldHVybmBOw7ptZXJvIGludsOgbGlkOiBoYSBkZSBzZXIgbcO6bHRpcGxlIGRlICR7ZS5kaXZpc29yfWA7Y2FzZSJ1bnJlY29nbml6ZWRfa2V5cyI6cmV0dXJuYENsYXUke2Uua2V5cy5sZW5ndGg+MT8icyI6IiJ9IG5vIHJlY29uZWd1ZGEke2Uua2V5cy5sZW5ndGg+MT8icyI6IiJ9OiAke18oZS5rZXlzLCIsICIpfWA7Y2FzZSJpbnZhbGlkX2tleSI6cmV0dXJuYENsYXUgaW52w6BsaWRhIGEgJHtlLm9yaWdpbn1gO2Nhc2UiaW52YWxpZF91bmlvbiI6cmV0dXJuIkVudHJhZGEgaW52w6BsaWRhIjtjYXNlImludmFsaWRfZWxlbWVudCI6cmV0dXJuYEVsZW1lbnQgaW52w6BsaWQgYSAke2Uub3JpZ2lufWA7ZGVmYXVsdDpyZXR1cm4iRW50cmFkYSBpbnbDoGxpZGEifX19O2Z1bmN0aW9uIFdwKCl7cmV0dXJue2xvY2FsZUVycm9yOkhwKCl9fWNvbnN0IEJwPSgpPT57Y29uc3QgdD17c3RyaW5nOnt1bml0OiJ6bmFrxa8iLHZlcmI6Im3DrXQifSxmaWxlOnt1bml0OiJiYWp0xa8iLHZlcmI6Im3DrXQifSxhcnJheTp7dW5pdDoicHJ2a8WvIix2ZXJiOiJtw610In0sc2V0Ont1bml0OiJwcnZrxa8iLHZlcmI6Im3DrXQifX07ZnVuY3Rpb24gbihlKXtyZXR1cm4gdFtlXT8/bnVsbH1jb25zdCByPXtyZWdleDoicmVndWzDoXJuw60gdsO9cmF6IixlbWFpbDoiZS1tYWlsb3bDoSBhZHJlc2EiLHVybDoiVVJMIixlbW9qaToiZW1vamkiLHV1aWQ6IlVVSUQiLHV1aWR2NDoiVVVJRHY0Iix1dWlkdjY6IlVVSUR2NiIsbmFub2lkOiJuYW5vaWQiLGd1aWQ6IkdVSUQiLGN1aWQ6ImN1aWQiLGN1aWQyOiJjdWlkMiIsdWxpZDoiVUxJRCIseGlkOiJYSUQiLGtzdWlkOiJLU1VJRCIsZGF0ZXRpbWU6ImRhdHVtIGEgxI1hcyB2ZSBmb3Jtw6F0dSBJU08iLGRhdGU6ImRhdHVtIHZlIGZvcm3DoXR1IElTTyIsdGltZToixI1hcyB2ZSBmb3Jtw6F0dSBJU08iLGR1cmF0aW9uOiJkb2JhIHRydsOhbsOtIElTTyIsaXB2NDoiSVB2NCBhZHJlc2EiLGlwdjY6IklQdjYgYWRyZXNhIixjaWRydjQ6InJvenNhaCBJUHY0IixjaWRydjY6InJvenNhaCBJUHY2IixiYXNlNjQ6IsWZZXTEm3plYyB6YWvDs2RvdmFuw70gdmUgZm9ybcOhdHUgYmFzZTY0IixiYXNlNjR1cmw6IsWZZXTEm3plYyB6YWvDs2RvdmFuw70gdmUgZm9ybcOhdHUgYmFzZTY0dXJsIixqc29uX3N0cmluZzoixZlldMSbemVjIHZlIGZvcm3DoXR1IEpTT04iLGUxNjQ6IsSNw61zbG8gRS4xNjQiLGp3dDoiSldUIix0ZW1wbGF0ZV9saXRlcmFsOiJ2c3R1cCJ9LG89e25hbjoiTmFOIixudW1iZXI6IsSNw61zbG8iLHN0cmluZzoixZlldMSbemVjIixmdW5jdGlvbjoiZnVua2NlIixhcnJheToicG9sZSJ9O3JldHVybiBlPT57c3dpdGNoKGUuY29kZSl7Y2FzZSJpbnZhbGlkX3R5cGUiOntjb25zdCBpPW9bZS5leHBlY3RlZF0/P2UuZXhwZWN0ZWQsYT13KGUuaW5wdXQpLHM9b1thXT8/YTtyZXR1cm4vXltBLVpdLy50ZXN0KGUuZXhwZWN0ZWQpP2BOZXBsYXRuw70gdnN0dXA6IG/EjWVrw6F2w6FubyBpbnN0YW5jZW9mICR7ZS5leHBlY3RlZH0sIG9iZHLFvmVubyAke3N9YDpgTmVwbGF0bsO9IHZzdHVwOiBvxI1la8OhdsOhbm8gJHtpfSwgb2JkcsW+ZW5vICR7c31gfWNhc2UiaW52YWxpZF92YWx1ZSI6cmV0dXJuIGUudmFsdWVzLmxlbmd0aD09PTE/YE5lcGxhdG7DvSB2c3R1cDogb8SNZWvDoXbDoW5vICR7UyhlLnZhbHVlc1swXSl9YDpgTmVwbGF0bsOhIG1vxb5ub3N0OiBvxI1la8OhdsOhbmEgamVkbmEgeiBob2Rub3QgJHtfKGUudmFsdWVzLCJ8Iil9YDtjYXNlInRvb19iaWciOntjb25zdCBpPWUuaW5jbHVzaXZlPyI8PSI6IjwiLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YEhvZG5vdGEgamUgcMWZw61sacWhIHZlbGvDoTogJHtlLm9yaWdpbj8/ImhvZG5vdGEifSBtdXPDrSBtw610ICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfSAke2EudW5pdD8/InBydmvFryJ9YDpgSG9kbm90YSBqZSBwxZnDrWxpxaEgdmVsa8OhOiAke2Uub3JpZ2luPz8iaG9kbm90YSJ9IG11c8OtIGLDvXQgJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9YH1jYXNlInRvb19zbWFsbCI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ij49IjoiPiIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9gSG9kbm90YSBqZSBwxZnDrWxpxaEgbWFsw6E6ICR7ZS5vcmlnaW4/PyJob2Rub3RhIn0gbXVzw60gbcOtdCAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX0gJHthLnVuaXQ/PyJwcnZrxa8ifWA6YEhvZG5vdGEgamUgcMWZw61sacWhIG1hbMOhOiAke2Uub3JpZ2luPz8iaG9kbm90YSJ9IG11c8OtIGLDvXQgJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9YH1jYXNlImludmFsaWRfZm9ybWF0Ijp7Y29uc3QgaT1lO3JldHVybiBpLmZvcm1hdD09PSJzdGFydHNfd2l0aCI/YE5lcGxhdG7DvSDFmWV0xJt6ZWM6IG11c8OtIHphxI3DrW5hdCBuYSAiJHtpLnByZWZpeH0iYDppLmZvcm1hdD09PSJlbmRzX3dpdGgiP2BOZXBsYXRuw70gxZlldMSbemVjOiBtdXPDrSBrb27EjWl0IG5hICIke2kuc3VmZml4fSJgOmkuZm9ybWF0PT09ImluY2x1ZGVzIj9gTmVwbGF0bsO9IMWZZXTEm3plYzogbXVzw60gb2JzYWhvdmF0ICIke2kuaW5jbHVkZXN9ImA6aS5mb3JtYXQ9PT0icmVnZXgiP2BOZXBsYXRuw70gxZlldMSbemVjOiBtdXPDrSBvZHBvdsOtZGF0IHZ6b3J1ICR7aS5wYXR0ZXJufWA6YE5lcGxhdG7DvSBmb3Jtw6F0ICR7cltpLmZvcm1hdF0/P2UuZm9ybWF0fWB9Y2FzZSJub3RfbXVsdGlwbGVfb2YiOnJldHVybmBOZXBsYXRuw6kgxI3DrXNsbzogbXVzw60gYsO9dCBuw6Fzb2JrZW0gJHtlLmRpdmlzb3J9YDtjYXNlInVucmVjb2duaXplZF9rZXlzIjpyZXR1cm5gTmV6bsOhbcOpIGtsw63EjWU6ICR7XyhlLmtleXMsIiwgIil9YDtjYXNlImludmFsaWRfa2V5IjpyZXR1cm5gTmVwbGF0bsO9IGtsw63EjSB2ICR7ZS5vcmlnaW59YDtjYXNlImludmFsaWRfdW5pb24iOnJldHVybiJOZXBsYXRuw70gdnN0dXAiO2Nhc2UiaW52YWxpZF9lbGVtZW50IjpyZXR1cm5gTmVwbGF0bsOhIGhvZG5vdGEgdiAke2Uub3JpZ2lufWA7ZGVmYXVsdDpyZXR1cm4iTmVwbGF0bsO9IHZzdHVwIn19fTtmdW5jdGlvbiBWcCgpe3JldHVybntsb2NhbGVFcnJvcjpCcCgpfX1jb25zdCBLcD0oKT0+e2NvbnN0IHQ9e3N0cmluZzp7dW5pdDoidGVnbiIsdmVyYjoiaGF2ZGUifSxmaWxlOnt1bml0OiJieXRlcyIsdmVyYjoiaGF2ZGUifSxhcnJheTp7dW5pdDoiZWxlbWVudGVyIix2ZXJiOiJpbmRlaG9sZHQifSxzZXQ6e3VuaXQ6ImVsZW1lbnRlciIsdmVyYjoiaW5kZWhvbGR0In19O2Z1bmN0aW9uIG4oZSl7cmV0dXJuIHRbZV0/P251bGx9Y29uc3Qgcj17cmVnZXg6ImlucHV0IixlbWFpbDoiZS1tYWlsYWRyZXNzZSIsdXJsOiJVUkwiLGVtb2ppOiJlbW9qaSIsdXVpZDoiVVVJRCIsdXVpZHY0OiJVVUlEdjQiLHV1aWR2NjoiVVVJRHY2IixuYW5vaWQ6Im5hbm9pZCIsZ3VpZDoiR1VJRCIsY3VpZDoiY3VpZCIsY3VpZDI6ImN1aWQyIix1bGlkOiJVTElEIix4aWQ6IlhJRCIsa3N1aWQ6IktTVUlEIixkYXRldGltZToiSVNPIGRhdG8tIG9nIGtsb2trZXNsw6Z0IixkYXRlOiJJU08tZGF0byIsdGltZToiSVNPLWtsb2trZXNsw6Z0IixkdXJhdGlvbjoiSVNPLXZhcmlnaGVkIixpcHY0OiJJUHY0LW9tcsOlZGUiLGlwdjY6IklQdjYtb21yw6VkZSIsY2lkcnY0OiJJUHY0LXNwZWt0cnVtIixjaWRydjY6IklQdjYtc3Bla3RydW0iLGJhc2U2NDoiYmFzZTY0LWtvZGV0IHN0cmVuZyIsYmFzZTY0dXJsOiJiYXNlNjR1cmwta29kZXQgc3RyZW5nIixqc29uX3N0cmluZzoiSlNPTi1zdHJlbmciLGUxNjQ6IkUuMTY0LW51bW1lciIsand0OiJKV1QiLHRlbXBsYXRlX2xpdGVyYWw6ImlucHV0In0sbz17bmFuOiJOYU4iLHN0cmluZzoic3RyZW5nIixudW1iZXI6InRhbCIsYm9vbGVhbjoiYm9vbGVhbiIsYXJyYXk6Imxpc3RlIixvYmplY3Q6Im9iamVrdCIsc2V0OiJzw6Z0IixmaWxlOiJmaWwifTtyZXR1cm4gZT0+e3N3aXRjaChlLmNvZGUpe2Nhc2UiaW52YWxpZF90eXBlIjp7Y29uc3QgaT1vW2UuZXhwZWN0ZWRdPz9lLmV4cGVjdGVkLGE9dyhlLmlucHV0KSxzPW9bYV0/P2E7cmV0dXJuL15bQS1aXS8udGVzdChlLmV4cGVjdGVkKT9gVWd5bGRpZ3QgaW5wdXQ6IGZvcnZlbnRlZGUgaW5zdGFuY2VvZiAke2UuZXhwZWN0ZWR9LCBmaWsgJHtzfWA6YFVneWxkaWd0IGlucHV0OiBmb3J2ZW50ZWRlICR7aX0sIGZpayAke3N9YH1jYXNlImludmFsaWRfdmFsdWUiOnJldHVybiBlLnZhbHVlcy5sZW5ndGg9PT0xP2BVZ3lsZGlnIHbDpnJkaTogZm9ydmVudGVkZSAke1MoZS52YWx1ZXNbMF0pfWA6YFVneWxkaWd0IHZhbGc6IGZvcnZlbnRlZGUgZW4gYWYgZsO4bGdlbmRlICR7XyhlLnZhbHVlcywifCIpfWA7Y2FzZSJ0b29fYmlnIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPD0iOiI8IixhPW4oZS5vcmlnaW4pLHM9b1tlLm9yaWdpbl0/P2Uub3JpZ2luO3JldHVybiBhP2BGb3Igc3RvcjogZm9ydmVudGVkZSAke3M/PyJ2YWx1ZSJ9ICR7YS52ZXJifSAke2l9ICR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0Pz8iZWxlbWVudGVyIn1gOmBGb3Igc3RvcjogZm9ydmVudGVkZSAke3M/PyJ2YWx1ZSJ9IGhhdmRlICR7aX0gJHtlLm1heGltdW0udG9TdHJpbmcoKX1gfWNhc2UidG9vX3NtYWxsIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPj0iOiI+IixhPW4oZS5vcmlnaW4pLHM9b1tlLm9yaWdpbl0/P2Uub3JpZ2luO3JldHVybiBhP2BGb3IgbGlsbGU6IGZvcnZlbnRlZGUgJHtzfSAke2EudmVyYn0gJHtpfSAke2UubWluaW11bS50b1N0cmluZygpfSAke2EudW5pdH1gOmBGb3IgbGlsbGU6IGZvcnZlbnRlZGUgJHtzfSBoYXZkZSAke2l9ICR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9YH1jYXNlImludmFsaWRfZm9ybWF0Ijp7Y29uc3QgaT1lO3JldHVybiBpLmZvcm1hdD09PSJzdGFydHNfd2l0aCI/YFVneWxkaWcgc3RyZW5nOiBza2FsIHN0YXJ0ZSBtZWQgIiR7aS5wcmVmaXh9ImA6aS5mb3JtYXQ9PT0iZW5kc193aXRoIj9gVWd5bGRpZyBzdHJlbmc6IHNrYWwgZW5kZSBtZWQgIiR7aS5zdWZmaXh9ImA6aS5mb3JtYXQ9PT0iaW5jbHVkZXMiP2BVZ3lsZGlnIHN0cmVuZzogc2thbCBpbmRlaG9sZGUgIiR7aS5pbmNsdWRlc30iYDppLmZvcm1hdD09PSJyZWdleCI/YFVneWxkaWcgc3RyZW5nOiBza2FsIG1hdGNoZSBtw7huc3RlcmV0ICR7aS5wYXR0ZXJufWA6YFVneWxkaWcgJHtyW2kuZm9ybWF0XT8/ZS5mb3JtYXR9YH1jYXNlIm5vdF9tdWx0aXBsZV9vZiI6cmV0dXJuYFVneWxkaWd0IHRhbDogc2thbCB2w6ZyZSBkZWxlbGlndCBtZWQgJHtlLmRpdmlzb3J9YDtjYXNlInVucmVjb2duaXplZF9rZXlzIjpyZXR1cm5gJHtlLmtleXMubGVuZ3RoPjE/IlVrZW5kdGUgbsO4Z2xlciI6IlVrZW5kdCBuw7hnbGUifTogJHtfKGUua2V5cywiLCAiKX1gO2Nhc2UiaW52YWxpZF9rZXkiOnJldHVybmBVZ3lsZGlnIG7DuGdsZSBpICR7ZS5vcmlnaW59YDtjYXNlImludmFsaWRfdW5pb24iOnJldHVybiJVZ3lsZGlndCBpbnB1dDogbWF0Y2hlciBpbmdlbiBhZiBkZSB0aWxsYWR0ZSB0eXBlciI7Y2FzZSJpbnZhbGlkX2VsZW1lbnQiOnJldHVybmBVZ3lsZGlnIHbDpnJkaSBpICR7ZS5vcmlnaW59YDtkZWZhdWx0OnJldHVybiJVZ3lsZGlndCBpbnB1dCJ9fX07ZnVuY3Rpb24gR3AoKXtyZXR1cm57bG9jYWxlRXJyb3I6S3AoKX19Y29uc3QgWHA9KCk9Pntjb25zdCB0PXtzdHJpbmc6e3VuaXQ6IlplaWNoZW4iLHZlcmI6Inp1IGhhYmVuIn0sZmlsZTp7dW5pdDoiQnl0ZXMiLHZlcmI6Inp1IGhhYmVuIn0sYXJyYXk6e3VuaXQ6IkVsZW1lbnRlIix2ZXJiOiJ6dSBoYWJlbiJ9LHNldDp7dW5pdDoiRWxlbWVudGUiLHZlcmI6Inp1IGhhYmVuIn19O2Z1bmN0aW9uIG4oZSl7cmV0dXJuIHRbZV0/P251bGx9Y29uc3Qgcj17cmVnZXg6IkVpbmdhYmUiLGVtYWlsOiJFLU1haWwtQWRyZXNzZSIsdXJsOiJVUkwiLGVtb2ppOiJFbW9qaSIsdXVpZDoiVVVJRCIsdXVpZHY0OiJVVUlEdjQiLHV1aWR2NjoiVVVJRHY2IixuYW5vaWQ6Im5hbm9pZCIsZ3VpZDoiR1VJRCIsY3VpZDoiY3VpZCIsY3VpZDI6ImN1aWQyIix1bGlkOiJVTElEIix4aWQ6IlhJRCIsa3N1aWQ6IktTVUlEIixkYXRldGltZToiSVNPLURhdHVtIHVuZCAtVWhyemVpdCIsZGF0ZToiSVNPLURhdHVtIix0aW1lOiJJU08tVWhyemVpdCIsZHVyYXRpb246IklTTy1EYXVlciIsaXB2NDoiSVB2NC1BZHJlc3NlIixpcHY2OiJJUHY2LUFkcmVzc2UiLGNpZHJ2NDoiSVB2NC1CZXJlaWNoIixjaWRydjY6IklQdjYtQmVyZWljaCIsYmFzZTY0OiJCYXNlNjQtY29kaWVydGVyIFN0cmluZyIsYmFzZTY0dXJsOiJCYXNlNjQtVVJMLWNvZGllcnRlciBTdHJpbmciLGpzb25fc3RyaW5nOiJKU09OLVN0cmluZyIsZTE2NDoiRS4xNjQtTnVtbWVyIixqd3Q6IkpXVCIsdGVtcGxhdGVfbGl0ZXJhbDoiRWluZ2FiZSJ9LG89e25hbjoiTmFOIixudW1iZXI6IlphaGwiLGFycmF5OiJBcnJheSJ9O3JldHVybiBlPT57c3dpdGNoKGUuY29kZSl7Y2FzZSJpbnZhbGlkX3R5cGUiOntjb25zdCBpPW9bZS5leHBlY3RlZF0/P2UuZXhwZWN0ZWQsYT13KGUuaW5wdXQpLHM9b1thXT8/YTtyZXR1cm4vXltBLVpdLy50ZXN0KGUuZXhwZWN0ZWQpP2BVbmfDvGx0aWdlIEVpbmdhYmU6IGVyd2FydGV0IGluc3RhbmNlb2YgJHtlLmV4cGVjdGVkfSwgZXJoYWx0ZW4gJHtzfWA6YFVuZ8O8bHRpZ2UgRWluZ2FiZTogZXJ3YXJ0ZXQgJHtpfSwgZXJoYWx0ZW4gJHtzfWB9Y2FzZSJpbnZhbGlkX3ZhbHVlIjpyZXR1cm4gZS52YWx1ZXMubGVuZ3RoPT09MT9gVW5nw7xsdGlnZSBFaW5nYWJlOiBlcndhcnRldCAke1MoZS52YWx1ZXNbMF0pfWA6YFVuZ8O8bHRpZ2UgT3B0aW9uOiBlcndhcnRldCBlaW5lIHZvbiAke18oZS52YWx1ZXMsInwiKX1gO2Nhc2UidG9vX2JpZyI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ijw9IjoiPCIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9gWnUgZ3Jvw586IGVyd2FydGV0LCBkYXNzICR7ZS5vcmlnaW4/PyJXZXJ0In0gJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0Pz8iRWxlbWVudGUifSBoYXRgOmBadSBncm/DnzogZXJ3YXJ0ZXQsIGRhc3MgJHtlLm9yaWdpbj8/IldlcnQifSAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX0gaXN0YH1jYXNlInRvb19zbWFsbCI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ij49IjoiPiIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9gWnUga2xlaW46IGVyd2FydGV0LCBkYXNzICR7ZS5vcmlnaW59ICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfSAke2EudW5pdH0gaGF0YDpgWnUga2xlaW46IGVyd2FydGV0LCBkYXNzICR7ZS5vcmlnaW59ICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfSBpc3RgfWNhc2UiaW52YWxpZF9mb3JtYXQiOntjb25zdCBpPWU7cmV0dXJuIGkuZm9ybWF0PT09InN0YXJ0c193aXRoIj9gVW5nw7xsdGlnZXIgU3RyaW5nOiBtdXNzIG1pdCAiJHtpLnByZWZpeH0iIGJlZ2lubmVuYDppLmZvcm1hdD09PSJlbmRzX3dpdGgiP2BVbmfDvGx0aWdlciBTdHJpbmc6IG11c3MgbWl0ICIke2kuc3VmZml4fSIgZW5kZW5gOmkuZm9ybWF0PT09ImluY2x1ZGVzIj9gVW5nw7xsdGlnZXIgU3RyaW5nOiBtdXNzICIke2kuaW5jbHVkZXN9IiBlbnRoYWx0ZW5gOmkuZm9ybWF0PT09InJlZ2V4Ij9gVW5nw7xsdGlnZXIgU3RyaW5nOiBtdXNzIGRlbSBNdXN0ZXIgJHtpLnBhdHRlcm59IGVudHNwcmVjaGVuYDpgVW5nw7xsdGlnOiAke3JbaS5mb3JtYXRdPz9lLmZvcm1hdH1gfWNhc2Uibm90X211bHRpcGxlX29mIjpyZXR1cm5gVW5nw7xsdGlnZSBaYWhsOiBtdXNzIGVpbiBWaWVsZmFjaGVzIHZvbiAke2UuZGl2aXNvcn0gc2VpbmA7Y2FzZSJ1bnJlY29nbml6ZWRfa2V5cyI6cmV0dXJuYCR7ZS5rZXlzLmxlbmd0aD4xPyJVbmJla2FubnRlIFNjaGzDvHNzZWwiOiJVbmJla2FubnRlciBTY2hsw7xzc2VsIn06ICR7XyhlLmtleXMsIiwgIil9YDtjYXNlImludmFsaWRfa2V5IjpyZXR1cm5gVW5nw7xsdGlnZXIgU2NobMO8c3NlbCBpbiAke2Uub3JpZ2lufWA7Y2FzZSJpbnZhbGlkX3VuaW9uIjpyZXR1cm4iVW5nw7xsdGlnZSBFaW5nYWJlIjtjYXNlImludmFsaWRfZWxlbWVudCI6cmV0dXJuYFVuZ8O8bHRpZ2VyIFdlcnQgaW4gJHtlLm9yaWdpbn1gO2RlZmF1bHQ6cmV0dXJuIlVuZ8O8bHRpZ2UgRWluZ2FiZSJ9fX07ZnVuY3Rpb24gWXAoKXtyZXR1cm57bG9jYWxlRXJyb3I6WHAoKX19Y29uc3QgUXA9KCk9Pntjb25zdCB0PXtzdHJpbmc6e3VuaXQ6Is+HzrHPgc6xzrrPhM6uz4HOtc+CIix2ZXJiOiLOvc6xIM6tz4fOtc65In0sZmlsZTp7dW5pdDoiYnl0ZXMiLHZlcmI6Is69zrEgzq3Ph861zrkifSxhcnJheTp7dW5pdDoiz4PPhM6/zrnPh861zq/OsSIsdmVyYjoizr3OsSDOrc+HzrXOuSJ9LHNldDp7dW5pdDoiz4PPhM6/zrnPh861zq/OsSIsdmVyYjoizr3OsSDOrc+HzrXOuSJ9LG1hcDp7dW5pdDoizrrOsc+EzrHPh8+Jz4HOrs+DzrXOuc+CIix2ZXJiOiLOvc6xIM6tz4fOtc65In19O2Z1bmN0aW9uIG4oZSl7cmV0dXJuIHRbZV0/P251bGx9Y29uc3Qgcj17cmVnZXg6Is61zq/Pg86/zrTOv8+CIixlbWFpbDoizrTOuc61z43OuM+Fzr3Pg863IGVtYWlsIix1cmw6IlVSTCIsZW1vamk6ImVtb2ppIix1dWlkOiJVVUlEIix1dWlkdjQ6IlVVSUR2NCIsdXVpZHY2OiJVVUlEdjYiLG5hbm9pZDoibmFub2lkIixndWlkOiJHVUlEIixjdWlkOiJjdWlkIixjdWlkMjoiY3VpZDIiLHVsaWQ6IlVMSUQiLHhpZDoiWElEIixrc3VpZDoiS1NVSUQiLGRhdGV0aW1lOiJJU08gzrfOvM61z4HOv868zrfOvc6vzrEgzrrOsc65IM+Oz4HOsSIsZGF0ZToiSVNPIM63zrzOtc+Bzr/OvM63zr3Or86xIix0aW1lOiJJU08gz47Pgc6xIixkdXJhdGlvbjoiSVNPIM60zrnOrM+BzrrOtc65zrEiLGlwdjQ6Is60zrnOtc+NzrjPhc69z4POtyBJUHY0IixpcHY2OiLOtM65zrXPjc64z4XOvc+DzrcgSVB2NiIsbWFjOiLOtM65zrXPjc64z4XOvc+DzrcgTUFDIixjaWRydjQ6Is61z43Pgc6/z4IgSVB2NCIsY2lkcnY2OiLOtc+Nz4HOv8+CIElQdjYiLGJhc2U2NDoiz4PPhc68zrLOv867zr/Pg861zrnPgc6sIM66z4nOtM65zrrOv8+Azr/Ouc63zrzOrc69zrcgz4POtSBiYXNlNjQiLGJhc2U2NHVybDoiz4PPhc68zrLOv867zr/Pg861zrnPgc6sIM66z4nOtM65zrrOv8+Azr/Ouc63zrzOrc69zrcgz4POtSBiYXNlNjR1cmwiLGpzb25fc3RyaW5nOiLPg8+FzrzOss6/zrvOv8+DzrXOuc+BzqwgSlNPTiIsZTE2NDoizrHPgc65zrjOvM+Mz4IgRS4xNjQiLGp3dDoiSldUIix0ZW1wbGF0ZV9saXRlcmFsOiLOtc6vz4POv860zr/PgiJ9LG89e25hbjoiTmFOIn07cmV0dXJuIGU9Pntzd2l0Y2goZS5jb2RlKXtjYXNlImludmFsaWRfdHlwZSI6e2NvbnN0IGk9b1tlLmV4cGVjdGVkXT8/ZS5leHBlY3RlZCxhPXcoZS5pbnB1dCkscz1vW2FdPz9hO3JldHVybiB0eXBlb2YgZS5leHBlY3RlZD09InN0cmluZyImJi9eW0EtWl0vLnRlc3QoZS5leHBlY3RlZCk/YM6czrcgzq3Os866z4XPgc63IM61zq/Pg86/zrTOv8+COiDOsc69zrHOvM61zr3PjM+EzrHOvSBpbnN0YW5jZW9mICR7ZS5leHBlY3RlZH0sIM67zq7Phs64zrfOus61ICR7c31gOmDOnM63IM6tzrPOus+Fz4HOtyDOtc6vz4POv860zr/PgjogzrHOvc6xzrzOtc69z4zPhM6xzr0gJHtpfSwgzrvOrs+GzrjOt866zrUgJHtzfWB9Y2FzZSJpbnZhbGlkX3ZhbHVlIjpyZXR1cm4gZS52YWx1ZXMubGVuZ3RoPT09MT9gzpzOtyDOrc6zzrrPhc+BzrcgzrXOr8+Dzr/OtM6/z4I6IM6xzr3Osc68zrXOvc+Mz4TOsc69ICR7UyhlLnZhbHVlc1swXSl9YDpgzpzOtyDOrc6zzrrPhc+BzrcgzrXPgM65zrvOv86zzq46IM6xzr3Osc68zrXOvc+Mz4TOsc69IM6tzr3OsSDOsc+Az4wgJHtfKGUudmFsdWVzLCJ8Iil9YDtjYXNlInRvb19iaWciOntjb25zdCBpPWUuaW5jbHVzaXZlPyI8PSI6IjwiLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YM6gzr/Ou8+NIM68zrXOs86szrvOvzogzrHOvc6xzrzOtc69z4zPhM6xzr0gJHtlLm9yaWdpbj8/Is+EzrnOvM6uIn0gzr3OsSDOrc+HzrXOuSAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX0gJHthLnVuaXQ/PyLPg8+Ezr/Ouc+HzrXOr86xIn1gOmDOoM6/zrvPjSDOvM61zrPOrM67zr86IM6xzr3Osc68zrXOvc+Mz4TOsc69ICR7ZS5vcmlnaW4/PyLPhM65zrzOriJ9IM69zrEgzrXOr869zrHOuSAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX1gfWNhc2UidG9vX3NtYWxsIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPj0iOiI+IixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2DOoM6/zrvPjSDOvM65zrrPgc+MOiDOsc69zrHOvM61zr3PjM+EzrHOvSAke2Uub3JpZ2lufSDOvc6xIM6tz4fOtc65ICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfSAke2EudW5pdH1gOmDOoM6/zrvPjSDOvM65zrrPgc+MOiDOsc69zrHOvM61zr3PjM+EzrHOvSAke2Uub3JpZ2lufSDOvc6xIM61zq/Ovc6xzrkgJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9YH1jYXNlImludmFsaWRfZm9ybWF0Ijp7Y29uc3QgaT1lO3JldHVybiBpLmZvcm1hdD09PSJzdGFydHNfd2l0aCI/YM6czrcgzq3Os866z4XPgc63IM+Dz4XOvM6yzr/Ou86/z4POtc65z4HOrDogz4DPgc6tz4DOtc65IM69zrEgzr7Otc66zrnOvc6sIM68zrUgIiR7aS5wcmVmaXh9ImA6aS5mb3JtYXQ9PT0iZW5kc193aXRoIj9gzpzOtyDOrc6zzrrPhc+Bzrcgz4PPhc68zrLOv867zr/Pg861zrnPgc6sOiDPgM+Bzq3PgM61zrkgzr3OsSDPhM61zrvOtc65z47Ovc61zrkgzrzOtSAiJHtpLnN1ZmZpeH0iYDppLmZvcm1hdD09PSJpbmNsdWRlcyI/YM6czrcgzq3Os866z4XPgc63IM+Dz4XOvM6yzr/Ou86/z4POtc65z4HOrDogz4DPgc6tz4DOtc65IM69zrEgz4DOtc+BzrnOrc+HzrXOuSAiJHtpLmluY2x1ZGVzfSJgOmkuZm9ybWF0PT09InJlZ2V4Ij9gzpzOtyDOrc6zzrrPhc+Bzrcgz4PPhc68zrLOv867zr/Pg861zrnPgc6sOiDPgM+Bzq3PgM61zrkgzr3OsSDPhM6xzrnPgc65zqzOts61zrkgzrzOtSDPhM6/IM68zr/PhM6vzrLOvyAke2kucGF0dGVybn1gOmDOnM63IM6tzrPOus+Fz4HOvzogJHtyW2kuZm9ybWF0XT8/ZS5mb3JtYXR9YH1jYXNlIm5vdF9tdWx0aXBsZV9vZiI6cmV0dXJuYM6czrcgzq3Os866z4XPgc6/z4IgzrHPgc65zrjOvM+Mz4I6IM+Az4HOrc+AzrXOuSDOvc6xIM61zq/Ovc6xzrkgz4DOv867zrvOsc+AzrvOrM+DzrnOvyDPhM6/z4UgJHtlLmRpdmlzb3J9YDtjYXNlInVucmVjb2duaXplZF9rZXlzIjpyZXR1cm5gzobOs869z4nPg8+EJHtlLmtleXMubGVuZ3RoPjE/Is6xIjoizr8ifSDOus67zrXOuc60JHtlLmtleXMubGVuZ3RoPjE/Is65zqwiOiLOryJ9OiAke18oZS5rZXlzLCIsICIpfWA7Y2FzZSJpbnZhbGlkX2tleSI6cmV0dXJuYM6czrcgzq3Os866z4XPgc6/IM66zrvOtc65zrTOryDPg8+Ezr8gJHtlLm9yaWdpbn1gO2Nhc2UiaW52YWxpZF91bmlvbiI6cmV0dXJuIs6czrcgzq3Os866z4XPgc63IM61zq/Pg86/zrTOv8+CIjtjYXNlImludmFsaWRfZWxlbWVudCI6cmV0dXJuYM6czrcgzq3Os866z4XPgc63IM+EzrnOvM6uIM+Dz4TOvyAke2Uub3JpZ2lufWA7ZGVmYXVsdDpyZXR1cm4izpzOtyDOrc6zzrrPhc+BzrcgzrXOr8+Dzr/OtM6/z4IifX19O2Z1bmN0aW9uIGVmKCl7cmV0dXJue2xvY2FsZUVycm9yOlFwKCl9fWNvbnN0IHRmPSgpPT57Y29uc3QgdD17c3RyaW5nOnt1bml0OiJjaGFyYWN0ZXJzIix2ZXJiOiJ0byBoYXZlIn0sZmlsZTp7dW5pdDoiYnl0ZXMiLHZlcmI6InRvIGhhdmUifSxhcnJheTp7dW5pdDoiaXRlbXMiLHZlcmI6InRvIGhhdmUifSxzZXQ6e3VuaXQ6Iml0ZW1zIix2ZXJiOiJ0byBoYXZlIn0sbWFwOnt1bml0OiJlbnRyaWVzIix2ZXJiOiJ0byBoYXZlIn19O2Z1bmN0aW9uIG4oZSl7cmV0dXJuIHRbZV0/P251bGx9Y29uc3Qgcj17cmVnZXg6ImlucHV0IixlbWFpbDoiZW1haWwgYWRkcmVzcyIsdXJsOiJVUkwiLGVtb2ppOiJlbW9qaSIsdXVpZDoiVVVJRCIsdXVpZHY0OiJVVUlEdjQiLHV1aWR2NjoiVVVJRHY2IixuYW5vaWQ6Im5hbm9pZCIsZ3VpZDoiR1VJRCIsY3VpZDoiY3VpZCIsY3VpZDI6ImN1aWQyIix1bGlkOiJVTElEIix4aWQ6IlhJRCIsa3N1aWQ6IktTVUlEIixkYXRldGltZToiSVNPIGRhdGV0aW1lIixkYXRlOiJJU08gZGF0ZSIsdGltZToiSVNPIHRpbWUiLGR1cmF0aW9uOiJJU08gZHVyYXRpb24iLGlwdjQ6IklQdjQgYWRkcmVzcyIsaXB2NjoiSVB2NiBhZGRyZXNzIixtYWM6Ik1BQyBhZGRyZXNzIixjaWRydjQ6IklQdjQgcmFuZ2UiLGNpZHJ2NjoiSVB2NiByYW5nZSIsYmFzZTY0OiJiYXNlNjQtZW5jb2RlZCBzdHJpbmciLGJhc2U2NHVybDoiYmFzZTY0dXJsLWVuY29kZWQgc3RyaW5nIixqc29uX3N0cmluZzoiSlNPTiBzdHJpbmciLGUxNjQ6IkUuMTY0IG51bWJlciIsand0OiJKV1QiLHRlbXBsYXRlX2xpdGVyYWw6ImlucHV0In0sbz17bmFuOiJOYU4ifTtyZXR1cm4gZT0+e3N3aXRjaChlLmNvZGUpe2Nhc2UiaW52YWxpZF90eXBlIjp7Y29uc3QgaT1vW2UuZXhwZWN0ZWRdPz9lLmV4cGVjdGVkLGE9dyhlLmlucHV0KSxzPW9bYV0/P2E7cmV0dXJuYEludmFsaWQgaW5wdXQ6IGV4cGVjdGVkICR7aX0sIHJlY2VpdmVkICR7c31gfWNhc2UiaW52YWxpZF92YWx1ZSI6cmV0dXJuIGUudmFsdWVzLmxlbmd0aD09PTE/YEludmFsaWQgaW5wdXQ6IGV4cGVjdGVkICR7UyhlLnZhbHVlc1swXSl9YDpgSW52YWxpZCBvcHRpb246IGV4cGVjdGVkIG9uZSBvZiAke18oZS52YWx1ZXMsInwiKX1gO2Nhc2UidG9vX2JpZyI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ijw9IjoiPCIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9gVG9vIGJpZzogZXhwZWN0ZWQgJHtlLm9yaWdpbj8/InZhbHVlIn0gdG8gaGF2ZSAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX0gJHthLnVuaXQ/PyJlbGVtZW50cyJ9YDpgVG9vIGJpZzogZXhwZWN0ZWQgJHtlLm9yaWdpbj8/InZhbHVlIn0gdG8gYmUgJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9YH1jYXNlInRvb19zbWFsbCI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ij49IjoiPiIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9gVG9vIHNtYWxsOiBleHBlY3RlZCAke2Uub3JpZ2lufSB0byBoYXZlICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfSAke2EudW5pdH1gOmBUb28gc21hbGw6IGV4cGVjdGVkICR7ZS5vcmlnaW59IHRvIGJlICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfWB9Y2FzZSJpbnZhbGlkX2Zvcm1hdCI6e2NvbnN0IGk9ZTtyZXR1cm4gaS5mb3JtYXQ9PT0ic3RhcnRzX3dpdGgiP2BJbnZhbGlkIHN0cmluZzogbXVzdCBzdGFydCB3aXRoICIke2kucHJlZml4fSJgOmkuZm9ybWF0PT09ImVuZHNfd2l0aCI/YEludmFsaWQgc3RyaW5nOiBtdXN0IGVuZCB3aXRoICIke2kuc3VmZml4fSJgOmkuZm9ybWF0PT09ImluY2x1ZGVzIj9gSW52YWxpZCBzdHJpbmc6IG11c3QgaW5jbHVkZSAiJHtpLmluY2x1ZGVzfSJgOmkuZm9ybWF0PT09InJlZ2V4Ij9gSW52YWxpZCBzdHJpbmc6IG11c3QgbWF0Y2ggcGF0dGVybiAke2kucGF0dGVybn1gOmBJbnZhbGlkICR7cltpLmZvcm1hdF0/P2UuZm9ybWF0fWB9Y2FzZSJub3RfbXVsdGlwbGVfb2YiOnJldHVybmBJbnZhbGlkIG51bWJlcjogbXVzdCBiZSBhIG11bHRpcGxlIG9mICR7ZS5kaXZpc29yfWA7Y2FzZSJ1bnJlY29nbml6ZWRfa2V5cyI6cmV0dXJuYFVucmVjb2duaXplZCBrZXkke2Uua2V5cy5sZW5ndGg+MT8icyI6IiJ9OiAke18oZS5rZXlzLCIsICIpfWA7Y2FzZSJpbnZhbGlkX2tleSI6cmV0dXJuYEludmFsaWQga2V5IGluICR7ZS5vcmlnaW59YDtjYXNlImludmFsaWRfdW5pb24iOnJldHVybiBlLm9wdGlvbnMmJkFycmF5LmlzQXJyYXkoZS5vcHRpb25zKSYmZS5vcHRpb25zLmxlbmd0aD4wP2BJbnZhbGlkIGRpc2NyaW1pbmF0b3IgdmFsdWUuIEV4cGVjdGVkICR7ZS5vcHRpb25zLm1hcChhPT5gJyR7YX0nYCkuam9pbigiIHwgIil9YDoiSW52YWxpZCBpbnB1dCI7Y2FzZSJpbnZhbGlkX2VsZW1lbnQiOnJldHVybmBJbnZhbGlkIHZhbHVlIGluICR7ZS5vcmlnaW59YDtkZWZhdWx0OnJldHVybiJJbnZhbGlkIGlucHV0In19fTtmdW5jdGlvbiB6bCgpe3JldHVybntsb2NhbGVFcnJvcjp0ZigpfX1jb25zdCBuZj0oKT0+e2NvbnN0IHQ9e3N0cmluZzp7dW5pdDoia2FyYWt0cm9qbiIsdmVyYjoiaGF2aSJ9LGZpbGU6e3VuaXQ6ImJhanRvam4iLHZlcmI6ImhhdmkifSxhcnJheTp7dW5pdDoiZWxlbWVudG9qbiIsdmVyYjoiaGF2aSJ9LHNldDp7dW5pdDoiZWxlbWVudG9qbiIsdmVyYjoiaGF2aSJ9fTtmdW5jdGlvbiBuKGUpe3JldHVybiB0W2VdPz9udWxsfWNvbnN0IHI9e3JlZ2V4OiJlbmlnbyIsZW1haWw6InJldGFkcmVzbyIsdXJsOiJVUkwiLGVtb2ppOiJlbW/EnWlvIix1dWlkOiJVVUlEIix1dWlkdjQ6IlVVSUR2NCIsdXVpZHY2OiJVVUlEdjYiLG5hbm9pZDoibmFub2lkIixndWlkOiJHVUlEIixjdWlkOiJjdWlkIixjdWlkMjoiY3VpZDIiLHVsaWQ6IlVMSUQiLHhpZDoiWElEIixrc3VpZDoiS1NVSUQiLGRhdGV0aW1lOiJJU08tZGF0b3RlbXBvIixkYXRlOiJJU08tZGF0byIsdGltZToiSVNPLXRlbXBvIixkdXJhdGlvbjoiSVNPLWRhxa1ybyIsaXB2NDoiSVB2NC1hZHJlc28iLGlwdjY6IklQdjYtYWRyZXNvIixjaWRydjQ6IklQdjQtcmFuZ28iLGNpZHJ2NjoiSVB2Ni1yYW5nbyIsYmFzZTY0OiI2NC11bWUga29kaXRhIGthcmFrdHJhcm8iLGJhc2U2NHVybDoiVVJMLTY0LXVtZSBrb2RpdGEga2FyYWt0cmFybyIsanNvbl9zdHJpbmc6IkpTT04ta2FyYWt0cmFybyIsZTE2NDoiRS4xNjQtbm9tYnJvIixqd3Q6IkpXVCIsdGVtcGxhdGVfbGl0ZXJhbDoiZW5pZ28ifSxvPXtuYW46Ik5hTiIsbnVtYmVyOiJub21icm8iLGFycmF5OiJ0YWJlbG8iLG51bGw6InNlbnZhbG9yYSJ9O3JldHVybiBlPT57c3dpdGNoKGUuY29kZSl7Y2FzZSJpbnZhbGlkX3R5cGUiOntjb25zdCBpPW9bZS5leHBlY3RlZF0/P2UuZXhwZWN0ZWQsYT13KGUuaW5wdXQpLHM9b1thXT8/YTtyZXR1cm4vXltBLVpdLy50ZXN0KGUuZXhwZWN0ZWQpP2BOZXZhbGlkYSBlbmlnbzogYXRlbmRpxJ1pcyBpbnN0YW5jZW9mICR7ZS5leHBlY3RlZH0sIHJpY2V2acSdaXMgJHtzfWA6YE5ldmFsaWRhIGVuaWdvOiBhdGVuZGnEnWlzICR7aX0sIHJpY2V2acSdaXMgJHtzfWB9Y2FzZSJpbnZhbGlkX3ZhbHVlIjpyZXR1cm4gZS52YWx1ZXMubGVuZ3RoPT09MT9gTmV2YWxpZGEgZW5pZ286IGF0ZW5kacSdaXMgJHtTKGUudmFsdWVzWzBdKX1gOmBOZXZhbGlkYSBvcGNpbzogYXRlbmRpxJ1pcyB1bnUgZWwgJHtfKGUudmFsdWVzLCJ8Iil9YDtjYXNlInRvb19iaWciOntjb25zdCBpPWUuaW5jbHVzaXZlPyI8PSI6IjwiLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YFRybyBncmFuZGE6IGF0ZW5kacSdaXMga2UgJHtlLm9yaWdpbj8/InZhbG9ybyJ9IGhhdnUgJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0Pz8iZWxlbWVudG9qbiJ9YDpgVHJvIGdyYW5kYTogYXRlbmRpxJ1pcyBrZSAke2Uub3JpZ2luPz8idmFsb3JvIn0gaGF2dSAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX1gfWNhc2UidG9vX3NtYWxsIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPj0iOiI+IixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2BUcm8gbWFsZ3JhbmRhOiBhdGVuZGnEnWlzIGtlICR7ZS5vcmlnaW59IGhhdnUgJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0fWA6YFRybyBtYWxncmFuZGE6IGF0ZW5kacSdaXMga2UgJHtlLm9yaWdpbn0gZXN0dSAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX1gfWNhc2UiaW52YWxpZF9mb3JtYXQiOntjb25zdCBpPWU7cmV0dXJuIGkuZm9ybWF0PT09InN0YXJ0c193aXRoIj9gTmV2YWxpZGEga2FyYWt0cmFybzogZGV2YXMga29tZW5jacSdaSBwZXIgIiR7aS5wcmVmaXh9ImA6aS5mb3JtYXQ9PT0iZW5kc193aXRoIj9gTmV2YWxpZGEga2FyYWt0cmFybzogZGV2YXMgZmluacSdaSBwZXIgIiR7aS5zdWZmaXh9ImA6aS5mb3JtYXQ9PT0iaW5jbHVkZXMiP2BOZXZhbGlkYSBrYXJha3RyYXJvOiBkZXZhcyBpbmtsdXppdmkgIiR7aS5pbmNsdWRlc30iYDppLmZvcm1hdD09PSJyZWdleCI/YE5ldmFsaWRhIGthcmFrdHJhcm86IGRldmFzIGtvbmdydWkga3VuIGxhIG1vZGVsbyAke2kucGF0dGVybn1gOmBOZXZhbGlkYSAke3JbaS5mb3JtYXRdPz9lLmZvcm1hdH1gfWNhc2Uibm90X211bHRpcGxlX29mIjpyZXR1cm5gTmV2YWxpZGEgbm9tYnJvOiBkZXZhcyBlc3RpIG9ibG8gZGUgJHtlLmRpdmlzb3J9YDtjYXNlInVucmVjb2duaXplZF9rZXlzIjpyZXR1cm5gTmVrb25hdGEke2Uua2V5cy5sZW5ndGg+MT8iaiI6IiJ9IMWdbG9zaWxvJHtlLmtleXMubGVuZ3RoPjE/ImoiOiIifTogJHtfKGUua2V5cywiLCAiKX1gO2Nhc2UiaW52YWxpZF9rZXkiOnJldHVybmBOZXZhbGlkYSDFnWxvc2lsbyBlbiAke2Uub3JpZ2lufWA7Y2FzZSJpbnZhbGlkX3VuaW9uIjpyZXR1cm4iTmV2YWxpZGEgZW5pZ28iO2Nhc2UiaW52YWxpZF9lbGVtZW50IjpyZXR1cm5gTmV2YWxpZGEgdmFsb3JvIGVuICR7ZS5vcmlnaW59YDtkZWZhdWx0OnJldHVybiJOZXZhbGlkYSBlbmlnbyJ9fX07ZnVuY3Rpb24gcmYoKXtyZXR1cm57bG9jYWxlRXJyb3I6bmYoKX19Y29uc3Qgb2Y9KCk9Pntjb25zdCB0PXtzdHJpbmc6e3VuaXQ6ImNhcmFjdGVyZXMiLHZlcmI6InRlbmVyIn0sZmlsZTp7dW5pdDoiYnl0ZXMiLHZlcmI6InRlbmVyIn0sYXJyYXk6e3VuaXQ6ImVsZW1lbnRvcyIsdmVyYjoidGVuZXIifSxzZXQ6e3VuaXQ6ImVsZW1lbnRvcyIsdmVyYjoidGVuZXIifX07ZnVuY3Rpb24gbihlKXtyZXR1cm4gdFtlXT8/bnVsbH1jb25zdCByPXtyZWdleDoiZW50cmFkYSIsZW1haWw6ImRpcmVjY2nDs24gZGUgY29ycmVvIGVsZWN0csOzbmljbyIsdXJsOiJVUkwiLGVtb2ppOiJlbW9qaSIsdXVpZDoiVVVJRCIsdXVpZHY0OiJVVUlEdjQiLHV1aWR2NjoiVVVJRHY2IixuYW5vaWQ6Im5hbm9pZCIsZ3VpZDoiR1VJRCIsY3VpZDoiY3VpZCIsY3VpZDI6ImN1aWQyIix1bGlkOiJVTElEIix4aWQ6IlhJRCIsa3N1aWQ6IktTVUlEIixkYXRldGltZToiZmVjaGEgeSBob3JhIElTTyIsZGF0ZToiZmVjaGEgSVNPIix0aW1lOiJob3JhIElTTyIsZHVyYXRpb246ImR1cmFjacOzbiBJU08iLGlwdjQ6ImRpcmVjY2nDs24gSVB2NCIsaXB2NjoiZGlyZWNjacOzbiBJUHY2IixjaWRydjQ6InJhbmdvIElQdjQiLGNpZHJ2NjoicmFuZ28gSVB2NiIsYmFzZTY0OiJjYWRlbmEgY29kaWZpY2FkYSBlbiBiYXNlNjQiLGJhc2U2NHVybDoiVVJMIGNvZGlmaWNhZGEgZW4gYmFzZTY0Iixqc29uX3N0cmluZzoiY2FkZW5hIEpTT04iLGUxNjQ6Im7Dum1lcm8gRS4xNjQiLGp3dDoiSldUIix0ZW1wbGF0ZV9saXRlcmFsOiJlbnRyYWRhIn0sbz17bmFuOiJOYU4iLHN0cmluZzoidGV4dG8iLG51bWJlcjoibsO6bWVybyIsYm9vbGVhbjoiYm9vbGVhbm8iLGFycmF5OiJhcnJlZ2xvIixvYmplY3Q6Im9iamV0byIsc2V0OiJjb25qdW50byIsZmlsZToiYXJjaGl2byIsZGF0ZToiZmVjaGEiLGJpZ2ludDoibsO6bWVybyBncmFuZGUiLHN5bWJvbDoic8OtbWJvbG8iLHVuZGVmaW5lZDoiaW5kZWZpbmlkbyIsbnVsbDoibnVsbyIsZnVuY3Rpb246ImZ1bmNpw7NuIixtYXA6Im1hcGEiLHJlY29yZDoicmVnaXN0cm8iLHR1cGxlOiJ0dXBsYSIsZW51bToiZW51bWVyYWNpw7NuIix1bmlvbjoidW5pw7NuIixsaXRlcmFsOiJsaXRlcmFsIixwcm9taXNlOiJwcm9tZXNhIix2b2lkOiJ2YWPDrW8iLG5ldmVyOiJudW5jYSIsdW5rbm93bjoiZGVzY29ub2NpZG8iLGFueToiY3VhbHF1aWVyYSJ9O3JldHVybiBlPT57c3dpdGNoKGUuY29kZSl7Y2FzZSJpbnZhbGlkX3R5cGUiOntjb25zdCBpPW9bZS5leHBlY3RlZF0/P2UuZXhwZWN0ZWQsYT13KGUuaW5wdXQpLHM9b1thXT8/YTtyZXR1cm4vXltBLVpdLy50ZXN0KGUuZXhwZWN0ZWQpP2BFbnRyYWRhIGludsOhbGlkYTogc2UgZXNwZXJhYmEgaW5zdGFuY2VvZiAke2UuZXhwZWN0ZWR9LCByZWNpYmlkbyAke3N9YDpgRW50cmFkYSBpbnbDoWxpZGE6IHNlIGVzcGVyYWJhICR7aX0sIHJlY2liaWRvICR7c31gfWNhc2UiaW52YWxpZF92YWx1ZSI6cmV0dXJuIGUudmFsdWVzLmxlbmd0aD09PTE/YEVudHJhZGEgaW52w6FsaWRhOiBzZSBlc3BlcmFiYSAke1MoZS52YWx1ZXNbMF0pfWA6YE9wY2nDs24gaW52w6FsaWRhOiBzZSBlc3BlcmFiYSB1bmEgZGUgJHtfKGUudmFsdWVzLCJ8Iil9YDtjYXNlInRvb19iaWciOntjb25zdCBpPWUuaW5jbHVzaXZlPyI8PSI6IjwiLGE9bihlLm9yaWdpbikscz1vW2Uub3JpZ2luXT8/ZS5vcmlnaW47cmV0dXJuIGE/YERlbWFzaWFkbyBncmFuZGU6IHNlIGVzcGVyYWJhIHF1ZSAke3M/PyJ2YWxvciJ9IHR1dmllcmEgJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0Pz8iZWxlbWVudG9zIn1gOmBEZW1hc2lhZG8gZ3JhbmRlOiBzZSBlc3BlcmFiYSBxdWUgJHtzPz8idmFsb3IifSBmdWVyYSAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX1gfWNhc2UidG9vX3NtYWxsIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPj0iOiI+IixhPW4oZS5vcmlnaW4pLHM9b1tlLm9yaWdpbl0/P2Uub3JpZ2luO3JldHVybiBhP2BEZW1hc2lhZG8gcGVxdWXDsW86IHNlIGVzcGVyYWJhIHF1ZSAke3N9IHR1dmllcmEgJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0fWA6YERlbWFzaWFkbyBwZXF1ZcOxbzogc2UgZXNwZXJhYmEgcXVlICR7c30gZnVlcmEgJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9YH1jYXNlImludmFsaWRfZm9ybWF0Ijp7Y29uc3QgaT1lO3JldHVybiBpLmZvcm1hdD09PSJzdGFydHNfd2l0aCI/YENhZGVuYSBpbnbDoWxpZGE6IGRlYmUgY29tZW56YXIgY29uICIke2kucHJlZml4fSJgOmkuZm9ybWF0PT09ImVuZHNfd2l0aCI/YENhZGVuYSBpbnbDoWxpZGE6IGRlYmUgdGVybWluYXIgZW4gIiR7aS5zdWZmaXh9ImA6aS5mb3JtYXQ9PT0iaW5jbHVkZXMiP2BDYWRlbmEgaW52w6FsaWRhOiBkZWJlIGluY2x1aXIgIiR7aS5pbmNsdWRlc30iYDppLmZvcm1hdD09PSJyZWdleCI/YENhZGVuYSBpbnbDoWxpZGE6IGRlYmUgY29pbmNpZGlyIGNvbiBlbCBwYXRyw7NuICR7aS5wYXR0ZXJufWA6YEludsOhbGlkbyAke3JbaS5mb3JtYXRdPz9lLmZvcm1hdH1gfWNhc2Uibm90X211bHRpcGxlX29mIjpyZXR1cm5gTsO6bWVybyBpbnbDoWxpZG86IGRlYmUgc2VyIG3Dumx0aXBsbyBkZSAke2UuZGl2aXNvcn1gO2Nhc2UidW5yZWNvZ25pemVkX2tleXMiOnJldHVybmBMbGF2ZSR7ZS5rZXlzLmxlbmd0aD4xPyJzIjoiIn0gZGVzY29ub2NpZGEke2Uua2V5cy5sZW5ndGg+MT8icyI6IiJ9OiAke18oZS5rZXlzLCIsICIpfWA7Y2FzZSJpbnZhbGlkX2tleSI6cmV0dXJuYExsYXZlIGludsOhbGlkYSBlbiAke29bZS5vcmlnaW5dPz9lLm9yaWdpbn1gO2Nhc2UiaW52YWxpZF91bmlvbiI6cmV0dXJuIkVudHJhZGEgaW52w6FsaWRhIjtjYXNlImludmFsaWRfZWxlbWVudCI6cmV0dXJuYFZhbG9yIGludsOhbGlkbyBlbiAke29bZS5vcmlnaW5dPz9lLm9yaWdpbn1gO2RlZmF1bHQ6cmV0dXJuIkVudHJhZGEgaW52w6FsaWRhIn19fTtmdW5jdGlvbiBhZigpe3JldHVybntsb2NhbGVFcnJvcjpvZigpfX1jb25zdCBzZj0oKT0+e2NvbnN0IHQ9e3N0cmluZzp7dW5pdDoi2qnYp9ix2Kfaqdiq2LEiLHZlcmI6Itiv2KfYtNiq2Ycg2KjYp9i02K8ifSxmaWxlOnt1bml0OiLYqNin24zYqiIsdmVyYjoi2K/Yp9i02KrZhyDYqNin2LTYryJ9LGFycmF5Ont1bml0OiLYotuM2KrZhSIsdmVyYjoi2K/Yp9i02KrZhyDYqNin2LTYryJ9LHNldDp7dW5pdDoi2KLbjNiq2YUiLHZlcmI6Itiv2KfYtNiq2Ycg2KjYp9i02K8ifX07ZnVuY3Rpb24gbihlKXtyZXR1cm4gdFtlXT8/bnVsbH1jb25zdCByPXtyZWdleDoi2YjYsdmI2K/bjCIsZW1haWw6Itii2K/YsdizINin24zZhduM2YQiLHVybDoiVVJMIixlbW9qaToi2KfbjNmF2YjYrNuMIix1dWlkOiJVVUlEIix1dWlkdjQ6IlVVSUR2NCIsdXVpZHY2OiJVVUlEdjYiLG5hbm9pZDoibmFub2lkIixndWlkOiJHVUlEIixjdWlkOiJjdWlkIixjdWlkMjoiY3VpZDIiLHVsaWQ6IlVMSUQiLHhpZDoiWElEIixrc3VpZDoiS1NVSUQiLGRhdGV0aW1lOiLYqtin2LHbjNiuINmIINiy2YXYp9mGINin24zYstmIIixkYXRlOiLYqtin2LHbjNiuINin24zYstmIIix0aW1lOiLYstmF2KfZhiDYp9uM2LLZiCIsZHVyYXRpb246ItmF2K/YqiDYstmF2KfZhiDYp9uM2LLZiCIsaXB2NDoiSVB2NCDYotiv2LHYsyIsaXB2NjoiSVB2NiDYotiv2LHYsyIsY2lkcnY0OiJJUHY0INiv2KfZhdmG2YciLGNpZHJ2NjoiSVB2NiDYr9in2YXZhtmHIixiYXNlNjQ6ImJhc2U2NC1lbmNvZGVkINix2LTYqtmHIixiYXNlNjR1cmw6ImJhc2U2NHVybC1lbmNvZGVkINix2LTYqtmHIixqc29uX3N0cmluZzoiSlNPTiDYsdi02KrZhyIsZTE2NDoiRS4xNjQg2LnYr9ivIixqd3Q6IkpXVCIsdGVtcGxhdGVfbGl0ZXJhbDoi2YjYsdmI2K/bjCJ9LG89e25hbjoiTmFOIixudW1iZXI6Iti52K/YryIsYXJyYXk6Itii2LHYp9uM2YcifTtyZXR1cm4gZT0+e3N3aXRjaChlLmNvZGUpe2Nhc2UiaW52YWxpZF90eXBlIjp7Y29uc3QgaT1vW2UuZXhwZWN0ZWRdPz9lLmV4cGVjdGVkLGE9dyhlLmlucHV0KSxzPW9bYV0/P2E7cmV0dXJuL15bQS1aXS8udGVzdChlLmV4cGVjdGVkKT9g2YjYsdmI2K/bjCDZhtin2YXYudiq2KjYsTog2YXbjOKAjNio2KfbjNiz2KogaW5zdGFuY2VvZiAke2UuZXhwZWN0ZWR9INmF24zigIzYqNmI2K/YjCAke3N9INiv2LHbjNin2YHYqiDYtNivYDpg2YjYsdmI2K/bjCDZhtin2YXYudiq2KjYsTog2YXbjOKAjNio2KfbjNiz2KogJHtpfSDZhduM4oCM2KjZiNiv2IwgJHtzfSDYr9ix24zYp9mB2Kog2LTYr2B9Y2FzZSJpbnZhbGlkX3ZhbHVlIjpyZXR1cm4gZS52YWx1ZXMubGVuZ3RoPT09MT9g2YjYsdmI2K/bjCDZhtin2YXYudiq2KjYsTog2YXbjOKAjNio2KfbjNiz2KogJHtTKGUudmFsdWVzWzBdKX0g2YXbjOKAjNio2YjYr2A6YNqv2LLbjNmG2Ycg2YbYp9mF2LnYqtio2LE6INmF24zigIzYqNin24zYs9iqINuM2qnbjCDYp9iyICR7XyhlLnZhbHVlcywifCIpfSDZhduM4oCM2KjZiNivYDtjYXNlInRvb19iaWciOntjb25zdCBpPWUuaW5jbHVzaXZlPyI8PSI6IjwiLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YNiu24zZhNuMINio2LLYsdqvOiAke2Uub3JpZ2luPz8i2YXZgtiv2KfYsSJ9INio2KfbjNivICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfSAke2EudW5pdD8/Iti52YbYtdixIn0g2KjYp9i02K9gOmDYrtuM2YTbjCDYqNiy2LHarzogJHtlLm9yaWdpbj8/ItmF2YLYr9in2LEifSDYqNin24zYryAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX0g2KjYp9i02K9gfWNhc2UidG9vX3NtYWxsIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPj0iOiI+IixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2DYrtuM2YTbjCDaqdmI2obaqTogJHtlLm9yaWdpbn0g2KjYp9uM2K8gJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0fSDYqNin2LTYr2A6YNiu24zZhNuMINqp2YjahtqpOiAke2Uub3JpZ2lufSDYqNin24zYryAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX0g2KjYp9i02K9gfWNhc2UiaW52YWxpZF9mb3JtYXQiOntjb25zdCBpPWU7cmV0dXJuIGkuZm9ybWF0PT09InN0YXJ0c193aXRoIj9g2LHYtNiq2Ycg2YbYp9mF2LnYqtio2LE6INio2KfbjNivINio2KcgIiR7aS5wcmVmaXh9IiDYtNix2YjYuSDYtNmI2K9gOmkuZm9ybWF0PT09ImVuZHNfd2l0aCI/YNix2LTYqtmHINmG2KfZhdi52KrYqNixOiDYqNin24zYryDYqNinICIke2kuc3VmZml4fSIg2KrZhdin2YUg2LTZiNivYDppLmZvcm1hdD09PSJpbmNsdWRlcyI/YNix2LTYqtmHINmG2KfZhdi52KrYqNixOiDYqNin24zYryDYtNin2YXZhCAiJHtpLmluY2x1ZGVzfSIg2KjYp9i02K9gOmkuZm9ybWF0PT09InJlZ2V4Ij9g2LHYtNiq2Ycg2YbYp9mF2LnYqtio2LE6INio2KfbjNivINio2Kcg2KfZhNqv2YjbjCAke2kucGF0dGVybn0g2YXYt9in2KjZgtiqINiv2KfYtNiq2Ycg2KjYp9i02K9gOmAke3JbaS5mb3JtYXRdPz9lLmZvcm1hdH0g2YbYp9mF2LnYqtio2LFgfWNhc2Uibm90X211bHRpcGxlX29mIjpyZXR1cm5g2LnYr9ivINmG2KfZhdi52KrYqNixOiDYqNin24zYryDZhdi22LHYqCAke2UuZGl2aXNvcn0g2KjYp9i02K9gO2Nhc2UidW5yZWNvZ25pemVkX2tleXMiOnJldHVybmDaqdmE24zYryR7ZS5rZXlzLmxlbmd0aD4xPyLZh9in24wiOiIifSDZhtin2LTZhtin2LM6ICR7XyhlLmtleXMsIiwgIil9YDtjYXNlImludmFsaWRfa2V5IjpyZXR1cm5g2qnZhNuM2K8g2YbYp9i02YbYp9izINiv2LEgJHtlLm9yaWdpbn1gO2Nhc2UiaW52YWxpZF91bmlvbiI6cmV0dXJuItmI2LHZiNiv24wg2YbYp9mF2LnYqtio2LEiO2Nhc2UiaW52YWxpZF9lbGVtZW50IjpyZXR1cm5g2YXZgtiv2KfYsSDZhtin2YXYudiq2KjYsSDYr9ixICR7ZS5vcmlnaW59YDtkZWZhdWx0OnJldHVybiLZiNix2YjYr9uMINmG2KfZhdi52KrYqNixIn19fTtmdW5jdGlvbiBjZigpe3JldHVybntsb2NhbGVFcnJvcjpzZigpfX1jb25zdCB1Zj0oKT0+e2NvbnN0IHQ9e3N0cmluZzp7dW5pdDoibWVya2tpw6QiLHN1YmplY3Q6Im1lcmtraWpvbm9uIn0sZmlsZTp7dW5pdDoidGF2dWEiLHN1YmplY3Q6InRpZWRvc3RvbiJ9LGFycmF5Ont1bml0OiJhbGtpb3RhIixzdWJqZWN0OiJsaXN0YW4ifSxzZXQ6e3VuaXQ6ImFsa2lvdGEiLHN1YmplY3Q6ImpvdWtvbiJ9LG51bWJlcjp7dW5pdDoiIixzdWJqZWN0OiJsdXZ1biJ9LGJpZ2ludDp7dW5pdDoiIixzdWJqZWN0OiJzdXVyZW4ga29rb25haXNsdXZ1biJ9LGludDp7dW5pdDoiIixzdWJqZWN0OiJrb2tvbmFpc2x1dnVuIn0sZGF0ZTp7dW5pdDoiIixzdWJqZWN0OiJww6RpdsOkbcOkw6Ryw6RuIn19O2Z1bmN0aW9uIG4oZSl7cmV0dXJuIHRbZV0/P251bGx9Y29uc3Qgcj17cmVnZXg6InPDpMOkbm7DtmxsaW5lbiBsYXVzZWtlIixlbWFpbDoic8OkaGvDtnBvc3Rpb3NvaXRlIix1cmw6IlVSTC1vc29pdGUiLGVtb2ppOiJlbW9qaSIsdXVpZDoiVVVJRCIsdXVpZHY0OiJVVUlEdjQiLHV1aWR2NjoiVVVJRHY2IixuYW5vaWQ6Im5hbm9pZCIsZ3VpZDoiR1VJRCIsY3VpZDoiY3VpZCIsY3VpZDI6ImN1aWQyIix1bGlkOiJVTElEIix4aWQ6IlhJRCIsa3N1aWQ6IktTVUlEIixkYXRldGltZToiSVNPLWFpa2FsZWltYSIsZGF0ZToiSVNPLXDDpGl2w6Rtw6TDpHLDpCIsdGltZToiSVNPLWFpa2EiLGR1cmF0aW9uOiJJU08ta2VzdG8iLGlwdjQ6IklQdjQtb3NvaXRlIixpcHY2OiJJUHY2LW9zb2l0ZSIsY2lkcnY0OiJJUHY0LWFsdWUiLGNpZHJ2NjoiSVB2Ni1hbHVlIixiYXNlNjQ6ImJhc2U2NC1rb29kYXR0dSBtZXJra2lqb25vIixiYXNlNjR1cmw6ImJhc2U2NHVybC1rb29kYXR0dSBtZXJra2lqb25vIixqc29uX3N0cmluZzoiSlNPTi1tZXJra2lqb25vIixlMTY0OiJFLjE2NC1sdWt1Iixqd3Q6IkpXVCIsdGVtcGxhdGVfbGl0ZXJhbDoidGVtcGxhYXR0aW1lcmtraWpvbm8ifSxvPXtuYW46Ik5hTiJ9O3JldHVybiBlPT57c3dpdGNoKGUuY29kZSl7Y2FzZSJpbnZhbGlkX3R5cGUiOntjb25zdCBpPW9bZS5leHBlY3RlZF0/P2UuZXhwZWN0ZWQsYT13KGUuaW5wdXQpLHM9b1thXT8/YTtyZXR1cm4vXltBLVpdLy50ZXN0KGUuZXhwZWN0ZWQpP2BWaXJoZWVsbGluZW4gdHl5cHBpOiBvZG90ZXR0aWluIGluc3RhbmNlb2YgJHtlLmV4cGVjdGVkfSwgb2xpICR7c31gOmBWaXJoZWVsbGluZW4gdHl5cHBpOiBvZG90ZXR0aWluICR7aX0sIG9saSAke3N9YH1jYXNlImludmFsaWRfdmFsdWUiOnJldHVybiBlLnZhbHVlcy5sZW5ndGg9PT0xP2BWaXJoZWVsbGluZW4gc3nDtnRlOiB0w6R5dHl5IG9sbGEgJHtTKGUudmFsdWVzWzBdKX1gOmBWaXJoZWVsbGluZW4gdmFsaW50YTogdMOkeXR5eSBvbGxhIHlrc2kgc2V1cmFhdmlzdGE6ICR7XyhlLnZhbHVlcywifCIpfWA7Y2FzZSJ0b29fYmlnIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPD0iOiI8IixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2BMaWlhbiBzdXVyaTogJHthLnN1YmplY3R9IHTDpHl0eXkgb2xsYSAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX0gJHthLnVuaXR9YC50cmltKCk6YExpaWFuIHN1dXJpOiBhcnZvbiB0w6R5dHl5IG9sbGEgJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9YH1jYXNlInRvb19zbWFsbCI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ij49IjoiPiIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9gTGlpYW4gcGllbmk6ICR7YS5zdWJqZWN0fSB0w6R5dHl5IG9sbGEgJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0fWAudHJpbSgpOmBMaWlhbiBwaWVuaTogYXJ2b24gdMOkeXR5eSBvbGxhICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfWB9Y2FzZSJpbnZhbGlkX2Zvcm1hdCI6e2NvbnN0IGk9ZTtyZXR1cm4gaS5mb3JtYXQ9PT0ic3RhcnRzX3dpdGgiP2BWaXJoZWVsbGluZW4gc3nDtnRlOiB0w6R5dHl5IGFsa2FhICIke2kucHJlZml4fSJgOmkuZm9ybWF0PT09ImVuZHNfd2l0aCI/YFZpcmhlZWxsaW5lbiBzecO2dGU6IHTDpHl0eXkgbG9wcHVhICIke2kuc3VmZml4fSJgOmkuZm9ybWF0PT09ImluY2x1ZGVzIj9gVmlyaGVlbGxpbmVuIHN5w7Z0ZTogdMOkeXR5eSBzaXPDpGx0w6TDpCAiJHtpLmluY2x1ZGVzfSJgOmkuZm9ybWF0PT09InJlZ2V4Ij9gVmlyaGVlbGxpbmVuIHN5w7Z0ZTogdMOkeXR5eSB2YXN0YXRhIHPDpMOkbm7DtmxsaXN0w6QgbGF1c2VrZXR0YSAke2kucGF0dGVybn1gOmBWaXJoZWVsbGluZW4gJHtyW2kuZm9ybWF0XT8/ZS5mb3JtYXR9YH1jYXNlIm5vdF9tdWx0aXBsZV9vZiI6cmV0dXJuYFZpcmhlZWxsaW5lbiBsdWt1OiB0w6R5dHl5IG9sbGEgbHV2dW4gJHtlLmRpdmlzb3J9IG1vbmlrZXJ0YWA7Y2FzZSJ1bnJlY29nbml6ZWRfa2V5cyI6cmV0dXJuYCR7ZS5rZXlzLmxlbmd0aD4xPyJUdW50ZW1hdHRvbWF0IGF2YWltZXQiOiJUdW50ZW1hdG9uIGF2YWluIn06ICR7XyhlLmtleXMsIiwgIil9YDtjYXNlImludmFsaWRfa2V5IjpyZXR1cm4iVmlyaGVlbGxpbmVuIGF2YWluIHRpZXR1ZWVzc2EiO2Nhc2UiaW52YWxpZF91bmlvbiI6cmV0dXJuIlZpcmhlZWxsaW5lbiB1bmlvbmkiO2Nhc2UiaW52YWxpZF9lbGVtZW50IjpyZXR1cm4iVmlyaGVlbGxpbmVuIGFydm8gam91a29zc2EiO2RlZmF1bHQ6cmV0dXJuIlZpcmhlZWxsaW5lbiBzecO2dGUifX19O2Z1bmN0aW9uIGxmKCl7cmV0dXJue2xvY2FsZUVycm9yOnVmKCl9fWNvbnN0IGRmPSgpPT57Y29uc3QgdD17c3RyaW5nOnt1bml0OiJjYXJhY3TDqHJlcyIsdmVyYjoiYXZvaXIifSxmaWxlOnt1bml0OiJvY3RldHMiLHZlcmI6ImF2b2lyIn0sYXJyYXk6e3VuaXQ6IsOpbMOpbWVudHMiLHZlcmI6ImF2b2lyIn0sc2V0Ont1bml0OiLDqWzDqW1lbnRzIix2ZXJiOiJhdm9pciJ9fTtmdW5jdGlvbiBuKGUpe3JldHVybiB0W2VdPz9udWxsfWNvbnN0IHI9e3JlZ2V4OiJlbnRyw6llIixlbWFpbDoiYWRyZXNzZSBlLW1haWwiLHVybDoiVVJMIixlbW9qaToiZW1vamkiLHV1aWQ6IlVVSUQiLHV1aWR2NDoiVVVJRHY0Iix1dWlkdjY6IlVVSUR2NiIsbmFub2lkOiJuYW5vaWQiLGd1aWQ6IkdVSUQiLGN1aWQ6ImN1aWQiLGN1aWQyOiJjdWlkMiIsdWxpZDoiVUxJRCIseGlkOiJYSUQiLGtzdWlkOiJLU1VJRCIsZGF0ZXRpbWU6ImRhdGUgZXQgaGV1cmUgSVNPIixkYXRlOiJkYXRlIElTTyIsdGltZToiaGV1cmUgSVNPIixkdXJhdGlvbjoiZHVyw6llIElTTyIsaXB2NDoiYWRyZXNzZSBJUHY0IixpcHY2OiJhZHJlc3NlIElQdjYiLGNpZHJ2NDoicGxhZ2UgSVB2NCIsY2lkcnY2OiJwbGFnZSBJUHY2IixiYXNlNjQ6ImNoYcOubmUgZW5jb2TDqWUgZW4gYmFzZTY0IixiYXNlNjR1cmw6ImNoYcOubmUgZW5jb2TDqWUgZW4gYmFzZTY0dXJsIixqc29uX3N0cmluZzoiY2hhw65uZSBKU09OIixlMTY0OiJudW3DqXJvIEUuMTY0Iixqd3Q6IkpXVCIsdGVtcGxhdGVfbGl0ZXJhbDoiZW50csOpZSJ9LG89e3N0cmluZzoiY2hhw65uZSIsbnVtYmVyOiJub21icmUiLGludDoiZW50aWVyIixib29sZWFuOiJib29sw6llbiIsYmlnaW50OiJncmFuZCBlbnRpZXIiLHN5bWJvbDoic3ltYm9sZSIsdW5kZWZpbmVkOiJpbmTDqWZpbmkiLG51bGw6Im51bGwiLG5ldmVyOiJqYW1haXMiLHZvaWQ6InZpZGUiLGRhdGU6ImRhdGUiLGFycmF5OiJ0YWJsZWF1IixvYmplY3Q6Im9iamV0Iix0dXBsZToidHVwbGUiLHJlY29yZDoiZW5yZWdpc3RyZW1lbnQiLG1hcDoiY2FydGUiLHNldDoiZW5zZW1ibGUiLGZpbGU6ImZpY2hpZXIiLG5vbm9wdGlvbmFsOiJub24tb3B0aW9ubmVsIixuYW46Ik5hTiIsZnVuY3Rpb246ImZvbmN0aW9uIn07cmV0dXJuIGU9Pntzd2l0Y2goZS5jb2RlKXtjYXNlImludmFsaWRfdHlwZSI6e2NvbnN0IGk9b1tlLmV4cGVjdGVkXT8/ZS5leHBlY3RlZCxhPXcoZS5pbnB1dCkscz1vW2FdPz9hO3JldHVybi9eW0EtWl0vLnRlc3QoZS5leHBlY3RlZCk/YEVudHLDqWUgaW52YWxpZGUgOiBpbnN0YW5jZW9mICR7ZS5leHBlY3RlZH0gYXR0ZW5kdSwgJHtzfSByZcOndWA6YEVudHLDqWUgaW52YWxpZGUgOiAke2l9IGF0dGVuZHUsICR7c30gcmXDp3VgfWNhc2UiaW52YWxpZF92YWx1ZSI6cmV0dXJuIGUudmFsdWVzLmxlbmd0aD09PTE/YEVudHLDqWUgaW52YWxpZGUgOiAke1MoZS52YWx1ZXNbMF0pfSBhdHRlbmR1YDpgT3B0aW9uIGludmFsaWRlIDogdW5lIHZhbGV1ciBwYXJtaSAke18oZS52YWx1ZXMsInwiKX0gYXR0ZW5kdWVgO2Nhc2UidG9vX2JpZyI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ijw9IjoiPCIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9gVHJvcCBncmFuZCA6ICR7b1tlLm9yaWdpbl0/PyJ2YWxldXIifSBkb2l0ICR7YS52ZXJifSAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX0gJHthLnVuaXQ/PyLDqWzDqW1lbnQocykifWA6YFRyb3AgZ3JhbmQgOiAke29bZS5vcmlnaW5dPz8idmFsZXVyIn0gZG9pdCDDqnRyZSAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX1gfWNhc2UidG9vX3NtYWxsIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPj0iOiI+IixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2BUcm9wIHBldGl0IDogJHtvW2Uub3JpZ2luXT8/InZhbGV1ciJ9IGRvaXQgJHthLnZlcmJ9ICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfSAke2EudW5pdH1gOmBUcm9wIHBldGl0IDogJHtvW2Uub3JpZ2luXT8/InZhbGV1ciJ9IGRvaXQgw6p0cmUgJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9YH1jYXNlImludmFsaWRfZm9ybWF0Ijp7Y29uc3QgaT1lO3JldHVybiBpLmZvcm1hdD09PSJzdGFydHNfd2l0aCI/YENoYcOubmUgaW52YWxpZGUgOiBkb2l0IGNvbW1lbmNlciBwYXIgIiR7aS5wcmVmaXh9ImA6aS5mb3JtYXQ9PT0iZW5kc193aXRoIj9gQ2hhw65uZSBpbnZhbGlkZSA6IGRvaXQgc2UgdGVybWluZXIgcGFyICIke2kuc3VmZml4fSJgOmkuZm9ybWF0PT09ImluY2x1ZGVzIj9gQ2hhw65uZSBpbnZhbGlkZSA6IGRvaXQgaW5jbHVyZSAiJHtpLmluY2x1ZGVzfSJgOmkuZm9ybWF0PT09InJlZ2V4Ij9gQ2hhw65uZSBpbnZhbGlkZSA6IGRvaXQgY29ycmVzcG9uZHJlIGF1IG1vZMOobGUgJHtpLnBhdHRlcm59YDpgJHtyW2kuZm9ybWF0XT8/ZS5mb3JtYXR9IGludmFsaWRlYH1jYXNlIm5vdF9tdWx0aXBsZV9vZiI6cmV0dXJuYE5vbWJyZSBpbnZhbGlkZSA6IGRvaXQgw6p0cmUgdW4gbXVsdGlwbGUgZGUgJHtlLmRpdmlzb3J9YDtjYXNlInVucmVjb2duaXplZF9rZXlzIjpyZXR1cm5gQ2zDqSR7ZS5rZXlzLmxlbmd0aD4xPyJzIjoiIn0gbm9uIHJlY29ubnVlJHtlLmtleXMubGVuZ3RoPjE/InMiOiIifSA6ICR7XyhlLmtleXMsIiwgIil9YDtjYXNlImludmFsaWRfa2V5IjpyZXR1cm5gQ2zDqSBpbnZhbGlkZSBkYW5zICR7ZS5vcmlnaW59YDtjYXNlImludmFsaWRfdW5pb24iOnJldHVybiJFbnRyw6llIGludmFsaWRlIjtjYXNlImludmFsaWRfZWxlbWVudCI6cmV0dXJuYFZhbGV1ciBpbnZhbGlkZSBkYW5zICR7ZS5vcmlnaW59YDtkZWZhdWx0OnJldHVybiJFbnRyw6llIGludmFsaWRlIn19fTtmdW5jdGlvbiBtZigpe3JldHVybntsb2NhbGVFcnJvcjpkZigpfX1jb25zdCBwZj0oKT0+e2NvbnN0IHQ9e3N0cmluZzp7dW5pdDoiY2FyYWN0w6hyZXMiLHZlcmI6ImF2b2lyIn0sZmlsZTp7dW5pdDoib2N0ZXRzIix2ZXJiOiJhdm9pciJ9LGFycmF5Ont1bml0OiLDqWzDqW1lbnRzIix2ZXJiOiJhdm9pciJ9LHNldDp7dW5pdDoiw6lsw6ltZW50cyIsdmVyYjoiYXZvaXIifX07ZnVuY3Rpb24gbihlKXtyZXR1cm4gdFtlXT8/bnVsbH1jb25zdCByPXtyZWdleDoiZW50csOpZSIsZW1haWw6ImFkcmVzc2UgY291cnJpZWwiLHVybDoiVVJMIixlbW9qaToiZW1vamkiLHV1aWQ6IlVVSUQiLHV1aWR2NDoiVVVJRHY0Iix1dWlkdjY6IlVVSUR2NiIsbmFub2lkOiJuYW5vaWQiLGd1aWQ6IkdVSUQiLGN1aWQ6ImN1aWQiLGN1aWQyOiJjdWlkMiIsdWxpZDoiVUxJRCIseGlkOiJYSUQiLGtzdWlkOiJLU1VJRCIsZGF0ZXRpbWU6ImRhdGUtaGV1cmUgSVNPIixkYXRlOiJkYXRlIElTTyIsdGltZToiaGV1cmUgSVNPIixkdXJhdGlvbjoiZHVyw6llIElTTyIsaXB2NDoiYWRyZXNzZSBJUHY0IixpcHY2OiJhZHJlc3NlIElQdjYiLGNpZHJ2NDoicGxhZ2UgSVB2NCIsY2lkcnY2OiJwbGFnZSBJUHY2IixiYXNlNjQ6ImNoYcOubmUgZW5jb2TDqWUgZW4gYmFzZTY0IixiYXNlNjR1cmw6ImNoYcOubmUgZW5jb2TDqWUgZW4gYmFzZTY0dXJsIixqc29uX3N0cmluZzoiY2hhw65uZSBKU09OIixlMTY0OiJudW3DqXJvIEUuMTY0Iixqd3Q6IkpXVCIsdGVtcGxhdGVfbGl0ZXJhbDoiZW50csOpZSJ9LG89e25hbjoiTmFOIn07cmV0dXJuIGU9Pntzd2l0Y2goZS5jb2RlKXtjYXNlImludmFsaWRfdHlwZSI6e2NvbnN0IGk9b1tlLmV4cGVjdGVkXT8/ZS5leHBlY3RlZCxhPXcoZS5pbnB1dCkscz1vW2FdPz9hO3JldHVybi9eW0EtWl0vLnRlc3QoZS5leHBlY3RlZCk/YEVudHLDqWUgaW52YWxpZGUgOiBhdHRlbmR1IGluc3RhbmNlb2YgJHtlLmV4cGVjdGVkfSwgcmXDp3UgJHtzfWA6YEVudHLDqWUgaW52YWxpZGUgOiBhdHRlbmR1ICR7aX0sIHJlw6d1ICR7c31gfWNhc2UiaW52YWxpZF92YWx1ZSI6cmV0dXJuIGUudmFsdWVzLmxlbmd0aD09PTE/YEVudHLDqWUgaW52YWxpZGUgOiBhdHRlbmR1ICR7UyhlLnZhbHVlc1swXSl9YDpgT3B0aW9uIGludmFsaWRlIDogYXR0ZW5kdSBsJ3VuZSBkZXMgdmFsZXVycyBzdWl2YW50ZXMgJHtfKGUudmFsdWVzLCJ8Iil9YDtjYXNlInRvb19iaWciOntjb25zdCBpPWUuaW5jbHVzaXZlPyLiiaQiOiI8IixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2BUcm9wIGdyYW5kIDogYXR0ZW5kdSBxdWUgJHtlLm9yaWdpbj8/ImxhIHZhbGV1ciJ9IGFpdCAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX0gJHthLnVuaXR9YDpgVHJvcCBncmFuZCA6IGF0dGVuZHUgcXVlICR7ZS5vcmlnaW4/PyJsYSB2YWxldXIifSBzb2l0ICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfWB9Y2FzZSJ0b29fc21hbGwiOntjb25zdCBpPWUuaW5jbHVzaXZlPyLiiaUiOiI+IixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2BUcm9wIHBldGl0IDogYXR0ZW5kdSBxdWUgJHtlLm9yaWdpbn0gYWl0ICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfSAke2EudW5pdH1gOmBUcm9wIHBldGl0IDogYXR0ZW5kdSBxdWUgJHtlLm9yaWdpbn0gc29pdCAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX1gfWNhc2UiaW52YWxpZF9mb3JtYXQiOntjb25zdCBpPWU7cmV0dXJuIGkuZm9ybWF0PT09InN0YXJ0c193aXRoIj9gQ2hhw65uZSBpbnZhbGlkZSA6IGRvaXQgY29tbWVuY2VyIHBhciAiJHtpLnByZWZpeH0iYDppLmZvcm1hdD09PSJlbmRzX3dpdGgiP2BDaGHDrm5lIGludmFsaWRlIDogZG9pdCBzZSB0ZXJtaW5lciBwYXIgIiR7aS5zdWZmaXh9ImA6aS5mb3JtYXQ9PT0iaW5jbHVkZXMiP2BDaGHDrm5lIGludmFsaWRlIDogZG9pdCBpbmNsdXJlICIke2kuaW5jbHVkZXN9ImA6aS5mb3JtYXQ9PT0icmVnZXgiP2BDaGHDrm5lIGludmFsaWRlIDogZG9pdCBjb3JyZXNwb25kcmUgYXUgbW90aWYgJHtpLnBhdHRlcm59YDpgJHtyW2kuZm9ybWF0XT8/ZS5mb3JtYXR9IGludmFsaWRlYH1jYXNlIm5vdF9tdWx0aXBsZV9vZiI6cmV0dXJuYE5vbWJyZSBpbnZhbGlkZSA6IGRvaXQgw6p0cmUgdW4gbXVsdGlwbGUgZGUgJHtlLmRpdmlzb3J9YDtjYXNlInVucmVjb2duaXplZF9rZXlzIjpyZXR1cm5gQ2zDqSR7ZS5rZXlzLmxlbmd0aD4xPyJzIjoiIn0gbm9uIHJlY29ubnVlJHtlLmtleXMubGVuZ3RoPjE/InMiOiIifSA6ICR7XyhlLmtleXMsIiwgIil9YDtjYXNlImludmFsaWRfa2V5IjpyZXR1cm5gQ2zDqSBpbnZhbGlkZSBkYW5zICR7ZS5vcmlnaW59YDtjYXNlImludmFsaWRfdW5pb24iOnJldHVybiJFbnRyw6llIGludmFsaWRlIjtjYXNlImludmFsaWRfZWxlbWVudCI6cmV0dXJuYFZhbGV1ciBpbnZhbGlkZSBkYW5zICR7ZS5vcmlnaW59YDtkZWZhdWx0OnJldHVybiJFbnRyw6llIGludmFsaWRlIn19fTtmdW5jdGlvbiBmZigpe3JldHVybntsb2NhbGVFcnJvcjpwZigpfX1jb25zdCBnZj0oKT0+e2NvbnN0IHQ9e3N0cmluZzp7bGFiZWw6Itee15fXqNeV15bXqiIsZ2VuZGVyOiJmIn0sbnVtYmVyOntsYWJlbDoi157Xodek16giLGdlbmRlcjoibSJ9LGJvb2xlYW46e2xhYmVsOiLXoteo15og15HXldec15nXkNeg15kiLGdlbmRlcjoibSJ9LGJpZ2ludDp7bGFiZWw6IkJpZ0ludCIsZ2VuZGVyOiJtIn0sZGF0ZTp7bGFiZWw6Iteq15DXqNeZ15oiLGdlbmRlcjoibSJ9LGFycmF5OntsYWJlbDoi157Xoteo15oiLGdlbmRlcjoibSJ9LG9iamVjdDp7bGFiZWw6IteQ15XXkdeZ15nXp9eYIixnZW5kZXI6Im0ifSxudWxsOntsYWJlbDoi16LXqNeaINeo15nXpyAobnVsbCkiLGdlbmRlcjoibSJ9LHVuZGVmaW5lZDp7bGFiZWw6Itei16jXmiDXnNeQINee15XXkteT16ggKHVuZGVmaW5lZCkiLGdlbmRlcjoibSJ9LHN5bWJvbDp7bGFiZWw6Iteh15nXnteR15XXnCAoU3ltYm9sKSIsZ2VuZGVyOiJtIn0sZnVuY3Rpb246e2xhYmVsOiLXpNeV16DXp9em15nXlCIsZ2VuZGVyOiJmIn0sbWFwOntsYWJlbDoi157XpNeUIChNYXApIixnZW5kZXI6ImYifSxzZXQ6e2xhYmVsOiLXp9eR15XXpteUIChTZXQpIixnZW5kZXI6ImYifSxmaWxlOntsYWJlbDoi16fXldeR16UiLGdlbmRlcjoibSJ9LHByb21pc2U6e2xhYmVsOiJQcm9taXNlIixnZW5kZXI6Im0ifSxOYU46e2xhYmVsOiJOYU4iLGdlbmRlcjoibSJ9LHVua25vd246e2xhYmVsOiLXoteo15og15zXkCDXmdeT15XXoiIsZ2VuZGVyOiJtIn0sdmFsdWU6e2xhYmVsOiLXoteo15oiLGdlbmRlcjoibSJ9fSxuPXtzdHJpbmc6e3VuaXQ6Iteq15XXldeZ150iLHNob3J0TGFiZWw6Iten16bXqCIsbG9uZ0xhYmVsOiLXkNeo15XXmiJ9LGZpbGU6e3VuaXQ6IteR15nXmdeY15nXnSIsc2hvcnRMYWJlbDoi16fXmNefIixsb25nTGFiZWw6IteS15PXldecIn0sYXJyYXk6e3VuaXQ6Itek16jXmdeY15nXnSIsc2hvcnRMYWJlbDoi16fXmNefIixsb25nTGFiZWw6IteS15PXldecIn0sc2V0Ont1bml0OiLXpNeo15nXmNeZ150iLHNob3J0TGFiZWw6Iten15jXnyIsbG9uZ0xhYmVsOiLXkteT15XXnCJ9LG51bWJlcjp7dW5pdDoiIixzaG9ydExhYmVsOiLXp9eY158iLGxvbmdMYWJlbDoi15LXk9eV15wifX0scj11PT51P3RbdV06dm9pZCAwLG89dT0+e2NvbnN0IGw9cih1KTtyZXR1cm4gbD9sLmxhYmVsOnU/P3QudW5rbm93bi5sYWJlbH0sZT11PT5g15Qke28odSl9YCxpPXU9PihyKHUpPy5nZW5kZXI/PyJtIik9PT0iZiI/Item16jXmdeb15Qg15zXlNeZ15XXqiI6Item16jXmdeaINec15TXmdeV16oiLGE9dT0+dT9uW3VdPz9udWxsOm51bGwscz17cmVnZXg6e2xhYmVsOiLXp9ec15giLGdlbmRlcjoibSJ9LGVtYWlsOntsYWJlbDoi15vXqteV15HXqiDXkNeZ157XmdeZ15wiLGdlbmRlcjoiZiJ9LHVybDp7bGFiZWw6Iteb16rXldeR16og16jXqdeqIixnZW5kZXI6ImYifSxlbW9qaTp7bGFiZWw6IteQ15nXnteV15In15kiLGdlbmRlcjoibSJ9LHV1aWQ6e2xhYmVsOiJVVUlEIixnZW5kZXI6Im0ifSxuYW5vaWQ6e2xhYmVsOiJuYW5vaWQiLGdlbmRlcjoibSJ9LGd1aWQ6e2xhYmVsOiJHVUlEIixnZW5kZXI6Im0ifSxjdWlkOntsYWJlbDoiY3VpZCIsZ2VuZGVyOiJtIn0sY3VpZDI6e2xhYmVsOiJjdWlkMiIsZ2VuZGVyOiJtIn0sdWxpZDp7bGFiZWw6IlVMSUQiLGdlbmRlcjoibSJ9LHhpZDp7bGFiZWw6IlhJRCIsZ2VuZGVyOiJtIn0sa3N1aWQ6e2xhYmVsOiJLU1VJRCIsZ2VuZGVyOiJtIn0sZGF0ZXRpbWU6e2xhYmVsOiLXqteQ16jXmdeaINeV15bXntefIElTTyIsZ2VuZGVyOiJtIn0sZGF0ZTp7bGFiZWw6Iteq15DXqNeZ15ogSVNPIixnZW5kZXI6Im0ifSx0aW1lOntsYWJlbDoi15bXntefIElTTyIsZ2VuZGVyOiJtIn0sZHVyYXRpb246e2xhYmVsOiLXntep15og15bXntefIElTTyIsZ2VuZGVyOiJtIn0saXB2NDp7bGFiZWw6Iteb16rXldeR16ogSVB2NCIsZ2VuZGVyOiJmIn0saXB2Njp7bGFiZWw6Iteb16rXldeR16ogSVB2NiIsZ2VuZGVyOiJmIn0sY2lkcnY0OntsYWJlbDoi15jXldeV15cgSVB2NCIsZ2VuZGVyOiJtIn0sY2lkcnY2OntsYWJlbDoi15jXldeV15cgSVB2NiIsZ2VuZGVyOiJtIn0sYmFzZTY0OntsYWJlbDoi157Xl9eo15XXlteqINeR15HXodeZ16EgNjQiLGdlbmRlcjoiZiJ9LGJhc2U2NHVybDp7bGFiZWw6Itee15fXqNeV15bXqiDXkdeR16HXmdehIDY0INec15vXqteV15HXldeqINeo16nXqiIsZ2VuZGVyOiJmIn0sanNvbl9zdHJpbmc6e2xhYmVsOiLXnteX16jXldeW16ogSlNPTiIsZ2VuZGVyOiJmIn0sZTE2NDp7bGFiZWw6Itee16HXpNeoIEUuMTY0IixnZW5kZXI6Im0ifSxqd3Q6e2xhYmVsOiJKV1QiLGdlbmRlcjoibSJ9LGVuZHNfd2l0aDp7bGFiZWw6Iten15zXmCIsZ2VuZGVyOiJtIn0saW5jbHVkZXM6e2xhYmVsOiLXp9ec15giLGdlbmRlcjoibSJ9LGxvd2VyY2FzZTp7bGFiZWw6Iten15zXmCIsZ2VuZGVyOiJtIn0sc3RhcnRzX3dpdGg6e2xhYmVsOiLXp9ec15giLGdlbmRlcjoibSJ9LHVwcGVyY2FzZTp7bGFiZWw6Iten15zXmCIsZ2VuZGVyOiJtIn19LGM9e25hbjoiTmFOIn07cmV0dXJuIHU9Pntzd2l0Y2godS5jb2RlKXtjYXNlImludmFsaWRfdHlwZSI6e2NvbnN0IGw9dS5leHBlY3RlZCxnPWNbbD8/IiJdPz9vKGwpLHY9dyh1LmlucHV0KSwkPWNbdl0/P3Rbdl0/LmxhYmVsPz92O3JldHVybi9eW0EtWl0vLnRlc3QodS5leHBlY3RlZCk/YNen15zXmCDXnNeQINeq16fXmdefOiDXpteo15nXmiDXnNeU15nXldeqIGluc3RhbmNlb2YgJHt1LmV4cGVjdGVkfSwg15TXqten15HXnCAkeyR9YDpg16fXnNeYINec15Ag16rXp9eZ1586INem16jXmdeaINec15TXmdeV16ogJHtnfSwg15TXqten15HXnCAkeyR9YH1jYXNlImludmFsaWRfdmFsdWUiOntpZih1LnZhbHVlcy5sZW5ndGg9PT0xKXJldHVybmDXoteo15og15zXkCDXqten15nXnzog15TXoteo15og15fXmdeZ15Eg15zXlNeZ15XXqiAke1ModS52YWx1ZXNbMF0pfWA7Y29uc3QgbD11LnZhbHVlcy5tYXAoJD0+UygkKSk7aWYodS52YWx1ZXMubGVuZ3RoPT09MilyZXR1cm5g16LXqNeaINec15Ag16rXp9eZ1586INeU15DXpNep16jXldeZ15XXqiDXlNee16rXkNeZ157XldeqINeU158gJHtsWzBdfSDXkNeVICR7bFsxXX1gO2NvbnN0IGc9bFtsLmxlbmd0aC0xXTtyZXR1cm5g16LXqNeaINec15Ag16rXp9eZ1586INeU15DXpNep16jXldeZ15XXqiDXlNee16rXkNeZ157XldeqINeU158gJHtsLnNsaWNlKDAsLTEpLmpvaW4oIiwgIil9INeQ15UgJHtnfWB9Y2FzZSJ0b29fYmlnIjp7Y29uc3QgbD1hKHUub3JpZ2luKSxnPWUodS5vcmlnaW4/PyJ2YWx1ZSIpO2lmKHUub3JpZ2luPT09InN0cmluZyIpcmV0dXJuYCR7bD8ubG9uZ0xhYmVsPz8i15DXqNeV15oifSDXnteT15k6ICR7Z30g16bXqNeZ15vXlCDXnNeU15vXmdecICR7dS5tYXhpbXVtLnRvU3RyaW5nKCl9ICR7bD8udW5pdD8/IiJ9ICR7dS5pbmNsdXNpdmU/IteQ15Ug16TXl9eV16oiOiLXnNeb15wg15TXmdeV16rXqCJ9YC50cmltKCk7aWYodS5vcmlnaW49PT0ibnVtYmVyIil7Y29uc3QgeT11LmluY2x1c2l2ZT9g16fXmNefINeQ15Ug16nXldeV15Qg15wtJHt1Lm1heGltdW19YDpg16fXmNefINeeLSR7dS5tYXhpbXVtfWA7cmV0dXJuYNeS15PXldecINee15PXmTogJHtnfSDXpteo15nXmiDXnNeU15nXldeqICR7eX1gfWlmKHUub3JpZ2luPT09ImFycmF5Inx8dS5vcmlnaW49PT0ic2V0Iil7Y29uc3QgeT11Lm9yaWdpbj09PSJzZXQiPyLXpteo15nXm9eUIjoi16bXqNeZ15oiLEg9dS5pbmNsdXNpdmU/YCR7dS5tYXhpbXVtfSAke2w/LnVuaXQ/PyIifSDXkNeVINek15fXldeqYDpg16TXl9eV16og154tJHt1Lm1heGltdW19ICR7bD8udW5pdD8/IiJ9YDtyZXR1cm5g15LXk9eV15wg157Xk9eZOiAke2d9ICR7eX0g15zXlNeb15nXnCAke0h9YC50cmltKCl9Y29uc3Qgdj11LmluY2x1c2l2ZT8iPD0iOiI8IiwkPWkodS5vcmlnaW4/PyJ2YWx1ZSIpO3JldHVybiBsPy51bml0P2Ake2wubG9uZ0xhYmVsfSDXnteT15k6ICR7Z30gJHskfSAke3Z9JHt1Lm1heGltdW0udG9TdHJpbmcoKX0gJHtsLnVuaXR9YDpgJHtsPy5sb25nTGFiZWw/PyLXkteT15XXnCJ9INee15PXmTogJHtnfSAkeyR9ICR7dn0ke3UubWF4aW11bS50b1N0cmluZygpfWB9Y2FzZSJ0b29fc21hbGwiOntjb25zdCBsPWEodS5vcmlnaW4pLGc9ZSh1Lm9yaWdpbj8/InZhbHVlIik7aWYodS5vcmlnaW49PT0ic3RyaW5nIilyZXR1cm5gJHtsPy5zaG9ydExhYmVsPz8i16fXpteoIn0g157Xk9eZOiAke2d9INem16jXmdeb15Qg15zXlNeb15nXnCAke3UubWluaW11bS50b1N0cmluZygpfSAke2w/LnVuaXQ/PyIifSAke3UuaW5jbHVzaXZlPyLXkNeVINeZ15XXqteoIjoi15zXpNeX15XXqiJ9YC50cmltKCk7aWYodS5vcmlnaW49PT0ibnVtYmVyIil7Y29uc3QgeT11LmluY2x1c2l2ZT9g15LXk9eV15wg15DXlSDXqdeV15XXlCDXnC0ke3UubWluaW11bX1gOmDXkteT15XXnCDXni0ke3UubWluaW11bX1gO3JldHVybmDXp9eY158g157Xk9eZOiAke2d9INem16jXmdeaINec15TXmdeV16ogJHt5fWB9aWYodS5vcmlnaW49PT0iYXJyYXkifHx1Lm9yaWdpbj09PSJzZXQiKXtjb25zdCB5PXUub3JpZ2luPT09InNldCI/Item16jXmdeb15QiOiLXpteo15nXmiI7aWYodS5taW5pbXVtPT09MSYmdS5pbmNsdXNpdmUpe2NvbnN0IEw9KHUub3JpZ2luPT09InNldCIsItec16TXl9eV16og16TXqNeZ15gg15DXl9eTIik7cmV0dXJuYNen15jXnyDXnteT15k6ICR7Z30gJHt5fSDXnNeU15vXmdecICR7TH1gfWNvbnN0IEg9dS5pbmNsdXNpdmU/YCR7dS5taW5pbXVtfSAke2w/LnVuaXQ/PyIifSDXkNeVINeZ15XXqteoYDpg15nXldeq16gg154tJHt1Lm1pbmltdW19ICR7bD8udW5pdD8/IiJ9YDtyZXR1cm5g16fXmNefINee15PXmTogJHtnfSAke3l9INec15TXm9eZ15wgJHtIfWAudHJpbSgpfWNvbnN0IHY9dS5pbmNsdXNpdmU/Ij49IjoiPiIsJD1pKHUub3JpZ2luPz8idmFsdWUiKTtyZXR1cm4gbD8udW5pdD9gJHtsLnNob3J0TGFiZWx9INee15PXmTogJHtnfSAkeyR9ICR7dn0ke3UubWluaW11bS50b1N0cmluZygpfSAke2wudW5pdH1gOmAke2w/LnNob3J0TGFiZWw/PyLXp9eY158ifSDXnteT15k6ICR7Z30gJHskfSAke3Z9JHt1Lm1pbmltdW0udG9TdHJpbmcoKX1gfWNhc2UiaW52YWxpZF9mb3JtYXQiOntjb25zdCBsPXU7aWYobC5mb3JtYXQ9PT0ic3RhcnRzX3dpdGgiKXJldHVybmDXlNee15fXqNeV15bXqiDXl9eZ15nXkdeqINec15TXqteX15nXnCDXkSAiJHtsLnByZWZpeH0iYDtpZihsLmZvcm1hdD09PSJlbmRzX3dpdGgiKXJldHVybmDXlNee15fXqNeV15bXqiDXl9eZ15nXkdeqINec15TXodeq15nXmdedINeRICIke2wuc3VmZml4fSJgO2lmKGwuZm9ybWF0PT09ImluY2x1ZGVzIilyZXR1cm5g15TXnteX16jXldeW16og15fXmdeZ15HXqiDXnNeb15zXldecICIke2wuaW5jbHVkZXN9ImA7aWYobC5mb3JtYXQ9PT0icmVnZXgiKXJldHVybmDXlNee15fXqNeV15bXqiDXl9eZ15nXkdeqINec15TXqteQ15nXnSDXnNeq15HXoNeZ16ogJHtsLnBhdHRlcm59YDtjb25zdCBnPXNbbC5mb3JtYXRdLHY9Zz8ubGFiZWw/P2wuZm9ybWF0LHk9KGc/LmdlbmRlcj8/Im0iKT09PSJmIj8i16rXp9eZ16DXlCI6Iteq16fXmdefIjtyZXR1cm5gJHt2fSDXnNeQICR7eX1gfWNhc2Uibm90X211bHRpcGxlX29mIjpyZXR1cm5g157Xodek16gg15zXkCDXqten15nXnzog15fXmdeZ15Eg15zXlNeZ15XXqiDXnteb16TXnNeUINep15wgJHt1LmRpdmlzb3J9YDtjYXNlInVucmVjb2duaXplZF9rZXlzIjpyZXR1cm5g157XpNeq15cke3Uua2V5cy5sZW5ndGg+MT8i15XXqiI6IiJ9INec15Ag157XlteV15Qke3Uua2V5cy5sZW5ndGg+MT8i15nXnSI6IteUIn06ICR7Xyh1LmtleXMsIiwgIil9YDtjYXNlImludmFsaWRfa2V5IjpyZXR1cm4i16nXk9eUINec15Ag16rXp9eZ158g15HXkNeV15HXmdeZ16fXmCI7Y2FzZSJpbnZhbGlkX3VuaW9uIjpyZXR1cm4i16fXnNeYINec15Ag16rXp9eZ158iO2Nhc2UiaW52YWxpZF9lbGVtZW50IjpyZXR1cm5g16LXqNeaINec15Ag16rXp9eZ158g15Eke2UodS5vcmlnaW4/PyJhcnJheSIpfWA7ZGVmYXVsdDpyZXR1cm4i16fXnNeYINec15Ag16rXp9eZ158ifX19O2Z1bmN0aW9uIHZmKCl7cmV0dXJue2xvY2FsZUVycm9yOmdmKCl9fWNvbnN0IGhmPSgpPT57Y29uc3QgdD17c3RyaW5nOnt1bml0OiJ6bmFrb3ZhIix2ZXJiOiJpbWF0aSJ9LGZpbGU6e3VuaXQ6ImJhanRvdmEiLHZlcmI6ImltYXRpIn0sYXJyYXk6e3VuaXQ6InN0YXZraSIsdmVyYjoiaW1hdGkifSxzZXQ6e3VuaXQ6InN0YXZraSIsdmVyYjoiaW1hdGkifX07ZnVuY3Rpb24gbihlKXtyZXR1cm4gdFtlXT8/bnVsbH1jb25zdCByPXtyZWdleDoidW5vcyIsZW1haWw6ImVtYWlsIGFkcmVzYSIsdXJsOiJVUkwiLGVtb2ppOiJlbW9qaSIsdXVpZDoiVVVJRCIsdXVpZHY0OiJVVUlEdjQiLHV1aWR2NjoiVVVJRHY2IixuYW5vaWQ6Im5hbm9pZCIsZ3VpZDoiR1VJRCIsY3VpZDoiY3VpZCIsY3VpZDI6ImN1aWQyIix1bGlkOiJVTElEIix4aWQ6IlhJRCIsa3N1aWQ6IktTVUlEIixkYXRldGltZToiSVNPIGRhdHVtIGkgdnJpamVtZSIsZGF0ZToiSVNPIGRhdHVtIix0aW1lOiJJU08gdnJpamVtZSIsZHVyYXRpb246IklTTyB0cmFqYW5qZSIsaXB2NDoiSVB2NCBhZHJlc2EiLGlwdjY6IklQdjYgYWRyZXNhIixjaWRydjQ6IklQdjQgcmFzcG9uIixjaWRydjY6IklQdjYgcmFzcG9uIixiYXNlNjQ6ImJhc2U2NCBrb2RpcmFuaSB0ZWtzdCIsYmFzZTY0dXJsOiJiYXNlNjR1cmwga29kaXJhbmkgdGVrc3QiLGpzb25fc3RyaW5nOiJKU09OIHRla3N0IixlMTY0OiJFLjE2NCBicm9qIixqd3Q6IkpXVCIsdGVtcGxhdGVfbGl0ZXJhbDoidW5vcyJ9LG89e25hbjoiTmFOIixzdHJpbmc6InRla3N0IixudW1iZXI6ImJyb2oiLGJvb2xlYW46ImJvb2xlYW4iLGFycmF5OiJuaXoiLG9iamVjdDoib2JqZWt0IixzZXQ6InNrdXAiLGZpbGU6ImRhdG90ZWthIixkYXRlOiJkYXR1bSIsYmlnaW50OiJiaWdpbnQiLHN5bWJvbDoic2ltYm9sIix1bmRlZmluZWQ6InVuZGVmaW5lZCIsbnVsbDoibnVsbCIsZnVuY3Rpb246ImZ1bmtjaWphIixtYXA6Im1hcGEifTtyZXR1cm4gZT0+e3N3aXRjaChlLmNvZGUpe2Nhc2UiaW52YWxpZF90eXBlIjp7Y29uc3QgaT1vW2UuZXhwZWN0ZWRdPz9lLmV4cGVjdGVkLGE9dyhlLmlucHV0KSxzPW9bYV0/P2E7cmV0dXJuL15bQS1aXS8udGVzdChlLmV4cGVjdGVkKT9gTmVpc3ByYXZhbiB1bm9zOiBvxI1la3VqZSBzZSBpbnN0YW5jZW9mICR7ZS5leHBlY3RlZH0sIGEgcHJpbWxqZW5vIGplICR7c31gOmBOZWlzcHJhdmFuIHVub3M6IG/EjWVrdWplIHNlICR7aX0sIGEgcHJpbWxqZW5vIGplICR7c31gfWNhc2UiaW52YWxpZF92YWx1ZSI6cmV0dXJuIGUudmFsdWVzLmxlbmd0aD09PTE/YE5laXNwcmF2bmEgdnJpamVkbm9zdDogb8SNZWtpdmFubyAke1MoZS52YWx1ZXNbMF0pfWA6YE5laXNwcmF2bmEgb3BjaWphOiBvxI1la2l2YW5vIGplZG5vIG9kICR7XyhlLnZhbHVlcywifCIpfWA7Y2FzZSJ0b29fYmlnIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPD0iOiI8IixhPW4oZS5vcmlnaW4pLHM9b1tlLm9yaWdpbl0/P2Uub3JpZ2luO3JldHVybiBhP2BQcmV2ZWxpa286IG/EjWVraXZhbm8gZGEgJHtzPz8idnJpamVkbm9zdCJ9IGltYSAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX0gJHthLnVuaXQ/PyJlbGVtZW5hdGEifWA6YFByZXZlbGlrbzogb8SNZWtpdmFubyBkYSAke3M/PyJ2cmlqZWRub3N0In0gYnVkZSAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX1gfWNhc2UidG9vX3NtYWxsIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPj0iOiI+IixhPW4oZS5vcmlnaW4pLHM9b1tlLm9yaWdpbl0/P2Uub3JpZ2luO3JldHVybiBhP2BQcmVtYWxvOiBvxI1la2l2YW5vIGRhICR7c30gaW1hICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfSAke2EudW5pdH1gOmBQcmVtYWxvOiBvxI1la2l2YW5vIGRhICR7c30gYnVkZSAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX1gfWNhc2UiaW52YWxpZF9mb3JtYXQiOntjb25zdCBpPWU7cmV0dXJuIGkuZm9ybWF0PT09InN0YXJ0c193aXRoIj9gTmVpc3ByYXZhbiB0ZWtzdDogbW9yYSB6YXBvxI1pbmphdGkgcyAiJHtpLnByZWZpeH0iYDppLmZvcm1hdD09PSJlbmRzX3dpdGgiP2BOZWlzcHJhdmFuIHRla3N0OiBtb3JhIHphdnLFoWF2YXRpIHMgIiR7aS5zdWZmaXh9ImA6aS5mb3JtYXQ9PT0iaW5jbHVkZXMiP2BOZWlzcHJhdmFuIHRla3N0OiBtb3JhIHNhZHLFvmF2YXRpICIke2kuaW5jbHVkZXN9ImA6aS5mb3JtYXQ9PT0icmVnZXgiP2BOZWlzcHJhdmFuIHRla3N0OiBtb3JhIG9kZ292YXJhdGkgdXpvcmt1ICR7aS5wYXR0ZXJufWA6YE5laXNwcmF2bmEgJHtyW2kuZm9ybWF0XT8/ZS5mb3JtYXR9YH1jYXNlIm5vdF9tdWx0aXBsZV9vZiI6cmV0dXJuYE5laXNwcmF2YW4gYnJvajogbW9yYSBiaXRpIHZpxaFla3JhdG5payBvZCAke2UuZGl2aXNvcn1gO2Nhc2UidW5yZWNvZ25pemVkX2tleXMiOnJldHVybmBOZXByZXBvem5hdCR7ZS5rZXlzLmxlbmd0aD4xPyJpIGtsanXEjWV2aSI6IiBrbGp1xI0ifTogJHtfKGUua2V5cywiLCAiKX1gO2Nhc2UiaW52YWxpZF9rZXkiOnJldHVybmBOZWlzcHJhdmFuIGtsanXEjSB1ICR7b1tlLm9yaWdpbl0/P2Uub3JpZ2lufWA7Y2FzZSJpbnZhbGlkX3VuaW9uIjpyZXR1cm4iTmVpc3ByYXZhbiB1bm9zIjtjYXNlImludmFsaWRfZWxlbWVudCI6cmV0dXJuYE5laXNwcmF2bmEgdnJpamVkbm9zdCB1ICR7b1tlLm9yaWdpbl0/P2Uub3JpZ2lufWA7ZGVmYXVsdDpyZXR1cm4iTmVpc3ByYXZhbiB1bm9zIn19fTtmdW5jdGlvbiAkZigpe3JldHVybntsb2NhbGVFcnJvcjpoZigpfX1jb25zdCBfZj0oKT0+e2NvbnN0IHQ9e3N0cmluZzp7dW5pdDoia2FyYWt0ZXIiLHZlcmI6ImxlZ3llbiJ9LGZpbGU6e3VuaXQ6ImJ5dGUiLHZlcmI6ImxlZ3llbiJ9LGFycmF5Ont1bml0OiJlbGVtIix2ZXJiOiJsZWd5ZW4ifSxzZXQ6e3VuaXQ6ImVsZW0iLHZlcmI6ImxlZ3llbiJ9fTtmdW5jdGlvbiBuKGUpe3JldHVybiB0W2VdPz9udWxsfWNvbnN0IHI9e3JlZ2V4OiJiZW1lbmV0IixlbWFpbDoiZW1haWwgY8OtbSIsdXJsOiJVUkwiLGVtb2ppOiJlbW9qaSIsdXVpZDoiVVVJRCIsdXVpZHY0OiJVVUlEdjQiLHV1aWR2NjoiVVVJRHY2IixuYW5vaWQ6Im5hbm9pZCIsZ3VpZDoiR1VJRCIsY3VpZDoiY3VpZCIsY3VpZDI6ImN1aWQyIix1bGlkOiJVTElEIix4aWQ6IlhJRCIsa3N1aWQ6IktTVUlEIixkYXRldGltZToiSVNPIGlkxZFiw6lseWVnIixkYXRlOiJJU08gZMOhdHVtIix0aW1lOiJJU08gaWTFkSIsZHVyYXRpb246IklTTyBpZMWRaW50ZXJ2YWxsdW0iLGlwdjQ6IklQdjQgY8OtbSIsaXB2NjoiSVB2NiBjw61tIixjaWRydjQ6IklQdjQgdGFydG9tw6FueSIsY2lkcnY2OiJJUHY2IHRhcnRvbcOhbnkiLGJhc2U2NDoiYmFzZTY0LWvDs2RvbHQgc3RyaW5nIixiYXNlNjR1cmw6ImJhc2U2NHVybC1rw7Nkb2x0IHN0cmluZyIsanNvbl9zdHJpbmc6IkpTT04gc3RyaW5nIixlMTY0OiJFLjE2NCBzesOhbSIsand0OiJKV1QiLHRlbXBsYXRlX2xpdGVyYWw6ImJlbWVuZXQifSxvPXtuYW46Ik5hTiIsbnVtYmVyOiJzesOhbSIsYXJyYXk6InTDtm1iIn07cmV0dXJuIGU9Pntzd2l0Y2goZS5jb2RlKXtjYXNlImludmFsaWRfdHlwZSI6e2NvbnN0IGk9b1tlLmV4cGVjdGVkXT8/ZS5leHBlY3RlZCxhPXcoZS5pbnB1dCkscz1vW2FdPz9hO3JldHVybi9eW0EtWl0vLnRlc3QoZS5leHBlY3RlZCk/YMOJcnbDqW55dGVsZW4gYmVtZW5ldDogYSB2w6FydCDDqXJ0w6lrIGluc3RhbmNlb2YgJHtlLmV4cGVjdGVkfSwgYSBrYXBvdHQgw6lydMOpayAke3N9YDpgw4lydsOpbnl0ZWxlbiBiZW1lbmV0OiBhIHbDoXJ0IMOpcnTDqWsgJHtpfSwgYSBrYXBvdHQgw6lydMOpayAke3N9YH1jYXNlImludmFsaWRfdmFsdWUiOnJldHVybiBlLnZhbHVlcy5sZW5ndGg9PT0xP2DDiXJ2w6lueXRlbGVuIGJlbWVuZXQ6IGEgdsOhcnQgw6lydMOpayAke1MoZS52YWx1ZXNbMF0pfWA6YMOJcnbDqW55dGVsZW4gb3BjacOzOiB2YWxhbWVseWlrIMOpcnTDqWsgdsOhcnQgJHtfKGUudmFsdWVzLCJ8Iil9YDtjYXNlInRvb19iaWciOntjb25zdCBpPWUuaW5jbHVzaXZlPyI8PSI6IjwiLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YFTDumwgbmFneTogJHtlLm9yaWdpbj8/IsOpcnTDqWsifSBtw6lyZXRlIHTDumwgbmFneSAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX0gJHthLnVuaXQ/PyJlbGVtIn1gOmBUw7psIG5hZ3k6IGEgYmVtZW5ldGkgw6lydMOpayAke2Uub3JpZ2luPz8iw6lydMOpayJ9IHTDumwgbmFneTogJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9YH1jYXNlInRvb19zbWFsbCI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ij49IjoiPiIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9gVMO6bCBraWNzaTogYSBiZW1lbmV0aSDDqXJ0w6lrICR7ZS5vcmlnaW59IG3DqXJldGUgdMO6bCBraWNzaSAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX0gJHthLnVuaXR9YDpgVMO6bCBraWNzaTogYSBiZW1lbmV0aSDDqXJ0w6lrICR7ZS5vcmlnaW59IHTDumwga2ljc2kgJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9YH1jYXNlImludmFsaWRfZm9ybWF0Ijp7Y29uc3QgaT1lO3JldHVybiBpLmZvcm1hdD09PSJzdGFydHNfd2l0aCI/YMOJcnbDqW55dGVsZW4gc3RyaW5nOiAiJHtpLnByZWZpeH0iIMOpcnTDqWtrZWwga2VsbCBrZXpkxZFkbmllYDppLmZvcm1hdD09PSJlbmRzX3dpdGgiP2DDiXJ2w6lueXRlbGVuIHN0cmluZzogIiR7aS5zdWZmaXh9IiDDqXJ0w6lra2VsIGtlbGwgdsOpZ3rFkWRuaWVgOmkuZm9ybWF0PT09ImluY2x1ZGVzIj9gw4lydsOpbnl0ZWxlbiBzdHJpbmc6ICIke2kuaW5jbHVkZXN9IiDDqXJ0w6lrZXQga2VsbCB0YXJ0YWxtYXpuaWFgOmkuZm9ybWF0PT09InJlZ2V4Ij9gw4lydsOpbnl0ZWxlbiBzdHJpbmc6ICR7aS5wYXR0ZXJufSBtaW50w6FuYWsga2VsbCBtZWdmZWxlbG5pZWA6YMOJcnbDqW55dGVsZW4gJHtyW2kuZm9ybWF0XT8/ZS5mb3JtYXR9YH1jYXNlIm5vdF9tdWx0aXBsZV9vZiI6cmV0dXJuYMOJcnbDqW55dGVsZW4gc3rDoW06ICR7ZS5kaXZpc29yfSB0w7ZiYnN6w7Zyw7Zzw6luZWsga2VsbCBsZW5uaWVgO2Nhc2UidW5yZWNvZ25pemVkX2tleXMiOnJldHVybmBJc21lcmV0bGVuIGt1bGNzJHtlLmtleXMubGVuZ3RoPjE/InMiOiIifTogJHtfKGUua2V5cywiLCAiKX1gO2Nhc2UiaW52YWxpZF9rZXkiOnJldHVybmDDiXJ2w6lueXRlbGVuIGt1bGNzICR7ZS5vcmlnaW59YDtjYXNlImludmFsaWRfdW5pb24iOnJldHVybiLDiXJ2w6lueXRlbGVuIGJlbWVuZXQiO2Nhc2UiaW52YWxpZF9lbGVtZW50IjpyZXR1cm5gw4lydsOpbnl0ZWxlbiDDqXJ0w6lrOiAke2Uub3JpZ2lufWA7ZGVmYXVsdDpyZXR1cm4iw4lydsOpbnl0ZWxlbiBiZW1lbmV0In19fTtmdW5jdGlvbiBiZigpe3JldHVybntsb2NhbGVFcnJvcjpfZigpfX1mdW5jdGlvbiBQcyh0LG4scil7cmV0dXJuIE1hdGguYWJzKHQpPT09MT9uOnJ9ZnVuY3Rpb24gRmUodCl7aWYoIXQpcmV0dXJuIiI7Y29uc3Qgbj1bItWhIiwi1aUiLCLVqCIsItWrIiwi1bgiLCLVuNaCIiwi1oUiXSxyPXRbdC5sZW5ndGgtMV07cmV0dXJuIHQrKG4uaW5jbHVkZXMocik/ItW2Ijoi1agiKX1jb25zdCB5Zj0oKT0+e2NvbnN0IHQ9e3N0cmluZzp7dW5pdDp7b25lOiLVttW31aHVtiIsbWFueToi1bbVt9Wh1bbVttWl1oAifSx2ZXJiOiLVuNaC1bbVpdW21aHVrCJ9LGZpbGU6e3VuaXQ6e29uZToi1aLVodW11akiLG1hbnk6ItWi1aHVtdWp1aXWgCJ9LHZlcmI6ItW41oLVttWl1bbVodWsIn0sYXJyYXk6e3VuaXQ6e29uZToi1b/VodaA1oAiLG1hbnk6ItW/1aHWgNaA1aXWgCJ9LHZlcmI6ItW41oLVttWl1bbVodWsIn0sc2V0Ont1bml0OntvbmU6ItW/1aHWgNaAIixtYW55OiLVv9Wh1oDWgNWl1oAifSx2ZXJiOiLVuNaC1bbVpdW21aHVrCJ9fTtmdW5jdGlvbiBuKGUpe3JldHVybiB0W2VdPz9udWxsfWNvbnN0IHI9e3JlZ2V4OiLVtNW41oLVv9aEIixlbWFpbDoi1afVrC4g1bDVodW91oHVpSIsdXJsOiJVUkwiLGVtb2ppOiLVp9W01bjVu9WrIix1dWlkOiJVVUlEIix1dWlkdjQ6IlVVSUR2NCIsdXVpZHY2OiJVVUlEdjYiLG5hbm9pZDoibmFub2lkIixndWlkOiJHVUlEIixjdWlkOiJjdWlkIixjdWlkMjoiY3VpZDIiLHVsaWQ6IlVMSUQiLHhpZDoiWElEIixrc3VpZDoiS1NVSUQiLGRhdGV0aW1lOiJJU08g1aHVtNW91aHVqdWr1b4g1ocg1arVodW0IixkYXRlOiJJU08g1aHVtNW91aHVqdWr1b4iLHRpbWU6IklTTyDVqtWh1bQiLGR1cmF0aW9uOiJJU08g1b/Wh9W41bLVuNaC1anVtdW41oLVtiIsaXB2NDoiSVB2NCDVsNWh1b3WgdWlIixpcHY2OiJJUHY2INWw1aHVvdaB1aUiLGNpZHJ2NDoiSVB2NCDVtNWr1bvVodWv1aHVtdaEIixjaWRydjY6IklQdjYg1bTVq9W71aHVr9Wh1bXWhCIsYmFzZTY0OiJiYXNlNjQg1bHWh9Wh1bnVodaD1bjVviDVv9W41bIiLGJhc2U2NHVybDoiYmFzZTY0dXJsINWx1ofVodW51aHWg9W41b4g1b/VuNWyIixqc29uX3N0cmluZzoiSlNPTiDVv9W41bIiLGUxNjQ6IkUuMTY0INWw1aHVtNWh1oAiLGp3dDoiSldUIix0ZW1wbGF0ZV9saXRlcmFsOiLVtNW41oLVv9aEIn0sbz17bmFuOiJOYU4iLG51bWJlcjoi1anVq9W+IixhcnJheToi1abVodW21aPVvtWh1a4ifTtyZXR1cm4gZT0+e3N3aXRjaChlLmNvZGUpe2Nhc2UiaW52YWxpZF90eXBlIjp7Y29uc3QgaT1vW2UuZXhwZWN0ZWRdPz9lLmV4cGVjdGVkLGE9dyhlLmlucHV0KSxzPW9bYV0/P2E7cmV0dXJuL15bQS1aXS8udGVzdChlLmV4cGVjdGVkKT9g1Y3VrdWh1awg1bTVuNaC1b/WhNWh1aPWgNW41oLVtOKApCDVvdW61aHVvdW+1bjWgtW0INWn1oAgaW5zdGFuY2VvZiAke2UuZXhwZWN0ZWR9LCDVvdW/1aHWgdW+1aXVrCDVpyAke3N9YDpg1Y3VrdWh1awg1bTVuNaC1b/WhNWh1aPWgNW41oLVtOKApCDVvdW61aHVvdW+1bjWgtW0INWn1oAgJHtpfSwg1b3Vv9Wh1oHVvtWl1awg1acgJHtzfWB9Y2FzZSJpbnZhbGlkX3ZhbHVlIjpyZXR1cm4gZS52YWx1ZXMubGVuZ3RoPT09MT9g1Y3VrdWh1awg1bTVuNaC1b/WhNWh1aPWgNW41oLVtOKApCDVvdW61aHVvdW+1bjWgtW0INWn1oAgJHtTKGUudmFsdWVzWzFdKX1gOmDVjdWt1aHVrCDVv9Wh1oDVotWl1oDVodWv4oCkINW91brVodW91b7VuNaC1bQg1afWgCDVsNWl1b/Wh9W11aHVrNW21aXWgNWr1oEg1bTVpdWv1ajVnSAke18oZS52YWx1ZXMsInwiKX1gO2Nhc2UidG9vX2JpZyI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ijw9IjoiPCIsYT1uKGUub3JpZ2luKTtpZihhKXtjb25zdCBzPU51bWJlcihlLm1heGltdW0pLGM9UHMocyxhLnVuaXQub25lLGEudW5pdC5tYW55KTtyZXR1cm5g1YnVodaD1aHVptWh1bbWgSDVtNWl1a4g1aHWgNWq1aXWhOKApCDVvdW61aHVvdW+1bjWgtW0INWnLCDVuNaAICR7RmUoZS5vcmlnaW4/PyLVodaA1arVpdaEIil9INWv1bjWgtW21aXVttWhICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfSAke2N9YH1yZXR1cm5g1YnVodaD1aHVptWh1bbWgSDVtNWl1a4g1aHWgNWq1aXWhOKApCDVvdW61aHVvdW+1bjWgtW0INWnLCDVuNaAICR7RmUoZS5vcmlnaW4/PyLVodaA1arVpdaEIil9INWs1avVttWrICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfWB9Y2FzZSJ0b29fc21hbGwiOntjb25zdCBpPWUuaW5jbHVzaXZlPyI+PSI6Ij4iLGE9bihlLm9yaWdpbik7aWYoYSl7Y29uc3Qgcz1OdW1iZXIoZS5taW5pbXVtKSxjPVBzKHMsYS51bml0Lm9uZSxhLnVuaXQubWFueSk7cmV0dXJuYNWJ1aHWg9Wh1abVodW21oEg1oPVuNaE1oAg1aHWgNWq1aXWhOKApCDVvdW61aHVvdW+1bjWgtW0INWnLCDVuNaAICR7RmUoZS5vcmlnaW4pfSDVr9W41oLVttWl1bbVoSAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX0gJHtjfWB9cmV0dXJuYNWJ1aHWg9Wh1abVodW21oEg1oPVuNaE1oAg1aHWgNWq1aXWhOKApCDVvdW61aHVvdW+1bjWgtW0INWnLCDVuNaAICR7RmUoZS5vcmlnaW4pfSDVrNWr1bbVqyAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX1gfWNhc2UiaW52YWxpZF9mb3JtYXQiOntjb25zdCBpPWU7cmV0dXJuIGkuZm9ybWF0PT09InN0YXJ0c193aXRoIj9g1Y3VrdWh1awg1b/VuNWy4oCkINW61aXVv9aEINWnINW91a/VvdW+1asgIiR7aS5wcmVmaXh9Ii3VuNW+YDppLmZvcm1hdD09PSJlbmRzX3dpdGgiP2DVjdWt1aHVrCDVv9W41bLigKQg1brVpdW/1oQg1acg1aHVvtWh1oDVv9W+1asgIiR7aS5zdWZmaXh9Ii3VuNW+YDppLmZvcm1hdD09PSJpbmNsdWRlcyI/YNWN1a3VodWsINW/1bjVsuKApCDVutWl1b/WhCDVpyDVutWh1oDVuNaC1bbVodWv1asgIiR7aS5pbmNsdWRlc30iYDppLmZvcm1hdD09PSJyZWdleCI/YNWN1a3VodWsINW/1bjVsuKApCDVutWl1b/WhCDVpyDVsNWh1bTVodW61aHVv9Wh1b3VrdWh1bbVqyAke2kucGF0dGVybn0g1bHWh9Wh1bnVodaD1avVtmA6YNWN1a3VodWsICR7cltpLmZvcm1hdF0/P2UuZm9ybWF0fWB9Y2FzZSJub3RfbXVsdGlwbGVfb2YiOnJldHVybmDVjdWt1aHVrCDVqdWr1b7igKQg1brVpdW/1oQg1acg1aLVodWm1bTVodW61aHVv9Wr1a8g1azVq9W21asgJHtlLmRpdmlzb3J9LdWrYDtjYXNlInVucmVjb2duaXplZF9rZXlzIjpyZXR1cm5g1YnVs9Wh1bbVodW51b7VodWuINWi1aHVttWh1azVqyR7ZS5rZXlzLmxlbmd0aD4xPyLVttWl1oAiOiIifS4gJHtfKGUua2V5cywiLCAiKX1gO2Nhc2UiaW52YWxpZF9rZXkiOnJldHVybmDVjdWt1aHVrCDVotWh1bbVodWs1asgJHtGZShlLm9yaWdpbil9LdW41oLVtGA7Y2FzZSJpbnZhbGlkX3VuaW9uIjpyZXR1cm4i1Y3VrdWh1awg1bTVuNaC1b/WhNWh1aPWgNW41oLVtCI7Y2FzZSJpbnZhbGlkX2VsZW1lbnQiOnJldHVybmDVjdWt1aHVrCDVodaA1arVpdaEICR7RmUoZS5vcmlnaW4pfS3VuNaC1bRgO2RlZmF1bHQ6cmV0dXJuItWN1a3VodWsINW01bjWgtW/1oTVodWj1oDVuNaC1bQifX19O2Z1bmN0aW9uIGtmKCl7cmV0dXJue2xvY2FsZUVycm9yOnlmKCl9fWNvbnN0IFNmPSgpPT57Y29uc3QgdD17c3RyaW5nOnt1bml0OiJrYXJha3RlciIsdmVyYjoibWVtaWxpa2kifSxmaWxlOnt1bml0OiJieXRlIix2ZXJiOiJtZW1pbGlraSJ9LGFycmF5Ont1bml0OiJpdGVtIix2ZXJiOiJtZW1pbGlraSJ9LHNldDp7dW5pdDoiaXRlbSIsdmVyYjoibWVtaWxpa2kifX07ZnVuY3Rpb24gbihlKXtyZXR1cm4gdFtlXT8/bnVsbH1jb25zdCByPXtyZWdleDoiaW5wdXQiLGVtYWlsOiJhbGFtYXQgZW1haWwiLHVybDoiVVJMIixlbW9qaToiZW1vamkiLHV1aWQ6IlVVSUQiLHV1aWR2NDoiVVVJRHY0Iix1dWlkdjY6IlVVSUR2NiIsbmFub2lkOiJuYW5vaWQiLGd1aWQ6IkdVSUQiLGN1aWQ6ImN1aWQiLGN1aWQyOiJjdWlkMiIsdWxpZDoiVUxJRCIseGlkOiJYSUQiLGtzdWlkOiJLU1VJRCIsZGF0ZXRpbWU6InRhbmdnYWwgZGFuIHdha3R1IGZvcm1hdCBJU08iLGRhdGU6InRhbmdnYWwgZm9ybWF0IElTTyIsdGltZToiamFtIGZvcm1hdCBJU08iLGR1cmF0aW9uOiJkdXJhc2kgZm9ybWF0IElTTyIsaXB2NDoiYWxhbWF0IElQdjQiLGlwdjY6ImFsYW1hdCBJUHY2IixjaWRydjQ6InJlbnRhbmcgYWxhbWF0IElQdjQiLGNpZHJ2NjoicmVudGFuZyBhbGFtYXQgSVB2NiIsYmFzZTY0OiJzdHJpbmcgZGVuZ2FuIGVua29kZSBiYXNlNjQiLGJhc2U2NHVybDoic3RyaW5nIGRlbmdhbiBlbmtvZGUgYmFzZTY0dXJsIixqc29uX3N0cmluZzoic3RyaW5nIEpTT04iLGUxNjQ6ImFuZ2thIEUuMTY0Iixqd3Q6IkpXVCIsdGVtcGxhdGVfbGl0ZXJhbDoiaW5wdXQifSxvPXtuYW46Ik5hTiJ9O3JldHVybiBlPT57c3dpdGNoKGUuY29kZSl7Y2FzZSJpbnZhbGlkX3R5cGUiOntjb25zdCBpPW9bZS5leHBlY3RlZF0/P2UuZXhwZWN0ZWQsYT13KGUuaW5wdXQpLHM9b1thXT8/YTtyZXR1cm4vXltBLVpdLy50ZXN0KGUuZXhwZWN0ZWQpP2BJbnB1dCB0aWRhayB2YWxpZDogZGloYXJhcGthbiBpbnN0YW5jZW9mICR7ZS5leHBlY3RlZH0sIGRpdGVyaW1hICR7c31gOmBJbnB1dCB0aWRhayB2YWxpZDogZGloYXJhcGthbiAke2l9LCBkaXRlcmltYSAke3N9YH1jYXNlImludmFsaWRfdmFsdWUiOnJldHVybiBlLnZhbHVlcy5sZW5ndGg9PT0xP2BJbnB1dCB0aWRhayB2YWxpZDogZGloYXJhcGthbiAke1MoZS52YWx1ZXNbMF0pfWA6YFBpbGloYW4gdGlkYWsgdmFsaWQ6IGRpaGFyYXBrYW4gc2FsYWggc2F0dSBkYXJpICR7XyhlLnZhbHVlcywifCIpfWA7Y2FzZSJ0b29fYmlnIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPD0iOiI8IixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2BUZXJsYWx1IGJlc2FyOiBkaWhhcmFwa2FuICR7ZS5vcmlnaW4/PyJ2YWx1ZSJ9IG1lbWlsaWtpICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfSAke2EudW5pdD8/ImVsZW1lbiJ9YDpgVGVybGFsdSBiZXNhcjogZGloYXJhcGthbiAke2Uub3JpZ2luPz8idmFsdWUifSBtZW5qYWRpICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfWB9Y2FzZSJ0b29fc21hbGwiOntjb25zdCBpPWUuaW5jbHVzaXZlPyI+PSI6Ij4iLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YFRlcmxhbHUga2VjaWw6IGRpaGFyYXBrYW4gJHtlLm9yaWdpbn0gbWVtaWxpa2kgJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0fWA6YFRlcmxhbHUga2VjaWw6IGRpaGFyYXBrYW4gJHtlLm9yaWdpbn0gbWVuamFkaSAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX1gfWNhc2UiaW52YWxpZF9mb3JtYXQiOntjb25zdCBpPWU7cmV0dXJuIGkuZm9ybWF0PT09InN0YXJ0c193aXRoIj9gU3RyaW5nIHRpZGFrIHZhbGlkOiBoYXJ1cyBkaW11bGFpIGRlbmdhbiAiJHtpLnByZWZpeH0iYDppLmZvcm1hdD09PSJlbmRzX3dpdGgiP2BTdHJpbmcgdGlkYWsgdmFsaWQ6IGhhcnVzIGJlcmFraGlyIGRlbmdhbiAiJHtpLnN1ZmZpeH0iYDppLmZvcm1hdD09PSJpbmNsdWRlcyI/YFN0cmluZyB0aWRhayB2YWxpZDogaGFydXMgbWVueWVydGFrYW4gIiR7aS5pbmNsdWRlc30iYDppLmZvcm1hdD09PSJyZWdleCI/YFN0cmluZyB0aWRhayB2YWxpZDogaGFydXMgc2VzdWFpIHBvbGEgJHtpLnBhdHRlcm59YDpgJHtyW2kuZm9ybWF0XT8/ZS5mb3JtYXR9IHRpZGFrIHZhbGlkYH1jYXNlIm5vdF9tdWx0aXBsZV9vZiI6cmV0dXJuYEFuZ2thIHRpZGFrIHZhbGlkOiBoYXJ1cyBrZWxpcGF0YW4gZGFyaSAke2UuZGl2aXNvcn1gO2Nhc2UidW5yZWNvZ25pemVkX2tleXMiOnJldHVybmBLdW5jaSB0aWRhayBkaWtlbmFsaSAke2Uua2V5cy5sZW5ndGg+MT8icyI6IiJ9OiAke18oZS5rZXlzLCIsICIpfWA7Y2FzZSJpbnZhbGlkX2tleSI6cmV0dXJuYEt1bmNpIHRpZGFrIHZhbGlkIGRpICR7ZS5vcmlnaW59YDtjYXNlImludmFsaWRfdW5pb24iOnJldHVybiJJbnB1dCB0aWRhayB2YWxpZCI7Y2FzZSJpbnZhbGlkX2VsZW1lbnQiOnJldHVybmBOaWxhaSB0aWRhayB2YWxpZCBkaSAke2Uub3JpZ2lufWA7ZGVmYXVsdDpyZXR1cm4iSW5wdXQgdGlkYWsgdmFsaWQifX19O2Z1bmN0aW9uIHdmKCl7cmV0dXJue2xvY2FsZUVycm9yOlNmKCl9fWNvbnN0IElmPSgpPT57Y29uc3QgdD17c3RyaW5nOnt1bml0OiJzdGFmaSIsdmVyYjoiYcOwIGhhZmEifSxmaWxlOnt1bml0OiJiw6Z0aSIsdmVyYjoiYcOwIGhhZmEifSxhcnJheTp7dW5pdDoiaGx1dGkiLHZlcmI6ImHDsCBoYWZhIn0sc2V0Ont1bml0OiJobHV0aSIsdmVyYjoiYcOwIGhhZmEifX07ZnVuY3Rpb24gbihlKXtyZXR1cm4gdFtlXT8/bnVsbH1jb25zdCByPXtyZWdleDoiZ2lsZGkiLGVtYWlsOiJuZXRmYW5nIix1cmw6InZlZnNsw7PDsCIsZW1vamk6ImVtb2ppIix1dWlkOiJVVUlEIix1dWlkdjQ6IlVVSUR2NCIsdXVpZHY2OiJVVUlEdjYiLG5hbm9pZDoibmFub2lkIixndWlkOiJHVUlEIixjdWlkOiJjdWlkIixjdWlkMjoiY3VpZDIiLHVsaWQ6IlVMSUQiLHhpZDoiWElEIixrc3VpZDoiS1NVSUQiLGRhdGV0aW1lOiJJU08gZGFnc2V0bmluZyBvZyB0w61taSIsZGF0ZToiSVNPIGRhZ3NldG5pbmciLHRpbWU6IklTTyB0w61taSIsZHVyYXRpb246IklTTyB0w61tYWxlbmdkIixpcHY0OiJJUHY0IGFkZHJlc3MiLGlwdjY6IklQdjYgYWRkcmVzcyIsY2lkcnY0OiJJUHY0IHJhbmdlIixjaWRydjY6IklQdjYgcmFuZ2UiLGJhc2U2NDoiYmFzZTY0LWVuY29kZWQgc3RyZW5ndXIiLGJhc2U2NHVybDoiYmFzZTY0dXJsLWVuY29kZWQgc3RyZW5ndXIiLGpzb25fc3RyaW5nOiJKU09OIHN0cmVuZ3VyIixlMTY0OiJFLjE2NCB0w7ZsdWdpbGRpIixqd3Q6IkpXVCIsdGVtcGxhdGVfbGl0ZXJhbDoiZ2lsZGkifSxvPXtuYW46Ik5hTiIsbnVtYmVyOiJuw7ptZXIiLGFycmF5OiJmeWxraSJ9O3JldHVybiBlPT57c3dpdGNoKGUuY29kZSl7Y2FzZSJpbnZhbGlkX3R5cGUiOntjb25zdCBpPW9bZS5leHBlY3RlZF0/P2UuZXhwZWN0ZWQsYT13KGUuaW5wdXQpLHM9b1thXT8/YTtyZXR1cm4vXltBLVpdLy50ZXN0KGUuZXhwZWN0ZWQpP2BSYW5ndCBnaWxkaTogw57DuiBzbMOzc3QgaW5uICR7c30gw75hciBzZW0gw6EgYcOwIHZlcmEgaW5zdGFuY2VvZiAke2UuZXhwZWN0ZWR9YDpgUmFuZ3QgZ2lsZGk6IMOew7ogc2zDs3N0IGlubiAke3N9IMO+YXIgc2VtIMOhIGHDsCB2ZXJhICR7aX1gfWNhc2UiaW52YWxpZF92YWx1ZSI6cmV0dXJuIGUudmFsdWVzLmxlbmd0aD09PTE/YFJhbmd0IGdpbGRpOiBnZXJ0IHLDocOwIGZ5cmlyICR7UyhlLnZhbHVlc1swXSl9YDpgw5NnaWx0IHZhbDogbcOhIHZlcmEgZWl0dCBhZiBlZnRpcmZhcmFuZGkgJHtfKGUudmFsdWVzLCJ8Iil9YDtjYXNlInRvb19iaWciOntjb25zdCBpPWUuaW5jbHVzaXZlPyI8PSI6IjwiLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YE9mIHN0w7NydDogZ2VydCBlciByw6HDsCBmeXJpciBhw7AgJHtlLm9yaWdpbj8/ImdpbGRpIn0gaGFmaSAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX0gJHthLnVuaXQ/PyJobHV0aSJ9YDpgT2Ygc3TDs3J0OiBnZXJ0IGVyIHLDocOwIGZ5cmlyIGHDsCAke2Uub3JpZ2luPz8iZ2lsZGkifSBzw6kgJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9YH1jYXNlInRvb19zbWFsbCI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ij49IjoiPiIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9gT2YgbMOtdGnDsDogZ2VydCBlciByw6HDsCBmeXJpciBhw7AgJHtlLm9yaWdpbn0gaGFmaSAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX0gJHthLnVuaXR9YDpgT2YgbMOtdGnDsDogZ2VydCBlciByw6HDsCBmeXJpciBhw7AgJHtlLm9yaWdpbn0gc8OpICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfWB9Y2FzZSJpbnZhbGlkX2Zvcm1hdCI6e2NvbnN0IGk9ZTtyZXR1cm4gaS5mb3JtYXQ9PT0ic3RhcnRzX3dpdGgiP2DDk2dpbGR1ciBzdHJlbmd1cjogdmVyw7B1ciBhw7AgYnlyamEgw6EgIiR7aS5wcmVmaXh9ImA6aS5mb3JtYXQ9PT0iZW5kc193aXRoIj9gw5NnaWxkdXIgc3RyZW5ndXI6IHZlcsOwdXIgYcOwIGVuZGEgw6EgIiR7aS5zdWZmaXh9ImA6aS5mb3JtYXQ9PT0iaW5jbHVkZXMiP2DDk2dpbGR1ciBzdHJlbmd1cjogdmVyw7B1ciBhw7AgaW5uaWhhbGRhICIke2kuaW5jbHVkZXN9ImA6aS5mb3JtYXQ9PT0icmVnZXgiP2DDk2dpbGR1ciBzdHJlbmd1cjogdmVyw7B1ciBhw7AgZnlsZ2phIG15bnN0cmkgJHtpLnBhdHRlcm59YDpgUmFuZ3QgJHtyW2kuZm9ybWF0XT8/ZS5mb3JtYXR9YH1jYXNlIm5vdF9tdWx0aXBsZV9vZiI6cmV0dXJuYFLDtm5nIHRhbGE6IHZlcsOwdXIgYcOwIHZlcmEgbWFyZ2ZlbGRpIGFmICR7ZS5kaXZpc29yfWA7Y2FzZSJ1bnJlY29nbml6ZWRfa2V5cyI6cmV0dXJuYMOTw75la2t0ICR7ZS5rZXlzLmxlbmd0aD4xPyJpciBseWtsYXIiOiJ1ciBseWtpbGwifTogJHtfKGUua2V5cywiLCAiKX1gO2Nhc2UiaW52YWxpZF9rZXkiOnJldHVybmBSYW5ndXIgbHlraWxsIMOtICR7ZS5vcmlnaW59YDtjYXNlImludmFsaWRfdW5pb24iOnJldHVybiJSYW5ndCBnaWxkaSI7Y2FzZSJpbnZhbGlkX2VsZW1lbnQiOnJldHVybmBSYW5ndCBnaWxkaSDDrSAke2Uub3JpZ2lufWA7ZGVmYXVsdDpyZXR1cm4iUmFuZ3QgZ2lsZGkifX19O2Z1bmN0aW9uIHpmKCl7cmV0dXJue2xvY2FsZUVycm9yOklmKCl9fWNvbnN0IHhmPSgpPT57Y29uc3QgdD17c3RyaW5nOnt1bml0OiJjYXJhdHRlcmkiLHZlcmI6ImF2ZXJlIn0sZmlsZTp7dW5pdDoiYnl0ZSIsdmVyYjoiYXZlcmUifSxhcnJheTp7dW5pdDoiZWxlbWVudGkiLHZlcmI6ImF2ZXJlIn0sc2V0Ont1bml0OiJlbGVtZW50aSIsdmVyYjoiYXZlcmUifX07ZnVuY3Rpb24gbihlKXtyZXR1cm4gdFtlXT8/bnVsbH1jb25zdCByPXtyZWdleDoiaW5wdXQiLGVtYWlsOiJpbmRpcml6em8gZW1haWwiLHVybDoiVVJMIixlbW9qaToiZW1vamkiLHV1aWQ6IlVVSUQiLHV1aWR2NDoiVVVJRHY0Iix1dWlkdjY6IlVVSUR2NiIsbmFub2lkOiJuYW5vaWQiLGd1aWQ6IkdVSUQiLGN1aWQ6ImN1aWQiLGN1aWQyOiJjdWlkMiIsdWxpZDoiVUxJRCIseGlkOiJYSUQiLGtzdWlkOiJLU1VJRCIsZGF0ZXRpbWU6ImRhdGEgZSBvcmEgSVNPIixkYXRlOiJkYXRhIElTTyIsdGltZToib3JhIElTTyIsZHVyYXRpb246ImR1cmF0YSBJU08iLGlwdjQ6ImluZGlyaXp6byBJUHY0IixpcHY2OiJpbmRpcml6em8gSVB2NiIsY2lkcnY0OiJpbnRlcnZhbGxvIElQdjQiLGNpZHJ2NjoiaW50ZXJ2YWxsbyBJUHY2IixiYXNlNjQ6InN0cmluZ2EgY29kaWZpY2F0YSBpbiBiYXNlNjQiLGJhc2U2NHVybDoiVVJMIGNvZGlmaWNhdGEgaW4gYmFzZTY0Iixqc29uX3N0cmluZzoic3RyaW5nYSBKU09OIixlMTY0OiJudW1lcm8gRS4xNjQiLGp3dDoiSldUIix0ZW1wbGF0ZV9saXRlcmFsOiJpbnB1dCJ9LG89e25hbjoiTmFOIixudW1iZXI6Im51bWVybyIsYXJyYXk6InZldHRvcmUifTtyZXR1cm4gZT0+e3N3aXRjaChlLmNvZGUpe2Nhc2UiaW52YWxpZF90eXBlIjp7Y29uc3QgaT1vW2UuZXhwZWN0ZWRdPz9lLmV4cGVjdGVkLGE9dyhlLmlucHV0KSxzPW9bYV0/P2E7cmV0dXJuL15bQS1aXS8udGVzdChlLmV4cGVjdGVkKT9gSW5wdXQgbm9uIHZhbGlkbzogYXR0ZXNvIGluc3RhbmNlb2YgJHtlLmV4cGVjdGVkfSwgcmljZXZ1dG8gJHtzfWA6YElucHV0IG5vbiB2YWxpZG86IGF0dGVzbyAke2l9LCByaWNldnV0byAke3N9YH1jYXNlImludmFsaWRfdmFsdWUiOnJldHVybiBlLnZhbHVlcy5sZW5ndGg9PT0xP2BJbnB1dCBub24gdmFsaWRvOiBhdHRlc28gJHtTKGUudmFsdWVzWzBdKX1gOmBPcHppb25lIG5vbiB2YWxpZGE6IGF0dGVzbyB1bm8gdHJhICR7XyhlLnZhbHVlcywifCIpfWA7Y2FzZSJ0b29fYmlnIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPD0iOiI8IixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2BUcm9wcG8gZ3JhbmRlOiAke2Uub3JpZ2luPz8idmFsb3JlIn0gZGV2ZSBhdmVyZSAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX0gJHthLnVuaXQ/PyJlbGVtZW50aSJ9YDpgVHJvcHBvIGdyYW5kZTogJHtlLm9yaWdpbj8/InZhbG9yZSJ9IGRldmUgZXNzZXJlICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfWB9Y2FzZSJ0b29fc21hbGwiOntjb25zdCBpPWUuaW5jbHVzaXZlPyI+PSI6Ij4iLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YFRyb3BwbyBwaWNjb2xvOiAke2Uub3JpZ2lufSBkZXZlIGF2ZXJlICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfSAke2EudW5pdH1gOmBUcm9wcG8gcGljY29sbzogJHtlLm9yaWdpbn0gZGV2ZSBlc3NlcmUgJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9YH1jYXNlImludmFsaWRfZm9ybWF0Ijp7Y29uc3QgaT1lO3JldHVybiBpLmZvcm1hdD09PSJzdGFydHNfd2l0aCI/YFN0cmluZ2Egbm9uIHZhbGlkYTogZGV2ZSBpbml6aWFyZSBjb24gIiR7aS5wcmVmaXh9ImA6aS5mb3JtYXQ9PT0iZW5kc193aXRoIj9gU3RyaW5nYSBub24gdmFsaWRhOiBkZXZlIHRlcm1pbmFyZSBjb24gIiR7aS5zdWZmaXh9ImA6aS5mb3JtYXQ9PT0iaW5jbHVkZXMiP2BTdHJpbmdhIG5vbiB2YWxpZGE6IGRldmUgaW5jbHVkZXJlICIke2kuaW5jbHVkZXN9ImA6aS5mb3JtYXQ9PT0icmVnZXgiP2BTdHJpbmdhIG5vbiB2YWxpZGE6IGRldmUgY29ycmlzcG9uZGVyZSBhbCBwYXR0ZXJuICR7aS5wYXR0ZXJufWA6YElucHV0IG5vbiB2YWxpZG86ICR7cltpLmZvcm1hdF0/P2UuZm9ybWF0fWB9Y2FzZSJub3RfbXVsdGlwbGVfb2YiOnJldHVybmBOdW1lcm8gbm9uIHZhbGlkbzogZGV2ZSBlc3NlcmUgdW4gbXVsdGlwbG8gZGkgJHtlLmRpdmlzb3J9YDtjYXNlInVucmVjb2duaXplZF9rZXlzIjpyZXR1cm5gQ2hpYXYke2Uua2V5cy5sZW5ndGg+MT8iaSI6ImUifSBub24gcmljb25vc2NpdXQke2Uua2V5cy5sZW5ndGg+MT8iZSI6ImEifTogJHtfKGUua2V5cywiLCAiKX1gO2Nhc2UiaW52YWxpZF9rZXkiOnJldHVybmBDaGlhdmUgbm9uIHZhbGlkYSBpbiAke2Uub3JpZ2lufWA7Y2FzZSJpbnZhbGlkX3VuaW9uIjpyZXR1cm4iSW5wdXQgbm9uIHZhbGlkbyI7Y2FzZSJpbnZhbGlkX2VsZW1lbnQiOnJldHVybmBWYWxvcmUgbm9uIHZhbGlkbyBpbiAke2Uub3JpZ2lufWA7ZGVmYXVsdDpyZXR1cm4iSW5wdXQgbm9uIHZhbGlkbyJ9fX07ZnVuY3Rpb24gVGYoKXtyZXR1cm57bG9jYWxlRXJyb3I6eGYoKX19Y29uc3QgamY9KCk9Pntjb25zdCB0PXtzdHJpbmc6e3VuaXQ6IuaWh+WtlyIsdmVyYjoi44Gn44GC44KLIn0sZmlsZTp7dW5pdDoi44OQ44Kk44OIIix2ZXJiOiLjgafjgYLjgosifSxhcnJheTp7dW5pdDoi6KaB57SgIix2ZXJiOiLjgafjgYLjgosifSxzZXQ6e3VuaXQ6Iuimgee0oCIsdmVyYjoi44Gn44GC44KLIn19O2Z1bmN0aW9uIG4oZSl7cmV0dXJuIHRbZV0/P251bGx9Y29uc3Qgcj17cmVnZXg6IuWFpeWKm+WApCIsZW1haWw6IuODoeODvOODq+OCouODieODrOOCuSIsdXJsOiJVUkwiLGVtb2ppOiLntbXmloflrZciLHV1aWQ6IlVVSUQiLHV1aWR2NDoiVVVJRHY0Iix1dWlkdjY6IlVVSUR2NiIsbmFub2lkOiJuYW5vaWQiLGd1aWQ6IkdVSUQiLGN1aWQ6ImN1aWQiLGN1aWQyOiJjdWlkMiIsdWxpZDoiVUxJRCIseGlkOiJYSUQiLGtzdWlkOiJLU1VJRCIsZGF0ZXRpbWU6IklTT+aXpeaZgiIsZGF0ZToiSVNP5pel5LuYIix0aW1lOiJJU0/mmYLliLsiLGR1cmF0aW9uOiJJU0/mnJ/plpMiLGlwdjQ6IklQdjTjgqLjg4njg6zjgrkiLGlwdjY6IklQdjbjgqLjg4njg6zjgrkiLGNpZHJ2NDoiSVB2NOevhOWbsiIsY2lkcnY2OiJJUHY256+E5ZuyIixiYXNlNjQ6ImJhc2U2NOOCqOODs+OCs+ODvOODieaWh+Wtl+WIlyIsYmFzZTY0dXJsOiJiYXNlNjR1cmzjgqjjg7PjgrPjg7zjg4nmloflrZfliJciLGpzb25fc3RyaW5nOiJKU09O5paH5a2X5YiXIixlMTY0OiJFLjE2NOeVquWPtyIsand0OiJKV1QiLHRlbXBsYXRlX2xpdGVyYWw6IuWFpeWKm+WApCJ9LG89e25hbjoiTmFOIixudW1iZXI6IuaVsOWApCIsYXJyYXk6IumFjeWIlyJ9O3JldHVybiBlPT57c3dpdGNoKGUuY29kZSl7Y2FzZSJpbnZhbGlkX3R5cGUiOntjb25zdCBpPW9bZS5leHBlY3RlZF0/P2UuZXhwZWN0ZWQsYT13KGUuaW5wdXQpLHM9b1thXT8/YTtyZXR1cm4vXltBLVpdLy50ZXN0KGUuZXhwZWN0ZWQpP2DnhKHlirnjgarlhaXlips6IGluc3RhbmNlb2YgJHtlLmV4cGVjdGVkfeOBjOacn+W+heOBleOCjOOBvuOBl+OBn+OBjOOAgSR7c33jgYzlhaXlipvjgZXjgozjgb7jgZfjgZ9gOmDnhKHlirnjgarlhaXlips6ICR7aX3jgYzmnJ/lvoXjgZXjgozjgb7jgZfjgZ/jgYzjgIEke3N944GM5YWl5Yqb44GV44KM44G+44GX44GfYH1jYXNlImludmFsaWRfdmFsdWUiOnJldHVybiBlLnZhbHVlcy5sZW5ndGg9PT0xP2DnhKHlirnjgarlhaXlips6ICR7UyhlLnZhbHVlc1swXSl944GM5pyf5b6F44GV44KM44G+44GX44GfYDpg54Sh5Yq544Gq6YG45oqeOiAke18oZS52YWx1ZXMsIuOAgSIpfeOBruOBhOOBmuOCjOOBi+OBp+OBguOCi+W/heimgeOBjOOBguOCiuOBvuOBmWA7Y2FzZSJ0b29fYmlnIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8i5Lul5LiL44Gn44GC44KLIjoi44KI44KK5bCP44GV44GEIixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2DlpKfjgY3jgZnjgY7jgovlgKQ6ICR7ZS5vcmlnaW4/PyLlgKQifeOBryR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9JHthLnVuaXQ/PyLopoHntKAifSR7aX3lv4XopoHjgYzjgYLjgorjgb7jgZlgOmDlpKfjgY3jgZnjgY7jgovlgKQ6ICR7ZS5vcmlnaW4/PyLlgKQifeOBryR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9JHtpfeW/heimgeOBjOOBguOCiuOBvuOBmWB9Y2FzZSJ0b29fc21hbGwiOntjb25zdCBpPWUuaW5jbHVzaXZlPyLku6XkuIrjgafjgYLjgosiOiLjgojjgorlpKfjgY3jgYQiLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YOWwj+OBleOBmeOBjuOCi+WApDogJHtlLm9yaWdpbn3jga8ke2UubWluaW11bS50b1N0cmluZygpfSR7YS51bml0fSR7aX3lv4XopoHjgYzjgYLjgorjgb7jgZlgOmDlsI/jgZXjgZnjgY7jgovlgKQ6ICR7ZS5vcmlnaW5944GvJHtlLm1pbmltdW0udG9TdHJpbmcoKX0ke2l95b+F6KaB44GM44GC44KK44G+44GZYH1jYXNlImludmFsaWRfZm9ybWF0Ijp7Y29uc3QgaT1lO3JldHVybiBpLmZvcm1hdD09PSJzdGFydHNfd2l0aCI/YOeEoeWKueOBquaWh+Wtl+WIlzogIiR7aS5wcmVmaXh9IuOBp+Wni+OBvuOCi+W/heimgeOBjOOBguOCiuOBvuOBmWA6aS5mb3JtYXQ9PT0iZW5kc193aXRoIj9g54Sh5Yq544Gq5paH5a2X5YiXOiAiJHtpLnN1ZmZpeH0i44Gn57WC44KP44KL5b+F6KaB44GM44GC44KK44G+44GZYDppLmZvcm1hdD09PSJpbmNsdWRlcyI/YOeEoeWKueOBquaWh+Wtl+WIlzogIiR7aS5pbmNsdWRlc30i44KS5ZCr44KA5b+F6KaB44GM44GC44KK44G+44GZYDppLmZvcm1hdD09PSJyZWdleCI/YOeEoeWKueOBquaWh+Wtl+WIlzog44OR44K/44O844OzJHtpLnBhdHRlcm5944Gr5LiA6Ie044GZ44KL5b+F6KaB44GM44GC44KK44G+44GZYDpg54Sh5Yq544GqJHtyW2kuZm9ybWF0XT8/ZS5mb3JtYXR9YH1jYXNlIm5vdF9tdWx0aXBsZV9vZiI6cmV0dXJuYOeEoeWKueOBquaVsOWApDogJHtlLmRpdmlzb3J944Gu5YCN5pWw44Gn44GC44KL5b+F6KaB44GM44GC44KK44G+44GZYDtjYXNlInVucmVjb2duaXplZF9rZXlzIjpyZXR1cm5g6KqN6K2Y44GV44KM44Gm44GE44Gq44GE44Kt44O8JHtlLmtleXMubGVuZ3RoPjE/Iue+pCI6IiJ9OiAke18oZS5rZXlzLCLjgIEiKX1gO2Nhc2UiaW52YWxpZF9rZXkiOnJldHVybmAke2Uub3JpZ2lufeWGheOBrueEoeWKueOBquOCreODvGA7Y2FzZSJpbnZhbGlkX3VuaW9uIjpyZXR1cm4i54Sh5Yq544Gq5YWl5YqbIjtjYXNlImludmFsaWRfZWxlbWVudCI6cmV0dXJuYCR7ZS5vcmlnaW595YaF44Gu54Sh5Yq544Gq5YCkYDtkZWZhdWx0OnJldHVybiLnhKHlirnjgarlhaXlipsifX19O2Z1bmN0aW9uIE9mKCl7cmV0dXJue2xvY2FsZUVycm9yOmpmKCl9fWNvbnN0IFVmPSgpPT57Y29uc3QgdD17c3RyaW5nOnt1bml0OiLhg6Hhg5jhg5vhg5Hhg53hg5rhg50iLHZlcmI6IuGDo+GDnOGDk+GDkCDhg6jhg5Thg5jhg6rhg5Dhg5Xhg5Phg5Thg6EifSxmaWxlOnt1bml0OiLhg5Hhg5Dhg5jhg6Lhg5giLHZlcmI6IuGDo+GDnOGDk+GDkCDhg6jhg5Thg5jhg6rhg5Dhg5Xhg5Phg5Thg6EifSxhcnJheTp7dW5pdDoi4YOU4YOa4YOU4YOb4YOU4YOc4YOi4YOYIix2ZXJiOiLhg6Phg5zhg5Phg5Ag4YOo4YOU4YOY4YOq4YOQ4YOV4YOT4YOU4YOhIn0sc2V0Ont1bml0OiLhg5Thg5rhg5Thg5vhg5Thg5zhg6Lhg5giLHZlcmI6IuGDo+GDnOGDk+GDkCDhg6jhg5Thg5jhg6rhg5Dhg5Xhg5Phg5Thg6EifX07ZnVuY3Rpb24gbihlKXtyZXR1cm4gdFtlXT8/bnVsbH1jb25zdCByPXtyZWdleDoi4YOo4YOU4YOn4YOV4YOQ4YOc4YOQIixlbWFpbDoi4YOU4YOaLeGDpOGDneGDoeGDouGDmOGDoSDhg5vhg5jhg6Hhg5Dhg5vhg5Dhg6Dhg5fhg5giLHVybDoiVVJMIixlbW9qaToi4YOU4YOb4YOd4YOv4YOYIix1dWlkOiJVVUlEIix1dWlkdjQ6IlVVSUR2NCIsdXVpZHY2OiJVVUlEdjYiLG5hbm9pZDoibmFub2lkIixndWlkOiJHVUlEIixjdWlkOiJjdWlkIixjdWlkMjoiY3VpZDIiLHVsaWQ6IlVMSUQiLHhpZDoiWElEIixrc3VpZDoiS1NVSUQiLGRhdGV0aW1lOiLhg5fhg5Dhg6Dhg5jhg6bhg5gt4YOT4YOg4YOdIixkYXRlOiLhg5fhg5Dhg6Dhg5jhg6bhg5giLHRpbWU6IuGDk+GDoOGDnSIsZHVyYXRpb246IuGDruGDkOGDnOGDkuGDoOGDq+GDmuGDmOGDleGDneGDkeGDkCIsaXB2NDoiSVB2NCDhg5vhg5jhg6Hhg5Dhg5vhg5Dhg6Dhg5fhg5giLGlwdjY6IklQdjYg4YOb4YOY4YOh4YOQ4YOb4YOQ4YOg4YOX4YOYIixjaWRydjQ6IklQdjQg4YOT4YOY4YOQ4YOe4YOQ4YOW4YOd4YOc4YOYIixjaWRydjY6IklQdjYg4YOT4YOY4YOQ4YOe4YOQ4YOW4YOd4YOc4YOYIixiYXNlNjQ6ImJhc2U2NC3hg5nhg53hg5Phg5jhg6Dhg5Thg5Hhg6Phg5rhg5gg4YOV4YOU4YOa4YOYIixiYXNlNjR1cmw6ImJhc2U2NHVybC3hg5nhg53hg5Phg5jhg6Dhg5Thg5Hhg6Phg5rhg5gg4YOV4YOU4YOa4YOYIixqc29uX3N0cmluZzoiSlNPTiDhg5Xhg5Thg5rhg5giLGUxNjQ6IkUuMTY0IOGDnOGDneGDm+GDlOGDoOGDmCIsand0OiJKV1QiLHRlbXBsYXRlX2xpdGVyYWw6IuGDqOGDlOGDp+GDleGDkOGDnOGDkCJ9LG89e25hbjoiTmFOIixudW1iZXI6IuGDoOGDmOGDquGDruGDleGDmCIsc3RyaW5nOiLhg5Xhg5Thg5rhg5giLGJvb2xlYW46IuGDkeGDo+GDmuGDlOGDkOGDnOGDmCIsZnVuY3Rpb246IuGDpOGDo+GDnOGDpeGDquGDmOGDkCIsYXJyYXk6IuGDm+GDkOGDoeGDmOGDleGDmCJ9O3JldHVybiBlPT57c3dpdGNoKGUuY29kZSl7Y2FzZSJpbnZhbGlkX3R5cGUiOntjb25zdCBpPW9bZS5leHBlY3RlZF0/P2UuZXhwZWN0ZWQsYT13KGUuaW5wdXQpLHM9b1thXT8/YTtyZXR1cm4vXltBLVpdLy50ZXN0KGUuZXhwZWN0ZWQpP2Dhg5Dhg6Dhg5Dhg6Hhg6zhg53hg6Dhg5gg4YOo4YOU4YOn4YOV4YOQ4YOc4YOQOiDhg5vhg53hg6Hhg5Dhg5rhg53hg5Phg5zhg5Thg5rhg5ggaW5zdGFuY2VvZiAke2UuZXhwZWN0ZWR9LCDhg5vhg5jhg6bhg5Thg5Hhg6Phg5rhg5ggJHtzfWA6YOGDkOGDoOGDkOGDoeGDrOGDneGDoOGDmCDhg6jhg5Thg6fhg5Xhg5Dhg5zhg5A6IOGDm+GDneGDoeGDkOGDmuGDneGDk+GDnOGDlOGDmuGDmCAke2l9LCDhg5vhg5jhg6bhg5Thg5Hhg6Phg5rhg5ggJHtzfWB9Y2FzZSJpbnZhbGlkX3ZhbHVlIjpyZXR1cm4gZS52YWx1ZXMubGVuZ3RoPT09MT9g4YOQ4YOg4YOQ4YOh4YOs4YOd4YOg4YOYIOGDqOGDlOGDp+GDleGDkOGDnOGDkDog4YOb4YOd4YOh4YOQ4YOa4YOd4YOT4YOc4YOU4YOa4YOYICR7UyhlLnZhbHVlc1swXSl9YDpg4YOQ4YOg4YOQ4YOh4YOs4YOd4YOg4YOYIOGDleGDkOGDoOGDmOGDkOGDnOGDouGDmDog4YOb4YOd4YOh4YOQ4YOa4YOd4YOT4YOc4YOU4YOa4YOY4YOQIOGDlOGDoOGDly3hg5Thg6Dhg5fhg5ggJHtfKGUudmFsdWVzLCJ8Iil9LeGDk+GDkOGDnGA7Y2FzZSJ0b29fYmlnIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPD0iOiI8IixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2Dhg5bhg5Thg5Phg5vhg5Thg6Lhg5Dhg5Mg4YOT4YOY4YOT4YOYOiDhg5vhg53hg6Hhg5Dhg5rhg53hg5Phg5zhg5Thg5rhg5ggJHtlLm9yaWdpbj8/IuGDm+GDnOGDmOGDqOGDleGDnOGDlOGDmuGDneGDkeGDkCJ9ICR7YS52ZXJifSAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX0gJHthLnVuaXR9YDpg4YOW4YOU4YOT4YOb4YOU4YOi4YOQ4YOTIOGDk+GDmOGDk+GDmDog4YOb4YOd4YOh4YOQ4YOa4YOd4YOT4YOc4YOU4YOa4YOYICR7ZS5vcmlnaW4/PyLhg5vhg5zhg5jhg6jhg5Xhg5zhg5Thg5rhg53hg5Hhg5AifSDhg5jhg6fhg53hg6EgJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9YH1jYXNlInRvb19zbWFsbCI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ij49IjoiPiIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9g4YOW4YOU4YOT4YOb4YOU4YOi4YOQ4YOTIOGDnuGDkOGDouGDkOGDoOGDkDog4YOb4YOd4YOh4YOQ4YOa4YOd4YOT4YOc4YOU4YOa4YOYICR7ZS5vcmlnaW59ICR7YS52ZXJifSAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX0gJHthLnVuaXR9YDpg4YOW4YOU4YOT4YOb4YOU4YOi4YOQ4YOTIOGDnuGDkOGDouGDkOGDoOGDkDog4YOb4YOd4YOh4YOQ4YOa4YOd4YOT4YOc4YOU4YOa4YOYICR7ZS5vcmlnaW59IOGDmOGDp+GDneGDoSAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX1gfWNhc2UiaW52YWxpZF9mb3JtYXQiOntjb25zdCBpPWU7cmV0dXJuIGkuZm9ybWF0PT09InN0YXJ0c193aXRoIj9g4YOQ4YOg4YOQ4YOh4YOs4YOd4YOg4YOYIOGDleGDlOGDmuGDmDog4YOj4YOc4YOT4YOQIOGDmOGDrOGDp+GDlOGDkeGDneGDk+GDlOGDoSAiJHtpLnByZWZpeH0iLeGDmOGDl2A6aS5mb3JtYXQ9PT0iZW5kc193aXRoIj9g4YOQ4YOg4YOQ4YOh4YOs4YOd4YOg4YOYIOGDleGDlOGDmuGDmDog4YOj4YOc4YOT4YOQIOGDm+GDl+GDkOGDleGDoOGDk+GDlOGDkeGDneGDk+GDlOGDoSAiJHtpLnN1ZmZpeH0iLeGDmOGDl2A6aS5mb3JtYXQ9PT0iaW5jbHVkZXMiP2Dhg5Dhg6Dhg5Dhg6Hhg6zhg53hg6Dhg5gg4YOV4YOU4YOa4YOYOiDhg6Phg5zhg5Phg5Ag4YOo4YOU4YOY4YOq4YOQ4YOV4YOT4YOU4YOhICIke2kuaW5jbHVkZXN9Ii3hg6FgOmkuZm9ybWF0PT09InJlZ2V4Ij9g4YOQ4YOg4YOQ4YOh4YOs4YOd4YOg4YOYIOGDleGDlOGDmuGDmDog4YOj4YOc4YOT4YOQIOGDqOGDlOGDlOGDoeGDkOGDkeGDkOGDm+GDlOGDkeGDneGDk+GDlOGDoSDhg6jhg5Dhg5Hhg5rhg53hg5zhg6EgJHtpLnBhdHRlcm59YDpg4YOQ4YOg4YOQ4YOh4YOs4YOd4YOg4YOYICR7cltpLmZvcm1hdF0/P2UuZm9ybWF0fWB9Y2FzZSJub3RfbXVsdGlwbGVfb2YiOnJldHVybmDhg5Dhg6Dhg5Dhg6Hhg6zhg53hg6Dhg5gg4YOg4YOY4YOq4YOu4YOV4YOYOiDhg6Phg5zhg5Phg5Ag4YOY4YOn4YOd4YOhICR7ZS5kaXZpc29yfS3hg5jhg6Eg4YOv4YOU4YOg4YOQ4YOT4YOYYDtjYXNlInVucmVjb2duaXplZF9rZXlzIjpyZXR1cm5g4YOj4YOq4YOc4YOd4YOR4YOYIOGDkuGDkOGDoeGDkOGDpuGDlOGDkSR7ZS5rZXlzLmxlbmd0aD4xPyLhg5Thg5Hhg5giOiLhg5gifTogJHtfKGUua2V5cywiLCAiKX1gO2Nhc2UiaW52YWxpZF9rZXkiOnJldHVybmDhg5Dhg6Dhg5Dhg6Hhg6zhg53hg6Dhg5gg4YOS4YOQ4YOh4YOQ4YOm4YOU4YOR4YOYICR7ZS5vcmlnaW59LeGDqOGDmGA7Y2FzZSJpbnZhbGlkX3VuaW9uIjpyZXR1cm4i4YOQ4YOg4YOQ4YOh4YOs4YOd4YOg4YOYIOGDqOGDlOGDp+GDleGDkOGDnOGDkCI7Y2FzZSJpbnZhbGlkX2VsZW1lbnQiOnJldHVybmDhg5Dhg6Dhg5Dhg6Hhg6zhg53hg6Dhg5gg4YOb4YOc4YOY4YOo4YOV4YOc4YOU4YOa4YOd4YOR4YOQICR7ZS5vcmlnaW59LeGDqOGDmGA7ZGVmYXVsdDpyZXR1cm4i4YOQ4YOg4YOQ4YOh4YOs4YOd4YOg4YOYIOGDqOGDlOGDp+GDleGDkOGDnOGDkCJ9fX07ZnVuY3Rpb24gUGYoKXtyZXR1cm57bG9jYWxlRXJyb3I6VWYoKX19Y29uc3QgTmY9KCk9Pntjb25zdCB0PXtzdHJpbmc6e3VuaXQ6IuGej+GeveGeouGegOGfkuGen+GemiIsdmVyYjoi4Z6C4Z694Z6a4Z6Y4Z624Z6TIn0sZmlsZTp7dW5pdDoi4Z6U4Z+DIix2ZXJiOiLhnoLhnr3hnprhnpjhnrbhnpMifSxhcnJheTp7dW5pdDoi4Z6S4Z624Z6P4Z67Iix2ZXJiOiLhnoLhnr3hnprhnpjhnrbhnpMifSxzZXQ6e3VuaXQ6IuGekuGetuGej+GeuyIsdmVyYjoi4Z6C4Z694Z6a4Z6Y4Z624Z6TIn19O2Z1bmN0aW9uIG4oZSl7cmV0dXJuIHRbZV0/P251bGx9Y29uc3Qgcj17cmVnZXg6IuGekeGet+Gek+GfkuGek+Gek+GfkOGemeGelOGeieGfkuGeheGevOGemyIsZW1haWw6IuGeouGetuGen+GemeGeiuGfkuGei+GetuGek+GeouGfiuGeuOGemOGfguGemyIsdXJsOiJVUkwiLGVtb2ppOiLhnp/hnonhn5LhnonhnrbhnqLhnrbhnprhnpjhn5Lhnpjhno7hn40iLHV1aWQ6IlVVSUQiLHV1aWR2NDoiVVVJRHY0Iix1dWlkdjY6IlVVSUR2NiIsbmFub2lkOiJuYW5vaWQiLGd1aWQ6IkdVSUQiLGN1aWQ6ImN1aWQiLGN1aWQyOiJjdWlkMiIsdWxpZDoiVUxJRCIseGlkOiJYSUQiLGtzdWlkOiJLU1VJRCIsZGF0ZXRpbWU6IuGegOGetuGem+GelOGemuGet+GeheGfkuGehuGfgeGekSDhnpPhnrfhnoThnpjhn4nhn4ThnoQgSVNPIixkYXRlOiLhnoDhnrbhnpvhnpThnprhnrfhnoXhn5Lhnobhn4HhnpEgSVNPIix0aW1lOiLhnpjhn4nhn4ThnoQgSVNPIixkdXJhdGlvbjoi4Z6a4Z6Z4Z+I4Z6W4Z+B4Z6bIElTTyIsaXB2NDoi4Z6i4Z624Z6f4Z6Z4Z6K4Z+S4Z6L4Z624Z6TIElQdjQiLGlwdjY6IuGeouGetuGen+GemeGeiuGfkuGei+GetuGekyBJUHY2IixjaWRydjQ6IuGeiuGfguGek+GeouGetuGen+GemeGeiuGfkuGei+GetuGekyBJUHY0IixjaWRydjY6IuGeiuGfguGek+GeouGetuGen+GemeGeiuGfkuGei+GetuGekyBJUHY2IixiYXNlNjQ6IuGegeGfkuGen+GfguGeouGegOGfkuGen+GemuGeouGfiuGet+GegOGevOGeiiBiYXNlNjQiLGJhc2U2NHVybDoi4Z6B4Z+S4Z6f4Z+C4Z6i4Z6A4Z+S4Z6f4Z6a4Z6i4Z+K4Z634Z6A4Z684Z6KIGJhc2U2NHVybCIsanNvbl9zdHJpbmc6IuGegeGfkuGen+GfguGeouGegOGfkuGen+GemiBKU09OIixlMTY0OiLhnpvhn4HhnoEgRS4xNjQiLGp3dDoiSldUIix0ZW1wbGF0ZV9saXRlcmFsOiLhnpHhnrfhnpPhn5LhnpPhnpPhn5DhnpnhnpThnonhn5LhnoXhnrzhnpsifSxvPXtuYW46Ik5hTiIsbnVtYmVyOiLhnpvhn4HhnoEiLGFycmF5OiLhnqLhnrbhnprhn4EgKEFycmF5KSIsbnVsbDoi4Z6C4Z+S4Z6Y4Z624Z6T4Z6P4Z6Y4Z+S4Z6b4Z+DIChudWxsKSJ9O3JldHVybiBlPT57c3dpdGNoKGUuY29kZSl7Y2FzZSJpbnZhbGlkX3R5cGUiOntjb25zdCBpPW9bZS5leHBlY3RlZF0/P2UuZXhwZWN0ZWQsYT13KGUuaW5wdXQpLHM9b1thXT8/YTtyZXR1cm4vXltBLVpdLy50ZXN0KGUuZXhwZWN0ZWQpP2DhnpHhnrfhnpPhn5LhnpPhnpPhn5DhnpnhnpThnonhn5LhnoXhnrzhnpvhnpjhnrfhnpPhno/hn5Lhnprhnrnhnpjhno/hn5Lhnprhnrzhnpzhn5Yg4Z6P4Z+S4Z6a4Z684Z6c4Z6A4Z624Z6aIGluc3RhbmNlb2YgJHtlLmV4cGVjdGVkfSDhnpThn4nhnrvhnpPhn5Lhno/hn4LhnpHhnpHhnr3hnpvhnpThnrbhnpMgJHtzfWA6YOGekeGet+Gek+GfkuGek+Gek+GfkOGemeGelOGeieGfkuGeheGevOGem+GemOGet+Gek+Gej+GfkuGemuGeueGemOGej+GfkuGemuGevOGenOGfliDhno/hn5LhnprhnrzhnpzhnoDhnrbhnpogJHtpfSDhnpThn4nhnrvhnpPhn5Lhno/hn4LhnpHhnpHhnr3hnpvhnpThnrbhnpMgJHtzfWB9Y2FzZSJpbnZhbGlkX3ZhbHVlIjpyZXR1cm4gZS52YWx1ZXMubGVuZ3RoPT09MT9g4Z6R4Z634Z6T4Z+S4Z6T4Z6T4Z+Q4Z6Z4Z6U4Z6J4Z+S4Z6F4Z684Z6b4Z6Y4Z634Z6T4Z6P4Z+S4Z6a4Z654Z6Y4Z6P4Z+S4Z6a4Z684Z6c4Z+WIOGej+GfkuGemuGevOGenOGegOGetuGemiAke1MoZS52YWx1ZXNbMF0pfWA6YOGeh+GemOGfkuGemuGevuGen+GemOGet+Gek+Gej+GfkuGemuGeueGemOGej+GfkuGemuGevOGenOGfliDhno/hn5Lhnprhnrzhnpzhnofhnrbhnpjhnr3hnpnhnoDhn5LhnpPhnrvhnoThnoXhn4bhno7hn4ThnpggJHtfKGUudmFsdWVzLCJ8Iil9YDtjYXNlInRvb19iaWciOntjb25zdCBpPWUuaW5jbHVzaXZlPyI8PSI6IjwiLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YOGekuGfhuGeluGfgeGegOGfliDhno/hn5LhnprhnrzhnpzhnoDhnrbhnpogJHtlLm9yaWdpbj8/IuGej+GemOGfkuGem+GfgyJ9ICR7aX0gJHtlLm1heGltdW0udG9TdHJpbmcoKX0gJHthLnVuaXQ/PyLhnpLhnrbhno/hnrsifWA6YOGekuGfhuGeluGfgeGegOGfliDhno/hn5LhnprhnrzhnpzhnoDhnrbhnpogJHtlLm9yaWdpbj8/IuGej+GemOGfkuGem+GfgyJ9ICR7aX0gJHtlLm1heGltdW0udG9TdHJpbmcoKX1gfWNhc2UidG9vX3NtYWxsIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPj0iOiI+IixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2Dhno/hnrzhnoXhnpbhn4HhnoDhn5Yg4Z6P4Z+S4Z6a4Z684Z6c4Z6A4Z624Z6aICR7ZS5vcmlnaW59ICR7aX0gJHtlLm1pbmltdW0udG9TdHJpbmcoKX0gJHthLnVuaXR9YDpg4Z6P4Z684Z6F4Z6W4Z+B4Z6A4Z+WIOGej+GfkuGemuGevOGenOGegOGetuGemiAke2Uub3JpZ2lufSAke2l9ICR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9YH1jYXNlImludmFsaWRfZm9ybWF0Ijp7Y29uc3QgaT1lO3JldHVybiBpLmZvcm1hdD09PSJzdGFydHNfd2l0aCI/YOGegeGfkuGen+GfguGeouGegOGfkuGen+GemuGemOGet+Gek+Gej+GfkuGemuGeueGemOGej+GfkuGemuGevOGenOGfliDhno/hn5LhnprhnrzhnpzhnoXhnrbhnpThn4vhnpXhn5Lhno/hnr7hnpjhnorhn4ThnpkgIiR7aS5wcmVmaXh9ImA6aS5mb3JtYXQ9PT0iZW5kc193aXRoIj9g4Z6B4Z+S4Z6f4Z+C4Z6i4Z6A4Z+S4Z6f4Z6a4Z6Y4Z634Z6T4Z6P4Z+S4Z6a4Z654Z6Y4Z6P4Z+S4Z6a4Z684Z6c4Z+WIOGej+GfkuGemuGevOGenOGelOGeieGfkuGeheGelOGfi+GeiuGfhOGemSAiJHtpLnN1ZmZpeH0iYDppLmZvcm1hdD09PSJpbmNsdWRlcyI/YOGegeGfkuGen+GfguGeouGegOGfkuGen+GemuGemOGet+Gek+Gej+GfkuGemuGeueGemOGej+GfkuGemuGevOGenOGfliDhno/hn5LhnprhnrzhnpzhnpjhnrbhnpMgIiR7aS5pbmNsdWRlc30iYDppLmZvcm1hdD09PSJyZWdleCI/YOGegeGfkuGen+GfguGeouGegOGfkuGen+GemuGemOGet+Gek+Gej+GfkuGemuGeueGemOGej+GfkuGemuGevOGenOGfliDhno/hn5Lhnprhnrzhnpzhno/hn4LhnpXhn5LhnoLhnrzhnpXhn5LhnoLhnoThnpPhnrnhnoThnpHhnpjhn5LhnprhnoThn4vhnorhn4LhnpvhnpThnrbhnpPhnoDhn4bhno7hno/hn4sgJHtpLnBhdHRlcm59YDpg4Z6Y4Z634Z6T4Z6P4Z+S4Z6a4Z654Z6Y4Z6P4Z+S4Z6a4Z684Z6c4Z+WICR7cltpLmZvcm1hdF0/P2UuZm9ybWF0fWB9Y2FzZSJub3RfbXVsdGlwbGVfb2YiOnJldHVybmDhnpvhn4HhnoHhnpjhnrfhnpPhno/hn5Lhnprhnrnhnpjhno/hn5Lhnprhnrzhnpzhn5Yg4Z6P4Z+S4Z6a4Z684Z6c4Z6P4Z+C4Z6H4Z624Z6W4Z6g4Z674Z6C4Z674Z6O4Z6T4Z+DICR7ZS5kaXZpc29yfWA7Y2FzZSJ1bnJlY29nbml6ZWRfa2V5cyI6cmV0dXJuYOGemuGegOGeg+GevuGeieGen+GfhOGemOGet+Gek+Gen+GfkuGeguGetuGem+Gfi+GfliAke18oZS5rZXlzLCIsICIpfWA7Y2FzZSJpbnZhbGlkX2tleSI6cmV0dXJuYOGen+GfhOGemOGet+Gek+Gej+GfkuGemuGeueGemOGej+GfkuGemuGevOGenOGek+GfheGegOGfkuGek+Geu+GehCAke2Uub3JpZ2lufWA7Y2FzZSJpbnZhbGlkX3VuaW9uIjpyZXR1cm4i4Z6R4Z634Z6T4Z+S4Z6T4Z6T4Z+Q4Z6Z4Z6Y4Z634Z6T4Z6P4Z+S4Z6a4Z654Z6Y4Z6P4Z+S4Z6a4Z684Z6cIjtjYXNlImludmFsaWRfZWxlbWVudCI6cmV0dXJuYOGekeGet+Gek+GfkuGek+Gek+GfkOGemeGemOGet+Gek+Gej+GfkuGemuGeueGemOGej+GfkuGemuGevOGenOGek+GfheGegOGfkuGek+Geu+GehCAke2Uub3JpZ2lufWA7ZGVmYXVsdDpyZXR1cm4i4Z6R4Z634Z6T4Z+S4Z6T4Z6T4Z+Q4Z6Z4Z6Y4Z634Z6T4Z6P4Z+S4Z6a4Z654Z6Y4Z6P4Z+S4Z6a4Z684Z6cIn19fTtmdW5jdGlvbiB4bCgpe3JldHVybntsb2NhbGVFcnJvcjpOZigpfX1mdW5jdGlvbiBEZigpe3JldHVybiB4bCgpfWNvbnN0IEVmPSgpPT57Y29uc3QgdD17c3RyaW5nOnt1bml0OiLrrLjsnpAiLHZlcmI6InRvIGhhdmUifSxmaWxlOnt1bml0OiLrsJTsnbTtirgiLHZlcmI6InRvIGhhdmUifSxhcnJheTp7dW5pdDoi6rCcIix2ZXJiOiJ0byBoYXZlIn0sc2V0Ont1bml0OiLqsJwiLHZlcmI6InRvIGhhdmUifX07ZnVuY3Rpb24gbihlKXtyZXR1cm4gdFtlXT8/bnVsbH1jb25zdCByPXtyZWdleDoi7J6F66ClIixlbWFpbDoi7J2066mU7J28IOyjvOyGjCIsdXJsOiJVUkwiLGVtb2ppOiLsnbTrqqjsp4AiLHV1aWQ6IlVVSUQiLHV1aWR2NDoiVVVJRHY0Iix1dWlkdjY6IlVVSUR2NiIsbmFub2lkOiJuYW5vaWQiLGd1aWQ6IkdVSUQiLGN1aWQ6ImN1aWQiLGN1aWQyOiJjdWlkMiIsdWxpZDoiVUxJRCIseGlkOiJYSUQiLGtzdWlkOiJLU1VJRCIsZGF0ZXRpbWU6IklTTyDrgqDsp5zsi5zqsIQiLGRhdGU6IklTTyDrgqDsp5wiLHRpbWU6IklTTyDsi5zqsIQiLGR1cmF0aW9uOiJJU08g6riw6rCEIixpcHY0OiJJUHY0IOyjvOyGjCIsaXB2NjoiSVB2NiDso7zshowiLGNpZHJ2NDoiSVB2NCDrspTsnIQiLGNpZHJ2NjoiSVB2NiDrspTsnIQiLGJhc2U2NDoiYmFzZTY0IOyduOy9lOuUqSDrrLjsnpDsl7QiLGJhc2U2NHVybDoiYmFzZTY0dXJsIOyduOy9lOuUqSDrrLjsnpDsl7QiLGpzb25fc3RyaW5nOiJKU09OIOusuOyekOyXtCIsZTE2NDoiRS4xNjQg67KI7Zi4Iixqd3Q6IkpXVCIsdGVtcGxhdGVfbGl0ZXJhbDoi7J6F66ClIn0sbz17bmFuOiJOYU4ifTtyZXR1cm4gZT0+e3N3aXRjaChlLmNvZGUpe2Nhc2UiaW52YWxpZF90eXBlIjp7Y29uc3QgaT1vW2UuZXhwZWN0ZWRdPz9lLmV4cGVjdGVkLGE9dyhlLmlucHV0KSxzPW9bYV0/P2E7cmV0dXJuL15bQS1aXS8udGVzdChlLmV4cGVjdGVkKT9g7J6Y66q765CcIOyeheugpTog7JiI7IOBIO2DgOyeheydgCBpbnN0YW5jZW9mICR7ZS5leHBlY3RlZH0sIOuwm+ydgCDtg4DsnoXsnYAgJHtzfeyeheuLiOuLpGA6YOyemOuqu+uQnCDsnoXroKU6IOyYiOyDgSDtg4DsnoXsnYAgJHtpfSwg67Cb7J2AIO2DgOyeheydgCAke3N97J6F64uI64ukYH1jYXNlImludmFsaWRfdmFsdWUiOnJldHVybiBlLnZhbHVlcy5sZW5ndGg9PT0xP2DsnpjrqrvrkJwg7J6F66ClOiDqsJLsnYAgJHtTKGUudmFsdWVzWzBdKX0g7J207Ja07JW8IO2VqeuLiOuLpGA6YOyemOuqu+uQnCDsmLXshZg6ICR7XyhlLnZhbHVlcywi65iQ64qUICIpfSDspJEg7ZWY64KY7Jes7JW8IO2VqeuLiOuLpGA7Y2FzZSJ0b29fYmlnIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8i7J207ZWYIjoi66+466eMIixhPWk9PT0i66+466eMIj8i7J207Ja07JW8IO2VqeuLiOuLpCI6IuyXrOyVvCDtlanri4jri6QiLHM9bihlLm9yaWdpbiksYz1zPy51bml0Pz8i7JqU7IaMIjtyZXR1cm4gcz9gJHtlLm9yaWdpbj8/IuqwkiJ97J20IOuEiOustCDtgb3ri4jri6Q6ICR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9JHtjfSAke2l9JHthfWA6YCR7ZS5vcmlnaW4/PyLqsJIifeydtCDrhIjrrLQg7YG964uI64ukOiAke2UubWF4aW11bS50b1N0cmluZygpfSAke2l9JHthfWB9Y2FzZSJ0b29fc21hbGwiOntjb25zdCBpPWUuaW5jbHVzaXZlPyLsnbTsg4EiOiLstIjqs7wiLGE9aT09PSLsnbTsg4EiPyLsnbTslrTslbwg7ZWp64uI64ukIjoi7Jes7JW8IO2VqeuLiOuLpCIscz1uKGUub3JpZ2luKSxjPXM/LnVuaXQ/PyLsmpTshowiO3JldHVybiBzP2Ake2Uub3JpZ2luPz8i6rCSIn3snbQg64SI66y0IOyekeyKteuLiOuLpDogJHtlLm1pbmltdW0udG9TdHJpbmcoKX0ke2N9ICR7aX0ke2F9YDpgJHtlLm9yaWdpbj8/IuqwkiJ97J20IOuEiOustCDsnpHsirXri4jri6Q6ICR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9ICR7aX0ke2F9YH1jYXNlImludmFsaWRfZm9ybWF0Ijp7Y29uc3QgaT1lO3JldHVybiBpLmZvcm1hdD09PSJzdGFydHNfd2l0aCI/YOyemOuqu+uQnCDrrLjsnpDsl7Q6ICIke2kucHJlZml4fSIo7Jy8KeuhnCDsi5zsnpHtlbTslbwg7ZWp64uI64ukYDppLmZvcm1hdD09PSJlbmRzX3dpdGgiP2DsnpjrqrvrkJwg66y47J6Q7Je0OiAiJHtpLnN1ZmZpeH0iKOycvCnroZwg64Gd64KY7JW8IO2VqeuLiOuLpGA6aS5mb3JtYXQ9PT0iaW5jbHVkZXMiP2DsnpjrqrvrkJwg66y47J6Q7Je0OiAiJHtpLmluY2x1ZGVzfSLsnYQo66W8KSDtj6ztlajtlbTslbwg7ZWp64uI64ukYDppLmZvcm1hdD09PSJyZWdleCI/YOyemOuqu+uQnCDrrLjsnpDsl7Q6IOygleq3nOyLnSAke2kucGF0dGVybn0g7Yyo7YS06rO8IOydvOy5mO2VtOyVvCDtlanri4jri6RgOmDsnpjrqrvrkJwgJHtyW2kuZm9ybWF0XT8/ZS5mb3JtYXR9YH1jYXNlIm5vdF9tdWx0aXBsZV9vZiI6cmV0dXJuYOyemOuqu+uQnCDsiKvsnpA6ICR7ZS5kaXZpc29yfeydmCDrsLDsiJjsl6zslbwg7ZWp64uI64ukYDtjYXNlInVucmVjb2duaXplZF9rZXlzIjpyZXR1cm5g7J247Iud7ZWgIOyImCDsl4bripQg7YKkOiAke18oZS5rZXlzLCIsICIpfWA7Y2FzZSJpbnZhbGlkX2tleSI6cmV0dXJuYOyemOuqu+uQnCDtgqQ6ICR7ZS5vcmlnaW59YDtjYXNlImludmFsaWRfdW5pb24iOnJldHVybiLsnpjrqrvrkJwg7J6F66ClIjtjYXNlImludmFsaWRfZWxlbWVudCI6cmV0dXJuYOyemOuqu+uQnCDqsJI6ICR7ZS5vcmlnaW59YDtkZWZhdWx0OnJldHVybiLsnpjrqrvrkJwg7J6F66ClIn19fTtmdW5jdGlvbiBaZigpe3JldHVybntsb2NhbGVFcnJvcjpFZigpfX1jb25zdCBodD10PT50LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK3Quc2xpY2UoMSk7ZnVuY3Rpb24gTnModCl7Y29uc3Qgbj1NYXRoLmFicyh0KSxyPW4lMTAsbz1uJTEwMDtyZXR1cm4gbz49MTEmJm88PTE5fHxyPT09MD8ibWFueSI6cj09PTE/Im9uZSI6ImZldyJ9Y29uc3QgUmY9KCk9Pntjb25zdCB0PXtzdHJpbmc6e3VuaXQ6e29uZToic2ltYm9saXMiLGZldzoic2ltYm9saWFpIixtYW55OiJzaW1ib2xpxbMifSx2ZXJiOntzbWFsbGVyOntpbmNsdXNpdmU6InR1cmkgYsWrdGkgbmUgaWxnZXNuxJcga2FpcCIsbm90SW5jbHVzaXZlOiJ0dXJpIGLFq3RpIHRydW1wZXNuxJcga2FpcCJ9LGJpZ2dlcjp7aW5jbHVzaXZlOiJ0dXJpIGLFq3RpIG5lIHRydW1wZXNuxJcga2FpcCIsbm90SW5jbHVzaXZlOiJ0dXJpIGLFq3RpIGlsZ2VzbsSXIGthaXAifX19LGZpbGU6e3VuaXQ6e29uZToiYmFpdGFzIixmZXc6ImJhaXRhaSIsbWFueToiYmFpdMWzIn0sdmVyYjp7c21hbGxlcjp7aW5jbHVzaXZlOiJ0dXJpIGLFq3RpIG5lIGRpZGVzbmlzIGthaXAiLG5vdEluY2x1c2l2ZToidHVyaSBixat0aSBtYcW+ZXNuaXMga2FpcCJ9LGJpZ2dlcjp7aW5jbHVzaXZlOiJ0dXJpIGLFq3RpIG5lIG1hxb5lc25pcyBrYWlwIixub3RJbmNsdXNpdmU6InR1cmkgYsWrdGkgZGlkZXNuaXMga2FpcCJ9fX0sYXJyYXk6e3VuaXQ6e29uZToiZWxlbWVudMSFIixmZXc6ImVsZW1lbnR1cyIsbWFueToiZWxlbWVudMWzIn0sdmVyYjp7c21hbGxlcjp7aW5jbHVzaXZlOiJ0dXJpIHR1csSXdGkgbmUgZGF1Z2lhdSBrYWlwIixub3RJbmNsdXNpdmU6InR1cmkgdHVyxJd0aSBtYcW+aWF1IGthaXAifSxiaWdnZXI6e2luY2x1c2l2ZToidHVyaSB0dXLEl3RpIG5lIG1hxb5pYXUga2FpcCIsbm90SW5jbHVzaXZlOiJ0dXJpIHR1csSXdGkgZGF1Z2lhdSBrYWlwIn19fSxzZXQ6e3VuaXQ6e29uZToiZWxlbWVudMSFIixmZXc6ImVsZW1lbnR1cyIsbWFueToiZWxlbWVudMWzIn0sdmVyYjp7c21hbGxlcjp7aW5jbHVzaXZlOiJ0dXJpIHR1csSXdGkgbmUgZGF1Z2lhdSBrYWlwIixub3RJbmNsdXNpdmU6InR1cmkgdHVyxJd0aSBtYcW+aWF1IGthaXAifSxiaWdnZXI6e2luY2x1c2l2ZToidHVyaSB0dXLEl3RpIG5lIG1hxb5pYXUga2FpcCIsbm90SW5jbHVzaXZlOiJ0dXJpIHR1csSXdGkgZGF1Z2lhdSBrYWlwIn19fX07ZnVuY3Rpb24gbihlLGksYSxzKXtjb25zdCBjPXRbZV0/P251bGw7cmV0dXJuIGM9PT1udWxsP2M6e3VuaXQ6Yy51bml0W2ldLHZlcmI6Yy52ZXJiW3NdW2E/ImluY2x1c2l2ZSI6Im5vdEluY2x1c2l2ZSJdfX1jb25zdCByPXtyZWdleDoixK92ZXN0aXMiLGVtYWlsOiJlbC4gcGHFoXRvIGFkcmVzYXMiLHVybDoiVVJMIixlbW9qaToiamF1c3R1a2FzIix1dWlkOiJVVUlEIix1dWlkdjQ6IlVVSUR2NCIsdXVpZHY2OiJVVUlEdjYiLG5hbm9pZDoibmFub2lkIixndWlkOiJHVUlEIixjdWlkOiJjdWlkIixjdWlkMjoiY3VpZDIiLHVsaWQ6IlVMSUQiLHhpZDoiWElEIixrc3VpZDoiS1NVSUQiLGRhdGV0aW1lOiJJU08gZGF0YSBpciBsYWlrYXMiLGRhdGU6IklTTyBkYXRhIix0aW1lOiJJU08gbGFpa2FzIixkdXJhdGlvbjoiSVNPIHRydWttxJciLGlwdjQ6IklQdjQgYWRyZXNhcyIsaXB2NjoiSVB2NiBhZHJlc2FzIixjaWRydjQ6IklQdjQgdGlua2xvIHByZWZpa3NhcyAoQ0lEUikiLGNpZHJ2NjoiSVB2NiB0aW5rbG8gcHJlZmlrc2FzIChDSURSKSIsYmFzZTY0OiJiYXNlNjQgdcW+a29kdW90YSBlaWx1dMSXIixiYXNlNjR1cmw6ImJhc2U2NHVybCB1xb5rb2R1b3RhIGVpbHV0xJciLGpzb25fc3RyaW5nOiJKU09OIGVpbHV0xJciLGUxNjQ6IkUuMTY0IG51bWVyaXMiLGp3dDoiSldUIix0ZW1wbGF0ZV9saXRlcmFsOiLEr3Zlc3RpcyJ9LG89e25hbjoiTmFOIixudW1iZXI6InNrYWnEjWl1cyIsYmlnaW50OiJzdmVpa2FzaXMgc2thacSNaXVzIixzdHJpbmc6ImVpbHV0xJciLGJvb2xlYW46ImxvZ2luxJcgcmVpa8WhbcSXIix1bmRlZmluZWQ6Im5lYXBpYnLEl8W+dGEgcmVpa8WhbcSXIixmdW5jdGlvbjoiZnVua2NpamEiLHN5bWJvbDoic2ltYm9saXMiLGFycmF5OiJtYXN5dmFzIixvYmplY3Q6Im9iamVrdGFzIixudWxsOiJudWxpbsSXIHJlaWvFoW3ElyJ9O3JldHVybiBlPT57c3dpdGNoKGUuY29kZSl7Y2FzZSJpbnZhbGlkX3R5cGUiOntjb25zdCBpPW9bZS5leHBlY3RlZF0/P2UuZXhwZWN0ZWQsYT13KGUuaW5wdXQpLHM9b1thXT8/YTtyZXR1cm4vXltBLVpdLy50ZXN0KGUuZXhwZWN0ZWQpP2BHYXV0YXMgdGlwYXMgJHtzfSwgbyB0aWvEl3Rhc2kgLSBpbnN0YW5jZW9mICR7ZS5leHBlY3RlZH1gOmBHYXV0YXMgdGlwYXMgJHtzfSwgbyB0aWvEl3Rhc2kgLSAke2l9YH1jYXNlImludmFsaWRfdmFsdWUiOnJldHVybiBlLnZhbHVlcy5sZW5ndGg9PT0xP2BQcml2YWxvIGLFq3RpICR7UyhlLnZhbHVlc1swXSl9YDpgUHJpdmFsbyBixat0aSB2aWVuYXMgacWhICR7XyhlLnZhbHVlcywifCIpfSBwYXNpcmlua2ltxbNgO2Nhc2UidG9vX2JpZyI6e2NvbnN0IGk9b1tlLm9yaWdpbl0/P2Uub3JpZ2luLGE9bihlLm9yaWdpbixOcyhOdW1iZXIoZS5tYXhpbXVtKSksZS5pbmNsdXNpdmU/PyExLCJzbWFsbGVyIik7aWYoYT8udmVyYilyZXR1cm5gJHtodChpPz9lLm9yaWdpbj8/InJlaWvFoW3ElyIpfSAke2EudmVyYn0gJHtlLm1heGltdW0udG9TdHJpbmcoKX0gJHthLnVuaXQ/PyJlbGVtZW50xbMifWA7Y29uc3Qgcz1lLmluY2x1c2l2ZT8ibmUgZGlkZXNuaXMga2FpcCI6Im1hxb5lc25pcyBrYWlwIjtyZXR1cm5gJHtodChpPz9lLm9yaWdpbj8/InJlaWvFoW3ElyIpfSB0dXJpIGLFq3RpICR7c30gJHtlLm1heGltdW0udG9TdHJpbmcoKX0gJHthPy51bml0fWB9Y2FzZSJ0b29fc21hbGwiOntjb25zdCBpPW9bZS5vcmlnaW5dPz9lLm9yaWdpbixhPW4oZS5vcmlnaW4sTnMoTnVtYmVyKGUubWluaW11bSkpLGUuaW5jbHVzaXZlPz8hMSwiYmlnZ2VyIik7aWYoYT8udmVyYilyZXR1cm5gJHtodChpPz9lLm9yaWdpbj8/InJlaWvFoW3ElyIpfSAke2EudmVyYn0gJHtlLm1pbmltdW0udG9TdHJpbmcoKX0gJHthLnVuaXQ/PyJlbGVtZW50xbMifWA7Y29uc3Qgcz1lLmluY2x1c2l2ZT8ibmUgbWHFvmVzbmlzIGthaXAiOiJkaWRlc25pcyBrYWlwIjtyZXR1cm5gJHtodChpPz9lLm9yaWdpbj8/InJlaWvFoW3ElyIpfSB0dXJpIGLFq3RpICR7c30gJHtlLm1pbmltdW0udG9TdHJpbmcoKX0gJHthPy51bml0fWB9Y2FzZSJpbnZhbGlkX2Zvcm1hdCI6e2NvbnN0IGk9ZTtyZXR1cm4gaS5mb3JtYXQ9PT0ic3RhcnRzX3dpdGgiP2BFaWx1dMSXIHByaXZhbG8gcHJhc2lkxJd0aSAiJHtpLnByZWZpeH0iYDppLmZvcm1hdD09PSJlbmRzX3dpdGgiP2BFaWx1dMSXIHByaXZhbG8gcGFzaWJhaWd0aSAiJHtpLnN1ZmZpeH0iYDppLmZvcm1hdD09PSJpbmNsdWRlcyI/YEVpbHV0xJcgcHJpdmFsbyDEr3RyYXVrdGkgIiR7aS5pbmNsdWRlc30iYDppLmZvcm1hdD09PSJyZWdleCI/YEVpbHV0xJcgcHJpdmFsbyBhdGl0aWt0aSAke2kucGF0dGVybn1gOmBOZXRlaXNpbmdhcyAke3JbaS5mb3JtYXRdPz9lLmZvcm1hdH1gfWNhc2Uibm90X211bHRpcGxlX29mIjpyZXR1cm5gU2thacSNaXVzIHByaXZhbG8gYsWrdGkgJHtlLmRpdmlzb3J9IGthcnRvdGluaXMuYDtjYXNlInVucmVjb2duaXplZF9rZXlzIjpyZXR1cm5gTmVhdHBhxb5pbnQke2Uua2V5cy5sZW5ndGg+MT8iaSI6ImFzIn0gcmFrdCR7ZS5rZXlzLmxlbmd0aD4xPyJhaSI6ImFzIn06ICR7XyhlLmtleXMsIiwgIil9YDtjYXNlImludmFsaWRfa2V5IjpyZXR1cm4iUmFzdGFzIGtsYWlkaW5nYXMgcmFrdGFzIjtjYXNlImludmFsaWRfdW5pb24iOnJldHVybiJLbGFpZGluZ2EgxK92ZXN0aXMiO2Nhc2UiaW52YWxpZF9lbGVtZW50Ijp7Y29uc3QgaT1vW2Uub3JpZ2luXT8/ZS5vcmlnaW47cmV0dXJuYCR7aHQoaT8/ZS5vcmlnaW4/PyJyZWlrxaFtxJciKX0gdHVyaSBrbGFpZGluZ8SFIMSvdmVzdMSvYH1kZWZhdWx0OnJldHVybiJLbGFpZGluZ2EgxK92ZXN0aXMifX19O2Z1bmN0aW9uIENmKCl7cmV0dXJue2xvY2FsZUVycm9yOlJmKCl9fWNvbnN0IEFmPSgpPT57Y29uc3QgdD17c3RyaW5nOnt1bml0OiLQt9C90LDRhtC4Iix2ZXJiOiLQtNCwINC40LzQsNCw0YIifSxmaWxlOnt1bml0OiLQsdCw0ZjRgtC4Iix2ZXJiOiLQtNCwINC40LzQsNCw0YIifSxhcnJheTp7dW5pdDoi0YHRgtCw0LLQutC4Iix2ZXJiOiLQtNCwINC40LzQsNCw0YIifSxzZXQ6e3VuaXQ6ItGB0YLQsNCy0LrQuCIsdmVyYjoi0LTQsCDQuNC80LDQsNGCIn19O2Z1bmN0aW9uIG4oZSl7cmV0dXJuIHRbZV0/P251bGx9Y29uc3Qgcj17cmVnZXg6ItCy0L3QtdGBIixlbWFpbDoi0LDQtNGA0LXRgdCwINC90LAg0LUt0L/QvtGI0YLQsCIsdXJsOiJVUkwiLGVtb2ppOiLQtdC80L7Rn9C4Iix1dWlkOiJVVUlEIix1dWlkdjQ6IlVVSUR2NCIsdXVpZHY2OiJVVUlEdjYiLG5hbm9pZDoibmFub2lkIixndWlkOiJHVUlEIixjdWlkOiJjdWlkIixjdWlkMjoiY3VpZDIiLHVsaWQ6IlVMSUQiLHhpZDoiWElEIixrc3VpZDoiS1NVSUQiLGRhdGV0aW1lOiJJU08g0LTQsNGC0YPQvCDQuCDQstGA0LXQvNC1IixkYXRlOiJJU08g0LTQsNGC0YPQvCIsdGltZToiSVNPINCy0YDQtdC80LUiLGR1cmF0aW9uOiJJU08g0LLRgNC10LzQtdGC0YDQsNC10ZrQtSIsaXB2NDoiSVB2NCDQsNC00YDQtdGB0LAiLGlwdjY6IklQdjYg0LDQtNGA0LXRgdCwIixjaWRydjQ6IklQdjQg0L7Qv9GB0LXQsyIsY2lkcnY2OiJJUHY2INC+0L/RgdC10LMiLGJhc2U2NDoiYmFzZTY0LdC10L3QutC+0LTQuNGA0LDQvdCwINC90LjQt9CwIixiYXNlNjR1cmw6ImJhc2U2NHVybC3QtdC90LrQvtC00LjRgNCw0L3QsCDQvdC40LfQsCIsanNvbl9zdHJpbmc6IkpTT04g0L3QuNC30LAiLGUxNjQ6IkUuMTY0INCx0YDQvtGYIixqd3Q6IkpXVCIsdGVtcGxhdGVfbGl0ZXJhbDoi0LLQvdC10YEifSxvPXtuYW46Ik5hTiIsbnVtYmVyOiLQsdGA0L7RmCIsYXJyYXk6ItC90LjQt9CwIn07cmV0dXJuIGU9Pntzd2l0Y2goZS5jb2RlKXtjYXNlImludmFsaWRfdHlwZSI6e2NvbnN0IGk9b1tlLmV4cGVjdGVkXT8/ZS5leHBlY3RlZCxhPXcoZS5pbnB1dCkscz1vW2FdPz9hO3JldHVybi9eW0EtWl0vLnRlc3QoZS5leHBlY3RlZCk/YNCT0YDQtdGI0LXQvSDQstC90LXRgTog0YHQtSDQvtGH0LXQutGD0LLQsCBpbnN0YW5jZW9mICR7ZS5leHBlY3RlZH0sINC/0YDQuNC80LXQvdC+ICR7c31gOmDQk9GA0LXRiNC10L0g0LLQvdC10YE6INGB0LUg0L7Rh9C10LrRg9Cy0LAgJHtpfSwg0L/RgNC40LzQtdC90L4gJHtzfWB9Y2FzZSJpbnZhbGlkX3ZhbHVlIjpyZXR1cm4gZS52YWx1ZXMubGVuZ3RoPT09MT9gSW52YWxpZCBpbnB1dDogZXhwZWN0ZWQgJHtTKGUudmFsdWVzWzBdKX1gOmDQk9GA0LXRiNCw0L3QsCDQvtC/0YbQuNGY0LA6INGB0LUg0L7Rh9C10LrRg9Cy0LAg0LXQtNC90LAgJHtfKGUudmFsdWVzLCJ8Iil9YDtjYXNlInRvb19iaWciOntjb25zdCBpPWUuaW5jbHVzaXZlPyI8PSI6IjwiLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YNCf0YDQtdC80L3QvtCz0YMg0LPQvtC70LXQvDog0YHQtSDQvtGH0LXQutGD0LLQsCAke2Uub3JpZ2luPz8i0LLRgNC10LTQvdC+0YHRgtCwIn0g0LTQsCDQuNC80LAgJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0Pz8i0LXQu9C10LzQtdC90YLQuCJ9YDpg0J/RgNC10LzQvdC+0LPRgyDQs9C+0LvQtdC8OiDRgdC1INC+0YfQtdC60YPQstCwICR7ZS5vcmlnaW4/PyLQstGA0LXQtNC90L7RgdGC0LAifSDQtNCwINCx0LjQtNC1ICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfWB9Y2FzZSJ0b29fc21hbGwiOntjb25zdCBpPWUuaW5jbHVzaXZlPyI+PSI6Ij4iLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YNCf0YDQtdC80L3QvtCz0YMg0LzQsNC7OiDRgdC1INC+0YfQtdC60YPQstCwICR7ZS5vcmlnaW59INC00LAg0LjQvNCwICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfSAke2EudW5pdH1gOmDQn9GA0LXQvNC90L7Qs9GDINC80LDQuzog0YHQtSDQvtGH0LXQutGD0LLQsCAke2Uub3JpZ2lufSDQtNCwINCx0LjQtNC1ICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfWB9Y2FzZSJpbnZhbGlkX2Zvcm1hdCI6e2NvbnN0IGk9ZTtyZXR1cm4gaS5mb3JtYXQ9PT0ic3RhcnRzX3dpdGgiP2DQndC10LLQsNC20LXRh9C60LAg0L3QuNC30LA6INC80L7RgNCwINC00LAg0LfQsNC/0L7Rh9C90YPQstCwINGB0L4gIiR7aS5wcmVmaXh9ImA6aS5mb3JtYXQ9PT0iZW5kc193aXRoIj9g0J3QtdCy0LDQttC10YfQutCwINC90LjQt9CwOiDQvNC+0YDQsCDQtNCwINC30LDQstGA0YjRg9Cy0LAg0YHQviAiJHtpLnN1ZmZpeH0iYDppLmZvcm1hdD09PSJpbmNsdWRlcyI/YNCd0LXQstCw0LbQtdGH0LrQsCDQvdC40LfQsDog0LzQvtGA0LAg0LTQsCDQstC60LvRg9GH0YPQstCwICIke2kuaW5jbHVkZXN9ImA6aS5mb3JtYXQ9PT0icmVnZXgiP2DQndC10LLQsNC20LXRh9C60LAg0L3QuNC30LA6INC80L7RgNCwINC00LAg0L7QtNCz0L7QsNGA0LAg0L3QsCDQv9Cw0YLQtdGA0L3QvtGCICR7aS5wYXR0ZXJufWA6YEludmFsaWQgJHtyW2kuZm9ybWF0XT8/ZS5mb3JtYXR9YH1jYXNlIm5vdF9tdWx0aXBsZV9vZiI6cmV0dXJuYNCT0YDQtdGI0LXQvSDQsdGA0L7RmDog0LzQvtGA0LAg0LTQsCDQsdC40LTQtSDQtNC10LvQuNCyINGB0L4gJHtlLmRpdmlzb3J9YDtjYXNlInVucmVjb2duaXplZF9rZXlzIjpyZXR1cm5gJHtlLmtleXMubGVuZ3RoPjE/ItCd0LXQv9GA0LXQv9C+0LfQvdCw0LXQvdC4INC60LvRg9GH0LXQstC4Ijoi0J3QtdC/0YDQtdC/0L7Qt9C90LDQtdC9INC60LvRg9GHIn06ICR7XyhlLmtleXMsIiwgIil9YDtjYXNlImludmFsaWRfa2V5IjpyZXR1cm5g0JPRgNC10YjQtdC9INC60LvRg9GHINCy0L4gJHtlLm9yaWdpbn1gO2Nhc2UiaW52YWxpZF91bmlvbiI6cmV0dXJuItCT0YDQtdGI0LXQvSDQstC90LXRgSI7Y2FzZSJpbnZhbGlkX2VsZW1lbnQiOnJldHVybmDQk9GA0LXRiNC90LAg0LLRgNC10LTQvdC+0YHRgiDQstC+ICR7ZS5vcmlnaW59YDtkZWZhdWx0OnJldHVybiLQk9GA0LXRiNC10L0g0LLQvdC10YEifX19O2Z1bmN0aW9uIExmKCl7cmV0dXJue2xvY2FsZUVycm9yOkFmKCl9fWNvbnN0IE1mPSgpPT57Y29uc3QgdD17c3RyaW5nOnt1bml0OiJha3NhcmEiLHZlcmI6Im1lbXB1bnlhaSJ9LGZpbGU6e3VuaXQ6ImJhaXQiLHZlcmI6Im1lbXB1bnlhaSJ9LGFycmF5Ont1bml0OiJlbGVtZW4iLHZlcmI6Im1lbXB1bnlhaSJ9LHNldDp7dW5pdDoiZWxlbWVuIix2ZXJiOiJtZW1wdW55YWkifX07ZnVuY3Rpb24gbihlKXtyZXR1cm4gdFtlXT8/bnVsbH1jb25zdCByPXtyZWdleDoiaW5wdXQiLGVtYWlsOiJhbGFtYXQgZS1tZWwiLHVybDoiVVJMIixlbW9qaToiZW1vamkiLHV1aWQ6IlVVSUQiLHV1aWR2NDoiVVVJRHY0Iix1dWlkdjY6IlVVSUR2NiIsbmFub2lkOiJuYW5vaWQiLGd1aWQ6IkdVSUQiLGN1aWQ6ImN1aWQiLGN1aWQyOiJjdWlkMiIsdWxpZDoiVUxJRCIseGlkOiJYSUQiLGtzdWlkOiJLU1VJRCIsZGF0ZXRpbWU6InRhcmlraCBtYXNhIElTTyIsZGF0ZToidGFyaWtoIElTTyIsdGltZToibWFzYSBJU08iLGR1cmF0aW9uOiJ0ZW1wb2ggSVNPIixpcHY0OiJhbGFtYXQgSVB2NCIsaXB2NjoiYWxhbWF0IElQdjYiLGNpZHJ2NDoianVsYXQgSVB2NCIsY2lkcnY2OiJqdWxhdCBJUHY2IixiYXNlNjQ6InN0cmluZyBkaWtvZGthbiBiYXNlNjQiLGJhc2U2NHVybDoic3RyaW5nIGRpa29ka2FuIGJhc2U2NHVybCIsanNvbl9zdHJpbmc6InN0cmluZyBKU09OIixlMTY0OiJub21ib3IgRS4xNjQiLGp3dDoiSldUIix0ZW1wbGF0ZV9saXRlcmFsOiJpbnB1dCJ9LG89e25hbjoiTmFOIixudW1iZXI6Im5vbWJvciJ9O3JldHVybiBlPT57c3dpdGNoKGUuY29kZSl7Y2FzZSJpbnZhbGlkX3R5cGUiOntjb25zdCBpPW9bZS5leHBlY3RlZF0/P2UuZXhwZWN0ZWQsYT13KGUuaW5wdXQpLHM9b1thXT8/YTtyZXR1cm4vXltBLVpdLy50ZXN0KGUuZXhwZWN0ZWQpP2BJbnB1dCB0aWRhayBzYWg6IGRpamFuZ2thIGluc3RhbmNlb2YgJHtlLmV4cGVjdGVkfSwgZGl0ZXJpbWEgJHtzfWA6YElucHV0IHRpZGFrIHNhaDogZGlqYW5na2EgJHtpfSwgZGl0ZXJpbWEgJHtzfWB9Y2FzZSJpbnZhbGlkX3ZhbHVlIjpyZXR1cm4gZS52YWx1ZXMubGVuZ3RoPT09MT9gSW5wdXQgdGlkYWsgc2FoOiBkaWphbmdrYSAke1MoZS52YWx1ZXNbMF0pfWA6YFBpbGloYW4gdGlkYWsgc2FoOiBkaWphbmdrYSBzYWxhaCBzYXR1IGRhcmlwYWRhICR7XyhlLnZhbHVlcywifCIpfWA7Y2FzZSJ0b29fYmlnIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPD0iOiI8IixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2BUZXJsYWx1IGJlc2FyOiBkaWphbmdrYSAke2Uub3JpZ2luPz8ibmlsYWkifSAke2EudmVyYn0gJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0Pz8iZWxlbWVuIn1gOmBUZXJsYWx1IGJlc2FyOiBkaWphbmdrYSAke2Uub3JpZ2luPz8ibmlsYWkifSBhZGFsYWggJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9YH1jYXNlInRvb19zbWFsbCI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ij49IjoiPiIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9gVGVybGFsdSBrZWNpbDogZGlqYW5na2EgJHtlLm9yaWdpbn0gJHthLnZlcmJ9ICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfSAke2EudW5pdH1gOmBUZXJsYWx1IGtlY2lsOiBkaWphbmdrYSAke2Uub3JpZ2lufSBhZGFsYWggJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9YH1jYXNlImludmFsaWRfZm9ybWF0Ijp7Y29uc3QgaT1lO3JldHVybiBpLmZvcm1hdD09PSJzdGFydHNfd2l0aCI/YFN0cmluZyB0aWRhayBzYWg6IG1lc3RpIGJlcm11bGEgZGVuZ2FuICIke2kucHJlZml4fSJgOmkuZm9ybWF0PT09ImVuZHNfd2l0aCI/YFN0cmluZyB0aWRhayBzYWg6IG1lc3RpIGJlcmFraGlyIGRlbmdhbiAiJHtpLnN1ZmZpeH0iYDppLmZvcm1hdD09PSJpbmNsdWRlcyI/YFN0cmluZyB0aWRhayBzYWg6IG1lc3RpIG1lbmdhbmR1bmdpICIke2kuaW5jbHVkZXN9ImA6aS5mb3JtYXQ9PT0icmVnZXgiP2BTdHJpbmcgdGlkYWsgc2FoOiBtZXN0aSBzZXBhZGFuIGRlbmdhbiBjb3JhayAke2kucGF0dGVybn1gOmAke3JbaS5mb3JtYXRdPz9lLmZvcm1hdH0gdGlkYWsgc2FoYH1jYXNlIm5vdF9tdWx0aXBsZV9vZiI6cmV0dXJuYE5vbWJvciB0aWRhayBzYWg6IHBlcmx1IGdhbmRhYW4gJHtlLmRpdmlzb3J9YDtjYXNlInVucmVjb2duaXplZF9rZXlzIjpyZXR1cm5gS3VuY2kgdGlkYWsgZGlrZW5hbGk6ICR7XyhlLmtleXMsIiwgIil9YDtjYXNlImludmFsaWRfa2V5IjpyZXR1cm5gS3VuY2kgdGlkYWsgc2FoIGRhbGFtICR7ZS5vcmlnaW59YDtjYXNlImludmFsaWRfdW5pb24iOnJldHVybiJJbnB1dCB0aWRhayBzYWgiO2Nhc2UiaW52YWxpZF9lbGVtZW50IjpyZXR1cm5gTmlsYWkgdGlkYWsgc2FoIGRhbGFtICR7ZS5vcmlnaW59YDtkZWZhdWx0OnJldHVybiJJbnB1dCB0aWRhayBzYWgifX19O2Z1bmN0aW9uIHFmKCl7cmV0dXJue2xvY2FsZUVycm9yOk1mKCl9fWNvbnN0IEZmPSgpPT57Y29uc3QgdD17c3RyaW5nOnt1bml0OiJ0ZWtlbnMiLHZlcmI6ImhlZWZ0In0sZmlsZTp7dW5pdDoiYnl0ZXMiLHZlcmI6ImhlZWZ0In0sYXJyYXk6e3VuaXQ6ImVsZW1lbnRlbiIsdmVyYjoiaGVlZnQifSxzZXQ6e3VuaXQ6ImVsZW1lbnRlbiIsdmVyYjoiaGVlZnQifX07ZnVuY3Rpb24gbihlKXtyZXR1cm4gdFtlXT8/bnVsbH1jb25zdCByPXtyZWdleDoiaW52b2VyIixlbWFpbDoiZW1haWxhZHJlcyIsdXJsOiJVUkwiLGVtb2ppOiJlbW9qaSIsdXVpZDoiVVVJRCIsdXVpZHY0OiJVVUlEdjQiLHV1aWR2NjoiVVVJRHY2IixuYW5vaWQ6Im5hbm9pZCIsZ3VpZDoiR1VJRCIsY3VpZDoiY3VpZCIsY3VpZDI6ImN1aWQyIix1bGlkOiJVTElEIix4aWQ6IlhJRCIsa3N1aWQ6IktTVUlEIixkYXRldGltZToiSVNPIGRhdHVtIGVuIHRpamQiLGRhdGU6IklTTyBkYXR1bSIsdGltZToiSVNPIHRpamQiLGR1cmF0aW9uOiJJU08gZHV1ciIsaXB2NDoiSVB2NC1hZHJlcyIsaXB2NjoiSVB2Ni1hZHJlcyIsY2lkcnY0OiJJUHY0LWJlcmVpayIsY2lkcnY2OiJJUHY2LWJlcmVpayIsYmFzZTY0OiJiYXNlNjQtZ2Vjb2RlZXJkZSB0ZWtzdCIsYmFzZTY0dXJsOiJiYXNlNjQgVVJMLWdlY29kZWVyZGUgdGVrc3QiLGpzb25fc3RyaW5nOiJKU09OIHN0cmluZyIsZTE2NDoiRS4xNjQtbnVtbWVyIixqd3Q6IkpXVCIsdGVtcGxhdGVfbGl0ZXJhbDoiaW52b2VyIn0sbz17bmFuOiJOYU4iLG51bWJlcjoiZ2V0YWwifTtyZXR1cm4gZT0+e3N3aXRjaChlLmNvZGUpe2Nhc2UiaW52YWxpZF90eXBlIjp7Y29uc3QgaT1vW2UuZXhwZWN0ZWRdPz9lLmV4cGVjdGVkLGE9dyhlLmlucHV0KSxzPW9bYV0/P2E7cmV0dXJuL15bQS1aXS8udGVzdChlLmV4cGVjdGVkKT9gT25nZWxkaWdlIGludm9lcjogdmVyd2FjaHQgaW5zdGFuY2VvZiAke2UuZXhwZWN0ZWR9LCBvbnR2aW5nICR7c31gOmBPbmdlbGRpZ2UgaW52b2VyOiB2ZXJ3YWNodCAke2l9LCBvbnR2aW5nICR7c31gfWNhc2UiaW52YWxpZF92YWx1ZSI6cmV0dXJuIGUudmFsdWVzLmxlbmd0aD09PTE/YE9uZ2VsZGlnZSBpbnZvZXI6IHZlcndhY2h0ICR7UyhlLnZhbHVlc1swXSl9YDpgT25nZWxkaWdlIG9wdGllOiB2ZXJ3YWNodCDDqcOpbiB2YW4gJHtfKGUudmFsdWVzLCJ8Iil9YDtjYXNlInRvb19iaWciOntjb25zdCBpPWUuaW5jbHVzaXZlPyI8PSI6IjwiLGE9bihlLm9yaWdpbikscz1lLm9yaWdpbj09PSJkYXRlIj8ibGFhdCI6ZS5vcmlnaW49PT0ic3RyaW5nIj8ibGFuZyI6Imdyb290IjtyZXR1cm4gYT9gVGUgJHtzfTogdmVyd2FjaHQgZGF0ICR7ZS5vcmlnaW4/PyJ3YWFyZGUifSAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX0gJHthLnVuaXQ/PyJlbGVtZW50ZW4ifSAke2EudmVyYn1gOmBUZSAke3N9OiB2ZXJ3YWNodCBkYXQgJHtlLm9yaWdpbj8/IndhYXJkZSJ9ICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfSBpc2B9Y2FzZSJ0b29fc21hbGwiOntjb25zdCBpPWUuaW5jbHVzaXZlPyI+PSI6Ij4iLGE9bihlLm9yaWdpbikscz1lLm9yaWdpbj09PSJkYXRlIj8idnJvZWciOmUub3JpZ2luPT09InN0cmluZyI/ImtvcnQiOiJrbGVpbiI7cmV0dXJuIGE/YFRlICR7c306IHZlcndhY2h0IGRhdCAke2Uub3JpZ2lufSAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX0gJHthLnVuaXR9ICR7YS52ZXJifWA6YFRlICR7c306IHZlcndhY2h0IGRhdCAke2Uub3JpZ2lufSAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX0gaXNgfWNhc2UiaW52YWxpZF9mb3JtYXQiOntjb25zdCBpPWU7cmV0dXJuIGkuZm9ybWF0PT09InN0YXJ0c193aXRoIj9gT25nZWxkaWdlIHRla3N0OiBtb2V0IG1ldCAiJHtpLnByZWZpeH0iIGJlZ2lubmVuYDppLmZvcm1hdD09PSJlbmRzX3dpdGgiP2BPbmdlbGRpZ2UgdGVrc3Q6IG1vZXQgb3AgIiR7aS5zdWZmaXh9IiBlaW5kaWdlbmA6aS5mb3JtYXQ9PT0iaW5jbHVkZXMiP2BPbmdlbGRpZ2UgdGVrc3Q6IG1vZXQgIiR7aS5pbmNsdWRlc30iIGJldmF0dGVuYDppLmZvcm1hdD09PSJyZWdleCI/YE9uZ2VsZGlnZSB0ZWtzdDogbW9ldCBvdmVyZWVua29tZW4gbWV0IHBhdHJvb24gJHtpLnBhdHRlcm59YDpgT25nZWxkaWc6ICR7cltpLmZvcm1hdF0/P2UuZm9ybWF0fWB9Y2FzZSJub3RfbXVsdGlwbGVfb2YiOnJldHVybmBPbmdlbGRpZyBnZXRhbDogbW9ldCBlZW4gdmVlbHZvdWQgdmFuICR7ZS5kaXZpc29yfSB6aWpuYDtjYXNlInVucmVjb2duaXplZF9rZXlzIjpyZXR1cm5gT25iZWtlbmRlIGtleSR7ZS5rZXlzLmxlbmd0aD4xPyJzIjoiIn06ICR7XyhlLmtleXMsIiwgIil9YDtjYXNlImludmFsaWRfa2V5IjpyZXR1cm5gT25nZWxkaWdlIGtleSBpbiAke2Uub3JpZ2lufWA7Y2FzZSJpbnZhbGlkX3VuaW9uIjpyZXR1cm4iT25nZWxkaWdlIGludm9lciI7Y2FzZSJpbnZhbGlkX2VsZW1lbnQiOnJldHVybmBPbmdlbGRpZ2Ugd2FhcmRlIGluICR7ZS5vcmlnaW59YDtkZWZhdWx0OnJldHVybiJPbmdlbGRpZ2UgaW52b2VyIn19fTtmdW5jdGlvbiBKZigpe3JldHVybntsb2NhbGVFcnJvcjpGZigpfX1jb25zdCBIZj0oKT0+e2NvbnN0IHQ9e3N0cmluZzp7dW5pdDoidGVnbiIsdmVyYjoiw6UgaGEifSxmaWxlOnt1bml0OiJieXRlcyIsdmVyYjoiw6UgaGEifSxhcnJheTp7dW5pdDoiZWxlbWVudGVyIix2ZXJiOiLDpSBpbm5laG9sZGUifSxzZXQ6e3VuaXQ6ImVsZW1lbnRlciIsdmVyYjoiw6UgaW5uZWhvbGRlIn19O2Z1bmN0aW9uIG4oZSl7cmV0dXJuIHRbZV0/P251bGx9Y29uc3Qgcj17cmVnZXg6ImlucHV0IixlbWFpbDoiZS1wb3N0YWRyZXNzZSIsdXJsOiJVUkwiLGVtb2ppOiJlbW9qaSIsdXVpZDoiVVVJRCIsdXVpZHY0OiJVVUlEdjQiLHV1aWR2NjoiVVVJRHY2IixuYW5vaWQ6Im5hbm9pZCIsZ3VpZDoiR1VJRCIsY3VpZDoiY3VpZCIsY3VpZDI6ImN1aWQyIix1bGlkOiJVTElEIix4aWQ6IlhJRCIsa3N1aWQ6IktTVUlEIixkYXRldGltZToiSVNPIGRhdG8tIG9nIGtsb2trZXNsZXR0IixkYXRlOiJJU08tZGF0byIsdGltZToiSVNPLWtsb2trZXNsZXR0IixkdXJhdGlvbjoiSVNPLXZhcmlnaGV0IixpcHY0OiJJUHY0LW9tcsOlZGUiLGlwdjY6IklQdjYtb21yw6VkZSIsY2lkcnY0OiJJUHY0LXNwZWt0ZXIiLGNpZHJ2NjoiSVB2Ni1zcGVrdGVyIixiYXNlNjQ6ImJhc2U2NC1lbmtvZGV0IHN0cmVuZyIsYmFzZTY0dXJsOiJiYXNlNjR1cmwtZW5rb2RldCBzdHJlbmciLGpzb25fc3RyaW5nOiJKU09OLXN0cmVuZyIsZTE2NDoiRS4xNjQtbnVtbWVyIixqd3Q6IkpXVCIsdGVtcGxhdGVfbGl0ZXJhbDoiaW5wdXQifSxvPXtuYW46Ik5hTiIsbnVtYmVyOiJ0YWxsIixhcnJheToibGlzdGUifTtyZXR1cm4gZT0+e3N3aXRjaChlLmNvZGUpe2Nhc2UiaW52YWxpZF90eXBlIjp7Y29uc3QgaT1vW2UuZXhwZWN0ZWRdPz9lLmV4cGVjdGVkLGE9dyhlLmlucHV0KSxzPW9bYV0/P2E7cmV0dXJuL15bQS1aXS8udGVzdChlLmV4cGVjdGVkKT9gVWd5bGRpZyBpbnB1dDogZm9ydmVudGV0IGluc3RhbmNlb2YgJHtlLmV4cGVjdGVkfSwgZmlrayAke3N9YDpgVWd5bGRpZyBpbnB1dDogZm9ydmVudGV0ICR7aX0sIGZpa2sgJHtzfWB9Y2FzZSJpbnZhbGlkX3ZhbHVlIjpyZXR1cm4gZS52YWx1ZXMubGVuZ3RoPT09MT9gVWd5bGRpZyB2ZXJkaTogZm9ydmVudGV0ICR7UyhlLnZhbHVlc1swXSl9YDpgVWd5bGRpZyB2YWxnOiBmb3J2ZW50ZXQgZW4gYXYgJHtfKGUudmFsdWVzLCJ8Iil9YDtjYXNlInRvb19iaWciOntjb25zdCBpPWUuaW5jbHVzaXZlPyI8PSI6IjwiLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YEZvciBzdG9yKHQpOiBmb3J2ZW50ZXQgJHtlLm9yaWdpbj8/InZhbHVlIn0gdGlsIMOlIGhhICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfSAke2EudW5pdD8/ImVsZW1lbnRlciJ9YDpgRm9yIHN0b3IodCk6IGZvcnZlbnRldCAke2Uub3JpZ2luPz8idmFsdWUifSB0aWwgw6UgaGEgJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9YH1jYXNlInRvb19zbWFsbCI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ij49IjoiPiIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9gRm9yIGxpdGUobik6IGZvcnZlbnRldCAke2Uub3JpZ2lufSB0aWwgw6UgaGEgJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0fWA6YEZvciBsaXRlKG4pOiBmb3J2ZW50ZXQgJHtlLm9yaWdpbn0gdGlsIMOlIGhhICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfWB9Y2FzZSJpbnZhbGlkX2Zvcm1hdCI6e2NvbnN0IGk9ZTtyZXR1cm4gaS5mb3JtYXQ9PT0ic3RhcnRzX3dpdGgiP2BVZ3lsZGlnIHN0cmVuZzogbcOlIHN0YXJ0ZSBtZWQgIiR7aS5wcmVmaXh9ImA6aS5mb3JtYXQ9PT0iZW5kc193aXRoIj9gVWd5bGRpZyBzdHJlbmc6IG3DpSBlbmRlIG1lZCAiJHtpLnN1ZmZpeH0iYDppLmZvcm1hdD09PSJpbmNsdWRlcyI/YFVneWxkaWcgc3RyZW5nOiBtw6UgaW5uZWhvbGRlICIke2kuaW5jbHVkZXN9ImA6aS5mb3JtYXQ9PT0icmVnZXgiP2BVZ3lsZGlnIHN0cmVuZzogbcOlIG1hdGNoZSBtw7huc3RlcmV0ICR7aS5wYXR0ZXJufWA6YFVneWxkaWcgJHtyW2kuZm9ybWF0XT8/ZS5mb3JtYXR9YH1jYXNlIm5vdF9tdWx0aXBsZV9vZiI6cmV0dXJuYFVneWxkaWcgdGFsbDogbcOlIHbDpnJlIGV0IG11bHRpcGx1bSBhdiAke2UuZGl2aXNvcn1gO2Nhc2UidW5yZWNvZ25pemVkX2tleXMiOnJldHVybmAke2Uua2V5cy5sZW5ndGg+MT8iVWtqZW50ZSBuw7hrbGVyIjoiVWtqZW50IG7DuGtrZWwifTogJHtfKGUua2V5cywiLCAiKX1gO2Nhc2UiaW52YWxpZF9rZXkiOnJldHVybmBVZ3lsZGlnIG7DuGtrZWwgaSAke2Uub3JpZ2lufWA7Y2FzZSJpbnZhbGlkX3VuaW9uIjpyZXR1cm4iVWd5bGRpZyBpbnB1dCI7Y2FzZSJpbnZhbGlkX2VsZW1lbnQiOnJldHVybmBVZ3lsZGlnIHZlcmRpIGkgJHtlLm9yaWdpbn1gO2RlZmF1bHQ6cmV0dXJuIlVneWxkaWcgaW5wdXQifX19O2Z1bmN0aW9uIFdmKCl7cmV0dXJue2xvY2FsZUVycm9yOkhmKCl9fWNvbnN0IEJmPSgpPT57Y29uc3QgdD17c3RyaW5nOnt1bml0OiJoYXJmIix2ZXJiOiJvbG1hbMSxZMSxciJ9LGZpbGU6e3VuaXQ6ImJheXQiLHZlcmI6Im9sbWFsxLFkxLFyIn0sYXJyYXk6e3VuaXQ6InVuc3VyIix2ZXJiOiJvbG1hbMSxZMSxciJ9LHNldDp7dW5pdDoidW5zdXIiLHZlcmI6Im9sbWFsxLFkxLFyIn19O2Z1bmN0aW9uIG4oZSl7cmV0dXJuIHRbZV0/P251bGx9Y29uc3Qgcj17cmVnZXg6ImdpcmVuIixlbWFpbDoiZXBvc3RhZ8OiaCIsdXJsOiJVUkwiLGVtb2ppOiJlbW9qaSIsdXVpZDoiVVVJRCIsdXVpZHY0OiJVVUlEdjQiLHV1aWR2NjoiVVVJRHY2IixuYW5vaWQ6Im5hbm9pZCIsZ3VpZDoiR1VJRCIsY3VpZDoiY3VpZCIsY3VpZDI6ImN1aWQyIix1bGlkOiJVTElEIix4aWQ6IlhJRCIsa3N1aWQ6IktTVUlEIixkYXRldGltZToiSVNPIGhlbmfDom3EsSIsZGF0ZToiSVNPIHRhcmloaSIsdGltZToiSVNPIHphbWFuxLEiLGR1cmF0aW9uOiJJU08gbcO8ZGRldGkiLGlwdjQ6IklQdjQgbmnFn8OibsSxIixpcHY2OiJJUHY2IG5pxZ/Dom7EsSIsY2lkcnY0OiJJUHY0IG1lbnppbGkiLGNpZHJ2NjoiSVB2NiBtZW56aWxpIixiYXNlNjQ6ImJhc2U2NC3Fn2lmcmVsaSBtZXRpbiIsYmFzZTY0dXJsOiJiYXNlNjR1cmwtxZ9pZnJlbGkgbWV0aW4iLGpzb25fc3RyaW5nOiJKU09OIG1ldGluIixlMTY0OiJFLjE2NCBzYXnEsXPEsSIsand0OiJKV1QiLHRlbXBsYXRlX2xpdGVyYWw6ImdpcmVuIn0sbz17bmFuOiJOYU4iLG51bWJlcjoibnVtYXJhIixhcnJheToic2FmIixudWxsOiJnYXliIn07cmV0dXJuIGU9Pntzd2l0Y2goZS5jb2RlKXtjYXNlImludmFsaWRfdHlwZSI6e2NvbnN0IGk9b1tlLmV4cGVjdGVkXT8/ZS5leHBlY3RlZCxhPXcoZS5pbnB1dCkscz1vW2FdPz9hO3JldHVybi9eW0EtWl0vLnRlc3QoZS5leHBlY3RlZCk/YEbDonNpdCBnaXJlbjogdW11bGFuIGluc3RhbmNlb2YgJHtlLmV4cGVjdGVkfSwgYWzEsW5hbiAke3N9YDpgRsOic2l0IGdpcmVuOiB1bXVsYW4gJHtpfSwgYWzEsW5hbiAke3N9YH1jYXNlImludmFsaWRfdmFsdWUiOnJldHVybiBlLnZhbHVlcy5sZW5ndGg9PT0xP2BGw6JzaXQgZ2lyZW46IHVtdWxhbiAke1MoZS52YWx1ZXNbMF0pfWA6YEbDonNpdCB0ZXJjaWg6IG3Du3RlYmVybGVyICR7XyhlLnZhbHVlcywifCIpfWA7Y2FzZSJ0b29fYmlnIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPD0iOiI8IixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2BGYXpsYSBiw7x5w7xrOiAke2Uub3JpZ2luPz8idmFsdWUifSwgJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0Pz8iZWxlbWVudHMifSBzYWhpcCBvbG1hbMSxeWTEsS5gOmBGYXpsYSBiw7x5w7xrOiAke2Uub3JpZ2luPz8idmFsdWUifSwgJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9IG9sbWFsxLF5ZMSxLmB9Y2FzZSJ0b29fc21hbGwiOntjb25zdCBpPWUuaW5jbHVzaXZlPyI+PSI6Ij4iLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YEZhemxhIGvDvMOnw7xrOiAke2Uub3JpZ2lufSwgJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0fSBzYWhpcCBvbG1hbMSxeWTEsS5gOmBGYXpsYSBrw7zDp8O8azogJHtlLm9yaWdpbn0sICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfSBvbG1hbMSxeWTEsS5gfWNhc2UiaW52YWxpZF9mb3JtYXQiOntjb25zdCBpPWU7cmV0dXJuIGkuZm9ybWF0PT09InN0YXJ0c193aXRoIj9gRsOic2l0IG1ldGluOiAiJHtpLnByZWZpeH0iIGlsZSBiYcWfbGFtYWzEsS5gOmkuZm9ybWF0PT09ImVuZHNfd2l0aCI/YEbDonNpdCBtZXRpbjogIiR7aS5zdWZmaXh9IiBpbGUgYml0bWVsaS5gOmkuZm9ybWF0PT09ImluY2x1ZGVzIj9gRsOic2l0IG1ldGluOiAiJHtpLmluY2x1ZGVzfSIgaWh0aXbDoiBldG1lbGkuYDppLmZvcm1hdD09PSJyZWdleCI/YEbDonNpdCBtZXRpbjogJHtpLnBhdHRlcm59IG5ha8WfxLFuYSB1eW1hbMSxLmA6YEbDonNpdCAke3JbaS5mb3JtYXRdPz9lLmZvcm1hdH1gfWNhc2Uibm90X211bHRpcGxlX29mIjpyZXR1cm5gRsOic2l0IHNhecSxOiAke2UuZGl2aXNvcn0ga2F0xLEgb2xtYWzEsXlkxLEuYDtjYXNlInVucmVjb2duaXplZF9rZXlzIjpyZXR1cm5gVGFuxLFubWF5YW4gYW5haHRhciAke2Uua2V5cy5sZW5ndGg+MT8icyI6IiJ9OiAke18oZS5rZXlzLCIsICIpfWA7Y2FzZSJpbnZhbGlkX2tleSI6cmV0dXJuYCR7ZS5vcmlnaW59IGnDp2luIHRhbsSxbm1heWFuIGFuYWh0YXIgdmFyLmA7Y2FzZSJpbnZhbGlkX3VuaW9uIjpyZXR1cm4iR2lyZW4gdGFuxLFuYW1hZMSxLiI7Y2FzZSJpbnZhbGlkX2VsZW1lbnQiOnJldHVybmAke2Uub3JpZ2lufSBpw6dpbiB0YW7EsW5tYXlhbiBrxLF5bWV0IHZhci5gO2RlZmF1bHQ6cmV0dXJuIkvEsXltZXQgdGFuxLFuYW1hZMSxLiJ9fX07ZnVuY3Rpb24gVmYoKXtyZXR1cm57bG9jYWxlRXJyb3I6QmYoKX19Y29uc3QgS2Y9KCk9Pntjb25zdCB0PXtzdHJpbmc6e3VuaXQ6Itiq2YjaqdmKIix2ZXJiOiLZiNmE2LHZiiJ9LGZpbGU6e3VuaXQ6Itio2KfbjNm82LMiLHZlcmI6ItmI2YTYsdmKIn0sYXJyYXk6e3VuaXQ6Itiq2YjaqdmKIix2ZXJiOiLZiNmE2LHZiiJ9LHNldDp7dW5pdDoi2KrZiNqp2YoiLHZlcmI6ItmI2YTYsdmKIn19O2Z1bmN0aW9uIG4oZSl7cmV0dXJuIHRbZV0/P251bGx9Y29uc3Qgcj17cmVnZXg6ItmI2LHZiNiv2YoiLGVtYWlsOiLYqNix24zamtmG2KfZhNuM2qkiLHVybDoi24zZiCDYotixINin2YQiLGVtb2ppOiLYp9uM2YXZiNis2YoiLHV1aWQ6IlVVSUQiLHV1aWR2NDoiVVVJRHY0Iix1dWlkdjY6IlVVSUR2NiIsbmFub2lkOiJuYW5vaWQiLGd1aWQ6IkdVSUQiLGN1aWQ6ImN1aWQiLGN1aWQyOiJjdWlkMiIsdWxpZDoiVUxJRCIseGlkOiJYSUQiLGtzdWlkOiJLU1VJRCIsZGF0ZXRpbWU6ItmG24zZvNmHINin2Ygg2YjYrtiqIixkYXRlOiLZhtuQ2bzZhyIsdGltZToi2YjYrtiqIixkdXJhdGlvbjoi2YXZiNiv2YciLGlwdjQ6ItivIElQdjQg2b7YqtmHIixpcHY2OiLYryBJUHY2INm+2KrZhyIsY2lkcnY0OiLYryBJUHY0INiz2KfYrdmHIixjaWRydjY6ItivIElQdjYg2LPYp9it2YciLGJhc2U2NDoiYmFzZTY0LWVuY29kZWQg2YXYqtmGIixiYXNlNjR1cmw6ImJhc2U2NHVybC1lbmNvZGVkINmF2KrZhiIsanNvbl9zdHJpbmc6IkpTT04g2YXYqtmGIixlMTY0OiLYryBFLjE2NCDYtNmF25DYsdmHIixqd3Q6IkpXVCIsdGVtcGxhdGVfbGl0ZXJhbDoi2YjYsdmI2K/ZiiJ9LG89e25hbjoiTmFOIixudW1iZXI6Iti52K/YryIsYXJyYXk6Itin2LHbkCJ9O3JldHVybiBlPT57c3dpdGNoKGUuY29kZSl7Y2FzZSJpbnZhbGlkX3R5cGUiOntjb25zdCBpPW9bZS5leHBlY3RlZF0/P2UuZXhwZWN0ZWQsYT13KGUuaW5wdXQpLHM9b1thXT8/YTtyZXR1cm4vXltBLVpdLy50ZXN0KGUuZXhwZWN0ZWQpP2DZhtin2LPZhSDZiNix2YjYr9mKOiDYqNin24zYryBpbnN0YW5jZW9mICR7ZS5leHBlY3RlZH0g2YjYp9uMLCDZhdqr2LEgJHtzfSDYqtix2YTYp9iz2Ycg2LTZiGA6YNmG2KfYs9mFINmI2LHZiNiv2Yo6INio2KfbjNivICR7aX0g2YjYp9uMLCDZhdqr2LEgJHtzfSDYqtix2YTYp9iz2Ycg2LTZiGB9Y2FzZSJpbnZhbGlkX3ZhbHVlIjpyZXR1cm4gZS52YWx1ZXMubGVuZ3RoPT09MT9g2YbYp9iz2YUg2YjYsdmI2K/Zijog2KjYp9uM2K8gJHtTKGUudmFsdWVzWzBdKX0g2YjYp9uMYDpg2YbYp9iz2YUg2KfZhtiq2K7Yp9ioOiDYqNin24zYryDbjNmIINmE2YcgJHtfKGUudmFsdWVzLCJ8Iil9INqF2K7ZhyDZiNin24xgO2Nhc2UidG9vX2JpZyI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ijw9IjoiPCIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9g2onbjNixINmE2YjbjDogJHtlLm9yaWdpbj8/Itin2LHYstqa2KoifSDYqNin24zYryAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX0gJHthLnVuaXQ/PyLYudmG2LXYsdmI2YbZhyJ9INmI2YTYsdmKYDpg2onbjNixINmE2YjbjDogJHtlLm9yaWdpbj8/Itin2LHYstqa2KoifSDYqNin24zYryAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX0g2YjZimB9Y2FzZSJ0b29fc21hbGwiOntjb25zdCBpPWUuaW5jbHVzaXZlPyI+PSI6Ij4iLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YNqJ24zYsSDaqdmI2obZhtuMOiAke2Uub3JpZ2lufSDYqNin24zYryAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX0gJHthLnVuaXR9INmI2YTYsdmKYDpg2onbjNixINqp2YjahtmG24w6ICR7ZS5vcmlnaW59INio2KfbjNivICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfSDZiNmKYH1jYXNlImludmFsaWRfZm9ybWF0Ijp7Y29uc3QgaT1lO3JldHVybiBpLmZvcm1hdD09PSJzdGFydHNfd2l0aCI/YNmG2KfYs9mFINmF2KrZhjog2KjYp9uM2K8g2K8gIiR7aS5wcmVmaXh9IiDYs9ix2Ycg2b7bjNmEINi02YpgOmkuZm9ybWF0PT09ImVuZHNfd2l0aCI/YNmG2KfYs9mFINmF2KrZhjog2KjYp9uM2K8g2K8gIiR7aS5zdWZmaXh9IiDYs9ix2Ycg2b7Yp9uMINiq2Ycg2YjYsdiz2YraltmKYDppLmZvcm1hdD09PSJpbmNsdWRlcyI/YNmG2KfYs9mFINmF2KrZhjog2KjYp9uM2K8gIiR7aS5pbmNsdWRlc30iINmI2YTYsdmKYDppLmZvcm1hdD09PSJyZWdleCI/YNmG2KfYs9mFINmF2KrZhjog2KjYp9uM2K8g2K8gJHtpLnBhdHRlcm59INiz2LHZhyDZhdi32KfYqNmC2Kog2YjZhNix2YpgOmAke3JbaS5mb3JtYXRdPz9lLmZvcm1hdH0g2YbYp9iz2YUg2K/bjGB9Y2FzZSJub3RfbXVsdGlwbGVfb2YiOnJldHVybmDZhtin2LPZhSDYudiv2K86INio2KfbjNivINivICR7ZS5kaXZpc29yfSDZhdi22LHYqCDZiNmKYDtjYXNlInVucmVjb2duaXplZF9rZXlzIjpyZXR1cm5g2YbYp9iz2YUgJHtlLmtleXMubGVuZ3RoPjE/Itqp2YTbjNqJ2YjZhtmHIjoi2qnZhNuM2okifTogJHtfKGUua2V5cywiLCAiKX1gO2Nhc2UiaW52YWxpZF9rZXkiOnJldHVybmDZhtin2LPZhSDaqdmE24zaiSDZvtmHICR7ZS5vcmlnaW59INqp25BgO2Nhc2UiaW52YWxpZF91bmlvbiI6cmV0dXJuItmG2KfYs9mF2Ycg2YjYsdmI2K/ZiiI7Y2FzZSJpbnZhbGlkX2VsZW1lbnQiOnJldHVybmDZhtin2LPZhSDYudmG2LXYsSDZvtmHICR7ZS5vcmlnaW59INqp25BgO2RlZmF1bHQ6cmV0dXJuItmG2KfYs9mF2Ycg2YjYsdmI2K/ZiiJ9fX07ZnVuY3Rpb24gR2YoKXtyZXR1cm57bG9jYWxlRXJyb3I6S2YoKX19Y29uc3QgWGY9KCk9Pntjb25zdCB0PXtzdHJpbmc6e3VuaXQ6InpuYWvDs3ciLHZlcmI6Im1pZcSHIn0sZmlsZTp7dW5pdDoiYmFqdMOzdyIsdmVyYjoibWllxIcifSxhcnJheTp7dW5pdDoiZWxlbWVudMOzdyIsdmVyYjoibWllxIcifSxzZXQ6e3VuaXQ6ImVsZW1lbnTDs3ciLHZlcmI6Im1pZcSHIn19O2Z1bmN0aW9uIG4oZSl7cmV0dXJuIHRbZV0/P251bGx9Y29uc3Qgcj17cmVnZXg6Ind5cmHFvGVuaWUiLGVtYWlsOiJhZHJlcyBlbWFpbCIsdXJsOiJVUkwiLGVtb2ppOiJlbW9qaSIsdXVpZDoiVVVJRCIsdXVpZHY0OiJVVUlEdjQiLHV1aWR2NjoiVVVJRHY2IixuYW5vaWQ6Im5hbm9pZCIsZ3VpZDoiR1VJRCIsY3VpZDoiY3VpZCIsY3VpZDI6ImN1aWQyIix1bGlkOiJVTElEIix4aWQ6IlhJRCIsa3N1aWQ6IktTVUlEIixkYXRldGltZToiZGF0YSBpIGdvZHppbmEgdyBmb3JtYWNpZSBJU08iLGRhdGU6ImRhdGEgdyBmb3JtYWNpZSBJU08iLHRpbWU6ImdvZHppbmEgdyBmb3JtYWNpZSBJU08iLGR1cmF0aW9uOiJjemFzIHRyd2FuaWEgSVNPIixpcHY0OiJhZHJlcyBJUHY0IixpcHY2OiJhZHJlcyBJUHY2IixjaWRydjQ6Inpha3JlcyBJUHY0IixjaWRydjY6Inpha3JlcyBJUHY2IixiYXNlNjQ6ImNpxIVnIHpuYWvDs3cgemFrb2Rvd2FueSB3IGZvcm1hY2llIGJhc2U2NCIsYmFzZTY0dXJsOiJjacSFZyB6bmFrw7N3IHpha29kb3dhbnkgdyBmb3JtYWNpZSBiYXNlNjR1cmwiLGpzb25fc3RyaW5nOiJjacSFZyB6bmFrw7N3IHcgZm9ybWFjaWUgSlNPTiIsZTE2NDoibGljemJhIEUuMTY0Iixqd3Q6IkpXVCIsdGVtcGxhdGVfbGl0ZXJhbDoid2VqxZtjaWUifSxvPXtuYW46Ik5hTiIsbnVtYmVyOiJsaWN6YmEiLGFycmF5OiJ0YWJsaWNhIn07cmV0dXJuIGU9Pntzd2l0Y2goZS5jb2RlKXtjYXNlImludmFsaWRfdHlwZSI6e2NvbnN0IGk9b1tlLmV4cGVjdGVkXT8/ZS5leHBlY3RlZCxhPXcoZS5pbnB1dCkscz1vW2FdPz9hO3JldHVybi9eW0EtWl0vLnRlc3QoZS5leHBlY3RlZCk/YE5pZXByYXdpZMWCb3dlIGRhbmUgd2VqxZtjaW93ZTogb2N6ZWtpd2FubyBpbnN0YW5jZW9mICR7ZS5leHBlY3RlZH0sIG90cnp5bWFubyAke3N9YDpgTmllcHJhd2lkxYJvd2UgZGFuZSB3ZWrFm2Npb3dlOiBvY3pla2l3YW5vICR7aX0sIG90cnp5bWFubyAke3N9YH1jYXNlImludmFsaWRfdmFsdWUiOnJldHVybiBlLnZhbHVlcy5sZW5ndGg9PT0xP2BOaWVwcmF3aWTFgm93ZSBkYW5lIHdlasWbY2lvd2U6IG9jemVraXdhbm8gJHtTKGUudmFsdWVzWzBdKX1gOmBOaWVwcmF3aWTFgm93YSBvcGNqYTogb2N6ZWtpd2FubyBqZWRuZWogeiB3YXJ0b8WbY2kgJHtfKGUudmFsdWVzLCJ8Iil9YDtjYXNlInRvb19iaWciOntjb25zdCBpPWUuaW5jbHVzaXZlPyI8PSI6IjwiLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YFphIGR1xbxhIHdhcnRvxZvEhzogb2N6ZWtpd2FubywgxbxlICR7ZS5vcmlnaW4/PyJ3YXJ0b8WbxIcifSBixJlkemllIG1pZcSHICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfSAke2EudW5pdD8/ImVsZW1lbnTDs3cifWA6YFpieXQgZHXFvCh5L2EvZSk6IG9jemVraXdhbm8sIMW8ZSAke2Uub3JpZ2luPz8id2FydG/Fm8SHIn0gYsSZZHppZSB3eW5vc2nEhyAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX1gfWNhc2UidG9vX3NtYWxsIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPj0iOiI+IixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2BaYSBtYcWCYSB3YXJ0b8WbxIc6IG9jemVraXdhbm8sIMW8ZSAke2Uub3JpZ2luPz8id2FydG/Fm8SHIn0gYsSZZHppZSBtaWXEhyAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX0gJHthLnVuaXQ/PyJlbGVtZW50w7N3In1gOmBaYnl0IG1hxYIoeS9hL2UpOiBvY3pla2l3YW5vLCDFvGUgJHtlLm9yaWdpbj8/IndhcnRvxZvEhyJ9IGLEmWR6aWUgd3lub3NpxIcgJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9YH1jYXNlImludmFsaWRfZm9ybWF0Ijp7Y29uc3QgaT1lO3JldHVybiBpLmZvcm1hdD09PSJzdGFydHNfd2l0aCI/YE5pZXByYXdpZMWCb3d5IGNpxIVnIHpuYWvDs3c6IG11c2kgemFjenluYcSHIHNpxJkgb2QgIiR7aS5wcmVmaXh9ImA6aS5mb3JtYXQ9PT0iZW5kc193aXRoIj9gTmllcHJhd2lkxYJvd3kgY2nEhWcgem5ha8OzdzogbXVzaSBrb8WEY3p5xIcgc2nEmSBuYSAiJHtpLnN1ZmZpeH0iYDppLmZvcm1hdD09PSJpbmNsdWRlcyI/YE5pZXByYXdpZMWCb3d5IGNpxIVnIHpuYWvDs3c6IG11c2kgemF3aWVyYcSHICIke2kuaW5jbHVkZXN9ImA6aS5mb3JtYXQ9PT0icmVnZXgiP2BOaWVwcmF3aWTFgm93eSBjacSFZyB6bmFrw7N3OiBtdXNpIG9kcG93aWFkYcSHIHd6b3Jjb3dpICR7aS5wYXR0ZXJufWA6YE5pZXByYXdpZMWCb3coeS9hL2UpICR7cltpLmZvcm1hdF0/P2UuZm9ybWF0fWB9Y2FzZSJub3RfbXVsdGlwbGVfb2YiOnJldHVybmBOaWVwcmF3aWTFgm93YSBsaWN6YmE6IG11c2kgYnnEhyB3aWVsb2tyb3Rub8WbY2nEhSAke2UuZGl2aXNvcn1gO2Nhc2UidW5yZWNvZ25pemVkX2tleXMiOnJldHVybmBOaWVyb3pwb3puYW5lIGtsdWN6ZSR7ZS5rZXlzLmxlbmd0aD4xPyJzIjoiIn06ICR7XyhlLmtleXMsIiwgIil9YDtjYXNlImludmFsaWRfa2V5IjpyZXR1cm5gTmllcHJhd2lkxYJvd3kga2x1Y3ogdyAke2Uub3JpZ2lufWA7Y2FzZSJpbnZhbGlkX3VuaW9uIjpyZXR1cm4iTmllcHJhd2lkxYJvd2UgZGFuZSB3ZWrFm2Npb3dlIjtjYXNlImludmFsaWRfZWxlbWVudCI6cmV0dXJuYE5pZXByYXdpZMWCb3dhIHdhcnRvxZvEhyB3ICR7ZS5vcmlnaW59YDtkZWZhdWx0OnJldHVybiJOaWVwcmF3aWTFgm93ZSBkYW5lIHdlasWbY2lvd2UifX19O2Z1bmN0aW9uIFlmKCl7cmV0dXJue2xvY2FsZUVycm9yOlhmKCl9fWNvbnN0IFFmPSgpPT57Y29uc3QgdD17c3RyaW5nOnt1bml0OiJjYXJhY3RlcmVzIix2ZXJiOiJ0ZXIifSxmaWxlOnt1bml0OiJieXRlcyIsdmVyYjoidGVyIn0sYXJyYXk6e3VuaXQ6Iml0ZW5zIix2ZXJiOiJ0ZXIifSxzZXQ6e3VuaXQ6Iml0ZW5zIix2ZXJiOiJ0ZXIifX07ZnVuY3Rpb24gbihlKXtyZXR1cm4gdFtlXT8/bnVsbH1jb25zdCByPXtyZWdleDoicGFkcsOjbyIsZW1haWw6ImVuZGVyZcOnbyBkZSBlLW1haWwiLHVybDoiVVJMIixlbW9qaToiZW1vamkiLHV1aWQ6IlVVSUQiLHV1aWR2NDoiVVVJRHY0Iix1dWlkdjY6IlVVSUR2NiIsbmFub2lkOiJuYW5vaWQiLGd1aWQ6IkdVSUQiLGN1aWQ6ImN1aWQiLGN1aWQyOiJjdWlkMiIsdWxpZDoiVUxJRCIseGlkOiJYSUQiLGtzdWlkOiJLU1VJRCIsZGF0ZXRpbWU6ImRhdGEgZSBob3JhIElTTyIsZGF0ZToiZGF0YSBJU08iLHRpbWU6ImhvcmEgSVNPIixkdXJhdGlvbjoiZHVyYcOnw6NvIElTTyIsaXB2NDoiZW5kZXJlw6dvIElQdjQiLGlwdjY6ImVuZGVyZcOnbyBJUHY2IixjaWRydjQ6ImZhaXhhIGRlIElQdjQiLGNpZHJ2NjoiZmFpeGEgZGUgSVB2NiIsYmFzZTY0OiJ0ZXh0byBjb2RpZmljYWRvIGVtIGJhc2U2NCIsYmFzZTY0dXJsOiJVUkwgY29kaWZpY2FkYSBlbSBiYXNlNjQiLGpzb25fc3RyaW5nOiJ0ZXh0byBKU09OIixlMTY0OiJuw7ptZXJvIEUuMTY0Iixqd3Q6IkpXVCIsdGVtcGxhdGVfbGl0ZXJhbDoiZW50cmFkYSJ9LG89e25hbjoiTmFOIixudW1iZXI6Im7Dum1lcm8iLG51bGw6Im51bG8ifTtyZXR1cm4gZT0+e3N3aXRjaChlLmNvZGUpe2Nhc2UiaW52YWxpZF90eXBlIjp7Y29uc3QgaT1vW2UuZXhwZWN0ZWRdPz9lLmV4cGVjdGVkLGE9dyhlLmlucHV0KSxzPW9bYV0/P2E7cmV0dXJuL15bQS1aXS8udGVzdChlLmV4cGVjdGVkKT9gVGlwbyBpbnbDoWxpZG86IGVzcGVyYWRvIGluc3RhbmNlb2YgJHtlLmV4cGVjdGVkfSwgcmVjZWJpZG8gJHtzfWA6YFRpcG8gaW52w6FsaWRvOiBlc3BlcmFkbyAke2l9LCByZWNlYmlkbyAke3N9YH1jYXNlImludmFsaWRfdmFsdWUiOnJldHVybiBlLnZhbHVlcy5sZW5ndGg9PT0xP2BFbnRyYWRhIGludsOhbGlkYTogZXNwZXJhZG8gJHtTKGUudmFsdWVzWzBdKX1gOmBPcMOnw6NvIGludsOhbGlkYTogZXNwZXJhZGEgdW1hIGRhcyAke18oZS52YWx1ZXMsInwiKX1gO2Nhc2UidG9vX2JpZyI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ijw9IjoiPCIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9gTXVpdG8gZ3JhbmRlOiBlc3BlcmFkbyBxdWUgJHtlLm9yaWdpbj8/InZhbG9yIn0gdGl2ZXNzZSAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX0gJHthLnVuaXQ/PyJlbGVtZW50b3MifWA6YE11aXRvIGdyYW5kZTogZXNwZXJhZG8gcXVlICR7ZS5vcmlnaW4/PyJ2YWxvciJ9IGZvc3NlICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfWB9Y2FzZSJ0b29fc21hbGwiOntjb25zdCBpPWUuaW5jbHVzaXZlPyI+PSI6Ij4iLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YE11aXRvIHBlcXVlbm86IGVzcGVyYWRvIHF1ZSAke2Uub3JpZ2lufSB0aXZlc3NlICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfSAke2EudW5pdH1gOmBNdWl0byBwZXF1ZW5vOiBlc3BlcmFkbyBxdWUgJHtlLm9yaWdpbn0gZm9zc2UgJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9YH1jYXNlImludmFsaWRfZm9ybWF0Ijp7Y29uc3QgaT1lO3JldHVybiBpLmZvcm1hdD09PSJzdGFydHNfd2l0aCI/YFRleHRvIGludsOhbGlkbzogZGV2ZSBjb21lw6dhciBjb20gIiR7aS5wcmVmaXh9ImA6aS5mb3JtYXQ9PT0iZW5kc193aXRoIj9gVGV4dG8gaW52w6FsaWRvOiBkZXZlIHRlcm1pbmFyIGNvbSAiJHtpLnN1ZmZpeH0iYDppLmZvcm1hdD09PSJpbmNsdWRlcyI/YFRleHRvIGludsOhbGlkbzogZGV2ZSBpbmNsdWlyICIke2kuaW5jbHVkZXN9ImA6aS5mb3JtYXQ9PT0icmVnZXgiP2BUZXh0byBpbnbDoWxpZG86IGRldmUgY29ycmVzcG9uZGVyIGFvIHBhZHLDo28gJHtpLnBhdHRlcm59YDpgJHtyW2kuZm9ybWF0XT8/ZS5mb3JtYXR9IGludsOhbGlkb2B9Y2FzZSJub3RfbXVsdGlwbGVfb2YiOnJldHVybmBOw7ptZXJvIGludsOhbGlkbzogZGV2ZSBzZXIgbcO6bHRpcGxvIGRlICR7ZS5kaXZpc29yfWA7Y2FzZSJ1bnJlY29nbml6ZWRfa2V5cyI6cmV0dXJuYENoYXZlJHtlLmtleXMubGVuZ3RoPjE/InMiOiIifSBkZXNjb25oZWNpZGEke2Uua2V5cy5sZW5ndGg+MT8icyI6IiJ9OiAke18oZS5rZXlzLCIsICIpfWA7Y2FzZSJpbnZhbGlkX2tleSI6cmV0dXJuYENoYXZlIGludsOhbGlkYSBlbSAke2Uub3JpZ2lufWA7Y2FzZSJpbnZhbGlkX3VuaW9uIjpyZXR1cm4iRW50cmFkYSBpbnbDoWxpZGEiO2Nhc2UiaW52YWxpZF9lbGVtZW50IjpyZXR1cm5gVmFsb3IgaW52w6FsaWRvIGVtICR7ZS5vcmlnaW59YDtkZWZhdWx0OnJldHVybiJDYW1wbyBpbnbDoWxpZG8ifX19O2Z1bmN0aW9uIGVnKCl7cmV0dXJue2xvY2FsZUVycm9yOlFmKCl9fWNvbnN0IHRnPSgpPT57Y29uc3QgdD17c3RyaW5nOnt1bml0OiJjYXJhY3RlcmUiLHZlcmI6InPEgyBhaWLEgyJ9LGZpbGU6e3VuaXQ6Im9jdGXIm2kiLHZlcmI6InPEgyBhaWLEgyJ9LGFycmF5Ont1bml0OiJlbGVtZW50ZSIsdmVyYjoic8SDIGFpYsSDIn0sc2V0Ont1bml0OiJlbGVtZW50ZSIsdmVyYjoic8SDIGFpYsSDIn0sbWFwOnt1bml0OiJpbnRyxINyaSIsdmVyYjoic8SDIGFpYsSDIn19O2Z1bmN0aW9uIG4oZSl7cmV0dXJuIHRbZV0/P251bGx9Y29uc3Qgcj17cmVnZXg6ImludHJhcmUiLGVtYWlsOiJhZHJlc8SDIGRlIGVtYWlsIix1cmw6IlVSTCIsZW1vamk6ImVtb2ppIix1dWlkOiJVVUlEIix1dWlkdjQ6IlVVSUR2NCIsdXVpZHY2OiJVVUlEdjYiLG5hbm9pZDoibmFub2lkIixndWlkOiJHVUlEIixjdWlkOiJjdWlkIixjdWlkMjoiY3VpZDIiLHVsaWQ6IlVMSUQiLHhpZDoiWElEIixrc3VpZDoiS1NVSUQiLGRhdGV0aW1lOiJkYXTEgyDImWkgb3LEgyBJU08iLGRhdGU6ImRhdMSDIElTTyIsdGltZToib3LEgyBJU08iLGR1cmF0aW9uOiJkdXJhdMSDIElTTyIsaXB2NDoiYWRyZXPEgyBJUHY0IixpcHY2OiJhZHJlc8SDIElQdjYiLG1hYzoiYWRyZXPEgyBNQUMiLGNpZHJ2NDoiaW50ZXJ2YWwgSVB2NCIsY2lkcnY2OiJpbnRlcnZhbCBJUHY2IixiYXNlNjQ6IsiZaXIgY29kYXQgYmFzZTY0IixiYXNlNjR1cmw6IsiZaXIgY29kYXQgYmFzZTY0dXJsIixqc29uX3N0cmluZzoiyJlpciBKU09OIixlMTY0OiJudW3Eg3IgRS4xNjQiLGp3dDoiSldUIix0ZW1wbGF0ZV9saXRlcmFsOiJpbnRyYXJlIn0sbz17bmFuOiJOYU4iLHN0cmluZzoiyJlpciIsbnVtYmVyOiJudW3Eg3IiLGJvb2xlYW46ImJvb2xlYW4iLGZ1bmN0aW9uOiJmdW5jyJtpZSIsYXJyYXk6Im1hdHJpY2UiLG9iamVjdDoib2JpZWN0Iix1bmRlZmluZWQ6Im5lZGVmaW5pdCIsc3ltYm9sOiJzaW1ib2wiLGJpZ2ludDoibnVtxINyIG1hcmUiLHZvaWQ6InZvaWQiLG5ldmVyOiJuZXZlciIsbWFwOiJoYXJ0xIMiLHNldDoic2V0In07cmV0dXJuIGU9Pntzd2l0Y2goZS5jb2RlKXtjYXNlImludmFsaWRfdHlwZSI6e2NvbnN0IGk9b1tlLmV4cGVjdGVkXT8/ZS5leHBlY3RlZCxhPXcoZS5pbnB1dCkscz1vW2FdPz9hO3JldHVybmBJbnRyYXJlIGludmFsaWTEgzogYciZdGVwdGF0ICR7aX0sIHByaW1pdCAke3N9YH1jYXNlImludmFsaWRfdmFsdWUiOnJldHVybiBlLnZhbHVlcy5sZW5ndGg9PT0xP2BJbnRyYXJlIGludmFsaWTEgzogYciZdGVwdGF0ICR7UyhlLnZhbHVlc1swXSl9YDpgT3DIm2l1bmUgaW52YWxpZMSDOiBhyJl0ZXB0YXQgdW5hIGRpbnRyZSAke18oZS52YWx1ZXMsInwiKX1gO2Nhc2UidG9vX2JpZyI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ijw9IjoiPCIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9gUHJlYSBtYXJlOiBhyJl0ZXB0YXQgY2EgJHtlLm9yaWdpbj8/InZhbG9hcmVhIn0gJHthLnZlcmJ9ICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfSAke2EudW5pdD8/ImVsZW1lbnRlIn1gOmBQcmVhIG1hcmU6IGHImXRlcHRhdCBjYSAke2Uub3JpZ2luPz8idmFsb2FyZWEifSBzxIMgZmllICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfWB9Y2FzZSJ0b29fc21hbGwiOntjb25zdCBpPWUuaW5jbHVzaXZlPyI+PSI6Ij4iLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YFByZWEgbWljOiBhyJl0ZXB0YXQgY2EgJHtlLm9yaWdpbn0gJHthLnZlcmJ9ICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfSAke2EudW5pdH1gOmBQcmVhIG1pYzogYciZdGVwdGF0IGNhICR7ZS5vcmlnaW59IHPEgyBmaWUgJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9YH1jYXNlImludmFsaWRfZm9ybWF0Ijp7Y29uc3QgaT1lO3JldHVybiBpLmZvcm1hdD09PSJzdGFydHNfd2l0aCI/YMiYaXIgaW52YWxpZDogdHJlYnVpZSBzxIMgw65uY2VhcMSDIGN1ICIke2kucHJlZml4fSJgOmkuZm9ybWF0PT09ImVuZHNfd2l0aCI/YMiYaXIgaW52YWxpZDogdHJlYnVpZSBzxIMgc2UgdGVybWluZSBjdSAiJHtpLnN1ZmZpeH0iYDppLmZvcm1hdD09PSJpbmNsdWRlcyI/YMiYaXIgaW52YWxpZDogdHJlYnVpZSBzxIMgaW5jbHVkxIMgIiR7aS5pbmNsdWRlc30iYDppLmZvcm1hdD09PSJyZWdleCI/YMiYaXIgaW52YWxpZDogdHJlYnVpZSBzxIMgc2UgcG90cml2ZWFzY8SDIGN1IG1vZGVsdWwgJHtpLnBhdHRlcm59YDpgRm9ybWF0IGludmFsaWQ6ICR7cltpLmZvcm1hdF0/P2UuZm9ybWF0fWB9Y2FzZSJub3RfbXVsdGlwbGVfb2YiOnJldHVybmBOdW3Eg3IgaW52YWxpZDogdHJlYnVpZSBzxIMgZmllIG11bHRpcGx1IGRlICR7ZS5kaXZpc29yfWA7Y2FzZSJ1bnJlY29nbml6ZWRfa2V5cyI6cmV0dXJuYENoZWkgbmVyZWN1bm9zY3V0ZTogJHtfKGUua2V5cywiLCAiKX1gO2Nhc2UiaW52YWxpZF9rZXkiOnJldHVybmBDaGVpZSBpbnZhbGlkxIMgw65uICR7ZS5vcmlnaW59YDtjYXNlImludmFsaWRfdW5pb24iOnJldHVybiJJbnRyYXJlIGludmFsaWTEgyI7Y2FzZSJpbnZhbGlkX2VsZW1lbnQiOnJldHVybmBWYWxvYXJlIGludmFsaWTEgyDDrm4gJHtlLm9yaWdpbn1gO2RlZmF1bHQ6cmV0dXJuIkludHJhcmUgaW52YWxpZMSDIn19fTtmdW5jdGlvbiBuZygpe3JldHVybntsb2NhbGVFcnJvcjp0ZygpfX1mdW5jdGlvbiBEcyh0LG4scixvKXtjb25zdCBlPU1hdGguYWJzKHQpLGk9ZSUxMCxhPWUlMTAwO3JldHVybiBhPj0xMSYmYTw9MTk/bzppPT09MT9uOmk+PTImJmk8PTQ/cjpvfWNvbnN0IHJnPSgpPT57Y29uc3QgdD17c3RyaW5nOnt1bml0OntvbmU6ItGB0LjQvNCy0L7QuyIsZmV3OiLRgdC40LzQstC+0LvQsCIsbWFueToi0YHQuNC80LLQvtC70L7QsiJ9LHZlcmI6ItC40LzQtdGC0YwifSxmaWxlOnt1bml0OntvbmU6ItCx0LDQudGCIixmZXc6ItCx0LDQudGC0LAiLG1hbnk6ItCx0LDQudGCIn0sdmVyYjoi0LjQvNC10YLRjCJ9LGFycmF5Ont1bml0OntvbmU6ItGN0LvQtdC80LXQvdGCIixmZXc6ItGN0LvQtdC80LXQvdGC0LAiLG1hbnk6ItGN0LvQtdC80LXQvdGC0L7QsiJ9LHZlcmI6ItC40LzQtdGC0YwifSxzZXQ6e3VuaXQ6e29uZToi0Y3Qu9C10LzQtdC90YIiLGZldzoi0Y3Qu9C10LzQtdC90YLQsCIsbWFueToi0Y3Qu9C10LzQtdC90YLQvtCyIn0sdmVyYjoi0LjQvNC10YLRjCJ9fTtmdW5jdGlvbiBuKGUpe3JldHVybiB0W2VdPz9udWxsfWNvbnN0IHI9e3JlZ2V4OiLQstCy0L7QtCIsZW1haWw6ImVtYWlsINCw0LTRgNC10YEiLHVybDoiVVJMIixlbW9qaToi0Y3QvNC+0LTQt9C4Iix1dWlkOiJVVUlEIix1dWlkdjQ6IlVVSUR2NCIsdXVpZHY2OiJVVUlEdjYiLG5hbm9pZDoibmFub2lkIixndWlkOiJHVUlEIixjdWlkOiJjdWlkIixjdWlkMjoiY3VpZDIiLHVsaWQ6IlVMSUQiLHhpZDoiWElEIixrc3VpZDoiS1NVSUQiLGRhdGV0aW1lOiJJU08g0LTQsNGC0LAg0Lgg0LLRgNC10LzRjyIsZGF0ZToiSVNPINC00LDRgtCwIix0aW1lOiJJU08g0LLRgNC10LzRjyIsZHVyYXRpb246IklTTyDQtNC70LjRgtC10LvRjNC90L7RgdGC0YwiLGlwdjQ6IklQdjQg0LDQtNGA0LXRgSIsaXB2NjoiSVB2NiDQsNC00YDQtdGBIixjaWRydjQ6IklQdjQg0LTQuNCw0L/QsNC30L7QvSIsY2lkcnY2OiJJUHY2INC00LjQsNC/0LDQt9C+0L0iLGJhc2U2NDoi0YHRgtGA0L7QutCwINCyINGE0L7RgNC80LDRgtC1IGJhc2U2NCIsYmFzZTY0dXJsOiLRgdGC0YDQvtC60LAg0LIg0YTQvtGA0LzQsNGC0LUgYmFzZTY0dXJsIixqc29uX3N0cmluZzoiSlNPTiDRgdGC0YDQvtC60LAiLGUxNjQ6ItC90L7QvNC10YAgRS4xNjQiLGp3dDoiSldUIix0ZW1wbGF0ZV9saXRlcmFsOiLQstCy0L7QtCJ9LG89e25hbjoiTmFOIixudW1iZXI6ItGH0LjRgdC70L4iLGFycmF5OiLQvNCw0YHRgdC40LIifTtyZXR1cm4gZT0+e3N3aXRjaChlLmNvZGUpe2Nhc2UiaW52YWxpZF90eXBlIjp7Y29uc3QgaT1vW2UuZXhwZWN0ZWRdPz9lLmV4cGVjdGVkLGE9dyhlLmlucHV0KSxzPW9bYV0/P2E7cmV0dXJuL15bQS1aXS8udGVzdChlLmV4cGVjdGVkKT9g0J3QtdCy0LXRgNC90YvQuSDQstCy0L7QtDog0L7QttC40LTQsNC70L7RgdGMIGluc3RhbmNlb2YgJHtlLmV4cGVjdGVkfSwg0L/QvtC70YPRh9C10L3QviAke3N9YDpg0J3QtdCy0LXRgNC90YvQuSDQstCy0L7QtDog0L7QttC40LTQsNC70L7RgdGMICR7aX0sINC/0L7Qu9GD0YfQtdC90L4gJHtzfWB9Y2FzZSJpbnZhbGlkX3ZhbHVlIjpyZXR1cm4gZS52YWx1ZXMubGVuZ3RoPT09MT9g0J3QtdCy0LXRgNC90YvQuSDQstCy0L7QtDog0L7QttC40LTQsNC70L7RgdGMICR7UyhlLnZhbHVlc1swXSl9YDpg0J3QtdCy0LXRgNC90YvQuSDQstCw0YDQuNCw0L3Rgjog0L7QttC40LTQsNC70L7RgdGMINC+0LTQvdC+INC40LcgJHtfKGUudmFsdWVzLCJ8Iil9YDtjYXNlInRvb19iaWciOntjb25zdCBpPWUuaW5jbHVzaXZlPyI8PSI6IjwiLGE9bihlLm9yaWdpbik7aWYoYSl7Y29uc3Qgcz1OdW1iZXIoZS5tYXhpbXVtKSxjPURzKHMsYS51bml0Lm9uZSxhLnVuaXQuZmV3LGEudW5pdC5tYW55KTtyZXR1cm5g0KHQu9C40YjQutC+0Lwg0LHQvtC70YzRiNC+0LUg0LfQvdCw0YfQtdC90LjQtTog0L7QttC40LTQsNC70L7RgdGMLCDRh9GC0L4gJHtlLm9yaWdpbj8/ItC30L3QsNGH0LXQvdC40LUifSDQsdGD0LTQtdGCINC40LzQtdGC0YwgJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9ICR7Y31gfXJldHVybmDQodC70LjRiNC60L7QvCDQsdC+0LvRjNGI0L7QtSDQt9C90LDRh9C10L3QuNC1OiDQvtC20LjQtNCw0LvQvtGB0YwsINGH0YLQviAke2Uub3JpZ2luPz8i0LfQvdCw0YfQtdC90LjQtSJ9INCx0YPQtNC10YIgJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9YH1jYXNlInRvb19zbWFsbCI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ij49IjoiPiIsYT1uKGUub3JpZ2luKTtpZihhKXtjb25zdCBzPU51bWJlcihlLm1pbmltdW0pLGM9RHMocyxhLnVuaXQub25lLGEudW5pdC5mZXcsYS51bml0Lm1hbnkpO3JldHVybmDQodC70LjRiNC60L7QvCDQvNCw0LvQtdC90YzQutC+0LUg0LfQvdCw0YfQtdC90LjQtTog0L7QttC40LTQsNC70L7RgdGMLCDRh9GC0L4gJHtlLm9yaWdpbn0g0LHRg9C00LXRgiDQuNC80LXRgtGMICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfSAke2N9YH1yZXR1cm5g0KHQu9C40YjQutC+0Lwg0LzQsNC70LXQvdGM0LrQvtC1INC30L3QsNGH0LXQvdC40LU6INC+0LbQuNC00LDQu9C+0YHRjCwg0YfRgtC+ICR7ZS5vcmlnaW59INCx0YPQtNC10YIgJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9YH1jYXNlImludmFsaWRfZm9ybWF0Ijp7Y29uc3QgaT1lO3JldHVybiBpLmZvcm1hdD09PSJzdGFydHNfd2l0aCI/YNCd0LXQstC10YDQvdCw0Y8g0YHRgtGA0L7QutCwOiDQtNC+0LvQttC90LAg0L3QsNGH0LjQvdCw0YLRjNGB0Y8g0YEgIiR7aS5wcmVmaXh9ImA6aS5mb3JtYXQ9PT0iZW5kc193aXRoIj9g0J3QtdCy0LXRgNC90LDRjyDRgdGC0YDQvtC60LA6INC00L7Qu9C20L3QsCDQt9Cw0LrQsNC90YfQuNCy0LDRgtGM0YHRjyDQvdCwICIke2kuc3VmZml4fSJgOmkuZm9ybWF0PT09ImluY2x1ZGVzIj9g0J3QtdCy0LXRgNC90LDRjyDRgdGC0YDQvtC60LA6INC00L7Qu9C20L3QsCDRgdC+0LTQtdGA0LbQsNGC0YwgIiR7aS5pbmNsdWRlc30iYDppLmZvcm1hdD09PSJyZWdleCI/YNCd0LXQstC10YDQvdCw0Y8g0YHRgtGA0L7QutCwOiDQtNC+0LvQttC90LAg0YHQvtC+0YLQstC10YLRgdGC0LLQvtCy0LDRgtGMINGI0LDQsdC70L7QvdGDICR7aS5wYXR0ZXJufWA6YNCd0LXQstC10YDQvdGL0LkgJHtyW2kuZm9ybWF0XT8/ZS5mb3JtYXR9YH1jYXNlIm5vdF9tdWx0aXBsZV9vZiI6cmV0dXJuYNCd0LXQstC10YDQvdC+0LUg0YfQuNGB0LvQvjog0LTQvtC70LbQvdC+INCx0YvRgtGMINC60YDQsNGC0L3Ri9C8ICR7ZS5kaXZpc29yfWA7Y2FzZSJ1bnJlY29nbml6ZWRfa2V5cyI6cmV0dXJuYNCd0LXRgNCw0YHQv9C+0LfQvdCw0L3QvSR7ZS5rZXlzLmxlbmd0aD4xPyLRi9C1Ijoi0YvQuSJ9INC60LvRjtGHJHtlLmtleXMubGVuZ3RoPjE/ItC4IjoiIn06ICR7XyhlLmtleXMsIiwgIil9YDtjYXNlImludmFsaWRfa2V5IjpyZXR1cm5g0J3QtdCy0LXRgNC90YvQuSDQutC70Y7RhyDQsiAke2Uub3JpZ2lufWA7Y2FzZSJpbnZhbGlkX3VuaW9uIjpyZXR1cm4i0J3QtdCy0LXRgNC90YvQtSDQstGF0L7QtNC90YvQtSDQtNCw0L3QvdGL0LUiO2Nhc2UiaW52YWxpZF9lbGVtZW50IjpyZXR1cm5g0J3QtdCy0LXRgNC90L7QtSDQt9C90LDRh9C10L3QuNC1INCyICR7ZS5vcmlnaW59YDtkZWZhdWx0OnJldHVybiLQndC10LLQtdGA0L3Ri9C1INCy0YXQvtC00L3Ri9C1INC00LDQvdC90YvQtSJ9fX07ZnVuY3Rpb24gaWcoKXtyZXR1cm57bG9jYWxlRXJyb3I6cmcoKX19Y29uc3Qgb2c9KCk9Pntjb25zdCB0PXtzdHJpbmc6e3VuaXQ6InpuYWtvdiIsdmVyYjoiaW1ldGkifSxmaWxlOnt1bml0OiJiYWp0b3YiLHZlcmI6ImltZXRpIn0sYXJyYXk6e3VuaXQ6ImVsZW1lbnRvdiIsdmVyYjoiaW1ldGkifSxzZXQ6e3VuaXQ6ImVsZW1lbnRvdiIsdmVyYjoiaW1ldGkifX07ZnVuY3Rpb24gbihlKXtyZXR1cm4gdFtlXT8/bnVsbH1jb25zdCByPXtyZWdleDoidm5vcyIsZW1haWw6ImUtcG/FoXRuaSBuYXNsb3YiLHVybDoiVVJMIixlbW9qaToiZW1vamkiLHV1aWQ6IlVVSUQiLHV1aWR2NDoiVVVJRHY0Iix1dWlkdjY6IlVVSUR2NiIsbmFub2lkOiJuYW5vaWQiLGd1aWQ6IkdVSUQiLGN1aWQ6ImN1aWQiLGN1aWQyOiJjdWlkMiIsdWxpZDoiVUxJRCIseGlkOiJYSUQiLGtzdWlkOiJLU1VJRCIsZGF0ZXRpbWU6IklTTyBkYXR1bSBpbiDEjWFzIixkYXRlOiJJU08gZGF0dW0iLHRpbWU6IklTTyDEjWFzIixkdXJhdGlvbjoiSVNPIHRyYWphbmplIixpcHY0OiJJUHY0IG5hc2xvdiIsaXB2NjoiSVB2NiBuYXNsb3YiLGNpZHJ2NDoib2JzZWcgSVB2NCIsY2lkcnY2OiJvYnNlZyBJUHY2IixiYXNlNjQ6ImJhc2U2NCBrb2RpcmFuIG5peiIsYmFzZTY0dXJsOiJiYXNlNjR1cmwga29kaXJhbiBuaXoiLGpzb25fc3RyaW5nOiJKU09OIG5peiIsZTE2NDoiRS4xNjQgxaF0ZXZpbGthIixqd3Q6IkpXVCIsdGVtcGxhdGVfbGl0ZXJhbDoidm5vcyJ9LG89e25hbjoiTmFOIixudW1iZXI6IsWhdGV2aWxvIixhcnJheToidGFiZWxhIn07cmV0dXJuIGU9Pntzd2l0Y2goZS5jb2RlKXtjYXNlImludmFsaWRfdHlwZSI6e2NvbnN0IGk9b1tlLmV4cGVjdGVkXT8/ZS5leHBlY3RlZCxhPXcoZS5pbnB1dCkscz1vW2FdPz9hO3JldHVybi9eW0EtWl0vLnRlc3QoZS5leHBlY3RlZCk/YE5ldmVsamF2ZW4gdm5vczogcHJpxI1ha292YW5vIGluc3RhbmNlb2YgJHtlLmV4cGVjdGVkfSwgcHJlamV0byAke3N9YDpgTmV2ZWxqYXZlbiB2bm9zOiBwcmnEjWFrb3Zhbm8gJHtpfSwgcHJlamV0byAke3N9YH1jYXNlImludmFsaWRfdmFsdWUiOnJldHVybiBlLnZhbHVlcy5sZW5ndGg9PT0xP2BOZXZlbGphdmVuIHZub3M6IHByacSNYWtvdmFubyAke1MoZS52YWx1ZXNbMF0pfWA6YE5ldmVsamF2bmEgbW/Fvm5vc3Q6IHByacSNYWtvdmFubyBlbm8gaXptZWQgJHtfKGUudmFsdWVzLCJ8Iil9YDtjYXNlInRvb19iaWciOntjb25zdCBpPWUuaW5jbHVzaXZlPyI8PSI6IjwiLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YFByZXZlbGlrbzogcHJpxI1ha292YW5vLCBkYSBibyAke2Uub3JpZ2luPz8idnJlZG5vc3QifSBpbWVsbyAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX0gJHthLnVuaXQ/PyJlbGVtZW50b3YifWA6YFByZXZlbGlrbzogcHJpxI1ha292YW5vLCBkYSBibyAke2Uub3JpZ2luPz8idnJlZG5vc3QifSAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX1gfWNhc2UidG9vX3NtYWxsIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPj0iOiI+IixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2BQcmVtYWpobm86IHByacSNYWtvdmFubywgZGEgYm8gJHtlLm9yaWdpbn0gaW1lbG8gJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0fWA6YFByZW1hamhubzogcHJpxI1ha292YW5vLCBkYSBibyAke2Uub3JpZ2lufSAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX1gfWNhc2UiaW52YWxpZF9mb3JtYXQiOntjb25zdCBpPWU7cmV0dXJuIGkuZm9ybWF0PT09InN0YXJ0c193aXRoIj9gTmV2ZWxqYXZlbiBuaXo6IG1vcmEgc2UgemHEjWV0aSB6ICIke2kucHJlZml4fSJgOmkuZm9ybWF0PT09ImVuZHNfd2l0aCI/YE5ldmVsamF2ZW4gbml6OiBtb3JhIHNlIGtvbsSNYXRpIHogIiR7aS5zdWZmaXh9ImA6aS5mb3JtYXQ9PT0iaW5jbHVkZXMiP2BOZXZlbGphdmVuIG5pejogbW9yYSB2c2Vib3ZhdGkgIiR7aS5pbmNsdWRlc30iYDppLmZvcm1hdD09PSJyZWdleCI/YE5ldmVsamF2ZW4gbml6OiBtb3JhIHVzdHJlemF0aSB2em9yY3UgJHtpLnBhdHRlcm59YDpgTmV2ZWxqYXZlbiAke3JbaS5mb3JtYXRdPz9lLmZvcm1hdH1gfWNhc2Uibm90X211bHRpcGxlX29mIjpyZXR1cm5gTmV2ZWxqYXZubyDFoXRldmlsbzogbW9yYSBiaXRpIHZlxI1rcmF0bmlrICR7ZS5kaXZpc29yfWA7Y2FzZSJ1bnJlY29nbml6ZWRfa2V5cyI6cmV0dXJuYE5lcHJlcG96bmFuJHtlLmtleXMubGVuZ3RoPjE/Imkga2xqdcSNaSI6IiBrbGp1xI0ifTogJHtfKGUua2V5cywiLCAiKX1gO2Nhc2UiaW52YWxpZF9rZXkiOnJldHVybmBOZXZlbGphdmVuIGtsanXEjSB2ICR7ZS5vcmlnaW59YDtjYXNlImludmFsaWRfdW5pb24iOnJldHVybiJOZXZlbGphdmVuIHZub3MiO2Nhc2UiaW52YWxpZF9lbGVtZW50IjpyZXR1cm5gTmV2ZWxqYXZuYSB2cmVkbm9zdCB2ICR7ZS5vcmlnaW59YDtkZWZhdWx0OnJldHVybiJOZXZlbGphdmVuIHZub3MifX19O2Z1bmN0aW9uIGFnKCl7cmV0dXJue2xvY2FsZUVycm9yOm9nKCl9fWNvbnN0IHNnPSgpPT57Y29uc3QgdD17c3RyaW5nOnt1bml0OiJ0ZWNrZW4iLHZlcmI6ImF0dCBoYSJ9LGZpbGU6e3VuaXQ6ImJ5dGVzIix2ZXJiOiJhdHQgaGEifSxhcnJheTp7dW5pdDoib2JqZWt0Iix2ZXJiOiJhdHQgaW5uZWjDpWxsYSJ9LHNldDp7dW5pdDoib2JqZWt0Iix2ZXJiOiJhdHQgaW5uZWjDpWxsYSJ9fTtmdW5jdGlvbiBuKGUpe3JldHVybiB0W2VdPz9udWxsfWNvbnN0IHI9e3JlZ2V4OiJyZWd1bGrDpHJ0IHV0dHJ5Y2siLGVtYWlsOiJlLXBvc3RhZHJlc3MiLHVybDoiVVJMIixlbW9qaToiZW1vamkiLHV1aWQ6IlVVSUQiLHV1aWR2NDoiVVVJRHY0Iix1dWlkdjY6IlVVSUR2NiIsbmFub2lkOiJuYW5vaWQiLGd1aWQ6IkdVSUQiLGN1aWQ6ImN1aWQiLGN1aWQyOiJjdWlkMiIsdWxpZDoiVUxJRCIseGlkOiJYSUQiLGtzdWlkOiJLU1VJRCIsZGF0ZXRpbWU6IklTTy1kYXR1bSBvY2ggdGlkIixkYXRlOiJJU08tZGF0dW0iLHRpbWU6IklTTy10aWQiLGR1cmF0aW9uOiJJU08tdmFyYWt0aWdoZXQiLGlwdjQ6IklQdjQtaW50ZXJ2YWxsIixpcHY2OiJJUHY2LWludGVydmFsbCIsY2lkcnY0OiJJUHY0LXNwZWt0cnVtIixjaWRydjY6IklQdjYtc3Bla3RydW0iLGJhc2U2NDoiYmFzZTY0LWtvZGFkIHN0csOkbmciLGJhc2U2NHVybDoiYmFzZTY0dXJsLWtvZGFkIHN0csOkbmciLGpzb25fc3RyaW5nOiJKU09OLXN0csOkbmciLGUxNjQ6IkUuMTY0LW51bW1lciIsand0OiJKV1QiLHRlbXBsYXRlX2xpdGVyYWw6Im1hbGwtbGl0ZXJhbCJ9LG89e25hbjoiTmFOIixudW1iZXI6ImFudGFsIixhcnJheToibGlzdGEifTtyZXR1cm4gZT0+e3N3aXRjaChlLmNvZGUpe2Nhc2UiaW52YWxpZF90eXBlIjp7Y29uc3QgaT1vW2UuZXhwZWN0ZWRdPz9lLmV4cGVjdGVkLGE9dyhlLmlucHV0KSxzPW9bYV0/P2E7cmV0dXJuL15bQS1aXS8udGVzdChlLmV4cGVjdGVkKT9gT2dpbHRpZyBpbm1hdG5pbmc6IGbDtnJ2w6RudGF0IGluc3RhbmNlb2YgJHtlLmV4cGVjdGVkfSwgZmljayAke3N9YDpgT2dpbHRpZyBpbm1hdG5pbmc6IGbDtnJ2w6RudGF0ICR7aX0sIGZpY2sgJHtzfWB9Y2FzZSJpbnZhbGlkX3ZhbHVlIjpyZXR1cm4gZS52YWx1ZXMubGVuZ3RoPT09MT9gT2dpbHRpZyBpbm1hdG5pbmc6IGbDtnJ2w6RudGF0ICR7UyhlLnZhbHVlc1swXSl9YDpgT2dpbHRpZ3QgdmFsOiBmw7ZydsOkbnRhZGUgZW4gYXYgJHtfKGUudmFsdWVzLCJ8Iil9YDtjYXNlInRvb19iaWciOntjb25zdCBpPWUuaW5jbHVzaXZlPyI8PSI6IjwiLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YEbDtnIgc3Rvcih0KTogZsO2cnbDpG50YWRlICR7ZS5vcmlnaW4/PyJ2w6RyZGV0In0gYXR0IGhhICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfSAke2EudW5pdD8/ImVsZW1lbnQifWA6YEbDtnIgc3Rvcih0KTogZsO2cnbDpG50YXQgJHtlLm9yaWdpbj8/InbDpHJkZXQifSBhdHQgaGEgJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9YH1jYXNlInRvb19zbWFsbCI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ij49IjoiPiIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9gRsO2ciBsaXRlKHQpOiBmw7ZydsOkbnRhZGUgJHtlLm9yaWdpbj8/InbDpHJkZXQifSBhdHQgaGEgJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0fWA6YEbDtnIgbGl0ZSh0KTogZsO2cnbDpG50YWRlICR7ZS5vcmlnaW4/PyJ2w6RyZGV0In0gYXR0IGhhICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfWB9Y2FzZSJpbnZhbGlkX2Zvcm1hdCI6e2NvbnN0IGk9ZTtyZXR1cm4gaS5mb3JtYXQ9PT0ic3RhcnRzX3dpdGgiP2BPZ2lsdGlnIHN0csOkbmc6IG3DpXN0ZSBiw7ZyamEgbWVkICIke2kucHJlZml4fSJgOmkuZm9ybWF0PT09ImVuZHNfd2l0aCI/YE9naWx0aWcgc3Ryw6RuZzogbcOlc3RlIHNsdXRhIG1lZCAiJHtpLnN1ZmZpeH0iYDppLmZvcm1hdD09PSJpbmNsdWRlcyI/YE9naWx0aWcgc3Ryw6RuZzogbcOlc3RlIGlubmVow6VsbGEgIiR7aS5pbmNsdWRlc30iYDppLmZvcm1hdD09PSJyZWdleCI/YE9naWx0aWcgc3Ryw6RuZzogbcOlc3RlIG1hdGNoYSBtw7Zuc3RyZXQgIiR7aS5wYXR0ZXJufSJgOmBPZ2lsdGlnKHQpICR7cltpLmZvcm1hdF0/P2UuZm9ybWF0fWB9Y2FzZSJub3RfbXVsdGlwbGVfb2YiOnJldHVybmBPZ2lsdGlndCB0YWw6IG3DpXN0ZSB2YXJhIGVuIG11bHRpcGVsIGF2ICR7ZS5kaXZpc29yfWA7Y2FzZSJ1bnJlY29nbml6ZWRfa2V5cyI6cmV0dXJuYCR7ZS5rZXlzLmxlbmd0aD4xPyJPa8OkbmRhIG55Y2tsYXIiOiJPa8OkbmQgbnlja2VsIn06ICR7XyhlLmtleXMsIiwgIil9YDtjYXNlImludmFsaWRfa2V5IjpyZXR1cm5gT2dpbHRpZyBueWNrZWwgaSAke2Uub3JpZ2luPz8idsOkcmRldCJ9YDtjYXNlImludmFsaWRfdW5pb24iOnJldHVybiJPZ2lsdGlnIGlucHV0IjtjYXNlImludmFsaWRfZWxlbWVudCI6cmV0dXJuYE9naWx0aWd0IHbDpHJkZSBpICR7ZS5vcmlnaW4/PyJ2w6RyZGV0In1gO2RlZmF1bHQ6cmV0dXJuIk9naWx0aWcgaW5wdXQifX19O2Z1bmN0aW9uIGNnKCl7cmV0dXJue2xvY2FsZUVycm9yOnNnKCl9fWNvbnN0IHVnPSgpPT57Y29uc3QgdD17c3RyaW5nOnt1bml0OiLgro7grrTgr4HgrqTgr43grqTgr4HgrpXgr43grpXgrrPgr40iLHZlcmI6IuCuleCviuCuo+CvjeCun+Cuv+CusOCvgeCuleCvjeCulSDgrrXgr4fgrqPgr43grp/gr4Hgrq7gr40ifSxmaWxlOnt1bml0OiLgrqrgr4jgrp/gr43grp/gr4HgrpXgrrPgr40iLHZlcmI6IuCuleCviuCuo+CvjeCun+Cuv+CusOCvgeCuleCvjeCulSDgrrXgr4fgrqPgr43grp/gr4Hgrq7gr40ifSxhcnJheTp7dW5pdDoi4K6J4K6x4K+B4K6q4K+N4K6q4K+B4K6V4K6z4K+NIix2ZXJiOiLgrpXgr4rgrqPgr43grp/grr/grrDgr4HgrpXgr43grpUg4K614K+H4K6j4K+N4K6f4K+B4K6u4K+NIn0sc2V0Ont1bml0OiLgrongrrHgr4Hgrqrgr43grqrgr4HgrpXgrrPgr40iLHZlcmI6IuCuleCviuCuo+CvjeCun+Cuv+CusOCvgeCuleCvjeCulSDgrrXgr4fgrqPgr43grp/gr4Hgrq7gr40ifX07ZnVuY3Rpb24gbihlKXtyZXR1cm4gdFtlXT8/bnVsbH1jb25zdCByPXtyZWdleDoi4K6J4K6z4K+N4K6z4K+A4K6f4K+BIixlbWFpbDoi4K6u4K6/4K6p4K+N4K6p4K6e4K+N4K6a4K6y4K+NIOCuruCvgeCuleCuteCusOCuvyIsdXJsOiJVUkwiLGVtb2ppOiJlbW9qaSIsdXVpZDoiVVVJRCIsdXVpZHY0OiJVVUlEdjQiLHV1aWR2NjoiVVVJRHY2IixuYW5vaWQ6Im5hbm9pZCIsZ3VpZDoiR1VJRCIsY3VpZDoiY3VpZCIsY3VpZDI6ImN1aWQyIix1bGlkOiJVTElEIix4aWQ6IlhJRCIsa3N1aWQ6IktTVUlEIixkYXRldGltZToiSVNPIOCupOCvh+CupOCuvyDgrqjgr4fgrrDgrq7gr40iLGRhdGU6IklTTyDgrqTgr4fgrqTgrr8iLHRpbWU6IklTTyDgrqjgr4fgrrDgrq7gr40iLGR1cmF0aW9uOiJJU08g4K6V4K6+4K6yIOCuheCus+CuteCvgSIsaXB2NDoiSVB2NCDgrq7gr4HgrpXgrrXgrrDgrr8iLGlwdjY6IklQdjYg4K6u4K+B4K6V4K614K6w4K6/IixjaWRydjQ6IklQdjQg4K614K6w4K6u4K+N4K6q4K+BIixjaWRydjY6IklQdjYg4K614K6w4K6u4K+N4K6q4K+BIixiYXNlNjQ6ImJhc2U2NC1lbmNvZGVkIOCumuCusOCuruCvjSIsYmFzZTY0dXJsOiJiYXNlNjR1cmwtZW5jb2RlZCDgrprgrrDgrq7gr40iLGpzb25fc3RyaW5nOiJKU09OIOCumuCusOCuruCvjSIsZTE2NDoiRS4xNjQg4K6O4K6j4K+NIixqd3Q6IkpXVCIsdGVtcGxhdGVfbGl0ZXJhbDoiaW5wdXQifSxvPXtuYW46Ik5hTiIsbnVtYmVyOiLgro7grqPgr40iLGFycmF5OiLgroXgrqPgrr8iLG51bGw6IuCuteCvhuCuseCvgeCuruCviCJ9O3JldHVybiBlPT57c3dpdGNoKGUuY29kZSl7Y2FzZSJpbnZhbGlkX3R5cGUiOntjb25zdCBpPW9bZS5leHBlY3RlZF0/P2UuZXhwZWN0ZWQsYT13KGUuaW5wdXQpLHM9b1thXT8/YTtyZXR1cm4vXltBLVpdLy50ZXN0KGUuZXhwZWN0ZWQpP2DgrqTgrrXgrrHgrr7grqkg4K6J4K6z4K+N4K6z4K+A4K6f4K+BOiDgro7grqTgrr/grrDgr43grqrgrr7grrDgr43grpXgr43grpXgrqrgr43grqrgrp/gr43grp/grqTgr4EgaW5zdGFuY2VvZiAke2UuZXhwZWN0ZWR9LCDgrqrgr4bgrrHgrqrgr43grqrgrp/gr43grp/grqTgr4EgJHtzfWA6YOCupOCuteCuseCuvuCuqSDgrongrrPgr43grrPgr4Dgrp/gr4E6IOCujuCupOCuv+CusOCvjeCuquCuvuCusOCvjeCuleCvjeCuleCuquCvjeCuquCun+CvjeCun+CupOCvgSAke2l9LCDgrqrgr4bgrrHgrqrgr43grqrgrp/gr43grp/grqTgr4EgJHtzfWB9Y2FzZSJpbnZhbGlkX3ZhbHVlIjpyZXR1cm4gZS52YWx1ZXMubGVuZ3RoPT09MT9g4K6k4K614K6x4K6+4K6pIOCuieCus+CvjeCus+CvgOCun+CvgTog4K6O4K6k4K6/4K6w4K+N4K6q4K6+4K6w4K+N4K6V4K+N4K6V4K6q4K+N4K6q4K6f4K+N4K6f4K6k4K+BICR7UyhlLnZhbHVlc1swXSl9YDpg4K6k4K614K6x4K6+4K6pIOCuteCuv+CusOCvgeCuquCvjeCuquCuruCvjTog4K6O4K6k4K6/4K6w4K+N4K6q4K6+4K6w4K+N4K6V4K+N4K6V4K6q4K+N4K6q4K6f4K+N4K6f4K6k4K+BICR7XyhlLnZhbHVlcywifCIpfSDgrofgrrLgr40g4K6S4K6p4K+N4K6x4K+BYDtjYXNlInRvb19iaWciOntjb25zdCBpPWUuaW5jbHVzaXZlPyI8PSI6IjwiLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YOCuruCuv+CulSDgrqrgr4bgrrDgrr/grq/grqTgr4E6IOCujuCupOCuv+CusOCvjeCuquCuvuCusOCvjeCuleCvjeCuleCuquCvjeCuquCun+CvjeCun+CupOCvgSAke2Uub3JpZ2luPz8i4K6u4K6k4K6/4K6q4K+N4K6q4K+BIn0gJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0Pz8i4K6J4K6x4K+B4K6q4K+N4K6q4K+B4K6V4K6z4K+NIn0g4K6G4K6VIOCuh+CusOCvgeCuleCvjeCulSDgrrXgr4fgrqPgr43grp/gr4Hgrq7gr41gOmDgrq7grr/grpUg4K6q4K+G4K6w4K6/4K6v4K6k4K+BOiDgro7grqTgrr/grrDgr43grqrgrr7grrDgr43grpXgr43grpXgrqrgr43grqrgrp/gr43grp/grqTgr4EgJHtlLm9yaWdpbj8/IuCuruCupOCuv+CuquCvjeCuquCvgSJ9ICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfSDgrobgrpUg4K6H4K6w4K+B4K6V4K+N4K6VIOCuteCvh+Cuo+CvjeCun+CvgeCuruCvjWB9Y2FzZSJ0b29fc21hbGwiOntjb25zdCBpPWUuaW5jbHVzaXZlPyI+PSI6Ij4iLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YOCuruCuv+CuleCumuCvjSDgrprgrr/grrHgrr/grq/grqTgr4E6IOCujuCupOCuv+CusOCvjeCuquCuvuCusOCvjeCuleCvjeCuleCuquCvjeCuquCun+CvjeCun+CupOCvgSAke2Uub3JpZ2lufSAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX0gJHthLnVuaXR9IOCuhuCulSDgrofgrrDgr4HgrpXgr43grpUg4K614K+H4K6j4K+N4K6f4K+B4K6u4K+NYDpg4K6u4K6/4K6V4K6a4K+NIOCumuCuv+CuseCuv+Cur+CupOCvgTog4K6O4K6k4K6/4K6w4K+N4K6q4K6+4K6w4K+N4K6V4K+N4K6V4K6q4K+N4K6q4K6f4K+N4K6f4K6k4K+BICR7ZS5vcmlnaW59ICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfSDgrobgrpUg4K6H4K6w4K+B4K6V4K+N4K6VIOCuteCvh+Cuo+CvjeCun+CvgeCuruCvjWB9Y2FzZSJpbnZhbGlkX2Zvcm1hdCI6e2NvbnN0IGk9ZTtyZXR1cm4gaS5mb3JtYXQ9PT0ic3RhcnRzX3dpdGgiP2DgrqTgrrXgrrHgrr7grqkg4K6a4K6w4K6u4K+NOiAiJHtpLnByZWZpeH0iIOCuh+CusuCvjSDgrqTgr4rgrp/grpngr43grpUg4K614K+H4K6j4K+N4K6f4K+B4K6u4K+NYDppLmZvcm1hdD09PSJlbmRzX3dpdGgiP2DgrqTgrrXgrrHgrr7grqkg4K6a4K6w4K6u4K+NOiAiJHtpLnN1ZmZpeH0iIOCuh+CusuCvjSDgrq7gr4Hgrp/grr/grrXgrp/gr4jgrq8g4K614K+H4K6j4K+N4K6f4K+B4K6u4K+NYDppLmZvcm1hdD09PSJpbmNsdWRlcyI/YOCupOCuteCuseCuvuCuqSDgrprgrrDgrq7gr406ICIke2kuaW5jbHVkZXN9IiDgrpAg4K6J4K6z4K+N4K6z4K6f4K6V4K+N4K6VIOCuteCvh+Cuo+CvjeCun+CvgeCuruCvjWA6aS5mb3JtYXQ9PT0icmVnZXgiP2DgrqTgrrXgrrHgrr7grqkg4K6a4K6w4K6u4K+NOiAke2kucGF0dGVybn0g4K6u4K+B4K6x4K+I4K6q4K6+4K6f4K+N4K6f4K+B4K6f4K6p4K+NIOCuquCviuCusOCvgeCuqOCvjeCupCDgrrXgr4fgrqPgr43grp/gr4Hgrq7gr41gOmDgrqTgrrXgrrHgrr7grqkgJHtyW2kuZm9ybWF0XT8/ZS5mb3JtYXR9YH1jYXNlIm5vdF9tdWx0aXBsZV9vZiI6cmV0dXJuYOCupOCuteCuseCuvuCuqSDgro7grqPgr406ICR7ZS5kaXZpc29yfSDgrofgrqngr40g4K6q4K6y4K6u4K6+4K6VIOCuh+CusOCvgeCuleCvjeCulSDgrrXgr4fgrqPgr43grp/gr4Hgrq7gr41gO2Nhc2UidW5yZWNvZ25pemVkX2tleXMiOnJldHVybmDgroXgrp/gr4jgrq/grr7grrPgrq7gr40g4K6k4K+G4K6w4K6/4K6v4K6+4K6kIOCuteCuv+CumuCviCR7ZS5rZXlzLmxlbmd0aD4xPyLgrpXgrrPgr40iOiIifTogJHtfKGUua2V5cywiLCAiKX1gO2Nhc2UiaW52YWxpZF9rZXkiOnJldHVybmAke2Uub3JpZ2lufSDgrofgrrLgr40g4K6k4K614K6x4K6+4K6pIOCuteCuv+CumuCviGA7Y2FzZSJpbnZhbGlkX3VuaW9uIjpyZXR1cm4i4K6k4K614K6x4K6+4K6pIOCuieCus+CvjeCus+CvgOCun+CvgSI7Y2FzZSJpbnZhbGlkX2VsZW1lbnQiOnJldHVybmAke2Uub3JpZ2lufSDgrofgrrLgr40g4K6k4K614K6x4K6+4K6pIOCuruCupOCuv+CuquCvjeCuquCvgWA7ZGVmYXVsdDpyZXR1cm4i4K6k4K614K6x4K6+4K6pIOCuieCus+CvjeCus+CvgOCun+CvgSJ9fX07ZnVuY3Rpb24gbGcoKXtyZXR1cm57bG9jYWxlRXJyb3I6dWcoKX19Y29uc3QgZGc9KCk9Pntjb25zdCB0PXtzdHJpbmc6e3VuaXQ6IuC4leC4seC4p+C4reC4seC4geC4qeC4oyIsdmVyYjoi4LiE4Lin4Lij4Lih4Li1In0sZmlsZTp7dW5pdDoi4LmE4Lia4LiV4LmMIix2ZXJiOiLguITguKfguKPguKHguLUifSxhcnJheTp7dW5pdDoi4Lij4Liy4Lii4LiB4Liy4LijIix2ZXJiOiLguITguKfguKPguKHguLUifSxzZXQ6e3VuaXQ6IuC4o+C4suC4ouC4geC4suC4oyIsdmVyYjoi4LiE4Lin4Lij4Lih4Li1In19O2Z1bmN0aW9uIG4oZSl7cmV0dXJuIHRbZV0/P251bGx9Y29uc3Qgcj17cmVnZXg6IuC4guC5ieC4reC4oeC4ueC4peC4l+C4teC5iOC4m+C5ieC4reC4mSIsZW1haWw6IuC4l+C4teC5iOC4reC4ouC4ueC5iOC4reC4teC5gOC4oeC4pSIsdXJsOiJVUkwiLGVtb2ppOiLguK3guLTguYLguKHguIjguLQiLHV1aWQ6IlVVSUQiLHV1aWR2NDoiVVVJRHY0Iix1dWlkdjY6IlVVSUR2NiIsbmFub2lkOiJuYW5vaWQiLGd1aWQ6IkdVSUQiLGN1aWQ6ImN1aWQiLGN1aWQyOiJjdWlkMiIsdWxpZDoiVUxJRCIseGlkOiJYSUQiLGtzdWlkOiJLU1VJRCIsZGF0ZXRpbWU6IuC4p+C4seC4meC4l+C4teC5iOC5gOC4p+C4peC4suC5geC4muC4miBJU08iLGRhdGU6IuC4p+C4seC4meC4l+C4teC5iOC5geC4muC4miBJU08iLHRpbWU6IuC5gOC4p+C4peC4suC5geC4muC4miBJU08iLGR1cmF0aW9uOiLguIrguYjguKfguIfguYDguKfguKXguLLguYHguJrguJogSVNPIixpcHY0OiLguJfguLXguYjguK3guKLguLnguYggSVB2NCIsaXB2Njoi4LiX4Li14LmI4Lit4Lii4Li54LmIIElQdjYiLGNpZHJ2NDoi4LiK4LmI4Lin4LiHIElQIOC5geC4muC4miBJUHY0IixjaWRydjY6IuC4iuC5iOC4p+C4hyBJUCDguYHguJrguJogSVB2NiIsYmFzZTY0OiLguILguYnguK3guITguKfguLLguKHguYHguJrguJogQmFzZTY0IixiYXNlNjR1cmw6IuC4guC5ieC4reC4hOC4p+C4suC4oeC5geC4muC4miBCYXNlNjQg4Liq4Liz4Lir4Lij4Lix4LiaIFVSTCIsanNvbl9zdHJpbmc6IuC4guC5ieC4reC4hOC4p+C4suC4oeC5geC4muC4miBKU09OIixlMTY0OiLguYDguJrguK3guKPguYzguYLguJfguKPguKjguLHguJ7guJfguYzguKPguLDguKvguKfguYjguLLguIfguJvguKPguLDguYDguJfguKggKEUuMTY0KSIsand0OiLguYLguJfguYDguITguJkgSldUIix0ZW1wbGF0ZV9saXRlcmFsOiLguILguYnguK3guKHguLnguKXguJfguLXguYjguJvguYnguK3guJkifSxvPXtuYW46Ik5hTiIsbnVtYmVyOiLguJXguLHguKfguYDguKXguIIiLGFycmF5OiLguK3guLLguKPguYzguYDguKPguKLguYwgKEFycmF5KSIsbnVsbDoi4LmE4Lih4LmI4Lih4Li14LiE4LmI4LiyIChudWxsKSJ9O3JldHVybiBlPT57c3dpdGNoKGUuY29kZSl7Y2FzZSJpbnZhbGlkX3R5cGUiOntjb25zdCBpPW9bZS5leHBlY3RlZF0/P2UuZXhwZWN0ZWQsYT13KGUuaW5wdXQpLHM9b1thXT8/YTtyZXR1cm4vXltBLVpdLy50ZXN0KGUuZXhwZWN0ZWQpP2DguJvguKPguLDguYDguKDguJfguILguYnguK3guKHguLnguKXguYTguKHguYjguJbguLnguIHguJXguYnguK3guIc6IOC4hOC4p+C4o+C5gOC4m+C5h+C4mSBpbnN0YW5jZW9mICR7ZS5leHBlY3RlZH0g4LmB4LiV4LmI4LmE4LiU4LmJ4Lij4Lix4LiaICR7c31gOmDguJvguKPguLDguYDguKDguJfguILguYnguK3guKHguLnguKXguYTguKHguYjguJbguLnguIHguJXguYnguK3guIc6IOC4hOC4p+C4o+C5gOC4m+C5h+C4mSAke2l9IOC5geC4leC5iOC5hOC4lOC5ieC4o+C4seC4miAke3N9YH1jYXNlImludmFsaWRfdmFsdWUiOnJldHVybiBlLnZhbHVlcy5sZW5ndGg9PT0xP2DguITguYjguLLguYTguKHguYjguJbguLnguIHguJXguYnguK3guIc6IOC4hOC4p+C4o+C5gOC4m+C5h+C4mSAke1MoZS52YWx1ZXNbMF0pfWA6YOC4leC4seC4p+C5gOC4peC4t+C4reC4geC5hOC4oeC5iOC4luC4ueC4geC4leC5ieC4reC4hzog4LiE4Lin4Lij4LmA4Lib4LmH4LiZ4Lir4LiZ4Li24LmI4LiH4LmD4LiZICR7XyhlLnZhbHVlcywifCIpfWA7Y2FzZSJ0b29fYmlnIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8i4LmE4Lih4LmI4LmA4LiB4Li04LiZIjoi4LiZ4LmJ4Lit4Lii4LiB4Lin4LmI4LiyIixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2DguYDguIHguLTguJnguIHguLPguKvguJnguJQ6ICR7ZS5vcmlnaW4/PyLguITguYjguLIifSDguITguKfguKPguKHguLUke2l9ICR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0Pz8i4Lij4Liy4Lii4LiB4Liy4LijIn1gOmDguYDguIHguLTguJnguIHguLPguKvguJnguJQ6ICR7ZS5vcmlnaW4/PyLguITguYjguLIifSDguITguKfguKPguKHguLUke2l9ICR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9YH1jYXNlInRvb19zbWFsbCI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/IuC4reC4ouC5iOC4suC4h+C4meC5ieC4reC4oiI6IuC4oeC4suC4geC4geC4p+C5iOC4siIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9g4LiZ4LmJ4Lit4Lii4LiB4Lin4LmI4Liy4LiB4Liz4Lir4LiZ4LiUOiAke2Uub3JpZ2lufSDguITguKfguKPguKHguLUke2l9ICR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0fWA6YOC4meC5ieC4reC4ouC4geC4p+C5iOC4suC4geC4s+C4q+C4meC4lDogJHtlLm9yaWdpbn0g4LiE4Lin4Lij4Lih4Li1JHtpfSAke2UubWluaW11bS50b1N0cmluZygpfWB9Y2FzZSJpbnZhbGlkX2Zvcm1hdCI6e2NvbnN0IGk9ZTtyZXR1cm4gaS5mb3JtYXQ9PT0ic3RhcnRzX3dpdGgiP2DguKPguLnguJvguYHguJrguJrguYTguKHguYjguJbguLnguIHguJXguYnguK3guIc6IOC4guC5ieC4reC4hOC4p+C4suC4oeC4leC5ieC4reC4h+C4guC4tuC5ieC4meC4leC5ieC4meC4lOC5ieC4p+C4oiAiJHtpLnByZWZpeH0iYDppLmZvcm1hdD09PSJlbmRzX3dpdGgiP2DguKPguLnguJvguYHguJrguJrguYTguKHguYjguJbguLnguIHguJXguYnguK3guIc6IOC4guC5ieC4reC4hOC4p+C4suC4oeC4leC5ieC4reC4h+C4peC4h+C4l+C5ieC4suC4ouC4lOC5ieC4p+C4oiAiJHtpLnN1ZmZpeH0iYDppLmZvcm1hdD09PSJpbmNsdWRlcyI/YOC4o+C4ueC4m+C5geC4muC4muC5hOC4oeC5iOC4luC4ueC4geC4leC5ieC4reC4hzog4LiC4LmJ4Lit4LiE4Lin4Liy4Lih4LiV4LmJ4Lit4LiH4Lih4Li1ICIke2kuaW5jbHVkZXN9IiDguK3guKLguLnguYjguYPguJnguILguYnguK3guITguKfguLLguKFgOmkuZm9ybWF0PT09InJlZ2V4Ij9g4Lij4Li54Lib4LmB4Lia4Lia4LmE4Lih4LmI4LiW4Li54LiB4LiV4LmJ4Lit4LiHOiDguJXguYnguK3guIfguJXguKPguIfguIHguLHguJrguKPguLnguJvguYHguJrguJrguJfguLXguYjguIHguLPguKvguJnguJQgJHtpLnBhdHRlcm59YDpg4Lij4Li54Lib4LmB4Lia4Lia4LmE4Lih4LmI4LiW4Li54LiB4LiV4LmJ4Lit4LiHOiAke3JbaS5mb3JtYXRdPz9lLmZvcm1hdH1gfWNhc2Uibm90X211bHRpcGxlX29mIjpyZXR1cm5g4LiV4Lix4Lin4LmA4Lil4LiC4LmE4Lih4LmI4LiW4Li54LiB4LiV4LmJ4Lit4LiHOiDguJXguYnguK3guIfguYDguJvguYfguJnguIjguLPguJnguKfguJnguJfguLXguYjguKvguLLguKPguJTguYnguKfguKIgJHtlLmRpdmlzb3J9IOC5hOC4lOC5ieC4peC4h+C4leC4seC4p2A7Y2FzZSJ1bnJlY29nbml6ZWRfa2V5cyI6cmV0dXJuYOC4nuC4muC4hOC4teC4ouC5jOC4l+C4teC5iOC5hOC4oeC5iOC4o+C4ueC5ieC4iOC4seC4gTogJHtfKGUua2V5cywiLCAiKX1gO2Nhc2UiaW52YWxpZF9rZXkiOnJldHVybmDguITguLXguKLguYzguYTguKHguYjguJbguLnguIHguJXguYnguK3guIfguYPguJkgJHtlLm9yaWdpbn1gO2Nhc2UiaW52YWxpZF91bmlvbiI6cmV0dXJuIuC4guC5ieC4reC4oeC4ueC4peC5hOC4oeC5iOC4luC4ueC4geC4leC5ieC4reC4hzog4LmE4Lih4LmI4LiV4Lij4LiH4LiB4Lix4Lia4Lij4Li54Lib4LmB4Lia4Lia4Lii4Li54LmA4LiZ4Li14Lii4LiZ4LiX4Li14LmI4LiB4Liz4Lir4LiZ4LiU4LmE4Lin4LmJIjtjYXNlImludmFsaWRfZWxlbWVudCI6cmV0dXJuYOC4guC5ieC4reC4oeC4ueC4peC5hOC4oeC5iOC4luC4ueC4geC4leC5ieC4reC4h+C5g+C4mSAke2Uub3JpZ2lufWA7ZGVmYXVsdDpyZXR1cm4i4LiC4LmJ4Lit4Lih4Li54Lil4LmE4Lih4LmI4LiW4Li54LiB4LiV4LmJ4Lit4LiHIn19fTtmdW5jdGlvbiBtZygpe3JldHVybntsb2NhbGVFcnJvcjpkZygpfX1jb25zdCBwZz0oKT0+e2NvbnN0IHQ9e3N0cmluZzp7dW5pdDoia2FyYWt0ZXIiLHZlcmI6Im9sbWFsxLEifSxmaWxlOnt1bml0OiJiYXl0Iix2ZXJiOiJvbG1hbMSxIn0sYXJyYXk6e3VuaXQ6IsO2xJ9lIix2ZXJiOiJvbG1hbMSxIn0sc2V0Ont1bml0OiLDtsSfZSIsdmVyYjoib2xtYWzEsSJ9fTtmdW5jdGlvbiBuKGUpe3JldHVybiB0W2VdPz9udWxsfWNvbnN0IHI9e3JlZ2V4OiJnaXJkaSIsZW1haWw6ImUtcG9zdGEgYWRyZXNpIix1cmw6IlVSTCIsZW1vamk6ImVtb2ppIix1dWlkOiJVVUlEIix1dWlkdjQ6IlVVSUR2NCIsdXVpZHY2OiJVVUlEdjYiLG5hbm9pZDoibmFub2lkIixndWlkOiJHVUlEIixjdWlkOiJjdWlkIixjdWlkMjoiY3VpZDIiLHVsaWQ6IlVMSUQiLHhpZDoiWElEIixrc3VpZDoiS1NVSUQiLGRhdGV0aW1lOiJJU08gdGFyaWggdmUgc2FhdCIsZGF0ZToiSVNPIHRhcmloIix0aW1lOiJJU08gc2FhdCIsZHVyYXRpb246IklTTyBzw7xyZSIsaXB2NDoiSVB2NCBhZHJlc2kiLGlwdjY6IklQdjYgYWRyZXNpIixjaWRydjQ6IklQdjQgYXJhbMSxxJ/EsSIsY2lkcnY2OiJJUHY2IGFyYWzEscSfxLEiLGJhc2U2NDoiYmFzZTY0IGlsZSDFn2lmcmVsZW5tacWfIG1ldGluIixiYXNlNjR1cmw6ImJhc2U2NHVybCBpbGUgxZ9pZnJlbGVubWnFnyBtZXRpbiIsanNvbl9zdHJpbmc6IkpTT04gZGl6ZXNpIixlMTY0OiJFLjE2NCBzYXnEsXPEsSIsand0OiJKV1QiLHRlbXBsYXRlX2xpdGVyYWw6IsWeYWJsb24gZGl6ZXNpIn0sbz17bmFuOiJOYU4ifTtyZXR1cm4gZT0+e3N3aXRjaChlLmNvZGUpe2Nhc2UiaW52YWxpZF90eXBlIjp7Y29uc3QgaT1vW2UuZXhwZWN0ZWRdPz9lLmV4cGVjdGVkLGE9dyhlLmlucHV0KSxzPW9bYV0/P2E7cmV0dXJuL15bQS1aXS8udGVzdChlLmV4cGVjdGVkKT9gR2XDp2Vyc2l6IGRlxJ9lcjogYmVrbGVuZW4gaW5zdGFuY2VvZiAke2UuZXhwZWN0ZWR9LCBhbMSxbmFuICR7c31gOmBHZcOnZXJzaXogZGXEn2VyOiBiZWtsZW5lbiAke2l9LCBhbMSxbmFuICR7c31gfWNhc2UiaW52YWxpZF92YWx1ZSI6cmV0dXJuIGUudmFsdWVzLmxlbmd0aD09PTE/YEdlw6dlcnNpeiBkZcSfZXI6IGJla2xlbmVuICR7UyhlLnZhbHVlc1swXSl9YDpgR2XDp2Vyc2l6IHNlw6dlbmVrOiBhxZ9hxJ/EsWRha2lsZXJkZW4gYmlyaSBvbG1hbMSxOiAke18oZS52YWx1ZXMsInwiKX1gO2Nhc2UidG9vX2JpZyI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ijw9IjoiPCIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9gw4dvayBiw7x5w7xrOiBiZWtsZW5lbiAke2Uub3JpZ2luPz8iZGXEn2VyIn0gJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0Pz8iw7bEn2UifWA6YMOHb2sgYsO8ecO8azogYmVrbGVuZW4gJHtlLm9yaWdpbj8/ImRlxJ9lciJ9ICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfWB9Y2FzZSJ0b29fc21hbGwiOntjb25zdCBpPWUuaW5jbHVzaXZlPyI+PSI6Ij4iLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YMOHb2sga8O8w6fDvGs6IGJla2xlbmVuICR7ZS5vcmlnaW59ICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfSAke2EudW5pdH1gOmDDh29rIGvDvMOnw7xrOiBiZWtsZW5lbiAke2Uub3JpZ2lufSAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX1gfWNhc2UiaW52YWxpZF9mb3JtYXQiOntjb25zdCBpPWU7cmV0dXJuIGkuZm9ybWF0PT09InN0YXJ0c193aXRoIj9gR2XDp2Vyc2l6IG1ldGluOiAiJHtpLnByZWZpeH0iIGlsZSBiYcWfbGFtYWzEsWA6aS5mb3JtYXQ9PT0iZW5kc193aXRoIj9gR2XDp2Vyc2l6IG1ldGluOiAiJHtpLnN1ZmZpeH0iIGlsZSBiaXRtZWxpYDppLmZvcm1hdD09PSJpbmNsdWRlcyI/YEdlw6dlcnNpeiBtZXRpbjogIiR7aS5pbmNsdWRlc30iIGnDp2VybWVsaWA6aS5mb3JtYXQ9PT0icmVnZXgiP2BHZcOnZXJzaXogbWV0aW46ICR7aS5wYXR0ZXJufSBkZXNlbmluZSB1eW1hbMSxYDpgR2XDp2Vyc2l6ICR7cltpLmZvcm1hdF0/P2UuZm9ybWF0fWB9Y2FzZSJub3RfbXVsdGlwbGVfb2YiOnJldHVybmBHZcOnZXJzaXogc2F5xLE6ICR7ZS5kaXZpc29yfSBpbGUgdGFtIGLDtmzDvG5lYmlsbWVsaWA7Y2FzZSJ1bnJlY29nbml6ZWRfa2V5cyI6cmV0dXJuYFRhbsSxbm1heWFuIGFuYWh0YXIke2Uua2V5cy5sZW5ndGg+MT8ibGFyIjoiIn06ICR7XyhlLmtleXMsIiwgIil9YDtjYXNlImludmFsaWRfa2V5IjpyZXR1cm5gJHtlLm9yaWdpbn0gacOnaW5kZSBnZcOnZXJzaXogYW5haHRhcmA7Y2FzZSJpbnZhbGlkX3VuaW9uIjpyZXR1cm4iR2XDp2Vyc2l6IGRlxJ9lciI7Y2FzZSJpbnZhbGlkX2VsZW1lbnQiOnJldHVybmAke2Uub3JpZ2lufSBpw6dpbmRlIGdlw6dlcnNpeiBkZcSfZXJgO2RlZmF1bHQ6cmV0dXJuIkdlw6dlcnNpeiBkZcSfZXIifX19O2Z1bmN0aW9uIGZnKCl7cmV0dXJue2xvY2FsZUVycm9yOnBnKCl9fWNvbnN0IGdnPSgpPT57Y29uc3QgdD17c3RyaW5nOnt1bml0OiLRgdC40LzQstC+0LvRltCyIix2ZXJiOiLQvNCw0YLQuNC80LUifSxmaWxlOnt1bml0OiLQsdCw0LnRgtGW0LIiLHZlcmI6ItC80LDRgtC40LzQtSJ9LGFycmF5Ont1bml0OiLQtdC70LXQvNC10L3RgtGW0LIiLHZlcmI6ItC80LDRgtC40LzQtSJ9LHNldDp7dW5pdDoi0LXQu9C10LzQtdC90YLRltCyIix2ZXJiOiLQvNCw0YLQuNC80LUifX07ZnVuY3Rpb24gbihlKXtyZXR1cm4gdFtlXT8/bnVsbH1jb25zdCByPXtyZWdleDoi0LLRhdGW0LTQvdGWINC00LDQvdGWIixlbWFpbDoi0LDQtNGA0LXRgdCwINC10LvQtdC60YLRgNC+0L3QvdC+0Zcg0L/QvtGI0YLQuCIsdXJsOiJVUkwiLGVtb2ppOiLQtdC80L7QtNC30ZYiLHV1aWQ6IlVVSUQiLHV1aWR2NDoiVVVJRHY0Iix1dWlkdjY6IlVVSUR2NiIsbmFub2lkOiJuYW5vaWQiLGd1aWQ6IkdVSUQiLGN1aWQ6ImN1aWQiLGN1aWQyOiJjdWlkMiIsdWxpZDoiVUxJRCIseGlkOiJYSUQiLGtzdWlkOiJLU1VJRCIsZGF0ZXRpbWU6ItC00LDRgtCwINGC0LAg0YfQsNGBIElTTyIsZGF0ZToi0LTQsNGC0LAgSVNPIix0aW1lOiLRh9Cw0YEgSVNPIixkdXJhdGlvbjoi0YLRgNC40LLQsNC70ZbRgdGC0YwgSVNPIixpcHY0OiLQsNC00YDQtdGB0LAgSVB2NCIsaXB2Njoi0LDQtNGA0LXRgdCwIElQdjYiLGNpZHJ2NDoi0LTRltCw0L/QsNC30L7QvSBJUHY0IixjaWRydjY6ItC00ZbQsNC/0LDQt9C+0L0gSVB2NiIsYmFzZTY0OiLRgNGP0LTQvtC6INGDINC60L7QtNGD0LLQsNC90L3RliBiYXNlNjQiLGJhc2U2NHVybDoi0YDRj9C00L7QuiDRgyDQutC+0LTRg9Cy0LDQvdC90ZYgYmFzZTY0dXJsIixqc29uX3N0cmluZzoi0YDRj9C00L7QuiBKU09OIixlMTY0OiLQvdC+0LzQtdGAIEUuMTY0Iixqd3Q6IkpXVCIsdGVtcGxhdGVfbGl0ZXJhbDoi0LLRhdGW0LTQvdGWINC00LDQvdGWIn0sbz17bmFuOiJOYU4iLG51bWJlcjoi0YfQuNGB0LvQviIsYXJyYXk6ItC80LDRgdC40LIifTtyZXR1cm4gZT0+e3N3aXRjaChlLmNvZGUpe2Nhc2UiaW52YWxpZF90eXBlIjp7Y29uc3QgaT1vW2UuZXhwZWN0ZWRdPz9lLmV4cGVjdGVkLGE9dyhlLmlucHV0KSxzPW9bYV0/P2E7cmV0dXJuL15bQS1aXS8udGVzdChlLmV4cGVjdGVkKT9g0J3QtdC/0YDQsNCy0LjQu9GM0L3RliDQstGF0ZbQtNC90ZYg0LTQsNC90ZY6INC+0YfRltC60YPRlNGC0YzRgdGPIGluc3RhbmNlb2YgJHtlLmV4cGVjdGVkfSwg0L7RgtGA0LjQvNCw0L3QviAke3N9YDpg0J3QtdC/0YDQsNCy0LjQu9GM0L3RliDQstGF0ZbQtNC90ZYg0LTQsNC90ZY6INC+0YfRltC60YPRlNGC0YzRgdGPICR7aX0sINC+0YLRgNC40LzQsNC90L4gJHtzfWB9Y2FzZSJpbnZhbGlkX3ZhbHVlIjpyZXR1cm4gZS52YWx1ZXMubGVuZ3RoPT09MT9g0J3QtdC/0YDQsNCy0LjQu9GM0L3RliDQstGF0ZbQtNC90ZYg0LTQsNC90ZY6INC+0YfRltC60YPRlNGC0YzRgdGPICR7UyhlLnZhbHVlc1swXSl9YDpg0J3QtdC/0YDQsNCy0LjQu9GM0L3QsCDQvtC/0YbRltGPOiDQvtGH0ZbQutGD0ZTRgtGM0YHRjyDQvtC00L3QtSDQtyAke18oZS52YWx1ZXMsInwiKX1gO2Nhc2UidG9vX2JpZyI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ijw9IjoiPCIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9g0JfQsNC90LDQtNGC0L4g0LLQtdC70LjQutC1OiDQvtGH0ZbQutGD0ZTRgtGM0YHRjywg0YnQviAke2Uub3JpZ2luPz8i0LfQvdCw0YfQtdC90L3RjyJ9ICR7YS52ZXJifSAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX0gJHthLnVuaXQ/PyLQtdC70LXQvNC10L3RgtGW0LIifWA6YNCX0LDQvdCw0LTRgtC+INCy0LXQu9C40LrQtTog0L7Rh9GW0LrRg9GU0YLRjNGB0Y8sINGJ0L4gJHtlLm9yaWdpbj8/ItC30L3QsNGH0LXQvdC90Y8ifSDQsdGD0LTQtSAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX1gfWNhc2UidG9vX3NtYWxsIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPj0iOiI+IixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2DQl9Cw0L3QsNC00YLQviDQvNCw0LvQtTog0L7Rh9GW0LrRg9GU0YLRjNGB0Y8sINGJ0L4gJHtlLm9yaWdpbn0gJHthLnZlcmJ9ICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfSAke2EudW5pdH1gOmDQl9Cw0L3QsNC00YLQviDQvNCw0LvQtTog0L7Rh9GW0LrRg9GU0YLRjNGB0Y8sINGJ0L4gJHtlLm9yaWdpbn0g0LHRg9C00LUgJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9YH1jYXNlImludmFsaWRfZm9ybWF0Ijp7Y29uc3QgaT1lO3JldHVybiBpLmZvcm1hdD09PSJzdGFydHNfd2l0aCI/YNCd0LXQv9GA0LDQstC40LvRjNC90LjQuSDRgNGP0LTQvtC6OiDQv9C+0LLQuNC90LXQvSDQv9C+0YfQuNC90LDRgtC40YHRjyDQtyAiJHtpLnByZWZpeH0iYDppLmZvcm1hdD09PSJlbmRzX3dpdGgiP2DQndC10L/RgNCw0LLQuNC70YzQvdC40Lkg0YDRj9C00L7Qujog0L/QvtCy0LjQvdC10L0g0LfQsNC60ZbQvdGH0YPQstCw0YLQuNGB0Y8g0L3QsCAiJHtpLnN1ZmZpeH0iYDppLmZvcm1hdD09PSJpbmNsdWRlcyI/YNCd0LXQv9GA0LDQstC40LvRjNC90LjQuSDRgNGP0LTQvtC6OiDQv9C+0LLQuNC90LXQvSDQvNGW0YHRgtC40YLQuCAiJHtpLmluY2x1ZGVzfSJgOmkuZm9ybWF0PT09InJlZ2V4Ij9g0J3QtdC/0YDQsNCy0LjQu9GM0L3QuNC5INGA0Y/QtNC+0Lo6INC/0L7QstC40L3QtdC9INCy0ZbQtNC/0L7QstGW0LTQsNGC0Lgg0YjQsNCx0LvQvtC90YMgJHtpLnBhdHRlcm59YDpg0J3QtdC/0YDQsNCy0LjQu9GM0L3QuNC5ICR7cltpLmZvcm1hdF0/P2UuZm9ybWF0fWB9Y2FzZSJub3RfbXVsdGlwbGVfb2YiOnJldHVybmDQndC10L/RgNCw0LLQuNC70YzQvdC1INGH0LjRgdC70L46INC/0L7QstC40L3QvdC+INCx0YPRgtC4INC60YDQsNGC0L3QuNC8ICR7ZS5kaXZpc29yfWA7Y2FzZSJ1bnJlY29nbml6ZWRfa2V5cyI6cmV0dXJuYNCd0LXRgNC+0LfQv9GW0LfQvdCw0L3QuNC5INC60LvRjtGHJHtlLmtleXMubGVuZ3RoPjE/ItGWIjoiIn06ICR7XyhlLmtleXMsIiwgIil9YDtjYXNlImludmFsaWRfa2V5IjpyZXR1cm5g0J3QtdC/0YDQsNCy0LjQu9GM0L3QuNC5INC60LvRjtGHINGDICR7ZS5vcmlnaW59YDtjYXNlImludmFsaWRfdW5pb24iOnJldHVybiLQndC10L/RgNCw0LLQuNC70YzQvdGWINCy0YXRltC00L3RliDQtNCw0L3RliI7Y2FzZSJpbnZhbGlkX2VsZW1lbnQiOnJldHVybmDQndC10L/RgNCw0LLQuNC70YzQvdC1INC30L3QsNGH0LXQvdC90Y8g0YMgJHtlLm9yaWdpbn1gO2RlZmF1bHQ6cmV0dXJuItCd0LXQv9GA0LDQstC40LvRjNC90ZYg0LLRhdGW0LTQvdGWINC00LDQvdGWIn19fTtmdW5jdGlvbiBUbCgpe3JldHVybntsb2NhbGVFcnJvcjpnZygpfX1mdW5jdGlvbiB2Zygpe3JldHVybiBUbCgpfWNvbnN0IGhnPSgpPT57Y29uc3QgdD17c3RyaW5nOnt1bml0OiLYrdix2YjZgSIsdmVyYjoi24HZiNmG2KcifSxmaWxlOnt1bml0OiLYqNin2KbZudizIix2ZXJiOiLbgdmI2YbYpyJ9LGFycmF5Ont1bml0OiLYotim2bnZhdiyIix2ZXJiOiLbgdmI2YbYpyJ9LHNldDp7dW5pdDoi2KLYptm52YXYsiIsdmVyYjoi24HZiNmG2KcifX07ZnVuY3Rpb24gbihlKXtyZXR1cm4gdFtlXT8/bnVsbH1jb25zdCByPXtyZWdleDoi2KfZhiDZvtm5IixlbWFpbDoi2KfbjCDZhduM2YQg2KfbjNqI2LHbjNizIix1cmw6ItuM2Ygg2KLYsSDYp9uM2YQiLGVtb2ppOiLYp9uM2YXZiNis24wiLHV1aWQ6ItuM2Ygg24zZiCDYotim24wg2ojbjCIsdXVpZHY0OiLbjNmIINuM2Ygg2KLYptuMINqI24wg2YjbjCA0Iix1dWlkdjY6ItuM2Ygg24zZiCDYotim24wg2ojbjCDZiNuMIDYiLG5hbm9pZDoi2YbbjNmG2Ygg2KLYptuMINqI24wiLGd1aWQ6Itis24wg24zZiCDYotim24wg2ojbjCIsY3VpZDoi2LPbjCDbjNmIINii2KbbjCDaiNuMIixjdWlkMjoi2LPbjCDbjNmIINii2KbbjCDaiNuMIDIiLHVsaWQ6ItuM2Ygg2KfbjNmEINii2KbbjCDaiNuMIix4aWQ6Itin24zaqdizINii2KbbjCDaiNuMIixrc3VpZDoi2qnbkiDYp9uM2LMg24zZiCDYotim24wg2ojbjCIsZGF0ZXRpbWU6Itii2KbbjCDYp9uM2LMg2KfZiCDaiNuM2bkg2bnYp9im2YUiLGRhdGU6Itii2KbbjCDYp9uM2LMg2KfZiCDYqtin2LHbjNiuIix0aW1lOiLYotim24wg2KfbjNizINin2Ygg2YjZgtiqIixkdXJhdGlvbjoi2KLYptuMINin24zYsyDYp9mIINmF2K/YqiIsaXB2NDoi2KLYptuMINm+24wg2YjbjCA0INin24zaiNix24zYsyIsaXB2Njoi2KLYptuMINm+24wg2YjbjCA2INin24zaiNix24zYsyIsY2lkcnY0OiLYotim24wg2b7bjCDZiNuMIDQg2LHbjNmG2KwiLGNpZHJ2Njoi2KLYptuMINm+24wg2YjbjCA2INix24zZhtisIixiYXNlNjQ6Itio24zYsyA2NCDYp9mGINqp2YjaiNqIINiz2bnYsdmG2q8iLGJhc2U2NHVybDoi2KjbjNizIDY0INuM2Ygg2KLYsSDYp9uM2YQg2KfZhiDaqdmI2ojaiCDYs9m52LHZhtqvIixqc29uX3N0cmluZzoi2KzbkiDYp9uM2LMg2KfZiCDYp9uM2YYg2LPZudix2YbaryIsZTE2NDoi2KfbjCAxNjQg2YbZhdio2LEiLGp3dDoi2KzbkiDaiNio2YTbjNmIINm524wiLHRlbXBsYXRlX2xpdGVyYWw6Itin2YYg2b7ZuSJ9LG89e25hbjoiTmFOIixudW1iZXI6ItmG2YXYqNixIixhcnJheToi2KLYsduSIixudWxsOiLZhtmEIn07cmV0dXJuIGU9Pntzd2l0Y2goZS5jb2RlKXtjYXNlImludmFsaWRfdHlwZSI6e2NvbnN0IGk9b1tlLmV4cGVjdGVkXT8/ZS5leHBlY3RlZCxhPXcoZS5pbnB1dCkscz1vW2FdPz9hO3JldHVybi9eW0EtWl0vLnRlc3QoZS5leHBlY3RlZCk/YNi62YTYtyDYp9mGINm+2bk6IGluc3RhbmNlb2YgJHtlLmV4cGVjdGVkfSDZhdiq2YjZgti5INiq2r7Yp9iMICR7c30g2YXZiNi12YjZhCDbgdmI2KdgOmDYutmE2Lcg2KfZhiDZvtm5OiAke2l9INmF2KrZiNmC2Lkg2Kravtin2IwgJHtzfSDZhdmI2LXZiNmEINuB2YjYp2B9Y2FzZSJpbnZhbGlkX3ZhbHVlIjpyZXR1cm4gZS52YWx1ZXMubGVuZ3RoPT09MT9g2LrZhNi3INin2YYg2b7ZuTogJHtTKGUudmFsdWVzWzBdKX0g2YXYqtmI2YLYuSDYqtq+2KdgOmDYutmE2Lcg2KLZvti02YY6ICR7XyhlLnZhbHVlcywifCIpfSDZhduM2rog2LPbkiDYp9uM2qkg2YXYqtmI2YLYuSDYqtq+2KdgO2Nhc2UidG9vX2JpZyI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ijw9IjoiPCIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9g2KjbgdiqINio2pHYpzogJHtlLm9yaWdpbj8/ItmI24zZhNuM2YgifSDaqduSICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfSAke2EudW5pdD8/Iti52YbYp9i12LEifSDbgdmI2YbbkiDZhdiq2YjZgti5INiq2r7bkmA6YNio24HYqiDYqNqR2Kc6ICR7ZS5vcmlnaW4/PyLZiNuM2YTbjNmIIn0g2qnYpyAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX0g24HZiNmG2Kcg2YXYqtmI2YLYuSDYqtq+2KdgfWNhc2UidG9vX3NtYWxsIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPj0iOiI+IixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2DYqNuB2Kog2obavtmI2bnYpzogJHtlLm9yaWdpbn0g2qnbkiAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX0gJHthLnVuaXR9INuB2YjZhtuSINmF2KrZiNmC2Lkg2KravtuSYDpg2KjbgdiqINqG2r7ZiNm52Kc6ICR7ZS5vcmlnaW59INqp2KcgJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9INuB2YjZhtinINmF2KrZiNmC2Lkg2KravtinYH1jYXNlImludmFsaWRfZm9ybWF0Ijp7Y29uc3QgaT1lO3JldHVybiBpLmZvcm1hdD09PSJzdGFydHNfd2l0aCI/YNi62YTYtyDYs9m52LHZhtqvOiAiJHtpLnByZWZpeH0iINiz25Ig2LTYsdmI2Lkg24HZiNmG2Kcg2obYp9uB24zbkmA6aS5mb3JtYXQ9PT0iZW5kc193aXRoIj9g2LrZhNi3INiz2bnYsdmG2q86ICIke2kuc3VmZml4fSIg2b7YsSDYrtiq2YUg24HZiNmG2Kcg2obYp9uB24zbkmA6aS5mb3JtYXQ9PT0iaW5jbHVkZXMiP2DYutmE2Lcg2LPZudix2YbarzogIiR7aS5pbmNsdWRlc30iINi02KfZhdmEINuB2YjZhtinINqG2KfbgduM25JgOmkuZm9ybWF0PT09InJlZ2V4Ij9g2LrZhNi3INiz2bnYsdmG2q86INm+24zZudix2YYgJHtpLnBhdHRlcm59INiz25Ig2YXbjNqGINuB2YjZhtinINqG2KfbgduM25JgOmDYutmE2LcgJHtyW2kuZm9ybWF0XT8/ZS5mb3JtYXR9YH1jYXNlIm5vdF9tdWx0aXBsZV9vZiI6cmV0dXJuYNi62YTYtyDZhtmF2KjYsTogJHtlLmRpdmlzb3J9INqp2Kcg2YXYttin2LnZgSDbgdmI2YbYpyDahtin24HbjNuSYDtjYXNlInVucmVjb2duaXplZF9rZXlzIjpyZXR1cm5g2LrbjNixINiq2LPZhNuM2YUg2LTYr9uBINqp24wke2Uua2V5cy5sZW5ndGg+MT8i2LIiOiIifTogJHtfKGUua2V5cywi2IwgIil9YDtjYXNlImludmFsaWRfa2V5IjpyZXR1cm5gJHtlLm9yaWdpbn0g2YXbjNq6INi62YTYtyDaqduMYDtjYXNlImludmFsaWRfdW5pb24iOnJldHVybiLYutmE2Lcg2KfZhiDZvtm5IjtjYXNlImludmFsaWRfZWxlbWVudCI6cmV0dXJuYCR7ZS5vcmlnaW59INmF24zauiDYutmE2Lcg2YjbjNmE24zZiGA7ZGVmYXVsdDpyZXR1cm4i2LrZhNi3INin2YYg2b7ZuSJ9fX07ZnVuY3Rpb24gJGcoKXtyZXR1cm57bG9jYWxlRXJyb3I6aGcoKX19Y29uc3QgX2c9KCk9Pntjb25zdCB0PXtzdHJpbmc6e3VuaXQ6ImJlbGdpIix2ZXJiOiJib+KAmGxpc2hpIGtlcmFrIn0sZmlsZTp7dW5pdDoiYmF5dCIsdmVyYjoiYm/igJhsaXNoaSBrZXJhayJ9LGFycmF5Ont1bml0OiJlbGVtZW50Iix2ZXJiOiJib+KAmGxpc2hpIGtlcmFrIn0sc2V0Ont1bml0OiJlbGVtZW50Iix2ZXJiOiJib+KAmGxpc2hpIGtlcmFrIn0sbWFwOnt1bml0OiJ5b3p1diIsdmVyYjoiYm/igJhsaXNoaSBrZXJhayJ9fTtmdW5jdGlvbiBuKGUpe3JldHVybiB0W2VdPz9udWxsfWNvbnN0IHI9e3JlZ2V4OiJraXJpc2giLGVtYWlsOiJlbGVrdHJvbiBwb2NodGEgbWFuemlsaSIsdXJsOiJVUkwiLGVtb2ppOiJlbW9qaSIsdXVpZDoiVVVJRCIsdXVpZHY0OiJVVUlEdjQiLHV1aWR2NjoiVVVJRHY2IixuYW5vaWQ6Im5hbm9pZCIsZ3VpZDoiR1VJRCIsY3VpZDoiY3VpZCIsY3VpZDI6ImN1aWQyIix1bGlkOiJVTElEIix4aWQ6IlhJRCIsa3N1aWQ6IktTVUlEIixkYXRldGltZToiSVNPIHNhbmEgdmEgdmFxdGkiLGRhdGU6IklTTyBzYW5hIix0aW1lOiJJU08gdmFxdCIsZHVyYXRpb246IklTTyBkYXZvbWl5bGlrIixpcHY0OiJJUHY0IG1hbnppbCIsaXB2NjoiSVB2NiBtYW56aWwiLG1hYzoiTUFDIG1hbnppbCIsY2lkcnY0OiJJUHY0IGRpYXBhem9uIixjaWRydjY6IklQdjYgZGlhcGF6b24iLGJhc2U2NDoiYmFzZTY0IGtvZGxhbmdhbiBzYXRyIixiYXNlNjR1cmw6ImJhc2U2NHVybCBrb2RsYW5nYW4gc2F0ciIsanNvbl9zdHJpbmc6IkpTT04gc2F0ciIsZTE2NDoiRS4xNjQgcmFxYW0iLGp3dDoiSldUIix0ZW1wbGF0ZV9saXRlcmFsOiJraXJpc2gifSxvPXtuYW46Ik5hTiIsbnVtYmVyOiJyYXFhbSIsYXJyYXk6Im1hc3NpdiJ9O3JldHVybiBlPT57c3dpdGNoKGUuY29kZSl7Y2FzZSJpbnZhbGlkX3R5cGUiOntjb25zdCBpPW9bZS5leHBlY3RlZF0/P2UuZXhwZWN0ZWQsYT13KGUuaW5wdXQpLHM9b1thXT8/YTtyZXR1cm4vXltBLVpdLy50ZXN0KGUuZXhwZWN0ZWQpP2BOb3Rv4oCYZ+KAmHJpIGtpcmlzaDoga3V0aWxnYW4gaW5zdGFuY2VvZiAke2UuZXhwZWN0ZWR9LCBxYWJ1bCBxaWxpbmdhbiAke3N9YDpgTm90b+KAmGfigJhyaSBraXJpc2g6IGt1dGlsZ2FuICR7aX0sIHFhYnVsIHFpbGluZ2FuICR7c31gfWNhc2UiaW52YWxpZF92YWx1ZSI6cmV0dXJuIGUudmFsdWVzLmxlbmd0aD09PTE/YE5vdG/igJhn4oCYcmkga2lyaXNoOiBrdXRpbGdhbiAke1MoZS52YWx1ZXNbMF0pfWA6YE5vdG/igJhn4oCYcmkgdmFyaWFudDogcXV5aWRhZ2lsYXJkYW4gYmlyaSBrdXRpbGdhbiAke18oZS52YWx1ZXMsInwiKX1gO2Nhc2UidG9vX2JpZyI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ijw9IjoiPCIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9gSnVkYSBrYXR0YToga3V0aWxnYW4gJHtlLm9yaWdpbj8/InFpeW1hdCJ9ICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfSAke2EudW5pdH0gJHthLnZlcmJ9YDpgSnVkYSBrYXR0YToga3V0aWxnYW4gJHtlLm9yaWdpbj8/InFpeW1hdCJ9ICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfWB9Y2FzZSJ0b29fc21hbGwiOntjb25zdCBpPWUuaW5jbHVzaXZlPyI+PSI6Ij4iLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YEp1ZGEga2ljaGlrOiBrdXRpbGdhbiAke2Uub3JpZ2lufSAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX0gJHthLnVuaXR9ICR7YS52ZXJifWA6YEp1ZGEga2ljaGlrOiBrdXRpbGdhbiAke2Uub3JpZ2lufSAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX1gfWNhc2UiaW52YWxpZF9mb3JtYXQiOntjb25zdCBpPWU7cmV0dXJuIGkuZm9ybWF0PT09InN0YXJ0c193aXRoIj9gTm90b+KAmGfigJhyaSBzYXRyOiAiJHtpLnByZWZpeH0iIGJpbGFuIGJvc2hsYW5pc2hpIGtlcmFrYDppLmZvcm1hdD09PSJlbmRzX3dpdGgiP2BOb3Rv4oCYZ+KAmHJpIHNhdHI6ICIke2kuc3VmZml4fSIgYmlsYW4gdHVnYXNoaSBrZXJha2A6aS5mb3JtYXQ9PT0iaW5jbHVkZXMiP2BOb3Rv4oCYZ+KAmHJpIHNhdHI6ICIke2kuaW5jbHVkZXN9IiBuaSBv4oCYeiBpY2hpZ2Egb2xpc2hpIGtlcmFrYDppLmZvcm1hdD09PSJyZWdleCI/YE5vdG/igJhn4oCYcmkgc2F0cjogJHtpLnBhdHRlcm59IHNoYWJsb25pZ2EgbW9zIGtlbGlzaGkga2VyYWtgOmBOb3Rv4oCYZ+KAmHJpICR7cltpLmZvcm1hdF0/P2UuZm9ybWF0fWB9Y2FzZSJub3RfbXVsdGlwbGVfb2YiOnJldHVybmBOb3Rv4oCYZ+KAmHJpIHJhcWFtOiAke2UuZGl2aXNvcn0gbmluZyBrYXJyYWxpc2kgYm/igJhsaXNoaSBrZXJha2A7Y2FzZSJ1bnJlY29nbml6ZWRfa2V5cyI6cmV0dXJuYE5vbWHigJlsdW0ga2FsaXQke2Uua2V5cy5sZW5ndGg+MT8ibGFyIjoiIn06ICR7XyhlLmtleXMsIiwgIil9YDtjYXNlImludmFsaWRfa2V5IjpyZXR1cm5gJHtlLm9yaWdpbn0gZGFnaSBrYWxpdCBub3Rv4oCYZ+KAmHJpYDtjYXNlImludmFsaWRfdW5pb24iOnJldHVybiJOb3Rv4oCYZ+KAmHJpIGtpcmlzaCI7Y2FzZSJpbnZhbGlkX2VsZW1lbnQiOnJldHVybmAke2Uub3JpZ2lufSBkYSBub3Rv4oCYZ+KAmHJpIHFpeW1hdGA7ZGVmYXVsdDpyZXR1cm4iTm90b+KAmGfigJhyaSBraXJpc2gifX19O2Z1bmN0aW9uIGJnKCl7cmV0dXJue2xvY2FsZUVycm9yOl9nKCl9fWNvbnN0IHlnPSgpPT57Y29uc3QgdD17c3RyaW5nOnt1bml0OiJrw70gdOG7sSIsdmVyYjoiY8OzIn0sZmlsZTp7dW5pdDoiYnl0ZSIsdmVyYjoiY8OzIn0sYXJyYXk6e3VuaXQ6InBo4bqnbiB04butIix2ZXJiOiJjw7MifSxzZXQ6e3VuaXQ6InBo4bqnbiB04butIix2ZXJiOiJjw7MifX07ZnVuY3Rpb24gbihlKXtyZXR1cm4gdFtlXT8/bnVsbH1jb25zdCByPXtyZWdleDoixJHhuqd1IHbDoG8iLGVtYWlsOiLEkeG7i2EgY2jhu4kgZW1haWwiLHVybDoiVVJMIixlbW9qaToiZW1vamkiLHV1aWQ6IlVVSUQiLHV1aWR2NDoiVVVJRHY0Iix1dWlkdjY6IlVVSUR2NiIsbmFub2lkOiJuYW5vaWQiLGd1aWQ6IkdVSUQiLGN1aWQ6ImN1aWQiLGN1aWQyOiJjdWlkMiIsdWxpZDoiVUxJRCIseGlkOiJYSUQiLGtzdWlkOiJLU1VJRCIsZGF0ZXRpbWU6Im5nw6B5IGdp4budIElTTyIsZGF0ZToibmfDoHkgSVNPIix0aW1lOiJnaeG7nSBJU08iLGR1cmF0aW9uOiJraG/huqNuZyB0aOG7nWkgZ2lhbiBJU08iLGlwdjQ6IsSR4buLYSBjaOG7iSBJUHY0IixpcHY2OiLEkeG7i2EgY2jhu4kgSVB2NiIsY2lkcnY0OiJk4bqjaSBJUHY0IixjaWRydjY6ImThuqNpIElQdjYiLGJhc2U2NDoiY2h14buXaSBtw6MgaMOzYSBiYXNlNjQiLGJhc2U2NHVybDoiY2h14buXaSBtw6MgaMOzYSBiYXNlNjR1cmwiLGpzb25fc3RyaW5nOiJjaHXhu5dpIEpTT04iLGUxNjQ6InPhu5EgRS4xNjQiLGp3dDoiSldUIix0ZW1wbGF0ZV9saXRlcmFsOiLEkeG6p3UgdsOgbyJ9LG89e25hbjoiTmFOIixudW1iZXI6InPhu5EiLGFycmF5OiJt4bqjbmcifTtyZXR1cm4gZT0+e3N3aXRjaChlLmNvZGUpe2Nhc2UiaW52YWxpZF90eXBlIjp7Y29uc3QgaT1vW2UuZXhwZWN0ZWRdPz9lLmV4cGVjdGVkLGE9dyhlLmlucHV0KSxzPW9bYV0/P2E7cmV0dXJuL15bQS1aXS8udGVzdChlLmV4cGVjdGVkKT9gxJDhuqd1IHbDoG8ga2jDtG5nIGjhu6NwIGzhu4c6IG1vbmcgxJHhu6NpIGluc3RhbmNlb2YgJHtlLmV4cGVjdGVkfSwgbmjhuq1uIMSRxrDhu6NjICR7c31gOmDEkOG6p3UgdsOgbyBraMO0bmcgaOG7o3AgbOG7hzogbW9uZyDEkeG7o2kgJHtpfSwgbmjhuq1uIMSRxrDhu6NjICR7c31gfWNhc2UiaW52YWxpZF92YWx1ZSI6cmV0dXJuIGUudmFsdWVzLmxlbmd0aD09PTE/YMSQ4bqndSB2w6BvIGtow7RuZyBo4bujcCBs4buHOiBtb25nIMSR4bujaSAke1MoZS52YWx1ZXNbMF0pfWA6YFTDuXkgY2jhu41uIGtow7RuZyBo4bujcCBs4buHOiBtb25nIMSR4bujaSBt4buZdCB0cm9uZyBjw6FjIGdpw6EgdHLhu4sgJHtfKGUudmFsdWVzLCJ8Iil9YDtjYXNlInRvb19iaWciOntjb25zdCBpPWUuaW5jbHVzaXZlPyI8PSI6IjwiLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YFF1w6EgbOG7m246IG1vbmcgxJHhu6NpICR7ZS5vcmlnaW4/PyJnacOhIHRy4buLIn0gJHthLnZlcmJ9ICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfSAke2EudW5pdD8/InBo4bqnbiB04butIn1gOmBRdcOhIGzhu5tuOiBtb25nIMSR4bujaSAke2Uub3JpZ2luPz8iZ2nDoSB0cuG7iyJ9ICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfWB9Y2FzZSJ0b29fc21hbGwiOntjb25zdCBpPWUuaW5jbHVzaXZlPyI+PSI6Ij4iLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YFF1w6Egbmjhu486IG1vbmcgxJHhu6NpICR7ZS5vcmlnaW59ICR7YS52ZXJifSAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX0gJHthLnVuaXR9YDpgUXXDoSBuaOG7jzogbW9uZyDEkeG7o2kgJHtlLm9yaWdpbn0gJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9YH1jYXNlImludmFsaWRfZm9ybWF0Ijp7Y29uc3QgaT1lO3JldHVybiBpLmZvcm1hdD09PSJzdGFydHNfd2l0aCI/YENodeG7l2kga2jDtG5nIGjhu6NwIGzhu4c6IHBo4bqjaSBi4bqvdCDEkeG6p3UgYuG6sW5nICIke2kucHJlZml4fSJgOmkuZm9ybWF0PT09ImVuZHNfd2l0aCI/YENodeG7l2kga2jDtG5nIGjhu6NwIGzhu4c6IHBo4bqjaSBr4bq/dCB0aMO6YyBi4bqxbmcgIiR7aS5zdWZmaXh9ImA6aS5mb3JtYXQ9PT0iaW5jbHVkZXMiP2BDaHXhu5dpIGtow7RuZyBo4bujcCBs4buHOiBwaOG6o2kgYmFvIGfhu5NtICIke2kuaW5jbHVkZXN9ImA6aS5mb3JtYXQ9PT0icmVnZXgiP2BDaHXhu5dpIGtow7RuZyBo4bujcCBs4buHOiBwaOG6o2kga2jhu5twIHbhu5tpIG3huqt1ICR7aS5wYXR0ZXJufWA6YCR7cltpLmZvcm1hdF0/P2UuZm9ybWF0fSBraMO0bmcgaOG7o3AgbOG7h2B9Y2FzZSJub3RfbXVsdGlwbGVfb2YiOnJldHVybmBT4buRIGtow7RuZyBo4bujcCBs4buHOiBwaOG6o2kgbMOgIGLhu5lpIHPhu5EgY+G7p2EgJHtlLmRpdmlzb3J9YDtjYXNlInVucmVjb2duaXplZF9rZXlzIjpyZXR1cm5gS2jDs2Ega2jDtG5nIMSRxrDhu6NjIG5o4bqtbiBk4bqhbmc6ICR7XyhlLmtleXMsIiwgIil9YDtjYXNlImludmFsaWRfa2V5IjpyZXR1cm5gS2jDs2Ega2jDtG5nIGjhu6NwIGzhu4cgdHJvbmcgJHtlLm9yaWdpbn1gO2Nhc2UiaW52YWxpZF91bmlvbiI6cmV0dXJuIsSQ4bqndSB2w6BvIGtow7RuZyBo4bujcCBs4buHIjtjYXNlImludmFsaWRfZWxlbWVudCI6cmV0dXJuYEdpw6EgdHLhu4sga2jDtG5nIGjhu6NwIGzhu4cgdHJvbmcgJHtlLm9yaWdpbn1gO2RlZmF1bHQ6cmV0dXJuIsSQ4bqndSB2w6BvIGtow7RuZyBo4bujcCBs4buHIn19fTtmdW5jdGlvbiBrZygpe3JldHVybntsb2NhbGVFcnJvcjp5ZygpfX1jb25zdCBTZz0oKT0+e2NvbnN0IHQ9e3N0cmluZzp7dW5pdDoi5a2X56ymIix2ZXJiOiLljIXlkKsifSxmaWxlOnt1bml0OiLlrZfoioIiLHZlcmI6IuWMheWQqyJ9LGFycmF5Ont1bml0OiLpobkiLHZlcmI6IuWMheWQqyJ9LHNldDp7dW5pdDoi6aG5Iix2ZXJiOiLljIXlkKsifX07ZnVuY3Rpb24gbihlKXtyZXR1cm4gdFtlXT8/bnVsbH1jb25zdCByPXtyZWdleDoi6L6T5YWlIixlbWFpbDoi55S15a2Q6YKu5Lu2Iix1cmw6IlVSTCIsZW1vamk6IuihqOaDheespuWPtyIsdXVpZDoiVVVJRCIsdXVpZHY0OiJVVUlEdjQiLHV1aWR2NjoiVVVJRHY2IixuYW5vaWQ6Im5hbm9pZCIsZ3VpZDoiR1VJRCIsY3VpZDoiY3VpZCIsY3VpZDI6ImN1aWQyIix1bGlkOiJVTElEIix4aWQ6IlhJRCIsa3N1aWQ6IktTVUlEIixkYXRldGltZToiSVNP5pel5pyf5pe26Ze0IixkYXRlOiJJU0/ml6XmnJ8iLHRpbWU6IklTT+aXtumXtCIsZHVyYXRpb246IklTT+aXtumVvyIsaXB2NDoiSVB2NOWcsOWdgCIsaXB2NjoiSVB2NuWcsOWdgCIsY2lkcnY0OiJJUHY0572R5q61IixjaWRydjY6IklQdjbnvZHmrrUiLGJhc2U2NDoiYmFzZTY057yW56CB5a2X56ym5LiyIixiYXNlNjR1cmw6ImJhc2U2NHVybOe8lueggeWtl+espuS4siIsanNvbl9zdHJpbmc6IkpTT07lrZfnrKbkuLIiLGUxNjQ6IkUuMTY05Y+356CBIixqd3Q6IkpXVCIsdGVtcGxhdGVfbGl0ZXJhbDoi6L6T5YWlIn0sbz17bmFuOiJOYU4iLG51bWJlcjoi5pWw5a2XIixhcnJheToi5pWw57uEIixudWxsOiLnqbrlgLwobnVsbCkifTtyZXR1cm4gZT0+e3N3aXRjaChlLmNvZGUpe2Nhc2UiaW52YWxpZF90eXBlIjp7Y29uc3QgaT1vW2UuZXhwZWN0ZWRdPz9lLmV4cGVjdGVkLGE9dyhlLmlucHV0KSxzPW9bYV0/P2E7cmV0dXJuL15bQS1aXS8udGVzdChlLmV4cGVjdGVkKT9g5peg5pWI6L6T5YWl77ya5pyf5pybIGluc3RhbmNlb2YgJHtlLmV4cGVjdGVkfe+8jOWunumZheaOpeaUtiAke3N9YDpg5peg5pWI6L6T5YWl77ya5pyf5pybICR7aX3vvIzlrp7pmYXmjqXmlLYgJHtzfWB9Y2FzZSJpbnZhbGlkX3ZhbHVlIjpyZXR1cm4gZS52YWx1ZXMubGVuZ3RoPT09MT9g5peg5pWI6L6T5YWl77ya5pyf5pybICR7UyhlLnZhbHVlc1swXSl9YDpg5peg5pWI6YCJ6aG577ya5pyf5pyb5Lul5LiL5LmL5LiAICR7XyhlLnZhbHVlcywifCIpfWA7Y2FzZSJ0b29fYmlnIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPD0iOiI8IixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2DmlbDlgLzov4flpKfvvJrmnJ/mnJsgJHtlLm9yaWdpbj8/IuWAvCJ9ICR7aX0ke2UubWF4aW11bS50b1N0cmluZygpfSAke2EudW5pdD8/IuS4quWFg+e0oCJ9YDpg5pWw5YC86L+H5aSn77ya5pyf5pybICR7ZS5vcmlnaW4/PyLlgLwifSAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX1gfWNhc2UidG9vX3NtYWxsIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPj0iOiI+IixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2DmlbDlgLzov4flsI/vvJrmnJ/mnJsgJHtlLm9yaWdpbn0gJHtpfSR7ZS5taW5pbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0fWA6YOaVsOWAvOi/h+Wwj++8muacn+acmyAke2Uub3JpZ2lufSAke2l9JHtlLm1pbmltdW0udG9TdHJpbmcoKX1gfWNhc2UiaW52YWxpZF9mb3JtYXQiOntjb25zdCBpPWU7cmV0dXJuIGkuZm9ybWF0PT09InN0YXJ0c193aXRoIj9g5peg5pWI5a2X56ym5Liy77ya5b+F6aG75LulICIke2kucHJlZml4fSIg5byA5aS0YDppLmZvcm1hdD09PSJlbmRzX3dpdGgiP2Dml6DmlYjlrZfnrKbkuLLvvJrlv4Xpobvku6UgIiR7aS5zdWZmaXh9IiDnu5PlsL5gOmkuZm9ybWF0PT09ImluY2x1ZGVzIj9g5peg5pWI5a2X56ym5Liy77ya5b+F6aG75YyF5ZCrICIke2kuaW5jbHVkZXN9ImA6aS5mb3JtYXQ9PT0icmVnZXgiP2Dml6DmlYjlrZfnrKbkuLLvvJrlv4Xpobvmu6HotrPmraPliJnooajovr7lvI8gJHtpLnBhdHRlcm59YDpg5peg5pWIJHtyW2kuZm9ybWF0XT8/ZS5mb3JtYXR9YH1jYXNlIm5vdF9tdWx0aXBsZV9vZiI6cmV0dXJuYOaXoOaViOaVsOWtl++8muW/hemhu+aYryAke2UuZGl2aXNvcn0g55qE5YCN5pWwYDtjYXNlInVucmVjb2duaXplZF9rZXlzIjpyZXR1cm5g5Ye6546w5pyq55+l55qE6ZSuKGtleSk6ICR7XyhlLmtleXMsIiwgIil9YDtjYXNlImludmFsaWRfa2V5IjpyZXR1cm5gJHtlLm9yaWdpbn0g5Lit55qE6ZSuKGtleSnml6DmlYhgO2Nhc2UiaW52YWxpZF91bmlvbiI6cmV0dXJuIuaXoOaViOi+k+WFpSI7Y2FzZSJpbnZhbGlkX2VsZW1lbnQiOnJldHVybmAke2Uub3JpZ2lufSDkuK3ljIXlkKvml6DmlYjlgLwodmFsdWUpYDtkZWZhdWx0OnJldHVybiLml6DmlYjovpPlhaUifX19O2Z1bmN0aW9uIHdnKCl7cmV0dXJue2xvY2FsZUVycm9yOlNnKCl9fWNvbnN0IElnPSgpPT57Y29uc3QgdD17c3RyaW5nOnt1bml0OiLlrZflhYMiLHZlcmI6IuaTgeaciSJ9LGZpbGU6e3VuaXQ6IuS9jeWFg+e1hCIsdmVyYjoi5pOB5pyJIn0sYXJyYXk6e3VuaXQ6IumgheebriIsdmVyYjoi5pOB5pyJIn0sc2V0Ont1bml0OiLpoIXnm64iLHZlcmI6IuaTgeaciSJ9fTtmdW5jdGlvbiBuKGUpe3JldHVybiB0W2VdPz9udWxsfWNvbnN0IHI9e3JlZ2V4OiLovLjlhaUiLGVtYWlsOiLpg7Xku7blnLDlnYAiLHVybDoiVVJMIixlbW9qaToiZW1vamkiLHV1aWQ6IlVVSUQiLHV1aWR2NDoiVVVJRHY0Iix1dWlkdjY6IlVVSUR2NiIsbmFub2lkOiJuYW5vaWQiLGd1aWQ6IkdVSUQiLGN1aWQ6ImN1aWQiLGN1aWQyOiJjdWlkMiIsdWxpZDoiVUxJRCIseGlkOiJYSUQiLGtzdWlkOiJLU1VJRCIsZGF0ZXRpbWU6IklTTyDml6XmnJ/mmYLplpMiLGRhdGU6IklTTyDml6XmnJ8iLHRpbWU6IklTTyDmmYLplpMiLGR1cmF0aW9uOiJJU08g5pyf6ZaTIixpcHY0OiJJUHY0IOS9jeWdgCIsaXB2NjoiSVB2NiDkvY3lnYAiLGNpZHJ2NDoiSVB2NCDnr4TlnI0iLGNpZHJ2NjoiSVB2NiDnr4TlnI0iLGJhc2U2NDoiYmFzZTY0IOe3qOeivOWtl+S4siIsYmFzZTY0dXJsOiJiYXNlNjR1cmwg57eo56K85a2X5LiyIixqc29uX3N0cmluZzoiSlNPTiDlrZfkuLIiLGUxNjQ6IkUuMTY0IOaVuOWAvCIsand0OiJKV1QiLHRlbXBsYXRlX2xpdGVyYWw6Iui8uOWFpSJ9LG89e25hbjoiTmFOIn07cmV0dXJuIGU9Pntzd2l0Y2goZS5jb2RlKXtjYXNlImludmFsaWRfdHlwZSI6e2NvbnN0IGk9b1tlLmV4cGVjdGVkXT8/ZS5leHBlY3RlZCxhPXcoZS5pbnB1dCkscz1vW2FdPz9hO3JldHVybi9eW0EtWl0vLnRlc3QoZS5leHBlY3RlZCk/YOeEoeaViOeahOi8uOWFpeWAvO+8mumgkOacn+eCuiBpbnN0YW5jZW9mICR7ZS5leHBlY3RlZH3vvIzkvYbmlLbliLAgJHtzfWA6YOeEoeaViOeahOi8uOWFpeWAvO+8mumgkOacn+eCuiAke2l977yM5L2G5pS25YiwICR7c31gfWNhc2UiaW52YWxpZF92YWx1ZSI6cmV0dXJuIGUudmFsdWVzLmxlbmd0aD09PTE/YOeEoeaViOeahOi8uOWFpeWAvO+8mumgkOacn+eCuiAke1MoZS52YWx1ZXNbMF0pfWA6YOeEoeaViOeahOmBuOmghe+8mumgkOacn+eCuuS7peS4i+WFtuS4reS5i+S4gCAke18oZS52YWx1ZXMsInwiKX1gO2Nhc2UidG9vX2JpZyI6e2NvbnN0IGk9ZS5pbmNsdXNpdmU/Ijw9IjoiPCIsYT1uKGUub3JpZ2luKTtyZXR1cm4gYT9g5pW45YC86YGO5aSn77ya6aCQ5pyfICR7ZS5vcmlnaW4/PyLlgLwifSDmh4nngrogJHtpfSR7ZS5tYXhpbXVtLnRvU3RyaW5nKCl9ICR7YS51bml0Pz8i5YCL5YWD57SgIn1gOmDmlbjlgLzpgY7lpKfvvJrpoJDmnJ8gJHtlLm9yaWdpbj8/IuWAvCJ9IOaHieeCuiAke2l9JHtlLm1heGltdW0udG9TdHJpbmcoKX1gfWNhc2UidG9vX3NtYWxsIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPj0iOiI+IixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2DmlbjlgLzpgY7lsI/vvJrpoJDmnJ8gJHtlLm9yaWdpbn0g5oeJ54K6ICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfSAke2EudW5pdH1gOmDmlbjlgLzpgY7lsI/vvJrpoJDmnJ8gJHtlLm9yaWdpbn0g5oeJ54K6ICR7aX0ke2UubWluaW11bS50b1N0cmluZygpfWB9Y2FzZSJpbnZhbGlkX2Zvcm1hdCI6e2NvbnN0IGk9ZTtyZXR1cm4gaS5mb3JtYXQ9PT0ic3RhcnRzX3dpdGgiP2DnhKHmlYjnmoTlrZfkuLLvvJrlv4XpoIjku6UgIiR7aS5wcmVmaXh9IiDplovpoK1gOmkuZm9ybWF0PT09ImVuZHNfd2l0aCI/YOeEoeaViOeahOWtl+S4su+8muW/hemgiOS7pSAiJHtpLnN1ZmZpeH0iIOe1kOWwvmA6aS5mb3JtYXQ9PT0iaW5jbHVkZXMiP2DnhKHmlYjnmoTlrZfkuLLvvJrlv4XpoIjljIXlkKsgIiR7aS5pbmNsdWRlc30iYDppLmZvcm1hdD09PSJyZWdleCI/YOeEoeaViOeahOWtl+S4su+8muW/hemgiOespuWQiOagvOW8jyAke2kucGF0dGVybn1gOmDnhKHmlYjnmoQgJHtyW2kuZm9ybWF0XT8/ZS5mb3JtYXR9YH1jYXNlIm5vdF9tdWx0aXBsZV9vZiI6cmV0dXJuYOeEoeaViOeahOaVuOWtl++8muW/hemgiOeCuiAke2UuZGl2aXNvcn0g55qE5YCN5pW4YDtjYXNlInVucmVjb2duaXplZF9rZXlzIjpyZXR1cm5g54Sh5rOV6K2Y5Yil55qE6Y215YC8JHtlLmtleXMubGVuZ3RoPjE/IuWAkSI6IiJ977yaJHtfKGUua2V5cywi44CBIil9YDtjYXNlImludmFsaWRfa2V5IjpyZXR1cm5gJHtlLm9yaWdpbn0g5Lit5pyJ54Sh5pWI55qE6Y215YC8YDtjYXNlImludmFsaWRfdW5pb24iOnJldHVybiLnhKHmlYjnmoTovLjlhaXlgLwiO2Nhc2UiaW52YWxpZF9lbGVtZW50IjpyZXR1cm5gJHtlLm9yaWdpbn0g5Lit5pyJ54Sh5pWI55qE5YC8YDtkZWZhdWx0OnJldHVybiLnhKHmlYjnmoTovLjlhaXlgLwifX19O2Z1bmN0aW9uIHpnKCl7cmV0dXJue2xvY2FsZUVycm9yOklnKCl9fWNvbnN0IHhnPSgpPT57Y29uc3QgdD17c3RyaW5nOnt1bml0OiLDoG1pIix2ZXJiOiJuw60ifSxmaWxlOnt1bml0OiJieXRlcyIsdmVyYjoibsOtIn0sYXJyYXk6e3VuaXQ6Im5rYW4iLHZlcmI6Im7DrSJ9LHNldDp7dW5pdDoibmthbiIsdmVyYjoibsOtIn19O2Z1bmN0aW9uIG4oZSl7cmV0dXJuIHRbZV0/P251bGx9Y29uc3Qgcj17cmVnZXg6IuG6ucyAcuG7jSDDrGLDoXfhu41sw6kiLGVtYWlsOiLDoGTDrXLhurnMgXPDrCDDrG3hurnMgWzDrCIsdXJsOiJVUkwiLGVtb2ppOiJlbW9qaSIsdXVpZDoiVVVJRCIsdXVpZHY0OiJVVUlEdjQiLHV1aWR2NjoiVVVJRHY2IixuYW5vaWQ6Im5hbm9pZCIsZ3VpZDoiR1VJRCIsY3VpZDoiY3VpZCIsY3VpZDI6ImN1aWQyIix1bGlkOiJVTElEIix4aWQ6IlhJRCIsa3N1aWQ6IktTVUlEIixkYXRldGltZToiw6Brw7Nrw7IgSVNPIixkYXRlOiLhu41q4buNzIEgSVNPIix0aW1lOiLDoGvDs2vDsiBJU08iLGR1cmF0aW9uOiLDoGvDs2vDsiB0w7MgcMOpIElTTyIsaXB2NDoiw6Bkw61y4bq5zIFzw6wgSVB2NCIsaXB2Njoiw6Bkw61y4bq5zIFzw6wgSVB2NiIsY2lkcnY0OiLDoGdiw6hnYsOoIElQdjQiLGNpZHJ2Njoiw6BnYsOoZ2LDqCBJUHY2IixiYXNlNjQ6IuG7jcyAcuG7jcyAIHTDrSBhIGvhu43MgSBuw60gYmFzZTY0IixiYXNlNjR1cmw6IuG7jcyAcuG7jcyAIGJhc2U2NHVybCIsanNvbl9zdHJpbmc6IuG7jcyAcuG7jcyAIEpTT04iLGUxNjQ6Im7hu43MgW1iw6AgRS4xNjQiLGp3dDoiSldUIix0ZW1wbGF0ZV9saXRlcmFsOiLhurnMgHLhu40gw6xiw6F34buNbMOpIn0sbz17bmFuOiJOYU4iLG51bWJlcjoibuG7jcyBbWLDoCIsYXJyYXk6ImFrb3Dhu40ifTtyZXR1cm4gZT0+e3N3aXRjaChlLmNvZGUpe2Nhc2UiaW52YWxpZF90eXBlIjp7Y29uc3QgaT1vW2UuZXhwZWN0ZWRdPz9lLmV4cGVjdGVkLGE9dyhlLmlucHV0KSxzPW9bYV0/P2E7cmV0dXJuL15bQS1aXS8udGVzdChlLmV4cGVjdGVkKT9gw4xiw6F34buNbMOpIGHhuaPDrOG5o2U6IGEgbsOtIGzDoXRpIGZpIGluc3RhbmNlb2YgJHtlLmV4cGVjdGVkfSwgw6Bt4buNzIAgYSByw60gJHtzfWA6YMOMYsOhd+G7jWzDqSBh4bmjw6zhuaNlOiBhIG7DrSBsw6F0aSBmaSAke2l9LCDDoG3hu43MgCBhIHLDrSAke3N9YH1jYXNlImludmFsaWRfdmFsdWUiOnJldHVybiBlLnZhbHVlcy5sZW5ndGg9PT0xP2DDjGLDoXfhu41sw6kgYeG5o8Os4bmjZTogYSBuw60gbMOhdGkgZmkgJHtTKGUudmFsdWVzWzBdKX1gOmDDgOG5o8OgecOgbiBh4bmjw6zhuaNlOiB5YW4g4buNzIBrYW4gbMOhcmEgJHtfKGUudmFsdWVzLCJ8Iil9YDtjYXNlInRvb19iaWciOntjb25zdCBpPWUuaW5jbHVzaXZlPyI8PSI6IjwiLGE9bihlLm9yaWdpbik7cmV0dXJuIGE/YFTDsyBw4buNzIAgasO5OiBhIG7DrSBsw6F0aSBq4bq5zIEgcMOpICR7ZS5vcmlnaW4/PyJpeWUifSAke2EudmVyYn0gJHtpfSR7ZS5tYXhpbXVtfSAke2EudW5pdH1gOmBUw7MgcOG7jcyAIGrDuTogYSBuw60gbMOhdGkgauG6ucyBICR7aX0ke2UubWF4aW11bX1gfWNhc2UidG9vX3NtYWxsIjp7Y29uc3QgaT1lLmluY2x1c2l2ZT8iPj0iOiI+IixhPW4oZS5vcmlnaW4pO3JldHVybiBhP2BLw6lyw6kganU6IGEgbsOtIGzDoXRpIGrhurnMgSBww6kgJHtlLm9yaWdpbn0gJHthLnZlcmJ9ICR7aX0ke2UubWluaW11bX0gJHthLnVuaXR9YDpgS8OpcsOpIGp1OiBhIG7DrSBsw6F0aSBq4bq5zIEgJHtpfSR7ZS5taW5pbXVtfWB9Y2FzZSJpbnZhbGlkX2Zvcm1hdCI6e2NvbnN0IGk9ZTtyZXR1cm4gaS5mb3JtYXQ9PT0ic3RhcnRzX3dpdGgiP2Dhu4zMgHLhu43MgCBh4bmjw6zhuaNlOiBnYuG7jcyBZOG7jcyAIGLhurnMgHLhurnMgCBw4bq5zIBsw7ogIiR7aS5wcmVmaXh9ImA6aS5mb3JtYXQ9PT0iZW5kc193aXRoIj9g4buMzIBy4buNzIAgYeG5o8Os4bmjZTogZ2Lhu43MgWThu43MgCBwYXLDrSBw4bq5zIBsw7ogIiR7aS5zdWZmaXh9ImA6aS5mb3JtYXQ9PT0iaW5jbHVkZXMiP2Dhu4zMgHLhu43MgCBh4bmjw6zhuaNlOiBnYuG7jcyBZOG7jcyAIG7DrSAiJHtpLmluY2x1ZGVzfSJgOmkuZm9ybWF0PT09InJlZ2V4Ij9g4buMzIBy4buNzIAgYeG5o8Os4bmjZTogZ2Lhu43MgWThu43MgCBiw6Egw6Bw4bq54bq5cuG6uSBtdSAke2kucGF0dGVybn1gOmBB4bmjw6zhuaNlOiAke3JbaS5mb3JtYXRdPz9lLmZvcm1hdH1gfWNhc2Uibm90X211bHRpcGxlX29mIjpyZXR1cm5gTuG7jcyBbWLDoCBh4bmjw6zhuaNlOiBnYuG7jcyBZOG7jcyAIGrhurnMgSDDqHnDoCBww61ww61uIHRpICR7ZS5kaXZpc29yfWA7Y2FzZSJ1bnJlY29nbml6ZWRfa2V5cyI6cmV0dXJuYELhu410w6xuw6wgw6DDrG3hu43MgDogJHtfKGUua2V5cywiLCAiKX1gO2Nhc2UiaW52YWxpZF9rZXkiOnJldHVybmBC4buNdMOsbsOsIGHhuaPDrOG5o2UgbsOtbsO6ICR7ZS5vcmlnaW59YDtjYXNlImludmFsaWRfdW5pb24iOnJldHVybiLDjGLDoXfhu41sw6kgYeG5o8Os4bmjZSI7Y2FzZSJpbnZhbGlkX2VsZW1lbnQiOnJldHVybmBJeWUgYeG5o8Os4bmjZSBuw61uw7ogJHtlLm9yaWdpbn1gO2RlZmF1bHQ6cmV0dXJuIsOMYsOhd+G7jWzDqSBh4bmjw6zhuaNlIn19fTtmdW5jdGlvbiBUZygpe3JldHVybntsb2NhbGVFcnJvcjp4ZygpfX1jb25zdCBKaT1PYmplY3QuZnJlZXplKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7X19wcm90b19fOm51bGwsYXI6Q3AsYXo6THAsYmU6cXAsYmc6SnAsY2E6V3AsY3M6VnAsZGE6R3AsZGU6WXAsZWw6ZWYsZW46emwsZW86cmYsZXM6YWYsZmE6Y2YsZmk6bGYsZnI6bWYsZnJDQTpmZixoZTp2ZixocjokZixodTpiZixoeTprZixpZDp3Zixpczp6ZixpdDpUZixqYTpPZixrYTpQZixraDpEZixrbTp4bCxrbzpaZixsdDpDZixtazpMZixtczpxZixubDpKZixubzpXZixvdGE6VmYscGw6WWYscHM6R2YscHQ6ZWcscm86bmcscnU6aWcsc2w6YWcsc3Y6Y2csdGE6bGcsdGg6bWcsdHI6ZmcsdWE6dmcsdWs6VGwsdXI6JGcsdXo6Ymcsdmk6a2cseW86VGcsemhDTjp3Zyx6aFRXOnpnfSxTeW1ib2wudG9TdHJpbmdUYWcse3ZhbHVlOiJNb2R1bGUifSkpO3ZhciBFcztjb25zdCBIaT1TeW1ib2woIlpvZE91dHB1dCIpLFdpPVN5bWJvbCgiWm9kSW5wdXQiKTtjbGFzcyBqbHtjb25zdHJ1Y3Rvcigpe3RoaXMuX21hcD1uZXcgV2Vha01hcCx0aGlzLl9pZG1hcD1uZXcgTWFwfWFkZChuLC4uLnIpe2NvbnN0IG89clswXTtyZXR1cm4gdGhpcy5fbWFwLnNldChuLG8pLG8mJnR5cGVvZiBvPT0ib2JqZWN0IiYmImlkImluIG8mJnRoaXMuX2lkbWFwLnNldChvLmlkLG4pLHRoaXN9Y2xlYXIoKXtyZXR1cm4gdGhpcy5fbWFwPW5ldyBXZWFrTWFwLHRoaXMuX2lkbWFwPW5ldyBNYXAsdGhpc31yZW1vdmUobil7Y29uc3Qgcj10aGlzLl9tYXAuZ2V0KG4pO3JldHVybiByJiZ0eXBlb2Ygcj09Im9iamVjdCImJiJpZCJpbiByJiZ0aGlzLl9pZG1hcC5kZWxldGUoci5pZCksdGhpcy5fbWFwLmRlbGV0ZShuKSx0aGlzfWdldChuKXtjb25zdCByPW4uX3pvZC5wYXJlbnQ7aWYocil7Y29uc3Qgbz17Li4udGhpcy5nZXQocik/P3t9fTtkZWxldGUgby5pZDtjb25zdCBlPXsuLi5vLC4uLnRoaXMuX21hcC5nZXQobil9O3JldHVybiBPYmplY3Qua2V5cyhlKS5sZW5ndGg/ZTp2b2lkIDB9cmV0dXJuIHRoaXMuX21hcC5nZXQobil9aGFzKG4pe3JldHVybiB0aGlzLl9tYXAuaGFzKG4pfX1mdW5jdGlvbiB0cigpe3JldHVybiBuZXcgamx9KEVzPWdsb2JhbFRoaXMpLl9fem9kX2dsb2JhbFJlZ2lzdHJ5Pz8oRXMuX196b2RfZ2xvYmFsUmVnaXN0cnk9dHIoKSk7Y29uc3QgY2U9Z2xvYmFsVGhpcy5fX3pvZF9nbG9iYWxSZWdpc3RyeTtmdW5jdGlvbiBPbCh0LG4pe3JldHVybiBuZXcgdCh7dHlwZToic3RyaW5nIiwuLi5oKG4pfSl9ZnVuY3Rpb24gVWwodCxuKXtyZXR1cm4gbmV3IHQoe3R5cGU6InN0cmluZyIsY29lcmNlOiEwLC4uLmgobil9KX1mdW5jdGlvbiBCaSh0LG4pe3JldHVybiBuZXcgdCh7dHlwZToic3RyaW5nIixmb3JtYXQ6ImVtYWlsIixjaGVjazoic3RyaW5nX2Zvcm1hdCIsYWJvcnQ6ITEsLi4uaChuKX0pfWZ1bmN0aW9uIExuKHQsbil7cmV0dXJuIG5ldyB0KHt0eXBlOiJzdHJpbmciLGZvcm1hdDoiZ3VpZCIsY2hlY2s6InN0cmluZ19mb3JtYXQiLGFib3J0OiExLC4uLmgobil9KX1mdW5jdGlvbiBWaSh0LG4pe3JldHVybiBuZXcgdCh7dHlwZToic3RyaW5nIixmb3JtYXQ6InV1aWQiLGNoZWNrOiJzdHJpbmdfZm9ybWF0IixhYm9ydDohMSwuLi5oKG4pfSl9ZnVuY3Rpb24gS2kodCxuKXtyZXR1cm4gbmV3IHQoe3R5cGU6InN0cmluZyIsZm9ybWF0OiJ1dWlkIixjaGVjazoic3RyaW5nX2Zvcm1hdCIsYWJvcnQ6ITEsdmVyc2lvbjoidjQiLC4uLmgobil9KX1mdW5jdGlvbiBHaSh0LG4pe3JldHVybiBuZXcgdCh7dHlwZToic3RyaW5nIixmb3JtYXQ6InV1aWQiLGNoZWNrOiJzdHJpbmdfZm9ybWF0IixhYm9ydDohMSx2ZXJzaW9uOiJ2NiIsLi4uaChuKX0pfWZ1bmN0aW9uIFhpKHQsbil7cmV0dXJuIG5ldyB0KHt0eXBlOiJzdHJpbmciLGZvcm1hdDoidXVpZCIsY2hlY2s6InN0cmluZ19mb3JtYXQiLGFib3J0OiExLHZlcnNpb246InY3IiwuLi5oKG4pfSl9ZnVuY3Rpb24gbnIodCxuKXtyZXR1cm4gbmV3IHQoe3R5cGU6InN0cmluZyIsZm9ybWF0OiJ1cmwiLGNoZWNrOiJzdHJpbmdfZm9ybWF0IixhYm9ydDohMSwuLi5oKG4pfSl9ZnVuY3Rpb24gWWkodCxuKXtyZXR1cm4gbmV3IHQoe3R5cGU6InN0cmluZyIsZm9ybWF0OiJlbW9qaSIsY2hlY2s6InN0cmluZ19mb3JtYXQiLGFib3J0OiExLC4uLmgobil9KX1mdW5jdGlvbiBRaSh0LG4pe3JldHVybiBuZXcgdCh7dHlwZToic3RyaW5nIixmb3JtYXQ6Im5hbm9pZCIsY2hlY2s6InN0cmluZ19mb3JtYXQiLGFib3J0OiExLC4uLmgobil9KX1mdW5jdGlvbiBlbyh0LG4pe3JldHVybiBuZXcgdCh7dHlwZToic3RyaW5nIixmb3JtYXQ6ImN1aWQiLGNoZWNrOiJzdHJpbmdfZm9ybWF0IixhYm9ydDohMSwuLi5oKG4pfSl9ZnVuY3Rpb24gdG8odCxuKXtyZXR1cm4gbmV3IHQoe3R5cGU6InN0cmluZyIsZm9ybWF0OiJjdWlkMiIsY2hlY2s6InN0cmluZ19mb3JtYXQiLGFib3J0OiExLC4uLmgobil9KX1mdW5jdGlvbiBubyh0LG4pe3JldHVybiBuZXcgdCh7dHlwZToic3RyaW5nIixmb3JtYXQ6InVsaWQiLGNoZWNrOiJzdHJpbmdfZm9ybWF0IixhYm9ydDohMSwuLi5oKG4pfSl9ZnVuY3Rpb24gcm8odCxuKXtyZXR1cm4gbmV3IHQoe3R5cGU6InN0cmluZyIsZm9ybWF0OiJ4aWQiLGNoZWNrOiJzdHJpbmdfZm9ybWF0IixhYm9ydDohMSwuLi5oKG4pfSl9ZnVuY3Rpb24gaW8odCxuKXtyZXR1cm4gbmV3IHQoe3R5cGU6InN0cmluZyIsZm9ybWF0OiJrc3VpZCIsY2hlY2s6InN0cmluZ19mb3JtYXQiLGFib3J0OiExLC4uLmgobil9KX1mdW5jdGlvbiBvbyh0LG4pe3JldHVybiBuZXcgdCh7dHlwZToic3RyaW5nIixmb3JtYXQ6ImlwdjQiLGNoZWNrOiJzdHJpbmdfZm9ybWF0IixhYm9ydDohMSwuLi5oKG4pfSl9ZnVuY3Rpb24gYW8odCxuKXtyZXR1cm4gbmV3IHQoe3R5cGU6InN0cmluZyIsZm9ybWF0OiJpcHY2IixjaGVjazoic3RyaW5nX2Zvcm1hdCIsYWJvcnQ6ITEsLi4uaChuKX0pfWZ1bmN0aW9uIFBsKHQsbil7cmV0dXJuIG5ldyB0KHt0eXBlOiJzdHJpbmciLGZvcm1hdDoibWFjIixjaGVjazoic3RyaW5nX2Zvcm1hdCIsYWJvcnQ6ITEsLi4uaChuKX0pfWZ1bmN0aW9uIHNvKHQsbil7cmV0dXJuIG5ldyB0KHt0eXBlOiJzdHJpbmciLGZvcm1hdDoiY2lkcnY0IixjaGVjazoic3RyaW5nX2Zvcm1hdCIsYWJvcnQ6ITEsLi4uaChuKX0pfWZ1bmN0aW9uIGNvKHQsbil7cmV0dXJuIG5ldyB0KHt0eXBlOiJzdHJpbmciLGZvcm1hdDoiY2lkcnY2IixjaGVjazoic3RyaW5nX2Zvcm1hdCIsYWJvcnQ6ITEsLi4uaChuKX0pfWZ1bmN0aW9uIHVvKHQsbil7cmV0dXJuIG5ldyB0KHt0eXBlOiJzdHJpbmciLGZvcm1hdDoiYmFzZTY0IixjaGVjazoic3RyaW5nX2Zvcm1hdCIsYWJvcnQ6ITEsLi4uaChuKX0pfWZ1bmN0aW9uIGxvKHQsbil7cmV0dXJuIG5ldyB0KHt0eXBlOiJzdHJpbmciLGZvcm1hdDoiYmFzZTY0dXJsIixjaGVjazoic3RyaW5nX2Zvcm1hdCIsYWJvcnQ6ITEsLi4uaChuKX0pfWZ1bmN0aW9uIG1vKHQsbil7cmV0dXJuIG5ldyB0KHt0eXBlOiJzdHJpbmciLGZvcm1hdDoiZTE2NCIsY2hlY2s6InN0cmluZ19mb3JtYXQiLGFib3J0OiExLC4uLmgobil9KX1mdW5jdGlvbiBwbyh0LG4pe3JldHVybiBuZXcgdCh7dHlwZToic3RyaW5nIixmb3JtYXQ6Imp3dCIsY2hlY2s6InN0cmluZ19mb3JtYXQiLGFib3J0OiExLC4uLmgobil9KX1jb25zdCBmbz17QW55Om51bGwsTWludXRlOi0xLFNlY29uZDowLE1pbGxpc2Vjb25kOjMsTWljcm9zZWNvbmQ6Nn07ZnVuY3Rpb24gTmwodCxuKXtyZXR1cm4gbmV3IHQoe3R5cGU6InN0cmluZyIsZm9ybWF0OiJkYXRldGltZSIsY2hlY2s6InN0cmluZ19mb3JtYXQiLG9mZnNldDohMSxsb2NhbDohMSxwcmVjaXNpb246bnVsbCwuLi5oKG4pfSl9ZnVuY3Rpb24gRGwodCxuKXtyZXR1cm4gbmV3IHQoe3R5cGU6InN0cmluZyIsZm9ybWF0OiJkYXRlIixjaGVjazoic3RyaW5nX2Zvcm1hdCIsLi4uaChuKX0pfWZ1bmN0aW9uIEVsKHQsbil7cmV0dXJuIG5ldyB0KHt0eXBlOiJzdHJpbmciLGZvcm1hdDoidGltZSIsY2hlY2s6InN0cmluZ19mb3JtYXQiLHByZWNpc2lvbjpudWxsLC4uLmgobil9KX1mdW5jdGlvbiBabCh0LG4pe3JldHVybiBuZXcgdCh7dHlwZToic3RyaW5nIixmb3JtYXQ6ImR1cmF0aW9uIixjaGVjazoic3RyaW5nX2Zvcm1hdCIsLi4uaChuKX0pfWZ1bmN0aW9uIFJsKHQsbil7cmV0dXJuIG5ldyB0KHt0eXBlOiJudW1iZXIiLGNoZWNrczpbXSwuLi5oKG4pfSl9ZnVuY3Rpb24gQ2wodCxuKXtyZXR1cm4gbmV3IHQoe3R5cGU6Im51bWJlciIsY29lcmNlOiEwLGNoZWNrczpbXSwuLi5oKG4pfSl9ZnVuY3Rpb24gQWwodCxuKXtyZXR1cm4gbmV3IHQoe3R5cGU6Im51bWJlciIsY2hlY2s6Im51bWJlcl9mb3JtYXQiLGFib3J0OiExLGZvcm1hdDoic2FmZWludCIsLi4uaChuKX0pfWZ1bmN0aW9uIExsKHQsbil7cmV0dXJuIG5ldyB0KHt0eXBlOiJudW1iZXIiLGNoZWNrOiJudW1iZXJfZm9ybWF0IixhYm9ydDohMSxmb3JtYXQ6ImZsb2F0MzIiLC4uLmgobil9KX1mdW5jdGlvbiBNbCh0LG4pe3JldHVybiBuZXcgdCh7dHlwZToibnVtYmVyIixjaGVjazoibnVtYmVyX2Zvcm1hdCIsYWJvcnQ6ITEsZm9ybWF0OiJmbG9hdDY0IiwuLi5oKG4pfSl9ZnVuY3Rpb24gcWwodCxuKXtyZXR1cm4gbmV3IHQoe3R5cGU6Im51bWJlciIsY2hlY2s6Im51bWJlcl9mb3JtYXQiLGFib3J0OiExLGZvcm1hdDoiaW50MzIiLC4uLmgobil9KX1mdW5jdGlvbiBGbCh0LG4pe3JldHVybiBuZXcgdCh7dHlwZToibnVtYmVyIixjaGVjazoibnVtYmVyX2Zvcm1hdCIsYWJvcnQ6ITEsZm9ybWF0OiJ1aW50MzIiLC4uLmgobil9KX1mdW5jdGlvbiBKbCh0LG4pe3JldHVybiBuZXcgdCh7dHlwZToiYm9vbGVhbiIsLi4uaChuKX0pfWZ1bmN0aW9uIEhsKHQsbil7cmV0dXJuIG5ldyB0KHt0eXBlOiJib29sZWFuIixjb2VyY2U6ITAsLi4uaChuKX0pfWZ1bmN0aW9uIFdsKHQsbil7cmV0dXJuIG5ldyB0KHt0eXBlOiJiaWdpbnQiLC4uLmgobil9KX1mdW5jdGlvbiBCbCh0LG4pe3JldHVybiBuZXcgdCh7dHlwZToiYmlnaW50Iixjb2VyY2U6ITAsLi4uaChuKX0pfWZ1bmN0aW9uIFZsKHQsbil7cmV0dXJuIG5ldyB0KHt0eXBlOiJiaWdpbnQiLGNoZWNrOiJiaWdpbnRfZm9ybWF0IixhYm9ydDohMSxmb3JtYXQ6ImludDY0IiwuLi5oKG4pfSl9ZnVuY3Rpb24gS2wodCxuKXtyZXR1cm4gbmV3IHQoe3R5cGU6ImJpZ2ludCIsY2hlY2s6ImJpZ2ludF9mb3JtYXQiLGFib3J0OiExLGZvcm1hdDoidWludDY0IiwuLi5oKG4pfSl9ZnVuY3Rpb24gR2wodCxuKXtyZXR1cm4gbmV3IHQoe3R5cGU6InN5bWJvbCIsLi4uaChuKX0pfWZ1bmN0aW9uIFhsKHQsbil7cmV0dXJuIG5ldyB0KHt0eXBlOiJ1bmRlZmluZWQiLC4uLmgobil9KX1mdW5jdGlvbiBZbCh0LG4pe3JldHVybiBuZXcgdCh7dHlwZToibnVsbCIsLi4uaChuKX0pfWZ1bmN0aW9uIFFsKHQpe3JldHVybiBuZXcgdCh7dHlwZToiYW55In0pfWZ1bmN0aW9uIGVkKHQpe3JldHVybiBuZXcgdCh7dHlwZToidW5rbm93biJ9KX1mdW5jdGlvbiB0ZCh0LG4pe3JldHVybiBuZXcgdCh7dHlwZToibmV2ZXIiLC4uLmgobil9KX1mdW5jdGlvbiBuZCh0LG4pe3JldHVybiBuZXcgdCh7dHlwZToidm9pZCIsLi4uaChuKX0pfWZ1bmN0aW9uIHJkKHQsbil7cmV0dXJuIG5ldyB0KHt0eXBlOiJkYXRlIiwuLi5oKG4pfSl9ZnVuY3Rpb24gaWQodCxuKXtyZXR1cm4gbmV3IHQoe3R5cGU6ImRhdGUiLGNvZXJjZTohMCwuLi5oKG4pfSl9ZnVuY3Rpb24gb2QodCxuKXtyZXR1cm4gbmV3IHQoe3R5cGU6Im5hbiIsLi4uaChuKX0pfWZ1bmN0aW9uIHllKHQsbil7cmV0dXJuIG5ldyBEaSh7Y2hlY2s6Imxlc3NfdGhhbiIsLi4uaChuKSx2YWx1ZTp0LGluY2x1c2l2ZTohMX0pfWZ1bmN0aW9uIHVlKHQsbil7cmV0dXJuIG5ldyBEaSh7Y2hlY2s6Imxlc3NfdGhhbiIsLi4uaChuKSx2YWx1ZTp0LGluY2x1c2l2ZTohMH0pfWZ1bmN0aW9uIGtlKHQsbil7cmV0dXJuIG5ldyBFaSh7Y2hlY2s6ImdyZWF0ZXJfdGhhbiIsLi4uaChuKSx2YWx1ZTp0LGluY2x1c2l2ZTohMX0pfWZ1bmN0aW9uIGllKHQsbil7cmV0dXJuIG5ldyBFaSh7Y2hlY2s6ImdyZWF0ZXJfdGhhbiIsLi4uaChuKSx2YWx1ZTp0LGluY2x1c2l2ZTohMH0pfWZ1bmN0aW9uIHJyKHQpe3JldHVybiBrZSgwLHQpfWZ1bmN0aW9uIGlyKHQpe3JldHVybiB5ZSgwLHQpfWZ1bmN0aW9uIG9yKHQpe3JldHVybiB1ZSgwLHQpfWZ1bmN0aW9uIGFyKHQpe3JldHVybiBpZSgwLHQpfWZ1bmN0aW9uIEVlKHQsbil7cmV0dXJuIG5ldyBCYyh7Y2hlY2s6Im11bHRpcGxlX29mIiwuLi5oKG4pLHZhbHVlOnR9KX1mdW5jdGlvbiBMZSh0LG4pe3JldHVybiBuZXcgR2Moe2NoZWNrOiJtYXhfc2l6ZSIsLi4uaChuKSxtYXhpbXVtOnR9KX1mdW5jdGlvbiBTZSh0LG4pe3JldHVybiBuZXcgWGMoe2NoZWNrOiJtaW5fc2l6ZSIsLi4uaChuKSxtaW5pbXVtOnR9KX1mdW5jdGlvbiBudCh0LG4pe3JldHVybiBuZXcgWWMoe2NoZWNrOiJzaXplX2VxdWFscyIsLi4uaChuKSxzaXplOnR9KX1mdW5jdGlvbiBydCh0LG4pe3JldHVybiBuZXcgUWMoe2NoZWNrOiJtYXhfbGVuZ3RoIiwuLi5oKG4pLG1heGltdW06dH0pfWZ1bmN0aW9uIHplKHQsbil7cmV0dXJuIG5ldyBldSh7Y2hlY2s6Im1pbl9sZW5ndGgiLC4uLmgobiksbWluaW11bTp0fSl9ZnVuY3Rpb24gaXQodCxuKXtyZXR1cm4gbmV3IHR1KHtjaGVjazoibGVuZ3RoX2VxdWFscyIsLi4uaChuKSxsZW5ndGg6dH0pfWZ1bmN0aW9uIFJ0KHQsbil7cmV0dXJuIG5ldyBudSh7Y2hlY2s6InN0cmluZ19mb3JtYXQiLGZvcm1hdDoicmVnZXgiLC4uLmgobikscGF0dGVybjp0fSl9ZnVuY3Rpb24gQ3QodCl7cmV0dXJuIG5ldyBydSh7Y2hlY2s6InN0cmluZ19mb3JtYXQiLGZvcm1hdDoibG93ZXJjYXNlIiwuLi5oKHQpfSl9ZnVuY3Rpb24gQXQodCl7cmV0dXJuIG5ldyBpdSh7Y2hlY2s6InN0cmluZ19mb3JtYXQiLGZvcm1hdDoidXBwZXJjYXNlIiwuLi5oKHQpfSl9ZnVuY3Rpb24gTHQodCxuKXtyZXR1cm4gbmV3IG91KHtjaGVjazoic3RyaW5nX2Zvcm1hdCIsZm9ybWF0OiJpbmNsdWRlcyIsLi4uaChuKSxpbmNsdWRlczp0fSl9ZnVuY3Rpb24gTXQodCxuKXtyZXR1cm4gbmV3IGF1KHtjaGVjazoic3RyaW5nX2Zvcm1hdCIsZm9ybWF0OiJzdGFydHNfd2l0aCIsLi4uaChuKSxwcmVmaXg6dH0pfWZ1bmN0aW9uIHF0KHQsbil7cmV0dXJuIG5ldyBzdSh7Y2hlY2s6InN0cmluZ19mb3JtYXQiLGZvcm1hdDoiZW5kc193aXRoIiwuLi5oKG4pLHN1ZmZpeDp0fSl9ZnVuY3Rpb24gc3IodCxuLHIpe3JldHVybiBuZXcgY3Uoe2NoZWNrOiJwcm9wZXJ0eSIscHJvcGVydHk6dCxzY2hlbWE6biwuLi5oKHIpfSl9ZnVuY3Rpb24gRnQodCxuKXtyZXR1cm4gbmV3IHV1KHtjaGVjazoibWltZV90eXBlIixtaW1lOnQsLi4uaChuKX0pfWZ1bmN0aW9uIF9lKHQpe3JldHVybiBuZXcgbHUoe2NoZWNrOiJvdmVyd3JpdGUiLHR4OnR9KX1mdW5jdGlvbiBKdCh0KXtyZXR1cm4gX2Uobj0+bi5ub3JtYWxpemUodCkpfWZ1bmN0aW9uIEh0KCl7cmV0dXJuIF9lKHQ9PnQudHJpbSgpKX1mdW5jdGlvbiBXdCgpe3JldHVybiBfZSh0PT50LnRvTG93ZXJDYXNlKCkpfWZ1bmN0aW9uIEJ0KCl7cmV0dXJuIF9lKHQ9PnQudG9VcHBlckNhc2UoKSl9ZnVuY3Rpb24gVnQoKXtyZXR1cm4gX2UodD0+QnModCkpfWZ1bmN0aW9uIGFkKHQsbixyKXtyZXR1cm4gbmV3IHQoe3R5cGU6ImFycmF5IixlbGVtZW50Om4sLi4uaChyKX0pfWZ1bmN0aW9uIGpnKHQsbixyKXtyZXR1cm4gbmV3IHQoe3R5cGU6InVuaW9uIixvcHRpb25zOm4sLi4uaChyKX0pfWZ1bmN0aW9uIE9nKHQsbixyKXtyZXR1cm4gbmV3IHQoe3R5cGU6InVuaW9uIixvcHRpb25zOm4saW5jbHVzaXZlOiExLC4uLmgocil9KX1mdW5jdGlvbiBVZyh0LG4scixvKXtyZXR1cm4gbmV3IHQoe3R5cGU6InVuaW9uIixvcHRpb25zOnIsZGlzY3JpbWluYXRvcjpuLC4uLmgobyl9KX1mdW5jdGlvbiBQZyh0LG4scil7cmV0dXJuIG5ldyB0KHt0eXBlOiJpbnRlcnNlY3Rpb24iLGxlZnQ6bixyaWdodDpyfSl9ZnVuY3Rpb24gTmcodCxuLHIsbyl7Y29uc3QgZT1yIGluc3RhbmNlb2YgeCxpPWU/bzpyLGE9ZT9yOm51bGw7cmV0dXJuIG5ldyB0KHt0eXBlOiJ0dXBsZSIsaXRlbXM6bixyZXN0OmEsLi4uaChpKX0pfWZ1bmN0aW9uIERnKHQsbixyLG8pe3JldHVybiBuZXcgdCh7dHlwZToicmVjb3JkIixrZXlUeXBlOm4sdmFsdWVUeXBlOnIsLi4uaChvKX0pfWZ1bmN0aW9uIEVnKHQsbixyLG8pe3JldHVybiBuZXcgdCh7dHlwZToibWFwIixrZXlUeXBlOm4sdmFsdWVUeXBlOnIsLi4uaChvKX0pfWZ1bmN0aW9uIFpnKHQsbixyKXtyZXR1cm4gbmV3IHQoe3R5cGU6InNldCIsdmFsdWVUeXBlOm4sLi4uaChyKX0pfWZ1bmN0aW9uIFJnKHQsbixyKXtjb25zdCBvPUFycmF5LmlzQXJyYXkobik/T2JqZWN0LmZyb21FbnRyaWVzKG4ubWFwKGU9PltlLGVdKSk6bjtyZXR1cm4gbmV3IHQoe3R5cGU6ImVudW0iLGVudHJpZXM6bywuLi5oKHIpfSl9ZnVuY3Rpb24gQ2codCxuLHIpe3JldHVybiBuZXcgdCh7dHlwZToiZW51bSIsZW50cmllczpuLC4uLmgocil9KX1mdW5jdGlvbiBBZyh0LG4scil7cmV0dXJuIG5ldyB0KHt0eXBlOiJsaXRlcmFsIix2YWx1ZXM6QXJyYXkuaXNBcnJheShuKT9uOltuXSwuLi5oKHIpfSl9ZnVuY3Rpb24gc2QodCxuKXtyZXR1cm4gbmV3IHQoe3R5cGU6ImZpbGUiLC4uLmgobil9KX1mdW5jdGlvbiBMZyh0LG4pe3JldHVybiBuZXcgdCh7dHlwZToidHJhbnNmb3JtIix0cmFuc2Zvcm06bn0pfWZ1bmN0aW9uIE1nKHQsbil7cmV0dXJuIG5ldyB0KHt0eXBlOiJvcHRpb25hbCIsaW5uZXJUeXBlOm59KX1mdW5jdGlvbiBxZyh0LG4pe3JldHVybiBuZXcgdCh7dHlwZToibnVsbGFibGUiLGlubmVyVHlwZTpufSl9ZnVuY3Rpb24gRmcodCxuLHIpe3JldHVybiBuZXcgdCh7dHlwZToiZGVmYXVsdCIsaW5uZXJUeXBlOm4sZ2V0IGRlZmF1bHRWYWx1ZSgpe3JldHVybiB0eXBlb2Ygcj09ImZ1bmN0aW9uIj9yKCk6Vm4ocil9fSl9ZnVuY3Rpb24gSmcodCxuLHIpe3JldHVybiBuZXcgdCh7dHlwZToibm9ub3B0aW9uYWwiLGlubmVyVHlwZTpuLC4uLmgocil9KX1mdW5jdGlvbiBIZyh0LG4pe3JldHVybiBuZXcgdCh7dHlwZToic3VjY2VzcyIsaW5uZXJUeXBlOm59KX1mdW5jdGlvbiBXZyh0LG4scil7cmV0dXJuIG5ldyB0KHt0eXBlOiJjYXRjaCIsaW5uZXJUeXBlOm4sY2F0Y2hWYWx1ZTp0eXBlb2Ygcj09ImZ1bmN0aW9uIj9yOigpPT5yfSl9ZnVuY3Rpb24gQmcodCxuLHIpe3JldHVybiBuZXcgdCh7dHlwZToicGlwZSIsaW46bixvdXQ6cn0pfWZ1bmN0aW9uIFZnKHQsbil7cmV0dXJuIG5ldyB0KHt0eXBlOiJyZWFkb25seSIsaW5uZXJUeXBlOm59KX1mdW5jdGlvbiBLZyh0LG4scil7cmV0dXJuIG5ldyB0KHt0eXBlOiJ0ZW1wbGF0ZV9saXRlcmFsIixwYXJ0czpuLC4uLmgocil9KX1mdW5jdGlvbiBHZyh0LG4pe3JldHVybiBuZXcgdCh7dHlwZToibGF6eSIsZ2V0dGVyOm59KX1mdW5jdGlvbiBYZyh0LG4pe3JldHVybiBuZXcgdCh7dHlwZToicHJvbWlzZSIsaW5uZXJUeXBlOm59KX1mdW5jdGlvbiBjZCh0LG4scil7Y29uc3Qgbz1oKHIpO3JldHVybiBvLmFib3J0Pz8oby5hYm9ydD0hMCksbmV3IHQoe3R5cGU6ImN1c3RvbSIsY2hlY2s6ImN1c3RvbSIsZm46biwuLi5vfSl9ZnVuY3Rpb24gdWQodCxuLHIpe3JldHVybiBuZXcgdCh7dHlwZToiY3VzdG9tIixjaGVjazoiY3VzdG9tIixmbjpuLC4uLmgocil9KX1mdW5jdGlvbiBsZCh0LG4pe2NvbnN0IHI9ZGQobz0+KG8uYWRkSXNzdWU9ZT0+e2lmKHR5cGVvZiBlPT0ic3RyaW5nIilvLmlzc3Vlcy5wdXNoKFdlKGUsby52YWx1ZSxyLl96b2QuZGVmKSk7ZWxzZXtjb25zdCBpPWU7aS5mYXRhbCYmKGkuY29udGludWU9ITEpLGkuY29kZT8/KGkuY29kZT0iY3VzdG9tIiksaS5pbnB1dD8/KGkuaW5wdXQ9by52YWx1ZSksaS5pbnN0Pz8oaS5pbnN0PXIpLGkuY29udGludWU/PyhpLmNvbnRpbnVlPSFyLl96b2QuZGVmLmFib3J0KSxvLmlzc3Vlcy5wdXNoKFdlKGkpKX19LHQoby52YWx1ZSxvKSksbik7cmV0dXJuIHJ9ZnVuY3Rpb24gZGQodCxuKXtjb25zdCByPW5ldyBKKHtjaGVjazoiY3VzdG9tIiwuLi5oKG4pfSk7cmV0dXJuIHIuX3pvZC5jaGVjaz10LHJ9ZnVuY3Rpb24gbWQodCl7Y29uc3Qgbj1uZXcgSih7Y2hlY2s6ImRlc2NyaWJlIn0pO3JldHVybiBuLl96b2Qub25hdHRhY2g9W3I9Pntjb25zdCBvPWNlLmdldChyKT8/e307Y2UuYWRkKHIsey4uLm8sZGVzY3JpcHRpb246dH0pfV0sbi5fem9kLmNoZWNrPSgpPT57fSxufWZ1bmN0aW9uIHBkKHQpe2NvbnN0IG49bmV3IEooe2NoZWNrOiJtZXRhIn0pO3JldHVybiBuLl96b2Qub25hdHRhY2g9W3I9Pntjb25zdCBvPWNlLmdldChyKT8/e307Y2UuYWRkKHIsey4uLm8sLi4udH0pfV0sbi5fem9kLmNoZWNrPSgpPT57fSxufWZ1bmN0aW9uIGZkKHQsbil7Y29uc3Qgcj1oKG4pO2xldCBvPXIudHJ1dGh5Pz9bInRydWUiLCIxIiwieWVzIiwib24iLCJ5IiwiZW5hYmxlZCJdLGU9ci5mYWxzeT8/WyJmYWxzZSIsIjAiLCJubyIsIm9mZiIsIm4iLCJkaXNhYmxlZCJdO3IuY2FzZSE9PSJzZW5zaXRpdmUiJiYobz1vLm1hcCgkPT50eXBlb2YgJD09InN0cmluZyI/JC50b0xvd2VyQ2FzZSgpOiQpLGU9ZS5tYXAoJD0+dHlwZW9mICQ9PSJzdHJpbmciPyQudG9Mb3dlckNhc2UoKTokKSk7Y29uc3QgaT1uZXcgU2V0KG8pLGE9bmV3IFNldChlKSxzPXQuQ29kZWM/P0ZpLGM9dC5Cb29sZWFuPz9DaSx1PXQuU3RyaW5nPz9adCxsPW5ldyB1KHt0eXBlOiJzdHJpbmciLGVycm9yOnIuZXJyb3J9KSxnPW5ldyBjKHt0eXBlOiJib29sZWFuIixlcnJvcjpyLmVycm9yfSksdj1uZXcgcyh7dHlwZToicGlwZSIsaW46bCxvdXQ6Zyx0cmFuc2Zvcm06KCgkLHkpPT57bGV0IEg9JDtyZXR1cm4gci5jYXNlIT09InNlbnNpdGl2ZSImJihIPUgudG9Mb3dlckNhc2UoKSksaS5oYXMoSCk/ITA6YS5oYXMoSCk/ITE6KHkuaXNzdWVzLnB1c2goe2NvZGU6ImludmFsaWRfdmFsdWUiLGV4cGVjdGVkOiJzdHJpbmdib29sIix2YWx1ZXM6Wy4uLmksLi4uYV0saW5wdXQ6eS52YWx1ZSxpbnN0OnYsY29udGludWU6ITF9KSx7fSl9KSxyZXZlcnNlVHJhbnNmb3JtOigoJCx5KT0+JD09PSEwP29bMF18fCJ0cnVlIjplWzBdfHwiZmFsc2UiKSxlcnJvcjpyLmVycm9yfSk7cmV0dXJuIHZ9ZnVuY3Rpb24gS3QodCxuLHIsbz17fSl7Y29uc3QgZT1oKG8pLGk9ey4uLmgobyksY2hlY2s6InN0cmluZ19mb3JtYXQiLHR5cGU6InN0cmluZyIsZm9ybWF0Om4sZm46dHlwZW9mIHI9PSJmdW5jdGlvbiI/cjpzPT5yLnRlc3QocyksLi4uZX07cmV0dXJuIHIgaW5zdGFuY2VvZiBSZWdFeHAmJihpLnBhdHRlcm49ciksbmV3IHQoaSl9ZnVuY3Rpb24gVmUodCl7bGV0IG49dD8udGFyZ2V0Pz8iZHJhZnQtMjAyMC0xMiI7cmV0dXJuIG49PT0iZHJhZnQtNCImJihuPSJkcmFmdC0wNCIpLG49PT0iZHJhZnQtNyImJihuPSJkcmFmdC0wNyIpLHtwcm9jZXNzb3JzOnQucHJvY2Vzc29ycz8/e30sbWV0YWRhdGFSZWdpc3RyeTp0Py5tZXRhZGF0YT8/Y2UsdGFyZ2V0Om4sdW5yZXByZXNlbnRhYmxlOnQ/LnVucmVwcmVzZW50YWJsZT8/InRocm93IixvdmVycmlkZTp0Py5vdmVycmlkZT8/KCgpPT57fSksaW86dD8uaW8/PyJvdXRwdXQiLGNvdW50ZXI6MCxzZWVuOm5ldyBNYXAsY3ljbGVzOnQ/LmN5Y2xlcz8/InJlZiIscmV1c2VkOnQ/LnJldXNlZD8/ImlubGluZSIsZXh0ZXJuYWw6dD8uZXh0ZXJuYWw/P3ZvaWQgMH19ZnVuY3Rpb24gQyh0LG4scj17cGF0aDpbXSxzY2hlbWFQYXRoOltdfSl7dmFyIG87Y29uc3QgZT10Ll96b2QuZGVmLGk9bi5zZWVuLmdldCh0KTtpZihpKXJldHVybiBpLmNvdW50Kyssci5zY2hlbWFQYXRoLmluY2x1ZGVzKHQpJiYoaS5jeWNsZT1yLnBhdGgpLGkuc2NoZW1hO2NvbnN0IGE9e3NjaGVtYTp7fSxjb3VudDoxLGN5Y2xlOnZvaWQgMCxwYXRoOnIucGF0aH07bi5zZWVuLnNldCh0LGEpO2NvbnN0IHM9dC5fem9kLnRvSlNPTlNjaGVtYT8uKCk7aWYocylhLnNjaGVtYT1zO2Vsc2V7Y29uc3QgbD17Li4ucixzY2hlbWFQYXRoOlsuLi5yLnNjaGVtYVBhdGgsdF0scGF0aDpyLnBhdGh9O2lmKHQuX3pvZC5wcm9jZXNzSlNPTlNjaGVtYSl0Ll96b2QucHJvY2Vzc0pTT05TY2hlbWEobixhLnNjaGVtYSxsKTtlbHNle2NvbnN0IHY9YS5zY2hlbWEsJD1uLnByb2Nlc3NvcnNbZS50eXBlXTtpZighJCl0aHJvdyBuZXcgRXJyb3IoYFt0b0pTT05TY2hlbWFdOiBOb24tcmVwcmVzZW50YWJsZSB0eXBlIGVuY291bnRlcmVkOiAke2UudHlwZX1gKTskKHQsbix2LGwpfWNvbnN0IGc9dC5fem9kLnBhcmVudDtnJiYoYS5yZWZ8fChhLnJlZj1nKSxDKGcsbixsKSxuLnNlZW4uZ2V0KGcpLmlzUGFyZW50PSEwKX1jb25zdCBjPW4ubWV0YWRhdGFSZWdpc3RyeS5nZXQodCk7cmV0dXJuIGMmJk9iamVjdC5hc3NpZ24oYS5zY2hlbWEsYyksbi5pbz09PSJpbnB1dCImJnJlKHQpJiYoZGVsZXRlIGEuc2NoZW1hLmV4YW1wbGVzLGRlbGV0ZSBhLnNjaGVtYS5kZWZhdWx0KSxuLmlvPT09ImlucHV0IiYmIl9wcmVmYXVsdCJpbiBhLnNjaGVtYSYmKChvPWEuc2NoZW1hKS5kZWZhdWx0Pz8oby5kZWZhdWx0PWEuc2NoZW1hLl9wcmVmYXVsdCkpLGRlbGV0ZSBhLnNjaGVtYS5fcHJlZmF1bHQsbi5zZWVuLmdldCh0KS5zY2hlbWF9ZnVuY3Rpb24gS2UodCxuKXtjb25zdCByPXQuc2Vlbi5nZXQobik7aWYoIXIpdGhyb3cgbmV3IEVycm9yKCJVbnByb2Nlc3NlZCBzY2hlbWEuIFRoaXMgaXMgYSBidWcgaW4gWm9kLiIpO2NvbnN0IG89bmV3IE1hcDtmb3IoY29uc3QgYSBvZiB0LnNlZW4uZW50cmllcygpKXtjb25zdCBzPXQubWV0YWRhdGFSZWdpc3RyeS5nZXQoYVswXSk/LmlkO2lmKHMpe2NvbnN0IGM9by5nZXQocyk7aWYoYyYmYyE9PWFbMF0pdGhyb3cgbmV3IEVycm9yKGBEdXBsaWNhdGUgc2NoZW1hIGlkICIke3N9IiBkZXRlY3RlZCBkdXJpbmcgSlNPTiBTY2hlbWEgY29udmVyc2lvbi4gVHdvIGRpZmZlcmVudCBzY2hlbWFzIGNhbm5vdCBzaGFyZSB0aGUgc2FtZSBpZCB3aGVuIGNvbnZlcnRlZCB0b2dldGhlci5gKTtvLnNldChzLGFbMF0pfX1jb25zdCBlPWE9Pntjb25zdCBzPXQudGFyZ2V0PT09ImRyYWZ0LTIwMjAtMTIiPyIkZGVmcyI6ImRlZmluaXRpb25zIjtpZih0LmV4dGVybmFsKXtjb25zdCBnPXQuZXh0ZXJuYWwucmVnaXN0cnkuZ2V0KGFbMF0pPy5pZCx2PXQuZXh0ZXJuYWwudXJpPz8oeT0+eSk7aWYoZylyZXR1cm57cmVmOnYoZyl9O2NvbnN0ICQ9YVsxXS5kZWZJZD8/YVsxXS5zY2hlbWEuaWQ/P2BzY2hlbWEke3QuY291bnRlcisrfWA7cmV0dXJuIGFbMV0uZGVmSWQ9JCx7ZGVmSWQ6JCxyZWY6YCR7digiX19zaGFyZWQiKX0jLyR7c30vJHskfWB9fWlmKGFbMV09PT1yKXJldHVybntyZWY6IiMifTtjb25zdCB1PWAjLyR7c30vYCxsPWFbMV0uc2NoZW1hLmlkPz9gX19zY2hlbWEke3QuY291bnRlcisrfWA7cmV0dXJue2RlZklkOmwscmVmOnUrbH19LGk9YT0+e2lmKGFbMV0uc2NoZW1hLiRyZWYpcmV0dXJuO2NvbnN0IHM9YVsxXSx7cmVmOmMsZGVmSWQ6dX09ZShhKTtzLmRlZj17Li4ucy5zY2hlbWF9LHUmJihzLmRlZklkPXUpO2NvbnN0IGw9cy5zY2hlbWE7Zm9yKGNvbnN0IGcgaW4gbClkZWxldGUgbFtnXTtsLiRyZWY9Y307aWYodC5jeWNsZXM9PT0idGhyb3ciKWZvcihjb25zdCBhIG9mIHQuc2Vlbi5lbnRyaWVzKCkpe2NvbnN0IHM9YVsxXTtpZihzLmN5Y2xlKXRocm93IG5ldyBFcnJvcihgQ3ljbGUgZGV0ZWN0ZWQ6ICMvJHtzLmN5Y2xlPy5qb2luKCIvIil9Lzxyb290PgoKU2V0IHRoZSBcYGN5Y2xlc1xgIHBhcmFtZXRlciB0byBcYCJyZWYiXGAgdG8gcmVzb2x2ZSBjeWNsaWNhbCBzY2hlbWFzIHdpdGggZGVmcy5gKX1mb3IoY29uc3QgYSBvZiB0LnNlZW4uZW50cmllcygpKXtjb25zdCBzPWFbMV07aWYobj09PWFbMF0pe2koYSk7Y29udGludWV9aWYodC5leHRlcm5hbCl7Y29uc3QgdT10LmV4dGVybmFsLnJlZ2lzdHJ5LmdldChhWzBdKT8uaWQ7aWYobiE9PWFbMF0mJnUpe2koYSk7Y29udGludWV9fWlmKHQubWV0YWRhdGFSZWdpc3RyeS5nZXQoYVswXSk/LmlkKXtpKGEpO2NvbnRpbnVlfWlmKHMuY3ljbGUpe2koYSk7Y29udGludWV9aWYocy5jb3VudD4xJiZ0LnJldXNlZD09PSJyZWYiKXtpKGEpO2NvbnRpbnVlfX19ZnVuY3Rpb24gR2UodCxuKXtjb25zdCByPXQuc2Vlbi5nZXQobik7aWYoIXIpdGhyb3cgbmV3IEVycm9yKCJVbnByb2Nlc3NlZCBzY2hlbWEuIFRoaXMgaXMgYSBidWcgaW4gWm9kLiIpO2NvbnN0IG89cz0+e2NvbnN0IGM9dC5zZWVuLmdldChzKTtpZihjLnJlZj09PW51bGwpcmV0dXJuO2NvbnN0IHU9Yy5kZWY/P2Muc2NoZW1hLGw9ey4uLnV9LGc9Yy5yZWY7aWYoYy5yZWY9bnVsbCxnKXtvKGcpO2NvbnN0ICQ9dC5zZWVuLmdldChnKSx5PSQuc2NoZW1hO2lmKHkuJHJlZiYmKHQudGFyZ2V0PT09ImRyYWZ0LTA3Inx8dC50YXJnZXQ9PT0iZHJhZnQtMDQifHx0LnRhcmdldD09PSJvcGVuYXBpLTMuMCIpPyh1LmFsbE9mPXUuYWxsT2Y/P1tdLHUuYWxsT2YucHVzaCh5KSk6T2JqZWN0LmFzc2lnbih1LHkpLE9iamVjdC5hc3NpZ24odSxsKSxzLl96b2QucGFyZW50PT09Zylmb3IoY29uc3QgTCBpbiB1KUw9PT0iJHJlZiJ8fEw9PT0iYWxsT2YifHxMIGluIGx8fGRlbGV0ZSB1W0xdO2lmKHkuJHJlZiYmJC5kZWYpZm9yKGNvbnN0IEwgaW4gdSlMPT09IiRyZWYifHxMPT09ImFsbE9mInx8TCBpbiAkLmRlZiYmSlNPTi5zdHJpbmdpZnkodVtMXSk9PT1KU09OLnN0cmluZ2lmeSgkLmRlZltMXSkmJmRlbGV0ZSB1W0xdfWNvbnN0IHY9cy5fem9kLnBhcmVudDtpZih2JiZ2IT09Zyl7byh2KTtjb25zdCAkPXQuc2Vlbi5nZXQodik7aWYoJD8uc2NoZW1hLiRyZWYmJih1LiRyZWY9JC5zY2hlbWEuJHJlZiwkLmRlZikpZm9yKGNvbnN0IHkgaW4gdSl5PT09IiRyZWYifHx5PT09ImFsbE9mInx8eSBpbiAkLmRlZiYmSlNPTi5zdHJpbmdpZnkodVt5XSk9PT1KU09OLnN0cmluZ2lmeSgkLmRlZlt5XSkmJmRlbGV0ZSB1W3ldfXQub3ZlcnJpZGUoe3pvZFNjaGVtYTpzLGpzb25TY2hlbWE6dSxwYXRoOmMucGF0aD8/W119KX07Zm9yKGNvbnN0IHMgb2ZbLi4udC5zZWVuLmVudHJpZXMoKV0ucmV2ZXJzZSgpKW8oc1swXSk7Y29uc3QgZT17fTtpZih0LnRhcmdldD09PSJkcmFmdC0yMDIwLTEyIj9lLiRzY2hlbWE9Imh0dHBzOi8vanNvbi1zY2hlbWEub3JnL2RyYWZ0LzIwMjAtMTIvc2NoZW1hIjp0LnRhcmdldD09PSJkcmFmdC0wNyI/ZS4kc2NoZW1hPSJodHRwOi8vanNvbi1zY2hlbWEub3JnL2RyYWZ0LTA3L3NjaGVtYSMiOnQudGFyZ2V0PT09ImRyYWZ0LTA0Ij9lLiRzY2hlbWE9Imh0dHA6Ly9qc29uLXNjaGVtYS5vcmcvZHJhZnQtMDQvc2NoZW1hIyI6dC50YXJnZXQsdC5leHRlcm5hbD8udXJpKXtjb25zdCBzPXQuZXh0ZXJuYWwucmVnaXN0cnkuZ2V0KG4pPy5pZDtpZighcyl0aHJvdyBuZXcgRXJyb3IoIlNjaGVtYSBpcyBtaXNzaW5nIGFuIGBpZGAgcHJvcGVydHkiKTtlLiRpZD10LmV4dGVybmFsLnVyaShzKX1PYmplY3QuYXNzaWduKGUsci5kZWY/P3Iuc2NoZW1hKTtjb25zdCBpPXQubWV0YWRhdGFSZWdpc3RyeS5nZXQobik/LmlkO2khPT12b2lkIDAmJmUuaWQ9PT1pJiZkZWxldGUgZS5pZDtjb25zdCBhPXQuZXh0ZXJuYWw/LmRlZnM/P3t9O2Zvcihjb25zdCBzIG9mIHQuc2Vlbi5lbnRyaWVzKCkpe2NvbnN0IGM9c1sxXTtjLmRlZiYmYy5kZWZJZCYmKGMuZGVmLmlkPT09Yy5kZWZJZCYmZGVsZXRlIGMuZGVmLmlkLGFbYy5kZWZJZF09Yy5kZWYpfXQuZXh0ZXJuYWx8fE9iamVjdC5rZXlzKGEpLmxlbmd0aD4wJiYodC50YXJnZXQ9PT0iZHJhZnQtMjAyMC0xMiI/ZS4kZGVmcz1hOmUuZGVmaW5pdGlvbnM9YSk7dHJ5e2NvbnN0IHM9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShlKSk7cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzLCJ+c3RhbmRhcmQiLHt2YWx1ZTp7Li4ublsifnN0YW5kYXJkIl0sanNvblNjaGVtYTp7aW5wdXQ6U3QobiwiaW5wdXQiLHQucHJvY2Vzc29ycyksb3V0cHV0OlN0KG4sIm91dHB1dCIsdC5wcm9jZXNzb3JzKX19LGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITF9KSxzfWNhdGNoe3Rocm93IG5ldyBFcnJvcigiRXJyb3IgY29udmVydGluZyBzY2hlbWEgdG8gSlNPTi4iKX19ZnVuY3Rpb24gcmUodCxuKXtjb25zdCByPW4/P3tzZWVuOm5ldyBTZXR9O2lmKHIuc2Vlbi5oYXModCkpcmV0dXJuITE7ci5zZWVuLmFkZCh0KTtjb25zdCBvPXQuX3pvZC5kZWY7aWYoby50eXBlPT09InRyYW5zZm9ybSIpcmV0dXJuITA7aWYoby50eXBlPT09ImFycmF5IilyZXR1cm4gcmUoby5lbGVtZW50LHIpO2lmKG8udHlwZT09PSJzZXQiKXJldHVybiByZShvLnZhbHVlVHlwZSxyKTtpZihvLnR5cGU9PT0ibGF6eSIpcmV0dXJuIHJlKG8uZ2V0dGVyKCkscik7aWYoby50eXBlPT09InByb21pc2UifHxvLnR5cGU9PT0ib3B0aW9uYWwifHxvLnR5cGU9PT0ibm9ub3B0aW9uYWwifHxvLnR5cGU9PT0ibnVsbGFibGUifHxvLnR5cGU9PT0icmVhZG9ubHkifHxvLnR5cGU9PT0iZGVmYXVsdCJ8fG8udHlwZT09PSJwcmVmYXVsdCIpcmV0dXJuIHJlKG8uaW5uZXJUeXBlLHIpO2lmKG8udHlwZT09PSJpbnRlcnNlY3Rpb24iKXJldHVybiByZShvLmxlZnQscil8fHJlKG8ucmlnaHQscik7aWYoby50eXBlPT09InJlY29yZCJ8fG8udHlwZT09PSJtYXAiKXJldHVybiByZShvLmtleVR5cGUscil8fHJlKG8udmFsdWVUeXBlLHIpO2lmKG8udHlwZT09PSJwaXBlIilyZXR1cm4gdC5fem9kLnRyYWl0cy5oYXMoIiRab2RDb2RlYyIpPyEwOnJlKG8uaW4scil8fHJlKG8ub3V0LHIpO2lmKG8udHlwZT09PSJvYmplY3QiKXtmb3IoY29uc3QgZSBpbiBvLnNoYXBlKWlmKHJlKG8uc2hhcGVbZV0scikpcmV0dXJuITA7cmV0dXJuITF9aWYoby50eXBlPT09InVuaW9uIil7Zm9yKGNvbnN0IGUgb2Ygby5vcHRpb25zKWlmKHJlKGUscikpcmV0dXJuITA7cmV0dXJuITF9aWYoby50eXBlPT09InR1cGxlIil7Zm9yKGNvbnN0IGUgb2Ygby5pdGVtcylpZihyZShlLHIpKXJldHVybiEwO3JldHVybiEhKG8ucmVzdCYmcmUoby5yZXN0LHIpKX1yZXR1cm4hMX1jb25zdCBnZD0odCxuPXt9KT0+cj0+e2NvbnN0IG89VmUoey4uLnIscHJvY2Vzc29yczpufSk7cmV0dXJuIEModCxvKSxLZShvLHQpLEdlKG8sdCl9LFN0PSh0LG4scj17fSk9Pm89Pntjb25zdHtsaWJyYXJ5T3B0aW9uczplLHRhcmdldDppfT1vPz97fSxhPVZlKHsuLi5lPz97fSx0YXJnZXQ6aSxpbzpuLHByb2Nlc3NvcnM6cn0pO3JldHVybiBDKHQsYSksS2UoYSx0KSxHZShhLHQpfSxZZz17Z3VpZDoidXVpZCIsdXJsOiJ1cmkiLGRhdGV0aW1lOiJkYXRlLXRpbWUiLGpzb25fc3RyaW5nOiJqc29uLXN0cmluZyIscmVnZXg6IiJ9LHZkPSh0LG4scixvKT0+e2NvbnN0IGU9cjtlLnR5cGU9InN0cmluZyI7Y29uc3R7bWluaW11bTppLG1heGltdW06YSxmb3JtYXQ6cyxwYXR0ZXJuczpjLGNvbnRlbnRFbmNvZGluZzp1fT10Ll96b2QuYmFnO2lmKHR5cGVvZiBpPT0ibnVtYmVyIiYmKGUubWluTGVuZ3RoPWkpLHR5cGVvZiBhPT0ibnVtYmVyIiYmKGUubWF4TGVuZ3RoPWEpLHMmJihlLmZvcm1hdD1ZZ1tzXT8/cyxlLmZvcm1hdD09PSIiJiZkZWxldGUgZS5mb3JtYXQscz09PSJ0aW1lIiYmZGVsZXRlIGUuZm9ybWF0KSx1JiYoZS5jb250ZW50RW5jb2Rpbmc9dSksYyYmYy5zaXplPjApe2NvbnN0IGw9Wy4uLmNdO2wubGVuZ3RoPT09MT9lLnBhdHRlcm49bFswXS5zb3VyY2U6bC5sZW5ndGg+MSYmKGUuYWxsT2Y9Wy4uLmwubWFwKGc9Pih7Li4ubi50YXJnZXQ9PT0iZHJhZnQtMDcifHxuLnRhcmdldD09PSJkcmFmdC0wNCJ8fG4udGFyZ2V0PT09Im9wZW5hcGktMy4wIj97dHlwZToic3RyaW5nIn06e30scGF0dGVybjpnLnNvdXJjZX0pKV0pfX0saGQ9KHQsbixyLG8pPT57Y29uc3QgZT1yLHttaW5pbXVtOmksbWF4aW11bTphLGZvcm1hdDpzLG11bHRpcGxlT2Y6YyxleGNsdXNpdmVNYXhpbXVtOnUsZXhjbHVzaXZlTWluaW11bTpsfT10Ll96b2QuYmFnO3R5cGVvZiBzPT0ic3RyaW5nIiYmcy5pbmNsdWRlcygiaW50Iik/ZS50eXBlPSJpbnRlZ2VyIjplLnR5cGU9Im51bWJlciI7Y29uc3QgZz10eXBlb2YgbD09Im51bWJlciImJmw+PShpPz9OdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkpLHY9dHlwZW9mIHU9PSJudW1iZXIiJiZ1PD0oYT8/TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKSwkPW4udGFyZ2V0PT09ImRyYWZ0LTA0Inx8bi50YXJnZXQ9PT0ib3BlbmFwaS0zLjAiO2c/JD8oZS5taW5pbXVtPWwsZS5leGNsdXNpdmVNaW5pbXVtPSEwKTplLmV4Y2x1c2l2ZU1pbmltdW09bDp0eXBlb2YgaT09Im51bWJlciImJihlLm1pbmltdW09aSksdj8kPyhlLm1heGltdW09dSxlLmV4Y2x1c2l2ZU1heGltdW09ITApOmUuZXhjbHVzaXZlTWF4aW11bT11OnR5cGVvZiBhPT0ibnVtYmVyIiYmKGUubWF4aW11bT1hKSx0eXBlb2YgYz09Im51bWJlciImJihlLm11bHRpcGxlT2Y9Yyl9LCRkPSh0LG4scixvKT0+e3IudHlwZT0iYm9vbGVhbiJ9LF9kPSh0LG4scixvKT0+e2lmKG4udW5yZXByZXNlbnRhYmxlPT09InRocm93Iil0aHJvdyBuZXcgRXJyb3IoIkJpZ0ludCBjYW5ub3QgYmUgcmVwcmVzZW50ZWQgaW4gSlNPTiBTY2hlbWEiKX0sYmQ9KHQsbixyLG8pPT57aWYobi51bnJlcHJlc2VudGFibGU9PT0idGhyb3ciKXRocm93IG5ldyBFcnJvcigiU3ltYm9scyBjYW5ub3QgYmUgcmVwcmVzZW50ZWQgaW4gSlNPTiBTY2hlbWEiKX0seWQ9KHQsbixyLG8pPT57bi50YXJnZXQ9PT0ib3BlbmFwaS0zLjAiPyhyLnR5cGU9InN0cmluZyIsci5udWxsYWJsZT0hMCxyLmVudW09W251bGxdKTpyLnR5cGU9Im51bGwifSxrZD0odCxuLHIsbyk9PntpZihuLnVucmVwcmVzZW50YWJsZT09PSJ0aHJvdyIpdGhyb3cgbmV3IEVycm9yKCJVbmRlZmluZWQgY2Fubm90IGJlIHJlcHJlc2VudGVkIGluIEpTT04gU2NoZW1hIil9LFNkPSh0LG4scixvKT0+e2lmKG4udW5yZXByZXNlbnRhYmxlPT09InRocm93Iil0aHJvdyBuZXcgRXJyb3IoIlZvaWQgY2Fubm90IGJlIHJlcHJlc2VudGVkIGluIEpTT04gU2NoZW1hIil9LHdkPSh0LG4scixvKT0+e3Iubm90PXt9fSxJZD0odCxuLHIsbyk9Pnt9LHpkPSh0LG4scixvKT0+e30seGQ9KHQsbixyLG8pPT57aWYobi51bnJlcHJlc2VudGFibGU9PT0idGhyb3ciKXRocm93IG5ldyBFcnJvcigiRGF0ZSBjYW5ub3QgYmUgcmVwcmVzZW50ZWQgaW4gSlNPTiBTY2hlbWEiKX0sVGQ9KHQsbixyLG8pPT57Y29uc3QgZT10Ll96b2QuZGVmLGk9dmkoZS5lbnRyaWVzKTtpLmV2ZXJ5KGE9PnR5cGVvZiBhPT0ibnVtYmVyIikmJihyLnR5cGU9Im51bWJlciIpLGkuZXZlcnkoYT0+dHlwZW9mIGE9PSJzdHJpbmciKSYmKHIudHlwZT0ic3RyaW5nIiksci5lbnVtPWl9LGpkPSh0LG4scixvKT0+e2NvbnN0IGU9dC5fem9kLmRlZixpPVtdO2Zvcihjb25zdCBhIG9mIGUudmFsdWVzKWlmKGE9PT12b2lkIDApe2lmKG4udW5yZXByZXNlbnRhYmxlPT09InRocm93Iil0aHJvdyBuZXcgRXJyb3IoIkxpdGVyYWwgYHVuZGVmaW5lZGAgY2Fubm90IGJlIHJlcHJlc2VudGVkIGluIEpTT04gU2NoZW1hIil9ZWxzZSBpZih0eXBlb2YgYT09ImJpZ2ludCIpe2lmKG4udW5yZXByZXNlbnRhYmxlPT09InRocm93Iil0aHJvdyBuZXcgRXJyb3IoIkJpZ0ludCBsaXRlcmFscyBjYW5ub3QgYmUgcmVwcmVzZW50ZWQgaW4gSlNPTiBTY2hlbWEiKTtpLnB1c2goTnVtYmVyKGEpKX1lbHNlIGkucHVzaChhKTtpZihpLmxlbmd0aCE9PTApaWYoaS5sZW5ndGg9PT0xKXtjb25zdCBhPWlbMF07ci50eXBlPWE9PT1udWxsPyJudWxsIjp0eXBlb2YgYSxuLnRhcmdldD09PSJkcmFmdC0wNCJ8fG4udGFyZ2V0PT09Im9wZW5hcGktMy4wIj9yLmVudW09W2FdOnIuY29uc3Q9YX1lbHNlIGkuZXZlcnkoYT0+dHlwZW9mIGE9PSJudW1iZXIiKSYmKHIudHlwZT0ibnVtYmVyIiksaS5ldmVyeShhPT50eXBlb2YgYT09InN0cmluZyIpJiYoci50eXBlPSJzdHJpbmciKSxpLmV2ZXJ5KGE9PnR5cGVvZiBhPT0iYm9vbGVhbiIpJiYoci50eXBlPSJib29sZWFuIiksaS5ldmVyeShhPT5hPT09bnVsbCkmJihyLnR5cGU9Im51bGwiKSxyLmVudW09aX0sT2Q9KHQsbixyLG8pPT57aWYobi51bnJlcHJlc2VudGFibGU9PT0idGhyb3ciKXRocm93IG5ldyBFcnJvcigiTmFOIGNhbm5vdCBiZSByZXByZXNlbnRlZCBpbiBKU09OIFNjaGVtYSIpfSxVZD0odCxuLHIsbyk9Pntjb25zdCBlPXIsaT10Ll96b2QucGF0dGVybjtpZighaSl0aHJvdyBuZXcgRXJyb3IoIlBhdHRlcm4gbm90IGZvdW5kIGluIHRlbXBsYXRlIGxpdGVyYWwiKTtlLnR5cGU9InN0cmluZyIsZS5wYXR0ZXJuPWkuc291cmNlfSxQZD0odCxuLHIsbyk9Pntjb25zdCBlPXIsaT17dHlwZToic3RyaW5nIixmb3JtYXQ6ImJpbmFyeSIsY29udGVudEVuY29kaW5nOiJiaW5hcnkifSx7bWluaW11bTphLG1heGltdW06cyxtaW1lOmN9PXQuX3pvZC5iYWc7YSE9PXZvaWQgMCYmKGkubWluTGVuZ3RoPWEpLHMhPT12b2lkIDAmJihpLm1heExlbmd0aD1zKSxjP2MubGVuZ3RoPT09MT8oaS5jb250ZW50TWVkaWFUeXBlPWNbMF0sT2JqZWN0LmFzc2lnbihlLGkpKTooT2JqZWN0LmFzc2lnbihlLGkpLGUuYW55T2Y9Yy5tYXAodT0+KHtjb250ZW50TWVkaWFUeXBlOnV9KSkpOk9iamVjdC5hc3NpZ24oZSxpKX0sTmQ9KHQsbixyLG8pPT57ci50eXBlPSJib29sZWFuIn0sRGQ9KHQsbixyLG8pPT57aWYobi51bnJlcHJlc2VudGFibGU9PT0idGhyb3ciKXRocm93IG5ldyBFcnJvcigiQ3VzdG9tIHR5cGVzIGNhbm5vdCBiZSByZXByZXNlbnRlZCBpbiBKU09OIFNjaGVtYSIpfSxFZD0odCxuLHIsbyk9PntpZihuLnVucmVwcmVzZW50YWJsZT09PSJ0aHJvdyIpdGhyb3cgbmV3IEVycm9yKCJGdW5jdGlvbiB0eXBlcyBjYW5ub3QgYmUgcmVwcmVzZW50ZWQgaW4gSlNPTiBTY2hlbWEiKX0sWmQ9KHQsbixyLG8pPT57aWYobi51bnJlcHJlc2VudGFibGU9PT0idGhyb3ciKXRocm93IG5ldyBFcnJvcigiVHJhbnNmb3JtcyBjYW5ub3QgYmUgcmVwcmVzZW50ZWQgaW4gSlNPTiBTY2hlbWEiKX0sUmQ9KHQsbixyLG8pPT57aWYobi51bnJlcHJlc2VudGFibGU9PT0idGhyb3ciKXRocm93IG5ldyBFcnJvcigiTWFwIGNhbm5vdCBiZSByZXByZXNlbnRlZCBpbiBKU09OIFNjaGVtYSIpfSxDZD0odCxuLHIsbyk9PntpZihuLnVucmVwcmVzZW50YWJsZT09PSJ0aHJvdyIpdGhyb3cgbmV3IEVycm9yKCJTZXQgY2Fubm90IGJlIHJlcHJlc2VudGVkIGluIEpTT04gU2NoZW1hIil9LEFkPSh0LG4scixvKT0+e2NvbnN0IGU9cixpPXQuX3pvZC5kZWYse21pbmltdW06YSxtYXhpbXVtOnN9PXQuX3pvZC5iYWc7dHlwZW9mIGE9PSJudW1iZXIiJiYoZS5taW5JdGVtcz1hKSx0eXBlb2Ygcz09Im51bWJlciImJihlLm1heEl0ZW1zPXMpLGUudHlwZT0iYXJyYXkiLGUuaXRlbXM9QyhpLmVsZW1lbnQsbix7Li4ubyxwYXRoOlsuLi5vLnBhdGgsIml0ZW1zIl19KX0sTGQ9KHQsbixyLG8pPT57Y29uc3QgZT1yLGk9dC5fem9kLmRlZjtlLnR5cGU9Im9iamVjdCIsZS5wcm9wZXJ0aWVzPXt9O2NvbnN0IGE9aS5zaGFwZTtmb3IoY29uc3QgdSBpbiBhKWUucHJvcGVydGllc1t1XT1DKGFbdV0sbix7Li4ubyxwYXRoOlsuLi5vLnBhdGgsInByb3BlcnRpZXMiLHVdfSk7Y29uc3Qgcz1uZXcgU2V0KE9iamVjdC5rZXlzKGEpKSxjPW5ldyBTZXQoWy4uLnNdLmZpbHRlcih1PT57Y29uc3QgbD1pLnNoYXBlW3VdLl96b2Q7cmV0dXJuIG4uaW89PT0iaW5wdXQiP2wub3B0aW49PT12b2lkIDA6bC5vcHRvdXQ9PT12b2lkIDB9KSk7Yy5zaXplPjAmJihlLnJlcXVpcmVkPUFycmF5LmZyb20oYykpLGkuY2F0Y2hhbGw/Ll96b2QuZGVmLnR5cGU9PT0ibmV2ZXIiP2UuYWRkaXRpb25hbFByb3BlcnRpZXM9ITE6aS5jYXRjaGFsbD9pLmNhdGNoYWxsJiYoZS5hZGRpdGlvbmFsUHJvcGVydGllcz1DKGkuY2F0Y2hhbGwsbix7Li4ubyxwYXRoOlsuLi5vLnBhdGgsImFkZGl0aW9uYWxQcm9wZXJ0aWVzIl19KSk6bi5pbz09PSJvdXRwdXQiJiYoZS5hZGRpdGlvbmFsUHJvcGVydGllcz0hMSl9LGdvPSh0LG4scixvKT0+e2NvbnN0IGU9dC5fem9kLmRlZixpPWUuaW5jbHVzaXZlPT09ITEsYT1lLm9wdGlvbnMubWFwKChzLGMpPT5DKHMsbix7Li4ubyxwYXRoOlsuLi5vLnBhdGgsaT8ib25lT2YiOiJhbnlPZiIsY119KSk7aT9yLm9uZU9mPWE6ci5hbnlPZj1hfSxNZD0odCxuLHIsbyk9Pntjb25zdCBlPXQuX3pvZC5kZWYsaT1DKGUubGVmdCxuLHsuLi5vLHBhdGg6Wy4uLm8ucGF0aCwiYWxsT2YiLDBdfSksYT1DKGUucmlnaHQsbix7Li4ubyxwYXRoOlsuLi5vLnBhdGgsImFsbE9mIiwxXX0pLHM9dT0+ImFsbE9mImluIHUmJk9iamVjdC5rZXlzKHUpLmxlbmd0aD09PTEsYz1bLi4ucyhpKT9pLmFsbE9mOltpXSwuLi5zKGEpP2EuYWxsT2Y6W2FdXTtyLmFsbE9mPWN9LHFkPSh0LG4scixvKT0+e2NvbnN0IGU9cixpPXQuX3pvZC5kZWY7ZS50eXBlPSJhcnJheSI7Y29uc3QgYT1uLnRhcmdldD09PSJkcmFmdC0yMDIwLTEyIj8icHJlZml4SXRlbXMiOiJpdGVtcyIscz1uLnRhcmdldD09PSJkcmFmdC0yMDIwLTEyInx8bi50YXJnZXQ9PT0ib3BlbmFwaS0zLjAiPyJpdGVtcyI6ImFkZGl0aW9uYWxJdGVtcyIsYz1pLml0ZW1zLm1hcCgodiwkKT0+Qyh2LG4sey4uLm8scGF0aDpbLi4uby5wYXRoLGEsJF19KSksdT1pLnJlc3Q/QyhpLnJlc3Qsbix7Li4ubyxwYXRoOlsuLi5vLnBhdGgscywuLi5uLnRhcmdldD09PSJvcGVuYXBpLTMuMCI/W2kuaXRlbXMubGVuZ3RoXTpbXV19KTpudWxsO24udGFyZ2V0PT09ImRyYWZ0LTIwMjAtMTIiPyhlLnByZWZpeEl0ZW1zPWMsdSYmKGUuaXRlbXM9dSkpOm4udGFyZ2V0PT09Im9wZW5hcGktMy4wIj8oZS5pdGVtcz17YW55T2Y6Y30sdSYmZS5pdGVtcy5hbnlPZi5wdXNoKHUpLGUubWluSXRlbXM9Yy5sZW5ndGgsdXx8KGUubWF4SXRlbXM9Yy5sZW5ndGgpKTooZS5pdGVtcz1jLHUmJihlLmFkZGl0aW9uYWxJdGVtcz11KSk7Y29uc3R7bWluaW11bTpsLG1heGltdW06Z309dC5fem9kLmJhZzt0eXBlb2YgbD09Im51bWJlciImJihlLm1pbkl0ZW1zPWwpLHR5cGVvZiBnPT0ibnVtYmVyIiYmKGUubWF4SXRlbXM9Zyl9LEZkPSh0LG4scixvKT0+e2NvbnN0IGU9cixpPXQuX3pvZC5kZWY7ZS50eXBlPSJvYmplY3QiO2NvbnN0IGE9aS5rZXlUeXBlLGM9YS5fem9kLmJhZz8ucGF0dGVybnM7aWYoaS5tb2RlPT09Imxvb3NlIiYmYyYmYy5zaXplPjApe2NvbnN0IGw9QyhpLnZhbHVlVHlwZSxuLHsuLi5vLHBhdGg6Wy4uLm8ucGF0aCwicGF0dGVyblByb3BlcnRpZXMiLCIqIl19KTtlLnBhdHRlcm5Qcm9wZXJ0aWVzPXt9O2Zvcihjb25zdCBnIG9mIGMpZS5wYXR0ZXJuUHJvcGVydGllc1tnLnNvdXJjZV09bH1lbHNlKG4udGFyZ2V0PT09ImRyYWZ0LTA3Inx8bi50YXJnZXQ9PT0iZHJhZnQtMjAyMC0xMiIpJiYoZS5wcm9wZXJ0eU5hbWVzPUMoaS5rZXlUeXBlLG4sey4uLm8scGF0aDpbLi4uby5wYXRoLCJwcm9wZXJ0eU5hbWVzIl19KSksZS5hZGRpdGlvbmFsUHJvcGVydGllcz1DKGkudmFsdWVUeXBlLG4sey4uLm8scGF0aDpbLi4uby5wYXRoLCJhZGRpdGlvbmFsUHJvcGVydGllcyJdfSk7Y29uc3QgdT1hLl96b2QudmFsdWVzO2lmKHUpe2NvbnN0IGw9Wy4uLnVdLmZpbHRlcihnPT50eXBlb2YgZz09InN0cmluZyJ8fHR5cGVvZiBnPT0ibnVtYmVyIik7bC5sZW5ndGg+MCYmKGUucmVxdWlyZWQ9bCl9fSxKZD0odCxuLHIsbyk9Pntjb25zdCBlPXQuX3pvZC5kZWYsaT1DKGUuaW5uZXJUeXBlLG4sbyksYT1uLnNlZW4uZ2V0KHQpO24udGFyZ2V0PT09Im9wZW5hcGktMy4wIj8oYS5yZWY9ZS5pbm5lclR5cGUsci5udWxsYWJsZT0hMCk6ci5hbnlPZj1baSx7dHlwZToibnVsbCJ9XX0sSGQ9KHQsbixyLG8pPT57Y29uc3QgZT10Ll96b2QuZGVmO0MoZS5pbm5lclR5cGUsbixvKTtjb25zdCBpPW4uc2Vlbi5nZXQodCk7aS5yZWY9ZS5pbm5lclR5cGV9LFdkPSh0LG4scixvKT0+e2NvbnN0IGU9dC5fem9kLmRlZjtDKGUuaW5uZXJUeXBlLG4sbyk7Y29uc3QgaT1uLnNlZW4uZ2V0KHQpO2kucmVmPWUuaW5uZXJUeXBlLHIuZGVmYXVsdD1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGUuZGVmYXVsdFZhbHVlKSl9LEJkPSh0LG4scixvKT0+e2NvbnN0IGU9dC5fem9kLmRlZjtDKGUuaW5uZXJUeXBlLG4sbyk7Y29uc3QgaT1uLnNlZW4uZ2V0KHQpO2kucmVmPWUuaW5uZXJUeXBlLG4uaW89PT0iaW5wdXQiJiYoci5fcHJlZmF1bHQ9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShlLmRlZmF1bHRWYWx1ZSkpKX0sVmQ9KHQsbixyLG8pPT57Y29uc3QgZT10Ll96b2QuZGVmO0MoZS5pbm5lclR5cGUsbixvKTtjb25zdCBpPW4uc2Vlbi5nZXQodCk7aS5yZWY9ZS5pbm5lclR5cGU7bGV0IGE7dHJ5e2E9ZS5jYXRjaFZhbHVlKHZvaWQgMCl9Y2F0Y2h7dGhyb3cgbmV3IEVycm9yKCJEeW5hbWljIGNhdGNoIHZhbHVlcyBhcmUgbm90IHN1cHBvcnRlZCBpbiBKU09OIFNjaGVtYSIpfXIuZGVmYXVsdD1hfSxLZD0odCxuLHIsbyk9Pntjb25zdCBlPXQuX3pvZC5kZWYsaT1lLmluLl96b2QudHJhaXRzLmhhcygiJFpvZFRyYW5zZm9ybSIpLGE9bi5pbz09PSJpbnB1dCI/aT9lLm91dDplLmluOmUub3V0O0MoYSxuLG8pO2NvbnN0IHM9bi5zZWVuLmdldCh0KTtzLnJlZj1hfSxHZD0odCxuLHIsbyk9Pntjb25zdCBlPXQuX3pvZC5kZWY7QyhlLmlubmVyVHlwZSxuLG8pO2NvbnN0IGk9bi5zZWVuLmdldCh0KTtpLnJlZj1lLmlubmVyVHlwZSxyLnJlYWRPbmx5PSEwfSxYZD0odCxuLHIsbyk9Pntjb25zdCBlPXQuX3pvZC5kZWY7QyhlLmlubmVyVHlwZSxuLG8pO2NvbnN0IGk9bi5zZWVuLmdldCh0KTtpLnJlZj1lLmlubmVyVHlwZX0sdm89KHQsbixyLG8pPT57Y29uc3QgZT10Ll96b2QuZGVmO0MoZS5pbm5lclR5cGUsbixvKTtjb25zdCBpPW4uc2Vlbi5nZXQodCk7aS5yZWY9ZS5pbm5lclR5cGV9LFlkPSh0LG4scixvKT0+e2NvbnN0IGU9dC5fem9kLmlubmVyVHlwZTtDKGUsbixvKTtjb25zdCBpPW4uc2Vlbi5nZXQodCk7aS5yZWY9ZX0sZGk9e3N0cmluZzp2ZCxudW1iZXI6aGQsYm9vbGVhbjokZCxiaWdpbnQ6X2Qsc3ltYm9sOmJkLG51bGw6eWQsdW5kZWZpbmVkOmtkLHZvaWQ6U2QsbmV2ZXI6d2QsYW55OklkLHVua25vd246emQsZGF0ZTp4ZCxlbnVtOlRkLGxpdGVyYWw6amQsbmFuOk9kLHRlbXBsYXRlX2xpdGVyYWw6VWQsZmlsZTpQZCxzdWNjZXNzOk5kLGN1c3RvbTpEZCxmdW5jdGlvbjpFZCx0cmFuc2Zvcm06WmQsbWFwOlJkLHNldDpDZCxhcnJheTpBZCxvYmplY3Q6TGQsdW5pb246Z28saW50ZXJzZWN0aW9uOk1kLHR1cGxlOnFkLHJlY29yZDpGZCxudWxsYWJsZTpKZCxub25vcHRpb25hbDpIZCxkZWZhdWx0OldkLHByZWZhdWx0OkJkLGNhdGNoOlZkLHBpcGU6S2QscmVhZG9ubHk6R2QscHJvbWlzZTpYZCxvcHRpb25hbDp2byxsYXp5OllkfTtmdW5jdGlvbiBobyh0LG4pe2lmKCJfaWRtYXAiaW4gdCl7Y29uc3Qgbz10LGU9VmUoey4uLm4scHJvY2Vzc29yczpkaX0pLGk9e307Zm9yKGNvbnN0IGMgb2Ygby5faWRtYXAuZW50cmllcygpKXtjb25zdFt1LGxdPWM7QyhsLGUpfWNvbnN0IGE9e30scz17cmVnaXN0cnk6byx1cmk6bj8udXJpLGRlZnM6aX07ZS5leHRlcm5hbD1zO2Zvcihjb25zdCBjIG9mIG8uX2lkbWFwLmVudHJpZXMoKSl7Y29uc3RbdSxsXT1jO0tlKGUsbCksYVt1XT1HZShlLGwpfWlmKE9iamVjdC5rZXlzKGkpLmxlbmd0aD4wKXtjb25zdCBjPWUudGFyZ2V0PT09ImRyYWZ0LTIwMjAtMTIiPyIkZGVmcyI6ImRlZmluaXRpb25zIjthLl9fc2hhcmVkPXtbY106aX19cmV0dXJue3NjaGVtYXM6YX19Y29uc3Qgcj1WZSh7Li4ubixwcm9jZXNzb3JzOmRpfSk7cmV0dXJuIEModCxyKSxLZShyLHQpLEdlKHIsdCl9Y2xhc3MgUWd7Z2V0IG1ldGFkYXRhUmVnaXN0cnkoKXtyZXR1cm4gdGhpcy5jdHgubWV0YWRhdGFSZWdpc3RyeX1nZXQgdGFyZ2V0KCl7cmV0dXJuIHRoaXMuY3R4LnRhcmdldH1nZXQgdW5yZXByZXNlbnRhYmxlKCl7cmV0dXJuIHRoaXMuY3R4LnVucmVwcmVzZW50YWJsZX1nZXQgb3ZlcnJpZGUoKXtyZXR1cm4gdGhpcy5jdHgub3ZlcnJpZGV9Z2V0IGlvKCl7cmV0dXJuIHRoaXMuY3R4LmlvfWdldCBjb3VudGVyKCl7cmV0dXJuIHRoaXMuY3R4LmNvdW50ZXJ9c2V0IGNvdW50ZXIobil7dGhpcy5jdHguY291bnRlcj1ufWdldCBzZWVuKCl7cmV0dXJuIHRoaXMuY3R4LnNlZW59Y29uc3RydWN0b3Iobil7bGV0IHI9bj8udGFyZ2V0Pz8iZHJhZnQtMjAyMC0xMiI7cj09PSJkcmFmdC00IiYmKHI9ImRyYWZ0LTA0Iikscj09PSJkcmFmdC03IiYmKHI9ImRyYWZ0LTA3IiksdGhpcy5jdHg9VmUoe3Byb2Nlc3NvcnM6ZGksdGFyZ2V0OnIsLi4ubj8ubWV0YWRhdGEmJnttZXRhZGF0YTpuLm1ldGFkYXRhfSwuLi5uPy51bnJlcHJlc2VudGFibGUmJnt1bnJlcHJlc2VudGFibGU6bi51bnJlcHJlc2VudGFibGV9LC4uLm4/Lm92ZXJyaWRlJiZ7b3ZlcnJpZGU6bi5vdmVycmlkZX0sLi4ubj8uaW8mJntpbzpuLmlvfX0pfXByb2Nlc3MobixyPXtwYXRoOltdLHNjaGVtYVBhdGg6W119KXtyZXR1cm4gQyhuLHRoaXMuY3R4LHIpfWVtaXQobixyKXtyJiYoci5jeWNsZXMmJih0aGlzLmN0eC5jeWNsZXM9ci5jeWNsZXMpLHIucmV1c2VkJiYodGhpcy5jdHgucmV1c2VkPXIucmV1c2VkKSxyLmV4dGVybmFsJiYodGhpcy5jdHguZXh0ZXJuYWw9ci5leHRlcm5hbCkpLEtlKHRoaXMuY3R4LG4pO2NvbnN0IG89R2UodGhpcy5jdHgsbikseyJ+c3RhbmRhcmQiOmUsLi4uaX09bztyZXR1cm4gaX19Y29uc3QgZXY9T2JqZWN0LmZyZWV6ZShPYmplY3QuZGVmaW5lUHJvcGVydHkoe19fcHJvdG9fXzpudWxsfSxTeW1ib2wudG9TdHJpbmdUYWcse3ZhbHVlOiJNb2R1bGUifSkpLFFkPU9iamVjdC5mcmVlemUoT2JqZWN0LmRlZmluZVByb3BlcnR5KHtfX3Byb3RvX186bnVsbCwkWm9kQW55Okh1LCRab2RBcnJheTpHdSwkWm9kQXN5bmNFcnJvcjpOZSwkWm9kQmFzZTY0Ok51LCRab2RCYXNlNjRVUkw6RXUsJFpvZEJpZ0ludDpBaSwkWm9kQmlnSW50Rm9ybWF0Ok11LCRab2RCb29sZWFuOkNpLCRab2RDSURSdjQ6VXUsJFpvZENJRFJ2NjpQdSwkWm9kQ1VJRDpfdSwkWm9kQ1VJRDI6YnUsJFpvZENhdGNoOmhsLCRab2RDaGVjazpKLCRab2RDaGVja0JpZ0ludEZvcm1hdDpLYywkWm9kQ2hlY2tFbmRzV2l0aDpzdSwkWm9kQ2hlY2tHcmVhdGVyVGhhbjpFaSwkWm9kQ2hlY2tJbmNsdWRlczpvdSwkWm9kQ2hlY2tMZW5ndGhFcXVhbHM6dHUsJFpvZENoZWNrTGVzc1RoYW46RGksJFpvZENoZWNrTG93ZXJDYXNlOnJ1LCRab2RDaGVja01heExlbmd0aDpRYywkWm9kQ2hlY2tNYXhTaXplOkdjLCRab2RDaGVja01pbWVUeXBlOnV1LCRab2RDaGVja01pbkxlbmd0aDpldSwkWm9kQ2hlY2tNaW5TaXplOlhjLCRab2RDaGVja011bHRpcGxlT2Y6QmMsJFpvZENoZWNrTnVtYmVyRm9ybWF0OlZjLCRab2RDaGVja092ZXJ3cml0ZTpsdSwkWm9kQ2hlY2tQcm9wZXJ0eTpjdSwkWm9kQ2hlY2tSZWdleDpudSwkWm9kQ2hlY2tTaXplRXF1YWxzOlljLCRab2RDaGVja1N0YXJ0c1dpdGg6YXUsJFpvZENoZWNrU3RyaW5nRm9ybWF0OkV0LCRab2RDaGVja1VwcGVyQ2FzZTppdSwkWm9kQ29kZWM6RmksJFpvZEN1c3RvbTpJbCwkWm9kQ3VzdG9tU3RyaW5nRm9ybWF0OkF1LCRab2REYXRlOkt1LCRab2REZWZhdWx0OnBsLCRab2REaXNjcmltaW5hdGVkVW5pb246bmwsJFpvZEUxNjQ6WnUsJFpvZEVtYWlsOmd1LCRab2RFbW9qaTpodSwkWm9kRW5jb2RlRXJyb3I6V24sJFpvZEVudW06c2wsJFpvZEVycm9yOl9pLCRab2RFeGFjdE9wdGlvbmFsOmRsLCRab2RGaWxlOnVsLCRab2RGdW5jdGlvbjprbCwkWm9kR1VJRDpwdSwkWm9kSVB2NDpUdSwkWm9kSVB2NjpqdSwkWm9kSVNPRGF0ZTpJdSwkWm9kSVNPRGF0ZVRpbWU6d3UsJFpvZElTT0R1cmF0aW9uOnh1LCRab2RJU09UaW1lOnp1LCRab2RJbnRlcnNlY3Rpb246cmwsJFpvZEpXVDpDdSwkWm9kS1NVSUQ6U3UsJFpvZExhenk6d2wsJFpvZExpdGVyYWw6Y2wsJFpvZE1BQzpPdSwkWm9kTWFwOm9sLCRab2ROYU46JGwsJFpvZE5hbm9JRDokdSwkWm9kTmV2ZXI6QnUsJFpvZE5vbk9wdGlvbmFsOmdsLCRab2ROdWxsOkp1LCRab2ROdWxsYWJsZTptbCwkWm9kTnVtYmVyOlJpLCRab2ROdW1iZXJGb3JtYXQ6THUsJFpvZE9iamVjdDpRdSwkWm9kT2JqZWN0SklUOmVsLCRab2RPcHRpb25hbDpNaSwkWm9kUGlwZTpxaSwkWm9kUHJlZmF1bHQ6ZmwsJFpvZFByZXByb2Nlc3M6X2wsJFpvZFByb21pc2U6U2wsJFpvZFJlYWRvbmx5OmJsLCRab2RSZWFsRXJyb3I6bWUsJFpvZFJlY29yZDppbCwkWm9kUmVnaXN0cnk6amwsJFpvZFNldDphbCwkWm9kU3RyaW5nOlp0LCRab2RTdHJpbmdGb3JtYXQ6RiwkWm9kU3VjY2Vzczp2bCwkWm9kU3ltYm9sOnF1LCRab2RUZW1wbGF0ZUxpdGVyYWw6eWwsJFpvZFRyYW5zZm9ybTpsbCwkWm9kVHVwbGU6TGksJFpvZFR5cGU6eCwkWm9kVUxJRDp5dSwkWm9kVVJMOnZ1LCRab2RVVUlEOmZ1LCRab2RVbmRlZmluZWQ6RnUsJFpvZFVuaW9uOmVyLCRab2RVbmtub3duOld1LCRab2RWb2lkOlZ1LCRab2RYSUQ6a3UsJFpvZFhvcjp0bCwkYnJhbmQ6Z2ksJGNvbnN0cnVjdG9yOmQsJGlucHV0OldpLCRvdXRwdXQ6SGksRG9jOmR1LEpTT05TY2hlbWE6ZXYsSlNPTlNjaGVtYUdlbmVyYXRvcjpRZyxORVZFUjpmaSxUaW1lUHJlY2lzaW9uOmZvLF9hbnk6UWwsX2FycmF5OmFkLF9iYXNlNjQ6dW8sX2Jhc2U2NHVybDpsbyxfYmlnaW50OldsLF9ib29sZWFuOkpsLF9jYXRjaDpXZyxfY2hlY2s6ZGQsX2NpZHJ2NDpzbyxfY2lkcnY2OmNvLF9jb2VyY2VkQmlnaW50OkJsLF9jb2VyY2VkQm9vbGVhbjpIbCxfY29lcmNlZERhdGU6aWQsX2NvZXJjZWROdW1iZXI6Q2wsX2NvZXJjZWRTdHJpbmc6VWwsX2N1aWQ6ZW8sX2N1aWQyOnRvLF9jdXN0b206Y2QsX2RhdGU6cmQsX2RlY29kZTp3aSxfZGVjb2RlQXN5bmM6emksX2RlZmF1bHQ6RmcsX2Rpc2NyaW1pbmF0ZWRVbmlvbjpVZyxfZTE2NDptbyxfZW1haWw6QmksX2Vtb2ppOllpLF9lbmNvZGU6U2ksX2VuY29kZUFzeW5jOklpLF9lbmRzV2l0aDpxdCxfZW51bTpSZyxfZmlsZTpzZCxfZmxvYXQzMjpMbCxfZmxvYXQ2NDpNbCxfZ3Q6a2UsX2d0ZTppZSxfZ3VpZDpMbixfaW5jbHVkZXM6THQsX2ludDpBbCxfaW50MzI6cWwsX2ludDY0OlZsLF9pbnRlcnNlY3Rpb246UGcsX2lwdjQ6b28sX2lwdjY6YW8sX2lzb0RhdGU6RGwsX2lzb0RhdGVUaW1lOk5sLF9pc29EdXJhdGlvbjpabCxfaXNvVGltZTpFbCxfand0OnBvLF9rc3VpZDppbyxfbGF6eTpHZyxfbGVuZ3RoOml0LF9saXRlcmFsOkFnLF9sb3dlcmNhc2U6Q3QsX2x0OnllLF9sdGU6dWUsX21hYzpQbCxfbWFwOkVnLF9tYXg6dWUsX21heExlbmd0aDpydCxfbWF4U2l6ZTpMZSxfbWltZTpGdCxfbWluOmllLF9taW5MZW5ndGg6emUsX21pblNpemU6U2UsX211bHRpcGxlT2Y6RWUsX25hbjpvZCxfbmFub2lkOlFpLF9uYXRpdmVFbnVtOkNnLF9uZWdhdGl2ZTppcixfbmV2ZXI6dGQsX25vbm5lZ2F0aXZlOmFyLF9ub25vcHRpb25hbDpKZyxfbm9ucG9zaXRpdmU6b3IsX25vcm1hbGl6ZTpKdCxfbnVsbDpZbCxfbnVsbGFibGU6cWcsX251bWJlcjpSbCxfb3B0aW9uYWw6TWcsX292ZXJ3cml0ZTpfZSxfcGFyc2U6anQsX3BhcnNlQXN5bmM6T3QsX3BpcGU6QmcsX3Bvc2l0aXZlOnJyLF9wcm9taXNlOlhnLF9wcm9wZXJ0eTpzcixfcmVhZG9ubHk6VmcsX3JlY29yZDpEZyxfcmVmaW5lOnVkLF9yZWdleDpSdCxfc2FmZURlY29kZTpUaSxfc2FmZURlY29kZUFzeW5jOk9pLF9zYWZlRW5jb2RlOnhpLF9zYWZlRW5jb2RlQXN5bmM6amksX3NhZmVQYXJzZTpVdCxfc2FmZVBhcnNlQXN5bmM6UHQsX3NldDpaZyxfc2l6ZTpudCxfc2x1Z2lmeTpWdCxfc3RhcnRzV2l0aDpNdCxfc3RyaW5nOk9sLF9zdHJpbmdGb3JtYXQ6S3QsX3N0cmluZ2Jvb2w6ZmQsX3N1Y2Nlc3M6SGcsX3N1cGVyUmVmaW5lOmxkLF9zeW1ib2w6R2wsX3RlbXBsYXRlTGl0ZXJhbDpLZyxfdG9Mb3dlckNhc2U6V3QsX3RvVXBwZXJDYXNlOkJ0LF90cmFuc2Zvcm06TGcsX3RyaW06SHQsX3R1cGxlOk5nLF91aW50MzI6RmwsX3VpbnQ2NDpLbCxfdWxpZDpubyxfdW5kZWZpbmVkOlhsLF91bmlvbjpqZyxfdW5rbm93bjplZCxfdXBwZXJjYXNlOkF0LF91cmw6bnIsX3V1aWQ6VmksX3V1aWR2NDpLaSxfdXVpZHY2OkdpLF91dWlkdjc6WGksX3ZvaWQ6bmQsX3hpZDpybyxfeG9yOk9nLGNsb25lOmRlLGNvbmZpZzpLLGNyZWF0ZVN0YW5kYXJkSlNPTlNjaGVtYU1ldGhvZDpTdCxjcmVhdGVUb0pTT05TY2hlbWFNZXRob2Q6Z2QsZGVjb2RlOmFwLGRlY29kZUFzeW5jOmNwLGRlc2NyaWJlOm1kLGVuY29kZTpvcCxlbmNvZGVBc3luYzpzcCxleHRyYWN0RGVmczpLZSxmaW5hbGl6ZTpHZSxmbGF0dGVuRXJyb3I6WG4sZm9ybWF0RXJyb3I6WW4sZ2xvYmFsQ29uZmlnOmt0LGdsb2JhbFJlZ2lzdHJ5OmNlLGluaXRpYWxpemVDb250ZXh0OlZlLGlzVmFsaWRCYXNlNjQ6WmksaXNWYWxpZEJhc2U2NFVSTDpEdSxpc1ZhbGlkSldUOlJ1LGxvY2FsZXM6SmksbWV0YTpwZCxwYXJzZTpjaSxwYXJzZUFzeW5jOnVpLHByZXR0aWZ5RXJyb3I6eWkscHJvY2VzczpDLHJlZ2V4ZXM6UW4scmVnaXN0cnk6dHIsc2FmZURlY29kZTpscCxzYWZlRGVjb2RlQXN5bmM6bXAsc2FmZUVuY29kZTp1cCxzYWZlRW5jb2RlQXN5bmM6ZHAsc2FmZVBhcnNlOmtpLHNhZmVQYXJzZUFzeW5jOmRjLHRvRG90UGF0aDpsYyx0b0pTT05TY2hlbWE6aG8sdHJlZWlmeUVycm9yOmJpLHV0aWw6JGksdmVyc2lvbjptdX0sU3ltYm9sLnRvU3RyaW5nVGFnLHt2YWx1ZToiTW9kdWxlIn0pKTtmdW5jdGlvbiAkbyh0KXtyZXR1cm4hIXQuX3pvZH1mdW5jdGlvbiBlbSh0LG4pe3JldHVybiAkbyh0KT9raSh0LG4pOnQuc2FmZVBhcnNlKG4pfWZ1bmN0aW9uIHR2KHQpe2lmKCF0KXJldHVybjtsZXQgbjtpZigkbyh0KT9uPXQuX3pvZD8uZGVmPy5zaGFwZTpuPXQuc2hhcGUsISFuKXtpZih0eXBlb2Ygbj09ImZ1bmN0aW9uIil0cnl7cmV0dXJuIG4oKX1jYXRjaHtyZXR1cm59cmV0dXJuIG59fWZ1bmN0aW9uIG52KHQpe2lmKCRvKHQpKXtjb25zdCBpPXQuX3pvZD8uZGVmO2lmKGkpe2lmKGkudmFsdWUhPT12b2lkIDApcmV0dXJuIGkudmFsdWU7aWYoQXJyYXkuaXNBcnJheShpLnZhbHVlcykmJmkudmFsdWVzLmxlbmd0aD4wKXJldHVybiBpLnZhbHVlc1swXX19Y29uc3Qgcj10Ll9kZWY7aWYocil7aWYoci52YWx1ZSE9PXZvaWQgMClyZXR1cm4gci52YWx1ZTtpZihBcnJheS5pc0FycmF5KHIudmFsdWVzKSYmci52YWx1ZXMubGVuZ3RoPjApcmV0dXJuIHIudmFsdWVzWzBdfWNvbnN0IG89dC52YWx1ZTtpZihvIT09dm9pZCAwKXJldHVybiBvfWNvbnN0IHJ2PU9iamVjdC5mcmVlemUoT2JqZWN0LmRlZmluZVByb3BlcnR5KHtfX3Byb3RvX186bnVsbCxlbmRzV2l0aDpxdCxndDprZSxndGU6aWUsaW5jbHVkZXM6THQsbGVuZ3RoOml0LGxvd2VyY2FzZTpDdCxsdDp5ZSxsdGU6dWUsbWF4TGVuZ3RoOnJ0LG1heFNpemU6TGUsbWltZTpGdCxtaW5MZW5ndGg6emUsbWluU2l6ZTpTZSxtdWx0aXBsZU9mOkVlLG5lZ2F0aXZlOmlyLG5vbm5lZ2F0aXZlOmFyLG5vbnBvc2l0aXZlOm9yLG5vcm1hbGl6ZTpKdCxvdmVyd3JpdGU6X2UscG9zaXRpdmU6cnIscHJvcGVydHk6c3IscmVnZXg6UnQsc2l6ZTpudCxzbHVnaWZ5OlZ0LHN0YXJ0c1dpdGg6TXQsdG9Mb3dlckNhc2U6V3QsdG9VcHBlckNhc2U6QnQsdHJpbTpIdCx1cHBlcmNhc2U6QXR9LFN5bWJvbC50b1N0cmluZ1RhZyx7dmFsdWU6Ik1vZHVsZSJ9KSksY3I9ZCgiWm9kSVNPRGF0ZVRpbWUiLCh0LG4pPT57d3UuaW5pdCh0LG4pLEEuaW5pdCh0LG4pfSk7ZnVuY3Rpb24gX28odCl7cmV0dXJuIE5sKGNyLHQpfWNvbnN0IHVyPWQoIlpvZElTT0RhdGUiLCh0LG4pPT57SXUuaW5pdCh0LG4pLEEuaW5pdCh0LG4pfSk7ZnVuY3Rpb24gdG0odCl7cmV0dXJuIERsKHVyLHQpfWNvbnN0IGxyPWQoIlpvZElTT1RpbWUiLCh0LG4pPT57enUuaW5pdCh0LG4pLEEuaW5pdCh0LG4pfSk7ZnVuY3Rpb24gbm0odCl7cmV0dXJuIEVsKGxyLHQpfWNvbnN0IGRyPWQoIlpvZElTT0R1cmF0aW9uIiwodCxuKT0+e3h1LmluaXQodCxuKSxBLmluaXQodCxuKX0pO2Z1bmN0aW9uIHJtKHQpe3JldHVybiBabChkcix0KX1jb25zdCBibz1PYmplY3QuZnJlZXplKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7X19wcm90b19fOm51bGwsWm9kSVNPRGF0ZTp1cixab2RJU09EYXRlVGltZTpjcixab2RJU09EdXJhdGlvbjpkcixab2RJU09UaW1lOmxyLGRhdGU6dG0sZGF0ZXRpbWU6X28sZHVyYXRpb246cm0sdGltZTpubX0sU3ltYm9sLnRvU3RyaW5nVGFnLHt2YWx1ZToiTW9kdWxlIn0pKSxpbT0odCxuKT0+e19pLmluaXQodCxuKSx0Lm5hbWU9IlpvZEVycm9yIixPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0LHtmb3JtYXQ6e3ZhbHVlOnI9PlluKHQscil9LGZsYXR0ZW46e3ZhbHVlOnI9PlhuKHQscil9LGFkZElzc3VlOnt2YWx1ZTpyPT57dC5pc3N1ZXMucHVzaChyKSx0Lm1lc3NhZ2U9SlNPTi5zdHJpbmdpZnkodC5pc3N1ZXMsUm4sMil9fSxhZGRJc3N1ZXM6e3ZhbHVlOnI9Pnt0Lmlzc3Vlcy5wdXNoKC4uLnIpLHQubWVzc2FnZT1KU09OLnN0cmluZ2lmeSh0Lmlzc3VlcyxSbiwyKX19LGlzRW1wdHk6e2dldCgpe3JldHVybiB0Lmlzc3Vlcy5sZW5ndGg9PT0wfX19KX0sb209ZCgiWm9kRXJyb3IiLGltKSxzZT1kKCJab2RFcnJvciIsaW0se1BhcmVudDpFcnJvcn0pLHlvPWp0KHNlKSxrbz1PdChzZSksU289VXQoc2UpLHdvPVB0KHNlKSxJbz1TaShzZSksem89d2koc2UpLHhvPUlpKHNlKSxUbz16aShzZSksam89eGkoc2UpLE9vPVRpKHNlKSxVbz1qaShzZSksUG89T2koc2UpLFpzPW5ldyBXZWFrTWFwO2Z1bmN0aW9uIEd0KHQsbixyKXtjb25zdCBvPU9iamVjdC5nZXRQcm90b3R5cGVPZih0KTtsZXQgZT1acy5nZXQobyk7aWYoZXx8KGU9bmV3IFNldCxacy5zZXQobyxlKSksIWUuaGFzKG4pKXtlLmFkZChuKTtmb3IoY29uc3QgaSBpbiByKXtjb25zdCBhPXJbaV07T2JqZWN0LmRlZmluZVByb3BlcnR5KG8saSx7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITEsZ2V0KCl7Y29uc3Qgcz1hLmJpbmQodGhpcyk7cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLGkse2NvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOnN9KSxzfSxzZXQocyl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsaSx7Y29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6c30pfX0pfX19Y29uc3Qgaj1kKCJab2RUeXBlIiwodCxuKT0+KHguaW5pdCh0LG4pLE9iamVjdC5hc3NpZ24odFsifnN0YW5kYXJkIl0se2pzb25TY2hlbWE6e2lucHV0OlN0KHQsImlucHV0Iiksb3V0cHV0OlN0KHQsIm91dHB1dCIpfX0pLHQudG9KU09OU2NoZW1hPWdkKHQse30pLHQuZGVmPW4sdC50eXBlPW4udHlwZSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX2RlZiIse3ZhbHVlOm59KSx0LnBhcnNlPShyLG8pPT55byh0LHIsbyx7Y2FsbGVlOnQucGFyc2V9KSx0LnNhZmVQYXJzZT0ocixvKT0+U28odCxyLG8pLHQucGFyc2VBc3luYz1hc3luYyhyLG8pPT5rbyh0LHIsbyx7Y2FsbGVlOnQucGFyc2VBc3luY30pLHQuc2FmZVBhcnNlQXN5bmM9YXN5bmMocixvKT0+d28odCxyLG8pLHQuc3BhPXQuc2FmZVBhcnNlQXN5bmMsdC5lbmNvZGU9KHIsbyk9PklvKHQscixvKSx0LmRlY29kZT0ocixvKT0+em8odCxyLG8pLHQuZW5jb2RlQXN5bmM9YXN5bmMocixvKT0+eG8odCxyLG8pLHQuZGVjb2RlQXN5bmM9YXN5bmMocixvKT0+VG8odCxyLG8pLHQuc2FmZUVuY29kZT0ocixvKT0+am8odCxyLG8pLHQuc2FmZURlY29kZT0ocixvKT0+T28odCxyLG8pLHQuc2FmZUVuY29kZUFzeW5jPWFzeW5jKHIsbyk9PlVvKHQscixvKSx0LnNhZmVEZWNvZGVBc3luYz1hc3luYyhyLG8pPT5Qbyh0LHIsbyksR3QodCwiWm9kVHlwZSIse2NoZWNrKC4uLnIpe2NvbnN0IG89dGhpcy5kZWY7cmV0dXJuIHRoaXMuY2xvbmUoJGUobyx7Y2hlY2tzOlsuLi5vLmNoZWNrcz8/W10sLi4uci5tYXAoZT0+dHlwZW9mIGU9PSJmdW5jdGlvbiI/e196b2Q6e2NoZWNrOmUsZGVmOntjaGVjazoiY3VzdG9tIn0sb25hdHRhY2g6W119fTplKV19KSx7cGFyZW50OiEwfSl9LHdpdGgoLi4ucil7cmV0dXJuIHRoaXMuY2hlY2soLi4ucil9LGNsb25lKHIsbyl7cmV0dXJuIGRlKHRoaXMscixvKX0sYnJhbmQoKXtyZXR1cm4gdGhpc30scmVnaXN0ZXIocixvKXtyZXR1cm4gci5hZGQodGhpcyxvKSx0aGlzfSxyZWZpbmUocixvKXtyZXR1cm4gdGhpcy5jaGVjayhZcihyLG8pKX0sc3VwZXJSZWZpbmUocixvKXtyZXR1cm4gdGhpcy5jaGVjayhRcihyLG8pKX0sb3ZlcndyaXRlKHIpe3JldHVybiB0aGlzLmNoZWNrKF9lKHIpKX0sb3B0aW9uYWwoKXtyZXR1cm4gcSh0aGlzKX0sZXhhY3RPcHRpb25hbCgpe3JldHVybiBQcih0aGlzKX0sbnVsbGFibGUoKXtyZXR1cm4gUWUodGhpcyl9LG51bGxpc2goKXtyZXR1cm4gcShRZSh0aGlzKSl9LG5vbm9wdGlvbmFsKHIpe3JldHVybiBDcih0aGlzLHIpfSxhcnJheSgpe3JldHVybiBJKHRoaXMpfSxvcihyKXtyZXR1cm4gVShbdGhpcyxyXSl9LGFuZChyKXtyZXR1cm4gbXQodGhpcyxyKX0sdHJhbnNmb3JtKHIpe3JldHVybiBJdCh0aGlzLGJuKHIpKX0sZGVmYXVsdChyKXtyZXR1cm4gRXIodGhpcyxyKX0scHJlZmF1bHQocil7cmV0dXJuIFJyKHRoaXMscil9LGNhdGNoKHIpe3JldHVybiBNcih0aGlzLHIpfSxwaXBlKHIpe3JldHVybiBJdCh0aGlzLHIpfSxyZWFkb25seSgpe3JldHVybiBIcih0aGlzKX0sZGVzY3JpYmUocil7Y29uc3Qgbz10aGlzLmNsb25lKCk7cmV0dXJuIGNlLmFkZChvLHtkZXNjcmlwdGlvbjpyfSksb30sbWV0YSguLi5yKXtpZihyLmxlbmd0aD09PTApcmV0dXJuIGNlLmdldCh0aGlzKTtjb25zdCBvPXRoaXMuY2xvbmUoKTtyZXR1cm4gY2UuYWRkKG8sclswXSksb30saXNPcHRpb25hbCgpe3JldHVybiB0aGlzLnNhZmVQYXJzZSh2b2lkIDApLnN1Y2Nlc3N9LGlzTnVsbGFibGUoKXtyZXR1cm4gdGhpcy5zYWZlUGFyc2UobnVsbCkuc3VjY2Vzc30sYXBwbHkocil7cmV0dXJuIHIodGhpcyl9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsImRlc2NyaXB0aW9uIix7Z2V0KCl7cmV0dXJuIGNlLmdldCh0KT8uZGVzY3JpcHRpb259LGNvbmZpZ3VyYWJsZTohMH0pLHQpKSxYdD1kKCJfWm9kU3RyaW5nIiwodCxuKT0+e1p0LmluaXQodCxuKSxqLmluaXQodCxuKSx0Ll96b2QucHJvY2Vzc0pTT05TY2hlbWE9KG8sZSxpKT0+dmQodCxvLGUpO2NvbnN0IHI9dC5fem9kLmJhZzt0LmZvcm1hdD1yLmZvcm1hdD8/bnVsbCx0Lm1pbkxlbmd0aD1yLm1pbmltdW0/P251bGwsdC5tYXhMZW5ndGg9ci5tYXhpbXVtPz9udWxsLEd0KHQsIl9ab2RTdHJpbmciLHtyZWdleCguLi5vKXtyZXR1cm4gdGhpcy5jaGVjayhSdCguLi5vKSl9LGluY2x1ZGVzKC4uLm8pe3JldHVybiB0aGlzLmNoZWNrKEx0KC4uLm8pKX0sc3RhcnRzV2l0aCguLi5vKXtyZXR1cm4gdGhpcy5jaGVjayhNdCguLi5vKSl9LGVuZHNXaXRoKC4uLm8pe3JldHVybiB0aGlzLmNoZWNrKHF0KC4uLm8pKX0sbWluKC4uLm8pe3JldHVybiB0aGlzLmNoZWNrKHplKC4uLm8pKX0sbWF4KC4uLm8pe3JldHVybiB0aGlzLmNoZWNrKHJ0KC4uLm8pKX0sbGVuZ3RoKC4uLm8pe3JldHVybiB0aGlzLmNoZWNrKGl0KC4uLm8pKX0sbm9uZW1wdHkoLi4ubyl7cmV0dXJuIHRoaXMuY2hlY2soemUoMSwuLi5vKSl9LGxvd2VyY2FzZShvKXtyZXR1cm4gdGhpcy5jaGVjayhDdChvKSl9LHVwcGVyY2FzZShvKXtyZXR1cm4gdGhpcy5jaGVjayhBdChvKSl9LHRyaW0oKXtyZXR1cm4gdGhpcy5jaGVjayhIdCgpKX0sbm9ybWFsaXplKC4uLm8pe3JldHVybiB0aGlzLmNoZWNrKEp0KC4uLm8pKX0sdG9Mb3dlckNhc2UoKXtyZXR1cm4gdGhpcy5jaGVjayhXdCgpKX0sdG9VcHBlckNhc2UoKXtyZXR1cm4gdGhpcy5jaGVjayhCdCgpKX0sc2x1Z2lmeSgpe3JldHVybiB0aGlzLmNoZWNrKFZ0KCkpfX0pfSksb3Q9ZCgiWm9kU3RyaW5nIiwodCxuKT0+e1p0LmluaXQodCxuKSxYdC5pbml0KHQsbiksdC5lbWFpbD1yPT50LmNoZWNrKEJpKFl0LHIpKSx0LnVybD1yPT50LmNoZWNrKG5yKGF0LHIpKSx0Lmp3dD1yPT50LmNoZWNrKHBvKGZuLHIpKSx0LmVtb2ppPXI9PnQuY2hlY2soWWkoUXQscikpLHQuZ3VpZD1yPT50LmNoZWNrKExuKFhlLHIpKSx0LnV1aWQ9cj0+dC5jaGVjayhWaShoZSxyKSksdC51dWlkdjQ9cj0+dC5jaGVjayhLaShoZSxyKSksdC51dWlkdjY9cj0+dC5jaGVjayhHaShoZSxyKSksdC51dWlkdjc9cj0+dC5jaGVjayhYaShoZSxyKSksdC5uYW5vaWQ9cj0+dC5jaGVjayhRaShlbixyKSksdC5ndWlkPXI9PnQuY2hlY2soTG4oWGUscikpLHQuY3VpZD1yPT50LmNoZWNrKGVvKHRuLHIpKSx0LmN1aWQyPXI9PnQuY2hlY2sodG8obm4scikpLHQudWxpZD1yPT50LmNoZWNrKG5vKHJuLHIpKSx0LmJhc2U2ND1yPT50LmNoZWNrKHVvKGRuLHIpKSx0LmJhc2U2NHVybD1yPT50LmNoZWNrKGxvKG1uLHIpKSx0LnhpZD1yPT50LmNoZWNrKHJvKG9uLHIpKSx0LmtzdWlkPXI9PnQuY2hlY2soaW8oYW4scikpLHQuaXB2ND1yPT50LmNoZWNrKG9vKHNuLHIpKSx0LmlwdjY9cj0+dC5jaGVjayhhbyhjbixyKSksdC5jaWRydjQ9cj0+dC5jaGVjayhzbyh1bixyKSksdC5jaWRydjY9cj0+dC5jaGVjayhjbyhsbixyKSksdC5lMTY0PXI9PnQuY2hlY2sobW8ocG4scikpLHQuZGF0ZXRpbWU9cj0+dC5jaGVjayhfbyhyKSksdC5kYXRlPXI9PnQuY2hlY2sodG0ocikpLHQudGltZT1yPT50LmNoZWNrKG5tKHIpKSx0LmR1cmF0aW9uPXI9PnQuY2hlY2socm0ocikpfSk7ZnVuY3Rpb24gbSh0KXtyZXR1cm4gT2wob3QsdCl9Y29uc3QgQT1kKCJab2RTdHJpbmdGb3JtYXQiLCh0LG4pPT57Ri5pbml0KHQsbiksWHQuaW5pdCh0LG4pfSksWXQ9ZCgiWm9kRW1haWwiLCh0LG4pPT57Z3UuaW5pdCh0LG4pLEEuaW5pdCh0LG4pfSk7ZnVuY3Rpb24gTm8odCl7cmV0dXJuIEJpKFl0LHQpfWNvbnN0IFhlPWQoIlpvZEdVSUQiLCh0LG4pPT57cHUuaW5pdCh0LG4pLEEuaW5pdCh0LG4pfSk7ZnVuY3Rpb24gRG8odCl7cmV0dXJuIExuKFhlLHQpfWNvbnN0IGhlPWQoIlpvZFVVSUQiLCh0LG4pPT57ZnUuaW5pdCh0LG4pLEEuaW5pdCh0LG4pfSk7ZnVuY3Rpb24gRW8odCl7cmV0dXJuIFZpKGhlLHQpfWZ1bmN0aW9uIFpvKHQpe3JldHVybiBLaShoZSx0KX1mdW5jdGlvbiBSbyh0KXtyZXR1cm4gR2koaGUsdCl9ZnVuY3Rpb24gQ28odCl7cmV0dXJuIFhpKGhlLHQpfWNvbnN0IGF0PWQoIlpvZFVSTCIsKHQsbik9Pnt2dS5pbml0KHQsbiksQS5pbml0KHQsbil9KTtmdW5jdGlvbiBBbyh0KXtyZXR1cm4gbnIoYXQsdCl9ZnVuY3Rpb24gTG8odCl7cmV0dXJuIG5yKGF0LHtwcm90b2NvbDpQaSxob3N0bmFtZTpPYywuLi5oKHQpfSl9Y29uc3QgUXQ9ZCgiWm9kRW1vamkiLCh0LG4pPT57aHUuaW5pdCh0LG4pLEEuaW5pdCh0LG4pfSk7ZnVuY3Rpb24gTW8odCl7cmV0dXJuIFlpKFF0LHQpfWNvbnN0IGVuPWQoIlpvZE5hbm9JRCIsKHQsbik9PnskdS5pbml0KHQsbiksQS5pbml0KHQsbil9KTtmdW5jdGlvbiBxbyh0KXtyZXR1cm4gUWkoZW4sdCl9Y29uc3QgdG49ZCgiWm9kQ1VJRCIsKHQsbik9PntfdS5pbml0KHQsbiksQS5pbml0KHQsbil9KTtmdW5jdGlvbiBGbyh0KXtyZXR1cm4gZW8odG4sdCl9Y29uc3Qgbm49ZCgiWm9kQ1VJRDIiLCh0LG4pPT57YnUuaW5pdCh0LG4pLEEuaW5pdCh0LG4pfSk7ZnVuY3Rpb24gSm8odCl7cmV0dXJuIHRvKG5uLHQpfWNvbnN0IHJuPWQoIlpvZFVMSUQiLCh0LG4pPT57eXUuaW5pdCh0LG4pLEEuaW5pdCh0LG4pfSk7ZnVuY3Rpb24gSG8odCl7cmV0dXJuIG5vKHJuLHQpfWNvbnN0IG9uPWQoIlpvZFhJRCIsKHQsbik9PntrdS5pbml0KHQsbiksQS5pbml0KHQsbil9KTtmdW5jdGlvbiBXbyh0KXtyZXR1cm4gcm8ob24sdCl9Y29uc3QgYW49ZCgiWm9kS1NVSUQiLCh0LG4pPT57U3UuaW5pdCh0LG4pLEEuaW5pdCh0LG4pfSk7ZnVuY3Rpb24gQm8odCl7cmV0dXJuIGlvKGFuLHQpfWNvbnN0IHNuPWQoIlpvZElQdjQiLCh0LG4pPT57VHUuaW5pdCh0LG4pLEEuaW5pdCh0LG4pfSk7ZnVuY3Rpb24gVm8odCl7cmV0dXJuIG9vKHNuLHQpfWNvbnN0IG1yPWQoIlpvZE1BQyIsKHQsbik9PntPdS5pbml0KHQsbiksQS5pbml0KHQsbil9KTtmdW5jdGlvbiBLbyh0KXtyZXR1cm4gUGwobXIsdCl9Y29uc3QgY249ZCgiWm9kSVB2NiIsKHQsbik9PntqdS5pbml0KHQsbiksQS5pbml0KHQsbil9KTtmdW5jdGlvbiBHbyh0KXtyZXR1cm4gYW8oY24sdCl9Y29uc3QgdW49ZCgiWm9kQ0lEUnY0IiwodCxuKT0+e1V1LmluaXQodCxuKSxBLmluaXQodCxuKX0pO2Z1bmN0aW9uIFhvKHQpe3JldHVybiBzbyh1bix0KX1jb25zdCBsbj1kKCJab2RDSURSdjYiLCh0LG4pPT57UHUuaW5pdCh0LG4pLEEuaW5pdCh0LG4pfSk7ZnVuY3Rpb24gWW8odCl7cmV0dXJuIGNvKGxuLHQpfWNvbnN0IGRuPWQoIlpvZEJhc2U2NCIsKHQsbik9PntOdS5pbml0KHQsbiksQS5pbml0KHQsbil9KTtmdW5jdGlvbiBRbyh0KXtyZXR1cm4gdW8oZG4sdCl9Y29uc3QgbW49ZCgiWm9kQmFzZTY0VVJMIiwodCxuKT0+e0V1LmluaXQodCxuKSxBLmluaXQodCxuKX0pO2Z1bmN0aW9uIGVhKHQpe3JldHVybiBsbyhtbix0KX1jb25zdCBwbj1kKCJab2RFMTY0IiwodCxuKT0+e1p1LmluaXQodCxuKSxBLmluaXQodCxuKX0pO2Z1bmN0aW9uIHRhKHQpe3JldHVybiBtbyhwbix0KX1jb25zdCBmbj1kKCJab2RKV1QiLCh0LG4pPT57Q3UuaW5pdCh0LG4pLEEuaW5pdCh0LG4pfSk7ZnVuY3Rpb24gbmEodCl7cmV0dXJuIHBvKGZuLHQpfWNvbnN0IE1lPWQoIlpvZEN1c3RvbVN0cmluZ0Zvcm1hdCIsKHQsbik9PntBdS5pbml0KHQsbiksQS5pbml0KHQsbil9KTtmdW5jdGlvbiByYSh0LG4scj17fSl7cmV0dXJuIEt0KE1lLHQsbixyKX1mdW5jdGlvbiBpYSh0KXtyZXR1cm4gS3QoTWUsImhvc3RuYW1lIixqYyx0KX1mdW5jdGlvbiBvYSh0KXtyZXR1cm4gS3QoTWUsImhleCIsSGMsdCl9ZnVuY3Rpb24gYWEodCxuKXtjb25zdCByPW4/LmVuYz8/ImhleCIsbz1gJHt0fV8ke3J9YCxlPVFuW29dO2lmKCFlKXRocm93IG5ldyBFcnJvcihgVW5yZWNvZ25pemVkIGhhc2ggZm9ybWF0OiAke299YCk7cmV0dXJuIEt0KE1lLG8sZSxuKX1jb25zdCBzdD1kKCJab2ROdW1iZXIiLCh0LG4pPT57UmkuaW5pdCh0LG4pLGouaW5pdCh0LG4pLHQuX3pvZC5wcm9jZXNzSlNPTlNjaGVtYT0obyxlLGkpPT5oZCh0LG8sZSksR3QodCwiWm9kTnVtYmVyIix7Z3QobyxlKXtyZXR1cm4gdGhpcy5jaGVjayhrZShvLGUpKX0sZ3RlKG8sZSl7cmV0dXJuIHRoaXMuY2hlY2soaWUobyxlKSl9LG1pbihvLGUpe3JldHVybiB0aGlzLmNoZWNrKGllKG8sZSkpfSxsdChvLGUpe3JldHVybiB0aGlzLmNoZWNrKHllKG8sZSkpfSxsdGUobyxlKXtyZXR1cm4gdGhpcy5jaGVjayh1ZShvLGUpKX0sbWF4KG8sZSl7cmV0dXJuIHRoaXMuY2hlY2sodWUobyxlKSl9LGludChvKXtyZXR1cm4gdGhpcy5jaGVjayh3dChvKSl9LHNhZmUobyl7cmV0dXJuIHRoaXMuY2hlY2sod3QobykpfSxwb3NpdGl2ZShvKXtyZXR1cm4gdGhpcy5jaGVjayhrZSgwLG8pKX0sbm9ubmVnYXRpdmUobyl7cmV0dXJuIHRoaXMuY2hlY2soaWUoMCxvKSl9LG5lZ2F0aXZlKG8pe3JldHVybiB0aGlzLmNoZWNrKHllKDAsbykpfSxub25wb3NpdGl2ZShvKXtyZXR1cm4gdGhpcy5jaGVjayh1ZSgwLG8pKX0sbXVsdGlwbGVPZihvLGUpe3JldHVybiB0aGlzLmNoZWNrKEVlKG8sZSkpfSxzdGVwKG8sZSl7cmV0dXJuIHRoaXMuY2hlY2soRWUobyxlKSl9LGZpbml0ZSgpe3JldHVybiB0aGlzfX0pO2NvbnN0IHI9dC5fem9kLmJhZzt0Lm1pblZhbHVlPU1hdGgubWF4KHIubWluaW11bT8/TnVtYmVyLk5FR0FUSVZFX0lORklOSVRZLHIuZXhjbHVzaXZlTWluaW11bT8/TnVtYmVyLk5FR0FUSVZFX0lORklOSVRZKT8/bnVsbCx0Lm1heFZhbHVlPU1hdGgubWluKHIubWF4aW11bT8/TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLHIuZXhjbHVzaXZlTWF4aW11bT8/TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKT8/bnVsbCx0LmlzSW50PShyLmZvcm1hdD8/IiIpLmluY2x1ZGVzKCJpbnQiKXx8TnVtYmVyLmlzU2FmZUludGVnZXIoci5tdWx0aXBsZU9mPz8uNSksdC5pc0Zpbml0ZT0hMCx0LmZvcm1hdD1yLmZvcm1hdD8/bnVsbH0pO2Z1bmN0aW9uIFQodCl7cmV0dXJuIFJsKHN0LHQpfWNvbnN0IFRlPWQoIlpvZE51bWJlckZvcm1hdCIsKHQsbik9PntMdS5pbml0KHQsbiksc3QuaW5pdCh0LG4pfSk7ZnVuY3Rpb24gd3QodCl7cmV0dXJuIEFsKFRlLHQpfWZ1bmN0aW9uIHNhKHQpe3JldHVybiBMbChUZSx0KX1mdW5jdGlvbiBjYSh0KXtyZXR1cm4gTWwoVGUsdCl9ZnVuY3Rpb24gdWEodCl7cmV0dXJuIHFsKFRlLHQpfWZ1bmN0aW9uIGxhKHQpe3JldHVybiBGbChUZSx0KX1jb25zdCBjdD1kKCJab2RCb29sZWFuIiwodCxuKT0+e0NpLmluaXQodCxuKSxqLmluaXQodCxuKSx0Ll96b2QucHJvY2Vzc0pTT05TY2hlbWE9KHIsbyxlKT0+JGQodCxyLG8pfSk7ZnVuY3Rpb24gWih0KXtyZXR1cm4gSmwoY3QsdCl9Y29uc3QgdXQ9ZCgiWm9kQmlnSW50IiwodCxuKT0+e0FpLmluaXQodCxuKSxqLmluaXQodCxuKSx0Ll96b2QucHJvY2Vzc0pTT05TY2hlbWE9KG8sZSxpKT0+X2QodCxvKSx0Lmd0ZT0obyxlKT0+dC5jaGVjayhpZShvLGUpKSx0Lm1pbj0obyxlKT0+dC5jaGVjayhpZShvLGUpKSx0Lmd0PShvLGUpPT50LmNoZWNrKGtlKG8sZSkpLHQuZ3RlPShvLGUpPT50LmNoZWNrKGllKG8sZSkpLHQubWluPShvLGUpPT50LmNoZWNrKGllKG8sZSkpLHQubHQ9KG8sZSk9PnQuY2hlY2soeWUobyxlKSksdC5sdGU9KG8sZSk9PnQuY2hlY2sodWUobyxlKSksdC5tYXg9KG8sZSk9PnQuY2hlY2sodWUobyxlKSksdC5wb3NpdGl2ZT1vPT50LmNoZWNrKGtlKEJpZ0ludCgwKSxvKSksdC5uZWdhdGl2ZT1vPT50LmNoZWNrKHllKEJpZ0ludCgwKSxvKSksdC5ub25wb3NpdGl2ZT1vPT50LmNoZWNrKHVlKEJpZ0ludCgwKSxvKSksdC5ub25uZWdhdGl2ZT1vPT50LmNoZWNrKGllKEJpZ0ludCgwKSxvKSksdC5tdWx0aXBsZU9mPShvLGUpPT50LmNoZWNrKEVlKG8sZSkpO2NvbnN0IHI9dC5fem9kLmJhZzt0Lm1pblZhbHVlPXIubWluaW11bT8/bnVsbCx0Lm1heFZhbHVlPXIubWF4aW11bT8/bnVsbCx0LmZvcm1hdD1yLmZvcm1hdD8/bnVsbH0pO2Z1bmN0aW9uIGRhKHQpe3JldHVybiBXbCh1dCx0KX1jb25zdCBnbj1kKCJab2RCaWdJbnRGb3JtYXQiLCh0LG4pPT57TXUuaW5pdCh0LG4pLHV0LmluaXQodCxuKX0pO2Z1bmN0aW9uIG1hKHQpe3JldHVybiBWbChnbix0KX1mdW5jdGlvbiBwYSh0KXtyZXR1cm4gS2woZ24sdCl9Y29uc3QgcHI9ZCgiWm9kU3ltYm9sIiwodCxuKT0+e3F1LmluaXQodCxuKSxqLmluaXQodCxuKSx0Ll96b2QucHJvY2Vzc0pTT05TY2hlbWE9KHIsbyxlKT0+YmQodCxyKX0pO2Z1bmN0aW9uIGZhKHQpe3JldHVybiBHbChwcix0KX1jb25zdCBmcj1kKCJab2RVbmRlZmluZWQiLCh0LG4pPT57RnUuaW5pdCh0LG4pLGouaW5pdCh0LG4pLHQuX3pvZC5wcm9jZXNzSlNPTlNjaGVtYT0ocixvLGUpPT5rZCh0LHIpfSk7ZnVuY3Rpb24gWWUodCl7cmV0dXJuIFhsKGZyLHQpfWNvbnN0IGdyPWQoIlpvZE51bGwiLCh0LG4pPT57SnUuaW5pdCh0LG4pLGouaW5pdCh0LG4pLHQuX3pvZC5wcm9jZXNzSlNPTlNjaGVtYT0ocixvLGUpPT55ZCh0LHIsbyl9KTtmdW5jdGlvbiB2bih0KXtyZXR1cm4gWWwoZ3IsdCl9Y29uc3QgdnI9ZCgiWm9kQW55IiwodCxuKT0+e0h1LmluaXQodCxuKSxqLmluaXQodCxuKSx0Ll96b2QucHJvY2Vzc0pTT05TY2hlbWE9KHIsbyxlKT0+SWQoKX0pO2Z1bmN0aW9uIGhuKCl7cmV0dXJuIFFsKHZyKX1jb25zdCBocj1kKCJab2RVbmtub3duIiwodCxuKT0+e1d1LmluaXQodCxuKSxqLmluaXQodCxuKSx0Ll96b2QucHJvY2Vzc0pTT05TY2hlbWE9KHIsbyxlKT0+emQoKX0pO2Z1bmN0aW9uIEUoKXtyZXR1cm4gZWQoaHIpfWNvbnN0ICRyPWQoIlpvZE5ldmVyIiwodCxuKT0+e0J1LmluaXQodCxuKSxqLmluaXQodCxuKSx0Ll96b2QucHJvY2Vzc0pTT05TY2hlbWE9KHIsbyxlKT0+d2QodCxyLG8pfSk7ZnVuY3Rpb24gWmUodCl7cmV0dXJuIHRkKCRyLHQpfWNvbnN0IF9yPWQoIlpvZFZvaWQiLCh0LG4pPT57VnUuaW5pdCh0LG4pLGouaW5pdCh0LG4pLHQuX3pvZC5wcm9jZXNzSlNPTlNjaGVtYT0ocixvLGUpPT5TZCh0LHIpfSk7ZnVuY3Rpb24gZ2EodCl7cmV0dXJuIG5kKF9yLHQpfWNvbnN0ICRuPWQoIlpvZERhdGUiLCh0LG4pPT57S3UuaW5pdCh0LG4pLGouaW5pdCh0LG4pLHQuX3pvZC5wcm9jZXNzSlNPTlNjaGVtYT0obyxlLGkpPT54ZCh0LG8pLHQubWluPShvLGUpPT50LmNoZWNrKGllKG8sZSkpLHQubWF4PShvLGUpPT50LmNoZWNrKHVlKG8sZSkpO2NvbnN0IHI9dC5fem9kLmJhZzt0Lm1pbkRhdGU9ci5taW5pbXVtP25ldyBEYXRlKHIubWluaW11bSk6bnVsbCx0Lm1heERhdGU9ci5tYXhpbXVtP25ldyBEYXRlKHIubWF4aW11bSk6bnVsbH0pO2Z1bmN0aW9uIHZhKHQpe3JldHVybiByZCgkbix0KX1jb25zdCBicj1kKCJab2RBcnJheSIsKHQsbik9PntHdS5pbml0KHQsbiksai5pbml0KHQsbiksdC5fem9kLnByb2Nlc3NKU09OU2NoZW1hPShyLG8sZSk9PkFkKHQscixvLGUpLHQuZWxlbWVudD1uLmVsZW1lbnQsR3QodCwiWm9kQXJyYXkiLHttaW4ocixvKXtyZXR1cm4gdGhpcy5jaGVjayh6ZShyLG8pKX0sbm9uZW1wdHkocil7cmV0dXJuIHRoaXMuY2hlY2soemUoMSxyKSl9LG1heChyLG8pe3JldHVybiB0aGlzLmNoZWNrKHJ0KHIsbykpfSxsZW5ndGgocixvKXtyZXR1cm4gdGhpcy5jaGVjayhpdChyLG8pKX0sdW53cmFwKCl7cmV0dXJuIHRoaXMuZWxlbWVudH19KX0pO2Z1bmN0aW9uIEkodCxuKXtyZXR1cm4gYWQoYnIsdCxuKX1mdW5jdGlvbiBoYSh0KXtjb25zdCBuPXQuX3pvZC5kZWYuc2hhcGU7cmV0dXJuIFEoT2JqZWN0LmtleXMobikpfWNvbnN0IGx0PWQoIlpvZE9iamVjdCIsKHQsbik9PntlbC5pbml0KHQsbiksai5pbml0KHQsbiksdC5fem9kLnByb2Nlc3NKU09OU2NoZW1hPShyLG8sZSk9PkxkKHQscixvLGUpLE8odCwic2hhcGUiLCgpPT5uLnNoYXBlKSxHdCh0LCJab2RPYmplY3QiLHtrZXlvZigpe3JldHVybiBRKE9iamVjdC5rZXlzKHRoaXMuX3pvZC5kZWYuc2hhcGUpKX0sY2F0Y2hhbGwocil7cmV0dXJuIHRoaXMuY2xvbmUoey4uLnRoaXMuX3pvZC5kZWYsY2F0Y2hhbGw6cn0pfSxwYXNzdGhyb3VnaCgpe3JldHVybiB0aGlzLmNsb25lKHsuLi50aGlzLl96b2QuZGVmLGNhdGNoYWxsOkUoKX0pfSxsb29zZSgpe3JldHVybiB0aGlzLmNsb25lKHsuLi50aGlzLl96b2QuZGVmLGNhdGNoYWxsOkUoKX0pfSxzdHJpY3QoKXtyZXR1cm4gdGhpcy5jbG9uZSh7Li4udGhpcy5fem9kLmRlZixjYXRjaGFsbDpaZSgpfSl9LHN0cmlwKCl7cmV0dXJuIHRoaXMuY2xvbmUoey4uLnRoaXMuX3pvZC5kZWYsY2F0Y2hhbGw6dm9pZCAwfSl9LGV4dGVuZChyKXtyZXR1cm4gdGModGhpcyxyKX0sc2FmZUV4dGVuZChyKXtyZXR1cm4gbmModGhpcyxyKX0sbWVyZ2Uocil7cmV0dXJuIHJjKHRoaXMscil9LHBpY2socil7cmV0dXJuIFFzKHRoaXMscil9LG9taXQocil7cmV0dXJuIGVjKHRoaXMscil9LHBhcnRpYWwoLi4ucil7cmV0dXJuIGljKHluLHRoaXMsclswXSl9LHJlcXVpcmVkKC4uLnIpe3JldHVybiBvYyhrbix0aGlzLHJbMF0pfX0pfSk7ZnVuY3Rpb24gZih0LG4pe2NvbnN0IHI9e3R5cGU6Im9iamVjdCIsc2hhcGU6dD8/e30sLi4uaChuKX07cmV0dXJuIG5ldyBsdChyKX1mdW5jdGlvbiAkYSh0LG4pe3JldHVybiBuZXcgbHQoe3R5cGU6Im9iamVjdCIsc2hhcGU6dCxjYXRjaGFsbDpaZSgpLC4uLmgobil9KX1mdW5jdGlvbiBZKHQsbil7cmV0dXJuIG5ldyBsdCh7dHlwZToib2JqZWN0IixzaGFwZTp0LGNhdGNoYWxsOkUoKSwuLi5oKG4pfSl9Y29uc3QgZHQ9ZCgiWm9kVW5pb24iLCh0LG4pPT57ZXIuaW5pdCh0LG4pLGouaW5pdCh0LG4pLHQuX3pvZC5wcm9jZXNzSlNPTlNjaGVtYT0ocixvLGUpPT5nbyh0LHIsbyxlKSx0Lm9wdGlvbnM9bi5vcHRpb25zfSk7ZnVuY3Rpb24gVSh0LG4pe3JldHVybiBuZXcgZHQoe3R5cGU6InVuaW9uIixvcHRpb25zOnQsLi4uaChuKX0pfWNvbnN0IHlyPWQoIlpvZFhvciIsKHQsbik9PntkdC5pbml0KHQsbiksdGwuaW5pdCh0LG4pLHQuX3pvZC5wcm9jZXNzSlNPTlNjaGVtYT0ocixvLGUpPT5nbyh0LHIsbyxlKSx0Lm9wdGlvbnM9bi5vcHRpb25zfSk7ZnVuY3Rpb24gX2EodCxuKXtyZXR1cm4gbmV3IHlyKHt0eXBlOiJ1bmlvbiIsb3B0aW9uczp0LGluY2x1c2l2ZTohMSwuLi5oKG4pfSl9Y29uc3Qga3I9ZCgiWm9kRGlzY3JpbWluYXRlZFVuaW9uIiwodCxuKT0+e2R0LmluaXQodCxuKSxubC5pbml0KHQsbil9KTtmdW5jdGlvbiBfbih0LG4scil7cmV0dXJuIG5ldyBrcih7dHlwZToidW5pb24iLG9wdGlvbnM6bixkaXNjcmltaW5hdG9yOnQsLi4uaChyKX0pfWNvbnN0IFNyPWQoIlpvZEludGVyc2VjdGlvbiIsKHQsbik9PntybC5pbml0KHQsbiksai5pbml0KHQsbiksdC5fem9kLnByb2Nlc3NKU09OU2NoZW1hPShyLG8sZSk9Pk1kKHQscixvLGUpfSk7ZnVuY3Rpb24gbXQodCxuKXtyZXR1cm4gbmV3IFNyKHt0eXBlOiJpbnRlcnNlY3Rpb24iLGxlZnQ6dCxyaWdodDpufSl9Y29uc3Qgd3I9ZCgiWm9kVHVwbGUiLCh0LG4pPT57TGkuaW5pdCh0LG4pLGouaW5pdCh0LG4pLHQuX3pvZC5wcm9jZXNzSlNPTlNjaGVtYT0ocixvLGUpPT5xZCh0LHIsbyxlKSx0LnJlc3Q9cj0+dC5jbG9uZSh7Li4udC5fem9kLmRlZixyZXN0OnJ9KX0pO2Z1bmN0aW9uIElyKHQsbixyKXtjb25zdCBvPW4gaW5zdGFuY2VvZiB4LGU9bz9yOm4saT1vP246bnVsbDtyZXR1cm4gbmV3IHdyKHt0eXBlOiJ0dXBsZSIsaXRlbXM6dCxyZXN0OmksLi4uaChlKX0pfWNvbnN0IFJlPWQoIlpvZFJlY29yZCIsKHQsbik9PntpbC5pbml0KHQsbiksai5pbml0KHQsbiksdC5fem9kLnByb2Nlc3NKU09OU2NoZW1hPShyLG8sZSk9PkZkKHQscixvLGUpLHQua2V5VHlwZT1uLmtleVR5cGUsdC52YWx1ZVR5cGU9bi52YWx1ZVR5cGV9KTtmdW5jdGlvbiBQKHQsbixyKXtyZXR1cm4hbnx8IW4uX3pvZD9uZXcgUmUoe3R5cGU6InJlY29yZCIsa2V5VHlwZTptKCksdmFsdWVUeXBlOnQsLi4uaChuKX0pOm5ldyBSZSh7dHlwZToicmVjb3JkIixrZXlUeXBlOnQsdmFsdWVUeXBlOm4sLi4uaChyKX0pfWZ1bmN0aW9uIGJhKHQsbixyKXtjb25zdCBvPWRlKHQpO3JldHVybiBvLl96b2QudmFsdWVzPXZvaWQgMCxuZXcgUmUoe3R5cGU6InJlY29yZCIsa2V5VHlwZTpvLHZhbHVlVHlwZTpuLC4uLmgocil9KX1mdW5jdGlvbiB5YSh0LG4scil7cmV0dXJuIG5ldyBSZSh7dHlwZToicmVjb3JkIixrZXlUeXBlOnQsdmFsdWVUeXBlOm4sbW9kZToibG9vc2UiLC4uLmgocil9KX1jb25zdCB6cj1kKCJab2RNYXAiLCh0LG4pPT57b2wuaW5pdCh0LG4pLGouaW5pdCh0LG4pLHQuX3pvZC5wcm9jZXNzSlNPTlNjaGVtYT0ocixvLGUpPT5SZCh0LHIpLHQua2V5VHlwZT1uLmtleVR5cGUsdC52YWx1ZVR5cGU9bi52YWx1ZVR5cGUsdC5taW49KC4uLnIpPT50LmNoZWNrKFNlKC4uLnIpKSx0Lm5vbmVtcHR5PXI9PnQuY2hlY2soU2UoMSxyKSksdC5tYXg9KC4uLnIpPT50LmNoZWNrKExlKC4uLnIpKSx0LnNpemU9KC4uLnIpPT50LmNoZWNrKG50KC4uLnIpKX0pO2Z1bmN0aW9uIGthKHQsbixyKXtyZXR1cm4gbmV3IHpyKHt0eXBlOiJtYXAiLGtleVR5cGU6dCx2YWx1ZVR5cGU6biwuLi5oKHIpfSl9Y29uc3QgeHI9ZCgiWm9kU2V0IiwodCxuKT0+e2FsLmluaXQodCxuKSxqLmluaXQodCxuKSx0Ll96b2QucHJvY2Vzc0pTT05TY2hlbWE9KHIsbyxlKT0+Q2QodCxyKSx0Lm1pbj0oLi4ucik9PnQuY2hlY2soU2UoLi4ucikpLHQubm9uZW1wdHk9cj0+dC5jaGVjayhTZSgxLHIpKSx0Lm1heD0oLi4ucik9PnQuY2hlY2soTGUoLi4ucikpLHQuc2l6ZT0oLi4ucik9PnQuY2hlY2sobnQoLi4ucikpfSk7ZnVuY3Rpb24gU2EodCxuKXtyZXR1cm4gbmV3IHhyKHt0eXBlOiJzZXQiLHZhbHVlVHlwZTp0LC4uLmgobil9KX1jb25zdCBDZT1kKCJab2RFbnVtIiwodCxuKT0+e3NsLmluaXQodCxuKSxqLmluaXQodCxuKSx0Ll96b2QucHJvY2Vzc0pTT05TY2hlbWE9KG8sZSxpKT0+VGQodCxvLGUpLHQuZW51bT1uLmVudHJpZXMsdC5vcHRpb25zPU9iamVjdC52YWx1ZXMobi5lbnRyaWVzKTtjb25zdCByPW5ldyBTZXQoT2JqZWN0LmtleXMobi5lbnRyaWVzKSk7dC5leHRyYWN0PShvLGUpPT57Y29uc3QgaT17fTtmb3IoY29uc3QgYSBvZiBvKWlmKHIuaGFzKGEpKWlbYV09bi5lbnRyaWVzW2FdO2Vsc2UgdGhyb3cgbmV3IEVycm9yKGBLZXkgJHthfSBub3QgZm91bmQgaW4gZW51bWApO3JldHVybiBuZXcgQ2Uoey4uLm4sY2hlY2tzOltdLC4uLmgoZSksZW50cmllczppfSl9LHQuZXhjbHVkZT0obyxlKT0+e2NvbnN0IGk9ey4uLm4uZW50cmllc307Zm9yKGNvbnN0IGEgb2YgbylpZihyLmhhcyhhKSlkZWxldGUgaVthXTtlbHNlIHRocm93IG5ldyBFcnJvcihgS2V5ICR7YX0gbm90IGZvdW5kIGluIGVudW1gKTtyZXR1cm4gbmV3IENlKHsuLi5uLGNoZWNrczpbXSwuLi5oKGUpLGVudHJpZXM6aX0pfX0pO2Z1bmN0aW9uIFEodCxuKXtjb25zdCByPUFycmF5LmlzQXJyYXkodCk/T2JqZWN0LmZyb21FbnRyaWVzKHQubWFwKG89PltvLG9dKSk6dDtyZXR1cm4gbmV3IENlKHt0eXBlOiJlbnVtIixlbnRyaWVzOnIsLi4uaChuKX0pfWZ1bmN0aW9uIHdhKHQsbil7cmV0dXJuIG5ldyBDZSh7dHlwZToiZW51bSIsZW50cmllczp0LC4uLmgobil9KX1jb25zdCBUcj1kKCJab2RMaXRlcmFsIiwodCxuKT0+e2NsLmluaXQodCxuKSxqLmluaXQodCxuKSx0Ll96b2QucHJvY2Vzc0pTT05TY2hlbWE9KHIsbyxlKT0+amQodCxyLG8pLHQudmFsdWVzPW5ldyBTZXQobi52YWx1ZXMpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJ2YWx1ZSIse2dldCgpe2lmKG4udmFsdWVzLmxlbmd0aD4xKXRocm93IG5ldyBFcnJvcigiVGhpcyBzY2hlbWEgY29udGFpbnMgbXVsdGlwbGUgdmFsaWQgbGl0ZXJhbCB2YWx1ZXMuIFVzZSBgLnZhbHVlc2AgaW5zdGVhZC4iKTtyZXR1cm4gbi52YWx1ZXNbMF19fSl9KTtmdW5jdGlvbiBwKHQsbil7cmV0dXJuIG5ldyBUcih7dHlwZToibGl0ZXJhbCIsdmFsdWVzOkFycmF5LmlzQXJyYXkodCk/dDpbdF0sLi4uaChuKX0pfWNvbnN0IGpyPWQoIlpvZEZpbGUiLCh0LG4pPT57dWwuaW5pdCh0LG4pLGouaW5pdCh0LG4pLHQuX3pvZC5wcm9jZXNzSlNPTlNjaGVtYT0ocixvLGUpPT5QZCh0LHIsbyksdC5taW49KHIsbyk9PnQuY2hlY2soU2UocixvKSksdC5tYXg9KHIsbyk9PnQuY2hlY2soTGUocixvKSksdC5taW1lPShyLG8pPT50LmNoZWNrKEZ0KEFycmF5LmlzQXJyYXkocik/cjpbcl0sbykpfSk7ZnVuY3Rpb24gSWEodCl7cmV0dXJuIHNkKGpyLHQpfWNvbnN0IE9yPWQoIlpvZFRyYW5zZm9ybSIsKHQsbik9PntsbC5pbml0KHQsbiksai5pbml0KHQsbiksdC5fem9kLnByb2Nlc3NKU09OU2NoZW1hPShyLG8sZSk9PlpkKHQsciksdC5fem9kLnBhcnNlPShyLG8pPT57aWYoby5kaXJlY3Rpb249PT0iYmFja3dhcmQiKXRocm93IG5ldyBXbih0LmNvbnN0cnVjdG9yLm5hbWUpO3IuYWRkSXNzdWU9aT0+e2lmKHR5cGVvZiBpPT0ic3RyaW5nIilyLmlzc3Vlcy5wdXNoKFdlKGksci52YWx1ZSxuKSk7ZWxzZXtjb25zdCBhPWk7YS5mYXRhbCYmKGEuY29udGludWU9ITEpLGEuY29kZT8/KGEuY29kZT0iY3VzdG9tIiksYS5pbnB1dD8/KGEuaW5wdXQ9ci52YWx1ZSksYS5pbnN0Pz8oYS5pbnN0PXQpLHIuaXNzdWVzLnB1c2goV2UoYSkpfX07Y29uc3QgZT1uLnRyYW5zZm9ybShyLnZhbHVlLHIpO3JldHVybiBlIGluc3RhbmNlb2YgUHJvbWlzZT9lLnRoZW4oaT0+KHIudmFsdWU9aSxyLmZhbGxiYWNrPSEwLHIpKTooci52YWx1ZT1lLHIuZmFsbGJhY2s9ITAscil9fSk7ZnVuY3Rpb24gYm4odCl7cmV0dXJuIG5ldyBPcih7dHlwZToidHJhbnNmb3JtIix0cmFuc2Zvcm06dH0pfWNvbnN0IHluPWQoIlpvZE9wdGlvbmFsIiwodCxuKT0+e01pLmluaXQodCxuKSxqLmluaXQodCxuKSx0Ll96b2QucHJvY2Vzc0pTT05TY2hlbWE9KHIsbyxlKT0+dm8odCxyLG8sZSksdC51bndyYXA9KCk9PnQuX3pvZC5kZWYuaW5uZXJUeXBlfSk7ZnVuY3Rpb24gcSh0KXtyZXR1cm4gbmV3IHluKHt0eXBlOiJvcHRpb25hbCIsaW5uZXJUeXBlOnR9KX1jb25zdCBVcj1kKCJab2RFeGFjdE9wdGlvbmFsIiwodCxuKT0+e2RsLmluaXQodCxuKSxqLmluaXQodCxuKSx0Ll96b2QucHJvY2Vzc0pTT05TY2hlbWE9KHIsbyxlKT0+dm8odCxyLG8sZSksdC51bndyYXA9KCk9PnQuX3pvZC5kZWYuaW5uZXJUeXBlfSk7ZnVuY3Rpb24gUHIodCl7cmV0dXJuIG5ldyBVcih7dHlwZToib3B0aW9uYWwiLGlubmVyVHlwZTp0fSl9Y29uc3QgTnI9ZCgiWm9kTnVsbGFibGUiLCh0LG4pPT57bWwuaW5pdCh0LG4pLGouaW5pdCh0LG4pLHQuX3pvZC5wcm9jZXNzSlNPTlNjaGVtYT0ocixvLGUpPT5KZCh0LHIsbyxlKSx0LnVud3JhcD0oKT0+dC5fem9kLmRlZi5pbm5lclR5cGV9KTtmdW5jdGlvbiBRZSh0KXtyZXR1cm4gbmV3IE5yKHt0eXBlOiJudWxsYWJsZSIsaW5uZXJUeXBlOnR9KX1mdW5jdGlvbiB6YSh0KXtyZXR1cm4gcShRZSh0KSl9Y29uc3QgRHI9ZCgiWm9kRGVmYXVsdCIsKHQsbik9PntwbC5pbml0KHQsbiksai5pbml0KHQsbiksdC5fem9kLnByb2Nlc3NKU09OU2NoZW1hPShyLG8sZSk9PldkKHQscixvLGUpLHQudW53cmFwPSgpPT50Ll96b2QuZGVmLmlubmVyVHlwZSx0LnJlbW92ZURlZmF1bHQ9dC51bndyYXB9KTtmdW5jdGlvbiBFcih0LG4pe3JldHVybiBuZXcgRHIoe3R5cGU6ImRlZmF1bHQiLGlubmVyVHlwZTp0LGdldCBkZWZhdWx0VmFsdWUoKXtyZXR1cm4gdHlwZW9mIG49PSJmdW5jdGlvbiI/bigpOlZuKG4pfX0pfWNvbnN0IFpyPWQoIlpvZFByZWZhdWx0IiwodCxuKT0+e2ZsLmluaXQodCxuKSxqLmluaXQodCxuKSx0Ll96b2QucHJvY2Vzc0pTT05TY2hlbWE9KHIsbyxlKT0+QmQodCxyLG8sZSksdC51bndyYXA9KCk9PnQuX3pvZC5kZWYuaW5uZXJUeXBlfSk7ZnVuY3Rpb24gUnIodCxuKXtyZXR1cm4gbmV3IFpyKHt0eXBlOiJwcmVmYXVsdCIsaW5uZXJUeXBlOnQsZ2V0IGRlZmF1bHRWYWx1ZSgpe3JldHVybiB0eXBlb2Ygbj09ImZ1bmN0aW9uIj9uKCk6Vm4obil9fSl9Y29uc3Qga249ZCgiWm9kTm9uT3B0aW9uYWwiLCh0LG4pPT57Z2wuaW5pdCh0LG4pLGouaW5pdCh0LG4pLHQuX3pvZC5wcm9jZXNzSlNPTlNjaGVtYT0ocixvLGUpPT5IZCh0LHIsbyxlKSx0LnVud3JhcD0oKT0+dC5fem9kLmRlZi5pbm5lclR5cGV9KTtmdW5jdGlvbiBDcih0LG4pe3JldHVybiBuZXcga24oe3R5cGU6Im5vbm9wdGlvbmFsIixpbm5lclR5cGU6dCwuLi5oKG4pfSl9Y29uc3QgQXI9ZCgiWm9kU3VjY2VzcyIsKHQsbik9Pnt2bC5pbml0KHQsbiksai5pbml0KHQsbiksdC5fem9kLnByb2Nlc3NKU09OU2NoZW1hPShyLG8sZSk9Pk5kKHQscixvKSx0LnVud3JhcD0oKT0+dC5fem9kLmRlZi5pbm5lclR5cGV9KTtmdW5jdGlvbiB4YSh0KXtyZXR1cm4gbmV3IEFyKHt0eXBlOiJzdWNjZXNzIixpbm5lclR5cGU6dH0pfWNvbnN0IExyPWQoIlpvZENhdGNoIiwodCxuKT0+e2hsLmluaXQodCxuKSxqLmluaXQodCxuKSx0Ll96b2QucHJvY2Vzc0pTT05TY2hlbWE9KHIsbyxlKT0+VmQodCxyLG8sZSksdC51bndyYXA9KCk9PnQuX3pvZC5kZWYuaW5uZXJUeXBlLHQucmVtb3ZlQ2F0Y2g9dC51bndyYXB9KTtmdW5jdGlvbiBNcih0LG4pe3JldHVybiBuZXcgTHIoe3R5cGU6ImNhdGNoIixpbm5lclR5cGU6dCxjYXRjaFZhbHVlOnR5cGVvZiBuPT0iZnVuY3Rpb24iP246KCk9Pm59KX1jb25zdCBxcj1kKCJab2ROYU4iLCh0LG4pPT57JGwuaW5pdCh0LG4pLGouaW5pdCh0LG4pLHQuX3pvZC5wcm9jZXNzSlNPTlNjaGVtYT0ocixvLGUpPT5PZCh0LHIpfSk7ZnVuY3Rpb24gVGEodCl7cmV0dXJuIG9kKHFyLHQpfWNvbnN0IHB0PWQoIlpvZFBpcGUiLCh0LG4pPT57cWkuaW5pdCh0LG4pLGouaW5pdCh0LG4pLHQuX3pvZC5wcm9jZXNzSlNPTlNjaGVtYT0ocixvLGUpPT5LZCh0LHIsbyxlKSx0LmluPW4uaW4sdC5vdXQ9bi5vdXR9KTtmdW5jdGlvbiBJdCh0LG4pe3JldHVybiBuZXcgcHQoe3R5cGU6InBpcGUiLGluOnQsb3V0Om59KX1jb25zdCBmdD1kKCJab2RDb2RlYyIsKHQsbik9PntwdC5pbml0KHQsbiksRmkuaW5pdCh0LG4pfSk7ZnVuY3Rpb24gamEodCxuLHIpe3JldHVybiBuZXcgZnQoe3R5cGU6InBpcGUiLGluOnQsb3V0Om4sdHJhbnNmb3JtOnIuZGVjb2RlLHJldmVyc2VUcmFuc2Zvcm06ci5lbmNvZGV9KX1mdW5jdGlvbiBPYSh0KXtjb25zdCBuPXQuX3pvZC5kZWY7cmV0dXJuIG5ldyBmdCh7dHlwZToicGlwZSIsaW46bi5vdXQsb3V0Om4uaW4sdHJhbnNmb3JtOm4ucmV2ZXJzZVRyYW5zZm9ybSxyZXZlcnNlVHJhbnNmb3JtOm4udHJhbnNmb3JtfSl9Y29uc3QgRnI9ZCgiWm9kUHJlcHJvY2VzcyIsKHQsbik9PntwdC5pbml0KHQsbiksX2wuaW5pdCh0LG4pfSksSnI9ZCgiWm9kUmVhZG9ubHkiLCh0LG4pPT57YmwuaW5pdCh0LG4pLGouaW5pdCh0LG4pLHQuX3pvZC5wcm9jZXNzSlNPTlNjaGVtYT0ocixvLGUpPT5HZCh0LHIsbyxlKSx0LnVud3JhcD0oKT0+dC5fem9kLmRlZi5pbm5lclR5cGV9KTtmdW5jdGlvbiBIcih0KXtyZXR1cm4gbmV3IEpyKHt0eXBlOiJyZWFkb25seSIsaW5uZXJUeXBlOnR9KX1jb25zdCBXcj1kKCJab2RUZW1wbGF0ZUxpdGVyYWwiLCh0LG4pPT57eWwuaW5pdCh0LG4pLGouaW5pdCh0LG4pLHQuX3pvZC5wcm9jZXNzSlNPTlNjaGVtYT0ocixvLGUpPT5VZCh0LHIsbyl9KTtmdW5jdGlvbiBVYSh0LG4pe3JldHVybiBuZXcgV3Ioe3R5cGU6InRlbXBsYXRlX2xpdGVyYWwiLHBhcnRzOnQsLi4uaChuKX0pfWNvbnN0IEJyPWQoIlpvZExhenkiLCh0LG4pPT57d2wuaW5pdCh0LG4pLGouaW5pdCh0LG4pLHQuX3pvZC5wcm9jZXNzSlNPTlNjaGVtYT0ocixvLGUpPT5ZZCh0LHIsbyxlKSx0LnVud3JhcD0oKT0+dC5fem9kLmRlZi5nZXR0ZXIoKX0pO2Z1bmN0aW9uIFZyKHQpe3JldHVybiBuZXcgQnIoe3R5cGU6ImxhenkiLGdldHRlcjp0fSl9Y29uc3QgS3I9ZCgiWm9kUHJvbWlzZSIsKHQsbik9PntTbC5pbml0KHQsbiksai5pbml0KHQsbiksdC5fem9kLnByb2Nlc3NKU09OU2NoZW1hPShyLG8sZSk9PlhkKHQscixvLGUpLHQudW53cmFwPSgpPT50Ll96b2QuZGVmLmlubmVyVHlwZX0pO2Z1bmN0aW9uIFBhKHQpe3JldHVybiBuZXcgS3Ioe3R5cGU6InByb21pc2UiLGlubmVyVHlwZTp0fSl9Y29uc3QgR3I9ZCgiWm9kRnVuY3Rpb24iLCh0LG4pPT57a2wuaW5pdCh0LG4pLGouaW5pdCh0LG4pLHQuX3pvZC5wcm9jZXNzSlNPTlNjaGVtYT0ocixvLGUpPT5FZCh0LHIpfSk7ZnVuY3Rpb24gZXQodCl7cmV0dXJuIG5ldyBHcih7dHlwZToiZnVuY3Rpb24iLGlucHV0OkFycmF5LmlzQXJyYXkodD8uaW5wdXQpP0lyKHQ/LmlucHV0KTp0Py5pbnB1dD8/SShFKCkpLG91dHB1dDp0Py5vdXRwdXQ/P0UoKX0pfWNvbnN0IGd0PWQoIlpvZEN1c3RvbSIsKHQsbik9PntJbC5pbml0KHQsbiksai5pbml0KHQsbiksdC5fem9kLnByb2Nlc3NKU09OU2NoZW1hPShyLG8sZSk9PkRkKHQscil9KTtmdW5jdGlvbiBOYSh0KXtjb25zdCBuPW5ldyBKKHtjaGVjazoiY3VzdG9tIn0pO3JldHVybiBuLl96b2QuY2hlY2s9dCxufWZ1bmN0aW9uIFhyKHQsbil7cmV0dXJuIGNkKGd0LHQ/PygoKT0+ITApLG4pfWZ1bmN0aW9uIFlyKHQsbj17fSl7cmV0dXJuIHVkKGd0LHQsbil9ZnVuY3Rpb24gUXIodCxuKXtyZXR1cm4gbGQodCxuKX1jb25zdCBEYT1tZCxFYT1wZDtmdW5jdGlvbiBaYSh0LG49e30pe2NvbnN0IHI9bmV3IGd0KHt0eXBlOiJjdXN0b20iLGNoZWNrOiJjdXN0b20iLGZuOm89Pm8gaW5zdGFuY2VvZiB0LGFib3J0OiEwLC4uLmgobil9KTtyZXR1cm4gci5fem9kLmJhZy5DbGFzcz10LHIuX3pvZC5jaGVjaz1vPT57by52YWx1ZSBpbnN0YW5jZW9mIHR8fG8uaXNzdWVzLnB1c2goe2NvZGU6ImludmFsaWRfdHlwZSIsZXhwZWN0ZWQ6dC5uYW1lLGlucHV0Om8udmFsdWUsaW5zdDpyLHBhdGg6Wy4uLnIuX3pvZC5kZWYucGF0aD8/W11dfSl9LHJ9Y29uc3QgUmE9KC4uLnQpPT5mZCh7Q29kZWM6ZnQsQm9vbGVhbjpjdCxTdHJpbmc6b3R9LC4uLnQpO2Z1bmN0aW9uIENhKHQpe2NvbnN0IG49VnIoKCk9PlUoW20odCksVCgpLFooKSx2bigpLEkobiksUChtKCksbildKSk7cmV0dXJuIG59ZnVuY3Rpb24gU24odCxuKXtyZXR1cm4gbmV3IEZyKHt0eXBlOiJwaXBlIixpbjpibih0KSxvdXQ6bn0pfWNvbnN0IGl2PU9iamVjdC5mcmVlemUoT2JqZWN0LmRlZmluZVByb3BlcnR5KHtfX3Byb3RvX186bnVsbCxab2RBbnk6dnIsWm9kQXJyYXk6YnIsWm9kQmFzZTY0OmRuLFpvZEJhc2U2NFVSTDptbixab2RCaWdJbnQ6dXQsWm9kQmlnSW50Rm9ybWF0OmduLFpvZEJvb2xlYW46Y3QsWm9kQ0lEUnY0OnVuLFpvZENJRFJ2Njpsbixab2RDVUlEOnRuLFpvZENVSUQyOm5uLFpvZENhdGNoOkxyLFpvZENvZGVjOmZ0LFpvZEN1c3RvbTpndCxab2RDdXN0b21TdHJpbmdGb3JtYXQ6TWUsWm9kRGF0ZTokbixab2REZWZhdWx0OkRyLFpvZERpc2NyaW1pbmF0ZWRVbmlvbjprcixab2RFMTY0OnBuLFpvZEVtYWlsOll0LFpvZEVtb2ppOlF0LFpvZEVudW06Q2UsWm9kRXhhY3RPcHRpb25hbDpVcixab2RGaWxlOmpyLFpvZEZ1bmN0aW9uOkdyLFpvZEdVSUQ6WGUsWm9kSVB2NDpzbixab2RJUHY2OmNuLFpvZEludGVyc2VjdGlvbjpTcixab2RKV1Q6Zm4sWm9kS1NVSUQ6YW4sWm9kTGF6eTpCcixab2RMaXRlcmFsOlRyLFpvZE1BQzptcixab2RNYXA6enIsWm9kTmFOOnFyLFpvZE5hbm9JRDplbixab2ROZXZlcjokcixab2ROb25PcHRpb25hbDprbixab2ROdWxsOmdyLFpvZE51bGxhYmxlOk5yLFpvZE51bWJlcjpzdCxab2ROdW1iZXJGb3JtYXQ6VGUsWm9kT2JqZWN0Omx0LFpvZE9wdGlvbmFsOnluLFpvZFBpcGU6cHQsWm9kUHJlZmF1bHQ6WnIsWm9kUHJlcHJvY2VzczpGcixab2RQcm9taXNlOktyLFpvZFJlYWRvbmx5OkpyLFpvZFJlY29yZDpSZSxab2RTZXQ6eHIsWm9kU3RyaW5nOm90LFpvZFN0cmluZ0Zvcm1hdDpBLFpvZFN1Y2Nlc3M6QXIsWm9kU3ltYm9sOnByLFpvZFRlbXBsYXRlTGl0ZXJhbDpXcixab2RUcmFuc2Zvcm06T3IsWm9kVHVwbGU6d3IsWm9kVHlwZTpqLFpvZFVMSUQ6cm4sWm9kVVJMOmF0LFpvZFVVSUQ6aGUsWm9kVW5kZWZpbmVkOmZyLFpvZFVuaW9uOmR0LFpvZFVua25vd246aHIsWm9kVm9pZDpfcixab2RYSUQ6b24sWm9kWG9yOnlyLF9ab2RTdHJpbmc6WHQsX2RlZmF1bHQ6RXIsX2Z1bmN0aW9uOmV0LGFueTpobixhcnJheTpJLGJhc2U2NDpRbyxiYXNlNjR1cmw6ZWEsYmlnaW50OmRhLGJvb2xlYW46WixjYXRjaDpNcixjaGVjazpOYSxjaWRydjQ6WG8sY2lkcnY2OllvLGNvZGVjOmphLGN1aWQ6Rm8sY3VpZDI6Sm8sY3VzdG9tOlhyLGRhdGU6dmEsZGVzY3JpYmU6RGEsZGlzY3JpbWluYXRlZFVuaW9uOl9uLGUxNjQ6dGEsZW1haWw6Tm8sZW1vamk6TW8sZW51bTpRLGV4YWN0T3B0aW9uYWw6UHIsZmlsZTpJYSxmbG9hdDMyOnNhLGZsb2F0NjQ6Y2EsZnVuY3Rpb246ZXQsZ3VpZDpEbyxoYXNoOmFhLGhleDpvYSxob3N0bmFtZTppYSxodHRwVXJsOkxvLGluc3RhbmNlb2Y6WmEsaW50Ond0LGludDMyOnVhLGludDY0Om1hLGludGVyc2VjdGlvbjptdCxpbnZlcnRDb2RlYzpPYSxpcHY0OlZvLGlwdjY6R28sanNvbjpDYSxqd3Q6bmEsa2V5b2Y6aGEsa3N1aWQ6Qm8sbGF6eTpWcixsaXRlcmFsOnAsbG9vc2VPYmplY3Q6WSxsb29zZVJlY29yZDp5YSxtYWM6S28sbWFwOmthLG1ldGE6RWEsbmFuOlRhLG5hbm9pZDpxbyxuYXRpdmVFbnVtOndhLG5ldmVyOlplLG5vbm9wdGlvbmFsOkNyLG51bGw6dm4sbnVsbGFibGU6UWUsbnVsbGlzaDp6YSxudW1iZXI6VCxvYmplY3Q6ZixvcHRpb25hbDpxLHBhcnRpYWxSZWNvcmQ6YmEscGlwZTpJdCxwcmVmYXVsdDpScixwcmVwcm9jZXNzOlNuLHByb21pc2U6UGEscmVhZG9ubHk6SHIscmVjb3JkOlAscmVmaW5lOllyLHNldDpTYSxzdHJpY3RPYmplY3Q6JGEsc3RyaW5nOm0sc3RyaW5nRm9ybWF0OnJhLHN0cmluZ2Jvb2w6UmEsc3VjY2Vzczp4YSxzdXBlclJlZmluZTpRcixzeW1ib2w6ZmEsdGVtcGxhdGVMaXRlcmFsOlVhLHRyYW5zZm9ybTpibix0dXBsZTpJcix1aW50MzI6bGEsdWludDY0OnBhLHVsaWQ6SG8sdW5kZWZpbmVkOlllLHVuaW9uOlUsdW5rbm93bjpFLHVybDpBbyx1dWlkOkVvLHV1aWR2NDpabyx1dWlkdjY6Um8sdXVpZHY3OkNvLHZvaWQ6Z2EseGlkOldvLHhvcjpfYX0sU3ltYm9sLnRvU3RyaW5nVGFnLHt2YWx1ZToiTW9kdWxlIn0pKSxhbT17aW52YWxpZF90eXBlOiJpbnZhbGlkX3R5cGUiLHRvb19iaWc6InRvb19iaWciLHRvb19zbWFsbDoidG9vX3NtYWxsIixpbnZhbGlkX2Zvcm1hdDoiaW52YWxpZF9mb3JtYXQiLG5vdF9tdWx0aXBsZV9vZjoibm90X211bHRpcGxlX29mIix1bnJlY29nbml6ZWRfa2V5czoidW5yZWNvZ25pemVkX2tleXMiLGludmFsaWRfdW5pb246ImludmFsaWRfdW5pb24iLGludmFsaWRfa2V5OiJpbnZhbGlkX2tleSIsaW52YWxpZF9lbGVtZW50OiJpbnZhbGlkX2VsZW1lbnQiLGludmFsaWRfdmFsdWU6ImludmFsaWRfdmFsdWUiLGN1c3RvbToiY3VzdG9tIn07ZnVuY3Rpb24gc20odCl7Syh7Y3VzdG9tRXJyb3I6dH0pfWZ1bmN0aW9uIGNtKCl7cmV0dXJuIEsoKS5jdXN0b21FcnJvcn12YXIgTW47TW58fChNbj17fSk7Y29uc3QgYj17Li4uaXYsLi4ucnYsaXNvOmJvfSxvdj1uZXcgU2V0KFsiJHNjaGVtYSIsIiRyZWYiLCIkZGVmcyIsImRlZmluaXRpb25zIiwiJGlkIiwiaWQiLCIkY29tbWVudCIsIiRhbmNob3IiLCIkdm9jYWJ1bGFyeSIsIiRkeW5hbWljUmVmIiwiJGR5bmFtaWNBbmNob3IiLCJ0eXBlIiwiZW51bSIsImNvbnN0IiwiYW55T2YiLCJvbmVPZiIsImFsbE9mIiwibm90IiwicHJvcGVydGllcyIsInJlcXVpcmVkIiwiYWRkaXRpb25hbFByb3BlcnRpZXMiLCJwYXR0ZXJuUHJvcGVydGllcyIsInByb3BlcnR5TmFtZXMiLCJtaW5Qcm9wZXJ0aWVzIiwibWF4UHJvcGVydGllcyIsIml0ZW1zIiwicHJlZml4SXRlbXMiLCJhZGRpdGlvbmFsSXRlbXMiLCJtaW5JdGVtcyIsIm1heEl0ZW1zIiwidW5pcXVlSXRlbXMiLCJjb250YWlucyIsIm1pbkNvbnRhaW5zIiwibWF4Q29udGFpbnMiLCJtaW5MZW5ndGgiLCJtYXhMZW5ndGgiLCJwYXR0ZXJuIiwiZm9ybWF0IiwibWluaW11bSIsIm1heGltdW0iLCJleGNsdXNpdmVNaW5pbXVtIiwiZXhjbHVzaXZlTWF4aW11bSIsIm11bHRpcGxlT2YiLCJkZXNjcmlwdGlvbiIsImRlZmF1bHQiLCJjb250ZW50RW5jb2RpbmciLCJjb250ZW50TWVkaWFUeXBlIiwiY29udGVudFNjaGVtYSIsInVuZXZhbHVhdGVkSXRlbXMiLCJ1bmV2YWx1YXRlZFByb3BlcnRpZXMiLCJpZiIsInRoZW4iLCJlbHNlIiwiZGVwZW5kZW50U2NoZW1hcyIsImRlcGVuZGVudFJlcXVpcmVkIiwibnVsbGFibGUiLCJyZWFkT25seSJdKTtmdW5jdGlvbiBhdih0LG4pe2NvbnN0IHI9dC4kc2NoZW1hO3JldHVybiByPT09Imh0dHBzOi8vanNvbi1zY2hlbWEub3JnL2RyYWZ0LzIwMjAtMTIvc2NoZW1hIj8iZHJhZnQtMjAyMC0xMiI6cj09PSJodHRwOi8vanNvbi1zY2hlbWEub3JnL2RyYWZ0LTA3L3NjaGVtYSMiPyJkcmFmdC03IjpyPT09Imh0dHA6Ly9qc29uLXNjaGVtYS5vcmcvZHJhZnQtMDQvc2NoZW1hIyI/ImRyYWZ0LTQiOm4/PyJkcmFmdC0yMDIwLTEyIn1mdW5jdGlvbiBzdih0LG4pe2lmKCF0LnN0YXJ0c1dpdGgoIiMiKSl0aHJvdyBuZXcgRXJyb3IoIkV4dGVybmFsICRyZWYgaXMgbm90IHN1cHBvcnRlZCwgb25seSBsb2NhbCByZWZzICgjLy4uLikgYXJlIGFsbG93ZWQiKTtjb25zdCByPXQuc2xpY2UoMSkuc3BsaXQoIi8iKS5maWx0ZXIoQm9vbGVhbik7aWYoci5sZW5ndGg9PT0wKXJldHVybiBuLnJvb3RTY2hlbWE7Y29uc3Qgbz1uLnZlcnNpb249PT0iZHJhZnQtMjAyMC0xMiI/IiRkZWZzIjoiZGVmaW5pdGlvbnMiO2lmKHJbMF09PT1vKXtjb25zdCBlPXJbMV07aWYoIWV8fCFuLmRlZnNbZV0pdGhyb3cgbmV3IEVycm9yKGBSZWZlcmVuY2Ugbm90IGZvdW5kOiAke3R9YCk7cmV0dXJuIG4uZGVmc1tlXX10aHJvdyBuZXcgRXJyb3IoYFJlZmVyZW5jZSBub3QgZm91bmQ6ICR7dH1gKX1mdW5jdGlvbiB1bSh0LG4pe2lmKHQubm90IT09dm9pZCAwKXtpZih0eXBlb2YgdC5ub3Q9PSJvYmplY3QiJiZPYmplY3Qua2V5cyh0Lm5vdCkubGVuZ3RoPT09MClyZXR1cm4gYi5uZXZlcigpO3Rocm93IG5ldyBFcnJvcigibm90IGlzIG5vdCBzdXBwb3J0ZWQgaW4gWm9kIChleGNlcHQgeyBub3Q6IHt9IH0gZm9yIG5ldmVyKSIpfWlmKHQudW5ldmFsdWF0ZWRJdGVtcyE9PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoInVuZXZhbHVhdGVkSXRlbXMgaXMgbm90IHN1cHBvcnRlZCIpO2lmKHQudW5ldmFsdWF0ZWRQcm9wZXJ0aWVzIT09dm9pZCAwKXRocm93IG5ldyBFcnJvcigidW5ldmFsdWF0ZWRQcm9wZXJ0aWVzIGlzIG5vdCBzdXBwb3J0ZWQiKTtpZih0LmlmIT09dm9pZCAwfHx0LnRoZW4hPT12b2lkIDB8fHQuZWxzZSE9PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoIkNvbmRpdGlvbmFsIHNjaGVtYXMgKGlmL3RoZW4vZWxzZSkgYXJlIG5vdCBzdXBwb3J0ZWQiKTtpZih0LmRlcGVuZGVudFNjaGVtYXMhPT12b2lkIDB8fHQuZGVwZW5kZW50UmVxdWlyZWQhPT12b2lkIDApdGhyb3cgbmV3IEVycm9yKCJkZXBlbmRlbnRTY2hlbWFzIGFuZCBkZXBlbmRlbnRSZXF1aXJlZCBhcmUgbm90IHN1cHBvcnRlZCIpO2lmKHQuJHJlZil7Y29uc3QgZT10LiRyZWY7aWYobi5yZWZzLmhhcyhlKSlyZXR1cm4gbi5yZWZzLmdldChlKTtpZihuLnByb2Nlc3NpbmcuaGFzKGUpKXJldHVybiBiLmxhenkoKCk9PntpZighbi5yZWZzLmhhcyhlKSl0aHJvdyBuZXcgRXJyb3IoYENpcmN1bGFyIHJlZmVyZW5jZSBub3QgcmVzb2x2ZWQ6ICR7ZX1gKTtyZXR1cm4gbi5yZWZzLmdldChlKX0pO24ucHJvY2Vzc2luZy5hZGQoZSk7Y29uc3QgaT1zdihlLG4pLGE9bmUoaSxuKTtyZXR1cm4gbi5yZWZzLnNldChlLGEpLG4ucHJvY2Vzc2luZy5kZWxldGUoZSksYX1pZih0LmVudW0hPT12b2lkIDApe2NvbnN0IGU9dC5lbnVtO2lmKG4udmVyc2lvbj09PSJvcGVuYXBpLTMuMCImJnQubnVsbGFibGU9PT0hMCYmZS5sZW5ndGg9PT0xJiZlWzBdPT09bnVsbClyZXR1cm4gYi5udWxsKCk7aWYoZS5sZW5ndGg9PT0wKXJldHVybiBiLm5ldmVyKCk7aWYoZS5sZW5ndGg9PT0xKXJldHVybiBiLmxpdGVyYWwoZVswXSk7aWYoZS5ldmVyeShhPT50eXBlb2YgYT09InN0cmluZyIpKXJldHVybiBiLmVudW0oZSk7Y29uc3QgaT1lLm1hcChhPT5iLmxpdGVyYWwoYSkpO3JldHVybiBpLmxlbmd0aDwyP2lbMF06Yi51bmlvbihbaVswXSxpWzFdLC4uLmkuc2xpY2UoMildKX1pZih0LmNvbnN0IT09dm9pZCAwKXJldHVybiBiLmxpdGVyYWwodC5jb25zdCk7Y29uc3Qgcj10LnR5cGU7aWYoQXJyYXkuaXNBcnJheShyKSl7Y29uc3QgZT1yLm1hcChpPT57Y29uc3QgYT17Li4udCx0eXBlOml9O3JldHVybiB1bShhLG4pfSk7cmV0dXJuIGUubGVuZ3RoPT09MD9iLm5ldmVyKCk6ZS5sZW5ndGg9PT0xP2VbMF06Yi51bmlvbihlKX1pZighcilyZXR1cm4gYi5hbnkoKTtsZXQgbztzd2l0Y2gocil7Y2FzZSJzdHJpbmciOntsZXQgZT1iLnN0cmluZygpO2lmKHQuZm9ybWF0KXtjb25zdCBpPXQuZm9ybWF0O2k9PT0iZW1haWwiP2U9ZS5jaGVjayhiLmVtYWlsKCkpOmk9PT0idXJpInx8aT09PSJ1cmktcmVmZXJlbmNlIj9lPWUuY2hlY2soYi51cmwoKSk6aT09PSJ1dWlkInx8aT09PSJndWlkIj9lPWUuY2hlY2soYi51dWlkKCkpOmk9PT0iZGF0ZS10aW1lIj9lPWUuY2hlY2soYi5pc28uZGF0ZXRpbWUoKSk6aT09PSJkYXRlIj9lPWUuY2hlY2soYi5pc28uZGF0ZSgpKTppPT09InRpbWUiP2U9ZS5jaGVjayhiLmlzby50aW1lKCkpOmk9PT0iZHVyYXRpb24iP2U9ZS5jaGVjayhiLmlzby5kdXJhdGlvbigpKTppPT09ImlwdjQiP2U9ZS5jaGVjayhiLmlwdjQoKSk6aT09PSJpcHY2Ij9lPWUuY2hlY2soYi5pcHY2KCkpOmk9PT0ibWFjIj9lPWUuY2hlY2soYi5tYWMoKSk6aT09PSJjaWRyIj9lPWUuY2hlY2soYi5jaWRydjQoKSk6aT09PSJjaWRyLXY2Ij9lPWUuY2hlY2soYi5jaWRydjYoKSk6aT09PSJiYXNlNjQiP2U9ZS5jaGVjayhiLmJhc2U2NCgpKTppPT09ImJhc2U2NHVybCI/ZT1lLmNoZWNrKGIuYmFzZTY0dXJsKCkpOmk9PT0iZTE2NCI/ZT1lLmNoZWNrKGIuZTE2NCgpKTppPT09Imp3dCI/ZT1lLmNoZWNrKGIuand0KCkpOmk9PT0iZW1vamkiP2U9ZS5jaGVjayhiLmVtb2ppKCkpOmk9PT0ibmFub2lkIj9lPWUuY2hlY2soYi5uYW5vaWQoKSk6aT09PSJjdWlkIj9lPWUuY2hlY2soYi5jdWlkKCkpOmk9PT0iY3VpZDIiP2U9ZS5jaGVjayhiLmN1aWQyKCkpOmk9PT0idWxpZCI/ZT1lLmNoZWNrKGIudWxpZCgpKTppPT09InhpZCI/ZT1lLmNoZWNrKGIueGlkKCkpOmk9PT0ia3N1aWQiJiYoZT1lLmNoZWNrKGIua3N1aWQoKSkpfXR5cGVvZiB0Lm1pbkxlbmd0aD09Im51bWJlciImJihlPWUubWluKHQubWluTGVuZ3RoKSksdHlwZW9mIHQubWF4TGVuZ3RoPT0ibnVtYmVyIiYmKGU9ZS5tYXgodC5tYXhMZW5ndGgpKSx0LnBhdHRlcm4mJihlPWUucmVnZXgobmV3IFJlZ0V4cCh0LnBhdHRlcm4pKSksbz1lO2JyZWFrfWNhc2UibnVtYmVyIjpjYXNlImludGVnZXIiOntsZXQgZT1yPT09ImludGVnZXIiP2IubnVtYmVyKCkuaW50KCk6Yi5udW1iZXIoKTt0eXBlb2YgdC5taW5pbXVtPT0ibnVtYmVyIiYmKGU9ZS5taW4odC5taW5pbXVtKSksdHlwZW9mIHQubWF4aW11bT09Im51bWJlciImJihlPWUubWF4KHQubWF4aW11bSkpLHR5cGVvZiB0LmV4Y2x1c2l2ZU1pbmltdW09PSJudW1iZXIiP2U9ZS5ndCh0LmV4Y2x1c2l2ZU1pbmltdW0pOnQuZXhjbHVzaXZlTWluaW11bT09PSEwJiZ0eXBlb2YgdC5taW5pbXVtPT0ibnVtYmVyIiYmKGU9ZS5ndCh0Lm1pbmltdW0pKSx0eXBlb2YgdC5leGNsdXNpdmVNYXhpbXVtPT0ibnVtYmVyIj9lPWUubHQodC5leGNsdXNpdmVNYXhpbXVtKTp0LmV4Y2x1c2l2ZU1heGltdW09PT0hMCYmdHlwZW9mIHQubWF4aW11bT09Im51bWJlciImJihlPWUubHQodC5tYXhpbXVtKSksdHlwZW9mIHQubXVsdGlwbGVPZj09Im51bWJlciImJihlPWUubXVsdGlwbGVPZih0Lm11bHRpcGxlT2YpKSxvPWU7YnJlYWt9Y2FzZSJib29sZWFuIjp7bz1iLmJvb2xlYW4oKTticmVha31jYXNlIm51bGwiOntvPWIubnVsbCgpO2JyZWFrfWNhc2Uib2JqZWN0Ijp7Y29uc3QgZT17fSxpPXQucHJvcGVydGllc3x8e30sYT1uZXcgU2V0KHQucmVxdWlyZWR8fFtdKTtmb3IoY29uc3RbYyx1XW9mIE9iamVjdC5lbnRyaWVzKGkpKXtjb25zdCBsPW5lKHUsbik7ZVtjXT1hLmhhcyhjKT9sOmwub3B0aW9uYWwoKX1pZih0LnByb3BlcnR5TmFtZXMpe2NvbnN0IGM9bmUodC5wcm9wZXJ0eU5hbWVzLG4pLHU9dC5hZGRpdGlvbmFsUHJvcGVydGllcyYmdHlwZW9mIHQuYWRkaXRpb25hbFByb3BlcnRpZXM9PSJvYmplY3QiP25lKHQuYWRkaXRpb25hbFByb3BlcnRpZXMsbik6Yi5hbnkoKTtpZihPYmplY3Qua2V5cyhlKS5sZW5ndGg9PT0wKXtvPWIucmVjb3JkKGMsdSk7YnJlYWt9Y29uc3QgbD1iLm9iamVjdChlKS5wYXNzdGhyb3VnaCgpLGc9Yi5sb29zZVJlY29yZChjLHUpO289Yi5pbnRlcnNlY3Rpb24obCxnKTticmVha31pZih0LnBhdHRlcm5Qcm9wZXJ0aWVzKXtjb25zdCBjPXQucGF0dGVyblByb3BlcnRpZXMsdT1PYmplY3Qua2V5cyhjKSxsPVtdO2Zvcihjb25zdCB2IG9mIHUpe2NvbnN0ICQ9bmUoY1t2XSxuKSx5PWIuc3RyaW5nKCkucmVnZXgobmV3IFJlZ0V4cCh2KSk7bC5wdXNoKGIubG9vc2VSZWNvcmQoeSwkKSl9Y29uc3QgZz1bXTtpZihPYmplY3Qua2V5cyhlKS5sZW5ndGg+MCYmZy5wdXNoKGIub2JqZWN0KGUpLnBhc3N0aHJvdWdoKCkpLGcucHVzaCguLi5sKSxnLmxlbmd0aD09PTApbz1iLm9iamVjdCh7fSkucGFzc3Rocm91Z2goKTtlbHNlIGlmKGcubGVuZ3RoPT09MSlvPWdbMF07ZWxzZXtsZXQgdj1iLmludGVyc2VjdGlvbihnWzBdLGdbMV0pO2ZvcihsZXQgJD0yOyQ8Zy5sZW5ndGg7JCsrKXY9Yi5pbnRlcnNlY3Rpb24odixnWyRdKTtvPXZ9YnJlYWt9Y29uc3Qgcz1iLm9iamVjdChlKTt0LmFkZGl0aW9uYWxQcm9wZXJ0aWVzPT09ITE/bz1zLnN0cmljdCgpOnR5cGVvZiB0LmFkZGl0aW9uYWxQcm9wZXJ0aWVzPT0ib2JqZWN0Ij9vPXMuY2F0Y2hhbGwobmUodC5hZGRpdGlvbmFsUHJvcGVydGllcyxuKSk6bz1zLnBhc3N0aHJvdWdoKCk7YnJlYWt9Y2FzZSJhcnJheSI6e2NvbnN0IGU9dC5wcmVmaXhJdGVtcyxpPXQuaXRlbXM7aWYoZSYmQXJyYXkuaXNBcnJheShlKSl7Y29uc3QgYT1lLm1hcChjPT5uZShjLG4pKSxzPWkmJnR5cGVvZiBpPT0ib2JqZWN0IiYmIUFycmF5LmlzQXJyYXkoaSk/bmUoaSxuKTp2b2lkIDA7cz9vPWIudHVwbGUoYSkucmVzdChzKTpvPWIudHVwbGUoYSksdHlwZW9mIHQubWluSXRlbXM9PSJudW1iZXIiJiYobz1vLmNoZWNrKGIubWluTGVuZ3RoKHQubWluSXRlbXMpKSksdHlwZW9mIHQubWF4SXRlbXM9PSJudW1iZXIiJiYobz1vLmNoZWNrKGIubWF4TGVuZ3RoKHQubWF4SXRlbXMpKSl9ZWxzZSBpZihBcnJheS5pc0FycmF5KGkpKXtjb25zdCBhPWkubWFwKGM9Pm5lKGMsbikpLHM9dC5hZGRpdGlvbmFsSXRlbXMmJnR5cGVvZiB0LmFkZGl0aW9uYWxJdGVtcz09Im9iamVjdCI/bmUodC5hZGRpdGlvbmFsSXRlbXMsbik6dm9pZCAwO3M/bz1iLnR1cGxlKGEpLnJlc3Qocyk6bz1iLnR1cGxlKGEpLHR5cGVvZiB0Lm1pbkl0ZW1zPT0ibnVtYmVyIiYmKG89by5jaGVjayhiLm1pbkxlbmd0aCh0Lm1pbkl0ZW1zKSkpLHR5cGVvZiB0Lm1heEl0ZW1zPT0ibnVtYmVyIiYmKG89by5jaGVjayhiLm1heExlbmd0aCh0Lm1heEl0ZW1zKSkpfWVsc2UgaWYoaSE9PXZvaWQgMCl7Y29uc3QgYT1uZShpLG4pO2xldCBzPWIuYXJyYXkoYSk7dHlwZW9mIHQubWluSXRlbXM9PSJudW1iZXIiJiYocz1zLm1pbih0Lm1pbkl0ZW1zKSksdHlwZW9mIHQubWF4SXRlbXM9PSJudW1iZXIiJiYocz1zLm1heCh0Lm1heEl0ZW1zKSksbz1zfWVsc2Ugbz1iLmFycmF5KGIuYW55KCkpO2JyZWFrfWRlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCB0eXBlOiAke3J9YCl9cmV0dXJuIG99ZnVuY3Rpb24gbmUodCxuKXtpZih0eXBlb2YgdD09ImJvb2xlYW4iKXJldHVybiB0P2IuYW55KCk6Yi5uZXZlcigpO2xldCByPXVtKHQsbik7Y29uc3Qgbz10LnR5cGV8fHQuZW51bSE9PXZvaWQgMHx8dC5jb25zdCE9PXZvaWQgMDtpZih0LmFueU9mJiZBcnJheS5pc0FycmF5KHQuYW55T2YpKXtjb25zdCBzPXQuYW55T2YubWFwKHU9Pm5lKHUsbikpLGM9Yi51bmlvbihzKTtyPW8/Yi5pbnRlcnNlY3Rpb24ocixjKTpjfWlmKHQub25lT2YmJkFycmF5LmlzQXJyYXkodC5vbmVPZikpe2NvbnN0IHM9dC5vbmVPZi5tYXAodT0+bmUodSxuKSksYz1iLnhvcihzKTtyPW8/Yi5pbnRlcnNlY3Rpb24ocixjKTpjfWlmKHQuYWxsT2YmJkFycmF5LmlzQXJyYXkodC5hbGxPZikpaWYodC5hbGxPZi5sZW5ndGg9PT0wKXI9bz9yOmIuYW55KCk7ZWxzZXtsZXQgcz1vP3I6bmUodC5hbGxPZlswXSxuKTtjb25zdCBjPW8/MDoxO2ZvcihsZXQgdT1jO3U8dC5hbGxPZi5sZW5ndGg7dSsrKXM9Yi5pbnRlcnNlY3Rpb24ocyxuZSh0LmFsbE9mW3VdLG4pKTtyPXN9dC5udWxsYWJsZT09PSEwJiZuLnZlcnNpb249PT0ib3BlbmFwaS0zLjAiJiYocj1iLm51bGxhYmxlKHIpKSx0LnJlYWRPbmx5PT09ITAmJihyPWIucmVhZG9ubHkocikpLHQuZGVmYXVsdCE9PXZvaWQgMCYmKHI9ci5kZWZhdWx0KHQuZGVmYXVsdCkpO2NvbnN0IGU9e30saT1bIiRpZCIsImlkIiwiJGNvbW1lbnQiLCIkYW5jaG9yIiwiJHZvY2FidWxhcnkiLCIkZHluYW1pY1JlZiIsIiRkeW5hbWljQW5jaG9yIl07Zm9yKGNvbnN0IHMgb2YgaSlzIGluIHQmJihlW3NdPXRbc10pO2NvbnN0IGE9WyJjb250ZW50RW5jb2RpbmciLCJjb250ZW50TWVkaWFUeXBlIiwiY29udGVudFNjaGVtYSJdO2Zvcihjb25zdCBzIG9mIGEpcyBpbiB0JiYoZVtzXT10W3NdKTtmb3IoY29uc3QgcyBvZiBPYmplY3Qua2V5cyh0KSlvdi5oYXMocyl8fChlW3NdPXRbc10pO3JldHVybiBPYmplY3Qua2V5cyhlKS5sZW5ndGg+MCYmbi5yZWdpc3RyeS5hZGQocixlKSx0LmRlc2NyaXB0aW9uJiYocj1yLmRlc2NyaWJlKHQuZGVzY3JpcHRpb24pKSxyfWZ1bmN0aW9uIGxtKHQsbil7aWYodHlwZW9mIHQ9PSJib29sZWFuIilyZXR1cm4gdD9iLmFueSgpOmIubmV2ZXIoKTtsZXQgcjt0cnl7cj1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHQpKX1jYXRjaHt0aHJvdyBuZXcgRXJyb3IoImZyb21KU09OU2NoZW1hIGlucHV0IGlzIG5vdCB2YWxpZCBKU09OIChwb3NzaWJseSBjeWNsaWMpOyB1c2UgJGRlZnMvJHJlZiBmb3IgcmVjdXJzaXZlIHNjaGVtYXMiKX1jb25zdCBvPWF2KHIsbj8uZGVmYXVsdFRhcmdldCksZT1yLiRkZWZzfHxyLmRlZmluaXRpb25zfHx7fSxpPXt2ZXJzaW9uOm8sZGVmczplLHJlZnM6bmV3IE1hcCxwcm9jZXNzaW5nOm5ldyBTZXQscm9vdFNjaGVtYTpyLHJlZ2lzdHJ5Om4/LnJlZ2lzdHJ5Pz9jZX07cmV0dXJuIG5lKHIsaSl9ZnVuY3Rpb24gY3YodCl7cmV0dXJuIFVsKG90LHQpfWZ1bmN0aW9uIHV2KHQpe3JldHVybiBDbChzdCx0KX1mdW5jdGlvbiBsdih0KXtyZXR1cm4gSGwoY3QsdCl9ZnVuY3Rpb24gZHYodCl7cmV0dXJuIEJsKHV0LHQpfWZ1bmN0aW9uIG12KHQpe3JldHVybiBpZCgkbix0KX1jb25zdCBkbT1PYmplY3QuZnJlZXplKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7X19wcm90b19fOm51bGwsYmlnaW50OmR2LGJvb2xlYW46bHYsZGF0ZTptdixudW1iZXI6dXYsc3RyaW5nOmN2fSxTeW1ib2wudG9TdHJpbmdUYWcse3ZhbHVlOiJNb2R1bGUifSkpO0soemwoKSk7Y29uc3QgUnM9T2JqZWN0LmZyZWV6ZShPYmplY3QuZGVmaW5lUHJvcGVydHkoe19fcHJvdG9fXzpudWxsLCRicmFuZDpnaSwkaW5wdXQ6V2ksJG91dHB1dDpIaSxORVZFUjpmaSxUaW1lUHJlY2lzaW9uOmZvLFpvZEFueTp2cixab2RBcnJheTpicixab2RCYXNlNjQ6ZG4sWm9kQmFzZTY0VVJMOm1uLFpvZEJpZ0ludDp1dCxab2RCaWdJbnRGb3JtYXQ6Z24sWm9kQm9vbGVhbjpjdCxab2RDSURSdjQ6dW4sWm9kQ0lEUnY2OmxuLFpvZENVSUQ6dG4sWm9kQ1VJRDI6bm4sWm9kQ2F0Y2g6THIsWm9kQ29kZWM6ZnQsWm9kQ3VzdG9tOmd0LFpvZEN1c3RvbVN0cmluZ0Zvcm1hdDpNZSxab2REYXRlOiRuLFpvZERlZmF1bHQ6RHIsWm9kRGlzY3JpbWluYXRlZFVuaW9uOmtyLFpvZEUxNjQ6cG4sWm9kRW1haWw6WXQsWm9kRW1vamk6UXQsWm9kRW51bTpDZSxab2RFcnJvcjpvbSxab2RFeGFjdE9wdGlvbmFsOlVyLFpvZEZpbGU6anIsZ2V0IFpvZEZpcnN0UGFydHlUeXBlS2luZCgpe3JldHVybiBNbn0sWm9kRnVuY3Rpb246R3IsWm9kR1VJRDpYZSxab2RJUHY0OnNuLFpvZElQdjY6Y24sWm9kSVNPRGF0ZTp1cixab2RJU09EYXRlVGltZTpjcixab2RJU09EdXJhdGlvbjpkcixab2RJU09UaW1lOmxyLFpvZEludGVyc2VjdGlvbjpTcixab2RJc3N1ZUNvZGU6YW0sWm9kSldUOmZuLFpvZEtTVUlEOmFuLFpvZExhenk6QnIsWm9kTGl0ZXJhbDpUcixab2RNQUM6bXIsWm9kTWFwOnpyLFpvZE5hTjpxcixab2ROYW5vSUQ6ZW4sWm9kTmV2ZXI6JHIsWm9kTm9uT3B0aW9uYWw6a24sWm9kTnVsbDpncixab2ROdWxsYWJsZTpOcixab2ROdW1iZXI6c3QsWm9kTnVtYmVyRm9ybWF0OlRlLFpvZE9iamVjdDpsdCxab2RPcHRpb25hbDp5bixab2RQaXBlOnB0LFpvZFByZWZhdWx0OlpyLFpvZFByZXByb2Nlc3M6RnIsWm9kUHJvbWlzZTpLcixab2RSZWFkb25seTpKcixab2RSZWFsRXJyb3I6c2UsWm9kUmVjb3JkOlJlLFpvZFNldDp4cixab2RTdHJpbmc6b3QsWm9kU3RyaW5nRm9ybWF0OkEsWm9kU3VjY2VzczpBcixab2RTeW1ib2w6cHIsWm9kVGVtcGxhdGVMaXRlcmFsOldyLFpvZFRyYW5zZm9ybTpPcixab2RUdXBsZTp3cixab2RUeXBlOmosWm9kVUxJRDpybixab2RVUkw6YXQsWm9kVVVJRDpoZSxab2RVbmRlZmluZWQ6ZnIsWm9kVW5pb246ZHQsWm9kVW5rbm93bjpocixab2RWb2lkOl9yLFpvZFhJRDpvbixab2RYb3I6eXIsX1pvZFN0cmluZzpYdCxfZGVmYXVsdDpFcixfZnVuY3Rpb246ZXQsYW55OmhuLGFycmF5OkksYmFzZTY0OlFvLGJhc2U2NHVybDplYSxiaWdpbnQ6ZGEsYm9vbGVhbjpaLGNhdGNoOk1yLGNoZWNrOk5hLGNpZHJ2NDpYbyxjaWRydjY6WW8sY2xvbmU6ZGUsY29kZWM6amEsY29lcmNlOmRtLGNvbmZpZzpLLGNvcmU6UWQsY3VpZDpGbyxjdWlkMjpKbyxjdXN0b206WHIsZGF0ZTp2YSxkZWNvZGU6em8sZGVjb2RlQXN5bmM6VG8sZGVzY3JpYmU6RGEsZGlzY3JpbWluYXRlZFVuaW9uOl9uLGUxNjQ6dGEsZW1haWw6Tm8sZW1vamk6TW8sZW5jb2RlOklvLGVuY29kZUFzeW5jOnhvLGVuZHNXaXRoOnF0LGVudW06USxleGFjdE9wdGlvbmFsOlByLGZpbGU6SWEsZmxhdHRlbkVycm9yOlhuLGZsb2F0MzI6c2EsZmxvYXQ2NDpjYSxmb3JtYXRFcnJvcjpZbixmcm9tSlNPTlNjaGVtYTpsbSxmdW5jdGlvbjpldCxnZXRFcnJvck1hcDpjbSxnbG9iYWxSZWdpc3RyeTpjZSxndDprZSxndGU6aWUsZ3VpZDpEbyxoYXNoOmFhLGhleDpvYSxob3N0bmFtZTppYSxodHRwVXJsOkxvLGluY2x1ZGVzOkx0LGluc3RhbmNlb2Y6WmEsaW50Ond0LGludDMyOnVhLGludDY0Om1hLGludGVyc2VjdGlvbjptdCxpbnZlcnRDb2RlYzpPYSxpcHY0OlZvLGlwdjY6R28saXNvOmJvLGpzb246Q2Esand0Om5hLGtleW9mOmhhLGtzdWlkOkJvLGxhenk6VnIsbGVuZ3RoOml0LGxpdGVyYWw6cCxsb2NhbGVzOkppLGxvb3NlT2JqZWN0OlksbG9vc2VSZWNvcmQ6eWEsbG93ZXJjYXNlOkN0LGx0OnllLGx0ZTp1ZSxtYWM6S28sbWFwOmthLG1heExlbmd0aDpydCxtYXhTaXplOkxlLG1ldGE6RWEsbWltZTpGdCxtaW5MZW5ndGg6emUsbWluU2l6ZTpTZSxtdWx0aXBsZU9mOkVlLG5hbjpUYSxuYW5vaWQ6cW8sbmF0aXZlRW51bTp3YSxuZWdhdGl2ZTppcixuZXZlcjpaZSxub25uZWdhdGl2ZTphcixub25vcHRpb25hbDpDcixub25wb3NpdGl2ZTpvcixub3JtYWxpemU6SnQsbnVsbDp2bixudWxsYWJsZTpRZSxudWxsaXNoOnphLG51bWJlcjpULG9iamVjdDpmLG9wdGlvbmFsOnEsb3ZlcndyaXRlOl9lLHBhcnNlOnlvLHBhcnNlQXN5bmM6a28scGFydGlhbFJlY29yZDpiYSxwaXBlOkl0LHBvc2l0aXZlOnJyLHByZWZhdWx0OlJyLHByZXByb2Nlc3M6U24scHJldHRpZnlFcnJvcjp5aSxwcm9taXNlOlBhLHByb3BlcnR5OnNyLHJlYWRvbmx5OkhyLHJlY29yZDpQLHJlZmluZTpZcixyZWdleDpSdCxyZWdleGVzOlFuLHJlZ2lzdHJ5OnRyLHNhZmVEZWNvZGU6T28sc2FmZURlY29kZUFzeW5jOlBvLHNhZmVFbmNvZGU6am8sc2FmZUVuY29kZUFzeW5jOlVvLHNhZmVQYXJzZTpTbyxzYWZlUGFyc2VBc3luYzp3byxzZXQ6U2Esc2V0RXJyb3JNYXA6c20sc2l6ZTpudCxzbHVnaWZ5OlZ0LHN0YXJ0c1dpdGg6TXQsc3RyaWN0T2JqZWN0OiRhLHN0cmluZzptLHN0cmluZ0Zvcm1hdDpyYSxzdHJpbmdib29sOlJhLHN1Y2Nlc3M6eGEsc3VwZXJSZWZpbmU6UXIsc3ltYm9sOmZhLHRlbXBsYXRlTGl0ZXJhbDpVYSx0b0pTT05TY2hlbWE6aG8sdG9Mb3dlckNhc2U6V3QsdG9VcHBlckNhc2U6QnQsdHJhbnNmb3JtOmJuLHRyZWVpZnlFcnJvcjpiaSx0cmltOkh0LHR1cGxlOklyLHVpbnQzMjpsYSx1aW50NjQ6cGEsdWxpZDpIbyx1bmRlZmluZWQ6WWUsdW5pb246VSx1bmtub3duOkUsdXBwZXJjYXNlOkF0LHVybDpBbyx1dGlsOiRpLHV1aWQ6RW8sdXVpZHY0OlpvLHV1aWR2NjpSbyx1dWlkdjc6Q28sdm9pZDpnYSx4aWQ6V28seG9yOl9hfSxTeW1ib2wudG9TdHJpbmdUYWcse3ZhbHVlOiJNb2R1bGUifSkpLHB2PU9iamVjdC5mcmVlemUoT2JqZWN0LmRlZmluZVByb3BlcnR5KHtfX3Byb3RvX186bnVsbCwkYnJhbmQ6Z2ksJGlucHV0OldpLCRvdXRwdXQ6SGksTkVWRVI6ZmksVGltZVByZWNpc2lvbjpmbyxab2RBbnk6dnIsWm9kQXJyYXk6YnIsWm9kQmFzZTY0OmRuLFpvZEJhc2U2NFVSTDptbixab2RCaWdJbnQ6dXQsWm9kQmlnSW50Rm9ybWF0OmduLFpvZEJvb2xlYW46Y3QsWm9kQ0lEUnY0OnVuLFpvZENJRFJ2Njpsbixab2RDVUlEOnRuLFpvZENVSUQyOm5uLFpvZENhdGNoOkxyLFpvZENvZGVjOmZ0LFpvZEN1c3RvbTpndCxab2RDdXN0b21TdHJpbmdGb3JtYXQ6TWUsWm9kRGF0ZTokbixab2REZWZhdWx0OkRyLFpvZERpc2NyaW1pbmF0ZWRVbmlvbjprcixab2RFMTY0OnBuLFpvZEVtYWlsOll0LFpvZEVtb2ppOlF0LFpvZEVudW06Q2UsWm9kRXJyb3I6b20sWm9kRXhhY3RPcHRpb25hbDpVcixab2RGaWxlOmpyLGdldCBab2RGaXJzdFBhcnR5VHlwZUtpbmQoKXtyZXR1cm4gTW59LFpvZEZ1bmN0aW9uOkdyLFpvZEdVSUQ6WGUsWm9kSVB2NDpzbixab2RJUHY2OmNuLFpvZElTT0RhdGU6dXIsWm9kSVNPRGF0ZVRpbWU6Y3IsWm9kSVNPRHVyYXRpb246ZHIsWm9kSVNPVGltZTpscixab2RJbnRlcnNlY3Rpb246U3IsWm9kSXNzdWVDb2RlOmFtLFpvZEpXVDpmbixab2RLU1VJRDphbixab2RMYXp5OkJyLFpvZExpdGVyYWw6VHIsWm9kTUFDOm1yLFpvZE1hcDp6cixab2ROYU46cXIsWm9kTmFub0lEOmVuLFpvZE5ldmVyOiRyLFpvZE5vbk9wdGlvbmFsOmtuLFpvZE51bGw6Z3IsWm9kTnVsbGFibGU6TnIsWm9kTnVtYmVyOnN0LFpvZE51bWJlckZvcm1hdDpUZSxab2RPYmplY3Q6bHQsWm9kT3B0aW9uYWw6eW4sWm9kUGlwZTpwdCxab2RQcmVmYXVsdDpacixab2RQcmVwcm9jZXNzOkZyLFpvZFByb21pc2U6S3IsWm9kUmVhZG9ubHk6SnIsWm9kUmVhbEVycm9yOnNlLFpvZFJlY29yZDpSZSxab2RTZXQ6eHIsWm9kU3RyaW5nOm90LFpvZFN0cmluZ0Zvcm1hdDpBLFpvZFN1Y2Nlc3M6QXIsWm9kU3ltYm9sOnByLFpvZFRlbXBsYXRlTGl0ZXJhbDpXcixab2RUcmFuc2Zvcm06T3IsWm9kVHVwbGU6d3IsWm9kVHlwZTpqLFpvZFVMSUQ6cm4sWm9kVVJMOmF0LFpvZFVVSUQ6aGUsWm9kVW5kZWZpbmVkOmZyLFpvZFVuaW9uOmR0LFpvZFVua25vd246aHIsWm9kVm9pZDpfcixab2RYSUQ6b24sWm9kWG9yOnlyLF9ab2RTdHJpbmc6WHQsX2RlZmF1bHQ6RXIsX2Z1bmN0aW9uOmV0LGFueTpobixhcnJheTpJLGJhc2U2NDpRbyxiYXNlNjR1cmw6ZWEsYmlnaW50OmRhLGJvb2xlYW46WixjYXRjaDpNcixjaGVjazpOYSxjaWRydjQ6WG8sY2lkcnY2OllvLGNsb25lOmRlLGNvZGVjOmphLGNvZXJjZTpkbSxjb25maWc6Syxjb3JlOlFkLGN1aWQ6Rm8sY3VpZDI6Sm8sY3VzdG9tOlhyLGRhdGU6dmEsZGVjb2RlOnpvLGRlY29kZUFzeW5jOlRvLGRlZmF1bHQ6UnMsZGVzY3JpYmU6RGEsZGlzY3JpbWluYXRlZFVuaW9uOl9uLGUxNjQ6dGEsZW1haWw6Tm8sZW1vamk6TW8sZW5jb2RlOklvLGVuY29kZUFzeW5jOnhvLGVuZHNXaXRoOnF0LGVudW06USxleGFjdE9wdGlvbmFsOlByLGZpbGU6SWEsZmxhdHRlbkVycm9yOlhuLGZsb2F0MzI6c2EsZmxvYXQ2NDpjYSxmb3JtYXRFcnJvcjpZbixmcm9tSlNPTlNjaGVtYTpsbSxmdW5jdGlvbjpldCxnZXRFcnJvck1hcDpjbSxnbG9iYWxSZWdpc3RyeTpjZSxndDprZSxndGU6aWUsZ3VpZDpEbyxoYXNoOmFhLGhleDpvYSxob3N0bmFtZTppYSxodHRwVXJsOkxvLGluY2x1ZGVzOkx0LGluc3RhbmNlb2Y6WmEsaW50Ond0LGludDMyOnVhLGludDY0Om1hLGludGVyc2VjdGlvbjptdCxpbnZlcnRDb2RlYzpPYSxpcHY0OlZvLGlwdjY6R28saXNvOmJvLGpzb246Q2Esand0Om5hLGtleW9mOmhhLGtzdWlkOkJvLGxhenk6VnIsbGVuZ3RoOml0LGxpdGVyYWw6cCxsb2NhbGVzOkppLGxvb3NlT2JqZWN0OlksbG9vc2VSZWNvcmQ6eWEsbG93ZXJjYXNlOkN0LGx0OnllLGx0ZTp1ZSxtYWM6S28sbWFwOmthLG1heExlbmd0aDpydCxtYXhTaXplOkxlLG1ldGE6RWEsbWltZTpGdCxtaW5MZW5ndGg6emUsbWluU2l6ZTpTZSxtdWx0aXBsZU9mOkVlLG5hbjpUYSxuYW5vaWQ6cW8sbmF0aXZlRW51bTp3YSxuZWdhdGl2ZTppcixuZXZlcjpaZSxub25uZWdhdGl2ZTphcixub25vcHRpb25hbDpDcixub25wb3NpdGl2ZTpvcixub3JtYWxpemU6SnQsbnVsbDp2bixudWxsYWJsZTpRZSxudWxsaXNoOnphLG51bWJlcjpULG9iamVjdDpmLG9wdGlvbmFsOnEsb3ZlcndyaXRlOl9lLHBhcnNlOnlvLHBhcnNlQXN5bmM6a28scGFydGlhbFJlY29yZDpiYSxwaXBlOkl0LHBvc2l0aXZlOnJyLHByZWZhdWx0OlJyLHByZXByb2Nlc3M6U24scHJldHRpZnlFcnJvcjp5aSxwcm9taXNlOlBhLHByb3BlcnR5OnNyLHJlYWRvbmx5OkhyLHJlY29yZDpQLHJlZmluZTpZcixyZWdleDpSdCxyZWdleGVzOlFuLHJlZ2lzdHJ5OnRyLHNhZmVEZWNvZGU6T28sc2FmZURlY29kZUFzeW5jOlBvLHNhZmVFbmNvZGU6am8sc2FmZUVuY29kZUFzeW5jOlVvLHNhZmVQYXJzZTpTbyxzYWZlUGFyc2VBc3luYzp3byxzZXQ6U2Esc2V0RXJyb3JNYXA6c20sc2l6ZTpudCxzbHVnaWZ5OlZ0LHN0YXJ0c1dpdGg6TXQsc3RyaWN0T2JqZWN0OiRhLHN0cmluZzptLHN0cmluZ0Zvcm1hdDpyYSxzdHJpbmdib29sOlJhLHN1Y2Nlc3M6eGEsc3VwZXJSZWZpbmU6UXIsc3ltYm9sOmZhLHRlbXBsYXRlTGl0ZXJhbDpVYSx0b0pTT05TY2hlbWE6aG8sdG9Mb3dlckNhc2U6V3QsdG9VcHBlckNhc2U6QnQsdHJhbnNmb3JtOmJuLHRyZWVpZnlFcnJvcjpiaSx0cmltOkh0LHR1cGxlOklyLHVpbnQzMjpsYSx1aW50NjQ6cGEsdWxpZDpIbyx1bmRlZmluZWQ6WWUsdW5pb246VSx1bmtub3duOkUsdXBwZXJjYXNlOkF0LHVybDpBbyx1dGlsOiRpLHV1aWQ6RW8sdXVpZHY0OlpvLHV1aWR2NjpSbyx1dWlkdjc6Q28sdm9pZDpnYSx4aWQ6V28seG9yOl9hLHo6UnN9LFN5bWJvbC50b1N0cmluZ1RhZyx7dmFsdWU6Ik1vZHVsZSJ9KSksT2U9ImlvLm1vZGVsY29udGV4dHByb3RvY29sL3JlbGF0ZWQtdGFzayIsZWk9IjIuMCIsVj1Ycih0PT50IT09bnVsbCYmKHR5cGVvZiB0PT0ib2JqZWN0Inx8dHlwZW9mIHQ9PSJmdW5jdGlvbiIpKSxtbT1VKFttKCksVCgpLmludCgpXSkscG09bSgpO1koe3R0bDpUKCkub3B0aW9uYWwoKSxwb2xsSW50ZXJ2YWw6VCgpLm9wdGlvbmFsKCl9KTtjb25zdCBmdj1mKHt0dGw6VCgpLm9wdGlvbmFsKCl9KSxndj1mKHt0YXNrSWQ6bSgpfSksQWE9WSh7cHJvZ3Jlc3NUb2tlbjptbS5vcHRpb25hbCgpLFtPZV06Z3Yub3B0aW9uYWwoKX0pLHBlPWYoe19tZXRhOkFhLm9wdGlvbmFsKCl9KSx3bj1wZS5leHRlbmQoe3Rhc2s6ZnYub3B0aW9uYWwoKX0pLHZ2PXQ9PnduLnNhZmVQYXJzZSh0KS5zdWNjZXNzLGVlPWYoe21ldGhvZDptKCkscGFyYW1zOnBlLmxvb3NlKCkub3B0aW9uYWwoKX0pLGdlPWYoe19tZXRhOkFhLm9wdGlvbmFsKCl9KSx2ZT1mKHttZXRob2Q6bSgpLHBhcmFtczpnZS5sb29zZSgpLm9wdGlvbmFsKCl9KSx0ZT1ZKHtfbWV0YTpBYS5vcHRpb25hbCgpfSksSW49VShbbSgpLFQoKS5pbnQoKV0pLGZtPWYoe2pzb25ycGM6cChlaSksaWQ6SW4sLi4uZWUuc2hhcGV9KS5zdHJpY3QoKSxDcz10PT5mbS5zYWZlUGFyc2UodCkuc3VjY2VzcyxnbT1mKHtqc29ucnBjOnAoZWkpLC4uLnZlLnNoYXBlfSkuc3RyaWN0KCksaHY9dD0+Z20uc2FmZVBhcnNlKHQpLnN1Y2Nlc3MsTGE9Zih7anNvbnJwYzpwKGVpKSxpZDpJbixyZXN1bHQ6dGV9KS5zdHJpY3QoKSxabj10PT5MYS5zYWZlUGFyc2UodCkuc3VjY2Vzczt2YXIgUjsoZnVuY3Rpb24odCl7dFt0LkNvbm5lY3Rpb25DbG9zZWQ9LTMyZTNdPSJDb25uZWN0aW9uQ2xvc2VkIix0W3QuUmVxdWVzdFRpbWVvdXQ9LTMyMDAxXT0iUmVxdWVzdFRpbWVvdXQiLHRbdC5QYXJzZUVycm9yPS0zMjcwMF09IlBhcnNlRXJyb3IiLHRbdC5JbnZhbGlkUmVxdWVzdD0tMzI2MDBdPSJJbnZhbGlkUmVxdWVzdCIsdFt0Lk1ldGhvZE5vdEZvdW5kPS0zMjYwMV09Ik1ldGhvZE5vdEZvdW5kIix0W3QuSW52YWxpZFBhcmFtcz0tMzI2MDJdPSJJbnZhbGlkUGFyYW1zIix0W3QuSW50ZXJuYWxFcnJvcj0tMzI2MDNdPSJJbnRlcm5hbEVycm9yIix0W3QuVXJsRWxpY2l0YXRpb25SZXF1aXJlZD0tMzIwNDJdPSJVcmxFbGljaXRhdGlvblJlcXVpcmVkIn0pKFJ8fChSPXt9KSk7Y29uc3QgTWE9Zih7anNvbnJwYzpwKGVpKSxpZDpJbi5vcHRpb25hbCgpLGVycm9yOmYoe2NvZGU6VCgpLmludCgpLG1lc3NhZ2U6bSgpLGRhdGE6RSgpLm9wdGlvbmFsKCl9KX0pLnN0cmljdCgpLCR2PXQ9Pk1hLnNhZmVQYXJzZSh0KS5zdWNjZXNzLF92PVUoW2ZtLGdtLExhLE1hXSk7VShbTGEsTWFdKTtjb25zdCBxYT10ZS5zdHJpY3QoKSxidj1nZS5leHRlbmQoe3JlcXVlc3RJZDpJbi5vcHRpb25hbCgpLHJlYXNvbjptKCkub3B0aW9uYWwoKX0pLEZhPXZlLmV4dGVuZCh7bWV0aG9kOnAoIm5vdGlmaWNhdGlvbnMvY2FuY2VsbGVkIikscGFyYW1zOmJ2fSkseXY9Zih7c3JjOm0oKSxtaW1lVHlwZTptKCkub3B0aW9uYWwoKSxzaXplczpJKG0oKSkub3B0aW9uYWwoKSx0aGVtZTpRKFsibGlnaHQiLCJkYXJrIl0pLm9wdGlvbmFsKCl9KSx6bj1mKHtpY29uczpJKHl2KS5vcHRpb25hbCgpfSksdHQ9Zih7bmFtZTptKCksdGl0bGU6bSgpLm9wdGlvbmFsKCl9KSx0aT10dC5leHRlbmQoey4uLnR0LnNoYXBlLC4uLnpuLnNoYXBlLHZlcnNpb246bSgpLHdlYnNpdGVVcmw6bSgpLm9wdGlvbmFsKCksZGVzY3JpcHRpb246bSgpLm9wdGlvbmFsKCl9KSxrdj1tdChmKHthcHBseURlZmF1bHRzOlooKS5vcHRpb25hbCgpfSksUChtKCksRSgpKSksU3Y9U24odD0+dCYmdHlwZW9mIHQ9PSJvYmplY3QiJiYhQXJyYXkuaXNBcnJheSh0KSYmT2JqZWN0LmtleXModCkubGVuZ3RoPT09MD97Zm9ybTp7fX06dCxtdChmKHtmb3JtOmt2Lm9wdGlvbmFsKCksdXJsOlYub3B0aW9uYWwoKX0pLFAobSgpLEUoKSkub3B0aW9uYWwoKSkpLHd2PVkoe2xpc3Q6Vi5vcHRpb25hbCgpLGNhbmNlbDpWLm9wdGlvbmFsKCkscmVxdWVzdHM6WSh7c2FtcGxpbmc6WSh7Y3JlYXRlTWVzc2FnZTpWLm9wdGlvbmFsKCl9KS5vcHRpb25hbCgpLGVsaWNpdGF0aW9uOlkoe2NyZWF0ZTpWLm9wdGlvbmFsKCl9KS5vcHRpb25hbCgpfSkub3B0aW9uYWwoKX0pLEl2PVkoe2xpc3Q6Vi5vcHRpb25hbCgpLGNhbmNlbDpWLm9wdGlvbmFsKCkscmVxdWVzdHM6WSh7dG9vbHM6WSh7Y2FsbDpWLm9wdGlvbmFsKCl9KS5vcHRpb25hbCgpfSkub3B0aW9uYWwoKX0pLHp2PWYoe2V4cGVyaW1lbnRhbDpQKG0oKSxWKS5vcHRpb25hbCgpLHNhbXBsaW5nOmYoe2NvbnRleHQ6Vi5vcHRpb25hbCgpLHRvb2xzOlYub3B0aW9uYWwoKX0pLm9wdGlvbmFsKCksZWxpY2l0YXRpb246U3Yub3B0aW9uYWwoKSxyb290czpmKHtsaXN0Q2hhbmdlZDpaKCkub3B0aW9uYWwoKX0pLm9wdGlvbmFsKCksdGFza3M6d3Yub3B0aW9uYWwoKSxleHRlbnNpb25zOlAobSgpLFYpLm9wdGlvbmFsKCl9KSx4dj1wZS5leHRlbmQoe3Byb3RvY29sVmVyc2lvbjptKCksY2FwYWJpbGl0aWVzOnp2LGNsaWVudEluZm86dGl9KSxUdj1lZS5leHRlbmQoe21ldGhvZDpwKCJpbml0aWFsaXplIikscGFyYW1zOnh2fSksanY9Zih7ZXhwZXJpbWVudGFsOlAobSgpLFYpLm9wdGlvbmFsKCksbG9nZ2luZzpWLm9wdGlvbmFsKCksY29tcGxldGlvbnM6Vi5vcHRpb25hbCgpLHByb21wdHM6Zih7bGlzdENoYW5nZWQ6WigpLm9wdGlvbmFsKCl9KS5vcHRpb25hbCgpLHJlc291cmNlczpmKHtzdWJzY3JpYmU6WigpLm9wdGlvbmFsKCksbGlzdENoYW5nZWQ6WigpLm9wdGlvbmFsKCl9KS5vcHRpb25hbCgpLHRvb2xzOmYoe2xpc3RDaGFuZ2VkOlooKS5vcHRpb25hbCgpfSkub3B0aW9uYWwoKSx0YXNrczpJdi5vcHRpb25hbCgpLGV4dGVuc2lvbnM6UChtKCksVikub3B0aW9uYWwoKX0pLE92PXRlLmV4dGVuZCh7cHJvdG9jb2xWZXJzaW9uOm0oKSxjYXBhYmlsaXRpZXM6anYsc2VydmVySW5mbzp0aSxpbnN0cnVjdGlvbnM6bSgpLm9wdGlvbmFsKCl9KSxVdj12ZS5leHRlbmQoe21ldGhvZDpwKCJub3RpZmljYXRpb25zL2luaXRpYWxpemVkIikscGFyYW1zOmdlLm9wdGlvbmFsKCl9KSxuaT1lZS5leHRlbmQoe21ldGhvZDpwKCJwaW5nIikscGFyYW1zOnBlLm9wdGlvbmFsKCl9KSxQdj1mKHtwcm9ncmVzczpUKCksdG90YWw6cShUKCkpLG1lc3NhZ2U6cShtKCkpfSksTnY9Zih7Li4uZ2Uuc2hhcGUsLi4uUHYuc2hhcGUscHJvZ3Jlc3NUb2tlbjptbX0pLEphPXZlLmV4dGVuZCh7bWV0aG9kOnAoIm5vdGlmaWNhdGlvbnMvcHJvZ3Jlc3MiKSxwYXJhbXM6TnZ9KSxEdj1wZS5leHRlbmQoe2N1cnNvcjpwbS5vcHRpb25hbCgpfSkseG49ZWUuZXh0ZW5kKHtwYXJhbXM6RHYub3B0aW9uYWwoKX0pLFRuPXRlLmV4dGVuZCh7bmV4dEN1cnNvcjpwbS5vcHRpb25hbCgpfSksRXY9UShbIndvcmtpbmciLCJpbnB1dF9yZXF1aXJlZCIsImNvbXBsZXRlZCIsImZhaWxlZCIsImNhbmNlbGxlZCJdKSxqbj1mKHt0YXNrSWQ6bSgpLHN0YXR1czpFdix0dGw6VShbVCgpLHZuKCldKSxjcmVhdGVkQXQ6bSgpLGxhc3RVcGRhdGVkQXQ6bSgpLHBvbGxJbnRlcnZhbDpxKFQoKSksc3RhdHVzTWVzc2FnZTpxKG0oKSl9KSxIYT10ZS5leHRlbmQoe3Rhc2s6am59KSxadj1nZS5tZXJnZShqbikscW49dmUuZXh0ZW5kKHttZXRob2Q6cCgibm90aWZpY2F0aW9ucy90YXNrcy9zdGF0dXMiKSxwYXJhbXM6WnZ9KSxXYT1lZS5leHRlbmQoe21ldGhvZDpwKCJ0YXNrcy9nZXQiKSxwYXJhbXM6cGUuZXh0ZW5kKHt0YXNrSWQ6bSgpfSl9KSxCYT10ZS5tZXJnZShqbiksVmE9ZWUuZXh0ZW5kKHttZXRob2Q6cCgidGFza3MvcmVzdWx0IikscGFyYW1zOnBlLmV4dGVuZCh7dGFza0lkOm0oKX0pfSk7dGUubG9vc2UoKTtjb25zdCBLYT14bi5leHRlbmQoe21ldGhvZDpwKCJ0YXNrcy9saXN0Iil9KSxHYT1Ubi5leHRlbmQoe3Rhc2tzOkkoam4pfSksWGE9ZWUuZXh0ZW5kKHttZXRob2Q6cCgidGFza3MvY2FuY2VsIikscGFyYW1zOnBlLmV4dGVuZCh7dGFza0lkOm0oKX0pfSksUnY9dGUubWVyZ2Uoam4pLHZtPWYoe3VyaTptKCksbWltZVR5cGU6cShtKCkpLF9tZXRhOlAobSgpLEUoKSkub3B0aW9uYWwoKX0pLGhtPXZtLmV4dGVuZCh7dGV4dDptKCl9KSxZYT1tKCkucmVmaW5lKHQ9Pnt0cnl7cmV0dXJuIGF0b2IodCksITB9Y2F0Y2h7cmV0dXJuITF9fSx7bWVzc2FnZToiSW52YWxpZCBCYXNlNjQgc3RyaW5nIn0pLCRtPXZtLmV4dGVuZCh7YmxvYjpZYX0pLE9uPVEoWyJ1c2VyIiwiYXNzaXN0YW50Il0pLHZ0PWYoe2F1ZGllbmNlOkkoT24pLm9wdGlvbmFsKCkscHJpb3JpdHk6VCgpLm1pbigwKS5tYXgoMSkub3B0aW9uYWwoKSxsYXN0TW9kaWZpZWQ6X28oe29mZnNldDohMH0pLm9wdGlvbmFsKCl9KSxfbT1mKHsuLi50dC5zaGFwZSwuLi56bi5zaGFwZSx1cmk6bSgpLGRlc2NyaXB0aW9uOnEobSgpKSxtaW1lVHlwZTpxKG0oKSksc2l6ZTpxKFQoKSksYW5ub3RhdGlvbnM6dnQub3B0aW9uYWwoKSxfbWV0YTpxKFkoe30pKX0pLEN2PWYoey4uLnR0LnNoYXBlLC4uLnpuLnNoYXBlLHVyaVRlbXBsYXRlOm0oKSxkZXNjcmlwdGlvbjpxKG0oKSksbWltZVR5cGU6cShtKCkpLGFubm90YXRpb25zOnZ0Lm9wdGlvbmFsKCksX21ldGE6cShZKHt9KSl9KSxBdj14bi5leHRlbmQoe21ldGhvZDpwKCJyZXNvdXJjZXMvbGlzdCIpfSksYm09VG4uZXh0ZW5kKHtyZXNvdXJjZXM6SShfbSl9KSxMdj14bi5leHRlbmQoe21ldGhvZDpwKCJyZXNvdXJjZXMvdGVtcGxhdGVzL2xpc3QiKX0pLE12PVRuLmV4dGVuZCh7cmVzb3VyY2VUZW1wbGF0ZXM6SShDdil9KSxRYT1wZS5leHRlbmQoe3VyaTptKCl9KSxxdj1RYSxGdj1lZS5leHRlbmQoe21ldGhvZDpwKCJyZXNvdXJjZXMvcmVhZCIpLHBhcmFtczpxdn0pLHltPXRlLmV4dGVuZCh7Y29udGVudHM6SShVKFtobSwkbV0pKX0pLEp2PXZlLmV4dGVuZCh7bWV0aG9kOnAoIm5vdGlmaWNhdGlvbnMvcmVzb3VyY2VzL2xpc3RfY2hhbmdlZCIpLHBhcmFtczpnZS5vcHRpb25hbCgpfSksSHY9UWEsV3Y9ZWUuZXh0ZW5kKHttZXRob2Q6cCgicmVzb3VyY2VzL3N1YnNjcmliZSIpLHBhcmFtczpIdn0pLEJ2PVFhLFZ2PWVlLmV4dGVuZCh7bWV0aG9kOnAoInJlc291cmNlcy91bnN1YnNjcmliZSIpLHBhcmFtczpCdn0pLEt2PWdlLmV4dGVuZCh7dXJpOm0oKX0pLEd2PXZlLmV4dGVuZCh7bWV0aG9kOnAoIm5vdGlmaWNhdGlvbnMvcmVzb3VyY2VzL3VwZGF0ZWQiKSxwYXJhbXM6S3Z9KSxYdj1mKHtuYW1lOm0oKSxkZXNjcmlwdGlvbjpxKG0oKSkscmVxdWlyZWQ6cShaKCkpfSksWXY9Zih7Li4udHQuc2hhcGUsLi4uem4uc2hhcGUsZGVzY3JpcHRpb246cShtKCkpLGFyZ3VtZW50czpxKEkoWHYpKSxfbWV0YTpxKFkoe30pKX0pLFF2PXhuLmV4dGVuZCh7bWV0aG9kOnAoInByb21wdHMvbGlzdCIpfSksZWg9VG4uZXh0ZW5kKHtwcm9tcHRzOkkoWXYpfSksdGg9cGUuZXh0ZW5kKHtuYW1lOm0oKSxhcmd1bWVudHM6UChtKCksbSgpKS5vcHRpb25hbCgpfSksbmg9ZWUuZXh0ZW5kKHttZXRob2Q6cCgicHJvbXB0cy9nZXQiKSxwYXJhbXM6dGh9KSxlcz1mKHt0eXBlOnAoInRleHQiKSx0ZXh0Om0oKSxhbm5vdGF0aW9uczp2dC5vcHRpb25hbCgpLF9tZXRhOlAobSgpLEUoKSkub3B0aW9uYWwoKX0pLHRzPWYoe3R5cGU6cCgiaW1hZ2UiKSxkYXRhOllhLG1pbWVUeXBlOm0oKSxhbm5vdGF0aW9uczp2dC5vcHRpb25hbCgpLF9tZXRhOlAobSgpLEUoKSkub3B0aW9uYWwoKX0pLG5zPWYoe3R5cGU6cCgiYXVkaW8iKSxkYXRhOllhLG1pbWVUeXBlOm0oKSxhbm5vdGF0aW9uczp2dC5vcHRpb25hbCgpLF9tZXRhOlAobSgpLEUoKSkub3B0aW9uYWwoKX0pLHJoPWYoe3R5cGU6cCgidG9vbF91c2UiKSxuYW1lOm0oKSxpZDptKCksaW5wdXQ6UChtKCksRSgpKSxfbWV0YTpQKG0oKSxFKCkpLm9wdGlvbmFsKCl9KSxrbT1mKHt0eXBlOnAoInJlc291cmNlIikscmVzb3VyY2U6VShbaG0sJG1dKSxhbm5vdGF0aW9uczp2dC5vcHRpb25hbCgpLF9tZXRhOlAobSgpLEUoKSkub3B0aW9uYWwoKX0pLFNtPV9tLmV4dGVuZCh7dHlwZTpwKCJyZXNvdXJjZV9saW5rIil9KSxVbj1VKFtlcyx0cyxucyxTbSxrbV0pLGloPWYoe3JvbGU6T24sY29udGVudDpVbn0pLG9oPXRlLmV4dGVuZCh7ZGVzY3JpcHRpb246bSgpLm9wdGlvbmFsKCksbWVzc2FnZXM6SShpaCl9KSxhaD12ZS5leHRlbmQoe21ldGhvZDpwKCJub3RpZmljYXRpb25zL3Byb21wdHMvbGlzdF9jaGFuZ2VkIikscGFyYW1zOmdlLm9wdGlvbmFsKCl9KSxzaD1mKHt0aXRsZTptKCkub3B0aW9uYWwoKSxyZWFkT25seUhpbnQ6WigpLm9wdGlvbmFsKCksZGVzdHJ1Y3RpdmVIaW50OlooKS5vcHRpb25hbCgpLGlkZW1wb3RlbnRIaW50OlooKS5vcHRpb25hbCgpLG9wZW5Xb3JsZEhpbnQ6WigpLm9wdGlvbmFsKCl9KSxjaD1mKHt0YXNrU3VwcG9ydDpRKFsicmVxdWlyZWQiLCJvcHRpb25hbCIsImZvcmJpZGRlbiJdKS5vcHRpb25hbCgpfSkscnM9Zih7Li4udHQuc2hhcGUsLi4uem4uc2hhcGUsZGVzY3JpcHRpb246bSgpLm9wdGlvbmFsKCksaW5wdXRTY2hlbWE6Zih7dHlwZTpwKCJvYmplY3QiKSxwcm9wZXJ0aWVzOlAobSgpLFYpLm9wdGlvbmFsKCkscmVxdWlyZWQ6SShtKCkpLm9wdGlvbmFsKCl9KS5jYXRjaGFsbChFKCkpLG91dHB1dFNjaGVtYTpmKHt0eXBlOnAoIm9iamVjdCIpLHByb3BlcnRpZXM6UChtKCksVikub3B0aW9uYWwoKSxyZXF1aXJlZDpJKG0oKSkub3B0aW9uYWwoKX0pLmNhdGNoYWxsKEUoKSkub3B0aW9uYWwoKSxhbm5vdGF0aW9uczpzaC5vcHRpb25hbCgpLGV4ZWN1dGlvbjpjaC5vcHRpb25hbCgpLF9tZXRhOlAobSgpLEUoKSkub3B0aW9uYWwoKX0pLHdtPXhuLmV4dGVuZCh7bWV0aG9kOnAoInRvb2xzL2xpc3QiKX0pLHVoPVRuLmV4dGVuZCh7dG9vbHM6SShycyl9KSxyaT10ZS5leHRlbmQoe2NvbnRlbnQ6SShVbikuZGVmYXVsdChbXSksc3RydWN0dXJlZENvbnRlbnQ6UChtKCksRSgpKS5vcHRpb25hbCgpLGlzRXJyb3I6WigpLm9wdGlvbmFsKCl9KTtyaS5vcih0ZS5leHRlbmQoe3Rvb2xSZXN1bHQ6RSgpfSkpO2NvbnN0IGxoPXduLmV4dGVuZCh7bmFtZTptKCksYXJndW1lbnRzOlAobSgpLEUoKSkub3B0aW9uYWwoKX0pLEltPWVlLmV4dGVuZCh7bWV0aG9kOnAoInRvb2xzL2NhbGwiKSxwYXJhbXM6bGh9KSxkaD12ZS5leHRlbmQoe21ldGhvZDpwKCJub3RpZmljYXRpb25zL3Rvb2xzL2xpc3RfY2hhbmdlZCIpLHBhcmFtczpnZS5vcHRpb25hbCgpfSk7Zih7YXV0b1JlZnJlc2g6WigpLmRlZmF1bHQoITApLGRlYm91bmNlTXM6VCgpLmludCgpLm5vbm5lZ2F0aXZlKCkuZGVmYXVsdCgzMDApfSk7Y29uc3Qgem09UShbImRlYnVnIiwiaW5mbyIsIm5vdGljZSIsIndhcm5pbmciLCJlcnJvciIsImNyaXRpY2FsIiwiYWxlcnQiLCJlbWVyZ2VuY3kiXSksbWg9cGUuZXh0ZW5kKHtsZXZlbDp6bX0pLHBoPWVlLmV4dGVuZCh7bWV0aG9kOnAoImxvZ2dpbmcvc2V0TGV2ZWwiKSxwYXJhbXM6bWh9KSxmaD1nZS5leHRlbmQoe2xldmVsOnptLGxvZ2dlcjptKCkub3B0aW9uYWwoKSxkYXRhOkUoKX0pLGdoPXZlLmV4dGVuZCh7bWV0aG9kOnAoIm5vdGlmaWNhdGlvbnMvbWVzc2FnZSIpLHBhcmFtczpmaH0pLHZoPWYoe25hbWU6bSgpLm9wdGlvbmFsKCl9KSxoaD1mKHtoaW50czpJKHZoKS5vcHRpb25hbCgpLGNvc3RQcmlvcml0eTpUKCkubWluKDApLm1heCgxKS5vcHRpb25hbCgpLHNwZWVkUHJpb3JpdHk6VCgpLm1pbigwKS5tYXgoMSkub3B0aW9uYWwoKSxpbnRlbGxpZ2VuY2VQcmlvcml0eTpUKCkubWluKDApLm1heCgxKS5vcHRpb25hbCgpfSksJGg9Zih7bW9kZTpRKFsiYXV0byIsInJlcXVpcmVkIiwibm9uZSJdKS5vcHRpb25hbCgpfSksX2g9Zih7dHlwZTpwKCJ0b29sX3Jlc3VsdCIpLHRvb2xVc2VJZDptKCkuZGVzY3JpYmUoIlRoZSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgdG9vbCBjYWxsLiIpLGNvbnRlbnQ6SShVbikuZGVmYXVsdChbXSksc3RydWN0dXJlZENvbnRlbnQ6Zih7fSkubG9vc2UoKS5vcHRpb25hbCgpLGlzRXJyb3I6WigpLm9wdGlvbmFsKCksX21ldGE6UChtKCksRSgpKS5vcHRpb25hbCgpfSksYmg9X24oInR5cGUiLFtlcyx0cyxuc10pLEZuPV9uKCJ0eXBlIixbZXMsdHMsbnMscmgsX2hdKSx5aD1mKHtyb2xlOk9uLGNvbnRlbnQ6VShbRm4sSShGbildKSxfbWV0YTpQKG0oKSxFKCkpLm9wdGlvbmFsKCl9KSxraD13bi5leHRlbmQoe21lc3NhZ2VzOkkoeWgpLG1vZGVsUHJlZmVyZW5jZXM6aGgub3B0aW9uYWwoKSxzeXN0ZW1Qcm9tcHQ6bSgpLm9wdGlvbmFsKCksaW5jbHVkZUNvbnRleHQ6UShbIm5vbmUiLCJ0aGlzU2VydmVyIiwiYWxsU2VydmVycyJdKS5vcHRpb25hbCgpLHRlbXBlcmF0dXJlOlQoKS5vcHRpb25hbCgpLG1heFRva2VuczpUKCkuaW50KCksc3RvcFNlcXVlbmNlczpJKG0oKSkub3B0aW9uYWwoKSxtZXRhZGF0YTpWLm9wdGlvbmFsKCksdG9vbHM6SShycykub3B0aW9uYWwoKSx0b29sQ2hvaWNlOiRoLm9wdGlvbmFsKCl9KSxTaD1lZS5leHRlbmQoe21ldGhvZDpwKCJzYW1wbGluZy9jcmVhdGVNZXNzYWdlIikscGFyYW1zOmtofSkseG09dGUuZXh0ZW5kKHttb2RlbDptKCksc3RvcFJlYXNvbjpxKFEoWyJlbmRUdXJuIiwic3RvcFNlcXVlbmNlIiwibWF4VG9rZW5zIl0pLm9yKG0oKSkpLHJvbGU6T24sY29udGVudDpiaH0pLFRtPXRlLmV4dGVuZCh7bW9kZWw6bSgpLHN0b3BSZWFzb246cShRKFsiZW5kVHVybiIsInN0b3BTZXF1ZW5jZSIsIm1heFRva2VucyIsInRvb2xVc2UiXSkub3IobSgpKSkscm9sZTpPbixjb250ZW50OlUoW0ZuLEkoRm4pXSl9KSx3aD1mKHt0eXBlOnAoImJvb2xlYW4iKSx0aXRsZTptKCkub3B0aW9uYWwoKSxkZXNjcmlwdGlvbjptKCkub3B0aW9uYWwoKSxkZWZhdWx0OlooKS5vcHRpb25hbCgpfSksSWg9Zih7dHlwZTpwKCJzdHJpbmciKSx0aXRsZTptKCkub3B0aW9uYWwoKSxkZXNjcmlwdGlvbjptKCkub3B0aW9uYWwoKSxtaW5MZW5ndGg6VCgpLm9wdGlvbmFsKCksbWF4TGVuZ3RoOlQoKS5vcHRpb25hbCgpLGZvcm1hdDpRKFsiZW1haWwiLCJ1cmkiLCJkYXRlIiwiZGF0ZS10aW1lIl0pLm9wdGlvbmFsKCksZGVmYXVsdDptKCkub3B0aW9uYWwoKX0pLHpoPWYoe3R5cGU6UShbIm51bWJlciIsImludGVnZXIiXSksdGl0bGU6bSgpLm9wdGlvbmFsKCksZGVzY3JpcHRpb246bSgpLm9wdGlvbmFsKCksbWluaW11bTpUKCkub3B0aW9uYWwoKSxtYXhpbXVtOlQoKS5vcHRpb25hbCgpLGRlZmF1bHQ6VCgpLm9wdGlvbmFsKCl9KSx4aD1mKHt0eXBlOnAoInN0cmluZyIpLHRpdGxlOm0oKS5vcHRpb25hbCgpLGRlc2NyaXB0aW9uOm0oKS5vcHRpb25hbCgpLGVudW06SShtKCkpLGRlZmF1bHQ6bSgpLm9wdGlvbmFsKCl9KSxUaD1mKHt0eXBlOnAoInN0cmluZyIpLHRpdGxlOm0oKS5vcHRpb25hbCgpLGRlc2NyaXB0aW9uOm0oKS5vcHRpb25hbCgpLG9uZU9mOkkoZih7Y29uc3Q6bSgpLHRpdGxlOm0oKX0pKSxkZWZhdWx0Om0oKS5vcHRpb25hbCgpfSksamg9Zih7dHlwZTpwKCJzdHJpbmciKSx0aXRsZTptKCkub3B0aW9uYWwoKSxkZXNjcmlwdGlvbjptKCkub3B0aW9uYWwoKSxlbnVtOkkobSgpKSxlbnVtTmFtZXM6SShtKCkpLm9wdGlvbmFsKCksZGVmYXVsdDptKCkub3B0aW9uYWwoKX0pLE9oPVUoW3hoLFRoXSksVWg9Zih7dHlwZTpwKCJhcnJheSIpLHRpdGxlOm0oKS5vcHRpb25hbCgpLGRlc2NyaXB0aW9uOm0oKS5vcHRpb25hbCgpLG1pbkl0ZW1zOlQoKS5vcHRpb25hbCgpLG1heEl0ZW1zOlQoKS5vcHRpb25hbCgpLGl0ZW1zOmYoe3R5cGU6cCgic3RyaW5nIiksZW51bTpJKG0oKSl9KSxkZWZhdWx0OkkobSgpKS5vcHRpb25hbCgpfSksUGg9Zih7dHlwZTpwKCJhcnJheSIpLHRpdGxlOm0oKS5vcHRpb25hbCgpLGRlc2NyaXB0aW9uOm0oKS5vcHRpb25hbCgpLG1pbkl0ZW1zOlQoKS5vcHRpb25hbCgpLG1heEl0ZW1zOlQoKS5vcHRpb25hbCgpLGl0ZW1zOmYoe2FueU9mOkkoZih7Y29uc3Q6bSgpLHRpdGxlOm0oKX0pKX0pLGRlZmF1bHQ6SShtKCkpLm9wdGlvbmFsKCl9KSxOaD1VKFtVaCxQaF0pLERoPVUoW2poLE9oLE5oXSksRWg9VShbRGgsd2gsSWgsemhdKSxaaD13bi5leHRlbmQoe21vZGU6cCgiZm9ybSIpLm9wdGlvbmFsKCksbWVzc2FnZTptKCkscmVxdWVzdGVkU2NoZW1hOmYoe3R5cGU6cCgib2JqZWN0IikscHJvcGVydGllczpQKG0oKSxFaCkscmVxdWlyZWQ6SShtKCkpLm9wdGlvbmFsKCl9KX0pLFJoPXduLmV4dGVuZCh7bW9kZTpwKCJ1cmwiKSxtZXNzYWdlOm0oKSxlbGljaXRhdGlvbklkOm0oKSx1cmw6bSgpLnVybCgpfSksQ2g9VShbWmgsUmhdKSxBaD1lZS5leHRlbmQoe21ldGhvZDpwKCJlbGljaXRhdGlvbi9jcmVhdGUiKSxwYXJhbXM6Q2h9KSxMaD1nZS5leHRlbmQoe2VsaWNpdGF0aW9uSWQ6bSgpfSksTWg9dmUuZXh0ZW5kKHttZXRob2Q6cCgibm90aWZpY2F0aW9ucy9lbGljaXRhdGlvbi9jb21wbGV0ZSIpLHBhcmFtczpMaH0pLHFoPXRlLmV4dGVuZCh7YWN0aW9uOlEoWyJhY2NlcHQiLCJkZWNsaW5lIiwiY2FuY2VsIl0pLGNvbnRlbnQ6U24odD0+dD09PW51bGw/dm9pZCAwOnQsUChtKCksVShbbSgpLFQoKSxaKCksSShtKCkpXSkpLm9wdGlvbmFsKCkpfSksRmg9Zih7dHlwZTpwKCJyZWYvcmVzb3VyY2UiKSx1cmk6bSgpfSksSmg9Zih7dHlwZTpwKCJyZWYvcHJvbXB0IiksbmFtZTptKCl9KSxIaD1wZS5leHRlbmQoe3JlZjpVKFtKaCxGaF0pLGFyZ3VtZW50OmYoe25hbWU6bSgpLHZhbHVlOm0oKX0pLGNvbnRleHQ6Zih7YXJndW1lbnRzOlAobSgpLG0oKSkub3B0aW9uYWwoKX0pLm9wdGlvbmFsKCl9KSxXaD1lZS5leHRlbmQoe21ldGhvZDpwKCJjb21wbGV0aW9uL2NvbXBsZXRlIikscGFyYW1zOkhofSksQmg9dGUuZXh0ZW5kKHtjb21wbGV0aW9uOlkoe3ZhbHVlczpJKG0oKSkubWF4KDEwMCksdG90YWw6cShUKCkuaW50KCkpLGhhc01vcmU6cShaKCkpfSl9KSxWaD1mKHt1cmk6bSgpLnN0YXJ0c1dpdGgoImZpbGU6Ly8iKSxuYW1lOm0oKS5vcHRpb25hbCgpLF9tZXRhOlAobSgpLEUoKSkub3B0aW9uYWwoKX0pLEtoPWVlLmV4dGVuZCh7bWV0aG9kOnAoInJvb3RzL2xpc3QiKSxwYXJhbXM6cGUub3B0aW9uYWwoKX0pLEdoPXRlLmV4dGVuZCh7cm9vdHM6SShWaCl9KSxYaD12ZS5leHRlbmQoe21ldGhvZDpwKCJub3RpZmljYXRpb25zL3Jvb3RzL2xpc3RfY2hhbmdlZCIpLHBhcmFtczpnZS5vcHRpb25hbCgpfSk7VShbbmksVHYsV2gscGgsbmgsUXYsQXYsTHYsRnYsV3YsVnYsSW0sd20sV2EsVmEsS2EsWGFdKTtVKFtGYSxKYSxVdixYaCxxbl0pO1UoW3FhLHhtLFRtLHFoLEdoLEJhLEdhLEhhXSk7VShbbmksU2gsQWgsS2gsV2EsVmEsS2EsWGFdKTtVKFtGYSxKYSxnaCxHdixKdixkaCxhaCxxbixNaF0pO1UoW3FhLE92LEJoLG9oLGVoLGJtLE12LHltLHJpLHVoLEJhLEdhLEhhXSk7Y2xhc3MgRCBleHRlbmRzIEVycm9ye2NvbnN0cnVjdG9yKG4scixvKXtzdXBlcihgTUNQIGVycm9yICR7bn06ICR7cn1gKSx0aGlzLmNvZGU9bix0aGlzLmRhdGE9byx0aGlzLm5hbWU9Ik1jcEVycm9yIn1zdGF0aWMgZnJvbUVycm9yKG4scixvKXtpZihuPT09Ui5VcmxFbGljaXRhdGlvblJlcXVpcmVkJiZvKXtjb25zdCBlPW87aWYoZS5lbGljaXRhdGlvbnMpcmV0dXJuIG5ldyBZaChlLmVsaWNpdGF0aW9ucyxyKX1yZXR1cm4gbmV3IEQobixyLG8pfX1jbGFzcyBZaCBleHRlbmRzIER7Y29uc3RydWN0b3IobixyPWBVUkwgZWxpY2l0YXRpb24ke24ubGVuZ3RoPjE/InMiOiIifSByZXF1aXJlZGApe3N1cGVyKFIuVXJsRWxpY2l0YXRpb25SZXF1aXJlZCxyLHtlbGljaXRhdGlvbnM6bn0pfWdldCBlbGljaXRhdGlvbnMoKXtyZXR1cm4gdGhpcy5kYXRhPy5lbGljaXRhdGlvbnM/P1tdfX1mdW5jdGlvbiBqZSh0KXtyZXR1cm4gdD09PSJjb21wbGV0ZWQifHx0PT09ImZhaWxlZCJ8fHQ9PT0iY2FuY2VsbGVkIn1uZXcgU2V0KCJBQkNERUZHSElKS0xNTk9QUVJTVFVWWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnh5ejAxMjM0NTY3ODkiKTtmdW5jdGlvbiBBcyh0KXtjb25zdCByPXR2KHQpPy5tZXRob2Q7aWYoIXIpdGhyb3cgbmV3IEVycm9yKCJTY2hlbWEgaXMgbWlzc2luZyBhIG1ldGhvZCBsaXRlcmFsIik7Y29uc3Qgbz1udihyKTtpZih0eXBlb2YgbyE9InN0cmluZyIpdGhyb3cgbmV3IEVycm9yKCJTY2hlbWEgbWV0aG9kIGxpdGVyYWwgbXVzdCBiZSBhIHN0cmluZyIpO3JldHVybiBvfWZ1bmN0aW9uIExzKHQsbil7Y29uc3Qgcj1lbSh0LG4pO2lmKCFyLnN1Y2Nlc3MpdGhyb3cgci5lcnJvcjtyZXR1cm4gci5kYXRhfWNvbnN0IFFoPTZlNDtjbGFzcyBlJHtjb25zdHJ1Y3RvcihuKXt0aGlzLl9vcHRpb25zPW4sdGhpcy5fcmVxdWVzdE1lc3NhZ2VJZD0wLHRoaXMuX3JlcXVlc3RIYW5kbGVycz1uZXcgTWFwLHRoaXMuX3JlcXVlc3RIYW5kbGVyQWJvcnRDb250cm9sbGVycz1uZXcgTWFwLHRoaXMuX25vdGlmaWNhdGlvbkhhbmRsZXJzPW5ldyBNYXAsdGhpcy5fcmVzcG9uc2VIYW5kbGVycz1uZXcgTWFwLHRoaXMuX3Byb2dyZXNzSGFuZGxlcnM9bmV3IE1hcCx0aGlzLl90aW1lb3V0SW5mbz1uZXcgTWFwLHRoaXMuX3BlbmRpbmdEZWJvdW5jZWROb3RpZmljYXRpb25zPW5ldyBTZXQsdGhpcy5fdGFza1Byb2dyZXNzVG9rZW5zPW5ldyBNYXAsdGhpcy5fcmVxdWVzdFJlc29sdmVycz1uZXcgTWFwLHRoaXMuc2V0Tm90aWZpY2F0aW9uSGFuZGxlcihGYSxyPT57dGhpcy5fb25jYW5jZWwocil9KSx0aGlzLnNldE5vdGlmaWNhdGlvbkhhbmRsZXIoSmEscj0+e3RoaXMuX29ucHJvZ3Jlc3Mocil9KSx0aGlzLnNldFJlcXVlc3RIYW5kbGVyKG5pLHI9Pih7fSkpLHRoaXMuX3Rhc2tTdG9yZT1uPy50YXNrU3RvcmUsdGhpcy5fdGFza01lc3NhZ2VRdWV1ZT1uPy50YXNrTWVzc2FnZVF1ZXVlLHRoaXMuX3Rhc2tTdG9yZSYmKHRoaXMuc2V0UmVxdWVzdEhhbmRsZXIoV2EsYXN5bmMocixvKT0+e2NvbnN0IGU9YXdhaXQgdGhpcy5fdGFza1N0b3JlLmdldFRhc2soci5wYXJhbXMudGFza0lkLG8uc2Vzc2lvbklkKTtpZighZSl0aHJvdyBuZXcgRChSLkludmFsaWRQYXJhbXMsIkZhaWxlZCB0byByZXRyaWV2ZSB0YXNrOiBUYXNrIG5vdCBmb3VuZCIpO3JldHVybnsuLi5lfX0pLHRoaXMuc2V0UmVxdWVzdEhhbmRsZXIoVmEsYXN5bmMocixvKT0+e2NvbnN0IGU9YXN5bmMoKT0+e2NvbnN0IGk9ci5wYXJhbXMudGFza0lkO2lmKHRoaXMuX3Rhc2tNZXNzYWdlUXVldWUpe2xldCBzO2Zvcig7cz1hd2FpdCB0aGlzLl90YXNrTWVzc2FnZVF1ZXVlLmRlcXVldWUoaSxvLnNlc3Npb25JZCk7KXtpZihzLnR5cGU9PT0icmVzcG9uc2UifHxzLnR5cGU9PT0iZXJyb3IiKXtjb25zdCBjPXMubWVzc2FnZSx1PWMuaWQsbD10aGlzLl9yZXF1ZXN0UmVzb2x2ZXJzLmdldCh1KTtpZihsKWlmKHRoaXMuX3JlcXVlc3RSZXNvbHZlcnMuZGVsZXRlKHUpLHMudHlwZT09PSJyZXNwb25zZSIpbChjKTtlbHNle2NvbnN0IGc9Yyx2PW5ldyBEKGcuZXJyb3IuY29kZSxnLmVycm9yLm1lc3NhZ2UsZy5lcnJvci5kYXRhKTtsKHYpfWVsc2V7Y29uc3QgZz1zLnR5cGU9PT0icmVzcG9uc2UiPyJSZXNwb25zZSI6IkVycm9yIjt0aGlzLl9vbmVycm9yKG5ldyBFcnJvcihgJHtnfSBoYW5kbGVyIG1pc3NpbmcgZm9yIHJlcXVlc3QgJHt1fWApKX1jb250aW51ZX1hd2FpdCB0aGlzLl90cmFuc3BvcnQ/LnNlbmQocy5tZXNzYWdlLHtyZWxhdGVkUmVxdWVzdElkOm8ucmVxdWVzdElkfSl9fWNvbnN0IGE9YXdhaXQgdGhpcy5fdGFza1N0b3JlLmdldFRhc2soaSxvLnNlc3Npb25JZCk7aWYoIWEpdGhyb3cgbmV3IEQoUi5JbnZhbGlkUGFyYW1zLGBUYXNrIG5vdCBmb3VuZDogJHtpfWApO2lmKCFqZShhLnN0YXR1cykpcmV0dXJuIGF3YWl0IHRoaXMuX3dhaXRGb3JUYXNrVXBkYXRlKGksby5zaWduYWwpLGF3YWl0IGUoKTtpZihqZShhLnN0YXR1cykpe2NvbnN0IHM9YXdhaXQgdGhpcy5fdGFza1N0b3JlLmdldFRhc2tSZXN1bHQoaSxvLnNlc3Npb25JZCk7cmV0dXJuIHRoaXMuX2NsZWFyVGFza1F1ZXVlKGkpLHsuLi5zLF9tZXRhOnsuLi5zLl9tZXRhLFtPZV06e3Rhc2tJZDppfX19fXJldHVybiBhd2FpdCBlKCl9O3JldHVybiBhd2FpdCBlKCl9KSx0aGlzLnNldFJlcXVlc3RIYW5kbGVyKEthLGFzeW5jKHIsbyk9Pnt0cnl7Y29uc3R7dGFza3M6ZSxuZXh0Q3Vyc29yOml9PWF3YWl0IHRoaXMuX3Rhc2tTdG9yZS5saXN0VGFza3Moci5wYXJhbXM/LmN1cnNvcixvLnNlc3Npb25JZCk7cmV0dXJue3Rhc2tzOmUsbmV4dEN1cnNvcjppLF9tZXRhOnt9fX1jYXRjaChlKXt0aHJvdyBuZXcgRChSLkludmFsaWRQYXJhbXMsYEZhaWxlZCB0byBsaXN0IHRhc2tzOiAke2UgaW5zdGFuY2VvZiBFcnJvcj9lLm1lc3NhZ2U6U3RyaW5nKGUpfWApfX0pLHRoaXMuc2V0UmVxdWVzdEhhbmRsZXIoWGEsYXN5bmMocixvKT0+e3RyeXtjb25zdCBlPWF3YWl0IHRoaXMuX3Rhc2tTdG9yZS5nZXRUYXNrKHIucGFyYW1zLnRhc2tJZCxvLnNlc3Npb25JZCk7aWYoIWUpdGhyb3cgbmV3IEQoUi5JbnZhbGlkUGFyYW1zLGBUYXNrIG5vdCBmb3VuZDogJHtyLnBhcmFtcy50YXNrSWR9YCk7aWYoamUoZS5zdGF0dXMpKXRocm93IG5ldyBEKFIuSW52YWxpZFBhcmFtcyxgQ2Fubm90IGNhbmNlbCB0YXNrIGluIHRlcm1pbmFsIHN0YXR1czogJHtlLnN0YXR1c31gKTthd2FpdCB0aGlzLl90YXNrU3RvcmUudXBkYXRlVGFza1N0YXR1cyhyLnBhcmFtcy50YXNrSWQsImNhbmNlbGxlZCIsIkNsaWVudCBjYW5jZWxsZWQgdGFzayBleGVjdXRpb24uIixvLnNlc3Npb25JZCksdGhpcy5fY2xlYXJUYXNrUXVldWUoci5wYXJhbXMudGFza0lkKTtjb25zdCBpPWF3YWl0IHRoaXMuX3Rhc2tTdG9yZS5nZXRUYXNrKHIucGFyYW1zLnRhc2tJZCxvLnNlc3Npb25JZCk7aWYoIWkpdGhyb3cgbmV3IEQoUi5JbnZhbGlkUGFyYW1zLGBUYXNrIG5vdCBmb3VuZCBhZnRlciBjYW5jZWxsYXRpb246ICR7ci5wYXJhbXMudGFza0lkfWApO3JldHVybntfbWV0YTp7fSwuLi5pfX1jYXRjaChlKXt0aHJvdyBlIGluc3RhbmNlb2YgRD9lOm5ldyBEKFIuSW52YWxpZFJlcXVlc3QsYEZhaWxlZCB0byBjYW5jZWwgdGFzazogJHtlIGluc3RhbmNlb2YgRXJyb3I/ZS5tZXNzYWdlOlN0cmluZyhlKX1gKX19KSl9YXN5bmMgX29uY2FuY2VsKG4pe2lmKCFuLnBhcmFtcy5yZXF1ZXN0SWQpcmV0dXJuO3RoaXMuX3JlcXVlc3RIYW5kbGVyQWJvcnRDb250cm9sbGVycy5nZXQobi5wYXJhbXMucmVxdWVzdElkKT8uYWJvcnQobi5wYXJhbXMucmVhc29uKX1fc2V0dXBUaW1lb3V0KG4scixvLGUsaT0hMSl7dGhpcy5fdGltZW91dEluZm8uc2V0KG4se3RpbWVvdXRJZDpzZXRUaW1lb3V0KGUsciksc3RhcnRUaW1lOkRhdGUubm93KCksdGltZW91dDpyLG1heFRvdGFsVGltZW91dDpvLHJlc2V0VGltZW91dE9uUHJvZ3Jlc3M6aSxvblRpbWVvdXQ6ZX0pfV9yZXNldFRpbWVvdXQobil7Y29uc3Qgcj10aGlzLl90aW1lb3V0SW5mby5nZXQobik7aWYoIXIpcmV0dXJuITE7Y29uc3Qgbz1EYXRlLm5vdygpLXIuc3RhcnRUaW1lO2lmKHIubWF4VG90YWxUaW1lb3V0JiZvPj1yLm1heFRvdGFsVGltZW91dCl0aHJvdyB0aGlzLl90aW1lb3V0SW5mby5kZWxldGUobiksRC5mcm9tRXJyb3IoUi5SZXF1ZXN0VGltZW91dCwiTWF4aW11bSB0b3RhbCB0aW1lb3V0IGV4Y2VlZGVkIix7bWF4VG90YWxUaW1lb3V0OnIubWF4VG90YWxUaW1lb3V0LHRvdGFsRWxhcHNlZDpvfSk7cmV0dXJuIGNsZWFyVGltZW91dChyLnRpbWVvdXRJZCksci50aW1lb3V0SWQ9c2V0VGltZW91dChyLm9uVGltZW91dCxyLnRpbWVvdXQpLCEwfV9jbGVhbnVwVGltZW91dChuKXtjb25zdCByPXRoaXMuX3RpbWVvdXRJbmZvLmdldChuKTtyJiYoY2xlYXJUaW1lb3V0KHIudGltZW91dElkKSx0aGlzLl90aW1lb3V0SW5mby5kZWxldGUobikpfWFzeW5jIGNvbm5lY3Qobil7aWYodGhpcy5fdHJhbnNwb3J0KXRocm93IG5ldyBFcnJvcigiQWxyZWFkeSBjb25uZWN0ZWQgdG8gYSB0cmFuc3BvcnQuIENhbGwgY2xvc2UoKSBiZWZvcmUgY29ubmVjdGluZyB0byBhIG5ldyB0cmFuc3BvcnQsIG9yIHVzZSBhIHNlcGFyYXRlIFByb3RvY29sIGluc3RhbmNlIHBlciBjb25uZWN0aW9uLiIpO3RoaXMuX3RyYW5zcG9ydD1uO2NvbnN0IHI9dGhpcy50cmFuc3BvcnQ/Lm9uY2xvc2U7dGhpcy5fdHJhbnNwb3J0Lm9uY2xvc2U9KCk9PntyPy4oKSx0aGlzLl9vbmNsb3NlKCl9O2NvbnN0IG89dGhpcy50cmFuc3BvcnQ/Lm9uZXJyb3I7dGhpcy5fdHJhbnNwb3J0Lm9uZXJyb3I9aT0+e28/LihpKSx0aGlzLl9vbmVycm9yKGkpfTtjb25zdCBlPXRoaXMuX3RyYW5zcG9ydD8ub25tZXNzYWdlO3RoaXMuX3RyYW5zcG9ydC5vbm1lc3NhZ2U9KGksYSk9PntlPy4oaSxhKSxabihpKXx8JHYoaSk/dGhpcy5fb25yZXNwb25zZShpKTpDcyhpKT90aGlzLl9vbnJlcXVlc3QoaSxhKTpodihpKT90aGlzLl9vbm5vdGlmaWNhdGlvbihpKTp0aGlzLl9vbmVycm9yKG5ldyBFcnJvcihgVW5rbm93biBtZXNzYWdlIHR5cGU6ICR7SlNPTi5zdHJpbmdpZnkoaSl9YCkpfSxhd2FpdCB0aGlzLl90cmFuc3BvcnQuc3RhcnQoKX1fb25jbG9zZSgpe2NvbnN0IG49dGhpcy5fcmVzcG9uc2VIYW5kbGVyczt0aGlzLl9yZXNwb25zZUhhbmRsZXJzPW5ldyBNYXAsdGhpcy5fcHJvZ3Jlc3NIYW5kbGVycy5jbGVhcigpLHRoaXMuX3Rhc2tQcm9ncmVzc1Rva2Vucy5jbGVhcigpLHRoaXMuX3BlbmRpbmdEZWJvdW5jZWROb3RpZmljYXRpb25zLmNsZWFyKCk7Zm9yKGNvbnN0IG8gb2YgdGhpcy5fdGltZW91dEluZm8udmFsdWVzKCkpY2xlYXJUaW1lb3V0KG8udGltZW91dElkKTt0aGlzLl90aW1lb3V0SW5mby5jbGVhcigpO2Zvcihjb25zdCBvIG9mIHRoaXMuX3JlcXVlc3RIYW5kbGVyQWJvcnRDb250cm9sbGVycy52YWx1ZXMoKSlvLmFib3J0KCk7dGhpcy5fcmVxdWVzdEhhbmRsZXJBYm9ydENvbnRyb2xsZXJzLmNsZWFyKCk7Y29uc3Qgcj1ELmZyb21FcnJvcihSLkNvbm5lY3Rpb25DbG9zZWQsIkNvbm5lY3Rpb24gY2xvc2VkIik7dGhpcy5fdHJhbnNwb3J0PXZvaWQgMCx0aGlzLm9uY2xvc2U/LigpO2Zvcihjb25zdCBvIG9mIG4udmFsdWVzKCkpbyhyKX1fb25lcnJvcihuKXt0aGlzLm9uZXJyb3I/LihuKX1fb25ub3RpZmljYXRpb24obil7Y29uc3Qgcj10aGlzLl9ub3RpZmljYXRpb25IYW5kbGVycy5nZXQobi5tZXRob2QpPz90aGlzLmZhbGxiYWNrTm90aWZpY2F0aW9uSGFuZGxlcjtyIT09dm9pZCAwJiZQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT5yKG4pKS5jYXRjaChvPT50aGlzLl9vbmVycm9yKG5ldyBFcnJvcihgVW5jYXVnaHQgZXJyb3IgaW4gbm90aWZpY2F0aW9uIGhhbmRsZXI6ICR7b31gKSkpfV9vbnJlcXVlc3QobixyKXtjb25zdCBvPXRoaXMuX3JlcXVlc3RIYW5kbGVycy5nZXQobi5tZXRob2QpPz90aGlzLmZhbGxiYWNrUmVxdWVzdEhhbmRsZXIsZT10aGlzLl90cmFuc3BvcnQsaT1uLnBhcmFtcz8uX21ldGE/LltPZV0/LnRhc2tJZDtpZihvPT09dm9pZCAwKXtjb25zdCBsPXtqc29ucnBjOiIyLjAiLGlkOm4uaWQsZXJyb3I6e2NvZGU6Ui5NZXRob2ROb3RGb3VuZCxtZXNzYWdlOiJNZXRob2Qgbm90IGZvdW5kIn19O2kmJnRoaXMuX3Rhc2tNZXNzYWdlUXVldWU/dGhpcy5fZW5xdWV1ZVRhc2tNZXNzYWdlKGkse3R5cGU6ImVycm9yIixtZXNzYWdlOmwsdGltZXN0YW1wOkRhdGUubm93KCl9LGU/LnNlc3Npb25JZCkuY2F0Y2goZz0+dGhpcy5fb25lcnJvcihuZXcgRXJyb3IoYEZhaWxlZCB0byBlbnF1ZXVlIGVycm9yIHJlc3BvbnNlOiAke2d9YCkpKTplPy5zZW5kKGwpLmNhdGNoKGc9PnRoaXMuX29uZXJyb3IobmV3IEVycm9yKGBGYWlsZWQgdG8gc2VuZCBhbiBlcnJvciByZXNwb25zZTogJHtnfWApKSk7cmV0dXJufWNvbnN0IGE9bmV3IEFib3J0Q29udHJvbGxlcjt0aGlzLl9yZXF1ZXN0SGFuZGxlckFib3J0Q29udHJvbGxlcnMuc2V0KG4uaWQsYSk7Y29uc3Qgcz12dihuLnBhcmFtcyk/bi5wYXJhbXMudGFzazp2b2lkIDAsYz10aGlzLl90YXNrU3RvcmU/dGhpcy5yZXF1ZXN0VGFza1N0b3JlKG4sZT8uc2Vzc2lvbklkKTp2b2lkIDAsdT17c2lnbmFsOmEuc2lnbmFsLHNlc3Npb25JZDplPy5zZXNzaW9uSWQsX21ldGE6bi5wYXJhbXM/Ll9tZXRhLHNlbmROb3RpZmljYXRpb246YXN5bmMgbD0+e2lmKGEuc2lnbmFsLmFib3J0ZWQpcmV0dXJuO2NvbnN0IGc9e3JlbGF0ZWRSZXF1ZXN0SWQ6bi5pZH07aSYmKGcucmVsYXRlZFRhc2s9e3Rhc2tJZDppfSksYXdhaXQgdGhpcy5ub3RpZmljYXRpb24obCxnKX0sc2VuZFJlcXVlc3Q6YXN5bmMobCxnLHYpPT57aWYoYS5zaWduYWwuYWJvcnRlZCl0aHJvdyBuZXcgRChSLkNvbm5lY3Rpb25DbG9zZWQsIlJlcXVlc3Qgd2FzIGNhbmNlbGxlZCIpO2NvbnN0ICQ9ey4uLnYscmVsYXRlZFJlcXVlc3RJZDpuLmlkfTtpJiYhJC5yZWxhdGVkVGFzayYmKCQucmVsYXRlZFRhc2s9e3Rhc2tJZDppfSk7Y29uc3QgeT0kLnJlbGF0ZWRUYXNrPy50YXNrSWQ/P2k7cmV0dXJuIHkmJmMmJmF3YWl0IGMudXBkYXRlVGFza1N0YXR1cyh5LCJpbnB1dF9yZXF1aXJlZCIpLGF3YWl0IHRoaXMucmVxdWVzdChsLGcsJCl9LGF1dGhJbmZvOnI/LmF1dGhJbmZvLHJlcXVlc3RJZDpuLmlkLHJlcXVlc3RJbmZvOnI/LnJlcXVlc3RJbmZvLHRhc2tJZDppLHRhc2tTdG9yZTpjLHRhc2tSZXF1ZXN0ZWRUdGw6cz8udHRsLGNsb3NlU1NFU3RyZWFtOnI/LmNsb3NlU1NFU3RyZWFtLGNsb3NlU3RhbmRhbG9uZVNTRVN0cmVhbTpyPy5jbG9zZVN0YW5kYWxvbmVTU0VTdHJlYW19O1Byb21pc2UucmVzb2x2ZSgpLnRoZW4oKCk9PntzJiZ0aGlzLmFzc2VydFRhc2tIYW5kbGVyQ2FwYWJpbGl0eShuLm1ldGhvZCl9KS50aGVuKCgpPT5vKG4sdSkpLnRoZW4oYXN5bmMgbD0+e2lmKGEuc2lnbmFsLmFib3J0ZWQpcmV0dXJuO2NvbnN0IGc9e3Jlc3VsdDpsLGpzb25ycGM6IjIuMCIsaWQ6bi5pZH07aSYmdGhpcy5fdGFza01lc3NhZ2VRdWV1ZT9hd2FpdCB0aGlzLl9lbnF1ZXVlVGFza01lc3NhZ2UoaSx7dHlwZToicmVzcG9uc2UiLG1lc3NhZ2U6Zyx0aW1lc3RhbXA6RGF0ZS5ub3coKX0sZT8uc2Vzc2lvbklkKTphd2FpdCBlPy5zZW5kKGcpfSxhc3luYyBsPT57aWYoYS5zaWduYWwuYWJvcnRlZClyZXR1cm47Y29uc3QgZz17anNvbnJwYzoiMi4wIixpZDpuLmlkLGVycm9yOntjb2RlOk51bWJlci5pc1NhZmVJbnRlZ2VyKGwuY29kZSk/bC5jb2RlOlIuSW50ZXJuYWxFcnJvcixtZXNzYWdlOmwubWVzc2FnZT8/IkludGVybmFsIGVycm9yIiwuLi5sLmRhdGEhPT12b2lkIDAmJntkYXRhOmwuZGF0YX19fTtpJiZ0aGlzLl90YXNrTWVzc2FnZVF1ZXVlP2F3YWl0IHRoaXMuX2VucXVldWVUYXNrTWVzc2FnZShpLHt0eXBlOiJlcnJvciIsbWVzc2FnZTpnLHRpbWVzdGFtcDpEYXRlLm5vdygpfSxlPy5zZXNzaW9uSWQpOmF3YWl0IGU/LnNlbmQoZyl9KS5jYXRjaChsPT50aGlzLl9vbmVycm9yKG5ldyBFcnJvcihgRmFpbGVkIHRvIHNlbmQgcmVzcG9uc2U6ICR7bH1gKSkpLmZpbmFsbHkoKCk9Pnt0aGlzLl9yZXF1ZXN0SGFuZGxlckFib3J0Q29udHJvbGxlcnMuZ2V0KG4uaWQpPT09YSYmdGhpcy5fcmVxdWVzdEhhbmRsZXJBYm9ydENvbnRyb2xsZXJzLmRlbGV0ZShuLmlkKX0pfV9vbnByb2dyZXNzKG4pe2NvbnN0e3Byb2dyZXNzVG9rZW46ciwuLi5vfT1uLnBhcmFtcyxlPU51bWJlcihyKSxpPXRoaXMuX3Byb2dyZXNzSGFuZGxlcnMuZ2V0KGUpO2lmKCFpKXt0aGlzLl9vbmVycm9yKG5ldyBFcnJvcihgUmVjZWl2ZWQgYSBwcm9ncmVzcyBub3RpZmljYXRpb24gZm9yIGFuIHVua25vd24gdG9rZW46ICR7SlNPTi5zdHJpbmdpZnkobil9YCkpO3JldHVybn1jb25zdCBhPXRoaXMuX3Jlc3BvbnNlSGFuZGxlcnMuZ2V0KGUpLHM9dGhpcy5fdGltZW91dEluZm8uZ2V0KGUpO2lmKHMmJmEmJnMucmVzZXRUaW1lb3V0T25Qcm9ncmVzcyl0cnl7dGhpcy5fcmVzZXRUaW1lb3V0KGUpfWNhdGNoKGMpe3RoaXMuX3Jlc3BvbnNlSGFuZGxlcnMuZGVsZXRlKGUpLHRoaXMuX3Byb2dyZXNzSGFuZGxlcnMuZGVsZXRlKGUpLHRoaXMuX2NsZWFudXBUaW1lb3V0KGUpLGEoYyk7cmV0dXJufWkobyl9X29ucmVzcG9uc2Uobil7Y29uc3Qgcj1OdW1iZXIobi5pZCksbz10aGlzLl9yZXF1ZXN0UmVzb2x2ZXJzLmdldChyKTtpZihvKXtpZih0aGlzLl9yZXF1ZXN0UmVzb2x2ZXJzLmRlbGV0ZShyKSxabihuKSlvKG4pO2Vsc2V7Y29uc3QgYT1uZXcgRChuLmVycm9yLmNvZGUsbi5lcnJvci5tZXNzYWdlLG4uZXJyb3IuZGF0YSk7byhhKX1yZXR1cm59Y29uc3QgZT10aGlzLl9yZXNwb25zZUhhbmRsZXJzLmdldChyKTtpZihlPT09dm9pZCAwKXt0aGlzLl9vbmVycm9yKG5ldyBFcnJvcihgUmVjZWl2ZWQgYSByZXNwb25zZSBmb3IgYW4gdW5rbm93biBtZXNzYWdlIElEOiAke0pTT04uc3RyaW5naWZ5KG4pfWApKTtyZXR1cm59dGhpcy5fcmVzcG9uc2VIYW5kbGVycy5kZWxldGUociksdGhpcy5fY2xlYW51cFRpbWVvdXQocik7bGV0IGk9ITE7aWYoWm4obikmJm4ucmVzdWx0JiZ0eXBlb2Ygbi5yZXN1bHQ9PSJvYmplY3QiKXtjb25zdCBhPW4ucmVzdWx0O2lmKGEudGFzayYmdHlwZW9mIGEudGFzaz09Im9iamVjdCIpe2NvbnN0IHM9YS50YXNrO3R5cGVvZiBzLnRhc2tJZD09InN0cmluZyImJihpPSEwLHRoaXMuX3Rhc2tQcm9ncmVzc1Rva2Vucy5zZXQocy50YXNrSWQscikpfX1pZihpfHx0aGlzLl9wcm9ncmVzc0hhbmRsZXJzLmRlbGV0ZShyKSxabihuKSllKG4pO2Vsc2V7Y29uc3QgYT1ELmZyb21FcnJvcihuLmVycm9yLmNvZGUsbi5lcnJvci5tZXNzYWdlLG4uZXJyb3IuZGF0YSk7ZShhKX19Z2V0IHRyYW5zcG9ydCgpe3JldHVybiB0aGlzLl90cmFuc3BvcnR9YXN5bmMgY2xvc2UoKXthd2FpdCB0aGlzLl90cmFuc3BvcnQ/LmNsb3NlKCl9YXN5bmMqcmVxdWVzdFN0cmVhbShuLHIsbyl7Y29uc3R7dGFzazplfT1vPz97fTtpZighZSl7dHJ5e3lpZWxke3R5cGU6InJlc3VsdCIscmVzdWx0OmF3YWl0IHRoaXMucmVxdWVzdChuLHIsbyl9fWNhdGNoKGEpe3lpZWxke3R5cGU6ImVycm9yIixlcnJvcjphIGluc3RhbmNlb2YgRD9hOm5ldyBEKFIuSW50ZXJuYWxFcnJvcixTdHJpbmcoYSkpfX1yZXR1cm59bGV0IGk7dHJ5e2NvbnN0IGE9YXdhaXQgdGhpcy5yZXF1ZXN0KG4sSGEsbyk7aWYoYS50YXNrKWk9YS50YXNrLnRhc2tJZCx5aWVsZHt0eXBlOiJ0YXNrQ3JlYXRlZCIsdGFzazphLnRhc2t9O2Vsc2UgdGhyb3cgbmV3IEQoUi5JbnRlcm5hbEVycm9yLCJUYXNrIGNyZWF0aW9uIGRpZCBub3QgcmV0dXJuIGEgdGFzayIpO2Zvcig7Oyl7Y29uc3Qgcz1hd2FpdCB0aGlzLmdldFRhc2soe3Rhc2tJZDppfSxvKTtpZih5aWVsZHt0eXBlOiJ0YXNrU3RhdHVzIix0YXNrOnN9LGplKHMuc3RhdHVzKSl7cy5zdGF0dXM9PT0iY29tcGxldGVkIj95aWVsZHt0eXBlOiJyZXN1bHQiLHJlc3VsdDphd2FpdCB0aGlzLmdldFRhc2tSZXN1bHQoe3Rhc2tJZDppfSxyLG8pfTpzLnN0YXR1cz09PSJmYWlsZWQiP3lpZWxke3R5cGU6ImVycm9yIixlcnJvcjpuZXcgRChSLkludGVybmFsRXJyb3IsYFRhc2sgJHtpfSBmYWlsZWRgKX06cy5zdGF0dXM9PT0iY2FuY2VsbGVkIiYmKHlpZWxke3R5cGU6ImVycm9yIixlcnJvcjpuZXcgRChSLkludGVybmFsRXJyb3IsYFRhc2sgJHtpfSB3YXMgY2FuY2VsbGVkYCl9KTtyZXR1cm59aWYocy5zdGF0dXM9PT0iaW5wdXRfcmVxdWlyZWQiKXt5aWVsZHt0eXBlOiJyZXN1bHQiLHJlc3VsdDphd2FpdCB0aGlzLmdldFRhc2tSZXN1bHQoe3Rhc2tJZDppfSxyLG8pfTtyZXR1cm59Y29uc3QgYz1zLnBvbGxJbnRlcnZhbD8/dGhpcy5fb3B0aW9ucz8uZGVmYXVsdFRhc2tQb2xsSW50ZXJ2YWw/PzFlMzthd2FpdCBuZXcgUHJvbWlzZSh1PT5zZXRUaW1lb3V0KHUsYykpLG8/LnNpZ25hbD8udGhyb3dJZkFib3J0ZWQoKX19Y2F0Y2goYSl7eWllbGR7dHlwZToiZXJyb3IiLGVycm9yOmEgaW5zdGFuY2VvZiBEP2E6bmV3IEQoUi5JbnRlcm5hbEVycm9yLFN0cmluZyhhKSl9fX1yZXF1ZXN0KG4scixvKXtjb25zdHtyZWxhdGVkUmVxdWVzdElkOmUscmVzdW1wdGlvblRva2VuOmksb25yZXN1bXB0aW9udG9rZW46YSx0YXNrOnMscmVsYXRlZFRhc2s6Y309bz8/e307cmV0dXJuIG5ldyBQcm9taXNlKCh1LGwpPT57Y29uc3QgZz1HPT57bChHKX07aWYoIXRoaXMuX3RyYW5zcG9ydCl7ZyhuZXcgRXJyb3IoIk5vdCBjb25uZWN0ZWQiKSk7cmV0dXJufWlmKHRoaXMuX29wdGlvbnM/LmVuZm9yY2VTdHJpY3RDYXBhYmlsaXRpZXM9PT0hMCl0cnl7dGhpcy5hc3NlcnRDYXBhYmlsaXR5Rm9yTWV0aG9kKG4ubWV0aG9kKSxzJiZ0aGlzLmFzc2VydFRhc2tDYXBhYmlsaXR5KG4ubWV0aG9kKX1jYXRjaChHKXtnKEcpO3JldHVybn1vPy5zaWduYWw/LnRocm93SWZBYm9ydGVkKCk7Y29uc3Qgdj10aGlzLl9yZXF1ZXN0TWVzc2FnZUlkKyssJD17Li4ubixqc29ucnBjOiIyLjAiLGlkOnZ9O28/Lm9ucHJvZ3Jlc3MmJih0aGlzLl9wcm9ncmVzc0hhbmRsZXJzLnNldCh2LG8ub25wcm9ncmVzcyksJC5wYXJhbXM9ey4uLm4ucGFyYW1zLF9tZXRhOnsuLi5uLnBhcmFtcz8uX21ldGF8fHt9LHByb2dyZXNzVG9rZW46dn19KSxzJiYoJC5wYXJhbXM9ey4uLiQucGFyYW1zLHRhc2s6c30pLGMmJigkLnBhcmFtcz17Li4uJC5wYXJhbXMsX21ldGE6ey4uLiQucGFyYW1zPy5fbWV0YXx8e30sW09lXTpjfX0pO2NvbnN0IHk9Rz0+e3RoaXMuX3Jlc3BvbnNlSGFuZGxlcnMuZGVsZXRlKHYpLHRoaXMuX3Byb2dyZXNzSGFuZGxlcnMuZGVsZXRlKHYpLHRoaXMuX2NsZWFudXBUaW1lb3V0KHYpLHRoaXMuX3RyYW5zcG9ydD8uc2VuZCh7anNvbnJwYzoiMi4wIixtZXRob2Q6Im5vdGlmaWNhdGlvbnMvY2FuY2VsbGVkIixwYXJhbXM6e3JlcXVlc3RJZDp2LHJlYXNvbjpTdHJpbmcoRyl9fSx7cmVsYXRlZFJlcXVlc3RJZDplLHJlc3VtcHRpb25Ub2tlbjppLG9ucmVzdW1wdGlvbnRva2VuOmF9KS5jYXRjaChNPT50aGlzLl9vbmVycm9yKG5ldyBFcnJvcihgRmFpbGVkIHRvIHNlbmQgY2FuY2VsbGF0aW9uOiAke019YCkpKTtjb25zdCBXPUcgaW5zdGFuY2VvZiBEP0c6bmV3IEQoUi5SZXF1ZXN0VGltZW91dCxTdHJpbmcoRykpO2woVyl9O3RoaXMuX3Jlc3BvbnNlSGFuZGxlcnMuc2V0KHYsRz0+e2lmKCFvPy5zaWduYWw/LmFib3J0ZWQpe2lmKEcgaW5zdGFuY2VvZiBFcnJvcilyZXR1cm4gbChHKTt0cnl7Y29uc3QgVz1lbShyLEcucmVzdWx0KTtXLnN1Y2Nlc3M/dShXLmRhdGEpOmwoVy5lcnJvcil9Y2F0Y2goVyl7bChXKX19fSksbz8uc2lnbmFsPy5hZGRFdmVudExpc3RlbmVyKCJhYm9ydCIsKCk9Pnt5KG8/LnNpZ25hbD8ucmVhc29uKX0pO2NvbnN0IEg9bz8udGltZW91dD8/UWgsTD0oKT0+eShELmZyb21FcnJvcihSLlJlcXVlc3RUaW1lb3V0LCJSZXF1ZXN0IHRpbWVkIG91dCIse3RpbWVvdXQ6SH0pKTt0aGlzLl9zZXR1cFRpbWVvdXQodixILG8/Lm1heFRvdGFsVGltZW91dCxMLG8/LnJlc2V0VGltZW91dE9uUHJvZ3Jlc3M/PyExKTtjb25zdCBxZT1jPy50YXNrSWQ7aWYocWUpe2NvbnN0IEc9Vz0+e2NvbnN0IE09dGhpcy5fcmVzcG9uc2VIYW5kbGVycy5nZXQodik7TT9NKFcpOnRoaXMuX29uZXJyb3IobmV3IEVycm9yKGBSZXNwb25zZSBoYW5kbGVyIG1pc3NpbmcgZm9yIHNpZGUtY2hhbm5lbGVkIHJlcXVlc3QgJHt2fWApKX07dGhpcy5fcmVxdWVzdFJlc29sdmVycy5zZXQodixHKSx0aGlzLl9lbnF1ZXVlVGFza01lc3NhZ2UocWUse3R5cGU6InJlcXVlc3QiLG1lc3NhZ2U6JCx0aW1lc3RhbXA6RGF0ZS5ub3coKX0pLmNhdGNoKFc9Pnt0aGlzLl9jbGVhbnVwVGltZW91dCh2KSxsKFcpfSl9ZWxzZSB0aGlzLl90cmFuc3BvcnQuc2VuZCgkLHtyZWxhdGVkUmVxdWVzdElkOmUscmVzdW1wdGlvblRva2VuOmksb25yZXN1bXB0aW9udG9rZW46YX0pLmNhdGNoKEc9Pnt0aGlzLl9jbGVhbnVwVGltZW91dCh2KSxsKEcpfSl9KX1hc3luYyBnZXRUYXNrKG4scil7cmV0dXJuIHRoaXMucmVxdWVzdCh7bWV0aG9kOiJ0YXNrcy9nZXQiLHBhcmFtczpufSxCYSxyKX1hc3luYyBnZXRUYXNrUmVzdWx0KG4scixvKXtyZXR1cm4gdGhpcy5yZXF1ZXN0KHttZXRob2Q6InRhc2tzL3Jlc3VsdCIscGFyYW1zOm59LHIsbyl9YXN5bmMgbGlzdFRhc2tzKG4scil7cmV0dXJuIHRoaXMucmVxdWVzdCh7bWV0aG9kOiJ0YXNrcy9saXN0IixwYXJhbXM6bn0sR2Escil9YXN5bmMgY2FuY2VsVGFzayhuLHIpe3JldHVybiB0aGlzLnJlcXVlc3Qoe21ldGhvZDoidGFza3MvY2FuY2VsIixwYXJhbXM6bn0sUnYscil9YXN5bmMgbm90aWZpY2F0aW9uKG4scil7aWYoIXRoaXMuX3RyYW5zcG9ydCl0aHJvdyBuZXcgRXJyb3IoIk5vdCBjb25uZWN0ZWQiKTt0aGlzLmFzc2VydE5vdGlmaWNhdGlvbkNhcGFiaWxpdHkobi5tZXRob2QpO2NvbnN0IG89cj8ucmVsYXRlZFRhc2s/LnRhc2tJZDtpZihvKXtjb25zdCBzPXsuLi5uLGpzb25ycGM6IjIuMCIscGFyYW1zOnsuLi5uLnBhcmFtcyxfbWV0YTp7Li4ubi5wYXJhbXM/Ll9tZXRhfHx7fSxbT2VdOnIucmVsYXRlZFRhc2t9fX07YXdhaXQgdGhpcy5fZW5xdWV1ZVRhc2tNZXNzYWdlKG8se3R5cGU6Im5vdGlmaWNhdGlvbiIsbWVzc2FnZTpzLHRpbWVzdGFtcDpEYXRlLm5vdygpfSk7cmV0dXJufWlmKCh0aGlzLl9vcHRpb25zPy5kZWJvdW5jZWROb3RpZmljYXRpb25NZXRob2RzPz9bXSkuaW5jbHVkZXMobi5tZXRob2QpJiYhbi5wYXJhbXMmJiFyPy5yZWxhdGVkUmVxdWVzdElkJiYhcj8ucmVsYXRlZFRhc2spe2lmKHRoaXMuX3BlbmRpbmdEZWJvdW5jZWROb3RpZmljYXRpb25zLmhhcyhuLm1ldGhvZCkpcmV0dXJuO3RoaXMuX3BlbmRpbmdEZWJvdW5jZWROb3RpZmljYXRpb25zLmFkZChuLm1ldGhvZCksUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKT0+e2lmKHRoaXMuX3BlbmRpbmdEZWJvdW5jZWROb3RpZmljYXRpb25zLmRlbGV0ZShuLm1ldGhvZCksIXRoaXMuX3RyYW5zcG9ydClyZXR1cm47bGV0IHM9ey4uLm4sanNvbnJwYzoiMi4wIn07cj8ucmVsYXRlZFRhc2smJihzPXsuLi5zLHBhcmFtczp7Li4ucy5wYXJhbXMsX21ldGE6ey4uLnMucGFyYW1zPy5fbWV0YXx8e30sW09lXTpyLnJlbGF0ZWRUYXNrfX19KSx0aGlzLl90cmFuc3BvcnQ/LnNlbmQocyxyKS5jYXRjaChjPT50aGlzLl9vbmVycm9yKGMpKX0pO3JldHVybn1sZXQgYT17Li4ubixqc29ucnBjOiIyLjAifTtyPy5yZWxhdGVkVGFzayYmKGE9ey4uLmEscGFyYW1zOnsuLi5hLnBhcmFtcyxfbWV0YTp7Li4uYS5wYXJhbXM/Ll9tZXRhfHx7fSxbT2VdOnIucmVsYXRlZFRhc2t9fX0pLGF3YWl0IHRoaXMuX3RyYW5zcG9ydC5zZW5kKGEscil9c2V0UmVxdWVzdEhhbmRsZXIobixyKXtjb25zdCBvPUFzKG4pO3RoaXMuYXNzZXJ0UmVxdWVzdEhhbmRsZXJDYXBhYmlsaXR5KG8pLHRoaXMuX3JlcXVlc3RIYW5kbGVycy5zZXQobywoZSxpKT0+e2NvbnN0IGE9THMobixlKTtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHIoYSxpKSl9KX1yZW1vdmVSZXF1ZXN0SGFuZGxlcihuKXt0aGlzLl9yZXF1ZXN0SGFuZGxlcnMuZGVsZXRlKG4pfWFzc2VydENhblNldFJlcXVlc3RIYW5kbGVyKG4pe2lmKHRoaXMuX3JlcXVlc3RIYW5kbGVycy5oYXMobikpdGhyb3cgbmV3IEVycm9yKGBBIHJlcXVlc3QgaGFuZGxlciBmb3IgJHtufSBhbHJlYWR5IGV4aXN0cywgd2hpY2ggd291bGQgYmUgb3ZlcnJpZGRlbmApfXNldE5vdGlmaWNhdGlvbkhhbmRsZXIobixyKXtjb25zdCBvPUFzKG4pO3RoaXMuX25vdGlmaWNhdGlvbkhhbmRsZXJzLnNldChvLGU9Pntjb25zdCBpPUxzKG4sZSk7cmV0dXJuIFByb21pc2UucmVzb2x2ZShyKGkpKX0pfXJlbW92ZU5vdGlmaWNhdGlvbkhhbmRsZXIobil7dGhpcy5fbm90aWZpY2F0aW9uSGFuZGxlcnMuZGVsZXRlKG4pfV9jbGVhbnVwVGFza1Byb2dyZXNzSGFuZGxlcihuKXtjb25zdCByPXRoaXMuX3Rhc2tQcm9ncmVzc1Rva2Vucy5nZXQobik7ciE9PXZvaWQgMCYmKHRoaXMuX3Byb2dyZXNzSGFuZGxlcnMuZGVsZXRlKHIpLHRoaXMuX3Rhc2tQcm9ncmVzc1Rva2Vucy5kZWxldGUobikpfWFzeW5jIF9lbnF1ZXVlVGFza01lc3NhZ2UobixyLG8pe2lmKCF0aGlzLl90YXNrU3RvcmV8fCF0aGlzLl90YXNrTWVzc2FnZVF1ZXVlKXRocm93IG5ldyBFcnJvcigiQ2Fubm90IGVucXVldWUgdGFzayBtZXNzYWdlOiB0YXNrU3RvcmUgYW5kIHRhc2tNZXNzYWdlUXVldWUgYXJlIG5vdCBjb25maWd1cmVkIik7Y29uc3QgZT10aGlzLl9vcHRpb25zPy5tYXhUYXNrUXVldWVTaXplO2F3YWl0IHRoaXMuX3Rhc2tNZXNzYWdlUXVldWUuZW5xdWV1ZShuLHIsbyxlKX1hc3luYyBfY2xlYXJUYXNrUXVldWUobixyKXtpZih0aGlzLl90YXNrTWVzc2FnZVF1ZXVlKXtjb25zdCBvPWF3YWl0IHRoaXMuX3Rhc2tNZXNzYWdlUXVldWUuZGVxdWV1ZUFsbChuLHIpO2Zvcihjb25zdCBlIG9mIG8paWYoZS50eXBlPT09InJlcXVlc3QiJiZDcyhlLm1lc3NhZ2UpKXtjb25zdCBpPWUubWVzc2FnZS5pZCxhPXRoaXMuX3JlcXVlc3RSZXNvbHZlcnMuZ2V0KGkpO2E/KGEobmV3IEQoUi5JbnRlcm5hbEVycm9yLCJUYXNrIGNhbmNlbGxlZCBvciBjb21wbGV0ZWQiKSksdGhpcy5fcmVxdWVzdFJlc29sdmVycy5kZWxldGUoaSkpOnRoaXMuX29uZXJyb3IobmV3IEVycm9yKGBSZXNvbHZlciBtaXNzaW5nIGZvciByZXF1ZXN0ICR7aX0gZHVyaW5nIHRhc2sgJHtufSBjbGVhbnVwYCkpfX19YXN5bmMgX3dhaXRGb3JUYXNrVXBkYXRlKG4scil7bGV0IG89dGhpcy5fb3B0aW9ucz8uZGVmYXVsdFRhc2tQb2xsSW50ZXJ2YWw/PzFlMzt0cnl7Y29uc3QgZT1hd2FpdCB0aGlzLl90YXNrU3RvcmU/LmdldFRhc2sobik7ZT8ucG9sbEludGVydmFsJiYobz1lLnBvbGxJbnRlcnZhbCl9Y2F0Y2h7fXJldHVybiBuZXcgUHJvbWlzZSgoZSxpKT0+e2lmKHIuYWJvcnRlZCl7aShuZXcgRChSLkludmFsaWRSZXF1ZXN0LCJSZXF1ZXN0IGNhbmNlbGxlZCIpKTtyZXR1cm59Y29uc3QgYT1zZXRUaW1lb3V0KGUsbyk7ci5hZGRFdmVudExpc3RlbmVyKCJhYm9ydCIsKCk9PntjbGVhclRpbWVvdXQoYSksaShuZXcgRChSLkludmFsaWRSZXF1ZXN0LCJSZXF1ZXN0IGNhbmNlbGxlZCIpKX0se29uY2U6ITB9KX0pfXJlcXVlc3RUYXNrU3RvcmUobixyKXtjb25zdCBvPXRoaXMuX3Rhc2tTdG9yZTtpZighbyl0aHJvdyBuZXcgRXJyb3IoIk5vIHRhc2sgc3RvcmUgY29uZmlndXJlZCIpO3JldHVybntjcmVhdGVUYXNrOmFzeW5jIGU9PntpZighbil0aHJvdyBuZXcgRXJyb3IoIk5vIHJlcXVlc3QgcHJvdmlkZWQiKTtyZXR1cm4gYXdhaXQgby5jcmVhdGVUYXNrKGUsbi5pZCx7bWV0aG9kOm4ubWV0aG9kLHBhcmFtczpuLnBhcmFtc30scil9LGdldFRhc2s6YXN5bmMgZT0+e2NvbnN0IGk9YXdhaXQgby5nZXRUYXNrKGUscik7aWYoIWkpdGhyb3cgbmV3IEQoUi5JbnZhbGlkUGFyYW1zLCJGYWlsZWQgdG8gcmV0cmlldmUgdGFzazogVGFzayBub3QgZm91bmQiKTtyZXR1cm4gaX0sc3RvcmVUYXNrUmVzdWx0OmFzeW5jKGUsaSxhKT0+e2F3YWl0IG8uc3RvcmVUYXNrUmVzdWx0KGUsaSxhLHIpO2NvbnN0IHM9YXdhaXQgby5nZXRUYXNrKGUscik7aWYocyl7Y29uc3QgYz1xbi5wYXJzZSh7bWV0aG9kOiJub3RpZmljYXRpb25zL3Rhc2tzL3N0YXR1cyIscGFyYW1zOnN9KTthd2FpdCB0aGlzLm5vdGlmaWNhdGlvbihjKSxqZShzLnN0YXR1cykmJnRoaXMuX2NsZWFudXBUYXNrUHJvZ3Jlc3NIYW5kbGVyKGUpfX0sZ2V0VGFza1Jlc3VsdDplPT5vLmdldFRhc2tSZXN1bHQoZSxyKSx1cGRhdGVUYXNrU3RhdHVzOmFzeW5jKGUsaSxhKT0+e2NvbnN0IHM9YXdhaXQgby5nZXRUYXNrKGUscik7aWYoIXMpdGhyb3cgbmV3IEQoUi5JbnZhbGlkUGFyYW1zLGBUYXNrICIke2V9IiBub3QgZm91bmQgLSBpdCBtYXkgaGF2ZSBiZWVuIGNsZWFuZWQgdXBgKTtpZihqZShzLnN0YXR1cykpdGhyb3cgbmV3IEQoUi5JbnZhbGlkUGFyYW1zLGBDYW5ub3QgdXBkYXRlIHRhc2sgIiR7ZX0iIGZyb20gdGVybWluYWwgc3RhdHVzICIke3Muc3RhdHVzfSIgdG8gIiR7aX0iLiBUZXJtaW5hbCBzdGF0ZXMgKGNvbXBsZXRlZCwgZmFpbGVkLCBjYW5jZWxsZWQpIGNhbm5vdCB0cmFuc2l0aW9uIHRvIG90aGVyIHN0YXRlcy5gKTthd2FpdCBvLnVwZGF0ZVRhc2tTdGF0dXMoZSxpLGEscik7Y29uc3QgYz1hd2FpdCBvLmdldFRhc2soZSxyKTtpZihjKXtjb25zdCB1PXFuLnBhcnNlKHttZXRob2Q6Im5vdGlmaWNhdGlvbnMvdGFza3Mvc3RhdHVzIixwYXJhbXM6Y30pO2F3YWl0IHRoaXMubm90aWZpY2F0aW9uKHUpLGplKGMuc3RhdHVzKSYmdGhpcy5fY2xlYW51cFRhc2tQcm9ncmVzc0hhbmRsZXIoZSl9fSxsaXN0VGFza3M6ZT0+by5saXN0VGFza3MoZSxyKX19fWZ1bmN0aW9uIE1zKHQpe3JldHVybiB0IT09bnVsbCYmdHlwZW9mIHQ9PSJvYmplY3QiJiYhQXJyYXkuaXNBcnJheSh0KX1mdW5jdGlvbiB0JCh0LG4pe2NvbnN0IHI9ey4uLnR9O2Zvcihjb25zdCBvIGluIG4pe2NvbnN0IGU9byxpPW5bZV07aWYoaT09PXZvaWQgMCljb250aW51ZTtjb25zdCBhPXJbZV07TXMoYSkmJk1zKGkpP3JbZV09ey4uLmEsLi4uaX06cltlXT1pfXJldHVybiByfSh0PT50eXBlb2YgcmVxdWlyZTwidSI/cmVxdWlyZTp0eXBlb2YgUHJveHk8InUiP25ldyBQcm94eSh0LHtnZXQ6KG4scik9Pih0eXBlb2YgcmVxdWlyZTwidSI/cmVxdWlyZTpuKVtyXX0pOnQpKGZ1bmN0aW9uKHQpe2lmKHR5cGVvZiByZXF1aXJlPCJ1IilyZXR1cm4gcmVxdWlyZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhyb3cgRXJyb3IoJ0R5bmFtaWMgcmVxdWlyZSBvZiAiJyt0KyciIGlzIG5vdCBzdXBwb3J0ZWQnKX0pO2NsYXNzIG4kIGV4dGVuZHMgZSR7X3JlZ2lzdGVyZWRNZXRob2RzPW5ldyBTZXQ7X2V2ZW50U2xvdHM9bmV3IE1hcDtvbkV2ZW50RGlzcGF0Y2gobixyKXt9X2Vuc3VyZUV2ZW50U2xvdChuKXtsZXQgcj10aGlzLl9ldmVudFNsb3RzLmdldChuKTtpZighcil7bGV0IG89dGhpcy5ldmVudFNjaGVtYXNbbl07aWYoIW8pdGhyb3cgRXJyb3IoYFVua25vd24gZXZlbnQ6ICR7U3RyaW5nKG4pfWApO3I9e2xpc3RlbmVyczpbXX0sdGhpcy5fZXZlbnRTbG90cy5zZXQobixyKTtsZXQgZT1vLnNoYXBlLm1ldGhvZC52YWx1ZTt0aGlzLl9yZWdpc3RlcmVkTWV0aG9kcy5hZGQoZSk7bGV0IGk9cjtzdXBlci5zZXROb3RpZmljYXRpb25IYW5kbGVyKG8sYT0+e2xldCBzPWEucGFyYW1zO3RoaXMub25FdmVudERpc3BhdGNoKG4scyksaS5vbkhhbmRsZXI/LihzKTtmb3IobGV0IGMgb2ZbLi4uaS5saXN0ZW5lcnNdKWMocyl9KX1yZXR1cm4gcn1zZXRFdmVudEhhbmRsZXIobixyKXtsZXQgbz10aGlzLl9lbnN1cmVFdmVudFNsb3Qobik7by5vbkhhbmRsZXImJnImJmNvbnNvbGUud2FybihgW01DUCBBcHBzXSBvbiR7U3RyaW5nKG4pfSBoYW5kbGVyIHJlcGxhY2VkLiBVc2UgYWRkRXZlbnRMaXN0ZW5lcigiJHtTdHJpbmcobil9Iiwg4oCmKSB0byBhZGQgbXVsdGlwbGUgbGlzdGVuZXJzIHdpdGhvdXQgcmVwbGFjaW5nLmApLG8ub25IYW5kbGVyPXJ9Z2V0RXZlbnRIYW5kbGVyKG4pe3JldHVybiB0aGlzLl9ldmVudFNsb3RzLmdldChuKT8ub25IYW5kbGVyfWFkZEV2ZW50TGlzdGVuZXIobixyKXt0aGlzLl9lbnN1cmVFdmVudFNsb3QobikubGlzdGVuZXJzLnB1c2gocil9cmVtb3ZlRXZlbnRMaXN0ZW5lcihuLHIpe2xldCBvPXRoaXMuX2V2ZW50U2xvdHMuZ2V0KG4pO2lmKCFvKXJldHVybjtsZXQgZT1vLmxpc3RlbmVycy5pbmRleE9mKHIpO2UhPT0tMSYmby5saXN0ZW5lcnMuc3BsaWNlKGUsMSl9c2V0UmVxdWVzdEhhbmRsZXI9KG4scik9Pnt0aGlzLl9hc3NlcnRNZXRob2ROb3RSZWdpc3RlcmVkKG4sInNldFJlcXVlc3RIYW5kbGVyIiksc3VwZXIuc2V0UmVxdWVzdEhhbmRsZXIobixyKX07c2V0Tm90aWZpY2F0aW9uSGFuZGxlcj0obixyKT0+e3RoaXMuX2Fzc2VydE1ldGhvZE5vdFJlZ2lzdGVyZWQobiwic2V0Tm90aWZpY2F0aW9uSGFuZGxlciIpLHN1cGVyLnNldE5vdGlmaWNhdGlvbkhhbmRsZXIobixyKX07d2FybklmUmVxdWVzdEhhbmRsZXJSZXBsYWNlZChuLHIsbyl7ciYmbyYmY29uc29sZS53YXJuKGBbTUNQIEFwcHNdICR7bn0gaGFuZGxlciByZXBsYWNlZC4gUHJldmlvdXMgaGFuZGxlciB3aWxsIG5vIGxvbmdlciBiZSBjYWxsZWQuYCl9cmVwbGFjZVJlcXVlc3RIYW5kbGVyPShuLHIpPT57bGV0IG89bi5zaGFwZS5tZXRob2QudmFsdWU7dGhpcy5fcmVnaXN0ZXJlZE1ldGhvZHMuYWRkKG8pLHN1cGVyLnNldFJlcXVlc3RIYW5kbGVyKG4scil9O19hc3NlcnRNZXRob2ROb3RSZWdpc3RlcmVkKG4scil7bGV0IG89bi5zaGFwZS5tZXRob2QudmFsdWU7aWYodGhpcy5fcmVnaXN0ZXJlZE1ldGhvZHMuaGFzKG8pKXRocm93IEVycm9yKGBIYW5kbGVyIGZvciAiJHtvfSIgYWxyZWFkeSByZWdpc3RlcmVkICh2aWEgJHtyfSkuIFVzZSBhZGRFdmVudExpc3RlbmVyKCkgdG8gYXR0YWNoIG11bHRpcGxlIGxpc3RlbmVycywgb3IgdGhlIG9uKiBzZXR0ZXIgZm9yIHJlcGxhY2Ugc2VtYW50aWNzLmApO3RoaXMuX3JlZ2lzdGVyZWRNZXRob2RzLmFkZChvKX19dmFyIHIkPSIyMDI2LTAxLTI2IixpJD0idWkvbm90aWZpY2F0aW9ucy90b29sLWlucHV0LXBhcnRpYWwiO2NsYXNzIG8ke2V2ZW50VGFyZ2V0O2V2ZW50U291cmNlO21lc3NhZ2VMaXN0ZW5lcjtjb25zdHJ1Y3RvcihuPXdpbmRvdy5wYXJlbnQscil7dGhpcy5ldmVudFRhcmdldD1uLHRoaXMuZXZlbnRTb3VyY2U9cix0aGlzLm1lc3NhZ2VMaXN0ZW5lcj1vPT57aWYociYmby5zb3VyY2UhPT10aGlzLmV2ZW50U291cmNlKXtjb25zb2xlLmRlYnVnKCJJZ25vcmluZyBtZXNzYWdlIGZyb20gdW5rbm93biBzb3VyY2UiLG8pO3JldHVybn1sZXQgZT1fdi5zYWZlUGFyc2Uoby5kYXRhKTtlLnN1Y2Nlc3M/KGNvbnNvbGUuZGVidWcoIlBhcnNlZCBtZXNzYWdlIixlLmRhdGEpLHRoaXMub25tZXNzYWdlPy4oZS5kYXRhKSk6by5kYXRhPy5qc29ucnBjIT09IjIuMCI/Y29uc29sZS5kZWJ1ZygiSWdub3Jpbmcgbm9uLUpTT04tUlBDIG1lc3NhZ2UiLGUuZXJyb3IubWVzc2FnZSxvKTooY29uc29sZS5lcnJvcigiRmFpbGVkIHRvIHBhcnNlIG1lc3NhZ2UiLGUuZXJyb3IubWVzc2FnZSxvKSx0aGlzLm9uZXJyb3I/LihFcnJvcigiSW52YWxpZCBKU09OLVJQQyBtZXNzYWdlIHJlY2VpdmVkOiAiK2UuZXJyb3IubWVzc2FnZSkpKX19YXN5bmMgc3RhcnQoKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsdGhpcy5tZXNzYWdlTGlzdGVuZXIpfWFzeW5jIHNlbmQobixyKXtuLm1ldGhvZCE9PWkkJiZjb25zb2xlLmRlYnVnKCJTZW5kaW5nIG1lc3NhZ2UiLG4pLHRoaXMuZXZlbnRUYXJnZXQucG9zdE1lc3NhZ2UobiwiKiIpfWFzeW5jIGNsb3NlKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMubWVzc2FnZUxpc3RlbmVyKSx0aGlzLm9uY2xvc2U/LigpfW9uY2xvc2U7b25lcnJvcjtvbm1lc3NhZ2U7c2Vzc2lvbklkO3NldFByb3RvY29sVmVyc2lvbn12YXIgYSQ9VShbcCgibGlnaHQiKSxwKCJkYXJrIildKS5kZXNjcmliZSgiQ29sb3IgdGhlbWUgcHJlZmVyZW5jZSBmb3IgdGhlIGhvc3QgZW52aXJvbm1lbnQuIiksenQ9VShbcCgiaW5saW5lIikscCgiZnVsbHNjcmVlbiIpLHAoInBpcCIpXSkuZGVzY3JpYmUoIkRpc3BsYXkgbW9kZSBmb3IgVUkgcHJlc2VudGF0aW9uLiIpLHMkPVUoW3AoIi0tY29sb3ItYmFja2dyb3VuZC1wcmltYXJ5IikscCgiLS1jb2xvci1iYWNrZ3JvdW5kLXNlY29uZGFyeSIpLHAoIi0tY29sb3ItYmFja2dyb3VuZC10ZXJ0aWFyeSIpLHAoIi0tY29sb3ItYmFja2dyb3VuZC1pbnZlcnNlIikscCgiLS1jb2xvci1iYWNrZ3JvdW5kLWdob3N0IikscCgiLS1jb2xvci1iYWNrZ3JvdW5kLWluZm8iKSxwKCItLWNvbG9yLWJhY2tncm91bmQtZGFuZ2VyIikscCgiLS1jb2xvci1iYWNrZ3JvdW5kLXN1Y2Nlc3MiKSxwKCItLWNvbG9yLWJhY2tncm91bmQtd2FybmluZyIpLHAoIi0tY29sb3ItYmFja2dyb3VuZC1kaXNhYmxlZCIpLHAoIi0tY29sb3ItdGV4dC1wcmltYXJ5IikscCgiLS1jb2xvci10ZXh0LXNlY29uZGFyeSIpLHAoIi0tY29sb3ItdGV4dC10ZXJ0aWFyeSIpLHAoIi0tY29sb3ItdGV4dC1pbnZlcnNlIikscCgiLS1jb2xvci10ZXh0LWdob3N0IikscCgiLS1jb2xvci10ZXh0LWluZm8iKSxwKCItLWNvbG9yLXRleHQtZGFuZ2VyIikscCgiLS1jb2xvci10ZXh0LXN1Y2Nlc3MiKSxwKCItLWNvbG9yLXRleHQtd2FybmluZyIpLHAoIi0tY29sb3ItdGV4dC1kaXNhYmxlZCIpLHAoIi0tY29sb3ItYm9yZGVyLXByaW1hcnkiKSxwKCItLWNvbG9yLWJvcmRlci1zZWNvbmRhcnkiKSxwKCItLWNvbG9yLWJvcmRlci10ZXJ0aWFyeSIpLHAoIi0tY29sb3ItYm9yZGVyLWludmVyc2UiKSxwKCItLWNvbG9yLWJvcmRlci1naG9zdCIpLHAoIi0tY29sb3ItYm9yZGVyLWluZm8iKSxwKCItLWNvbG9yLWJvcmRlci1kYW5nZXIiKSxwKCItLWNvbG9yLWJvcmRlci1zdWNjZXNzIikscCgiLS1jb2xvci1ib3JkZXItd2FybmluZyIpLHAoIi0tY29sb3ItYm9yZGVyLWRpc2FibGVkIikscCgiLS1jb2xvci1yaW5nLXByaW1hcnkiKSxwKCItLWNvbG9yLXJpbmctc2Vjb25kYXJ5IikscCgiLS1jb2xvci1yaW5nLWludmVyc2UiKSxwKCItLWNvbG9yLXJpbmctaW5mbyIpLHAoIi0tY29sb3ItcmluZy1kYW5nZXIiKSxwKCItLWNvbG9yLXJpbmctc3VjY2VzcyIpLHAoIi0tY29sb3ItcmluZy13YXJuaW5nIikscCgiLS1mb250LXNhbnMiKSxwKCItLWZvbnQtbW9ubyIpLHAoIi0tZm9udC13ZWlnaHQtbm9ybWFsIikscCgiLS1mb250LXdlaWdodC1tZWRpdW0iKSxwKCItLWZvbnQtd2VpZ2h0LXNlbWlib2xkIikscCgiLS1mb250LXdlaWdodC1ib2xkIikscCgiLS1mb250LXRleHQteHMtc2l6ZSIpLHAoIi0tZm9udC10ZXh0LXNtLXNpemUiKSxwKCItLWZvbnQtdGV4dC1tZC1zaXplIikscCgiLS1mb250LXRleHQtbGctc2l6ZSIpLHAoIi0tZm9udC1oZWFkaW5nLXhzLXNpemUiKSxwKCItLWZvbnQtaGVhZGluZy1zbS1zaXplIikscCgiLS1mb250LWhlYWRpbmctbWQtc2l6ZSIpLHAoIi0tZm9udC1oZWFkaW5nLWxnLXNpemUiKSxwKCItLWZvbnQtaGVhZGluZy14bC1zaXplIikscCgiLS1mb250LWhlYWRpbmctMnhsLXNpemUiKSxwKCItLWZvbnQtaGVhZGluZy0zeGwtc2l6ZSIpLHAoIi0tZm9udC10ZXh0LXhzLWxpbmUtaGVpZ2h0IikscCgiLS1mb250LXRleHQtc20tbGluZS1oZWlnaHQiKSxwKCItLWZvbnQtdGV4dC1tZC1saW5lLWhlaWdodCIpLHAoIi0tZm9udC10ZXh0LWxnLWxpbmUtaGVpZ2h0IikscCgiLS1mb250LWhlYWRpbmcteHMtbGluZS1oZWlnaHQiKSxwKCItLWZvbnQtaGVhZGluZy1zbS1saW5lLWhlaWdodCIpLHAoIi0tZm9udC1oZWFkaW5nLW1kLWxpbmUtaGVpZ2h0IikscCgiLS1mb250LWhlYWRpbmctbGctbGluZS1oZWlnaHQiKSxwKCItLWZvbnQtaGVhZGluZy14bC1saW5lLWhlaWdodCIpLHAoIi0tZm9udC1oZWFkaW5nLTJ4bC1saW5lLWhlaWdodCIpLHAoIi0tZm9udC1oZWFkaW5nLTN4bC1saW5lLWhlaWdodCIpLHAoIi0tYm9yZGVyLXJhZGl1cy14cyIpLHAoIi0tYm9yZGVyLXJhZGl1cy1zbSIpLHAoIi0tYm9yZGVyLXJhZGl1cy1tZCIpLHAoIi0tYm9yZGVyLXJhZGl1cy1sZyIpLHAoIi0tYm9yZGVyLXJhZGl1cy14bCIpLHAoIi0tYm9yZGVyLXJhZGl1cy1mdWxsIikscCgiLS1ib3JkZXItd2lkdGgtcmVndWxhciIpLHAoIi0tc2hhZG93LWhhaXJsaW5lIikscCgiLS1zaGFkb3ctc20iKSxwKCItLXNoYWRvdy1tZCIpLHAoIi0tc2hhZG93LWxnIildKS5kZXNjcmliZSgiQ1NTIHZhcmlhYmxlIGtleXMgYXZhaWxhYmxlIHRvIE1DUCBhcHBzIGZvciB0aGVtaW5nLiIpLGMkPVAocyQuZGVzY3JpYmUoYFN0eWxlIHZhcmlhYmxlcyBmb3IgdGhlbWluZyBNQ1AgYXBwcy4KCkluZGl2aWR1YWwgc3R5bGUga2V5cyBhcmUgb3B0aW9uYWwgLSBob3N0cyBtYXkgcHJvdmlkZSBhbnkgc3Vic2V0IG9mIHRoZXNlIHZhbHVlcy4KVmFsdWVzIGFyZSBzdHJpbmdzIGNvbnRhaW5pbmcgQ1NTIHZhbHVlcyAoY29sb3JzLCBzaXplcywgZm9udCBzdGFja3MsIGV0Yy4pLgoKTm90ZTogVGhpcyB0eXBlIHVzZXMgXGBSZWNvcmQ8Sywgc3RyaW5nIHwgdW5kZWZpbmVkPlxgIHJhdGhlciB0aGFuIFxgUGFydGlhbDxSZWNvcmQ8Sywgc3RyaW5nPj5cYApmb3IgY29tcGF0aWJpbGl0eSB3aXRoIFpvZCBzY2hlbWEgZ2VuZXJhdGlvbi4gQm90aCBhcmUgZnVuY3Rpb25hbGx5IGVxdWl2YWxlbnQgZm9yIHZhbGlkYXRpb24uYCksVShbbSgpLFllKCldKS5kZXNjcmliZShgU3R5bGUgdmFyaWFibGVzIGZvciB0aGVtaW5nIE1DUCBhcHBzLgoKSW5kaXZpZHVhbCBzdHlsZSBrZXlzIGFyZSBvcHRpb25hbCAtIGhvc3RzIG1heSBwcm92aWRlIGFueSBzdWJzZXQgb2YgdGhlc2UgdmFsdWVzLgpWYWx1ZXMgYXJlIHN0cmluZ3MgY29udGFpbmluZyBDU1MgdmFsdWVzIChjb2xvcnMsIHNpemVzLCBmb250IHN0YWNrcywgZXRjLikuCgpOb3RlOiBUaGlzIHR5cGUgdXNlcyBcYFJlY29yZDxLLCBzdHJpbmcgfCB1bmRlZmluZWQ+XGAgcmF0aGVyIHRoYW4gXGBQYXJ0aWFsPFJlY29yZDxLLCBzdHJpbmc+PlxgCmZvciBjb21wYXRpYmlsaXR5IHdpdGggWm9kIHNjaGVtYSBnZW5lcmF0aW9uLiBCb3RoIGFyZSBmdW5jdGlvbmFsbHkgZXF1aXZhbGVudCBmb3IgdmFsaWRhdGlvbi5gKSkuZGVzY3JpYmUoYFN0eWxlIHZhcmlhYmxlcyBmb3IgdGhlbWluZyBNQ1AgYXBwcy4KCkluZGl2aWR1YWwgc3R5bGUga2V5cyBhcmUgb3B0aW9uYWwgLSBob3N0cyBtYXkgcHJvdmlkZSBhbnkgc3Vic2V0IG9mIHRoZXNlIHZhbHVlcy4KVmFsdWVzIGFyZSBzdHJpbmdzIGNvbnRhaW5pbmcgQ1NTIHZhbHVlcyAoY29sb3JzLCBzaXplcywgZm9udCBzdGFja3MsIGV0Yy4pLgoKTm90ZTogVGhpcyB0eXBlIHVzZXMgXGBSZWNvcmQ8Sywgc3RyaW5nIHwgdW5kZWZpbmVkPlxgIHJhdGhlciB0aGFuIFxgUGFydGlhbDxSZWNvcmQ8Sywgc3RyaW5nPj5cYApmb3IgY29tcGF0aWJpbGl0eSB3aXRoIFpvZCBzY2hlbWEgZ2VuZXJhdGlvbi4gQm90aCBhcmUgZnVuY3Rpb25hbGx5IGVxdWl2YWxlbnQgZm9yIHZhbGlkYXRpb24uYCk7Zih7bWV0aG9kOnAoInVpL29wZW4tbGluayIpLHBhcmFtczpmKHt1cmw6bSgpLmRlc2NyaWJlKCJVUkwgdG8gb3BlbiBpbiB0aGUgaG9zdCdzIGJyb3dzZXIiKX0pfSk7dmFyIHUkPWYoe2lzRXJyb3I6WigpLm9wdGlvbmFsKCkuZGVzY3JpYmUoIlRydWUgaWYgdGhlIGhvc3QgZmFpbGVkIHRvIG9wZW4gdGhlIFVSTCAoZS5nLiwgZHVlIHRvIHNlY3VyaXR5IHBvbGljeSkuIil9KS5wYXNzdGhyb3VnaCgpLGwkPWYoe2lzRXJyb3I6WigpLm9wdGlvbmFsKCkuZGVzY3JpYmUoIlRydWUgaWYgdGhlIGRvd25sb2FkIGZhaWxlZCAoZS5nLiwgdXNlciBjYW5jZWxsZWQgb3IgaG9zdCBkZW5pZWQpLiIpfSkucGFzc3Rocm91Z2goKSxkJD1mKHtpc0Vycm9yOlooKS5vcHRpb25hbCgpLmRlc2NyaWJlKCJUcnVlIGlmIHRoZSBob3N0IHJlamVjdGVkIG9yIGZhaWxlZCB0byBkZWxpdmVyIHRoZSBtZXNzYWdlLiIpfSkucGFzc3Rocm91Z2goKTtmKHttZXRob2Q6cCgidWkvbm90aWZpY2F0aW9ucy9zYW5kYm94LXByb3h5LXJlYWR5IikscGFyYW1zOmYoe30pfSk7dmFyIGlzPWYoe2Nvbm5lY3REb21haW5zOkkobSgpKS5vcHRpb25hbCgpLmRlc2NyaWJlKGBPcmlnaW5zIGZvciBuZXR3b3JrIHJlcXVlc3RzIChmZXRjaC9YSFIvV2ViU29ja2V0KS4KCi0gTWFwcyB0byBDU1AgXGBjb25uZWN0LXNyY1xgIGRpcmVjdGl2ZQotIEVtcHR5IG9yIG9taXR0ZWQg4oaSIG5vIG5ldHdvcmsgY29ubmVjdGlvbnMgKHNlY3VyZSBkZWZhdWx0KWApLHJlc291cmNlRG9tYWluczpJKG0oKSkub3B0aW9uYWwoKS5kZXNjcmliZSgiT3JpZ2lucyBmb3Igc3RhdGljIHJlc291cmNlcyAoaW1hZ2VzLCBzY3JpcHRzLCBzdHlsZXNoZWV0cywgZm9udHMsIG1lZGlhKS5cblxuLSBNYXBzIHRvIENTUCBgaW1nLXNyY2AsIGBzY3JpcHQtc3JjYCwgYHN0eWxlLXNyY2AsIGBmb250LXNyY2AsIGBtZWRpYS1zcmNgIGRpcmVjdGl2ZXNcbi0gV2lsZGNhcmQgc3ViZG9tYWlucyBzdXBwb3J0ZWQ6IGBodHRwczovLyouZXhhbXBsZS5jb21gXG4tIEVtcHR5IG9yIG9taXR0ZWQg4oaSIG5vIG5ldHdvcmsgcmVzb3VyY2VzIChzZWN1cmUgZGVmYXVsdCkiKSxmcmFtZURvbWFpbnM6SShtKCkpLm9wdGlvbmFsKCkuZGVzY3JpYmUoIk9yaWdpbnMgZm9yIG5lc3RlZCBpZnJhbWVzLlxuXG4tIE1hcHMgdG8gQ1NQIGBmcmFtZS1zcmNgIGRpcmVjdGl2ZVxuLSBFbXB0eSBvciBvbWl0dGVkIOKGkiBubyBuZXN0ZWQgaWZyYW1lcyBhbGxvd2VkIChgZnJhbWUtc3JjICdub25lJ2ApIiksYmFzZVVyaURvbWFpbnM6SShtKCkpLm9wdGlvbmFsKCkuZGVzY3JpYmUoIkFsbG93ZWQgYmFzZSBVUklzIGZvciB0aGUgZG9jdW1lbnQuXG5cbi0gTWFwcyB0byBDU1AgYGJhc2UtdXJpYCBkaXJlY3RpdmVcbi0gRW1wdHkgb3Igb21pdHRlZCDihpIgb25seSBzYW1lIG9yaWdpbiBhbGxvd2VkIChgYmFzZS11cmkgJ3NlbGYnYCkiKX0pLG9zPWYoe2NhbWVyYTpmKHt9KS5vcHRpb25hbCgpLmRlc2NyaWJlKCJSZXF1ZXN0IGNhbWVyYSBhY2Nlc3MuXG5cbk1hcHMgdG8gUGVybWlzc2lvbiBQb2xpY3kgYGNhbWVyYWAgZmVhdHVyZS4iKSxtaWNyb3Bob25lOmYoe30pLm9wdGlvbmFsKCkuZGVzY3JpYmUoIlJlcXVlc3QgbWljcm9waG9uZSBhY2Nlc3MuXG5cbk1hcHMgdG8gUGVybWlzc2lvbiBQb2xpY3kgYG1pY3JvcGhvbmVgIGZlYXR1cmUuIiksZ2VvbG9jYXRpb246Zih7fSkub3B0aW9uYWwoKS5kZXNjcmliZSgiUmVxdWVzdCBnZW9sb2NhdGlvbiBhY2Nlc3MuXG5cbk1hcHMgdG8gUGVybWlzc2lvbiBQb2xpY3kgYGdlb2xvY2F0aW9uYCBmZWF0dXJlLiIpLGNsaXBib2FyZFdyaXRlOmYoe30pLm9wdGlvbmFsKCkuZGVzY3JpYmUoIlJlcXVlc3QgY2xpcGJvYXJkIHdyaXRlIGFjY2Vzcy5cblxuTWFwcyB0byBQZXJtaXNzaW9uIFBvbGljeSBgY2xpcGJvYXJkLXdyaXRlYCBmZWF0dXJlLiIpfSk7Zih7bWV0aG9kOnAoInVpL25vdGlmaWNhdGlvbnMvc2l6ZS1jaGFuZ2VkIikscGFyYW1zOmYoe3dpZHRoOlQoKS5vcHRpb25hbCgpLmRlc2NyaWJlKCJOZXcgd2lkdGggaW4gcGl4ZWxzLiIpLGhlaWdodDpUKCkub3B0aW9uYWwoKS5kZXNjcmliZSgiTmV3IGhlaWdodCBpbiBwaXhlbHMuIil9KX0pO3ZhciBtJD1mKHttZXRob2Q6cCgidWkvbm90aWZpY2F0aW9ucy90b29sLWlucHV0IikscGFyYW1zOmYoe2FyZ3VtZW50czpQKG0oKSxFKCkuZGVzY3JpYmUoIkNvbXBsZXRlIHRvb2wgY2FsbCBhcmd1bWVudHMgYXMga2V5LXZhbHVlIHBhaXJzLiIpKS5vcHRpb25hbCgpLmRlc2NyaWJlKCJDb21wbGV0ZSB0b29sIGNhbGwgYXJndW1lbnRzIGFzIGtleS12YWx1ZSBwYWlycy4iKX0pfSkscCQ9Zih7bWV0aG9kOnAoInVpL25vdGlmaWNhdGlvbnMvdG9vbC1pbnB1dC1wYXJ0aWFsIikscGFyYW1zOmYoe2FyZ3VtZW50czpQKG0oKSxFKCkuZGVzY3JpYmUoIlBhcnRpYWwgdG9vbCBjYWxsIGFyZ3VtZW50cyAoaW5jb21wbGV0ZSwgbWF5IGNoYW5nZSkuIikpLm9wdGlvbmFsKCkuZGVzY3JpYmUoIlBhcnRpYWwgdG9vbCBjYWxsIGFyZ3VtZW50cyAoaW5jb21wbGV0ZSwgbWF5IGNoYW5nZSkuIil9KX0pLGYkPWYoe21ldGhvZDpwKCJ1aS9ub3RpZmljYXRpb25zL3Rvb2wtY2FuY2VsbGVkIikscGFyYW1zOmYoe3JlYXNvbjptKCkub3B0aW9uYWwoKS5kZXNjcmliZSgnT3B0aW9uYWwgcmVhc29uIGZvciB0aGUgY2FuY2VsbGF0aW9uIChlLmcuLCAidXNlciBhY3Rpb24iLCAidGltZW91dCIpLicpfSl9KSxnJD1mKHtmb250czptKCkub3B0aW9uYWwoKX0pLHYkPWYoe3ZhcmlhYmxlczpjJC5vcHRpb25hbCgpLmRlc2NyaWJlKCJDU1MgdmFyaWFibGVzIGZvciB0aGVtaW5nIHRoZSBhcHAuIiksY3NzOmckLm9wdGlvbmFsKCkuZGVzY3JpYmUoIkNTUyBibG9ja3MgdGhhdCBhcHBzIGNhbiBpbmplY3QuIil9KSxoJD1mKHttZXRob2Q6cCgidWkvcmVzb3VyY2UtdGVhcmRvd24iKSxwYXJhbXM6Zih7fSl9KTtQKG0oKSxFKCkpO3ZhciBxcz1mKHt0ZXh0OmYoe30pLm9wdGlvbmFsKCkuZGVzY3JpYmUoIkhvc3Qgc3VwcG9ydHMgdGV4dCBjb250ZW50IGJsb2Nrcy4iKSxpbWFnZTpmKHt9KS5vcHRpb25hbCgpLmRlc2NyaWJlKCJIb3N0IHN1cHBvcnRzIGltYWdlIGNvbnRlbnQgYmxvY2tzLiIpLGF1ZGlvOmYoe30pLm9wdGlvbmFsKCkuZGVzY3JpYmUoIkhvc3Qgc3VwcG9ydHMgYXVkaW8gY29udGVudCBibG9ja3MuIikscmVzb3VyY2U6Zih7fSkub3B0aW9uYWwoKS5kZXNjcmliZSgiSG9zdCBzdXBwb3J0cyByZXNvdXJjZSBjb250ZW50IGJsb2Nrcy4iKSxyZXNvdXJjZUxpbms6Zih7fSkub3B0aW9uYWwoKS5kZXNjcmliZSgiSG9zdCBzdXBwb3J0cyByZXNvdXJjZSBsaW5rIGNvbnRlbnQgYmxvY2tzLiIpLHN0cnVjdHVyZWRDb250ZW50OmYoe30pLm9wdGlvbmFsKCkuZGVzY3JpYmUoIkhvc3Qgc3VwcG9ydHMgc3RydWN0dXJlZCBjb250ZW50LiIpfSk7Zih7bWV0aG9kOnAoInVpL25vdGlmaWNhdGlvbnMvcmVxdWVzdC10ZWFyZG93biIpLHBhcmFtczpmKHt9KS5vcHRpb25hbCgpfSk7dmFyICQkPWYoe2V4cGVyaW1lbnRhbDpQKG0oKSxQKG0oKSxobigpKS5kZXNjcmliZSgiRXhwZXJpbWVudGFsIGZlYXR1cmVzIGtleWVkIGJ5IGlkZW50aWZpZXIuIikpLm9wdGlvbmFsKCkuZGVzY3JpYmUoIkV4cGVyaW1lbnRhbCBmZWF0dXJlcyBrZXllZCBieSBpZGVudGlmaWVyLiIpLG9wZW5MaW5rczpmKHt9KS5vcHRpb25hbCgpLmRlc2NyaWJlKCJIb3N0IHN1cHBvcnRzIG9wZW5pbmcgZXh0ZXJuYWwgVVJMcy4iKSxkb3dubG9hZEZpbGU6Zih7fSkub3B0aW9uYWwoKS5kZXNjcmliZSgiSG9zdCBzdXBwb3J0cyBmaWxlIGRvd25sb2FkcyB2aWEgdWkvZG93bmxvYWQtZmlsZS4iKSxzZXJ2ZXJUb29sczpmKHtsaXN0Q2hhbmdlZDpaKCkub3B0aW9uYWwoKS5kZXNjcmliZSgiSG9zdCBzdXBwb3J0cyB0b29scy9saXN0X2NoYW5nZWQgbm90aWZpY2F0aW9ucy4iKX0pLm9wdGlvbmFsKCkuZGVzY3JpYmUoIkhvc3QgY2FuIHByb3h5IHRvb2wgY2FsbHMgdG8gdGhlIE1DUCBzZXJ2ZXIuIiksc2VydmVyUmVzb3VyY2VzOmYoe2xpc3RDaGFuZ2VkOlooKS5vcHRpb25hbCgpLmRlc2NyaWJlKCJIb3N0IHN1cHBvcnRzIHJlc291cmNlcy9saXN0X2NoYW5nZWQgbm90aWZpY2F0aW9ucy4iKX0pLm9wdGlvbmFsKCkuZGVzY3JpYmUoIkhvc3QgY2FuIHByb3h5IHJlc291cmNlIHJlYWRzIHRvIHRoZSBNQ1Agc2VydmVyLiIpLGxvZ2dpbmc6Zih7fSkub3B0aW9uYWwoKS5kZXNjcmliZSgiSG9zdCBhY2NlcHRzIGxvZyBtZXNzYWdlcy4iKSxzYW5kYm94OmYoe3Blcm1pc3Npb25zOm9zLm9wdGlvbmFsKCkuZGVzY3JpYmUoIlBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhlIGhvc3QgKGNhbWVyYSwgbWljcm9waG9uZSwgZ2VvbG9jYXRpb24pLiIpLGNzcDppcy5vcHRpb25hbCgpLmRlc2NyaWJlKCJDU1AgZG9tYWlucyBhcHByb3ZlZCBieSB0aGUgaG9zdC4iKX0pLm9wdGlvbmFsKCkuZGVzY3JpYmUoIlNhbmRib3ggY29uZmlndXJhdGlvbiBhcHBsaWVkIGJ5IHRoZSBob3N0LiIpLHVwZGF0ZU1vZGVsQ29udGV4dDpxcy5vcHRpb25hbCgpLmRlc2NyaWJlKCJIb3N0IGFjY2VwdHMgY29udGV4dCB1cGRhdGVzICh1aS91cGRhdGUtbW9kZWwtY29udGV4dCkgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIG1vZGVsJ3MgY29udGV4dCBmb3IgZnV0dXJlIHR1cm5zLiIpLG1lc3NhZ2U6cXMub3B0aW9uYWwoKS5kZXNjcmliZSgiSG9zdCBzdXBwb3J0cyByZWNlaXZpbmcgY29udGVudCBtZXNzYWdlcyAodWkvbWVzc2FnZSkgZnJvbSB0aGUgdmlldy4iKSxzYW1wbGluZzpmKHt0b29sczpmKHt9KS5vcHRpb25hbCgpLmRlc2NyaWJlKCJIb3N0IHN1cHBvcnRzIHRvb2wgdXNlIHZpYSBgdG9vbHNgIGFuZCBgdG9vbENob2ljZWAgcGFyYW1ldGVycy4iKX0pLm9wdGlvbmFsKCkuZGVzY3JpYmUoIkhvc3Qgc3VwcG9ydHMgTExNIHNhbXBsaW5nIChzYW1wbGluZy9jcmVhdGVNZXNzYWdlKSBmcm9tIHRoZSB2aWV3LlxuTWlycm9ycyB0aGUgTUNQIGBDbGllbnRDYXBhYmlsaXRpZXMuc2FtcGxpbmdgIHNoYXBlIHNvIGhvc3RzIGNhbiBwYXNzIGl0IHRocm91Z2guIil9KSxfJD1mKHtleHBlcmltZW50YWw6UChtKCksUChtKCksaG4oKSkuZGVzY3JpYmUoIkV4cGVyaW1lbnRhbCBmZWF0dXJlcyBrZXllZCBieSBpZGVudGlmaWVyLiIpKS5vcHRpb25hbCgpLmRlc2NyaWJlKCJFeHBlcmltZW50YWwgZmVhdHVyZXMga2V5ZWQgYnkgaWRlbnRpZmllci4iKSx0b29sczpmKHtsaXN0Q2hhbmdlZDpaKCkub3B0aW9uYWwoKS5kZXNjcmliZSgiQXBwIHN1cHBvcnRzIHRvb2xzL2xpc3RfY2hhbmdlZCBub3RpZmljYXRpb25zLiIpfSkub3B0aW9uYWwoKS5kZXNjcmliZSgiQXBwIGV4cG9zZXMgTUNQLXN0eWxlIHRvb2xzIHRoYXQgdGhlIGhvc3QgY2FuIGNhbGwuIiksYXZhaWxhYmxlRGlzcGxheU1vZGVzOkkoenQpLm9wdGlvbmFsKCkuZGVzY3JpYmUoIkRpc3BsYXkgbW9kZXMgdGhlIGFwcCBzdXBwb3J0cy4iKX0pO2Yoe21ldGhvZDpwKCJ1aS9ub3RpZmljYXRpb25zL2luaXRpYWxpemVkIikscGFyYW1zOmYoe30pLm9wdGlvbmFsKCl9KTtmKHtjc3A6aXMub3B0aW9uYWwoKS5kZXNjcmliZSgiQ29udGVudCBTZWN1cml0eSBQb2xpY3kgY29uZmlndXJhdGlvbiBmb3IgVUkgcmVzb3VyY2VzLiIpLHBlcm1pc3Npb25zOm9zLm9wdGlvbmFsKCkuZGVzY3JpYmUoIlNhbmRib3ggcGVybWlzc2lvbnMgcmVxdWVzdGVkIGJ5IHRoZSBVSSByZXNvdXJjZS4iKSxkb21haW46bSgpLm9wdGlvbmFsKCkuZGVzY3JpYmUoYERlZGljYXRlZCBvcmlnaW4gZm9yIHZpZXcgc2FuZGJveC4KClVzZWZ1bCB3aGVuIHZpZXdzIG5lZWQgc3RhYmxlLCBkZWRpY2F0ZWQgb3JpZ2lucyBmb3IgT0F1dGggY2FsbGJhY2tzLCBDT1JTIHBvbGljaWVzLCBvciBBUEkga2V5IGFsbG93bGlzdHMuCgoqKkhvc3QtZGVwZW5kZW50OioqIFRoZSBmb3JtYXQgYW5kIHZhbGlkYXRpb24gcnVsZXMgZm9yIHRoaXMgZmllbGQgYXJlIGRldGVybWluZWQgYnkgZWFjaCBob3N0LiBTZXJ2ZXJzIE1VU1QgY29uc3VsdCBob3N0LXNwZWNpZmljIGRvY3VtZW50YXRpb24gZm9yIHRoZSBleHBlY3RlZCBkb21haW4gZm9ybWF0LiBDb21tb24gcGF0dGVybnMgaW5jbHVkZToKLSBIYXNoLWJhc2VkIHN1YmRvbWFpbnMgKGUuZy4sIFxge2hhc2h9LmNsYXVkZW1jcGNvbnRlbnQuY29tXGApCi0gVVJMLWRlcml2ZWQgc3ViZG9tYWlucyAoZS5nLiwgXGB3d3ctZXhhbXBsZS1jb20ub2FpdXNlcmNvbnRlbnQuY29tXGApCgpJZiBvbWl0dGVkLCBob3N0IHVzZXMgZGVmYXVsdCBzYW5kYm94IG9yaWdpbiAodHlwaWNhbGx5IHBlci1jb252ZXJzYXRpb24pLmApLHByZWZlcnNCb3JkZXI6WigpLm9wdGlvbmFsKCkuZGVzY3JpYmUoYFZpc3VhbCBib3VuZGFyeSBwcmVmZXJlbmNlIC0gdHJ1ZSBpZiB2aWV3IHByZWZlcnMgYSB2aXNpYmxlIGJvcmRlci4KCkJvb2xlYW4gcmVxdWVzdGluZyB3aGV0aGVyIGEgdmlzaWJsZSBib3JkZXIgYW5kIGJhY2tncm91bmQgaXMgcHJvdmlkZWQgYnkgdGhlIGhvc3QuIFNwZWNpZnlpbmcgYW4gZXhwbGljaXQgdmFsdWUgZm9yIHRoaXMgaXMgcmVjb21tZW5kZWQgYmVjYXVzZSBob3N0cycgZGVmYXVsdHMgbWF5IHZhcnkuCgotIFxgdHJ1ZVxgOiByZXF1ZXN0IHZpc2libGUgYm9yZGVyICsgYmFja2dyb3VuZAotIFxgZmFsc2VcYDogcmVxdWVzdCBubyB2aXNpYmxlIGJvcmRlciArIGJhY2tncm91bmQKLSBvbWl0dGVkOiBob3N0IGRlY2lkZXMgYm9yZGVyYCl9KTtmKHttZXRob2Q6cCgidWkvcmVxdWVzdC1kaXNwbGF5LW1vZGUiKSxwYXJhbXM6Zih7bW9kZTp6dC5kZXNjcmliZSgiVGhlIGRpc3BsYXkgbW9kZSBiZWluZyByZXF1ZXN0ZWQuIil9KX0pO3ZhciBiJD1mKHttb2RlOnp0LmRlc2NyaWJlKCJUaGUgZGlzcGxheSBtb2RlIHRoYXQgd2FzIGFjdHVhbGx5IHNldC4gTWF5IGRpZmZlciBmcm9tIHJlcXVlc3RlZCBpZiBub3Qgc3VwcG9ydGVkLiIpfSkucGFzc3Rocm91Z2goKSx5JD1VKFtwKCJtb2RlbCIpLHAoImFwcCIpXSkuZGVzY3JpYmUoIlRvb2wgdmlzaWJpbGl0eSBzY29wZSAtIHdobyBjYW4gYWNjZXNzIHRoZSB0b29sLiIpO2Yoe3Jlc291cmNlVXJpOm0oKS5vcHRpb25hbCgpLHZpc2liaWxpdHk6SSh5JCkub3B0aW9uYWwoKS5kZXNjcmliZShgV2hvIGNhbiBhY2Nlc3MgdGhpcyB0b29sLiBEZWZhdWx0OiBbIm1vZGVsIiwgImFwcCJdCi0gIm1vZGVsIjogVG9vbCB2aXNpYmxlIHRvIGFuZCBjYWxsYWJsZSBieSB0aGUgYWdlbnQKLSAiYXBwIjogVG9vbCBjYWxsYWJsZSBieSB0aGUgYXBwIGZyb20gdGhpcyBzZXJ2ZXIgb25seWApLGNzcDpaZSgpLm9wdGlvbmFsKCkscGVybWlzc2lvbnM6WmUoKS5vcHRpb25hbCgpfSk7Zih7bWltZVR5cGVzOkkobSgpKS5vcHRpb25hbCgpLmRlc2NyaWJlKCdBcnJheSBvZiBzdXBwb3J0ZWQgTUlNRSB0eXBlcyBmb3IgVUkgcmVzb3VyY2VzLlxuTXVzdCBpbmNsdWRlIGAidGV4dC9odG1sO3Byb2ZpbGU9bWNwLWFwcCJgIGZvciBNQ1AgQXBwcyBzdXBwb3J0LicpfSk7Zih7bWV0aG9kOnAoInVpL2Rvd25sb2FkLWZpbGUiKSxwYXJhbXM6Zih7Y29udGVudHM6SShVKFtrbSxTbV0pKS5kZXNjcmliZSgiUmVzb3VyY2UgY29udGVudHMgdG8gZG93bmxvYWQg4oCUIGVtYmVkZGVkIChpbmxpbmUgZGF0YSkgb3IgbGlua2VkIChob3N0IGZldGNoZXMpLiBVc2VzIHN0YW5kYXJkIE1DUCByZXNvdXJjZSB0eXBlcy4iKX0pfSk7Zih7bWV0aG9kOnAoInVpL21lc3NhZ2UiKSxwYXJhbXM6Zih7cm9sZTpwKCJ1c2VyIikuZGVzY3JpYmUoJ01lc3NhZ2Ugcm9sZSwgY3VycmVudGx5IG9ubHkgInVzZXIiIGlzIHN1cHBvcnRlZC4nKSxjb250ZW50OkkoVW4pLmRlc2NyaWJlKCJNZXNzYWdlIGNvbnRlbnQgYmxvY2tzICh0ZXh0LCBpbWFnZSwgZXRjLikuIil9KX0pO2Yoe21ldGhvZDpwKCJ1aS9ub3RpZmljYXRpb25zL3NhbmRib3gtcmVzb3VyY2UtcmVhZHkiKSxwYXJhbXM6Zih7aHRtbDptKCkuZGVzY3JpYmUoIkhUTUwgY29udGVudCB0byBsb2FkIGludG8gdGhlIGlubmVyIGlmcmFtZS4iKSxzYW5kYm94Om0oKS5vcHRpb25hbCgpLmRlc2NyaWJlKCJPcHRpb25hbCBvdmVycmlkZSBmb3IgdGhlIGlubmVyIGlmcmFtZSdzIHNhbmRib3ggYXR0cmlidXRlLiIpLGNzcDppcy5vcHRpb25hbCgpLmRlc2NyaWJlKCJDU1AgY29uZmlndXJhdGlvbiBmcm9tIHJlc291cmNlIG1ldGFkYXRhLiIpLHBlcm1pc3Npb25zOm9zLm9wdGlvbmFsKCkuZGVzY3JpYmUoIlNhbmRib3ggcGVybWlzc2lvbnMgZnJvbSByZXNvdXJjZSBtZXRhZGF0YS4iKX0pfSk7dmFyIGskPWYoe21ldGhvZDpwKCJ1aS9ub3RpZmljYXRpb25zL3Rvb2wtcmVzdWx0IikscGFyYW1zOnJpLmRlc2NyaWJlKCJTdGFuZGFyZCBNQ1AgdG9vbCBleGVjdXRpb24gcmVzdWx0LiIpfSksam09Zih7dG9vbEluZm86Zih7aWQ6SW4ub3B0aW9uYWwoKS5kZXNjcmliZSgiSlNPTi1SUEMgaWQgb2YgdGhlIHRvb2xzL2NhbGwgcmVxdWVzdC4iKSx0b29sOnJzLmRlc2NyaWJlKCJUb29sIGRlZmluaXRpb24gaW5jbHVkaW5nIG5hbWUsIGlucHV0U2NoZW1hLCBldGMuIil9KS5vcHRpb25hbCgpLmRlc2NyaWJlKCJNZXRhZGF0YSBvZiB0aGUgdG9vbCBjYWxsIHRoYXQgaW5zdGFudGlhdGVkIHRoaXMgQXBwLiIpLHRoZW1lOmEkLm9wdGlvbmFsKCkuZGVzY3JpYmUoIkN1cnJlbnQgY29sb3IgdGhlbWUgcHJlZmVyZW5jZS4iKSxzdHlsZXM6diQub3B0aW9uYWwoKS5kZXNjcmliZSgiU3R5bGUgY29uZmlndXJhdGlvbiBmb3IgdGhlbWluZyB0aGUgYXBwLiIpLGRpc3BsYXlNb2RlOnp0Lm9wdGlvbmFsKCkuZGVzY3JpYmUoIkhvdyB0aGUgVUkgaXMgY3VycmVudGx5IGRpc3BsYXllZC4iKSxhdmFpbGFibGVEaXNwbGF5TW9kZXM6SSh6dCkub3B0aW9uYWwoKS5kZXNjcmliZSgiRGlzcGxheSBtb2RlcyB0aGUgaG9zdCBzdXBwb3J0cy4iKSxjb250YWluZXJEaW1lbnNpb25zOlUoW2Yoe2hlaWdodDpUKCkuZGVzY3JpYmUoIkZpeGVkIGNvbnRhaW5lciBoZWlnaHQgaW4gcGl4ZWxzLiIpfSksZih7bWF4SGVpZ2h0OlUoW1QoKSxZZSgpXSkub3B0aW9uYWwoKS5kZXNjcmliZSgiTWF4aW11bSBjb250YWluZXIgaGVpZ2h0IGluIHBpeGVscy4iKX0pXSkuYW5kKFUoW2Yoe3dpZHRoOlQoKS5kZXNjcmliZSgiRml4ZWQgY29udGFpbmVyIHdpZHRoIGluIHBpeGVscy4iKX0pLGYoe21heFdpZHRoOlUoW1QoKSxZZSgpXSkub3B0aW9uYWwoKS5kZXNjcmliZSgiTWF4aW11bSBjb250YWluZXIgd2lkdGggaW4gcGl4ZWxzLiIpfSldKSkub3B0aW9uYWwoKS5kZXNjcmliZShgQ29udGFpbmVyIGRpbWVuc2lvbnMuIFJlcHJlc2VudHMgdGhlIGRpbWVuc2lvbnMgb2YgdGhlIGlmcmFtZSBvciBvdGhlcgpjb250YWluZXIgaG9sZGluZyB0aGUgYXBwLiBTcGVjaWZ5IGVpdGhlciB3aWR0aCBvciBtYXhXaWR0aCwgYW5kIGVpdGhlciBoZWlnaHQgb3IgbWF4SGVpZ2h0LmApLGxvY2FsZTptKCkub3B0aW9uYWwoKS5kZXNjcmliZSgiVXNlcidzIGxhbmd1YWdlIGFuZCByZWdpb24gcHJlZmVyZW5jZSBpbiBCQ1AgNDcgZm9ybWF0LiIpLHRpbWVab25lOm0oKS5vcHRpb25hbCgpLmRlc2NyaWJlKCJVc2VyJ3MgdGltZXpvbmUgaW4gSUFOQSBmb3JtYXQuIiksdXNlckFnZW50Om0oKS5vcHRpb25hbCgpLmRlc2NyaWJlKCJIb3N0IGFwcGxpY2F0aW9uIGlkZW50aWZpZXIuIikscGxhdGZvcm06VShbcCgid2ViIikscCgiZGVza3RvcCIpLHAoIm1vYmlsZSIpXSkub3B0aW9uYWwoKS5kZXNjcmliZSgiUGxhdGZvcm0gdHlwZSBmb3IgcmVzcG9uc2l2ZSBkZXNpZ24gZGVjaXNpb25zLiIpLGRldmljZUNhcGFiaWxpdGllczpmKHt0b3VjaDpaKCkub3B0aW9uYWwoKS5kZXNjcmliZSgiV2hldGhlciB0aGUgZGV2aWNlIHN1cHBvcnRzIHRvdWNoIGlucHV0LiIpLGhvdmVyOlooKS5vcHRpb25hbCgpLmRlc2NyaWJlKCJXaGV0aGVyIHRoZSBkZXZpY2Ugc3VwcG9ydHMgaG92ZXIgaW50ZXJhY3Rpb25zLiIpfSkub3B0aW9uYWwoKS5kZXNjcmliZSgiRGV2aWNlIGlucHV0IGNhcGFiaWxpdGllcy4iKSxzYWZlQXJlYUluc2V0czpmKHt0b3A6VCgpLmRlc2NyaWJlKCJUb3Agc2FmZSBhcmVhIGluc2V0IGluIHBpeGVscy4iKSxyaWdodDpUKCkuZGVzY3JpYmUoIlJpZ2h0IHNhZmUgYXJlYSBpbnNldCBpbiBwaXhlbHMuIiksYm90dG9tOlQoKS5kZXNjcmliZSgiQm90dG9tIHNhZmUgYXJlYSBpbnNldCBpbiBwaXhlbHMuIiksbGVmdDpUKCkuZGVzY3JpYmUoIkxlZnQgc2FmZSBhcmVhIGluc2V0IGluIHBpeGVscy4iKX0pLm9wdGlvbmFsKCkuZGVzY3JpYmUoIk1vYmlsZSBzYWZlIGFyZWEgYm91bmRhcmllcyBpbiBwaXhlbHMuIil9KS5wYXNzdGhyb3VnaCgpLFMkPWYoe21ldGhvZDpwKCJ1aS9ub3RpZmljYXRpb25zL2hvc3QtY29udGV4dC1jaGFuZ2VkIikscGFyYW1zOmptLmRlc2NyaWJlKCJQYXJ0aWFsIGNvbnRleHQgdXBkYXRlIGNvbnRhaW5pbmcgb25seSBjaGFuZ2VkIGZpZWxkcy4iKX0pO2Yoe21ldGhvZDpwKCJ1aS91cGRhdGUtbW9kZWwtY29udGV4dCIpLHBhcmFtczpmKHtjb250ZW50OkkoVW4pLm9wdGlvbmFsKCkuZGVzY3JpYmUoIkNvbnRleHQgY29udGVudCBibG9ja3MgKHRleHQsIGltYWdlLCBldGMuKS4iKSxzdHJ1Y3R1cmVkQ29udGVudDpQKG0oKSxFKCkuZGVzY3JpYmUoIlN0cnVjdHVyZWQgY29udGVudCBmb3IgbWFjaGluZS1yZWFkYWJsZSBjb250ZXh0IGRhdGEuIikpLm9wdGlvbmFsKCkuZGVzY3JpYmUoIlN0cnVjdHVyZWQgY29udGVudCBmb3IgbWFjaGluZS1yZWFkYWJsZSBjb250ZXh0IGRhdGEuIil9KX0pO2Yoe21ldGhvZDpwKCJ1aS9pbml0aWFsaXplIikscGFyYW1zOmYoe2FwcEluZm86dGkuZGVzY3JpYmUoIkFwcCBpZGVudGlmaWNhdGlvbiAobmFtZSBhbmQgdmVyc2lvbikuIiksYXBwQ2FwYWJpbGl0aWVzOl8kLmRlc2NyaWJlKCJGZWF0dXJlcyBhbmQgY2FwYWJpbGl0aWVzIHRoaXMgYXBwIHByb3ZpZGVzLiIpLHByb3RvY29sVmVyc2lvbjptKCkuZGVzY3JpYmUoIlByb3RvY29sIHZlcnNpb24gdGhpcyBhcHAgc3VwcG9ydHMuIil9KX0pO3ZhciB3JD1mKHtwcm90b2NvbFZlcnNpb246bSgpLmRlc2NyaWJlKCdOZWdvdGlhdGVkIHByb3RvY29sIHZlcnNpb24gc3RyaW5nIChlLmcuLCAiMjAyNS0xMS0yMSIpLicpLGhvc3RJbmZvOnRpLmRlc2NyaWJlKCJIb3N0IGFwcGxpY2F0aW9uIGlkZW50aWZpY2F0aW9uIGFuZCB2ZXJzaW9uLiIpLGhvc3RDYXBhYmlsaXRpZXM6JCQuZGVzY3JpYmUoIkZlYXR1cmVzIGFuZCBjYXBhYmlsaXRpZXMgcHJvdmlkZWQgYnkgdGhlIGhvc3QuIiksaG9zdENvbnRleHQ6am0uZGVzY3JpYmUoIlJpY2ggY29udGV4dCBhYm91dCB0aGUgaG9zdCBlbnZpcm9ubWVudC4iKX0pLnBhc3N0aHJvdWdoKCksSSQ9e3RhcmdldDoiZHJhZnQtMjAyMC0xMiJ9O2FzeW5jIGZ1bmN0aW9uIEZzKHQsbil7bGV0IHI9dFsifnN0YW5kYXJkIl07aWYoci5qc29uU2NoZW1hKXJldHVybiByLmpzb25TY2hlbWFbbl0oSSQpO2lmKHIudmVuZG9yPT09InpvZCIpe2xldHt6Om99PWF3YWl0IEFtKCgpPT5Qcm9taXNlLnJlc29sdmUoKS50aGVuKCgpPT5wdiksdm9pZCAwLGltcG9ydC5tZXRhLnVybCk7cmV0dXJuIG8udG9KU09OU2NoZW1hKHQse2lvOm59KX10aHJvdyBFcnJvcihgU2NoZW1hICh2ZW5kb3I6ICR7ci52ZW5kb3J9KSBkb2VzIG5vdCBpbXBsZW1lbnQgU3RhbmRhcmQgSlNPTiBTY2hlbWEgKH5zdGFuZGFyZC5qc29uU2NoZW1hKS4gVXNlIGEgbGlicmFyeSB0aGF0IGRvZXMgKHpvZCB2NCwgQXJrVHlwZSwgVmFsaWJvdCkgb3Igd3JhcCB5b3VyIHNjaGVtYSBhY2NvcmRpbmdseS5gKX1hc3luYyBmdW5jdGlvbiBKcyh0LG4scj0iIil7bGV0IG89YXdhaXQgdFsifnN0YW5kYXJkIl0udmFsaWRhdGUobik7aWYoby5pc3N1ZXMpe2xldCBlPW8uaXNzdWVzLm1hcChpPT57bGV0IGE9aS5wYXRoPy5tYXAocz0+dHlwZW9mIHM9PSJvYmplY3QiP3Mua2V5OnMpLmpvaW4oIi4iKTtyZXR1cm4gYT9gJHthfTogJHtpLm1lc3NhZ2V9YDppLm1lc3NhZ2V9KS5qb2luKCI7ICIpO3Rocm93IEVycm9yKHIrZSl9cmV0dXJuIG8udmFsdWV9Y2xhc3MgYXMgZXh0ZW5kcyBuJHtfYXBwSW5mbztfY2FwYWJpbGl0aWVzO29wdGlvbnM7X2hvc3RDYXBhYmlsaXRpZXM7X2hvc3RJbmZvO19ob3N0Q29udGV4dDtfcmVnaXN0ZXJlZFRvb2xzPXt9O19pbml0aWFsaXplZFNlbnQ9ITE7X2Fzc2VydEluaXRpYWxpemVkKG4pe2lmKHRoaXMuX2luaXRpYWxpemVkU2VudClyZXR1cm47bGV0IHI9YFtleHQtYXBwc10gQXBwLiR7bn0oKSBjYWxsZWQgYmVmb3JlIGNvbm5lY3QoKSBjb21wbGV0ZWQgdGhlIHVpL2luaXRpYWxpemUgaGFuZHNoYWtlLiBBd2FpdCBhcHAuY29ubmVjdCgpIGJlZm9yZSBjYWxsaW5nIHRoaXMgbWV0aG9kLCBvciBtb3ZlIGRhdGEgbG9hZGluZyB0byBhbiBvbnRvb2xyZXN1bHQgaGFuZGxlci5gO2lmKHRoaXMub3B0aW9ucz8uc3RyaWN0KXRocm93IEVycm9yKHIpO2NvbnNvbGUud2FybihgJHtyfS4gVGhpcyB3aWxsIHRocm93IGluIGEgZnV0dXJlIHJlbGVhc2UuYCl9ZXZlbnRTY2hlbWFzPXt0b29saW5wdXQ6bSQsdG9vbGlucHV0cGFydGlhbDpwJCx0b29scmVzdWx0OmskLHRvb2xjYW5jZWxsZWQ6ZiQsaG9zdGNvbnRleHRjaGFuZ2VkOlMkfTtzdGF0aWMgT05FX1NIT1RfRVZFTlRTPW5ldyBTZXQoWyJ0b29saW5wdXQiLCJ0b29saW5wdXRwYXJ0aWFsIiwidG9vbHJlc3VsdCIsInRvb2xjYW5jZWxsZWQiXSk7X2V2ZXJIYWRMaXN0ZW5lcj1uZXcgU2V0O19hc3NlcnRIYW5kbGVyVGltaW5nKG4pe2lmKCFhcy5PTkVfU0hPVF9FVkVOVFMuaGFzKG4pfHx0aGlzLl9ldmVySGFkTGlzdGVuZXIuaGFzKG4pfHwodGhpcy5fZXZlckhhZExpc3RlbmVyLmFkZChuKSwhdGhpcy5faW5pdGlhbGl6ZWRTZW50KSlyZXR1cm47bGV0IHI9YFtleHQtYXBwc10gIiR7U3RyaW5nKG4pfSIgaGFuZGxlciByZWdpc3RlcmVkIGFmdGVyIGNvbm5lY3QoKSBjb21wbGV0ZWQgdGhlIHVpL2luaXRpYWxpemUgaGFuZHNoYWtlLiBUaGUgaG9zdCBtYXkgaGF2ZSBhbHJlYWR5IHNlbnQgdGhpcyBub3RpZmljYXRpb24uIFJlZ2lzdGVyIGhhbmRsZXJzIGJlZm9yZSBjYWxsaW5nIGFwcC5jb25uZWN0KCkuYDtpZih0aGlzLm9wdGlvbnM/LnN0cmljdCl0aHJvdyBFcnJvcihyKTtjb25zb2xlLndhcm4ocil9c2V0RXZlbnRIYW5kbGVyKG4scil7ciYmdGhpcy5fYXNzZXJ0SGFuZGxlclRpbWluZyhuKSxzdXBlci5zZXRFdmVudEhhbmRsZXIobixyKX1hZGRFdmVudExpc3RlbmVyKG4scil7dGhpcy5fYXNzZXJ0SGFuZGxlclRpbWluZyhuKSxzdXBlci5hZGRFdmVudExpc3RlbmVyKG4scil9b25FdmVudERpc3BhdGNoKG4scil7bj09PSJob3N0Y29udGV4dGNoYW5nZWQiJiYodGhpcy5faG9zdENvbnRleHQ9ey4uLnRoaXMuX2hvc3RDb250ZXh0LC4uLnJ9KX1jb25zdHJ1Y3RvcihuLHI9e30sbz17YXV0b1Jlc2l6ZTohMH0pe3N1cGVyKG8pLHRoaXMuX2FwcEluZm89bix0aGlzLl9jYXBhYmlsaXRpZXM9cix0aGlzLm9wdGlvbnM9byxvLmFsbG93VW5zYWZlRXZhbHx8Syh7aml0bGVzczohMH0pLHRoaXMuc2V0UmVxdWVzdEhhbmRsZXIobmksZT0+KGNvbnNvbGUubG9nKCJSZWNlaXZlZCBwaW5nOiIsZS5wYXJhbXMpLHt9KSksdGhpcy5zZXRFdmVudEhhbmRsZXIoImhvc3Rjb250ZXh0Y2hhbmdlZCIsdm9pZCAwKX1yZWdpc3RlckNhcGFiaWxpdGllcyhuKXtpZih0aGlzLnRyYW5zcG9ydCl0aHJvdyBFcnJvcigiQ2Fubm90IHJlZ2lzdGVyIGNhcGFiaWxpdGllcyBhZnRlciB0cmFuc3BvcnQgaXMgZXN0YWJsaXNoZWQiKTt0aGlzLl9jYXBhYmlsaXRpZXM9dCQodGhpcy5fY2FwYWJpbGl0aWVzLG4pfXJlZ2lzdGVyVG9vbChuLHIsbyl7aWYodGhpcy5fcmVnaXN0ZXJlZFRvb2xzW25dKXRocm93IEVycm9yKGBUb29sICR7bn0gaXMgYWxyZWFkeSByZWdpc3RlcmVkYCk7bGV0IGU9dGhpcyxpPSgpPT57ZS5faW5pdGlhbGl6ZWRTZW50JiZlLl9jYXBhYmlsaXRpZXMudG9vbHM/Lmxpc3RDaGFuZ2VkJiZlLnNlbmRUb29sTGlzdENoYW5nZWQoKX0sYT1yLmlucHV0U2NoZW1hIT09dm9pZCAwLHM9e3RpdGxlOnIudGl0bGUsZGVzY3JpcHRpb246ci5kZXNjcmlwdGlvbixpbnB1dFNjaGVtYTpyLmlucHV0U2NoZW1hLG91dHB1dFNjaGVtYTpyLm91dHB1dFNjaGVtYSxhbm5vdGF0aW9uczpyLmFubm90YXRpb25zLF9tZXRhOnIuX21ldGEsZW5hYmxlZDohMCxlbmFibGUoKXt0aGlzLmVuYWJsZWQ9ITAsaSgpfSxkaXNhYmxlKCl7dGhpcy5lbmFibGVkPSExLGkoKX0sdXBkYXRlKGMpe09iamVjdC5hc3NpZ24odGhpcyxjKSxpKCl9LHJlbW92ZSgpe2UuX3JlZ2lzdGVyZWRUb29sc1tuXT09PXMmJihkZWxldGUgZS5fcmVnaXN0ZXJlZFRvb2xzW25dLGkoKSl9LGhhbmRsZXI6YXN5bmMoYyx1KT0+e2lmKCFzLmVuYWJsZWQpdGhyb3cgRXJyb3IoYFRvb2wgJHtufSBpcyBkaXNhYmxlZGApO2xldCBsO2lmKGEpe2xldCBnPXMuaW5wdXRTY2hlbWEsdj1nP2F3YWl0IEpzKGcsYz8/e30sYEludmFsaWQgaW5wdXQgZm9yIHRvb2wgJHtufTogYCk6Yz8/e307bD1hd2FpdCBvKHYsdSl9ZWxzZSBsPWF3YWl0IG8odSk7cmV0dXJuIHMub3V0cHV0U2NoZW1hJiYhbC5pc0Vycm9yJiYobC5zdHJ1Y3R1cmVkQ29udGVudD1hd2FpdCBKcyhzLm91dHB1dFNjaGVtYSxsLnN0cnVjdHVyZWRDb250ZW50LGBJbnZhbGlkIG91dHB1dCBmb3IgdG9vbCAke259OiBgKSksbH19O3JldHVybiB0aGlzLl9yZWdpc3RlcmVkVG9vbHNbbl09cywhdGhpcy5fY2FwYWJpbGl0aWVzLnRvb2xzJiYhdGhpcy50cmFuc3BvcnQmJnRoaXMucmVnaXN0ZXJDYXBhYmlsaXRpZXMoe3Rvb2xzOntsaXN0Q2hhbmdlZDohMH19KSx0aGlzLmVuc3VyZVRvb2xIYW5kbGVyc0luaXRpYWxpemVkKCksaSgpLHN9X3Rvb2xIYW5kbGVyc0luaXRpYWxpemVkPSExO2Vuc3VyZVRvb2xIYW5kbGVyc0luaXRpYWxpemVkKCl7dGhpcy5fdG9vbEhhbmRsZXJzSW5pdGlhbGl6ZWR8fCh0aGlzLl90b29sSGFuZGxlcnNJbml0aWFsaXplZD0hMCx0aGlzLm9uY2FsbHRvb2w9YXN5bmMobixyKT0+e2xldCBvPXRoaXMuX3JlZ2lzdGVyZWRUb29sc1tuLm5hbWVdO2lmKCFvKXRocm93IEVycm9yKGBUb29sICR7bi5uYW1lfSBub3QgZm91bmRgKTtyZXR1cm4gby5oYW5kbGVyKG4uYXJndW1lbnRzLHIpfSx0aGlzLm9ubGlzdHRvb2xzPWFzeW5jKG4scik9Pih7dG9vbHM6YXdhaXQgUHJvbWlzZS5hbGwoT2JqZWN0LmVudHJpZXModGhpcy5fcmVnaXN0ZXJlZFRvb2xzKS5maWx0ZXIoKFtvLGVdKT0+ZS5lbmFibGVkKS5tYXAoYXN5bmMoW28sZV0pPT57bGV0IGk9e25hbWU6byx0aXRsZTplLnRpdGxlLGRlc2NyaXB0aW9uOmUuZGVzY3JpcHRpb24saW5wdXRTY2hlbWE6ZS5pbnB1dFNjaGVtYT9hd2FpdCBGcyhlLmlucHV0U2NoZW1hLCJpbnB1dCIpOnt0eXBlOiJvYmplY3QiLHByb3BlcnRpZXM6e319fTtyZXR1cm4gZS5vdXRwdXRTY2hlbWEmJihpLm91dHB1dFNjaGVtYT1hd2FpdCBGcyhlLm91dHB1dFNjaGVtYSwib3V0cHV0IikpLGUuYW5ub3RhdGlvbnMmJihpLmFubm90YXRpb25zPWUuYW5ub3RhdGlvbnMpLGUuX21ldGEmJihpLl9tZXRhPWUuX21ldGEpLGl9KSl9KSl9YXN5bmMgc2VuZFRvb2xMaXN0Q2hhbmdlZChuPXt9KXt0aGlzLl9hc3NlcnRJbml0aWFsaXplZCgic2VuZFRvb2xMaXN0Q2hhbmdlZCIpLGF3YWl0IHRoaXMubm90aWZpY2F0aW9uKHttZXRob2Q6Im5vdGlmaWNhdGlvbnMvdG9vbHMvbGlzdF9jaGFuZ2VkIixwYXJhbXM6bn0pfWdldEhvc3RDYXBhYmlsaXRpZXMoKXtyZXR1cm4gdGhpcy5faG9zdENhcGFiaWxpdGllc31nZXRIb3N0VmVyc2lvbigpe3JldHVybiB0aGlzLl9ob3N0SW5mb31nZXRIb3N0Q29udGV4dCgpe3JldHVybiB0aGlzLl9ob3N0Q29udGV4dH1nZXQgb250b29saW5wdXQoKXtyZXR1cm4gdGhpcy5nZXRFdmVudEhhbmRsZXIoInRvb2xpbnB1dCIpfXNldCBvbnRvb2xpbnB1dChuKXt0aGlzLnNldEV2ZW50SGFuZGxlcigidG9vbGlucHV0IixuKX1nZXQgb250b29saW5wdXRwYXJ0aWFsKCl7cmV0dXJuIHRoaXMuZ2V0RXZlbnRIYW5kbGVyKCJ0b29saW5wdXRwYXJ0aWFsIil9c2V0IG9udG9vbGlucHV0cGFydGlhbChuKXt0aGlzLnNldEV2ZW50SGFuZGxlcigidG9vbGlucHV0cGFydGlhbCIsbil9Z2V0IG9udG9vbHJlc3VsdCgpe3JldHVybiB0aGlzLmdldEV2ZW50SGFuZGxlcigidG9vbHJlc3VsdCIpfXNldCBvbnRvb2xyZXN1bHQobil7dGhpcy5zZXRFdmVudEhhbmRsZXIoInRvb2xyZXN1bHQiLG4pfWdldCBvbnRvb2xjYW5jZWxsZWQoKXtyZXR1cm4gdGhpcy5nZXRFdmVudEhhbmRsZXIoInRvb2xjYW5jZWxsZWQiKX1zZXQgb250b29sY2FuY2VsbGVkKG4pe3RoaXMuc2V0RXZlbnRIYW5kbGVyKCJ0b29sY2FuY2VsbGVkIixuKX1nZXQgb25ob3N0Y29udGV4dGNoYW5nZWQoKXtyZXR1cm4gdGhpcy5nZXRFdmVudEhhbmRsZXIoImhvc3Rjb250ZXh0Y2hhbmdlZCIpfXNldCBvbmhvc3Rjb250ZXh0Y2hhbmdlZChuKXt0aGlzLnNldEV2ZW50SGFuZGxlcigiaG9zdGNvbnRleHRjaGFuZ2VkIixuKX1fb250ZWFyZG93bjtnZXQgb250ZWFyZG93bigpe3JldHVybiB0aGlzLl9vbnRlYXJkb3dufXNldCBvbnRlYXJkb3duKG4pe3RoaXMud2FybklmUmVxdWVzdEhhbmRsZXJSZXBsYWNlZCgib250ZWFyZG93biIsdGhpcy5fb250ZWFyZG93bixuKSx0aGlzLl9vbnRlYXJkb3duPW4sdGhpcy5yZXBsYWNlUmVxdWVzdEhhbmRsZXIoaCQsKHIsbyk9PntpZighdGhpcy5fb250ZWFyZG93bil0aHJvdyBFcnJvcigiTm8gb250ZWFyZG93biBoYW5kbGVyIHNldCIpO3JldHVybiB0aGlzLl9vbnRlYXJkb3duKHIucGFyYW1zLG8pfSl9X29uY2FsbHRvb2w7Z2V0IG9uY2FsbHRvb2woKXtyZXR1cm4gdGhpcy5fb25jYWxsdG9vbH1zZXQgb25jYWxsdG9vbChuKXt0aGlzLndhcm5JZlJlcXVlc3RIYW5kbGVyUmVwbGFjZWQoIm9uY2FsbHRvb2wiLHRoaXMuX29uY2FsbHRvb2wsbiksdGhpcy5fb25jYWxsdG9vbD1uLHRoaXMucmVwbGFjZVJlcXVlc3RIYW5kbGVyKEltLChyLG8pPT57aWYoIXRoaXMuX29uY2FsbHRvb2wpdGhyb3cgRXJyb3IoIk5vIG9uY2FsbHRvb2wgaGFuZGxlciBzZXQiKTtyZXR1cm4gdGhpcy5fb25jYWxsdG9vbChyLnBhcmFtcyxvKX0pfV9vbmxpc3R0b29scztnZXQgb25saXN0dG9vbHMoKXtyZXR1cm4gdGhpcy5fb25saXN0dG9vbHN9c2V0IG9ubGlzdHRvb2xzKG4pe3RoaXMud2FybklmUmVxdWVzdEhhbmRsZXJSZXBsYWNlZCgib25saXN0dG9vbHMiLHRoaXMuX29ubGlzdHRvb2xzLG4pLHRoaXMuX29ubGlzdHRvb2xzPW4sdGhpcy5yZXBsYWNlUmVxdWVzdEhhbmRsZXIod20sKHIsbyk9PntpZighdGhpcy5fb25saXN0dG9vbHMpdGhyb3cgRXJyb3IoIk5vIG9ubGlzdHRvb2xzIGhhbmRsZXIgc2V0Iik7cmV0dXJuIHRoaXMuX29ubGlzdHRvb2xzKHIucGFyYW1zLG8pfSl9YXNzZXJ0Q2FwYWJpbGl0eUZvck1ldGhvZChuKXtzd2l0Y2gobil7Y2FzZSJzYW1wbGluZy9jcmVhdGVNZXNzYWdlIjppZighdGhpcy5faG9zdENhcGFiaWxpdGllcz8uc2FtcGxpbmcpdGhyb3cgRXJyb3IoYEhvc3QgZG9lcyBub3Qgc3VwcG9ydCBzYW1wbGluZyAocmVxdWlyZWQgZm9yICR7bn0pYCk7YnJlYWt9fWFzc2VydFJlcXVlc3RIYW5kbGVyQ2FwYWJpbGl0eShuKXtzd2l0Y2gobil7Y2FzZSJ0b29scy9jYWxsIjpjYXNlInRvb2xzL2xpc3QiOmlmKCF0aGlzLl9jYXBhYmlsaXRpZXMudG9vbHMpdGhyb3cgRXJyb3IoYENsaWVudCBkb2VzIG5vdCBzdXBwb3J0IHRvb2wgY2FwYWJpbGl0eSAocmVxdWlyZWQgZm9yICR7bn0pYCk7cmV0dXJuO2Nhc2UicGluZyI6Y2FzZSJ1aS9yZXNvdXJjZS10ZWFyZG93biI6cmV0dXJuO2RlZmF1bHQ6dGhyb3cgRXJyb3IoYE5vIGhhbmRsZXIgZm9yIG1ldGhvZCAke259IHJlZ2lzdGVyZWRgKX19YXNzZXJ0Tm90aWZpY2F0aW9uQ2FwYWJpbGl0eShuKXt9YXNzZXJ0VGFza0NhcGFiaWxpdHkobil7dGhyb3cgRXJyb3IoIlRhc2tzIGFyZSBub3Qgc3VwcG9ydGVkIGluIE1DUCBBcHBzIil9YXNzZXJ0VGFza0hhbmRsZXJDYXBhYmlsaXR5KG4pe3Rocm93IEVycm9yKCJUYXNrIGhhbmRsZXJzIGFyZSBub3Qgc3VwcG9ydGVkIGluIE1DUCBBcHBzIil9YXN5bmMgY2FsbFNlcnZlclRvb2wobixyKXtpZih0aGlzLl9hc3NlcnRJbml0aWFsaXplZCgiY2FsbFNlcnZlclRvb2wiKSx0eXBlb2Ygbj09InN0cmluZyIpdGhyb3cgRXJyb3IoYGNhbGxTZXJ2ZXJUb29sKCkgZXhwZWN0cyBhbiBvYmplY3QgYXMgaXRzIGZpcnN0IGFyZ3VtZW50LCBidXQgcmVjZWl2ZWQgYSBzdHJpbmcgKCIke259IikuIERpZCB5b3UgbWVhbjogY2FsbFNlcnZlclRvb2woeyBuYW1lOiAiJHtufSIsIGFyZ3VtZW50czogeyAuLi4gfSB9KT9gKTtyZXR1cm4gYXdhaXQgdGhpcy5yZXF1ZXN0KHttZXRob2Q6InRvb2xzL2NhbGwiLHBhcmFtczpufSxyaSx7b25wcm9ncmVzczooKT0+e30scmVzZXRUaW1lb3V0T25Qcm9ncmVzczohMCwuLi5yfSl9YXN5bmMgcmVhZFNlcnZlclJlc291cmNlKG4scil7cmV0dXJuIHRoaXMuX2Fzc2VydEluaXRpYWxpemVkKCJyZWFkU2VydmVyUmVzb3VyY2UiKSxhd2FpdCB0aGlzLnJlcXVlc3Qoe21ldGhvZDoicmVzb3VyY2VzL3JlYWQiLHBhcmFtczpufSx5bSxyKX1hc3luYyBsaXN0U2VydmVyUmVzb3VyY2VzKG4scil7cmV0dXJuIHRoaXMuX2Fzc2VydEluaXRpYWxpemVkKCJsaXN0U2VydmVyUmVzb3VyY2VzIiksYXdhaXQgdGhpcy5yZXF1ZXN0KHttZXRob2Q6InJlc291cmNlcy9saXN0IixwYXJhbXM6bn0sYm0scil9YXN5bmMgY3JlYXRlU2FtcGxpbmdNZXNzYWdlKG4scil7dGhpcy5fYXNzZXJ0SW5pdGlhbGl6ZWQoImNyZWF0ZVNhbXBsaW5nTWVzc2FnZSIpO2xldCBvPW4udG9vbHM/VG06eG07cmV0dXJuIGF3YWl0IHRoaXMucmVxdWVzdCh7bWV0aG9kOiJzYW1wbGluZy9jcmVhdGVNZXNzYWdlIixwYXJhbXM6bn0sbyxyKX1zZW5kTWVzc2FnZShuLHIpe3JldHVybiB0aGlzLl9hc3NlcnRJbml0aWFsaXplZCgic2VuZE1lc3NhZ2UiKSx0aGlzLnJlcXVlc3Qoe21ldGhvZDoidWkvbWVzc2FnZSIscGFyYW1zOm59LGQkLHIpfXNlbmRMb2cobil7cmV0dXJuIHRoaXMubm90aWZpY2F0aW9uKHttZXRob2Q6Im5vdGlmaWNhdGlvbnMvbWVzc2FnZSIscGFyYW1zOm59KX11cGRhdGVNb2RlbENvbnRleHQobixyKXtyZXR1cm4gdGhpcy5fYXNzZXJ0SW5pdGlhbGl6ZWQoInVwZGF0ZU1vZGVsQ29udGV4dCIpLHRoaXMucmVxdWVzdCh7bWV0aG9kOiJ1aS91cGRhdGUtbW9kZWwtY29udGV4dCIscGFyYW1zOm59LHFhLHIpfW9wZW5MaW5rKG4scil7cmV0dXJuIHRoaXMuX2Fzc2VydEluaXRpYWxpemVkKCJvcGVuTGluayIpLHRoaXMucmVxdWVzdCh7bWV0aG9kOiJ1aS9vcGVuLWxpbmsiLHBhcmFtczpufSx1JCxyKX1zZW5kT3Blbkxpbms9dGhpcy5vcGVuTGluaztkb3dubG9hZEZpbGUobixyKXtyZXR1cm4gdGhpcy5fYXNzZXJ0SW5pdGlhbGl6ZWQoImRvd25sb2FkRmlsZSIpLHRoaXMucmVxdWVzdCh7bWV0aG9kOiJ1aS9kb3dubG9hZC1maWxlIixwYXJhbXM6bn0sbCQscil9cmVxdWVzdFRlYXJkb3duKG49e30pe3JldHVybiB0aGlzLm5vdGlmaWNhdGlvbih7bWV0aG9kOiJ1aS9ub3RpZmljYXRpb25zL3JlcXVlc3QtdGVhcmRvd24iLHBhcmFtczpufSl9cmVxdWVzdERpc3BsYXlNb2RlKG4scil7cmV0dXJuIHRoaXMuX2Fzc2VydEluaXRpYWxpemVkKCJyZXF1ZXN0RGlzcGxheU1vZGUiKSx0aGlzLnJlcXVlc3Qoe21ldGhvZDoidWkvcmVxdWVzdC1kaXNwbGF5LW1vZGUiLHBhcmFtczpufSxiJCxyKX1zZW5kU2l6ZUNoYW5nZWQobil7cmV0dXJuIHRoaXMubm90aWZpY2F0aW9uKHttZXRob2Q6InVpL25vdGlmaWNhdGlvbnMvc2l6ZS1jaGFuZ2VkIixwYXJhbXM6bn0pfXNldHVwU2l6ZUNoYW5nZWROb3RpZmljYXRpb25zKCl7bGV0IG49ITEscj0wLG89MCxlPSgpPT57bnx8KG49ITAscmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT57bj0hMTtsZXQgYT1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQscz1hLnN0eWxlLmhlaWdodDthLnN0eWxlLmhlaWdodD0ibWF4LWNvbnRlbnQiO2xldCBjPU1hdGguY2VpbChhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodCk7YS5zdHlsZS5oZWlnaHQ9cztsZXQgdT1NYXRoLmNlaWwod2luZG93LmlubmVyV2lkdGgpOyh1IT09cnx8YyE9PW8pJiYocj11LG89Yyx0aGlzLnNlbmRTaXplQ2hhbmdlZCh7d2lkdGg6dSxoZWlnaHQ6Y30pKX0pKX07ZSgpO2xldCBpPW5ldyBSZXNpemVPYnNlcnZlcihlKTtyZXR1cm4gaS5vYnNlcnZlKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCksaS5vYnNlcnZlKGRvY3VtZW50LmJvZHkpLCgpPT5pLmRpc2Nvbm5lY3QoKX1hc3luYyBjb25uZWN0KG49bmV3IG8kKHdpbmRvdy5wYXJlbnQsd2luZG93LnBhcmVudCkscil7aWYodGhpcy50cmFuc3BvcnQpdGhyb3cgRXJyb3IoIkFwcCBpcyBhbHJlYWR5IGNvbm5lY3RlZC4gQ2FsbCBjbG9zZSgpIGJlZm9yZSBjb25uZWN0aW5nIGFnYWluLiIpO3RoaXMuX2luaXRpYWxpemVkU2VudD0hMSxhd2FpdCBzdXBlci5jb25uZWN0KG4pO3RyeXtsZXQgbz1hd2FpdCB0aGlzLnJlcXVlc3Qoe21ldGhvZDoidWkvaW5pdGlhbGl6ZSIscGFyYW1zOnthcHBDYXBhYmlsaXRpZXM6dGhpcy5fY2FwYWJpbGl0aWVzLGFwcEluZm86dGhpcy5fYXBwSW5mbyxwcm90b2NvbFZlcnNpb246ciR9fSx3JCxyKTtpZihvPT09dm9pZCAwKXRocm93IEVycm9yKGBTZXJ2ZXIgc2VudCBpbnZhbGlkIGluaXRpYWxpemUgcmVzdWx0OiAke299YCk7dGhpcy5faG9zdENhcGFiaWxpdGllcz1vLmhvc3RDYXBhYmlsaXRpZXMsdGhpcy5faG9zdEluZm89by5ob3N0SW5mbyx0aGlzLl9ob3N0Q29udGV4dD1vLmhvc3RDb250ZXh0LGF3YWl0IHRoaXMubm90aWZpY2F0aW9uKHttZXRob2Q6InVpL25vdGlmaWNhdGlvbnMvaW5pdGlhbGl6ZWQifSksdGhpcy5faW5pdGlhbGl6ZWRTZW50PSEwLHRoaXMub3B0aW9ucz8uYXV0b1Jlc2l6ZSYmdGhpcy5zZXR1cFNpemVDaGFuZ2VkTm90aWZpY2F0aW9ucygpfWNhdGNoKG8pe3Rocm93IHRoaXMuY2xvc2UoKSxvfX19Y29uc3QgT209e2VuOntsb2FkaW5nOiJMb2FkaW5n4oCmIixvcGVuaW5nOiJPcGVuaW5nIGNoZWNrb3V04oCmIixwYXlpbmc6IlBheWluZyB2aWEge21ldGhvZH3igKYiLGVtcHR5Q2F0YWxvZzoiTm90aGluZyBpbiB0aGUgY2F0YWxvZy4iLG5vT3JkZXJzOiJObyBvcmRlcnMgeWV0IOKAlCBwaWNrIHNvbWV0aGluZyBmcm9tIHRoZSBjYXRhbG9nIGZpcnN0LiIscHJvZHVjdENvdW50OiJ7Y291bnR9IHByb2R1Y3RzIixvcmRlcmVkRmFsbGJhY2s6Ik9yZGVyZWQge3Byb2R1Y3R9IixoYW5kT2ZmQXNrOiJCdXkge3Byb2R1Y3R9IHdpdGggQ3VybGVzcyB3YWxsZXQiLGJhY2s6IuKGkCBDaG9vc2UgYW5vdGhlciB3YXkiLG9yZGVyQWdhaW46Ik9yZGVyIGFub3RoZXIiLHZpZXdPcmRlcnM6IlZpZXcgbXkgb3JkZXJzIOKGkiIsb3JkZXJlZDoiT3JkZXJlZCIsbm90Q29tcGxldGVkOiJOb3QgY29tcGxldGVkIixvbmVTdGVwTGVmdDoiT25lIHN0ZXAgbGVmdCIsc2lnbkluOiJTaWduIGluIHRvIEN1cmxlc3MiLHNpZ25JbkdvOiJTaWduIGluIOKGlyIsc2lnbkluV2FpdDoiVGhpcyBjYXJkIHJlY29ubmVjdHMgb24gaXRzIG93biBvbmNlIHlvdSBhcmUgaW4uIEJpbmRpbmcgYSBjYXJkIGhhcHBlbnMgdGhlcmUgdG9vLiIsc2lnbmVkSW5QYXlpbmc6IlNpZ25lZCBpbiBhcyB7ZW1haWx9IOKAlCBwYXlpbmfigKYiLHNpZ25JbkV4cGlyZWQ6IlRoYXQgc2lnbi1pbiB0aW1lZCBvdXQg4oCUIHN0YXJ0IGl0IGFnYWluIGFib3ZlLiIsc2lnbkluTmV2ZXJTdGFydGVkOiJObyBzaWduLWluIHN0YXJ0ZWQgeWV0IOKAlCB1c2UgdGhlIGxpbmsgYWJvdmUuIixvcmRlcnNGYWlsZWQ6IkNvdWxkIG5vdCBsb2FkIHlvdXIgb3JkZXJzLiIsd2FsbGV0U2FpZE5vOiJXYWxsZXQgc2FpZCBubyIsb3BlbldhbGxldDoiT3BlbiB3YWxsZXQg4oaXIixnb1BheToiR28gcGF5IOKGlyIscGF5V2FpdDoiQXBwcm92ZSBpdCBpbiB5b3VyIGJyb3dzZXIgYW5kIHRoaXMgY2FyZCB0dXJucyBpbnRvIGEgcmVjZWlwdCBvbiBpdHMgb3duLiIscGF5VGltZW91dDoiTm8gcGF5bWVudCByZWNlaXZlZCB5ZXQuIE9uY2UgeW91IGhhdmUgcGFpZCwgY2hlY2sg4oCcbXkgb3JkZXJz4oCdLiIsaGFuZGVkT3ZlcjoiSGFuZGVkIHRvIHlvdXIgYXNzaXN0YW50IixoYW5kZWRPdmVyQm9keToiVGhpcyBvbmUgaXMgcGFpZCBmcm9tIHRoZSBDdXJsZXNzIHdhbGxldCBjb25uZWN0b3IgeW91IGluc3RhbGxlZCDigJQgdGhlIGNyZWRlbnRpYWwgbGl2ZXMgdGhlcmUsIGFuZCB0aGlzIGNhcmQgY2Fubm90IHJlYWNoIGl0LiIsaGFuZGVkT3ZlcldhaXQ6IllvdXIgYXNzaXN0YW50IHdpbGwgb3BlbiB0aGUgY2hlY2tvdXQsIGdldCB5b3Ugc2lnbmVkIGluIGlmIG5lZWRlZCwgYW5kIGNvbmZpcm0gdGhlIGFtb3VudCB3aXRoIHlvdSBiZWZvcmUgYW55dGhpbmcgaXMgY2hhcmdlZC4iLHJlZnVuZDoiUmVxdWVzdCBhIHJlZnVuZCIscmVmdW5kaW5nOiJXb3JraW5n4oCmIixyZWZ1bmRGYWlsZWQ6IlRoZSByZWZ1bmQgcmVxdWVzdCBmYWlsZWQiLG9uQ2hhaW5UeDoiT24tY2hhaW4gdHg6IixwYWlkQnk6IlBhaWQgYnk6IixjYW5ub3RPcGVuOiJDb3VsZCBub3Qgb3BlbiB0aGUgY2hlY2tvdXQiLGNhcmRGYWlsZWQ6IlRoZSBjYXJkIGNvdWxkIG5vdCBsb2FkIixub3RoaW5nVG9TaG93OiJOb3RoaW5nIHRvIHNob3cgaGVyZSIsbm90aGluZ1RvU2hvd0JvZHk6IkFzayBmb3IgYSBwcm9kdWN0IGJ5IG5hbWUsIG9yIGZvciB0aGUgY2F0YWxvZy4iLHJlZnJlc2g6IlJlZnJlc2giLG9yZGVyc1RpdGxlOiJNeSBvcmRlcnMifSx6aDp7bG9hZGluZzoi5Yqg6L295Lit4oCmIixvcGVuaW5nOiLmraPlnKjlvIDnu5PotKbigKYiLHBheWluZzoi5q2j5Zyo6YCa6L+HIHttZXRob2R9IOe7k+eul+KApiIsZW1wdHlDYXRhbG9nOiLnm67lvZXph4zmsqHmnInllYblk4HjgIIiLG5vT3JkZXJzOiLov5jmsqHmnInorqLljZUg4oCU4oCUIOWFiOS7juebruW9lemHjOaMkeS4gOS7tuOAgiIscHJvZHVjdENvdW50OiJ7Y291bnR9IOS7tuWVhuWTgSIsb3JkZXJlZEZhbGxiYWNrOiLlt7LkuIvljZUge3Byb2R1Y3R9IixoYW5kT2ZmQXNrOiLnlKggQ3VybGVzcyDpkrHljIXkubB7cHJvZHVjdH0iLGJhY2s6IuKGkCDmjaLkuKrmlK/ku5jmlrnlvI8iLG9yZGVyQWdhaW46IuWGjeiuouS4gOasoSIsdmlld09yZGVyczoi5p+l55yL5oiR55qE6K6i5Y2VIOKGkiIsb3JkZXJlZDoi5bey5LiL5Y2VIixub3RDb21wbGV0ZWQ6IuacquWujOaIkCIsb25lU3RlcExlZnQ6Iui/mOW3ruS4gOatpSIsc2lnbkluOiLnmbvlvZUgQ3VybGVzcyDpkrHljIUiLHNpZ25JbkdvOiLljrvnmbvlvZUg4oaXIixzaWduSW5XYWl0OiLnmbvlvZXlrozov5nlvKDljaHkvJroh6rlt7HmjqXkuIrjgILnu5HljaHkuZ/lnKjlkIzkuIDkuKrpobXpnaLph4zjgIIiLHNpZ25lZEluUGF5aW5nOiLlt7LnmbvlvZUge2VtYWlsfSDigJTigJQg5q2j5Zyo5LuY5qy+4oCmIixzaWduSW5FeHBpcmVkOiLnmbvlvZXotoXml7bkuoYs54K55LiK6Z2i6YeN5paw5p2l5LiA5qyh44CCIixzaWduSW5OZXZlclN0YXJ0ZWQ6Iui/mOayoeW8gOWni+eZu+W9lSDigJTigJQg54K55LiK6Z2i6YKj5Liq6ZO+5o6l44CCIixvcmRlcnNGYWlsZWQ6IuiuouWNleWKoOi9veWksei0peOAgiIsd2FsbGV0U2FpZE5vOiLpkrHljIXmnKrmlL7ooYwiLG9wZW5XYWxsZXQ6IuaJk+W8gOmSseWMhSDihpciLGdvUGF5OiLljrvku5jmrL4g4oaXIixwYXlXYWl0OiLlnKjmtY/op4jlmajph4zmibnlh4blkI4s6L+Z5byg5Y2h5Lya6Ieq5bex5Y+Y5oiQ5pS25o2u44CCIixwYXlUaW1lb3V0Oifov5jmsqHmlLbliLDku5jmrL7jgILku5jlrozngrnkuIDkuIsi5oiR55qE6K6i5Y2VIueci+eci+OAgicsaGFuZGVkT3Zlcjoi5Lqk57uZ5Yqp5omL57un57utIixoYW5kZWRPdmVyQm9keToi6L+Z56yU6KaB55So5L2g6Ieq5bex6KOF55qEIEN1cmxlc3Mg6ZKx5YyF6L+e5o6l5Zmo5LuYIOKAlOKAlCDlh63mja7lnKjpgqPkuKrov57mjqXlmajph4ws6L+Z5byg5Y2h5aSf5LiN5Yiw5a6D44CCIixoYW5kZWRPdmVyV2FpdDoi5Yqp5omL5Lya5YWI6K6p5L2g55m75b2V6ZKx5YyFLOWGjemTuOS4gOW8oOWHreaNruWujOaIkOS7mOasvizmiaPmrL7liY3kvJrot5/kvaDnoa7orqTph5Hpop3jgIIiLHJlZnVuZDoi55Sz6K+36YCA5qy+IixyZWZ1bmRpbmc6IuWkhOeQhuS4reKApiIscmVmdW5kRmFpbGVkOiLpgIDmrL7nlLPor7flpLHotKUiLG9uQ2hhaW5UeDoi6ZO+5LiK5Lqk5piTOiIscGFpZEJ5OiLku5jmrL7mlrnlvI86IixjYW5ub3RPcGVuOiLmiZPkuI3lvIDnu5PotKYiLGNhcmRGYWlsZWQ6IuWNoeeJh+WKoOi9veWksei0pSIsbm90aGluZ1RvU2hvdzoi6L+Z6YeM5rKh5pyJ5Y+v5pi+56S655qE5YaF5a65Iixub3RoaW5nVG9TaG93Qm9keToi6K+05Ye65ZWG5ZOB5ZCN5a2XLOaIluiAheiuqeaIkeaJk+W8gOebruW9leOAgiIscmVmcmVzaDoi5Yi35pawIixvcmRlcnNUaXRsZToi5oiR55qE6K6i5Y2VIn19LE49dD0+ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodCksaz10PT5TdHJpbmcodD8/IiIpLnJlcGxhY2UoL1smPD4iJ10vZyxuPT4oeyImIjoiJmFtcDsiLCI8IjoiJmx0OyIsIj4iOiImZ3Q7IiwnIic6IiZxdW90OyIsIiciOiImIzM5OyJ9KVtuXSksUG49KHQsbik9PnQucmVwbGFjZSgvXHsoXHcrKVx9L2csKHIsbyk9PlN0cmluZyhuW29dPz9yKSksb2U9bmV3IGFzKHtuYW1lOiJzaW5vY2FyZS1jaGVja291dCIsdmVyc2lvbjoiMi4wLjAifSk7bGV0IHo9T20uZW4sQj1udWxsLHdlPW51bGwsSmU9W107Y29uc3QgVW09dD0+e2NvbnN0IG49dD8ubGFuZzsobj09PSJlbiJ8fG49PT0iemgiKSYmKHo9T21bbl0pfSx6JD0odCxuLHIpPT5gZyR7dH1yJHtufWEke3J9YCxQbT10PT57Y29uc3Qgbj0vXmcoXGQrKXIoXGQrKWEoXGQrKSQvLmV4ZWModCk7aWYoIW58fCFCKXJldHVybjtjb25zdCByPUIuZ3JvdXBzW051bWJlcihuWzFdKV0/LnJvd3NbTnVtYmVyKG5bMl0pXSxvPXI/LmFjdGlvbnNbTnVtYmVyKG5bM10pXTtpZighcnx8IW8pcmV0dXJuO2NvbnN0IGU9ci5hY3Rpb25zLmxlbmd0aD4xP2Ake3IudGl0bGV9IMK3ICR7by5sYWJlbH1gOnIudGl0bGU7cmV0dXJuey4uLm8scm93OnIudGl0bGUsZGlzcGxheTplfX0sX3Q9KHQsbik9Pntjb25zdCByPSgpPT57b2Uub3Blbkxpbmsoe3VybDpufSkuY2F0Y2goKCk9PndpbmRvdy5vcGVuKG4sIl9ibGFuayIpKX0sbz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0KTtvPy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsciksbz8uYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsZT0+eyhlLmtleT09PSJFbnRlciJ8fGUua2V5PT09IiAiKSYmcigpfSl9LEllPSgpPT5gPGJ1dHRvbiBjbGFzcz0iYmFjayIgaWQ9ImJhY2siPiR7ayh6LmJhY2spfTwvYnV0dG9uPmAsVWU9KCk9PntOKCJiYWNrIik/LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwoKT0+e2lmKEIpcmV0dXJuIGNzKEIpO2lmKHdlKXJldHVybiBzcyh3ZSl9KX0seCQ9KCk9PmA8YnV0dG9uIGNsYXNzPSJnbyIgaWQ9Im9yZGVycyI+JHtrKHoudmlld09yZGVycyl9PC9idXR0b24+YCxUJD0oKT0+e04oIm9yZGVycyIpPy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsKCk9PntOKCJjb250ZW50IikuaW5uZXJIVE1MPWA8ZGl2IGNsYXNzPSJzcGluIj4ke2soei5sb2FkaW5nKX08L2Rpdj5gLE5tKCl9KX0seHQ9dD0+e04oImNvbnRlbnQiKS5pbm5lckhUTUw9YDxkaXYgY2xhc3M9InJlc3VsdCI+PHNwYW4gY2xhc3M9ImJhZGdlIGVyciI+JHtrKHouY2FyZEZhaWxlZCl9PC9zcGFuPjxkaXYgY2xhc3M9ImxpbmUiPiR7ayh0KX08L2Rpdj48L2Rpdj5gfTtsZXQgbWk9bnVsbCxvaT0hMTtjb25zdCBpaT10PT57bWk9dDtjb25zdCBuPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJyZWZyZXNoIik7biYmKG4uaGlkZGVuPSF0LG4udGl0bGU9ei5yZWZyZXNoLG4uc2V0QXR0cmlidXRlKCJhcmlhLWxhYmVsIix6LnJlZnJlc2gpKX0saiQ9KCk9Pntjb25zdCB0PWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJyZWZyZXNoIik7dCYmdC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsKCk9PntpZihvaXx8IW1pKXJldHVybjtvaT0hMCx0LmRpc2FibGVkPSEwLHQuY2xhc3NMaXN0LmFkZCgiYnVzeSIpO2NvbnN0IG49KCk9PntvaT0hMTtjb25zdCByPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJyZWZyZXNoIik7ciYmKHIuZGlzYWJsZWQ9ITEsci5jbGFzc0xpc3QucmVtb3ZlKCJidXN5IikpfTttaSgpLnRoZW4obixuKX0pfSxzcz10PT57d2U9dCxCPW51bGwsaWkobnVsbCk7Y29uc3Qgbj10LnByb2R1Y3RzPz9bXTtOKCJtZXJjaGFudCIpLnRleHRDb250ZW50PVBuKHoucHJvZHVjdENvdW50LHtjb3VudDpuLmxlbmd0aH0pLE4oImNvbnRlbnQiKS5pbm5lckhUTUw9YDxkaXYgY2xhc3M9InBncmlkIj4ke24ubWFwKChyLG8pPT5gPGRpdiBjbGFzcz0icGNlbGwiPgogICAgICAke3IuaW1hZ2VVcmw/YDxpbWcgY2xhc3M9InBpbWciIHNyYz0iJHtrKHIuaW1hZ2VVcmwpfSIgYWx0PSIiIGxvYWRpbmc9ImxhenkiPmA6YDxkaXYgY2xhc3M9InBpbWcgbm9uZSI+JHtrKHIuY2F0ZWdvcnk/PyIiKX08L2Rpdj5gfQogICAgICA8ZGl2IGNsYXNzPSJwbmFtZSI+JHtrKHIubmFtZSl9PC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9InBtZXRhIj4ke3IucHJpY2VEaXNwbGF5P2soci5wcmljZURpc3BsYXkpOiIifTwvZGl2PgogICAgICA8YnV0dG9uIGNsYXNzPSJhY3QgcGJ1eSIgaWQ9InAke299Ij5CdXk8L2J1dHRvbj4KICAgIDwvZGl2PmApLmpvaW4oIiIpfHxgPGRpdiBjbGFzcz0ici1zdWIiPiR7ayh6LmVtcHR5Q2F0YWxvZyl9PC9kaXY+YH08L2Rpdj5gLG4uZm9yRWFjaCgocixvKT0+TihgcCR7b31gKT8uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCgpPT57TigiY29udGVudCIpLmlubmVySFRNTD1gPGRpdiBjbGFzcz0ic3BpbiI+JHtrKHoub3BlbmluZyl9PC9kaXY+YCxvZS5jYWxsU2VydmVyVG9vbCh7bmFtZToic3RhcnRfc2lub2NhcmVfY2hlY2tvdXQiLGFyZ3VtZW50czp7c2t1OnIuc2t1fX0pLnRoZW4oZT0+e2xldCBpPWU/LnN0cnVjdHVyZWRDb250ZW50O2lmKCFpKXRyeXtpPUpTT04ucGFyc2UoZT8uY29udGVudD8uWzBdPy50ZXh0Pz8ibnVsbCIpfWNhdGNoe31pZihpKXthZT0hMSxscyhpLCEwKTtyZXR1cm59SHMoZT8uY29udGVudD8uWzBdPy50ZXh0Pz8ibm8gYW5zd2VyIGZyb20gdGhlIHN0b3JlZnJvbnQiKX0pLmNhdGNoKGU9PkhzKFN0cmluZyhlPy5tZXNzYWdlPz9lKSkpfSkpfSxIcz10PT57TigiY29udGVudCIpLmlubmVySFRNTD1gPGRpdiBjbGFzcz0icmVzdWx0Ij4KICAgIDxzcGFuIGNsYXNzPSJiYWRnZSBlcnIiPiR7ayh6LmNhbm5vdE9wZW4pfTwvc3Bhbj4KICAgIDxkaXYgY2xhc3M9ImxpbmUiPiR7ayh0KX08L2Rpdj4KICAgICR7SWUoKX08L2Rpdj5gLFVlKCl9LE8kPSh0LG4scik9Pntjb25zdCBvPXIuYWN0aW9ucy5tYXAoKGUsaSk9PmA8YnV0dG9uIGRhdGEtYWN0PSIke3okKHQsbixpKX0iIGNsYXNzPSIke2UuZXh0PyJhY3QgZXh0IjoiYWN0In0iPiR7ayhlLmxhYmVsKX0ke2UuZXh0PyIg4oaXIjoiIOKGkiJ9PC9idXR0b24+YCkuam9pbigiIik7cmV0dXJuYDxkaXYgY2xhc3M9InJvdyI+CiAgICAgIDxkaXYgY2xhc3M9InJvdy1tYWluIj48c3BhbiBjbGFzcz0ici10aXRsZSI+JHtrKHIudGl0bGUpfTwvc3Bhbj48c3BhbiBjbGFzcz0ici1zdWIiPiR7ayhyLnN1Yil9PC9zcGFuPjwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJyb3ctYWN0cyI+JHtvfTwvZGl2PgogICAgPC9kaXY+YH0sY3M9dD0+e2lpKG51bGwpLEI9dCx3ZT13ZT8/bnVsbCxOKCJtZXJjaGFudCIpLnRleHRDb250ZW50PXQucHJvZHVjdC5za3U7Y29uc3Qgbj0odC5ncm91cHM/P1tdKS5tYXAoKG8sZSk9PmA8ZGl2IGNsYXNzPSJncm91cC1sYWJlbCI+JHtrKG8ubGFiZWwpfTwvZGl2PjxkaXYgY2xhc3M9InJvd3MiPiR7by5yb3dzLm1hcCgoaSxhKT0+TyQoZSxhLGkpKS5qb2luKCIiKX08L2Rpdj5gKS5qb2luKCIiKSxyPXQucHJvZHVjdC5pbWFnZVVybD9gPGltZyBjbGFzcz0iaGVybyIgc3JjPSIke2sodC5wcm9kdWN0LmltYWdlVXJsKX0iIGFsdD0iJHtrKHQucHJvZHVjdC5uYW1lKX0iIG9uZXJyb3I9InRoaXMucmVtb3ZlKCkiPmA6IiI7TigiY29udGVudCIpLmlubmVySFRNTD1gCiAgICAke3J9CiAgICA8ZGl2IGNsYXNzPSJwcmljZSI+JHtrKHQucHJvZHVjdC5wcmljZURpc3BsYXk/PyIiKX08L2Rpdj4KICAgIDxkaXYgY2xhc3M9InN1YiI+JHtrKHQucHJvZHVjdC5uYW1lKX0ke3QucXVhbnRpdHk+MT9gIMOXICR7dC5xdWFudGl0eX1gOiIifTwvZGl2PgogICAgJHtufQogICAgICAke3dlP0llKCk6IiJ9YDtmb3IoY29uc3QgbyBvZiBBcnJheS5mcm9tKE4oImNvbnRlbnQiKS5xdWVyeVNlbGVjdG9yQWxsKCJidXR0b25bZGF0YS1hY3RdIikpKW8uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCgpPT5EbShvLmRhdGFzZXQuYWN0KSk7TigiYmFjayIpPy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsKCk9PndlJiZzcyh3ZSkpfSxObT0odD0hMSk9Pm9lLmNhbGxTZXJ2ZXJUb29sKHtuYW1lOiJsaXN0X215X29yZGVycyIsYXJndW1lbnRzOnt9fSkudGhlbihuPT57Y29uc3Qgcj1uPy5zdHJ1Y3R1cmVkQ29udGVudDtyPy52aWV3PT09Im9yZGVycyI/dXMocik6dHx8eHQoei5vcmRlcnNGYWlsZWQpfSkuY2F0Y2gobj0+e3R8fHh0KFN0cmluZyhuPy5tZXNzYWdlPz9uKSl9KSxVJD10PT4vY2FwdHVyZWR8Y29tcGxldGVkfHBhaWQvaS50ZXN0KHQuc3RhdHVzKSYmIS9yZWZ1bmQvaS50ZXN0KHQuc3RhdHVzKSYmIXQucmVmdW5kUGVuZGluZyxQJD10PT57Y29uc3Qgbj1TdHJpbmcodCkudG9Mb3dlckNhc2UoKTtyZXR1cm5gPHNwYW4gY2xhc3M9Im9zdGF0ICR7L3JlZnVuZC8udGVzdChuKT8id2FybiI6L2NhcHR1cmVkfGNvbXBsZXRlZHxwYWlkfHNldHRsZWQvLnRlc3Qobik/Im9rIjoibXV0ZWQifSI+JHtrKHQpfTwvc3Bhbj5gfSx1cz10PT57aWYoVW0odCksSmU9dC5vcmRlcnM/P1tdLEI9bnVsbCxOKCJtZXJjaGFudCIpLnRleHRDb250ZW50PXoub3JkZXJzVGl0bGUsaWkoKCk9Pk5tKCEwKSksIUplLmxlbmd0aCl7TigiY29udGVudCIpLmlubmVySFRNTD1gPGRpdiBjbGFzcz0iZW1wdHkiPiR7ayh6Lm5vT3JkZXJzKX08L2Rpdj5gO3JldHVybn1OKCJjb250ZW50IikuaW5uZXJIVE1MPWA8ZGl2IGNsYXNzPSJyb3dzIG9saXN0Ij4ke0plLm1hcCgobixyKT0+e2NvbnN0IG89W24udG90YWwsbi5wcm90b2NvbCxuLmRhdGVdLmZpbHRlcihCb29sZWFuKS5tYXAoaykuam9pbigiIMK3ICIpO3JldHVybmA8ZGl2IGNsYXNzPSJyb3ciIGRhdGEtcm93PSIke3J9Ij4KICAgICAgPGRpdiBjbGFzcz0icm93LW1haW4iPjxzcGFuIGNsYXNzPSJyLXRpdGxlIj4ke2sobi5wcm9kdWN0fHxuLm9yZGVySWQpfTwvc3Bhbj48c3BhbiBjbGFzcz0ici1zdWIiPiR7b308L3NwYW4+PC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9InJvdy1hY3RzIj4KICAgICAgICAke1AkKG4uc3RhdHVzKX0KICAgICAgICAke1UkKG4pP2A8YnV0dG9uIGNsYXNzPSJhY3QiIGRhdGEtcmVmdW5kPSIke3J9Ij4ke2soei5yZWZ1bmQpfTwvYnV0dG9uPmA6IiJ9CiAgICAgIDwvZGl2PgogICAgPC9kaXY+YH0pLmpvaW4oIiIpfTwvZGl2PmA7Zm9yKGNvbnN0IG4gb2YgQXJyYXkuZnJvbShOKCJjb250ZW50IikucXVlcnlTZWxlY3RvckFsbCgiYnV0dG9uW2RhdGEtcmVmdW5kXSIpKSluLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwoKT0+TiQoTnVtYmVyKG4uZGF0YXNldC5yZWZ1bmQpKSl9LE4kPXQ9Pntjb25zdCBuPUplW3RdO2lmKCFuKXJldHVybjtjb25zdCByPU4oImNvbnRlbnQiKS5xdWVyeVNlbGVjdG9yKGBidXR0b25bZGF0YS1yZWZ1bmQ9IiR7dH0iXWApLG89TigiY29udGVudCIpLnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLXJvdz0iJHt0fSJdYCk7bz8ucXVlcnlTZWxlY3RvcigiLm8tZXJyIik/LnJlbW92ZSgpLHImJihyLmRpc2FibGVkPSEwLHIudGV4dENvbnRlbnQ9ei5yZWZ1bmRpbmcpO2NvbnN0IGU9aT0+e2lmKHImJihyLmRpc2FibGVkPSExLHIudGV4dENvbnRlbnQ9ei5yZWZ1bmQpLCFvKXJldHVybjtjb25zdCBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2EuY2xhc3NOYW1lPSJvLWVyciIsYS50ZXh0Q29udGVudD1pLG8uYXBwZW5kQ2hpbGQoYSl9O29lLmNhbGxTZXJ2ZXJUb29sKHtuYW1lOiJyZXF1ZXN0X3JlZnVuZCIsYXJndW1lbnRzOntvcmRlcklkOm4ub3JkZXJJZH19KS50aGVuKGk9PntsZXQgYT17fTt0cnl7YT1KU09OLnBhcnNlKGk/LmNvbnRlbnQ/LlswXT8udGV4dD8/Int9Iil9Y2F0Y2h7fWlmKGk/LmlzRXJyb3J8fGEucmVxdWVzdGVkPT09ITEpe2UoU3RyaW5nKGk/LmNvbnRlbnQ/LlswXT8udGV4dD8/YS5tZXNzYWdlPz96LnJlZnVuZEZhaWxlZCkpO3JldHVybn1KZVt0XT17Li4ubixzdGF0dXM6YS5zdGF0dXM/PyJyZWZ1bmQgcmVxdWVzdGVkIixyZWZ1bmRQZW5kaW5nOiEwfSx1cyh7b3JkZXJzOkplfSl9KS5jYXRjaChpPT5lKFN0cmluZyhpPy5tZXNzYWdlPz9pPz96LnJlZnVuZEZhaWxlZCkpKX0sRCQ9KCk9PntpZighQilyZXR1cm47Y29uc3QgdD1CLnByb2R1Y3Q7TigiY29udGVudCIpLmlubmVySFRNTD1gPGRpdiBjbGFzcz0icmVzdWx0Ij4KICAgIDxzcGFuIGNsYXNzPSJiYWRnZSB0b2RvIj4ke2soei5oYW5kZWRPdmVyKX08L3NwYW4+CiAgICA8ZGl2IGNsYXNzPSJsaW5lIj4ke2soei5oYW5kZWRPdmVyQm9keSl9PC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJtb25vIj4ke2sodC5uYW1lKX0ke3QucHJpY2VEaXNwbGF5P2AgwrcgJHtrKHQucHJpY2VEaXNwbGF5KX1gOiIifTwvZGl2PgogICAgPGRpdiBjbGFzcz0ibGluZSB3YWl0aW5nIj4ke2soei5oYW5kZWRPdmVyV2FpdCl9PC9kaXY+CiAgICAke0llKCl9PC9kaXY+YCxVZSgpO2NvbnN0IG49UG4oei5oYW5kT2ZmQXNrLHtwcm9kdWN0OmAke3QubmFtZX0ke0IucXVhbnRpdHk+MT9gIMOXICR7Qi5xdWFudGl0eX1gOiIifWB9KTtvZS5zZW5kTWVzc2FnZSh7cm9sZToidXNlciIsY29udGVudDpbe3R5cGU6InRleHQiLHRleHQ6bn1dfSkuY2F0Y2goKCk9Pnt9KX0sRG09dD0+e2NvbnN0IG49UG0odCk7aWYoISghbnx8IUIpKXtpZihuLmNoYXQpe0QkKCk7cmV0dXJufU4oImNvbnRlbnQiKS5pbm5lckhUTUw9YDxkaXYgY2xhc3M9InNwaW4iPiR7ayhQbih6LnBheWluZyx7bWV0aG9kOm4uZGlzcGxheX0pKX08L2Rpdj5gLG9lLmNhbGxTZXJ2ZXJUb29sKHtuYW1lOm4udG9vbCxhcmd1bWVudHM6e3NrdTpCLnByb2R1Y3Quc2t1LHF1YW50aXR5OkIucXVhbnRpdHksLi4ubi5hcmdzPz97fX19KS50aGVuKHI9PkpuKHQscikpLmNhdGNoKHI9PkpuKHQse2lzRXJyb3I6ITAsY29udGVudDpbe3RleHQ6U3RyaW5nKHI/Lm1lc3NhZ2U/P3IpfV19KSl9fSxFJD0odCxuLHIpPT57Y29uc3Qgbz1OKCJwd2FpdCIpO2xldCBlPSExO04oImJhY2siKT8uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCgpPT57ZT0hMH0pO2xldCBpPTA7Y29uc3QgYT0oKT0+e2V8fG9lLmNhbGxTZXJ2ZXJUb29sKHtuYW1lOiJnZXRfc2lub2NhcmVfb3JkZXJfc3RhdHVzIixhcmd1bWVudHM6e3Nlc3Npb25JZDp0LG1lcmNoYW50SWQ6bn19KS50aGVuKHM9PntpZihlKXJldHVybjtsZXQgYz17fTt0cnl7Yz1KU09OLnBhcnNlKHM/LmNvbnRlbnQ/LlswXT8udGV4dD8/Int9Iil9Y2F0Y2h7fWlmKGMucGFpZCl7Sm4ocixzKTtyZXR1cm59aWYoKytpPjIwMCl7byYmKG8udGV4dENvbnRlbnQ9ei5wYXlUaW1lb3V0KTtyZXR1cm59c2V0VGltZW91dChhLDNlMyl9KS5jYXRjaCgoKT0+e2V8fHNldFRpbWVvdXQoYSw0ZTMpfSl9O3NldFRpbWVvdXQoYSwzZTMpfSxaJD10PT57Y29uc3Qgbj1OKCJ3d2FpdCIpO2xldCByPSExO04oImJhY2siKT8uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCgpPT57cj0hMH0pO2NvbnN0IG89KCk9PntyfHxvZS5jYWxsU2VydmVyVG9vbCh7bmFtZToiY3VybGVzc193YWxsZXRfbG9naW5fc3RhdHVzIixhcmd1bWVudHM6e319KS50aGVuKGU9PntpZihyKXJldHVybjtsZXQgaT17fTt0cnl7aT1KU09OLnBhcnNlKGU/LmNvbnRlbnQ/LlswXT8udGV4dD8/Int9Iil9Y2F0Y2h7fWlmKGkuc2lnbmVkSW4pe24mJihuLnRleHRDb250ZW50PVBuKHouc2lnbmVkSW5QYXlpbmcse2VtYWlsOmkuZW1haWw/PyIifSkpLERtKHQpO3JldHVybn1pZihpLmV4cGlyZWQpe24mJihuLnRleHRDb250ZW50PXouc2lnbkluRXhwaXJlZCk7cmV0dXJufWlmKGkubmV2ZXJTdGFydGVkKXtuJiYobi50ZXh0Q29udGVudD16LnNpZ25Jbk5ldmVyU3RhcnRlZCk7cmV0dXJufXNldFRpbWVvdXQobywyZTMpfSkuY2F0Y2goKCk9PntyfHxzZXRUaW1lb3V0KG8sM2UzKX0pfTtzZXRUaW1lb3V0KG8sMmUzKX0sSm49KHQsbik9Pntjb25zdCByPVBtKHQpO2xldCBvPXt9O3RyeXtvPUpTT04ucGFyc2Uobj8uY29udGVudD8uWzBdPy50ZXh0Pz8ie30iKX1jYXRjaHt9aWYocj8uZXh0JiZvLnVybCl7TigiY29udGVudCIpLmlubmVySFRNTD1gPGRpdiBjbGFzcz0icmVzdWx0Ij4KICAgICAgPHNwYW4gY2xhc3M9ImJhZGdlIG9rIj4ke2soei5vbmVTdGVwTGVmdCl9PC9zcGFuPgogICAgICA8ZGl2IGNsYXNzPSJsaW5lIj4ke2soby5tZXNzYWdlPz8iIil9PC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImxvZ2lucm93Ij48c3BhbiBjbGFzcz0iYWN0IHByaW1hcnkiIGlkPSJwYXlsaW5rIiByb2xlPSJsaW5rIiB0YWJpbmRleD0iMCI+JHtrKHouZ29QYXkpfTwvc3Bhbj48L2Rpdj4KICAgICAgJHtJZSgpfTwvZGl2PmAsX3QoInBheWxpbmsiLFN0cmluZyhvLnVybCkpLFVlKCk7cmV0dXJufWlmKG8uYXdhaXRpbmdQYXltZW50KXtOKCJjb250ZW50IikuaW5uZXJIVE1MPWA8ZGl2IGNsYXNzPSJyZXN1bHQiPgogICAgICA8c3BhbiBjbGFzcz0iYmFkZ2UgdG9kbyI+JHtrKHoub25lU3RlcExlZnQpfTwvc3Bhbj4KICAgICAgPGRpdiBjbGFzcz0ibGluZSI+JHtrKG8ubWVzc2FnZT8/IiIpfTwvZGl2PgogICAgICAke28udG90YWw/YDxkaXYgY2xhc3M9Im1vbm8iPiR7ayhTdHJpbmcoby50b3RhbCkpfTwvZGl2PmA6IiJ9CiAgICAgICR7by5wYXlVcmw/YDxkaXYgY2xhc3M9ImxvZ2lucm93Ij48c3BhbiBjbGFzcz0iYWN0IHByaW1hcnkiIGlkPSJwZ28iIHJvbGU9ImxpbmsiIHRhYmluZGV4PSIwIj4ke2soei5nb1BheSl9PC9zcGFuPjwvZGl2PgogICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGluZSB3YWl0aW5nIiBpZD0icHdhaXQiPiR7ayh6LnBheVdhaXQpfTwvZGl2PmA6IiJ9CiAgICAgICR7SWUoKX08L2Rpdj5gLG8ucGF5VXJsJiZfdCgicGdvIixTdHJpbmcoby5wYXlVcmwpKSxVZSgpLG8uc2Vzc2lvbklkJiZvLm1lcmNoYW50SWQmJkUkKFN0cmluZyhvLnNlc3Npb25JZCksU3RyaW5nKG8ubWVyY2hhbnRJZCksdCk7cmV0dXJufWlmKG8ubmVlZHNMb2dpbiYmby5sb2dpblVybCl7TigiY29udGVudCIpLmlubmVySFRNTD1gPGRpdiBjbGFzcz0icmVzdWx0Ij4KICAgICAgPHNwYW4gY2xhc3M9ImJhZGdlIHRvZG8iPiR7ayh6LnNpZ25Jbil9PC9zcGFuPgogICAgICA8ZGl2IGNsYXNzPSJsaW5lIj4ke2soby5tZXNzYWdlPz8iIil9PC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImxvZ2lucm93Ij4KICAgICAgICA8c3BhbiBjbGFzcz0iYWN0IHByaW1hcnkiIGlkPSJ3Z28iIHJvbGU9ImxpbmsiIHRhYmluZGV4PSIwIj4ke2soei5zaWduSW5Hbyl9PC9zcGFuPgogICAgICAgICR7by51c2VyQ29kZT9gPHNwYW4gY2xhc3M9InVjb2RlIj4ke2soby51c2VyQ29kZSl9PC9zcGFuPmA6IiJ9CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJsaW5lIHdhaXRpbmciIGlkPSJ3d2FpdCI+JHtrKHouc2lnbkluV2FpdCl9PC9kaXY+CiAgICAgICR7SWUoKX08L2Rpdj5gLF90KCJ3Z28iLFN0cmluZyhvLmxvZ2luVXJsKSksVWUoKSxaJCh0KTtyZXR1cm59aWYoby53YWxsZXRSZWZ1c2VkKXtOKCJjb250ZW50IikuaW5uZXJIVE1MPWA8ZGl2IGNsYXNzPSJyZXN1bHQiPgogICAgICA8c3BhbiBjbGFzcz0iYmFkZ2UgdG9kbyI+JHtrKHoud2FsbGV0U2FpZE5vKX08L3NwYW4+CiAgICAgIDxkaXYgY2xhc3M9ImxpbmUiPiR7ayhvLm1lc3NhZ2U/PyIiKX08L2Rpdj4KICAgICAgJHtvLndhbGxldFVybD9gPGRpdiBjbGFzcz0ibG9naW5yb3ciPjxzcGFuIGNsYXNzPSJhY3QgcHJpbWFyeSIgaWQ9IndvcGVuIiByb2xlPSJsaW5rIiB0YWJpbmRleD0iMCI+JHtrKHoub3BlbldhbGxldCl9PC9zcGFuPjwvZGl2PmA6IiJ9CiAgICAgICR7SWUoKX08L2Rpdj5gLG8ud2FsbGV0VXJsJiZfdCgid29wZW4iLFN0cmluZyhvLndhbGxldFVybCkpLFVlKCk7cmV0dXJufWNvbnN0IGU9by5vcmRlcmVkPz9vLmJvb2tlZDtpZihuPy5pc0Vycm9yfHwoZT09PXZvaWQgMD9vLnN0YXR1cyE9PSJjYXB0dXJlZCImJm8uc3RhdHVzIT09ImNvbXBsZXRlZCI6ZT09PSExKSl7TigiY29udGVudCIpLmlubmVySFRNTD1gPGRpdiBjbGFzcz0icmVzdWx0Ij4KICAgICAgPHNwYW4gY2xhc3M9ImJhZGdlIGVyciI+JHtrKHoubm90Q29tcGxldGVkKX08L3NwYW4+CiAgICAgIDxkaXYgY2xhc3M9ImxpbmUiPiR7ayhvLm1lc3NhZ2U/P28ucmVhc29uPz9uPy5jb250ZW50Py5bMF0/LnRleHQ/PyIiKX08L2Rpdj4KICAgICAgJHtJZSgpfTwvZGl2PmAsVWUoKTtyZXR1cm59RW0obyl9LEVtPXQ9PntpaShudWxsKSxCJiYoTigibWVyY2hhbnQiKS50ZXh0Q29udGVudD1CLnByb2R1Y3Quc2t1KTtjb25zdCBuPXQucGFpZFJsdXNkPz90LnBhaWRVc2RjPz90LnRvdGFsPz8iIixyPXQudHhIYXNoLG89dC5leHBsb3JlcjtOKCJjb250ZW50IikuaW5uZXJIVE1MPWA8ZGl2IGNsYXNzPSJyZXN1bHQiPgogICAgPHNwYW4gY2xhc3M9ImJhZGdlIG9rIj4ke2soei5vcmRlcmVkKX08L3NwYW4+CiAgICA8ZGl2IGNsYXNzPSJsaW5lIj4ke2sodC5tZXNzYWdlPz9Qbih6Lm9yZGVyZWRGYWxsYmFjayx7cHJvZHVjdDp0LnByb2R1Y3Q/P0I/LnByb2R1Y3QubmFtZT8/IiJ9KSl9PC9kaXY+CiAgICAke3QucGF5ZXI/YDxkaXYgY2xhc3M9Im1vbm8iPiR7ayh6LnBhaWRCeSl9ICR7ayhTdHJpbmcodC5wYXllcikpfTwvZGl2PmA6IiJ9CiAgICAke24/YDxkaXYgY2xhc3M9Im1vbm8iPiR7ayhuKX08L2Rpdj5gOiIifQogICAgJHtyP2A8ZGl2IGNsYXNzPSJsaW5lIj4ke2soei5vbkNoYWluVHgpfSAke28/YDxzcGFuIGNsYXNzPSJ0eCIgaWQ9InR4bGluayIgcm9sZT0ibGluayIgdGFiaW5kZXg9IjAiPiR7ayhyKX0g4oaXPC9zcGFuPmA6YDxzcGFuIGNsYXNzPSJtb25vIj4ke2socil9PC9zcGFuPmB9PC9kaXY+YDoiIn0KICAgIDxkaXYgY2xhc3M9ImN0YS1yb3ciPiR7eCQoKX08YnV0dG9uIGNsYXNzPSJiYWNrIiBpZD0iYWdhaW4iPiR7ayh6Lm9yZGVyQWdhaW4pfTwvYnV0dG9uPjwvZGl2PgogIDwvZGl2PmAsciYmbyYmX3QoInR4bGluayIsU3RyaW5nKG8pKSxUJCgpLE4oImFnYWluIik/LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwoKT0+e0ImJmNzKEIpfSl9O2xldCBhZT0hMSxidD1udWxsLHBpPW51bGwsYWk9ITEseXQ9bnVsbDtjb25zdCBscz0odCxuPSExKT0+e2lmKCF0KXJldHVybjtpZihVbSh0KSx0LnZpZXc9PT0icHJvZHVjdHMiKXtzcyh0KSxhZT0hMCxidD1udWxsLHBpPW51bGwsYWk9ITE7cmV0dXJufWlmKHQudmlldz09PSJvcmRlcnMiKXt1cyh0KSxhZT0hMDtyZXR1cm59aWYodC5vcmRlcmVkIT09dm9pZCAwfHx0LmJvb2tlZCE9PXZvaWQgMHx8dC5wYWlkIT09dm9pZCAwfHx0LmF3YWl0aW5nUGF5bWVudHx8dC5uZWVkc0xvZ2lufHx0LndhbGxldFJlZnVzZWQpe2FlPSEwLEpuKCIiLHtjb250ZW50Olt7dGV4dDpKU09OLnN0cmluZ2lmeSh0KX1dfSk7cmV0dXJufWlmKHQudmlldyE9PSJjaGVja291dCJ8fCF0LnByb2R1Y3Q/LnNrdSl7YWV8fChhZT0hMCxOKCJjb250ZW50IikuaW5uZXJIVE1MPWA8ZGl2IGNsYXNzPSJyZXN1bHQiPgogICAgICAgIDxzcGFuIGNsYXNzPSJiYWRnZSB0b2RvIj4ke2soei5ub3RoaW5nVG9TaG93KX08L3NwYW4+CiAgICAgICAgPGRpdiBjbGFzcz0ibGluZSI+JHtrKHoubm90aGluZ1RvU2hvd0JvZHkpfTwvZGl2PjwvZGl2PmApO3JldHVybn1jb25zdCByPXQucHJvZHVjdC5za3U9PT1idCxvPSEhdC5yZWNlaXB0JiYhYWk7aWYoIShhZSYmIW8mJiEobiYmIXIpKSl7aWYoYWU9ITAsYnQ9dC5wcm9kdWN0LnNrdSxwaT10LnByb2R1Y3QubmFtZT8/bnVsbCxhaT0hIXQucmVjZWlwdCx0LnJlY2VpcHQpe0I9dCxFbSh0LnJlY2VpcHQpO3JldHVybn1jcyh0KX19LFIkPSgpPT5vZS5nZXRIb3N0Q29udGV4dCgpPy50b29sSW5mbz8udG9vbD8ubmFtZT8/InN0YXJ0X3Npbm9jYXJlX2NoZWNrb3V0IixIbj0odCxuPSEwKT0+e2NvbnN0IHI9UiQoKTtvZS5jYWxsU2VydmVyVG9vbCh7bmFtZTpyLGFyZ3VtZW50czp7Li4udCwuLi5uP3tfX3JlaHlkcmF0ZToxfTp7fX19KS50aGVuKG89Pntjb25zdCBlPW8/LnN0cnVjdHVyZWRDb250ZW50O2U/bHMoZSk6YWV8fHh0KHoubm90aGluZ1RvU2hvd0JvZHkpfSkuY2F0Y2gobz0+e2FlfHx4dChTdHJpbmcobz8ubWVzc2FnZT8/bykpfSl9LEMkPXQ9Pntjb25zdCBuPXR5cGVvZiB0LnNrdT09InN0cmluZyI/dC5za3UudHJpbSgpOiIiO2lmKG4pcmV0dXJuIG4hPT1idDtjb25zdCByPXR5cGVvZiB0LnF1ZXJ5PT0ic3RyaW5nIj90LnF1ZXJ5LnRyaW0oKToiIjtyZXR1cm4gcj8hYCR7cGk/PyIifSAke2J0Pz8iIn1gLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoci50b0xvd2VyQ2FzZSgpKTohMX07aiQoKTtvZS5vbnRvb2xyZXN1bHQ9dD0+bHModD8uc3RydWN0dXJlZENvbnRlbnQsITApO29lLm9udG9vbGlucHV0PXQ9Pntjb25zdCBuPXQ/LmFyZ3VtZW50cz8/e307aWYoIWFlKXt5dD1uLEhuKG4pO3JldHVybn1DJChuKSYmKHl0PW4sYWU9ITEsSG4obiwhMSkpfTtvZS5vbmhvc3Rjb250ZXh0Y2hhbmdlZD0oKT0+e307b2UuY29ubmVjdCgpLnRoZW4oKCk9Pntjb25zdCB0PW9lLmdldEhvc3RDb250ZXh0KCksbj10Py50b29sSW5mbz8uYXJndW1lbnRzPz90Py50b29sSW5wdXQ/LmFyZ3VtZW50cz8/dD8uYXJndW1lbnRzO24mJiFhZSYmKHl0PW4sSG4oeXQpKSxzZXRUaW1lb3V0KCgpPT57YWV8fEhuKHl0Pz97fSl9LDFlMyl9KS5jYXRjaCh0PT54dChTdHJpbmcodD8ubWVzc2FnZT8/dCkpKTs8L3NjcmlwdD4KICA8L2hlYWQ+CiAgPGJvZHk+CiAgICA8ZGl2IGNsYXNzPSJjYXJkIj4KICAgICAgPGRpdiBjbGFzcz0iaGVhZCI+CiAgICAgICAgPHNwYW4gY2xhc3M9InRpdGxlIj5TaW5vY2FyZTwvc3Bhbj4KICAgICAgICA8c3BhbiBjbGFzcz0ibWVyY2hhbnQiIGlkPSJtZXJjaGFudCI+PC9zcGFuPgogICAgICAgIDxidXR0b24gY2xhc3M9InJlZnJlc2giIGlkPSJyZWZyZXNoIiBoaWRkZW4+CiAgICAgICAgICA8c3ZnIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMi40IgogICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGFyaWEtaGlkZGVuPSJ0cnVlIj4KICAgICAgICAgICAgPHBhdGggZD0iTTIwIDExYTggOCAwIDEgMC0xLjggNiIgLz4KICAgICAgICAgICAgPHBvbHlsaW5lIHBvaW50cz0iMjAgNCAyMCAxMSAxMyAxMSIgLz4KICAgICAgICAgIDwvc3ZnPgogICAgICAgIDwvYnV0dG9uPgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBpZD0iY29udGVudCI+PGRpdiBjbGFzcz0iZW1wdHkiPkxvYWRpbmfigKY8L2Rpdj48L2Rpdj4KICAgIDwvZGl2PgogIDwvYm9keT4KPC9odG1sPgo=',\n 'base64',\n).toString('utf8');\n"],"mappings":"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","names":["query","sku","wallet","sku","quantity","receipt","session","merchantId","reqs","xPayment","paidRes","paid","paidUsdc"]}
|