diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5a7c5614..7fee4a5e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -20,7 +20,7 @@ jobs: test-proposals: runs-on: ubuntu-latest # UNTIL https://github.com/Agoric/agoric-3-proposals/issues/2 - timeout-minutes: 90 + timeout-minutes: 120 steps: - name: free up disk space run: | diff --git a/.gitignore b/.gitignore index 0696c1bd..61b4007f 100644 --- a/.gitignore +++ b/.gitignore @@ -122,12 +122,15 @@ dist # Stores VSCode versions used for testing VSCode extensions .vscode-test -# yarn v2 -.yarn/cache -.yarn/unplugged -.yarn/build-state.yml -.yarn/install-state.gz -.pnp.* +# We preceed with wildcard to allow for yarn installs below root +# https://yarnpkg.com/getting-started/qa#which-files-should-be-gitignored +**/.yarn/* +**/!.yarn/cache +**/!.yarn/patches +**/!.yarn/plugins +**/!.yarn/releases +**/!.yarn/sdks +**/!.yarn/versions # build in CI Dockerfile diff --git a/buildTestImages.ts b/buildTestImages.ts index 873e48c7..7f89b68b 100755 --- a/buildTestImages.ts +++ b/buildTestImages.ts @@ -31,6 +31,7 @@ for (const proposal of proposals) { const cmd = `docker buildx build --load --tag ${name} --target ${target} .`; console.log(cmd); if (!dry) { - execSync(cmd, { stdio: 'inherit' }); + // `time` to output how long each build takes + execSync(`time ${cmd}`, { stdio: 'inherit' }); } } diff --git a/proposals/34:upgrade-10/.yarn/install-state.gz b/proposals/34:upgrade-10/.yarn/install-state.gz deleted file mode 100644 index 63c9d8d6..00000000 Binary files a/proposals/34:upgrade-10/.yarn/install-state.gz and /dev/null differ diff --git a/proposals/43:upgrade-11/.yarn/install-state.gz b/proposals/43:upgrade-11/.yarn/install-state.gz deleted file mode 100644 index 2a612128..00000000 Binary files a/proposals/43:upgrade-11/.yarn/install-state.gz and /dev/null differ diff --git a/proposals/49:smart-wallet-nft/.yarn/install-state.gz b/proposals/49:smart-wallet-nft/.yarn/install-state.gz deleted file mode 100644 index 623a0e46..00000000 Binary files a/proposals/49:smart-wallet-nft/.yarn/install-state.gz and /dev/null differ diff --git a/proposals/55:statom-vaults/.yarn/install-state.gz b/proposals/55:statom-vaults/.yarn/install-state.gz deleted file mode 100644 index 14f2de36..00000000 Binary files a/proposals/55:statom-vaults/.yarn/install-state.gz and /dev/null differ diff --git a/proposals/b:zoe1/.yarnrc.yml b/proposals/b:zoe1/.yarnrc.yml new file mode 100644 index 00000000..3186f3f0 --- /dev/null +++ b/proposals/b:zoe1/.yarnrc.yml @@ -0,0 +1 @@ +nodeLinker: node-modules diff --git a/proposals/b:zoe1/README.md b/proposals/b:zoe1/README.md new file mode 100644 index 00000000..7862b966 --- /dev/null +++ b/proposals/b:zoe1/README.md @@ -0,0 +1,17 @@ +# Proposal to upgrade Zoe to incarnation 1 + +This uses the Zoe in https://github.com/Agoric/agoric-sdk/pull/8453/ + +It's currently a draft proposal, built from that branch with, + +``` +# whatever your checkout +A3P=/opt/agoric/agoric-3-proposals +cd packages/builders +# build the proposal +agoric run scripts/vats/upgrade-zoe.js | tee run-report.txt +# copy the proposal +cp upgrade-zoe* $A3P/proposals/b:zoe1/submission +# copy the bundles built for the proposal +cat run-report.txt | grep install-bundle | sed "s/agd tx swingset install-bundle @//" |xargs -I _ cp _ $A3P/proposals/b:zoe1/submission +``` diff --git a/proposals/b:zoe1/config.json b/proposals/b:zoe1/config.json new file mode 100644 index 00000000..8acfb07d --- /dev/null +++ b/proposals/b:zoe1/config.json @@ -0,0 +1,3 @@ +{ + "type": "/agoric.swingset.CoreEvalProposal" +} diff --git a/proposals/b:zoe1/core-eval-support.js b/proposals/b:zoe1/core-eval-support.js new file mode 100644 index 00000000..61910552 --- /dev/null +++ b/proposals/b:zoe1/core-eval-support.js @@ -0,0 +1,152 @@ +// @ts-check +import { + Far, + makeMarshal, + makeTranslationTable, +} from '../../upgrade-test-scripts/lib/unmarshal.js'; +import { Fail, NonNullish } from '../../upgrade-test-scripts/lib/assert.js'; + +// TODO: factor out ambient authority from these +// or at least allow caller to supply authority. +import { mintIST } from '../../upgrade-test-scripts/lib/econHelpers.js'; +import { agoric } from '../../upgrade-test-scripts/lib/cliHelper.js'; + +// move to unmarshal.js? +const makeBoardUnmarshal = () => { + const synthesizeRemotable = (_slot, iface) => + Far(iface.replace(/^Alleged: /, ''), {}); + + const { convertValToSlot, convertSlotToVal } = makeTranslationTable( + slot => Fail`unknown id: ${slot}`, + synthesizeRemotable, + ); + + return makeMarshal(convertValToSlot, convertSlotToVal); +}; + +export const getContractInfo = async (path, io = {}) => { + const m = makeBoardUnmarshal(); + const { + agoric: { follow = agoric.follow }, + prefix = 'published.', + } = io; + console.log('@@TODO: prevent agoric follow hang', prefix, path); + const txt = await follow('-lF', `:${prefix}${path}`, '-o', 'text'); + const { body, slots } = JSON.parse(txt); + return m.fromCapData({ body, slots }); +}; + +// not really core-eval related +export const testIncludes = (t, needle, haystack, label, sense = true) => { + t.log(needle, sense ? 'in' : 'not in', haystack.length, label, '?'); + const check = sense ? t.deepEqual : t.notDeepEqual; + if (sense) { + t.deepEqual( + haystack.filter(c => c === needle), + [needle], + ); + } else { + t.deepEqual( + haystack.filter(c => c === needle), + [], + ); + } +}; + +/** + * @param {Record} record - e.g. { color: 'blue' } + * @returns {string[]} - e.g. ['--color', 'blue'] + */ +export const flags = record => { + return Object.entries(record) + .map(([k, v]) => [`--${k}`, v]) + .flat(); +}; + +export const txAbbr = tx => { + const { txhash, code, height, gas_used } = tx; + return { txhash, code, height, gas_used }; +}; + +export const loadedBundleIds = swingstore => { + const ids = swingstore`SELECT bundleID FROM bundles`.map(r => r.bundleID); + return ids; +}; + +/** + * @param {string} cacheFn - e.g. /home/me.agoric/cache/b1-DEADBEEF.json + */ +export const bundleDetail = cacheFn => { + const fileName = NonNullish(cacheFn.split('/').at(-1)); + const id = fileName.replace(/\.json$/, ''); + const hash = id.replace(/^b1-/, ''); + return { fileName, endoZipBase64Sha512: hash, id }; +}; + +const importBundleCost = (bytes, price = 0.002) => { + return bytes * price; +}; + +/** + * @typedef {{ + * bundles: string[], + * evals: { permit: string; script: string }[], + * }} ProposalInfo + */ + +const myISTBalance = async (agd, addr, denom = 'uist', unit = 1_000_000) => { + const coins = await agd.query(['bank', 'balances', addr]); + const coin = coins.balances.find(a => a.denom === denom); + return Number(coin.amount) / unit; +}; + +/** + * @param {number} myIST + * @param {number} cost + * @param {{ + * unit?: number, padding?: number, minInitialDebt?: number, + * collateralPrice: number, + * }} opts + * @returns + */ +const mintCalc = (myIST, cost, opts) => { + const { + unit = 1_000_000, + padding = 1, + minInitialDebt = 6, + collateralPrice, + } = opts; + const { round, max } = Math; + const wantMinted = max(round(cost - myIST + padding), minInitialDebt); + const giveCollateral = round(wantMinted / collateralPrice) + 1; + const sendValue = round(giveCollateral * unit); + return { wantMinted, giveCollateral, sendValue }; +}; + +/** + * + * @param {ReturnType} agd + * @param {*} config + * @param {number} bytes total bytes + * @param {{ log: (...args: any[]) => void }} io + * @returns + */ +export const ensureISTForInstall = async (agd, config, bytes, { log }) => { + const cost = importBundleCost(bytes); + log({ totalSize: bytes, cost }); + const { installer } = config; + const addr = agd.lookup(installer); + const istBalance = await myISTBalance(agd, addr); + + if (istBalance > cost) { + log('balance sufficient', { istBalance, cost }); + return; + } + const { sendValue, wantMinted, giveCollateral } = mintCalc( + istBalance, + cost, + config, + ); + log({ wantMinted }); + await mintIST(addr, sendValue, wantMinted, giveCollateral); +}; diff --git a/proposals/b:zoe1/eval.sh b/proposals/b:zoe1/eval.sh new file mode 100644 index 00000000..3cd7eb7a --- /dev/null +++ b/proposals/b:zoe1/eval.sh @@ -0,0 +1,15 @@ +#!/bin/bash + +# Exit when any command fails +set -e + +source /usr/src/upgrade-test-scripts/env_setup.sh + +ls -al + +npm install --global tsx + +./performActions.ts + +# let CORE_EVAL settle +waitForBlock 5 diff --git a/proposals/b:zoe1/package.json b/proposals/b:zoe1/package.json new file mode 100644 index 00000000..8bfac1db --- /dev/null +++ b/proposals/b:zoe1/package.json @@ -0,0 +1,15 @@ +{ + "type": "module", + "license": "Apache-2.0", + "dependencies": { + "@endo/zip": "^0.2.35", + "ava": "^5.3.1", + "better-sqlite3": "^8.5.1", + "execa": "^7.2.0", + "tmp": "^0.2.1" + }, + "scripts": { + "agops": "yarn --cwd /usr/src/agoric-sdk/ --silent agops" + }, + "packageManager": "yarn@4.0.1" +} diff --git a/proposals/b:zoe1/performActions.ts b/proposals/b:zoe1/performActions.ts new file mode 100755 index 00000000..f616b43c --- /dev/null +++ b/proposals/b:zoe1/performActions.ts @@ -0,0 +1,287 @@ +#!/usr/bin/env tsx + +import { execFileSync } from 'child_process'; // TODO: use execa +import * as fsp from 'fs/promises'; +import * as path from 'path'; +import * as process from 'process'; + +import { ZipReader } from '@endo/zip'; +import dbOpen from 'better-sqlite3'; + +import assert from 'assert'; +import { makeAgd } from '../../upgrade-test-scripts/lib/agd-lib.js'; +import { agoric } from '../../upgrade-test-scripts/lib/cliHelper.js'; +import { voteLatestProposalAndWait } from '../../upgrade-test-scripts/lib/commonUpgradeHelpers.js'; +import { dbTool } from '../../upgrade-test-scripts/lib/vat-status.js'; +import { type WebCache } from '../../upgrade-test-scripts/lib/webAsset.js'; +import { + type ProposalInfo, + bundleDetail, + ensureISTForInstall, + flags, + getContractInfo, + loadedBundleIds, + txAbbr, +} from './core-eval-support.js'; + +// TODO move into core-eval-support +const readSubmissions = async () => { + const files = await fsp.readdir('submission'); + const names = files.filter(f => f.endsWith('.js')).map(f => f.slice(0, -3)); + const buildAssets = {} as Record; + for (const name of names) { + const evals = [{ permit: `${name}-permit.json`, script: `${name}.js` }]; + const content = await fsp.readFile(`submission/${name}.js`, 'utf8'); + const bundleIds = content.matchAll(/b1-[a-z0-9]+/g); + const bundles = Array.from(bundleIds).map(id => `${id}.json`); + buildAssets[name] = { evals, bundles }; + } + return buildAssets; +}; + +/** + * URLs of assets, including bundle hashes (to be) agreed by BLD stakers + */ +const assetInfo = { + repo: { + name: 'zoe1', + description: 'first upgrade of Zoe vat', + }, + buildAssets: await readSubmissions(), +}; + +const staticConfig = { + deposit: '10000000ubld', // 10 BLD + installer: 'gov1', // as in: agd keys show gov1 + proposer: 'validator', + collateralPrice: 6, // conservatively low price. TODO: look up + swingstorePath: '~/.agoric/data/agoric/swingstore.sqlite', + title: assetInfo.repo.name, + description: assetInfo.repo.description, + buildInfo: Object.values(assetInfo.buildAssets), +}; + +const makeFakeWebCache = (base: string): WebCache => { + return { + getText(segment: string) { + return fsp.readFile(path.join(base, segment), 'utf8'); + }, + async storedPath(segment: string) { + return path.join(base, segment); + }, + async size(segment: string) { + const info = await fsp.stat(path.join(base, segment)); + return info.size; + }, + toString() { + return 'fake web cache'; + }, + async remove() { + console.warn('noop remove'); + }, + }; +}; + +/** + * Provide access to the outside world via context. + * + * TODO: refactor overlap with mn2-start.test.js + * + * @param {*} t + * @param {object} io + */ +const makeTestContext = async () => { + // assume filenames don't overlap + const bundleAssets = makeFakeWebCache('submission'); + console.log(`bundleAssets: ${bundleAssets}`); + + const config = { + bundleAssets, + chainId: 'agoriclocal', + ...staticConfig, + }; + + const agd = makeAgd({ execFileSync }).withOpts({ + keyringBackend: 'test', + }); + + const dbPath = staticConfig.swingstorePath.replace(/^~/, process.env.HOME!); + const swingstore = dbTool(dbOpen(dbPath, { readonly: true })); + + const before = new Map(); + return { agd, agoric, swingstore, config, before, fetch }; +}; + +// XXX vestige of Ava +const context = await makeTestContext(); + +const step = async (name: string, fn: Function) => { + console.log(name); + await fn(); +}; + +await step('bundles not yet installed', async () => { + const loaded = loadedBundleIds(context.swingstore); + const info = staticConfig.buildInfo; + for (const { bundles, evals } of info) { + console.log( + evals[0].script, + evals.length, + 'eval', + bundles.length, + 'bundles', + ); + for (const bundle of bundles) { + const { id } = bundleDetail(bundle); + assert(!loaded.includes(id)); + } + } +}); + +const bundleEntry = async (bundle: { endoZipBase64: string }) => { + const getZipReader = async () => { + const { endoZipBase64 } = bundle; + const toBlob = (base64, type = 'application/octet-stream') => + fetch(`data:${type};base64,${base64}`).then(res => res.blob()); + const zipBlob = await toBlob(endoZipBase64); + // https://github.com/endojs/endo/issues/1811#issuecomment-1751499626 + const buffer = await zipBlob.arrayBuffer(); + const bytes = new Uint8Array(buffer); + return new ZipReader(bytes); + }; + + const getCompartmentMap = zipRd => { + const { content } = zipRd.files.get('compartment-map.json'); + const td = new TextDecoder(); + const cmap = JSON.parse(td.decode(content)); + return cmap; + }; + + const zipRd = await getZipReader(); + const cmap = getCompartmentMap(zipRd); + return cmap.entry; +}; + +await step('bundle names: compartmentMap.entry', async () => { + const { bundleAssets } = context.config; + const info = staticConfig.buildInfo; + for (const { bundles, evals } of info) { + for (const bundleRef of bundles) { + const { fileName } = bundleDetail(bundleRef); + const bundle = JSON.parse(await bundleAssets.getText(fileName)); + const entry = await bundleEntry(bundle); + console.log(entry, fileName.slice(0, 'b1-12345'.length)); + assert(entry.compartment); + assert(entry.module); + } + } +}); + +const sum = (xs: number[]) => xs.reduce((a, b) => a + b, 0); + +const readBundleSizes = async (assets: WebCache) => { + const info = staticConfig.buildInfo; + const bundleSizes = await Promise.all( + info + .map(({ bundles }) => + bundles.map(b => assets.size(bundleDetail(b).fileName)), + ) + .flat(), + ); + const totalSize = sum(bundleSizes); + return { bundleSizes, totalSize }; +}; + +await step('ensure enough IST to install bundles', async () => { + const { agd, config } = context; + const { totalSize } = await readBundleSizes(config.bundleAssets); + + await ensureISTForInstall(agd, config, totalSize, { + log: console.log, + }); +}); + +await step('ensure bundles installed', async () => { + const { agd, swingstore, agoric, config } = context; + const { chainId, bundleAssets } = config; + const loaded = loadedBundleIds(swingstore); + const from = agd.lookup(config.installer); + + let todo = 0; + let done = 0; + for (const { bundles } of staticConfig.buildInfo) { + todo += bundles.length; + for (const bundle of bundles) { + const { id, fileName, endoZipBase64Sha512 } = bundleDetail(bundle); + if (loaded.includes(id)) { + console.log('bundle already installed', id); + done += 1; + continue; + } + + const bundleRd = await bundleAssets.storedPath(fileName); + const result = await agd.tx( + ['swingset', 'install-bundle', `@${bundleRd}`, '--gas', 'auto'], + { from, chainId, yes: true }, + ); + console.log(txAbbr(result)); + assert.equal(result.code, 0); + + const info = await getContractInfo('bundles', { agoric, prefix: '' }); + console.log(info); + done += 1; + assert.deepEqual(info, { + endoZipBase64Sha512, + error: null, + installed: true, + }); + } + } + assert.equal(todo, done); +}); + +await step('core eval proposal passes', async () => { + const { agd, swingstore, config } = context; + const from = agd.lookup(config.proposer); + const { chainId, deposit, bundleAssets } = config; + const info = { title: config.title, description: config.description }; + console.log('submit proposal', config.title); + + // double-check that bundles are loaded + const loaded = loadedBundleIds(swingstore); + const { buildInfo } = staticConfig; + for (const { bundles } of buildInfo) { + for (const bundle of bundles) { + const { id } = bundleDetail(bundle); + if (!loaded.includes(id)) { + assert.fail(`bundle ${id} not loaded`); + } + } + } + + const evalNames = buildInfo + .map(({ evals }) => evals) + .flat() + .map(e => [e.permit, e.script]) + .flat(); + const evalPaths = await Promise.all( + evalNames.map(e => bundleAssets.storedPath(e)), + ); + const result = await agd.tx( + [ + 'gov', + 'submit-proposal', + 'swingset-core-eval', + ...evalPaths, + ...flags({ ...info, deposit }), + ...flags({ gas: 'auto', 'gas-adjustment': '1.2' }), + ], + { from, chainId, yes: true }, + ); + console.log(txAbbr(result)); + assert.equal(result.code, 0); + + const detail = await voteLatestProposalAndWait(); + console.log(detail.proposal_id, detail.voting_end_time, detail.status); + assert.equal(detail.status, 'PROPOSAL_STATUS_PASSED'); +}); diff --git a/proposals/b:zoe1/post.test.js b/proposals/b:zoe1/post.test.js new file mode 100644 index 00000000..16f8024c --- /dev/null +++ b/proposals/b:zoe1/post.test.js @@ -0,0 +1,7 @@ +import test from 'ava'; +import { getIncarnation } from '../../upgrade-test-scripts/lib/vat-status.js'; + +test(`Zoe vat was upgraded`, async t => { + const incarantion = await getIncarnation('zoe'); + t.is(incarantion, 1); +}); diff --git a/proposals/b:zoe1/submission/b1-a3dc21c56535b4bebdf8c8413650eec2b37a6d9f5669b27f8c571601a6f641ffae2b925dd7e3d67c6953a1f8122c8ba814305e034c9087056816a6f05dd41069.json b/proposals/b:zoe1/submission/b1-a3dc21c56535b4bebdf8c8413650eec2b37a6d9f5669b27f8c571601a6f641ffae2b925dd7e3d67c6953a1f8122c8ba814305e034c9087056816a6f05dd41069.json new file mode 100644 index 00000000..9e79f522 --- /dev/null +++ b/proposals/b:zoe1/submission/b1-a3dc21c56535b4bebdf8c8413650eec2b37a6d9f5669b27f8c571601a6f641ffae2b925dd7e3d67c6953a1f8122c8ba814305e034c9087056816a6f05dd41069.json @@ -0,0 +1,5 @@ +{ + "moduleFormat": "endoZipBase64", + "endoZipBase64": "UEsDBAoAAAAAAAAAAADI67PPNEIAADRCAAAUAAAAY29tcGFydG1lbnQtbWFwLmpzb257CiAgInRhZ3MiOiBbXSwKICAiZW50cnkiOiB7CiAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy92YXRzLXYwLjE1LjEiLAogICAgIm1vZHVsZSI6ICIuL3NyYy9wcm9wb3NhbHMvdXBncmFkZS16b2UtcHJvcG9zYWwuanMiCiAgfSwKICAiY29tcGFydG1lbnRzIjogewogICAgIkBhZ29yaWMvdmF0cy12MC4xNS4xIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL3ZhdHMiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy92YXRzLXYwLjE1LjEiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy92YXRzLXYwLjE1LjEiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9hc3NlcnQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9hc3NlcnQtdjAuNi4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvYXNzZXJ0LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvZXJ0cCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2VydHAtdjAuMTYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvZ292ZXJuYW5jZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2dvdmVybmFuY2UtdjAuMTAuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvaW50ZXJuYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL25ldHdvcmsiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9uZXR3b3JrLXYwLjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvbmV0d29yay9leHBvcnRlZC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL25ldHdvcmstdjAuMS4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9leHBvcnRlZC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL25vdGlmaWVyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbm90aWZpZXItdjAuNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9ub3RpZmllci9leHBvcnRlZC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZXhwb3J0ZWQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9ub3RpZmllci9zdWJzY3JpYmUuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9ub3RpZmllci12MC42LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3N1YnNjcmliZS5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL25vdGlmaWVyL3Rvb2xzL3Rlc3RTdXBwb3J0cy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vdG9vbHMvdGVzdFN1cHBvcnRzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3RvcmUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zdG9yZS12MC45LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3N3aW5nc2V0LXZhdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N3aW5nc2V0LXZhdC12MC4zMi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy90aW1lIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvdGltZS12MC4zLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvdmF0LWRhdGEiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy92YXQtZGF0YS12MC41LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3ZhdHMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy92YXRzLXYwLjE1LjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvem9lIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvem9lLXYwLjI2LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy96b2VTZXJ2aWNlL3pvZS5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3pvbmUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy96b25lLXYwLjIuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvem9uZS9kdXJhYmxlLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvem9uZS12MC4yLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2R1cmFibGUuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy96b25lL2hlYXAuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy96b25lLXYwLjIuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaGVhcC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3pvbmUvdmlydHVhbC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3pvbmUtdjAuMi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi92aXJ0dWFsLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2ZhciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9mYXItdjAuMi4yMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2ltcG9ydC1idW5kbGUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vaW1wb3J0LWJ1bmRsZS12MC40LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9pbXBvcnQtYnVuZGxlL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9pbXBvcnQtYnVuZGxlLXYwLjQuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2ltcG9ydC1idW5kbGUvc291cmNlLW1hcC1ub2RlLXBvd2Vycy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9pbXBvcnQtYnVuZGxlLXYwLjQuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc291cmNlLW1hcC1ub2RlLXBvd2Vycy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9pbXBvcnQtYnVuZGxlL3NvdXJjZS1tYXAtbm9kZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9pbXBvcnQtYnVuZGxlLXYwLjQuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc291cmNlLW1hcC1ub2RlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL21hcnNoYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbWFyc2hhbC12MC44LjkiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL25hdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9uYXQtdjQuMS4zMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL25hdC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbmF0LXY0LjEuMzEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXR0ZXJucyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXR0ZXJucy12MC4yLjYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3BhdHRlcm5zL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXR0ZXJucy12MC4yLjYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjYwIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi42MCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3NoaW0uanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi42MCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJpbXBvcnQtbWV0YS1yZXNvbHZlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogImltcG9ydC1tZXRhLXJlc29sdmUtdjIuMi4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJqZXNzaWUuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiamVzc2llLmpzLXYwLjMuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL21haW4uanMiCiAgICAgICAgfSwKICAgICAgICAiamVzc2llLmpzL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJqZXNzaWUuanMtdjAuMy4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcHJvcG9zYWxzL3VwZ3JhZGUtem9lLXByb3Bvc2FsLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wcm9wb3NhbHMvdXBncmFkZS16b2UtcHJvcG9zYWwuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlZjkwYjRiZGIxMWI0NTRmNTdmNDNjMzQyZjMzNTQyOTBhMDUzMjNmMTUwYzY4MmQ0MTVjN2EzOTM5NWRmMDdkYjAwNTkwMmZiYTNjMTE3NjBkZDM1YWFjNDA1NzkxZTIzYjE0ZmY1Mjc1ODlkMTJlZjcyMWRkYzgxMzNlZGQzOCIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vZW52LW9wdGlvbnMtdjAuMS40IjogewogICAgICAibmFtZSI6ICJAZW5kby9lbnYtb3B0aW9ucyIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9lbnYtb3B0aW9ucy12MC4xLjQiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vZW52LW9wdGlvbnMtdjAuMS40IiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2Vudi1vcHRpb25zIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vudi1vcHRpb25zLXYwLjEuNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZW52LW9wdGlvbnMvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vudi1vcHRpb25zLXYwLjEuNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2ZTEwNmVlNmFmODkzOTRkMGRkYjNlMmFmYjMyNjdkMzE3MjY3N2EwYzdjYTk2OWQ1YTEyM2ZmMDkwNDJiMjcxNzUxYzNjODU5MDI0MjBkNWU4YjEwOGI3NWZkNzdiZDYzNTU1MGI2NTM4MDVjYTg3OGQ4ODBjNTA1YmZlZmYwMCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lbnYtb3B0aW9ucy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZW52LW9wdGlvbnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmMDFiMzE3ZTkzYjdmNzRhNzEzNzI2NzBlY2I2ZWFjNTc2OGNhNmVmMThmZDE0OGU5ZmEyOTYyYTMzNjlmODY2MGQ2YjJjM2ExZGY0ZmMzMDE3ZGEyYWY4NDc0MjFlNTMyNjVmZDMwYWU3NzZkMDUyYzA3ODcwM2M2Yzc3MDNkZCIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MC4xNy42IjogewogICAgICAibmFtZSI6ICJAZW5kby9ldmVudHVhbC1zZW5kIiwKICAgICAgImxhYmVsIjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTcuNiIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE3LjYiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vZW52LW9wdGlvbnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZW52LW9wdGlvbnMtdjAuMS40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lbnYtb3B0aW9ucy9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZW52LW9wdGlvbnMtdjAuMS40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE3LjYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL0UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL0UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5NzZkYTc4ZDI1NGZmZTlhMGEyZWYyMzJkZjM5ZDc3MTZlYWIwYTIzYzM3NWEwNWU5ZTcwOTAzYzMwZTcxY2JhNGQ5YWI0ZTNiYzk2MDM3N2ZmNjJlNjg2NmYwNWYyMWY0OTM0MWMwNjBkNzI4Mzc2NzYzZTRkMTJkNjEyYjA4OSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9leHBvcnRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9leHBvcnRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOThhODUxYmRiZjJmNGRkMDlhMTNiNTIxMTMwZTI5OWY5ZDE5NTVhZTE5MjkxNjI3Y2QyOGRmNGZiNWQ0ODc4ZWNkZjdjZTJiMjJhNTY3MGI0Mzk3YmY0OTBiODBkODk4MjQ4MWRiNWNlYjIyNGIxMGFmZGVmZTVjNDQ1MDYyNjUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbm8tc2hpbS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbm8tc2hpbS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjVjOGYyODc4ZTVhYTJkOTgyYzQ3MzJjNjM3OTZlYWE3MzY5MWVkODU2Y2VkZmY2ODNlYmNkYTA5MmMyMTE1NjI3ZTE5YzllN2ZhOWY2YTc1YWM5YTg5YTM2MjE2YzQ5NDJhNjBiOTJmNTgyY2Q0N2M2NmRmNjNhYWYxNTE3YzE1IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3RyYWNrLXR1cm5zLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90cmFjay10dXJucy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjllMzk3NjNjOTc1MjY5NzViNWQxYmNlYjM5ODBmZjAyOGRlYWRjMWJiMGIwYWMwNjAxNTU1NWYyNzVmMGY2Y2E0ZTFiZGVlOWFjY2EzZjM3NjhiMTVlYjM5ZTAxMDlkNzljMTVjOGQ1NjQyMDA0YjNiMmI3MzllNTAyMzEyZmFhIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9mYXItdjAuMi4yMiI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vZmFyIiwKICAgICAgImxhYmVsIjogIkBlbmRvL2Zhci12MC4yLjIyIiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL2Zhci12MC4yLjIyIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MC4xNy42IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbm8tc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9mYXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZmFyLXYwLjIuMjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXNzLXN0eWxlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS43IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXNzLXN0eWxlL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXNzLXN0eWxlLXYwLjEuNyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Bhc3Mtc3R5bGUvdG9vbHMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGFzcy1zdHlsZS12MC4xLjciLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3Rvb2xzLmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjY4NzQ5N2UzYmY2OGM1Mjc5ZjM2ZDQwZTI4ZTRhNzQzOTcxNTg0MDMxZjY0MGVlNDk3MmQ5MjU1YTI5ZTkxYmFkMThmZDQ2OTljNGJkY2IzYjM2ODJjMTk2NWQ3NmMyOTlkNDdmYjU4MmQyNjI4YmZmYzRmY2I3YzBmM2Q2ZjFjIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9wYXNzLXN0eWxlLXYwLjEuNyI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vcGFzcy1zdHlsZSIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9wYXNzLXN0eWxlLXYwLjEuNyIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9wYXNzLXN0eWxlLXYwLjEuNyIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby9wYXNzLXN0eWxlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS43IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXNzLXN0eWxlL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXNzLXN0eWxlLXYwLjEuNyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Bhc3Mtc3R5bGUvdG9vbHMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGFzcy1zdHlsZS12MC4xLjciLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3Rvb2xzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjYwIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvc2hpbS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjYwIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBmYXN0LWNoZWNrL2F2YSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZmFzdC1jaGVjay9hdmEtdjEuMS41IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9saWIvZXNtL2F2YS1mYXN0LWNoZWNrLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBmYXN0LWNoZWNrL2F2YS9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGZhc3QtY2hlY2svYXZhLXYxLjEuNSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1ZjQ0NmJkZDJkZmE4ODk3NmJhMmQ5Y2YzMmY2MTA0MjAxYmZjYWEzZjE3OTZhMGQ0MDgwMzEyMmYxZmNlNjJiZDk1Y2ZlNmNjYWU4NzlhYzM4MTAyYmM0ZTJiM2I1NTQwNGNmNzJjNzQ1NmRiOTc3MTBjZjY5ZmFiOWY2ZWJjOCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb3B5QXJyYXkuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvcHlBcnJheS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjMzOGJiNjBmNzg1NGI0YTdiNjFhMWZkMzNiMjRhN2U5ZDA1OGRhNzkwZTZmMGEyOTY0NDNmNzA5ZjIwNmZlZjczMTUwYjdlMmRlZDc5OWM2MzliNTg4NDhkYzQ1YTRmM2ZjYWE5OWEwZjFlNzI1YTJhZDlhNDNkY2U2OTA4MzkxIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvcHlSZWNvcmQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvcHlSZWNvcmQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1NGI4MTI1ZDA5ZDczYjAyNWM4MzlmNjI1MWRjYzA2YTUzZGNkMjVhZTkxOGM5NzNlMzYwMTYxMTYzMDhhNDhjMTgzMGFkMzM4NzNkOWI4ZWVlMDZhZDUwYjgyOWQ0NTAzNmU4YzQ4NjAzNjM5ZTJhNTQ4MmVlMmJhOWNkZDMwZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lcnJvci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZXJyb3IuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5NzBjNzNhNjYwMDE2OWMyZGFlYjQ0ZTMxODc2YTY0NDE2YTc4MTlhYjA0NzZlZTU0YzBiMjNhNDgwYjQ3M2VjZTE4Nzk5MDg2OTI0NGFhOTQwNWE2MDBmOThmNGI2MjQxZTYyODY1Y2ZlM2FkMzkzMWRiZTVjMTg0NGNiOTkzMCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pdGVyLWhlbHBlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2l0ZXItaGVscGVycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjQ3NmViZjM0ZTczZDA1MDM5Mzc0N2U5ZWFmMzVkOTcwN2ExOTA1ZDRjYzFjNTEwYTRmMTllMTVmYzM1MGVjYjFkYjQ5YjJmNTFmODRmYWFlY2I5YjY3YWY1NDhhY2MyZTUxMmZhYjJmYTE2MTBiMzY4ZGQxYTE3OWVhMGYzMzRlIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21ha2UtZmFyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYWtlLWZhci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImJjZDcwOWQ2ZWNhOWQwNDAyYjAzMWVmNWM5MzlhM2Y4ZjYzYWIyMGEzOWE5NjU1MjY5YTIyMWYwZmE3OWVhODQxNTZmOTlhNmU4MTk4NTdiMTcxNjg4NjM4OWE1ZDdjMzhlYTYzOTJlNDQ5ZGIwOGVhNjUzODBkNWRkYTQ5ZDQzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21ha2VUYWdnZWQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21ha2VUYWdnZWQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyZDBlNGJjNmU0N2UzZjY0Nzk0NmUxYTRiOWEwY2VhNjQ3YzM1MzA3ZTk1NTNlNThmM2MxMzIxNjE4MzZiOWQzYjhjN2U3MDFiM2U2ODYwNzFiNjAxZjRiMGI4MDIzMzI2ZjliYTQ4N2FlYzgwMjUyYzk1Y2FhZDhmZDk5NjE0MCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXNzU3R5bGUtaGVscGVycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGFzc1N0eWxlLWhlbHBlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0OTVhZWQ4NzRiNDk1NzY0OGYwZTU1YzhjNzU5MmRjN2UxYjY1MzA3OWUyNTg2NTk1YmRjZjg5MzdmNzIyYzJiZTg2N2FkY2ExNjNkMDQwNDMyNTEwNjYxMzBlMDJkZGM4Y2I3NjYzY2Y4ZDg3NjRiMTBiZjZhMjZhOTYyNGYxMyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXNzU3R5bGVPZi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGFzc1N0eWxlT2YuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1NTZjOGMxYWJkZDFmNDg2MmYxYWQ5NzYyNjA5MjhkYWZmZjhmMDg1NWFjNmZkZTI2NTI4MDNhMzM1YTdmZDM5ODE4MjQ3MGI2NzEyZTI4ZWVjMzlmMDhmYmUxYjAwYjc4ODY0ODNkYWJlMWMxZDUzNDMyODkyMzkyZDU0YTUwYiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9yZW1vdGFibGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3JlbW90YWJsZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjU1ODQyZmU4MjUxZDRlMDk2ZjEzY2JlNWViZjdlMGIzMGM2YjUzMGEwMGIzNGZhMDdiZTgwNGQ1ZDdiNDAwYTAyYjI2ZmY0MjY4YjE0ZGQ4NzdlOTZlMWFlMzNhZDA4ZWYyYWI4ODEyOTYzMmQ2Mjg3NTk1MmVhZmQwMTcyMTFjIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3NhZmUtcHJvbWlzZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc2FmZS1wcm9taXNlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNjVmNmQ4ZTVjYjQ0NjBiNmRlNjVkZDRkOWZhNDhlYTY0ZWQ2MzM5ZWM3NmJlOTlmOWRiYTE0ZDYyMDNjMTQ5OWQxYmQ1MDk1MWY5ZjBmYTA4NzYwZWM5MGQ5NGViOTI0ZDE4MDY3MGRhZjI3YmMyM2Q4MDFjZmZkMmY5MzFlNmUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3ltYm9sLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zeW1ib2wuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiOTkxOWI3OGQwNzM2OWM2N2NiZTY4ZTg2ODBiMmM5MTlkNjA5ZDJkYmNiYjIxZDJjODBjZmYyNjJhMzY0NTM0N2E1MzBlNzM5MWQ0MWU3OGE0NDhkNzUxODMyNmExY2UzZWNiOWM5OWQxNjM0MzkwMTYzOTY1NDkyYWRlMDQ5YyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90YWdnZWQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3RhZ2dlZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImQzOWYzMDViYzc5ZjFkYjlhNmNmYmY5NTI1MTkyNWIyZWU1NmJkMjliYjE1NTdmMjQ0Njk4ZmMyMzVkMGFmOWU3MjdhYzU3MjAyMjZlMzJkYzgwZmM4YWYzNjE3YjBhNGQ1M2NlNzcyZTcwM2UyNWZmMGI5ZWJlZDc0Yzc1NzM5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVHdWFyZHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVHdWFyZHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5NDE3MGM0ZTE2ZDUzNzk1YTg0NzlkMGMxYTc5ZDE5YjE5MGQ5MjJlMTYzMDFlN2EwYmI4YjgxNmQzYzQ5YmQyNWZlMGI4NGU4NzlkYTc4MGMzZmMwNjQxYWQ2OWNjNTdkZDFlNzk1ZWNlN2U4YmIyODEyZjc0MzA1OGFmZjAyMCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5OGE4NTFiZGJmMmY0ZGQwOWExM2I1MjExMzBlMjk5ZjlkMTk1NWFlMTkyOTE2MjdjZDI4ZGY0ZmI1ZDQ4NzhlY2RmN2NlMmIyMmE1NjcwYjQzOTdiZjQ5MGI4MGQ4OTgyNDgxZGI1Y2ViMjI0YjEwYWZkZWZlNWM0NDUwNjI2NSIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi42MCI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vcHJvbWlzZS1raXQiLAogICAgICAibGFiZWwiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi42MCIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjYwIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjYwIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvc2hpbS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjYwIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgInNlcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJzZXMtdjAuMTguOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAic2VzL2xvY2tkb3duIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInNlcy12MC4xOC44IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJzZXMvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInNlcy12MC4xOC44IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAic2VzL3Rvb2xzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInNlcy12MC4xOC44IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi90b29scy5qcyIKICAgICAgICB9LAogICAgICAgICIuL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiODJkYjczZDBhYjBjMjZhM2E4OTVjNTc5NTI4N2IwOTYxNmUwMzJjYjUzMDAxOWI3MjAxNmEyYjhmZTJkYzNhYjBlZDBlZWI0ZTlkZGNhZmEzZmY5YmI2Nzc0MmQwZWUwN2NhOTU1ZWI2OGVjODJmMGQ1Yzc2ZGQ5NDFiNTcwZGMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaXMtcHJvbWlzZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaXMtcHJvbWlzZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjE4MTRkZDE0M2RmZjczZGUzZWU0YzFmMDc3MDdlNTc3Y2FhY2FhM2FiZjRiMDU5MGNkZWRlMTBiOTE5OWE5MmQ3OTdmMGMxMWJiNzM4Mjk1YzQ5ZjFlN2VmOTBmM2QxMTZlMjhlNzRjMDg2NzM0ZWJjYThiY2RhMWRjOTM5ZDQ3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21lbW8tcmFjZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWVtby1yYWNlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZWVhNTVmYTJjYzFiNzM2ZTAyYmI4MzIyNDZkY2M2ZmNkNGEwYTFlYmMyNDFlMzgxZWY2ZjY0YmQ4ZWM0NmExNWQzZjc5N2VjMjJhMzVjOWM1Yzk1MTQyNGUzOWZkNmE2ODdjZGI0MTU1YzhkYjcxZjZlZmU3ZDNmZTk3ZTk0NWEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcHJvbWlzZS1leGVjdXRvci1raXQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3Byb21pc2UtZXhlY3V0b3Ita2l0LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNzVlODMzNmNiYzQxY2QyZjYzMTE3N2MwNjEwOWNmM2Y4YjUxODE0Y2IzM2UyMjA4MmM4ZTllZWUwNzJlYzQ4OTE5ZDA4ZDQzZDI5ZDU2NTUxODI2Yzg5NTEzNTgzNTRkNjhlNWFhMDk2YzZhYTU2NjEzNDllMGZhMTA4MTZmNzkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOThhODUxYmRiZjJmNGRkMDlhMTNiNTIxMTMwZTI5OWY5ZDE5NTVhZTE5MjkxNjI3Y2QyOGRmNGZiNWQ0ODc4ZWNkZjdjZTJiMjJhNTY3MGI0Mzk3YmY0OTBiODBkODk4MjQ4MWRiNWNlYjIyNGIxMGFmZGVmZTVjNDQ1MDYyNjUiCiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQp9UEsDBAoAAAAAAAAAAADtD2dhkwUAAJMFAAA6AAAAQGFnb3JpYy92YXRzLXYwLjE1LjEvc3JjL3Byb3Bvc2Fscy91cGdyYWRlLXpvZS1wcm9wb3NhbC5qc3siaW1wb3J0cyI6WyJAZW5kby9mYXIiXSwiZXhwb3J0cyI6WyJnZXRNYW5pZmVzdEZvclVwZ3JhZGluZ1pvZSIsInVwZ3JhZGVab2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRTskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9mYXJcIiwgW1tcIkVcIiwgWyRo4oCNX2EgPT4gKEUgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuLyoqXG4gKiBAcGFyYW0ge0Jvb3RzdHJhcFBvd2VycyAmIHtcbiAqICAgY29uc3VtZToge1xuICogICAgIHZhdEFkbWluU3ZjOiBWYXRBZG1pblN2ZTtcbiAqICAgICB2YXRTdG9yZTogTWFwU3RvcmU8c3RyaW5nLCBDcmVhdGVWYXRSZXN1bHRzPjtcbiAqICAgfTtcbiAqIH19IHBvd2Vyc1xuICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAqIEBwYXJhbSB7eyB6b2VSZWY6IFZhdFNvdXJjZVJlZjsgemNmUmVmOiBWYXRTb3VyY2VSZWYgfX0gb3B0aW9ucy5vcHRpb25zXG4gKi9cbmNvbnN0ICAgICAgICB1cGdyYWRlWm9lPWFzeW5jKFxue2NvbnN1bWU6e3ZhdEFkbWluU3ZjLHZhdFN0b3JlfX0sXG5vcHRpb25zKT0+XG57XG5jb25zdHt6b2VSZWZ9PW9wdGlvbnMub3B0aW9ucztcblxuY29uc3Qgem9lQnVuZGxlQ2FwPWF3YWl0IEUodmF0QWRtaW5TdmMpLmdldEJ1bmRsZUNhcCh6b2VSZWYuYnVuZGxlSUQpO1xuY29uc29sZS5sb2coIGBaT0UgQlVORExFIElEOiBgLHpvZVJlZi5idW5kbGVJRCk7XG5cbmNvbnN0e2FkbWluTm9kZX09YXdhaXQgRSh2YXRTdG9yZSkuZ2V0KCd6b2UnKTtcblxuYXdhaXQgRShhZG1pbk5vZGUpLnVwZ3JhZGUoem9lQnVuZGxlQ2FwLHt9KTtcbiB9OyRo4oCNX29uY2UudXBncmFkZVpvZSh1cGdyYWRlWm9lKTtcblxuY29uc3QgICAgICAgIGdldE1hbmlmZXN0Rm9yVXBncmFkaW5nWm9lPShfcG93ZXJzLHt6b2VSZWZ9KT0+KHtcbm1hbmlmZXN0Ontcblt1cGdyYWRlWm9lLm5hbWVdOntcbmNvbnN1bWU6e1xudmF0QWRtaW5TdmM6J3ZhdEFkbWluU3ZjJyxcbnZhdFN0b3JlOid2YXRTdG9yZSd9LFxuXG5wcm9kdWNlOnt9fX0sXG5cblxub3B0aW9uczp7em9lUmVmfX0pOyRo4oCNX29uY2UuZ2V0TWFuaWZlc3RGb3JVcGdyYWRpbmdab2UoZ2V0TWFuaWZlc3RGb3JVcGdyYWRpbmdab2UpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InVwZ3JhZGVab2UiOlsidXBncmFkZVpvZSJdLCJnZXRNYW5pZmVzdEZvclVwZ3JhZGluZ1pvZSI6WyJnZXRNYW5pZmVzdEZvclVwZ3JhZGluZ1pvZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAeKPu0fgEAAH4BAAAhAAAAQGVuZG8vZW52LW9wdGlvbnMtdjAuMS40L2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vc3JjL2Vudi1vcHRpb25zLmpzIl0sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOlsiLi9zcmMvZW52LW9wdGlvbnMuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL3NyYy9lbnYtb3B0aW9ucy5qc1wiLCBbXV1dKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAshzifZgMAACYDAAAKwAAAEBlbmRvL2Vudi1vcHRpb25zLXYwLjEuNC9zcmMvZW52LW9wdGlvbnMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIm1ha2VFbnZpcm9ubWVudENhcHRvciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qIEB0cy1jaGVjayovXG5cbi8qIGBAZW5kby9lbnYtb3B0aW9uc2AgbmVlZHMgdG8gYmUgaW1wb3J0ZWQgcXVpdGUgZWFybHksIGFuZCBzbyBzaG91bGQqL1xuLyogYXZvaWQgaW1wb3J0aW5nIGZyb20gc2VzIG9yIGFueXRoaW5nIHRoYXQgZGVwZW5kcyBvbiBzZXMuKi9cblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuLyogUHJlbHVkZSBvZiBjaGVhcCBnb29kIC0gZW5vdWdoIGltaXRhdGlvbnMgb2YgdGhpbmdzIHdlJ2QgdXNlIG9yKi9cbi8qIGRvIGRpZmZlcmVudGx5IGlmIHdlIGNvdWxkIGRlcGVuZCBvbiBzZXMqL1xuXG5jb25zdHtmcmVlemV9PU9iamVjdDtcbmNvbnN0e2FwcGx5fT1SZWZsZWN0O1xuXG4vKiBTaG91bGQgYmUgZXF1aXZhbGVudCB0byB0aGUgb25lIGluIHNlcycgY29tbW9ucy5qcyBldmVuIHRob3VnaCBpdCovXG4vKiB1c2VzIHRoZSBvdGhlciB0ZWNobmlxdWUuKi9cbmNvbnN0IHVuY3VycnlUaGlzPVxuKGZuKT0+XG4ocmVjZWl2ZXIsLi4uYXJncyk9PlxuYXBwbHkoZm4scmVjZWl2ZXIsYXJncyk7XG5jb25zdCBhcnJheVB1c2g9dW5jdXJyeVRoaXMoQXJyYXkucHJvdG90eXBlLnB1c2gpO1xuXG5jb25zdCBxPUpTT04uc3RyaW5naWZ5O1xuXG5jb25zdCBGYWlsPShsaXRlcmFscywuLi5hcmdzKT0+e1xubGV0IG1zZz1saXRlcmFsc1swXTtcbmZvcihsZXQgaT0wO2k8YXJncy5sZW5ndGg7aSs9MSl7XG5tc2c9IGAke21zZ30ke2FyZ3NbaV19JHtsaXRlcmFsc1tpKzFdfWA7XG4gfVxudGhyb3cgRXJyb3IobXNnKTtcbiB9O1xuXG4vKiBlbmQgcHJlbHVkZSovXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKlxuICogYG1ha2VFbnZpcm9ubWVudENhcHRvcmAgcHJvdmlkZXMgYSBtZWNoYW5pc20gZm9yIGdldHRpbmcgZW52aXJvbm1lbnRcbiAqIHZhcmlhYmxlcywgaWYgdGhleSBhcmUgbmVlZGVkLCBhbmQgYSB3YXkgdG8gY2F0YWxvZyB0aGUgbmFtZXMgb2YgYWxsXG4gKiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRoYXQgd2VyZSBjYXB0dXJlZC5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gYUdsb2JhbFxuICovXG5jb25zdCAgICAgICAgbWFrZUVudmlyb25tZW50Q2FwdG9yPShhR2xvYmFsKT0+e1xuY29uc3QgY2FwdHVyZWRFbnZpcm9ubWVudE9wdGlvbk5hbWVzPVtdO1xuXG4vKipcbiAqIEdldHMgYW4gZW52aXJvbm1lbnQgb3B0aW9uIGJ5IG5hbWUgYW5kIHJldHVybnMgdGhlIG9wdGlvbiB2YWx1ZSBvciB0aGVcbiAqIGdpdmVuIGRlZmF1bHQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbk5hbWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBkZWZhdWx0U2V0dGluZ1xuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3QgZ2V0RW52aXJvbm1lbnRPcHRpb249KG9wdGlvbk5hbWUsZGVmYXVsdFNldHRpbmcpPT57XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGVuZG8vbm8tcG9seW1vcnBoaWMtY2FsbCovXG50eXBlb2Ygb3B0aW9uTmFtZT09PSdzdHJpbmcnfHxcbkZhaWwgYEVudmlyb25tZW50IG9wdGlvbiBuYW1lICR7cShvcHRpb25OYW1lKX0gbXVzdCBiZSBhIHN0cmluZy5gO1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBlbmRvL25vLXBvbHltb3JwaGljLWNhbGwqL1xudHlwZW9mIGRlZmF1bHRTZXR0aW5nPT09J3N0cmluZyd8fFxuRmFpbCBgRW52aXJvbm1lbnQgb3B0aW9uIGRlZmF1bHQgc2V0dGluZyAke3EoXG5kZWZhdWx0U2V0dGluZylcbiB9IG11c3QgYmUgYSBzdHJpbmcuYDtcblxuLyoqIEB0eXBlIHtzdHJpbmd9ICovXG5sZXQgc2V0dGluZz1kZWZhdWx0U2V0dGluZztcbmNvbnN0IGdsb2JhbFByb2Nlc3M9YUdsb2JhbC5wcm9jZXNzO1xuaWYoZ2xvYmFsUHJvY2VzcyYmdHlwZW9mIGdsb2JhbFByb2Nlc3M9PT0nb2JqZWN0Jyl7XG5jb25zdCBnbG9iYWxFbnY9Z2xvYmFsUHJvY2Vzcy5lbnY7XG5pZihnbG9iYWxFbnYmJnR5cGVvZiBnbG9iYWxFbnY9PT0nb2JqZWN0Jyl7XG5pZihvcHRpb25OYW1lIGluIGdsb2JhbEVudil7XG5hcnJheVB1c2goY2FwdHVyZWRFbnZpcm9ubWVudE9wdGlvbk5hbWVzLG9wdGlvbk5hbWUpO1xuY29uc3Qgb3B0aW9uVmFsdWU9Z2xvYmFsRW52W29wdGlvbk5hbWVdO1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBlbmRvL25vLXBvbHltb3JwaGljLWNhbGwqL1xudHlwZW9mIG9wdGlvblZhbHVlPT09J3N0cmluZyd8fFxuRmFpbCBgRW52aXJvbm1lbnQgb3B0aW9uIG5hbWVkICR7cShcbm9wdGlvbk5hbWUpXG4gfSwgaWYgcHJlc2VudCwgbXVzdCBoYXZlIGEgY29ycmVzcG9uZGluZyBzdHJpbmcgdmFsdWUsIGdvdCAke3EoXG5vcHRpb25WYWx1ZSlcbiB9YDtcbnNldHRpbmc9b3B0aW9uVmFsdWU7XG4gfVxuIH1cbiB9XG5yZXR1cm4gc2V0dGluZztcbiB9O1xuZnJlZXplKGdldEVudmlyb25tZW50T3B0aW9uKTtcblxuY29uc3QgZ2V0Q2FwdHVyZWRFbnZpcm9ubWVudE9wdGlvbk5hbWVzPSgpPT57XG5yZXR1cm4gZnJlZXplKFsuLi5jYXB0dXJlZEVudmlyb25tZW50T3B0aW9uTmFtZXNdKTtcbiB9O1xuZnJlZXplKGdldENhcHR1cmVkRW52aXJvbm1lbnRPcHRpb25OYW1lcyk7XG5cbnJldHVybiBmcmVlemUoe2dldEVudmlyb25tZW50T3B0aW9uLGdldENhcHR1cmVkRW52aXJvbm1lbnRPcHRpb25OYW1lc30pO1xuIH07JGjigI1fb25jZS5tYWtlRW52aXJvbm1lbnRDYXB0b3IobWFrZUVudmlyb25tZW50Q2FwdG9yKTtcbmZyZWV6ZShtYWtlRW52aXJvbm1lbnRDYXB0b3IpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VFbnZpcm9ubWVudENhcHRvciI6WyJtYWtlRW52aXJvbm1lbnRDYXB0b3IiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAtC+LggcuAAAHLgAAJAAAAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTcuNi9zcmMvRS5qc3siaW1wb3J0cyI6WyIuL3RyYWNrLXR1cm5zLmpzIl0sImV4cG9ydHMiOlsiZGVmYXVsdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCB0cmFja1R1cm5zOyRo4oCNX2ltcG9ydHMoW1tcIi4vdHJhY2stdHVybnMuanNcIiwgW1tcInRyYWNrVHVybnNcIiwgWyRo4oCNX2EgPT4gKHRyYWNrVHVybnMgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuY29uc3R7ZGV0YWlsczpYLHF1b3RlOnEsRmFpbH09YXNzZXJ0O1xuY29uc3R7YXNzaWduLGNyZWF0ZX09T2JqZWN0O1xuXG4vKiogQHR5cGUge1Byb3h5SGFuZGxlcjxhbnk+fSAqL1xuY29uc3QgYmFzZUZyZWV6YWJsZVByb3h5SGFuZGxlcj17XG5zZXQoX3RhcmdldCxfcHJvcCxfdmFsdWUpe1xucmV0dXJuIGZhbHNlO1xuIH0sXG5pc0V4dGVuc2libGUoX3RhcmdldCl7XG5yZXR1cm4gZmFsc2U7XG4gfSxcbnNldFByb3RvdHlwZU9mKF90YXJnZXQsX3ZhbHVlKXtcbnJldHVybiBmYWxzZTtcbiB9LFxuZGVsZXRlUHJvcGVydHkoX3RhcmdldCxfcHJvcCl7XG5yZXR1cm4gZmFsc2U7XG4gfX07XG5cblxuLyogRSBQcm94eSBoYW5kbGVycyBwcmV0ZW5kIHRoYXQgYW55IHByb3BlcnR5IGV4aXN0cyBvbiB0aGUgdGFyZ2V0IGFuZCByZXR1cm5zKi9cbi8qIGEgZnVuY3Rpb24gZm9yIHRoZWlyIHZhbHVlLiBXaGlsZSB0aGlzIGZ1bmN0aW9uIGlzIFwiYm91bmRcIiBieSBjb250ZXh0LCBpdCBpcyovXG4vKiBtZWFudCB0byBiZSBjYWxsZWQgYXMgYSBtZXRob2QuIEZvciB0aGF0IHJlYXNvbiwgdGhlIHJldHVybmVkIGZ1bmN0aW9uKi9cbi8qIGluY2x1ZGVzIGEgY2hlY2sgdGhhdCB0aGUgYHRoaXNgIGFyZ3VtZW50IGNvcnJlc3BvbmRzIHRvIHRoZSBpbml0aWFsKi9cbi8qIHJlY2VpdmVyIHdoZW4gdGhlIGZ1bmN0aW9uIHdhcyByZXRyaWV2ZWQuKi9cbi8qIEUgUHJveHkgaGFuZGxlcnMgYWxzbyBmb3J3YXJkIGRpcmVjdCBjYWxscyB0byB0aGUgdGFyZ2V0IGluIGNhc2UgdGhlIHJlbW90ZSovXG4vKiBpcyBhIGZ1bmN0aW9uIGluc3RlYWQgb2YgYW4gb2JqZWN0LiBObyBzdWNoIHJlY2VpdmVyIGNoZWNrcyBhcmUgbmVjZXNzYXJ5IGluKi9cbi8qIHRoYXQgY2FzZS4qL1xuXG4vKipcbiAqIEEgUHJveHkgaGFuZGxlciBmb3IgRSh4KS5cbiAqXG4gKiBAcGFyYW0geyp9IHggQW55IHZhbHVlIHBhc3NlZCB0byBFKHgpXG4gKiBAcGFyYW0ge1hpbXBvcnQoJy4vdHlwZXMnKS5IYW5kbGVkUHJvbWlzZUNvbnN0cnVjdG9yfSBIYW5kbGVkUHJvbWlzZVxuICogQHJldHVybnMge1Byb3h5SGFuZGxlcn0gdGhlIFByb3h5IGhhbmRsZXJcbiAqL1xuY29uc3QgbWFrZUVQcm94eUhhbmRsZXI9KHgsSGFuZGxlZFByb21pc2UpPT5cbmhhcmRlbih7XG4uLi5iYXNlRnJlZXphYmxlUHJveHlIYW5kbGVyLFxuZ2V0OihfdGFyZ2V0LHAscmVjZWl2ZXIpPT57XG5yZXR1cm4gaGFyZGVuKFxue1xuLyogVGhpcyBmdW5jdGlvbiBwdXJwb3NlbHkgY2hlY2tzIHRoZSBgdGhpc2AgdmFsdWUgKHNlZSBhYm92ZSkqL1xuLyogSW4gb3JkZXIgdG8gYmUgYHRoaXNgIHNlbnNpdGl2ZSBpdCBpcyBkZWZpbmVkIHVzaW5nIGNvbmNpc2UgbWV0aG9kKi9cbi8qIHN5bnRheCByYXRoZXIgdGhhbiBhcyBhbiBhcnJvdyBmdW5jdGlvbi4gVG8gZW5zdXJlIHRoZSBmdW5jdGlvbiovXG4vKiBpcyBub3QgY29uc3RydWN0YWJsZSwgaXQgYWxzbyBhdm9pZHMgdGhlIGBmdW5jdGlvbmAgc3ludGF4LiovXG5bcF0oLi4uYXJncyl7XG5pZih0aGlzIT09cmVjZWl2ZXIpe1xuLyogUmVqZWN0IHRoZSBhc3luYyBmdW5jdGlvbiBjYWxsKi9cbnJldHVybiBIYW5kbGVkUHJvbWlzZS5yZWplY3QoXG5hc3NlcnQuZXJyb3IoXG5YIGBVbmV4cGVjdGVkIHJlY2VpdmVyIGZvciBcIiR7cH1cIiBtZXRob2Qgb2YgRSgke3EoeCl9KWApKTtcblxuXG4gfVxuXG5yZXR1cm4gSGFuZGxlZFByb21pc2UuYXBwbHlNZXRob2QoeCxwLGFyZ3MpO1xuIH1cbi8qIEB0cy1leHBlY3QtZXJyb3IgaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy81MDMxOSovfVtcbnBdKTtcblxuIH0sXG5hcHBseTooX3RhcmdldCxfdGhpc0FyZyxhcmdBcnJheT1bXSk9PntcbnJldHVybiBIYW5kbGVkUHJvbWlzZS5hcHBseUZ1bmN0aW9uKHgsYXJnQXJyYXkpO1xuIH0sXG5oYXM6KF90YXJnZXQsX3ApPT57XG4vKiBXZSBqdXN0IHByZXRlbmQgZXZlcnl0aGluZyBleGlzdHMuKi9cbnJldHVybiB0cnVlO1xuIH19KTtcblxuXG4vKipcbiAqIEEgUHJveHkgaGFuZGxlciBmb3IgRS5zZW5kT25seSh4KVxuICogSXQgaXMgYSB2YXJpYW50IG9uIHRoZSBFKHgpIFByb3h5IGhhbmRsZXIuXG4gKlxuICogQHBhcmFtIHsqfSB4IEFueSB2YWx1ZSBwYXNzZWQgdG8gRS5zZW5kT25seSh4KVxuICogQHBhcmFtIHtYaW1wb3J0KCcuL3R5cGVzJykuSGFuZGxlZFByb21pc2VDb25zdHJ1Y3Rvcn0gSGFuZGxlZFByb21pc2VcbiAqIEByZXR1cm5zIHtQcm94eUhhbmRsZXJ9IHRoZSBQcm94eSBoYW5kbGVyXG4gKi9cbmNvbnN0IG1ha2VFU2VuZE9ubHlQcm94eUhhbmRsZXI9KHgsSGFuZGxlZFByb21pc2UpPT5cbmhhcmRlbih7XG4uLi5iYXNlRnJlZXphYmxlUHJveHlIYW5kbGVyLFxuZ2V0OihfdGFyZ2V0LHAscmVjZWl2ZXIpPT57XG5yZXR1cm4gaGFyZGVuKFxue1xuLyogVGhpcyBmdW5jdGlvbiBwdXJwb3NlbHkgY2hlY2tzIHRoZSBgdGhpc2AgdmFsdWUgKHNlZSBhYm92ZSkqL1xuLyogSW4gb3JkZXIgdG8gYmUgYHRoaXNgIHNlbnNpdGl2ZSBpdCBpcyBkZWZpbmVkIHVzaW5nIGNvbmNpc2UgbWV0aG9kKi9cbi8qIHN5bnRheCByYXRoZXIgdGhhbiBhcyBhbiBhcnJvdyBmdW5jdGlvbi4gVG8gZW5zdXJlIHRoZSBmdW5jdGlvbiovXG4vKiBpcyBub3QgY29uc3RydWN0YWJsZSwgaXQgYWxzbyBhdm9pZHMgdGhlIGBmdW5jdGlvbmAgc3ludGF4LiovXG5bcF0oLi4uYXJncyl7XG4vKiBUaHJvdyBzaW5jZSB0aGUgZnVuY3Rpb24gcmV0dXJucyBub3RoaW5nKi9cbnRoaXM9PT1yZWNlaXZlcnx8XG5GYWlsIGBVbmV4cGVjdGVkIHJlY2VpdmVyIGZvciBcIiR7cShwKX1cIiBtZXRob2Qgb2YgRS5zZW5kT25seSgke3EoXG54KVxuIH0pYDtcbkhhbmRsZWRQcm9taXNlLmFwcGx5TWV0aG9kU2VuZE9ubHkoeCxwLGFyZ3MpO1xucmV0dXJuIHVuZGVmaW5lZDtcbiB9XG4vKiBAdHMtZXhwZWN0LWVycm9yIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvNTAzMTkqL31bXG5wXSk7XG5cbiB9LFxuYXBwbHk6KF90YXJnZXQsX3RoaXNBcmcsYXJnc0FycmF5PVtdKT0+e1xuSGFuZGxlZFByb21pc2UuYXBwbHlGdW5jdGlvblNlbmRPbmx5KHgsYXJnc0FycmF5KTtcbnJldHVybiB1bmRlZmluZWQ7XG4gfSxcbmhhczooX3RhcmdldCxfcCk9Pntcbi8qIFdlIGp1c3QgcHJldGVuZCB0aGF0IGV2ZXJ5dGhpbmcgZXhpc3RzLiovXG5yZXR1cm4gdHJ1ZTtcbiB9fSk7XG5cblxuLyoqXG4gKiBBIFByb3h5IGhhbmRsZXIgZm9yIEUuZ2V0KHgpXG4gKiBJdCBpcyBhIHZhcmlhbnQgb24gdGhlIEUoeCkgUHJveHkgaGFuZGxlci5cbiAqXG4gKiBAcGFyYW0geyp9IHggQW55IHZhbHVlIHBhc3NlZCB0byBFLmdldCh4KVxuICogQHBhcmFtIHtYaW1wb3J0KCcuL3R5cGVzJykuSGFuZGxlZFByb21pc2VDb25zdHJ1Y3Rvcn0gSGFuZGxlZFByb21pc2VcbiAqIEByZXR1cm5zIHtQcm94eUhhbmRsZXJ9IHRoZSBQcm94eSBoYW5kbGVyXG4gKi9cbmNvbnN0IG1ha2VFR2V0UHJveHlIYW5kbGVyPSh4LEhhbmRsZWRQcm9taXNlKT0+XG5oYXJkZW4oe1xuLi4uYmFzZUZyZWV6YWJsZVByb3h5SGFuZGxlcixcbmhhczooX3RhcmdldCxfcHJvcCk9PnRydWUsXG5nZXQ6KF90YXJnZXQscHJvcCk9PkhhbmRsZWRQcm9taXNlLmdldCh4LHByb3ApfSk7XG5cblxuLyoqXG4gKiBAcGFyYW0ge1hpbXBvcnQoJy4vdHlwZXMnKS5IYW5kbGVkUHJvbWlzZUNvbnN0cnVjdG9yfSBIYW5kbGVkUHJvbWlzZVxuICovXG5jb25zdCBtYWtlRT0oSGFuZGxlZFByb21pc2UpPT57XG5yZXR1cm4gaGFyZGVuKFxuYXNzaWduKFxuLyoqXG4gKiBFKHgpIHJldHVybnMgYSBwcm94eSBvbiB3aGljaCB5b3UgY2FuIGNhbGwgYXJiaXRyYXJ5IG1ldGhvZHMuIEVhY2ggb2YgdGhlc2VcbiAqIG1ldGhvZCBjYWxscyByZXR1cm5zIGEgcHJvbWlzZS4gVGhlIG1ldGhvZCB3aWxsIGJlIGludm9rZWQgb24gd2hhdGV2ZXJcbiAqICd4JyBkZXNpZ25hdGVzIChvciByZXNvbHZlcyB0bykgaW4gYSBmdXR1cmUgdHVybiwgbm90IHRoaXMgb25lLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1R9IHggdGFyZ2V0IGZvciBtZXRob2QvZnVuY3Rpb24gY2FsbFxuICogQHJldHVybnMge0VDYWxsYWJsZU9yTWV0aG9kczxSZW1vdGVGdW5jdGlvbnM8VD4+fSBtZXRob2QvZnVuY3Rpb24gY2FsbCBwcm94eVxuICovXG4oeCk9PmhhcmRlbihuZXcgUHJveHkoKCk9PnsgfSxtYWtlRVByb3h5SGFuZGxlcih4LEhhbmRsZWRQcm9taXNlKSkpLFxue1xuLyoqXG4gKiBFLmdldCh4KSByZXR1cm5zIGEgcHJveHkgb24gd2hpY2ggeW91IGNhbiBnZXQgYXJiaXRyYXJ5IHByb3BlcnRpZXMuXG4gKiBFYWNoIG9mIHRoZXNlIHByb3BlcnRpZXMgcmV0dXJucyBhIHByb21pc2UgZm9yIHRoZSBwcm9wZXJ0eS4gIFRoZSBwcm9taXNlXG4gKiB2YWx1ZSB3aWxsIGJlIHRoZSBwcm9wZXJ0eSBmZXRjaGVkIGZyb20gd2hhdGV2ZXIgJ3gnIGRlc2lnbmF0ZXMgKG9yXG4gKiByZXNvbHZlcyB0bykgaW4gYSBmdXR1cmUgdHVybiwgbm90IHRoaXMgb25lLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1R9IHggdGFyZ2V0IGZvciBwcm9wZXJ0eSBnZXRcbiAqIEByZXR1cm5zIHtFR2V0dGVyczxMb2NhbFJlY29yZDxUPj59IHByb3BlcnR5IGdldCBwcm94eVxuICogQHJlYWRvbmx5XG4gKi9cbmdldDooeCk9PlxuaGFyZGVuKFxubmV3IFByb3h5KGNyZWF0ZShudWxsKSxtYWtlRUdldFByb3h5SGFuZGxlcih4LEhhbmRsZWRQcm9taXNlKSkpLFxuXG5cbi8qKlxuICogRS5yZXNvbHZlKHgpIGNvbnZlcnRzIHggdG8gYSBoYW5kbGVkIHByb21pc2UuIEl0IGlzXG4gKiBzaG9ydGhhbmQgZm9yIEhhbmRsZWRQcm9taXNlLnJlc29sdmUoeClcbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtUfSB4IHZhbHVlIHRvIGNvbnZlcnQgdG8gYSBoYW5kbGVkIHByb21pc2VcbiAqIEByZXR1cm5zIHtQcm9taXNlPEF3YWl0ZWQ8VD4+fSBoYW5kbGVkIHByb21pc2UgZm9yIHhcbiAqIEByZWFkb25seVxuICovXG5yZXNvbHZlOkhhbmRsZWRQcm9taXNlLnJlc29sdmUsXG5cbi8qKlxuICogRS5zZW5kT25seSByZXR1cm5zIGEgcHJveHkgc2ltaWxhciB0byBFLCBidXQgZm9yIHdoaWNoIHRoZSByZXN1bHRzXG4gKiBhcmUgaWdub3JlZCAodW5kZWZpbmVkIGlzIHJldHVybmVkKS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtUfSB4IHRhcmdldCBmb3IgbWV0aG9kL2Z1bmN0aW9uIGNhbGxcbiAqIEByZXR1cm5zIHtFU2VuZE9ubHlDYWxsYWJsZU9yTWV0aG9kczxSZW1vdGVGdW5jdGlvbnM8VD4+fSBtZXRob2QvZnVuY3Rpb24gY2FsbCBwcm94eVxuICogQHJlYWRvbmx5XG4gKi9cbnNlbmRPbmx5Oih4KT0+XG5oYXJkZW4oXG5uZXcgUHJveHkoKCk9PnsgfSxtYWtlRVNlbmRPbmx5UHJveHlIYW5kbGVyKHgsSGFuZGxlZFByb21pc2UpKSksXG5cblxuLyoqXG4gKiBFLndoZW4oeCwgcmVzLCByZWopIGlzIGVxdWl2YWxlbnQgdG9cbiAqIEhhbmRsZWRQcm9taXNlLnJlc29sdmUoeCkudGhlbihyZXMsIHJlailcbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHRlbXBsYXRlIFtVID0gVF1cbiAqIEBwYXJhbSB7VHxQcm9taXNlTGlrZTxUPn0geCB2YWx1ZSB0byBjb252ZXJ0IHRvIGEgaGFuZGxlZCBwcm9taXNlXG4gKiBAcGFyYW0geyh2YWx1ZTogVCkgPT4gRVJlZjxVPn0gW29uZnVsZmlsbGVkXVxuICogQHBhcmFtIHsocmVhc29uOiBhbnkpID0+IEVSZWY8VT59IFtvbnJlamVjdGVkXVxuICogQHJldHVybnMge1Byb21pc2U8VT59XG4gKiBAcmVhZG9ubHlcbiAqL1xud2hlbjooeCxvbmZ1bGZpbGxlZCxvbnJlamVjdGVkKT0+XG5IYW5kbGVkUHJvbWlzZS5yZXNvbHZlKHgpLnRoZW4oXG4uLi50cmFja1R1cm5zKFtvbmZ1bGZpbGxlZCxvbnJlamVjdGVkXSkpfSkpO1xuXG5cblxuXG4gfTtcblxuY29uc3R7ZGVmYXVsdDokY+KAjV9kZWZhdWx0fT17ZGVmYXVsdDptYWtlRX07XG5cbi8qKiBAdHlwZWRlZiB7UmV0dXJuVHlwZTxtYWtlRT59IEVQcm94eSAqL1xuXG4vKipcbiAqIENyZWF0ZXMgYSB0eXBlIHRoYXQgYWNjZXB0cyBib3RoIG5lYXIgYW5kIG1hcnNoYWxsZWQgcmVmZXJlbmNlcyB0aGF0IHdlcmVcbiAqIHJldHVybmVkIGZyb20gYFJlbW90YWJsZWAgb3IgYEZhcmAsIGFuZCBhbHNvIHByb21pc2VzIGZvciBzdWNoIHJlZmVyZW5jZXMuXG4gKlxuICogQHRlbXBsYXRlIFByaW1hcnkgVGhlIHR5cGUgb2YgdGhlIHByaW1hcnkgcmVmZXJlbmNlLlxuICogQHRlbXBsYXRlIFtMb2NhbD1EYXRhT25seTxQcmltYXJ5Pl0gVGhlIGxvY2FsIHByb3BlcnRpZXMgb2YgdGhlIG9iamVjdC5cbiAqIEB0eXBlZGVmIHtFUmVmPExvY2FsICYgWGltcG9ydCgnLi90eXBlcycpLlJlbW90YWJsZUJyYW5kPExvY2FsLCBQcmltYXJ5Pj59IEZhclJlZlxuICovXG5cbi8qKlxuICogYERhdGFPbmx5PFQ+YCBtZWFucyB0byByZXR1cm4gYSByZWNvcmQgdHlwZSBgVDJgIGNvbnNpc3Rpbmcgb25seSBvZlxuICogcHJvcGVydGllcyB0aGF0IGFyZSAqbm90KiBmdW5jdGlvbnMuXG4gKlxuICogQHRlbXBsYXRlIFQgVGhlIHR5cGUgdG8gYmUgZmlsdGVyZWQuXG4gKiBAdHlwZWRlZiB7T21pdDxULCBGaWx0ZXJlZEtleXM8VCwgWGltcG9ydCgnLi90eXBlcycpLkNhbGxhYmxlPj59IERhdGFPbmx5XG4gKi9cblxuLyoqXG4gKiBAc2VlIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzMxMzk0fVxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtQcm9taXNlTGlrZTxUPiB8IFR9IEVSZWZcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7WGltcG9ydCgnLi90eXBlcycpLkNhbGxhYmxlfSBUXG4gKiBAdHlwZWRlZiB7KFxuICogICBSZXR1cm5UeXBlPFQ+IGV4dGVuZHMgUHJvbWlzZUxpa2U8aW5mZXIgVT4gICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIGZ1bmN0aW9uIHJldHVybnMgYSBwcm9taXNlXG4gKiAgICAgPyBUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJuIHRoZSBmdW5jdGlvblxuICogICAgIDogKC4uLmFyZ3M6IFBhcmFtZXRlcnM8VD4pID0+IFByb21pc2U8QXdhaXRlZDxSZXR1cm5UeXBlPFQ+Pj4gIC8vIG1ha2UgaXQgcmV0dXJuIGEgcHJvbWlzZVxuICogKX0gRUNhbGxhYmxlXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge3tcbiAqICAgcmVhZG9ubHkgW1AgaW4ga2V5b2YgVF06IFRbUF0gZXh0ZW5kcyBYaW1wb3J0KCcuL3R5cGVzJykuQ2FsbGFibGVcbiAqICAgICA/IEVDYWxsYWJsZTxUW1BdPlxuICogICAgIDogbmV2ZXI7XG4gKiB9fSBFTWV0aG9kc1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHt7XG4gKiAgIHJlYWRvbmx5IFtQIGluIGtleW9mIFRdOiBUW1BdIGV4dGVuZHMgUHJvbWlzZUxpa2U8aW5mZXIgVT5cbiAqICAgICA/IFRbUF1cbiAqICAgICA6IFByb21pc2U8QXdhaXRlZDxUW1BdPj47XG4gKiB9fSBFR2V0dGVyc1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtYaW1wb3J0KCcuL3R5cGVzJykuQ2FsbGFibGV9IFRcbiAqIEB0eXBlZGVmIHsoLi4uYXJnczogUGFyYW1ldGVyczxUPikgPT4gUHJvbWlzZTx2b2lkPn0gRVNlbmRPbmx5Q2FsbGFibGVcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7e1xuICogICByZWFkb25seSBbUCBpbiBrZXlvZiBUXTogVFtQXSBleHRlbmRzIFhpbXBvcnQoJy4vdHlwZXMnKS5DYWxsYWJsZVxuICogICAgID8gRVNlbmRPbmx5Q2FsbGFibGU8VFtQXT5cbiAqICAgICA6IG5ldmVyO1xuICogfX0gRVNlbmRPbmx5TWV0aG9kc1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHsoXG4gKiAgIFQgZXh0ZW5kcyBYaW1wb3J0KCcuL3R5cGVzJykuQ2FsbGFibGVcbiAqICAgICA/IEVTZW5kT25seUNhbGxhYmxlPFQ+ICYgRVNlbmRPbmx5TWV0aG9kczxSZXF1aXJlZDxUPj5cbiAqICAgICA6IEVTZW5kT25seU1ldGhvZHM8UmVxdWlyZWQ8VD4+XG4gKiApfSBFU2VuZE9ubHlDYWxsYWJsZU9yTWV0aG9kc1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHsoXG4gKiAgIFQgZXh0ZW5kcyBYaW1wb3J0KCcuL3R5cGVzJykuQ2FsbGFibGVcbiAqICAgICA/IEVDYWxsYWJsZTxUPiAmIEVNZXRob2RzPFJlcXVpcmVkPFQ+PlxuICogICAgIDogRU1ldGhvZHM8UmVxdWlyZWQ8VD4+XG4gKiApfSBFQ2FsbGFibGVPck1ldGhvZHNcbiAqL1xuXG4vKipcbiAqIFJldHVybiBhIHVuaW9uIG9mIHByb3BlcnR5IG5hbWVzL3N5bWJvbHMvbnVtYmVycyBQIGZvciB3aGljaCB0aGUgcmVjb3JkIGVsZW1lbnQgVFtQXSdzIHR5cGUgZXh0ZW5kcyBVLlxuICpcbiAqIEdpdmVuIGNvbnN0IHggPSB7IGE6IDEyMywgYjogJ2hlbGxvJywgYzogNDIsIDQ5OiAoKSA9PiB7fSwgNTM6IDY3IH0sXG4gKlxuICogRmlsdGVyZWRLZXlzPHR5cGVvZiB4LCBudW1iZXI+IGlzIHRoZSB0eXBlICdhJyB8ICdjJyB8IDUzLlxuICogRmlsdGVyZWRLZXlzPHR5cGVvZiB4LCBzdHJpbmc+IGlzIHRoZSB0eXBlICdiJy5cbiAqIEZpbHRlcmVkS2V5czx0eXBlb2YgeCwgNDIgfCA2Nz4gaXMgdGhlIHR5cGUgJ2MnIHwgNTMuXG4gKiBGaWx0ZXJlZEtleXM8dHlwZW9mIHgsIGJvb2xlYW4+IGlzIHRoZSB0eXBlIG5ldmVyLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdGVtcGxhdGUgVVxuICogQHR5cGVkZWYge3sgW1AgaW4ga2V5b2YgVF06IFRbUF0gZXh0ZW5kcyBVID8gUCA6IG5ldmVyOyB9W2tleW9mIFRdfSBGaWx0ZXJlZEtleXNcbiAqL1xuXG4vKipcbiAqIGBQaWNrQ2FsbGFibGU8VD5gIG1lYW5zIHRvIHJldHVybiBhIHNpbmdsZSByb290IGNhbGxhYmxlIG9yIGEgcmVjb3JkIHR5cGVcbiAqIGNvbnNpc3Rpbmcgb25seSBvZiBwcm9wZXJ0aWVzIHRoYXQgYXJlIGZ1bmN0aW9ucy5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYgeyhcbiAqICAgVCBleHRlbmRzIFhpbXBvcnQoJy4vdHlwZXMnKS5DYWxsYWJsZVxuICogICAgID8gKC4uLmFyZ3M6IFBhcmFtZXRlcnM8VD4pID0+IFJldHVyblR5cGU8VD4gICAgICAgICAgICAgICAgICAgICAvLyBhIHJvb3QgY2FsbGFibGUsIG5vIG1ldGhvZHNcbiAqICAgICA6IFBpY2s8VCwgRmlsdGVyZWRLZXlzPFQsIFhpbXBvcnQoJy4vdHlwZXMnKS5DYWxsYWJsZT4+ICAgICAgICAgIC8vIGFueSBjYWxsYWJsZSBtZXRob2RzXG4gKiApfSBQaWNrQ2FsbGFibGVcbiAqL1xuXG4vKipcbiAqIGBSZW1vdGVGdW5jdGlvbnM8VD5gIG1lYW5zIHRvIHJldHVybiB0aGUgZnVuY3Rpb25zIGFuZCBwcm9wZXJ0aWVzIHRoYXQgYXJlIHJlbW90ZWx5IGNhbGxhYmxlLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7KFxuICogICBUIGV4dGVuZHMgWGltcG9ydCgnLi90eXBlcycpLlJlbW90YWJsZUJyYW5kPGluZmVyIEwsIGluZmVyIFI+ICAgICAvLyBpZiBhIGdpdmVuIFQgaXMgc29tZSByZW1vdGUgaW50ZXJmYWNlIFJcbiAqICAgICA/IFBpY2tDYWxsYWJsZTxSPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGVuIHJldHVybiB0aGUgY2FsbGFibGUgcHJvcGVydGllcyBvZiBSXG4gKiAgICAgOiBBd2FpdGVkPFQ+IGV4dGVuZHMgWGltcG9ydCgnLi90eXBlcycpLlJlbW90YWJsZUJyYW5kPGluZmVyIEwsIGluZmVyIFI+IC8vIG90aGVyd2lzZSwgaWYgdGhlIGZpbmFsIHJlc29sdXRpb24gb2YgVCBpcyBzb21lIHJlbW90ZSBpbnRlcmZhY2UgUlxuICogICAgID8gUGlja0NhbGxhYmxlPFI+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZW4gcmV0dXJuIHRoZSBjYWxsYWJsZSBwcm9wZXJ0aWVzIG9mIFJcbiAqICAgICA6IFQgZXh0ZW5kcyBQcm9taXNlTGlrZTxpbmZlciBVPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvdGhlcndpc2UsIGlmIFQgaXMgYSBwcm9taXNlXG4gKiAgICAgPyBBd2FpdGVkPFQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlbiByZXR1cm4gcmVzb2x2ZWQgdmFsdWUgVFxuICogICAgIDogVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSwgcmV0dXJuIFRcbiAqICl9IFJlbW90ZUZ1bmN0aW9uc1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHsoXG4gKiAgIFQgZXh0ZW5kcyBYaW1wb3J0KCcuL3R5cGVzJykuUmVtb3RhYmxlQnJhbmQ8aW5mZXIgTCwgaW5mZXIgUj5cbiAqICAgICA/IExcbiAqICAgICA6IEF3YWl0ZWQ8VD4gZXh0ZW5kcyBYaW1wb3J0KCcuL3R5cGVzJykuUmVtb3RhYmxlQnJhbmQ8aW5mZXIgTCwgaW5mZXIgUj5cbiAqICAgICA/IExcbiAqICAgICA6IFQgZXh0ZW5kcyBQcm9taXNlTGlrZTxpbmZlciBVPlxuICogICAgID8gQXdhaXRlZDxUPlxuICogICAgIDogVFxuICogKX0gTG9jYWxSZWNvcmRcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBbUiA9IHVua25vd25dXG4gKiBAdHlwZWRlZiB7e1xuICogICBwcm9taXNlOiBQcm9taXNlPFI+O1xuICogICBzZXR0bGVyOiBYaW1wb3J0KCcuL3R5cGVzJykuU2V0dGxlcjxSPjtcbiAqIH19IEVQcm9taXNlS2l0XG4gKi9cblxuLyoqXG4gKiBUeXBlIGZvciBhbiBvYmplY3QgdGhhdCBtdXN0IG9ubHkgYmUgaW52b2tlZCB3aXRoIEUuICBJdCBzdXBwb3J0cyBhIGdpdmVuXG4gKiBpbnRlcmZhY2UgYnV0IGRlY2xhcmVzIGFsbCB0aGUgZnVuY3Rpb25zIGFzIGFzeW5jYWJsZS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYgeyhcbiAqICAgVCBleHRlbmRzIFhpbXBvcnQoJy4vdHlwZXMnKS5DYWxsYWJsZVxuICogICAgID8gKC4uLmFyZ3M6IFBhcmFtZXRlcnM8VD4pID0+IEVSZWY8QXdhaXRlZDxFT25seTxSZXR1cm5UeXBlPFQ+Pj4+XG4gKiAgICAgOiBUIGV4dGVuZHMgUmVjb3JkPFByb3BlcnR5S2V5LCBYaW1wb3J0KCcuL3R5cGVzJykuQ2FsbGFibGU+XG4gKiAgICAgPyB7XG4gKiAgICAgICAgIFtLIGluIGtleW9mIFRdOiBUW0tdIGV4dGVuZHMgWGltcG9ydCgnLi90eXBlcycpLkNhbGxhYmxlXG4gKiAgICAgICAgICAgPyAoLi4uYXJnczogUGFyYW1ldGVyczxUW0tdPikgPT4gRVJlZjxBd2FpdGVkPEVPbmx5PFJldHVyblR5cGU8VFtLXT4+Pj5cbiAqICAgICAgICAgICA6IFRbS107XG4gKiAgICAgICB9XG4gKiAgICAgOiBUXG4gKiApfSBFT25seVxuICovJGjigI1fb25jZS5kZWZhdWx0KCRj4oCNX2RlZmF1bHQpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRlZmF1bHQiOlsiZGVmYXVsdCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACYGTuzNAEAADQBAAAqAAAAQGVuZG8vZXZlbnR1YWwtc2VuZC12MC4xNy42L3NyYy9leHBvcnRzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAPsYdN1FAgAARQIAACoAAABAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE3LjYvc3JjL25vLXNoaW0uanN7ImltcG9ydHMiOlsiLi9FLmpzIiwiLi9leHBvcnRzLmpzIl0sImV4cG9ydHMiOlsiRSIsIkhhbmRsZWRQcm9taXNlIl0sInJlZXhwb3J0cyI6WyIuL2V4cG9ydHMuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgbWFrZUU7JGjigI1faW1wb3J0cyhbW1wiLi9FLmpzXCIsIFtbXCJkZWZhdWx0XCIsIFskaOKAjV9hID0+IChtYWtlRSA9ICRo4oCNX2EpXV1dXSxbXCIuL2V4cG9ydHMuanNcIiwgW11dXSk7ICAgXG5cbmNvbnN0IGhwPUhhbmRsZWRQcm9taXNlOyRo4oCNX29uY2UuaHAoaHApO1xuY29uc3QgICAgICAgIEU9bWFrZUUoaHApOyRo4oCNX29uY2UuRShFKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJIYW5kbGVkUHJvbWlzZSI6WyJocCJdLCJFIjpbIkUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA6qEddJcQAACXEAAALgAAAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTcuNi9zcmMvdHJhY2stdHVybnMuanN7ImltcG9ydHMiOlsiQGVuZG8vZW52LW9wdGlvbnMiXSwiZXhwb3J0cyI6WyJ0cmFja1R1cm5zIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IG1ha2VFbnZpcm9ubWVudENhcHRvcjskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9lbnYtb3B0aW9uc1wiLCBbW1wibWFrZUVudmlyb25tZW50Q2FwdG9yXCIsIFskaOKAjV9hID0+IChtYWtlRW52aXJvbm1lbnRDYXB0b3IgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5jb25zdHtnZXRFbnZpcm9ubWVudE9wdGlvbn09bWFrZUVudmlyb25tZW50Q2FwdG9yKGdsb2JhbFRoaXMpO1xuXG4vKiBOT1RFOiBXZSBjYW4ndCBpbXBvcnQgdGhlc2UgYmVjYXVzZSB0aGV5J3JlIG5vdCBpbiBzY29wZSBiZWZvcmUgbG9ja2Rvd24uKi9cbi8qIGltcG9ydCB7IGFzc2VydCwgZGV0YWlscyBhcyBYLCBGYWlsIH0gZnJvbSAnQGFnb3JpYy9hc3NlcnQnOyovXG5cbi8qIFdBUk5JTkc6IEdsb2JhbCBNdXRhYmxlIFN0YXRlISovXG4vKiBUaGlzIHN0YXRlIGlzIGNvbW11bmljYXRlZCB0byBgYXNzZXJ0YCB0aGF0IG1ha2VzIGl0IGF2YWlsYWJsZSB0byB0aGUqL1xuLyogY2F1c2FsIGNvbnNvbGUsIHdoaWNoIGFmZmVjdHMgdGhlIGNvbnNvbGUgbG9nIG91dHB1dC4gTm9ybWFsbHkgd2UqL1xuLyogcmVnYXJkIHRoZSBhYmlsaXR5IHRvIHNlZSBjb25zb2xlIGxvZyBvdXRwdXQgYXMgYSBtZXRhLWxldmVsIHByaXZpbGVnZSovXG4vKiBhbmFsb2dvdXMgdG8gdGhlIGFiaWxpdHkgdG8gZGVidWcuIEFzaWRlIGZyb20gdGhhdCwgdGhpcyBtb2R1bGUgc2hvdWxkKi9cbi8qIG5vdCBoYXZlIGFueSBvYnNlcnZhYmx5IG11dGFibGUgc3RhdGUuKi9cblxubGV0IGhpZGRlblByaW9yRXJyb3I7XG5sZXQgaGlkZGVuQ3VycmVudFR1cm49MDtcbmxldCBoaWRkZW5DdXJyZW50RXZlbnQ9MDtcblxuY29uc3QgREVCVUc9Z2V0RW52aXJvbm1lbnRPcHRpb24oJ0RFQlVHJywnJyk7XG5cbi8qIFR1cm4gb24gaWYgeW91IHNlZW0gdG8gYmUgbG9zaW5nIGVycm9yIGxvZ2dpbmcgYXQgdGhlIHRvcCBvZiB0aGUgZXZlbnQgbG9vcCovXG5jb25zdCBWRVJCT1NFPURFQlVHLnNwbGl0KCc6JykuaW5jbHVkZXMoJ3RyYWNrLXR1cm5zJyk7XG5cbi8qIFRyYWNrLXR1cm5zIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQgYW5kIGNhbiBiZSBlbmFibGVkIGJ5IGFuIGVudmlyb25tZW50Ki9cbi8qIG9wdGlvbi4qL1xuY29uc3QgVFJBQ0tfVFVSTlM9Z2V0RW52aXJvbm1lbnRPcHRpb24oJ1RSQUNLX1RVUk5TJywnZGlzYWJsZWQnKTtcbmlmKFRSQUNLX1RVUk5TIT09J2VuYWJsZWQnJiZUUkFDS19UVVJOUyE9PSdkaXNhYmxlZCcpe1xudGhyb3cgVHlwZUVycm9yKCBgdW5yZWNvZ25pemVkIFRSQUNLX1RVUk5TICR7SlNPTi5zdHJpbmdpZnkoVFJBQ0tfVFVSTlMpfWApO1xuIH1cbmNvbnN0IEVOQUJMRUQ9KFRSQUNLX1RVUk5TfHwnZGlzYWJsZWQnKT09PSdlbmFibGVkJztcblxuLyogV2UgaG9pc3QgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgb3V0IG9mIHRyYWNrVHVybnMoKSB0byBkaXNjb3VyYWdlIHRoZSovXG4vKiBjbG9zdXJlcyBmcm9tIGhvbGRpbmcgb250byAnYXJncycgb3IgJ2Z1bmMnIGxvbmdlciB0aGFuIG5lY2Vzc2FyeSwqL1xuLyogd2hpY2ggd2UndmUgc2VlbiBjYXVzZSBIYW5kbGVkUHJvbWlzZSBhcmd1bWVudHMgdG8gYmUgcmV0YWluZWQgZm9yKi9cbi8qIGEgc3VycHJpc2luZ2x5IGxvbmcgdGltZS4qL1xuXG5jb25zdCBhZGRSZWplY3Rpb25Ob3RlPShkZXRhaWxzTm90ZSk9PihyZWFzb24pPT57XG5pZihyZWFzb24gaW5zdGFuY2VvZiBFcnJvcil7XG5hc3NlcnQubm90ZShyZWFzb24sZGV0YWlsc05vdGUpO1xuIH1cbmlmKFZFUkJPU0Upe1xuY29uc29sZS5sb2coJ1JFSkVDVEVEIGF0IHRvcCBvZiBldmVudCBsb29wJyxyZWFzb24pO1xuIH1cbiB9O1xuXG5jb25zdCB3cmFwRnVuY3Rpb249XG4oZnVuYyxzZW5kaW5nRXJyb3IsWCk9PlxuKC4uLmFyZ3MpPT57XG5oaWRkZW5QcmlvckVycm9yPXNlbmRpbmdFcnJvcjtcbmhpZGRlbkN1cnJlbnRUdXJuKz0xO1xuaGlkZGVuQ3VycmVudEV2ZW50PTA7XG50cnl7XG5sZXQgcmVzdWx0O1xudHJ5e1xucmVzdWx0PWZ1bmMoLi4uYXJncyk7XG4gfWNhdGNoKGVycil7XG5pZihlcnIgaW5zdGFuY2VvZiBFcnJvcil7XG5hc3NlcnQubm90ZShcbmVycixcblggYFRocm93biBmcm9tOiAke2hpZGRlblByaW9yRXJyb3J9OiR7aGlkZGVuQ3VycmVudFR1cm59LiR7aGlkZGVuQ3VycmVudEV2ZW50fWApO1xuXG4gfVxuaWYoVkVSQk9TRSl7XG5jb25zb2xlLmxvZygnVEhST1dOIHRvIHRvcCBvZiBldmVudCBsb29wJyxlcnIpO1xuIH1cbnRocm93IGVycjtcbiB9XG4vKiBNdXN0IGNhcHR1cmUgdGhpcyBub3csIG5vdCB3aGVuIHRoZSBjYXRjaCB0cmlnZ2Vycy4qL1xuY29uc3QgZGV0YWlsc05vdGU9WCBgUmVqZWN0aW9uIGZyb206ICR7aGlkZGVuUHJpb3JFcnJvcn06JHtoaWRkZW5DdXJyZW50VHVybn0uJHtoaWRkZW5DdXJyZW50RXZlbnR9YDtcblByb21pc2UucmVzb2x2ZShyZXN1bHQpLmNhdGNoKGFkZFJlamVjdGlvbk5vdGUoZGV0YWlsc05vdGUpKTtcbnJldHVybiByZXN1bHQ7XG4gfWZpbmFsbHl7XG5oaWRkZW5QcmlvckVycm9yPXVuZGVmaW5lZDtcbiB9XG4gfTtcblxuLyoqXG4gKiBHaXZlbiBhIGxpc3Qgb2YgYFR1cm5TdGFydGVyRm5gcywgcmV0dXJucyBhIGxpc3Qgb2YgYFR1cm5TdGFydGVyRm5gcyB3aG9zZVxuICogYHRoaXNgLWZyZWUgY2FsbCBiZWhhdmlvcnMgYXJlIG5vdCBvYnNlcnZhYmx5IGRpZmZlcmVudCB0byB0aG9zZSB0aGF0XG4gKiBjYW5ub3Qgc2VlIGNvbnNvbGUgb3V0cHV0LiBUaGUgb25seSBwdXJwb3NlIGlzIHRvIGNhdXNlIGFkZGl0aW9uYWxcbiAqIGluZm9ybWF0aW9uIHRvIGFwcGVhciBvbiB0aGUgY29uc29sZS5cbiAqXG4gKiBUaGUgY2FsbCB0byBgdHJhY2tUdXJuc2AgaXMgaXRzZWxmIGEgc2VuZGluZyBldmVudCwgdGhhdCBvY2N1cnMgaW4gc29tZSBjYWxsXG4gKiBzdGFjayBpbiBzb21lIHR1cm4gbnVtYmVyIGF0IHNvbWUgZXZlbnQgbnVtYmVyIHdpdGhpbiB0aGF0IHR1cm4uIEVhY2ggY2FsbFxuICogdG8gYW55IG9mIHRoZSByZXR1cm5lZCBgVHVyblN0YXJ0Rm5gcyBpcyBhIHJlY2VpdmluZyBldmVudCB0aGF0IGJlZ2lucyBhIG5ld1xuICogdHVybi4gVGhpcyBzZW5kaW5nIGV2ZW50IGNhdXNlZCBlYWNoIG9mIHRob3NlIHJlY2VpdmluZyBldmVudHMuXG4gKlxuICogQHRlbXBsYXRlIHtUdXJuU3RhcnRlckZuW119IFRcbiAqIEBwYXJhbSB7VH0gZnVuY3NcbiAqIEByZXR1cm5zIHtUfVxuICovXG5jb25zdCAgICAgICAgdHJhY2tUdXJucz0oZnVuY3MpPT57XG5pZighRU5BQkxFRHx8dHlwZW9mIGdsb2JhbFRoaXM9PT0ndW5kZWZpbmVkJ3x8IWdsb2JhbFRoaXMuYXNzZXJ0KXtcbnJldHVybiBmdW5jcztcbiB9XG5jb25zdHtkZXRhaWxzOlh9PWFzc2VydDtcblxuaGlkZGVuQ3VycmVudEV2ZW50Kz0xO1xuY29uc3Qgc2VuZGluZ0Vycm9yPUVycm9yKFxuIGBFdmVudDogJHtoaWRkZW5DdXJyZW50VHVybn0uJHtoaWRkZW5DdXJyZW50RXZlbnR9YCk7XG5cbmlmKGhpZGRlblByaW9yRXJyb3IhPT11bmRlZmluZWQpe1xuYXNzZXJ0Lm5vdGUoc2VuZGluZ0Vycm9yLFggYENhdXNlZCBieTogJHtoaWRkZW5QcmlvckVycm9yfWApO1xuIH1cblxucmV0dXJuICgvKiogQHR5cGUge1R9ICovXG5mdW5jcy5tYXAoKGZ1bmMpPT5mdW5jJiZ3cmFwRnVuY3Rpb24oZnVuYyxzZW5kaW5nRXJyb3IsWCkpKTtcblxuIH07XG5cbi8qKlxuICogQW4gb3B0aW9uYWwgZnVuY3Rpb24gdGhhdCBpcyBub3QgdGhpcy1zZW5zaXRpdmUsIGV4cGVjdGVkIHRvIGJlIGNhbGxlZCBhdFxuICogYm90dG9tIG9mIHN0YWNrIHRvIHN0YXJ0IGEgbmV3IHR1cm4uXG4gKlxuICogQHR5cGVkZWYgeygoLi4uYXJnczogYW55W10pID0+IGFueSkgfCB1bmRlZmluZWR9IFR1cm5TdGFydGVyRm5cbiAqLyRo4oCNX29uY2UudHJhY2tUdXJucyh0cmFja1R1cm5zKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJ0cmFja1R1cm5zIjpbInRyYWNrVHVybnMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAQQwzlEACAABAAgAAHgAAAEBlbmRvL2Zhci12MC4yLjIyL3NyYy9pbmRleC5qc3siaW1wb3J0cyI6WyJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGVuZG8vcGFzcy1zdHlsZSJdLCJleHBvcnRzIjpbImdldEludGVyZmFjZU9mIiwiZ2V0SW50ZXJmYWNlT2YiLG51bGxdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW11dLFtcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW11dXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiQGVuZG8vZXZlbnR1YWwtc2VuZCI6W1siRSIsIkUiXV0sIkBlbmRvL3Bhc3Mtc3R5bGUiOltbIkZhciIsIkZhciJdLFsiZ2V0SW50ZXJmYWNlT2YiLCJnZXRJbnRlcmZhY2VPZiJdLFsicGFzc1N0eWxlT2YiLCJwYXNzU3R5bGVPZiJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA+UN81nwIAAB8CAAAIAAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS43L2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vc3JjL2l0ZXItaGVscGVycy5qcyIsIi4vc3JjL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwiLi9zcmMvZXJyb3IuanMiLCIuL3NyYy9yZW1vdGFibGUuanMiLCIuL3NyYy9zeW1ib2wuanMiLCIuL3NyYy9wYXNzU3R5bGVPZi5qcyIsIi4vc3JjL21ha2VUYWdnZWQuanMiLCIuL3NyYy9tYWtlLWZhci5qcyIsIi4vc3JjL3R5cGVHdWFyZHMuanMiLCIuL3NyYy90eXBlcy5qcyJdLCJleHBvcnRzIjpbIkZhciIsIkZhciIsImFzc2VydENvcHlBcnJheSIsImFzc2VydENvcHlBcnJheSIsImFzc2VydFBhc3NhYmxlIiwiYXNzZXJ0UGFzc2FibGUiLCJmaWx0ZXJJdGVyYWJsZSIsImZpbHRlckl0ZXJhYmxlIiwiaXNPYmplY3QiLCJpc09iamVjdCIsImlzUGFzc2FibGVTeW1ib2wiLCJpc1Bhc3NhYmxlU3ltYm9sIiwidG9QYXNzYWJsZUVycm9yIiwidG9QYXNzYWJsZUVycm9yIixudWxsLG51bGxdLCJyZWV4cG9ydHMiOlsiLi9zcmMvdHlwZXMuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL3NyYy9pdGVyLWhlbHBlcnMuanNcIiwgW11dLFtcIi4vc3JjL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtdXSxbXCIuL3NyYy9lcnJvci5qc1wiLCBbXV0sW1wiLi9zcmMvcmVtb3RhYmxlLmpzXCIsIFtdXSxbXCIuL3NyYy9zeW1ib2wuanNcIiwgW11dLFtcIi4vc3JjL3Bhc3NTdHlsZU9mLmpzXCIsIFtdXSxbXCIuL3NyYy9tYWtlVGFnZ2VkLmpzXCIsIFtdXSxbXCIuL3NyYy9tYWtlLWZhci5qc1wiLCBbXV0sW1wiLi9zcmMvdHlwZUd1YXJkcy5qc1wiLCBbXV0sW1wiLi9zcmMvdHlwZXMuanNcIiwgW11dXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiLi9zcmMvaXRlci1oZWxwZXJzLmpzIjpbWyJtYXBJdGVyYWJsZSIsIm1hcEl0ZXJhYmxlIl0sWyJmaWx0ZXJJdGVyYWJsZSIsImZpbHRlckl0ZXJhYmxlIl1dLCIuL3NyYy9wYXNzU3R5bGUtaGVscGVycy5qcyI6W1siUEFTU19TVFlMRSIsIlBBU1NfU1RZTEUiXSxbImlzT2JqZWN0IiwiaXNPYmplY3QiXSxbImFzc2VydENoZWNrZXIiLCJhc3NlcnRDaGVja2VyIl0sWyJnZXRUYWciLCJnZXRUYWciXSxbImhhc093blByb3BlcnR5T2YiLCJoYXNPd25Qcm9wZXJ0eU9mIl1dLCIuL3NyYy9lcnJvci5qcyI6W1siZ2V0RXJyb3JDb25zdHJ1Y3RvciIsImdldEVycm9yQ29uc3RydWN0b3IiXSxbInRvUGFzc2FibGVFcnJvciIsInRvUGFzc2FibGVFcnJvciJdLFsiaXNFcnJvckxpa2UiLCJpc0Vycm9yTGlrZSJdXSwiLi9zcmMvcmVtb3RhYmxlLmpzIjpbWyJnZXRJbnRlcmZhY2VPZiIsImdldEludGVyZmFjZU9mIl1dLCIuL3NyYy9zeW1ib2wuanMiOltbImFzc2VydFBhc3NhYmxlU3ltYm9sIiwiYXNzZXJ0UGFzc2FibGVTeW1ib2wiXSxbImlzUGFzc2FibGVTeW1ib2wiLCJpc1Bhc3NhYmxlU3ltYm9sIl0sWyJuYW1lRm9yUGFzc2FibGVTeW1ib2wiLCJuYW1lRm9yUGFzc2FibGVTeW1ib2wiXSxbInBhc3NhYmxlU3ltYm9sRm9yTmFtZSIsInBhc3NhYmxlU3ltYm9sRm9yTmFtZSJdXSwiLi9zcmMvcGFzc1N0eWxlT2YuanMiOltbInBhc3NTdHlsZU9mIiwicGFzc1N0eWxlT2YiXSxbImFzc2VydFBhc3NhYmxlIiwiYXNzZXJ0UGFzc2FibGUiXV0sIi4vc3JjL21ha2VUYWdnZWQuanMiOltbIm1ha2VUYWdnZWQiLCJtYWtlVGFnZ2VkIl1dLCIuL3NyYy9tYWtlLWZhci5qcyI6W1siUmVtb3RhYmxlIiwiUmVtb3RhYmxlIl0sWyJGYXIiLCJGYXIiXSxbIlRvRmFyRnVuY3Rpb24iLCJUb0ZhckZ1bmN0aW9uIl1dLCIuL3NyYy90eXBlR3VhcmRzLmpzIjpbWyJhc3NlcnRSZWNvcmQiLCJhc3NlcnRSZWNvcmQiXSxbImFzc2VydENvcHlBcnJheSIsImFzc2VydENvcHlBcnJheSJdLFsiYXNzZXJ0UmVtb3RhYmxlIiwiYXNzZXJ0UmVtb3RhYmxlIl0sWyJpc1JlbW90YWJsZSIsImlzUmVtb3RhYmxlIl0sWyJpc1JlY29yZCIsImlzUmVjb3JkIl0sWyJpc0NvcHlBcnJheSIsImlzQ29weUFycmF5Il1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADeRraqkwcAAJMHAAAoAAAAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjcvc3JjL2NvcHlBcnJheS5qc3siaW1wb3J0cyI6WyIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIl0sImV4cG9ydHMiOlsiQ29weUFycmF5SGVscGVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydENoZWNrZXIsY2hlY2tOb3JtYWxQcm9wZXJ0eTskaOKAjV9pbXBvcnRzKFtbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsIFskaOKAjV9hID0+IChhc3NlcnRDaGVja2VyID0gJGjigI1fYSldXSxbXCJjaGVja05vcm1hbFByb3BlcnR5XCIsIFskaOKAjV9hID0+IChjaGVja05vcm1hbFByb3BlcnR5ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5jb25zdHtkZXRhaWxzOlh9PWFzc2VydDtcbmNvbnN0e2dldFByb3RvdHlwZU9mfT1PYmplY3Q7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuY29uc3R7aXNBcnJheSxwcm90b3R5cGU6YXJyYXlQcm90b3R5cGV9PUFycmF5O1xuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gY2FuZGlkYXRlXG4gKiBAcGFyYW0ge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5DaGVja2VyfSBbY2hlY2tdXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2FuQmVWYWxpZD0oY2FuZGlkYXRlLGNoZWNrPXVuZGVmaW5lZCk9PlxuaXNBcnJheShjYW5kaWRhdGUpfHxcbiEhY2hlY2smJmNoZWNrKGZhbHNlLFggYEFycmF5IGV4cGVjdGVkOiAke2NhbmRpZGF0ZX1gKTtcblxuLyoqXG4gKlxuICogQHR5cGUge1hpbXBvcnQoJy4vaW50ZXJuYWwtdHlwZXMuanMnKS5QYXNzU3R5bGVIZWxwZXJ9XG4gKi9cbmNvbnN0ICAgICAgICBDb3B5QXJyYXlIZWxwZXI9aGFyZGVuKHtcbnN0eWxlTmFtZTonY29weUFycmF5JyxcblxuY2FuQmVWYWxpZCxcblxuYXNzZXJ0VmFsaWQ6KGNhbmRpZGF0ZSxwYXNzU3R5bGVPZlJlY3VyKT0+e1xuY2FuQmVWYWxpZChjYW5kaWRhdGUsYXNzZXJ0Q2hlY2tlcik7XG5nZXRQcm90b3R5cGVPZihjYW5kaWRhdGUpPT09YXJyYXlQcm90b3R5cGV8fFxuYXNzZXJ0LmZhaWwoWCBgTWFsZm9ybWVkIGFycmF5OiAke2NhbmRpZGF0ZX1gLFR5cGVFcnJvcik7XG4vKiBTaW5jZSB3ZSdyZSBhbHJlYWR5IGVuc3VyZWQgY2FuZGlkYXRlIGlzIGFuIGFycmF5LCBpdCBzaG91bGQgbm90IGJlKi9cbi8qIHBvc3NpYmxlIGZvciB0aGUgZm9sbG93aW5nIHRlc3QgdG8gZmFpbCovXG5jaGVja05vcm1hbFByb3BlcnR5KGNhbmRpZGF0ZSwnbGVuZ3RoJyxmYWxzZSxhc3NlcnRDaGVja2VyKTtcbmNvbnN0IGxlbj0vKiogQHR5cGUge3Vua25vd25bXX0gKi9jYW5kaWRhdGUubGVuZ3RoO1xuZm9yKGxldCBpPTA7aTxsZW47aSs9MSl7XG5jaGVja05vcm1hbFByb3BlcnR5KGNhbmRpZGF0ZSxpLHRydWUsYXNzZXJ0Q2hlY2tlcik7XG4gfVxuLyogKzEgZm9yIHRoZSAnbGVuZ3RoJyBwcm9wZXJ0eSBpdHNlbGYuKi9cbm93bktleXMoY2FuZGlkYXRlKS5sZW5ndGg9PT1sZW4rMXx8XG5hc3NlcnQuZmFpbChYIGBBcnJheXMgbXVzdCBub3QgaGF2ZSBub24taW5kZXhlczogJHtjYW5kaWRhdGV9YCxUeXBlRXJyb3IpO1xuLyogUmVjdXJzaXZlbHkgdmFsaWRhdGUgdGhhdCBlYWNoIG1lbWJlciBpcyBwYXNzYWJsZS4qL1xuY2FuZGlkYXRlLmV2ZXJ5KCh2KT0+ISFwYXNzU3R5bGVPZlJlY3VyKHYpKTtcbiB9fSk7JGjigI1fb25jZS5Db3B5QXJyYXlIZWxwZXIoQ29weUFycmF5SGVscGVyKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJDb3B5QXJyYXlIZWxwZXIiOlsiQ29weUFycmF5SGVscGVyIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAIP12yzPBwAAzwcAACkAAABAZW5kby9wYXNzLXN0eWxlLXYwLjEuNy9zcmMvY29weVJlY29yZC5qc3siaW1wb3J0cyI6WyIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIl0sImV4cG9ydHMiOlsiQ29weVJlY29yZEhlbHBlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnRDaGVja2VyLGNhbkJlTWV0aG9kLGNoZWNrTm9ybWFsUHJvcGVydHk7JGjigI1faW1wb3J0cyhbW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRo4oCNX2EpXV0sW1wiY2FuQmVNZXRob2RcIiwgWyRo4oCNX2EgPT4gKGNhbkJlTWV0aG9kID0gJGjigI1fYSldXSxbXCJjaGVja05vcm1hbFByb3BlcnR5XCIsIFskaOKAjV9hID0+IChjaGVja05vcm1hbFByb3BlcnR5ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cbmNvbnN0e2RldGFpbHM6WH09YXNzZXJ0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcbmNvbnN0e2dldFByb3RvdHlwZU9mLHZhbHVlcyxwcm90b3R5cGU6b2JqZWN0UHJvdG90eXBlfT1PYmplY3Q7XG5cbi8qKlxuICpcbiAqIEB0eXBlIHtYaW1wb3J0KCcuL2ludGVybmFsLXR5cGVzLmpzJykuUGFzc1N0eWxlSGVscGVyfVxuICovXG5jb25zdCAgICAgICAgQ29weVJlY29yZEhlbHBlcj1oYXJkZW4oe1xuc3R5bGVOYW1lOidjb3B5UmVjb3JkJyxcblxuY2FuQmVWYWxpZDooY2FuZGlkYXRlLGNoZWNrPXVuZGVmaW5lZCk9PntcbmNvbnN0IHJlamVjdD0hIWNoZWNrJiYoKGRldGFpbHMpPT5jaGVjayhmYWxzZSxkZXRhaWxzKSk7XG5pZihnZXRQcm90b3R5cGVPZihjYW5kaWRhdGUpIT09b2JqZWN0UHJvdG90eXBlKXtcbnJldHVybihcbnJlamVjdCYmXG5yZWplY3QoWCBgUmVjb3JkcyBtdXN0IGluaGVyaXQgZnJvbSBPYmplY3QucHJvdG90eXBlOiAke2NhbmRpZGF0ZX1gKSk7XG5cbiB9XG5cbnJldHVybiBvd25LZXlzKGNhbmRpZGF0ZSkuZXZlcnkoKGtleSk9PntcbnJldHVybihcbih0eXBlb2Yga2V5PT09J3N0cmluZyd8fFxuISFyZWplY3QmJlxucmVqZWN0KFxuWCBgUmVjb3JkcyBjYW4gb25seSBoYXZlIHN0cmluZy1uYW1lZCBwcm9wZXJ0aWVzOiAke2NhbmRpZGF0ZX1gKSkmJihcblxuIWNhbkJlTWV0aG9kKGNhbmRpZGF0ZVtrZXldKXx8XG4hIXJlamVjdCYmXG5yZWplY3QoXG4vKiBUT0RPOiBVcGRhdGUgbWVzc2FnZSBub3cgdGhhdCB0aGVyZSBpcyBubyBzdWNoIHRoaW5nIGFzIFwiaW1wbGljaXQgUmVtb3RhYmxlXCIuKi9cblggYFJlY29yZHMgY2Fubm90IGNvbnRhaW4gbm9uLWZhciBmdW5jdGlvbnMgYmVjYXVzZSB0aGV5IG1heSBiZSBtZXRob2RzIG9mIGFuIGltcGxpY2l0IFJlbW90YWJsZTogJHtjYW5kaWRhdGV9YCkpKTtcblxuXG4gfSk7XG4gfSxcblxuYXNzZXJ0VmFsaWQ6KGNhbmRpZGF0ZSxwYXNzU3R5bGVPZlJlY3VyKT0+e1xuQ29weVJlY29yZEhlbHBlci5jYW5CZVZhbGlkKGNhbmRpZGF0ZSxhc3NlcnRDaGVja2VyKTtcbmZvcihjb25zdCBuYW1lIG9mIG93bktleXMoY2FuZGlkYXRlKSl7XG5jaGVja05vcm1hbFByb3BlcnR5KGNhbmRpZGF0ZSxuYW1lLHRydWUsYXNzZXJ0Q2hlY2tlcik7XG4gfVxuLyogUmVjdXJzaXZlbHkgdmFsaWRhdGUgdGhhdCBlYWNoIG1lbWJlciBpcyBwYXNzYWJsZS4qL1xuZm9yKGNvbnN0IHZhbCBvZiB2YWx1ZXMoY2FuZGlkYXRlKSl7XG5wYXNzU3R5bGVPZlJlY3VyKHZhbCk7XG4gfVxuIH19KTskaOKAjV9vbmNlLkNvcHlSZWNvcmRIZWxwZXIoQ29weVJlY29yZEhlbHBlcik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQ29weVJlY29yZEhlbHBlciI6WyJDb3B5UmVjb3JkSGVscGVyIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGp3uxlLEgAASxIAACQAAABAZW5kby9wYXNzLXN0eWxlLXYwLjEuNy9zcmMvZXJyb3IuanN7ImltcG9ydHMiOlsiLi9wYXNzU3R5bGUtaGVscGVycy5qcyJdLCJleHBvcnRzIjpbIkVycm9ySGVscGVyIiwiZ2V0RXJyb3JDb25zdHJ1Y3RvciIsImlzRXJyb3JMaWtlIiwidG9QYXNzYWJsZUVycm9yIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydENoZWNrZXI7JGjigI1faW1wb3J0cyhbW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL2ludGVybmFsLXR5cGVzLmpzJykuUGFzc1N0eWxlSGVscGVyfSBQYXNzU3R5bGVIZWxwZXIgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkNoZWNrZXJ9IENoZWNrZXIgKi9cblxuY29uc3R7ZGV0YWlsczpYLEZhaWx9PWFzc2VydDtcbmNvbnN0e2dldFByb3RvdHlwZU9mLGdldE93blByb3BlcnR5RGVzY3JpcHRvcnN9PU9iamVjdDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5cbi8qIFRPRE86IE1haW50ZW5hbmNlIGhhemFyZDogQ29vcmRpbmF0ZSB3aXRoIHRoZSBsaXN0IG9mIGVycm9ycyBpbiB0aGUgU0VTKi9cbi8qIHdoaWxlbGlzdC4gQ3VycmVudGx5LCBib3RoIG9taXQgQWdncmVnYXRlRXJyb3IsIHdoaWNoIGlzIG5vdyBzdGFuZGFyZC4gQm90aCovXG4vKiBtdXN0IGV2ZW50dWFsbHkgaW5jbHVkZSBpdC4qL1xuY29uc3QgZXJyb3JDb25zdHJ1Y3RvcnM9bmV3IE1hcChbXG5bJ0Vycm9yJyxFcnJvcl0sXG5bJ0V2YWxFcnJvcicsRXZhbEVycm9yXSxcblsnUmFuZ2VFcnJvcicsUmFuZ2VFcnJvcl0sXG5bJ1JlZmVyZW5jZUVycm9yJyxSZWZlcmVuY2VFcnJvcl0sXG5bJ1N5bnRheEVycm9yJyxTeW50YXhFcnJvcl0sXG5bJ1R5cGVFcnJvcicsVHlwZUVycm9yXSxcblsnVVJJRXJyb3InLFVSSUVycm9yXV0pO1xuXG5cbmNvbnN0ICAgICAgICBnZXRFcnJvckNvbnN0cnVjdG9yPShuYW1lKT0+ZXJyb3JDb25zdHJ1Y3RvcnMuZ2V0KG5hbWUpOyRo4oCNX29uY2UuZ2V0RXJyb3JDb25zdHJ1Y3RvcihnZXRFcnJvckNvbnN0cnVjdG9yKTtcbmhhcmRlbihnZXRFcnJvckNvbnN0cnVjdG9yKTtcblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IGNhbmRpZGF0ZVxuICogQHBhcmFtIHtDaGVja2VyfSBbY2hlY2tdXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tFcnJvckxpa2U9KGNhbmRpZGF0ZSxjaGVjaz11bmRlZmluZWQpPT57XG5jb25zdCByZWplY3Q9ISFjaGVjayYmKChkZXRhaWxzKT0+Y2hlY2soZmFsc2UsZGV0YWlscykpO1xuLyogVE9ETzogTmVlZCBhIGJldHRlciB0ZXN0IHRoYW4gaW5zdGFuY2VvZiovXG5yZXR1cm4oXG5jYW5kaWRhdGUgaW5zdGFuY2VvZiBFcnJvcnx8XG5yZWplY3QmJnJlamVjdChYIGBFcnJvciBleHBlY3RlZDogJHtjYW5kaWRhdGV9YCkpO1xuXG4gfTtcbmhhcmRlbihjaGVja0Vycm9yTGlrZSk7XG5cbi8qKlxuICogVmFsaWRhdGluZyBlcnJvciBvYmplY3RzIGFyZSBwYXNzYWJsZSByYWlzZXMgYSB0ZW5zaW9uIGJldHdlZW4gc2VjdXJpdHlcbiAqIHZzIHByZXNlcnZpbmcgZGlhZ25vc3RpYyBpbmZvcm1hdGlvbi4gRm9yIGVycm9ycywgd2UgbmVlZCB0byByZW1lbWJlclxuICogdGhlIGVycm9yIGl0c2VsZiBleGlzdHMgdG8gaGVscCB1cyBkaWFnbm9zZSBhIGJ1ZyB0aGF0J3MgbGlrZWx5IG1vcmVcbiAqIHByZXNzaW5nIHRoYW4gYSB2YWxpZGl0eSBidWcgaW4gdGhlIGVycm9yIGl0c2VsZi4gVGh1cywgd2hlbmV2ZXIgaXQgaXMgc2FmZVxuICogdG8gZG8gc28sIHdlIHByZWZlciB0byBsZXQgdGhlIGVycm9yLWxpa2UgdGVzdCBzdWNjZWVkIGFuZCB0byBjb3VjaCB0aGVzZVxuICogY29tcGxhaW50cyBhcyBub3RlcyBvbiB0aGUgZXJyb3IuXG4gKlxuICogVG8gcmVzb2x2ZSB0aGlzLCBzdWNoIGEgbWFsZm9ybWVkIGVycm9yIG9iamVjdCB3aWxsIHN0aWxsIHBhc3NcbiAqIGBpc0Vycm9yTGlrZWAgc28gbWFyc2hhbCBjYW4gdXNlIHRoaXMgZm9yIHRvcCBsZXZlbCBlcnJvciB0byByZXBvcnQgZnJvbSxcbiAqIGV2ZW4gaWYgaXQgd291bGQgbm90IGFjdHVhbGx5IHZhbGlkYXRlLlxuICogSW5zdGVhZCwgdGhlIGRpYWdub3N0aWNzIHRoYXQgYGFzc2VydEVycm9yYCB3b3VsZCBoYXZlIHJlcG9ydGVkIGFyZVxuICogYXR0YWNoZWQgYXMgbm90ZXMgdG8gdGhlIG1hbGZvcm1lZCBlcnJvci4gVGh1cywgYSBtYWxmb3JtZWRcbiAqIGVycm9yIGlzIHBhc3NhYmxlIGJ5IGl0c2VsZiwgYnV0IG5vdCBhcyBwYXJ0IG9mIGEgcGFzc2FibGUgc3RydWN0dXJlLlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gY2FuZGlkYXRlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgICAgICAgIGlzRXJyb3JMaWtlPShjYW5kaWRhdGUpPT5jaGVja0Vycm9yTGlrZShjYW5kaWRhdGUpOyRo4oCNX29uY2UuaXNFcnJvckxpa2UoaXNFcnJvckxpa2UpO1xuaGFyZGVuKGlzRXJyb3JMaWtlKTtcblxuLyoqXG4gKiBAdHlwZSB7UGFzc1N0eWxlSGVscGVyfVxuICovXG5jb25zdCAgICAgICAgRXJyb3JIZWxwZXI9aGFyZGVuKHtcbnN0eWxlTmFtZTonZXJyb3InLFxuXG5jYW5CZVZhbGlkOmNoZWNrRXJyb3JMaWtlLFxuXG5hc3NlcnRWYWxpZDooY2FuZGlkYXRlKT0+e1xuRXJyb3JIZWxwZXIuY2FuQmVWYWxpZChjYW5kaWRhdGUsYXNzZXJ0Q2hlY2tlcik7XG5jb25zdCBwcm90bz1nZXRQcm90b3R5cGVPZihjYW5kaWRhdGUpO1xuY29uc3R7bmFtZX09cHJvdG87XG5jb25zdCBFQz1nZXRFcnJvckNvbnN0cnVjdG9yKG5hbWUpO1xuRUMmJkVDLnByb3RvdHlwZT09PXByb3RvfHxcbkZhaWwgYEVycm9ycyBtdXN0IGluaGVyaXQgZnJvbSBhbiBlcnJvciBjbGFzcyAucHJvdG90eXBlICR7Y2FuZGlkYXRlfWA7XG5cbmNvbnN0e1xuLyogVE9ETyBNdXN0IGFsbG93IGBjYXVzZWAsIGBlcnJvcnNgKi9cbm1lc3NhZ2U6bURlc2MsXG5zdGFjazpzdGFja0Rlc2MsXG4uLi5yZXN0RGVzY3N9PVxuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhjYW5kaWRhdGUpO1xub3duS2V5cyhyZXN0RGVzY3MpLmxlbmd0aDwxfHxcbkZhaWwgYFBhc3NlZCBFcnJvciBoYXMgZXh0cmEgdW5wYXNzZWQgcHJvcGVydGllcyAke3Jlc3REZXNjc31gO1xuaWYobURlc2Mpe1xudHlwZW9mIG1EZXNjLnZhbHVlPT09J3N0cmluZyd8fFxuRmFpbCBgUGFzc2VkIEVycm9yIFwibWVzc2FnZVwiICR7bURlc2N9IG11c3QgYmUgYSBzdHJpbmctdmFsdWVkIGRhdGEgcHJvcGVydHkuYDtcbiFtRGVzYy5lbnVtZXJhYmxlfHxcbkZhaWwgYFBhc3NlZCBFcnJvciBcIm1lc3NhZ2VcIiAke21EZXNjfSBtdXN0IG5vdCBiZSBlbnVtZXJhYmxlYDtcbiB9XG5pZihzdGFja0Rlc2Mpe1xudHlwZW9mIHN0YWNrRGVzYy52YWx1ZT09PSdzdHJpbmcnfHxcbkZhaWwgYFBhc3NlZCBFcnJvciBcInN0YWNrXCIgJHtzdGFja0Rlc2N9IG11c3QgYmUgYSBzdHJpbmctdmFsdWVkIGRhdGEgcHJvcGVydHkuYDtcbiFzdGFja0Rlc2MuZW51bWVyYWJsZXx8XG5GYWlsIGBQYXNzZWQgRXJyb3IgXCJzdGFja1wiICR7c3RhY2tEZXNjfSBtdXN0IG5vdCBiZSBlbnVtZXJhYmxlYDtcbiB9XG5yZXR1cm4gdHJ1ZTtcbiB9fSk7XG5cblxuLyoqXG4gKiBSZXR1cm4gYSBuZXcgcGFzc2FibGUgZXJyb3IgdGhhdCBwcm9wYWdhdGVzIHRoZSBkaWFnbm9zdGljIGluZm8gb2YgdGhlXG4gKiBvcmlnaW5hbCwgYW5kIGlzIGxpbmtlZCB0byB0aGUgb3JpZ2luYWwgYXMgYSBub3RlLlxuICpcbiAqIEBwYXJhbSB7RXJyb3J9IGVyclxuICogQHJldHVybnMge0Vycm9yfVxuICovJGjigI1fb25jZS5FcnJvckhlbHBlcihFcnJvckhlbHBlcik7XG5jb25zdCAgICAgICAgdG9QYXNzYWJsZUVycm9yPShlcnIpPT57XG5jb25zdHtuYW1lLG1lc3NhZ2V9PWVycjtcblxuY29uc3QgRUM9Z2V0RXJyb3JDb25zdHJ1Y3RvciggYCR7bmFtZX1gKXx8RXJyb3I7XG5jb25zdCBuZXdFcnJvcj1oYXJkZW4obmV3IEVDKCBgJHttZXNzYWdlfWApKTtcbi8qIEV2ZW4gdGhlIGNsZWFuZWQgdXAgZXJyb3IgY29weSwgaWYgc2VudCB0byB0aGUgY29uc29sZSwgc2hvdWxkKi9cbi8qIGNhdXNlIGhpZGRlbiBkaWFnbm9zdGljIGluZm9ybWF0aW9uIG9mIHRoZSBvcmlnaW5hbCBlcnJvciovXG4vKiB0byBiZSBsb2dnZWQuKi9cbmFzc2VydC5ub3RlKG5ld0Vycm9yLFggYGNvcGllZCBmcm9tIGVycm9yICR7ZXJyfWApO1xucmV0dXJuIG5ld0Vycm9yO1xuIH07JGjigI1fb25jZS50b1Bhc3NhYmxlRXJyb3IodG9QYXNzYWJsZUVycm9yKTtcbmhhcmRlbih0b1Bhc3NhYmxlRXJyb3IpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImdldEVycm9yQ29uc3RydWN0b3IiOlsiZ2V0RXJyb3JDb25zdHJ1Y3RvciJdLCJpc0Vycm9yTGlrZSI6WyJpc0Vycm9yTGlrZSJdLCJFcnJvckhlbHBlciI6WyJFcnJvckhlbHBlciJdLCJ0b1Bhc3NhYmxlRXJyb3IiOlsidG9QYXNzYWJsZUVycm9yIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEo7ZoNVCAAAVQgAACsAAABAZW5kby9wYXNzLXN0eWxlLXYwLjEuNy9zcmMvaXRlci1oZWxwZXJzLmpzeyJpbXBvcnRzIjpbIi4vbWFrZS1mYXIuanMiXSwiZXhwb3J0cyI6WyJmaWx0ZXJJdGVyYWJsZSIsIm1hcEl0ZXJhYmxlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEZhcjskaOKAjV9pbXBvcnRzKFtbXCIuL21ha2UtZmFyLmpzXCIsIFtbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG4vKipcbiAqIFRoZSByZXN1bHQgaXRlcmF0b3IgaGFzIGFzIG1hbnkgZWxlbWVudHMgYXMgdGhlIGBiYXNlSXRlcmF0b3JgIGFuZFxuICogaGF2ZSB0aGUgc2FtZSB0ZXJtaW5hdGlvbiAtLSB0aGUgc2FtZSBjb21wbGV0aW9uIHZhbHVlIG9yIGZhaWx1cmVcbiAqIHJlYXNvbi4gQnV0IHRoZSBub24tZmluYWwgdmFsdWVzIGFyZSB0aGUgY29ycmVzcG9uZGluZyBub24tZmluYWxcbiAqIHZhbHVlcyBmcm9tIGBiYXNlSXRlcmF0b3JgIGFzIHRyYW5zZm9ybWVkIGJ5IGBmdW5jYC5cbiAqXG4gKiBAdGVtcGxhdGUgVCxVXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFQ+fSBiYXNlSXRlcmFibGVcbiAqIEBwYXJhbSB7KHZhbHVlOiBUKSA9PiBVfSBmdW5jXG4gKiBAcmV0dXJucyB7SXRlcmFibGU8VT59XG4gKi9cbmNvbnN0ICAgICAgICBtYXBJdGVyYWJsZT0oYmFzZUl0ZXJhYmxlLGZ1bmMpPT5cbi8qKiBAdHlwZSB7SXRlcmFibGU8VT59ICovXG5GYXIoJ21hcHBlZCBpdGVyYWJsZScse1xuW1N5bWJvbC5pdGVyYXRvcl06KCk9PntcbmNvbnN0IGJhc2VJdGVyYXRvcj1iYXNlSXRlcmFibGVbU3ltYm9sLml0ZXJhdG9yXSgpO1xucmV0dXJuIEZhcignbWFwcGVkIGl0ZXJhdG9yJyx7XG5uZXh0OigpPT57XG5jb25zdHt2YWx1ZTpiYXNlVmFsdWUsZG9uZX09YmFzZUl0ZXJhdG9yLm5leHQoKTtcbmNvbnN0IHZhbHVlPWRvbmU/YmFzZVZhbHVlOmZ1bmMoYmFzZVZhbHVlKTtcbnJldHVybiBoYXJkZW4oe3ZhbHVlLGRvbmV9KTtcbiB9fSk7XG5cbiB9fSk7JGjigI1fb25jZS5tYXBJdGVyYWJsZShtYXBJdGVyYWJsZSk7XG5cbmhhcmRlbihtYXBJdGVyYWJsZSk7XG5cbi8qKlxuICogVGhlIHJlc3VsdCBpdGVyYXRvciBoYXMgYSBzdWJzZXQgb2YgdGhlIG5vbi1maW5hbCB2YWx1ZXMgZnJvbSB0aGVcbiAqIGBiYXNlSXRlcmF0b3JgIC0tLSB0aG9zZSBmb3Igd2hpY2ggYHByZWQodmFsdWUpYCB3YXMgdHJ1dGh5LiBUaGUgcmVzdWx0XG4gKiBoYXMgdGhlIHNhbWUgdGVybWluYXRpb24gYXMgdGhlIGBiYXNlSXRlcmF0b3JgIC0tIHRoZSBzYW1lIGNvbXBsZXRpb24gdmFsdWVcbiAqIG9yIGZhaWx1cmUgcmVhc29uLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFQ+fSBiYXNlSXRlcmFibGVcbiAqIEBwYXJhbSB7KHZhbHVlOiBUKSA9PiBib29sZWFufSBwcmVkXG4gKiBAcmV0dXJucyB7SXRlcmFibGU8VD59XG4gKi9cbmNvbnN0ICAgICAgICBmaWx0ZXJJdGVyYWJsZT0oYmFzZUl0ZXJhYmxlLHByZWQpPT5cbi8qKiBAdHlwZSB7SXRlcmFibGU8VT59ICovXG5GYXIoJ2ZpbHRlcmVkIGl0ZXJhYmxlJyx7XG5bU3ltYm9sLml0ZXJhdG9yXTooKT0+e1xuY29uc3QgYmFzZUl0ZXJhdG9yPWJhc2VJdGVyYWJsZVtTeW1ib2wuaXRlcmF0b3JdKCk7XG5yZXR1cm4gRmFyKCdmaWx0ZXJlZCBpdGVyYXRvcicse1xubmV4dDooKT0+e1xuZm9yKDs7KXtcbmNvbnN0IHJlc3VsdD1iYXNlSXRlcmF0b3IubmV4dCgpO1xuY29uc3R7dmFsdWUsZG9uZX09cmVzdWx0O1xuaWYoZG9uZXx8cHJlZCh2YWx1ZSkpe1xucmV0dXJuIHJlc3VsdDtcbiB9XG4gfVxuIH19KTtcblxuIH19KTskaOKAjV9vbmNlLmZpbHRlckl0ZXJhYmxlKGZpbHRlckl0ZXJhYmxlKTtcblxuaGFyZGVuKGZpbHRlckl0ZXJhYmxlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYXBJdGVyYWJsZSI6WyJtYXBJdGVyYWJsZSJdLCJmaWx0ZXJJdGVyYWJsZSI6WyJmaWx0ZXJJdGVyYWJsZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAD6Vf/NMhoAADIaAAAnAAAAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjcvc3JjL21ha2UtZmFyLmpzeyJpbXBvcnRzIjpbIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiLCIuL3JlbW90YWJsZS5qcyJdLCJleHBvcnRzIjpbIkZhciIsIlJlbW90YWJsZSIsIlRvRmFyRnVuY3Rpb24iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0Q2hlY2tlcixQQVNTX1NUWUxFLGFzc2VydElmYWNlLGdldEludGVyZmFjZU9mLFJlbW90YWJsZUhlbHBlcjskaOKAjV9pbXBvcnRzKFtbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsIFskaOKAjV9hID0+IChhc3NlcnRDaGVja2VyID0gJGjigI1fYSldXSxbXCJQQVNTX1NUWUxFXCIsIFskaOKAjV9hID0+IChQQVNTX1NUWUxFID0gJGjigI1fYSldXV1dLFtcIi4vcmVtb3RhYmxlLmpzXCIsIFtbXCJhc3NlcnRJZmFjZVwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0SWZhY2UgPSAkaOKAjV9hKV1dLFtcImdldEludGVyZmFjZU9mXCIsIFskaOKAjV9hID0+IChnZXRJbnRlcmZhY2VPZiA9ICRo4oCNX2EpXV0sW1wiUmVtb3RhYmxlSGVscGVyXCIsIFskaOKAjV9hID0+IChSZW1vdGFibGVIZWxwZXIgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuSW50ZXJmYWNlU3BlY30gSW50ZXJmYWNlU3BlYyAqL1xuLyoqIEB0ZW1wbGF0ZSBMLFIgQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL2V2ZW50dWFsLXNlbmQnKS5SZW1vdGFibGVCcmFuZDxMLCBSPn0gUmVtb3RhYmxlQnJhbmQgKi9cblxuY29uc3R7cXVvdGU6cSxGYWlsfT1hc3NlcnQ7XG5cbmNvbnN0e3Byb3RvdHlwZTpmdW5jdGlvblByb3RvdHlwZX09RnVuY3Rpb247XG5jb25zdHtcbmdldFByb3RvdHlwZU9mLFxuc2V0UHJvdG90eXBlT2YsXG5jcmVhdGUsXG5pc0Zyb3plbixcbnByb3RvdHlwZTpvYmplY3RQcm90b3R5cGV9PVxuT2JqZWN0O1xuXG4vKipcbiAqIE5vdyB0aGF0IHRoZSByZW1vdGFibGVQcm90byBkb2VzIG5vdCBwcm92aWRlIGl0cyBvd24gYHRvU3RyaW5nYCBtZXRob2QsXG4gKiBlbnN1cmUgaXQgYWx3YXlzIGluaGVyaXRzIGZyb20gc29tZXRoaW5nLiBUaGUgb3JpZ2luYWwgcHJvdG90eXBlIG9mXG4gKiBgcmVtb3RhYmxlYCBpZiB0aGVyZSB3YXMgb25lLCBvciBgT2JqZWN0LnByb3RvdHlwZWAgb3RoZXJ3aXNlLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSByZW1vdGFibGVcbiAqIEBwYXJhbSB7SW50ZXJmYWNlU3BlY30gaWZhY2VcbiAqIEByZXR1cm5zIHtvYmplY3R9XG4gKi9cbmNvbnN0IG1ha2VSZW1vdGFibGVQcm90bz0ocmVtb3RhYmxlLGlmYWNlKT0+e1xubGV0IG9sZFByb3RvPWdldFByb3RvdHlwZU9mKHJlbW90YWJsZSk7XG5pZih0eXBlb2YgcmVtb3RhYmxlPT09J29iamVjdCcpe1xuaWYob2xkUHJvdG89PT1udWxsKXtcbm9sZFByb3RvPW9iamVjdFByb3RvdHlwZTtcbiB9XG5vbGRQcm90bz09PW9iamVjdFByb3RvdHlwZXx8XG5GYWlsIGBGb3Igbm93LCByZW1vdGFibGVzIGNhbm5vdCBpbmhlcml0IGZyb20gYW55dGhpbmcgdW51c3VhbCwgaW4gJHtyZW1vdGFibGV9YDtcbiB9ZWxzZSBpZih0eXBlb2YgcmVtb3RhYmxlPT09J2Z1bmN0aW9uJyl7XG5vbGRQcm90byE9PW51bGx8fFxuRmFpbCBgT3JpZ2luYWwgZnVuY3Rpb24gbXVzdCBub3QgaW5oZXJpdCBmcm9tIG51bGw6ICR7cmVtb3RhYmxlfWA7XG5vbGRQcm90bz09PWZ1bmN0aW9uUHJvdG90eXBlfHxcbmdldFByb3RvdHlwZU9mKG9sZFByb3RvKT09PWZ1bmN0aW9uUHJvdG90eXBlfHxcbkZhaWwgYEZhciBmdW5jdGlvbnMgbXVzdCBvcmlnaW5hbGx5IGluaGVyaXQgZnJvbSBGdW5jdGlvbi5wcm90b3R5cGUsIGluICR7cmVtb3RhYmxlfWA7XG4gfWVsc2V7XG5GYWlsIGB1bnJlY29nbml6ZWQgdHlwZW9mICR7cmVtb3RhYmxlfWA7XG4gfVxucmV0dXJuIGhhcmRlbihcbmNyZWF0ZShvbGRQcm90byx7XG5bUEFTU19TVFlMRV06e3ZhbHVlOidyZW1vdGFibGUnfSxcbltTeW1ib2wudG9TdHJpbmdUYWddOnt2YWx1ZTppZmFjZX19KSk7XG5cblxuIH07XG5cbmNvbnN0IGFzc2VydENhbkJlUmVtb3RhYmxlPShjYW5kaWRhdGUpPT5cblJlbW90YWJsZUhlbHBlci5jYW5CZVZhbGlkKGNhbmRpZGF0ZSxhc3NlcnRDaGVja2VyKTtcblxuLyoqXG4gKiBDcmVhdGUgYW5kIHJlZ2lzdGVyIGEgUmVtb3RhYmxlLiAgQWZ0ZXIgdGhpcywgZ2V0SW50ZXJmYWNlT2YocmVtb3RhYmxlKVxuICogcmV0dXJucyBpZmFjZS5cbiAqXG4gKiAvLyBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzgwNFxuICpcbiAqIEB0ZW1wbGF0ZSB7e319IFRcbiAqIEBwYXJhbSB7SW50ZXJmYWNlU3BlY30gW2lmYWNlXSBUaGUgaW50ZXJmYWNlIHNwZWNpZmljYXRpb24gZm9yXG4gKiB0aGUgcmVtb3RhYmxlLiBGb3Igbm93LCBhIHN0cmluZyBpZmFjZSBtdXN0IGJlIFwiUmVtb3RhYmxlXCIgb3IgYmVnaW4gd2l0aFxuICogXCJBbGxlZ2VkOiBcIiBvciBcIkRlYnVnTmFtZTogXCIsIHRvIHNlcnZlIGFzIHRoZSBhbGxlZ2VkIG5hbWUuIE1vcmVcbiAqIGdlbmVyYWwgaWZhY2VzIGFyZSBub3QgeWV0IGltcGxlbWVudGVkLiBUaGlzIGlzIHRlbXBvcmFyeS4gV2UgaW5jbHVkZSB0aGVcbiAqIFwiQWxsZWdlZFwiIG9yIFwiRGVidWdOYW1lXCIgYXMgYSByZW1pbmRlciB0aGF0IHdlIGRvIG5vdCB5ZXQgaGF2ZSBTd2luZ1NldFxuICogb3IgQ29tbXMgVmF0XG4gKiBzdXBwb3J0IGZvciBlbnN1cmluZyB0aGlzIGlzIGFjY29yZGluZyB0byB0aGUgdmF0IGhvc3RpbmcgdGhlIG9iamVjdC5cbiAqIEN1cnJlbnRseSwgQWxpY2UgY2FuIHRlbGwgQm9iIGFib3V0IENhcm9sLCB3aGVyZSBWYXRBIChvbiBBbGljZSdzIGJlaGFsZilcbiAqIG1pc3JlcHJlc2VudHMgQ2Fyb2wncyBgaWZhY2VgLiBWYXRCIGFuZCB0aGVyZWZvcmUgQm9iIHdpbGwgdGhlbiBzZWVcbiAqIENhcm9sJ3MgYGlmYWNlYCBhcyBtaXNyZXByZXNlbnRlZCBieSBWYXRBLlxuICogQHBhcmFtIHt1bmRlZmluZWR9IFtwcm9wc10gQ3VycmVudGx5IG1heSBvbmx5IGJlIHVuZGVmaW5lZC5cbiAqIFRoYXQgcGxhbiBpcyB0aGF0IG93bi1wcm9wZXJ0aWVzIGFyZSBjb3BpZWQgdG8gdGhlIHJlbW90YWJsZVxuICogQHBhcmFtIHtUfSBbcmVtb3RhYmxlXSBUaGUgb2JqZWN0IHVzZWQgYXMgdGhlIHJlbW90YWJsZVxuICogQHJldHVybnMge1QgJiBSZW1vdGFibGVCcmFuZDx7fSwgVD59IHJlbW90YWJsZSwgbW9kaWZpZWQgZm9yIGRlYnVnZ2FiaWxpdHlcbiAqL1xuY29uc3QgICAgICAgIFJlbW90YWJsZT0oXG5pZmFjZT0nUmVtb3RhYmxlJyxcbnByb3BzPXVuZGVmaW5lZCxcbnJlbW90YWJsZT0vKiogQHR5cGUge1R9ICove30pPT5cbntcbmFzc2VydElmYWNlKGlmYWNlKTtcbmFzc2VydChpZmFjZSk7XG4vKiBUT0RPOiBXaGVuIGlmYWNlIGlzIHJpY2hlciB0aGFuIGp1c3Qgc3RyaW5nLCB3ZSBuZWVkIHRvIGdldCB0aGUgYWxsZWdlZE5hbWUqL1xuLyogaW4gYSBkaWZmZXJlbnQgd2F5LiovXG5wcm9wcz09PXVuZGVmaW5lZHx8RmFpbCBgUmVtb3RhYmxlIHByb3BzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgJHtwcm9wc31gO1xuXG4vKiBGYWlsIGZhc3Q6IGNoZWNrIHRoYXQgdGhlIHVubW9kaWZpZWQgb2JqZWN0IGlzIGFibGUgdG8gYmVjb21lIGEgUmVtb3RhYmxlLiovXG5hc3NlcnRDYW5CZVJlbW90YWJsZShyZW1vdGFibGUpO1xuXG4vKiBFbnN1cmUgdGhhdCB0aGUgcmVtb3RhYmxlIGlzbid0IGFscmVhZHkgbWFya2VkLiovXG4hKFBBU1NfU1RZTEUgaW4gcmVtb3RhYmxlKXx8XG5GYWlsIGBSZW1vdGFibGUgJHtyZW1vdGFibGV9IGlzIGFscmVhZHkgbWFya2VkIGFzIGEgJHtxKFxucmVtb3RhYmxlW1BBU1NfU1RZTEVdKVxuIH1gO1xuLyogYGlzRnJvemVuYCBhbHdheXMgcmV0dXJucyB0cnVlIHdpdGggYSBmYWtlIGBoYXJkZW5gLCBidXQgd2Ugd2FudCB0aGF0IGNhc2UqL1xuLyogdG8gc3VjY2VlZCBhbnl3YXkuIEZha2luZyBgaGFyZGVuYCBpcyBvbmx5IGNvcnJlY3RuZXNzIHByZXNlcnZpbmcqL1xuLyogaWYgdGhlIGNvZGUgaW4gcXVlc3Rpb24gY29udGFpbnMgbm8gYnVncyB0aGF0IHRoZSByZWFsIGBoYXJkZW5gIHdvdWxkKi9cbi8qIGhhdmUgY2F1Z2h0LiovXG4vKiBAdHMtaWdub3JlIGBpc0Zha2VgIHB1cnBvc2VseSBub3QgaW4gdGhlIHR5cGUqL1xuaGFyZGVuLmlzRmFrZXx8XG4vKiBFbnN1cmUgdGhhdCB0aGUgcmVtb3RhYmxlIGlzbid0IGFscmVhZHkgZnJvemVuLiovXG4haXNGcm96ZW4ocmVtb3RhYmxlKXx8XG5GYWlsIGBSZW1vdGFibGUgJHtyZW1vdGFibGV9IGlzIGFscmVhZHkgZnJvemVuYDtcbmNvbnN0IHJlbW90YWJsZVByb3RvPW1ha2VSZW1vdGFibGVQcm90byhyZW1vdGFibGUsaWZhY2UpO1xuXG4vKiBUYWtlIGEgc3RhdGljIGNvcHkgb2YgdGhlIGVudW1lcmFibGUgb3duIHByb3BlcnRpZXMgYXMgZGF0YSBwcm9wZXJ0aWVzLiovXG4vKiBjb25zdCBwcm9wRGVzY3MgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHsgLi4ucHJvcHMgfSk7Ki9cbmNvbnN0IG11dGF0ZUhhcmRlbkFuZENoZWNrPSh0YXJnZXQpPT57XG4vKiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcERlc2NzKTsqL1xuc2V0UHJvdG90eXBlT2YodGFyZ2V0LHJlbW90YWJsZVByb3RvKTtcbmhhcmRlbih0YXJnZXQpO1xuYXNzZXJ0Q2FuQmVSZW1vdGFibGUodGFyZ2V0KTtcbiB9O1xuXG4vKiBGYWlsIGZhc3Q6IGNoZWNrIGEgZnJlc2ggcmVtb3RhYmxlIHRvIHNlZSBpZiBvdXIgcnVsZXMgZml0LiovXG5tdXRhdGVIYXJkZW5BbmRDaGVjayh7fSk7XG5cbi8qIEFjdHVhbGx5IGZpbmlzaCB0aGUgbmV3IHJlbW90YWJsZS4qL1xubXV0YXRlSGFyZGVuQW5kQ2hlY2socmVtb3RhYmxlKTtcblxuLyogQ09NTUlUVEVEISovXG4vKiBXZSdyZSBjb21taXR0ZWQsIHNvIGtlZXAgdGhlIGludGVyZmFjZSBmb3IgZnV0dXJlIHJlZmVyZW5jZS4qL1xuYXNzZXJ0KGlmYWNlIT09dW5kZWZpbmVkKTsvKiBUbyBtYWtlIFR5cGVTY3JpcHQgaGFwcHkqL1xucmV0dXJuICgvKiogQHR5cGUge1QgJiBSZW1vdGFibGVCcmFuZDx7fSwgVD59ICovcmVtb3RhYmxlKTtcbiB9OyRo4oCNX29uY2UuUmVtb3RhYmxlKFJlbW90YWJsZSk7XG5oYXJkZW4oUmVtb3RhYmxlKTtcblxuLyoqXG4gKiBBIGNvbmNpc2UgY29udmVuaWVuY2UgZm9yIHRoZSBtb3N0IGNvbW1vbiBgUmVtb3RhYmxlYCB1c2UuXG4gKlxuICogQHRlbXBsYXRlIHt7fX0gVFxuICogQHBhcmFtIHtzdHJpbmd9IGZhck5hbWUgVGhpcyBuYW1lIHdpbGwgYmUgcHJlcGVuZGVkIHdpdGggYEFsbGVnZWQ6IGBcbiAqIGZvciBub3cgdG8gZm9ybSB0aGUgYFJlbW90YWJsZWAgYGlmYWNlYCBhcmd1bWVudC5cbiAqIEBwYXJhbSB7VH0gW3JlbW90YWJsZV0gVGhlIG9iamVjdCB1c2VkIGFzIHRoZSByZW1vdGFibGVcbiAqL1xuY29uc3QgICAgICAgIEZhcj0oZmFyTmFtZSxyZW1vdGFibGU9dW5kZWZpbmVkKT0+e1xuY29uc3Qgcj1yZW1vdGFibGU9PT11bmRlZmluZWQ/LyoqIEB0eXBlIHtUfSAqL3t9OnJlbW90YWJsZTtcbnJldHVybiBSZW1vdGFibGUoIGBBbGxlZ2VkOiAke2Zhck5hbWV9YCx1bmRlZmluZWQscik7XG4gfTskaOKAjV9vbmNlLkZhcihGYXIpO1xuaGFyZGVuKEZhcik7XG5cbi8qKlxuICogQ29lcmNlIGBmdW5jYCB0byBhIGZhciBmdW5jdGlvbiB0aGF0IHByZXNlcnZlcyBpdHMgY2FsbCBiZWhhdmlvci5cbiAqIElmIGl0IGlzIGFscmVhZHkgYSBmYXIgZnVuY3Rpb24sIHJldHVybiBpdC4gT3RoZXJ3aXNlIG1ha2UgYW5kIHJldHVybiBhXG4gKiBuZXcgZmFyIGZ1bmN0aW9uIHRoYXQgd3JhcHMgYGZ1bmNgIGFuZCBmb3J3YXJkcyBjYWxscyB0byBpdC4gVGhpc1xuICogd29ya3MgZXZlbiBpZiBgZnVuY2AgaXMgYWxyZWFkeSBmcm96ZW4uIGBUb0ZhckZ1bmN0aW9uYCBpcyB0byBiZSB1c2VkXG4gKiB3aGVuIHRoZSBmdW5jdGlvbiBjb21lcyBmcm9tIGVsc2V3aGVyZSB1bmRlciBsZXNzIGNvbnRyb2wuIEZvciBmdW5jdGlvbnNcbiAqIHlvdSBhdXRob3IgaW4gcGxhY2UsIGJldHRlciB0byB1c2UgYEZhcmAgb24gdGhlaXIgZnVuY3Rpb24gbGl0ZXJhbCBkaXJlY3RseS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZmFyTmFtZSB0byBiZSB1c2VkIG9ubHkgaWYgYGZ1bmNgIGlzIG5vdCBhbHJlYWR5IGFcbiAqIGZhciBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7KC4uLmFyZ3M6IGFueVtdKSA9PiBhbnl9IGZ1bmNcbiAqL1xuY29uc3QgICAgICAgIFRvRmFyRnVuY3Rpb249KGZhck5hbWUsZnVuYyk9PntcbmlmKGdldEludGVyZmFjZU9mKGZ1bmMpIT09dW5kZWZpbmVkKXtcbnJldHVybiBmdW5jO1xuIH1cbnJldHVybiBGYXIoZmFyTmFtZSwoLi4uYXJncyk9PmZ1bmMoLi4uYXJncykpO1xuIH07JGjigI1fb25jZS5Ub0ZhckZ1bmN0aW9uKFRvRmFyRnVuY3Rpb24pO1xuaGFyZGVuKFRvRmFyRnVuY3Rpb24pO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlJlbW90YWJsZSI6WyJSZW1vdGFibGUiXSwiRmFyIjpbIkZhciJdLCJUb0ZhckZ1bmN0aW9uIjpbIlRvRmFyRnVuY3Rpb24iXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAApF75R0EAAAdBAAAKQAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS43L3NyYy9tYWtlVGFnZ2VkLmpzeyJpbXBvcnRzIjpbIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiLCIuL3Bhc3NTdHlsZU9mLmpzIl0sImV4cG9ydHMiOlsibWFrZVRhZ2dlZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBQQVNTX1NUWUxFLGFzc2VydFBhc3NhYmxlOyRo4oCNX2ltcG9ydHMoW1tcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcIlBBU1NfU1RZTEVcIiwgWyRo4oCNX2EgPT4gKFBBU1NfU1RZTEUgPSAkaOKAjV9hKV1dXV0sW1wiLi9wYXNzU3R5bGVPZi5qc1wiLCBbW1wiYXNzZXJ0UGFzc2FibGVcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhc3NhYmxlID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cbmNvbnN0e2NyZWF0ZSxwcm90b3R5cGU6b2JqZWN0UHJvdG90eXBlfT1PYmplY3Q7XG5jb25zdHtGYWlsfT1hc3NlcnQ7XG5cbmNvbnN0ICAgICAgICBtYWtlVGFnZ2VkPSh0YWcscGF5bG9hZCk9PntcbnR5cGVvZiB0YWc9PT0nc3RyaW5nJ3x8XG5GYWlsIGBUaGUgdGFnIG9mIGEgdGFnZ2VkIHJlY29yZCBtdXN0IGJlIGEgc3RyaW5nOiAke3RhZ31gO1xuYXNzZXJ0UGFzc2FibGUoaGFyZGVuKHBheWxvYWQpKTtcbnJldHVybiBoYXJkZW4oXG5jcmVhdGUob2JqZWN0UHJvdG90eXBlLHtcbltQQVNTX1NUWUxFXTp7dmFsdWU6J3RhZ2dlZCd9LFxuW1N5bWJvbC50b1N0cmluZ1RhZ106e3ZhbHVlOnRhZ30sXG5wYXlsb2FkOnt2YWx1ZTpwYXlsb2FkLGVudW1lcmFibGU6dHJ1ZX19KSk7XG5cblxuIH07JGjigI1fb25jZS5tYWtlVGFnZ2VkKG1ha2VUYWdnZWQpO1xuaGFyZGVuKG1ha2VUYWdnZWQpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VUYWdnZWQiOlsibWFrZVRhZ2dlZCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAZQCjG9RkAAPUZAAAwAAAAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjcvc3JjL3Bhc3NTdHlsZS1oZWxwZXJzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJQQVNTX1NUWUxFIiwiYXNzZXJ0Q2hlY2tlciIsImNhbkJlTWV0aG9kIiwiY2hlY2tGdW5jdGlvblRhZ1JlY29yZCIsImNoZWNrTm9ybWFsUHJvcGVydHkiLCJjaGVja1Bhc3NTdHlsZSIsImNoZWNrVGFnUmVjb3JkIiwiZ2V0VGFnIiwiaGFzT3duUHJvcGVydHlPZiIsImlzT2JqZWN0IiwiaXNUeXBlZEFycmF5Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyovIDxyZWZlcmVuY2UgdHlwZXM9XCJzZXNcIi8+Ki9cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuQ2hlY2tlcn0gQ2hlY2tlciAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUGFzc1N0eWxlfSBQYXNzU3R5bGUgKi9cblxuY29uc3R7ZGV0YWlsczpYLHF1b3RlOnF9PWFzc2VydDtcbmNvbnN0e2lzQXJyYXl9PUFycmF5O1xuY29uc3R7cHJvdG90eXBlOmZ1bmN0aW9uUHJvdG90eXBlfT1GdW5jdGlvbjtcbmNvbnN0e1xuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLFxuZ2V0UHJvdG90eXBlT2YsXG5oYXNPd25Qcm9wZXJ0eTpvYmplY3RIYXNPd25Qcm9wZXJ0eSxcbmlzRnJvemVuLFxucHJvdG90eXBlOm9iamVjdFByb3RvdHlwZX09XG5PYmplY3Q7XG5jb25zdHthcHBseX09UmVmbGVjdDtcbmNvbnN0e3RvU3RyaW5nVGFnOnRvU3RyaW5nVGFnU3ltYm9sfT1TeW1ib2w7XG5cbmNvbnN0IHR5cGVkQXJyYXlQcm90b3R5cGU9Z2V0UHJvdG90eXBlT2YoVWludDhBcnJheS5wcm90b3R5cGUpO1xuY29uc3QgdHlwZWRBcnJheVRvU3RyaW5nVGFnRGVzYz1nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoXG50eXBlZEFycmF5UHJvdG90eXBlLFxudG9TdHJpbmdUYWdTeW1ib2wpO1xuXG5hc3NlcnQodHlwZWRBcnJheVRvU3RyaW5nVGFnRGVzYyk7XG5jb25zdCBnZXRUeXBlZEFycmF5VG9TdHJpbmdUYWc9dHlwZWRBcnJheVRvU3RyaW5nVGFnRGVzYy5nZXQ7XG5hc3NlcnQodHlwZW9mIGdldFR5cGVkQXJyYXlUb1N0cmluZ1RhZz09PSdmdW5jdGlvbicpO1xuXG5jb25zdCAgICAgICAgaGFzT3duUHJvcGVydHlPZj0ob2JqLHByb3ApPT5cbmFwcGx5KG9iamVjdEhhc093blByb3BlcnR5LG9iaixbcHJvcF0pOyRo4oCNX29uY2UuaGFzT3duUHJvcGVydHlPZihoYXNPd25Qcm9wZXJ0eU9mKTtcbmhhcmRlbihoYXNPd25Qcm9wZXJ0eU9mKTtcblxuY29uc3QgICAgICAgIGlzT2JqZWN0PSh2YWwpPT5PYmplY3QodmFsKT09PXZhbDskaOKAjV9vbmNlLmlzT2JqZWN0KGlzT2JqZWN0KTtcbmhhcmRlbihpc09iamVjdCk7XG5cbi8qKlxuICogRHVwbGljYXRlcyBwYWNrYWdlcy9zZXMvc3JjL21ha2UtaGFyZGVuZXIuanMgdG8gYXZvaWQgYSBkZXBlbmRlbmN5LlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gb2JqZWN0XG4gKi9cbmNvbnN0ICAgICAgICBpc1R5cGVkQXJyYXk9KG9iamVjdCk9Pntcbi8qIFRoZSBvYmplY3QgbXVzdCBwYXNzIGEgYnJhbmQgY2hlY2sgb3IgdG9TdHJpbmdUYWcgd2lsbCByZXR1cm4gdW5kZWZpbmVkLiovXG5jb25zdCB0YWc9YXBwbHkoZ2V0VHlwZWRBcnJheVRvU3RyaW5nVGFnLG9iamVjdCxbXSk7XG5yZXR1cm4gdGFnIT09dW5kZWZpbmVkO1xuIH07JGjigI1fb25jZS5pc1R5cGVkQXJyYXkoaXNUeXBlZEFycmF5KTtcbmhhcmRlbihpc1R5cGVkQXJyYXkpO1xuXG5jb25zdCAgICAgICAgUEFTU19TVFlMRT1TeW1ib2wuZm9yKCdwYXNzU3R5bGUnKTtcblxuLyoqXG4gKiBGb3IgYSBmdW5jdGlvbiB0byBiZSBhIHZhbGlkIG1ldGhvZCwgaXQgbXVzdCBub3QgYmUgcGFzc2FibGUuXG4gKiBPdGhlcndpc2UsIHdlIHJpc2sgY29uZnVzaW5nIHBhc3MtYnktY29weSBkYXRhIGNhcnJ5aW5nXG4gKiBmYXIgZnVuY3Rpb25zIHdpdGggYXR0ZW1wdHMgYXQgZmFyIG9iamVjdHMgd2l0aCBtZXRob2RzLlxuICpcbiAqIFRPRE8gSEFaQVJEIEJlY2F1c2Ugd2UgY2hlY2sgdGhpcyBvbiB0aGUgd2F5IHRvIGhhcmRlbmluZyBhIHJlbW90YWJsZSxcbiAqIHdlIGNhbm5vdCB5ZXQgY2hlY2sgdGhhdCBgZnVuY2AgaXMgaGFyZGVuZWQuIEhvd2V2ZXIsIHdpdGhvdXRcbiAqIGRvaW5nIHNvLCBpdCdzIGluaGVyaXRhbmNlIG1pZ2h0IGNoYW5nZSBhZnRlciB0aGUgYFBBU1NfU1RZTEVgXG4gKiBjaGVjayBiZWxvdy5cbiAqXG4gKiBAcGFyYW0ge2FueX0gZnVuY1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi8kaOKAjV9vbmNlLlBBU1NfU1RZTEUoUEFTU19TVFlMRSk7XG5jb25zdCAgICAgICAgY2FuQmVNZXRob2Q9KGZ1bmMpPT5cbnR5cGVvZiBmdW5jPT09J2Z1bmN0aW9uJyYmIShQQVNTX1NUWUxFIGluIGZ1bmMpOyRo4oCNX29uY2UuY2FuQmVNZXRob2QoY2FuQmVNZXRob2QpO1xuaGFyZGVuKGNhbkJlTWV0aG9kKTtcblxuLyoqXG4gKiBCZWxvdyB3ZSBoYXZlIGEgc2VyaWVzIG9mIHByZWRpY2F0ZSBmdW5jdGlvbnMgYW5kIHRoZWlyIChjdXJyaWVkKSBhc3NlcnRpb25cbiAqIGZ1bmN0aW9ucy4gVGhlIHNlbWFudGljcyBvZiB0aGUgYXNzZXJ0aW9uIGZ1bmN0aW9uIGlzIGp1c3QgdG8gYXNzZXJ0IHRoYXRcbiAqIHRoZSBjb3JyZXNwb25kaW5nIHByZWRpY2F0ZSBmdW5jdGlvbiB3b3VsZCBoYXZlIHJldHVybmVkIHRydWUuIEJ1dCBpdFxuICogcmVwcm9kdWNlcyB0aGUgaW50ZXJuYWwgdGVzdHMgc28gZmFpbHVyZXMgY2FuIGdpdmUgYSBiZXR0ZXIgZXJyb3IgbWVzc2FnZS5cbiAqXG4gKiBAdHlwZSB7Q2hlY2tlcn1cbiAqL1xuY29uc3QgICAgICAgIGFzc2VydENoZWNrZXI9KGNvbmQsZGV0YWlscyk9PntcbmFzc2VydChjb25kLGRldGFpbHMpO1xucmV0dXJuIHRydWU7XG4gfTskaOKAjV9vbmNlLmFzc2VydENoZWNrZXIoYXNzZXJ0Q2hlY2tlcik7XG5oYXJkZW4oYXNzZXJ0Q2hlY2tlcik7XG5cbi8qKlxuICogQ2hlY2tzIGZvciB0aGUgcHJlc2VuY2UgYW5kIGVudW1lcmFiaWxpdHkgb2YgYW4gb3duIGRhdGEgcHJvcGVydHkuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IGNhbmRpZGF0ZVxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfHN5bWJvbH0gcHJvcGVydHlOYW1lXG4gKiBAcGFyYW0ge2Jvb2xlYW59IHNob3VsZEJlRW51bWVyYWJsZVxuICogQHBhcmFtIHtDaGVja2VyfSBbY2hlY2tdXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgICAgICAgIGNoZWNrTm9ybWFsUHJvcGVydHk9KFxuY2FuZGlkYXRlLFxucHJvcGVydHlOYW1lLFxuc2hvdWxkQmVFbnVtZXJhYmxlLFxuY2hlY2spPT5cbntcbmNvbnN0IHJlamVjdD0hIWNoZWNrJiYoKGRldGFpbHMpPT5jaGVjayhmYWxzZSxkZXRhaWxzKSk7XG5jb25zdCBkZXNjPWdldE93blByb3BlcnR5RGVzY3JpcHRvcihjYW5kaWRhdGUscHJvcGVydHlOYW1lKTtcbmlmKGRlc2M9PT11bmRlZmluZWQpe1xucmV0dXJuKFxucmVqZWN0JiZyZWplY3QoWCBgJHtxKHByb3BlcnR5TmFtZSl9IHByb3BlcnR5IGV4cGVjdGVkOiAke2NhbmRpZGF0ZX1gKSk7XG5cbiB9XG5yZXR1cm4oXG4oaGFzT3duUHJvcGVydHlPZihkZXNjLCd2YWx1ZScpfHxcbnJlamVjdCYmXG5yZWplY3QoXG5YIGAke3EocHJvcGVydHlOYW1lKX0gbXVzdCBub3QgYmUgYW4gYWNjZXNzb3IgcHJvcGVydHk6ICR7Y2FuZGlkYXRlfWApKSYmKFxuXG5zaG91bGRCZUVudW1lcmFibGU/XG5kZXNjLmVudW1lcmFibGV8fFxucmVqZWN0JiZcbnJlamVjdChcblggYCR7cShwcm9wZXJ0eU5hbWUpfSBtdXN0IGJlIGFuIGVudW1lcmFibGUgcHJvcGVydHk6ICR7Y2FuZGlkYXRlfWApOlxuXG4hZGVzYy5lbnVtZXJhYmxlfHxcbnJlamVjdCYmXG5yZWplY3QoXG5YIGAke3EoXG5wcm9wZXJ0eU5hbWUpXG4gfSBtdXN0IG5vdCBiZSBhbiBlbnVtZXJhYmxlIHByb3BlcnR5OiAke2NhbmRpZGF0ZX1gKSkpO1xuXG5cbiB9OyRo4oCNX29uY2UuY2hlY2tOb3JtYWxQcm9wZXJ0eShjaGVja05vcm1hbFByb3BlcnR5KTtcbmhhcmRlbihjaGVja05vcm1hbFByb3BlcnR5KTtcblxuY29uc3QgICAgICAgIGdldFRhZz0odGFnUmVjb3JkKT0+dGFnUmVjb3JkW1N5bWJvbC50b1N0cmluZ1RhZ107JGjigI1fb25jZS5nZXRUYWcoZ2V0VGFnKTtcbmhhcmRlbihnZXRUYWcpO1xuXG5jb25zdCAgICAgICAgY2hlY2tQYXNzU3R5bGU9KG9iaixleHBlY3RlZFBhc3NTdHlsZSxjaGVjayk9PntcbmNvbnN0IHJlamVjdD0hIWNoZWNrJiYoKGRldGFpbHMpPT5jaGVjayhmYWxzZSxkZXRhaWxzKSk7XG5jb25zdCBhY3R1YWw9b2JqW1BBU1NfU1RZTEVdO1xucmV0dXJuKFxuYWN0dWFsPT09ZXhwZWN0ZWRQYXNzU3R5bGV8fFxucmVqZWN0JiZcbnJlamVjdChYIGBFeHBlY3RlZCAke3EoZXhwZWN0ZWRQYXNzU3R5bGUpfSwgbm90ICR7cShhY3R1YWwpfTogJHtvYmp9YCkpO1xuXG4gfTskaOKAjV9vbmNlLmNoZWNrUGFzc1N0eWxlKGNoZWNrUGFzc1N0eWxlKTtcbmhhcmRlbihjaGVja1Bhc3NTdHlsZSk7XG5cbmNvbnN0IG1ha2VDaGVja1RhZ1JlY29yZD0oY2hlY2tQcm90byk9Pntcbi8qKlxuICogQHBhcmFtIHt7IFtQQVNTX1NUWUxFXTogc3RyaW5nIH19IHRhZ1JlY29yZFxuICogQHBhcmFtIHtQYXNzU3R5bGV9IHBhc3NTdHlsZVxuICogQHBhcmFtIHtDaGVja2VyfSBbY2hlY2tdXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tUYWdSZWNvcmQ9KHRhZ1JlY29yZCxwYXNzU3R5bGUsY2hlY2spPT57XG5jb25zdCByZWplY3Q9ISFjaGVjayYmKChkZXRhaWxzKT0+Y2hlY2soZmFsc2UsZGV0YWlscykpO1xucmV0dXJuKFxuKGlzT2JqZWN0KHRhZ1JlY29yZCl8fFxucmVqZWN0JiZcbnJlamVjdChYIGBBIG5vbi1vYmplY3QgY2Fubm90IGJlIGEgdGFnUmVjb3JkOiAke3RhZ1JlY29yZH1gKSkmJihcbmlzRnJvemVuKHRhZ1JlY29yZCl8fFxucmVqZWN0JiZyZWplY3QoWCBgQSB0YWdSZWNvcmQgbXVzdCBiZSBmcm96ZW46ICR7dGFnUmVjb3JkfWApKSYmKFxuIWlzQXJyYXkodGFnUmVjb3JkKXx8XG5yZWplY3QmJnJlamVjdChYIGBBbiBhcnJheSBjYW5ub3QgYmUgYSB0YWdSZWNvcmQ6ICR7dGFnUmVjb3JkfWApKSYmXG5jaGVja05vcm1hbFByb3BlcnR5KHRhZ1JlY29yZCxQQVNTX1NUWUxFLGZhbHNlLGNoZWNrKSYmXG5jaGVja1Bhc3NTdHlsZSh0YWdSZWNvcmQscGFzc1N0eWxlLGNoZWNrKSYmXG5jaGVja05vcm1hbFByb3BlcnR5KHRhZ1JlY29yZCxTeW1ib2wudG9TdHJpbmdUYWcsZmFsc2UsY2hlY2spJiYoXG50eXBlb2YgZ2V0VGFnKHRhZ1JlY29yZCk9PT0nc3RyaW5nJ3x8XG5yZWplY3QmJlxucmVqZWN0KFxuWCBgQSBbU3ltYm9sLnRvU3RyaW5nVGFnXS1uYW1lZCBwcm9wZXJ0eSBtdXN0IGJlIGEgc3RyaW5nOiAke3RhZ1JlY29yZH1gKSkmJlxuXG5jaGVja1Byb3RvKHRhZ1JlY29yZCxnZXRQcm90b3R5cGVPZih0YWdSZWNvcmQpLGNoZWNrKSk7XG5cbiB9O1xucmV0dXJuIGhhcmRlbihjaGVja1RhZ1JlY29yZCk7XG4gfTtcblxuY29uc3QgICAgICAgIGNoZWNrVGFnUmVjb3JkPW1ha2VDaGVja1RhZ1JlY29yZChcbih2YWwscHJvdG8sY2hlY2spPT5cbnByb3RvPT09b2JqZWN0UHJvdG90eXBlfHxcbiEhY2hlY2smJlxuY2hlY2soZmFsc2UsWCBgQSB0YWdSZWNvcmQgbXVzdCBpbmhlcml0IGZyb20gT2JqZWN0LnByb3RvdHlwZTogJHt2YWx9YCkpOyRo4oCNX29uY2UuY2hlY2tUYWdSZWNvcmQoY2hlY2tUYWdSZWNvcmQpO1xuXG5oYXJkZW4oY2hlY2tUYWdSZWNvcmQpO1xuXG5jb25zdCAgICAgICAgY2hlY2tGdW5jdGlvblRhZ1JlY29yZD1tYWtlQ2hlY2tUYWdSZWNvcmQoXG4odmFsLHByb3RvLGNoZWNrKT0+XG5wcm90bz09PWZ1bmN0aW9uUHJvdG90eXBlfHxcbnByb3RvIT09bnVsbCYmZ2V0UHJvdG90eXBlT2YocHJvdG8pPT09ZnVuY3Rpb25Qcm90b3R5cGV8fFxuISFjaGVjayYmXG5jaGVjayhcbmZhbHNlLFxuWCBgRm9yIGZ1bmN0aW9ucywgYSB0YWdSZWNvcmQgbXVzdCBpbmhlcml0IGZyb20gRnVuY3Rpb24ucHJvdG90eXBlOiAke3ZhbH1gKSk7JGjigI1fb25jZS5jaGVja0Z1bmN0aW9uVGFnUmVjb3JkKGNoZWNrRnVuY3Rpb25UYWdSZWNvcmQpO1xuXG5cbmhhcmRlbihjaGVja0Z1bmN0aW9uVGFnUmVjb3JkKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJoYXNPd25Qcm9wZXJ0eU9mIjpbImhhc093blByb3BlcnR5T2YiXSwiaXNPYmplY3QiOlsiaXNPYmplY3QiXSwiaXNUeXBlZEFycmF5IjpbImlzVHlwZWRBcnJheSJdLCJQQVNTX1NUWUxFIjpbIlBBU1NfU1RZTEUiXSwiY2FuQmVNZXRob2QiOlsiY2FuQmVNZXRob2QiXSwiYXNzZXJ0Q2hlY2tlciI6WyJhc3NlcnRDaGVja2VyIl0sImNoZWNrTm9ybWFsUHJvcGVydHkiOlsiY2hlY2tOb3JtYWxQcm9wZXJ0eSJdLCJnZXRUYWciOlsiZ2V0VGFnIl0sImNoZWNrUGFzc1N0eWxlIjpbImNoZWNrUGFzc1N0eWxlIl0sImNoZWNrVGFnUmVjb3JkIjpbImNoZWNrVGFnUmVjb3JkIl0sImNoZWNrRnVuY3Rpb25UYWdSZWNvcmQiOlsiY2hlY2tGdW5jdGlvblRhZ1JlY29yZCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADNV8Qs1x4AANceAAAqAAAAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjcvc3JjL3Bhc3NTdHlsZU9mLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3Byb21pc2Uta2l0IiwiLi9wYXNzU3R5bGUtaGVscGVycy5qcyIsIi4vY29weUFycmF5LmpzIiwiLi9jb3B5UmVjb3JkLmpzIiwiLi90YWdnZWQuanMiLCIuL2Vycm9yLmpzIiwiLi9yZW1vdGFibGUuanMiLCIuL3N5bWJvbC5qcyIsIi4vc2FmZS1wcm9taXNlLmpzIl0sImV4cG9ydHMiOlsiYXNzZXJ0UGFzc2FibGUiLCJwYXNzU3R5bGVPZiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBpc1Byb21pc2UsaXNPYmplY3QsaXNUeXBlZEFycmF5LFBBU1NfU1RZTEUsQ29weUFycmF5SGVscGVyLENvcHlSZWNvcmRIZWxwZXIsVGFnZ2VkSGVscGVyLEVycm9ySGVscGVyLFJlbW90YWJsZUhlbHBlcixhc3NlcnRQYXNzYWJsZVN5bWJvbCxhc3NlcnRTYWZlUHJvbWlzZTskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wiaXNQcm9taXNlXCIsIFskaOKAjV9hID0+IChpc1Byb21pc2UgPSAkaOKAjV9hKV1dXV0sW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiaXNPYmplY3RcIiwgWyRo4oCNX2EgPT4gKGlzT2JqZWN0ID0gJGjigI1fYSldXSxbXCJpc1R5cGVkQXJyYXlcIiwgWyRo4oCNX2EgPT4gKGlzVHlwZWRBcnJheSA9ICRo4oCNX2EpXV0sW1wiUEFTU19TVFlMRVwiLCBbJGjigI1fYSA9PiAoUEFTU19TVFlMRSA9ICRo4oCNX2EpXV1dXSxbXCIuL2NvcHlBcnJheS5qc1wiLCBbW1wiQ29weUFycmF5SGVscGVyXCIsIFskaOKAjV9hID0+IChDb3B5QXJyYXlIZWxwZXIgPSAkaOKAjV9hKV1dXV0sW1wiLi9jb3B5UmVjb3JkLmpzXCIsIFtbXCJDb3B5UmVjb3JkSGVscGVyXCIsIFskaOKAjV9hID0+IChDb3B5UmVjb3JkSGVscGVyID0gJGjigI1fYSldXV1dLFtcIi4vdGFnZ2VkLmpzXCIsIFtbXCJUYWdnZWRIZWxwZXJcIiwgWyRo4oCNX2EgPT4gKFRhZ2dlZEhlbHBlciA9ICRo4oCNX2EpXV1dXSxbXCIuL2Vycm9yLmpzXCIsIFtbXCJFcnJvckhlbHBlclwiLCBbJGjigI1fYSA9PiAoRXJyb3JIZWxwZXIgPSAkaOKAjV9hKV1dXV0sW1wiLi9yZW1vdGFibGUuanNcIiwgW1tcIlJlbW90YWJsZUhlbHBlclwiLCBbJGjigI1fYSA9PiAoUmVtb3RhYmxlSGVscGVyID0gJGjigI1fYSldXV1dLFtcIi4vc3ltYm9sLmpzXCIsIFtbXCJhc3NlcnRQYXNzYWJsZVN5bWJvbFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UGFzc2FibGVTeW1ib2wgPSAkaOKAjV9hKV1dXV0sW1wiLi9zYWZlLXByb21pc2UuanNcIiwgW1tcImFzc2VydFNhZmVQcm9taXNlXCIsIFskaOKAjV9hID0+IChhc3NlcnRTYWZlUHJvbWlzZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL2ludGVybmFsLXR5cGVzLmpzJykuUGFzc1N0eWxlSGVscGVyfSBQYXNzU3R5bGVIZWxwZXIgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlBhc3NhYmxlfSBQYXNzYWJsZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUGFzc1N0eWxlfSBQYXNzU3R5bGUgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlBhc3NTdHlsZU9mfSBQYXNzU3R5bGVPZiAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUHJpbWl0aXZlU3R5bGV9IFByaW1pdGl2ZVN0eWxlICovXG5cbi8qKiBAdHlwZWRlZiB7RXhjbHVkZTxQYXNzU3R5bGUsIFByaW1pdGl2ZVN0eWxlIHwgXCJwcm9taXNlXCI+fSBIZWxwZXJQYXNzU3R5bGUgKi9cblxuY29uc3R7ZGV0YWlsczpYLEZhaWwscXVvdGU6cX09YXNzZXJ0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcbmNvbnN0e2lzRnJvemVufT1PYmplY3Q7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzU3R5bGVIZWxwZXJbXX0gcGFzc1N0eWxlSGVscGVyc1xuICogQHJldHVybnMge1JlY29yZDxIZWxwZXJQYXNzU3R5bGUsIFBhc3NTdHlsZUhlbHBlcj4gfVxuICovXG5cbmNvbnN0IG1ha2VIZWxwZXJUYWJsZT0ocGFzc1N0eWxlSGVscGVycyk9Pntcbi8qKiBAdHlwZSB7UmVjb3JkPEhlbHBlclBhc3NTdHlsZSwgYW55PiAmIHtfX3Byb3RvX186IG51bGx9fSAqL1xuY29uc3QgSGVscGVyVGFibGU9e1xuX19wcm90b19fOm51bGwsXG5jb3B5QXJyYXk6dW5kZWZpbmVkLFxuY29weVJlY29yZDp1bmRlZmluZWQsXG50YWdnZWQ6dW5kZWZpbmVkLFxuZXJyb3I6dW5kZWZpbmVkLFxucmVtb3RhYmxlOnVuZGVmaW5lZH07XG5cbmZvcihjb25zdCBoZWxwZXIgb2YgcGFzc1N0eWxlSGVscGVycyl7XG5jb25zdHtzdHlsZU5hbWV9PWhlbHBlcjtcbnN0eWxlTmFtZSBpbiBIZWxwZXJUYWJsZXx8RmFpbCBgVW5yZWNvZ25pemVkIGhlbHBlcjogJHtxKHN0eWxlTmFtZSl9YDtcbkhlbHBlclRhYmxlW3N0eWxlTmFtZV09PT11bmRlZmluZWR8fFxuRmFpbCBgY29uZmxpY3RpbmcgaGVscGVycyBmb3IgJHtxKHN0eWxlTmFtZSl9YDtcbkhlbHBlclRhYmxlW3N0eWxlTmFtZV09aGVscGVyO1xuIH1cbmZvcihjb25zdCBzdHlsZU5hbWUgb2Ygb3duS2V5cyhIZWxwZXJUYWJsZSkpe1xuSGVscGVyVGFibGVbc3R5bGVOYW1lXSE9PXVuZGVmaW5lZHx8XG5GYWlsIGBtaXNzaW5nIGhlbHBlciBmb3IgJHtxKHN0eWxlTmFtZSl9YDtcbiB9XG5cbnJldHVybiBoYXJkZW4oSGVscGVyVGFibGUpO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzU3R5bGVIZWxwZXJbXX0gcGFzc1N0eWxlSGVscGVycyBUaGUgcGFzc1N0eWxlSGVscGVycyB0byByZWdpc3RlcixcbiAqIGluIHByaW9yaXR5IG9yZGVyLlxuICogTk9URSBUaGVzZSBtdXN0IGFsbCBiZSBcInRydXN0ZWRcIixcbiAqIGNvbXBsZXRlLCBhbmQgbm9uLWNvbGxpZGluZy4gYG1ha2VQYXNzU3R5bGVPZmAgbWF5ICphc3N1bWUqIHRoYXQgZWFjaCBoZWxwZXJcbiAqIGRvZXMgd2hhdCBpdCBpcyBzdXBwb3NlZCB0byBkby4gYG1ha2VQYXNzU3R5bGVPZmAgaXMgbm90IHRyeWluZyB0byBkZWZlbmRcbiAqIGl0c2VsZiBhZ2FpbnN0IG1hbGljaW91cyBoZWxwZXJzLCB0aG91Z2ggaXQgZG9lcyBkZWZlbmQgYWdhaW5zdCBzb21lXG4gKiBhY2NpZGVudHMuXG4gKiBAcmV0dXJucyB7UGFzc1N0eWxlT2Z9XG4gKi9cbmNvbnN0IG1ha2VQYXNzU3R5bGVPZj0ocGFzc1N0eWxlSGVscGVycyk9PntcbmNvbnN0IEhlbHBlclRhYmxlPW1ha2VIZWxwZXJUYWJsZShwYXNzU3R5bGVIZWxwZXJzKTtcbmNvbnN0IHJlbW90YWJsZUhlbHBlcj1IZWxwZXJUYWJsZS5yZW1vdGFibGU7XG5cbi8qKlxuICogUHVyZWx5IGZvciBwZXJmb3JtYW5jZS4gSG93ZXZlciBpdCBpcyBtdXRhYmxlIHN0YXRpYyBzdGF0ZSwgYW5kXG4gKiBpdCBkb2VzIGhhdmUgc29tZSBvYnNlcnZhYmlsaXR5IG9uIHByb3hpZXMuIFRPRE8gbmVlZCB0byBhc3Nlc3NcbiAqIHdoZXRoZXIgdGhpcyBjcmVhdGVzIGEgc3RhdGljIGNvbW11bmljYXRpb25zIGNoYW5uZWwuXG4gKlxuICogcGFzc1N0eWxlT2YgZG9lcyBhIGZ1bGwgcmVjdXJzaXZlIHdhbGsgb2YgcGFzcy1ieS1jb3B5XG4gKiBzdHJ1Y3R1cmVzLCBpbiBvcmRlciB0byB2YWxpZGF0ZSB0aGF0IHRoZXkgYXJlIGFjeWNsaWMuIEluIGFkZGl0aW9uXG4gKiBpdCBpcyB1c2VkIGJ5IG90aGVyIGFsZ29yaXRobXMgdG8gcmVjdXJzaXZlbHkgd2FsayB0aGVzZSBwYXNzLWJ5LWNvcHlcbiAqIHN0cnVjdHVyZXMsIHNvIHdpdGhvdXQgdGhpcyBjYWNoZSwgdGhlc2UgYWxnb3JpdGhtcyBjb3VsZCBiZVxuICogTyhOKioyKSBvciB3b3JzZS5cbiAqXG4gKiBAdHlwZSB7V2Vha01hcDxQYXNzYWJsZSwgUGFzc1N0eWxlPn1cbiAqL1xuY29uc3QgcGFzc1N0eWxlTWVtbz1uZXcgV2Vha01hcCgpO1xuXG4vKipcbiAqIEB0eXBlIHtQYXNzU3R5bGVPZn1cbiAqL1xuY29uc3QgcGFzc1N0eWxlT2Y9KHBhc3NhYmxlKT0+e1xuLyogRXZlbiB3aGVuIGEgV2Vha1NldCBpcyBjb3JyZWN0LCB3aGVuIHRoZSBzZXQgaGFzIGEgc2hvcnRlciBsaWZldGltZSovXG4vKiB0aGFuIGl0cyBrZXlzLCB3ZSBwcmVmZXIgYSBTZXQgZHVlIHRvIGV4cGVjdGVkIGltcGxlbWVudGF0aW9uKi9cbi8qIHRyYWRlb2Zmcy4qL1xuY29uc3QgaW5Qcm9ncmVzcz1uZXcgU2V0KCk7XG5cbi8qKlxuICogQHR5cGUge1Bhc3NTdHlsZU9mfVxuICovXG5jb25zdCBwYXNzU3R5bGVPZlJlY3VyPShpbm5lcik9PntcbmNvbnN0IGlubmVySXNPYmplY3Q9aXNPYmplY3QoaW5uZXIpO1xuaWYoaW5uZXJJc09iamVjdCl7XG5pZihwYXNzU3R5bGVNZW1vLmhhcyhpbm5lcikpe1xuLyogQHRzLWlnbm9yZSBUeXBlU2NyaXB0IGRvZXNuJ3Qga25vdyB0aGF0IGBnZXRgIGFmdGVyIGBoYXNgIGlzIHNhZmUqL1xucmV0dXJuIHBhc3NTdHlsZU1lbW8uZ2V0KGlubmVyKTtcbiB9XG4haW5Qcm9ncmVzcy5oYXMoaW5uZXIpfHxcbkZhaWwgYFBhc3MtYnktY29weSBkYXRhIGNhbm5vdCBiZSBjeWNsaWMgJHtpbm5lcn1gO1xuaW5Qcm9ncmVzcy5hZGQoaW5uZXIpO1xuIH1cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2ZJbnRlcm5hbChpbm5lcik7XG5pZihpbm5lcklzT2JqZWN0KXtcbnBhc3NTdHlsZU1lbW8uc2V0KGlubmVyLHBhc3NTdHlsZSk7XG5pblByb2dyZXNzLmRlbGV0ZShpbm5lcik7XG4gfVxucmV0dXJuIHBhc3NTdHlsZTtcbiB9O1xuXG4vKipcbiAqIEB0eXBlIHtQYXNzU3R5bGVPZn1cbiAqL1xuY29uc3QgcGFzc1N0eWxlT2ZJbnRlcm5hbD0oaW5uZXIpPT57XG5jb25zdCB0eXBlc3RyPXR5cGVvZiBpbm5lcjtcbnN3aXRjaCh0eXBlc3RyKXtcbmNhc2UndW5kZWZpbmVkJzpcbmNhc2Unc3RyaW5nJzpcbmNhc2UnYm9vbGVhbic6XG5jYXNlJ251bWJlcic6XG5jYXNlJ2JpZ2ludCc6e1xucmV0dXJuIHR5cGVzdHI7XG4gfVxuY2FzZSdzeW1ib2wnOntcbmFzc2VydFBhc3NhYmxlU3ltYm9sKGlubmVyKTtcbnJldHVybidzeW1ib2wnO1xuIH1cbmNhc2Unb2JqZWN0Jzp7XG5pZihpbm5lcj09PW51bGwpe1xucmV0dXJuJ251bGwnO1xuIH1cbmlmKCFpc0Zyb3plbihpbm5lcikpe1xuYXNzZXJ0LmZhaWwoXG4vKiBUeXBlZEFycmF5cyBnZXQgc3BlY2lhbCB0cmVhdG1lbnQgaW4gaGFyZGVuKCkqL1xuLyogYW5kIGEgY29ycmVzcG9uZGluZyBzcGVjaWFsIGVycm9yIG1lc3NhZ2UgaGVyZS4qL1xuaXNUeXBlZEFycmF5KGlubmVyKT9cblggYENhbm5vdCBwYXNzIG11dGFibGUgdHlwZWQgYXJyYXlzIGxpa2UgJHtpbm5lcn0uYDpcblggYENhbm5vdCBwYXNzIG5vbi1mcm96ZW4gb2JqZWN0cyBsaWtlICR7aW5uZXJ9LiBVc2UgaGFyZGVuKClgKTtcblxuIH1cbmlmKGlzUHJvbWlzZShpbm5lcikpe1xuYXNzZXJ0U2FmZVByb21pc2UoaW5uZXIpO1xucmV0dXJuJ3Byb21pc2UnO1xuIH1cbnR5cGVvZiBpbm5lci50aGVuIT09J2Z1bmN0aW9uJ3x8XG5GYWlsIGBDYW5ub3QgcGFzcyBub24tcHJvbWlzZSB0aGVuYWJsZXNgO1xuY29uc3QgcGFzc1N0eWxlVGFnPWlubmVyW1BBU1NfU1RZTEVdO1xuaWYocGFzc1N0eWxlVGFnIT09dW5kZWZpbmVkKXtcbmFzc2VydC50eXBlb2YocGFzc1N0eWxlVGFnLCdzdHJpbmcnKTtcbmNvbnN0IGhlbHBlcj1IZWxwZXJUYWJsZVtwYXNzU3R5bGVUYWddO1xuaGVscGVyIT09dW5kZWZpbmVkfHxcbkZhaWwgYFVucmVjb2duaXplZCBQYXNzU3R5bGU6ICR7cShwYXNzU3R5bGVUYWcpfWA7XG5oZWxwZXIuYXNzZXJ0VmFsaWQoaW5uZXIscGFzc1N0eWxlT2ZSZWN1cik7XG5yZXR1cm4gKC8qKiBAdHlwZSB7UGFzc1N0eWxlfSAqL3Bhc3NTdHlsZVRhZyk7XG4gfVxuZm9yKGNvbnN0IGhlbHBlciBvZiBwYXNzU3R5bGVIZWxwZXJzKXtcbmlmKGhlbHBlci5jYW5CZVZhbGlkKGlubmVyKSl7XG5oZWxwZXIuYXNzZXJ0VmFsaWQoaW5uZXIscGFzc1N0eWxlT2ZSZWN1cik7XG5yZXR1cm4gaGVscGVyLnN0eWxlTmFtZTtcbiB9XG4gfVxucmVtb3RhYmxlSGVscGVyLmFzc2VydFZhbGlkKGlubmVyLHBhc3NTdHlsZU9mUmVjdXIpO1xucmV0dXJuJ3JlbW90YWJsZSc7XG4gfVxuY2FzZSdmdW5jdGlvbic6e1xuaXNGcm96ZW4oaW5uZXIpfHxcbkZhaWwgYENhbm5vdCBwYXNzIG5vbi1mcm96ZW4gb2JqZWN0cyBsaWtlICR7aW5uZXJ9LiBVc2UgaGFyZGVuKClgO1xudHlwZW9mIGlubmVyLnRoZW4hPT0nZnVuY3Rpb24nfHxcbkZhaWwgYENhbm5vdCBwYXNzIG5vbi1wcm9taXNlIHRoZW5hYmxlc2A7XG5yZW1vdGFibGVIZWxwZXIuYXNzZXJ0VmFsaWQoaW5uZXIscGFzc1N0eWxlT2ZSZWN1cik7XG5yZXR1cm4ncmVtb3RhYmxlJztcbiB9XG5kZWZhdWx0OntcbnRocm93IGFzc2VydC5mYWlsKFggYFVucmVjb2duaXplZCB0eXBlb2YgJHtxKHR5cGVzdHIpfWAsVHlwZUVycm9yKTtcbiB9fVxuXG4gfTtcblxucmV0dXJuIHBhc3NTdHlsZU9mUmVjdXIocGFzc2FibGUpO1xuIH07XG5yZXR1cm4gaGFyZGVuKHBhc3NTdHlsZU9mKTtcbiB9O1xuXG4vKipcbiAqIElmIHRoZXJlIGlzIGFscmVhZHkgYSBgVmF0YURhdGFgIGdsb2JhbCBjb250YWluaW5nIGEgYHBhc3NTdHlsZU9mYCxcbiAqIHRoZW4gcHJlc3VtYWJseSBpdCB3YXMgZW5kb3dlZCBmb3IgdXMgYnkgbGl2ZXNsb3RzLCBzbyB3ZSBzaG91bGQgdXNlXG4gKiBhbmQgZXhwb3J0IHRoYXQgb25lIGluc3RlYWQuIE90aGVyIHNvZnR3YXJlIG1heSBoYXZlIGxlZnQgaXQgZm9yIHVzIGhlcmUsXG4gKiBidXQgaXQgd291bGQgcmVxdWlyZSB3cml0ZSBhY2Nlc3MgdG8gb3VyIGdsb2JhbCwgb3IgdGhlIGFiaWxpdHkgdG9cbiAqIHByb3ZpZGUgZW5kb3dtZW50cyB0byBvdXIgZ2xvYmFsLCBib3RoIG9mIHdoaWNoIHNlZW1zIGFkZXF1YXRlIGFzIGEgdGVzdCBvZlxuICogd2hldGhlciBpdCBpcyBhdXRob3JpemVkIHRvIHNlcnZlIHRoZSBzYW1lIHJvbGUgYXMgbGl2ZXNsb3RzLlxuICpcbiAqIE5PVEUgSEFaQVJEOiBUaGlzIHVzZSBieSBsaXZlc2xvdHMgZG9lcyByZWx5IG9uIGBwYXNzU3R5bGVPZmAgYmVpbmdcbiAqIGRldGVybWluaXN0aWMuIElmIGl0IGlzIG5vdCwgdGhlbiBpbiBhIGxpdmVzbG90LWxpa2UgdmlydHVhbGl6ZWRcbiAqIGVudmlyb25tZW50LCBpdCBjYW4gYmUgdXNlZCB0byBkZXRlY3QgR0MuXG4gKlxuICogQHR5cGUge1Bhc3NTdHlsZU9mfVxuICovXG5jb25zdCAgICAgICAgcGFzc1N0eWxlT2Y9XG4vKiBVTlRJTCBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vaXNzdWVzLzE1MTQqL1xuLyogUHJlZmVyOiBnbG9iYWxUaGlzPy5WYXREYXRhPy5wYXNzU3R5bGVPZiB8fCovXG5nbG9iYWxUaGlzJiZnbG9iYWxUaGlzLlZhdERhdGEmJmdsb2JhbFRoaXMuVmF0RGF0YS5wYXNzU3R5bGVPZnx8XG5tYWtlUGFzc1N0eWxlT2YoW1xuQ29weUFycmF5SGVscGVyLFxuQ29weVJlY29yZEhlbHBlcixcblRhZ2dlZEhlbHBlcixcbkVycm9ySGVscGVyLFxuUmVtb3RhYmxlSGVscGVyXSk7JGjigI1fb25jZS5wYXNzU3R5bGVPZihwYXNzU3R5bGVPZik7XG5cblxuY29uc3QgICAgICAgIGFzc2VydFBhc3NhYmxlPSh2YWwpPT57XG5wYXNzU3R5bGVPZih2YWwpOy8qIHRocm93cyBpZiB2YWwgaXMgbm90IGEgcGFzc2FibGUqL1xuIH07JGjigI1fb25jZS5hc3NlcnRQYXNzYWJsZShhc3NlcnRQYXNzYWJsZSk7XG5oYXJkZW4oYXNzZXJ0UGFzc2FibGUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InBhc3NTdHlsZU9mIjpbInBhc3NTdHlsZU9mIl0sImFzc2VydFBhc3NhYmxlIjpbImFzc2VydFBhc3NhYmxlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAABSxon3DIQAAwyEAACgAAABAZW5kby9wYXNzLXN0eWxlLXYwLjEuNy9zcmMvcmVtb3RhYmxlLmpzeyJpbXBvcnRzIjpbIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiXSwiZXhwb3J0cyI6WyJSZW1vdGFibGVIZWxwZXIiLCJhc3NlcnRJZmFjZSIsImdldEludGVyZmFjZU9mIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydENoZWNrZXIsY2FuQmVNZXRob2QsaGFzT3duUHJvcGVydHlPZixQQVNTX1NUWUxFLGNoZWNrVGFnUmVjb3JkLGNoZWNrRnVuY3Rpb25UYWdSZWNvcmQsaXNPYmplY3QsZ2V0VGFnOyRo4oCNX2ltcG9ydHMoW1tcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIiwgWyRo4oCNX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaOKAjV9hKV1dLFtcImNhbkJlTWV0aG9kXCIsIFskaOKAjV9hID0+IChjYW5CZU1ldGhvZCA9ICRo4oCNX2EpXV0sW1wiaGFzT3duUHJvcGVydHlPZlwiLCBbJGjigI1fYSA9PiAoaGFzT3duUHJvcGVydHlPZiA9ICRo4oCNX2EpXV0sW1wiUEFTU19TVFlMRVwiLCBbJGjigI1fYSA9PiAoUEFTU19TVFlMRSA9ICRo4oCNX2EpXV0sW1wiY2hlY2tUYWdSZWNvcmRcIiwgWyRo4oCNX2EgPT4gKGNoZWNrVGFnUmVjb3JkID0gJGjigI1fYSldXSxbXCJjaGVja0Z1bmN0aW9uVGFnUmVjb3JkXCIsIFskaOKAjV9hID0+IChjaGVja0Z1bmN0aW9uVGFnUmVjb3JkID0gJGjigI1fYSldXSxbXCJpc09iamVjdFwiLCBbJGjigI1fYSA9PiAoaXNPYmplY3QgPSAkaOKAjV9hKV1dLFtcImdldFRhZ1wiLCBbJGjigI1fYSA9PiAoZ2V0VGFnID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5DaGVja2VyfSBDaGVja2VyICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5JbnRlcmZhY2VTcGVjfSBJbnRlcmZhY2VTcGVjICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5NYXJzaGFsR2V0SW50ZXJmYWNlT2Z9IE1hcnNoYWxHZXRJbnRlcmZhY2VPZiAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL2ludGVybmFsLXR5cGVzLmpzJykuUGFzc1N0eWxlSGVscGVyfSBQYXNzU3R5bGVIZWxwZXIgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlJlbW90YWJsZU9iamVjdH0gUmVtb3RhYmxlICovXG5cbmNvbnN0e2RldGFpbHM6WCxGYWlsLHF1b3RlOnF9PWFzc2VydDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5jb25zdHtpc0FycmF5fT1BcnJheTtcbmNvbnN0e1xuZ2V0UHJvdG90eXBlT2YsXG5pc0Zyb3plbixcbnByb3RvdHlwZTpvYmplY3RQcm90b3R5cGUsXG5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzfT1cbk9iamVjdDtcblxuLyoqXG4gKiBAcGFyYW0ge0ludGVyZmFjZVNwZWN9IGlmYWNlXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IFtjaGVja11cbiAqL1xuY29uc3QgY2hlY2tJZmFjZT0oaWZhY2UsY2hlY2spPT57XG5jb25zdCByZWplY3Q9ISFjaGVjayYmKChkZXRhaWxzKT0+Y2hlY2soZmFsc2UsZGV0YWlscykpO1xucmV0dXJuKFxuLyogVE9ETyBvdGhlciBwb3NzaWJsZSBpZmFjZXMsIG9uY2Ugd2UgaGF2ZSB0aGlyZCBwYXJ0eSB2ZXJhY2l0eSovXG4odHlwZW9mIGlmYWNlPT09J3N0cmluZyd8fFxucmVqZWN0JiZcbnJlamVjdChcblggYEZvciBub3csIGludGVyZmFjZSAke2lmYWNlfSBtdXN0IGJlIGEgc3RyaW5nOyB1bmltcGxlbWVudGVkYCkpJiYoXG5cbmlmYWNlPT09J1JlbW90YWJsZSd8fFxuaWZhY2Uuc3RhcnRzV2l0aCgnQWxsZWdlZDogJyl8fFxuaWZhY2Uuc3RhcnRzV2l0aCgnRGVidWdOYW1lOiAnKXx8XG5yZWplY3QmJlxucmVqZWN0KFxuWCBgRm9yIG5vdywgaWZhY2UgJHtxKFxuaWZhY2UpXG4gfSBtdXN0IGJlIFwiUmVtb3RhYmxlXCIgb3IgYmVnaW4gd2l0aCBcIkFsbGVnZWQ6IFwiIG9yIFwiRGVidWdOYW1lOiBcIjsgdW5pbXBsZW1lbnRlZGApKSk7XG5cblxuIH07XG5cbi8qKlxuICogQW4gYGlmYWNlYCBtdXN0IGJlIHB1cmUuIFJpZ2h0IG5vdyBpdCBtdXN0IGJlIGEgc3RyaW5nLCB3aGljaCBpcyBwdXJlLlxuICogTGF0ZXIgd2UgZXhwZWN0IHRvIGluY2x1ZGUgc29tZSBvdGhlciB2YWx1ZXMgdGhhdCBxdWFsaWZ5IGFzIGBQdXJlRGF0YWAsXG4gKiB3aGljaCBpcyBhIHBhc3MtYnktY29weSBzdXBlcnN0cnVjdHVyZSBlbmRpbmcgb25seSBpbiBwcmltaXRpdmVzIG9yXG4gKiBlbXB0eSBwYXNzLWJ5LWNvcHkgY29tcG9zaXRlcy4gTm8gcmVtb3RhYmxlcywgcHJvbWlzZXMsIG9yIGVycm9ycy5cbiAqIFdlICphc3N1bWUqIGZvciBub3cgdGhhdCB0aGUgcGFzcy1ieS1jb3B5IHN1cGVyc3RydWN0dXJlIGNvbnRhaW5zIG5vXG4gKiBwcm94aWVzLlxuICpcbiAqIEBwYXJhbSB7SW50ZXJmYWNlU3BlY30gaWZhY2VcbiAqL1xuY29uc3QgICAgICAgIGFzc2VydElmYWNlPShpZmFjZSk9PmNoZWNrSWZhY2UoaWZhY2UsYXNzZXJ0Q2hlY2tlcik7JGjigI1fb25jZS5hc3NlcnRJZmFjZShhc3NlcnRJZmFjZSk7XG5oYXJkZW4oYXNzZXJ0SWZhY2UpO1xuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0IHwgRnVuY3Rpb259IG9yaWdpbmFsXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IFtjaGVja11cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjaGVja1JlbW90YWJsZVByb3RvT2Y9KG9yaWdpbmFsLGNoZWNrKT0+e1xuY29uc3QgcmVqZWN0PSEhY2hlY2smJigoZGV0YWlscyk9PmNoZWNrKGZhbHNlLGRldGFpbHMpKTtcbmlzT2JqZWN0KG9yaWdpbmFsKXx8XG5GYWlsIGBSZW1vdGFibGVzIG11c3QgYmUgb2JqZWN0cyBvciBmdW5jdGlvbnM6ICR7b3JpZ2luYWx9YDtcblxuLyogQSB2YWxpZCByZW1vdGFibGUgb2JqZWN0IG11c3QgaW5oZXJpdCBmcm9tIGEgXCJ0YWcgcmVjb3JkXCIgLS0gYSovXG4vKiBwbGFpbi1vYmplY3QgcHJvdG90eXBlIGNvbnNpc3Rpbmcgb2Ygb25seSovXG4vKiBhIGBQQVNTX1NUWUxFYCBwcm9wZXJ0eSB3aXRoIHZhbHVlIFwicmVtb3RhYmxlXCIgYW5kIGEgc3VpdGFibGUgYFN5bWJvbC50b1N0cmluZ1RhZ2AqL1xuLyogcHJvcGVydHkuIFRoZSByZW1vdGFibGUgY291bGQgaW5oZXJpdCBkaXJlY3RseSBmcm9tIHN1Y2ggYSB0YWcgcmVjb3JkLCBvciovXG4vKiBpdCBjb3VsZCBpbmhlcml0IGZyb20gYW5vdGhlciB2YWxpZCByZW1vdGFibGUsIHRoYXQgdGhlcmVmb3JlIGl0c2VsZiovXG4vKiBpbmhlcml0cyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IGZyb20gc3VjaCBhIHRhZyByZWNvcmQuKi9cbi8qKi9cbi8qIFRPRE86IEl0IHdvdWxkIGJlIG5pY2UgdG8gdHlwZWRlZiB0aGlzIHNoYXBlLCBidXQgd2UgY2FuJ3QgZGVjbGFyZSBhIHR5cGUqL1xuLyogd2l0aCBQQVNTX1NUWUxFIGZyb20gSlNEb2MuKi9cbi8qKi9cbi8qIEB0eXBlIHt7IFtQQVNTX1NUWUxFXTogc3RyaW5nLCovXG4vKiBbU3ltYm9sLnRvU3RyaW5nVGFnXTogc3RyaW5nLCovXG4vKiB9fSovXG4vKiovXG5jb25zdCBwcm90bz1nZXRQcm90b3R5cGVPZihvcmlnaW5hbCk7XG5pZihwcm90bz09PW9iamVjdFByb3RvdHlwZXx8cHJvdG89PT1udWxsKXtcbnJldHVybihcbnJlamVjdCYmXG5yZWplY3QoWCBgUmVtb3RhYmxlcyBtdXN0IGJlIGV4cGxpY2l0bHkgZGVjbGFyZWQ6ICR7cShvcmlnaW5hbCl9YCkpO1xuXG4gfVxuXG5pZih0eXBlb2Ygb3JpZ2luYWw9PT0nb2JqZWN0Jyl7XG5jb25zdCBwcm90b1Byb3RvPWdldFByb3RvdHlwZU9mKHByb3RvKTtcbmlmKHByb3RvUHJvdG8hPT1vYmplY3RQcm90b3R5cGUmJnByb3RvUHJvdG8hPT1udWxsKXtcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5yZXR1cm4gY2hlY2tSZW1vdGFibGUocHJvdG8sY2hlY2spO1xuIH1cbmlmKCFjaGVja1RhZ1JlY29yZChwcm90bywncmVtb3RhYmxlJyxjaGVjaykpe1xucmV0dXJuIGZhbHNlO1xuIH1cbiB9ZWxzZSBpZih0eXBlb2Ygb3JpZ2luYWw9PT0nZnVuY3Rpb24nKXtcbmlmKCFjaGVja0Z1bmN0aW9uVGFnUmVjb3JkKHByb3RvLCdyZW1vdGFibGUnLGNoZWNrKSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuIH1cblxuLyogVHlwZWNhc3RzIG5lZWRlZCBkdWUgdG8gaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy8xODYzKi9cbmNvbnN0IHBhc3NTdHlsZUtleT0vKiogQHR5cGUge3Vua25vd259ICovUEFTU19TVFlMRTtcbmNvbnN0IHRhZ0tleT0vKiogQHR5cGUge3Vua25vd259ICovU3ltYm9sLnRvU3RyaW5nVGFnO1xuY29uc3R7XG4vKiBjaGVja1RhZ1JlY29yZCBhbHJlYWR5IHZlcmlmaWVkIFBBU1NfU1RZTEUgYW5kIFN5bWJvbC50b1N0cmluZ1RhZyBvd24gZGF0YSBwcm9wZXJ0aWVzLiovXG5bLyoqIEB0eXBlIHtzdHJpbmd9ICovcGFzc1N0eWxlS2V5XTpfcGFzc1N0eWxlRGVzYyxcblsvKiogQHR5cGUge3N0cmluZ30gKi90YWdLZXldOnt2YWx1ZTppZmFjZX0sXG4uLi5yZXN0RGVzY3N9PVxuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhwcm90byk7XG5cbnJldHVybihcbihvd25LZXlzKHJlc3REZXNjcykubGVuZ3RoPT09MHx8XG5yZWplY3QmJlxucmVqZWN0KFxuWCBgVW5leHBlY3RlZCBwcm9wZXJ0aWVzIG9uIFJlbW90YWJsZSBQcm90byAke293bktleXMocmVzdERlc2NzKX1gKSkmJlxuXG5jaGVja0lmYWNlKGlmYWNlLGNoZWNrKSk7XG5cbiB9O1xuXG4vKipcbiAqIEtlZXAgYSB3ZWFrIHNldCBvZiBjb25maXJtZWQgcmVtb3RhYmxlcyBmb3IgbWFyc2hhbCBwZXJmb3JtYW5jZVxuICogKHdpdGhvdXQgd2hpY2ggd2Ugd291bGQgaW5jdXIgYSByZWR1bmRhbnQgdmVyaWZpY2F0aW9uIGluXG4gKiBnZXRJbnRlcmZhY2VPZikuXG4gKiBXZSBkb24ndCByZW1lbWJlciByZWplY3Rpb25zIGJlY2F1c2UgdGhleSBhcmUgcG9zc2libGUgdG8gY29ycmVjdFxuICogd2l0aCBlLmcuIGBoYXJkZW5gLlxuICpcbiAqIEB0eXBlIHtXZWFrU2V0PFJlbW90YWJsZT59XG4gKi9cbmNvbnN0IGNvbmZpcm1lZFJlbW90YWJsZXM9bmV3IFdlYWtTZXQoKTtcblxuLyoqXG4gKiBAcGFyYW0ge1JlbW90YWJsZX0gdmFsXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IFtjaGVja11cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjaGVja1JlbW90YWJsZT0odmFsLGNoZWNrKT0+e1xuaWYoY29uZmlybWVkUmVtb3RhYmxlcy5oYXModmFsKSl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5jb25zdCByZWplY3Q9ISFjaGVjayYmKChkZXRhaWxzKT0+Y2hlY2soZmFsc2UsZGV0YWlscykpO1xuaWYoIWlzRnJvemVuKHZhbCkpe1xucmV0dXJuIHJlamVjdCYmcmVqZWN0KFggYGNhbm5vdCBzZXJpYWxpemUgbm9uLWZyb3plbiBvYmplY3RzIGxpa2UgJHt2YWx9YCk7XG4gfVxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbmlmKCFSZW1vdGFibGVIZWxwZXIuY2FuQmVWYWxpZCh2YWwsY2hlY2spKXtcbnJldHVybiBmYWxzZTtcbiB9XG5jb25zdCByZXN1bHQ9Y2hlY2tSZW1vdGFibGVQcm90b09mKHZhbCxjaGVjayk7XG5pZihyZXN1bHQpe1xuY29uZmlybWVkUmVtb3RhYmxlcy5hZGQodmFsKTtcbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH07XG5cbi8qKiBAdHlwZSB7TWFyc2hhbEdldEludGVyZmFjZU9mfSAqL1xuY29uc3QgICAgICAgIGdldEludGVyZmFjZU9mPSh2YWwpPT57XG5pZihcbiFpc09iamVjdCh2YWwpfHxcbnZhbFtQQVNTX1NUWUxFXSE9PSdyZW1vdGFibGUnfHxcbiFjaGVja1JlbW90YWJsZSh2YWwpKVxue1xucmV0dXJuIHVuZGVmaW5lZDtcbiB9XG5yZXR1cm4gZ2V0VGFnKHZhbCk7XG4gfTskaOKAjV9vbmNlLmdldEludGVyZmFjZU9mKGdldEludGVyZmFjZU9mKTtcbmhhcmRlbihnZXRJbnRlcmZhY2VPZik7XG5cbi8qKlxuICpcbiAqIEB0eXBlIHtQYXNzU3R5bGVIZWxwZXJ9XG4gKi9cbmNvbnN0ICAgICAgICBSZW1vdGFibGVIZWxwZXI9aGFyZGVuKHtcbnN0eWxlTmFtZToncmVtb3RhYmxlJyxcblxuY2FuQmVWYWxpZDooY2FuZGlkYXRlLGNoZWNrPXVuZGVmaW5lZCk9PntcbmNvbnN0IHJlamVjdD0hIWNoZWNrJiYoKGRldGFpbHMpPT5jaGVjayhmYWxzZSxkZXRhaWxzKSk7XG5jb25zdCB2YWxpZFR5cGU9XG4oaXNPYmplY3QoY2FuZGlkYXRlKXx8XG5yZWplY3QmJlxucmVqZWN0KFggYGNhbm5vdCBzZXJpYWxpemUgbm9uLW9iamVjdHMgYXMgUmVtb3RhYmxlICR7Y2FuZGlkYXRlfWApKSYmKFxuIWlzQXJyYXkoY2FuZGlkYXRlKXx8XG5yZWplY3QmJlxucmVqZWN0KFggYGNhbm5vdCBzZXJpYWxpemUgYXJyYXlzIGFzIFJlbW90YWJsZSAke2NhbmRpZGF0ZX1gKSk7XG5pZighdmFsaWRUeXBlKXtcbnJldHVybiBmYWxzZTtcbiB9XG5cbmNvbnN0IGRlc2NzPWdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoY2FuZGlkYXRlKTtcbmlmKHR5cGVvZiBjYW5kaWRhdGU9PT0nb2JqZWN0Jyl7XG4vKiBFdmVyeSBvd24gcHJvcGVydHkgKHJlZ2FyZGxlc3Mgb2YgZW51bWVyYWJpbGl0eSkqL1xuLyogbXVzdCBoYXZlIGEgZnVuY3Rpb24gdmFsdWUuKi9cbnJldHVybiBvd25LZXlzKGRlc2NzKS5ldmVyeSgoa2V5KT0+e1xucmV0dXJuKFxuLyogVHlwZWNhc3QgbmVlZGVkIGR1ZSB0byBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzE4NjMqL1xuKGhhc093blByb3BlcnR5T2YoZGVzY3NbLyoqIEB0eXBlIHtzdHJpbmd9ICova2V5XSwndmFsdWUnKXx8XG5yZWplY3QmJlxucmVqZWN0KFxuWCBgY2Fubm90IHNlcmlhbGl6ZSBSZW1vdGFibGVzIHdpdGggYWNjZXNzb3JzIGxpa2UgJHtxKFxuU3RyaW5nKGtleSkpXG4gfSBpbiAke2NhbmRpZGF0ZX1gKSkmJihcblxua2V5PT09U3ltYm9sLnRvU3RyaW5nVGFnJiZjaGVja0lmYWNlKGNhbmRpZGF0ZVtrZXldLGNoZWNrKXx8XG4oY2FuQmVNZXRob2QoY2FuZGlkYXRlW2tleV0pfHxcbnJlamVjdCYmXG5yZWplY3QoXG5YIGBjYW5ub3Qgc2VyaWFsaXplIFJlbW90YWJsZXMgd2l0aCBub24tbWV0aG9kcyBsaWtlICR7cShcblN0cmluZyhrZXkpKVxuIH0gaW4gJHtjYW5kaWRhdGV9YCkpJiYoXG5cbmtleSE9PVBBU1NfU1RZTEV8fFxucmVqZWN0JiZcbnJlamVjdChYIGBBIHBhc3MtYnktcmVtb3RlIGNhbm5vdCBzaGFkb3cgJHtxKFBBU1NfU1RZTEUpfWApKSkpO1xuXG4gfSk7XG4gfWVsc2UgaWYodHlwZW9mIGNhbmRpZGF0ZT09PSdmdW5jdGlvbicpe1xuLyogRmFyIGZ1bmN0aW9ucyBjYW5ub3QgYmUgbWV0aG9kcywgYW5kIGNhbm5vdCBoYXZlIG1ldGhvZHMuKi9cbi8qIFRoZXkgbXVzdCBoYXZlIGV4YWN0bHkgZXhwZWN0ZWQgYC5uYW1lYCBhbmQgYC5sZW5ndGhgIHByb3BlcnRpZXMqL1xuY29uc3R7XG5uYW1lOm5hbWVEZXNjLFxubGVuZ3RoOmxlbmd0aERlc2MsXG4vKiBAdHMtaWdub3JlIFRTIGRvZXNuJ3QgbGlrZSBzeW1ib2xzIGFzIGNvbXB1dGVkIGluZGV4ZXM/PyovXG5bU3ltYm9sLnRvU3RyaW5nVGFnXTp0b1N0cmluZ1RhZ0Rlc2MsXG4uLi5yZXN0RGVzY3N9PVxuZGVzY3M7XG5jb25zdCByZXN0S2V5cz1vd25LZXlzKHJlc3REZXNjcyk7XG5yZXR1cm4oXG4obmFtZURlc2MmJnR5cGVvZiBuYW1lRGVzYy52YWx1ZT09PSdzdHJpbmcnfHxcbnJlamVjdCYmXG5yZWplY3QoWCBgRmFyIGZ1bmN0aW9uIG5hbWUgbXVzdCBiZSBhIHN0cmluZywgaW4gJHtjYW5kaWRhdGV9YCkpJiYoXG5sZW5ndGhEZXNjJiZ0eXBlb2YgbGVuZ3RoRGVzYy52YWx1ZT09PSdudW1iZXInfHxcbnJlamVjdCYmXG5yZWplY3QoXG5YIGBGYXIgZnVuY3Rpb24gbGVuZ3RoIG11c3QgYmUgYSBudW1iZXIsIGluICR7Y2FuZGlkYXRlfWApKSYmKFxuXG50b1N0cmluZ1RhZ0Rlc2M9PT11bmRlZmluZWR8fFxuKHR5cGVvZiB0b1N0cmluZ1RhZ0Rlc2MudmFsdWU9PT0nc3RyaW5nJ3x8XG5yZWplY3QmJlxucmVqZWN0KFxuWCBgRmFyIGZ1bmN0aW9uIEBAdG9TdHJpbmdUYWcgbXVzdCBiZSBhIHN0cmluZywgaW4gJHtjYW5kaWRhdGV9YCkpJiZcblxuY2hlY2tJZmFjZSh0b1N0cmluZ1RhZ0Rlc2MudmFsdWUsY2hlY2spKSYmKFxucmVzdEtleXMubGVuZ3RoPT09MHx8XG5yZWplY3QmJlxucmVqZWN0KFxuWCBgRmFyIGZ1bmN0aW9ucyB1bmV4cGVjdGVkIHByb3BlcnRpZXMgYmVzaWRlcyAubmFtZSBhbmQgLmxlbmd0aCAke3Jlc3RLZXlzfWApKSk7XG5cblxuIH1cbnJldHVybiByZWplY3QmJnJlamVjdChYIGB1bnJlY29nbml6ZWQgdHlwZW9mICR7Y2FuZGlkYXRlfWApO1xuIH0sXG5cbmFzc2VydFZhbGlkOihjYW5kaWRhdGUpPT5jaGVja1JlbW90YWJsZShjYW5kaWRhdGUsYXNzZXJ0Q2hlY2tlciksXG5cbmV2ZXJ5OihfcGFzc2FibGUsX2ZuKT0+dHJ1ZX0pOyRo4oCNX29uY2UuUmVtb3RhYmxlSGVscGVyKFJlbW90YWJsZUhlbHBlcik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYXNzZXJ0SWZhY2UiOlsiYXNzZXJ0SWZhY2UiXSwiZ2V0SW50ZXJmYWNlT2YiOlsiZ2V0SW50ZXJmYWNlT2YiXSwiUmVtb3RhYmxlSGVscGVyIjpbIlJlbW90YWJsZUhlbHBlciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAym6GHmg8AAJoPAAArAAAAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjcvc3JjL3NhZmUtcHJvbWlzZS5qc3siaW1wb3J0cyI6WyJAZW5kby9wcm9taXNlLWtpdCIsIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiXSwiZXhwb3J0cyI6WyJhc3NlcnRTYWZlUHJvbWlzZSIsImlzU2FmZVByb21pc2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgaXNQcm9taXNlLGFzc2VydENoZWNrZXIsaGFzT3duUHJvcGVydHlPZjskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wiaXNQcm9taXNlXCIsIFskaOKAjV9hID0+IChpc1Byb21pc2UgPSAkaOKAjV9hKV1dXV0sW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRo4oCNX2EpXV0sW1wiaGFzT3duUHJvcGVydHlPZlwiLCBbJGjigI1fYSA9PiAoaGFzT3duUHJvcGVydHlPZiA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5DaGVja2VyfSBDaGVja2VyICovXG5cbmNvbnN0e2RldGFpbHM6WCxxdW90ZTpxfT1hc3NlcnQ7XG5jb25zdHtpc0Zyb3plbixnZXRQcm90b3R5cGVPZn09T2JqZWN0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcblxuLyoqXG4gKiBAcGFyYW0ge1Byb21pc2V9IHByIFRoZSB2YWx1ZSB0byBleGFtaW5lXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7cHIgaXMgUHJvbWlzZX0gV2hldGhlciBpdCBpcyBhIHNhZmUgcHJvbWlzZVxuICovXG5jb25zdCBjaGVja1Byb21pc2VPd25LZXlzPShwcixjaGVjayk9PntcbmNvbnN0IHJlamVjdD0oZGV0YWlscyk9PmNoZWNrKGZhbHNlLGRldGFpbHMpO1xuY29uc3Qga2V5cz1vd25LZXlzKHByKTtcblxuaWYoa2V5cy5sZW5ndGg9PT0wKXtcbnJldHVybiB0cnVlO1xuIH1cblxuY29uc3QgdW5rbm93bktleXM9a2V5cy5maWx0ZXIoXG4oa2V5KT0+dHlwZW9mIGtleSE9PSdzeW1ib2wnfHwhaGFzT3duUHJvcGVydHlPZihQcm9taXNlLnByb3RvdHlwZSxrZXkpKTtcblxuXG5pZih1bmtub3duS2V5cy5sZW5ndGghPT0wKXtcbnJldHVybiByZWplY3QoXG5YIGAke3ByfSAtIE11c3Qgbm90IGhhdmUgYW55IG93biBwcm9wZXJ0aWVzOiAke3EodW5rbm93bktleXMpfWApO1xuXG4gfVxuXG4vKipcbiAqIEF0IHRoZSB0aW1lIG9mIHRoaXMgd3JpdGluZywgTm9kZSdzIGFzeW5jX2hvb2tzIGNvbnRhaW5zIHRoZVxuICogZm9sbG93aW5nIGNvZGUsIHdoaWNoIHdlIGNhbiBhbHNvIHNhZmVseSB0b2xlcmF0ZVxuICpcbiAqIGBgYGpzXG4gKiBmdW5jdGlvbiBkZXN0cm95VHJhY2tpbmcocHJvbWlzZSwgcGFyZW50KSB7XG4gKiB0cmFja1Byb21pc2UocHJvbWlzZSwgcGFyZW50KTtcbiAqICAgY29uc3QgYXN5bmNJZCA9IHByb21pc2VbYXN5bmNfaWRfc3ltYm9sXTtcbiAqICAgY29uc3QgZGVzdHJveWVkID0geyBkZXN0cm95ZWQ6IGZhbHNlIH07XG4gKiAgIHByb21pc2VbZGVzdHJveWVkU3ltYm9sXSA9IGRlc3Ryb3llZDtcbiAqICAgcmVnaXN0ZXJEZXN0cm95SG9vayhwcm9taXNlLCBhc3luY0lkLCBkZXN0cm95ZWQpO1xuICogfVxuICogYGBgXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8c3ltYm9sfSBrZXlcbiAqL1xuY29uc3QgY2hlY2tTYWZlQXN5bmNIb29rc0tleT0oa2V5KT0+e1xuY29uc3QgdmFsPXByW2tleV07XG5pZih2YWw9PT11bmRlZmluZWR8fHR5cGVvZiB2YWw9PT0nbnVtYmVyJyl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5pZihcbnR5cGVvZiB2YWw9PT0nb2JqZWN0JyYmXG52YWwhPT1udWxsJiZcbmlzRnJvemVuKHZhbCkmJlxuZ2V0UHJvdG90eXBlT2YodmFsKT09PU9iamVjdC5wcm90b3R5cGUpXG57XG5jb25zdCBzdWJLZXlzPW93bktleXModmFsKTtcbmlmKHN1YktleXMubGVuZ3RoPT09MCl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5cbmlmKFxuc3ViS2V5cy5sZW5ndGg9PT0xJiZcbnN1YktleXNbMF09PT0nZGVzdHJveWVkJyYmXG52YWwuZGVzdHJveWVkPT09ZmFsc2UpXG57XG5yZXR1cm4gdHJ1ZTtcbiB9XG4gfVxucmV0dXJuIHJlamVjdChcblggYFVuZXhwZWN0ZWQgTm9kZSBhc3luY19ob29rcyBhZGRpdGlvbnMgdG8gcHJvbWlzZTogJHtwcn0uJHtxKFxuU3RyaW5nKGtleSkpXG4gfSBpcyAke3ZhbH1gKTtcblxuIH07XG5cbnJldHVybiBrZXlzLmV2ZXJ5KGNoZWNrU2FmZUFzeW5jSG9va3NLZXkpO1xuIH07XG5cbi8qKlxuICogVW5kZXIgSGFyZGVuZWQgSlMgYSBwcm9taXNlIGlzIFwic2FmZVwiIGlmIGl0cyBgdGhlbmAgbWV0aG9kIGNhbiBiZSBjYWxsZWRcbiAqIHN5bmNocm9ub3VzbHkgd2l0aG91dCBnaXZpbmcgdGhlIHByb21pc2UgYW4gb3Bwb3J0dW5pdHkgZm9yIGFcbiAqIHJlZW50cmFuY3kgYXR0YWNrIGR1cmluZyB0aGF0IGNhbGwuXG4gKlxuICogaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy85XG4gKiByYWlzZXMgdGhlIGlzc3VlIG9mIHRlc3RpbmcgdGhhdCBhIHNwZWNpbWVuIGlzIGEgc2FmZSBwcm9taXNlXG4gKiBzdWNoIHRoYXQgdGhlIHRlc3QgYWxzbyBkb2VzIG5vdCBnaXZlIHRoZSBzcGVjaW1lbiBhXG4gKiByZWVudHJhbmN5IG9wcG9ydHVuaXR5LiBUaGF0IGlzIHdlbGwgYmV5b25kIHRoZSBhbWJpdGlvbiBoZXJlLlxuICogVE9ETyBUaG91Z2ggaWYgd2UgZmlndXJlIG91dCBhIG5pY2Ugc29sdXRpb24sIGl0IG1pZ2h0IGJlIGdvb2QgdG9cbiAqIHVzZSBpdCBoZXJlIGFzIHdlbGwuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBwciBUaGUgdmFsdWUgdG8gZXhhbWluZVxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge3ByIGlzIFByb21pc2V9IFdoZXRoZXIgaXQgaXMgYSBzYWZlIHByb21pc2VcbiAqL1xuY29uc3QgY2hlY2tTYWZlUHJvbWlzZT0ocHIsY2hlY2spPT57XG5jb25zdCByZWplY3Q9KGRldGFpbHMpPT5jaGVjayhmYWxzZSxkZXRhaWxzKTtcbnJldHVybihcbihpc0Zyb3plbihwcil8fHJlamVjdChYIGAke3ByfSAtIE11c3QgYmUgZnJvemVuYCkpJiYoXG5pc1Byb21pc2UocHIpfHxyZWplY3QoWCBgJHtwcn0gLSBNdXN0IGJlIGEgcHJvbWlzZWApKSYmKFxuZ2V0UHJvdG90eXBlT2YocHIpPT09UHJvbWlzZS5wcm90b3R5cGV8fFxucmVqZWN0KFxuWCBgJHtwcn0gLSBNdXN0IGluaGVyaXQgZnJvbSBQcm9taXNlLnByb3RvdHlwZTogJHtxKFxuZ2V0UHJvdG90eXBlT2YocHIpKVxuIH1gKSkmJlxuXG5jaGVja1Byb21pc2VPd25LZXlzKC8qKiBAdHlwZSB7UHJvbWlzZX0gKi9wcixjaGVjaykpO1xuXG4gfTtcbmhhcmRlbihjaGVja1NhZmVQcm9taXNlKTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgdGhlIGFyZ3VtZW50IGlzIGEgUHJvbWlzZS5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IHByIFRoZSB2YWx1ZSB0byBleGFtaW5lXG4gKiBAcmV0dXJucyB7cHIgaXMgUHJvbWlzZX0gV2hldGhlciBpdCBpcyBhIHByb21pc2VcbiAqL1xuY29uc3QgICAgICAgIGlzU2FmZVByb21pc2U9KHByKT0+Y2hlY2tTYWZlUHJvbWlzZShwciwoeCk9PngpOyRo4oCNX29uY2UuaXNTYWZlUHJvbWlzZShpc1NhZmVQcm9taXNlKTtcbmhhcmRlbihpc1NhZmVQcm9taXNlKTtcblxuY29uc3QgICAgICAgIGFzc2VydFNhZmVQcm9taXNlPShwcik9PmNoZWNrU2FmZVByb21pc2UocHIsYXNzZXJ0Q2hlY2tlcik7JGjigI1fb25jZS5hc3NlcnRTYWZlUHJvbWlzZShhc3NlcnRTYWZlUHJvbWlzZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaXNTYWZlUHJvbWlzZSI6WyJpc1NhZmVQcm9taXNlIl0sImFzc2VydFNhZmVQcm9taXNlIjpbImFzc2VydFNhZmVQcm9taXNlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMcf1VBHEgAARxIAACUAAABAZW5kby9wYXNzLXN0eWxlLXYwLjEuNy9zcmMvc3ltYm9sLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJhc3NlcnRQYXNzYWJsZVN5bWJvbCIsImlzUGFzc2FibGVTeW1ib2wiLCJuYW1lRm9yUGFzc2FibGVTeW1ib2wiLCJwYXNzYWJsZVN5bWJvbEZvck5hbWUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICBjb25zdHtGYWlsLHF1b3RlOnF9PWFzc2VydDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5cbi8qKlxuICogVGhlIHdlbGwga25vd24gc3ltYm9scyBhcmUgc3RhdGljIHN5bWJvbCB2YWx1ZXMgb24gdGhlIGBTeW1ib2xgIGNvbnN0cnVjdG9yLlxuICovXG5jb25zdCB3ZWxsS25vd25TeW1ib2xOYW1lcz1uZXcgTWFwKFxub3duS2V5cyhTeW1ib2wpLlxuZmlsdGVyKFxuKG5hbWUpPT50eXBlb2YgbmFtZT09PSdzdHJpbmcnJiZ0eXBlb2YgU3ltYm9sW25hbWVdPT09J3N5bWJvbCcpLlxuXG5maWx0ZXIoKG5hbWUpPT57XG4vKiBAdHMtZXhwZWN0LWVycm9yIEl0IGRvZXNuJ3Qga25vdyBuYW1lIGNhbm5vdCBiZSBhIHN5bWJvbCovXG4hbmFtZS5zdGFydHNXaXRoKCdAQCcpfHxcbkZhaWwgYERpZCBub3QgZXhwZWN0IFN5bWJvbCB0byBoYXZlIGEgc3ltYm9sLXZhbHVlZCBwcm9wZXJ0eSBuYW1lIHN0YXJ0aW5nIHdpdGggXCJAQFwiICR7cShcbm5hbWUpXG4gfWA7XG5yZXR1cm4gdHJ1ZTtcbiB9KVxuLyogQHRzLWlnbm9yZSBJdCBkb2Vzbid0IGtub3cgbmFtZSBjYW5ub3QgYmUgYSBzeW1ib2wqLy5cbm1hcCgobmFtZSk9PltTeW1ib2xbbmFtZV0sIGBAQCR7bmFtZX1gXSkpO1xuXG5cbi8qKlxuICogVGhlIHBhc3NhYmxlIHN5bWJvbHMgYXJlIHRoZSB3ZWxsIGtub3duIHN5bWJvbHMgKHRoZSBzeW1ib2wgdmFsdWVzXG4gKiBvZiBzdGF0aWMgcHJvcGVydGllcyBvZiB0aGUgYFN5bWJvbGAgY29uc3RydWN0b3IpIGFuZCB0aGUgcmVnaXN0ZXJlZFxuICogc3ltYm9scy5cbiAqXG4gKiBAcGFyYW0ge2FueX0gc3ltXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgICAgICAgIGlzUGFzc2FibGVTeW1ib2w9KHN5bSk9PlxudHlwZW9mIHN5bT09PSdzeW1ib2wnJiYoXG50eXBlb2YgU3ltYm9sLmtleUZvcihzeW0pPT09J3N0cmluZyd8fHdlbGxLbm93blN5bWJvbE5hbWVzLmhhcyhzeW0pKTskaOKAjV9vbmNlLmlzUGFzc2FibGVTeW1ib2woaXNQYXNzYWJsZVN5bWJvbCk7XG5oYXJkZW4oaXNQYXNzYWJsZVN5bWJvbCk7XG5cbmNvbnN0ICAgICAgICBhc3NlcnRQYXNzYWJsZVN5bWJvbD0oc3ltKT0+XG5pc1Bhc3NhYmxlU3ltYm9sKHN5bSl8fFxuRmFpbCBgT25seSByZWdpc3RlcmVkIHN5bWJvbHMgb3Igd2VsbC1rbm93biBzeW1ib2xzIGFyZSBwYXNzYWJsZTogJHtxKHN5bSl9YDskaOKAjV9vbmNlLmFzc2VydFBhc3NhYmxlU3ltYm9sKGFzc2VydFBhc3NhYmxlU3ltYm9sKTtcbmhhcmRlbihhc3NlcnRQYXNzYWJsZVN5bWJvbCk7XG5cbi8qKlxuICogSWYgYHN5bWAgaXMgYSBwYXNzYWJsZSBzeW1ib2wsIHJldHVybiBhIHN0cmluZyB0aGF0IHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhpc1xuICogc3ltYm9sLiBJZiBgc3ltYCBpcyBhIG5vbi1wYXNzYWJsZSBzeW1ib2wsIHJldHVybiBgdW5kZWZpbmVkYC5cbiAqXG4gKiBUaGUgcGFzc2FibGUgc3ltYm9scyBhcmUgdGhlIHdlbGwga25vd24gc3ltYm9scyAodGhlIHN5bWJvbCB2YWx1ZXNcbiAqIG9mIHN0YXRpYyBwcm9wZXJ0aWVzIG9mIHRoZSBgU3ltYm9sYCBjb25zdHJ1Y3RvcikgYW5kIHRoZSByZWdpc3RlcmVkXG4gKiBzeW1ib2xzLiBTaW5jZSB0aGUgcmVnaXN0cmF0aW9uIHN0cmluZyBvZiBhIHJlZ2lzdGVyZWQgc3ltYm9sIGNhbiBiZSBhbnlcbiAqIHN0cmluZywgaWYgd2Ugc2ltcGx5IHVzZWQgdGhhdCB0byBpZGVudGlmeSB0aG9zZSBzeW1ib2xzLCB0aGVyZSB3b3VsZCBub3RcbiAqIGJlIGFueSByZW1haW5pbmcgc3RyaW5ncyBsZWZ0IG92ZXIgdG8gaWRlbnRpZnkgdGhlIHdlbGwta25vd24gc3ltYm9scy5cbiAqIEluc3RlYWQsIHdlIHJlc2VydmUgc3RyaW5ncyBiZWdpbm5pbmcgd2l0aCBgXCJAQFwiYCBmb3IgcHVycG9zZXMgb2YgdGhpc1xuICogZW5jb2RpbmcuIFdlIGlkZW50aWZ5IGEgd2VsbCBrbm93biBzeW1ib2wgc3VjaCBhcyBgU3ltYm9sLml0ZXJhdG9yYFxuICogYnkgcHJlZml4aW5nIHRoZSBwcm9wZXJ0eSBuYW1lIHdpdGggYFwiQEBcImAsIHN1Y2ggYXMgYFwiQEBpdGVyYXRvclwiYC5cbiAqIEZvciByZWdpc3RlcmVkIHN5bWJvbHMgd2hvc2UgbmFtZSBoYXBwZW5zIHRvIGJlZ2luIHdpdGggYFwiQEBcImAsIHN1Y2hcbiAqIGFzIGBTeW1ib2wuZm9yKCdAQGl0ZXJhdG9yJylgIG9yIGBTeW1ib2wuZm9yKCdAQGZvbycpYCwgd2UgaWRlbnRpZnlcbiAqIHRoZW0gYnkgcHJlZml4aW5nIHRoZW0gd2l0aCBhbiBleHRyYSBgXCJAQFwiYCwgc3VjaCBhc1xuICogYFwiQEBAQGl0ZXJhdG9yXCJgIG9yIGBcIkBAQEBmb29cImAuIChUaGlzIGlzIHRoZSBIaWxiZXJ0IEhvdGVsIGVuY29kaW5nXG4gKiB0ZWNobmlxdWUuKVxuICpcbiAqIEBwYXJhbSB7c3ltYm9sfSBzeW1cbiAqIEByZXR1cm5zIHtzdHJpbmc9fVxuICovXG5jb25zdCAgICAgICAgbmFtZUZvclBhc3NhYmxlU3ltYm9sPShzeW0pPT57XG5jb25zdCBuYW1lPVN5bWJvbC5rZXlGb3Ioc3ltKTtcbmlmKG5hbWU9PT11bmRlZmluZWQpe1xucmV0dXJuIHdlbGxLbm93blN5bWJvbE5hbWVzLmdldChzeW0pO1xuIH1cbmlmKG5hbWUuc3RhcnRzV2l0aCgnQEAnKSl7XG5yZXR1cm4gYEBAJHtuYW1lfWA7XG4gfVxucmV0dXJuIG5hbWU7XG4gfTskaOKAjV9vbmNlLm5hbWVGb3JQYXNzYWJsZVN5bWJvbChuYW1lRm9yUGFzc2FibGVTeW1ib2wpO1xuaGFyZGVuKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCk7XG5cbmNvbnN0IEF0QXRQcmVmaXhQYXR0ZXJuPS9eQEAoLiopJC87XG5oYXJkZW4oQXRBdFByZWZpeFBhdHRlcm4pO1xuXG4vKipcbiAqIElmIGBuYW1lYCBpcyBhIHN0cmluZyB0aGF0IGNvdWxkIGhhdmUgYmVlbiBwcm9kdWNlZCBieVxuICogYG5hbWVGb3JQYXNzYWJsZVN5bWJvbGAsIHJldHVybiB0aGUgc3ltYm9sIGFyZ3VtZW50IGl0IHdhcyBwcm9kdWNlZCB0b1xuICogcmVwcmVzZW50LlxuICpcbiAqICAgIElmIGBuYW1lYCBkb2VzIG5vdCBiZWdpbiB3aXRoIGBcIkBAXCJgLCB0aGVuIGp1c3QgdGhlIGNvcnJlc3BvbmRpbmdcbiAqICAgICAgcmVnaXN0ZXJlZCBzeW1ib2wsIGBTeW1ib2wuZm9yKG5hbWUpYC5cbiAqICAgIElmIGBuYW1lYCBpcyBgXCJAQFwiYCBmb2xsb3dlZCBieSBhIHdlbGwga25vd24gc3ltYm9sJ3MgcHJvcGVydHkgbmFtZSBvblxuICogICAgICBgU3ltYm9sYCBzdWNoIGBcIkBAaXRlcmF0b3JcIiwgcmV0dXJuIHRoYXQgd2VsbCBrbm93biBzeW1ib2wgc3VjaCBhc1xuICogICAgICBgU3ltYm9sLml0ZXJhdG9yYFxuICogICAgSWYgYG5hbWVgIGJlZ2lucyB3aXRoIGBcIkBAQEBcImAgaXQgZW5jb2RlcyB0aGUgcmVnaXN0ZXJlZCBzeW1ib2wgd2hvc2VcbiAqICAgICAgbmFtZSBiZWdpbnMgd2l0aCBgXCJAQFwiYCBpbnN0ZWFkLlxuICogICAgT3RoZXJ3aXNlLCBpZiBuYW1lIGJlZ2lucyB3aXRoIGBcIkBAXCJgIGl0IG1heSBlbmNvZGUgYSByZWdpc3RlcmVkIHN5bWJvbFxuICogICAgICBmcm9tIGEgZnV0dXJlIHZlcnNpb24gb2YgSmF2YVNjcmlwdCwgYnV0IGl0IGlzIG5vdCBvbmUgd2UgY2FuIGRlY29kZVxuICogICAgICB5ZXQsIHNvIHRocm93LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcmV0dXJucyB7c3ltYm9sPX1cbiAqL1xuY29uc3QgICAgICAgIHBhc3NhYmxlU3ltYm9sRm9yTmFtZT0obmFtZSk9PntcbmlmKHR5cGVvZiBuYW1lIT09J3N0cmluZycpe1xucmV0dXJuIHVuZGVmaW5lZDtcbiB9XG5jb25zdCBtYXRjaD1BdEF0UHJlZml4UGF0dGVybi5leGVjKG5hbWUpO1xuaWYobWF0Y2gpe1xuY29uc3Qgc3VmZml4PW1hdGNoWzFdO1xuaWYoc3VmZml4LnN0YXJ0c1dpdGgoJ0BAJykpe1xucmV0dXJuIFN5bWJvbC5mb3Ioc3VmZml4KTtcbiB9ZWxzZXtcbmNvbnN0IHN5bT1TeW1ib2xbc3VmZml4XTtcbmlmKHR5cGVvZiBzeW09PT0nc3ltYm9sJyl7XG5yZXR1cm4gc3ltO1xuIH1cbkZhaWwgYFJlc2VydmVkIGZvciB3ZWxsIGtub3duIHN5bWJvbCAke3Eoc3VmZml4KX06ICR7cShuYW1lKX1gO1xuIH1cbiB9XG5yZXR1cm4gU3ltYm9sLmZvcihuYW1lKTtcbiB9OyRo4oCNX29uY2UucGFzc2FibGVTeW1ib2xGb3JOYW1lKHBhc3NhYmxlU3ltYm9sRm9yTmFtZSk7XG5oYXJkZW4ocGFzc2FibGVTeW1ib2xGb3JOYW1lKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc1Bhc3NhYmxlU3ltYm9sIjpbImlzUGFzc2FibGVTeW1ib2wiXSwiYXNzZXJ0UGFzc2FibGVTeW1ib2wiOlsiYXNzZXJ0UGFzc2FibGVTeW1ib2wiXSwibmFtZUZvclBhc3NhYmxlU3ltYm9sIjpbIm5hbWVGb3JQYXNzYWJsZVN5bWJvbCJdLCJwYXNzYWJsZVN5bWJvbEZvck5hbWUiOlsicGFzc2FibGVTeW1ib2xGb3JOYW1lIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACW8XPv9BwAA/QcAACUAAABAZW5kby9wYXNzLXN0eWxlLXYwLjEuNy9zcmMvdGFnZ2VkLmpzeyJpbXBvcnRzIjpbIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiXSwiZXhwb3J0cyI6WyJUYWdnZWRIZWxwZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0Q2hlY2tlcixjaGVja1RhZ1JlY29yZCxQQVNTX1NUWUxFLGNoZWNrTm9ybWFsUHJvcGVydHksY2hlY2tQYXNzU3R5bGU7JGjigI1faW1wb3J0cyhbW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRo4oCNX2EpXV0sW1wiY2hlY2tUYWdSZWNvcmRcIiwgWyRo4oCNX2EgPT4gKGNoZWNrVGFnUmVjb3JkID0gJGjigI1fYSldXSxbXCJQQVNTX1NUWUxFXCIsIFskaOKAjV9hID0+IChQQVNTX1NUWUxFID0gJGjigI1fYSldXSxbXCJjaGVja05vcm1hbFByb3BlcnR5XCIsIFskaOKAjV9hID0+IChjaGVja05vcm1hbFByb3BlcnR5ID0gJGjigI1fYSldXSxbXCJjaGVja1Bhc3NTdHlsZVwiLCBbJGjigI1fYSA9PiAoY2hlY2tQYXNzU3R5bGUgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cbmNvbnN0e0ZhaWx9PWFzc2VydDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5jb25zdHtnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzfT1PYmplY3Q7XG5cbi8qKlxuICpcbiAqIEB0eXBlIHtYaW1wb3J0KCcuL2ludGVybmFsLXR5cGVzLmpzJykuUGFzc1N0eWxlSGVscGVyfVxuICovXG5jb25zdCAgICAgICAgVGFnZ2VkSGVscGVyPWhhcmRlbih7XG5zdHlsZU5hbWU6J3RhZ2dlZCcsXG5cbmNhbkJlVmFsaWQ6KGNhbmRpZGF0ZSxjaGVjaz11bmRlZmluZWQpPT5cbmNoZWNrUGFzc1N0eWxlKGNhbmRpZGF0ZSwndGFnZ2VkJyxjaGVjayksXG5cbmFzc2VydFZhbGlkOihjYW5kaWRhdGUscGFzc1N0eWxlT2ZSZWN1cik9PntcbmNoZWNrVGFnUmVjb3JkKGNhbmRpZGF0ZSwndGFnZ2VkJyxhc3NlcnRDaGVja2VyKTtcblxuLyogVHlwZWNhc3RzIG5lZWRlZCBkdWUgdG8gaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy8xODYzKi9cbmNvbnN0IHBhc3NTdHlsZUtleT0vKiogQHR5cGUge3Vua25vd259ICovUEFTU19TVFlMRTtcbmNvbnN0IHRhZ0tleT0vKiogQHR5cGUge3Vua25vd259ICovU3ltYm9sLnRvU3RyaW5nVGFnO1xuY29uc3R7XG4vKiBjaGVja1RhZ1JlY29yZCBhbHJlYWR5IHZlcmlmaWVkIFBBU1NfU1RZTEUgYW5kIFN5bWJvbC50b1N0cmluZ1RhZyBvd24gZGF0YSBwcm9wZXJ0aWVzLiovXG5bLyoqIEB0eXBlIHtzdHJpbmd9ICovcGFzc1N0eWxlS2V5XTpfcGFzc1N0eWxlRGVzYyxcblsvKiogQHR5cGUge3N0cmluZ30gKi90YWdLZXldOl9sYWJlbERlc2MsXG5wYXlsb2FkOl9wYXlsb2FkRGVzYywvKiB2YWx1ZSBjaGVja2VkIGJ5IHJlY3Vyc2l2ZSB3YWxrIGF0IHRoZSBlbmQqL1xuLi4ucmVzdERlc2NzfT1cbmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoY2FuZGlkYXRlKTtcbm93bktleXMocmVzdERlc2NzKS5sZW5ndGg9PT0wfHxcbkZhaWwgYFVuZXhwZWN0ZWQgcHJvcGVydGllcyBvbiB0YWdnZWQgcmVjb3JkICR7b3duS2V5cyhyZXN0RGVzY3MpfWA7XG5cbmNoZWNrTm9ybWFsUHJvcGVydHkoY2FuZGlkYXRlLCdwYXlsb2FkJyx0cnVlLGFzc2VydENoZWNrZXIpO1xuXG4vKiBSZWN1cnNpdmVseSB2YWxpZGF0ZSB0aGF0IGVhY2ggbWVtYmVyIGlzIHBhc3NhYmxlLiovXG5wYXNzU3R5bGVPZlJlY3VyKGNhbmRpZGF0ZS5wYXlsb2FkKTtcbiB9fSk7JGjigI1fb25jZS5UYWdnZWRIZWxwZXIoVGFnZ2VkSGVscGVyKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJUYWdnZWRIZWxwZXIiOlsiVGFnZ2VkSGVscGVyIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAHqgfmgSDQAAEg0AACkAAABAZW5kby9wYXNzLXN0eWxlLXYwLjEuNy9zcmMvdHlwZUd1YXJkcy5qc3siaW1wb3J0cyI6WyIuL3Bhc3NTdHlsZU9mLmpzIl0sImV4cG9ydHMiOlsiYXNzZXJ0Q29weUFycmF5IiwiYXNzZXJ0UmVjb3JkIiwiYXNzZXJ0UmVtb3RhYmxlIiwiaXNDb3B5QXJyYXkiLCJpc1JlY29yZCIsImlzUmVtb3RhYmxlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IHBhc3NTdHlsZU9mOyRo4oCNX2ltcG9ydHMoW1tcIi4vcGFzc1N0eWxlT2YuanNcIiwgW1tcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5QYXNzYWJsZX0gUGFzc2FibGUgKi9cbi8qKiBAdGVtcGxhdGUgVCBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkNvcHlBcnJheTxUPn0gQ29weUFycmF5ICovXG4vKiogQHRlbXBsYXRlIFQgQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5Db3B5UmVjb3JkPFQ+fSBDb3B5UmVjb3JkICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5SZW1vdGFibGVPYmplY3R9IFJlbW90YWJsZSAqL1xuXG5jb25zdHtGYWlsLHF1b3RlOnF9PWFzc2VydDtcblxuLyoqXG4gKiBDaGVjayB3aGV0aGVyIHRoZSBhcmd1bWVudCBpcyBhIHBhc3MtYnktY29weSBhcnJheSwgQUtBIGEgXCJjb3B5QXJyYXlcIlxuICogaW4gQGVuZG8vbWFyc2hhbCB0ZXJtc1xuICpcbiAqIEBwYXJhbSB7UGFzc2FibGV9IGFyclxuICogQHJldHVybnMge2FyciBpcyBDb3B5QXJyYXk8YW55Pn1cbiAqL1xuY29uc3QgaXNDb3B5QXJyYXk9KGFycik9PnBhc3NTdHlsZU9mKGFycik9PT0nY29weUFycmF5JzskaOKAjV9vbmNlLmlzQ29weUFycmF5KGlzQ29weUFycmF5KTtcbmhhcmRlbihpc0NvcHlBcnJheSk7XG5cbi8qKlxuICogQ2hlY2sgd2hldGhlciB0aGUgYXJndW1lbnQgaXMgYSBwYXNzLWJ5LWNvcHkgcmVjb3JkLCBBS0EgYVxuICogXCJjb3B5UmVjb3JkXCIgaW4gQGVuZG8vbWFyc2hhbCB0ZXJtc1xuICpcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHJlY29yZFxuICogQHJldHVybnMge3JlY29yZCBpcyBDb3B5UmVjb3JkPGFueT59XG4gKi9cbmNvbnN0IGlzUmVjb3JkPShyZWNvcmQpPT5wYXNzU3R5bGVPZihyZWNvcmQpPT09J2NvcHlSZWNvcmQnOyRo4oCNX29uY2UuaXNSZWNvcmQoaXNSZWNvcmQpO1xuaGFyZGVuKGlzUmVjb3JkKTtcblxuLyoqXG4gKiBDaGVjayB3aGV0aGVyIHRoZSBhcmd1bWVudCBpcyBhIHJlbW90YWJsZS5cbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSByZW1vdGFibGVcbiAqIEByZXR1cm5zIHtyZW1vdGFibGUgaXMgUmVtb3RhYmxlfVxuICovXG5jb25zdCBpc1JlbW90YWJsZT0ocmVtb3RhYmxlKT0+cGFzc1N0eWxlT2YocmVtb3RhYmxlKT09PSdyZW1vdGFibGUnOyRo4oCNX29uY2UuaXNSZW1vdGFibGUoaXNSZW1vdGFibGUpO1xuaGFyZGVuKGlzUmVtb3RhYmxlKTtcblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0QXJyYXlcbiAqIEBwYXJhbSB7UGFzc2FibGV9IGFycmF5XG4gKiBAcGFyYW0ge3N0cmluZz19IG9wdE5hbWVPZkFycmF5XG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBhcnJheSBpcyBDb3B5QXJyYXk8YW55Pn1cbiAqL1xuXG4vKiogQHR5cGUge0Fzc2VydEFycmF5fSAqL1xuY29uc3QgYXNzZXJ0Q29weUFycmF5PShhcnJheSxvcHROYW1lT2ZBcnJheT0nQWxsZWdlZCBhcnJheScpPT57XG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YoYXJyYXkpO1xucGFzc1N0eWxlPT09J2NvcHlBcnJheSd8fFxuRmFpbCBgJHtxKG9wdE5hbWVPZkFycmF5KX0gJHthcnJheX0gbXVzdCBiZSBhIHBhc3MtYnktY29weSBhcnJheSwgbm90ICR7cShcbnBhc3NTdHlsZSlcbiB9YDtcbiB9OyRo4oCNX29uY2UuYXNzZXJ0Q29weUFycmF5KGFzc2VydENvcHlBcnJheSk7XG5oYXJkZW4oYXNzZXJ0Q29weUFycmF5KTtcblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0UmVjb3JkXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSByZWNvcmRcbiAqIEBwYXJhbSB7c3RyaW5nPX0gb3B0TmFtZU9mUmVjb3JkXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyByZWNvcmQgaXMgQ29weVJlY29yZDxhbnk+fVxuICovXG5cbi8qKiBAdHlwZSB7QXNzZXJ0UmVjb3JkfSAqL1xuY29uc3QgYXNzZXJ0UmVjb3JkPShyZWNvcmQsb3B0TmFtZU9mUmVjb3JkPSdBbGxlZ2VkIHJlY29yZCcpPT57XG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YocmVjb3JkKTtcbnBhc3NTdHlsZT09PSdjb3B5UmVjb3JkJ3x8XG5GYWlsIGAke3Eob3B0TmFtZU9mUmVjb3JkKX0gJHtyZWNvcmR9IG11c3QgYmUgYSBwYXNzLWJ5LWNvcHkgcmVjb3JkLCBub3QgJHtxKFxucGFzc1N0eWxlKVxuIH1gO1xuIH07JGjigI1fb25jZS5hc3NlcnRSZWNvcmQoYXNzZXJ0UmVjb3JkKTtcbmhhcmRlbihhc3NlcnRSZWNvcmQpO1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRSZW1vdGFibGVcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHJlbW90YWJsZVxuICogQHBhcmFtIHtzdHJpbmc9fSBvcHROYW1lT2ZSZW1vdGFibGVcbiAqIEByZXR1cm5zIHthc3NlcnRzIHJlbW90YWJsZSBpcyBSZW1vdGFibGV9XG4gKi9cblxuLyoqIEB0eXBlIHtBc3NlcnRSZW1vdGFibGV9ICovXG5jb25zdCBhc3NlcnRSZW1vdGFibGU9KFxucmVtb3RhYmxlLFxub3B0TmFtZU9mUmVtb3RhYmxlPSdBbGxlZ2VkIHJlbW90YWJsZScpPT5cbntcbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihyZW1vdGFibGUpO1xucGFzc1N0eWxlPT09J3JlbW90YWJsZSd8fFxuRmFpbCBgJHtxKG9wdE5hbWVPZlJlbW90YWJsZSl9ICR7cmVtb3RhYmxlfSBtdXN0IGJlIGEgcmVtb3RhYmxlLCBub3QgJHtxKFxucGFzc1N0eWxlKVxuIH1gO1xuIH07JGjigI1fb25jZS5hc3NlcnRSZW1vdGFibGUoYXNzZXJ0UmVtb3RhYmxlKTtcbmhhcmRlbihhc3NlcnRSZW1vdGFibGUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzQ29weUFycmF5IjpbImlzQ29weUFycmF5Il0sImlzUmVjb3JkIjpbImlzUmVjb3JkIl0sImlzUmVtb3RhYmxlIjpbImlzUmVtb3RhYmxlIl0sImFzc2VydENvcHlBcnJheSI6WyJhc3NlcnRDb3B5QXJyYXkiXSwiYXNzZXJ0UmVjb3JkIjpbImFzc2VydFJlY29yZCJdLCJhc3NlcnRSZW1vdGFibGUiOlsiYXNzZXJ0UmVtb3RhYmxlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJgZO7M0AQAANAEAACQAAABAZW5kby9wYXNzLXN0eWxlLXYwLjEuNy9zcmMvdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAAcJYy3AJAABwCQAAIgAAAEBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNjAvaW5kZXguanN7ImltcG9ydHMiOlsiLi9zcmMvcHJvbWlzZS1leGVjdXRvci1raXQuanMiLCIuL3NyYy9tZW1vLXJhY2UuanMiLCIuL3NyYy9pcy1wcm9taXNlLmpzIiwiLi9zcmMvdHlwZXMuanMiXSwiZXhwb3J0cyI6WyJtYWtlUHJvbWlzZUtpdCIsInJhY2VQcm9taXNlcyJdLCJyZWV4cG9ydHMiOlsiLi9zcmMvaXMtcHJvbWlzZS5qcyIsIi4vc3JjL3R5cGVzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IG1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCxtZW1vUmFjZTskaOKAjV9pbXBvcnRzKFtbXCIuL3NyYy9wcm9taXNlLWV4ZWN1dG9yLWtpdC5qc1wiLCBbW1wibWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0XCIsIFskaOKAjV9hID0+IChtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQgPSAkaOKAjV9hKV1dXV0sW1wiLi9zcmMvbWVtby1yYWNlLmpzXCIsIFtbXCJtZW1vUmFjZVwiLCBbJGjigI1fYSA9PiAobWVtb1JhY2UgPSAkaOKAjV9hKV1dXV0sW1wiLi9zcmMvaXMtcHJvbWlzZS5qc1wiLCBbXV0sW1wiLi9zcmMvdHlwZXMuanNcIiwgW11dXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KG1ha2VQcm9taXNlS2l0LCAnbmFtZScsIHt2YWx1ZTogXCJtYWtlUHJvbWlzZUtpdFwifSk7JGjigI1fb25jZS5tYWtlUHJvbWlzZUtpdChtYWtlUHJvbWlzZUtpdCk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHJhY2VQcm9taXNlcywgJ25hbWUnLCB7dmFsdWU6IFwicmFjZVByb21pc2VzXCJ9KTskaOKAjV9vbmNlLnJhY2VQcm9taXNlcyhyYWNlUHJvbWlzZXMpOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGUge1Byb21pc2VDb25zdHJ1Y3Rvcn0gKi9cbmNvbnN0IEJlc3RQaXBlbGluYWJsZVByb21pc2U9Z2xvYmFsVGhpcy5IYW5kbGVkUHJvbWlzZXx8UHJvbWlzZTtcblxuLyoqXG4gKiBtYWtlUHJvbWlzZUtpdCgpIGJ1aWxkcyBhIFByb21pc2Ugb2JqZWN0LCBhbmQgcmV0dXJucyBhIHJlY29yZFxuICogY29udGFpbmluZyB0aGUgcHJvbWlzZSBpdHNlbGYsIGFzIHdlbGwgYXMgc2VwYXJhdGUgZmFjZXRzIGZvciByZXNvbHZpbmdcbiAqIGFuZCByZWplY3RpbmcgaXQuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEByZXR1cm5zIHtYaW1wb3J0KCcuL3NyYy90eXBlcy5qcycpLlByb21pc2VLaXQ8VD59XG4gKi9cbmZ1bmN0aW9uICAgICAgICBtYWtlUHJvbWlzZUtpdCgpe1xuY29uc3R7cmVzb2x2ZSxyZWplY3QsZXhlY3V0b3J9PW1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCgpO1xuXG5jb25zdCBwcm9taXNlPW5ldyBCZXN0UGlwZWxpbmFibGVQcm9taXNlKGV4ZWN1dG9yKTtcblxucmV0dXJuIGhhcmRlbih7cHJvbWlzZSxyZXNvbHZlLHJlamVjdH0pO1xuIH1cbmhhcmRlbihtYWtlUHJvbWlzZUtpdCk7XG5cbi8qIE5COiBBbm90aGVyIGltcGxlbWVudGF0aW9uIGZvciBQcm9taXNlLnJhY2Ugd291bGQgYmUgdG8gdXNlIHRoZSByZWxlYXNpbmcgZXhlY3V0b3IsKi9cbi8qIEhvd2V2ZXIgd2hpbGUgaXQgd291bGQgbm8gbG9uZ2VyIGxlYWsgdGhlIHJhY2VkIHByb21pc2Ugb2JqZWN0cyB0aGVtc2VsdmVzLCBpdCB3b3VsZCovXG4vKiBzdGlsbCBsZWFrIHJlYWN0aW9ucyBvbiB0aGUgbm9uLXJlc29sdmVkIHByb21pc2VzIGNvbnRlbmRpbmcgZm9yIHRoZSByYWNlLiovXG5cbi8qKlxuICogQ3JlYXRlcyBhIFByb21pc2UgdGhhdCBpcyByZXNvbHZlZCBvciByZWplY3RlZCB3aGVuIGFueSBvZiB0aGUgcHJvdmlkZWQgUHJvbWlzZXMgYXJlIHJlc29sdmVkXG4gKiBvciByZWplY3RlZC5cbiAqXG4gKiBVbmxpa2UgYFByb21pc2UucmFjZWAgaXQgY2xlYW5zIHVwIGFmdGVyIGl0c2VsZiBzbyBhIG5vbi1yZXNvbHZlZCB2YWx1ZSBkb2Vzbid0IGhvbGQgb250b1xuICogdGhlIHJlc3VsdCBwcm9taXNlLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFQ+fSB2YWx1ZXMgQW4gaXRlcmFibGUgb2YgUHJvbWlzZXMuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxBd2FpdGVkPFQ+Pn0gQSBuZXcgUHJvbWlzZS5cbiAqL1xuZnVuY3Rpb24gICAgICAgIHJhY2VQcm9taXNlcyh2YWx1ZXMpe1xucmV0dXJuIGhhcmRlbihtZW1vUmFjZS5jYWxsKEJlc3RQaXBlbGluYWJsZVByb21pc2UsdmFsdWVzKSk7XG4gfVxuaGFyZGVuKHJhY2VQcm9taXNlcyk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVByb21pc2VLaXQiOlsibWFrZVByb21pc2VLaXQiXSwicmFjZVByb21pc2VzIjpbInJhY2VQcm9taXNlcyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACIfYGs3wIAAN8CAAArAAAAQGVuZG8vcHJvbWlzZS1raXQtdjAuMi42MC9zcmMvaXMtcHJvbWlzZS5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiaXNQcm9taXNlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGlzUHJvbWlzZSwgJ25hbWUnLCB7dmFsdWU6IFwiaXNQcm9taXNlXCJ9KTskaOKAjV9vbmNlLmlzUHJvbWlzZShpc1Byb21pc2UpOyAgIC8qKlxuICogRGV0ZXJtaW5lIGlmIHRoZSBhcmd1bWVudCBpcyBhIFByb21pc2UuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBtYXliZVByb21pc2UgVGhlIHZhbHVlIHRvIGV4YW1pbmVcbiAqIEByZXR1cm5zIHttYXliZVByb21pc2UgaXMgUHJvbWlzZX0gV2hldGhlciBpdCBpcyBhIHByb21pc2VcbiAqL1xuZnVuY3Rpb24gICAgICAgIGlzUHJvbWlzZShtYXliZVByb21pc2Upe1xucmV0dXJuIFByb21pc2UucmVzb2x2ZShtYXliZVByb21pc2UpPT09bWF5YmVQcm9taXNlO1xuIH1cbmhhcmRlbihpc1Byb21pc2UpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzUHJvbWlzZSI6WyJpc1Byb21pc2UiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAHadN674SAAC+EgAAKgAAAEBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNjAvc3JjL21lbW8tcmFjZS5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsibWVtb1JhY2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKiBJbml0aWFsIHZlcnNpb24gYXV0aG9yZWQgYnkgQnJpYW4gS2ltOlxuaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL2lzc3Vlcy8xNzQ2OSNpc3N1ZWNvbW1lbnQtNjg1MjE2Nzc3XG4gVGhpcyBpcyBmcmVlIGFuZCB1bmVuY3VtYmVyZWQgc29mdHdhcmUgcmVsZWFzZWQgaW50byB0aGUgcHVibGljIGRvbWFpbi5cbiBBbnlvbmUgaXMgZnJlZSB0byBjb3B5LCBtb2RpZnksIHB1Ymxpc2gsIHVzZSwgY29tcGlsZSwgc2VsbCwgb3JcbmRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSwgZWl0aGVyIGluIHNvdXJjZSBjb2RlIGZvcm0gb3IgYXMgYSBjb21waWxlZFxuYmluYXJ5LCBmb3IgYW55IHB1cnBvc2UsIGNvbW1lcmNpYWwgb3Igbm9uLWNvbW1lcmNpYWwsIGFuZCBieSBhbnlcbm1lYW5zLlxuIEluIGp1cmlzZGljdGlvbnMgdGhhdCByZWNvZ25pemUgY29weXJpZ2h0IGxhd3MsIHRoZSBhdXRob3Igb3IgYXV0aG9yc1xub2YgdGhpcyBzb2Z0d2FyZSBkZWRpY2F0ZSBhbnkgYW5kIGFsbCBjb3B5cmlnaHQgaW50ZXJlc3QgaW4gdGhlXG5zb2Z0d2FyZSB0byB0aGUgcHVibGljIGRvbWFpbi4gV2UgbWFrZSB0aGlzIGRlZGljYXRpb24gZm9yIHRoZSBiZW5lZml0XG5vZiB0aGUgcHVibGljIGF0IGxhcmdlIGFuZCB0byB0aGUgZGV0cmltZW50IG9mIG91ciBoZWlycyBhbmRcbnN1Y2Nlc3NvcnMuIFdlIGludGVuZCB0aGlzIGRlZGljYXRpb24gdG8gYmUgYW4gb3ZlcnQgYWN0IG9mXG5yZWxpbnF1aXNobWVudCBpbiBwZXJwZXR1aXR5IG9mIGFsbCBwcmVzZW50IGFuZCBmdXR1cmUgcmlnaHRzIHRvIHRoaXNcbnNvZnR3YXJlIHVuZGVyIGNvcHlyaWdodCBsYXcuXG4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCxcbkVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULlxuSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1Jcbk9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLFxuQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SXG5PVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHBsZWFzZSByZWZlciB0byA8aHR0cDovL3VubGljZW5zZS5vcmcvPlxuKi9cblxuXG5cblxuXG5cblxuY29uc3QgaXNPYmplY3Q9KHZhbHVlKT0+T2JqZWN0KHZhbHVlKT09PXZhbHVlO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBbVD1hbnldXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBEZWZlcnJlZFxuICogQHByb3BlcnR5IHsodmFsdWU/OiBYaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5FUmVmPFQ+ICkgPT4gdm9pZH0gcmVzb2x2ZVxuICogQHByb3BlcnR5IHsoZXJyPzogYW55ICkgPT4gdm9pZH0gcmVqZWN0XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7IG5ldmVyXG4gKiAgfCB7c2V0dGxlZDogZmFsc2UsIGRlZmVycmVkczogU2V0PERlZmVycmVkPn1cbiAqICB8IHtzZXR0bGVkOiB0cnVlLCBkZWZlcnJlZHM/OiB1bmRlZmluZWR9XG4gKiB9IFByb21pc2VNZW1vUmVjb3JkXG4gKi9cblxuLyogS2V5cyBhcmUgdGhlIHZhbHVlcyBwYXNzZWQgdG8gcmFjZSwgdmFsdWVzIGFyZSBhIHJlY29yZCBvZiBkYXRhIGNvbnRhaW5pbmcgYSovXG4vKiBzZXQgb2YgZGVmZXJyZWRzIGFuZCB3aGV0aGVyIHRoZSB2YWx1ZSBoYXMgc2V0dGxlZC4qL1xuLyoqIEB0eXBlIHtXZWFrTWFwPG9iamVjdCwgUHJvbWlzZU1lbW9SZWNvcmQ+fSAqL1xuY29uc3Qga25vd25Qcm9taXNlcz1uZXcgV2Vha01hcCgpO1xuXG4vKipcbiAqIEBwYXJhbSB7UHJvbWlzZU1lbW9SZWNvcmQgfCB1bmRlZmluZWR9IHJlY29yZFxuICogQHJldHVybnMge1NldDxEZWZlcnJlZD59XG4gKi9cbmNvbnN0IG1hcmtTZXR0bGVkPShyZWNvcmQpPT57XG5pZighcmVjb3JkfHxyZWNvcmQuc2V0dGxlZCl7XG5yZXR1cm4gbmV3IFNldCgpO1xuIH1cblxuY29uc3R7ZGVmZXJyZWRzfT1yZWNvcmQ7XG5PYmplY3QuYXNzaWduKHJlY29yZCx7XG5kZWZlcnJlZHM6dW5kZWZpbmVkLFxuc2V0dGxlZDp0cnVlfSk7XG5cbk9iamVjdC5mcmVlemUocmVjb3JkKTtcbnJldHVybiBkZWZlcnJlZHM7XG4gfTtcblxuLyoqXG4gKlxuICogQHBhcmFtIHthbnl9IHZhbHVlXG4gKiBAcmV0dXJucyB7UHJvbWlzZU1lbW9SZWNvcmR9XG4gKi9cbmNvbnN0IGdldE1lbW9SZWNvcmQ9KHZhbHVlKT0+e1xuaWYoIWlzT2JqZWN0KHZhbHVlKSl7XG4vKiBJZiB0aGUgY29udGVuZGVyIGlzIGEgcHJpbWl0aXZlLCBhdHRlbXB0aW5nIHRvIHVzZSBpdCBhcyBhIGtleSBpbiB0aGUqL1xuLyogd2Vha21hcCB3b3VsZCB0aHJvdyBhbiBlcnJvci4gTHVja2lseSwgaXQgaXMgc2FmZSB0byBjYWxsKi9cbi8qIGBQcm9taXNlLnJlc29sdmUoY29udGVuZGVyKS50aGVuYCBvbiBhIHByaW1pdGl2ZSB2YWx1ZSBtdWx0aXBsZSB0aW1lcyovXG4vKiBiZWNhdXNlIHRoZSBwcm9taXNlIGZ1bGZpbGxzIGltbWVkaWF0ZWx5LiBTbyB3ZSBmYWtlIGEgc2V0dGxlZCByZWNvcmQuKi9cbnJldHVybiBoYXJkZW4oe3NldHRsZWQ6dHJ1ZX0pO1xuIH1cblxubGV0IHJlY29yZD1rbm93blByb21pc2VzLmdldCh2YWx1ZSk7XG5cbmlmKCFyZWNvcmQpe1xucmVjb3JkPXtkZWZlcnJlZHM6bmV3IFNldCgpLHNldHRsZWQ6ZmFsc2V9O1xua25vd25Qcm9taXNlcy5zZXQodmFsdWUscmVjb3JkKTtcbi8qIFRoaXMgY2FsbCB0byBgdGhlbmAgaGFwcGVucyBvbmNlIGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIHZhbHVlLiovXG5Qcm9taXNlLnJlc29sdmUodmFsdWUpLnRoZW4oXG4odmFsKT0+e1xuZm9yKGNvbnN0e3Jlc29sdmV9b2YgbWFya1NldHRsZWQocmVjb3JkKSl7XG5yZXNvbHZlKHZhbCk7XG4gfVxuIH0sXG4oZXJyKT0+e1xuZm9yKGNvbnN0e3JlamVjdH1vZiBtYXJrU2V0dGxlZChyZWNvcmQpKXtcbnJlamVjdChlcnIpO1xuIH1cbiB9KTtcblxuIH1cbnJldHVybiByZWNvcmQ7XG4gfTtcblxuY29uc3R7cmFjZX09e1xuLyoqXG4gKiBDcmVhdGVzIGEgUHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIG9yIHJlamVjdGVkIHdoZW4gYW55IG9mIHRoZSBwcm92aWRlZCBQcm9taXNlcyBhcmUgcmVzb2x2ZWRcbiAqIG9yIHJlamVjdGVkLlxuICpcbiAqIFVubGlrZSBgUHJvbWlzZS5yYWNlYCBpdCBjbGVhbnMgdXAgYWZ0ZXIgaXRzZWxmIHNvIGEgbm9uLXJlc29sdmVkIHZhbHVlIGRvZXNuJ3QgaG9sZCBvbnRvXG4gKiB0aGUgcmVzdWx0IHByb21pc2UuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0ZW1wbGF0ZSB7UHJvbWlzZUNvbnN0cnVjdG9yfSBbUD1Qcm9taXNlQ29uc3RydWN0b3JdXG4gKiBAdGhpcyB7UH1cbiAqIEBwYXJhbSB7SXRlcmFibGU8VD59IHZhbHVlcyBBbiBpdGVyYWJsZSBvZiBQcm9taXNlcy5cbiAqIEByZXR1cm5zIHtQcm9taXNlPEF3YWl0ZWQ8VD4+fSBBIG5ldyBQcm9taXNlLlxuICovXG5yYWNlKHZhbHVlcyl7XG5sZXQgZGVmZXJyZWQ7XG4vKiogQHR5cGUge1RbXX0gKi9cbmNvbnN0IGNhY2hlZFZhbHVlcz1bXTtcbmNvbnN0IEM9dGhpcztcbmNvbnN0IHJlc3VsdD1uZXcgQygocmVzb2x2ZSxyZWplY3QpPT57XG5kZWZlcnJlZD17cmVzb2x2ZSxyZWplY3R9O1xuZm9yKGNvbnN0IHZhbHVlIG9mIHZhbHVlcyl7XG5jYWNoZWRWYWx1ZXMucHVzaCh2YWx1ZSk7XG5jb25zdHtzZXR0bGVkLGRlZmVycmVkc309Z2V0TWVtb1JlY29yZCh2YWx1ZSk7XG5pZihzZXR0bGVkKXtcbi8qIElmIHRoZSBjb250ZW5kZXIgaXMgc2V0dGxlZCAoaW5jbHVkaW5nIHByaW1pdGl2ZXMpLCBpdCBpcyBzYWZlKi9cbi8qIHRvIGNhbGwgYFByb21pc2UucmVzb2x2ZSh2YWx1ZSkudGhlbmAgb24gaXQuKi9cbkMucmVzb2x2ZSh2YWx1ZSkudGhlbihyZXNvbHZlLHJlamVjdCk7XG4gfWVsc2V7XG5kZWZlcnJlZHMuYWRkKGRlZmVycmVkKTtcbiB9XG4gfVxuIH0pO1xuXG4vKiBUaGUgZmluYWxseSBjYWxsYmFjayBleGVjdXRlcyB3aGVuIGFueSB2YWx1ZSBzZXR0bGVzLCBwcmV2ZW50aW5nIGFueSBvZiovXG4vKiB0aGUgdW5yZXNvbHZlZCB2YWx1ZXMgZnJvbSByZXRhaW5pbmcgYSByZWZlcmVuY2UgdG8gdGhlIHJlc29sdmVkIHZhbHVlLiovXG5yZXR1cm4gcmVzdWx0LmZpbmFsbHkoKCk9PntcbmZvcihjb25zdCB2YWx1ZSBvZiBjYWNoZWRWYWx1ZXMpe1xuY29uc3R7ZGVmZXJyZWRzfT1nZXRNZW1vUmVjb3JkKHZhbHVlKTtcbmlmKGRlZmVycmVkcyl7XG5kZWZlcnJlZHMuZGVsZXRlKGRlZmVycmVkKTtcbiB9XG4gfVxuIH0pO1xuIH19OyRo4oCNX29uY2UucmFjZShyYWNlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtZW1vUmFjZSI6WyJyYWNlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANNDsO5pBwAAaQcAADUAAABAZW5kby9wcm9taXNlLWtpdC12MC4yLjYwL3NyYy9wcm9taXNlLWV4ZWN1dG9yLWtpdC5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsibWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyovIDxyZWZlcmVuY2UgdHlwZXM9XCJzZXNcIi8+Ki9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQGNhbGxiYWNrIFByb21pc2VFeGVjdXRvciBUaGUgcHJvbWlzZSBleGVjdXRvclxuICogQHBhcmFtIHsodmFsdWU6IFhpbXBvcnQoJy4vdHlwZXMuanMnKS5FUmVmPFQ+KSA9PiB2b2lkfSByZXNvbHZlXG4gKiBAcGFyYW0geyhyZWFzb246IGFueSkgPT4gdm9pZH0gcmVqZWN0XG4gKi9cblxuLyoqXG4gKiBtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQoKSBidWlsZHMgcmVzb2x2ZS9yZWplY3QgZnVuY3Rpb25zIHdoaWNoIGRyb3AgcmVmZXJlbmNlc1xuICogdG8gdGhlIHJlc29sdmUvcmVqZWN0IGZ1bmN0aW9ucyBnYXRoZXJlZCBmcm9tIGFuIGV4ZWN1dG9yIHRvIGJlIHVzZWQgd2l0aCBhXG4gKiBwcm9taXNlIGNvbnN0cnVjdG9yLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcmV0dXJucyB7UGljazxYaW1wb3J0KCcuL3R5cGVzLmpzJykuUHJvbWlzZUtpdDxUPiwgJ3Jlc29sdmUnIHwgJ3JlamVjdCc+ICYgeyBleGVjdXRvcjogUHJvbWlzZUV4ZWN1dG9yPFQ+fX1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdD0oKT0+e1xuLyoqIEB0eXBlIHtudWxsIHwgdW5kZWZpbmVkIHwgKCh2YWx1ZTogWGltcG9ydCgnLi90eXBlcy5qcycpLkVSZWY8VD4pID0+IHZvaWQpfSAqL1xubGV0IGludGVybmFsUmVzb2x2ZTtcbi8qKiBAdHlwZSB7bnVsbCB8IHVuZGVmaW5lZCB8ICgocmVhc29uOiB1bmtub3duKSA9PiB2b2lkKX0gKi9cbmxldCBpbnRlcm5hbFJlamVjdDtcblxuLyoqIEBwYXJhbSB7WGltcG9ydCgnLi90eXBlcy5qcycpLkVSZWY8VD59IHZhbHVlICovXG5jb25zdCByZXNvbHZlPSh2YWx1ZSk9PntcbmlmKGludGVybmFsUmVzb2x2ZSl7XG5pbnRlcm5hbFJlc29sdmUodmFsdWUpO1xuaW50ZXJuYWxSZXNvbHZlPW51bGw7XG5pbnRlcm5hbFJlamVjdD1udWxsO1xuIH1lbHNle1xuYXNzZXJ0KGludGVybmFsUmVzb2x2ZT09PW51bGwpO1xuIH1cbiB9O1xuXG4vKiogQHBhcmFtIHt1bmtub3dufSByZWFzb24gKi9cbmNvbnN0IHJlamVjdD0ocmVhc29uKT0+e1xuaWYoaW50ZXJuYWxSZWplY3Qpe1xuaW50ZXJuYWxSZWplY3QocmVhc29uKTtcbmludGVybmFsUmVzb2x2ZT1udWxsO1xuaW50ZXJuYWxSZWplY3Q9bnVsbDtcbiB9ZWxzZXtcbmFzc2VydChpbnRlcm5hbFJlamVjdD09PW51bGwpO1xuIH1cbiB9O1xuXG5jb25zdCBleGVjdXRvcj0ocmVzLHJlaik9PntcbmFzc2VydChpbnRlcm5hbFJlc29sdmU9PT11bmRlZmluZWQmJmludGVybmFsUmVqZWN0PT09dW5kZWZpbmVkKTtcbmludGVybmFsUmVzb2x2ZT1yZXM7XG5pbnRlcm5hbFJlamVjdD1yZWo7XG4gfTtcblxucmV0dXJuIGhhcmRlbih7cmVzb2x2ZSxyZWplY3QsZXhlY3V0b3J9KTtcbiB9OyRo4oCNX29uY2UubWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0KG1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCk7XG5oYXJkZW4obWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0KTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQiOlsibWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJgZO7M0AQAANAEAACYAAABAZW5kby9wcm9taXNlLWtpdC12MC4yLjYwL3NyYy90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsBAh4DCgAAAAAAAAAAAMjrs880QgAANEIAABQAAAAAAAAAAAAAAKSBAAAAAGNvbXBhcnRtZW50LW1hcC5qc29uUEsBAh4DCgAAAAAAAAAAAO0PZ2GTBQAAkwUAADoAAAAAAAAAAAAAAKSBZkIAAEBhZ29yaWMvdmF0cy12MC4xNS4xL3NyYy9wcm9wb3NhbHMvdXBncmFkZS16b2UtcHJvcG9zYWwuanNQSwECHgMKAAAAAAAAAAAAHij7tH4BAAB+AQAAIQAAAAAAAAAAAAAApIFRSAAAQGVuZG8vZW52LW9wdGlvbnMtdjAuMS40L2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAALIc4n2YDAAAmAwAACsAAAAAAAAAAAAAAKSBDkoAAEBlbmRvL2Vudi1vcHRpb25zLXYwLjEuNC9zcmMvZW52LW9wdGlvbnMuanNQSwECHgMKAAAAAAAAAAAAtC+LggcuAAAHLgAAJAAAAAAAAAAAAAAApIHvVgAAQGVuZG8vZXZlbnR1YWwtc2VuZC12MC4xNy42L3NyYy9FLmpzUEsBAh4DCgAAAAAAAAAAAJgZO7M0AQAANAEAACoAAAAAAAAAAAAAAKSBOIUAAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTcuNi9zcmMvZXhwb3J0cy5qc1BLAQIeAwoAAAAAAAAAAAD7GHTdRQIAAEUCAAAqAAAAAAAAAAAAAACkgbSGAABAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE3LjYvc3JjL25vLXNoaW0uanNQSwECHgMKAAAAAAAAAAAA6qEddJcQAACXEAAALgAAAAAAAAAAAAAApIFBiQAAQGVuZG8vZXZlbnR1YWwtc2VuZC12MC4xNy42L3NyYy90cmFjay10dXJucy5qc1BLAQIeAwoAAAAAAAAAAABBDDOUQAIAAEACAAAeAAAAAAAAAAAAAACkgSSaAABAZW5kby9mYXItdjAuMi4yMi9zcmMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAA+UN81nwIAAB8CAAAIAAAAAAAAAAAAAAApIGgnAAAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjcvaW5kZXguanNQSwECHgMKAAAAAAAAAAAA3ka2qpMHAACTBwAAKAAAAAAAAAAAAAAApIFapQAAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjcvc3JjL2NvcHlBcnJheS5qc1BLAQIeAwoAAAAAAAAAAACD9dsszwcAAM8HAAApAAAAAAAAAAAAAACkgTOtAABAZW5kby9wYXNzLXN0eWxlLXYwLjEuNy9zcmMvY29weVJlY29yZC5qc1BLAQIeAwoAAAAAAAAAAABqd7sZSxIAAEsSAAAkAAAAAAAAAAAAAACkgUm1AABAZW5kby9wYXNzLXN0eWxlLXYwLjEuNy9zcmMvZXJyb3IuanNQSwECHgMKAAAAAAAAAAAASjtmg1UIAABVCAAAKwAAAAAAAAAAAAAApIHWxwAAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjcvc3JjL2l0ZXItaGVscGVycy5qc1BLAQIeAwoAAAAAAAAAAAD6Vf/NMhoAADIaAAAnAAAAAAAAAAAAAACkgXTQAABAZW5kby9wYXNzLXN0eWxlLXYwLjEuNy9zcmMvbWFrZS1mYXIuanNQSwECHgMKAAAAAAAAAAAAApF75R0EAAAdBAAAKQAAAAAAAAAAAAAApIHr6gAAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjcvc3JjL21ha2VUYWdnZWQuanNQSwECHgMKAAAAAAAAAAAAGUAoxvUZAAD1GQAAMAAAAAAAAAAAAAAApIFP7wAAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjcvc3JjL3Bhc3NTdHlsZS1oZWxwZXJzLmpzUEsBAh4DCgAAAAAAAAAAAM1XxCzXHgAA1x4AACoAAAAAAAAAAAAAAKSBkgkBAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS43L3NyYy9wYXNzU3R5bGVPZi5qc1BLAQIeAwoAAAAAAAAAAAAUsaJ9wyEAAMMhAAAoAAAAAAAAAAAAAACkgbEoAQBAZW5kby9wYXNzLXN0eWxlLXYwLjEuNy9zcmMvcmVtb3RhYmxlLmpzUEsBAh4DCgAAAAAAAAAAADKboYeaDwAAmg8AACsAAAAAAAAAAAAAAKSBukoBAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS43L3NyYy9zYWZlLXByb21pc2UuanNQSwECHgMKAAAAAAAAAAAAxx/VUEcSAABHEgAAJQAAAAAAAAAAAAAApIGdWgEAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjcvc3JjL3N5bWJvbC5qc1BLAQIeAwoAAAAAAAAAAAAlvFz7/QcAAP0HAAAlAAAAAAAAAAAAAACkgSdtAQBAZW5kby9wYXNzLXN0eWxlLXYwLjEuNy9zcmMvdGFnZ2VkLmpzUEsBAh4DCgAAAAAAAAAAAHqgfmgSDQAAEg0AACkAAAAAAAAAAAAAAKSBZ3UBAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS43L3NyYy90eXBlR3VhcmRzLmpzUEsBAh4DCgAAAAAAAAAAAJgZO7M0AQAANAEAACQAAAAAAAAAAAAAAKSBwIIBAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS43L3NyYy90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAAABwljLcAkAAHAJAAAiAAAAAAAAAAAAAACkgTaEAQBAZW5kby9wcm9taXNlLWtpdC12MC4yLjYwL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAIh9gazfAgAA3wIAACsAAAAAAAAAAAAAAKSB5o0BAEBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNjAvc3JjL2lzLXByb21pc2UuanNQSwECHgMKAAAAAAAAAAAAHadN674SAAC+EgAAKgAAAAAAAAAAAAAApIEOkQEAQGVuZG8vcHJvbWlzZS1raXQtdjAuMi42MC9zcmMvbWVtby1yYWNlLmpzUEsBAh4DCgAAAAAAAAAAANNDsO5pBwAAaQcAADUAAAAAAAAAAAAAAKSBFKQBAEBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNjAvc3JjL3Byb21pc2UtZXhlY3V0b3Ita2l0LmpzUEsBAh4DCgAAAAAAAAAAAJgZO7M0AQAANAEAACYAAAAAAAAAAAAAAKSB0KsBAEBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNjAvc3JjL3R5cGVzLmpzUEsFBgAAAAAdAB0AugkAAEitAQAAAA==", + "endoZipBase64Sha512": "a3dc21c56535b4bebdf8c8413650eec2b37a6d9f5669b27f8c571601a6f641ffae2b925dd7e3d67c6953a1f8122c8ba814305e034c9087056816a6f05dd41069" +} \ No newline at end of file diff --git a/proposals/b:zoe1/submission/b1-a63b1a57ccaf4f9b89e7d3e1e79d97406445c687dbf3c58ed45643b9da63b72bef9e3bff78d7ed2daf458f0376c3a4db8961c16204e1e7b7deaa30326553b66f.json b/proposals/b:zoe1/submission/b1-a63b1a57ccaf4f9b89e7d3e1e79d97406445c687dbf3c58ed45643b9da63b72bef9e3bff78d7ed2daf458f0376c3a4db8961c16204e1e7b7deaa30326553b66f.json new file mode 100644 index 00000000..985a9eda --- /dev/null +++ b/proposals/b:zoe1/submission/b1-a63b1a57ccaf4f9b89e7d3e1e79d97406445c687dbf3c58ed45643b9da63b72bef9e3bff78d7ed2daf458f0376c3a4db8961c16204e1e7b7deaa30326553b66f.json @@ -0,0 +1,5 @@ +{ + "moduleFormat": "endoZipBase64", + "endoZipBase64": "UEsDBAoAAAAAAAAAAABLzpU2eiMBAHojAQAUAAAAY29tcGFydG1lbnQtbWFwLmpzb257CiAgInRhZ3MiOiBbXSwKICAiZW50cnkiOiB7CiAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy92YXRzLXYwLjE1LjEiLAogICAgIm1vZHVsZSI6ICIuL3NyYy92YXQtem9lLmpzIgogIH0sCiAgImNvbXBhcnRtZW50cyI6IHsKICAgICJAYWdvcmljL2Fzc2VydC12MC42LjAiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvYXNzZXJ0IiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvYXNzZXJ0LXYwLjYuMCIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL2Fzc2VydC12MC42LjAiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9hc3NlcnQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9hc3NlcnQtdjAuNi4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvYXNzZXJ0LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2Fzc2VydC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvYXNzZXJ0LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiY2Q3MmM4NTVlZjYzMGY2ZjQxYWU5ZDY2OGFiMTJlNmNlY2FlMDU2ZjJjNjQyODdmY2FhMzlmZDhiOTA1OTcxM2Q0MGY0MWE3ODQ0ZDhkZTI2Mzg1MGY1NjNiNTEzNWUwYmE0NDExYzI1MjEzYmU0NmJhNGU4NmRkZjlkM2U5NjEiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvYmFzZS16b25lLXYwLjEuMCI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy9iYXNlLXpvbmUiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4wIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvYmFzZS16b25lLXYwLjEuMCIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL2Jhc2Utem9uZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2Jhc2Utem9uZS9oZWFwLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvYmFzZS16b25lLXYwLjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaGVhcC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2Jhc2Utem9uZS90b29scy8qIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvYmFzZS16b25lLXYwLjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vdG9vbHMvKiIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3N0b3JlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3RvcmUtdjAuOS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXhvIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V4by12MC4yLjYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V4by9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXhvLXYwLjIuNiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V4by90b29scy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9leG8tdjAuMi42IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi90b29scy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9mYXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZmFyLXYwLjIuMjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXNzLXN0eWxlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS43IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXNzLXN0eWxlL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXNzLXN0eWxlLXYwLjEuNyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Bhc3Mtc3R5bGUvdG9vbHMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGFzcy1zdHlsZS12MC4xLjciLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3Rvb2xzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3BhdHRlcm5zIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3BhdHRlcm5zLXYwLjIuNiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGF0dGVybnMvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3BhdHRlcm5zLXYwLjIuNiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIi4vaGVhcC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJoZWFwLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiN2FmOTcwNjVjMTNhNWY0ODBkOTUwNTIzYzMxNTliNjJmYjgyNzhiZjc4ZTliODlkZTQzMmYwMjkzY2I0ZDViZDdjMWM0ZjY1MWE3NTdjYjhmMTRlYmU2MTY4MGFkNjZhODFiOWUzYWVlNTFlMmEwNGJmNzc4YWQ2YmVlNTNhOWQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaGVhcC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaGVhcC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImMwZWVlYjA1ZjI4YzdiODZmOTEzZDNmOGM2ZmU4MjBlYzY1MWM2MTMzZTI2MjRlODY2OTJjM2UxMzlhZDIxMzczNzgyMmJmNzQ4N2IwNmE2Y2EwYzhhMDlmNDgzNTFjOWRmZDg1YWUxNGQwMGU0YTJlNGQ2YjEwNzE2NmY4ZTc5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2lzLXBhc3NhYmxlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pcy1wYXNzYWJsZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImRmMzM2ODZmMjYzZmI3ZjVlOGNhZGEzZWQyODZlZjkxMTIxNWEyMzg3MjY0Njc1YTdiOTc0YmYzYWM3YjlkNTA2ZTAzZDFjNjhhMTZkNTE2NGVlM2RjOWIxYjRjYzg0NWU2ZmYyYWZjOGM1NmRjMjk3YTMwNjUyNGVlNTI3N2M3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2tleXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2tleXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiMWEwOWE1ODUzN2Q0YTM1NzliYTc1ZjJjODg3ZTM3N2ViMDhiNWFlYjNjNmY2OGIzNDEyZTVmNzI4NmU3NzdhNjY2NDU5OWU2NDNiOWU3ZjkyY2U3NWJjOWRhNzE0ZDY0ODczMTlmNjc5MzA4OTU2MDY4Y2YwM2MzNDdhMjA3NSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYWtlLW9uY2UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21ha2Utb25jZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjlhZWM2ZDQ2MDBhM2NmZjk2ODBmZTRhNzhhYWJiMDBmYjMxODc5NWQ3M2UxYWE4YzFhN2YzMzM5OWJjOWY3ZjFlZGE1NTk1ZDg2NDY1Njg5YTQ2ODNhNDRkMWJkYTQwZTcyNmVkODg2MGM4ZjczMTBjYzVmNDdjNTE3ZTFiNDg0IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAYWdvcmljL2VydHAtdjAuMTYuMiI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy9lcnRwIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvZXJ0cC12MC4xNi4yIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvZXJ0cC12MC4xNi4yIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvYXNzZXJ0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvYXNzZXJ0LXYwLjYuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2Fzc2VydC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2VydHAiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9lcnRwLXYwLjE2LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL25vdGlmaWVyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbm90aWZpZXItdjAuNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9ub3RpZmllci9leHBvcnRlZC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZXhwb3J0ZWQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9ub3RpZmllci9zdWJzY3JpYmUuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9ub3RpZmllci12MC42LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3N1YnNjcmliZS5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL25vdGlmaWVyL3Rvb2xzL3Rlc3RTdXBwb3J0cy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vdG9vbHMvdGVzdFN1cHBvcnRzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3RvcmUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zdG9yZS12MC45LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3N0b3JlL2V4cG9ydGVkLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3RvcmUtdjAuOS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9leHBvcnRlZC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3ZhdC1kYXRhIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvdmF0LWRhdGEtdjAuNS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE3LjYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2ZhciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9mYXItdjAuMi4yMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL21hcnNoYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbWFyc2hhbC12MC44LjkiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL25hdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9uYXQtdjQuMS4zMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL25hdC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbmF0LXY0LjEuMzEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXR0ZXJucyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXR0ZXJucy12MC4yLjYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3BhdHRlcm5zL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXR0ZXJucy12MC4yLjYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjYwIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi42MCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3NoaW0uanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi42MCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICIuL2V4cG9ydGVkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImV4cG9ydGVkLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYTM3NzZlMzJiMDQyNzc0NTQ5Y2JlYmFiZmI2MjFkNmY4ZWY5MmUwM2FlN2MyZDMxZDMxODk2YWMyZWVjZWM5OGQxZTliNjkyOWE0YjU5NDgzNDY3NjhkYjUyMWZlMjA0YWVlZGNmNWZmZjM1OWZlMmU0Y2EwNWQ2M2Y1YTQ5ZDciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvYW1vdW50TWF0aC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvYW1vdW50TWF0aC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjFhYTA5ZDA4ZDAwNDEyMzUwYmEyOTZiMjVhMjFhNjNmMjZhZTkzMmYxZWY4Mzg1NTY0NDYyYzQ1MzRmMTQ0Mjc4NDY2YzY5MzEwYjE2MTRmYTgyOTIzMzI4MWY3NzhiMDdkYWZhYTIyZTE1NzJkODE0MjgxN2EzYjNmZmU3ZmQzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2Rpc3BsYXlJbmZvLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9kaXNwbGF5SW5mby5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImIxMGI2MjYzYzI1MjJiNTkzYzFlYTdjYTUzMmNmMThjMGEzYzg5ZDdiN2Y2YWEwY2U4MjNiZmUyY2EyNGIyODk0MTJjZTJhYmNiNGViMGUxYjMzOTM0M2ZhYzY3MmMwMzY0MWY3MDlmMTBjNzEwMjU3YTE1OGUzYTljZjY4NGY2IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjMzYTgxNDM3OGY0MWUxYjhlNmJjNTY3ZDNiZmQ0YjRhNzhlODdlNDdiYTdmNTE5ZTk1ODAyMWVhN2YwYTEyYWU5YWM5Zjc2NmI0NzA1MjhkNDk4OGE3Njg4MThmMGJhYjFhMTRhYzAxNTE5MGQ1NDMxYzhlNTVjMWYzM2M1Y2NmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2lzc3VlcktpdC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaXNzdWVyS2l0LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNjlmMGJlNzRhYTdlMzk1ODQwYTI1MjY3NGFkNTE2OGQ5M2U1ZjdlMmEyOGRlYzA1YjRjY2ZhMmUxMzNmZWJlYjZkMjVhNmQ0YjVmMTY5NjBlNmNmMDlkYzNmYzQ2MDhmOTI0ODZiMDBhMGU2ZmQ5NDJiOTM0MTVkYzVlMjJhNWMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWF0aEhlbHBlcnMvY29weUJhZ01hdGhIZWxwZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXRoSGVscGVycy9jb3B5QmFnTWF0aEhlbHBlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4MzI1ZTUzNWE3ODQ5YzdmNjE2MmJjZDAzMDBhY2JjMzEyOTUyYzY4YmJiYTdkYTFkZWU3YTgyYzkwMTg1ODVhZWVhMGJlYTk4Yjg2NGZlMDkwODM3MDUxZjk5YTdkZGVmN2NkNmUxNzE3MDY3OThmNzlhOWFhZjU0MGMxYjAzZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYXRoSGVscGVycy9jb3B5U2V0TWF0aEhlbHBlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hdGhIZWxwZXJzL2NvcHlTZXRNYXRoSGVscGVycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjE5Y2UwNDcyOWY2OWY5NWZhMDNmMTc0ZDIxM2U4ZjA3ZGQ0NWRlOTgwNWRmY2RjZjE0NTY2MzdmODdlNjljNTlhNzNlZWI0MDE4NTk2NmYxODBlMmEzMTQxM2QyYmEzZTVkNzBkOGZiMmIwNDU2ODQ4NTcwZTE4ZTVkODkxYmQxIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hdGhIZWxwZXJzL25hdE1hdGhIZWxwZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXRoSGVscGVycy9uYXRNYXRoSGVscGVycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImMwMTUxYTZhMTU0YjA2NjgwNjNjNGE2ODIxZjUxN2Q2OWFiNjYxYTczMmM1NTk5ZGViYjNiMDZkNjNmZmU4NzMyYjM1ZWYzZjY2ZGYyZWQxMTU2YmIxNmNjZDhiZTg5MDg2N2E5ZWUzMjc0ZWVjMDc0ZGMxNDllNWI5Y2M5YmU1IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hdGhIZWxwZXJzL3NldE1hdGhIZWxwZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXRoSGVscGVycy9zZXRNYXRoSGVscGVycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImI5OWEwNzk1YmQzYWMwNTI0NGU0MmNhYjVmOTc0OWExNDRhMmZlNWI3M2I1ZTc5YzIwYTJhMzdjMWVhNTlmMjVmYzdiN2NkZjE2MjUzZTcwY2I5NjFhYTkyNjJmYzU3ZGJiNzNhNDQ0MTE1MTQ4YTA2NDVmZjhiNDI2ZmJkMDZmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3BheW1lbnQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3BheW1lbnQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4MDMyZDA4MjNjYWJmOTk3YmI2MDRmZjExOTNhOTAxM2QxNDllMDIyMmQwOTIyMDViZTY5OTcxZTRmY2NiYmIyN2ViZGVjMmZlNDEzOTY0NjUwZDIwYWNkNjI5NDM3OTk5Yjk5MGE5ZDU5M2YzZjA0Zjk3MWRjZGVkYmJkYmM3NCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXltZW50TGVkZ2VyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXltZW50TGVkZ2VyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMjdkMjYyODkyODIyOGViNDdkNmZjZTg0MTA3YTc4YmZjODFmMTkxZjkxNDA2N2M4ZDM5NjY0ZTdjYzMwNDlmOTM4MzNhZDQ4MzAwMTgwODI3MTA1NGIzMWUxNWQ3NzliNGQ3MmM2OGFkYWQ5NmIxYzI3MGFkMjNiOTlhN2I2ZjIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcHVyc2UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3B1cnNlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOTM2ZDg5OTFjNzM0YTU2NmNhOWRiNjc3MmQzNDIxNDE2YzNkZGE4NjdiZDNlNTFlMDBjOWExMDA0ZDY2NWRhNTUyZjUzOGM1M2U3NDk5YjlkYWViMjE5MDdjZDExYzVkOGM5ZmY4MGZjNzg3ZDdhNjZlNzc3ZjllNjM2YWYxODciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHJhbnNpZW50Tm90aWZpZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3RyYW5zaWVudE5vdGlmaWVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMDEyOTZhYTExZjI2YWNjNGRiNmM2NGVlNmEwNGJlOThlNGQxNjhkZGYwMGY0NTkxYTE2YzFjMzQyMTlhZDA1ZDdlNjkyNGY2ODkyZWU1ZmIwZDYzOGY4ZGE3NDJlZmMwNGEwMTBmYzFmYjEwYTE2ODE4ODg2ZGRjMWNmZTAzMzkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZUd1YXJkcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZUd1YXJkcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImVmNWNiZWI0MTIyZTBhZWJiMmJiZDcwMzM4ZjkwNTA5N2NjNWJkZjViNmQwMWIzZDlhOGFkY2Y1NWNhMzAyN2NkYTEzM2I1Y2U0NDViMGU4MjZmMjk0NTQxOTVjYzZmODI2YmM4MWM5ODRmNTViZGNlMjM1NjMwNzBiMDI5M2IzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLWFtYmllbnQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLWFtYmllbnQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2NDZlOGU2OWU3YTMyNzZkYWFjMmQwNGZhMTVmYjlhMzkwMzczYTRmZWE0MjY2NjllMDYzNjE1ZDZkOTI0YWI3YjZiNGZkMzk5YTRmOTFmYmIwMmQ2OGRiNWZjNzQ0ODNiODQ5NmEwNmJmYTg4NzI1YWNmY2RiZmQxZDU4MTQyMCIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvaW50ZXJuYWwiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9hc3NlcnQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9hc3NlcnQtdjAuNi4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvYXNzZXJ0LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvYmFzZS16b25lIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvYmFzZS16b25lLXYwLjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvYmFzZS16b25lL2hlYXAuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9oZWFwLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvYmFzZS16b25lL3Rvb2xzLyoiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi90b29scy8qIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvaW50ZXJuYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9mYXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZmFyLXYwLjIuMjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9pbml0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2luaXQtdjAuNS42MCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vaW5pdC9kZWJ1Zy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9pbml0LXYwLjUuNjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2RlYnVnLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2luaXQvbGVnYWN5LmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2luaXQtdjAuNS42MCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vbGVnYWN5LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2luaXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2luaXQtdjAuNS42MCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2luaXQvcHJlLWJ1bmRsZS1zb3VyY2UuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vaW5pdC12MC41LjYwIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wcmUtYnVuZGxlLXNvdXJjZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9pbml0L3ByZS1yZW1vdGluZy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9pbml0LXYwLjUuNjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3ByZS1yZW1vdGluZy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9pbml0L3ByZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9pbml0LXYwLjUuNjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3ByZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9pbml0L3Vuc2FmZS1mYXN0LmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2luaXQtdjAuNS42MCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vdW5zYWZlLWZhc3QuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYwLjguOSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGF0dGVybnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGF0dGVybnMtdjAuMi42IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXR0ZXJucy9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGF0dGVybnMtdjAuMi42IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi42MCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9zaGltLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vc3RyZWFtIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3N0cmVhbS12MC4zLjI5IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9zdHJlYW0vcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3N0cmVhbS12MC4zLjI5IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiYW55bG9nZ2VyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogImFueWxvZ2dlci12MC4yMS4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9hbnlsb2dnZXIuanMiCiAgICAgICAgfSwKICAgICAgICAiamVzc2llLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogImplc3NpZS5qcy12MC4zLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9tYWluLmpzIgogICAgICAgIH0sCiAgICAgICAgImplc3NpZS5qcy9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiamVzc2llLmpzLXYwLjMuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NhbGxiYWNrLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jYWxsYmFjay5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjE1Y2FjY2NmMjcyYTk2ZjI1MGJlZDE4NThlOGY2MWY1YTg5OTVjYjA5NmVmNzZmYjc2MjNlNDc0YTUwZGQ1NWZjMTY0OWJhY2RjMmQ4OWNiODBhNDdjZWIyN2Q2MWZiNDk2YTJiNjc3NTEzZmI0YzUyZTM1YWFhM2I4MWU0ZjExIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbmZpZy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29uZmlnLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOGEzMThlMTM3OWJlN2E4ODcyZGQ4ZGE5ZTdmYWEwZDc5MjA1YjVjODk5YzU0MTBmYjkwYTRiYzg5NWI3NTg1NWNjNzJhN2E5ZmRlMzVkYTBhMDc1ZDA2Y2E3N2E1ZjAwZGM4YjZiYjQwMDljZTNmMTk0M2Q5YmRjY2NiYmNkNTAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZGVidWcuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2RlYnVnLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZTAwMWVhY2E0YjNiMjQ0Nzk2YWY3MWFkNDk5MWViMDlmOTAwZGE4YWQ0NjgwNGMyMmIwODFhODYxOTRlNDYxYjE1MTI0NTVlZjIzYTVmYWIxMmUzN2ZkNjM5ZjUwN2YxOTI1NmI4Y2UxMDUzZmRjZDg3MDllMjJhZmY2M2FhZjAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2luZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNzQ3NjY1YTcwYmNmNGZmZmVmMDYzMDc3OWIzYWQzZjJhNTZiODAzMjY2NmE1MTMwN2I5ZWVhOGRjNDQ5MmVkZTdhMDc0NDc1Nzc4ODliYTRkZWQzOTgwOTM2ZDg5MDRmMDUwZTg0NzBmMTNhZTJiYjUxOWY4ZjljZjljNjJiNTkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbGliLWNoYWluU3RvcmFnZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbGliLWNoYWluU3RvcmFnZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjIyMDljZjM3MTU2MGUwZWVlMjZmYTE5ZDFkZTc1OGY0Y2IyMGZmYmFmNWFlNGFkNTAzYjEzMmRkNGU1YWI5MDc4OWYwMzQzMTllNjkxOTdlZGVmMDNlOGRiZWYzZWRiOTgyYjlhMjYxYTMyN2UzMTQ4NjM5OTg0ZDhiOGZmNGFmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21ldGhvZC10b29scy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWV0aG9kLXRvb2xzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNWIwZWZmMzljOTM3MDAxZTkwOWE3YjZhYTVmYTY5ZjcxYzZjZmY4ZDI4NGU2NDIwNDM2NzM1ZjQ5OTU1M2ZlN2YxNjNkMWU3ZGU2MzYxMzhiNmU2MDcyY2YzNWY1ZjA3MGVmZGQ2YjFkZWMyNGMxMjE4ZTU5MWM4NGFmYzFlYjQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZUd1YXJkcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZUd1YXJkcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjQzYTlkMTQ4MDE2OGQ1MTQwMzcyYWNiMWYxNjdjM2Y4OTZhMzEyOGQ2ODFlNTZjNjZmOTMzZWVlMzkyNDY1YmM4MWJjMGQ0YTAwYWUzYWQwYjk1ZGQ0MWFjNDAzOThkNTRmODFlYjY2YWM1NmU3ODNlZTBhODVhOGY4ZjAzYjc4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3VwZ3JhZGUtYXBpLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy91cGdyYWRlLWFwaS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjIwMWViMzNkNzI0ZTE3ZjBhMGJiNGY3N2FmMTczMzJhZTVlNmI5YzhhZWY4ODcyZTJhM2RmMWFiZWVkMjA1ODQ4MjIxOTJlMTZkOWM0N2JkMDhmN2ZkYzJkMTU1MDc2ZGMzNWFjMDQ4MzA2MDkxNGZlNmEwODAyYWFjNGVkNGMyIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3V0aWxzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy91dGlscy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjdiMTE0YmJlM2E0OWIzOWQ4ZjVkNDZmYjYwNTVlMzljMWFkMDEyOThiNzRkYjg0YzM5ZmQxOTAwZWNjNDk1ZTk1NjhiMGE0OTA4Njg0NjA1YWIwZmQ5ZjgyYjk0N2U3ZjMxNDFhODY5OTViNDZlNmUyOWZiMzUwODgwMjQ0MWJiIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAYWdvcmljL25vdGlmaWVyLXYwLjYuMiI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy9ub3RpZmllciIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjYuMiIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjYuMiIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL2Fzc2VydCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2Fzc2VydC12MC42LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9hc3NlcnQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9pbnRlcm5hbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVybmFsLXYwLjMuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvaW50ZXJuYWwvc3JjL2xpYi1jaGFpblN0b3JhZ2UuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9saWItY2hhaW5TdG9yYWdlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvaW50ZXJuYWwvc3JjL3VwZ3JhZGUtYXBpLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvdXBncmFkZS1hcGkuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9ub3RpZmllciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvbm90aWZpZXIvZXhwb3J0ZWQuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9ub3RpZmllci12MC42LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2V4cG9ydGVkLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvbm90aWZpZXIvc3Vic2NyaWJlLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbm90aWZpZXItdjAuNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zdWJzY3JpYmUuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9ub3RpZmllci90b29scy90ZXN0U3VwcG9ydHMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9ub3RpZmllci12MC42LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3Rvb2xzL3Rlc3RTdXBwb3J0cy5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3ZhdC1kYXRhIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvdmF0LWRhdGEtdjAuNS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZmFyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Zhci12MC4yLjIyIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYwLjguOSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGF0dGVybnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGF0dGVybnMtdjAuMi42IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXR0ZXJucy9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGF0dGVybnMtdjAuMi42IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi42MCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9zaGltLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvYXN5bmNJdGVyYWJsZUFkYXB0b3IuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZTQxNTRiNGFhZmI4MWM1MmI2ZTFlZDIyNTkwMWNkYmZhYzY1YjRkZThiM2NkZDlmNzUyNjYzODBkZjY5NjViZTNjMjkxZDhmZTlmNGY4NTkxODA4MWZkZTg0NmEzMmUwZmU1MzVkM2JhNmJmOTAxNTg3NWZkMzZhZGI3OTBhYzkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2luZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZWMyZjhhMjg1NjYwM2FiYzkzMmMwM2NjNjQ4ZTIxNjI1Y2IxZmI5YjJkMDY2MTcyZjU5YjlhZDc4NjYyNGI1NTUyNDBlMzJiMzMzMWUxYjcyOThjOWRmMzM2MDNkMDI0ZTJjZTY1NjliNzllNTBhMTBhZTJhYzQ3OGViMWI4ZWMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbm90aWZpZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL25vdGlmaWVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNzkwOGI2YWUwMGMxMTBjYTNlZmU1NjYxNWQ5NmM2NjA2MjEwN2U5MjYxYmY1YTY1YjUxMzhkNDY3MTMyMmY2MTNjN2E1ZTkyZmZkZmJmOTc4NTRmNzY0MTk3Y2M4ZTBjMWQwZTI4ZGI0YjM3NTAxYzk5YzYwM2UxMDcyMGY4NjAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcHVibGlzaC1raXQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3B1Ymxpc2gta2l0LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOWIwODM3MDRmOTliNjAyNjIwMGFlOTkyYmFhMjI2MTJhMWVjMTVlYmVjNGJmODMxYjU3NjgyOTVkNDA3YjM0MzQyNTY5ZmYyOTk2Y2YzZTEwYmI4OWJmMGUxYjk1Yjc2ZDc5ZThiZTM4OTk1MmZmYjc4ZmE2NGNlMWY2MzI0OWIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3RvcmVkLW5vdGlmaWVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdG9yZWQtbm90aWZpZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhNzY0OWVhMjI5YTU0ODU0MGU5YmI0YTU0N2NkMTg0NWI0MTgxNTQyODY1MmM5NzVjMGE5OTZmMWZmNjg3OGZlOTA0Y2M2ODM3OWUwYzFjOTlmNGIzY2RiMjYwNjJiMTNmOGE5MWFjM2VmNjIwNTEzYzMxN2RkYmYyM2ZkN2E3MyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zdG9yZXN1Yi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3RvcmVzdWIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5MGE0MGQ2ZGMyNjliMzAyNDM2NGYyOTQ5YTgxYTExNTc5NDVjOGNmOGQ1MGE3MzBlNTliNjIzZmUwMzFlNTI1NzcwZmQyOWEzNmM0NDM1OGIyOTFhYmZkNGQyNmE4ZTEwY2I4MmMyZjNlOTZmZjBkYjk2MmY2MTdlNTg0MmZlYSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zdWJzY3JpYmUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N1YnNjcmliZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImNkMWMzNzdhNThjZTU2NzRiMzAxODM3MTBjODAyNjU4M2ZmMjk0ZWU4NmMwNGJkNzNmMGQ2MWM0Y2UxMzE3ZmYxZTg3YjA3MTlhYzJhOTIxMjkzYjA3MzI4ZGJkYzU4ZTM1ZjcxYjA5NzMzMDA5ZmNjMDIwZDViY2RjNDlhNTJjIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N1YnNjcmliZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N1YnNjcmliZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkOWYxMjFkMmExYTIxZjI5MTBmYzAzMzE2ODhiODE0ZTZiZmE0MWI3ZDhmZmU1ZmFkYzY0MzAwY2Y5ODc0MjllODFkNzUzNTIzMTdmOWU3OWYxYTM1ZDQ5ZjNjMTNhYjg0ZWJmMjU4OTI3ODdlYjE0ODUxYTVhYzlkNDk2ODYxYyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90b3BpYy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdG9waWMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5YWJlYzVlOTdhOTk4YjU4YzEwNWZiMWQ1OGVjMmNjOGJjMjMyMzAxMWY5Njg5NmE2NmMyNmIyMWNmMGIxMDU5NmMxNWJiODlkMDk1NWU3ZTVlYzdjM2VkZjUxOGVjMjlkNzhjY2EyYjBlMGQ3OTM5MzM4NDg0ZmU3NDE5YmQ5MCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy1hbWJpZW50LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy1hbWJpZW50LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZmUxN2I5ZGI2NzNjNGExM2YzZTdlZjlhMGNiY2VmMTc5MjdmMTZlMTkzYzQzODA5YzhjNmJiYWY0YjU1ZTZkOTAxNjBkMzIyZmM3NTllOTY1MDQ0NWU5Mzc3MjNiMTRlYWRhMjlkYjYxNzNkMmJkZDVhZmI5YTM1YzM5ZjQ2M2UiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvc3RvcmUtdjAuOS4yIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL3N0b3JlIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvc3RvcmUtdjAuOS4yIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvc3RvcmUtdjAuOS4yIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvYXNzZXJ0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvYXNzZXJ0LXYwLjYuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2Fzc2VydC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3N0b3JlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3RvcmUtdjAuOS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXhvIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V4by12MC4yLjYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V4by9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXhvLXYwLjIuNiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V4by90b29scy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9leG8tdjAuMi42IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi90b29scy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9tYXJzaGFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL21hcnNoYWwtdjAuOC45IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXNzLXN0eWxlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS43IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXNzLXN0eWxlL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXNzLXN0eWxlLXYwLjEuNyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Bhc3Mtc3R5bGUvdG9vbHMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGFzcy1zdHlsZS12MC4xLjciLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3Rvb2xzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3BhdHRlcm5zIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3BhdHRlcm5zLXYwLjIuNiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGF0dGVybnMvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3BhdHRlcm5zLXYwLjIuNiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIi4vZXhwb3J0ZWQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiZXhwb3J0ZWQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIxYWE0NjBiYmE3NjQ0NDNkNWNhZmIzM2Y1MjI3OTNiYmUyOWU4ZDI0ZjJjNWU3N2M3YjZhMWVjMDQxNTBhZjgwMGM3YmYxYzA1ZmU1MDQ1MGRmZDI5OGNjZDkyYTc5ODYwMWIxYjQ4YTJmYzQ0YTlmOWJkYmI2OGUwOTBjZWEyNCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4MWZmYjQ2OGExNDRiZTBlYmZjZTlhZTczMjc2NjRhYjZjZThiNzNmMmYxYTY2NjM2YWEwY2Q3ZDEwMTdkZWQ5Zjc0ZGUyMWRjODkzNmUwMjE2NmRhY2ZhOTY1YmE3Y2M1ODljOTM4YTVhM2UxZTRmZTQ5MDI2OTk1YzNiZDAwOCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9sZWdhY3kvbGVnYWN5TWFwLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9sZWdhY3kvbGVnYWN5TWFwLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZDE4Y2Q4ZDZjYTZiOGIwYmI3ZTk0ZTFkMjQ5ZmYwYThkYTMzMTQxMTA0Y2RmNGUwYTdmYjNmN2FlNDkyMDA2NTdkMTQ1ZmVkMjk5YzFhODkyMmViZWJhYmUzMzdmYzY1MDljNWRhZjRkZmU2ZDNjZmMyMzRlNGNkNWQ0MDZjMGQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbGVnYWN5L2xlZ2FjeVdlYWtNYXAuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2xlZ2FjeS9sZWdhY3lXZWFrTWFwLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYWJjMmNiYmQxMzI1NDNiYzZjNjFiMmNkY2E5YjcyZGY2MjI5NjdkYmIxMTJhOGY2ZGY4ZGU3ZjE1YmMyYTMxY2ZkNGQwODdiMmM2OTNjZDUyMDEyMzJmMmJlZjAzMTZjYTRhNTQ5NmU0YjI5ZGMwNTBkOGY4N2M3MjUyZTY2MTQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3RvcmVzL3NjYWxhck1hcFN0b3JlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdG9yZXMvc2NhbGFyTWFwU3RvcmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJjMjliYzAwYTYxNDcwOWZjOGJkYWRiOWNiZTRiMjcxMWU5M2E5MjJmMThiM2Y2ZDA0YjRjMjYyZWM1ZDdmN2ZjYTU0MDQ1MmNlNDc1ODE1Njg0OWFlZDc4NTQ2MDM0NjAyZjk1ODRkZjI1MjQ0MGY0MTcyMTI1NmM2ODRjNTZiNCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zdG9yZXMvc2NhbGFyU2V0U3RvcmUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N0b3Jlcy9zY2FsYXJTZXRTdG9yZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjQzMjBkN2Q5YjgyNjA1YTJkMWNlOTYzNTNkOTNjZWUzYjk4OGVhYzg3ZDQ4ZjRjNTQxNDk4ZDE0NzgwZjA5MzJmNTBlNTVhMDAyYWEwODgwNTgyODRjZjQ0ODFhMWEwNmI0YTk1OTdjYzllZGU2N2YwOWJhZTZjOWM2NGVlNGMwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N0b3Jlcy9zY2FsYXJXZWFrTWFwU3RvcmUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N0b3Jlcy9zY2FsYXJXZWFrTWFwU3RvcmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0OGVkNzk0NjhmMmEwZWY5MjJjMjhmMmNkYmZiZjhjNTJiZmRhMDAxMjg5YWM4MWNiYjk2NjYyZTA1M2EyZjkyZDE0M2ViYmYzOGM5NTk3MDE3OGM1OGE2NzFlMjE5MzhlN2I2YzdmZTQxZGVkNjMzYzFkOTgxNThkZTEwOGQwMiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zdG9yZXMvc2NhbGFyV2Vha1NldFN0b3JlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdG9yZXMvc2NhbGFyV2Vha1NldFN0b3JlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiODY2MjYzMmI4YzRjNjFiMTUxMDE3OWJmMmM3MjIxNmJiYWE3NzczNWYxMTIzY2M0OTUxNmY5NWQ4ZGUyYWMxMWY4MWJlNzNiZmViNmUxMDllNWVkOGFkMzc0YThlYzc3NGVjYzJkYWY0NDQ5MmFmMjJiYjgyYjI5ZjMxNWQ3ZTciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3RvcmVzL3N0b3JlLXV0aWxzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdG9yZXMvc3RvcmUtdXRpbHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIwZmM1ZjNkMWJlY2ZkMzY1YTUzYWUwZDYyY2M4OTFkZDY4YTVhMDQ3ODViOGQ5YzMxMzlhZGQ5NDMyYzBhMzFkMDQyMDk3NGI0ZDAyODQzZDg5Y2EyYmY5NDk1ZTBmOTEyNjM2YTRkMzc5ZDI3ODg2NDIyNjYzZGFhMWFlMDA3MyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkYTY0ZWVjY2ExYzRjOWVhNjUwZjYzNWNlOWU0Y2U4MGMyYWMwM2E4MmM3MTc0NzQ4OGI4ZTFkYjJjZmE1Mjk5ZGIxNzYxYjRmN2YxMjA3YTVkMGM1NTA2ZDY4Y2I4ZjNiYTFjNWM3MjNkYjlmYzFlODdhY2M3Y2JlMTcxMmY4ZCIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGFnb3JpYy90aW1lLXYwLjMuMiI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy90aW1lIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvdGltZS12MC4zLjIiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy90aW1lLXYwLjMuMiIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL2Fzc2VydCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2Fzc2VydC12MC42LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9hc3NlcnQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy90aW1lIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvdGltZS12MC4zLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL25hdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9uYXQtdjQuMS4zMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL25hdC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbmF0LXY0LjEuMzEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXR0ZXJucyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXR0ZXJucy12MC4yLjYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3BhdHRlcm5zL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXR0ZXJucy12MC4yLjYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICIuL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNjVkZmQ0ZWFiNzJhNmM4YTg3ZWI3ODYzZTdkMTZmZGExMDc4ZDA4OGU0OGVkNTUyYmJlN2NhYmM1Y2VkOThjOTY1YjgyMGRmNDc4NzI4NTk3NDVhZjczNDg0ZDFkOGIyMTUzNWM2ZmYxZmM0YjVlNzU0ZTY2MTBkM2QxZjM3NDYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdGltZU1hdGguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3RpbWVNYXRoLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNDIzMzYzN2UxN2VlNzFhYjhiYjM0NzcxMDUxYzFmOGZlMjAzNmYxZDEyMTk3NWY2ZmY1YmQ1OWYyZDQ1NjNiOWJlZWMwNDBlODMzNjBmYzc5ODQwYzI3OWExNjdjMDY2Yjg3MWEyMjczNWM0MzQyYWM4MDAyNzQ3OTY5YmRkOGUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZUd1YXJkcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZUd1YXJkcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImUxMTIzMWM3MDEyYjRlMjU3Mjc0MWUwZThiZWU4ZDlhNjk2OGE4ZTg5MTI4MThmNjI2YTEwZDBkZmIyMDNjYzE1NGM3MjhjYmZkZThhMzQ4NzBhNjIzZjZlMDg2MmMzOTI0ZDRmNmUxMzYwOTVmYWViMzE5MDA2NzA5MmFhNjhkIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMiI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy92YXQtZGF0YSIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMiIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMiIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL2Fzc2VydCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2Fzc2VydC12MC42LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9hc3NlcnQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9pbnRlcm5hbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVybmFsLXYwLjMuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3RvcmUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zdG9yZS12MC45LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3N3aW5nc2V0LWxpdmVzbG90cyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N3aW5nc2V0LWxpdmVzbG90cy12MC4xMC4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy92YXQtZGF0YSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2V4by11dGlscy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZXhvLXV0aWxzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYmM1YzQ1NTY2NWE2ZmY0NTVlYWNkMTE2YjI1MDc4NDRiMTk1MmE1YmNlOTU5Y2NhMGE2ZWYwYzRlYTM5MzkxOTAyMTcyZjhjYzMwYzNiODA1Y2M3MmFiMWNiYzU4MTU1YzAzMDFjOWI5MzFkMmNjM2FkMzEzNzQwOWJlMjU2MzUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2luZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYWFiNjlmMDY2MmEyNTYwNGY2OTYzMjI4NjZhNTA2OTAzNjIxNTRkNjZjNGU0ZjkxMTdlZmZhMGViNTA0ZWRlY2RmOTEwNDlkZWNmOGFiZTU5N2JhNjYyMzY1OGVkN2MyMmY4MjNhZDdhOTdlOTg3MDI5YTQzZTdhNTE0YTRiNGEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdmF0LWRhdGEtYmluZGluZ3MuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3ZhdC1kYXRhLWJpbmRpbmdzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNmJhNGMwZDc2NjUxMDk3OWVkMTE1YWU3YmJiYjU2MDJlMmZkMmNjMmEyZWE0YjUwMDM0ODkxNTliYjA1NzM2ZjE1NGU0MTMwYjVmMTlhMGY5YjUyNTU4YTJkZjc4OTA5MzgyZDc1ZmQ3ZWU1ZTc0MjIyNzE5NTk5MzFiYzNhODYiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvdmF0cy12MC4xNS4xIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL3ZhdHMiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy92YXRzLXYwLjE1LjEiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy92YXRzLXYwLjE1LjEiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9hc3NlcnQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9hc3NlcnQtdjAuNi4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvYXNzZXJ0LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvZXJ0cCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2VydHAtdjAuMTYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvZ292ZXJuYW5jZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2dvdmVybmFuY2UtdjAuMTAuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvaW50ZXJuYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL25ldHdvcmsiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9uZXR3b3JrLXYwLjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvbmV0d29yay9leHBvcnRlZC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL25ldHdvcmstdjAuMS4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9leHBvcnRlZC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL25vdGlmaWVyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbm90aWZpZXItdjAuNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9ub3RpZmllci9leHBvcnRlZC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZXhwb3J0ZWQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9ub3RpZmllci9zdWJzY3JpYmUuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9ub3RpZmllci12MC42LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3N1YnNjcmliZS5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL25vdGlmaWVyL3Rvb2xzL3Rlc3RTdXBwb3J0cy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vdG9vbHMvdGVzdFN1cHBvcnRzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3RvcmUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zdG9yZS12MC45LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3N3aW5nc2V0LXZhdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N3aW5nc2V0LXZhdC12MC4zMi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy90aW1lIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvdGltZS12MC4zLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvdmF0LWRhdGEiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy92YXQtZGF0YS12MC41LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3ZhdHMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy92YXRzLXYwLjE1LjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvem9lIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvem9lLXYwLjI2LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy96b2VTZXJ2aWNlL3pvZS5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3pvbmUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy96b25lLXYwLjIuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvem9uZS9kdXJhYmxlLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvem9uZS12MC4yLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2R1cmFibGUuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy96b25lL2hlYXAuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy96b25lLXYwLjIuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaGVhcC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3pvbmUvdmlydHVhbC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3pvbmUtdjAuMi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi92aXJ0dWFsLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2ZhciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9mYXItdjAuMi4yMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2ltcG9ydC1idW5kbGUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vaW1wb3J0LWJ1bmRsZS12MC40LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9pbXBvcnQtYnVuZGxlL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9pbXBvcnQtYnVuZGxlLXYwLjQuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2ltcG9ydC1idW5kbGUvc291cmNlLW1hcC1ub2RlLXBvd2Vycy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9pbXBvcnQtYnVuZGxlLXYwLjQuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc291cmNlLW1hcC1ub2RlLXBvd2Vycy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9pbXBvcnQtYnVuZGxlL3NvdXJjZS1tYXAtbm9kZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9pbXBvcnQtYnVuZGxlLXYwLjQuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc291cmNlLW1hcC1ub2RlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL21hcnNoYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbWFyc2hhbC12MC44LjkiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL25hdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9uYXQtdjQuMS4zMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL25hdC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbmF0LXY0LjEuMzEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXR0ZXJucyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXR0ZXJucy12MC4yLjYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3BhdHRlcm5zL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXR0ZXJucy12MC4yLjYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjYwIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi42MCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3NoaW0uanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi42MCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJpbXBvcnQtbWV0YS1yZXNvbHZlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogImltcG9ydC1tZXRhLXJlc29sdmUtdjIuMi4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJqZXNzaWUuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiamVzc2llLmpzLXYwLjMuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL21haW4uanMiCiAgICAgICAgfSwKICAgICAgICAiamVzc2llLmpzL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJqZXNzaWUuanMtdjAuMy4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdmF0LXpvZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdmF0LXpvZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjM3MWNhYzljYTk3NzhmYmQzYzQ3Y2E2N2E2ODg0Y2NlNjgxMjU0ZjdhNzcwNzc3MmMwZWE0Zjk5MmI0YzE2ZDY5MTVhZWY5NjA4MGU2OTg5YmFkY2IyOWNiZTNlNzNhOTRlOTcyMWE3M2E5NmJmMmIzYWNiYzVjMzc0OGNmMzYzIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAYWdvcmljL3pvZS12MC4yNi4yIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL3pvZSIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL3pvZS12MC4yNi4yIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvem9lLXYwLjI2LjIiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9hc3NlcnQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9hc3NlcnQtdjAuNi4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvYXNzZXJ0LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvZXJ0cCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2VydHAtdjAuMTYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvZXJ0cC9leHBvcnRlZC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2VydHAtdjAuMTYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZXhwb3J0ZWQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9pbnRlcm5hbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVybmFsLXYwLjMuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvaW50ZXJuYWwvc3JjL3VwZ3JhZGUtYXBpLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvdXBncmFkZS1hcGkuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9ub3RpZmllciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvbm90aWZpZXIvZXhwb3J0ZWQuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9ub3RpZmllci12MC42LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2V4cG9ydGVkLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvbm90aWZpZXIvc3Vic2NyaWJlLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbm90aWZpZXItdjAuNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zdWJzY3JpYmUuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9ub3RpZmllci90b29scy90ZXN0U3VwcG9ydHMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9ub3RpZmllci12MC42LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3Rvb2xzL3Rlc3RTdXBwb3J0cy5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3N0b3JlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3RvcmUtdjAuOS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zdG9yZS9leHBvcnRlZC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N0b3JlLXYwLjkuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZXhwb3J0ZWQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zd2luZ3NldC1saXZlc2xvdHMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zd2luZ3NldC1saXZlc2xvdHMtdjAuMTAuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3dpbmdzZXQtdmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3dpbmdzZXQtdmF0LXYwLjMyLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3RpbWUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy90aW1lLXYwLjMuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy92YXQtZGF0YSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvem9lIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvem9lLXYwLjI2LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy96b2VTZXJ2aWNlL3pvZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9idW5kbGUtc291cmNlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2J1bmRsZS1zb3VyY2UtdjIuOC4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYnVuZGxlLXNvdXJjZS9jYWNoZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9idW5kbGUtc291cmNlLXYyLjguMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vY2FjaGUuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYnVuZGxlLXNvdXJjZS9leHBvcnRlZC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9idW5kbGUtc291cmNlLXYyLjguMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZXhwb3J0ZWQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYnVuZGxlLXNvdXJjZS9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vYnVuZGxlLXNvdXJjZS12Mi44LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jYXB0cCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jYXB0cC12My4xLjUiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTcuNiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZmFyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Zhci12MC4yLjIyIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vaW1wb3J0LWJ1bmRsZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9pbXBvcnQtYnVuZGxlLXYwLjQuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2ltcG9ydC1idW5kbGUvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2ltcG9ydC1idW5kbGUtdjAuNC4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vaW1wb3J0LWJ1bmRsZS9zb3VyY2UtbWFwLW5vZGUtcG93ZXJzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2ltcG9ydC1idW5kbGUtdjAuNC4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zb3VyY2UtbWFwLW5vZGUtcG93ZXJzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2ltcG9ydC1idW5kbGUvc291cmNlLW1hcC1ub2RlLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2ltcG9ydC1idW5kbGUtdjAuNC4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zb3VyY2UtbWFwLW5vZGUuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYwLjguOSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL25hdC12NC4xLjMxIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbmF0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9uYXQtdjQuMS4zMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3BhdHRlcm5zIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3BhdHRlcm5zLXYwLjIuNiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGF0dGVybnMvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3BhdHRlcm5zLXYwLjIuNiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjYwIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvc2hpbS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjYwIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgInlhcmdzLXBhcnNlciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJ5YXJncy1wYXJzZXItdjIxLjEuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vYnVpbGQvbGliL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgInlhcmdzLXBhcnNlci9icm93c2VyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInlhcmdzLXBhcnNlci12MjEuMS4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9icm93c2VyLmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NsZWFuUHJvcG9zYWwuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NsZWFuUHJvcG9zYWwuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4ZTljMGQ2NDM5MGQ4NmZmZjMwZTZiMDRjMDcwN2I5OGNiYTUzNzZlNDIyZTZkNThhODIxNjY2MjVlNzBkM2U3NGZmZmZiYmM4MTY4MmM5MjcxMmFiNDY3MzI1OWZjOWIyM2JmZjk3ZWJlY2NkZDQzNzU3MTExMmMyM2RlMmRjNiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb250cmFjdEZhY2V0L29mZmVyU2FmZXR5LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb250cmFjdEZhY2V0L29mZmVyU2FmZXR5LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNTJhMmZlZTQ2Njc2NzU3NTNhYjg2ZmI4NmVlZTc3N2FjYTI3NGUwMDczMWRlYmYyN2Y2N2Y2Mzc4MDVlZjY1NjE2OWUwNjJkOWJmMTk4MGVkMTJkYzdjODI1YjljYTg2YzYyZThjYzkyZWI0MmQ3NWFjMTkwOTNmOGUyYTUzZTQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW5zdGFuY2VSZWNvcmRTdG9yYWdlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbnN0YW5jZVJlY29yZFN0b3JhZ2UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1ZjZhYzY5OGQ5NDE5M2RhODFmYTFiZDdmNzJmNDI3Yjg1ZWViZWQ0MTFjNjRiYzRmYTg2NjE5YTFhZjQ0NDY4ZDM1ZTU3M2IxY2VlMTA0ZGU3ZWNiNWEyNjVhZDZiMjIzZTExYzY4OWYzZmQ2MjI5YTNkYzZhMWEyNzRjNDI2YSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbnRlcm5hbC10eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW50ZXJuYWwtdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJjMGVmNTA4ZDEzOTRkMmMzMGI3Y2RiZDYxNzA2Yjk4ZmYyYjI2ZDVkNWExMzA1NjczYzkwZmI1MTYxNTdkNTIxYzI2OWE0MGM5NmI4NjQ4M2YzYjZjY2IzNjlhNGVhMGFlY2VhNGRjMTQ0ZWZiMTJkYjY0Zjc3YjhiY2Q2MThlZCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pc3N1ZXJSZWNvcmQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2lzc3VlclJlY29yZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjg0NmU2MzMzZmMwZGNkZWFmNDk2NDIxYWQ3MTdjYTc2ZWQ5MmE0YzA5MWUzMGJjNDI2MmEyYzFjZDYwMTg1N2Q4MGViYjI4NzRiNWMyMDk4ZDkwNGZhZWU5MmM0OGJjZmY0MjJjNWUwNDBkY2ZkNDBmNmZmOGNhNWYxZTI5ODQ5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2lzc3VlclN0b3JhZ2UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2lzc3VlclN0b3JhZ2UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIwYTE3N2Q3ZWJkMTIzMzA4NTBkMTIxOWM5MWVhMGI2MTM4ODhkZjM0N2JkODQyZDI0NzMwOTJjZTNjMjRlZjk3NjVhNTYwMzhmNGU2ZWQ5Y2QzMTIwMDYzYmZhNTE0NTNkZjBhNzZiNjIyOTlmN2QyZTE0MTcwYmE0MjY4MDBkMyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYWtlSGFuZGxlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYWtlSGFuZGxlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMTRjYWU4NWMyZDQzN2Q0YWQ0ZTIyZWY1NDA4YmUyZjY1YWQ0ODE2OGE5OWNhYzg4ZDgzNGFhOTAyZWY0MmU4Y2RlMzZiOWM0ZWI1YWU1ZTk1YjY0NjU4NTJmNzRmZDEzOTYwYTRmMWYxZjk5NmRlNzI5YzM0MmZkMDYwODlkNjkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvb2JqQXJyYXlDb252ZXJzaW9uLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9vYmpBcnJheUNvbnZlcnNpb24uanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkY2Y5ODRjOWFhYmE0YjZlYzYwNGE3NmM0MDFmMGQ4MWIzZTU1ZTFiNGMxNjkyNDE5ZmQ5YjllMDg3NDM2ZjZkNmU3YjliMzhhODhkYjYzOWZiZTdlMWExYmY1NjI2NjM3OWRlZTQ3MTUxZWYzMGViNmNhYjA0YzlmNTk5NmU1NCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlR3VhcmRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlR3VhcmRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMjMyNThhNTQ0NmNhMmE2ZmI4ZjlhY2RkOTQ1ODljNDM2NDg2ZTY4ZjQ5NmEwMmU2N2Y0YTE2NjZhNjQ5MmRjNmY4YjgyZDRjMGMyOWUxZjhkY2Q4ZDQ5N2FmZTY4ODJhNDY5M2I0YTBiMzhmOTJjNmFlNzQ3MTYzMjJhMWIyNGEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOWJjNzI5NmRkYWE0ZjdmNzQ5ZWJhYzNhMDY2ZmMxNTU0NDlhZjA3MGQwZjI0YTZhMTgxNmJlMTNhZDMyNDEzMWJkMjllMTE3MzVmZjkzYzliZTUxZTkzNzkwNjRiZjJlYjVhZjcxYTRhZWNjYmRlMWZkNDU2NGU0ZWFlNzAyOTMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvem9lU2VydmljZS9jcmVhdGVaQ0ZWYXQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3pvZVNlcnZpY2UvY3JlYXRlWkNGVmF0LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNDNjZTY3YTY1ZTBkOTJiM2U3ZTAzNGU5ZWFiYjExNzliNTc5NWRlZmY0NTA4OGVjZTliYjhhNzg2YjU0OTgyMzU4ZTk2ZjQxMmE0ZDU2ODY5ZGMwZDM2ODU0YmZjZWQ1NzA1MmZjMTE4YjAzOTllZThjM2ExMGVkZjliMTRkNTYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvem9lU2VydmljZS9lc2Nyb3dTdG9yYWdlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy96b2VTZXJ2aWNlL2VzY3Jvd1N0b3JhZ2UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkY2Q2ODFkNGUwM2IzODc0NDQzNjJlMDFlNDQzYjY0MDlhM2VmNjM2OTM3ODg4ZmNmYzcwOTVlMTA1M2VhMjE5ZDhhODQ2Y2UzNjg3YzIyMmRlMGYwMzVhZGFiZTg5NTVkYWI0M2Q0ZTUzN2Y5ODM1N2NmODQzN2Y3YjE5ZDQ3ZSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy96b2VTZXJ2aWNlL2ZlZU1pbnQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3pvZVNlcnZpY2UvZmVlTWludC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjZjNjk4YzA1NTc4Yzc5N2FjMDA1ZWQ4OGExNmM0Njk5YzkxNTA2YjIwYmQ1NGM4MmIwMzRlZmEzN2JmZDcxOGVlNzZmY2Q5MzBhMWM5MjdhMDY2MDRlNWIyZTRmMjQ1NzdjYzY5NzNhZmZmNzAwODdjNWI4ODNkZWU1ZWFkODI4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3pvZVNlcnZpY2UvaW5zdGFsbGF0aW9uU3RvcmFnZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvem9lU2VydmljZS9pbnN0YWxsYXRpb25TdG9yYWdlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMGMxNjU5YjYwZDExMzNmNzY0NTAzZjE5ZDA3MjQyZTMyOTljNDc5ODU0NDNhNzM5NzhlOWI4Y2JjZWI0OGUwZjFjZjFkZjkwZDFkN2MzZDg4ZTkyMWI1NTM1MzYxZTMxNmFjOTEzN2Y5ZTdmODI2Njg0ZWM3YWFkNTQ4YmI2YjUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvem9lU2VydmljZS9pbnN0YW5jZUFkbWluU3RvcmFnZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvem9lU2VydmljZS9pbnN0YW5jZUFkbWluU3RvcmFnZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjY1NWE5YWE1YjU0MGZiZmY3NDMzMTJlNTIyYjc3MzgyMjFhOTgwYjdkNmUzMDM5NjY3NDg3Yzc2YmNlMWIzZGFlNDYwNmM1YjYyMWViMmUyZjkyMzQ0ZTZkZTg5NWQ1M2YyYTc0Y2E0YmRlMzQ2YjVhMGU1ZGE3N2UyODJkZTMwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3pvZVNlcnZpY2UvaW50ZXJuYWwtdHlwZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3pvZVNlcnZpY2UvaW50ZXJuYWwtdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4MWNjYzllNmY3NTQ4MGRlZDdiNjcwOGU5ZmNmOWFhZjg5ZjU2YzQxYjI1M2VlNmM3YjNiNGI0NmE2MGZlODRhMjBkNWRiMmYyMzU5NjJmZTJiMzNlYzJkNDA5MzU1Mjc0NTE5ZmJjNjA2OWFmODRiZDk5OTBkZWRiZTMwZDAyMCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy96b2VTZXJ2aWNlL2ludml0YXRpb25RdWVyaWVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy96b2VTZXJ2aWNlL2ludml0YXRpb25RdWVyaWVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYzI0ZThhZDJhNjMyYTlkMjc4ZGU3MWE4NmIwODg2ZWY4YTdhMWVhZjAzODdlY2IwN2VlNDI4NzExYjdkYmYwNzY1Yjg1ZjM4M2YwZGM4M2M4OTc5MmJjZTM2YjY1MjU2N2ViNmU1NDA3YmY2YjQwN2FkY2QwMmY4MGI5MjQwNmIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvem9lU2VydmljZS9tYWtlSW52aXRhdGlvbi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvem9lU2VydmljZS9tYWtlSW52aXRhdGlvbi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImE3N2UyNzdiOTg1NGQ1MmY2MzkwNDFlZDU3YjYyMTg5NTcwNmM5Y2E1ZTZhNzUxMDJmYWEwNzJhYTZhMGMxMDNlMTJlNjk2NmFhODMyY2EwZjc3MGRiMjlkNmFmZTRmZmRmYjA2MDM4MzhjY2EzZDkwZmM1ZDdlNGZhOTE0ZTcwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3pvZVNlcnZpY2Uvb2ZmZXIvYnVybkludml0YXRpb24uanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3pvZVNlcnZpY2Uvb2ZmZXIvYnVybkludml0YXRpb24uanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhM2QzM2U5ZTBiMGQ1NzEwYzg5NzY5NjU5OTQ2NjRmYjY4ZDVmNTRjYTRiZThhYTliMGE4MDFkODQxZTU0NThkMGYwMzI3MTBlZjQyOWI4MGQ1MzQxZWEwNTRlYzdhM2M5MjI0ZWYwZThiZTZjYjM5M2Y3ZDRjZjcwNTA4ZDhjMyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy96b2VTZXJ2aWNlL29mZmVyL29mZmVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy96b2VTZXJ2aWNlL29mZmVyL29mZmVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYTcxYjExMzYyZjlkNGVlYjlmYzU4YjNhZjIxNDUxNjQwMjZiNTEzMGU2YmViMzNjZGRlNmU5M2I4NDExMDU3ZDk5YWQ0MDZiMWMyZWIwZTU0NWRiZTRlNGMxMDRmZGEzNzRjODY2MmZiODM2M2M1MjU0MjE5ZjNkNjgzZjFmM2IiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvem9lU2VydmljZS9zdGFydEluc3RhbmNlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy96b2VTZXJ2aWNlL3N0YXJ0SW5zdGFuY2UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmZjBlYjY0NzdjYjU3ZTk5YWUyNWE2ZGQ2ZTA0N2U3M2Q0MmI3MDNjODZhYjRjZTZhMDk5MThkNzhiNjQ2ZDk5NGRkODhmZTBkOGZhZmY5NGJhYTY0MGFiZTBmYTJhNzEyMmMzNTE1YzZkZjRjMmUzNmQyMmE1Y2I2N2Q0ZmIyYyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy96b2VTZXJ2aWNlL3pvZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvem9lU2VydmljZS96b2UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhYTNiOGE4OWQ0NjQ5NTgwODBhN2NiN2VlMDE5NTExZmM1NmYwODUzMjhjNzAzMTEwNmU0ZDA2ZWU0MzkzMGU2Mzc1OGU1N2NmMjYyZjhlZmIzNGViMmNjOGE5N2YxNWU0NWNjODU4YWRhNTM0M2QxMTU2ZjBkZGQ4NGZlMTUwNyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy96b2VTZXJ2aWNlL3pvZVNlYXQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3pvZVNlcnZpY2Uvem9lU2VhdC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjdlNzk5ODRiYzE2N2JhZjI1YmE3OGYyNzE1NjZlZTFmMDczZTBmZTE0NTdkNzU3MmIzODllZjI2ZWYyZmZjM2YzZWEzMjg4ZmEyYTA4ZTMzNjIwY2E2ZjdjODI0YTdlOGY3YTZlMGIwY2Y3M2UxMGQ5YWExN2M0YzExYTEyMThiIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3pvZVNlcnZpY2Uvem9lU3RvcmFnZU1hbmFnZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3pvZVNlcnZpY2Uvem9lU3RvcmFnZU1hbmFnZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmN2Q0MzdmYWI1MTUxNTNlYWQ1OGRiZWI5OTEzMWQxODY5NTA2ZDk5NTYxODJhNWRhMzBmZjZiY2IyY2FkZGQ5MThiMmNmMjg0ZWU0YmZmNGQzOTZiYTBhOGU2YjM1N2YwZDE3ZGFjNGEyOTg2OTNiOTVmZjkyMjcwMDQ3MjExNSIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vZW52LW9wdGlvbnMtdjAuMS40IjogewogICAgICAibmFtZSI6ICJAZW5kby9lbnYtb3B0aW9ucyIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9lbnYtb3B0aW9ucy12MC4xLjQiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vZW52LW9wdGlvbnMtdjAuMS40IiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2Vudi1vcHRpb25zIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vudi1vcHRpb25zLXYwLjEuNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZW52LW9wdGlvbnMvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vudi1vcHRpb25zLXYwLjEuNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2ZTEwNmVlNmFmODkzOTRkMGRkYjNlMmFmYjMyNjdkMzE3MjY3N2EwYzdjYTk2OWQ1YTEyM2ZmMDkwNDJiMjcxNzUxYzNjODU5MDI0MjBkNWU4YjEwOGI3NWZkNzdiZDYzNTU1MGI2NTM4MDVjYTg3OGQ4ODBjNTA1YmZlZmYwMCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lbnYtb3B0aW9ucy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZW52LW9wdGlvbnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmMDFiMzE3ZTkzYjdmNzRhNzEzNzI2NzBlY2I2ZWFjNTc2OGNhNmVmMThmZDE0OGU5ZmEyOTYyYTMzNjlmODY2MGQ2YjJjM2ExZGY0ZmMzMDE3ZGEyYWY4NDc0MjFlNTMyNjVmZDMwYWU3NzZkMDUyYzA3ODcwM2M2Yzc3MDNkZCIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MC4xNy42IjogewogICAgICAibmFtZSI6ICJAZW5kby9ldmVudHVhbC1zZW5kIiwKICAgICAgImxhYmVsIjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTcuNiIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE3LjYiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vZW52LW9wdGlvbnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZW52LW9wdGlvbnMtdjAuMS40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lbnYtb3B0aW9ucy9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZW52LW9wdGlvbnMtdjAuMS40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE3LjYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL0UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL0UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5NzZkYTc4ZDI1NGZmZTlhMGEyZWYyMzJkZjM5ZDc3MTZlYWIwYTIzYzM3NWEwNWU5ZTcwOTAzYzMwZTcxY2JhNGQ5YWI0ZTNiYzk2MDM3N2ZmNjJlNjg2NmYwNWYyMWY0OTM0MWMwNjBkNzI4Mzc2NzYzZTRkMTJkNjEyYjA4OSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9leHBvcnRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9leHBvcnRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOThhODUxYmRiZjJmNGRkMDlhMTNiNTIxMTMwZTI5OWY5ZDE5NTVhZTE5MjkxNjI3Y2QyOGRmNGZiNWQ0ODc4ZWNkZjdjZTJiMjJhNTY3MGI0Mzk3YmY0OTBiODBkODk4MjQ4MWRiNWNlYjIyNGIxMGFmZGVmZTVjNDQ1MDYyNjUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbm8tc2hpbS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbm8tc2hpbS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjVjOGYyODc4ZTVhYTJkOTgyYzQ3MzJjNjM3OTZlYWE3MzY5MWVkODU2Y2VkZmY2ODNlYmNkYTA5MmMyMTE1NjI3ZTE5YzllN2ZhOWY2YTc1YWM5YTg5YTM2MjE2YzQ5NDJhNjBiOTJmNTgyY2Q0N2M2NmRmNjNhYWYxNTE3YzE1IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3RyYWNrLXR1cm5zLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90cmFjay10dXJucy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjllMzk3NjNjOTc1MjY5NzViNWQxYmNlYjM5ODBmZjAyOGRlYWRjMWJiMGIwYWMwNjAxNTU1NWYyNzVmMGY2Y2E0ZTFiZGVlOWFjY2EzZjM3NjhiMTVlYjM5ZTAxMDlkNzljMTVjOGQ1NjQyMDA0YjNiMmI3MzllNTAyMzEyZmFhIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9leG8tdjAuMi42IjogewogICAgICAibmFtZSI6ICJAZW5kby9leG8iLAogICAgICAibGFiZWwiOiAiQGVuZG8vZXhvLXYwLjIuNiIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9leG8tdjAuMi42IiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2Vudi1vcHRpb25zIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vudi1vcHRpb25zLXYwLjEuNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZW52LW9wdGlvbnMvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vudi1vcHRpb25zLXYwLjEuNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V4byI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9leG8tdjAuMi42IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9leG8vcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V4by12MC4yLjYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9leG8vdG9vbHMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXhvLXYwLjIuNiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vdG9vbHMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZmFyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Zhci12MC4yLjIyIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGFzcy1zdHlsZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXNzLXN0eWxlLXYwLjEuNyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGFzcy1zdHlsZS9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGFzcy1zdHlsZS12MC4xLjciLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXNzLXN0eWxlL3Rvb2xzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS43IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi90b29scy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXR0ZXJucyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXR0ZXJucy12MC4yLjYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3BhdHRlcm5zL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXR0ZXJucy12MC4yLjYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICIuL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNzczMThhYzI4ZGFjNmIwZjgzOTA4ZTU1OTdjODZmMTczYWZlYjcxMjUwOWQ1OTc1NTAwMjcyN2NhZmMxODg3MWVlZDUyMDhlMTIxYjczZTE2MDJkZTBkZDM2NjRmODJmOTQzZjZhOGJjMzFmMTI2YzgwZWZiNzA2NGM0OGYwZjkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZXhvLW1ha2Vycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZXhvLW1ha2Vycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImMzZDQxMDg4YmZiNDY4ZWY2YWFhYjhmOGVmMzVkMjllNGNlMDdlYzA1MDMyZmRjYmM0OGQ5YWE3ZTA3NTlkNDk4Y2RiNzhmZDM3Zjk0YmIxNzA3ZDViMzhiYzFmYWQ4NjNjNzM0NGVmNjdkZGE3YWQxZGZlNTEwZTJlMzU1ZjYzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2V4by10b29scy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZXhvLXRvb2xzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNzAxZDM1YzY1ZmQxOGQwYmQwNzQ3YzEyZGEwZjllZDVjNjJiOWQyNmNiYTU4YjhiMzkzNDFiYzcyNDcwZjJhNjU2YmM0NWU5YjkyYTVmODU5NDhjNTkyNDZmNDdjYmY4M2JmY2VjM2FiNmY3MTBhNTQxZTE1NDY1ODE3MmYzOWMiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL2Zhci12MC4yLjIyIjogewogICAgICAibmFtZSI6ICJAZW5kby9mYXIiLAogICAgICAibGFiZWwiOiAiQGVuZG8vZmFyLXYwLjIuMjIiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vZmFyLXYwLjIuMjIiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE3LjYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2ZhciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9mYXItdjAuMi4yMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Bhc3Mtc3R5bGUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGFzcy1zdHlsZS12MC4xLjciLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Bhc3Mtc3R5bGUvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS43IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGFzcy1zdHlsZS90b29scy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXNzLXN0eWxlLXYwLjEuNyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vdG9vbHMuanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2luZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNjg3NDk3ZTNiZjY4YzUyNzlmMzZkNDBlMjhlNGE3NDM5NzE1ODQwMzFmNjQwZWU0OTcyZDkyNTVhMjllOTFiYWQxOGZkNDY5OWM0YmRjYjNiMzY4MmMxOTY1ZDc2YzI5OWQ0N2ZiNTgyZDI2MjhiZmZjNGZjYjdjMGYzZDZmMWMiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL21hcnNoYWwtdjAuOC45IjogewogICAgICAibmFtZSI6ICJAZW5kby9tYXJzaGFsIiwKICAgICAgImxhYmVsIjogIkBlbmRvL21hcnNoYWwtdjAuOC45IiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL21hcnNoYWwtdjAuOC45IiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MC4xNy42IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbm8tc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9tYXJzaGFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL21hcnNoYWwtdjAuOC45IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9uYXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbmF0LXY0LjEuMzEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9uYXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL25hdC12NC4xLjMxIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGFzcy1zdHlsZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXNzLXN0eWxlLXYwLjEuNyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGFzcy1zdHlsZS9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGFzcy1zdHlsZS12MC4xLjciLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXNzLXN0eWxlL3Rvb2xzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS43IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi90b29scy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjYwIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi42MCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3NoaW0uanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi42MCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICIuL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNjdiYjI4OTdhYTcyOGQ3MzNiZmZkNTk5NzQxNDYwMTM2N2ViODA5MDE1YmRiZmZiOTUyOGNlNTA3MTUzMzAzOGQxYTQwMzUzYTAzN2FhN2JjYmM4MGQxNDJiMjAxYjUzOGFkYTAxZGY5Njk5MGNjNzBiZTdhYzY1OTRiZWIyMjUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZGVlcGx5RnVsZmlsbGVkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9kZWVwbHlGdWxmaWxsZWQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5NzFhZGYxM2Y5Nzg0ODZjYTM1NDNlZDc0NjhlZTAzNjE5NmFhMzdhZTRmZGM2M2Y4NjYwODQ4YjA1ZmEyNjQzOTMyYzUzOTk4ZDY3OTY1NzYxYzlkNjE1MzlmYzQ1ZjE1YzE1ZDI3ZGJmZWJjNmQ4YzVkZWYzMTkxYzQ0ZWQ5YSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lbmNvZGVQYXNzYWJsZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZW5jb2RlUGFzc2FibGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0YTAyZWMxYjFiMTNlYzhlMWU3YmQ3NWZmMDdhMDNkZWVlNTE4OGZjZDYyMDFlNGI1YTBjYzRmYTRiNjE1NTNlZDBlMmI4MjRiOTEzMmM1ZWQ5ZmQ3MDkwMGJhYjE2ZmQzYzE0YTQ3MWIwMDNjMjVjZTI2MWFmNDIwMzMxYWU0OSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lbmNvZGVUb0NhcERhdGEuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2VuY29kZVRvQ2FwRGF0YS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImEyZDFmZGQyNTgwYTEzZGRiZTI4MmE2MzI0YzQ0N2VjYzRjYzAzNWY1NjNiMDRjMzYyNTYxNmIyYmIxOGQ4N2ZkMTJiMGY2Mjk3YTFjNTFjMzg3NTdkY2UzZTQ0YmIxMjkzNmIxZTZiYjVkMGY5ZTg4MmQwNGI0YmE5OTY4ODExIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2VuY29kZVRvU21hbGxjYXBzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9lbmNvZGVUb1NtYWxsY2Fwcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjRiZDBiYjM5N2NkZjczMTllZmRmYTBkMTgwMWM5M2RjMTZkYWRkYWQzMDNlMTg4Mzc3MjgwMTA2MTEwYWU5MDAyY2ZjODEwMDAzY2I1ZGRhMmRhMjY3NzZhNjQ2YzRiNjQ4NDVkMTE1Y2RmMjk3ZjA1NzFhNjkwZmU4N2ViYTczIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hcnNoYWwtanVzdGluLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXJzaGFsLWp1c3Rpbi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImY0ZjdiMDIzYzE0NTQ3NDhhMmFlNmU0NzQ2ZGEzMDliNGIyMGI3MzQ4MmFkYzZlNDMyYjYxNzdkY2VkMzQ4ZDgwNTMxNDM3NDUzOWEyMmM3NWZhZWJlNDQ3MTM1MWE2MDIwMzFjMWY3OTNiMDg2MDg2ZWNlMjdkNTNkMWQ2ZGYwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXJzaGFsLXN0cmluZ2lmeS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImZkNjMyZDY0Zjc2MzlkYjI3OTAwNzZmN2Y1OTMxYjQ1Y2NlMmQ4NDM4N2NkYTJjNzhjOTFhNDIyOWY4MTYzNDQxNzZiYjQ3MDA4ZTE5NzcwNGY2YjdkYWFmZDI3NDNkZWI0NWFkMDZjNWJjNmI4OGMwMzhkZjBlNmRmYmEyN2YzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hcnNoYWwuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hcnNoYWwuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4YzJlZjc5MmQ2NzQxZmNhMGI4NzVhNjdlODUwOTcyMWIyZGI0NTM0NjQxZTIwYzc5OGQ4Y2I1MmMxODA1Y2YwOTMwYzU2MGRmNjQ4ZTc2YzQ2MTAzZTM0M2QyZjdjYjU4NmEyYzM1NGQxZWE5YWYxNTUxM2EwM2UyODljNGFiMCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9yYW5rT3JkZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3JhbmtPcmRlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImEzYjNjMWVhODlhZWRhNzA4ZmRkY2JkMWY2Zjc1MWJiM2M0ZWQ0MGU0ODdhOTQ0YTAxZjgyZmFiNTU5ZmIxMzBlMmQxODkwYjgwOWNlZTY2ZTYzZTI5YWJlMDBhNWIwNDQ4YmQ2ODk3NWQyY2UzNTY4NDk2ZWRlYjJiNzNkNGM2IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjk4YTg1MWJkYmYyZjRkZDA5YTEzYjUyMTEzMGUyOTlmOWQxOTU1YWUxOTI5MTYyN2NkMjhkZjRmYjVkNDg3OGVjZGY3Y2UyYjIyYTU2NzBiNDM5N2JmNDkwYjgwZDg5ODI0ODFkYjVjZWIyMjRiMTBhZmRlZmU1YzQ0NTA2MjY1IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9uYXQtdjQuMS4zMSI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vbmF0IiwKICAgICAgImxhYmVsIjogIkBlbmRvL25hdC12NC4xLjMxIiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL25hdC12NC4xLjMxIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL25hdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9uYXQtdjQuMS4zMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL25hdC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbmF0LXY0LjEuMzEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmNjZhMWI0NjU5ZDUyODZjY2ZhNWIwNzdjNmQ5ZWVmMGY1ZWYyODU5NGY4ZTRmYzI0MTBmZmRkNmE4ZjRhYTRhY2I3N2FlMzBjMmM0M2JiMDY3ZGFkMjY4MGQxOTM4OTA4MTNmZDBiMmM5ZWQ0ZDM3NmQwNjAxMjU4MTMyODhhYyIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vcGFzcy1zdHlsZS12MC4xLjciOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL3Bhc3Mtc3R5bGUiLAogICAgICAibGFiZWwiOiAiQGVuZG8vcGFzcy1zdHlsZS12MC4xLjciLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vcGFzcy1zdHlsZS12MC4xLjciLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vcGFzcy1zdHlsZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXNzLXN0eWxlLXYwLjEuNyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGFzcy1zdHlsZS9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGFzcy1zdHlsZS12MC4xLjciLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXNzLXN0eWxlL3Rvb2xzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS43IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi90b29scy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjYwIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi42MCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3NoaW0uanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi42MCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZmFzdC1jaGVjay9hdmEiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGZhc3QtY2hlY2svYXZhLXYxLjEuNSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vbGliL2VzbS9hdmEtZmFzdC1jaGVjay5qcyIKICAgICAgICB9LAogICAgICAgICJAZmFzdC1jaGVjay9hdmEvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBmYXN0LWNoZWNrL2F2YS12MS4xLjUiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICIuL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNWY0NDZiZGQyZGZhODg5NzZiYTJkOWNmMzJmNjEwNDIwMWJmY2FhM2YxNzk2YTBkNDA4MDMxMjJmMWZjZTYyYmQ5NWNmZTZjY2FlODc5YWMzODEwMmJjNGUyYjNiNTU0MDRjZjcyYzc0NTZkYjk3NzEwY2Y2OWZhYjlmNmViYzgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29weUFycmF5LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb3B5QXJyYXkuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzMzhiYjYwZjc4NTRiNGE3YjYxYTFmZDMzYjI0YTdlOWQwNThkYTc5MGU2ZjBhMjk2NDQzZjcwOWYyMDZmZWY3MzE1MGI3ZTJkZWQ3OTljNjM5YjU4ODQ4ZGM0NWE0ZjNmY2FhOTlhMGYxZTcyNWEyYWQ5YTQzZGNlNjkwODM5MSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb3B5UmVjb3JkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb3B5UmVjb3JkLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNTRiODEyNWQwOWQ3M2IwMjVjODM5ZjYyNTFkY2MwNmE1M2RjZDI1YWU5MThjOTczZTM2MDE2MTE2MzA4YTQ4YzE4MzBhZDMzODczZDliOGVlZTA2YWQ1MGI4MjlkNDUwMzZlOGM0ODYwMzYzOWUyYTU0ODJlZTJiYTljZGQzMGYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZXJyb3IuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2Vycm9yLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOTcwYzczYTY2MDAxNjljMmRhZWI0NGUzMTg3NmE2NDQxNmE3ODE5YWIwNDc2ZWU1NGMwYjIzYTQ4MGI0NzNlY2UxODc5OTA4NjkyNDRhYTk0MDVhNjAwZjk4ZjRiNjI0MWU2Mjg2NWNmZTNhZDM5MzFkYmU1YzE4NDRjYjk5MzAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaXRlci1oZWxwZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pdGVyLWhlbHBlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0NzZlYmYzNGU3M2QwNTAzOTM3NDdlOWVhZjM1ZDk3MDdhMTkwNWQ0Y2MxYzUxMGE0ZjE5ZTE1ZmMzNTBlY2IxZGI0OWIyZjUxZjg0ZmFhZWNiOWI2N2FmNTQ4YWNjMmU1MTJmYWIyZmExNjEwYjM2OGRkMWExNzllYTBmMzM0ZSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYWtlLWZhci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFrZS1mYXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiY2Q3MDlkNmVjYTlkMDQwMmIwMzFlZjVjOTM5YTNmOGY2M2FiMjBhMzlhOTY1NTI2OWEyMjFmMGZhNzllYTg0MTU2Zjk5YTZlODE5ODU3YjE3MTY4ODYzODlhNWQ3YzM4ZWE2MzkyZTQ0OWRiMDhlYTY1MzgwZDVkZGE0OWQ0MyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYWtlVGFnZ2VkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYWtlVGFnZ2VkLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMmQwZTRiYzZlNDdlM2Y2NDc5NDZlMWE0YjlhMGNlYTY0N2MzNTMwN2U5NTUzZTU4ZjNjMTMyMTYxODM2YjlkM2I4YzdlNzAxYjNlNjg2MDcxYjYwMWY0YjBiODAyMzMyNmY5YmE0ODdhZWM4MDI1MmM5NWNhYWQ4ZmQ5OTYxNDAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGFzc1N0eWxlLWhlbHBlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNDk1YWVkODc0YjQ5NTc2NDhmMGU1NWM4Yzc1OTJkYzdlMWI2NTMwNzllMjU4NjU5NWJkY2Y4OTM3ZjcyMmMyYmU4NjdhZGNhMTYzZDA0MDQzMjUxMDY2MTMwZTAyZGRjOGNiNzY2M2NmOGQ4NzY0YjEwYmY2YTI2YTk2MjRmMTMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGFzc1N0eWxlT2YuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3Bhc3NTdHlsZU9mLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNTU2YzhjMWFiZGQxZjQ4NjJmMWFkOTc2MjYwOTI4ZGFmZmY4ZjA4NTVhYzZmZGUyNjUyODAzYTMzNWE3ZmQzOTgxODI0NzBiNjcxMmUyOGVlYzM5ZjA4ZmJlMWIwMGI3ODg2NDgzZGFiZTFjMWQ1MzQzMjg5MjM5MmQ1NGE1MGIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcmVtb3RhYmxlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9yZW1vdGFibGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1NTg0MmZlODI1MWQ0ZTA5NmYxM2NiZTVlYmY3ZTBiMzBjNmI1MzBhMDBiMzRmYTA3YmU4MDRkNWQ3YjQwMGEwMmIyNmZmNDI2OGIxNGRkODc3ZTk2ZTFhZTMzYWQwOGVmMmFiODgxMjk2MzJkNjI4NzU5NTJlYWZkMDE3MjExYyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zYWZlLXByb21pc2UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3NhZmUtcHJvbWlzZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjY1ZjZkOGU1Y2I0NDYwYjZkZTY1ZGQ0ZDlmYTQ4ZWE2NGVkNjMzOWVjNzZiZTk5ZjlkYmExNGQ2MjAzYzE0OTlkMWJkNTA5NTFmOWYwZmEwODc2MGVjOTBkOTRlYjkyNGQxODA2NzBkYWYyN2JjMjNkODAxY2ZmZDJmOTMxZTZlIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N5bWJvbC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3ltYm9sLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYjk5MTliNzhkMDczNjljNjdjYmU2OGU4NjgwYjJjOTE5ZDYwOWQyZGJjYmIyMWQyYzgwY2ZmMjYyYTM2NDUzNDdhNTMwZTczOTFkNDFlNzhhNDQ4ZDc1MTgzMjZhMWNlM2VjYjljOTlkMTYzNDM5MDE2Mzk2NTQ5MmFkZTA0OWMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdGFnZ2VkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90YWdnZWQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkMzlmMzA1YmM3OWYxZGI5YTZjZmJmOTUyNTE5MjViMmVlNTZiZDI5YmIxNTU3ZjI0NDY5OGZjMjM1ZDBhZjllNzI3YWM1NzIwMjI2ZTMyZGM4MGZjOGFmMzYxN2IwYTRkNTNjZTc3MmU3MDNlMjVmZjBiOWViZWQ3NGM3NTczOSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlR3VhcmRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlR3VhcmRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOTQxNzBjNGUxNmQ1Mzc5NWE4NDc5ZDBjMWE3OWQxOWIxOTBkOTIyZTE2MzAxZTdhMGJiOGI4MTZkM2M0OWJkMjVmZTBiODRlODc5ZGE3ODBjM2ZjMDY0MWFkNjljYzU3ZGQxZTc5NWVjZTdlOGJiMjgxMmY3NDMwNThhZmYwMjAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOThhODUxYmRiZjJmNGRkMDlhMTNiNTIxMTMwZTI5OWY5ZDE5NTVhZTE5MjkxNjI3Y2QyOGRmNGZiNWQ0ODc4ZWNkZjdjZTJiMjJhNTY3MGI0Mzk3YmY0OTBiODBkODk4MjQ4MWRiNWNlYjIyNGIxMGFmZGVmZTVjNDQ1MDYyNjUiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL3BhdHRlcm5zLXYwLjIuNiI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vcGF0dGVybnMiLAogICAgICAibGFiZWwiOiAiQGVuZG8vcGF0dGVybnMtdjAuMi42IiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL3BhdHRlcm5zLXYwLjIuNiIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTcuNiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYwLjguOSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGF0dGVybnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGF0dGVybnMtdjAuMi42IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXR0ZXJucy9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGF0dGVybnMtdjAuMi42IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi42MCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9zaGltLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjM2MmNlNjNjMmIzNWEzZTdiNmNmOGIzMzBjM2MzM2NlYzAzMDNiZWI0YmIzN2VjYmQxOThmYzNmMmY4YTdjYmUxMjc2YmJjNzA4MzQ1YmRlMzIyYTc2YjgyNDgxODM3MDA2NWIyNWE4MTBiMmQxZjVmNGY2MTE2MjdlMjAyOWRiIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2tleXMvY2hlY2tLZXkuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2tleXMvY2hlY2tLZXkuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlYzg2MjRhNWFhMGFkMDQ5NGZkYTI0MGNkMWRjNWVjN2EyNmNiYTM1ZGNmZTMyNGQxMmFkNDE3NGE3NGMwZWE2Y2VhOTg4Mjc4MmUwMWRhMTg2NGVmOTFiZGQwOWJmYzVkNzgwNWY1MmRiMjlhN2YyMzY5OWFkZjU0N2NmMTNkZCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9rZXlzL2NvbXBhcmVLZXlzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9rZXlzL2NvbXBhcmVLZXlzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZTcyYzJjODFlZWM0YmU2NzVmZGQ5YmM4ZDA2ZDY5MWMxYWY5NzBiODFhODllMDkwYzIyMmIwZDA3MmZlYTg4NGI1MDcxNDBmOTA0NzY2NTgwYzg2NDcwNjEzNmFmZDEwNmQwOWU1YTQ0ODRjYTA0MzlmNzVjZmUxMDU3OTBiYjciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMva2V5cy9jb3B5QmFnLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9rZXlzL2NvcHlCYWcuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmZGU0ZjgyZjJjNGQ0OWRiM2E5ODE0YmRiY2YxZWM2NGQ3MWQ4ZmFkNTIxZTExMGU2ODEyZDNiMzczZWQ5MjhiODYxZDc1ZjA3YTY3ZTNjZjRjM2ZlZDZhZGU0NTU3YmJmNGFkOTQ1NzM1YTIzOGRlZGRkMDUzYzA5MzJlNmEwNiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9rZXlzL2NvcHlTZXQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2tleXMvY29weVNldC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjQwZGMyMGE5ZTcwYTFiNzNkYzhhNDljODBhZDhhZjk2MTJmNzZkMTc1MWI0ZjRmYTg2ZDE3NjYxM2NlOTU5NzU5ZjBhYmUyNWYyMzY5MDc3OGM3NDA4N2ZhZWI3MTNhZjcxZTU2MjMyMTVhMDE0M2JkYWYzNGE5M2ZiNWQzNmQ0IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2tleXMva2V5Y29sbGVjdGlvbi1vcGVyYXRvcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2tleXMva2V5Y29sbGVjdGlvbi1vcGVyYXRvcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyNzBjZjkxZjllYWI5OGExZTNlYTA2ZDVkYzQ2MzZhMjRiNzUyMGViYWY1OWIwYjc0MWRiOGVlYzkzMjIyN2VlMjI5ZDEwYmM5MmIzNWFkY2E5ZTI3MmJjZmU4ZGQ1ZDBhZDJkMjI1ZmU5ZTYzYWEzZGJhZjJjZTRmODE5ZmQxZCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9rZXlzL21lcmdlLWJhZy1vcGVyYXRvcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2tleXMvbWVyZ2UtYmFnLW9wZXJhdG9ycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjJkNmYwMzk5OGJhNDRjMTM2ZDM0OTU3MTFlZTExMGY1ODJjZWUxYTMyMmUyMjYzZWI2MGY3NmZkOTE5OWZjNDA3NGEzZTA5NGMwMzZkZTUxZDJkNzk0YjA4NzYyZmQ4MWIwNmMwYmViNTZlOWEzOTcwYjIyZDM3MDg2MDFkMmVlIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2tleXMvbWVyZ2Utc2V0LW9wZXJhdG9ycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMva2V5cy9tZXJnZS1zZXQtb3BlcmF0b3JzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYzQwY2JlMzJlYWI3NGQ4MWM3MWY3MTk0NmIxYTc3N2E1ZGUyYjEzZjFjYjEzMWExODYyYjhiNWVhZTk1OWNiMTMzNzE0OGRmZjVhODA3ZTZmZTMxZTEwYWI4MTE5ZjhmN2RjMzlhYjExYjI2YTg4YTQ5ODU5N2ViOTZjYTFmNDciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGF0dGVybnMvaW50ZXJuYWwtdHlwZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3BhdHRlcm5zL2ludGVybmFsLXR5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMTQ2ODYzNmJmYWZlYWY1MDc0ODkzMDE4NjAzNDhhYzg1OWQ0M2RhOWFkY2JhYzU3YTg2M2E3NGJkNmI1ZTJiY2MzOTdiZGQ5ZGQ5MGI1OTIyNzE3MzY0MTY4YzdiODI5OWQ3OTAyZDAxZmMzZTBiNWRmYWU3NGY5Y2I3NDRiMTQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGF0dGVybnMvcGF0dGVybk1hdGNoZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2ZWQ4MDcwMTdkMWQyOTc2NTI0ZGY5ODFjNDE0ZjI1YTY1NzA0YTM4NGU3OThlMTM0Yjg4ZDJiMzU2ZTE1MGRlYjZjNGQyMWJjNWU1MTE1YTQyMWVlMzY1ODI5YWEyYmJjMzgzOTM3MmFmMmZhZDViNWJhY2ViZjkyZmJjOTljZCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5OGE4NTFiZGJmMmY0ZGQwOWExM2I1MjExMzBlMjk5ZjlkMTk1NWFlMTkyOTE2MjdjZDI4ZGY0ZmI1ZDQ4NzhlY2RmN2NlMmIyMmE1NjcwYjQzOTdiZjQ5MGI4MGQ4OTgyNDgxZGI1Y2ViMjI0YjEwYWZkZWZlNWM0NDUwNjI2NSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy91dGlscy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdXRpbHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyZGM5YTQyMWU2ZjJhZTA0MTJiMmUwYjBjOGY0YTc2YjE0ZTZiNDdmNjZlZjA4YWQwNzU3OWVkZGJhZWM2NzlkODlhY2I1YmI4NmNlY2FiYTE1NWIxNTIwNGNiYzU4ZjY0Y2I3OGQzMjU3ZDY3YmIyZWYwNTYyMTBhYzAyMmYxMCIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi42MCI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vcHJvbWlzZS1raXQiLAogICAgICAibGFiZWwiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi42MCIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjYwIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjYwIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvc2hpbS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjYwIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgInNlcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJzZXMtdjAuMTguOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAic2VzL2xvY2tkb3duIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInNlcy12MC4xOC44IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJzZXMvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInNlcy12MC4xOC44IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAic2VzL3Rvb2xzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInNlcy12MC4xOC44IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi90b29scy5qcyIKICAgICAgICB9LAogICAgICAgICIuL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiODJkYjczZDBhYjBjMjZhM2E4OTVjNTc5NTI4N2IwOTYxNmUwMzJjYjUzMDAxOWI3MjAxNmEyYjhmZTJkYzNhYjBlZDBlZWI0ZTlkZGNhZmEzZmY5YmI2Nzc0MmQwZWUwN2NhOTU1ZWI2OGVjODJmMGQ1Yzc2ZGQ5NDFiNTcwZGMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaXMtcHJvbWlzZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaXMtcHJvbWlzZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjE4MTRkZDE0M2RmZjczZGUzZWU0YzFmMDc3MDdlNTc3Y2FhY2FhM2FiZjRiMDU5MGNkZWRlMTBiOTE5OWE5MmQ3OTdmMGMxMWJiNzM4Mjk1YzQ5ZjFlN2VmOTBmM2QxMTZlMjhlNzRjMDg2NzM0ZWJjYThiY2RhMWRjOTM5ZDQ3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21lbW8tcmFjZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWVtby1yYWNlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZWVhNTVmYTJjYzFiNzM2ZTAyYmI4MzIyNDZkY2M2ZmNkNGEwYTFlYmMyNDFlMzgxZWY2ZjY0YmQ4ZWM0NmExNWQzZjc5N2VjMjJhMzVjOWM1Yzk1MTQyNGUzOWZkNmE2ODdjZGI0MTU1YzhkYjcxZjZlZmU3ZDNmZTk3ZTk0NWEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcHJvbWlzZS1leGVjdXRvci1raXQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3Byb21pc2UtZXhlY3V0b3Ita2l0LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNzVlODMzNmNiYzQxY2QyZjYzMTE3N2MwNjEwOWNmM2Y4YjUxODE0Y2IzM2UyMjA4MmM4ZTllZWUwNzJlYzQ4OTE5ZDA4ZDQzZDI5ZDU2NTUxODI2Yzg5NTEzNTgzNTRkNjhlNWFhMDk2YzZhYTU2NjEzNDllMGZhMTA4MTZmNzkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOThhODUxYmRiZjJmNGRkMDlhMTNiNTIxMTMwZTI5OWY5ZDE5NTVhZTE5MjkxNjI3Y2QyOGRmNGZiNWQ0ODc4ZWNkZjdjZTJiMjJhNTY3MGI0Mzk3YmY0OTBiODBkODk4MjQ4MWRiNWNlYjIyNGIxMGFmZGVmZTVjNDQ1MDYyNjUiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL3N0cmVhbS12MC4zLjI5IjogewogICAgICAibmFtZSI6ICJAZW5kby9zdHJlYW0iLAogICAgICAibGFiZWwiOiAiQGVuZG8vc3RyZWFtLXYwLjMuMjkiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vc3RyZWFtLXYwLjMuMjkiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE3LjYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjYwIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvc2hpbS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjYwIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3N0cmVhbSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9zdHJlYW0tdjAuMy4yOSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vc3RyZWFtL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9zdHJlYW0tdjAuMy4yOSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgInNlcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJzZXMtdjAuMTguOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAic2VzL2xvY2tkb3duIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInNlcy12MC4xOC44IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJzZXMvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInNlcy12MC4xOC44IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAic2VzL3Rvb2xzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInNlcy12MC4xOC44IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi90b29scy5qcyIKICAgICAgICB9LAogICAgICAgICIuL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMDA5NDEzMmNiOWFjZTdmMmFhOGZiMjRhODVhODYwZDQ4ZGQ3YzNlNTQ0MDAxZmVjZmVkMGE5N2RjMWEzN2MyZmUzZDNkMWMwZTQ0MDk5MGE4NjBlNWY0M2U3ZTZiNTdlM2EwZTE0NjAyNGIwNWQ5ODgzMDZjNmY5MDY4YjVhMmYiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgImplc3NpZS5qcy12MC4zLjIiOiB7CiAgICAgICJuYW1lIjogImplc3NpZS5qcyIsCiAgICAgICJsYWJlbCI6ICJqZXNzaWUuanMtdjAuMy4yIiwKICAgICAgImxvY2F0aW9uIjogImplc3NpZS5qcy12MC4zLjIiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vZmFyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Zhci12MC4yLjIyIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiamVzc2llLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogImplc3NpZS5qcy12MC4zLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9tYWluLmpzIgogICAgICAgIH0sCiAgICAgICAgImplc3NpZS5qcy9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiamVzc2llLmpzLXYwLjMuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21haW4uanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21haW4uanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIwMWRjYmUzNGY0YzIyNGQ2ZDZmZmRkZWNiM2RlNWJkZjJmZjMxMzg2NjdmNTZmNDk5NTU2OWYwYzJkOWZjZTNiNGRlYzQzM2YwZDQ1NmExOGI5NWQ3ZjNmMjM3YzExOTZjNDg3YmM0NGU0NDZmMjk1Y2Y2M2QyZDU4M2Q3ODg4OSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9yaW5nMC9FLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9yaW5nMC9FLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMzIxMjRiY2NjODQ2MDE5MDA2MWY0Y2RiZDhkZjQ5YmQ3MjNkMWM2NTVhYjk5ZDAyNjc2ZjhhMTExYTBmNzRlNDc2MmNhYzQzZWNkZWViODVkMjkzZjM3YzgyZWJjMjVmYzRlMDUyYzk5MjM3OGJjN2ViZTEwZTY4MWNkODMwMzciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcmluZzAvYXN5bmMtZ2VuZXJhdGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3JpbmcwL2FzeW5jLWdlbmVyYXRlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOWE5NWQxZGJjYzhmNGJlODE0MjA0ZjY4MzJjMWVhYzMwNjIxZmNjYjAzMjhjMGVjNDFlYTVhMDM5MTQ5OThjOGVmZjkwMTllZmY2NWFkNjYyODljMDE1OTE4MWQ5YjQ5ZGIyY2Q5NmYzZmI1OWUyMWFkYjg0ZDlhNGMwZTg5N2YiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcmluZzAvbWFpbi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcmluZzAvbWFpbi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjE4MzVlZTljNjBhYjM2MzFmYWI1YWEwYzlkY2NhZWU1ZWM5OWQ0N2UwOTI2NzAyMDJhM2ZjZDY2ZmU2MjI5NDUwN2RlM2Q0OWY4ODkyNmUzODEwZDYyNmJiOTBjNzVjNGExNmViYTU0ZDFkMTY2MWNjNTgwOWM4MWM1NGZlNzM0IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3JpbmcwL21ha2Vycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcmluZzAvbWFrZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiODM1N2JiZjZiMTFiYmNiY2EzYjk1OWM1ZWUxYWVhNGZhZWMzNGZlMzQ2YjgzODE5NDAyZTkzZGZiYmRlN2ZmOGZkY2UzOWUxZjYwOGRiYjc2NTQwYTgxY2E0OThlZmQ0NjkyOWY0MWU3ODllMjliYjZkYWY2N2FkM2MxNzVhNWYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcmluZzEvYXN5bmMtdG9vbHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3JpbmcxL2FzeW5jLXRvb2xzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNzBiZjEyMWE3YTU2OTUxNGMyZTBjMWFhNTFkMTZlM2UwZDEzYWM1ZWFmOTAxNTNhMWMyNTdjNjlhY2JhY2FiMGY0YTJkYzYxNTAzYjMzNzJlYjBhOTgwNmE2MTUyNjUxZjcwMTlhMzdiZTkyZGU4NGQ4YTIyNTVlN2YzMzEwNzEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcmluZzEvbWFpbi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcmluZzEvbWFpbi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjFlMTQ0OTBjZTUzYWY0MmJlNTI0NmM3MTY5Mjg4MzQ2NmY3MTRlODk4MjRjNzMzYmM0MzNlYTI5NWIyMjI5Y2Q0ZjdjM2I4YmEwMmM2OTk3YzcyZmYwMjc5NGExMjY3ZTllNWU0ZjEzYTI1ZGM0NmJkZTRkZmU1MjNjZGU1NTQ4IgogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KfVBLAwQKAAAAAAAAAAAACFDmwu0OAADtDgAAIwAAAEBhZ29yaWMvYXNzZXJ0LXYwLjYuMC9zcmMvYXNzZXJ0LmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJGYWlsIiwiTm9uTnVsbGlzaCIsImFuIiwiYXNzZXJ0IiwiZGV0YWlscyIsImlkZW50Q2hlY2tlciIsIm1ha2VBc3NlcnQiLCJxIiwicXVvdGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoYW4sICduYW1lJywge3ZhbHVlOiBcImFuXCJ9KTskaOKAjV9vbmNlLmFuKGFuKTsgICAvKiBnbG9iYWwgZ2xvYmFsVGhpcyAqL1xuLyogQ29weXJpZ2h0IChDKSAyMDE5IEFnb3JpYywgdW5kZXIgQXBhY2hlIExpY2Vuc2UgMi4wKi9cbi8qIEB0cy1jaGVjayovXG5cbi8qIFRoaXMgbW9kdWxlIGFzc3VtZXMgdGhlIGV4aXN0ZW5jZSBvZiBhIG5vbi1zdGFuZGFyZCBgYXNzZXJ0YCBob3N0IG9iamVjdC4qL1xuLyogU0VTIHZlcnNpb24gMC4xMS4wIGludHJvZHVjZXMgdGhpcyBnbG9iYWwgb2JqZWN0IGFuZCBlbnRhbmdsZXMgaXQqL1xuLyogd2l0aCB0aGUgYGNvbnNvbGVgIGhvc3Qgb2JqZWN0IGluIHNjb3BlIHdoZW4gaXQgaW5pdGlhbGl6ZXMsKi9cbi8qIGFsbG93aW5nIGVycm9ycywgcGFydGljdWxhcmx5IGFzc2VydGlvbiBlcnJvcnMsIHRvIGhpZGUgdGhlaXIgXCJkZXRhaWxzXCIqL1xuLyogZnJvbSBjYWxsZXJzIHRoYXQgbWlnaHQgY2F0Y2ggdGhvc2UgZXJyb3JzLCB0aGVuIHJldmVhbCB0aGVtIHRvIHRoZSovXG4vKiB1bmRlcmx5aW5nIGNvbnNvbGUuKi9cbi8qIFRvIHRoZSBleHRlbnQgdGhhdCB0aGlzIGBjb25zb2xlYCBpcyBjb25zaWRlcmVkIGEgcmVzb3VyY2UsKi9cbi8qIHRoaXMgbW9kdWxlIG11c3QgYmUgY29uc2lkZXJlZCBhIHJlc291cmNlIG1vZHVsZS4qL1xuXG4vKiBUaGUgYXNzZXJ0aW9ucyByZS1leHBvcnRlZCBoZXJlIGFyZSBkZWZpbmVkIGluKi9cbi8qIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9ibG9iL0hFQUQvcGFja2FnZXMvc2VzL3NyYy9lcnJvci9hc3NlcnQuanMqL1xuXG4vKiBBdCBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzI3NzQqL1xuLyogaXMgYSByZWNvcmQgb2YgYSBmYWlsZWQgYXR0ZW1wdCB0byByZW1vdmUgJy50eXBlcycuKi9cbi8qIFRvIHNhdGlzZnkgQ0ksIG5vdCBvbmx5IGRvIHdlIG5lZWQgdG8ga2VlcCB0aGUgZmlsZSwqL1xuLyogYnV0IHdlIG5lZWQgdG8gaW1wb3J0IGl0IGhlcmUgYXMgd2VsbC4qL1xuLyovIDxyZWZlcmVuY2UgcGF0aD1cIi4vdHlwZXMuanNcIiAvPiovXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vbWFyc2hhbCcpLkNoZWNrZXJ9IENoZWNrZXIgKi9cblxuY29uc3R7ZnJlZXplfT1PYmplY3Q7XG5cbi8qKiBAdHlwZSB7QXNzZXJ0fSAqL1xuY29uc3QgZ2xvYmFsQXNzZXJ0PWdsb2JhbFRoaXMuYXNzZXJ0OyRo4oCNX29uY2UuZ2xvYmFsQXNzZXJ0KGdsb2JhbEFzc2VydCk7XG5cbmlmKGdsb2JhbEFzc2VydD09PXVuZGVmaW5lZCl7XG50aHJvdyBFcnJvcihcbiBgQ2Fubm90IGluaXRpYWxpemUgQGFnb3JpYy9hc3NlcnQsIG1pc3NpbmcgZ2xvYmFsVGhpcy5hc3NlcnQsIGltcG9ydCAnc2VzJyBiZWZvcmUgJ0BhZ29yaWMvYXNzZXJ0J2ApO1xuXG4gfVxuXG5jb25zdCBtaXNzaW5nPS8qKiBAdHlwZSB7Y29uc3R9ICovW1xuJ2ZhaWwnLFxuJ2VxdWFsJyxcbid0eXBlb2YnLFxuJ3N0cmluZycsXG4nbm90ZScsXG4nZGV0YWlscycsXG4nRmFpbCcsXG4ncXVvdGUnLFxuJ21ha2VBc3NlcnQnXS5cbmZpbHRlcigobmFtZSk9Pmdsb2JhbEFzc2VydFtuYW1lXT09PXVuZGVmaW5lZCk7XG5pZihtaXNzaW5nLmxlbmd0aD4wKXtcbnRocm93IEVycm9yKFxuIGBDYW5ub3QgaW5pdGlhbGl6ZSBAYWdvcmljL2Fzc2VydCwgbWlzc2luZyBnbG9iYWxUaGlzLmFzc2VydCBtZXRob2RzICR7bWlzc2luZy5qb2luKFxuJywgJylcbiB9YCk7XG5cbiB9XG5cbmNvbnN0e2RldGFpbHMsRmFpbCxxdW90ZSxtYWtlQXNzZXJ0fT1nbG9iYWxBc3NlcnQ7JGjigI1fb25jZS5kZXRhaWxzKGRldGFpbHMpOyRo4oCNX29uY2UuRmFpbChGYWlsKTskaOKAjV9vbmNlLnF1b3RlKHF1b3RlKTskaOKAjV9vbmNlLm1ha2VBc3NlcnQobWFrZUFzc2VydCk7XG5cblxuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1QgfCBudWxsIHwgdW5kZWZpbmVkfSB2YWxcbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0RGV0YWlsc11cbiAqIEByZXR1cm5zIHtUfVxuICovXG5jb25zdCAgICAgICAgTm9uTnVsbGlzaD0odmFsLG9wdERldGFpbHM9IGB1bmV4cGVjdGVkICR7cXVvdGUodmFsKX1gKT0+e1xuaWYodmFsIT1udWxsKXtcbi8qIFRoaXMgYCE9IG51bGxgIGlkaW9tIGNoZWNrcyB0aGF0IGB2YWxgIGlzIG5laXRoZXIgYG51bGxgIG5vciBgdW5kZWZpbmVkYC4qL1xucmV0dXJuIHZhbDtcbiB9XG5hc3NlcnQuZmFpbChvcHREZXRhaWxzKTtcbiB9OyRo4oCNX29uY2UuTm9uTnVsbGlzaChOb25OdWxsaXNoKTtcbmhhcmRlbihOb25OdWxsaXNoKTtcblxuLyoqXG4gKiBQcmVwZW5kIHRoZSBjb3JyZWN0IGluZGVmaW5pdGUgYXJ0aWNsZSBvbnRvIGEgbm91biwgdHlwaWNhbGx5IGEgdHlwZW9mIHJlc3VsdFxuICogZS5nLiwgXCJhbiBPYmplY3RcIiB2cy4gXCJhIE51bWJlclwiXG4gKlxuICogQGRlcHJlY2F0ZWRcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHIgVGhlIG5vdW4gdG8gcHJlcGVuZFxuICogQHJldHVybnMge3N0cmluZ30gVGhlIG5vdW4gcHJlcGVuZGVkIHdpdGggYS9hblxuICovXG5mdW5jdGlvbiBhbihzdHIpe1xuc3RyPSBgJHtzdHJ9YDtcbmlmKHN0ci5sZW5ndGg+PTEmJidhZWlvdUFFSU9VJy5pbmNsdWRlcyhzdHJbMF0pKXtcbnJldHVybiBgYW4gJHtzdHJ9YDtcbiB9XG5yZXR1cm4gYGEgJHtzdHJ9YDtcbiB9XG5mcmVlemUoYW4pO1xuXG5cbi8qKlxuICogSW4gdGhlIGBhc3NlcnRGb29gL2Bpc0Zvb2AvYGNoZWNrRm9vYCBwYXR0ZXJuLCBgY2hlY2tGb29gIGhhcyBhIGBjaGVja2BcbiAqIHBhcmFtZXRlciBvZiB0eXBlIGBDaGVja2VyYC4gYGFzc2VydEZvb2AgY2FsbHMgYGNoZWNrRm9vYCBwYXNzZXNcbiAqIGBhc3NlcnRDaGVja2VyYCBhcyB0aGUgYGNoZWNrYCBhcmd1bWVudC4gYGlzRm9vYCBwYXNzZXMgYGlkZW50Q2hlY2tlcmBcbiAqIGFzIHRoZSBgY2hlY2tgIGFyZ3VtZW50LiBgaWRlbnRDaGVja2VyYCBhY3RzIHByZWNpc2VseSBsaWtlIGFuXG4gKiBpZGVudGl0eSBmdW5jdGlvbiwgYnV0IGlzIHR5cGVkIGFzIGEgYENoZWNrZXJgIHRvIGluZGljYXRlIGl0c1xuICogaW50ZW5kZWQgdXNlLlxuICpcbiAqIEB0eXBlIHtDaGVja2VyfVxuICovXG5jb25zdCAgICAgICAgaWRlbnRDaGVja2VyPShjb25kLF9kZXRhaWxzKT0+Y29uZDskaOKAjV9vbmNlLmlkZW50Q2hlY2tlcihpZGVudENoZWNrZXIpO1xuaGFyZGVuKGlkZW50Q2hlY2tlcik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYXNzZXJ0IjpbImdsb2JhbEFzc2VydCJdLCJkZXRhaWxzIjpbImRldGFpbHMiXSwiRmFpbCI6WyJGYWlsIl0sInF1b3RlIjpbInF1b3RlIl0sInEiOlsicXVvdGUiXSwibWFrZUFzc2VydCI6WyJtYWtlQXNzZXJ0Il0sImFuIjpbImFuIl0sIk5vbk51bGxpc2giOlsiTm9uTnVsbGlzaCJdLCJpZGVudENoZWNrZXIiOlsiaWRlbnRDaGVja2VyIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAlb/LVpAQAAaQEAACAAAABAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAvaGVhcC5qc3siaW1wb3J0cyI6WyIuL3NyYy9oZWFwLmpzIl0sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOlsiLi9zcmMvaGVhcC5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIi4vc3JjL2hlYXAuanNcIiwgW11dXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAABOvGoHsCgAA7AoAACQAAABAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAvc3JjL2hlYXAuanN7ImltcG9ydHMiOlsiQGVuZG8vZmFyIiwiQGVuZG8vZXhvIiwiQGFnb3JpYy9zdG9yZSIsIi4vbWFrZS1vbmNlLmpzIiwiLi9rZXlzLmpzIiwiLi9pcy1wYXNzYWJsZS5qcyJdLCJleHBvcnRzIjpbIm1ha2VIZWFwWm9uZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBGYXIsbWFrZUV4byxkZWZpbmVFeG9DbGFzcyxkZWZpbmVFeG9DbGFzc0tpdCxtYWtlU2NhbGFyTWFwU3RvcmUsbWFrZVNjYWxhclNldFN0b3JlLG1ha2VTY2FsYXJXZWFrTWFwU3RvcmUsbWFrZVNjYWxhcldlYWtTZXRTdG9yZSxtYWtlT25jZUtpdCxrZXlzLGlzUGFzc2FibGU7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vZmFyXCIsIFtbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9leG9cIiwgW1tcIm1ha2VFeG9cIiwgWyRo4oCNX2EgPT4gKG1ha2VFeG8gPSAkaOKAjV9hKV1dLFtcImRlZmluZUV4b0NsYXNzXCIsIFskaOKAjV9hID0+IChkZWZpbmVFeG9DbGFzcyA9ICRo4oCNX2EpXV0sW1wiZGVmaW5lRXhvQ2xhc3NLaXRcIiwgWyRo4oCNX2EgPT4gKGRlZmluZUV4b0NsYXNzS2l0ID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIm1ha2VTY2FsYXJNYXBTdG9yZVwiLCBbJGjigI1fYSA9PiAobWFrZVNjYWxhck1hcFN0b3JlID0gJGjigI1fYSldXSxbXCJtYWtlU2NhbGFyU2V0U3RvcmVcIiwgWyRo4oCNX2EgPT4gKG1ha2VTY2FsYXJTZXRTdG9yZSA9ICRo4oCNX2EpXV0sW1wibWFrZVNjYWxhcldlYWtNYXBTdG9yZVwiLCBbJGjigI1fYSA9PiAobWFrZVNjYWxhcldlYWtNYXBTdG9yZSA9ICRo4oCNX2EpXV0sW1wibWFrZVNjYWxhcldlYWtTZXRTdG9yZVwiLCBbJGjigI1fYSA9PiAobWFrZVNjYWxhcldlYWtTZXRTdG9yZSA9ICRo4oCNX2EpXV1dXSxbXCIuL21ha2Utb25jZS5qc1wiLCBbW1wibWFrZU9uY2VLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VPbmNlS2l0ID0gJGjigI1fYSldXV1dLFtcIi4va2V5cy5qc1wiLCBbW1wiYWdvcmljVmF0RGF0YUtleXNcIiwgWyRo4oCNX2EgPT4gKGtleXMgPSAkaOKAjV9hKV1dXV0sW1wiLi9pcy1wYXNzYWJsZS5qc1wiLCBbW1wiaXNQYXNzYWJsZVwiLCBbJGjigI1fYSA9PiAoaXNQYXNzYWJsZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEB0eXBlIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuU3RvcmVzfVxuICovXG5jb25zdCBkZXRhY2hlZEhlYXBTdG9yZXM9RmFyKCdoZWFwU3RvcmVzJyx7XG5kZXRhY2hlZDooKT0+ZGV0YWNoZWRIZWFwU3RvcmVzLFxuaXNTdG9yYWJsZTppc1Bhc3NhYmxlLFxuXG5zZXRTdG9yZTptYWtlU2NhbGFyU2V0U3RvcmUsXG5tYXBTdG9yZTptYWtlU2NhbGFyTWFwU3RvcmUsXG53ZWFrTWFwU3RvcmU6bWFrZVNjYWxhcldlYWtNYXBTdG9yZSxcbndlYWtTZXRTdG9yZTptYWtlU2NhbGFyV2Vha1NldFN0b3JlfSk7XG5cblxuLyoqXG4gKiBDcmVhdGUgYSBoZWFwIChpbi1tZW1vcnkpIHpvbmUgdGhhdCB1c2VzIHRoZSBkZWZhdWx0IGV4byBhbmQgc3RvcmUgaW1wbGVtZW50YXRpb25zLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBbYmFzZUxhYmVsXVxuICogQHJldHVybnMge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5ab25lfVxuICovXG5jb25zdCAgICAgICAgbWFrZUhlYXBab25lPShiYXNlTGFiZWw9J2hlYXBab25lJyk9PntcbmNvbnN0e21ha2VPbmNlLHdyYXBQcm92aWRlcn09bWFrZU9uY2VLaXQoYmFzZUxhYmVsLGRldGFjaGVkSGVhcFN0b3Jlcyk7XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGxhYmVsXG4gKiBAcGFyYW0ge2FueX0gX29wdGlvbnNcbiAqL1xuY29uc3QgbWFrZVN1YlpvbmU9KGxhYmVsLF9vcHRpb25zKT0+XG5tYWtlSGVhcFpvbmUoIGAke2Jhc2VMYWJlbH0uJHtsYWJlbH1gKTtcblxucmV0dXJuIEZhcignaGVhcFpvbmUnLHtcbmV4bzp3cmFwUHJvdmlkZXIobWFrZUV4byxrZXlzLmV4byksXG5leG9DbGFzczp3cmFwUHJvdmlkZXIoZGVmaW5lRXhvQ2xhc3Msa2V5cy5leG9DbGFzcyksXG5leG9DbGFzc0tpdDp3cmFwUHJvdmlkZXIoZGVmaW5lRXhvQ2xhc3NLaXQsa2V5cy5leG9DbGFzc0tpdCksXG5zdWJab25lOndyYXBQcm92aWRlcihtYWtlU3ViWm9uZSksXG5cbm1ha2VPbmNlLFxuZGV0YWNoZWQ6ZGV0YWNoZWRIZWFwU3RvcmVzLmRldGFjaGVkLFxuaXNTdG9yYWJsZTpkZXRhY2hlZEhlYXBTdG9yZXMuaXNTdG9yYWJsZSxcblxubWFwU3RvcmU6d3JhcFByb3ZpZGVyKGRldGFjaGVkSGVhcFN0b3Jlcy5tYXBTdG9yZSksXG5zZXRTdG9yZTp3cmFwUHJvdmlkZXIoZGV0YWNoZWRIZWFwU3RvcmVzLnNldFN0b3JlKSxcbndlYWtNYXBTdG9yZTp3cmFwUHJvdmlkZXIoZGV0YWNoZWRIZWFwU3RvcmVzLndlYWtNYXBTdG9yZSksXG53ZWFrU2V0U3RvcmU6d3JhcFByb3ZpZGVyKGRldGFjaGVkSGVhcFN0b3Jlcy53ZWFrU2V0U3RvcmUpfSk7XG5cbiB9OyRo4oCNX29uY2UubWFrZUhlYXBab25lKG1ha2VIZWFwWm9uZSk7XG5oYXJkZW4obWFrZUhlYXBab25lKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlSGVhcFpvbmUiOlsibWFrZUhlYXBab25lIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACp+ij6RBAAAkQQAACsAAABAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAvc3JjL2lzLXBhc3NhYmxlLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3Bhc3Mtc3R5bGUiXSwiZXhwb3J0cyI6WyJpc1Bhc3NhYmxlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IHBhc3NTdHlsZU9mOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG4vKipcbiAqIElzIGBzcGVjaW1lbmAgUGFzc2FibGU/IFRoaXMgcmV0dXJucyB0cnVlIGlmZiBgcGFzc1N0eWxlT2Yoc3BlY2ltZW4pYFxuICogcmV0dXJucyBhIHN0cmluZy4gVGhpcyByZXR1cm5zIGBmYWxzZWAgaWZmIGBwYXNzU3R5bGVPZihzcGVjaW1lbilgIHRocm93cy5cbiAqIFVuZGVyIG5vIG5vcm1hbCBjaXJjdW1zdGFuY2Ugc2hvdWxkIGBpc1Bhc3NhYmxlKHNwZWNpbWVuKWAgdGhyb3cuXG4gKlxuICogVE9ETyBpbXBsZW1lbnQgYW4gaXNQYXNzYWJsZSB0aGF0IGRvZXMgbm90IHJlbHkgb24gdHJ5L2NhdGNoLCBhbmRcbiAqIG1vdmUgaXQgdG8gQGVuZG8vcGFzcy1zdHlsZS5cbiAqIFRoaXMgaW1wbGVtZW50YXRpb24gaXMganVzdCBhIHN0YW5kaW4gdW50aWwgdGhlblxuICpcbiAqIEBwYXJhbSB7YW55fSBzcGVjaW1lblxuICogQHJldHVybnMge3NwZWNpbWVuIGlzIFBhc3NhYmxlfVxuICovXG5jb25zdCAgICAgICAgaXNQYXNzYWJsZT0oc3BlY2ltZW4pPT57XG50cnl7XG4vKiBJbiBmYWN0LCBpdCBuZXZlciByZXR1cm5zIHVuZGVmaW5lZC4gSXQgZWl0aGVyIHJldHVybnMgYSovXG4vKiBzdHJpbmcgb3IgdGhyb3dzLiovXG5yZXR1cm4gcGFzc1N0eWxlT2Yoc3BlY2ltZW4pIT09dW5kZWZpbmVkO1xuIH1jYXRjaChfKXtcbnJldHVybiBmYWxzZTtcbiB9XG4gfTskaOKAjV9vbmNlLmlzUGFzc2FibGUoaXNQYXNzYWJsZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaXNQYXNzYWJsZSI6WyJpc1Bhc3NhYmxlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAL9hH3PJAwAAyQMAACQAAABAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAvc3JjL2tleXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImFnb3JpY1ZhdERhdGFLZXlzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyogQHRzLWNoZWNrKi9cblxuLyoqIEBwYXJhbSB7c3RyaW5nfSBsYWJlbCAqL1xuY29uc3Qga2luZD0obGFiZWwpPT4gYCR7bGFiZWx9X2tpbmRIYW5kbGVgO1xuXG4vKiogQHBhcmFtIHtzdHJpbmd9IGxhYmVsICovXG5jb25zdCBzaW5nbGV0b249KGxhYmVsKT0+IGAke2xhYmVsfV9zaW5nbGV0b25gO1xuXG4vKipcbiAqIEtleU1ha2VycyBjb21wYXRpYmxlIHdpdGggYEBhZ29yaWMvdmF0LWRhdGFgLlxuICpcbiAqIEB0eXBlIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuS2V5TWFrZXJzfVxuICovXG5jb25zdCAgICAgICAgYWdvcmljVmF0RGF0YUtleXM9e1xuZXhvQ2xhc3M6KGxhYmVsKT0+aGFyZGVuKFtraW5kKGxhYmVsKV0pLFxuZXhvQ2xhc3NLaXQ6KGxhYmVsKT0+aGFyZGVuKFtraW5kKGxhYmVsKV0pLFxuZXhvOihsYWJlbCk9PmhhcmRlbihba2luZChsYWJlbCksc2luZ2xldG9uKGxhYmVsKV0pLFxuc3RvcmU6KGxhYmVsKT0+aGFyZGVuKFtsYWJlbF0pLFxuem9uZToobGFiZWwpPT5oYXJkZW4oW2xhYmVsXSl9OyRo4oCNX29uY2UuYWdvcmljVmF0RGF0YUtleXMoYWdvcmljVmF0RGF0YUtleXMpO1xuXG5oYXJkZW4oYWdvcmljVmF0RGF0YUtleXMpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImFnb3JpY1ZhdERhdGFLZXlzIjpbImFnb3JpY1ZhdERhdGFLZXlzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAM5INhnBDQAAwQ0AACkAAABAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAvc3JjL21ha2Utb25jZS5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsibWFrZU9uY2VLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKiBAdHMtY2hlY2sqL1xuY29uc3R7RmFpbH09YXNzZXJ0O1xuXG4vKiogQHBhcmFtIHtzdHJpbmd9IGxhYmVsICovXG5jb25zdCBkZWZhdWx0TGFiZWxUb0tleXM9KGxhYmVsKT0+aGFyZGVuKFtsYWJlbF0pO1xuaGFyZGVuKGRlZmF1bHRMYWJlbFRvS2V5cyk7XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGRlYnVnTmFtZSBPbmx5IHVzZWQgaW50ZXJuYWxseSBmb3IgZGlhZ25vc3RpY3MsIG5vdCBhdmFpbGFibGUgdG8gdXNlciBjb2RlXG4gKiBAcGFyYW0ge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5TdG9yZXN9IHN0b3Jlc1xuICogQHBhcmFtIHtYaW1wb3J0KCdAYWdvcmljL3N3aW5nc2V0LWxpdmVzbG90cycpLk1hcFN0b3JlPHN0cmluZywgYW55Pn0gW2JhY2tpbmdTdG9yZV1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VPbmNlS2l0PShkZWJ1Z05hbWUsc3RvcmVzLGJhY2tpbmdTdG9yZT11bmRlZmluZWQpPT57XG4vKiBXZSBuZWVkIGEgZGV0YWNoZWQgc2V0U3RvcmUgc28gdGhhdCBpdCBpc24ndCBwZXJzaXN0ZWQgYXMgcGFydCBvZiB0aGUgem9uZS4qL1xuLyogVGhhdCB3YXksIG91ciB1c2VkS2V5cyBhcmUgb25seSB0cmFja2VkIGZvciB0aGUgY3VycmVudCBpbmNhcm5hdGlvbiwgd2hpY2gqL1xuLyogaXMgd2hhdCB3ZSB3YW50LiAgVXNpbmcgYGRlYnVnTmFtZWAgaW4gdGhlIGxhYmVsIGlzIGdvb2QgZm9yIGRpYWdub3N0aWNzLCovXG4vKiBhbmQgc2luY2UgaXQgaXMgb25seSBmb3IgYSBkZXRhY2hlZCBzdG9yZSwgaXQgc2hvdWxkIG5vdCBiZSB2aXNpYmxlIHRvIHRoZSovXG4vKiBiYWNraW5nIHN0b3JlLiovXG5jb25zdCB1c2VkS2V5cz1zdG9yZXMuZGV0YWNoZWQoKS5zZXRTdG9yZSggYCR7ZGVidWdOYW1lfSB1c2VkIGtleXNgKTtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gKi9cbmNvbnN0IGFzc2VydE9ubHlPbmNlPShrZXkpPT57XG50eXBlb2Yga2V5PT09J3N0cmluZyd8fEZhaWwgYGtleSAke2tleX0gbXVzdCBiZSBhIHN0cmluZ2A7XG4hdXNlZEtleXMuaGFzKGtleSl8fFxuRmFpbCBga2V5ICR7a2V5fSBoYXMgYWxyZWFkeSBiZWVuIHVzZWQgaW4gdGhpcyB6b25lIGFuZCBpbmNhcm5hdGlvbmA7XG5cbi8qIE1hcmsgdGhpcyBrZXkgYXMgdXNlZC4gIFdlIG1ha2Ugbm8gYXR0ZW1wdCB0byByZWNvdmVyIGZyb20gaW52YWxpZCBtYWtlcnMqL1xuLyogb3IgYmFja2luZ1N0b3Jlcy4qL1xudXNlZEtleXMuYWRkKGtleSk7XG4gfTtcblxuLyoqXG4gKiBFbnN1cmUgdGhlIHdyYXBwZWQgZnVuY3Rpb24gaXMgb25seSBjYWxsZWQgb25jZSBwZXIgaW5jYXJuYXRpb24uICBJdCBpc1xuICogZXhwZWN0ZWQgdG8gdXBkYXRlIHRoZSBiYWNraW5nIHN0b3JlIGRpcmVjdGx5LlxuICpcbiAqIEB0ZW1wbGF0ZSB7KGtleTogc3RyaW5nLCAuLi5yZXN0OiB1bmtub3duW10pID0+IGFueX0gVFxuICogQHBhcmFtIHtUfSBwcm92aWRlclxuICogQHBhcmFtIHsobGFiZWw6IHN0cmluZykgPT4gc3RyaW5nW119IFtsYWJlbFRvS2V5c11cbiAqIEByZXR1cm5zIHtUfVxuICovXG5jb25zdCB3cmFwUHJvdmlkZXI9KHByb3ZpZGVyLGxhYmVsVG9LZXlzPWRlZmF1bHRMYWJlbFRvS2V5cyk9Pntcbi8qKiBAdHlwZSB7KC4uLmFyZ3M6IFBhcmFtZXRlcnM8VD4pID0+IFJldHVyblR5cGU8VD59ICovXG5jb25zdCB3cmFwcGVyPShsYWJlbCwuLi5yZXN0KT0+e1xuZm9yKGNvbnN0IGtleSBvZiBsYWJlbFRvS2V5cyhsYWJlbCkpe1xuYXNzZXJ0T25seU9uY2Uoa2V5KTtcbiB9XG5yZXR1cm4gcHJvdmlkZXIobGFiZWwsLi4ucmVzdCk7XG4gfTtcbnJldHVybiAoLyoqIEB0eXBlIHtUfSAqL3dyYXBwZXIpO1xuIH07XG5cbi8qKlxuICogVGhlIGJlc3Qgd2F5IHRvIHVuZGVyc3RhbmQgdGhlIHB1cnBvc2Ugb2YgYG1ha2VPbmNlYCBpcyB0byBmaXJzdCB1bmRlcnN0YW5kXG4gKiB3aGF0IGBtYWtlT25jZWAgZG9lcyBvbiBhIGR1cmFibGUgem9uZS4gVXNlZCBjb3JyZWN0bHksIGBtYWtlT25jZWAgc2hvdWxkIG9ubHlcbiAqIGJlIGNhbGxlZCBhdCBtb3N0IG9uY2Ugb24gYW55IHpvbmUsa2V5IHBhaXIgZHVyaW5nIGFueSB2YXQgaW5jYXJuYXRpb24uXG4gKiBHaXZlbiB0aGF0IGNvbnN0cmFpbnQsIGlmIHRoZXJlIGlzIGFscmVhZHkgYSB2YWx1ZSBib3VuZCB0byB0aGF0XG4gKiB6b25lLGtleSBwYWlyLCBpdCBtdXN0IGhhdmUgYmVlbiBsZWZ0IHRoZXJlIGJ5IGEgcHJldmlvdXMgaW5jYXJuYXRpb24gYW5kXG4gKiBgbWFrZU9uY2VgIHdpbGwgc2ltcGx5IHJldHVybiBpdC4gSWYgbm90LCB0aGVuIGBtYWtlcihrZXkpYCBpcyBjYWxsZWQgdG9cbiAqIGRldGVybWluZSB0aGUgaW5pdGlhbCB2YWx1ZSBvZiB0aGF0IHNsb3QsIHdoaWNoIHdpbGwgbm9ybWFsbHkgYmUgcHJlc2VydmVkXG4gKiBieSBzaW1pbGFyIGNhbGxzIHRvIGBtYWtlT25jZWAgaW4gZnV0dXJlIGluY2FybmF0aW9ucyAtLS0gdGhvdWdoIHRoYXQgd2lsbCBiZVxuICogdXAgdG8gdGhlbS5cbiAqXG4gKiBBbHNvIGVuc3VyZXMgdGhlIG1ha2VyIHJldHVybnMgYSBzdG9yYWJsZSB2YWx1ZS5cbiAqXG4gKiBAdGVtcGxhdGUgVlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUgc3RyaW5nIG5hbWUgb2YgdGhlIFpvbmUgc2xvdCB0byBwcm92aWRlLlxuICogQHBhcmFtIHsoa2V5OiBzdHJpbmcpID0+IFZ9IG1ha2VyIENhbGxlZCB0byBjcmVhdGUgYSBmcmVzaCB2YWx1ZSB0byBmaWxsIGFuIGVtcHR5IHNsb3QuXG4gKiBAcmV0dXJucyB7Vn0gVGhlIHZhbHVlIG9mIHRoZSBrZXkncyBzbG90LlxuICovXG5jb25zdCBtYWtlT25jZT0oa2V5LG1ha2VyKT0+e1xuYXNzZXJ0T25seU9uY2Uoa2V5KTtcbmlmKGJhY2tpbmdTdG9yZSYmYmFja2luZ1N0b3JlLmhhcyhrZXkpKXtcbnJldHVybiBiYWNraW5nU3RvcmUuZ2V0KGtleSk7XG4gfVxuY29uc3QgdmFsdWU9bWFrZXIoa2V5KTtcbnN0b3Jlcy5pc1N0b3JhYmxlKHZhbHVlKXx8XG5GYWlsIGBtYWtlciByZXR1cm4gdmFsdWUgJHt2YWx1ZX0gaXMgbm90IHN0b3JhYmxlYDtcbmJhY2tpbmdTdG9yZSYmYmFja2luZ1N0b3JlLmluaXQoa2V5LHZhbHVlKTtcbnJldHVybiB2YWx1ZTtcbiB9O1xuXG5yZXR1cm4gaGFyZGVuKHttYWtlT25jZSx3cmFwUHJvdmlkZXJ9KTtcbiB9OyRo4oCNX29uY2UubWFrZU9uY2VLaXQobWFrZU9uY2VLaXQpO1xuaGFyZGVuKG1ha2VPbmNlS2l0KTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlT25jZUtpdCI6WyJtYWtlT25jZUtpdCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACriiOmbAEAAGwBAAAgAAAAQGFnb3JpYy9lcnRwLXYwLjE2LjIvZXhwb3J0ZWQuanN7ImltcG9ydHMiOlsiLi9zcmMvdHlwZXMtYW1iaWVudC5qcyJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL3NyYy90eXBlcy1hbWJpZW50LmpzXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACIPZYmPDcAADw3AAAmAAAAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL2Ftb3VudE1hdGguanN7ImltcG9ydHMiOlsiQGVuZG8vbWFyc2hhbCIsIkBhZ29yaWMvc3RvcmUiLCIuL21hdGhIZWxwZXJzL25hdE1hdGhIZWxwZXJzLmpzIiwiLi9tYXRoSGVscGVycy9zZXRNYXRoSGVscGVycy5qcyIsIi4vbWF0aEhlbHBlcnMvY29weVNldE1hdGhIZWxwZXJzLmpzIiwiLi9tYXRoSGVscGVycy9jb3B5QmFnTWF0aEhlbHBlcnMuanMiXSwiZXhwb3J0cyI6WyJBbW91bnRNYXRoIiwiQXNzZXRLaW5kIiwiYXNzZXJ0QXNzZXRLaW5kIiwiYXNzZXJ0VmFsdWVHZXRIZWxwZXJzIiwiZ2V0QXNzZXRLaW5kIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IHBhc3NTdHlsZU9mLGFzc2VydFJlbW90YWJsZSxhc3NlcnRSZWNvcmQsTSxtYXRjaGVzLG5hdE1hdGhIZWxwZXJzLHNldE1hdGhIZWxwZXJzLGNvcHlTZXRNYXRoSGVscGVycyxjb3B5QmFnTWF0aEhlbHBlcnM7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXSxbXCJhc3NlcnRSZW1vdGFibGVcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFJlbW90YWJsZSA9ICRo4oCNX2EpXV0sW1wiYXNzZXJ0UmVjb3JkXCIsIFskaOKAjV9hID0+IChhc3NlcnRSZWNvcmQgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiTVwiLCBbJGjigI1fYSA9PiAoTSA9ICRo4oCNX2EpXV0sW1wibWF0Y2hlc1wiLCBbJGjigI1fYSA9PiAobWF0Y2hlcyA9ICRo4oCNX2EpXV1dXSxbXCIuL21hdGhIZWxwZXJzL25hdE1hdGhIZWxwZXJzLmpzXCIsIFtbXCJuYXRNYXRoSGVscGVyc1wiLCBbJGjigI1fYSA9PiAobmF0TWF0aEhlbHBlcnMgPSAkaOKAjV9hKV1dXV0sW1wiLi9tYXRoSGVscGVycy9zZXRNYXRoSGVscGVycy5qc1wiLCBbW1wic2V0TWF0aEhlbHBlcnNcIiwgWyRo4oCNX2EgPT4gKHNldE1hdGhIZWxwZXJzID0gJGjigI1fYSldXV1dLFtcIi4vbWF0aEhlbHBlcnMvY29weVNldE1hdGhIZWxwZXJzLmpzXCIsIFtbXCJjb3B5U2V0TWF0aEhlbHBlcnNcIiwgWyRo4oCNX2EgPT4gKGNvcHlTZXRNYXRoSGVscGVycyA9ICRo4oCNX2EpXV1dXSxbXCIuL21hdGhIZWxwZXJzL2NvcHlCYWdNYXRoSGVscGVycy5qc1wiLCBbW1wiY29weUJhZ01hdGhIZWxwZXJzXCIsIFskaOKAjV9hID0+IChjb3B5QmFnTWF0aEhlbHBlcnMgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuY29uc3R7cXVvdGU6cSxGYWlsfT1hc3NlcnQ7XG5cbi8qKlxuICogQ29uc3RhbnRzIGZvciB0aGUga2luZHMgb2YgYXNzZXRzIHdlIHN1cHBvcnQuXG4gKlxuICogQHR5cGUge3tcbiAqICAgTkFUOiAnbmF0JztcbiAqICAgU0VUOiAnc2V0JztcbiAqICAgQ09QWV9TRVQ6ICdjb3B5U2V0JztcbiAqICAgQ09QWV9CQUc6ICdjb3B5QmFnJztcbiAqIH19XG4gKi9cbmNvbnN0IEFzc2V0S2luZD1oYXJkZW4oe1xuTkFUOiduYXQnLFxuU0VUOidzZXQnLFxuQ09QWV9TRVQ6J2NvcHlTZXQnLFxuQ09QWV9CQUc6J2NvcHlCYWcnfSk7JGjigI1fb25jZS5Bc3NldEtpbmQoQXNzZXRLaW5kKTtcblxuY29uc3QgYXNzZXRLaW5kTmFtZXM9aGFyZGVuKE9iamVjdC52YWx1ZXMoQXNzZXRLaW5kKS5zb3J0KCkpO1xuXG4vKiogQHBhcmFtIHtBc3NldEtpbmR9IGFsbGVnZWRBSyAqL1xuY29uc3QgYXNzZXJ0QXNzZXRLaW5kPShhbGxlZ2VkQUspPT57XG5hc3NldEtpbmROYW1lcy5pbmNsdWRlcyhhbGxlZ2VkQUspfHxcbkZhaWwgYFRoZSBhc3NldEtpbmQgJHthbGxlZ2VkQUt9IG11c3QgYmUgb25lIG9mICR7cShhc3NldEtpbmROYW1lcyl9YDtcbiB9OyRo4oCNX29uY2UuYXNzZXJ0QXNzZXRLaW5kKGFzc2VydEFzc2V0S2luZCk7XG5oYXJkZW4oYXNzZXJ0QXNzZXRLaW5kKTtcblxuLyoqXG4gKiBBbW91bnRzIGRlc2NyaWJlIGRpZ2l0YWwgYXNzZXRzLiBGcm9tIGFuIGFtb3VudCwgeW91IGNhbiBsZWFybiB0aGUgYnJhbmQgb2ZcbiAqIGRpZ2l0YWwgYXNzZXQgYXMgd2VsbCBhcyBcImhvdyBtdWNoXCIgb3IgXCJob3cgbWFueVwiLiBBbW91bnRzIGhhdmUgdHdvIHBhcnRzOiBhXG4gKiBicmFuZCAobG9vc2VseSBzcGVha2luZywgdGhlIHR5cGUgb2YgZGlnaXRhbCBhc3NldCkgYW5kIHRoZSB2YWx1ZSAodGhlIGFuc3dlclxuICogdG8gXCJob3cgbXVjaFwiKS4gRm9yIGV4YW1wbGUsIGluIHRoZSBwaHJhc2UgXCI1IGJ1Y2tzXCIsIFwiYnVja3NcIiB0YWtlcyB0aGUgcm9sZVxuICogb2YgdGhlIGJyYW5kIGFuZCB0aGUgdmFsdWUgaXMgNS4gQW1vdW50cyBjYW4gZGVzY3JpYmUgZnVuZ2libGUgYW5kXG4gKiBub24tZnVuZ2libGUgZGlnaXRhbCBhc3NldHMuIEFtb3VudHMgYXJlIHBhc3MtYnktY29weSBhbmQgY2FuIGJlIG1hZGUgYnkgYW5kXG4gKiBzZW50IHRvIGFueW9uZS5cbiAqXG4gKiBUaGUgaXNzdWVyIGlzIHRoZSBhdXRob3JpdGF0aXZlIHNvdXJjZSBvZiB0aGUgYW1vdW50IGluIHBheW1lbnRzIGFuZCBwdXJzZXMuXG4gKiBUaGUgaXNzdWVyIG11c3QgYmUgYWJsZSB0byBkbyB0aGluZ3Mgc3VjaCBhcyBhZGQgZGlnaXRhbCBhc3NldHMgdG8gYSBwdXJzZVxuICogYW5kIHdpdGhkcmF3IGRpZ2l0YWwgYXNzZXRzIGZyb20gYSBwdXJzZS4gVG8gZG8gc28sIGl0IG11c3Qga25vdyBob3cgdG8gYWRkXG4gKiBhbmQgc3VidHJhY3QgZGlnaXRhbCBhc3NldHMuIFJhdGhlciB0aGFuIGhhcmQtY29kaW5nIGEgcGFydGljdWxhciBzb2x1dGlvbixcbiAqIHdlIGNob3NlIHRvIHBhcmFtZXRlcml6ZSB0aGUgaXNzdWVyIHdpdGggYSBjb2xsZWN0aW9uIG9mIHBvbHltb3JwaGljXG4gKiBmdW5jdGlvbnMsIHdoaWNoIHdlIGNhbGwgYEFtb3VudE1hdGhgLiBUaGVzZSBtYXRoIGZ1bmN0aW9ucyBpbmNsdWRlIGNvbmNlcHRzXG4gKiBsaWtlIGFkZGl0aW9uLCBzdWJ0cmFjdGlvbiwgYW5kIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0by5cbiAqXG4gKiBXZSBhbHNvIHdhbnQgdG8gbWFrZSBzdXJlIHRoZXJlIGlzIG5vIGNvbmZ1c2lvbiBhcyB0byB3aGF0IGtpbmQgb2YgYXNzZXQgd2VcbiAqIGFyZSB1c2luZy4gVGh1cywgQW1vdW50TWF0aCBpbmNsdWRlcyBjaGVja3Mgb2YgdGhlIGBicmFuZGAsIHRoZSB1bmlxdWVcbiAqIGlkZW50aWZpZXIgZm9yIHRoZSB0eXBlIG9mIGRpZ2l0YWwgYXNzZXQuIElmIHRoZSB3cm9uZyBicmFuZCBpcyB1c2VkIGluXG4gKiBBbW91bnRNYXRoLCBhbiBlcnJvciBpcyB0aHJvd24gYW5kIHRoZSBvcGVyYXRpb24gZG9lcyBub3Qgc3VjY2VlZC5cbiAqXG4gKiBBbW91bnRNYXRoIHVzZXMgbWF0aEhlbHBlcnMgdG8gZG8gbW9zdCBvZiB0aGUgd29yaywgYnV0IHRoZW4gYWRkcyB0aGUgYnJhbmRcbiAqIHRvIHRoZSByZXN1bHQuIFRoZSBmdW5jdGlvbiBgdmFsdWVgIGdldHMgdGhlIHZhbHVlIGZyb20gdGhlIGFtb3VudCBieVxuICogcmVtb3ZpbmcgdGhlIGJyYW5kIChhbW91bnQgLT4gdmFsdWUpLCBhbmQgdGhlIGZ1bmN0aW9uIGBtYWtlYCBhZGRzIHRoZSBicmFuZFxuICogdG8gcHJvZHVjZSBhbiBhbW91bnQgKHZhbHVlIC0+IGFtb3VudCkuIFRoZSBmdW5jdGlvbiBgY29lcmNlYCB0YWtlcyBhbiBhbW91bnRcbiAqIGFuZCBjaGVja3MgaXQsIHJldHVybmluZyBhbiBhbW91bnQgKGFtb3VudCAtPiBhbW91bnQpLlxuICpcbiAqIEVhY2ggaXNzdWVyIG9mIGRpZ2l0YWwgYXNzZXRzIGhhcyBhbiBhc3NvY2lhdGVkIGJyYW5kIGluIGEgb25lLXRvLW9uZVxuICogbWFwcGluZy4gSW4gdW50cnVzdGVkIGNvbnRleHRzLCBzdWNoIGFzIGluIGFuYWx5emluZyBwYXltZW50cyBhbmQgYW1vdW50cywgd2VcbiAqIGNhbiBnZXQgdGhlIGJyYW5kIGFuZCBmaW5kIHRoZSBpc3N1ZXIgd2hpY2ggbWF0Y2hlcyB0aGUgYnJhbmQuIFRoZSBpc3N1ZXIgYW5kXG4gKiB0aGUgYnJhbmQgbXV0dWFsbHkgdmFsaWRhdGUgZWFjaCBvdGhlci5cbiAqL1xuXG5jb25zdCBoZWxwZXJzPXtcbm5hdDpuYXRNYXRoSGVscGVycyxcbnNldDpzZXRNYXRoSGVscGVycyxcbmNvcHlTZXQ6Y29weVNldE1hdGhIZWxwZXJzLFxuY29weUJhZzpjb3B5QmFnTWF0aEhlbHBlcnN9O1xuXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBbW91bnRWYWx1ZX0gVlxuICogQHR5cGUgeyh2YWx1ZTogVikgPT4gQXNzZXRLaW5kRm9yVmFsdWU8Vj59XG4gKi9cbmNvbnN0IGFzc2VydFZhbHVlR2V0QXNzZXRLaW5kPSh2YWx1ZSk9PntcbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZih2YWx1ZSk7XG5pZihwYXNzU3R5bGU9PT0nYmlnaW50Jyl7XG4vKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QqL1xucmV0dXJuJ25hdCc7XG4gfVxuaWYocGFzc1N0eWxlPT09J2NvcHlBcnJheScpe1xuLyogQHRzLWV4cGVjdC1lcnJvciBjYXN0Ki9cbnJldHVybidzZXQnO1xuIH1cbmlmKG1hdGNoZXModmFsdWUsTS5zZXQoKSkpe1xuLyogQHRzLWV4cGVjdC1lcnJvciBjYXN0Ki9cbnJldHVybidjb3B5U2V0JztcbiB9XG5pZihtYXRjaGVzKHZhbHVlLE0uYmFnKCkpKXtcbi8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCovXG5yZXR1cm4nY29weUJhZyc7XG4gfVxuLyogVE9ETyBUaGlzIGlzbid0IHF1aXRlIHRoZSByaWdodCBlcnJvciBtZXNzYWdlLCBpbiBjYXNlIHZhbHVlUGFzc1N0eWxlKi9cbi8qIGlzICd0YWdnZWQnLiBXZSB3b3VsZCBuZWVkIHRvIGRpc3Rpbmd1aXNoIHdoYXQga2luZCBvZiB0YWdnZWQqL1xuLyogb2JqZWN0IGl0IGlzLiovXG4vKiBBbHNvLCB0aGlzIGtpbmQgb2YgbWFudWFsIGxpc3RpbmcgaXMgYSBtYWludGVuYW5jZSBoYXphcmQgd2UqL1xuLyogKFRPRE8pIHdpbGwgZW5jb3VudGVyIHdoZW4gd2UgZXh0ZW5kIHRoZSBtYXRoIGhlbHBlcnMgZnVydGhlci4qL1xudGhyb3cgRmFpbCBgdmFsdWUgJHt2YWx1ZX0gbXVzdCBiZSBhIGJpZ2ludCwgY29weVNldCwgY29weUJhZywgb3IgYW4gYXJyYXksIG5vdCAke3EoXG5wYXNzU3R5bGUpXG4gfWA7XG4gfTtcblxuLyoqXG4gKiBBc3NlcnRzIHRoYXQgdmFsdWUgaXMgYSB2YWxpZCBBbW91bnRNYXRoIGFuZCByZXR1cm5zIHRoZSBhcHByb3ByaWF0ZSBoZWxwZXJzLlxuICpcbiAqIE1hZGUgYXZhaWxhYmxlIG9ubHkgZm9yIHRlc3RpbmcsIGJ1dCBpdCBpcyBoYXJtbGVzcyBmb3Igb3RoZXIgdXNlcy5cbiAqXG4gKiBAdGVtcGxhdGUge0Ftb3VudFZhbHVlfSBWXG4gKiBAcGFyYW0ge1Z9IHZhbHVlXG4gKiBAcmV0dXJucyB7TWF0aEhlbHBlcnM8Vj59XG4gKi9cbmNvbnN0ICAgICAgICBhc3NlcnRWYWx1ZUdldEhlbHBlcnM9KHZhbHVlKT0+XG4vKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QqL1xuaGVscGVyc1thc3NlcnRWYWx1ZUdldEFzc2V0S2luZCh2YWx1ZSldO1xuXG4vKiogQHR5cGUgeyhhbGxlZ2VkQnJhbmQ6IEJyYW5kLCBicmFuZD86IEJyYW5kKSA9PiB2b2lkfSAqLyRo4oCNX29uY2UuYXNzZXJ0VmFsdWVHZXRIZWxwZXJzKGFzc2VydFZhbHVlR2V0SGVscGVycyk7XG5jb25zdCBvcHRpb25hbEJyYW5kQ2hlY2s9KGFsbGVnZWRCcmFuZCxicmFuZCk9PntcbmlmKGJyYW5kIT09dW5kZWZpbmVkKXtcbmFzc2VydFJlbW90YWJsZShicmFuZCwnYnJhbmQnKTtcbmFsbGVnZWRCcmFuZD09PWJyYW5kfHxcbkZhaWwgYGFtb3VudCdzIGJyYW5kICR7cShhbGxlZ2VkQnJhbmQpfSBkaWQgbm90IG1hdGNoIGV4cGVjdGVkIGJyYW5kICR7cShcbmJyYW5kKVxuIH1gO1xuIH1cbiB9O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gbGVmdEFtb3VudFxuICogQHBhcmFtIHtBbW91bnQ8Sz59IHJpZ2h0QW1vdW50XG4gKiBAcGFyYW0ge0JyYW5kPEs+IHwgdW5kZWZpbmVkfSBicmFuZFxuICogQHJldHVybnMge01hdGhIZWxwZXJzPGFueT59XG4gKi9cbmNvbnN0IGNoZWNrTFJBbmRHZXRIZWxwZXJzPShsZWZ0QW1vdW50LHJpZ2h0QW1vdW50LGJyYW5kPXVuZGVmaW5lZCk9PntcbmFzc2VydFJlY29yZChsZWZ0QW1vdW50LCdsZWZ0QW1vdW50Jyk7XG5hc3NlcnRSZWNvcmQocmlnaHRBbW91bnQsJ3JpZ2h0QW1vdW50Jyk7XG5jb25zdHt2YWx1ZTpsZWZ0VmFsdWUsYnJhbmQ6bGVmdEJyYW5kfT1sZWZ0QW1vdW50O1xuY29uc3R7dmFsdWU6cmlnaHRWYWx1ZSxicmFuZDpyaWdodEJyYW5kfT1yaWdodEFtb3VudDtcbmFzc2VydFJlbW90YWJsZShsZWZ0QnJhbmQsJ2xlZnRCcmFuZCcpO1xuYXNzZXJ0UmVtb3RhYmxlKHJpZ2h0QnJhbmQsJ3JpZ2h0QnJhbmQnKTtcbm9wdGlvbmFsQnJhbmRDaGVjayhsZWZ0QnJhbmQsYnJhbmQpO1xub3B0aW9uYWxCcmFuZENoZWNrKHJpZ2h0QnJhbmQsYnJhbmQpO1xubGVmdEJyYW5kPT09cmlnaHRCcmFuZHx8XG5GYWlsIGBCcmFuZHMgaW4gbGVmdCAke3EobGVmdEJyYW5kKX0gYW5kIHJpZ2h0ICR7cShcbnJpZ2h0QnJhbmQpXG4gfSBzaG91bGQgbWF0Y2ggYnV0IGRvIG5vdGA7XG5jb25zdCBsZWZ0SGVscGVycz1hc3NlcnRWYWx1ZUdldEhlbHBlcnMobGVmdFZhbHVlKTtcbmNvbnN0IHJpZ2h0SGVscGVycz1hc3NlcnRWYWx1ZUdldEhlbHBlcnMocmlnaHRWYWx1ZSk7XG5sZWZ0SGVscGVycz09PXJpZ2h0SGVscGVyc3x8XG5GYWlsIGBUaGUgbGVmdCAke2xlZnRBbW91bnR9IGFuZCByaWdodCBhbW91bnQgJHtyaWdodEFtb3VudH0gaGFkIGRpZmZlcmVudCBhc3NldEtpbmRzYDtcbnJldHVybiBsZWZ0SGVscGVycztcbiB9O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAcGFyYW0ge01hdGhIZWxwZXJzPEFzc2V0VmFsdWVGb3JLaW5kPEs+Pn0gaFxuICogQHBhcmFtIHtBbW91bnQ8Sz59IGxlZnRBbW91bnRcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSByaWdodEFtb3VudFxuICogQHJldHVybnMge1tLLCBLXX1cbiAqL1xuY29uc3QgY29lcmNlTFI9KGgsbGVmdEFtb3VudCxyaWdodEFtb3VudCk9Pntcbi8qIEB0cy1leHBlY3QtZXJyb3IgY291bGQgYmUgYXJiaXRyYXJ5IHN1YnR5cGUqL1xucmV0dXJuW2guZG9Db2VyY2UobGVmdEFtb3VudC52YWx1ZSksaC5kb0NvZXJjZShyaWdodEFtb3VudC52YWx1ZSldO1xuIH07XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBsZWZ0QW1vdW50IGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgcmlnaHRBbW91bnQuXG4gKiBUaGUgbm90aW9uIG9mIFwiZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvXCIgZGVwZW5kcyBvbiB0aGUga2luZCBvZiBhbW91bnQsIGFzXG4gKiBkZWZpbmVkIGJ5IHRoZSBNYXRoSGVscGVycy4gRm9yIGV4YW1wbGUsIHdoZXRoZXIgcmVjdGFuZ2xlIEEgaXMgZ3JlYXRlciB0aGFuXG4gKiByZWN0YW5nbGUgQiBkZXBlbmRzIG9uIHdoZXRoZXIgcmVjdGFuZ2xlIEEgaW5jbHVkZXMgcmVjdGFuZ2xlIEIgYXMgZGVmaW5lZCBieVxuICogdGhlIGxvZ2ljIGluIE1hdGhIZWxwZXJzLlxuICpcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gbGVmdEFtb3VudFxuICogQHBhcmFtIHtBbW91bnQ8Sz59IHJpZ2h0QW1vdW50XG4gKiBAcGFyYW0ge0JyYW5kPEs+fSBbYnJhbmRdXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgaXNHVEU9KGxlZnRBbW91bnQscmlnaHRBbW91bnQsYnJhbmQ9dW5kZWZpbmVkKT0+e1xuY29uc3QgaD1jaGVja0xSQW5kR2V0SGVscGVycyhsZWZ0QW1vdW50LHJpZ2h0QW1vdW50LGJyYW5kKTtcbnJldHVybiBoLmRvSXNHVEUoLi4uY29lcmNlTFIoaCxsZWZ0QW1vdW50LHJpZ2h0QW1vdW50KSk7XG4gfTtcblxuLyoqXG4gKiBMb2dpYyBmb3IgbWFuaXB1bGF0aW5nIGFtb3VudHMuXG4gKlxuICogQW1vdW50cyBhcmUgdGhlIGNhbm9uaWNhbCBkZXNjcmlwdGlvbiBvZiB0cmFkYWJsZSBnb29kcy4gVGhleSBhcmUgbWFuaXB1bGF0ZWRcbiAqIGJ5IGlzc3VlcnMgYW5kIG1pbnRzLCBhbmQgcmVwcmVzZW50IHRoZSBnb29kcyBhbmQgY3VycmVuY3kgY2FycmllZCBieSBwdXJzZXNcbiAqIGFuZCBwYXltZW50cy4gVGhleSBjYW4gYmUgdXNlZCB0byByZXByZXNlbnQgdGhpbmdzIGxpa2UgY3VycmVuY3ksIHN0b2NrLCBhbmRcbiAqIHRoZSBhYnN0cmFjdCByaWdodCB0byBwYXJ0aWNpcGF0ZSBpbiBhIHBhcnRpY3VsYXIgZXhjaGFuZ2UuXG4gKi9cbmNvbnN0IEFtb3VudE1hdGg9e1xuLyoqXG4gKiBNYWtlIGFuIGFtb3VudCBmcm9tIGEgdmFsdWUgYnkgYWRkaW5nIHRoZSBicmFuZC5cbiAqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQHBhcmFtIHtCcmFuZDxLPn0gYnJhbmRcbiAqIEBwYXJhbSB7QXNzZXRWYWx1ZUZvcktpbmQ8Sz59IGFsbGVnZWRWYWx1ZVxuICogQHJldHVybnMge0Ftb3VudDxLPn1cbiAqL1xuLyogYWxsZWdlZFZhbHVlIGhhcyBhIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24gZm9yIHR5cGUgd2lkZW5pbmcsIHRvIHByZXZlbnQgViBiZWluZyBib3VuZCB0byBhIGEgbGl0ZXJhbCBsaWtlIDFuKi9cbm1ha2U6KGJyYW5kLGFsbGVnZWRWYWx1ZSk9PntcbmFzc2VydFJlbW90YWJsZShicmFuZCwnYnJhbmQnKTtcbmNvbnN0IGg9YXNzZXJ0VmFsdWVHZXRIZWxwZXJzKGFsbGVnZWRWYWx1ZSk7XG5jb25zdCB2YWx1ZT1oLmRvQ29lcmNlKGFsbGVnZWRWYWx1ZSk7XG5yZXR1cm4gaGFyZGVuKHticmFuZCx2YWx1ZX0pO1xuIH0sXG4vKipcbiAqIE1ha2Ugc3VyZSB0aGlzIGFtb3VudCBpcyB2YWxpZCBlbm91Z2gsIGFuZCByZXR1cm4gYSBjb3JyZXNwb25kaW5nIHZhbGlkXG4gKiBhbW91bnQgaWYgc28uXG4gKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7QnJhbmQ8Sz59IGJyYW5kXG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gYWxsZWdlZEFtb3VudFxuICogQHJldHVybnMge0Ftb3VudDxLPn1cbiAqL1xuY29lcmNlOihicmFuZCxhbGxlZ2VkQW1vdW50KT0+e1xuYXNzZXJ0UmVtb3RhYmxlKGJyYW5kLCdicmFuZCcpO1xuYXNzZXJ0UmVjb3JkKGFsbGVnZWRBbW91bnQsJ2Ftb3VudCcpO1xuY29uc3R7YnJhbmQ6YWxsZWdlZEJyYW5kLHZhbHVlOmFsbGVnZWRWYWx1ZX09YWxsZWdlZEFtb3VudDtcbmJyYW5kPT09YWxsZWdlZEJyYW5kfHxcbkZhaWwgYFRoZSBicmFuZCBpbiB0aGUgYWxsZWdlZEFtb3VudCAke2FsbGVnZWRBbW91bnR9IGluICdjb2VyY2UnIGRpZG4ndCBtYXRjaCB0aGUgc3BlY2lmaWVkIGJyYW5kICR7YnJhbmR9LmA7XG4vKiBXaWxsIHRocm93IG9uIGluYXBwcm9wcmlhdGUgdmFsdWUqL1xucmV0dXJuIEFtb3VudE1hdGgubWFrZShicmFuZCxhbGxlZ2VkVmFsdWUpO1xuIH0sXG4vKipcbiAqIEV4dHJhY3QgYW5kIHJldHVybiB0aGUgdmFsdWUuXG4gKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7QnJhbmQ8Sz59IGJyYW5kXG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gYW1vdW50XG4gKiBAcmV0dXJucyB7QXNzZXRWYWx1ZUZvcktpbmQ8Sz59XG4gKi9cbmdldFZhbHVlOihicmFuZCxhbW91bnQpPT5BbW91bnRNYXRoLmNvZXJjZShicmFuZCxhbW91bnQpLnZhbHVlLFxuLyoqXG4gKiBSZXR1cm4gdGhlIGFtb3VudCByZXByZXNlbnRpbmcgYW4gZW1wdHkgYW1vdW50LiBUaGlzIGlzIHRoZSBpZGVudGl0eVxuICogZWxlbWVudCBmb3IgTWF0aEhlbHBlcnMuYWRkIGFuZCBNYXRIZWxwZXJzLnN1YnRyYWN0LlxuICpcbiAqIEB0eXBlIHt7XG4gKiAgIChicmFuZDogQnJhbmQpOiBBbW91bnQ8J25hdCc+O1xuICogICA8SyBleHRlbmRzIEFzc2V0S2luZD4oYnJhbmQ6IEJyYW5kLCBhc3NldEtpbmQ6IEspOiBBbW91bnQ8Sz47XG4gKiB9fVxuICovXG5tYWtlRW1wdHk6KGJyYW5kLGFzc2V0S2luZD0vKiogQHR5cGUge2NvbnN0fSAqLyduYXQnKT0+e1xuYXNzZXJ0UmVtb3RhYmxlKGJyYW5kLCdicmFuZCcpO1xuYXNzZXJ0QXNzZXRLaW5kKGFzc2V0S2luZCk7XG5jb25zdCB2YWx1ZT1oZWxwZXJzW2Fzc2V0S2luZF0uZG9NYWtlRW1wdHkoKTtcbnJldHVybiBoYXJkZW4oe2JyYW5kLHZhbHVlfSk7XG4gfSxcbi8qKlxuICogUmV0dXJuIHRoZSBhbW91bnQgcmVwcmVzZW50aW5nIGFuIGVtcHR5IGFtb3VudCwgdXNpbmcgYW5vdGhlciBhbW91bnQgYXMgdGhlXG4gKiB0ZW1wbGF0ZSBmb3IgdGhlIGJyYW5kIGFuZCBhc3NldEtpbmQuXG4gKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSBhbW91bnRcbiAqIEByZXR1cm5zIHtBbW91bnQ8Sz59XG4gKi9cbm1ha2VFbXB0eUZyb21BbW91bnQ6KGFtb3VudCk9PntcbmFzc2VydFJlY29yZChhbW91bnQsJ2Ftb3VudCcpO1xuY29uc3R7YnJhbmQsdmFsdWV9PWFtb3VudDtcbi8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCovXG5jb25zdCBhc3NldEtpbmQ9YXNzZXJ0VmFsdWVHZXRBc3NldEtpbmQodmFsdWUpO1xuLyogQHRzLWV4cGVjdC1lcnJvciBjYXN0IChpZ25vcmUgYi9jIGVycm9yaW5nIGluIENJIGJ1dCBub3QgbXkgSURFKSovXG5yZXR1cm4gQW1vdW50TWF0aC5tYWtlRW1wdHkoYnJhbmQsYXNzZXRLaW5kKTtcbiB9LFxuLyoqXG4gKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgQW1vdW50IGlzIGVtcHR5LiBPdGhlcndpc2UgZmFsc2UuXG4gKlxuICogQHBhcmFtIHtBbW91bnR9IGFtb3VudFxuICogQHBhcmFtIHtCcmFuZH0gW2JyYW5kXVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmlzRW1wdHk6KGFtb3VudCxicmFuZD11bmRlZmluZWQpPT57XG5hc3NlcnRSZWNvcmQoYW1vdW50LCdhbW91bnQnKTtcbmNvbnN0e2JyYW5kOmFsbGVnZWRCcmFuZCx2YWx1ZX09YW1vdW50O1xuYXNzZXJ0UmVtb3RhYmxlKGFsbGVnZWRCcmFuZCwnYnJhbmQnKTtcbm9wdGlvbmFsQnJhbmRDaGVjayhhbGxlZ2VkQnJhbmQsYnJhbmQpO1xuY29uc3QgaD1hc3NlcnRWYWx1ZUdldEhlbHBlcnModmFsdWUpO1xucmV0dXJuIGguZG9Jc0VtcHR5KGguZG9Db2VyY2UodmFsdWUpKTtcbiB9LFxuaXNHVEUsXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgbGVmdEFtb3VudCBlcXVhbHMgdGhlIHJpZ2h0QW1vdW50LiBXZSBhc3N1bWUgdGhhdCBpZlxuICogaXNHVEUgaXMgdHJ1ZSBpbiBib3RoIGRpcmVjdGlvbnMsIGlzRXF1YWwgaXMgYWxzbyB0cnVlXG4gKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSBsZWZ0QW1vdW50XG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gcmlnaHRBbW91bnRcbiAqIEBwYXJhbSB7QnJhbmQ8Sz59IFticmFuZF1cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5pc0VxdWFsOihsZWZ0QW1vdW50LHJpZ2h0QW1vdW50LGJyYW5kPXVuZGVmaW5lZCk9PntcbmNvbnN0IGg9Y2hlY2tMUkFuZEdldEhlbHBlcnMobGVmdEFtb3VudCxyaWdodEFtb3VudCxicmFuZCk7XG5yZXR1cm4gaC5kb0lzRXF1YWwoLi4uY29lcmNlTFIoaCxsZWZ0QW1vdW50LHJpZ2h0QW1vdW50KSk7XG4gfSxcbi8qKlxuICogUmV0dXJucyBhIG5ldyBhbW91bnQgdGhhdCBpcyB0aGUgdW5pb24gb2YgYm90aCBsZWZ0QW1vdW50IGFuZCByaWdodEFtb3VudC5cbiAqXG4gKiBGb3IgZnVuZ2libGUgYW1vdW50IHRoaXMgbWVhbnMgYWRkaW5nIHRoZSB2YWx1ZXMuIEZvciBvdGhlciBraW5kcyBvZlxuICogYW1vdW50LCBpdCB1c3VhbGx5IG1lYW5zIGluY2x1ZGluZyBhbGwgb2YgdGhlIGVsZW1lbnRzIGZyb20gYm90aCBsZWZ0IGFuZFxuICogcmlnaHQuXG4gKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSBsZWZ0QW1vdW50XG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gcmlnaHRBbW91bnRcbiAqIEBwYXJhbSB7QnJhbmQ8Sz59IFticmFuZF1cbiAqIEByZXR1cm5zIHtBbW91bnQ8Sz59XG4gKi9cbmFkZDoobGVmdEFtb3VudCxyaWdodEFtb3VudCxicmFuZD11bmRlZmluZWQpPT57XG5jb25zdCBoPWNoZWNrTFJBbmRHZXRIZWxwZXJzKGxlZnRBbW91bnQscmlnaHRBbW91bnQsYnJhbmQpO1xuY29uc3QgdmFsdWU9aC5kb0FkZCguLi5jb2VyY2VMUihoLGxlZnRBbW91bnQscmlnaHRBbW91bnQpKTtcbnJldHVybiBoYXJkZW4oe2JyYW5kOmxlZnRBbW91bnQuYnJhbmQsdmFsdWV9KTtcbiB9LFxuLyoqXG4gKiBSZXR1cm5zIGEgbmV3IGFtb3VudCB0aGF0IGlzIHRoZSBsZWZ0QW1vdW50IG1pbnVzIHRoZSByaWdodEFtb3VudCAoaS5lLlxuICogZXZlcnl0aGluZyBpbiB0aGUgbGVmdEFtb3VudCB0aGF0IGlzIG5vdCBpbiB0aGUgcmlnaHRBbW91bnQpLiBJZiBsZWZ0QW1vdW50XG4gKiBkb2Vzbid0IGluY2x1ZGUgcmlnaHRBbW91bnQgKHN1YnRyYWN0aW9uIHJlc3VsdHMgaW4gYSBuZWdhdGl2ZSksIHRocm93IGFuXG4gKiBlcnJvci4gQmVjYXVzZSB0aGUgbGVmdCBhbW91bnQgbXVzdCBpbmNsdWRlIHRoZSByaWdodCBhbW91bnQsIHRoaXMgaXMgTk9UXG4gKiBlcXVpdmFsZW50IHRvIHNldCBzdWJ0cmFjdGlvbi5cbiAqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQHBhcmFtIHtBbW91bnQ8Sz59IGxlZnRBbW91bnRcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSByaWdodEFtb3VudFxuICogQHBhcmFtIHtCcmFuZDxLPn0gW2JyYW5kXVxuICogQHJldHVybnMge0Ftb3VudDxLPn1cbiAqL1xuc3VidHJhY3Q6KGxlZnRBbW91bnQscmlnaHRBbW91bnQsYnJhbmQ9dW5kZWZpbmVkKT0+e1xuY29uc3QgaD1jaGVja0xSQW5kR2V0SGVscGVycyhsZWZ0QW1vdW50LHJpZ2h0QW1vdW50LGJyYW5kKTtcbmNvbnN0IHZhbHVlPWguZG9TdWJ0cmFjdCguLi5jb2VyY2VMUihoLGxlZnRBbW91bnQscmlnaHRBbW91bnQpKTtcbnJldHVybiBoYXJkZW4oe2JyYW5kOmxlZnRBbW91bnQuYnJhbmQsdmFsdWV9KTtcbiB9LFxuLyoqXG4gKiBSZXR1cm5zIHRoZSBtaW4gdmFsdWUgYmV0d2VlbiB4IGFuZCB5IHVzaW5nIGlzR1RFXG4gKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSB4XG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0geVxuICogQHBhcmFtIHtCcmFuZDxLPn0gW2JyYW5kXVxuICogQHJldHVybnMge0Ftb3VudDxLPn1cbiAqL1xubWluOih4LHksYnJhbmQ9dW5kZWZpbmVkKT0+XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmVzdGVkLXRlcm5hcnkqL1xuaXNHVEUoeCx5LGJyYW5kKT9cbnk6XG5pc0dURSh5LHgsYnJhbmQpP1xueDpcbkZhaWwgYCR7eH0gYW5kICR7eX0gYXJlIGluY29tcGFyYWJsZWAsXG4vKipcbiAqIFJldHVybnMgdGhlIG1heCB2YWx1ZSBiZXR3ZWVuIHggYW5kIHkgdXNpbmcgaXNHVEVcbiAqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQHBhcmFtIHtBbW91bnQ8Sz59IHhcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSB5XG4gKiBAcGFyYW0ge0JyYW5kPEs+fSBbYnJhbmRdXG4gKiBAcmV0dXJucyB7QW1vdW50PEs+fVxuICovXG5tYXg6KHgseSxicmFuZD11bmRlZmluZWQpPT5cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXN0ZWQtdGVybmFyeSovXG5pc0dURSh4LHksYnJhbmQpP1xueDpcbmlzR1RFKHkseCk/XG55OlxuRmFpbCBgJHt4fSBhbmQgJHt5fSBhcmUgaW5jb21wYXJhYmxlYH07JGjigI1fb25jZS5BbW91bnRNYXRoKEFtb3VudE1hdGgpO1xuXG5oYXJkZW4oQW1vdW50TWF0aCk7XG5cbi8qKiBAcGFyYW0ge0Ftb3VudH0gYW1vdW50ICovXG5jb25zdCBnZXRBc3NldEtpbmQ9KGFtb3VudCk9PntcbmFzc2VydFJlY29yZChhbW91bnQsJ2Ftb3VudCcpO1xuY29uc3R7dmFsdWV9PWFtb3VudDtcbi8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCAoaWdub3JlIGIvYyBlcnJvcmluZyBpbiBDSSBidXQgbm90IG15IElERSkqL1xucmV0dXJuIGFzc2VydFZhbHVlR2V0QXNzZXRLaW5kKHZhbHVlKTtcbiB9OyRo4oCNX29uY2UuZ2V0QXNzZXRLaW5kKGdldEFzc2V0S2luZCk7XG5oYXJkZW4oZ2V0QXNzZXRLaW5kKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJBc3NldEtpbmQiOlsiQXNzZXRLaW5kIl0sImFzc2VydEFzc2V0S2luZCI6WyJhc3NlcnRBc3NldEtpbmQiXSwiQW1vdW50TWF0aCI6WyJBbW91bnRNYXRoIl0sImdldEFzc2V0S2luZCI6WyJnZXRBc3NldEtpbmQiXSwiYXNzZXJ0VmFsdWVHZXRIZWxwZXJzIjpbImFzc2VydFZhbHVlR2V0SGVscGVycyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADAS0Jf1QUAANUFAAAnAAAAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL2Rpc3BsYXlJbmZvLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvYXNzZXJ0IiwiQGFnb3JpYy9zdG9yZSIsIi4vdHlwZUd1YXJkcy5qcyJdLCJleHBvcnRzIjpbImNvZXJjZURpc3BsYXlJbmZvIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEZhaWwsbXVzdE1hdGNoLERpc3BsYXlJbmZvU2hhcGU7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9hc3NlcnRcIiwgW1tcIkZhaWxcIiwgWyRo4oCNX2EgPT4gKEZhaWwgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wibXVzdE1hdGNoXCIsIFskaOKAjV9hID0+IChtdXN0TWF0Y2ggPSAkaOKAjV9hKV1dXV0sW1wiLi90eXBlR3VhcmRzLmpzXCIsIFtbXCJEaXNwbGF5SW5mb1NoYXBlXCIsIFskaOKAjV9hID0+IChEaXNwbGF5SW5mb1NoYXBlID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG4vKipcbiAqIEBwYXJhbSB7QWRkaXRpb25hbERpc3BsYXlJbmZvfSBhbGxlZ2VkRGlzcGxheUluZm9cbiAqIEBwYXJhbSB7QXNzZXRLaW5kfSBhc3NldEtpbmRcbiAqIEByZXR1cm5zIHtEaXNwbGF5SW5mb31cbiAqL1xuY29uc3QgICAgICAgIGNvZXJjZURpc3BsYXlJbmZvPShhbGxlZ2VkRGlzcGxheUluZm8sYXNzZXRLaW5kKT0+e1xubXVzdE1hdGNoKGFsbGVnZWREaXNwbGF5SW5mbyxEaXNwbGF5SW5mb1NoYXBlLCdkaXNwbGF5SW5mbycpO1xuXG5pZihhbGxlZ2VkRGlzcGxheUluZm8uYXNzZXRLaW5kIT09dW5kZWZpbmVkKXtcbmFsbGVnZWREaXNwbGF5SW5mby5hc3NldEtpbmQ9PT1hc3NldEtpbmR8fFxuRmFpbCBgZGlzcGxheUluZm8uYXNzZXRLaW5kIHdhcyBwcmVzZW50ICgke2FsbGVnZWREaXNwbGF5SW5mby5hc3NldEtpbmR9KSBhbmQgZGlkIG5vdCBtYXRjaCB0aGUgYXNzZXRLaW5kIGFyZ3VtZW50ICgke2Fzc2V0S2luZH0pYDtcbiB9XG5jb25zdCBkaXNwbGF5SW5mbz1oYXJkZW4oey4uLmFsbGVnZWREaXNwbGF5SW5mbyxhc3NldEtpbmR9KTtcblxuaWYoZGlzcGxheUluZm8uZGVjaW1hbFBsYWNlcyE9PXVuZGVmaW5lZCl7XG5OdW1iZXIuaXNTYWZlSW50ZWdlcihkaXNwbGF5SW5mby5kZWNpbWFsUGxhY2VzKXx8XG5GYWlsIGBkZWNpbWFsUGxhY2VzICR7ZGlzcGxheUluZm8uZGVjaW1hbFBsYWNlc30gaXMgbm90IGEgc2FmZSBpbnRlZ2VyYDtcbiB9XG5cbnJldHVybiBkaXNwbGF5SW5mbztcbiB9OyRo4oCNX29uY2UuY29lcmNlRGlzcGxheUluZm8oY29lcmNlRGlzcGxheUluZm8pO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImNvZXJjZURpc3BsYXlJbmZvIjpbImNvZXJjZURpc3BsYXlJbmZvIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEMwe9zoAQAA6AEAACEAAABAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvaW5kZXguanN7ImltcG9ydHMiOlsiLi9hbW91bnRNYXRoLmpzIiwiLi9pc3N1ZXJLaXQuanMiLCIuL3R5cGVHdWFyZHMuanMiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6WyIuL2Ftb3VudE1hdGguanMiLCIuL2lzc3VlcktpdC5qcyIsIi4vdHlwZUd1YXJkcy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIi4vYW1vdW50TWF0aC5qc1wiLCBbXV0sW1wiLi9pc3N1ZXJLaXQuanNcIiwgW11dLFtcIi4vdHlwZUd1YXJkcy5qc1wiLCBbXV1dKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAI7Ex6cgvAADILwAAJQAAAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9pc3N1ZXJLaXQuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9hc3NlcnQiLCJAYWdvcmljL3N0b3JlIiwiQGFnb3JpYy92YXQtZGF0YSIsIi4vYW1vdW50TWF0aC5qcyIsIi4vZGlzcGxheUluZm8uanMiLCIuL3BheW1lbnRMZWRnZXIuanMiLCIuL3R5cGVzLWFtYmllbnQuanMiXSwiZXhwb3J0cyI6WyJoYXNJc3N1ZXIiLCJtYWtlRHVyYWJsZUlzc3VlcktpdCIsIm1ha2VJc3N1ZXJLaXQiLCJwcmVwYXJlSXNzdWVyS2l0IiwidXBncmFkZUlzc3VlcktpdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnQsYXNzZXJ0UGF0dGVybixtYWtlU2NhbGFyQmlnTWFwU3RvcmUsQXNzZXRLaW5kLGFzc2VydEFzc2V0S2luZCxjb2VyY2VEaXNwbGF5SW5mbyxwcmVwYXJlUGF5bWVudExlZGdlcjskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL2Fzc2VydFwiLCBbW1wiYXNzZXJ0XCIsIFskaOKAjV9hID0+IChhc3NlcnQgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiYXNzZXJ0UGF0dGVyblwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UGF0dGVybiA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJtYWtlU2NhbGFyQmlnTWFwU3RvcmVcIiwgWyRo4oCNX2EgPT4gKG1ha2VTY2FsYXJCaWdNYXBTdG9yZSA9ICRo4oCNX2EpXV1dXSxbXCIuL2Ftb3VudE1hdGguanNcIiwgW1tcIkFzc2V0S2luZFwiLCBbJGjigI1fYSA9PiAoQXNzZXRLaW5kID0gJGjigI1fYSldXSxbXCJhc3NlcnRBc3NldEtpbmRcIiwgWyRo4oCNX2EgPT4gKGFzc2VydEFzc2V0S2luZCA9ICRo4oCNX2EpXV1dXSxbXCIuL2Rpc3BsYXlJbmZvLmpzXCIsIFtbXCJjb2VyY2VEaXNwbGF5SW5mb1wiLCBbJGjigI1fYSA9PiAoY29lcmNlRGlzcGxheUluZm8gPSAkaOKAjV9hKV1dXV0sW1wiLi9wYXltZW50TGVkZ2VyLmpzXCIsIFtbXCJwcmVwYXJlUGF5bWVudExlZGdlclwiLCBbJGjigI1fYSA9PiAocHJlcGFyZVBheW1lbnRMZWRnZXIgPSAkaOKAjV9hKV1dXV0sW1wiLi90eXBlcy1hbWJpZW50LmpzXCIsIFtdXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qIFRPRE8gV2h5IGRvZXMgVHlwZVNjcmlwdCBsb3NlIHRoZSBgTWFwU3RvcmVgIHR5cGluZyBvZiBgQmFnZ2FnZWAgaGVyZSwgZXZlbiovXG4vKiB0aG91Z2ggaXQga25vd3MgdGhlIGNvcnJlY3QgdHlwZSBhdCB0aGUgZXhwb3J0aW5nIGBAYWdvcmljL3ZhdC1kYXRhYCovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BhZ29yaWMvdmF0LWRhdGEnKS5CYWdnYWdlfSBCYWdnYWdlICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEB0eXBlZGVmIHtvYmplY3R9IElzc3VlclJlY29yZFxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWVcbiAqIEBwcm9wZXJ0eSB7S30gYXNzZXRLaW5kXG4gKiBAcHJvcGVydHkge0FkZGl0aW9uYWxEaXNwbGF5SW5mb30gZGlzcGxheUluZm9cbiAqIEBwcm9wZXJ0eSB7UGF0dGVybn0gZWxlbWVudFNoYXBlXG4gKi9cblxuLyoqXG4gKiBVc2VkIF9vbmx5XyBpbnRlcm5hbGx5LCB0byBtYWtlIGEgbmV3IGlzc3VlcktpdCBvciB0byByZXZpdmUgYW4gb2xkIG9uZS5cbiAqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQHBhcmFtIHtJc3N1ZXJSZWNvcmQ8Sz59IGlzc3VlclJlY29yZFxuICogQHBhcmFtIHtCYWdnYWdlfSBpc3N1ZXJCYWdnYWdlXG4gKiBAcGFyYW0ge1NodXRkb3duV2l0aEZhaWx1cmV9IFtvcHRTaHV0ZG93bldpdGhGYWlsdXJlXSBJZiB0aGlzIGlzc3VlciBmYWlscyBpblxuICogICB0aGUgbWlkZGxlIG9mIGFuIGF0b21pYyBhY3Rpb24gKHdoaWNoIGJ0dyBzaG91bGQgbmV2ZXIgaGFwcGVuKSwgaXRcbiAqICAgcG90ZW50aWFsbHkgbGVhdmVzIGl0cyBsZWRnZXIgaW4gYSBjb3JydXB0ZWQgc3RhdGUuIElmIHRoaXMgZnVuY3Rpb24gd2FzXG4gKiAgIHByb3ZpZGVkLCB0aGVuIHRoZSBmYWlsZWQgYXRvbWljIGFjdGlvbiB3aWxsIGNhbGwgaXQsIHNvIHRoYXQgc29tZSBsYXJnZXJcbiAqICAgdW5pdCBvZiBjb21wdXRhdGlvbiwgbGlrZSB0aGUgZW5jbG9zaW5nIHZhdCwgY2FuIGJlIHNodXRkb3duIGJlZm9yZVxuICogICBhbnl0aGluZyBlbHNlIGlzIGNvcnJ1cHRlZCBieSB0aGF0IGNvcnJ1cHRlZCBzdGF0ZS4gU2VlXG4gKiAgIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMzQzNFxuICogQHJldHVybnMge0lzc3VlcktpdDxLPn1cbiAqL1xuY29uc3Qgc2V0dXBJc3N1ZXJLaXQ9KFxue25hbWUsYXNzZXRLaW5kLGRpc3BsYXlJbmZvLGVsZW1lbnRTaGFwZX0sXG5pc3N1ZXJCYWdnYWdlLFxub3B0U2h1dGRvd25XaXRoRmFpbHVyZT11bmRlZmluZWQpPT5cbntcbmFzc2VydC50eXBlb2YobmFtZSwnc3RyaW5nJyk7XG5hc3NlcnRBc3NldEtpbmQoYXNzZXRLaW5kKTtcblxuLyogQWRkIGFzc2V0S2luZCB0byBkaXNwbGF5SW5mbywgb3Igb3ZlcnJpZGUgaWYgcHJlc2VudCovXG5jb25zdCBjbGVhbkRpc3BsYXlJbmZvPWNvZXJjZURpc3BsYXlJbmZvKGRpc3BsYXlJbmZvLGFzc2V0S2luZCk7XG5pZihvcHRTaHV0ZG93bldpdGhGYWlsdXJlIT09dW5kZWZpbmVkKXtcbmFzc2VydC50eXBlb2Yob3B0U2h1dGRvd25XaXRoRmFpbHVyZSwnZnVuY3Rpb24nKTtcbiB9XG5cbmlmKGVsZW1lbnRTaGFwZSE9PXVuZGVmaW5lZCl7XG5hc3NlcnRQYXR0ZXJuKGVsZW1lbnRTaGFwZSk7XG4gfVxuXG4vKiBBdHRlbnVhdGUgdGhlIHBvd2VyZnVsIGF1dGhvcml0eSB0byBtaW50IGFuZCBjaGFuZ2UgYmFsYW5jZXMqL1xuLyoqIEB0eXBlIHtQYXltZW50TGVkZ2VyPEs+fSAqL1xuLyogQHRzLWV4cGVjdC1lcnJvciBjb3VsZCBiZSBpbnN0YW50aWF0ZWQgd2l0aCBkaWZmZXJlbnQgc3VidHlwZSBvZiBBc3NldEtpbmQqL1xuY29uc3R7aXNzdWVyLG1pbnQsYnJhbmQsbWludFJlY292ZXJ5UHVyc2V9PXByZXBhcmVQYXltZW50TGVkZ2VyKFxuaXNzdWVyQmFnZ2FnZSxcbm5hbWUsXG5hc3NldEtpbmQsXG5jbGVhbkRpc3BsYXlJbmZvLFxuZWxlbWVudFNoYXBlLFxub3B0U2h1dGRvd25XaXRoRmFpbHVyZSk7XG5cblxucmV0dXJuIGhhcmRlbih7XG5icmFuZCxcbmlzc3Vlcixcbm1pbnQsXG5taW50UmVjb3ZlcnlQdXJzZSxcbmRpc3BsYXlJbmZvOmNsZWFuRGlzcGxheUluZm99KTtcblxuIH07XG5oYXJkZW4oc2V0dXBJc3N1ZXJLaXQpO1xuXG4vKiogVGhlIGtleSBhdCB3aGljaCB0aGUgaXNzdWVyIHJlY29yZCBpcyBzdG9yZWQuICovXG5jb25zdCBJTlNUQU5DRV9LRVk9J2lzc3Vlcic7XG5cbi8qKlxuICogVXNlZCBfb25seV8gdG8gdXBncmFkZSBhIHByZWRlY2Vzc29yIGlzc3VlcktpdC4gVXNlIGBtYWtlRHVyYWJsZUlzc3VlcktpdGAgdG9cbiAqIG1ha2UgYSBuZXcgb25lLlxuICpcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGlzc3VlckJhZ2dhZ2VcbiAqIEBwYXJhbSB7U2h1dGRvd25XaXRoRmFpbHVyZX0gW29wdFNodXRkb3duV2l0aEZhaWx1cmVdIElmIHRoaXMgaXNzdWVyIGZhaWxzIGluXG4gKiAgIHRoZSBtaWRkbGUgb2YgYW4gYXRvbWljIGFjdGlvbiAod2hpY2ggYnR3IHNob3VsZCBuZXZlciBoYXBwZW4pLCBpdFxuICogICBwb3RlbnRpYWxseSBsZWF2ZXMgaXRzIGxlZGdlciBpbiBhIGNvcnJ1cHRlZCBzdGF0ZS4gSWYgdGhpcyBmdW5jdGlvbiB3YXNcbiAqICAgcHJvdmlkZWQsIHRoZW4gdGhlIGZhaWxlZCBhdG9taWMgYWN0aW9uIHdpbGwgY2FsbCBpdCwgc28gdGhhdCBzb21lIGxhcmdlclxuICogICB1bml0IG9mIGNvbXB1dGF0aW9uLCBsaWtlIHRoZSBlbmNsb3NpbmcgdmF0LCBjYW4gYmUgc2h1dGRvd24gYmVmb3JlXG4gKiAgIGFueXRoaW5nIGVsc2UgaXMgY29ycnVwdGVkIGJ5IHRoYXQgY29ycnVwdGVkIHN0YXRlLiBTZWVcbiAqICAgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8zNDM0XG4gKiBAcmV0dXJucyB7SXNzdWVyS2l0PEs+fVxuICovXG5jb25zdCAgICAgICAgdXBncmFkZUlzc3VlcktpdD0oXG5pc3N1ZXJCYWdnYWdlLFxub3B0U2h1dGRvd25XaXRoRmFpbHVyZT11bmRlZmluZWQpPT5cbntcbmNvbnN0IGlzc3VlclJlY29yZD1pc3N1ZXJCYWdnYWdlLmdldChJTlNUQU5DRV9LRVkpO1xucmV0dXJuIHNldHVwSXNzdWVyS2l0KGlzc3VlclJlY29yZCxpc3N1ZXJCYWdnYWdlLG9wdFNodXRkb3duV2l0aEZhaWx1cmUpO1xuIH07JGjigI1fb25jZS51cGdyYWRlSXNzdWVyS2l0KHVwZ3JhZGVJc3N1ZXJLaXQpO1xuaGFyZGVuKHVwZ3JhZGVJc3N1ZXJLaXQpO1xuXG4vKipcbiAqIERvZXMgYmFnZ2FnZSBhbHJlYWR5IGhhdmUgYW4gaXNzdWVyS2l0P1xuICpcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gYmFnZ2FnZVxuICovXG5jb25zdCAgICAgICAgaGFzSXNzdWVyPShiYWdnYWdlKT0+YmFnZ2FnZS5oYXMoSU5TVEFOQ0VfS0VZKTtcblxuLyoqXG4gKiBgZWxlbWVudFNoYXBlYCwgbWF5IG9ubHkgYmUgcHJlc2VudCBmb3IgY29sbGVjdGlvbi1zdHlsZSBhbW91bnRzLiBJZiBwcmVzZW50LFxuICogaXQgaXMgYSBgUGF0dGVybmAgdGhhdCBldmVyeSBlbGVtZW50IG9mIHRoaXMgaXNzdWVyS2l0cydzIGFtb3VudHMgbXVzdFxuICogc2F0aXNmeS4gRm9yIGV4YW1wbGUsIHRoZSBab2UgSW52aXRhdGlvbiBpc3N1ZXJLaXQgdXNlcyBhbiBlbGVtZW50U2hhcGVcbiAqIGRlc2NyaWJpbmcgdGhlIGludml0YXRpb24gZGV0YWlscyBmb3IgYW4gaW5kaXZpZHVhbCBpbnZpdGF0aW9uLiBBbiBpbnZpdGF0aW9uXG4gKiBwdXJzZSBvciBwYXltZW50IGhhcyBhbiBhbW91bnQgdGhhdCBjYW4gb25seSBiZSBhIHNldCBvZiB0aGVzZS4gKFRob3VnaFxuICogdHlwaWNhbGx5LCB0aGUgYW1vdW50IG9mIGFuIGludml0YXRpb24gcGF5bWVudCBpcyBhIHNpbmdsZXRvbiBzZXQuIFN1Y2ggYVxuICogcGF5bWVudCBpcyBvZnRlbiByZWZlcnJlZCB0byBpbiB0aGUgc2luZ3VsYXIgYXMgXCJhbiBpbnZpdGF0aW9uXCIuKVxuICpcbiAqIEB0eXBlZGVmIHtQYXJ0aWFsPHtcbiAqICAgZWxlbWVudFNoYXBlOiBQYXR0ZXJuO1xuICogfT59IElzc3Vlck9wdGlvbnNSZWNvcmRcbiAqL1xuXG4vKipcbiAqIFVzZWQgX29ubHlfIHRvIG1ha2UgYSBfbmV3XyBkdXJhYmxlIGlzc3VlciwgaS5lLiwgdGhlIGluaXRpYWwgaW5jYXJuYXRpb24gb2ZcbiAqIHRoYXQgaXNzdWVyLlxuICpcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLIFRoZSBuYW1lIGJlY29tZXMgcGFydCBvZiB0aGUgYnJhbmQgaW4gYXNzZXRcbiAqICAgZGVzY3JpcHRpb25zLiBUaGUgbmFtZSBpcyB1c2VmdWwgZm9yIGRlYnVnZ2luZyBhbmQgZG91YmxlLWNoZWNraW5nXG4gKiAgIGFzc3VtcHRpb25zLCBidXQgc2hvdWxkIG5vdCBiZSB0cnVzdGVkIHdydCBhbnkgZXh0ZXJuYWwgbmFtZXNwYWNlLiBGb3JcbiAqICAgZXhhbXBsZSwgYW55b25lIGNvdWxkIGNyZWF0ZSBhIG5ldyBpc3N1ZXIga2l0IHdpdGggbmFtZSAnQlRDJywgYnV0IGl0IGlzXG4gKiAgIG5vdCBiaXRjb2luIG9yIGV2ZW4gcmVsYXRlZC4gSXQgaXMgb25seSB0aGUgbmFtZSBhY2NvcmRpbmcgdG8gdGhhdCBpc3N1ZXJcbiAqICAgYW5kIGJyYW5kLlxuICpcbiAqICAgVGhlIGFzc2V0S2luZCB3aWxsIGJlIHVzZWQgdG8gaW1wb3J0IGEgc3BlY2lmaWMgbWF0aEhlbHBlcnMgZnJvbSB0aGVcbiAqICAgbWF0aEhlbHBlcnMgbGlicmFyeS4gRm9yIGV4YW1wbGUsIG5hdE1hdGhIZWxwZXJzLCB0aGUgZGVmYXVsdCwgaXMgdXNlZCBmb3JcbiAqICAgYmFzaWMgZnVuZ2libGUgdG9rZW5zLlxuICpcbiAqICAgYGRpc3BsYXlJbmZvYCBnaXZlcyBpbmZvcm1hdGlvbiB0byB0aGUgVUkgb24gaG93IHRvIGRpc3BsYXkgdGhlIGFtb3VudC5cbiAqIEBwYXJhbSB7QmFnZ2FnZX0gaXNzdWVyQmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7S30gW2Fzc2V0S2luZF1cbiAqIEBwYXJhbSB7QWRkaXRpb25hbERpc3BsYXlJbmZvfSBbZGlzcGxheUluZm9dXG4gKiBAcGFyYW0ge1NodXRkb3duV2l0aEZhaWx1cmV9IFtvcHRTaHV0ZG93bldpdGhGYWlsdXJlXSBJZiB0aGlzIGlzc3VlciBmYWlscyBpblxuICogICB0aGUgbWlkZGxlIG9mIGFuIGF0b21pYyBhY3Rpb24gKHdoaWNoIGJ0dyBzaG91bGQgbmV2ZXIgaGFwcGVuKSwgaXRcbiAqICAgcG90ZW50aWFsbHkgbGVhdmVzIGl0cyBsZWRnZXIgaW4gYSBjb3JydXB0ZWQgc3RhdGUuIElmIHRoaXMgZnVuY3Rpb24gd2FzXG4gKiAgIHByb3ZpZGVkLCB0aGVuIHRoZSBmYWlsZWQgYXRvbWljIGFjdGlvbiB3aWxsIGNhbGwgaXQsIHNvIHRoYXQgc29tZSBsYXJnZXJcbiAqICAgdW5pdCBvZiBjb21wdXRhdGlvbiwgbGlrZSB0aGUgZW5jbG9zaW5nIHZhdCwgY2FuIGJlIHNodXRkb3duIGJlZm9yZVxuICogICBhbnl0aGluZyBlbHNlIGlzIGNvcnJ1cHRlZCBieSB0aGF0IGNvcnJ1cHRlZCBzdGF0ZS4gU2VlXG4gKiAgIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMzQzNFxuICogQHBhcmFtIHtJc3N1ZXJPcHRpb25zUmVjb3JkfSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHtJc3N1ZXJLaXQ8Sz59XG4gKi8kaOKAjV9vbmNlLmhhc0lzc3VlcihoYXNJc3N1ZXIpO1xuY29uc3QgICAgICAgIG1ha2VEdXJhYmxlSXNzdWVyS2l0PShcbmlzc3VlckJhZ2dhZ2UsXG5uYW1lLFxuLyogQHRzLWV4cGVjdC1lcnJvciBLIGNvdWxkIGJlIGluc3RhbnRpYXRlZCB3aXRoIGEgZGlmZmVyZW50IHN1YnR5cGUgb2YgQXNzZXRLaW5kKi9cbmFzc2V0S2luZD1Bc3NldEtpbmQuTkFULFxuZGlzcGxheUluZm89aGFyZGVuKHt9KSxcbm9wdFNodXRkb3duV2l0aEZhaWx1cmU9dW5kZWZpbmVkLFxue2VsZW1lbnRTaGFwZT11bmRlZmluZWR9PXt9KT0+XG57XG5jb25zdCBpc3N1ZXJEYXRhPWhhcmRlbih7bmFtZSxhc3NldEtpbmQsZGlzcGxheUluZm8sZWxlbWVudFNoYXBlfSk7XG5pc3N1ZXJCYWdnYWdlLmluaXQoSU5TVEFOQ0VfS0VZLGlzc3VlckRhdGEpO1xucmV0dXJuIHNldHVwSXNzdWVyS2l0KGlzc3VlckRhdGEsaXNzdWVyQmFnZ2FnZSxvcHRTaHV0ZG93bldpdGhGYWlsdXJlKTtcbiB9OyRo4oCNX29uY2UubWFrZUR1cmFibGVJc3N1ZXJLaXQobWFrZUR1cmFibGVJc3N1ZXJLaXQpO1xuaGFyZGVuKG1ha2VEdXJhYmxlSXNzdWVyS2l0KTtcblxuLyoqXG4gKiBVc2VkIHRvIGVpdGhlciByZXZpdmUgYSBwcmVkZWNlc3NvciBpc3N1ZXJLaXQsIG9yIHRvIG1ha2UgYSBuZXcgZHVyYWJsZSBvbmVcbiAqIGlmIGl0IGlzIGFic2VudCwgYW5kIHRvIHBsYWNlIGl0IGluIGJhZ2dhZ2UgZm9yIHRoZSBuZXh0IHN1Y2Nlc3Nvci5cbiAqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gSyBUaGUgbmFtZSBiZWNvbWVzIHBhcnQgb2YgdGhlIGJyYW5kIGluIGFzc2V0XG4gKiAgIGRlc2NyaXB0aW9ucy4gVGhlIG5hbWUgaXMgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgYW5kIGRvdWJsZS1jaGVja2luZ1xuICogICBhc3N1bXB0aW9ucywgYnV0IHNob3VsZCBub3QgYmUgdHJ1c3RlZCB3cnQgYW55IGV4dGVybmFsIG5hbWVzcGFjZS4gRm9yXG4gKiAgIGV4YW1wbGUsIGFueW9uZSBjb3VsZCBjcmVhdGUgYSBuZXcgaXNzdWVyIGtpdCB3aXRoIG5hbWUgJ0JUQycsIGJ1dCBpdCBpc1xuICogICBub3QgYml0Y29pbiBvciBldmVuIHJlbGF0ZWQuIEl0IGlzIG9ubHkgdGhlIG5hbWUgYWNjb3JkaW5nIHRvIHRoYXQgaXNzdWVyXG4gKiAgIGFuZCBicmFuZC5cbiAqXG4gKiAgIFRoZSBhc3NldEtpbmQgd2lsbCBiZSB1c2VkIHRvIGltcG9ydCBhIHNwZWNpZmljIG1hdGhIZWxwZXJzIGZyb20gdGhlXG4gKiAgIG1hdGhIZWxwZXJzIGxpYnJhcnkuIEZvciBleGFtcGxlLCBuYXRNYXRoSGVscGVycywgdGhlIGRlZmF1bHQsIGlzIHVzZWQgZm9yXG4gKiAgIGJhc2ljIGZ1bmdpYmxlIHRva2Vucy5cbiAqXG4gKiAgIGBkaXNwbGF5SW5mb2AgZ2l2ZXMgaW5mb3JtYXRpb24gdG8gdGhlIFVJIG9uIGhvdyB0byBkaXNwbGF5IHRoZSBhbW91bnQuXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGlzc3VlckJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge0t9IFthc3NldEtpbmRdXG4gKiBAcGFyYW0ge0FkZGl0aW9uYWxEaXNwbGF5SW5mb30gW2Rpc3BsYXlJbmZvXVxuICogQHBhcmFtIHtTaHV0ZG93bldpdGhGYWlsdXJlfSBbb3B0U2h1dGRvd25XaXRoRmFpbHVyZV0gSWYgdGhpcyBpc3N1ZXIgZmFpbHMgaW5cbiAqICAgdGhlIG1pZGRsZSBvZiBhbiBhdG9taWMgYWN0aW9uICh3aGljaCBidHcgc2hvdWxkIG5ldmVyIGhhcHBlbiksIGl0XG4gKiAgIHBvdGVudGlhbGx5IGxlYXZlcyBpdHMgbGVkZ2VyIGluIGEgY29ycnVwdGVkIHN0YXRlLiBJZiB0aGlzIGZ1bmN0aW9uIHdhc1xuICogICBwcm92aWRlZCwgdGhlbiB0aGUgZmFpbGVkIGF0b21pYyBhY3Rpb24gd2lsbCBjYWxsIGl0LCBzbyB0aGF0IHNvbWUgbGFyZ2VyXG4gKiAgIHVuaXQgb2YgY29tcHV0YXRpb24sIGxpa2UgdGhlIGVuY2xvc2luZyB2YXQsIGNhbiBiZSBzaHV0ZG93biBiZWZvcmVcbiAqICAgYW55dGhpbmcgZWxzZSBpcyBjb3JydXB0ZWQgYnkgdGhhdCBjb3JydXB0ZWQgc3RhdGUuIFNlZVxuICogICBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzM0MzRcbiAqIEBwYXJhbSB7SXNzdWVyT3B0aW9uc1JlY29yZH0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7SXNzdWVyS2l0PEs+fVxuICovXG5jb25zdCAgICAgICAgcHJlcGFyZUlzc3VlcktpdD0oXG5pc3N1ZXJCYWdnYWdlLFxubmFtZSxcbi8qIEB0cy1leHBlY3QtZXJyb3IgSyBjb3VsZCBiZSBpbnN0YW50aWF0ZWQgd2l0aCBhIGRpZmZlcmVudCBzdWJ0eXBlIG9mIEFzc2V0S2luZCovXG5hc3NldEtpbmQ9QXNzZXRLaW5kLk5BVCxcbmRpc3BsYXlJbmZvPWhhcmRlbih7fSksXG5vcHRTaHV0ZG93bldpdGhGYWlsdXJlPXVuZGVmaW5lZCxcbm9wdGlvbnM9e30pPT5cbntcbmlmKGhhc0lzc3Vlcihpc3N1ZXJCYWdnYWdlKSl7XG5jb25zdHtlbGVtZW50U2hhcGU6Xz11bmRlZmluZWR9PW9wdGlvbnM7XG5jb25zdCBpc3N1ZXJLaXQ9dXBncmFkZUlzc3VlcktpdChpc3N1ZXJCYWdnYWdlLG9wdFNodXRkb3duV2l0aEZhaWx1cmUpO1xuXG4vKiBUT0RPIGNoZWNrIGNvbnNpc3RlbmN5IHdpdGggbmFtZSwgYXNzZXRLaW5kLCBkaXNwbGF5SW5mbywgZWxlbWVudFNoYXBlLiovXG4vKiBDb25zaXN0ZW5jeSBlaXRoZXIgbWVhbnMgdGhhdCB0aGVzZSBhcmUgdGhlIHNhbWUsIG9yIHRoYXQgdGhleSBkaWZmZXIqL1xuLyogaW4gYSBkaXJlY3Rpb24gd2UgYXJlIHByZXBhcmVkIHRvIHVwZ3JhZGUuKi9cblxuLyogQHRzLWV4cGVjdC1lcnJvciBUeXBlIHBhcmFtZXRlciBjb25mdXNpb24uKi9cbnJldHVybiBpc3N1ZXJLaXQ7XG4gfWVsc2V7XG5jb25zdCBpc3N1ZXJLaXQ9bWFrZUR1cmFibGVJc3N1ZXJLaXQoXG5pc3N1ZXJCYWdnYWdlLFxubmFtZSxcbmFzc2V0S2luZCxcbmRpc3BsYXlJbmZvLFxub3B0U2h1dGRvd25XaXRoRmFpbHVyZSxcbm9wdGlvbnMpO1xuXG5yZXR1cm4gaXNzdWVyS2l0O1xuIH1cbiB9OyRo4oCNX29uY2UucHJlcGFyZUlzc3VlcktpdChwcmVwYXJlSXNzdWVyS2l0KTtcbmhhcmRlbihwcmVwYXJlSXNzdWVyS2l0KTtcblxuLyoqXG4gKiBVc2VkIF9vbmx5XyB0byBtYWtlIGEgbmV3IGlzc3VlcktpdCB0aGF0IGlzIGVmZmVjdGl2ZWx5IG5vbi1kdXJhYmxlLiBUaGlzIGlzXG4gKiBjdXJyZW50bHkgZG9uZSBieSBtYWtpbmcgYSBkdXJhYmxlIG9uZSBpbiBhIGJhZ2dhZ2Ugbm90IHJlYWNoYWJsZSBmcm9tXG4gKiBhbnl3aGVyZS4gVE9ETyBPbmNlIHJlYnVpbHQgb24gem9uZXMsIHRoaXMgc2hvdWxkIGluc3RlYWQganVzdCBidWlsZCBvbiB0aGVcbiAqIHZpcnR1YWwgem9uZS4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9wdWxsLzcxMTZcbiAqXG4gKiBDdXJyZW50bHkgdXNlZCBmb3IgdGVzdGluZyBvbmx5LiBTaG91bGQgcHJvYmFibHkgY29udGludWUgdG8gYmUgdXNlZCBmb3JcbiAqIHRlc3Rpbmcgb25seS5cbiAqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9J25hdCddIFRoZSBuYW1lIGJlY29tZXMgcGFydCBvZiB0aGUgYnJhbmQgaW4gYXNzZXRcbiAqICAgZGVzY3JpcHRpb25zLiBUaGUgbmFtZSBpcyB1c2VmdWwgZm9yIGRlYnVnZ2luZyBhbmQgZG91YmxlLWNoZWNraW5nXG4gKiAgIGFzc3VtcHRpb25zLCBidXQgc2hvdWxkIG5vdCBiZSB0cnVzdGVkIHdydCBhbnkgZXh0ZXJuYWwgbmFtZXNwYWNlLiBGb3JcbiAqICAgZXhhbXBsZSwgYW55b25lIGNvdWxkIGNyZWF0ZSBhIG5ldyBpc3N1ZXIga2l0IHdpdGggbmFtZSAnQlRDJywgYnV0IGl0IGlzXG4gKiAgIG5vdCBiaXRjb2luIG9yIGV2ZW4gcmVsYXRlZC4gSXQgaXMgb25seSB0aGUgbmFtZSBhY2NvcmRpbmcgdG8gdGhhdCBpc3N1ZXJcbiAqICAgYW5kIGJyYW5kLlxuICpcbiAqICAgVGhlIGFzc2V0S2luZCB3aWxsIGJlIHVzZWQgdG8gaW1wb3J0IGEgc3BlY2lmaWMgbWF0aEhlbHBlcnMgZnJvbSB0aGVcbiAqICAgbWF0aEhlbHBlcnMgbGlicmFyeS4gRm9yIGV4YW1wbGUsIG5hdE1hdGhIZWxwZXJzLCB0aGUgZGVmYXVsdCwgaXMgdXNlZCBmb3JcbiAqICAgYmFzaWMgZnVuZ2libGUgdG9rZW5zLlxuICpcbiAqICAgYGRpc3BsYXlJbmZvYCBnaXZlcyBpbmZvcm1hdGlvbiB0byB0aGUgVUkgb24gaG93IHRvIGRpc3BsYXkgdGhlIGFtb3VudC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge0t9IFthc3NldEtpbmRdXG4gKiBAcGFyYW0ge0FkZGl0aW9uYWxEaXNwbGF5SW5mb30gW2Rpc3BsYXlJbmZvXVxuICogQHBhcmFtIHtTaHV0ZG93bldpdGhGYWlsdXJlfSBbb3B0U2h1dGRvd25XaXRoRmFpbHVyZV0gSWYgdGhpcyBpc3N1ZXIgZmFpbHMgaW5cbiAqICAgdGhlIG1pZGRsZSBvZiBhbiBhdG9taWMgYWN0aW9uICh3aGljaCBidHcgc2hvdWxkIG5ldmVyIGhhcHBlbiksIGl0XG4gKiAgIHBvdGVudGlhbGx5IGxlYXZlcyBpdHMgbGVkZ2VyIGluIGEgY29ycnVwdGVkIHN0YXRlLiBJZiB0aGlzIGZ1bmN0aW9uIHdhc1xuICogICBwcm92aWRlZCwgdGhlbiB0aGUgZmFpbGVkIGF0b21pYyBhY3Rpb24gd2lsbCBjYWxsIGl0LCBzbyB0aGF0IHNvbWUgbGFyZ2VyXG4gKiAgIHVuaXQgb2YgY29tcHV0YXRpb24sIGxpa2UgdGhlIGVuY2xvc2luZyB2YXQsIGNhbiBiZSBzaHV0ZG93biBiZWZvcmVcbiAqICAgYW55dGhpbmcgZWxzZSBpcyBjb3JydXB0ZWQgYnkgdGhhdCBjb3JydXB0ZWQgc3RhdGUuIFNlZVxuICogICBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzM0MzRcbiAqIEBwYXJhbSB7SXNzdWVyT3B0aW9uc1JlY29yZH0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7SXNzdWVyS2l0PEs+fVxuICovXG5jb25zdCAgICAgICAgbWFrZUlzc3VlcktpdD0oXG5uYW1lLFxuLyogQHRzLWV4cGVjdC1lcnJvciBLIGNvdWxkIGJlIGluc3RhbnRpYXRlZCB3aXRoIGEgZGlmZmVyZW50IHN1YnR5cGUgb2YgQXNzZXRLaW5kKi9cbmFzc2V0S2luZD1Bc3NldEtpbmQuTkFULFxuZGlzcGxheUluZm89aGFyZGVuKHt9KSxcbm9wdFNodXRkb3duV2l0aEZhaWx1cmU9dW5kZWZpbmVkLFxue2VsZW1lbnRTaGFwZT11bmRlZmluZWR9PXt9KT0+XG5cbm1ha2VEdXJhYmxlSXNzdWVyS2l0KFxubWFrZVNjYWxhckJpZ01hcFN0b3JlKCdkcm9wcGVkIGlzc3VlciBraXQnLHtkdXJhYmxlOnRydWV9KSxcbm5hbWUsXG5hc3NldEtpbmQsXG5kaXNwbGF5SW5mbyxcbm9wdFNodXRkb3duV2l0aEZhaWx1cmUsXG57ZWxlbWVudFNoYXBlfSk7JGjigI1fb25jZS5tYWtlSXNzdWVyS2l0KG1ha2VJc3N1ZXJLaXQpO1xuXG5oYXJkZW4obWFrZUlzc3VlcktpdCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsidXBncmFkZUlzc3VlcktpdCI6WyJ1cGdyYWRlSXNzdWVyS2l0Il0sImhhc0lzc3VlciI6WyJoYXNJc3N1ZXIiXSwibWFrZUR1cmFibGVJc3N1ZXJLaXQiOlsibWFrZUR1cmFibGVJc3N1ZXJLaXQiXSwicHJlcGFyZUlzc3VlcktpdCI6WyJwcmVwYXJlSXNzdWVyS2l0Il0sIm1ha2VJc3N1ZXJLaXQiOlsibWFrZUlzc3VlcktpdCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABOwhnarQUAAK0FAAA6AAAAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL21hdGhIZWxwZXJzL2NvcHlCYWdNYXRoSGVscGVycy5qc3siaW1wb3J0cyI6WyJAYWdvcmljL3N0b3JlIiwiLi4vdHlwZXMtYW1iaWVudC5qcyJdLCJleHBvcnRzIjpbImNvcHlCYWdNYXRoSGVscGVycyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBrZXlFUSxtYWtlQ29weUJhZyxtdXN0TWF0Y2gsTSxnZXRDb3B5QmFnRW50cmllcyxiYWdJc1N1cGVyYmFnLGJhZ1VuaW9uLGJhZ0Rpc2pvaW50U3VidHJhY3Q7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wia2V5RVFcIiwgWyRo4oCNX2EgPT4gKGtleUVRID0gJGjigI1fYSldXSxbXCJtYWtlQ29weUJhZ1wiLCBbJGjigI1fYSA9PiAobWFrZUNvcHlCYWcgPSAkaOKAjV9hKV1dLFtcIm11c3RNYXRjaFwiLCBbJGjigI1fYSA9PiAobXVzdE1hdGNoID0gJGjigI1fYSldXSxbXCJNXCIsIFskaOKAjV9hID0+IChNID0gJGjigI1fYSldXSxbXCJnZXRDb3B5QmFnRW50cmllc1wiLCBbJGjigI1fYSA9PiAoZ2V0Q29weUJhZ0VudHJpZXMgPSAkaOKAjV9hKV1dLFtcImJhZ0lzU3VwZXJiYWdcIiwgWyRo4oCNX2EgPT4gKGJhZ0lzU3VwZXJiYWcgPSAkaOKAjV9hKV1dLFtcImJhZ1VuaW9uXCIsIFskaOKAjV9hID0+IChiYWdVbmlvbiA9ICRo4oCNX2EpXV0sW1wiYmFnRGlzam9pbnRTdWJ0cmFjdFwiLCBbJGjigI1fYSA9PiAoYmFnRGlzam9pbnRTdWJ0cmFjdCA9ICRo4oCNX2EpXV1dXSxbXCIuLi90eXBlcy1hbWJpZW50LmpzXCIsIFtdXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGUge0NvcHlCYWd9ICovXG5jb25zdCBlbXB0eT1tYWtlQ29weUJhZyhbXSk7XG5cbi8qKiBAdHlwZSB7TWF0aEhlbHBlcnM8Q29weUJhZz59ICovXG5jb25zdCAgICAgICAgY29weUJhZ01hdGhIZWxwZXJzPWhhcmRlbih7XG5kb0NvZXJjZTooYmFnKT0+e1xubXVzdE1hdGNoKGJhZyxNLmJhZygpLCdiYWcgb2YgYW1vdW50Jyk7XG5yZXR1cm4gYmFnO1xuIH0sXG5kb01ha2VFbXB0eTooKT0+ZW1wdHksXG5kb0lzRW1wdHk6KGJhZyk9PmdldENvcHlCYWdFbnRyaWVzKGJhZykubGVuZ3RoPT09MCxcbmRvSXNHVEU6YmFnSXNTdXBlcmJhZyxcbmRvSXNFcXVhbDprZXlFUSxcbmRvQWRkOmJhZ1VuaW9uLFxuZG9TdWJ0cmFjdDpiYWdEaXNqb2ludFN1YnRyYWN0fSk7JGjigI1fb25jZS5jb3B5QmFnTWF0aEhlbHBlcnMoY29weUJhZ01hdGhIZWxwZXJzKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJjb3B5QmFnTWF0aEhlbHBlcnMiOlsiY29weUJhZ01hdGhIZWxwZXJzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAFwp/j7BBQAAwQUAADoAAABAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvbWF0aEhlbHBlcnMvY29weVNldE1hdGhIZWxwZXJzLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvc3RvcmUiLCIuLi90eXBlcy1hbWJpZW50LmpzIl0sImV4cG9ydHMiOlsiY29weVNldE1hdGhIZWxwZXJzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGtleUVRLG1ha2VDb3B5U2V0LG11c3RNYXRjaCxNLGdldENvcHlTZXRLZXlzLHNldElzU3VwZXJzZXQsc2V0RGlzam9pbnRVbmlvbixzZXREaXNqb2ludFN1YnRyYWN0OyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvc3RvcmVcIiwgW1tcImtleUVRXCIsIFskaOKAjV9hID0+IChrZXlFUSA9ICRo4oCNX2EpXV0sW1wibWFrZUNvcHlTZXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VDb3B5U2V0ID0gJGjigI1fYSldXSxbXCJtdXN0TWF0Y2hcIiwgWyRo4oCNX2EgPT4gKG11c3RNYXRjaCA9ICRo4oCNX2EpXV0sW1wiTVwiLCBbJGjigI1fYSA9PiAoTSA9ICRo4oCNX2EpXV0sW1wiZ2V0Q29weVNldEtleXNcIiwgWyRo4oCNX2EgPT4gKGdldENvcHlTZXRLZXlzID0gJGjigI1fYSldXSxbXCJzZXRJc1N1cGVyc2V0XCIsIFskaOKAjV9hID0+IChzZXRJc1N1cGVyc2V0ID0gJGjigI1fYSldXSxbXCJzZXREaXNqb2ludFVuaW9uXCIsIFskaOKAjV9hID0+IChzZXREaXNqb2ludFVuaW9uID0gJGjigI1fYSldXSxbXCJzZXREaXNqb2ludFN1YnRyYWN0XCIsIFskaOKAjV9hID0+IChzZXREaXNqb2ludFN1YnRyYWN0ID0gJGjigI1fYSldXV1dLFtcIi4uL3R5cGVzLWFtYmllbnQuanNcIiwgW11dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZSB7Q29weVNldH0gKi9cbmNvbnN0IGVtcHR5PW1ha2VDb3B5U2V0KFtdKTtcblxuLyoqIEB0eXBlIHtNYXRoSGVscGVyczxDb3B5U2V0Pn0gKi9cbmNvbnN0ICAgICAgICBjb3B5U2V0TWF0aEhlbHBlcnM9aGFyZGVuKHtcbmRvQ29lcmNlOihzZXQpPT57XG5tdXN0TWF0Y2goc2V0LE0uc2V0KCksJ3NldCBvZiBhbW91bnQnKTtcbnJldHVybiBzZXQ7XG4gfSxcbmRvTWFrZUVtcHR5OigpPT5lbXB0eSxcbmRvSXNFbXB0eTooc2V0KT0+Z2V0Q29weVNldEtleXMoc2V0KS5sZW5ndGg9PT0wLFxuZG9Jc0dURTpzZXRJc1N1cGVyc2V0LFxuZG9Jc0VxdWFsOmtleUVRLFxuZG9BZGQ6c2V0RGlzam9pbnRVbmlvbixcbmRvU3VidHJhY3Q6c2V0RGlzam9pbnRTdWJ0cmFjdH0pOyRo4oCNX29uY2UuY29weVNldE1hdGhIZWxwZXJzKGNvcHlTZXRNYXRoSGVscGVycyk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiY29weVNldE1hdGhIZWxwZXJzIjpbImNvcHlTZXRNYXRoSGVscGVycyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADxAWHrJgYAACYGAAA2AAAAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL21hdGhIZWxwZXJzL25hdE1hdGhIZWxwZXJzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL25hdCIsIi4uL3R5cGVzLWFtYmllbnQuanMiXSwiZXhwb3J0cyI6WyJuYXRNYXRoSGVscGVycyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBOYXQsaXNOYXQ7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbmF0XCIsIFtbXCJOYXRcIiwgWyRo4oCNX2EgPT4gKE5hdCA9ICRo4oCNX2EpXV0sW1wiaXNOYXRcIiwgWyRo4oCNX2EgPT4gKGlzTmF0ID0gJGjigI1fYSldXV1dLFtcIi4uL3R5cGVzLWFtYmllbnQuanNcIiwgW11dXSk7ICAgXG5cblxuXG5cblxuY29uc3R7RmFpbH09YXNzZXJ0O1xuY29uc3QgZW1wdHk9MG47XG5cbi8qKlxuICogRnVuZ2libGUgZGlnaXRhbCBhc3NldHMgdXNlIHRoZSBuYXRNYXRoSGVscGVycyB0byBtYW5hZ2UgYmFsYW5jZXMgLSB0aGVcbiAqIG9wZXJhdGlvbnMgYXJlIG1lcmVseSBhcml0aG1ldGljIG9uIG5hdHVyYWwsIG5vbi1uZWdhdGl2ZSBudW1iZXJzLlxuICpcbiAqIE5hdHVyYWwgbnVtYmVycyBhcmUgdXNlZCBmb3IgZnVuZ2libGUgZXJpZ2h0cyBzdWNoIGFzIG1vbmV5IGJlY2F1c2Ugcm91bmRpbmdcbiAqIGlzc3VlcyBtYWtlIGZsb2F0cyBwcm9ibGVtYXRpYy4gQWxsIG9wZXJhdGlvbnMgc2hvdWxkIGJlIGRvbmUgd2l0aCB0aGVcbiAqIHNtYWxsZXN0IHdob2xlIHVuaXQgc3VjaCB0aGF0IHRoZSBgbmF0TWF0aEhlbHBlcnNgIG5ldmVyIGRlYWxzIHdpdGhcbiAqIGZyYWN0aW9uYWwgcGFydHMuXG4gKlxuICogQHR5cGUge01hdGhIZWxwZXJzPE5hdFZhbHVlPn1cbiAqL1xuY29uc3QgICAgICAgIG5hdE1hdGhIZWxwZXJzPWhhcmRlbih7XG5kb0NvZXJjZToobmF0KT0+e1xuLyogVE9ETzogdGlnaHRlbiB0aGUgZGVmaW5pdGlvbiBvZiBOYXQgaW4gQGFnb3JpYy9uYXQgdG8gdGhyb3cgb24gYG51bWJlcmAqL1xuYXNzZXJ0LnR5cGVvZihuYXQsJ2JpZ2ludCcpO1xuaXNOYXQobmF0KXx8RmFpbCBgdmFsdWUgJHtuYXR9IG11c3QgYmUgYSBuYXR1cmFsIG51bWJlcmA7XG5yZXR1cm4gTmF0KG5hdCk7XG4gfSxcbmRvTWFrZUVtcHR5OigpPT5lbXB0eSxcbmRvSXNFbXB0eToobmF0KT0+bmF0PT09ZW1wdHksXG5kb0lzR1RFOihsZWZ0LHJpZ2h0KT0+bGVmdD49cmlnaHQsXG5kb0lzRXF1YWw6KGxlZnQscmlnaHQpPT5sZWZ0PT09cmlnaHQsXG4vKiBCaWdJbnRzIGRvbid0IG9ic2VydmFibHkgb3ZlcmZsb3cqL1xuZG9BZGQ6KGxlZnQscmlnaHQpPT5sZWZ0K3JpZ2h0LFxuZG9TdWJ0cmFjdDoobGVmdCxyaWdodCk9Pk5hdChsZWZ0LXJpZ2h0KX0pOyRo4oCNX29uY2UubmF0TWF0aEhlbHBlcnMobmF0TWF0aEhlbHBlcnMpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im5hdE1hdGhIZWxwZXJzIjpbIm5hdE1hdGhIZWxwZXJzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGNJkNqfBwAAnwcAADYAAABAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvbWF0aEhlbHBlcnMvc2V0TWF0aEhlbHBlcnMuanN7ImltcG9ydHMiOlsiQGVuZG8vbWFyc2hhbCIsIkBhZ29yaWMvc3RvcmUiLCIuLi90eXBlcy1hbWJpZW50LmpzIl0sImV4cG9ydHMiOlsic2V0TWF0aEhlbHBlcnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgcGFzc1N0eWxlT2YsYXNzZXJ0S2V5LGVsZW1lbnRzSXNTdXBlcnNldCxlbGVtZW50c0Rpc2pvaW50VW5pb24sZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0LGNvZXJjZVRvRWxlbWVudHMsZWxlbWVudHNDb21wYXJlOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJhc3NlcnRLZXlcIiwgWyRo4oCNX2EgPT4gKGFzc2VydEtleSA9ICRo4oCNX2EpXV0sW1wiZWxlbWVudHNJc1N1cGVyc2V0XCIsIFskaOKAjV9hID0+IChlbGVtZW50c0lzU3VwZXJzZXQgPSAkaOKAjV9hKV1dLFtcImVsZW1lbnRzRGlzam9pbnRVbmlvblwiLCBbJGjigI1fYSA9PiAoZWxlbWVudHNEaXNqb2ludFVuaW9uID0gJGjigI1fYSldXSxbXCJlbGVtZW50c0Rpc2pvaW50U3VidHJhY3RcIiwgWyRo4oCNX2EgPT4gKGVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCA9ICRo4oCNX2EpXV0sW1wiY29lcmNlVG9FbGVtZW50c1wiLCBbJGjigI1fYSA9PiAoY29lcmNlVG9FbGVtZW50cyA9ICRo4oCNX2EpXV0sW1wiZWxlbWVudHNDb21wYXJlXCIsIFskaOKAjV9hID0+IChlbGVtZW50c0NvbXBhcmUgPSAkaOKAjV9hKV1dXV0sW1wiLi4vdHlwZXMtYW1iaWVudC5qc1wiLCBbXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qIE9wZXJhdGlvbnMgZm9yIGFycmF5cyB3aXRoIHVuaXF1ZSBvYmplY3RzIGlkZW50aWZ5aW5nIGFuZCBwcm92aWRpbmcqL1xuLyogaW5mb3JtYXRpb24gYWJvdXQgZGlnaXRhbCBhc3NldHMuIFVzZWQgZm9yIFpvZSBpbnZpdGVzLiovXG4vKiogQHR5cGUge1NldFZhbHVlfSAqL1xuY29uc3QgZW1wdHk9aGFyZGVuKFtdKTtcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBSZXBsYWNlIGFycmF5LWJhc2VkIFNldE1hdGggd2l0aCBDb3B5U2V0LWJhc2VkIENvcHlTZXRNYXRoXG4gKiBAdHlwZSB7TWF0aEhlbHBlcnM8U2V0VmFsdWU+fVxuICovXG5jb25zdCAgICAgICAgc2V0TWF0aEhlbHBlcnM9aGFyZGVuKHtcbmRvQ29lcmNlOihsaXN0KT0+e1xubGlzdD1jb2VyY2VUb0VsZW1lbnRzKGxpc3QpO1xuLyogQXNzZXJ0IHRoYXQgbGlzdCBjb250YWlucyBvbmx5Ki9cbi8qICogcGFzcy1ieS1jb3B5IHByaW1pdGl2ZXMsKi9cbi8qICogcGFzcy1ieS1jb3B5IGNvbnRhaW5lcnMgY29udGFpbmluZyBrZXlzLCovXG4vKiAqIHJlbW90YWJsZXMuKi9cbmFzc2VydEtleShsaXN0KTtcbnJldHVybiBsaXN0O1xuIH0sXG5kb01ha2VFbXB0eTooKT0+ZW1wdHksXG5kb0lzRW1wdHk6KGxpc3QpPT5wYXNzU3R5bGVPZihsaXN0KT09PSdjb3B5QXJyYXknJiZsaXN0Lmxlbmd0aD09PTAsXG5kb0lzR1RFOmVsZW1lbnRzSXNTdXBlcnNldCxcbmRvSXNFcXVhbDooeCx5KT0+ZWxlbWVudHNDb21wYXJlKHgseSk9PT0wLFxuZG9BZGQ6ZWxlbWVudHNEaXNqb2ludFVuaW9uLFxuZG9TdWJ0cmFjdDplbGVtZW50c0Rpc2pvaW50U3VidHJhY3R9KTskaOKAjV9vbmNlLnNldE1hdGhIZWxwZXJzKHNldE1hdGhIZWxwZXJzKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJzZXRNYXRoSGVscGVycyI6WyJzZXRNYXRoSGVscGVycyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACQBrAvnAUAAJwFAAAjAAAAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL3BheW1lbnQuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9zdG9yZSIsIkBhZ29yaWMvdmF0LWRhdGEiXSwiZXhwb3J0cyI6WyJwcmVwYXJlUGF5bWVudEtpbmQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgaW5pdEVtcHR5LHByZXBhcmVFeG9DbGFzczskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJpbml0RW1wdHlcIiwgWyRo4oCNX2EgPT4gKGluaXRFbXB0eSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJwcmVwYXJlRXhvQ2xhc3NcIiwgWyRo4oCNX2EgPT4gKHByZXBhcmVFeG9DbGFzcyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL3BhdHRlcm5zJykuTWV0aG9kR3VhcmR9IE1ldGhvZEd1YXJkICovXG4vKipcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPHN0cmluZyB8IHN5bWJvbCwgTWV0aG9kR3VhcmQ+fSBbVD1SZWNvcmQ8c3RyaW5nIHwgc3ltYm9sLCBNZXRob2RHdWFyZD5dXG4gKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vcGF0dGVybnMnKS5JbnRlcmZhY2VHdWFyZDxUPn0gSW50ZXJmYWNlR3VhcmRcbiAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAYWdvcmljL3ZhdC1kYXRhJykuQmFnZ2FnZX0gQmFnZ2FnZSAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGlzc3VlckJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge0JyYW5kPEs+fSBicmFuZFxuICogQHBhcmFtIHtJbnRlcmZhY2VHdWFyZH0gUGF5bWVudElcbiAqIEByZXR1cm5zIHsoKSA9PiBQYXltZW50PEs+fVxuICovXG5jb25zdCAgICAgICAgcHJlcGFyZVBheW1lbnRLaW5kPShpc3N1ZXJCYWdnYWdlLG5hbWUsYnJhbmQsUGF5bWVudEkpPT57XG5jb25zdCBtYWtlUGF5bWVudD1wcmVwYXJlRXhvQ2xhc3MoXG5pc3N1ZXJCYWdnYWdlLFxuIGAke25hbWV9IHBheW1lbnRgLFxuUGF5bWVudEksXG5pbml0RW1wdHksXG57XG5nZXRBbGxlZ2VkQnJhbmQoKXtcbnJldHVybiBicmFuZDtcbiB9fSk7XG5cblxucmV0dXJuIG1ha2VQYXltZW50O1xuIH07JGjigI1fb25jZS5wcmVwYXJlUGF5bWVudEtpbmQocHJlcGFyZVBheW1lbnRLaW5kKTtcbmhhcmRlbihwcmVwYXJlUGF5bWVudEtpbmQpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InByZXBhcmVQYXltZW50S2luZCI6WyJwcmVwYXJlUGF5bWVudEtpbmQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAw8qvKhIyAAASMgAAKQAAAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9wYXltZW50TGVkZ2VyLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3Byb21pc2Uta2l0IiwiQGFnb3JpYy9zdG9yZSIsIkBhZ29yaWMvdmF0LWRhdGEiLCIuL2Ftb3VudE1hdGguanMiLCIuL3BheW1lbnQuanMiLCIuL3B1cnNlLmpzIiwiQGFnb3JpYy9zdG9yZS9leHBvcnRlZC5qcyIsIi4vdHlwZUd1YXJkcy5qcyJdLCJleHBvcnRzIjpbInByZXBhcmVQYXltZW50TGVkZ2VyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGlzUHJvbWlzZSxtdXN0TWF0Y2gsTSxrZXlFUSxwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSxwcmVwYXJlRXhvLHByb3ZpZGUsQW1vdW50TWF0aCxwcmVwYXJlUGF5bWVudEtpbmQscHJlcGFyZVB1cnNlS2luZCxCcmFuZEksbWFrZUlzc3VlckludGVyZmFjZXM7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vcHJvbWlzZS1raXRcIiwgW1tcImlzUHJvbWlzZVwiLCBbJGjigI1fYSA9PiAoaXNQcm9taXNlID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIm11c3RNYXRjaFwiLCBbJGjigI1fYSA9PiAobXVzdE1hdGNoID0gJGjigI1fYSldXSxbXCJNXCIsIFskaOKAjV9hID0+IChNID0gJGjigI1fYSldXSxbXCJrZXlFUVwiLCBbJGjigI1fYSA9PiAoa2V5RVEgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy92YXQtZGF0YVwiLCBbW1wicHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmVcIiwgWyRo4oCNX2EgPT4gKHByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlID0gJGjigI1fYSldXSxbXCJwcmVwYXJlRXhvXCIsIFskaOKAjV9hID0+IChwcmVwYXJlRXhvID0gJGjigI1fYSldXSxbXCJwcm92aWRlXCIsIFskaOKAjV9hID0+IChwcm92aWRlID0gJGjigI1fYSldXV1dLFtcIi4vYW1vdW50TWF0aC5qc1wiLCBbW1wiQW1vdW50TWF0aFwiLCBbJGjigI1fYSA9PiAoQW1vdW50TWF0aCA9ICRo4oCNX2EpXV1dXSxbXCIuL3BheW1lbnQuanNcIiwgW1tcInByZXBhcmVQYXltZW50S2luZFwiLCBbJGjigI1fYSA9PiAocHJlcGFyZVBheW1lbnRLaW5kID0gJGjigI1fYSldXV1dLFtcIi4vcHVyc2UuanNcIiwgW1tcInByZXBhcmVQdXJzZUtpbmRcIiwgWyRo4oCNX2EgPT4gKHByZXBhcmVQdXJzZUtpbmQgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZS9leHBvcnRlZC5qc1wiLCBbXV0sW1wiLi90eXBlR3VhcmRzLmpzXCIsIFtbXCJCcmFuZElcIiwgWyRo4oCNX2EgPT4gKEJyYW5kSSA9ICRo4oCNX2EpXV0sW1wibWFrZUlzc3VlckludGVyZmFjZXNcIiwgWyRo4oCNX2EgPT4gKG1ha2VJc3N1ZXJJbnRlcmZhY2VzID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGFnb3JpYy92YXQtZGF0YScpLkJhZ2dhZ2V9IEJhZ2dhZ2UgKi9cblxuY29uc3R7ZGV0YWlsczpYLHF1b3RlOnEsRmFpbH09YXNzZXJ0O1xuXG4vKipcbiAqIEBwYXJhbSB7QnJhbmR9IGJyYW5kXG4gKiBAcGFyYW0ge0Fzc2V0S2luZH0gYXNzZXRLaW5kXG4gKiBAcGFyYW0ge1BhdHRlcm59IGVsZW1lbnRTaGFwZVxuICovXG5jb25zdCBhbW91bnRTaGFwZUZyb21FbGVtZW50U2hhcGU9KGJyYW5kLGFzc2V0S2luZCxlbGVtZW50U2hhcGUpPT57XG5sZXQgdmFsdWVTaGFwZTtcbnN3aXRjaChhc3NldEtpbmQpe1xuY2FzZSduYXQnOntcbnZhbHVlU2hhcGU9TS5uYXQoKTtcbmVsZW1lbnRTaGFwZT09PXVuZGVmaW5lZHx8XG5GYWlsIGBGdW5naWJsZSBhc3NldHMgY2Fubm90IGhhdmUgYW4gZWxlbWVudFNoYXBlOiAke3EoZWxlbWVudFNoYXBlKX1gO1xuYnJlYWs7XG4gfVxuY2FzZSdzZXQnOntcbmlmKGVsZW1lbnRTaGFwZT09PXVuZGVmaW5lZCl7XG52YWx1ZVNoYXBlPU0uYXJyYXlPZihNLmtleSgpKTtcbiB9ZWxzZXtcbnZhbHVlU2hhcGU9TS5hcnJheU9mKE0uYW5kKE0ua2V5KCksZWxlbWVudFNoYXBlKSk7XG4gfVxuYnJlYWs7XG4gfVxuY2FzZSdjb3B5U2V0Jzp7XG5pZihlbGVtZW50U2hhcGU9PT11bmRlZmluZWQpe1xudmFsdWVTaGFwZT1NLnNldCgpO1xuIH1lbHNle1xudmFsdWVTaGFwZT1NLnNldE9mKGVsZW1lbnRTaGFwZSk7XG4gfVxuYnJlYWs7XG4gfVxuY2FzZSdjb3B5QmFnJzp7XG5pZihlbGVtZW50U2hhcGU9PT11bmRlZmluZWQpe1xudmFsdWVTaGFwZT1NLmJhZygpO1xuIH1lbHNle1xudmFsdWVTaGFwZT1NLmJhZ09mKGVsZW1lbnRTaGFwZSk7XG4gfVxuYnJlYWs7XG4gfVxuZGVmYXVsdDp7XG5GYWlsIGB1bmV4cGVjdGVkIGFzc2V0IGtpbmQgJHtxKGFzc2V0S2luZCl9YDtcbiB9fVxuXG5cbmNvbnN0IGFtb3VudFNoYXBlPWhhcmRlbih7XG5icmFuZCwvKiBtYXRjaGVzIG9ubHkgdGhpcyBleGFjdCBicmFuZCovXG52YWx1ZTp2YWx1ZVNoYXBlfSk7XG5cbnJldHVybiBhbW91bnRTaGFwZTtcbiB9O1xuXG4vKipcbiAqIE1ha2UgdGhlIHBheW1lbnRMZWRnZXIsIHRoZSBzb3VyY2Ugb2YgdHJ1dGggZm9yIHRoZSBiYWxhbmNlcyBvZiBwYXltZW50cy4gQWxsXG4gKiBtaW50aW5nIGFuZCB0cmFuc2ZlciBhdXRob3JpdHkgb3JpZ2luYXRlcyBoZXJlLlxuICpcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGlzc3VlckJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge0t9IGFzc2V0S2luZFxuICogQHBhcmFtIHtEaXNwbGF5SW5mbzxLPn0gZGlzcGxheUluZm9cbiAqIEBwYXJhbSB7UGF0dGVybn0gZWxlbWVudFNoYXBlXG4gKiBAcGFyYW0ge1NodXRkb3duV2l0aEZhaWx1cmV9IFtvcHRTaHV0ZG93bldpdGhGYWlsdXJlXVxuICogQHJldHVybnMge1BheW1lbnRMZWRnZXI8Sz59XG4gKi9cbmNvbnN0ICAgICAgICBwcmVwYXJlUGF5bWVudExlZGdlcj0oXG5pc3N1ZXJCYWdnYWdlLFxubmFtZSxcbmFzc2V0S2luZCxcbmRpc3BsYXlJbmZvLFxuZWxlbWVudFNoYXBlLFxub3B0U2h1dGRvd25XaXRoRmFpbHVyZT11bmRlZmluZWQpPT5cbntcbi8qKiBAdHlwZSB7QnJhbmQ8Sz59ICovXG4vKiBAdHMtZXhwZWN0LWVycm9yIFhYWCBjYWxsV2hlbiovXG5jb25zdCBicmFuZD1wcmVwYXJlRXhvKGlzc3VlckJhZ2dhZ2UsIGAke25hbWV9IGJyYW5kYCxCcmFuZEkse1xuaXNNeUlzc3VlcihhbGxlZ2VkSXNzdWVyKXtcbi8qIEJyYW5kSSBkZWxheXMgY2FsbGluZyB0aGlzIG1ldGhvZCB1bnRpbCBgYWxsZWdlZElzc3VlcmAgaXMgYSBSZW1vdGFibGUqL1xucmV0dXJuIGFsbGVnZWRJc3N1ZXI9PT1pc3N1ZXI7XG4gfSxcbmdldEFsbGVnZWROYW1lKCl7XG5yZXR1cm4gbmFtZTtcbiB9LFxuLyogR2l2ZSBpbmZvcm1hdGlvbiB0byBVSSBvbiBob3cgdG8gZGlzcGxheSB0aGUgYW1vdW50LiovXG5nZXREaXNwbGF5SW5mbygpe1xucmV0dXJuIGRpc3BsYXlJbmZvO1xuIH0sXG5nZXRBbW91bnRTaGFwZSgpe1xucmV0dXJuIGFtb3VudFNoYXBlO1xuIH19KTtcblxuXG5jb25zdCBhbW91bnRTaGFwZT1hbW91bnRTaGFwZUZyb21FbGVtZW50U2hhcGUoXG5icmFuZCxcbmFzc2V0S2luZCxcbmVsZW1lbnRTaGFwZSk7XG5cblxuY29uc3R7SXNzdWVySSxNaW50SSxQYXltZW50SSxQdXJzZUlLaXR9PW1ha2VJc3N1ZXJJbnRlcmZhY2VzKFxuYnJhbmQsXG5hc3NldEtpbmQsXG5hbW91bnRTaGFwZSk7XG5cblxuY29uc3QgbWFrZVBheW1lbnQ9cHJlcGFyZVBheW1lbnRLaW5kKGlzc3VlckJhZ2dhZ2UsbmFtZSxicmFuZCxQYXltZW50SSk7XG5cbi8qKiBAdHlwZSB7U2h1dGRvd25XaXRoRmFpbHVyZX0gKi9cbmNvbnN0IHNodXRkb3duTGVkZ2VyV2l0aEZhaWx1cmU9KHJlYXNvbik9Pntcbi8qIFRPRE8gVGhpcyBzaG91bGQgYWxzbyBkZXN0cm95IGxlZGdlciBzdGF0ZS4qL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMzQzNCovXG5pZihvcHRTaHV0ZG93bldpdGhGYWlsdXJlIT09dW5kZWZpbmVkKXtcbnRyeXtcbm9wdFNodXRkb3duV2l0aEZhaWx1cmUocmVhc29uKTtcbiB9Y2F0Y2goZXJySW5TaHV0ZG93bil7XG5hc3NlcnQubm90ZShlcnJJblNodXRkb3duLFggYENhdXNlZCBieTogJHtyZWFzb259YCk7XG50aHJvdyBlcnJJblNodXRkb3duO1xuIH1cbiB9XG50aHJvdyByZWFzb247XG4gfTtcblxuLyoqIEB0eXBlIHtXZWFrTWFwU3RvcmU8UGF5bWVudCwgQW1vdW50Pn0gKi9cbmNvbnN0IHBheW1lbnRMZWRnZXI9cHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUoXG5pc3N1ZXJCYWdnYWdlLFxuJ3BheW1lbnRMZWRnZXInLFxue3ZhbHVlU2hhcGU6YW1vdW50U2hhcGV9KTtcblxuXG4vKipcbiAqIEEgd2l0aGRyYXduIGxpdmUgcGF5bWVudCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIHJlY292ZXJ5IHNldCBvZiB0aGUgcHVyc2VcbiAqIGl0IHdhcyB3aXRoZHJhd24gZnJvbS4gTGV0J3MgY2FsbCB0aGVzZSBcInJlY292ZXJhYmxlXCIgcGF5bWVudHMuIEFsbFxuICogcmVjb3ZlcmFibGUgcGF5bWVudHMgYXJlIGxpdmUsIGJ1dCBub3QgYWxsIGxpdmUgcGF5bWVudHMgYXJlIHJlY292ZXJhYmxlLlxuICogV2UgZG8gdGhlIGJvb2trZWVwaW5nIGZvciBwYXltZW50IHJlY292ZXJ5IHdpdGggdGhpcyB3ZWFrbWFwIGZyb21cbiAqIHJlY292ZXJhYmxlIHBheW1lbnRzIHRvIHRoZSByZWNvdmVyeSBzZXQgdGhleSBhcmUgaW4uIEEgYnVuY2ggb2ZcbiAqIGludGVyZXN0aW5nIGludmFyaWFudHMgaGVyZTpcbiAqXG4gKiAtIEV2ZXJ5IHBheW1lbnQgdGhhdCBpcyBhIGtleSBpbiB0aGUgb3V0ZXIgYHBheW1lbnRSZWNvdmVyeVNldHNgIHdlYWtNYXAgaXNcbiAqICAgYWxzbyBpbiB0aGUgcmVjb3Zlcnkgc2V0IGluZGV4ZWQgYnkgdGhhdCBwYXltZW50LlxuICogLSBJbXBsaWVkIGJ5IHRoZSBhYm92ZSBidXQgd29ydGggc3RhdGluZzogdGhlIHBheW1lbnQgaXMgb25seSBpbiBhdCBtb3N0IG9uZVxuICogICByZWNvdmVyeSBzZXQuXG4gKiAtIEEgcmVjb3Zlcnkgc2V0IG9ubHkgY29udGFpbnMgc3VjaCBwYXltZW50cy5cbiAqIC0gRXZlcnkgcHVyc2UgaXMgYXNzb2NpYXRlZCB3aXRoIGV4YWN0bHkgb25lIHJlY292ZXJ5IHNldCB1bmlxdWUgdG8gaXQuXG4gKiAtIEEgcHVyc2UncyByZWNvdmVyeSBzZXQgb25seSBjb250YWlucyBwYXltZW50cyB3aXRoZHJhd24gZnJvbSB0aGF0IHB1cnNlIGFuZFxuICogICBub3QgeWV0IGNvbnN1bWVkLlxuICpcbiAqIEB0eXBlIHtXZWFrTWFwU3RvcmU8UGF5bWVudCwgU2V0U3RvcmU8UGF5bWVudD4+fVxuICovXG5jb25zdCBwYXltZW50UmVjb3ZlcnlTZXRzPXByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlKFxuaXNzdWVyQmFnZ2FnZSxcbidwYXltZW50UmVjb3ZlcnlTZXRzJyk7XG5cblxuLyoqXG4gKiBUbyBtYWludGFpbiB0aGUgaW52YXJpYW50cyBsaXN0ZWQgaW4gdGhlIGBwYXltZW50UmVjb3ZlcnlTZXRzYCBjb21tZW50LFxuICogYGluaXRQYXltZW50YCBzaG91bGQgY29udGFpbiB0aGUgb25seSBjYWxsIHRvIGBwYXltZW50TGVkZ2VyLmluaXRgLlxuICpcbiAqIEBwYXJhbSB7UGF5bWVudH0gcGF5bWVudFxuICogQHBhcmFtIHtBbW91bnR9IGFtb3VudFxuICogQHBhcmFtIHtTZXRTdG9yZTxQYXltZW50Pn0gW29wdFJlY292ZXJ5U2V0XVxuICovXG5jb25zdCBpbml0UGF5bWVudD0ocGF5bWVudCxhbW91bnQsb3B0UmVjb3ZlcnlTZXQ9dW5kZWZpbmVkKT0+e1xuaWYob3B0UmVjb3ZlcnlTZXQhPT11bmRlZmluZWQpe1xub3B0UmVjb3ZlcnlTZXQuYWRkKHBheW1lbnQpO1xucGF5bWVudFJlY292ZXJ5U2V0cy5pbml0KHBheW1lbnQsb3B0UmVjb3ZlcnlTZXQpO1xuIH1cbnBheW1lbnRMZWRnZXIuaW5pdChwYXltZW50LGFtb3VudCk7XG4gfTtcblxuLyoqXG4gKiBUbyBtYWludGFpbiB0aGUgaW52YXJpYW50cyBsaXN0ZWQgaW4gdGhlIGBwYXltZW50UmVjb3ZlcnlTZXRzYCBjb21tZW50LFxuICogYGRlbGV0ZVBheW1lbnRgIHNob3VsZCBjb250YWluIHRoZSBvbmx5IGNhbGwgdG8gYHBheW1lbnRMZWRnZXIuZGVsZXRlYC5cbiAqXG4gKiBAcGFyYW0ge1BheW1lbnR9IHBheW1lbnRcbiAqL1xuY29uc3QgZGVsZXRlUGF5bWVudD0ocGF5bWVudCk9PntcbnBheW1lbnRMZWRnZXIuZGVsZXRlKHBheW1lbnQpO1xuaWYocGF5bWVudFJlY292ZXJ5U2V0cy5oYXMocGF5bWVudCkpe1xuY29uc3QgcmVjb3ZlcnlTZXQ9cGF5bWVudFJlY292ZXJ5U2V0cy5nZXQocGF5bWVudCk7XG5wYXltZW50UmVjb3ZlcnlTZXRzLmRlbGV0ZShwYXltZW50KTtcbnJlY292ZXJ5U2V0LmRlbGV0ZShwYXltZW50KTtcbiB9XG4gfTtcblxuLyoqIEB0eXBlIHsobGVmdDogQW1vdW50LCByaWdodDogQW1vdW50KSA9PiBBbW91bnR9ICovXG5jb25zdCBhZGQ9KGxlZnQscmlnaHQpPT5BbW91bnRNYXRoLmFkZChsZWZ0LHJpZ2h0LGJyYW5kKTtcbi8qKiBAdHlwZSB7KGxlZnQ6IEFtb3VudCwgcmlnaHQ6IEFtb3VudCkgPT4gQW1vdW50fSAqL1xuY29uc3Qgc3VidHJhY3Q9KGxlZnQscmlnaHQpPT5BbW91bnRNYXRoLnN1YnRyYWN0KGxlZnQscmlnaHQsYnJhbmQpO1xuLyoqIEB0eXBlIHsoYWxsZWdlZEFtb3VudDogQW1vdW50KSA9PiBBbW91bnR9ICovXG5jb25zdCBjb2VyY2U9KGFsbGVnZWRBbW91bnQpPT5BbW91bnRNYXRoLmNvZXJjZShicmFuZCxhbGxlZ2VkQW1vdW50KTtcbi8qKiBAdHlwZSB7KGxlZnQ6IEFtb3VudCwgcmlnaHQ6IEFtb3VudCkgPT4gYm9vbGVhbn0gKi9cblxuLyoqXG4gKiBNZXRob2RzIGxpa2UgZGVwb3NpdCgpIGhhdmUgYW4gb3B0aW9uYWwgc2Vjb25kIHBhcmFtZXRlciBgb3B0QW1vdW50U2hhcGVgXG4gKiB3aGljaCwgaWYgcHJlc2VudCwgaXMgc3VwcG9zZWQgdG8gbWF0Y2ggdGhlIGJhbGFuY2Ugb2YgdGhlIHBheW1lbnQuIFRoaXNcbiAqIGhlbHBlciBmdW5jdGlvbiBkb2VzIHRoYXQgY2hlY2suXG4gKlxuICogTm90ZTogYG9wdEFtb3VudFNoYXBlYCBpcyB1c2VyLXN1cHBsaWVkIHdpdGggbm8gcHJldmlvdXMgdmFsaWRhdGlvbi5cbiAqXG4gKiBAcGFyYW0ge0Ftb3VudH0gcGF5bWVudEJhbGFuY2VcbiAqIEBwYXJhbSB7UGF0dGVybn0gW29wdEFtb3VudFNoYXBlXVxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmNvbnN0IGFzc2VydEFtb3VudENvbnNpc3RlbnQ9KHBheW1lbnRCYWxhbmNlLG9wdEFtb3VudFNoYXBlKT0+e1xuaWYob3B0QW1vdW50U2hhcGUhPT11bmRlZmluZWQpe1xubXVzdE1hdGNoKHBheW1lbnRCYWxhbmNlLG9wdEFtb3VudFNoYXBlLCdhbW91bnQnKTtcbiB9XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1BheW1lbnR9IHBheW1lbnRcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5jb25zdCBhc3NlcnRMaXZlUGF5bWVudD0ocGF5bWVudCk9PntcbnBheW1lbnRMZWRnZXIuaGFzKHBheW1lbnQpfHxcbkZhaWwgYCR7cGF5bWVudH0gd2FzIG5vdCBhIGxpdmUgcGF5bWVudCBmb3IgYnJhbmQgJHtxKFxuYnJhbmQpXG4gfS4gSXQgY291bGQgYmUgYSB1c2VkLXVwIHBheW1lbnQsIGEgcGF5bWVudCBmb3IgYW5vdGhlciBicmFuZCwgb3IgaXQgbWlnaHQgbm90IGJlIGEgcGF5bWVudCBhdCBhbGwuYDtcbiB9O1xuXG4vKipcbiAqIFVzZWQgYnkgdGhlIHB1cnNlIGNvZGUgdG8gaW1wbGVtZW50IHB1cnNlLmRlcG9zaXRcbiAqXG4gKiBAcGFyYW0ge0Ftb3VudH0gY3VycmVudEJhbGFuY2UgLSB0aGUgY3VycmVudCBiYWxhbmNlIG9mIHRoZSBwdXJzZSBiZWZvcmUgYVxuICogICBkZXBvc2l0XG4gKiBAcGFyYW0geyhuZXdQdXJzZUJhbGFuY2U6IEFtb3VudCkgPT4gdm9pZH0gdXBkYXRlUHVyc2VCYWxhbmNlIC0gY29tbWl0IHRoZVxuICogICBwdXJzZSBiYWxhbmNlXG4gKiBAcGFyYW0ge1BheW1lbnR9IHNyY1BheW1lbnRcbiAqIEBwYXJhbSB7UGF0dGVybn0gW29wdEFtb3VudFNoYXBlXVxuICogQHJldHVybnMge0Ftb3VudH1cbiAqL1xuY29uc3QgZGVwb3NpdEludGVybmFsPShcbmN1cnJlbnRCYWxhbmNlLFxudXBkYXRlUHVyc2VCYWxhbmNlLFxuc3JjUGF5bWVudCxcbm9wdEFtb3VudFNoYXBlPXVuZGVmaW5lZCk9Plxue1xuIWlzUHJvbWlzZShzcmNQYXltZW50KXx8XG5hc3NlcnQuZmFpbChcbiBgZGVwb3NpdCBkb2VzIG5vdCBhY2NlcHQgcHJvbWlzZXMgYXMgZmlyc3QgYXJndW1lbnQuIEluc3RlYWQgb2YgcGFzc2luZyB0aGUgcHJvbWlzZSAoZGVwb3NpdChwYXltZW50UHJvbWlzZSkpLCBjb25zaWRlciB1bndyYXBwaW5nIHRoZSBwcm9taXNlIGZpcnN0OiBFLndoZW4ocGF5bWVudFByb21pc2UsIChhY3R1YWxQYXltZW50ID0+IGRlcG9zaXQoYWN0dWFsUGF5bWVudCkpYCxcblR5cGVFcnJvcik7XG5cbmFzc2VydExpdmVQYXltZW50KHNyY1BheW1lbnQpO1xuY29uc3Qgc3JjUGF5bWVudEJhbGFuY2U9cGF5bWVudExlZGdlci5nZXQoc3JjUGF5bWVudCk7XG5hc3NlcnRBbW91bnRDb25zaXN0ZW50KHNyY1BheW1lbnRCYWxhbmNlLG9wdEFtb3VudFNoYXBlKTtcbmNvbnN0IG5ld1B1cnNlQmFsYW5jZT1hZGQoc3JjUGF5bWVudEJhbGFuY2UsY3VycmVudEJhbGFuY2UpO1xudHJ5e1xuLyogQ09NTUlUIFBPSU5UKi9cbi8qIE1vdmUgdGhlIGFzc2V0cyBpbiBgc3JjUGF5bWVudGAgaW50byB0aGlzIHB1cnNlLCB1c2luZyB1cCB0aGUqL1xuLyogc291cmNlIHBheW1lbnQsIHN1Y2ggdGhhdCB0b3RhbCBhc3NldHMgYXJlIGNvbnNlcnZlZC4qL1xuZGVsZXRlUGF5bWVudChzcmNQYXltZW50KTtcbnVwZGF0ZVB1cnNlQmFsYW5jZShuZXdQdXJzZUJhbGFuY2UpO1xuIH1jYXRjaChlcnIpe1xuc2h1dGRvd25MZWRnZXJXaXRoRmFpbHVyZShlcnIpO1xudGhyb3cgZXJyO1xuIH1cbnJldHVybiBzcmNQYXltZW50QmFsYW5jZTtcbiB9O1xuXG4vKipcbiAqIFVzZWQgYnkgdGhlIHB1cnNlIGNvZGUgdG8gaW1wbGVtZW50IHB1cnNlLndpdGhkcmF3XG4gKlxuICogQHBhcmFtIHtBbW91bnR9IGN1cnJlbnRCYWxhbmNlIC0gdGhlIGN1cnJlbnQgYmFsYW5jZSBvZiB0aGUgcHVyc2UgYmVmb3JlIGFcbiAqICAgd2l0aGRyYXdhbFxuICogQHBhcmFtIHsobmV3UHVyc2VCYWxhbmNlOiBBbW91bnQpID0+IHZvaWR9IHVwZGF0ZVB1cnNlQmFsYW5jZSAtIGNvbW1pdCB0aGVcbiAqICAgcHVyc2UgYmFsYW5jZVxuICogQHBhcmFtIHtBbW91bnR9IGFtb3VudCAtIHRoZSBhbW91bnQgdG8gYmUgd2l0aGRyYXduXG4gKiBAcGFyYW0ge1NldFN0b3JlPFBheW1lbnQ+fSByZWNvdmVyeVNldFxuICogQHJldHVybnMge1BheW1lbnR9XG4gKi9cbmNvbnN0IHdpdGhkcmF3SW50ZXJuYWw9KFxuY3VycmVudEJhbGFuY2UsXG51cGRhdGVQdXJzZUJhbGFuY2UsXG5hbW91bnQsXG5yZWNvdmVyeVNldCk9Plxue1xuYW1vdW50PWNvZXJjZShhbW91bnQpO1xuQW1vdW50TWF0aC5pc0dURShjdXJyZW50QmFsYW5jZSxhbW91bnQpfHxcbkZhaWwgYFdpdGhkcmF3YWwgb2YgJHthbW91bnR9IGZhaWxlZCBiZWNhdXNlIHRoZSBwdXJzZSBvbmx5IGNvbnRhaW5lZCAke2N1cnJlbnRCYWxhbmNlfWA7XG5jb25zdCBuZXdQdXJzZUJhbGFuY2U9c3VidHJhY3QoY3VycmVudEJhbGFuY2UsYW1vdW50KTtcblxuY29uc3QgcGF5bWVudD1tYWtlUGF5bWVudCgpO1xudHJ5e1xuLyogQ09NTUlUIFBPSU5UIE1vdmUgdGhlIHdpdGhkcmF3biBhc3NldHMgZnJvbSB0aGlzIHB1cnNlIGludG8qL1xuLyogcGF5bWVudC4gVG90YWwgYXNzZXRzIG11c3QgcmVtYWluIGNvbnNlcnZlZC4qL1xudXBkYXRlUHVyc2VCYWxhbmNlKG5ld1B1cnNlQmFsYW5jZSk7XG5pbml0UGF5bWVudChwYXltZW50LGFtb3VudCxyZWNvdmVyeVNldCk7XG4gfWNhdGNoKGVycil7XG5zaHV0ZG93bkxlZGdlcldpdGhGYWlsdXJlKGVycik7XG50aHJvdyBlcnI7XG4gfVxucmV0dXJuIHBheW1lbnQ7XG4gfTtcblxuLyoqIEB0eXBlIHsoKSA9PiBQdXJzZTxLPn0gKi9cbi8qIEB0cy1leHBlY3QtZXJyb3IgdHlwZSBwYXJhbWV0ZXIgY29uZnVzaW9uKi9cbmNvbnN0IG1ha2VFbXB0eVB1cnNlPXByZXBhcmVQdXJzZUtpbmQoXG5pc3N1ZXJCYWdnYWdlLFxubmFtZSxcbmFzc2V0S2luZCxcbmJyYW5kLFxuUHVyc2VJS2l0LFxuaGFyZGVuKHtcbmRlcG9zaXRJbnRlcm5hbCxcbndpdGhkcmF3SW50ZXJuYWx9KSk7XG5cblxuXG4vKiogQHR5cGUge0lzc3VlcjxLPn0gKi9cbi8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCBkdWUgdG8gY2FsbFdoZW4gZGlzY3JlcGFuY3kqL1xuY29uc3QgaXNzdWVyPXByZXBhcmVFeG8oaXNzdWVyQmFnZ2FnZSwgYCR7bmFtZX0gaXNzdWVyYCxJc3N1ZXJJLHtcbmdldEJyYW5kKCl7XG5yZXR1cm4gYnJhbmQ7XG4gfSxcbmdldEFsbGVnZWROYW1lKCl7XG5yZXR1cm4gbmFtZTtcbiB9LFxuZ2V0QXNzZXRLaW5kKCl7XG5yZXR1cm4gYXNzZXRLaW5kO1xuIH0sXG5nZXREaXNwbGF5SW5mbygpe1xucmV0dXJuIGRpc3BsYXlJbmZvO1xuIH0sXG5tYWtlRW1wdHlQdXJzZSgpe1xucmV0dXJuIG1ha2VFbXB0eVB1cnNlKCk7XG4gfSxcbi8qKiBAcGFyYW0ge1BheW1lbnR9IHBheW1lbnQgYXdhaXRlZCBieSBjYWxsV2hlbiAqL1xuaXNMaXZlKHBheW1lbnQpe1xuLyogSXNzdWVySSBkZWxheXMgY2FsbGluZyB0aGlzIG1ldGhvZCB1bnRpbCBgcGF5bWVudGAgaXMgYSBSZW1vdGFibGUqL1xucmV0dXJuIHBheW1lbnRMZWRnZXIuaGFzKHBheW1lbnQpO1xuIH0sXG4vKiogQHBhcmFtIHtQYXltZW50fSBwYXltZW50IGF3YWl0ZWQgYnkgY2FsbFdoZW4gKi9cbmdldEFtb3VudE9mKHBheW1lbnQpe1xuLyogSXNzdWVySSBkZWxheXMgY2FsbGluZyB0aGlzIG1ldGhvZCB1bnRpbCBgcGF5bWVudGAgaXMgYSBSZW1vdGFibGUqL1xuYXNzZXJ0TGl2ZVBheW1lbnQocGF5bWVudCk7XG5yZXR1cm4gcGF5bWVudExlZGdlci5nZXQocGF5bWVudCk7XG4gfSxcbi8qKlxuICogQHBhcmFtIHtQYXltZW50fSBwYXltZW50IGF3YWl0ZWQgYnkgY2FsbFdoZW5cbiAqIEBwYXJhbSB7UGF0dGVybn0gb3B0QW1vdW50U2hhcGVcbiAqL1xuYnVybihwYXltZW50LG9wdEFtb3VudFNoYXBlPXVuZGVmaW5lZCl7XG4vKiBJc3N1ZXJJIGRlbGF5cyBjYWxsaW5nIHRoaXMgbWV0aG9kIHVudGlsIGBwYXltZW50YCBpcyBhIFJlbW90YWJsZSovXG5hc3NlcnRMaXZlUGF5bWVudChwYXltZW50KTtcbmNvbnN0IHBheW1lbnRCYWxhbmNlPXBheW1lbnRMZWRnZXIuZ2V0KHBheW1lbnQpO1xuYXNzZXJ0QW1vdW50Q29uc2lzdGVudChwYXltZW50QmFsYW5jZSxvcHRBbW91bnRTaGFwZSk7XG50cnl7XG4vKiBDT01NSVQgUE9JTlQuKi9cbmRlbGV0ZVBheW1lbnQocGF5bWVudCk7XG4gfWNhdGNoKGVycil7XG5zaHV0ZG93bkxlZGdlcldpdGhGYWlsdXJlKGVycik7XG50aHJvdyBlcnI7XG4gfVxucmV0dXJuIHBheW1lbnRCYWxhbmNlO1xuIH19KTtcblxuXG4vKipcbiAqIFByb3ZpZGVzIGZvciB0aGUgcmVjb3Zlcnkgb2YgbmV3bHkgbWludGVkIGJ1dCBub3QteWV0LWRlcG9zaXRlZCBwYXltZW50cy5cbiAqXG4gKiBCZWNhdXNlIHRoZSBgbWludFJlY292ZXJ5UHVyc2VgIGlzIHBsYWNlZCBpbiBiYWdnYWdlLCBldmVuIGlmIHRoZSBjYWxsZXIgb2ZcbiAqIGBtYWtlSXNzdWVyS2l0YCBkcm9wcyBpdCBvbiB0aGUgZmxvb3IsIGl0IGNhbiBzdGlsbCBiZSByZWNvdmVyZWQgaW4gYW5cbiAqIGVtZXJnZW5jeSB1cGdyYWRlLlxuICpcbiAqIEB0eXBlIHtQdXJzZTxLPn1cbiAqL1xuY29uc3QgbWludFJlY292ZXJ5UHVyc2U9cHJvdmlkZShpc3N1ZXJCYWdnYWdlLCdtaW50UmVjb3ZlcnlQdXJzZScsKCk9PlxubWFrZUVtcHR5UHVyc2UoKSk7XG5cblxuLyoqIEB0eXBlIHtNaW50PEs+fSAqL1xuY29uc3QgbWludD1wcmVwYXJlRXhvKGlzc3VlckJhZ2dhZ2UsIGAke25hbWV9IG1pbnRgLE1pbnRJLHtcbmdldElzc3Vlcigpe1xucmV0dXJuIGlzc3VlcjtcbiB9LFxubWludFBheW1lbnQobmV3QW1vdW50KXtcbi8qIEB0cy1leHBlY3QtZXJyb3IgY2hlY2tlZCBjYXN0Ki9cbm5ld0Ftb3VudD1jb2VyY2UobmV3QW1vdW50KTtcbm11c3RNYXRjaChuZXdBbW91bnQsYW1vdW50U2hhcGUsJ21pbnRlZCBhbW91bnQnKTtcbi8qIGByYXdQYXltZW50YCBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIGFueSByZWNvdmVyeSBzZXQsIGFuZCovXG4vKiBzbyBtdXN0IG5vdCBlc2NhcGUuKi9cbmNvbnN0IHJhd1BheW1lbnQ9bWFrZVBheW1lbnQoKTtcbmluaXRQYXltZW50KHJhd1BheW1lbnQsbmV3QW1vdW50LHVuZGVmaW5lZCk7XG5cbmNvbnN0IG1pbnRSZWNvdmVyeVB1cnNlQmVmb3JlPW1pbnRSZWNvdmVyeVB1cnNlLmdldEN1cnJlbnRBbW91bnQoKTtcbm1pbnRSZWNvdmVyeVB1cnNlLmRlcG9zaXQocmF3UGF5bWVudCxuZXdBbW91bnQpO1xuY29uc3QgcGF5bWVudD1taW50UmVjb3ZlcnlQdXJzZS53aXRoZHJhdyhuZXdBbW91bnQpO1xuY29uc3QgbWludFJlY292ZXJ5UHVyc2VBZnRlcj1taW50UmVjb3ZlcnlQdXJzZS5nZXRDdXJyZW50QW1vdW50KCk7XG5hc3NlcnQoa2V5RVEobWludFJlY292ZXJ5UHVyc2VCZWZvcmUsbWludFJlY292ZXJ5UHVyc2VBZnRlcikpO1xucmV0dXJuIHBheW1lbnQ7XG4gfX0pO1xuXG5cbmNvbnN0IGlzc3VlcktpdD1oYXJkZW4oe2lzc3VlcixtaW50LGJyYW5kLG1pbnRSZWNvdmVyeVB1cnNlfSk7XG5yZXR1cm4gaXNzdWVyS2l0O1xuIH07JGjigI1fb25jZS5wcmVwYXJlUGF5bWVudExlZGdlcihwcmVwYXJlUGF5bWVudExlZGdlcik7XG5oYXJkZW4ocHJlcGFyZVBheW1lbnRMZWRnZXIpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InByZXBhcmVQYXltZW50TGVkZ2VyIjpbInByZXBhcmVQYXltZW50TGVkZ2VyIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAOYW4qSyEQAAshEAACEAAABAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvcHVyc2UuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9zdG9yZSIsIkBhZ29yaWMvdmF0LWRhdGEiLCIuL2Ftb3VudE1hdGguanMiLCIuL3RyYW5zaWVudE5vdGlmaWVyLmpzIl0sImV4cG9ydHMiOlsicHJlcGFyZVB1cnNlS2luZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBNLHByZXBhcmVFeG9DbGFzc0tpdCxtYWtlU2NhbGFyQmlnU2V0U3RvcmUsQW1vdW50TWF0aCxtYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQ7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiTVwiLCBbJGjigI1fYSA9PiAoTSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJwcmVwYXJlRXhvQ2xhc3NLaXRcIiwgWyRo4oCNX2EgPT4gKHByZXBhcmVFeG9DbGFzc0tpdCA9ICRo4oCNX2EpXV0sW1wibWFrZVNjYWxhckJpZ1NldFN0b3JlXCIsIFskaOKAjV9hID0+IChtYWtlU2NhbGFyQmlnU2V0U3RvcmUgPSAkaOKAjV9hKV1dXV0sW1wiLi9hbW91bnRNYXRoLmpzXCIsIFtbXCJBbW91bnRNYXRoXCIsIFskaOKAjV9hID0+IChBbW91bnRNYXRoID0gJGjigI1fYSldXV1dLFtcIi4vdHJhbnNpZW50Tm90aWZpZXIuanNcIiwgW1tcIm1ha2VUcmFuc2llbnROb3RpZmllcktpdFwiLCBbJGjigI1fYSA9PiAobWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cbi8qIFRPRE8gYEludGVyZmFjZUd1YXJkYCB0eXBlIHBhcmFtZXRlciovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL3BhdHRlcm5zJykuSW50ZXJmYWNlR3VhcmR9IEludGVyZmFjZUd1YXJkICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BhZ29yaWMvdmF0LWRhdGEnKS5CYWdnYWdlfSBCYWdnYWdlICovXG5cbmNvbnN0e0ZhaWx9PWFzc2VydDtcblxuLyoqXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGlzc3VlckJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge0Fzc2V0S2luZH0gYXNzZXRLaW5kXG4gKiBAcGFyYW0ge0JyYW5kfSBicmFuZFxuICogQHBhcmFtIHt7XG4gKiAgIHB1cnNlOiBJbnRlcmZhY2VHdWFyZDtcbiAqICAgZGVwb3NpdEZhY2V0OiBJbnRlcmZhY2VHdWFyZDtcbiAqIH19IFB1cnNlSUtpdFxuICogQHBhcmFtIHt7XG4gKiAgIGRlcG9zaXRJbnRlcm5hbDogYW55O1xuICogICB3aXRoZHJhd0ludGVybmFsOiBhbnk7XG4gKiB9fSBwdXJzZU1ldGhvZHNcbiAqL1xuY29uc3QgICAgICAgIHByZXBhcmVQdXJzZUtpbmQ9KFxuaXNzdWVyQmFnZ2FnZSxcbm5hbWUsXG5hc3NldEtpbmQsXG5icmFuZCxcblB1cnNlSUtpdCxcbnB1cnNlTWV0aG9kcyk9Plxue1xuY29uc3QgYW1vdW50U2hhcGU9YnJhbmQuZ2V0QW1vdW50U2hhcGUoKTtcblxuLyogTm90ZTogVmlydHVhbCBmb3IgaGlnaCBjYXJkaW5hbGl0eSwgYnV0ICpub3QqIGR1cmFibGUsIGFuZCBzbyovXG4vKiBicm9rZW4gYWNyb3NzIGFuIHVwZ3JhZGUuKi9cbmNvbnN0e3Byb3ZpZGVOb3RpZmllcix1cGRhdGU6dXBkYXRlQmFsYW5jZX09bWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0KCk7XG5cbmNvbnN0IHVwZGF0ZVB1cnNlQmFsYW5jZT0oc3RhdGUsbmV3UHVyc2VCYWxhbmNlLHB1cnNlKT0+e1xuc3RhdGUuY3VycmVudEJhbGFuY2U9bmV3UHVyc2VCYWxhbmNlO1xudXBkYXRlQmFsYW5jZShwdXJzZSxwdXJzZS5nZXRDdXJyZW50QW1vdW50KCkpO1xuIH07XG5cbi8qIC0gVGhpcyBraW5kIGlzIGEgcGFpciBvZiBwdXJzZSBhbmQgZGVwb3NpdEZhY2V0IHRoYXQgaGF2ZSBhIDE6MSovXG4vKiBjb3JyZXNwb25kZW5jZS4qL1xuLyogLSBUaGV5IGFyZSB2aXJ0dWFsaXplZCB0b2dldGhlciB0byBzaGFyZSBhIHNpbmdsZSBzdGF0ZSByZWNvcmQuKi9cbi8qIC0gQW4gYWx0ZXJuYXRpdmUgZGVzaWduIGNvbnNpZGVyZWQgd2FzIHRvIGhhdmUgdGhpcyByZXR1cm4gYSBQdXJzZSBhbG9uZSovXG4vKiB0aGF0IGNyZWF0ZWQgZGVwb3NpdEZhY2V0IGFzIG5lZWRlZC4gQnV0IHRoaXMgYXBwcm9hY2ggZW5zdXJlcyBhIGNvbnN0YW50Ki9cbi8qIGlkZW50aXR5IGZvciB0aGUgZmFjZXQgYW5kIGV4ZXJjaXNlcyB0aGUgbXVsdGktZmFjZXRlZCBvYmplY3Qgc3R5bGUuKi9cbmNvbnN0e2RlcG9zaXRJbnRlcm5hbCx3aXRoZHJhd0ludGVybmFsfT1wdXJzZU1ldGhvZHM7XG5jb25zdCBtYWtlUHVyc2VLaXQ9cHJlcGFyZUV4b0NsYXNzS2l0KFxuaXNzdWVyQmFnZ2FnZSxcbiBgJHtuYW1lfSBQdXJzZWAsXG5QdXJzZUlLaXQsXG4oKT0+e1xuY29uc3QgY3VycmVudEJhbGFuY2U9QW1vdW50TWF0aC5tYWtlRW1wdHkoYnJhbmQsYXNzZXRLaW5kKTtcblxuLyoqIEB0eXBlIHtTZXRTdG9yZTxQYXltZW50Pn0gKi9cbmNvbnN0IHJlY292ZXJ5U2V0PW1ha2VTY2FsYXJCaWdTZXRTdG9yZSgncmVjb3Zlcnkgc2V0Jyx7XG5kdXJhYmxlOnRydWV9KTtcblxuXG5yZXR1cm57XG5jdXJyZW50QmFsYW5jZSxcbnJlY292ZXJ5U2V0fTtcblxuIH0sXG57XG5wdXJzZTp7XG5kZXBvc2l0KHNyY1BheW1lbnQsb3B0QW1vdW50U2hhcGU9dW5kZWZpbmVkKXtcbi8qIFB1cnNlSSBkb2VzICpub3QqIGRlbGF5IGBkZXBvc2l0YCB1bnRpbCBgc3JjUGF5bWVudGAgaXMgZnVsZnVsbGVkLiovXG4vKiBTZWUgdGhlIGNvbW1lbnRzIG9uIFB1cnNlSS5kZXBvc2l0IGluIHR5cGVHdWFyZHMuanMqL1xuY29uc3R7c3RhdGV9PXRoaXM7XG4vKiBOb3RlIENPTU1JVCBQT0lOVCB3aXRoaW4gZGVwb3NpdC4qL1xucmV0dXJuIGRlcG9zaXRJbnRlcm5hbChcbnN0YXRlLmN1cnJlbnRCYWxhbmNlLFxuKG5ld1B1cnNlQmFsYW5jZSk9PlxudXBkYXRlUHVyc2VCYWxhbmNlKHN0YXRlLG5ld1B1cnNlQmFsYW5jZSx0aGlzLmZhY2V0cy5wdXJzZSksXG5zcmNQYXltZW50LFxub3B0QW1vdW50U2hhcGUpO1xuXG4gfSxcbndpdGhkcmF3KGFtb3VudCl7XG5jb25zdHtzdGF0ZX09dGhpcztcbi8qIE5vdGUgQ09NTUlUIFBPSU5UIHdpdGhpbiB3aXRoZHJhdy4qL1xucmV0dXJuIHdpdGhkcmF3SW50ZXJuYWwoXG5zdGF0ZS5jdXJyZW50QmFsYW5jZSxcbihuZXdQdXJzZUJhbGFuY2UpPT5cbnVwZGF0ZVB1cnNlQmFsYW5jZShzdGF0ZSxuZXdQdXJzZUJhbGFuY2UsdGhpcy5mYWNldHMucHVyc2UpLFxuYW1vdW50LFxuc3RhdGUucmVjb3ZlcnlTZXQpO1xuXG4gfSxcbmdldEN1cnJlbnRBbW91bnQoKXtcbnJldHVybiB0aGlzLnN0YXRlLmN1cnJlbnRCYWxhbmNlO1xuIH0sXG5nZXRDdXJyZW50QW1vdW50Tm90aWZpZXIoKXtcbnJldHVybiBwcm92aWRlTm90aWZpZXIodGhpcy5mYWNldHMucHVyc2UpO1xuIH0sXG5nZXRBbGxlZ2VkQnJhbmQoKXtcbnJldHVybiBicmFuZDtcbiB9LFxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbmdldERlcG9zaXRGYWNldCgpe1xucmV0dXJuIHRoaXMuZmFjZXRzLmRlcG9zaXRGYWNldDtcbiB9LFxuXG5nZXRSZWNvdmVyeVNldCgpe1xucmV0dXJuIHRoaXMuc3RhdGUucmVjb3ZlcnlTZXQuc25hcHNob3QoKTtcbiB9LFxucmVjb3ZlckFsbCgpe1xuY29uc3R7c3RhdGUsZmFjZXRzfT10aGlzO1xubGV0IGFtb3VudD1BbW91bnRNYXRoLm1ha2VFbXB0eShicmFuZCxhc3NldEtpbmQpO1xuZm9yKGNvbnN0IHBheW1lbnQgb2Ygc3RhdGUucmVjb3ZlcnlTZXQua2V5cygpKXtcbi8qIFRoaXMgZG9lcyBjYXVzZSBkZWxldGlvbnMgZnJvbSB0aGUgc2V0IHdoaWxlIGl0ZXJhdGluZywqL1xuLyogYnV0IHRoaXMgc3BlY2lhbCBjYXNlIGlzIGFsbG93ZWQuKi9cbmNvbnN0IGRlbHRhPWZhY2V0cy5wdXJzZS5kZXBvc2l0KHBheW1lbnQpO1xuYW1vdW50PUFtb3VudE1hdGguYWRkKGFtb3VudCxkZWx0YSxicmFuZCk7XG4gfVxuc3RhdGUucmVjb3ZlcnlTZXQuZ2V0U2l6ZSgpPT09MHx8XG5GYWlsIGBpbnRlcm5hbDogUmVtYWluaW5nIHVucmVjb3ZlcmVkIHBheW1lbnRzOiAke2ZhY2V0cy5wdXJzZS5nZXRSZWNvdmVyeVNldCgpfWA7XG5yZXR1cm4gYW1vdW50O1xuIH19LFxuXG5kZXBvc2l0RmFjZXQ6e1xucmVjZWl2ZSguLi5hcmdzKXtcbnJldHVybiB0aGlzLmZhY2V0cy5wdXJzZS5kZXBvc2l0KC4uLmFyZ3MpO1xuIH19fSxcblxuXG57XG5zdGF0ZVNoYXBlOntcbmN1cnJlbnRCYWxhbmNlOmFtb3VudFNoYXBlLFxucmVjb3ZlcnlTZXQ6TS5yZW1vdGFibGUoJ3JlY292ZXJ5U2V0Jyl9fSk7XG5cblxuXG5yZXR1cm4oKT0+bWFrZVB1cnNlS2l0KCkucHVyc2U7XG4gfTskaOKAjV9vbmNlLnByZXBhcmVQdXJzZUtpbmQocHJlcGFyZVB1cnNlS2luZCk7XG5oYXJkZW4ocHJlcGFyZVB1cnNlS2luZCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicHJlcGFyZVB1cnNlS2luZCI6WyJwcmVwYXJlUHVyc2VLaW5kIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAD6sU2AUBgAAFAYAAC0AAABAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvdHJhbnNpZW50Tm90aWZpZXIuanN7ImltcG9ydHMiOlsiQGFnb3JpYy92YXQtZGF0YSIsIkBhZ29yaWMvc3RvcmUiLCJAYWdvcmljL25vdGlmaWVyIl0sImV4cG9ydHMiOlsibWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IG1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUscHJvdmlkZUxhenksbWFrZU5vdGlmaWVyS2l0OyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvdmF0LWRhdGFcIiwgW1tcIm1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmVcIiwgWyRo4oCNX2EgPT4gKG1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wicHJvdmlkZUxhenlcIiwgWyRo4oCNX2EgPT4gKHByb3ZpZGVMYXp5ID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvbm90aWZpZXJcIiwgW1tcIm1ha2VOb3RpZmllcktpdFwiLCBbJGjigI1fYSA9PiAobWFrZU5vdGlmaWVyS2l0ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuLyogTm90ZTogVmlydHVhbCBmb3IgaGlnaCBjYXJkaW5hbGl0eSwgYnV0ICpub3QqIGR1cmFibGUsIGFuZCBzbyovXG4vKiBicm9rZW4gYWNyb3NzIGFuIHVwZ3JhZGUuKi9cbmNvbnN0ICAgICAgICBtYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQ9KCk9Pntcbi8qKiBAdHlwZSB7V2Vha01hcFN0b3JlPFB1cnNlLCBOb3RpZmllclJlY29yZDxhbnk+Pn0gKi9cbmNvbnN0IHRyYW5zaWVudE5vdGlmZXJLaXRzPW1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUoXG4ndHJhbnNpZW50Tm90aWZlcktpdHMnKTtcblxuXG5jb25zdCBwcm92aWRlTm90aWZpZXJLaXQ9KGtleSk9PlxucHJvdmlkZUxhenkodHJhbnNpZW50Tm90aWZlcktpdHMsa2V5LCgpPT5cbm1ha2VOb3RpZmllcktpdChrZXkuZ2V0Q3VycmVudEFtb3VudCgpKSk7XG5cblxuY29uc3QgcHJvdmlkZU5vdGlmaWVyPShrZXkpPT5wcm92aWRlTm90aWZpZXJLaXQoa2V5KS5ub3RpZmllcjtcbmNvbnN0IHVwZGF0ZT0oa2V5LG5ld1ZhbHVlKT0+e1xuaWYodHJhbnNpZW50Tm90aWZlcktpdHMuaGFzKGtleSkpe1xuY29uc3R7dXBkYXRlcn09dHJhbnNpZW50Tm90aWZlcktpdHMuZ2V0KGtleSk7XG51cGRhdGVyLnVwZGF0ZVN0YXRlKG5ld1ZhbHVlKTtcbiB9XG4gfTtcblxucmV0dXJue3Byb3ZpZGVOb3RpZmllcix1cGRhdGV9O1xuIH07JGjigI1fb25jZS5tYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQobWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0KTtcbmhhcmRlbihtYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VUcmFuc2llbnROb3RpZmllcktpdCI6WyJtYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAEnOAkIUnAACFJwAAJgAAAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy90eXBlR3VhcmRzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3BhdHRlcm5zIl0sImV4cG9ydHMiOlsiQW1vdW50U2hhcGUiLCJBc3NldEtpbmRTaGFwZSIsIkJyYW5kSSIsIkJyYW5kU2hhcGUiLCJEZXBvc2l0RmFjZXRTaGFwZSIsIkRpc3BsYXlJbmZvU2hhcGUiLCJJc3N1ZXJLaXRTaGFwZSIsIklzc3VlclNoYXBlIiwiTUFYX0FCU09MVVRFX0RFQ0lNQUxfUExBQ0VTIiwiTWludFNoYXBlIiwiTm90aWZpZXJTaGFwZSIsIlBheW1lbnRTaGFwZSIsIlB1cnNlU2hhcGUiLCJSYXRpb1NoYXBlIiwiaXNDb3B5QmFnVmFsdWUiLCJpc0NvcHlTZXRWYWx1ZSIsImlzTmF0VmFsdWUiLCJpc1NldFZhbHVlIiwibWFrZUlzc3VlckludGVyZmFjZXMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgTSxtYXRjaGVzLGdldEludGVyZmFjZUd1YXJkUGF5bG9hZDskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wiTVwiLCBbJGjigI1fYSA9PiAoTSA9ICRo4oCNX2EpXV0sW1wibWF0Y2hlc1wiLCBbJGjigI1fYSA9PiAobWF0Y2hlcyA9ICRo4oCNX2EpXV0sW1wiZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkXCIsIFskaOKAjV9hID0+IChnZXRJbnRlcmZhY2VHdWFyZFBheWxvYWQgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cbmNvbnN0ICAgICAgICBCcmFuZFNoYXBlPU0ucmVtb3RhYmxlKCdCcmFuZCcpOyRo4oCNX29uY2UuQnJhbmRTaGFwZShCcmFuZFNoYXBlKTtcbmNvbnN0ICAgICAgICBJc3N1ZXJTaGFwZT1NLnJlbW90YWJsZSgnSXNzdWVyJyk7JGjigI1fb25jZS5Jc3N1ZXJTaGFwZShJc3N1ZXJTaGFwZSk7XG5jb25zdCAgICAgICAgUGF5bWVudFNoYXBlPU0ucmVtb3RhYmxlKCdQYXltZW50Jyk7JGjigI1fb25jZS5QYXltZW50U2hhcGUoUGF5bWVudFNoYXBlKTtcbmNvbnN0ICAgICAgICBQdXJzZVNoYXBlPU0ucmVtb3RhYmxlKCdQdXJzZScpOyRo4oCNX29uY2UuUHVyc2VTaGFwZShQdXJzZVNoYXBlKTtcbmNvbnN0ICAgICAgICBEZXBvc2l0RmFjZXRTaGFwZT1NLnJlbW90YWJsZSgnRGVwb3NpdEZhY2V0Jyk7JGjigI1fb25jZS5EZXBvc2l0RmFjZXRTaGFwZShEZXBvc2l0RmFjZXRTaGFwZSk7XG5jb25zdCAgICAgICAgTm90aWZpZXJTaGFwZT1NLnJlbW90YWJsZSgnTm90aWZpZXInKTskaOKAjV9vbmNlLk5vdGlmaWVyU2hhcGUoTm90aWZpZXJTaGFwZSk7XG5jb25zdCAgICAgICAgTWludFNoYXBlPU0ucmVtb3RhYmxlKCdNaW50Jyk7XG5cbi8qKlxuICogV2hlbiB0aGUgQW1vdW50VmFsdWUgb2YgYW4gQW1vdW50IGZpdHMgdGhlIE5hdFZhbHVlU2hhcGUsIGkuZS4sIHdoZW4gaXQgaXMgYVxuICogbm9uLW5lZ2F0aXZlIGJpZ2ludCwgdGhlbiBpdCByZXByZXNlbnRzIHRoYXQgbWFueSB1bml0cyBvZiB0aGUgZnVuZ2libGUgYXNzZXRcbiAqIHJlcHJlc2VudGVkIGJ5IHRoYXQgYW1vdW50LiBUaGUgYnJhbmQgb2YgdGhhdCBhbW91bnQgc2hvdWxkIGluZGVlZCByZXByZXNlbnRcbiAqIGEga2luZCBvZiBhc3NldCBjb25zaXN0aW5nIG9mIGEgY291bnRhYmxlIHNldCBvZiBmdW5naWJsZSB1bml0cy5cbiAqLyRo4oCNX29uY2UuTWludFNoYXBlKE1pbnRTaGFwZSk7XG5jb25zdCBOYXRWYWx1ZVNoYXBlPU0ubmF0KCk7XG5cbi8qKlxuICogV2hlbiB0aGUgQW1vdW50VmFsdWUgb2YgYW4gQW1vdW50IGZpdHMgdGhlIENvcHlTZXRWYWx1ZVNoYXBlLCBpLmUuLCB3aGVuIGl0XG4gKiBpcyBhIENvcHlTZXQsIHRoZW4gaXQgcmVwcmVzZW50cyB0aGUgc2V0IG9mIHRob3NlIGtleXMsIHdoZXJlIGVhY2gga2V5XG4gKiByZXByZXNlbnRzIHNvbWUgaW5kaXZpZHVhbCBub24tZnVuZ2libGUgaXRlbSwgbGlrZSBhIGNvbmNlcnQgdGlja2V0LCBmcm9tIHRoZVxuICogbm9uLWZ1bmdpYmxlIGFzc2V0IGNsYXNzIHJlcHJlc2VudGVkIGJ5IHRoYXQgYW1vdW50J3MgYnJhbmQuIFRoZSBhbW91bnRcbiAqIGl0c2VsZiByZXByZXNlbnRzIHRoZSBzZXQgb2YgdGhlc2UgaXRlbXMsIGFzIG9wcG9zZWQgdG8gYW55IG9mIHRoZSBvdGhlclxuICogaXRlbXMgZnJvbSB0aGUgc2FtZSBhc3NldCBjbGFzcy5cbiAqXG4gKiBJZiBhIGdpdmVuIHZhbHVlIGNsYXNzIHJlcHJlc2VudHMgY29uY2VydCB0aWNrZXRzLCBpdCBzZWVtcyBiaXphcnJlIHRoYXQgd2VcbiAqIGNhbiBmb3JtIGFtb3VudHMgb2YgYW55IGtleS4gVGhlIGhhcmQgY29uc3RyYWludCBpcyB0aGF0IHRoZSBjb2RlIHRoYXQgaG9sZHNcbiAqIHRoZSBtaW50IGZvciB0aGF0IGFzc2V0IGNsYXNzLS0tdGhlIG9uZSBhc3NvY2lhdGVkIHdpdGggdGhhdCBicmFuZCwgb25seVxuICogbWludHMgdGhlIGl0ZW1zIHJlcHJlc2VudGluZyB0aGUgcmVhbCB1bml0cyBvZiB0aGF0IGFzc2V0IGNsYXNzIGFzIGRlZmluZWQgYnlcbiAqIGl0LiBBbnlvbmUgZWxzZSBjYW4gcHV0IHRvZ2V0aGVyIGFuIGFtb3VudCBleHByZXNzaW5nLCBmb3IgZXhhbXBsZSwgdGhhdCB0aGV5XG4gKiBcIndhbnRcIiBzb21lIGl0ZW1zIHRoYXQgd2lsbCBuZXZlciBiZSBtaW50ZWQuIFRoYXQgd2FudCB3aWxsIG5ldmVyIGJlXG4gKiBzYXRpc2ZpZWQuIFwiWW91IGNhbid0IGFsd2F5cyBnZXQuLi5cIlxuICovXG5jb25zdCBDb3B5U2V0VmFsdWVTaGFwZT1NLnNldCgpO1xuXG4vKipcbiAqIFdoZW4gdGhlIEFtb3VudFZhbHVlIG9mIGFuIEFtb3VudCBmaXRzIHRoZSBTZXRWYWx1ZVNoYXBlLCBpLmUuLCB3aGVuIGl0IGlzIGFcbiAqIENvcHlBcnJheSBvZiBwYXNzYWJsZSBLZXlzLiBUaGlzIHJlcHJlc2VudGF0aW9uIGlzIGRlcHJlY2F0ZWQuXG4gKlxuICogQGRlcHJlY2F0ZWQgUGxlYXNlIGNoYW5nZSBmcm9tIHVzaW5nIGFycmF5LWJhc2VkIFNldFZhbHVlcyB0byBDb3B5U2V0LWJhc2VkXG4gKiAgIENvcHlTZXRWYWx1ZXMuXG4gKi9cbmNvbnN0IFNldFZhbHVlU2hhcGU9TS5hcnJheU9mKE0ua2V5KCkpO1xuXG4vKipcbiAqIFdoZW4gdGhlIEFtb3VudFZhbHVlIG9mIGFuIEFtb3VudCBmaXRzIHRoZSBDb3B5QmFnVmFsdWVTaGFwZSwgaS5lLiwgd2hlbiBpdFxuICogaXMgYSBDb3B5QmFnLCB0aGVuIGl0IHJlcHJlc2VudHMgdGhlIGJhZyAobXVsdGlzZXQpIG9mIHRob3NlIGtleXMsIHdoZXJlIGVhY2hcbiAqIGtleSByZXByZXNlbnRzIHNvbWUgaW5kaXZpZHVhbCBzZW1pLWZ1bmdpYmxlIGl0ZW0sIGxpa2UgYSBjb25jZXJ0IHRpY2tldCxcbiAqIGZyb20gdGhlIHNlbWktZnVuZ2libGUgYXNzZXQgY2xhc3MgcmVwcmVzZW50ZWQgYnkgdGhhdCBhbW91bnQncyBicmFuZC4gVGhlXG4gKiBudW1iZXIgb2YgdGltZXMgdGhhdCBrZXkgYXBwZWFycyBpbiB0aGUgYmFnIGlzIHRoZSBudW1iZXIgb2YgZnVuZ2libGUgdW5pdHNcbiAqIG9mIHRoYXQga2V5LiBUaGUgYW1vdW50IGl0c2VsZiByZXByZXNlbnRzIHRoZSBiYWcgb2YgdGhlc2UgaXRlbXMsIGFzIG9wcG9zZWRcbiAqIHRvIGFueSBvZiB0aGUgb3RoZXIgaXRlbXMgZnJvbSB0aGUgc2FtZSBhc3NldCBjbGFzcy5cbiAqXG4gKiBJZiBhIGdpdmVuIHZhbHVlIGNsYXNzIHJlcHJlc2VudHMgY29uY2VydCB0aWNrZXRzLCBpdCBzZWVtcyBiaXphcnJlIHRoYXQgd2VcbiAqIGNhbiBmb3JtIGFtb3VudHMgb2YgYW55IGtleS4gVGhlIGhhcmQgY29uc3RyYWludCBpcyB0aGF0IHRoZSBjb2RlIHRoYXQgaG9sZHNcbiAqIHRoZSBtaW50IGZvciB0aGF0IGFzc2V0IGNsYXNzLS0tdGhlIG9uZSBhc3NvY2lhdGVkIHdpdGggdGhhdCBicmFuZCwgb25seVxuICogbWludHMgdGhlIGl0ZW1zIHJlcHJlc2VudGluZyB0aGUgcmVhbCB1bml0cyBvZiB0aGF0IGFzc2V0IGNsYXNzIGFzIGRlZmluZWQgYnlcbiAqIGl0LiBBbnlvbmUgZWxzZSBjYW4gcHV0IHRvZ2V0aGVyIGFuIGFtb3VudCBleHByZXNzaW5nLCBmb3IgZXhhbXBsZSwgdGhhdCB0aGV5XG4gKiBcIndhbnRcIiBzb21lIGl0ZW1zIHRoYXQgd2lsbCBuZXZlciBiZSBtaW50ZWQuIFRoYXQgd2FudCB3aWxsIG5ldmVyIGJlXG4gKiBzYXRpc2ZpZWQuIFwiWW91IGNhbid0IGFsd2F5cyBnZXQuLi5cIlxuICovXG5jb25zdCBDb3B5QmFnVmFsdWVTaGFwZT1NLmJhZygpO1xuXG5jb25zdCBBbW91bnRWYWx1ZVNoYXBlPU0ub3IoXG5OYXRWYWx1ZVNoYXBlLFxuQ29weVNldFZhbHVlU2hhcGUsXG5TZXRWYWx1ZVNoYXBlLFxuQ29weUJhZ1ZhbHVlU2hhcGUpO1xuXG5cbmNvbnN0ICAgICAgICBBbW91bnRTaGFwZT1oYXJkZW4oe1xuYnJhbmQ6QnJhbmRTaGFwZSxcbnZhbHVlOkFtb3VudFZhbHVlU2hhcGV9KTskaOKAjV9vbmNlLkFtb3VudFNoYXBlKEFtb3VudFNoYXBlKTtcblxuXG5jb25zdCAgICAgICAgUmF0aW9TaGFwZT1oYXJkZW4oe1xubnVtZXJhdG9yOkFtb3VudFNoYXBlLFxuZGVub21pbmF0b3I6QW1vdW50U2hhcGV9KTtcblxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB2YWx1ZSBpcyBhIE5hdCBiaWdpbnQuXG4gKlxuICogQHBhcmFtIHtBbW91bnRWYWx1ZX0gdmFsdWVcbiAqIEByZXR1cm5zIHt2YWx1ZSBpcyBYaW1wb3J0KCcuL3R5cGVzLmpzJykuTmF0VmFsdWV9XG4gKi8kaOKAjV9vbmNlLlJhdGlvU2hhcGUoUmF0aW9TaGFwZSk7XG5jb25zdCAgICAgICAgaXNOYXRWYWx1ZT0odmFsdWUpPT5tYXRjaGVzKHZhbHVlLE5hdFZhbHVlU2hhcGUpOyRo4oCNX29uY2UuaXNOYXRWYWx1ZShpc05hdFZhbHVlKTtcbmhhcmRlbihpc05hdFZhbHVlKTtcblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdmFsdWUgaXMgYSBDb3B5U2V0XG4gKlxuICogQHBhcmFtIHtBbW91bnRWYWx1ZX0gdmFsdWVcbiAqIEByZXR1cm5zIHt2YWx1ZSBpcyBDb3B5U2V0fVxuICovXG5jb25zdCAgICAgICAgaXNDb3B5U2V0VmFsdWU9KHZhbHVlKT0+bWF0Y2hlcyh2YWx1ZSxDb3B5U2V0VmFsdWVTaGFwZSk7JGjigI1fb25jZS5pc0NvcHlTZXRWYWx1ZShpc0NvcHlTZXRWYWx1ZSk7XG5oYXJkZW4oaXNDb3B5U2V0VmFsdWUpO1xuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB2YWx1ZSBpcyBhIHBhc3MgYnkgY29weSBhcnJheSBzdHJ1Y3R1cmUuIERvZXMgbm90IGNoZWNrIGZvclxuICogZHVwbGljYXRlcy4gVG8gY2hlY2sgZm9yIGR1cGxpY2F0ZXMsIHVzZSBzZXRNYXRoSGVscGVycy5jb2VyY2UuXG4gKlxuICogQGRlcHJlY2F0ZWQgUGxlYXNlIGNoYW5nZSBmcm9tIHVzaW5nIGFycmF5LWJhc2VkIFNldFZhbHVlcyB0byBDb3B5U2V0LWJhc2VkXG4gKiAgIENvcHlTZXRWYWx1ZXMuXG4gKiBAcGFyYW0ge0Ftb3VudFZhbHVlfSB2YWx1ZVxuICogQHJldHVybnMge3ZhbHVlIGlzIFNldFZhbHVlfVxuICovXG5jb25zdCAgICAgICAgaXNTZXRWYWx1ZT0odmFsdWUpPT5tYXRjaGVzKHZhbHVlLFNldFZhbHVlU2hhcGUpOyRo4oCNX29uY2UuaXNTZXRWYWx1ZShpc1NldFZhbHVlKTtcbmhhcmRlbihpc1NldFZhbHVlKTtcblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdmFsdWUgaXMgYSBDb3B5QmFnXG4gKlxuICogQHBhcmFtIHtBbW91bnRWYWx1ZX0gdmFsdWVcbiAqIEByZXR1cm5zIHt2YWx1ZSBpcyBDb3B5QmFnfVxuICovXG5jb25zdCAgICAgICAgaXNDb3B5QmFnVmFsdWU9KHZhbHVlKT0+bWF0Y2hlcyh2YWx1ZSxDb3B5QmFnVmFsdWVTaGFwZSk7JGjigI1fb25jZS5pc0NvcHlCYWdWYWx1ZShpc0NvcHlCYWdWYWx1ZSk7XG5oYXJkZW4oaXNDb3B5QmFnVmFsdWUpO1xuXG4vKiBPbmUgR09PR09MdGggc2hvdWxkIGJlIGVub3VnaCBkZWNpbWFsIHBsYWNlcyBmb3IgYW55Ym9keS4qL1xuY29uc3QgICAgICAgIE1BWF9BQlNPTFVURV9ERUNJTUFMX1BMQUNFUz0xMDA7JGjigI1fb25jZS5NQVhfQUJTT0xVVEVfREVDSU1BTF9QTEFDRVMoTUFYX0FCU09MVVRFX0RFQ0lNQUxfUExBQ0VTKTtcblxuY29uc3QgICAgICAgIEFzc2V0S2luZFNoYXBlPU0ub3IoJ25hdCcsJ3NldCcsJ2NvcHlTZXQnLCdjb3B5QmFnJyk7JGjigI1fb25jZS5Bc3NldEtpbmRTaGFwZShBc3NldEtpbmRTaGFwZSk7XG5cbmNvbnN0ICAgICAgICBEaXNwbGF5SW5mb1NoYXBlPU0uc3BsaXRSZWNvcmQoXG57fSxcbntcbmRlY2ltYWxQbGFjZXM6TS5hbmQoXG5NLmd0ZSgtTUFYX0FCU09MVVRFX0RFQ0lNQUxfUExBQ0VTKSxcbk0ubHRlKE1BWF9BQlNPTFVURV9ERUNJTUFMX1BMQUNFUykpLFxuXG5hc3NldEtpbmQ6QXNzZXRLaW5kU2hhcGV9LFxuXG57XG4vKiBJbmNsdWRpbmcgdGhpcyBlbXB0eSBgcmVzdGAgZW5zdXJlcyB0aGF0IHRoZXJlIGFyZSBubyBvdGhlciovXG4vKiBwcm9wZXJ0aWVzIGJleW9uZCB0aG9zZSBpbiB0aGUgYGJhc2VgIHJlY29yZC4qL30pOyRo4oCNX29uY2UuRGlzcGxheUluZm9TaGFwZShEaXNwbGF5SW5mb1NoYXBlKTtcblxuXG5cbmNvbnN0ICAgICAgICBJc3N1ZXJLaXRTaGFwZT1oYXJkZW4oe1xuYnJhbmQ6QnJhbmRTaGFwZSxcbm1pbnQ6TWludFNoYXBlLFxubWludFJlY292ZXJ5UHVyc2U6UHVyc2VTaGFwZSxcbmlzc3VlcjpJc3N1ZXJTaGFwZSxcbmRpc3BsYXlJbmZvOkRpc3BsYXlJbmZvU2hhcGV9KTtcblxuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gSW50ZXJmYWNlcyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovJGjigI1fb25jZS5Jc3N1ZXJLaXRTaGFwZShJc3N1ZXJLaXRTaGFwZSk7XG5cbmNvbnN0ICAgICAgICBCcmFuZEk9TS5pbnRlcmZhY2UoJ0JyYW5kJyx7XG5pc015SXNzdWVyOk0uY2FsbFdoZW4oTS5hd2FpdChJc3N1ZXJTaGFwZSkpLnJldHVybnMoTS5ib29sZWFuKCkpLFxuZ2V0QWxsZWdlZE5hbWU6TS5jYWxsKCkucmV0dXJucyhNLnN0cmluZygpKSxcbmdldERpc3BsYXlJbmZvOk0uY2FsbCgpLnJldHVybnMoRGlzcGxheUluZm9TaGFwZSksXG5nZXRBbW91bnRTaGFwZTpNLmNhbGwoKS5yZXR1cm5zKE0ucGF0dGVybigpKX0pO1xuXG5cbi8qKlxuICogQHBhcmFtIHtQYXR0ZXJufSBbYnJhbmRTaGFwZV1cbiAqIEBwYXJhbSB7UGF0dGVybn0gW2Fzc2V0S2luZFNoYXBlXVxuICogQHBhcmFtIHtQYXR0ZXJufSBbYW1vdW50U2hhcGVdXG4gKi8kaOKAjV9vbmNlLkJyYW5kSShCcmFuZEkpO1xuY29uc3QgICAgICAgIG1ha2VJc3N1ZXJJbnRlcmZhY2VzPShcbmJyYW5kU2hhcGU9QnJhbmRTaGFwZSxcbmFzc2V0S2luZFNoYXBlPUFzc2V0S2luZFNoYXBlLFxuYW1vdW50U2hhcGU9QW1vdW50U2hhcGUpPT5cbntcbmNvbnN0IElzc3Vlckk9TS5pbnRlcmZhY2UoJ0lzc3Vlcicse1xuZ2V0QnJhbmQ6TS5jYWxsKCkucmV0dXJucyhicmFuZFNoYXBlKSxcbmdldEFsbGVnZWROYW1lOk0uY2FsbCgpLnJldHVybnMoTS5zdHJpbmcoKSksXG5nZXRBc3NldEtpbmQ6TS5jYWxsKCkucmV0dXJucyhhc3NldEtpbmRTaGFwZSksXG5nZXREaXNwbGF5SW5mbzpNLmNhbGwoKS5yZXR1cm5zKERpc3BsYXlJbmZvU2hhcGUpLFxubWFrZUVtcHR5UHVyc2U6TS5jYWxsKCkucmV0dXJucyhQdXJzZVNoYXBlKSxcblxuaXNMaXZlOk0uY2FsbFdoZW4oTS5hd2FpdChQYXltZW50U2hhcGUpKS5yZXR1cm5zKE0uYm9vbGVhbigpKSxcbmdldEFtb3VudE9mOk0uY2FsbFdoZW4oTS5hd2FpdChQYXltZW50U2hhcGUpKS5yZXR1cm5zKGFtb3VudFNoYXBlKSxcbmJ1cm46TS5jYWxsV2hlbihNLmF3YWl0KFBheW1lbnRTaGFwZSkpLlxub3B0aW9uYWwoTS5wYXR0ZXJuKCkpLlxucmV0dXJucyhhbW91bnRTaGFwZSl9KTtcblxuXG5jb25zdCBNaW50ST1NLmludGVyZmFjZSgnTWludCcse1xuZ2V0SXNzdWVyOk0uY2FsbCgpLnJldHVybnMoSXNzdWVyU2hhcGUpLFxubWludFBheW1lbnQ6TS5jYWxsKGFtb3VudFNoYXBlKS5yZXR1cm5zKFBheW1lbnRTaGFwZSl9KTtcblxuXG5jb25zdCBQYXltZW50ST1NLmludGVyZmFjZSgnUGF5bWVudCcse1xuZ2V0QWxsZWdlZEJyYW5kOk0uY2FsbCgpLnJldHVybnMoYnJhbmRTaGFwZSl9KTtcblxuXG5jb25zdCBQdXJzZUk9TS5pbnRlcmZhY2UoJ1B1cnNlJyx7XG5nZXRBbGxlZ2VkQnJhbmQ6TS5jYWxsKCkucmV0dXJucyhicmFuZFNoYXBlKSxcbmdldEN1cnJlbnRBbW91bnQ6TS5jYWxsKCkucmV0dXJucyhhbW91bnRTaGFwZSksXG5nZXRDdXJyZW50QW1vdW50Tm90aWZpZXI6TS5jYWxsKCkucmV0dXJucyhOb3RpZmllclNoYXBlKSxcbi8qIFB1cnNlSSBkb2VzICpub3QqIGRlbGF5IGBkZXBvc2l0YCB1bnRpbCBgc3JjUGF5bWVudGAgaXMgZnVsZnVsbGVkLiovXG4vKiBSYXRoZXIsIHRoZSBzZW1hbnRpY3Mgb2YgYGRlcG9zaXRgIHJlcXVpcmUgaXQgdG8gcHJvdmlkZSBpdHMqL1xuLyogY2FsbGVycyB3aXRoIGEgc3Ryb25nIGd1YXJhbnRlZSB0aGF0IGBkZXBvc2l0YCBtZXNzYWdlcyBhcmUqL1xuLyogcHJvY2Vzc2VkIHdpdGhvdXQgZnVydGhlciBkZWxheSBpbiB0aGUgb3JkZXIgdGhleSBhcnJpdmUuKi9cbi8qIFB1cnNlSSB0aGVyZWZvcmUgcmVxdWlyZXMgdGhhdCB0aGUgYHNyY1BheW1lbnRgIGFyZ3VtZW50IGFscmVhZHkqL1xuLyogYmUgYSByZW1vdGFibGUsIG5vdCBhIHByb21pc2UuKi9cbi8qIFB1cnNlSSBvbmx5IGNhbGxzIHRoaXMgcmF3IG1ldGhvZCBhZnRlciB2YWxpZGF0aW5nIHRoYXQqL1xuLyogYHNyY1BheW1lbnRgIGlzIGEgcmVtb3RhYmxlLCBsZWF2aW5nIGl0Ki9cbi8qIHRvIHRoaXMgcmF3IG1ldGhvZCB0byB2YWxpZGF0ZSB0aGF0IHRoaXMgcmVtb3RhYmxlIGlzIGFjdHVhbGx5Ki9cbi8qIGEgbGl2ZSBwYXltZW50IG9mIHRoZSBjb3JyZWN0IGJyYW5kIHdpdGggc3VmZmljaWVudCBmdW5kcy4qL1xuZGVwb3NpdDpNLmNhbGwoUGF5bWVudFNoYXBlKS5vcHRpb25hbChNLnBhdHRlcm4oKSkucmV0dXJucyhhbW91bnRTaGFwZSksXG5nZXREZXBvc2l0RmFjZXQ6TS5jYWxsKCkucmV0dXJucyhEZXBvc2l0RmFjZXRTaGFwZSksXG53aXRoZHJhdzpNLmNhbGwoYW1vdW50U2hhcGUpLnJldHVybnMoUGF5bWVudFNoYXBlKSxcbmdldFJlY292ZXJ5U2V0Ok0uY2FsbCgpLnJldHVybnMoTS5zZXRPZihQYXltZW50U2hhcGUpKSxcbnJlY292ZXJBbGw6TS5jYWxsKCkucmV0dXJucyhhbW91bnRTaGFwZSl9KTtcblxuXG5jb25zdCBEZXBvc2l0RmFjZXRJPU0uaW50ZXJmYWNlKCdEZXBvc2l0RmFjZXQnLHtcbnJlY2VpdmU6Z2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkKFB1cnNlSSkubWV0aG9kR3VhcmRzLmRlcG9zaXR9KTtcblxuXG5jb25zdCBQdXJzZUlLaXQ9aGFyZGVuKHtcbnB1cnNlOlB1cnNlSSxcbmRlcG9zaXRGYWNldDpEZXBvc2l0RmFjZXRJfSk7XG5cblxucmV0dXJuIGhhcmRlbih7XG5Jc3N1ZXJJLFxuTWludEksXG5QYXltZW50SSxcblB1cnNlSUtpdH0pO1xuXG4gfTskaOKAjV9vbmNlLm1ha2VJc3N1ZXJJbnRlcmZhY2VzKG1ha2VJc3N1ZXJJbnRlcmZhY2VzKTtcbmhhcmRlbihtYWtlSXNzdWVySW50ZXJmYWNlcyk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQnJhbmRTaGFwZSI6WyJCcmFuZFNoYXBlIl0sIklzc3VlclNoYXBlIjpbIklzc3VlclNoYXBlIl0sIlBheW1lbnRTaGFwZSI6WyJQYXltZW50U2hhcGUiXSwiUHVyc2VTaGFwZSI6WyJQdXJzZVNoYXBlIl0sIkRlcG9zaXRGYWNldFNoYXBlIjpbIkRlcG9zaXRGYWNldFNoYXBlIl0sIk5vdGlmaWVyU2hhcGUiOlsiTm90aWZpZXJTaGFwZSJdLCJNaW50U2hhcGUiOlsiTWludFNoYXBlIl0sIkFtb3VudFNoYXBlIjpbIkFtb3VudFNoYXBlIl0sIlJhdGlvU2hhcGUiOlsiUmF0aW9TaGFwZSJdLCJpc05hdFZhbHVlIjpbImlzTmF0VmFsdWUiXSwiaXNDb3B5U2V0VmFsdWUiOlsiaXNDb3B5U2V0VmFsdWUiXSwiaXNTZXRWYWx1ZSI6WyJpc1NldFZhbHVlIl0sImlzQ29weUJhZ1ZhbHVlIjpbImlzQ29weUJhZ1ZhbHVlIl0sIk1BWF9BQlNPTFVURV9ERUNJTUFMX1BMQUNFUyI6WyJNQVhfQUJTT0xVVEVfREVDSU1BTF9QTEFDRVMiXSwiQXNzZXRLaW5kU2hhcGUiOlsiQXNzZXRLaW5kU2hhcGUiXSwiRGlzcGxheUluZm9TaGFwZSI6WyJEaXNwbGF5SW5mb1NoYXBlIl0sIklzc3VlcktpdFNoYXBlIjpbIklzc3VlcktpdFNoYXBlIl0sIkJyYW5kSSI6WyJCcmFuZEkiXSwibWFrZUlzc3VlckludGVyZmFjZXMiOlsibWFrZUlzc3VlckludGVyZmFjZXMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA6c8s05E8AACRPAAAKQAAAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy90eXBlcy1hbWJpZW50LmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyogQGplc3NpZS1jaGVjayovXG5cbi8qLyA8cmVmZXJlbmNlIHR5cGVzPVwic2VzXCIvPiovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IFtLPUtleV1cbiAqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9wYXR0ZXJucycpLkNvcHlCYWc8Sz59IENvcHlCYWdcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBBbW91bnQgQW1vdW50cyBhcmUgZGVzY3JpcHRpb25zIG9mIGRpZ2l0YWwgYXNzZXRzLFxuICogICBhbnN3ZXJpbmcgdGhlIHF1ZXN0aW9ucyBcImhvdyBtdWNoXCIgYW5kIFwib2Ygd2hhdCBraW5kXCIuIEFtb3VudHMgYXJlIHZhbHVlc1xuICogICBsYWJlbGVkIHdpdGggYSBicmFuZC4gQW1vdW50TWF0aCBleGVjdXRlcyB0aGUgbG9naWMgb2YgaG93IGFtb3VudHMgYXJlXG4gKiAgIGNoYW5nZWQgd2hlbiBkaWdpdGFsIGFzc2V0cyBhcmUgbWVyZ2VkLCBzZXBhcmF0ZWQsIG9yIG90aGVyd2lzZVxuICogICBtYW5pcHVsYXRlZC4gRm9yIGV4YW1wbGUsIGEgZGVwb3NpdCBvZiAyIGJ1Y2tzIGludG8gYSBwdXJzZSB0aGF0IGFscmVhZHlcbiAqICAgaGFzIDMgYnVja3MgZ2l2ZXMgYSBuZXcgcHVyc2UgYmFsYW5jZSBvZiA1IGJ1Y2tzLiBBbiBlbXB0eSBwdXJzZSBoYXMgMFxuICogICBidWNrcy4gQW1vdW50TWF0aCByZWxpZXMgaGVhdmlseSBvbiBwb2x5bW9ycGhpYyBNYXRoSGVscGVycywgd2hpY2hcbiAqICAgbWFuaXB1bGF0ZSB0aGUgdW5icmFuZGVkIHBvcnRpb24uXG4gKiBAcHJvcGVydHkge0JyYW5kPEs+fSBicmFuZFxuICogQHByb3BlcnR5IHtBc3NldFZhbHVlRm9yS2luZDxLPn0gdmFsdWVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtOYXRWYWx1ZSB8IFNldFZhbHVlIHwgQ29weVNldCB8IENvcHlCYWd9IEFtb3VudFZhbHVlIEFuXG4gKiAgIGBBbW91bnRWYWx1ZWAgZGVzY3JpYmVzIGEgc2V0IG9yIHF1YW50aXR5IG9mIGFzc2V0cyB0aGF0IGNhbiBiZSBvd25lZCBvclxuICogICBzaGFyZWQuXG4gKlxuICogICBBIGZ1bmdpYmxlIGBBbW91bnRWYWx1ZWAgdXNlcyBhIG5vbi1uZWdhdGl2ZSBiaWdpbnQgdG8gcmVwcmVzZW50IGEgcXVhbnRpdHlcbiAqICAgb2YgdGhhdCBtYW55IGFzc2V0cy5cbiAqXG4gKiAgIEEgbm9uLWZ1bmdpYmxlIGBBbW91bnRWYWx1ZWAgdXNlcyBhbiBhcnJheSBvciBDb3B5U2V0IG9mIGBLZXlgcyB0byByZXByZXNlbnRcbiAqICAgYSBzZXQgb2Ygd2hhdGV2ZXIgYXNzZXQgZWFjaCBrZXkgcmVwcmVzZW50cy4gQSBgS2V5YCBpcyBhIHBhc3NhYmxlIHZhbHVlXG4gKiAgIHRoYXQgY2FuIGJlIHVzZWQgYXMgYW4gZWxlbWVudCBpbiBhIHNldCAoU2V0U3RvcmUgb3IgQ29weVNldCkgb3IgYXMgdGhlIGtleVxuICogICBpbiBhIG1hcCAoTWFwU3RvcmUgb3IgQ29weU1hcCkuXG4gKlxuICogICBgU2V0VmFsdWVgIGlzIGZvciB0aGUgZGVwcmVjYXRlZCBzZXQgcmVwcmVzZW50YXRpb24sIHVzaW5nIGFuIGFycmF5IGRpcmVjdGx5XG4gKiAgIHRvIHJlcHJlc2VudCB0aGUgYXJyYXkgb2YgaXRzIGVsZW1lbnRzLiBgQ29weVNldGAgaXMgdGhlIHByb3BlclxuICogICByZXByZXNlbnRhdGlvbiB1c2luZyBhIENvcHlTZXQuXG4gKlxuICogICBBIHNlbWktZnVuZ2libGUgYENvcHlCYWdgIGlzIHJlcHJlc2VudGVkIGFzIGEgYENvcHlCYWdgIG9mIGBLZXlgIG9iamVjdHMuXG4gKiAgIFwiQmFnXCIgaXMgc3lub255bW91cyB3aXRoIE11bHRpU2V0LCB3aGVyZSBhbiBlbGVtZW50IG9mIGEgYmFnIGNhbiBiZSBwcmVzZW50XG4gKiAgIG9uY2Ugb3IgbW9yZSB0aW1lcywgaS5lLiwgc29tZSBwb3NpdGl2ZSBiaWdpbnQgbnVtYmVyIG9mIHRpbWVzLFxuICogICByZXByZXNlbnRpbmcgdGhhdCBxdWFudGl0eSBvZiB0aGUgYXNzZXQgcmVwcmVzZW50ZWQgYnkgdGhhdCBrZXkuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7J25hdCcgfCAnc2V0JyB8ICdjb3B5U2V0JyB8ICdjb3B5QmFnJ30gQXNzZXRLaW5kIFNlZSBkb2MtY29tbWVudFxuICogICBmb3IgYEFtb3VudFZhbHVlYC5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAdHlwZWRlZiB7SyBleHRlbmRzICduYXQnXG4gKiAgID8gTmF0VmFsdWVcbiAqICAgOiBLIGV4dGVuZHMgJ3NldCdcbiAqICAgPyBTZXRWYWx1ZVxuICogICA6IEsgZXh0ZW5kcyAnY29weVNldCdcbiAqICAgPyBDb3B5U2V0XG4gKiAgIDogSyBleHRlbmRzICdjb3B5QmFnJ1xuICogICA/IENvcHlCYWdcbiAqICAgOiBuZXZlcn0gQXNzZXRWYWx1ZUZvcktpbmRcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QW1vdW50VmFsdWV9IFZcbiAqIEB0eXBlZGVmIHtWIGV4dGVuZHMgTmF0VmFsdWVcbiAqICAgPyAnbmF0J1xuICogICA6IFYgZXh0ZW5kcyBTZXRWYWx1ZVxuICogICA/ICdzZXQnXG4gKiAgIDogViBleHRlbmRzIENvcHlTZXRcbiAqICAgPyAnY29weVNldCdcbiAqICAgOiBWIGV4dGVuZHMgQ29weUJhZ1xuICogICA/ICdjb3B5QmFnJ1xuICogICA6IG5ldmVyfSBBc3NldEtpbmRGb3JWYWx1ZVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPUFzc2V0S2luZF1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IERpc3BsYXlJbmZvXG4gKiBAcHJvcGVydHkge251bWJlcn0gW2RlY2ltYWxQbGFjZXNdIFRlbGxzIHRoZSBkaXNwbGF5IHNvZnR3YXJlIGhvdyBtYW55XG4gKiAgIGRlY2ltYWwgcGxhY2VzIHRvIG1vdmUgdGhlIGRlY2ltYWwgb3ZlciB0byB0aGUgbGVmdCwgb3IgaW4gb3RoZXIgd29yZHMsXG4gKiAgIHdoaWNoIHBvc2l0aW9uIGNvcnJlc3BvbmRzIHRvIHdob2xlIG51bWJlcnMuIFdlIHJlcXVpcmUgZnVuZ2libGUgZGlnaXRhbFxuICogICBhc3NldHMgdG8gYmUgcmVwcmVzZW50ZWQgaW4gaW50ZWdlcnMsIGluIHRoZSBzbWFsbGVzdCB1bml0IChpLmUuIFVTRCBtaWdodFxuICogICBiZSByZXByZXNlbnRlZCBpbiBtaWxsLCBhIHRob3VzYW5kdGggb2YgYSBkb2xsYXIuIEluIHRoYXQgY2FzZSxcbiAqICAgYGRlY2ltYWxQbGFjZXNgIHdvdWxkIGJlIDMuKSBUaGlzIHByb3BlcnR5IGlzIG9wdGlvbmFsLCBhbmQgZm9yXG4gKiAgIG5vbi1mdW5naWJsZSBkaWdpdGFsIGFzc2V0cywgc2hvdWxkIG5vdCBiZSBzcGVjaWZpZWQuIFRoZSBkZWNpbWFsUGxhY2VzXG4gKiAgIHByb3BlcnR5IHNob3VsZCBiZSB1c2VkIGZvciBfZGlzcGxheSBwdXJwb3NlcyBvbmx5Xy4gQW55IG90aGVyIHVzZSBpcyBhblxuICogICBhbnRpLXBhdHRlcm4uXG4gKiBAcHJvcGVydHkge0t9IGFzc2V0S2luZCAtIHRoZSBraW5kIG9mIGFzc2V0LCBlaXRoZXIgQXNzZXRLaW5kLk5BVCAoZnVuZ2libGUpXG4gKiAgIG9yIEFzc2V0S2luZC5TRVQgb3IgQXNzZXRLaW5kLkNPUFlfU0VUIChub24tZnVuZ2libGUpXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHR5cGVkZWYge29iamVjdH0gQnJhbmQgVGhlIGJyYW5kIGlkZW50aWZpZXMgdGhlIGtpbmQgb2YgaXNzdWVyLCBhbmQgaGFzIGFcbiAqICAgZnVuY3Rpb24gdG8gZ2V0IHRoZSBhbGxlZ2VkIG5hbWUgZm9yIHRoZSBraW5kIG9mIGFzc2V0IGRlc2NyaWJlZC4gVGhlXG4gKiAgIGFsbGVnZWQgbmFtZSAoc3VjaCBhcyAnQlRDJyBvciAnbW9vbGEnKSBpcyBwcm92aWRlZCBieSB0aGUgbWFrZXIgb2YgdGhlXG4gKiAgIGlzc3VlciBhbmQgc2hvdWxkIG5vdCBiZSB0cnVzdGVkIGFzIGFjY3VyYXRlLlxuICpcbiAqICAgRXZlcnkgYW1vdW50IGNyZWF0ZWQgYnkgYSBwYXJ0aWN1bGFyIEFtb3VudE1hdGggd2lsbCBzaGFyZSB0aGUgc2FtZSBicmFuZCxcbiAqICAgYnV0IHJlY2lwaWVudHMgY2Fubm90IHJlbHkgb24gdGhlIGJyYW5kIHRvIHZlcmlmeSB0aGF0IGEgcHVycG9ydGVkIGFtb3VudFxuICogICByZXByZXNlbnRzIHRoZSBpc3N1ZXIgdGhleSBpbnRlbmRlZCwgc2luY2UgdGhlIHNhbWUgYnJhbmQgY2FuIGJlIHJldXNlZCBieVxuICogICBhIG1pc2JlaGF2aW5nIGlzc3Vlci5cbiAqIEBwcm9wZXJ0eSB7KGFsbGVnZWRJc3N1ZXI6IEVSZWY8SXNzdWVyPikgPT4gUHJvbWlzZTxib29sZWFuPn0gaXNNeUlzc3VlclxuICogICBTaG91bGQgYmUgdXNlZCB3aXRoIGBpc3N1ZXIuZ2V0QnJhbmRgIHRvIGVuc3VyZSBhbiBpc3N1ZXIgYW5kIGJyYW5kIG1hdGNoLlxuICogQHByb3BlcnR5IHsoKSA9PiBzdHJpbmd9IGdldEFsbGVnZWROYW1lXG4gKiBAcHJvcGVydHkgeygpID0+IERpc3BsYXlJbmZvPEs+fSBnZXREaXNwbGF5SW5mbyBHaXZlIGluZm9ybWF0aW9uIHRvIFVJIG9uIGhvd1xuICogICB0byBkaXNwbGF5IHRoZSBhbW91bnQuXG4gKiBAcHJvcGVydHkgeygpID0+IFBhdHRlcm59IGdldEFtb3VudFNoYXBlXG4gKi9cblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIElzc3VlciAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKipcbiAqIEBjYWxsYmFjayBJc3N1ZXJJc0xpdmUgUmV0dXJuIHRydWUgaWYgdGhlIHBheW1lbnQgY29udGludWVzIHRvIGV4aXN0LlxuICpcbiAqICAgSWYgdGhlIHBheW1lbnQgaXMgYSBwcm9taXNlLCB0aGUgb3BlcmF0aW9uIHdpbGwgcHJvY2VlZCB1cG9uIGZ1bGZpbGxtZW50LlxuICogQHBhcmFtIHtFUmVmPFBheW1lbnQ+fSBwYXltZW50XG4gKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn1cbiAqL1xuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQGNhbGxiYWNrIElzc3VlckdldEFtb3VudE9mIEdldCB0aGUgYW1vdW50IG9mIGRpZ2l0YWwgYXNzZXRzIGluIHRoZSBwYXltZW50LlxuICogICBCZWNhdXNlIHRoZSBwYXltZW50IGlzIG5vdCB0cnVzdGVkLCB3ZSBjYW5ub3QgY2FsbCBhIG1ldGhvZCBvbiBpdCBkaXJlY3RseSxcbiAqICAgYW5kIG11c3QgdXNlIHRoZSBpc3N1ZXIgaW5zdGVhZC5cbiAqXG4gKiAgIElmIHRoZSBwYXltZW50IGlzIGEgcHJvbWlzZSwgdGhlIG9wZXJhdGlvbiB3aWxsIHByb2NlZWQgdXBvbiBmdWxmaWxsbWVudC5cbiAqIEBwYXJhbSB7RVJlZjxQYXltZW50Pn0gcGF5bWVudFxuICogQHJldHVybnMge1Byb21pc2U8QW1vdW50PEs+Pn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBJc3N1ZXJCdXJuIEJ1cm4gYWxsIG9mIHRoZSBkaWdpdGFsIGFzc2V0cyBpbiB0aGUgcGF5bWVudC5cbiAqICAgYG9wdEFtb3VudFNoYXBlYCBpcyBvcHRpb25hbC4gSWYgdGhlIGBvcHRBbW91bnRTaGFwZWAgcGF0dGVybiBpcyBwcmVzZW50LFxuICogICB0aGUgYW1vdW50IG9mIHRoZSBkaWdpdGFsIGFzc2V0cyBpbiB0aGUgcGF5bWVudCBtdXN0IG1hdGNoXG4gKiAgIGBvcHRBbW91bnRTaGFwZWAsIHRvIHByZXZlbnQgc2VuZGluZyB0aGUgd3JvbmcgcGF5bWVudCBhbmQgb3RoZXJcbiAqICAgY29uZnVzaW9uLlxuICpcbiAqICAgSWYgdGhlIHBheW1lbnQgaXMgYSBwcm9taXNlLCB0aGUgb3BlcmF0aW9uIHdpbGwgcHJvY2VlZCB1cG9uIGZ1bGZpbGxtZW50LlxuICpcbiAqICAgQXMgYWx3YXlzIHdpdGggb3B0aW9uYWwgYFBhdHRlcm5gIGFyZ3VtZW50cywga2VlcCBpbiBtaW5kIHRoYXQgdGVjaG5pY2FsbHlcbiAqICAgdGhlIHZhbHVlIGB1bmRlZmluZWRgIGl0c2VsZiBpcyBhIHZhbGlkIGBLZXlgIGFuZCB0aGVyZWZvcmUgYSB2YWxpZFxuICogICBgUGF0dGVybmAuIEJ1dCBpbiBvcHRpb25hbCBwYXR0ZXJuIHBvc2l0aW9uLCBhIHRvcCBsZXZlbCBgdW5kZWZpbmVkYCB3aWxsXG4gKiAgIGJlIGludGVycHJldGVkIGFzIGFic2VuY2UuIElmIHlvdSB3YW50IHRvIGV4cHJlc3MgYSBgUGF0dGVybmAgdGhhdCB3aWxsXG4gKiAgIG1hdGNoIG9ubHkgYHVuZGVmaW5lZGAsIHVzZSBgTS51bmRlZmluZWQoKWAgaW5zdGVhZC5cbiAqIEBwYXJhbSB7RVJlZjxQYXltZW50Pn0gcGF5bWVudFxuICogQHBhcmFtIHtQYXR0ZXJufSBbb3B0QW1vdW50U2hhcGVdXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxBbW91bnQ+fVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPUFzc2V0S2luZF1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IElzc3VlciBUaGUgaXNzdWVyIGNhbm5vdCBtaW50IGEgbmV3IGFtb3VudCwgYnV0IGl0IGNhblxuICogICBjcmVhdGUgZW1wdHkgcHVyc2VzIGFuZCBwYXltZW50cy4gVGhlIGlzc3VlciBjYW4gYWxzbyB0cmFuc2Zvcm0gcGF5bWVudHNcbiAqICAgKHNwbGl0dGluZyBwYXltZW50cywgY29tYmluaW5nIHBheW1lbnRzLCBidXJuaW5nIHBheW1lbnRzLCBhbmQgY2xhaW1pbmdcbiAqICAgcGF5bWVudHMgZXhjbHVzaXZlbHkpLiBUaGUgaXNzdWVyIHNob3VsZCBiZSBnb3R0ZW4gZnJvbSBhIHRydXN0ZWQgc291cmNlXG4gKiAgIGFuZCB0aGVuIHJlbGllZCB1cG9uIGFzIHRoZSBkZWNpZGVyIG9mIHdoZXRoZXIgYW4gdW50cnVzdGVkIHBheW1lbnQgaXNcbiAqICAgdmFsaWQuXG4gKiBAcHJvcGVydHkgeygpID0+IEJyYW5kPEs+fSBnZXRCcmFuZCBHZXQgdGhlIEJyYW5kIGZvciB0aGlzIElzc3Vlci4gVGhlIEJyYW5kXG4gKiAgIGluZGljYXRlcyB0aGUgdHlwZSBvZiBkaWdpdGFsIGFzc2V0IGFuZCBpcyBzaGFyZWQgYnkgdGhlIG1pbnQsIHRoZSBpc3N1ZXIsXG4gKiAgIGFuZCBhbnkgcHVyc2VzIGFuZCBwYXltZW50cyBvZiB0aGlzIHBhcnRpY3VsYXIga2luZC4gVGhlIGJyYW5kIGlzIG5vdFxuICogICBjbG9zZWx5IGhlbGQsIHNvIHRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSB0cnVzdGVkIHRvIGlkZW50aWZ5IGFuIGlzc3VlclxuICogICBhbG9uZS4gRmFrZSBkaWdpdGFsIGFzc2V0cyBhbmQgYW1vdW50IGNhbiB1c2UgYW5vdGhlciBpc3N1ZXIncyBicmFuZC5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gc3RyaW5nfSBnZXRBbGxlZ2VkTmFtZSBHZXQgdGhlIGFsbGVnZWROYW1lIGZvciB0aGlzXG4gKiAgIG1pbnQvaXNzdWVyXG4gKiBAcHJvcGVydHkgeygpID0+IEFzc2V0S2luZH0gZ2V0QXNzZXRLaW5kIEdldCB0aGUga2luZCBvZiBNYXRoSGVscGVycyB1c2VkIGJ5XG4gKiAgIHRoaXMgSXNzdWVyLlxuICogQHByb3BlcnR5IHsoKSA9PiBEaXNwbGF5SW5mbzxLPn0gZ2V0RGlzcGxheUluZm8gR2l2ZSBpbmZvcm1hdGlvbiB0byBVSSBvbiBob3dcbiAqICAgdG8gZGlzcGxheSBhbW91bnRzIGZvciB0aGlzIGlzc3Vlci5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHVyc2U8Sz59IG1ha2VFbXB0eVB1cnNlIE1ha2UgYW4gZW1wdHkgcHVyc2Ugb2YgdGhpcyBicmFuZC5cbiAqIEBwcm9wZXJ0eSB7SXNzdWVySXNMaXZlfSBpc0xpdmVcbiAqIEBwcm9wZXJ0eSB7SXNzdWVyR2V0QW1vdW50T2Y8Sz59IGdldEFtb3VudE9mXG4gKiBAcHJvcGVydHkge0lzc3VlckJ1cm59IGJ1cm5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQYXltZW50TGVkZ2VyXG4gKiBAcHJvcGVydHkge01pbnQ8Sz59IG1pbnRcbiAqIEBwcm9wZXJ0eSB7UHVyc2U8Sz59IG1pbnRSZWNvdmVyeVB1cnNlIFVzZWZ1bCBvbmx5IHRvIGdldCB0aGUgcmVjb3Zlcnkgc2V0XG4gKiAgIGFzc29jaWF0ZWQgd2l0aCBtaW50ZWQgcGF5bWVudHMgdGhhdCBhcmUgc3RpbGwgbGl2ZS5cbiAqIEBwcm9wZXJ0eSB7SXNzdWVyPEs+fSBpc3N1ZXJcbiAqIEBwcm9wZXJ0eSB7QnJhbmQ8Sz59IGJyYW5kXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHR5cGVkZWYge29iamVjdH0gSXNzdWVyS2l0XG4gKiBAcHJvcGVydHkge01pbnQ8Sz59IG1pbnRcbiAqIEBwcm9wZXJ0eSB7UHVyc2U8Sz59IG1pbnRSZWNvdmVyeVB1cnNlIFVzZWZ1bCBvbmx5IHRvIGdldCB0aGUgcmVjb3Zlcnkgc2V0XG4gKiAgIGFzc29jaWF0ZWQgd2l0aCBtaW50ZWQgcGF5bWVudHMgdGhhdCBhcmUgc3RpbGwgbGl2ZS5cbiAqIEBwcm9wZXJ0eSB7SXNzdWVyPEs+fSBpc3N1ZXJcbiAqIEBwcm9wZXJ0eSB7QnJhbmQ8Sz59IGJyYW5kXG4gKiBAcHJvcGVydHkge0Rpc3BsYXlJbmZvfSBkaXNwbGF5SW5mb1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQWRkaXRpb25hbERpc3BsYXlJbmZvXG4gKiBAcHJvcGVydHkge251bWJlcn0gW2RlY2ltYWxQbGFjZXNdIFRlbGxzIHRoZSBkaXNwbGF5IHNvZnR3YXJlIGhvdyBtYW55XG4gKiAgIGRlY2ltYWwgcGxhY2VzIHRvIG1vdmUgdGhlIGRlY2ltYWwgb3ZlciB0byB0aGUgbGVmdCwgb3IgaW4gb3RoZXIgd29yZHMsXG4gKiAgIHdoaWNoIHBvc2l0aW9uIGNvcnJlc3BvbmRzIHRvIHdob2xlIG51bWJlcnMuIFdlIHJlcXVpcmUgZnVuZ2libGUgZGlnaXRhbFxuICogICBhc3NldHMgdG8gYmUgcmVwcmVzZW50ZWQgaW4gaW50ZWdlcnMsIGluIHRoZSBzbWFsbGVzdCB1bml0IChpLmUuIFVTRCBtaWdodFxuICogICBiZSByZXByZXNlbnRlZCBpbiBtaWxsLCBhIHRob3VzYW5kdGggb2YgYSBkb2xsYXIuIEluIHRoYXQgY2FzZSxcbiAqICAgYGRlY2ltYWxQbGFjZXNgIHdvdWxkIGJlIDMuKSBUaGlzIHByb3BlcnR5IGlzIG9wdGlvbmFsLCBhbmQgZm9yXG4gKiAgIG5vbi1mdW5naWJsZSBkaWdpdGFsIGFzc2V0cywgc2hvdWxkIG5vdCBiZSBzcGVjaWZpZWQuIFRoZSBkZWNpbWFsUGxhY2VzXG4gKiAgIHByb3BlcnR5IHNob3VsZCBiZSB1c2VkIGZvciBfZGlzcGxheSBwdXJwb3NlcyBvbmx5Xy4gQW55IG90aGVyIHVzZSBpcyBhblxuICogICBhbnRpLXBhdHRlcm4uXG4gKiBAcHJvcGVydHkge0Fzc2V0S2luZH0gW2Fzc2V0S2luZF1cbiAqL1xuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BhZ29yaWMvc3dpbmdzZXQtdmF0JykuU2h1dGRvd25XaXRoRmFpbHVyZX0gU2h1dGRvd25XaXRoRmFpbHVyZSAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBNaW50IEhvbGRpbmcgYSBNaW50IGNhcnJpZXMgdGhlIHJpZ2h0IHRvIGlzc3VlIG5ldyBkaWdpdGFsXG4gKiAgIGFzc2V0cy4gVGhlc2UgYXNzZXRzIGFsbCBoYXZlIHRoZSBzYW1lIGtpbmQsIHdoaWNoIGlzIGNhbGxlZCBhIEJyYW5kLlxuICogQHByb3BlcnR5IHsoKSA9PiBJc3N1ZXI8Sz59IGdldElzc3VlciBHZXRzIHRoZSBJc3N1ZXIgZm9yIHRoaXMgbWludC5cbiAqIEBwcm9wZXJ0eSB7KG5ld0Ftb3VudDogQW1vdW50PEs+KSA9PiBQYXltZW50PEs+fSBtaW50UGF5bWVudCBDcmVhdGVzIGEgbmV3XG4gKiAgIFBheW1lbnQgY29udGFpbmluZyBuZXdseSBtaW50ZWQgYW1vdW50LlxuICovXG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBQdXJzZSAvIFBheW1lbnQgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgRGVwb3NpdEZhY2V0UmVjZWl2ZVxuICogQHBhcmFtIHtQYXltZW50fSBwYXltZW50XG4gKiBAcGFyYW0ge1BhdHRlcm59IFtvcHRBbW91bnRTaGFwZV1cbiAqIEByZXR1cm5zIHtBbW91bnR9XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBEZXBvc2l0RmFjZXRcbiAqIEBwcm9wZXJ0eSB7RGVwb3NpdEZhY2V0UmVjZWl2ZX0gcmVjZWl2ZSBEZXBvc2l0IGFsbCB0aGUgY29udGVudHMgb2YgcGF5bWVudFxuICogICBpbnRvIHRoZSBwdXJzZSB0aGF0IG1hZGUgdGhpcyBmYWNldCwgcmV0dXJuaW5nIHRoZSBhbW91bnQuIElmIHRoZSBvcHRpb25hbFxuICogICBhcmd1bWVudCBgb3B0QW1vdW50YCBkb2VzIG5vdCBlcXVhbCB0aGUgYW1vdW50IG9mIGRpZ2l0YWwgYXNzZXRzIGluIHRoZVxuICogICBwYXltZW50LCB0aHJvdyBhbiBlcnJvci5cbiAqXG4gKiAgIElmIHBheW1lbnQgaXMgYSBwcm9taXNlLCB0aHJvdyBhbiBlcnJvci5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAY2FsbGJhY2sgUHVyc2VEZXBvc2l0XG4gKiBAcGFyYW0ge1BheW1lbnQ8Sz59IHBheW1lbnRcbiAqIEBwYXJhbSB7UGF0dGVybn0gW29wdEFtb3VudFNoYXBlXVxuICogQHJldHVybnMge0Ftb3VudDxLPn1cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQdXJzZSBQdXJzZXMgaG9sZCBhbW91bnQgb2YgZGlnaXRhbCBhc3NldHMgb2YgdGhlIHNhbWVcbiAqICAgYnJhbmQsIGJ1dCB1bmxpa2UgUGF5bWVudHMsIHRoZXkgYXJlIG5vdCBtZWFudCB0byBiZSBzZW50IHRvIG90aGVycy4gVG9cbiAqICAgdHJhbnNmZXIgZGlnaXRhbCBhc3NldHMsIGEgUGF5bWVudCBzaG91bGQgYmUgd2l0aGRyYXduIGZyb20gYSBQdXJzZS4gVGhlXG4gKiAgIGFtb3VudCBvZiBkaWdpdGFsIGFzc2V0cyBpbiBhIHB1cnNlIGNhbiBjaGFuZ2UgdGhyb3VnaCB0aGUgYWN0aW9uIG9mXG4gKiAgIGRlcG9zaXQoKSBhbmQgd2l0aGRyYXcoKS5cbiAqXG4gKiAgIFRoZSBwcmltYXJ5IHVzZSBmb3IgUHVyc2VzIGFuZCBQYXltZW50cyBpcyBmb3IgY3VycmVuY3ktbGlrZSBhbmQgZ29vZHMtbGlrZVxuICogICBkaWdpdGFsIGFzc2V0cywgYnV0IHRoZXkgY2FuIGFsc28gYmUgdXNlZCB0byByZXByZXNlbnQgb3RoZXIga2luZHMgb2ZcbiAqICAgcmlnaHRzLCBzdWNoIGFzIHRoZSByaWdodCB0byBwYXJ0aWNpcGF0ZSBpbiBhIHBhcnRpY3VsYXIgY29udHJhY3QuXG4gKiBAcHJvcGVydHkgeygpID0+IEJyYW5kPEs+fSBnZXRBbGxlZ2VkQnJhbmQgR2V0IHRoZSBhbGxlZ2VkIEJyYW5kIGZvciB0aGlzXG4gKiAgIFB1cnNlXG4gKiBAcHJvcGVydHkgeygpID0+IEFtb3VudDxLPn0gZ2V0Q3VycmVudEFtb3VudCBHZXQgdGhlIGFtb3VudCBjb250YWluZWQgaW4gdGhpc1xuICogICBwdXJzZS5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gTGF0ZXN0VG9waWM8QW1vdW50PEs+Pn0gZ2V0Q3VycmVudEFtb3VudE5vdGlmaWVyIEdldCBhIGxvc3N5XG4gKiAgIG5vdGlmaWVyIGZvciBjaGFuZ2VzIHRvIHRoaXMgcHVyc2UncyBiYWxhbmNlLlxuICogQHByb3BlcnR5IHtQdXJzZURlcG9zaXQ8Sz59IGRlcG9zaXQgRGVwb3NpdCBhbGwgdGhlIGNvbnRlbnRzIG9mIHBheW1lbnQgaW50b1xuICogICB0aGlzIHB1cnNlLCByZXR1cm5pbmcgdGhlIGFtb3VudC4gSWYgdGhlIG9wdGlvbmFsIGFyZ3VtZW50IGBvcHRBbW91bnRgIGRvZXNcbiAqICAgbm90IGVxdWFsIHRoZSBhbW91bnQgb2YgZGlnaXRhbCBhc3NldHMgaW4gdGhlIHBheW1lbnQsIHRocm93IGFuIGVycm9yLlxuICpcbiAqICAgSWYgcGF5bWVudCBpcyBhIHByb21pc2UsIHRocm93IGFuIGVycm9yLlxuICogQHByb3BlcnR5IHsoKSA9PiBEZXBvc2l0RmFjZXR9IGdldERlcG9zaXRGYWNldCBSZXR1cm4gYW4gb2JqZWN0IHdob3NlXG4gKiAgIGByZWNlaXZlYCBtZXRob2QgZGVwb3NpdHMgdG8gdGhlIGN1cnJlbnQgUHVyc2UuXG4gKiBAcHJvcGVydHkgeyhhbW91bnQ6IEFtb3VudDxLPikgPT4gUGF5bWVudDxLPn0gd2l0aGRyYXcgV2l0aGRyYXcgYW1vdW50IGZyb21cbiAqICAgdGhpcyBwdXJzZSBpbnRvIGEgbmV3IFBheW1lbnQuXG4gKiBAcHJvcGVydHkgeygpID0+IENvcHlTZXQ8UGF5bWVudDxLPj59IGdldFJlY292ZXJ5U2V0IFRoZSBzZXQgb2YgcGF5bWVudHNcbiAqICAgd2l0aGRyYXduIGZyb20gdGhpcyBwdXJzZSB0aGF0IGFyZSBzdGlsbCBsaXZlLiBUaGVzZSBhcmUgdGhlIHBheW1lbnRzIHRoYXRcbiAqICAgY2FuIHN0aWxsIGJlIHJlY292ZXJlZCBpbiBlbWVyZ2VuY2llcyBieSwgZm9yIGV4YW1wbGUsIGRlcG9zaXRpbmcgaW50byB0aGlzXG4gKiAgIHB1cnNlLiBTdWNoIGEgZGVwb3NpdCBhY3Rpb24gaXMgbGlrZSBjYW5jZWxpbmcgYW4gb3V0c3RhbmRpbmcgY2hlY2sgYmVjYXVzZVxuICogICB5b3UncmUgdGlyZWQgb2Ygd2FpdGluZyBmb3IgaXQuIE9uY2UgeW91ciBjYW5jZWxsYXRpb24gaXMgYWNrbm93bGVkZ2VkLCB5b3VcbiAqICAgY2FuIHNwZW5kIHRoZSBhc3NldHMgYXQgc3Rha2Ugb24gb3RoZXIgdGhpbmdzLiBBZnRlcndhcmRzLCBpZiB0aGUgcmVjaXBpZW50XG4gKiAgIG9mIHRoZSBvcmlnaW5hbCBjaGVjayBmaW5hbGx5IGdldHMgYXJvdW5kIHRvIGRlcG9zaXRpbmcgaXQsIHRoZWlyIGRlcG9zaXRcbiAqICAgZmFpbHMuXG4gKiBAcHJvcGVydHkgeygpID0+IEFtb3VudDxLPn0gcmVjb3ZlckFsbCBGb3IgdXNlIGluIGVtZXJnZW5jaWVzLCBzdWNoIGFzIGNvbWluZ1xuICogICBiYWNrIGZyb20gYSB0cmF1bWF0aWMgY3Jhc2ggYW5kIHVwZ3JhZGUuIFRoaXMgZGVwb3NpdHMgYWxsIHRoZSBwYXltZW50cyBpblxuICogICB0aGlzIHB1cnNlJ3MgcmVjb3Zlcnkgc2V0IGludG8gdGhlIHB1cnNlIGl0c2VsZiwgcmV0dXJuaW5nIHRoZSB0b3RhbCBhbW91bnRcbiAqICAgb2YgYXNzZXRzIHJlY292ZXJlZC5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQYXltZW50IFBheW1lbnRzIGhvbGQgYW1vdW50IG9mIGRpZ2l0YWwgYXNzZXRzIG9mIHRoZSBzYW1lXG4gKiAgIGJyYW5kIGluIHRyYW5zaXQuIFBheW1lbnRzIGNhbiBiZSBkZXBvc2l0ZWQgaW4gcHVyc2VzLCBzcGxpdCBpbnRvIG11bHRpcGxlXG4gKiAgIHBheW1lbnRzLCBjb21iaW5lZCwgYW5kIGNsYWltZWQgKGdldHRpbmcgYW4gZXhjbHVzaXZlIHBheW1lbnQpLiBQYXltZW50c1xuICogICBhcmUgbGluZWFyLCBtZWFuaW5nIHRoYXQgZWl0aGVyIGEgcGF5bWVudCBoYXMgdGhlIHNhbWUgYW1vdW50IG9mIGRpZ2l0YWxcbiAqICAgYXNzZXRzIGl0IHN0YXJ0ZWQgd2l0aCwgb3IgaXQgaXMgdXNlZCB1cCBlbnRpcmVseS4gSXQgaXMgaW1wb3NzaWJsZSB0b1xuICogICBwYXJ0aWFsbHkgdXNlIGEgcGF5bWVudC5cbiAqXG4gKiAgIFBheW1lbnRzIGFyZSBvZnRlbiByZWNlaXZlZCBmcm9tIG90aGVyIGFjdG9ycyBhbmQgdGhlcmVmb3JlIHNob3VsZCBub3QgYmVcbiAqICAgdHJ1c3RlZCB0aGVtc2VsdmVzLiBUbyBnZXQgdGhlIGFtb3VudCBvZiBkaWdpdGFsIGFzc2V0cyBpbiBhIHBheW1lbnQsIHVzZVxuICogICB0aGUgdHJ1c3RlZCBpc3N1ZXI6IGlzc3Vlci5nZXRBbW91bnRPZihwYXltZW50KSxcbiAqXG4gKiAgIFBheW1lbnRzIGNhbiBiZSBjb252ZXJ0ZWQgdG8gUHVyc2VzIGJ5IGdldHRpbmcgYSB0cnVzdGVkIGlzc3VlciBhbmQgY2FsbGluZ1xuICogICBgaXNzdWVyLm1ha2VFbXB0eVB1cnNlKClgIHRvIGNyZWF0ZSBhIHB1cnNlLCB0aGVuXG4gKiAgIGBwdXJzZS5kZXBvc2l0KHBheW1lbnQpYC5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gQnJhbmQ8Sz59IGdldEFsbGVnZWRCcmFuZCBHZXQgdGhlIGFsbGVnZWRCcmFuZCwgaW5kaWNhdGluZ1xuICogICB0aGUgdHlwZSBvZiBkaWdpdGFsIGFzc2V0IHRoaXMgcGF5bWVudCBwdXJwb3J0cyB0byBiZSwgYW5kIHdoaWNoIGlzc3VlciB0b1xuICogICB1c2UuIEJlY2F1c2UgcGF5bWVudHMgYXJlIG5vdCB0cnVzdGVkLCBhbnkgbWV0aG9kIGNhbGxzIG9uIHBheW1lbnRzIHNob3VsZFxuICogICBiZSB0cmVhdGVkIHdpdGggc3VzcGljaW9uIGFuZCB2ZXJpZmllZCBlbHNld2hlcmUuXG4gKi9cblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIE1hdGhIZWxwZXJzIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QW1vdW50VmFsdWV9IFZcbiAqIEB0eXBlZGVmIHtvYmplY3R9IE1hdGhIZWxwZXJzIEFsbCBvZiB0aGUgZGlmZmVyZW5jZSBpbiBob3cgZGlnaXRhbCBhc3NldFxuICogICBhbW91bnQgYXJlIG1hbmlwdWxhdGVkIGNhbiBiZSByZWR1Y2VkIHRvIHRoZSBiZWhhdmlvciBvZiB0aGUgbWF0aCBvblxuICogICB2YWx1ZXMuIFdlIGV4dHJhY3QgdGhpcyBjdXN0b20gbG9naWMgaW50byBtYXRoSGVscGVycy4gTWF0aEhlbHBlcnMgYXJlXG4gKiAgIGFib3V0IHZhbHVlIGFyaXRobWV0aWMsIHdoZXJlYXMgQW1vdW50TWF0aCBpcyBhYm91dCBhbW91bnRzLCB3aGljaCBhcmUgdGhlXG4gKiAgIHZhbHVlcyBsYWJlbGVkIHdpdGggYSBicmFuZC4gQW1vdW50TWF0aCB1c2UgbWF0aEhlbHBlcnMgdG8gZG8gdGhlaXIgdmFsdWVcbiAqICAgYXJpdGhtZXRpYywgYW5kIHRoZW4gYnJhbmQgdGhlIHJlc3VsdHMsIG1ha2luZyBhIG5ldyBhbW91bnQuXG4gKlxuICogICBUaGUgTWF0aEhlbHBlcnMgYXJlIGRlc2lnbmVkIHRvIGJlIGNhbGxlZCBvbmx5IGZyb20gQW1vdW50TWF0aCwgYW5kIHNvIGFsbFxuICogICBtZXRob2RzIGJ1dCBjb2VyY2UgY2FuIGFzc3VtZSB0aGVpciBpbnB1dHMgYXJlIHZhbGlkLiBUaGV5IG9ubHkgbmVlZCB0byBkb1xuICogICBvdXRwdXQgdmFsaWRhdGlvbiwgYW5kIG9ubHkgd2hlbiB0aGVyZSBpcyBhIHBvc3NpYmlsaXR5IG9mIGludmFsaWQgb3V0cHV0LlxuICogQHByb3BlcnR5IHsoYWxsZWdlZFZhbHVlOiBWKSA9PiBWfSBkb0NvZXJjZSBDaGVjayB0aGUga2luZCBvZiB0aGlzIHZhbHVlIGFuZFxuICogICB0aHJvdyBpZiBpdCBpcyBub3QgdGhlIGV4cGVjdGVkIGtpbmQuXG4gKiBAcHJvcGVydHkgeygpID0+IFZ9IGRvTWFrZUVtcHR5IEdldCB0aGUgcmVwcmVzZW50YXRpb24gZm9yIHRoZSBpZGVudGl0eVxuICogICBlbGVtZW50IChvZnRlbiAwIG9yIGFuIGVtcHR5IGFycmF5KVxuICogQHByb3BlcnR5IHsodmFsdWU6IFYpID0+IGJvb2xlYW59IGRvSXNFbXB0eSBJcyB0aGUgdmFsdWUgdGhlIGlkZW50aXR5XG4gKiAgIGVsZW1lbnQ/XG4gKiBAcHJvcGVydHkgeyhsZWZ0OiBWLCByaWdodDogVikgPT4gYm9vbGVhbn0gZG9Jc0dURSBJcyB0aGUgbGVmdCBncmVhdGVyIHRoYW5cbiAqICAgb3IgZXF1YWwgdG8gdGhlIHJpZ2h0P1xuICogQHByb3BlcnR5IHsobGVmdDogViwgcmlnaHQ6IFYpID0+IGJvb2xlYW59IGRvSXNFcXVhbCBEb2VzIGxlZnQgZXF1YWwgcmlnaHQ/XG4gKiBAcHJvcGVydHkgeyhsZWZ0OiBWLCByaWdodDogVikgPT4gVn0gZG9BZGQgUmV0dXJuIHRoZSBsZWZ0IGNvbWJpbmVkIHdpdGggdGhlXG4gKiAgIHJpZ2h0LlxuICogQHByb3BlcnR5IHsobGVmdDogViwgcmlnaHQ6IFYpID0+IFZ9IGRvU3VidHJhY3QgUmV0dXJuIHdoYXQgcmVtYWlucyBhZnRlclxuICogICByZW1vdmluZyB0aGUgcmlnaHQgZnJvbSB0aGUgbGVmdC4gSWYgc29tZXRoaW5nIGluIHRoZSByaWdodCB3YXMgbm90IGluIHRoZVxuICogICBsZWZ0LCB3ZSB0aHJvdyBhbiBlcnJvci5cbiAqL1xuXG4vKiogQHR5cGVkZWYge2JpZ2ludH0gTmF0VmFsdWUgKi9cblxuLyoqIEB0eXBlZGVmIHtLZXlbXX0gU2V0VmFsdWUgKi9cbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA2Tc6imQpAABkKQAAJwAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9jYWxsYmFjay5qc3siaW1wb3J0cyI6WyJAZW5kby9mYXIiLCJAZW5kby9tYXJzaGFsIiwiQGVuZG8vcGF0dGVybnMiXSwiZXhwb3J0cyI6WyJjYWxsRSIsImNhbGxTeW5jIiwiaXNDYWxsYmFjayIsIm1ha2VGdW5jdGlvbkNhbGxiYWNrIiwibWFrZU1ldGhvZENhbGxiYWNrIiwibWFrZVN5bmNGdW5jdGlvbkNhbGxiYWNrIiwibWFrZVN5bmNNZXRob2RDYWxsYmFjayIsInByZXBhcmVBdHRlbnVhdG9yIiwicHJlcGFyZUd1YXJkZWRBdHRlbnVhdG9yIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEUsaXNPYmplY3QsaXNQYXNzYWJsZVN5bWJvbCxnZXRJbnRlcmZhY2VNZXRob2RLZXlzOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2ZhclwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJpc09iamVjdFwiLCBbJGjigI1fYSA9PiAoaXNPYmplY3QgPSAkaOKAjV9hKV1dLFtcImlzUGFzc2FibGVTeW1ib2xcIiwgWyRo4oCNX2EgPT4gKGlzUGFzc2FibGVTeW1ib2wgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vcGF0dGVybnNcIiwgW1tcImdldEludGVyZmFjZU1ldGhvZEtleXNcIiwgWyRo4oCNX2EgPT4gKGdldEludGVyZmFjZU1ldGhvZEtleXMgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuY29uc3R7RmFpbCxxdW90ZTpxfT1hc3NlcnQ7XG5cbmNvbnN0e2Zyb21FbnRyaWVzfT1PYmplY3Q7XG5cbmNvbnN0e293bktleXM6cmF3T3duS2V5c309UmVmbGVjdDtcbmNvbnN0IG93bktleXM9XG4vKiogQHR5cGUgezxUIGV4dGVuZHMgUHJvcGVydHlLZXk+KG9iajoge1tLIGluIFRdPzogdW5rbm93bn0pID0+IFRbXX0gKi9cbnJhd093bktleXM7XG5cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYgeyguLi5hcmdzOiBQYXJhbWV0ZXJzPFJldHVyblR5cGU8cHJlcGFyZUF0dGVudWF0b3I+PikgPT4gRmFyYWJsZTxUPn0gTWFrZUF0dGVudWF0b3JcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7KC4uLmFyZ3M6IHVua25vd25bXSkgPT4gYW55fSBJXG4gKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcycpLkNhbGxiYWNrPEk+fSBDYWxsYmFja1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHsoLi4uYXJnczogdW5rbm93bltdKSA9PiBhbnl9IElcbiAqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzJykuU3luY0NhbGxiYWNrPEk+fSBTeW5jQ2FsbGJhY2tcbiAqL1xuXG4vKiogQHRlbXBsYXRlIFQgQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL2V2ZW50dWFsLXNlbmQnKS5SZW1vdGFibGVCcmFuZDx7fSwgVD4gJiBUfSBGYXJhYmxlICovXG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSBrZXlcbiAqIEByZXR1cm5zIHtrZXkgaXMgUHJvcGVydHlLZXl9IEZJWE1FOiBzaG91bGQgYmUganVzdCBgUHJvcGVydHlLZXlgIGJ1dCBUU1xuICogY29tcGxhaW5zIGl0IGNhbid0IGJlIHVzZWQgYXMgYW4gaW5kZXggdHlwZS5cbiAqL1xuY29uc3QgaXNQcm9wZXJ0eUtleT0oa2V5KT0+e1xuc3dpdGNoKHR5cGVvZiBrZXkpe1xuY2FzZSdzdHJpbmcnOlxuY2FzZSdudW1iZXInOlxuY2FzZSdzeW1ib2wnOlxucmV0dXJuIHRydWU7XG5kZWZhdWx0OlxucmV0dXJuIGZhbHNlO31cblxuIH07XG5cbi8qKlxuICogU3luY2hyb25vdXNseSBjYWxsIGEgY2FsbGJhY2suXG4gKlxuICogQHRlbXBsYXRlIHsoLi4uYXJnczogdW5rbm93bltdKSA9PiBhbnl9IElcbiAqIEBwYXJhbSB7U3luY0NhbGxiYWNrPEk+fSBjYWxsYmFja1xuICogQHBhcmFtIHtQYXJhbWV0ZXJzPEk+fSBhcmdzXG4gKiBAcmV0dXJucyB7UmV0dXJuVHlwZTxJPn1cbiAqL1xuY29uc3QgICAgICAgIGNhbGxTeW5jPShjYWxsYmFjaywuLi5hcmdzKT0+e1xuY29uc3R7dGFyZ2V0LG1ldGhvZE5hbWUsYm91bmR9PWNhbGxiYWNrO1xuaWYobWV0aG9kTmFtZT09PXVuZGVmaW5lZCl7XG5yZXR1cm4gdGFyZ2V0KC4uLmJvdW5kLC4uLmFyZ3MpO1xuIH1cbnJldHVybiB0YXJnZXRbbWV0aG9kTmFtZV0oLi4uYm91bmQsLi4uYXJncyk7XG4gfTskaOKAjV9vbmNlLmNhbGxTeW5jKGNhbGxTeW5jKTtcbmhhcmRlbihjYWxsU3luYyk7XG5cbi8qKlxuICogRXZlbnR1YWwgc2VuZCB0byBhIGNhbGxiYWNrLlxuICpcbiAqIEB0ZW1wbGF0ZSB7KC4uLmFyZ3M6IHVua25vd25bXSkgPT4gYW55fSBJXG4gKiBAcGFyYW0ge0NhbGxiYWNrPEk+fSBjYWxsYmFja1xuICogQHBhcmFtIHtQYXJhbWV0ZXJzPEk+fSBhcmdzXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxBd2FpdGVkPFJldHVyblR5cGU8ST4+Pn1cbiAqL1xuY29uc3QgICAgICAgIGNhbGxFPShjYWxsYmFjaywuLi5hcmdzKT0+e1xuY29uc3R7dGFyZ2V0LG1ldGhvZE5hbWUsYm91bmR9PWNhbGxiYWNrO1xuaWYobWV0aG9kTmFtZT09PXVuZGVmaW5lZCl7XG5yZXR1cm4gRSh0YXJnZXQpKC4uLmJvdW5kLC4uLmFyZ3MpO1xuIH1cbnJldHVybiBFKHRhcmdldClbbWV0aG9kTmFtZV0oLi4uYm91bmQsLi4uYXJncyk7XG4gfTskaOKAjV9vbmNlLmNhbGxFKGNhbGxFKTtcbmhhcmRlbihjYWxsRSk7XG5cbi8qKlxuICogQ3JlYXRlIGEgY2FsbGJhY2sgZnJvbSBhIG5lYXIgZnVuY3Rpb24uXG4gKlxuICogQHRlbXBsYXRlIHsoLi4uYXJnczogdW5rbm93bltdKSA9PiBhbnl9IElcbiAqIEB0ZW1wbGF0ZSB7KC4uLmFyZ3M6IFsuLi5CLCAuLi5QYXJhbWV0ZXJzPEk+XSkgPT4gUmV0dXJuVHlwZTxJPn0gW1Q9SV1cbiAqIEB0ZW1wbGF0ZSB7dW5rbm93bltdfSBbQj1bXV1cbiAqIEBwYXJhbSB7VH0gdGFyZ2V0XG4gKiBAcGFyYW0ge0J9IGJvdW5kXG4gKiBAcmV0dXJucyB7U3luY0NhbGxiYWNrPEk+fVxuICovXG5jb25zdCAgICAgICAgbWFrZVN5bmNGdW5jdGlvbkNhbGxiYWNrPSh0YXJnZXQsLi4uYm91bmQpPT57XG50eXBlb2YgdGFyZ2V0PT09J2Z1bmN0aW9uJ3x8XG5GYWlsIGBzeW5jIGZ1bmN0aW9uIGNhbGxiYWNrIHRhcmdldCBtdXN0IGJlIGEgZnVuY3Rpb246ICR7dGFyZ2V0fWA7XG4vKiogQHR5cGUge3Vua25vd259ICovXG5jb25zdCBjYj1oYXJkZW4oe3RhcmdldCxib3VuZCxpc1N5bmM6dHJ1ZX0pO1xucmV0dXJuICgvKiogQHR5cGUge1N5bmNDYWxsYmFjazxJPn0gKi9jYik7XG4gfTskaOKAjV9vbmNlLm1ha2VTeW5jRnVuY3Rpb25DYWxsYmFjayhtYWtlU3luY0Z1bmN0aW9uQ2FsbGJhY2spO1xuaGFyZGVuKG1ha2VTeW5jRnVuY3Rpb25DYWxsYmFjayk7XG5cbi8qKlxuICogQ3JlYXRlIGEgY2FsbGJhY2sgZnJvbSBhIHBvdGVudGlhbGx5IGZhciBmdW5jdGlvbi5cbiAqXG4gKiBAdGVtcGxhdGUgeyguLi5hcmdzOiB1bmtub3duW10pID0+IGFueX0gSVxuICogQHRlbXBsYXRlIHtYaW1wb3J0KCdAZW5kby9mYXInKS5FUmVmPFxuICogICAoLi4uYXJnczogWy4uLkIsIC4uLlBhcmFtZXRlcnM8ST5dKSA9PiBSZXR1cm5UeXBlPEk+XG4gKiA+fSBbVD1YaW1wb3J0KCdAZW5kby9mYXInKS5FUmVmPEk+XVxuICogQHRlbXBsYXRlIHt1bmtub3duW119IFtCPVtdXVxuICogQHBhcmFtIHtUfSB0YXJnZXRcbiAqIEBwYXJhbSB7Qn0gYm91bmRcbiAqIEByZXR1cm5zIHtDYWxsYmFjazxJPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VGdW5jdGlvbkNhbGxiYWNrPSh0YXJnZXQsLi4uYm91bmQpPT57XG5pc09iamVjdCh0YXJnZXQpfHxcbkZhaWwgYGZ1bmN0aW9uIGNhbGxiYWNrIHRhcmdldCBtdXN0IGJlIGEgZnVuY3Rpb24gcHJlc2VuY2U6ICR7dGFyZ2V0fWA7XG4vKiogQHR5cGUge3Vua25vd259ICovXG5jb25zdCBjYj1oYXJkZW4oe3RhcmdldCxib3VuZH0pO1xucmV0dXJuICgvKiogQHR5cGUge0NhbGxiYWNrPEk+fSAqL2NiKTtcbiB9OyRo4oCNX29uY2UubWFrZUZ1bmN0aW9uQ2FsbGJhY2sobWFrZUZ1bmN0aW9uQ2FsbGJhY2spO1xuaGFyZGVuKG1ha2VGdW5jdGlvbkNhbGxiYWNrKTtcblxuLyoqXG4gKiBDcmVhdGUgYSBjYWxsYmFjayBmcm9tIGEgbmVhciBtZXRob2QuXG4gKlxuICogQHRlbXBsYXRlIHsoLi4uYXJnczogdW5rbm93bltdKSA9PiBhbnl9IElcbiAqIEB0ZW1wbGF0ZSB7UHJvcGVydHlLZXl9IFBcbiAqIEB0ZW1wbGF0ZSB7e1xuICogICBbeCBpbiBQXTogKC4uLmFyZ3M6IFsuLi5CLCAuLi5QYXJhbWV0ZXJzPEk+XSkgPT4gUmV0dXJuVHlwZTxJPlxuICogfX0gW1Q9eyBbeCBpbiBQXTogSSB9XVxuICogQHRlbXBsYXRlIHt1bmtub3duW119IFtCPVtdXVxuICogQHBhcmFtIHtUfSB0YXJnZXRcbiAqIEBwYXJhbSB7UH0gbWV0aG9kTmFtZVxuICogQHBhcmFtIHtCfSBib3VuZFxuICogQHJldHVybnMge1N5bmNDYWxsYmFjazxJPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VTeW5jTWV0aG9kQ2FsbGJhY2s9KHRhcmdldCxtZXRob2ROYW1lLC4uLmJvdW5kKT0+e1xuaXNPYmplY3QodGFyZ2V0KXx8XG5GYWlsIGBzeW5jIG1ldGhvZCBjYWxsYmFjayB0YXJnZXQgbXVzdCBiZSBhbiBvYmplY3Q6ICR7dGFyZ2V0fWA7XG50eXBlb2YgbWV0aG9kTmFtZT09PSdzdHJpbmcnfHxcbmlzUGFzc2FibGVTeW1ib2wobWV0aG9kTmFtZSl8fFxuRmFpbCBgbWV0aG9kIG5hbWUgbXVzdCBiZSBhIHN0cmluZyBvciBwYXNzYWJsZSBzeW1ib2w6ICR7bWV0aG9kTmFtZX1gO1xuLyoqIEB0eXBlIHt1bmtub3dufSAqL1xuY29uc3QgY2I9aGFyZGVuKHt0YXJnZXQsbWV0aG9kTmFtZSxib3VuZCxpc1N5bmM6dHJ1ZX0pO1xucmV0dXJuICgvKiogQHR5cGUge1N5bmNDYWxsYmFjazxJPn0gKi9jYik7XG4gfTskaOKAjV9vbmNlLm1ha2VTeW5jTWV0aG9kQ2FsbGJhY2sobWFrZVN5bmNNZXRob2RDYWxsYmFjayk7XG5oYXJkZW4obWFrZVN5bmNNZXRob2RDYWxsYmFjayk7XG5cbi8qKlxuICogQ3JlYXRlIGEgY2FsbGJhY2sgZnJvbSBhIHBvdGVudGlhbGx5IGZhciBtZXRob2QuXG4gKlxuICogQHRlbXBsYXRlIHsoLi4uYXJnczogdW5rbm93bltdKSA9PiBhbnl9IElcbiAqIEB0ZW1wbGF0ZSB7UHJvcGVydHlLZXl9IFBcbiAqIEB0ZW1wbGF0ZSB7WGltcG9ydCgnQGVuZG8vZmFyJykuRVJlZjx7XG4gKiAgIFt4IGluIFBdOiAoLi4uYXJnczogWy4uLkIsIC4uLlBhcmFtZXRlcnM8ST5dKSA9PiBSZXR1cm5UeXBlPEk+XG4gKiB9Pn0gW1Q9WGltcG9ydCgnQGVuZG8vZmFyJykuRVJlZjx7IFt4IGluIFBdOiBJIH0+XVxuICogQHRlbXBsYXRlIHt1bmtub3duW119IFtCPVtdXVxuICogQHBhcmFtIHtUfSB0YXJnZXRcbiAqIEBwYXJhbSB7UH0gbWV0aG9kTmFtZVxuICogQHBhcmFtIHtCfSBib3VuZFxuICogQHJldHVybnMge0NhbGxiYWNrPEk+fVxuICovXG5jb25zdCAgICAgICAgbWFrZU1ldGhvZENhbGxiYWNrPSh0YXJnZXQsbWV0aG9kTmFtZSwuLi5ib3VuZCk9PntcbmlzT2JqZWN0KHRhcmdldCl8fEZhaWwgYG1ldGhvZCBjYWxsYmFjayB0YXJnZXQgbXVzdCBiZSBhbiBvYmplY3Q6ICR7dGFyZ2V0fWA7XG50eXBlb2YgbWV0aG9kTmFtZT09PSdzdHJpbmcnfHxcbmlzUGFzc2FibGVTeW1ib2wobWV0aG9kTmFtZSl8fFxuRmFpbCBgbWV0aG9kIG5hbWUgbXVzdCBiZSBhIHN0cmluZyBvciBwYXNzYWJsZSBzeW1ib2w6ICR7bWV0aG9kTmFtZX1gO1xuLyoqIEB0eXBlIHt1bmtub3dufSAqL1xuY29uc3QgY2I9aGFyZGVuKHt0YXJnZXQsbWV0aG9kTmFtZSxib3VuZH0pO1xucmV0dXJuICgvKiogQHR5cGUge0NhbGxiYWNrPEk+fSAqL2NiKTtcbiB9OyRo4oCNX29uY2UubWFrZU1ldGhvZENhbGxiYWNrKG1ha2VNZXRob2RDYWxsYmFjayk7XG5oYXJkZW4obWFrZU1ldGhvZENhbGxiYWNrKTtcblxuLyoqXG4gKiBAcGFyYW0ge2FueX0gY2FsbGJhY2tcbiAqIEByZXR1cm5zIHtjYWxsYmFjayBpcyBDYWxsYmFjazxhbnk+fVxuICovXG5jb25zdCAgICAgICAgaXNDYWxsYmFjaz0oY2FsbGJhY2spPT57XG5pZighaXNPYmplY3QoY2FsbGJhY2spKXtcbnJldHVybiBmYWxzZTtcbiB9XG5jb25zdHt0YXJnZXQsbWV0aG9kTmFtZSxib3VuZH09Y2FsbGJhY2s7XG5yZXR1cm4oXG5pc09iamVjdCh0YXJnZXQpJiYoXG5tZXRob2ROYW1lPT09dW5kZWZpbmVkfHxcbnR5cGVvZiBtZXRob2ROYW1lPT09J3N0cmluZyd8fFxuaXNQYXNzYWJsZVN5bWJvbChtZXRob2ROYW1lKSkmJlxuQXJyYXkuaXNBcnJheShib3VuZCkpO1xuXG4gfTskaOKAjV9vbmNlLmlzQ2FsbGJhY2soaXNDYWxsYmFjayk7XG5oYXJkZW4oaXNDYWxsYmFjayk7XG5cbi8qKlxuICogUHJlcGFyZSBhbiBhdHRlbnVhdG9yIGNsYXNzIHdob3NlIG1ldGhvZHMgY2FuIGJlIHJlZGlyZWN0ZWQgdmlhIGNhbGxiYWNrcy5cbiAqXG4gKiBAdGVtcGxhdGUge1Byb3BlcnR5S2V5fSBNXG4gKiBAcGFyYW0ge1hpbXBvcnQoJ0BhZ29yaWMvYmFzZS16b25lJykuWm9uZX0gem9uZSBUaGUgem9uZSBpbiB3aGljaCB0byBhbGxvY2F0ZSBhdHRlbnVhdG9ycy5cbiAqIEBwYXJhbSB7TVtdfSBtZXRob2ROYW1lcyBNZXRob2RzIHRvIGZvcndhcmQuXG4gKiBAcGFyYW0ge29iamVjdH0gb3B0c1xuICogQHBhcmFtIHtYaW1wb3J0KCdAZW5kby9wYXR0ZXJucycpLkludGVyZmFjZUd1YXJkPHtcbiAqICBbSyBpbiBNXTogWGltcG9ydCgnQGVuZG8vcGF0dGVybnMnKS5NZXRob2RHdWFyZFxuICogfT59IFtvcHRzLmludGVyZmFjZUd1YXJkXSBBbiBpbnRlcmZhY2UgZ3VhcmQgZm9yIHRoZVxuICogbmV3IGF0dGVudWF0b3IuXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdHMudGFnXSBBIHRhZyBmb3IgdGhlIG5ldyBhdHRlbnVhdG9yIGV4b0NsYXNzLlxuICovXG5jb25zdCAgICAgICAgcHJlcGFyZUF0dGVudWF0b3I9KFxuem9uZSxcbm1ldGhvZE5hbWVzLFxue2ludGVyZmFjZUd1YXJkLHRhZz0nQXR0ZW51YXRvcid9PXt9KT0+XG57XG4vKipcbiAqIEB0eXBlZGVmIHsodGhpczogYW55LCAuLi5hcmdzOiB1bmtub3duW10pID0+IGFueX0gTWV0aG9kXG4gKiBAdHlwZWRlZiB7eyBbSyBpbiBNXT86IENhbGxiYWNrPGFueT4gfCBudWxsfX0gT3ZlcnJpZGVzXG4gKiBAdHlwZWRlZiB7eyBbSyBpbiBNXTogKHRoaXM6IGFueSwgLi4uYXJnczogdW5rbm93bltdKSA9PiBhbnkgfX0gTWV0aG9kc1xuICovXG5jb25zdCBtZXRob2RzPS8qKiBAdHlwZSB7TWV0aG9kc30gKi9cbmZyb21FbnRyaWVzKFxubWV0aG9kTmFtZXMubWFwKChrZXkpPT57XG4vKiBPbmx5IGFsbG93IHRoZSBgUHJvcGVydHlLZXlgIHR5cGUgZm9yIHRoZSB0YXJnZXQgbWV0aG9kIGtleS4qL1xuaWYoIWlzUHJvcGVydHlLZXkoa2V5KSl7XG50aHJvdyBGYWlsIGBrZXkgJHtxKGtleSl9IGlzIG5vdCBhIFByb3BlcnR5S2V5YDtcbiB9XG5cbmNvbnN0IG09LyoqIEB0eXBlIHtNZXRob2RzfSAqL3tcbi8qIEV4cGxpY2l0bHkgdXNlIGNvbmNpc2UgbWV0aG9kIHN5bnRheCB0byBwcmVzZXJ2ZSBgdGhpc2AgYnV0IHByZXZlbnQqL1xuLyogY29uc3RydWN0b3IgYmVoYXZpb3IuKi9cbi8qKiBAdHlwZSB7TWV0aG9kfSAqL1xuW2tleV0oLi4uYXJncyl7XG4vKiBTdXBwb3J0IGJvdGggc3luY2hyb25vdXMgYW5kIGFzeW5jIGNhbGxiYWNrcy4qL1xuY29uc3QgY2I9dGhpcy5zdGF0ZS5jYnNba2V5XTtcbmlmKCFjYil7XG5jb25zdCBlcnI9YXNzZXJ0LmVycm9yKFxuIGB1bmltcGxlbWVudGVkICR7cSh0YWcpfSBtZXRob2QgJHtxKGtleSl9YCk7XG5cbmlmKHRoaXMuc3RhdGUuaXNTeW5jKXtcbnRocm93IGVycjtcbiB9XG5yZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyKTtcbiB9XG5pZihjYi5pc1N5bmMpe1xucmV0dXJuIGNhbGxTeW5jKGNiLC4uLmFyZ3MpO1xuIH1cbnJldHVybiBjYWxsRShjYiwuLi5hcmdzKTtcbiB9fVtcbmtleV07XG5yZXR1cm4gKC8qKiBAdHlwZSB7Y29uc3R9ICovW2tleSxtXSk7XG4gfSkpO1xuXG5cblxuLyoqXG4gKiBDcmVhdGUgYW4gZXhvIG9iamVjdCB3aG9zZSBiZWhhdmlvciBpcyBjb21wb3NlZCBmcm9tIGEgZGVmYXVsdCB0YXJnZXRcbiAqIGFuZC9vciBpbmRpdmlkdWFsIG1ldGhvZCBvdmVycmlkZSBjYWxsYmFja3MuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IG9wdHNcbiAqIEBwYXJhbSB7dW5rbm93bn0gW29wdHMudGFyZ2V0XSBUaGUgdGFyZ2V0IGZvciBhbnkgbWV0aG9kcyB0aGF0XG4gKiB3ZXJlbid0IHNwZWNpZmllZCBpbiBgb3B0cy5vdmVycmlkZXNgLlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5pc1N5bmM9ZmFsc2VdIFdoZXRoZXIgdGhlIHRhcmdldCBzaG91bGQgYmUgdHJlYXRlZFxuICogYXMgc3luY2hyb25vdXNseSBhdmFpbGFibGUuXG4gKiBAcGFyYW0ge092ZXJyaWRlc30gW29wdHMub3ZlcnJpZGVzXSBTZXQgaW5kaXZpZHVhbFxuICogY2FsbGJhY2tzIGZvciBtZXRob2RzICh3aG9zZSBuYW1lcyBtdXN0IGJlIGRlZmluZWQgaW4gdGhlXG4gKiBgcHJlcGFyZUF0dGVudWF0b3JgIG9yIGBwcmVwYXJlR3VhcmRlZEF0dGVudWF0b3JgIGNhbGwpLiAgTnVsbGlzaCBvdmVycmlkZXNcbiAqIG1lYW4gdG8gdGhyb3cuXG4gKi9cbmNvbnN0IG1ha2VBdHRlbnVhdG9yPXpvbmUuZXhvQ2xhc3MoXG50YWcsXG5pbnRlcmZhY2VHdWFyZCxcbi8qKlxuICogQHBhcmFtIHtvYmplY3R9IG9wdHNcbiAqIEBwYXJhbSB7YW55fSBbb3B0cy50YXJnZXRdXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLmlzU3luY11cbiAqIEBwYXJhbSB7T3ZlcnJpZGVzfSBbb3B0cy5vdmVycmlkZXNdXG4gKi9cbih7XG50YXJnZXQ9bnVsbCxcbmlzU3luYz1mYWxzZSxcbm92ZXJyaWRlcz0vKiogQHR5cGUge092ZXJyaWRlc30gKi97fX0pPT5cbntcbmNvbnN0IGNicz0vKiogQHR5cGUge092ZXJyaWRlc30gKi97fTtcblxuY29uc3QgcmVtYWluaW5nPW5ldyBTZXQobWV0aG9kTmFtZXMpO1xuZm9yKGNvbnN0IGtleSBvZiBvd25LZXlzKG92ZXJyaWRlcykpe1xucmVtYWluaW5nLmhhcyhrZXkpfHxcbkZhaWwgYCR7cSh0YWcpfSBvdmVycmlkZXNbJHtxKGtleSl9XSBub3QgYWxsb3dlZCBieSBtZXRob2ROYW1lc2A7XG5cbnJlbWFpbmluZy5kZWxldGUoa2V5KTtcbmNvbnN0IGNiPW92ZXJyaWRlc1trZXldO1xuY2I9PW51bGx8fFxuaXNDYWxsYmFjayhjYil8fFxuRmFpbCBgJHtxKHRhZyl9IG92ZXJyaWRlc1ske3Eoa2V5KX1dIGlzIG5vdCBhIGNhbGxiYWNrOyBnb3QgJHtjYn1gO1xuY2JzW2tleV09Y2I7XG4gfVxuZm9yKGNvbnN0IGtleSBvZiByZW1haW5pbmcpe1xuaWYoaXNTeW5jKXtcbmNic1trZXldPW1ha2VTeW5jTWV0aG9kQ2FsbGJhY2sodGFyZ2V0LGtleSk7XG4gfWVsc2V7XG5jYnNba2V5XT1tYWtlTWV0aG9kQ2FsbGJhY2sodGFyZ2V0LGtleSk7XG4gfVxuIH1cbnJldHVybiBoYXJkZW4oe2Nicyxpc1N5bmN9KTtcbiB9LFxuLyoqIEB0eXBlIHtNZXRob2RzfSAqL21ldGhvZHMpO1xuXG5yZXR1cm4gbWFrZUF0dGVudWF0b3I7XG4gfTskaOKAjV9vbmNlLnByZXBhcmVBdHRlbnVhdG9yKHByZXBhcmVBdHRlbnVhdG9yKTtcbmhhcmRlbihwcmVwYXJlQXR0ZW51YXRvcik7XG5cbi8qKlxuICogUHJlcGFyZSBhbiBhdHRlbnVhdG9yIHdob3NlIG1ldGhvZE5hbWVzIGFyZSBkZXJpdmVkIGZyb20gdGhlIGludGVyZmFjZUd1YXJkLlxuICpcbiAqIEB0ZW1wbGF0ZSB7WGltcG9ydCgnQGVuZG8vcGF0dGVybnMnKS5JbnRlcmZhY2VHdWFyZH0gR1xuICogQHBhcmFtIHtYaW1wb3J0KCdAYWdvcmljL2Jhc2Utem9uZScpLlpvbmV9IHpvbmVcbiAqIEBwYXJhbSB7R30gaW50ZXJmYWNlR3VhcmRcbiAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0c11cbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy50YWddXG4gKi9cbmNvbnN0ICAgICAgICBwcmVwYXJlR3VhcmRlZEF0dGVudWF0b3I9KHpvbmUsaW50ZXJmYWNlR3VhcmQsb3B0cz17fSk9PntcbmNvbnN0IG1ldGhvZE5hbWVzPWdldEludGVyZmFjZU1ldGhvZEtleXMoaW50ZXJmYWNlR3VhcmQpO1xuY29uc3QgbWFrZUF0dGVudWF0b3I9cHJlcGFyZUF0dGVudWF0b3Ioem9uZSxtZXRob2ROYW1lcyx7XG4uLi5vcHRzLFxuaW50ZXJmYWNlR3VhcmR9KTtcblxucmV0dXJuICgvKiogQHR5cGUge01ha2VBdHRlbnVhdG9yPGFueT59ICovbWFrZUF0dGVudWF0b3IpO1xuIH07JGjigI1fb25jZS5wcmVwYXJlR3VhcmRlZEF0dGVudWF0b3IocHJlcGFyZUd1YXJkZWRBdHRlbnVhdG9yKTtcbmhhcmRlbihwcmVwYXJlR3VhcmRlZEF0dGVudWF0b3IpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImNhbGxTeW5jIjpbImNhbGxTeW5jIl0sImNhbGxFIjpbImNhbGxFIl0sIm1ha2VTeW5jRnVuY3Rpb25DYWxsYmFjayI6WyJtYWtlU3luY0Z1bmN0aW9uQ2FsbGJhY2siXSwibWFrZUZ1bmN0aW9uQ2FsbGJhY2siOlsibWFrZUZ1bmN0aW9uQ2FsbGJhY2siXSwibWFrZVN5bmNNZXRob2RDYWxsYmFjayI6WyJtYWtlU3luY01ldGhvZENhbGxiYWNrIl0sIm1ha2VNZXRob2RDYWxsYmFjayI6WyJtYWtlTWV0aG9kQ2FsbGJhY2siXSwiaXNDYWxsYmFjayI6WyJpc0NhbGxiYWNrIl0sInByZXBhcmVBdHRlbnVhdG9yIjpbInByZXBhcmVBdHRlbnVhdG9yIl0sInByZXBhcmVHdWFyZGVkQXR0ZW51YXRvciI6WyJwcmVwYXJlR3VhcmRlZEF0dGVudWF0b3IiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAqo/dRiIGAAAiBgAAJQAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9jb25maWcuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIkJyaWRnZUlkIiwiVkJhbmtBY2NvdW50IiwiV2FsbGV0TmFtZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qIEB0cy1jaGVjayovXG4vKiBAamVzc2llLWNoZWNrKi9cblxuLyoqXG4gKiBAZmlsZVxuICpcbiAqIFNvbWUgb2YgdGhpcyBjb25maWcgaW5mbyBtYXkgbWFrZSBtb3JlIHNlbnNlIGluIGEgcGFydGljdWxhciBwYWNrYWdlLiBIb3dldmVyXG4gKiBkdWUgdG8gaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy80NjIwIGFuZCBvdXIgbGF4IHBhY2thZ2VcbiAqIGRlcGVuZGVuY3kgZ3JhcGgsIHNvbWV0aW1lcyByYXRpb25hbCBwbGFjZW1lbnRzIGNhdXNlIHR5cGUgcmVzb2x1dGlvbiBlcnJvcnMuXG4gKlxuICogU28gYXMgYSB3b3JrLWFyb3VuZCBzb21lIGNvbnN0YW50cyB0aGF0IG5lZWQgYWNjZXNzIGZyb20gbW9yZSB0aGFuIG9uZSBwYWNrYWdlIGFyZSBwbGFjZWQgaGVyZS5cbiAqL1xuXG4vKipcbiAqIEV2ZW50IHNvdXJjZSBpZHMgdXNlZCBieSB0aGUgYnJpZGdlIGRldmljZS5cbiAqL1xuY29uc3QgICAgICAgIEJyaWRnZUlkPXtcbkJBTks6J2JhbmsnLFxuQ09SRTonY29yZScsXG5ESUJDOidkaWJjJyxcblNUT1JBR0U6J3N0b3JhZ2UnLFxuUFJPVklTSU9OOidwcm92aXNpb24nLFxuUFJPVklTSU9OX1NNQVJUX1dBTExFVDoncHJvdmlzaW9uV2FsbGV0JyxcbldBTExFVDond2FsbGV0J307JGjigI1fb25jZS5CcmlkZ2VJZChCcmlkZ2VJZCk7XG5cbmhhcmRlbihCcmlkZ2VJZCk7XG5cbmNvbnN0ICAgICAgICBXYWxsZXROYW1lPXtcbmRlcG9zaXRGYWNldDonZGVwb3NpdEZhY2V0J307JGjigI1fb25jZS5XYWxsZXROYW1lKFdhbGxldE5hbWUpO1xuXG5oYXJkZW4oV2FsbGV0TmFtZSk7XG5cbi8qIGRlZmluZWQgaW4gZ29sYW5nL2Nvc21vcy94L3ZiYW5rKi9cbmNvbnN0ICAgICAgICBWQmFua0FjY291bnQ9e1xucmVzZXJ2ZTp7XG5tb2R1bGU6J3ZiYW5rL3Jlc2VydmUnLFxuYWRkcmVzczonYWdvcmljMWFlMGxtdHpsZ3JjbmxhOXhqa3BhYXJxNWQ1ZGZlejYzaDNudWNsJ30sXG5cbnByb3Zpc2lvbjp7XG5tb2R1bGU6J3ZiYW5rL3Byb3Zpc2lvbicsXG5hZGRyZXNzOidhZ29yaWMxbWVnenl0ZzY1Y3lyZ3pzNmZ2enhncmNxdnd3bDd1Z3B0NjIzNDYnfX07JGjigI1fb25jZS5WQmFua0FjY291bnQoVkJhbmtBY2NvdW50KTtcblxuXG5oYXJkZW4oVkJhbmtBY2NvdW50KTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJCcmlkZ2VJZCI6WyJCcmlkZ2VJZCJdLCJXYWxsZXROYW1lIjpbIldhbGxldE5hbWUiXSwiVkJhbmtBY2NvdW50IjpbIlZCYW5rQWNjb3VudCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAXyTOAyAQAAMgEAAAkAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL2RlYnVnLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJtYWtlVHJhY2VyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyogQGplc3NpZS1jaGVjayovXG5cbmxldCBkZWJ1Z0luc3RhbmNlPTE7XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7Ym9vbGVhbiB8ICd2ZXJib3NlJ30gZW5hYmxlXG4gKi9cbmNvbnN0ICAgICAgICBtYWtlVHJhY2VyPShuYW1lLGVuYWJsZT10cnVlKT0+e1xuZGVidWdJbnN0YW5jZSs9MTtcbmxldCBkZWJ1Z0NvdW50PTE7XG5jb25zdCBrZXk9IGAtLS0tLSAke25hbWV9LiR7ZGVidWdJbnN0YW5jZX0gYDtcbi8qIHRoZSBjYXNlcyBiZWxvdyBkZWZpbmUgYSBuYW1lZCB2YXJpYWJsZSB0byBwcm92aWRlIGJldHRlciBkZWJ1ZyBpbmZvKi9cbnN3aXRjaChlbmFibGUpe1xuY2FzZSBmYWxzZTp7XG5jb25zdCBsb2dEaXNhYmxlZD0oLi4uX2FyZ3MpPT57IH07XG5yZXR1cm4gbG9nRGlzYWJsZWQ7XG4gfVxuY2FzZSd2ZXJib3NlJzp7XG5jb25zdCBpbmZvVGljaz0ob3B0TG9nLC4uLmFyZ3MpPT57XG5pZihvcHRMb2cubG9nKXtcbmNvbnNvbGUuaW5mbyhrZXksZGVidWdDb3VudCs9MSwuLi5hcmdzKTtcbiB9ZWxzZXtcbmNvbnNvbGUuaW5mbyhrZXksZGVidWdDb3VudCs9MSxvcHRMb2csLi4uYXJncyk7XG4gfVxuIH07XG5yZXR1cm4gaW5mb1RpY2s7XG4gfVxuZGVmYXVsdDp7XG5jb25zdCBkZWJ1Z1RpY2s9KG9wdExvZywuLi5hcmdzKT0+e1xuaWYob3B0TG9nLmxvZyl7XG5vcHRMb2cubG9nKGtleSxkZWJ1Z0NvdW50Kz0xLC4uLmFyZ3MpO1xuIH1lbHNle1xuY29uc29sZS5pbmZvKGtleSxkZWJ1Z0NvdW50Kz0xLG9wdExvZywuLi5hcmdzKTtcbiB9XG4gfTtcbnJldHVybiBkZWJ1Z1RpY2s7XG4gfX1cblxuIH07JGjigI1fb25jZS5tYWtlVHJhY2VyKG1ha2VUcmFjZXIpO1xuaGFyZGVuKG1ha2VUcmFjZXIpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VUcmFjZXIiOlsibWFrZVRyYWNlciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAC4c/LWQwIAAEMCAAAkAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vY29uZmlnLmpzIiwiLi9kZWJ1Zy5qcyIsIi4vdXRpbHMuanMiLCIuL21ldGhvZC10b29scy5qcyIsIi4vdHlwZUd1YXJkcy5qcyJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbIi4vY29uZmlnLmpzIiwiLi9kZWJ1Zy5qcyIsIi4vbWV0aG9kLXRvb2xzLmpzIiwiLi90eXBlR3VhcmRzLmpzIiwiLi91dGlscy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIi4vY29uZmlnLmpzXCIsIFtdXSxbXCIuL2RlYnVnLmpzXCIsIFtdXSxbXCIuL3V0aWxzLmpzXCIsIFtdXSxbXCIuL21ldGhvZC10b29scy5qc1wiLCBbXV0sW1wiLi90eXBlR3VhcmRzLmpzXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADh0rdqKioAACoqAAAvAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL2xpYi1jaGFpblN0b3JhZ2UuanN7ImltcG9ydHMiOlsiQGVuZG8vZmFyIiwiQGVuZG8vcGF0dGVybnMiLCJAYWdvcmljL2Jhc2Utem9uZS9oZWFwLmpzIiwiLi9jYWxsYmFjay5qcyJdLCJleHBvcnRzIjpbImFzc2VydENhcERhdGEiLCJhc3NlcnRQYXRoU2VnbWVudCIsImlzU3RyZWFtQ2VsbCIsIm1ha2VDaGFpblN0b3JhZ2VSb290IiwibWFrZVNlcmlhbGl6ZVRvU3RvcmFnZSIsIm1ha2VTdG9yYWdlTm9kZUNoaWxkIiwicHJlcGFyZUNoYWluU3RvcmFnZU5vZGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRSxNLG1ha2VIZWFwWm9uZSxjYjskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9mYXJcIiwgW1tcIkVcIiwgWyRo4oCNX2EgPT4gKEUgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vcGF0dGVybnNcIiwgW1tcIk1cIiwgWyRo4oCNX2EgPT4gKE0gPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9iYXNlLXpvbmUvaGVhcC5qc1wiLCBbW1wibWFrZUhlYXBab25lXCIsIFskaOKAjV9hID0+IChtYWtlSGVhcFpvbmUgPSAkaOKAjV9hKV1dXV0sW1wiLi9jYWxsYmFjay5qc1wiLCBbW1wiKlwiLCBbJGjigI1fYSA9PiAoY2IgPSAkaOKAjV9hKV1dXV1dKTtPYmplY3QuZGVmaW5lUHJvcGVydHkobWFrZUNoYWluU3RvcmFnZVJvb3QsICduYW1lJywge3ZhbHVlOiBcIm1ha2VDaGFpblN0b3JhZ2VSb290XCJ9KTskaOKAjV9vbmNlLm1ha2VDaGFpblN0b3JhZ2VSb290KG1ha2VDaGFpblN0b3JhZ2VSb290KTtPYmplY3QuZGVmaW5lUHJvcGVydHkobWFrZVN0b3JhZ2VOb2RlQ2hpbGQsICduYW1lJywge3ZhbHVlOiBcIm1ha2VTdG9yYWdlTm9kZUNoaWxkXCJ9KTskaOKAjV9vbmNlLm1ha2VTdG9yYWdlTm9kZUNoaWxkKG1ha2VTdG9yYWdlTm9kZUNoaWxkKTsgICBcblxuXG5cblxuXG5cbmNvbnN0e0ZhaWx9PWFzc2VydDtcblxuLyoqIEB0eXBlZGVmIHtSZXR1cm5UeXBlPHR5cGVvZiBYaW1wb3J0KCdAZW5kby9tYXJzaGFsJykubWFrZU1hcnNoYWw+fSBNYXJzaGFsbGVyICovXG4vKiogQHR5cGVkZWYge1BpY2s8TWFyc2hhbGxlciwgJ2Zyb21DYXBEYXRhJz59IFVuc2VyaWFsaXplciAqL1xuXG4vKipcbiAqIERlZmluZWQgYnkgdnN0b3JhZ2VTdG9yZUtleSBpbiB2c3RvcmFnZS5nb1xuICpcbiAqIEB0eXBlZGVmIFZTdG9yYWdlS2V5XG4gKiBAcHJvcGVydHkge3N0cmluZ30gc3RvcmVOYW1lXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc3RvcmVTdWJrZXlcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkYXRhUHJlZml4Qnl0ZXNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbbm9EYXRhVmFsdWVdXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgW1Q9dW5rbm93bl1cbiAqIEB0eXBlZGVmIFN0cmVhbUNlbGxcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBibG9ja0hlaWdodCBkZWNpbWFsIHJlcHJlc2VudGF0aW9uIG9mIGEgbmF0dXJhbCBudW1iZXJcbiAqIEBwcm9wZXJ0eSB7VFtdfSB2YWx1ZXNcbiAqL1xuXG4vKipcbiAqIFRoaXMgcmVwcmVzZW50cyBhIG5vZGUgaW4gYW4gSUFWTCB0cmVlLlxuICpcbiAqIFRoZSBhY3RpdmUgaW1wbGVtZW50YXRpb24gaXMgeC92c3RvcmFnZSwgYW4gQWdvcmljIGV4dGVuc2lvbiBvZiB0aGUgQ29zbW9zIFNESy5cbiAqXG4gKiBWc3RvcmFnZSBpcyBhIGhpZXJhcmNoaWNhbCBleHRlcm5hbGx5LXJlYWNoYWJsZSBzdG9yYWdlIHN0cnVjdHVyZSB0aGF0XG4gKiBpZGVudGlmaWVzIGNoaWxkcmVuIGJ5IHJlc3RyaWN0ZWQgQVNDSUkgbmFtZSBhbmQgaXMgYXNzb2NpYXRlZCB3aXRoIGFyYml0cmFyeVxuICogc3RyaW5nLXZhbHVlZCBkYXRhIGZvciBlYWNoIG5vZGUsIGRlZmF1bHRpbmcgdG8gdGhlIGVtcHR5IHN0cmluZy5cbiAqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTdG9yYWdlTm9kZVxuICogQHByb3BlcnR5IHsoZGF0YTogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+fSBzZXRWYWx1ZSBwdWJsaXNoZXMgc29tZSBkYXRhXG4gKiBAcHJvcGVydHkgeygpID0+IHN0cmluZ30gZ2V0UGF0aCB0aGUgY2hhaW4gc3RvcmFnZSBwYXRoIGF0IHdoaWNoIHRoZSBub2RlIHdhcyBjb25zdHJ1Y3RlZFxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPFZTdG9yYWdlS2V5Pn0gZ2V0U3RvcmVLZXkgREVQUkVDQVRFRCB1c2UgZ2V0UGF0aFxuICogQHByb3BlcnR5IHsoc3ViUGF0aDogc3RyaW5nLCBvcHRpb25zPzoge3NlcXVlbmNlPzogYm9vbGVhbn0pID0+IFN0b3JhZ2VOb2RlfSBtYWtlQ2hpbGROb2RlXG4gKi9cblxuY29uc3QgQ2hhaW5TdG9yYWdlTm9kZUk9TS5pbnRlcmZhY2UoJ1N0b3JhZ2VOb2RlJyx7XG5zZXRWYWx1ZTpNLmNhbGxXaGVuKE0uc3RyaW5nKCkpLnJldHVybnMoKSxcbmdldFBhdGg6TS5jYWxsKCkucmV0dXJucyhNLnN0cmluZygpKSxcbmdldFN0b3JlS2V5Ok0uY2FsbFdoZW4oKS5yZXR1cm5zKE0ucmVjb3JkKCkpLFxubWFrZUNoaWxkTm9kZTpNLmNhbGwoTS5zdHJpbmcoKSkuXG5vcHRpb25hbChNLnNwbGl0UmVjb3JkKHt9LHtzZXF1ZW5jZTpNLmJvb2xlYW4oKX0se30pKS5cbnJldHVybnMoTS5yZW1vdGFibGUoJ1N0b3JhZ2VOb2RlJykpfSk7XG5cblxuLyoqXG4gKiBUaGlzIGlzIGFuIGltcGVyZmVjdCBoZXVyaXN0aWMgdG8gbmF2aWdhdGUgdGhlIG1pZ3JhdGlvbiBmcm9tIHZhbHVlIGNlbGxzIHRvXG4gKiBzdHJlYW0gY2VsbHMuXG4gKiBBdCB0aW1lIG9mIHdyaXRpbmcsIG5vIGxlZ2FjeSBjZWxscyBoYXZlIHRoZSBzYW1lIHNoYXBlIGFzIGEgc3RyZWFtIGNlbGwsXG4gKiBhbmQgd2UgZG8gbm90IGludGVuZCB0byBjcmVhdGUgYW55IG1vcmUgbGVnYWN5IHZhbHVlIGNlbGxzLlxuICpcbiAqIEBwYXJhbSB7YW55fSBjZWxsXG4gKiBAcmV0dXJucyB7Y2VsbCBpcyBTdHJlYW1DZWxsfVxuICovXG5jb25zdCAgICAgICAgaXNTdHJlYW1DZWxsPShjZWxsKT0+XG5jZWxsJiZcbnR5cGVvZiBjZWxsPT09J29iamVjdCcmJlxuQXJyYXkuaXNBcnJheShjZWxsLnZhbHVlcykmJlxudHlwZW9mIGNlbGwuYmxvY2tIZWlnaHQ9PT0nc3RyaW5nJyYmXG4vXjAkfF5bMS05XVswLTldKiQvLnRlc3QoY2VsbC5ibG9ja0hlaWdodCk7JGjigI1fb25jZS5pc1N0cmVhbUNlbGwoaXNTdHJlYW1DZWxsKTtcbmhhcmRlbihpc1N0cmVhbUNlbGwpO1xuXG4vKiBUT0RPOiBDb25zb2xpZGF0ZSB3aXRoIGBpbnNpc3RDYXBEYXRhYCBmdW5jdGlvbnMgZnJvbSBzd2luZ3NldC1saXZlc2xvdHMsKi9cbi8qIHN3aW5nc2V0LXhzbmFwLXN1cGVydmlzb3IsIGV0Yy4qL1xuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IGRhdGFcbiAqIEByZXR1cm5zIHthc3NlcnRzIGRhdGEgaXMgWGltcG9ydCgnQGVuZG8vbWFyc2hhbCcpLkNhcERhdGE8c3RyaW5nPn1cbiAqL1xuY29uc3QgICAgICAgIGFzc2VydENhcERhdGE9KGRhdGEpPT57XG5hc3NlcnQudHlwZW9mKGRhdGEsJ29iamVjdCcpO1xuYXNzZXJ0KGRhdGEpO1xuYXNzZXJ0LnR5cGVvZihkYXRhLmJvZHksJ3N0cmluZycpO1xuYXNzZXJ0KEFycmF5LmlzQXJyYXkoZGF0YS5zbG90cykpO1xuLyogWFhYIGNoZWNrIHRoYXQgdGhlIC5zbG90cyBhcnJheSBlbGVtZW50cyBhcmUgYWN0dWFsbHkgc3RyaW5ncyovXG4gfTskaOKAjV9vbmNlLmFzc2VydENhcERhdGEoYXNzZXJ0Q2FwRGF0YSk7XG5oYXJkZW4oYXNzZXJ0Q2FwRGF0YSk7XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU3RvcmVkRmFjZXRcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxzdHJpbmc+fSBnZXRQYXRoIHRoZSBjaGFpbiBzdG9yYWdlIHBhdGggYXQgd2hpY2ggdGhlIG5vZGUgd2FzIGNvbnN0cnVjdGVkXG4gKiBAcHJvcGVydHkge1N0b3JhZ2VOb2RlWydnZXRTdG9yZUtleSddfSBnZXRTdG9yZUtleSBERVBSRUNBVEVEIHVzZSBnZXRQYXRoXG4gKiBAcHJvcGVydHkgeygpID0+IFVuc2VyaWFsaXplcn0gZ2V0VW5zZXJpYWxpemVyIGdldCB0aGUgdW5zZXJpYWxpemVyIGZvciB0aGUgc3RvcmVkIGRhdGFcbiAqL1xuXG4vKiBUT0RPOiBGb3JtYWxpemUgc2VnbWVudCBjb25zdHJhaW50cy4qL1xuLyogTXVzdCBiZSBub25lbXB0eSBhbmQgZGlzYWxsb3cgKHVuZXNjYXBlZCkgYC5gLCBhbmQgZm9yIHNpbXBsaWNpdHkqL1xuLyogKGFuZCBmdXR1cmUgcG9zc2liaWxpdHkgb2YgZS5nLiBlc2NhcGluZykgd2UgY3VycmVudGx5IGxpbWl0IHRvKi9cbi8qIEFTQ0lJIGFscGhhbnVtZXJpYyBwbHVzIHVuZGVyc2NvcmUgYW5kIGRhc2guKi9cbi8qIFNob3VsZCByZW1haW4gY29uc2lzdGVudCB3aXRoIGdvbGFuZy9jb3Ntb3MveC92c3RvcmFnZS90eXBlcy9wYXRoX2tleXMuZ28qL1xuY29uc3QgcGF0aFNlZ21lbnRQYXR0ZXJuPS9eW2EtekEtWjAtOV8tXXsxLDEwMH0kLztcblxuLyoqIEB0eXBlIHsobmFtZTogc3RyaW5nKSA9PiB2b2lkfSAqL1xuY29uc3QgICAgICAgIGFzc2VydFBhdGhTZWdtZW50PShuYW1lKT0+e1xucGF0aFNlZ21lbnRQYXR0ZXJuLnRlc3QobmFtZSl8fFxuRmFpbCBgUGF0aCBzZWdtZW50IG5hbWVzIG11c3QgY29uc2lzdCBvZiAxIHRvIDEwMCBjaGFyYWN0ZXJzIGxpbWl0ZWQgdG8gQVNDSUkgYWxwaGFudW1lcmljcywgdW5kZXJzY29yZXMsIGFuZC9vciBkYXNoZXM6ICR7bmFtZX1gO1xuIH07JGjigI1fb25jZS5hc3NlcnRQYXRoU2VnbWVudChhc3NlcnRQYXRoU2VnbWVudCk7XG5oYXJkZW4oYXNzZXJ0UGF0aFNlZ21lbnQpO1xuXG4vKipcbiAqIE11c3QgbWF0Y2ggdGhlIHN3aXRjaCBpbiB2c3RvcmFnZS5nbyB1c2luZyBgdnN0b3JhZ2VNZXNzYWdlYCB0eXBlXG4gKlxuICogQHR5cGVkZWYgeyAnZ2V0JyB8ICdnZXRTdG9yZUtleScgfCAnaGFzJyB8ICdjaGlsZHJlbicgfCAnZW50cmllcycgfCAndmFsdWVzJyB8J3NpemUnIH0gU3RvcmFnZUdldEJ5UGF0aE1lc3NhZ2VNZXRob2RcbiAqIEB0eXBlZGVmIHsgJ3NldCcgfCAnc2V0V2l0aG91dE5vdGlmeScgfCAnYXBwZW5kJyB9IFN0b3JhZ2VVcGRhdGVFbnRyaWVzTWVzc2FnZU1ldGhvZFxuICogQHR5cGVkZWYge1N0b3JhZ2VHZXRCeVBhdGhNZXNzYWdlTWV0aG9kIHwgU3RvcmFnZVVwZGF0ZUVudHJpZXNNZXNzYWdlTWV0aG9kIH0gU3RvcmFnZU1lc3NhZ2VNZXRob2RcbiAqIEB0eXBlZGVmIHsgW3BhdGg6IHN0cmluZ10gfSBTdG9yYWdlR2V0QnlQYXRoTWVzc2FnZUFyZ3NcbiAqIEB0eXBlZGVmIHsgW3BhdGg6IHN0cmluZywgdmFsdWU/OiBzdHJpbmcgfCBudWxsXSB9IFN0b3JhZ2VFbnRyeVxuICogQHR5cGVkZWYgeyBTdG9yYWdlRW50cnlbXSB9IFN0b3JhZ2VVcGRhdGVFbnRyaWVzTWVzc2FnZUFyZ3NcbiAqIEB0eXBlZGVmIHt7XG4gKiAgIG1ldGhvZDogU3RvcmFnZUdldEJ5UGF0aE1lc3NhZ2VNZXRob2Q7XG4gKiAgIGFyZ3M6IFN0b3JhZ2VHZXRCeVBhdGhNZXNzYWdlQXJncztcbiAqICB9IHwge1xuICogICBtZXRob2Q6IFN0b3JhZ2VVcGRhdGVFbnRyaWVzTWVzc2FnZU1ldGhvZDtcbiAqICAgYXJnczogU3RvcmFnZVVwZGF0ZUVudHJpZXNNZXNzYWdlQXJncztcbiAqIH19IFN0b3JhZ2VNZXNzYWdlXG4gKi9cblxuLyoqXG4gKiBAcGFyYW0ge1hpbXBvcnQoJ0BhZ29yaWMvYmFzZS16b25lJykuWm9uZX0gem9uZVxuICovXG5jb25zdCAgICAgICAgcHJlcGFyZUNoYWluU3RvcmFnZU5vZGU9KHpvbmUpPT57XG4vKipcbiAqIENyZWF0ZSBhIHN0b3JhZ2Ugbm9kZSBmb3IgYSBnaXZlbiBiYWNraW5nIHN0b3JhZ2UgaW50ZXJmYWNlIGFuZCBwYXRoLlxuICpcbiAqIEBwYXJhbSB7WGltcG9ydCgnLi9jYWxsYmFjaycpLkNhbGxiYWNrPChtZXNzYWdlOiBTdG9yYWdlTWVzc2FnZSkgPT4gYW55Pn0gbWVzc2VuZ2VyIGEgY2FsbGJhY2tcbiAqIGZvciBzZW5kaW5nIGEgc3RvcmFnZU1lc3NhZ2Ugb2JqZWN0IHRvIHRoZSBzdG9yYWdlIGltcGxlbWVudGF0aW9uXG4gKiAoY2YuIGdvbGFuZy9jb3Ntb3MveC92c3RvcmFnZS92c3RvcmFnZS5nbylcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnNlcXVlbmNlXSBzZXQgdmFsdWVzIHdpdGggYGFwcGVuZGAgbWVzc2FnZXMgcmF0aGVyIHRoYW4gYHNldGAgbWVzc2FnZXNcbiAqIHNvIHRoZSBiYWNraW5nIGltcGxlbWVudGF0aW9uIGVtcGxveXMgYSB3cmFwcGluZyBzdHJ1Y3R1cmUgdGhhdFxuICogcHJlc2VydmVzIGVhY2ggdmFsdWUgc2V0IHdpdGhpbiBhIHNpbmdsZSBibG9jay5cbiAqIENoaWxkIG5vZGVzIGRlZmF1bHQgdG8gaW5oZXJpdGluZyB0aGlzIG9wdGlvbiBmcm9tIHRoZWlyIHBhcmVudC5cbiAqIEByZXR1cm5zIHtTdG9yYWdlTm9kZX1cbiAqL1xuY29uc3QgbWFrZUNoYWluU3RvcmFnZU5vZGU9em9uZS5leG9DbGFzcyhcbidDaGFpblN0b3JhZ2VOb2RlJyxcbkNoYWluU3RvcmFnZU5vZGVJLFxuLyoqXG4gKiBAcGFyYW0ge1hpbXBvcnQoJy4vY2FsbGJhY2snKS5DYWxsYmFjazwobWVzc2FnZTogU3RvcmFnZU1lc3NhZ2UpID0+IGFueT59IG1lc3NlbmdlclxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc11cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuc2VxdWVuY2VdXG4gKi9cbihtZXNzZW5nZXIscGF0aCx7c2VxdWVuY2U9ZmFsc2V9PXt9KT0+e1xuYXNzZXJ0LnR5cGVvZihwYXRoLCdzdHJpbmcnKTtcbmFzc2VydC50eXBlb2Yoc2VxdWVuY2UsJ2Jvb2xlYW4nKTtcbnJldHVybiBoYXJkZW4oe3BhdGgsbWVzc2VuZ2VyLHNlcXVlbmNlfSk7XG4gfSxcbntcbmdldFBhdGgoKXtcbnJldHVybiB0aGlzLnN0YXRlLnBhdGg7XG4gfSxcbi8qKlxuICogQGRlcHJlY2F0ZWQgdXNlIGdldFBhdGhcbiAqIEB0eXBlIHsoKSA9PiBQcm9taXNlPFZTdG9yYWdlS2V5Pn1cbiAqL1xuICAgICAgYXN5bmMgZ2V0U3RvcmVLZXkoKXtcbmNvbnN0e3BhdGgsbWVzc2VuZ2VyfT10aGlzLnN0YXRlO1xucmV0dXJuIGNiLmNhbGxFKG1lc3Nlbmdlcix7XG5tZXRob2Q6J2dldFN0b3JlS2V5JyxcbmFyZ3M6W3BhdGhdfSk7XG5cbiB9LFxuLyoqIEB0eXBlIHsobmFtZTogc3RyaW5nLCBjaGlsZE5vZGVPcHRpb25zPzoge3NlcXVlbmNlPzogYm9vbGVhbn0pID0+IFN0b3JhZ2VOb2RlfSAqL1xubWFrZUNoaWxkTm9kZShuYW1lLGNoaWxkTm9kZU9wdGlvbnM9e30pe1xuY29uc3R7c2VxdWVuY2UscGF0aCxtZXNzZW5nZXJ9PXRoaXMuc3RhdGU7XG5hc3NlcnRQYXRoU2VnbWVudChuYW1lKTtcbmNvbnN0IG1lcmdlZE9wdGlvbnM9e3NlcXVlbmNlLC4uLmNoaWxkTm9kZU9wdGlvbnN9O1xucmV0dXJuIG1ha2VDaGFpblN0b3JhZ2VOb2RlKFxubWVzc2VuZ2VyLFxuIGAke3BhdGh9LiR7bmFtZX1gLFxubWVyZ2VkT3B0aW9ucyk7XG5cbiB9LFxuLyoqIEB0eXBlIHsodmFsdWU6IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPn0gKi9cbiAgICAgIGFzeW5jIHNldFZhbHVlKHZhbHVlKXtcbmNvbnN0e3NlcXVlbmNlLHBhdGgsbWVzc2VuZ2VyfT10aGlzLnN0YXRlO1xuYXNzZXJ0LnR5cGVvZih2YWx1ZSwnc3RyaW5nJyk7XG4vKiogQHR5cGUge1N0b3JhZ2VFbnRyeX0gKi9cbmxldCBlbnRyeTtcbmlmKCFzZXF1ZW5jZSYmIXZhbHVlKXtcbmVudHJ5PVtwYXRoXTtcbiB9ZWxzZXtcbmVudHJ5PVtwYXRoLHZhbHVlXTtcbiB9XG5hd2FpdCBjYi5jYWxsRShtZXNzZW5nZXIse1xubWV0aG9kOnNlcXVlbmNlPydhcHBlbmQnOidzZXQnLFxuYXJnczpbZW50cnldfSk7XG5cbiB9XG4vKiBQb3NzaWJsZSBleHRlbnNpb25zOiovXG4vKiAqIGdldFZhbHVlKCkqL1xuLyogKiBnZXRDaGlsZE5hbWVzKCkgYW5kL29yIG1ha2VDaGlsZE5vZGVzKCkqL1xuLyogKiBnZXROYW1lKCkqL1xuLyogKiByZWN1cnNpdmUgZGVsZXRlKi9cbi8qICogYmF0Y2ggb3BlcmF0aW9ucyovXG4vKiAqIGxvY2FsIGJ1ZmZlcmluZyAod2l0aCBlbmQtb2YtYmxvY2sgY29tbWl0KSovfSk7XG5cblxucmV0dXJuIG1ha2VDaGFpblN0b3JhZ2VOb2RlO1xuIH07JGjigI1fb25jZS5wcmVwYXJlQ2hhaW5TdG9yYWdlTm9kZShwcmVwYXJlQ2hhaW5TdG9yYWdlTm9kZSk7XG5cbmNvbnN0IG1ha2VIZWFwQ2hhaW5TdG9yYWdlTm9kZT1wcmVwYXJlQ2hhaW5TdG9yYWdlTm9kZShtYWtlSGVhcFpvbmUoKSk7XG5cbi8qKlxuICogQ3JlYXRlIGEgaGVhcC1iYXNlZCByb290IHN0b3JhZ2Ugbm9kZSBmb3IgYSBnaXZlbiBiYWNraW5nIGZ1bmN0aW9uIGFuZCByb290IHBhdGguXG4gKlxuICogQHBhcmFtIHsobWVzc2FnZTogU3RvcmFnZU1lc3NhZ2UpID0+IGFueX0gaGFuZGxlU3RvcmFnZU1lc3NhZ2UgYSBmdW5jdGlvbiBmb3JcbiAqIHNlbmRpbmcgYSBzdG9yYWdlTWVzc2FnZSBvYmplY3QgdG8gdGhlIHN0b3JhZ2UgaW1wbGVtZW50YXRpb25cbiAqIChjZi4gZ29sYW5nL2Nvc21vcy94L3ZzdG9yYWdlL3ZzdG9yYWdlLmdvKVxuICogQHBhcmFtIHtzdHJpbmd9IHJvb3RQYXRoXG4gKiBAcGFyYW0ge29iamVjdH0gW3Jvb3RPcHRpb25zXVxuICogQHBhcmFtIHtib29sZWFufSBbcm9vdE9wdGlvbnMuc2VxdWVuY2VdIGVtcGxveSBhIHdyYXBwaW5nIHN0cnVjdHVyZSB0aGF0XG4gKiBwcmVzZXJ2ZXMgZWFjaCB2YWx1ZSBzZXQgd2l0aGluIGEgc2luZ2xlIGJsb2NrLCBhbmQgZGVmYXVsdCBjaGlsZCBub2Rlc1xuICogdG8gZG8gdGhlIHNhbWVcbiAqL1xuZnVuY3Rpb24gICAgICAgIG1ha2VDaGFpblN0b3JhZ2VSb290KFxuaGFuZGxlU3RvcmFnZU1lc3NhZ2UsXG5yb290UGF0aCxcbnJvb3RPcHRpb25zPXt9KVxue1xuY29uc3QgbWVzc2VuZ2VyPWNiLm1ha2VGdW5jdGlvbkNhbGxiYWNrKGhhbmRsZVN0b3JhZ2VNZXNzYWdlKTtcblxuLyogVXNlIHRoZSBoZWFwWm9uZSBkaXJlY3RseS4qL1xuY29uc3Qgcm9vdE5vZGU9bWFrZUhlYXBDaGFpblN0b3JhZ2VOb2RlKG1lc3Nlbmdlcixyb290UGF0aCxyb290T3B0aW9ucyk7XG5yZXR1cm4gcm9vdE5vZGU7XG4gfVxuXG4vKipcbiAqIEByZXR1cm5zIHtTdG9yYWdlTm9kZX0gYW4gb2JqZWN0IHRoYXQgY29uZmlybXMgdG8gU3RvcmFnZU5vZGUgQVBJIGJ1dCBkb2VzIG5vdCBzdG9yZSBhbnl3aGVyZS5cbiAqL1xuY29uc3QgbWFrZU51bGxTdG9yYWdlTm9kZT0oKT0+e1xuLyogWFhYIHJlLXVzZSBcIkNoYWluU3RvcmFnZVwiIG1ldGhvZHMgYWJvdmUgd2hpY2ggZG9uJ3QgYWN0dWFsbHkgZGVwZW5kIG9uIGNoYWlucyovXG5yZXR1cm4gbWFrZUNoYWluU3RvcmFnZVJvb3QoKCk9Pm51bGwsJ251bGwnKTtcbiB9O1xuXG4vKipcbiAqIENvbnZlbmllbmNlIGZ1bmN0aW9uIGZvciByZXR1cm5pbmcgYSBzdG9yYWdlIG5vZGUgYXQgb3IgdW5kZXIgaXRzIGlucHV0LFxuICogZmFsbGluZyBiYWNrIHRvIGFuIGluZXJ0IG9iamVjdCB3aXRoIHRoZSBjb3JyZWN0IGludGVyZmFjZSAoYnV0IGluY29tcGxldGVcbiAqIGJlaGF2aW9yKSB3aGVuIHRoYXQgaXMgdW5hdmFpbGFibGUuXG4gKlxuICogQHBhcmFtIHtYaW1wb3J0KCdAZW5kby9mYXInKS5FUmVmPFN0b3JhZ2VOb2RlPz59IHN0b3JhZ2VOb2RlUmVmXG4gKiBAcGFyYW0ge3N0cmluZ30gY2hpbGROYW1lXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxTdG9yYWdlTm9kZT59XG4gKi9cbmFzeW5jIGZ1bmN0aW9uICAgICAgICBtYWtlU3RvcmFnZU5vZGVDaGlsZChzdG9yYWdlTm9kZVJlZixjaGlsZE5hbWUpe1xuY29uc3QgZXhpc3RpbmdTdG9yYWdlTm9kZT1hd2FpdCBzdG9yYWdlTm9kZVJlZjtcbmNvbnN0IHN0b3JhZ2VOb2RlPWV4aXN0aW5nU3RvcmFnZU5vZGV8fG1ha2VOdWxsU3RvcmFnZU5vZGUoKTtcbnJldHVybiBFKHN0b3JhZ2VOb2RlKS5tYWtlQ2hpbGROb2RlKGNoaWxkTmFtZSk7XG4gfVxuaGFyZGVuKG1ha2VTdG9yYWdlTm9kZUNoaWxkKTtcblxuLyogVE9ETyBmaW5kIGEgYmV0dGVyIG1vZHVsZSBmb3IgdGhpcyovXG4vKipcbiAqIEBwYXJhbSB7WGltcG9ydCgnQGVuZG8vZmFyJykuRVJlZjxTdG9yYWdlTm9kZT59IHN0b3JhZ2VOb2RlXG4gKiBAcGFyYW0ge1hpbXBvcnQoJ0BlbmRvL2ZhcicpLkVSZWY8TWFyc2hhbGxlcj59IG1hcnNoYWxsZXJcbiAqIEByZXR1cm5zIHsodmFsdWU6IHVua25vd24pID0+IFByb21pc2U8dm9pZD59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlU2VyaWFsaXplVG9TdG9yYWdlPShzdG9yYWdlTm9kZSxtYXJzaGFsbGVyKT0+e1xucmV0dXJuIGFzeW5jKHZhbHVlKT0+e1xuY29uc3QgbWFyc2hhbGxlZD1hd2FpdCBFKG1hcnNoYWxsZXIpLnRvQ2FwRGF0YSh2YWx1ZSk7XG5jb25zdCBzZXJpYWxpemVkPUpTT04uc3RyaW5naWZ5KG1hcnNoYWxsZWQpO1xucmV0dXJuIEUoc3RvcmFnZU5vZGUpLnNldFZhbHVlKHNlcmlhbGl6ZWQpO1xuIH07XG4gfTskaOKAjV9vbmNlLm1ha2VTZXJpYWxpemVUb1N0b3JhZ2UobWFrZVNlcmlhbGl6ZVRvU3RvcmFnZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaXNTdHJlYW1DZWxsIjpbImlzU3RyZWFtQ2VsbCJdLCJhc3NlcnRDYXBEYXRhIjpbImFzc2VydENhcERhdGEiXSwiYXNzZXJ0UGF0aFNlZ21lbnQiOlsiYXNzZXJ0UGF0aFNlZ21lbnQiXSwicHJlcGFyZUNoYWluU3RvcmFnZU5vZGUiOlsicHJlcGFyZUNoYWluU3RvcmFnZU5vZGUiXSwibWFrZUNoYWluU3RvcmFnZVJvb3QiOlsibWFrZUNoYWluU3RvcmFnZVJvb3QiXSwibWFrZVN0b3JhZ2VOb2RlQ2hpbGQiOlsibWFrZVN0b3JhZ2VOb2RlQ2hpbGQiXSwibWFrZVNlcmlhbGl6ZVRvU3RvcmFnZSI6WyJtYWtlU2VyaWFsaXplVG9TdG9yYWdlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKLuyIDeEAAA3hAAACsAAABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvbWV0aG9kLXRvb2xzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL21hcnNoYWwiXSwiZXhwb3J0cyI6WyJiaW5kQWxsTWV0aG9kcyIsImdldE1ldGhvZE5hbWVzIiwiZ2V0U3RyaW5nTWV0aG9kTmFtZXMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgaXNPYmplY3Q7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiaXNPYmplY3RcIiwgWyRo4oCNX2EgPT4gKGlzT2JqZWN0ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuLyoqXG4gKiBAZmlsZSBtZXRob2QtdG9vbHMgdXNlIGR5bmFtaWMgcHJvcGVydHkgbG9va3VwLCB3aGljaCBpcyBub3QgSmVzc2llLWNvbXBhdGlibGVcbiAqL1xuXG5jb25zdHtnZXRQcm90b3R5cGVPZixjcmVhdGUsZnJvbUVudHJpZXMsZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yc309XG5PYmplY3Q7XG5jb25zdHtvd25LZXlzLGFwcGx5fT1SZWZsZWN0O1xuXG4vKipcbiAqIFByaW9yaXRpemUgc3ltYm9scyBhcyBlYXJsaWVyIHRoYW4gc3RyaW5ncy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xzeW1ib2x9IGFcbiAqIEBwYXJhbSB7c3RyaW5nfHN5bWJvbH0gYlxuICogQHJldHVybnMgey0xIHwgMCB8IDF9XG4gKi9cbmNvbnN0IGNvbXBhcmVTdHJpbmdpZmllZD0oYSxiKT0+e1xuaWYodHlwZW9mIGE9PT10eXBlb2YgYil7XG5jb25zdCBsZWZ0PVN0cmluZyhhKTtcbmNvbnN0IHJpZ2h0PVN0cmluZyhiKTtcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXN0ZWQtdGVybmFyeSovXG5yZXR1cm4gbGVmdDxyaWdodD8tMTpsZWZ0PnJpZ2h0PzE6MDtcbiB9XG5pZih0eXBlb2YgYT09PSdzeW1ib2wnKXtcbmFzc2VydCh0eXBlb2YgYj09PSdzdHJpbmcnKTtcbnJldHVybi0xO1xuIH1cbmFzc2VydCh0eXBlb2YgYT09PSdzdHJpbmcnKTtcbmFzc2VydCh0eXBlb2YgYj09PSdzeW1ib2wnKTtcbnJldHVybiAxO1xuIH07XG5cbi8qKlxuICogVE9ETyBDb25zb2xpZGF0ZSB3aXRoIHRoZSBgZ2V0TWV0aG9kTmFtZXNgIGluIGBAZW5kby9ldmVudHVhbC1zZW5kYFxuICpcbiAqIEB0ZW1wbGF0ZSB7UHJvcGVydHlLZXl9IEtcbiAqIEBwYXJhbSB7UmVjb3JkPEssIGFueT59IHZhbFxuICogQHJldHVybnMge0tbXX1cbiAqL1xuY29uc3QgICAgICAgIGdldE1ldGhvZE5hbWVzPSh2YWwpPT57XG5sZXQgbGF5ZXI9dmFsO1xuY29uc3QgbmFtZXM9bmV3IFNldCgpOy8qIFNldCB0byBkZWR1cGxpY2F0ZSovXG53aGlsZShsYXllciE9PW51bGwmJmxheWVyIT09T2JqZWN0LnByb3RvdHlwZSl7XG4vKiBiZSB0b2xlcmFudCBvZiBub24tb2JqZWN0cyovXG5jb25zdCBkZXNjcz1nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKGxheWVyKTtcbmNvbnN0IG93bk5hbWVzPS8qKiBAdHlwZSB7S1tdfSAqL293bktleXMoZGVzY3MpO1xuZm9yKGNvbnN0IG5hbWUgb2Ygb3duTmFtZXMpe1xuLyogSW4gY2FzZSBhIG1ldGhvZCBpcyBvdmVycmlkZGVuIGJ5IGEgbm9uLW1ldGhvZCwqL1xuLyogdGVzdCBgdmFsW25hbWVdYCByYXRoZXIgdGhhbiBgbGF5ZXJbbmFtZV1gKi9cbmlmKHR5cGVvZiB2YWxbbmFtZV09PT0nZnVuY3Rpb24nKXtcbm5hbWVzLmFkZChuYW1lKTtcbiB9XG4gfVxuaWYoIWlzT2JqZWN0KHZhbCkpe1xuYnJlYWs7XG4gfVxubGF5ZXI9Z2V0UHJvdG90eXBlT2YobGF5ZXIpO1xuIH1cbnJldHVybiBoYXJkZW4oWy4uLm5hbWVzXS5zb3J0KGNvbXBhcmVTdHJpbmdpZmllZCkpO1xuIH07JGjigI1fb25jZS5nZXRNZXRob2ROYW1lcyhnZXRNZXRob2ROYW1lcyk7XG5oYXJkZW4oZ2V0TWV0aG9kTmFtZXMpO1xuXG4vKipcbiAqIFRoZSBzdWJzZXQgb2YgYGdldE1ldGhvZE5hbWVzYCBjb250YWluaW5nIG9ubHkgc3RyaW5nIG5hbWVzLCB3aXRob3V0IHN5bWJvbHNcbiAqXG4gKiBAdGVtcGxhdGUge1Byb3BlcnR5S2V5fSBLXG4gKiBAcGFyYW0ge1JlY29yZDxLLCBhbnk+fSB2YWxcbiAqIEByZXR1cm5zIHtzdHJpbmdbXX1cbiAqL1xuY29uc3QgICAgICAgIGdldFN0cmluZ01ldGhvZE5hbWVzPSh2YWwpPT5cbi8qKiBAdHlwZSB7c3RyaW5nW119ICovXG5nZXRNZXRob2ROYW1lcyh2YWwpLmZpbHRlcigobmFtZSk9PnR5cGVvZiBuYW1lPT09J3N0cmluZycpO1xuXG5cbi8qKlxuICogVE9ETyBUaGlzIGZ1bmN0aW9uIGV4aXN0cyBvbmx5IHRvIGVhc2UgdGhlXG4gKiBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvcHVsbC81OTcwIHRyYW5zaXRpb24sIGZyb20gYWxsIG1ldGhvZHNcbiAqIGJlaW5nIG93biBwcm9wZXJ0aWVzIHRvIG1ldGhvZHMgYmVpbmcgaW5oZXJpdGVkIGZyb20gYSBjb21tb24gcHJvdG90eXBlLlxuICogVGhpcyB0cmFuc2l0aW9uIGJyZWFrcyB0d28gcGF0dGVybnMgdXNlZCBpbiBwcmlvciBjb2RlOiBhdXRvYmluZGluZyxcbiAqIGFuZCBlbnVtZXJhdGluZyBtZXRob2RzIGJ5IGVudW1lcmF0aW5nIG93biBwcm9wZXJ0aWVzLiBGb3IgYm90aCwgdGhlXG4gKiBwcmVmZXJyZWQgcmVwYWlycyBhcmVcbiAqICAgICogYXV0b2JpbmRpbmc6IFJlcGxhY2UsIGZvciBleGFtcGxlLFxuICogICAgICBgZm9vKG9iai5tZXRob2QpYCB3aXRoIGBmb28oYXJnID0+IGBvYmoubWV0aG9kKGFyZykpYC4gSU9XLCBzdG9wIHJlbHlpbmdcbiAqICAgICAgb24gZXhwcmVzc2lvbnMgbGlrZSBgb2JqLm1ldGhvZGAgdG8gZXh0cmFjdCBhIG1ldGhvZCBzdGlsbCBib3VuZCB0byB0aGVcbiAqICAgICAgc3RhdGUgb2YgYG9iamAgYmVjYXVzZSwgZm9yIHZpcnR1YWwgYW5kIGR1cmFibGUgb2JqZWN0cyxcbiAqICAgICAgdGhleSBubyBsb25nZXIgd2lsbCBhZnRlciAjNTk3MC5cbiAqICAgICogbWV0aG9kIGVudW1lcmF0aW9uOiBSZXBsYWNlLCBmb3IgZXhhbXBsZVxuICogICAgICBgUmVmbGVjdC5vd25LZXlzKG9iailgIHdpdGggYGdldE1ldGhvZE5hbWVzKG9iailgLlxuICpcbiAqIE9uY2UgYWxsIHByb2JsZW1hdGljIGNhc2VzIGhhdmUgYmVlbiBjb252ZXJ0ZWQgaW4gdGhpcyBtYW5uZXIsIHRoaXNcbiAqIGBiaW5kQWxsTWV0aG9kc2AgaGFjayBjYW4gYW5kIFRPRE8gc2hvdWxkIGJlIGRlbGV0ZWQuIEhvd2V2ZXIsIHdlIGN1cnJlbnRseVxuICogaGF2ZSBubyByZWxpYWJsZSBzdGF0aWMgd2F5IHRvIHRyYWNrIGRvd24gYW5kIGZpeCBhbGwgYXV0b2JpbmRpbmcgc2l0ZXMuXG4gKiBGb3IgdGhvc2Ugb2JqZWN0cyB0aGF0IGhhdmUgbm90IHlldCBiZWVuIGZ1bGx5IHJlcGFpcmVkIGJ5IHRoZSBhYm92ZSB0d29cbiAqIHRlY2huaXF1ZXMsIGBiaW5kQWxsTWV0aG9kc2AgY3JlYXRlcyBhbiBvYmplY3QgdGhhdCBhY3RzIG11Y2ggbGlrZSB0aGVcbiAqIHByZS0jNTk3MCBvYmplY3RzLCB3aXRoIGFsbCB0aGVpciBtZXRob2RzIGFzIGluc3RhbmNlLWJvdW5kIG93biBwcm9wZXJ0aWVzLlxuICogSXQgZG9lcyB0aGlzIGJ5IG1ha2luZyBhIG5ldyBvYmplY3QgaW5oZXJpdGluZyBmcm9tIGBvYmpgIHdoZXJlIHRoZSBuZXdcbiAqIG9iamVjdCBoYXMgYm91bmQgb3duIG1ldGhvZHMgb3ZlcnJpZGRpbmcgYWxsIHRoZSBtZXRob2RzIGl0IHdvdWxkIGhhdmVcbiAqIGluaGVyaXRlZCBmcm9tIGBvYmpgLlxuICpcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPFByb3BlcnR5S2V5LCBhbnk+fSBUXG4gKiBAcGFyYW0ge1R9IG9ialxuICogQHJldHVybnMge1R9XG4gKi8kaOKAjV9vbmNlLmdldFN0cmluZ01ldGhvZE5hbWVzKGdldFN0cmluZ01ldGhvZE5hbWVzKTtcbmNvbnN0ICAgICAgICBiaW5kQWxsTWV0aG9kcz0ob2JqKT0+XG5oYXJkZW4oXG5jcmVhdGUoXG5vYmosXG5mcm9tRW50cmllcyhcbmdldE1ldGhvZE5hbWVzKG9iaikubWFwKChuYW1lKT0+W1xubmFtZSxcbntcbnZhbHVlOigvKiogQHR5cGUge3Vua25vd25bXX0gKi8uLi5hcmdzKT0+XG5hcHBseShvYmpbbmFtZV0sb2JqLGFyZ3MpLFxuZW51bWVyYWJsZTp0cnVlfV0pKSkpOyRo4oCNX29uY2UuYmluZEFsbE1ldGhvZHMoYmluZEFsbE1ldGhvZHMpO1xuXG5cblxuXG5cbmhhcmRlbihiaW5kQWxsTWV0aG9kcyk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZ2V0TWV0aG9kTmFtZXMiOlsiZ2V0TWV0aG9kTmFtZXMiXSwiZ2V0U3RyaW5nTWV0aG9kTmFtZXMiOlsiZ2V0U3RyaW5nTWV0aG9kTmFtZXMiXSwiYmluZEFsbE1ldGhvZHMiOlsiYmluZEFsbE1ldGhvZHMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAjsAFklkDAABZAwAAKQAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy90eXBlR3VhcmRzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3BhdHRlcm5zIl0sImV4cG9ydHMiOlsiU3RvcmFnZU5vZGVTaGFwZSIsIlVuZ3VhcmRlZEhlbHBlckkiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgTTskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wiTVwiLCBbJGjigI1fYSA9PiAoTSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuY29uc3QgICAgICAgIFN0b3JhZ2VOb2RlU2hhcGU9TS5yZW1vdGFibGUoJ1N0b3JhZ2VOb2RlJyk7XG5cbi8qKiBUbyBiZSB1c2VkIG9ubHkgZm9yICdoZWxwZXInIGZhY2V0cyB3aGVyZSB0aGUgY2FsbHMgYXJlIGZyb20gdHJ1c3RlZCBjb2RlLiAqLyRo4oCNX29uY2UuU3RvcmFnZU5vZGVTaGFwZShTdG9yYWdlTm9kZVNoYXBlKTtcbmNvbnN0ICAgICAgICBVbmd1YXJkZWRIZWxwZXJJPU0uaW50ZXJmYWNlKFxuJ2hlbHBlcicsXG57fSxcbi8qIG5vdCBleHBvc2VkIHNvIHNsb3BweSBva2F5Ki9cbntzbG9wcHk6dHJ1ZX0pOyRo4oCNX29uY2UuVW5ndWFyZGVkSGVscGVySShVbmd1YXJkZWRIZWxwZXJJKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJTdG9yYWdlTm9kZVNoYXBlIjpbIlN0b3JhZ2VOb2RlU2hhcGUiXSwiVW5ndWFyZGVkSGVscGVySSI6WyJVbmd1YXJkZWRIZWxwZXJJIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAN7GoowrBwAAKwcAACoAAABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvdXBncmFkZS1hcGkuanN7ImltcG9ydHMiOlsiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbImlzVXBncmFkZURpc2Nvbm5lY3Rpb24iLCJtYWtlVXBncmFkZURpc2Nvbm5lY3Rpb24iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgaXNPYmplY3Q7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiaXNPYmplY3RcIiwgWyRo4oCNX2EgPT4gKGlzT2JqZWN0ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG4vKipcbiAqIEB0eXBlZGVmIHt7IG5hbWU6IHN0cmluZywgdXBncmFkZU1lc3NhZ2U6IHN0cmluZywgaW5jYXJuYXRpb25OdW1iZXI6IG51bWJlciB9fSBEaXNjb25uZWN0aW9uT2JqZWN0XG4gKi9cblxuLyoqXG4gKiBNYWtlcyBhbiBFcnJvci1saWtlIG9iamVjdCBmb3IgdXNlIGFzIHRoZSByZWplY3Rpb24gdmFsdWUgb2YgcHJvbWlzZXNcbiAqIGFiYW5kb25lZCBieSB1cGdyYWRlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB1cGdyYWRlTWVzc2FnZVxuICogQHBhcmFtIHtudW1iZXJ9IHRvSW5jYXJuYXRpb25OdW1iZXJcbiAqIEByZXR1cm5zIHtEaXNjb25uZWN0aW9uT2JqZWN0fVxuICovXG5jb25zdCAgICAgICAgbWFrZVVwZ3JhZGVEaXNjb25uZWN0aW9uPSh1cGdyYWRlTWVzc2FnZSx0b0luY2FybmF0aW9uTnVtYmVyKT0+XG5oYXJkZW4oe1xubmFtZTondmF0VXBncmFkZWQnLFxudXBncmFkZU1lc3NhZ2UsXG5pbmNhcm5hdGlvbk51bWJlcjp0b0luY2FybmF0aW9uTnVtYmVyfSk7JGjigI1fb25jZS5tYWtlVXBncmFkZURpc2Nvbm5lY3Rpb24obWFrZVVwZ3JhZGVEaXNjb25uZWN0aW9uKTtcblxuaGFyZGVuKG1ha2VVcGdyYWRlRGlzY29ubmVjdGlvbik7XG5cbi8qIFRPRE86IFNpbXBsaWZ5IG9uY2Ugd2UgaGF2ZSBAZW5kby9wYXR0ZXJucyAob3IganVzdCBleHBvcnQgdGhlIHNoYXBlKS4qL1xuLyogY29uc3QgdXBncmFkZURpc2Nvbm5lY3Rpb25TaGFwZSA9IGhhcmRlbih7Ki9cbi8qIG5hbWU6ICd2YXRVcGdyYWRlZCcsKi9cbi8qIHVwZ3JhZGVNZXNzYWdlOiBNLnN0cmluZygpLCovXG4vKiBpbmNhcm5hdGlvbk51bWJlcjogTS5udW1iZXIoKSwqL1xuLyogfSk7Ki9cbi8qIGNvbnN0IGlzVXBncmFkZURpc2Nvbm5lY3Rpb24gPSBlcnIgPT4gbWF0Y2hlcyhlcnIsIHVwZ3JhZGVEaXNjb25uZWN0aW9uU2hhcGUpOyovXG4vKipcbiAqIEBwYXJhbSB7YW55fSBlcnJcbiAqIEByZXR1cm5zIHtlcnIgaXMgRGlzY29ubmVjdGlvbk9iamVjdH1cbiAqL1xuY29uc3QgICAgICAgIGlzVXBncmFkZURpc2Nvbm5lY3Rpb249KGVycik9PlxuaXNPYmplY3QoZXJyKSYmXG5lcnIubmFtZT09PSd2YXRVcGdyYWRlZCcmJlxudHlwZW9mIGVyci51cGdyYWRlTWVzc2FnZT09PSdzdHJpbmcnJiZcbnR5cGVvZiBlcnIuaW5jYXJuYXRpb25OdW1iZXI9PT0nbnVtYmVyJzskaOKAjV9vbmNlLmlzVXBncmFkZURpc2Nvbm5lY3Rpb24oaXNVcGdyYWRlRGlzY29ubmVjdGlvbik7XG5oYXJkZW4oaXNVcGdyYWRlRGlzY29ubmVjdGlvbik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVVwZ3JhZGVEaXNjb25uZWN0aW9uIjpbIm1ha2VVcGdyYWRlRGlzY29ubmVjdGlvbiJdLCJpc1VwZ3JhZGVEaXNjb25uZWN0aW9uIjpbImlzVXBncmFkZURpc2Nvbm5lY3Rpb24iXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAoumxkuM8AADjPAAAJAAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy91dGlscy5qc3siaW1wb3J0cyI6WyJAZW5kby9mYXIiLCJAZW5kby9tYXJzaGFsIiwiQGVuZG8vcHJvbWlzZS1raXQiLCJAZW5kby9zdHJlYW0iLCJqZXNzaWUuanMiXSwiZXhwb3J0cyI6WyJCQVNJU19QT0lOVFMiLCJQcm9taXNlQWxsT3JFcnJvcnMiLCJhZ2dyZWdhdGVUcnlGaW5hbGx5IiwiYWxsVmFsdWVzIiwiYXBwbHlMYWJlbGluZ0Vycm9yIiwiYXNzZXJ0QWxsRGVmaW5lZCIsImRlZXBseUZ1bGZpbGxlZE9iamVjdCIsImZvcmV2ZXIiLCJmcm9tVW5pcXVlRW50cmllcyIsImxpc3REaWZmZXJlbmNlIiwibWFrZUFnZ3JlZ2F0ZUVycm9yIiwibWFrZU1lYXN1cmVTZWNvbmRzIiwib2JqZWN0TWFwIiwic3luY2hyb25pemVkVGVlIiwidGhyb3dMYWJlbGVkIiwidW50aWxUcnVlIiwid2hpbGVUcnVlIiwiemlwIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEUsZGVlcGx5RnVsZmlsbGVkLGlzT2JqZWN0LGlzUHJvbWlzZSxtYWtlUHJvbWlzZUtpdCxtYWtlUXVldWUsYXN5bmNHZW5lcmF0ZSxtYWtlU2V0OyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2ZhclwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJkZWVwbHlGdWxmaWxsZWRcIiwgWyRo4oCNX2EgPT4gKGRlZXBseUZ1bGZpbGxlZCA9ICRo4oCNX2EpXV0sW1wiaXNPYmplY3RcIiwgWyRo4oCNX2EgPT4gKGlzT2JqZWN0ID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJpc1Byb21pc2VcIiwgWyRo4oCNX2EgPT4gKGlzUHJvbWlzZSA9ICRo4oCNX2EpXV0sW1wibWFrZVByb21pc2VLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VQcm9taXNlS2l0ID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL3N0cmVhbVwiLCBbW1wibWFrZVF1ZXVlXCIsIFskaOKAjV9hID0+IChtYWtlUXVldWUgPSAkaOKAjV9hKV1dXV0sW1wiamVzc2llLmpzXCIsIFtbXCJhc3luY0dlbmVyYXRlXCIsIFskaOKAjV9hID0+IChhc3luY0dlbmVyYXRlID0gJGjigI1fYSldXSxbXCJtYWtlU2V0XCIsIFskaOKAjV9hID0+IChtYWtlU2V0ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuY29uc3R7ZW50cmllcyxmcm9tRW50cmllcyxrZXlzLHZhbHVlc309T2JqZWN0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcblxuY29uc3R7ZGV0YWlsczpYLHF1b3RlOnEsRmFpbH09YXNzZXJ0O1xuXG5jb25zdCAgICAgICAgQkFTSVNfUE9JTlRTPTEwXzAwMG47XG5cbi8qKiBAdGVtcGxhdGUgVCBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vZXZlbnR1YWwtc2VuZCcpLkVSZWY8VD59IEVSZWY8VD4gKi9cblxuLyoqXG4gKiBUaHJvd3MgaWYgbXVsdGlwbGUgZW50cmllcyB1c2UgdGhlIHNhbWUgcHJvcGVydHkgbmFtZS4gT3RoZXJ3aXNlIGFjdHNcbiAqIGxpa2UgYE9iamVjdC5mcm9tRW50cmllc2AgYnV0IGhhcmRlbnMgdGhlIHJlc3VsdC5cbiAqIFVzZSBpdCB0byBwcm90ZWN0IGZyb20gcHJvcGVydHkgbmFtZXMgY29tcHV0ZWQgZnJvbSB1c2VyLXByb3ZpZGVkIGRhdGEuXG4gKlxuICogQHRlbXBsYXRlIEssVlxuICogQHBhcmFtIHtJdGVyYWJsZTxbSyxWXT59IGFsbEVudHJpZXNcbiAqIEByZXR1cm5zIHt7W2s6IEtdOiBWfX1cbiAqLyRo4oCNX29uY2UuQkFTSVNfUE9JTlRTKEJBU0lTX1BPSU5UUyk7XG5jb25zdCAgICAgICAgZnJvbVVuaXF1ZUVudHJpZXM9KGFsbEVudHJpZXMpPT57XG5jb25zdCBlbnRyaWVzQXJyYXk9Wy4uLmFsbEVudHJpZXNdO1xuY29uc3QgcmVzdWx0PWhhcmRlbihmcm9tRW50cmllcyhlbnRyaWVzQXJyYXkpKTtcbmlmKG93bktleXMocmVzdWx0KS5sZW5ndGg9PT1lbnRyaWVzQXJyYXkubGVuZ3RoKXtcbnJldHVybiByZXN1bHQ7XG4gfVxuY29uc3QgbmFtZXM9bWFrZVNldCgpO1xuZm9yKGNvbnN0W25hbWUsX11vZiBlbnRyaWVzQXJyYXkpe1xuaWYobmFtZXMuaGFzKG5hbWUpKXtcbkZhaWwgYGNvbGxpc2lvbiBvbiBwcm9wZXJ0eSBuYW1lICR7cShuYW1lKX06ICR7ZW50cmllc0FycmF5fWA7XG4gfVxubmFtZXMuYWRkKG5hbWUpO1xuIH1cbnRocm93IEZhaWwgYGludGVybmFsOiBmYWlsZWQgdG8gY3JlYXRlIG9iamVjdCBmcm9tIHVuaXF1ZSBlbnRyaWVzYDtcbiB9OyRo4oCNX29uY2UuZnJvbVVuaXF1ZUVudHJpZXMoZnJvbVVuaXF1ZUVudHJpZXMpO1xuaGFyZGVuKGZyb21VbmlxdWVFbnRyaWVzKTtcblxuLyoqXG4gKiBCeSBhbmFsb2d5IHdpdGggaG93IGBBcnJheS5wcm90b3R5cGUubWFwYCB3aWxsIG1hcCB0aGUgZWxlbWVudHMgb2ZcbiAqIGFuIGFycmF5IHRvIHRyYW5zZm9ybWVkIGVsZW1lbnRzIG9mIGFuIGFycmF5IG9mIHRoZSBzYW1lIHNoYXBlLFxuICogYG9iamVjdE1hcGAgd2lsbCBkbyBsaWtld2lzZSBmb3IgdGhlIHN0cmluZy1uYW1lZCBvd24gZW51bWVyYWJsZVxuICogcHJvcGVydGllcyBvZiBhbiBvYmplY3QuXG4gKlxuICogVHlwaWNhbCB1c2FnZSBhcHBsaWVzIGBvYmplY3RNYXBgIHRvIGEgQ29weVJlY29yZCwgaS5lLixcbiAqIGFuIG9iamVjdCBmb3Igd2hpY2ggYHBhc3NTdHlsZU9mKG9yaWdpbmFsKSA9PT0gJ2NvcHlSZWNvcmQnYC4gRm9yIHRoZXNlLFxuICogbm9uZSBvZiB0aGUgZm9sbG93aW5nIGVkZ2UgY2FzZXMgYXJpc2UuIFRoZSByZXN1bHQgd2lsbCBiZSBhIENvcHlSZWNvcmRcbiAqIHdpdGggZXhhY3RseSB0aGUgc2FtZSBwcm9wZXJ0eSBuYW1lcywgd2hvc2UgdmFsdWVzIGFyZSB0aGUgbWFwcGVkIGZvcm0gb2ZcbiAqIHRoZSBvcmlnaW5hbCdzIHZhbHVlcy5cbiAqXG4gKiBXaGVuIHRoZSBvcmlnaW5hbCBpcyBub3QgYSBDb3B5UmVjb3JkLCBzb21lIGVkZ2UgY2FzZXMgdG8gYmUgYXdhcmUgb2ZcbiAqICAgICogTm8gbWF0dGVyIGhvdyBtdXRhYmxlIHRoZSBvcmlnaW5hbCBvYmplY3QsIHRoZSByZXR1cm5lZCBvYmplY3QgaXNcbiAqICAgICAgaGFyZGVuZWQuXG4gKiAgICAqIE9ubHkgdGhlIHN0cmluZy1uYW1lZCBlbnVtZXJhYmxlIG93biBwcm9wZXJ0aWVzIG9mIHRoZSBvcmlnaW5hbFxuICogICAgICBhcmUgbWFwcGVkLiBBbGwgb3RoZXIgcHJvcGVydGllcyBhcmUgaWdub3JlZC5cbiAqICAgICogSWYgYW55IG9mIHRoZSBvcmlnaW5hbCBwcm9wZXJ0aWVzIHdlcmUgYWNjZXNzb3JzLCBgT2JqZWN0LmVudHJpZXNgXG4gKiAgICAgIHdpbGwgY2F1c2UgaXRzIGBnZXR0ZXJgIHRvIGJlIGNhbGxlZCBhbmQgd2lsbCB1c2UgdGhlIHJlc3VsdGluZ1xuICogICAgICB2YWx1ZS5cbiAqICAgICogTm8gbWF0dGVyIHdoZXRoZXIgdGhlIG9yaWdpbmFsIHByb3BlcnR5IHdhcyBhbiBhY2Nlc3Nvciwgd3JpdGFibGUsXG4gKiAgICAgIG9yIGNvbmZpZ3VyYWJsZSwgYWxsIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSByZXR1cm5lZCBvYmplY3Qgd2lsbCBiZVxuICogICAgICBub24td3JpdGFibGUsIG5vbi1jb25maWd1cmFibGUsIGRhdGEgcHJvcGVydGllcy5cbiAqICAgICogTm8gbWF0dGVyIHdoYXQgdGhlIG9yaWdpbmFsIG9iamVjdCBtYXkgaGF2ZSBpbmhlcml0ZWQgZnJvbSwgYW5kXG4gKiAgICAgIG5vIG1hdHRlciB3aGV0aGVyIGl0IHdhcyBhIHNwZWNpYWwga2luZCBvZiBvYmplY3Qgc3VjaCBhcyBhbiBhcnJheSxcbiAqICAgICAgdGhlIHJldHVybmVkIG9iamVjdCB3aWxsIGFsd2F5cyBiZSBhIHBsYWluIG9iamVjdCBpbmhlcml0aW5nIGRpcmVjdGx5XG4gKiAgICAgIGZyb20gYE9iamVjdC5wcm90b3R5cGVgIGFuZCB3aG9zZSBzdGF0ZSBpcyBvbmx5IHRoZXNlIG5ldyBtYXBwZWRcbiAqICAgICAgb3duIHByb3BlcnRpZXMuXG4gKlxuICogV2l0aCB0aGVzZSBkaWZmZXJlbmNlcywgZXZlbiBpZiB0aGUgb3JpZ2luYWwgb2JqZWN0IHdhcyBub3QgYSBDb3B5UmVjb3JkLFxuICogaWYgYWxsIHRoZSBtYXBwZWQgdmFsdWVzIGFyZSBQYXNzYWJsZSwgdGhlbiB0aGUgcmV0dXJuZWQgb2JqZWN0IHdpbGwgYmVcbiAqIGEgQ29weVJlY29yZC5cbiAqXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcsIGFueT59IE9cbiAqIEBwYXJhbSB7T30gb3JpZ2luYWxcbiAqIEB0ZW1wbGF0ZSBSIG1hcCByZXN1bHRcbiAqIEBwYXJhbSB7KHZhbHVlOiBPW2tleW9mIE9dLCBrZXk6IGtleW9mIE8pID0+IFJ9IG1hcEZuXG4gKiBAcmV0dXJucyB7eyBbUCBpbiBrZXlvZiBPXTogUn19XG4gKi9cbmNvbnN0ICAgICAgICBvYmplY3RNYXA9KG9yaWdpbmFsLG1hcEZuKT0+e1xuY29uc3QgZW50cz1lbnRyaWVzKG9yaWdpbmFsKTtcbmNvbnN0IG1hcEVudHM9ZW50cy5tYXAoKFtrLHZdKT0+W2ssbWFwRm4odixrKV0pO1xucmV0dXJuIGhhcmRlbihmcm9tRW50cmllcyhtYXBFbnRzKSk7XG4gfTskaOKAjV9vbmNlLm9iamVjdE1hcChvYmplY3RNYXApO1xuaGFyZGVuKG9iamVjdE1hcCk7XG5cbi8qKlxuICogQHBhcmFtIHtBcnJheTxzdHJpbmcgfCBzeW1ib2w+fSBsZWZ0TmFtZXNcbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nIHwgc3ltYm9sPn0gcmlnaHROYW1lc1xuICovXG5jb25zdCAgICAgICAgbGlzdERpZmZlcmVuY2U9KGxlZnROYW1lcyxyaWdodE5hbWVzKT0+e1xuY29uc3QgcmlnaHRTZXQ9bWFrZVNldChyaWdodE5hbWVzKTtcbnJldHVybiBsZWZ0TmFtZXMuZmlsdGVyKChuYW1lKT0+IXJpZ2h0U2V0LmhhcyhuYW1lKSk7XG4gfTskaOKAjV9vbmNlLmxpc3REaWZmZXJlbmNlKGxpc3REaWZmZXJlbmNlKTtcbmhhcmRlbihsaXN0RGlmZmVyZW5jZSk7XG5cbi8qKlxuICogQHBhcmFtIHtFcnJvcn0gaW5uZXJFcnJcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gbGFiZWxcbiAqIEBwYXJhbSB7RXJyb3JDb25zdHJ1Y3Rvcn0gW0Vycm9yQ29uc3RydWN0b3JdXG4gKiBAcmV0dXJucyB7bmV2ZXJ9XG4gKi9cbmNvbnN0ICAgICAgICB0aHJvd0xhYmVsZWQ9KGlubmVyRXJyLGxhYmVsLEVycm9yQ29uc3RydWN0b3I9dW5kZWZpbmVkKT0+e1xuaWYodHlwZW9mIGxhYmVsPT09J251bWJlcicpe1xubGFiZWw9IGBbJHtsYWJlbH1dYDtcbiB9XG5jb25zdCBvdXRlckVycj1hc3NlcnQuZXJyb3IoXG4gYCR7bGFiZWx9OiAke2lubmVyRXJyLm1lc3NhZ2V9YCxcbkVycm9yQ29uc3RydWN0b3IpO1xuXG5hc3NlcnQubm90ZShvdXRlckVycixYIGBDYXVzZWQgYnkgJHtpbm5lckVycn1gKTtcbnRocm93IG91dGVyRXJyO1xuIH07JGjigI1fb25jZS50aHJvd0xhYmVsZWQodGhyb3dMYWJlbGVkKTtcbmhhcmRlbih0aHJvd0xhYmVsZWQpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBBLFJcbiAqIEBwYXJhbSB7KC4uLmFyZ3M6IEFbXSkgPT4gUn0gZnVuY1xuICogQHBhcmFtIHtBW119IGFyZ3NcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gW2xhYmVsXVxuICogQHJldHVybnMge1J9XG4gKi9cbmNvbnN0ICAgICAgICBhcHBseUxhYmVsaW5nRXJyb3I9KGZ1bmMsYXJncyxsYWJlbD11bmRlZmluZWQpPT57XG5pZihsYWJlbD09PXVuZGVmaW5lZCl7XG5yZXR1cm4gZnVuYyguLi5hcmdzKTtcbiB9XG5sZXQgcmVzdWx0O1xudHJ5e1xucmVzdWx0PWZ1bmMoLi4uYXJncyk7XG4gfWNhdGNoKGVycil7XG50aHJvd0xhYmVsZWQoZXJyLGxhYmVsKTtcbiB9XG5pZihpc1Byb21pc2UocmVzdWx0KSl7XG4vKiBJZiByZXN1bHQgaXMgYSByZWplY3RlZCBwcm9taXNlLCB0aGlzIHdpbGwgcmV0dXJuIGEgcHJvbWlzZSB3aXRoIGEqL1xuLyogZGlmZmVyZW50IHJlamVjdGlvbiByZWFzb24uIEJ1dCB0aGlzIGNvbmZ1c2VzIFR5cGVTY3JpcHQgYmVjYXVzZSBpdCB0eXBlcyovXG4vKiB0aGF0IGNhc2UgYXMgYFByb21pc2U8bmV2ZXI+YCB3aGljaCBpcyBjb29sIGZvciBhIHByb21pc2UgdGhhdCB3aWxsIG5ldmVyKi9cbi8qIGZ1bGZpbGwuICBCdXQgVHlwZVNjcmlwdCBkb2Vzbid0IHVuZGVyc3RhbmQgdGhhdCB0aGlzIHdpbGwgb25seSBoYXBwZW4qL1xuLyogd2hlbiBgcmVzdWx0YCB3YXMgYSByZWplY3RlZCBwcm9taXNlLiBJbiBvbmx5IHRoaXMgY2FzZSBgUmAgc2hvdWxkKi9cbi8qIGFscmVhZHkgYWxsb3cgYFByb21pc2U8bmV2ZXI+YCBhcyBhIHN1YnR5cGUuKi9cbi8qKiBAdHlwZSB7dW5rbm93bn0gKi9cbmNvbnN0IHJlbGFiZWxlZD1FLndoZW4ocmVzdWx0LHVuZGVmaW5lZCwocmVhc29uKT0+XG50aHJvd0xhYmVsZWQocmVhc29uLGxhYmVsKSk7XG5cbnJldHVybiAoLyoqIEB0eXBlIHtSfSAqL3JlbGFiZWxlZCk7XG4gfWVsc2V7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbiB9OyRo4oCNX29uY2UuYXBwbHlMYWJlbGluZ0Vycm9yKGFwcGx5TGFiZWxpbmdFcnJvcik7XG5oYXJkZW4oYXBwbHlMYWJlbGluZ0Vycm9yKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge3tbS2V5VHlwZSBpbiBrZXlvZiBUXTogVFtLZXlUeXBlXX0gJiB7fX0gU2ltcGxpZnlcbiAqIGZsYXR0ZW4gdGhlIHR5cGUgb3V0cHV0IHRvIGltcHJvdmUgdHlwZSBoaW50cyBzaG93biBpbiBlZGl0b3JzXG4gKiBodHRwczovL2dpdGh1Yi5jb20vc2luZHJlc29yaHVzL3R5cGUtZmVzdC9ibG9iL21haW4vc291cmNlL3NpbXBsaWZ5LmQudHNcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsoLi4uYXJnczogYW55W10pID0+IGFueX0gQ2FsbGFibGVcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7e319IFRcbiAqIEB0eXBlZGVmIHt7IFtLIGluIGtleW9mIFRdOiBUW0tdIGV4dGVuZHMgQ2FsbGFibGUgPyBUW0tdIDogRGVlcGx5QXdhaXRlZDxUW0tdPiB9fSBEZWVwbHlBd2FpdGVkT2JqZWN0XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge1QgZXh0ZW5kcyBQcm9taXNlTGlrZTxhbnk+ID8gQXdhaXRlZDxUPiA6IFQgZXh0ZW5kcyB7fSA/IFNpbXBsaWZ5PERlZXBseUF3YWl0ZWRPYmplY3Q8VD4+IDogQXdhaXRlZDxUPn0gRGVlcGx5QXdhaXRlZFxuICovXG5cbi8qKlxuICogQSBtb3JlIGNvbnN0cmFpbmVkIHZlcnNpb24gb2Yge2RlZXBseUZ1bGZpbGxlZH0gZm9yIHR5cGUgc2FmZXR5IHVudGlsXG4gKiBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vaXNzdWVzLzEyNTdcbiAqIFVzZWZ1bCBpbiBzdGFydGluZyBjb250cmFjdHMgdGhhdCBuZWVkIGFsbCB0ZXJtcyB0byBiZSBmdWxmaWxsZWRcbiAqIGluIG9yZGVyIHRvIGJlIGR1cmFibGUuXG4gKlxuICogQHR5cGUgezxUIGV4dGVuZHMge30+KHVuZnVsZmlsbGVkVGVybXM6IFQpID0+IFByb21pc2U8RGVlcGx5QXdhaXRlZDxUPj59XG4gKi9cbmNvbnN0ICAgICAgICBkZWVwbHlGdWxmaWxsZWRPYmplY3Q9YXN5bmMob2JqKT0+e1xuaXNPYmplY3Qob2JqKXx8RmFpbCBgcGFyYW0gbXVzdCBiZSBhbiBvYmplY3RgO1xucmV0dXJuIGRlZXBseUZ1bGZpbGxlZChvYmopO1xuIH07XG5cbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgdXNlcyBhIG1pbGxpc2Vjb25kLWJhc2VkIHRpbWUtc2luY2UtZXBvY2ggY2FwYWJpbGl0eVxuICogKHN1Y2ggYXMgYHBlcmZvcm1hbmNlLm5vd2ApIHRvIG1lYXN1cmUgZXhlY3V0aW9uIHRpbWUgb2YgYW4gYXN5bmMgZnVuY3Rpb25cbiAqIGFuZCByZXBvcnQgdGhlIHJlc3VsdCBpbiBzZWNvbmRzIHRvIG1hdGNoIG91ciB0ZWxlbWV0cnkgc3RhbmRhcmQuXG4gKlxuICogQHBhcmFtIHt0eXBlb2YgWGltcG9ydCgncGVyZl9ob29rcycpLnBlcmZvcm1hbmNlLm5vd30gY3VycmVudFRpbWVNaWxsaXNlY1xuICogQHJldHVybnMgezxUPihmbjogKCkgPT4gUHJvbWlzZTxUPikgPT4gUHJvbWlzZTx7IHJlc3VsdDogVCwgZHVyYXRpb246IG51bWJlciB9Pn1cbiAqLyRo4oCNX29uY2UuZGVlcGx5RnVsZmlsbGVkT2JqZWN0KGRlZXBseUZ1bGZpbGxlZE9iamVjdCk7XG5jb25zdCAgICAgICAgbWFrZU1lYXN1cmVTZWNvbmRzPShjdXJyZW50VGltZU1pbGxpc2VjKT0+e1xuLyoqIEBwYXJhbSB7KCkgPT4gYW55fSBmbiAqL1xuY29uc3QgbWVhc3VyZVNlY29uZHM9YXN5bmMoZm4pPT57XG5jb25zdCB0MD1jdXJyZW50VGltZU1pbGxpc2VjKCk7XG5jb25zdCByZXN1bHQ9YXdhaXQgZm4oKTtcbmNvbnN0IGR1cmF0aW9uTWlsbGlzZWM9Y3VycmVudFRpbWVNaWxsaXNlYygpLXQwO1xucmV0dXJue3Jlc3VsdCxkdXJhdGlvbjpkdXJhdGlvbk1pbGxpc2VjLzEwMDB9O1xuIH07XG5yZXR1cm4gbWVhc3VyZVNlY29uZHM7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge0Vycm9yW119IGVycm9yc1xuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXVxuICovJGjigI1fb25jZS5tYWtlTWVhc3VyZVNlY29uZHMobWFrZU1lYXN1cmVTZWNvbmRzKTtcbmNvbnN0ICAgICAgICBtYWtlQWdncmVnYXRlRXJyb3I9KGVycm9ycyxtZXNzYWdlKT0+e1xuY29uc3QgZXJyPUVycm9yKG1lc3NhZ2UpO1xuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZXJyLHtcbm5hbWU6e1xudmFsdWU6J0FnZ3JlZ2F0ZUVycm9yJ30sXG5cbmVycm9yczp7XG52YWx1ZTplcnJvcnN9fSk7XG5cblxucmV0dXJuIGVycjtcbiB9O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge3JlYWRvbmx5IChUIHwgUHJvbWlzZUxpa2U8VD4pW119IGl0ZW1zXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxUW10+fVxuICovJGjigI1fb25jZS5tYWtlQWdncmVnYXRlRXJyb3IobWFrZUFnZ3JlZ2F0ZUVycm9yKTtcbmNvbnN0ICAgICAgICBQcm9taXNlQWxsT3JFcnJvcnM9YXN5bmMoaXRlbXMpPT57XG5yZXR1cm4gUHJvbWlzZS5hbGxTZXR0bGVkKGl0ZW1zKS50aGVuKChyZXN1bHRzKT0+e1xuY29uc3QgZXJyb3JzPS8qKiBAdHlwZSB7UHJvbWlzZVJlamVjdGVkUmVzdWx0W119ICovXG5yZXN1bHRzLmZpbHRlcigoe3N0YXR1c30pPT5zdGF0dXM9PT0ncmVqZWN0ZWQnKS5cbm1hcCgocmVzdWx0KT0+cmVzdWx0LnJlYXNvbik7XG5pZighZXJyb3JzLmxlbmd0aCl7XG5yZXR1cm4gKC8qKiBAdHlwZSB7UHJvbWlzZUZ1bGZpbGxlZFJlc3VsdDxUPltdfSAqL3Jlc3VsdHMubWFwKFxuKHJlc3VsdCk9PnJlc3VsdC52YWx1ZSkpO1xuXG4gfWVsc2UgaWYoZXJyb3JzLmxlbmd0aD09PTEpe1xudGhyb3cgZXJyb3JzWzBdO1xuIH1lbHNle1xudGhyb3cgbWFrZUFnZ3JlZ2F0ZUVycm9yKGVycm9ycyk7XG4gfVxuIH0pO1xuIH07XG5cbi8qKlxuICogQHR5cGUgezxUPihcbiAqICAgdHJpZXI6ICgpID0+IFByb21pc2U8VD4sXG4gKiAgZmluYWxpemVyOiAoZXJyb3I/OiB1bmtub3duKSA9PiBQcm9taXNlPHZvaWQ+LFxuICogKSA9PiBQcm9taXNlPFQ+fVxuICovJGjigI1fb25jZS5Qcm9taXNlQWxsT3JFcnJvcnMoUHJvbWlzZUFsbE9yRXJyb3JzKTtjb25zdCBhZ2dyZWdhdGVUcnlGaW5hbGx5PWFzeW5jKHRyaWVyLGZpbmFsaXplcik9PlxudHJpZXIoKS50aGVuKFxuYXN5bmMocmVzdWx0KT0+ZmluYWxpemVyKCkudGhlbigoKT0+cmVzdWx0KSxcbmFzeW5jKHRyeUVycm9yKT0+XG5maW5hbGl6ZXIodHJ5RXJyb3IpLlxudGhlbihcbigpPT50cnlFcnJvcixcbihmaW5hbGl6ZUVycm9yKT0+bWFrZUFnZ3JlZ2F0ZUVycm9yKFt0cnlFcnJvcixmaW5hbGl6ZUVycm9yXSkpLlxuXG50aGVuKChlcnJvcik9PlByb21pc2UucmVqZWN0KGVycm9yKSkpO1xuXG5cbi8qKlxuICogQHRlbXBsYXRlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gVFxuICogQHR5cGVkZWYge3tbUCBpbiBrZXlvZiBUXTogRXhjbHVkZTxUW1BdLCB1bmRlZmluZWQ+O319IEFsbERlZmluZWRcbiAqL1xuXG4vKipcbiAqIENvbmNpc2Ugd2F5IHRvIGNoZWNrIHZhbHVlcyBhcmUgYXZhaWxhYmxlIGZyb20gb2JqZWN0IGxpdGVyYWwgc2hvcnRoYW5kLlxuICogVGhyb3dzIGVycm9yIG1lc3NhZ2UgdG8gc3BlY2lmeSB0aGUgbWlzc2luZyB2YWx1ZXMuXG4gKlxuICogQHRlbXBsYXRlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gVFxuICogQHBhcmFtIHtUfSBvYmpcbiAqIEB0aHJvd3MgaWYgYW55IHZhbHVlIGluIHRoZSBvYmplY3QgZW50cmllcyBpcyBub3QgZGVmaW5lZFxuICogQHJldHVybnMge2Fzc2VydHMgb2JqIGlzIEFsbERlZmluZWQ8VD59XG4gKi8kaOKAjV9vbmNlLmFnZ3JlZ2F0ZVRyeUZpbmFsbHkoYWdncmVnYXRlVHJ5RmluYWxseSk7XG5cbmNvbnN0ICAgICAgICBhc3NlcnRBbGxEZWZpbmVkPShvYmopPT57XG5jb25zdCBtaXNzaW5nPVtdO1xuZm9yKGNvbnN0W2tleSx2YWxdb2YgT2JqZWN0LmVudHJpZXMob2JqKSl7XG5pZih2YWw9PT11bmRlZmluZWQpe1xubWlzc2luZy5wdXNoKGtleSk7XG4gfVxuIH1cbmlmKG1pc3NpbmcubGVuZ3RoPjApe1xuRmFpbCBgbWlzc2luZyAke3EobWlzc2luZyl9YDtcbiB9XG4gfTtcblxuLyoqIEB0eXBlIHtJdGVyYXRvclJlc3VsdDx1bmRlZmluZWQsIG5ldmVyPn0gKi8kaOKAjV9vbmNlLmFzc2VydEFsbERlZmluZWQoYXNzZXJ0QWxsRGVmaW5lZCk7XG5jb25zdCBub3REb25lPWhhcmRlbih7ZG9uZTpmYWxzZSx2YWx1ZTp1bmRlZmluZWR9KTtcblxuLyoqIEB0eXBlIHtJdGVyYXRvclJlc3VsdDxuZXZlciwgdm9pZD59ICovXG5jb25zdCBhbHdheXNEb25lPWhhcmRlbih7ZG9uZTp0cnVlLHZhbHVlOnVuZGVmaW5lZH0pO1xuXG5jb25zdCAgICAgICAgZm9yZXZlcj1hc3luY0dlbmVyYXRlKCgpPT5ub3REb25lKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHsoKSA9PiBUfSBwcm9kdWNlXG4gKiBUaGUgdmFsdWUgb2YgYGF3YWl0IHByb2R1Y2UoKWAgaXMgdXNlZCBmb3IgaXRzIHRydXRoaW5lc3MgdnMgZmFsc2luZXNzLlxuICogSU9XLCBpdCBpcyBjb2VyY2VkIHRvIGEgYm9vbGVhbiBzbyB0aGUgY2FsbGVyIG5lZWQgbm90IGJvdGhlciBkb2luZyB0aGlzXG4gKiB0aGVtc2VsdmVzLlxuICogQHJldHVybnMge0FzeW5jSXRlcmFibGU8QXdhaXRlZDxUPj59XG4gKi8kaOKAjV9vbmNlLmZvcmV2ZXIoZm9yZXZlcik7XG5jb25zdCAgICAgICAgd2hpbGVUcnVlPShwcm9kdWNlKT0+XG5hc3luY0dlbmVyYXRlKGFzeW5jKCk9PntcbmNvbnN0IHZhbHVlPWF3YWl0IHByb2R1Y2UoKTtcbmlmKCF2YWx1ZSl7XG5yZXR1cm4gYWx3YXlzRG9uZTtcbiB9XG5yZXR1cm4gaGFyZGVuKHtcbmRvbmU6ZmFsc2UsXG52YWx1ZX0pO1xuXG4gfSk7XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7KCkgPT4gVH0gcHJvZHVjZVxuICogVGhlIHZhbHVlIG9mIGBhd2FpdCBwcm9kdWNlKClgIGlzIHVzZWQgZm9yIGl0cyB0cnV0aGluZXNzIHZzIGZhbHNpbmVzcy5cbiAqIElPVywgaXQgaXMgY29lcmNlZCB0byBhIGJvb2xlYW4gc28gdGhlIGNhbGxlciBuZWVkIG5vdCBib3RoZXIgZG9pbmcgdGhpc1xuICogdGhlbXNlbHZlcy5cbiAqIEByZXR1cm5zIHtBc3luY0l0ZXJhYmxlPEF3YWl0ZWQ8VD4+fVxuICovJGjigI1fb25jZS53aGlsZVRydWUod2hpbGVUcnVlKTtcbmNvbnN0ICAgICAgICB1bnRpbFRydWU9KHByb2R1Y2UpPT5cbmFzeW5jR2VuZXJhdGUoYXN5bmMoKT0+e1xuY29uc3QgdmFsdWU9YXdhaXQgcHJvZHVjZSgpO1xuaWYodmFsdWUpe1xucmV0dXJuIGhhcmRlbih7XG5kb25lOnRydWUsXG52YWx1ZX0pO1xuXG4gfVxucmV0dXJuIGhhcmRlbih7XG5kb25lOmZhbHNlLFxudmFsdWV9KTtcblxuIH0pO1xuXG4vKiogQHR5cGUgeyA8WCwgWT4oeHM6IFhbXSwgeXM6IFlbXSkgPT4gW1gsIFldW119ICovJGjigI1fb25jZS51bnRpbFRydWUodW50aWxUcnVlKTtcbmNvbnN0ICAgICAgICB6aXA9KHhzLHlzKT0+aGFyZGVuKHhzLm1hcCgoeCxpKT0+W3gseXNbK2ldXSkpO1xuXG4vKiogQHR5cGUgeyA8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIEVSZWY8YW55Pj4+KG9iajogVCkgPT4gUHJvbWlzZTx7IFtLIGluIGtleW9mIFRdOiBBd2FpdGVkPFRbS10+fT4gfSAqLyRo4oCNX29uY2UuemlwKHppcCk7XG5jb25zdCAgICAgICAgYWxsVmFsdWVzPWFzeW5jKG9iaik9PntcbmNvbnN0IHJlc29sdmVkPWF3YWl0IFByb21pc2UuYWxsKHZhbHVlcyhvYmopKTtcbi8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCovXG5yZXR1cm4gaGFyZGVuKGZyb21FbnRyaWVzKHppcChrZXlzKG9iaikscmVzb2x2ZWQpKSk7XG4gfTtcblxuLyoqXG4gKiBBIHRlZSBpbXBsZW1lbnRhdGlvbiB3aGVyZSBhbGwgcmVhZGVycyBhcmUgc3luY2hyb25pemVkIHdpdGggZWFjaCBvdGhlci5cbiAqIFRoZXkgYWxsIGNvbnN1bWUgdGhlIHNvdXJjZSBzdHJlYW0gaW4gbG9ja3N0ZXAsIGFuZCBhbnkgb25lIHJldHVybmluZyBvclxuICogdGhyb3dpbmcgZWFybHkgd2lsbCBhZmZlY3QgdGhlIG90aGVycy5cbiAqXG4gKiBAdGVtcGxhdGUgW1Q9dW5rbm93bl1cbiAqIEBwYXJhbSB7QXN5bmNJdGVyYXRvcjxULCB2b2lkLCB2b2lkPn0gc291cmNlU3RyZWFtXG4gKiBAcGFyYW0ge251bWJlcn0gcmVhZGVyQ291bnRcbiAqLyRo4oCNX29uY2UuYWxsVmFsdWVzKGFsbFZhbHVlcyk7XG5jb25zdCAgICAgICAgc3luY2hyb25pemVkVGVlPShzb3VyY2VTdHJlYW0scmVhZGVyQ291bnQpPT57XG4vKiogQHR5cGUge0l0ZXJhdG9yUmV0dXJuUmVzdWx0PHZvaWQ+IHwgdW5kZWZpbmVkfSAqL1xubGV0IGRvbmVSZXN1bHQ7XG5cbi8qKiBAdHlwZWRlZiB7SXRlcmF0b3JSZXN1bHQ8KHZhbHVlOiBQcm9taXNlTGlrZTxJdGVyYXRvclJlc3VsdDxUPj4pID0+IHZvaWQ+fSBRdWV1ZVBheWxvYWQgKi9cbi8qKiBAdHlwZSB7WGltcG9ydCgnQGVuZG8vc3RyZWFtJykuQXN5bmNRdWV1ZTxRdWV1ZVBheWxvYWQ+W119ICovXG5jb25zdCBxdWV1ZXM9W107XG5cbi8qKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gKi9cbmNvbnN0IHB1bGxOZXh0PWFzeW5jKCk9PntcbmNvbnN0IHJlcXVlc3RzPWF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChxdWV1ZXMubWFwKChxdWV1ZSk9PnF1ZXVlLmdldCgpKSk7XG5jb25zdCByZWplY3Rpb25zPVtdO1xuLyoqIEB0eXBlIHtBcnJheTwodmFsdWU6IFByb21pc2VMaWtlPEl0ZXJhdG9yUmVzdWx0PFQ+PikgPT4gdm9pZD59ICovXG5jb25zdCByZXNvbHZlcnM9W107XG5sZXQgZG9uZT1mYWxzZTtcbmZvcihjb25zdCBzZXR0bGVkUmVzdWx0IG9mIHJlcXVlc3RzKXtcbmlmKHNldHRsZWRSZXN1bHQuc3RhdHVzPT09J3JlamVjdGVkJyl7XG5yZWplY3Rpb25zLnB1c2goc2V0dGxlZFJlc3VsdC5yZWFzb24pO1xuIH1lbHNle1xuZG9uZXx8PSEhc2V0dGxlZFJlc3VsdC52YWx1ZS5kb25lO1xucmVzb2x2ZXJzLnB1c2goc2V0dGxlZFJlc3VsdC52YWx1ZS52YWx1ZSk7XG4gfVxuIH1cbi8qKiBAdHlwZSB7UHJvbWlzZTxJdGVyYXRvclJlc3VsdDxUPj59ICovXG5sZXQgcmVzdWx0O1xuaWYoZG9uZVJlc3VsdCl7XG5yZXN1bHQ9UHJvbWlzZS5yZXNvbHZlKGRvbmVSZXN1bHQpO1xuIH1lbHNlIGlmKHJlamVjdGlvbnMubGVuZ3RoKXtcbmNvbnN0IGVycm9yPWFzc2VydC5lcnJvcihhc3NlcnQuZGV0YWlscyBgVGVlZCBzdHJlYW0gdGhyZXdgKTtcbmFzc2VydC5ub3RlKGVycm9yLGFzc2VydC5kZXRhaWxzIGBUZWVkIHJlamVjdGlvbnM6ICR7cmVqZWN0aW9uc31gKTtcbnJlc3VsdD1cbnNvdXJjZVN0cmVhbS50aHJvdz8uKGVycm9yKXx8XG5Qcm9taXNlLnJlc29sdmUoc291cmNlU3RyZWFtLnJldHVybj8uKCkpLnRoZW4oKCk9PlxuUHJvbWlzZS5yZWplY3QoZXJyb3IpKTtcblxuIH1lbHNlIGlmKGRvbmUpe1xucmVzdWx0PVxuc291cmNlU3RyZWFtLnJldHVybj8uKCl8fFxuUHJvbWlzZS5yZXNvbHZlKHtkb25lOnRydWUsdmFsdWU6dW5kZWZpbmVkfSk7XG4gfWVsc2V7XG5yZXN1bHQ9c291cmNlU3RyZWFtLm5leHQoKTtcbiB9XG5yZXN1bHQudGhlbihcbihyKT0+e1xuaWYoci5kb25lKXtcbmRvbmVSZXN1bHQ9cjtcbiB9XG4gfSxcbigpPT57XG5kb25lUmVzdWx0PXtkb25lOnRydWUsdmFsdWU6dW5kZWZpbmVkfTtcbiB9KTtcblxucmVzb2x2ZXJzLmZvckVhY2goKHJlc29sdmUpPT5yZXNvbHZlKHJlc3VsdCkpO1xucmV0dXJuIHB1bGxOZXh0KCk7XG4gfTtcblxuY29uc3QgcmVhZGVycz1BcnJheS5mcm9tKHtsZW5ndGg6cmVhZGVyQ291bnR9KS5tYXAoKCk9Pntcbi8qKiBAdHlwZSB7WGltcG9ydCgnQGVuZG8vc3RyZWFtJykuQXN5bmNRdWV1ZTxRdWV1ZVBheWxvYWQ+fSAqL1xuY29uc3QgcXVldWU9bWFrZVF1ZXVlKCk7XG5xdWV1ZXMucHVzaChxdWV1ZSk7XG5cbi8qKiBAdHlwZSB7QXN5bmNHZW5lcmF0b3I8VCwgdm9pZCwgdm9pZD59ICovXG5jb25zdCByZWFkZXI9aGFyZGVuKHtcbiAgICAgIGFzeW5jIG5leHQoKXtcbi8qKiBAdHlwZSB7WGltcG9ydCgnQGVuZG8vcHJvbWlzZS1raXQnKS5Qcm9taXNlS2l0PEl0ZXJhdG9yUmVzdWx0PFQ+Pn0gKi9cbmNvbnN0e3Byb21pc2UscmVzb2x2ZX09bWFrZVByb21pc2VLaXQoKTtcbnF1ZXVlLnB1dCh7dmFsdWU6cmVzb2x2ZSxkb25lOmZhbHNlfSk7XG5yZXR1cm4gcHJvbWlzZTtcbiB9LFxuICAgICAgYXN5bmMgcmV0dXJuKCl7XG4vKiogQHR5cGUge1hpbXBvcnQoJ0BlbmRvL3Byb21pc2Uta2l0JykuUHJvbWlzZUtpdDxJdGVyYXRvclJlc3VsdDxUPj59ICovXG5jb25zdHtwcm9taXNlLHJlc29sdmV9PW1ha2VQcm9taXNlS2l0KCk7XG5xdWV1ZS5wdXQoe3ZhbHVlOnJlc29sdmUsZG9uZTp0cnVlfSk7XG5yZXR1cm4gcHJvbWlzZTtcbiB9LFxuICAgICAgYXN5bmMgdGhyb3cocmVhc29uKXtcbmNvbnN0IHJlamVjdGlvbj1Qcm9taXNlLnJlamVjdChyZWFzb24pO1xucXVldWUucHV0KHJlamVjdGlvbik7XG5yZXR1cm4gcmVqZWN0aW9uO1xuIH0sXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1nbG9iYWxzKi9cbltTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKXtcbnJldHVybiByZWFkZXI7XG4gfX0pO1xuXG5yZXR1cm4gcmVhZGVyO1xuIH0pO1xuXG52b2lkIHB1bGxOZXh0KCk7XG5yZXR1cm4gcmVhZGVycztcbiB9OyRo4oCNX29uY2Uuc3luY2hyb25pemVkVGVlKHN5bmNocm9uaXplZFRlZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQkFTSVNfUE9JTlRTIjpbIkJBU0lTX1BPSU5UUyJdLCJmcm9tVW5pcXVlRW50cmllcyI6WyJmcm9tVW5pcXVlRW50cmllcyJdLCJvYmplY3RNYXAiOlsib2JqZWN0TWFwIl0sImxpc3REaWZmZXJlbmNlIjpbImxpc3REaWZmZXJlbmNlIl0sInRocm93TGFiZWxlZCI6WyJ0aHJvd0xhYmVsZWQiXSwiYXBwbHlMYWJlbGluZ0Vycm9yIjpbImFwcGx5TGFiZWxpbmdFcnJvciJdLCJkZWVwbHlGdWxmaWxsZWRPYmplY3QiOlsiZGVlcGx5RnVsZmlsbGVkT2JqZWN0Il0sIm1ha2VNZWFzdXJlU2Vjb25kcyI6WyJtYWtlTWVhc3VyZVNlY29uZHMiXSwibWFrZUFnZ3JlZ2F0ZUVycm9yIjpbIm1ha2VBZ2dyZWdhdGVFcnJvciJdLCJQcm9taXNlQWxsT3JFcnJvcnMiOlsiUHJvbWlzZUFsbE9yRXJyb3JzIl0sImFnZ3JlZ2F0ZVRyeUZpbmFsbHkiOlsiYWdncmVnYXRlVHJ5RmluYWxseSJdLCJhc3NlcnRBbGxEZWZpbmVkIjpbImFzc2VydEFsbERlZmluZWQiXSwiZm9yZXZlciI6WyJmb3JldmVyIl0sIndoaWxlVHJ1ZSI6WyJ3aGlsZVRydWUiXSwidW50aWxUcnVlIjpbInVudGlsVHJ1ZSJdLCJ6aXAiOlsiemlwIl0sImFsbFZhbHVlcyI6WyJhbGxWYWx1ZXMiXSwic3luY2hyb25pemVkVGVlIjpbInN5bmNocm9uaXplZFRlZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADNtRGR1RIAANUSAAAzAAAAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2ZhciIsIi4vc3Vic2NyaWJlLmpzIiwiLi90eXBlcy1hbWJpZW50LmpzIl0sImV4cG9ydHMiOlsibWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIiLCJvYnNlcnZlSXRlcmF0aW9uIiwib2JzZXJ2ZUl0ZXJhdG9yIiwib2JzZXJ2ZU5vdGlmaWVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEUsc3Vic2NyaWJlTGF0ZXN0OyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2ZhclwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV1dXSxbXCIuL3N1YnNjcmliZS5qc1wiLCBbW1wic3Vic2NyaWJlTGF0ZXN0XCIsIFskaOKAjV9hID0+IChzdWJzY3JpYmVMYXRlc3QgPSAkaOKAjV9hKV1dXV0sW1wiLi90eXBlcy1hbWJpZW50LmpzXCIsIFtdXV0pOyAgIFxuXG5cblxuXG5cblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgYHN1YnNjcmliZUxhdGVzdGAgZnJvbSBgQGFnb3JpYy9ub3RpZmllci9zdWJzY3JpYmUuanNgIGluc3RlYWQuXG4gKlxuICogQWRhcHRvciBmcm9tIGEgbm90aWZpZXJQIHRvIGFuIGFzeW5jIGl0ZXJhYmxlLlxuICogVGhlIG5vdGlmaWVyUCBjYW4gYmUgYW55IG9iamVjdCB0aGF0IGhhcyBhbiBldmVudHVhbGx5IGludm9jYWJsZVxuICogYGdldFVwZGF0ZVNpbmNlYCBtZXRob2QgdGhhdCBiZWhhdmVzIGFjY29yZGluZyB0byB0aGUgbm90aWZpZXJcbiAqIHNwZWMuIFRoaXMgY2FuIGJlIGEgbm90aWZpZXIsIGEgcHJvbWlzZSBmb3IgYSBsb2NhbCBvciByZW1vdGVcbiAqIG5vdGlmaWVyLCBvciBhIHByZXNlbmNlIG9mIGEgcmVtb3RlIG5vdGlmaWVyLlxuICpcbiAqIEl0IGlzIGFsc28gdXNlZCBpbnRlcm5hbGx5IGJ5IG5vdGlmaWVyLmpzIHNvIHRoYXQgYSBub3RpZmllciBpdHNlbGYgaXMgYW5cbiAqIGFzeW5jIGl0ZXJhYmxlLlxuICpcbiAqIEFuIGFzeW5jIGl0ZXJhYmxlIGlzIGFuIG9iamVjdCB3aXRoIGEgYFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKWAgbWV0aG9kXG4gKiB0aGF0IHJldHVybnMgYW4gYXN5bmMgaXRlcmF0b3IuIFRoZSBhc3luYyBpdGVyYXRvciB3ZSByZXR1cm4gaGVyZSBoYXMgb25seVxuICogYSBgbmV4dCgpYCBtZXRob2QsIHdpdGhvdXQgdGhlIG9wdGlvbmFsIGByZXR1cm5gIGFuZCBgdGhyb3dgIG1ldGhvZHMuIFRoZVxuICogb21pdHRlZCBtZXRob2RzLCBpZiBwcmVzZW50LCB3b3VsZCBiZSB1c2VkIGJ5IHRoZSBmb3IvYXdhaXQvb2YgbG9vcCB0b1xuICogaW5mb3JtIHRoZSBpdGVyYXRvciBvZiBlYXJseSB0ZXJtaW5hdGlvbi4gQnV0IHRoaXMgYWRhcHRvciB3b3VsZCBub3QgZG9cbiAqIGFueXRoaW5nIHVzZWZ1bCBpbiByZWFjdGlvbiB0byB0aGlzIG5vdGlmaWNhdGlvbi5cbiAqXG4gKiBBbiBhc3luYyBpdGVyYXRvcidzIGBuZXh0KClgIG1ldGhvZCByZXR1cm5zIGEgcHJvbWlzZSBmb3IgYW4gaXRlcmF0aW9uXG4gKiByZXN1bHQuIEFuIGl0ZXJhdGlvbiByZXN1bHQgaXMgYSByZWNvcmQgd2l0aCBgdmFsdWVgIGFuZCBgZG9uZWAgcHJvcGVydGllcy5cbiAqXG4gKiBUaGUgcHVycG9zZSBvZiBidWlsZGluZyBvbiB0aGUgbm90aWZpZXIgcHJvdG9jb2wgaXMgdG8gaGF2ZSBhIGxvc3N5XG4gKiBhZGFwdG9yLCB3aGVyZSBpbnRlcm1lZGlhdGUgcmVzdWx0cyBjYW4gYmUgbWlzc2VkIGluIGZhdm9yIG9mIG1vcmUgcmVjZW50XG4gKiByZXN1bHRzIHdoaWNoIGFyZSB0aGVyZWZvcmUgbGVzcyBzdGFsZS4gU2VlXG4gKiBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2RvY3VtZW50YXRpb24vYmxvYi9IRUFEL21haW4vZ3VpZGVzL2pzLXByb2dyYW1taW5nL25vdGlmaWVycy5tZFxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8QmFzZU5vdGlmaWVyPFQ+Pn0gbm90aWZpZXJQXG4gKiBAcmV0dXJucyB7Rm9ya2FibGVBc3luY0l0ZXJhYmxlPFQ+fVxuICovXG5jb25zdCAgICAgICAgbWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXI9c3Vic2NyaWJlTGF0ZXN0O1xuXG4vKipcbiAqIFRoaXMgYWR2YW5jZXMgYGFzeW5jSXRlcmF0b3JQYCB1cGRhdGluZyBgaXRlcmF0aW9uT2JzZXJ2ZXJgIHdpdGggZWFjaFxuICogc3VjY2Vzc2l2ZSB2YWx1ZS4gVGhlIGBpdGVyYXRpb25PYnNlcnZlcmAgbWF5IG9ubHkgYmUgaW50ZXJlc3RlZCBpbiBjZXJ0YWluXG4gKiBvY2N1cnJlbmNlcyAoYHVwZGF0ZVN0YXRlYCwgYGZpbmlzaGAsIGBmYWlsYCksIHNvIGZvciBjb252ZW5pZW5jZSxcbiAqIGBvYnNlcnZlSXRlcmF0b3JgIGZlYXR1cmUgdGVzdHMgZm9yIHRob3NlIG1ldGhvZHMgYmVmb3JlIGNhbGxpbmcgdGhlbS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPEFzeW5jSXRlcmF0b3I8VD4+fSBhc3luY0l0ZXJhdG9yUFxuICogQHBhcmFtIHtQYXJ0aWFsPEl0ZXJhdGlvbk9ic2VydmVyPFQ+Pn0gaXRlcmF0aW9uT2JzZXJ2ZXJcbiAqIEByZXR1cm5zIHtQcm9taXNlPHVuZGVmaW5lZD59XG4gKi8kaOKAjV9vbmNlLm1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyKG1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyKTtcbmNvbnN0ICAgICAgICBvYnNlcnZlSXRlcmF0b3I9KGFzeW5jSXRlcmF0b3JQLGl0ZXJhdGlvbk9ic2VydmVyKT0+e1xucmV0dXJuIG5ldyBQcm9taXNlKChhY2ssb2JzZXJ2ZXJFcnJvcik9PntcbmNvbnN0IHJlY3VyPSgpPT57XG5FLndoZW4oXG5FKGFzeW5jSXRlcmF0b3JQKS5uZXh0KCksXG4oe3ZhbHVlLGRvbmV9KT0+e1xuaWYoZG9uZSl7XG5pdGVyYXRpb25PYnNlcnZlci5maW5pc2gmJml0ZXJhdGlvbk9ic2VydmVyLmZpbmlzaCh2YWx1ZSk7XG5hY2sodW5kZWZpbmVkKTtcbiB9ZWxzZXtcbml0ZXJhdGlvbk9ic2VydmVyLnVwZGF0ZVN0YXRlJiZcbml0ZXJhdGlvbk9ic2VydmVyLnVwZGF0ZVN0YXRlKHZhbHVlKTtcbnJlY3VyKCk7XG4gfVxuIH0sXG4ocmVhc29uKT0+e1xuaXRlcmF0aW9uT2JzZXJ2ZXIuZmFpbCYmaXRlcmF0aW9uT2JzZXJ2ZXIuZmFpbChyZWFzb24pO1xuYWNrKHVuZGVmaW5lZCk7XG4gfSkuXG5jYXRjaChvYnNlcnZlckVycm9yKTtcbiB9O1xucmVjdXIoKTtcbiB9KTtcbiB9O1xuXG4vKipcbiAqIFRoaXMgcmVhZHMgZnJvbSBgYXN5bmNJdGVyYWJsZVBgIHVwZGF0aW5nIGBpdGVyYXRpb25PYnNlcnZlcmAgd2l0aCBlYWNoXG4gKiBzdWNjZXNzaXZlIHZhbHVlLiBUaGUgYGl0ZXJhdGlvbk9ic2VydmVyYCBtYXkgb25seSBiZSBpbnRlcmVzdGVkIGluIGNlcnRhaW5cbiAqIG9jY3VycmVuY2VzIChgdXBkYXRlU3RhdGVgLCBgZmluaXNoYCwgYGZhaWxgKSwgc28gZm9yIGNvbnZlbmllbmNlLFxuICogYG9ic2VydmVJdGVyYXRpb25gIGZlYXR1cmUgdGVzdHMgZm9yIHRob3NlIG1ldGhvZHMgYmVmb3JlIGNhbGxpbmcgdGhlbS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPEFzeW5jSXRlcmFibGU8VD4+fSBhc3luY0l0ZXJhYmxlUFxuICogQHBhcmFtIHtQYXJ0aWFsPEl0ZXJhdGlvbk9ic2VydmVyPFQ+Pn0gaXRlcmF0aW9uT2JzZXJ2ZXJcbiAqIEByZXR1cm5zIHtQcm9taXNlPHVuZGVmaW5lZD59XG4gKi8kaOKAjV9vbmNlLm9ic2VydmVJdGVyYXRvcihvYnNlcnZlSXRlcmF0b3IpO1xuY29uc3QgICAgICAgIG9ic2VydmVJdGVyYXRpb249KGFzeW5jSXRlcmFibGVQLGl0ZXJhdGlvbk9ic2VydmVyKT0+e1xuY29uc3QgaXRlcmF0b3JQPUUoYXN5bmNJdGVyYWJsZVApW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpO1xucmV0dXJuIG9ic2VydmVJdGVyYXRvcihpdGVyYXRvclAsaXRlcmF0aW9uT2JzZXJ2ZXIpO1xuIH07XG5cbi8qKlxuICogQXMgdXBkYXRlcyBjb21lIGluIGZyb20gdGhlIHBvc3NpYmx5IHJlbW90ZSBgbm90aWZpZXJQYCwgdXBkYXRlXG4gKiB0aGUgbG9jYWwgYHVwZGF0ZXJgLiBTaW5jZSB0aGUgdXBkYXRlcyBjb21lIGZyb20gYSBub3RpZmllciwgdGhleVxuICogYXJlIGxvc3N5LCBpLmUuLCBvbmNlIGEgbW9yZSByZWNlbnQgc3RhdGUgY2FuIGJlIHJlcG9ydGVkLCBsZXNzIHJlY2VudFxuICogc3RhdGVzIGFyZSBhc3N1bWVkIGlycmVsZXZhbnQgYW5kIGRyb3BwZWQuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxMYXRlc3RUb3BpYzxUPj59IG5vdGlmaWVyUFxuICogQHBhcmFtIHtQYXJ0aWFsPEl0ZXJhdGlvbk9ic2VydmVyPFQ+Pn0gaXRlcmF0aW9uT2JzZXJ2ZXJcbiAqIEByZXR1cm5zIHtQcm9taXNlPHVuZGVmaW5lZD59XG4gKi8kaOKAjV9vbmNlLm9ic2VydmVJdGVyYXRpb24ob2JzZXJ2ZUl0ZXJhdGlvbik7XG5jb25zdCAgICAgICAgb2JzZXJ2ZU5vdGlmaWVyPShub3RpZmllclAsaXRlcmF0aW9uT2JzZXJ2ZXIpPT5cbm9ic2VydmVJdGVyYXRpb24oc3Vic2NyaWJlTGF0ZXN0KG5vdGlmaWVyUCksaXRlcmF0aW9uT2JzZXJ2ZXIpOyRo4oCNX29uY2Uub2JzZXJ2ZU5vdGlmaWVyKG9ic2VydmVOb3RpZmllcik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIiOlsibWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIiXSwib2JzZXJ2ZUl0ZXJhdG9yIjpbIm9ic2VydmVJdGVyYXRvciJdLCJvYnNlcnZlSXRlcmF0aW9uIjpbIm9ic2VydmVJdGVyYXRpb24iXSwib2JzZXJ2ZU5vdGlmaWVyIjpbIm9ic2VydmVOb3RpZmllciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABN4u8aHAcAABwHAAAkAAAAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vcHVibGlzaC1raXQuanMiLCIuL3N1YnNjcmliZS5qcyIsIi4vbm90aWZpZXIuanMiLCIuL3N1YnNjcmliZXIuanMiLCIuL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzIiwiLi9zdG9yZXN1Yi5qcyIsIi4vc3RvcmVkLW5vdGlmaWVyLmpzIl0sImV4cG9ydHMiOlsibWFrZU5vdGlmaWVyS2l0IiwibWFrZU5vdGlmaWVyS2l0IiwibWFrZVN1YnNjcmlwdGlvbktpdCIsIm1ha2VTdWJzY3JpcHRpb25LaXQiLCJvYnNlcnZlSXRlcmF0b3IiLCJvYnNlcnZlSXRlcmF0b3IiLCJwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQiLCJwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQiLCJzdWJzY3JpYmVMYXRlc3QiLCJzdWJzY3JpYmVMYXRlc3QiXSwicmVleHBvcnRzIjpbIi4vc3RvcmVkLW5vdGlmaWVyLmpzIiwiLi9zdG9yZXN1Yi5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIi4vcHVibGlzaC1raXQuanNcIiwgW11dLFtcIi4vc3Vic2NyaWJlLmpzXCIsIFtdXSxbXCIuL25vdGlmaWVyLmpzXCIsIFtdXSxbXCIuL3N1YnNjcmliZXIuanNcIiwgW11dLFtcIi4vYXN5bmNJdGVyYWJsZUFkYXB0b3IuanNcIiwgW11dLFtcIi4vc3RvcmVzdWIuanNcIiwgW11dLFtcIi4vc3RvcmVkLW5vdGlmaWVyLmpzXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7Ii4vcHVibGlzaC1raXQuanMiOltbIm1ha2VQdWJsaXNoS2l0IiwibWFrZVB1Ymxpc2hLaXQiXSxbInByZXBhcmVEdXJhYmxlUHVibGlzaEtpdCIsInByZXBhcmVEdXJhYmxlUHVibGlzaEtpdCJdLFsiRm9ya2FibGVBc3luY0l0ZXJhYmxlSXRlcmF0b3JTaGFwZSIsIkZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yU2hhcGUiXSxbIkl0ZXJhYmxlRWFjaFRvcGljSSIsIkl0ZXJhYmxlRWFjaFRvcGljSSJdLFsiSXRlcmFibGVMYXRlc3RUb3BpY0kiLCJJdGVyYWJsZUxhdGVzdFRvcGljSSJdLFsiU3Vic2NyaWJlclNoYXBlIiwiU3Vic2NyaWJlclNoYXBlIl1dLCIuL3N1YnNjcmliZS5qcyI6W1sic3Vic2NyaWJlRWFjaCIsInN1YnNjcmliZUVhY2giXSxbInN1YnNjcmliZUxhdGVzdCIsInN1YnNjcmliZUxhdGVzdCJdXSwiLi9ub3RpZmllci5qcyI6W1sibWFrZU5vdGlmaWVyIiwibWFrZU5vdGlmaWVyIl0sWyJtYWtlTm90aWZpZXJLaXQiLCJtYWtlTm90aWZpZXJLaXQiXSxbIm1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlIiwibWFrZU5vdGlmaWVyRnJvbUFzeW5jSXRlcmFibGUiXSxbIm1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyIiwibWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIiXV0sIi4vc3Vic2NyaWJlci5qcyI6W1sibWFrZVN1YnNjcmlwdGlvbiIsIm1ha2VTdWJzY3JpcHRpb24iXSxbIm1ha2VTdWJzY3JpcHRpb25LaXQiLCJtYWtlU3Vic2NyaXB0aW9uS2l0Il1dLCIuL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzIjpbWyJvYnNlcnZlTm90aWZpZXIiLCJvYnNlcnZlTm90aWZpZXIiXSxbIm9ic2VydmVJdGVyYXRvciIsIm9ic2VydmVJdGVyYXRvciJdLFsib2JzZXJ2ZUl0ZXJhdGlvbiIsIm9ic2VydmVJdGVyYXRpb24iXSxbIm1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyIiwibWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMuv4FpaGAAAWhgAACcAAABAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvbm90aWZpZXIuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9hc3NlcnQiLCJAZW5kby9mYXIiLCIuL3R5cGVzLWFtYmllbnQuanMiLCIuL3B1Ymxpc2gta2l0LmpzIiwiLi9zdWJzY3JpYmUuanMiXSwiZXhwb3J0cyI6WyJtYWtlTm90aWZpZXIiLCJtYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZSIsIm1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyIiwibWFrZU5vdGlmaWVyS2l0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydCxFLEZhcixtYWtlUHVibGlzaEtpdCxzdWJzY3JpYmVMYXRlc3Q7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9hc3NlcnRcIiwgW1tcImFzc2VydFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0ID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL2ZhclwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV0sW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dXV0sW1wiLi90eXBlcy1hbWJpZW50LmpzXCIsIFtdXSxbXCIuL3B1Ymxpc2gta2l0LmpzXCIsIFtbXCJtYWtlUHVibGlzaEtpdFwiLCBbJGjigI1fYSA9PiAobWFrZVB1Ymxpc2hLaXQgPSAkaOKAjV9hKV1dXV0sW1wiLi9zdWJzY3JpYmUuanNcIiwgW1tcInN1YnNjcmliZUxhdGVzdFwiLCBbJGjigI1fYSA9PiAoc3Vic2NyaWJlTGF0ZXN0ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPExhdGVzdFRvcGljPFQ+Pn0gc2hhcmFibGVJbnRlcm5hbHNQXG4gKiBAcmV0dXJucyB7Tm90aWZpZXI8VD59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlTm90aWZpZXI9KHNoYXJhYmxlSW50ZXJuYWxzUCk9Pntcbi8qKiBAdHlwZSB7Tm90aWZpZXI8VD59ICovXG5jb25zdCBub3RpZmllcj1GYXIoJ25vdGlmaWVyJyx7XG4uLi5zdWJzY3JpYmVMYXRlc3Qoc2hhcmFibGVJbnRlcm5hbHNQKSxcbmdldFVwZGF0ZVNpbmNlOmFzeW5jKHVwZGF0ZUNvdW50KT0+XG5FKHNoYXJhYmxlSW50ZXJuYWxzUCkuZ2V0VXBkYXRlU2luY2UodXBkYXRlQ291bnQpLFxuXG4vKipcbiAqIFVzZSB0aGlzIHRvIGRpc3RyaWJ1dGUgYSBOb3RpZmllciBlZmZpY2llbnRseSBvdmVyIHRoZSBuZXR3b3JrLFxuICogYnkgb2J0YWluaW5nIHRoaXMgZnJvbSB0aGUgTm90aWZpZXIgdG8gYmUgcmVwbGljYXRlZCwgYW5kIGFwcGx5aW5nXG4gKiBgbWFrZU5vdGlmaWVyYCB0byBpdCBhdCB0aGUgbmV3IHNpdGUgdG8gZ2V0IGFuIGVxdWl2YWxlbnQgbG9jYWxcbiAqIE5vdGlmaWVyIGF0IHRoYXQgc2l0ZS5cbiAqL1xuZ2V0U2hhcmFibGVOb3RpZmllckludGVybmFsczphc3luYygpPT5zaGFyYWJsZUludGVybmFsc1AsXG4vKipcbiAqIEBkZXByZWNhdGVkXG4gKiBVc2VkIG9ubHkgYnkgYG1ha2VDYXN0aW5nU3BlY0Zyb21SZWZgLiAgSW5zdGVhZCB0aGF0IGZ1bmN0aW9uIHNob3VsZCB1c2VcbiAqIHRoZSBgU3RvcmVkRmFjZXRgIEFQSS5cbiAqL1xuZ2V0U3RvcmVLZXk6KCk9PmhhcmRlbih7bm90aWZpZXJ9KX0pO1xuXG5yZXR1cm4gbm90aWZpZXI7XG4gfTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPFN1YnNjcmliZXI8VD4+fSBzdWJzY3JpYmVyXG4gKiBAcmV0dXJucyB7Tm90aWZpZXI8VD59XG4gKi8kaOKAjV9vbmNlLm1ha2VOb3RpZmllcihtYWtlTm90aWZpZXIpO1xuY29uc3QgICAgICAgIG1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyPShzdWJzY3JpYmVyKT0+e1xuLyoqXG4gKiBAdHlwZSB7TGF0ZXN0VG9waWM8VD59XG4gKi9cbmNvbnN0IGJhc2VOb3RpZmllcj1oYXJkZW4oe1xuZ2V0VXBkYXRlU2luY2U6KHVwZGF0ZUNvdW50PXVuZGVmaW5lZCk9PlxuRShzdWJzY3JpYmVyKS5nZXRVcGRhdGVTaW5jZSh1cGRhdGVDb3VudCl9KTtcblxuXG4vKiogQHR5cGUge05vdGlmaWVyPFQ+fSAqL1xuY29uc3Qgbm90aWZpZXI9RmFyKCdub3RpZmllcicse1xuLi4ubWFrZU5vdGlmaWVyKGJhc2VOb3RpZmllciksXG4uLi5iYXNlTm90aWZpZXJ9KTtcblxucmV0dXJuIG5vdGlmaWVyO1xuIH07JGjigI1fb25jZS5tYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlcihtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlcik7XG5oYXJkZW4obWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIpO1xuXG4vKipcbiAqIFByb2R1Y2VzIGEgcGFpciBvZiBvYmplY3RzLCB3aGljaCBhbGxvdyBhIHNlcnZpY2UgdG8gcHJvZHVjZSBhIHN0cmVhbSBvZlxuICogdXBkYXRlIHByb21pc2VzLlxuICpcbiAqIFRoZSBpbml0aWFsIHN0YXRlIGFyZ3VtZW50IGhhcyB0byBiZSB0cnVseSBvcHRpb25hbCBldmVuIHRob3VnaCBpdCBjYW5cbiAqIGJlIGFueSBmaXJzdCBjbGFzcyB2YWx1ZSBpbmNsdWRpbmcgYHVuZGVmaW5lZGAuIFdlIG5lZWQgdG8gZGlzdGluZ3Vpc2ggdGhlXG4gKiBwcmVzZW5jZSB2cyB0aGUgYWJzZW5jZSBvZiBpdCwgd2hpY2ggd2UgY2Fubm90IGRvIHdpdGggdGhlIG9wdGlvbmFsIGFyZ3VtZW50XG4gKiBzeW50YXguIFJhdGhlciB3ZSB1c2UgdGhlIGFyaXR5IG9mIHRoZSBgaW5pdGlhbFN0YXRlQXJyYCBhcnJheS5cbiAqXG4gKiBJZiBubyBpbml0aWFsIHN0YXRlIGlzIHByb3ZpZGVkIHRvIGBtYWtlTm90aWZpZXJLaXRgLCB0aGVuIGl0IHN0YXJ0cyB3aXRob3V0XG4gKiBhbiBpbml0aWFsIHN0YXRlLiBJdHMgaW5pdGlhbCBzdGF0ZSB3aWxsIGluc3RlYWQgYmUgdGhlIHN0YXRlIG9mIHRoZSBmaXJzdFxuICogdXBkYXRlLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1tdIHwgW1RdfSBpbml0aWFsU3RhdGVBcnIgdGhlIGZpcnN0IHN0YXRlIHRvIGJlIHJldHVybmVkICh0eXBlZCBhcyByZXN0IGFycmF5IHRvIHBlcm1pdCBgdW5kZWZpbmVkYClcbiAqIEByZXR1cm5zIHtOb3RpZmllclJlY29yZDxUPn0gdGhlIG5vdGlmaWVyIGFuZCB1cGRhdGVyXG4gKi9cbmNvbnN0ICAgICAgICBtYWtlTm90aWZpZXJLaXQ9KC4uLmluaXRpYWxTdGF0ZUFycik9Pntcbi8qKiBAdHlwZSB7UHVibGlzaEtpdDxUPn0gKi9cbmNvbnN0e3B1Ymxpc2hlcixzdWJzY3JpYmVyfT1tYWtlUHVibGlzaEtpdCgpO1xuXG5jb25zdCBub3RpZmllcj1tYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlcihzdWJzY3JpYmVyKTtcblxuY29uc3QgdXBkYXRlcj1GYXIoJ3VwZGF0ZXInLHtcbnVwZGF0ZVN0YXRlOihzdGF0ZSk9PnB1Ymxpc2hlci5wdWJsaXNoKHN0YXRlKSxcbmZpbmlzaDooY29tcGxldGlvbik9PnB1Ymxpc2hlci5maW5pc2goY29tcGxldGlvbiksXG5mYWlsOihyZWFzb24pPT5wdWJsaXNoZXIuZmFpbChyZWFzb24pfSk7XG5cblxuYXNzZXJ0KGluaXRpYWxTdGF0ZUFyci5sZW5ndGg8PTEsJ3RvbyBtYW55IGFyZ3VtZW50cycpO1xuaWYoaW5pdGlhbFN0YXRlQXJyLmxlbmd0aD09PTEpe1xudXBkYXRlci51cGRhdGVTdGF0ZShpbml0aWFsU3RhdGVBcnJbMF0pO1xuIH1cblxuLyogbm90aWZpZXIgZmFjZXQgaXMgc2VwYXJhdGUgc28gaXQgY2FuIGJlIGhhbmRlZCBvdXQgd2hpbGUgdXBkYXRlciovXG4vKiBpcyB0aWdodGx5IGhlbGQqL1xucmV0dXJuIGhhcmRlbih7bm90aWZpZXIsdXBkYXRlcn0pO1xuIH07XG5cbi8qKlxuICogQWRhcHRvciBmcm9tIGFzeW5jIGl0ZXJhYmxlIHRvIG5vdGlmaWVyLlxuICpcbiAqIEBkZXByZWNhdGVkIFRoZSByZXN1bHRpbmcgbm90aWZpZXIgaXMgbG9zc2xlc3MsIHdoaWNoIGlzIG5vdCBkZXNpcmFibGUuXG4gKiBQcmVmZXIgbWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIsIGFuZCByZWZlciB0b1xuICogaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy81NDEzIGFuZFxuICogaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL3B1bGwvNTY5NSBmb3IgY29udGV4dC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPEFzeW5jSXRlcmFibGU8VD4+fSBhc3luY0l0ZXJhYmxlUFxuICogQHJldHVybnMge05vdGlmaWVyPFQ+fVxuICovJGjigI1fb25jZS5tYWtlTm90aWZpZXJLaXQobWFrZU5vdGlmaWVyS2l0KTtcbmNvbnN0ICAgICAgICBtYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZT0oYXN5bmNJdGVyYWJsZVApPT57XG5jb25zdCBpdGVyYXRvclA9RShhc3luY0l0ZXJhYmxlUClbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCk7XG5cbi8qKiBAdHlwZSB7UHJvbWlzZTxVcGRhdGVSZWNvcmQ8VD4+fHVuZGVmaW5lZH0gKi9cbmxldCBvcHROZXh0UHJvbWlzZTtcbmxldCBjdXJyZW50VXBkYXRlQ291bnQ9MG47XG4vKiogQHR5cGUge0VSZWY8VXBkYXRlUmVjb3JkPFQ+Pnx1bmRlZmluZWR9ICovXG5sZXQgY3VycmVudFJlc3BvbnNlO1xubGV0IGZpbmFsPWZhbHNlO1xuXG4vKipcbiAqIEB0eXBlIHtMYXRlc3RUb3BpYzxUPn1cbiAqL1xuY29uc3QgYmFzZU5vdGlmaWVyPUZhcignYmFzZU5vdGlmaWVyJyx7XG5nZXRVcGRhdGVTaW5jZSh1cGRhdGVDb3VudD0tMW4pe1xuaWYodXBkYXRlQ291bnQ8Y3VycmVudFVwZGF0ZUNvdW50KXtcbmlmKGN1cnJlbnRSZXNwb25zZSl7XG5yZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGN1cnJlbnRSZXNwb25zZSk7XG4gfVxuIH1lbHNlIGlmKHVwZGF0ZUNvdW50IT09Y3VycmVudFVwZGF0ZUNvdW50KXtcbnRocm93IEVycm9yKFxuJ2dldFVwZGF0ZVNpbmNlIGFyZ3VtZW50IG11c3QgYmUgYSBwcmV2aW91c2x5LWlzc3VlZCB1cGRhdGVDb3VudC4nKTtcblxuIH1cblxuLyogUmV0dXJuIGEgZmluYWwgcmVzcG9uc2UgaWYgd2UgaGF2ZSBvbmUsIG90aGVyd2lzZSBhIHByb21pc2UgZm9yIHRoZSBuZXh0IHN0YXRlLiovXG5pZihmaW5hbCl7XG5hc3NlcnQoY3VycmVudFJlc3BvbnNlIT09dW5kZWZpbmVkKTtcbnJldHVybiBQcm9taXNlLnJlc29sdmUoY3VycmVudFJlc3BvbnNlKTtcbiB9XG5pZighb3B0TmV4dFByb21pc2Upe1xuY29uc3QgbmV4dEl0ZXJSZXN1bHRQPUUoaXRlcmF0b3JQKS5uZXh0KCk7XG5vcHROZXh0UHJvbWlzZT1FLndoZW4oXG5uZXh0SXRlclJlc3VsdFAsXG4oe2RvbmUsdmFsdWV9KT0+e1xuYXNzZXJ0KCFmaW5hbCk7XG5pZihkb25lKXtcbmZpbmFsPXRydWU7XG4gfVxuY3VycmVudFVwZGF0ZUNvdW50Kz0xbjtcbmN1cnJlbnRSZXNwb25zZT1oYXJkZW4oe1xudmFsdWUsXG51cGRhdGVDb3VudDpkb25lP3VuZGVmaW5lZDpjdXJyZW50VXBkYXRlQ291bnR9KTtcblxub3B0TmV4dFByb21pc2U9dW5kZWZpbmVkO1xucmV0dXJuIGN1cnJlbnRSZXNwb25zZTtcbiB9LFxuKF9yZWFzb24pPT57XG5maW5hbD10cnVlO1xuY3VycmVudFJlc3BvbnNlPVxuLyoqIEB0eXBlIHtQcm9taXNlPFVwZGF0ZVJlY29yZDxUPj59ICovXG5uZXh0SXRlclJlc3VsdFA7XG5vcHROZXh0UHJvbWlzZT11bmRlZmluZWQ7XG5yZXR1cm4gY3VycmVudFJlc3BvbnNlO1xuIH0pO1xuXG4gfVxucmV0dXJuIG9wdE5leHRQcm9taXNlO1xuIH19KTtcblxuXG4vKiogQHR5cGUge05vdGlmaWVyPFQ+fSAqL1xuY29uc3Qgbm90aWZpZXI9RmFyKCdub3RpZmllcicse1xuLyogRG9uJ3QgbGVhayB0aGUgb3JpZ2luYWwgYXN5bmNJdGVyYWJsZVAgc2luY2UgaXQgbWF5IGJlIHJlbW90ZSBhbmQgd2UgYWxzbyovXG4vKiB3YW50IHRoZSBzYW1lIHNlbWFudGljcyBmb3IgdGhpcyBleHBvc2VkIGl0ZXJhYmxlIGFuZCB0aGUgYmFzZU5vdGlmaWVyLiovXG4uLi5tYWtlTm90aWZpZXIoYmFzZU5vdGlmaWVyKSxcbi4uLmJhc2VOb3RpZmllcn0pO1xuXG5yZXR1cm4gbm90aWZpZXI7XG4gfTskaOKAjV9vbmNlLm1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlKG1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlKTtcbmhhcmRlbihtYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZU5vdGlmaWVyIjpbIm1ha2VOb3RpZmllciJdLCJtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlciI6WyJtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlciJdLCJtYWtlTm90aWZpZXJLaXQiOlsibWFrZU5vdGlmaWVyS2l0Il0sIm1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlIjpbIm1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAL07+B8WOQAAFjkAACoAAABAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvcHVibGlzaC1raXQuanN7ImltcG9ydHMiOlsiQGFnb3JpYy92YXQtZGF0YSIsIkBlbmRvL2ZhciIsIkBlbmRvL3BhdHRlcm5zIiwiQGVuZG8vcHJvbWlzZS1raXQiLCIuL3R5cGVzLWFtYmllbnQuanMiXSwiZXhwb3J0cyI6WyJGb3JrYWJsZUFzeW5jSXRlcmFibGVJdGVyYXRvclNoYXBlIiwiSXRlcmFibGVFYWNoVG9waWNJIiwiSXRlcmFibGVMYXRlc3RUb3BpY0kiLCJQdWJsaXNoZXJJIiwiU3Vic2NyaWJlckkiLCJTdWJzY3JpYmVyU2hhcGUiLCJVcGRhdGVDb3VudFNoYXBlIiwibWFrZVB1Ymxpc2hLaXQiLCJwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQiLCJwdWJsaXNoS2l0SUtpdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBjYW5CZUR1cmFibGUscHJlcGFyZUV4b0NsYXNzS2l0LEUsRmFyLE0sZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkLG1ha2VQcm9taXNlS2l0OyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvdmF0LWRhdGFcIiwgW1tcImNhbkJlRHVyYWJsZVwiLCBbJGjigI1fYSA9PiAoY2FuQmVEdXJhYmxlID0gJGjigI1fYSldXSxbXCJwcmVwYXJlRXhvQ2xhc3NLaXRcIiwgWyRo4oCNX2EgPT4gKHByZXBhcmVFeG9DbGFzc0tpdCA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9mYXJcIiwgW1tcIkVcIiwgWyRo4oCNX2EgPT4gKEUgPSAkaOKAjV9hKV1dLFtcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJNXCIsIFskaOKAjV9hID0+IChNID0gJGjigI1fYSldXSxbXCJnZXRJbnRlcmZhY2VHdWFyZFBheWxvYWRcIiwgWyRo4oCNX2EgPT4gKGdldEludGVyZmFjZUd1YXJkUGF5bG9hZCA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wibWFrZVByb21pc2VLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VQcm9taXNlS2l0ID0gJGjigI1fYSldXV1dLFtcIi4vdHlwZXMtYW1iaWVudC5qc1wiLCBbXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5jb25zdHtGYWlsLHF1b3RlOnF9PWFzc2VydDtcblxuY29uc3Qgc2luaz0oKT0+eyB9O1xuY29uc3QgbWFrZVF1aWV0UmVqZWN0aW9uPShyZWFzb24pPT57XG5jb25zdCByZWplY3Rpb249aGFyZGVuKFByb21pc2UucmVqZWN0KHJlYXNvbikpO1xudm9pZCBFLndoZW4ocmVqZWN0aW9uLHNpbmssc2luayk7XG5yZXR1cm4gcmVqZWN0aW9uO1xuIH07XG5jb25zdCB0b29GYXJSZWplY3Rpb249bWFrZVF1aWV0UmVqZWN0aW9uKFxuaGFyZGVuKG5ldyBFcnJvcignQ2Fubm90IHJlYWQgcGFzdCBlbmQgb2YgaXRlcmF0aW9uLicpKSk7XG5cblxuY29uc3QgICAgICAgIFB1Ymxpc2hlckk9TS5pbnRlcmZhY2UoJ1B1Ymxpc2hlcicse1xucHVibGlzaDpNLmNhbGwoTS5hbnkoKSkucmV0dXJucygpLFxuZmluaXNoOk0uY2FsbChNLmFueSgpKS5yZXR1cm5zKCksXG5mYWlsOk0uY2FsbChNLmFueSgpKS5yZXR1cm5zKCl9KTtcblxuXG4vKiBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCBOb3RpZmllciBgZ2V0VXBkYXRlU2luY2VgLiovJGjigI1fb25jZS5QdWJsaXNoZXJJKFB1Ymxpc2hlckkpO1xuY29uc3QgICAgICAgIFVwZGF0ZUNvdW50U2hhcGU9TS5vcihNLmJpZ2ludCgpLE0ubnVtYmVyKCkpOyRo4oCNX29uY2UuVXBkYXRlQ291bnRTaGFwZShVcGRhdGVDb3VudFNoYXBlKTtcbmNvbnN0ICAgICAgICBTdWJzY3JpYmVyST1NLmludGVyZmFjZSgnU3Vic2NyaWJlcicse1xuc3Vic2NyaWJlQWZ0ZXI6TS5jYWxsKCkub3B0aW9uYWwoTS5iaWdpbnQoKSkucmV0dXJucyhNLnByb21pc2UoKSksXG5nZXRVcGRhdGVTaW5jZTpNLmNhbGwoKS5vcHRpb25hbChVcGRhdGVDb3VudFNoYXBlKS5yZXR1cm5zKE0ucHJvbWlzZSgpKX0pOyRo4oCNX29uY2UuU3Vic2NyaWJlckkoU3Vic2NyaWJlckkpO1xuXG5jb25zdCAgICAgICAgcHVibGlzaEtpdElLaXQ9aGFyZGVuKHtcbnB1Ymxpc2hlcjpQdWJsaXNoZXJJLFxuc3Vic2NyaWJlcjpTdWJzY3JpYmVySX0pOyRo4oCNX29uY2UucHVibGlzaEtpdElLaXQocHVibGlzaEtpdElLaXQpO1xuXG5cbmNvbnN0ICAgICAgICBGb3JrYWJsZUFzeW5jSXRlcmFibGVJdGVyYXRvclNoYXBlPU0uaW50ZXJmYWNlKFxuJ0ZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yJyxcbntcbmZvcms6TS5jYWxsKCkucmV0dXJucyhNLmFueSgpKSxcbltTeW1ib2wuYXN5bmNJdGVyYXRvcl06TS5jYWxsKCkucmV0dXJucyhNLmFueSgpKSwvKiBvb3BzOiByZWN1cnNpdmUgdHlwZSovXG5uZXh0Ok0uY2FsbFdoZW4oKS5yZXR1cm5zKE0uYW55KCkpfSk7JGjigI1fb25jZS5Gb3JrYWJsZUFzeW5jSXRlcmFibGVJdGVyYXRvclNoYXBlKEZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yU2hhcGUpO1xuXG5cblxuY29uc3QgICAgICAgIEl0ZXJhYmxlRWFjaFRvcGljST1NLmludGVyZmFjZSgnSXRlcmFibGVFYWNoVG9waWMnLHtcbnN1YnNjcmliZUFmdGVyOlxuZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkKFN1YnNjcmliZXJJKS5tZXRob2RHdWFyZHMuc3Vic2NyaWJlQWZ0ZXIsXG5bU3ltYm9sLmFzeW5jSXRlcmF0b3JdOk0uY2FsbCgpLnJldHVybnMoXG5NLnJlbW90YWJsZSgnRm9ya2FibGVBc3luY0l0ZXJhYmxlSXRlcmF0b3InKSl9KTskaOKAjV9vbmNlLkl0ZXJhYmxlRWFjaFRvcGljSShJdGVyYWJsZUVhY2hUb3BpY0kpO1xuXG5cblxuY29uc3QgICAgICAgIEl0ZXJhYmxlTGF0ZXN0VG9waWNJPU0uaW50ZXJmYWNlKCdJdGVyYWJsZUxhdGVzdFRvcGljJyx7XG5nZXRVcGRhdGVTaW5jZTpcbmdldEludGVyZmFjZUd1YXJkUGF5bG9hZChTdWJzY3JpYmVySSkubWV0aG9kR3VhcmRzLmdldFVwZGF0ZVNpbmNlLFxuW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTpNLmNhbGwoKS5yZXR1cm5zKFxuTS5yZW1vdGFibGUoJ0ZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yJykpfSk7XG5cblxuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7b2JqZWN0fSBBcmdcbiAqIEB0ZW1wbGF0ZSBSZXRcbiAqIEBwYXJhbSB7KGFyZzogQXJnKSA9PiBSZXR9IGZuXG4gKiBAcmV0dXJucyB7KGFyZzogQXJnKSA9PiBSZXR9XG4gKi8kaOKAjV9vbmNlLkl0ZXJhYmxlTGF0ZXN0VG9waWNJKEl0ZXJhYmxlTGF0ZXN0VG9waWNJKTtcbmNvbnN0IHdlYWtNZW1vaXplVW5hcnk9KGZuKT0+e1xuY29uc3QgY2FjaGU9bmV3IFdlYWtNYXAoKTtcbnJldHVybihhcmcpPT57XG4vKiogQHR5cGUge29iamVjdH0gKi9cbmNvbnN0IG9hcmc9YXJnO1xuaWYoY2FjaGUuaGFzKG9hcmcpKXtcbnJldHVybiBjYWNoZS5nZXQob2FyZyk7XG4gfVxuY29uc3QgcmVzdWx0PWZuKGFyZyk7XG5jYWNoZS5zZXQob2FyZyxyZXN1bHQpO1xucmV0dXJuIHJlc3VsdDtcbiB9O1xuIH07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7UHVibGljYXRpb25SZWNvcmQ8VD59IHJlY29yZFxuICogQHJldHVybnMge1VwZGF0ZVJlY29yZDxUPn1cbiAqL1xuY29uc3QgbWFrZVVwZGF0ZVJlY29yZEZyb21QdWJsaWNhdGlvblJlY29yZD0ocmVjb3JkKT0+e1xuY29uc3R7XG5oZWFkOnt2YWx1ZSxkb25lfSxcbnB1Ymxpc2hDb3VudH09XG5yZWNvcmQ7XG5pZihkb25lKXtcbi8qIEZpbmFsIHJlc3VsdHMgaGF2ZSB1bmRlZmluZWQgdXBkYXRlQ291bnQuKi9cbnJldHVybiBoYXJkZW4oe3ZhbHVlLHVwZGF0ZUNvdW50OnVuZGVmaW5lZH0pO1xuIH1cbnJldHVybiBoYXJkZW4oe3ZhbHVlLHVwZGF0ZUNvdW50OnB1Ymxpc2hDb3VudH0pO1xuIH07XG5cbi8qKlxuICogTWFrZXMgYSBgeyBwdWJsaXNoZXIsIHN1YnNjcmliZXIgfWAgcGFpciBmb3IgZG9pbmcgZWZmaWNpZW50XG4gKiBkaXN0cmlidXRlZCBwdWIvc3ViIHN1cHBvcnRpbmcgYm90aCBcImVhY2hcIiBhbmQgXCJsYXRlc3RcIiBpdGVyYXRpb25cbiAqIG9mIHB1Ymxpc2hlZCB2YWx1ZXMuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEByZXR1cm5zIHtQdWJsaXNoS2l0PFQ+fVxuICovXG5jb25zdCAgICAgICAgbWFrZVB1Ymxpc2hLaXQ9KCk9Pntcbi8qKiBAdHlwZSB7UHJvbWlzZTxQdWJsaWNhdGlvblJlY29yZDxUPj59ICovXG5sZXQgdGFpbFA7XG4vKiogQHR5cGUge3VuZGVmaW5lZCB8ICgodmFsdWU6IEVSZWY8UHVibGljYXRpb25SZWNvcmQ8VD4+KSA9PiB2b2lkKX0gKi9cbmxldCB0YWlsUjtcbih7cHJvbWlzZTp0YWlsUCxyZXNvbHZlOnRhaWxSfT1tYWtlUHJvbWlzZUtpdCgpKTtcblxubGV0IGN1cnJlbnRQdWJsaXNoQ291bnQ9MG47XG5sZXQgY3VycmVudFA9dGFpbFA7XG5jb25zdCBhZHZhbmNlQ3VycmVudD0oZG9uZSx2YWx1ZSxyZWplY3Rpb24pPT57XG5pZih0YWlsUj09PXVuZGVmaW5lZCl7XG50aHJvdyBFcnJvcignQ2Fubm90IHVwZGF0ZSBzdGF0ZSBhZnRlciB0ZXJtaW5hdGlvbi4nKTtcbiB9XG5cbmN1cnJlbnRQdWJsaXNoQ291bnQrPTFuO1xuY3VycmVudFA9dGFpbFA7XG5jb25zdCByZXNvbHZlQ3VycmVudD10YWlsUjtcblxuaWYoZG9uZSl7XG50YWlsUD10b29GYXJSZWplY3Rpb247XG50YWlsUj11bmRlZmluZWQ7XG4gfWVsc2V7XG4oe3Byb21pc2U6dGFpbFAscmVzb2x2ZTp0YWlsUn09bWFrZVByb21pc2VLaXQoKSk7XG4gfVxuXG5pZihyZWplY3Rpb24pe1xucmVzb2x2ZUN1cnJlbnQocmVqZWN0aW9uKTtcbiB9ZWxzZXtcbnJlc29sdmVDdXJyZW50KFxuaGFyZGVuKHtcbmhlYWQ6e3ZhbHVlLGRvbmV9LFxucHVibGlzaENvdW50OmN1cnJlbnRQdWJsaXNoQ291bnQsXG50YWlsOnRhaWxQfSkpO1xuXG5cbiB9XG4gfTtcblxuY29uc3QgbWFrZU1lbW9pemVkVXBkYXRlUmVjb3JkPXdlYWtNZW1vaXplVW5hcnkoXG5tYWtlVXBkYXRlUmVjb3JkRnJvbVB1YmxpY2F0aW9uUmVjb3JkKTtcblxuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZSB7U3Vic2NyaWJlcjxUPn1cbiAqL1xuY29uc3Qgc3Vic2NyaWJlcj1GYXIoJ1N1YnNjcmliZXInLHtcbnN1YnNjcmliZUFmdGVyOihwdWJsaXNoQ291bnQ9LTFuKT0+e1xuYXNzZXJ0LnR5cGVvZihwdWJsaXNoQ291bnQsJ2JpZ2ludCcpO1xuaWYocHVibGlzaENvdW50PT09Y3VycmVudFB1Ymxpc2hDb3VudCl7XG5yZXR1cm4gdGFpbFA7XG4gfWVsc2UgaWYocHVibGlzaENvdW50PGN1cnJlbnRQdWJsaXNoQ291bnQpe1xucmV0dXJuIGN1cnJlbnRQO1xuIH1lbHNle1xudGhyb3cgRXJyb3IoXG4nc3Vic2NyaWJlQWZ0ZXIgYXJndW1lbnQgbXVzdCBiZSBhIHByZXZpb3VzbHktaXNzdWVkIHB1Ymxpc2hDb3VudC4nKTtcblxuIH1cbiB9LFxuZ2V0VXBkYXRlU2luY2U6KHVwZGF0ZUNvdW50KT0+e1xuaWYodXBkYXRlQ291bnQ9PT11bmRlZmluZWQpe1xucmV0dXJuIHN1YnNjcmliZXIuc3Vic2NyaWJlQWZ0ZXIoKS50aGVuKG1ha2VNZW1vaXplZFVwZGF0ZVJlY29yZCk7XG4gfVxudXBkYXRlQ291bnQ9QmlnSW50KHVwZGF0ZUNvdW50KTtcbnJldHVybihcbnN1YnNjcmliZXJcbi8qIGBzdWJzY3JpYmVBZnRlcmAgbWF5IHJlc29sdmUgd2l0aCB0aGUgdXBkYXRlIHJlY29yZCBudW1iZXJlZCovXG4vKiBgdXBkYXRlQ291bnQgKyAxYCwgZXZlbiBpZiBzZXZlcmFsIHVwZGF0ZXMgYXJlIHB1Ymxpc2hlZCBpbiB0aGUqL1xuLyogc2FtZSBjcmFuay4uLiovLlxuc3Vic2NyaWJlQWZ0ZXIodXBkYXRlQ291bnQpXG4vKiAuLi4gc28gd2UgcG9sbCB0aGUgbGF0ZXN0IHB1Ymxpc2hlZCB1cGRhdGUsIHdpdGhvdXQgd2FpdGluZyBmb3IgYW55Ki9cbi8qIGZ1cnRoZXIgb25lcy4qLy5cbnRoZW4oKCk9PnN1YnNjcmliZXIuZ2V0VXBkYXRlU2luY2UoKSkpO1xuXG4gfX0pO1xuXG5cbi8qKiBAdHlwZSB7UHVibGlzaGVyPFQ+fSAqL1xuY29uc3QgcHVibGlzaGVyPUZhcignUHVibGlzaGVyJyx7XG5wdWJsaXNoOih2YWx1ZSk9PntcbmFkdmFuY2VDdXJyZW50KGZhbHNlLHZhbHVlKTtcbiB9LFxuZmluaXNoOihmaW5hbFZhbHVlKT0+e1xuYWR2YW5jZUN1cnJlbnQodHJ1ZSxmaW5hbFZhbHVlKTtcbiB9LFxuZmFpbDoocmVhc29uKT0+e1xuYWR2YW5jZUN1cnJlbnQodHJ1ZSx1bmRlZmluZWQsbWFrZVF1aWV0UmVqZWN0aW9uKHJlYXNvbikpO1xuIH19KTtcblxucmV0dXJuIGhhcmRlbih7cHVibGlzaGVyLHN1YnNjcmliZXJ9KTtcbiB9OyRo4oCNX29uY2UubWFrZVB1Ymxpc2hLaXQobWFrZVB1Ymxpc2hLaXQpO1xuaGFyZGVuKG1ha2VQdWJsaXNoS2l0KTtcblxuY29uc3QgRHVyYWJsZVB1Ymxpc2hLaXRTdGF0ZVNoYXBlPWhhcmRlbih7XG52YWx1ZUR1cmFiaWxpdHk6TS5hbnkoKSxcbnB1Ymxpc2hDb3VudDpNLmFueSgpLFxuc3RhdHVzOk0uYW55KCksXG5oYXNWYWx1ZTpNLmFueSgpLFxudmFsdWU6TS5hbnkoKX0pO1xuXG5cbi8qIFRPRE86IE1vdmUgZHVyYWJsZSBwdWJsaXNoIGtpdCB0byBhIG5ldyBmaWxlPyovXG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXVxuICogQHBhcmFtIHtEdXJhYmxlUHVibGlzaEtpdFZhbHVlRHVyYWJpbGl0eSAmICdtYW5kYXRvcnknfSBbb3B0aW9ucy52YWx1ZUR1cmFiaWxpdHldXG4gKiBAcmV0dXJucyB7RHVyYWJsZVB1Ymxpc2hLaXRTdGF0ZX1cbiAqL1xuY29uc3QgaW5pdER1cmFibGVQdWJsaXNoS2l0U3RhdGU9KG9wdGlvbnM9e30pPT57XG5jb25zdHt2YWx1ZUR1cmFiaWxpdHk9J21hbmRhdG9yeSd9PW9wdGlvbnM7XG5hc3NlcnQuZXF1YWwodmFsdWVEdXJhYmlsaXR5LCdtYW5kYXRvcnknKTtcbnJldHVybntcbi8qIGNvbmZpZ3VyYXRpb24qL1xudmFsdWVEdXJhYmlsaXR5LFxuXG4vKiBsaWZlY3ljbGUgcHJvZ3Jlc3MqL1xucHVibGlzaENvdW50OjBuLFxuc3RhdHVzOidsaXZlJywvKiB8ICdmaW5pc2hlZCcgfCAnZmFpbGVkJyovXG5cbi8qIHBlcnNpc3RlZCByZXN1bHQgZGF0YSovXG4vKiBOb3RlIHRoYXQgaW4gYWRkaXRpb24gdG8gbm9uLXRlcm1pbmFsIHZhbHVlcyBmcm9tIGBwdWJsaXNoYCwqL1xuLyogdmFsdWUgYWxzbyBob2xkcyB0aGUgdGVybWluYWwgdmFsdWUgZnJvbSBgZmluaXNoYCBvciBgZmFpbGAuKi9cbmhhc1ZhbHVlOmZhbHNlLFxudmFsdWU6dW5kZWZpbmVkfTtcblxuIH07XG5cbi8qIFdlIG5lZWQgdGhlIFdlYWtNYXAga2V5IGZvciBhIGtpdCB0byBiZSBhIHZyZWYtYmVhcmluZyBvYmplY3QqL1xuLyogaW4gaXRzIGNvaG9ydCwgYW5kIGhhdmUgYXJiaXRyYXJpbHkgY2hvc2VuIHRoZSBwdWJsaXNoZXIgZmFjZXQuKi9cbi8qKiBAdHlwZWRlZiB7UHVibGlzaGVyPCo+fSBEdXJhYmxlUHVibGlzaEtpdEVwaGVtZXJhbEtleSAqL1xuLyoqXG4gKiBAcGFyYW0ge1B1Ymxpc2hLaXQ8Kj59IGZhY2V0c1xuICogQHJldHVybnMge0R1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsS2V5fVxuICovXG5jb25zdCBnZXRFcGhlbWVyYWxLZXk9KGZhY2V0cyk9PmZhY2V0cy5wdWJsaXNoZXI7XG5cbi8qKlxuICogQHR5cGVkZWYgRHVyYWJsZVB1Ymxpc2hLaXRFcGhlbWVyYWxEYXRhXG4gKiBAcHJvcGVydHkge1Byb21pc2U8Kj4gfCB1bmRlZmluZWR9IGN1cnJlbnRQIFRoZSBjdXJyZW50LXJlc3VsdCBwcm9taXNlXG4gKiAgICh1bmRlZmluZWQgdW5sZXNzIHJlc29sdmVkIHdpdGggdW5yZWNvdmVyYWJsZSBlcGhlbWVyYWwgZGF0YSlcbiAqIEBwcm9wZXJ0eSB7UHJvbWlzZTwqPn0gdGFpbFAgVGhlIG5leHQtcmVzdWx0IHByb21pc2VcbiAqIEBwcm9wZXJ0eSB7KCh2YWx1ZTogYW55KSA9PiB2b2lkKSB8IHVuZGVmaW5lZH0gdGFpbFIgVGhlIG5leHQtcmVzdWx0IHJlc29sdmVyXG4gKiAgICh1bmRlZmluZWQgd2hlbiB0aGUgcHVibGlzaCBraXQgaGFzIHRlcm1pbmF0ZWQpXG4gKi9cblxuLyoqIEB0eXBlIHtXZWFrTWFwPER1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsS2V5LCBEdXJhYmxlUHVibGlzaEtpdEVwaGVtZXJhbERhdGE+fSAqL1xuY29uc3QgZHVyYWJsZVB1Ymxpc2hLaXRFcGhlbWVyYWxEYXRhPW5ldyBXZWFrTWFwKCk7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgY3VycmVudC1yZXN1bHQgcHJvbWlzZSBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBkdXJhYmxlXG4gKiBwdWJsaXNoIGtpdCwgcmVjcmVhdGVkIHVubGVzcyB3ZSBhbHJlYWR5IGhhdmUgb25lIHdpdGggcmV0YWluZWRcbiAqIGVwaGVtZXJhbCBkYXRhLlxuICpcbiAqIEBwYXJhbSB7RHVyYWJsZVB1Ymxpc2hLaXRTdGF0ZX0gc3RhdGVcbiAqIEBwYXJhbSB7UHVibGlzaEtpdDwqPn0gZmFjZXRzXG4gKiBAcGFyYW0ge1Byb21pc2U8Kj59IHRhaWxcbiAqIEByZXR1cm5zIHtQcm9taXNlPCo+fVxuICovXG5jb25zdCBwcm92aWRlQ3VycmVudFA9KHN0YXRlLGZhY2V0cyx0YWlsKT0+e1xuY29uc3QgZXBoZW1lcmFsS2V5PWdldEVwaGVtZXJhbEtleShmYWNldHMpO1xuY29uc3QgZm91bmREYXRhPWR1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsRGF0YS5nZXQoZXBoZW1lcmFsS2V5KTtcbmNvbnN0IGN1cnJlbnRQPWZvdW5kRGF0YSYmZm91bmREYXRhLmN1cnJlbnRQO1xuaWYoY3VycmVudFApe1xucmV0dXJuIGN1cnJlbnRQO1xuIH1cblxuY29uc3R7cHVibGlzaENvdW50LHN0YXR1cyxoYXNWYWx1ZSx2YWx1ZX09c3RhdGU7XG5pZighaGFzVmFsdWUpe1xuYXNzZXJ0KHN0YXR1cz09PSdsaXZlJyk7XG5yZXR1cm4gdGFpbDtcbiB9XG5pZihzdGF0dXM9PT0nbGl2ZSd8fHN0YXR1cz09PSdmaW5pc2hlZCcpe1xuY29uc3QgY2VsbD1oYXJkZW4oe1xuaGVhZDp7dmFsdWUsZG9uZTpzdGF0dXMhPT0nbGl2ZSd9LFxucHVibGlzaENvdW50LFxudGFpbH0pO1xuXG5yZXR1cm4gRS5yZXNvbHZlKGNlbGwpO1xuIH1lbHNlIGlmKHN0YXR1cz09PSdmYWlsZWQnKXtcbnJldHVybiBtYWtlUXVpZXRSZWplY3Rpb24odmFsdWUpO1xuIH1lbHNle1xudGhyb3cgRmFpbCBgSW52YWxpZCBkdXJhYmxlIHByb21pc2Uga2l0IHN0YXR1czogJHtxKHN0YXR1cyl9YDtcbiB9XG4gfTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBuZXh0LXJlc3VsdCBwcm9taXNlIGFuZCByZXNvbHZlciBhc3NvY2lhdGVkIHdpdGggYSBnaXZlblxuICogZHVyYWJsZSBwdWJsaXNoIGtpdC5cbiAqIFRoZXNlIGFyZSBsb3N0IG9uIHVwZ3JhZGUgYnV0IHJlY3JlYXRlZCBvbi1kZW1hbmQsIHByZXNlcnZpbmcgdGhlXG4gKiB2YWx1ZSBpbiAoYnV0IG5vdCB0aGUgaWRlbnRpdHkgb2YpIHRoZSBjdXJyZW50IHsgdmFsdWUsIGRvbmUgfSByZXN1bHRcbiAqIHdoZW4gcG9zc2libGUsIHdoaWNoIGlzIGFsd2F5cyB0aGUgY2FzZSB3aGVuIHRoYXQgdmFsdWUgaXMgdGVybWluYWxcbiAqIChpLmUuLCBmcm9tIGBmaW5pc2hgIG9yIGBmYWlsYCkgb3Igd2hlbiB0aGUgZHVyYWJsZSBwdWJsaXNoIGtpdCBpc1xuICogY29uZmlndXJlZCB3aXRoIGB2YWx1ZUR1cmFiaWxpdHk6ICdtYW5kYXRvcnknYC5cbiAqXG4gKiBAcGFyYW0ge0R1cmFibGVQdWJsaXNoS2l0U3RhdGV9IHN0YXRlXG4gKiBAcGFyYW0ge1B1Ymxpc2hLaXQ8Kj59IGZhY2V0c1xuICogQHJldHVybnMge0R1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsRGF0YX1cbiAqL1xuY29uc3QgcHJvdmlkZUR1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsRGF0YT0oc3RhdGUsZmFjZXRzKT0+e1xuY29uc3QgZXBoZW1lcmFsS2V5PWdldEVwaGVtZXJhbEtleShmYWNldHMpO1xuY29uc3QgZm91bmREYXRhPWR1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsRGF0YS5nZXQoZXBoZW1lcmFsS2V5KTtcbmlmKGZvdW5kRGF0YSl7XG5yZXR1cm4gZm91bmREYXRhO1xuIH1cblxuY29uc3R7c3RhdHVzfT1zdGF0ZTtcbmxldCB0YWlsUDtcbmxldCB0YWlsUjtcbmlmKHN0YXR1cz09PSdsaXZlJyl7XG4oe3Byb21pc2U6dGFpbFAscmVzb2x2ZTp0YWlsUn09bWFrZVByb21pc2VLaXQoKSk7XG52b2lkIEUud2hlbih0YWlsUCxzaW5rLHNpbmspO1xuIH1lbHNlIGlmKHN0YXR1cz09PSdmaW5pc2hlZCd8fHN0YXR1cz09PSdmYWlsZWQnKXtcbnRhaWxQPXRvb0ZhclJlamVjdGlvbjtcbiB9ZWxzZXtcbnRocm93IEZhaWwgYEludmFsaWQgZHVyYWJsZSBwcm9taXNlIGtpdCBzdGF0dXM6ICR7cShzdGF0dXMpfWA7XG4gfVxuLyogY3VycmVudFAgaXMgbm90IGVwaGVtZXJhbCB3aGVuIHJlc3RvcmluZyBmcm9tIHBlcnNpc3RlZCBzdGF0ZS4qL1xuY29uc3Qgb2JqPWhhcmRlbih7Y3VycmVudFA6dW5kZWZpbmVkLHRhaWxQLHRhaWxSfSk7XG5kdXJhYmxlUHVibGlzaEtpdEVwaGVtZXJhbERhdGEuc2V0KGVwaGVtZXJhbEtleSxvYmopO1xucmV0dXJuIG9iajtcbiB9O1xuXG4vKipcbiAqIEV4dGVuZHMgdGhlIHNlcXVlbmNlIG9mIHJlc3VsdHMuXG4gKlxuICogQHBhcmFtIHt7c3RhdGU6IER1cmFibGVQdWJsaXNoS2l0U3RhdGUsIGZhY2V0czogUHVibGlzaEtpdDwqPn19IGNvbnRleHRcbiAqIEBwYXJhbSB7YW55fSB2YWx1ZVxuICogQHBhcmFtIHtEdXJhYmxlUHVibGlzaEtpdFN0YXRlWydzdGF0dXMnXX0gW3RhcmdldFN0YXR1c11cbiAqL1xuY29uc3QgYWR2YW5jZUR1cmFibGVQdWJsaXNoS2l0PShjb250ZXh0LHZhbHVlLHRhcmdldFN0YXR1cz0nbGl2ZScpPT57XG5jb25zdHtzdGF0ZSxmYWNldHN9PWNvbnRleHQ7XG5jb25zdHt2YWx1ZUR1cmFiaWxpdHksc3RhdHVzfT1zdGF0ZTtcbmlmKHN0YXR1cyE9PSdsaXZlJyl7XG50aHJvdyBFcnJvcignQ2Fubm90IHVwZGF0ZSBzdGF0ZSBhZnRlciB0ZXJtaW5hdGlvbi4nKTtcbiB9XG5jb25zdCBkb25lPXRhcmdldFN0YXR1cyE9PSdsaXZlJztcbmlmKGRvbmV8fHZhbHVlRHVyYWJpbGl0eT09PSdtYW5kYXRvcnknKXtcbmNhbkJlRHVyYWJsZSh2YWx1ZSl8fEZhaWwgYENhbm5vdCBhY2NlcHQgbm9uLWR1cmFibGUgdmFsdWU6ICR7dmFsdWV9YDtcbiB9XG5jb25zdHt0YWlsUDpvbGRUYWlsUCx0YWlsUjpyZXNvbHZlT2xkVGFpbH09XG5wcm92aWRlRHVyYWJsZVB1Ymxpc2hLaXRFcGhlbWVyYWxEYXRhKHN0YXRlLGZhY2V0cyk7XG5hc3NlcnQudHlwZW9mKHJlc29sdmVPbGRUYWlsLCdmdW5jdGlvbicpO1xuXG5jb25zdCBwdWJsaXNoQ291bnQ9c3RhdGUucHVibGlzaENvdW50KzFuO1xuc3RhdGUucHVibGlzaENvdW50PXB1Ymxpc2hDb3VudDtcblxubGV0IHRhaWxQO1xubGV0IHRhaWxSO1xuaWYoZG9uZSl7XG5zdGF0ZS5zdGF0dXM9dGFyZ2V0U3RhdHVzO1xudGFpbFA9dG9vRmFyUmVqZWN0aW9uO1xudGFpbFI9dW5kZWZpbmVkO1xuIH1lbHNle1xuKHtwcm9taXNlOnRhaWxQLHJlc29sdmU6dGFpbFJ9PW1ha2VQcm9taXNlS2l0KCkpO1xudm9pZCBFLndoZW4odGFpbFAsc2luayxzaW5rKTtcbiB9XG5cbmxldCBjdXJyZW50UDtcbmlmKHRhcmdldFN0YXR1cz09PSdmYWlsZWQnKXtcbnN0YXRlLmhhc1ZhbHVlPXRydWU7XG5zdGF0ZS52YWx1ZT12YWx1ZTtcbmNvbnN0IHJlamVjdGlvbj1tYWtlUXVpZXRSZWplY3Rpb24odmFsdWUpO1xucmVzb2x2ZU9sZFRhaWwocmVqZWN0aW9uKTtcbiB9ZWxzZXtcbi8qIFBlcnNpc3QgYSB0ZXJtaW5hbCB2YWx1ZSwgb3IgYSBub24tdGVybWluYWwgdmFsdWUqL1xuLyogaWYgY29uZmlndXJlZCBhcyAnbWFuZGF0b3J5JyBvciAnb3Bwb3J0dW5pc3RpYycuKi9cbmlmKGRvbmV8fHZhbHVlRHVyYWJpbGl0eSE9PSdpZ25vcmVkJyYmY2FuQmVEdXJhYmxlKHZhbHVlKSl7XG5zdGF0ZS5oYXNWYWx1ZT10cnVlO1xuc3RhdGUudmFsdWU9dmFsdWU7XG4gfWVsc2V7XG5zdGF0ZS5oYXNWYWx1ZT1mYWxzZTtcbnN0YXRlLnZhbHVlPXVuZGVmaW5lZDtcbi8qIFJldGFpbiBhbnkgcHJvbWlzZSB3aXRoIG5vbi1kdXJhYmxlIHJlc29sdXRpb24uKi9cbmN1cnJlbnRQPW9sZFRhaWxQO1xuIH1cblxucmVzb2x2ZU9sZFRhaWwoXG5oYXJkZW4oe1xuaGVhZDp7dmFsdWUsZG9uZX0sXG5wdWJsaXNoQ291bnQsXG50YWlsOnRhaWxQfSkpO1xuXG5cbiB9XG5cbmR1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsRGF0YS5zZXQoXG5nZXRFcGhlbWVyYWxLZXkoZmFjZXRzKSxcbmhhcmRlbih7Y3VycmVudFAsdGFpbFAsdGFpbFJ9KSk7XG5cbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7WGltcG9ydCgnQGFnb3JpYy9zd2luZ3NldC1saXZlc2xvdHMnKS5CYWdnYWdlfSBiYWdnYWdlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2luZE5hbWVcbiAqL1xuY29uc3QgICAgICAgIHByZXBhcmVEdXJhYmxlUHVibGlzaEtpdD0oYmFnZ2FnZSxraW5kTmFtZSk9Pntcbi8qIFRPRE86IE9uY2Ugd2UgdW5pZnkgd2l0aCBtYWtlUHVibGlzaEtpdCwgd2Ugd2lsbCB1c2UgYSBab25lLWNvbXBhdGlibGUgd2VhayovXG4vKiBtYXAgZm9yIG1lbW9pemF0aW9uLiovXG5jb25zdCBtYWtlTWVtb2l6ZWRVcGRhdGVSZWNvcmQ9bWFrZVVwZGF0ZVJlY29yZEZyb21QdWJsaWNhdGlvblJlY29yZDtcblxuLyoqXG4gKiBAcmV0dXJucyB7KCkgPT4gUHVibGlzaEtpdDwqPn1cbiAqL1xucmV0dXJuIHByZXBhcmVFeG9DbGFzc0tpdChcbmJhZ2dhZ2UsXG5raW5kTmFtZSxcbnB1Ymxpc2hLaXRJS2l0LFxuaW5pdER1cmFibGVQdWJsaXNoS2l0U3RhdGUsXG57XG4vKiBUaGUgcHVibGlzaGVyIGZhY2V0IG9mIGEgZHVyYWJsZSBwdWJsaXNoIGtpdCovXG4vKiBhY2NlcHRzIG5ldyB2YWx1ZXMuKi9cbnB1Ymxpc2hlcjp7XG5wdWJsaXNoKHZhbHVlKXtcbmFkdmFuY2VEdXJhYmxlUHVibGlzaEtpdCh0aGlzLHZhbHVlKTtcbiB9LFxuZmluaXNoKGZpbmFsVmFsdWUpe1xuYWR2YW5jZUR1cmFibGVQdWJsaXNoS2l0KHRoaXMsZmluYWxWYWx1ZSwnZmluaXNoZWQnKTtcbiB9LFxuZmFpbChyZWFzb24pe1xuYWR2YW5jZUR1cmFibGVQdWJsaXNoS2l0KHRoaXMscmVhc29uLCdmYWlsZWQnKTtcbiB9fSxcblxuXG4vKiBUaGUgc3Vic2NyaWJlciBmYWNldCBvZiBhIGR1cmFibGUgcHVibGlzaCBraXQqL1xuLyogcHJvcGFnYXRlcyB2YWx1ZXMuKi9cbnN1YnNjcmliZXI6e1xuc3Vic2NyaWJlQWZ0ZXIocHVibGlzaENvdW50PS0xbil7XG5jb25zdHtzdGF0ZSxmYWNldHN9PXRoaXM7XG5jb25zdHtwdWJsaXNoQ291bnQ6Y3VycmVudFB1Ymxpc2hDb3VudH09c3RhdGU7XG5jb25zdHtjdXJyZW50UCx0YWlsUH09cHJvdmlkZUR1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsRGF0YShcbnN0YXRlLFxuZmFjZXRzKTtcblxuaWYocHVibGlzaENvdW50PT09Y3VycmVudFB1Ymxpc2hDb3VudCl7XG5yZXR1cm4gdGFpbFA7XG4gfWVsc2UgaWYocHVibGlzaENvdW50PGN1cnJlbnRQdWJsaXNoQ291bnQpe1xucmV0dXJuIGN1cnJlbnRQfHxwcm92aWRlQ3VycmVudFAoc3RhdGUsZmFjZXRzLHRhaWxQKTtcbiB9ZWxzZXtcbnRocm93IEVycm9yKFxuJ3N1YnNjcmliZUFmdGVyIGFyZ3VtZW50IG11c3QgYmUgYSBwcmV2aW91c2x5LWlzc3VlZCBwdWJsaXNoQ291bnQuJyk7XG5cbiB9XG4gfSxcbmdldFVwZGF0ZVNpbmNlKHVwZGF0ZUNvdW50KXtcbmNvbnN0e1xuZmFjZXRzOntzdWJzY3JpYmVyfX09XG50aGlzO1xuaWYodXBkYXRlQ291bnQ9PT11bmRlZmluZWQpe1xucmV0dXJuIHN1YnNjcmliZXIuc3Vic2NyaWJlQWZ0ZXIoKS50aGVuKG1ha2VNZW1vaXplZFVwZGF0ZVJlY29yZCk7XG4gfVxudXBkYXRlQ291bnQ9QmlnSW50KHVwZGF0ZUNvdW50KTtcbnJldHVybihcbnN1YnNjcmliZXJcbi8qIGBzdWJzY3JpYmVBZnRlcmAgbWF5IHJlc29sdmUgd2l0aCB0aGUgdXBkYXRlIHJlY29yZCBudW1iZXJlZCovXG4vKiBgdXBkYXRlQ291bnQgKyAxYCwgZXZlbiBpZiBzZXZlcmFsIHVwZGF0ZXMgYXJlIHB1Ymxpc2hlZCBpbiB0aGUqL1xuLyogc2FtZSBjcmFuay4uLiovLlxuc3Vic2NyaWJlQWZ0ZXIodXBkYXRlQ291bnQpXG4vKiAuLi4gc28gd2UgcG9sbCB0aGUgbGF0ZXN0IHB1Ymxpc2hlZCB1cGRhdGUsIHdpdGhvdXQgd2FpdGluZyBmb3IgYW55Ki9cbi8qIGZ1cnRoZXIgb25lcy4qLy5cbnRoZW4oKCk9PnN1YnNjcmliZXIuZ2V0VXBkYXRlU2luY2UoKSkpO1xuXG4gfX19LFxuXG5cbntcbnN0YXRlU2hhcGU6RHVyYWJsZVB1Ymxpc2hLaXRTdGF0ZVNoYXBlfSk7XG5cblxuIH07JGjigI1fb25jZS5wcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQocHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0KTtcbmhhcmRlbihwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQpO1xuXG5jb25zdCAgICAgICAgU3Vic2NyaWJlclNoYXBlPU0ucmVtb3RhYmxlKCdTdWJzY3JpYmVyJyk7JGjigI1fb25jZS5TdWJzY3JpYmVyU2hhcGUoU3Vic2NyaWJlclNoYXBlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJQdWJsaXNoZXJJIjpbIlB1Ymxpc2hlckkiXSwiVXBkYXRlQ291bnRTaGFwZSI6WyJVcGRhdGVDb3VudFNoYXBlIl0sIlN1YnNjcmliZXJJIjpbIlN1YnNjcmliZXJJIl0sInB1Ymxpc2hLaXRJS2l0IjpbInB1Ymxpc2hLaXRJS2l0Il0sIkZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yU2hhcGUiOlsiRm9ya2FibGVBc3luY0l0ZXJhYmxlSXRlcmF0b3JTaGFwZSJdLCJJdGVyYWJsZUVhY2hUb3BpY0kiOlsiSXRlcmFibGVFYWNoVG9waWNJIl0sIkl0ZXJhYmxlTGF0ZXN0VG9waWNJIjpbIkl0ZXJhYmxlTGF0ZXN0VG9waWNJIl0sIm1ha2VQdWJsaXNoS2l0IjpbIm1ha2VQdWJsaXNoS2l0Il0sInByZXBhcmVEdXJhYmxlUHVibGlzaEtpdCI6WyJwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQiXSwiU3Vic2NyaWJlclNoYXBlIjpbIlN1YnNjcmliZXJTaGFwZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABZapKMgwoAAIMKAAAuAAAAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL3N0b3JlZC1ub3RpZmllci5qc3siaW1wb3J0cyI6WyJAYWdvcmljL2ludGVybmFsIiwiQGFnb3JpYy9pbnRlcm5hbC9zcmMvbGliLWNoYWluU3RvcmFnZS5qcyIsIkBlbmRvL2ZhciIsIi4vYXN5bmNJdGVyYWJsZUFkYXB0b3IuanMiXSwiZXhwb3J0cyI6WyJtYWtlU3RvcmVkTm90aWZpZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0QWxsRGVmaW5lZCxtYWtlU2VyaWFsaXplVG9TdG9yYWdlLEUsRmFyLG9ic2VydmVOb3RpZmllcjskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL2ludGVybmFsXCIsIFtbXCJhc3NlcnRBbGxEZWZpbmVkXCIsIFskaOKAjV9hID0+IChhc3NlcnRBbGxEZWZpbmVkID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvaW50ZXJuYWwvc3JjL2xpYi1jaGFpblN0b3JhZ2UuanNcIiwgW1tcIm1ha2VTZXJpYWxpemVUb1N0b3JhZ2VcIiwgWyRo4oCNX2EgPT4gKG1ha2VTZXJpYWxpemVUb1N0b3JhZ2UgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vZmFyXCIsIFtbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXSxbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV1dXSxbXCIuL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzXCIsIFtbXCJvYnNlcnZlTm90aWZpZXJcIiwgWyRo4oCNX2EgPT4gKG9ic2VydmVOb3RpZmllciA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge0Jhc2VOb3RpZmllcjxUPiAmIE9taXQ8U3RvcmVkRmFjZXQsICdnZXRTdG9yZUtleSc+fSBTdG9yZWROb3RpZmllclxuICovXG5cbi8qKlxuICogQmVnaW4gaXRlcmF0aW5nIHRoZSBzb3VyY2UsIHN0b3Jpbmcgc2VyaWFsaXplZCBpdGVyYXRpb24gdmFsdWVzLiAgSWYgdGhlXG4gKiBzdG9yYWdlTm9kZSdzIGBzZXRWYWx1ZWAgb3BlcmF0aW9uIHJlamVjdHMsIG5vIGZ1cnRoZXIgd3JpdGVzIHRvIGl0IHdpbGxcbiAqIGJlIGF0dGVtcHRlZCAoYnV0IHJlc3VsdHMgd2lsbCByZW1haW4gYXZhaWxhYmxlIGZyb20gdGhlIHN1YnNjcmliZXIpLlxuICpcbiAqIFJldHVybnMgYSBTdG9yZWROb3RpZmllciB0aGF0IGNhbiBiZSB1c2VkIGJ5IGEgY2xpZW50IHRvIGRpcmVjdGx5IGZvbGxvd1xuICogdGhlIGl0ZXJhdGlvbiB0aGVtc2VsdmVzLCBvciBvYnRhaW4gaW5mb3JtYXRpb24gdG8gc3Vic2NyaWJlIHRvIHRoZSBzdG9yZWRcbiAqIGRhdGEgb3V0LW9mLWJhbmQuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxOb3RpZmllcjxUPj59IG5vdGlmaWVyXG4gKiBAcGFyYW0ge0VSZWY8U3RvcmFnZU5vZGU+fSBzdG9yYWdlTm9kZVxuICogQHBhcmFtIHtFUmVmPE1hcnNoYWxsZXI+fSBtYXJzaGFsbGVyXG4gKiBAcmV0dXJucyB7U3RvcmVkTm90aWZpZXI8VD59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlU3RvcmVkTm90aWZpZXI9KG5vdGlmaWVyLHN0b3JhZ2VOb2RlLG1hcnNoYWxsZXIpPT57XG5hc3NlcnRBbGxEZWZpbmVkKHtub3RpZmllcixzdG9yYWdlTm9kZSxtYXJzaGFsbGVyfSk7XG5cbmNvbnN0IG1hcnNoYWxsVG9TdG9yYWdlPW1ha2VTZXJpYWxpemVUb1N0b3JhZ2Uoc3RvcmFnZU5vZGUsbWFyc2hhbGxlcik7XG5cbm9ic2VydmVOb3RpZmllcihub3RpZmllcix7XG51cGRhdGVTdGF0ZSh2YWx1ZSl7XG5tYXJzaGFsbFRvU3RvcmFnZSh2YWx1ZSkuY2F0Y2goKHJlYXNvbik9PlxuY29uc29sZS5lcnJvcignU3RvcmVkTm90aWZpZXIgZmFpbGVkIHRvIHVwZGF0ZVN0YXRlJyxyZWFzb24pKTtcblxuIH0sXG5mYWlsKHJlYXNvbil7XG5jb25zb2xlLmVycm9yKCdTdG9yZWROb3RpZmllciBmYWlsZWQgdG8gaXRlcmF0ZScscmVhc29uKTtcbiB9fSkuXG5jYXRjaCgocmVhc29uKT0+e1xuY29uc29sZS5lcnJvcignU3RvcmVkTm90aWZpZXIgaGFsdGVkIGl0ZXJhdGlvbicscmVhc29uKTtcbiB9KTtcblxuLyoqIEB0eXBlIHtVbnNlcmlhbGl6ZXJ9ICovXG5jb25zdCB1bnNlcmlhbGl6ZXI9RmFyKCd1bnNlcmlhbGl6ZXInLHtcbmZyb21DYXBEYXRhOihkYXRhKT0+RShtYXJzaGFsbGVyKS5mcm9tQ2FwRGF0YShkYXRhKSxcbnVuc2VyaWFsaXplOihkYXRhKT0+RShtYXJzaGFsbGVyKS5mcm9tQ2FwRGF0YShkYXRhKX0pO1xuXG5cbi8qKiBAdHlwZSB7U3RvcmVkTm90aWZpZXI8VD59ICovXG5jb25zdCBzdG9yZWROb3RpZmllcj1GYXIoJ1N0b3JlZE5vdGlmaWVyJyx7XG5nZXRVcGRhdGVTaW5jZToodXBkYXRlQ291bnQpPT5FKG5vdGlmaWVyKS5nZXRVcGRhdGVTaW5jZSh1cGRhdGVDb3VudCksXG5nZXRQYXRoOigpPT5FKHN0b3JhZ2VOb2RlKS5nZXRQYXRoKCksXG5nZXRVbnNlcmlhbGl6ZXI6KCk9PnVuc2VyaWFsaXplcn0pO1xuXG5yZXR1cm4gc3RvcmVkTm90aWZpZXI7XG4gfTskaOKAjV9vbmNlLm1ha2VTdG9yZWROb3RpZmllcihtYWtlU3RvcmVkTm90aWZpZXIpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VTdG9yZWROb3RpZmllciI6WyJtYWtlU3RvcmVkTm90aWZpZXIiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAP99Lb9UhAADVIQAAJwAAAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy9zdG9yZXN1Yi5qc3siaW1wb3J0cyI6WyJAZW5kby9mYXIiLCJAZW5kby9tYXJzaGFsIiwiQGFnb3JpYy9pbnRlcm5hbCIsIkBhZ29yaWMvaW50ZXJuYWwvc3JjL2xpYi1jaGFpblN0b3JhZ2UuanMiLCIuL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzIiwiLi9wdWJsaXNoLWtpdC5qcyIsIi4vc3Vic2NyaWJlci5qcyIsIi4vc3Vic2NyaWJlLmpzIl0sImV4cG9ydHMiOlsiZm9yRWFjaFB1YmxpY2F0aW9uUmVjb3JkIiwibWFrZVN0b3JlZFB1Ymxpc2hLaXQiLCJtYWtlU3RvcmVkUHVibGlzaGVyS2l0IiwibWFrZVN0b3JlZFN1YnNjcmliZXIiLCJtYWtlU3RvcmVkU3Vic2NyaXB0aW9uIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEUsRmFyLG1ha2VNYXJzaGFsLGFzc2VydEFsbERlZmluZWQsbWFrZVNlcmlhbGl6ZVRvU3RvcmFnZSxvYnNlcnZlSXRlcmF0aW9uLG1ha2VQdWJsaXNoS2l0LG1ha2VTdWJzY3JpcHRpb25LaXQsc3Vic2NyaWJlRWFjaDskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9mYXJcIiwgW1tcIkVcIiwgWyRo4oCNX2EgPT4gKEUgPSAkaOKAjV9hKV1dLFtcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcIm1ha2VNYXJzaGFsXCIsIFskaOKAjV9hID0+IChtYWtlTWFyc2hhbCA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL2ludGVybmFsXCIsIFtbXCJhc3NlcnRBbGxEZWZpbmVkXCIsIFskaOKAjV9hID0+IChhc3NlcnRBbGxEZWZpbmVkID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvaW50ZXJuYWwvc3JjL2xpYi1jaGFpblN0b3JhZ2UuanNcIiwgW1tcIm1ha2VTZXJpYWxpemVUb1N0b3JhZ2VcIiwgWyRo4oCNX2EgPT4gKG1ha2VTZXJpYWxpemVUb1N0b3JhZ2UgPSAkaOKAjV9hKV1dXV0sW1wiLi9hc3luY0l0ZXJhYmxlQWRhcHRvci5qc1wiLCBbW1wib2JzZXJ2ZUl0ZXJhdGlvblwiLCBbJGjigI1fYSA9PiAob2JzZXJ2ZUl0ZXJhdGlvbiA9ICRo4oCNX2EpXV1dXSxbXCIuL3B1Ymxpc2gta2l0LmpzXCIsIFtbXCJtYWtlUHVibGlzaEtpdFwiLCBbJGjigI1fYSA9PiAobWFrZVB1Ymxpc2hLaXQgPSAkaOKAjV9hKV1dXV0sW1wiLi9zdWJzY3JpYmVyLmpzXCIsIFtbXCJtYWtlU3Vic2NyaXB0aW9uS2l0XCIsIFskaOKAjV9hID0+IChtYWtlU3Vic2NyaXB0aW9uS2l0ID0gJGjigI1fYSldXV1dLFtcIi4vc3Vic2NyaWJlLmpzXCIsIFtbXCJzdWJzY3JpYmVFYWNoXCIsIFskaOKAjV9hID0+IChzdWJzY3JpYmVFYWNoID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBOQjogZG9lcyBub3QgeWV0IHN1cnZpdmUgdXBncmFkZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzY4OTNcbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtTdWJzY3JpYmVyPFQ+fSBzdWJzY3JpYmVyXG4gKiBAcGFyYW0geyh2OiBUKSA9PiB2b2lkfSBjb25zdW1lVmFsdWVcbiAqL1xuY29uc3QgICAgICAgIGZvckVhY2hQdWJsaWNhdGlvblJlY29yZD1hc3luYyhzdWJzY3JpYmVyLGNvbnN1bWVWYWx1ZSk9Pntcbi8qIFdlIG9wZW4tY29kZSB0aGUgZm9yLWF3YWl0LW9mIGltcGxlbWVudGF0aW9uIHJhdGhlciB0aGFuIHVzaW5nIHRoYXQgc3ludGF4Ki9cbi8qIGRpcmVjdGx5IGJlY2F1c2Ugd2Ugd2FudCB0byBydW4gdGhlIGNvbnN1bWVyIG9uIHRoZSBkb25lIHZhbHVlIGFzIHdlbGwuKi9cbmNvbnN0IGl0ZXJhdG9yPXN1YnNjcmliZUVhY2goc3Vic2NyaWJlcilbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCk7XG5cbmxldCBmaW5pc2hlZD1mYWxzZTtcbmF3YWl0IG51bGw7XG53aGlsZSghZmluaXNoZWQpe1xuY29uc3R7dmFsdWUsZG9uZX09YXdhaXQgaXRlcmF0b3IubmV4dCgpO1xuYXdhaXQgY29uc3VtZVZhbHVlKHZhbHVlKTtcbmZpbmlzaGVkPSEhZG9uZTtcbiB9XG4gfTtcblxuLyoqXG4gKiBCZWdpbiBpdGVyYXRpbmcgdGhlIHNvdXJjZSwgc3RvcmluZyBzZXJpYWxpemVkIGl0ZXJhdGlvbiB2YWx1ZXMuICBJZiB0aGVcbiAqIHN0b3JhZ2VOb2RlJ3MgYHNldFZhbHVlYCBvcGVyYXRpb24gcmVqZWN0cywgbm8gZnVydGhlciB3cml0ZXMgdG8gaXQgd2lsbFxuICogYmUgYXR0ZW1wdGVkIChidXQgcmVzdWx0cyB3aWxsIHJlbWFpbiBhdmFpbGFibGUgZnJvbSB0aGUgc3Vic2NyaWJlcikuXG4gKlxuICogUmV0dXJucyBhIFN0b3JlZFN1YnNjcmliZXIgdGhhdCBjYW4gYmUgdXNlZCBieSBhIGNsaWVudCB0byBkaXJlY3RseSBmb2xsb3dcbiAqIHRoZSBpdGVyYXRpb24gdGhlbXNlbHZlcywgb3Igb2J0YWluIGluZm9ybWF0aW9uIHRvIHN1YnNjcmliZSB0byB0aGUgc3RvcmVkXG4gKiBkYXRhIG91dC1vZi1iYW5kLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1N1YnNjcmliZXI8VD59IHN1YnNjcmliZXJcbiAqIEBwYXJhbSB7RVJlZjxTdG9yYWdlTm9kZT59IHN0b3JhZ2VOb2RlXG4gKiBAcGFyYW0ge0VSZWY8UmV0dXJuVHlwZTx0eXBlb2YgbWFrZU1hcnNoYWw+Pn0gbWFyc2hhbGxlclxuICogQHJldHVybnMge1N0b3JlZFN1YnNjcmliZXI8VD59XG4gKi8kaOKAjV9vbmNlLmZvckVhY2hQdWJsaWNhdGlvblJlY29yZChmb3JFYWNoUHVibGljYXRpb25SZWNvcmQpO1xuY29uc3QgICAgICAgIG1ha2VTdG9yZWRTdWJzY3JpYmVyPShzdWJzY3JpYmVyLHN0b3JhZ2VOb2RlLG1hcnNoYWxsZXIpPT57XG5hc3NlcnRBbGxEZWZpbmVkKHtzdWJzY3JpYmVyLHN0b3JhZ2VOb2RlLG1hcnNoYWxsZXJ9KTtcblxuY29uc3QgbWFyc2hhbGxUb1N0b3JhZ2U9bWFrZVNlcmlhbGl6ZVRvU3RvcmFnZShzdG9yYWdlTm9kZSxtYXJzaGFsbGVyKTtcblxuLyogU3RhcnQgcHVibGlzaGluZyB0aGUgc291cmNlLiovXG5mb3JFYWNoUHVibGljYXRpb25SZWNvcmQoc3Vic2NyaWJlcixtYXJzaGFsbFRvU3RvcmFnZSkuY2F0Y2goKGVycik9Pntcbi8qIFRPRE86IEhvdyBzaG91bGQgd2UgaGFuZGxlIGFuZC9vciBzdXJmYWNlIHRoaXMgZmFpbHVyZT8qL1xuLyogaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL3B1bGwvNTc2NiNkaXNjdXNzaW9uX3I5MjI0OTgwODgqL1xuY29uc29sZS5lcnJvcignU3RvcmVkU3Vic2NyaWJlciBmYWlsZWQgdG8gaXRlcmF0ZScsZXJyKTtcbiB9KTtcblxuLyoqIEB0eXBlIHtVbnNlcmlhbGl6ZXJ9ICovXG5jb25zdCB1bnNlcmlhbGl6ZXI9RmFyKCd1bnNlcmlhbGl6ZXInLHtcbmZyb21DYXBEYXRhOihkYXRhKT0+RShtYXJzaGFsbGVyKS5mcm9tQ2FwRGF0YShkYXRhKSxcbnVuc2VyaWFsaXplOihkYXRhKT0+RShtYXJzaGFsbGVyKS5mcm9tQ2FwRGF0YShkYXRhKX0pO1xuXG5cbi8qKiBAdHlwZSB7U3RvcmVkU3Vic2NyaWJlcjxUPn0gKi9cbmNvbnN0IHN0b3Jlc3ViPUZhcignU3RvcmVkU3Vic2NyaWJlcicse1xuc3Vic2NyaWJlQWZ0ZXI6KHB1Ymxpc2hDb3VudCk9PnN1YnNjcmliZXIuc3Vic2NyaWJlQWZ0ZXIocHVibGlzaENvdW50KSxcbmdldFVwZGF0ZVNpbmNlOih1cGRhdGVDb3VudCk9PnN1YnNjcmliZXIuZ2V0VXBkYXRlU2luY2UodXBkYXRlQ291bnQpLFxuZ2V0UGF0aDooKT0+RShzdG9yYWdlTm9kZSkuZ2V0UGF0aCgpLFxuZ2V0U3RvcmVLZXk6KCk9PkUoc3RvcmFnZU5vZGUpLmdldFN0b3JlS2V5KCksXG5nZXRVbnNlcmlhbGl6ZXI6KCk9PnVuc2VyaWFsaXplcn0pO1xuXG5yZXR1cm4gc3RvcmVzdWI7XG4gfTtcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCB1c2UgbWFrZVN0b3JlZFN1YnNjcmliZXJcbiAqXG4gKiBCZWdpbiBpdGVyYXRpbmcgdGhlIHNvdXJjZSwgc3RvcmluZyBzZXJpYWxpemVkIGl0ZXJhdGlvbiB2YWx1ZXMuICBJZiB0aGVcbiAqIHN0b3JhZ2VOb2RlJ3MgYHNldFZhbHVlYCBvcGVyYXRpb24gcmVqZWN0cywgdGhlIGl0ZXJhdGlvbiB3aWxsIGJlIHRlcm1pbmF0ZWQuXG4gKlxuICogUmV0dXJucyBhIFN0b3JlZFN1YnNjcmlwdGlvbiB0aGF0IGNhbiBiZSB1c2VkIGJ5IGEgY2xpZW50IHRvIGRpcmVjdGx5IGZvbGxvd1xuICogdGhlIGl0ZXJhdGlvbiB0aGVtc2VsdmVzLCBvciBvYnRhaW4gaW5mb3JtYXRpb24gdG8gc3Vic2NyaWJlIHRvIHRoZSBzdG9yZWRcbiAqIGRhdGEgb3V0LW9mLWJhbmQuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7U3Vic2NyaXB0aW9uPFQ+fSBzdWJzY3JpcHRpb25cbiAqIEBwYXJhbSB7RVJlZjxTdG9yYWdlTm9kZT59IFtzdG9yYWdlTm9kZV1cbiAqIEBwYXJhbSB7RVJlZjxSZXR1cm5UeXBlPHR5cGVvZiBtYWtlTWFyc2hhbD4+fSBbbWFyc2hhbGxlcl1cbiAqIEByZXR1cm5zIHtTdG9yZWRTdWJzY3JpcHRpb248VD59XG4gKi8kaOKAjV9vbmNlLm1ha2VTdG9yZWRTdWJzY3JpYmVyKG1ha2VTdG9yZWRTdWJzY3JpYmVyKTtcbmNvbnN0ICAgICAgICBtYWtlU3RvcmVkU3Vic2NyaXB0aW9uPShcbnN1YnNjcmlwdGlvbixcbnN0b3JhZ2VOb2RlLFxubWFyc2hhbGxlcj1tYWtlTWFyc2hhbCh1bmRlZmluZWQsdW5kZWZpbmVkLHtcbm1hcnNoYWxTYXZlRXJyb3I6KCk9PnsgfSxcbnNlcmlhbGl6ZUJvZHlGb3JtYXQ6J3NtYWxsY2Fwcyd9KSk9PlxuXG57XG4vKiogQHR5cGUge1Vuc2VyaWFsaXplcn0gKi9cbmNvbnN0IHVuc2VyaWFsaXplcj1GYXIoJ3Vuc2VyaWFsaXplcicse1xuZnJvbUNhcERhdGE6KGRhdGEpPT5FKG1hcnNoYWxsZXIpLmZyb21DYXBEYXRhKGRhdGEpLFxudW5zZXJpYWxpemU6KGRhdGEpPT5FKG1hcnNoYWxsZXIpLmZyb21DYXBEYXRhKGRhdGEpfSk7XG5cblxuLyogQWJvcnQgdGhlIGl0ZXJhdGlvbiBvbiB0aGUgbmV4dCBvYnNlcnZhdGlvbiBpZiB0aGUgcHVibGlzaGVyIGV2ZXIgZmFpbHMuKi9cbmxldCBwdWJsaXNoRmFpbGVkPWZhbHNlO1xubGV0IHB1Ymxpc2hFeGNlcHRpb247XG5cbmNvbnN0IGZhaWw9KGVycik9PntcbnB1Ymxpc2hGYWlsZWQ9dHJ1ZTtcbnB1Ymxpc2hFeGNlcHRpb249ZXJyO1xuIH07XG5cbi8qIE11c3QgKm5vdCogYmUgYW4gYXN5bmMgZnVuY3Rpb24sIGJlY2F1c2UgaXQgc29tZXRpbWVzIG11c3QgdGhyb3cgdG8gYWJvcnQqL1xuLyogdGhlIGl0ZXJhdGlvbi4qL1xuY29uc3QgcHVibGlzaFZhbHVlPShvYmopPT57XG5hc3NlcnQoc3RvcmFnZU5vZGUpO1xuaWYocHVibGlzaEZhaWxlZCl7XG4vKiBUbyBwcm9wZXJseSBhYm9ydCB0aGUgaXRlcmF0aW9uLCB0aGlzIG11c3QgYmUgYSBzeW5jaHJvbm91cyBleGNlcHRpb24uKi9cbnRocm93IHB1Ymxpc2hFeGNlcHRpb247XG4gfVxuXG4vKiBQdWJsaXNoIHRoZSB2YWx1ZSwgY2FwdHVyaW5nIGFueSBlcnJvci4qL1xuRShtYXJzaGFsbGVyKS5cbnRvQ2FwRGF0YShvYmopLlxudGhlbigoc2VyaWFsaXplZCk9PntcbmNvbnN0IGVuY29kZWQ9SlNPTi5zdHJpbmdpZnkoc2VyaWFsaXplZCk7XG5yZXR1cm4gRShzdG9yYWdlTm9kZSkuc2V0VmFsdWUoZW5jb2RlZCk7XG4gfSkuXG5jYXRjaChmYWlsKTtcbiB9O1xuXG5pZihzdG9yYWdlTm9kZSl7XG4vKiBTdGFydCBwdWJsaXNoaW5nIHRoZSBzb3VyY2UuKi9cbm9ic2VydmVJdGVyYXRpb24oc3Vic2NyaXB0aW9uLHtcbnVwZGF0ZVN0YXRlOnB1Ymxpc2hWYWx1ZSxcbmZpbmlzaDpwdWJsaXNoVmFsdWV9KS5cbmNhdGNoKGZhaWwpO1xuIH1cblxuLyoqIEB0eXBlIHtTdG9yZWRTdWJzY3JpcHRpb248VD59ICovXG5jb25zdCBzdG9yZXN1Yj1GYXIoJ1N0b3JlZFN1YnNjcmlwdGlvbicse1xuLyogQHRzLWV4cGVjdC1lcnJvciBnZXRTdG9yZUtleSB0eXBlIGRvZXMgbm90IGhhdmUgYHN1YnNjcmlwdGlvbmAqL1xuZ2V0U3RvcmVLZXk6YXN5bmMoKT0+e1xuaWYoIXN0b3JhZ2VOb2RlKXtcbnJldHVybiBoYXJkZW4oe3N1YnNjcmlwdGlvbn0pO1xuIH1cbmNvbnN0IHN0b3JlS2V5PWF3YWl0IEUoc3RvcmFnZU5vZGUpLmdldFN0b3JlS2V5KCk7XG5yZXR1cm4gaGFyZGVuKHsuLi5zdG9yZUtleSxzdWJzY3JpcHRpb259KTtcbiB9LFxuZ2V0VW5zZXJpYWxpemVyOigpPT51bnNlcmlhbGl6ZXIsXG5nZXRTaGFyYWJsZVN1YnNjcmlwdGlvbkludGVybmFsczooKT0+XG5zdWJzY3JpcHRpb24uZ2V0U2hhcmFibGVTdWJzY3JpcHRpb25JbnRlcm5hbHMoKSxcbltTeW1ib2wuYXN5bmNJdGVyYXRvcl06KCk9PnN1YnNjcmlwdGlvbltTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKSxcbnN1YnNjcmliZUFmdGVyOihwdWJsaXNoQ291bnQpPT5zdWJzY3JpcHRpb24uc3Vic2NyaWJlQWZ0ZXIocHVibGlzaENvdW50KX0pO1xuXG5yZXR1cm4gc3RvcmVzdWI7XG4gfTskaOKAjV9vbmNlLm1ha2VTdG9yZWRTdWJzY3JpcHRpb24obWFrZVN0b3JlZFN1YnNjcmlwdGlvbik7XG5oYXJkZW4obWFrZVN0b3JlZFN1YnNjcmlwdGlvbik7XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgdXNlIFN0b3JlZFB1Ymxpc2hLaXRcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTdG9yZWRQdWJsaXNoZXJLaXRcbiAqIEBwcm9wZXJ0eSB7U3RvcmVkU3Vic2NyaXB0aW9uPFQ+fSBzdWJzY3JpYmVyXG4gKiBAcHJvcGVydHkge0l0ZXJhdGlvbk9ic2VydmVyPFQ+fSBwdWJsaXNoZXJcbiAqL1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIGluY29tcGF0aWJsZSB3aXRoIGR1cmFiaWxpdHk7IGluc3RlYWQgaGFuZGxlIHZzdG9yYWdlIGVwaGVtZXJhbGx5IG9uIGEgZHVyYWJsZSBQdWJsaXNoS2l0XG4gKlxuICogQHRlbXBsYXRlIFtUPXVua25vd25dXG4gKiBAcGFyYW0ge0VSZWY8U3RvcmFnZU5vZGU+fSBbc3RvcmFnZU5vZGVdXG4gKiBAcGFyYW0ge0VSZWY8TWFyc2hhbGxlcj59IFttYXJzaGFsbGVyXVxuICogQHBhcmFtIHtzdHJpbmd9IFtjaGlsZFBhdGhdXG4gKiBAcmV0dXJucyB7U3RvcmVkUHVibGlzaGVyS2l0PFQ+fVxuICovXG5jb25zdCAgICAgICAgbWFrZVN0b3JlZFB1Ymxpc2hlcktpdD0oc3RvcmFnZU5vZGUsbWFyc2hhbGxlcixjaGlsZFBhdGgpPT57XG5jb25zdHtwdWJsaWNhdGlvbixzdWJzY3JpcHRpb259PW1ha2VTdWJzY3JpcHRpb25LaXQoKTtcblxuaWYoc3RvcmFnZU5vZGUmJmNoaWxkUGF0aCl7XG5zdG9yYWdlTm9kZT1FKHN0b3JhZ2VOb2RlKS5tYWtlQ2hpbGROb2RlKGNoaWxkUGF0aCk7XG4gfVxuXG4vKiB3cmFwIHRoZSBzdWJzY3JpcHRpb24gdG8gdGVlIGV2ZW50cyB0byBzdG9yYWdlLCByZXBlYXRpbmcgdG8gdGhpcyBgc3Vic2NyaWJlcmAqL1xuY29uc3Qgc3Vic2NyaWJlcj1tYWtlU3RvcmVkU3Vic2NyaXB0aW9uKFxuc3Vic2NyaXB0aW9uLFxuc3RvcmFnZU5vZGUsXG5tYXJzaGFsbGVyKTtcblxuXG5yZXR1cm57XG5wdWJsaXNoZXI6cHVibGljYXRpb24sXG5zdWJzY3JpYmVyfTtcblxuIH07XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgaW5jb21wYXRpYmxlIHdpdGggZHVyYWJpbGl0eTsgaW5zdGVhZCBoYW5kbGUgdnN0b3JhZ2UgZXBoZW1lcmFsbHkgb24gYSBkdXJhYmxlIFB1Ymxpc2hLaXRcbiAqXG4gKiBMaWtlIG1ha2VQdWJsaXNoS2l0IHRoaXMgbWFrZXMgYSBgeyBwdWJsaXNoZXIsIHN1YnNjcmliZXIgfWAgcGFpciBmb3IgZG9pbmcgZWZmaWNpZW50XG4gKiBkaXN0cmlidXRlZCBwdWIvc3ViIHN1cHBvcnRpbmcgYm90aCBcImVhY2hcIiBhbmQgXCJsYXRlc3RcIiBpdGVyYXRpb25cbiAqIG9mIHB1Ymxpc2hlZCB2YWx1ZXMuXG4gKlxuICogV2hhdCdzIGRpZmZlcmVudCBpcyBgc3Vic2NyaWJlcmAgdGVlcyByZWNvcmRzLCB3cml0aW5nIG91dCB0byBzdG9yYWdlTm9kZS5cbiAqXG4gKiBAdGVtcGxhdGUgW1Q9dW5rbm93bl1cbiAqIEBwYXJhbSB7RVJlZjxTdG9yYWdlTm9kZT59IHN0b3JhZ2VOb2RlXG4gKiBAcGFyYW0ge0VSZWY8TWFyc2hhbGxlcj59IG1hcnNoYWxsZXJcbiAqIEByZXR1cm5zIHtTdG9yZWRQdWJsaXNoS2l0PFQ+fVxuICovJGjigI1fb25jZS5tYWtlU3RvcmVkUHVibGlzaGVyS2l0KG1ha2VTdG9yZWRQdWJsaXNoZXJLaXQpO1xuY29uc3QgICAgICAgIG1ha2VTdG9yZWRQdWJsaXNoS2l0PShzdG9yYWdlTm9kZSxtYXJzaGFsbGVyKT0+e1xuY29uc3R7cHVibGlzaGVyLHN1YnNjcmliZXJ9PW1ha2VQdWJsaXNoS2l0KCk7XG5cbnJldHVybntcbnB1Ymxpc2hlcixcbi8qIHdyYXAgdGhlIHN1YnNjcmliZXIgdG8gdGVlIGV2ZW50cyB0byBzdG9yYWdlKi9cbnN1YnNjcmliZXI6bWFrZVN0b3JlZFN1YnNjcmliZXIoc3Vic2NyaWJlcixzdG9yYWdlTm9kZSxtYXJzaGFsbGVyKX07XG5cbiB9OyRo4oCNX29uY2UubWFrZVN0b3JlZFB1Ymxpc2hLaXQobWFrZVN0b3JlZFB1Ymxpc2hLaXQpO1xuaGFyZGVuKG1ha2VTdG9yZWRQdWJsaXNoS2l0KTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJmb3JFYWNoUHVibGljYXRpb25SZWNvcmQiOlsiZm9yRWFjaFB1YmxpY2F0aW9uUmVjb3JkIl0sIm1ha2VTdG9yZWRTdWJzY3JpYmVyIjpbIm1ha2VTdG9yZWRTdWJzY3JpYmVyIl0sIm1ha2VTdG9yZWRTdWJzY3JpcHRpb24iOlsibWFrZVN0b3JlZFN1YnNjcmlwdGlvbiJdLCJtYWtlU3RvcmVkUHVibGlzaGVyS2l0IjpbIm1ha2VTdG9yZWRQdWJsaXNoZXJLaXQiXSwibWFrZVN0b3JlZFB1Ymxpc2hLaXQiOlsibWFrZVN0b3JlZFB1Ymxpc2hLaXQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAOfuoGiIkAAAiJAAAKAAAAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy9zdWJzY3JpYmUuanN7ImltcG9ydHMiOlsiQGVuZG8vZmFyIiwiQGVuZG8vbWFyc2hhbCIsIkBhZ29yaWMvaW50ZXJuYWwvc3JjL3VwZ3JhZGUtYXBpLmpzIiwiLi90eXBlcy1hbWJpZW50LmpzIl0sImV4cG9ydHMiOlsic3Vic2NyaWJlIiwic3Vic2NyaWJlRWFjaCIsInN1YnNjcmliZUxhdGVzdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBFLEZhcixpc09iamVjdCxpc1VwZ3JhZGVEaXNjb25uZWN0aW9uOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2ZhclwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV0sW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiaXNPYmplY3RcIiwgWyRo4oCNX2EgPT4gKGlzT2JqZWN0ID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvaW50ZXJuYWwvc3JjL3VwZ3JhZGUtYXBpLmpzXCIsIFtbXCJpc1VwZ3JhZGVEaXNjb25uZWN0aW9uXCIsIFskaOKAjV9hID0+IChpc1VwZ3JhZGVEaXNjb25uZWN0aW9uID0gJGjigI1fYSldXV1dLFtcIi4vdHlwZXMtYW1iaWVudC5qc1wiLCBbXV1dKTsgICBcblxuXG5cblxuXG5jb25zdHtkZXRhaWxzOlgsRmFpbH09YXNzZXJ0O1xuY29uc3Qgc2luaz0oKT0+eyB9O1xuXG4vKipcbiAqIENoZWNrIHRoZSBwcm9taXNlIHJldHVybmVkIGJ5IGEgZnVuY3Rpb24gZm9yIHJlamVjdGlvbiBieSB2YXQgdXBncmFkZSxcbiAqIGFuZCByZWZldGNoIHVwb24gZW5jb3VudGVyaW5nIHRoYXQgY29uZGl0aW9uLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0geygpID0+IEVSZWY8VD59IGdldHRlclxuICogQHBhcmFtIHtFUmVmPFQ+W119IFtzZWVkXVxuICogQHJldHVybnMge1Byb21pc2U8VD59XG4gKi9cbmNvbnN0IHJlY29ubmVjdEFzTmVlZGVkPWFzeW5jKGdldHRlcixzZWVkPVtdKT0+e1xubGV0IGRpc2Nvbm5lY3Rpb247XG5sZXQgbGFzdFZlcnNpb249LUluZmluaXR5O1xuLyogRW5kIHN5bmNocm9ub3VzIHByZWx1ZGUuKi9cbmF3YWl0IG51bGw7XG5mb3IobGV0IGk9MDs7aSs9MSl7XG50cnl7XG5jb25zdCByZXN1bHRQPWk8c2VlZC5sZW5ndGg/c2VlZFtpXTpnZXR0ZXIoKTtcbmNvbnN0IHJlc3VsdD1hd2FpdCByZXN1bHRQO1xucmV0dXJuIHJlc3VsdDtcbiB9Y2F0Y2goZXJyKXtcbmlmKGlzVXBncmFkZURpc2Nvbm5lY3Rpb24oZXJyKSl7XG5pZighZGlzY29ubmVjdGlvbil7XG5kaXNjb25uZWN0aW9uPWVycjtcbiB9XG5jb25zdHtpbmNhcm5hdGlvbk51bWJlcjp2ZXJzaW9ufT1lcnI7XG5pZih2ZXJzaW9uPmxhc3RWZXJzaW9uKXtcbi8qIFdlIGRvbid0IGV4cGVjdCBhbm90aGVyIHVwZ3JhZGUgaW4gYmV0d2VlbiByZWNlaXZpbmcqL1xuLyogYSBkaXNjb25uZWN0aW9uIGFuZCByZS1yZXF1ZXN0aW5nIGFuIHVwZGF0ZSwgYnV0IG11c3QqL1xuLyogbmV2ZXJ0aGVsZXNzIGJlIHByZXBhcmVkIGZvciB0aGF0LiovXG5sYXN0VmVyc2lvbj12ZXJzaW9uO1xuY29udGludWU7XG4gfVxuIH1cbi8qIGlmIGBlcnJgIGlzIGFuIChFcnJvcikgb2JqZWN0LCB3ZSBjYW4gdHJ5IHRvIGFzc29jaWF0ZSBpdCB3aXRoKi9cbi8qIGluZm9ybWF0aW9uIGFib3V0IHRoZSBkaXNjb25uZWN0aW9uIHRoYXQgcHJvbXB0ZWQgdGhlIHJlcXVlc3QqL1xuLyogZm9yIHdoaWNoIGl0IGlzIGEgcmVzdWx0LiovXG5pZihpc09iamVjdChlcnIpJiZkaXNjb25uZWN0aW9uJiZkaXNjb25uZWN0aW9uIT09ZXJyKXtcbnRyeXtcbmFzc2VydC5ub3RlKFxuZXJyLFxuWCBgQXR0ZW1wdGluZyB0byByZWNvdmVyIGZyb20gZGlzY29ubmVjdGlvbjogJHtkaXNjb25uZWN0aW9ufWApO1xuXG4gfWNhdGNoKF9lcnIpe1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWVtcHR5Ki9cbiB9XG4gfVxudGhyb3cgZXJyO1xuIH1cbiB9XG4gfTtcblxuLyoqXG4gKiBDcmVhdGUgYSBuZWFyIGl0ZXJhYmxlIHRoYXQgY29ycmVzcG9uZHMgdG8gYSBwb3RlbnRpYWxseSBmYXIgb25lLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8QXN5bmNJdGVyYWJsZUl0ZXJhdG9yPFQ+Pn0gaXRQXG4gKi9cbmNvbnN0ICAgICAgICBzdWJzY3JpYmU9KGl0UCk9PlxuRmFyKCdBc3luY0l0ZXJhYmxlJyx7XG5bU3ltYm9sLmFzeW5jSXRlcmF0b3JdOigpPT57XG5jb25zdCBpdD1FKGl0UClbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCk7XG5jb25zdCBzZWxmPUZhcignQXN5bmNJdGVyYWJsZUl0ZXJhdG9yJyx7XG5bU3ltYm9sLmFzeW5jSXRlcmF0b3JdOigpPT5zZWxmLFxubmV4dDphc3luYygpPT5FKGl0KS5uZXh0KCl9KTtcblxucmV0dXJuIHNlbGY7XG4gfX0pO1xuXG5cbi8qKlxuICogQXN5bmNyb25vdXNseSBpdGVyYXRlcyBvdmVyIHRoZSBjb250ZW50cyBvZiBhIFB1YmxpY2F0aW9uUmVjb3JkIGNoYWluIGFzIHRoZXlcbiAqIGFwcGVhci4gIFRoaXMgaXRlcmF0aW9uIG11c3QgZHJvcCBwYXJ0cyBvZiBwdWJsaWNhdGlvbiByZWNvcmRzIHRoYXQgYXJlIG5vXG4gKiBsb25nZXIgbmVlZGVkIHNvIHRoZXkgY2FuIGJlIGdhcmJhZ2UgY29sbGVjdGVkLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8RWFjaFRvcGljPFQ+Pn0gdG9waWNcbiAqIEBwYXJhbSB7RVJlZjxQdWJsaWNhdGlvblJlY29yZDxUPj59IG5leHRDZWxsUFxuICogICBQdWJsaWNhdGlvblJlY29yZCBjb3JyZXNwb25kaW5nIHdpdGggdGhlIGZpcnN0IGl0ZXJhdGlvbiByZXN1bHRcbiAqIEByZXR1cm5zIHtGb3JrYWJsZUFzeW5jSXRlcmFibGVJdGVyYXRvcjxULCBUPn1cbiAqLyRo4oCNX29uY2Uuc3Vic2NyaWJlKHN1YnNjcmliZSk7XG5jb25zdCBtYWtlRWFjaEl0ZXJhdG9yPSh0b3BpYyxuZXh0Q2VsbFApPT57XG4vKiBUbyB1bmRlcnN0YW5kIHRoZSBpbXBsZW1lbnRhdGlvbiwgc3RhcnQgd2l0aCovXG4vKiBodHRwczovL3dlYi5hcmNoaXZlLm9yZy93ZWIvMjAxNjA0MDQxMjIyNTAvaHR0cDovL3dpa2kuZWNtYXNjcmlwdC5vcmcvZG9rdS5waHA/aWQ9c3RyYXdtYW46Y29uY3VycmVuY3kjaW5maW5pdGVfcXVldWUqL1xuY29uc3Qgc2VsZj1GYXIoJ0VhY2hJdGVyYXRvcicse1xuW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTooKT0+c2VsZixcbm5leHQ6KCk9PntcbmNvbnN0e1xuaGVhZDpyZXN1bHRQLFxucHVibGlzaENvdW50OnB1Ymxpc2hDb3VudFAsXG50YWlsOnRhaWxQfT1cbkUuZ2V0KG5leHRDZWxsUCk7XG5cbi8qIElmIHRhaWxQIGlzIGJyb2tlbiBieSB1cGdyYWRlLCB3ZSB3aWxsIG5lZWQgdG8gcmUtcmVxdWVzdCBpdCovXG4vKiBkaXJlY3RseSBmcm9tIGB0b3BpY2AuKi9cbmNvbnN0IGdldFN1Y2Nlc3Nvcj1hc3luYygpPT57XG5jb25zdCBwdWJsaXNoQ291bnQ9YXdhaXQgcHVibGlzaENvdW50UDtcbmFzc2VydC50eXBlb2YocHVibGlzaENvdW50LCdiaWdpbnQnKTtcbmNvbnN0IHN1Y2Nlc3Nvcj1hd2FpdCBFKHRvcGljKS5zdWJzY3JpYmVBZnRlcihwdWJsaXNoQ291bnQpO1xuY29uc3QgbmV3UHVibGlzaENvdW50PXN1Y2Nlc3Nvci5wdWJsaXNoQ291bnQ7XG5pZihuZXdQdWJsaXNoQ291bnQhPT1wdWJsaXNoQ291bnQrMW4pe1xuRmFpbCBgZWFjaEl0ZXJhdG9yIGJyb2tlbiBieSBnYXAgZnJvbSBwdWJsaXNoQ291bnQgJHtwdWJsaXNoQ291bnR9IHRvICR7bmV3UHVibGlzaENvdW50fWA7XG4gfVxucmV0dXJuIHN1Y2Nlc3NvcjtcbiB9O1xuXG4vKiBSZXBsYWNlIG5leHRDZWxsUCBvbiBldmVyeSBjYWxsIHRvIG5leHQoKSBzbyB0aGluZ3Mgd29yayBldmVuKi9cbi8qIHdpdGggYW4gZWFnZXIgY29uc3VtZXIgdGhhdCBkb2Vzbid0IHdhaXQgZm9yIHJlc3VsdHMgdG8gc2V0dGxlLiovXG5uZXh0Q2VsbFA9cmVjb25uZWN0QXNOZWVkZWQoZ2V0U3VjY2Vzc29yLFt0YWlsUF0pO1xuXG4vKiBBdm9pZCB1bmhhbmRsZWQgcmVqZWN0aW9uIHdhcm5pbmdzIGhlcmUgaWYgdGhlIHByZXZpb3VzIGNlbGwgd2FzIHJlamVjdGVkIG9yKi9cbi8qIHRoZXJlIGlzIG5vIGZ1cnRoZXIgcmVxdWVzdCBvZiB0aGlzIGl0ZXJhdG9yLiovXG4vKiBgdGFpbFBgIGlzIGhhbmRsZWQgaW5zaWRlIGByZWNvbm5lY3RBc05lZWRlZGAgYW5kIGByZXN1bHRQYCBpcyB0aGUgY2FsbGVyJ3MqL1xuLyogY29uY2VybiwgbGVhdmluZyBvbmx5IGBwdWJsaXNoQ291bnRQYCBhbmQgdGhlIG5ldyBgbmV4dENlbGxQYC4qL1xudm9pZCBFLndoZW4ocHVibGlzaENvdW50UCxzaW5rLHNpbmspO1xudm9pZCBFLndoZW4obmV4dENlbGxQLHNpbmssc2luayk7XG5yZXR1cm4gcmVzdWx0UDtcbiB9LFxuZm9yazooKT0+bWFrZUVhY2hJdGVyYXRvcih0b3BpYyxuZXh0Q2VsbFApfSk7XG5cbnJldHVybiBzZWxmO1xuIH07XG5cbi8qKlxuICogR2l2ZW4gYSBsb2NhbCBvciByZW1vdGUgc3Vic2NyaWJlciwgcmV0dXJucyBhIGxvY2FsIEFzeW5jSXRlcmFibGUgd2hpY2hcbiAqIHByb3ZpZGVzIFwicHJlZml4IGxvc3N5XCIgaXRlcmF0aW9ucyBvZiB0aGUgdW5kZXJseWluZyBQdWJsaWNhdGlvbkxpc3QuXG4gKiBCeSBcInByZWZpeCBsb3NzeVwiLCB3ZSBtZWFuIHRoYXQgeW91IG1heSBtaXNzIGV2ZXJ5dGhpbmcgcHVibGlzaGVkIGJlZm9yZVxuICogeW91IGFzayB0aGUgcmV0dXJuZWQgaXRlcmFibGUgZm9yIGFuIGl0ZXJhdG9yLiBCdXQgdGhlIHJldHVybmVkIGl0ZXJhdG9yXG4gKiB3aWxsIGVudW1lcmF0ZSBlYWNoIHRoaW5nIHB1Ymxpc2hlZCBmcm9tIHRoYXQgaXRlcmF0b3IncyBzdGFydGluZyBwb2ludFxuICogdXAgdG8gYSBkaXNjb25uZWN0aW9uIHJlc3VsdCBpbmRpY2F0aW5nIHVwZ3JhZGUgb2YgdGhlIHByb2R1Y2VyXG4gKiAod2hpY2ggYnJlYWtzIHRoZSBnYXAtZnJlZSBndWFyYW50ZWUgYW5kIHRoZXJlZm9yZSB0ZXJtaW5hdGVzIGFueSBhY3RpdmVcbiAqIGl0ZXJhdG9yIHdoaWxlIHN0aWxsIHN1cHBvcnRpbmcgY3JlYXRpb24gb2YgbmV3IGl0ZXJhdG9ycykuXG4gKlxuICogSWYgdGhlIHVuZGVybHlpbmcgUHVibGljYXRpb25MaXN0IGlzIHRlcm1pbmF0ZWQsIHRoYXQgdGVybWluYWwgdmFsdWUgd2lsbCBiZVxuICogcmVwb3J0ZWQgbG9zc2xlc3NseS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPEVhY2hUb3BpYzxUPj59IHRvcGljXG4gKi9cbmNvbnN0ICAgICAgICBzdWJzY3JpYmVFYWNoPSh0b3BpYyk9PntcbmNvbnN0IGl0ZXJhYmxlPUZhcignRWFjaEl0ZXJhYmxlJyx7XG5bU3ltYm9sLmFzeW5jSXRlcmF0b3JdOigpPT57XG5jb25zdCBmaXJzdENlbGxQPXJlY29ubmVjdEFzTmVlZGVkKCgpPT5FKHRvcGljKS5zdWJzY3JpYmVBZnRlcigpKTtcbnJldHVybiBtYWtlRWFjaEl0ZXJhdG9yKHRvcGljLGZpcnN0Q2VsbFApO1xuIH19KTtcblxucmV0dXJuIGl0ZXJhYmxlO1xuIH07JGjigI1fb25jZS5zdWJzY3JpYmVFYWNoKHN1YnNjcmliZUVhY2gpO1xuaGFyZGVuKHN1YnNjcmliZUVhY2gpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8TGF0ZXN0VG9waWM8VD4+fSB0b3BpY1xuICogQHBhcmFtIHtiaWdpbnR9IFtsb2NhbFVwZGF0ZUNvdW50XVxuICogQHBhcmFtIHtJdGVyYXRvclJldHVyblJlc3VsdDxUPn0gW3Rlcm1pbmFsUmVzdWx0XVxuICogQHJldHVybnMge0ZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yPFQsIFQ+fVxuICovXG5jb25zdCBjbG9uZUxhdGVzdEl0ZXJhdG9yPSh0b3BpYyxsb2NhbFVwZGF0ZUNvdW50LHRlcm1pbmFsUmVzdWx0KT0+e1xubGV0IG11dGV4PVByb21pc2UucmVzb2x2ZSgpO1xuXG4vKipcbiAqIFJlcXVlc3QgdGhlIG5leHQgdXBkYXRlIHJlY29yZCBmcm9tIHRoZSB0b3BpYywgdXBkYXRpbmcgb3VyIGxvY2FsIHN0YXRlLFxuICogYW5kIGNvbnZlcnQgaXQgdG8gYW4gaXRlcmF0b3IgcmVzdWx0LlxuICpcbiAqIEByZXR1cm5zIHtQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PFQsIFQ+Pn1cbiAqL1xuY29uc3QgbWF5YmVSZXF1ZXN0TmV4dFJlc3VsdD1hc3luYygpPT57XG5pZih0ZXJtaW5hbFJlc3VsdCl7XG4vKiBXZSd2ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIHRvcGljLCBqdXN0IGtlZXAgcmV0dXJuaW5nIHRoZSBsYXN0IHJlc3VsdCovXG4vKiB3aXRob3V0IGZ1cnRoZXIgcmVxdWVzdHMuKi9cbnJldHVybiB0ZXJtaW5hbFJlc3VsdDtcbiB9XG5cbi8qIFNlbmQgdGhlIG5leHQgcmVxdWVzdCBub3csIHNraXBwaW5nIHBhc3QgaW50ZXJtZWRpYXRlIHVwZGF0ZXMqL1xuLyogYW5kIHVwZ3JhZGUgZGlzY29ubmVjdGlvbnMuKi9cbmNvbnN0e3ZhbHVlLHVwZGF0ZUNvdW50fT1hd2FpdCByZWNvbm5lY3RBc05lZWRlZCgoKT0+XG5FKHRvcGljKS5nZXRVcGRhdGVTaW5jZShsb2NhbFVwZGF0ZUNvdW50KSk7XG5cbi8qIE1ha2Ugc3VyZSB0aGUgbmV4dCByZXF1ZXN0IGlzIGZvciBhIGZyZXNoZXIgdmFsdWUuKi9cbmxvY2FsVXBkYXRlQ291bnQ9dXBkYXRlQ291bnQ7XG5cbi8qIE1ha2UgYW4gSXRlcmF0b3JSZXN1bHQuKi9cbmlmKHVwZGF0ZUNvdW50PT09dW5kZWZpbmVkKXtcbnRlcm1pbmFsUmVzdWx0PWhhcmRlbih7ZG9uZTp0cnVlLHZhbHVlfSk7XG5yZXR1cm4gdGVybWluYWxSZXN1bHQ7XG4gfVxucmV0dXJuIGhhcmRlbih7ZG9uZTpmYWxzZSx2YWx1ZX0pO1xuIH07XG5cbmNvbnN0IHNlbGY9RmFyKCdMYXRlc3RJdGVyYXRvcicse1xuZm9yazooKT0+Y2xvbmVMYXRlc3RJdGVyYXRvcih0b3BpYyxsb2NhbFVwZGF0ZUNvdW50LHRlcm1pbmFsUmVzdWx0KSxcbltTeW1ib2wuYXN5bmNJdGVyYXRvcl06KCk9PnNlbGYsXG5uZXh0OmFzeW5jKCk9Pntcbi8qIEluIHRoaXMgYWRhcHRvciwgb25jZSBgbmV4dCgpYCBpcyBjYWxsZWQgYW5kIHJldHVybnMgYW4gdW5yZXNvbHZlZCovXG4vKiBwcm9taXNlLCBmdXJ0aGVyIGBuZXh0KClgIGNhbGxzIHdpbGwgYWxzbyByZXR1cm4gdW5yZXNvbHZlZCBwcm9taXNlcyovXG4vKiBidXQgZWFjaCBjYWxsIHdpbGwgbm90IHRyaWdnZXIgYW5vdGhlciBgdG9waWNgIHJlcXVlc3QgdW50aWwgdGhlIHByaW9yKi9cbi8qIG9uZSBoYXMgc2V0dGxlZC4qL1xuLyoqL1xuLyogVGhpcyBsaW5lYXIgcXVldWVpbmcgYmVoYXZpb3IgaXMgb25seSBuZWVkZWQgZm9yIGNvZGUgdGhhdCB1c2VzIHRoZSovXG4vKiBhc3luYyBpdGVyYXRvciBwcm90b2NvbCBleHBsaWNpdGx5LiBXaGVuIHRoaXMgYXN5bmMgaXRlcmF0b3IgaXMqL1xuLyogY29uc3VtZWQgYnkgYSBmb3IvYXdhaXQvb2YgbG9vcCwgYG5leHQoKWAgd2lsbCBvbmx5IGJlIGNhbGxlZCBhZnRlciB0aGUqL1xuLyogcHJvbWlzZSBmb3IgdGhlIHByZXZpb3VzIGl0ZXJhdGlvbiByZXN1bHQgaGFzIGZ1bGZpbGxlZC4gSWYgaXQgZnVsZmlsbHMqL1xuLyogd2l0aCBgZG9uZTogdHJ1ZWAsIHRoZSBmb3IvYXdhaXQvb2YgbG9vcCB3aWxsIG5ldmVyIGNhbGwgYG5leHQoKWAqL1xuLyogYWdhaW4uKi9cbi8qKi9cbi8qIFNlZSovXG4vKiBodHRwczovLzJhbGl0eS5jb20vMjAxNi8xMC9hc3luY2hyb25vdXMtaXRlcmF0aW9uLmh0bWwjcXVldWluZy1uZXh0KCktaW52b2NhdGlvbnMqL1xuLyogZm9yIGFuIGV4cGxpY2l0IHVzZSB0aGF0IHNlbmRzIGBuZXh0KClgIHdpdGhvdXQgd2FpdGluZy4qL1xuXG5pZih0ZXJtaW5hbFJlc3VsdCl7XG4vKiBXZSd2ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIHRvcGljLCBqdXN0IGtlZXAgcmV0dXJuaW5nIHRoZSBsYXN0Ki9cbi8qIHJlc3VsdC4qL1xucmV0dXJuIHRlcm1pbmFsUmVzdWx0O1xuIH1cblxuLyogQkVHSU4gQ1JJVElDQUwgU0VDVElPTiAtIHN5bmNocm9ub3VzbHkgZW5xdWV1ZSBhbmQgcmVhc3NpZ24gYG11dGV4YCovXG4vKiovXG4vKiBVc2UgYG11dGV4YCB0byBlbnN1cmUgdGhhdCB3ZSBoYXZlIG5vIG1vcmUgdGhhbiBhIHNpbmdsZSByZXF1ZXN0IGluKi9cbi8qIGZsaWdodC4qL1xuY29uc3QgbmV4dFJlc3VsdD1tdXRleC50aGVuKG1heWJlUmVxdWVzdE5leHRSZXN1bHQpO1xubXV0ZXg9bmV4dFJlc3VsdC50aGVuKHNpbmssc2luayk7XG4vKiBFTkQgQ1JJVElDQUwgU0VDVElPTiovXG5cbnJldHVybiBuZXh0UmVzdWx0O1xuIH19KTtcblxucmV0dXJuIHNlbGY7XG4gfTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPExhdGVzdFRvcGljPFQ+Pn0gdG9waWNcbiAqIEByZXR1cm5zIHtGb3JrYWJsZUFzeW5jSXRlcmFibGVJdGVyYXRvcjxULCBUPn1cbiAqL1xuY29uc3QgbWFrZUxhdGVzdEl0ZXJhdG9yPSh0b3BpYyk9PmNsb25lTGF0ZXN0SXRlcmF0b3IodG9waWMpO1xuXG4vKipcbiAqIEdpdmVuIGEgbG9jYWwgb3IgcmVtb3RlIHN1YnNjcmliZXIsIHJldHVybnMgYSBsb2NhbCBBc3luY0l0ZXJhYmxlIHdoaWNoXG4gKiBwcm92aWRlcyBcImxvc3N5XCIgaXRlcmF0aW9ucyBvZiB0aGUgdW5kZXJseWluZyBQdWJsaWNhdGlvbkxpc3QuXG4gKiBCeSBcImxvc3N5XCIsIHdlIG1lYW4gdGhhdCB5b3UgbWF5IG1pc3MgYW55IHB1Ymxpc2hlZCBzdGF0ZSBpZiBhIG1vcmVcbiAqIHJlY2VudCBwdWJsaXNoZWQgc3RhdGUgY2FuIGJlIHJlcG9ydGVkIGluc3RlYWQuXG4gKlxuICogSWYgdGhlIHVuZGVybHlpbmcgUHVibGljYXRpb25MaXN0IGlzIHRlcm1pbmF0ZWQgYnkgdXBncmFkZSBvZiB0aGUgcHJvZHVjZXIsXG4gKiBpdCB3aWxsIGJlIHJlLXJlcXVlc3RlZC4gQWxsIG90aGVyIHRlcm1pbmFsIHZhbHVlcyB3aWxsIGJlIGxvc3NsZXNzbHlcbiAqIHByb3BhZ2F0ZWQuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxMYXRlc3RUb3BpYzxUPj59IHRvcGljXG4gKi9cbmNvbnN0ICAgICAgICBzdWJzY3JpYmVMYXRlc3Q9KHRvcGljKT0+e1xuY29uc3QgaXRlcmFibGU9RmFyKCdMYXRlc3RJdGVyYWJsZScse1xuW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTooKT0+bWFrZUxhdGVzdEl0ZXJhdG9yKHRvcGljKX0pO1xuXG5yZXR1cm4gaXRlcmFibGU7XG4gfTskaOKAjV9vbmNlLnN1YnNjcmliZUxhdGVzdChzdWJzY3JpYmVMYXRlc3QpO1xuaGFyZGVuKHN1YnNjcmliZUxhdGVzdCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsic3Vic2NyaWJlIjpbInN1YnNjcmliZSJdLCJzdWJzY3JpYmVFYWNoIjpbInN1YnNjcmliZUVhY2giXSwic3Vic2NyaWJlTGF0ZXN0IjpbInN1YnNjcmliZUxhdGVzdCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADMSOGnxQsAAMULAAApAAAAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL3N1YnNjcmliZXIuanN7ImltcG9ydHMiOlsiQGVuZG8vZmFyIiwiLi9zdWJzY3JpYmUuanMiLCIuL3B1Ymxpc2gta2l0LmpzIiwiLi90b3BpYy5qcyIsIi4vdHlwZXMtYW1iaWVudC5qcyJdLCJleHBvcnRzIjpbIm1ha2VTdWJzY3JpcHRpb24iLCJtYWtlU3Vic2NyaXB0aW9uS2l0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEUsRmFyLHN1YnNjcmliZUVhY2gsbWFrZVB1Ymxpc2hLaXQsbWFrZVBpbm5lZEhpc3RvcnlUb3BpYzskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9mYXJcIiwgW1tcIkVcIiwgWyRo4oCNX2EgPT4gKEUgPSAkaOKAjV9hKV1dLFtcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXV1dLFtcIi4vc3Vic2NyaWJlLmpzXCIsIFtbXCJzdWJzY3JpYmVFYWNoXCIsIFskaOKAjV9hID0+IChzdWJzY3JpYmVFYWNoID0gJGjigI1fYSldXV1dLFtcIi4vcHVibGlzaC1raXQuanNcIiwgW1tcIm1ha2VQdWJsaXNoS2l0XCIsIFskaOKAjV9hID0+IChtYWtlUHVibGlzaEtpdCA9ICRo4oCNX2EpXV1dXSxbXCIuL3RvcGljLmpzXCIsIFtbXCJtYWtlUGlubmVkSGlzdG9yeVRvcGljXCIsIFskaOKAjV9hID0+IChtYWtlUGlubmVkSGlzdG9yeVRvcGljID0gJGjigI1fYSldXV1dLFtcIi4vdHlwZXMtYW1iaWVudC5qc1wiLCBbXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8RWFjaFRvcGljPFQ+Pn0gdG9waWNcbiAqIEByZXR1cm5zIHtTdWJzY3JpcHRpb248VD59XG4gKi9cbmNvbnN0IG1ha2VTdWJzY3JpcHRpb249KHRvcGljKT0+e1xuY29uc3Qgc3Vic2NyaXB0aW9uPUZhcignU3Vic2NyaXB0aW9uJyx7XG4uLi5zdWJzY3JpYmVFYWNoKHRvcGljKSxcbnN1YnNjcmliZUFmdGVyOmFzeW5jKHB1Ymxpc2hDb3VudCk9PkUodG9waWMpLnN1YnNjcmliZUFmdGVyKHB1Ymxpc2hDb3VudCksXG5cbi8qKlxuICogVXNlIHRoaXMgdG8gZGlzdHJpYnV0ZSBhIFN1YnNjcmlwdGlvbiBlZmZpY2llbnRseSBvdmVyIHRoZSBuZXR3b3JrLFxuICogYnkgb2J0YWluaW5nIHRoaXMgZnJvbSB0aGUgU3Vic2NyaXB0aW9uIHRvIGJlIHJlcGxpY2F0ZWQsIGFuZCBhcHBseWluZ1xuICogYG1ha2VTdWJzY3JpcHRpb25gIHRvIGl0IGF0IHRoZSBuZXcgc2l0ZSB0byBnZXQgYW4gZXF1aXZhbGVudCBsb2NhbFxuICogU3Vic2NyaXB0aW9uIGF0IHRoYXQgc2l0ZS5cbiAqL1xuZ2V0U2hhcmFibGVTdWJzY3JpcHRpb25JbnRlcm5hbHM6YXN5bmMoKT0+dG9waWMsXG5cbmdldFN0b3JlS2V5OigpPT5oYXJkZW4oe3N1YnNjcmlwdGlvbn0pfSk7XG5cbnJldHVybiBzdWJzY3JpcHRpb247XG4gfTskaOKAjV9vbmNlLm1ha2VTdWJzY3JpcHRpb24obWFrZVN1YnNjcmlwdGlvbik7XG5oYXJkZW4obWFrZVN1YnNjcmlwdGlvbik7XG5cblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBQcm9kdWNlcnMgc2hvdWxkIHVzZVxuICogYGBganNcbiAqIGNvbnN0IHsgcHVibGlzaGVyLCBzdWJzY3JpYmVyIH0gPSBtYWtlUHVibGlzaEtpdCgpO1xuICogY29uc3QgdG9waWMgPSBtYWtlUGlubmVkSGlzdG9yeVRvcGljKHN1YnNjcmliZXIpO1xuICogYGBgXG4gKiBpbnN0ZWFkLCB3aGljaCBtYWtlcyBpdCBjbGVhcmVyIHRoYXQgYWxsIHRoZSBzdWJzY3JpYmVyJ3MgaGlzdG9yeSBpc1xuICogcmV0YWluZWQsIHByZXZlbnRpbmcgR0MuICBQb3RlbnRpYWxseSByZW1vdGUgY29uc3VtZXJzIHVzZVxuICogYGBganNcbiAqIGZvciBhd2FpdCAoY29uc3QgdmFsdWUgb2Ygc3Vic2NyaWJlRWFjaCh0b3BpYykpIHsgLi4uIH1cbiAqIGBgYFxuICpcbiAqIE1ha2VzIGEgYHsgcHVibGljYXRpb24sIHN1YnNjcmlwdGlvbiB9YCBmb3IgZG9pbmcgbG9zc2xlc3MgZWZmaWNpZW50XG4gKiBkaXN0cmlidXRlZCBwdWIvc3ViLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcmV0dXJucyB7U3Vic2NyaXB0aW9uUmVjb3JkPFQ+fVxuICovXG5jb25zdCBtYWtlU3Vic2NyaXB0aW9uS2l0PSgpPT57XG5jb25zdHtwdWJsaXNoZXIsc3Vic2NyaWJlcn09bWFrZVB1Ymxpc2hLaXQoKTtcblxuLyogVGhlIHB1Ymxpc2gga2l0IHN1YnNjcmliZXIgaXMgcHJlZml4LWxvc3N5LCBzbyBtYWtpbmcgKnRoaXMqIHN1YnNjcmliZXIgY29tcGxldGVseSovXG4vKiBsb3NzbGVzcyBmcm9tIGluaXRpYWxpc2F0aW9uIHJlcXVpcmVzIHBpbm5pbmcgdGhlIGZvcm1lcidzIGhpc3RvcnkuKi9cblxuY29uc3QgcGlubmVkSGlzdG9yeVRvcGljPW1ha2VQaW5uZWRIaXN0b3J5VG9waWMoc3Vic2NyaWJlcik7XG5jb25zdCBzdWJzY3JpcHRpb249bWFrZVN1YnNjcmlwdGlvbihwaW5uZWRIaXN0b3J5VG9waWMpO1xuXG4vKiogQHR5cGUge0l0ZXJhdGlvbk9ic2VydmVyPFQ+fSAqL1xuY29uc3QgcHVibGljYXRpb249RmFyKCdwdWJsaWNhdGlvbicse1xudXBkYXRlU3RhdGU6KG5vbkZpbmFsVmFsdWUpPT5wdWJsaXNoZXIucHVibGlzaChub25GaW5hbFZhbHVlKSxcbmZpbmlzaDooY29tcGxldGlvbik9PnB1Ymxpc2hlci5maW5pc2goY29tcGxldGlvbiksXG5mYWlsOihyZWFzb24pPT5wdWJsaXNoZXIuZmFpbChyZWFzb24pfSk7XG5cblxucmV0dXJuIGhhcmRlbih7cHVibGljYXRpb24sc3Vic2NyaXB0aW9ufSk7XG4gfTskaOKAjV9vbmNlLm1ha2VTdWJzY3JpcHRpb25LaXQobWFrZVN1YnNjcmlwdGlvbktpdCk7XG5oYXJkZW4obWFrZVN1YnNjcmlwdGlvbktpdCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVN1YnNjcmlwdGlvbiI6WyJtYWtlU3Vic2NyaXB0aW9uIl0sIm1ha2VTdWJzY3JpcHRpb25LaXQiOlsibWFrZVN1YnNjcmlwdGlvbktpdCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACQjrNDDAYAAAwGAAAkAAAAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL3RvcGljLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2ZhciIsIi4vdHlwZXMtYW1iaWVudC5qcyJdLCJleHBvcnRzIjpbIm1ha2VQaW5uZWRIaXN0b3J5VG9waWMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRmFyOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2ZhclwiLCBbW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dXV0sW1wiLi90eXBlcy1hbWJpZW50LmpzXCIsIFtdXV0pOyAgIFxuXG5cblxuXG4vKipcbiAqIEBkZXByZWNhdGVkIEEgcGlubmVkLWhpc3RvcnkgdG9waWMgcHJlc2VydmVzIGFsbCBvZiBpdHMgcHVibGlzaGVkIHZhbHVlcyBpblxuICogbWVtb3J5LiAgVXNlIGEgcHJlZml4LWxvc3N5IG1ha2VQdWJsaXNoS2l0IGluc3RlYWQuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RWFjaFRvcGljPFQ+ICYgTGF0ZXN0VG9waWM8VD59IHRvcGljIG5lZWRzIHRvIGJlIG5lYXIgaW4gb3JkZXIgdG9cbiAqIHByZXNlcnZlIHN1YnNjcmlwdGlvbiB0aW1pbmdzLiAgVE9ETzogZHJvcCBMYXRlc3RUb3BpYzxUPiByZXF1aXJlbWVudFxuICogQHJldHVybnMge0VhY2hUb3BpYzxUPiAmIExhdGVzdFRvcGljPFQ+fVxuICovXG5jb25zdCAgICAgICAgbWFrZVBpbm5lZEhpc3RvcnlUb3BpYz0odG9waWMpPT57XG4vKiBTdWNoIGxvc3NsZXNzbmVzcyBpbmhpYml0cyBHQywgd2hpY2ggaXMgd2h5IHdlJ3JlIG1vdmluZyBhd2F5IGZyb20gaXQuKi9cblxuLyogV2UgbmVlZCB0byB0YWtlIGFuIGltbWVkaWF0ZSBzbmFwc2hvdCBvZiB0aGUgdG9waWMncyBjdXJyZW50IHN0YXRlLiovXG5jb25zdCBwaW5uZWRQdWJMaXN0PXRvcGljLnN1YnNjcmliZUFmdGVyKCk7XG5cbnJldHVybiBGYXIoJ1Bpbm5lZEhpc3RvcnlUb3BpYycse1xuc3Vic2NyaWJlQWZ0ZXI6YXN5bmMocHVibGlzaENvdW50PS0xbik9PntcbmlmKHB1Ymxpc2hDb3VudD09PS0xbil7XG5yZXR1cm4gcGlubmVkUHViTGlzdDtcbiB9XG5yZXR1cm4gdG9waWMuc3Vic2NyaWJlQWZ0ZXIocHVibGlzaENvdW50KTtcbiB9LFxuZ2V0VXBkYXRlU2luY2U6YXN5bmModXBkYXRlQ291bnQ9dW5kZWZpbmVkKT0+e1xuLyogVE9ETzogQnVpbGQgdGhpcyBvdXQgb2YgRWFjaFRvcGljPFQ+LiovXG5yZXR1cm4gdG9waWMuZ2V0VXBkYXRlU2luY2UodXBkYXRlQ291bnQpO1xuIH19KTtcblxuIH07JGjigI1fb25jZS5tYWtlUGlubmVkSGlzdG9yeVRvcGljKG1ha2VQaW5uZWRIaXN0b3J5VG9waWMpO1xuaGFyZGVuKG1ha2VQaW5uZWRIaXN0b3J5VG9waWMpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VQaW5uZWRIaXN0b3J5VG9waWMiOlsibWFrZVBpbm5lZEhpc3RvcnlUb3BpYyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAD4UQ8TPzAAAD8wAAAsAAAAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL3R5cGVzLWFtYmllbnQuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKiBAamVzc2llLWNoZWNrKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL2ZhcicpLkVSZWY8VD59IEVSZWZcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vcHJvbWlzZS1raXQnKS5Qcm9taXNlS2l0PFQ+fSBQcm9taXNlS2l0XG4gKi9cblxuLyoqXG4gKiBEZXByZWNhdGVkLiBVc2UgUHJvbWlzZUtpdCBpbnN0ZWFkLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vcHJvbWlzZS1raXQnKS5Qcm9taXNlUmVjb3JkPFQ+fSBQcm9taXNlUmVjb3JkXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHRlbXBsYXRlIFtUUmV0dXJuPWFueV1cbiAqIEB0ZW1wbGF0ZSBbVE5leHQ9dW5kZWZpbmVkXVxuICogQHR5cGVkZWYge0FzeW5jSXRlcmF0b3I8VCwgVFJldHVybiwgVE5leHQ+ICYge1xuICogICBmb3JrKCk6IEZvcmthYmxlQXN5bmNJdGVyYXRvcjxULCBUUmV0dXJuLCBUTmV4dD5cbiAqIH19IEZvcmthYmxlQXN5bmNJdGVyYXRvciBBbiBBc3luY0l0ZXJhdG9yIHRoYXQgY2FuIGJlIGZvcmtlZCBhdCBhIGdpdmVuIHBvc2l0aW9uXG4gKiBpbnRvIG11bHRpcGxlIGluZGVwZW5kZW50IEZvcmthYmxlQXN5bmNJdGVyYXRvcnMgc3RhcnRpbmcgZnJvbSB0aGF0IHBvc2l0aW9uLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0ZW1wbGF0ZSBbVFJldHVybj1hbnldXG4gKiBAdGVtcGxhdGUgW1ROZXh0PXVuZGVmaW5lZF1cbiAqIEB0eXBlZGVmIHt7IFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKTogQXN5bmNJdGVyYWJsZUl0ZXJhdG9yPFQsIFRSZXR1cm4sIFROZXh0PiB9fSBBc3luY0l0ZXJhYmxlT25seVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0ZW1wbGF0ZSBbVFJldHVybj1hbnldXG4gKiBAdGVtcGxhdGUgW1ROZXh0PXVuZGVmaW5lZF1cbiAqIEB0eXBlZGVmIHt7XG4gKiAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKTogRm9ya2FibGVBc3luY0l0ZXJhYmxlSXRlcmF0b3I8VCwgVFJldHVybiwgVE5leHQ+LFxuICogICBmb3JrKCk6IEZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yPFQsIFRSZXR1cm4sIFROZXh0PiB9ICZcbiAqICAgRm9ya2FibGVBc3luY0l0ZXJhdG9yPFQsIFRSZXR1cm4sIFROZXh0PlxuICogfSBGb3JrYWJsZUFzeW5jSXRlcmFibGVJdGVyYXRvclxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0ZW1wbGF0ZSBbVFJldHVybj1hbnldXG4gKiBAdGVtcGxhdGUgW1ROZXh0PXVuZGVmaW5lZF1cbiAqIEB0eXBlZGVmIHt7XG4gKiAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl06ICgpID0+IEZvcmthYmxlQXN5bmNJdGVyYXRvcjxULCBUUmV0dXJuLCBUTmV4dD5cbiAqIH19IEZvcmthYmxlQXN5bmNJdGVyYWJsZVxuICogQW4gQXN5bmNJdGVyYWJsZSB0aGF0IHByb2R1Y2VzIEZvcmthYmxlQXN5bmNJdGVyYXRvcnMuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge29iamVjdH0gSXRlcmF0aW9uT2JzZXJ2ZXI8VD5cbiAqIEEgdmFsaWQgc2VxdWVuY2Ugb2YgY2FsbHMgdG8gdGhlIG1ldGhvZHMgb2YgYW4gYEl0ZXJhdGlvbk9ic2VydmVyYFxuICogcmVwcmVzZW50cyBhbiBpdGVyYXRpb24uIEEgdmFsaWQgc2VxdWVuY2UgY29uc2lzdHMgb2YgYW55IG51bWJlciBvZiBjYWxsc1xuICogdG8gYHVwZGF0ZVN0YXRlYCB3aXRoIHRoZSBzdWNjZXNzaXZlIG5vbi1maW5hbCB2YWx1ZXMsIGZvbGxvd2VkIGJ5IGFcbiAqIGZpbmFsIGNhbGwgdG8gZWl0aGVyIGBmaW5pc2hgIHdpdGggYSBzdWNjZXNzZnVsIGBjb21wbGV0aW9uYCB2YWx1ZVxuICogb3IgYGZhaWxgIHdpdGggdGhlIGFsbGVnZWQgYHJlYXNvbmAgZm9yIGZhaWx1cmUuIEFmdGVyIGF0IG1vc3Qgb25lXG4gKiB0ZXJtaW5hdGluZyBjYWxscywgbm8gZnVydGhlciBjYWxscyB0byB0aGVzZSBtZXRob2RzIGFyZSB2YWxpZCBhbmQgbXVzdCBiZVxuICogcmVqZWN0ZWQuXG4gKiBAcHJvcGVydHkgeyhub25GaW5hbFZhbHVlOiBUKSA9PiB2b2lkfSB1cGRhdGVTdGF0ZVxuICogQHByb3BlcnR5IHsoY29tcGxldGlvbjogVCkgPT4gdm9pZH0gZmluaXNoXG4gKiBAcHJvcGVydHkgeyhyZWFzb246IHVua25vd24pID0+IHZvaWR9IGZhaWxcbiAqL1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFB1YmxpY2F0aW9uUmVjb3JkXG4gKiBXaWxsIGJlIHNoYXJlZCBiZXR3ZWVuIG1hY2hpbmVzLCBzbyBpdCBtdXN0IGJlIHNhZmUgdG8gZXhwb3NlLiBCdXQgc29mdHdhcmVcbiAqIG91dHNpZGUgdGhlIGN1cnJlbnQgcGFja2FnZSBzaG91bGQgY29uc2lkZXIgaXQgb3BhcXVlLCBub3QgZGVwZW5kaW5nIG9uIGl0c1xuICogaW50ZXJuYWwgc3RydWN0dXJlLlxuICogQHByb3BlcnR5IHtJdGVyYXRvclJlc3VsdDxUPn0gaGVhZFxuICogQHByb3BlcnR5IHtiaWdpbnR9IHB1Ymxpc2hDb3VudCBzdGFydHMgYXQgMSBmb3IgdGhlIGZpcnN0IHJlc3VsdFxuICogICBhbmQgYWR2YW5jZXMgYnkgMSBmb3IgZWFjaCBzdWJzZXF1ZW50IHJlc3VsdFxuICogQHByb3BlcnR5IHtQcm9taXNlPFB1YmxpY2F0aW9uUmVjb3JkPFQ+Pn0gdGFpbFxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEVhY2hUb3BpY1xuICogQHByb3BlcnR5IHsocHVibGlzaENvdW50PzogYmlnaW50KSA9PiBQcm9taXNlPFB1YmxpY2F0aW9uUmVjb3JkPFQ+Pn0gc3Vic2NyaWJlQWZ0ZXJcbiAqIFJldHVybnMgYSBwcm9taXNlIGZvciBhIFwiY3VycmVudFwiIFB1YmxpY2F0aW9uUmVjb3JkIChyZWZlcmVuY2luZyBpdHNcbiAqIGltbWVkaWF0ZSBzdWNjZXNzb3IgdmlhIGEgYHRhaWxgIHByb21pc2UpIHRoYXQgaXMgbGF0ZXIgdGhhbiB0aGVcbiAqIHByb3ZpZGVkIHB1Ymxpc2hDb3VudC5cbiAqIFVzZWQgdG8gbWFrZSBmb3J3YXJkLWxvc3NsZXNzIChcImVhY2hcIikgaXRlcmF0b3JzLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtGb3JrYWJsZUFzeW5jSXRlcmFibGU8VCwgVD4gJiBFYWNoVG9waWM8VD59IEl0ZXJhYmxlRWFjaFRvcGljXG4gKiBBbiBFYWNoVG9waWMgd2l0aCBkZWZhdWx0IGFzeW5jSXRlcmFibGUgYmVoYXZpb3VyLlxuICpcbiAqIE5PVEU6IHRoZSBwdWJsaWNhdGlvbiByZWNvcmRzIGFuZCBpdGVyYXRvcnMgcmV0dXJuZWQgYnkgdGhpcyBvYmplY3QgYXJlXG4gKiBlcGhlbWVyYWwgYW5kIHdpbGwgYmUgc2V2ZXJlZCBkdXJpbmcgdXBncmFkZS4gIEEgY2FsbGVyIHNob3VsZCB1c2VcbiAqIGBzdWJzY3JpYmVFYWNoYCB0byB3cmFwIHRoaXMgdG9waWMgaW4gYSBsb2NhbCBpdGVyYWJsZSB3aGljaCBhdXRvbWF0aWNhbGx5XG4gKiBhdHRlbXB0cyB0byByZWNvbm5lY3QgdXBvbiBiZWluZyBzZXZlcmVkLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtBc3luY0l0ZXJhYmxlT25seTxULCBUPiAmIExhdGVzdFRvcGljPFQ+fSBJdGVyYWJsZUxhdGVzdFRvcGljXG4gKiBBIExhdGVzdFRvcGljIHdpdGggZGVmYXVsdCBhc3luY0l0ZXJhYmxlIGJlaGF2aW91ci5cbiAqXG4gKiBOT1RFOiB0aGUgaXRlcmF0b3JzIHJldHVybmVkIGJ5IHRoaXMgb2JqZWN0IGFyZSBlcGhlbWVyYWwgYW5kIHdpbGwgYmUgc2V2ZXJlZFxuICogZHVyaW5nIHVwZ3JhZGUuICBBIGNhbGxlciBzaG91bGQgdXNlIGBzdWJzY3JpYmVMYXRlc3RgIHRvIHdyYXAgdGhpcyB0b3BpYyBpblxuICogYSBsb2NhbCBpdGVyYWJsZSB3aGljaCBhdXRvbWF0aWNhbGx5IGF0dGVtcHRzIHRvIHJlY29ubmVjdCB1cG9uIGJlaW5nXG4gKiBzZXZlcmVkLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtvYmplY3R9IExhdGVzdFRvcGljXG4gKiBAcHJvcGVydHkgeyh1cGRhdGVDb3VudD86IGJpZ2ludCB8IG51bWJlcikgPT4gUHJvbWlzZTxVcGRhdGVSZWNvcmQ8VD4+fSBnZXRVcGRhdGVTaW5jZVxuICogUmV0dXJucyBhIHByb21pc2UgZm9yIGFuIHVwZGF0ZSByZWNvcmQgYXMgb2YgYW4gdXBkYXRlIGNvdW50LlxuICogSWYgdGhlIGB1cGRhdGVDb3VudGAgYXJndW1lbnQgaXMgb21pdHRlZCBvciBkaWZmZXJzIGZyb20gdGhlIGN1cnJlbnQgdXBkYXRlIGNvdW50LFxuICogdGhlIHByb21pc2UgcHJvbXB0bHkgcmVzb2x2ZXMgdG8gdGhlIGN1cnJlbnQgcmVjb3JkLlxuICogT3RoZXJ3aXNlLCBhZnRlciB0aGUgbmV4dCBzdGF0ZSBjaGFuZ2UsIHRoZSBwcm9taXNlIHJlc29sdmVzIHRvIHRoZSByZXN1bHRpbmcgcmVjb3JkLlxuICogVGhpcyBpcyBhbiBhdHRlbnVhdGVkIGZvcm0gb2YgYHN1YnNjcmliZUFmdGVyYCB3aG9zZSByZXR1cm4gdmFsdWUgc3RhbmRzIGFsb25lIGFuZFxuICogZG9lcyBub3QgYWxsb3cgY29uc3VtZXJzIHRvIHBpbiBhIGNoYWluIG9mIGhpc3RvcmljYWwgUHVibGljYXRpb25SZWNvcmRzLlxuICogVXNlZCB0byBtYWtlIGxvc3N5IChcImxhdGVzdFwiKSBpdGVyYXRvcnMuXG4gKiBOT1RFOiBVc2Ugb2YgYG51bWJlcmAgYXMgYW4gYHVwZGF0ZUNvdW50YCBpcyBkZXByZWNhdGVkLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtMYXRlc3RUb3BpYzxUPn0gQmFzZU5vdGlmaWVyIFRoaXMgdHlwZSBpcyBkZXByZWNhdGVkIGJ1dCBpcyBzdGlsbFxuICogdXNlZCBleHRlcm5hbGx5LlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtMYXRlc3RUb3BpYzxUPiAmIEVhY2hUb3BpYzxUPn0gU3Vic2NyaWJlclxuICogQSBzdHJlYW0gb2YgcmVzdWx0cyB0aGF0IGFsbG93cyBjb25zdW1lcnMgdG8gY29uZmlndXJlXG4gKiBmb3J3YXJkLWxvc3NsZXNzIFwiZWFjaFwiIGl0ZXJhdGlvbiB3aXRoIGBzdWJzY3JpYmVFYWNoYCBhbmRcbiAqIGxvc3N5IFwibGF0ZXN0XCIgaXRlcmF0aW9uIHdpdGggYHN1YnNjcmliZUxhdGVzdGAuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge29iamVjdH0gUHVibGlzaGVyXG4gKiBBIHZhbGlkIHNlcXVlbmNlIG9mIGNhbGxzIHRvIHRoZSBtZXRob2RzIG9mIGFuIGBJdGVyYXRpb25PYnNlcnZlcmBcbiAqIHJlcHJlc2VudHMgYW4gaXRlcmF0aW9uLiBBIHZhbGlkIHNlcXVlbmNlIGNvbnNpc3RzIG9mIGFueSBudW1iZXIgb2YgY2FsbHNcbiAqIHRvIGBwdWJsaXNoYCB3aXRoIHRoZSBzdWNjZXNzaXZlIG5vbi1maW5hbCB2YWx1ZXMsIGZvbGxvd2VkIGJ5IGFcbiAqIGZpbmFsIGNhbGwgdG8gZWl0aGVyIGBmaW5pc2hgIHdpdGggYSBzdWNjZXNzZnVsIGBjb21wbGV0aW9uYCB2YWx1ZVxuICogb3IgYGZhaWxgIHdpdGggdGhlIGFsbGVnZWQgYHJlYXNvbmAgZm9yIGZhaWx1cmUuIEFmdGVyIGF0IG1vc3Qgb25lXG4gKiB0ZXJtaW5hdGluZyBjYWxscywgbm8gZnVydGhlciBjYWxscyB0byB0aGVzZSBtZXRob2RzIGFyZSB2YWxpZCBhbmQgbXVzdCBiZVxuICogcmVqZWN0ZWQuXG4gKiBAcHJvcGVydHkgeyhub25GaW5hbFZhbHVlOiBUKSA9PiB2b2lkfSBwdWJsaXNoXG4gKiBAcHJvcGVydHkgeyhjb21wbGV0aW9uOiBUKSA9PiB2b2lkfSBmaW5pc2hcbiAqIEBwcm9wZXJ0eSB7KHJlYXNvbjogYW55KSA9PiB2b2lkfSBmYWlsXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge1BhcnRpYWw8UHVibGlzaGVyPFQ+Pn0gUHVibGlzaE9ic2VydmVyXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge29iamVjdH0gUHVibGlzaEtpdDxUPlxuICogQHByb3BlcnR5IHtQdWJsaXNoZXI8VD59IHB1Ymxpc2hlclxuICogQHByb3BlcnR5IHtTdWJzY3JpYmVyPFQ+fSBzdWJzY3JpYmVyXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge29iamVjdH0gU3RvcmVkUHVibGlzaEtpdDxUPlxuICogQHByb3BlcnR5IHtQdWJsaXNoZXI8VD59IHB1Ymxpc2hlclxuICogQHByb3BlcnR5IHtTdG9yZWRTdWJzY3JpYmVyPFQ+fSBzdWJzY3JpYmVyXG4gKi9cblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsnbWFuZGF0b3J5JyB8ICdvcHBvcnR1bmlzdGljJyB8ICdpZ25vcmVkJ30gRHVyYWJsZVB1Ymxpc2hLaXRWYWx1ZUR1cmFiaWxpdHlcbiAqXG4gKiBEdXJhYmlsaXR5IGNvbmZpZ3VyZXMgY29uc3RyYWludHMgb24gbm9uLXRlcm1pbmFsIHZhbHVlcyB0aGF0IGNhbiBiZVxuICogcHVibGlzaGVkIHRvIGEgZHVyYWJsZSBwdWJsaXNoIGtpdCAodGVybWluYWwgdmFsdWVzIHNlbnQgdG8gZmluaXNoIG9yIGZhaWxcbiAqIG11c3QgYWx3YXlzIGJlIGR1cmFibGUpLlxuICogLSAnbWFuZGF0b3J5JyBtZWFucyB0aGF0IGVhY2ggdmFsdWUgbXVzdCBiZSBkdXJhYmxlLCBzbyBpdCBjYW4gYmUgcmVzdG9yZWRcbiAqICAgb24gdXBncmFkZS5cbiAqIC0gJ29wcG9ydHVuaXN0aWMnIG1lYW5zIHRoYXQgYSBkdXJhYmxlIHZhbHVlIGlzIHBlcnNpc3RlZCBmb3IgcG9zdC11cGdyYWRlXG4gKiAgIHJlc3RvcmF0aW9uLCBidXQgYSBub24tZHVyYWJsZSB2YWx1ZSBpcyBzdGlsbCBhY2NlcHRlZCAoYW5kIHdpbGwgcmVzdWx0IGluXG4gKiAgIHZhbHVlbGVzcyByZXN0b3JhdGlvbikuXG4gKiAtICdpZ25vcmVkJyBtZWFucyB0aGF0IGEgdmFsdWUgaXMgbm90IHBlcnNpc3RlZCBmb3IgcmVzdG9yYXRpb24gZXZlbiBpZiBpdFxuICogICBpcyBkdXJhYmxlLlxuICpcbiAqICdtYW5kYXRvcnknIGlzIHRoZSBvbmx5IGN1cnJlbnRseS1zdXBwb3J0ZWQgdmFsdWUsIGFuZCBvdGhlcnMgbXVzdCBub3QgYmVcbiAqIGVuYWJsZWQgd2l0aG91dCB0ZXN0IGNvdmVyYWdlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRHVyYWJsZVB1Ymxpc2hLaXRTdGF0ZVxuICpcbiAqIEBwcm9wZXJ0eSB7RHVyYWJsZVB1Ymxpc2hLaXRWYWx1ZUR1cmFiaWxpdHl9IHZhbHVlRHVyYWJpbGl0eVxuICpcbiAqIEBwcm9wZXJ0eSB7YmlnaW50fSBwdWJsaXNoQ291bnRcbiAqXG4gKiBAcHJvcGVydHkgeydsaXZlJyB8ICdmaW5pc2hlZCcgfCAnZmFpbGVkJ30gc3RhdHVzXG4gKlxuICogQHByb3BlcnR5IHtib29sZWFufSBoYXNWYWx1ZVxuICogaGFzVmFsdWUgaW5kaWNhdGVzIHRoZSBwcmVzZW5jZSBvZiB2YWx1ZS4gSXQgc3RhcnRzIG9mZiBmYWxzZSxcbiAqIGFuZCBjYW4gYmUgcmVzZXQgdG8gZmFsc2Ugd2hlbiBhIGR1cmFibGUgcHVibGlzaCBraXQgaXMgcmVzdG9yZWQgYW5kXG4gKiB0aGUgcHJldmlvdXMgdmFsdWUgd2FzIG5vdCBkdXJhYmxlLCBvciBub24tdGVybWluYWwgYW5kIHZhbHVlRHVyYWJsaXR5IGlzICdpZ25vcmVkJy5cbiAqXG4gKiBAcHJvcGVydHkge2FueX0gdmFsdWVcbiAqIHZhbHVlIGhvbGRzIGVpdGhlciBhIG5vbi10ZXJtaW5hbCB2YWx1ZSBmcm9tIGBwdWJsaXNoYCBvciBhIHRlcm1pbmFsIHZhbHVlXG4gKiBmcm9tIGBmaW5pc2hgIG9yIGBmYWlsYCwgZGVwZW5kaW5nIHVwb24gdGhlIHZhbHVlIGluIHN0YXR1cy5cbiAqL1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFVwZGF0ZVJlY29yZDxUPlxuICogQHByb3BlcnR5IHtUfSB2YWx1ZSBpcyB3aGF0ZXZlciBzdGF0ZSB0aGUgc2VydmljZSB3YW50cyB0byBwdWJsaXNoXG4gKiBAcHJvcGVydHkge2JpZ2ludH0gW3VwZGF0ZUNvdW50XSBpcyBhIHZhbHVlIHRoYXQgaWRlbnRpZmllcyB0aGUgdXBkYXRlLiAgRm9yXG4gKiB0aGUgbGFzdCB1cGRhdGUsIGl0IGlzIGB1bmRlZmluZWRgLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtCYXNlTm90aWZpZXI8VD59IE5vdGlmaWVySW50ZXJuYWxzIFdpbGwgYmUgc2hhcmVkIGJldHdlZW4gbWFjaGluZXMsXG4gKiBzbyBpdCBtdXN0IGJlIHNhZmUgdG8gZXhwb3NlLiBCdXQgb3RoZXIgc29mdHdhcmUgc2hvdWxkIGF2b2lkIGRlcGVuZGluZyBvblxuICogaXRzIGludGVybmFsIHN0cnVjdHVyZS5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7Tm90aWZpZXJJbnRlcm5hbHM8VD4gJlxuICogICBGb3JrYWJsZUFzeW5jSXRlcmFibGU8VCwgVD4gJlxuICogICBTaGFyYWJsZU5vdGlmaWVyPFQ+XG4gKiB9IE5vdGlmaWVyPFQ+IGFuIG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIHRvIGdldCB0aGUgY3VycmVudCBzdGF0ZSBvciB1cGRhdGVzXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge29iamVjdH0gU2hhcmFibGVOb3RpZmllclxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPE5vdGlmaWVySW50ZXJuYWxzPFQ+Pn0gZ2V0U2hhcmFibGVOb3RpZmllckludGVybmFsc1xuICogVXNlZCB0byByZXBsaWNhdGUgdGhlIG11bHRpY2FzdCB2YWx1ZXMgYXQgb3RoZXIgc2l0ZXMuIFRvIG1hbnVhbGx5IGNyZWF0ZSBhXG4gKiBsb2NhbCByZXByZXNlbnRhdGl2ZSBvZiBhIE5vdGlmaWNhdGlvbiwgZG9cbiAqIGBgYGpzXG4gKiBsb2NhbEl0ZXJhYmxlID1cbiAqICAgbWFrZU5vdGlmaWVyKEUocmVtb3RlSXRlcmFibGUpLmdldFNoYXJhYmxlTm90aWZpZXJJbnRlcm5hbHMoKSk7XG4gKiBgYGBcbiAqIFRoZSByZXN1bHRpbmcgYGxvY2FsSXRlcmFibGVgIGFsc28gc3VwcG9ydHMgc3VjaCByZW1vdGUgdXNlLCBhbmRcbiAqIHdpbGwgcmV0dXJuIGFjY2VzcyB0byB0aGUgc2FtZSByZXByZXNlbnRhdGlvbi5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBOb3RpZmllclJlY29yZDxUPiB0aGUgcHJvZHVjZWQgbm90aWZpZXIvdXBkYXRlciBwYWlyXG4gKiBAcHJvcGVydHkge0l0ZXJhdGlvbk9ic2VydmVyPFQ+fSB1cGRhdGVyIHRoZSAoY2xvc2VseS1oZWxkKSBub3RpZmllciBwcm9kdWNlclxuICogQHByb3BlcnR5IHtOb3RpZmllcjxUPn0gbm90aWZpZXIgdGhlICh3aWRlbHktaGVsZCkgbm90aWZpZXIgY29uc3VtZXJcbiAqL1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtJdGVyYWJsZUVhY2hUb3BpYzxUPiAmIEVhY2hUb3BpYzxUPiAmXG4gKiAgIFNoYXJhYmxlU3Vic2NyaXB0aW9uPFQ+fSBTdWJzY3JpcHRpb248VD5cbiAqIEEgZm9ybSBvZiBBc3luY0l0ZXJhYmxlIHN1cHBvcnRpbmcgZGlzdHJpYnV0ZWQgYW5kIG11bHRpY2FzdCB1c2FnZS5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTaGFyYWJsZVN1YnNjcmlwdGlvblxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPEVhY2hUb3BpYzxUPj59IGdldFNoYXJhYmxlU3Vic2NyaXB0aW9uSW50ZXJuYWxzXG4gKiBVc2VkIHRvIHJlcGxpY2F0ZSB0aGUgbXVsdGljYXN0IHZhbHVlcyBhdCBvdGhlciBzaXRlcy4gVG8gbWFudWFsbHkgY3JlYXRlIGFcbiAqIGxvY2FsIHJlcHJlc2VudGF0aXZlIG9mIGEgU3Vic2NyaXB0aW9uLCBkb1xuICogYGBganNcbiAqIGxvY2FsSXRlcmFibGUgPVxuICogICBtYWtlU3Vic2NyaXB0aW9uKEUocmVtb3RlSXRlcmFibGUpLmdldFNoYXJhYmxlU3Vic2NyaXB0aW9uSW50ZXJuYWxzKCkpO1xuICogYGBgXG4gKiBUaGUgcmVzdWx0aW5nIGBsb2NhbEl0ZXJhYmxlYCBhbHNvIHN1cHBvcnRzIHN1Y2ggcmVtb3RlIHVzZSwgYW5kXG4gKiB3aWxsIHJldHVybiBhY2Nlc3MgdG8gdGhlIHNhbWUgcmVwcmVzZW50YXRpb24uXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge29iamVjdH0gU3Vic2NyaXB0aW9uUmVjb3JkPFQ+XG4gKiBAcHJvcGVydHkge0l0ZXJhdGlvbk9ic2VydmVyPFQ+fSBwdWJsaWNhdGlvblxuICogQHByb3BlcnR5IHtTdWJzY3JpcHRpb248VD59IHN1YnNjcmlwdGlvblxuICovXG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqIEB0ZW1wbGF0ZSBbU2xvdD11bmtub3duXSBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vbWFyc2hhbCcpLk1hcnNoYWw8U2xvdD59IE1hcnNoYWxsZXIgKi9cbi8qKiBAdHlwZWRlZiB7UGljazxNYXJzaGFsbGVyLCAnZnJvbUNhcERhdGEnPn0gVW5zZXJpYWxpemVyICovXG5cbi8qKlxuICogRGVmaW5lZCBieSB2c3RvcmFnZVN0b3JlS2V5IGluIHZzdG9yYWdlLmdvXG4gKlxuICogQHR5cGVkZWYgVlN0b3JhZ2VLZXlcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzdG9yZU5hbWVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzdG9yZVN1YmtleVxuICogQHByb3BlcnR5IHtzdHJpbmd9IGRhdGFQcmVmaXhCeXRlc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IFtub0RhdGFWYWx1ZV1cbiAqL1xuXG4vKipcbiAqIFRoaXMgcmVwcmVzZW50cyBhIG5vZGUgaW4gYW4gSUFWTCB0cmVlLlxuICpcbiAqIFRoZSBhY3RpdmUgaW1wbGVtZW50YXRpb24gaXMgeC92c3RvcmFnZSwgYW4gQWdvcmljIGV4dGVuc2lvbiBvZiB0aGUgQ29zbW9zIFNESy5cbiAqXG4gKiBWc3RvcmFnZSBpcyBhIGhpZXJhcmNoaWNhbCBleHRlcm5hbGx5LXJlYWNoYWJsZSBzdG9yYWdlIHN0cnVjdHVyZSB0aGF0XG4gKiBpZGVudGlmaWVzIGNoaWxkcmVuIGJ5IHJlc3RyaWN0ZWQgQVNDSUkgbmFtZSBhbmQgaXMgYXNzb2NpYXRlZCB3aXRoIGFyYml0cmFyeVxuICogc3RyaW5nLXZhbHVlZCBkYXRhIGZvciBlYWNoIG5vZGUsIGRlZmF1bHRpbmcgdG8gdGhlIGVtcHR5IHN0cmluZy5cbiAqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTdG9yYWdlTm9kZVxuICogQHByb3BlcnR5IHsoZGF0YTogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+fSBzZXRWYWx1ZSBwdWJsaXNoZXMgc29tZSBkYXRhIChhcHBlbmQgdG8gdGhlIG5vZGUpXG4gKiBAcHJvcGVydHkgeygpID0+IHN0cmluZ30gZ2V0UGF0aCB0aGUgY2hhaW4gc3RvcmFnZSBwYXRoIGF0IHdoaWNoIHRoZSBub2RlIHdhcyBjb25zdHJ1Y3RlZFxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPFZTdG9yYWdlS2V5Pn0gZ2V0U3RvcmVLZXkgREVQUkVDQVRFRCB1c2UgZ2V0UGF0aFxuICogQHByb3BlcnR5IHsoc3ViUGF0aDogc3RyaW5nLCBvcHRpb25zPzoge3NlcXVlbmNlPzogYm9vbGVhbn0pID0+IFN0b3JhZ2VOb2RlfSBtYWtlQ2hpbGROb2RlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTdG9yZWRGYWNldFxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPHN0cmluZz59IGdldFBhdGggdGhlIGNoYWluIHN0b3JhZ2UgcGF0aCBhdCB3aGljaCB0aGUgbm9kZSB3YXMgY29uc3RydWN0ZWRcbiAqIEBwcm9wZXJ0eSB7U3RvcmFnZU5vZGVbJ2dldFN0b3JlS2V5J119IGdldFN0b3JlS2V5IERFUFJFQ0FURUQgdXNlIGdldFBhdGhcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gVW5zZXJpYWxpemVyfSBnZXRVbnNlcmlhbGl6ZXIgZ2V0IHRoZSB1bnNlcmlhbGl6ZXIgZm9yIHRoZSBzdG9yZWQgZGF0YVxuICovXG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgdXNlIFN0b3JlZFN1YnNjcmliZXJcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7U3Vic2NyaXB0aW9uPFQ+ICYge1xuICogICBnZXRTdG9yZUtleTogKCkgPT4gUHJvbWlzZTxWU3RvcmFnZUtleSAmIHsgc3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb248VD4gfT4sXG4gKiAgIGdldFVuc2VyaWFsaXplcjogKCkgPT4gVW5zZXJpYWxpemVyLFxuICogfX0gU3RvcmVkU3Vic2NyaXB0aW9uXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge1N1YnNjcmliZXI8VD4gJiBTdG9yZWRGYWNldH0gU3RvcmVkU3Vic2NyaWJlclxuICovXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAD5iXDZcAQAAXAEAACAAAABAYWdvcmljL3N0b3JlLXYwLjkuMi9leHBvcnRlZC5qc3siaW1wb3J0cyI6WyIuL3NyYy90eXBlcy5qcyJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL3NyYy90eXBlcy5qc1wiLCBbXV1dKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAANtv5KiMMAAAjDAAAIQAAAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy9pbmRleC5qc3siaW1wb3J0cyI6WyJAZW5kby9wYXR0ZXJucyIsIkBlbmRvL2V4byIsIi4vc3RvcmVzL3NjYWxhcldlYWtTZXRTdG9yZS5qcyIsIi4vc3RvcmVzL3NjYWxhclNldFN0b3JlLmpzIiwiLi9zdG9yZXMvc2NhbGFyV2Vha01hcFN0b3JlLmpzIiwiLi9zdG9yZXMvc2NhbGFyTWFwU3RvcmUuanMiLCIuL3N0b3Jlcy9zdG9yZS11dGlscy5qcyIsIi4vbGVnYWN5L2xlZ2FjeU1hcC5qcyIsIi4vbGVnYWN5L2xlZ2FjeVdlYWtNYXAuanMiXSwiZXhwb3J0cyI6WyJhc3NlcnRLZXkiLCJhc3NlcnRLZXkiLCJkZWZpbmVFeG9DbGFzcyIsImRlZmluZUV4b0NsYXNzIiwiaXNDb3B5TWFwIiwiaXNDb3B5TWFwIixudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbF0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbW1wiQGVuZG8vcGF0dGVybnNcIiwgW11dLFtcIkBlbmRvL2V4b1wiLCBbXV0sW1wiLi9zdG9yZXMvc2NhbGFyV2Vha1NldFN0b3JlLmpzXCIsIFtdXSxbXCIuL3N0b3Jlcy9zY2FsYXJTZXRTdG9yZS5qc1wiLCBbXV0sW1wiLi9zdG9yZXMvc2NhbGFyV2Vha01hcFN0b3JlLmpzXCIsIFtdXSxbXCIuL3N0b3Jlcy9zY2FsYXJNYXBTdG9yZS5qc1wiLCBbXV0sW1wiLi9zdG9yZXMvc3RvcmUtdXRpbHMuanNcIiwgW11dLFtcIi4vbGVnYWN5L2xlZ2FjeU1hcC5qc1wiLCBbXV0sW1wiLi9sZWdhY3kvbGVnYWN5V2Vha01hcC5qc1wiLCBbXV1dKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyJAZW5kby9wYXR0ZXJucyI6W1siaXNLZXkiLCJpc0tleSJdLFsiYXNzZXJ0S2V5IiwiYXNzZXJ0S2V5Il0sWyJhc3NlcnRTY2FsYXJLZXkiLCJhc3NlcnRTY2FsYXJLZXkiXSxbIm1ha2VDb3B5U2V0IiwibWFrZUNvcHlTZXQiXSxbImdldENvcHlTZXRLZXlzIiwiZ2V0Q29weVNldEtleXMiXSxbIm1ha2VDb3B5QmFnIiwibWFrZUNvcHlCYWciXSxbIm1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzIiwibWFrZUNvcHlCYWdGcm9tRWxlbWVudHMiXSxbImdldENvcHlCYWdFbnRyaWVzIiwiZ2V0Q29weUJhZ0VudHJpZXMiXSxbIm1ha2VDb3B5TWFwIiwibWFrZUNvcHlNYXAiXSxbImdldENvcHlNYXBFbnRyaWVzIiwiZ2V0Q29weU1hcEVudHJpZXMiXSxbImNvZXJjZVRvRWxlbWVudHMiLCJjb2VyY2VUb0VsZW1lbnRzIl0sWyJjb2VyY2VUb0JhZ0VudHJpZXMiLCJjb2VyY2VUb0JhZ0VudHJpZXMiXSxbImNvbXBhcmVLZXlzIiwiY29tcGFyZUtleXMiXSxbImtleUxUIiwia2V5TFQiXSxbImtleUxURSIsImtleUxURSJdLFsia2V5RVEiLCJrZXlFUSJdLFsia2V5R1RFIiwia2V5R1RFIl0sWyJrZXlHVCIsImtleUdUIl0sWyJlbGVtZW50c0lzU3VwZXJzZXQiLCJlbGVtZW50c0lzU3VwZXJzZXQiXSxbImVsZW1lbnRzSXNEaXNqb2ludCIsImVsZW1lbnRzSXNEaXNqb2ludCJdLFsiZWxlbWVudHNDb21wYXJlIiwiZWxlbWVudHNDb21wYXJlIl0sWyJlbGVtZW50c1VuaW9uIiwiZWxlbWVudHNVbmlvbiJdLFsiZWxlbWVudHNEaXNqb2ludFVuaW9uIiwiZWxlbWVudHNEaXNqb2ludFVuaW9uIl0sWyJlbGVtZW50c0ludGVyc2VjdGlvbiIsImVsZW1lbnRzSW50ZXJzZWN0aW9uIl0sWyJlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QiLCJlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QiXSxbInNldElzU3VwZXJzZXQiLCJzZXRJc1N1cGVyc2V0Il0sWyJzZXRJc0Rpc2pvaW50Iiwic2V0SXNEaXNqb2ludCJdLFsic2V0Q29tcGFyZSIsInNldENvbXBhcmUiXSxbInNldFVuaW9uIiwic2V0VW5pb24iXSxbInNldERpc2pvaW50VW5pb24iLCJzZXREaXNqb2ludFVuaW9uIl0sWyJzZXRJbnRlcnNlY3Rpb24iLCJzZXRJbnRlcnNlY3Rpb24iXSxbInNldERpc2pvaW50U3VidHJhY3QiLCJzZXREaXNqb2ludFN1YnRyYWN0Il0sWyJiYWdJc1N1cGVyYmFnIiwiYmFnSXNTdXBlcmJhZyJdLFsiYmFnQ29tcGFyZSIsImJhZ0NvbXBhcmUiXSxbImJhZ1VuaW9uIiwiYmFnVW5pb24iXSxbImJhZ0ludGVyc2VjdGlvbiIsImJhZ0ludGVyc2VjdGlvbiJdLFsiYmFnRGlzam9pbnRTdWJ0cmFjdCIsImJhZ0Rpc2pvaW50U3VidHJhY3QiXSxbIk0iLCJNIl0sWyJnZXRSYW5rQ292ZXIiLCJnZXRSYW5rQ292ZXIiXSxbImlzUGF0dGVybiIsImlzUGF0dGVybiJdLFsiYXNzZXJ0UGF0dGVybiIsImFzc2VydFBhdHRlcm4iXSxbIm1hdGNoZXMiLCJtYXRjaGVzIl0sWyJtdXN0TWF0Y2giLCJtdXN0TWF0Y2giXV0sIkBlbmRvL2V4byI6W1siaW5pdEVtcHR5IiwiaW5pdEVtcHR5Il0sWyJkZWZpbmVFeG9DbGFzcyIsImRlZmluZUV4b0NsYXNzIl0sWyJkZWZpbmVFeG9DbGFzc0tpdCIsImRlZmluZUV4b0NsYXNzS2l0Il0sWyJtYWtlRXhvIiwibWFrZUV4byJdXSwiLi9zdG9yZXMvc2NhbGFyV2Vha1NldFN0b3JlLmpzIjpbWyJtYWtlU2NhbGFyV2Vha1NldFN0b3JlIiwibWFrZVNjYWxhcldlYWtTZXRTdG9yZSJdXSwiLi9zdG9yZXMvc2NhbGFyU2V0U3RvcmUuanMiOltbIm1ha2VTY2FsYXJTZXRTdG9yZSIsIm1ha2VTY2FsYXJTZXRTdG9yZSJdXSwiLi9zdG9yZXMvc2NhbGFyV2Vha01hcFN0b3JlLmpzIjpbWyJtYWtlU2NhbGFyV2Vha01hcFN0b3JlIiwibWFrZVNjYWxhcldlYWtNYXBTdG9yZSJdXSwiLi9zdG9yZXMvc2NhbGFyTWFwU3RvcmUuanMiOltbIm1ha2VTY2FsYXJNYXBTdG9yZSIsIm1ha2VTY2FsYXJNYXBTdG9yZSJdXSwiLi9zdG9yZXMvc3RvcmUtdXRpbHMuanMiOltbInByb3ZpZGVMYXp5IiwicHJvdmlkZUxhenkiXSxbImlzQ29weU1hcCIsImlzQ29weU1hcCJdLFsiaXNDb3B5U2V0IiwiaXNDb3B5U2V0Il1dLCIuL2xlZ2FjeS9sZWdhY3lNYXAuanMiOltbIm1ha2VMZWdhY3lNYXAiLCJtYWtlTGVnYWN5TWFwIl1dLCIuL2xlZ2FjeS9sZWdhY3lXZWFrTWFwLmpzIjpbWyJtYWtlTGVnYWN5V2Vha01hcCIsIm1ha2VMZWdhY3lXZWFrTWFwIl1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADo7WSpMgsAADILAAAsAAAAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL2xlZ2FjeS9sZWdhY3lNYXAuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9hc3NlcnQiLCIuLi90eXBlcy5qcyJdLCJleHBvcnRzIjpbIm1ha2VMZWdhY3lNYXAiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgcSxGYWlsOyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvYXNzZXJ0XCIsIFtbXCJxXCIsIFskaOKAjV9hID0+IChxID0gJGjigI1fYSldXSxbXCJGYWlsXCIsIFskaOKAjV9hID0+IChGYWlsID0gJGjigI1fYSldXV1dLFtcIi4uL3R5cGVzLmpzXCIsIFtdXV0pOyAgIFxuXG5cblxuLyoqXG4gKiBUaGlzIG1vZHVsZSBhbmQgaXRzIGZyYXRlcm5hbCBzaWJsaW5nIGxlZ2FjeVdlYWtNYXAgZXhpc3Qgb25seSB0byBlYXNlIGFcbiAqIHRyYW5zaXRpb24gdG8gdGhlIG1vZGVybiBgc3RvcmVgIHN5c3RlbSwgYXJlIGRlcHJlY2F0ZWQsIGFuZCB3aWxsIGV2ZW50dWFsbHlcbiAqIGRpc2FwcGVhci4gVGhleSBhcmUgbmVlZGVkIGZvciBub3cgdG8gc3VwcG9ydCBzb21lIG9mIHRoZSB1c2VzIG9mIHRoZSBvbGRcbiAqIGJlaGF2aW9yIHRoYXQgYXJlIG5vdCBjb21wYXRpYmxlIHdpdGggdGhlIG5ldy4gVGhlIGNvbnN0cmFpbnQgaW1wb3NlZCBieSB0aGVcbiAqIG5ldyBpcyB0aGF0IG9ubHkgcGFzc2FibGVzIGNhbiBiZSB1c2VkIGFzIHZhbHVlcywgYW5kIG9ubHkga2V5cyAocm91Z2hseSxcbiAqIHN0cnVjdHVyZXMsIGFrYSBjb21wYXJhYmxlcykgY2FuIGJlIHVzZWQgYXMgdmFsdWVzLlxuICpcbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvcHVsbC8zNTY3XG4gKlxuICogVE9ETyBPbmNlIHRoYXQgUFIgaXMgbWVyZ2VkLCBsaW5rIHRvIHRoZSBkb2N1bWVudHMgcmF0aGVyIHRoYW4gdGhlIFBScy5cbiAqXG4gKiBFYWNoIG9mIHRoZXNlIG5vbi1jb25mb3JtaW5nIHVzZXMgc2hvdWxkIGJlIG1hcmtlZCB3aXRoIGFcbiAqXG4gKiBgYGBqc1xuICogLy8gTGVnYWN5IGJlY2F1c2UuLi5cbiAqIGBgYFxuICpcbiAqIGNvbW1lbnQgZXhwbGFpbmluZyB0aGUgcHJvYmxlbSBpbmhpYml0aW5nIGNvbnZlcnNpb24gdG8gdGhlIG5ldyBzeXN0ZW0uIFNvbWVcbiAqIG9mIHRoZXNlIHByb2JsZW1zIGFzIG9mIHRoaXMgd3JpdGluZzpcbiAqXG4gKiAtIEEgcHJvbWlzZUtpdCB1c2VkIGFzIGEgdmFsdWUsIGV2ZW4gdGhvdWdoIGEgcHJvbWlzZUtpdCBpcyBub3QgYSBwYXNzYWJsZS5cbiAqICAgU29sdXRpb25zIGFyZSB0byBtYWtlIGl0IGEgcGFzc2FibGUsIG9yIHRvIGNvbnZlcnQgdGhlIGNvbnRhaW5lciBiYWNrIHRvIGFcbiAqICAgY29udmVudGlvbmFsIEphdmFTY3JpcHQgTWFwLlxuICogLSBBIG11dGFibGUgYXJyYXkgdXNlZCBhcyBhIHZhbHVlLCB0aGF0IGlzIHN1YnNlcXVlbnRseSBtdXRhdGVkLiBGcmVlemluZyB0aGVcbiAqICAgYXJyYXkgd291bGRuJ3Qgd29yayBvZiBjb3Vyc2UgYmVjYXVzZSBpdCB3b3VsZCBicmVhayB0aGUgc3Vic2VxdWVudFxuICogICBtdXRhdGlvbi4gVXNpbmcgYSBmYXIgb2JqZWN0IHdyYXBwaW5nIGFuIGFycmF5IHdvdWxkIGxpa2VseSB3b3JrIGZpbmUuXG4gKlxuICogQGRlcHJlY2F0ZWQgc3dpdGNoIHRvIFNjYWxhck1hcCBpZiBwb3NzaWJsZSwgTWFwIG90aGVyd2lzZVxuICogQHRlbXBsYXRlIEssVlxuICogQHBhcmFtIHtzdHJpbmd9IFt0YWddIC0gdGFnIGZvciBkZWJ1Z2dpbmdcbiAqIEByZXR1cm5zIHtMZWdhY3lNYXA8SywgVj59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlTGVnYWN5TWFwPSh0YWc9J2tleScpPT57XG5jb25zdCBtPW5ldyBNYXAoKTtcbmNvbnN0IGFzc2VydEtleURvZXNOb3RFeGlzdD0oa2V5KT0+XG4hbS5oYXMoa2V5KXx8RmFpbCBgJHtxKHRhZyl9IGFscmVhZHkgcmVnaXN0ZXJlZDogJHtrZXl9YDtcbmNvbnN0IGFzc2VydEtleUV4aXN0cz0oa2V5KT0+XG5tLmhhcyhrZXkpfHxGYWlsIGAke3EodGFnKX0gbm90IGZvdW5kOiAke2tleX1gO1xucmV0dXJuIGhhcmRlbih7XG5oYXM6KGtleSk9Pntcbi8qIENoZWNrIGlmIGEga2V5IGV4aXN0cy4gVGhlIGtleSBjYW4gYmUgYW55IEphdmFTY3JpcHQgdmFsdWUsKi9cbi8qIHRob3VnaCB0aGUgYW5zd2VyIHdpbGwgYWx3YXlzIGJlIGZhbHNlIGZvciBrZXlzIHRoYXQgY2Fubm90IGJlIGZvdW5kKi9cbi8qIGluIHRoaXMgbWFwLiovXG5yZXR1cm4gbS5oYXMoa2V5KTtcbiB9LFxuaW5pdDooa2V5LHZhbHVlKT0+e1xuYXNzZXJ0S2V5RG9lc05vdEV4aXN0KGtleSk7XG5tLnNldChrZXksdmFsdWUpO1xuIH0sXG5nZXQ6KGtleSk9PntcbmFzc2VydEtleUV4aXN0cyhrZXkpO1xucmV0dXJuIG0uZ2V0KGtleSk7XG4gfSxcbnNldDooa2V5LHZhbHVlKT0+e1xuYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG5tLnNldChrZXksdmFsdWUpO1xuIH0sXG5kZWxldGU6KGtleSk9PntcbmFzc2VydEtleUV4aXN0cyhrZXkpO1xubS5kZWxldGUoa2V5KTtcbiB9LFxua2V5czooKT0+bS5rZXlzKCksXG52YWx1ZXM6KCk9Pm0udmFsdWVzKCksXG5lbnRyaWVzOigpPT5tLmVudHJpZXMoKSxcbmdldFNpemU6KCk9Pm0uc2l6ZSxcbmNsZWFyOigpPT5tLmNsZWFyKCl9KTtcblxuIH07JGjigI1fb25jZS5tYWtlTGVnYWN5TWFwKG1ha2VMZWdhY3lNYXApO1xuaGFyZGVuKG1ha2VMZWdhY3lNYXApO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VMZWdhY3lNYXAiOlsibWFrZUxlZ2FjeU1hcCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABnvA5DvQYAAL0GAAAwAAAAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL2xlZ2FjeS9sZWdhY3lXZWFrTWFwLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvYXNzZXJ0IiwiLi4vdHlwZXMuanMiXSwiZXhwb3J0cyI6WyJtYWtlTGVnYWN5V2Vha01hcCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBxLEZhaWw7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9hc3NlcnRcIiwgW1tcInFcIiwgWyRo4oCNX2EgPT4gKHEgPSAkaOKAjV9hKV1dLFtcIkZhaWxcIiwgWyRo4oCNX2EgPT4gKEZhaWwgPSAkaOKAjV9hKV1dXV0sW1wiLi4vdHlwZXMuanNcIiwgW11dXSk7ICAgXG5cblxuLyoqXG4gKiBTZWUgZG9jY29tbWVudCBpbiB0aGUgY2xvc2VseSByZWxhdGVkIGBsZWdhY3lNYXAuanNgIG1vZHVsZS5cbiAqXG4gKiBAZGVwcmVjYXRlZCBzd2l0Y2ggdG8gU2NhbGFyV2Vha01hcCBpZiBwb3NzaWJsZSwgV2Vha01hcCBvdGhlcndpc2VcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEBwYXJhbSB7c3RyaW5nfSBbdGFnXSAtIHRhZyBmb3IgZGVidWdnaW5nXG4gKiBAcmV0dXJucyB7TGVnYWN5V2Vha01hcDxLLCBWPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VMZWdhY3lXZWFrTWFwPSh0YWc9J2tleScpPT57XG4vKiogQHR5cGUge1dlYWtNYXA8SyAmIG9iamVjdCwgVj59ICovXG5jb25zdCB3bT1uZXcgV2Vha01hcCgpO1xuY29uc3QgYXNzZXJ0S2V5RG9lc05vdEV4aXN0PShrZXkpPT5cbiF3bS5oYXMoa2V5KXx8RmFpbCBgJHtxKHRhZyl9IGFscmVhZHkgcmVnaXN0ZXJlZDogJHtrZXl9YDtcbmNvbnN0IGFzc2VydEtleUV4aXN0cz0oa2V5KT0+XG53bS5oYXMoa2V5KXx8RmFpbCBgJHtxKHRhZyl9IG5vdCBmb3VuZDogJHtrZXl9YDtcbnJldHVybiBoYXJkZW4oe1xuaGFzOihrZXkpPT57XG4vKiBDaGVjayBpZiBhIGtleSBleGlzdHMuIFRoZSBrZXkgY2FuIGJlIGFueSBKYXZhU2NyaXB0IHZhbHVlLCovXG4vKiB0aG91Z2ggdGhlIGFuc3dlciB3aWxsIGFsd2F5cyBiZSBmYWxzZSBmb3Iga2V5cyB0aGF0IGNhbm5vdCBiZSBmb3VuZCovXG4vKiBpbiB0aGlzIG1hcC4qL1xucmV0dXJuIHdtLmhhcyhrZXkpO1xuIH0sXG5pbml0OihrZXksdmFsdWUpPT57XG5hc3NlcnRLZXlEb2VzTm90RXhpc3Qoa2V5KTtcbndtLnNldChrZXksdmFsdWUpO1xuIH0sXG5nZXQ6KGtleSk9PntcbmFzc2VydEtleUV4aXN0cyhrZXkpO1xuLyogSG93IHRvIHRlbGwgdHlwZXNjcmlwdCBJIGJlbGlldmUgdGhlIGBnZXRgIHdpbGwgc3VjY2VlZC4qL1xucmV0dXJuICgvKiogQHR5cGUge1Z9ICovd20uZ2V0KGtleSkpO1xuIH0sXG5zZXQ6KGtleSx2YWx1ZSk9PntcbmFzc2VydEtleUV4aXN0cyhrZXkpO1xud20uc2V0KGtleSx2YWx1ZSk7XG4gfSxcbmRlbGV0ZTooa2V5KT0+e1xuYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG53bS5kZWxldGUoa2V5KTtcbiB9fSk7XG5cbiB9OyRo4oCNX29uY2UubWFrZUxlZ2FjeVdlYWtNYXAobWFrZUxlZ2FjeVdlYWtNYXApO1xuaGFyZGVuKG1ha2VMZWdhY3lXZWFrTWFwKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlTGVnYWN5V2Vha01hcCI6WyJtYWtlTGVnYWN5V2Vha01hcCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAFJGr1EhYAABIWAAAxAAAAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL3N0b3Jlcy9zY2FsYXJNYXBTdG9yZS5qc3siaW1wb3J0cyI6WyJAZW5kby9wYXNzLXN0eWxlIiwiQGVuZG8vbWFyc2hhbCIsIkBlbmRvL3BhdHRlcm5zIiwiLi9zY2FsYXJXZWFrTWFwU3RvcmUuanMiLCIuL3N0b3JlLXV0aWxzLmpzIl0sImV4cG9ydHMiOlsibWFrZU1hcFN0b3JlTWV0aG9kcyIsIm1ha2VTY2FsYXJNYXBTdG9yZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBGYXIsYXNzZXJ0UGFzc2FibGUsZmlsdGVySXRlcmFibGUsbWFwSXRlcmFibGUsY29tcGFyZVJhbmssYXNzZXJ0U2NhbGFyS2V5LG1ha2VDb3B5TWFwLG1hdGNoZXMsbXVzdE1hdGNoLGFzc2VydFBhdHRlcm4sbWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMsbWFrZUN1cnJlbnRLZXlzS2l0OyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXSxbXCJhc3NlcnRQYXNzYWJsZVwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UGFzc2FibGUgPSAkaOKAjV9hKV1dLFtcImZpbHRlckl0ZXJhYmxlXCIsIFskaOKAjV9hID0+IChmaWx0ZXJJdGVyYWJsZSA9ICRo4oCNX2EpXV0sW1wibWFwSXRlcmFibGVcIiwgWyRo4oCNX2EgPT4gKG1hcEl0ZXJhYmxlID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcImNvbXBhcmVSYW5rXCIsIFskaOKAjV9hID0+IChjb21wYXJlUmFuayA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wiYXNzZXJ0U2NhbGFyS2V5XCIsIFskaOKAjV9hID0+IChhc3NlcnRTY2FsYXJLZXkgPSAkaOKAjV9hKV1dLFtcIm1ha2VDb3B5TWFwXCIsIFskaOKAjV9hID0+IChtYWtlQ29weU1hcCA9ICRo4oCNX2EpXV0sW1wibWF0Y2hlc1wiLCBbJGjigI1fYSA9PiAobWF0Y2hlcyA9ICRo4oCNX2EpXV0sW1wibXVzdE1hdGNoXCIsIFskaOKAjV9hID0+IChtdXN0TWF0Y2ggPSAkaOKAjV9hKV1dLFtcImFzc2VydFBhdHRlcm5cIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhdHRlcm4gPSAkaOKAjV9hKV1dXV0sW1wiLi9zY2FsYXJXZWFrTWFwU3RvcmUuanNcIiwgW1tcIm1ha2VXZWFrTWFwU3RvcmVNZXRob2RzXCIsIFskaOKAjV9hID0+IChtYWtlV2Vha01hcFN0b3JlTWV0aG9kcyA9ICRo4oCNX2EpXV1dXSxbXCIuL3N0b3JlLXV0aWxzLmpzXCIsIFtbXCJtYWtlQ3VycmVudEtleXNLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VDdXJyZW50S2V5c0tpdCA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdHtxdW90ZTpxfT1hc3NlcnQ7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IEtcbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFZcbiAqIEBwYXJhbSB7TWFwPEssIFY+fSBqc21hcFxuICogQHBhcmFtIHsoazogSywgdjogVikgPT4gdm9pZH0gYXNzZXJ0S1ZPa1RvQWRkXG4gKiBAcGFyYW0geyhrOiBLLCB2OiBWKSA9PiB2b2lkfSBhc3NlcnRLVk9rVG9TZXRcbiAqIEBwYXJhbSB7KGs6IEspID0+IHZvaWR9IFthc3NlcnRLZXlPa1RvRGVsZXRlXVxuICogQHBhcmFtIHtzdHJpbmd9IFt0YWddXG4gKiBAcmV0dXJucyB7TWFwU3RvcmU8SywgVj59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlTWFwU3RvcmVNZXRob2RzPShcbmpzbWFwLFxuYXNzZXJ0S1ZPa1RvQWRkLFxuYXNzZXJ0S1ZPa1RvU2V0LFxuYXNzZXJ0S2V5T2tUb0RlbGV0ZT11bmRlZmluZWQsXG50YWc9J2tleScpPT5cbntcbmNvbnN0e2Fzc2VydFVwZGF0ZU9uQWRkLGFzc2VydFVwZGF0ZU9uRGVsZXRlLGl0ZXJhYmxlS2V5c309XG5tYWtlQ3VycmVudEtleXNLaXQoXG4oKT0+anNtYXAua2V5cygpLFxuKGspPT5qc21hcC5oYXMoayksXG5jb21wYXJlUmFuayxcbmFzc2VydEtWT2tUb0FkZCxcbmFzc2VydEtleU9rVG9EZWxldGUsXG50YWcpO1xuXG5cbi8qKlxuICogQHBhcmFtIHtQYXR0ZXJufSBba2V5UGF0dF1cbiAqIEBwYXJhbSB7UGF0dGVybn0gW3ZhbHVlUGF0dF1cbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxLPn1cbiAqL1xuY29uc3Qga2V5cz0oa2V5UGF0dD11bmRlZmluZWQsdmFsdWVQYXR0PXVuZGVmaW5lZCk9PntcbmlmKGtleVBhdHQ9PT11bmRlZmluZWQmJnZhbHVlUGF0dD09PXVuZGVmaW5lZCl7XG5yZXR1cm4gaXRlcmFibGVLZXlzO1xuIH1cbmNvbnN0IGZpbHRlcj0oayk9PntcbmlmKGtleVBhdHQhPT11bmRlZmluZWQmJiFtYXRjaGVzKGssa2V5UGF0dCkpe1xucmV0dXJuIGZhbHNlO1xuIH1cbi8qIFVzZXMgdGhlIGN1cnJlbnQganNtYXAgdmFsdWUsIHNpbmNlIHRoZSBpdGVyYXRhdG9yIHN1cnZpdmVzIGAuc2V0YCovXG5pZih2YWx1ZVBhdHQhPT11bmRlZmluZWQmJiFtYXRjaGVzKGpzbWFwLmdldChrKSx2YWx1ZVBhdHQpKXtcbnJldHVybiBmYWxzZTtcbiB9XG5yZXR1cm4gdHJ1ZTtcbiB9O1xucmV0dXJuIGZpbHRlckl0ZXJhYmxlKGl0ZXJhYmxlS2V5cyxmaWx0ZXIpO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtQYXR0ZXJufSBba2V5UGF0dF1cbiAqIEBwYXJhbSB7UGF0dGVybn0gW3ZhbHVlUGF0dF1cbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxWPn1cbiAqL1xuY29uc3QgdmFsdWVzPShrZXlQYXR0PXVuZGVmaW5lZCx2YWx1ZVBhdHQ9dW5kZWZpbmVkKT0+XG5tYXBJdGVyYWJsZShrZXlzKGtleVBhdHQsdmFsdWVQYXR0KSwoayk9Pi8qKiBAdHlwZSB7Vn0gKi9qc21hcC5nZXQoaykpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGF0dGVybn0gW2tleVBhdHRdXG4gKiBAcGFyYW0ge1BhdHRlcm59IFt2YWx1ZVBhdHRdXG4gKiBAcmV0dXJucyB7SXRlcmFibGU8W0ssIFZdPn1cbiAqL1xuY29uc3QgZW50cmllcz0oa2V5UGF0dD11bmRlZmluZWQsdmFsdWVQYXR0PXVuZGVmaW5lZCk9PlxubWFwSXRlcmFibGUoa2V5cyhrZXlQYXR0LHZhbHVlUGF0dCksKGspPT5bXG5rLFxuLyoqIEB0eXBlIHtWfSAqL2pzbWFwLmdldChrKV0pO1xuXG5cbnJldHVybiBoYXJkZW4oe1xuLi4ubWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMoXG5qc21hcCxcbi8qKiBAdHlwZSB7KGs6IEssIHY6IFYpID0+IHZvaWR9ICovYXNzZXJ0VXBkYXRlT25BZGQsXG5hc3NlcnRLVk9rVG9TZXQsXG5hc3NlcnRVcGRhdGVPbkRlbGV0ZSxcbnRhZyksXG5cbmtleXMsXG52YWx1ZXMsXG5lbnRyaWVzLFxuXG5zbmFwc2hvdDooa2V5UGF0dD11bmRlZmluZWQsdmFsdWVQYXR0PXVuZGVmaW5lZCk9PlxubWFrZUNvcHlNYXAoZW50cmllcyhrZXlQYXR0LHZhbHVlUGF0dCkpLFxuXG5nZXRTaXplOihrZXlQYXR0PXVuZGVmaW5lZCx2YWx1ZVBhdHQ9dW5kZWZpbmVkKT0+XG5rZXlQYXR0PT09dW5kZWZpbmVkJiZ2YWx1ZVBhdHQ9PT11bmRlZmluZWQ/XG5qc21hcC5zaXplOlxuWy4uLmtleXMoa2V5UGF0dCx2YWx1ZVBhdHQpXS5sZW5ndGgsXG5cbmNsZWFyOihrZXlQYXR0PXVuZGVmaW5lZCx2YWx1ZVBhdHQ9dW5kZWZpbmVkKT0+e1xuaWYoa2V5UGF0dD09PXVuZGVmaW5lZCYmdmFsdWVQYXR0PT09dW5kZWZpbmVkKXtcbmpzbWFwLmNsZWFyKCk7XG4gfVxuZm9yKGNvbnN0IGtleSBvZiBrZXlzKGtleVBhdHQsdmFsdWVQYXR0KSl7XG5qc21hcC5kZWxldGUoa2V5KTtcbiB9XG4gfX0pO1xuXG4gfTtcblxuLyoqXG4gKiBEaXN0aW5ndWlzaGVzIGJldHdlZW4gYWRkaW5nIGEgbmV3IGtleSAoaW5pdCkgYW5kIHVwZGF0aW5nIG9yIHJlZmVyZW5jaW5nIGFcbiAqIGtleSAoZ2V0LCBzZXQsIGRlbGV0ZSkuXG4gKlxuICogYGluaXRgIGlzIG9ubHkgYWxsb3dlZCBpZiB0aGUga2V5IGRvZXMgbm90IGFscmVhZHkgZXhpc3QuIGBHZXRgLCBgc2V0YCBhbmRcbiAqIGBkZWxldGVgIGFyZSBvbmx5IGFsbG93ZWQgaWYgdGhlIGtleSBkb2VzIGFscmVhZHkgZXhpc3QuXG4gKlxuICogVGhpcyBpcyBhIF9zY2FsYXJfIG1hcCBpbiB0aGF0IHRoZSBrZXlzIGNhbiBvbmx5IGJlIGF0b21pYyB2YWx1ZXMsIHByaW1pdGl2ZXNcbiAqIG9yIHJlbW90YWJsZXMuIE90aGVyIHN0b3JlTWFwcyB3aWxsIGFjY2VwdCwgZm9yIGV4YW1wbGUsIGNvcHlBcnJheXMgYW5kXG4gKiBjb3B5UmVjb3JkcywgYXMga2V5cyBhbmQgbG9vayB0aGVtIHVwIGJhc2VkIG9uIGVxdWFsaXR5IG9mIHRoZWlyIGNvbnRlbnRzLlxuICpcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBWXG4gKiBAcGFyYW0ge3N0cmluZ30gW3RhZ10gLSB0aGUgY29sdW1uIG5hbWUgZm9yIHRoZSBrZXlcbiAqIEBwYXJhbSB7U3RvcmVPcHRpb25zfSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHtNYXBTdG9yZTxLLCBWPn1cbiAqLyRo4oCNX29uY2UubWFrZU1hcFN0b3JlTWV0aG9kcyhtYWtlTWFwU3RvcmVNZXRob2RzKTtcbmNvbnN0ICAgICAgICBtYWtlU2NhbGFyTWFwU3RvcmU9KFxudGFnPSdrZXknLFxue2tleVNoYXBlPXVuZGVmaW5lZCx2YWx1ZVNoYXBlPXVuZGVmaW5lZH09e30pPT5cbntcbmNvbnN0IGpzbWFwPW5ldyBNYXAoKTtcbmlmKGtleVNoYXBlIT09dW5kZWZpbmVkKXtcbmFzc2VydFBhdHRlcm4oa2V5U2hhcGUpO1xuIH1cbmlmKHZhbHVlU2hhcGUhPT11bmRlZmluZWQpe1xuYXNzZXJ0UGF0dGVybih2YWx1ZVNoYXBlKTtcbiB9XG5cbmNvbnN0IGFzc2VydEtWT2tUb1NldD0oX2tleSx2YWx1ZSk9Pntcbi8qIFRPRE86IEp1c3QgYSB0cmFuc2l0aW9uIGtsdWRnZS4gUmVtb3ZlIHdoZW4gcG9zc2libGUuKi9cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzM2MDYqL1xuaGFyZGVuKHZhbHVlKTtcblxuYXNzZXJ0UGFzc2FibGUodmFsdWUpO1xuaWYodmFsdWVTaGFwZSE9PXVuZGVmaW5lZCl7XG5tdXN0TWF0Y2godmFsdWUsdmFsdWVTaGFwZSwnbWFwU3RvcmUgdmFsdWUnKTtcbiB9XG4gfTtcblxuY29uc3QgYXNzZXJ0S1ZPa1RvQWRkPShrZXksdmFsdWUpPT57XG4vKiBUT0RPOiBKdXN0IGEgdHJhbnNpdGlvbiBrbHVkZ2UuIFJlbW92ZSB3aGVuIHBvc3NpYmxlLiovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8zNjA2Ki9cbmhhcmRlbihrZXkpO1xuXG5hc3NlcnRTY2FsYXJLZXkoa2V5KTtcbmlmKGtleVNoYXBlIT09dW5kZWZpbmVkKXtcbm11c3RNYXRjaChrZXksa2V5U2hhcGUsJ21hcFN0b3JlIGtleScpO1xuIH1cbmFzc2VydEtWT2tUb1NldChrZXksdmFsdWUpO1xuIH07XG5cbnJldHVybiBGYXIoIGBzY2FsYXIgTWFwU3RvcmUgb2YgJHtxKHRhZyl9YCx7XG4uLi5tYWtlTWFwU3RvcmVNZXRob2RzKFxuanNtYXAsXG5hc3NlcnRLVk9rVG9BZGQsXG5hc3NlcnRLVk9rVG9TZXQsXG51bmRlZmluZWQsXG50YWcpfSk7XG5cblxuIH07JGjigI1fb25jZS5tYWtlU2NhbGFyTWFwU3RvcmUobWFrZVNjYWxhck1hcFN0b3JlKTtcbmhhcmRlbihtYWtlU2NhbGFyTWFwU3RvcmUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VNYXBTdG9yZU1ldGhvZHMiOlsibWFrZU1hcFN0b3JlTWV0aG9kcyJdLCJtYWtlU2NhbGFyTWFwU3RvcmUiOlsibWFrZVNjYWxhck1hcFN0b3JlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMUHMCw7DwAAOw8AADEAAABAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvc3RvcmVzL3NjYWxhclNldFN0b3JlLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3Bhc3Mtc3R5bGUiLCJAZW5kby9tYXJzaGFsIiwiQGVuZG8vcGF0dGVybnMiLCIuL3NjYWxhcldlYWtTZXRTdG9yZS5qcyIsIi4vc3RvcmUtdXRpbHMuanMiXSwiZXhwb3J0cyI6WyJtYWtlU2NhbGFyU2V0U3RvcmUiLCJtYWtlU2V0U3RvcmVNZXRob2RzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEZhcixmaWx0ZXJJdGVyYWJsZSxjb21wYXJlUmFuayxhc3NlcnRTY2FsYXJLZXksbWFrZUNvcHlTZXQsbWF0Y2hlcyxtdXN0TWF0Y2gsYXNzZXJ0UGF0dGVybixtYWtlV2Vha1NldFN0b3JlTWV0aG9kcyxtYWtlQ3VycmVudEtleXNLaXQ7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dLFtcImZpbHRlckl0ZXJhYmxlXCIsIFskaOKAjV9hID0+IChmaWx0ZXJJdGVyYWJsZSA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJjb21wYXJlUmFua1wiLCBbJGjigI1fYSA9PiAoY29tcGFyZVJhbmsgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vcGF0dGVybnNcIiwgW1tcImFzc2VydFNjYWxhcktleVwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0U2NhbGFyS2V5ID0gJGjigI1fYSldXSxbXCJtYWtlQ29weVNldFwiLCBbJGjigI1fYSA9PiAobWFrZUNvcHlTZXQgPSAkaOKAjV9hKV1dLFtcIm1hdGNoZXNcIiwgWyRo4oCNX2EgPT4gKG1hdGNoZXMgPSAkaOKAjV9hKV1dLFtcIm11c3RNYXRjaFwiLCBbJGjigI1fYSA9PiAobXVzdE1hdGNoID0gJGjigI1fYSldXSxbXCJhc3NlcnRQYXR0ZXJuXCIsIFskaOKAjV9hID0+IChhc3NlcnRQYXR0ZXJuID0gJGjigI1fYSldXV1dLFtcIi4vc2NhbGFyV2Vha1NldFN0b3JlLmpzXCIsIFtbXCJtYWtlV2Vha1NldFN0b3JlTWV0aG9kc1wiLCBbJGjigI1fYSA9PiAobWFrZVdlYWtTZXRTdG9yZU1ldGhvZHMgPSAkaOKAjV9hKV1dXV0sW1wiLi9zdG9yZS11dGlscy5qc1wiLCBbW1wibWFrZUN1cnJlbnRLZXlzS2l0XCIsIFskaOKAjV9hID0+IChtYWtlQ3VycmVudEtleXNLaXQgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdHtxdW90ZTpxfT1hc3NlcnQ7XG5cbi8qKlxuICogQHRlbXBsYXRlIEtcbiAqIEBwYXJhbSB7U2V0PEs+fSBqc3NldFxuICogQHBhcmFtIHsoazogSykgPT4gdm9pZH0gYXNzZXJ0S2V5T2tUb0FkZFxuICogQHBhcmFtIHsoazogSykgPT4gdm9pZH0gW2Fzc2VydEtleU9rVG9EZWxldGVdXG4gKiBAcGFyYW0ge3N0cmluZ30gW2tleU5hbWVdXG4gKiBAcmV0dXJucyB7U2V0U3RvcmU8Sz59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlU2V0U3RvcmVNZXRob2RzPShcbmpzc2V0LFxuYXNzZXJ0S2V5T2tUb0FkZCxcbmFzc2VydEtleU9rVG9EZWxldGU9dW5kZWZpbmVkLFxua2V5TmFtZT0na2V5Jyk9Plxue1xuY29uc3R7YXNzZXJ0VXBkYXRlT25BZGQsYXNzZXJ0VXBkYXRlT25EZWxldGUsaXRlcmFibGVLZXlzfT1cbm1ha2VDdXJyZW50S2V5c0tpdChcbigpPT5qc3NldC5rZXlzKCksXG4oayk9Pmpzc2V0LmhhcyhrKSxcbmNvbXBhcmVSYW5rLFxuYXNzZXJ0S2V5T2tUb0FkZCxcbmFzc2VydEtleU9rVG9EZWxldGUsXG5rZXlOYW1lKTtcblxuXG4vKipcbiAqIEBwYXJhbSB7UGF0dGVybn0gW2tleVBhdHRdXG4gKiBAcmV0dXJucyB7SXRlcmFibGU8Sz59XG4gKi9cbmNvbnN0IGtleXM9KGtleVBhdHQ9dW5kZWZpbmVkKT0+XG5rZXlQYXR0PT09dW5kZWZpbmVkP1xuaXRlcmFibGVLZXlzOlxuZmlsdGVySXRlcmFibGUoaXRlcmFibGVLZXlzLChrKT0+bWF0Y2hlcyhrLGtleVBhdHQpKTtcblxucmV0dXJuIGhhcmRlbih7XG4uLi5tYWtlV2Vha1NldFN0b3JlTWV0aG9kcyhcbmpzc2V0LFxuYXNzZXJ0VXBkYXRlT25BZGQsXG5hc3NlcnRVcGRhdGVPbkRlbGV0ZSxcbmtleU5hbWUpLFxuXG5cbmtleXMsXG5cbnZhbHVlczprZXlzLFxuXG5zbmFwc2hvdDooa2V5UGF0dD11bmRlZmluZWQpPT5tYWtlQ29weVNldChrZXlzKGtleVBhdHQpKSxcblxuZ2V0U2l6ZTooa2V5UGF0dD11bmRlZmluZWQpPT5cbmtleVBhdHQ9PT11bmRlZmluZWQ/anNzZXQuc2l6ZTpbLi4ua2V5cyhrZXlQYXR0KV0ubGVuZ3RoLFxuXG5jbGVhcjooa2V5UGF0dD11bmRlZmluZWQpPT57XG5pZihrZXlQYXR0PT09dW5kZWZpbmVkKXtcbmpzc2V0LmNsZWFyKCk7XG4gfVxuZm9yKGNvbnN0IGtleSBvZiBrZXlzKGtleVBhdHQpKXtcbmpzc2V0LmRlbGV0ZShrZXkpO1xuIH1cbiB9fSk7XG5cbiB9O1xuXG4vKipcbiAqIERpc3Rpbmd1aXNoZXMgYmV0d2VlbiBhZGRpbmcgYSBuZXcga2V5IChpbml0KSBhbmQgdXBkYXRpbmcgb3IgcmVmZXJlbmNpbmcgYVxuICoga2V5IChnZXQsIHNldCwgZGVsZXRlKS5cbiAqXG4gKiBgaW5pdGAgaXMgb25seSBhbGxvd2VkIGlmIHRoZSBrZXkgZG9lcyBub3QgYWxyZWFkeSBleGlzdC4gYEdldGAsIGBzZXRgIGFuZFxuICogYGRlbGV0ZWAgYXJlIG9ubHkgYWxsb3dlZCBpZiB0aGUga2V5IGRvZXMgYWxyZWFkeSBleGlzdC5cbiAqXG4gKiBUaGlzIGlzIGEgX3NjYWxhcl8gc2V0IGluIHRoYXQgdGhlIGtleXMgY2FuIG9ubHkgYmUgYXRvbWljIHZhbHVlcywgcHJpbWl0aXZlc1xuICogb3IgcmVtb3RhYmxlcy4gT3RoZXIgc3RvcmVTZXRzIHdpbGwgYWNjZXB0LCBmb3IgZXhhbXBsZSwgY29weUFycmF5cyBhbmRcbiAqIGNvcHlSZWNvcmRzLCBhcyBrZXlzIGFuZCBsb29rIHRoZW0gdXAgYmFzZWQgb24gZXF1YWxpdHkgb2YgdGhlaXIgY29udGVudHMuXG4gKlxuICogQHRlbXBsYXRlIEtcbiAqIEBwYXJhbSB7c3RyaW5nfSBbdGFnXSAtIHRhZyBmb3IgZGVidWdnaW5nXG4gKiBAcGFyYW0ge1N0b3JlT3B0aW9uc30gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7U2V0U3RvcmU8Sz59XG4gKi8kaOKAjV9vbmNlLm1ha2VTZXRTdG9yZU1ldGhvZHMobWFrZVNldFN0b3JlTWV0aG9kcyk7XG5jb25zdCAgICAgICAgbWFrZVNjYWxhclNldFN0b3JlPShcbnRhZz0na2V5JyxcbntrZXlTaGFwZT11bmRlZmluZWR9PXt9KT0+XG57XG5jb25zdCBqc3NldD1uZXcgU2V0KCk7XG5pZihrZXlTaGFwZSE9PXVuZGVmaW5lZCl7XG5hc3NlcnRQYXR0ZXJuKGtleVNoYXBlKTtcbiB9XG5cbmNvbnN0IGFzc2VydEtleU9rVG9BZGQ9KGtleSk9Pntcbi8qIFRPRE86IEp1c3QgYSB0cmFuc2l0aW9uIGtsdWRnZS4gUmVtb3ZlIHdoZW4gcG9zc2libGUuKi9cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzM2MDYqL1xuaGFyZGVuKGtleSk7XG5cbmFzc2VydFNjYWxhcktleShrZXkpO1xuaWYoa2V5U2hhcGUhPT11bmRlZmluZWQpe1xubXVzdE1hdGNoKGtleSxrZXlTaGFwZSwnc2V0U3RvcmUga2V5Jyk7XG4gfVxuIH07XG5cbnJldHVybiBGYXIoIGBzY2FsYXIgU2V0U3RvcmUgb2YgJHtxKHRhZyl9YCx7XG4uLi5tYWtlU2V0U3RvcmVNZXRob2RzKGpzc2V0LGFzc2VydEtleU9rVG9BZGQsdW5kZWZpbmVkLHRhZyl9KTtcblxuIH07JGjigI1fb25jZS5tYWtlU2NhbGFyU2V0U3RvcmUobWFrZVNjYWxhclNldFN0b3JlKTtcbmhhcmRlbihtYWtlU2NhbGFyU2V0U3RvcmUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VTZXRTdG9yZU1ldGhvZHMiOlsibWFrZVNldFN0b3JlTWV0aG9kcyJdLCJtYWtlU2NhbGFyU2V0U3RvcmUiOlsibWFrZVNjYWxhclNldFN0b3JlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAO/WNtpzEwAAcxMAADUAAABAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvc3RvcmVzL3NjYWxhcldlYWtNYXBTdG9yZS5qc3siaW1wb3J0cyI6WyJAZW5kby9wYXNzLXN0eWxlIiwiQGVuZG8vcGF0dGVybnMiLCIuL3N0b3JlLXV0aWxzLmpzIl0sImV4cG9ydHMiOlsibWFrZVNjYWxhcldlYWtNYXBTdG9yZSIsIm1ha2VXZWFrTWFwU3RvcmVNZXRob2RzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEZhcixhc3NlcnRQYXNzYWJsZSxwYXNzU3R5bGVPZixnZXRDb3B5TWFwRW50cmllcyxtdXN0TWF0Y2gsYXNzZXJ0UGF0dGVybixpc0NvcHlNYXA7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dLFtcImFzc2VydFBhc3NhYmxlXCIsIFskaOKAjV9hID0+IChhc3NlcnRQYXNzYWJsZSA9ICRo4oCNX2EpXV0sW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJnZXRDb3B5TWFwRW50cmllc1wiLCBbJGjigI1fYSA9PiAoZ2V0Q29weU1hcEVudHJpZXMgPSAkaOKAjV9hKV1dLFtcIm11c3RNYXRjaFwiLCBbJGjigI1fYSA9PiAobXVzdE1hdGNoID0gJGjigI1fYSldXSxbXCJhc3NlcnRQYXR0ZXJuXCIsIFskaOKAjV9hID0+IChhc3NlcnRQYXR0ZXJuID0gJGjigI1fYSldXV1dLFtcIi4vc3RvcmUtdXRpbHMuanNcIiwgW1tcImlzQ29weU1hcFwiLCBbJGjigI1fYSA9PiAoaXNDb3B5TWFwID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5jb25zdHtxdW90ZTpxLEZhaWx9PWFzc2VydDtcblxuLyoqXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAcGFyYW0ge1dlYWtNYXA8SyAmIG9iamVjdCwgVj59IGpzbWFwXG4gKiBAcGFyYW0geyhrOiBLLCB2OiBWKSA9PiB2b2lkfSBhc3NlcnRLVk9rVG9BZGRcbiAqIEBwYXJhbSB7KGs6IEssIHY6IFYpID0+IHZvaWR9IGFzc2VydEtWT2tUb1NldFxuICogQHBhcmFtIHsoazogSykgPT4gdm9pZH0gW2Fzc2VydEtleU9rVG9EZWxldGVdXG4gKiBAcGFyYW0ge3N0cmluZ30gW2tleU5hbWVdXG4gKiBAcmV0dXJucyB7V2Vha01hcFN0b3JlPEssIFY+fVxuICovXG5jb25zdCAgICAgICAgbWFrZVdlYWtNYXBTdG9yZU1ldGhvZHM9KFxuanNtYXAsXG5hc3NlcnRLVk9rVG9BZGQsXG5hc3NlcnRLVk9rVG9TZXQsXG5hc3NlcnRLZXlPa1RvRGVsZXRlPXVuZGVmaW5lZCxcbmtleU5hbWU9J2tleScpPT5cbntcbmNvbnN0IGFzc2VydEtleURvZXNOb3RFeGlzdD0oa2V5KT0+XG4hanNtYXAuaGFzKGtleSl8fEZhaWwgYCR7cShrZXlOYW1lKX0gYWxyZWFkeSByZWdpc3RlcmVkOiAke2tleX1gO1xuXG5jb25zdCBhc3NlcnRLZXlFeGlzdHM9KGtleSk9PlxuanNtYXAuaGFzKGtleSl8fEZhaWwgYCR7cShrZXlOYW1lKX0gbm90IGZvdW5kOiAke2tleX1gO1xuXG5yZXR1cm4gaGFyZGVuKHtcbmhhczooa2V5KT0+e1xuLyogQ2hlY2sgaWYgYSBrZXkgZXhpc3RzLiBUaGUga2V5IGNhbiBiZSBhbnkgSmF2YVNjcmlwdCB2YWx1ZSwqL1xuLyogdGhvdWdoIHRoZSBhbnN3ZXIgd2lsbCBhbHdheXMgYmUgZmFsc2UgZm9yIGtleXMgdGhhdCBjYW5ub3QgYmUgZm91bmQqL1xuLyogaW4gdGhpcyBtYXAuKi9cbnJldHVybiBqc21hcC5oYXMoa2V5KTtcbiB9LFxuZ2V0OihrZXkpPT57XG5hc3NlcnRLZXlFeGlzdHMoa2V5KTtcbi8qIEhvdyB0byB0ZWxsIHR5cGVzY3JpcHQgSSBiZWxpZXZlIHRoZSBgZ2V0YCB3aWxsIHN1Y2NlZWQuKi9cbnJldHVybiAoLyoqIEB0eXBlIHtWfSAqL2pzbWFwLmdldChrZXkpKTtcbiB9LFxuXG5pbml0OihrZXksdmFsdWUpPT57XG5hc3NlcnRLZXlEb2VzTm90RXhpc3Qoa2V5KTtcbmFzc2VydEtWT2tUb0FkZChrZXksdmFsdWUpO1xuanNtYXAuc2V0KGtleSx2YWx1ZSk7XG4gfSxcbnNldDooa2V5LHZhbHVlKT0+e1xuYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG5hc3NlcnRLVk9rVG9TZXQoa2V5LHZhbHVlKTtcbmpzbWFwLnNldChrZXksdmFsdWUpO1xuIH0sXG5kZWxldGU6KGtleSk9PntcbmFzc2VydEtleUV4aXN0cyhrZXkpO1xuaWYoYXNzZXJ0S2V5T2tUb0RlbGV0ZSE9PXVuZGVmaW5lZCl7XG5hc3NlcnRLZXlPa1RvRGVsZXRlKGtleSk7XG4gfVxuanNtYXAuZGVsZXRlKGtleSk7XG4gfSxcblxuYWRkQWxsOihlbnRyaWVzKT0+e1xuaWYodHlwZW9mIGVudHJpZXNbU3ltYm9sLml0ZXJhdG9yXSE9PSdmdW5jdGlvbicpe1xuaWYoT2JqZWN0LmlzRnJvemVuKGVudHJpZXMpJiZpc0NvcHlNYXAoZW50cmllcykpe1xuZW50cmllcz1nZXRDb3B5TWFwRW50cmllcyhlbnRyaWVzKTtcbiB9ZWxzZXtcbkZhaWwgYHByb3ZpZGVkIGRhdGEgc291cmNlIGlzIG5vdCBpdGVyYWJsZTogJHtlbnRyaWVzfWA7XG4gfVxuIH1cbmZvcihjb25zdFtrZXksdmFsdWVdb2YvKiogQHR5cGUge0l0ZXJhYmxlPFtLLCBWXT59ICovZW50cmllcyl7XG4vKiBEb24ndCBhc3NlcnQgdGhhdCB0aGUga2V5IGVpdGhlciBkb2VzIG9yIGRvZXMgbm90IGV4aXN0LiovXG5hc3NlcnRLVk9rVG9BZGQoa2V5LHZhbHVlKTtcbmpzbWFwLnNldChrZXksdmFsdWUpO1xuIH1cbiB9fSk7XG5cbiB9O1xuXG4vKipcbiAqIFRoaXMgaXMgYSBfc2NhbGFyXyBtYXBTdG9yZSBpbiB0aGF0IHRoZSBrZXlzIGNhbiBvbmx5IGJlIGF0b21pYyB2YWx1ZXM6XG4gKiBwcmltaXRpdmVzIG9yIHJlbW90YWJsZXMuIE90aGVyIG1hcFN0b3JlcyB3aWxsIGFjY2VwdCwgZm9yIGV4YW1wbGUsXG4gKiBjb3B5QXJyYXlzIGFuZCBjb3B5UmVjb3JkcyBhcyBrZXlzIGFuZCBsb29rIHRoZW0gdXAgYmFzZWQgb24gZXF1YWxpdHkgb2ZcbiAqIHRoZWlyIGNvbnRlbnRzLlxuICpcbiAqIFRPRE8gRm9yIG5vdywgdGhpcyBzY2FsYXJXZWFrTWFwIGFjY2VwdHMgb25seSByZW1vdGFibGVzLCByZWZsZWN0aW5nIHRoZVxuICogY29uc3RyYWludHMgb2YgdGhlIHVuZGVybHlpbmcgSmF2YVNjcmlwdCBXZWFrTWFwIGl0IHVzZXMgaW50ZXJuYWxseS4gQnV0IGl0XG4gKiBzaG91bGQgYWNjZXB0IHRoZSBwcmltaXRpdmVzIGFzIHdlbGwsIHN0b3JpbmcgdGhlbSBpbiBhIHNlcGFyYXRlIGludGVybmFsXG4gKiBtYXAuIFdoYXQgbWFrZXMgaXQgXCJ3ZWFrXCIgaXMgdGhhdCBpdCBwcm92aWRlcyBubyBBUEkgZm9yIGVudW1lcmF0aW5nIHdoYXQnc1xuICogdGhlcmUuIFRob3VnaCBub3RlIHRoYXQgdGhpcyB3b3VsZCBvbmx5IGVuYWJsZXMgY29sbGVjdGlvbiBvZiB0aGUgcmVtb3RhYmxlcyxcbiAqIHNpbmNlIHRoZSBvdGhlciBwcmltaXRpdmVzIG1heSBhbHdheXMgcmVhcHBlYXIuXG4gKlxuICogQHRlbXBsYXRlIEssVlxuICogQHBhcmFtIHtzdHJpbmd9IFt0YWddIC0gdGFnIGZvciBkZWJ1Z2dpbmdcbiAqIEBwYXJhbSB7U3RvcmVPcHRpb25zfSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHtXZWFrTWFwU3RvcmU8SywgVj59XG4gKi8kaOKAjV9vbmNlLm1ha2VXZWFrTWFwU3RvcmVNZXRob2RzKG1ha2VXZWFrTWFwU3RvcmVNZXRob2RzKTtcbmNvbnN0ICAgICAgICBtYWtlU2NhbGFyV2Vha01hcFN0b3JlPShcbnRhZz0na2V5Jyxcbntsb25nTGl2ZWQ9dHJ1ZSxrZXlTaGFwZT11bmRlZmluZWQsdmFsdWVTaGFwZT11bmRlZmluZWR9PXt9KT0+XG57XG5jb25zdCBqc21hcD1uZXcobG9uZ0xpdmVkP1dlYWtNYXA6TWFwKSgpO1xuaWYoa2V5U2hhcGUhPT11bmRlZmluZWQpe1xuYXNzZXJ0UGF0dGVybihrZXlTaGFwZSk7XG4gfVxuaWYodmFsdWVTaGFwZSE9PXVuZGVmaW5lZCl7XG5hc3NlcnRQYXR0ZXJuKHZhbHVlU2hhcGUpO1xuIH1cblxuY29uc3QgYXNzZXJ0S1ZPa1RvU2V0PShfa2V5LHZhbHVlKT0+e1xuLyogVE9ETzogSnVzdCBhIHRyYW5zaXRpb24ga2x1ZGdlLiBSZW1vdmUgd2hlbiBwb3NzaWJsZS4qL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMzYwNiovXG5oYXJkZW4odmFsdWUpO1xuXG5hc3NlcnRQYXNzYWJsZSh2YWx1ZSk7XG5pZih2YWx1ZVNoYXBlIT09dW5kZWZpbmVkKXtcbm11c3RNYXRjaCh2YWx1ZSx2YWx1ZVNoYXBlLCd3ZWFrTWFwU3RvcmUgdmFsdWUnKTtcbiB9XG4gfTtcblxuY29uc3QgYXNzZXJ0S1ZPa1RvQWRkPShrZXksdmFsdWUpPT57XG4vKiBUT0RPOiBKdXN0IGEgdHJhbnNpdGlvbiBrbHVkZ2UuIFJlbW92ZSB3aGVuIHBvc3NpYmxlLiovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8zNjA2Ki9cbmhhcmRlbihrZXkpO1xucGFzc1N0eWxlT2Yoa2V5KT09PSdyZW1vdGFibGUnfHxcbkZhaWwgYE9ubHkgcmVtb3RhYmxlcyBjYW4gYmUga2V5cyBvZiBzY2FsYXIgV2Vha01hcFN0b3JlczogJHtrZXl9YDtcbmlmKGtleVNoYXBlIT09dW5kZWZpbmVkKXtcbm11c3RNYXRjaChrZXksa2V5U2hhcGUsJ3dlYWtNYXBTdG9yZSBrZXknKTtcbiB9XG5hc3NlcnRLVk9rVG9TZXQoa2V5LHZhbHVlKTtcbiB9O1xuXG5yZXR1cm4gRmFyKCBgc2NhbGFyIFdlYWtNYXBTdG9yZSBvZiAke3EodGFnKX1gLHtcbi4uLm1ha2VXZWFrTWFwU3RvcmVNZXRob2RzKFxuanNtYXAsXG5hc3NlcnRLVk9rVG9BZGQsXG5hc3NlcnRLVk9rVG9TZXQsXG51bmRlZmluZWQsXG50YWcpfSk7XG5cblxuIH07JGjigI1fb25jZS5tYWtlU2NhbGFyV2Vha01hcFN0b3JlKG1ha2VTY2FsYXJXZWFrTWFwU3RvcmUpO1xuaGFyZGVuKG1ha2VTY2FsYXJXZWFrTWFwU3RvcmUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VXZWFrTWFwU3RvcmVNZXRob2RzIjpbIm1ha2VXZWFrTWFwU3RvcmVNZXRob2RzIl0sIm1ha2VTY2FsYXJXZWFrTWFwU3RvcmUiOlsibWFrZVNjYWxhcldlYWtNYXBTdG9yZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADqeEU7CQ8AAAkPAAA1AAAAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL3N0b3Jlcy9zY2FsYXJXZWFrU2V0U3RvcmUuanN7ImltcG9ydHMiOlsiQGVuZG8vcGFzcy1zdHlsZSIsIkBlbmRvL3BhdHRlcm5zIiwiLi9zdG9yZS11dGlscy5qcyJdLCJleHBvcnRzIjpbIm1ha2VTY2FsYXJXZWFrU2V0U3RvcmUiLCJtYWtlV2Vha1NldFN0b3JlTWV0aG9kcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBGYXIscGFzc1N0eWxlT2YsZ2V0Q29weVNldEtleXMsbXVzdE1hdGNoLGFzc2VydFBhdHRlcm4saXNDb3B5U2V0OyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXSxbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlT2YgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vcGF0dGVybnNcIiwgW1tcImdldENvcHlTZXRLZXlzXCIsIFskaOKAjV9hID0+IChnZXRDb3B5U2V0S2V5cyA9ICRo4oCNX2EpXV0sW1wibXVzdE1hdGNoXCIsIFskaOKAjV9hID0+IChtdXN0TWF0Y2ggPSAkaOKAjV9hKV1dLFtcImFzc2VydFBhdHRlcm5cIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhdHRlcm4gPSAkaOKAjV9hKV1dXV0sW1wiLi9zdG9yZS11dGlscy5qc1wiLCBbW1wiaXNDb3B5U2V0XCIsIFskaOKAjV9hID0+IChpc0NvcHlTZXQgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cbmNvbnN0e3F1b3RlOnEsRmFpbH09YXNzZXJ0O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAcGFyYW0ge1dlYWtTZXQ8SyAmIG9iamVjdD59IGpzc2V0XG4gKiBAcGFyYW0geyhrOiBLKSA9PiB2b2lkfSBhc3NlcnRLZXlPa1RvQWRkXG4gKiBAcGFyYW0geyhrOiBLKSA9PiB2b2lkfSBbYXNzZXJ0S2V5T2tUb0RlbGV0ZV1cbiAqIEBwYXJhbSB7c3RyaW5nfSBba2V5TmFtZV1cbiAqIEByZXR1cm5zIHtXZWFrU2V0U3RvcmU8Sz59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlV2Vha1NldFN0b3JlTWV0aG9kcz0oXG5qc3NldCxcbmFzc2VydEtleU9rVG9BZGQsXG5hc3NlcnRLZXlPa1RvRGVsZXRlPXVuZGVmaW5lZCxcbmtleU5hbWU9J2tleScpPT5cbntcbmNvbnN0IGFzc2VydEtleUV4aXN0cz0oa2V5KT0+XG5qc3NldC5oYXMoa2V5KXx8RmFpbCBgJHtxKGtleU5hbWUpfSBub3QgZm91bmQ6ICR7a2V5fWA7XG5cbnJldHVybiBoYXJkZW4oe1xuaGFzOihrZXkpPT57XG4vKiBDaGVjayBpZiBhIGtleSBleGlzdHMuIFRoZSBrZXkgY2FuIGJlIGFueSBKYXZhU2NyaXB0IHZhbHVlLCovXG4vKiB0aG91Z2ggdGhlIGFuc3dlciB3aWxsIGFsd2F5cyBiZSBmYWxzZSBmb3Iga2V5cyB0aGF0IGNhbm5vdCBiZSBmb3VuZCovXG4vKiBpbiB0aGlzIHNldC4qL1xucmV0dXJuIGpzc2V0LmhhcyhrZXkpO1xuIH0sXG5cbmFkZDooa2V5KT0+e1xuYXNzZXJ0S2V5T2tUb0FkZChrZXkpO1xuanNzZXQuYWRkKGtleSk7XG4gfSxcbmRlbGV0ZTooa2V5KT0+e1xuYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG5pZihhc3NlcnRLZXlPa1RvRGVsZXRlIT09dW5kZWZpbmVkKXtcbmFzc2VydEtleU9rVG9EZWxldGUoa2V5KTtcbiB9XG5qc3NldC5kZWxldGUoa2V5KTtcbiB9LFxuXG5hZGRBbGw6KGtleXMpPT57XG5pZih0eXBlb2Yga2V5c1tTeW1ib2wuaXRlcmF0b3JdIT09J2Z1bmN0aW9uJyl7XG5pZihPYmplY3QuaXNGcm96ZW4oa2V5cykmJmlzQ29weVNldChrZXlzKSl7XG5rZXlzPWdldENvcHlTZXRLZXlzKGtleXMpO1xuIH1lbHNle1xuRmFpbCBgcHJvdmlkZWQgZGF0YSBzb3VyY2UgaXMgbm90IGl0ZXJhYmxlOiAke2tleXN9YDtcbiB9XG4gfVxuZm9yKGNvbnN0IGtleSBvZi8qKiBAdHlwZSB7SXRlcmFibGU8Sz59ICova2V5cyl7XG5hc3NlcnRLZXlPa1RvQWRkKGtleSk7XG5qc3NldC5hZGQoa2V5KTtcbiB9XG4gfX0pO1xuXG4gfTtcblxuLyoqXG4gKiBUaGlzIGlzIGEgX3NjYWxhcl8gc2V0IGluIHRoYXQgdGhlIGtleXMgY2FuIG9ubHkgYmUgYXRvbWljIHZhbHVlcywgcHJpbWl0aXZlc1xuICogb3IgcmVtb3RhYmxlcy4gT3RoZXIgc3RvcmVTZXRzIHdpbGwgYWNjZXB0LCBmb3IgZXhhbXBsZSwgY29weUFycmF5cyBhbmRcbiAqIGNvcHlSZWNvcmRzLCBhcyBrZXlzIGFuZCBsb29rIHRoZW0gdXAgYmFzZWQgb24gZXF1YWxpdHkgb2YgdGhlaXIgY29udGVudHMuXG4gKlxuICogVE9ETyBGb3Igbm93LCB0aGlzIHNjYWxhcldlYWtTZXQgYWNjZXB0cyBvbmx5IHJlbW90YWJsZXMsIHJlZmxlY3RpbmcgdGhlXG4gKiBjb25zdHJhaW50cyBvZiB0aGUgdW5kZXJseWluZyBKYXZhU2NyaXB0IFdlYWtTZXQgaXQgdXNlcyBpbnRlcm5hbGx5LiBCdXQgaXRcbiAqIHNob3VsZCBhY2NlcHQgdGhlIHByaW1pdGl2ZXMgYXMgd2VsbCwgc3RvcmluZyB0aGVtIGluIGEgc2VwYXJhdGUgaW50ZXJuYWxcbiAqIHNldC4gV2hhdCBtYWtlcyBpdCBcIndlYWtcIiBpcyB0aGF0IGl0IHByb3ZpZGVzIG5vIEFQSSBmb3IgZW51bWVyYXRpbmcgd2hhdCdzXG4gKiB0aGVyZS4gVGhvdWdoIG5vdGUgdGhhdCB0aGlzIHdvdWxkIG9ubHkgZW5hYmxlcyBjb2xsZWN0aW9uIG9mIHRoZSByZW1vdGFibGVzLFxuICogc2luY2UgdGhlIG90aGVyIHByaW1pdGl2ZXMgbWF5IGFsd2F5cyBhcHBlYXIuXG4gKlxuICogQHRlbXBsYXRlIEtcbiAqIEBwYXJhbSB7c3RyaW5nfSBbdGFnXSAtIHRhZyBmb3IgZGVidWdnaW5nXG4gKiBAcGFyYW0ge1N0b3JlT3B0aW9uc30gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7V2Vha1NldFN0b3JlPEs+fVxuICovJGjigI1fb25jZS5tYWtlV2Vha1NldFN0b3JlTWV0aG9kcyhtYWtlV2Vha1NldFN0b3JlTWV0aG9kcyk7XG5jb25zdCAgICAgICAgbWFrZVNjYWxhcldlYWtTZXRTdG9yZT0oXG50YWc9J2tleScsXG57bG9uZ0xpdmVkPXRydWUsa2V5U2hhcGU9dW5kZWZpbmVkfT17fSk9Plxue1xuY29uc3QganNzZXQ9bmV3KGxvbmdMaXZlZD9XZWFrU2V0OlNldCkoKTtcbmlmKGtleVNoYXBlIT09dW5kZWZpbmVkKXtcbmFzc2VydFBhdHRlcm4oa2V5U2hhcGUpO1xuIH1cblxuY29uc3QgYXNzZXJ0S2V5T2tUb0FkZD0oa2V5KT0+e1xuLyogVE9ETzogSnVzdCBhIHRyYW5zaXRpb24ga2x1ZGdlLiBSZW1vdmUgd2hlbiBwb3NzaWJsZS4qL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMzYwNiovXG5oYXJkZW4oa2V5KTtcbnBhc3NTdHlsZU9mKGtleSk9PT0ncmVtb3RhYmxlJ3x8XG5GYWlsIGBPbmx5IHJlbW90YWJsZXMgY2FuIGJlIGtleXMgb2Ygc2NhbGFyIFdlYWtTdG9yZXM6ICR7a2V5fWA7XG5pZihrZXlTaGFwZSE9PXVuZGVmaW5lZCl7XG5tdXN0TWF0Y2goa2V5LGtleVNoYXBlLCd3ZWFrU2V0U3RvcmUga2V5Jyk7XG4gfVxuIH07XG5cbnJldHVybiBGYXIoIGBzY2FsYXIgV2Vha1NldFN0b3JlIG9mICR7cSh0YWcpfWAse1xuLi4ubWFrZVdlYWtTZXRTdG9yZU1ldGhvZHMoanNzZXQsYXNzZXJ0S2V5T2tUb0FkZCx1bmRlZmluZWQsdGFnKX0pO1xuXG4gfTskaOKAjV9vbmNlLm1ha2VTY2FsYXJXZWFrU2V0U3RvcmUobWFrZVNjYWxhcldlYWtTZXRTdG9yZSk7XG5oYXJkZW4obWFrZVNjYWxhcldlYWtTZXRTdG9yZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVdlYWtTZXRTdG9yZU1ldGhvZHMiOlsibWFrZVdlYWtTZXRTdG9yZU1ldGhvZHMiXSwibWFrZVNjYWxhcldlYWtTZXRTdG9yZSI6WyJtYWtlU2NhbGFyV2Vha1NldFN0b3JlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAK8QKk7lGQAA5RkAAC4AAABAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvc3RvcmVzL3N0b3JlLXV0aWxzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL21hcnNoYWwiLCJAZW5kby9wYXR0ZXJucyJdLCJleHBvcnRzIjpbImFwcGVuZFRvU3RvcmVkQXJyYXkiLCJpc0NvcHlNYXAiLCJpc0NvcHlTZXQiLCJtYWtlQXRvbWljUHJvdmlkZXIiLCJtYWtlQ3VycmVudEtleXNLaXQiLCJwcm92aWRlTGF6eSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBGYXIsTSxtYXRjaGVzOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJNXCIsIFskaOKAjV9hID0+IChNID0gJGjigI1fYSldXSxbXCJtYXRjaGVzXCIsIFskaOKAjV9hID0+IChtYXRjaGVzID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9tYXJzaGFsJykuUmFua0NvbXBhcmV9IFJhbmtDb21wYXJlICovXG5cbmNvbnN0e0ZhaWwscXVvdGU6cX09YXNzZXJ0O1xuXG4vKiBUT0RPOiBVbmRhdGUgYEBlbmRvL3BhdHRlcm5zYCB0byBleHBvcnQgdGhlIG9yaWdpbmFsLCBhbmQgZGVsZXRlIHRoZSovXG4vKiByZWltcGxlbWVudGF0aW9uIGhlcmUuKi9cbi8qKlxuICogU2hvdWxkIGJlaGF2ZSBpZGVudGljYWxseSB0byB0aGUgb25lIGluIGBAZW5kby9wYXR0ZXJuc2AsIGJ1dCByZWltcGxlbWVudGVkXG4gKiBmb3Igbm93IGJlY2F1c2UgYEBlbmRvL3BhdHRlcm5zYCBmb3Jnb3QgdG8gZXhwb3J0IHRoaXMgb25lLiBUaGlzIG9uZSBpc1xuICogc2ltcGxlIGVub3VnaCB0aGF0IEkgcHJlZmVyIGEgcmVpbXBsZW1lbnRhdGlvbiB0byBhIGRlZXAgaW1wb3J0LlxuICpcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHNcbiAqIEByZXR1cm5zIHtzIGlzIENvcHlTZXR9XG4gKi9cbmNvbnN0ICAgICAgICBpc0NvcHlTZXQ9KHMpPT5tYXRjaGVzKHMsTS5zZXQoKSk7XG5cbi8qIFRPRE86IFVuZGF0ZSBgQGVuZG8vcGF0dGVybnNgIHRvIGV4cG9ydCB0aGUgb3JpZ2luYWwsIGFuZCBkZWxldGUgdGhlKi9cbi8qIHJlaW1wbGVtZW50YXRpb24gaGVyZS4qL1xuLyoqXG4gKiBTaG91bGQgYmVoYXZlIGlkZW50aWNhbGx5IHRvIHRoZSBvbmUgaW4gYEBlbmRvL3BhdHRlcm5zYCwgYnV0IHJlaW1wbGVtZW50ZWRcbiAqIGZvciBub3cgYmVjYXVzZSBgQGVuZG8vcGF0dGVybnNgIGZvcmdvdCB0byBleHBvcnQgdGhpcyBvbmUuIFRoaXMgb25lIGlzXG4gKiBzaW1wbGUgZW5vdWdoIHRoYXQgSSBwcmVmZXIgYSByZWltcGxlbWVudGF0aW9uIHRvIGEgZGVlcCBpbXBvcnQuXG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gbVxuICogQHJldHVybnMge20gaXMgQ29weU1hcH1cbiAqLyRo4oCNX29uY2UuaXNDb3B5U2V0KGlzQ29weVNldCk7XG5jb25zdCAgICAgICAgaXNDb3B5TWFwPShtKT0+bWF0Y2hlcyhtLE0ubWFwKCkpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEN1cnJlbnRLZXlzS2l0XG4gKiBAcHJvcGVydHkgeyhrOiBLLCB2PzogVikgPT4gdm9pZH0gYXNzZXJ0VXBkYXRlT25BZGRcbiAqIEBwcm9wZXJ0eSB7KGs6IEspID0+IHZvaWR9IGFzc2VydFVwZGF0ZU9uRGVsZXRlXG4gKiBAcHJvcGVydHkge0l0ZXJhYmxlPEs+fSBpdGVyYWJsZUtleXNcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEBwYXJhbSB7KCkgPT4gSXRlcmFibGU8Sz59IGdldFJhd0tleXNcbiAqIEBwYXJhbSB7KGs6IEspID0+IGJvb2xlYW59IGNoZWNrSGFzXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcGFyYW0geyhrOiBLLCB2PzogVikgPT4gdm9pZH0gYXNzZXJ0T2tUb0FkZFxuICogQHBhcmFtIHsoazogSykgPT4gdm9pZH0gW2Fzc2VydE9rVG9EZWxldGVdXG4gKiBAcGFyYW0ge3N0cmluZ30gW2tleU5hbWVdXG4gKiBAcmV0dXJucyB7Q3VycmVudEtleXNLaXQ8SywgVj59XG4gKi8kaOKAjV9vbmNlLmlzQ29weU1hcChpc0NvcHlNYXApO1xuY29uc3QgICAgICAgIG1ha2VDdXJyZW50S2V5c0tpdD0oXG5nZXRSYXdLZXlzLFxuY2hlY2tIYXMsXG5jb21wYXJlLFxuYXNzZXJ0T2tUb0FkZCxcbmFzc2VydE9rVG9EZWxldGU9dW5kZWZpbmVkLFxua2V5TmFtZT0na2V5Jyk9Plxue1xubGV0IHVwZGF0ZUNvdW50PTA7XG5sZXQgc29ydGVkS2V5c01lbW87XG5cbmNvbnN0IGFzc2VydFVwZGF0ZU9uQWRkPShrLHY9dW5kZWZpbmVkKT0+e1xuYXNzZXJ0T2tUb0FkZChrLHYpO1xudXBkYXRlQ291bnQrPTE7XG5zb3J0ZWRLZXlzTWVtbz11bmRlZmluZWQ7XG4gfTtcblxuY29uc3QgYXNzZXJ0VXBkYXRlT25EZWxldGU9KGspPT5hc3NlcnRPa1RvRGVsZXRlJiZhc3NlcnRPa1RvRGVsZXRlKGspO1xuXG5jb25zdCBnZXRTb3J0ZWRLZXlzPSgpPT57XG5pZihzb3J0ZWRLZXlzTWVtbz09PXVuZGVmaW5lZCl7XG5zb3J0ZWRLZXlzTWVtbz1oYXJkZW4oWy4uLmdldFJhd0tleXMoKV0uc29ydChjb21wYXJlKSk7XG4gfVxucmV0dXJuIHNvcnRlZEtleXNNZW1vO1xuIH07XG5cbmNvbnN0IGl0ZXJhYmxlS2V5cz1GYXIoJ0l0ZXJhYmxlIG9mIGtleXMnLHtcbltTeW1ib2wuaXRlcmF0b3JdOigpPT57XG5jb25zdCBnZW5lcmF0aW9uPXVwZGF0ZUNvdW50O1xuZ2V0U29ydGVkS2V5cygpO1xuY29uc3QgbGVuPXNvcnRlZEtleXNNZW1vLmxlbmd0aDtcbmxldCBpPTA7XG5yZXR1cm4gRmFyKCdJdGVyYXRvciBvZiBrZXlzJyx7XG5uZXh0OigpPT57XG5nZW5lcmF0aW9uPT09dXBkYXRlQ291bnR8fEZhaWwgYFN0b3JlICR7cShrZXlOYW1lKX0gY3Vyc29yIHN0YWxlYDtcbi8qIElmIHRoZXkncmUgZXF1YWwsIHRoZW4gdGhlIHNvcnRlZEtleU1lbW8gaXMgdGhlIHNhbWUgb25lKi9cbi8qIHdlIHN0YXJ0ZWQgd2l0aC4qL1xuZm9yKDs7KXtcbmlmKGk8bGVuKXtcbmNvbnN0IHZhbHVlPXNvcnRlZEtleXNNZW1vW2ldO1xuaSs9MTtcbmlmKGNoZWNrSGFzKHZhbHVlKSl7XG5yZXR1cm4gaGFyZGVuKHtkb25lOmZhbHNlLHZhbHVlfSk7XG4gfVxuIH1lbHNle1xucmV0dXJuIGhhcmRlbih7ZG9uZTp0cnVlLHZhbHVlOnVuZGVmaW5lZH0pO1xuIH1cbiB9XG4gfX0pO1xuXG4gfX0pO1xuXG5cbnJldHVybiBoYXJkZW4oe1xuYXNzZXJ0VXBkYXRlT25BZGQsXG5hc3NlcnRVcGRhdGVPbkRlbGV0ZSxcbml0ZXJhYmxlS2V5c30pO1xuXG4gfTskaOKAjV9vbmNlLm1ha2VDdXJyZW50S2V5c0tpdChtYWtlQ3VycmVudEtleXNLaXQpO1xuaGFyZGVuKG1ha2VDdXJyZW50S2V5c0tpdCk7XG5cbi8qKlxuICogQ2FsbCBgcHJvdmlkZUxhenlgIHRvIGdldCBvciBtYWtlIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGtleS4gSWYgdGhlcmVcbiAqIGFscmVhZHkgaXMgb25lLCByZXR1cm4gdGhhdC4gT3RoZXJ3aXNlLCBjYWxsIGBtYWtlVmFsdWUoa2V5KWAsIHJlbWVtYmVyIGl0IGFzXG4gKiB0aGUgdmFsdWUgZm9yIHRoYXQga2V5LCBhbmQgcmV0dXJuIGl0LlxuICpcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEBwYXJhbSB7V2Vha01hcFN0b3JlPEssIFY+fSBtYXBTdG9yZVxuICogQHBhcmFtIHtLfSBrZXlcbiAqIEBwYXJhbSB7KGtleTogSykgPT4gVn0gbWFrZVZhbHVlXG4gKiBAcmV0dXJucyB7Vn1cbiAqL1xuY29uc3QgICAgICAgIHByb3ZpZGVMYXp5PShtYXBTdG9yZSxrZXksbWFrZVZhbHVlKT0+e1xuaWYoIW1hcFN0b3JlLmhhcyhrZXkpKXtcbm1hcFN0b3JlLmluaXQoa2V5LG1ha2VWYWx1ZShrZXkpKTtcbiB9XG5yZXR1cm4gbWFwU3RvcmUuZ2V0KGtleSk7XG4gfTskaOKAjV9vbmNlLnByb3ZpZGVMYXp5KHByb3ZpZGVMYXp5KTtcbmhhcmRlbihwcm92aWRlTGF6eSk7XG5cbi8qKlxuICogSGVscGVyIGZvciB1c2UgY2FzZXMgaW4gd2hpY2ggdGhlIG1ha2VyIGZ1bmN0aW9uIGlzIGFzeW5jLiBGb3IgdHdvXG4gKiBwcm92aWRlTGF6eSBjYWxscyB3aXRoIHRoZSBzYW1lIGtleSwgb25lIG1heSBiZSBtYWtpbmcgd2hlbiB0aGUgb3RoZXIgY2FsbFxuICogc3RhcnRzIGFuZCBpdCB3b3VsZCBtYWtlIGFnYWluLiAoVGhlbiB0aGVyZSdkIGJlIGEgY29sbGlzaW9uIHdoZW4gdGhlIHNlY29uZFxuICogdHJpZXMgdG8gc3RvcmUgdGhlIGtleS4pIFRoaXMgcHJldmVudHMgdGhhdCByYWNlIGNvbmRpdGlvbiBieSBpbW1lZGlhdGVseVxuICogc3RvcmluZyBhIFByb21pc2UgZm9yIHRoZSBtYWtlciBpbiBhbiBlcGhlbWVyYWwgc3RvcmUuXG4gKlxuICogV2hlbiB0aGUgYHN0b3JlYCBhcmd1bWVudCBpcyBkdXJhYmxlIHN0b3JhZ2UsIG5vdGUgdGhhdCBpdCdzIHBvc3NpYmxlIGZvclxuICogdGVybWluYXRpb24gdG8gaGFwcGVuIGFmdGVyIHRoZSBtYWtlIGNvbXBsZXRlcyBhbmQgYmVmb3JlIGl0IHJlYWNoZXMgZHVyYWJsZVxuICogc3RvcmFnZS5cbiAqXG4gKiBAdGVtcGxhdGUgS1xuICogQHRlbXBsYXRlIFZcbiAqIEBwYXJhbSB7V2Vha01hcFN0b3JlPEssIFY+fSBzdG9yZVxuICovXG5jb25zdCAgICAgICAgbWFrZUF0b21pY1Byb3ZpZGVyPShzdG9yZSk9Pntcbi8qKiBAdHlwZSB7TWFwPEssIFByb21pc2U8Vj4+fSAqL1xuY29uc3QgcGVuZGluZz1uZXcgTWFwKCk7XG5cbi8qKlxuICogQ2FsbCBgcHJvdmlkZUFzeW5jYCB0byBnZXQgb3IgbWFrZSB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXksIHdoZW5cbiAqIHRoZSBtYWtlciBpcyBhc3luY2hyb25vdXMuIElmIHRoZXJlIGFscmVhZHkgaXMgb25lLCByZXR1cm4gdGhhdC4gT3RoZXJ3aXNlLFxuICogY2FsbCBgbWFrZVZhbHVlKGtleSlgLCByZW1lbWJlciBpdCBhcyB0aGUgdmFsdWUgZm9yIHRoYXQga2V5LCBhbmQgcmV0dXJuXG4gKiBpdC5cbiAqXG4gKiBAcGFyYW0ge0t9IGtleVxuICogQHBhcmFtIHsoa2V5OiBLKSA9PiBQcm9taXNlPFY+fSBtYWtlVmFsdWUgbWFrZSB0aGUgdmFsdWUgZm9yIHRoZSBzdG9yZSBpZlxuICogICBpdCBoYXNuJ3QgYmVlbiBtYWRlIHlldCBvciB0aGUgbGFzdCBtYWtlIGZhaWxlZFxuICogQHBhcmFtIHsoa2V5OiBLLCB2YWx1ZTogVikgPT4gUHJvbWlzZTx2b2lkPn0gW2ZpbmlzaFZhbHVlXSBydW5zIGV4YWN0bHlcbiAqICAgb25jZSBhZnRlciBhIG5ldyB2YWx1ZSBpcyBhZGRlZCB0byB0aGUgc3RvcmVcbiAqIEByZXR1cm5zIHtQcm9taXNlPFY+fVxuICovXG5jb25zdCBwcm92aWRlQXN5bmM9KGtleSxtYWtlVmFsdWUsZmluaXNoVmFsdWUpPT57XG5pZihzdG9yZS5oYXMoa2V5KSl7XG5yZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHN0b3JlLmdldChrZXkpKTtcbiB9XG5pZighcGVuZGluZy5oYXMoa2V5KSl7XG5jb25zdCB2YWxQPW1ha2VWYWx1ZShrZXkpLlxudGhlbigodik9PntcbnN0b3JlLmluaXQoa2V5LHYpO1xucmV0dXJuIHY7XG4gfSkuXG50aGVuKCh2KT0+e1xuaWYoZmluaXNoVmFsdWUpe1xucmV0dXJuIGZpbmlzaFZhbHVlKGtleSx2KS50aGVuKCgpPT52KTtcbiB9XG5yZXR1cm4gdjtcbiB9KS5cbmZpbmFsbHkoKCk9PntcbnBlbmRpbmcuZGVsZXRlKGtleSk7XG4gfSk7XG5wZW5kaW5nLnNldChrZXksdmFsUCk7XG4gfVxuY29uc3QgdmFsUD1wZW5kaW5nLmdldChrZXkpO1xuYXNzZXJ0KHZhbFApO1xucmV0dXJuIHZhbFA7XG4gfTtcblxucmV0dXJuIGhhcmRlbih7cHJvdmlkZUFzeW5jfSk7XG4gfTskaOKAjV9vbmNlLm1ha2VBdG9taWNQcm92aWRlcihtYWtlQXRvbWljUHJvdmlkZXIpO1xuaGFyZGVuKG1ha2VBdG9taWNQcm92aWRlcik7XG4vKipcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAdGVtcGxhdGUgVlxuICogQHR5cGVkZWYge1JldHVyblR5cGU8dHlwZW9mIG1ha2VBdG9taWNQcm92aWRlcjxLLCBWPj59IEF0b21pY1Byb3ZpZGVyPEssIFY+XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgSywgVlxuICogQHBhcmFtIHtNYXBTdG9yZTxLLCBWW10+fSBtYXBTdG9yZVxuICogQHBhcmFtIHtLfSBrZXlcbiAqIEBwYXJhbSB7Vn0gaXRlbVxuICovXG5jb25zdCAgICAgICAgYXBwZW5kVG9TdG9yZWRBcnJheT0obWFwU3RvcmUsa2V5LGl0ZW0pPT57XG5pZihtYXBTdG9yZS5oYXMoa2V5KSl7XG5jb25zdCBleHRhbnQ9bWFwU3RvcmUuZ2V0KGtleSk7XG5tYXBTdG9yZS5zZXQoa2V5LGhhcmRlbihbLi4uZXh0YW50LGl0ZW1dKSk7XG4gfWVsc2V7XG5tYXBTdG9yZS5pbml0KGtleSxoYXJkZW4oW2l0ZW1dKSk7XG4gfVxuIH07JGjigI1fb25jZS5hcHBlbmRUb1N0b3JlZEFycmF5KGFwcGVuZFRvU3RvcmVkQXJyYXkpO1xuaGFyZGVuKGFwcGVuZFRvU3RvcmVkQXJyYXkpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzQ29weVNldCI6WyJpc0NvcHlTZXQiXSwiaXNDb3B5TWFwIjpbImlzQ29weU1hcCJdLCJtYWtlQ3VycmVudEtleXNLaXQiOlsibWFrZUN1cnJlbnRLZXlzS2l0Il0sInByb3ZpZGVMYXp5IjpbInByb3ZpZGVMYXp5Il0sIm1ha2VBdG9taWNQcm92aWRlciI6WyJtYWtlQXRvbWljUHJvdmlkZXIiXSwiYXBwZW5kVG9TdG9yZWRBcnJheSI6WyJhcHBlbmRUb1N0b3JlZEFycmF5Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAFb+gMXQHwAA0B8AACEAAABAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKi8gPHJlZmVyZW5jZSB0eXBlcz1cInNlc1wiLz4qL1xuXG4vKipcbiAqIE5vdGUgVE9ETyBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vaXNzdWVzLzE0ODhcbiAqXG4gKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vcGFzcy1zdHlsZScpLlBhc3NhYmxlfSBQYXNzYWJsZVxuICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL3Bhc3Mtc3R5bGUnKS5Db3B5VGFnZ2VkfSBDb3B5VGFnZ2VkICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL3BhdHRlcm5zJykuUGF0dGVybn0gUGF0dGVybiAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9wYXR0ZXJucycpLktleX0gS2V5ICovXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBbSz1LZXldXG4gKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vcGF0dGVybnMnKS5Db3B5U2V0PEs+fSBDb3B5U2V0XG4gKi9cbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IFtLPUtleV1cbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFtWPVBhc3NhYmxlXVxuICogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL3BhdHRlcm5zJykuQ29weU1hcDxLLCBWPn0gQ29weU1hcFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU3RvcmVPcHRpb25zIE9mIHRoZSBkaW1lbnNpb25zIG9uIHdoaWNoIEtleWVkU3RvcmVzIGNhblxuICogICBkaWZmZXIsIHdlIG9ubHkgcmVwcmVzZW50IGEgZmV3IG9mIHRoZW0gYXMgc3RhbmRhcmQgb3B0aW9ucy4gQSBnaXZlbiBzdG9yZVxuICogICBtYWtlciBzaG91bGQgZG9jdW1lbnQgd2hpY2ggb3B0aW9ucyBpdCBzdXBwb3J0cywgYXMgd2VsbCBhcyBpdHMgcG9zaXRpb25zXG4gKiAgIG9uIGRpbWVuc2lvbnMgZm9yIHdoaWNoIGl0IGRvZXMgbm90IHN1cHBvcnQgb3B0aW9ucy5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2xvbmdMaXZlZF0gV2hpY2ggd2F5IHRvIG9wdGltaXplIGEgd2VhayBzdG9yZS4gVHJ1ZVxuICogICBtZWFucyB0aGF0IHdlIGV4cGVjdCB0aGlzIHdlYWsgc3RvcmUgdG8gb3V0bGl2ZSBtb3N0IG9mIGl0cyBrZXlzLCBpbiB3aGljaFxuICogICBjYXNlIHdlIGludGVybmFsbHkgbWF5IHVzZSBhIEphdmFTY3JpcHQgYFdlYWtNYXBgLiBPdGhlcndpc2Ugd2UgaW50ZXJuYWxseVxuICogICBtYXkgdXNlIGEgSmF2YVNjcmlwdCBgTWFwYC4gRGVmYXVsdHMgdG8gdHJ1ZSwgc28gcGxlYXNlIG1hcmsgc2hvcnQgbGl2ZWRcbiAqICAgc3RvcmVzIGV4cGxpY2l0bHkuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtkdXJhYmxlXSBUaGUgY29udGVudHMgb2YgdGhpcyBzdG9yZSBzdXJ2aXZlIHRlcm1pbmF0aW9uXG4gKiAgIG9mIGl0cyBjb250YWluaW5nIHByb2Nlc3MsIGFsbG93aW5nIGZvciByZXN0YXJ0IG9yIHVwZ3JhZGUgYnV0IGF0IHRoZSBjb3N0XG4gKiAgIG9mIGZvcmJpZGRpbmcgc3RvcmFnZSBvZiByZWZlcmVuY2VzIHRvIGVwaGVtZXJhbCBkYXRhLiBEZWZhdWx0cyB0byBmYWxzZS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2Zha2VEdXJhYmxlXSBUaGlzIHN0b3JlIHByZXRlbmRzIHRvIGJlIGEgZHVyYWJsZSBzdG9yZVxuICogICBidXQgZG9lcyBub3QgZW5mb3JjZSB0aGF0IHRoZSB0aGluZ3Mgc3RvcmVkIGluIGl0IGFjdHVhbGx5IGJlIHRoZW1zZWx2ZXNcbiAqICAgZHVyYWJsZSAod2hlcmVhcyBhbiBhY3R1YWwgZHVyYWJsZSBzdG9yZSB3b3VsZCBmb3JiaWQgc3RvcmFnZSBvZiBzdWNoXG4gKiAgIGl0ZW1zKS4gVGhpcyBpcyBpbiBzZXJ2aWNlIG9mIGFsbG93aW5nIGluY3JlbWVudGFsIHRyYW5zaXRpb24gdG8gdXNlIG9mXG4gKiAgIGR1cmFibGUgc3RvcmVzLCB0byBlbmFibGUgbm9ybWFsIG9wZXJhdGlvbiBhbmQgdGVzdGluZyB3aGVuIHNvbWUgc3R1ZmZcbiAqICAgaW50ZW5kZWQgdG8gZXZlbnR1YWxseSBiZSBkdXJhYmxlIGhhcyBub3QgeWV0IGJlZW4gbWFkZSBkdXJhYmxlLiBBIHN0b3JlXG4gKiAgIG1hcmtlZCBhcyBmYWtlRHVyYWJsZSB3aWxsIGFwcGVhciB0byBvcGVyYXRlIG5vcm1hbGx5IGJ1dCBhbnkgYXR0ZW1wdCB0b1xuICogICB1cGdyYWRlIGl0cyBjb250YWluaW5nIHZhdCB3aWxsIGZhaWwgd2l0aCBhbiBlcnJvci4gRGVmYXVsdHMgdG8gZmFsc2UuXG4gKiBAcHJvcGVydHkge1BhdHRlcm59IFtrZXlTaGFwZV1cbiAqIEBwcm9wZXJ0eSB7UGF0dGVybn0gW3ZhbHVlU2hhcGVdXG4gKi9cblxuLyoqXG4gKiBNb3N0IHN0b3JlIG1ldGhvZHMgYXJlIGluIG9uZSBvZiB0aHJlZSBjYXRlZ29yaWVzXG4gKlxuICogLSBsb29rdXAgbWV0aG9kcyAoYGhhc2AsYGdldGApXG4gKiAtIHVwZGF0ZSBtZXRob2RzIChgYWRkYCxgaW5pdGAsYHNldGAsYGRlbGV0ZWAsYGFkZEFsbGApXG4gKiAtIHF1ZXJ5IG1ldGhvZHMgKGBzbmFwc2hvdGAsYGtleXNgLGB2YWx1ZXNgLGBlbnRyaWVzYCxgZ2V0U2l6ZWApXG4gKiAtIHF1ZXJ5LXVwZGF0ZSBtZXRob2RzIChgY2xlYXJgKVxuICpcbiAqIFdlYWtTdG9yZXMgaGF2ZSB0aGUgbG9va3VwIGFuZCB1cGRhdGUgbWV0aG9kcyBidXQgbm90IHRoZSBxdWVyeSBvclxuICogcXVlcnktdXBkYXRlIG1ldGhvZHMuIE5vbi13ZWFrIFN0b3JlcyBhcmUgbGlrZSB0aGVpciBjb3JyZXNwb25kaW5nXG4gKiBXZWFrU3RvcmVzLCBidXQgd2l0aCB0aGUgYWRkaXRpb25hbCBxdWVyeSBhbmQgcXVlcnktdXBkYXRlIG1ldGhvZHMuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleSAmIG9iamVjdH0gW0s9S2V5XVxuICogQHR5cGVkZWYge29iamVjdH0gV2Vha1NldFN0b3JlXG4gKiBAcHJvcGVydHkgeyhrZXk6IEspID0+IGJvb2xlYW59IGhhcyBDaGVjayBpZiBhIGtleSBleGlzdHMuIFRoZSBrZXkgY2FuIGJlIGFueVxuICogICBKYXZhU2NyaXB0IHZhbHVlLCB0aG91Z2ggdGhlIGFuc3dlciB3aWxsIGFsd2F5cyBiZSBmYWxzZSBmb3Iga2V5cyB0aGF0XG4gKiAgIGNhbm5vdCBiZSBmb3VuZCBpbiB0aGlzIHN0b3JlLlxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiB2b2lkfSBhZGQgQWRkIHRoZSBrZXkgdG8gdGhlIHNldCBpZiBpdCBpcyBub3QgYWxyZWFkeVxuICogICB0aGVyZS4gRG8gbm90aGluZyBzaWxlbnRseSBpZiBhbHJlYWR5IHRoZXJlLiBUaGUga2V5IG11c3QgYmUgb25lIGFsbG93ZWQgYnlcbiAqICAgdGhpcyBzdG9yZS4gRm9yIGV4YW1wbGUgYSBzY2FsYXIgc3RvcmUgb25seSBhbGxvd3MgcHJpbWl0aXZlcyBhbmRcbiAqICAgcmVtb3RhYmxlcy5cbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gdm9pZH0gZGVsZXRlIFJlbW92ZSB0aGUga2V5LiBUaHJvd3MgaWYgbm90IGZvdW5kLlxuICogQHByb3BlcnR5IHsoa2V5czogQ29weVNldDxLPiB8IEl0ZXJhYmxlPEs+KSA9PiB2b2lkfSBhZGRBbGxcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBbSz1LZXldXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTZXRTdG9yZVxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiBib29sZWFufSBoYXMgQ2hlY2sgaWYgYSBrZXkgZXhpc3RzLiBUaGUga2V5IGNhbiBiZSBhbnlcbiAqICAgSmF2YVNjcmlwdCB2YWx1ZSwgdGhvdWdoIHRoZSBhbnN3ZXIgd2lsbCBhbHdheXMgYmUgZmFsc2UgZm9yIGtleXMgdGhhdFxuICogICBjYW5ub3QgYmUgZm91bmQgaW4gdGhpcyBzdG9yZS5cbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gdm9pZH0gYWRkIEFkZCB0aGUga2V5IHRvIHRoZSBzZXQgaWYgaXQgaXMgbm90IGFscmVhZHlcbiAqICAgdGhlcmUuIERvIG5vdGhpbmcgc2lsZW50bHkgaWYgYWxyZWFkeSB0aGVyZS4gVGhlIGtleSBtdXN0IGJlIG9uZSBhbGxvd2VkIGJ5XG4gKiAgIHRoaXMgc3RvcmUuIEZvciBleGFtcGxlIGEgc2NhbGFyIHN0b3JlIG9ubHkgYWxsb3dzIHByaW1pdGl2ZXMgYW5kXG4gKiAgIHJlbW90YWJsZXMuXG4gKiBAcHJvcGVydHkgeyhrZXk6IEspID0+IHZvaWR9IGRlbGV0ZSBSZW1vdmUgdGhlIGtleS4gVGhyb3dzIGlmIG5vdCBmb3VuZC5cbiAqIEBwcm9wZXJ0eSB7KGtleXM6IENvcHlTZXQ8Sz4gfCBJdGVyYWJsZTxLPikgPT4gdm9pZH0gYWRkQWxsXG4gKiBAcHJvcGVydHkgeyhrZXlQYXR0PzogUGF0dGVybikgPT4gSXRlcmFibGU8Sz59IGtleXNcbiAqIEBwcm9wZXJ0eSB7KGtleVBhdHQ/OiBQYXR0ZXJuKSA9PiBJdGVyYWJsZTxLPn0gdmFsdWVzXG4gKiBAcHJvcGVydHkgeyhrZXlQYXR0PzogUGF0dGVybikgPT4gQ29weVNldDxLPn0gc25hcHNob3RcbiAqIEBwcm9wZXJ0eSB7KGtleVBhdHQ/OiBQYXR0ZXJuKSA9PiBudW1iZXJ9IGdldFNpemVcbiAqIEBwcm9wZXJ0eSB7KGtleVBhdHQ/OiBQYXR0ZXJuKSA9PiB2b2lkfSBjbGVhclxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXkgJiBvYmplY3R9IFtLPUtleV1cbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFtWPVBhc3NhYmxlXVxuICogQHR5cGVkZWYge29iamVjdH0gV2Vha01hcFN0b3JlXG4gKiBAcHJvcGVydHkgeyhrZXk6IEspID0+IGJvb2xlYW59IGhhcyBDaGVjayBpZiBhIGtleSBleGlzdHMuIFRoZSBrZXkgY2FuIGJlIGFueVxuICogICBKYXZhU2NyaXB0IHZhbHVlLCB0aG91Z2ggdGhlIGFuc3dlciB3aWxsIGFsd2F5cyBiZSBmYWxzZSBmb3Iga2V5cyB0aGF0XG4gKiAgIGNhbm5vdCBiZSBmb3VuZCBpbiB0aGlzIHN0b3JlLlxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiBWfSBnZXQgUmV0dXJuIGEgdmFsdWUgZm9yIHRoZSBrZXkuIFRocm93cyBpZiBub3RcbiAqICAgZm91bmQuXG4gKiBAcHJvcGVydHkgeyhrZXk6IEssIHZhbHVlOiBWKSA9PiB2b2lkfSBpbml0IEluaXRpYWxpemUgdGhlIGtleSBvbmx5IGlmIGl0XG4gKiAgIGRvZXNuJ3QgYWxyZWFkeSBleGlzdC4gVGhlIGtleSBtdXN0IGJlIG9uZSBhbGxvd2VkIGJ5IHRoaXMgc3RvcmUuIEZvclxuICogICBleGFtcGxlIGEgc2NhbGFyIHN0b3JlIG9ubHkgYWxsb3dzIHByaW1pdGl2ZXMgYW5kIHJlbW90YWJsZXMuXG4gKiBAcHJvcGVydHkgeyhrZXk6IEssIHZhbHVlOiBWKSA9PiB2b2lkfSBzZXQgU2V0IHRoZSBrZXkuIFRocm93cyBpZiBub3QgZm91bmQuXG4gKiBAcHJvcGVydHkgeyhrZXk6IEspID0+IHZvaWR9IGRlbGV0ZSBSZW1vdmUgdGhlIGtleS4gVGhyb3dzIGlmIG5vdCBmb3VuZC5cbiAqIEBwcm9wZXJ0eSB7KGVudHJpZXM6IENvcHlNYXA8SywgVj4gfCBJdGVyYWJsZTxbSywgVl0+KSA9PiB2b2lkfSBhZGRBbGxcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBbSz1LZXldXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBbVj1QYXNzYWJsZV1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IE1hcFN0b3JlXG4gKiBAcHJvcGVydHkgeyhrZXk6IEspID0+IGJvb2xlYW59IGhhcyBDaGVjayBpZiBhIGtleSBleGlzdHMuIFRoZSBrZXkgY2FuIGJlIGFueVxuICogICBKYXZhU2NyaXB0IHZhbHVlLCB0aG91Z2ggdGhlIGFuc3dlciB3aWxsIGFsd2F5cyBiZSBmYWxzZSBmb3Iga2V5cyB0aGF0XG4gKiAgIGNhbm5vdCBiZSBmb3VuZCBpbiB0aGlzIG1hcFxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiBWfSBnZXQgUmV0dXJuIGEgdmFsdWUgZm9yIHRoZSBrZXkuIFRocm93cyBpZiBub3RcbiAqICAgZm91bmQuXG4gKiBAcHJvcGVydHkgeyhrZXk6IEssIHZhbHVlOiBWKSA9PiB2b2lkfSBpbml0IEluaXRpYWxpemUgdGhlIGtleSBvbmx5IGlmIGl0XG4gKiAgIGRvZXNuJ3QgYWxyZWFkeSBleGlzdC4gVGhlIGtleSBtdXN0IGJlIG9uZSBhbGxvd2VkIGJ5IHRoaXMgc3RvcmUuIEZvclxuICogICBleGFtcGxlIGEgc2NhbGFyIHN0b3JlIG9ubHkgYWxsb3dzIHByaW1pdGl2ZXMgYW5kIHJlbW90YWJsZXMuXG4gKiBAcHJvcGVydHkgeyhrZXk6IEssIHZhbHVlOiBWKSA9PiB2b2lkfSBzZXQgU2V0IHRoZSBrZXkuIFRocm93cyBpZiBub3QgZm91bmQuXG4gKiBAcHJvcGVydHkgeyhrZXk6IEspID0+IHZvaWR9IGRlbGV0ZSBSZW1vdmUgdGhlIGtleS4gVGhyb3dzIGlmIG5vdCBmb3VuZC5cbiAqIEBwcm9wZXJ0eSB7KGVudHJpZXM6IENvcHlNYXA8SywgVj4gfCBJdGVyYWJsZTxbSywgVl0+KSA9PiB2b2lkfSBhZGRBbGxcbiAqIEBwcm9wZXJ0eSB7KGtleVBhdHQ/OiBQYXR0ZXJuLCB2YWx1ZVBhdHQ/OiBQYXR0ZXJuKSA9PiBJdGVyYWJsZTxLPn0ga2V5c1xuICogQHByb3BlcnR5IHsoa2V5UGF0dD86IFBhdHRlcm4sIHZhbHVlUGF0dD86IFBhdHRlcm4pID0+IEl0ZXJhYmxlPFY+fSB2YWx1ZXNcbiAqIEBwcm9wZXJ0eSB7KGtleVBhdHQ/OiBQYXR0ZXJuLCB2YWx1ZVBhdHQ/OiBQYXR0ZXJuKSA9PiBJdGVyYWJsZTxbSywgVl0+fSBlbnRyaWVzXG4gKiBAcHJvcGVydHkgeyhrZXlQYXR0PzogUGF0dGVybiwgdmFsdWVQYXR0PzogUGF0dGVybikgPT4gQ29weU1hcDxLLCBWPn0gc25hcHNob3RcbiAqIEBwcm9wZXJ0eSB7KGtleVBhdHQ/OiBQYXR0ZXJuLCB2YWx1ZVBhdHQ/OiBQYXR0ZXJuKSA9PiBudW1iZXJ9IGdldFNpemVcbiAqIEBwcm9wZXJ0eSB7KGtleVBhdHQ/OiBQYXR0ZXJuLCB2YWx1ZVBhdHQ/OiBQYXR0ZXJuKSA9PiB2b2lkfSBjbGVhclxuICovXG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gRGVwcmVjYXRlZCBMZWdhY3kgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBMZWdhY3lXZWFrTWFwIExlZ2FjeVdlYWtNYXAgaXMgZGVwcmVjYXRlZC4gVXNlIFdlYWtNYXBTdG9yZVxuICogICBpbnN0ZWFkIGlmIHBvc3NpYmxlLlxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiBib29sZWFufSBoYXMgQ2hlY2sgaWYgYSBrZXkgZXhpc3RzXG4gKiBAcHJvcGVydHkgeyhrZXk6IEspID0+IFZ9IGdldCBSZXR1cm4gYSB2YWx1ZSBmb3IgdGhlIGtleS4gVGhyb3dzIGlmIG5vdFxuICogICBmb3VuZC5cbiAqIEBwcm9wZXJ0eSB7KGtleTogSywgdmFsdWU6IFYpID0+IHZvaWR9IGluaXQgSW5pdGlhbGl6ZSB0aGUga2V5IG9ubHkgaWYgaXRcbiAqICAgZG9lc24ndCBhbHJlYWR5IGV4aXN0XG4gKiBAcHJvcGVydHkgeyhrZXk6IEssIHZhbHVlOiBWKSA9PiB2b2lkfSBzZXQgU2V0IHRoZSBrZXkuIFRocm93cyBpZiBub3QgZm91bmQuXG4gKiBAcHJvcGVydHkgeyhrZXk6IEspID0+IHZvaWR9IGRlbGV0ZSBSZW1vdmUgdGhlIGtleS4gVGhyb3dzIGlmIG5vdCBmb3VuZC5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEB0eXBlZGVmIHtvYmplY3R9IExlZ2FjeU1hcCBMZWdhY3lNYXAgaXMgZGVwcmVjYXRlZC4gVXNlIE1hcFN0b3JlIGluc3RlYWQgaWZcbiAqICAgcG9zc2libGUuXG4gKiBAcHJvcGVydHkgeyhrZXk6IEspID0+IGJvb2xlYW59IGhhcyBDaGVjayBpZiBhIGtleSBleGlzdHNcbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gVn0gZ2V0IFJldHVybiBhIHZhbHVlIGZvciB0aGUga2V5LiBUaHJvd3MgaWYgbm90XG4gKiAgIGZvdW5kLlxuICogQHByb3BlcnR5IHsoa2V5OiBLLCB2YWx1ZTogVikgPT4gdm9pZH0gaW5pdCBJbml0aWFsaXplIHRoZSBrZXkgb25seSBpZiBpdFxuICogICBkb2Vzbid0IGFscmVhZHkgZXhpc3RcbiAqIEBwcm9wZXJ0eSB7KGtleTogSywgdmFsdWU6IFYpID0+IHZvaWR9IHNldCBTZXQgdGhlIGtleS4gVGhyb3dzIGlmIG5vdCBmb3VuZC5cbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gdm9pZH0gZGVsZXRlIFJlbW92ZSB0aGUga2V5LiBUaHJvd3MgaWYgbm90IGZvdW5kLlxuICogQHByb3BlcnR5IHsoKSA9PiBJdGVyYWJsZTxLPn0ga2V5c1xuICogQHByb3BlcnR5IHsoKSA9PiBJdGVyYWJsZTxWPn0gdmFsdWVzXG4gKiBAcHJvcGVydHkgeygpID0+IEl0ZXJhYmxlPFtLLCBWXT59IGVudHJpZXNcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gbnVtYmVyfSBnZXRTaXplXG4gKiBAcHJvcGVydHkgeygpID0+IHZvaWR9IGNsZWFyXG4gKi9cbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAIZgh2L8BAAC/AQAAHAAAAEBhZ29yaWMvdGltZS12MC4zLjIvaW5kZXguanN7ImltcG9ydHMiOlsiLi9zcmMvdGltZU1hdGguanMiLCIuL3NyYy90eXBlR3VhcmRzLmpzIl0sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOlsiLi9zcmMvdGltZU1hdGguanMiLCIuL3NyYy90eXBlR3VhcmRzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbW1wiLi9zcmMvdGltZU1hdGguanNcIiwgW11dLFtcIi4vc3JjL3R5cGVHdWFyZHMuanNcIiwgW11dXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANj3JWrwIgAA8CIAACMAAABAYWdvcmljL3RpbWUtdjAuMy4yL3NyYy90aW1lTWF0aC5qc3siaW1wb3J0cyI6WyJAZW5kby9uYXQiLCJAZW5kby9wYXR0ZXJucyIsIi4vdHlwZUd1YXJkcy5qcyJdLCJleHBvcnRzIjpbIlRpbWVNYXRoIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IE5hdCxtdXN0TWF0Y2gsUmVsYXRpdmVUaW1lUmVjb3JkU2hhcGUsVGltZXN0YW1wUmVjb3JkU2hhcGU7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbmF0XCIsIFtbXCJOYXRcIiwgWyRo4oCNX2EgPT4gKE5hdCA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wibXVzdE1hdGNoXCIsIFskaOKAjV9hID0+IChtdXN0TWF0Y2ggPSAkaOKAjV9hKV1dXV0sW1wiLi90eXBlR3VhcmRzLmpzXCIsIFtbXCJSZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZVwiLCBbJGjigI1fYSA9PiAoUmVsYXRpdmVUaW1lUmVjb3JkU2hhcGUgPSAkaOKAjV9hKV1dLFtcIlRpbWVzdGFtcFJlY29yZFNoYXBlXCIsIFskaOKAjV9hID0+IChUaW1lc3RhbXBSZWNvcmRTaGFwZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuY29uc3R7RmFpbCxxdW90ZTpxfT1hc3NlcnQ7XG4vKipcbiAqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9tYXJzaGFsJykuUmFua0NvbXBhcmlzb259IFJhbmtDb21wYXJpc29uXG4gKlxuICogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMnKS5UaW1lckJyYW5kfSBUaW1lckJyYW5kXG4gKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcycpLlRpbWVzdGFtcH0gVGltZXN0YW1wXG4gKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcycpLlJlbGF0aXZlVGltZX0gUmVsYXRpdmVUaW1lXG4gKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcycpLlJlbGF0aXZlVGltZVZhbHVlfSBSZWxhdGl2ZVRpbWVWYWx1ZVxuICogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMnKS5UaW1lc3RhbXBWYWx1ZX0gVGltZXN0YW1wVmFsdWVcbiAqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzJykuVGltZU1hdGhUeXBlfSBUaW1lTWF0aFR5cGVcbiAqL1xuXG4vKipcbiAqIGBhZ3JlZWRUaW1lckJyYW5kYCBpcyBpbnRlcm5hbCB0byB0aGlzIG1vZHVsZS5cbiAqXG4gKiBAcGFyYW0ge1RpbWVyQnJhbmQgfCB1bmRlZmluZWR9IGxlZnRCcmFuZFxuICogQHBhcmFtIHtUaW1lckJyYW5kIHwgdW5kZWZpbmVkfSByaWdodEJyYW5kXG4gKiBAcmV0dXJucyB7VGltZXJCcmFuZCB8IHVuZGVmaW5lZH1cbiAqL1xuY29uc3QgYWdyZWVkVGltZXJCcmFuZD0obGVmdEJyYW5kLHJpZ2h0QnJhbmQpPT57XG5pZihsZWZ0QnJhbmQ9PT11bmRlZmluZWQpe1xuaWYocmlnaHRCcmFuZD09PXVuZGVmaW5lZCl7XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH1lbHNle1xucmV0dXJuIHJpZ2h0QnJhbmQ7XG4gfVxuIH1lbHNlIGlmKHJpZ2h0QnJhbmQ9PT11bmRlZmluZWQpe1xucmV0dXJuIGxlZnRCcmFuZDtcbiB9ZWxzZXtcbmxlZnRCcmFuZD09PXJpZ2h0QnJhbmR8fFxuRmFpbCBgVGltZXJCcmFuZHMgbXVzdCBtYXRjaDogJHtxKGxlZnRCcmFuZCl9IHZzICR7cShyaWdodEJyYW5kKX1gO1xucmV0dXJuIGxlZnRCcmFuZDtcbiB9XG4gfTtcblxuLyoqXG4gKiBgc2hhcmVkVGltZXJCcmFuZGAgaXMgaW50ZXJuYWwgdG8gdGhpcyBtb2R1bGUsIGFuZCBpbXBsZW1lbnRzIHRoZVxuICogdHJhbnNpdGlvbmFsIGJyYW5kIGNoZWNraW5nIGFuZCBjb250YWlnaW9uIGxvZ2ljIGV4cGxhaW5lZCBpbiB0aGUgYFRpbWVNYXRoYFxuICogY29tbWVudC4gSXQgaXMgdXNlZCB0byBkZWZpbmUgdGhlIGJpbmFyeSBvcGVyYXRvcnMgdGhhdCBzaG91bGQgZm9sbG93XG4gKiB0aGlzIGxvZ2ljLiBJdCBkb2VzIHRoZSBlcnJvciBjaGVja2luZyBiZXR3ZWVuIHRoZSBvcGVyYW5kcywgYW5kIHJldHVybnNcbiAqIHRoZSBicmFuZCwgaWYgYW55LCB0aGF0IHNob3VsZCBsYWJlbCB0aGUgcmVzdWx0aW5nIHRpbWUgdmFsdWUuXG4gKlxuICogQHBhcmFtIHtUaW1lc3RhbXAgfCBSZWxhdGl2ZVRpbWV9IGxlZnRcbiAqIEBwYXJhbSB7VGltZXN0YW1wIHwgUmVsYXRpdmVUaW1lfSByaWdodFxuICogQHJldHVybnMge1RpbWVyQnJhbmQgfCB1bmRlZmluZWR9XG4gKi9cbmNvbnN0IHNoYXJlZFRpbWVyQnJhbmQ9KGxlZnQscmlnaHQpPT57XG5jb25zdCBsZWZ0QnJhbmQ9dHlwZW9mIGxlZnQ9PT0nYmlnaW50Jz91bmRlZmluZWQ6bGVmdC50aW1lckJyYW5kO1xuY29uc3QgcmlnaHRCcmFuZD10eXBlb2YgcmlnaHQ9PT0nYmlnaW50Jz91bmRlZmluZWQ6cmlnaHQudGltZXJCcmFuZDtcbnJldHVybiBhZ3JlZWRUaW1lckJyYW5kKGxlZnRCcmFuZCxyaWdodEJyYW5kKTtcbiB9O1xuXG4vKipcbiAqIGBhYnNMaWtlYCBpcyBpbnRlcm5hbCB0byB0aGlzIG1vZHVsZSwgYW5kIHVzZWQgdG8gaW1wbGVtZW50IHRoZSBiaW5hcnlcbiAqIG9wZXJhdG9ycyBpbiB0aGUgY2FzZSB3aGVyZSB0aGUgcmV0dXJuZWQgdGltZSBzaG91bGQgYmUgYSBgVGltZXN0YW1wYFxuICogcmF0aGVyIHRoYW4gYSBgUmVsYXRpdmVUaW1lYC5cbiAqXG4gKiBAcGFyYW0ge1RpbWVzdGFtcCB8IFJlbGF0aXZlVGltZX0gbGVmdFxuICogQHBhcmFtIHtUaW1lc3RhbXAgfCBSZWxhdGl2ZVRpbWV9IHJpZ2h0XG4gKiBAcGFyYW0ge1RpbWVzdGFtcFZhbHVlfSBhYnNWYWx1ZVxuICogQHJldHVybnMge1RpbWVzdGFtcH1cbiAqL1xuY29uc3QgYWJzTGlrZT0obGVmdCxyaWdodCxhYnNWYWx1ZSk9Pntcbk5hdChhYnNWYWx1ZSk7XG5jb25zdCB0aW1lckJyYW5kPXNoYXJlZFRpbWVyQnJhbmQobGVmdCxyaWdodCk7XG5pZih0aW1lckJyYW5kKXtcbnJldHVybiBoYXJkZW4oe1xudGltZXJCcmFuZCxcbmFic1ZhbHVlfSk7XG5cbiB9ZWxzZXtcbnJldHVybiBhYnNWYWx1ZTtcbiB9XG4gfTtcblxuLyoqXG4gKiBgcmVsTGlrZWAgaXMgaW50ZXJuYWwgdG8gdGhpcyBtb2R1bGUsIGFuZCB1c2VkIHRvIGltcGxlbWVudCB0aGUgYmluYXJ5XG4gKiBvcGVyYXRvcnMgaW4gdGhlIGNhc2Ugd2hlcmUgdGhlIHJldHVybmVkIHRpbWUgc2hvdWxkIGJlIGEgYFJlbGF0aXZlVGltZWBcbiAqIHJhdGhlciB0aGFuIGEgYFRpbWVzdGFtcGAuXG4gKlxuICogQHBhcmFtIHtUaW1lc3RhbXAgfCBSZWxhdGl2ZVRpbWV9IGxlZnRcbiAqIEBwYXJhbSB7VGltZXN0YW1wIHwgUmVsYXRpdmVUaW1lfSByaWdodFxuICogQHBhcmFtIHtSZWxhdGl2ZVRpbWVWYWx1ZX0gcmVsVmFsdWVcbiAqIEByZXR1cm5zIHtSZWxhdGl2ZVRpbWV9XG4gKi9cbmNvbnN0IHJlbExpa2U9KGxlZnQscmlnaHQscmVsVmFsdWUpPT57XG5OYXQocmVsVmFsdWUpO1xuY29uc3QgdGltZXJCcmFuZD1zaGFyZWRUaW1lckJyYW5kKGxlZnQscmlnaHQpO1xuaWYodGltZXJCcmFuZCl7XG5yZXR1cm4gaGFyZGVuKHtcbnRpbWVyQnJhbmQsXG5yZWxWYWx1ZX0pO1xuXG4gfWVsc2V7XG5yZXR1cm4gcmVsVmFsdWU7XG4gfVxuIH07XG5cbi8qIEZvciBhbGwgdGhlIGZvbGxvd2luZyB0aW1lIG9wZXJhdG9ycywgdGhlaXIgZG9jdW1lbnRhdGlvbiBpcyBpbiovXG4vKiB0aGUgYFRpbWVNYXRoVHlwZWAsIHNpbmNlIHRoYXQgaXMgdGhlIGRvY3VtZW50YXRpb24gdGhhdCBzaG93cyB1cCovXG4vKiBpbiB0aGUgSURFLiBXZWxsLCBhdCBsZWFzdCB0aGUgdnNjb2RlIElERS4qL1xuXG5jb25zdCBhYnNWYWx1ZT0oYWJzKT0+e1xuaWYodHlwZW9mIGFicz09PSdiaWdpbnQnKXtcbnJldHVybiBOYXQoYWJzKTtcbiB9XG5tdXN0TWF0Y2goYWJzLFRpbWVzdGFtcFJlY29yZFNoYXBlLCd0aW1lc3RhbXAnKTtcbnJldHVybiBOYXQoYWJzLmFic1ZhbHVlKTtcbiB9O1xuXG5jb25zdCByZWxWYWx1ZT0ocmVsKT0+e1xuaWYodHlwZW9mIHJlbD09PSdiaWdpbnQnKXtcbnJldHVybiBOYXQocmVsKTtcbiB9XG5tdXN0TWF0Y2gocmVsLFJlbGF0aXZlVGltZVJlY29yZFNoYXBlLCdyZWxhdGl2ZScpO1xucmV0dXJuIE5hdChyZWwucmVsVmFsdWUpO1xuIH07XG5cbmNvbnN0IG1ha2VUaW1lc3RhbXBSZWNvcmQ9KGFicyx0aW1lckJyYW5kKT0+XG5oYXJkZW4oe2Fic1ZhbHVlOmFicyx0aW1lckJyYW5kfSk7XG5jb25zdCBtYWtlUmVsYXRpdmVUaW1lUmVjb3JkPShyZWwsdGltZXJCcmFuZCk9PlxuaGFyZGVuKHtyZWxWYWx1ZTpyZWwsdGltZXJCcmFuZH0pO1xuXG5jb25zdCBjb2VyY2VUaW1lc3RhbXBSZWNvcmQ9KHRzLGJyYW5kKT0+e1xuYnJhbmR8fEZhaWwgYG11c3QgaGF2ZSBhIGJyYW5kYDtcbmlmKHR5cGVvZiB0cz09PSdudW1iZXInKXtcbnRzPU5hdCh0cyk7XG4gfVxuaWYodHlwZW9mIHRzPT09J2JpZ2ludCcpe1xucmV0dXJuIG1ha2VUaW1lc3RhbXBSZWNvcmQodHMsYnJhbmQpO1xuIH1lbHNle1xuY29uc3R7dGltZXJCcmFuZH09dHM7XG5tdXN0TWF0Y2godHMsVGltZXN0YW1wUmVjb3JkU2hhcGUsJ3RpbWVzdGFtcCcpO1xuYWdyZWVkVGltZXJCcmFuZCh0aW1lckJyYW5kLGJyYW5kKTtcbnJldHVybiB0cztcbiB9XG4gfTtcblxuY29uc3QgY29lcmNlUmVsYXRpdmVUaW1lUmVjb3JkPShydCxicmFuZCk9PntcbmJyYW5kfHxGYWlsIGBtdXN0IGhhdmUgYSBicmFuZGA7XG5pZih0eXBlb2YgcnQ9PT0nbnVtYmVyJyl7XG5ydD1OYXQocnQpO1xuIH1cbmlmKHR5cGVvZiBydD09PSdiaWdpbnQnKXtcbnJldHVybiBtYWtlUmVsYXRpdmVUaW1lUmVjb3JkKHJ0LGJyYW5kKTtcbiB9ZWxzZXtcbmNvbnN0e3RpbWVyQnJhbmR9PXJ0O1xubXVzdE1hdGNoKHJ0LFJlbGF0aXZlVGltZVJlY29yZFNoYXBlLCdyZWxhdGl2ZVRpbWUnKTtcbmFncmVlZFRpbWVyQnJhbmQodGltZXJCcmFuZCxicmFuZCk7XG5yZXR1cm4gcnQ7XG4gfVxuIH07XG5cbmNvbnN0IGFkZEFic1JlbD0oYWJzLHJlbCk9PlxuYWJzTGlrZShhYnMscmVsLGFic1ZhbHVlKGFicykrcmVsVmFsdWUocmVsKSk7XG5cbmNvbnN0IGFkZFJlbFJlbD0ocmVsMSxyZWwyKT0+XG5yZWxMaWtlKHJlbDEscmVsMixyZWxWYWx1ZShyZWwxKStyZWxWYWx1ZShyZWwyKSk7XG5cbmNvbnN0IHN1YnRyYWN0QWJzQWJzPShhYnMxLGFiczIpPT5cbnJlbExpa2UoYWJzMSxhYnMyLGFic1ZhbHVlKGFiczEpLWFic1ZhbHVlKGFiczIpKTtcblxuY29uc3QgY2xhbXBlZFN1YnRyYWN0QWJzQWJzPShhYnMxLGFiczIpPT57XG5jb25zdCB2YWwxPWFic1ZhbHVlKGFiczEpO1xuY29uc3QgdmFsMj1hYnNWYWx1ZShhYnMyKTtcbnJldHVybiByZWxMaWtlKGFiczEsYWJzMix2YWwxPnZhbDI/dmFsMS12YWwyOjBuKTtcbiB9O1xuXG5jb25zdCBzdWJ0cmFjdEFic1JlbD0oYWJzLHJlbCk9PlxuYWJzTGlrZShhYnMscmVsLGFic1ZhbHVlKGFicyktcmVsVmFsdWUocmVsKSk7XG5cbmNvbnN0IHN1YnRyYWN0UmVsUmVsPShyZWwxLHJlbDIpPT5cbnJlbExpa2UocmVsMSxyZWwyLHJlbFZhbHVlKHJlbDEpLXJlbFZhbHVlKHJlbDIpKTtcblxuY29uc3QgaXNSZWxaZXJvPShyZWwpPT5yZWxWYWx1ZShyZWwpPT09MG47XG5cbmNvbnN0IG11bHRpcGx5UmVsTmF0PShyZWwsbmF0KT0+cmVsTGlrZShyZWwsbmF0LHJlbFZhbHVlKHJlbCkqbmF0KTtcblxuY29uc3QgZGl2aWRlUmVsTmF0PShyZWwsbmF0KT0+cmVsTGlrZShyZWwsbmF0LHJlbFZhbHVlKHJlbCkvbmF0KTtcblxuY29uc3QgZGl2aWRlUmVsUmVsPShyZWwxLHJlbDIpPT57XG5zaGFyZWRUaW1lckJyYW5kKHJlbDEscmVsMik7LyoganVzdCBlcnJvciBjaGVjayovXG5yZXR1cm4gcmVsVmFsdWUocmVsMSkvcmVsVmFsdWUocmVsMik7XG4gfTtcblxuY29uc3QgbW9kQWJzUmVsPShhYnMsc3RlcCk9PlxucmVsTGlrZShhYnMsc3RlcCxhYnNWYWx1ZShhYnMpJXJlbFZhbHVlKHN0ZXApKTtcblxuY29uc3QgbW9kUmVsUmVsPShyZWwsc3RlcCk9PlxucmVsTGlrZShyZWwsc3RlcCxyZWxWYWx1ZShyZWwpJXJlbFZhbHVlKHN0ZXApKTtcblxuLyoqXG4gKiBgY29tcGFyZVZhbHVlc2AgaXMgaW50ZXJuYWwgdG8gdGhpcyBtb2R1bGUsIGFuZCB1c2VkIHRvIGltcGxlbWVudFxuICogdGhlIHRpbWUgY29tcGFyaXNvbiBvcGVyYXRvcnMuXG4gKlxuICogQHBhcmFtIHtUaW1lc3RhbXAgfCBSZWxhdGl2ZVRpbWV9IGxlZnRcbiAqIEBwYXJhbSB7VGltZXN0YW1wIHwgUmVsYXRpdmVUaW1lfSByaWdodFxuICogQHBhcmFtIHtiaWdpbnR9IHYxXG4gKiBAcGFyYW0ge2JpZ2ludH0gdjJcbiAqIEByZXR1cm5zIHtSYW5rQ29tcGFyaXNvbn1cbiAqL1xuY29uc3QgY29tcGFyZVZhbHVlcz0obGVmdCxyaWdodCx2MSx2Mik9PntcbnNoYXJlZFRpbWVyQnJhbmQobGVmdCxyaWdodCk7XG5pZih2MTx2Mil7XG5yZXR1cm4tMTtcbiB9ZWxzZSBpZih2MT09PXYyKXtcbnJldHVybiAwO1xuIH1lbHNle1xuYXNzZXJ0KHYxPnYyKTtcbnJldHVybiAxO1xuIH1cbiB9O1xuXG4vKipcbiAqIFRoZSBgVGltZU1hdGhgIG9iamVjdCBwcm92aWRlcyBoZWxwZXIgbWV0aG9kcyB0byBkbyBhcml0aG1ldGljIG9uIGxhYmVsZWRcbiAqIHRpbWUgdmFsdWVzLCBtdWNoIGxpa2UgYEFtb3VudE1hdGhgIHByb3ZpZGVzIGhlbHBlciBtZXRob2RzIHRvIGRvIGFyaXRobWV0aWNcbiAqIG9uIGxhYmVsZWQgYXNzZXQvbW9uZXkgdmFsdWVzLiBCb3RoIGNoZWNrIGZvciBjb25zaXN0ZW5jeSBvZiBsYWJlbHM6IGFcbiAqIGJpbmFyeSBvcGVyYXRpb24gb24gdHdvIGxhYmVsZWQgb2JqZWN0cyBlbnN1cmVzIHRoYXQgdGhlIGJvdGggY2FycnlcbiAqIHRoZSBzYW1lIGxhYmVsLiBJZiB0aGV5IHByb2R1Y2UgYW5vdGhlciBvYmplY3QgZnJvbSB0aGUgc2FtZSBkb21haW4sIGl0XG4gKiB3aWxsIGNhcnJ5IHRoZSBzYW1lIGxhYmVsLiBJZiB0aGUgb3BlcmFuZHMgaGF2ZSBpbmNvbXBhdGlibGUgbGFiZWxzLFxuICogYW4gZXJyb3IgaXMgdGhyb3duLlxuICpcbiAqIFVubGlrZSBhbW91bnQgYXJpdGhtZXRpYywgdGltZSBhcml0aG1ldGljIGRlYWxzIGluIHR3byBraW5kcyBvZiB0aW1lIG9iamVjdHM6XG4gKiBUaW1lc3RhbXBzLCB3aGljaCByZXByZXNlbnQgYWJzb2x1dGUgdGltZSwgYW5kIFJlbGF0aXZlVGltZSwgd2hpY2ggcmVwcmVzZW50c1xuICogdGhlIGR1cmF0aW9uIGJldHdlZW4gdHdvIGFic29sdXRlIHRpbWVzLiBCb3RoIGtpbmRzIG9mIHRpbWUgb2JqZWN0XG4gKiBhcmUgbGFiZWxlZCBieSBhIGBUaW1lckJyYW5kYC4gRm9yIGEgVGltZXN0YW1wIG9iamVjdCwgdGhlIHZhbHVlIGlzXG4gKiBhIGJpZ2ludCBpbiBhbiBgYWJzVmFsdWVgIHByb3BlcnR5LiBGb3IgYSBSZWxhdGl2ZVRpbWUgb2JqZWN0LCB0aGUgdmFsdWVcbiAqIGlzIGEgYmlnaW50IGluIGEgYHJlbFZhbHVlYCBwcm9wZXJ0eS4gVGh1cyB3ZSBoYXZlIGEgcnVudGltZSBzYWZldHkgY2hlY2tcbiAqIHRvIGVuc3VyZSB0aGF0IHdlIGRvbid0IGNvbmZ1c2VkIHRoZSB0d28sIGV2ZW4gaWYgd2UgaGF2ZSBtYW5hZ2VkIHRvIGZvb2xcbiAqIHRoZSAodW5zb3VuZCkgc3RhdGljIHR5cGUgc3lzdGVtLlxuICpcbiAqIEFzIGEgdHJhbnNpdGlvbmFsIG1lYXN1cmUsIGN1cnJlbnRseSBtYW55IFRpbWVzdGFtcHMgYW5kIFJlbGF0aXZlVGltZXMgYXJlXG4gKiBzdGlsbCByZXByZXNlbnRlZCBieSB1bmxhYmVsZWQgYmlnaW50cy4gRHVyaW5nIHRoaXMgdHJhbnNpdGlvbmFsIHBlcmlvZCxcbiAqIHdlIGFsbG93IHRoaXMsIGJvdGggc3RhdGljYWxseSBhbmQgZHluYW1pY2FsbHkuIEZvciBhIG5vcm1hbCBiaW5hcnlcbiAqIG9wZXJhdGlvbiwgaWYgYm90aCBpbnB1dHMgYXJlIGxhYmVsZWQsIHRoZW4gd2UgZG8gdGhlIGZ1bGwgY2hlY2tpbmcgYXNcbiAqIGV4cGxhaW5lZCBhYm92ZSBhbmQgcmV0dXJuIGEgbGFiZWxlZCByZXN1bHQuIElmIGJvdGggaW5wdXRzIGFyZSB1bmxhYmVsZWRcbiAqIGJpZ2ludHMsIHdlICphc3N1bWUqIHRoYXQgdGhleSBpbmRpY2F0ZSBhIHRpbWUgb2YgdGhlIHJpZ2h0IGtpbmRcbiAqIChUaW1lc3RhbXAgdnMgUmVsYXRpdmVUaW1lKSBhbmQgdGltZXIgYnJhbmQuIFNpbmNlIHdlIGRvbid0IGtub3cgd2hhdFxuICogYnJhbmQgd2FzIGludGVuZGVkLCB3ZSBjYW4gb25seSByZXR1cm4geWV0IGFub3RoZXIgdW5sYWJlbGVkIGJpZ2ludC5cbiAqXG4gKiBJZiBvbmUgb3BlcmFuZCBpcyBsYWJlbGVkIGFuZCB0aGUgb3RoZXIgaXMgbm90LCB3ZSBjaGVjayB0aGUgbGFiZWxlZCBvcGVyYW5kLFxuICogKmFzc3VtZSogdGhlIHVubGFiZWxlZCBiaWdpbnQgcmVwcmVzZW50cyB0aGUgdmFsdWUgbmVlZGVkIGZvciB0aGUgb3RoZXJcbiAqIG9wZXJhbmQsIGFuZCByZXR1cm4gYSBsYWJlbGVkIHRpbWUgb2JqZWN0IHdpdGggdGhlIGJyYW5kIG9mIHRoZSBsYWJlbGVkXG4gKiBvcGVyYW5kLlxuICpcbiAqIEB0eXBlIHtUaW1lTWF0aFR5cGV9XG4gKi9cbmNvbnN0ICAgICAgICBUaW1lTWF0aD1oYXJkZW4oe1xuYWJzVmFsdWUsXG5yZWxWYWx1ZSxcbmNvZXJjZVRpbWVzdGFtcFJlY29yZCxcbmNvZXJjZVJlbGF0aXZlVGltZVJlY29yZCxcbmFkZEFic1JlbCxcbmFkZFJlbFJlbCxcbnN1YnRyYWN0QWJzQWJzLFxuY2xhbXBlZFN1YnRyYWN0QWJzQWJzLFxuc3VidHJhY3RBYnNSZWwsXG5zdWJ0cmFjdFJlbFJlbCxcbmlzUmVsWmVybyxcbm11bHRpcGx5UmVsTmF0LFxuZGl2aWRlUmVsTmF0LFxuZGl2aWRlUmVsUmVsLFxubW9kQWJzUmVsLFxubW9kUmVsUmVsLFxuY29tcGFyZUFiczooYWJzMSxhYnMyKT0+XG5jb21wYXJlVmFsdWVzKGFiczEsYWJzMixhYnNWYWx1ZShhYnMxKSxhYnNWYWx1ZShhYnMyKSksXG5jb21wYXJlUmVsOihyZWwxLHJlbDIpPT5cbmNvbXBhcmVWYWx1ZXMocmVsMSxyZWwyLHJlbFZhbHVlKHJlbDEpLHJlbFZhbHVlKHJlbDIpKX0pOyRo4oCNX29uY2UuVGltZU1hdGgoVGltZU1hdGgpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlRpbWVNYXRoIjpbIlRpbWVNYXRoIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJ7YCaGpBwAAqQcAACUAAABAYWdvcmljL3RpbWUtdjAuMy4yL3NyYy90eXBlR3VhcmRzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3BhdHRlcm5zIl0sImV4cG9ydHMiOlsiUmVsYXRpdmVUaW1lUmVjb3JkU2hhcGUiLCJSZWxhdGl2ZVRpbWVTaGFwZSIsIlJlbGF0aXZlVGltZVZhbHVlU2hhcGUiLCJUaW1lckJyYW5kU2hhcGUiLCJUaW1lclNlcnZpY2VTaGFwZSIsIlRpbWVzdGFtcFJlY29yZFNoYXBlIiwiVGltZXN0YW1wU2hhcGUiLCJUaW1lc3RhbXBWYWx1ZVNoYXBlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IE07JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vcGF0dGVybnNcIiwgW1tcIk1cIiwgWyRo4oCNX2EgPT4gKE0gPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuY29uc3QgICAgICAgIFRpbWVyQnJhbmRTaGFwZT1NLnJlbW90YWJsZSgnVGltZXJCcmFuZCcpOyRo4oCNX29uY2UuVGltZXJCcmFuZFNoYXBlKFRpbWVyQnJhbmRTaGFwZSk7XG5jb25zdCAgICAgICAgVGltZXN0YW1wVmFsdWVTaGFwZT1NLm5hdCgpOyRo4oCNX29uY2UuVGltZXN0YW1wVmFsdWVTaGFwZShUaW1lc3RhbXBWYWx1ZVNoYXBlKTtcbmNvbnN0ICAgICAgICBSZWxhdGl2ZVRpbWVWYWx1ZVNoYXBlPU0ubmF0KCk7LyogU2hvdWxkIHdlIGFsbG93IG5lZ2F0aXZlcz8qLyRo4oCNX29uY2UuUmVsYXRpdmVUaW1lVmFsdWVTaGFwZShSZWxhdGl2ZVRpbWVWYWx1ZVNoYXBlKTtcblxuY29uc3QgICAgICAgIFRpbWVzdGFtcFJlY29yZFNoYXBlPWhhcmRlbih7XG50aW1lckJyYW5kOlRpbWVyQnJhbmRTaGFwZSxcbmFic1ZhbHVlOlRpbWVzdGFtcFZhbHVlU2hhcGV9KTskaOKAjV9vbmNlLlRpbWVzdGFtcFJlY29yZFNoYXBlKFRpbWVzdGFtcFJlY29yZFNoYXBlKTtcblxuXG5jb25zdCAgICAgICAgUmVsYXRpdmVUaW1lUmVjb3JkU2hhcGU9aGFyZGVuKHtcbnRpbWVyQnJhbmQ6VGltZXJCcmFuZFNoYXBlLFxucmVsVmFsdWU6UmVsYXRpdmVUaW1lVmFsdWVTaGFwZX0pOyRo4oCNX29uY2UuUmVsYXRpdmVUaW1lUmVjb3JkU2hhcGUoUmVsYXRpdmVUaW1lUmVjb3JkU2hhcGUpO1xuXG5cbmNvbnN0ICAgICAgICBUaW1lc3RhbXBTaGFwZT1NLm9yKFRpbWVzdGFtcFJlY29yZFNoYXBlLFRpbWVzdGFtcFZhbHVlU2hhcGUpOyRo4oCNX29uY2UuVGltZXN0YW1wU2hhcGUoVGltZXN0YW1wU2hhcGUpO1xuY29uc3QgICAgICAgIFJlbGF0aXZlVGltZVNoYXBlPU0ub3IoXG5SZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZSxcblJlbGF0aXZlVGltZVZhbHVlU2hhcGUpOyRo4oCNX29uY2UuUmVsYXRpdmVUaW1lU2hhcGUoUmVsYXRpdmVUaW1lU2hhcGUpO1xuXG5cbmNvbnN0ICAgICAgICBUaW1lclNlcnZpY2VTaGFwZT1NLnJlbW90YWJsZSgnVGltZXJTZXJ2aWNlJyk7JGjigI1fb25jZS5UaW1lclNlcnZpY2VTaGFwZShUaW1lclNlcnZpY2VTaGFwZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiVGltZXJCcmFuZFNoYXBlIjpbIlRpbWVyQnJhbmRTaGFwZSJdLCJUaW1lc3RhbXBWYWx1ZVNoYXBlIjpbIlRpbWVzdGFtcFZhbHVlU2hhcGUiXSwiUmVsYXRpdmVUaW1lVmFsdWVTaGFwZSI6WyJSZWxhdGl2ZVRpbWVWYWx1ZVNoYXBlIl0sIlRpbWVzdGFtcFJlY29yZFNoYXBlIjpbIlRpbWVzdGFtcFJlY29yZFNoYXBlIl0sIlJlbGF0aXZlVGltZVJlY29yZFNoYXBlIjpbIlJlbGF0aXZlVGltZVJlY29yZFNoYXBlIl0sIlRpbWVzdGFtcFNoYXBlIjpbIlRpbWVzdGFtcFNoYXBlIl0sIlJlbGF0aXZlVGltZVNoYXBlIjpbIlJlbGF0aXZlVGltZVNoYXBlIl0sIlRpbWVyU2VydmljZVNoYXBlIjpbIlRpbWVyU2VydmljZVNoYXBlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAFQb5Z0xKQAAMSkAACgAAABAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMi9zcmMvZXhvLXV0aWxzLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvc3RvcmUiLCIuL3ZhdC1kYXRhLWJpbmRpbmdzLmpzIl0sImV4cG9ydHMiOlsiZGVmaW5lRHVyYWJsZUV4b0NsYXNzIiwiZGVmaW5lRHVyYWJsZUV4b0NsYXNzS2l0IiwiZGVmaW5lVmlydHVhbEV4b0NsYXNzIiwiZGVmaW5lVmlydHVhbEV4b0NsYXNzS2l0IiwiaWdub3JlQ29udGV4dCIsIm1ha2VFeG9VdGlscyIsInByZXBhcmVFeG8iLCJwcmVwYXJlRXhvQ2xhc3MiLCJwcmVwYXJlRXhvQ2xhc3NLaXQiLCJwcmVwYXJlS2luZCIsInByZXBhcmVLaW5kTXVsdGkiLCJwcmVwYXJlU2luZ2xldG9uIiwicHJvdmlkZUtpbmRIYW5kbGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgaW5pdEVtcHR5LHByb3ZpZGUsZ2xvYmFsVmF0RGF0YTskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJpbml0RW1wdHlcIiwgWyRo4oCNX2EgPT4gKGluaXRFbXB0eSA9ICRo4oCNX2EpXV1dXSxbXCIuL3ZhdC1kYXRhLWJpbmRpbmdzLmpzXCIsIFtbXCJwcm92aWRlXCIsIFskaOKAjV9hID0+IChwcm92aWRlID0gJGjigI1fYSldXSxbXCJWYXREYXRhXCIsIFskaOKAjV9hID0+IChnbG9iYWxWYXREYXRhID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9wYXR0ZXJucycpLk1ldGhvZEd1YXJkfSBNZXRob2RHdWFyZCAqL1xuLyoqXG4gKiBAdGVtcGxhdGUge1JlY29yZDxQcm9wZXJ0eUtleSwgTWV0aG9kR3VhcmQ+fSBbVD1SZWNvcmQ8UHJvcGVydHlLZXksIE1ldGhvZEd1YXJkPl1cbiAqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9wYXR0ZXJucycpLkludGVyZmFjZUd1YXJkPFQ+fSBJbnRlcmZhY2VHdWFyZFxuICovXG4vKiogQHRlbXBsYXRlIEwsUiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vZXZlbnR1YWwtc2VuZCcpLlJlbW90YWJsZUJyYW5kPEwsIFI+fSBSZW1vdGFibGVCcmFuZCAqL1xuLyoqIEB0ZW1wbGF0ZSBUIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9mYXInKS5FUmVmPFQ+fSBFUmVmICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BhZ29yaWMvc3dpbmdzZXQtbGl2ZXNsb3RzJykuQmFnZ2FnZX0gQmFnZ2FnZSAqL1xuLyoqIEB0ZW1wbGF0ZSBUIEB0eXBlZGVmIHtYaW1wb3J0KCdAYWdvcmljL3N3aW5nc2V0LWxpdmVzbG90cycpLkRlZmluZUtpbmRPcHRpb25zPFQ+fSBEZWZpbmVLaW5kT3B0aW9ucyAqL1xuLyoqIEB0ZW1wbGF0ZSBUIEB0eXBlZGVmIHtYaW1wb3J0KCdAYWdvcmljL3N3aW5nc2V0LWxpdmVzbG90cycpLktpbmRGYWNldDxUPn0gS2luZEZhY2V0ICovXG4vKiogQHRlbXBsYXRlIFQgQHR5cGVkZWYge1hpbXBvcnQoJ0BhZ29yaWMvc3dpbmdzZXQtbGl2ZXNsb3RzJykuS2luZEZhY2V0czxUPn0gS2luZEZhY2V0cyAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAYWdvcmljL3N3aW5nc2V0LWxpdmVzbG90cycpLkR1cmFibGVLaW5kSGFuZGxlfSBEdXJhYmxlS2luZEhhbmRsZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAYWdvcmljL3N3aW5nc2V0LWxpdmVzbG90cycpLkludGVyZmFjZUd1YXJkS2l0fSBJbnRlcmZhY2VHdWFyZEtpdCAqL1xuXG4vKipcbiAqIE1ha2UgYSB2ZXJzaW9uIG9mIHRoZSBhcmd1bWVudCBmdW5jdGlvbiB0aGF0IHRha2VzIGEga2luZCBjb250ZXh0IGJ1dFxuICogaWdub3JlcyBpdC5cbiAqXG4gKiBAdHlwZSB7PFQgZXh0ZW5kcyBGdW5jdGlvbj4oZm46IFQpID0+IFhpbXBvcnQoJ0BhZ29yaWMvc3dpbmdzZXQtbGl2ZXNsb3RzJykuUGx1c0NvbnRleHQ8bmV2ZXIsIFQ+fVxuICovXG5jb25zdCAgICAgICAgaWdub3JlQ29udGV4dD1cbihmbik9PlxuKF9jb250ZXh0LC4uLmFyZ3MpPT5cbmZuKC4uLmFyZ3MpOyRo4oCNX29uY2UuaWdub3JlQ29udGV4dChpZ25vcmVDb250ZXh0KTtcbmhhcmRlbihpZ25vcmVDb250ZXh0KTtcblxuLyogVE9ETzogRmluZCBhIGdvb2QgaG9tZSBmb3IgdGhpcyBmdW5jdGlvbiB1c2VkIGJ5IEBhZ29yaWMvdmF0LWRhdGEgYW5kIHRlc3RpbmcgY29kZSovXG5jb25zdCAgICAgICAgbWFrZUV4b1V0aWxzPShWYXREYXRhKT0+e1xuY29uc3R7XG5kZWZpbmVLaW5kLFxuZGVmaW5lS2luZE11bHRpLFxuZGVmaW5lRHVyYWJsZUtpbmQsXG5kZWZpbmVEdXJhYmxlS2luZE11bHRpLFxubWFrZUtpbmRIYW5kbGV9PVxuVmF0RGF0YTtcblxuLyoqXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBraW5kTmFtZVxuICogQHJldHVybnMge0R1cmFibGVLaW5kSGFuZGxlfVxuICovXG5jb25zdCBwcm92aWRlS2luZEhhbmRsZT0oYmFnZ2FnZSxraW5kTmFtZSk9PlxucHJvdmlkZShiYWdnYWdlLCBgJHtraW5kTmFtZX1fa2luZEhhbmRsZWAsKCk9Pm1ha2VLaW5kSGFuZGxlKGtpbmROYW1lKSk7XG5oYXJkZW4ocHJvdmlkZUtpbmRIYW5kbGUpO1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSBwcmVwYXJlRXhvQ2xhc3MgaW5zdGVhZFxuICogQHR5cGUge1hpbXBvcnQoJ0BhZ29yaWMvc3dpbmdzZXQtbGl2ZXNsb3RzJykuUHJlcGFyZUtpbmR9XG4gKi9cbmNvbnN0IHByZXBhcmVLaW5kPShcbmJhZ2dhZ2UsXG5raW5kTmFtZSxcbmluaXQsXG5iZWhhdmlvcixcbm9wdGlvbnM9dW5kZWZpbmVkKT0+XG5cbmRlZmluZUR1cmFibGVLaW5kKFxucHJvdmlkZUtpbmRIYW5kbGUoYmFnZ2FnZSxraW5kTmFtZSksXG5pbml0LFxuYmVoYXZpb3IsXG5vcHRpb25zKTtcblxuaGFyZGVuKHByZXBhcmVLaW5kKTtcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgcHJlcGFyZUV4b0NsYXNzS2l0IGluc3RlYWRcbiAqIEB0eXBlIHtYaW1wb3J0KCdAYWdvcmljL3N3aW5nc2V0LWxpdmVzbG90cycpLlByZXBhcmVLaW5kTXVsdGl9XG4gKi9cbmNvbnN0IHByZXBhcmVLaW5kTXVsdGk9KFxuYmFnZ2FnZSxcbmtpbmROYW1lLFxuaW5pdCxcbmJlaGF2aW9yLFxub3B0aW9ucz11bmRlZmluZWQpPT5cblxuZGVmaW5lRHVyYWJsZUtpbmRNdWx0aShcbnByb3ZpZGVLaW5kSGFuZGxlKGJhZ2dhZ2Usa2luZE5hbWUpLFxuaW5pdCxcbmJlaGF2aW9yLFxub3B0aW9ucyk7XG5cbmhhcmRlbihwcmVwYXJlS2luZE11bHRpKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgeyguLi5hcmdzOiBhbnkpID0+IGFueX0gSSBpbml0IHN0YXRlIGZ1bmN0aW9uXG4gKiBAdGVtcGxhdGUgVCBiZWhhdmlvclxuICogQHBhcmFtIHtzdHJpbmd9IHRhZ1xuICogQHBhcmFtIHtJbnRlcmZhY2VHdWFyZCB8IHVuZGVmaW5lZH0gaW50ZXJmYWNlR3VhcmRcbiAqIEBwYXJhbSB7SX0gaW5pdFxuICogQHBhcmFtIHtUICYgVGhpc1R5cGU8e1xuICogICBzZWxmOiBULFxuICogICBzdGF0ZTogUmV0dXJuVHlwZTxJPlxuICogfT59IG1ldGhvZHNcbiAqIEBwYXJhbSB7RGVmaW5lS2luZE9wdGlvbnM8e1xuICogICBzZWxmOiBULFxuICogICBzdGF0ZTogUmV0dXJuVHlwZTxJPlxuICogfT59IFtvcHRpb25zXVxuICogQHJldHVybnMgeyguLi5hcmdzOiBQYXJhbWV0ZXJzPEk+KSA9PiAoVCAmIFJlbW90YWJsZUJyYW5kPHt9LCBUPil9XG4gKi9cbmNvbnN0IGRlZmluZVZpcnR1YWxFeG9DbGFzcz0odGFnLGludGVyZmFjZUd1YXJkLGluaXQsbWV0aG9kcyxvcHRpb25zKT0+XG5kZWZpbmVLaW5kKHRhZyxpbml0LG1ldGhvZHMse1xuLi4ub3B0aW9ucyxcbnRoaXNmdWxNZXRob2RzOnRydWUsXG5pbnRlcmZhY2VHdWFyZH0pO1xuXG5oYXJkZW4oZGVmaW5lVmlydHVhbEV4b0NsYXNzKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgeyguLi5hcmdzOiBhbnkpID0+IGFueX0gSSBpbml0IHN0YXRlIGZ1bmN0aW9uXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcsIFJlY29yZDxQcm9wZXJ0eUtleSwgQ2FsbGFibGVGdW5jdGlvbj4+fSBUIGZhY2V0c1xuICogQHBhcmFtIHtzdHJpbmd9IHRhZ1xuICogQHBhcmFtIHtJbnRlcmZhY2VHdWFyZEtpdCB8IHVuZGVmaW5lZH0gaW50ZXJmYWNlR3VhcmRLaXRcbiAqIEBwYXJhbSB7SX0gaW5pdFxuICogQHBhcmFtIHtUICYgVGhpc1R5cGU8e1xuICogICBmYWNldHM6IFQsXG4gKiAgIHN0YXRlOiBSZXR1cm5UeXBlPEk+XG4gKiB9PiB9IGZhY2V0c1xuICogQHBhcmFtIHtEZWZpbmVLaW5kT3B0aW9uczx7XG4gKiAgIGZhY2V0czogVCxcbiAqICAgc3RhdGU6IFJldHVyblR5cGU8ST5cbiAqIH0+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHsoLi4uYXJnczogUGFyYW1ldGVyczxJPikgPT4gKFQgJiBSZW1vdGFibGVCcmFuZDx7fSwgVD4pfVxuICovXG5jb25zdCBkZWZpbmVWaXJ0dWFsRXhvQ2xhc3NLaXQ9KFxudGFnLFxuaW50ZXJmYWNlR3VhcmRLaXQsXG5pbml0LFxuZmFjZXRzLFxub3B0aW9ucyk9PlxuXG5kZWZpbmVLaW5kTXVsdGkodGFnLGluaXQsZmFjZXRzLHtcbi4uLm9wdGlvbnMsXG50aGlzZnVsTWV0aG9kczp0cnVlLFxuaW50ZXJmYWNlR3VhcmRLaXR9KTtcblxuaGFyZGVuKGRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdCk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHsoLi4uYXJnczogYW55KSA9PiBhbnl9IEkgaW5pdCBzdGF0ZSBmdW5jdGlvblxuICogQHRlbXBsYXRlIHtSZWNvcmQ8UHJvcGVydHlLZXksIENhbGxhYmxlRnVuY3Rpb24+fSBUIG1ldGhvZHNcbiAqIEBwYXJhbSB7RHVyYWJsZUtpbmRIYW5kbGV9IGtpbmRIYW5kbGVcbiAqIEBwYXJhbSB7SW50ZXJmYWNlR3VhcmQgfCB1bmRlZmluZWR9IGludGVyZmFjZUd1YXJkXG4gKiBAcGFyYW0ge0l9IGluaXRcbiAqIEBwYXJhbSB7VCAmIFRoaXNUeXBlPHtcbiAqICAgc2VsZjogVCxcbiAqICAgc3RhdGU6IFJldHVyblR5cGU8ST5cbiAqIH0+fSBtZXRob2RzXG4gKiBAcGFyYW0ge0RlZmluZUtpbmRPcHRpb25zPHtcbiAqICAgc2VsZjogVCxcbiAqICAgc3RhdGU6IFJldHVyblR5cGU8ST5cbiAqIH0+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHsoLi4uYXJnczogUGFyYW1ldGVyczxJPikgPT4gKFQgJiBSZW1vdGFibGVCcmFuZDx7fSwgVD4pfVxuICovXG5jb25zdCBkZWZpbmVEdXJhYmxlRXhvQ2xhc3M9KFxua2luZEhhbmRsZSxcbmludGVyZmFjZUd1YXJkLFxuaW5pdCxcbm1ldGhvZHMsXG5vcHRpb25zKT0+XG5cbmRlZmluZUR1cmFibGVLaW5kKGtpbmRIYW5kbGUsaW5pdCxtZXRob2RzLHtcbi4uLm9wdGlvbnMsXG50aGlzZnVsTWV0aG9kczp0cnVlLFxuaW50ZXJmYWNlR3VhcmR9KTtcblxuaGFyZGVuKGRlZmluZUR1cmFibGVFeG9DbGFzcyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHsoLi4uYXJnczogYW55KSA9PiBhbnl9IEkgaW5pdCBzdGF0ZSBmdW5jdGlvblxuICogQHRlbXBsYXRlIHtSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8UHJvcGVydHlLZXksIENhbGxhYmxlRnVuY3Rpb24+Pn0gVCBmYWNldHNcbiAqIEBwYXJhbSB7RHVyYWJsZUtpbmRIYW5kbGV9IGtpbmRIYW5kbGVcbiAqIEBwYXJhbSB7SW50ZXJmYWNlR3VhcmRLaXQgfCB1bmRlZmluZWR9IGludGVyZmFjZUd1YXJkS2l0XG4gKiBAcGFyYW0ge0l9IGluaXRcbiAqIEBwYXJhbSB7VCAmIFRoaXNUeXBlPHtcbiAqICAgZmFjZXRzOiBULFxuICogICBzdGF0ZTogUmV0dXJuVHlwZTxJPlxuICogfT4gfSBmYWNldHNcbiAqIEBwYXJhbSB7RGVmaW5lS2luZE9wdGlvbnM8e1xuICogICBmYWNldHM6IFQsXG4gKiAgIHN0YXRlOiBSZXR1cm5UeXBlPEk+XG4gKiB9Pn0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7KC4uLmFyZ3M6IFBhcmFtZXRlcnM8ST4pID0+IChUICYgUmVtb3RhYmxlQnJhbmQ8e30sIFQ+KX1cbiAqL1xuY29uc3QgZGVmaW5lRHVyYWJsZUV4b0NsYXNzS2l0PShcbmtpbmRIYW5kbGUsXG5pbnRlcmZhY2VHdWFyZEtpdCxcbmluaXQsXG5mYWNldHMsXG5vcHRpb25zKT0+XG5cbmRlZmluZUR1cmFibGVLaW5kTXVsdGkoa2luZEhhbmRsZSxpbml0LGZhY2V0cyx7XG4uLi5vcHRpb25zLFxudGhpc2Z1bE1ldGhvZHM6dHJ1ZSxcbmludGVyZmFjZUd1YXJkS2l0fSk7XG5cbmhhcmRlbihkZWZpbmVEdXJhYmxlRXhvQ2xhc3NLaXQpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7KC4uLmFyZ3M6IGFueSkgPT4gYW55fSBJIGluaXQgc3RhdGUgZnVuY3Rpb25cbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPFByb3BlcnR5S2V5LCBDYWxsYWJsZUZ1bmN0aW9uPn0gVCBtZXRob2RzXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBraW5kTmFtZVxuICogQHBhcmFtIHtJbnRlcmZhY2VHdWFyZCB8IHVuZGVmaW5lZH0gaW50ZXJmYWNlR3VhcmRcbiAqIEBwYXJhbSB7SX0gaW5pdFxuICogQHBhcmFtIHtUICYgVGhpc1R5cGU8e1xuICogICBzZWxmOiBULFxuICogICBzdGF0ZTogUmV0dXJuVHlwZTxJPlxuICogfT59IG1ldGhvZHNcbiAqIEBwYXJhbSB7RGVmaW5lS2luZE9wdGlvbnM8e1xuICogICBzZWxmOiBULFxuICogICBzdGF0ZTogUmV0dXJuVHlwZTxJPlxuICogfT59IFtvcHRpb25zXVxuICogQHJldHVybnMgeyguLi5hcmdzOiBQYXJhbWV0ZXJzPEk+KSA9PiAoVCAmIFJlbW90YWJsZUJyYW5kPHt9LCBUPil9XG4gKi9cbmNvbnN0IHByZXBhcmVFeG9DbGFzcz0oXG5iYWdnYWdlLFxua2luZE5hbWUsXG5pbnRlcmZhY2VHdWFyZCxcbmluaXQsXG5tZXRob2RzLFxub3B0aW9ucz11bmRlZmluZWQpPT5cblxuZGVmaW5lRHVyYWJsZUV4b0NsYXNzKFxucHJvdmlkZUtpbmRIYW5kbGUoYmFnZ2FnZSxraW5kTmFtZSksXG5pbnRlcmZhY2VHdWFyZCxcbmluaXQsXG5tZXRob2RzLFxub3B0aW9ucyk7XG5cbmhhcmRlbihwcmVwYXJlRXhvQ2xhc3MpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7KC4uLmFyZ3M6IGFueSkgPT4gYW55fSBJIGluaXQgc3RhdGUgZnVuY3Rpb25cbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPHN0cmluZywgUmVjb3JkPFByb3BlcnR5S2V5LCBDYWxsYWJsZUZ1bmN0aW9uPj59IFQgZmFjZXRzXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBraW5kTmFtZVxuICogQHBhcmFtIHtJbnRlcmZhY2VHdWFyZEtpdCB8IHVuZGVmaW5lZH0gaW50ZXJmYWNlR3VhcmRLaXRcbiAqIEBwYXJhbSB7SX0gaW5pdFxuICogQHBhcmFtIHtUICYgVGhpc1R5cGU8e1xuICogICBmYWNldHM6IFQsXG4gKiAgIHN0YXRlOiBSZXR1cm5UeXBlPEk+XG4gKiB9PiB9IGZhY2V0c1xuICogQHBhcmFtIHtEZWZpbmVLaW5kT3B0aW9uczx7XG4gKiAgIGZhY2V0czogVCxcbiAqICAgc3RhdGU6IFJldHVyblR5cGU8ST5cbiAqIH0+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHsoLi4uYXJnczogUGFyYW1ldGVyczxJPikgPT4gKFQgJiBSZW1vdGFibGVCcmFuZDx7fSwgVD4pfVxuICovXG5jb25zdCBwcmVwYXJlRXhvQ2xhc3NLaXQ9KFxuYmFnZ2FnZSxcbmtpbmROYW1lLFxuaW50ZXJmYWNlR3VhcmRLaXQsXG5pbml0LFxuZmFjZXRzLFxub3B0aW9ucz11bmRlZmluZWQpPT5cblxuZGVmaW5lRHVyYWJsZUV4b0NsYXNzS2l0KFxucHJvdmlkZUtpbmRIYW5kbGUoYmFnZ2FnZSxraW5kTmFtZSksXG5pbnRlcmZhY2VHdWFyZEtpdCxcbmluaXQsXG5mYWNldHMsXG5vcHRpb25zKTtcblxuaGFyZGVuKHByZXBhcmVFeG9DbGFzc0tpdCk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtSZWNvcmQ8UHJvcGVydHlLZXksIENhbGxhYmxlRnVuY3Rpb24+fSBNIG1ldGhvZHNcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IGtpbmROYW1lXG4gKiBAcGFyYW0ge0ludGVyZmFjZUd1YXJkIHwgdW5kZWZpbmVkfSBpbnRlcmZhY2VHdWFyZFxuICogQHBhcmFtIHtNfSBtZXRob2RzXG4gKiBAcGFyYW0ge0RlZmluZUtpbmRPcHRpb25zPHsgc2VsZjogTSB9Pn0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7TSAmIFJlbW90YWJsZUJyYW5kPHt9LCBNPn1cbiAqL1xuY29uc3QgcHJlcGFyZUV4bz0oXG5iYWdnYWdlLFxua2luZE5hbWUsXG5pbnRlcmZhY2VHdWFyZCxcbm1ldGhvZHMsXG5vcHRpb25zPXVuZGVmaW5lZCk9Plxue1xuY29uc3QgbWFrZVNpbmdsZXRvbj1wcmVwYXJlRXhvQ2xhc3MoXG5iYWdnYWdlLFxua2luZE5hbWUsXG5pbnRlcmZhY2VHdWFyZCxcbmluaXRFbXB0eSxcbm1ldGhvZHMsXG5vcHRpb25zKTtcblxuXG5yZXR1cm4gcHJvdmlkZShiYWdnYWdlLCBgJHtraW5kTmFtZX1fc2luZ2xldG9uYCwoKT0+bWFrZVNpbmdsZXRvbigpKTtcbiB9O1xuaGFyZGVuKHByZXBhcmVFeG8pO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPFByb3BlcnR5S2V5LCBDYWxsYWJsZUZ1bmN0aW9uPn0gTSBtZXRob2RzXG4gKiBAZGVwcmVjYXRlZCBVc2UgcHJlcGFyZUV4byBpbnN0ZWFkLlxuICogQHBhcmFtIHtCYWdnYWdlfSBiYWdnYWdlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2luZE5hbWVcbiAqIEBwYXJhbSB7TX0gbWV0aG9kc1xuICogQHBhcmFtIHtEZWZpbmVLaW5kT3B0aW9uczx7IHNlbGY6IE0gfT59IFtvcHRpb25zXVxuICogQHJldHVybnMge00gJiBSZW1vdGFibGVCcmFuZDx7fSwgTT59XG4gKi9cbmNvbnN0IHByZXBhcmVTaW5nbGV0b249KGJhZ2dhZ2Usa2luZE5hbWUsbWV0aG9kcyxvcHRpb25zPXVuZGVmaW5lZCk9PlxucHJlcGFyZUV4byhiYWdnYWdlLGtpbmROYW1lLHVuZGVmaW5lZCxtZXRob2RzLG9wdGlvbnMpO1xuaGFyZGVuKHByZXBhcmVTaW5nbGV0b24pO1xuXG5yZXR1cm4gaGFyZGVuKHtcbmRlZmluZVZpcnR1YWxFeG9DbGFzcyxcbmRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdCxcbmRlZmluZUR1cmFibGVFeG9DbGFzcyxcbmRlZmluZUR1cmFibGVFeG9DbGFzc0tpdCxcbnByZXBhcmVFeG9DbGFzcyxcbnByZXBhcmVFeG9DbGFzc0tpdCxcbnByZXBhcmVFeG8sXG5wcmVwYXJlU2luZ2xldG9uLFxuXG5wcm92aWRlS2luZEhhbmRsZSxcbnByZXBhcmVLaW5kLFxucHJlcGFyZUtpbmRNdWx0aX0pO1xuXG4gfTskaOKAjV9vbmNlLm1ha2VFeG9VdGlscyhtYWtlRXhvVXRpbHMpO1xuXG5jb25zdCBnbG9iYWxFeG9VdGlscz1tYWtlRXhvVXRpbHMoZ2xvYmFsVmF0RGF0YSk7XG5cbmNvbnN0ICAgICAgIHtcbmRlZmluZVZpcnR1YWxFeG9DbGFzcyxcbmRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdCxcbmRlZmluZUR1cmFibGVFeG9DbGFzcyxcbmRlZmluZUR1cmFibGVFeG9DbGFzc0tpdCxcbnByZXBhcmVFeG9DbGFzcyxcbnByZXBhcmVFeG9DbGFzc0tpdCxcbnByZXBhcmVFeG8sXG5wcmVwYXJlU2luZ2xldG9ufT1cbmdsb2JhbEV4b1V0aWxzO1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSBFeG9zL0V4b0NsYXNzZXMgaW5zdGVhZCBvZiBLaW5kc1xuICovJGjigI1fb25jZS5kZWZpbmVWaXJ0dWFsRXhvQ2xhc3MoZGVmaW5lVmlydHVhbEV4b0NsYXNzKTskaOKAjV9vbmNlLmRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdChkZWZpbmVWaXJ0dWFsRXhvQ2xhc3NLaXQpOyRo4oCNX29uY2UuZGVmaW5lRHVyYWJsZUV4b0NsYXNzKGRlZmluZUR1cmFibGVFeG9DbGFzcyk7JGjigI1fb25jZS5kZWZpbmVEdXJhYmxlRXhvQ2xhc3NLaXQoZGVmaW5lRHVyYWJsZUV4b0NsYXNzS2l0KTskaOKAjV9vbmNlLnByZXBhcmVFeG9DbGFzcyhwcmVwYXJlRXhvQ2xhc3MpOyRo4oCNX29uY2UucHJlcGFyZUV4b0NsYXNzS2l0KHByZXBhcmVFeG9DbGFzc0tpdCk7JGjigI1fb25jZS5wcmVwYXJlRXhvKHByZXBhcmVFeG8pOyRo4oCNX29uY2UucHJlcGFyZVNpbmdsZXRvbihwcmVwYXJlU2luZ2xldG9uKTtcbmNvbnN0ICAgICAgIHtwcm92aWRlS2luZEhhbmRsZSxwcmVwYXJlS2luZCxwcmVwYXJlS2luZE11bHRpfT1cbmdsb2JhbEV4b1V0aWxzOyRo4oCNX29uY2UucHJvdmlkZUtpbmRIYW5kbGUocHJvdmlkZUtpbmRIYW5kbGUpOyRo4oCNX29uY2UucHJlcGFyZUtpbmQocHJlcGFyZUtpbmQpOyRo4oCNX29uY2UucHJlcGFyZUtpbmRNdWx0aShwcmVwYXJlS2luZE11bHRpKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpZ25vcmVDb250ZXh0IjpbImlnbm9yZUNvbnRleHQiXSwibWFrZUV4b1V0aWxzIjpbIm1ha2VFeG9VdGlscyJdLCJkZWZpbmVWaXJ0dWFsRXhvQ2xhc3MiOlsiZGVmaW5lVmlydHVhbEV4b0NsYXNzIl0sImRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdCI6WyJkZWZpbmVWaXJ0dWFsRXhvQ2xhc3NLaXQiXSwiZGVmaW5lRHVyYWJsZUV4b0NsYXNzIjpbImRlZmluZUR1cmFibGVFeG9DbGFzcyJdLCJkZWZpbmVEdXJhYmxlRXhvQ2xhc3NLaXQiOlsiZGVmaW5lRHVyYWJsZUV4b0NsYXNzS2l0Il0sInByZXBhcmVFeG9DbGFzcyI6WyJwcmVwYXJlRXhvQ2xhc3MiXSwicHJlcGFyZUV4b0NsYXNzS2l0IjpbInByZXBhcmVFeG9DbGFzc0tpdCJdLCJwcmVwYXJlRXhvIjpbInByZXBhcmVFeG8iXSwicHJlcGFyZVNpbmdsZXRvbiI6WyJwcmVwYXJlU2luZ2xldG9uIl0sInByb3ZpZGVLaW5kSGFuZGxlIjpbInByb3ZpZGVLaW5kSGFuZGxlIl0sInByZXBhcmVLaW5kIjpbInByZXBhcmVLaW5kIl0sInByZXBhcmVLaW5kTXVsdGkiOlsicHJlcGFyZUtpbmRNdWx0aSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAnjLSZkggAAJIIAAAkAAAAQGFnb3JpYy92YXQtZGF0YS12MC41LjIvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvc3RvcmUiLCIuL3ZhdC1kYXRhLWJpbmRpbmdzLmpzIiwiLi9leG8tdXRpbHMuanMiXSwiZXhwb3J0cyI6WyJkZWZpbmVWaXJ0dWFsRXhvQ2xhc3NLaXQiLCJkZWZpbmVWaXJ0dWFsRXhvQ2xhc3NLaXQiLCJtYWtlU2NhbGFyTWFwU3RvcmUiLCJtYWtlU2NhbGFyTWFwU3RvcmUiLCJwcm92aWRlUHJvbWlzZVdhdGNoZXIiLCJwcm92aWRlUHJvbWlzZVdhdGNoZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlXCIsIFtdXSxbXCIuL3ZhdC1kYXRhLWJpbmRpbmdzLmpzXCIsIFtdXSxbXCIuL2V4by11dGlscy5qc1wiLCBbXV1dKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyJAYWdvcmljL3N0b3JlIjpbWyJNIiwiTSJdLFsibWFrZVNjYWxhck1hcFN0b3JlIiwibWFrZVNjYWxhck1hcFN0b3JlIl0sWyJtYWtlU2NhbGFyV2Vha01hcFN0b3JlIiwibWFrZVNjYWxhcldlYWtNYXBTdG9yZSJdLFsibWFrZVNjYWxhclNldFN0b3JlIiwibWFrZVNjYWxhclNldFN0b3JlIl0sWyJtYWtlU2NhbGFyV2Vha1NldFN0b3JlIiwibWFrZVNjYWxhcldlYWtTZXRTdG9yZSJdXSwiLi92YXQtZGF0YS1iaW5kaW5ncy5qcyI6W1sibWFrZUtpbmRIYW5kbGUiLCJtYWtlS2luZEhhbmRsZSJdLFsicHJvdmlkZVByb21pc2VXYXRjaGVyIiwicHJvdmlkZVByb21pc2VXYXRjaGVyIl0sWyJ3YXRjaFByb21pc2UiLCJ3YXRjaFByb21pc2UiXSxbIm1ha2VTY2FsYXJCaWdNYXBTdG9yZSIsIm1ha2VTY2FsYXJCaWdNYXBTdG9yZSJdLFsibWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSIsIm1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUiXSxbIm1ha2VTY2FsYXJCaWdTZXRTdG9yZSIsIm1ha2VTY2FsYXJCaWdTZXRTdG9yZSJdLFsibWFrZVNjYWxhckJpZ1dlYWtTZXRTdG9yZSIsIm1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmUiXSxbImNhbkJlRHVyYWJsZSIsImNhbkJlRHVyYWJsZSJdLFsicGlja0ZhY2V0IiwicGlja0ZhY2V0Il0sWyJwYXJ0aWFsQXNzaWduIiwicGFydGlhbEFzc2lnbiJdLFsicHJvdmlkZSIsInByb3ZpZGUiXSxbInByb3ZpZGVEdXJhYmxlTWFwU3RvcmUiLCJwcm92aWRlRHVyYWJsZU1hcFN0b3JlIl0sWyJwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSIsInByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlIl0sWyJwcm92aWRlRHVyYWJsZVNldFN0b3JlIiwicHJvdmlkZUR1cmFibGVTZXRTdG9yZSJdLFsicHJvdmlkZUR1cmFibGVXZWFrU2V0U3RvcmUiLCJwcm92aWRlRHVyYWJsZVdlYWtTZXRTdG9yZSJdLFsiZGVmaW5lS2luZCIsImRlZmluZUtpbmQiXSxbImRlZmluZUtpbmRNdWx0aSIsImRlZmluZUtpbmRNdWx0aSJdLFsiZGVmaW5lRHVyYWJsZUtpbmQiLCJkZWZpbmVEdXJhYmxlS2luZCJdLFsiZGVmaW5lRHVyYWJsZUtpbmRNdWx0aSIsImRlZmluZUR1cmFibGVLaW5kTXVsdGkiXV0sIi4vZXhvLXV0aWxzLmpzIjpbWyJkZWZpbmVWaXJ0dWFsRXhvQ2xhc3MiLCJkZWZpbmVWaXJ0dWFsRXhvQ2xhc3MiXSxbImRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdCIsImRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdCJdLFsiZGVmaW5lRHVyYWJsZUV4b0NsYXNzIiwiZGVmaW5lRHVyYWJsZUV4b0NsYXNzIl0sWyJkZWZpbmVEdXJhYmxlRXhvQ2xhc3NLaXQiLCJkZWZpbmVEdXJhYmxlRXhvQ2xhc3NLaXQiXSxbInByZXBhcmVFeG9DbGFzcyIsInByZXBhcmVFeG9DbGFzcyJdLFsicHJlcGFyZUV4b0NsYXNzS2l0IiwicHJlcGFyZUV4b0NsYXNzS2l0Il0sWyJwcmVwYXJlRXhvIiwicHJlcGFyZUV4byJdLFsicHJlcGFyZVNpbmdsZXRvbiIsInByZXBhcmVTaW5nbGV0b24iXSxbImlnbm9yZUNvbnRleHQiLCJpZ25vcmVDb250ZXh0Il0sWyJwcm92aWRlS2luZEhhbmRsZSIsInByb3ZpZGVLaW5kSGFuZGxlIl0sWyJwcmVwYXJlS2luZCIsInByZXBhcmVLaW5kIl0sWyJwcmVwYXJlS2luZE11bHRpIiwicHJlcGFyZUtpbmRNdWx0aSJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAkoZAivsoAAD7KAAAMAAAAEBhZ29yaWMvdmF0LWRhdGEtdjAuNS4yL3NyYy92YXQtZGF0YS1iaW5kaW5ncy5qc3siaW1wb3J0cyI6WyJAYWdvcmljL2Fzc2VydCIsIkBhZ29yaWMvc3RvcmUiXSwiZXhwb3J0cyI6WyJWYXREYXRhIiwiY2FuQmVEdXJhYmxlIiwiZGVmaW5lRHVyYWJsZUtpbmQiLCJkZWZpbmVEdXJhYmxlS2luZE11bHRpIiwiZGVmaW5lS2luZCIsImRlZmluZUtpbmRNdWx0aSIsIm1ha2VLaW5kSGFuZGxlIiwibWFrZVNjYWxhckJpZ01hcFN0b3JlIiwibWFrZVNjYWxhckJpZ1NldFN0b3JlIiwibWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSIsIm1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmUiLCJtYWtlU3RvcmVVdGlscyIsInBhcnRpYWxBc3NpZ24iLCJwaWNrRmFjZXQiLCJwcm92aWRlIiwicHJvdmlkZUR1cmFibGVNYXBTdG9yZSIsInByb3ZpZGVEdXJhYmxlU2V0U3RvcmUiLCJwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSIsInByb3ZpZGVEdXJhYmxlV2Vha1NldFN0b3JlIiwicHJvdmlkZVByb21pc2VXYXRjaGVyIiwid2F0Y2hQcm9taXNlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEZhaWwscHJvdmlkZUxhenk7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9hc3NlcnRcIiwgW1tcIkZhaWxcIiwgWyRo4oCNX2EgPT4gKEZhaWwgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wicHJvdmlkZUxhenlcIiwgWyRo4oCNX2EgPT4gKHByb3ZpZGVMYXp5ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cbi8qKiBAdHlwZSB7WGltcG9ydCgnQGFnb3JpYy9zd2luZ3NldC1saXZlc2xvdHMnKS5WYXREYXRhfSAqL1xubGV0IFZhdERhdGFHbG9iYWw7XG5pZignVmF0RGF0YSdpbiBnbG9iYWxUaGlzKXtcbmdsb2JhbFRoaXMuVmF0RGF0YXx8RmFpbCBgVmF0RGF0YSBkZWZpbmVkIGluIGdsb2JhbCBhcyBudWxsIG9yIHVuZGVmaW5lZGA7XG5WYXREYXRhR2xvYmFsPWdsb2JhbFRoaXMuVmF0RGF0YTtcbiB9ZWxzZXtcbi8qIFhYWCB0aGlzIG1vZHVsZSBoYXMgYmVlbiBrbm93biB0byBnZXQgaW1wb3J0ZWQgKHRyYW5zaXRpdmVseSkgaW4gY2FzZXMgdGhhdCovXG4vKiBuZXZlciB1c2UgaXQgc28gd2UgbWFrZSBhIHZlcnNpb24gdGhhdCB3aWxsIHNhdGlzZnkgbW9kdWxlIHJlc29sdXRpb24gYnV0Ki9cbi8qIGZhaWwgYXQgcnVudGltZS4qL1xuY29uc3QgdW52YWlsYWJsZT0oKT0+RmFpbCBgVmF0RGF0YSB1bmF2YWlsYWJsZWA7XG5WYXREYXRhR2xvYmFsPXtcbmRlZmluZUtpbmQ6dW52YWlsYWJsZSxcbmRlZmluZUtpbmRNdWx0aTp1bnZhaWxhYmxlLFxuZGVmaW5lRHVyYWJsZUtpbmQ6dW52YWlsYWJsZSxcbmRlZmluZUR1cmFibGVLaW5kTXVsdGk6dW52YWlsYWJsZSxcbm1ha2VLaW5kSGFuZGxlOnVudmFpbGFibGUsXG5wcm92aWRlUHJvbWlzZVdhdGNoZXI6dW52YWlsYWJsZSxcbndhdGNoUHJvbWlzZTp1bnZhaWxhYmxlLFxubWFrZVNjYWxhckJpZ01hcFN0b3JlOnVudmFpbGFibGUsXG5tYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlOnVudmFpbGFibGUsXG5tYWtlU2NhbGFyQmlnU2V0U3RvcmU6dW52YWlsYWJsZSxcbm1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmU6dW52YWlsYWJsZSxcbmNhbkJlRHVyYWJsZTp1bnZhaWxhYmxlfTtcblxuIH1cblxuY29uc3QgVmF0RGF0YUV4cG9ydD1WYXREYXRhR2xvYmFsOyRo4oCNX29uY2UuVmF0RGF0YUV4cG9ydChWYXREYXRhRXhwb3J0KTtcblxuXG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSBFeG9zL0V4b0NsYXNzZXMgaW5zdGVhZCBvZiBLaW5kc1xuICovXG5jb25zdCAgICAgICB7XG5kZWZpbmVLaW5kLFxuZGVmaW5lS2luZE11bHRpLFxuZGVmaW5lRHVyYWJsZUtpbmQsXG5kZWZpbmVEdXJhYmxlS2luZE11bHRpfT1cblZhdERhdGFHbG9iYWw7JGjigI1fb25jZS5kZWZpbmVLaW5kKGRlZmluZUtpbmQpOyRo4oCNX29uY2UuZGVmaW5lS2luZE11bHRpKGRlZmluZUtpbmRNdWx0aSk7JGjigI1fb25jZS5kZWZpbmVEdXJhYmxlS2luZChkZWZpbmVEdXJhYmxlS2luZCk7JGjigI1fb25jZS5kZWZpbmVEdXJhYmxlS2luZE11bHRpKGRlZmluZUR1cmFibGVLaW5kTXVsdGkpO1xuXG5jb25zdCAgICAgICB7XG5tYWtlS2luZEhhbmRsZSxcbnByb3ZpZGVQcm9taXNlV2F0Y2hlcixcbndhdGNoUHJvbWlzZSxcbm1ha2VTY2FsYXJCaWdNYXBTdG9yZSxcbm1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUsXG5tYWtlU2NhbGFyQmlnU2V0U3RvcmUsXG5tYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlLFxuY2FuQmVEdXJhYmxlfT1cblZhdERhdGFHbG9iYWw7XG5cbi8qKlxuICogV2hlbiBtYWtpbmcgYSBtdWx0aS1mYWNldCBraW5kLCBpdCdzIGNvbW1vbiB0byBwaWNrIG9uZSBmYWNldCB0byBleHBvc2UuIEUuZy4sXG4gKlxuICogICAgIGNvbnN0IG1ha2VGb28gPSAoYSwgYiwgYywgZCkgPT4gbWFrZUZvb0Jhc2UoYSwgYiwgYywgZCkuc2VsZjtcbiAqXG4gKiBUaGlzIGhlbHBlciByZWR1Y2VzIHRoZSBkdXBsaWNhdGlvbjpcbiAqXG4gKiAgICAgY29uc3QgbWFrZUZvbyA9IHBpY2tGYWNldChtYWtlRm9vQmFzZSwgJ3NlbGYnKTtcbiAqXG4gKiBAdHlwZSB7WGltcG9ydCgnQGFnb3JpYy9zd2luZ3NldC1saXZlc2xvdHMnKS5QaWNrRmFjZXR9XG4gKi8kaOKAjV9vbmNlLm1ha2VLaW5kSGFuZGxlKG1ha2VLaW5kSGFuZGxlKTskaOKAjV9vbmNlLnByb3ZpZGVQcm9taXNlV2F0Y2hlcihwcm92aWRlUHJvbWlzZVdhdGNoZXIpOyRo4oCNX29uY2Uud2F0Y2hQcm9taXNlKHdhdGNoUHJvbWlzZSk7JGjigI1fb25jZS5tYWtlU2NhbGFyQmlnTWFwU3RvcmUobWFrZVNjYWxhckJpZ01hcFN0b3JlKTskaOKAjV9vbmNlLm1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUobWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSk7JGjigI1fb25jZS5tYWtlU2NhbGFyQmlnU2V0U3RvcmUobWFrZVNjYWxhckJpZ1NldFN0b3JlKTskaOKAjV9vbmNlLm1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmUobWFrZVNjYWxhckJpZ1dlYWtTZXRTdG9yZSk7JGjigI1fb25jZS5jYW5CZUR1cmFibGUoY2FuQmVEdXJhYmxlKTtcbmNvbnN0ICAgICAgICBwaWNrRmFjZXQ9XG4obWFrZXIsZmFjZXROYW1lKT0+XG4oLi4uYXJncyk9PlxubWFrZXIoLi4uYXJncylbZmFjZXROYW1lXTskaOKAjV9vbmNlLnBpY2tGYWNldChwaWNrRmFjZXQpO1xuaGFyZGVuKHBpY2tGYWNldCk7XG5cbi8qKlxuICogQXNzaWduIHRoZSB2YWx1ZXMgb2YgYWxsIG9mIHRoZSBlbnVtZXJhYmxlIG93biBwcm9wZXJ0aWVzIGZyb20gdGhlIHNvdXJjZVxuICogb2JqZWN0IHRvIHRoZWlyIGtleXMgaW4gdGhlIHRhcmdldCBvYmplY3QuXG4gKlxuICogQHRlbXBsYXRlIHt7fX0gVFxuICogQHBhcmFtIHtUfSB0YXJnZXRcbiAqIEBwYXJhbSB7UGFydGlhbDxUPn0gc291cmNlXG4gKi9cbmNvbnN0ICAgICAgICBwYXJ0aWFsQXNzaWduPSh0YXJnZXQsc291cmNlKT0+e1xuT2JqZWN0LmFzc2lnbih0YXJnZXQsc291cmNlKTtcbiB9OyRo4oCNX29uY2UucGFydGlhbEFzc2lnbihwYXJ0aWFsQXNzaWduKTtcbmhhcmRlbihwYXJ0aWFsQXNzaWduKTtcblxuLyogWFhYIGNvcGllZCBmcm9tIEBhZ29yaWMvc3RvcmUgdHlwZXMqL1xuLyogVU5USUwgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy80NTYwKi9cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU3RvcmVPcHRpb25zXG4gKiBPZiB0aGUgZGltZW5zaW9ucyBvbiB3aGljaCBLZXllZFN0b3JlcyBjYW4gZGlmZmVyLCB3ZSBvbmx5IHJlcHJlc2VudCBhIGZld1xuICogb2YgdGhlbSBhcyBzdGFuZGFyZCBvcHRpb25zLiBBIGdpdmVuIHN0b3JlIG1ha2VyIHNob3VsZCBkb2N1bWVudCB3aGljaFxuICogb3B0aW9ucyBpdCBzdXBwb3J0cywgYXMgd2VsbCBhcyBpdHMgcG9zaXRpb25zIG9uIGRpbWVuc2lvbnMgZm9yIHdoaWNoIGl0XG4gKiBkb2VzIG5vdCBzdXBwb3J0IG9wdGlvbnMuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtsb25nTGl2ZWQ9dHJ1ZV0gV2hpY2ggd2F5IHRvIG9wdGltaXplIGEgd2VhayBzdG9yZS4gVHJ1ZSBtZWFuc1xuICogdGhhdCB3ZSBleHBlY3QgdGhpcyB3ZWFrIHN0b3JlIHRvIG91dGxpdmUgbW9zdCBvZiBpdHMga2V5cywgaW4gd2hpY2hcbiAqIGNhc2Ugd2UgaW50ZXJuYWxseSBtYXkgdXNlIGEgSmF2YVNjcmlwdCBgV2Vha01hcGAuIE90aGVyd2lzZSB3ZSBpbnRlcm5hbGx5XG4gKiBtYXkgdXNlIGEgSmF2YVNjcmlwdCBgTWFwYC5cbiAqIERlZmF1bHRzIHRvIHRydWUsIHNvIHBsZWFzZSBtYXJrIHNob3J0IGxpdmVkIHN0b3JlcyBleHBsaWNpdGx5LlxuICogQHByb3BlcnR5IHtib29sZWFufSBbZHVyYWJsZT1mYWxzZV0gIFRoZSBjb250ZW50cyBvZiB0aGlzIHN0b3JlIHN1cnZpdmUgdGVybWluYXRpb25cbiAqICAgb2YgaXRzIGNvbnRhaW5pbmcgcHJvY2VzcywgYWxsb3dpbmcgZm9yIHJlc3RhcnQgb3IgdXBncmFkZSBidXQgYXQgdGhlIGNvc3RcbiAqICAgb2YgZm9yYmlkZGluZyBzdG9yYWdlIG9mIHJlZmVyZW5jZXMgdG8gZXBoZW1lcmFsIGRhdGEuICBEZWZhdWx0cyB0byBmYWxzZS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2Zha2VEdXJhYmxlPWZhbHNlXSAgVGhpcyBzdG9yZSBwcmV0ZW5kcyB0byBiZSBhIGR1cmFibGUgc3RvcmVcbiAqICAgYnV0IGRvZXMgbm90IGVuZm9yY2UgdGhhdCB0aGUgdGhpbmdzIHN0b3JlZCBpbiBpdCBhY3R1YWxseSBiZSB0aGVtc2VsdmVzXG4gKiAgIGR1cmFibGUgKHdoZXJlYXMgYW4gYWN0dWFsIGR1cmFibGUgc3RvcmUgd291bGQgZm9yYmlkIHN0b3JhZ2Ugb2Ygc3VjaFxuICogICBpdGVtcykuICBUaGlzIGlzIGluIHNlcnZpY2Ugb2YgYWxsb3dpbmcgaW5jcmVtZW50YWwgdHJhbnNpdGlvbiB0byB1c2Ugb2ZcbiAqICAgZHVyYWJsZSBzdG9yZXMsIHRvIGVuYWJsZSBub3JtYWwgb3BlcmF0aW9uIGFuZCB0ZXN0aW5nIHdoZW4gc29tZSBzdHVmZlxuICogICBpbnRlbmRlZCB0byBldmVudHVhbGx5IGJlIGR1cmFibGUgaGFzIG5vdCB5ZXQgYmVlbiBtYWRlIGR1cmFibGUuICBBIHN0b3JlXG4gKiAgIG1hcmtlZCBhcyBmYWtlRHVyYWJsZSB3aWxsIGFwcGVhciB0byBvcGVyYXRlIG5vcm1hbGx5IGJ1dCBhbnkgYXR0ZW1wdCB0b1xuICogICB1cGdyYWRlIGl0cyBjb250YWluaW5nIHZhdCB3aWxsIGZhaWwgd2l0aCBhbiBlcnJvci5cbiAqIEBwcm9wZXJ0eSB7WGltcG9ydCgnQGFnb3JpYy9zd2luZ3NldC1saXZlc2xvdHMnKS5QYXR0ZXJufSBba2V5U2hhcGVdXG4gKiBAcHJvcGVydHkge1hpbXBvcnQoJ0BhZ29yaWMvc3dpbmdzZXQtbGl2ZXNsb3RzJykuUGF0dGVybn0gW3ZhbHVlU2hhcGVdXG4gKi9cbi8qKlxuICogVW5saWtlIGBwcm92aWRlTGF6eWAsIGBwcm92aWRlYCBzaG91bGQgYmUgY2FsbGVkIGF0IG1vc3Qgb25jZVxuICogd2l0aGluIGFueSB2YXQgaW5jYXJuYXRpb24gd2l0aCBhIGdpdmVuIGBiYWdnYWdlYCxga2V5YCBwYWlyLlxuICpcbiAqIGBwcm92aWRlYCBzaG91bGQgb25seSB0byBiZSB1c2VkIHRvIHBvcHVsYXRlIGJhZ2dhZ2UsXG4gKiB3aGVyZSB0aGUgdG90YWwgbnVtYmVyIG9mIGNhbGxzIHRvIGBwcm92aWRlYCBtdXN0IGJlXG4gKiBsb3cgY2FyZGluYWxpdHksIHNpbmNlIHdlIGtlZXAgdGhlIGJvb2trZWVwaW5nIHRvIGRldGVjdCBjb2xsaXNpb25zXG4gKiBpbiBub3JtYWwgbGFuZ3VhZ2UtaGVhcCBtZW1vcnkuIEFsbCB0aGUgb3RoZXIgYmFnZ2FnZS1vcmllbnRlZFxuICogYHByb3ZpZGUqYCBhbmQgYHByZXBhcmUqYCBmdW5jdGlvbnMgY2FsbCBgcHJvdmlkZWAsXG4gKiBhbmQgc28gaW1wb3NlIHRoZSBzYW1lIGNvbnN0cmFpbnRzLiBUaGlzIGlzIGNvbnNpc3RlbnQgd2l0aFxuICogb3VyIGV4cGVjdGVkIGR1cmFiaWxpdHkgcGF0dGVybnM6IFdoYXQgd2Ugc3RvcmUgaW4gYmFnZ2FnZSBhcmVcbiAqICAgICoga2luZEhhbmRsZXMsIHdoaWNoIGFyZSBwZXIga2luZCwgd2hpY2ggbXVzdCBiZSBsb3cgY2FyZGluYWxpdHlcbiAqICAgICogZGF0YSBcInZhcmlhYmxlc1wiIGZvciByZWVzdGFibGlzaGluZyB0aGUgbGV4aWNhbCBzY29wZSwgZXNwZWNpYWxseVxuICogICAgICBvZiBzaW5nbGV0b25zXG4gKiAgICAqIG5hbWVkIG5vbi1iYWdnYWdlIGNvbGxlY3Rpb25zIGF0IHRoZSBsZWF2ZXMgb2YgdGhlIGJhZ2dhZ2UgdHJlZS5cbiAqXG4gKiBXaGF0IGlzIGV4cGVjdGVkIHRvIGJlIGhpZ2ggY2FyZGluYWxpdHkgYXJlIHRoZSBpbnN0YW5jZXMgb2YgdGhlIGtpbmRzLFxuICogYW5kIHRoZSBtZW1iZXJzIG9mIHRoZSBub24tYmFnZ2dhZ2UgY29sbGVjdGlvbnMuXG4gKlxuICogVE9ETyBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvcHVsbC81ODc1IDpcbiAqIEltcGxlbWVudCBkZXZlbG9wbWVudC10aW1lIGluc3RydW1lbnRhdGlvbiB0byBkZXRlY3Qgd2hlblxuICogYHByb3ZpZGVgIHZpb2xhdGVzIHRoZSBhYm92ZSBwcmVzY3JpcHRpb24sIGFuZCBpcyBjYWxsZWQgbW9yZVxuICogdGhhbiBvbmNlIGluIHRoZSBzYW1lIHZhdCBpbmNhcm5hdGlvbiB3aXRoIHRoZSBzYW1lXG4gKiBiYWdnYWdlLGtleSBwYWlyLlxuICovXG5cbmNvbnN0ICAgICAgICBwcm92aWRlPVxuLyogWFhYIGNhc3QgYmVjYXVzZSBwcm92aWRlTGF6eSBpcyBgYW55YCBkdWUgdG8gYnJva2VuIHR5cGUgaW1wb3J0Ki9cbi8qKiBAdHlwZSB7PEssIFY+KGJhZ2dhZ2U6IFhpbXBvcnQoJ0BhZ29yaWMvc3dpbmdzZXQtbGl2ZXNsb3RzJykuQmFnZ2FnZSwga2V5OiBLLCBtYWtlVmFsdWU6IChrZXk6IEspID0+IFYpID0+IFZ9ICovXG5wcm92aWRlTGF6eTtcblxuXG4vKiBUT0RPOiBGaW5kIGEgZ29vZCBob21lIGZvciB0aGlzIGZ1bmN0aW9uIHVzZWQgYnkgQGFnb3JpYy92YXQtZGF0YSBhbmQgdGVzdGluZyBjb2RlKi9cbi8qKiBAcGFyYW0ge1hpbXBvcnQoJ0BhZ29yaWMvc3dpbmdzZXQtbGl2ZXNsb3RzJykuVmF0RGF0YX0gVmF0RGF0YSAqLyRo4oCNX29uY2UucHJvdmlkZShwcm92aWRlKTtcbmNvbnN0ICAgICAgICBtYWtlU3RvcmVVdGlscz0oVmF0RGF0YSk9PntcbmNvbnN0e1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvdyAtLSB0aGVzZSBsaXRlcmFsbHkgZG8gc2hhZG93IHRoZSBnbG9iYWxzKi9cbm1ha2VTY2FsYXJCaWdNYXBTdG9yZSxcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3cgLS0gdGhlc2UgbGl0ZXJhbGx5IGRvIHNoYWRvdyB0aGUgZ2xvYmFscyovXG5tYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlLFxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvdyAtLSB0aGVzZSBsaXRlcmFsbHkgZG8gc2hhZG93IHRoZSBnbG9iYWxzKi9cbm1ha2VTY2FsYXJCaWdTZXRTdG9yZSxcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3cgLS0gdGhlc2UgbGl0ZXJhbGx5IGRvIHNoYWRvdyB0aGUgZ2xvYmFscyovXG5tYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlfT1cblZhdERhdGE7XG5cbi8qKlxuICogQHBhcmFtIHtYaW1wb3J0KCdAYWdvcmljL3N3aW5nc2V0LWxpdmVzbG90cycpLkJhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge09taXQ8U3RvcmVPcHRpb25zLCAnZHVyYWJsZSc+fSBvcHRpb25zXG4gKi9cbmNvbnN0IHByb3ZpZGVEdXJhYmxlTWFwU3RvcmU9KGJhZ2dhZ2UsbmFtZSxvcHRpb25zPXt9KT0+XG5wcm92aWRlKGJhZ2dhZ2UsbmFtZSwoKT0+XG5tYWtlU2NhbGFyQmlnTWFwU3RvcmUobmFtZSx7ZHVyYWJsZTp0cnVlLC4uLm9wdGlvbnN9KSk7XG5cbmhhcmRlbihwcm92aWRlRHVyYWJsZU1hcFN0b3JlKTtcblxuLyoqXG4gKiBAcGFyYW0ge1hpbXBvcnQoJ0BhZ29yaWMvc3dpbmdzZXQtbGl2ZXNsb3RzJykuQmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7T21pdDxTdG9yZU9wdGlvbnMsICdkdXJhYmxlJz59IG9wdGlvbnNcbiAqL1xuY29uc3QgcHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmU9KGJhZ2dhZ2UsbmFtZSxvcHRpb25zPXt9KT0+XG5wcm92aWRlKGJhZ2dhZ2UsbmFtZSwoKT0+XG5tYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlKG5hbWUse2R1cmFibGU6dHJ1ZSwuLi5vcHRpb25zfSkpO1xuXG5oYXJkZW4ocHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUpO1xuXG4vKipcbiAqIEBwYXJhbSB7WGltcG9ydCgnQGFnb3JpYy9zd2luZ3NldC1saXZlc2xvdHMnKS5CYWdnYWdlfSBiYWdnYWdlXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtPbWl0PFN0b3JlT3B0aW9ucywgJ2R1cmFibGUnPn0gb3B0aW9uc1xuICovXG5jb25zdCBwcm92aWRlRHVyYWJsZVNldFN0b3JlPShiYWdnYWdlLG5hbWUsb3B0aW9ucz17fSk9PlxucHJvdmlkZShiYWdnYWdlLG5hbWUsKCk9PlxubWFrZVNjYWxhckJpZ1NldFN0b3JlKG5hbWUse2R1cmFibGU6dHJ1ZSwuLi5vcHRpb25zfSkpO1xuXG5oYXJkZW4ocHJvdmlkZUR1cmFibGVTZXRTdG9yZSk7XG5cbi8qKlxuICogQHBhcmFtIHtYaW1wb3J0KCdAYWdvcmljL3N3aW5nc2V0LWxpdmVzbG90cycpLkJhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge09taXQ8U3RvcmVPcHRpb25zLCAnZHVyYWJsZSc+fSBvcHRpb25zXG4gKi9cbmNvbnN0IHByb3ZpZGVEdXJhYmxlV2Vha1NldFN0b3JlPShiYWdnYWdlLG5hbWUsb3B0aW9ucz17fSk9PlxucHJvdmlkZShiYWdnYWdlLG5hbWUsKCk9PlxubWFrZVNjYWxhckJpZ1dlYWtTZXRTdG9yZShuYW1lLHtkdXJhYmxlOnRydWUsLi4ub3B0aW9uc30pKTtcblxuaGFyZGVuKHByb3ZpZGVEdXJhYmxlV2Vha1NldFN0b3JlKTtcblxucmV0dXJuIGhhcmRlbih7XG5wcm92aWRlRHVyYWJsZU1hcFN0b3JlLFxucHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUsXG5wcm92aWRlRHVyYWJsZVNldFN0b3JlLFxucHJvdmlkZUR1cmFibGVXZWFrU2V0U3RvcmV9KTtcblxuIH07JGjigI1fb25jZS5tYWtlU3RvcmVVdGlscyhtYWtlU3RvcmVVdGlscyk7XG5cbmNvbnN0IGdsb2JhbFN0b3JlVXRpbHM9bWFrZVN0b3JlVXRpbHMoVmF0RGF0YUdsb2JhbCk7XG5jb25zdCAgICAgICB7XG5wcm92aWRlRHVyYWJsZU1hcFN0b3JlLFxucHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUsXG5wcm92aWRlRHVyYWJsZVNldFN0b3JlLFxucHJvdmlkZUR1cmFibGVXZWFrU2V0U3RvcmV9PVxuZ2xvYmFsU3RvcmVVdGlsczskaOKAjV9vbmNlLnByb3ZpZGVEdXJhYmxlTWFwU3RvcmUocHJvdmlkZUR1cmFibGVNYXBTdG9yZSk7JGjigI1fb25jZS5wcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZShwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSk7JGjigI1fb25jZS5wcm92aWRlRHVyYWJsZVNldFN0b3JlKHByb3ZpZGVEdXJhYmxlU2V0U3RvcmUpOyRo4oCNX29uY2UucHJvdmlkZUR1cmFibGVXZWFrU2V0U3RvcmUocHJvdmlkZUR1cmFibGVXZWFrU2V0U3RvcmUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlZhdERhdGEiOlsiVmF0RGF0YUV4cG9ydCJdLCJkZWZpbmVLaW5kIjpbImRlZmluZUtpbmQiXSwiZGVmaW5lS2luZE11bHRpIjpbImRlZmluZUtpbmRNdWx0aSJdLCJkZWZpbmVEdXJhYmxlS2luZCI6WyJkZWZpbmVEdXJhYmxlS2luZCJdLCJkZWZpbmVEdXJhYmxlS2luZE11bHRpIjpbImRlZmluZUR1cmFibGVLaW5kTXVsdGkiXSwibWFrZUtpbmRIYW5kbGUiOlsibWFrZUtpbmRIYW5kbGUiXSwicHJvdmlkZVByb21pc2VXYXRjaGVyIjpbInByb3ZpZGVQcm9taXNlV2F0Y2hlciJdLCJ3YXRjaFByb21pc2UiOlsid2F0Y2hQcm9taXNlIl0sIm1ha2VTY2FsYXJCaWdNYXBTdG9yZSI6WyJtYWtlU2NhbGFyQmlnTWFwU3RvcmUiXSwibWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSI6WyJtYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlIl0sIm1ha2VTY2FsYXJCaWdTZXRTdG9yZSI6WyJtYWtlU2NhbGFyQmlnU2V0U3RvcmUiXSwibWFrZVNjYWxhckJpZ1dlYWtTZXRTdG9yZSI6WyJtYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlIl0sImNhbkJlRHVyYWJsZSI6WyJjYW5CZUR1cmFibGUiXSwicGlja0ZhY2V0IjpbInBpY2tGYWNldCJdLCJwYXJ0aWFsQXNzaWduIjpbInBhcnRpYWxBc3NpZ24iXSwicHJvdmlkZSI6WyJwcm92aWRlIl0sIm1ha2VTdG9yZVV0aWxzIjpbIm1ha2VTdG9yZVV0aWxzIl0sInByb3ZpZGVEdXJhYmxlTWFwU3RvcmUiOlsicHJvdmlkZUR1cmFibGVNYXBTdG9yZSJdLCJwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSI6WyJwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSJdLCJwcm92aWRlRHVyYWJsZVNldFN0b3JlIjpbInByb3ZpZGVEdXJhYmxlU2V0U3RvcmUiXSwicHJvdmlkZUR1cmFibGVXZWFrU2V0U3RvcmUiOlsicHJvdmlkZUR1cmFibGVXZWFrU2V0U3RvcmUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAT92a1ooHAACKBwAAIwAAAEBhZ29yaWMvdmF0cy12MC4xNS4xL3NyYy92YXQtem9lLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2ZhciIsIkBhZ29yaWMvem9lIl0sImV4cG9ydHMiOlsiYnVpbGRSb290T2JqZWN0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEZhcixtYWtlRHVyYWJsZVpvZUtpdDskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9mYXJcIiwgW1tcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvem9lXCIsIFtbXCJtYWtlRHVyYWJsZVpvZUtpdFwiLCBbJGjigI1fYSA9PiAobWFrZUR1cmFibGVab2VLaXQgPSAkaOKAjV9hKV1dXV1dKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoYnVpbGRSb290T2JqZWN0LCAnbmFtZScsIHt2YWx1ZTogXCJidWlsZFJvb3RPYmplY3RcIn0pOyRo4oCNX29uY2UuYnVpbGRSb290T2JqZWN0KGJ1aWxkUm9vdE9iamVjdCk7ICAgXG5cblxuY29uc3QgQlVJTERfUEFSQU1TX0tFWT0nYnVpbGRab2VQYXJhbXMnO1xuXG5mdW5jdGlvbiAgICAgICAgYnVpbGRSb290T2JqZWN0KHZhdFBvd2VycyxfdmF0UGFyYW1zLHpvZUJhZ2dhZ2Upe1xuY29uc3Qgc2h1dGRvd25ab2VWYXQ9dmF0UG93ZXJzLmV4aXRWYXRXaXRoRmFpbHVyZTtcblxubGV0IHpvZUNvbmZpZ0ZhY2V0O1xuXG5pZih6b2VCYWdnYWdlLmhhcyhCVUlMRF9QQVJBTVNfS0VZKSl7XG5jb25zdHtmZWVJc3N1ZXJDb25maWcsemNmU3BlY309em9lQmFnZ2FnZS5nZXQoQlVJTERfUEFSQU1TX0tFWSk7XG4vKiBUaGUgcmV0dXJuIHZhbHVlIGlzIGB7IHpvZVNlcnZpY2UsIHpvZUNvbmZpZ0ZhY2V0LCBmZWVNaW50QWNjZXNzIH1gLiBUaGlzKi9cbi8qIGNhbGwgb25seSBuZWVkcyB6b2VDb25maWdGYWNldCBiZWNhdXNlIHRoZSBvdGhlcnMgaGF2ZSBiZWVuIHJldHVybmVkLiovXG4vKiB6b2VDb25maWdGYWNldCB3YXMgYWRkZWQgYWZ0ZXIgdGhlIGZpcnN0IHJlbGVhc2Ugb2YgWm9lIG9uLWNoYWluLiovXG4oe3pvZUNvbmZpZ0ZhY2V0fT1tYWtlRHVyYWJsZVpvZUtpdCh7XG4vKiBGb3Igbm93IFpvZSB3aWxsIHJld2lyZSB2YXRBZG1pblN2YyBvbiBpdHMgb3duKi9cbnNodXRkb3duWm9lVmF0LFxuZmVlSXNzdWVyQ29uZmlnLFxuemNmU3BlYyxcbnpvZUJhZ2dhZ2V9KSk7XG5cbiB9XG5cbnJldHVybiBGYXIoJ3Jvb3QnLHtcbmJ1aWxkWm9lOmFzeW5jKGFkbWluVmF0LGZlZUlzc3VlckNvbmZpZyx6Y2ZCdW5kbGVOYW1lKT0+e1xuYXNzZXJ0KHpjZkJ1bmRsZU5hbWUsIGB2YXQtem9lIHJlcXVpcmVzIHpjZkJ1bmRsZU5hbWVgKTtcblxuY29uc3QgdmF0QWRtaW5TdmM9YXdhaXQgYWRtaW5WYXQ7XG5cbi8qKiBAdHlwZSB7WkNGU3BlY30gKi9cbmNvbnN0IHpjZlNwZWM9e25hbWU6emNmQnVuZGxlTmFtZX07XG5cbnpvZUJhZ2dhZ2UuaW5pdChcbkJVSUxEX1BBUkFNU19LRVksXG5oYXJkZW4oe3ZhdEFkbWluU3ZjLGZlZUlzc3VlckNvbmZpZyx6Y2ZTcGVjfSkpO1xuXG5cbmNvbnN0e3pvZVNlcnZpY2UsZmVlTWludEFjY2Vzc309bWFrZUR1cmFibGVab2VLaXQoe1xudmF0QWRtaW5TdmMsXG5zaHV0ZG93blpvZVZhdCxcbmZlZUlzc3VlckNvbmZpZyxcbnpjZlNwZWMsXG56b2VCYWdnYWdlfSk7XG5cblxucmV0dXJuIGhhcmRlbih7XG56b2VTZXJ2aWNlLFxuZmVlTWludEFjY2Vzc30pO1xuXG4gfSxcbmdldFpvZUNvbmZpZ0ZhY2V0OigpPT56b2VDb25maWdGYWNldH0pO1xuXG4gfVxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImJ1aWxkUm9vdE9iamVjdCI6WyJidWlsZFJvb3RPYmplY3QiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA5SQy2UAcAABAHAAAKAAAAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL2NsZWFuUHJvcG9zYWwuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9hc3NlcnQiLCJAYWdvcmljL2VydHAiLCJAZW5kby9tYXJzaGFsIiwiQGFnb3JpYy9zdG9yZSIsIi4vdHlwZUd1YXJkcy5qcyIsIi4vb2JqQXJyYXlDb252ZXJzaW9uLmpzIiwiLi9pbnRlcm5hbC10eXBlcy5qcyJdLCJleHBvcnRzIjpbIk1BWF9LRVlXT1JEX0xFTkdUSCIsImFzc2VydEtleXdvcmROYW1lIiwiY2xlYW5LZXl3b3JkcyIsImNsZWFuUHJvcG9zYWwiLCJjb2VyY2VBbW91bnRLZXl3b3JkUmVjb3JkIiwiY29lcmNlQW1vdW50UGF0dGVybktleXdvcmRSZWNvcmQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0LHEsRmFpbCxBbW91bnRNYXRoLGdldEFzc2V0S2luZCxhc3NlcnRSZWNvcmQsYXNzZXJ0S2V5LGFzc2VydFBhdHRlcm4sbXVzdE1hdGNoLGlzS2V5LEZ1bGxQcm9wb3NhbFNoYXBlLGFycmF5VG9PYmo7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9hc3NlcnRcIiwgW1tcImFzc2VydFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0ID0gJGjigI1fYSldXSxbXCJxXCIsIFskaOKAjV9hID0+IChxID0gJGjigI1fYSldXSxbXCJGYWlsXCIsIFskaOKAjV9hID0+IChGYWlsID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvZXJ0cFwiLCBbW1wiQW1vdW50TWF0aFwiLCBbJGjigI1fYSA9PiAoQW1vdW50TWF0aCA9ICRo4oCNX2EpXV0sW1wiZ2V0QXNzZXRLaW5kXCIsIFskaOKAjV9hID0+IChnZXRBc3NldEtpbmQgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiYXNzZXJ0UmVjb3JkXCIsIFskaOKAjV9hID0+IChhc3NlcnRSZWNvcmQgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiYXNzZXJ0S2V5XCIsIFskaOKAjV9hID0+IChhc3NlcnRLZXkgPSAkaOKAjV9hKV1dLFtcImFzc2VydFBhdHRlcm5cIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhdHRlcm4gPSAkaOKAjV9hKV1dLFtcIm11c3RNYXRjaFwiLCBbJGjigI1fYSA9PiAobXVzdE1hdGNoID0gJGjigI1fYSldXSxbXCJpc0tleVwiLCBbJGjigI1fYSA9PiAoaXNLZXkgPSAkaOKAjV9hKV1dXV0sW1wiLi90eXBlR3VhcmRzLmpzXCIsIFtbXCJGdWxsUHJvcG9zYWxTaGFwZVwiLCBbJGjigI1fYSA9PiAoRnVsbFByb3Bvc2FsU2hhcGUgPSAkaOKAjV9hKV1dXV0sW1wiLi9vYmpBcnJheUNvbnZlcnNpb24uanNcIiwgW1tcImFycmF5VG9PYmpcIiwgWyRo4oCNX2EgPT4gKGFycmF5VG9PYmogPSAkaOKAjV9hKV1dXV0sW1wiLi9pbnRlcm5hbC10eXBlcy5qc1wiLCBbXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuXG5jb25zdCAgICAgICAgTUFYX0tFWVdPUkRfTEVOR1RIPTEwMDskaOKAjV9vbmNlLk1BWF9LRVlXT1JEX0xFTkdUSChNQVhfS0VZV09SRF9MRU5HVEgpO1xuXG5jb25zdCBmaXJzdENhcEFTQ0lJPS9eW0EtWl1bYS16QS1aMC05XyRdKiQvO1xuXG4vKiBXZSBhZG9wdCBzaW1wbGUgcmVxdWlyZW1lbnRzIG9uIGtleXdvcmRzIHNvIHRoYXQgdGhleSBkbyBub3QgYWNjaWRlbnRhbGx5Ki9cbi8qIGNvbmZsaWN0IHdpdGggZXhpc3RpbmcgcHJvcGVydHkgbmFtZXMuKi9cbi8qIFdlIHJlcXVpcmUga2V5d29yZHMgdG8gYmUgc3RyaW5ncywgYXNjaWkgaWRlbnRpZmllcnMgYmVnaW5uaW5nIHdpdGggYW4qL1xuLyogdXBwZXIgY2FzZSBsZXR0ZXIsIGFuZCBkaXN0aW5jdCBmcm9tIHRoZSBzdHJpbmdpZmllZCBmb3JtIG9mIGFueSBudW1iZXIuKi9cbi8qKi9cbi8qIE9mIG51bWJlcnMsIG9ubHkgTmFOIGFuZCBJbmZpbml0eSwgd2hlbiBzdHJpbmdpZmllZCB0byBhIHByb3BlcnR5IG5hbWUsKi9cbi8qIHByb2R1Y2UgYW4gYXNjaWkgaWRlbnRpZmllciBiZWdpbm5pbmcgd2l0aCBhbiB1cHBlciBjYXNlIGxldHRlci4qL1xuLyogV2l0aCB0aGlzIHJ1bGUsIGEgY29tcHV0ZWQgaW5kZXhpbmcgZXhwcmVzc2lvbiBsaWtlIGBhWytpXWAgY2Fubm90Ki9cbi8qIGxvb2t1cCBhIGtleXdvcmQtbmFtZWQgcHJvcGVydHkgbm8gbWF0dGVyIHdoYXQgYGlgIGlzLiovXG5jb25zdCAgICAgICAgYXNzZXJ0S2V5d29yZE5hbWU9KGtleXdvcmQpPT57XG5hc3NlcnQudHlwZW9mKGtleXdvcmQsJ3N0cmluZycpO1xua2V5d29yZC5sZW5ndGg8PU1BWF9LRVlXT1JEX0xFTkdUSHx8XG5GYWlsIGBrZXl3b3JkICR7cShrZXl3b3JkKX0gZXhjZWVkZWQgbWF4aW11bSBsZW5ndGggJHtxKFxuTUFYX0tFWVdPUkRfTEVOR1RIKVxuIH0gY2hhcmFjdGVyczsgZ290ICR7a2V5d29yZC5sZW5ndGh9YDtcbmZpcnN0Q2FwQVNDSUkudGVzdChrZXl3b3JkKXx8XG5GYWlsIGBrZXl3b3JkICR7cShcbmtleXdvcmQpXG4gfSBtdXN0IGJlIGFuIGFzY2lpIGlkZW50aWZpZXIgc3RhcnRpbmcgd2l0aCB1cHBlciBjYXNlLmA7XG5rZXl3b3JkIT09J05hTicmJmtleXdvcmQhPT0nSW5maW5pdHknfHxcbkZhaWwgYGtleXdvcmQgJHtxKGtleXdvcmQpfSBtdXN0IG5vdCBiZSBhIG51bWJlcidzIG5hbWVgO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHt7W25hbWU6IHN0cmluZ106IGFueX19IHVuY2xlYW5LZXl3b3JkUmVjb3JkXG4gKiBAcmV0dXJucyB7c3RyaW5nW119XG4gKi8kaOKAjV9vbmNlLmFzc2VydEtleXdvcmROYW1lKGFzc2VydEtleXdvcmROYW1lKTtcbmNvbnN0ICAgICAgICBjbGVhbktleXdvcmRzPSh1bmNsZWFuS2V5d29yZFJlY29yZCk9PntcbmhhcmRlbih1bmNsZWFuS2V5d29yZFJlY29yZCk7XG5hc3NlcnRSZWNvcmQodW5jbGVhbktleXdvcmRSZWNvcmQsJ2tleXdvcmRSZWNvcmQnKTtcbmNvbnN0IGtleXdvcmRzPW93bktleXModW5jbGVhbktleXdvcmRSZWNvcmQpO1xuXG4vKiBBc3NlcnQgYWxsIG5hbWVzIGFyZSBhc2NpaSBpZGVudGlmaWVycyBzdGFydGluZyB3aXRoKi9cbi8qIGFuIHVwcGVyIGNhc2UgbGV0dGVyLiovXG5rZXl3b3Jkcy5mb3JFYWNoKGFzc2VydEtleXdvcmROYW1lKTtcblxucmV0dXJuICgvKiogQHR5cGUge3N0cmluZ1tdfSAqL2tleXdvcmRzKTtcbiB9OyRo4oCNX29uY2UuY2xlYW5LZXl3b3JkcyhjbGVhbktleXdvcmRzKTtcblxuY29uc3QgICAgICAgIGNvZXJjZUFtb3VudFBhdHRlcm5LZXl3b3JkUmVjb3JkPShcbmFsbGVnZWRBbW91bnRLZXl3b3JkUmVjb3JkLFxuZ2V0QXNzZXRLaW5kQnlCcmFuZCk9Plxue1xuY29uc3Qga2V5d29yZHM9Y2xlYW5LZXl3b3JkcyhhbGxlZ2VkQW1vdW50S2V5d29yZFJlY29yZCk7XG5cbmNvbnN0IGFtb3VudHM9T2JqZWN0LnZhbHVlcyhhbGxlZ2VkQW1vdW50S2V5d29yZFJlY29yZCk7XG4vKiBDaGVjayB0aGF0IGVhY2ggdmFsdWUgY2FuIGJlIGNvZXJjZWQgdXNpbmcgdGhlIEFtb3VudE1hdGgqL1xuLyogaW5kaWNhdGVkIGJ5IGJyYW5kLiBgQW1vdW50TWF0aC5jb2VyY2VgIHRocm93cyBpZiBjb2VyY2lvbiBmYWlscy4qL1xuY29uc3QgY29lcmNlZEFtb3VudHM9YW1vdW50cy5tYXAoKGFtb3VudCk9PntcbmlmKGlzS2V5KGFtb3VudCkpe1xuY29uc3QgYnJhbmRBc3NldEtpbmQ9Z2V0QXNzZXRLaW5kQnlCcmFuZChhbW91bnQuYnJhbmQpO1xuY29uc3QgYXNzZXRLaW5kPWdldEFzc2V0S2luZChhbW91bnQpO1xuLyogVE9ETzogcmVwbGFjZSB0aGlzIGFzc2VydGlvbiB3aXRoIGEgY2hlY2sgb2YgdGhlIGFzc2V0S2luZCovXG4vKiBwcm9wZXJ0eSBvbiB0aGUgYnJhbmQsIHdoZW4gdGhhdCBleGlzdHMuKi9cbmFzc2V0S2luZD09PWJyYW5kQXNzZXRLaW5kfHxcbkZhaWwgYFRoZSBhbW91bnQgJHthbW91bnR9IGRpZCBub3QgaGF2ZSB0aGUgYXNzZXRLaW5kIG9mIHRoZSBicmFuZCAke2JyYW5kQXNzZXRLaW5kfWA7XG5yZXR1cm4gQW1vdW50TWF0aC5jb2VyY2UoYW1vdW50LmJyYW5kLGFtb3VudCk7XG4gfWVsc2V7XG5hc3NlcnRQYXR0ZXJuKGFtb3VudCk7XG5yZXR1cm4gYW1vdW50O1xuIH1cbiB9KTtcblxuLyogUmVjcmVhdGUgdGhlIGFtb3VudEtleXdvcmRSZWNvcmQgd2l0aCBjb2VyY2VkQW1vdW50cy4qL1xucmV0dXJuIGhhcmRlbihhcnJheVRvT2JqKGNvZXJjZWRBbW91bnRzLGtleXdvcmRzKSk7XG4gfTskaOKAjV9vbmNlLmNvZXJjZUFtb3VudFBhdHRlcm5LZXl3b3JkUmVjb3JkKGNvZXJjZUFtb3VudFBhdHRlcm5LZXl3b3JkUmVjb3JkKTtcblxuY29uc3QgICAgICAgIGNvZXJjZUFtb3VudEtleXdvcmRSZWNvcmQ9KFxuYWxsZWdlZEFtb3VudEtleXdvcmRSZWNvcmQsXG5nZXRBc3NldEtpbmRCeUJyYW5kKT0+XG57XG5jb25zdCByZXN1bHQ9Y29lcmNlQW1vdW50UGF0dGVybktleXdvcmRSZWNvcmQoXG5hbGxlZ2VkQW1vdW50S2V5d29yZFJlY29yZCxcbmdldEFzc2V0S2luZEJ5QnJhbmQpO1xuXG5hc3NlcnRLZXkocmVzdWx0KTtcbnJldHVybiByZXN1bHQ7XG4gfTtcblxuLyoqXG4gKiBKdXN0IGNoZWNrcyByZXNpZHVhbCBpc3N1ZXMgYWZ0ZXIgbWF0Y2hpbmcgUHJvcG9zYWxTaGFwZS5cbiAqIE9ubHkga25vd24gcmVzaWR1YWwgaXNzdWUgaXMgdmVyaWZ5aW5nIHRoYXQgaXQgb25seSBoYXMgb25lIG9mIHRoZVxuICogb3B0aW9uYWwgcHJvcGVydGllcy5cbiAqXG4gKiBAcGFyYW0ge0V4aXRSdWxlfSBleGl0XG4gKi8kaOKAjV9vbmNlLmNvZXJjZUFtb3VudEtleXdvcmRSZWNvcmQoY29lcmNlQW1vdW50S2V5d29yZFJlY29yZCk7XG5jb25zdCBhc3NlcnRFeGl0PShleGl0KT0+XG5vd25LZXlzKGV4aXQpLmxlbmd0aD09PTF8fEZhaWwgYGV4aXQgJHtleGl0fSBzaG91bGQgb25seSBoYXZlIG9uZSBrZXlgO1xuXG4vKipcbiAqIGNoZWNrIHRoYXQga2V5d29yZCBpcyBub3QgaW4gYm90aCAnd2FudCcgYW5kICdnaXZlJy5cbiAqXG4gKiBAcGFyYW0ge1Byb3Bvc2FsUmVjb3JkW1wid2FudFwiXX0gd2FudFxuICogQHBhcmFtIHtQcm9wb3NhbFJlY29yZFtcImdpdmVcIl19IGdpdmVcbiAqL1xuY29uc3QgYXNzZXJ0S2V5d29yZE5vdEluQm90aD0od2FudCxnaXZlKT0+e1xuY29uc3Qgd2FudEtleXdvcmRTZXQ9bmV3IFNldChvd25LZXlzKHdhbnQpKTtcbmNvbnN0IGdpdmVLZXl3b3Jkcz1vd25LZXlzKGdpdmUpO1xuXG5mb3IoY29uc3Qga2V5d29yZCBvZiBnaXZlS2V5d29yZHMpe1xuIXdhbnRLZXl3b3JkU2V0LmhhcyhrZXl3b3JkKXx8XG5GYWlsIGBhIGtleXdvcmQgY2Fubm90IGJlIGluIGJvdGggJ3dhbnQnIGFuZCAnZ2l2ZSdgO1xuIH1cbiB9O1xuXG4vKipcbiAqIGNsZWFuUHJvcG9zYWwgY2hlY2tzIHRoZSBrZXlzIGFuZCB2YWx1ZXMgb2YgdGhlIHByb3Bvc2FsLCBpbmNsdWRpbmdcbiAqIHRoZSBrZXlzIGFuZCB2YWx1ZXMgb2YgdGhlIGludGVybmFsIG9iamVjdHMuIFRoZSBwcm9wb3NhbCBtYXkgaGF2ZVxuICogdGhlIGZvbGxvd2luZyBrZXlzOiBgZ2l2ZWAsIGB3YW50YCwgYW5kIGBleGl0YC4gVGhlc2Uga2V5cyBtYXkgYmVcbiAqIG9taXR0ZWQgaW4gdGhlIGBwcm9wb3NhbGAgYXJndW1lbnQgcGFzc2VkIHRvIGNsZWFuUHJvcG9zYWwsIGJ1dFxuICogYW55dGhpbmcgb3RoZXIgdGhhbiB0aGVzZSBrZXlzIGlzIG5vdCBhbGxvd2VkLiBUaGUgdmFsdWVzIG9mIGBnaXZlYFxuICogYW5kIGB3YW50YCBtdXN0IGJlIFwiYW1vdW50S2V5d29yZFJlY29yZHNcIiwgbWVhbmluZyB0aGF0IHRoZSBrZXlzXG4gKiBtdXN0IGJlIGtleXdvcmRzIGFuZCB0aGUgdmFsdWVzIG11c3QgYmUgYW1vdW50cy4gVGhlIHZhbHVlIG9mXG4gKiBgZXhpdGAsIGlmIHByZXNlbnQsIG11c3QgYmUgYSByZWNvcmQgb2Ygb25lIG9mIHRoZSBmb2xsb3dpbmcgZm9ybXM6XG4gKiBgeyB3YWl2ZWQ6IG51bGwgfWAgYHsgb25EZW1hbmQ6IG51bGwgfWAgYHsgYWZ0ZXJEZWFkbGluZTogeyB0aW1lclxuICogOlRpbWVyLCBkZWFkbGluZSA6YmlnaW50IH0gfVxuICpcbiAqIEBwYXJhbSB7UHJvcG9zYWx9IHByb3Bvc2FsXG4gKiBAcGFyYW0ge0dldEFzc2V0S2luZEJ5QnJhbmR9IGdldEFzc2V0S2luZEJ5QnJhbmRcbiAqIEByZXR1cm5zIHtQcm9wb3NhbFJlY29yZH1cbiAqL1xuY29uc3QgICAgICAgIGNsZWFuUHJvcG9zYWw9KHByb3Bvc2FsLGdldEFzc2V0S2luZEJ5QnJhbmQpPT57XG5hc3NlcnRSZWNvcmQocHJvcG9zYWwsJ3Byb3Bvc2FsJyk7XG4vKiBXZSBmaWxsIGluIHRoZSBkZWZhdWx0IHZhbHVlcyBpZiB0aGUga2V5cyBhcmUgYWJzZW50IG9yIHVuZGVmaW5lZC4qL1xuY29uc3R7XG53YW50PWhhcmRlbih7fSksXG5naXZlPWhhcmRlbih7fSksXG5leGl0PWhhcmRlbih7b25EZW1hbmQ6bnVsbH0pLFxuLi4ucmVzdH09XG5wcm9wb3NhbDtcbm93bktleXMocmVzdCkubGVuZ3RoPT09MHx8XG5GYWlsIGAke3Byb3Bvc2FsfSAtIE11c3Qgb25seSBoYXZlIHdhbnQ6LCBnaXZlOiwgZXhpdDogcHJvcGVydGllczogJHtyZXN0fWA7XG5cbmNvbnN0IGNsZWFuZWRXYW50PWNvZXJjZUFtb3VudFBhdHRlcm5LZXl3b3JkUmVjb3JkKFxud2FudCxcbmdldEFzc2V0S2luZEJ5QnJhbmQpO1xuXG5jb25zdCBjbGVhbmVkR2l2ZT1jb2VyY2VBbW91bnRLZXl3b3JkUmVjb3JkKGdpdmUsZ2V0QXNzZXRLaW5kQnlCcmFuZCk7XG5cbmNvbnN0IGNsZWFuZWRQcm9wb3NhbD1oYXJkZW4oe1xud2FudDpjbGVhbmVkV2FudCxcbmdpdmU6Y2xlYW5lZEdpdmUsXG5leGl0fSk7XG5cbm11c3RNYXRjaChjbGVhbmVkUHJvcG9zYWwsRnVsbFByb3Bvc2FsU2hhcGUsJ3Byb3Bvc2FsJyk7XG5hc3NlcnRFeGl0KGV4aXQpO1xuYXNzZXJ0S2V5d29yZE5vdEluQm90aChjbGVhbmVkV2FudCxjbGVhbmVkR2l2ZSk7XG5yZXR1cm4gY2xlYW5lZFByb3Bvc2FsO1xuIH07JGjigI1fb25jZS5jbGVhblByb3Bvc2FsKGNsZWFuUHJvcG9zYWwpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Ik1BWF9LRVlXT1JEX0xFTkdUSCI6WyJNQVhfS0VZV09SRF9MRU5HVEgiXSwiYXNzZXJ0S2V5d29yZE5hbWUiOlsiYXNzZXJ0S2V5d29yZE5hbWUiXSwiY2xlYW5LZXl3b3JkcyI6WyJjbGVhbktleXdvcmRzIl0sImNvZXJjZUFtb3VudFBhdHRlcm5LZXl3b3JkUmVjb3JkIjpbImNvZXJjZUFtb3VudFBhdHRlcm5LZXl3b3JkUmVjb3JkIl0sImNvZXJjZUFtb3VudEtleXdvcmRSZWNvcmQiOlsiY29lcmNlQW1vdW50S2V5d29yZFJlY29yZCJdLCJjbGVhblByb3Bvc2FsIjpbImNsZWFuUHJvcG9zYWwiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAmqg5QrwQAAC8EAAANAAAAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL2NvbnRyYWN0RmFjZXQvb2ZmZXJTYWZldHkuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9lcnRwIl0sImV4cG9ydHMiOlsiaXNPZmZlclNhZmUiLCJzYXRpc2ZpZXNXYW50Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEFtb3VudE1hdGg7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9lcnRwXCIsIFtbXCJBbW91bnRNYXRoXCIsIFskaOKAjV9hID0+IChBbW91bnRNYXRoID0gJGjigI1fYSldXV1dXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGlzT2ZmZXJTYWZlLCAnbmFtZScsIHt2YWx1ZTogXCJpc09mZmVyU2FmZVwifSk7JGjigI1fb25jZS5pc09mZmVyU2FmZShpc09mZmVyU2FmZSk7ICAgXG5cbi8qKlxuICogSGVscGVyIHRvIHBlcmZvcm0gc2F0aXNmaWVzV2FudCBhbmQgc2F0aXNmaWVzR2l2ZS4gSXNcbiAqIGFsbG9jYXRpb25BbW91bnQgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHJlcXVpcmVkQW1vdW50IGZvciBldmVyeVxuICoga2V5d29yZCBvZiBnaXZlT3JXYW50P1xuICpcbiAqIFRvIHByZXBhcmUgZm9yIG11bHRpcGxlcywgc2F0aXNmaWVzV2FudCBhbmQgc2F0aXNmaWVzR2l2ZSByZXR1cm4gMCBvciAxLlxuICogaXNPZmZlclNhZmUgd2lsbCBzdGlsbCBiZSBib29sZWFuLiBXaGVuIHdlIGhhdmUgTXVsdGlwbGVzLCBzYXRpc2ZpZXNXYW50IGFuZFxuICogc2F0aXNmaWVzR2l2ZSB3aWxsIHRlbGwgaG93IG1hbnkgdGltZXMgdGhlIG9mZmVyIHdhcyBtYXRjaGVkLlxuICpcbiAqIEBwYXJhbSB7QW1vdW50S2V5d29yZFJlY29yZH0gZ2l2ZU9yV2FudFxuICogQHBhcmFtIHtBbW91bnRLZXl3b3JkUmVjb3JkfSBhbGxvY2F0aW9uXG4gKiBAcmV0dXJucyB7MHwxfVxuICovXG5jb25zdCBzYXRpc2ZpZXNJbnRlcm5hbD0oZ2l2ZU9yV2FudD17fSxhbGxvY2F0aW9uKT0+e1xuY29uc3QgaXNHVEVCeUtleXdvcmQ9KFtrZXl3b3JkLHJlcXVpcmVkQW1vdW50XSk9Pntcbi8qIElmIHRoZXJlIGlzIG5vIGFsbG9jYXRpb24gZm9yIGEga2V5d29yZCwgd2Uga25vdyB0aGUgZ2l2ZU9yV2FudCovXG4vKiBpcyBub3Qgc2F0aXNmaWVkIHdpdGhvdXQgY2hlY2tpbmcgZnVydGhlci4qL1xuaWYoYWxsb2NhdGlvbltrZXl3b3JkXT09PXVuZGVmaW5lZCl7XG5yZXR1cm4gMDtcbiB9XG5jb25zdCBhbGxvY2F0aW9uQW1vdW50PWFsbG9jYXRpb25ba2V5d29yZF07XG5yZXR1cm4gQW1vdW50TWF0aC5pc0dURShhbGxvY2F0aW9uQW1vdW50LHJlcXVpcmVkQW1vdW50KT8xOjA7XG4gfTtcbnJldHVybiBPYmplY3QuZW50cmllcyhnaXZlT3JXYW50KS5ldmVyeShpc0dURUJ5S2V5d29yZCk/MTowO1xuIH07XG5cbi8qKlxuICogRm9yIHRoaXMgYWxsb2NhdGlvbiB0byBzYXRpc2Z5IHdoYXQgdGhlIHVzZXIgd2FudGVkLCB0aGVpclxuICogYWxsb2NhdGVkIGFtb3VudHMgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gcHJvcG9zYWwud2FudC5cbiAqXG4gKiBAcGFyYW0ge1Byb3Bvc2FsUmVjb3JkfSBwcm9wb3NhbCAtIHRoZSBydWxlcyB0aGF0IGFjY29tcGFuaWVkIHRoZVxuICogZXNjcm93IG9mIHBheW1lbnRzIHRoYXQgZGljdGF0ZSB3aGF0IHRoZSB1c2VyIGV4cGVjdGVkIHRvIGdldCBiYWNrXG4gKiBmcm9tIFpvZS4gQSBwcm9wb3NhbCBpcyBhIHJlY29yZCB3aXRoIGtleXMgYGdpdmVgLCBgd2FudGAsIGFuZFxuICogYGV4aXRgLiBgZ2l2ZWAgYW5kIGB3YW50YCBhcmUgcmVjb3JkcyB3aXRoIGtleXdvcmRzIGFzIGtleXMgYW5kXG4gKiBhbW91bnRzIGFzIHZhbHVlcy4gVGhlIHByb3Bvc2FsIGlzIGEgdXNlcidzIHVuZGVyc3RhbmRpbmcgb2YgdGhlXG4gKiBjb250cmFjdCB0aGF0IHRoZXkgYXJlIGVudGVyaW5nIHdoZW4gdGhleSBtYWtlIGFuIG9mZmVyLlxuICogQHBhcmFtIHtBbW91bnRLZXl3b3JkUmVjb3JkfSBhbGxvY2F0aW9uIC0gYSByZWNvcmQgd2l0aCBrZXl3b3Jkc1xuICogYXMga2V5cyBhbmQgYW1vdW50cyBhcyB2YWx1ZXMuIFRoZXNlIGFtb3VudHMgYXJlIHRoZSByZWFsbG9jYXRpb25cbiAqIHRvIGJlIGdpdmVuIHRvIGEgdXNlci5cbiAqL1xuY29uc3Qgc2F0aXNmaWVzV2FudD0ocHJvcG9zYWwsYWxsb2NhdGlvbik9Plxuc2F0aXNmaWVzSW50ZXJuYWwocHJvcG9zYWwud2FudCxhbGxvY2F0aW9uKTtcblxuLyoqXG4gKiBGb3IgdGhpcyBhbGxvY2F0aW9uIHRvIGNvdW50IGFzIGEgZnVsbCByZWZ1bmQsIHRoZSBhbGxvY2F0ZWRcbiAqIGFtb3VudHMgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gd2hhdCB3YXMgb3JpZ2luYWxseVxuICogb2ZmZXJlZCAocHJvcG9zYWwuZ2l2ZSkuXG4gKlxuICogQHBhcmFtICB7UHJvcG9zYWxSZWNvcmR9IHByb3Bvc2FsIC0gdGhlIHJ1bGVzIHRoYXQgYWNjb21wYW5pZWQgdGhlXG4gKiBlc2Nyb3cgb2YgcGF5bWVudHMgdGhhdCBkaWN0YXRlIHdoYXQgdGhlIHVzZXIgZXhwZWN0ZWQgdG8gZ2V0IGJhY2tcbiAqIGZyb20gWm9lLiBBIHByb3Bvc2FsIGlzIGEgcmVjb3JkIHdpdGgga2V5cyBgZ2l2ZWAsIGB3YW50YCwgYW5kXG4gKiBgZXhpdGAuIGBnaXZlYCBhbmQgYHdhbnRgIGFyZSByZWNvcmRzIHdpdGgga2V5d29yZHMgYXMga2V5cyBhbmRcbiAqIGFtb3VudHMgYXMgdmFsdWVzLiBUaGUgcHJvcG9zYWwgaXMgYSB1c2VyJ3MgdW5kZXJzdGFuZGluZyBvZiB0aGVcbiAqIGNvbnRyYWN0IHRoYXQgdGhleSBhcmUgZW50ZXJpbmcgd2hlbiB0aGV5IG1ha2UgYW4gb2ZmZXIuXG4gKiBAcGFyYW0gIHtBbW91bnRLZXl3b3JkUmVjb3JkfSBhbGxvY2F0aW9uIC0gYSByZWNvcmQgd2l0aCBrZXl3b3Jkc1xuICogYXMga2V5cyBhbmQgYW1vdW50cyBhcyB2YWx1ZXMuIFRoZXNlIGFtb3VudHMgYXJlIHRoZSByZWFsbG9jYXRpb25cbiAqIHRvIGJlIGdpdmVuIHRvIGEgdXNlci5cbiAqLyRo4oCNX29uY2Uuc2F0aXNmaWVzV2FudChzYXRpc2ZpZXNXYW50KTtcbmNvbnN0IHNhdGlzZmllc0dpdmU9KHByb3Bvc2FsLGFsbG9jYXRpb24pPT5cbnNhdGlzZmllc0ludGVybmFsKHByb3Bvc2FsLmdpdmUsYWxsb2NhdGlvbik7XG5cbi8qKlxuICogYGlzT2ZmZXJTYWZlYCBjaGVja3Mgb2ZmZXIgc2FmZXR5IGZvciBhIHNpbmdsZSBvZmZlci5cbiAqXG4gKiBOb3RlOiBUaGlzIGltcGxlbWVudGF0aW9uIGNoZWNrcyB3aGV0aGVyIHdlIGZ1bGx5IHNhdGlzZnlcbiAqIGBwcm9wb3NhbC5naXZlYCAoZ2l2aW5nIGEgcmVmdW5kKSBvciB3aGV0aGVyIHdlIGZ1bGx5IHNhdGlzZnlcbiAqIGBwcm9wb3NhbC53YW50YC4gQm90aCBjYW4gYmUgZnVsbHkgc2F0aXNmaWVkLlxuICpcbiAqIEBwYXJhbSAge1Byb3Bvc2FsUmVjb3JkfSBwcm9wb3NhbCAtIHRoZSBydWxlcyB0aGF0IGFjY29tcGFuaWVkIHRoZVxuICogZXNjcm93IG9mIHBheW1lbnRzIHRoYXQgZGljdGF0ZSB3aGF0IHRoZSB1c2VyIGV4cGVjdGVkIHRvIGdldCBiYWNrXG4gKiBmcm9tIFpvZS4gQSBwcm9wb3NhbCBpcyBhIHJlY29yZCB3aXRoIGtleXMgYGdpdmVgLCBgd2FudGAsIGFuZFxuICogYGV4aXRgLiBgZ2l2ZWAgYW5kIGB3YW50YCBhcmUgcmVjb3JkcyB3aXRoIGtleXdvcmRzIGFzIGtleXMgYW5kXG4gKiBhbW91bnRzIGFzIHZhbHVlcy4gVGhlIHByb3Bvc2FsIGlzIGEgdXNlcidzIHVuZGVyc3RhbmRpbmcgb2YgdGhlXG4gKiBjb250cmFjdCB0aGF0IHRoZXkgYXJlIGVudGVyaW5nIHdoZW4gdGhleSBtYWtlIGFuIG9mZmVyLlxuICogQHBhcmFtICB7QW1vdW50S2V5d29yZFJlY29yZH0gYWxsb2NhdGlvbiAtIGEgcmVjb3JkIHdpdGgga2V5d29yZHNcbiAqIGFzIGtleXMgYW5kIGFtb3VudHMgYXMgdmFsdWVzLiBUaGVzZSBhbW91bnRzIGFyZSB0aGUgcmVhbGxvY2F0aW9uXG4gKiB0byBiZSBnaXZlbiB0byBhIHVzZXIuXG4gKi9cbmZ1bmN0aW9uIGlzT2ZmZXJTYWZlKHByb3Bvc2FsLGFsbG9jYXRpb24pe1xucmV0dXJuKFxuc2F0aXNmaWVzR2l2ZShwcm9wb3NhbCxhbGxvY2F0aW9uKT4wfHxcbnNhdGlzZmllc1dhbnQocHJvcG9zYWwsYWxsb2NhdGlvbik+MCk7XG5cbiB9XG5cbmhhcmRlbihpc09mZmVyU2FmZSk7XG5oYXJkZW4oc2F0aXNmaWVzV2FudCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsic2F0aXNmaWVzV2FudCI6WyJzYXRpc2ZpZXNXYW50Il0sImlzT2ZmZXJTYWZlIjpbImlzT2ZmZXJTYWZlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAABYcS6czEQAAMxEAADAAAABAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9pbnN0YW5jZVJlY29yZFN0b3JhZ2UuanN7ImltcG9ydHMiOlsiQGFnb3JpYy92YXQtZGF0YSIsIi4vY2xlYW5Qcm9wb3NhbC5qcyIsIi4vdHlwZUd1YXJkcy5qcyJdLCJleHBvcnRzIjpbIm1ha2VJbnN0YW5jZVJlY29yZFN0b3JhZ2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgcHJvdmlkZSxwcmVwYXJlRXhvQ2xhc3MsTSxhc3NlcnRLZXl3b3JkTmFtZSxCcmFuZEtleXdvcmRSZWNvcmRTaGFwZSxJbnN0YWxsYXRpb25TaGFwZSxJbnN0YW5jZVJlY29yZFNoYXBlLElzc3VlcktleXdvcmRSZWNvcmRTaGFwZSxJc3N1ZXJSZWNvcmRTaGFwZSxLZXl3b3JkU2hhcGUsVGVybXNTaGFwZTskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJwcm92aWRlXCIsIFskaOKAjV9hID0+IChwcm92aWRlID0gJGjigI1fYSldXSxbXCJwcmVwYXJlRXhvQ2xhc3NcIiwgWyRo4oCNX2EgPT4gKHByZXBhcmVFeG9DbGFzcyA9ICRo4oCNX2EpXV0sW1wiTVwiLCBbJGjigI1fYSA9PiAoTSA9ICRo4oCNX2EpXV1dXSxbXCIuL2NsZWFuUHJvcG9zYWwuanNcIiwgW1tcImFzc2VydEtleXdvcmROYW1lXCIsIFskaOKAjV9hID0+IChhc3NlcnRLZXl3b3JkTmFtZSA9ICRo4oCNX2EpXV1dXSxbXCIuL3R5cGVHdWFyZHMuanNcIiwgW1tcIkJyYW5kS2V5d29yZFJlY29yZFNoYXBlXCIsIFskaOKAjV9hID0+IChCcmFuZEtleXdvcmRSZWNvcmRTaGFwZSA9ICRo4oCNX2EpXV0sW1wiSW5zdGFsbGF0aW9uU2hhcGVcIiwgWyRo4oCNX2EgPT4gKEluc3RhbGxhdGlvblNoYXBlID0gJGjigI1fYSldXSxbXCJJbnN0YW5jZVJlY29yZFNoYXBlXCIsIFskaOKAjV9hID0+IChJbnN0YW5jZVJlY29yZFNoYXBlID0gJGjigI1fYSldXSxbXCJJc3N1ZXJLZXl3b3JkUmVjb3JkU2hhcGVcIiwgWyRo4oCNX2EgPT4gKElzc3VlcktleXdvcmRSZWNvcmRTaGFwZSA9ICRo4oCNX2EpXV0sW1wiSXNzdWVyUmVjb3JkU2hhcGVcIiwgWyRo4oCNX2EgPT4gKElzc3VlclJlY29yZFNoYXBlID0gJGjigI1fYSldXSxbXCJLZXl3b3JkU2hhcGVcIiwgWyRo4oCNX2EgPT4gKEtleXdvcmRTaGFwZSA9ICRo4oCNX2EpXV0sW1wiVGVybXNTaGFwZVwiLCBbJGjigI1fYSA9PiAoVGVybXNTaGFwZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5cbmNvbnN0e3F1b3RlOnEsRmFpbH09YXNzZXJ0O1xuXG4vKipcbiAqIFRoZSBJbnN0YW5jZVJlY29yZCBzdG9yZXMgdGhlIGluc3RhbGxhdGlvbiwgY3VzdG9tVGVybXMsIGlzc3VlcnMsXG4gKiBhbmQgYnJhbmRzIGZvciBhIHBhcnRpY3VsYXIgWm9lIGNvbnRyYWN0IGluc3RhbmNlLiBUaGUgaW5zdGFsbGF0aW9uXG4gKiBhbmQgY3VzdG9tVGVybXMgYXJlIG5ldmVyIGNoYW5nZWQsIGJ1dCBuZXcgaXNzdWVycyAoYW5kIHRoZWlyXG4gKiBtYXRjaGluZyBicmFuZHMpIG1heSBiZSBhZGRlZCBieSB0aGUgY29udHJhY3QgY29kZS4gVGh1cywgYW5cbiAqIEluc3RhbmNlUmVjb3JkIG1heSBiZSBvdXRkYXRlZCBhdCBhbnkgcGFydGljdWxhciBwb2ludC4gVGhpcyBjbGFzc1xuICogbWFuYWdlcyB0aGUgY3JlYXRpb24gYW5kIHVwZGF0aW5nIG9mIGFuIEluc3RhbmNlUmVjb3JkIGFuZCBwcm92aWRlc1xuICogZnVuY3Rpb25zIGZvciBnZXR0aW5nIHRoZSBsYXRlc3QgZGF0YS5cbiAqL1xuXG4vKipcbiAqIEBwYXJhbSB7WGltcG9ydCgnQGFnb3JpYy92YXQtZGF0YScpLkJhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEByZXR1cm5zIHsoaXI6IEluc3RhbmNlUmVjb3JkKSA9PiBJbnN0YW5jZVN0YXRlfVxuICovXG5jb25zdCAgICAgICAgbWFrZUluc3RhbmNlUmVjb3JkU3RvcmFnZT0oYmFnZ2FnZSk9PntcbnByb3ZpZGUoYmFnZ2FnZSwnaW5zdGFuY2VSZWNvcmQnLCgpPT51bmRlZmluZWQpO1xuXG5jb25zdCBhc3NlcnRJbnN0YW50aWF0ZWQ9KGluc3RhbmNlUmVjb3JkKT0+e1xuaW5zdGFuY2VSZWNvcmQhPT0ndW5kZWZpbmVkJ3x8XG5GYWlsIGBpbnN0YW5jZVJlY29yZCBoYXMgbm90IGJlZW4gaW5zdGFudGlhdGVkYDtcbiB9O1xuXG5jb25zdCBJbnN0YW5jZVJlY29yZEk9TS5pbnRlcmZhY2UoJ0luc3RhbmNlUmVjb3JkJyx7XG5hZGRJc3N1ZXI6TS5jYWxsKEtleXdvcmRTaGFwZSxJc3N1ZXJSZWNvcmRTaGFwZSkucmV0dXJucygpLFxuZ2V0SW5zdGFuY2VSZWNvcmQ6TS5jYWxsKCkucmV0dXJucyhJbnN0YW5jZVJlY29yZFNoYXBlKSxcbmdldFRlcm1zOk0uY2FsbCgpLnJldHVybnMoTS5zcGxpdFJlY29yZChUZXJtc1NoYXBlKSksXG5nZXRJbnN0YWxsYXRpb246TS5jYWxsKCkucmV0dXJucyhJbnN0YWxsYXRpb25TaGFwZSksXG5nZXRJc3N1ZXJzOk0uY2FsbCgpLnJldHVybnMoSXNzdWVyS2V5d29yZFJlY29yZFNoYXBlKSxcbmdldEJyYW5kczpNLmNhbGwoKS5yZXR1cm5zKEJyYW5kS2V5d29yZFJlY29yZFNoYXBlKSxcbmFzc2VydFVuaXF1ZUtleXdvcmQ6TS5jYWxsKEtleXdvcmRTaGFwZSkucmV0dXJucygpfSk7XG5cblxuY29uc3QgbWFrZUluc3RhbmNlUmVjb3JkPXByZXBhcmVFeG9DbGFzcyhcbmJhZ2dhZ2UsXG4nSW5zdGFuY2VSZWNvcmQnLFxuSW5zdGFuY2VSZWNvcmRJLFxuKHJlY29yZCk9PmhhcmRlbih7aW5zdGFuY2VSZWNvcmQ6cmVjb3JkfSksXG57XG5hZGRJc3N1ZXIoa2V5d29yZCxpc3N1ZXJSZWNvcmQpe1xuY29uc3R7c3RhdGV9PXRoaXM7XG4hb3duS2V5cyhpc3N1ZXJSZWNvcmQpLmluY2x1ZGVzKGtleXdvcmQpfHxcbkZhaWwgYGNvbmZsaWN0aW5nIGRlZmluaXRpb24gb2YgJHtxKGtleXdvcmQpfWA7XG5cbmFzc2VydEluc3RhbnRpYXRlZChzdGF0ZS5pbnN0YW5jZVJlY29yZCk7XG5jb25zdCBpbnN0YW5jZVJlY29yZD1zdGF0ZS5pbnN0YW5jZVJlY29yZDtcbmNvbnN0IG5leHRJbnN0YW5jZVJlY29yZD1oYXJkZW4oe1xuLi4uaW5zdGFuY2VSZWNvcmQsXG50ZXJtczp7XG4uLi5pbnN0YW5jZVJlY29yZC50ZXJtcyxcbmlzc3VlcnM6e1xuLi4uaW5zdGFuY2VSZWNvcmQudGVybXMuaXNzdWVycyxcbltrZXl3b3JkXTppc3N1ZXJSZWNvcmQuaXNzdWVyfSxcblxuYnJhbmRzOntcbi4uLmluc3RhbmNlUmVjb3JkLnRlcm1zLmJyYW5kcyxcbltrZXl3b3JkXTppc3N1ZXJSZWNvcmQuYnJhbmR9fX0pO1xuXG5cblxuc3RhdGUuaW5zdGFuY2VSZWNvcmQ9bmV4dEluc3RhbmNlUmVjb3JkO1xuIH0sXG5nZXRJbnN0YW5jZVJlY29yZCgpe1xuY29uc3R7c3RhdGV9PXRoaXM7XG5hc3NlcnRJbnN0YW50aWF0ZWQoc3RhdGUuaW5zdGFuY2VSZWNvcmQpO1xucmV0dXJuIHN0YXRlLmluc3RhbmNlUmVjb3JkO1xuIH0sXG5nZXRUZXJtcygpe1xuY29uc3R7c3RhdGV9PXRoaXM7XG5hc3NlcnRJbnN0YW50aWF0ZWQoc3RhdGUuaW5zdGFuY2VSZWNvcmQpO1xucmV0dXJuIHN0YXRlLmluc3RhbmNlUmVjb3JkLnRlcm1zO1xuIH0sXG5nZXRJbnN0YWxsYXRpb24oKXtcbmNvbnN0e3N0YXRlfT10aGlzO1xuYXNzZXJ0SW5zdGFudGlhdGVkKHN0YXRlLmluc3RhbmNlUmVjb3JkKTtcbnJldHVybiBzdGF0ZS5pbnN0YW5jZVJlY29yZC5pbnN0YWxsYXRpb247XG4gfSxcbmdldElzc3VlcnMoKXtcbmNvbnN0e3N0YXRlfT10aGlzO1xuYXNzZXJ0SW5zdGFudGlhdGVkKHN0YXRlLmluc3RhbmNlUmVjb3JkKTtcbnJldHVybiBzdGF0ZS5pbnN0YW5jZVJlY29yZC50ZXJtcy5pc3N1ZXJzO1xuIH0sXG5nZXRCcmFuZHMoKXtcbmNvbnN0e3N0YXRlfT10aGlzO1xuYXNzZXJ0SW5zdGFudGlhdGVkKHN0YXRlLmluc3RhbmNlUmVjb3JkKTtcbnJldHVybiBzdGF0ZS5pbnN0YW5jZVJlY29yZC50ZXJtcy5icmFuZHM7XG4gfSxcbmFzc2VydFVuaXF1ZUtleXdvcmQoa2V5d29yZCl7XG5jb25zdHtzdGF0ZX09dGhpcztcbmFzc2VydEluc3RhbnRpYXRlZChzdGF0ZS5pbnN0YW5jZVJlY29yZCk7XG5hc3NlcnRLZXl3b3JkTmFtZShrZXl3b3JkKTtcbiFvd25LZXlzKHN0YXRlLmluc3RhbmNlUmVjb3JkLnRlcm1zLmlzc3VlcnMpLmluY2x1ZGVzKGtleXdvcmQpfHxcbkZhaWwgYGtleXdvcmQgJHtxKGtleXdvcmQpfSBtdXN0IGJlIHVuaXF1ZWA7XG4gfX0pO1xuXG5cblxucmV0dXJuIG1ha2VJbnN0YW5jZVJlY29yZDtcbiB9OyRo4oCNX29uY2UubWFrZUluc3RhbmNlUmVjb3JkU3RvcmFnZShtYWtlSW5zdGFuY2VSZWNvcmRTdG9yYWdlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlSW5zdGFuY2VSZWNvcmRTdG9yYWdlIjpbIm1ha2VJbnN0YW5jZVJlY29yZFN0b3JhZ2UiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAApEoLv/YnAAD2JwAAKQAAAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL2ludGVybmFsLXR5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyogQGplc3NpZS1jaGVjayovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU2VhdERhdGFcbiAqIEBwcm9wZXJ0eSB7UHJvcG9zYWxSZWNvcmR9IHByb3Bvc2FsXG4gKiBAcHJvcGVydHkge0FsbG9jYXRpb259IGluaXRpYWxBbGxvY2F0aW9uXG4gKiBAcHJvcGVydHkge1NlYXRIYW5kbGV9IHNlYXRIYW5kbGVcbiAqIEBwcm9wZXJ0eSB7b2JqZWN0fSBbb2ZmZXJBcmdzXVxuICovXG5cbi8qKlxuICogR2l2ZW4gYW4gYWxsb2NhdGlvbiwgd2l0aGRyYXcgcGF5bWVudHMgdG8gY3JlYXRlIGEgcGF5b3V0XG4gKlxuICogQGNhbGxiYWNrIFdpdGhkcmF3UGF5bWVudHNcbiAqIEBwYXJhbSB7QWxsb2NhdGlvbn0gYWxsb2NhdGlvblxuICogQHJldHVybnMge1BheW1lbnRQS2V5d29yZFJlY29yZH1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFdpdGhkcmF3RmFjZXRcbiAqIEBwcm9wZXJ0eSB7KGFsbG9jYXRpb246QWxsb2NhdGlvbikgPT4gUGF5bWVudFBLZXl3b3JkUmVjb3JkfSB3aXRoZHJhd1BheW1lbnRzXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBJbnN0YW5jZUFkbWluSGVscGVyXG4gKiBAcHJvcGVydHkgeyh6b2VTZWF0QWRtaW46IFpvZVNlYXRBZG1pbikgPT4gdm9pZH0gZXhpdFpvZVNlYXRBZG1pblxuICogQHByb3BlcnR5IHsoem9lU2VhdEFkbWluOiBab2VTZWF0QWRtaW4pID0+IGJvb2xlYW59IGhhc0V4aXRlZFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gWm9lU2VhdEFkbWluS2l0XG4gKiBAcHJvcGVydHkge1VzZXJTZWF0fSB1c2VyU2VhdFxuICogQHByb3BlcnR5IHtab2VTZWF0QWRtaW59IHpvZVNlYXRBZG1pblxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIE1ha2Vab2VTZWF0QWRtaW5LaXRcbiAqIE1ha2UgdGhlIFpvZSBzZWF0IGFkbWluLCB1c2VyIHNlYXQgYW5kIGEgbm90aWZpZXJcbiAqIEBwYXJhbSB7QWxsb2NhdGlvbn0gaW5pdGlhbEFsbG9jYXRpb25cbiAqIEBwYXJhbSB7SW5zdGFuY2VBZG1pbkhlbHBlcn0gaW5zdGFuY2VBZG1pbkhlbHBlclxuICogQHBhcmFtIHtQcm9wb3NhbFJlY29yZH0gcHJvcG9zYWxcbiAqIEBwYXJhbSB7V2l0aGRyYXdGYWNldH0gd2l0aGRyYXdGYWNldFxuICogQHBhcmFtIHtFUmVmPEV4aXRPYmo+fSBleGl0T2JqXG4gKiBAcGFyYW0ge0VSZWY8dW5rbm93bj59IFtvZmZlclJlc3VsdF1cbiAqIEBwYXJhbSB7WGltcG9ydCgnQGFnb3JpYy92YXQtZGF0YScpLkJhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEByZXR1cm5zIHtab2VTZWF0QWRtaW5LaXR9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgWm9lU2VhdEFkbWluRXhpdFxuICogQHBhcmFtIHtDb21wbGV0aW9ufSBbY29tcGxldGlvbl1cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gWm9lU2VhdEFkbWluXG4gKiBAcHJvcGVydHkgeyhhbGxvY2F0aW9uOiBBbGxvY2F0aW9uKSA9PiB2b2lkfSByZXBsYWNlQWxsb2NhdGlvblxuICogQHByb3BlcnR5IHtab2VTZWF0QWRtaW5FeGl0fSBleGl0XG4gKiBAcHJvcGVydHkge1NodXRkb3duV2l0aEZhaWx1cmV9IGZhaWwgY2FsbGVkIHdpdGggdGhlIHJlYXNvblxuICogZm9yIGNhbGxpbmcgZmFpbCBvbiB0aGlzIHNlYXQsIHdoZXJlIHJlYXNvbiBpcyBub3JtYWxseSBhbiBpbnN0YW5jZW9mIEVycm9yLlxuICogQHByb3BlcnR5IHsoKSA9PiBTdWJzY3JpYmVyPEFtb3VudEtleXdvcmRSZWNvcmQ+fSBnZXRFeGl0U3Vic2NyaWJlclxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIHsoYnJhbmQ6IEJyYW5kKSA9PiBBc3NldEtpbmR9IEdldEFzc2V0S2luZFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gSGFuZGxlT2ZmZXJSZXN1bHRcbiAqIEBwcm9wZXJ0eSB7UHJvbWlzZTx1bmtub3duPn0gb2ZmZXJSZXN1bHRQcm9taXNlXG4gKiBAcHJvcGVydHkge0V4aXRPYmp9IGV4aXRPYmpcbiAqL1xuXG4vKipcbiAqIFRoZSBzZWF0SGFuZGxlIG1heSBiZSBjcmVhdGVkIGluIGVpdGhlciB0aGUgWm9lIG9yIFpDRiB2YXQsXG4gKiBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgc2VhdCBjb21lcyBmcm9tIGEgbm9ybWFsIG9mZmVyIG9yIGFcbiAqIHJlcXVlc3QgYnkgdGhlIGNvbnRyYWN0IGZvciBhbiBcImVtcHR5XCIgc2VhdC5cbiAqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBJbnN0YW5jZUFkbWluXG4gKiBAcHJvcGVydHkgeygpID0+IHZvaWR9IGFzc2VydEFjY2VwdGluZ09mZmVyc1xuICogQHByb3BlcnR5IHsoaW52aXRhdGlvbkhhbmRsZTogSW52aXRhdGlvbkhhbmRsZSxcbiAqICAgICBpbml0aWFsQWxsb2NhdGlvbjogQWxsb2NhdGlvbixcbiAqICAgICBwcm9wb3NhbDogUHJvcG9zYWxSZWNvcmQsXG4gKiAgICAgb2ZmZXJBcmdzPzogb2JqZWN0LFxuICogKSA9PiBVc2VyU2VhdCB9IG1ha2VVc2VyU2VhdFxuICogQHByb3BlcnR5IHtNYWtlTm9Fc2Nyb3dTZWF0fSBtYWtlTm9Fc2Nyb3dTZWF0XG4gKiBAcHJvcGVydHkgeygpID0+IEluc3RhbmNlfSBnZXRJbnN0YW5jZVxuICogQHByb3BlcnR5IHsoKSA9PiBvYmplY3R9IGdldFB1YmxpY0ZhY2V0XG4gKiBAcHJvcGVydHkgeygpID0+IElzc3VlcktleXdvcmRSZWNvcmR9IGdldElzc3VlcnNcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gQnJhbmRLZXl3b3JkUmVjb3JkfSBnZXRCcmFuZHNcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gb2JqZWN0fSBnZXRUZXJtc1xuICogQHByb3BlcnR5IHsoKSA9PiBzdHJpbmdbXX0gZ2V0T2ZmZXJGaWx0ZXJcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gSW5zdGFsbGF0aW9ufSBnZXRJbnN0YWxsYXRpb25cbiAqIEBwcm9wZXJ0eSB7KGNvbXBsZXRpb246IENvbXBsZXRpb24pID0+IHZvaWR9IGV4aXRBbGxTZWF0c1xuICogQHByb3BlcnR5IHtTaHV0ZG93bldpdGhGYWlsdXJlfSBmYWlsQWxsU2VhdHNcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gdm9pZH0gc3RvcEFjY2VwdGluZ09mZmVyc1xuICogQHByb3BlcnR5IHsoc3RyaW5nOiBzdHJpbmcpID0+IGJvb2xlYW59IGlzQmxvY2tlZFxuICogQHByb3BlcnR5IHsoaGFuZGxlT2ZmZXJPYmo6IEhhbmRsZU9mZmVyT2JqLCBwdWJsaWNGYWNldDogdW5rbm93bikgPT4gdm9pZH0gaW5pdERlbGF5ZWRTdGF0ZVxuICogQHByb3BlcnR5IHsoc3RyaW5nczogc3RyaW5nW10pID0+IHZvaWR9IHNldE9mZmVyRmlsdGVyXG4gKi9cblxuLyoqXG4gKiBUaGUgc2VhdEhhbmRsZSBtYXkgYmUgY3JlYXRlZCBpbiBlaXRoZXIgdGhlIFpvZSBvciBaQ0YgdmF0LFxuICogZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIHNlYXQgY29tZXMgZnJvbSBhIG5vcm1hbCBvZmZlciBvciBhXG4gKiByZXF1ZXN0IGJ5IHRoZSBjb250cmFjdCBmb3IgYW4gXCJlbXB0eVwiIHNlYXQuXG4gKlxuICogQHR5cGVkZWYge29iamVjdH0gSGFuZGxlT2ZmZXJPYmpcbiAqIEBwcm9wZXJ0eSB7KGludml0YXRpb25IYW5kbGU6IEludml0YXRpb25IYW5kbGUsXG4gKiAgICAgICAgICAgICBzZWF0RGF0YTogU2VhdERhdGEsXG4gKiAgICAgICAgICAgICkgPT4gSGFuZGxlT2ZmZXJSZXN1bHR9IGhhbmRsZU9mZmVyXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgWm9lSW5zdGFuY2VBZG1pbk1ha2VJbnZpdGF0aW9uXG4gKiBAcGFyYW0ge0ludml0YXRpb25IYW5kbGV9IGludml0YXRpb25IYW5kbGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBkZXNjcmlwdGlvblxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBbY3VzdG9tRGV0YWlsc11cbiAqIEBwYXJhbSB7UGF0dGVybn0gW3Byb3Bvc2FsU2hhcGVdXG4gKiBAcmV0dXJucyB7SW52aXRhdGlvbn1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFpvZUluc3RhbmNlQWRtaW5cbiAqIEBwcm9wZXJ0eSB7Wm9lSW5zdGFuY2VBZG1pbk1ha2VJbnZpdGF0aW9ufSBtYWtlSW52aXRhdGlvblxuICogQHByb3BlcnR5IHsoaXNzdWVyUDogRVJlZjxJc3N1ZXI+LFxuICogICAgICAgICAgICAga2V5d29yZDogS2V5d29yZFxuICogICAgICAgICAgICApID0+IFByb21pc2U8SXNzdWVyUmVjb3JkPn0gc2F2ZUlzc3VlclxuICogQHByb3BlcnR5IHtNYWtlWm9lTWludH0gbWFrZVpvZU1pbnRcbiAqIEBwcm9wZXJ0eSB7UmVnaXN0ZXJGZWVNaW50fSByZWdpc3RlckZlZU1pbnRcbiAqIEBwcm9wZXJ0eSB7TWFrZU5vRXNjcm93U2VhdH0gbWFrZU5vRXNjcm93U2VhdFxuICogQHByb3BlcnR5IHtSZXBsYWNlQWxsb2NhdGlvbnN9IHJlcGxhY2VBbGxvY2F0aW9uc1xuICogQHByb3BlcnR5IHsoY29tcGxldGlvbjogQ29tcGxldGlvbikgPT4gdm9pZH0gZXhpdEFsbFNlYXRzXG4gKiBAcHJvcGVydHkge1NodXRkb3duV2l0aEZhaWx1cmV9IGZhaWxBbGxTZWF0c1xuICogQHByb3BlcnR5IHsoc2VhdEhhbmRsZTogU2VhdEhhbmRsZSwgY29tcGxldGlvbjogQ29tcGxldGlvbikgPT4gdm9pZH0gZXhpdFNlYXRcbiAqIEBwcm9wZXJ0eSB7KHNlYXRIYW5kbGU6IFNlYXRIYW5kbGUsIHJlYXNvbjogRXJyb3IpID0+IHZvaWR9IGZhaWxTZWF0XG4gKiBAcHJvcGVydHkgeygpID0+IHZvaWR9IHN0b3BBY2NlcHRpbmdPZmZlcnNcbiAqIEBwcm9wZXJ0eSB7KHN0cmluZ3M6IEFycmF5PHN0cmluZz4pID0+IHZvaWR9IHNldE9mZmVyRmlsdGVyXG4gKiBAcHJvcGVydHkgeygpID0+IEFycmF5PHN0cmluZz59IGdldE9mZmVyRmlsdGVyXG4gKiBAcHJvcGVydHkgeyhzZWF0SGFuZGxlOiBTZWF0SGFuZGxlKSA9PiBTdWJzY3JpYmVyPEFtb3VudEtleXdvcmRSZWNvcmQ+fSBnZXRFeGl0U3Vic2NyaWJlclxuICogQHByb3BlcnR5IHsoKSA9PiB2b2lkfSByZXBhaXJDb250cmFjdENvbXBsZXRpb25XYXRjaGVyXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgUmVnaXN0ZXJGZWVNaW50XG4gKiBAcGFyYW0ge0tleXdvcmR9IGtleXdvcmQgLSB0aGUga2V5d29yZCB0byB1c2UgZm9yIHRoZSBpc3N1ZXJcbiAqIEBwYXJhbSB7RmVlTWludEFjY2Vzc30gYWxsZWdlZEZlZU1pbnRBY2Nlc3MgLSBhbiBvYmplY3QgdGhhdFxuICogcHVycG9ydHMgdG8gYmUgdGhlIG9iamVjdCB0aGF0IGFsbG93cyBhY2Nlc3MgdG8gdGhlIGZlZU1pbnRcbiAqIEByZXR1cm5zIHtab2VNaW50PCduYXQnPn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBXcmFwSXNzdWVyS2l0V2l0aFpvZU1pbnRcbiAqIEBwYXJhbSB7S2V5d29yZH0ga2V5d29yZCAtIHRoZSBrZXl3b3JkIHRvIHVzZSBmb3IgdGhlIGlzc3VlclxuICogQHBhcmFtIHtJc3N1ZXJLaXR9IGxvY2FsSXNzdWVyS2l0IC0gYW4gaXNzdWVyIGtpdCB0aGF0IG9yaWdpbmF0ZXNcbiAqIHdpdGhpbiBab2VcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBNYWtlWm9lTWludFxuICogQHBhcmFtIHtLZXl3b3JkfSBrZXl3b3JkXG4gKiBAcGFyYW0ge0Fzc2V0S2luZH0gW2Fzc2V0S2luZF1cbiAqIEBwYXJhbSB7QWRkaXRpb25hbERpc3BsYXlJbmZvfSBbZGlzcGxheUluZm9dXG4gKiBAcGFyYW0ge0lzc3Vlck9wdGlvbnNSZWNvcmR9IFtvcHRpb25zXVxuICogQHJldHVybnMge1pvZU1pbnR9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgTWFrZU5vRXNjcm93U2VhdFxuICogQHBhcmFtIHtBbGxvY2F0aW9ufSBpbml0aWFsQWxsb2NhdGlvblxuICogQHBhcmFtIHtQcm9wb3NhbFJlY29yZH0gcHJvcG9zYWxcbiAqIEBwYXJhbSB7RXhpdE9ian0gZXhpdE9ialxuICogQHBhcmFtIHtTZWF0SGFuZGxlfSBzZWF0SGFuZGxlXG4gKiBAcmV0dXJucyB7VXNlclNlYXR9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgUmVwbGFjZUFsbG9jYXRpb25zXG4gKiBAcGFyYW0ge1NlYXRIYW5kbGVBbGxvY2F0aW9uW119IHNlYXRIYW5kbGVBbGxvY2F0aW9uc1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU2VhdEhhbmRsZUFsbG9jYXRpb25cbiAqIEBwcm9wZXJ0eSB7U2VhdEhhbmRsZX0gc2VhdEhhbmRsZVxuICogQHByb3BlcnR5IHtBbGxvY2F0aW9ufSBhbGxvY2F0aW9uXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHR5cGVkZWYge29iamVjdH0gWm9lTWludFxuICogQHByb3BlcnR5IHsoKSA9PiBJc3N1ZXJSZWNvcmQ8Sz59IGdldElzc3VlclJlY29yZFxuICogQHByb3BlcnR5IHsodG90YWxUb01pbnQ6IEFtb3VudDxLPikgPT4gdm9pZH0gbWludEFuZEVzY3Jvd1xuICogQHByb3BlcnR5IHsodG90YWxUb0J1cm46IEFtb3VudDxLPikgPT4gdm9pZH0gd2l0aGRyYXdBbmRCdXJuXG4gKiBOb3RlIHRoYXQgdGhlIGJ1cm5pbmcgaXMgYXN5bmNocm9ub3VzLCBhbmQgc28gbWF5IG5vdCBoYXZlIGhhcHBlbmVkIGJ5XG4gKiB0aGUgdGltZSB3aXRoZHJhd0FuZEJ1cm4gcmV0dXJucy4gV2UgcmVseSBvbiBvdXIgb3RoZXIgYm9va2tlZXBpbmcgc28gdGhhdFxuICogdGhlc2UgYXNzZXRzIGFyZSBhc3N1bWVkIGJ1cm5lZCBlbHNld2hlcmUsIHNvIG5vIG9uZSB3aWxsIHRyeSB0byBhY2Nlc3NcbiAqIHRoZW0gZXZlbiBiZWZvcmUgdGhleSBhcmUgYWN0dWFsbHkgYnVybmVkLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gWkNGUm9vdFxuICogQHByb3BlcnR5IHtTdGFydFpjZn0gc3RhcnRaY2ZcbiAqIEBwcm9wZXJ0eSB7UmVzdGFydENvbnRyYWN0fSByZXN0YXJ0Q29udHJhY3RcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEV4ZWN1dGVDb250cmFjdFJlc3VsdFxuICogQHByb3BlcnR5IHtvYmplY3R9IGNyZWF0b3JGYWNldFxuICogQHByb3BlcnR5IHtQcm9taXNlPEludml0YXRpb24+fSBbY3JlYXRvckludml0YXRpb25dXG4gKiBAcHJvcGVydHkge29iamVjdH0gcHVibGljRmFjZXRcbiAqIEBwcm9wZXJ0eSB7SGFuZGxlT2ZmZXJPYmp9IGhhbmRsZU9mZmVyT2JqXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgU3RhcnRaY2ZcbiAqIEBwYXJhbSB7RVJlZjxab2VJbnN0YW5jZUFkbWluPn0gem9lSW5zdGFuY2VBZG1pblxuICogQHBhcmFtIHtJbnN0YW5jZVJlY29yZH0gaW5zdGFuY2VSZWNvcmRGcm9tWm9lXG4gKiBAcGFyYW0ge0lzc3VlclJlY29yZHN9IGlzc3VlclN0b3JhZ2VGcm9tWm9lXG4gKiBAcGFyYW0ge29iamVjdH0gW3ByaXZhdGVBcmdzXVxuICogQHJldHVybnMge1Byb21pc2U8RXhlY3V0ZUNvbnRyYWN0UmVzdWx0Pn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBSZXN0YXJ0Q29udHJhY3RcbiAqIEBwYXJhbSB7b2JqZWN0fSBbcHJpdmF0ZUFyZ3NdXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxFeGVjdXRlVXBncmFkZWFibGVDb250cmFjdFJlc3VsdD59XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgTWFrZUV4aXRPYmpcbiAqIEBwYXJhbSB7UHJvcG9zYWxSZWNvcmR9IHByb3Bvc2FsXG4gKiBAcGFyYW0ge1pDRlNlYXR9IHpvZVNlYXRBZG1pblxuICogQHJldHVybnMge0V4aXRPYmp9XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBFeGl0T2JqXG4gKiBAcHJvcGVydHkgeygpID0+IHZvaWR9IGV4aXRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtIYW5kbGU8J1NlYXQnPn0gU2VhdEhhbmRsZVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEdldEFzc2V0S2luZEJ5QnJhbmRcbiAqIEdldCB0aGUgYXNzZXRLaW5kIGZvciBhIGJyYW5kIGtub3duIGJ5IFpvZVxuICpcbiAqIFRvIGJlIGRlbGV0ZWQgd2hlbiBicmFuZHMgaGF2ZSBhIHByb3BlcnR5IGZvciBhc3NldEtpbmRcbiAqXG4gKiBAcGFyYW0ge0JyYW5kfSBicmFuZFxuICogQHJldHVybnMge0Fzc2V0S2luZH1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtBcnJheTxJc3N1ZXJSZWNvcmQ+fSBJc3N1ZXJSZWNvcmRzXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgTWFrZVpDRlNlYXRcbiAqIEBwYXJhbSB7U2VhdERhdGF9IHNlYXREYXRhXG4gKiBAcmV0dXJucyB7WkNGU2VhdH1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBEcm9wQWxsUmVmZXJlbmNlc1xuICpcbiAqIERyb3BzIGFsbCBvZiB0aGUgcmVmZXJlbmNlcyBpbiB0aGUgc2VhdC1yZWxhdGVkIHdlYWtTdG9yZXMgYnlcbiAqIGRyb3BwaW5nIHRoZSBzdG9yZXNcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gWmNmU2VhdE1hbmFnZXJcbiAqIEBwcm9wZXJ0eSB7TWFrZVpDRlNlYXR9IG1ha2VaQ0ZTZWF0XG4gKiBAcHJvcGVydHkge1JlYWxsb2NhdGV9IHJlYWxsb2NhdGVcbiAqIEBwcm9wZXJ0eSB7RHJvcEFsbFJlZmVyZW5jZXN9IGRyb3BBbGxSZWZlcmVuY2VzXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBaY2ZNaW50UmVhbGxvY2F0b3JcbiAqIEBwcm9wZXJ0eSB7KHpjZlNlYXQ6IFpDRlNlYXQsIG5ld0FsbG9jYXRpb246IEFsbG9jYXRpb24pID0+IHZvaWR9IHJlYWxsb2NhdGVcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBDcmVhdGVTZWF0TWFuYWdlclxuICpcbiAqIFRoZSBTZWF0TWFuYWdlciBob2xkcyB0aGUgYWN0aXZlIHpjZlNlYXRzIGFuZCBjYW4gcmVhbGxvY2F0ZSBhbmRcbiAqIG1ha2UgbmV3IHpjZlNlYXRzLlxuICpcbiAqIEBwYXJhbSB7RVJlZjxab2VJbnN0YW5jZUFkbWluPn0gem9lSW5zdGFuY2VBZG1pblxuICogQHBhcmFtIHtHZXRBc3NldEtpbmRCeUJyYW5kfSBnZXRBc3NldEtpbmRCeUJyYW5kXG4gKiBAcGFyYW0ge1NodXRkb3duV2l0aEZhaWx1cmV9IHNodXRkb3duV2l0aEZhaWx1cmVcbiAqIEBwYXJhbSB7WGltcG9ydCgnQGFnb3JpYy92YXQtZGF0YScpLkJhZ2dhZ2V9IHpjZkJhZ2dhZ2VcbiAqIEByZXR1cm5zIHt7IHNlYXRNYW5hZ2VyOiBaY2ZTZWF0TWFuYWdlciwgemNmTWludFJlYWxsb2NhdG9yOiBaY2ZNaW50UmVhbGxvY2F0b3IgfX1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBJbnN0YW5jZVN0YXRlQWRkSXNzdWVyXG4gKlxuICogQWRkIGFuIGlzc3VlciBhbmQgaXRzIGtleXdvcmQgdG8gdGhlIGluc3RhbmNlUmVjb3JkIGZvciB0aGVcbiAqIGNvbnRyYWN0IGluc3RhbmNlXG4gKlxuICogQHBhcmFtIHtLZXl3b3JkfSBrZXl3b3JkXG4gKiBAcGFyYW0ge0lzc3VlclJlY29yZH0gaXNzdWVyUmVjb3JkXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBJbnN0YW5jZVN0YXRlR2V0VGVybXNcbiAqIEByZXR1cm5zIHtBbnlUZXJtc31cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBJbnN0YW5jZVN0YXRlR2V0SW5zdGFsbGF0aW9uXG4gKiBAcmV0dXJucyB7SW5zdGFsbGF0aW9ufVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEluc3RhbmNlUmVjb3JkR2V0SXNzdWVyc1xuICogQHJldHVybnMge0lzc3VlcktleXdvcmRSZWNvcmR9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgSW5zdGFuY2VSZWNvcmRHZXRCcmFuZHNcbiAqIEByZXR1cm5zIHtCcmFuZEtleXdvcmRSZWNvcmR9XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBJbnN0YW5jZVN0YXRlXG4gKiBAcHJvcGVydHkge0luc3RhbmNlU3RhdGVBZGRJc3N1ZXJ9IGFkZElzc3VlclxuICogQHByb3BlcnR5IHtHZXRJbnN0YW5jZVJlY29yZH0gZ2V0SW5zdGFuY2VSZWNvcmRcbiAqIEBwcm9wZXJ0eSB7SW5zdGFuY2VTdGF0ZUdldFRlcm1zfSBnZXRUZXJtc1xuICogQHByb3BlcnR5IHtJbnN0YW5jZVN0YXRlR2V0SW5zdGFsbGF0aW9ufSBnZXRJbnN0YWxsYXRpb25cbiAqIEBwcm9wZXJ0eSB7SW5zdGFuY2VSZWNvcmRHZXRJc3N1ZXJzfSBnZXRJc3N1ZXJzXG4gKiBAcHJvcGVydHkge0luc3RhbmNlUmVjb3JkR2V0QnJhbmRzfSBnZXRCcmFuZHNcbiAqIEBwcm9wZXJ0eSB7KGtleXdvcmQ6IEtleXdvcmQpID0+IHZvaWR9IGFzc2VydFVuaXF1ZUtleXdvcmRcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBHZXRJbnN0YW5jZVJlY29yZFxuICogQHJldHVybnMge0luc3RhbmNlUmVjb3JkfVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIElzc3VlclN0b3JhZ2VHZXRJc3N1ZXJSZWNvcmRzXG4gKiBAcGFyYW0ge0lzc3VlcltdfSBpc3N1ZXJzXG4gKiBAcmV0dXJucyB7SXNzdWVyUmVjb3Jkc31cbiAqL1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAmjM+rJgUAACYFAAAnAAAAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvaXNzdWVyUmVjb3JkLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvYXNzZXJ0Il0sImV4cG9ydHMiOlsiYXNzZXJ0RnVsbElzc3VlclJlY29yZCIsIm1ha2VJc3N1ZXJSZWNvcmQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRmFpbDskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL2Fzc2VydFwiLCBbW1wiRmFpbFwiLCBbJGjigI1fYSA9PiAoRmFpbCA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cbi8qKlxuICogUHV0IHRvZ2V0aGVyIGluZm9ybWF0aW9uIGFib3V0IHRoZSBpc3N1ZXIgaW4gYSBzdGFuZGFyZCBmb3JtYXQgdGhhdFxuICogaXMgc3luY2hyb25vdXNseSBhY2Nlc3NpYmxlLlxuICpcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAcGFyYW0ge0JyYW5kPEs+fSBicmFuZFxuICogQHBhcmFtIHtJc3N1ZXI8Sz59IGlzc3VlclxuICogQHBhcmFtIHtEaXNwbGF5SW5mbzxLPn0gZGlzcGxheUluZm9cbiAqIEByZXR1cm5zIHtJc3N1ZXJSZWNvcmQ8Sz59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlSXNzdWVyUmVjb3JkPShicmFuZCxpc3N1ZXIsZGlzcGxheUluZm8pPT5cbmhhcmRlbih7XG5icmFuZCxcbmlzc3VlcixcbmFzc2V0S2luZDpkaXNwbGF5SW5mby5hc3NldEtpbmQsXG5kaXNwbGF5SW5mb30pO1xuXG5cbi8qKlxuICogQHBhcmFtIHtJc3N1ZXJSZWNvcmR9IGlzc3VlclJlY29yZFxuICogQHJldHVybnMge2Fzc2VydHMgaXNzdWVyUmVjb3JkIGlzIFJlcXVpcmVkPElzc3VlclJlY29yZD59XG4gKi8kaOKAjV9vbmNlLm1ha2VJc3N1ZXJSZWNvcmQobWFrZUlzc3VlclJlY29yZCk7XG5jb25zdCAgICAgICAgYXNzZXJ0RnVsbElzc3VlclJlY29yZD0oaXNzdWVyUmVjb3JkKT0+e1xuaWYoIWlzc3VlclJlY29yZC5kaXNwbGF5SW5mbyl7XG50aHJvdyBGYWlsIGBmdWxsIElzc3VlclJlY29yZCByZXF1aXJlcyBkaXNwbGF5SW5mb2A7XG4gfVxuIH07JGjigI1fb25jZS5hc3NlcnRGdWxsSXNzdWVyUmVjb3JkKGFzc2VydEZ1bGxJc3N1ZXJSZWNvcmQpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VJc3N1ZXJSZWNvcmQiOlsibWFrZUlzc3VlclJlY29yZCJdLCJhc3NlcnRGdWxsSXNzdWVyUmVjb3JkIjpbImFzc2VydEZ1bGxJc3N1ZXJSZWNvcmQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAsAHqtUkdAABJHQAAKAAAAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL2lzc3VlclN0b3JhZ2UuanN7ImltcG9ydHMiOlsiQGFnb3JpYy92YXQtZGF0YSIsIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCIuL29iakFycmF5Q29udmVyc2lvbi5qcyIsIi4vY2xlYW5Qcm9wb3NhbC5qcyIsIi4vaXNzdWVyUmVjb3JkLmpzIl0sImV4cG9ydHMiOlsicHJvdmlkZUlzc3VlclN0b3JhZ2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgcHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUsRSxhcnJheVRvT2JqLGNsZWFuS2V5d29yZHMsbWFrZUlzc3VlclJlY29yZDskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZVwiLCBbJGjigI1fYSA9PiAocHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV1dXSxbXCIuL29iakFycmF5Q29udmVyc2lvbi5qc1wiLCBbW1wiYXJyYXlUb09ialwiLCBbJGjigI1fYSA9PiAoYXJyYXlUb09iaiA9ICRo4oCNX2EpXV1dXSxbXCIuL2NsZWFuUHJvcG9zYWwuanNcIiwgW1tcImNsZWFuS2V5d29yZHNcIiwgWyRo4oCNX2EgPT4gKGNsZWFuS2V5d29yZHMgPSAkaOKAjV9hKV1dXV0sW1wiLi9pc3N1ZXJSZWNvcmQuanNcIiwgW1tcIm1ha2VJc3N1ZXJSZWNvcmRcIiwgWyRo4oCNX2EgPT4gKG1ha2VJc3N1ZXJSZWNvcmQgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cbmNvbnN0e0ZhaWx9PWFzc2VydDtcblxuY29uc3QgU1RPUkFHRV9JTlNUQU5USUFURURfS0VZPSdJc3N1ZXJTdG9yYWdlSW5zdGFudGlhdGVkJztcblxuLyoqXG4gKiBNYWtlIHRoZSBJc3N1ZXIgU3RvcmFnZS5cbiAqXG4gKiBAcGFyYW0ge1hpbXBvcnQoJ0BhZ29yaWMvdmF0LWRhdGEnKS5CYWdnYWdlfSB6Y2ZCYWdnYWdlXG4gKi9cbmNvbnN0ICAgICAgICBwcm92aWRlSXNzdWVyU3RvcmFnZT0oemNmQmFnZ2FnZSk9Pntcbi8qKiBAdHlwZSB7V2Vha01hcFN0b3JlPEJyYW5kLElzc3VlclJlY29yZD59ICovXG5jb25zdCBicmFuZFRvSXNzdWVyUmVjb3JkPXByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlKFxuemNmQmFnZ2FnZSxcbidicmFuZFRvSXNzdWVyUmVjb3JkJyk7XG5cbi8qKiBAdHlwZSB7V2Vha01hcFN0b3JlPElzc3VlcixJc3N1ZXJSZWNvcmQ+fSAqL1xuY29uc3QgaXNzdWVyVG9Jc3N1ZXJSZWNvcmQ9cHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUoXG56Y2ZCYWdnYWdlLFxuJ2lzc3VlclRvSXNzdWVyUmVjb3JkJyk7XG5cblxubGV0IGluc3RhbnRpYXRlZD16Y2ZCYWdnYWdlLmhhcyhTVE9SQUdFX0lOU1RBTlRJQVRFRF9LRVkpO1xuY29uc3QgYXNzZXJ0SW5zdGFudGlhdGVkPSgpPT57XG5pbnN0YW50aWF0ZWR8fEZhaWwgYGlzc3VlclN0b3JhZ2UgaGFzIG5vdCBiZWVuIGluc3RhbnRpYXRlZGA7XG4gfTtcblxuLyoqXG4gKiBJZiB3ZSBhbHJlYWR5IGtub3cgdGhlIGVudGlyZSBpc3N1ZXIgcmVjb3JkLCBzdWNoIGFzIGZvciBhXG4gKiBaQ0ZNaW50IGlzc3Vlciwgb3IgZm9yIGFuIGlzc3VlciB0aGF0IFpvZSBoYXMgdG9sZCB1cyBhYm91dCxcbiAqIHN0b3JlIHRoZSBpc3N1ZXJSZWNvcmQgZGlyZWN0bHkuXG4gKlxuICogQSBub3RlIG9uIGNoZWNraW5nIHRoYXQgdGhlIGlzc3VlciBhbmQgYnJhbmQgbWF0Y2g6IEJlY2F1c2Ugb2ZcbiAqIGhvdyB3ZSB1c2UgYHN0b3JlSXNzdWVyUmVjb3JkYCwgdGhlIGlzc3VlciBhbmQgYnJhbmQgaW4gdGhlXG4gKiBgaXNzdWVyUmVjb3JkYCBwYXJhbWV0ZXIgYXJlIGd1YXJhbnRlZWQgdG8gbWF0Y2gsIGFuZCB3ZSBkbyBub3RcbiAqIG5lZWQgdG8gZG8gYW5vdGhlciBhc3luY2hyb25vdXMgY2FsbC5cbiAqXG4gKiBXZSB1c2UgYHN0b3JlSXNzdWVyUmVjb3JkYCBpbiA0IGNhc2VzOiAxKSBab2VNaW50IHJlY29yZHMsIDIpXG4gKiBaQ0ZNaW50IHJlY29yZHMsIDMpIHdpdGhpbiBgc3RvcmVJc3N1ZXJgLCBhbmQgNCkgc3RvcmluZyBhblxuICogaXNzdWVyIHJlY29yZCBpbiBaQ0YgdGhhdCB3ZSBvYnRhaW5lZCBmcm9tIFpvZSB0aGF0IG9yaWdpbmFsbHlcbiAqIHdlbnQgdGhyb3VnaCBgc3RvcmVJc3N1ZXJgLiBJbiBab2VNaW50cyAocmVwYWNrYWdlZCBhcyBaQ0ZNaW50cyksXG4gKiB3ZSBjcmVhdGUgdGhlIGlzc3VlcnMgYW5kIGJyYW5kcyBvdXJzZWx2ZXMgdXNpbmcgRVJUUCBkaXJlY3RseSxcbiAqIHNvIHdlIGtub3cgdGhleSBhcmUgbm90IG1hbGljaW91cyBhbmQgdGhhdCB0aGUgaXNzdWVycyBhbmQgYnJhbmRzXG4gKiBtYXRjaC4gSW4gdGhlIGxhc3QgdHdvIGNhc2VzLCB3ZSBnbyB0aHJvdWdoIHRoZVxuICogYnJhbmQtaXNzdWVyLW1hdGNoIGNoZWNrIGluIGBzdG9yZUlzc3VlcmAuXG4gKlxuICogVGhlIHJlYXNvbiB3aHkgd2UgbmVlZCB0aGUgYGhhc2AgY2hlY2sgYmVsb3cgaXMgZm9yIHRoZSA0dGggY2FzZVxuICogYWJvdmUsIGluIHdoaWNoIHdlIHN0b3JlIGFuIGlzc3VlciByZWNvcmQgaW4gWkNGIHRoYXQgd2Ugb2J0YWluZWRcbiAqIGZyb20gWm9lLiBgV2Vha01hcFN0b3JlLmluaXRgIGVycm9ycyBpZiB0aGUga2V5IGlzIGFscmVhZHkgcHJlc2VudCxcbiAqIGFuZCBiZWNhdXNlIGFuIGlzc3VlciBjYW4gYmUgdXNlZCBtb3JlIHRoYW4gb25jZSBpbiB0aGUgc2FtZVxuICogY29udHJhY3QsIHdlIG5lZWQgdG8gbWFrZSBzdXJlIHdlIGFyZW4ndCB0cnlpbmcgdG8gYGluaXRgIHR3aWNlLlxuICogSWYgdGhlIGlzc3VlciBhbmQgaXRzIHJlY29yZCBhcmUgYWxyZWFkeSBwcmVzZW50LCB3ZSBkbyBub3QgbmVlZFxuICogdG8gYWRkIHRoZSBpc3N1ZXIgYWdhaW4gaW4gWkNGLlxuICpcbiAqXG4gKiBAcGFyYW0ge0lzc3VlclJlY29yZH0gaXNzdWVyUmVjb3JkXG4gKiBAcmV0dXJucyB7SXNzdWVyUmVjb3JkfVxuICovXG5jb25zdCBzdG9yZUlzc3VlclJlY29yZD0oaXNzdWVyUmVjb3JkKT0+e1xuYXNzZXJ0SW5zdGFudGlhdGVkKCk7XG5jb25zdHticmFuZCxpc3N1ZXJ9PWlzc3VlclJlY29yZDtcbmlmKGlzc3VlclRvSXNzdWVyUmVjb3JkLmhhcyhpc3N1ZXIpKXtcbnJldHVybiBpc3N1ZXJUb0lzc3VlclJlY29yZC5nZXQoaXNzdWVyKTtcbiB9XG5cbmJyYW5kVG9Jc3N1ZXJSZWNvcmQuaW5pdChicmFuZCxpc3N1ZXJSZWNvcmQpO1xuaXNzdWVyVG9Jc3N1ZXJSZWNvcmQuaW5pdChpc3N1ZXIsaXNzdWVyUmVjb3JkKTtcbnJldHVybiBpc3N1ZXJUb0lzc3VlclJlY29yZC5nZXQoaXNzdWVyKTtcbiB9O1xuXG5jb25zdCBnZXRCeUJyYW5kPShicmFuZCk9PntcbmFzc2VydEluc3RhbnRpYXRlZCgpO1xucmV0dXJuIGJyYW5kVG9Jc3N1ZXJSZWNvcmQuZ2V0KGJyYW5kKTtcbiB9O1xuXG4vKipcbiAqIElmIHRoZSBpc3N1ZXIgaXMgYWxyZWFkeSBzdG9yZWQsIHJldHVybiB0aGUgaXNzdWVyUmVjb3JkLlxuICogT3RoZXJ3aXNlLCBtYWtlIGFuZCBzYXZlIHRoZSBpc3N1ZXJSZWNvcmQuXG4gKlxuICogQHBhcmFtIHtFUmVmPElzc3Vlcj59IGlzc3VlclBcbiAqIEByZXR1cm5zIHtQcm9taXNlPElzc3VlclJlY29yZD59XG4gKi9cbmNvbnN0IHN0b3JlSXNzdWVyPWFzeW5jKGlzc3VlclApPT57XG5hc3NlcnRJbnN0YW50aWF0ZWQoKTtcbmNvbnN0IGJyYW5kUD1FKGlzc3VlclApLmdldEJyYW5kKCk7XG5jb25zdCBicmFuZElzc3Vlck1hdGNoUD1FKGJyYW5kUCkuaXNNeUlzc3Vlcihpc3N1ZXJQKTtcbmNvbnN0IGRpc3BsYXlJbmZvUD1FKGJyYW5kUCkuZ2V0RGlzcGxheUluZm8oKTtcbi8qKiBAdHlwZSB7W0lzc3VlcixCcmFuZCxib29sZWFuLERpc3BsYXlJbmZvXX0gKi9cbmNvbnN0W2lzc3VlcixicmFuZCxicmFuZElzc3Vlck1hdGNoLGRpc3BsYXlJbmZvXT1hd2FpdCBQcm9taXNlLmFsbChbXG5pc3N1ZXJQLFxuYnJhbmRQLFxuYnJhbmRJc3N1ZXJNYXRjaFAsXG5kaXNwbGF5SW5mb1BdKTtcblxuLyogQVdBSVQgLy8vLy8qL1xuXG5pZihpc3N1ZXJUb0lzc3VlclJlY29yZC5oYXMoaXNzdWVyKSl7XG5yZXR1cm4gaXNzdWVyVG9Jc3N1ZXJSZWNvcmQuZ2V0KGlzc3Vlcik7XG4gfVxuLyogQSBtYWxpY2lvdXMgaXNzdWVyIG1heSB1c2UgYW5vdGhlciBpc3N1ZXIncyB2YWxpZCBicmFuZC4qL1xuLyogVGhlcmVmb3JlLCB3ZSBtdXN0IGNoZWNrIHRoYXQgdGhlIGJyYW5kIHJlY29nbml6ZXMgdGhlIGlzc3VlciovXG4vKiBhcyBpdHMgb3duIGFuZCB2aWNlIHZlcnNhLiBIb3dldmVyLCB3ZSBvbmx5IG5lZWQgdG8gY2hlY2sgdGhpcyovXG4vKiBvbmNlIHBlciBpc3N1ZXIgcGVyIFpvZVNlcnZpY2UsIGFuZCB3ZSBkbyBub3QgbmVlZCB0byBjaGVjayovXG4vKiB0aGlzIGZvciBpc3N1ZXJzIHRoYXQgdGhlIFpvZVNlcnZpY2UgY3JlYXRlcywgc3VjaCBhcyBpc3N1ZXJzKi9cbi8qIG1hZGUgd2l0aCBaQ0ZNaW50cy4qL1xuXG4vKiBJbiB0aGUgY2FzZSBvZiBhIG1hbGljaW91cyBpc3N1ZXIgdXNpbmcgYW5vdGhlciBpc3N1ZXIncyBicmFuZCwqL1xuLyogdGhlIGxpbmUgYmVsb3cgd2lsbCB0aHJvdyBpbiBhbGwgY2FzZXMuIEhvd2V2ZXIsIGluIHRoZSBjYXNlIG9mKi9cbi8qIGEgbWFsaWNpb3VzIGlzc3VlciB1c2luZyBhICptYWxpY2lvdXMqIGJyYW5kLCB0aGUgbWFsaWNpb3VzKi9cbi8qIGlzc3VlciBhbmQgYnJhbmQgbWF5IGNvb3JkaW5hdGUgdG8gY2hhbmdlIHRoZWlyIGFuc3dlcnMuIEF0Ki9cbi8qIHRoaXMgcG9pbnQsIFpvZSBoYXMgZG9uZSBhbGwgaXQgY291bGQuIFpvZSBkb2VzIG5vdCBwcmV2ZW50IG9yKi9cbi8qIGludGVuZCB0byBwcmV2ZW50IGlzc3VlciBtaXNiZWhhdmlvciBpbiBnZW5lcmFsLCBzbyB0aGUgdXNlciovXG4vKiAqbXVzdCogcmVseSBvbiB0aGUgZ29vZCBiZWhhdmlvciBvZiB0aGUgaXNzdWVycyB1c2VkIGluIHRoZSovXG4vKiBzbWFydCBjb250cmFjdHMgdGhleSB1c2UuKi9cbmJyYW5kSXNzdWVyTWF0Y2h8fEZhaWwgYGlzc3VlciB3YXMgdXNpbmcgYSBicmFuZCB3aGljaCB3YXMgbm90IGl0cyBvd25gO1xuY29uc3QgaXNzdWVyUmVjb3JkPW1ha2VJc3N1ZXJSZWNvcmQoYnJhbmQsaXNzdWVyLGRpc3BsYXlJbmZvKTtcbnN0b3JlSXNzdWVyUmVjb3JkKGlzc3VlclJlY29yZCk7XG5yZXR1cm4gZ2V0QnlCcmFuZChicmFuZCk7XG4gfTtcblxuY29uc3Qgc3RvcmVJc3N1ZXJzPShpc3N1ZXJzKT0+e1xuYXNzZXJ0SW5zdGFudGlhdGVkKCk7XG5yZXR1cm4gUHJvbWlzZS5hbGwoaXNzdWVycy5tYXAoc3RvcmVJc3N1ZXIpKTtcbiB9O1xuXG4vKiogQHR5cGUge0dldEFzc2V0S2luZEJ5QnJhbmR9ICovXG5jb25zdCBnZXRBc3NldEtpbmRCeUJyYW5kPShicmFuZCk9PntcbmFzc2VydEluc3RhbnRpYXRlZCgpO1xucmV0dXJuIGdldEJ5QnJhbmQoYnJhbmQpLmFzc2V0S2luZDtcbiB9O1xuXG4vKipcbiAqXG4gKiBAcGFyYW0ge0lzc3VlcktleXdvcmRSZWNvcmR9IHVuY2xlYW5Jc3N1ZXJLZXl3b3JkUmVjb3JkXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx7IGlzc3VlcnM6IElzc3VlcktleXdvcmRSZWNvcmQsXG4gKiAgICAgICAgICAgICAgICAgICAgIGJyYW5kczogQnJhbmRLZXl3b3JkUmVjb3JkIH0+fVxuICovXG5jb25zdCBzdG9yZUlzc3VlcktleXdvcmRSZWNvcmQ9YXN5bmModW5jbGVhbklzc3VlcktleXdvcmRSZWNvcmQpPT57XG5hc3NlcnRJbnN0YW50aWF0ZWQoKTtcbmNvbnN0IGtleXdvcmRzPWNsZWFuS2V5d29yZHModW5jbGVhbklzc3VlcktleXdvcmRSZWNvcmQpO1xuY29uc3QgaXNzdWVyUHM9a2V5d29yZHMubWFwKFxuKGtleXdvcmQpPT51bmNsZWFuSXNzdWVyS2V5d29yZFJlY29yZFtrZXl3b3JkXSk7XG5cbi8qIFRoZSBpc3N1ZXJzIG1heSBub3QgaGF2ZSBiZWVuIHNlZW4gYmVmb3JlLCBzbyB3ZSBtdXN0IHdhaXQgZm9yIHRoZSovXG4vKiBpc3N1ZXIgcmVjb3JkcyB0byBiZSBhdmFpbGFibGUgc3luY2hyb25vdXNseSovXG5jb25zdCBpc3N1ZXJSZWNvcmRzPWF3YWl0IHN0b3JlSXNzdWVycyhpc3N1ZXJQcyk7XG4vKiBBV0FJVCAvLy8qL1xuXG5jb25zdCBpc3N1ZXJzPWFycmF5VG9PYmooXG5pc3N1ZXJSZWNvcmRzLm1hcCgocmVjb3JkKT0+cmVjb3JkLmlzc3VlciksXG5rZXl3b3Jkcyk7XG5cbmNvbnN0IGJyYW5kcz1hcnJheVRvT2JqKFxuaXNzdWVyUmVjb3Jkcy5tYXAoKHJlY29yZCk9PnJlY29yZC5icmFuZCksXG5rZXl3b3Jkcyk7XG5cblxucmV0dXJuIGhhcmRlbih7XG5pc3N1ZXJzLFxuYnJhbmRzfSk7XG5cbiB9O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAcGFyYW0ge0lzc3VlcjxLPn0gaXNzdWVyXG4gKiBAcmV0dXJucyB7QnJhbmQ8Sz59XG4gKi9cbmNvbnN0IGdldEJyYW5kRm9ySXNzdWVyPShpc3N1ZXIpPT57XG5hc3NlcnRJbnN0YW50aWF0ZWQoKTtcbi8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCovXG5yZXR1cm4gaXNzdWVyVG9Jc3N1ZXJSZWNvcmQuZ2V0KGlzc3VlcikuYnJhbmQ7XG4gfTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQHBhcmFtIHtCcmFuZDxLPn0gYnJhbmRcbiAqIEByZXR1cm5zIHtJc3N1ZXI8Sz59XG4gKi9cbmNvbnN0IGdldElzc3VlckZvckJyYW5kPShicmFuZCk9PntcbmFzc2VydEluc3RhbnRpYXRlZCgpO1xuLyogQHRzLWV4cGVjdC1lcnJvciBjYXN0Ki9cbnJldHVybiBicmFuZFRvSXNzdWVyUmVjb3JkLmdldChicmFuZCkuaXNzdWVyO1xuIH07XG5cbi8qKiBAdHlwZSB7SXNzdWVyU3RvcmFnZUdldElzc3VlclJlY29yZHN9ICovXG5jb25zdCBnZXRJc3N1ZXJSZWNvcmRzPShpc3N1ZXJzKT0+e1xuYXNzZXJ0SW5zdGFudGlhdGVkKCk7XG5yZXR1cm4gaXNzdWVycy5tYXAoaXNzdWVyVG9Jc3N1ZXJSZWNvcmQuZ2V0KTtcbiB9O1xuXG5jb25zdCBpbnN0YW50aWF0ZT0oaXNzdWVyUmVjb3Jkcz1bXSk9PntcbmlmKCF6Y2ZCYWdnYWdlLmhhcyhTVE9SQUdFX0lOU1RBTlRJQVRFRF9LRVkpKXtcbnpjZkJhZ2dhZ2UuaW5pdChTVE9SQUdFX0lOU1RBTlRJQVRFRF9LRVksdHJ1ZSk7XG5pbnN0YW50aWF0ZWQ9dHJ1ZTtcbmlzc3VlclJlY29yZHMuZm9yRWFjaChzdG9yZUlzc3VlclJlY29yZCk7XG4gfVxuIH07XG5cbnJldHVybntcbnN0b3JlSXNzdWVyS2V5d29yZFJlY29yZCxcbnN0b3JlSXNzdWVyLFxuc3RvcmVJc3N1ZXJSZWNvcmQsXG5nZXRBc3NldEtpbmRCeUJyYW5kLFxuZ2V0QnJhbmRGb3JJc3N1ZXIsXG5nZXRJc3N1ZXJGb3JCcmFuZCxcbmdldElzc3VlclJlY29yZHMsXG5pbnN0YW50aWF0ZX07XG5cbiB9OyRo4oCNX29uY2UucHJvdmlkZUlzc3VlclN0b3JhZ2UocHJvdmlkZUlzc3VlclN0b3JhZ2UpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InByb3ZpZGVJc3N1ZXJTdG9yYWdlIjpbInByb3ZpZGVJc3N1ZXJTdG9yYWdlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAO+HGwlWCAAAVggAACUAAABAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9tYWtlSGFuZGxlLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvYXNzZXJ0IiwiQGFnb3JpYy9zdG9yZSIsIkBhZ29yaWMvdmF0LWRhdGEiLCIuL3R5cGVHdWFyZHMuanMiXSwiZXhwb3J0cyI6WyJkZWZpbmVEdXJhYmxlSGFuZGxlIiwibWFrZUhhbmRsZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnQsaW5pdEVtcHR5LG1ha2VFeG8scHJlcGFyZUV4b0NsYXNzLEhhbmRsZUk7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9hc3NlcnRcIiwgW1tcImFzc2VydFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0ID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcImluaXRFbXB0eVwiLCBbJGjigI1fYSA9PiAoaW5pdEVtcHR5ID0gJGjigI1fYSldXSxbXCJtYWtlRXhvXCIsIFskaOKAjV9hID0+IChtYWtlRXhvID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvdmF0LWRhdGFcIiwgW1tcInByZXBhcmVFeG9DbGFzc1wiLCBbJGjigI1fYSA9PiAocHJlcGFyZUV4b0NsYXNzID0gJGjigI1fYSldXV1dLFtcIi4vdHlwZUd1YXJkcy5qc1wiLCBbW1wiSGFuZGxlSVwiLCBbJGjigI1fYSA9PiAoSGFuZGxlSSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5jb25zdHtGYWlsfT1hc3NlcnQ7XG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGFnb3JpYy92YXQtZGF0YScpLkJhZ2dhZ2V9IEJhZ2dhZ2UgKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge3N0cmluZ30gSFxuICogQHBhcmFtIHtCYWdnYWdlfSBiYWdnYWdlXG4gKiBAcGFyYW0ge0h9IGhhbmRsZVR5cGVcbiAqIEByZXR1cm5zIHtIIGV4dGVuZHMgJ0luc3RhbmNlJyA/ICgpID0+IEluc3RhbmNlIDogKCkgPT4gSGFuZGxlPEg+fVxuICovXG5jb25zdCAgICAgICAgZGVmaW5lRHVyYWJsZUhhbmRsZT0oYmFnZ2FnZSxoYW5kbGVUeXBlKT0+e1xudHlwZW9mIGhhbmRsZVR5cGU9PT0nc3RyaW5nJ3x8RmFpbCBgaGFuZGxlVHlwZSBtdXN0IGJlIGEgc3RyaW5nYDtcbmNvbnN0IG1ha2VIYW5kbGU9cHJlcGFyZUV4b0NsYXNzKFxuYmFnZ2FnZSxcbiBgJHtoYW5kbGVUeXBlfUhhbmRsZWAsXG5IYW5kbGVJLFxuaW5pdEVtcHR5LFxue30pO1xuXG4vKiBAdHMtZXhwZWN0LWVycm9yIEJpdCBieSBvdXIgb3duIG9wYXF1ZSB0eXBlcy4qL1xucmV0dXJuICgvKiogQHR5cGUgeygpID0+IEhhbmRsZTxIPn0gKi9tYWtlSGFuZGxlKTtcbiB9OyRo4oCNX29uY2UuZGVmaW5lRHVyYWJsZUhhbmRsZShkZWZpbmVEdXJhYmxlSGFuZGxlKTtcbmhhcmRlbihkZWZpbmVEdXJhYmxlSGFuZGxlKTtcblxuLyoqXG4gKiBDcmVhdGUgYW4gb3BhcXVlIGhhbmRsZSBvYmplY3QuXG4gKlxuICogQHRlbXBsYXRlIHtzdHJpbmd9IEhcbiAqIEBwYXJhbSB7SH0gaGFuZGxlVHlwZSB0aGUgc3RyaW5nIGxpdGVyYWwgdHlwZSBvZiB0aGUgaGFuZGxlXG4gKiBAcmV0dXJucyB7SCBleHRlbmRzICdJbnN0YW5jZScgPyBJbnN0YW5jZSA6IEhhbmRsZTxIPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VIYW5kbGU9KGhhbmRsZVR5cGUpPT57XG50eXBlb2YgaGFuZGxlVHlwZT09PSdzdHJpbmcnfHxGYWlsIGBoYW5kbGVUeXBlIG11c3QgYmUgYSBzdHJpbmdgO1xuLyogUmV0dXJuIHRoZSBpbnRlcnNlY3Rpb24gdHlwZSAocmVhbGx5IGp1c3QgYW4gZW1wdHkgb2JqZWN0KS4qL1xuLyogQHRzLWV4cGVjdC1lcnJvciBCaXQgYnkgb3VyIG93biBvcGFxdWUgdHlwZXMuKi9cbnJldHVybiAoLyoqIEB0eXBlIHtIYW5kbGU8SD59ICovbWFrZUV4byhgJHtoYW5kbGVUeXBlfUhhbmRsZWAsSGFuZGxlSSx7fSkpO1xuIH07JGjigI1fb25jZS5tYWtlSGFuZGxlKG1ha2VIYW5kbGUpO1xuaGFyZGVuKG1ha2VIYW5kbGUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRlZmluZUR1cmFibGVIYW5kbGUiOlsiZGVmaW5lRHVyYWJsZUhhbmRsZSJdLCJtYWtlSGFuZGxlIjpbIm1ha2VIYW5kbGUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAxvqXB6IFAACiBQAALQAAAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL29iakFycmF5Q29udmVyc2lvbi5qc3siaW1wb3J0cyI6WyJAYWdvcmljL2Fzc2VydCJdLCJleHBvcnRzIjpbImFycmF5VG9PYmoiLCJhc3NlcnRTdWJzZXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0LEZhaWwscTskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL2Fzc2VydFwiLCBbW1wiYXNzZXJ0XCIsIFskaOKAjV9hID0+IChhc3NlcnQgPSAkaOKAjV9hKV1dLFtcIkZhaWxcIiwgWyRo4oCNX2EgPT4gKEZhaWwgPSAkaOKAjV9hKV1dLFtcInFcIiwgWyRo4oCNX2EgPT4gKHEgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuLyoqXG4gKiBAdHlwZWRlZiB7YmlnaW50fGJvb2xlYW58bnVsbHxudW1iZXJ8c3RyaW5nfHN5bWJvbHx1bmRlZmluZWR9IFByaW1pdGl2ZVxuICogQHR5cGVkZWYge3N0cmluZ3xudW1iZXJ8c3ltYm9sfSBQcm9wZXJ0eU5hbWVcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdGVtcGxhdGUge1Byb3BlcnR5TmFtZX0gVVxuICogQHBhcmFtIHtUW119IGFycmF5XG4gKiBAcGFyYW0ge1VbXX0ga2V5c1xuICovXG5jb25zdCAgICAgICAgYXJyYXlUb09iaj0oYXJyYXksa2V5cyk9PntcbmFycmF5Lmxlbmd0aD09PWtleXMubGVuZ3RofHxGYWlsIGBhcnJheSBhbmQga2V5cyBtdXN0IGJlIG9mIGVxdWFsIGxlbmd0aGA7XG5jb25zdCBvYmo9XG4vKiogQHR5cGUge1JlY29yZDxVLCBUPn0gKi9cbnt9O1xua2V5cy5mb3JFYWNoKChrZXksaSk9Pm9ialtrZXldPWFycmF5W2ldKTtcbnJldHVybiBoYXJkZW4ob2JqKTtcbiB9O1xuXG4vKipcbiAqIEFzc2VydCBhbGwgdmFsdWVzIGZyb20gYHBhcnRgIGFwcGVhciBpbiBgd2hvbGVgLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nW119IHdob2xlXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBwYXJ0XG4gKi8kaOKAjV9vbmNlLmFycmF5VG9PYmooYXJyYXlUb09iaik7XG5jb25zdCAgICAgICAgYXNzZXJ0U3Vic2V0PSh3aG9sZSxwYXJ0KT0+e1xucGFydC5mb3JFYWNoKChrZXkpPT57XG5hc3NlcnQudHlwZW9mKGtleSwnc3RyaW5nJyk7XG53aG9sZS5pbmNsdWRlcyhrZXkpfHxcbkZhaWwgYGtleSAke3Eoa2V5KX0gd2FzIG5vdCBvbmUgb2YgdGhlIGV4cGVjdGVkIGtleXMgJHtxKHdob2xlKX1gO1xuIH0pO1xuIH07JGjigI1fb25jZS5hc3NlcnRTdWJzZXQoYXNzZXJ0U3Vic2V0KTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJhcnJheVRvT2JqIjpbImFycmF5VG9PYmoiXSwiYXNzZXJ0U3Vic2V0IjpbImFzc2VydFN1YnNldCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACPB+Og6UQAAOlEAAAlAAAAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvdHlwZUd1YXJkcy5qc3siaW1wb3J0cyI6WyJAYWdvcmljL2VydHAiLCJAYWdvcmljL25vdGlmaWVyIiwiQGFnb3JpYy9zdG9yZSIsIkBhZ29yaWMvdGltZSJdLCJleHBvcnRzIjpbIkFkbWluRmFjZXRJIiwiQW1vdW50S2V5d29yZFJlY29yZFNoYXBlIiwiQW1vdW50UGF0dGVybktleXdvcmRSZWNvcmRTaGFwZSIsIkJyYW5kS2V5d29yZFJlY29yZFNoYXBlIiwiQnVuZGxlQ2FwU2hhcGUiLCJCdW5kbGVTaGFwZSIsIkVtcHR5UHJvcG9zYWxTaGFwZSIsIkV4aXRPYmplY3RJIiwiRXhpdE9iamVjdFNoYXBlIiwiRmVlTWludEFjY2Vzc1NoYXBlIiwiRnVsbFByb3Bvc2FsU2hhcGUiLCJIYW5kbGVJIiwiSGFuZGxlT2ZmZXJJIiwiSW5zdGFsbGF0aW9uU2hhcGUiLCJJbnN0YW5jZUFkbWluSSIsIkluc3RhbmNlQWRtaW5TaGFwZSIsIkluc3RhbmNlSGFuZGxlU2hhcGUiLCJJbnN0YW5jZVJlY29yZFNoYXBlIiwiSW5zdGFuY2VTdG9yYWdlTWFuYWdlcklLaXQiLCJJbnZpdGF0aW9uRWxlbWVudFNoYXBlIiwiSW52aXRhdGlvbkhhbmRsZVNoYXBlIiwiSW52aXRhdGlvblNoYXBlIiwiSXNzdWVyS2V5d29yZFJlY29yZFNoYXBlIiwiSXNzdWVyUEtleXdvcmRSZWNvcmRTaGFwZSIsIklzc3VlclJlY29yZFNoYXBlIiwiS2V5d29yZFNoYXBlIiwiT2ZmZXJIYW5kbGVySSIsIlBheW1lbnRQS2V5d29yZFJlY29yZFNoYXBlIiwiUHJpY2VRdW90ZVNoYXBlIiwiUHJvcG9zYWxTaGFwZSIsIlNlYXREYXRhU2hhcGUiLCJTZWF0SGFuZGxlQWxsb2NhdGlvbnNTaGFwZSIsIlNlYXRTaGFwZSIsIlRlcm1zU2hhcGUiLCJUaW1lclNoYXBlIiwiVW53cmFwcGVkSW5zdGFsbGF0aW9uU2hhcGUiLCJaY2ZNaW50SSIsIlpvZU1pbnRJIiwiWm9lTWludFNoYXBlIiwiWm9lU2VydmljZUkiLCJab2VTdG9yYWdlTWFuYWdlcklLaXQiLCJpc0FmdGVyRGVhZGxpbmVFeGl0UnVsZSIsImlzT25EZW1hbmRFeGl0UnVsZSIsImlzV2FpdmVkRXhpdFJ1bGUiLCJtYWtlSGFuZGxlU2hhcGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgQW1vdW50U2hhcGUsQXNzZXRLaW5kU2hhcGUsQnJhbmRTaGFwZSxEaXNwbGF5SW5mb1NoYXBlLElzc3VlcktpdFNoYXBlLElzc3VlclNoYXBlLFBheW1lbnRTaGFwZSxTdWJzY3JpYmVyU2hhcGUsTSxUaW1lc3RhbXBTaGFwZTskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL2VydHBcIiwgW1tcIkFtb3VudFNoYXBlXCIsIFskaOKAjV9hID0+IChBbW91bnRTaGFwZSA9ICRo4oCNX2EpXV0sW1wiQXNzZXRLaW5kU2hhcGVcIiwgWyRo4oCNX2EgPT4gKEFzc2V0S2luZFNoYXBlID0gJGjigI1fYSldXSxbXCJCcmFuZFNoYXBlXCIsIFskaOKAjV9hID0+IChCcmFuZFNoYXBlID0gJGjigI1fYSldXSxbXCJEaXNwbGF5SW5mb1NoYXBlXCIsIFskaOKAjV9hID0+IChEaXNwbGF5SW5mb1NoYXBlID0gJGjigI1fYSldXSxbXCJJc3N1ZXJLaXRTaGFwZVwiLCBbJGjigI1fYSA9PiAoSXNzdWVyS2l0U2hhcGUgPSAkaOKAjV9hKV1dLFtcIklzc3VlclNoYXBlXCIsIFskaOKAjV9hID0+IChJc3N1ZXJTaGFwZSA9ICRo4oCNX2EpXV0sW1wiUGF5bWVudFNoYXBlXCIsIFskaOKAjV9hID0+IChQYXltZW50U2hhcGUgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9ub3RpZmllclwiLCBbW1wiU3Vic2NyaWJlclNoYXBlXCIsIFskaOKAjV9hID0+IChTdWJzY3JpYmVyU2hhcGUgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiTVwiLCBbJGjigI1fYSA9PiAoTSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3RpbWVcIiwgW1tcIlRpbWVzdGFtcFNoYXBlXCIsIFskaOKAjV9hID0+IChUaW1lc3RhbXBTaGFwZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qIGtleXdvcmRzIGhhdmUgYW4gaW5pdGlhbCBjYXAqL1xuY29uc3QgICAgICAgIEtleXdvcmRTaGFwZT1NLnN0cmluZygpOyRo4oCNX29uY2UuS2V5d29yZFNoYXBlKEtleXdvcmRTaGFwZSk7XG5cbmNvbnN0ICAgICAgICBJbnZpdGF0aW9uSGFuZGxlU2hhcGU9TS5yZW1vdGFibGUoJ0ludml0YXRpb25IYW5kbGUnKTskaOKAjV9vbmNlLkludml0YXRpb25IYW5kbGVTaGFwZShJbnZpdGF0aW9uSGFuZGxlU2hhcGUpO1xuY29uc3QgICAgICAgIEludml0YXRpb25TaGFwZT1NLnJlbW90YWJsZSgnSW52aXRhdGlvbicpOyRo4oCNX29uY2UuSW52aXRhdGlvblNoYXBlKEludml0YXRpb25TaGFwZSk7XG5jb25zdCAgICAgICAgSW5zdGFuY2VIYW5kbGVTaGFwZT1NLnJlbW90YWJsZSgnSW5zdGFuY2VIYW5kbGUnKTskaOKAjV9vbmNlLkluc3RhbmNlSGFuZGxlU2hhcGUoSW5zdGFuY2VIYW5kbGVTaGFwZSk7XG5jb25zdCAgICAgICAgSW5zdGFsbGF0aW9uU2hhcGU9TS5yZW1vdGFibGUoJ0luc3RhbGxhdGlvbicpOyRo4oCNX29uY2UuSW5zdGFsbGF0aW9uU2hhcGUoSW5zdGFsbGF0aW9uU2hhcGUpO1xuY29uc3QgICAgICAgIFNlYXRTaGFwZT1NLnJlbW90YWJsZSgnU2VhdCcpOyRo4oCNX29uY2UuU2VhdFNoYXBlKFNlYXRTaGFwZSk7XG5cbmNvbnN0ICAgICAgICBBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGU9TS5yZWNvcmRPZihLZXl3b3JkU2hhcGUsQW1vdW50U2hhcGUpOyRo4oCNX29uY2UuQW1vdW50S2V5d29yZFJlY29yZFNoYXBlKEFtb3VudEtleXdvcmRSZWNvcmRTaGFwZSk7XG5jb25zdCAgICAgICAgQW1vdW50UGF0dGVybktleXdvcmRSZWNvcmRTaGFwZT1NLnJlY29yZE9mKFxuS2V5d29yZFNoYXBlLFxuTS5wYXR0ZXJuKCkpOyRo4oCNX29uY2UuQW1vdW50UGF0dGVybktleXdvcmRSZWNvcmRTaGFwZShBbW91bnRQYXR0ZXJuS2V5d29yZFJlY29yZFNoYXBlKTtcblxuY29uc3QgICAgICAgIFBheW1lbnRQS2V5d29yZFJlY29yZFNoYXBlPU0ucmVjb3JkT2YoXG5LZXl3b3JkU2hhcGUsXG5NLmVyZWYoUGF5bWVudFNoYXBlKSk7JGjigI1fb25jZS5QYXltZW50UEtleXdvcmRSZWNvcmRTaGFwZShQYXltZW50UEtleXdvcmRSZWNvcmRTaGFwZSk7XG5cbmNvbnN0ICAgICAgICBJc3N1ZXJLZXl3b3JkUmVjb3JkU2hhcGU9TS5yZWNvcmRPZihLZXl3b3JkU2hhcGUsSXNzdWVyU2hhcGUpOyRo4oCNX29uY2UuSXNzdWVyS2V5d29yZFJlY29yZFNoYXBlKElzc3VlcktleXdvcmRSZWNvcmRTaGFwZSk7XG5jb25zdCAgICAgICAgSXNzdWVyUEtleXdvcmRSZWNvcmRTaGFwZT1NLnJlY29yZE9mKFxuS2V5d29yZFNoYXBlLFxuTS5lcmVmKElzc3VlclNoYXBlKSk7JGjigI1fb25jZS5Jc3N1ZXJQS2V5d29yZFJlY29yZFNoYXBlKElzc3VlclBLZXl3b3JkUmVjb3JkU2hhcGUpO1xuXG5jb25zdCAgICAgICAgQnJhbmRLZXl3b3JkUmVjb3JkU2hhcGU9TS5yZWNvcmRPZihLZXl3b3JkU2hhcGUsQnJhbmRTaGFwZSk7JGjigI1fb25jZS5CcmFuZEtleXdvcmRSZWNvcmRTaGFwZShCcmFuZEtleXdvcmRSZWNvcmRTaGFwZSk7XG5cbmNvbnN0ICAgICAgICBJc3N1ZXJSZWNvcmRTaGFwZT1NLnNwbGl0UmVjb3JkKFxue1xuYnJhbmQ6QnJhbmRTaGFwZSxcbmlzc3VlcjpJc3N1ZXJTaGFwZSxcbmFzc2V0S2luZDpBc3NldEtpbmRTaGFwZX0sXG5cbntkaXNwbGF5SW5mbzpEaXNwbGF5SW5mb1NoYXBlfSk7JGjigI1fb25jZS5Jc3N1ZXJSZWNvcmRTaGFwZShJc3N1ZXJSZWNvcmRTaGFwZSk7XG5cblxuY29uc3QgICAgICAgIFRlcm1zU2hhcGU9aGFyZGVuKHtcbmlzc3VlcnM6SXNzdWVyS2V5d29yZFJlY29yZFNoYXBlLFxuYnJhbmRzOkJyYW5kS2V5d29yZFJlY29yZFNoYXBlfSk7JGjigI1fb25jZS5UZXJtc1NoYXBlKFRlcm1zU2hhcGUpO1xuXG5cbmNvbnN0ICAgICAgICBJbnN0YW5jZVJlY29yZFNoYXBlPWhhcmRlbih7XG5pbnN0YWxsYXRpb246SW5zdGFsbGF0aW9uU2hhcGUsXG5pbnN0YW5jZTpJbnN0YW5jZUhhbmRsZVNoYXBlLFxudGVybXM6TS5zcGxpdFJlY29yZChUZXJtc1NoYXBlKX0pOyRo4oCNX29uY2UuSW5zdGFuY2VSZWNvcmRTaGFwZShJbnN0YW5jZVJlY29yZFNoYXBlKTtcblxuXG5jb25zdCAgICAgICAgSGFuZGxlST1NLmludGVyZmFjZSgnSGFuZGxlJyx7fSk7JGjigI1fb25jZS5IYW5kbGVJKEhhbmRsZUkpO1xuXG5jb25zdCAgICAgICAgbWFrZUhhbmRsZVNoYXBlPShuYW1lKT0+TS5yZW1vdGFibGUoIGAke25hbWV9SGFuZGxlYCk7JGjigI1fb25jZS5tYWtlSGFuZGxlU2hhcGUobWFrZUhhbmRsZVNoYXBlKTtcbmNvbnN0ICAgICAgICBUaW1lclNoYXBlPW1ha2VIYW5kbGVTaGFwZSgndGltZXInKTtcblxuLyoqXG4gKiBBZnRlciBkZWZhdWx0cyBhcmUgZmlsbGVkIGluXG4gKlxuICogQHNlZSB7UHJvcG9zYWxSZWNvcmR9IHR5cGVcbiAqLyRo4oCNX29uY2UuVGltZXJTaGFwZShUaW1lclNoYXBlKTtcbmNvbnN0ICAgICAgICBGdWxsUHJvcG9zYWxTaGFwZT1oYXJkZW4oe1xud2FudDpBbW91bnRQYXR0ZXJuS2V5d29yZFJlY29yZFNoYXBlLFxuZ2l2ZTpBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUsXG4vKiBUbyBhY2NlcHQgb25seSBvbmUsIHdlIGNvdWxkIHVzZSBNLm9yIHJhdGhlciB0aGFuIE0uc3BsaXRSZWNvcmQsKi9cbi8qIGJ1dCB0aGUgZXJyb3IgbWVzc2FnZXMgd291bGQgaGF2ZSBiZWVuIHdvcnNlLiBSYXRoZXIsKi9cbi8qIGNsZWFuUHJvcG9zYWwncyBhc3NlcnRFeGl0IGNoZWNrcyB0aGF0IHRoZXJlJ3MgZXhhY3RseSBvbmUuKi9cbmV4aXQ6TS5zcGxpdFJlY29yZChcbnt9LFxue1xub25EZW1hbmQ6bnVsbCxcbndhaXZlZDpudWxsLFxuYWZ0ZXJEZWFkbGluZTp7XG50aW1lcjpNLmVyZWYoVGltZXJTaGFwZSksXG5kZWFkbGluZTpUaW1lc3RhbXBTaGFwZX19LFxuXG5cbnt9KX0pO1xuXG5cbi8qKiBAc2VlIHtQcm9wb3NhbH0gdHlwZSAqLyRo4oCNX29uY2UuRnVsbFByb3Bvc2FsU2hhcGUoRnVsbFByb3Bvc2FsU2hhcGUpO1xuY29uc3QgICAgICAgIFByb3Bvc2FsU2hhcGU9TS5zcGxpdFJlY29yZCh7fSxGdWxsUHJvcG9zYWxTaGFwZSx7fSk7JGjigI1fb25jZS5Qcm9wb3NhbFNoYXBlKFByb3Bvc2FsU2hhcGUpO1xuXG5jb25zdCAgICAgICAgRW1wdHlQcm9wb3NhbFNoYXBlPU0uc3BsaXRSZWNvcmQoe1xuZ2l2ZTp7fSxcbndhbnQ6e30sXG5leGl0OntvbkRlbWFuZDpudWxsfX0pOyRo4oCNX29uY2UuRW1wdHlQcm9wb3NhbFNoYXBlKEVtcHR5UHJvcG9zYWxTaGFwZSk7XG5cblxuY29uc3QgICAgICAgIGlzT25EZW1hbmRFeGl0UnVsZT0oZXhpdCk9PntcbmNvbnN0W2V4aXRLZXldPU9iamVjdC5rZXlzKGV4aXQpO1xucmV0dXJuIGV4aXRLZXk9PT0nb25EZW1hbmQnO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtFeGl0UnVsZX0gZXhpdFxuICogQHJldHVybnMge2V4aXQgaXMgV2FpdmVkRXhpdFJ1bGV9XG4gKi8kaOKAjV9vbmNlLmlzT25EZW1hbmRFeGl0UnVsZShpc09uRGVtYW5kRXhpdFJ1bGUpO1xuY29uc3QgICAgICAgIGlzV2FpdmVkRXhpdFJ1bGU9KGV4aXQpPT57XG5jb25zdFtleGl0S2V5XT1PYmplY3Qua2V5cyhleGl0KTtcbnJldHVybiBleGl0S2V5PT09J3dhaXZlZCc7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge0V4aXRSdWxlfSBleGl0XG4gKiBAcmV0dXJucyB7ZXhpdCBpcyBBZnRlckRlYWRsaW5lRXhpdFJ1bGV9XG4gKi8kaOKAjV9vbmNlLmlzV2FpdmVkRXhpdFJ1bGUoaXNXYWl2ZWRFeGl0UnVsZSk7XG5jb25zdCAgICAgICAgaXNBZnRlckRlYWRsaW5lRXhpdFJ1bGU9KGV4aXQpPT57XG5jb25zdFtleGl0S2V5XT1PYmplY3Qua2V5cyhleGl0KTtcbnJldHVybiBleGl0S2V5PT09J2FmdGVyRGVhZGxpbmUnO1xuIH07JGjigI1fb25jZS5pc0FmdGVyRGVhZGxpbmVFeGl0UnVsZShpc0FmdGVyRGVhZGxpbmVFeGl0UnVsZSk7XG5cbmNvbnN0ICAgICAgICBJbnZpdGF0aW9uRWxlbWVudFNoYXBlPU0uc3BsaXRSZWNvcmQoe1xuZGVzY3JpcHRpb246TS5zdHJpbmcoKSxcbmhhbmRsZTpJbnZpdGF0aW9uSGFuZGxlU2hhcGUsXG5pbnN0YW5jZTpJbnN0YW5jZUhhbmRsZVNoYXBlLFxuaW5zdGFsbGF0aW9uOkluc3RhbGxhdGlvblNoYXBlfSk7JGjigI1fb25jZS5JbnZpdGF0aW9uRWxlbWVudFNoYXBlKEludml0YXRpb25FbGVtZW50U2hhcGUpO1xuXG5cbmNvbnN0ICAgICAgICBPZmZlckhhbmRsZXJJPU0uaW50ZXJmYWNlKCdPZmZlckhhbmRsZXInLHtcbmhhbmRsZTpNLmNhbGwoU2VhdFNoYXBlKS5vcHRpb25hbChNLmFueSgpKS5yZXR1cm5zKE0uc3RyaW5nKCkpfSk7JGjigI1fb25jZS5PZmZlckhhbmRsZXJJKE9mZmVySGFuZGxlckkpO1xuXG5cbmNvbnN0ICAgICAgICBTZWF0SGFuZGxlQWxsb2NhdGlvbnNTaGFwZT1NLmFycmF5T2YoXG5oYXJkZW4oe1xuc2VhdEhhbmRsZTpTZWF0U2hhcGUsXG5hbGxvY2F0aW9uOkFtb3VudEtleXdvcmRSZWNvcmRTaGFwZX0pKTskaOKAjV9vbmNlLlNlYXRIYW5kbGVBbGxvY2F0aW9uc1NoYXBlKFNlYXRIYW5kbGVBbGxvY2F0aW9uc1NoYXBlKTtcblxuXG5cbmNvbnN0ICAgICAgICBab2VNaW50U2hhcGU9TS5yZW1vdGFibGUoJ1pvZU1pbnQnKTskaOKAjV9vbmNlLlpvZU1pbnRTaGFwZShab2VNaW50U2hhcGUpO1xuY29uc3QgICAgICAgIFpvZU1pbnRJPU0uaW50ZXJmYWNlKCdab2VNaW50Jyx7XG5nZXRJc3N1ZXJSZWNvcmQ6TS5jYWxsKCkucmV0dXJucyhJc3N1ZXJSZWNvcmRTaGFwZSksXG5taW50QW5kRXNjcm93Ok0uY2FsbChBbW91bnRTaGFwZSkucmV0dXJucygpLFxud2l0aGRyYXdBbmRCdXJuOk0uY2FsbChBbW91bnRTaGFwZSkucmV0dXJucygpfSk7JGjigI1fb25jZS5ab2VNaW50SShab2VNaW50SSk7XG5cblxuY29uc3QgICAgICAgIFpjZk1pbnRJPU0uaW50ZXJmYWNlKCdaY2ZNaW50Jyx7XG5nZXRJc3N1ZXJSZWNvcmQ6TS5jYWxsKCkucmV0dXJucyhJc3N1ZXJSZWNvcmRTaGFwZSksXG5taW50R2FpbnM6TS5jYWxsKEFtb3VudEtleXdvcmRSZWNvcmRTaGFwZSkuXG5vcHRpb25hbChNLnJlbW90YWJsZSgnemNmU2VhdCcpKS5cbnJldHVybnMoTS5yZW1vdGFibGUoJ3pjZlNlYXQnKSksXG5idXJuTG9zc2VzOk0uY2FsbChcbkFtb3VudEtleXdvcmRSZWNvcmRTaGFwZSxcbk0ucmVtb3RhYmxlKCd6Y2ZTZWF0JykpLlxucmV0dXJucygpfSk7JGjigI1fb25jZS5aY2ZNaW50SShaY2ZNaW50SSk7XG5cblxuY29uc3QgICAgICAgIEZlZU1pbnRBY2Nlc3NTaGFwZT1NLnJlbW90YWJsZSgnRmVlTWludEFjY2VzcycpOyRo4oCNX29uY2UuRmVlTWludEFjY2Vzc1NoYXBlKEZlZU1pbnRBY2Nlc3NTaGFwZSk7XG5cbmNvbnN0ICAgICAgICBFeGl0T2JqZWN0ST1NLmludGVyZmFjZSgnRXhpdCBPYmplY3QnLHtcbmV4aXQ6TS5jYWxsKCkucmV0dXJucygpfSk7JGjigI1fb25jZS5FeGl0T2JqZWN0SShFeGl0T2JqZWN0SSk7XG5cblxuY29uc3QgICAgICAgIEV4aXRPYmplY3RTaGFwZT1NLnJlbW90YWJsZSgnRXhpdE9iaicpOyRo4oCNX29uY2UuRXhpdE9iamVjdFNoYXBlKEV4aXRPYmplY3RTaGFwZSk7XG5jb25zdCAgICAgICAgSW5zdGFuY2VBZG1pblNoYXBlPU0ucmVtb3RhYmxlKCdJbnN0YW5jZUFkbWluJyk7JGjigI1fb25jZS5JbnN0YW5jZUFkbWluU2hhcGUoSW5zdGFuY2VBZG1pblNoYXBlKTtcbmNvbnN0ICAgICAgICBJbnN0YW5jZUFkbWluST1NLmludGVyZmFjZSgnSW5zdGFuY2VBZG1pbicse1xubWFrZUludml0YXRpb246TS5jYWxsKEludml0YXRpb25IYW5kbGVTaGFwZSxNLnN0cmluZygpKS5cbm9wdGlvbmFsKE0ucmVjb3JkKCksTS5wYXR0ZXJuKCkpLlxucmV0dXJucyhJbnZpdGF0aW9uU2hhcGUpLFxuc2F2ZUlzc3VlcjpNLmNhbGxXaGVuKE0uYXdhaXQoSXNzdWVyU2hhcGUpLEtleXdvcmRTaGFwZSkucmV0dXJucyhcbklzc3VlclJlY29yZFNoYXBlKSxcblxubWFrZU5vRXNjcm93U2VhdDpNLmNhbGwoXG5BbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUsXG5Qcm9wb3NhbFNoYXBlLFxuRXhpdE9iamVjdFNoYXBlLFxuU2VhdFNoYXBlKS5cbnJldHVybnMoU2VhdFNoYXBlKSxcbmV4aXRBbGxTZWF0czpNLmNhbGwoTS5hbnkoKSkucmV0dXJucygpLFxuZmFpbEFsbFNlYXRzOk0uY2FsbChNLmFueSgpKS5yZXR1cm5zKCksXG5leGl0U2VhdDpNLmNhbGwoU2VhdFNoYXBlLE0uYW55KCkpLnJldHVybnMoKSxcbmZhaWxTZWF0Ok0uY2FsbChTZWF0U2hhcGUsTS5hbnkoKSkucmV0dXJucygpLFxubWFrZVpvZU1pbnQ6TS5jYWxsKEtleXdvcmRTaGFwZSkuXG5vcHRpb25hbChcbkFzc2V0S2luZFNoYXBlLFxuRGlzcGxheUluZm9TaGFwZSxcbk0uc3BsaXRSZWNvcmQoaGFyZGVuKHt9KSxoYXJkZW4oe2VsZW1lbnRTaGFwZTpNLnBhdHRlcm4oKX0pKSkuXG5cbnJldHVybnMoTS5yZW1vdGFibGUoJ3pvZU1pbnQnKSksXG5yZWdpc3RlckZlZU1pbnQ6TS5jYWxsKEtleXdvcmRTaGFwZSxGZWVNaW50QWNjZXNzU2hhcGUpLnJldHVybnMoXG5NLnJlbW90YWJsZSgnZmVlTWludCcpKSxcblxucmVwbGFjZUFsbG9jYXRpb25zOk0uY2FsbChTZWF0SGFuZGxlQWxsb2NhdGlvbnNTaGFwZSkucmV0dXJucygpLFxuc3RvcEFjY2VwdGluZ09mZmVyczpNLmNhbGwoKS5yZXR1cm5zKCksXG5zZXRPZmZlckZpbHRlcjpNLmNhbGwoTS5hcnJheU9mKE0uc3RyaW5nKCkpKS5yZXR1cm5zKCksXG5nZXRPZmZlckZpbHRlcjpNLmNhbGwoKS5yZXR1cm5zKE0uYXJyYXlPZihNLnN0cmluZygpKSksXG5nZXRFeGl0U3Vic2NyaWJlcjpNLmNhbGwoU2VhdFNoYXBlKS5yZXR1cm5zKFN1YnNjcmliZXJTaGFwZSksXG5pc0Jsb2NrZWQ6TS5jYWxsKE0uc3RyaW5nKCkpLnJldHVybnMoTS5ib29sZWFuKCkpLFxucmVwYWlyQ29udHJhY3RDb21wbGV0aW9uV2F0Y2hlcjpNLmNhbGwoKS5yZXR1cm5zKCl9KTskaOKAjV9vbmNlLkluc3RhbmNlQWRtaW5JKEluc3RhbmNlQWRtaW5JKTtcblxuXG5jb25zdCAgICAgICAgSW5zdGFuY2VTdG9yYWdlTWFuYWdlcklLaXQ9aGFyZGVuKHtcbmluc3RhbmNlU3RvcmFnZU1hbmFnZXI6TS5pbnRlcmZhY2UoJ0luc3RhbmNlU3RvcmFnZU1hbmFnZXInLHtcbmdldFRlcm1zOk0uY2FsbCgpLnJldHVybnMoTS5zcGxpdFJlY29yZChUZXJtc1NoYXBlKSksXG5nZXRJc3N1ZXJzOk0uY2FsbCgpLnJldHVybnMoSXNzdWVyS2V5d29yZFJlY29yZFNoYXBlKSxcbmdldEJyYW5kczpNLmNhbGwoKS5yZXR1cm5zKEJyYW5kS2V5d29yZFJlY29yZFNoYXBlKSxcbmdldEluc3RhbGxhdGlvbjpNLmNhbGwoKS5yZXR1cm5zKEluc3RhbGxhdGlvblNoYXBlKSxcbmdldEludml0YXRpb25Jc3N1ZXI6TS5jYWxsKCkucmV0dXJucyhJc3N1ZXJTaGFwZSksXG5cbnNhdmVJc3N1ZXI6TS5jYWxsKElzc3VlclNoYXBlLEtleXdvcmRTaGFwZSkucmV0dXJucyhNLnByb21pc2UoKSksXG5tYWtlWm9lTWludDpNLmNhbGwoS2V5d29yZFNoYXBlKS5cbm9wdGlvbmFsKFxuQXNzZXRLaW5kU2hhcGUsXG5EaXNwbGF5SW5mb1NoYXBlLFxuTS5zcGxpdFJlY29yZChoYXJkZW4oe30pLGhhcmRlbih7ZWxlbWVudFNoYXBlOk0ucGF0dGVybigpfSkpKS5cblxucmV0dXJucyhNLmVyZWYoWm9lTWludFNoYXBlKSksXG5yZWdpc3RlckZlZU1pbnQ6TS5jYWxsKEtleXdvcmRTaGFwZSxGZWVNaW50QWNjZXNzU2hhcGUpLnJldHVybnMoXG5NLnJlbW90YWJsZSgnZmVlTWludCcpKSxcblxuZ2V0SW5zdGFuY2VSZWNvcmQ6TS5jYWxsKCkucmV0dXJucyhJbnN0YW5jZVJlY29yZFNoYXBlKSxcbmdldElzc3VlclJlY29yZHM6TS5jYWxsKCkucmV0dXJucyhNLmFycmF5T2YoSXNzdWVyUmVjb3JkU2hhcGUpKSxcbmdldFdpdGhkcmF3RmFjZXQ6TS5jYWxsKCkucmV0dXJucyhNLnJlbW90YWJsZSgnV2l0aGRyYXdGYWNldCcpKSxcbmluaXRJbnN0YW5jZUFkbWluOk0uY2FsbChcbkluc3RhbmNlSGFuZGxlU2hhcGUsXG5NLnJlbW90YWJsZSgnaW5zdGFuY2VBZG1pbicpKS5cbnJldHVybnMoTS5wcm9taXNlKCkpLFxuZGVsZXRlSW5zdGFuY2VBZG1pbjpNLmNhbGwoSW5zdGFuY2VBZG1pblNoYXBlKS5yZXR1cm5zKCksXG5tYWtlSW52aXRhdGlvbjpNLmNhbGwoSW52aXRhdGlvbkhhbmRsZVNoYXBlLE0uc3RyaW5nKCkpLlxub3B0aW9uYWwoTS5yZWNvcmQoKSxNLnBhdHRlcm4oKSkuXG5yZXR1cm5zKFBheW1lbnRTaGFwZSksXG5nZXRSb290Ok0uY2FsbCgpLnJldHVybnMoTS5hbnkoKSksXG5nZXRBZG1pbk5vZGU6TS5jYWxsKCkucmV0dXJucyhNLnJlbW90YWJsZSgnYWRtaW5Ob2RlJykpfSksXG5cbndpdGhkcmF3RmFjZXQ6TS5pbnRlcmZhY2UoJ1dpdGhkcmF3RmFjZXQnLHtcbndpdGhkcmF3UGF5bWVudHM6TS5jYWxsKEFtb3VudEtleXdvcmRSZWNvcmRTaGFwZSkucmV0dXJucyhcblBheW1lbnRQS2V5d29yZFJlY29yZFNoYXBlKX0pLFxuXG5cbmhlbHBlcnM6TS5pbnRlcmZhY2UoJ0luc3RhbmNlU3RvcmFnZU1hbmFnZXIgaGVscGVyJyx7XG53cmFwSXNzdWVyS2l0V2l0aFpvZU1pbnQ6TS5jYWxsKFxuS2V5d29yZFNoYXBlLFxuSXNzdWVyS2l0U2hhcGUsXG5NLnJlbW90YWJsZSgnYWRtaW5Ob2RlJykpLlxucmV0dXJucyhab2VNaW50U2hhcGUpfSl9KTskaOKAjV9vbmNlLkluc3RhbmNlU3RvcmFnZU1hbmFnZXJJS2l0KEluc3RhbmNlU3RvcmFnZU1hbmFnZXJJS2l0KTtcblxuXG5cbmNvbnN0ICAgICAgICBCdW5kbGVDYXBTaGFwZT1NLnJlbW90YWJsZSgnYnVuZGxlQ2FwJyk7JGjigI1fb25jZS5CdW5kbGVDYXBTaGFwZShCdW5kbGVDYXBTaGFwZSk7XG5jb25zdCAgICAgICAgQnVuZGxlU2hhcGU9TS5hbmQoXG5NLnNwbGl0UmVjb3JkKHttb2R1bGVGb3JtYXQ6TS5hbnkoKX0pLFxuTS5yZWNvcmRPZihNLnN0cmluZygpLE0uc3RyaW5nKHtzdHJpbmdMZW5ndGhMaW1pdDpJbmZpbml0eX0pKSk7JGjigI1fb25jZS5CdW5kbGVTaGFwZShCdW5kbGVTaGFwZSk7XG5cblxuY29uc3QgICAgICAgIFVud3JhcHBlZEluc3RhbGxhdGlvblNoYXBlPU0uc3BsaXRSZWNvcmQoXG5oYXJkZW4oe1xuaW5zdGFsbGF0aW9uOkluc3RhbGxhdGlvblNoYXBlfSksXG5cbmhhcmRlbih7XG5idW5kbGU6TS5yZWNvcmRPZihNLnN0cmluZygpLE0uc3RyaW5nKHtzdHJpbmdMZW5ndGhMaW1pdDpJbmZpbml0eX0pKSxcbmJ1bmRsZUNhcDpCdW5kbGVDYXBTaGFwZSxcbmJ1bmRsZUlEOk0uc3RyaW5nKCl9KSxcblxuaGFyZGVuKHt9KSk7JGjigI1fb25jZS5VbndyYXBwZWRJbnN0YWxsYXRpb25TaGFwZShVbndyYXBwZWRJbnN0YWxsYXRpb25TaGFwZSk7XG5cblxuY29uc3QgICAgICAgIFpvZVN0b3JhZ2VNYW5hZ2VySUtpdD1oYXJkZW4oe1xuem9lU2VydmljZURhdGFBY2Nlc3M6TS5pbnRlcmZhY2UoJ1pvZVNlcnZpY2UgZGF0YUFjY2Vzcycse1xuZ2V0VGVybXM6TS5jYWxsKEluc3RhbmNlSGFuZGxlU2hhcGUpLnJldHVybnMoTS5zcGxpdFJlY29yZChUZXJtc1NoYXBlKSksXG5nZXRJc3N1ZXJzOk0uY2FsbChJbnN0YW5jZUhhbmRsZVNoYXBlKS5yZXR1cm5zKElzc3VlcktleXdvcmRSZWNvcmRTaGFwZSksXG5nZXRCcmFuZHM6TS5jYWxsKEluc3RhbmNlSGFuZGxlU2hhcGUpLnJldHVybnMoQnJhbmRLZXl3b3JkUmVjb3JkU2hhcGUpLFxuZ2V0SW5zdGFsbGF0aW9uOk0uY2FsbChJbnN0YW5jZUhhbmRsZVNoYXBlKS5yZXR1cm5zKFxuTS5lcmVmKE0ucmVtb3RhYmxlKCdJbnN0YWxsYXRpb24nKSkpLFxuXG5nZXRJbnZpdGF0aW9uSXNzdWVyOk0uY2FsbCgpLnJldHVybnMoSXNzdWVyU2hhcGUpLFxuXG5nZXRCdW5kbGVJREZyb21JbnN0YWxsYXRpb246TS5jYWxsKEluc3RhbGxhdGlvblNoYXBlKS5yZXR1cm5zKFxuTS5lcmVmKE0uc3RyaW5nKCkpKSxcblxuaW5zdGFsbEJ1bmRsZTpNLmNhbGwoTS5vcihJbnN0YW5jZUhhbmRsZVNoYXBlLEJ1bmRsZVNoYXBlKSkucmV0dXJucyhcbk0ucHJvbWlzZSgpKSxcblxuaW5zdGFsbEJ1bmRsZUlEOk0uY2FsbChNLnN0cmluZygpKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcblxuZ2V0UHVibGljRmFjZXQ6TS5jYWxsKEluc3RhbmNlSGFuZGxlU2hhcGUpLnJldHVybnMoXG5NLmVyZWYoTS5yZW1vdGFibGUoJ1B1YmxpY0ZhY2V0JykpKSxcblxuZ2V0T2ZmZXJGaWx0ZXI6TS5jYWxsKEluc3RhbmNlSGFuZGxlU2hhcGUpLnJldHVybnMoTS5hcnJheU9mKE0uc3RyaW5nKCkpKSxcbmdldFByb3Bvc2FsU2hhcGVGb3JJbnZpdGF0aW9uOk0uY2FsbChJbnZpdGF0aW9uSGFuZGxlU2hhcGUpLnJldHVybnMoXG5NLm9wdChNLnBhdHRlcm4oKSkpfSksXG5cblxubWFrZU9mZmVyQWNjZXNzOk0uaW50ZXJmYWNlKCdab2VTdG9yYWdlIG1ha2VPZmZlciBhY2Nlc3MnLHtcbmdldEFzc2V0S2luZEJ5QnJhbmQ6TS5jYWxsKEJyYW5kU2hhcGUpLnJldHVybnMoQXNzZXRLaW5kU2hhcGUpLFxuZ2V0SW5zdGFuY2VBZG1pbjpNLmNhbGwoSW5zdGFuY2VIYW5kbGVTaGFwZSkucmV0dXJucyhcbk0ucmVtb3RhYmxlKCdpbnN0YW5jZUFkbWluJykpLFxuXG5nZXRQcm9wb3NhbFNoYXBlRm9ySW52aXRhdGlvbjpNLmNhbGwoSW52aXRhdGlvbkhhbmRsZVNoYXBlKS5yZXR1cm5zKFxuTS5vcHQoTS5wYXR0ZXJuKCkpKSxcblxuZ2V0SW52aXRhdGlvbklzc3VlcjpNLmNhbGwoKS5yZXR1cm5zKElzc3VlclNoYXBlKSxcbmRlcG9zaXRQYXltZW50czpNLmNhbGwoUHJvcG9zYWxTaGFwZSxQYXltZW50UEtleXdvcmRSZWNvcmRTaGFwZSkucmV0dXJucyhcbk0ucHJvbWlzZSgpKX0pLFxuXG5cbnN0YXJ0SW5zdGFuY2VBY2Nlc3M6TS5pbnRlcmZhY2UoJ1pvZVN0b3JhZ2Ugc3RhcnRJbnN0YW5jZSBhY2Nlc3MnLHtcbm1ha2Vab2VJbnN0YW5jZVN0b3JhZ2VNYW5hZ2VyOk0uY2FsbChcbk0uYW55KCksXG5JbnN0YWxsYXRpb25TaGFwZSxcbk0uYW55KCksXG5Jc3N1ZXJQS2V5d29yZFJlY29yZFNoYXBlLFxuTS5vcihJbnN0YW5jZUhhbmRsZVNoYXBlLEJ1bmRsZVNoYXBlKSxcbk0ub3IoQnVuZGxlQ2FwU2hhcGUsQnVuZGxlU2hhcGUpKS5cbnJldHVybnMoTS5wcm9taXNlKCkpLFxudW53cmFwSW5zdGFsbGF0aW9uOk0uY2FsbFdoZW4oTS5lcmVmKEluc3RhbGxhdGlvblNoYXBlKSkucmV0dXJucyhcblVud3JhcHBlZEluc3RhbGxhdGlvblNoYXBlKX0pLFxuXG5cbmludml0YXRpb25Jc3N1ZXJBY2Nlc3M6TS5pbnRlcmZhY2UoJ1pvZVN0b3JhZ2UgaW52aXRhdGlvbklzc3Vlcicse1xuZ2V0SW52aXRhdGlvbklzc3VlcjpNLmNhbGwoKS5yZXR1cm5zKElzc3VlclNoYXBlKX0pfSk7JGjigI1fb25jZS5ab2VTdG9yYWdlTWFuYWdlcklLaXQoWm9lU3RvcmFnZU1hbmFnZXJJS2l0KTtcblxuXG5cbmNvbnN0ICAgICAgICBab2VTZXJ2aWNlST1NLmludGVyZmFjZSgnWm9lU2VydmljZScse1xuaW5zdGFsbDpNLmNhbGwoTS5hbnkoKSkucmV0dXJucyhNLnByb21pc2UoKSksXG5pbnN0YWxsQnVuZGxlSUQ6TS5jYWxsKE0uc3RyaW5nKCkpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuc3RhcnRJbnN0YW5jZTpNLmNhbGwoTS5lcmVmKEluc3RhbGxhdGlvblNoYXBlKSkuXG5vcHRpb25hbChJc3N1ZXJQS2V5d29yZFJlY29yZFNoYXBlLE0uYW55KCksTS5hbnkoKSkuXG5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbm9mZmVyOk0uY2FsbChNLmVyZWYoSW52aXRhdGlvblNoYXBlKSkuXG5vcHRpb25hbChQcm9wb3NhbFNoYXBlLFBheW1lbnRQS2V5d29yZFJlY29yZFNoYXBlLE0uYW55KCkpLlxucmV0dXJucyhNLnByb21pc2UoKSksXG5cbmdldE9mZmVyRmlsdGVyOk0uY2FsbFdoZW4oTS5hd2FpdChJbnN0YW5jZUhhbmRsZVNoYXBlKSkucmV0dXJucyhcbk0uYXJyYXlPZihNLnN0cmluZygpKSksXG5cbmdldEludml0YXRpb25Jc3N1ZXI6TS5jYWxsKCkucmV0dXJucyhNLnByb21pc2UoKSksXG5nZXRGZWVJc3N1ZXI6TS5jYWxsKCkucmV0dXJucyhNLnByb21pc2UoKSksXG5nZXRCcmFuZHM6TS5jYWxsV2hlbihNLmF3YWl0KEluc3RhbmNlSGFuZGxlU2hhcGUpKS5yZXR1cm5zKFxuQnJhbmRLZXl3b3JkUmVjb3JkU2hhcGUpLFxuXG5nZXRJc3N1ZXJzOk0uY2FsbFdoZW4oTS5hd2FpdChJbnN0YW5jZUhhbmRsZVNoYXBlKSkucmV0dXJucyhcbklzc3VlcktleXdvcmRSZWNvcmRTaGFwZSksXG5cbmdldFB1YmxpY0ZhY2V0Ok0uY2FsbFdoZW4oTS5hd2FpdChJbnN0YW5jZUhhbmRsZVNoYXBlKSkucmV0dXJucyhcbk0ucmVtb3RhYmxlKCdQdWJsaWNGYWNldCcpKSxcblxuZ2V0VGVybXM6TS5jYWxsV2hlbihNLmF3YWl0KEluc3RhbmNlSGFuZGxlU2hhcGUpKS5yZXR1cm5zKE0uYW55KCkpLFxuZ2V0SW5zdGFsbGF0aW9uRm9ySW5zdGFuY2U6TS5jYWxsV2hlbihNLmF3YWl0KEluc3RhbmNlSGFuZGxlU2hhcGUpKS5yZXR1cm5zKFxuTS5lcmVmKE0ucmVtb3RhYmxlKCdJbnN0YWxsYXRpb24nKSkpLFxuXG5nZXRCdW5kbGVJREZyb21JbnN0YWxsYXRpb246TS5jYWxsKEluc3RhbGxhdGlvblNoYXBlKS5yZXR1cm5zKFxuTS5lcmVmKE0uc3RyaW5nKCkpKSxcblxuXG5nZXRJbnN0YWxsYXRpb246TS5jYWxsKE0uZXJlZihJbnZpdGF0aW9uU2hhcGUpKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbmdldEluc3RhbmNlOk0uY2FsbChNLmVyZWYoSW52aXRhdGlvblNoYXBlKSkucmV0dXJucyhNLnByb21pc2UoKSksXG5nZXRDb25maWd1cmF0aW9uOk0uY2FsbCgpLnJldHVybnMoe1xuZmVlSXNzdWVyQ29uZmlnOntcbm5hbWU6TS5zdHJpbmcoKSxcbmFzc2V0S2luZDonbmF0JyxcbmRpc3BsYXlJbmZvOkRpc3BsYXlJbmZvU2hhcGV9fSksXG5cblxuZ2V0SW52aXRhdGlvbkRldGFpbHM6TS5jYWxsKE0uZXJlZihJbnZpdGF0aW9uU2hhcGUpKS5yZXR1cm5zKE0uYW55KCkpLFxuZ2V0UHJvcG9zYWxTaGFwZUZvckludml0YXRpb246TS5jYWxsKEludml0YXRpb25IYW5kbGVTaGFwZSkucmV0dXJucyhcbk0ub3B0KFByb3Bvc2FsU2hhcGUpKX0pOyRo4oCNX29uY2UuWm9lU2VydmljZUkoWm9lU2VydmljZUkpO1xuXG5cblxuY29uc3QgICAgICAgIEFkbWluRmFjZXRJPU0uaW50ZXJmYWNlKCdaY2ZBZG1pbkZhY2V0Jyx7XG5nZXRWYXRTaHV0ZG93blByb21pc2U6TS5jYWxsKCkucmV0dXJucyhNLnByb21pc2UoKSksXG5yZXN0YXJ0Q29udHJhY3Q6TS5jYWxsKCkub3B0aW9uYWwoTS5hbnkoKSkucmV0dXJucyhNLnByb21pc2UoKSksXG51cGdyYWRlQ29udHJhY3Q6TS5jYWxsKE0uc3RyaW5nKCkpLm9wdGlvbmFsKE0uYW55KCkpLnJldHVybnMoTS5wcm9taXNlKCkpfSk7JGjigI1fb25jZS5BZG1pbkZhY2V0SShBZG1pbkZhY2V0SSk7XG5cblxuY29uc3QgICAgICAgIFNlYXREYXRhU2hhcGU9TS5zcGxpdFJlY29yZChcbntcbnByb3Bvc2FsOlByb3Bvc2FsU2hhcGUsXG5pbml0aWFsQWxsb2NhdGlvbjpBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUsXG5zZWF0SGFuZGxlOlNlYXRTaGFwZX0sXG5cbntcbm9mZmVyQXJnczpNLmFueSgpfSk7JGjigI1fb25jZS5TZWF0RGF0YVNoYXBlKFNlYXREYXRhU2hhcGUpO1xuXG5cblxuY29uc3QgICAgICAgIEhhbmRsZU9mZmVyST1NLmludGVyZmFjZSgnSGFuZGxlT2ZmZXInLHtcbmhhbmRsZU9mZmVyOk0uY2FsbChJbnZpdGF0aW9uSGFuZGxlU2hhcGUsU2VhdERhdGFTaGFwZSkucmV0dXJucyh7XG5vZmZlclJlc3VsdFByb21pc2U6TS5wcm9taXNlKCksXG5leGl0T2JqOkV4aXRPYmplY3RTaGFwZX0pfSk7JGjigI1fb25jZS5IYW5kbGVPZmZlckkoSGFuZGxlT2ZmZXJJKTtcblxuXG5cbmNvbnN0ICAgICAgICBQcmljZVF1b3RlU2hhcGU9aGFyZGVuKHtcbnF1b3RlQW1vdW50OkFtb3VudFNoYXBlLFxucXVvdGVQYXltZW50Ok0uZXJlZihQYXltZW50U2hhcGUpfSk7JGjigI1fb25jZS5QcmljZVF1b3RlU2hhcGUoUHJpY2VRdW90ZVNoYXBlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJLZXl3b3JkU2hhcGUiOlsiS2V5d29yZFNoYXBlIl0sIkludml0YXRpb25IYW5kbGVTaGFwZSI6WyJJbnZpdGF0aW9uSGFuZGxlU2hhcGUiXSwiSW52aXRhdGlvblNoYXBlIjpbIkludml0YXRpb25TaGFwZSJdLCJJbnN0YW5jZUhhbmRsZVNoYXBlIjpbIkluc3RhbmNlSGFuZGxlU2hhcGUiXSwiSW5zdGFsbGF0aW9uU2hhcGUiOlsiSW5zdGFsbGF0aW9uU2hhcGUiXSwiU2VhdFNoYXBlIjpbIlNlYXRTaGFwZSJdLCJBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUiOlsiQW1vdW50S2V5d29yZFJlY29yZFNoYXBlIl0sIkFtb3VudFBhdHRlcm5LZXl3b3JkUmVjb3JkU2hhcGUiOlsiQW1vdW50UGF0dGVybktleXdvcmRSZWNvcmRTaGFwZSJdLCJQYXltZW50UEtleXdvcmRSZWNvcmRTaGFwZSI6WyJQYXltZW50UEtleXdvcmRSZWNvcmRTaGFwZSJdLCJJc3N1ZXJLZXl3b3JkUmVjb3JkU2hhcGUiOlsiSXNzdWVyS2V5d29yZFJlY29yZFNoYXBlIl0sIklzc3VlclBLZXl3b3JkUmVjb3JkU2hhcGUiOlsiSXNzdWVyUEtleXdvcmRSZWNvcmRTaGFwZSJdLCJCcmFuZEtleXdvcmRSZWNvcmRTaGFwZSI6WyJCcmFuZEtleXdvcmRSZWNvcmRTaGFwZSJdLCJJc3N1ZXJSZWNvcmRTaGFwZSI6WyJJc3N1ZXJSZWNvcmRTaGFwZSJdLCJUZXJtc1NoYXBlIjpbIlRlcm1zU2hhcGUiXSwiSW5zdGFuY2VSZWNvcmRTaGFwZSI6WyJJbnN0YW5jZVJlY29yZFNoYXBlIl0sIkhhbmRsZUkiOlsiSGFuZGxlSSJdLCJtYWtlSGFuZGxlU2hhcGUiOlsibWFrZUhhbmRsZVNoYXBlIl0sIlRpbWVyU2hhcGUiOlsiVGltZXJTaGFwZSJdLCJGdWxsUHJvcG9zYWxTaGFwZSI6WyJGdWxsUHJvcG9zYWxTaGFwZSJdLCJQcm9wb3NhbFNoYXBlIjpbIlByb3Bvc2FsU2hhcGUiXSwiRW1wdHlQcm9wb3NhbFNoYXBlIjpbIkVtcHR5UHJvcG9zYWxTaGFwZSJdLCJpc09uRGVtYW5kRXhpdFJ1bGUiOlsiaXNPbkRlbWFuZEV4aXRSdWxlIl0sImlzV2FpdmVkRXhpdFJ1bGUiOlsiaXNXYWl2ZWRFeGl0UnVsZSJdLCJpc0FmdGVyRGVhZGxpbmVFeGl0UnVsZSI6WyJpc0FmdGVyRGVhZGxpbmVFeGl0UnVsZSJdLCJJbnZpdGF0aW9uRWxlbWVudFNoYXBlIjpbIkludml0YXRpb25FbGVtZW50U2hhcGUiXSwiT2ZmZXJIYW5kbGVySSI6WyJPZmZlckhhbmRsZXJJIl0sIlNlYXRIYW5kbGVBbGxvY2F0aW9uc1NoYXBlIjpbIlNlYXRIYW5kbGVBbGxvY2F0aW9uc1NoYXBlIl0sIlpvZU1pbnRTaGFwZSI6WyJab2VNaW50U2hhcGUiXSwiWm9lTWludEkiOlsiWm9lTWludEkiXSwiWmNmTWludEkiOlsiWmNmTWludEkiXSwiRmVlTWludEFjY2Vzc1NoYXBlIjpbIkZlZU1pbnRBY2Nlc3NTaGFwZSJdLCJFeGl0T2JqZWN0SSI6WyJFeGl0T2JqZWN0SSJdLCJFeGl0T2JqZWN0U2hhcGUiOlsiRXhpdE9iamVjdFNoYXBlIl0sIkluc3RhbmNlQWRtaW5TaGFwZSI6WyJJbnN0YW5jZUFkbWluU2hhcGUiXSwiSW5zdGFuY2VBZG1pbkkiOlsiSW5zdGFuY2VBZG1pbkkiXSwiSW5zdGFuY2VTdG9yYWdlTWFuYWdlcklLaXQiOlsiSW5zdGFuY2VTdG9yYWdlTWFuYWdlcklLaXQiXSwiQnVuZGxlQ2FwU2hhcGUiOlsiQnVuZGxlQ2FwU2hhcGUiXSwiQnVuZGxlU2hhcGUiOlsiQnVuZGxlU2hhcGUiXSwiVW53cmFwcGVkSW5zdGFsbGF0aW9uU2hhcGUiOlsiVW53cmFwcGVkSW5zdGFsbGF0aW9uU2hhcGUiXSwiWm9lU3RvcmFnZU1hbmFnZXJJS2l0IjpbIlpvZVN0b3JhZ2VNYW5hZ2VySUtpdCJdLCJab2VTZXJ2aWNlSSI6WyJab2VTZXJ2aWNlSSJdLCJBZG1pbkZhY2V0SSI6WyJBZG1pbkZhY2V0SSJdLCJTZWF0RGF0YVNoYXBlIjpbIlNlYXREYXRhU2hhcGUiXSwiSGFuZGxlT2ZmZXJJIjpbIkhhbmRsZU9mZmVySSJdLCJQcmljZVF1b3RlU2hhcGUiOlsiUHJpY2VRdW90ZVNoYXBlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAOkNAWuWBwAAlgcAACAAAABAYWdvcmljL3pvZS12MC4yNi4yL3NyYy90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qIEBqZXNzaWUtY2hlY2sqL1xuXG4vKi8gPHJlZmVyZW5jZSB0eXBlcz1cInNlc1wiLz4qL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7c3RyaW5nfSBIIC0gdGhlIG5hbWUgb2YgdGhlIGhhbmRsZVxuICogQHR5cGVkZWYge0ggJiBYaW1wb3J0KFwiQGVuZG8vbWFyc2hhbFwiKS5SZW1vdGFibGV9IEhhbmRsZSBBIHR5cGUgY29uc3RydWN0b3IgZm9yIGFuIG9wYXF1ZSB0eXBlXG4gKiBpZGVudGlmaWVkIGJ5IHRoZSBIIHN0cmluZy4gVGhpcyB1c2VzIGFuIGludGVyc2VjdGlvbiB0eXBlXG4gKiAoJ015SGFuZGxlJyAmIHt9KSB0byB0YWcgdGhlIGhhbmRsZSdzIHR5cGUgZXZlbiB0aG91Z2ggdGhlIGFjdHVhbFxuICogdmFsdWUgaXMganVzdCBhbiBlbXB0eSBvYmplY3QuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7c3RyaW5nfSBLZXl3b3JkXG4gKiBAdHlwZWRlZiB7SGFuZGxlPCdJbnZpdGF0aW9uJz59IEludml0YXRpb25IYW5kbGUgLSBhbiBvcGFxdWUgaGFuZGxlIGZvciBhbiBpbnZpdGF0aW9uXG4gKiBAdHlwZWRlZiB7UmVjb3JkPEtleXdvcmQsIElzc3Vlcjxhbnk+Pn0gSXNzdWVyS2V5d29yZFJlY29yZFxuICogQHR5cGVkZWYge1JlY29yZDxLZXl3b3JkLCBFUmVmPElzc3Vlcjxhbnk+Pj59IElzc3VlclBLZXl3b3JkUmVjb3JkXG4gKiBAdHlwZWRlZiB7UmVjb3JkPEtleXdvcmQsIEJyYW5kPGFueT4+fSBCcmFuZEtleXdvcmRSZWNvcmRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFN0YW5kYXJkVGVybXNcbiAqIEBwcm9wZXJ0eSB7SXNzdWVyS2V5d29yZFJlY29yZH0gaXNzdWVycyAtIHJlY29yZCB3aXRoXG4gKiBrZXl3b3JkcyBrZXlzLCBpc3N1ZXIgdmFsdWVzXG4gKiBAcHJvcGVydHkge0JyYW5kS2V5d29yZFJlY29yZH0gYnJhbmRzIC0gcmVjb3JkIHdpdGgga2V5d29yZHNcbiAqIGtleXMsIGJyYW5kIHZhbHVlc1xuICpcbiAqIEB0eXBlZGVmIHtTdGFuZGFyZFRlcm1zICYgUmVjb3JkPHN0cmluZywgYW55Pn0gQW55VGVybXNcbiAqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBJbnN0YW5jZVJlY29yZFxuICogQHByb3BlcnR5IHtJbnN0YWxsYXRpb259IGluc3RhbGxhdGlvblxuICogQHByb3BlcnR5IHtYaW1wb3J0KFwiLi96b2VTZXJ2aWNlL3V0aWxzLmpzXCIpLkluc3RhbmNlPGFueT59IGluc3RhbmNlXG4gKiBAcHJvcGVydHkge0FueVRlcm1zfSB0ZXJtcyAtIGNvbnRyYWN0IHBhcmFtZXRlcnNcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBJc3N1ZXJSZWNvcmRcbiAqIEBwcm9wZXJ0eSB7QnJhbmQ8Sz59IGJyYW5kXG4gKiBAcHJvcGVydHkge0lzc3VlcjxLPn0gaXNzdWVyXG4gKiBAcHJvcGVydHkge0t9IGFzc2V0S2luZFxuICogQHByb3BlcnR5IHtEaXNwbGF5SW5mbzxLPn0gW2Rpc3BsYXlJbmZvXVxuICpcbiAqIEB0eXBlZGVmIHtBbW91bnRLZXl3b3JkUmVjb3JkfSBBbGxvY2F0aW9uXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge29iamVjdH0gW1I9dW5rbm93bl0gT2ZmZXIgcmVzdWx0XG4gKiBAdGVtcGxhdGUge29iamVjdH0gW0E9bmV2ZXJdIE9mZmVyIGFyZ3NcbiAqIEB0eXBlZGVmIHtQYXltZW50PCdzZXQnPn0gSW52aXRhdGlvblxuICovXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAHaIg87aAwAA2gMAADIAAABAYWdvcmljL3pvZS12MC4yNi4yL3NyYy96b2VTZXJ2aWNlL2NyZWF0ZVpDRlZhdC5qc3siaW1wb3J0cyI6WyJAZW5kby9ldmVudHVhbC1zZW5kIl0sImV4cG9ydHMiOlsiZ2V0WmNmQnVuZGxlQ2FwIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEU7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuY29uc3R7RmFpbCxxdW90ZTpxfT1hc3NlcnQ7XG5cbmNvbnN0ICAgICAgICBnZXRaY2ZCdW5kbGVDYXA9KHpjZlNwZWMsdmF0QWRtaW5TdmMpPT57XG5sZXQgemNmQnVuZGxlQ2FwUDtcbmlmKHpjZlNwZWMuYnVuZGxlQ2FwKXtcbnpjZkJ1bmRsZUNhcFA9emNmU3BlYy5idW5kbGVDYXA7XG4gfWVsc2UgaWYoemNmU3BlYy5uYW1lKXtcbnpjZkJ1bmRsZUNhcFA9RSh2YXRBZG1pblN2YykuZ2V0TmFtZWRCdW5kbGVDYXAoemNmU3BlYy5uYW1lKTtcbiB9ZWxzZSBpZih6Y2ZTcGVjLmlkKXtcbnpjZkJ1bmRsZUNhcFA9RSh2YXRBZG1pblN2YykuZ2V0QnVuZGxlQ2FwKHpjZlNwZWMuaWQpO1xuIH1lbHNle1xuY29uc3Qga2V5cz1PYmplY3Qua2V5cyh6Y2ZTcGVjKS5qb2luKCcsJyk7XG5GYWlsIGBzZXR1cENyZWF0ZVpDRlZhdDogYmFkIHpjZlNwZWMsIGhhcyBrZXlzICcke3Eoa2V5cyl9J2A7XG4gfVxuXG5yZXR1cm4gemNmQnVuZGxlQ2FwUDtcbiB9OyRo4oCNX29uY2UuZ2V0WmNmQnVuZGxlQ2FwKGdldFpjZkJ1bmRsZUNhcCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZ2V0WmNmQnVuZGxlQ2FwIjpbImdldFpjZkJ1bmRsZUNhcCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAC4AmhA2RIAANkSAAAzAAAAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvem9lU2VydmljZS9lc2Nyb3dTdG9yYWdlLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvZXJ0cCIsIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAYWdvcmljL2Fzc2VydCIsIkBhZ29yaWMvaW50ZXJuYWwiLCJAYWdvcmljL3ZhdC1kYXRhIiwiLi9pbnRlcm5hbC10eXBlcy5qcyIsIi4uL2NsZWFuUHJvcG9zYWwuanMiLCIuLi9vYmpBcnJheUNvbnZlcnNpb24uanMiXSwiZXhwb3J0cyI6WyJwcm92aWRlRXNjcm93U3RvcmFnZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBBbW91bnRNYXRoLEUscSxGYWlsLG9iamVjdE1hcCxwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSxjbGVhbktleXdvcmRzLGFycmF5VG9PYmo7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9lcnRwXCIsIFtbXCJBbW91bnRNYXRoXCIsIFskaOKAjV9hID0+IChBbW91bnRNYXRoID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIiwgWyRo4oCNX2EgPT4gKEUgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9hc3NlcnRcIiwgW1tcInFcIiwgWyRo4oCNX2EgPT4gKHEgPSAkaOKAjV9hKV1dLFtcIkZhaWxcIiwgWyRo4oCNX2EgPT4gKEZhaWwgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9pbnRlcm5hbFwiLCBbW1wib2JqZWN0TWFwXCIsIFskaOKAjV9hID0+IChvYmplY3RNYXAgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy92YXQtZGF0YVwiLCBbW1wicHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmVcIiwgWyRo4oCNX2EgPT4gKHByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlID0gJGjigI1fYSldXV1dLFtcIi4vaW50ZXJuYWwtdHlwZXMuanNcIiwgW11dLFtcIi4uL2NsZWFuUHJvcG9zYWwuanNcIiwgW1tcImNsZWFuS2V5d29yZHNcIiwgWyRo4oCNX2EgPT4gKGNsZWFuS2V5d29yZHMgPSAkaOKAjV9hKV1dXV0sW1wiLi4vb2JqQXJyYXlDb252ZXJzaW9uLmpzXCIsIFtbXCJhcnJheVRvT2JqXCIsIFskaOKAjV9hID0+IChhcnJheVRvT2JqID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBTdG9yZSB0aGUgcG9vbCBwdXJzZXMgd2hvc2UgcHVycG9zZSBpcyB0byBlc2Nyb3cgYXNzZXRzLCB3aXRoIG9uZVxuICogcHVyc2UgcGVyIGJyYW5kLlxuICpcbiAqIEBwYXJhbSB7WGltcG9ydCgnQGFnb3JpYy92YXQtZGF0YScpLkJhZ2dhZ2V9IGJhZ2dhZ2VcbiAqL1xuY29uc3QgICAgICAgIHByb3ZpZGVFc2Nyb3dTdG9yYWdlPShiYWdnYWdlKT0+e1xuLyoqIEB0eXBlIHtXZWFrTWFwU3RvcmU8QnJhbmQsIEVSZWY8UHVyc2U+Pn0gKi9cbmNvbnN0IGJyYW5kVG9QdXJzZT1wcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZShiYWdnYWdlLCdicmFuZFRvUHVyc2UnKTtcblxuLyoqIEB0eXBlIHtDcmVhdGVQdXJzZX0gKi9cbmNvbnN0IGNyZWF0ZVB1cnNlPShpc3N1ZXIsYnJhbmQpPT57XG5pZihicmFuZFRvUHVyc2UuaGFzKGJyYW5kKSl7XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH1cbnJldHVybiBFLndoZW4oXG5FKGlzc3VlcikubWFrZUVtcHR5UHVyc2UoKSxcbihwdXJzZSk9Pntcbi8qIENoZWNrIGFnYWluIGFmdGVyIHRoZSBwcm9taXNlIHJlc29sdmVzKi9cbmlmKCFicmFuZFRvUHVyc2UuaGFzKGJyYW5kKSl7XG5icmFuZFRvUHVyc2UuaW5pdChicmFuZCxwdXJzZSk7XG4gfVxuIH0sXG4oZXJyKT0+XG5GYWlsIGBBIHB1cnNlIGNvdWxkIG5vdCBiZSBjcmVhdGVkIGZvciBicmFuZCAke2JyYW5kfSBiZWNhdXNlOiAke2Vycn1gKTtcblxuIH07XG5cbi8qKlxuICogQHR5cGUge1Byb3ZpZGVMb2NhbFB1cnNlfVxuICovXG5jb25zdCBwcm92aWRlTG9jYWxQdXJzZT0oaXNzdWVyLGJyYW5kKT0+e1xuaWYoYnJhbmRUb1B1cnNlLmhhcyhicmFuZCkpe1xucmV0dXJuICgvKiogQHR5cGUge1B1cnNlfSAqL2JyYW5kVG9QdXJzZS5nZXQoYnJhbmQpKTtcbiB9ZWxzZXtcbmNvbnN0IGxvY2FsUHVyc2U9aXNzdWVyLm1ha2VFbXB0eVB1cnNlKCk7XG5icmFuZFRvUHVyc2UuaW5pdChicmFuZCxsb2NhbFB1cnNlKTtcbnJldHVybiBsb2NhbFB1cnNlO1xuIH1cbiB9O1xuXG4vKiogQHR5cGUge1dpdGhkcmF3UGF5bWVudHN9ICovXG5jb25zdCB3aXRoZHJhd1BheW1lbnRzPShhbGxvY2F0aW9uKT0+XG5vYmplY3RNYXAoYWxsb2NhdGlvbiwoYW1vdW50KT0+XG5FKGJyYW5kVG9QdXJzZS5nZXQoYW1vdW50LmJyYW5kKSkud2l0aGRyYXcoYW1vdW50KSk7XG5cblxuLyoqXG4gKlxuICogIE9ubHkgdXNlZCBpbnRlcm5hbGx5LiBBY3R1YWxseSBkZXBvc2l0IGEgcGF5bWVudCBvciBwcm9taXNlIGZvciBwYXltZW50LlxuICpcbiAqIEBwYXJhbSB7RVJlZjxQYXltZW50Pn0gcGF5bWVudFBcbiAqIEBwYXJhbSB7QW1vdW50fSBhbW91bnRcbiAqIEByZXR1cm5zIHtQcm9taXNlPEFtb3VudD59XG4gKi9cbmNvbnN0IGRvRGVwb3NpdFBheW1lbnQ9KHBheW1lbnRQLGFtb3VudCk9PntcbmNvbnN0IHB1cnNlPWJyYW5kVG9QdXJzZS5nZXQoYW1vdW50LmJyYW5kKTtcbnJldHVybiBFLndoZW4ocGF5bWVudFAsKHBheW1lbnQpPT5FKHB1cnNlKS5kZXBvc2l0KHBheW1lbnQsYW1vdW50KSk7XG4gfTtcblxuLyogUHJvcG9zYWwgaXMgY2xlYW5lZCwgYnV0IHBheW1lbnRzIGFyZSBub3QqL1xuXG4vKiogQHR5cGUge0RlcG9zaXRQYXltZW50c30gKi9cbmNvbnN0IGRlcG9zaXRQYXltZW50cz1hc3luYyhwcm9wb3NhbCxwYXltZW50cyk9PntcbmNvbnN0e2dpdmUsd2FudH09cHJvcG9zYWw7XG5jb25zdCBnaXZlS2V5d29yZHM9T2JqZWN0LmtleXMoZ2l2ZSk7XG5jb25zdCB3YW50S2V5d29yZHM9T2JqZWN0LmtleXMod2FudCk7XG5jb25zdCBwYXltZW50S2V5d29yZHM9Y2xlYW5LZXl3b3JkcyhwYXltZW50cyk7XG5cbi8qIEFzc2VydCB0aGF0IGFsbCBvZiB0aGUgcGF5bWVudCBrZXl3b3JkcyBhcmUgcHJlc2VudCBpbiB0aGUgZ2l2ZSovXG4vKiBrZXl3b3Jkcy4gUHJvcG9zYWwuZ2l2ZSBrZXl3b3JkcyB0aGF0IGRvIG5vdCBoYXZlIG1hdGNoaW5nIHBheW1lbnRzIHdpbGwqL1xuLyogYmUgY2F1Z2h0IGluIHRoZSBkZXBvc2l0IHN0ZXAuKi9cbnBheW1lbnRLZXl3b3Jkcy5mb3JFYWNoKChrZXl3b3JkKT0+e1xuZ2l2ZUtleXdvcmRzLmluY2x1ZGVzKGtleXdvcmQpfHxcbkZhaWwgYFRoZSAke3EoXG5rZXl3b3JkKVxuIH0ga2V5d29yZCBpbiB0aGUgcGF5bWVudEtleXdvcmRSZWNvcmQgd2FzIG5vdCBhIGtleXdvcmQgaW4gcHJvcG9zYWwuZ2l2ZSwgd2hpY2ggaGFkIGtleXdvcmRzOiAke3EoXG5naXZlS2V5d29yZHMpXG4gfWA7XG4gfSk7XG5cbmNvbnN0IHByb3Bvc2FsS2V5d29yZHM9aGFyZGVuKFsuLi5naXZlS2V5d29yZHMsLi4ud2FudEtleXdvcmRzXSk7XG5cbi8qIElmIGFueSBvZiB0aGVzZSBkZXBvc2l0cyBoYW5nIG9yIGZhaWwsIHRoZW4gZGVwb3NpdFBheW1lbnRzKi9cbi8qIGhhbmdzIG9yIGZhaWxzLCB0aGUgb2ZmZXIgZG9lcyBub3Qgc3VjY2VlZCwgYW5kIGFueSBmdW5kcyB0aGF0Ki9cbi8qIHdlcmUgZGVwb3NpdGVkIGludG8gdGhlIHBvb2wgcHVyc2VzIGFyZSBsb3N0LiBXZSBoYXZlIGEgdGlja2V0Ki9cbi8qIGZvciBnaXZpbmcgdGhlIHVzZXIgYSByZWZ1bmQgb2Ygd2hhdCB3YXMgYWxyZWFkeSBkZXBvc2l0ZWQsIGFuZCovXG4vKiBvZmZlciBzYWZldHkgYW5kIHBheW91dCBsaXZlbmVzcyBhcmUgc3RpbGwgbWVhbmluZ2Z1bCBhcyBsb25nKi9cbi8qIGFzIGlzc3VlcnMgYXJlIHdlbGwtYmVoYXZlZC4gRm9yIG1vcmUsIHNlZSovXG4vKiBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzEyNzEqL1xuY29uc3QgYW1vdW50c0RlcG9zaXRlZD1hd2FpdCBQcm9taXNlLmFsbChcbmdpdmVLZXl3b3Jkcy5tYXAoKGtleXdvcmQpPT57XG5wYXltZW50c1trZXl3b3JkXSE9PXVuZGVmaW5lZHx8XG5GYWlsIGBUaGUgJHtxKFxua2V5d29yZClcbiB9IGtleXdvcmQgaW4gcHJvcG9zYWwuZ2l2ZSBkaWQgbm90IGhhdmUgYW4gYXNzb2NpYXRlZCBwYXltZW50IGluIHRoZSBwYXltZW50S2V5d29yZFJlY29yZCwgd2hpY2ggaGFkIGtleXdvcmRzOiAke3EoXG5wYXltZW50S2V5d29yZHMpXG4gfWA7XG5yZXR1cm4gZG9EZXBvc2l0UGF5bWVudChwYXltZW50c1trZXl3b3JkXSxnaXZlW2tleXdvcmRdKTtcbiB9KSk7XG5cblxuY29uc3QgZW1wdHlBbW91bnRzRm9yV2FudEtleXdvcmRzPXdhbnRLZXl3b3Jkcy5tYXAoKGtleXdvcmQpPT5cbkFtb3VudE1hdGgubWFrZUVtcHR5RnJvbUFtb3VudCh3YW50W2tleXdvcmRdKSk7XG5cblxuY29uc3QgaW5pdGlhbEFsbG9jYXRpb249YXJyYXlUb09iaihcblsuLi5hbW91bnRzRGVwb3NpdGVkLC4uLmVtcHR5QW1vdW50c0ZvcldhbnRLZXl3b3Jkc10sXG5wcm9wb3NhbEtleXdvcmRzKTtcblxuXG5yZXR1cm4gaW5pdGlhbEFsbG9jYXRpb247XG4gfTtcblxucmV0dXJue1xuY3JlYXRlUHVyc2UsLyogY3JlYXRlUHVyc2UgZG9lcyBub3QgcmV0dXJuIGEgcHVyc2UqL1xucHJvdmlkZUxvY2FsUHVyc2UsXG53aXRoZHJhd1BheW1lbnRzLFxuZGVwb3NpdFBheW1lbnRzfTtcblxuIH07JGjigI1fb25jZS5wcm92aWRlRXNjcm93U3RvcmFnZShwcm92aWRlRXNjcm93U3RvcmFnZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicHJvdmlkZUVzY3Jvd1N0b3JhZ2UiOlsicHJvdmlkZUVzY3Jvd1N0b3JhZ2UiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAS8UAlXoNAAB6DQAALQAAAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL3pvZVNlcnZpY2UvZmVlTWludC5qc3siaW1wb3J0cyI6WyJAYWdvcmljL2VydHAiLCJAYWdvcmljL3N0b3JlIiwiQGFnb3JpYy92YXQtZGF0YSIsIi4uL3R5cGVHdWFyZHMuanMiXSwiZXhwb3J0cyI6WyJkZWZhdWx0RmVlSXNzdWVyQ29uZmlnIiwicHJlcGFyZUZlZU1pbnQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgQXNzZXRLaW5kLElzc3VlclNoYXBlLEJyYW5kU2hhcGUscHJlcGFyZUlzc3VlcktpdCxoYXNJc3N1ZXIsaW5pdEVtcHR5LE0scHJvdmlkZUR1cmFibGVNYXBTdG9yZSxwcm92aWRlLHByZXBhcmVFeG9DbGFzc0tpdCxGZWVNaW50QWNjZXNzU2hhcGU7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9lcnRwXCIsIFtbXCJBc3NldEtpbmRcIiwgWyRo4oCNX2EgPT4gKEFzc2V0S2luZCA9ICRo4oCNX2EpXV0sW1wiSXNzdWVyU2hhcGVcIiwgWyRo4oCNX2EgPT4gKElzc3VlclNoYXBlID0gJGjigI1fYSldXSxbXCJCcmFuZFNoYXBlXCIsIFskaOKAjV9hID0+IChCcmFuZFNoYXBlID0gJGjigI1fYSldXSxbXCJwcmVwYXJlSXNzdWVyS2l0XCIsIFskaOKAjV9hID0+IChwcmVwYXJlSXNzdWVyS2l0ID0gJGjigI1fYSldXSxbXCJoYXNJc3N1ZXJcIiwgWyRo4oCNX2EgPT4gKGhhc0lzc3VlciA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJpbml0RW1wdHlcIiwgWyRo4oCNX2EgPT4gKGluaXRFbXB0eSA9ICRo4oCNX2EpXV0sW1wiTVwiLCBbJGjigI1fYSA9PiAoTSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJwcm92aWRlRHVyYWJsZU1hcFN0b3JlXCIsIFskaOKAjV9hID0+IChwcm92aWRlRHVyYWJsZU1hcFN0b3JlID0gJGjigI1fYSldXSxbXCJwcm92aWRlXCIsIFskaOKAjV9hID0+IChwcm92aWRlID0gJGjigI1fYSldXSxbXCJwcmVwYXJlRXhvQ2xhc3NLaXRcIiwgWyRo4oCNX2EgPT4gKHByZXBhcmVFeG9DbGFzc0tpdCA9ICRo4oCNX2EpXV1dXSxbXCIuLi90eXBlR3VhcmRzLmpzXCIsIFtbXCJGZWVNaW50QWNjZXNzU2hhcGVcIiwgWyRo4oCNX2EgPT4gKEZlZU1pbnRBY2Nlc3NTaGFwZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0e0ZhaWwscXVvdGU6cX09YXNzZXJ0O1xuXG4vKiogQGRlcHJlY2F0ZWQgUmVkdW5kYW50LiBKdXN0IG9taXQgaXQuICovXG5jb25zdCBGRUVfTUlOVF9LSVQ9J0ZlZU1pbnRLaXQnO1xuXG5jb25zdCAgICAgICAgZGVmYXVsdEZlZUlzc3VlckNvbmZpZz1oYXJkZW4oXG4vKiogQHR5cGUge2NvbnN0fSAqL3tcbm5hbWU6J1pERUZBVUxUJyxcbmFzc2V0S2luZDpBc3NldEtpbmQuTkFULFxuZGlzcGxheUluZm86aGFyZGVuKHtkZWNpbWFsUGxhY2VzOjYsYXNzZXRLaW5kOkFzc2V0S2luZC5OQVR9KX0pO1xuXG5cblxuLyoqXG4gKiBAcGFyYW0ge1hpbXBvcnQoJ0BhZ29yaWMvdmF0LWRhdGEnKS5CYWdnYWdlfSB6b2VCYWdnYWdlXG4gKiBAcGFyYW0ge0ZlZUlzc3VlckNvbmZpZ30gZmVlSXNzdWVyQ29uZmlnXG4gKiBAcGFyYW0ge1NodXRkb3duV2l0aEZhaWx1cmV9IHNodXRkb3duWm9lVmF0XG4gKi8kaOKAjV9vbmNlLmRlZmF1bHRGZWVJc3N1ZXJDb25maWcoZGVmYXVsdEZlZUlzc3VlckNvbmZpZyk7XG5jb25zdCBwcmVwYXJlRmVlTWludD0oem9lQmFnZ2FnZSxmZWVJc3N1ZXJDb25maWcsc2h1dGRvd25ab2VWYXQpPT57XG5jb25zdCBtaW50QmFnZ2FnZT1wcm92aWRlRHVyYWJsZU1hcFN0b3JlKHpvZUJhZ2dhZ2UsJ21pbnRCYWdnYWdlJyk7XG5pZihtaW50QmFnZ2FnZS5oYXMoRkVFX01JTlRfS0lUKSl7XG5oYXNJc3N1ZXIobWludEJhZ2dhZ2UpfHxcbkZhaWwgYExlZ2FjeSAke3EoXG5GRUVfTUlOVF9LSVQpXG4gfSBtdXN0IGJlIHJlZHVuZGFudCB3aXRoIG5vcm1hbCBzdG9yaW5nIG9mIGlzc3VlcktpdCBpbiBpc3N1ZXJCYWdnYWdlYDtcbi8qIFVwZ3JhZGUgdGhpcyBsZWdhY3kgc3RhdGUgYnkgc2ltcGx5IGRlbGV0aW5nIGl0LiovXG5taW50QmFnZ2FnZS5kZWxldGUoRkVFX01JTlRfS0lUKTtcbiB9XG5cbmNvbnN0IGZlZUlzc3VlcktpdD0vKiogQHR5cGUge0lzc3VlcktpdDwnbmF0Jz59ICovXG5wcmVwYXJlSXNzdWVyS2l0KFxubWludEJhZ2dhZ2UsXG5mZWVJc3N1ZXJDb25maWcubmFtZSxcbmZlZUlzc3VlckNvbmZpZy5hc3NldEtpbmQsXG5mZWVJc3N1ZXJDb25maWcuZGlzcGxheUluZm8sXG5zaHV0ZG93blpvZVZhdCk7XG5cblxuXG5jb25zdCBGZWVNaW50SUtpdD1oYXJkZW4oe1xuZmVlTWludDpNLmludGVyZmFjZSgnRmVlTWludCcse1xuZ2V0RmVlSXNzdWVyS2l0Ok0uY2FsbChGZWVNaW50QWNjZXNzU2hhcGUpLnJldHVybnMoTS5yZWNvcmQoKSksXG5nZXRGZWVJc3N1ZXI6TS5jYWxsKCkucmV0dXJucyhJc3N1ZXJTaGFwZSksXG5nZXRGZWVCcmFuZDpNLmNhbGwoKS5yZXR1cm5zKEJyYW5kU2hhcGUpfSksXG5cbmZlZU1pbnRBY2Nlc3M6TS5pbnRlcmZhY2UoJ0ZlZU1pbnRBY2Nlc3MnLHt9KX0pO1xuXG5cbmNvbnN0IG1ha2VGZWVNaW50S2l0PXByZXBhcmVFeG9DbGFzc0tpdChcbm1pbnRCYWdnYWdlLFxuJ0ZlZU1pbnQnLFxuRmVlTWludElLaXQsXG5pbml0RW1wdHksXG57XG5mZWVNaW50OntcbmdldEZlZUlzc3VlcktpdChhbGxlZ2VkRmVlTWludEFjY2Vzcyl7XG5jb25zdHtmYWNldHN9PXRoaXM7XG5mYWNldHMuZmVlTWludEFjY2Vzcz09PWFsbGVnZWRGZWVNaW50QWNjZXNzfHxcbkZhaWwgYFRoZSBvYmplY3QgcmVwcmVzZW50aW5nIGFjY2VzcyB0byB0aGUgZmVlIGJyYW5kIG1pbnQgd2FzIG5vdCBwcm92aWRlZGA7XG5yZXR1cm4gZmVlSXNzdWVyS2l0O1xuIH0sXG5nZXRGZWVJc3N1ZXIoKXtcbnJldHVybiBmZWVJc3N1ZXJLaXQuaXNzdWVyO1xuIH0sXG5nZXRGZWVCcmFuZCgpe1xucmV0dXJuIGZlZUlzc3VlcktpdC5icmFuZDtcbiB9fSxcblxuLyogZmVlTWludEFjY2VzcyBpcyBhbiBvcGFxdWUgZHVyYWJsZSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSByaWdodCB0byBnZXQqL1xuLyogdGhlIGZlZSBtaW50LiovXG5mZWVNaW50QWNjZXNzOnt9fSk7XG5cblxuXG5yZXR1cm4gcHJvdmlkZSh6b2VCYWdnYWdlLCd0aGVGZWVNaW50JywoKT0+bWFrZUZlZU1pbnRLaXQoKSk7XG4gfTskaOKAjV9vbmNlLnByZXBhcmVGZWVNaW50KHByZXBhcmVGZWVNaW50KTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJwcmVwYXJlRmVlTWludCI6WyJwcmVwYXJlRmVlTWludCJdLCJkZWZhdWx0RmVlSXNzdWVyQ29uZmlnIjpbImRlZmF1bHRGZWVJc3N1ZXJDb25maWciXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA1X/sJOcXAADnFwAAOQAAAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL3pvZVNlcnZpY2UvaW5zdGFsbGF0aW9uU3RvcmFnZS5qc3siaW1wb3J0cyI6WyJAYWdvcmljL2Fzc2VydCIsIkBhZ29yaWMvdmF0LWRhdGEiLCIuLi90eXBlR3VhcmRzLmpzIl0sImV4cG9ydHMiOlsibWFrZUluc3RhbGxhdGlvblN0b3JhZ2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0LE0scHJlcGFyZUV4byxwcmVwYXJlS2luZCxwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSxJbnN0YWxsYXRpb25TaGFwZSxJbnN0YW5jZUhhbmRsZVNoYXBlLFVud3JhcHBlZEluc3RhbGxhdGlvblNoYXBlOyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvYXNzZXJ0XCIsIFtbXCJhc3NlcnRcIiwgWyRo4oCNX2EgPT4gKGFzc2VydCA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJNXCIsIFskaOKAjV9hID0+IChNID0gJGjigI1fYSldXSxbXCJwcmVwYXJlRXhvXCIsIFskaOKAjV9hID0+IChwcmVwYXJlRXhvID0gJGjigI1fYSldXSxbXCJwcmVwYXJlS2luZFwiLCBbJGjigI1fYSA9PiAocHJlcGFyZUtpbmQgPSAkaOKAjV9hKV1dLFtcInByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlXCIsIFskaOKAjV9hID0+IChwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSA9ICRo4oCNX2EpXV1dXSxbXCIuLi90eXBlR3VhcmRzLmpzXCIsIFtbXCJJbnN0YWxsYXRpb25TaGFwZVwiLCBbJGjigI1fYSA9PiAoSW5zdGFsbGF0aW9uU2hhcGUgPSAkaOKAjV9hKV1dLFtcIkluc3RhbmNlSGFuZGxlU2hhcGVcIiwgWyRo4oCNX2EgPT4gKEluc3RhbmNlSGFuZGxlU2hhcGUgPSAkaOKAjV9hKV1dLFtcIlVud3JhcHBlZEluc3RhbGxhdGlvblNoYXBlXCIsIFskaOKAjV9hID0+IChVbndyYXBwZWRJbnN0YWxsYXRpb25TaGFwZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuY29uc3R7RmFpbCxxdW90ZTpxfT1hc3NlcnQ7XG5cbi8qKiBAdHlwZWRlZiB7IFhpbXBvcnQoJ0BhZ29yaWMvc3dpbmdzZXQtdmF0JykuQnVuZGxlQ2FwfSBCdW5kbGVDYXAgKi9cbi8qKiBAdHlwZWRlZiB7IFhpbXBvcnQoJ0BhZ29yaWMvc3dpbmdzZXQtdmF0JykuQnVuZGxlSUR9IEJ1bmRsZUlEICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BhZ29yaWMvdmF0LWRhdGEnKS5CYWdnYWdlfSBCYWdnYWdlICovXG5cbi8qKlxuICogQHBhcmFtIHtHZXRCdW5kbGVDYXBGb3JJRH0gZ2V0QnVuZGxlQ2FwRm9ySURcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gem9lQmFnZ2FnZVxuICovXG5jb25zdCAgICAgICAgbWFrZUluc3RhbGxhdGlvblN0b3JhZ2U9KGdldEJ1bmRsZUNhcEZvcklELHpvZUJhZ2dhZ2UpPT57XG4vKiogQHR5cGUge1dlYWtNYXBTdG9yZTxJbnN0YWxsYXRpb24sIHsgYnVuZGxlQ2FwOiBCdW5kbGVDYXAsIGJ1bmRsZUlEOiBCdW5kbGVJRCB9Pn0gKi9cbmNvbnN0IGluc3RhbGxhdGlvbnNCdW5kbGVDYXA9cHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUoXG56b2VCYWdnYWdlLFxuJ2luc3RhbGxhdGlvbnNCdW5kbGVDYXAnKTtcblxuLyoqIEB0eXBlIHtXZWFrTWFwU3RvcmU8SW5zdGFsbGF0aW9uLCBTb3VyY2VCdW5kbGU+fSAqL1xuY29uc3QgaW5zdGFsbGF0aW9uc0J1bmRsZT1wcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZShcbnpvZUJhZ2dhZ2UsXG4naW5zdGFsbGF0aW9uc0J1bmRsZScpO1xuXG5cbmNvbnN0IG1ha2VCdW5kbGVJREluc3RhbGxhdGlvbj1wcmVwYXJlS2luZChcbnpvZUJhZ2dhZ2UsXG4nQnVuZGxlSURJbnN0YWxsYXRpb24nLFxuKGJ1bmRsZUxhYmVsKT0+KHtidW5kbGVMYWJlbH0pLFxue1xuZ2V0QnVuZGxlOihfY29udGV4dCk9PkZhaWwgYGJ1bmRsZUlELWJhc2VkIEluc3RhbGxhdGlvbmAsXG5nZXRCdW5kbGVMYWJlbDooe3N0YXRlOntidW5kbGVMYWJlbH19KT0+YnVuZGxlTGFiZWx9KTtcblxuXG5cbmNvbnN0IG1ha2VCdW5kbGVJbnN0YWxsYXRpb249cHJlcGFyZUtpbmQoXG56b2VCYWdnYWdlLFxuJ0J1bmRsZUluc3RhbGxhdGlvbicsXG4oYnVuZGxlLGJ1bmRsZUxhYmVsKT0+KHtidW5kbGUsYnVuZGxlTGFiZWx9KSxcbntcbmdldEJ1bmRsZTooe3N0YXRlOntidW5kbGV9fSk9PmJ1bmRsZSxcbmdldEJ1bmRsZUxhYmVsOih7c3RhdGU6e2J1bmRsZUxhYmVsfX0pPT5idW5kbGVMYWJlbH0pO1xuXG5cblxuLyoqXG4gKiBDcmVhdGUgYW4gaW5zdGFsbGF0aW9uIGZyb20gYSBidW5kbGUgSUQgb3IgYSBmdWxsIGJ1bmRsZS4gSWYgd2UgYXJlXG4gKiBnaXZlbiBhIGJ1bmRsZSBJRCwgd2FpdCBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgY29kZSBidW5kbGUgdG8gYmUgcmVjZWl2ZWRcbiAqIGJ5IHRoZSBzd2luZ3NldCBrZXJuZWwsIHRoZW4gc3RvcmUgaXRzIGJ1bmRsZWNhcC4gVGhlIGNvZGUgaXMgY3VycmVudGx5XG4gKiBldmFsdWF0ZWQgZWFjaCB0aW1lIGl0IGlzIHVzZWQgdG8gbWFrZSBhIG5ldyBpbnN0YW5jZSBvZiBhIGNvbnRyYWN0LlxuICogV2hlbiBTd2luZ1NldCBzdXBwb3J0cyB6eWdvdGVzLCB0aGUgY29kZSB3aWxsIGJlIGV2YWx1YXRlZCBvbmNlIHdoZW5cbiAqIGNyZWF0aW5nIGEgemNmWnlnb3RlLCB0aGVuIHRoZSBzdGFydCgpIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGVhY2ggdGltZVxuICogYW4gaW5zdGFuY2UgaXMgc3RhcnRlZC5cbiAqL1xuXG4vKiogQHR5cGUge0luc3RhbGxCdW5kbGV9ICovXG5jb25zdCBpbnN0YWxsU291cmNlQnVuZGxlPWFzeW5jKGJ1bmRsZSxidW5kbGVMYWJlbCk9PntcbnR5cGVvZiBidW5kbGU9PT0nb2JqZWN0J3x8RmFpbCBgYSBidW5kbGUgbXVzdCBiZSBwcm92aWRlZGA7XG4vKiogQHR5cGUge0luc3RhbGxhdGlvbn0gKi9cbmJ1bmRsZXx8RmFpbCBgYSBidW5kbGUgbXVzdCBiZSBwcm92aWRlZGA7XG4vKiogQHR5cGUge0luc3RhbGxhdGlvbn0gKi9cbi8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCovXG5jb25zdCBpbnN0YWxsYXRpb249bWFrZUJ1bmRsZUluc3RhbGxhdGlvbihidW5kbGUsYnVuZGxlTGFiZWwpO1xuaW5zdGFsbGF0aW9uc0J1bmRsZS5pbml0KGluc3RhbGxhdGlvbixidW5kbGUpO1xucmV0dXJuIGluc3RhbGxhdGlvbjtcbiB9O1xuXG5jb25zdCBJbnN0YWxsYXRpb25TdG9yYWdlST1NLmludGVyZmFjZSgnSW5zdGFsbGF0aW9uU3RvcmFnZScse1xuaW5zdGFsbEJ1bmRsZTpNLmNhbGwoXG5NLm9yKFxuSW5zdGFuY2VIYW5kbGVTaGFwZSxcbk0ucmVjb3JkT2YoTS5zdHJpbmcoKSxNLnN0cmluZyh7c3RyaW5nTGVuZ3RoTGltaXQ6SW5maW5pdHl9KSkpKS5cblxucmV0dXJucyhNLnByb21pc2UoKSksXG5pbnN0YWxsQnVuZGxlSUQ6TS5jYWxsKE0uc3RyaW5nKCkpLnJldHVybnMoTS5wcm9taXNlKCkpLFxudW53cmFwSW5zdGFsbGF0aW9uOk0uY2FsbFdoZW4oTS5hd2FpdChJbnN0YWxsYXRpb25TaGFwZSkpLnJldHVybnMoXG5VbndyYXBwZWRJbnN0YWxsYXRpb25TaGFwZSksXG5cbmdldEJ1bmRsZUlERnJvbUluc3RhbGxhdGlvbjpNLmNhbGxXaGVuKE0uYXdhaXQoSW5zdGFsbGF0aW9uU2hhcGUpKS5yZXR1cm5zKFxuTS5lcmVmKE0uc3RyaW5nKCkpKX0pO1xuXG5cblxuY29uc3QgaW5zdGFsbGF0aW9uU3RvcmFnZT1wcmVwYXJlRXhvKFxuem9lQmFnZ2FnZSxcbidJbnN0YWxsYXRpb25TdG9yYWdlJyxcbkluc3RhbGxhdGlvblN0b3JhZ2VJLFxue1xuICAgICAgYXN5bmMgaW5zdGFsbEJ1bmRsZShhbGxlZ2VkQnVuZGxlLGJ1bmRsZUxhYmVsKXtcbi8qIEB0cy1leHBlY3QtZXJyb3IgVFMgZG9lc24ndCB1bmRlcnN0YW5kIGNvbnRleHQqL1xuY29uc3R7c2VsZn09dGhpcztcbi8qIEJ1bmRsZSBpcyBhIHZlcnkgb3Blbi1lbmRlZCB0eXBlIGFuZCB3ZSBtdXN0IGRlY2lkZSBoZXJlIHdoZXRoZXIgdG8qL1xuLyogdHJlYXQgaXQgYXMgZWl0aGVyIGEgSGFzaEJ1bmRsZSBvciBTb3VyY2VCdW5kbGUuIFNvIHdlIGhhdmUgdG8qL1xuLyogaW5zcGVjdCBpdC4qL1xudHlwZW9mIGFsbGVnZWRCdW5kbGU9PT0nb2JqZWN0J3x8RmFpbCBgYSBidW5kbGUgbXVzdCBiZSBwcm92aWRlZGA7XG5hbGxlZ2VkQnVuZGxlIT09bnVsbHx8RmFpbCBgYSBidW5kbGUgbXVzdCBiZSBwcm92aWRlZGA7XG5jb25zdHttb2R1bGVGb3JtYXR9PWFsbGVnZWRCdW5kbGU7XG5pZihtb2R1bGVGb3JtYXQ9PT0nZW5kb1ppcEJhc2U2NFNoYTUxMicpe1xuY29uc3R7ZW5kb1ppcEJhc2U2NFNoYTUxMn09YWxsZWdlZEJ1bmRsZTtcbnR5cGVvZiBlbmRvWmlwQmFzZTY0U2hhNTEyPT09J3N0cmluZyd8fFxuRmFpbCBgYnVuZGxlIGVuZG9aaXBCYXNlNjRTaGE1MTIgbXVzdCBiZSBhIHN0cmluZywgZ290ICR7cShcbmVuZG9aaXBCYXNlNjRTaGE1MTIpXG4gfWA7XG5yZXR1cm4gc2VsZi5pbnN0YWxsQnVuZGxlSUQoIGBiMS0ke2VuZG9aaXBCYXNlNjRTaGE1MTJ9YCxidW5kbGVMYWJlbCk7XG4gfVxucmV0dXJuIGluc3RhbGxTb3VyY2VCdW5kbGUoYWxsZWdlZEJ1bmRsZSxidW5kbGVMYWJlbCk7XG4gfSxcbiAgICAgIGFzeW5jIGluc3RhbGxCdW5kbGVJRChidW5kbGVJRCxidW5kbGVMYWJlbD1idW5kbGVJRC5zbGljZSgwLDkpKXtcbnR5cGVvZiBidW5kbGVJRD09PSdzdHJpbmcnfHxGYWlsIGBhIGJ1bmRsZSBJRCBtdXN0IGJlIHByb3ZpZGVkYDtcbnR5cGVvZiBidW5kbGVMYWJlbD09PSdzdHJpbmcnfHxcbkZhaWwgYGEgYnVuZGxlIGxhYmVsIG11c3QgYmUgYSBzdHJpbmdgO1xuXG4vKiB0aGlzIHdhaXRzIHVudGlsIHNvbWVvbmUgdGVsbHMgdGhlIGhvc3QgYXBwbGljYXRpb24gdG8gc3RvcmUgdGhlKi9cbi8qIGJ1bmRsZSBpbnRvIHRoZSBrZXJuZWwsIHdpdGggY29udHJvbGxlci52YWxpZGF0ZUFuZEluc3RhbGxCdW5kbGUoKSovXG5jb25zdCBidW5kbGVDYXA9YXdhaXQgZ2V0QnVuZGxlQ2FwRm9ySUQoYnVuZGxlSUQpO1xuLyogQVdBSVQqL1xuXG4vKiogQHR5cGUge0luc3RhbGxhdGlvbn0gKi9cbi8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCovXG5jb25zdCBpbnN0YWxsYXRpb249bWFrZUJ1bmRsZUlESW5zdGFsbGF0aW9uKGJ1bmRsZUxhYmVsKTtcbmluc3RhbGxhdGlvbnNCdW5kbGVDYXAuaW5pdChcbmluc3RhbGxhdGlvbixcbmhhcmRlbih7YnVuZGxlQ2FwLGJ1bmRsZUlEfSkpO1xuXG5yZXR1cm4gaW5zdGFsbGF0aW9uO1xuIH0sXG51bndyYXBJbnN0YWxsYXRpb24oaW5zdGFsbGF0aW9uKXtcbmlmKGluc3RhbGxhdGlvbnNCdW5kbGVDYXAuaGFzKGluc3RhbGxhdGlvbikpe1xuY29uc3R7YnVuZGxlQ2FwLGJ1bmRsZUlEfT1cbmluc3RhbGxhdGlvbnNCdW5kbGVDYXAuZ2V0KGluc3RhbGxhdGlvbik7XG5yZXR1cm57YnVuZGxlQ2FwLGJ1bmRsZUlELGluc3RhbGxhdGlvbn07XG4gfWVsc2UgaWYoaW5zdGFsbGF0aW9uc0J1bmRsZS5oYXMoaW5zdGFsbGF0aW9uKSl7XG5jb25zdCBidW5kbGU9aW5zdGFsbGF0aW9uc0J1bmRsZS5nZXQoaW5zdGFsbGF0aW9uKTtcbnJldHVybntidW5kbGUsaW5zdGFsbGF0aW9ufTtcbiB9ZWxzZXtcbnRocm93IEZhaWwgYCR7aW5zdGFsbGF0aW9ufSB3YXMgbm90IGEgdmFsaWQgaW5zdGFsbGF0aW9uYDtcbiB9XG4gfSxcbiAgICAgIGFzeW5jIGdldEJ1bmRsZUlERnJvbUluc3RhbGxhdGlvbihhbGxlZ2VkSW5zdGFsbGF0aW9uKXtcbi8qIEB0cy1leHBlY3QtZXJyb3IgVFMgZG9lc24ndCB1bmRlcnN0YW5kIGNvbnRleHQqL1xuY29uc3R7c2VsZn09dGhpcztcbmNvbnN0e2J1bmRsZUlEfT1hd2FpdCBzZWxmLnVud3JhcEluc3RhbGxhdGlvbihhbGxlZ2VkSW5zdGFsbGF0aW9uKTtcbi8qIEFXQUlUKi9cbmJ1bmRsZUlEfHxGYWlsIGBpbnN0YWxsYXRpb24gZG9lcyBub3QgaGF2ZSBhIGJ1bmRsZSBJRGA7XG5yZXR1cm4gYnVuZGxlSUQ7XG4gfX0pO1xuXG5cblxucmV0dXJuIGluc3RhbGxhdGlvblN0b3JhZ2U7XG4gfTskaOKAjV9vbmNlLm1ha2VJbnN0YWxsYXRpb25TdG9yYWdlKG1ha2VJbnN0YWxsYXRpb25TdG9yYWdlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlSW5zdGFsbGF0aW9uU3RvcmFnZSI6WyJtYWtlSW5zdGFsbGF0aW9uU3RvcmFnZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAp6yCoLygAAC8oAAA6AAAAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvem9lU2VydmljZS9pbnN0YW5jZUFkbWluU3RvcmFnZS5qc3siaW1wb3J0cyI6WyJAYWdvcmljL3ZhdC1kYXRhIiwiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIi4uL21ha2VIYW5kbGUuanMiLCIuLi90eXBlR3VhcmRzLmpzIiwiLi96b2VTZWF0LmpzIl0sImV4cG9ydHMiOlsibWFrZUluc3RhbmNlQWRtaW5NYWtlciIsIm1ha2VJbnN0YW5jZUFkbWluU3RvcmFnZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBjYW5CZUR1cmFibGUsbWFrZVNjYWxhckJpZ1NldFN0b3JlLHByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlLHByZXBhcmVLaW5kTXVsdGkscHJlcGFyZUV4b0NsYXNzS2l0LE0scHJvdmlkZSxFLGRlZmluZUR1cmFibGVIYW5kbGUsQnJhbmRLZXl3b3JkUmVjb3JkU2hhcGUsSW5zdGFuY2VBZG1pblNoYXBlLEluc3RhbmNlSGFuZGxlU2hhcGUsSXNzdWVyS2V5d29yZFJlY29yZFNoYXBlLG1ha2Vab2VTZWF0QWRtaW5GYWN0b3J5OyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvdmF0LWRhdGFcIiwgW1tcImNhbkJlRHVyYWJsZVwiLCBbJGjigI1fYSA9PiAoY2FuQmVEdXJhYmxlID0gJGjigI1fYSldXSxbXCJtYWtlU2NhbGFyQmlnU2V0U3RvcmVcIiwgWyRo4oCNX2EgPT4gKG1ha2VTY2FsYXJCaWdTZXRTdG9yZSA9ICRo4oCNX2EpXV0sW1wicHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmVcIiwgWyRo4oCNX2EgPT4gKHByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlID0gJGjigI1fYSldXSxbXCJwcmVwYXJlS2luZE11bHRpXCIsIFskaOKAjV9hID0+IChwcmVwYXJlS2luZE11bHRpID0gJGjigI1fYSldXSxbXCJwcmVwYXJlRXhvQ2xhc3NLaXRcIiwgWyRo4oCNX2EgPT4gKHByZXBhcmVFeG9DbGFzc0tpdCA9ICRo4oCNX2EpXV0sW1wiTVwiLCBbJGjigI1fYSA9PiAoTSA9ICRo4oCNX2EpXV0sW1wicHJvdmlkZVwiLCBbJGjigI1fYSA9PiAocHJvdmlkZSA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXV1dLFtcIi4uL21ha2VIYW5kbGUuanNcIiwgW1tcImRlZmluZUR1cmFibGVIYW5kbGVcIiwgWyRo4oCNX2EgPT4gKGRlZmluZUR1cmFibGVIYW5kbGUgPSAkaOKAjV9hKV1dXV0sW1wiLi4vdHlwZUd1YXJkcy5qc1wiLCBbW1wiQnJhbmRLZXl3b3JkUmVjb3JkU2hhcGVcIiwgWyRo4oCNX2EgPT4gKEJyYW5kS2V5d29yZFJlY29yZFNoYXBlID0gJGjigI1fYSldXSxbXCJJbnN0YW5jZUFkbWluU2hhcGVcIiwgWyRo4oCNX2EgPT4gKEluc3RhbmNlQWRtaW5TaGFwZSA9ICRo4oCNX2EpXV0sW1wiSW5zdGFuY2VIYW5kbGVTaGFwZVwiLCBbJGjigI1fYSA9PiAoSW5zdGFuY2VIYW5kbGVTaGFwZSA9ICRo4oCNX2EpXV0sW1wiSXNzdWVyS2V5d29yZFJlY29yZFNoYXBlXCIsIFskaOKAjV9hID0+IChJc3N1ZXJLZXl3b3JkUmVjb3JkU2hhcGUgPSAkaOKAjV9hKV1dXV0sW1wiLi96b2VTZWF0LmpzXCIsIFtbXCJtYWtlWm9lU2VhdEFkbWluRmFjdG9yeVwiLCBbJGjigI1fYSA9PiAobWFrZVpvZVNlYXRBZG1pbkZhY3RvcnkgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuY29uc3R7cXVvdGU6cSxGYWlsfT1hc3NlcnQ7XG5cbi8qKlxuICogQGZpbGUgVHdvIG9iamVjdHMgYXJlIGRlZmluZWQgaGVyZSwgYm90aCBjYWxsZWQgSW5zdGFuY2VBZG1pblNvbWV0aGluZy5cbiAqIEluc3RhbmNlQWRtaW5TdG9yYWdlIGlzIGEgY29udGFpbmVyIGZvciBpbmRpdmlkdWFsIEluc3RhbmNlQWRtaW5zLiBFYWNoXG4gKiBJbnN0YW5jZUFkbWluIGlzIGFzc29jaWF0ZWQgd2l0aCBhIHBhcnRpY3VsYXIgY29udHJhY3QgaW5zdGFuY2UsIGFuZCBpcyB1c2VkXG4gKiBieSBib3RoIFpvZSBhbmQgWkNGIHRvIHJlY29yZCBhbmQgYWNjZXNzIHRoZSBpbnN0YW5jZSBzdGF0ZS4gc3RhcnRJbnN0YW5jZVxuICogYWxzbyBkZWZpbmVzIHpvZUluc3RhbmNlQWRtaW4sIHdoaWNoIGlzIGEgZmFjZXQgdGhhdCBpcyBwYXNzZWQgdG8gc3RhcnRaY2YoKVxuICogdGhhdCB3cmFwcyBhY2Nlc3MgdG8gYSB6b2VJbnN0YW5jZUFkbWluIGFuZCBvdGhlciBzdG9yZXMuXG4gKi9cblxuY29uc3QgSW5zdGFuY2VBZG1pblN0b3JhZ2VJS2l0PWhhcmRlbih7XG5hY2Nlc3NvcjpNLmludGVyZmFjZSgnSW5zdGFuY2VBZG1pblN0b3JhZ2UnLHtcbmdldFB1YmxpY0ZhY2V0Ok0uY2FsbFdoZW4oTS5hd2FpdChJbnN0YW5jZUhhbmRsZVNoYXBlKSkucmV0dXJucyhcbk0ucmVtb3RhYmxlKCkpLFxuXG5nZXRCcmFuZHM6TS5jYWxsKEluc3RhbmNlSGFuZGxlU2hhcGUpLnJldHVybnMoQnJhbmRLZXl3b3JkUmVjb3JkU2hhcGUpLFxuZ2V0SXNzdWVyczpNLmNhbGwoSW5zdGFuY2VIYW5kbGVTaGFwZSkucmV0dXJucyhJc3N1ZXJLZXl3b3JkUmVjb3JkU2hhcGUpLFxuZ2V0VGVybXM6TS5jYWxsKEluc3RhbmNlSGFuZGxlU2hhcGUpLnJldHVybnMoTS5yZWNvcmQoKSksXG5nZXRPZmZlckZpbHRlcjpNLmNhbGwoSW5zdGFuY2VIYW5kbGVTaGFwZSkucmV0dXJucyhNLmFycmF5T2YoTS5zdHJpbmcoKSkpLFxuZ2V0SW5zdGFsbGF0aW9uOk0uY2FsbChJbnN0YW5jZUhhbmRsZVNoYXBlKS5yZXR1cm5zKE0ucmVtb3RhYmxlKCkpLFxuZ2V0SW5zdGFuY2VBZG1pbjpNLmNhbGwoSW5zdGFuY2VIYW5kbGVTaGFwZSkucmV0dXJucyhJbnN0YW5jZUFkbWluU2hhcGUpfSksXG5cbnVwZGF0ZXI6TS5pbnRlcmZhY2UoJ0luc3RhbmNlQWRtaW4gdXBkYXRlcicse1xuaW5pdEluc3RhbmNlQWRtaW46TS5jYWxsKEluc3RhbmNlSGFuZGxlU2hhcGUsSW5zdGFuY2VBZG1pblNoYXBlKS5yZXR1cm5zKFxuTS5wcm9taXNlKCkpLFxuXG5kZWxldGVJbnN0YW5jZUFkbWluOk0uY2FsbChJbnN0YW5jZUhhbmRsZVNoYXBlKS5yZXR1cm5zKCl9KX0pO1xuXG5cblxuLyoqIEBwYXJhbSB7WGltcG9ydCgnQGFnb3JpYy92YXQtZGF0YScpLkJhZ2dhZ2V9IGJhZ2dhZ2UgKi9cbmNvbnN0ICAgICAgICBtYWtlSW5zdGFuY2VBZG1pblN0b3JhZ2U9KGJhZ2dhZ2UpPT57XG5jb25zdCBtYWtlSUFTPXByZXBhcmVFeG9DbGFzc0tpdChcbmJhZ2dhZ2UsXG4nSW5zdGFuY2VBZG1pbicsXG5JbnN0YW5jZUFkbWluU3RvcmFnZUlLaXQsXG4oKT0+KHtcbmluc3RhbmNlVG9JbnN0YW5jZUFkbWluOnByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlKFxuYmFnZ2FnZSxcbidpbnN0YW5jZVRvSW5zdGFuY2VBZG1pbicpfSksXG5cblxue1xuLyogWm9lU3RvcmFnZU1hbmFnZXIgdXNlcyB0aGUgYWNjZXNzb3IgZmFjZXQgdG8gZ2V0IGluZm8gYWJvdXQgaW5zdGFuY2VzKi9cbmFjY2Vzc29yOntcbmdldFB1YmxpY0ZhY2V0KGluc3RhbmNlKXtcbmNvbnN0e3N0YXRlfT10aGlzO1xuY29uc3QgaWE9c3RhdGUuaW5zdGFuY2VUb0luc3RhbmNlQWRtaW4uZ2V0KGluc3RhbmNlKTtcbnJldHVybiBpYS5nZXRQdWJsaWNGYWNldCgpO1xuIH0sXG5nZXRCcmFuZHMoaW5zdGFuY2Upe1xuY29uc3R7c3RhdGV9PXRoaXM7XG5yZXR1cm4gc3RhdGUuaW5zdGFuY2VUb0luc3RhbmNlQWRtaW4uZ2V0KGluc3RhbmNlKS5nZXRCcmFuZHMoKTtcbiB9LFxuZ2V0SXNzdWVycyhpbnN0YW5jZSl7XG5jb25zdHtzdGF0ZX09dGhpcztcbnJldHVybiBzdGF0ZS5pbnN0YW5jZVRvSW5zdGFuY2VBZG1pbi5nZXQoaW5zdGFuY2UpLmdldElzc3VlcnMoKTtcbiB9LFxuZ2V0VGVybXMoaW5zdGFuY2Upe1xuY29uc3R7c3RhdGV9PXRoaXM7XG5yZXR1cm4gc3RhdGUuaW5zdGFuY2VUb0luc3RhbmNlQWRtaW4uZ2V0KGluc3RhbmNlKS5nZXRUZXJtcygpO1xuIH0sXG5nZXRPZmZlckZpbHRlcihpbnN0YW5jZSl7XG5jb25zdHtzdGF0ZX09dGhpcztcbnJldHVybiBzdGF0ZS5pbnN0YW5jZVRvSW5zdGFuY2VBZG1pbi5nZXQoaW5zdGFuY2UpLmdldE9mZmVyRmlsdGVyKCk7XG4gfSxcbmdldEluc3RhbGxhdGlvbihpbnN0YW5jZSl7XG5jb25zdHtzdGF0ZX09dGhpcztcbnJldHVybiBzdGF0ZS5pbnN0YW5jZVRvSW5zdGFuY2VBZG1pbi5nZXQoaW5zdGFuY2UpLmdldEluc3RhbGxhdGlvbigpO1xuIH0sXG5nZXRJbnN0YW5jZUFkbWluKGluc3RhbmNlKXtcbmNvbnN0e3N0YXRlfT10aGlzO1xucmV0dXJuIHN0YXRlLmluc3RhbmNlVG9JbnN0YW5jZUFkbWluLmdldChpbnN0YW5jZSk7XG4gfX0sXG5cbi8qIFRoZSB1cGRhdGVyIGZhY2V0IGlzIG9ubHkgdXNlZCBpbnNpZGUgdGhlIGluc3RhbmNlU3RvcmFnZU1hbmFnZXIqL1xudXBkYXRlcjp7XG4gICAgICBhc3luYyBpbml0SW5zdGFuY2VBZG1pbihpbnN0YW5jZSxpbnN0YW5jZUFkbWluKXtcbmNvbnN0e3N0YXRlfT10aGlzO1xucmV0dXJuIHN0YXRlLmluc3RhbmNlVG9JbnN0YW5jZUFkbWluLmluaXQoaW5zdGFuY2UsaW5zdGFuY2VBZG1pbik7XG4gfSxcbmRlbGV0ZUluc3RhbmNlQWRtaW4oaW5zdGFuY2Upe1xuY29uc3R7c3RhdGV9PXRoaXM7XG5yZXR1cm4gc3RhdGUuaW5zdGFuY2VUb0luc3RhbmNlQWRtaW4uZGVsZXRlKGluc3RhbmNlKTtcbiB9fX0pO1xuXG5cblxucmV0dXJuIHByb3ZpZGUoYmFnZ2FnZSwndGhlSW5zdGFuY2VBZG1pblN0b3JhZ2UnLCgpPT5tYWtlSUFTKCkpO1xuIH07JGjigI1fb25jZS5tYWtlSW5zdGFuY2VBZG1pblN0b3JhZ2UobWFrZUluc3RhbmNlQWRtaW5TdG9yYWdlKTtcbmhhcmRlbihtYWtlSW5zdGFuY2VBZG1pblN0b3JhZ2UpO1xuXG4vKipcbiAqIEBwYXJhbSB7WGltcG9ydCgnQGFnb3JpYy92YXQtZGF0YScpLkJhZ2dhZ2V9IHpvZUJhZ2dhZ2VcbiAqIEBwYXJhbSB7UmV0dXJuVHlwZTxtYWtlWm9lU2VhdEFkbWluRmFjdG9yeT59IG1ha2Vab2VTZWF0QWRtaW5LaXRcbiAqL1xuY29uc3QgbWFrZUluc3RhbmNlQWRtaW5CZWhhdmlvcj0oem9lQmFnZ2FnZSxtYWtlWm9lU2VhdEFkbWluS2l0KT0+e1xuY29uc3QgbWFrZVNlYXRIYW5kbGU9ZGVmaW5lRHVyYWJsZUhhbmRsZSh6b2VCYWdnYWdlLCdTZWF0Jyk7XG5cbnJldHVybiBoYXJkZW4oe1xuZ2V0UHVibGljRmFjZXQ6KHtzdGF0ZX0pPT5zdGF0ZS5wdWJsaWNGYWNldCxcbmdldFRlcm1zOih7c3RhdGV9KT0+c3RhdGUuem9lSW5zdGFuY2VTdG9yYWdlTWFuYWdlci5nZXRUZXJtcygpLFxuZ2V0SXNzdWVyczooe3N0YXRlfSk9PnN0YXRlLnpvZUluc3RhbmNlU3RvcmFnZU1hbmFnZXIuZ2V0SXNzdWVycygpLFxuZ2V0QnJhbmRzOih7c3RhdGV9KT0+c3RhdGUuem9lSW5zdGFuY2VTdG9yYWdlTWFuYWdlci5nZXRCcmFuZHMoKSxcblxuLyogaW5zdGFuY2VBZG1pbiBpcyBjcmVhdGVkIGVhcmx5IGluIHN0YXJ0SW5zdGFuY2UuIGluaXREZWxheWVkU3RhdGUgaXMqL1xuLyogY2FsbGVkIGFmdGVyIHN0YXJ0WmNmLCBidXQgYmVmb3JlIHRoZSBjb250cmFjdCBmYWNldHMgYXJlIG1hZGUgYXZhaWxhYmxlLiovXG5pbml0RGVsYXllZFN0YXRlOih7c3RhdGV9LGhhbmRsZU9mZmVyT2JqLHB1YmxpY0ZhY2V0KT0+e1xuc3RhdGUuaGFuZGxlT2ZmZXJPYmo9aGFuZGxlT2ZmZXJPYmo7XG5jYW5CZUR1cmFibGUocHVibGljRmFjZXQpfHxGYWlsIGBwdWJsaWNGYWNldCBtdXN0IGJlIGR1cmFibGVgO1xuc3RhdGUucHVibGljRmFjZXQ9cHVibGljRmFjZXQ7XG4gfSxcbmdldEluc3RhbGxhdGlvbjooe3N0YXRlfSk9Plxuc3RhdGUuem9lSW5zdGFuY2VTdG9yYWdlTWFuYWdlci5nZXRJbnN0YWxsYXRpb24oKSxcbmdldEluc3RhbmNlOih7c3RhdGV9KT0+c3RhdGUuaW5zdGFuY2VIYW5kbGUsXG5hc3NlcnRBY2NlcHRpbmdPZmZlcnM6KHtzdGF0ZX0pPT57XG5zdGF0ZS5hY2NlcHRpbmdPZmZlcnN8fEZhaWwgYE5vIGZ1cnRoZXIgb2ZmZXJzIGFyZSBhY2NlcHRlZGA7XG4gfSxcbmV4aXRBbGxTZWF0czooe3N0YXRlfSxjb21wbGV0aW9uKT0+e1xuc3RhdGUuYWNjZXB0aW5nT2ZmZXJzPWZhbHNlO1xuQXJyYXkuZnJvbShzdGF0ZS56b2VTZWF0QWRtaW5zLmtleXMoKSkuZm9yRWFjaCgoem9lU2VhdEFkbWluKT0+XG56b2VTZWF0QWRtaW4uZXhpdChjb21wbGV0aW9uKSk7XG5cbiB9LFxuZmFpbEFsbFNlYXRzOih7c3RhdGV9LHJlYXNvbik9PntcbnN0YXRlLmFjY2VwdGluZ09mZmVycz1mYWxzZTtcbkFycmF5LmZyb20oc3RhdGUuem9lU2VhdEFkbWlucy5rZXlzKCkpLmZvckVhY2goKHpvZVNlYXRBZG1pbik9Plxuem9lU2VhdEFkbWluLmZhaWwocmVhc29uKSk7XG5cbiB9LFxuc3RvcEFjY2VwdGluZ09mZmVyczooe3N0YXRlfSk9PntcbnN0YXRlLmFjY2VwdGluZ09mZmVycz1mYWxzZTtcbiB9LFxubWFrZVVzZXJTZWF0OihcbntzdGF0ZSxmYWNldHM6e2hlbHBlcn19LFxuaW52aXRhdGlvbkhhbmRsZSxcbmluaXRpYWxBbGxvY2F0aW9uLFxucHJvcG9zYWwsXG5vZmZlckFyZ3M9dW5kZWZpbmVkKT0+XG57XG5jb25zdHt1c2VyU2VhdCx6b2VTZWF0QWRtaW59PW1ha2Vab2VTZWF0QWRtaW5LaXQoXG5pbml0aWFsQWxsb2NhdGlvbixcbnByb3Bvc2FsLFxuaGVscGVyLFxuc3RhdGUuem9lSW5zdGFuY2VTdG9yYWdlTWFuYWdlci5nZXRXaXRoZHJhd0ZhY2V0KCkpO1xuXG5cbmNvbnN0IHNlYXRIYW5kbGU9bWFrZVNlYXRIYW5kbGUoKTtcbnN0YXRlLnNlYXRIYW5kbGVUb1pvZVNlYXRBZG1pbi5pbml0KHNlYXRIYW5kbGUsem9lU2VhdEFkbWluKTtcblxuY29uc3Qgc2VhdERhdGE9aGFyZGVuKHtcbnByb3Bvc2FsLFxuaW5pdGlhbEFsbG9jYXRpb24sXG5zZWF0SGFuZGxlLFxub2ZmZXJBcmdzfSk7XG5cblxuc3RhdGUuem9lU2VhdEFkbWlucy5hZGQoem9lU2VhdEFkbWluKTtcbnN0YXRlLmhhbmRsZU9mZmVyT2JqfHxGYWlsIGBpbmNvbXBsZXRlIHNldHVwIG9mIHpvZSBzZWF0YDtcbkUud2hlbihcbkUoc3RhdGUuaGFuZGxlT2ZmZXJPYmopLmhhbmRsZU9mZmVyKGludml0YXRpb25IYW5kbGUsc2VhdERhdGEpLFxuLyoqIEBwYXJhbSB7SGFuZGxlT2ZmZXJSZXN1bHR9IHJlc3VsdCAqL1xuKHJlc3VsdCk9PnpvZVNlYXRBZG1pbi5yZXNvbHZlRXhpdEFuZFJlc3VsdChyZXN1bHQpLFxuKGVycik9Pntcbi8qIG5vdGhpbmcgZm9yIFpvZSB0byBkbyBpZiB0aGUgdGVybWluYXRpb24gZmFpbHMqL1xudm9pZCBFKHN0YXRlLmFkbWluTm9kZSkudGVybWluYXRlV2l0aEZhaWx1cmUoZXJyKTtcbnRocm93IGVycjtcbiB9KTtcblxuXG4vKiByZXR1cm4gdGhlIHVzZXJTZWF0IGJlZm9yZSB0aGUgb2ZmZXJIYW5kbGVyIGlzIGNhbGxlZCovXG5yZXR1cm4gdXNlclNlYXQ7XG4gfSxcbm1ha2VOb0VzY3Jvd1NlYXQ6KFxue3N0YXRlLGZhY2V0czp7aGVscGVyfX0sXG5pbml0aWFsQWxsb2NhdGlvbixcbnByb3Bvc2FsLFxuZXhpdE9iaixcbnNlYXRIYW5kbGUpPT5cbntcbmNvbnN0e3VzZXJTZWF0LHpvZVNlYXRBZG1pbn09bWFrZVpvZVNlYXRBZG1pbktpdChcbmluaXRpYWxBbGxvY2F0aW9uLFxucHJvcG9zYWwsXG5oZWxwZXIsXG5zdGF0ZS56b2VJbnN0YW5jZVN0b3JhZ2VNYW5hZ2VyLmdldFdpdGhkcmF3RmFjZXQoKSxcbmV4aXRPYmosXG50cnVlKTtcblxuXG5zdGF0ZS56b2VTZWF0QWRtaW5zLmFkZCh6b2VTZWF0QWRtaW4pO1xuc3RhdGUuc2VhdEhhbmRsZVRvWm9lU2VhdEFkbWluLmluaXQoc2VhdEhhbmRsZSx6b2VTZWF0QWRtaW4pO1xucmV0dXJuIHVzZXJTZWF0O1xuIH0sXG5nZXRPZmZlckZpbHRlcjooe3N0YXRlfSk9PnN0YXRlLm9mZmVyRmlsdGVyU3RyaW5ncyxcbnNldE9mZmVyRmlsdGVyOih7c3RhdGV9LHN0cmluZ3MpPT57XG5BcnJheS5pc0FycmF5KHN0cmluZ3MpfHxGYWlsIGAke3Eoc3RyaW5ncyl9IG11c3QgYmUgYW4gQXJyYXlgO1xuY29uc3QgcHJvcG9zZWRTdHJpbmdzPWhhcmRlbihbLi4uc3RyaW5nc10pO1xucHJvcG9zZWRTdHJpbmdzLmV2ZXJ5KChzKT0+dHlwZW9mIHM9PT0nc3RyaW5nJyl8fFxuRmFpbCBgQmxvY2tlZCBzdHJpbmdzICgke3EoXG5wcm9wb3NlZFN0cmluZ3MpXG4gfSkgbXVzdCBiZSBhbiBBcnJheSBvZiBzdHJpbmdzLmA7XG5cbnN0YXRlLm9mZmVyRmlsdGVyU3RyaW5ncz1wcm9wb3NlZFN0cmluZ3M7XG4gfSxcbi8qIElmIGFueSBvZmZlciBmaWx0ZXIgc3RyaW5nIG1hdGNoZXMgdGhlIGlucHV0IHN0cmluZywgZG9uJ3QgcHJvY2VzcyB0aGUqL1xuLyogaW52aXRhdGlvbi4gT2ZmZXIgZmlsdGVyIHN0cmluZ3MgdGhhdCBlbmQgaW4gJzonIG1hdGNoIGlmIHRoZXkgYXJlIGEqL1xuLyogcHJlZml4IG9mIHRoZSBpbnB1dCBzdHJpbmc7IG90aGVycyBtdXN0IG1hdGNoIGl0IGV4YWN0bHkuKi9cbmlzQmxvY2tlZDooe3N0YXRlfSxzdHJpbmcpPT57XG5yZXR1cm4gc3RhdGUub2ZmZXJGaWx0ZXJTdHJpbmdzLnNvbWUoKGZpbHRlclN0cmluZyk9PntcbnJldHVybihcbmZpbHRlclN0cmluZz09PXN0cmluZ3x8XG5maWx0ZXJTdHJpbmcuZW5kc1dpdGgoJzonKSYmc3RyaW5nLnN0YXJ0c1dpdGgoZmlsdGVyU3RyaW5nKSk7XG5cbiB9KTtcbiB9fSk7XG5cbiB9O1xuXG5jb25zdCBoZWxwZXJCZWhhdmlvcj17XG5leGl0Wm9lU2VhdEFkbWluOih7c3RhdGV9LHpvZVNlYXRBZG1pbik9Plxuc3RhdGUuem9lU2VhdEFkbWlucy5kZWxldGUoem9lU2VhdEFkbWluKSxcbmhhc0V4aXRlZDooe3N0YXRlfSx6b2VTZWF0QWRtaW4pPT5cbiFzdGF0ZS56b2VTZWF0QWRtaW5zLmhhcyh6b2VTZWF0QWRtaW4pfTtcblxuXG4vKipcbiAqIEB0eXBlZGVmIHtSZWFkb25seTx7XG4gKiAgIHB1YmxpY0ZhY2V0OiB1bmtub3duLFxuICogICBoYW5kbGVyT2ZmZXJPYmo6IHVua25vd24sXG4gKiB9Pn0gSW1tdXRhYmxlU3RhdGVcbiAqIEB0eXBlZGVmIHt7XG4gKiAgIG9mZmVyRmlsdGVyU3RyaW5nczogc3RyaW5nW10sXG4gKiB9fSBNdXRhYmxlU3RhdGVcbiAqIEB0eXBlZGVmIHtNdXRhYmxlU3RhdGUgJiBJbW11dGFibGVTdGF0ZX0gU3RhdGVcbiAqIEB0eXBlZGVmIHt7XG4gKiAgIHN0YXRlOiBTdGF0ZSxcbiAqIH19IE1ldGhvZENvbnRleHRcbiAqL1xuXG4vKipcbiAqIEBwYXJhbSB7WGltcG9ydCgnQGFnb3JpYy92YXQtZGF0YScpLkJhZ2dhZ2V9IHpvZUJhZ2dhZ2VcbiAqIEBwYXJhbSB7V2Vha01hcFN0b3JlPFNlYXRIYW5kbGUsIFpvZVNlYXRBZG1pbj59IHNlYXRIYW5kbGVUb1pvZVNlYXRBZG1pblxuICovXG5jb25zdCAgICAgICAgbWFrZUluc3RhbmNlQWRtaW5NYWtlcj0oXG56b2VCYWdnYWdlLFxuc2VhdEhhbmRsZVRvWm9lU2VhdEFkbWluKT0+XG57XG5jb25zdCBtYWtlWm9lU2VhdEFkbWluS2l0PW1ha2Vab2VTZWF0QWRtaW5GYWN0b3J5KHpvZUJhZ2dhZ2UpO1xuY29uc3QgbWFrZUluc3RhbmNlQWRtaW5NdWx0aT1wcmVwYXJlS2luZE11bHRpKFxuem9lQmFnZ2FnZSxcbidpbnN0YW5jZUFkbWluJyxcbihpbnN0YW5jZUhhbmRsZSx6b2VJbnN0YW5jZVN0b3JhZ2VNYW5hZ2VyLGFkbWluTm9kZSk9PntcbmNvbnN0IHJldFZhbD17XG5vZmZlckZpbHRlclN0cmluZ3M6aGFyZGVuKFtdKSxcbnB1YmxpY0ZhY2V0OnVuZGVmaW5lZCxcbmhhbmRsZU9mZmVyT2JqOnVuZGVmaW5lZCxcbnpvZUluc3RhbmNlU3RvcmFnZU1hbmFnZXIsXG5zZWF0SGFuZGxlVG9ab2VTZWF0QWRtaW4sXG5pbnN0YW5jZUhhbmRsZSxcbmFjY2VwdGluZ09mZmVyczp0cnVlLFxuem9lU2VhdEFkbWluczptYWtlU2NhbGFyQmlnU2V0U3RvcmUoJ3pvZVNlYXRBZG1pbnMnLHtcbmR1cmFibGU6dHJ1ZX0pLFxuXG5hZG1pbk5vZGV9O1xuXG5yZXR1cm4gcmV0VmFsO1xuIH0sXG57XG5pbnN0YW5jZUFkbWluOm1ha2VJbnN0YW5jZUFkbWluQmVoYXZpb3Ioem9lQmFnZ2FnZSxtYWtlWm9lU2VhdEFkbWluS2l0KSxcbmhlbHBlcjpoZWxwZXJCZWhhdmlvcn0pO1xuXG5cblxucmV0dXJuKGluc3RhbmNlSGFuZGxlLHpvZUluc3RhbmNlU3RvcmFnZU1hbmFnZXIsYWRtaW5Ob2RlKT0+e1xuY29uc3QgaW5zdGFuY2VBZG1pbj1tYWtlSW5zdGFuY2VBZG1pbk11bHRpKFxuaW5zdGFuY2VIYW5kbGUsXG56b2VJbnN0YW5jZVN0b3JhZ2VNYW5hZ2VyLFxuYWRtaW5Ob2RlKS5cbmluc3RhbmNlQWRtaW47XG5yZXR1cm4gaW5zdGFuY2VBZG1pbjtcbiB9O1xuIH07JGjigI1fb25jZS5tYWtlSW5zdGFuY2VBZG1pbk1ha2VyKG1ha2VJbnN0YW5jZUFkbWluTWFrZXIpO1xuXG5oYXJkZW4obWFrZUluc3RhbmNlQWRtaW5NYWtlcik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUluc3RhbmNlQWRtaW5TdG9yYWdlIjpbIm1ha2VJbnN0YW5jZUFkbWluU3RvcmFnZSJdLCJtYWtlSW5zdGFuY2VBZG1pbk1ha2VyIjpbIm1ha2VJbnN0YW5jZUFkbWluTWFrZXIiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAASlv/UX4UAAB+FAAANAAAAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL3pvZVNlcnZpY2UvaW50ZXJuYWwtdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKiBAamVzc2llLWNoZWNrKi9cblxuLyoqXG4gKiBDcmVhdGUgYSBwdXJzZSBmb3IgYSBuZXcgaXNzdWVyXG4gKlxuICogQGNhbGxiYWNrIENyZWF0ZVB1cnNlXG4gKiBAcGFyYW0ge0lzc3Vlcn0gaXNzdWVyXG4gKiBAcGFyYW0ge0JyYW5kfSBicmFuZFxuICogQHJldHVybnMge0VSZWY8dm9pZD59XG4gKi9cblxuLyoqXG4gKiBDcmVhdGUgYSBwdXJzZSBmb3IgYSBuZXcsIGxvY2FsIGlzc3Vlci4gVXNlZCBvbmx5IGZvciBaQ0ZNaW50IGlzc3VlcnMuXG4gKlxuICogTm90ZTogaW4gdGhlIGNhc2Ugb2YgdGhlIGZlZU1pbnQsIGl0IG1heSBoYXZlIGJlZW4gcmVnaXN0ZXJlZFxuICogYmVmb3JlIHdpdGggYGZlZU1pbnRBY2Nlc3NgLiBJbiB0aGF0IGNhc2UsIHdlIGRvIG5vdCBjcmVhdGUgYSBuZXdcbiAqIHB1cnNlLCBidXQgcmV1c2UgdGhlIGV4aXN0aW5nIHB1cnNlLlxuICpcbiAqIEBjYWxsYmFjayBQcm92aWRlTG9jYWxQdXJzZVxuICogQHBhcmFtIHtJc3N1ZXJ9IGlzc3VlclxuICogQHBhcmFtIHtCcmFuZH0gYnJhbmRcbiAqIEByZXR1cm5zIHtQdXJzZX1cbiAqL1xuXG4vKipcbiAqIERlcG9zaXRzIHBheW1lbnRzIG9yIHByb21pc2VzIGZvciBwYXltZW50cyBhY2NvcmRpbmcgdG8gdGhlXG4gKiBgZ2l2ZWAgcHJvcGVydHkgb2YgdGhlIHByb3Bvc2FsLiBVc2luZyB0aGUgcHJvcG9zYWwsIGNyZWF0ZXMgYW5cbiAqIGluaXRpYWwgYWxsb2NhdGlvbiBpbmNsdWRpbmcgdGhlIGFtb3VudCBkZXBvc2l0ZWQgZm9yIGBnaXZlYFxuICoga2V5d29yZHMgYW5kIGFuIGVtcHR5IGFtb3VudCBmb3IgYHdhbnRgIGtleXdvcmRzLlxuICpcbiAqIEBjYWxsYmFjayBEZXBvc2l0UGF5bWVudHNcbiAqIEBwYXJhbSB7UHJvcG9zYWxSZWNvcmR9IHByb3Bvc2FsXG4gKiBAcGFyYW0ge1BheW1lbnRQS2V5d29yZFJlY29yZH0gcGF5bWVudHNcbiAqIEByZXR1cm5zIHtQcm9taXNlPEFsbG9jYXRpb24+fVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEluaXRJbnN0YW5jZUFkbWluXG4gKiBAcGFyYW0ge0luc3RhbmNlfSBpbnN0YW5jZVxuICogQHBhcmFtIHtJbnN0YW5jZUFkbWlufSBJbnN0YW5jZUFkbWluXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBHZXRJbnN0YW5jZUFkbWluXG4gKiBAcGFyYW0ge0luc3RhbmNlfSBpbnN0YW5jZVxuICogQHJldHVybnMge0luc3RhbmNlQWRtaW59XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgRGVsZXRlSW5zdGFuY2VBZG1pblxuICogQHBhcmFtIHtJbnN0YW5jZX0gaW5zdGFuY2VcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFVud3JhcEluc3RhbGxhdGlvblxuICpcbiAqIEFzc2VydCB0aGUgaW5zdGFsbGF0aW9uIGlzIGtub3duLCBhbmQgcmV0dXJuIHRoZSBidW5kbGUvYnVuZGxlY2FwIGFuZFxuICogaW5zdGFsbGF0aW9uXG4gKlxuICogQHBhcmFtIHtFUmVmPEluc3RhbGxhdGlvbj59IGluc3RhbGxhdGlvblBcbiAqIEByZXR1cm5zIHtFUmVmPHtcbiAqICAgYnVuZGxlPzogU291cmNlQnVuZGxlLFxuICogICBidW5kbGVDYXA/OiBCdW5kbGVDYXAsXG4gKiAgIGJ1bmRsZUlEPzogQnVuZGxlSUQsXG4gKiAgIGluc3RhbGxhdGlvbjpJbnN0YWxsYXRpb25cbiAqIH0+fSBYWFggbm90IHJlYWxseSBhbiBFUmVmOyB0aGUgaW1wbGVtZW50aW9uIGlzIHN5bmMgYW5kIHRoZSBBUEkgaXMgYSBwcm9taXNlIGJlY2F1c2Ugb2YgY2FsbFdoZW5cbiAqL1xuLyogVE9ETyByZW1vdmUgb3IgYXV0b21hdGUgRVJlZiBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzcxMTAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBHZXRJc3N1ZXJSZWNvcmRzXG4gKiBAcmV0dXJucyB7SXNzdWVyUmVjb3Jkc31cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFpvZUluc3RhbmNlU3RvcmFnZU1hbmFnZXJcbiAqIEBwcm9wZXJ0eSB7SW5zdGFuY2VTdGF0ZUdldFRlcm1zfSBnZXRUZXJtc1xuICogQHByb3BlcnR5IHtJbnN0YW5jZVJlY29yZEdldElzc3VlcnN9IGdldElzc3VlcnNcbiAqIEBwcm9wZXJ0eSB7SW5zdGFuY2VSZWNvcmRHZXRCcmFuZHN9IGdldEJyYW5kc1xuICogQHByb3BlcnR5IHtaQ0ZbJ3NhdmVJc3N1ZXInXX0gc2F2ZUlzc3VlclxuICogQHByb3BlcnR5IHtNYWtlWm9lTWludH0gbWFrZVpvZU1pbnRcbiAqIEBwcm9wZXJ0eSB7UmVnaXN0ZXJGZWVNaW50fSByZWdpc3RlckZlZU1pbnRcbiAqIEBwcm9wZXJ0eSB7R2V0SW5zdGFuY2VSZWNvcmR9IGdldEluc3RhbmNlUmVjb3JkXG4gKiBAcHJvcGVydHkge0dldElzc3VlclJlY29yZHN9IGdldElzc3VlclJlY29yZHNcbiAqIEBwcm9wZXJ0eSB7SW5pdEluc3RhbmNlQWRtaW59IGluaXRJbnN0YW5jZUFkbWluXG4gKiBAcHJvcGVydHkge0RlbGV0ZUluc3RhbmNlQWRtaW59IGRlbGV0ZUluc3RhbmNlQWRtaW5cbiAqIEBwcm9wZXJ0eSB7Wm9lSW5zdGFuY2VBZG1pbk1ha2VJbnZpdGF0aW9ufSBtYWtlSW52aXRhdGlvblxuICogQHByb3BlcnR5IHsoKSA9PiBJc3N1ZXJ9IGdldEludml0YXRpb25Jc3N1ZXJcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gb2JqZWN0fSBnZXRSb290IG9mIENyZWF0ZVZhdFJlc3VsdHNcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gWGltcG9ydCgnQGFnb3JpYy9zd2luZ3NldC12YXQnKS5WYXRBZG1pbkZhY2V0fSBnZXRBZG1pbk5vZGUgb2YgQ3JlYXRlVmF0UmVzdWx0c1xuICovXG5cbi8qKlxuICogQ3JlYXRlIGEgc3RvcmFnZSBtYW5hZ2VyIGZvciBhIHBhcnRpY3VsYXIgY29udHJhY3QgaW5zdGFuY2UuIFRoZVxuICogWm9lSW5zdGFuY2VTdG9yYWdlTWFuYWdlciBlbmNhcHN1bGF0ZXMgYWNjZXNzIHRvIHRoZVxuICogaXNzdWVyU3RvcmFnZSBhbmQgZXNjcm93U3RvcmFnZSBmcm9tIFpvZSwgYW5kIHN0b3JlcyB0aGVcbiAqIGluc3RhbmNlLXNwZWNpZmljIHRlcm1zXG4gKlxuICogQGNhbGxiYWNrIE1ha2Vab2VJbnN0YW5jZVN0b3JhZ2VNYW5hZ2VyXG4gKiBAcGFyYW0ge1hpbXBvcnQoJ0BhZ29yaWMvdmF0LWRhdGEnKS5CYWdnYWdlfSBpbnN0YW5jZUJhZ2dhZ2VcbiAqIEBwYXJhbSB7SW5zdGFsbGF0aW9ufSBpbnN0YWxsYXRpb25cbiAqIEBwYXJhbSB7b2JqZWN0fSBjdXN0b21UZXJtc1xuICogQHBhcmFtIHtJc3N1ZXJLZXl3b3JkUmVjb3JkfSB1bmNsZWFuSXNzdWVyS2V5d29yZFJlY29yZFxuICogQHBhcmFtIHtJbnN0YW5jZX0gaW5zdGFuY2VcbiAqIEBwYXJhbSB7QnVuZGxlQ2FwfSBjb250cmFjdEJ1bmRsZUNhcFxuICogQHBhcmFtIHtzdHJpbmd9IGluc3RhbmNlTGFiZWxcbiAqIEByZXR1cm5zIHtQcm9taXNlPFpvZUluc3RhbmNlU3RvcmFnZU1hbmFnZXI+fVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEdldEJ1bmRsZUNhcEZvcklEXG4gKiBAcGFyYW0ge0J1bmRsZUlEfSBpZFxuICogQHJldHVybnMge1Byb21pc2U8QnVuZGxlQ2FwPn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBHZXRQcm9wb3NhbFNoYXBlRm9ySW52aXRhdGlvblxuICogQHBhcmFtIHtJbnZpdGF0aW9uSGFuZGxlfSBpbnZpdGF0aW9uSGFuZGxlXG4gKiBAcmV0dXJucyB7UGF0dGVybiB8IHVuZGVmaW5lZH1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFpvZVN0b3JhZ2VNYW5hZ2VyXG4gKiBAcHJvcGVydHkge01ha2Vab2VJbnN0YW5jZVN0b3JhZ2VNYW5hZ2VyfSBtYWtlWm9lSW5zdGFuY2VTdG9yYWdlTWFuYWdlclxuICogQHByb3BlcnR5IHtHZXRBc3NldEtpbmRCeUJyYW5kfSBnZXRBc3NldEtpbmRCeUJyYW5kXG4gKiBAcHJvcGVydHkge0RlcG9zaXRQYXltZW50c30gZGVwb3NpdFBheW1lbnRzXG4gKiBAcHJvcGVydHkge0lzc3Vlcjwnc2V0Jz59IGludml0YXRpb25Jc3N1ZXJcbiAqIEBwcm9wZXJ0eSB7SW5zdGFsbEJ1bmRsZX0gaW5zdGFsbEJ1bmRsZVxuICogQHByb3BlcnR5IHtJbnN0YWxsQnVuZGxlSUR9IGluc3RhbGxCdW5kbGVJRFxuICogQHByb3BlcnR5IHtHZXRCdW5kbGVJREZyb21JbnN0YWxsYXRpb259IGdldEJ1bmRsZUlERnJvbUluc3RhbGxhdGlvblxuICogQHByb3BlcnR5IHtYaW1wb3J0KCcuL3V0aWxzLmpzJykuR2V0UHVibGljRmFjZXR9IGdldFB1YmxpY0ZhY2V0XG4gKiBAcHJvcGVydHkge0dldEJyYW5kc30gZ2V0QnJhbmRzXG4gKiBAcHJvcGVydHkge0dldElzc3VlcnN9IGdldElzc3VlcnNcbiAqIEBwcm9wZXJ0eSB7WGltcG9ydCgnLi91dGlscycpLkdldFRlcm1zfSBnZXRUZXJtc1xuICogQHByb3BlcnR5IHtHZXRPZmZlckZpbHRlcn0gZ2V0T2ZmZXJGaWx0ZXJcbiAqIEBwcm9wZXJ0eSB7U2V0T2ZmZXJGaWx0ZXJ9IHNldE9mZmVyRmlsdGVyXG4gKiBAcHJvcGVydHkge0dldEluc3RhbGxhdGlvbkZvckluc3RhbmNlfSBnZXRJbnN0YWxsYXRpb25Gb3JJbnN0YW5jZVxuICogQHByb3BlcnR5IHtHZXRJbnN0YW5jZUFkbWlufSBnZXRJbnN0YW5jZUFkbWluXG4gKiBAcHJvcGVydHkge1Vud3JhcEluc3RhbGxhdGlvbn0gdW53cmFwSW5zdGFsbGF0aW9uXG4gKiBAcHJvcGVydHkge0dldFByb3Bvc2FsU2hhcGVGb3JJbnZpdGF0aW9ufSBnZXRQcm9wb3NhbFNoYXBlRm9ySW52aXRhdGlvblxuICovXG5cbi8qKlxuICogVXNlIFZhdEFkbWluU3ZjIHRvIGNyZWF0ZSBhIG5ldyB2YXQsIGJ1dCBvbmx5IHdpdGggdGhlIGNvZGUgb2YgdGhlXG4gKiBaQ0YgYnVuZGxlXG4gKlxuICogQGNhbGxiYWNrIENyZWF0ZVpDRlZhdFxuICogQHBhcmFtIHtCdW5kbGVDYXB9IGNvbnRyYWN0QnVuZGxlQ2FwXG4gKiBAcGFyYW0ge3N0cmluZ30gY29udHJhY3RMYWJlbFxuICogQHJldHVybnMge1Byb21pc2U8WGltcG9ydCgnQGFnb3JpYy9zd2luZ3NldC12YXQnKS5DcmVhdGVWYXRSZXN1bHRzPn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBHZXRGZWVJc3N1ZXJLaXRcbiAqIEBwYXJhbSB7RmVlTWludEFjY2Vzc30gZmVlTWludEFjY2Vzc1xuICogQHJldHVybnMge0lzc3VlcktpdDwnbmF0Jz59XG4gKi9cbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAKmk3r5EFAACRBQAANwAAAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL3pvZVNlcnZpY2UvaW52aXRhdGlvblF1ZXJpZXMuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9hc3NlcnQiLCJAZW5kby9ldmVudHVhbC1zZW5kIl0sImV4cG9ydHMiOlsibWFrZUludml0YXRpb25RdWVyeUZucyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnQsWCxFOyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvYXNzZXJ0XCIsIFtbXCJhc3NlcnRcIiwgWyRo4oCNX2EgPT4gKGFzc2VydCA9ICRo4oCNX2EpXV0sW1wiZGV0YWlsc1wiLCBbJGjigI1fYSA9PiAoWCA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cbmNvbnN0ICAgICAgICBtYWtlSW52aXRhdGlvblF1ZXJ5Rm5zPShpbnZpdGF0aW9uSXNzdWVyKT0+e1xuLyoqIEB0eXBlIHtHZXRJbnZpdGF0aW9uRGV0YWlsc30gKi9cbmNvbnN0IGdldEludml0YXRpb25EZXRhaWxzPWFzeW5jKGludml0YXRpb25QKT0+e1xuY29uc3Qgb25SZWplY3RlZD0ocmVhc29uKT0+e1xuY29uc3QgZXJyPWFzc2VydC5lcnJvcihcblggYEEgWm9lIGludml0YXRpb24gaXMgcmVxdWlyZWQsIG5vdCAke2ludml0YXRpb25QfWApO1xuXG5hc3NlcnQubm90ZShlcnIsWCBgRHVlIHRvICR7cmVhc29ufWApO1xudGhyb3cgZXJyO1xuIH07XG5yZXR1cm4gRS5nZXQoXG5FLmdldChFKGludml0YXRpb25Jc3N1ZXIpLmdldEFtb3VudE9mKGludml0YXRpb25QKS5jYXRjaChvblJlamVjdGVkKSkuXG52YWx1ZSlbXG4wXTtcbiB9O1xuXG4vKiogQHR5cGUge0dldEluc3RhbmNlfSAqL1xuY29uc3QgZ2V0SW5zdGFuY2U9KGludml0YXRpb24pPT5cbkUuZ2V0KGdldEludml0YXRpb25EZXRhaWxzKGludml0YXRpb24pKS5pbnN0YW5jZTtcblxuLyoqIEB0eXBlIHtHZXRJbnN0YWxsYXRpb259ICovXG5jb25zdCBnZXRJbnN0YWxsYXRpb249KGludml0YXRpb24pPT5cbkUuZ2V0KGdldEludml0YXRpb25EZXRhaWxzKGludml0YXRpb24pKS5pbnN0YWxsYXRpb247XG5cbnJldHVybiBoYXJkZW4oe1xuZ2V0SW5zdGFuY2UsXG5nZXRJbnN0YWxsYXRpb24sXG5nZXRJbnZpdGF0aW9uRGV0YWlsc30pO1xuXG4gfTskaOKAjV9vbmNlLm1ha2VJbnZpdGF0aW9uUXVlcnlGbnMobWFrZUludml0YXRpb25RdWVyeUZucyk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUludml0YXRpb25RdWVyeUZucyI6WyJtYWtlSW52aXRhdGlvblF1ZXJ5Rm5zIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJ5kEj1lCAAAZQgAADQAAABAYWdvcmljL3pvZS12MC4yNi4yL3NyYy96b2VTZXJ2aWNlL21ha2VJbnZpdGF0aW9uLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvYXNzZXJ0IiwiQGFnb3JpYy92YXQtZGF0YSIsIkBhZ29yaWMvZXJ0cCIsIi4uL3R5cGVHdWFyZHMuanMiXSwiZXhwb3J0cyI6WyJwcmVwYXJlSW52aXRhdGlvbktpdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBGYWlsLHEscHJvdmlkZUR1cmFibGVNYXBTdG9yZSxBc3NldEtpbmQsaGFzSXNzdWVyLHByZXBhcmVJc3N1ZXJLaXQsSW52aXRhdGlvbkVsZW1lbnRTaGFwZTskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL2Fzc2VydFwiLCBbW1wiRmFpbFwiLCBbJGjigI1fYSA9PiAoRmFpbCA9ICRo4oCNX2EpXV0sW1wicVwiLCBbJGjigI1fYSA9PiAocSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJwcm92aWRlRHVyYWJsZU1hcFN0b3JlXCIsIFskaOKAjV9hID0+IChwcm92aWRlRHVyYWJsZU1hcFN0b3JlID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvZXJ0cFwiLCBbW1wiQXNzZXRLaW5kXCIsIFskaOKAjV9hID0+IChBc3NldEtpbmQgPSAkaOKAjV9hKV1dLFtcImhhc0lzc3VlclwiLCBbJGjigI1fYSA9PiAoaGFzSXNzdWVyID0gJGjigI1fYSldXSxbXCJwcmVwYXJlSXNzdWVyS2l0XCIsIFskaOKAjV9hID0+IChwcmVwYXJlSXNzdWVyS2l0ID0gJGjigI1fYSldXV1dLFtcIi4uL3R5cGVHdWFyZHMuanNcIiwgW1tcIkludml0YXRpb25FbGVtZW50U2hhcGVcIiwgWyRo4oCNX2EgPT4gKEludml0YXRpb25FbGVtZW50U2hhcGUgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cbi8qKlxuICogTm90IGRlcHJlY2F0ZWQgYmVjYXVzZSB0aGUgZmlyc3QgdXNlIGJlbG93IGlzIHN0aWxsIGNvcnJlY3QuXG4gKi9cbmNvbnN0IFpPRV9JTlZJVEFUSU9OX0tJVD0nWm9lSW52aXRhdGlvbktpdCc7XG5cbi8qKlxuICogQHBhcmFtIHtYaW1wb3J0KCdAYWdvcmljL3ZhdC1kYXRhJykuQmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtTaHV0ZG93bldpdGhGYWlsdXJlIHwgdW5kZWZpbmVkfSBzaHV0ZG93blpvZVZhdFxuICovXG5jb25zdCAgICAgICAgcHJlcGFyZUludml0YXRpb25LaXQ9KGJhZ2dhZ2Usc2h1dGRvd25ab2VWYXQ9dW5kZWZpbmVkKT0+e1xuY29uc3QgaW52aXRhdGlvbktpdEJhZ2dhZ2U9cHJvdmlkZUR1cmFibGVNYXBTdG9yZShcbmJhZ2dhZ2UsXG5aT0VfSU5WSVRBVElPTl9LSVQpO1xuXG5pZihpbnZpdGF0aW9uS2l0QmFnZ2FnZS5oYXMoWk9FX0lOVklUQVRJT05fS0lUKSl7XG4vKiBUaGlzIGxlZ2FjeSBzZWNvbmQgdXNlIG9mIFpPRV9JTlZJVEFUSU9OX0tJVCBpcyB1bm5lZWRlZC4qL1xuaGFzSXNzdWVyKGludml0YXRpb25LaXRCYWdnYWdlKXx8XG5GYWlsIGBMZWdhY3kgdXNlIG9mICR7cShcblpPRV9JTlZJVEFUSU9OX0tJVClcbiB9IG11c3QgYmUgcmVkdW5kYW50IHdpdGggbm9ybWFsIHN0b3Jpbmcgb2YgaXNzdWVyS2l0IGluIGlzc3VlckJhZ2dhZ2VgO1xuLyogVXBncmFkZSB0aGlzIGxlZ2FjeSBzdGF0ZSBieSBzaW1wbHkgZGVsZXRpbmcgaXQuKi9cbmludml0YXRpb25LaXRCYWdnYWdlLmRlbGV0ZShaT0VfSU5WSVRBVElPTl9LSVQpO1xuIH1cbmNvbnN0IGludml0YXRpb25LaXQ9cHJlcGFyZUlzc3VlcktpdChcbmludml0YXRpb25LaXRCYWdnYWdlLFxuJ1pvZSBJbnZpdGF0aW9uJyxcbkFzc2V0S2luZC5TRVQsXG51bmRlZmluZWQsXG5zaHV0ZG93blpvZVZhdCxcbntlbGVtZW50U2hhcGU6SW52aXRhdGlvbkVsZW1lbnRTaGFwZX0pO1xuXG5cbnJldHVybiBoYXJkZW4oe1xuaW52aXRhdGlvbklzc3VlcjppbnZpdGF0aW9uS2l0Lmlzc3Vlcixcbmludml0YXRpb25LaXR9KTtcblxuIH07JGjigI1fb25jZS5wcmVwYXJlSW52aXRhdGlvbktpdChwcmVwYXJlSW52aXRhdGlvbktpdCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicHJlcGFyZUludml0YXRpb25LaXQiOlsicHJlcGFyZUludml0YXRpb25LaXQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAjvVUmqkGAACpBgAAOgAAAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL3pvZVNlcnZpY2Uvb2ZmZXIvYnVybkludml0YXRpb24uanN7ImltcG9ydHMiOlsiQGFnb3JpYy9hc3NlcnQiLCJAZW5kby9ldmVudHVhbC1zZW5kIl0sImV4cG9ydHMiOlsiYnVybkludml0YXRpb24iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRmFpbCxhc3NlcnQsWCxFOyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvYXNzZXJ0XCIsIFtbXCJGYWlsXCIsIFskaOKAjV9hID0+IChGYWlsID0gJGjigI1fYSldXSxbXCJhc3NlcnRcIiwgWyRo4oCNX2EgPT4gKGFzc2VydCA9ICRo4oCNX2EpXV0sW1wiZGV0YWlsc1wiLCBbJGjigI1fYSA9PiAoWCA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cbi8qKlxuICogQnVybiB0aGUgaW52aXRhdGlvbiwgYXNzZXJ0IHRoYXQgb25seSBvbmUgaW52aXRhdGlvbiB3YXMgYnVybmVkLFxuICogYW5kIGV4dHJhY3QgYW5kIHJldHVybiB0aGUgaW5zdGFuY2VIYW5kbGUgYW5kIGludml0YXRpb25IYW5kbGVcbiAqXG4gKiBAcGFyYW0ge0lzc3Vlcn0gaW52aXRhdGlvbklzc3VlclxuICogQHBhcmFtIHtFUmVmPFBheW1lbnQ+fSBpbnZpdGF0aW9uXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx7XG4gKiAgIGluc3RhbmNlSGFuZGxlOiBJbnN0YW5jZSxcbiAqICAgaW52aXRhdGlvbkhhbmRsZTogSW52aXRhdGlvbkhhbmRsZSxcbiAqIH0+fVxuICovXG5jb25zdCAgICAgICAgYnVybkludml0YXRpb249KGludml0YXRpb25Jc3N1ZXIsaW52aXRhdGlvbik9PntcbmNvbnN0IGhhbmRsZVJlamVjdGVkPShyZWFzb24pPT57XG5jb25zdCBlcnI9YXNzZXJ0LmVycm9yKFxuWCBgQSBab2UgaW52aXRhdGlvbiBpcyByZXF1aXJlZCwgbm90ICR7aW52aXRhdGlvbn1gKTtcblxuYXNzZXJ0Lm5vdGUoZXJyLFggYER1ZSB0byAke3JlYXNvbn1gKTtcbnRocm93IGVycjtcbiB9O1xuY29uc3QgaGFuZGxlRnVsZmlsbGVkPShpbnZpdGF0aW9uQW1vdW50KT0+e1xuY29uc3QgaW52aXRhdGlvblZhbHVlPWludml0YXRpb25BbW91bnQudmFsdWU7XG5hc3NlcnQoQXJyYXkuaXNBcnJheShpbnZpdGF0aW9uVmFsdWUpKTtcbmludml0YXRpb25WYWx1ZS5sZW5ndGg9PT0xfHxcbkZhaWwgYE9ubHkgb25lIGludml0YXRpb24gY2FuIGJlIHJlZGVlbWVkIGF0IGEgdGltZWA7XG5jb25zdFt7aW5zdGFuY2U6aW5zdGFuY2VIYW5kbGUsaGFuZGxlOmludml0YXRpb25IYW5kbGV9XT1cbmludml0YXRpb25WYWx1ZTtcbnJldHVybiBoYXJkZW4oe1xuaW5zdGFuY2VIYW5kbGUsXG5pbnZpdGF0aW9uSGFuZGxlfSk7XG5cbiB9O1xuXG5yZXR1cm4gRS53aGVuKFxuaW52aXRhdGlvbklzc3Vlci5idXJuKGludml0YXRpb24pLFxuaGFuZGxlRnVsZmlsbGVkLFxuaGFuZGxlUmVqZWN0ZWQpO1xuXG4gfTskaOKAjV9vbmNlLmJ1cm5JbnZpdGF0aW9uKGJ1cm5JbnZpdGF0aW9uKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJidXJuSW52aXRhdGlvbiI6WyJidXJuSW52aXRhdGlvbiJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABmdKOCTwsAAE8LAAAxAAAAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvem9lU2VydmljZS9vZmZlci9vZmZlci5qc3siaW1wb3J0cyI6WyJAZW5kby9tYXJzaGFsIiwiQGFnb3JpYy9zdG9yZSIsIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCIuLi8uLi9jbGVhblByb3Bvc2FsLmpzIiwiLi9idXJuSW52aXRhdGlvbi5qcyIsIi4uL2ludml0YXRpb25RdWVyaWVzLmpzIiwiQGFnb3JpYy9lcnRwL2V4cG9ydGVkLmpzIiwiQGFnb3JpYy9zdG9yZS9leHBvcnRlZC5qcyIsIi4uL2ludGVybmFsLXR5cGVzLmpzIl0sImV4cG9ydHMiOlsibWFrZU9mZmVyTWV0aG9kIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IHBhc3NTdHlsZU9mLG11c3RNYXRjaCxFLGNsZWFuUHJvcG9zYWwsYnVybkludml0YXRpb24sbWFrZUludml0YXRpb25RdWVyeUZuczskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlT2YgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wibXVzdE1hdGNoXCIsIFskaOKAjV9hID0+IChtdXN0TWF0Y2ggPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV1dXSxbXCIuLi8uLi9jbGVhblByb3Bvc2FsLmpzXCIsIFtbXCJjbGVhblByb3Bvc2FsXCIsIFskaOKAjV9hID0+IChjbGVhblByb3Bvc2FsID0gJGjigI1fYSldXV1dLFtcIi4vYnVybkludml0YXRpb24uanNcIiwgW1tcImJ1cm5JbnZpdGF0aW9uXCIsIFskaOKAjV9hID0+IChidXJuSW52aXRhdGlvbiA9ICRo4oCNX2EpXV1dXSxbXCIuLi9pbnZpdGF0aW9uUXVlcmllcy5qc1wiLCBbW1wibWFrZUludml0YXRpb25RdWVyeUZuc1wiLCBbJGjigI1fYSA9PiAobWFrZUludml0YXRpb25RdWVyeUZucyA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL2VydHAvZXhwb3J0ZWQuanNcIiwgW11dLFtcIkBhZ29yaWMvc3RvcmUvZXhwb3J0ZWQuanNcIiwgW11dLFtcIi4uL2ludGVybmFsLXR5cGVzLmpzXCIsIFtdXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdHtxdW90ZTpxLEZhaWx9PWFzc2VydDtcblxuY29uc3QgICAgICAgIG1ha2VPZmZlck1ldGhvZD0ob2ZmZXJEYXRhQWNjZXNzKT0+e1xuLyoqIEB0eXBlIHtPZmZlcn0gKi9cbmNvbnN0IG9mZmVyPWFzeW5jKFxuaW52aXRhdGlvbixcbnVuY2xlYW5Qcm9wb3NhbD1oYXJkZW4oe30pLFxucGF5bWVudEtleXdvcmRSZWNvcmQ9aGFyZGVuKHt9KSxcbm9mZmVyQXJncz11bmRlZmluZWQpPT5cbntcbmNvbnN0IGludml0YXRpb25Jc3N1ZXI9b2ZmZXJEYXRhQWNjZXNzLmdldEludml0YXRpb25Jc3N1ZXIoKTtcbmNvbnN0IHF1ZXJ5PW1ha2VJbnZpdGF0aW9uUXVlcnlGbnMoaW52aXRhdGlvbklzc3Vlcik7XG5jb25zdHtpbnN0YW5jZSxkZXNjcmlwdGlvbn09XG5hd2FpdCBxdWVyeS5nZXRJbnZpdGF0aW9uRGV0YWlscyhpbnZpdGF0aW9uKTtcbi8qIEFXQUlUIC8vLyovXG5cbmNvbnN0IGluc3RhbmNlQWRtaW49YXdhaXQgb2ZmZXJEYXRhQWNjZXNzLmdldEluc3RhbmNlQWRtaW4oaW5zdGFuY2UpO1xuLyogQVdBSVQgLy8vKi9cbiFpbnN0YW5jZUFkbWluLmlzQmxvY2tlZChkZXNjcmlwdGlvbil8fFxuRmFpbCBgbm90IGFjY2VwdGluZyBvZmZlciB3aXRoIGRlc2NyaXB0aW9uICR7cShkZXNjcmlwdGlvbil9YDtcbmNvbnN0e2ludml0YXRpb25IYW5kbGV9PWF3YWl0IGJ1cm5JbnZpdGF0aW9uKFxuaW52aXRhdGlvbklzc3Vlcixcbmludml0YXRpb24pO1xuXG4vKiBBV0FJVCAvLy8qL1xuXG5pbnN0YW5jZUFkbWluLmFzc2VydEFjY2VwdGluZ09mZmVycygpO1xuXG5jb25zdCBnZXRBc3NldEtpbmRCeUJyYW5kPShicmFuZCk9PntcbnJldHVybiBvZmZlckRhdGFBY2Nlc3MuZ2V0QXNzZXRLaW5kQnlCcmFuZChicmFuZCk7XG4gfTtcblxuY29uc3QgcHJvcG9zYWw9Y2xlYW5Qcm9wb3NhbCh1bmNsZWFuUHJvcG9zYWwsZ2V0QXNzZXRLaW5kQnlCcmFuZCk7XG5jb25zdCBwcm9wb3NhbFNoYXBlPVxub2ZmZXJEYXRhQWNjZXNzLmdldFByb3Bvc2FsU2hhcGVGb3JJbnZpdGF0aW9uKGludml0YXRpb25IYW5kbGUpO1xuaWYocHJvcG9zYWxTaGFwZSE9PXVuZGVmaW5lZCl7XG5tdXN0TWF0Y2gocHJvcG9zYWwscHJvcG9zYWxTaGFwZSwgYCR7cShkZXNjcmlwdGlvbil9IHByb3Bvc2FsYCk7XG4gfVxuXG5pZihvZmZlckFyZ3MhPT11bmRlZmluZWQpe1xuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKG9mZmVyQXJncyk7XG5wYXNzU3R5bGU9PT0nY29weVJlY29yZCd8fFxuRmFpbCBgb2ZmZXJBcmdzIG11c3QgYmUgYSBwYXNzLWJ5LWNvcHkgcmVjb3JkLCBidXQgaW5zdGVhZCB3YXMgYSAke3EoXG5wYXNzU3R5bGUpXG4gfTogJHtvZmZlckFyZ3N9YDtcbiB9XG5cbnJldHVybiBFLndoZW4oXG5vZmZlckRhdGFBY2Nlc3MuZGVwb3NpdFBheW1lbnRzKHByb3Bvc2FsLHBheW1lbnRLZXl3b3JkUmVjb3JkKSxcbihpbml0aWFsQWxsb2NhdGlvbik9PlxuaW5zdGFuY2VBZG1pbi5tYWtlVXNlclNlYXQoXG5pbnZpdGF0aW9uSGFuZGxlLFxuaW5pdGlhbEFsbG9jYXRpb24sXG5wcm9wb3NhbCxcbm9mZmVyQXJncykpO1xuXG5cbiB9O1xuXG5yZXR1cm4gb2ZmZXI7XG4gfTskaOKAjV9vbmNlLm1ha2VPZmZlck1ldGhvZChtYWtlT2ZmZXJNZXRob2QpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VPZmZlck1ldGhvZCI6WyJtYWtlT2ZmZXJNZXRob2QiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA/UqM4YIrAACCKwAAMwAAAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL3pvZVNlcnZpY2Uvc3RhcnRJbnN0YW5jZS5qc3siaW1wb3J0cyI6WyJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGVuZG8vbWFyc2hhbCIsIkBhZ29yaWMvdmF0LWRhdGEiLCJAYWdvcmljL3N0b3JlIiwiQGFnb3JpYy9pbnRlcm5hbC9zcmMvdXBncmFkZS1hcGkuanMiLCIuLi9tYWtlSGFuZGxlLmpzIiwiLi9pbnN0YW5jZUFkbWluU3RvcmFnZS5qcyIsIi4uL3R5cGVHdWFyZHMuanMiXSwiZXhwb3J0cyI6WyJtYWtlU3RhcnRJbnN0YW5jZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBFLHBhc3NTdHlsZU9mLE0sbWFrZVNjYWxhckJpZ01hcFN0b3JlLHByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlLHByZXBhcmVFeG9DbGFzcyxwcmVwYXJlRXhvLGluaXRFbXB0eSxpc1VwZ3JhZGVEaXNjb25uZWN0aW9uLGRlZmluZUR1cmFibGVIYW5kbGUsbWFrZUluc3RhbmNlQWRtaW5NYWtlcixBZG1pbkZhY2V0SSxJbnN0YW5jZUFkbWluSSxJbnN0YW5jZUFkbWluU2hhcGU7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlT2YgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy92YXQtZGF0YVwiLCBbW1wiTVwiLCBbJGjigI1fYSA9PiAoTSA9ICRo4oCNX2EpXV0sW1wibWFrZVNjYWxhckJpZ01hcFN0b3JlXCIsIFskaOKAjV9hID0+IChtYWtlU2NhbGFyQmlnTWFwU3RvcmUgPSAkaOKAjV9hKV1dLFtcInByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlXCIsIFskaOKAjV9hID0+IChwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSA9ICRo4oCNX2EpXV0sW1wicHJlcGFyZUV4b0NsYXNzXCIsIFskaOKAjV9hID0+IChwcmVwYXJlRXhvQ2xhc3MgPSAkaOKAjV9hKV1dLFtcInByZXBhcmVFeG9cIiwgWyRo4oCNX2EgPT4gKHByZXBhcmVFeG8gPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiaW5pdEVtcHR5XCIsIFskaOKAjV9hID0+IChpbml0RW1wdHkgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9pbnRlcm5hbC9zcmMvdXBncmFkZS1hcGkuanNcIiwgW1tcImlzVXBncmFkZURpc2Nvbm5lY3Rpb25cIiwgWyRo4oCNX2EgPT4gKGlzVXBncmFkZURpc2Nvbm5lY3Rpb24gPSAkaOKAjV9hKV1dXV0sW1wiLi4vbWFrZUhhbmRsZS5qc1wiLCBbW1wiZGVmaW5lRHVyYWJsZUhhbmRsZVwiLCBbJGjigI1fYSA9PiAoZGVmaW5lRHVyYWJsZUhhbmRsZSA9ICRo4oCNX2EpXV1dXSxbXCIuL2luc3RhbmNlQWRtaW5TdG9yYWdlLmpzXCIsIFtbXCJtYWtlSW5zdGFuY2VBZG1pbk1ha2VyXCIsIFskaOKAjV9hID0+IChtYWtlSW5zdGFuY2VBZG1pbk1ha2VyID0gJGjigI1fYSldXV1dLFtcIi4uL3R5cGVHdWFyZHMuanNcIiwgW1tcIkFkbWluRmFjZXRJXCIsIFskaOKAjV9hID0+IChBZG1pbkZhY2V0SSA9ICRo4oCNX2EpXV0sW1wiSW5zdGFuY2VBZG1pbklcIiwgWyRo4oCNX2EgPT4gKEluc3RhbmNlQWRtaW5JID0gJGjigI1fYSldXSxbXCJJbnN0YW5jZUFkbWluU2hhcGVcIiwgWyRo4oCNX2EgPT4gKEluc3RhbmNlQWRtaW5TaGFwZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BhZ29yaWMvdmF0LWRhdGEnKS5CYWdnYWdlfSBCYWdnYWdlICovXG4vKiogQHR5cGVkZWYgeyBYaW1wb3J0KCdAYWdvcmljL3N3aW5nc2V0LXZhdCcpLkJ1bmRsZUNhcH0gQnVuZGxlQ2FwICovXG5cbmNvbnN0e0ZhaWwscXVvdGU6cX09YXNzZXJ0O1xuXG4vKipcbiAqIEBwYXJhbSB7UGljazxab2VTdG9yYWdlTWFuYWdlciwgJ21ha2Vab2VJbnN0YW5jZVN0b3JhZ2VNYW5hZ2VyJyB8ICd1bndyYXBJbnN0YWxsYXRpb24nPn0gc3RhcnRJbnN0YW5jZUFjY2Vzc1xuICogQHBhcmFtIHsoKSA9PiBFUmVmPEJ1bmRsZUNhcD59IGdldFpjZkJ1bmRsZUNhcFBcbiAqIEBwYXJhbSB7KGlkOiBzdHJpbmcpID0+IEJ1bmRsZUNhcH0gZ2V0QnVuZGxlQ2FwQnlJZE5vd1xuICogQHBhcmFtIHtCYWdnYWdlfSB6b2VCYWdnYWdlXG4gKiBAcmV0dXJucyB7WGltcG9ydCgnLi91dGlscycpLlN0YXJ0SW5zdGFuY2V9XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlU3RhcnRJbnN0YW5jZT0oXG5zdGFydEluc3RhbmNlQWNjZXNzLFxuZ2V0WmNmQnVuZGxlQ2FwUCxcbmdldEJ1bmRsZUNhcEJ5SWROb3csXG56b2VCYWdnYWdlKT0+XG57XG5jb25zdCBtYWtlSW5zdGFuY2VIYW5kbGU9ZGVmaW5lRHVyYWJsZUhhbmRsZSh6b2VCYWdnYWdlLCdJbnN0YW5jZScpO1xuXG4vKiogQHR5cGUge1dlYWtNYXBTdG9yZTxTZWF0SGFuZGxlLCBab2VTZWF0QWRtaW4+fSAqL1xuY29uc3Qgc2VhdEhhbmRsZVRvWm9lU2VhdEFkbWluPXByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlKFxuem9lQmFnZ2FnZSxcbidzZWF0SGFuZGxlVG9ab2VTZWF0QWRtaW4nKTtcblxuXG5jb25zdCBpbnN0YW5jZUFkbWluTWFrZXI9bWFrZUluc3RhbmNlQWRtaW5NYWtlcihcbnpvZUJhZ2dhZ2UsXG5zZWF0SGFuZGxlVG9ab2VTZWF0QWRtaW4pO1xuXG5cbmNvbnN0IGdldEZyZXNoWmNmQnVuZGxlQ2FwPWFzeW5jKCk9PntcbmNvbnN0IHNldHRsZWRCdW5kbGVDYXA9YXdhaXQgZ2V0WmNmQnVuZGxlQ2FwUCgpO1xuc2V0dGxlZEJ1bmRsZUNhcCE9PXVuZGVmaW5lZHx8RmFpbCBgdGhlIFpDRiBidW5kbGUgY2FwIHdhcyBicm9rZW5gO1xucmV0dXJuIHNldHRsZWRCdW5kbGVDYXA7XG4gfTtcblxuY29uc3QgSW5zdGFuY2VBZG1pblN0YXRlU2hhcGU9aGFyZGVuKHtcbmluc3RhbmNlU3RvcmFnZTpNLnJlbW90YWJsZSgnWm9lSW5zdGFuY2VTdG9yYWdlTWFuYWdlcicpLFxuaW5zdGFuY2VBZG1pbjpNLnJlbW90YWJsZSgnSW5zdGFuY2VBZG1pbicpLFxuc2VhdEhhbmRsZVRvU2VhdEFkbWluOk0ucmVtb3RhYmxlKCksLyogc2VhdEhhbmRsZVRvU2VhdEFkbWluLCBidXQgcHV0dGluZyB0aGF0IHN0cmluZyBoZXJlIGlzIGJhY2t3YXJkcy1pbmNvbXBhdGlibGUqL1xuYWRtaW5Ob2RlOk0ucmVtb3RhYmxlKCdhZG1pbk5vZGUnKX0pO1xuXG5cbmNvbnN0IHdhdGNoZXI9cHJlcGFyZUV4byhcbnpvZUJhZ2dhZ2UsXG4nSW5zdGFuY2VDb21wbGV0aW9uV2F0Y2hlcicsXG5NLmludGVyZmFjZSgnSW5zdGFuY2VDb21wbGV0aW9uV2F0Y2hlcicse1xub25GdWxmaWxsZWQ6TS5jYWxsKE0uYW55KCksSW5zdGFuY2VBZG1pblNoYXBlKS5yZXR1cm5zKCksXG5vblJlamVjdGVkOk0uY2FsbChcbk0uYW55KCksXG5JbnN0YW5jZUFkbWluU2hhcGUsXG5NLnJlbW90YWJsZSgnYWRtaW5Ob2RlJykpLlxucmV0dXJucygpfSksXG5cbntcbm9uRnVsZmlsbGVkOihjb21wbGV0aW9uLGluc3RhbmNlQWRtaW4pPT5cbmluc3RhbmNlQWRtaW4uZXhpdEFsbFNlYXRzKGNvbXBsZXRpb24pLFxub25SZWplY3RlZDoocmVhc29uLGluc3RhbmNlQWRtaW4sYWRtaW5Ob2RlKT0+e1xuaWYoaXNVcGdyYWRlRGlzY29ubmVjdGlvbihyZWFzb24pKXtcbmNvbnNvbGUubG9nKCBgcmVzZXR0aW5nIHByb21pc2Ugd2F0Y2hlciBhZnRlciB1cGdyYWRlYCxyZWFzb24pO1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbndhdGNoRm9yQWRtaW5Ob2RlRG9uZShhZG1pbk5vZGUsaW5zdGFuY2VBZG1pbik7XG4gfWVsc2V7XG5pbnN0YW5jZUFkbWluLmZhaWxBbGxTZWF0cyhyZWFzb24pO1xuIH1cbiB9fSk7XG5cblxuXG5jb25zdCB3YXRjaEZvckFkbWluTm9kZURvbmU9KGFkbWluTm9kZSxpbnN0QWRtaW4pPT57XG5nbG9iYWxUaGlzLlZhdERhdGEud2F0Y2hQcm9taXNlKFxuRShhZG1pbk5vZGUpLmRvbmUoKSxcbndhdGNoZXIsXG5pbnN0QWRtaW4sXG5hZG1pbk5vZGUpO1xuXG4gfTtcblxuY29uc3QgbWFrZVpvZUluc3RhbmNlQWRtaW49cHJlcGFyZUV4b0NsYXNzKFxuem9lQmFnZ2FnZSxcbid6b2VJbnN0YW5jZUFkbWluJyxcbkluc3RhbmNlQWRtaW5JLFxuLyoqXG4gKlxuICogQHBhcmFtIHtab2VJbnN0YW5jZVN0b3JhZ2VNYW5hZ2VyfSBpbnN0YW5jZVN0b3JhZ2VcbiAqIEBwYXJhbSB7SW5zdGFuY2VBZG1pbn0gaW5zdGFuY2VBZG1pblxuICogQHBhcmFtIHtXZWFrTWFwU3RvcmU8U2VhdEhhbmRsZSwgWm9lU2VhdEFkbWluPn0gc2VhdEhhbmRsZVRvU2VhdEFkbWluXG4gKiBAcGFyYW0ge1hpbXBvcnQoJ0BhZ29yaWMvc3dpbmdzZXQtdmF0JykuVmF0QWRtaW5GYWNldH0gYWRtaW5Ob2RlXG4gKi9cbihpbnN0YW5jZVN0b3JhZ2UsaW5zdGFuY2VBZG1pbixzZWF0SGFuZGxlVG9TZWF0QWRtaW4sYWRtaW5Ob2RlKT0+KHtcbmluc3RhbmNlU3RvcmFnZSxcbmluc3RhbmNlQWRtaW4sXG5zZWF0SGFuZGxlVG9TZWF0QWRtaW4sXG5hZG1pbk5vZGV9KSxcblxue1xubWFrZUludml0YXRpb24oaGFuZGxlLGRlc2MsY3VzdG9tRGV0YWlscyxwcm9wb3NhbFNoYXBlKXtcbmNvbnN0e3N0YXRlfT10aGlzO1xucmV0dXJuIHN0YXRlLmluc3RhbmNlU3RvcmFnZS5tYWtlSW52aXRhdGlvbihcbmhhbmRsZSxcbmRlc2MsXG5jdXN0b21EZXRhaWxzLFxucHJvcG9zYWxTaGFwZSk7XG5cbiB9LFxuLyogY2hlY2tzIG9mIGtleXdvcmQgZG9uZSBvbiB6Y2Ygc2lkZSovXG5zYXZlSXNzdWVyKGlzc3VlcixrZXl3b3JkKXtcbmNvbnN0e3N0YXRlfT10aGlzO1xucmV0dXJuIHN0YXRlLmluc3RhbmNlU3RvcmFnZS5zYXZlSXNzdWVyKGlzc3VlcixrZXl3b3JkKTtcbiB9LFxuLyogQSBTZWF0IHJlcXVlc3RlZCBieSB0aGUgY29udHJhY3Qgd2l0aG91dCBhbnkgcGF5bWVudHMgdG8gZXNjcm93Ki9cbm1ha2VOb0VzY3Jvd1NlYXQoaW5pdGlhbEFsbG9jYXRpb25zLHByb3Bvc2FsLGV4aXRPYmosc2VhdEhhbmRsZSl7XG5jb25zdHtzdGF0ZX09dGhpcztcbnJldHVybiBzdGF0ZS5pbnN0YW5jZUFkbWluLm1ha2VOb0VzY3Jvd1NlYXQoXG5pbml0aWFsQWxsb2NhdGlvbnMsXG5wcm9wb3NhbCxcbmV4aXRPYmosXG5zZWF0SGFuZGxlKTtcblxuIH0sXG5leGl0QWxsU2VhdHMoY29tcGxldGlvbil7XG5jb25zdHtzdGF0ZX09dGhpcztcbnN0YXRlLmluc3RhbmNlQWRtaW4uZXhpdEFsbFNlYXRzKGNvbXBsZXRpb24pO1xuIH0sXG5mYWlsQWxsU2VhdHMocmVhc29uKXtcbmNvbnN0e3N0YXRlfT10aGlzO1xucmV0dXJuIHN0YXRlLmluc3RhbmNlQWRtaW4uZmFpbEFsbFNlYXRzKHJlYXNvbik7XG4gfSxcbmV4aXRTZWF0KHNlYXRIYW5kbGUsY29tcGxldGlvbil7XG5jb25zdHtzdGF0ZX09dGhpcztcbnN0YXRlLnNlYXRIYW5kbGVUb1NlYXRBZG1pbi5nZXQoc2VhdEhhbmRsZSkuZXhpdChjb21wbGV0aW9uKTtcbiB9LFxuZmFpbFNlYXQoc2VhdEhhbmRsZSxyZWFzb24pe1xuY29uc3R7c3RhdGV9PXRoaXM7XG5zdGF0ZS5zZWF0SGFuZGxlVG9TZWF0QWRtaW4uZ2V0KHNlYXRIYW5kbGUpLmZhaWwocmVhc29uKTtcbiB9LFxubWFrZVpvZU1pbnQoa2V5d29yZCxhc3NldEtpbmQsZGlzcGxheUluZm8sb3B0aW9ucyl7XG5jb25zdHtzdGF0ZX09dGhpcztcbnJldHVybiBzdGF0ZS5pbnN0YW5jZVN0b3JhZ2UubWFrZVpvZU1pbnQoXG5rZXl3b3JkLFxuYXNzZXRLaW5kLFxuZGlzcGxheUluZm8sXG5vcHRpb25zKTtcblxuIH0sXG5yZWdpc3RlckZlZU1pbnQoa2V5d29yZCxmZWVNaW50QWNjZXNzKXtcbmNvbnN0e3N0YXRlfT10aGlzO1xucmV0dXJuIHN0YXRlLmluc3RhbmNlU3RvcmFnZS5yZWdpc3RlckZlZU1pbnQoa2V5d29yZCxmZWVNaW50QWNjZXNzKTtcbiB9LFxucmVwbGFjZUFsbG9jYXRpb25zKHNlYXRIYW5kbGVBbGxvY2F0aW9ucyl7XG5jb25zdHtzdGF0ZX09dGhpcztcbnRyeXtcbmZvcihjb25zdHtzZWF0SGFuZGxlLGFsbG9jYXRpb259b2Ygc2VhdEhhbmRsZUFsbG9jYXRpb25zKXtcbmNvbnN0IHpvZVNlYXRBZG1pbj1zdGF0ZS5zZWF0SGFuZGxlVG9TZWF0QWRtaW4uZ2V0KHNlYXRIYW5kbGUpO1xuem9lU2VhdEFkbWluLnJlcGxhY2VBbGxvY2F0aW9uKGFsbG9jYXRpb24pO1xuIH1cbiB9Y2F0Y2goZXJyKXtcbi8qIG5vdGhpbmcgZm9yIFpvZSB0byBkbyBpZiB0aGUgdGVybWluYXRpb24gZmFpbHMqL1xudm9pZCBFKHN0YXRlLmFkbWluTm9kZSkudGVybWluYXRlV2l0aEZhaWx1cmUoZXJyKTtcbnRocm93IGVycjtcbiB9XG4gfSxcbnN0b3BBY2NlcHRpbmdPZmZlcnMoKXtcbmNvbnN0e3N0YXRlfT10aGlzO1xucmV0dXJuIHN0YXRlLmluc3RhbmNlQWRtaW4uc3RvcEFjY2VwdGluZ09mZmVycygpO1xuIH0sXG5zZXRPZmZlckZpbHRlcihzdHJpbmdzKXtcbmNvbnN0e3N0YXRlfT10aGlzO1xuc3RhdGUuaW5zdGFuY2VBZG1pbi5zZXRPZmZlckZpbHRlcihzdHJpbmdzKTtcbiB9LFxuZ2V0T2ZmZXJGaWx0ZXIoKXtcbmNvbnN0e3N0YXRlfT10aGlzO1xucmV0dXJuIHN0YXRlLmluc3RhbmNlQWRtaW4uZ2V0T2ZmZXJGaWx0ZXIoKTtcbiB9LFxuZ2V0RXhpdFN1YnNjcmliZXIoc2VhdEhhbmRsZSl7XG5jb25zdHtzdGF0ZX09dGhpcztcbnJldHVybiBzdGF0ZS5zZWF0SGFuZGxlVG9TZWF0QWRtaW4uZ2V0KHNlYXRIYW5kbGUpLmdldEV4aXRTdWJzY3JpYmVyKCk7XG4gfSxcbmlzQmxvY2tlZChzdHJpbmcpe1xuY29uc3R7c3RhdGV9PXRoaXM7XG5yZXR1cm4gc3RhdGUuaW5zdGFuY2VBZG1pbi5pc0Jsb2NrZWQoc3RyaW5nKTtcbiB9LFxucmVwYWlyQ29udHJhY3RDb21wbGV0aW9uV2F0Y2hlcigpe1xuY29uc3R7c3RhdGUsc2VsZn09dGhpcztcbnZvaWQgd2F0Y2hGb3JBZG1pbk5vZGVEb25lKHN0YXRlLmFkbWluTm9kZSxzZWxmKTtcbiB9fSxcblxue1xuc3RhdGVTaGFwZTpJbnN0YW5jZUFkbWluU3RhdGVTaGFwZX0pO1xuXG5cblxuY29uc3QgcHJlcGFyZUVtcHR5RmFjZXQ9KGZhY2V0TmFtZSk9PlxucHJlcGFyZUV4b0NsYXNzKFxuem9lQmFnZ2FnZSxcbmZhY2V0TmFtZSxcbk0uaW50ZXJmYWNlKGZhY2V0TmFtZSx7fSksXG5pbml0RW1wdHksXG57fSk7XG5cbmNvbnN0IG1ha2VFbXB0eUNyZWF0b3JGYWNldD1wcmVwYXJlRW1wdHlGYWNldCgnZW1wdHlDcmVhdG9yRmFjZXQnKTtcbmNvbnN0IG1ha2VFbXB0eVB1YmxpY0ZhY2V0PXByZXBhcmVFbXB0eUZhY2V0KCdlbXB0eVB1YmxpY0ZhY2V0Jyk7XG5cbmNvbnN0IG1ha2VBZG1pbkZhY2V0PXByZXBhcmVFeG9DbGFzcyhcbnpvZUJhZ2dhZ2UsXG4nYWRtaW5GYWNldCcsXG5BZG1pbkZhY2V0SSxcbi8qKlxuICpcbiAqIEBwYXJhbSB7WGltcG9ydCgnQGFnb3JpYy9zd2luZ3NldC12YXQnKS5WYXRBZG1pbkZhY2V0fSBhZG1pbk5vZGVcbiAqIEBwYXJhbSB7Kn0gY29udHJhY3RCdW5kbGVDYXBcbiAqL1xuKGFkbWluTm9kZSxjb250cmFjdEJ1bmRsZUNhcCk9Pih7XG5hZG1pbk5vZGUsXG5jb250cmFjdEJ1bmRsZUNhcH0pLFxuXG57XG5nZXRWYXRTaHV0ZG93blByb21pc2UoKXtcbmNvbnN0e3N0YXRlfT10aGlzO1xuXG5yZXR1cm4gRShzdGF0ZS5hZG1pbk5vZGUpLmRvbmUoKTtcbiB9LFxucmVzdGFydENvbnRyYWN0KG5ld1ByaXZhdGVBcmdzPXVuZGVmaW5lZCl7XG5jb25zdHtzdGF0ZX09dGhpcztcblxuY29uc3QgdmF0UGFyYW1ldGVycz17XG5jb250cmFjdEJ1bmRsZUNhcDpzdGF0ZS5jb250cmFjdEJ1bmRsZUNhcCxcbnByaXZhdGVBcmdzOm5ld1ByaXZhdGVBcmdzfTtcblxuXG5yZXR1cm4gRS53aGVuKGdldEZyZXNoWmNmQnVuZGxlQ2FwKCksKGJDYXApPT5cbkUoc3RhdGUuYWRtaW5Ob2RlKS51cGdyYWRlKGJDYXAse3ZhdFBhcmFtZXRlcnN9KSk7XG5cbiB9LFxuICAgICAgYXN5bmMgdXBncmFkZUNvbnRyYWN0KGNvbnRyYWN0QnVuZGxlSWQsbmV3UHJpdmF0ZUFyZ3M9dW5kZWZpbmVkKXtcbmNvbnN0e3N0YXRlfT10aGlzO1xuXG5jb25zdCBuZXdDb250cmFjdEJ1bmRsZUNhcD1cbmF3YWl0IGdldEJ1bmRsZUNhcEJ5SWROb3coY29udHJhY3RCdW5kbGVJZCk7XG5jb25zdCB2YXRQYXJhbWV0ZXJzPXtcbmNvbnRyYWN0QnVuZGxlQ2FwOm5ld0NvbnRyYWN0QnVuZGxlQ2FwLFxucHJpdmF0ZUFyZ3M6bmV3UHJpdmF0ZUFyZ3N9O1xuXG5yZXR1cm4gRS53aGVuKGdldEZyZXNoWmNmQnVuZGxlQ2FwKCksKGJDYXApPT5cbkUoc3RhdGUuYWRtaW5Ob2RlKS51cGdyYWRlKGJDYXAse3ZhdFBhcmFtZXRlcnN9KSk7XG5cbiB9fSk7XG5cblxuXG5jb25zdCBzdGFydEluc3RhbmNlPWFzeW5jKFxuaW5zdGFsbGF0aW9uUCxcbnVuY2xlYW5Jc3N1ZXJLZXl3b3JkUmVjb3JkPWhhcmRlbih7fSksXG5jdXN0b21UZXJtcz1oYXJkZW4oe30pLFxucHJpdmF0ZUFyZ3M9dW5kZWZpbmVkLFxuaW5zdGFuY2VMYWJlbD0nJyk9Plxue1xuY29uc3R7aW5zdGFsbGF0aW9uLGJ1bmRsZSxidW5kbGVDYXB9PVxuYXdhaXQgRShzdGFydEluc3RhbmNlQWNjZXNzKS51bndyYXBJbnN0YWxsYXRpb24oaW5zdGFsbGF0aW9uUCk7XG4vKiBBV0FJVCAvLy8qL1xuXG5jb25zdCBjb250cmFjdEJ1bmRsZUNhcD1idW5kbGV8fGJ1bmRsZUNhcDtcbmFzc2VydChjb250cmFjdEJ1bmRsZUNhcCk7XG5cbmlmKHByaXZhdGVBcmdzIT09dW5kZWZpbmVkKXtcbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihwcml2YXRlQXJncyk7XG5wYXNzU3R5bGU9PT0nY29weVJlY29yZCd8fFxuRmFpbCBgcHJpdmF0ZUFyZ3MgbXVzdCBiZSBhIHBhc3MtYnktY29weSByZWNvcmQsIGJ1dCBpbnN0ZWFkIHdhcyBhICR7cShcbnBhc3NTdHlsZSlcbiB9OiAke3ByaXZhdGVBcmdzfWA7XG4gfVxuXG5jb25zdCBpbnN0YW5jZUhhbmRsZT1tYWtlSW5zdGFuY2VIYW5kbGUoKTtcblxuY29uc3QgaW5zdGFuY2VCYWdnYWdlPW1ha2VTY2FsYXJCaWdNYXBTdG9yZSgnaW5zdGFuY2VCYWdnYWdlJyx7XG5kdXJhYmxlOnRydWV9KTtcblxuXG5jb25zdCB6b2VJbnN0YW5jZVN0b3JhZ2VNYW5hZ2VyPWF3YWl0IEUoXG5zdGFydEluc3RhbmNlQWNjZXNzKS5cbm1ha2Vab2VJbnN0YW5jZVN0b3JhZ2VNYW5hZ2VyKFxuaW5zdGFuY2VCYWdnYWdlLFxuaW5zdGFsbGF0aW9uLFxuY3VzdG9tVGVybXMsXG51bmNsZWFuSXNzdWVyS2V5d29yZFJlY29yZCxcbmluc3RhbmNlSGFuZGxlLFxuY29udHJhY3RCdW5kbGVDYXAsXG5pbnN0YW5jZUxhYmVsKTtcblxuLyogQVdBSVQgLy8vKi9cblxuY29uc3QgYWRtaW5Ob2RlPXpvZUluc3RhbmNlU3RvcmFnZU1hbmFnZXIuZ2V0QWRtaW5Ob2RlKCk7XG4vKiogQHR5cGUge1pDRlJvb3R9ICovXG5jb25zdCB6Y2ZSb290PXpvZUluc3RhbmNlU3RvcmFnZU1hbmFnZXIuZ2V0Um9vdCgpO1xuXG4vKiogQHR5cGUge0luc3RhbmNlQWRtaW59ICovXG5jb25zdCBpbnN0YW5jZUFkbWluPWluc3RhbmNlQWRtaW5NYWtlcihcbmluc3RhbmNlSGFuZGxlLFxuem9lSW5zdGFuY2VTdG9yYWdlTWFuYWdlcixcbmFkbWluTm9kZSk7XG5cbnpvZUluc3RhbmNlU3RvcmFnZU1hbmFnZXIuaW5pdEluc3RhbmNlQWRtaW4oaW5zdGFuY2VIYW5kbGUsaW5zdGFuY2VBZG1pbik7XG5cbnZvaWQgd2F0Y2hGb3JBZG1pbk5vZGVEb25lKGFkbWluTm9kZSxpbnN0YW5jZUFkbWluKTtcblxuLyoqIEB0eXBlIHtab2VJbnN0YW5jZUFkbWlufSAqL1xuY29uc3Qgem9lSW5zdGFuY2VBZG1pbkZvclpjZj1tYWtlWm9lSW5zdGFuY2VBZG1pbihcbnpvZUluc3RhbmNlU3RvcmFnZU1hbmFnZXIsXG5pbnN0YW5jZUFkbWluLFxuc2VhdEhhbmRsZVRvWm9lU2VhdEFkbWluLFxuYWRtaW5Ob2RlKTtcblxuXG4vKiBBdCB0aGlzIHBvaW50LCB0aGUgY29udHJhY3Qgd2lsbCBzdGFydCBleGVjdXRpbmcuIEFsbCBtdXN0IGJlIHJlYWR5Ki9cblxuY29uc3R7XG5jcmVhdG9yRmFjZXQ9bWFrZUVtcHR5Q3JlYXRvckZhY2V0KCksXG5wdWJsaWNGYWNldD1tYWtlRW1wdHlQdWJsaWNGYWNldCgpLFxuY3JlYXRvckludml0YXRpb246Y3JlYXRvckludml0YXRpb25QLFxuaGFuZGxlT2ZmZXJPYmp9PVxuYXdhaXQgRSh6Y2ZSb290KS5zdGFydFpjZihcbnpvZUluc3RhbmNlQWRtaW5Gb3JaY2YsXG56b2VJbnN0YW5jZVN0b3JhZ2VNYW5hZ2VyLmdldEluc3RhbmNlUmVjb3JkKCksXG56b2VJbnN0YW5jZVN0b3JhZ2VNYW5hZ2VyLmdldElzc3VlclJlY29yZHMoKSxcbnByaXZhdGVBcmdzKTtcblxuXG5pbnN0YW5jZUFkbWluLmluaXREZWxheWVkU3RhdGUoaGFuZGxlT2ZmZXJPYmoscHVibGljRmFjZXQpO1xuXG4vKiBjcmVhdG9ySW52aXRhdGlvbiBjYW4gYmUgdW5kZWZpbmVkLCBidXQgaWYgaXQgaXMgZGVmaW5lZCwqL1xuLyogbGV0J3MgbWFrZSBzdXJlIGl0IGlzIGFuIGludml0YXRpb24uKi9cbnJldHVybiBFLndoZW4oXG5Qcm9taXNlLmFsbChbXG5jcmVhdG9ySW52aXRhdGlvblAsXG5jcmVhdG9ySW52aXRhdGlvblAhPT11bmRlZmluZWQmJlxuem9lSW5zdGFuY2VTdG9yYWdlTWFuYWdlci5cbmdldEludml0YXRpb25Jc3N1ZXIoKS5cbmlzTGl2ZShjcmVhdG9ySW52aXRhdGlvblApXSksXG5cbihbY3JlYXRvckludml0YXRpb24saXNMaXZlUmVzdWx0XSk9PntcbmNyZWF0b3JJbnZpdGF0aW9uPT09dW5kZWZpbmVkfHxcbmlzTGl2ZVJlc3VsdHx8XG5GYWlsIGBUaGUgY29udHJhY3QgZGlkIG5vdCBjb3JyZWN0bHkgcmV0dXJuIGEgY3JlYXRvckludml0YXRpb25gO1xuXG5jb25zdCBhZG1pbkZhY2V0PW1ha2VBZG1pbkZhY2V0KGFkbWluTm9kZSxjb250cmFjdEJ1bmRsZUNhcCk7XG5cbi8qIEFjdHVhbGx5IHJldHVybmVkIHRvIHRoZSB1c2VyLiovXG5yZXR1cm4gaGFyZGVuKHtcbmNyZWF0b3JGYWNldCxcblxuLyogVE9ETyAoIzU3NzUpIGRlcHJlY2F0ZSB0aGlzIHJldHVybiB2YWx1ZSBmcm9tIGNvbnRyYWN0cy4qL1xuY3JlYXRvckludml0YXRpb24sXG5pbnN0YW5jZTppbnN0YW5jZUhhbmRsZSxcbnB1YmxpY0ZhY2V0LFxuYWRtaW5GYWNldH0pO1xuXG4gfSk7XG5cbiB9O1xuLyogQHRzLWV4cGVjdC1lcnJvciBjYXN0Ki9cbnJldHVybiBoYXJkZW4oc3RhcnRJbnN0YW5jZSk7XG4gfTskaOKAjV9vbmNlLm1ha2VTdGFydEluc3RhbmNlKG1ha2VTdGFydEluc3RhbmNlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlU3RhcnRJbnN0YW5jZSI6WyJtYWtlU3RhcnRJbnN0YW5jZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADIsxF2myIAAJsiAAApAAAAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvem9lU2VydmljZS96b2UuanN7ImltcG9ydHMiOlsiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL21hcnNoYWwiLCJAYWdvcmljL3ZhdC1kYXRhIiwiQGFnb3JpYy9zdG9yZSIsIi4vem9lU3RvcmFnZU1hbmFnZXIuanMiLCIuL3N0YXJ0SW5zdGFuY2UuanMiLCIuL29mZmVyL29mZmVyLmpzIiwiLi9pbnZpdGF0aW9uUXVlcmllcy5qcyIsIi4vY3JlYXRlWkNGVmF0LmpzIiwiLi9mZWVNaW50LmpzIiwiLi4vdHlwZUd1YXJkcy5qcyJdLCJleHBvcnRzIjpbIm1ha2VEdXJhYmxlWm9lS2l0IiwibWFrZVpvZUtpdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBFLEZhcixtYWtlU2NhbGFyQmlnTWFwU3RvcmUscHJlcGFyZUV4byxNLG1ha2Vab2VTdG9yYWdlTWFuYWdlcixtYWtlU3RhcnRJbnN0YW5jZSxtYWtlT2ZmZXJNZXRob2QsbWFrZUludml0YXRpb25RdWVyeUZucyxnZXRaY2ZCdW5kbGVDYXAsZGVmYXVsdEZlZUlzc3VlckNvbmZpZyxwcmVwYXJlRmVlTWludCxab2VTZXJ2aWNlSTskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvdmF0LWRhdGFcIiwgW1tcIm1ha2VTY2FsYXJCaWdNYXBTdG9yZVwiLCBbJGjigI1fYSA9PiAobWFrZVNjYWxhckJpZ01hcFN0b3JlID0gJGjigI1fYSldXSxbXCJwcmVwYXJlRXhvXCIsIFskaOKAjV9hID0+IChwcmVwYXJlRXhvID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIk1cIiwgWyRo4oCNX2EgPT4gKE0gPSAkaOKAjV9hKV1dXV0sW1wiLi96b2VTdG9yYWdlTWFuYWdlci5qc1wiLCBbW1wibWFrZVpvZVN0b3JhZ2VNYW5hZ2VyXCIsIFskaOKAjV9hID0+IChtYWtlWm9lU3RvcmFnZU1hbmFnZXIgPSAkaOKAjV9hKV1dXV0sW1wiLi9zdGFydEluc3RhbmNlLmpzXCIsIFtbXCJtYWtlU3RhcnRJbnN0YW5jZVwiLCBbJGjigI1fYSA9PiAobWFrZVN0YXJ0SW5zdGFuY2UgPSAkaOKAjV9hKV1dXV0sW1wiLi9vZmZlci9vZmZlci5qc1wiLCBbW1wibWFrZU9mZmVyTWV0aG9kXCIsIFskaOKAjV9hID0+IChtYWtlT2ZmZXJNZXRob2QgPSAkaOKAjV9hKV1dXV0sW1wiLi9pbnZpdGF0aW9uUXVlcmllcy5qc1wiLCBbW1wibWFrZUludml0YXRpb25RdWVyeUZuc1wiLCBbJGjigI1fYSA9PiAobWFrZUludml0YXRpb25RdWVyeUZucyA9ICRo4oCNX2EpXV1dXSxbXCIuL2NyZWF0ZVpDRlZhdC5qc1wiLCBbW1wiZ2V0WmNmQnVuZGxlQ2FwXCIsIFskaOKAjV9hID0+IChnZXRaY2ZCdW5kbGVDYXAgPSAkaOKAjV9hKV1dXV0sW1wiLi9mZWVNaW50LmpzXCIsIFtbXCJkZWZhdWx0RmVlSXNzdWVyQ29uZmlnXCIsIFskaOKAjV9hID0+IChkZWZhdWx0RmVlSXNzdWVyQ29uZmlnID0gJGjigI1fYSldXSxbXCJwcmVwYXJlRmVlTWludFwiLCBbJGjigI1fYSA9PiAocHJlcGFyZUZlZU1pbnQgPSAkaOKAjV9hKV1dXV0sW1wiLi4vdHlwZUd1YXJkcy5qc1wiLCBbW1wiWm9lU2VydmljZUlcIiwgWyRo4oCNX2EgPT4gKFpvZVNlcnZpY2VJID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAYWdvcmljL3ZhdC1kYXRhJykuQmFnZ2FnZX0gQmFnZ2FnZSAqL1xuXG5jb25zdHtGYWlsfT1hc3NlcnQ7XG5cbi8qKlxuICogQ3JlYXRlIGEgZHVyYWJsZSBpbnN0YW5jZSBvZiBab2UuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gb3B0aW9ucy56b2VCYWdnYWdlIC0gdGhlIGJhZ2dhZ2UgZm9yIFpvZSBkdXJhYmlsaXR5LiBNdXN0IGJlIHByb3ZpZGVkIGJ5IGNhbGxlclxuICogQHBhcmFtIHtQcm9taXNlPFZhdEFkbWluU3ZjPiB8IFZhdEFkbWluU3ZjfSBbb3B0aW9ucy52YXRBZG1pblN2Y10gLSBUaGUgdmF0QWRtaW4gU2VydmljZSwgd2hpY2ggY2FycmllcyB0aGVcbiAqIHBvd2VyIHRvIGNyZWF0ZSBhIG5ldyB2YXQuIElmIGl0J3Mgbm90IGF2YWlsYWJsZSB3aGVuIG1ha2Vab2UoKSBpcyBjYWxsZWQsIGl0XG4gKiBtdXN0IGJlIHByb3ZpZGVkIGxhdGVyIHVzaW5nIHNldFZhdEFkbWluU2VydmljZSgpLlxuICogQHBhcmFtIHtTaHV0ZG93bldpdGhGYWlsdXJlfSBbb3B0aW9ucy5zaHV0ZG93blpvZVZhdF0gLSBhIGZ1bmN0aW9uIHRvXG4gKiBzaHV0ZG93biB0aGUgWm9lIFZhdC4gVGhpcyBmdW5jdGlvbiBuZWVkcyB0byB1c2UgdGhlIHZhdFBvd2Vyc1xuICogYXZhaWxhYmxlIHRvIGEgdmF0LlxuICogQHBhcmFtIHtGZWVJc3N1ZXJDb25maWd9IFtvcHRpb25zLmZlZUlzc3VlckNvbmZpZ11cbiAqIEBwYXJhbSB7WkNGU3BlY30gW29wdGlvbnMuemNmU3BlY10gLSBQb2ludGVyIHRvIHRoZSBjb250cmFjdCBmYWNldCBidW5kbGUuXG4gKi9cbmNvbnN0IG1ha2VEdXJhYmxlWm9lS2l0PSh7XG56b2VCYWdnYWdlLFxudmF0QWRtaW5TdmMsXG5zaHV0ZG93blpvZVZhdD0oKT0+eyB9LFxuZmVlSXNzdWVyQ29uZmlnPWRlZmF1bHRGZWVJc3N1ZXJDb25maWcsXG56Y2ZTcGVjPXtuYW1lOid6Y2YnfX0pPT5cbntcbi8qKiBAdHlwZSB7QnVuZGxlQ2FwfSAqL1xubGV0IHpjZkJ1bmRsZUNhcDtcblxuY29uc3Qgc2F2ZUJ1bmRsZUNhcD0oKT0+e1xuRS53aGVuKFxuUHJvbWlzZS5hbGwoW3ZhdEFkbWluU3ZjLGdldFpjZkJ1bmRsZUNhcCh6Y2ZTcGVjLHZhdEFkbWluU3ZjKV0pLFxuKFt2YXRBZG1pblNlcnZpY2UsYnVuZGxlQ2FwXSk9PntcbnpjZkJ1bmRsZUNhcD1idW5kbGVDYXA7XG5cbnpvZUJhZ2dhZ2UuaW5pdCgndmF0QWRtaW5TdmMnLHZhdEFkbWluU2VydmljZSk7XG56b2VCYWdnYWdlLmluaXQoJ3pjZkJ1bmRsZUNhcCcsemNmQnVuZGxlQ2FwKTtcbiB9KTtcblxuIH07XG5cbmNvbnN0IHNldFZhdEFkbWluU2VydmljZT1GYXIoJ3NldFZhdEFkbWluU2VydmljZScsKGxhdGVWYXRBZG1pblN2Yyk9PntcbnZhdEFkbWluU3ZjPWxhdGVWYXRBZG1pblN2YztcbnNhdmVCdW5kbGVDYXAoKTtcbiB9KTtcblxuaWYodmF0QWRtaW5TdmMpe1xuc2F2ZUJ1bmRsZUNhcCgpO1xuIH1lbHNlIGlmKHpvZUJhZ2dhZ2UuaGFzKCd6Y2ZCdW5kbGVDYXAnKSl7XG56Y2ZCdW5kbGVDYXA9em9lQmFnZ2FnZS5nZXQoJ3pjZkJ1bmRsZUNhcCcpO1xuLyogaW4gdGhpcyBjYXNlLCBpdCdsbCBiZSBrbm93biB0byBoYXZlIGJlZW4gcmVzb2x2ZWQsIGJ1dCB0aGF0J3MgZmluZSovXG52YXRBZG1pblN2Yz16b2VCYWdnYWdlLmdldCgndmF0QWRtaW5TdmMnKTtcbiB9XG5cbmNvbnN0IGZlZU1pbnRLaXQ9cHJlcGFyZUZlZU1pbnQoXG56b2VCYWdnYWdlLFxuZmVlSXNzdWVyQ29uZmlnLFxuc2h1dGRvd25ab2VWYXQpO1xuXG5cbi8qIGd1YXJhbnRlZSB0aGF0IHZhdEFkbWluU3ZjUCBoYXMgYmVlbiBkZWZpbmVkLiovXG5jb25zdCBnZXRBY3R1YWxWYXRBZG1pblN2Y1A9KCk9PntcbmlmKCF2YXRBZG1pblN2Yyl7XG50aHJvdyBGYWlsIGBjcmVhdGVaQ0ZWYXQgZGlkIG5vdCBnZXQgYnVuZGxlQ2FwYDtcbiB9XG5yZXR1cm4gdmF0QWRtaW5TdmM7XG4gfTtcblxuLyoqIEB0eXBlIHtHZXRCdW5kbGVDYXBGb3JJRH0gKi9cbmNvbnN0IGdldEJ1bmRsZUNhcEZvcklEPShidW5kbGVJRCk9PntcbnJldHVybiBFKGdldEFjdHVhbFZhdEFkbWluU3ZjUCgpKS53YWl0Rm9yQnVuZGxlQ2FwKGJ1bmRsZUlEKTtcbiB9O1xuXG5jb25zdCBnZXRCdW5kbGVDYXBCeUlkTm93PShpZCk9PntcbnJldHVybiBFKGdldEFjdHVhbFZhdEFkbWluU3ZjUCgpKS5nZXRCdW5kbGVDYXAoaWQpO1xuIH07XG5cbi8qIFRoaXMgbWV0aG9kIGNvbnRhaW5zIHRoZSBwb3dlciB0byBjcmVhdGUgYSBuZXcgWkNGIFZhdCwgYW5kIG11c3QqL1xuLyogYmUgY2xvc2VseSBoZWxkLiB2YXRBZG1pblN2YyBpcyBldmVuIG1vcmUgcG93ZXJmdWwgLSBhbnkgdmF0IGNhbiovXG4vKiBiZSBjcmVhdGVkLiBXZSBzZXZlcmVseSByZXN0cmljdCBhY2Nlc3MgdG8gdmF0QWRtaW5TdmMgZm9yIHRoaXMgcmVhc29uLiovXG5jb25zdCBjcmVhdGVaQ0ZWYXQ9KGNvbnRyYWN0QnVuZGxlQ2FwLGNvbnRyYWN0TGFiZWwpPT57XG56Y2ZCdW5kbGVDYXB8fEZhaWwgYGNyZWF0ZVpDRlZhdCBkaWQgbm90IGdldCBidW5kbGVDYXBgO1xuY29uc3QgbmFtZT1cbmNvbnRyYWN0TGFiZWwmJlxudHlwZW9mIGNvbnRyYWN0TGFiZWw9PT0nc3RyaW5nJyYmXG5jb250cmFjdExhYmVsLmxlbmd0aD4wP1xuIGB6Y2YtJHtjb250cmFjdExhYmVsfWA6XG4nemNmJztcblxucmV0dXJuIEUoZ2V0QWN0dWFsVmF0QWRtaW5TdmNQKCkpLmNyZWF0ZVZhdChcbnpjZkJ1bmRsZUNhcCxcbmhhcmRlbih7XG5uYW1lLFxudmF0UGFyYW1ldGVyczp7XG5jb250cmFjdEJ1bmRsZUNhcCxcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG56b2VTZXJ2aWNlLFxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbmludml0YXRpb25Jc3N1ZXI6aW52aXRhdGlvbklzc3VlckFjY2Vzcy5nZXRJbnZpdGF0aW9uSXNzdWVyKCl9fSkpO1xuXG5cblxuIH07XG5cbi8qIFRoZSBab2VTdG9yYWdlTWFuYWdlciBjb21wb3NlcyBhbmQgY29uc29saWRhdGVzIGNhcGFiaWxpdGllcyovXG4vKiBuZWVkZWQgYnkgWm9lIGFjY29yZGluZyB0byBQT0xBLiovXG5jb25zdHtcbnpvZVNlcnZpY2VEYXRhQWNjZXNzOmRhdGFBY2Nlc3MsXG5tYWtlT2ZmZXJBY2Nlc3MsXG5zdGFydEluc3RhbmNlQWNjZXNzLFxuaW52aXRhdGlvbklzc3VlckFjY2Vzc309XG5tYWtlWm9lU3RvcmFnZU1hbmFnZXIoXG5jcmVhdGVaQ0ZWYXQsXG5nZXRCdW5kbGVDYXBGb3JJRCxcbnNodXRkb3duWm9lVmF0LFxuZmVlTWludEtpdC5mZWVNaW50LFxuem9lQmFnZ2FnZSk7XG5cblxuLyogUGFzcyB0aGUgY2FwYWJpbGl0aWVzIG5lY2Vzc2FyeSB0byBjcmVhdGUgRSh6b2UpLnN0YXJ0SW5zdGFuY2UqL1xuY29uc3Qgc3RhcnRJbnN0YW5jZT1tYWtlU3RhcnRJbnN0YW5jZShcbnN0YXJ0SW5zdGFuY2VBY2Nlc3MsXG4oKT0+emNmQnVuZGxlQ2FwLFxuZ2V0QnVuZGxlQ2FwQnlJZE5vdyxcbnpvZUJhZ2dhZ2UpO1xuXG5cbi8qIFBhc3MgdGhlIGNhcGFiaWxpdGllcyBuZWNlc3NhcnkgdG8gY3JlYXRlIEUoem9lKS5vZmZlciovXG5jb25zdCBvZmZlcj1tYWtlT2ZmZXJNZXRob2QobWFrZU9mZmVyQWNjZXNzKTtcblxuLyogTWFrZSB0aGUgbWV0aG9kcyB0aGF0IGFsbG93IHVzZXJzIHRvIGVhc2lseSBhbmQgY3JlZGlibHkgZ2V0Ki9cbi8qIGluZm9ybWF0aW9uIGFib3V0IHRoZWlyIGludml0YXRpb25zLiovXG5cbmNvbnN0IGludml0YXRpb25Jc3N1ZXI9aW52aXRhdGlvbklzc3VlckFjY2Vzcy5nZXRJbnZpdGF0aW9uSXNzdWVyKCk7XG5jb25zdHtnZXRJbnN0YW5jZSxnZXRJbnN0YWxsYXRpb24sZ2V0SW52aXRhdGlvbkRldGFpbHN9PVxubWFrZUludml0YXRpb25RdWVyeUZucyhpbnZpdGF0aW9uSXNzdWVyKTtcblxuY29uc3QgZ2V0Q29uZmlndXJhdGlvbj0oKT0+e1xucmV0dXJuIGhhcmRlbih7XG5mZWVJc3N1ZXJDb25maWd9KTtcblxuIH07XG5cbmNvbnN0IFpvZUNvbmZpZ0k9TS5pbnRlcmZhY2UoJ1pvZUNvbmZpZ0ZhY2V0Jyx7XG51cGRhdGVaY2ZCdW5kbGVJZDpNLmNhbGwoTS5zdHJpbmcoKSkucmV0dXJucygpfSk7XG5cblxuY29uc3Qgem9lQ29uZmlnRmFjZXQ9cHJlcGFyZUV4byh6b2VCYWdnYWdlLCdab2VDb25maWdGYWNldCcsWm9lQ29uZmlnSSx7XG51cGRhdGVaY2ZCdW5kbGVJZChidW5kbGVJZCl7XG5FLndoZW4oXG5nZXRaY2ZCdW5kbGVDYXAoe2lkOmJ1bmRsZUlkfSx2YXRBZG1pblN2YyksXG4oYnVuZGxlQ2FwKT0+e1xuemNmQnVuZGxlQ2FwPWJ1bmRsZUNhcDtcbiB9LFxuKGUpPT57XG5jb25zb2xlLmVycm9yKCBgJ/CfmqggdW5hYmxlIHRvIHVwZGF0ZSBaQ0YgQnVuZGxlOiBgLGUpO1xudGhyb3cgZTtcbiB9KTtcblxuIH19KTtcblxuXG4vKiogQHR5cGUge1pvZVNlcnZpY2V9ICovXG5jb25zdCB6b2VTZXJ2aWNlPXByZXBhcmVFeG8oem9lQmFnZ2FnZSwnWm9lU2VydmljZScsWm9lU2VydmljZUkse1xuaW5zdGFsbChidW5kbGVJZCxidW5kbGVMYWJlbCl7XG5yZXR1cm4gZGF0YUFjY2Vzcy5pbnN0YWxsQnVuZGxlKGJ1bmRsZUlkLGJ1bmRsZUxhYmVsKTtcbiB9LFxuaW5zdGFsbEJ1bmRsZUlEKGJ1bmRsZUlkLGJ1bmRsZUxhYmVsKXtcbnJldHVybiBkYXRhQWNjZXNzLmluc3RhbGxCdW5kbGVJRChidW5kbGVJZCxidW5kbGVMYWJlbCk7XG4gfSxcbnN0YXJ0SW5zdGFuY2UsXG5vZmZlcixcblxuLyogVGhlIGZ1bmN0aW9ucyBiZWxvdyBhcmUgZ2V0dGVycyBvbmx5IGFuZCBoYXZlIG5vIGltcGFjdCBvbiovXG4vKiBzdGF0ZSB3aXRoaW4gWm9lKi9cbmdldE9mZmVyRmlsdGVyKGluc3RhbmNlKXtcbnJldHVybiBkYXRhQWNjZXNzLmdldE9mZmVyRmlsdGVyKGluc3RhbmNlKTtcbiB9LFxuICAgICAgYXN5bmMgZ2V0SW52aXRhdGlvbklzc3Vlcigpe1xucmV0dXJuIGRhdGFBY2Nlc3MuZ2V0SW52aXRhdGlvbklzc3VlcigpO1xuIH0sXG4gICAgICBhc3luYyBnZXRGZWVJc3N1ZXIoKXtcbnJldHVybiBmZWVNaW50S2l0LmZlZU1pbnQuZ2V0RmVlSXNzdWVyKCk7XG4gfSxcblxuZ2V0QnJhbmRzKGluc3RhbmNlKXtcbnJldHVybiBkYXRhQWNjZXNzLmdldEJyYW5kcyhpbnN0YW5jZSk7XG4gfSxcbmdldElzc3VlcnMoaW5zdGFuY2Upe1xucmV0dXJuIGRhdGFBY2Nlc3MuZ2V0SXNzdWVycyhpbnN0YW5jZSk7XG4gfSxcbmdldFB1YmxpY0ZhY2V0KGluc3RhbmNlKXtcbnJldHVybiBkYXRhQWNjZXNzLmdldFB1YmxpY0ZhY2V0KGluc3RhbmNlKTtcbiB9LFxuZ2V0VGVybXMoaW5zdGFuY2Upe1xucmV0dXJuIGRhdGFBY2Nlc3MuZ2V0VGVybXMoaW5zdGFuY2UpO1xuIH0sXG5nZXRJbnN0YWxsYXRpb25Gb3JJbnN0YW5jZShpbnN0YW5jZSl7XG5yZXR1cm4gZGF0YUFjY2Vzcy5nZXRJbnN0YWxsYXRpb24oaW5zdGFuY2UpO1xuIH0sXG5nZXRCdW5kbGVJREZyb21JbnN0YWxsYXRpb24oaW5zdGFsbGF0aW9uKXtcbnJldHVybiBkYXRhQWNjZXNzLmdldEJ1bmRsZUlERnJvbUluc3RhbGxhdGlvbihpbnN0YWxsYXRpb24pO1xuIH0sXG5nZXRJbnN0YWxsYXRpb24sXG5cbmdldEluc3RhbmNlKGludml0YXRpb24pe1xucmV0dXJuIGdldEluc3RhbmNlKGludml0YXRpb24pO1xuIH0sXG5nZXRDb25maWd1cmF0aW9uLFxuZ2V0SW52aXRhdGlvbkRldGFpbHMsXG5nZXRQcm9wb3NhbFNoYXBlRm9ySW52aXRhdGlvbihpbnZpdGF0aW9uKXtcbnJldHVybiBkYXRhQWNjZXNzLmdldFByb3Bvc2FsU2hhcGVGb3JJbnZpdGF0aW9uKGludml0YXRpb24pO1xuIH19KTtcblxuXG5yZXR1cm4gaGFyZGVuKHtcbnpvZVNlcnZpY2UsXG56b2VDb25maWdGYWNldCxcbi8qKiBAdHlwZSB7RmVlTWludEFjY2Vzc30gKi9cbi8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCovXG5mZWVNaW50QWNjZXNzOmZlZU1pbnRLaXQuZmVlTWludEFjY2VzcyxcbnNldFZhdEFkbWluU2VydmljZX0pO1xuXG4gfTtcblxuLyoqXG4gKiBAZGVwcmVjYXRlZFxuICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIFpvZS5cbiAqXG4gKiBUaGlzIHdpbGwgZmFpbCB1cGdyYWRlcyBhbmQgc2hvdWxkIG9ubHkgYmUgdXNlZCBpbiB0ZXN0cyB0aHJvdWdoIHRoZSBoZWxwZXJcbiAqIGBtYWtlWm9lS2l0Rm9yVGVzdGAuXG4gKlxuICogQHBhcmFtIHtQcm9taXNlPFZhdEFkbWluU3ZjPiB8IFZhdEFkbWluU3ZjfSBbdmF0QWRtaW5TdmNdIC0gVGhlIHZhdEFkbWluIFNlcnZpY2UsIHdoaWNoIGNhcnJpZXMgdGhlXG4gKiBwb3dlciB0byBjcmVhdGUgYSBuZXcgdmF0LiBJZiBpdCdzIG5vdCBhdmFpbGFibGUgd2hlbiBtYWtlWm9lKCkgaXMgY2FsbGVkLCBpdFxuICogbXVzdCBiZSBwcm92aWRlZCBsYXRlciB1c2luZyBzZXRWYXRBZG1pblNlcnZpY2UoKS5cbiAqIEBwYXJhbSB7U2h1dGRvd25XaXRoRmFpbHVyZX0gW3NodXRkb3duWm9lVmF0XSAtIGEgZnVuY3Rpb24gdG9cbiAqIHNodXRkb3duIHRoZSBab2UgVmF0LiBUaGlzIGZ1bmN0aW9uIG5lZWRzIHRvIHVzZSB0aGUgdmF0UG93ZXJzXG4gKiBhdmFpbGFibGUgdG8gYSB2YXQuXG4gKiBAcGFyYW0ge0ZlZUlzc3VlckNvbmZpZ30gW2ZlZUlzc3VlckNvbmZpZ11cbiAqIEBwYXJhbSB7WkNGU3BlY30gW3pjZlNwZWNdIC0gUG9pbnRlciB0byB0aGUgY29udHJhY3QgZmFjZXQgYnVuZGxlLlxuICovJGjigI1fb25jZS5tYWtlRHVyYWJsZVpvZUtpdChtYWtlRHVyYWJsZVpvZUtpdCk7XG5jb25zdCBtYWtlWm9lS2l0PSh2YXRBZG1pblN2YyxzaHV0ZG93blpvZVZhdCxmZWVJc3N1ZXJDb25maWcsemNmU3BlYyk9PlxubWFrZUR1cmFibGVab2VLaXQoe1xudmF0QWRtaW5TdmMsXG5zaHV0ZG93blpvZVZhdCxcbmZlZUlzc3VlckNvbmZpZyxcbnpjZlNwZWMsXG56b2VCYWdnYWdlOm1ha2VTY2FsYXJCaWdNYXBTdG9yZSgnZmFrZSB6b2UgYmFnZ2FnZScse2R1cmFibGU6dHJ1ZX0pfSk7JGjigI1fb25jZS5tYWtlWm9lS2l0KG1ha2Vab2VLaXQpO1xuXG5oYXJkZW4obWFrZVpvZUtpdCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUR1cmFibGVab2VLaXQiOlsibWFrZUR1cmFibGVab2VLaXQiXSwibWFrZVpvZUtpdCI6WyJtYWtlWm9lS2l0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAsmbhHaKgAA2ioAAC0AAABAYWdvcmljL3pvZS12MC4yNi4yL3NyYy96b2VTZXJ2aWNlL3pvZVNlYXQuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9ub3RpZmllciIsIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAYWdvcmljL3ZhdC1kYXRhIiwiQGVuZG8vbWFyc2hhbCIsIkBlbmRvL3Byb21pc2Uta2l0IiwiLi4vY29udHJhY3RGYWNldC9vZmZlclNhZmV0eS5qcyIsIi4uL3R5cGVzLmpzIiwiLi4vaW50ZXJuYWwtdHlwZXMuanMiLCIuLi90eXBlR3VhcmRzLmpzIl0sImV4cG9ydHMiOlsibWFrZVpvZVNlYXRBZG1pbkZhY3RvcnkiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgcHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0LFN1YnNjcmliZXJTaGFwZSxFLE0scHJlcGFyZUV4b0NsYXNzS2l0LGRlZXBseUZ1bGZpbGxlZCxtYWtlUHJvbWlzZUtpdCxzYXRpc2ZpZXNXYW50LEFtb3VudEtleXdvcmRSZWNvcmRTaGFwZSxLZXl3b3JkU2hhcGUsRXhpdE9iamVjdFNoYXBlLFBheW1lbnRQS2V5d29yZFJlY29yZFNoYXBlOyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvbm90aWZpZXJcIiwgW1tcInByZXBhcmVEdXJhYmxlUHVibGlzaEtpdFwiLCBbJGjigI1fYSA9PiAocHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0ID0gJGjigI1fYSldXSxbXCJTdWJzY3JpYmVyU2hhcGVcIiwgWyRo4oCNX2EgPT4gKFN1YnNjcmliZXJTaGFwZSA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvdmF0LWRhdGFcIiwgW1tcIk1cIiwgWyRo4oCNX2EgPT4gKE0gPSAkaOKAjV9hKV1dLFtcInByZXBhcmVFeG9DbGFzc0tpdFwiLCBbJGjigI1fYSA9PiAocHJlcGFyZUV4b0NsYXNzS2l0ID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcImRlZXBseUZ1bGZpbGxlZFwiLCBbJGjigI1fYSA9PiAoZGVlcGx5RnVsZmlsbGVkID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJtYWtlUHJvbWlzZUtpdFwiLCBbJGjigI1fYSA9PiAobWFrZVByb21pc2VLaXQgPSAkaOKAjV9hKV1dXV0sW1wiLi4vY29udHJhY3RGYWNldC9vZmZlclNhZmV0eS5qc1wiLCBbW1wic2F0aXNmaWVzV2FudFwiLCBbJGjigI1fYSA9PiAoc2F0aXNmaWVzV2FudCA9ICRo4oCNX2EpXV1dXSxbXCIuLi90eXBlcy5qc1wiLCBbXV0sW1wiLi4vaW50ZXJuYWwtdHlwZXMuanNcIiwgW11dLFtcIi4uL3R5cGVHdWFyZHMuanNcIiwgW1tcIkFtb3VudEtleXdvcmRSZWNvcmRTaGFwZVwiLCBbJGjigI1fYSA9PiAoQW1vdW50S2V5d29yZFJlY29yZFNoYXBlID0gJGjigI1fYSldXSxbXCJLZXl3b3JkU2hhcGVcIiwgWyRo4oCNX2EgPT4gKEtleXdvcmRTaGFwZSA9ICRo4oCNX2EpXV0sW1wiRXhpdE9iamVjdFNoYXBlXCIsIFskaOKAjV9hID0+IChFeGl0T2JqZWN0U2hhcGUgPSAkaOKAjV9hKV1dLFtcIlBheW1lbnRQS2V5d29yZFJlY29yZFNoYXBlXCIsIFskaOKAjV9hID0+IChQYXltZW50UEtleXdvcmRSZWNvcmRTaGFwZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdHtGYWlsfT1hc3NlcnQ7XG5cbmNvbnN0IFpvZVNlYXRJS2l0PWhhcmRlbih7XG56b2VTZWF0QWRtaW46TS5pbnRlcmZhY2UoJ1pvZVNlYXRBZG1pbicse1xucmVwbGFjZUFsbG9jYXRpb246TS5jYWxsKEFtb3VudEtleXdvcmRSZWNvcmRTaGFwZSkucmV0dXJucygpLFxuZXhpdDpNLmNhbGwoTS5hbnkoKSkucmV0dXJucygpLFxuZmFpbDpNLmNhbGwoTS5hbnkoKSkucmV0dXJucygpLFxucmVzb2x2ZUV4aXRBbmRSZXN1bHQ6TS5jYWxsKHtcbm9mZmVyUmVzdWx0UHJvbWlzZTpNLnByb21pc2UoKSxcbmV4aXRPYmo6RXhpdE9iamVjdFNoYXBlfSkuXG5yZXR1cm5zKCksXG5nZXRFeGl0U3Vic2NyaWJlcjpNLmNhbGwoKS5yZXR1cm5zKFN1YnNjcmliZXJTaGFwZSksXG4vKiBUaGUgcmV0dXJuIHByb21pc2UgaXMgZW1wdHksIGJ1dCBkb0V4aXQgcmVsaWVzIG9uIHNldHRsZW1lbnQgYXMgYSBzaWduYWwqL1xuLyogdGhhdCB0aGUgcGF5b3V0cyBoYXZlIHNldHRsZWQuIFRoZSBleGl0IHB1Ymxpc2hlciBpcyBub3RpZmllZCBhZnRlciB0aGF0LiovXG5maW5hbFBheW91dHM6TS5jYWxsKE0uZXJlZihQYXltZW50UEtleXdvcmRSZWNvcmRTaGFwZSkpLnJldHVybnMoXG5NLnByb21pc2UoKSl9KSxcblxuXG51c2VyU2VhdDpNLmludGVyZmFjZSgnVXNlclNlYXQnLHtcbmdldFByb3Bvc2FsOk0uY2FsbCgpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuZ2V0UGF5b3V0czpNLmNhbGwoKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbmdldFBheW91dDpNLmNhbGwoS2V5d29yZFNoYXBlKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbmdldE9mZmVyUmVzdWx0Ok0uY2FsbCgpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuaGFzRXhpdGVkOk0uY2FsbCgpLnJldHVybnMoTS5wcm9taXNlKCkpLFxudHJ5RXhpdDpNLmNhbGwoKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbm51bVdhbnRzU2F0aXNmaWVkOk0uY2FsbCgpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuZ2V0RmluYWxBbGxvY2F0aW9uOk0uY2FsbCgpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuZ2V0RXhpdFN1YnNjcmliZXI6TS5jYWxsKCkucmV0dXJucyhNLmFueSgpKX0pfSk7XG5cblxuXG5jb25zdCBhc3NlcnRIYXNOb3RFeGl0ZWQ9KGMsbXNnKT0+e1xuIWMuc3RhdGUuaW5zdGFuY2VBZG1pbkhlbHBlci5oYXNFeGl0ZWQoYy5mYWNldHMuem9lU2VhdEFkbWluKXx8XG5hc3NlcnQoIWMuc3RhdGUuaW5zdGFuY2VBZG1pbkhlbHBlci5oYXNFeGl0ZWQoYy5mYWNldHMuem9lU2VhdEFkbWluKSxtc2cpO1xuIH07XG5cbi8qKlxuICogbWFrZVpvZVNlYXRBZG1pbkZhY3RvcnkgcmV0dXJucyBhIG1ha2VyIGZvciBhbiBvYmplY3QgdGhhdCBtYW5hZ2VzIHRoZSBzdGF0ZVxuICogb2YgYSBzZWF0IHBhcnRpY2lwYXRpbmcgaW4gYSBab2UgY29udHJhY3QgYW5kIHJldHVybiBpdHMgdHdvIGZhY2V0cy5cbiAqXG4gKiBUaGUgVXNlclNlYXQgaXMgc3VpdGFibGUgdG8gYmUgaGFuZGVkIHRvIGFuIGFnZW50IG91dHNpZGUgem9lIGFuZCB0aGVcbiAqIGNvbnRyYWN0IGFuZCBhbGxvd3MgdGhlbSB0byBxdWVyeSBvciBtb25pdG9yIHRoZSBjdXJyZW50IHN0YXRlLCBhY2Nlc3MgdGhlXG4gKiBwYXlvdXRzIGFuZCByZXN1bHQsIGFuZCBjYWxsIGV4aXQoKSBpZiB0aGF0J3MgYWxsb3dlZCBmb3IgdGhpcyBzZWF0LlxuICpcbiAqIFRoZSB6b2VTZWF0QWRtaW4gaXMgcGFzc2VkIGJ5IFpvZSB0byB0aGUgQ29udHJhY3RGYWNldCAoemNmKSwgdG8gYWxsb3cgemNmIHRvXG4gKiBxdWVyeSBvciB1cGRhdGUgdGhlIGFsbG9jYXRpb24gb3IgZXhpdCB0aGUgc2VhdCBjbGVhbmx5LlxuICpcbiAqIEBwYXJhbSB7WGltcG9ydCgnQGFnb3JpYy92YXQtZGF0YScpLkJhZ2dhZ2V9IGJhZ2dhZ2VcbiAqL1xuY29uc3QgICAgICAgIG1ha2Vab2VTZWF0QWRtaW5GYWN0b3J5PShiYWdnYWdlKT0+e1xuY29uc3QgbWFrZUR1cmFibGVQdWJsaXNoS2l0PXByZXBhcmVEdXJhYmxlUHVibGlzaEtpdChcbmJhZ2dhZ2UsXG4nem9lIFNlYXQgcHVibGlzaGVyJyk7XG5cblxuY29uc3QgZG9FeGl0PShcbnpvZVNlYXRBZG1pbixcbmN1cnJlbnRBbGxvY2F0aW9uLFxud2l0aGRyYXdGYWNldCxcbmluc3RhbmNlQWRtaW5IZWxwZXIpPT5cbntcbi8qKiBAdHlwZSB7UGF5bWVudFBLZXl3b3JkUmVjb3JkfSAqL1xuY29uc3QgcGF5b3V0cz13aXRoZHJhd0ZhY2V0LndpdGhkcmF3UGF5bWVudHMoY3VycmVudEFsbG9jYXRpb24pO1xucmV0dXJuIEUud2hlbihcbnpvZVNlYXRBZG1pbi5maW5hbFBheW91dHMocGF5b3V0cyksXG4oKT0+aW5zdGFuY2VBZG1pbkhlbHBlci5leGl0Wm9lU2VhdEFkbWluKHpvZVNlYXRBZG1pbiksXG4oKT0+aW5zdGFuY2VBZG1pbkhlbHBlci5leGl0Wm9lU2VhdEFkbWluKHpvZVNlYXRBZG1pbikpO1xuXG4gfTtcblxuLyogVGhlcmUgaXMgYSByYWNlIGJldHdlZW4gcmVzb2x2ZUV4aXRBbmRSZXN1bHQoKSBhbmQgZ2V0T2ZmZXJSZXN1bHQoKSB0aGF0Ki9cbi8qIGNhbiBiZSBsaW1pdGVkIHRvIHdoZW4gdGhlIGFkbWluRmFjdG9yeSBpcyBwYWdlZCBpbi4gSWYgc3RhdGUub2ZmZXJSZXN1bHQqL1xuLyogaXMgZGVmaW5lZCwgZ2V0T2ZmZXJSZXN1bHQgd2lsbCByZXR1cm4gaXQuIElmIGl0J3Mgbm90IGRlZmluZWQgd2hlbiovXG4vKiBnZXRPZmZlclJlc3VsdCBpcyBjYWxsZWQsIGNyZWF0ZSBhIHByb21pc2VLaXQsIHJldHVybiB0aGUgcHJvbWlzZSBhbmQgc3RvcmUqL1xuLyogdGhlIGtpdCBoZXJlLiBXaGVuIHJlc29sdmVFeGl0QW5kUmVzdWx0KCkgaXMgY2FsbGVkLCBpdCBzYXZlcyovXG4vKiBzdGF0ZS5vZmZlclJlc3VsdCBhbmQgcmVzb2x2ZXMgdGhlIHByb21pc2UgaWYgaXQgZXhpc3RzLCB0aGVuIHJlbW92ZXMgdGhlKi9cbi8qIHRhYmxlIGVudHJ5LiovXG4vKipcbiAqIEB0eXBlZGVmIHtXZWFrTWFwPFpDRlNlYXQsIHVua25vd24+fVxuICovXG5jb25zdCBlcGhlbWVyYWxPZmZlclJlc3VsdFN0b3JlPW5ldyBXZWFrTWFwKCk7XG5cbnJldHVybiBwcmVwYXJlRXhvQ2xhc3NLaXQoXG5iYWdnYWdlLFxuJ1pvZVNlYXRLaXQnLFxuWm9lU2VhdElLaXQsXG4vKipcbiAqXG4gKiBAcGFyYW0ge0FsbG9jYXRpb259IGluaXRpYWxBbGxvY2F0aW9uXG4gKiBAcGFyYW0ge1Byb3Bvc2FsUmVjb3JkfSBwcm9wb3NhbFxuICogQHBhcmFtIHtJbnN0YW5jZUFkbWluSGVscGVyfSBpbnN0YW5jZUFkbWluSGVscGVyXG4gKiBAcGFyYW0ge1dpdGhkcmF3RmFjZXR9IHdpdGhkcmF3RmFjZXRcbiAqIEBwYXJhbSB7RVJlZjxFeGl0T2JqPn0gW2V4aXRPYmpdXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvZmZlclJlc3VsdElzVW5kZWZpbmVkXVxuICovXG4oXG5pbml0aWFsQWxsb2NhdGlvbixcbnByb3Bvc2FsLFxuaW5zdGFuY2VBZG1pbkhlbHBlcixcbndpdGhkcmF3RmFjZXQsXG5leGl0T2JqPXVuZGVmaW5lZCxcbi8qIGVtcHR5U2VhdEtpdHMgc3RhcnQgd2l0aCBvZmZlclJlc3VsdCB2YWxpZGx5IHVuZGVmaW5lZDsgb3RoZXJzIGNhbiBzZXQqL1xuLyogaXQgdG8gYW55dGhpbmcgKGluY2x1ZGluZyB1bmRlZmluZWQpIGluIHJlc29sdmVFeGl0QW5kUmVzdWx0KCkqL1xub2ZmZXJSZXN1bHRJc1VuZGVmaW5lZD1mYWxzZSk9Plxue1xuY29uc3R7cHVibGlzaGVyLHN1YnNjcmliZXJ9PW1ha2VEdXJhYmxlUHVibGlzaEtpdCgpO1xucmV0dXJue1xuY3VycmVudEFsbG9jYXRpb246aW5pdGlhbEFsbG9jYXRpb24sXG5wcm9wb3NhbCxcbmV4aXRPYmosXG5vZmZlclJlc3VsdDp1bmRlZmluZWQsXG5vZmZlclJlc3VsdFN0b3JlZDpvZmZlclJlc3VsdElzVW5kZWZpbmVkLFxuaW5zdGFuY2VBZG1pbkhlbHBlcixcbndpdGhkcmF3RmFjZXQsXG5wdWJsaXNoZXIsXG5zdWJzY3JpYmVyLFxucGF5b3V0czpoYXJkZW4oe30pLFxuZXhpdGluZzpmYWxzZX07XG5cbiB9LFxue1xuem9lU2VhdEFkbWluOntcbnJlcGxhY2VBbGxvY2F0aW9uKHJlcGxhY2VtZW50QWxsb2NhdGlvbil7XG5jb25zdHtzdGF0ZX09dGhpcztcbmFzc2VydEhhc05vdEV4aXRlZChcbnRoaXMsXG4nQ2Fubm90IHJlcGxhY2UgYWxsb2NhdGlvbi4gU2VhdCBoYXMgYWxyZWFkeSBleGl0ZWQnKTtcblxuaGFyZGVuKHJlcGxhY2VtZW50QWxsb2NhdGlvbik7XG4vKiBNZXJnaW5nIGhhcHBlbnMgaW4gWkNGLCBzbyByZXBsYWNlbWVudEFsbG9jYXRpb24gY2FuKi9cbi8qIHJlcGxhY2UgdGhlIG9sZCBhbGxvY2F0aW9uIGVudGlyZWx5LiovXG5cbnN0YXRlLmN1cnJlbnRBbGxvY2F0aW9uPXJlcGxhY2VtZW50QWxsb2NhdGlvbjtcbiB9LFxuZXhpdChjb21wbGV0aW9uKXtcbmNvbnN0e3N0YXRlLGZhY2V0c309dGhpcztcbi8qIFNpbmNlIHRoaXMgbWV0aG9kIGRvZXNuJ3Qgd2FpdCwgd2UgY291bGQgcmUtZW50ZXIgdmlhIGV4aXRBbGxTZWF0cy4qL1xuLyogSWYgdGhhdCBoYXBwZW5zLCB3ZSBzaG91bGRuJ3QgcmUtZG8gYW55IG9mIHRoZSB3b3JrLiovXG5pZihzdGF0ZS5leGl0aW5nKXtcbnJldHVybjtcbiB9XG5hc3NlcnRIYXNOb3RFeGl0ZWQodGhpcywnQ2Fubm90IGV4aXQgc2VhdC4gU2VhdCBoYXMgYWxyZWFkeSBleGl0ZWQnKTtcblxuc3RhdGUuZXhpdGluZz10cnVlO1xuRS53aGVuKFxuZG9FeGl0KFxuZmFjZXRzLnpvZVNlYXRBZG1pbixcbnN0YXRlLmN1cnJlbnRBbGxvY2F0aW9uLFxuc3RhdGUud2l0aGRyYXdGYWNldCxcbnN0YXRlLmluc3RhbmNlQWRtaW5IZWxwZXIpLFxuXG4oKT0+c3RhdGUucHVibGlzaGVyLmZpbmlzaChjb21wbGV0aW9uKSk7XG5cbiB9LFxuZmFpbChyZWFzb24pe1xuY29uc3R7c3RhdGUsZmFjZXRzfT10aGlzO1xuLyogU2luY2UgdGhpcyBtZXRob2QgZG9lc24ndCB3YWl0LCB3ZSBjb3VsZCByZS1lbnRlciB2aWEgZmFpbEFsbFNlYXRzLiovXG4vKiBJZiB0aGF0IGhhcHBlbnMsIHdlIHNob3VsZG4ndCByZS1kbyBhbnkgb2YgdGhlIHdvcmsuKi9cbmlmKHN0YXRlLmV4aXRpbmcpe1xucmV0dXJuO1xuIH1cblxuYXNzZXJ0SGFzTm90RXhpdGVkKHRoaXMsJ0Nhbm5vdCBmYWlsIHNlYXQuIFNlYXQgaGFzIGFscmVhZHkgZXhpdGVkJyk7XG5cbnN0YXRlLmV4aXRpbmc9dHJ1ZTtcbkUud2hlbihcbmRvRXhpdChcbmZhY2V0cy56b2VTZWF0QWRtaW4sXG5zdGF0ZS5jdXJyZW50QWxsb2NhdGlvbixcbnN0YXRlLndpdGhkcmF3RmFjZXQsXG5zdGF0ZS5pbnN0YW5jZUFkbWluSGVscGVyKSxcblxuKCk9PnN0YXRlLnB1Ymxpc2hlci5mYWlsKHJlYXNvbiksXG4oKT0+c3RhdGUucHVibGlzaGVyLmZhaWwocmVhc29uKSk7XG5cbiB9LFxuLyogY2FsbGVkIG9ubHkgZm9yIHNlYXRzIHJlc3VsdGluZyBmcm9tIG9mZmVycy4qL1xuLyoqIEBwYXJhbSB7SGFuZGxlT2ZmZXJSZXN1bHR9IHJlc3VsdCAqL1xucmVzb2x2ZUV4aXRBbmRSZXN1bHQoe29mZmVyUmVzdWx0UHJvbWlzZSxleGl0T2JqfSl7XG5jb25zdHtzdGF0ZSxmYWNldHN9PXRoaXM7XG5cbiFzdGF0ZS5vZmZlclJlc3VsdFN0b3JlZHx8XG5GYWlsIGBvZmZlclJlc3VsdFN0b3JlZCBiZWZvcmUgb2ZmZXJSZXN1bHRQcm9taXNlYDtcblxuaWYoIWVwaGVtZXJhbE9mZmVyUmVzdWx0U3RvcmUuaGFzKGZhY2V0cy51c2VyU2VhdCkpe1xuLyogdGhpcyB3YXMgY2FsbGVkIGJlZm9yZSBnZXRPZmZlclJlc3VsdCovXG5jb25zdCBraXQ9bWFrZVByb21pc2VLaXQoKTtcbmtpdC5yZXNvbHZlKG9mZmVyUmVzdWx0UHJvbWlzZSk7XG5lcGhlbWVyYWxPZmZlclJlc3VsdFN0b3JlLnNldChmYWNldHMudXNlclNlYXQsa2l0KTtcbiB9XG5cbmNvbnN0IHBLaXQ9ZXBoZW1lcmFsT2ZmZXJSZXN1bHRTdG9yZS5nZXQoZmFjZXRzLnVzZXJTZWF0KTtcbkUud2hlbihcbm9mZmVyUmVzdWx0UHJvbWlzZSxcbihvZmZlclJlc3VsdCk9Pntcbi8qIFJlc29sdmUgdGhlIGVwaGVtZXJhbCBwcm9taXNlIGZvciBvZmZlclJlc3VsdCovXG5wS2l0LnJlc29sdmUob2ZmZXJSZXN1bHQpO1xuLyogTm93IHdlIHdhbnQgdG8gc3RvcmUgdGhlIG9mZmVyUmVzdWx0IGluIGBzdGF0ZWAgdG8gZ2V0IGl0IG9mZiB0aGUgaGVhcCwqL1xuLyogYnV0IHdlIG5lZWQgdG8gaGFuZGxlIHRocmVlIGNhc2VzOiovXG4vKiAxLiBhbHJlYWR5IGR1cmFibGUuIChUaGlzIGluY2x1ZGVzIGJlaW5nIGEgcmVtb3RlIHByZXNlbmNlLikqL1xuLyogMi4gaGFzIHByb21pc2VzIGZvciBkdXJhYmxlIG9iamVjdHMuKi9cbi8qIDMuIG5vdCBkdXJhYmxlIGV2ZW4gYWZ0ZXIgcmVzb2x2aW5nIHByb21pc2VzLiovXG4vKiBGb3IgIzEgd2UgY2FuIGFzc2lnbiBkaXJlY3RseSwgYnV0IHdlIGRlZXBseSBhd2FpdCB0byBhbHNvIGhhbmRsZSAjMi4qL1xudm9pZCBFLndoZW4oXG5kZWVwbHlGdWxmaWxsZWQob2ZmZXJSZXN1bHQpLFxuKGZ1bGZpbGxlZE9mZmVyUmVzdWx0KT0+e1xudHJ5e1xuLyogSW4gY2FzZXMgMS0yIHRoaXMgYXNzaWdubWVudCB3aWxsIHN1Y2NlZWQuKi9cbnN0YXRlLm9mZmVyUmVzdWx0PWZ1bGZpbGxlZE9mZmVyUmVzdWx0O1xuLyogSWYgaXQgZG9lc24ndCwgdGhlbiB0aGVzZSBsaW5lcyB3b24ndCBiZSByZWFjaGVkIHNvIHRoZSovXG4vKiBmbGFnIHdpbGwgc3RheSBmYWxzZSBhbmQgdGhlIHByb21pc2Ugd2lsbCBzdGF5IGluIHRoZSBoZWFwKi9cbnN0YXRlLm9mZmVyUmVzdWx0U3RvcmVkPXRydWU7XG5lcGhlbWVyYWxPZmZlclJlc3VsdFN0b3JlLmRlbGV0ZShmYWNldHMudXNlclNlYXQpO1xuIH1jYXRjaChlcnIpe1xuY29uc29sZS53YXJuKFxuIGBub24tZHVyYWJsZSBvZmZlciByZXN1bHQgd2lsbCBiZSBsb3N0IHVwb24gem9lIHZhdCB0ZXJtaW5hdGlvbjogJHtvZmZlclJlc3VsdH1gKTtcblxuIH1cbiB9XG4vKiBubyByZWplY3Rpb24gaGFuZGxlciBiZWNhdXNlIGFuIG9mZmVyIHJlc3VsdCBjb250YWluaW5nIHByb21pc2VzIHRoYXQgcmVqZWN0Ki9cbi8qIGlzIHdpdGhpbiBzcGVjKi8pO1xuXG4gfSxcbihlKT0+e1xucEtpdC5yZWplY3QoZSk7XG4vKiBOQjogbGVhdmUgdGhlIHJlamVjdGVkIHByb21pc2UgaW4gdGhlIGVwaGVtZXJhbE9mZmVyUmVzdWx0U3RvcmUqL1xuLyogYmVjYXVzZSBpdCBjYW4ndCBnbyBpbiBkdXJhYmxlIHN0YXRlKi9cbiB9KTtcblxuXG5zdGF0ZS5leGl0T2JqPWV4aXRPYmo7XG4gfSxcbmdldEV4aXRTdWJzY3JpYmVyKCl7XG5jb25zdHtzdGF0ZX09dGhpcztcbnJldHVybiBzdGF0ZS5zdWJzY3JpYmVyO1xuIH0sXG4gICAgICBhc3luYyBmaW5hbFBheW91dHMocGF5bWVudHMpe1xuY29uc3R7c3RhdGV9PXRoaXM7XG5cbmNvbnN0IHNldHRsZWRQYXlvdXRzPWF3YWl0IGRlZXBseUZ1bGZpbGxlZChwYXltZW50cyk7XG5zdGF0ZS5wYXlvdXRzPXNldHRsZWRQYXlvdXRzO1xuIH19LFxuXG51c2VyU2VhdDp7XG4gICAgICBhc3luYyBnZXRQcm9wb3NhbCgpe1xuY29uc3R7c3RhdGV9PXRoaXM7XG5yZXR1cm4gc3RhdGUucHJvcG9zYWw7XG4gfSxcbiAgICAgIGFzeW5jIGdldFBheW91dHMoKXtcbmNvbnN0e3N0YXRlfT10aGlzO1xuXG5yZXR1cm4gRS53aGVuKFxuc3RhdGUuc3Vic2NyaWJlci5zdWJzY3JpYmVBZnRlcigpLFxuKCk9PnN0YXRlLnBheW91dHMsXG4oKT0+c3RhdGUucGF5b3V0cyk7XG5cbiB9LFxuICAgICAgYXN5bmMgZ2V0UGF5b3V0KGtleXdvcmQpe1xuY29uc3R7c3RhdGV9PXRoaXM7XG5cbi8qIHN1YnNjcmliZXIuc3Vic2NyaWJlQWZ0ZXIoKSBvbmx5IHRyaWdnZXJzIGFmdGVyIHB1Ymxpc2hlci5maW5pc2goKSovXG4vKiBpbiBleGl0KCkgb3IgcHVibGlzaGVyLmZhaWwoKSBpbiBmYWlsKCkuIEJvdGggb2YgdGhvc2Ugd2FpdCBmb3IqL1xuLyogZG9FeGl0KCksIHdoaWNoIGVuc3VyZXMgdGhhdCBmaW5hbFBheW91dHMoKSBoYXMgc2V0IHN0YXRlLnBheW91dHMuKi9cbnJldHVybiBFLndoZW4oXG5zdGF0ZS5zdWJzY3JpYmVyLnN1YnNjcmliZUFmdGVyKCksXG4oKT0+c3RhdGUucGF5b3V0c1trZXl3b3JkXSxcbigpPT5zdGF0ZS5wYXlvdXRzW2tleXdvcmRdKTtcblxuIH0sXG5cbiAgICAgIGFzeW5jIGdldE9mZmVyUmVzdWx0KCl7XG5jb25zdHtzdGF0ZSxmYWNldHN9PXRoaXM7XG5cbmlmKHN0YXRlLm9mZmVyUmVzdWx0U3RvcmVkKXtcbnJldHVybiBzdGF0ZS5vZmZlclJlc3VsdDtcbiB9XG5cbmlmKGVwaGVtZXJhbE9mZmVyUmVzdWx0U3RvcmUuaGFzKGZhY2V0cy51c2VyU2VhdCkpe1xucmV0dXJuIGVwaGVtZXJhbE9mZmVyUmVzdWx0U3RvcmUuZ2V0KGZhY2V0cy51c2VyU2VhdCkucHJvbWlzZTtcbiB9XG5cbmNvbnN0IGtpdD1tYWtlUHJvbWlzZUtpdCgpO1xuZXBoZW1lcmFsT2ZmZXJSZXN1bHRTdG9yZS5zZXQoZmFjZXRzLnVzZXJTZWF0LGtpdCk7XG5yZXR1cm4ga2l0LnByb21pc2U7XG4gfSxcbiAgICAgIGFzeW5jIGhhc0V4aXRlZCgpe1xuY29uc3R7c3RhdGUsZmFjZXRzfT10aGlzO1xuXG5yZXR1cm4oXG5zdGF0ZS5leGl0aW5nfHxcbnN0YXRlLmluc3RhbmNlQWRtaW5IZWxwZXIuaGFzRXhpdGVkKGZhY2V0cy56b2VTZWF0QWRtaW4pKTtcblxuIH0sXG4gICAgICBhc3luYyB0cnlFeGl0KCl7XG5jb25zdHtzdGF0ZX09dGhpcztcbmlmKCFzdGF0ZS5leGl0T2JqKVxudGhyb3cgRmFpbCBgZXhpdE9iaiBtdXN0IGJlIGluaXRpYWxpemVkIGJlZm9yZSB1c2VgO1xuYXNzZXJ0SGFzTm90RXhpdGVkKHRoaXMsJ0Nhbm5vdCBleGl0OyBzZWF0IGhhcyBhbHJlYWR5IGV4aXRlZCcpO1xuXG5yZXR1cm4gRShzdGF0ZS5leGl0T2JqKS5leGl0KCk7XG4gfSxcbiAgICAgIGFzeW5jIG51bVdhbnRzU2F0aXNmaWVkKCl7XG5jb25zdHtzdGF0ZX09dGhpcztcbnJldHVybiBFLndoZW4oXG5zdGF0ZS5zdWJzY3JpYmVyLnN1YnNjcmliZUFmdGVyKCksXG4oKT0+c2F0aXNmaWVzV2FudChzdGF0ZS5wcm9wb3NhbCxzdGF0ZS5jdXJyZW50QWxsb2NhdGlvbiksXG4oKT0+c2F0aXNmaWVzV2FudChzdGF0ZS5wcm9wb3NhbCxzdGF0ZS5jdXJyZW50QWxsb2NhdGlvbikpO1xuXG4gfSxcbmdldEV4aXRTdWJzY3JpYmVyKCl7XG5jb25zdHtzdGF0ZX09dGhpcztcbnJldHVybiBzdGF0ZS5zdWJzY3JpYmVyO1xuIH0sXG5nZXRGaW5hbEFsbG9jYXRpb24oKXtcbmNvbnN0e3N0YXRlfT10aGlzO1xucmV0dXJuIEUud2hlbihcbnN0YXRlLnN1YnNjcmliZXIuc3Vic2NyaWJlQWZ0ZXIoKSxcbigpPT5zdGF0ZS5jdXJyZW50QWxsb2NhdGlvbixcbigpPT5zdGF0ZS5jdXJyZW50QWxsb2NhdGlvbik7XG5cbiB9fX0pO1xuXG5cblxuIH07JGjigI1fb25jZS5tYWtlWm9lU2VhdEFkbWluRmFjdG9yeShtYWtlWm9lU2VhdEFkbWluRmFjdG9yeSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVpvZVNlYXRBZG1pbkZhY3RvcnkiOlsibWFrZVpvZVNlYXRBZG1pbkZhY3RvcnkiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAHbLPLQA6AAAAOgAANwAAAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL3pvZVNlcnZpY2Uvem9lU3RvcmFnZU1hbmFnZXIuanN7ImltcG9ydHMiOlsiQGVuZG8vZmFyIiwiQGFnb3JpYy9lcnRwIiwiQGFnb3JpYy92YXQtZGF0YSIsIi4uL2lzc3VlclN0b3JhZ2UuanMiLCIuLi9pbnN0YW5jZVJlY29yZFN0b3JhZ2UuanMiLCIuLi9pc3N1ZXJSZWNvcmQuanMiLCIuL2VzY3Jvd1N0b3JhZ2UuanMiLCIuL21ha2VJbnZpdGF0aW9uLmpzIiwiLi9pbnN0YW5jZUFkbWluU3RvcmFnZS5qcyIsIi4vaW5zdGFsbGF0aW9uU3RvcmFnZS5qcyIsIi4vaW50ZXJuYWwtdHlwZXMuanMiLCIuLi90eXBlR3VhcmRzLmpzIl0sImV4cG9ydHMiOlsibWFrZVpvZVN0b3JhZ2VNYW5hZ2VyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEUsQXNzZXRLaW5kLG1ha2VEdXJhYmxlSXNzdWVyS2l0LEFtb3VudE1hdGgsdXBncmFkZUlzc3VlcktpdCxtYWtlU2NhbGFyQmlnTWFwU3RvcmUscHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUscHJlcGFyZUV4b0NsYXNzS2l0LHByZXBhcmVFeG9DbGFzcyxwcm92aWRlRHVyYWJsZVNldFN0b3JlLHByb3ZpZGVJc3N1ZXJTdG9yYWdlLG1ha2VJbnN0YW5jZVJlY29yZFN0b3JhZ2UsbWFrZUlzc3VlclJlY29yZCxwcm92aWRlRXNjcm93U3RvcmFnZSxwcmVwYXJlSW52aXRhdGlvbktpdCxtYWtlSW5zdGFuY2VBZG1pblN0b3JhZ2UsbWFrZUluc3RhbGxhdGlvblN0b3JhZ2UsSW5zdGFuY2VTdG9yYWdlTWFuYWdlcklLaXQsWm9lTWludEksWm9lU3RvcmFnZU1hbmFnZXJJS2l0OyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2ZhclwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL2VydHBcIiwgW1tcIkFzc2V0S2luZFwiLCBbJGjigI1fYSA9PiAoQXNzZXRLaW5kID0gJGjigI1fYSldXSxbXCJtYWtlRHVyYWJsZUlzc3VlcktpdFwiLCBbJGjigI1fYSA9PiAobWFrZUR1cmFibGVJc3N1ZXJLaXQgPSAkaOKAjV9hKV1dLFtcIkFtb3VudE1hdGhcIiwgWyRo4oCNX2EgPT4gKEFtb3VudE1hdGggPSAkaOKAjV9hKV1dLFtcInVwZ3JhZGVJc3N1ZXJLaXRcIiwgWyRo4oCNX2EgPT4gKHVwZ3JhZGVJc3N1ZXJLaXQgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy92YXQtZGF0YVwiLCBbW1wibWFrZVNjYWxhckJpZ01hcFN0b3JlXCIsIFskaOKAjV9hID0+IChtYWtlU2NhbGFyQmlnTWFwU3RvcmUgPSAkaOKAjV9hKV1dLFtcInByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlXCIsIFskaOKAjV9hID0+IChwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSA9ICRo4oCNX2EpXV0sW1wicHJlcGFyZUV4b0NsYXNzS2l0XCIsIFskaOKAjV9hID0+IChwcmVwYXJlRXhvQ2xhc3NLaXQgPSAkaOKAjV9hKV1dLFtcInByZXBhcmVFeG9DbGFzc1wiLCBbJGjigI1fYSA9PiAocHJlcGFyZUV4b0NsYXNzID0gJGjigI1fYSldXSxbXCJwcm92aWRlRHVyYWJsZVNldFN0b3JlXCIsIFskaOKAjV9hID0+IChwcm92aWRlRHVyYWJsZVNldFN0b3JlID0gJGjigI1fYSldXV1dLFtcIi4uL2lzc3VlclN0b3JhZ2UuanNcIiwgW1tcInByb3ZpZGVJc3N1ZXJTdG9yYWdlXCIsIFskaOKAjV9hID0+IChwcm92aWRlSXNzdWVyU3RvcmFnZSA9ICRo4oCNX2EpXV1dXSxbXCIuLi9pbnN0YW5jZVJlY29yZFN0b3JhZ2UuanNcIiwgW1tcIm1ha2VJbnN0YW5jZVJlY29yZFN0b3JhZ2VcIiwgWyRo4oCNX2EgPT4gKG1ha2VJbnN0YW5jZVJlY29yZFN0b3JhZ2UgPSAkaOKAjV9hKV1dXV0sW1wiLi4vaXNzdWVyUmVjb3JkLmpzXCIsIFtbXCJtYWtlSXNzdWVyUmVjb3JkXCIsIFskaOKAjV9hID0+IChtYWtlSXNzdWVyUmVjb3JkID0gJGjigI1fYSldXV1dLFtcIi4vZXNjcm93U3RvcmFnZS5qc1wiLCBbW1wicHJvdmlkZUVzY3Jvd1N0b3JhZ2VcIiwgWyRo4oCNX2EgPT4gKHByb3ZpZGVFc2Nyb3dTdG9yYWdlID0gJGjigI1fYSldXV1dLFtcIi4vbWFrZUludml0YXRpb24uanNcIiwgW1tcInByZXBhcmVJbnZpdGF0aW9uS2l0XCIsIFskaOKAjV9hID0+IChwcmVwYXJlSW52aXRhdGlvbktpdCA9ICRo4oCNX2EpXV1dXSxbXCIuL2luc3RhbmNlQWRtaW5TdG9yYWdlLmpzXCIsIFtbXCJtYWtlSW5zdGFuY2VBZG1pblN0b3JhZ2VcIiwgWyRo4oCNX2EgPT4gKG1ha2VJbnN0YW5jZUFkbWluU3RvcmFnZSA9ICRo4oCNX2EpXV1dXSxbXCIuL2luc3RhbGxhdGlvblN0b3JhZ2UuanNcIiwgW1tcIm1ha2VJbnN0YWxsYXRpb25TdG9yYWdlXCIsIFskaOKAjV9hID0+IChtYWtlSW5zdGFsbGF0aW9uU3RvcmFnZSA9ICRo4oCNX2EpXV1dXSxbXCIuL2ludGVybmFsLXR5cGVzLmpzXCIsIFtdXSxbXCIuLi90eXBlR3VhcmRzLmpzXCIsIFtbXCJJbnN0YW5jZVN0b3JhZ2VNYW5hZ2VySUtpdFwiLCBbJGjigI1fYSA9PiAoSW5zdGFuY2VTdG9yYWdlTWFuYWdlcklLaXQgPSAkaOKAjV9hKV1dLFtcIlpvZU1pbnRJXCIsIFskaOKAjV9hID0+IChab2VNaW50SSA9ICRo4oCNX2EpXV0sW1wiWm9lU3RvcmFnZU1hbmFnZXJJS2l0XCIsIFskaOKAjV9hID0+IChab2VTdG9yYWdlTWFuYWdlcklLaXQgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGFnb3JpYy92YXQtZGF0YScpLkJhZ2dhZ2V9IEJhZ2dhZ2UgKi9cblxuY29uc3R7b3duS2V5c309UmVmbGVjdDtcblxuLyoqXG4gKiBUaGUgWm9lIFN0b3JhZ2UgTWFuYWdlciBlbmNhcHN1bGF0ZXMgYW5kIGNvbXBvc2VzIGltcG9ydGFudFxuICogY2FwYWJpbGl0aWVzLCBzdWNoIGFzIHRoZSBhYmlsaXR5IHRvIGNyZWF0ZSBhIG5ldyBwdXJzZSBhbmQgZGVwb3NpdFxuICogYW5kIHdpdGhkcmF3IGludG8gYSBwdXJzZSwgYWNjb3JkaW5nIHRvIHRoZSBQcmluY2lwbGUgb2YgTGVhc3RcbiAqIEF1dGhvcml0eS4gVGhlIGNvZGUgZm9yIHRoZXNlIGNhcGFiaWxpdGllcyBpcyBpbXBvcnRlZCBmcm9tIHNtYWxsZXJcbiAqIGZpbGVzIHdoaWNoIHNob3VsZCBoYXZlIHVuaXQgdGVzdHMuIEFmdGVyIGNvbXBvc2luZywgWm9lIFN0b3JhZ2VcbiAqIE1hbmFnZXIgZGl2aWRlcyB1cCB0aGUgcmVzdWx0aW5nIGNhcGFiaWxpdGllcyBiZXR3ZWVuIHRob3NlIG5lZWRlZFxuICogYnkgYSBuZXcgY29udHJhY3QgaW5zdGFuY2UgKHJldHVybmVkIGFzIHRoZSByZXN1bHQgb2ZcbiAqIGBtYWtlWm9lSW5zdGFuY2VTdG9yYWdlTWFuYWdlcmApIGFuZCB0aG9zZSBuZWVkZWQgZm9yIG90aGVyIHB1cnBvc2VzLlxuICpcbiAqIEBwYXJhbSB7Q3JlYXRlWkNGVmF0fSBjcmVhdGVaQ0ZWYXQgLSB0aGUgYWJpbGl0eSB0byBjcmVhdGUgYSBuZXdcbiAqIFpDRiBWYXRcbiAqIEBwYXJhbSB7R2V0QnVuZGxlQ2FwRm9ySUR9IGdldEJ1bmRsZUNhcEZvcklEXG4gKiBAcGFyYW0ge1NodXRkb3duV2l0aEZhaWx1cmV9IHNodXRkb3duWm9lVmF0XG4gKiBAcGFyYW0ge3tcbiAqICAgIGdldEZlZUlzc3VlcktpdDogR2V0RmVlSXNzdWVyS2l0LFxuICogICAgZ2V0RmVlSXNzdWVyOiAoKSA9PiBJc3N1ZXIsXG4gKiAgICBnZXRGZWVCcmFuZDogKCkgPT4gQnJhbmQsXG4gKiB9fSBmZWVNaW50XG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IHpvZUJhZ2dhZ2VcbiAqL1xuY29uc3QgICAgICAgIG1ha2Vab2VTdG9yYWdlTWFuYWdlcj0oXG5jcmVhdGVaQ0ZWYXQsXG5nZXRCdW5kbGVDYXBGb3JJRCxcbnNodXRkb3duWm9lVmF0LFxuZmVlTWludCxcbnpvZUJhZ2dhZ2UpPT5cbntcbi8qIGlzc3VlclN0b3JhZ2UgY29udGFpbnMgdGhlIGlzc3VlcnMgdGhhdCB0aGUgWm9lU2VydmljZSBrbm93cyovXG4vKiBhYm91dCwgYXMgd2VsbCBhcyBpbmZvcm1hdGlvbiBhYm91dCB0aGVtIHN1Y2ggYXMgdGhlaXIgYnJhbmQsKi9cbi8qIGFzc2V0S2luZCwgYW5kIGRpc3BsYXlJbmZvKi9cbmNvbnN0IGlzc3VlclN0b3JhZ2U9cHJvdmlkZUlzc3VlclN0b3JhZ2Uoem9lQmFnZ2FnZSk7XG5pc3N1ZXJTdG9yYWdlLmluc3RhbnRpYXRlKCk7XG5cbi8qIEVzY3Jvd1N0b3JhZ2UgaG9sZHMgdGhlIHB1cnNlcyB0aGF0IFpvZSB1c2VzIGZvciBlc2Nyb3cuIFRoaXMqL1xuLyogb2JqZWN0IHNob3VsZCBiZSBjbG9zZWx5IGhlbGQgYW5kIHRyYWNrZWQ6IGFsbCBvZiB0aGUgZGlnaXRhbCovXG4vKiBhc3NldHMgdGhhdCB1c2VycyBlc2Nyb3cgYXJlIGNvbnRhaW5lZCB3aXRoaW4gdGhlc2UgcHVyc2VzLiovXG5jb25zdCBlc2Nyb3dTdG9yYWdlPXByb3ZpZGVFc2Nyb3dTdG9yYWdlKHpvZUJhZ2dhZ2UpO1xuXG4vKiBBZGQgYSBwdXJzZSBmb3IgZXNjcm93aW5nIHVzZXIgZnVuZHMgKG5vdCBmb3IgZmVlcykuIENyZWF0ZSB0aGUqL1xuLyogbG9jYWwsIG5vbi1yZW1vdGUgZXNjcm93IHB1cnNlIGZvciB0aGUgZmVlIG1pbnQgaW1tZWRpYXRlbHkuKi9cbi8qIFdpdGhvdXQgdGhpcyBzdGVwLCByZWdpc3RyYXRpb24gb2YgdGhlIGZlZUlzc3VlciBpbiBhIGNvbnRyYWN0Ki9cbi8qIHdvdWxkIHRyZWF0IHRoZSBmZWVJc3N1ZXIgYXMgaWYgaXQgaXMgcmVtb3RlLCBjcmVhdGluZyBhIHByb21pc2UqL1xuLyogZm9yIGEgcHVyc2Ugd2l0aCBFKGlzc3VlcikubWFrZUVtcHR5UHVyc2UoKS4gV2UgbmVlZCBhIGxvY2FsKi9cbi8qIHB1cnNlLCBzbyB3ZSBjYW5ub3QgYWxsb3cgdGhhdCB0byBoYXBwZW4uKi9cblxuZXNjcm93U3RvcmFnZS5wcm92aWRlTG9jYWxQdXJzZShcbmZlZU1pbnQuZ2V0RmVlSXNzdWVyKCksXG5mZWVNaW50LmdldEZlZUJyYW5kKCkpO1xuXG5cbmNvbnN0IHByb3Bvc2FsU2hhcGVzPXByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlKFxuem9lQmFnZ2FnZSxcbidwcm9wb3NhbCBzaGFwZXMnKTtcblxuXG4vKiBJbiBvcmRlciB0byBwYXJ0aWNpcGF0ZSBpbiBhIGNvbnRyYWN0LCB1c2VycyBtdXN0IGhhdmUgaW52aXRhdGlvbnMsIHdoaWNoKi9cbi8qIGFyZSBFUlRQIHBheW1lbnRzIG1hZGUgYnkgWm9lLiBUaGlzIGludml0YXRpb25LaXQgbXVzdCBiZSBjbG9zZWx5IGhlbGQgYW5kKi9cbi8qIHVzZWQgb25seSBieSB0aGUgbWFrZUludml0YXRpb24oKSBtZXRob2QuKi9cbmNvbnN0e2ludml0YXRpb25Jc3N1ZXIsaW52aXRhdGlvbktpdH09cHJlcGFyZUludml0YXRpb25LaXQoXG56b2VCYWdnYWdlLFxuc2h1dGRvd25ab2VWYXQpO1xuXG5cbi8qIEV2ZXJ5IG5ldyBpbnN0YW5jZSBvZiBhIGNvbnRyYWN0IGNyZWF0ZXMgYSBjb3JyZXNwb25kaW5nKi9cbi8qIFwiem9lSW5zdGFuY2VBZG1pblwiIC0gYW4gYWRtaW4gZmFjZXQgd2l0aGluIHRoZSBab2UgU2VydmljZSBmb3IqL1xuLyogdGhhdCBwYXJ0aWN1bGFyIGluc3RhbmNlLiBUaGlzIGNvZGUgbWFuYWdlcyB0aGUgc3RvcmFnZSBvZiB0aG9zZSovXG4vKiBpbnN0YW5jZUFkbWlucyovXG5jb25zdCBpbnN0YW5jZUFkbWluU3RvcmFnZT1tYWtlSW5zdGFuY2VBZG1pblN0b3JhZ2Uoem9lQmFnZ2FnZSk7XG5cbi8qIFpvZSBzdG9yZXMgXCJpbnN0YWxsYXRpb25zXCIgLSBpZGVudGlmaWFibGUgYnVuZGxlcyBvZiBjb250cmFjdCovXG4vKiBjb2RlIHRoYXQgY2FuIGJlIHJldXNlZCB0byBjcmVhdGUgbmV3IGNvbnRyYWN0IGluc3RhbmNlcyovXG5jb25zdCBpbnN0YWxsYXRpb25TdG9yYWdlPW1ha2VJbnN0YWxsYXRpb25TdG9yYWdlKFxuZ2V0QnVuZGxlQ2FwRm9ySUQsXG56b2VCYWdnYWdlKTtcblxuXG5jb25zdCBnZXRQcm9wb3NhbFNoYXBlRm9ySW52aXRhdGlvbj0oaW52aXRhdGlvbkhhbmRsZSk9PntcbmlmKHByb3Bvc2FsU2hhcGVzLmhhcyhpbnZpdGF0aW9uSGFuZGxlKSl7XG5yZXR1cm4gcHJvcG9zYWxTaGFwZXMuZ2V0KGludml0YXRpb25IYW5kbGUpO1xuIH1cbnJldHVybiB1bmRlZmluZWQ7XG4gfTtcblxuY29uc3Qgem9lTWludEJhZ2dhZ2VTZXQ9cHJvdmlkZUR1cmFibGVTZXRTdG9yZShcbnpvZUJhZ2dhZ2UsXG4nem9lTWludEJhZ2dhZ2VTZXQnKTtcblxuZm9yKGNvbnN0IGlzc3VlckJhZ2dhZ2Ugb2Ygem9lTWludEJhZ2dhZ2VTZXQudmFsdWVzKCkpe1xudXBncmFkZUlzc3VlcktpdChpc3N1ZXJCYWdnYWdlKTtcbiB9XG5cbmNvbnN0IG1ha2Vab2VNaW50PXByZXBhcmVFeG9DbGFzcyhcbnpvZUJhZ2dhZ2UsXG4nWm9lTWludCcsXG5ab2VNaW50SSxcbihsb2NhbE1pbnQsbG9jYWxQb29sZWRQdXJzZSxhZG1pbk5vZGUsbG9jYWxJc3N1ZXJSZWNvcmQpPT4oe1xubG9jYWxNaW50LFxubG9jYWxQb29sZWRQdXJzZSxcbmFkbWluTm9kZSxcbmxvY2FsSXNzdWVyUmVjb3JkfSksXG5cbntcbmdldElzc3VlclJlY29yZCgpe1xuY29uc3R7c3RhdGV9PXRoaXM7XG5yZXR1cm4gc3RhdGUubG9jYWxJc3N1ZXJSZWNvcmQ7XG4gfSxcbm1pbnRBbmRFc2Nyb3codG90YWxUb01pbnQpe1xuY29uc3R7c3RhdGV9PXRoaXM7XG5jb25zdCBwYXltZW50PXN0YXRlLmxvY2FsTWludC5taW50UGF5bWVudCh0b3RhbFRvTWludCk7XG4vKiBOb3RlIENPTU1JVCBQT0lOVCB3aXRoaW4gZGVwb3NpdC4qL1xuc3RhdGUubG9jYWxQb29sZWRQdXJzZS5kZXBvc2l0KHBheW1lbnQsdG90YWxUb01pbnQpO1xuIH0sXG53aXRoZHJhd0FuZEJ1cm4odG90YWxUb0J1cm4pe1xuY29uc3R7c3RhdGV9PXRoaXM7XG50cnl7XG4vKiBDT01NSVQgUE9JTlQqL1xuY29uc3QgcGF5bWVudD1zdGF0ZS5sb2NhbFBvb2xlZFB1cnNlLndpdGhkcmF3KHRvdGFsVG9CdXJuKTtcbi8qIE5vdGUgcmVkdW5kYW50IENPTU1JVCBQT0lOVCB3aXRoaW4gYnVybi4qL1xuc3RhdGUubG9jYWxJc3N1ZXJSZWNvcmQuaXNzdWVyLmJ1cm4ocGF5bWVudCx0b3RhbFRvQnVybik7XG4gfWNhdGNoKGVycil7XG4vKiBub3RoaW5nIGZvciBab2UgdG8gZG8gaWYgdGhlIHRlcm1pbmF0aW9uIGZhaWxzKi9cbnZvaWQgRShzdGF0ZS5hZG1pbk5vZGUpLnRlcm1pbmF0ZVdpdGhGYWlsdXJlKGVycik7XG50aHJvdyBlcnI7XG4gfVxuIH19KTtcblxuXG5cbmNvbnN0IG1ha2VJbnN0YW5jZVN0b3JhZ2VNYW5hZ2VyPXByZXBhcmVFeG9DbGFzc0tpdChcbnpvZUJhZ2dhZ2UsXG4nSW5zdGFuY2VTdG9yYWdlTWFuYWdlcicsXG5JbnN0YW5jZVN0b3JhZ2VNYW5hZ2VySUtpdCxcbihpbnN0YW5jZVJlY29yZCxhZG1pbk5vZGUscm9vdCxmdW5jdGlvbnMpPT5cbmhhcmRlbih7XG5pbnN0YW5jZVN0YXRlOmluc3RhbmNlUmVjb3JkLFxuYWRtaW5Ob2RlLFxucm9vdCxcbmZ1bmN0aW9uc30pLFxuXG57XG5pbnN0YW5jZVN0b3JhZ2VNYW5hZ2VyOntcbmdldFRlcm1zKCl7XG5jb25zdHtzdGF0ZX09dGhpcztcbnJldHVybiBzdGF0ZS5pbnN0YW5jZVN0YXRlLmdldFRlcm1zKCk7XG4gfSxcbmdldElzc3VlcnMoKXtcbmNvbnN0e3N0YXRlfT10aGlzO1xucmV0dXJuIHN0YXRlLmluc3RhbmNlU3RhdGUuZ2V0SXNzdWVycygpO1xuIH0sXG5nZXRCcmFuZHMoKXtcbmNvbnN0e3N0YXRlfT10aGlzO1xucmV0dXJuIHN0YXRlLmluc3RhbmNlU3RhdGUuZ2V0QnJhbmRzKCk7XG4gfSxcbmdldEluc3RhbGxhdGlvbigpe1xuY29uc3R7c3RhdGV9PXRoaXM7XG5yZXR1cm4gc3RhdGUuaW5zdGFuY2VTdGF0ZS5nZXRJbnN0YWxsYXRpb24oKTtcbiB9LFxuICAgICAgYXN5bmMgc2F2ZUlzc3Vlcihpc3N1ZXJQLGtleXdvcmQpe1xuY29uc3R7c3RhdGV9PXRoaXM7XG5jb25zdCBpc3N1ZXJSZWNvcmQ9YXdhaXQgaXNzdWVyU3RvcmFnZS5zdG9yZUlzc3Vlcihpc3N1ZXJQKTtcbmF3YWl0IGVzY3Jvd1N0b3JhZ2UuY3JlYXRlUHVyc2UoXG5pc3N1ZXJSZWNvcmQuaXNzdWVyLFxuaXNzdWVyUmVjb3JkLmJyYW5kKTtcblxuc3RhdGUuaW5zdGFuY2VTdGF0ZS5hZGRJc3N1ZXIoa2V5d29yZCxpc3N1ZXJSZWNvcmQpO1xucmV0dXJuIGlzc3VlclJlY29yZDtcbiB9LFxubWFrZVpvZU1pbnQoXG5rZXl3b3JkLFxuYXNzZXRLaW5kPUFzc2V0S2luZC5OQVQsXG5kaXNwbGF5SW5mbyxcbntlbGVtZW50U2hhcGU9dW5kZWZpbmVkfT17fSlcbntcbmNvbnN0e3N0YXRlLGZhY2V0c309dGhpcztcbi8qIExvY2FsIGluZGljYXRlcyBvbmUgdGhhdCB6b2UgaXRzZWxmIG1ha2VzIGZyb20gdmV0dGVkIGNvZGUsKi9cbi8qIGFuZCBzbyBjYW4gYmUgYXNzdW1lZCBjb3JyZWN0IGFuZCBmcmVzaCBieSB6b2UuKi9cbmNvbnN0IGlzc3VlckJhZ2dhZ2U9bWFrZVNjYWxhckJpZ01hcFN0b3JlKCdJc3N1ZXJCYWdnYWdlJyx7XG5kdXJhYmxlOnRydWV9KTtcblxuY29uc3QgbG9jYWxJc3N1ZXJLaXQ9bWFrZUR1cmFibGVJc3N1ZXJLaXQoXG5pc3N1ZXJCYWdnYWdlLFxua2V5d29yZCxcbmFzc2V0S2luZCxcbmRpc3BsYXlJbmZvLFxuKHJlYXNvbik9PkUoc3RhdGUuYWRtaW5Ob2RlKS50ZXJtaW5hdGVXaXRoRmFpbHVyZShyZWFzb24pLFxue2VsZW1lbnRTaGFwZX0pO1xuXG56b2VNaW50QmFnZ2FnZVNldC5hZGQoaXNzdWVyQmFnZ2FnZSk7XG5yZXR1cm4gZmFjZXRzLmhlbHBlcnMud3JhcElzc3VlcktpdFdpdGhab2VNaW50KFxua2V5d29yZCxcbmxvY2FsSXNzdWVyS2l0LFxuc3RhdGUuYWRtaW5Ob2RlKTtcblxuIH0sXG5yZWdpc3RlckZlZU1pbnQoa2V5d29yZCxhbGxlZ2VkRmVlTWludEFjY2Vzcyl7XG5jb25zdHtzdGF0ZSxmYWNldHN9PXRoaXM7XG5jb25zdCBmZWVJc3N1ZXJLaXQ9ZmVlTWludC5nZXRGZWVJc3N1ZXJLaXQoYWxsZWdlZEZlZU1pbnRBY2Nlc3MpO1xucmV0dXJuIGZhY2V0cy5oZWxwZXJzLndyYXBJc3N1ZXJLaXRXaXRoWm9lTWludChcbmtleXdvcmQsXG5mZWVJc3N1ZXJLaXQsXG5zdGF0ZS5hZG1pbk5vZGUpO1xuXG4gfSxcbmdldEluc3RhbmNlUmVjb3JkKCl7XG5jb25zdHtzdGF0ZX09dGhpcztcbnJldHVybiBzdGF0ZS5pbnN0YW5jZVN0YXRlLmdldEluc3RhbmNlUmVjb3JkKCk7XG4gfSxcbmdldElzc3VlclJlY29yZHMoKXtcbmNvbnN0e3N0YXRlfT10aGlzO1xucmV0dXJuIGlzc3VlclN0b3JhZ2UuZ2V0SXNzdWVyUmVjb3Jkcyhcbi8qIHRoZSBpc3N1ZXJTdG9yYWdlIGlzIGEgd2Vha1N0b3JlLCBzbyB3ZSBjYW5ub3QgaXRlcmF0ZSBvdmVyKi9cbi8qIGl0IGRpcmVjdGx5LiBBZGRpdGlvbmFsbHksIHdlIG9ubHkgd2FudCB0byBleHBvcnQgdGhlKi9cbi8qIGlzc3VlcnMgdXNlZCBpbiB0aGlzIGNvbnRyYWN0IGluc3RhbmNlIHNwZWNpZmljYWxseSwgbm90Ki9cbi8qIGFsbCBpc3N1ZXJzLiovXG5PYmplY3QudmFsdWVzKFxuc3RhdGUuaW5zdGFuY2VTdGF0ZS5nZXRJbnN0YW5jZVJlY29yZCgpLnRlcm1zLmlzc3VlcnMpKTtcblxuXG4gfSxcbmluaXRJbnN0YW5jZUFkbWluKGluc3RhbmNlSGFuZGxlLGluc3RhbmNlQWRtaW4pe1xucmV0dXJuIGluc3RhbmNlQWRtaW5TdG9yYWdlLnVwZGF0ZXIuaW5pdEluc3RhbmNlQWRtaW4oXG5pbnN0YW5jZUhhbmRsZSxcbmluc3RhbmNlQWRtaW4pO1xuXG4gfSxcbmRlbGV0ZUluc3RhbmNlQWRtaW4oaSl7XG5pbnN0YW5jZUFkbWluU3RvcmFnZS51cGRhdGVyLmRlbGV0ZUluc3RhbmNlQWRtaW4oaSk7XG4gfSxcbm1ha2VJbnZpdGF0aW9uKFxuaGFuZGxlLFxuZGVzYyxcbmN1c3RvbURldGFpbHM9dW5kZWZpbmVkLFxucHJvcG9zYWxTaGFwZT11bmRlZmluZWQpXG57XG5jb25zdHtzdGF0ZX09dGhpcztcblxuY29uc3QgZXh0cmFQcm9wZXJ0aWVzPVxudHlwZW9mIGN1c3RvbURldGFpbHM9PT0nb2JqZWN0JyYmXG5vd25LZXlzKGN1c3RvbURldGFpbHMpLmxlbmd0aD49MT9cbmhhcmRlbih7Y3VzdG9tRGV0YWlsc30pOlxuaGFyZGVuKHt9KTtcbmNvbnN0IGludml0YXRpb25BbW91bnQ9QW1vdW50TWF0aC5tYWtlKFxuaW52aXRhdGlvbktpdC5icmFuZCxcbmhhcmRlbihbXG57XG4uLi5leHRyYVByb3BlcnRpZXMsXG5kZXNjcmlwdGlvbjpkZXNjLFxuaGFuZGxlLFxuaW5zdGFuY2U6c3RhdGUuaW5zdGFuY2VTdGF0ZS5nZXRJbnN0YW5jZVJlY29yZCgpLmluc3RhbmNlLFxuaW5zdGFsbGF0aW9uOlxuc3RhdGUuaW5zdGFuY2VTdGF0ZS5nZXRJbnN0YW5jZVJlY29yZCgpLmluc3RhbGxhdGlvbn1dKSk7XG5cblxuXG5pZihwcm9wb3NhbFNoYXBlIT09dW5kZWZpbmVkKXtcbnByb3Bvc2FsU2hhcGVzLmluaXQoaGFuZGxlLHByb3Bvc2FsU2hhcGUpO1xuIH1cbnJldHVybiBpbnZpdGF0aW9uS2l0Lm1pbnQubWludFBheW1lbnQoaW52aXRhdGlvbkFtb3VudCk7XG4gfSxcbmdldEludml0YXRpb25Jc3N1ZXIoKXtcbnJldHVybiBpbnZpdGF0aW9uSXNzdWVyO1xuIH0sXG5nZXRSb290KCl7XG5jb25zdHtzdGF0ZX09dGhpcztcbnJldHVybiBzdGF0ZS5yb290O1xuIH0sXG5nZXRXaXRoZHJhd0ZhY2V0KCl7XG5jb25zdHtmYWNldHN9PXRoaXM7XG5yZXR1cm4gZmFjZXRzLndpdGhkcmF3RmFjZXQ7XG4gfSxcbmdldEFkbWluTm9kZSgpe1xuY29uc3R7c3RhdGV9PXRoaXM7XG5yZXR1cm4gc3RhdGUuYWRtaW5Ob2RlO1xuIH19LFxuXG4vKiBHb2VzIHRvIHRoZSBab2Ugc2VhdCwgd2hpY2ggaXNuJ3QgcmVzdHJpY3RlZCBpbiBob3cgbXVjaCB0byB3aXRoZHJhdyovXG53aXRoZHJhd0ZhY2V0OntcbndpdGhkcmF3UGF5bWVudHMoYW1vdW50cyl7XG5yZXR1cm4gZXNjcm93U3RvcmFnZS53aXRoZHJhd1BheW1lbnRzKGFtb3VudHMpO1xuIH19LFxuXG5oZWxwZXJzOntcbndyYXBJc3N1ZXJLaXRXaXRoWm9lTWludChrZXl3b3JkLGxvY2FsSXNzdWVyS2l0LGFkbWluTm9kZSl7XG5jb25zdHtzdGF0ZX09dGhpcztcbmNvbnN0e1xubWludDpsb2NhbE1pbnQsXG5pc3N1ZXI6bG9jYWxJc3N1ZXIsXG5icmFuZDpsb2NhbEJyYW5kLFxuZGlzcGxheUluZm86bG9jYWxEaXNwbGF5SW5mb309XG5sb2NhbElzc3VlcktpdDtcblxuY29uc3QgbG9jYWxJc3N1ZXJSZWNvcmQ9bWFrZUlzc3VlclJlY29yZChcbmxvY2FsQnJhbmQsXG5sb2NhbElzc3VlcixcbmxvY2FsRGlzcGxheUluZm8pO1xuXG5pc3N1ZXJTdG9yYWdlLnN0b3JlSXNzdWVyUmVjb3JkKGxvY2FsSXNzdWVyUmVjb3JkKTtcbmNvbnN0IGxvY2FsUG9vbGVkUHVyc2U9ZXNjcm93U3RvcmFnZS5wcm92aWRlTG9jYWxQdXJzZShcbmxvY2FsSXNzdWVyUmVjb3JkLmlzc3VlcixcbmxvY2FsSXNzdWVyUmVjb3JkLmJyYW5kKTtcblxuc3RhdGUuaW5zdGFuY2VTdGF0ZS5hZGRJc3N1ZXIoa2V5d29yZCxsb2NhbElzc3VlclJlY29yZCk7XG4vKiogQHR5cGUge1pvZU1pbnR9ICovXG5yZXR1cm4gbWFrZVpvZU1pbnQoXG5sb2NhbE1pbnQsXG5sb2NhbFBvb2xlZFB1cnNlLFxuYWRtaW5Ob2RlLFxubG9jYWxJc3N1ZXJSZWNvcmQpO1xuXG4gfX19KTtcblxuXG5cbmNvbnN0IG1ha2VJbnN0YW5jZVJlY29yZD1tYWtlSW5zdGFuY2VSZWNvcmRTdG9yYWdlKHpvZUJhZ2dhZ2UpO1xuXG4vKiogQHR5cGUge01ha2Vab2VJbnN0YW5jZVN0b3JhZ2VNYW5hZ2VyfSAqL1xuY29uc3QgbWFrZVpvZUluc3RhbmNlU3RvcmFnZU1hbmFnZXI9YXN5bmMoXG5pbnN0YW5jZUJhZ2dhZ2UsXG5pbnN0YWxsYXRpb24sXG5jdXN0b21UZXJtcyxcbnVuY2xlYW5Jc3N1ZXJLZXl3b3JkUmVjb3JkLFxuaW5zdGFuY2UsXG5jb250cmFjdEJ1bmRsZUNhcCxcbmluc3RhbmNlTGFiZWwpPT5cbntcbi8qIENsZWFuIHRoZSBpc3N1ZXJLZXl3b3JkUmVjb3JkIHdlIHJlY2VpdmUgaW4gYHN0YXJ0SW5zdGFuY2VgKi9cbi8qIGZyb20gdGhlIHVzZXIsIGFuZCBzYXZlIHRoZSBpc3N1ZXJzIGluIFpvZSBpZiB0aGV5IGFyZSBub3QqL1xuLyogYWxyZWFkeSBzdG9yZWQgdGhlcmUqL1xuY29uc3R7aXNzdWVycyxicmFuZHN9PWF3YWl0IGlzc3VlclN0b3JhZ2Uuc3RvcmVJc3N1ZXJLZXl3b3JkUmVjb3JkKFxudW5jbGVhbklzc3VlcktleXdvcmRSZWNvcmQpO1xuXG5cbi8qIENyZWF0ZSBwdXJzZXMgZm9yIHRoZSBpc3N1ZXJzIGlmIHRoZXkgZG8gbm90IGFscmVhZHkgZXhpc3QqL1xuYXdhaXQgUHJvbWlzZS5hbGwoXG5PYmplY3QuZW50cmllcyhpc3N1ZXJzKS5tYXAoKFtrZXl3b3JkLGlzc3Vlcl0pPT5cbmVzY3Jvd1N0b3JhZ2UuY3JlYXRlUHVyc2UoaXNzdWVyLGJyYW5kc1trZXl3b3JkXSkpKTtcblxuXG5cbi8qIFRoZSBpbnN0YW5jZVJlY29yZCBpcyB3aGF0IHRoZSBjb250cmFjdCBjb2RlIGlzIHBhcmFtZXRlcml6ZWQqL1xuLyogd2l0aDogdGhlIHBhcnRpY3VsYXIgdGVybXMsIGlzc3VlcnMsIGFuZCBicmFuZHMgdXNlZCBpbiBhKi9cbi8qIGNvbnRyYWN0IGluc3RhbmNlIGJhc2VkIG9uIHRoZSBpbnN0YWxsYXRpb24uIEEgdXNlciBjYW4gcXVlcnkqL1xuLyogWm9lIHRvIGZpbmQgb3V0IHRoZSBpbnN0YWxsYXRpb24sIHRlcm1zLCBpc3N1ZXJzLCBhbmQgYnJhbmRzKi9cbi8qIGZvciBhIGNvbnRyYWN0IGluc3RhbmNlLiBDb250cmFjdCBjb2RlIGhhcyBzaW1pbGFyIHF1ZXJ5Ki9cbi8qIGNhcGFiaWxpdGllcyBmcm9tIHRoZSBaQ0Ygc2lkZS4qL1xuXG5jb25zdCBpbnN0YW5jZVJlY29yZD1tYWtlSW5zdGFuY2VSZWNvcmQoXG5oYXJkZW4oe1xuaW5zdGFsbGF0aW9uLFxuaW5zdGFuY2UsXG50ZXJtczp7XG4uLi5jdXN0b21UZXJtcyxcbmlzc3VlcnMsXG5icmFuZHN9fSkpO1xuXG5cblxuXG5jb25zdCBidW5kbGVMYWJlbD1pbnN0YWxsYXRpb24uZ2V0QnVuZGxlTGFiZWwoKTtcbmNvbnN0IGNvbnRyYWN0TGFiZWw9aW5zdGFuY2VMYWJlbD9cbiBgJHtidW5kbGVMYWJlbH0tJHtpbnN0YW5jZUxhYmVsfWA6XG5idW5kbGVMYWJlbDtcblxuY29uc3R7cm9vdCxhZG1pbk5vZGV9PWF3YWl0IGNyZWF0ZVpDRlZhdChcbmNvbnRyYWN0QnVuZGxlQ2FwLFxuY29udHJhY3RMYWJlbCk7XG5cbnJldHVybiBtYWtlSW5zdGFuY2VTdG9yYWdlTWFuYWdlcihpbnN0YW5jZVJlY29yZCxhZG1pbk5vZGUscm9vdCkuXG5pbnN0YW5jZVN0b3JhZ2VNYW5hZ2VyO1xuIH07XG5cbmNvbnN0IGdldEludml0YXRpb25Jc3N1ZXI9KCk9Pmludml0YXRpb25Jc3N1ZXI7XG5cbmNvbnN0IG1ha2VTdG9yYWdlTWFuYWdlcj1wcmVwYXJlRXhvQ2xhc3NLaXQoXG56b2VCYWdnYWdlLFxuJ1pvZVN0b3JhZ2VNYW5hZ2VyJyxcblpvZVN0b3JhZ2VNYW5hZ2VySUtpdCxcbihpbnN0YW5jZUFkbWlucyk9Pih7aW5zdGFuY2VBZG1pbnN9KSxcbntcbnpvZVNlcnZpY2VEYXRhQWNjZXNzOntcbmdldEludml0YXRpb25Jc3N1ZXIsXG5nZXRCdW5kbGVJREZyb21JbnN0YWxsYXRpb24oYWxsZWdlZEluc3RhbGxhdGlvbil7XG5yZXR1cm4gaW5zdGFsbGF0aW9uU3RvcmFnZS5nZXRCdW5kbGVJREZyb21JbnN0YWxsYXRpb24oXG5hbGxlZ2VkSW5zdGFsbGF0aW9uKTtcblxuIH0sXG5nZXRQdWJsaWNGYWNldChpbnN0YW5jZSl7XG5jb25zdHtzdGF0ZX09dGhpcztcbnJldHVybiBzdGF0ZS5pbnN0YW5jZUFkbWlucy5nZXRQdWJsaWNGYWNldChpbnN0YW5jZSk7XG4gfSxcbmdldEJyYW5kcyhpbnN0YW5jZSl7XG5jb25zdHtzdGF0ZX09dGhpcztcbnJldHVybiBzdGF0ZS5pbnN0YW5jZUFkbWlucy5nZXRCcmFuZHMoaW5zdGFuY2UpO1xuIH0sXG5nZXRJc3N1ZXJzKGluc3RhbmNlKXtcbmNvbnN0e3N0YXRlfT10aGlzO1xucmV0dXJuIHN0YXRlLmluc3RhbmNlQWRtaW5zLmdldElzc3VlcnMoaW5zdGFuY2UpO1xuIH0sXG5nZXRPZmZlckZpbHRlcihpbnN0YW5jZSl7XG5jb25zdHtzdGF0ZX09dGhpcztcbnJldHVybiBzdGF0ZS5pbnN0YW5jZUFkbWlucy5nZXRPZmZlckZpbHRlcihpbnN0YW5jZSk7XG4gfSxcbmdldFRlcm1zKGluc3RhbmNlKXtcbmNvbnN0e3N0YXRlfT10aGlzO1xucmV0dXJuIHN0YXRlLmluc3RhbmNlQWRtaW5zLmdldFRlcm1zKGluc3RhbmNlKTtcbiB9LFxuZ2V0SW5zdGFsbGF0aW9uKGluc3RhbmNlKXtcbmNvbnN0e3N0YXRlfT10aGlzO1xucmV0dXJuIHN0YXRlLmluc3RhbmNlQWRtaW5zLmdldEluc3RhbGxhdGlvbihpbnN0YW5jZSk7XG4gfSxcbmdldFByb3Bvc2FsU2hhcGVGb3JJbnZpdGF0aW9uLFxuaW5zdGFsbEJ1bmRsZTooYWxsZWdlZEJ1bmRsZSxidW5kbGVMYWJlbCk9PntcbnJldHVybiBpbnN0YWxsYXRpb25TdG9yYWdlLmluc3RhbGxCdW5kbGUoYWxsZWdlZEJ1bmRsZSxidW5kbGVMYWJlbCk7XG4gfSxcbmluc3RhbGxCdW5kbGVJRChidW5kbGVJRCxidW5kbGVMYWJlbCl7XG5yZXR1cm4gaW5zdGFsbGF0aW9uU3RvcmFnZS5pbnN0YWxsQnVuZGxlSUQoYnVuZGxlSUQsYnVuZGxlTGFiZWwpO1xuIH19LFxuXG5tYWtlT2ZmZXJBY2Nlc3M6e1xuZ2V0QXNzZXRLaW5kQnlCcmFuZDppc3N1ZXJTdG9yYWdlLmdldEFzc2V0S2luZEJ5QnJhbmQsXG5nZXRJbnN0YW5jZUFkbWluKGluc3RhbmNlKXtcbmNvbnN0e3N0YXRlfT10aGlzO1xucmV0dXJuIHN0YXRlLmluc3RhbmNlQWRtaW5zLmdldEluc3RhbmNlQWRtaW4oaW5zdGFuY2UpO1xuIH0sXG5nZXRQcm9wb3NhbFNoYXBlRm9ySW52aXRhdGlvbixcbmdldEludml0YXRpb25Jc3N1ZXIsXG5kZXBvc2l0UGF5bWVudHMocHJvcG9zYWwscGF5bWVudHMpe1xucmV0dXJuIGVzY3Jvd1N0b3JhZ2UuZGVwb3NpdFBheW1lbnRzKHByb3Bvc2FsLHBheW1lbnRzKTtcbiB9fSxcblxuc3RhcnRJbnN0YW5jZUFjY2Vzczp7XG5tYWtlWm9lSW5zdGFuY2VTdG9yYWdlTWFuYWdlcixcbi8qKiBAdHlwZSB7VW53cmFwSW5zdGFsbGF0aW9ufSAqL1xudW53cmFwSW5zdGFsbGF0aW9uKGluc3RhbGxhdGlvbil7XG5yZXR1cm4gaW5zdGFsbGF0aW9uU3RvcmFnZS51bndyYXBJbnN0YWxsYXRpb24oaW5zdGFsbGF0aW9uKTtcbiB9fSxcblxuaW52aXRhdGlvbklzc3VlckFjY2Vzczp7XG5nZXRJbnZpdGF0aW9uSXNzdWVyfX0pO1xuXG5cblxuXG5yZXR1cm4gbWFrZVN0b3JhZ2VNYW5hZ2VyKGluc3RhbmNlQWRtaW5TdG9yYWdlLmFjY2Vzc29yKTtcbiB9OyRo4oCNX29uY2UubWFrZVpvZVN0b3JhZ2VNYW5hZ2VyKG1ha2Vab2VTdG9yYWdlTWFuYWdlcik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVpvZVN0b3JhZ2VNYW5hZ2VyIjpbIm1ha2Vab2VTdG9yYWdlTWFuYWdlciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAeKPu0fgEAAH4BAAAhAAAAQGVuZG8vZW52LW9wdGlvbnMtdjAuMS40L2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vc3JjL2Vudi1vcHRpb25zLmpzIl0sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOlsiLi9zcmMvZW52LW9wdGlvbnMuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL3NyYy9lbnYtb3B0aW9ucy5qc1wiLCBbXV1dKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAshzifZgMAACYDAAAKwAAAEBlbmRvL2Vudi1vcHRpb25zLXYwLjEuNC9zcmMvZW52LW9wdGlvbnMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIm1ha2VFbnZpcm9ubWVudENhcHRvciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qIEB0cy1jaGVjayovXG5cbi8qIGBAZW5kby9lbnYtb3B0aW9uc2AgbmVlZHMgdG8gYmUgaW1wb3J0ZWQgcXVpdGUgZWFybHksIGFuZCBzbyBzaG91bGQqL1xuLyogYXZvaWQgaW1wb3J0aW5nIGZyb20gc2VzIG9yIGFueXRoaW5nIHRoYXQgZGVwZW5kcyBvbiBzZXMuKi9cblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuLyogUHJlbHVkZSBvZiBjaGVhcCBnb29kIC0gZW5vdWdoIGltaXRhdGlvbnMgb2YgdGhpbmdzIHdlJ2QgdXNlIG9yKi9cbi8qIGRvIGRpZmZlcmVudGx5IGlmIHdlIGNvdWxkIGRlcGVuZCBvbiBzZXMqL1xuXG5jb25zdHtmcmVlemV9PU9iamVjdDtcbmNvbnN0e2FwcGx5fT1SZWZsZWN0O1xuXG4vKiBTaG91bGQgYmUgZXF1aXZhbGVudCB0byB0aGUgb25lIGluIHNlcycgY29tbW9ucy5qcyBldmVuIHRob3VnaCBpdCovXG4vKiB1c2VzIHRoZSBvdGhlciB0ZWNobmlxdWUuKi9cbmNvbnN0IHVuY3VycnlUaGlzPVxuKGZuKT0+XG4ocmVjZWl2ZXIsLi4uYXJncyk9PlxuYXBwbHkoZm4scmVjZWl2ZXIsYXJncyk7XG5jb25zdCBhcnJheVB1c2g9dW5jdXJyeVRoaXMoQXJyYXkucHJvdG90eXBlLnB1c2gpO1xuXG5jb25zdCBxPUpTT04uc3RyaW5naWZ5O1xuXG5jb25zdCBGYWlsPShsaXRlcmFscywuLi5hcmdzKT0+e1xubGV0IG1zZz1saXRlcmFsc1swXTtcbmZvcihsZXQgaT0wO2k8YXJncy5sZW5ndGg7aSs9MSl7XG5tc2c9IGAke21zZ30ke2FyZ3NbaV19JHtsaXRlcmFsc1tpKzFdfWA7XG4gfVxudGhyb3cgRXJyb3IobXNnKTtcbiB9O1xuXG4vKiBlbmQgcHJlbHVkZSovXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKlxuICogYG1ha2VFbnZpcm9ubWVudENhcHRvcmAgcHJvdmlkZXMgYSBtZWNoYW5pc20gZm9yIGdldHRpbmcgZW52aXJvbm1lbnRcbiAqIHZhcmlhYmxlcywgaWYgdGhleSBhcmUgbmVlZGVkLCBhbmQgYSB3YXkgdG8gY2F0YWxvZyB0aGUgbmFtZXMgb2YgYWxsXG4gKiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRoYXQgd2VyZSBjYXB0dXJlZC5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gYUdsb2JhbFxuICovXG5jb25zdCAgICAgICAgbWFrZUVudmlyb25tZW50Q2FwdG9yPShhR2xvYmFsKT0+e1xuY29uc3QgY2FwdHVyZWRFbnZpcm9ubWVudE9wdGlvbk5hbWVzPVtdO1xuXG4vKipcbiAqIEdldHMgYW4gZW52aXJvbm1lbnQgb3B0aW9uIGJ5IG5hbWUgYW5kIHJldHVybnMgdGhlIG9wdGlvbiB2YWx1ZSBvciB0aGVcbiAqIGdpdmVuIGRlZmF1bHQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbk5hbWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBkZWZhdWx0U2V0dGluZ1xuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3QgZ2V0RW52aXJvbm1lbnRPcHRpb249KG9wdGlvbk5hbWUsZGVmYXVsdFNldHRpbmcpPT57XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGVuZG8vbm8tcG9seW1vcnBoaWMtY2FsbCovXG50eXBlb2Ygb3B0aW9uTmFtZT09PSdzdHJpbmcnfHxcbkZhaWwgYEVudmlyb25tZW50IG9wdGlvbiBuYW1lICR7cShvcHRpb25OYW1lKX0gbXVzdCBiZSBhIHN0cmluZy5gO1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBlbmRvL25vLXBvbHltb3JwaGljLWNhbGwqL1xudHlwZW9mIGRlZmF1bHRTZXR0aW5nPT09J3N0cmluZyd8fFxuRmFpbCBgRW52aXJvbm1lbnQgb3B0aW9uIGRlZmF1bHQgc2V0dGluZyAke3EoXG5kZWZhdWx0U2V0dGluZylcbiB9IG11c3QgYmUgYSBzdHJpbmcuYDtcblxuLyoqIEB0eXBlIHtzdHJpbmd9ICovXG5sZXQgc2V0dGluZz1kZWZhdWx0U2V0dGluZztcbmNvbnN0IGdsb2JhbFByb2Nlc3M9YUdsb2JhbC5wcm9jZXNzO1xuaWYoZ2xvYmFsUHJvY2VzcyYmdHlwZW9mIGdsb2JhbFByb2Nlc3M9PT0nb2JqZWN0Jyl7XG5jb25zdCBnbG9iYWxFbnY9Z2xvYmFsUHJvY2Vzcy5lbnY7XG5pZihnbG9iYWxFbnYmJnR5cGVvZiBnbG9iYWxFbnY9PT0nb2JqZWN0Jyl7XG5pZihvcHRpb25OYW1lIGluIGdsb2JhbEVudil7XG5hcnJheVB1c2goY2FwdHVyZWRFbnZpcm9ubWVudE9wdGlvbk5hbWVzLG9wdGlvbk5hbWUpO1xuY29uc3Qgb3B0aW9uVmFsdWU9Z2xvYmFsRW52W29wdGlvbk5hbWVdO1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBlbmRvL25vLXBvbHltb3JwaGljLWNhbGwqL1xudHlwZW9mIG9wdGlvblZhbHVlPT09J3N0cmluZyd8fFxuRmFpbCBgRW52aXJvbm1lbnQgb3B0aW9uIG5hbWVkICR7cShcbm9wdGlvbk5hbWUpXG4gfSwgaWYgcHJlc2VudCwgbXVzdCBoYXZlIGEgY29ycmVzcG9uZGluZyBzdHJpbmcgdmFsdWUsIGdvdCAke3EoXG5vcHRpb25WYWx1ZSlcbiB9YDtcbnNldHRpbmc9b3B0aW9uVmFsdWU7XG4gfVxuIH1cbiB9XG5yZXR1cm4gc2V0dGluZztcbiB9O1xuZnJlZXplKGdldEVudmlyb25tZW50T3B0aW9uKTtcblxuY29uc3QgZ2V0Q2FwdHVyZWRFbnZpcm9ubWVudE9wdGlvbk5hbWVzPSgpPT57XG5yZXR1cm4gZnJlZXplKFsuLi5jYXB0dXJlZEVudmlyb25tZW50T3B0aW9uTmFtZXNdKTtcbiB9O1xuZnJlZXplKGdldENhcHR1cmVkRW52aXJvbm1lbnRPcHRpb25OYW1lcyk7XG5cbnJldHVybiBmcmVlemUoe2dldEVudmlyb25tZW50T3B0aW9uLGdldENhcHR1cmVkRW52aXJvbm1lbnRPcHRpb25OYW1lc30pO1xuIH07JGjigI1fb25jZS5tYWtlRW52aXJvbm1lbnRDYXB0b3IobWFrZUVudmlyb25tZW50Q2FwdG9yKTtcbmZyZWV6ZShtYWtlRW52aXJvbm1lbnRDYXB0b3IpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VFbnZpcm9ubWVudENhcHRvciI6WyJtYWtlRW52aXJvbm1lbnRDYXB0b3IiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAtC+LggcuAAAHLgAAJAAAAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTcuNi9zcmMvRS5qc3siaW1wb3J0cyI6WyIuL3RyYWNrLXR1cm5zLmpzIl0sImV4cG9ydHMiOlsiZGVmYXVsdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCB0cmFja1R1cm5zOyRo4oCNX2ltcG9ydHMoW1tcIi4vdHJhY2stdHVybnMuanNcIiwgW1tcInRyYWNrVHVybnNcIiwgWyRo4oCNX2EgPT4gKHRyYWNrVHVybnMgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuY29uc3R7ZGV0YWlsczpYLHF1b3RlOnEsRmFpbH09YXNzZXJ0O1xuY29uc3R7YXNzaWduLGNyZWF0ZX09T2JqZWN0O1xuXG4vKiogQHR5cGUge1Byb3h5SGFuZGxlcjxhbnk+fSAqL1xuY29uc3QgYmFzZUZyZWV6YWJsZVByb3h5SGFuZGxlcj17XG5zZXQoX3RhcmdldCxfcHJvcCxfdmFsdWUpe1xucmV0dXJuIGZhbHNlO1xuIH0sXG5pc0V4dGVuc2libGUoX3RhcmdldCl7XG5yZXR1cm4gZmFsc2U7XG4gfSxcbnNldFByb3RvdHlwZU9mKF90YXJnZXQsX3ZhbHVlKXtcbnJldHVybiBmYWxzZTtcbiB9LFxuZGVsZXRlUHJvcGVydHkoX3RhcmdldCxfcHJvcCl7XG5yZXR1cm4gZmFsc2U7XG4gfX07XG5cblxuLyogRSBQcm94eSBoYW5kbGVycyBwcmV0ZW5kIHRoYXQgYW55IHByb3BlcnR5IGV4aXN0cyBvbiB0aGUgdGFyZ2V0IGFuZCByZXR1cm5zKi9cbi8qIGEgZnVuY3Rpb24gZm9yIHRoZWlyIHZhbHVlLiBXaGlsZSB0aGlzIGZ1bmN0aW9uIGlzIFwiYm91bmRcIiBieSBjb250ZXh0LCBpdCBpcyovXG4vKiBtZWFudCB0byBiZSBjYWxsZWQgYXMgYSBtZXRob2QuIEZvciB0aGF0IHJlYXNvbiwgdGhlIHJldHVybmVkIGZ1bmN0aW9uKi9cbi8qIGluY2x1ZGVzIGEgY2hlY2sgdGhhdCB0aGUgYHRoaXNgIGFyZ3VtZW50IGNvcnJlc3BvbmRzIHRvIHRoZSBpbml0aWFsKi9cbi8qIHJlY2VpdmVyIHdoZW4gdGhlIGZ1bmN0aW9uIHdhcyByZXRyaWV2ZWQuKi9cbi8qIEUgUHJveHkgaGFuZGxlcnMgYWxzbyBmb3J3YXJkIGRpcmVjdCBjYWxscyB0byB0aGUgdGFyZ2V0IGluIGNhc2UgdGhlIHJlbW90ZSovXG4vKiBpcyBhIGZ1bmN0aW9uIGluc3RlYWQgb2YgYW4gb2JqZWN0LiBObyBzdWNoIHJlY2VpdmVyIGNoZWNrcyBhcmUgbmVjZXNzYXJ5IGluKi9cbi8qIHRoYXQgY2FzZS4qL1xuXG4vKipcbiAqIEEgUHJveHkgaGFuZGxlciBmb3IgRSh4KS5cbiAqXG4gKiBAcGFyYW0geyp9IHggQW55IHZhbHVlIHBhc3NlZCB0byBFKHgpXG4gKiBAcGFyYW0ge1hpbXBvcnQoJy4vdHlwZXMnKS5IYW5kbGVkUHJvbWlzZUNvbnN0cnVjdG9yfSBIYW5kbGVkUHJvbWlzZVxuICogQHJldHVybnMge1Byb3h5SGFuZGxlcn0gdGhlIFByb3h5IGhhbmRsZXJcbiAqL1xuY29uc3QgbWFrZUVQcm94eUhhbmRsZXI9KHgsSGFuZGxlZFByb21pc2UpPT5cbmhhcmRlbih7XG4uLi5iYXNlRnJlZXphYmxlUHJveHlIYW5kbGVyLFxuZ2V0OihfdGFyZ2V0LHAscmVjZWl2ZXIpPT57XG5yZXR1cm4gaGFyZGVuKFxue1xuLyogVGhpcyBmdW5jdGlvbiBwdXJwb3NlbHkgY2hlY2tzIHRoZSBgdGhpc2AgdmFsdWUgKHNlZSBhYm92ZSkqL1xuLyogSW4gb3JkZXIgdG8gYmUgYHRoaXNgIHNlbnNpdGl2ZSBpdCBpcyBkZWZpbmVkIHVzaW5nIGNvbmNpc2UgbWV0aG9kKi9cbi8qIHN5bnRheCByYXRoZXIgdGhhbiBhcyBhbiBhcnJvdyBmdW5jdGlvbi4gVG8gZW5zdXJlIHRoZSBmdW5jdGlvbiovXG4vKiBpcyBub3QgY29uc3RydWN0YWJsZSwgaXQgYWxzbyBhdm9pZHMgdGhlIGBmdW5jdGlvbmAgc3ludGF4LiovXG5bcF0oLi4uYXJncyl7XG5pZih0aGlzIT09cmVjZWl2ZXIpe1xuLyogUmVqZWN0IHRoZSBhc3luYyBmdW5jdGlvbiBjYWxsKi9cbnJldHVybiBIYW5kbGVkUHJvbWlzZS5yZWplY3QoXG5hc3NlcnQuZXJyb3IoXG5YIGBVbmV4cGVjdGVkIHJlY2VpdmVyIGZvciBcIiR7cH1cIiBtZXRob2Qgb2YgRSgke3EoeCl9KWApKTtcblxuXG4gfVxuXG5yZXR1cm4gSGFuZGxlZFByb21pc2UuYXBwbHlNZXRob2QoeCxwLGFyZ3MpO1xuIH1cbi8qIEB0cy1leHBlY3QtZXJyb3IgaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy81MDMxOSovfVtcbnBdKTtcblxuIH0sXG5hcHBseTooX3RhcmdldCxfdGhpc0FyZyxhcmdBcnJheT1bXSk9PntcbnJldHVybiBIYW5kbGVkUHJvbWlzZS5hcHBseUZ1bmN0aW9uKHgsYXJnQXJyYXkpO1xuIH0sXG5oYXM6KF90YXJnZXQsX3ApPT57XG4vKiBXZSBqdXN0IHByZXRlbmQgZXZlcnl0aGluZyBleGlzdHMuKi9cbnJldHVybiB0cnVlO1xuIH19KTtcblxuXG4vKipcbiAqIEEgUHJveHkgaGFuZGxlciBmb3IgRS5zZW5kT25seSh4KVxuICogSXQgaXMgYSB2YXJpYW50IG9uIHRoZSBFKHgpIFByb3h5IGhhbmRsZXIuXG4gKlxuICogQHBhcmFtIHsqfSB4IEFueSB2YWx1ZSBwYXNzZWQgdG8gRS5zZW5kT25seSh4KVxuICogQHBhcmFtIHtYaW1wb3J0KCcuL3R5cGVzJykuSGFuZGxlZFByb21pc2VDb25zdHJ1Y3Rvcn0gSGFuZGxlZFByb21pc2VcbiAqIEByZXR1cm5zIHtQcm94eUhhbmRsZXJ9IHRoZSBQcm94eSBoYW5kbGVyXG4gKi9cbmNvbnN0IG1ha2VFU2VuZE9ubHlQcm94eUhhbmRsZXI9KHgsSGFuZGxlZFByb21pc2UpPT5cbmhhcmRlbih7XG4uLi5iYXNlRnJlZXphYmxlUHJveHlIYW5kbGVyLFxuZ2V0OihfdGFyZ2V0LHAscmVjZWl2ZXIpPT57XG5yZXR1cm4gaGFyZGVuKFxue1xuLyogVGhpcyBmdW5jdGlvbiBwdXJwb3NlbHkgY2hlY2tzIHRoZSBgdGhpc2AgdmFsdWUgKHNlZSBhYm92ZSkqL1xuLyogSW4gb3JkZXIgdG8gYmUgYHRoaXNgIHNlbnNpdGl2ZSBpdCBpcyBkZWZpbmVkIHVzaW5nIGNvbmNpc2UgbWV0aG9kKi9cbi8qIHN5bnRheCByYXRoZXIgdGhhbiBhcyBhbiBhcnJvdyBmdW5jdGlvbi4gVG8gZW5zdXJlIHRoZSBmdW5jdGlvbiovXG4vKiBpcyBub3QgY29uc3RydWN0YWJsZSwgaXQgYWxzbyBhdm9pZHMgdGhlIGBmdW5jdGlvbmAgc3ludGF4LiovXG5bcF0oLi4uYXJncyl7XG4vKiBUaHJvdyBzaW5jZSB0aGUgZnVuY3Rpb24gcmV0dXJucyBub3RoaW5nKi9cbnRoaXM9PT1yZWNlaXZlcnx8XG5GYWlsIGBVbmV4cGVjdGVkIHJlY2VpdmVyIGZvciBcIiR7cShwKX1cIiBtZXRob2Qgb2YgRS5zZW5kT25seSgke3EoXG54KVxuIH0pYDtcbkhhbmRsZWRQcm9taXNlLmFwcGx5TWV0aG9kU2VuZE9ubHkoeCxwLGFyZ3MpO1xucmV0dXJuIHVuZGVmaW5lZDtcbiB9XG4vKiBAdHMtZXhwZWN0LWVycm9yIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvNTAzMTkqL31bXG5wXSk7XG5cbiB9LFxuYXBwbHk6KF90YXJnZXQsX3RoaXNBcmcsYXJnc0FycmF5PVtdKT0+e1xuSGFuZGxlZFByb21pc2UuYXBwbHlGdW5jdGlvblNlbmRPbmx5KHgsYXJnc0FycmF5KTtcbnJldHVybiB1bmRlZmluZWQ7XG4gfSxcbmhhczooX3RhcmdldCxfcCk9Pntcbi8qIFdlIGp1c3QgcHJldGVuZCB0aGF0IGV2ZXJ5dGhpbmcgZXhpc3RzLiovXG5yZXR1cm4gdHJ1ZTtcbiB9fSk7XG5cblxuLyoqXG4gKiBBIFByb3h5IGhhbmRsZXIgZm9yIEUuZ2V0KHgpXG4gKiBJdCBpcyBhIHZhcmlhbnQgb24gdGhlIEUoeCkgUHJveHkgaGFuZGxlci5cbiAqXG4gKiBAcGFyYW0geyp9IHggQW55IHZhbHVlIHBhc3NlZCB0byBFLmdldCh4KVxuICogQHBhcmFtIHtYaW1wb3J0KCcuL3R5cGVzJykuSGFuZGxlZFByb21pc2VDb25zdHJ1Y3Rvcn0gSGFuZGxlZFByb21pc2VcbiAqIEByZXR1cm5zIHtQcm94eUhhbmRsZXJ9IHRoZSBQcm94eSBoYW5kbGVyXG4gKi9cbmNvbnN0IG1ha2VFR2V0UHJveHlIYW5kbGVyPSh4LEhhbmRsZWRQcm9taXNlKT0+XG5oYXJkZW4oe1xuLi4uYmFzZUZyZWV6YWJsZVByb3h5SGFuZGxlcixcbmhhczooX3RhcmdldCxfcHJvcCk9PnRydWUsXG5nZXQ6KF90YXJnZXQscHJvcCk9PkhhbmRsZWRQcm9taXNlLmdldCh4LHByb3ApfSk7XG5cblxuLyoqXG4gKiBAcGFyYW0ge1hpbXBvcnQoJy4vdHlwZXMnKS5IYW5kbGVkUHJvbWlzZUNvbnN0cnVjdG9yfSBIYW5kbGVkUHJvbWlzZVxuICovXG5jb25zdCBtYWtlRT0oSGFuZGxlZFByb21pc2UpPT57XG5yZXR1cm4gaGFyZGVuKFxuYXNzaWduKFxuLyoqXG4gKiBFKHgpIHJldHVybnMgYSBwcm94eSBvbiB3aGljaCB5b3UgY2FuIGNhbGwgYXJiaXRyYXJ5IG1ldGhvZHMuIEVhY2ggb2YgdGhlc2VcbiAqIG1ldGhvZCBjYWxscyByZXR1cm5zIGEgcHJvbWlzZS4gVGhlIG1ldGhvZCB3aWxsIGJlIGludm9rZWQgb24gd2hhdGV2ZXJcbiAqICd4JyBkZXNpZ25hdGVzIChvciByZXNvbHZlcyB0bykgaW4gYSBmdXR1cmUgdHVybiwgbm90IHRoaXMgb25lLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1R9IHggdGFyZ2V0IGZvciBtZXRob2QvZnVuY3Rpb24gY2FsbFxuICogQHJldHVybnMge0VDYWxsYWJsZU9yTWV0aG9kczxSZW1vdGVGdW5jdGlvbnM8VD4+fSBtZXRob2QvZnVuY3Rpb24gY2FsbCBwcm94eVxuICovXG4oeCk9PmhhcmRlbihuZXcgUHJveHkoKCk9PnsgfSxtYWtlRVByb3h5SGFuZGxlcih4LEhhbmRsZWRQcm9taXNlKSkpLFxue1xuLyoqXG4gKiBFLmdldCh4KSByZXR1cm5zIGEgcHJveHkgb24gd2hpY2ggeW91IGNhbiBnZXQgYXJiaXRyYXJ5IHByb3BlcnRpZXMuXG4gKiBFYWNoIG9mIHRoZXNlIHByb3BlcnRpZXMgcmV0dXJucyBhIHByb21pc2UgZm9yIHRoZSBwcm9wZXJ0eS4gIFRoZSBwcm9taXNlXG4gKiB2YWx1ZSB3aWxsIGJlIHRoZSBwcm9wZXJ0eSBmZXRjaGVkIGZyb20gd2hhdGV2ZXIgJ3gnIGRlc2lnbmF0ZXMgKG9yXG4gKiByZXNvbHZlcyB0bykgaW4gYSBmdXR1cmUgdHVybiwgbm90IHRoaXMgb25lLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1R9IHggdGFyZ2V0IGZvciBwcm9wZXJ0eSBnZXRcbiAqIEByZXR1cm5zIHtFR2V0dGVyczxMb2NhbFJlY29yZDxUPj59IHByb3BlcnR5IGdldCBwcm94eVxuICogQHJlYWRvbmx5XG4gKi9cbmdldDooeCk9PlxuaGFyZGVuKFxubmV3IFByb3h5KGNyZWF0ZShudWxsKSxtYWtlRUdldFByb3h5SGFuZGxlcih4LEhhbmRsZWRQcm9taXNlKSkpLFxuXG5cbi8qKlxuICogRS5yZXNvbHZlKHgpIGNvbnZlcnRzIHggdG8gYSBoYW5kbGVkIHByb21pc2UuIEl0IGlzXG4gKiBzaG9ydGhhbmQgZm9yIEhhbmRsZWRQcm9taXNlLnJlc29sdmUoeClcbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtUfSB4IHZhbHVlIHRvIGNvbnZlcnQgdG8gYSBoYW5kbGVkIHByb21pc2VcbiAqIEByZXR1cm5zIHtQcm9taXNlPEF3YWl0ZWQ8VD4+fSBoYW5kbGVkIHByb21pc2UgZm9yIHhcbiAqIEByZWFkb25seVxuICovXG5yZXNvbHZlOkhhbmRsZWRQcm9taXNlLnJlc29sdmUsXG5cbi8qKlxuICogRS5zZW5kT25seSByZXR1cm5zIGEgcHJveHkgc2ltaWxhciB0byBFLCBidXQgZm9yIHdoaWNoIHRoZSByZXN1bHRzXG4gKiBhcmUgaWdub3JlZCAodW5kZWZpbmVkIGlzIHJldHVybmVkKS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtUfSB4IHRhcmdldCBmb3IgbWV0aG9kL2Z1bmN0aW9uIGNhbGxcbiAqIEByZXR1cm5zIHtFU2VuZE9ubHlDYWxsYWJsZU9yTWV0aG9kczxSZW1vdGVGdW5jdGlvbnM8VD4+fSBtZXRob2QvZnVuY3Rpb24gY2FsbCBwcm94eVxuICogQHJlYWRvbmx5XG4gKi9cbnNlbmRPbmx5Oih4KT0+XG5oYXJkZW4oXG5uZXcgUHJveHkoKCk9PnsgfSxtYWtlRVNlbmRPbmx5UHJveHlIYW5kbGVyKHgsSGFuZGxlZFByb21pc2UpKSksXG5cblxuLyoqXG4gKiBFLndoZW4oeCwgcmVzLCByZWopIGlzIGVxdWl2YWxlbnQgdG9cbiAqIEhhbmRsZWRQcm9taXNlLnJlc29sdmUoeCkudGhlbihyZXMsIHJlailcbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHRlbXBsYXRlIFtVID0gVF1cbiAqIEBwYXJhbSB7VHxQcm9taXNlTGlrZTxUPn0geCB2YWx1ZSB0byBjb252ZXJ0IHRvIGEgaGFuZGxlZCBwcm9taXNlXG4gKiBAcGFyYW0geyh2YWx1ZTogVCkgPT4gRVJlZjxVPn0gW29uZnVsZmlsbGVkXVxuICogQHBhcmFtIHsocmVhc29uOiBhbnkpID0+IEVSZWY8VT59IFtvbnJlamVjdGVkXVxuICogQHJldHVybnMge1Byb21pc2U8VT59XG4gKiBAcmVhZG9ubHlcbiAqL1xud2hlbjooeCxvbmZ1bGZpbGxlZCxvbnJlamVjdGVkKT0+XG5IYW5kbGVkUHJvbWlzZS5yZXNvbHZlKHgpLnRoZW4oXG4uLi50cmFja1R1cm5zKFtvbmZ1bGZpbGxlZCxvbnJlamVjdGVkXSkpfSkpO1xuXG5cblxuXG4gfTtcblxuY29uc3R7ZGVmYXVsdDokY+KAjV9kZWZhdWx0fT17ZGVmYXVsdDptYWtlRX07XG5cbi8qKiBAdHlwZWRlZiB7UmV0dXJuVHlwZTxtYWtlRT59IEVQcm94eSAqL1xuXG4vKipcbiAqIENyZWF0ZXMgYSB0eXBlIHRoYXQgYWNjZXB0cyBib3RoIG5lYXIgYW5kIG1hcnNoYWxsZWQgcmVmZXJlbmNlcyB0aGF0IHdlcmVcbiAqIHJldHVybmVkIGZyb20gYFJlbW90YWJsZWAgb3IgYEZhcmAsIGFuZCBhbHNvIHByb21pc2VzIGZvciBzdWNoIHJlZmVyZW5jZXMuXG4gKlxuICogQHRlbXBsYXRlIFByaW1hcnkgVGhlIHR5cGUgb2YgdGhlIHByaW1hcnkgcmVmZXJlbmNlLlxuICogQHRlbXBsYXRlIFtMb2NhbD1EYXRhT25seTxQcmltYXJ5Pl0gVGhlIGxvY2FsIHByb3BlcnRpZXMgb2YgdGhlIG9iamVjdC5cbiAqIEB0eXBlZGVmIHtFUmVmPExvY2FsICYgWGltcG9ydCgnLi90eXBlcycpLlJlbW90YWJsZUJyYW5kPExvY2FsLCBQcmltYXJ5Pj59IEZhclJlZlxuICovXG5cbi8qKlxuICogYERhdGFPbmx5PFQ+YCBtZWFucyB0byByZXR1cm4gYSByZWNvcmQgdHlwZSBgVDJgIGNvbnNpc3Rpbmcgb25seSBvZlxuICogcHJvcGVydGllcyB0aGF0IGFyZSAqbm90KiBmdW5jdGlvbnMuXG4gKlxuICogQHRlbXBsYXRlIFQgVGhlIHR5cGUgdG8gYmUgZmlsdGVyZWQuXG4gKiBAdHlwZWRlZiB7T21pdDxULCBGaWx0ZXJlZEtleXM8VCwgWGltcG9ydCgnLi90eXBlcycpLkNhbGxhYmxlPj59IERhdGFPbmx5XG4gKi9cblxuLyoqXG4gKiBAc2VlIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzMxMzk0fVxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtQcm9taXNlTGlrZTxUPiB8IFR9IEVSZWZcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7WGltcG9ydCgnLi90eXBlcycpLkNhbGxhYmxlfSBUXG4gKiBAdHlwZWRlZiB7KFxuICogICBSZXR1cm5UeXBlPFQ+IGV4dGVuZHMgUHJvbWlzZUxpa2U8aW5mZXIgVT4gICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIGZ1bmN0aW9uIHJldHVybnMgYSBwcm9taXNlXG4gKiAgICAgPyBUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJuIHRoZSBmdW5jdGlvblxuICogICAgIDogKC4uLmFyZ3M6IFBhcmFtZXRlcnM8VD4pID0+IFByb21pc2U8QXdhaXRlZDxSZXR1cm5UeXBlPFQ+Pj4gIC8vIG1ha2UgaXQgcmV0dXJuIGEgcHJvbWlzZVxuICogKX0gRUNhbGxhYmxlXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge3tcbiAqICAgcmVhZG9ubHkgW1AgaW4ga2V5b2YgVF06IFRbUF0gZXh0ZW5kcyBYaW1wb3J0KCcuL3R5cGVzJykuQ2FsbGFibGVcbiAqICAgICA/IEVDYWxsYWJsZTxUW1BdPlxuICogICAgIDogbmV2ZXI7XG4gKiB9fSBFTWV0aG9kc1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHt7XG4gKiAgIHJlYWRvbmx5IFtQIGluIGtleW9mIFRdOiBUW1BdIGV4dGVuZHMgUHJvbWlzZUxpa2U8aW5mZXIgVT5cbiAqICAgICA/IFRbUF1cbiAqICAgICA6IFByb21pc2U8QXdhaXRlZDxUW1BdPj47XG4gKiB9fSBFR2V0dGVyc1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtYaW1wb3J0KCcuL3R5cGVzJykuQ2FsbGFibGV9IFRcbiAqIEB0eXBlZGVmIHsoLi4uYXJnczogUGFyYW1ldGVyczxUPikgPT4gUHJvbWlzZTx2b2lkPn0gRVNlbmRPbmx5Q2FsbGFibGVcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7e1xuICogICByZWFkb25seSBbUCBpbiBrZXlvZiBUXTogVFtQXSBleHRlbmRzIFhpbXBvcnQoJy4vdHlwZXMnKS5DYWxsYWJsZVxuICogICAgID8gRVNlbmRPbmx5Q2FsbGFibGU8VFtQXT5cbiAqICAgICA6IG5ldmVyO1xuICogfX0gRVNlbmRPbmx5TWV0aG9kc1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHsoXG4gKiAgIFQgZXh0ZW5kcyBYaW1wb3J0KCcuL3R5cGVzJykuQ2FsbGFibGVcbiAqICAgICA/IEVTZW5kT25seUNhbGxhYmxlPFQ+ICYgRVNlbmRPbmx5TWV0aG9kczxSZXF1aXJlZDxUPj5cbiAqICAgICA6IEVTZW5kT25seU1ldGhvZHM8UmVxdWlyZWQ8VD4+XG4gKiApfSBFU2VuZE9ubHlDYWxsYWJsZU9yTWV0aG9kc1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHsoXG4gKiAgIFQgZXh0ZW5kcyBYaW1wb3J0KCcuL3R5cGVzJykuQ2FsbGFibGVcbiAqICAgICA/IEVDYWxsYWJsZTxUPiAmIEVNZXRob2RzPFJlcXVpcmVkPFQ+PlxuICogICAgIDogRU1ldGhvZHM8UmVxdWlyZWQ8VD4+XG4gKiApfSBFQ2FsbGFibGVPck1ldGhvZHNcbiAqL1xuXG4vKipcbiAqIFJldHVybiBhIHVuaW9uIG9mIHByb3BlcnR5IG5hbWVzL3N5bWJvbHMvbnVtYmVycyBQIGZvciB3aGljaCB0aGUgcmVjb3JkIGVsZW1lbnQgVFtQXSdzIHR5cGUgZXh0ZW5kcyBVLlxuICpcbiAqIEdpdmVuIGNvbnN0IHggPSB7IGE6IDEyMywgYjogJ2hlbGxvJywgYzogNDIsIDQ5OiAoKSA9PiB7fSwgNTM6IDY3IH0sXG4gKlxuICogRmlsdGVyZWRLZXlzPHR5cGVvZiB4LCBudW1iZXI+IGlzIHRoZSB0eXBlICdhJyB8ICdjJyB8IDUzLlxuICogRmlsdGVyZWRLZXlzPHR5cGVvZiB4LCBzdHJpbmc+IGlzIHRoZSB0eXBlICdiJy5cbiAqIEZpbHRlcmVkS2V5czx0eXBlb2YgeCwgNDIgfCA2Nz4gaXMgdGhlIHR5cGUgJ2MnIHwgNTMuXG4gKiBGaWx0ZXJlZEtleXM8dHlwZW9mIHgsIGJvb2xlYW4+IGlzIHRoZSB0eXBlIG5ldmVyLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdGVtcGxhdGUgVVxuICogQHR5cGVkZWYge3sgW1AgaW4ga2V5b2YgVF06IFRbUF0gZXh0ZW5kcyBVID8gUCA6IG5ldmVyOyB9W2tleW9mIFRdfSBGaWx0ZXJlZEtleXNcbiAqL1xuXG4vKipcbiAqIGBQaWNrQ2FsbGFibGU8VD5gIG1lYW5zIHRvIHJldHVybiBhIHNpbmdsZSByb290IGNhbGxhYmxlIG9yIGEgcmVjb3JkIHR5cGVcbiAqIGNvbnNpc3Rpbmcgb25seSBvZiBwcm9wZXJ0aWVzIHRoYXQgYXJlIGZ1bmN0aW9ucy5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYgeyhcbiAqICAgVCBleHRlbmRzIFhpbXBvcnQoJy4vdHlwZXMnKS5DYWxsYWJsZVxuICogICAgID8gKC4uLmFyZ3M6IFBhcmFtZXRlcnM8VD4pID0+IFJldHVyblR5cGU8VD4gICAgICAgICAgICAgICAgICAgICAvLyBhIHJvb3QgY2FsbGFibGUsIG5vIG1ldGhvZHNcbiAqICAgICA6IFBpY2s8VCwgRmlsdGVyZWRLZXlzPFQsIFhpbXBvcnQoJy4vdHlwZXMnKS5DYWxsYWJsZT4+ICAgICAgICAgIC8vIGFueSBjYWxsYWJsZSBtZXRob2RzXG4gKiApfSBQaWNrQ2FsbGFibGVcbiAqL1xuXG4vKipcbiAqIGBSZW1vdGVGdW5jdGlvbnM8VD5gIG1lYW5zIHRvIHJldHVybiB0aGUgZnVuY3Rpb25zIGFuZCBwcm9wZXJ0aWVzIHRoYXQgYXJlIHJlbW90ZWx5IGNhbGxhYmxlLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7KFxuICogICBUIGV4dGVuZHMgWGltcG9ydCgnLi90eXBlcycpLlJlbW90YWJsZUJyYW5kPGluZmVyIEwsIGluZmVyIFI+ICAgICAvLyBpZiBhIGdpdmVuIFQgaXMgc29tZSByZW1vdGUgaW50ZXJmYWNlIFJcbiAqICAgICA/IFBpY2tDYWxsYWJsZTxSPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGVuIHJldHVybiB0aGUgY2FsbGFibGUgcHJvcGVydGllcyBvZiBSXG4gKiAgICAgOiBBd2FpdGVkPFQ+IGV4dGVuZHMgWGltcG9ydCgnLi90eXBlcycpLlJlbW90YWJsZUJyYW5kPGluZmVyIEwsIGluZmVyIFI+IC8vIG90aGVyd2lzZSwgaWYgdGhlIGZpbmFsIHJlc29sdXRpb24gb2YgVCBpcyBzb21lIHJlbW90ZSBpbnRlcmZhY2UgUlxuICogICAgID8gUGlja0NhbGxhYmxlPFI+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZW4gcmV0dXJuIHRoZSBjYWxsYWJsZSBwcm9wZXJ0aWVzIG9mIFJcbiAqICAgICA6IFQgZXh0ZW5kcyBQcm9taXNlTGlrZTxpbmZlciBVPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvdGhlcndpc2UsIGlmIFQgaXMgYSBwcm9taXNlXG4gKiAgICAgPyBBd2FpdGVkPFQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlbiByZXR1cm4gcmVzb2x2ZWQgdmFsdWUgVFxuICogICAgIDogVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSwgcmV0dXJuIFRcbiAqICl9IFJlbW90ZUZ1bmN0aW9uc1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHsoXG4gKiAgIFQgZXh0ZW5kcyBYaW1wb3J0KCcuL3R5cGVzJykuUmVtb3RhYmxlQnJhbmQ8aW5mZXIgTCwgaW5mZXIgUj5cbiAqICAgICA/IExcbiAqICAgICA6IEF3YWl0ZWQ8VD4gZXh0ZW5kcyBYaW1wb3J0KCcuL3R5cGVzJykuUmVtb3RhYmxlQnJhbmQ8aW5mZXIgTCwgaW5mZXIgUj5cbiAqICAgICA/IExcbiAqICAgICA6IFQgZXh0ZW5kcyBQcm9taXNlTGlrZTxpbmZlciBVPlxuICogICAgID8gQXdhaXRlZDxUPlxuICogICAgIDogVFxuICogKX0gTG9jYWxSZWNvcmRcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBbUiA9IHVua25vd25dXG4gKiBAdHlwZWRlZiB7e1xuICogICBwcm9taXNlOiBQcm9taXNlPFI+O1xuICogICBzZXR0bGVyOiBYaW1wb3J0KCcuL3R5cGVzJykuU2V0dGxlcjxSPjtcbiAqIH19IEVQcm9taXNlS2l0XG4gKi9cblxuLyoqXG4gKiBUeXBlIGZvciBhbiBvYmplY3QgdGhhdCBtdXN0IG9ubHkgYmUgaW52b2tlZCB3aXRoIEUuICBJdCBzdXBwb3J0cyBhIGdpdmVuXG4gKiBpbnRlcmZhY2UgYnV0IGRlY2xhcmVzIGFsbCB0aGUgZnVuY3Rpb25zIGFzIGFzeW5jYWJsZS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYgeyhcbiAqICAgVCBleHRlbmRzIFhpbXBvcnQoJy4vdHlwZXMnKS5DYWxsYWJsZVxuICogICAgID8gKC4uLmFyZ3M6IFBhcmFtZXRlcnM8VD4pID0+IEVSZWY8QXdhaXRlZDxFT25seTxSZXR1cm5UeXBlPFQ+Pj4+XG4gKiAgICAgOiBUIGV4dGVuZHMgUmVjb3JkPFByb3BlcnR5S2V5LCBYaW1wb3J0KCcuL3R5cGVzJykuQ2FsbGFibGU+XG4gKiAgICAgPyB7XG4gKiAgICAgICAgIFtLIGluIGtleW9mIFRdOiBUW0tdIGV4dGVuZHMgWGltcG9ydCgnLi90eXBlcycpLkNhbGxhYmxlXG4gKiAgICAgICAgICAgPyAoLi4uYXJnczogUGFyYW1ldGVyczxUW0tdPikgPT4gRVJlZjxBd2FpdGVkPEVPbmx5PFJldHVyblR5cGU8VFtLXT4+Pj5cbiAqICAgICAgICAgICA6IFRbS107XG4gKiAgICAgICB9XG4gKiAgICAgOiBUXG4gKiApfSBFT25seVxuICovJGjigI1fb25jZS5kZWZhdWx0KCRj4oCNX2RlZmF1bHQpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRlZmF1bHQiOlsiZGVmYXVsdCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACYGTuzNAEAADQBAAAqAAAAQGVuZG8vZXZlbnR1YWwtc2VuZC12MC4xNy42L3NyYy9leHBvcnRzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAPsYdN1FAgAARQIAACoAAABAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE3LjYvc3JjL25vLXNoaW0uanN7ImltcG9ydHMiOlsiLi9FLmpzIiwiLi9leHBvcnRzLmpzIl0sImV4cG9ydHMiOlsiRSIsIkhhbmRsZWRQcm9taXNlIl0sInJlZXhwb3J0cyI6WyIuL2V4cG9ydHMuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgbWFrZUU7JGjigI1faW1wb3J0cyhbW1wiLi9FLmpzXCIsIFtbXCJkZWZhdWx0XCIsIFskaOKAjV9hID0+IChtYWtlRSA9ICRo4oCNX2EpXV1dXSxbXCIuL2V4cG9ydHMuanNcIiwgW11dXSk7ICAgXG5cbmNvbnN0IGhwPUhhbmRsZWRQcm9taXNlOyRo4oCNX29uY2UuaHAoaHApO1xuY29uc3QgICAgICAgIEU9bWFrZUUoaHApOyRo4oCNX29uY2UuRShFKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJIYW5kbGVkUHJvbWlzZSI6WyJocCJdLCJFIjpbIkUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA6qEddJcQAACXEAAALgAAAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTcuNi9zcmMvdHJhY2stdHVybnMuanN7ImltcG9ydHMiOlsiQGVuZG8vZW52LW9wdGlvbnMiXSwiZXhwb3J0cyI6WyJ0cmFja1R1cm5zIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IG1ha2VFbnZpcm9ubWVudENhcHRvcjskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9lbnYtb3B0aW9uc1wiLCBbW1wibWFrZUVudmlyb25tZW50Q2FwdG9yXCIsIFskaOKAjV9hID0+IChtYWtlRW52aXJvbm1lbnRDYXB0b3IgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5jb25zdHtnZXRFbnZpcm9ubWVudE9wdGlvbn09bWFrZUVudmlyb25tZW50Q2FwdG9yKGdsb2JhbFRoaXMpO1xuXG4vKiBOT1RFOiBXZSBjYW4ndCBpbXBvcnQgdGhlc2UgYmVjYXVzZSB0aGV5J3JlIG5vdCBpbiBzY29wZSBiZWZvcmUgbG9ja2Rvd24uKi9cbi8qIGltcG9ydCB7IGFzc2VydCwgZGV0YWlscyBhcyBYLCBGYWlsIH0gZnJvbSAnQGFnb3JpYy9hc3NlcnQnOyovXG5cbi8qIFdBUk5JTkc6IEdsb2JhbCBNdXRhYmxlIFN0YXRlISovXG4vKiBUaGlzIHN0YXRlIGlzIGNvbW11bmljYXRlZCB0byBgYXNzZXJ0YCB0aGF0IG1ha2VzIGl0IGF2YWlsYWJsZSB0byB0aGUqL1xuLyogY2F1c2FsIGNvbnNvbGUsIHdoaWNoIGFmZmVjdHMgdGhlIGNvbnNvbGUgbG9nIG91dHB1dC4gTm9ybWFsbHkgd2UqL1xuLyogcmVnYXJkIHRoZSBhYmlsaXR5IHRvIHNlZSBjb25zb2xlIGxvZyBvdXRwdXQgYXMgYSBtZXRhLWxldmVsIHByaXZpbGVnZSovXG4vKiBhbmFsb2dvdXMgdG8gdGhlIGFiaWxpdHkgdG8gZGVidWcuIEFzaWRlIGZyb20gdGhhdCwgdGhpcyBtb2R1bGUgc2hvdWxkKi9cbi8qIG5vdCBoYXZlIGFueSBvYnNlcnZhYmx5IG11dGFibGUgc3RhdGUuKi9cblxubGV0IGhpZGRlblByaW9yRXJyb3I7XG5sZXQgaGlkZGVuQ3VycmVudFR1cm49MDtcbmxldCBoaWRkZW5DdXJyZW50RXZlbnQ9MDtcblxuY29uc3QgREVCVUc9Z2V0RW52aXJvbm1lbnRPcHRpb24oJ0RFQlVHJywnJyk7XG5cbi8qIFR1cm4gb24gaWYgeW91IHNlZW0gdG8gYmUgbG9zaW5nIGVycm9yIGxvZ2dpbmcgYXQgdGhlIHRvcCBvZiB0aGUgZXZlbnQgbG9vcCovXG5jb25zdCBWRVJCT1NFPURFQlVHLnNwbGl0KCc6JykuaW5jbHVkZXMoJ3RyYWNrLXR1cm5zJyk7XG5cbi8qIFRyYWNrLXR1cm5zIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQgYW5kIGNhbiBiZSBlbmFibGVkIGJ5IGFuIGVudmlyb25tZW50Ki9cbi8qIG9wdGlvbi4qL1xuY29uc3QgVFJBQ0tfVFVSTlM9Z2V0RW52aXJvbm1lbnRPcHRpb24oJ1RSQUNLX1RVUk5TJywnZGlzYWJsZWQnKTtcbmlmKFRSQUNLX1RVUk5TIT09J2VuYWJsZWQnJiZUUkFDS19UVVJOUyE9PSdkaXNhYmxlZCcpe1xudGhyb3cgVHlwZUVycm9yKCBgdW5yZWNvZ25pemVkIFRSQUNLX1RVUk5TICR7SlNPTi5zdHJpbmdpZnkoVFJBQ0tfVFVSTlMpfWApO1xuIH1cbmNvbnN0IEVOQUJMRUQ9KFRSQUNLX1RVUk5TfHwnZGlzYWJsZWQnKT09PSdlbmFibGVkJztcblxuLyogV2UgaG9pc3QgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgb3V0IG9mIHRyYWNrVHVybnMoKSB0byBkaXNjb3VyYWdlIHRoZSovXG4vKiBjbG9zdXJlcyBmcm9tIGhvbGRpbmcgb250byAnYXJncycgb3IgJ2Z1bmMnIGxvbmdlciB0aGFuIG5lY2Vzc2FyeSwqL1xuLyogd2hpY2ggd2UndmUgc2VlbiBjYXVzZSBIYW5kbGVkUHJvbWlzZSBhcmd1bWVudHMgdG8gYmUgcmV0YWluZWQgZm9yKi9cbi8qIGEgc3VycHJpc2luZ2x5IGxvbmcgdGltZS4qL1xuXG5jb25zdCBhZGRSZWplY3Rpb25Ob3RlPShkZXRhaWxzTm90ZSk9PihyZWFzb24pPT57XG5pZihyZWFzb24gaW5zdGFuY2VvZiBFcnJvcil7XG5hc3NlcnQubm90ZShyZWFzb24sZGV0YWlsc05vdGUpO1xuIH1cbmlmKFZFUkJPU0Upe1xuY29uc29sZS5sb2coJ1JFSkVDVEVEIGF0IHRvcCBvZiBldmVudCBsb29wJyxyZWFzb24pO1xuIH1cbiB9O1xuXG5jb25zdCB3cmFwRnVuY3Rpb249XG4oZnVuYyxzZW5kaW5nRXJyb3IsWCk9PlxuKC4uLmFyZ3MpPT57XG5oaWRkZW5QcmlvckVycm9yPXNlbmRpbmdFcnJvcjtcbmhpZGRlbkN1cnJlbnRUdXJuKz0xO1xuaGlkZGVuQ3VycmVudEV2ZW50PTA7XG50cnl7XG5sZXQgcmVzdWx0O1xudHJ5e1xucmVzdWx0PWZ1bmMoLi4uYXJncyk7XG4gfWNhdGNoKGVycil7XG5pZihlcnIgaW5zdGFuY2VvZiBFcnJvcil7XG5hc3NlcnQubm90ZShcbmVycixcblggYFRocm93biBmcm9tOiAke2hpZGRlblByaW9yRXJyb3J9OiR7aGlkZGVuQ3VycmVudFR1cm59LiR7aGlkZGVuQ3VycmVudEV2ZW50fWApO1xuXG4gfVxuaWYoVkVSQk9TRSl7XG5jb25zb2xlLmxvZygnVEhST1dOIHRvIHRvcCBvZiBldmVudCBsb29wJyxlcnIpO1xuIH1cbnRocm93IGVycjtcbiB9XG4vKiBNdXN0IGNhcHR1cmUgdGhpcyBub3csIG5vdCB3aGVuIHRoZSBjYXRjaCB0cmlnZ2Vycy4qL1xuY29uc3QgZGV0YWlsc05vdGU9WCBgUmVqZWN0aW9uIGZyb206ICR7aGlkZGVuUHJpb3JFcnJvcn06JHtoaWRkZW5DdXJyZW50VHVybn0uJHtoaWRkZW5DdXJyZW50RXZlbnR9YDtcblByb21pc2UucmVzb2x2ZShyZXN1bHQpLmNhdGNoKGFkZFJlamVjdGlvbk5vdGUoZGV0YWlsc05vdGUpKTtcbnJldHVybiByZXN1bHQ7XG4gfWZpbmFsbHl7XG5oaWRkZW5QcmlvckVycm9yPXVuZGVmaW5lZDtcbiB9XG4gfTtcblxuLyoqXG4gKiBHaXZlbiBhIGxpc3Qgb2YgYFR1cm5TdGFydGVyRm5gcywgcmV0dXJucyBhIGxpc3Qgb2YgYFR1cm5TdGFydGVyRm5gcyB3aG9zZVxuICogYHRoaXNgLWZyZWUgY2FsbCBiZWhhdmlvcnMgYXJlIG5vdCBvYnNlcnZhYmx5IGRpZmZlcmVudCB0byB0aG9zZSB0aGF0XG4gKiBjYW5ub3Qgc2VlIGNvbnNvbGUgb3V0cHV0LiBUaGUgb25seSBwdXJwb3NlIGlzIHRvIGNhdXNlIGFkZGl0aW9uYWxcbiAqIGluZm9ybWF0aW9uIHRvIGFwcGVhciBvbiB0aGUgY29uc29sZS5cbiAqXG4gKiBUaGUgY2FsbCB0byBgdHJhY2tUdXJuc2AgaXMgaXRzZWxmIGEgc2VuZGluZyBldmVudCwgdGhhdCBvY2N1cnMgaW4gc29tZSBjYWxsXG4gKiBzdGFjayBpbiBzb21lIHR1cm4gbnVtYmVyIGF0IHNvbWUgZXZlbnQgbnVtYmVyIHdpdGhpbiB0aGF0IHR1cm4uIEVhY2ggY2FsbFxuICogdG8gYW55IG9mIHRoZSByZXR1cm5lZCBgVHVyblN0YXJ0Rm5gcyBpcyBhIHJlY2VpdmluZyBldmVudCB0aGF0IGJlZ2lucyBhIG5ld1xuICogdHVybi4gVGhpcyBzZW5kaW5nIGV2ZW50IGNhdXNlZCBlYWNoIG9mIHRob3NlIHJlY2VpdmluZyBldmVudHMuXG4gKlxuICogQHRlbXBsYXRlIHtUdXJuU3RhcnRlckZuW119IFRcbiAqIEBwYXJhbSB7VH0gZnVuY3NcbiAqIEByZXR1cm5zIHtUfVxuICovXG5jb25zdCAgICAgICAgdHJhY2tUdXJucz0oZnVuY3MpPT57XG5pZighRU5BQkxFRHx8dHlwZW9mIGdsb2JhbFRoaXM9PT0ndW5kZWZpbmVkJ3x8IWdsb2JhbFRoaXMuYXNzZXJ0KXtcbnJldHVybiBmdW5jcztcbiB9XG5jb25zdHtkZXRhaWxzOlh9PWFzc2VydDtcblxuaGlkZGVuQ3VycmVudEV2ZW50Kz0xO1xuY29uc3Qgc2VuZGluZ0Vycm9yPUVycm9yKFxuIGBFdmVudDogJHtoaWRkZW5DdXJyZW50VHVybn0uJHtoaWRkZW5DdXJyZW50RXZlbnR9YCk7XG5cbmlmKGhpZGRlblByaW9yRXJyb3IhPT11bmRlZmluZWQpe1xuYXNzZXJ0Lm5vdGUoc2VuZGluZ0Vycm9yLFggYENhdXNlZCBieTogJHtoaWRkZW5QcmlvckVycm9yfWApO1xuIH1cblxucmV0dXJuICgvKiogQHR5cGUge1R9ICovXG5mdW5jcy5tYXAoKGZ1bmMpPT5mdW5jJiZ3cmFwRnVuY3Rpb24oZnVuYyxzZW5kaW5nRXJyb3IsWCkpKTtcblxuIH07XG5cbi8qKlxuICogQW4gb3B0aW9uYWwgZnVuY3Rpb24gdGhhdCBpcyBub3QgdGhpcy1zZW5zaXRpdmUsIGV4cGVjdGVkIHRvIGJlIGNhbGxlZCBhdFxuICogYm90dG9tIG9mIHN0YWNrIHRvIHN0YXJ0IGEgbmV3IHR1cm4uXG4gKlxuICogQHR5cGVkZWYgeygoLi4uYXJnczogYW55W10pID0+IGFueSkgfCB1bmRlZmluZWR9IFR1cm5TdGFydGVyRm5cbiAqLyRo4oCNX29uY2UudHJhY2tUdXJucyh0cmFja1R1cm5zKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJ0cmFja1R1cm5zIjpbInRyYWNrVHVybnMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAgy+jvpgCAACYAgAAGQAAAEBlbmRvL2V4by12MC4yLjYvaW5kZXguanN7ImltcG9ydHMiOlsiLi9zcmMvZXhvLW1ha2Vycy5qcyIsIi4vc3JjL2V4by10b29scy5qcyJdLCJleHBvcnRzIjpbImRlZmluZUV4b0NsYXNzIiwiZGVmaW5lRXhvQ2xhc3MiLG51bGxdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIi4vc3JjL2V4by1tYWtlcnMuanNcIiwgW11dLFtcIi4vc3JjL2V4by10b29scy5qc1wiLCBbXV1dKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyIuL3NyYy9leG8tbWFrZXJzLmpzIjpbWyJpbml0RW1wdHkiLCJpbml0RW1wdHkiXSxbImRlZmluZUV4b0NsYXNzIiwiZGVmaW5lRXhvQ2xhc3MiXSxbImRlZmluZUV4b0NsYXNzS2l0IiwiZGVmaW5lRXhvQ2xhc3NLaXQiXSxbIm1ha2VFeG8iLCJtYWtlRXhvIl1dLCIuL3NyYy9leG8tdG9vbHMuanMiOltbIkdFVF9JTlRFUkZBQ0VfR1VBUkQiLCJHRVRfSU5URVJGQUNFX0dVQVJEIl1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAD9tioGaRwAAGkcAAAiAAAAQGVuZG8vZXhvLXYwLjIuNi9zcmMvZXhvLW1ha2Vycy5qc3siaW1wb3J0cyI6WyJAZW5kby9lbnYtb3B0aW9ucyIsIkBlbmRvL3BhdHRlcm5zIiwiLi9leG8tdG9vbHMuanMiXSwiZXhwb3J0cyI6WyJkZWZpbmVFeG9DbGFzcyIsImRlZmluZUV4b0NsYXNzS2l0IiwiaW5pdEVtcHR5IiwibWFrZUV4byJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBtYWtlRW52aXJvbm1lbnRDYXB0b3Isb2JqZWN0TWFwLGRlZmVuZFByb3RvdHlwZSxkZWZlbmRQcm90b3R5cGVLaXQ7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vZW52LW9wdGlvbnNcIiwgW1tcIm1ha2VFbnZpcm9ubWVudENhcHRvclwiLCBbJGjigI1fYSA9PiAobWFrZUVudmlyb25tZW50Q2FwdG9yID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJvYmplY3RNYXBcIiwgWyRo4oCNX2EgPT4gKG9iamVjdE1hcCA9ICRo4oCNX2EpXV1dXSxbXCIuL2V4by10b29scy5qc1wiLCBbW1wiZGVmZW5kUHJvdG90eXBlXCIsIFskaOKAjV9hID0+IChkZWZlbmRQcm90b3R5cGUgPSAkaOKAjV9hKV1dLFtcImRlZmVuZFByb3RvdHlwZUtpdFwiLCBbJGjigI1fYSA9PiAoZGVmZW5kUHJvdG90eXBlS2l0ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5jb25zdHtjcmVhdGUsc2VhbCxmcmVlemUsZGVmaW5lUHJvcGVydHksdmFsdWVzfT1PYmplY3Q7XG5cbmNvbnN0e2dldEVudmlyb25tZW50T3B0aW9ufT1tYWtlRW52aXJvbm1lbnRDYXB0b3IoZ2xvYmFsVGhpcyk7XG5jb25zdCBERUJVRz1nZXRFbnZpcm9ubWVudE9wdGlvbignREVCVUcnLCcnKTtcblxuLyogVHVybiBvbiB0byBnaXZlIGVhY2ggZXhvIGluc3RhbmNlIGl0cyBvd24gdG9TdHJpbmdUYWcgdmFsdWUuKi9cbmNvbnN0IExBQkVMX0lOU1RBTkNFUz1ERUJVRy5zcGxpdCgnLCcpLmluY2x1ZGVzKCdsYWJlbC1pbnN0YW5jZXMnKTtcblxuY29uc3QgbWFrZVNlbGY9KHByb3RvLGluc3RhbmNlQ291bnQpPT57XG5jb25zdCBzZWxmPWNyZWF0ZShwcm90byk7XG5pZihMQUJFTF9JTlNUQU5DRVMpe1xuZGVmaW5lUHJvcGVydHkoc2VsZixTeW1ib2wudG9TdHJpbmdUYWcse1xudmFsdWU6IGAke3Byb3RvW1N5bWJvbC50b1N0cmluZ1RhZ119IyR7aW5zdGFuY2VDb3VudH1gLFxud3JpdGFibGU6ZmFsc2UsXG5lbnVtZXJhYmxlOmZhbHNlLFxuY29uZmlndXJhYmxlOmZhbHNlfSk7XG5cbiB9XG5yZXR1cm4gaGFyZGVuKHNlbGYpO1xuIH07XG5cbmNvbnN0IGVtcHR5UmVjb3JkPWhhcmRlbih7fSk7XG5cbi8qKlxuICogV2hlbiBjYWxsaW5nIGBkZWZpbmVEdXJhYmxlS2luZGAgYW5kXG4gKiBpdHMgc2libGluZ3MsIHVzZWQgYXMgdGhlIGBpbml0YCBmdW5jdGlvbiBhcmd1bWVudCB0byBpbmRpY2F0ZSB0aGF0IHRoZVxuICogc3RhdGUgcmVjb3JkIG9mIHRoZSAodmlydHVhbC9kdXJhYmxlKSBpbnN0YW5jZXMgb2YgdGhlIGtpbmQvZXhvQ2xhc3NcbiAqIHNob3VsZCBiZSBlbXB0eSwgYW5kIHRoYXQgdGhlIHJldHVybmVkIG1ha2VyIGZ1bmN0aW9uIHNob3VsZCBoYXZlIHplcm9cbiAqIHBhcmFtZXRlcnMuXG4gKlxuICogQHJldHVybnMge3t9fVxuICovXG5jb25zdCAgICAgICAgaW5pdEVtcHR5PSgpPT5lbXB0eVJlY29yZDtcblxuLyoqXG4gKiBAdHlwZWRlZiB7WGltcG9ydCgnLi9leG8tdG9vbHMuanMnKS5GYWNldE5hbWV9IEZhY2V0TmFtZVxuICogQHR5cGVkZWYge1hpbXBvcnQoJy4vZXhvLXRvb2xzLmpzJykuTWV0aG9kc30gTWV0aG9kc1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFtTID0gYW55XVxuICogQHRlbXBsYXRlIHtNZXRob2RzfSBbTSA9IGFueV1cbiAqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL2V4by10b29scy5qcycpLkNsYXNzQ29udGV4dH0gQ2xhc3NDb250ZXh0XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgW1MgPSBhbnldXG4gKiBAdGVtcGxhdGUge1JlY29yZDxGYWNldE5hbWUsIE1ldGhvZHM+fSBbRiA9IGFueV1cbiAqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL2V4by10b29scy5qcycpLktpdENvbnRleHR9IEtpdENvbnRleHRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHt7W25hbWU6IHN0cmluZ106IFhpbXBvcnQoJ0BlbmRvL3BhdHRlcm5zJykuUGF0dGVybn19IFN0YXRlU2hhcGVcbiAqIEl0IGxvb2tzIGxpa2UgYSBjb3B5UmVjb3JkIHBhdHRlcm4sIGJ1dCB0aGUgaW50ZXJwcmV0YXRpb24gaXMgZGlmZmVyZW50LlxuICogRWFjaCBwcm9wZXJ0eSBpcyBkaXN0aW5jdCwgaXMgY2hlY2tlZCBhbmQgY2hhbmdlZCBzZXBhcmF0ZWx5LlxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFJldm9rZXJcbiAqIEBwYXJhbSB7YW55fSBleG9cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFJlY2VpdmVSZXZva2VyXG4gKiBAcGFyYW0ge1Jldm9rZXJ9IHJldm9rZVxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgQ1xuICogQHR5cGVkZWYge29iamVjdH0gRmFyQ2xhc3NPcHRpb25zXG4gKiBAcHJvcGVydHkgeyhjb250ZXh0OiBDKSA9PiB2b2lkfSBbZmluaXNoXVxuICogQHByb3BlcnR5IHtTdGF0ZVNoYXBlfSBbc3RhdGVTaGFwZV1cbiAqIEBwcm9wZXJ0eSB7UmVjZWl2ZVJldm9rZXJ9IFtyZWNlaXZlUmV2b2tlcl1cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7KC4uLmFyZ3M6IGFueVtdKSA9PiBhbnl9IEkgaW5pdCBmdW5jdGlvblxuICogQHRlbXBsYXRlIHtNZXRob2RzfSBNIG1ldGhvZHNcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAqIEBwYXJhbSB7WGltcG9ydCgnQGVuZG8vcGF0dGVybnMnKS5JbnRlcmZhY2VHdWFyZDx7XG4gKiAgIFtLIGluIGtleW9mIE1dOiBYaW1wb3J0KFwiQGVuZG8vcGF0dGVybnNcIikuTWV0aG9kR3VhcmRcbiAqIH0+IHwgdW5kZWZpbmVkfSBpbnRlcmZhY2VHdWFyZFxuICogQHBhcmFtIHtJfSBpbml0XG4gKiBAcGFyYW0ge00gJiBUaGlzVHlwZTx7IHNlbGY6IE0sIHN0YXRlOiBSZXR1cm5UeXBlPEk+IH0+fSBtZXRob2RzXG4gKiBAcGFyYW0ge0ZhckNsYXNzT3B0aW9uczxDbGFzc0NvbnRleHQ8UmV0dXJuVHlwZTxJPiwgTT4+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHsoLi4uYXJnczogUGFyYW1ldGVyczxJPikgPT4gKE0gJiBYaW1wb3J0KCdAZW5kby9ldmVudHVhbC1zZW5kJykuUmVtb3RhYmxlQnJhbmQ8e30sIE0+KX1cbiAqLyRo4oCNX29uY2UuaW5pdEVtcHR5KGluaXRFbXB0eSk7XG5jb25zdCAgICAgICAgZGVmaW5lRXhvQ2xhc3M9KFxudGFnLFxuaW50ZXJmYWNlR3VhcmQsXG5pbml0LFxubWV0aG9kcyxcbm9wdGlvbnM9e30pPT5cbntcbmhhcmRlbihtZXRob2RzKTtcbmNvbnN0e2ZpbmlzaD11bmRlZmluZWQscmVjZWl2ZVJldm9rZXI9dW5kZWZpbmVkfT1vcHRpb25zO1xuLyoqIEB0eXBlIHtXZWFrTWFwPE0sQ2xhc3NDb250ZXh0PFJldHVyblR5cGU8ST4sIE0+Pn0gKi9cbmNvbnN0IGNvbnRleHRNYXA9bmV3IFdlYWtNYXAoKTtcbmNvbnN0IHByb3RvPWRlZmVuZFByb3RvdHlwZShcbnRhZyxcbihzZWxmKT0+LyoqIEB0eXBlIHthbnl9ICovY29udGV4dE1hcC5nZXQoc2VsZiksXG5tZXRob2RzLFxudHJ1ZSxcbmludGVyZmFjZUd1YXJkKTtcblxubGV0IGluc3RhbmNlQ291bnQ9MDtcbi8qKlxuICogQHBhcmFtICB7UGFyYW1ldGVyczxJPn0gYXJnc1xuICovXG5jb25zdCBtYWtlSW5zdGFuY2U9KC4uLmFyZ3MpPT57XG4vKiBCZSBjYXJlZnVsIG5vdCB0byBmcmVlemUgdGhlIHN0YXRlIHJlY29yZCovXG5jb25zdCBzdGF0ZT1zZWFsKGluaXQoLi4uYXJncykpO1xuaW5zdGFuY2VDb3VudCs9MTtcbi8qKiBAdHlwZSB7TX0gKi9cbmNvbnN0IHNlbGY9bWFrZVNlbGYocHJvdG8saW5zdGFuY2VDb3VudCk7XG5cbi8qIEJlIGNhcmVmdWwgbm90IHRvIGZyZWV6ZSB0aGUgc3RhdGUgcmVjb3JkKi9cbi8qKiBAdHlwZSB7Q2xhc3NDb250ZXh0PFJldHVyblR5cGU8ST4sTT59ICovXG5jb25zdCBjb250ZXh0PWZyZWV6ZSh7c3RhdGUsc2VsZn0pO1xuY29udGV4dE1hcC5zZXQoc2VsZixjb250ZXh0KTtcbmlmKGZpbmlzaCl7XG5maW5pc2goY29udGV4dCk7XG4gfVxucmV0dXJuICgvKiogQHR5cGUge00gJiBYaW1wb3J0KCdAZW5kby9ldmVudHVhbC1zZW5kJykuUmVtb3RhYmxlQnJhbmQ8e30sIE0+fSAqL1xuc2VsZik7XG5cbiB9O1xuXG5pZihyZWNlaXZlUmV2b2tlcil7XG5jb25zdCByZXZva2U9KHNlbGYpPT5jb250ZXh0TWFwLmRlbGV0ZShzZWxmKTtcbmhhcmRlbihyZXZva2UpO1xucmVjZWl2ZVJldm9rZXIocmV2b2tlKTtcbiB9XG5cbnJldHVybiBoYXJkZW4obWFrZUluc3RhbmNlKTtcbiB9OyRo4oCNX29uY2UuZGVmaW5lRXhvQ2xhc3MoZGVmaW5lRXhvQ2xhc3MpO1xuaGFyZGVuKGRlZmluZUV4b0NsYXNzKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgeyguLi5hcmdzOiBhbnlbXSkgPT4gYW55fSBJIGluaXQgZnVuY3Rpb25cbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPEZhY2V0TmFtZSwgTWV0aG9kcz59IEYgZmFjZXQgbWV0aG9kc1xuICogQHBhcmFtIHtzdHJpbmd9IHRhZ1xuICogQHBhcmFtIHt7IFtLIGluIGtleW9mIEZdOiBYaW1wb3J0KFwiQGVuZG8vcGF0dGVybnNcIikuSW50ZXJmYWNlR3VhcmQ8e1xuICogICBbTSBpbiBrZXlvZiBGW0tdXTogWGltcG9ydChcIkBlbmRvL3BhdHRlcm5zXCIpLk1ldGhvZEd1YXJkO1xuICogfT4gfSB8IHVuZGVmaW5lZH0gaW50ZXJmYWNlR3VhcmRLaXRcbiAqIEBwYXJhbSB7SX0gaW5pdFxuICogQHBhcmFtIHtGICYgVGhpc1R5cGU8eyBmYWNldHM6IEYsIHN0YXRlOiBSZXR1cm5UeXBlPEk+IH0+IH0gbWV0aG9kc0tpdFxuICogQHBhcmFtIHtGYXJDbGFzc09wdGlvbnM8S2l0Q29udGV4dDxSZXR1cm5UeXBlPEk+LEY+Pn0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7KC4uLmFyZ3M6IFBhcmFtZXRlcnM8ST4pID0+IEZ9XG4gKi9cbmNvbnN0ICAgICAgICBkZWZpbmVFeG9DbGFzc0tpdD0oXG50YWcsXG5pbnRlcmZhY2VHdWFyZEtpdCxcbmluaXQsXG5tZXRob2RzS2l0LFxub3B0aW9ucz17fSk9Plxue1xuaGFyZGVuKG1ldGhvZHNLaXQpO1xuY29uc3R7ZmluaXNoPXVuZGVmaW5lZCxyZWNlaXZlUmV2b2tlcj11bmRlZmluZWR9PW9wdGlvbnM7XG5jb25zdCBjb250ZXh0TWFwS2l0PW9iamVjdE1hcChtZXRob2RzS2l0LCgpPT5uZXcgV2Vha01hcCgpKTtcbmNvbnN0IGdldENvbnRleHRLaXQ9b2JqZWN0TWFwKFxuY29udGV4dE1hcEtpdCxcbihjb250ZXh0TWFwKT0+KGZhY2V0KT0+Y29udGV4dE1hcC5nZXQoZmFjZXQpKTtcblxuY29uc3QgcHJvdG90eXBlS2l0PWRlZmVuZFByb3RvdHlwZUtpdChcbnRhZyxcbmdldENvbnRleHRLaXQsXG5tZXRob2RzS2l0LFxudHJ1ZSxcbmludGVyZmFjZUd1YXJkS2l0KTtcblxubGV0IGluc3RhbmNlQ291bnQ9MDtcbi8qKlxuICogQHBhcmFtIHtQYXJhbWV0ZXJzPEk+fSBhcmdzXG4gKi9cbmNvbnN0IG1ha2VJbnN0YW5jZUtpdD0oLi4uYXJncyk9Pntcbi8qIEJlIGNhcmVmdWwgbm90IHRvIGZyZWV6ZSB0aGUgc3RhdGUgcmVjb3JkKi9cbmNvbnN0IHN0YXRlPXNlYWwoaW5pdCguLi5hcmdzKSk7XG4vKiBEb24ndCBmcmVlemUgY29udGV4dCB1bnRpbCB3ZSBhZGQgZmFjZXRzKi9cbi8qKiBAdHlwZSB7S2l0Q29udGV4dDxSZXR1cm5UeXBlPEk+LEY+fSAqL1xuY29uc3QgY29udGV4dD17c3RhdGUsZmFjZXRzOnt9fTtcbmluc3RhbmNlQ291bnQrPTE7XG5jb25zdCBmYWNldHM9b2JqZWN0TWFwKHByb3RvdHlwZUtpdCwocHJvdG8sZmFjZXROYW1lKT0+e1xuY29uc3Qgc2VsZj1tYWtlU2VsZihwcm90byxpbnN0YW5jZUNvdW50KTtcbmNvbnRleHRNYXBLaXRbZmFjZXROYW1lXS5zZXQoc2VsZixjb250ZXh0KTtcbnJldHVybiBzZWxmO1xuIH0pO1xuY29udGV4dC5mYWNldHM9ZmFjZXRzO1xuLyogQmUgY2FyZWZ1bCBub3QgdG8gZnJlZXplIHRoZSBzdGF0ZSByZWNvcmQqL1xuZnJlZXplKGNvbnRleHQpO1xuaWYoZmluaXNoKXtcbmZpbmlzaChjb250ZXh0KTtcbiB9XG5yZXR1cm4gY29udGV4dC5mYWNldHM7XG4gfTtcblxuaWYocmVjZWl2ZVJldm9rZXIpe1xuY29uc3QgcmV2b2tlPShhRmFjZXQpPT5cbnZhbHVlcyhjb250ZXh0TWFwS2l0KS5zb21lKChjb250ZXh0TWFwKT0+Y29udGV4dE1hcC5kZWxldGUoYUZhY2V0KSk7XG5oYXJkZW4ocmV2b2tlKTtcbnJlY2VpdmVSZXZva2VyKHJldm9rZSk7XG4gfVxuXG5yZXR1cm4gaGFyZGVuKG1ha2VJbnN0YW5jZUtpdCk7XG4gfTskaOKAjV9vbmNlLmRlZmluZUV4b0NsYXNzS2l0KGRlZmluZUV4b0NsYXNzS2l0KTtcbmhhcmRlbihkZWZpbmVFeG9DbGFzc0tpdCk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtNZXRob2RzfSBUXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnXG4gKiBAcGFyYW0ge1hpbXBvcnQoJ0BlbmRvL3BhdHRlcm5zJykuSW50ZXJmYWNlR3VhcmQ8e1xuICogICBbTSBpbiBrZXlvZiBUXTogWGltcG9ydCgnQGVuZG8vcGF0dGVybnMnKS5NZXRob2RHdWFyZFxuICogfT4gfCB1bmRlZmluZWR9IGludGVyZmFjZUd1YXJkIENBVkVBVDogc3RhdGljIHR5cGluZyBkb2VzIG5vdCB5ZXQgc3VwcG9ydCBgY2FsbFdoZW5gIHRyYW5zZm9ybWF0aW9uXG4gKiBAcGFyYW0ge1R9IG1ldGhvZHNcbiAqIEBwYXJhbSB7RmFyQ2xhc3NPcHRpb25zPENsYXNzQ29udGV4dDx7fSxUPj59IFtvcHRpb25zXVxuICogQHJldHVybnMge1QgJiBYaW1wb3J0KCdAZW5kby9ldmVudHVhbC1zZW5kJykuUmVtb3RhYmxlQnJhbmQ8e30sIFQ+fVxuICovXG5jb25zdCAgICAgICAgbWFrZUV4bz0odGFnLGludGVyZmFjZUd1YXJkLG1ldGhvZHMsb3B0aW9ucz11bmRlZmluZWQpPT57XG5jb25zdCBtYWtlSW5zdGFuY2U9ZGVmaW5lRXhvQ2xhc3MoXG50YWcsXG5pbnRlcmZhY2VHdWFyZCxcbmluaXRFbXB0eSxcbm1ldGhvZHMsXG5vcHRpb25zKTtcblxucmV0dXJuIG1ha2VJbnN0YW5jZSgpO1xuIH07JGjigI1fb25jZS5tYWtlRXhvKG1ha2VFeG8pO1xuaGFyZGVuKG1ha2VFeG8pO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImluaXRFbXB0eSI6WyJpbml0RW1wdHkiXSwiZGVmaW5lRXhvQ2xhc3MiOlsiZGVmaW5lRXhvQ2xhc3MiXSwiZGVmaW5lRXhvQ2xhc3NLaXQiOlsiZGVmaW5lRXhvQ2xhc3NLaXQiXSwibWFrZUV4byI6WyJtYWtlRXhvIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAOEjzgfyLgAA8i4AACEAAABAZW5kby9leG8tdjAuMi42L3NyYy9leG8tdG9vbHMuanN7ImltcG9ydHMiOlsiQGVuZG8vZmFyIiwiQGVuZG8vcGFzcy1zdHlsZSIsIkBlbmRvL3BhdHRlcm5zIl0sImV4cG9ydHMiOlsiR0VUX0lOVEVSRkFDRV9HVUFSRCIsImRlZmVuZFByb3RvdHlwZSIsImRlZmVuZFByb3RvdHlwZUtpdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBFLEZhcixoYXNPd25Qcm9wZXJ0eU9mLGxpc3REaWZmZXJlbmNlLG9iamVjdE1hcCxtdXN0TWF0Y2gsTSxpc0F3YWl0QXJnR3VhcmQsZ2V0QXdhaXRBcmdHdWFyZFBheWxvYWQsZ2V0TWV0aG9kR3VhcmRQYXlsb2FkLGdldEludGVyZmFjZUd1YXJkUGF5bG9hZCxnZXRDb3B5TWFwRW50cmllczskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9mYXJcIiwgW1tcIkVcIiwgWyRo4oCNX2EgPT4gKEUgPSAkaOKAjV9hKV1dLFtcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcImhhc093blByb3BlcnR5T2ZcIiwgWyRo4oCNX2EgPT4gKGhhc093blByb3BlcnR5T2YgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vcGF0dGVybnNcIiwgW1tcImxpc3REaWZmZXJlbmNlXCIsIFskaOKAjV9hID0+IChsaXN0RGlmZmVyZW5jZSA9ICRo4oCNX2EpXV0sW1wib2JqZWN0TWFwXCIsIFskaOKAjV9hID0+IChvYmplY3RNYXAgPSAkaOKAjV9hKV1dLFtcIm11c3RNYXRjaFwiLCBbJGjigI1fYSA9PiAobXVzdE1hdGNoID0gJGjigI1fYSldXSxbXCJNXCIsIFskaOKAjV9hID0+IChNID0gJGjigI1fYSldXSxbXCJpc0F3YWl0QXJnR3VhcmRcIiwgWyRo4oCNX2EgPT4gKGlzQXdhaXRBcmdHdWFyZCA9ICRo4oCNX2EpXV0sW1wiZ2V0QXdhaXRBcmdHdWFyZFBheWxvYWRcIiwgWyRo4oCNX2EgPT4gKGdldEF3YWl0QXJnR3VhcmRQYXlsb2FkID0gJGjigI1fYSldXSxbXCJnZXRNZXRob2RHdWFyZFBheWxvYWRcIiwgWyRo4oCNX2EgPT4gKGdldE1ldGhvZEd1YXJkUGF5bG9hZCA9ICRo4oCNX2EpXV0sW1wiZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkXCIsIFskaOKAjV9hID0+IChnZXRJbnRlcmZhY2VHdWFyZFBheWxvYWQgPSAkaOKAjV9hKV1dLFtcImdldENvcHlNYXBFbnRyaWVzXCIsIFskaOKAjV9hID0+IChnZXRDb3B5TWFwRW50cmllcyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL3BhdHRlcm5zJykuTWV0aG9kfSBNZXRob2QgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vcGF0dGVybnMnKS5NZXRob2RHdWFyZH0gTWV0aG9kR3VhcmQgKi9cbi8qKlxuICogQHRlbXBsYXRlIHtSZWNvcmQ8UHJvcGVydHlLZXksIE1ldGhvZEd1YXJkPn0gW1Q9UmVjb3JkPFByb3BlcnR5S2V5LCBNZXRob2RHdWFyZD5dXG4gKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vcGF0dGVybnMnKS5JbnRlcmZhY2VHdWFyZDxUPn0gSW50ZXJmYWNlR3VhcmRcbiAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9wYXR0ZXJucycpLkludGVyZmFjZUd1YXJkS2l0fSBJbnRlcmZhY2VHdWFyZEtpdCAqL1xuXG5jb25zdHtxdW90ZTpxLEZhaWx9PWFzc2VydDtcbmNvbnN0e2FwcGx5LG93bktleXN9PVJlZmxlY3Q7XG5jb25zdHtkZWZpbmVQcm9wZXJ0aWVzLGZyb21FbnRyaWVzfT1PYmplY3Q7XG5cbi8qKlxuICogQSBtZXRob2QgZ3VhcmQsIGZvciBpbmNsdXNpb24gaW4gYW4gaW50ZXJmYWNlIGd1YXJkLCB0aGF0IGVuZm9yY2VzIG9ubHkgdGhhdFxuICogYWxsIGFyZ3VtZW50cyBhcmUgcGFzc2FibGUgYW5kIHRoYXQgdGhlIHJlc3VsdCBpcyBwYXNzYWJsZS4gKEluIGZhciBjbGFzc2VzLFxuICogXCJhbnlcIiBtZWFucyBhbnkgKnBhc3NhYmxlKi4pIFRoaXMgaXMgdGhlIGxlYXN0IHBvc3NpYmxlIGVuZm9yY2VtZW50IGZvciBhXG4gKiBtZXRob2QgZ3VhcmQsIGFuZCBpcyBpbXBsaWVkIGJ5IGFsbCBvdGhlciBtZXRob2QgZ3VhcmRzLlxuICovXG5jb25zdCBNaW5NZXRob2RHdWFyZD1NLmNhbGwoKS5yZXN0KE0uYW55KCkpLnJldHVybnMoTS5hbnkoKSk7XG5cbmNvbnN0IGRlZmVuZFN5bmNBcmdzPShhcmdzLG1ldGhvZEd1YXJkUGF5bG9hZCxsYWJlbCk9PntcbmNvbnN0e2FyZ0d1YXJkcyxvcHRpb25hbEFyZ0d1YXJkcyxyZXN0QXJnR3VhcmR9PW1ldGhvZEd1YXJkUGF5bG9hZDtcbmNvbnN0IHBhcmFtc1BhdHRlcm49TS5zcGxpdEFycmF5KFxuYXJnR3VhcmRzLFxub3B0aW9uYWxBcmdHdWFyZHMsXG5yZXN0QXJnR3VhcmQpO1xuXG5tdXN0TWF0Y2goaGFyZGVuKGFyZ3MpLHBhcmFtc1BhdHRlcm4sbGFiZWwpO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtNZXRob2R9IG1ldGhvZFxuICogQHBhcmFtIHtNZXRob2RHdWFyZFBheWxvYWR9IG1ldGhvZEd1YXJkUGF5bG9hZFxuICogQHBhcmFtIHtzdHJpbmd9IGxhYmVsXG4gKiBAcmV0dXJucyB7TWV0aG9kfVxuICovXG5jb25zdCBkZWZlbmRTeW5jTWV0aG9kPShtZXRob2QsbWV0aG9kR3VhcmRQYXlsb2FkLGxhYmVsKT0+e1xuY29uc3R7cmV0dXJuR3VhcmR9PW1ldGhvZEd1YXJkUGF5bG9hZDtcbmNvbnN0e3N5bmNNZXRob2R9PXtcbi8qIE5vdGUgcHVycG9zZWZ1bCB1c2Ugb2YgYHRoaXNgIGFuZCBjb25jaXNlIG1ldGhvZCBzeW50YXgqL1xuc3luY01ldGhvZCguLi5hcmdzKXtcbmRlZmVuZFN5bmNBcmdzKGhhcmRlbihhcmdzKSxtZXRob2RHdWFyZFBheWxvYWQsbGFiZWwpO1xuY29uc3QgcmVzdWx0PWFwcGx5KG1ldGhvZCx0aGlzLGFyZ3MpO1xubXVzdE1hdGNoKGhhcmRlbihyZXN1bHQpLHJldHVybkd1YXJkLCBgJHtsYWJlbH06IHJlc3VsdGApO1xucmV0dXJuIHJlc3VsdDtcbiB9fTtcblxucmV0dXJuIHN5bmNNZXRob2Q7XG4gfTtcblxuY29uc3QgZGVzeW5jPShtZXRob2RHdWFyZFBheWxvYWQpPT57XG5jb25zdHtcbmFyZ0d1YXJkcyxcbm9wdGlvbmFsQXJnR3VhcmRzPVtdLFxucmVzdEFyZ0d1YXJkfT1cbm1ldGhvZEd1YXJkUGF5bG9hZDtcbiFpc0F3YWl0QXJnR3VhcmQocmVzdEFyZ0d1YXJkKXx8XG5GYWlsIGBSZXN0IGFyZ3MgbWF5IG5vdCBiZSBhd2FpdGVkOiAke3Jlc3RBcmdHdWFyZH1gO1xuY29uc3QgcmF3QXJnR3VhcmRzPVsuLi5hcmdHdWFyZHMsLi4ub3B0aW9uYWxBcmdHdWFyZHNdO1xuXG5jb25zdCBhd2FpdEluZGV4ZXM9W107XG5mb3IobGV0IGk9MDtpPHJhd0FyZ0d1YXJkcy5sZW5ndGg7aSs9MSl7XG5jb25zdCBhcmdHdWFyZD1yYXdBcmdHdWFyZHNbaV07XG5pZihpc0F3YWl0QXJnR3VhcmQoYXJnR3VhcmQpKXtcbnJhd0FyZ0d1YXJkc1tpXT1nZXRBd2FpdEFyZ0d1YXJkUGF5bG9hZChhcmdHdWFyZCkuYXJnR3VhcmQ7XG5hd2FpdEluZGV4ZXMucHVzaChpKTtcbiB9XG4gfVxucmV0dXJue1xuYXdhaXRJbmRleGVzLFxucmF3TWV0aG9kR3VhcmRQYXlsb2FkOntcbmFyZ0d1YXJkczpyYXdBcmdHdWFyZHMuc2xpY2UoMCxhcmdHdWFyZHMubGVuZ3RoKSxcbm9wdGlvbmFsQXJnR3VhcmRzOnJhd0FyZ0d1YXJkcy5zbGljZShhcmdHdWFyZHMubGVuZ3RoKSxcbnJlc3RBcmdHdWFyZH19O1xuXG5cbiB9O1xuXG5jb25zdCBkZWZlbmRBc3luY01ldGhvZD0obWV0aG9kLG1ldGhvZEd1YXJkUGF5bG9hZCxsYWJlbCk9PntcbmNvbnN0e3JldHVybkd1YXJkfT1tZXRob2RHdWFyZFBheWxvYWQ7XG5jb25zdHthd2FpdEluZGV4ZXMscmF3TWV0aG9kR3VhcmRQYXlsb2FkfT1kZXN5bmMobWV0aG9kR3VhcmRQYXlsb2FkKTtcbmNvbnN0e2FzeW5jTWV0aG9kfT17XG4vKiBOb3RlIHB1cnBvc2VmdWwgdXNlIG9mIGB0aGlzYCBhbmQgY29uY2lzZSBtZXRob2Qgc3ludGF4Ki9cbmFzeW5jTWV0aG9kKC4uLmFyZ3Mpe1xuY29uc3QgYXdhaXRMaXN0PWF3YWl0SW5kZXhlcy5tYXAoKGkpPT5hcmdzW2ldKTtcbmNvbnN0IHA9UHJvbWlzZS5hbGwoYXdhaXRMaXN0KTtcbmNvbnN0IHJhd0FyZ3M9Wy4uLmFyZ3NdO1xuY29uc3QgcmVzdWx0UD1FLndoZW4ocCwoYXdhaXRlZEFyZ3MpPT57XG5mb3IobGV0IGo9MDtqPGF3YWl0SW5kZXhlcy5sZW5ndGg7ais9MSl7XG5yYXdBcmdzW2F3YWl0SW5kZXhlc1tqXV09YXdhaXRlZEFyZ3Nbal07XG4gfVxuZGVmZW5kU3luY0FyZ3MocmF3QXJncyxyYXdNZXRob2RHdWFyZFBheWxvYWQsbGFiZWwpO1xucmV0dXJuIGFwcGx5KG1ldGhvZCx0aGlzLHJhd0FyZ3MpO1xuIH0pO1xucmV0dXJuIEUud2hlbihyZXN1bHRQLChyZXN1bHQpPT57XG5tdXN0TWF0Y2goaGFyZGVuKHJlc3VsdCkscmV0dXJuR3VhcmQsIGAke2xhYmVsfTogcmVzdWx0YCk7XG5yZXR1cm4gcmVzdWx0O1xuIH0pO1xuIH19O1xuXG5yZXR1cm4gYXN5bmNNZXRob2Q7XG4gfTtcblxuLyoqXG4gKlxuICogQHBhcmFtIHtNZXRob2R9IG1ldGhvZFxuICogQHBhcmFtIHtNZXRob2RHdWFyZH0gbWV0aG9kR3VhcmRcbiAqIEBwYXJhbSB7c3RyaW5nfSBsYWJlbFxuICovXG5jb25zdCBkZWZlbmRNZXRob2Q9KG1ldGhvZCxtZXRob2RHdWFyZCxsYWJlbCk9PntcbmNvbnN0IG1ldGhvZEd1YXJkUGF5bG9hZD1nZXRNZXRob2RHdWFyZFBheWxvYWQobWV0aG9kR3VhcmQpO1xuY29uc3R7Y2FsbEtpbmR9PW1ldGhvZEd1YXJkUGF5bG9hZDtcbmlmKGNhbGxLaW5kPT09J3N5bmMnKXtcbnJldHVybiBkZWZlbmRTeW5jTWV0aG9kKG1ldGhvZCxtZXRob2RHdWFyZFBheWxvYWQsbGFiZWwpO1xuIH1lbHNle1xuYXNzZXJ0KGNhbGxLaW5kPT09J2FzeW5jJyk7XG5yZXR1cm4gZGVmZW5kQXN5bmNNZXRob2QobWV0aG9kLG1ldGhvZEd1YXJkUGF5bG9hZCxsYWJlbCk7XG4gfVxuIH07XG5cbi8qKlxuICogQHR5cGVkZWYge3N0cmluZ30gRmFjZXROYW1lXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7UmVjb3JkPFByb3BlcnR5S2V5LCBDYWxsYWJsZUZ1bmN0aW9uPn0gTWV0aG9kc1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFtTID0gYW55XVxuICogQHRlbXBsYXRlIHtNZXRob2RzfSBbTSA9IGFueV1cbiAqIEB0eXBlZGVmIHt7IHN0YXRlOiBTLCBzZWxmOiBNIH19IENsYXNzQ29udGV4dFxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFtTID0gYW55XVxuICogQHRlbXBsYXRlIHtSZWNvcmQ8RmFjZXROYW1lLCBNZXRob2RzPn0gW0YgPSBhbnldXG4gKiBAdHlwZWRlZiB7eyBzdGF0ZTogUywgZmFjZXRzOiBGIH19IEtpdENvbnRleHRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsoZmFjZXQ6IGFueSkgPT4gS2l0Q29udGV4dH0gS2l0Q29udGV4dFByb3ZpZGVyXG4gKiBAdHlwZWRlZiB7KChyZXByZXNlbnRhdGl2ZTogYW55KSA9PiBDbGFzc0NvbnRleHQpIHwgS2l0Q29udGV4dFByb3ZpZGVyfSBDb250ZXh0UHJvdmlkZXJcbiAqL1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2RUYWdcbiAqIEBwYXJhbSB7Q29udGV4dFByb3ZpZGVyfSBjb250ZXh0UHJvdmlkZXJcbiAqIEBwYXJhbSB7Q2FsbGFibGVGdW5jdGlvbn0gYmVoYXZpb3JNZXRob2RcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3RoaXNmdWxNZXRob2RzXVxuICogQHBhcmFtIHtNZXRob2RHdWFyZH0gW21ldGhvZEd1YXJkXVxuICovXG5jb25zdCBiaW5kTWV0aG9kPShcbm1ldGhvZFRhZyxcbmNvbnRleHRQcm92aWRlcixcbmJlaGF2aW9yTWV0aG9kLFxudGhpc2Z1bE1ldGhvZHM9ZmFsc2UsXG5tZXRob2RHdWFyZD11bmRlZmluZWQpPT5cbntcbmFzc2VydC50eXBlb2YoYmVoYXZpb3JNZXRob2QsJ2Z1bmN0aW9uJyk7XG5cbmNvbnN0IGdldENvbnRleHQ9KHNlbGYpPT57XG5jb25zdCBjb250ZXh0PWNvbnRleHRQcm92aWRlcihzZWxmKTtcbmNvbnRleHR8fFxuRmFpbCBgJHtxKG1ldGhvZFRhZyl9IG1heSBvbmx5IGJlIGFwcGxpZWQgdG8gYSB2YWxpZCBpbnN0YW5jZTogJHtzZWxmfWA7XG5yZXR1cm4gY29udGV4dDtcbiB9O1xuXG4vKiBWaW9sYXRpbmcgYWxsIEplc3NpZSBydWxlcyB0byBjcmVhdGUgcmVwcmVzZW50YXRpdmVzIHRoYXQgaW5oZXJpdCovXG4vKiBtZXRob2RzIGZyb20gYSBzaGFyZWQgcHJvdG90eXBlLiBUaGUgYm91bmQgbWV0aG9kIHRoZXJlZm9yZSBuZWVkcyovXG4vKiB0byBtZW50aW9uIGB0aGlzYC4gV2UgZGVmaW5lIGl0IHVzaW5nIGNvbmNpc2UgbWV0aG9kIHN5bnRheCovXG4vKiBzbyB0aGF0IGl0IHdpbGwgYmUgYHRoaXNgIHNlbnNpdGl2ZSBidXQgbm90IGNvbnN0cnVjdGFibGUuKi9cbi8qKi9cbi8qIFdlIG5vcm1hbGx5IGNvbnNpZGVyIGB0aGlzYCB1bnNhZmUgYmVjYXVzZSBvZiB0aGUgaGF6YXJkIG9mIGEqL1xuLyogbWV0aG9kIG9mIG9uZSBhYnN0cmFjdGlvbiBiZWluZyBhcHBsaWVkIHRvIGFuIGluc3RhbmNlIG9mKi9cbi8qIGFub3RoZXIgYWJzdHJhY3Rpb24uIFRvIHByZXZlbnQgdGhhdCBhdHRhY2ssIHRoZSBib3VuZCBtZXRob2QqL1xuLyogY2hlY2tzIHRoYXQgaXRzIGB0aGlzYCBpcyBpbiB0aGUgbWFwIGluIHdoaWNoIGl0cyByZXByZXNlbnRhdGl2ZXMqL1xuLyogYXJlIHJlZ2lzdGVyZWQuKi9cbmxldHttZXRob2R9PXRoaXNmdWxNZXRob2RzP1xue1xubWV0aG9kKC4uLmFyZ3Mpe1xudGhpc3x8XG5GYWlsIGB0aGlzZnVsIG1ldGhvZCAke21ldGhvZFRhZ30gY2FsbGVkIHdpdGhvdXQgJ3RoaXMnIG9iamVjdGA7XG5jb25zdCBjb250ZXh0PWdldENvbnRleHQodGhpcyk7XG5yZXR1cm4gYXBwbHkoYmVoYXZpb3JNZXRob2QsY29udGV4dCxhcmdzKTtcbiB9fTpcblxue1xubWV0aG9kKC4uLmFyZ3Mpe1xuY29uc3QgY29udGV4dD1nZXRDb250ZXh0KHRoaXMpO1xucmV0dXJuIGFwcGx5KGJlaGF2aW9yTWV0aG9kLG51bGwsW2NvbnRleHQsLi4uYXJnc10pO1xuIH19O1xuXG5pZihtZXRob2RHdWFyZCl7XG5tZXRob2Q9ZGVmZW5kTWV0aG9kKG1ldGhvZCxtZXRob2RHdWFyZCxtZXRob2RUYWcpO1xuIH1lbHNlIGlmKHRoaXNmdWxNZXRob2RzKXtcbi8qIEZvciBmYXIgY2xhc3NlcyBlbnN1cmUgdGhhdCBpbnB1dHMgYW5kIG91dHB1dHMgYXJlIHBhc3NhYmxlLiovXG5tZXRob2Q9ZGVmZW5kTWV0aG9kKG1ldGhvZCxNaW5NZXRob2RHdWFyZCxtZXRob2RUYWcpO1xuIH1cbmRlZmluZVByb3BlcnRpZXMobWV0aG9kLHtcbm5hbWU6e3ZhbHVlOm1ldGhvZFRhZ30sXG5sZW5ndGg6e1xudmFsdWU6dGhpc2Z1bE1ldGhvZHM/YmVoYXZpb3JNZXRob2QubGVuZ3RoOmJlaGF2aW9yTWV0aG9kLmxlbmd0aC0xfX0pO1xuXG5cbnJldHVybiBtZXRob2Q7XG4gfTtcblxuLyoqXG4gKiBUaGUgbmFtZSBvZiB0aGUgYXV0b21hdGljYWxseSBhZGRlZCBkZWZhdWx0IG1ldGEtbWV0aG9kIGZvclxuICogb2J0YWluaW5nIGFuIGV4bydzIGludGVyZmFjZSwgaWYgaXQgaGFzIG9uZS5cbiAqXG4gKiBUT0RPIE5hbWUgdG8gYmUgYmlrZXNoZWQuIFBlcmhhcHMgZXZlbiB3aGV0aGVyIGl0IGlzIGFcbiAqIHN0cmluZyBvciBzeW1ib2wgdG8gYmUgYmlrZXNoZWQuXG4gKlxuICogVE9ETyBCZXdhcmUgdGhhdCBhbiBleG8ncyBpbnRlcmZhY2UgY2FuIGNoYW5nZSBhY3Jvc3MgYW4gdXBncmFkZSxcbiAqIHNvIHJlbW90ZXMgdGhhdCBjYWNoZSBpdCBjYW4gYmVjb21lIHN0YWxlLlxuICovXG5jb25zdCAgICAgICAgR0VUX0lOVEVSRkFDRV9HVUFSRD1TeW1ib2wuZm9yKCdnZXRJbnRlcmZhY2VHdWFyZCcpO1xuXG4vKipcbiAqXG4gKiBAdGVtcGxhdGUge1JlY29yZDxQcm9wZXJ0eUtleSwgQ2FsbGFibGVGdW5jdGlvbj59IFRcbiAqIEBwYXJhbSB7VH0gYmVoYXZpb3JNZXRob2RzXG4gKiBAcGFyYW0ge0ludGVyZmFjZUd1YXJkPHsgW00gaW4ga2V5b2YgVF06IE1ldGhvZEd1YXJkIH0+fSBpbnRlcmZhY2VHdWFyZFxuICogQHJldHVybnMge1R9XG4gKi8kaOKAjV9vbmNlLkdFVF9JTlRFUkZBQ0VfR1VBUkQoR0VUX0lOVEVSRkFDRV9HVUFSRCk7XG5jb25zdCB3aXRoR2V0SW50ZXJmYWNlR3VhcmRNZXRob2Q9KGJlaGF2aW9yTWV0aG9kcyxpbnRlcmZhY2VHdWFyZCk9PlxuaGFyZGVuKHtcbltHRVRfSU5URVJGQUNFX0dVQVJEXSgpe1xucmV0dXJuIGludGVyZmFjZUd1YXJkO1xuIH0sXG4uLi5iZWhhdmlvck1ldGhvZHN9KTtcblxuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPFByb3BlcnR5S2V5LCBDYWxsYWJsZUZ1bmN0aW9uPn0gVFxuICogQHBhcmFtIHtzdHJpbmd9IHRhZ1xuICogQHBhcmFtIHtDb250ZXh0UHJvdmlkZXJ9IGNvbnRleHRQcm92aWRlclxuICogQHBhcmFtIHtUfSBiZWhhdmlvck1ldGhvZHNcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3RoaXNmdWxNZXRob2RzXVxuICogQHBhcmFtIHtJbnRlcmZhY2VHdWFyZDx7IFtNIGluIGtleW9mIFRdOiBNZXRob2RHdWFyZCB9Pn0gW2ludGVyZmFjZUd1YXJkXVxuICogQHJldHVybnMge1QgJiBYaW1wb3J0KCdAZW5kby9ldmVudHVhbC1zZW5kJykuUmVtb3RhYmxlQnJhbmQ8e30sIFQ+fVxuICovXG5jb25zdCAgICAgICAgZGVmZW5kUHJvdG90eXBlPShcbnRhZyxcbmNvbnRleHRQcm92aWRlcixcbmJlaGF2aW9yTWV0aG9kcyxcbnRoaXNmdWxNZXRob2RzPWZhbHNlLFxuaW50ZXJmYWNlR3VhcmQ9dW5kZWZpbmVkKT0+XG57XG5jb25zdCBwcm90b3R5cGU9e307XG5pZihoYXNPd25Qcm9wZXJ0eU9mKGJlaGF2aW9yTWV0aG9kcywnY29uc3RydWN0b3InKSl7XG4vKiBCeSBpZ25vcmluZyBhbnkgbWV0aG9kIG5hbWVkIFwiY29uc3RydWN0b3JcIiwgd2UgY2FuIHVzZSBhKi9cbi8qIGNsYXNzLnByb3RvdHlwZSBhcyBhIGJlaGF2aW9yTWV0aG9kcy4qL1xuY29uc3R7Y29uc3RydWN0b3I6XywuLi5tZXRob2RzfT1iZWhhdmlvck1ldGhvZHM7XG4vKiBAdHMtZXhwZWN0LWVycm9yIFRTIG1pc3NlcyB0aGF0IGhhc093biBjaGVjayBtYWtlcyB0aGlzIHNhZmUqL1xuYmVoYXZpb3JNZXRob2RzPWhhcmRlbihtZXRob2RzKTtcbiB9XG4vKiogQHR5cGUge1JlY29yZDxQcm9wZXJ0eUtleSwgTWV0aG9kR3VhcmQ+IHwgdW5kZWZpbmVkfSAqL1xubGV0IG1ldGhvZEd1YXJkcztcbmlmKGludGVyZmFjZUd1YXJkKXtcbmNvbnN0e1xuaW50ZXJmYWNlTmFtZSxcbm1ldGhvZEd1YXJkczptZyxcbnN5bWJvbE1ldGhvZEd1YXJkcyxcbnNsb3BweT1mYWxzZX09XG5nZXRJbnRlcmZhY2VHdWFyZFBheWxvYWQoaW50ZXJmYWNlR3VhcmQpO1xubWV0aG9kR3VhcmRzPWhhcmRlbih7XG4uLi5tZyxcbi4uLihzeW1ib2xNZXRob2RHdWFyZHMmJlxuZnJvbUVudHJpZXMoZ2V0Q29weU1hcEVudHJpZXMoc3ltYm9sTWV0aG9kR3VhcmRzKSkpfSk7XG5cbntcbmNvbnN0IG1ldGhvZE5hbWVzPW93bktleXMoYmVoYXZpb3JNZXRob2RzKTtcbmNvbnN0IG1ldGhvZEd1YXJkTmFtZXM9b3duS2V5cyhtZXRob2RHdWFyZHMpO1xuY29uc3QgdW5pbXBsZW1lbnRlZD1saXN0RGlmZmVyZW5jZShtZXRob2RHdWFyZE5hbWVzLG1ldGhvZE5hbWVzKTtcbnVuaW1wbGVtZW50ZWQubGVuZ3RoPT09MHx8XG5GYWlsIGBtZXRob2RzICR7cSh1bmltcGxlbWVudGVkKX0gbm90IGltcGxlbWVudGVkIGJ5ICR7cSh0YWcpfWA7XG5pZighc2xvcHB5KXtcbmNvbnN0IHVuZ3VhcmRlZD1saXN0RGlmZmVyZW5jZShtZXRob2ROYW1lcyxtZXRob2RHdWFyZE5hbWVzKTtcbnVuZ3VhcmRlZC5sZW5ndGg9PT0wfHxcbkZhaWwgYG1ldGhvZHMgJHtxKHVuZ3VhcmRlZCl9IG5vdCBndWFyZGVkIGJ5ICR7cShpbnRlcmZhY2VOYW1lKX1gO1xuIH1cbiB9XG5iZWhhdmlvck1ldGhvZHM9d2l0aEdldEludGVyZmFjZUd1YXJkTWV0aG9kKFxuYmVoYXZpb3JNZXRob2RzLFxuaW50ZXJmYWNlR3VhcmQpO1xuXG4gfVxuXG5mb3IoY29uc3QgcHJvcCBvZiBvd25LZXlzKGJlaGF2aW9yTWV0aG9kcykpe1xucHJvdG90eXBlW3Byb3BdPWJpbmRNZXRob2QoXG4gYEluICR7cShwcm9wKX0gbWV0aG9kIG9mICgke3RhZ30pYCxcbmNvbnRleHRQcm92aWRlcixcbmJlaGF2aW9yTWV0aG9kc1twcm9wXSxcbnRoaXNmdWxNZXRob2RzLFxuLyogVE9ETyBzb21lIHRvb2wgZG9lcyBub3QgeWV0IHVuZGVyc3RhbmQgdGhlIGA/LltgIHN5bnRheCovXG5tZXRob2RHdWFyZHMmJm1ldGhvZEd1YXJkc1twcm9wXSk7XG5cbiB9XG5cbnJldHVybiBGYXIodGFnLC8qKiBAdHlwZSB7VH0gKi9wcm90b3R5cGUpO1xuIH07JGjigI1fb25jZS5kZWZlbmRQcm90b3R5cGUoZGVmZW5kUHJvdG90eXBlKTtcbmhhcmRlbihkZWZlbmRQcm90b3R5cGUpO1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAqIEBwYXJhbSB7UmVjb3JkPEZhY2V0TmFtZSwgS2l0Q29udGV4dFByb3ZpZGVyPn0gY29udGV4dFByb3ZpZGVyS2l0XG4gKiBAcGFyYW0ge1JlY29yZDxGYWNldE5hbWUsIFJlY29yZDxQcm9wZXJ0eUtleSwgQ2FsbGFibGVGdW5jdGlvbj4+fSBiZWhhdmlvck1ldGhvZHNLaXRcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3RoaXNmdWxNZXRob2RzXVxuICogQHBhcmFtIHtJbnRlcmZhY2VHdWFyZEtpdH0gW2ludGVyZmFjZUd1YXJkS2l0XVxuICovXG5jb25zdCAgICAgICAgZGVmZW5kUHJvdG90eXBlS2l0PShcbnRhZyxcbmNvbnRleHRQcm92aWRlcktpdCxcbmJlaGF2aW9yTWV0aG9kc0tpdCxcbnRoaXNmdWxNZXRob2RzPWZhbHNlLFxuaW50ZXJmYWNlR3VhcmRLaXQ9dW5kZWZpbmVkKT0+XG57XG5jb25zdCBmYWNldE5hbWVzPW93bktleXMoYmVoYXZpb3JNZXRob2RzS2l0KS5zb3J0KCk7XG5mYWNldE5hbWVzLmxlbmd0aD4xfHxGYWlsIGBBIG11bHRpLWZhY2V0IG9iamVjdCBtdXN0IGhhdmUgbXVsdGlwbGUgZmFjZXRzYDtcbmlmKGludGVyZmFjZUd1YXJkS2l0KXtcbmNvbnN0IGludGVyZmFjZU5hbWVzPW93bktleXMoaW50ZXJmYWNlR3VhcmRLaXQpO1xuY29uc3QgZXh0cmFJbnRlcmZhY2VOYW1lcz1saXN0RGlmZmVyZW5jZShmYWNldE5hbWVzLGludGVyZmFjZU5hbWVzKTtcbmV4dHJhSW50ZXJmYWNlTmFtZXMubGVuZ3RoPT09MHx8XG5GYWlsIGBJbnRlcmZhY2VzICR7cShleHRyYUludGVyZmFjZU5hbWVzKX0gbm90IGltcGxlbWVudGVkIGJ5ICR7cSh0YWcpfWA7XG5jb25zdCBleHRyYUZhY2V0TmFtZXM9bGlzdERpZmZlcmVuY2UoaW50ZXJmYWNlTmFtZXMsZmFjZXROYW1lcyk7XG5leHRyYUZhY2V0TmFtZXMubGVuZ3RoPT09MHx8XG5GYWlsIGBGYWNldHMgJHtxKGV4dHJhRmFjZXROYW1lcyl9IG9mICR7cSh0YWcpfSBub3QgZ3VhcmRlZCBieSBpbnRlcmZhY2VzYDtcbiB9XG5jb25zdCBjb250ZXh0TWFwTmFtZXM9b3duS2V5cyhjb250ZXh0UHJvdmlkZXJLaXQpO1xuY29uc3QgZXh0cmFDb250ZXh0TmFtZXM9bGlzdERpZmZlcmVuY2UoZmFjZXROYW1lcyxjb250ZXh0TWFwTmFtZXMpO1xuZXh0cmFDb250ZXh0TmFtZXMubGVuZ3RoPT09MHx8XG5GYWlsIGBDb250ZXh0cyAke3EoZXh0cmFDb250ZXh0TmFtZXMpfSBub3QgaW1wbGVtZW50ZWQgYnkgJHtxKHRhZyl9YDtcbmNvbnN0IGV4dHJhRmFjZXROYW1lcz1saXN0RGlmZmVyZW5jZShjb250ZXh0TWFwTmFtZXMsZmFjZXROYW1lcyk7XG5leHRyYUZhY2V0TmFtZXMubGVuZ3RoPT09MHx8XG5GYWlsIGBGYWNldHMgJHtxKGV4dHJhRmFjZXROYW1lcyl9IG9mICR7cSh0YWcpfSBtaXNzaW5nIGNvbnRleHRzYDtcbnJldHVybiBvYmplY3RNYXAoYmVoYXZpb3JNZXRob2RzS2l0LChiZWhhdmlvck1ldGhvZHMsZmFjZXROYW1lKT0+XG5kZWZlbmRQcm90b3R5cGUoXG4gYCR7dGFnfSAke2ZhY2V0TmFtZX1gLFxuY29udGV4dFByb3ZpZGVyS2l0W2ZhY2V0TmFtZV0sXG5iZWhhdmlvck1ldGhvZHMsXG50aGlzZnVsTWV0aG9kcyxcbmludGVyZmFjZUd1YXJkS2l0JiZpbnRlcmZhY2VHdWFyZEtpdFtmYWNldE5hbWVdKSk7XG5cblxuIH07JGjigI1fb25jZS5kZWZlbmRQcm90b3R5cGVLaXQoZGVmZW5kUHJvdG90eXBlS2l0KTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJHRVRfSU5URVJGQUNFX0dVQVJEIjpbIkdFVF9JTlRFUkZBQ0VfR1VBUkQiXSwiZGVmZW5kUHJvdG90eXBlIjpbImRlZmVuZFByb3RvdHlwZSJdLCJkZWZlbmRQcm90b3R5cGVLaXQiOlsiZGVmZW5kUHJvdG90eXBlS2l0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEEMM5RAAgAAQAIAAB4AAABAZW5kby9mYXItdjAuMi4yMi9zcmMvaW5kZXguanN7ImltcG9ydHMiOlsiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL3Bhc3Mtc3R5bGUiXSwiZXhwb3J0cyI6WyJnZXRJbnRlcmZhY2VPZiIsImdldEludGVyZmFjZU9mIixudWxsXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtdXSxbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7IkBlbmRvL2V2ZW50dWFsLXNlbmQiOltbIkUiLCJFIl1dLCJAZW5kby9wYXNzLXN0eWxlIjpbWyJGYXIiLCJGYXIiXSxbImdldEludGVyZmFjZU9mIiwiZ2V0SW50ZXJmYWNlT2YiXSxbInBhc3NTdHlsZU9mIiwicGFzc1N0eWxlT2YiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGqFXqN+BwAAfgcAAB0AAABAZW5kby9tYXJzaGFsLXYwLjguOS9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3NyYy9kZWVwbHlGdWxmaWxsZWQuanMiLCIuL3NyYy9lbmNvZGVUb0NhcERhdGEuanMiLCIuL3NyYy9tYXJzaGFsLmpzIiwiLi9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanMiLCIuL3NyYy9tYXJzaGFsLWp1c3Rpbi5qcyIsIi4vc3JjL2VuY29kZVBhc3NhYmxlLmpzIiwiLi9zcmMvcmFua09yZGVyLmpzIiwiLi9zcmMvdHlwZXMuanMiLCJAZW5kby9wYXNzLXN0eWxlIl0sImV4cG9ydHMiOlsiYXNzZXJ0UmFua1NvcnRlZCIsImFzc2VydFJhbmtTb3J0ZWQiLCJtYWtlRGVjb2RlUGFzc2FibGUiLCJtYWtlRGVjb2RlUGFzc2FibGUiLCJwYXJzZSIsInBhcnNlIixudWxsLG51bGwsbnVsbCxudWxsXSwicmVleHBvcnRzIjpbIi4vc3JjL3R5cGVzLmpzIiwiQGVuZG8vcGFzcy1zdHlsZSJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIi4vc3JjL2RlZXBseUZ1bGZpbGxlZC5qc1wiLCBbXV0sW1wiLi9zcmMvZW5jb2RlVG9DYXBEYXRhLmpzXCIsIFtdXSxbXCIuL3NyYy9tYXJzaGFsLmpzXCIsIFtdXSxbXCIuL3NyYy9tYXJzaGFsLXN0cmluZ2lmeS5qc1wiLCBbXV0sW1wiLi9zcmMvbWFyc2hhbC1qdXN0aW4uanNcIiwgW11dLFtcIi4vc3JjL2VuY29kZVBhc3NhYmxlLmpzXCIsIFtdXSxbXCIuL3NyYy9yYW5rT3JkZXIuanNcIiwgW11dLFtcIi4vc3JjL3R5cGVzLmpzXCIsIFtdXSxbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7Ii4vc3JjL2RlZXBseUZ1bGZpbGxlZC5qcyI6W1siZGVlcGx5RnVsZmlsbGVkIiwiZGVlcGx5RnVsZmlsbGVkIl1dLCIuL3NyYy9lbmNvZGVUb0NhcERhdGEuanMiOltbIlFDTEFTUyIsIlFDTEFTUyJdXSwiLi9zcmMvbWFyc2hhbC5qcyI6W1sibWFrZU1hcnNoYWwiLCJtYWtlTWFyc2hhbCJdXSwiLi9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanMiOltbInN0cmluZ2lmeSIsInN0cmluZ2lmeSJdLFsicGFyc2UiLCJwYXJzZSJdXSwiLi9zcmMvbWFyc2hhbC1qdXN0aW4uanMiOltbImRlY29kZVRvSnVzdGluIiwiZGVjb2RlVG9KdXN0aW4iXV0sIi4vc3JjL2VuY29kZVBhc3NhYmxlLmpzIjpbWyJtYWtlRW5jb2RlUGFzc2FibGUiLCJtYWtlRW5jb2RlUGFzc2FibGUiXSxbIm1ha2VEZWNvZGVQYXNzYWJsZSIsIm1ha2VEZWNvZGVQYXNzYWJsZSJdLFsiaXNFbmNvZGVkUmVtb3RhYmxlIiwiaXNFbmNvZGVkUmVtb3RhYmxlIl0sWyJ6ZXJvUGFkIiwiemVyb1BhZCJdLFsicmVjb3JkTmFtZXMiLCJyZWNvcmROYW1lcyJdLFsicmVjb3JkVmFsdWVzIiwicmVjb3JkVmFsdWVzIl1dLCIuL3NyYy9yYW5rT3JkZXIuanMiOltbInRyaXZpYWxDb21wYXJhdG9yIiwidHJpdmlhbENvbXBhcmF0b3IiXSxbImFzc2VydFJhbmtTb3J0ZWQiLCJhc3NlcnRSYW5rU29ydGVkIl0sWyJjb21wYXJlUmFuayIsImNvbXBhcmVSYW5rIl0sWyJpc1JhbmtTb3J0ZWQiLCJpc1JhbmtTb3J0ZWQiXSxbInNvcnRCeVJhbmsiLCJzb3J0QnlSYW5rIl0sWyJjb21wYXJlQW50aVJhbmsiLCJjb21wYXJlQW50aVJhbmsiXSxbIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0IiwibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQiXSxbImdldFBhc3NTdHlsZUNvdmVyIiwiZ2V0UGFzc1N0eWxlQ292ZXIiXSxbImludGVyc2VjdFJhbmtDb3ZlcnMiLCJpbnRlcnNlY3RSYW5rQ292ZXJzIl0sWyJ1bmlvblJhbmtDb3ZlcnMiLCJ1bmlvblJhbmtDb3ZlcnMiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAA5MahaaDQAAmg0AACsAAABAZW5kby9tYXJzaGFsLXYwLjguOS9zcmMvZGVlcGx5RnVsZmlsbGVkLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAZW5kby9wcm9taXNlLWtpdCIsIkBlbmRvL3Bhc3Mtc3R5bGUiXSwiZXhwb3J0cyI6WyJkZWVwbHlGdWxmaWxsZWQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRSxpc1Byb21pc2UsZ2V0VGFnLGlzT2JqZWN0LG1ha2VUYWdnZWQscGFzc1N0eWxlT2Y7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wiaXNQcm9taXNlXCIsIFskaOKAjV9hID0+IChpc1Byb21pc2UgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiZ2V0VGFnXCIsIFskaOKAjV9hID0+IChnZXRUYWcgPSAkaOKAjV9hKV1dLFtcImlzT2JqZWN0XCIsIFskaOKAjV9hID0+IChpc09iamVjdCA9ICRo4oCNX2EpXV0sW1wibWFrZVRhZ2dlZFwiLCBbJGjigI1fYSA9PiAobWFrZVRhZ2dlZCA9ICRo4oCNX2EpXV0sW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9wYXNzLXN0eWxlJykuUGFzc2FibGV9IFBhc3NhYmxlICovXG4vKiogQHRlbXBsYXRlIFQgQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL2V2ZW50dWFsLXNlbmQnKS5FUmVmPFQ+fSBFUmVmICovXG5cbmNvbnN0e2RldGFpbHM6WCxxdW90ZTpxfT1hc3NlcnQ7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuY29uc3R7ZnJvbUVudHJpZXN9PU9iamVjdDtcblxuLyoqXG4gKiBHaXZlbiBhIFBhc3NhYmxlIGB2YWxgIHdob3NlIHBhc3MtYnktY29weSBzdHJ1Y3R1cmUgbWF5IGNvbnRhaW4gbGVhZlxuICogcHJvbWlzZXMsIHJldHVybiBhIHByb21pc2UgZm9yIGEgcmVwbGFjZW1lbnQgUGFzc2FibGUsXG4gKiB3aGVyZSB0aGF0IHJlcGxhY2VtZW50IGlzICpkZWVwbHkgZnVsZmlsbGVkKiwgaS5lLiwgaXRzXG4gKiBwYXNzLWJ5LWNvcHkgc3RydWN0dXJlIGRvZXMgbm90IGNvbnRhaW4gYW55IHByb21pc2VzLlxuICpcbiAqIFRoaXMgaXMgYSBkZWVwIGZvcm0gb2YgYFByb21pc2UuYWxsYCBzcGVjaWFsaXplZCBmb3IgUGFzc2FibGVzLiBGb3IgZWFjaFxuICogZW5jb3VudGVyZWQgcHJvbWlzZSwgcmVwbGFjZSBpdCB3aXRoIHRoZSBkZWVwbHkgZnVsZmlsbGVkIGZvcm0gb2ZcbiAqIGl0cyBmdWxmaWxsbWVudC5cbiAqIElmIGFueSBvZiB0aGUgcHJvbWlzZXMgcmVqZWN0LCB0aGVuIHRoZSBwcm9taXNlIGZvciB0aGUgcmVwbGFjZW1lbnRcbiAqIHJlamVjdHMuIElmIGFueSBvZiB0aGUgcHJvbWlzZXMgbmV2ZXIgc2V0dGxlLCB0aGVuIHRoZSBwcm9taXNlIGZvclxuICogdGhlIHJlcGxhY2VtZW50IG5ldmVyIHNldHRsZXMuXG4gKlxuICogSWYgdGhlIHJlcGxhY2VtZW50IHdvdWxkIG5vdCBiZSBQYXNzYWJsZSwgaS5lLiwgaWYgYHZhbGAgaXMgbm90XG4gKiBQYXNzYWJsZSwgb3IgaWYgYW55IG9mIHRoZSB0cmFuc2l0aXZlIHByb21pc2VzIGZ1bGZpbGwgdG8gc29tZXRoaW5nXG4gKiB0aGF0IGlzIG5vdCBQYXNzYWJsZSwgdGhlbiB0aGUgcmV0dXJuZWQgcHJvbWlzZSByZWplY3RzLlxuICpcbiAqIElmIGB2YWxgIG9yIGl0cyBwYXJ0cyBhcmUgbm9uLWtleSBQYXNzYWJsZXMgb25seSAqYmVjYXVzZSogdGhleSBjb250YWluc1xuICogcHJvbWlzZXMsIHRoZSBkZWVwbHkgZnVsZmlsbGVkIGZvcm1zIG9mIHZhbCBvciBpdHMgcGFydHMgbWF5IGJlIGtleXMuIFRoaXNcbiAqIGlzIGZvciB0aGUgaGlnaGVyIFwic3RvcmVcIiBsZXZlbCBvZiBhYnN0cmFjdGlvbiB0byBkZXRlcm1pbmUsIGJlY2F1c2UgaXRcbiAqIGRlZmluZXMgdGhlIFwia2V5XCIgbm90aW9uIGluIHF1ZXN0aW9uLlxuICpcbiAqIC8vIFRPRE86IFRoYXQgaGlnaGVyIGxldmVsIGlzIGluIHRoZSBwcm9jZXNzIG9mIGJlaW5nIG1pZ3JhdGVkIGZyb21cbiAqIC8vIGBAYWdvcmljL3N0b3JlYCB0byBgQGVuZG8vcGF0dGVybnNgLiBPbmNlIHRoYXQgaXMgZmFyIGVub3VnaCBhbG9uZyxcbiAqIC8vIHJldmlzZSB0aGUgYWJvdmUgY29tbWVudCB0byBtYXRjaC5cbiAqIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8xNDUxXG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gdmFsXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxQYXNzYWJsZT59XG4gKi9cbmNvbnN0ICAgICAgICBkZWVwbHlGdWxmaWxsZWQ9YXN5bmModmFsKT0+e1xuaWYoIWlzT2JqZWN0KHZhbCkpe1xucmV0dXJuIHZhbDtcbiB9XG5pZihpc1Byb21pc2UodmFsKSl7XG5yZXR1cm4gRS53aGVuKHZhbCwobm9ucCk9PmRlZXBseUZ1bGZpbGxlZChub25wKSk7XG4gfVxuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHZhbCk7XG5zd2l0Y2gocGFzc1N0eWxlKXtcbmNhc2UnY29weVJlY29yZCc6e1xuY29uc3QgbmFtZXM9b3duS2V5cyh2YWwpO1xuY29uc3QgdmFsUHM9bmFtZXMubWFwKChuYW1lKT0+ZGVlcGx5RnVsZmlsbGVkKHZhbFtuYW1lXSkpO1xucmV0dXJuIEUud2hlbihQcm9taXNlLmFsbCh2YWxQcyksKHZhbHMpPT5cbmhhcmRlbihmcm9tRW50cmllcyh2YWxzLm1hcCgoYyxpKT0+W25hbWVzW2ldLGNdKSkpKTtcblxuIH1cbmNhc2UnY29weUFycmF5Jzp7XG5jb25zdCB2YWxQcz12YWwubWFwKChwKT0+ZGVlcGx5RnVsZmlsbGVkKHApKTtcbnJldHVybiBFLndoZW4oUHJvbWlzZS5hbGwodmFsUHMpLCh2YWxzKT0+aGFyZGVuKHZhbHMpKTtcbiB9XG5jYXNlJ3RhZ2dlZCc6e1xuY29uc3QgdGFnPWdldFRhZyh2YWwpO1xucmV0dXJuIEUud2hlbihkZWVwbHlGdWxmaWxsZWQodmFsLnBheWxvYWQpLChwYXlsb2FkKT0+XG5tYWtlVGFnZ2VkKHRhZyxwYXlsb2FkKSk7XG5cbiB9XG5jYXNlJ3JlbW90YWJsZSc6e1xucmV0dXJuIHZhbDtcbiB9XG5jYXNlJ2Vycm9yJzp7XG5yZXR1cm4gdmFsO1xuIH1cbmNhc2UncHJvbWlzZSc6e1xucmV0dXJuIEUud2hlbih2YWwsKG5vbnApPT5kZWVwbHlGdWxmaWxsZWQobm9ucCkpO1xuIH1cbmRlZmF1bHQ6e1xudGhyb3cgYXNzZXJ0LmZhaWwoWCBgVW5leHBlY3RlZCBwYXNzU3R5bGUgJHtxKHBhc3NTdHlsZSl9YCxUeXBlRXJyb3IpO1xuIH19XG5cbiB9OyRo4oCNX29uY2UuZGVlcGx5RnVsZmlsbGVkKGRlZXBseUZ1bGZpbGxlZCk7XG5oYXJkZW4oZGVlcGx5RnVsZmlsbGVkKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWVwbHlGdWxmaWxsZWQiOlsiZGVlcGx5RnVsZmlsbGVkIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADtyz4DkPwAA5D8AACoAAABAZW5kby9tYXJzaGFsLXYwLjguOS9zcmMvZW5jb2RlUGFzc2FibGUuanN7ImltcG9ydHMiOlsiQGVuZG8vcGFzcy1zdHlsZSJdLCJleHBvcnRzIjpbImlzRW5jb2RlZFJlbW90YWJsZSIsIm1ha2VEZWNvZGVQYXNzYWJsZSIsIm1ha2VFbmNvZGVQYXNzYWJsZSIsInBhc3NTdHlsZVByZWZpeGVzIiwicmVjb3JkTmFtZXMiLCJyZWNvcmRWYWx1ZXMiLCJ6ZXJvUGFkIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGdldFRhZyxtYWtlVGFnZ2VkLHBhc3NTdHlsZU9mLGFzc2VydFJlY29yZCxpc0Vycm9yTGlrZSxuYW1lRm9yUGFzc2FibGVTeW1ib2wscGFzc2FibGVTeW1ib2xGb3JOYW1lOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcImdldFRhZ1wiLCBbJGjigI1fYSA9PiAoZ2V0VGFnID0gJGjigI1fYSldXSxbXCJtYWtlVGFnZ2VkXCIsIFskaOKAjV9hID0+IChtYWtlVGFnZ2VkID0gJGjigI1fYSldXSxbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlT2YgPSAkaOKAjV9hKV1dLFtcImFzc2VydFJlY29yZFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UmVjb3JkID0gJGjigI1fYSldXSxbXCJpc0Vycm9yTGlrZVwiLCBbJGjigI1fYSA9PiAoaXNFcnJvckxpa2UgPSAkaOKAjV9hKV1dLFtcIm5hbWVGb3JQYXNzYWJsZVN5bWJvbFwiLCBbJGjigI1fYSA9PiAobmFtZUZvclBhc3NhYmxlU3ltYm9sID0gJGjigI1fYSldXSxbXCJwYXNzYWJsZVN5bWJvbEZvck5hbWVcIiwgWyRo4oCNX2EgPT4gKHBhc3NhYmxlU3ltYm9sRm9yTmFtZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL3Bhc3Mtc3R5bGUnKS5QYXNzU3R5bGV9IFBhc3NTdHlsZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9wYXNzLXN0eWxlJykuUGFzc2FibGV9IFBhc3NhYmxlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL3Bhc3Mtc3R5bGUnKS5SZW1vdGFibGVPYmplY3R9IFJlbW90YWJsZSAqL1xuLyoqIEB0ZW1wbGF0ZSBUIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9wYXNzLXN0eWxlJykuQ29weVJlY29yZDxUPn0gQ29weVJlY29yZCAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUmFua0NvdmVyfSBSYW5rQ292ZXIgKi9cblxuY29uc3R7cXVvdGU6cSxGYWlsfT1hc3NlcnQ7XG5jb25zdHtmcm9tRW50cmllcyxpc309T2JqZWN0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcblxuLyoqXG4gKiBBc3N1bWluZyB0aGF0IGByZWNvcmRgIGlzIGEgQ29weVJlY29yZCwgd2UgaGF2ZSBvbmx5XG4gKiBzdHJpbmctbmFtZWQgb3duIHByb3BlcnRpZXMuIGByZWNvcmROYW1lc2AgcmV0dXJucyB0aG9zZSBuYW1lICpyZXZlcnNlKlxuICogc29ydGVkLCBiZWNhdXNlIHRoYXQncyBob3cgcmVjb3JkcyBhcmUgY29tcGFyZWQsIGVuY29kZWQsIGFuZCBzb3J0ZWQuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7Q29weVJlY29yZDxUPn0gcmVjb3JkXG4gKiBAcmV0dXJucyB7c3RyaW5nW119XG4gKi9cbmNvbnN0ICAgICAgICByZWNvcmROYW1lcz0ocmVjb3JkKT0+XG4vKiBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8xMjYwI2Rpc2N1c3Npb25fcjEwMDM2NTcyNDQqL1xuLyogY29tcGFyZXMgdHdvIHdheXMgb2YgcmV2ZXJzZSBzb3J0aW5nLCBhbmQgc2hvd3MgdGhhdCBgLnNvcnQoKS5yZXZlcnNlKClgKi9cbi8qIGlzIGN1cnJlbnRseSBmYXN0ZXIgb24gTW9kZGFibGUgWFMsIHdoaWxlIHRoZSBvdGhlciB3YXksKi9cbi8qIGAuc29ydChyZXZlcnNlQ29tcGFyYXRvcilgLCBpcyBmYXN0ZXIgb24gdjguIFdlIGN1cnJlbnRseSBjYXJlIG1vcmUgYWJvdXQqL1xuLyogWFMgcGVyZm9ybWFuY2UsIHNvIHdlIHJldmVyc2Ugc29ydCB1c2luZyBgLnNvcnQoKS5yZXZlcnNlKClgLiovXG5oYXJkZW4oLyoqIEB0eXBlIHtzdHJpbmdbXX0gKi9vd25LZXlzKHJlY29yZCkuc29ydCgpLnJldmVyc2UoKSk7JGjigI1fb25jZS5yZWNvcmROYW1lcyhyZWNvcmROYW1lcyk7XG5oYXJkZW4ocmVjb3JkTmFtZXMpO1xuXG4vKipcbiAqIEFzc3VtaW5nIHRoYXQgYHJlY29yZGAgaXMgYSBDb3B5UmVjb3JkIGFuZCBgbmFtZXNgIGlzIGByZWNvcmROYW1lcyhyZWNvcmQpYCxcbiAqIHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBhcnJheSBvZiBwcm9wZXJ0eSB2YWx1ZXMuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7Q29weVJlY29yZDxUPn0gcmVjb3JkXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBuYW1lc1xuICogQHJldHVybnMge1RbXX1cbiAqL1xuY29uc3QgICAgICAgIHJlY29yZFZhbHVlcz0ocmVjb3JkLG5hbWVzKT0+XG5oYXJkZW4obmFtZXMubWFwKChuYW1lKT0+cmVjb3JkW25hbWVdKSk7JGjigI1fb25jZS5yZWNvcmRWYWx1ZXMocmVjb3JkVmFsdWVzKTtcbmhhcmRlbihyZWNvcmRWYWx1ZXMpO1xuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gblxuICogQHBhcmFtIHtudW1iZXJ9IHNpemVcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmNvbnN0ICAgICAgICB6ZXJvUGFkPShuLHNpemUpPT57XG5jb25zdCBuU3RyPSBgJHtufWA7XG5hc3NlcnQoblN0ci5sZW5ndGg8PXNpemUpO1xuY29uc3Qgc3RyPSBgMDAwMDAwMDAwMDAwMDAwMDAwMDAke25TdHJ9YDtcbmNvbnN0IHJlc3VsdD1zdHIuc3Vic3RyaW5nKHN0ci5sZW5ndGgtc2l6ZSk7XG5hc3NlcnQocmVzdWx0Lmxlbmd0aD09PXNpemUpO1xucmV0dXJuIHJlc3VsdDtcbiB9OyRo4oCNX29uY2UuemVyb1BhZCh6ZXJvUGFkKTtcbmhhcmRlbih6ZXJvUGFkKTtcblxuLyogVGhpcyBpcyB0aGUgSmF2YVNjcmlwdCBhbmFsb2cgdG8gYSBDIHVuaW9uOiBhIHdheSB0byBtYXAgYmV0d2VlbiBhIGZsb2F0IGFzIGEqL1xuLyogbnVtYmVyIGFuZCB0aGUgYml0cyB0aGF0IHJlcHJlc2VudCB0aGUgZmxvYXQgYXMgYSBidWZmZXIgZnVsbCBvZiBieXRlcy4gIE5vdGUqL1xuLyogdGhhdCB0aGUgbXV0YXRpb24gb2Ygc3RhdGljIHN0YXRlIGhlcmUgbWFrZXMgdGhpcyBpbnZhbGlkIEplc3NpZSBjb2RlLCBidXQqL1xuLyogZG9pbmcgaXQgdGhpcyB3YXkgc2F2ZXMgdGhlIG51Z2F0b3J5IGFuZCBncmF0dWl0b3VzIGFsbG9jYXRpb25zIHRoYXQgd291bGQqL1xuLyogaGFwcGVuIGV2ZXJ5IHRpbWUgeW91IGRvIGEgY29udmVyc2lvbiAtLSBhbmQgaW4gcHJhY3RpY2FsIHRlcm1zIGl0J3Mgc2FmZSovXG4vKiBiZWNhdXNlIHdlIHB1dCB0aGUgdmFsdWUgaW4gb25lIHNpZGUgYW5kIHRoZW4gaW1tZWRpYXRlbHkgdGFrZSBpdCBvdXQgdGhlKi9cbi8qIG90aGVyOyB0aGVyZSBpcyBubyBhY3R1YWwgc3RhdGUgcmV0YWluZWQgaW4gdGhlIGNsYXNzaWMgc2Vuc2UgYW5kIHRodXMgbm8qL1xuLyogcmUtZW50cmFuY3kgaXNzdWUuKi9cbmNvbnN0IGFzTnVtYmVyPW5ldyBGbG9hdDY0QXJyYXkoMSk7XG5jb25zdCBhc0JpdHM9bmV3IEJpZ1VpbnQ2NEFycmF5KGFzTnVtYmVyLmJ1ZmZlcik7XG5cbi8qIEphdmFTY3JpcHQgbnVtYmVycyBhcmUgZW5jb2RlZCBieSBvdXRwdXR0aW5nIHRoZSBiYXNlLTE2Ki9cbi8qIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBiaW5hcnkgdmFsdWUgb2YgdGhlIHVuZGVybHlpbmcgSUVFRSBmbG9hdGluZyBwb2ludCovXG4vKiByZXByZXNlbnRhdGlvbi4gIEZvciBuZWdhdGl2ZSB2YWx1ZXMsIGFsbCBiaXRzIG9mIHRoaXMgcmVwcmVzZW50YXRpb24gYXJlKi9cbi8qIGNvbXBsZW1lbnRlZCBwcmlvciB0byB0aGUgYmFzZS0xNiBjb252ZXJzaW9uLCB3aGlsZSBmb3IgcG9zaXRpdmUgdmFsdWVzLCB0aGUqL1xuLyogc2lnbiBiaXQgaXMgY29tcGxlbWVudGVkLiAgVGhpcyBlbnN1cmVzIGJvdGggdGhhdCBuZWdhdGl2ZSB2YWx1ZXMgc29ydCBiZWZvcmUqL1xuLyogcG9zaXRpdmUgdmFsdWVzIGFuZCB0aGF0IG5lZ2F0aXZlIHZhbHVlcyBzb3J0IGFjY29yZGluZyB0byB0aGVpciBuZWdhdGl2ZSovXG4vKiBtYWduaXR1ZGUgcmF0aGVyIHRoYW4gdGhlaXIgcG9zaXRpdmUgbWFnbml0dWRlLiAgVGhpcyByZXN1bHRzIGluIGFuIEFTQ0lJKi9cbi8qIGVuY29kaW5nIHdob3NlIGxleGljb2dyYXBoaWMgc29ydCBvcmRlciBpcyB0aGUgc2FtZSBhcyB0aGUgbnVtZXJpYyBzb3J0IG9yZGVyKi9cbi8qIG9mIHRoZSBjb3JyZXNwb25kaW5nIG51bWJlcnMuKi9cblxuLyogVE9ETyBDaG9vc2UgdGhlIHNhbWUgY2Fub25pY2FsIE5hTiBlbmNvZGluZyB0aGF0IGNvc21XYXNtIGFuZCBld2FzbSBjaG9zZS4qL1xuY29uc3QgQ2Fub25pY2FsTmFOQml0cz0nZmZmODAwMDAwMDAwMDAwMCc7XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IG5cbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmNvbnN0IGVuY29kZUJpbmFyeTY0PShuKT0+e1xuLyogTm9ybWFsaXplIC0wIHRvIDAgYW5kIE5hTiB0byBhIGNhbm9uaWNhbCBlbmNvZGluZyovXG5pZihpcyhuLC0wKSl7XG5uPTA7XG4gfWVsc2UgaWYoaXMobixOYU4pKXtcbnJldHVybiBgZiR7Q2Fub25pY2FsTmFOQml0c31gO1xuIH1cbmFzTnVtYmVyWzBdPW47XG5sZXQgYml0cz1hc0JpdHNbMF07XG5pZihuPDApe1xuYml0c149MHhmZmZmZmZmZmZmZmZmZmZmbjtcbiB9ZWxzZXtcbmJpdHNePTB4ODAwMDAwMDAwMDAwMDAwMG47XG4gfVxucmV0dXJuIGBmJHt6ZXJvUGFkKGJpdHMudG9TdHJpbmcoMTYpLDE2KX1gO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGVuY29kZWRcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbmNvbnN0IGRlY29kZUJpbmFyeTY0PShlbmNvZGVkKT0+e1xuZW5jb2RlZC5zdGFydHNXaXRoKCdmJyl8fEZhaWwgYEVuY29kZWQgbnVtYmVyIGV4cGVjdGVkOiAke2VuY29kZWR9YDtcbmxldCBiaXRzPUJpZ0ludCggYDB4JHtlbmNvZGVkLnN1YnN0cmluZygxKX1gKTtcbmlmKGVuY29kZWRbMV08JzgnKXtcbmJpdHNePTB4ZmZmZmZmZmZmZmZmZmZmZm47XG4gfWVsc2V7XG5iaXRzXj0weDgwMDAwMDAwMDAwMDAwMDBuO1xuIH1cbmFzQml0c1swXT1iaXRzO1xuY29uc3QgcmVzdWx0PWFzTnVtYmVyWzBdO1xuIWlzKHJlc3VsdCwtMCl8fEZhaWwgYFVuZXhwZWN0ZWQgbmVnYXRpdmUgemVybzogJHtlbmNvZGVkfWA7XG5yZXR1cm4gcmVzdWx0O1xuIH07XG5cbi8qKlxuICogRW5jb2RlIGEgSmF2YVNjcmlwdCBiaWdpbnQgdXNpbmcgYSB2YXJpYW50IG9mIEVsaWFzIGRlbHRhIGNvZGluZywgd2l0aCBhblxuICogaW5pdGlhbCBjb21wb25lbnQgZm9yIHRoZSBsZW5ndGggb2YgdGhlIGRpZ2l0IGNvdW50IGFzIGEgdW5hcnkgc3RyaW5nLCBhXG4gKiBzZWNvbmQgY29tcG9uZW50IGZvciB0aGUgZGVjaW1hbCBkaWdpdCBjb3VudCwgYW5kIGEgdGhpcmQgY29tcG9uZW50IGZvciB0aGVcbiAqIGRlY2ltYWwgZGlnaXRzIHByZWNlZGVkIGJ5IGEgZ3JhdHVpdG91cyBzZXBhcmF0aW5nIGNvbG9uLlxuICogVG8gZW5zdXJlIHRoYXQgdGhlIGxleGljb2dyYXBoaWMgc29ydCBvcmRlciBvZiBlbmNvZGVkIHZhbHVlcyBtYXRjaGVzIHRoZVxuICogbnVtZXJpYyBzb3J0IG9yZGVyIG9mIHRoZSBjb3JyZXNwb25kaW5nIG51bWJlcnMsIHRoZSBjaGFyYWN0ZXJzIG9mIHRoZSB1bmFyeVxuICogcHJlZml4IGFyZSBkaWZmZXJlbnQgZm9yIG5lZ2F0aXZlIHZhbHVlcyAodHlwZSBcIm5cIiBmb2xsb3dlZCBieSBhbnkgbnVtYmVyIG9mXG4gKiBcIiNcInMgW3doaWNoIHNvcnQgYmVmb3JlIGRlY2ltYWwgZGlnaXRzXSkgdnMuIHBvc2l0aXZlIGFuZCB6ZXJvIHZhbHVlcyAodHlwZVxuICogXCJwXCIgZm9sbG93ZWQgYnkgYW55IG51bWJlciBvZiBcIn5cInMgW3doaWNoIHNvcnQgYWZ0ZXIgZGVjaW1hbCBkaWdpdHNdKSBhbmRcbiAqIGVhY2ggZGVjaW1hbCBkaWdpdCBvZiB0aGUgZW5jb2RpbmcgZm9yIGEgbmVnYXRpdmUgdmFsdWUgaXMgcmVwbGFjZWQgd2l0aCBpdHNcbiAqIHRlbidzIGNvbXBsZW1lbnQgKHNvIHRoYXQgbmVnYXRpdmUgdmFsdWVzIG9mIHRoZSBzYW1lIHNjYWxlIHNvcnQgYnlcbiAqICpkZXNjZW5kaW5nKiBhYnNvbHV0ZSB2YWx1ZSkuXG4gKlxuICogQHBhcmFtIHtiaWdpbnR9IG5cbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmNvbnN0IGVuY29kZUJpZ0ludD0obik9PntcbmNvbnN0IGFicz1uPDBuPy1uOm47XG5jb25zdCBuRGlnaXRzPWFicy50b1N0cmluZygpLmxlbmd0aDtcbmNvbnN0IGxEaWdpdHM9bkRpZ2l0cy50b1N0cmluZygpLmxlbmd0aDtcbmlmKG48MG4pe1xucmV0dXJuIGBuJHtcbi8qIEEgXCIjXCIgZm9yIGVhY2ggZGlnaXQgYmV5b25kIHRoZSBmaXJzdCovXG4vKiBpbiB0aGUgZGVjaW1hbCAqY291bnQqIG9mIGRlY2ltYWwgZGlnaXRzLiovXG4nIycucmVwZWF0KGxEaWdpdHMtMSlcbiB9JHtcbi8qIFRoZSB0ZW4ncyBjb21wbGVtZW50IG9mIHRoZSBjb3VudCBvZiBkaWdpdHMuKi9cbigxMCoqbERpZ2l0cy1uRGlnaXRzKS50b1N0cmluZygpLnBhZFN0YXJ0KGxEaWdpdHMsJzAnKVxuIH06JHtcbi8qIFRoZSB0ZW4ncyBjb21wbGVtZW50IG9mIHRoZSBkaWdpdHMuKi9cbigxMG4qKkJpZ0ludChuRGlnaXRzKStuKS50b1N0cmluZygpLnBhZFN0YXJ0KG5EaWdpdHMsJzAnKVxuIH1gO1xuIH1lbHNle1xucmV0dXJuIGBwJHtcbi8qIEEgXCJ+XCIgZm9yIGVhY2ggZGlnaXQgYmV5b25kIHRoZSBmaXJzdCovXG4vKiBpbiB0aGUgZGVjaW1hbCAqY291bnQqIG9mIGRlY2ltYWwgZGlnaXRzLiovXG4nficucmVwZWF0KGxEaWdpdHMtMSlcbiB9JHtcbi8qIFRoZSBjb3VudCBvZiBkaWdpdHMuKi9cbm5EaWdpdHNcbiB9OiR7XG4vKiBUaGUgZGlnaXRzLiovXG5uXG4gfWA7XG4gfVxuIH07XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGVuY29kZWRcbiAqIEByZXR1cm5zIHtiaWdpbnR9XG4gKi9cbmNvbnN0IGRlY29kZUJpZ0ludD0oZW5jb2RlZCk9PntcbmNvbnN0IHR5cGVQcmVmaXg9ZW5jb2RlZC5jaGFyQXQoMCk7LyogZmFzdGVyIHRoYW4gZW5jb2RlZFswXSovXG5sZXQgcmVtPWVuY29kZWQuc2xpY2UoMSk7XG50eXBlUHJlZml4PT09J3AnfHxcbnR5cGVQcmVmaXg9PT0nbid8fFxuRmFpbCBgRW5jb2RlZCBiaWdpbnQgZXhwZWN0ZWQ6ICR7ZW5jb2RlZH1gO1xuXG5jb25zdCBsRGlnaXRzPXJlbS5zZWFyY2goL1swLTldLykrMTtcbmxEaWdpdHM+PTF8fEZhaWwgYERpZ2l0IGNvdW50IGV4cGVjdGVkOiAke2VuY29kZWR9YDtcbnJlbT1yZW0uc2xpY2UobERpZ2l0cy0xKTtcblxucmVtLmxlbmd0aD49bERpZ2l0c3x8RmFpbCBgQ29tcGxldGUgZGlnaXQgY291bnQgZXhwZWN0ZWQ6ICR7ZW5jb2RlZH1gO1xuY29uc3Qgc25EaWdpdHM9cmVtLnNsaWNlKDAsbERpZ2l0cyk7XG5yZW09cmVtLnNsaWNlKGxEaWdpdHMpO1xuL15bMC05XSskLy50ZXN0KHNuRGlnaXRzKXx8RmFpbCBgRGVjaW1hbCBkaWdpdCBjb3VudCBleHBlY3RlZDogJHtlbmNvZGVkfWA7XG5sZXQgbkRpZ2l0cz1wYXJzZUludChzbkRpZ2l0cywxMCk7XG5pZih0eXBlUHJlZml4PT09J24nKXtcbi8qIFRPRE8gQXNzZXJ0IHRvIHJlamVjdCBmb3JiaWRkZW4gZW5jb2RpbmdzKi9cbi8qIGxpa2UgXCJuMDpcIiBhbmQgXCJuMDA64oCmXCIgYW5kIFwibjkxOuKAplwiIHRocm91Z2ggXCJuOTk64oCmXCI/Ki9cbm5EaWdpdHM9MTAqKmxEaWdpdHMtbkRpZ2l0cztcbiB9XG5cbnJlbS5zdGFydHNXaXRoKCc6Jyl8fEZhaWwgYFNlcGFyYXRvciBleHBlY3RlZDogJHtlbmNvZGVkfWA7XG5yZW09cmVtLnNsaWNlKDEpO1xucmVtLmxlbmd0aD09PW5EaWdpdHN8fFxuRmFpbCBgRml4ZWQtbGVuZ3RoIGRpZ2l0IHNlcXVlbmNlIGV4cGVjdGVkOiAke2VuY29kZWR9YDtcbmxldCBuPUJpZ0ludChyZW0pO1xuaWYodHlwZVByZWZpeD09PSduJyl7XG4vKiBUT0RPIEFzc2VydCB0byByZWplY3QgZm9yYmlkZGVuIGVuY29kaW5ncyovXG4vKiBsaWtlIFwibjk6MFwiIGFuZCBcIm44OjAwXCIgYW5kIFwibjg6OTFcIiB0aHJvdWdoIFwibjg6OTlcIj8qL1xubj0tKDEwbioqQmlnSW50KG5EaWdpdHMpLW4pO1xuIH1cblxucmV0dXJuIG47XG4gfTtcblxuLyogYCdcXHUwMDAwJ2AgaXMgdGhlIHRlcm1pbmF0b3IgYWZ0ZXIgZWxlbWVudHMuKi9cbi8qIGAnXFx1MDAwMSdgIGlzIHRoZSBiYWNrc2xhc2gtbGlrZSBlc2NhcGUgY2hhcmFjdGVyLCBmb3IqL1xuLyogZXNjYXBpbmcgYm90aCBvZiB0aGVzZSBjaGFyYWN0ZXJzLiovXG5cbmNvbnN0IGVuY29kZUFycmF5PShhcnJheSxlbmNvZGVQYXNzYWJsZSk9PntcbmNvbnN0IGNoYXJzPVsnWyddO1xuZm9yKGNvbnN0IGVsZW1lbnQgb2YgYXJyYXkpe1xuY29uc3QgZW5jPWVuY29kZVBhc3NhYmxlKGVsZW1lbnQpO1xuZm9yKGNvbnN0IGMgb2YgZW5jKXtcbmlmKGM9PT0nXFx1MDAwMCd8fGM9PT0nXFx1MDAwMScpe1xuY2hhcnMucHVzaCgnXFx1MDAwMScpO1xuIH1cbmNoYXJzLnB1c2goYyk7XG4gfVxuY2hhcnMucHVzaCgnXFx1MDAwMCcpO1xuIH1cbnJldHVybiBjaGFycy5qb2luKCcnKTtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBlbmNvZGVkXG4gKiBAcGFyYW0geyhlbmNvZGVkOiBzdHJpbmcpID0+IFBhc3NhYmxlfSBkZWNvZGVQYXNzYWJsZVxuICogQHJldHVybnMge0FycmF5fVxuICovXG5jb25zdCBkZWNvZGVBcnJheT0oZW5jb2RlZCxkZWNvZGVQYXNzYWJsZSk9PntcbmVuY29kZWQuc3RhcnRzV2l0aCgnWycpfHxGYWlsIGBFbmNvZGVkIGFycmF5IGV4cGVjdGVkOiAke2VuY29kZWR9YDtcbmNvbnN0IGVsZW1lbnRzPVtdO1xuY29uc3QgZWxlbUNoYXJzPVtdO1xuZm9yKGxldCBpPTE7aTxlbmNvZGVkLmxlbmd0aDtpKz0xKXtcbmNvbnN0IGM9ZW5jb2RlZFtpXTtcbmlmKGM9PT0nXFx1MDAwMCcpe1xuY29uc3QgZW5jb2RlZEVsZW1lbnQ9ZWxlbUNoYXJzLmpvaW4oJycpO1xuZWxlbUNoYXJzLmxlbmd0aD0wO1xuY29uc3QgZWxlbWVudD1kZWNvZGVQYXNzYWJsZShlbmNvZGVkRWxlbWVudCk7XG5lbGVtZW50cy5wdXNoKGVsZW1lbnQpO1xuIH1lbHNlIGlmKGM9PT0nXFx1MDAwMScpe1xuaSs9MTtcbmk8ZW5jb2RlZC5sZW5ndGh8fEZhaWwgYHVuZXhwZWN0ZWQgZW5kIG9mIGVuY29kaW5nICR7ZW5jb2RlZH1gO1xuY29uc3QgYzI9ZW5jb2RlZFtpXTtcbmMyPT09J1xcdTAwMDAnfHxcbmMyPT09J1xcdTAwMDEnfHxcbkZhaWwgYFVuZXhwZWN0ZWQgY2hhcmFjdGVyIGFmdGVyIHUwMDAxIGVzY2FwZTogJHtjMn1gO1xuZWxlbUNoYXJzLnB1c2goYzIpO1xuIH1lbHNle1xuZWxlbUNoYXJzLnB1c2goYyk7XG4gfVxuIH1cbmVsZW1DaGFycy5sZW5ndGg9PT0wfHxGYWlsIGBlbmNvZGluZyB0ZXJtaW5hdGVkIGVhcmx5OiAke2VuY29kZWR9YDtcbnJldHVybiBoYXJkZW4oZWxlbWVudHMpO1xuIH07XG5cbmNvbnN0IGVuY29kZVJlY29yZD0ocmVjb3JkLGVuY29kZVBhc3NhYmxlKT0+e1xuY29uc3QgbmFtZXM9cmVjb3JkTmFtZXMocmVjb3JkKTtcbmNvbnN0IHZhbHVlcz1yZWNvcmRWYWx1ZXMocmVjb3JkLG5hbWVzKTtcbnJldHVybiBgKCR7ZW5jb2RlQXJyYXkoaGFyZGVuKFtuYW1lcyx2YWx1ZXNdKSxlbmNvZGVQYXNzYWJsZSl9YDtcbiB9O1xuXG5jb25zdCBkZWNvZGVSZWNvcmQ9KGVuY29kZWQsZGVjb2RlUGFzc2FibGUpPT57XG5hc3NlcnQoZW5jb2RlZC5zdGFydHNXaXRoKCcoJykpO1xuY29uc3Qga2V5c3ZhbHM9ZGVjb2RlQXJyYXkoZW5jb2RlZC5zdWJzdHJpbmcoMSksZGVjb2RlUGFzc2FibGUpO1xua2V5c3ZhbHMubGVuZ3RoPT09Mnx8RmFpbCBgZXhwZWN0ZWQga2V5cyx2YWx1ZXMgcGFpcjogJHtlbmNvZGVkfWA7XG5jb25zdFtrZXlzLHZhbHNdPWtleXN2YWxzO1xuXG5wYXNzU3R5bGVPZihrZXlzKT09PSdjb3B5QXJyYXknJiZcbnBhc3NTdHlsZU9mKHZhbHMpPT09J2NvcHlBcnJheScmJlxua2V5cy5sZW5ndGg9PT12YWxzLmxlbmd0aCYmXG5rZXlzLmV2ZXJ5KChrZXkpPT50eXBlb2Yga2V5PT09J3N0cmluZycpfHxcbkZhaWwgYG5vdCBhIHZhbGlkIHJlY29yZCBlbmNvZGluZzogJHtlbmNvZGVkfWA7XG5jb25zdCBtYXBFbnRyaWVzPWtleXMubWFwKChrZXksaSk9PltrZXksdmFsc1tpXV0pO1xuY29uc3QgcmVjb3JkPWhhcmRlbihmcm9tRW50cmllcyhtYXBFbnRyaWVzKSk7XG5hc3NlcnRSZWNvcmQocmVjb3JkLCdkZWNvZGVkIHJlY29yZCcpO1xucmV0dXJuIHJlY29yZDtcbiB9O1xuXG5jb25zdCBlbmNvZGVUYWdnZWQ9KHRhZ2dlZCxlbmNvZGVQYXNzYWJsZSk9PlxuIGA6JHtlbmNvZGVBcnJheShoYXJkZW4oW2dldFRhZyh0YWdnZWQpLHRhZ2dlZC5wYXlsb2FkXSksZW5jb2RlUGFzc2FibGUpfWA7XG5cbmNvbnN0IGRlY29kZVRhZ2dlZD0oZW5jb2RlZCxkZWNvZGVQYXNzYWJsZSk9PntcbmFzc2VydChlbmNvZGVkLnN0YXJ0c1dpdGgoJzonKSk7XG5jb25zdCB0YWdwYXlsb2FkPWRlY29kZUFycmF5KGVuY29kZWQuc3Vic3RyaW5nKDEpLGRlY29kZVBhc3NhYmxlKTtcbnRhZ3BheWxvYWQubGVuZ3RoPT09Mnx8RmFpbCBgZXhwZWN0ZWQgdGFnLHBheWxvYWQgcGFpcjogJHtlbmNvZGVkfWA7XG5jb25zdFt0YWcscGF5bG9hZF09dGFncGF5bG9hZDtcbnBhc3NTdHlsZU9mKHRhZyk9PT0nc3RyaW5nJ3x8XG5GYWlsIGBub3QgYSB2YWxpZCB0YWdnZWQgZW5jb2Rpbmc6ICR7ZW5jb2RlZH1gO1xucmV0dXJuIG1ha2VUYWdnZWQodGFnLHBheWxvYWQpO1xuIH07XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRW5jb2RlT3B0aW9uc1xuICogQHByb3BlcnR5IHsoXG4gKiAgIHJlbW90YWJsZTogUmVtb3RhYmxlLFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBzdHJpbmcsXG4gKiApID0+IHN0cmluZ30gW2VuY29kZVJlbW90YWJsZV1cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBwcm9taXNlOiBQcm9taXNlLFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBzdHJpbmcsXG4gKiApID0+IHN0cmluZ30gW2VuY29kZVByb21pc2VdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZXJyb3I6IEVycm9yLFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBzdHJpbmcsXG4gKiApID0+IHN0cmluZ30gW2VuY29kZUVycm9yXVxuICovXG5cbi8qKlxuICogQHBhcmFtIHtFbmNvZGVPcHRpb25zfSBbZW5jb2RlT3B0aW9uc11cbiAqIEByZXR1cm5zIHsocGFzc2FibGU6IFBhc3NhYmxlKSA9PiBzdHJpbmd9XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlRW5jb2RlUGFzc2FibGU9KGVuY29kZU9wdGlvbnM9e30pPT57XG5jb25zdHtcbmVuY29kZVJlbW90YWJsZT0ocmVtLF8pPT5GYWlsIGByZW1vdGFibGUgdW5leHBlY3RlZDogJHtyZW19YCxcbmVuY29kZVByb21pc2U9KHByb20sXyk9PkZhaWwgYHByb21pc2UgdW5leHBlY3RlZDogJHtwcm9tfWAsXG5lbmNvZGVFcnJvcj0oZXJyLF8pPT5GYWlsIGBlcnJvciB1bmV4cGVjdGVkOiAke2Vycn1gfT1cbmVuY29kZU9wdGlvbnM7XG5cbmNvbnN0IGVuY29kZVBhc3NhYmxlPShwYXNzYWJsZSk9PntcbmlmKGlzRXJyb3JMaWtlKHBhc3NhYmxlKSl7XG5yZXR1cm4gZW5jb2RlRXJyb3IocGFzc2FibGUsZW5jb2RlUGFzc2FibGUpO1xuIH1cbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihwYXNzYWJsZSk7XG5zd2l0Y2gocGFzc1N0eWxlKXtcbmNhc2UnbnVsbCc6e1xucmV0dXJuJ3YnO1xuIH1cbmNhc2UndW5kZWZpbmVkJzp7XG5yZXR1cm4neic7XG4gfVxuY2FzZSdudW1iZXInOntcbnJldHVybiBlbmNvZGVCaW5hcnk2NChwYXNzYWJsZSk7XG4gfVxuY2FzZSdzdHJpbmcnOntcbnJldHVybiBgcyR7cGFzc2FibGV9YDtcbiB9XG5jYXNlJ2Jvb2xlYW4nOntcbnJldHVybiBgYiR7cGFzc2FibGV9YDtcbiB9XG5jYXNlJ2JpZ2ludCc6e1xucmV0dXJuIGVuY29kZUJpZ0ludChwYXNzYWJsZSk7XG4gfVxuY2FzZSdyZW1vdGFibGUnOntcbmNvbnN0IHJlc3VsdD1lbmNvZGVSZW1vdGFibGUocGFzc2FibGUsZW5jb2RlUGFzc2FibGUpO1xucmVzdWx0LnN0YXJ0c1dpdGgoJ3InKXx8XG5GYWlsIGBpbnRlcm5hbDogUmVtb3RhYmxlIGVuY29kaW5nIG11c3Qgc3RhcnQgd2l0aCBcInJcIjogJHtyZXN1bHR9YDtcbnJldHVybiByZXN1bHQ7XG4gfVxuY2FzZSdlcnJvcic6e1xuY29uc3QgcmVzdWx0PWVuY29kZUVycm9yKHBhc3NhYmxlLGVuY29kZVBhc3NhYmxlKTtcbnJlc3VsdC5zdGFydHNXaXRoKCchJyl8fFxuRmFpbCBgaW50ZXJuYWw6IEVycm9yIGVuY29kaW5nIG11c3Qgc3RhcnQgd2l0aCBcIiFcIjogJHtyZXN1bHR9YDtcbnJldHVybiByZXN1bHQ7XG4gfVxuY2FzZSdwcm9taXNlJzp7XG5jb25zdCByZXN1bHQ9ZW5jb2RlUHJvbWlzZShwYXNzYWJsZSxlbmNvZGVQYXNzYWJsZSk7XG5yZXN1bHQuc3RhcnRzV2l0aCgnPycpfHxcbkZhaWwgYGludGVybmFsOiBQcm9taXNlIGVuY29kaW5nIG11c3Qgc3RhcnQgd2l0aCBcIj9cIjogJHtyZXN1bHR9YDtcbnJldHVybiByZXN1bHQ7XG4gfVxuY2FzZSdzeW1ib2wnOntcbnJldHVybiBgeSR7bmFtZUZvclBhc3NhYmxlU3ltYm9sKHBhc3NhYmxlKX1gO1xuIH1cbmNhc2UnY29weUFycmF5Jzp7XG5yZXR1cm4gZW5jb2RlQXJyYXkocGFzc2FibGUsZW5jb2RlUGFzc2FibGUpO1xuIH1cbmNhc2UnY29weVJlY29yZCc6e1xucmV0dXJuIGVuY29kZVJlY29yZChwYXNzYWJsZSxlbmNvZGVQYXNzYWJsZSk7XG4gfVxuY2FzZSd0YWdnZWQnOntcbnJldHVybiBlbmNvZGVUYWdnZWQocGFzc2FibGUsZW5jb2RlUGFzc2FibGUpO1xuIH1cbmRlZmF1bHQ6e1xudGhyb3cgRmFpbCBgYSAke3EocGFzc1N0eWxlKX0gY2Fubm90IGJlIHVzZWQgYXMgYSBjb2xsZWN0aW9uIHBhc3NhYmxlYDtcbiB9fVxuXG4gfTtcbnJldHVybiBoYXJkZW4oZW5jb2RlUGFzc2FibGUpO1xuIH07JGjigI1fb25jZS5tYWtlRW5jb2RlUGFzc2FibGUobWFrZUVuY29kZVBhc3NhYmxlKTtcbmhhcmRlbihtYWtlRW5jb2RlUGFzc2FibGUpO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IERlY29kZU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlbmNvZGVkUmVtb3RhYmxlOiBzdHJpbmcsXG4gKiAgIGRlY29kZVJlY3VyOiAoZTogc3RyaW5nKSA9PiBQYXNzYWJsZVxuICogKSA9PiBSZW1vdGFibGV9IFtkZWNvZGVSZW1vdGFibGVdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZW5jb2RlZFByb21pc2U6IHN0cmluZyxcbiAqICAgZGVjb2RlUmVjdXI6IChlOiBzdHJpbmcpID0+IFBhc3NhYmxlXG4gKiApID0+IFByb21pc2V9IFtkZWNvZGVQcm9taXNlXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIGVuY29kZWRFcnJvcjogc3RyaW5nLFxuICogICBkZWNvZGVSZWN1cjogKGU6IHN0cmluZykgPT4gUGFzc2FibGVcbiAqICkgPT4gRXJyb3J9IFtkZWNvZGVFcnJvcl1cbiAqL1xuXG4vKipcbiAqIEBwYXJhbSB7RGVjb2RlT3B0aW9uc30gW2RlY29kZU9wdGlvbnNdXG4gKiBAcmV0dXJucyB7KGVuY29kZWQ6IHN0cmluZykgPT4gUGFzc2FibGV9XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlRGVjb2RlUGFzc2FibGU9KGRlY29kZU9wdGlvbnM9e30pPT57XG5jb25zdHtcbmRlY29kZVJlbW90YWJsZT0ocmVtLF8pPT5GYWlsIGByZW1vdGFibGUgdW5leHBlY3RlZDogJHtyZW19YCxcbmRlY29kZVByb21pc2U9KHByb20sXyk9PkZhaWwgYHByb21pc2UgdW5leHBlY3RlZDogJHtwcm9tfWAsXG5kZWNvZGVFcnJvcj0oZXJyLF8pPT5GYWlsIGBlcnJvciB1bmV4cGVjdGVkOiAke2Vycn1gfT1cbmRlY29kZU9wdGlvbnM7XG5cbmNvbnN0IGRlY29kZVBhc3NhYmxlPShlbmNvZGVkKT0+e1xuc3dpdGNoKGVuY29kZWQuY2hhckF0KDApKXtcbmNhc2Undic6e1xucmV0dXJuIG51bGw7XG4gfVxuY2FzZSd6Jzp7XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH1cbmNhc2UnZic6e1xucmV0dXJuIGRlY29kZUJpbmFyeTY0KGVuY29kZWQpO1xuIH1cbmNhc2Uncyc6e1xucmV0dXJuIGVuY29kZWQuc3Vic3RyaW5nKDEpO1xuIH1cbmNhc2UnYic6e1xucmV0dXJuIGVuY29kZWQuc3Vic3RyaW5nKDEpIT09J2ZhbHNlJztcbiB9XG5jYXNlJ24nOlxuY2FzZSdwJzp7XG5yZXR1cm4gZGVjb2RlQmlnSW50KGVuY29kZWQpO1xuIH1cbmNhc2Uncic6e1xucmV0dXJuIGRlY29kZVJlbW90YWJsZShlbmNvZGVkLGRlY29kZVBhc3NhYmxlKTtcbiB9XG5jYXNlJz8nOntcbnJldHVybiBkZWNvZGVQcm9taXNlKGVuY29kZWQsZGVjb2RlUGFzc2FibGUpO1xuIH1cbmNhc2UnISc6e1xucmV0dXJuIGRlY29kZUVycm9yKGVuY29kZWQsZGVjb2RlUGFzc2FibGUpO1xuIH1cbmNhc2UneSc6e1xucmV0dXJuIHBhc3NhYmxlU3ltYm9sRm9yTmFtZShlbmNvZGVkLnN1YnN0cmluZygxKSk7XG4gfVxuY2FzZSdbJzp7XG5yZXR1cm4gZGVjb2RlQXJyYXkoZW5jb2RlZCxkZWNvZGVQYXNzYWJsZSk7XG4gfVxuY2FzZScoJzp7XG5yZXR1cm4gZGVjb2RlUmVjb3JkKGVuY29kZWQsZGVjb2RlUGFzc2FibGUpO1xuIH1cbmNhc2UnOic6e1xucmV0dXJuIGRlY29kZVRhZ2dlZChlbmNvZGVkLGRlY29kZVBhc3NhYmxlKTtcbiB9XG5kZWZhdWx0OntcbnRocm93IEZhaWwgYGludmFsaWQgZGF0YWJhc2Uga2V5OiAke2VuY29kZWR9YDtcbiB9fVxuXG4gfTtcbnJldHVybiBoYXJkZW4oZGVjb2RlUGFzc2FibGUpO1xuIH07JGjigI1fb25jZS5tYWtlRGVjb2RlUGFzc2FibGUobWFrZURlY29kZVBhc3NhYmxlKTtcbmhhcmRlbihtYWtlRGVjb2RlUGFzc2FibGUpO1xuXG5jb25zdCAgICAgICAgaXNFbmNvZGVkUmVtb3RhYmxlPShlbmNvZGVkKT0+ZW5jb2RlZC5jaGFyQXQoMCk9PT0ncic7JGjigI1fb25jZS5pc0VuY29kZWRSZW1vdGFibGUoaXNFbmNvZGVkUmVtb3RhYmxlKTtcbmhhcmRlbihpc0VuY29kZWRSZW1vdGFibGUpO1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKlxuICogQHR5cGUge1JlY29yZDxQYXNzU3R5bGUsIHN0cmluZz59XG4gKiBUaGUgc2luZ2xlIHByZWZpeCBjaGFyYWN0ZXJzIHRvIGJlIHVzZWQgZm9yIGVhY2ggUGFzc1N0eWxlIGNhdGVnb3J5LlxuICogYGJpZ2ludGAgaXMgYSB0d28gY2hhcmFjdGVyIHN0cmluZyBiZWNhdXNlIGVhY2ggb2YgdGhvc2UgY2hhcmFjdGVyc1xuICogaW5kaXZpZHVhbGx5IGlzIGEgdmFsaWQgYmlnaW50IHByZWZpeC4gYG5gIGZvciBcIm5lZ2F0aXZlXCIgYW5kIGBwYCBmb3JcbiAqIFwicG9zaXRpdmVcIi4gVGhlIG9yZGVyaW5nIG9mIHRoZXNlIHByZWZpeGVzIGlzIHRoZSBzYW1lIGFzIHRoZVxuICogcmFua09yZGVyaW5nIG9mIHRoZWlyIHJlc3BlY3RpdmUgUGFzc1N0eWxlcy4gVGhpcyB0YWJsZSBpcyBpbXBvcnRlZCBieVxuICogcmFua09yZGVyLmpzIGZvciB0aGlzIHB1cnBvc2UuXG4gKlxuICogSW4gYWRkaXRpb24sIGB8YCBpcyB0aGUgcmVtb3RhYmxlLT5vcmRpbmFsIG1hcHBpbmcgcHJlZml4OlxuICogVGhpcyBpcyBub3QgdXNlZCBpbiBjb3ZlcnMgYnV0IGl0IGlzXG4gKiByZXNlcnZlZCBmcm9tIHRoZSBzYW1lIHNldCBvZiBzdHJpbmdzLiBOb3RlIHRoYXQgdGhlIHByZWZpeCBpcyA+IGFueVxuICogcHJlZml4IHVzZWQgYnkgYW55IGNvdmVyIHNvIHRoYXQgb3JkaW5hbCBtYXBwaW5nIGtleXMgYXJlIGFsd2F5cyBvdXRzaWRlXG4gKiB0aGUgcmFuZ2Ugb2YgdmFsaWQgY29sbGVjdGlvbiBlbnRyeSBrZXlzLlxuICovXG5jb25zdCAgICAgICAgcGFzc1N0eWxlUHJlZml4ZXM9e1xuZXJyb3I6JyEnLFxuY29weVJlY29yZDonKCcsXG50YWdnZWQ6JzonLFxucHJvbWlzZTonPycsXG5jb3B5QXJyYXk6J1snLFxuYm9vbGVhbjonYicsXG5udW1iZXI6J2YnLFxuYmlnaW50OiducCcsXG5yZW1vdGFibGU6J3InLFxuc3RyaW5nOidzJyxcbm51bGw6J3YnLFxuc3ltYm9sOid5JyxcbnVuZGVmaW5lZDoneid9OyRo4oCNX29uY2UucGFzc1N0eWxlUHJlZml4ZXMocGFzc1N0eWxlUHJlZml4ZXMpO1xuXG5PYmplY3Quc2V0UHJvdG90eXBlT2YocGFzc1N0eWxlUHJlZml4ZXMsbnVsbCk7XG5oYXJkZW4ocGFzc1N0eWxlUHJlZml4ZXMpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InJlY29yZE5hbWVzIjpbInJlY29yZE5hbWVzIl0sInJlY29yZFZhbHVlcyI6WyJyZWNvcmRWYWx1ZXMiXSwiemVyb1BhZCI6WyJ6ZXJvUGFkIl0sIm1ha2VFbmNvZGVQYXNzYWJsZSI6WyJtYWtlRW5jb2RlUGFzc2FibGUiXSwibWFrZURlY29kZVBhc3NhYmxlIjpbIm1ha2VEZWNvZGVQYXNzYWJsZSJdLCJpc0VuY29kZWRSZW1vdGFibGUiOlsiaXNFbmNvZGVkUmVtb3RhYmxlIl0sInBhc3NTdHlsZVByZWZpeGVzIjpbInBhc3NTdHlsZVByZWZpeGVzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAGyqe0OQAAADkAAACsAAABAZW5kby9tYXJzaGFsLXYwLjguOS9zcmMvZW5jb2RlVG9DYXBEYXRhLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3Bhc3Mtc3R5bGUiXSwiZXhwb3J0cyI6WyJRQ0xBU1MiLCJtYWtlRGVjb2RlRnJvbUNhcERhdGEiLCJtYWtlRW5jb2RlVG9DYXBEYXRhIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IHBhc3NTdHlsZU9mLGlzRXJyb3JMaWtlLG1ha2VUYWdnZWQsaXNPYmplY3QsZ2V0VGFnLGhhc093blByb3BlcnR5T2YsYXNzZXJ0UGFzc2FibGVTeW1ib2wsbmFtZUZvclBhc3NhYmxlU3ltYm9sLHBhc3NhYmxlU3ltYm9sRm9yTmFtZTskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlT2YgPSAkaOKAjV9hKV1dLFtcImlzRXJyb3JMaWtlXCIsIFskaOKAjV9hID0+IChpc0Vycm9yTGlrZSA9ICRo4oCNX2EpXV0sW1wibWFrZVRhZ2dlZFwiLCBbJGjigI1fYSA9PiAobWFrZVRhZ2dlZCA9ICRo4oCNX2EpXV0sW1wiaXNPYmplY3RcIiwgWyRo4oCNX2EgPT4gKGlzT2JqZWN0ID0gJGjigI1fYSldXSxbXCJnZXRUYWdcIiwgWyRo4oCNX2EgPT4gKGdldFRhZyA9ICRo4oCNX2EpXV0sW1wiaGFzT3duUHJvcGVydHlPZlwiLCBbJGjigI1fYSA9PiAoaGFzT3duUHJvcGVydHlPZiA9ICRo4oCNX2EpXV0sW1wiYXNzZXJ0UGFzc2FibGVTeW1ib2xcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhc3NhYmxlU3ltYm9sID0gJGjigI1fYSldXSxbXCJuYW1lRm9yUGFzc2FibGVTeW1ib2xcIiwgWyRo4oCNX2EgPT4gKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCA9ICRo4oCNX2EpXV0sW1wicGFzc2FibGVTeW1ib2xGb3JOYW1lXCIsIFskaOKAjV9hID0+IChwYXNzYWJsZVN5bWJvbEZvck5hbWUgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9wYXNzLXN0eWxlJykuUGFzc2FibGV9IFBhc3NhYmxlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5FbmNvZGluZ30gRW5jb2RpbmcgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vcGFzcy1zdHlsZScpLlJlbW90YWJsZX0gUmVtb3RhYmxlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5FbmNvZGluZ1VuaW9ufSBFbmNvZGluZ1VuaW9uICovXG5cbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5jb25zdHtpc0FycmF5fT1BcnJheTtcbmNvbnN0e1xuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyxcbmRlZmluZVByb3BlcnRpZXMsXG5pcyxcbmVudHJpZXMsXG5mcm9tRW50cmllcyxcbmZyZWV6ZX09XG5PYmplY3Q7XG5jb25zdHtkZXRhaWxzOlgsRmFpbCxxdW90ZTpxfT1hc3NlcnQ7XG5cbi8qKlxuICogU3BlY2lhbCBwcm9wZXJ0eSBuYW1lIHRoYXQgaW5kaWNhdGVzIGFuIGVuY29kaW5nIHRoYXQgbmVlZHMgc3BlY2lhbFxuICogZGVjb2RpbmcuXG4gKi9cbmNvbnN0IFFDTEFTUz0nQHFjbGFzcyc7JGjigI1fb25jZS5RQ0xBU1MoUUNMQVNTKTtcblxuXG4vKipcbiAqIEBwYXJhbSB7RW5jb2Rpbmd9IGVuY29kZWRcbiAqIEByZXR1cm5zIHtlbmNvZGVkIGlzIEVuY29kaW5nVW5pb259XG4gKi9cbmNvbnN0IGhhc1FDbGFzcz0oZW5jb2RlZCk9Pmhhc093blByb3BlcnR5T2YoZW5jb2RlZCxRQ0xBU1MpO1xuXG4vKipcbiAqIEBwYXJhbSB7RW5jb2Rpbmd9IGVuY29kZWRcbiAqIEBwYXJhbSB7c3RyaW5nfSBxY2xhc3NcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBxY2xhc3NNYXRjaGVzPShlbmNvZGVkLHFjbGFzcyk9PlxuaXNPYmplY3QoZW5jb2RlZCkmJlxuIWlzQXJyYXkoZW5jb2RlZCkmJlxuaGFzUUNsYXNzKGVuY29kZWQpJiZcbmVuY29kZWRbUUNMQVNTXT09PXFjbGFzcztcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBFbmNvZGVUb0NhcERhdGFPcHRpb25zXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgcmVtb3RhYmxlOiBSZW1vdGFibGUsXG4gKiAgIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IEVuY29kaW5nXG4gKiApID0+IEVuY29kaW5nfSBbZW5jb2RlUmVtb3RhYmxlVG9DYXBEYXRhXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIHByb21pc2U6IFByb21pc2UsXG4gKiAgIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IEVuY29kaW5nXG4gKiApID0+IEVuY29kaW5nfSBbZW5jb2RlUHJvbWlzZVRvQ2FwRGF0YV1cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlcnJvcjogRXJyb3IsXG4gKiAgIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IEVuY29kaW5nXG4gKiApID0+IEVuY29kaW5nfSBbZW5jb2RlRXJyb3JUb0NhcERhdGFdXG4gKi9cblxuY29uc3QgZG9udEVuY29kZVJlbW90YWJsZVRvQ2FwRGF0YT0ocmVtKT0+RmFpbCBgcmVtb3RhYmxlIHVuZXhwZWN0ZWQ6ICR7cmVtfWA7XG5cbmNvbnN0IGRvbnRFbmNvZGVQcm9taXNlVG9DYXBEYXRhPShwcm9tKT0+RmFpbCBgcHJvbWlzZSB1bmV4cGVjdGVkOiAke3Byb219YDtcblxuY29uc3QgZG9udEVuY29kZUVycm9yVG9DYXBEYXRhPShlcnIpPT5GYWlsIGBlcnJvciBvYmplY3QgdW5leHBlY3RlZDogJHtlcnJ9YDtcblxuLyoqXG4gKiBAcGFyYW0ge0VuY29kZVRvQ2FwRGF0YU9wdGlvbnN9IFtlbmNvZGVPcHRpb25zXVxuICogQHJldHVybnMgeyhwYXNzYWJsZTogUGFzc2FibGUpID0+IEVuY29kaW5nfVxuICovXG5jb25zdCAgICAgICAgbWFrZUVuY29kZVRvQ2FwRGF0YT0oZW5jb2RlT3B0aW9ucz17fSk9PntcbmNvbnN0e1xuZW5jb2RlUmVtb3RhYmxlVG9DYXBEYXRhPWRvbnRFbmNvZGVSZW1vdGFibGVUb0NhcERhdGEsXG5lbmNvZGVQcm9taXNlVG9DYXBEYXRhPWRvbnRFbmNvZGVQcm9taXNlVG9DYXBEYXRhLFxuZW5jb2RlRXJyb3JUb0NhcERhdGE9ZG9udEVuY29kZUVycm9yVG9DYXBEYXRhfT1cbmVuY29kZU9wdGlvbnM7XG5cbi8qKlxuICogTXVzdCBlbmNvZGUgYHZhbGAgaW50byBwbGFpbiBKU09OIGRhdGEgKmNhbm9uaWNhbGx5Kiwgc3VjaCB0aGF0XG4gKiBgSlNPTi5zdHJpbmdpZnkoZW5jb2RlKHYxKSkgPT09IEpTT04uc3RyaW5naWZ5KGVuY29kZSh2MSkpYC4gRm9yIG1vc3RcbiAqIGVuY29kaW5ncywgdGhlIG9yZGVyIG9mIHByb3BlcnRpZXMgb2YgZWFjaCBub2RlIG9mIHRoZSBvdXRwdXRcbiAqIHN0cnVjdHVyZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBhbGdvcml0aG0gYmVsb3cgd2l0aG91dCBzcGVjaWFsXG4gKiBhcnJhbmdlbWVudCwgdXN1YWxseSBieSBiZWluZyBleHByZXNzZWQgZGlyZWN0bHkgYXMgYW4gb2JqZWN0IGxpdGVyYWwuXG4gKiBUaGUgZXhjZXB0aW9uIGlzIGNvcHlSZWNvcmRzLCB3aG9zZSBuYXR1cmFsIGVudW1lcmF0aW9uIG9yZGVyXG4gKiBjYW4gZGlmZmVyIGJldHdlZW4gY29weVJlY29yZHMgdGhhdCBvdXIgZGlzdHJpYnV0ZWQgb2JqZWN0IHNlbWFudGljc1xuICogY29uc2lkZXJzIHRvIGJlIGVxdWl2YWxlbnQuXG4gKiBTaW5jZSwgZm9yIGVhY2ggY29weVJlY29yZCwgd2Ugb25seSBhY2NlcHQgc3RyaW5nIHByb3BlcnR5IG5hbWVzLFxuICogbm90IHN5bWJvbHMsIHdlIGNhbiBjYW5vbmljYWxseSBzb3J0IHRoZSBuYW1lcyBmaXJzdC5cbiAqIEpTT04uc3RyaW5naWZ5IHdpbGwgdGhlbiB2aXNpdCB0aGVzZSBpbiB0aGF0IHNvcnRlZCBvcmRlci5cbiAqXG4gKiBFbmNvZGluZyB3aXRoIGEgY2Fub25pY2FsLUpTT04gZW5jb2RlciB3b3VsZCBhbHNvIHNvbHZlIHRoaXMgY2Fub25pY2FsbmVzc1xuICogcHJvYmxlbSBpbiBhIG1vcmUgbW9kdWxhciBhbmQgZW5jYXBzdWxhdGVkIG1hbm5lci4gTm90ZSB0aGF0IHRoZVxuICogYWN0dWFsIG9yZGVyIHByb2R1Y2VkIGhlcmUsIHRob3VnaCBpdCBhZ3JlZXMgd2l0aCBjYW5vbmljYWwtSlNPTiBvblxuICogY29weVJlY29yZCBwcm9wZXJ0eSBvcmRlcmluZywgZGlmZmVycyBmcm9tIGNhbm9uaWNhbC1KU09OIGFzIGEgd2hvbGVcbiAqIGluIHRoYXQgdGhlIG90aGVyIHJlY29yZCBwcm9wZXJ0aWVzIGFyZSB2aXNpdGVkIGluIHRoZSBvcmRlciBpbiB3aGljaFxuICogdGhleSBhcmUgbGl0ZXJhbGx5IHdyaXR0ZW4gYmVsb3cuIFRPRE8gcGVyaGFwcyB3ZSBzaG91bGQgaW5kZWVkIHN3aXRjaFxuICogdG8gYSBjYW5vbmljYWwgSlNPTiBlbmNvZGVyLCBhbmQgbm90IGRlbGljYXRlbHkgZGVwZW5kIG9uIHRoZSBvcmRlclxuICogaW4gd2hpY2ggdGhlc2Ugb2JqZWN0IGxpdGVyYWxzIGFyZSB3cml0dGVuLlxuICpcbiAqIFJlYWRlcnMgbXVzdCBub3QgY2FyZSBhYm91dCB0aGlzIG9yZGVyIGFueXdheS4gV2UgaW1wb3NlIHRoaXMgcmVxdWlyZW1lbnRcbiAqIG1haW5seSB0byByZWR1Y2Ugbm9uLWRldGVybWluaXNtIGV4cG9zZWQgb3V0c2lkZSBhIHZhdC5cbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBwYXNzYWJsZVxuICogQHJldHVybnMge0VuY29kaW5nfSBleGNlcHQgdGhhdCBgZW5jb2RlVG9DYXBEYXRhYCBkb2VzIG5vdCBnZW5lcmFsbHlcbiAqIGBoYXJkZW5gIHRoaXMgcmVzdWx0IGJlZm9yZSByZXR1cm5pbmcuIFJhdGhlciwgYGVuY29kZVRvQ2FwRGF0YWAgaXMgbm90XG4gKiBkaXJlY3RseSBleHBvc2VkLlxuICogV2hhdCdzIGV4cG9zZWQgaW5zdGVhZCBpcyBhIHdyYXBwZXIgdGhhdCBmcmVlemVzIHRoZSBvdXRwdXQgYmVmb3JlXG4gKiByZXR1cm5pbmcuIElmIHRoaXMgdHVybnMgb3V0IHRvIGltcGVkZSBzdGF0aWMgYW5hbHlzaXMgZm9yIGBoYXJkZW5gIHNhZmV0eSxcbiAqIHdlIGNhbiBhbHdheXMgcHV0IHRoZSAobm93IHJlZHVuZGFudCkgaGFyZGVucyBiYWNrIGluLiBUaGV5IGRvbid0IGh1cnQuXG4gKi9cbmNvbnN0IGVuY29kZVRvQ2FwRGF0YVJlY3VyPShwYXNzYWJsZSk9Pntcbi8qIEZpcnN0IHdlIGhhbmRsZSBhbGwgcHJpbWl0aXZlcy4gU29tZSBjYW4gYmUgcmVwcmVzZW50ZWQgZGlyZWN0bHkgYXMqL1xuLyogSlNPTiwgYW5kIHNvbWUgbXVzdCBiZSBlbmNvZGVkIGFzIFtRQ0xBU1NdIGNvbXBvc2l0ZXMuKi9cbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihwYXNzYWJsZSk7XG5zd2l0Y2gocGFzc1N0eWxlKXtcbmNhc2UnbnVsbCc6XG5jYXNlJ2Jvb2xlYW4nOlxuY2FzZSdzdHJpbmcnOntcbi8qIHBhc3MgdGhyb3VnaCB0byBKU09OKi9cbnJldHVybiBwYXNzYWJsZTtcbiB9XG5jYXNlJ3VuZGVmaW5lZCc6e1xucmV0dXJue1tRQ0xBU1NdOid1bmRlZmluZWQnfTtcbiB9XG5jYXNlJ251bWJlcic6e1xuLyogU3BlY2lhbC1jYXNlIG51bWJlcnMgd2l0aCBubyBkaWdpdC1iYXNlZCByZXByZXNlbnRhdGlvbi4qL1xuaWYoTnVtYmVyLmlzTmFOKHBhc3NhYmxlKSl7XG5yZXR1cm57W1FDTEFTU106J05hTid9O1xuIH1lbHNlIGlmKHBhc3NhYmxlPT09SW5maW5pdHkpe1xucmV0dXJue1tRQ0xBU1NdOidJbmZpbml0eSd9O1xuIH1lbHNlIGlmKHBhc3NhYmxlPT09LUluZmluaXR5KXtcbnJldHVybntbUUNMQVNTXTonLUluZmluaXR5J307XG4gfVxuLyogUGFzcyB0aHJvdWdoIGV2ZXJ5dGhpbmcgZWxzZSwgcmVwbGFjaW5nIC0wIHdpdGggMC4qL1xucmV0dXJuIGlzKHBhc3NhYmxlLC0wKT8wOnBhc3NhYmxlO1xuIH1cbmNhc2UnYmlnaW50Jzp7XG5yZXR1cm57XG5bUUNMQVNTXTonYmlnaW50JyxcbmRpZ2l0czpTdHJpbmcocGFzc2FibGUpfTtcblxuIH1cbmNhc2Unc3ltYm9sJzp7XG5hc3NlcnRQYXNzYWJsZVN5bWJvbChwYXNzYWJsZSk7XG5jb25zdCBuYW1lPS8qKiBAdHlwZSB7c3RyaW5nfSAqL25hbWVGb3JQYXNzYWJsZVN5bWJvbChwYXNzYWJsZSk7XG5yZXR1cm57XG5bUUNMQVNTXTonc3ltYm9sJyxcbm5hbWV9O1xuXG4gfVxuY2FzZSdjb3B5UmVjb3JkJzp7XG5pZihoYXNPd25Qcm9wZXJ0eU9mKHBhc3NhYmxlLFFDTEFTUykpe1xuLyogSGlsYmVydCBob3RlbCovXG5jb25zdHtbUUNMQVNTXTpxY2xhc3NWYWx1ZSwuLi5yZXN0fT1wYXNzYWJsZTtcbi8qKiBAdHlwZSB7RW5jb2Rpbmd9ICovXG5jb25zdCByZXN1bHQ9e1xuW1FDTEFTU106J2hpbGJlcnQnLFxub3JpZ2luYWw6ZW5jb2RlVG9DYXBEYXRhUmVjdXIocWNsYXNzVmFsdWUpfTtcblxuaWYob3duS2V5cyhyZXN0KS5sZW5ndGg+PTEpe1xuLyogV2UgaGFyZGVuIHRoZSBlbnRpcmUgY2FwRGF0YSBlbmNvZGluZyBiZWZvcmUgd2UgcmV0dXJuIGl0LiovXG4vKiBgZW5jb2RlVG9DYXBEYXRhYCByZXF1aXJlcyB0aGF0IGl0cyBpbnB1dCBiZSBQYXNzYWJsZSwgYW5kKi9cbi8qIHRoZXJlZm9yZSBoYXJkZW5lZC4qL1xuLyogVGhlIGBmcmVlemVgIGhlcmUgaXMgbmVlZGVkIGFueXdheSwgYmVjYXVzZSB0aGUgYHJlc3RgIGlzKi9cbi8qIGZyZXNobHkgY29uc3RydWN0ZWQgYnkgdGhlIGAuLi5gIGFib3ZlLCBhbmQgd2UncmUgdXNpbmcgaXQqL1xuLyogYXMgaW1wdXQgaW4gYW5vdGhlciBjYWxsIHRvIGBlbmNvZGVUb0NhcERhdGFgLiovXG5yZXN1bHQucmVzdD1lbmNvZGVUb0NhcERhdGFSZWN1cihmcmVlemUocmVzdCkpO1xuIH1cbnJldHVybiByZXN1bHQ7XG4gfVxuLyogQ3VycmVudGx5IGNvcHlSZWNvcmQgYWxsb3dzIG9ubHkgc3RyaW5nIGtleXMgc28gdGhpcyB3aWxsKi9cbi8qIHdvcmsuIElmIHdlIGFsbG93IHNvcnRhYmxlIHN5bWJvbCBrZXlzLCB0aGlzIHdpbGwgbmVlZCB0byovXG4vKiBiZWNvbWUgbW9yZSBpbnRlcmVzdGluZy4qL1xuY29uc3QgbmFtZXM9b3duS2V5cyhwYXNzYWJsZSkuc29ydCgpO1xucmV0dXJuIGZyb21FbnRyaWVzKFxubmFtZXMubWFwKChuYW1lKT0+W25hbWUsZW5jb2RlVG9DYXBEYXRhUmVjdXIocGFzc2FibGVbbmFtZV0pXSkpO1xuXG4gfVxuY2FzZSdjb3B5QXJyYXknOntcbnJldHVybiBwYXNzYWJsZS5tYXAoZW5jb2RlVG9DYXBEYXRhUmVjdXIpO1xuIH1cbmNhc2UndGFnZ2VkJzp7XG5yZXR1cm57XG5bUUNMQVNTXTondGFnZ2VkJyxcbnRhZzpnZXRUYWcocGFzc2FibGUpLFxucGF5bG9hZDplbmNvZGVUb0NhcERhdGFSZWN1cihwYXNzYWJsZS5wYXlsb2FkKX07XG5cbiB9XG5jYXNlJ3JlbW90YWJsZSc6e1xuY29uc3QgZW5jb2RlZD1lbmNvZGVSZW1vdGFibGVUb0NhcERhdGEoXG5wYXNzYWJsZSxcbmVuY29kZVRvQ2FwRGF0YVJlY3VyKTtcblxuaWYocWNsYXNzTWF0Y2hlcyhlbmNvZGVkLCdzbG90Jykpe1xucmV0dXJuIGVuY29kZWQ7XG4gfVxuLyogYHRocm93YCBpcyBub29wIHNpbmNlIGBGYWlsYCB0aHJvd3MuIEJ1dCBsaW50ZXIgY29uZnVzZWQqL1xudGhyb3cgRmFpbCBgaW50ZXJuYWw6IFJlbW90YWJsZSBlbmNvZGluZyBtdXN0IGJlIGFuIG9iamVjdCB3aXRoICR7cShcblFDTEFTUylcbiB9ICR7cSgnc2xvdCcpfTogJHtlbmNvZGVkfWA7XG4gfVxuY2FzZSdwcm9taXNlJzp7XG5jb25zdCBlbmNvZGVkPWVuY29kZVByb21pc2VUb0NhcERhdGEocGFzc2FibGUsZW5jb2RlVG9DYXBEYXRhUmVjdXIpO1xuaWYocWNsYXNzTWF0Y2hlcyhlbmNvZGVkLCdzbG90Jykpe1xucmV0dXJuIGVuY29kZWQ7XG4gfVxudGhyb3cgRmFpbCBgaW50ZXJuYWw6IFByb21pc2UgZW5jb2RpbmcgbXVzdCBiZSBhbiBvYmplY3Qgd2l0aCAke3EoXG5RQ0xBU1MsXG4nc2xvdCcpXG4gfTogJHtlbmNvZGVkfWA7XG4gfVxuY2FzZSdlcnJvcic6e1xuY29uc3QgZW5jb2RlZD1lbmNvZGVFcnJvclRvQ2FwRGF0YShwYXNzYWJsZSxlbmNvZGVUb0NhcERhdGFSZWN1cik7XG5pZihxY2xhc3NNYXRjaGVzKGVuY29kZWQsJ2Vycm9yJykpe1xucmV0dXJuIGVuY29kZWQ7XG4gfVxudGhyb3cgRmFpbCBgaW50ZXJuYWw6IEVycm9yIGVuY29kaW5nIG11c3QgYmUgYW4gb2JqZWN0IHdpdGggJHtxKFxuUUNMQVNTLFxuJ2Vycm9yJylcbiB9OiAke2VuY29kZWR9YDtcbiB9XG5kZWZhdWx0OntcbnRocm93IGFzc2VydC5mYWlsKFxuWCBgaW50ZXJuYWw6IFVucmVjb2duaXplZCBwYXNzU3R5bGUgJHtxKHBhc3NTdHlsZSl9YCxcblR5cGVFcnJvcik7XG5cbiB9fVxuXG4gfTtcbmNvbnN0IGVuY29kZVRvQ2FwRGF0YT0ocGFzc2FibGUpPT57XG5pZihpc0Vycm9yTGlrZShwYXNzYWJsZSkpe1xuLyogV2UgcHVsbCBvdXQgdGhpcyBzcGVjaWFsIGNhc2UgdG8gYWNjb21tb2RhdGUgZXJyb3JzIHRoYXQgYXJlIG5vdCovXG4vKiB2YWxpZCBQYXNzYWJsZXMuIEZvciBleGFtcGxlLCBiZWNhdXNlIHRoZXkncmUgbm90IGZyb3plbi4qL1xuLyogVGhlIHNwZWNpYWwgY2FzZSBjYW4gb25seSBldmVyIGFwcGx5IGF0IHRoZSByb290LCBhbmQgdGhlcmVmb3JlKi9cbi8qIG91dHNpZGUgdGhlIHJlY3Vyc2lvbiwgc2luY2UgYW4gZXJyb3IgY291bGQgb25seSBiZSBkZWVwZXIgaW4qL1xuLyogYSBwYXNzYWJsZSBzdHJ1Y3R1cmUgaWYgaXQgd2VyZSBwYXNzYWJsZS4qL1xuLyoqL1xuLyogV2UgcHVsbCBvdXQgdGhpcyBzcGVjaWFsIGNhc2UgYmVjYXVzZSwgZm9yIHRoZXNlIGVycm9ycywgd2UncmUgbXVjaCovXG4vKiBtb3JlIGludGVyZXN0ZWQgaW4gcmVwb3J0aW5nIHdoYXRldmVyIGRpYWdub3N0aWMgaW5mb3JtYXRpb24gdGhleSovXG4vKiBjYXJyeSB0aGFuIHdlIGFyZSBhYm91dCByZXBvcnRpbmcgcHJvYmxlbXMgZW5jb3VudGVyZWQgaW4gcmVwb3J0aW5nKi9cbi8qIHRoaXMgaW5mb3JtYXRpb24uKi9cbnJldHVybiBoYXJkZW4oZW5jb2RlRXJyb3JUb0NhcERhdGEocGFzc2FibGUsZW5jb2RlVG9DYXBEYXRhUmVjdXIpKTtcbiB9XG5yZXR1cm4gaGFyZGVuKGVuY29kZVRvQ2FwRGF0YVJlY3VyKHBhc3NhYmxlKSk7XG4gfTtcbnJldHVybiBoYXJkZW4oZW5jb2RlVG9DYXBEYXRhKTtcbiB9OyRo4oCNX29uY2UubWFrZUVuY29kZVRvQ2FwRGF0YShtYWtlRW5jb2RlVG9DYXBEYXRhKTtcbmhhcmRlbihtYWtlRW5jb2RlVG9DYXBEYXRhKTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBEZWNvZGVPcHRpb25zXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZW5jb2RlZFJlbW90YWJsZTogRW5jb2RpbmcsXG4gKiAgIGRlY29kZVJlY3VyOiAoZTogRW5jb2RpbmcpID0+IFBhc3NhYmxlXG4gKiApID0+IChQcm9taXNlfFJlbW90YWJsZSl9IFtkZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YV1cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlbmNvZGVkUHJvbWlzZTogRW5jb2RpbmcsXG4gKiAgIGRlY29kZVJlY3VyOiAoZTogRW5jb2RpbmcpID0+IFBhc3NhYmxlXG4gKiApID0+IChQcm9taXNlfFJlbW90YWJsZSl9IFtkZWNvZGVQcm9taXNlRnJvbUNhcERhdGFdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZW5jb2RlZEVycm9yOiBFbmNvZGluZyxcbiAqICAgZGVjb2RlUmVjdXI6IChlOiBFbmNvZGluZykgPT4gUGFzc2FibGVcbiAqICkgPT4gRXJyb3J9IFtkZWNvZGVFcnJvckZyb21DYXBEYXRhXVxuICovXG5cbmNvbnN0IGRvbnREZWNvZGVSZW1vdGFibGVPclByb21pc2VGcm9tQ2FwRGF0YT0oc2xvdEVuY29kaW5nKT0+XG5GYWlsIGByZW1vdGFibGUgb3IgcHJvbWlzZSB1bmV4cGVjdGVkOiAke3Nsb3RFbmNvZGluZ31gO1xuY29uc3QgZG9udERlY29kZUVycm9yRnJvbUNhcERhdGE9KGVycm9yRW5jb2RpbmcpPT5cbkZhaWwgYGVycm9yIHVuZXhwZWN0ZWQ6ICR7ZXJyb3JFbmNvZGluZ31gO1xuXG4vKipcbiAqIFRoZSBjdXJyZW50IGVuY29kaW5nIGRvZXMgbm90IGdpdmUgdGhlIGRlY29kZXIgZW5vdWdoIGludG8gdG8gZGlzdGluZ3Vpc2hcbiAqIHdoZXRoZXIgYSBzbG90IHJlcHJlc2VudHMgYSBwcm9taXNlIG9yIGEgcmVtb3RhYmxlLiBBcyBhbiBpbXBsZW1lbnRhdGlvblxuICogcmVzdHJpY3Rpb24gdW50aWwgdGhpcyBpcyBmaXhlZCwgaWYgZWl0aGVyIGlzIHByb3ZpZGVkLCBib3RoIG11c3QgYmVcbiAqIHByb3ZpZGVkIGFuZCB0aGV5IG11c3QgYmUgdGhlIHNhbWUuXG4gKlxuICogVGhpcyBzZWVtcyBsaWtlIHRoZSBiZXN0IHN0YXJ0aW5nIHBvaW50IHRvIGluY3JlbWVudGFsbHkgZXZvbHZlIHRvIGFuXG4gKiBBUEkgd2hlcmUgdGhlc2UgY2FuIHJlbGlhYmx5IGRpZmZlci5cbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzQzMzRcbiAqXG4gKiBAcGFyYW0ge0RlY29kZU9wdGlvbnN9IFtkZWNvZGVPcHRpb25zXVxuICogQHJldHVybnMgeyhlbmNvZGVkOiBFbmNvZGluZykgPT4gUGFzc2FibGV9XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlRGVjb2RlRnJvbUNhcERhdGE9KGRlY29kZU9wdGlvbnM9e30pPT57XG5jb25zdHtcbmRlY29kZVJlbW90YWJsZUZyb21DYXBEYXRhPWRvbnREZWNvZGVSZW1vdGFibGVPclByb21pc2VGcm9tQ2FwRGF0YSxcbmRlY29kZVByb21pc2VGcm9tQ2FwRGF0YT1kb250RGVjb2RlUmVtb3RhYmxlT3JQcm9taXNlRnJvbUNhcERhdGEsXG5kZWNvZGVFcnJvckZyb21DYXBEYXRhPWRvbnREZWNvZGVFcnJvckZyb21DYXBEYXRhfT1cbmRlY29kZU9wdGlvbnM7XG5cbmRlY29kZVJlbW90YWJsZUZyb21DYXBEYXRhPT09ZGVjb2RlUHJvbWlzZUZyb21DYXBEYXRhfHxcbkZhaWwgYEFuIGltcGxlbWVudGF0aW9uIHJlc3RyaWN0aW9uIGZvciBub3c6IElmIGVpdGhlciBkZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YSBvciBkZWNvZGVQcm9taXNlRnJvbUNhcERhdGEgaXMgcHJvdmlkZWQsIGJvdGggbXVzdCBiZSBwcm92aWRlZCBhbmQgdGhleSBtdXN0IGJlIHRoZSBzYW1lOiAke3EoXG5kZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YSlcbiB9IHZzICR7cShkZWNvZGVQcm9taXNlRnJvbUNhcERhdGEpfWA7XG5cbi8qKlxuICogYGRlY29kZUZyb21DYXBEYXRhYCBtYXkgcmVseSBvbiBganNvbkVuY29kZWRgIGJlaW5nIHRoZSByZXN1bHQgb2YgYVxuICogcGxhaW4gY2FsbCB0byBKU09OLnBhcnNlLiBIb3dldmVyLCBpdCAqY2Fubm90KiByZWx5IG9uIGBqc29uRW5jb2RlZGBcbiAqIGhhdmluZyBiZWVuIHByb2R1Y2VkIGJ5IEpTT04uc3RyaW5naWZ5IG9uIHRoZSBvdXRwdXQgb2YgYGVuY29kZVRvQ2FwRGF0YWBcbiAqIGFib3ZlLCBpLmUuLCBgZGVjb2RlRnJvbUNhcERhdGFgIGNhbm5vdCByZWx5IG9uIGBqc29uRW5jb2RlZGAgYmVpbmcgYVxuICogdmFsaWQgbWFyc2hhbGxlZCByZXByZXNlbnRhdGlvbi4gUmF0aGVyLCBgZGVjb2RlRnJvbUNhcERhdGFgIG11c3RcbiAqIHZhbGlkYXRlIHRoYXQuXG4gKlxuICogQHBhcmFtIHtFbmNvZGluZ30ganNvbkVuY29kZWQgbXVzdCBiZSBoYXJkZW5lZFxuICovXG5jb25zdCBkZWNvZGVGcm9tQ2FwRGF0YT0oanNvbkVuY29kZWQpPT57XG5pZighaXNPYmplY3QoanNvbkVuY29kZWQpKXtcbi8qIHByaW1pdGl2ZXMgcGFzcyB0aHJvdWdoKi9cbnJldHVybiBqc29uRW5jb2RlZDtcbiB9XG5pZihpc0FycmF5KGpzb25FbmNvZGVkKSl7XG5yZXR1cm4ganNvbkVuY29kZWQubWFwKChlbmNvZGVkVmFsKT0+ZGVjb2RlRnJvbUNhcERhdGEoZW5jb2RlZFZhbCkpO1xuIH1lbHNlIGlmKGhhc1FDbGFzcyhqc29uRW5jb2RlZCkpe1xuY29uc3QgcWNsYXNzPWpzb25FbmNvZGVkW1FDTEFTU107XG50eXBlb2YgcWNsYXNzPT09J3N0cmluZyd8fFxuRmFpbCBgaW52YWxpZCAke3EoUUNMQVNTKX0gdHlwZW9mICR7cSh0eXBlb2YgcWNsYXNzKX1gO1xuc3dpdGNoKHFjbGFzcyl7XG4vKiBFbmNvZGluZyBvZiBwcmltaXRpdmVzIG5vdCBoYW5kbGVkIGJ5IEpTT04qL1xuY2FzZSd1bmRlZmluZWQnOntcbnJldHVybiB1bmRlZmluZWQ7XG4gfVxuY2FzZSdOYU4nOntcbnJldHVybiBOYU47XG4gfVxuY2FzZSdJbmZpbml0eSc6e1xucmV0dXJuIEluZmluaXR5O1xuIH1cbmNhc2UnLUluZmluaXR5Jzp7XG5yZXR1cm4tSW5maW5pdHk7XG4gfVxuY2FzZSdiaWdpbnQnOntcbi8qIFVzaW5nIEB0cy1pZ25vcmUgcmF0aGVyIHRoYW4gQHRzLWV4cGVjdC1lcnJvciBiZWxvdyBiZWNhdXNlKi9cbi8qIHdpdGggQHRzLWV4cGVjdC1lcnJvciBJIGdldCBhIHJlZCB1bmRlcmxpbmUgaW4gdnNjb2RlLCBidXQqL1xuLyogd2l0aG91dCBpdCBJIGdldCBlcnJvcnMgZnJvbSBgeWFybiBsaW50YC4qL1xuLyogQHRzLWlnbm9yZSBpbmFkZXF1YXRlIHR5cGUgaW5mZXJlbmNlKi9cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8xMjU5I2Rpc2N1c3Npb25fcjk1NDU2MTkwMSovXG5jb25zdHtkaWdpdHN9PWpzb25FbmNvZGVkO1xudHlwZW9mIGRpZ2l0cz09PSdzdHJpbmcnfHxcbkZhaWwgYGludmFsaWQgZGlnaXRzIHR5cGVvZiAke3EodHlwZW9mIGRpZ2l0cyl9YDtcbnJldHVybiBCaWdJbnQoZGlnaXRzKTtcbiB9XG5jYXNlJ0BAYXN5bmNJdGVyYXRvcic6e1xuLyogRGVwcmVjYXRlZCBxY2xhc3MuIFRPRE8gbWFrZSBjb25kaXRpb25hbCovXG4vKiBvbiBlbnZpcm9ubWVudCB2YXJpYWJsZS4gRXZlbnR1YWxseSByZW1vdmUsIGJ1dCBhZnRlciBjb25maWRlbnQqL1xuLyogdGhhdCB0aGVyZSBhcmUgbm8gbW9yZSBzdXBwb3J0ZWQgc2VuZGVycy4qL1xuLyoqL1xuLyogVXNpbmcgQHRzLWlnbm9yZSByYXRoZXIgdGhhbiBAdHMtZXhwZWN0LWVycm9yIGJlbG93IGJlY2F1c2UqL1xuLyogd2l0aCBAdHMtZXhwZWN0LWVycm9yIEkgZ2V0IGEgcmVkIHVuZGVybGluZSBpbiB2c2NvZGUsIGJ1dCovXG4vKiB3aXRob3V0IGl0IEkgZ2V0IGVycm9ycyBmcm9tIGB5YXJuIGxpbnRgLiovXG4vKiBAdHMtaWdub3JlIGluYWRlcXVhdGUgdHlwZSBpbmZlcmVuY2UqL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzEyNTkjZGlzY3Vzc2lvbl9yOTU0NTYxOTAxKi9cbnJldHVybiBTeW1ib2wuYXN5bmNJdGVyYXRvcjtcbiB9XG5jYXNlJ3N5bWJvbCc6e1xuLyogVXNpbmcgQHRzLWlnbm9yZSByYXRoZXIgdGhhbiBAdHMtZXhwZWN0LWVycm9yIGJlbG93IGJlY2F1c2UqL1xuLyogd2l0aCBAdHMtZXhwZWN0LWVycm9yIEkgZ2V0IGEgcmVkIHVuZGVybGluZSBpbiB2c2NvZGUsIGJ1dCovXG4vKiB3aXRob3V0IGl0IEkgZ2V0IGVycm9ycyBmcm9tIGB5YXJuIGxpbnRgLiovXG4vKiBAdHMtaWdub3JlIGluYWRlcXVhdGUgdHlwZSBpbmZlcmVuY2UqL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzEyNTkjZGlzY3Vzc2lvbl9yOTU0NTYxOTAxKi9cbmNvbnN0e25hbWV9PWpzb25FbmNvZGVkO1xucmV0dXJuIHBhc3NhYmxlU3ltYm9sRm9yTmFtZShuYW1lKTtcbiB9XG5jYXNlJ3RhZ2dlZCc6e1xuLyogVXNpbmcgQHRzLWlnbm9yZSByYXRoZXIgdGhhbiBAdHMtZXhwZWN0LWVycm9yIGJlbG93IGJlY2F1c2UqL1xuLyogd2l0aCBAdHMtZXhwZWN0LWVycm9yIEkgZ2V0IGEgcmVkIHVuZGVybGluZSBpbiB2c2NvZGUsIGJ1dCovXG4vKiB3aXRob3V0IGl0IEkgZ2V0IGVycm9ycyBmcm9tIGB5YXJuIGxpbnRgLiovXG4vKiBAdHMtaWdub3JlIGluYWRlcXVhdGUgdHlwZSBpbmZlcmVuY2UqL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzEyNTkjZGlzY3Vzc2lvbl9yOTU0NTYxOTAxKi9cbmNvbnN0e3RhZyxwYXlsb2FkfT1qc29uRW5jb2RlZDtcbnJldHVybiBtYWtlVGFnZ2VkKHRhZyxkZWNvZGVGcm9tQ2FwRGF0YShwYXlsb2FkKSk7XG4gfVxuY2FzZSdzbG90Jzp7XG4vKiBTZWUgbm90ZSBhYm92ZSBhYm91dCBob3cgdGhlIGN1cnJlbnQgZW5jb2RpbmcgY2Fubm90IHJlbGlhYmx5Ki9cbi8qIGRpc3Rpbmd1aXNoIHdoaWNoIHdlIHNob3VsZCBjYWxsLCBzbyBpbiB0aGUgbm9uLWRlZmF1bHQgY2FzZSovXG4vKiBib3RoIG11c3QgYmUgdGhlIHNhbWUgYW5kIGl0IGRvZXNuJ3QgbWF0dGVyIHdoaWNoIHdlIGNhbGwuKi9cbmNvbnN0IGRlY29kZWQ9ZGVjb2RlUmVtb3RhYmxlRnJvbUNhcERhdGEoXG5qc29uRW5jb2RlZCxcbmRlY29kZUZyb21DYXBEYXRhKTtcblxuLyogQkVXQVJFOiBjYXBkYXRhIGRvZXMgbm90IGNoZWNrIHRoYXQgYGRlY29kZWRgIGlzKi9cbi8qIGEgcHJvbWlzZSBvciBhIHJlbW90YWJsZSwgc2luY2UgdGhhdCB3b3VsZCBicmVhayBzb21lKi9cbi8qIGNhcGRhdGEgY2xpZW50cy4gV2UgYXJlIGRlcHJlY2F0aW5nIGNhcGRhdGEsIGFuZCB0aGVzZSBjbGllbnRzKi9cbi8qIHdpbGwgbmVlZCB0byB1cGRhdGUgYmVmb3JlIHN3aXRjaGluZyB0byBzbWFsbGNhcHMuKi9cbnJldHVybiBkZWNvZGVkO1xuIH1cbmNhc2UnZXJyb3InOntcbmNvbnN0IGRlY29kZWQ9ZGVjb2RlRXJyb3JGcm9tQ2FwRGF0YShcbmpzb25FbmNvZGVkLFxuZGVjb2RlRnJvbUNhcERhdGEpO1xuXG5pZihwYXNzU3R5bGVPZihkZWNvZGVkKT09PSdlcnJvcicpe1xucmV0dXJuIGRlY29kZWQ7XG4gfVxudGhyb3cgRmFpbCBgaW50ZXJuYWw6IGRlY29kZUVycm9yRnJvbUNhcERhdGEgb3B0aW9uIG11c3QgcmV0dXJuIGFuIGVycm9yOiAke2RlY29kZWR9YDtcbiB9XG5jYXNlJ2hpbGJlcnQnOntcbi8qIFVzaW5nIEB0cy1pZ25vcmUgcmF0aGVyIHRoYW4gQHRzLWV4cGVjdC1lcnJvciBiZWxvdyBiZWNhdXNlKi9cbi8qIHdpdGggQHRzLWV4cGVjdC1lcnJvciBJIGdldCBhIHJlZCB1bmRlcmxpbmUgaW4gdnNjb2RlLCBidXQqL1xuLyogd2l0aG91dCBpdCBJIGdldCBlcnJvcnMgZnJvbSBgeWFybiBsaW50YC4qL1xuLyogQHRzLWlnbm9yZSBpbmFkZXF1YXRlIHR5cGUgaW5mZXJlbmNlKi9cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8xMjU5I2Rpc2N1c3Npb25fcjk1NDU2MTkwMSovXG5jb25zdHtvcmlnaW5hbCxyZXN0fT1qc29uRW5jb2RlZDtcbmhhc093blByb3BlcnR5T2YoanNvbkVuY29kZWQsJ29yaWdpbmFsJyl8fFxuRmFpbCBgSW52YWxpZCBIaWxiZXJ0IEhvdGVsIGVuY29kaW5nICR7anNvbkVuY29kZWR9YDtcbi8qIERvbid0IGhhcmRlbiBzaW5jZSB3ZSdyZSBub3QgZG9uZSBtdXRhdGluZyBpdCovXG5jb25zdCByZXN1bHQ9e1tRQ0xBU1NdOmRlY29kZUZyb21DYXBEYXRhKG9yaWdpbmFsKX07XG5pZihoYXNPd25Qcm9wZXJ0eU9mKGpzb25FbmNvZGVkLCdyZXN0Jykpe1xuY29uc3QgaXNOb25FbXB0eU9iamVjdD1cbnR5cGVvZiByZXN0PT09J29iamVjdCcmJlxucmVzdCE9PW51bGwmJlxub3duS2V5cyhyZXN0KS5sZW5ndGg+PTE7XG5pZighaXNOb25FbXB0eU9iamVjdCl7XG50aHJvdyBGYWlsIGBSZXN0IGVuY29kaW5nIG11c3QgYmUgYSBub24tZW1wdHkgb2JqZWN0OiAke3Jlc3R9YDtcbiB9XG5jb25zdCByZXN0T2JqPWRlY29kZUZyb21DYXBEYXRhKHJlc3QpO1xuLyogVE9ETyByZWFsbHkgc2hvdWxkIGFzc2VydCB0aGF0IGBwYXNzU3R5bGVPZihyZXN0KWAgaXMqL1xuLyogYCdjb3B5UmVjb3JkJ2AgYnV0IHdlJ2QgaGF2ZSB0byBoYXJkZW4gaXQgYW5kIGl0IGlzIHRvbyovXG4vKiBlYXJseSB0byBkbyB0aGF0LiovXG4haGFzT3duUHJvcGVydHlPZihyZXN0T2JqLFFDTEFTUyl8fFxuRmFpbCBgUmVzdCBtdXN0IG5vdCBjb250YWluIGl0cyBvd24gZGVmaW5pdGlvbiBvZiAke3EoUUNMQVNTKX1gO1xuZGVmaW5lUHJvcGVydGllcyhyZXN1bHQsZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhyZXN0T2JqKSk7XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9XG4vKiBAdHMtZXhwZWN0LWVycm9yIFRoaXMgaXMgdGhlIGVycm9yIGNhc2Ugd2UncmUgdGVzdGluZyBmb3IqL1xuY2FzZSdpYmlkJzp7XG50aHJvdyBGYWlsIGBUaGUgY2FwRGF0YSBwcm90b2NvbCBubyBsb25nZXIgc3VwcG9ydHMgJHtxKFFDTEFTUyl9ICR7cShcbnFjbGFzcylcbiB9YDtcbiB9XG5kZWZhdWx0OntcbnRocm93IGFzc2VydC5mYWlsKFxuWCBgdW5yZWNvZ25pemVkICR7cShRQ0xBU1MpfSAke3EocWNsYXNzKX1gLFxuVHlwZUVycm9yKTtcblxuIH19XG5cbiB9ZWxzZXtcbmFzc2VydCh0eXBlb2YganNvbkVuY29kZWQ9PT0nb2JqZWN0JyYmanNvbkVuY29kZWQhPT1udWxsKTtcbmNvbnN0IGRlY29kZUVudHJ5PShbbmFtZSxlbmNvZGVkVmFsXSk9PntcbnR5cGVvZiBuYW1lPT09J3N0cmluZyd8fFxuRmFpbCBgUHJvcGVydHkgJHtxKG5hbWUpfSBvZiAke2pzb25FbmNvZGVkfSBtdXN0IGJlIGEgc3RyaW5nYDtcbnJldHVybltuYW1lLGRlY29kZUZyb21DYXBEYXRhKGVuY29kZWRWYWwpXTtcbiB9O1xuY29uc3QgZGVjb2RlZEVudHJpZXM9ZW50cmllcyhqc29uRW5jb2RlZCkubWFwKGRlY29kZUVudHJ5KTtcbnJldHVybiBmcm9tRW50cmllcyhkZWNvZGVkRW50cmllcyk7XG4gfVxuIH07XG5yZXR1cm4gaGFyZGVuKGRlY29kZUZyb21DYXBEYXRhKTtcbiB9OyRo4oCNX29uY2UubWFrZURlY29kZUZyb21DYXBEYXRhKG1ha2VEZWNvZGVGcm9tQ2FwRGF0YSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiUUNMQVNTIjpbIlFDTEFTUyJdLCJtYWtlRW5jb2RlVG9DYXBEYXRhIjpbIm1ha2VFbmNvZGVUb0NhcERhdGEiXSwibWFrZURlY29kZUZyb21DYXBEYXRhIjpbIm1ha2VEZWNvZGVGcm9tQ2FwRGF0YSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADD18oB3TsAAN07AAAtAAAAQGVuZG8vbWFyc2hhbC12MC44Ljkvc3JjL2VuY29kZVRvU21hbGxjYXBzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3Bhc3Mtc3R5bGUiXSwiZXhwb3J0cyI6WyJtYWtlRGVjb2RlRnJvbVNtYWxsY2FwcyIsIm1ha2VFbmNvZGVUb1NtYWxsY2FwcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBwYXNzU3R5bGVPZixpc0Vycm9yTGlrZSxtYWtlVGFnZ2VkLGdldFRhZyxoYXNPd25Qcm9wZXJ0eU9mLGFzc2VydFBhc3NhYmxlU3ltYm9sLG5hbWVGb3JQYXNzYWJsZVN5bWJvbCxwYXNzYWJsZVN5bWJvbEZvck5hbWU7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXSxbXCJpc0Vycm9yTGlrZVwiLCBbJGjigI1fYSA9PiAoaXNFcnJvckxpa2UgPSAkaOKAjV9hKV1dLFtcIm1ha2VUYWdnZWRcIiwgWyRo4oCNX2EgPT4gKG1ha2VUYWdnZWQgPSAkaOKAjV9hKV1dLFtcImdldFRhZ1wiLCBbJGjigI1fYSA9PiAoZ2V0VGFnID0gJGjigI1fYSldXSxbXCJoYXNPd25Qcm9wZXJ0eU9mXCIsIFskaOKAjV9hID0+IChoYXNPd25Qcm9wZXJ0eU9mID0gJGjigI1fYSldXSxbXCJhc3NlcnRQYXNzYWJsZVN5bWJvbFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UGFzc2FibGVTeW1ib2wgPSAkaOKAjV9hKV1dLFtcIm5hbWVGb3JQYXNzYWJsZVN5bWJvbFwiLCBbJGjigI1fYSA9PiAobmFtZUZvclBhc3NhYmxlU3ltYm9sID0gJGjigI1fYSldXSxbXCJwYXNzYWJsZVN5bWJvbEZvck5hbWVcIiwgWyRo4oCNX2EgPT4gKHBhc3NhYmxlU3ltYm9sRm9yTmFtZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9wYXNzLXN0eWxlJykuUGFzc2FibGV9IFBhc3NhYmxlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL3Bhc3Mtc3R5bGUnKS5SZW1vdGFibGV9IFJlbW90YWJsZSAqL1xuLyogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5TbWFsbGNhcHNFbmNvZGluZ30gU21hbGxjYXBzRW5jb2RpbmcgKlgvKi9cbi8qIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuU21hbGxjYXBzRW5jb2RpbmdVbmlvbn0gU21hbGxjYXBzRW5jb2RpbmdVbmlvbiAqWC8qL1xuLyoqIEB0eXBlZGVmIHthbnl9IFNtYWxsY2Fwc0VuY29kaW5nICovXG4vKiogQHR5cGVkZWYge2FueX0gU21hbGxjYXBzRW5jb2RpbmdVbmlvbiAqL1xuXG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuY29uc3R7aXNBcnJheX09QXJyYXk7XG5jb25zdHtpcyxlbnRyaWVzLGZyb21FbnRyaWVzfT1PYmplY3Q7XG5jb25zdHtkZXRhaWxzOlgsRmFpbCxxdW90ZTpxfT1hc3NlcnQ7XG5cbmNvbnN0IEJBTkc9JyEnLmNoYXJDb2RlQXQoMCk7XG5jb25zdCBEQVNIPSctJy5jaGFyQ29kZUF0KDApO1xuXG4vKipcbiAqIEFuIGBlbmNvZGVUb1NtYWxsY2Fwc2AgZnVuY3Rpb24gdGFrZXMgYSBwYXNzYWJsZSBhbmQgcmV0dXJucyBhXG4gKiBKU09OLXJlcHJlc2VudGFibGUgb2JqZWN0IChpLmUuLCByb3VuZC10cmlwcGluZyBpdCB0aHJvdWdoXG4gKiBgSlNPTi5zdHJpbmdpZnlgIGFuZCBgSlNPTi5wYXJzZWAgd2l0aCBubyByZXBsYWNlcnMgb3IgcmV2aXZlcnNcbiAqIHJldHVybnMgYW4gZXF1aXZhbGVudCBzdHJ1Y3R1cmUgZXhjZXB0IGZvciBvYmplY3QgaWRlbnRpdHkpLlxuICogV2UgY2FsbCB0aGlzIHJlcHJlc2VudGF0aW9uIGEgU21hbGxjYXBzIEVuY29kaW5nLlxuICpcbiAqIEEgYGRlY29kZUZyb21TbWFsbGNhcHNgIGZ1bmN0aW9uIHRha2VzIGFzIGFyZ3VtZW50IHdoYXQgaXRcbiAqICphc3N1bWVzKiBpcyB0aGUgcmVzdWx0IG9mIGEgcGxhaW4gYEpTT04ucGFyc2VgIHdpdGggbm8gcmVzb2x2ZXIuIEl0IHRoZW5cbiAqIG11c3QgdmFsaWRhdGUgdGhhdCBpdCBpcyBhIHZhbGlkIFNtYWxsY2FwcyBFbmNvZGluZywgYW5kIGlmIGl0IGlzLFxuICogcmV0dXJuIGEgY29ycmVzcG9uZGluZyBwYXNzYWJsZS5cbiAqXG4gKiBTbWFsbGNhcHMgY29uc2lkZXJzIHRoZSBjaGFyYWN0ZXJzIGJldHdlZW4gYCFgIChhc2NpaSBjb2RlIDMzLCBCQU5HKVxuICogYW5kIGAtYCAoYXNjaWkgY29kZSA0NSwgREFTSCkgdG8gYmUgc3BlY2lhbCBwcmVmaXhlcyBhbGxvd2luZ1xuICogcmVwcmVzZW50YXRpb24gb2YgSlNPTi1pbmNvbXBhdGlibGUgZGF0YSB1c2luZyBzdHJpbmdzLlxuICogVGhlc2UgY2hhcmFjdGVycywgaW4gb3JkZXIsIGFyZSBgIVwiIyQlJicoKSorLC1gXG4gKiBPZiB0aGVzZSwgc21hbGxjYXBzIGN1cnJlbnRseSB1c2VzIHRoZSBmb2xsb3dpbmc6XG4gKlxuICogICogYCFgIC0gZXNjYXBlZCBzdHJpbmdcbiAqICAqIGArYCAtIG5vbi1uZWdhdGl2ZSBiaWdpbnRcbiAqICAqIGAtYCAtIG5lZ2F0aXZlIGJpZ2ludFxuICogICogYCNgIC0gbWFuaWZlc3QgY29uc3RhbnRcbiAqICAqIGAlYCAtIHN5bWJvbFxuICogICogYCRgIC0gcmVtb3RhYmxlXG4gKiAgKiBgJmAgLSBwcm9taXNlXG4gKlxuICogQWxsIG90aGVyIHNwZWNpYWwgY2hhcmFjdGVycyAoYFwiJygpKixgKSBhcmUgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuXG4gKlxuICogVGhlIG1hbmlmZXN0IGNvbnN0YW50cyB0aGF0IHNtYWxsY2FwcyBjdXJyZW50bHkgdXNlcyBmb3IgdmFsdWVzOlxuICogICogYCN1bmRlZmluZWRgXG4gKiAgKiBgI05hTmBcbiAqICAqIGAjSW5maW5pdHlgXG4gKiAgKiBgIy1JbmZpbml0eWBcbiAqXG4gKiBhbmQgZm9yIHByb3BlcnR5IG5hbWVzIGFuYWxvZ291cyB0byBjYXBkYXRhIEBxY2xhc3M6XG4gKiAgKiBgI3RhZ2BcbiAqICAqIGAjZXJyb3JgXG4gKlxuICogQWxsIG90aGVyIGVuY29kZWQgc3RyaW5ncyBiZWdpbm5pbmcgd2l0aCBgI2AgYXJlIHJlc2VydmVkIGZvclxuICogZnV0dXJlIHVzZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZW5jb2RlZFN0clxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IHN0YXJ0c1NwZWNpYWw9KGVuY29kZWRTdHIpPT57XG5pZihlbmNvZGVkU3RyPT09Jycpe1xucmV0dXJuIGZhbHNlO1xuIH1cbi8qIGNoYXJDb2RlQXQoMCkgYW5kIG51bWJlciBjb21wYXJlIGlzIGEgYml0IGZhc3Rlci4qL1xuY29uc3QgY29kZT1lbmNvZGVkU3RyLmNoYXJDb2RlQXQoMCk7XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgeW9kYSovXG5yZXR1cm4gQkFORzw9Y29kZSYmY29kZTw9REFTSDtcbiB9O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEVuY29kZVRvU21hbGxjYXBzT3B0aW9uc1xuICogQHByb3BlcnR5IHsoXG4gKiAgIHJlbW90YWJsZTogUmVtb3RhYmxlLFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBTbWFsbGNhcHNFbmNvZGluZ1xuICogKSA9PiBTbWFsbGNhcHNFbmNvZGluZ30gW2VuY29kZVJlbW90YWJsZVRvU21hbGxjYXBzXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIHByb21pc2U6IFByb21pc2UsXG4gKiAgIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IFNtYWxsY2Fwc0VuY29kaW5nXG4gKiApID0+IFNtYWxsY2Fwc0VuY29kaW5nfSBbZW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIGVycm9yOiBFcnJvcixcbiAqICAgZW5jb2RlUmVjdXI6IChwOiBQYXNzYWJsZSkgPT4gU21hbGxjYXBzRW5jb2RpbmdcbiAqICkgPT4gU21hbGxjYXBzRW5jb2Rpbmd9IFtlbmNvZGVFcnJvclRvU21hbGxjYXBzXVxuICovXG5cbmNvbnN0IGRvbnRFbmNvZGVSZW1vdGFibGVUb1NtYWxsY2Fwcz0ocmVtKT0+XG5GYWlsIGByZW1vdGFibGUgdW5leHBlY3RlZDogJHtyZW19YDtcblxuY29uc3QgZG9udEVuY29kZVByb21pc2VUb1NtYWxsY2Fwcz0ocHJvbSk9PkZhaWwgYHByb21pc2UgdW5leHBlY3RlZDogJHtwcm9tfWA7XG5cbmNvbnN0IGRvbnRFbmNvZGVFcnJvclRvU21hbGxjYXBzPShlcnIpPT5cbkZhaWwgYGVycm9yIG9iamVjdCB1bmV4cGVjdGVkOiAke3EoZXJyKX1gO1xuXG4vKipcbiAqIEBwYXJhbSB7RW5jb2RlVG9TbWFsbGNhcHNPcHRpb25zfSBbZW5jb2RlT3B0aW9uc11cbiAqIGVuY29kZU9wdGlvbnMgaXMgYWN0dWFsbHkgb3B0aW9uYWwsIGJ1dCBub3QgbWFya2VkIGFzIHN1Y2ggdG8gd29yayBhcm91bmRcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvNTAyODZcbiAqXG4gKiBAcmV0dXJucyB7KHBhc3NhYmxlOiBQYXNzYWJsZSkgPT4gU21hbGxjYXBzRW5jb2Rpbmd9XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlRW5jb2RlVG9TbWFsbGNhcHM9KGVuY29kZU9wdGlvbnM9e30pPT57XG5jb25zdHtcbmVuY29kZVJlbW90YWJsZVRvU21hbGxjYXBzPWRvbnRFbmNvZGVSZW1vdGFibGVUb1NtYWxsY2FwcyxcbmVuY29kZVByb21pc2VUb1NtYWxsY2Fwcz1kb250RW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzLFxuZW5jb2RlRXJyb3JUb1NtYWxsY2Fwcz1kb250RW5jb2RlRXJyb3JUb1NtYWxsY2Fwc309XG5lbmNvZGVPcHRpb25zO1xuXG5jb25zdCBhc3NlcnRFbmNvZGVkRXJyb3I9KGVuY29kaW5nKT0+e1xudHlwZW9mIGVuY29kaW5nPT09J29iamVjdCcmJmhhc093blByb3BlcnR5T2YoZW5jb2RpbmcsJyNlcnJvcicpfHxcbkZhaWwgYGludGVybmFsOiBFcnJvciBlbmNvZGluZyBtdXN0IGhhdmUgXCIjZXJyb3JcIiBwcm9wZXJ0eTogJHtxKFxuZW5jb2RpbmcpXG4gfWA7XG4vKiBBc3NlcnQgdGhhdCB0aGUgI2Vycm9yIHByb3BlcnR5IGRlY29kZXMgdG8gYSBzdHJpbmcuKi9cbmNvbnN0IG1lc3NhZ2U9ZW5jb2RpbmdbJyNlcnJvciddO1xudHlwZW9mIG1lc3NhZ2U9PT0nc3RyaW5nJyYmKFxuIXN0YXJ0c1NwZWNpYWwobWVzc2FnZSl8fG1lc3NhZ2Uuc3RhcnRzV2l0aCgnIScpKXx8XG5GYWlsIGBpbnRlcm5hbDogRXJyb3IgZW5jb2RpbmcgbXVzdCBoYXZlIHN0cmluZyBtZXNzYWdlOiAke3EobWVzc2FnZSl9YDtcbiB9O1xuXG4vKipcbiAqIE11c3QgZW5jb2RlIGB2YWxgIGludG8gcGxhaW4gSlNPTiBkYXRhICpjYW5vbmljYWxseSosIHN1Y2ggdGhhdFxuICogYEpTT04uc3RyaW5naWZ5KGVuY29kZSh2MSkpID09PSBKU09OLnN0cmluZ2lmeShlbmNvZGUodjEpKWAuIEZvciBtb3N0XG4gKiBlbmNvZGluZ3MsIHRoZSBvcmRlciBvZiBwcm9wZXJ0aWVzIG9mIGVhY2ggbm9kZSBvZiB0aGUgb3V0cHV0XG4gKiBzdHJ1Y3R1cmUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgYWxnb3JpdGhtIGJlbG93IHdpdGhvdXQgc3BlY2lhbFxuICogYXJyYW5nZW1lbnQsIHVzdWFsbHkgYnkgYmVpbmcgZXhwcmVzc2VkIGRpcmVjdGx5IGFzIGFuIG9iamVjdCBsaXRlcmFsLlxuICogVGhlIGV4Y2VwdGlvbiBpcyBjb3B5UmVjb3Jkcywgd2hvc2UgbmF0dXJhbCBlbnVtZXJhdGlvbiBvcmRlclxuICogY2FuIGRpZmZlciBiZXR3ZWVuIGNvcHlSZWNvcmRzIHRoYXQgb3VyIGRpc3RyaWJ1dGVkIG9iamVjdCBzZW1hbnRpY3NcbiAqIGNvbnNpZGVycyB0byBiZSBlcXVpdmFsZW50LlxuICogU2luY2UsIGZvciBlYWNoIGNvcHlSZWNvcmQsIHdlIG9ubHkgYWNjZXB0IHN0cmluZyBwcm9wZXJ0eSBuYW1lcyxcbiAqIG5vdCBzeW1ib2xzLCB3ZSBjYW4gY2Fub25pY2FsbHkgc29ydCB0aGUgbmFtZXMgZmlyc3QuXG4gKiBKU09OLnN0cmluZ2lmeSB3aWxsIHRoZW4gdmlzaXQgdGhlc2UgaW4gdGhhdCBzb3J0ZWQgb3JkZXIuXG4gKlxuICogRW5jb2Rpbmcgd2l0aCBhIGNhbm9uaWNhbC1KU09OIGVuY29kZXIgd291bGQgYWxzbyBzb2x2ZSB0aGlzIGNhbm9uaWNhbG5lc3NcbiAqIHByb2JsZW0gaW4gYSBtb3JlIG1vZHVsYXIgYW5kIGVuY2Fwc3VsYXRlZCBtYW5uZXIuIE5vdGUgdGhhdCB0aGVcbiAqIGFjdHVhbCBvcmRlciBwcm9kdWNlZCBoZXJlLCB0aG91Z2ggaXQgYWdyZWVzIHdpdGggY2Fub25pY2FsLUpTT04gb25cbiAqIGNvcHlSZWNvcmQgcHJvcGVydHkgb3JkZXJpbmcsIGRpZmZlcnMgZnJvbSBjYW5vbmljYWwtSlNPTiBhcyBhIHdob2xlXG4gKiBpbiB0aGF0IHRoZSBvdGhlciByZWNvcmQgcHJvcGVydGllcyBhcmUgdmlzaXRlZCBpbiB0aGUgb3JkZXIgaW4gd2hpY2hcbiAqIHRoZXkgYXJlIGxpdGVyYWxseSB3cml0dGVuIGJlbG93LiBUT0RPIHBlcmhhcHMgd2Ugc2hvdWxkIGluZGVlZCBzd2l0Y2hcbiAqIHRvIGEgY2Fub25pY2FsIEpTT04gZW5jb2RlciwgYW5kIG5vdCBkZWxpY2F0ZWx5IGRlcGVuZCBvbiB0aGUgb3JkZXJcbiAqIGluIHdoaWNoIHRoZXNlIG9iamVjdCBsaXRlcmFscyBhcmUgd3JpdHRlbi5cbiAqXG4gKiBSZWFkZXJzIG11c3Qgbm90IGNhcmUgYWJvdXQgdGhpcyBvcmRlciBhbnl3YXkuIFdlIGltcG9zZSB0aGlzIHJlcXVpcmVtZW50XG4gKiBtYWlubHkgdG8gcmVkdWNlIG5vbi1kZXRlcm1pbmlzbSBleHBvc2VkIG91dHNpZGUgYSB2YXQuXG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gcGFzc2FibGVcbiAqIEByZXR1cm5zIHtTbWFsbGNhcHNFbmNvZGluZ30gZXhjZXB0IHRoYXQgYGVuY29kZVRvU21hbGxjYXBzYCBkb2VzIG5vdCBnZW5lcmFsbHlcbiAqIGBoYXJkZW5gIHRoaXMgcmVzdWx0IGJlZm9yZSByZXR1cm5pbmcuIFJhdGhlciwgYGVuY29kZVRvU21hbGxjYXBzYCBpcyBub3RcbiAqIGRpcmVjdGx5IGV4cG9zZWQuXG4gKiBXaGF0J3MgZXhwb3NlZCBpbnN0ZWFkIGlzIGEgd3JhcHBlciB0aGF0IGZyZWV6ZXMgdGhlIG91dHB1dCBiZWZvcmVcbiAqIHJldHVybmluZy4gSWYgdGhpcyB0dXJucyBvdXQgdG8gaW1wZWRlIHN0YXRpYyBhbmFseXNpcyBmb3IgYGhhcmRlbmAgc2FmZXR5LFxuICogd2UgY2FuIGFsd2F5cyBwdXQgdGhlIChub3cgcmVkdW5kYW50KSBoYXJkZW5zIGJhY2sgaW4uIFRoZXkgZG9uJ3QgaHVydC5cbiAqL1xuY29uc3QgZW5jb2RlVG9TbWFsbGNhcHNSZWN1cj0ocGFzc2FibGUpPT57XG4vKiBGaXJzdCB3ZSBoYW5kbGUgYWxsIHByaW1pdGl2ZXMuIFNvbWUgY2FuIGJlIHJlcHJlc2VudGVkIGRpcmVjdGx5IGFzKi9cbi8qIEpTT04sIGFuZCBzb21lIG11c3QgYmUgZW5jb2RlZCBpbnRvIHNtYWxsY2FwcyBzdHJpbmdzLiovXG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YocGFzc2FibGUpO1xuc3dpdGNoKHBhc3NTdHlsZSl7XG5jYXNlJ251bGwnOlxuY2FzZSdib29sZWFuJzp7XG4vKiBwYXNzIHRocm91Z2ggdG8gSlNPTiovXG5yZXR1cm4gcGFzc2FibGU7XG4gfVxuY2FzZSdzdHJpbmcnOntcbmlmKHN0YXJ0c1NwZWNpYWwocGFzc2FibGUpKXtcbi8qIFN0cmluZ3MgdGhhdCBzdGFydCB3aXRoIGEgc3BlY2lhbCBjaGFyIGFyZSBxdW90ZWQgd2l0aCBgIWAuKi9cbi8qIFNpbmNlIGAhYCBpcyBpdHNlbGYgYSBzcGVjaWFsIGNoYXJhY3RlciwgdGhpcyB0cml2aWFsbHkgZG9lcyovXG4vKiB0aGUgSGlsYmVydCBob3RlbC4gQWxzbywgc2luY2UgdGhlIHNwZWNpYWwgY2hhcmFjdGVycyBhcmUqL1xuLyogYSBjb250aW51b3VzIHN1YnJhbmdlIG9mIGFzY2lpLCB0aGlzIHF1b3RpbmcgaXMgc29ydC1vcmRlciovXG4vKiBwcmVzZXJ2aW5nLiovXG5yZXR1cm4gYCEke3Bhc3NhYmxlfWA7XG4gfVxuLyogQWxsIG90aGVyIHN0cmluZ3MgcGFzcyB0aHJvdWdoIHRvIEpTT04qL1xucmV0dXJuIHBhc3NhYmxlO1xuIH1cbmNhc2UndW5kZWZpbmVkJzp7XG5yZXR1cm4nI3VuZGVmaW5lZCc7XG4gfVxuY2FzZSdudW1iZXInOntcbi8qIFNwZWNpYWwtY2FzZSBudW1iZXJzIHdpdGggbm8gZGlnaXQtYmFzZWQgcmVwcmVzZW50YXRpb24uKi9cbmlmKE51bWJlci5pc05hTihwYXNzYWJsZSkpe1xucmV0dXJuJyNOYU4nO1xuIH1lbHNlIGlmKHBhc3NhYmxlPT09SW5maW5pdHkpe1xucmV0dXJuJyNJbmZpbml0eSc7XG4gfWVsc2UgaWYocGFzc2FibGU9PT0tSW5maW5pdHkpe1xucmV0dXJuJyMtSW5maW5pdHknO1xuIH1cbi8qIFBhc3MgdGhyb3VnaCBldmVyeXRoaW5nIGVsc2UsIHJlcGxhY2luZyAtMCB3aXRoIDAuKi9cbnJldHVybiBpcyhwYXNzYWJsZSwtMCk/MDpwYXNzYWJsZTtcbiB9XG5jYXNlJ2JpZ2ludCc6e1xuY29uc3Qgc3RyPVN0cmluZyhwYXNzYWJsZSk7XG5yZXR1cm4gKC8qKiBAdHlwZSB7YmlnaW50fSAqL3Bhc3NhYmxlPDBuP3N0cjpgKyR7c3RyfWApO1xuIH1cbmNhc2Unc3ltYm9sJzp7XG5hc3NlcnRQYXNzYWJsZVN5bWJvbChwYXNzYWJsZSk7XG5jb25zdCBuYW1lPS8qKiBAdHlwZSB7c3RyaW5nfSAqL25hbWVGb3JQYXNzYWJsZVN5bWJvbChwYXNzYWJsZSk7XG5yZXR1cm4gYCUke25hbWV9YDtcbiB9XG5jYXNlJ2NvcHlSZWNvcmQnOntcbi8qIEN1cnJlbnRseSBjb3B5UmVjb3JkIGFsbG93cyBvbmx5IHN0cmluZyBrZXlzIHNvIHRoaXMgd2lsbCovXG4vKiB3b3JrLiBJZiB3ZSBhbGxvdyBzb3J0YWJsZSBzeW1ib2wga2V5cywgdGhpcyB3aWxsIG5lZWQgdG8qL1xuLyogYmVjb21lIG1vcmUgaW50ZXJlc3RpbmcuKi9cbmNvbnN0IG5hbWVzPW93bktleXMocGFzc2FibGUpLnNvcnQoKTtcbnJldHVybiBmcm9tRW50cmllcyhcbm5hbWVzLm1hcCgobmFtZSk9PltcbmVuY29kZVRvU21hbGxjYXBzUmVjdXIobmFtZSksXG5lbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKHBhc3NhYmxlW25hbWVdKV0pKTtcblxuXG4gfVxuY2FzZSdjb3B5QXJyYXknOntcbnJldHVybiBwYXNzYWJsZS5tYXAoZW5jb2RlVG9TbWFsbGNhcHNSZWN1cik7XG4gfVxuY2FzZSd0YWdnZWQnOntcbnJldHVybntcbicjdGFnJzplbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKGdldFRhZyhwYXNzYWJsZSkpLFxucGF5bG9hZDplbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKHBhc3NhYmxlLnBheWxvYWQpfTtcblxuIH1cbmNhc2UncmVtb3RhYmxlJzp7XG5jb25zdCByZXN1bHQ9ZW5jb2RlUmVtb3RhYmxlVG9TbWFsbGNhcHMoXG5wYXNzYWJsZSxcbmVuY29kZVRvU21hbGxjYXBzUmVjdXIpO1xuXG5pZih0eXBlb2YgcmVzdWx0PT09J3N0cmluZycmJnJlc3VsdC5zdGFydHNXaXRoKCckJykpe1xucmV0dXJuIHJlc3VsdDtcbiB9XG4vKiBgdGhyb3dgIGlzIG5vb3Agc2luY2UgYEZhaWxgIHRocm93cy4gQnV0IGxpbnRlciBjb25mdXNlZCovXG50aHJvdyBGYWlsIGBpbnRlcm5hbDogUmVtb3RhYmxlIGVuY29kaW5nIG11c3Qgc3RhcnQgd2l0aCBcIiRcIjogJHtyZXN1bHR9YDtcbiB9XG5jYXNlJ3Byb21pc2UnOntcbmNvbnN0IHJlc3VsdD1lbmNvZGVQcm9taXNlVG9TbWFsbGNhcHMoXG5wYXNzYWJsZSxcbmVuY29kZVRvU21hbGxjYXBzUmVjdXIpO1xuXG5pZih0eXBlb2YgcmVzdWx0PT09J3N0cmluZycmJnJlc3VsdC5zdGFydHNXaXRoKCcmJykpe1xucmV0dXJuIHJlc3VsdDtcbiB9XG50aHJvdyBGYWlsIGBpbnRlcm5hbDogUHJvbWlzZSBlbmNvZGluZyBtdXN0IHN0YXJ0IHdpdGggXCImXCI6ICR7cmVzdWx0fWA7XG4gfVxuY2FzZSdlcnJvcic6e1xuY29uc3QgcmVzdWx0PWVuY29kZUVycm9yVG9TbWFsbGNhcHMocGFzc2FibGUsZW5jb2RlVG9TbWFsbGNhcHNSZWN1cik7XG5hc3NlcnRFbmNvZGVkRXJyb3IocmVzdWx0KTtcbnJldHVybiByZXN1bHQ7XG4gfVxuZGVmYXVsdDp7XG50aHJvdyBhc3NlcnQuZmFpbChcblggYGludGVybmFsOiBVbnJlY29nbml6ZWQgcGFzc1N0eWxlICR7cShwYXNzU3R5bGUpfWAsXG5UeXBlRXJyb3IpO1xuXG4gfX1cblxuIH07XG5jb25zdCBlbmNvZGVUb1NtYWxsY2Fwcz0ocGFzc2FibGUpPT57XG5pZihpc0Vycm9yTGlrZShwYXNzYWJsZSkpe1xuLyogV2UgcHVsbCBvdXQgdGhpcyBzcGVjaWFsIGNhc2UgdG8gYWNjb21tb2RhdGUgZXJyb3JzIHRoYXQgYXJlIG5vdCovXG4vKiB2YWxpZCBQYXNzYWJsZXMuIEZvciBleGFtcGxlLCBiZWNhdXNlIHRoZXkncmUgbm90IGZyb3plbi4qL1xuLyogVGhlIHNwZWNpYWwgY2FzZSBjYW4gb25seSBldmVyIGFwcGx5IGF0IHRoZSByb290LCBhbmQgdGhlcmVmb3JlKi9cbi8qIG91dHNpZGUgdGhlIHJlY3Vyc2lvbiwgc2luY2UgYW4gZXJyb3IgY291bGQgb25seSBiZSBkZWVwZXIgaW4qL1xuLyogYSBwYXNzYWJsZSBzdHJ1Y3R1cmUgaWYgaXQgd2VyZSBwYXNzYWJsZS4qL1xuLyoqL1xuLyogV2UgcHVsbCBvdXQgdGhpcyBzcGVjaWFsIGNhc2UgYmVjYXVzZSwgZm9yIHRoZXNlIGVycm9ycywgd2UncmUgbXVjaCovXG4vKiBtb3JlIGludGVyZXN0ZWQgaW4gcmVwb3J0aW5nIHdoYXRldmVyIGRpYWdub3N0aWMgaW5mb3JtYXRpb24gdGhleSovXG4vKiBjYXJyeSB0aGFuIHdlIGFyZSBhYm91dCByZXBvcnRpbmcgcHJvYmxlbXMgZW5jb3VudGVyZWQgaW4gcmVwb3J0aW5nKi9cbi8qIHRoaXMgaW5mb3JtYXRpb24uKi9cbmNvbnN0IHJlc3VsdD1oYXJkZW4oXG5lbmNvZGVFcnJvclRvU21hbGxjYXBzKHBhc3NhYmxlLGVuY29kZVRvU21hbGxjYXBzUmVjdXIpKTtcblxuYXNzZXJ0RW5jb2RlZEVycm9yKHJlc3VsdCk7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbnJldHVybiBoYXJkZW4oZW5jb2RlVG9TbWFsbGNhcHNSZWN1cihwYXNzYWJsZSkpO1xuIH07XG5yZXR1cm4gaGFyZGVuKGVuY29kZVRvU21hbGxjYXBzKTtcbiB9OyRo4oCNX29uY2UubWFrZUVuY29kZVRvU21hbGxjYXBzKG1ha2VFbmNvZGVUb1NtYWxsY2Fwcyk7XG5oYXJkZW4obWFrZUVuY29kZVRvU21hbGxjYXBzKTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBEZWNvZGVGcm9tU21hbGxjYXBzT3B0aW9uc1xuICogQHByb3BlcnR5IHsoXG4gKiAgIGVuY29kZWRSZW1vdGFibGU6IFNtYWxsY2Fwc0VuY29kaW5nLFxuICogICBkZWNvZGVSZWN1cjogKGUgOlNtYWxsY2Fwc0VuY29kaW5nKSA9PiBQYXNzYWJsZVxuICogKSA9PiBSZW1vdGFibGV9IFtkZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIGVuY29kZWRQcm9taXNlOiBTbWFsbGNhcHNFbmNvZGluZyxcbiAqICAgZGVjb2RlUmVjdXI6IChlIDpTbWFsbGNhcHNFbmNvZGluZykgPT4gUGFzc2FibGVcbiAqICkgPT4gUHJvbWlzZX0gW2RlY29kZVByb21pc2VGcm9tU21hbGxjYXBzXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIGVuY29kZWRFcnJvcjogU21hbGxjYXBzRW5jb2RpbmcsXG4gKiAgIGRlY29kZVJlY3VyOiAoZSA6U21hbGxjYXBzRW5jb2RpbmcpID0+IFBhc3NhYmxlXG4gKiApID0+IEVycm9yfSBbZGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzXVxuICovXG5cbmNvbnN0IGRvbnREZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzPShlbmNvZGluZyk9PlxuRmFpbCBgcmVtb3RhYmxlIHVuZXhwZWN0ZWQ6ICR7ZW5jb2Rpbmd9YDtcbmNvbnN0IGRvbnREZWNvZGVQcm9taXNlRnJvbVNtYWxsY2Fwcz0oZW5jb2RpbmcpPT5cbkZhaWwgYHByb21pc2UgdW5leHBlY3RlZDogJHtlbmNvZGluZ31gO1xuY29uc3QgZG9udERlY29kZUVycm9yRnJvbVNtYWxsY2Fwcz0oZW5jb2RpbmcpPT5cbkZhaWwgYGVycm9yIHVuZXhwZWN0ZWQ6ICR7cShlbmNvZGluZyl9YDtcblxuLyoqXG4gKiBAcGFyYW0ge0RlY29kZUZyb21TbWFsbGNhcHNPcHRpb25zfSBbZGVjb2RlT3B0aW9uc11cbiAqIEByZXR1cm5zIHsoZW5jb2RlZDogU21hbGxjYXBzRW5jb2RpbmcpID0+IFBhc3NhYmxlfVxuICovXG5jb25zdCAgICAgICAgbWFrZURlY29kZUZyb21TbWFsbGNhcHM9KGRlY29kZU9wdGlvbnM9e30pPT57XG5jb25zdHtcbmRlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHM9ZG9udERlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHMsXG5kZWNvZGVQcm9taXNlRnJvbVNtYWxsY2Fwcz1kb250RGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHMsXG5kZWNvZGVFcnJvckZyb21TbWFsbGNhcHM9ZG9udERlY29kZUVycm9yRnJvbVNtYWxsY2Fwc309XG5kZWNvZGVPcHRpb25zO1xuXG4vKipcbiAqIGBkZWNvZGVGcm9tU21hbGxjYXBzYCBtYXkgcmVseSBvbiBgZW5jb2RpbmdgIGJlaW5nIHRoZSByZXN1bHQgb2YgYVxuICogcGxhaW4gY2FsbCB0byBKU09OLnBhcnNlLiBIb3dldmVyLCBpdCAqY2Fubm90KiByZWx5IG9uIGBlbmNvZGluZ2BcbiAqIGhhdmluZyBiZWVuIHByb2R1Y2VkIGJ5IEpTT04uc3RyaW5naWZ5IG9uIHRoZSBvdXRwdXQgb2YgYGVuY29kZVRvU21hbGxjYXBzYFxuICogYWJvdmUsIGkuZS4sIGBkZWNvZGVGcm9tU21hbGxjYXBzYCBjYW5ub3QgcmVseSBvbiBgZW5jb2RpbmdgIGJlaW5nIGFcbiAqIHZhbGlkIG1hcnNoYWxsZWQgcmVwcmVzZW50YXRpb24uIFJhdGhlciwgYGRlY29kZUZyb21TbWFsbGNhcHNgIG11c3RcbiAqIHZhbGlkYXRlIHRoYXQuXG4gKlxuICogQHBhcmFtIHtTbWFsbGNhcHNFbmNvZGluZ30gZW5jb2RpbmcgbXVzdCBiZSBoYXJkZW5lZFxuICovXG5jb25zdCBkZWNvZGVGcm9tU21hbGxjYXBzPShlbmNvZGluZyk9PntcbnN3aXRjaCh0eXBlb2YgZW5jb2Rpbmcpe1xuY2FzZSdib29sZWFuJzpcbmNhc2UnbnVtYmVyJzp7XG5yZXR1cm4gZW5jb2Rpbmc7XG4gfVxuY2FzZSdzdHJpbmcnOntcbmlmKCFzdGFydHNTcGVjaWFsKGVuY29kaW5nKSl7XG5yZXR1cm4gZW5jb2Rpbmc7XG4gfVxuY29uc3QgYz1lbmNvZGluZy5jaGFyQXQoMCk7XG5zd2l0Y2goYyl7XG5jYXNlJyEnOntcbi8qIHVuLWhpbGJlcnQtaWZ5IHRoZSBzdHJpbmcqL1xucmV0dXJuIGVuY29kaW5nLnNsaWNlKDEpO1xuIH1cbmNhc2UnJSc6e1xucmV0dXJuIHBhc3NhYmxlU3ltYm9sRm9yTmFtZShlbmNvZGluZy5zbGljZSgxKSk7XG4gfVxuY2FzZScjJzp7XG5zd2l0Y2goZW5jb2Rpbmcpe1xuY2FzZScjdW5kZWZpbmVkJzp7XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH1cbmNhc2UnI05hTic6e1xucmV0dXJuIE5hTjtcbiB9XG5jYXNlJyNJbmZpbml0eSc6e1xucmV0dXJuIEluZmluaXR5O1xuIH1cbmNhc2UnIy1JbmZpbml0eSc6e1xucmV0dXJuLUluZmluaXR5O1xuIH1cbmRlZmF1bHQ6e1xudGhyb3cgYXNzZXJ0LmZhaWwoXG5YIGB1bmtub3duIGNvbnN0YW50IFwiJHtxKGVuY29kaW5nKX1cImAsXG5UeXBlRXJyb3IpO1xuXG4gfX1cblxuIH1cbmNhc2UnKyc6XG5jYXNlJy0nOntcbnJldHVybiBCaWdJbnQoZW5jb2RpbmcpO1xuIH1cbmNhc2UnJCc6e1xuY29uc3QgcmVzdWx0PWRlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHMoXG5lbmNvZGluZyxcbmRlY29kZUZyb21TbWFsbGNhcHMpO1xuXG5pZihwYXNzU3R5bGVPZihyZXN1bHQpIT09J3JlbW90YWJsZScpe1xuRmFpbCBgaW50ZXJuYWw6IGRlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHMgb3B0aW9uIG11c3QgcmV0dXJuIGEgcmVtb3RhYmxlOiAke3Jlc3VsdH1gO1xuIH1cbnJldHVybiByZXN1bHQ7XG4gfVxuY2FzZScmJzp7XG5jb25zdCByZXN1bHQ9ZGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHMoXG5lbmNvZGluZyxcbmRlY29kZUZyb21TbWFsbGNhcHMpO1xuXG5pZihwYXNzU3R5bGVPZihyZXN1bHQpIT09J3Byb21pc2UnKXtcbkZhaWwgYGludGVybmFsOiBkZWNvZGVQcm9taXNlRnJvbVNtYWxsY2FwcyBvcHRpb24gbXVzdCByZXR1cm4gYSBwcm9taXNlOiAke3Jlc3VsdH1gO1xuIH1cbnJldHVybiByZXN1bHQ7XG4gfVxuZGVmYXVsdDp7XG50aHJvdyBGYWlsIGBTcGVjaWFsIGNoYXIgJHtxKFxuYylcbiB9IHJlc2VydmVkIGZvciBmdXR1cmUgdXNlOiAke2VuY29kaW5nfWA7XG4gfX1cblxuIH1cbmNhc2Unb2JqZWN0Jzp7XG5pZihlbmNvZGluZz09PW51bGwpe1xucmV0dXJuIGVuY29kaW5nO1xuIH1cblxuaWYoaXNBcnJheShlbmNvZGluZykpe1xucmV0dXJuIGVuY29kaW5nLm1hcCgodmFsKT0+ZGVjb2RlRnJvbVNtYWxsY2Fwcyh2YWwpKTtcbiB9XG5cbmlmKGhhc093blByb3BlcnR5T2YoZW5jb2RpbmcsJyN0YWcnKSl7XG5jb25zdHsnI3RhZyc6dGFnLHBheWxvYWQsLi4ucmVzdH09ZW5jb2Rpbmc7XG50eXBlb2YgdGFnPT09J3N0cmluZyd8fFxuRmFpbCBgVmFsdWUgb2YgXCIjdGFnXCIsIHRoZSB0YWcsIG11c3QgYmUgYSBzdHJpbmc6ICR7ZW5jb2Rpbmd9YDtcbm93bktleXMocmVzdCkubGVuZ3RoPT09MHx8XG5GYWlsIGAjdGFnIHJlY29yZCB1bmV4cGVjdGVkIHByb3BlcnRpZXM6ICR7cShvd25LZXlzKHJlc3QpKX1gO1xucmV0dXJuIG1ha2VUYWdnZWQoXG5kZWNvZGVGcm9tU21hbGxjYXBzKHRhZyksXG5kZWNvZGVGcm9tU21hbGxjYXBzKHBheWxvYWQpKTtcblxuIH1cblxuaWYoaGFzT3duUHJvcGVydHlPZihlbmNvZGluZywnI2Vycm9yJykpe1xuY29uc3QgcmVzdWx0PWRlY29kZUVycm9yRnJvbVNtYWxsY2FwcyhcbmVuY29kaW5nLFxuZGVjb2RlRnJvbVNtYWxsY2Fwcyk7XG5cbnBhc3NTdHlsZU9mKHJlc3VsdCk9PT0nZXJyb3InfHxcbkZhaWwgYGludGVybmFsOiBkZWNvZGVFcnJvckZyb21TbWFsbGNhcHMgb3B0aW9uIG11c3QgcmV0dXJuIGFuIGVycm9yOiAke3Jlc3VsdH1gO1xucmV0dXJuIHJlc3VsdDtcbiB9XG5cbmNvbnN0IGRlY29kZUVudHJ5PShbZW5jb2RlZE5hbWUsZW5jb2RlZFZhbF0pPT57XG50eXBlb2YgZW5jb2RlZE5hbWU9PT0nc3RyaW5nJ3x8XG5GYWlsIGBQcm9wZXJ0eSBuYW1lICR7cShcbmVuY29kZWROYW1lKVxuIH0gb2YgJHtlbmNvZGluZ30gbXVzdCBiZSBhIHN0cmluZ2A7XG4hZW5jb2RlZE5hbWUuc3RhcnRzV2l0aCgnIycpfHxcbkZhaWwgYFVucmVjb2duaXplZCByZWNvcmQgdHlwZSAke3EoZW5jb2RlZE5hbWUpfTogJHtlbmNvZGluZ31gO1xuY29uc3QgbmFtZT1kZWNvZGVGcm9tU21hbGxjYXBzKGVuY29kZWROYW1lKTtcbnR5cGVvZiBuYW1lPT09J3N0cmluZyd8fFxuRmFpbCBgRGVjb2RlZCBwcm9wZXJ0eSBuYW1lICR7bmFtZX0gZnJvbSAke2VuY29kaW5nfSBtdXN0IGJlIGEgc3RyaW5nYDtcbnJldHVybltuYW1lLGRlY29kZUZyb21TbWFsbGNhcHMoZW5jb2RlZFZhbCldO1xuIH07XG5jb25zdCBkZWNvZGVkRW50cmllcz1lbnRyaWVzKGVuY29kaW5nKS5tYXAoZGVjb2RlRW50cnkpO1xucmV0dXJuIGZyb21FbnRyaWVzKGRlY29kZWRFbnRyaWVzKTtcbiB9XG5kZWZhdWx0OntcbnRocm93IGFzc2VydC5mYWlsKFxuWCBgaW50ZXJuYWw6IHVucmVjb2duaXplZCBKU09OIHR5cGVvZiAke3EoXG50eXBlb2YgZW5jb2RpbmcpXG4gfTogJHtlbmNvZGluZ31gLFxuVHlwZUVycm9yKTtcblxuIH19XG5cbiB9O1xucmV0dXJuIGhhcmRlbihkZWNvZGVGcm9tU21hbGxjYXBzKTtcbiB9OyRo4oCNX29uY2UubWFrZURlY29kZUZyb21TbWFsbGNhcHMobWFrZURlY29kZUZyb21TbWFsbGNhcHMpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VFbmNvZGVUb1NtYWxsY2FwcyI6WyJtYWtlRW5jb2RlVG9TbWFsbGNhcHMiXSwibWFrZURlY29kZUZyb21TbWFsbGNhcHMiOlsibWFrZURlY29kZUZyb21TbWFsbGNhcHMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAhap7FwMrAAADKwAAKgAAAEBlbmRvL21hcnNoYWwtdjAuOC45L3NyYy9tYXJzaGFsLWp1c3Rpbi5qc3siaW1wb3J0cyI6WyJAZW5kby9uYXQiLCJAZW5kby9wYXNzLXN0eWxlIiwiLi9lbmNvZGVUb0NhcERhdGEuanMiXSwiZXhwb3J0cyI6WyJkZWNvZGVUb0p1c3RpbiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBOYXQsZ2V0RXJyb3JDb25zdHJ1Y3Rvcixpc09iamVjdCxwYXNzYWJsZVN5bWJvbEZvck5hbWUsUUNMQVNTOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL25hdFwiLCBbW1wiTmF0XCIsIFskaOKAjV9hID0+IChOYXQgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiZ2V0RXJyb3JDb25zdHJ1Y3RvclwiLCBbJGjigI1fYSA9PiAoZ2V0RXJyb3JDb25zdHJ1Y3RvciA9ICRo4oCNX2EpXV0sW1wiaXNPYmplY3RcIiwgWyRo4oCNX2EgPT4gKGlzT2JqZWN0ID0gJGjigI1fYSldXSxbXCJwYXNzYWJsZVN5bWJvbEZvck5hbWVcIiwgWyRo4oCNX2EgPT4gKHBhc3NhYmxlU3ltYm9sRm9yTmFtZSA9ICRo4oCNX2EpXV1dXSxbXCIuL2VuY29kZVRvQ2FwRGF0YS5qc1wiLCBbW1wiUUNMQVNTXCIsIFskaOKAjV9hID0+IChRQ0xBU1MgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkVuY29kaW5nfSBFbmNvZGluZyAqL1xuLyoqIEB0ZW1wbGF0ZSBUIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuQ2FwRGF0YTxUPn0gQ2FwRGF0YSAqL1xuXG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuY29uc3R7aXNBcnJheX09QXJyYXk7XG5jb25zdHtzdHJpbmdpZnk6cXVvdGV9PUpTT047XG5jb25zdHtxdW90ZTpxLGRldGFpbHM6WCxGYWlsfT1hc3NlcnQ7XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gSW5kZW50ZXJcbiAqIEBwcm9wZXJ0eSB7KG9wZW5CcmFja2V0OiBzdHJpbmcpID0+IG51bWJlcn0gb3BlblxuICogQHByb3BlcnR5IHsoKSA9PiBudW1iZXJ9IGxpbmVcbiAqIEBwcm9wZXJ0eSB7KHRva2VuOiBzdHJpbmcpID0+IG51bWJlcn0gbmV4dFxuICogQHByb3BlcnR5IHsoY2xvc2VCcmFja2V0OiBzdHJpbmcpID0+IG51bWJlcn0gY2xvc2VcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gc3RyaW5nfSBkb25lXG4gKi9cblxuLyoqXG4gKiBHZW5lcm91cyB3aGl0ZXNwYWNlIGZvciByZWFkYWJpbGl0eVxuICpcbiAqIEByZXR1cm5zIHtJbmRlbnRlcn1cbiAqL1xuY29uc3QgbWFrZVllc0luZGVudGVyPSgpPT57XG5jb25zdCBzdHJpbmdzPVtdO1xubGV0IGxldmVsPTA7XG5sZXQgbmVlZFNwYWNlPWZhbHNlO1xuY29uc3QgbGluZT0oKT0+e1xubmVlZFNwYWNlPWZhbHNlO1xucmV0dXJuIHN0cmluZ3MucHVzaCgnXFxuJywnICAnLnJlcGVhdChsZXZlbCkpO1xuIH07XG5yZXR1cm4gaGFyZGVuKHtcbm9wZW46KG9wZW5CcmFja2V0KT0+e1xubGV2ZWwrPTE7XG5pZihuZWVkU3BhY2Upe1xuc3RyaW5ncy5wdXNoKCcgJyk7XG4gfVxubmVlZFNwYWNlPWZhbHNlO1xucmV0dXJuIHN0cmluZ3MucHVzaChvcGVuQnJhY2tldCk7XG4gfSxcbmxpbmUsXG5uZXh0Oih0b2tlbik9PntcbmlmKG5lZWRTcGFjZSYmdG9rZW4hPT0nLCcpe1xuc3RyaW5ncy5wdXNoKCcgJyk7XG4gfVxubmVlZFNwYWNlPXRydWU7XG5yZXR1cm4gc3RyaW5ncy5wdXNoKHRva2VuKTtcbiB9LFxuY2xvc2U6KGNsb3NlQnJhY2tldCk9PntcbmFzc2VydChsZXZlbD49MSk7XG5sZXZlbC09MTtcbmxpbmUoKTtcbnJldHVybiBzdHJpbmdzLnB1c2goY2xvc2VCcmFja2V0KTtcbiB9LFxuZG9uZTooKT0+e1xuYXNzZXJ0LmVxdWFsKGxldmVsLDApO1xucmV0dXJuIHN0cmluZ3Muam9pbignJyk7XG4gfX0pO1xuXG4gfTtcblxuLyoqXG4gKiBJZiB0aGUgbGFzdCBjaGFyYWN0ZXIgb2Ygb25lIHRva2VuIHRvZ2V0aGVyIHdpdGggdGhlIGZpcnN0IGNoYXJhY3RlclxuICogb2YgdGhlIG5leHQgdG9rZW4gbWF0Y2hlcyB0aGlzIHBhdHRlcm4sIHRoZW4gdGhlIHR3byB0b2tlbnMgbXVzdCBiZVxuICogc2VwYXJhdGVkIGJ5IHdoaXRlc3BhY2UgdG8gcHJlc2VydmUgdGhlaXIgbWVhbmluZy4gT3RoZXJ3aXNlIHRoZVxuICogd2hpdGVzcGFjZSBpbiB1bm5lY2Vzc2FyeS5cbiAqXG4gKiBUaGUgYDwhYCBhbmQgYC0+YCBjYXNlcyBwcmV2ZW50IHRoZSBhY2NpZGVudGFsIGZvcm1hdGlvbiBvZiBhblxuICogaHRtbC1saWtlIGNvbW1lbnQuIEkgZG9uJ3QgdGhpbmsgdGhlIGRvdWJsZSBhbmdsZSBicmFja2V0cyBhcmUgYWN0dWFsbHlcbiAqIG5lZWRlZCBidXQgSSBoYXZlbid0IHRob3VnaHQgYWJvdXQgaXQgZW5vdWdoIHRvIHJlbW92ZSB0aGVtLlxuICovXG5jb25zdCBiYWRQYWlyUGF0dGVybj0vXig/Olxcd1xcd3w8PHw+PnxcXCtcXCt8LS18PCF8LT4pJC87XG5cbi8qKlxuICogTWluaW11bSB3aGl0ZXNwYWNlIG5lZWRlZCB0byBwcmVzZXZlIG1lYW5pbmcuXG4gKlxuICogQHJldHVybnMge0luZGVudGVyfVxuICovXG5jb25zdCBtYWtlTm9JbmRlbnRlcj0oKT0+e1xuLyoqIEB0eXBlIHtzdHJpbmdbXX0gKi9cbmNvbnN0IHN0cmluZ3M9W107XG5yZXR1cm4gaGFyZGVuKHtcbm9wZW46KG9wZW5CcmFja2V0KT0+c3RyaW5ncy5wdXNoKG9wZW5CcmFja2V0KSxcbmxpbmU6KCk9PnN0cmluZ3MubGVuZ3RoLFxubmV4dDoodG9rZW4pPT57XG5pZihzdHJpbmdzLmxlbmd0aD49MSl7XG5jb25zdCBsYXN0PXN0cmluZ3Nbc3RyaW5ncy5sZW5ndGgtMV07XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGVuZG8vcmVzdHJpY3QtY29tcGFyaXNvbi1vcGVyYW5kcyAtLSBlcnJvciovXG5pZihsYXN0Lmxlbmd0aD49MSYmdG9rZW4ubGVuZ3RoPj0xKXtcbmNvbnN0IHBhaXI9IGAke2xhc3RbbGFzdC5sZW5ndGgtMV19JHt0b2tlblswXX1gO1xuaWYoYmFkUGFpclBhdHRlcm4udGVzdChwYWlyKSl7XG5zdHJpbmdzLnB1c2goJyAnKTtcbiB9XG4gfVxuIH1cbnJldHVybiBzdHJpbmdzLnB1c2godG9rZW4pO1xuIH0sXG5jbG9zZTooY2xvc2VCcmFja2V0KT0+e1xuaWYoc3RyaW5ncy5sZW5ndGg+PTEmJnN0cmluZ3Nbc3RyaW5ncy5sZW5ndGgtMV09PT0nLCcpe1xuc3RyaW5ncy5wb3AoKTtcbiB9XG5yZXR1cm4gc3RyaW5ncy5wdXNoKGNsb3NlQnJhY2tldCk7XG4gfSxcbmRvbmU6KCk9PnN0cmluZ3Muam9pbignJyl9KTtcblxuIH07XG5cbmNvbnN0IGlkZW50UGF0dGVybj0vXlthLXpBLVpdXFx3KiQvO1xuaGFyZGVuKGlkZW50UGF0dGVybik7XG5jb25zdCBBdEF0UHJlZml4UGF0dGVybj0vXkBAKC4qKSQvO1xuaGFyZGVuKEF0QXRQcmVmaXhQYXR0ZXJuKTtcblxuLyoqXG4gKiBAcGFyYW0ge0VuY29kaW5nfSBlbmNvZGluZ1xuICogQHBhcmFtIHtib29sZWFuPX0gc2hvdWxkSW5kZW50XG4gKiBAcGFyYW0ge2FueVtdfSBbc2xvdHNdXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5jb25zdCBkZWNvZGVUb0p1c3Rpbj0oZW5jb2Rpbmcsc2hvdWxkSW5kZW50PWZhbHNlLHNsb3RzPVtdKT0+e1xuLyoqXG4gKiBUaGUgZmlyc3QgcGFzcyBkb2VzIHNvbWUgaW5wdXQgdmFsaWRhdGlvbi5cbiAqIEl0cyBjb250cm9sIGZsb3cgc2hvdWxkIG1pcnJvciBgcmVjdXJgIGFzIGNsb3NlbHkgYXMgcG9zc2libGVcbiAqIGFuZCB0aGUgdHdvIHNob3VsZCBiZSBtYWludGFpbmVkIHRvZ2V0aGVyLiBUaGV5IG11c3QgdmlzaXQgZXZlcnl0aGluZ1xuICogaW4gdGhlIHNhbWUgb3JkZXIuXG4gKlxuICogVE9ETyBub3cgdGhhdCBpYmlkcyBhcmUgZ29uZSwgd2Ugc2hvdWxkIGZvbGQgdGhpcyBiYWNrIHRvZ2V0aGVyIGludG9cbiAqIG9uZSB2YWxpZGF0aW5nIHBhc3MuXG4gKlxuICogQHBhcmFtIHtFbmNvZGluZ30gcmF3VHJlZVxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmNvbnN0IHByZXBhcmU9KHJhd1RyZWUpPT57XG5pZighaXNPYmplY3QocmF3VHJlZSkpe1xucmV0dXJuO1xuIH1cbi8qIEFzc2VydGlvbnMgb2YgdGhlIGFib3ZlIHRvIG5hcnJvdyB0aGUgdHlwZS4qL1xuYXNzZXJ0LnR5cGVvZihyYXdUcmVlLCdvYmplY3QnKTtcbmFzc2VydChyYXdUcmVlIT09bnVsbCk7XG5pZihRQ0xBU1MgaW4gcmF3VHJlZSl7XG5jb25zdCBxY2xhc3M9cmF3VHJlZVtRQ0xBU1NdO1xudHlwZW9mIHFjbGFzcz09PSdzdHJpbmcnfHxcbkZhaWwgYGludmFsaWQgcWNsYXNzIHR5cGVvZiAke3EodHlwZW9mIHFjbGFzcyl9YDtcbmFzc2VydCghaXNBcnJheShyYXdUcmVlKSk7XG5zd2l0Y2gocmF3VHJlZVsnQHFjbGFzcyddKXtcbmNhc2UndW5kZWZpbmVkJzpcbmNhc2UnTmFOJzpcbmNhc2UnSW5maW5pdHknOlxuY2FzZSctSW5maW5pdHknOntcbnJldHVybjtcbiB9XG5jYXNlJ2JpZ2ludCc6e1xuY29uc3R7ZGlnaXRzfT1yYXdUcmVlO1xudHlwZW9mIGRpZ2l0cz09PSdzdHJpbmcnfHxcbkZhaWwgYGludmFsaWQgZGlnaXRzIHR5cGVvZiAke3EodHlwZW9mIGRpZ2l0cyl9YDtcbnJldHVybjtcbiB9XG5jYXNlJ0BAYXN5bmNJdGVyYXRvcic6e1xucmV0dXJuO1xuIH1cbmNhc2Unc3ltYm9sJzp7XG5jb25zdHtuYW1lfT1yYXdUcmVlO1xuYXNzZXJ0LnR5cGVvZihuYW1lLCdzdHJpbmcnKTtcbmNvbnN0IHN5bT1wYXNzYWJsZVN5bWJvbEZvck5hbWUobmFtZSk7XG5hc3NlcnQudHlwZW9mKHN5bSwnc3ltYm9sJyk7XG5yZXR1cm47XG4gfVxuY2FzZSd0YWdnZWQnOntcbmNvbnN0e3RhZyxwYXlsb2FkfT1yYXdUcmVlO1xuYXNzZXJ0LnR5cGVvZih0YWcsJ3N0cmluZycpO1xucHJlcGFyZShwYXlsb2FkKTtcbnJldHVybjtcbiB9XG5jYXNlJ3Nsb3QnOntcbmNvbnN0e2luZGV4LGlmYWNlfT1yYXdUcmVlO1xuYXNzZXJ0LnR5cGVvZihpbmRleCwnbnVtYmVyJyk7XG5OYXQoaW5kZXgpO1xuaWYoaWZhY2UhPT11bmRlZmluZWQpe1xuYXNzZXJ0LnR5cGVvZihpZmFjZSwnc3RyaW5nJyk7XG4gfVxucmV0dXJuO1xuIH1cbmNhc2UnaGlsYmVydCc6e1xuY29uc3R7b3JpZ2luYWwscmVzdH09cmF3VHJlZTtcbidvcmlnaW5hbCdpbiByYXdUcmVlfHxcbkZhaWwgYEludmFsaWQgSGlsYmVydCBIb3RlbCBlbmNvZGluZyAke3Jhd1RyZWV9YDtcbnByZXBhcmUob3JpZ2luYWwpO1xuaWYoJ3Jlc3QnaW4gcmF3VHJlZSl7XG5pZih0eXBlb2YgcmVzdCE9PSdvYmplY3QnKXtcbnRocm93IEZhaWwgYFJlc3QgJHtyZXN0fSBlbmNvZGluZyBtdXN0IGJlIGFuIG9iamVjdGA7XG4gfVxuaWYocmVzdD09PW51bGwpe1xudGhyb3cgRmFpbCBgUmVzdCAke3Jlc3R9IGVuY29kaW5nIG11c3Qgbm90IGJlIG51bGxgO1xuIH1cbmlmKGlzQXJyYXkocmVzdCkpe1xudGhyb3cgRmFpbCBgUmVzdCAke3Jlc3R9IGVuY29kaW5nIG11c3Qgbm90IGJlIGFuIGFycmF5YDtcbiB9XG5pZihRQ0xBU1MgaW4gcmVzdCl7XG50aHJvdyBGYWlsIGBSZXN0IGVuY29kaW5nICR7cmVzdH0gbXVzdCBub3QgY29udGFpbiAke3EoUUNMQVNTKX1gO1xuIH1cbmNvbnN0IG5hbWVzPW93bktleXMocmVzdCk7XG5mb3IoY29uc3QgbmFtZSBvZiBuYW1lcyl7XG50eXBlb2YgbmFtZT09PSdzdHJpbmcnfHxcbkZhaWwgYFByb3BlcnR5IG5hbWUgJHtuYW1lfSBvZiAke3Jhd1RyZWV9IG11c3QgYmUgYSBzdHJpbmdgO1xucHJlcGFyZShyZXN0W25hbWVdKTtcbiB9XG4gfVxucmV0dXJuO1xuIH1cbmNhc2UnZXJyb3InOntcbmNvbnN0e25hbWUsbWVzc2FnZX09cmF3VHJlZTtcbnR5cGVvZiBuYW1lPT09J3N0cmluZyd8fFxuRmFpbCBgaW52YWxpZCBlcnJvciBuYW1lIHR5cGVvZiAke3EodHlwZW9mIG5hbWUpfWA7XG5nZXRFcnJvckNvbnN0cnVjdG9yKG5hbWUpIT09dW5kZWZpbmVkfHxcbkZhaWwgYE11c3QgYmUgdGhlIG5hbWUgb2YgYW4gRXJyb3IgY29uc3RydWN0b3IgJHtuYW1lfWA7XG50eXBlb2YgbWVzc2FnZT09PSdzdHJpbmcnfHxcbkZhaWwgYGludmFsaWQgZXJyb3IgbWVzc2FnZSB0eXBlb2YgJHtxKHR5cGVvZiBtZXNzYWdlKX1gO1xucmV0dXJuO1xuIH1cblxuZGVmYXVsdDp7XG5hc3NlcnQuZmFpbChYIGB1bnJlY29nbml6ZWQgJHtxKFFDTEFTUyl9ICR7cShxY2xhc3MpfWAsVHlwZUVycm9yKTtcbiB9fVxuXG4gfWVsc2UgaWYoaXNBcnJheShyYXdUcmVlKSl7XG5jb25zdHtsZW5ndGh9PXJhd1RyZWU7XG5mb3IobGV0IGk9MDtpPGxlbmd0aDtpKz0xKXtcbnByZXBhcmUocmF3VHJlZVtpXSk7XG4gfVxuIH1lbHNle1xuY29uc3QgbmFtZXM9b3duS2V5cyhyYXdUcmVlKTtcbmZvcihjb25zdCBuYW1lIG9mIG5hbWVzKXtcbmlmKHR5cGVvZiBuYW1lIT09J3N0cmluZycpe1xudGhyb3cgRmFpbCBgUHJvcGVydHkgbmFtZSAke25hbWV9IG9mICR7cmF3VHJlZX0gbXVzdCBiZSBhIHN0cmluZ2A7XG4gfVxucHJlcGFyZShyYXdUcmVlW25hbWVdKTtcbiB9XG4gfVxuIH07XG5cbmNvbnN0IG1ha2VJbmRlbnRlcj1zaG91bGRJbmRlbnQ/bWFrZVllc0luZGVudGVyOm1ha2VOb0luZGVudGVyO1xubGV0IG91dD1tYWtlSW5kZW50ZXIoKTtcblxuLyoqXG4gKiBUaGlzIGlzIHRoZSBzZWNvbmQgcGFzcyByZWN1cnNpb24gYWZ0ZXIgdGhlIGZpcnN0IHBhc3MgYHByZXBhcmVgLlxuICogVGhlIGZpcnN0IHBhc3MgZGlkIHNvbWUgaW5wdXQgdmFsaWRhdGlvbiBzb1xuICogaGVyZSB3ZSBjYW4gc2FmZWx5IGFzc3VtZSBldmVyeXRoaW5nIHRob3NlIHRoaW5ncyBhcmUgdmFsaWRhdGVkLlxuICpcbiAqIEBwYXJhbSB7RW5jb2Rpbmd9IHJhd1RyZWVcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbmNvbnN0IGRlY29kZT0ocmF3VHJlZSk9Pntcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5yZXR1cm4gcmVjdXIocmF3VHJlZSk7XG4gfTtcblxuY29uc3QgZGVjb2RlUHJvcGVydHk9KG5hbWUsdmFsdWUpPT57XG5vdXQubGluZSgpO1xuaWYobmFtZT09PSdfX3Byb3RvX18nKXtcbi8qIEphdmFTY3JpcHQgaW50ZXJwcmV0cyBge19fcHJvdG9fXzogeCwgLi4ufWAqL1xuLyogYXMgbWFraW5nIGFuIG9iamVjdCBpbmhlcml0aW5nIGZyb20gYHhgLCB3aGVyZWFzKi9cbi8qIGluIEpTT04gaXQgaXMgc2ltcGx5IGEgcHJvcGVydHkgbmFtZS4gUHJlc2VydmUgdGhlKi9cbi8qIEpTT04gbWVhbmluZy4qL1xub3V0Lm5leHQoIGBbXCJfX3Byb3RvX19cIl06YCk7XG4gfWVsc2UgaWYoaWRlbnRQYXR0ZXJuLnRlc3QobmFtZSkpe1xub3V0Lm5leHQoIGAke25hbWV9OmApO1xuIH1lbHNle1xub3V0Lm5leHQoIGAke3F1b3RlKG5hbWUpfTpgKTtcbiB9XG5kZWNvZGUodmFsdWUpO1xub3V0Lm5leHQoJywnKTtcbiB9O1xuXG4vKipcbiAqIE1vZGVsZWQgYWZ0ZXIgYGZ1bGxSZXZpdmVgIGluIG1hcnNoYWwuanNcbiAqXG4gKiBAcGFyYW0ge0VuY29kaW5nfSByYXdUcmVlXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5jb25zdCByZWN1cj0ocmF3VHJlZSk9PntcbmlmKCFpc09iamVjdChyYXdUcmVlKSl7XG4vKiBwcmltaXRpdmVzIGdldCBxdW90ZWQqL1xucmV0dXJuIG91dC5uZXh0KHF1b3RlKHJhd1RyZWUpKTtcbiB9XG4vKiBBc3NlcnRpb25zIG9mIHRoZSBhYm92ZSB0byBuYXJyb3cgdGhlIHR5cGUuKi9cbmFzc2VydC50eXBlb2YocmF3VHJlZSwnb2JqZWN0Jyk7XG5hc3NlcnQocmF3VHJlZSE9PW51bGwpO1xuaWYoUUNMQVNTIGluIHJhd1RyZWUpe1xuY29uc3QgcWNsYXNzPXJhd1RyZWVbUUNMQVNTXTtcbmFzc2VydC50eXBlb2YocWNsYXNzLCdzdHJpbmcnKTtcbmFzc2VydCghaXNBcnJheShyYXdUcmVlKSk7XG4vKiBTd2l0Y2hpbmcgb24gYGVuY29kZWRbUUNMQVNTXWAgKG9yIGFueXRoaW5nIGxlc3MgZGlyZWN0LCBsaWtlKi9cbi8qIGBxY2xhc3NgKSBkb2VzIG5vdCBkaXNjcmltaW5hdGUgcmF3VHJlZSBpbiB0eXBlc2NyaXB0QDQuMi4zIGFuZCovXG4vKiBlYXJsaWVyLiovXG5zd2l0Y2gocmF3VHJlZVsnQHFjbGFzcyddKXtcbi8qIEVuY29kaW5nIG9mIHByaW1pdGl2ZXMgbm90IGhhbmRsZWQgYnkgSlNPTiovXG5jYXNlJ3VuZGVmaW5lZCc6XG5jYXNlJ05hTic6XG5jYXNlJ0luZmluaXR5JzpcbmNhc2UnLUluZmluaXR5Jzp7XG4vKiBUaGVpciBxY2xhc3MgaXMgdGhlaXIgZXhwcmVzc2lvbiBzb3VyY2UuKi9cbnJldHVybiBvdXQubmV4dChxY2xhc3MpO1xuIH1cbmNhc2UnYmlnaW50Jzp7XG5jb25zdHtkaWdpdHN9PXJhd1RyZWU7XG5hc3NlcnQudHlwZW9mKGRpZ2l0cywnc3RyaW5nJyk7XG5yZXR1cm4gb3V0Lm5leHQoIGAke0JpZ0ludChkaWdpdHMpfW5gKTtcbiB9XG5jYXNlJ0BAYXN5bmNJdGVyYXRvcic6e1xuLyogVE9ETyBkZXByZWNhdGVkLiBFdmVudHVhbGx5IHJlbW92ZS4qL1xucmV0dXJuIG91dC5uZXh0KCdTeW1ib2wuYXN5bmNJdGVyYXRvcicpO1xuIH1cbmNhc2Unc3ltYm9sJzp7XG5jb25zdHtuYW1lfT1yYXdUcmVlO1xuYXNzZXJ0LnR5cGVvZihuYW1lLCdzdHJpbmcnKTtcbmNvbnN0IHN5bT1wYXNzYWJsZVN5bWJvbEZvck5hbWUobmFtZSk7XG5hc3NlcnQudHlwZW9mKHN5bSwnc3ltYm9sJyk7XG5jb25zdCByZWdpc3RlcmVkTmFtZT1TeW1ib2wua2V5Rm9yKHN5bSk7XG5pZihyZWdpc3RlcmVkTmFtZT09PXVuZGVmaW5lZCl7XG5jb25zdCBtYXRjaD1BdEF0UHJlZml4UGF0dGVybi5leGVjKG5hbWUpO1xuYXNzZXJ0KG1hdGNoIT09bnVsbCk7XG5jb25zdCBzdWZmaXg9bWF0Y2hbMV07XG5hc3NlcnQoU3ltYm9sW3N1ZmZpeF09PT1zeW0pO1xuYXNzZXJ0KGlkZW50UGF0dGVybi50ZXN0KHN1ZmZpeCkpO1xucmV0dXJuIG91dC5uZXh0KCBgU3ltYm9sLiR7c3VmZml4fWApO1xuIH1cbnJldHVybiBvdXQubmV4dCggYFN5bWJvbC5mb3IoJHtxdW90ZShyZWdpc3RlcmVkTmFtZSl9KWApO1xuIH1cbmNhc2UndGFnZ2VkJzp7XG5jb25zdHt0YWcscGF5bG9hZH09cmF3VHJlZTtcbm91dC5uZXh0KCBgbWFrZVRhZ2dlZCgke3F1b3RlKHRhZyl9LGApO1xuZGVjb2RlKHBheWxvYWQpO1xucmV0dXJuIG91dC5uZXh0KCcpJyk7XG4gfVxuXG5jYXNlJ3Nsb3QnOntcbmxldHtpZmFjZX09cmF3VHJlZTtcbmNvbnN0IGluZGV4PU51bWJlcihOYXQocmF3VHJlZS5pbmRleCkpO1xuY29uc3QgbmVzdGVkUmVuZGVyPShhcmcpPT57XG5jb25zdCBvbGRPdXQ9b3V0O1xudHJ5e1xub3V0PW1ha2VOb0luZGVudGVyKCk7XG5kZWNvZGUoYXJnKTtcbnJldHVybiBvdXQuZG9uZSgpO1xuIH1maW5hbGx5e1xub3V0PW9sZE91dDtcbiB9XG4gfTtcbmlmKGluZGV4PHNsb3RzLmxlbmd0aCl7XG5jb25zdCBzbG90PW5lc3RlZFJlbmRlcihzbG90c1tpbmRleF0pO1xuaWYoaWZhY2U9PT11bmRlZmluZWQpe1xucmV0dXJuIG91dC5uZXh0KCBgc2xvdFRvVmFsKCR7c2xvdH0pYCk7XG4gfVxuaWZhY2U9bmVzdGVkUmVuZGVyKGlmYWNlKTtcbnJldHVybiBvdXQubmV4dCggYHNsb3RUb1ZhbCgke3Nsb3R9LCR7aWZhY2V9KWApO1xuIH1lbHNlIGlmKGlmYWNlPT09dW5kZWZpbmVkKXtcbnJldHVybiBvdXQubmV4dCggYHNsb3QoJHtpbmRleH0pYCk7XG4gfVxuaWZhY2U9bmVzdGVkUmVuZGVyKGlmYWNlKTtcbnJldHVybiBvdXQubmV4dCggYHNsb3QoJHtpbmRleH0sJHtpZmFjZX0pYCk7XG4gfVxuXG5jYXNlJ2hpbGJlcnQnOntcbmNvbnN0e29yaWdpbmFsLHJlc3R9PXJhd1RyZWU7XG5vdXQub3BlbigneycpO1xuZGVjb2RlUHJvcGVydHkoUUNMQVNTLG9yaWdpbmFsKTtcbmlmKCdyZXN0J2luIHJhd1RyZWUpe1xuYXNzZXJ0LnR5cGVvZihyZXN0LCdvYmplY3QnKTtcbmFzc2VydChyZXN0IT09bnVsbCk7XG5jb25zdCBuYW1lcz1vd25LZXlzKHJlc3QpO1xuZm9yKGNvbnN0IG5hbWUgb2YgbmFtZXMpe1xuaWYodHlwZW9mIG5hbWUhPT0nc3RyaW5nJyl7XG50aHJvdyBGYWlsIGBQcm9wZXJ0eSBuYW1lICR7cShcbm5hbWUpXG4gfSBvZiAke3Jlc3R9IG11c3QgYmUgYSBzdHJpbmdgO1xuIH1cbmRlY29kZVByb3BlcnR5KG5hbWUscmVzdFtuYW1lXSk7XG4gfVxuIH1cbnJldHVybiBvdXQuY2xvc2UoJ30nKTtcbiB9XG5cbmNhc2UnZXJyb3InOntcbmNvbnN0e25hbWUsbWVzc2FnZX09cmF3VHJlZTtcbnJldHVybiBvdXQubmV4dCggYCR7bmFtZX0oJHtxdW90ZShtZXNzYWdlKX0pYCk7XG4gfVxuXG5kZWZhdWx0OntcbnRocm93IGFzc2VydC5mYWlsKFxuWCBgdW5yZWNvZ25pemVkICR7cShRQ0xBU1MpfSAke3EocWNsYXNzKX1gLFxuVHlwZUVycm9yKTtcblxuIH19XG5cbiB9ZWxzZSBpZihpc0FycmF5KHJhd1RyZWUpKXtcbmNvbnN0e2xlbmd0aH09cmF3VHJlZTtcbmlmKGxlbmd0aD09PTApe1xucmV0dXJuIG91dC5uZXh0KCdbXScpO1xuIH1lbHNle1xub3V0Lm9wZW4oJ1snKTtcbmZvcihsZXQgaT0wO2k8bGVuZ3RoO2krPTEpe1xub3V0LmxpbmUoKTtcbmRlY29kZShyYXdUcmVlW2ldKTtcbm91dC5uZXh0KCcsJyk7XG4gfVxucmV0dXJuIG91dC5jbG9zZSgnXScpO1xuIH1cbiB9ZWxzZXtcbi8qIHJhd1RyZWUgaXMgYW4gYEVuY29kaW5nUmVjb3JkYCB3aGljaCBvbmx5IGhhcyBzdHJpbmcga2V5cywqL1xuLyogYnV0IHNpbmNlIG93bktleXMgaXMgbm90IGdlbmVyaWMsIGl0IGNhbid0IHByb3BhZ2F0ZSB0aGF0Ki9cbmNvbnN0IG5hbWVzPS8qKiBAdHlwZSB7c3RyaW5nW119ICovb3duS2V5cyhyYXdUcmVlKTtcbmlmKG5hbWVzLmxlbmd0aD09PTApe1xucmV0dXJuIG91dC5uZXh0KCd7fScpO1xuIH1lbHNle1xub3V0Lm9wZW4oJ3snKTtcbmZvcihjb25zdCBuYW1lIG9mIG5hbWVzKXtcbmRlY29kZVByb3BlcnR5KG5hbWUscmF3VHJlZVtuYW1lXSk7XG4gfVxucmV0dXJuIG91dC5jbG9zZSgnfScpO1xuIH1cbiB9XG4gfTtcbnByZXBhcmUoZW5jb2RpbmcpO1xuZGVjb2RlKGVuY29kaW5nKTtcbnJldHVybiBvdXQuZG9uZSgpO1xuIH07JGjigI1fb25jZS5kZWNvZGVUb0p1c3RpbihkZWNvZGVUb0p1c3Rpbik7XG5oYXJkZW4oZGVjb2RlVG9KdXN0aW4pO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRlY29kZVRvSnVzdGluIjpbImRlY29kZVRvSnVzdGluIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAABPT1RvcBgAA3AYAAC0AAABAZW5kby9tYXJzaGFsLXYwLjguOS9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanN7ImltcG9ydHMiOlsiLi9tYXJzaGFsLmpzIl0sImV4cG9ydHMiOlsicGFyc2UiLCJzdHJpbmdpZnkiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgbWFrZU1hcnNoYWw7JGjigI1faW1wb3J0cyhbW1wiLi9tYXJzaGFsLmpzXCIsIFtbXCJtYWtlTWFyc2hhbFwiLCBbJGjigI1fYSA9PiAobWFrZU1hcnNoYWwgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vcGFzcy1zdHlsZScpLlBhc3NhYmxlfSBQYXNzYWJsZSAqL1xuXG5jb25zdHtGYWlsfT1hc3NlcnQ7XG5cbi8qKiBAdHlwZSB7WGltcG9ydCgnLi90eXBlcy5qcycpLkNvbnZlcnRWYWxUb1Nsb3Q8YW55Pn0gKi9cbmNvbnN0IGRvTm90Q29udmVydFZhbFRvU2xvdD0odmFsKT0+XG5GYWlsIGBNYXJzaGFsJ3Mgc3RyaW5naWZ5IHJlamVjdHMgcHJlc2VuY2VzIGFuZCBwcm9taXNlcyAke3ZhbH1gO1xuXG4vKiogQHR5cGUge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5Db252ZXJ0U2xvdFRvVmFsPGFueT59ICovXG5jb25zdCBkb05vdENvbnZlcnRTbG90VG9WYWw9KHNsb3QsX2lmYWNlKT0+XG5GYWlsIGBNYXJzaGFsJ3MgcGFyc2UgbXVzdCBub3QgZW5jb2RlIGFueSBzbG90cyAke3Nsb3R9YDtcblxuY29uc3QgYmFkQXJyYXlIYW5kbGVyPWhhcmRlbih7XG5nZXQ6KF90YXJnZXQsbmFtZSxfcmVjZWl2ZXIpPT57XG5pZihuYW1lPT09J2xlbmd0aCcpe1xucmV0dXJuIDA7XG4gfVxuLyogYHRocm93YCBpcyBub29wIHNpbmNlIGBGYWlsYCB0aHJvd3MuIEJ1dCBsaW50ZXIgY29uZnVzZWQqL1xudGhyb3cgRmFpbCBgTWFyc2hhbCdzIHBhcnNlIG11c3Qgbm90IGVuY29kZSBhbnkgc2xvdCBwb3NpdGlvbnMgJHtuYW1lfWA7XG4gfX0pO1xuXG5cbmNvbnN0IGJhZEFycmF5PWhhcmRlbihuZXcgUHJveHkoaGFyZGVuKFtdKSxiYWRBcnJheUhhbmRsZXIpKTtcblxuY29uc3R7c2VyaWFsaXplLHVuc2VyaWFsaXplfT1tYWtlTWFyc2hhbChcbmRvTm90Q29udmVydFZhbFRvU2xvdCxcbmRvTm90Q29udmVydFNsb3RUb1ZhbCxcbntcbmVycm9yVGFnZ2luZzonb2ZmJyxcbi8qIFRPRE8gZml4IHRlc3RzIHRvIHdvcmtzIHdpdGggc21hbGxjYXBzLiovXG5zZXJpYWxpemVCb2R5Rm9ybWF0OidjYXBkYXRhJ30pO1xuXG5cblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSB2YWxcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmNvbnN0IHN0cmluZ2lmeT0odmFsKT0+c2VyaWFsaXplKHZhbCkuYm9keTskaOKAjV9vbmNlLnN0cmluZ2lmeShzdHJpbmdpZnkpO1xuaGFyZGVuKHN0cmluZ2lmeSk7XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICogQHJldHVybnMge1Bhc3NhYmxlfVxuICovXG5jb25zdCBwYXJzZT0oc3RyKT0+XG51bnNlcmlhbGl6ZShcbmhhcmRlbih7XG5ib2R5OnN0cixcbnNsb3RzOmJhZEFycmF5fSkpOyRo4oCNX29uY2UucGFyc2UocGFyc2UpO1xuXG5cbmhhcmRlbihwYXJzZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsic3RyaW5naWZ5IjpbInN0cmluZ2lmeSJdLCJwYXJzZSI6WyJwYXJzZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAQCg0W7DIAAOwyAAAjAAAAQGVuZG8vbWFyc2hhbC12MC44Ljkvc3JjL21hcnNoYWwuanN7ImltcG9ydHMiOlsiQGVuZG8vbmF0IiwiQGVuZG8vcGFzcy1zdHlsZSIsIi4vZW5jb2RlVG9DYXBEYXRhLmpzIiwiLi9lbmNvZGVUb1NtYWxsY2Fwcy5qcyJdLCJleHBvcnRzIjpbIm1ha2VNYXJzaGFsIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IE5hdCxhc3NlcnRQYXNzYWJsZSxnZXRJbnRlcmZhY2VPZixnZXRFcnJvckNvbnN0cnVjdG9yLGhhc093blByb3BlcnR5T2YsUUNMQVNTLG1ha2VFbmNvZGVUb0NhcERhdGEsbWFrZURlY29kZUZyb21DYXBEYXRhLG1ha2VEZWNvZGVGcm9tU21hbGxjYXBzLG1ha2VFbmNvZGVUb1NtYWxsY2FwczskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9uYXRcIiwgW1tcIk5hdFwiLCBbJGjigI1fYSA9PiAoTmF0ID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcImFzc2VydFBhc3NhYmxlXCIsIFskaOKAjV9hID0+IChhc3NlcnRQYXNzYWJsZSA9ICRo4oCNX2EpXV0sW1wiZ2V0SW50ZXJmYWNlT2ZcIiwgWyRo4oCNX2EgPT4gKGdldEludGVyZmFjZU9mID0gJGjigI1fYSldXSxbXCJnZXRFcnJvckNvbnN0cnVjdG9yXCIsIFskaOKAjV9hID0+IChnZXRFcnJvckNvbnN0cnVjdG9yID0gJGjigI1fYSldXSxbXCJoYXNPd25Qcm9wZXJ0eU9mXCIsIFskaOKAjV9hID0+IChoYXNPd25Qcm9wZXJ0eU9mID0gJGjigI1fYSldXV1dLFtcIi4vZW5jb2RlVG9DYXBEYXRhLmpzXCIsIFtbXCJRQ0xBU1NcIiwgWyRo4oCNX2EgPT4gKFFDTEFTUyA9ICRo4oCNX2EpXV0sW1wibWFrZUVuY29kZVRvQ2FwRGF0YVwiLCBbJGjigI1fYSA9PiAobWFrZUVuY29kZVRvQ2FwRGF0YSA9ICRo4oCNX2EpXV0sW1wibWFrZURlY29kZUZyb21DYXBEYXRhXCIsIFskaOKAjV9hID0+IChtYWtlRGVjb2RlRnJvbUNhcERhdGEgPSAkaOKAjV9hKV1dXV0sW1wiLi9lbmNvZGVUb1NtYWxsY2Fwcy5qc1wiLCBbW1wibWFrZURlY29kZUZyb21TbWFsbGNhcHNcIiwgWyRo4oCNX2EgPT4gKG1ha2VEZWNvZGVGcm9tU21hbGxjYXBzID0gJGjigI1fYSldXSxbXCJtYWtlRW5jb2RlVG9TbWFsbGNhcHNcIiwgWyRo4oCNX2EgPT4gKG1ha2VFbmNvZGVUb1NtYWxsY2FwcyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5NYWtlTWFyc2hhbE9wdGlvbnN9IE1ha2VNYXJzaGFsT3B0aW9ucyAqL1xuLyoqIEB0ZW1wbGF0ZSBTbG90IEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuQ29udmVydFNsb3RUb1ZhbDxTbG90Pn0gQ29udmVydFNsb3RUb1ZhbCAqL1xuLyoqIEB0ZW1wbGF0ZSBTbG90IEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuQ29udmVydFZhbFRvU2xvdDxTbG90Pn0gQ29udmVydFZhbFRvU2xvdCAqL1xuLyoqIEB0ZW1wbGF0ZSBTbG90IEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuVG9DYXBEYXRhPFNsb3Q+fSBUb0NhcERhdGEgKi9cbi8qKiBAdGVtcGxhdGUgU2xvdCBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkZyb21DYXBEYXRhPFNsb3Q+fSBGcm9tQ2FwRGF0YSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9wYXNzLXN0eWxlJykuUGFzc2FibGV9IFBhc3NhYmxlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL3Bhc3Mtc3R5bGUnKS5JbnRlcmZhY2VTcGVjfSBJbnRlcmZhY2VTcGVjICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5FbmNvZGluZ30gRW5jb2RpbmcgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vcGFzcy1zdHlsZScpLlJlbW90YWJsZU9iamVjdH0gUmVtb3RhYmxlICovXG5cbmNvbnN0e2lzQXJyYXl9PUFycmF5O1xuY29uc3R7ZGV0YWlsczpYLEZhaWwscXVvdGU6cX09YXNzZXJ0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcblxuLyoqIEB0eXBlIHtDb252ZXJ0VmFsVG9TbG90PGFueT59ICovXG5jb25zdCBkZWZhdWx0VmFsVG9TbG90Rm49KHgpPT54O1xuLyoqIEB0eXBlIHtDb252ZXJ0U2xvdFRvVmFsPGFueT59ICovXG5jb25zdCBkZWZhdWx0U2xvdFRvVmFsRm49KHgsXyk9Png7XG5cbi8qKlxuICogQHRlbXBsYXRlIFNsb3RcbiAqIEBwYXJhbSB7Q29udmVydFZhbFRvU2xvdDxTbG90Pn0gW2NvbnZlcnRWYWxUb1Nsb3RdXG4gKiBAcGFyYW0ge0NvbnZlcnRTbG90VG9WYWw8U2xvdD59IFtjb252ZXJ0U2xvdFRvVmFsXVxuICogQHBhcmFtIHtNYWtlTWFyc2hhbE9wdGlvbnN9IG9wdGlvbnNcbiAqL1xuY29uc3QgICAgICAgIG1ha2VNYXJzaGFsPShcbmNvbnZlcnRWYWxUb1Nsb3Q9ZGVmYXVsdFZhbFRvU2xvdEZuLFxuY29udmVydFNsb3RUb1ZhbD1kZWZhdWx0U2xvdFRvVmFsRm4sXG57XG5lcnJvclRhZ2dpbmc9J29uJyxcbm1hcnNoYWxOYW1lPSdhbm9uLW1hcnNoYWwnLFxuLyogVE9ETyBUZW1wb3JhcnkgaGFjay4qL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMjc4MCovXG5lcnJvcklkTnVtPTEwMDAwLFxuLyogV2UgcHJlZmVyIHRoYXQgdGhlIGNhbGxlciBpbnN0ZWFkIGxvZyB0byBzb21ld2hlcmUgaGlkZGVuKi9cbi8qIHRvIGJlIHJldmVhbGVkIHdoZW4gY29ycmVsYXRpbmcgd2l0aCB0aGUgcmVjZWl2ZWQgZXJyb3IuKi9cbm1hcnNoYWxTYXZlRXJyb3I9KGVycik9PlxuY29uc29sZS5sb2coJ1RlbXBvcmFyeSBsb2dnaW5nIG9mIHNlbnQgZXJyb3InLGVyciksXG4vKiBEZWZhdWx0IHRvICdjYXBkYXRhJyBiZWNhdXNlIGl0IHdhcyBpbXBsZW1lbnRlZCBmaXJzdC4qL1xuLyogU29tZXRpbWVzLCBvbnRvZ2VueSBkb2VzIHJlY2FwaXR1bGF0ZSBwaHlsb2dlbnkgOykqL1xuc2VyaWFsaXplQm9keUZvcm1hdD0nY2FwZGF0YSd9PVxue30pPT5cbntcbmFzc2VydC50eXBlb2YobWFyc2hhbE5hbWUsJ3N0cmluZycpO1xuZXJyb3JUYWdnaW5nPT09J29uJ3x8XG5lcnJvclRhZ2dpbmc9PT0nb2ZmJ3x8XG5GYWlsIGBUaGUgZXJyb3JUYWdnaW5nIG9wdGlvbiBjYW4gb25seSBiZSBcIm9uXCIgb3IgXCJvZmZcIiAke2Vycm9yVGFnZ2luZ31gO1xuY29uc3QgbmV4dEVycm9ySWQ9KCk9PntcbmVycm9ySWROdW0rPTE7XG5yZXR1cm4gYGVycm9yOiR7bWFyc2hhbE5hbWV9IyR7ZXJyb3JJZE51bX1gO1xuIH07XG5cbi8qKlxuICogQHR5cGUge1RvQ2FwRGF0YTxTbG90Pn1cbiAqL1xuY29uc3QgdG9DYXBEYXRhPShyb290KT0+e1xuY29uc3Qgc2xvdHM9W107XG4vKiBtYXBzIHZhbCAocHJvbWlzZSBvciByZW1vdGFibGUpIHRvIGluZGV4IG9mIHNsb3RzW10qL1xuY29uc3Qgc2xvdE1hcD1uZXcgTWFwKCk7XG5cbi8qKlxuICogQHBhcmFtIHtSZW1vdGFibGUgfCBQcm9taXNlfSBwYXNzYWJsZVxuICogQHJldHVybnMge3tpbmRleDogbnVtYmVyLCByZXBlYXQ6IGJvb2xlYW59fVxuICovXG5jb25zdCBlbmNvZGVTbG90Q29tbW9uPShwYXNzYWJsZSk9PntcbmxldCBpbmRleD1zbG90TWFwLmdldChwYXNzYWJsZSk7XG5pZihpbmRleCE9PXVuZGVmaW5lZCl7XG4vKiBUT0RPIGFzc2VydCB0aGF0IGl0J3MgdGhlIHNhbWUgaWZhY2UgYXMgYmVmb3JlKi9cbmFzc2VydC50eXBlb2YoaW5kZXgsJ251bWJlcicpO1xucmV0dXJuIGhhcmRlbih7aW5kZXgscmVwZWF0OnRydWV9KTtcbiB9XG5cbmluZGV4PXNsb3RzLmxlbmd0aDtcbmNvbnN0IHNsb3Q9Y29udmVydFZhbFRvU2xvdChwYXNzYWJsZSk7XG5zbG90cy5wdXNoKHNsb3QpO1xuc2xvdE1hcC5zZXQocGFzc2FibGUsaW5kZXgpO1xucmV0dXJuIGhhcmRlbih7aW5kZXgscmVwZWF0OmZhbHNlfSk7XG4gfTtcblxuLyoqXG4gKiBFdmVuIGlmIGFuIEVycm9yIGlzIG5vdCBhY3R1YWxseSBwYXNzYWJsZSwgd2UnZCByYXRoZXIgc2VuZFxuICogaXQgYW55d2F5IGJlY2F1c2UgdGhlIGRpYWdub3N0aWMgaW5mbyBjYXJyaWVkIGJ5IHRoZSBlcnJvclxuICogaXMgbW9yZSB2YWx1YWJsZSB0aGFuIGRpYWdub3Npbmcgd2h5IHRoZSBlcnJvciBpc24ndFxuICogcGFzc2FibGUuIFNlZSBjb21tZW50cyBpbiBpc0Vycm9yTGlrZS5cbiAqXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJcbiAqIEBwYXJhbSB7KHA6IFBhc3NhYmxlKSA9PiB1bmtub3dufSBlbmNvZGVSZWN1clxuICogQHJldHVybnMge3tlcnJvcklkPzogc3RyaW5nLCBtZXNzYWdlOiBzdHJpbmcsIG5hbWU6IHN0cmluZ319XG4gKi9cbmNvbnN0IGVuY29kZUVycm9yQ29tbW9uPShlcnIsZW5jb2RlUmVjdXIpPT57XG5jb25zdCBtZXNzYWdlPWVuY29kZVJlY3VyKCBgJHtlcnIubWVzc2FnZX1gKTtcbmFzc2VydC50eXBlb2YobWVzc2FnZSwnc3RyaW5nJyk7XG5jb25zdCBuYW1lPWVuY29kZVJlY3VyKCBgJHtlcnIubmFtZX1gKTtcbmFzc2VydC50eXBlb2YobmFtZSwnc3RyaW5nJyk7XG4vKiBNdXN0IGVuY29kZSBgY2F1c2VgLCBgZXJyb3JzYC4qL1xuLyogbmVzdGVkIG5vbi1wYXNzYWJsZSBlcnJvcnMgbXVzdCBiZSBvayBmcm9tIGhlcmUuKi9cbmlmKGVycm9yVGFnZ2luZz09PSdvbicpe1xuLyogV2UgZGVsaWJlcmF0ZWx5IGRvIG5vdCBzaGFyZSB0aGUgc3RhY2ssIGJ1dCBpdCB3b3VsZCovXG4vKiBiZSB1c2VmdWwgdG8gbG9nIHRoZSBzdGFjayBsb2NhbGx5IHNvIHNvbWVvbmUgd2hvIGhhcyovXG4vKiBwcml2aWxlZ2VkIGFjY2VzcyB0byB0aGUgdGhyb3dpbmcgVmF0IGNhbiBjb3JyZWxhdGUqL1xuLyogdGhlIHByb2JsZW0gd2l0aCB0aGUgcmVtb3RlIFZhdCB0aGF0IGdldHMgdGhpcyovXG4vKiBzdW1tYXJ5LiBJZiB3ZSBkbyB0aGF0LCB3ZSBjb3VsZCBhbGxvY2F0ZSBzb21lIHJhbmRvbSovXG4vKiBpZGVudGlmaWVyIGFuZCBpbmNsdWRlIGl0IGluIHRoZSBtZXNzYWdlLCB0byBoZWxwKi9cbi8qIHdpdGggdGhlIGNvcnJlbGF0aW9uLiovXG5jb25zdCBlcnJvcklkPWVuY29kZVJlY3VyKG5leHRFcnJvcklkKCkpO1xuYXNzZXJ0LnR5cGVvZihlcnJvcklkLCdzdHJpbmcnKTtcbmFzc2VydC5ub3RlKGVycixYIGBTZW50IGFzICR7ZXJyb3JJZH1gKTtcbm1hcnNoYWxTYXZlRXJyb3IoZXJyKTtcbnJldHVybiBoYXJkZW4oe2Vycm9ySWQsbWVzc2FnZSxuYW1lfSk7XG4gfWVsc2V7XG5yZXR1cm4gaGFyZGVuKHttZXNzYWdlLG5hbWV9KTtcbiB9XG4gfTtcblxuaWYoc2VyaWFsaXplQm9keUZvcm1hdD09PSdjYXBkYXRhJyl7XG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHBhc3NhYmxlXG4gKiBAcGFyYW0ge0ludGVyZmFjZVNwZWN9IFtpZmFjZV1cbiAqIEByZXR1cm5zIHtFbmNvZGluZ31cbiAqL1xuY29uc3QgZW5jb2RlU2xvdFRvQ2FwRGF0YT0ocGFzc2FibGUsaWZhY2U9dW5kZWZpbmVkKT0+e1xuY29uc3R7aW5kZXgscmVwZWF0fT1lbmNvZGVTbG90Q29tbW9uKHBhc3NhYmxlKTtcblxuaWYocmVwZWF0PT09dHJ1ZXx8aWZhY2U9PT11bmRlZmluZWQpe1xucmV0dXJuIGhhcmRlbih7W1FDTEFTU106J3Nsb3QnLGluZGV4fSk7XG4gfWVsc2V7XG5yZXR1cm4gaGFyZGVuKHtbUUNMQVNTXTonc2xvdCcsaWZhY2UsaW5kZXh9KTtcbiB9XG4gfTtcblxuY29uc3QgZW5jb2RlUmVtb3RhYmxlVG9DYXBEYXRhPSh2YWwsX2VuY29kZVJlY3VyKT0+XG5lbmNvZGVTbG90VG9DYXBEYXRhKHZhbCxnZXRJbnRlcmZhY2VPZih2YWwpKTtcblxuY29uc3QgZW5jb2RlUHJvbWlzZVRvQ2FwRGF0YT0ocHJvbWlzZSxfZW5jb2RlUmVjdXIpPT5cbmVuY29kZVNsb3RUb0NhcERhdGEocHJvbWlzZSk7XG5cbi8qKlxuICogRXZlbiBpZiBhbiBFcnJvciBpcyBub3QgYWN0dWFsbHkgcGFzc2FibGUsIHdlJ2QgcmF0aGVyIHNlbmRcbiAqIGl0IGFueXdheSBiZWNhdXNlIHRoZSBkaWFnbm9zdGljIGluZm8gY2FycmllZCBieSB0aGUgZXJyb3JcbiAqIGlzIG1vcmUgdmFsdWFibGUgdGhhbiBkaWFnbm9zaW5nIHdoeSB0aGUgZXJyb3IgaXNuJ3RcbiAqIHBhc3NhYmxlLiBTZWUgY29tbWVudHMgaW4gaXNFcnJvckxpa2UuXG4gKlxuICogQHBhcmFtIHtFcnJvcn0gZXJyXG4gKiBAcGFyYW0geyhwOiBQYXNzYWJsZSkgPT4gRW5jb2Rpbmd9IGVuY29kZVJlY3VyXG4gKiBAcmV0dXJucyB7RW5jb2Rpbmd9XG4gKi9cbmNvbnN0IGVuY29kZUVycm9yVG9DYXBEYXRhPShlcnIsZW5jb2RlUmVjdXIpPT57XG5jb25zdCBlcnJEYXRhPWVuY29kZUVycm9yQ29tbW9uKGVycixlbmNvZGVSZWN1cik7XG5yZXR1cm4gaGFyZGVuKHtbUUNMQVNTXTonZXJyb3InLC4uLmVyckRhdGF9KTtcbiB9O1xuXG5jb25zdCBlbmNvZGVUb0NhcERhdGE9bWFrZUVuY29kZVRvQ2FwRGF0YSh7XG5lbmNvZGVSZW1vdGFibGVUb0NhcERhdGEsXG5lbmNvZGVQcm9taXNlVG9DYXBEYXRhLFxuZW5jb2RlRXJyb3JUb0NhcERhdGF9KTtcblxuXG5jb25zdCBlbmNvZGVkPWVuY29kZVRvQ2FwRGF0YShyb290KTtcbmNvbnN0IGJvZHk9SlNPTi5zdHJpbmdpZnkoZW5jb2RlZCk7XG5yZXR1cm4gaGFyZGVuKHtcbmJvZHksXG5zbG90c30pO1xuXG4gfWVsc2UgaWYoc2VyaWFsaXplQm9keUZvcm1hdD09PSdzbWFsbGNhcHMnKXtcbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHByZWZpeFxuICogQHBhcmFtIHtQYXNzYWJsZX0gcGFzc2FibGVcbiAqIEBwYXJhbSB7SW50ZXJmYWNlU3BlY30gW2lmYWNlXVxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3QgZW5jb2RlU2xvdFRvU21hbGxjYXBzPShwcmVmaXgscGFzc2FibGUsaWZhY2U9dW5kZWZpbmVkKT0+e1xuY29uc3R7aW5kZXgscmVwZWF0fT1lbmNvZGVTbG90Q29tbW9uKHBhc3NhYmxlKTtcblxuLyogVE9ETyBleHBsb3JlIHJlbW92aW5nIHRoaXMgc3BlY2lhbCBjYXNlKi9cbmlmKHJlcGVhdD09PXRydWV8fGlmYWNlPT09dW5kZWZpbmVkKXtcbnJldHVybiBgJHtwcmVmaXh9JHtpbmRleH1gO1xuIH1cbnJldHVybiBgJHtwcmVmaXh9JHtpbmRleH0uJHtpZmFjZX1gO1xuIH07XG5cbmNvbnN0IGVuY29kZVJlbW90YWJsZVRvU21hbGxjYXBzPShyZW1vdGFibGUsX2VuY29kZVJlY3VyKT0+XG5lbmNvZGVTbG90VG9TbWFsbGNhcHMoJyQnLHJlbW90YWJsZSxnZXRJbnRlcmZhY2VPZihyZW1vdGFibGUpKTtcblxuY29uc3QgZW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzPShwcm9taXNlLF9lbmNvZGVSZWN1cik9PlxuZW5jb2RlU2xvdFRvU21hbGxjYXBzKCcmJyxwcm9taXNlKTtcblxuY29uc3QgZW5jb2RlRXJyb3JUb1NtYWxsY2Fwcz0oZXJyLGVuY29kZVJlY3VyKT0+e1xuY29uc3QgZXJyRGF0YT1lbmNvZGVFcnJvckNvbW1vbihlcnIsZW5jb2RlUmVjdXIpO1xuY29uc3R7bWVzc2FnZSwuLi5yZXN0fT1lcnJEYXRhO1xucmV0dXJuIGhhcmRlbih7JyNlcnJvcic6bWVzc2FnZSwuLi5yZXN0fSk7XG4gfTtcblxuY29uc3QgZW5jb2RlVG9TbWFsbGNhcHM9bWFrZUVuY29kZVRvU21hbGxjYXBzKHtcbmVuY29kZVJlbW90YWJsZVRvU21hbGxjYXBzLFxuZW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzLFxuZW5jb2RlRXJyb3JUb1NtYWxsY2Fwc30pO1xuXG5cbmNvbnN0IGVuY29kZWQ9ZW5jb2RlVG9TbWFsbGNhcHMocm9vdCk7XG5jb25zdCBzbWFsbGNhcHNCb2R5PUpTT04uc3RyaW5naWZ5KGVuY29kZWQpO1xucmV0dXJuIGhhcmRlbih7XG4vKiBWYWxpZCBKU09OIGNhbm5vdCBiZWdpbiB3aXRoIGEgJyMnLCBzbyB0aGlzIGlzIGEgdmFsaWQgc2lnbmFsKi9cbi8qIGluZGljYXRpbmcgc21hbGxjYXBzIGZvcm1hdC4qL1xuYm9keTogYCMke3NtYWxsY2Fwc0JvZHl9YCxcbnNsb3RzfSk7XG5cbiB9ZWxzZXtcbi8qIFRoZSBgdGhyb3dgIGlzIGEgbm9vcCBzaW5jZSBgRmFpbGAgdGhyb3dzLiBBZGRlZCBmb3IgY29uZnVzZWQgbGludGVycy4qL1xudGhyb3cgRmFpbCBgVW5yZWNvZ25pemVkIHNlcmlhbGl6ZUJvZHlGb3JtYXQ6ICR7cShzZXJpYWxpemVCb2R5Rm9ybWF0KX1gO1xuIH1cbiB9O1xuXG5jb25zdCBtYWtlRnVsbFJldml2ZT0oc2xvdHMpPT57XG4vKiogQHR5cGUge01hcDxudW1iZXIsIFBhc3NhYmxlPn0gKi9cbmNvbnN0IHZhbE1hcD1uZXcgTWFwKCk7XG5cbi8qKlxuICogQHBhcmFtIHt7aWZhY2U/OiBzdHJpbmcsIGluZGV4OiBudW1iZXJ9fSBzbG90RGF0YVxuICogQHJldHVybnMge1JlbW90YWJsZSB8IFByb21pc2V9XG4gKi9cbmNvbnN0IGRlY29kZVNsb3RDb21tb249KHNsb3REYXRhKT0+e1xuY29uc3R7aWZhY2U9dW5kZWZpbmVkLGluZGV4LC4uLnJlc3R9PXNsb3REYXRhO1xub3duS2V5cyhyZXN0KS5sZW5ndGg9PT0wfHxcbkZhaWwgYHVuZXhwZWN0ZWQgZW5jb2RlZCBzbG90IHByb3BlcnRpZXMgJHtxKG93bktleXMocmVzdCkpfWA7XG5pZih2YWxNYXAuaGFzKGluZGV4KSl7XG5yZXR1cm4gdmFsTWFwLmdldChpbmRleCk7XG4gfVxuLyogVE9ETyBTRUNVUklUWSBIQVpBUkQ6IG11c3QgZW5mb2NlIHRoYXQgcmVtb3RhYmxlIHZzIHByb21pc2UqL1xuLyogaXMgYWNjb3JkaW5nIHRvIHRoZSBlbmNvZGVkIHN0cmluZy4qL1xuY29uc3Qgc2xvdD1zbG90c1tOdW1iZXIoTmF0KGluZGV4KSldO1xuY29uc3QgdmFsPWNvbnZlcnRTbG90VG9WYWwoc2xvdCxpZmFjZSk7XG52YWxNYXAuc2V0KGluZGV4LHZhbCk7XG5yZXR1cm4gdmFsO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHt7ZXJyb3JJZD86IHN0cmluZywgbWVzc2FnZTogc3RyaW5nLCBuYW1lOiBzdHJpbmd9fSBlcnJEYXRhXG4gKiBAcGFyYW0geyhlOiB1bmtub3duKSA9PiBQYXNzYWJsZX0gZGVjb2RlUmVjdXJcbiAqIEByZXR1cm5zIHtFcnJvcn1cbiAqL1xuY29uc3QgZGVjb2RlRXJyb3JDb21tb249KGVyckRhdGEsZGVjb2RlUmVjdXIpPT57XG5jb25zdHtlcnJvcklkPXVuZGVmaW5lZCxtZXNzYWdlLG5hbWUsLi4ucmVzdH09ZXJyRGF0YTtcbm93bktleXMocmVzdCkubGVuZ3RoPT09MHx8XG5GYWlsIGB1bmV4cGVjdGVkIGVuY29kZWQgZXJyb3IgcHJvcGVydGllcyAke3Eob3duS2V5cyhyZXN0KSl9YDtcbi8qIFRPRE8gTXVzdCBkZWNvZGUgYGNhdXNlYCBhbmQgYGVycm9yc2AgcHJvcGVydGllcyovXG4vKiBjYXBEYXRhIGRvZXMgbm90IHRyYW5zZm9ybSBzdHJpbmdzLiBUaGUgY2FsbHMgdG8gYGRlY29kZVJlY3VyYCovXG4vKiBhcmUgZm9yIHJldXNlIGJ5IG90aGVyIGVuY29kaW5ncyB0aGF0IGRvLCBzdWNoIGFzIHNtYWxsY2Fwcy4qL1xuY29uc3QgZE5hbWU9ZGVjb2RlUmVjdXIobmFtZSk7XG5jb25zdCBkTWVzc2FnZT1kZWNvZGVSZWN1cihtZXNzYWdlKTtcbmNvbnN0IGRFcnJvcklkPWVycm9ySWQmJmRlY29kZVJlY3VyKGVycm9ySWQpO1xudHlwZW9mIGROYW1lPT09J3N0cmluZyd8fFxuRmFpbCBgaW52YWxpZCBlcnJvciBuYW1lIHR5cGVvZiAke3EodHlwZW9mIGROYW1lKX1gO1xudHlwZW9mIGRNZXNzYWdlPT09J3N0cmluZyd8fFxuRmFpbCBgaW52YWxpZCBlcnJvciBtZXNzYWdlIHR5cGVvZiAke3EodHlwZW9mIGRNZXNzYWdlKX1gO1xuY29uc3QgRUM9Z2V0RXJyb3JDb25zdHJ1Y3RvcihkTmFtZSl8fEVycm9yO1xuLyogZXJyb3JJZCBpcyBhIGxhdGUgYWRkaXRpb24gc28gYmUgdG9sZXJhbnQgb2YgaXRzIGFic2VuY2UuKi9cbmNvbnN0IGVycm9yTmFtZT1cbmRFcnJvcklkPT09dW5kZWZpbmVkP1xuIGBSZW1vdGUke0VDLm5hbWV9YDpcbiBgUmVtb3RlJHtFQy5uYW1lfSgke2RFcnJvcklkfSlgO1xuY29uc3QgZXJyb3I9YXNzZXJ0LmVycm9yKGRNZXNzYWdlLEVDLHtlcnJvck5hbWV9KTtcbnJldHVybiBoYXJkZW4oZXJyb3IpO1xuIH07XG5cbi8qIFRoZSBjdXJyZW50IGVuY29kaW5nIGRvZXMgbm90IGdpdmUgdGhlIGRlY29kZXIgZW5vdWdoIGludG8gdG8gZGlzdGluZ3Vpc2gqL1xuLyogd2hldGhlciBhIHNsb3QgcmVwcmVzZW50cyBhIHByb21pc2Ugb3IgYSByZW1vdGFibGUuIEFzIGFuIGltcGxlbWVudGF0aW9uKi9cbi8qIHJlc3RyaWN0aW9uIHVudGlsIHRoaXMgaXMgZml4ZWQsIGlmIGVpdGhlciBpcyBwcm92aWRlZCwgYm90aCBtdXN0IGJlKi9cbi8qIHByb3ZpZGVkIGFuZCB0aGV5IG11c3QgYmUgdGhlIHNhbWUuKi9cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzQzMzQqL1xuY29uc3QgZGVjb2RlUmVtb3RhYmxlT3JQcm9taXNlRnJvbUNhcERhdGE9KHJhd1RyZWUsX2RlY29kZVJlY3VyKT0+e1xuY29uc3R7W1FDTEFTU106XywuLi5zbG90RGF0YX09cmF3VHJlZTtcbnJldHVybiBkZWNvZGVTbG90Q29tbW9uKHNsb3REYXRhKTtcbiB9O1xuXG5jb25zdCBkZWNvZGVFcnJvckZyb21DYXBEYXRhPShyYXdUcmVlLGRlY29kZVJlY3VyKT0+e1xuY29uc3R7W1FDTEFTU106XywuLi5lcnJEYXRhfT1yYXdUcmVlO1xucmV0dXJuIGRlY29kZUVycm9yQ29tbW9uKGVyckRhdGEsZGVjb2RlUmVjdXIpO1xuIH07XG5cbmNvbnN0IHJldml2ZUZyb21DYXBEYXRhPW1ha2VEZWNvZGVGcm9tQ2FwRGF0YSh7XG5kZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YTpkZWNvZGVSZW1vdGFibGVPclByb21pc2VGcm9tQ2FwRGF0YSxcbmRlY29kZVByb21pc2VGcm9tQ2FwRGF0YTpkZWNvZGVSZW1vdGFibGVPclByb21pc2VGcm9tQ2FwRGF0YSxcbmRlY29kZUVycm9yRnJvbUNhcERhdGF9KTtcblxuXG5jb25zdCBtYWtlRGVjb2RlU2xvdEZyb21TbWFsbGNhcHM9KHByZWZpeCk9Pntcbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZ0VuY29kaW5nXG4gKiBAcGFyYW0geyhlOiB1bmtub3duKSA9PiBQYXNzYWJsZX0gX2RlY29kZVJlY3VyXG4gKiBAcmV0dXJucyB7UmVtb3RhYmxlIHwgUHJvbWlzZX1cbiAqL1xucmV0dXJuKHN0cmluZ0VuY29kaW5nLF9kZWNvZGVSZWN1cik9PntcbmFzc2VydChzdHJpbmdFbmNvZGluZy5zdGFydHNXaXRoKHByZWZpeCkpO1xuLyogc2xvdHM6ICRzbG90SW5kZXguaWZhY2Ugb3IgJHNsb3RJbmRleCovXG5jb25zdCBpPXN0cmluZ0VuY29kaW5nLmluZGV4T2YoJy4nKTtcbmNvbnN0IGluZGV4PU51bWJlcihzdHJpbmdFbmNvZGluZy5zbGljZSgxLGk8MD91bmRlZmluZWQ6aSkpO1xuLyogaSA8IDAgbWVhbnMgdGhlcmUgd2FzIG5vIGlmYWNlIGluY2x1ZGVkLiovXG5jb25zdCBpZmFjZT1pPDA/dW5kZWZpbmVkOnN0cmluZ0VuY29kaW5nLnNsaWNlKGkrMSk7XG5yZXR1cm4gZGVjb2RlU2xvdENvbW1vbih7aWZhY2UsaW5kZXh9KTtcbiB9O1xuIH07XG5jb25zdCBkZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzPW1ha2VEZWNvZGVTbG90RnJvbVNtYWxsY2FwcygnJCcpO1xuY29uc3QgZGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHM9bWFrZURlY29kZVNsb3RGcm9tU21hbGxjYXBzKCcmJyk7XG5cbmNvbnN0IGRlY29kZUVycm9yRnJvbVNtYWxsY2Fwcz0oZW5jb2RpbmcsZGVjb2RlUmVjdXIpPT57XG5jb25zdHsnI2Vycm9yJzptZXNzYWdlLC4uLnJlc3RFcnJEYXRhfT1lbmNvZGluZztcbiFoYXNPd25Qcm9wZXJ0eU9mKHJlc3RFcnJEYXRhLCdtZXNzYWdlJyl8fFxuRmFpbCBgdW5leHBlY3RlZCBlbmNvZGVkIGVycm9yIHByb3BlcnR5ICR7cSgnbWVzc2FnZScpfWA7XG5yZXR1cm4gZGVjb2RlRXJyb3JDb21tb24oe21lc3NhZ2UsLi4ucmVzdEVyckRhdGF9LGRlY29kZVJlY3VyKTtcbiB9O1xuXG5jb25zdCByZXZpdmVGcm9tU21hbGxjYXBzPW1ha2VEZWNvZGVGcm9tU21hbGxjYXBzKHtcbmRlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHMsXG5kZWNvZGVQcm9taXNlRnJvbVNtYWxsY2FwcyxcbmRlY29kZUVycm9yRnJvbVNtYWxsY2Fwc30pO1xuXG5cbnJldHVybiBoYXJkZW4oe3Jldml2ZUZyb21DYXBEYXRhLHJldml2ZUZyb21TbWFsbGNhcHN9KTtcbiB9O1xuXG4vKipcbiAqIEB0eXBlIHtGcm9tQ2FwRGF0YTxTbG90Pn1cbiAqL1xuY29uc3QgZnJvbUNhcERhdGE9KGRhdGEpPT57XG5jb25zdHtib2R5LHNsb3RzfT1kYXRhO1xudHlwZW9mIGJvZHk9PT0nc3RyaW5nJ3x8XG5GYWlsIGB1bnNlcmlhbGl6ZSgpIGdpdmVuIG5vbi1jYXBkYXRhICguYm9keSBpcyAke2JvZHl9LCBub3Qgc3RyaW5nKWA7XG5pc0FycmF5KGRhdGEuc2xvdHMpfHxcbkZhaWwgYHVuc2VyaWFsaXplKCkgZ2l2ZW4gbm9uLWNhcGRhdGEgKC5zbG90cyBhcmUgbm90IEFycmF5KWA7XG5jb25zdHtyZXZpdmVGcm9tQ2FwRGF0YSxyZXZpdmVGcm9tU21hbGxjYXBzfT1tYWtlRnVsbFJldml2ZShzbG90cyk7XG5sZXQgcmVzdWx0O1xuLyogSlNPTiBjYW5ub3QgYmVnaW4gd2l0aCBhICcjJywgc28gdGhpcyBpcyBhbiB1bmFtYmlndW91cyBzaWduYWwuKi9cbmlmKGJvZHkuc3RhcnRzV2l0aCgnIycpKXtcbmNvbnN0IHNtYWxsY2Fwc0JvZHk9Ym9keS5zbGljZSgxKTtcbmNvbnN0IGVuY29kaW5nPWhhcmRlbihKU09OLnBhcnNlKHNtYWxsY2Fwc0JvZHkpKTtcbnJlc3VsdD1oYXJkZW4ocmV2aXZlRnJvbVNtYWxsY2FwcyhlbmNvZGluZykpO1xuIH1lbHNle1xuY29uc3QgcmF3VHJlZT1oYXJkZW4oSlNPTi5wYXJzZShib2R5KSk7XG5yZXN1bHQ9aGFyZGVuKHJldml2ZUZyb21DYXBEYXRhKHJhd1RyZWUpKTtcbiB9XG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy80MzM3Ki9cbi8qIHdoaWNoIHNob3VsZCBiZSBjb25zaWRlcmVkIGZpeGVkIG9uY2Ugd2UndmUgY29tcGxldGVkIHRoZSBzd2l0Y2gqL1xuLyogdG8gc21hbGxjYXBzLiovXG5hc3NlcnRQYXNzYWJsZShyZXN1bHQpO1xucmV0dXJuIHJlc3VsdDtcbiB9O1xuXG5yZXR1cm4gaGFyZGVuKHtcbnRvQ2FwRGF0YSxcbmZyb21DYXBEYXRhLFxuXG4vKiBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkqL1xuLyoqIEBkZXByZWNhdGVkIHVzZSB0b0NhcERhdGEgKi9cbnNlcmlhbGl6ZTp0b0NhcERhdGEsXG4vKiogQGRlcHJlY2F0ZWQgdXNlIGZyb21DYXBEYXRhICovXG51bnNlcmlhbGl6ZTpmcm9tQ2FwRGF0YX0pO1xuXG4gfTskaOKAjV9vbmNlLm1ha2VNYXJzaGFsKG1ha2VNYXJzaGFsKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlTWFyc2hhbCI6WyJtYWtlTWFyc2hhbCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAC4Ftro80AAAPNAAAAlAAAAQGVuZG8vbWFyc2hhbC12MC44Ljkvc3JjL3JhbmtPcmRlci5qc3siaW1wb3J0cyI6WyJAZW5kby9wYXNzLXN0eWxlIiwiLi9lbmNvZGVQYXNzYWJsZS5qcyJdLCJleHBvcnRzIjpbIkZ1bGxSYW5rQ292ZXIiLCJhc3NlcnRSYW5rU29ydGVkIiwiY29tcGFyYXRvck1pcnJvckltYWdlIiwiY29tcGFyZUFudGlSYW5rIiwiY29tcGFyZVJhbmsiLCJjb3ZlcmVkRW50cmllcyIsImdldEluZGV4Q292ZXIiLCJnZXRQYXNzU3R5bGVDb3ZlciIsImludGVyc2VjdFJhbmtDb3ZlcnMiLCJpc1JhbmtTb3J0ZWQiLCJtYWtlQ29tcGFyYXRvcktpdCIsIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0Iiwic29ydEJ5UmFuayIsInRyaXZpYWxDb21wYXJhdG9yIiwidW5pb25SYW5rQ292ZXJzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGdldFRhZyxwYXNzU3R5bGVPZixuYW1lRm9yUGFzc2FibGVTeW1ib2wscGFzc1N0eWxlUHJlZml4ZXMscmVjb3JkTmFtZXMscmVjb3JkVmFsdWVzOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcImdldFRhZ1wiLCBbJGjigI1fYSA9PiAoZ2V0VGFnID0gJGjigI1fYSldXSxbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlT2YgPSAkaOKAjV9hKV1dLFtcIm5hbWVGb3JQYXNzYWJsZVN5bWJvbFwiLCBbJGjigI1fYSA9PiAobmFtZUZvclBhc3NhYmxlU3ltYm9sID0gJGjigI1fYSldXV1dLFtcIi4vZW5jb2RlUGFzc2FibGUuanNcIiwgW1tcInBhc3NTdHlsZVByZWZpeGVzXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVQcmVmaXhlcyA9ICRo4oCNX2EpXV0sW1wicmVjb3JkTmFtZXNcIiwgWyRo4oCNX2EgPT4gKHJlY29yZE5hbWVzID0gJGjigI1fYSldXSxbXCJyZWNvcmRWYWx1ZXNcIiwgWyRo4oCNX2EgPT4gKHJlY29yZFZhbHVlcyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9wYXNzLXN0eWxlJykuUGFzc2FibGV9IFBhc3NhYmxlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL3Bhc3Mtc3R5bGUnKS5QYXNzU3R5bGV9IFBhc3NTdHlsZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUmFua0NvdmVyfSBSYW5rQ292ZXIgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlJhbmtDb21wYXJpc29ufSBSYW5rQ29tcGFyaXNvbiAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUmFua0NvbXBhcmV9IFJhbmtDb21wYXJlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5GdWxsQ29tcGFyZX0gRnVsbENvbXBhcmUgKi9cblxuY29uc3R7RmFpbCxxdW90ZTpxfT1hc3NlcnQ7XG5jb25zdHtlbnRyaWVzLGZyb21FbnRyaWVzLHNldFByb3RvdHlwZU9mLGlzfT1PYmplY3Q7XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUmFua0NvbXBhcmF0b3JLaXRcbiAqIEBwcm9wZXJ0eSB7UmFua0NvbXBhcmV9IGNvbXBhcmF0b3JcbiAqIEBwcm9wZXJ0eSB7UmFua0NvbXBhcmV9IGFudGlDb21wYXJhdG9yXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBGdWxsQ29tcGFyYXRvcktpdFxuICogQHByb3BlcnR5IHtGdWxsQ29tcGFyZX0gY29tcGFyYXRvclxuICogQHByb3BlcnR5IHtGdWxsQ29tcGFyZX0gYW50aUNvbXBhcmF0b3JcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtbbnVtYmVyLCBudW1iZXJdfSBJbmRleENvdmVyXG4gKi9cblxuLyoqXG4gKiBUaGlzIGlzIHRoZSBlcXVhbGl0eSBjb21wYXJpc29uIHVzZWQgYnkgSmF2YVNjcmlwdCdzIE1hcCBhbmQgU2V0XG4gKiBhYnN0cmFjdGlvbnMsIHdoZXJlIE5hTiBpcyB0aGUgc2FtZSBhcyBOYU4gYW5kIC0wIGlzIHRoZSBzYW1lIGFzXG4gKiAwLiBNYXJzaGFsIHNlcmlhbGl6ZXMgLTAgYXMgemVybywgc28gdGhlIHNlbWFudGljcyBvZiBvdXIgZGlzdHJpYnV0ZWRcbiAqIG9iamVjdCBzeXN0ZW0gZG9lcyBub3QgZGlzdGluZ3Vpc2ggMCBmcm9tIC0wLlxuICpcbiAqIGBzYW1lVmFsdWVaZXJvYCBpcyB0aGUgRWNtYVNjcmlwdCBzcGVjIG5hbWUgZm9yIHRoaXMgZXF1YWxpdHkgY29tcGFyaXNvbixcbiAqIGJ1dCBUT0RPIHdlIG5lZWQgYSBiZXR0ZXIgbmFtZSBmb3IgdGhlIEFQSS5cbiAqXG4gKiBAcGFyYW0ge2FueX0geFxuICogQHBhcmFtIHthbnl9IHlcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBzYW1lVmFsdWVaZXJvPSh4LHkpPT54PT09eXx8aXMoeCx5KTtcblxuY29uc3QgICAgICAgIHRyaXZpYWxDb21wYXJhdG9yPShsZWZ0LHJpZ2h0KT0+XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmVzdGVkLXRlcm5hcnksIEBlbmRvL3Jlc3RyaWN0LWNvbXBhcmlzb24tb3BlcmFuZHMqL1xubGVmdDxyaWdodD8tMTpsZWZ0PT09cmlnaHQ/MDoxO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtSZWNvcmQ8UGFzc1N0eWxlLCB7IGluZGV4OiBudW1iZXIsIGNvdmVyOiBSYW5rQ292ZXIgfT59IFBhc3NTdHlsZVJhbmtzUmVjb3JkXG4gKi8kaOKAjV9vbmNlLnRyaXZpYWxDb21wYXJhdG9yKHRyaXZpYWxDb21wYXJhdG9yKTtcblxuY29uc3QgcGFzc1N0eWxlUmFua3M9LyoqIEB0eXBlIHtQYXNzU3R5bGVSYW5rc1JlY29yZH0gKi9cbmZyb21FbnRyaWVzKFxuZW50cmllcyhwYXNzU3R5bGVQcmVmaXhlcylcbi8qIFNvcnQgZW50cmllcyBieSBhc2NlbmRpbmcgcHJlZml4LiovLlxuc29ydCgoW19sZWZ0U3R5bGUsbGVmdFByZWZpeGVzXSxbX3JpZ2h0U3R5bGUscmlnaHRQcmVmaXhlc10pPT57XG5yZXR1cm4gdHJpdmlhbENvbXBhcmF0b3IobGVmdFByZWZpeGVzLHJpZ2h0UHJlZml4ZXMpO1xuIH0pLlxubWFwKChbcGFzc1N0eWxlLHByZWZpeGVzXSxpbmRleCk9Pntcbi8qIENvdmVyIGFsbCBzdHJpbmdzIHRoYXQgc3RhcnQgd2l0aCBhbnkgY2hhcmFjdGVyIGluIGBwcmVmaXhlc2AsKi9cbi8qIHZlcmlmeWluZyB0aGF0IGl0IGlzIHNvcnRlZCBzbyB0aGF0IGlzKi9cbi8qIGFsbCBzIHN1Y2ggdGhhdCBwcmVmaXhlcy5hdCgwKSDiiaQgcyA8IHN1Y2Nlc3NvcihwcmVmaXhlcy5hdCgtMSkpLiovXG5wcmVmaXhlcz09PVsuLi5wcmVmaXhlc10uc29ydCgpLmpvaW4oJycpfHxcbkZhaWwgYHVuc29ydGVkIHByZWZpeGVzIGZvciBwYXNzU3R5bGUgJHtxKHBhc3NTdHlsZSl9OiAke3EocHJlZml4ZXMpfWA7XG5jb25zdCBjb3Zlcj1bXG5wcmVmaXhlcy5jaGFyQXQoMCksXG5TdHJpbmcuZnJvbUNoYXJDb2RlKHByZWZpeGVzLmNoYXJDb2RlQXQocHJlZml4ZXMubGVuZ3RoLTEpKzEpXTtcblxucmV0dXJuW3Bhc3NTdHlsZSx7aW5kZXgsY292ZXJ9XTtcbiB9KSk7XG5cblxuc2V0UHJvdG90eXBlT2YocGFzc1N0eWxlUmFua3MsbnVsbCk7XG5oYXJkZW4ocGFzc1N0eWxlUmFua3MpO1xuXG4vKipcbiAqIEFzc29jaWF0ZSB3aXRoIGVhY2ggcGFzc1N0eWxlIGEgUmFua0NvdmVyIHRoYXQgbWF5IGJlIGFuIG92ZXJlc3RpbWF0ZSxcbiAqIGFuZCB3aG9zZSByZXN1bHRzIHRoZXJlZm9yZSBuZWVkIHRvIGJlIGZpbHRlcmVkIGRvd24uIEZvciBleGFtcGxlLCBiZWNhdXNlXG4gKiB0aGVyZSBpcyBub3QgYSBzbWFsbGVzdCBvciBiaWdnZXN0IGJpZ2ludCwgYm91bmQgaXQgYnkgYE5hTmAgKHRoZSBsYXN0IHBsYWNlXG4gKiBudW1iZXIpIGFuZCBgJydgICh0aGUgZW1wdHkgc3RyaW5nLCB3aGljaCBpcyB0aGUgZmlyc3QgcGxhY2Ugc3RyaW5nKS4gVGh1cyxcbiAqIGEgcmFuZ2UgcXVlcnkgdXNpbmcgdGhpcyByYW5nZSBtYXkgaW5jbHVkZSB0aGVzZSB2YWx1ZXMsIHdoaWNoIHdvdWxkIHRoZW5cbiAqIG5lZWQgdG8gYmUgZmlsdGVyZWQgb3V0LlxuICpcbiAqIEBwYXJhbSB7UGFzc1N0eWxlfSBwYXNzU3R5bGVcbiAqIEByZXR1cm5zIHtSYW5rQ292ZXJ9XG4gKi9cbmNvbnN0ICAgICAgICBnZXRQYXNzU3R5bGVDb3Zlcj0ocGFzc1N0eWxlKT0+cGFzc1N0eWxlUmFua3NbcGFzc1N0eWxlXS5jb3ZlcjskaOKAjV9vbmNlLmdldFBhc3NTdHlsZUNvdmVyKGdldFBhc3NTdHlsZUNvdmVyKTtcbmhhcmRlbihnZXRQYXNzU3R5bGVDb3Zlcik7XG5cbi8qKlxuICogQHR5cGUge1dlYWtNYXA8UmFua0NvbXBhcmUsV2Vha1NldDxQYXNzYWJsZVtdPj59XG4gKi9cbmNvbnN0IG1lbW9PZlNvcnRlZD1uZXcgV2Vha01hcCgpO1xuXG4vKipcbiAqIEB0eXBlIHtXZWFrTWFwPFJhbmtDb21wYXJlLFJhbmtDb21wYXJlPn1cbiAqL1xuY29uc3QgY29tcGFyYXRvck1pcnJvckltYWdlcz1uZXcgV2Vha01hcCgpO1xuXG4vKipcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmU9fSBjb21wYXJlUmVtb3RhYmxlc1xuICogQW4gb3B0aW9uIHRvIGNyZWF0ZSBhIGNvbXBhcmF0b3IgaW4gd2hpY2ggYW4gaW50ZXJuYWwgb3JkZXIgaXNcbiAqIGFzc2lnbmVkIHRvIHJlbW90YWJsZXMuIFRoaXMgZGVmYXVsdHMgdG8gYSBjb21wYXJhdG9yIHRoYXRcbiAqIGFsd2F5cyByZXR1cm5zIGAwYCwgbWVhbmluZyB0aGF0IGFsbCByZW1vdGFibGVzIGFyZSB0aWVkXG4gKiBmb3IgdGhlIHNhbWUgcmFuay5cbiAqIEByZXR1cm5zIHtSYW5rQ29tcGFyYXRvcktpdH1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VDb21wYXJhdG9yS2l0PShjb21wYXJlUmVtb3RhYmxlcz0oX3gsX3kpPT4wKT0+e1xuLyoqIEB0eXBlIHtSYW5rQ29tcGFyZX0gKi9cbmNvbnN0IGNvbXBhcmF0b3I9KGxlZnQscmlnaHQpPT57XG5pZihzYW1lVmFsdWVaZXJvKGxlZnQscmlnaHQpKXtcbnJldHVybiAwO1xuIH1cbmNvbnN0IGxlZnRTdHlsZT1wYXNzU3R5bGVPZihsZWZ0KTtcbmNvbnN0IHJpZ2h0U3R5bGU9cGFzc1N0eWxlT2YocmlnaHQpO1xuaWYobGVmdFN0eWxlIT09cmlnaHRTdHlsZSl7XG5yZXR1cm4gdHJpdmlhbENvbXBhcmF0b3IoXG5wYXNzU3R5bGVSYW5rc1tsZWZ0U3R5bGVdLmluZGV4LFxucGFzc1N0eWxlUmFua3NbcmlnaHRTdHlsZV0uaW5kZXgpO1xuXG4gfVxuLyogZXNsaW50LWRpc2FibGUgQGVuZG8vcmVzdHJpY3QtY29tcGFyaXNvbi1vcGVyYW5kcyAtLVxuICogV2Uga25vdyBgbGVmdGAgYW5kIGByaWdodGAgYXJlIGNvbXBhcmFibGUuXG4gKi9cbnN3aXRjaChsZWZ0U3R5bGUpe1xuY2FzZSdyZW1vdGFibGUnOntcbnJldHVybiBjb21wYXJlUmVtb3RhYmxlcyhsZWZ0LHJpZ2h0KTtcbiB9XG5jYXNlJ3VuZGVmaW5lZCc6XG5jYXNlJ251bGwnOlxuY2FzZSdlcnJvcic6XG5jYXNlJ3Byb21pc2UnOntcbi8qIEZvciBlYWNoIG9mIHRoZXNlIHBhc3NTdHlsZXMsIGFsbCBtZW1iZXJzIG9mIHRoYXQgcGFzc1N0eWxlIGFyZSB0aWVkKi9cbi8qIGZvciB0aGUgc2FtZSByYW5rLiovXG5yZXR1cm4gMDtcbiB9XG5jYXNlJ2Jvb2xlYW4nOlxuY2FzZSdiaWdpbnQnOlxuY2FzZSdzdHJpbmcnOntcbi8qIFdpdGhpbiBlYWNoIG9mIHRoZXNlIHBhc3NTdHlsZXMsIHRoZSByYW5rIG9yZGVyaW5nIGFncmVlcyB3aXRoKi9cbi8qIEphdmFTY3JpcHQncyByZWxhdGlvbmFsIG9wZXJhdG9ycyBgPGAgYW5kIGA+YC4qL1xuaWYobGVmdDxyaWdodCl7XG5yZXR1cm4tMTtcbiB9ZWxzZXtcbmFzc2VydChsZWZ0PnJpZ2h0KTtcbnJldHVybiAxO1xuIH1cbiB9XG5jYXNlJ3N5bWJvbCc6e1xucmV0dXJuIGNvbXBhcmF0b3IoXG5uYW1lRm9yUGFzc2FibGVTeW1ib2wobGVmdCksXG5uYW1lRm9yUGFzc2FibGVTeW1ib2wocmlnaHQpKTtcblxuIH1cbmNhc2UnbnVtYmVyJzp7XG4vKiBgTmFOYCdzIHJhbmsgaXMgYWZ0ZXIgYWxsIG90aGVyIG51bWJlcnMuKi9cbmlmKE51bWJlci5pc05hTihsZWZ0KSl7XG5hc3NlcnQoIU51bWJlci5pc05hTihyaWdodCkpO1xucmV0dXJuIDE7XG4gfWVsc2UgaWYoTnVtYmVyLmlzTmFOKHJpZ2h0KSl7XG5yZXR1cm4tMTtcbiB9XG4vKiBUaGUgcmFuayBvcmRlcmluZyBvZiBub24tTmFOIG51bWJlcnMgYWdyZWVzIHdpdGggSmF2YVNjcmlwdCdzKi9cbi8qIHJlbGF0aW9uYWwgb3BlcmF0b3JzICc8JyBhbmQgJz4nLiovXG5pZihsZWZ0PHJpZ2h0KXtcbnJldHVybi0xO1xuIH1lbHNle1xuYXNzZXJ0KGxlZnQ+cmlnaHQpO1xucmV0dXJuIDE7XG4gfVxuIH1cbmNhc2UnY29weVJlY29yZCc6e1xuLyogTGV4aWNvZ3JhcGhpYyBieSBpbnZlcnNlIHNvcnRlZCBvcmRlciBvZiBwcm9wZXJ0eSBuYW1lcywgdGhlbiovXG4vKiBsZXhpY29ncmFwaGljIGJ5IGNvcnJlc3BvbmRpbmcgdmFsdWVzIGluIHRoYXQgc2FtZSBpbnZlcnNlKi9cbi8qIG9yZGVyIG9mIHRoZWlyIHByb3BlcnR5IG5hbWVzLiBDb21wYXJpbmcgbmFtZXMgYnkgdGhlbXNlbHZlcyBmaXJzdCwqL1xuLyogYWxsIHJlY29yZHMgd2l0aCB0aGUgZXhhY3Qgc2FtZSBzZXQgb2YgcHJvcGVydHkgbmFtZXMgc29ydCBuZXh0IHRvKi9cbi8qIGVhY2ggb3RoZXIgaW4gYSByYW5rLXNvcnQgb2YgY29weVJlY29yZHMuKi9cblxuLyogVGhlIGNvcHlSZWNvcmQgaW52YXJpYW50cyBlbmZvcmNlZCBieSBwYXNzU3R5bGVPZiBlbnN1cmUgdGhhdCovXG4vKiBhbGwgdGhlIHByb3BlcnR5IG5hbWVzIGFyZSBzdHJpbmdzLiBXZSBuZWVkIHRoZSByZXZlcnNlIHNvcnRlZCBvcmRlciovXG4vKiBvZiB0aGVzZSBuYW1lcywgd2hpY2ggd2UgdGhlbiBjb21wYXJlIGxleGljb2dyYXBoaWNhbGx5LiBUaGlzIGVuc3VyZXMqL1xuLyogdGhhdCBpZiB0aGUgbmFtZXMgb2YgcmVjb3JkIFggYXJlIGEgc3Vic2V0IG9mIHRoZSBuYW1lcyBvZiByZWNvcmQgWSwqL1xuLyogdGhlbiByZWNvcmQgWCB3aWxsIGhhdmUgYW4gZWFybGllciByYW5rIGFuZCBzb3J0IHRvIHRoZSBsZWZ0IG9mIFkuKi9cbmNvbnN0IGxlZnROYW1lcz1yZWNvcmROYW1lcyhsZWZ0KTtcbmNvbnN0IHJpZ2h0TmFtZXM9cmVjb3JkTmFtZXMocmlnaHQpO1xuXG5jb25zdCByZXN1bHQ9Y29tcGFyYXRvcihsZWZ0TmFtZXMscmlnaHROYW1lcyk7XG5pZihyZXN1bHQhPT0wKXtcbnJldHVybiByZXN1bHQ7XG4gfVxucmV0dXJuIGNvbXBhcmF0b3IoXG5yZWNvcmRWYWx1ZXMobGVmdCxsZWZ0TmFtZXMpLFxucmVjb3JkVmFsdWVzKHJpZ2h0LHJpZ2h0TmFtZXMpKTtcblxuIH1cbmNhc2UnY29weUFycmF5Jzp7XG4vKiBMZXhpY29ncmFwaGljKi9cbmNvbnN0IGxlbj1NYXRoLm1pbihsZWZ0Lmxlbmd0aCxyaWdodC5sZW5ndGgpO1xuZm9yKGxldCBpPTA7aTxsZW47aSs9MSl7XG5jb25zdCByZXN1bHQ9Y29tcGFyYXRvcihsZWZ0W2ldLHJpZ2h0W2ldKTtcbmlmKHJlc3VsdCE9PTApe1xucmV0dXJuIHJlc3VsdDtcbiB9XG4gfVxuLyogSWYgYWxsIG1hdGNoaW5nIGVsZW1lbnRzIHdlcmUgdGllZCwgdGhlbiBhY2NvcmRpbmcgdG8gdGhlaXIgbGVuZ3Rocy4qL1xuLyogSWYgYXJyYXkgWCBpcyBhIHByZWZpeCBvZiBhcnJheSBZLCB0aGVuIFggaGFzIGFuIGVhcmxpZXIgcmFuayB0aGFuIFkuKi9cbnJldHVybiBjb21wYXJhdG9yKGxlZnQubGVuZ3RoLHJpZ2h0Lmxlbmd0aCk7XG4gfVxuY2FzZSd0YWdnZWQnOntcbi8qIExleGljb2dyYXBoaWMgYnkgYFtTeW1ib2wudG9TdHJpbmdUYWddYCB0aGVuIGAucGF5bG9hZGAuKi9cbmNvbnN0IGxhYmVsQ29tcD1jb21wYXJhdG9yKGdldFRhZyhsZWZ0KSxnZXRUYWcocmlnaHQpKTtcbmlmKGxhYmVsQ29tcCE9PTApe1xucmV0dXJuIGxhYmVsQ29tcDtcbiB9XG5yZXR1cm4gY29tcGFyYXRvcihsZWZ0LnBheWxvYWQscmlnaHQucGF5bG9hZCk7XG4gfVxuZGVmYXVsdDp7XG50aHJvdyBGYWlsIGBVbnJlY29nbml6ZWQgcGFzc1N0eWxlOiAke3EobGVmdFN0eWxlKX1gO1xuIH19XG5cbi8qIGVzbGludC1lbmFibGUgKi9cbiB9O1xuXG4vKiogQHR5cGUge1JhbmtDb21wYXJlfSAqL1xuY29uc3QgYW50aUNvbXBhcmF0b3I9KHgseSk9PmNvbXBhcmF0b3IoeSx4KTtcblxubWVtb09mU29ydGVkLnNldChjb21wYXJhdG9yLG5ldyBXZWFrU2V0KCkpO1xubWVtb09mU29ydGVkLnNldChhbnRpQ29tcGFyYXRvcixuZXcgV2Vha1NldCgpKTtcbmNvbXBhcmF0b3JNaXJyb3JJbWFnZXMuc2V0KGNvbXBhcmF0b3IsYW50aUNvbXBhcmF0b3IpO1xuY29tcGFyYXRvck1pcnJvckltYWdlcy5zZXQoYW50aUNvbXBhcmF0b3IsY29tcGFyYXRvcik7XG5cbnJldHVybiBoYXJkZW4oe2NvbXBhcmF0b3IsYW50aUNvbXBhcmF0b3J9KTtcbiB9O1xuLyoqXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJhdG9yXG4gKiBAcmV0dXJucyB7UmFua0NvbXBhcmU9fVxuICovJGjigI1fb25jZS5tYWtlQ29tcGFyYXRvcktpdChtYWtlQ29tcGFyYXRvcktpdCk7XG5jb25zdCAgICAgICAgY29tcGFyYXRvck1pcnJvckltYWdlPShjb21wYXJhdG9yKT0+XG5jb21wYXJhdG9yTWlycm9ySW1hZ2VzLmdldChjb21wYXJhdG9yKTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlW119IHBhc3NhYmxlc1xuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi8kaOKAjV9vbmNlLmNvbXBhcmF0b3JNaXJyb3JJbWFnZShjb21wYXJhdG9yTWlycm9ySW1hZ2UpO1xuY29uc3QgICAgICAgIGlzUmFua1NvcnRlZD0ocGFzc2FibGVzLGNvbXBhcmUpPT57XG5jb25zdCBzdWJNZW1vT2ZTb3J0ZWQ9bWVtb09mU29ydGVkLmdldChjb21wYXJlKTtcbmFzc2VydChzdWJNZW1vT2ZTb3J0ZWQhPT11bmRlZmluZWQpO1xuaWYoc3ViTWVtb09mU29ydGVkLmhhcyhwYXNzYWJsZXMpKXtcbnJldHVybiB0cnVlO1xuIH1cbmFzc2VydChwYXNzU3R5bGVPZihwYXNzYWJsZXMpPT09J2NvcHlBcnJheScpO1xuZm9yKGxldCBpPTE7aTxwYXNzYWJsZXMubGVuZ3RoO2krPTEpe1xuaWYoY29tcGFyZShwYXNzYWJsZXNbaS0xXSxwYXNzYWJsZXNbaV0pPj0xKXtcbnJldHVybiBmYWxzZTtcbiB9XG4gfVxuc3ViTWVtb09mU29ydGVkLmFkZChwYXNzYWJsZXMpO1xucmV0dXJuIHRydWU7XG4gfTskaOKAjV9vbmNlLmlzUmFua1NvcnRlZChpc1JhbmtTb3J0ZWQpO1xuaGFyZGVuKGlzUmFua1NvcnRlZCk7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZVtdfSBzb3J0ZWRcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqL1xuY29uc3QgICAgICAgIGFzc2VydFJhbmtTb3J0ZWQ9KHNvcnRlZCxjb21wYXJlKT0+XG5pc1JhbmtTb3J0ZWQoc29ydGVkLGNvbXBhcmUpfHxcbi8qIFRPRE8gYXNzZXJ0IG9uIGJ1ZyBjb3VsZCBsZWFkIHRvIGluZmluaXRlIHJlY3Vyc2lvbi4gRml4LiovXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuRmFpbCBgTXVzdCBiZSByYW5rIHNvcnRlZDogJHtzb3J0ZWR9IHZzICR7c29ydEJ5UmFuayhzb3J0ZWQsY29tcGFyZSl9YDskaOKAjV9vbmNlLmFzc2VydFJhbmtTb3J0ZWQoYXNzZXJ0UmFua1NvcnRlZCk7XG5oYXJkZW4oYXNzZXJ0UmFua1NvcnRlZCk7XG5cbi8qKlxuICogVE9ETyBTRUNVUklUWSBCVUc6IGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNDI2MFxuICogc29ydEJ5UmFuayBjdXJyZW50bHkgdXNlcyBgQXJyYXkucHJvdG90eXBlLnNvcnRgIGRpcmVjdGx5LCBhbmRcbiAqIHNvIG9ubHkgd29ya3MgY29ycmVjdGx5IHdoZW4gZ2l2ZW4gYSBgY29tcGFyZWAgZnVuY3Rpb24gdGhhdCBjb25zaWRlcnNcbiAqIGB1bmRlZmluZWRgIHN0cmljdGx5IGJpZ2dlciAoYD5gKSB0aGFuIGV2ZXJ5dGhpbmcgZWxzZS4gVGhpcyBpc1xuICogYmVjYXVzZSBgQXJyYXkucHJvdG90eXBlLnNvcnRgIGJpemFycmVseSBtb3ZlcyBhbGwgYHVuZGVmaW5lZGBzIHRvXG4gKiB0aGUgZW5kIG9mIHRoZSBhcnJheSByZWdhcmRsZXNzLCB3aXRob3V0IGNvbnN1bHRpbmcgdGhlIGBjb21wYXJlYFxuICogZnVuY3Rpb24uIFRoaXMgaXMgYSBnZW51aW5lIGJ1ZyBmb3IgdXMgTk9XIGJlY2F1c2Ugc29tZXRpbWVzIHdlIHNvcnRcbiAqIGluIHJldmVyc2Ugb3JkZXIgYnkgcGFzc2luZyBhIHJldmVyc2VkIHJhbmsgY29tcGFyaXNvbiBmdW5jdGlvbi5cbiAqXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFBhc3NhYmxlPn0gcGFzc2FibGVzXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcmV0dXJucyB7UGFzc2FibGVbXX1cbiAqL1xuY29uc3QgICAgICAgIHNvcnRCeVJhbms9KHBhc3NhYmxlcyxjb21wYXJlKT0+e1xuaWYoQXJyYXkuaXNBcnJheShwYXNzYWJsZXMpKXtcbmhhcmRlbihwYXNzYWJsZXMpO1xuLyogQ2FsbGluZyBpc1JhbmtTb3J0ZWQgZ2l2ZXMgaXQgYSBjaGFuY2UgdG8gZ2V0IG1lbW9pemVkIGZvciovXG4vKiB0aGlzIGBjb21wYXJlYCBmdW5jdGlvbiBldmVuIGlmIGl0IHdhcyBhbHJlYWR5IG1lbW9pemVkIGZvciBhIGRpZmZlcmVudCovXG4vKiBgY29tcGFyZWAgZnVuY3Rpb24uKi9cbmlmKGlzUmFua1NvcnRlZChwYXNzYWJsZXMsY29tcGFyZSkpe1xucmV0dXJuIHBhc3NhYmxlcztcbiB9XG4gfVxuY29uc3QgdW5zb3J0ZWQ9Wy4uLnBhc3NhYmxlc107XG51bnNvcnRlZC5mb3JFYWNoKGhhcmRlbik7XG5jb25zdCBzb3J0ZWQ9aGFyZGVuKHVuc29ydGVkLnNvcnQoY29tcGFyZSkpO1xuY29uc3Qgc3ViTWVtb09mU29ydGVkPW1lbW9PZlNvcnRlZC5nZXQoY29tcGFyZSk7XG5hc3NlcnQoc3ViTWVtb09mU29ydGVkIT09dW5kZWZpbmVkKTtcbnN1Yk1lbW9PZlNvcnRlZC5hZGQoc29ydGVkKTtcbnJldHVybiBzb3J0ZWQ7XG4gfTskaOKAjV9vbmNlLnNvcnRCeVJhbmsoc29ydEJ5UmFuayk7XG5oYXJkZW4oc29ydEJ5UmFuayk7XG5cbi8qKlxuICogU2VlXG4gKiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9CaW5hcnlfc2VhcmNoX2FsZ29yaXRobSNQcm9jZWR1cmVfZm9yX2ZpbmRpbmdfdGhlX2xlZnRtb3N0X2VsZW1lbnRcbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlW119IHNvcnRlZFxuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyZVxuICogQHBhcmFtIHtQYXNzYWJsZX0ga2V5XG4gKiBAcGFyYW0geyhcImxlZnRNb3N0XCIgfCBcInJpZ2h0TW9zdFwiKT19IGJpYXNcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbmNvbnN0IHJhbmtTZWFyY2g9KHNvcnRlZCxjb21wYXJlLGtleSxiaWFzPSdsZWZ0TW9zdCcpPT57XG5hc3NlcnRSYW5rU29ydGVkKHNvcnRlZCxjb21wYXJlKTtcbmxldCBsZWZ0PTA7XG5sZXQgcmlnaHQ9c29ydGVkLmxlbmd0aDtcbndoaWxlKGxlZnQ8cmlnaHQpe1xuY29uc3QgbT1NYXRoLmZsb29yKChsZWZ0K3JpZ2h0KS8yKTtcbmNvbnN0IGNvbXA9Y29tcGFyZShzb3J0ZWRbbV0sa2V5KTtcbmlmKGNvbXA8PS0xfHxjb21wPT09MCYmYmlhcz09PSdyaWdodE1vc3QnKXtcbmxlZnQ9bSsxO1xuIH1lbHNle1xuYXNzZXJ0KGNvbXA+PTF8fGNvbXA9PT0wJiZiaWFzPT09J2xlZnRNb3N0Jyk7XG5yaWdodD1tO1xuIH1cbiB9XG5yZXR1cm4gYmlhcz09PSdsZWZ0TW9zdCc/bGVmdDpyaWdodC0xO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZVtdfSBzb3J0ZWRcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqIEBwYXJhbSB7UmFua0NvdmVyfSByYW5rQ292ZXJcbiAqIEByZXR1cm5zIHtJbmRleENvdmVyfVxuICovXG5jb25zdCAgICAgICAgZ2V0SW5kZXhDb3Zlcj0oc29ydGVkLGNvbXBhcmUsW2xlZnRLZXkscmlnaHRLZXldKT0+e1xuYXNzZXJ0UmFua1NvcnRlZChzb3J0ZWQsY29tcGFyZSk7XG5jb25zdCBsZWZ0SW5kZXg9cmFua1NlYXJjaChzb3J0ZWQsY29tcGFyZSxsZWZ0S2V5LCdsZWZ0TW9zdCcpO1xuY29uc3QgcmlnaHRJbmRleD1yYW5rU2VhcmNoKHNvcnRlZCxjb21wYXJlLHJpZ2h0S2V5LCdyaWdodE1vc3QnKTtcbnJldHVybltsZWZ0SW5kZXgscmlnaHRJbmRleF07XG4gfTskaOKAjV9vbmNlLmdldEluZGV4Q292ZXIoZ2V0SW5kZXhDb3Zlcik7XG5oYXJkZW4oZ2V0SW5kZXhDb3Zlcik7XG5cbi8qKiBAdHlwZSB7UmFua0NvdmVyfSAqL1xuY29uc3QgICAgICAgIEZ1bGxSYW5rQ292ZXI9aGFyZGVuKFsnJywneyddKTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlW119IHNvcnRlZFxuICogQHBhcmFtIHtJbmRleENvdmVyfSBpbmRleENvdmVyXG4gKiBAcmV0dXJucyB7SXRlcmFibGU8W251bWJlciwgUGFzc2FibGVdPn1cbiAqLyRo4oCNX29uY2UuRnVsbFJhbmtDb3ZlcihGdWxsUmFua0NvdmVyKTtcbmNvbnN0ICAgICAgICBjb3ZlcmVkRW50cmllcz0oc29ydGVkLFtsZWZ0SW5kZXgscmlnaHRJbmRleF0pPT57XG4vKiogQHR5cGUge0l0ZXJhYmxlPFtudW1iZXIsIFBhc3NhYmxlXT59ICovXG5jb25zdCBpdGVyYWJsZT1oYXJkZW4oe1xuW1N5bWJvbC5pdGVyYXRvcl06KCk9PntcbmxldCBpPWxlZnRJbmRleDtcbnJldHVybiBoYXJkZW4oe1xubmV4dDooKT0+e1xuaWYoaTw9cmlnaHRJbmRleCl7XG5jb25zdCBlbGVtZW50PXNvcnRlZFtpXTtcbmkrPTE7XG5yZXR1cm4gaGFyZGVuKHt2YWx1ZTpbaSxlbGVtZW50XSxkb25lOmZhbHNlfSk7XG4gfWVsc2V7XG5yZXR1cm4gaGFyZGVuKHt2YWx1ZTp1bmRlZmluZWQsZG9uZTp0cnVlfSk7XG4gfVxuIH19KTtcblxuIH19KTtcblxucmV0dXJuIGl0ZXJhYmxlO1xuIH07JGjigI1fb25jZS5jb3ZlcmVkRW50cmllcyhjb3ZlcmVkRW50cmllcyk7XG5oYXJkZW4oY292ZXJlZEVudHJpZXMpO1xuXG4vKipcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqIEBwYXJhbSB7UGFzc2FibGV9IGFcbiAqIEBwYXJhbSB7UGFzc2FibGV9IGJcbiAqIEByZXR1cm5zIHtQYXNzYWJsZX1cbiAqL1xuY29uc3QgbWF4UmFuaz0oY29tcGFyZSxhLGIpPT5jb21wYXJlKGEsYik+PTA/YTpiO1xuXG4vKipcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqIEBwYXJhbSB7UGFzc2FibGV9IGFcbiAqIEBwYXJhbSB7UGFzc2FibGV9IGJcbiAqIEByZXR1cm5zIHtQYXNzYWJsZX1cbiAqL1xuY29uc3QgbWluUmFuaz0oY29tcGFyZSxhLGIpPT5jb21wYXJlKGEsYik8PTA/YTpiO1xuXG4vKipcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqIEBwYXJhbSB7UmFua0NvdmVyW119IGNvdmVyc1xuICogQHJldHVybnMge1JhbmtDb3Zlcn1cbiAqL1xuY29uc3QgICAgICAgIHVuaW9uUmFua0NvdmVycz0oY29tcGFyZSxjb3ZlcnMpPT57XG4vKipcbiAqIEBwYXJhbSB7UmFua0NvdmVyfSBhXG4gKiBAcGFyYW0ge1JhbmtDb3Zlcn0gYlxuICogQHJldHVybnMge1JhbmtDb3Zlcn1cbiAqL1xuY29uc3QgdW5pb25SYW5rQ292ZXJQYWlyPShbbGVmdEEscmlnaHRBXSxbbGVmdEIscmlnaHRCXSk9Pltcbm1pblJhbmsoY29tcGFyZSxsZWZ0QSxsZWZ0QiksXG5tYXhSYW5rKGNvbXBhcmUscmlnaHRBLHJpZ2h0QildO1xuXG5yZXR1cm4gY292ZXJzLnJlZHVjZSh1bmlvblJhbmtDb3ZlclBhaXIsWyd7JywnJ10pO1xuIH07JGjigI1fb25jZS51bmlvblJhbmtDb3ZlcnModW5pb25SYW5rQ292ZXJzKTtcbmhhcmRlbih1bmlvblJhbmtDb3ZlcnMpO1xuXG4vKipcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqIEBwYXJhbSB7UmFua0NvdmVyW119IGNvdmVyc1xuICogQHJldHVybnMge1JhbmtDb3Zlcn1cbiAqL1xuY29uc3QgICAgICAgIGludGVyc2VjdFJhbmtDb3ZlcnM9KGNvbXBhcmUsY292ZXJzKT0+e1xuLyoqXG4gKiBAcGFyYW0ge1JhbmtDb3Zlcn0gYVxuICogQHBhcmFtIHtSYW5rQ292ZXJ9IGJcbiAqIEByZXR1cm5zIHtSYW5rQ292ZXJ9XG4gKi9cbmNvbnN0IGludGVyc2VjdFJhbmtDb3ZlclBhaXI9KFtsZWZ0QSxyaWdodEFdLFtsZWZ0QixyaWdodEJdKT0+W1xubWF4UmFuayhjb21wYXJlLGxlZnRBLGxlZnRCKSxcbm1pblJhbmsoY29tcGFyZSxyaWdodEEscmlnaHRCKV07XG5cbnJldHVybiBjb3ZlcnMucmVkdWNlKGludGVyc2VjdFJhbmtDb3ZlclBhaXIsWycnLCd7J10pO1xuIH07JGjigI1fb25jZS5pbnRlcnNlY3RSYW5rQ292ZXJzKGludGVyc2VjdFJhbmtDb3ZlcnMpO1xuXG5jb25zdCAgICAgICB7Y29tcGFyYXRvcjpjb21wYXJlUmFuayxhbnRpQ29tcGFyYXRvcjpjb21wYXJlQW50aVJhbmt9PVxubWFrZUNvbXBhcmF0b3JLaXQoKTtcblxuLyoqXG4gKiBDcmVhdGUgYSBjb21wYXJhdG9yIGtpdCBpbiB3aGljaCByZW1vdGFibGVzIGFyZSBmdWxseSBvcmRlcmVkXG4gKiBieSB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSBhcmUgZmlyc3Qgc2VlbiBieSAqdGhpcyogY29tcGFyYXRvciBraXQuXG4gKiBCRVdBUkU6IFRoaXMgaXMgb2JzZXJ2YWJsZSBtdXRhYmxlIHN0YXRlLCBzbyBzdWNoIGEgY29tcGFyYXRvciBraXRcbiAqIHNob3VsZCBuZXZlciBiZSBzaGFyZWQgYW1vbmcgc3Vic3lzdGVtcyB0aGF0IHNob3VsZCBub3QgYmUgYWJsZVxuICogdG8gY29tbXVuaWNhdGUuXG4gKlxuICogTm90ZSB0aGF0IHRoaXMgb3JkZXIgZG9lcyBub3QgbWVldCB0aGUgcmVxdWlyZW1lbnRzIGZvciBzdG9yZVxuICogb3JkZXJpbmcsIHNpbmNlIGl0IGhhcyBubyBtZW1vcnkgb2YgZGVsZXRlZCBrZXlzLlxuICpcbiAqIFRoZXNlIGZ1bGwgb3JkZXIgY29tcGFyYXRvciBraXQgaXMgc3RyaWN0bHkgbW9yZSBwcmVjaXNlIHRoYXQgdGhlXG4gKiByYW5rIG9yZGVyIGNvbXBhcmF0b3Iga2l0cyBhYm92ZS4gQXMgYSByZXN1bHQsIGFueSBhcnJheSB3aGljaCBpc1xuICogc29ydGVkIGJ5IHN1Y2ggYSBmdWxsIG9yZGVyIHdpbGwgcGFzcyB0aGUgaXNSYW5rU29ydGVkIHRlc3Qgd2l0aFxuICogYSBjb3JyZXNwb25kaW5nIHJhbmsgb3JkZXIuXG4gKlxuICogQW4gYXJyYXkgd2hpY2ggaXMgc29ydGVkIGJ5IGEgKmZyZXNoKiBmdWxsIG9yZGVyIGNvbXBhcmF0b3IsIGkuZS4sXG4gKiBvbmUgdGhhdCBoYXMgbm90IHlldCBzZWVuIGFueSByZW1vdGFibGVzLCB3aWxsIG9mIGNvdXJzZSByZW1haW5cbiAqIHNvcnRlZCBieSBhY2NvcmRpbmcgdG8gKnRoYXQqIGZ1bGwgb3JkZXIgY29tcGFyYXRvci4gQW4gYXJyYXkgKm9mXG4gKiBzY2FsYXJzKiBzb3J0ZWQgYnkgYSBmcmVzaCBmdWxsIG9yZGVyIHdpbGwgcmVtYWluIHNvcnRlZCBldmVuXG4gKiBhY2NvcmRpbmcgdG8gYSBuZXcgZnJlc2ggZnVsbCBvcmRlciBjb21wYXJhdG9yLCBzaW5jZSBpdCB3aWxsIHNlZVxuICogdGhlIHJlbW90YWJsZXMgaW4gdGhlIHNhbWUgb3JkZXIgYWdhaW4uIFVuZm9ydHVuYXRlbHksIHRoaXMgaXNcbiAqIG5vdCB0cnVlIG9mIGFycmF5cyBvZiBwYXNzYWJsZXMgaW4gZ2VuZXJhbC5cbiAqXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSBsb25nTGl2ZWRcbiAqIEByZXR1cm5zIHtGdWxsQ29tcGFyYXRvcktpdH1cbiAqLyRo4oCNX29uY2UuY29tcGFyZVJhbmsoY29tcGFyZVJhbmspOyRo4oCNX29uY2UuY29tcGFyZUFudGlSYW5rKGNvbXBhcmVBbnRpUmFuayk7XG5jb25zdCAgICAgICAgbWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQ9KGxvbmdMaXZlZD1mYWxzZSk9PntcbmxldCBudW1TZWVuPTA7XG4vKiBXaGVuIGR5bmFtaWNhbGx5IGNyZWF0ZWQgd2l0aCBzaG9ydCBsaWZldGltZXMgKHRoZSBkZWZhdWx0KSBhIFdlYWtNYXAqL1xuLyogd291bGQgcGVyZm9ybSBwb29ybHksIGFuZCB0aGUgbGVhayBjcmVhdGVkIGJ5IGEgTWFwIG9ubHkgbGFzdHMgYXMgbG9uZyovXG4vKiBhcyB0aGUgTWFwLiovXG5jb25zdCBNYXBDb25zdHJ1Y3Rvcj1sb25nTGl2ZWQ/V2Vha01hcDpNYXA7XG5jb25zdCBzZWVuPW5ldyBNYXBDb25zdHJ1Y3RvcigpO1xuY29uc3QgdGFnPShyKT0+e1xuaWYoc2Vlbi5oYXMocikpe1xucmV0dXJuIHNlZW4uZ2V0KHIpO1xuIH1cbm51bVNlZW4rPTE7XG5zZWVuLnNldChyLG51bVNlZW4pO1xucmV0dXJuIG51bVNlZW47XG4gfTtcbmNvbnN0IGNvbXBhcmVSZW1vdGFibGVzPSh4LHkpPT5jb21wYXJlUmFuayh0YWcoeCksdGFnKHkpKTtcbnJldHVybiBtYWtlQ29tcGFyYXRvcktpdChjb21wYXJlUmVtb3RhYmxlcyk7XG4gfTskaOKAjV9vbmNlLm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0KG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0KTtcbmhhcmRlbihtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsidHJpdmlhbENvbXBhcmF0b3IiOlsidHJpdmlhbENvbXBhcmF0b3IiXSwiZ2V0UGFzc1N0eWxlQ292ZXIiOlsiZ2V0UGFzc1N0eWxlQ292ZXIiXSwibWFrZUNvbXBhcmF0b3JLaXQiOlsibWFrZUNvbXBhcmF0b3JLaXQiXSwiY29tcGFyYXRvck1pcnJvckltYWdlIjpbImNvbXBhcmF0b3JNaXJyb3JJbWFnZSJdLCJpc1JhbmtTb3J0ZWQiOlsiaXNSYW5rU29ydGVkIl0sImFzc2VydFJhbmtTb3J0ZWQiOlsiYXNzZXJ0UmFua1NvcnRlZCJdLCJzb3J0QnlSYW5rIjpbInNvcnRCeVJhbmsiXSwiZ2V0SW5kZXhDb3ZlciI6WyJnZXRJbmRleENvdmVyIl0sIkZ1bGxSYW5rQ292ZXIiOlsiRnVsbFJhbmtDb3ZlciJdLCJjb3ZlcmVkRW50cmllcyI6WyJjb3ZlcmVkRW50cmllcyJdLCJ1bmlvblJhbmtDb3ZlcnMiOlsidW5pb25SYW5rQ292ZXJzIl0sImludGVyc2VjdFJhbmtDb3ZlcnMiOlsiaW50ZXJzZWN0UmFua0NvdmVycyJdLCJjb21wYXJlUmFuayI6WyJjb21wYXJlUmFuayJdLCJjb21wYXJlQW50aVJhbmsiOlsiY29tcGFyZUFudGlSYW5rIl0sIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0IjpbIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJgZO7M0AQAANAEAACEAAABAZW5kby9tYXJzaGFsLXYwLjguOS9zcmMvdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAATbI/K78LAAC/CwAAHgAAAEBlbmRvL25hdC12NC4xLjMxL3NyYy9pbmRleC5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiTmF0IiwiaXNOYXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoaXNOYXQsICduYW1lJywge3ZhbHVlOiBcImlzTmF0XCJ9KTskaOKAjV9vbmNlLmlzTmF0KGlzTmF0KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoTmF0LCAnbmFtZScsIHt2YWx1ZTogXCJOYXRcIn0pOyRo4oCNX29uY2UuTmF0KE5hdCk7ICAgLyogQ29weXJpZ2h0IChDKSAyMDExIEdvb2dsZSBJbmMuKi9cbi8qIENvcHlyaWdodCAoQykgMjAxOCBBZ29yaWMqL1xuLyoqL1xuLyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsqL1xuLyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiovXG4vKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQqL1xuLyoqL1xuLyogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKi9cbi8qKi9cbi8qIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUqL1xuLyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLCovXG4vKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4qL1xuLyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCovXG4vKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4qL1xuXG4vKiBAdHMtY2hlY2sqL1xuXG4vKipcbiAqIElzIGBhbGxlZ2VkTnVtYCBhIG51bWJlciBpbiB0aGUgW2NvbnRpZ3VvdXMgcmFuZ2Ugb2YgZXhhY3RseSBhbmRcbiAqIHVuYW1iaWd1b3VzbHlcbiAqIHJlcHJlc2VudGFibGVdKGh0dHBzOi8vZXNkaXNjdXNzLm9yZy90b3BpYy9tb3JlLW51bWVyaWMtY29uc3RhbnRzLXBsZWFzZS1lc3BlY2lhbGx5LWVwc2lsb24jY29udGVudC0xNClcbiAqICBuYXR1cmFsIG51bWJlcnMgKG5vbi1uZWdhdGl2ZSBpbnRlZ2Vycyk/XG4gKlxuICogVG8gcXVhbGlmeSBgYWxsZWdlZE51bWAgbXVzdCBlaXRoZXIgYmUgYVxuICogbm9uLW5lZ2F0aXZlIGBiaWdpbnRgLCBvciBhIG5vbi1uZWdhdGl2ZSBgbnVtYmVyYCByZXByZXNlbnRpbmcgYW4gaW50ZWdlclxuICogd2l0aGluIHJhbmdlIG9mIFtpbnRlZ2VycyBzYWZlbHkgcmVwcmVzZW50YWJsZSBpblxuICogZmxvYXRpbmcgcG9pbnRdKGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtbnVtYmVyLmlzc2FmZWludGVnZXIpLlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gYWxsZWdlZE51bVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGlzTmF0KGFsbGVnZWROdW0pe1xuaWYodHlwZW9mIGFsbGVnZWROdW09PT0nYmlnaW50Jyl7XG5yZXR1cm4gYWxsZWdlZE51bT49MDtcbiB9XG5pZih0eXBlb2YgYWxsZWdlZE51bSE9PSdudW1iZXInKXtcbnJldHVybiBmYWxzZTtcbiB9XG5cbnJldHVybiBOdW1iZXIuaXNTYWZlSW50ZWdlcihhbGxlZ2VkTnVtKSYmYWxsZWdlZE51bT49MDtcbiB9XG5cbi8qKlxuICogSWYgYGFsbGVnZWROdW1iZXJgIHBhc3NlcyB0aGUgYGlzTmF0YCB0ZXN0LCB0aGVuIHJldHVybiBpdCBhcyBhIGJpZ2ludC5cbiAqIE90aGVyd2lzZSB0aHJvdyBhbiBhcHByb3ByaWF0ZSBlcnJvci5cbiAqXG4gKiBJZiBgYWxsZWdlZE51bWAgaXMgbmVpdGhlciBhIGJpZ2ludCBub3IgYSBudW1iZXIsIGBOYXRgIHRocm93cyBhIGBUeXBlRXJyb3JgLlxuICogT3RoZXJ3aXNlLCBpZiBpdCBpcyBub3QgYSBbc2FmZWx5XG4gKiByZXByZXNlbnRhYmxlXShodHRwczovL2VzZGlzY3Vzcy5vcmcvdG9waWMvbW9yZS1udW1lcmljLWNvbnN0YW50cy1wbGVhc2UtZXNwZWNpYWxseS1lcHNpbG9uI2NvbnRlbnQtMTQpXG4gKiBub24tbmVnYXRpdmUgaW50ZWdlciwgYE5hdGAgdGhyb3dzIGEgYFJhbmdlRXJyb3JgLlxuICogT3RoZXJ3aXNlLCBpdCBpcyBjb252ZXJ0ZWQgdG8gYSBiaWdpbnQgaWYgbmVjZXNzYXJ5IGFuZCByZXR1cm5lZC5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IGFsbGVnZWROdW1cbiAqIEByZXR1cm5zIHtiaWdpbnR9XG4gKi9cbmZ1bmN0aW9uIE5hdChhbGxlZ2VkTnVtKXtcbmlmKHR5cGVvZiBhbGxlZ2VkTnVtPT09J2JpZ2ludCcpe1xuaWYoYWxsZWdlZE51bTwwKXtcbnRocm93IFJhbmdlRXJyb3IoIGAke2FsbGVnZWROdW19IGlzIG5lZ2F0aXZlYCk7XG4gfVxucmV0dXJuIGFsbGVnZWROdW07XG4gfVxuXG5pZih0eXBlb2YgYWxsZWdlZE51bT09PSdudW1iZXInKXtcbmlmKCFOdW1iZXIuaXNTYWZlSW50ZWdlcihhbGxlZ2VkTnVtKSl7XG50aHJvdyBSYW5nZUVycm9yKCBgJHthbGxlZ2VkTnVtfSBub3QgYSBzYWZlIGludGVnZXJgKTtcbiB9XG5pZihhbGxlZ2VkTnVtPDApe1xudGhyb3cgUmFuZ2VFcnJvciggYCR7YWxsZWdlZE51bX0gaXMgbmVnYXRpdmVgKTtcbiB9XG5yZXR1cm4gQmlnSW50KGFsbGVnZWROdW0pO1xuIH1cblxudGhyb3cgVHlwZUVycm9yKFxuIGAke2FsbGVnZWROdW19IGlzIGEgJHt0eXBlb2YgYWxsZWdlZE51bX0gYnV0IG11c3QgYmUgYSBiaWdpbnQgb3IgYSBudW1iZXJgKTtcblxuIH1cbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc05hdCI6WyJpc05hdCJdLCJOYXQiOlsiTmF0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAPlDfNZ8CAAAfAgAACAAAABAZW5kby9wYXNzLXN0eWxlLXYwLjEuNy9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3NyYy9pdGVyLWhlbHBlcnMuanMiLCIuL3NyYy9wYXNzU3R5bGUtaGVscGVycy5qcyIsIi4vc3JjL2Vycm9yLmpzIiwiLi9zcmMvcmVtb3RhYmxlLmpzIiwiLi9zcmMvc3ltYm9sLmpzIiwiLi9zcmMvcGFzc1N0eWxlT2YuanMiLCIuL3NyYy9tYWtlVGFnZ2VkLmpzIiwiLi9zcmMvbWFrZS1mYXIuanMiLCIuL3NyYy90eXBlR3VhcmRzLmpzIiwiLi9zcmMvdHlwZXMuanMiXSwiZXhwb3J0cyI6WyJGYXIiLCJGYXIiLCJhc3NlcnRDb3B5QXJyYXkiLCJhc3NlcnRDb3B5QXJyYXkiLCJhc3NlcnRQYXNzYWJsZSIsImFzc2VydFBhc3NhYmxlIiwiZmlsdGVySXRlcmFibGUiLCJmaWx0ZXJJdGVyYWJsZSIsImlzT2JqZWN0IiwiaXNPYmplY3QiLCJpc1Bhc3NhYmxlU3ltYm9sIiwiaXNQYXNzYWJsZVN5bWJvbCIsInRvUGFzc2FibGVFcnJvciIsInRvUGFzc2FibGVFcnJvciIsbnVsbCxudWxsXSwicmVleHBvcnRzIjpbIi4vc3JjL3R5cGVzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbW1wiLi9zcmMvaXRlci1oZWxwZXJzLmpzXCIsIFtdXSxbXCIuL3NyYy9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbXV0sW1wiLi9zcmMvZXJyb3IuanNcIiwgW11dLFtcIi4vc3JjL3JlbW90YWJsZS5qc1wiLCBbXV0sW1wiLi9zcmMvc3ltYm9sLmpzXCIsIFtdXSxbXCIuL3NyYy9wYXNzU3R5bGVPZi5qc1wiLCBbXV0sW1wiLi9zcmMvbWFrZVRhZ2dlZC5qc1wiLCBbXV0sW1wiLi9zcmMvbWFrZS1mYXIuanNcIiwgW11dLFtcIi4vc3JjL3R5cGVHdWFyZHMuanNcIiwgW11dLFtcIi4vc3JjL3R5cGVzLmpzXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7Ii4vc3JjL2l0ZXItaGVscGVycy5qcyI6W1sibWFwSXRlcmFibGUiLCJtYXBJdGVyYWJsZSJdLFsiZmlsdGVySXRlcmFibGUiLCJmaWx0ZXJJdGVyYWJsZSJdXSwiLi9zcmMvcGFzc1N0eWxlLWhlbHBlcnMuanMiOltbIlBBU1NfU1RZTEUiLCJQQVNTX1NUWUxFIl0sWyJpc09iamVjdCIsImlzT2JqZWN0Il0sWyJhc3NlcnRDaGVja2VyIiwiYXNzZXJ0Q2hlY2tlciJdLFsiZ2V0VGFnIiwiZ2V0VGFnIl0sWyJoYXNPd25Qcm9wZXJ0eU9mIiwiaGFzT3duUHJvcGVydHlPZiJdXSwiLi9zcmMvZXJyb3IuanMiOltbImdldEVycm9yQ29uc3RydWN0b3IiLCJnZXRFcnJvckNvbnN0cnVjdG9yIl0sWyJ0b1Bhc3NhYmxlRXJyb3IiLCJ0b1Bhc3NhYmxlRXJyb3IiXSxbImlzRXJyb3JMaWtlIiwiaXNFcnJvckxpa2UiXV0sIi4vc3JjL3JlbW90YWJsZS5qcyI6W1siZ2V0SW50ZXJmYWNlT2YiLCJnZXRJbnRlcmZhY2VPZiJdXSwiLi9zcmMvc3ltYm9sLmpzIjpbWyJhc3NlcnRQYXNzYWJsZVN5bWJvbCIsImFzc2VydFBhc3NhYmxlU3ltYm9sIl0sWyJpc1Bhc3NhYmxlU3ltYm9sIiwiaXNQYXNzYWJsZVN5bWJvbCJdLFsibmFtZUZvclBhc3NhYmxlU3ltYm9sIiwibmFtZUZvclBhc3NhYmxlU3ltYm9sIl0sWyJwYXNzYWJsZVN5bWJvbEZvck5hbWUiLCJwYXNzYWJsZVN5bWJvbEZvck5hbWUiXV0sIi4vc3JjL3Bhc3NTdHlsZU9mLmpzIjpbWyJwYXNzU3R5bGVPZiIsInBhc3NTdHlsZU9mIl0sWyJhc3NlcnRQYXNzYWJsZSIsImFzc2VydFBhc3NhYmxlIl1dLCIuL3NyYy9tYWtlVGFnZ2VkLmpzIjpbWyJtYWtlVGFnZ2VkIiwibWFrZVRhZ2dlZCJdXSwiLi9zcmMvbWFrZS1mYXIuanMiOltbIlJlbW90YWJsZSIsIlJlbW90YWJsZSJdLFsiRmFyIiwiRmFyIl0sWyJUb0ZhckZ1bmN0aW9uIiwiVG9GYXJGdW5jdGlvbiJdXSwiLi9zcmMvdHlwZUd1YXJkcy5qcyI6W1siYXNzZXJ0UmVjb3JkIiwiYXNzZXJ0UmVjb3JkIl0sWyJhc3NlcnRDb3B5QXJyYXkiLCJhc3NlcnRDb3B5QXJyYXkiXSxbImFzc2VydFJlbW90YWJsZSIsImFzc2VydFJlbW90YWJsZSJdLFsiaXNSZW1vdGFibGUiLCJpc1JlbW90YWJsZSJdLFsiaXNSZWNvcmQiLCJpc1JlY29yZCJdLFsiaXNDb3B5QXJyYXkiLCJpc0NvcHlBcnJheSJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA3ka2qpMHAACTBwAAKAAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS43L3NyYy9jb3B5QXJyYXkuanN7ImltcG9ydHMiOlsiLi9wYXNzU3R5bGUtaGVscGVycy5qcyJdLCJleHBvcnRzIjpbIkNvcHlBcnJheUhlbHBlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnRDaGVja2VyLGNoZWNrTm9ybWFsUHJvcGVydHk7JGjigI1faW1wb3J0cyhbW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRo4oCNX2EpXV0sW1wiY2hlY2tOb3JtYWxQcm9wZXJ0eVwiLCBbJGjigI1fYSA9PiAoY2hlY2tOb3JtYWxQcm9wZXJ0eSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuY29uc3R7ZGV0YWlsczpYfT1hc3NlcnQ7XG5jb25zdHtnZXRQcm90b3R5cGVPZn09T2JqZWN0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcbmNvbnN0e2lzQXJyYXkscHJvdG90eXBlOmFycmF5UHJvdG90eXBlfT1BcnJheTtcblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IGNhbmRpZGF0ZVxuICogQHBhcmFtIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuQ2hlY2tlcn0gW2NoZWNrXVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNhbkJlVmFsaWQ9KGNhbmRpZGF0ZSxjaGVjaz11bmRlZmluZWQpPT5cbmlzQXJyYXkoY2FuZGlkYXRlKXx8XG4hIWNoZWNrJiZjaGVjayhmYWxzZSxYIGBBcnJheSBleHBlY3RlZDogJHtjYW5kaWRhdGV9YCk7XG5cbi8qKlxuICpcbiAqIEB0eXBlIHtYaW1wb3J0KCcuL2ludGVybmFsLXR5cGVzLmpzJykuUGFzc1N0eWxlSGVscGVyfVxuICovXG5jb25zdCAgICAgICAgQ29weUFycmF5SGVscGVyPWhhcmRlbih7XG5zdHlsZU5hbWU6J2NvcHlBcnJheScsXG5cbmNhbkJlVmFsaWQsXG5cbmFzc2VydFZhbGlkOihjYW5kaWRhdGUscGFzc1N0eWxlT2ZSZWN1cik9PntcbmNhbkJlVmFsaWQoY2FuZGlkYXRlLGFzc2VydENoZWNrZXIpO1xuZ2V0UHJvdG90eXBlT2YoY2FuZGlkYXRlKT09PWFycmF5UHJvdG90eXBlfHxcbmFzc2VydC5mYWlsKFggYE1hbGZvcm1lZCBhcnJheTogJHtjYW5kaWRhdGV9YCxUeXBlRXJyb3IpO1xuLyogU2luY2Ugd2UncmUgYWxyZWFkeSBlbnN1cmVkIGNhbmRpZGF0ZSBpcyBhbiBhcnJheSwgaXQgc2hvdWxkIG5vdCBiZSovXG4vKiBwb3NzaWJsZSBmb3IgdGhlIGZvbGxvd2luZyB0ZXN0IHRvIGZhaWwqL1xuY2hlY2tOb3JtYWxQcm9wZXJ0eShjYW5kaWRhdGUsJ2xlbmd0aCcsZmFsc2UsYXNzZXJ0Q2hlY2tlcik7XG5jb25zdCBsZW49LyoqIEB0eXBlIHt1bmtub3duW119ICovY2FuZGlkYXRlLmxlbmd0aDtcbmZvcihsZXQgaT0wO2k8bGVuO2krPTEpe1xuY2hlY2tOb3JtYWxQcm9wZXJ0eShjYW5kaWRhdGUsaSx0cnVlLGFzc2VydENoZWNrZXIpO1xuIH1cbi8qICsxIGZvciB0aGUgJ2xlbmd0aCcgcHJvcGVydHkgaXRzZWxmLiovXG5vd25LZXlzKGNhbmRpZGF0ZSkubGVuZ3RoPT09bGVuKzF8fFxuYXNzZXJ0LmZhaWwoWCBgQXJyYXlzIG11c3Qgbm90IGhhdmUgbm9uLWluZGV4ZXM6ICR7Y2FuZGlkYXRlfWAsVHlwZUVycm9yKTtcbi8qIFJlY3Vyc2l2ZWx5IHZhbGlkYXRlIHRoYXQgZWFjaCBtZW1iZXIgaXMgcGFzc2FibGUuKi9cbmNhbmRpZGF0ZS5ldmVyeSgodik9PiEhcGFzc1N0eWxlT2ZSZWN1cih2KSk7XG4gfX0pOyRo4oCNX29uY2UuQ29weUFycmF5SGVscGVyKENvcHlBcnJheUhlbHBlcik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQ29weUFycmF5SGVscGVyIjpbIkNvcHlBcnJheUhlbHBlciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACD9dsszwcAAM8HAAApAAAAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjcvc3JjL2NvcHlSZWNvcmQuanN7ImltcG9ydHMiOlsiLi9wYXNzU3R5bGUtaGVscGVycy5qcyJdLCJleHBvcnRzIjpbIkNvcHlSZWNvcmRIZWxwZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0Q2hlY2tlcixjYW5CZU1ldGhvZCxjaGVja05vcm1hbFByb3BlcnR5OyRo4oCNX2ltcG9ydHMoW1tcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIiwgWyRo4oCNX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaOKAjV9hKV1dLFtcImNhbkJlTWV0aG9kXCIsIFskaOKAjV9hID0+IChjYW5CZU1ldGhvZCA9ICRo4oCNX2EpXV0sW1wiY2hlY2tOb3JtYWxQcm9wZXJ0eVwiLCBbJGjigI1fYSA9PiAoY2hlY2tOb3JtYWxQcm9wZXJ0eSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5jb25zdHtkZXRhaWxzOlh9PWFzc2VydDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5jb25zdHtnZXRQcm90b3R5cGVPZix2YWx1ZXMscHJvdG90eXBlOm9iamVjdFByb3RvdHlwZX09T2JqZWN0O1xuXG4vKipcbiAqXG4gKiBAdHlwZSB7WGltcG9ydCgnLi9pbnRlcm5hbC10eXBlcy5qcycpLlBhc3NTdHlsZUhlbHBlcn1cbiAqL1xuY29uc3QgICAgICAgIENvcHlSZWNvcmRIZWxwZXI9aGFyZGVuKHtcbnN0eWxlTmFtZTonY29weVJlY29yZCcsXG5cbmNhbkJlVmFsaWQ6KGNhbmRpZGF0ZSxjaGVjaz11bmRlZmluZWQpPT57XG5jb25zdCByZWplY3Q9ISFjaGVjayYmKChkZXRhaWxzKT0+Y2hlY2soZmFsc2UsZGV0YWlscykpO1xuaWYoZ2V0UHJvdG90eXBlT2YoY2FuZGlkYXRlKSE9PW9iamVjdFByb3RvdHlwZSl7XG5yZXR1cm4oXG5yZWplY3QmJlxucmVqZWN0KFggYFJlY29yZHMgbXVzdCBpbmhlcml0IGZyb20gT2JqZWN0LnByb3RvdHlwZTogJHtjYW5kaWRhdGV9YCkpO1xuXG4gfVxuXG5yZXR1cm4gb3duS2V5cyhjYW5kaWRhdGUpLmV2ZXJ5KChrZXkpPT57XG5yZXR1cm4oXG4odHlwZW9mIGtleT09PSdzdHJpbmcnfHxcbiEhcmVqZWN0JiZcbnJlamVjdChcblggYFJlY29yZHMgY2FuIG9ubHkgaGF2ZSBzdHJpbmctbmFtZWQgcHJvcGVydGllczogJHtjYW5kaWRhdGV9YCkpJiYoXG5cbiFjYW5CZU1ldGhvZChjYW5kaWRhdGVba2V5XSl8fFxuISFyZWplY3QmJlxucmVqZWN0KFxuLyogVE9ETzogVXBkYXRlIG1lc3NhZ2Ugbm93IHRoYXQgdGhlcmUgaXMgbm8gc3VjaCB0aGluZyBhcyBcImltcGxpY2l0IFJlbW90YWJsZVwiLiovXG5YIGBSZWNvcmRzIGNhbm5vdCBjb250YWluIG5vbi1mYXIgZnVuY3Rpb25zIGJlY2F1c2UgdGhleSBtYXkgYmUgbWV0aG9kcyBvZiBhbiBpbXBsaWNpdCBSZW1vdGFibGU6ICR7Y2FuZGlkYXRlfWApKSk7XG5cblxuIH0pO1xuIH0sXG5cbmFzc2VydFZhbGlkOihjYW5kaWRhdGUscGFzc1N0eWxlT2ZSZWN1cik9PntcbkNvcHlSZWNvcmRIZWxwZXIuY2FuQmVWYWxpZChjYW5kaWRhdGUsYXNzZXJ0Q2hlY2tlcik7XG5mb3IoY29uc3QgbmFtZSBvZiBvd25LZXlzKGNhbmRpZGF0ZSkpe1xuY2hlY2tOb3JtYWxQcm9wZXJ0eShjYW5kaWRhdGUsbmFtZSx0cnVlLGFzc2VydENoZWNrZXIpO1xuIH1cbi8qIFJlY3Vyc2l2ZWx5IHZhbGlkYXRlIHRoYXQgZWFjaCBtZW1iZXIgaXMgcGFzc2FibGUuKi9cbmZvcihjb25zdCB2YWwgb2YgdmFsdWVzKGNhbmRpZGF0ZSkpe1xucGFzc1N0eWxlT2ZSZWN1cih2YWwpO1xuIH1cbiB9fSk7JGjigI1fb25jZS5Db3B5UmVjb3JkSGVscGVyKENvcHlSZWNvcmRIZWxwZXIpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkNvcHlSZWNvcmRIZWxwZXIiOlsiQ29weVJlY29yZEhlbHBlciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABqd7sZSxIAAEsSAAAkAAAAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjcvc3JjL2Vycm9yLmpzeyJpbXBvcnRzIjpbIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiXSwiZXhwb3J0cyI6WyJFcnJvckhlbHBlciIsImdldEVycm9yQ29uc3RydWN0b3IiLCJpc0Vycm9yTGlrZSIsInRvUGFzc2FibGVFcnJvciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnRDaGVja2VyOyRo4oCNX2ltcG9ydHMoW1tcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIiwgWyRo4oCNX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi9pbnRlcm5hbC10eXBlcy5qcycpLlBhc3NTdHlsZUhlbHBlcn0gUGFzc1N0eWxlSGVscGVyICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5DaGVja2VyfSBDaGVja2VyICovXG5cbmNvbnN0e2RldGFpbHM6WCxGYWlsfT1hc3NlcnQ7XG5jb25zdHtnZXRQcm90b3R5cGVPZixnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzfT1PYmplY3Q7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuXG4vKiBUT0RPOiBNYWludGVuYW5jZSBoYXphcmQ6IENvb3JkaW5hdGUgd2l0aCB0aGUgbGlzdCBvZiBlcnJvcnMgaW4gdGhlIFNFUyovXG4vKiB3aGlsZWxpc3QuIEN1cnJlbnRseSwgYm90aCBvbWl0IEFnZ3JlZ2F0ZUVycm9yLCB3aGljaCBpcyBub3cgc3RhbmRhcmQuIEJvdGgqL1xuLyogbXVzdCBldmVudHVhbGx5IGluY2x1ZGUgaXQuKi9cbmNvbnN0IGVycm9yQ29uc3RydWN0b3JzPW5ldyBNYXAoW1xuWydFcnJvcicsRXJyb3JdLFxuWydFdmFsRXJyb3InLEV2YWxFcnJvcl0sXG5bJ1JhbmdlRXJyb3InLFJhbmdlRXJyb3JdLFxuWydSZWZlcmVuY2VFcnJvcicsUmVmZXJlbmNlRXJyb3JdLFxuWydTeW50YXhFcnJvcicsU3ludGF4RXJyb3JdLFxuWydUeXBlRXJyb3InLFR5cGVFcnJvcl0sXG5bJ1VSSUVycm9yJyxVUklFcnJvcl1dKTtcblxuXG5jb25zdCAgICAgICAgZ2V0RXJyb3JDb25zdHJ1Y3Rvcj0obmFtZSk9PmVycm9yQ29uc3RydWN0b3JzLmdldChuYW1lKTskaOKAjV9vbmNlLmdldEVycm9yQ29uc3RydWN0b3IoZ2V0RXJyb3JDb25zdHJ1Y3Rvcik7XG5oYXJkZW4oZ2V0RXJyb3JDb25zdHJ1Y3Rvcik7XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSBjYW5kaWRhdGVcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gW2NoZWNrXVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNoZWNrRXJyb3JMaWtlPShjYW5kaWRhdGUsY2hlY2s9dW5kZWZpbmVkKT0+e1xuY29uc3QgcmVqZWN0PSEhY2hlY2smJigoZGV0YWlscyk9PmNoZWNrKGZhbHNlLGRldGFpbHMpKTtcbi8qIFRPRE86IE5lZWQgYSBiZXR0ZXIgdGVzdCB0aGFuIGluc3RhbmNlb2YqL1xucmV0dXJuKFxuY2FuZGlkYXRlIGluc3RhbmNlb2YgRXJyb3J8fFxucmVqZWN0JiZyZWplY3QoWCBgRXJyb3IgZXhwZWN0ZWQ6ICR7Y2FuZGlkYXRlfWApKTtcblxuIH07XG5oYXJkZW4oY2hlY2tFcnJvckxpa2UpO1xuXG4vKipcbiAqIFZhbGlkYXRpbmcgZXJyb3Igb2JqZWN0cyBhcmUgcGFzc2FibGUgcmFpc2VzIGEgdGVuc2lvbiBiZXR3ZWVuIHNlY3VyaXR5XG4gKiB2cyBwcmVzZXJ2aW5nIGRpYWdub3N0aWMgaW5mb3JtYXRpb24uIEZvciBlcnJvcnMsIHdlIG5lZWQgdG8gcmVtZW1iZXJcbiAqIHRoZSBlcnJvciBpdHNlbGYgZXhpc3RzIHRvIGhlbHAgdXMgZGlhZ25vc2UgYSBidWcgdGhhdCdzIGxpa2VseSBtb3JlXG4gKiBwcmVzc2luZyB0aGFuIGEgdmFsaWRpdHkgYnVnIGluIHRoZSBlcnJvciBpdHNlbGYuIFRodXMsIHdoZW5ldmVyIGl0IGlzIHNhZmVcbiAqIHRvIGRvIHNvLCB3ZSBwcmVmZXIgdG8gbGV0IHRoZSBlcnJvci1saWtlIHRlc3Qgc3VjY2VlZCBhbmQgdG8gY291Y2ggdGhlc2VcbiAqIGNvbXBsYWludHMgYXMgbm90ZXMgb24gdGhlIGVycm9yLlxuICpcbiAqIFRvIHJlc29sdmUgdGhpcywgc3VjaCBhIG1hbGZvcm1lZCBlcnJvciBvYmplY3Qgd2lsbCBzdGlsbCBwYXNzXG4gKiBgaXNFcnJvckxpa2VgIHNvIG1hcnNoYWwgY2FuIHVzZSB0aGlzIGZvciB0b3AgbGV2ZWwgZXJyb3IgdG8gcmVwb3J0IGZyb20sXG4gKiBldmVuIGlmIGl0IHdvdWxkIG5vdCBhY3R1YWxseSB2YWxpZGF0ZS5cbiAqIEluc3RlYWQsIHRoZSBkaWFnbm9zdGljcyB0aGF0IGBhc3NlcnRFcnJvcmAgd291bGQgaGF2ZSByZXBvcnRlZCBhcmVcbiAqIGF0dGFjaGVkIGFzIG5vdGVzIHRvIHRoZSBtYWxmb3JtZWQgZXJyb3IuIFRodXMsIGEgbWFsZm9ybWVkXG4gKiBlcnJvciBpcyBwYXNzYWJsZSBieSBpdHNlbGYsIGJ1dCBub3QgYXMgcGFydCBvZiBhIHBhc3NhYmxlIHN0cnVjdHVyZS5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IGNhbmRpZGF0ZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0ICAgICAgICBpc0Vycm9yTGlrZT0oY2FuZGlkYXRlKT0+Y2hlY2tFcnJvckxpa2UoY2FuZGlkYXRlKTskaOKAjV9vbmNlLmlzRXJyb3JMaWtlKGlzRXJyb3JMaWtlKTtcbmhhcmRlbihpc0Vycm9yTGlrZSk7XG5cbi8qKlxuICogQHR5cGUge1Bhc3NTdHlsZUhlbHBlcn1cbiAqL1xuY29uc3QgICAgICAgIEVycm9ySGVscGVyPWhhcmRlbih7XG5zdHlsZU5hbWU6J2Vycm9yJyxcblxuY2FuQmVWYWxpZDpjaGVja0Vycm9yTGlrZSxcblxuYXNzZXJ0VmFsaWQ6KGNhbmRpZGF0ZSk9PntcbkVycm9ySGVscGVyLmNhbkJlVmFsaWQoY2FuZGlkYXRlLGFzc2VydENoZWNrZXIpO1xuY29uc3QgcHJvdG89Z2V0UHJvdG90eXBlT2YoY2FuZGlkYXRlKTtcbmNvbnN0e25hbWV9PXByb3RvO1xuY29uc3QgRUM9Z2V0RXJyb3JDb25zdHJ1Y3RvcihuYW1lKTtcbkVDJiZFQy5wcm90b3R5cGU9PT1wcm90b3x8XG5GYWlsIGBFcnJvcnMgbXVzdCBpbmhlcml0IGZyb20gYW4gZXJyb3IgY2xhc3MgLnByb3RvdHlwZSAke2NhbmRpZGF0ZX1gO1xuXG5jb25zdHtcbi8qIFRPRE8gTXVzdCBhbGxvdyBgY2F1c2VgLCBgZXJyb3JzYCovXG5tZXNzYWdlOm1EZXNjLFxuc3RhY2s6c3RhY2tEZXNjLFxuLi4ucmVzdERlc2NzfT1cbmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoY2FuZGlkYXRlKTtcbm93bktleXMocmVzdERlc2NzKS5sZW5ndGg8MXx8XG5GYWlsIGBQYXNzZWQgRXJyb3IgaGFzIGV4dHJhIHVucGFzc2VkIHByb3BlcnRpZXMgJHtyZXN0RGVzY3N9YDtcbmlmKG1EZXNjKXtcbnR5cGVvZiBtRGVzYy52YWx1ZT09PSdzdHJpbmcnfHxcbkZhaWwgYFBhc3NlZCBFcnJvciBcIm1lc3NhZ2VcIiAke21EZXNjfSBtdXN0IGJlIGEgc3RyaW5nLXZhbHVlZCBkYXRhIHByb3BlcnR5LmA7XG4hbURlc2MuZW51bWVyYWJsZXx8XG5GYWlsIGBQYXNzZWQgRXJyb3IgXCJtZXNzYWdlXCIgJHttRGVzY30gbXVzdCBub3QgYmUgZW51bWVyYWJsZWA7XG4gfVxuaWYoc3RhY2tEZXNjKXtcbnR5cGVvZiBzdGFja0Rlc2MudmFsdWU9PT0nc3RyaW5nJ3x8XG5GYWlsIGBQYXNzZWQgRXJyb3IgXCJzdGFja1wiICR7c3RhY2tEZXNjfSBtdXN0IGJlIGEgc3RyaW5nLXZhbHVlZCBkYXRhIHByb3BlcnR5LmA7XG4hc3RhY2tEZXNjLmVudW1lcmFibGV8fFxuRmFpbCBgUGFzc2VkIEVycm9yIFwic3RhY2tcIiAke3N0YWNrRGVzY30gbXVzdCBub3QgYmUgZW51bWVyYWJsZWA7XG4gfVxucmV0dXJuIHRydWU7XG4gfX0pO1xuXG5cbi8qKlxuICogUmV0dXJuIGEgbmV3IHBhc3NhYmxlIGVycm9yIHRoYXQgcHJvcGFnYXRlcyB0aGUgZGlhZ25vc3RpYyBpbmZvIG9mIHRoZVxuICogb3JpZ2luYWwsIGFuZCBpcyBsaW5rZWQgdG8gdGhlIG9yaWdpbmFsIGFzIGEgbm90ZS5cbiAqXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJcbiAqIEByZXR1cm5zIHtFcnJvcn1cbiAqLyRo4oCNX29uY2UuRXJyb3JIZWxwZXIoRXJyb3JIZWxwZXIpO1xuY29uc3QgICAgICAgIHRvUGFzc2FibGVFcnJvcj0oZXJyKT0+e1xuY29uc3R7bmFtZSxtZXNzYWdlfT1lcnI7XG5cbmNvbnN0IEVDPWdldEVycm9yQ29uc3RydWN0b3IoIGAke25hbWV9YCl8fEVycm9yO1xuY29uc3QgbmV3RXJyb3I9aGFyZGVuKG5ldyBFQyggYCR7bWVzc2FnZX1gKSk7XG4vKiBFdmVuIHRoZSBjbGVhbmVkIHVwIGVycm9yIGNvcHksIGlmIHNlbnQgdG8gdGhlIGNvbnNvbGUsIHNob3VsZCovXG4vKiBjYXVzZSBoaWRkZW4gZGlhZ25vc3RpYyBpbmZvcm1hdGlvbiBvZiB0aGUgb3JpZ2luYWwgZXJyb3IqL1xuLyogdG8gYmUgbG9nZ2VkLiovXG5hc3NlcnQubm90ZShuZXdFcnJvcixYIGBjb3BpZWQgZnJvbSBlcnJvciAke2Vycn1gKTtcbnJldHVybiBuZXdFcnJvcjtcbiB9OyRo4oCNX29uY2UudG9QYXNzYWJsZUVycm9yKHRvUGFzc2FibGVFcnJvcik7XG5oYXJkZW4odG9QYXNzYWJsZUVycm9yKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJnZXRFcnJvckNvbnN0cnVjdG9yIjpbImdldEVycm9yQ29uc3RydWN0b3IiXSwiaXNFcnJvckxpa2UiOlsiaXNFcnJvckxpa2UiXSwiRXJyb3JIZWxwZXIiOlsiRXJyb3JIZWxwZXIiXSwidG9QYXNzYWJsZUVycm9yIjpbInRvUGFzc2FibGVFcnJvciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABKO2aDVQgAAFUIAAArAAAAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjcvc3JjL2l0ZXItaGVscGVycy5qc3siaW1wb3J0cyI6WyIuL21ha2UtZmFyLmpzIl0sImV4cG9ydHMiOlsiZmlsdGVySXRlcmFibGUiLCJtYXBJdGVyYWJsZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBGYXI7JGjigI1faW1wb3J0cyhbW1wiLi9tYWtlLWZhci5qc1wiLCBbW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuLyoqXG4gKiBUaGUgcmVzdWx0IGl0ZXJhdG9yIGhhcyBhcyBtYW55IGVsZW1lbnRzIGFzIHRoZSBgYmFzZUl0ZXJhdG9yYCBhbmRcbiAqIGhhdmUgdGhlIHNhbWUgdGVybWluYXRpb24gLS0gdGhlIHNhbWUgY29tcGxldGlvbiB2YWx1ZSBvciBmYWlsdXJlXG4gKiByZWFzb24uIEJ1dCB0aGUgbm9uLWZpbmFsIHZhbHVlcyBhcmUgdGhlIGNvcnJlc3BvbmRpbmcgbm9uLWZpbmFsXG4gKiB2YWx1ZXMgZnJvbSBgYmFzZUl0ZXJhdG9yYCBhcyB0cmFuc2Zvcm1lZCBieSBgZnVuY2AuXG4gKlxuICogQHRlbXBsYXRlIFQsVVxuICogQHBhcmFtIHtJdGVyYWJsZTxUPn0gYmFzZUl0ZXJhYmxlXG4gKiBAcGFyYW0geyh2YWx1ZTogVCkgPT4gVX0gZnVuY1xuICogQHJldHVybnMge0l0ZXJhYmxlPFU+fVxuICovXG5jb25zdCAgICAgICAgbWFwSXRlcmFibGU9KGJhc2VJdGVyYWJsZSxmdW5jKT0+XG4vKiogQHR5cGUge0l0ZXJhYmxlPFU+fSAqL1xuRmFyKCdtYXBwZWQgaXRlcmFibGUnLHtcbltTeW1ib2wuaXRlcmF0b3JdOigpPT57XG5jb25zdCBiYXNlSXRlcmF0b3I9YmFzZUl0ZXJhYmxlW1N5bWJvbC5pdGVyYXRvcl0oKTtcbnJldHVybiBGYXIoJ21hcHBlZCBpdGVyYXRvcicse1xubmV4dDooKT0+e1xuY29uc3R7dmFsdWU6YmFzZVZhbHVlLGRvbmV9PWJhc2VJdGVyYXRvci5uZXh0KCk7XG5jb25zdCB2YWx1ZT1kb25lP2Jhc2VWYWx1ZTpmdW5jKGJhc2VWYWx1ZSk7XG5yZXR1cm4gaGFyZGVuKHt2YWx1ZSxkb25lfSk7XG4gfX0pO1xuXG4gfX0pOyRo4oCNX29uY2UubWFwSXRlcmFibGUobWFwSXRlcmFibGUpO1xuXG5oYXJkZW4obWFwSXRlcmFibGUpO1xuXG4vKipcbiAqIFRoZSByZXN1bHQgaXRlcmF0b3IgaGFzIGEgc3Vic2V0IG9mIHRoZSBub24tZmluYWwgdmFsdWVzIGZyb20gdGhlXG4gKiBgYmFzZUl0ZXJhdG9yYCAtLS0gdGhvc2UgZm9yIHdoaWNoIGBwcmVkKHZhbHVlKWAgd2FzIHRydXRoeS4gVGhlIHJlc3VsdFxuICogaGFzIHRoZSBzYW1lIHRlcm1pbmF0aW9uIGFzIHRoZSBgYmFzZUl0ZXJhdG9yYCAtLSB0aGUgc2FtZSBjb21wbGV0aW9uIHZhbHVlXG4gKiBvciBmYWlsdXJlIHJlYXNvbi5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtJdGVyYWJsZTxUPn0gYmFzZUl0ZXJhYmxlXG4gKiBAcGFyYW0geyh2YWx1ZTogVCkgPT4gYm9vbGVhbn0gcHJlZFxuICogQHJldHVybnMge0l0ZXJhYmxlPFQ+fVxuICovXG5jb25zdCAgICAgICAgZmlsdGVySXRlcmFibGU9KGJhc2VJdGVyYWJsZSxwcmVkKT0+XG4vKiogQHR5cGUge0l0ZXJhYmxlPFU+fSAqL1xuRmFyKCdmaWx0ZXJlZCBpdGVyYWJsZScse1xuW1N5bWJvbC5pdGVyYXRvcl06KCk9PntcbmNvbnN0IGJhc2VJdGVyYXRvcj1iYXNlSXRlcmFibGVbU3ltYm9sLml0ZXJhdG9yXSgpO1xucmV0dXJuIEZhcignZmlsdGVyZWQgaXRlcmF0b3InLHtcbm5leHQ6KCk9PntcbmZvcig7Oyl7XG5jb25zdCByZXN1bHQ9YmFzZUl0ZXJhdG9yLm5leHQoKTtcbmNvbnN0e3ZhbHVlLGRvbmV9PXJlc3VsdDtcbmlmKGRvbmV8fHByZWQodmFsdWUpKXtcbnJldHVybiByZXN1bHQ7XG4gfVxuIH1cbiB9fSk7XG5cbiB9fSk7JGjigI1fb25jZS5maWx0ZXJJdGVyYWJsZShmaWx0ZXJJdGVyYWJsZSk7XG5cbmhhcmRlbihmaWx0ZXJJdGVyYWJsZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFwSXRlcmFibGUiOlsibWFwSXRlcmFibGUiXSwiZmlsdGVySXRlcmFibGUiOlsiZmlsdGVySXRlcmFibGUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA+lX/zTIaAAAyGgAAJwAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS43L3NyYy9tYWtlLWZhci5qc3siaW1wb3J0cyI6WyIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwiLi9yZW1vdGFibGUuanMiXSwiZXhwb3J0cyI6WyJGYXIiLCJSZW1vdGFibGUiLCJUb0ZhckZ1bmN0aW9uIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydENoZWNrZXIsUEFTU19TVFlMRSxhc3NlcnRJZmFjZSxnZXRJbnRlcmZhY2VPZixSZW1vdGFibGVIZWxwZXI7JGjigI1faW1wb3J0cyhbW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRo4oCNX2EpXV0sW1wiUEFTU19TVFlMRVwiLCBbJGjigI1fYSA9PiAoUEFTU19TVFlMRSA9ICRo4oCNX2EpXV1dXSxbXCIuL3JlbW90YWJsZS5qc1wiLCBbW1wiYXNzZXJ0SWZhY2VcIiwgWyRo4oCNX2EgPT4gKGFzc2VydElmYWNlID0gJGjigI1fYSldXSxbXCJnZXRJbnRlcmZhY2VPZlwiLCBbJGjigI1fYSA9PiAoZ2V0SW50ZXJmYWNlT2YgPSAkaOKAjV9hKV1dLFtcIlJlbW90YWJsZUhlbHBlclwiLCBbJGjigI1fYSA9PiAoUmVtb3RhYmxlSGVscGVyID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkludGVyZmFjZVNwZWN9IEludGVyZmFjZVNwZWMgKi9cbi8qKiBAdGVtcGxhdGUgTCxSIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9ldmVudHVhbC1zZW5kJykuUmVtb3RhYmxlQnJhbmQ8TCwgUj59IFJlbW90YWJsZUJyYW5kICovXG5cbmNvbnN0e3F1b3RlOnEsRmFpbH09YXNzZXJ0O1xuXG5jb25zdHtwcm90b3R5cGU6ZnVuY3Rpb25Qcm90b3R5cGV9PUZ1bmN0aW9uO1xuY29uc3R7XG5nZXRQcm90b3R5cGVPZixcbnNldFByb3RvdHlwZU9mLFxuY3JlYXRlLFxuaXNGcm96ZW4sXG5wcm90b3R5cGU6b2JqZWN0UHJvdG90eXBlfT1cbk9iamVjdDtcblxuLyoqXG4gKiBOb3cgdGhhdCB0aGUgcmVtb3RhYmxlUHJvdG8gZG9lcyBub3QgcHJvdmlkZSBpdHMgb3duIGB0b1N0cmluZ2AgbWV0aG9kLFxuICogZW5zdXJlIGl0IGFsd2F5cyBpbmhlcml0cyBmcm9tIHNvbWV0aGluZy4gVGhlIG9yaWdpbmFsIHByb3RvdHlwZSBvZlxuICogYHJlbW90YWJsZWAgaWYgdGhlcmUgd2FzIG9uZSwgb3IgYE9iamVjdC5wcm90b3R5cGVgIG90aGVyd2lzZS5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gcmVtb3RhYmxlXG4gKiBAcGFyYW0ge0ludGVyZmFjZVNwZWN9IGlmYWNlXG4gKiBAcmV0dXJucyB7b2JqZWN0fVxuICovXG5jb25zdCBtYWtlUmVtb3RhYmxlUHJvdG89KHJlbW90YWJsZSxpZmFjZSk9PntcbmxldCBvbGRQcm90bz1nZXRQcm90b3R5cGVPZihyZW1vdGFibGUpO1xuaWYodHlwZW9mIHJlbW90YWJsZT09PSdvYmplY3QnKXtcbmlmKG9sZFByb3RvPT09bnVsbCl7XG5vbGRQcm90bz1vYmplY3RQcm90b3R5cGU7XG4gfVxub2xkUHJvdG89PT1vYmplY3RQcm90b3R5cGV8fFxuRmFpbCBgRm9yIG5vdywgcmVtb3RhYmxlcyBjYW5ub3QgaW5oZXJpdCBmcm9tIGFueXRoaW5nIHVudXN1YWwsIGluICR7cmVtb3RhYmxlfWA7XG4gfWVsc2UgaWYodHlwZW9mIHJlbW90YWJsZT09PSdmdW5jdGlvbicpe1xub2xkUHJvdG8hPT1udWxsfHxcbkZhaWwgYE9yaWdpbmFsIGZ1bmN0aW9uIG11c3Qgbm90IGluaGVyaXQgZnJvbSBudWxsOiAke3JlbW90YWJsZX1gO1xub2xkUHJvdG89PT1mdW5jdGlvblByb3RvdHlwZXx8XG5nZXRQcm90b3R5cGVPZihvbGRQcm90byk9PT1mdW5jdGlvblByb3RvdHlwZXx8XG5GYWlsIGBGYXIgZnVuY3Rpb25zIG11c3Qgb3JpZ2luYWxseSBpbmhlcml0IGZyb20gRnVuY3Rpb24ucHJvdG90eXBlLCBpbiAke3JlbW90YWJsZX1gO1xuIH1lbHNle1xuRmFpbCBgdW5yZWNvZ25pemVkIHR5cGVvZiAke3JlbW90YWJsZX1gO1xuIH1cbnJldHVybiBoYXJkZW4oXG5jcmVhdGUob2xkUHJvdG8se1xuW1BBU1NfU1RZTEVdOnt2YWx1ZToncmVtb3RhYmxlJ30sXG5bU3ltYm9sLnRvU3RyaW5nVGFnXTp7dmFsdWU6aWZhY2V9fSkpO1xuXG5cbiB9O1xuXG5jb25zdCBhc3NlcnRDYW5CZVJlbW90YWJsZT0oY2FuZGlkYXRlKT0+XG5SZW1vdGFibGVIZWxwZXIuY2FuQmVWYWxpZChjYW5kaWRhdGUsYXNzZXJ0Q2hlY2tlcik7XG5cbi8qKlxuICogQ3JlYXRlIGFuZCByZWdpc3RlciBhIFJlbW90YWJsZS4gIEFmdGVyIHRoaXMsIGdldEludGVyZmFjZU9mKHJlbW90YWJsZSlcbiAqIHJldHVybnMgaWZhY2UuXG4gKlxuICogLy8gaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy84MDRcbiAqXG4gKiBAdGVtcGxhdGUge3t9fSBUXG4gKiBAcGFyYW0ge0ludGVyZmFjZVNwZWN9IFtpZmFjZV0gVGhlIGludGVyZmFjZSBzcGVjaWZpY2F0aW9uIGZvclxuICogdGhlIHJlbW90YWJsZS4gRm9yIG5vdywgYSBzdHJpbmcgaWZhY2UgbXVzdCBiZSBcIlJlbW90YWJsZVwiIG9yIGJlZ2luIHdpdGhcbiAqIFwiQWxsZWdlZDogXCIgb3IgXCJEZWJ1Z05hbWU6IFwiLCB0byBzZXJ2ZSBhcyB0aGUgYWxsZWdlZCBuYW1lLiBNb3JlXG4gKiBnZW5lcmFsIGlmYWNlcyBhcmUgbm90IHlldCBpbXBsZW1lbnRlZC4gVGhpcyBpcyB0ZW1wb3JhcnkuIFdlIGluY2x1ZGUgdGhlXG4gKiBcIkFsbGVnZWRcIiBvciBcIkRlYnVnTmFtZVwiIGFzIGEgcmVtaW5kZXIgdGhhdCB3ZSBkbyBub3QgeWV0IGhhdmUgU3dpbmdTZXRcbiAqIG9yIENvbW1zIFZhdFxuICogc3VwcG9ydCBmb3IgZW5zdXJpbmcgdGhpcyBpcyBhY2NvcmRpbmcgdG8gdGhlIHZhdCBob3N0aW5nIHRoZSBvYmplY3QuXG4gKiBDdXJyZW50bHksIEFsaWNlIGNhbiB0ZWxsIEJvYiBhYm91dCBDYXJvbCwgd2hlcmUgVmF0QSAob24gQWxpY2UncyBiZWhhbGYpXG4gKiBtaXNyZXByZXNlbnRzIENhcm9sJ3MgYGlmYWNlYC4gVmF0QiBhbmQgdGhlcmVmb3JlIEJvYiB3aWxsIHRoZW4gc2VlXG4gKiBDYXJvbCdzIGBpZmFjZWAgYXMgbWlzcmVwcmVzZW50ZWQgYnkgVmF0QS5cbiAqIEBwYXJhbSB7dW5kZWZpbmVkfSBbcHJvcHNdIEN1cnJlbnRseSBtYXkgb25seSBiZSB1bmRlZmluZWQuXG4gKiBUaGF0IHBsYW4gaXMgdGhhdCBvd24tcHJvcGVydGllcyBhcmUgY29waWVkIHRvIHRoZSByZW1vdGFibGVcbiAqIEBwYXJhbSB7VH0gW3JlbW90YWJsZV0gVGhlIG9iamVjdCB1c2VkIGFzIHRoZSByZW1vdGFibGVcbiAqIEByZXR1cm5zIHtUICYgUmVtb3RhYmxlQnJhbmQ8e30sIFQ+fSByZW1vdGFibGUsIG1vZGlmaWVkIGZvciBkZWJ1Z2dhYmlsaXR5XG4gKi9cbmNvbnN0ICAgICAgICBSZW1vdGFibGU9KFxuaWZhY2U9J1JlbW90YWJsZScsXG5wcm9wcz11bmRlZmluZWQsXG5yZW1vdGFibGU9LyoqIEB0eXBlIHtUfSAqL3t9KT0+XG57XG5hc3NlcnRJZmFjZShpZmFjZSk7XG5hc3NlcnQoaWZhY2UpO1xuLyogVE9ETzogV2hlbiBpZmFjZSBpcyByaWNoZXIgdGhhbiBqdXN0IHN0cmluZywgd2UgbmVlZCB0byBnZXQgdGhlIGFsbGVnZWROYW1lKi9cbi8qIGluIGEgZGlmZmVyZW50IHdheS4qL1xucHJvcHM9PT11bmRlZmluZWR8fEZhaWwgYFJlbW90YWJsZSBwcm9wcyBub3QgeWV0IGltcGxlbWVudGVkICR7cHJvcHN9YDtcblxuLyogRmFpbCBmYXN0OiBjaGVjayB0aGF0IHRoZSB1bm1vZGlmaWVkIG9iamVjdCBpcyBhYmxlIHRvIGJlY29tZSBhIFJlbW90YWJsZS4qL1xuYXNzZXJ0Q2FuQmVSZW1vdGFibGUocmVtb3RhYmxlKTtcblxuLyogRW5zdXJlIHRoYXQgdGhlIHJlbW90YWJsZSBpc24ndCBhbHJlYWR5IG1hcmtlZC4qL1xuIShQQVNTX1NUWUxFIGluIHJlbW90YWJsZSl8fFxuRmFpbCBgUmVtb3RhYmxlICR7cmVtb3RhYmxlfSBpcyBhbHJlYWR5IG1hcmtlZCBhcyBhICR7cShcbnJlbW90YWJsZVtQQVNTX1NUWUxFXSlcbiB9YDtcbi8qIGBpc0Zyb3plbmAgYWx3YXlzIHJldHVybnMgdHJ1ZSB3aXRoIGEgZmFrZSBgaGFyZGVuYCwgYnV0IHdlIHdhbnQgdGhhdCBjYXNlKi9cbi8qIHRvIHN1Y2NlZWQgYW55d2F5LiBGYWtpbmcgYGhhcmRlbmAgaXMgb25seSBjb3JyZWN0bmVzcyBwcmVzZXJ2aW5nKi9cbi8qIGlmIHRoZSBjb2RlIGluIHF1ZXN0aW9uIGNvbnRhaW5zIG5vIGJ1Z3MgdGhhdCB0aGUgcmVhbCBgaGFyZGVuYCB3b3VsZCovXG4vKiBoYXZlIGNhdWdodC4qL1xuLyogQHRzLWlnbm9yZSBgaXNGYWtlYCBwdXJwb3NlbHkgbm90IGluIHRoZSB0eXBlKi9cbmhhcmRlbi5pc0Zha2V8fFxuLyogRW5zdXJlIHRoYXQgdGhlIHJlbW90YWJsZSBpc24ndCBhbHJlYWR5IGZyb3plbi4qL1xuIWlzRnJvemVuKHJlbW90YWJsZSl8fFxuRmFpbCBgUmVtb3RhYmxlICR7cmVtb3RhYmxlfSBpcyBhbHJlYWR5IGZyb3plbmA7XG5jb25zdCByZW1vdGFibGVQcm90bz1tYWtlUmVtb3RhYmxlUHJvdG8ocmVtb3RhYmxlLGlmYWNlKTtcblxuLyogVGFrZSBhIHN0YXRpYyBjb3B5IG9mIHRoZSBlbnVtZXJhYmxlIG93biBwcm9wZXJ0aWVzIGFzIGRhdGEgcHJvcGVydGllcy4qL1xuLyogY29uc3QgcHJvcERlc2NzID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyh7IC4uLnByb3BzIH0pOyovXG5jb25zdCBtdXRhdGVIYXJkZW5BbmRDaGVjaz0odGFyZ2V0KT0+e1xuLyogZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BEZXNjcyk7Ki9cbnNldFByb3RvdHlwZU9mKHRhcmdldCxyZW1vdGFibGVQcm90byk7XG5oYXJkZW4odGFyZ2V0KTtcbmFzc2VydENhbkJlUmVtb3RhYmxlKHRhcmdldCk7XG4gfTtcblxuLyogRmFpbCBmYXN0OiBjaGVjayBhIGZyZXNoIHJlbW90YWJsZSB0byBzZWUgaWYgb3VyIHJ1bGVzIGZpdC4qL1xubXV0YXRlSGFyZGVuQW5kQ2hlY2soe30pO1xuXG4vKiBBY3R1YWxseSBmaW5pc2ggdGhlIG5ldyByZW1vdGFibGUuKi9cbm11dGF0ZUhhcmRlbkFuZENoZWNrKHJlbW90YWJsZSk7XG5cbi8qIENPTU1JVFRFRCEqL1xuLyogV2UncmUgY29tbWl0dGVkLCBzbyBrZWVwIHRoZSBpbnRlcmZhY2UgZm9yIGZ1dHVyZSByZWZlcmVuY2UuKi9cbmFzc2VydChpZmFjZSE9PXVuZGVmaW5lZCk7LyogVG8gbWFrZSBUeXBlU2NyaXB0IGhhcHB5Ki9cbnJldHVybiAoLyoqIEB0eXBlIHtUICYgUmVtb3RhYmxlQnJhbmQ8e30sIFQ+fSAqL3JlbW90YWJsZSk7XG4gfTskaOKAjV9vbmNlLlJlbW90YWJsZShSZW1vdGFibGUpO1xuaGFyZGVuKFJlbW90YWJsZSk7XG5cbi8qKlxuICogQSBjb25jaXNlIGNvbnZlbmllbmNlIGZvciB0aGUgbW9zdCBjb21tb24gYFJlbW90YWJsZWAgdXNlLlxuICpcbiAqIEB0ZW1wbGF0ZSB7e319IFRcbiAqIEBwYXJhbSB7c3RyaW5nfSBmYXJOYW1lIFRoaXMgbmFtZSB3aWxsIGJlIHByZXBlbmRlZCB3aXRoIGBBbGxlZ2VkOiBgXG4gKiBmb3Igbm93IHRvIGZvcm0gdGhlIGBSZW1vdGFibGVgIGBpZmFjZWAgYXJndW1lbnQuXG4gKiBAcGFyYW0ge1R9IFtyZW1vdGFibGVdIFRoZSBvYmplY3QgdXNlZCBhcyB0aGUgcmVtb3RhYmxlXG4gKi9cbmNvbnN0ICAgICAgICBGYXI9KGZhck5hbWUscmVtb3RhYmxlPXVuZGVmaW5lZCk9PntcbmNvbnN0IHI9cmVtb3RhYmxlPT09dW5kZWZpbmVkPy8qKiBAdHlwZSB7VH0gKi97fTpyZW1vdGFibGU7XG5yZXR1cm4gUmVtb3RhYmxlKCBgQWxsZWdlZDogJHtmYXJOYW1lfWAsdW5kZWZpbmVkLHIpO1xuIH07JGjigI1fb25jZS5GYXIoRmFyKTtcbmhhcmRlbihGYXIpO1xuXG4vKipcbiAqIENvZXJjZSBgZnVuY2AgdG8gYSBmYXIgZnVuY3Rpb24gdGhhdCBwcmVzZXJ2ZXMgaXRzIGNhbGwgYmVoYXZpb3IuXG4gKiBJZiBpdCBpcyBhbHJlYWR5IGEgZmFyIGZ1bmN0aW9uLCByZXR1cm4gaXQuIE90aGVyd2lzZSBtYWtlIGFuZCByZXR1cm4gYVxuICogbmV3IGZhciBmdW5jdGlvbiB0aGF0IHdyYXBzIGBmdW5jYCBhbmQgZm9yd2FyZHMgY2FsbHMgdG8gaXQuIFRoaXNcbiAqIHdvcmtzIGV2ZW4gaWYgYGZ1bmNgIGlzIGFscmVhZHkgZnJvemVuLiBgVG9GYXJGdW5jdGlvbmAgaXMgdG8gYmUgdXNlZFxuICogd2hlbiB0aGUgZnVuY3Rpb24gY29tZXMgZnJvbSBlbHNld2hlcmUgdW5kZXIgbGVzcyBjb250cm9sLiBGb3IgZnVuY3Rpb25zXG4gKiB5b3UgYXV0aG9yIGluIHBsYWNlLCBiZXR0ZXIgdG8gdXNlIGBGYXJgIG9uIHRoZWlyIGZ1bmN0aW9uIGxpdGVyYWwgZGlyZWN0bHkuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGZhck5hbWUgdG8gYmUgdXNlZCBvbmx5IGlmIGBmdW5jYCBpcyBub3QgYWxyZWFkeSBhXG4gKiBmYXIgZnVuY3Rpb24uXG4gKiBAcGFyYW0geyguLi5hcmdzOiBhbnlbXSkgPT4gYW55fSBmdW5jXG4gKi9cbmNvbnN0ICAgICAgICBUb0ZhckZ1bmN0aW9uPShmYXJOYW1lLGZ1bmMpPT57XG5pZihnZXRJbnRlcmZhY2VPZihmdW5jKSE9PXVuZGVmaW5lZCl7XG5yZXR1cm4gZnVuYztcbiB9XG5yZXR1cm4gRmFyKGZhck5hbWUsKC4uLmFyZ3MpPT5mdW5jKC4uLmFyZ3MpKTtcbiB9OyRo4oCNX29uY2UuVG9GYXJGdW5jdGlvbihUb0ZhckZ1bmN0aW9uKTtcbmhhcmRlbihUb0ZhckZ1bmN0aW9uKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJSZW1vdGFibGUiOlsiUmVtb3RhYmxlIl0sIkZhciI6WyJGYXIiXSwiVG9GYXJGdW5jdGlvbiI6WyJUb0ZhckZ1bmN0aW9uIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAKRe+UdBAAAHQQAACkAAABAZW5kby9wYXNzLXN0eWxlLXYwLjEuNy9zcmMvbWFrZVRhZ2dlZC5qc3siaW1wb3J0cyI6WyIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwiLi9wYXNzU3R5bGVPZi5qcyJdLCJleHBvcnRzIjpbIm1ha2VUYWdnZWQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgUEFTU19TVFlMRSxhc3NlcnRQYXNzYWJsZTskaOKAjV9pbXBvcnRzKFtbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJQQVNTX1NUWUxFXCIsIFskaOKAjV9hID0+IChQQVNTX1NUWUxFID0gJGjigI1fYSldXV1dLFtcIi4vcGFzc1N0eWxlT2YuanNcIiwgW1tcImFzc2VydFBhc3NhYmxlXCIsIFskaOKAjV9hID0+IChhc3NlcnRQYXNzYWJsZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5jb25zdHtjcmVhdGUscHJvdG90eXBlOm9iamVjdFByb3RvdHlwZX09T2JqZWN0O1xuY29uc3R7RmFpbH09YXNzZXJ0O1xuXG5jb25zdCAgICAgICAgbWFrZVRhZ2dlZD0odGFnLHBheWxvYWQpPT57XG50eXBlb2YgdGFnPT09J3N0cmluZyd8fFxuRmFpbCBgVGhlIHRhZyBvZiBhIHRhZ2dlZCByZWNvcmQgbXVzdCBiZSBhIHN0cmluZzogJHt0YWd9YDtcbmFzc2VydFBhc3NhYmxlKGhhcmRlbihwYXlsb2FkKSk7XG5yZXR1cm4gaGFyZGVuKFxuY3JlYXRlKG9iamVjdFByb3RvdHlwZSx7XG5bUEFTU19TVFlMRV06e3ZhbHVlOid0YWdnZWQnfSxcbltTeW1ib2wudG9TdHJpbmdUYWddOnt2YWx1ZTp0YWd9LFxucGF5bG9hZDp7dmFsdWU6cGF5bG9hZCxlbnVtZXJhYmxlOnRydWV9fSkpO1xuXG5cbiB9OyRo4oCNX29uY2UubWFrZVRhZ2dlZChtYWtlVGFnZ2VkKTtcbmhhcmRlbihtYWtlVGFnZ2VkKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlVGFnZ2VkIjpbIm1ha2VUYWdnZWQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAGUAoxvUZAAD1GQAAMAAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS43L3NyYy9wYXNzU3R5bGUtaGVscGVycy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiUEFTU19TVFlMRSIsImFzc2VydENoZWNrZXIiLCJjYW5CZU1ldGhvZCIsImNoZWNrRnVuY3Rpb25UYWdSZWNvcmQiLCJjaGVja05vcm1hbFByb3BlcnR5IiwiY2hlY2tQYXNzU3R5bGUiLCJjaGVja1RhZ1JlY29yZCIsImdldFRhZyIsImhhc093blByb3BlcnR5T2YiLCJpc09iamVjdCIsImlzVHlwZWRBcnJheSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qLyA8cmVmZXJlbmNlIHR5cGVzPVwic2VzXCIvPiovXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkNoZWNrZXJ9IENoZWNrZXIgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlBhc3NTdHlsZX0gUGFzc1N0eWxlICovXG5cbmNvbnN0e2RldGFpbHM6WCxxdW90ZTpxfT1hc3NlcnQ7XG5jb25zdHtpc0FycmF5fT1BcnJheTtcbmNvbnN0e3Byb3RvdHlwZTpmdW5jdGlvblByb3RvdHlwZX09RnVuY3Rpb247XG5jb25zdHtcbmdldE93blByb3BlcnR5RGVzY3JpcHRvcixcbmdldFByb3RvdHlwZU9mLFxuaGFzT3duUHJvcGVydHk6b2JqZWN0SGFzT3duUHJvcGVydHksXG5pc0Zyb3plbixcbnByb3RvdHlwZTpvYmplY3RQcm90b3R5cGV9PVxuT2JqZWN0O1xuY29uc3R7YXBwbHl9PVJlZmxlY3Q7XG5jb25zdHt0b1N0cmluZ1RhZzp0b1N0cmluZ1RhZ1N5bWJvbH09U3ltYm9sO1xuXG5jb25zdCB0eXBlZEFycmF5UHJvdG90eXBlPWdldFByb3RvdHlwZU9mKFVpbnQ4QXJyYXkucHJvdG90eXBlKTtcbmNvbnN0IHR5cGVkQXJyYXlUb1N0cmluZ1RhZ0Rlc2M9Z2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFxudHlwZWRBcnJheVByb3RvdHlwZSxcbnRvU3RyaW5nVGFnU3ltYm9sKTtcblxuYXNzZXJ0KHR5cGVkQXJyYXlUb1N0cmluZ1RhZ0Rlc2MpO1xuY29uc3QgZ2V0VHlwZWRBcnJheVRvU3RyaW5nVGFnPXR5cGVkQXJyYXlUb1N0cmluZ1RhZ0Rlc2MuZ2V0O1xuYXNzZXJ0KHR5cGVvZiBnZXRUeXBlZEFycmF5VG9TdHJpbmdUYWc9PT0nZnVuY3Rpb24nKTtcblxuY29uc3QgICAgICAgIGhhc093blByb3BlcnR5T2Y9KG9iaixwcm9wKT0+XG5hcHBseShvYmplY3RIYXNPd25Qcm9wZXJ0eSxvYmosW3Byb3BdKTskaOKAjV9vbmNlLmhhc093blByb3BlcnR5T2YoaGFzT3duUHJvcGVydHlPZik7XG5oYXJkZW4oaGFzT3duUHJvcGVydHlPZik7XG5cbmNvbnN0ICAgICAgICBpc09iamVjdD0odmFsKT0+T2JqZWN0KHZhbCk9PT12YWw7JGjigI1fb25jZS5pc09iamVjdChpc09iamVjdCk7XG5oYXJkZW4oaXNPYmplY3QpO1xuXG4vKipcbiAqIER1cGxpY2F0ZXMgcGFja2FnZXMvc2VzL3NyYy9tYWtlLWhhcmRlbmVyLmpzIHRvIGF2b2lkIGEgZGVwZW5kZW5jeS5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IG9iamVjdFxuICovXG5jb25zdCAgICAgICAgaXNUeXBlZEFycmF5PShvYmplY3QpPT57XG4vKiBUaGUgb2JqZWN0IG11c3QgcGFzcyBhIGJyYW5kIGNoZWNrIG9yIHRvU3RyaW5nVGFnIHdpbGwgcmV0dXJuIHVuZGVmaW5lZC4qL1xuY29uc3QgdGFnPWFwcGx5KGdldFR5cGVkQXJyYXlUb1N0cmluZ1RhZyxvYmplY3QsW10pO1xucmV0dXJuIHRhZyE9PXVuZGVmaW5lZDtcbiB9OyRo4oCNX29uY2UuaXNUeXBlZEFycmF5KGlzVHlwZWRBcnJheSk7XG5oYXJkZW4oaXNUeXBlZEFycmF5KTtcblxuY29uc3QgICAgICAgIFBBU1NfU1RZTEU9U3ltYm9sLmZvcigncGFzc1N0eWxlJyk7XG5cbi8qKlxuICogRm9yIGEgZnVuY3Rpb24gdG8gYmUgYSB2YWxpZCBtZXRob2QsIGl0IG11c3Qgbm90IGJlIHBhc3NhYmxlLlxuICogT3RoZXJ3aXNlLCB3ZSByaXNrIGNvbmZ1c2luZyBwYXNzLWJ5LWNvcHkgZGF0YSBjYXJyeWluZ1xuICogZmFyIGZ1bmN0aW9ucyB3aXRoIGF0dGVtcHRzIGF0IGZhciBvYmplY3RzIHdpdGggbWV0aG9kcy5cbiAqXG4gKiBUT0RPIEhBWkFSRCBCZWNhdXNlIHdlIGNoZWNrIHRoaXMgb24gdGhlIHdheSB0byBoYXJkZW5pbmcgYSByZW1vdGFibGUsXG4gKiB3ZSBjYW5ub3QgeWV0IGNoZWNrIHRoYXQgYGZ1bmNgIGlzIGhhcmRlbmVkLiBIb3dldmVyLCB3aXRob3V0XG4gKiBkb2luZyBzbywgaXQncyBpbmhlcml0YW5jZSBtaWdodCBjaGFuZ2UgYWZ0ZXIgdGhlIGBQQVNTX1NUWUxFYFxuICogY2hlY2sgYmVsb3cuXG4gKlxuICogQHBhcmFtIHthbnl9IGZ1bmNcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovJGjigI1fb25jZS5QQVNTX1NUWUxFKFBBU1NfU1RZTEUpO1xuY29uc3QgICAgICAgIGNhbkJlTWV0aG9kPShmdW5jKT0+XG50eXBlb2YgZnVuYz09PSdmdW5jdGlvbicmJiEoUEFTU19TVFlMRSBpbiBmdW5jKTskaOKAjV9vbmNlLmNhbkJlTWV0aG9kKGNhbkJlTWV0aG9kKTtcbmhhcmRlbihjYW5CZU1ldGhvZCk7XG5cbi8qKlxuICogQmVsb3cgd2UgaGF2ZSBhIHNlcmllcyBvZiBwcmVkaWNhdGUgZnVuY3Rpb25zIGFuZCB0aGVpciAoY3VycmllZCkgYXNzZXJ0aW9uXG4gKiBmdW5jdGlvbnMuIFRoZSBzZW1hbnRpY3Mgb2YgdGhlIGFzc2VydGlvbiBmdW5jdGlvbiBpcyBqdXN0IHRvIGFzc2VydCB0aGF0XG4gKiB0aGUgY29ycmVzcG9uZGluZyBwcmVkaWNhdGUgZnVuY3Rpb24gd291bGQgaGF2ZSByZXR1cm5lZCB0cnVlLiBCdXQgaXRcbiAqIHJlcHJvZHVjZXMgdGhlIGludGVybmFsIHRlc3RzIHNvIGZhaWx1cmVzIGNhbiBnaXZlIGEgYmV0dGVyIGVycm9yIG1lc3NhZ2UuXG4gKlxuICogQHR5cGUge0NoZWNrZXJ9XG4gKi9cbmNvbnN0ICAgICAgICBhc3NlcnRDaGVja2VyPShjb25kLGRldGFpbHMpPT57XG5hc3NlcnQoY29uZCxkZXRhaWxzKTtcbnJldHVybiB0cnVlO1xuIH07JGjigI1fb25jZS5hc3NlcnRDaGVja2VyKGFzc2VydENoZWNrZXIpO1xuaGFyZGVuKGFzc2VydENoZWNrZXIpO1xuXG4vKipcbiAqIENoZWNrcyBmb3IgdGhlIHByZXNlbmNlIGFuZCBlbnVtZXJhYmlsaXR5IG9mIGFuIG93biBkYXRhIHByb3BlcnR5LlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBjYW5kaWRhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcnxzeW1ib2x9IHByb3BlcnR5TmFtZVxuICogQHBhcmFtIHtib29sZWFufSBzaG91bGRCZUVudW1lcmFibGVcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gW2NoZWNrXVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0ICAgICAgICBjaGVja05vcm1hbFByb3BlcnR5PShcbmNhbmRpZGF0ZSxcbnByb3BlcnR5TmFtZSxcbnNob3VsZEJlRW51bWVyYWJsZSxcbmNoZWNrKT0+XG57XG5jb25zdCByZWplY3Q9ISFjaGVjayYmKChkZXRhaWxzKT0+Y2hlY2soZmFsc2UsZGV0YWlscykpO1xuY29uc3QgZGVzYz1nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoY2FuZGlkYXRlLHByb3BlcnR5TmFtZSk7XG5pZihkZXNjPT09dW5kZWZpbmVkKXtcbnJldHVybihcbnJlamVjdCYmcmVqZWN0KFggYCR7cShwcm9wZXJ0eU5hbWUpfSBwcm9wZXJ0eSBleHBlY3RlZDogJHtjYW5kaWRhdGV9YCkpO1xuXG4gfVxucmV0dXJuKFxuKGhhc093blByb3BlcnR5T2YoZGVzYywndmFsdWUnKXx8XG5yZWplY3QmJlxucmVqZWN0KFxuWCBgJHtxKHByb3BlcnR5TmFtZSl9IG11c3Qgbm90IGJlIGFuIGFjY2Vzc29yIHByb3BlcnR5OiAke2NhbmRpZGF0ZX1gKSkmJihcblxuc2hvdWxkQmVFbnVtZXJhYmxlP1xuZGVzYy5lbnVtZXJhYmxlfHxcbnJlamVjdCYmXG5yZWplY3QoXG5YIGAke3EocHJvcGVydHlOYW1lKX0gbXVzdCBiZSBhbiBlbnVtZXJhYmxlIHByb3BlcnR5OiAke2NhbmRpZGF0ZX1gKTpcblxuIWRlc2MuZW51bWVyYWJsZXx8XG5yZWplY3QmJlxucmVqZWN0KFxuWCBgJHtxKFxucHJvcGVydHlOYW1lKVxuIH0gbXVzdCBub3QgYmUgYW4gZW51bWVyYWJsZSBwcm9wZXJ0eTogJHtjYW5kaWRhdGV9YCkpKTtcblxuXG4gfTskaOKAjV9vbmNlLmNoZWNrTm9ybWFsUHJvcGVydHkoY2hlY2tOb3JtYWxQcm9wZXJ0eSk7XG5oYXJkZW4oY2hlY2tOb3JtYWxQcm9wZXJ0eSk7XG5cbmNvbnN0ICAgICAgICBnZXRUYWc9KHRhZ1JlY29yZCk9PnRhZ1JlY29yZFtTeW1ib2wudG9TdHJpbmdUYWddOyRo4oCNX29uY2UuZ2V0VGFnKGdldFRhZyk7XG5oYXJkZW4oZ2V0VGFnKTtcblxuY29uc3QgICAgICAgIGNoZWNrUGFzc1N0eWxlPShvYmosZXhwZWN0ZWRQYXNzU3R5bGUsY2hlY2spPT57XG5jb25zdCByZWplY3Q9ISFjaGVjayYmKChkZXRhaWxzKT0+Y2hlY2soZmFsc2UsZGV0YWlscykpO1xuY29uc3QgYWN0dWFsPW9ialtQQVNTX1NUWUxFXTtcbnJldHVybihcbmFjdHVhbD09PWV4cGVjdGVkUGFzc1N0eWxlfHxcbnJlamVjdCYmXG5yZWplY3QoWCBgRXhwZWN0ZWQgJHtxKGV4cGVjdGVkUGFzc1N0eWxlKX0sIG5vdCAke3EoYWN0dWFsKX06ICR7b2JqfWApKTtcblxuIH07JGjigI1fb25jZS5jaGVja1Bhc3NTdHlsZShjaGVja1Bhc3NTdHlsZSk7XG5oYXJkZW4oY2hlY2tQYXNzU3R5bGUpO1xuXG5jb25zdCBtYWtlQ2hlY2tUYWdSZWNvcmQ9KGNoZWNrUHJvdG8pPT57XG4vKipcbiAqIEBwYXJhbSB7eyBbUEFTU19TVFlMRV06IHN0cmluZyB9fSB0YWdSZWNvcmRcbiAqIEBwYXJhbSB7UGFzc1N0eWxlfSBwYXNzU3R5bGVcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gW2NoZWNrXVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNoZWNrVGFnUmVjb3JkPSh0YWdSZWNvcmQscGFzc1N0eWxlLGNoZWNrKT0+e1xuY29uc3QgcmVqZWN0PSEhY2hlY2smJigoZGV0YWlscyk9PmNoZWNrKGZhbHNlLGRldGFpbHMpKTtcbnJldHVybihcbihpc09iamVjdCh0YWdSZWNvcmQpfHxcbnJlamVjdCYmXG5yZWplY3QoWCBgQSBub24tb2JqZWN0IGNhbm5vdCBiZSBhIHRhZ1JlY29yZDogJHt0YWdSZWNvcmR9YCkpJiYoXG5pc0Zyb3plbih0YWdSZWNvcmQpfHxcbnJlamVjdCYmcmVqZWN0KFggYEEgdGFnUmVjb3JkIG11c3QgYmUgZnJvemVuOiAke3RhZ1JlY29yZH1gKSkmJihcbiFpc0FycmF5KHRhZ1JlY29yZCl8fFxucmVqZWN0JiZyZWplY3QoWCBgQW4gYXJyYXkgY2Fubm90IGJlIGEgdGFnUmVjb3JkOiAke3RhZ1JlY29yZH1gKSkmJlxuY2hlY2tOb3JtYWxQcm9wZXJ0eSh0YWdSZWNvcmQsUEFTU19TVFlMRSxmYWxzZSxjaGVjaykmJlxuY2hlY2tQYXNzU3R5bGUodGFnUmVjb3JkLHBhc3NTdHlsZSxjaGVjaykmJlxuY2hlY2tOb3JtYWxQcm9wZXJ0eSh0YWdSZWNvcmQsU3ltYm9sLnRvU3RyaW5nVGFnLGZhbHNlLGNoZWNrKSYmKFxudHlwZW9mIGdldFRhZyh0YWdSZWNvcmQpPT09J3N0cmluZyd8fFxucmVqZWN0JiZcbnJlamVjdChcblggYEEgW1N5bWJvbC50b1N0cmluZ1RhZ10tbmFtZWQgcHJvcGVydHkgbXVzdCBiZSBhIHN0cmluZzogJHt0YWdSZWNvcmR9YCkpJiZcblxuY2hlY2tQcm90byh0YWdSZWNvcmQsZ2V0UHJvdG90eXBlT2YodGFnUmVjb3JkKSxjaGVjaykpO1xuXG4gfTtcbnJldHVybiBoYXJkZW4oY2hlY2tUYWdSZWNvcmQpO1xuIH07XG5cbmNvbnN0ICAgICAgICBjaGVja1RhZ1JlY29yZD1tYWtlQ2hlY2tUYWdSZWNvcmQoXG4odmFsLHByb3RvLGNoZWNrKT0+XG5wcm90bz09PW9iamVjdFByb3RvdHlwZXx8XG4hIWNoZWNrJiZcbmNoZWNrKGZhbHNlLFggYEEgdGFnUmVjb3JkIG11c3QgaW5oZXJpdCBmcm9tIE9iamVjdC5wcm90b3R5cGU6ICR7dmFsfWApKTskaOKAjV9vbmNlLmNoZWNrVGFnUmVjb3JkKGNoZWNrVGFnUmVjb3JkKTtcblxuaGFyZGVuKGNoZWNrVGFnUmVjb3JkKTtcblxuY29uc3QgICAgICAgIGNoZWNrRnVuY3Rpb25UYWdSZWNvcmQ9bWFrZUNoZWNrVGFnUmVjb3JkKFxuKHZhbCxwcm90byxjaGVjayk9PlxucHJvdG89PT1mdW5jdGlvblByb3RvdHlwZXx8XG5wcm90byE9PW51bGwmJmdldFByb3RvdHlwZU9mKHByb3RvKT09PWZ1bmN0aW9uUHJvdG90eXBlfHxcbiEhY2hlY2smJlxuY2hlY2soXG5mYWxzZSxcblggYEZvciBmdW5jdGlvbnMsIGEgdGFnUmVjb3JkIG11c3QgaW5oZXJpdCBmcm9tIEZ1bmN0aW9uLnByb3RvdHlwZTogJHt2YWx9YCkpOyRo4oCNX29uY2UuY2hlY2tGdW5jdGlvblRhZ1JlY29yZChjaGVja0Z1bmN0aW9uVGFnUmVjb3JkKTtcblxuXG5oYXJkZW4oY2hlY2tGdW5jdGlvblRhZ1JlY29yZCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaGFzT3duUHJvcGVydHlPZiI6WyJoYXNPd25Qcm9wZXJ0eU9mIl0sImlzT2JqZWN0IjpbImlzT2JqZWN0Il0sImlzVHlwZWRBcnJheSI6WyJpc1R5cGVkQXJyYXkiXSwiUEFTU19TVFlMRSI6WyJQQVNTX1NUWUxFIl0sImNhbkJlTWV0aG9kIjpbImNhbkJlTWV0aG9kIl0sImFzc2VydENoZWNrZXIiOlsiYXNzZXJ0Q2hlY2tlciJdLCJjaGVja05vcm1hbFByb3BlcnR5IjpbImNoZWNrTm9ybWFsUHJvcGVydHkiXSwiZ2V0VGFnIjpbImdldFRhZyJdLCJjaGVja1Bhc3NTdHlsZSI6WyJjaGVja1Bhc3NTdHlsZSJdLCJjaGVja1RhZ1JlY29yZCI6WyJjaGVja1RhZ1JlY29yZCJdLCJjaGVja0Z1bmN0aW9uVGFnUmVjb3JkIjpbImNoZWNrRnVuY3Rpb25UYWdSZWNvcmQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAzVfELNceAADXHgAAKgAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS43L3NyYy9wYXNzU3R5bGVPZi5qc3siaW1wb3J0cyI6WyJAZW5kby9wcm9taXNlLWtpdCIsIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiLCIuL2NvcHlBcnJheS5qcyIsIi4vY29weVJlY29yZC5qcyIsIi4vdGFnZ2VkLmpzIiwiLi9lcnJvci5qcyIsIi4vcmVtb3RhYmxlLmpzIiwiLi9zeW1ib2wuanMiLCIuL3NhZmUtcHJvbWlzZS5qcyJdLCJleHBvcnRzIjpbImFzc2VydFBhc3NhYmxlIiwicGFzc1N0eWxlT2YiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgaXNQcm9taXNlLGlzT2JqZWN0LGlzVHlwZWRBcnJheSxQQVNTX1NUWUxFLENvcHlBcnJheUhlbHBlcixDb3B5UmVjb3JkSGVscGVyLFRhZ2dlZEhlbHBlcixFcnJvckhlbHBlcixSZW1vdGFibGVIZWxwZXIsYXNzZXJ0UGFzc2FibGVTeW1ib2wsYXNzZXJ0U2FmZVByb21pc2U7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vcHJvbWlzZS1raXRcIiwgW1tcImlzUHJvbWlzZVwiLCBbJGjigI1fYSA9PiAoaXNQcm9taXNlID0gJGjigI1fYSldXV1dLFtcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImlzT2JqZWN0XCIsIFskaOKAjV9hID0+IChpc09iamVjdCA9ICRo4oCNX2EpXV0sW1wiaXNUeXBlZEFycmF5XCIsIFskaOKAjV9hID0+IChpc1R5cGVkQXJyYXkgPSAkaOKAjV9hKV1dLFtcIlBBU1NfU1RZTEVcIiwgWyRo4oCNX2EgPT4gKFBBU1NfU1RZTEUgPSAkaOKAjV9hKV1dXV0sW1wiLi9jb3B5QXJyYXkuanNcIiwgW1tcIkNvcHlBcnJheUhlbHBlclwiLCBbJGjigI1fYSA9PiAoQ29weUFycmF5SGVscGVyID0gJGjigI1fYSldXV1dLFtcIi4vY29weVJlY29yZC5qc1wiLCBbW1wiQ29weVJlY29yZEhlbHBlclwiLCBbJGjigI1fYSA9PiAoQ29weVJlY29yZEhlbHBlciA9ICRo4oCNX2EpXV1dXSxbXCIuL3RhZ2dlZC5qc1wiLCBbW1wiVGFnZ2VkSGVscGVyXCIsIFskaOKAjV9hID0+IChUYWdnZWRIZWxwZXIgPSAkaOKAjV9hKV1dXV0sW1wiLi9lcnJvci5qc1wiLCBbW1wiRXJyb3JIZWxwZXJcIiwgWyRo4oCNX2EgPT4gKEVycm9ySGVscGVyID0gJGjigI1fYSldXV1dLFtcIi4vcmVtb3RhYmxlLmpzXCIsIFtbXCJSZW1vdGFibGVIZWxwZXJcIiwgWyRo4oCNX2EgPT4gKFJlbW90YWJsZUhlbHBlciA9ICRo4oCNX2EpXV1dXSxbXCIuL3N5bWJvbC5qc1wiLCBbW1wiYXNzZXJ0UGFzc2FibGVTeW1ib2xcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhc3NhYmxlU3ltYm9sID0gJGjigI1fYSldXV1dLFtcIi4vc2FmZS1wcm9taXNlLmpzXCIsIFtbXCJhc3NlcnRTYWZlUHJvbWlzZVwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0U2FmZVByb21pc2UgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi9pbnRlcm5hbC10eXBlcy5qcycpLlBhc3NTdHlsZUhlbHBlcn0gUGFzc1N0eWxlSGVscGVyICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5QYXNzYWJsZX0gUGFzc2FibGUgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlBhc3NTdHlsZX0gUGFzc1N0eWxlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5QYXNzU3R5bGVPZn0gUGFzc1N0eWxlT2YgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlByaW1pdGl2ZVN0eWxlfSBQcmltaXRpdmVTdHlsZSAqL1xuXG4vKiogQHR5cGVkZWYge0V4Y2x1ZGU8UGFzc1N0eWxlLCBQcmltaXRpdmVTdHlsZSB8IFwicHJvbWlzZVwiPn0gSGVscGVyUGFzc1N0eWxlICovXG5cbmNvbnN0e2RldGFpbHM6WCxGYWlsLHF1b3RlOnF9PWFzc2VydDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5jb25zdHtpc0Zyb3plbn09T2JqZWN0O1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc1N0eWxlSGVscGVyW119IHBhc3NTdHlsZUhlbHBlcnNcbiAqIEByZXR1cm5zIHtSZWNvcmQ8SGVscGVyUGFzc1N0eWxlLCBQYXNzU3R5bGVIZWxwZXI+IH1cbiAqL1xuXG5jb25zdCBtYWtlSGVscGVyVGFibGU9KHBhc3NTdHlsZUhlbHBlcnMpPT57XG4vKiogQHR5cGUge1JlY29yZDxIZWxwZXJQYXNzU3R5bGUsIGFueT4gJiB7X19wcm90b19fOiBudWxsfX0gKi9cbmNvbnN0IEhlbHBlclRhYmxlPXtcbl9fcHJvdG9fXzpudWxsLFxuY29weUFycmF5OnVuZGVmaW5lZCxcbmNvcHlSZWNvcmQ6dW5kZWZpbmVkLFxudGFnZ2VkOnVuZGVmaW5lZCxcbmVycm9yOnVuZGVmaW5lZCxcbnJlbW90YWJsZTp1bmRlZmluZWR9O1xuXG5mb3IoY29uc3QgaGVscGVyIG9mIHBhc3NTdHlsZUhlbHBlcnMpe1xuY29uc3R7c3R5bGVOYW1lfT1oZWxwZXI7XG5zdHlsZU5hbWUgaW4gSGVscGVyVGFibGV8fEZhaWwgYFVucmVjb2duaXplZCBoZWxwZXI6ICR7cShzdHlsZU5hbWUpfWA7XG5IZWxwZXJUYWJsZVtzdHlsZU5hbWVdPT09dW5kZWZpbmVkfHxcbkZhaWwgYGNvbmZsaWN0aW5nIGhlbHBlcnMgZm9yICR7cShzdHlsZU5hbWUpfWA7XG5IZWxwZXJUYWJsZVtzdHlsZU5hbWVdPWhlbHBlcjtcbiB9XG5mb3IoY29uc3Qgc3R5bGVOYW1lIG9mIG93bktleXMoSGVscGVyVGFibGUpKXtcbkhlbHBlclRhYmxlW3N0eWxlTmFtZV0hPT11bmRlZmluZWR8fFxuRmFpbCBgbWlzc2luZyBoZWxwZXIgZm9yICR7cShzdHlsZU5hbWUpfWA7XG4gfVxuXG5yZXR1cm4gaGFyZGVuKEhlbHBlclRhYmxlKTtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc1N0eWxlSGVscGVyW119IHBhc3NTdHlsZUhlbHBlcnMgVGhlIHBhc3NTdHlsZUhlbHBlcnMgdG8gcmVnaXN0ZXIsXG4gKiBpbiBwcmlvcml0eSBvcmRlci5cbiAqIE5PVEUgVGhlc2UgbXVzdCBhbGwgYmUgXCJ0cnVzdGVkXCIsXG4gKiBjb21wbGV0ZSwgYW5kIG5vbi1jb2xsaWRpbmcuIGBtYWtlUGFzc1N0eWxlT2ZgIG1heSAqYXNzdW1lKiB0aGF0IGVhY2ggaGVscGVyXG4gKiBkb2VzIHdoYXQgaXQgaXMgc3VwcG9zZWQgdG8gZG8uIGBtYWtlUGFzc1N0eWxlT2ZgIGlzIG5vdCB0cnlpbmcgdG8gZGVmZW5kXG4gKiBpdHNlbGYgYWdhaW5zdCBtYWxpY2lvdXMgaGVscGVycywgdGhvdWdoIGl0IGRvZXMgZGVmZW5kIGFnYWluc3Qgc29tZVxuICogYWNjaWRlbnRzLlxuICogQHJldHVybnMge1Bhc3NTdHlsZU9mfVxuICovXG5jb25zdCBtYWtlUGFzc1N0eWxlT2Y9KHBhc3NTdHlsZUhlbHBlcnMpPT57XG5jb25zdCBIZWxwZXJUYWJsZT1tYWtlSGVscGVyVGFibGUocGFzc1N0eWxlSGVscGVycyk7XG5jb25zdCByZW1vdGFibGVIZWxwZXI9SGVscGVyVGFibGUucmVtb3RhYmxlO1xuXG4vKipcbiAqIFB1cmVseSBmb3IgcGVyZm9ybWFuY2UuIEhvd2V2ZXIgaXQgaXMgbXV0YWJsZSBzdGF0aWMgc3RhdGUsIGFuZFxuICogaXQgZG9lcyBoYXZlIHNvbWUgb2JzZXJ2YWJpbGl0eSBvbiBwcm94aWVzLiBUT0RPIG5lZWQgdG8gYXNzZXNzXG4gKiB3aGV0aGVyIHRoaXMgY3JlYXRlcyBhIHN0YXRpYyBjb21tdW5pY2F0aW9ucyBjaGFubmVsLlxuICpcbiAqIHBhc3NTdHlsZU9mIGRvZXMgYSBmdWxsIHJlY3Vyc2l2ZSB3YWxrIG9mIHBhc3MtYnktY29weVxuICogc3RydWN0dXJlcywgaW4gb3JkZXIgdG8gdmFsaWRhdGUgdGhhdCB0aGV5IGFyZSBhY3ljbGljLiBJbiBhZGRpdGlvblxuICogaXQgaXMgdXNlZCBieSBvdGhlciBhbGdvcml0aG1zIHRvIHJlY3Vyc2l2ZWx5IHdhbGsgdGhlc2UgcGFzcy1ieS1jb3B5XG4gKiBzdHJ1Y3R1cmVzLCBzbyB3aXRob3V0IHRoaXMgY2FjaGUsIHRoZXNlIGFsZ29yaXRobXMgY291bGQgYmVcbiAqIE8oTioqMikgb3Igd29yc2UuXG4gKlxuICogQHR5cGUge1dlYWtNYXA8UGFzc2FibGUsIFBhc3NTdHlsZT59XG4gKi9cbmNvbnN0IHBhc3NTdHlsZU1lbW89bmV3IFdlYWtNYXAoKTtcblxuLyoqXG4gKiBAdHlwZSB7UGFzc1N0eWxlT2Z9XG4gKi9cbmNvbnN0IHBhc3NTdHlsZU9mPShwYXNzYWJsZSk9Pntcbi8qIEV2ZW4gd2hlbiBhIFdlYWtTZXQgaXMgY29ycmVjdCwgd2hlbiB0aGUgc2V0IGhhcyBhIHNob3J0ZXIgbGlmZXRpbWUqL1xuLyogdGhhbiBpdHMga2V5cywgd2UgcHJlZmVyIGEgU2V0IGR1ZSB0byBleHBlY3RlZCBpbXBsZW1lbnRhdGlvbiovXG4vKiB0cmFkZW9mZnMuKi9cbmNvbnN0IGluUHJvZ3Jlc3M9bmV3IFNldCgpO1xuXG4vKipcbiAqIEB0eXBlIHtQYXNzU3R5bGVPZn1cbiAqL1xuY29uc3QgcGFzc1N0eWxlT2ZSZWN1cj0oaW5uZXIpPT57XG5jb25zdCBpbm5lcklzT2JqZWN0PWlzT2JqZWN0KGlubmVyKTtcbmlmKGlubmVySXNPYmplY3Qpe1xuaWYocGFzc1N0eWxlTWVtby5oYXMoaW5uZXIpKXtcbi8qIEB0cy1pZ25vcmUgVHlwZVNjcmlwdCBkb2Vzbid0IGtub3cgdGhhdCBgZ2V0YCBhZnRlciBgaGFzYCBpcyBzYWZlKi9cbnJldHVybiBwYXNzU3R5bGVNZW1vLmdldChpbm5lcik7XG4gfVxuIWluUHJvZ3Jlc3MuaGFzKGlubmVyKXx8XG5GYWlsIGBQYXNzLWJ5LWNvcHkgZGF0YSBjYW5ub3QgYmUgY3ljbGljICR7aW5uZXJ9YDtcbmluUHJvZ3Jlc3MuYWRkKGlubmVyKTtcbiB9XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mSW50ZXJuYWwoaW5uZXIpO1xuaWYoaW5uZXJJc09iamVjdCl7XG5wYXNzU3R5bGVNZW1vLnNldChpbm5lcixwYXNzU3R5bGUpO1xuaW5Qcm9ncmVzcy5kZWxldGUoaW5uZXIpO1xuIH1cbnJldHVybiBwYXNzU3R5bGU7XG4gfTtcblxuLyoqXG4gKiBAdHlwZSB7UGFzc1N0eWxlT2Z9XG4gKi9cbmNvbnN0IHBhc3NTdHlsZU9mSW50ZXJuYWw9KGlubmVyKT0+e1xuY29uc3QgdHlwZXN0cj10eXBlb2YgaW5uZXI7XG5zd2l0Y2godHlwZXN0cil7XG5jYXNlJ3VuZGVmaW5lZCc6XG5jYXNlJ3N0cmluZyc6XG5jYXNlJ2Jvb2xlYW4nOlxuY2FzZSdudW1iZXInOlxuY2FzZSdiaWdpbnQnOntcbnJldHVybiB0eXBlc3RyO1xuIH1cbmNhc2Unc3ltYm9sJzp7XG5hc3NlcnRQYXNzYWJsZVN5bWJvbChpbm5lcik7XG5yZXR1cm4nc3ltYm9sJztcbiB9XG5jYXNlJ29iamVjdCc6e1xuaWYoaW5uZXI9PT1udWxsKXtcbnJldHVybidudWxsJztcbiB9XG5pZighaXNGcm96ZW4oaW5uZXIpKXtcbmFzc2VydC5mYWlsKFxuLyogVHlwZWRBcnJheXMgZ2V0IHNwZWNpYWwgdHJlYXRtZW50IGluIGhhcmRlbigpKi9cbi8qIGFuZCBhIGNvcnJlc3BvbmRpbmcgc3BlY2lhbCBlcnJvciBtZXNzYWdlIGhlcmUuKi9cbmlzVHlwZWRBcnJheShpbm5lcik/XG5YIGBDYW5ub3QgcGFzcyBtdXRhYmxlIHR5cGVkIGFycmF5cyBsaWtlICR7aW5uZXJ9LmA6XG5YIGBDYW5ub3QgcGFzcyBub24tZnJvemVuIG9iamVjdHMgbGlrZSAke2lubmVyfS4gVXNlIGhhcmRlbigpYCk7XG5cbiB9XG5pZihpc1Byb21pc2UoaW5uZXIpKXtcbmFzc2VydFNhZmVQcm9taXNlKGlubmVyKTtcbnJldHVybidwcm9taXNlJztcbiB9XG50eXBlb2YgaW5uZXIudGhlbiE9PSdmdW5jdGlvbid8fFxuRmFpbCBgQ2Fubm90IHBhc3Mgbm9uLXByb21pc2UgdGhlbmFibGVzYDtcbmNvbnN0IHBhc3NTdHlsZVRhZz1pbm5lcltQQVNTX1NUWUxFXTtcbmlmKHBhc3NTdHlsZVRhZyE9PXVuZGVmaW5lZCl7XG5hc3NlcnQudHlwZW9mKHBhc3NTdHlsZVRhZywnc3RyaW5nJyk7XG5jb25zdCBoZWxwZXI9SGVscGVyVGFibGVbcGFzc1N0eWxlVGFnXTtcbmhlbHBlciE9PXVuZGVmaW5lZHx8XG5GYWlsIGBVbnJlY29nbml6ZWQgUGFzc1N0eWxlOiAke3EocGFzc1N0eWxlVGFnKX1gO1xuaGVscGVyLmFzc2VydFZhbGlkKGlubmVyLHBhc3NTdHlsZU9mUmVjdXIpO1xucmV0dXJuICgvKiogQHR5cGUge1Bhc3NTdHlsZX0gKi9wYXNzU3R5bGVUYWcpO1xuIH1cbmZvcihjb25zdCBoZWxwZXIgb2YgcGFzc1N0eWxlSGVscGVycyl7XG5pZihoZWxwZXIuY2FuQmVWYWxpZChpbm5lcikpe1xuaGVscGVyLmFzc2VydFZhbGlkKGlubmVyLHBhc3NTdHlsZU9mUmVjdXIpO1xucmV0dXJuIGhlbHBlci5zdHlsZU5hbWU7XG4gfVxuIH1cbnJlbW90YWJsZUhlbHBlci5hc3NlcnRWYWxpZChpbm5lcixwYXNzU3R5bGVPZlJlY3VyKTtcbnJldHVybidyZW1vdGFibGUnO1xuIH1cbmNhc2UnZnVuY3Rpb24nOntcbmlzRnJvemVuKGlubmVyKXx8XG5GYWlsIGBDYW5ub3QgcGFzcyBub24tZnJvemVuIG9iamVjdHMgbGlrZSAke2lubmVyfS4gVXNlIGhhcmRlbigpYDtcbnR5cGVvZiBpbm5lci50aGVuIT09J2Z1bmN0aW9uJ3x8XG5GYWlsIGBDYW5ub3QgcGFzcyBub24tcHJvbWlzZSB0aGVuYWJsZXNgO1xucmVtb3RhYmxlSGVscGVyLmFzc2VydFZhbGlkKGlubmVyLHBhc3NTdHlsZU9mUmVjdXIpO1xucmV0dXJuJ3JlbW90YWJsZSc7XG4gfVxuZGVmYXVsdDp7XG50aHJvdyBhc3NlcnQuZmFpbChYIGBVbnJlY29nbml6ZWQgdHlwZW9mICR7cSh0eXBlc3RyKX1gLFR5cGVFcnJvcik7XG4gfX1cblxuIH07XG5cbnJldHVybiBwYXNzU3R5bGVPZlJlY3VyKHBhc3NhYmxlKTtcbiB9O1xucmV0dXJuIGhhcmRlbihwYXNzU3R5bGVPZik7XG4gfTtcblxuLyoqXG4gKiBJZiB0aGVyZSBpcyBhbHJlYWR5IGEgYFZhdGFEYXRhYCBnbG9iYWwgY29udGFpbmluZyBhIGBwYXNzU3R5bGVPZmAsXG4gKiB0aGVuIHByZXN1bWFibHkgaXQgd2FzIGVuZG93ZWQgZm9yIHVzIGJ5IGxpdmVzbG90cywgc28gd2Ugc2hvdWxkIHVzZVxuICogYW5kIGV4cG9ydCB0aGF0IG9uZSBpbnN0ZWFkLiBPdGhlciBzb2Z0d2FyZSBtYXkgaGF2ZSBsZWZ0IGl0IGZvciB1cyBoZXJlLFxuICogYnV0IGl0IHdvdWxkIHJlcXVpcmUgd3JpdGUgYWNjZXNzIHRvIG91ciBnbG9iYWwsIG9yIHRoZSBhYmlsaXR5IHRvXG4gKiBwcm92aWRlIGVuZG93bWVudHMgdG8gb3VyIGdsb2JhbCwgYm90aCBvZiB3aGljaCBzZWVtcyBhZGVxdWF0ZSBhcyBhIHRlc3Qgb2ZcbiAqIHdoZXRoZXIgaXQgaXMgYXV0aG9yaXplZCB0byBzZXJ2ZSB0aGUgc2FtZSByb2xlIGFzIGxpdmVzbG90cy5cbiAqXG4gKiBOT1RFIEhBWkFSRDogVGhpcyB1c2UgYnkgbGl2ZXNsb3RzIGRvZXMgcmVseSBvbiBgcGFzc1N0eWxlT2ZgIGJlaW5nXG4gKiBkZXRlcm1pbmlzdGljLiBJZiBpdCBpcyBub3QsIHRoZW4gaW4gYSBsaXZlc2xvdC1saWtlIHZpcnR1YWxpemVkXG4gKiBlbnZpcm9ubWVudCwgaXQgY2FuIGJlIHVzZWQgdG8gZGV0ZWN0IEdDLlxuICpcbiAqIEB0eXBlIHtQYXNzU3R5bGVPZn1cbiAqL1xuY29uc3QgICAgICAgIHBhc3NTdHlsZU9mPVxuLyogVU5USUwgaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL2lzc3Vlcy8xNTE0Ki9cbi8qIFByZWZlcjogZ2xvYmFsVGhpcz8uVmF0RGF0YT8ucGFzc1N0eWxlT2YgfHwqL1xuZ2xvYmFsVGhpcyYmZ2xvYmFsVGhpcy5WYXREYXRhJiZnbG9iYWxUaGlzLlZhdERhdGEucGFzc1N0eWxlT2Z8fFxubWFrZVBhc3NTdHlsZU9mKFtcbkNvcHlBcnJheUhlbHBlcixcbkNvcHlSZWNvcmRIZWxwZXIsXG5UYWdnZWRIZWxwZXIsXG5FcnJvckhlbHBlcixcblJlbW90YWJsZUhlbHBlcl0pOyRo4oCNX29uY2UucGFzc1N0eWxlT2YocGFzc1N0eWxlT2YpO1xuXG5cbmNvbnN0ICAgICAgICBhc3NlcnRQYXNzYWJsZT0odmFsKT0+e1xucGFzc1N0eWxlT2YodmFsKTsvKiB0aHJvd3MgaWYgdmFsIGlzIG5vdCBhIHBhc3NhYmxlKi9cbiB9OyRo4oCNX29uY2UuYXNzZXJ0UGFzc2FibGUoYXNzZXJ0UGFzc2FibGUpO1xuaGFyZGVuKGFzc2VydFBhc3NhYmxlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJwYXNzU3R5bGVPZiI6WyJwYXNzU3R5bGVPZiJdLCJhc3NlcnRQYXNzYWJsZSI6WyJhc3NlcnRQYXNzYWJsZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAUsaJ9wyEAAMMhAAAoAAAAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjcvc3JjL3JlbW90YWJsZS5qc3siaW1wb3J0cyI6WyIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIl0sImV4cG9ydHMiOlsiUmVtb3RhYmxlSGVscGVyIiwiYXNzZXJ0SWZhY2UiLCJnZXRJbnRlcmZhY2VPZiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnRDaGVja2VyLGNhbkJlTWV0aG9kLGhhc093blByb3BlcnR5T2YsUEFTU19TVFlMRSxjaGVja1RhZ1JlY29yZCxjaGVja0Z1bmN0aW9uVGFnUmVjb3JkLGlzT2JqZWN0LGdldFRhZzskaOKAjV9pbXBvcnRzKFtbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsIFskaOKAjV9hID0+IChhc3NlcnRDaGVja2VyID0gJGjigI1fYSldXSxbXCJjYW5CZU1ldGhvZFwiLCBbJGjigI1fYSA9PiAoY2FuQmVNZXRob2QgPSAkaOKAjV9hKV1dLFtcImhhc093blByb3BlcnR5T2ZcIiwgWyRo4oCNX2EgPT4gKGhhc093blByb3BlcnR5T2YgPSAkaOKAjV9hKV1dLFtcIlBBU1NfU1RZTEVcIiwgWyRo4oCNX2EgPT4gKFBBU1NfU1RZTEUgPSAkaOKAjV9hKV1dLFtcImNoZWNrVGFnUmVjb3JkXCIsIFskaOKAjV9hID0+IChjaGVja1RhZ1JlY29yZCA9ICRo4oCNX2EpXV0sW1wiY2hlY2tGdW5jdGlvblRhZ1JlY29yZFwiLCBbJGjigI1fYSA9PiAoY2hlY2tGdW5jdGlvblRhZ1JlY29yZCA9ICRo4oCNX2EpXV0sW1wiaXNPYmplY3RcIiwgWyRo4oCNX2EgPT4gKGlzT2JqZWN0ID0gJGjigI1fYSldXSxbXCJnZXRUYWdcIiwgWyRo4oCNX2EgPT4gKGdldFRhZyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuQ2hlY2tlcn0gQ2hlY2tlciAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuSW50ZXJmYWNlU3BlY30gSW50ZXJmYWNlU3BlYyAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuTWFyc2hhbEdldEludGVyZmFjZU9mfSBNYXJzaGFsR2V0SW50ZXJmYWNlT2YgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi9pbnRlcm5hbC10eXBlcy5qcycpLlBhc3NTdHlsZUhlbHBlcn0gUGFzc1N0eWxlSGVscGVyICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5SZW1vdGFibGVPYmplY3R9IFJlbW90YWJsZSAqL1xuXG5jb25zdHtkZXRhaWxzOlgsRmFpbCxxdW90ZTpxfT1hc3NlcnQ7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuY29uc3R7aXNBcnJheX09QXJyYXk7XG5jb25zdHtcbmdldFByb3RvdHlwZU9mLFxuaXNGcm96ZW4sXG5wcm90b3R5cGU6b2JqZWN0UHJvdG90eXBlLFxuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yc309XG5PYmplY3Q7XG5cbi8qKlxuICogQHBhcmFtIHtJbnRlcmZhY2VTcGVjfSBpZmFjZVxuICogQHBhcmFtIHtDaGVja2VyfSBbY2hlY2tdXG4gKi9cbmNvbnN0IGNoZWNrSWZhY2U9KGlmYWNlLGNoZWNrKT0+e1xuY29uc3QgcmVqZWN0PSEhY2hlY2smJigoZGV0YWlscyk9PmNoZWNrKGZhbHNlLGRldGFpbHMpKTtcbnJldHVybihcbi8qIFRPRE8gb3RoZXIgcG9zc2libGUgaWZhY2VzLCBvbmNlIHdlIGhhdmUgdGhpcmQgcGFydHkgdmVyYWNpdHkqL1xuKHR5cGVvZiBpZmFjZT09PSdzdHJpbmcnfHxcbnJlamVjdCYmXG5yZWplY3QoXG5YIGBGb3Igbm93LCBpbnRlcmZhY2UgJHtpZmFjZX0gbXVzdCBiZSBhIHN0cmluZzsgdW5pbXBsZW1lbnRlZGApKSYmKFxuXG5pZmFjZT09PSdSZW1vdGFibGUnfHxcbmlmYWNlLnN0YXJ0c1dpdGgoJ0FsbGVnZWQ6ICcpfHxcbmlmYWNlLnN0YXJ0c1dpdGgoJ0RlYnVnTmFtZTogJyl8fFxucmVqZWN0JiZcbnJlamVjdChcblggYEZvciBub3csIGlmYWNlICR7cShcbmlmYWNlKVxuIH0gbXVzdCBiZSBcIlJlbW90YWJsZVwiIG9yIGJlZ2luIHdpdGggXCJBbGxlZ2VkOiBcIiBvciBcIkRlYnVnTmFtZTogXCI7IHVuaW1wbGVtZW50ZWRgKSkpO1xuXG5cbiB9O1xuXG4vKipcbiAqIEFuIGBpZmFjZWAgbXVzdCBiZSBwdXJlLiBSaWdodCBub3cgaXQgbXVzdCBiZSBhIHN0cmluZywgd2hpY2ggaXMgcHVyZS5cbiAqIExhdGVyIHdlIGV4cGVjdCB0byBpbmNsdWRlIHNvbWUgb3RoZXIgdmFsdWVzIHRoYXQgcXVhbGlmeSBhcyBgUHVyZURhdGFgLFxuICogd2hpY2ggaXMgYSBwYXNzLWJ5LWNvcHkgc3VwZXJzdHJ1Y3R1cmUgZW5kaW5nIG9ubHkgaW4gcHJpbWl0aXZlcyBvclxuICogZW1wdHkgcGFzcy1ieS1jb3B5IGNvbXBvc2l0ZXMuIE5vIHJlbW90YWJsZXMsIHByb21pc2VzLCBvciBlcnJvcnMuXG4gKiBXZSAqYXNzdW1lKiBmb3Igbm93IHRoYXQgdGhlIHBhc3MtYnktY29weSBzdXBlcnN0cnVjdHVyZSBjb250YWlucyBub1xuICogcHJveGllcy5cbiAqXG4gKiBAcGFyYW0ge0ludGVyZmFjZVNwZWN9IGlmYWNlXG4gKi9cbmNvbnN0ICAgICAgICBhc3NlcnRJZmFjZT0oaWZhY2UpPT5jaGVja0lmYWNlKGlmYWNlLGFzc2VydENoZWNrZXIpOyRo4oCNX29uY2UuYXNzZXJ0SWZhY2UoYXNzZXJ0SWZhY2UpO1xuaGFyZGVuKGFzc2VydElmYWNlKTtcblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdCB8IEZ1bmN0aW9ufSBvcmlnaW5hbFxuICogQHBhcmFtIHtDaGVja2VyfSBbY2hlY2tdXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tSZW1vdGFibGVQcm90b09mPShvcmlnaW5hbCxjaGVjayk9PntcbmNvbnN0IHJlamVjdD0hIWNoZWNrJiYoKGRldGFpbHMpPT5jaGVjayhmYWxzZSxkZXRhaWxzKSk7XG5pc09iamVjdChvcmlnaW5hbCl8fFxuRmFpbCBgUmVtb3RhYmxlcyBtdXN0IGJlIG9iamVjdHMgb3IgZnVuY3Rpb25zOiAke29yaWdpbmFsfWA7XG5cbi8qIEEgdmFsaWQgcmVtb3RhYmxlIG9iamVjdCBtdXN0IGluaGVyaXQgZnJvbSBhIFwidGFnIHJlY29yZFwiIC0tIGEqL1xuLyogcGxhaW4tb2JqZWN0IHByb3RvdHlwZSBjb25zaXN0aW5nIG9mIG9ubHkqL1xuLyogYSBgUEFTU19TVFlMRWAgcHJvcGVydHkgd2l0aCB2YWx1ZSBcInJlbW90YWJsZVwiIGFuZCBhIHN1aXRhYmxlIGBTeW1ib2wudG9TdHJpbmdUYWdgKi9cbi8qIHByb3BlcnR5LiBUaGUgcmVtb3RhYmxlIGNvdWxkIGluaGVyaXQgZGlyZWN0bHkgZnJvbSBzdWNoIGEgdGFnIHJlY29yZCwgb3IqL1xuLyogaXQgY291bGQgaW5oZXJpdCBmcm9tIGFub3RoZXIgdmFsaWQgcmVtb3RhYmxlLCB0aGF0IHRoZXJlZm9yZSBpdHNlbGYqL1xuLyogaW5oZXJpdHMgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSBmcm9tIHN1Y2ggYSB0YWcgcmVjb3JkLiovXG4vKiovXG4vKiBUT0RPOiBJdCB3b3VsZCBiZSBuaWNlIHRvIHR5cGVkZWYgdGhpcyBzaGFwZSwgYnV0IHdlIGNhbid0IGRlY2xhcmUgYSB0eXBlKi9cbi8qIHdpdGggUEFTU19TVFlMRSBmcm9tIEpTRG9jLiovXG4vKiovXG4vKiBAdHlwZSB7eyBbUEFTU19TVFlMRV06IHN0cmluZywqL1xuLyogW1N5bWJvbC50b1N0cmluZ1RhZ106IHN0cmluZywqL1xuLyogfX0qL1xuLyoqL1xuY29uc3QgcHJvdG89Z2V0UHJvdG90eXBlT2Yob3JpZ2luYWwpO1xuaWYocHJvdG89PT1vYmplY3RQcm90b3R5cGV8fHByb3RvPT09bnVsbCl7XG5yZXR1cm4oXG5yZWplY3QmJlxucmVqZWN0KFggYFJlbW90YWJsZXMgbXVzdCBiZSBleHBsaWNpdGx5IGRlY2xhcmVkOiAke3Eob3JpZ2luYWwpfWApKTtcblxuIH1cblxuaWYodHlwZW9mIG9yaWdpbmFsPT09J29iamVjdCcpe1xuY29uc3QgcHJvdG9Qcm90bz1nZXRQcm90b3R5cGVPZihwcm90byk7XG5pZihwcm90b1Byb3RvIT09b2JqZWN0UHJvdG90eXBlJiZwcm90b1Byb3RvIT09bnVsbCl7XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xucmV0dXJuIGNoZWNrUmVtb3RhYmxlKHByb3RvLGNoZWNrKTtcbiB9XG5pZighY2hlY2tUYWdSZWNvcmQocHJvdG8sJ3JlbW90YWJsZScsY2hlY2spKXtcbnJldHVybiBmYWxzZTtcbiB9XG4gfWVsc2UgaWYodHlwZW9mIG9yaWdpbmFsPT09J2Z1bmN0aW9uJyl7XG5pZighY2hlY2tGdW5jdGlvblRhZ1JlY29yZChwcm90bywncmVtb3RhYmxlJyxjaGVjaykpe1xucmV0dXJuIGZhbHNlO1xuIH1cbiB9XG5cbi8qIFR5cGVjYXN0cyBuZWVkZWQgZHVlIHRvIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvMTg2MyovXG5jb25zdCBwYXNzU3R5bGVLZXk9LyoqIEB0eXBlIHt1bmtub3dufSAqL1BBU1NfU1RZTEU7XG5jb25zdCB0YWdLZXk9LyoqIEB0eXBlIHt1bmtub3dufSAqL1N5bWJvbC50b1N0cmluZ1RhZztcbmNvbnN0e1xuLyogY2hlY2tUYWdSZWNvcmQgYWxyZWFkeSB2ZXJpZmllZCBQQVNTX1NUWUxFIGFuZCBTeW1ib2wudG9TdHJpbmdUYWcgb3duIGRhdGEgcHJvcGVydGllcy4qL1xuWy8qKiBAdHlwZSB7c3RyaW5nfSAqL3Bhc3NTdHlsZUtleV06X3Bhc3NTdHlsZURlc2MsXG5bLyoqIEB0eXBlIHtzdHJpbmd9ICovdGFnS2V5XTp7dmFsdWU6aWZhY2V9LFxuLi4ucmVzdERlc2NzfT1cbmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMocHJvdG8pO1xuXG5yZXR1cm4oXG4ob3duS2V5cyhyZXN0RGVzY3MpLmxlbmd0aD09PTB8fFxucmVqZWN0JiZcbnJlamVjdChcblggYFVuZXhwZWN0ZWQgcHJvcGVydGllcyBvbiBSZW1vdGFibGUgUHJvdG8gJHtvd25LZXlzKHJlc3REZXNjcyl9YCkpJiZcblxuY2hlY2tJZmFjZShpZmFjZSxjaGVjaykpO1xuXG4gfTtcblxuLyoqXG4gKiBLZWVwIGEgd2VhayBzZXQgb2YgY29uZmlybWVkIHJlbW90YWJsZXMgZm9yIG1hcnNoYWwgcGVyZm9ybWFuY2VcbiAqICh3aXRob3V0IHdoaWNoIHdlIHdvdWxkIGluY3VyIGEgcmVkdW5kYW50IHZlcmlmaWNhdGlvbiBpblxuICogZ2V0SW50ZXJmYWNlT2YpLlxuICogV2UgZG9uJ3QgcmVtZW1iZXIgcmVqZWN0aW9ucyBiZWNhdXNlIHRoZXkgYXJlIHBvc3NpYmxlIHRvIGNvcnJlY3RcbiAqIHdpdGggZS5nLiBgaGFyZGVuYC5cbiAqXG4gKiBAdHlwZSB7V2Vha1NldDxSZW1vdGFibGU+fVxuICovXG5jb25zdCBjb25maXJtZWRSZW1vdGFibGVzPW5ldyBXZWFrU2V0KCk7XG5cbi8qKlxuICogQHBhcmFtIHtSZW1vdGFibGV9IHZhbFxuICogQHBhcmFtIHtDaGVja2VyfSBbY2hlY2tdXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tSZW1vdGFibGU9KHZhbCxjaGVjayk9PntcbmlmKGNvbmZpcm1lZFJlbW90YWJsZXMuaGFzKHZhbCkpe1xucmV0dXJuIHRydWU7XG4gfVxuY29uc3QgcmVqZWN0PSEhY2hlY2smJigoZGV0YWlscyk9PmNoZWNrKGZhbHNlLGRldGFpbHMpKTtcbmlmKCFpc0Zyb3plbih2YWwpKXtcbnJldHVybiByZWplY3QmJnJlamVjdChYIGBjYW5ub3Qgc2VyaWFsaXplIG5vbi1mcm96ZW4gb2JqZWN0cyBsaWtlICR7dmFsfWApO1xuIH1cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5pZighUmVtb3RhYmxlSGVscGVyLmNhbkJlVmFsaWQodmFsLGNoZWNrKSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuY29uc3QgcmVzdWx0PWNoZWNrUmVtb3RhYmxlUHJvdG9PZih2YWwsY2hlY2spO1xuaWYocmVzdWx0KXtcbmNvbmZpcm1lZFJlbW90YWJsZXMuYWRkKHZhbCk7XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9O1xuXG4vKiogQHR5cGUge01hcnNoYWxHZXRJbnRlcmZhY2VPZn0gKi9cbmNvbnN0ICAgICAgICBnZXRJbnRlcmZhY2VPZj0odmFsKT0+e1xuaWYoXG4haXNPYmplY3QodmFsKXx8XG52YWxbUEFTU19TVFlMRV0hPT0ncmVtb3RhYmxlJ3x8XG4hY2hlY2tSZW1vdGFibGUodmFsKSlcbntcbnJldHVybiB1bmRlZmluZWQ7XG4gfVxucmV0dXJuIGdldFRhZyh2YWwpO1xuIH07JGjigI1fb25jZS5nZXRJbnRlcmZhY2VPZihnZXRJbnRlcmZhY2VPZik7XG5oYXJkZW4oZ2V0SW50ZXJmYWNlT2YpO1xuXG4vKipcbiAqXG4gKiBAdHlwZSB7UGFzc1N0eWxlSGVscGVyfVxuICovXG5jb25zdCAgICAgICAgUmVtb3RhYmxlSGVscGVyPWhhcmRlbih7XG5zdHlsZU5hbWU6J3JlbW90YWJsZScsXG5cbmNhbkJlVmFsaWQ6KGNhbmRpZGF0ZSxjaGVjaz11bmRlZmluZWQpPT57XG5jb25zdCByZWplY3Q9ISFjaGVjayYmKChkZXRhaWxzKT0+Y2hlY2soZmFsc2UsZGV0YWlscykpO1xuY29uc3QgdmFsaWRUeXBlPVxuKGlzT2JqZWN0KGNhbmRpZGF0ZSl8fFxucmVqZWN0JiZcbnJlamVjdChYIGBjYW5ub3Qgc2VyaWFsaXplIG5vbi1vYmplY3RzIGFzIFJlbW90YWJsZSAke2NhbmRpZGF0ZX1gKSkmJihcbiFpc0FycmF5KGNhbmRpZGF0ZSl8fFxucmVqZWN0JiZcbnJlamVjdChYIGBjYW5ub3Qgc2VyaWFsaXplIGFycmF5cyBhcyBSZW1vdGFibGUgJHtjYW5kaWRhdGV9YCkpO1xuaWYoIXZhbGlkVHlwZSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuXG5jb25zdCBkZXNjcz1nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKGNhbmRpZGF0ZSk7XG5pZih0eXBlb2YgY2FuZGlkYXRlPT09J29iamVjdCcpe1xuLyogRXZlcnkgb3duIHByb3BlcnR5IChyZWdhcmRsZXNzIG9mIGVudW1lcmFiaWxpdHkpKi9cbi8qIG11c3QgaGF2ZSBhIGZ1bmN0aW9uIHZhbHVlLiovXG5yZXR1cm4gb3duS2V5cyhkZXNjcykuZXZlcnkoKGtleSk9PntcbnJldHVybihcbi8qIFR5cGVjYXN0IG5lZWRlZCBkdWUgdG8gaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy8xODYzKi9cbihoYXNPd25Qcm9wZXJ0eU9mKGRlc2NzWy8qKiBAdHlwZSB7c3RyaW5nfSAqL2tleV0sJ3ZhbHVlJyl8fFxucmVqZWN0JiZcbnJlamVjdChcblggYGNhbm5vdCBzZXJpYWxpemUgUmVtb3RhYmxlcyB3aXRoIGFjY2Vzc29ycyBsaWtlICR7cShcblN0cmluZyhrZXkpKVxuIH0gaW4gJHtjYW5kaWRhdGV9YCkpJiYoXG5cbmtleT09PVN5bWJvbC50b1N0cmluZ1RhZyYmY2hlY2tJZmFjZShjYW5kaWRhdGVba2V5XSxjaGVjayl8fFxuKGNhbkJlTWV0aG9kKGNhbmRpZGF0ZVtrZXldKXx8XG5yZWplY3QmJlxucmVqZWN0KFxuWCBgY2Fubm90IHNlcmlhbGl6ZSBSZW1vdGFibGVzIHdpdGggbm9uLW1ldGhvZHMgbGlrZSAke3EoXG5TdHJpbmcoa2V5KSlcbiB9IGluICR7Y2FuZGlkYXRlfWApKSYmKFxuXG5rZXkhPT1QQVNTX1NUWUxFfHxcbnJlamVjdCYmXG5yZWplY3QoWCBgQSBwYXNzLWJ5LXJlbW90ZSBjYW5ub3Qgc2hhZG93ICR7cShQQVNTX1NUWUxFKX1gKSkpKTtcblxuIH0pO1xuIH1lbHNlIGlmKHR5cGVvZiBjYW5kaWRhdGU9PT0nZnVuY3Rpb24nKXtcbi8qIEZhciBmdW5jdGlvbnMgY2Fubm90IGJlIG1ldGhvZHMsIGFuZCBjYW5ub3QgaGF2ZSBtZXRob2RzLiovXG4vKiBUaGV5IG11c3QgaGF2ZSBleGFjdGx5IGV4cGVjdGVkIGAubmFtZWAgYW5kIGAubGVuZ3RoYCBwcm9wZXJ0aWVzKi9cbmNvbnN0e1xubmFtZTpuYW1lRGVzYyxcbmxlbmd0aDpsZW5ndGhEZXNjLFxuLyogQHRzLWlnbm9yZSBUUyBkb2Vzbid0IGxpa2Ugc3ltYm9scyBhcyBjb21wdXRlZCBpbmRleGVzPz8qL1xuW1N5bWJvbC50b1N0cmluZ1RhZ106dG9TdHJpbmdUYWdEZXNjLFxuLi4ucmVzdERlc2NzfT1cbmRlc2NzO1xuY29uc3QgcmVzdEtleXM9b3duS2V5cyhyZXN0RGVzY3MpO1xucmV0dXJuKFxuKG5hbWVEZXNjJiZ0eXBlb2YgbmFtZURlc2MudmFsdWU9PT0nc3RyaW5nJ3x8XG5yZWplY3QmJlxucmVqZWN0KFggYEZhciBmdW5jdGlvbiBuYW1lIG11c3QgYmUgYSBzdHJpbmcsIGluICR7Y2FuZGlkYXRlfWApKSYmKFxubGVuZ3RoRGVzYyYmdHlwZW9mIGxlbmd0aERlc2MudmFsdWU9PT0nbnVtYmVyJ3x8XG5yZWplY3QmJlxucmVqZWN0KFxuWCBgRmFyIGZ1bmN0aW9uIGxlbmd0aCBtdXN0IGJlIGEgbnVtYmVyLCBpbiAke2NhbmRpZGF0ZX1gKSkmJihcblxudG9TdHJpbmdUYWdEZXNjPT09dW5kZWZpbmVkfHxcbih0eXBlb2YgdG9TdHJpbmdUYWdEZXNjLnZhbHVlPT09J3N0cmluZyd8fFxucmVqZWN0JiZcbnJlamVjdChcblggYEZhciBmdW5jdGlvbiBAQHRvU3RyaW5nVGFnIG11c3QgYmUgYSBzdHJpbmcsIGluICR7Y2FuZGlkYXRlfWApKSYmXG5cbmNoZWNrSWZhY2UodG9TdHJpbmdUYWdEZXNjLnZhbHVlLGNoZWNrKSkmJihcbnJlc3RLZXlzLmxlbmd0aD09PTB8fFxucmVqZWN0JiZcbnJlamVjdChcblggYEZhciBmdW5jdGlvbnMgdW5leHBlY3RlZCBwcm9wZXJ0aWVzIGJlc2lkZXMgLm5hbWUgYW5kIC5sZW5ndGggJHtyZXN0S2V5c31gKSkpO1xuXG5cbiB9XG5yZXR1cm4gcmVqZWN0JiZyZWplY3QoWCBgdW5yZWNvZ25pemVkIHR5cGVvZiAke2NhbmRpZGF0ZX1gKTtcbiB9LFxuXG5hc3NlcnRWYWxpZDooY2FuZGlkYXRlKT0+Y2hlY2tSZW1vdGFibGUoY2FuZGlkYXRlLGFzc2VydENoZWNrZXIpLFxuXG5ldmVyeTooX3Bhc3NhYmxlLF9mbik9PnRydWV9KTskaOKAjV9vbmNlLlJlbW90YWJsZUhlbHBlcihSZW1vdGFibGVIZWxwZXIpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImFzc2VydElmYWNlIjpbImFzc2VydElmYWNlIl0sImdldEludGVyZmFjZU9mIjpbImdldEludGVyZmFjZU9mIl0sIlJlbW90YWJsZUhlbHBlciI6WyJSZW1vdGFibGVIZWxwZXIiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAMpuhh5oPAACaDwAAKwAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS43L3NyYy9zYWZlLXByb21pc2UuanN7ImltcG9ydHMiOlsiQGVuZG8vcHJvbWlzZS1raXQiLCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIl0sImV4cG9ydHMiOlsiYXNzZXJ0U2FmZVByb21pc2UiLCJpc1NhZmVQcm9taXNlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGlzUHJvbWlzZSxhc3NlcnRDaGVja2VyLGhhc093blByb3BlcnR5T2Y7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vcHJvbWlzZS1raXRcIiwgW1tcImlzUHJvbWlzZVwiLCBbJGjigI1fYSA9PiAoaXNQcm9taXNlID0gJGjigI1fYSldXV1dLFtcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIiwgWyRo4oCNX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaOKAjV9hKV1dLFtcImhhc093blByb3BlcnR5T2ZcIiwgWyRo4oCNX2EgPT4gKGhhc093blByb3BlcnR5T2YgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuQ2hlY2tlcn0gQ2hlY2tlciAqL1xuXG5jb25zdHtkZXRhaWxzOlgscXVvdGU6cX09YXNzZXJ0O1xuY29uc3R7aXNGcm96ZW4sZ2V0UHJvdG90eXBlT2Z9PU9iamVjdDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5cbi8qKlxuICogQHBhcmFtIHtQcm9taXNlfSBwciBUaGUgdmFsdWUgdG8gZXhhbWluZVxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge3ByIGlzIFByb21pc2V9IFdoZXRoZXIgaXQgaXMgYSBzYWZlIHByb21pc2VcbiAqL1xuY29uc3QgY2hlY2tQcm9taXNlT3duS2V5cz0ocHIsY2hlY2spPT57XG5jb25zdCByZWplY3Q9KGRldGFpbHMpPT5jaGVjayhmYWxzZSxkZXRhaWxzKTtcbmNvbnN0IGtleXM9b3duS2V5cyhwcik7XG5cbmlmKGtleXMubGVuZ3RoPT09MCl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5cbmNvbnN0IHVua25vd25LZXlzPWtleXMuZmlsdGVyKFxuKGtleSk9PnR5cGVvZiBrZXkhPT0nc3ltYm9sJ3x8IWhhc093blByb3BlcnR5T2YoUHJvbWlzZS5wcm90b3R5cGUsa2V5KSk7XG5cblxuaWYodW5rbm93bktleXMubGVuZ3RoIT09MCl7XG5yZXR1cm4gcmVqZWN0KFxuWCBgJHtwcn0gLSBNdXN0IG5vdCBoYXZlIGFueSBvd24gcHJvcGVydGllczogJHtxKHVua25vd25LZXlzKX1gKTtcblxuIH1cblxuLyoqXG4gKiBBdCB0aGUgdGltZSBvZiB0aGlzIHdyaXRpbmcsIE5vZGUncyBhc3luY19ob29rcyBjb250YWlucyB0aGVcbiAqIGZvbGxvd2luZyBjb2RlLCB3aGljaCB3ZSBjYW4gYWxzbyBzYWZlbHkgdG9sZXJhdGVcbiAqXG4gKiBgYGBqc1xuICogZnVuY3Rpb24gZGVzdHJveVRyYWNraW5nKHByb21pc2UsIHBhcmVudCkge1xuICogdHJhY2tQcm9taXNlKHByb21pc2UsIHBhcmVudCk7XG4gKiAgIGNvbnN0IGFzeW5jSWQgPSBwcm9taXNlW2FzeW5jX2lkX3N5bWJvbF07XG4gKiAgIGNvbnN0IGRlc3Ryb3llZCA9IHsgZGVzdHJveWVkOiBmYWxzZSB9O1xuICogICBwcm9taXNlW2Rlc3Ryb3llZFN5bWJvbF0gPSBkZXN0cm95ZWQ7XG4gKiAgIHJlZ2lzdGVyRGVzdHJveUhvb2socHJvbWlzZSwgYXN5bmNJZCwgZGVzdHJveWVkKTtcbiAqIH1cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfHN5bWJvbH0ga2V5XG4gKi9cbmNvbnN0IGNoZWNrU2FmZUFzeW5jSG9va3NLZXk9KGtleSk9PntcbmNvbnN0IHZhbD1wcltrZXldO1xuaWYodmFsPT09dW5kZWZpbmVkfHx0eXBlb2YgdmFsPT09J251bWJlcicpe1xucmV0dXJuIHRydWU7XG4gfVxuaWYoXG50eXBlb2YgdmFsPT09J29iamVjdCcmJlxudmFsIT09bnVsbCYmXG5pc0Zyb3plbih2YWwpJiZcbmdldFByb3RvdHlwZU9mKHZhbCk9PT1PYmplY3QucHJvdG90eXBlKVxue1xuY29uc3Qgc3ViS2V5cz1vd25LZXlzKHZhbCk7XG5pZihzdWJLZXlzLmxlbmd0aD09PTApe1xucmV0dXJuIHRydWU7XG4gfVxuXG5pZihcbnN1YktleXMubGVuZ3RoPT09MSYmXG5zdWJLZXlzWzBdPT09J2Rlc3Ryb3llZCcmJlxudmFsLmRlc3Ryb3llZD09PWZhbHNlKVxue1xucmV0dXJuIHRydWU7XG4gfVxuIH1cbnJldHVybiByZWplY3QoXG5YIGBVbmV4cGVjdGVkIE5vZGUgYXN5bmNfaG9va3MgYWRkaXRpb25zIHRvIHByb21pc2U6ICR7cHJ9LiR7cShcblN0cmluZyhrZXkpKVxuIH0gaXMgJHt2YWx9YCk7XG5cbiB9O1xuXG5yZXR1cm4ga2V5cy5ldmVyeShjaGVja1NhZmVBc3luY0hvb2tzS2V5KTtcbiB9O1xuXG4vKipcbiAqIFVuZGVyIEhhcmRlbmVkIEpTIGEgcHJvbWlzZSBpcyBcInNhZmVcIiBpZiBpdHMgYHRoZW5gIG1ldGhvZCBjYW4gYmUgY2FsbGVkXG4gKiBzeW5jaHJvbm91c2x5IHdpdGhvdXQgZ2l2aW5nIHRoZSBwcm9taXNlIGFuIG9wcG9ydHVuaXR5IGZvciBhXG4gKiByZWVudHJhbmN5IGF0dGFjayBkdXJpbmcgdGhhdCBjYWxsLlxuICpcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvOVxuICogcmFpc2VzIHRoZSBpc3N1ZSBvZiB0ZXN0aW5nIHRoYXQgYSBzcGVjaW1lbiBpcyBhIHNhZmUgcHJvbWlzZVxuICogc3VjaCB0aGF0IHRoZSB0ZXN0IGFsc28gZG9lcyBub3QgZ2l2ZSB0aGUgc3BlY2ltZW4gYVxuICogcmVlbnRyYW5jeSBvcHBvcnR1bml0eS4gVGhhdCBpcyB3ZWxsIGJleW9uZCB0aGUgYW1iaXRpb24gaGVyZS5cbiAqIFRPRE8gVGhvdWdoIGlmIHdlIGZpZ3VyZSBvdXQgYSBuaWNlIHNvbHV0aW9uLCBpdCBtaWdodCBiZSBnb29kIHRvXG4gKiB1c2UgaXQgaGVyZSBhcyB3ZWxsLlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gcHIgVGhlIHZhbHVlIHRvIGV4YW1pbmVcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtwciBpcyBQcm9taXNlfSBXaGV0aGVyIGl0IGlzIGEgc2FmZSBwcm9taXNlXG4gKi9cbmNvbnN0IGNoZWNrU2FmZVByb21pc2U9KHByLGNoZWNrKT0+e1xuY29uc3QgcmVqZWN0PShkZXRhaWxzKT0+Y2hlY2soZmFsc2UsZGV0YWlscyk7XG5yZXR1cm4oXG4oaXNGcm96ZW4ocHIpfHxyZWplY3QoWCBgJHtwcn0gLSBNdXN0IGJlIGZyb3plbmApKSYmKFxuaXNQcm9taXNlKHByKXx8cmVqZWN0KFggYCR7cHJ9IC0gTXVzdCBiZSBhIHByb21pc2VgKSkmJihcbmdldFByb3RvdHlwZU9mKHByKT09PVByb21pc2UucHJvdG90eXBlfHxcbnJlamVjdChcblggYCR7cHJ9IC0gTXVzdCBpbmhlcml0IGZyb20gUHJvbWlzZS5wcm90b3R5cGU6ICR7cShcbmdldFByb3RvdHlwZU9mKHByKSlcbiB9YCkpJiZcblxuY2hlY2tQcm9taXNlT3duS2V5cygvKiogQHR5cGUge1Byb21pc2V9ICovcHIsY2hlY2spKTtcblxuIH07XG5oYXJkZW4oY2hlY2tTYWZlUHJvbWlzZSk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIHRoZSBhcmd1bWVudCBpcyBhIFByb21pc2UuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBwciBUaGUgdmFsdWUgdG8gZXhhbWluZVxuICogQHJldHVybnMge3ByIGlzIFByb21pc2V9IFdoZXRoZXIgaXQgaXMgYSBwcm9taXNlXG4gKi9cbmNvbnN0ICAgICAgICBpc1NhZmVQcm9taXNlPShwcik9PmNoZWNrU2FmZVByb21pc2UocHIsKHgpPT54KTskaOKAjV9vbmNlLmlzU2FmZVByb21pc2UoaXNTYWZlUHJvbWlzZSk7XG5oYXJkZW4oaXNTYWZlUHJvbWlzZSk7XG5cbmNvbnN0ICAgICAgICBhc3NlcnRTYWZlUHJvbWlzZT0ocHIpPT5jaGVja1NhZmVQcm9taXNlKHByLGFzc2VydENoZWNrZXIpOyRo4oCNX29uY2UuYXNzZXJ0U2FmZVByb21pc2UoYXNzZXJ0U2FmZVByb21pc2UpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzU2FmZVByb21pc2UiOlsiaXNTYWZlUHJvbWlzZSJdLCJhc3NlcnRTYWZlUHJvbWlzZSI6WyJhc3NlcnRTYWZlUHJvbWlzZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADHH9VQRxIAAEcSAAAlAAAAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjcvc3JjL3N5bWJvbC5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiYXNzZXJ0UGFzc2FibGVTeW1ib2wiLCJpc1Bhc3NhYmxlU3ltYm9sIiwibmFtZUZvclBhc3NhYmxlU3ltYm9sIiwicGFzc2FibGVTeW1ib2xGb3JOYW1lIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgY29uc3R7RmFpbCxxdW90ZTpxfT1hc3NlcnQ7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuXG4vKipcbiAqIFRoZSB3ZWxsIGtub3duIHN5bWJvbHMgYXJlIHN0YXRpYyBzeW1ib2wgdmFsdWVzIG9uIHRoZSBgU3ltYm9sYCBjb25zdHJ1Y3Rvci5cbiAqL1xuY29uc3Qgd2VsbEtub3duU3ltYm9sTmFtZXM9bmV3IE1hcChcbm93bktleXMoU3ltYm9sKS5cbmZpbHRlcihcbihuYW1lKT0+dHlwZW9mIG5hbWU9PT0nc3RyaW5nJyYmdHlwZW9mIFN5bWJvbFtuYW1lXT09PSdzeW1ib2wnKS5cblxuZmlsdGVyKChuYW1lKT0+e1xuLyogQHRzLWV4cGVjdC1lcnJvciBJdCBkb2Vzbid0IGtub3cgbmFtZSBjYW5ub3QgYmUgYSBzeW1ib2wqL1xuIW5hbWUuc3RhcnRzV2l0aCgnQEAnKXx8XG5GYWlsIGBEaWQgbm90IGV4cGVjdCBTeW1ib2wgdG8gaGF2ZSBhIHN5bWJvbC12YWx1ZWQgcHJvcGVydHkgbmFtZSBzdGFydGluZyB3aXRoIFwiQEBcIiAke3EoXG5uYW1lKVxuIH1gO1xucmV0dXJuIHRydWU7XG4gfSlcbi8qIEB0cy1pZ25vcmUgSXQgZG9lc24ndCBrbm93IG5hbWUgY2Fubm90IGJlIGEgc3ltYm9sKi8uXG5tYXAoKG5hbWUpPT5bU3ltYm9sW25hbWVdLCBgQEAke25hbWV9YF0pKTtcblxuXG4vKipcbiAqIFRoZSBwYXNzYWJsZSBzeW1ib2xzIGFyZSB0aGUgd2VsbCBrbm93biBzeW1ib2xzICh0aGUgc3ltYm9sIHZhbHVlc1xuICogb2Ygc3RhdGljIHByb3BlcnRpZXMgb2YgdGhlIGBTeW1ib2xgIGNvbnN0cnVjdG9yKSBhbmQgdGhlIHJlZ2lzdGVyZWRcbiAqIHN5bWJvbHMuXG4gKlxuICogQHBhcmFtIHthbnl9IHN5bVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0ICAgICAgICBpc1Bhc3NhYmxlU3ltYm9sPShzeW0pPT5cbnR5cGVvZiBzeW09PT0nc3ltYm9sJyYmKFxudHlwZW9mIFN5bWJvbC5rZXlGb3Ioc3ltKT09PSdzdHJpbmcnfHx3ZWxsS25vd25TeW1ib2xOYW1lcy5oYXMoc3ltKSk7JGjigI1fb25jZS5pc1Bhc3NhYmxlU3ltYm9sKGlzUGFzc2FibGVTeW1ib2wpO1xuaGFyZGVuKGlzUGFzc2FibGVTeW1ib2wpO1xuXG5jb25zdCAgICAgICAgYXNzZXJ0UGFzc2FibGVTeW1ib2w9KHN5bSk9PlxuaXNQYXNzYWJsZVN5bWJvbChzeW0pfHxcbkZhaWwgYE9ubHkgcmVnaXN0ZXJlZCBzeW1ib2xzIG9yIHdlbGwta25vd24gc3ltYm9scyBhcmUgcGFzc2FibGU6ICR7cShzeW0pfWA7JGjigI1fb25jZS5hc3NlcnRQYXNzYWJsZVN5bWJvbChhc3NlcnRQYXNzYWJsZVN5bWJvbCk7XG5oYXJkZW4oYXNzZXJ0UGFzc2FibGVTeW1ib2wpO1xuXG4vKipcbiAqIElmIGBzeW1gIGlzIGEgcGFzc2FibGUgc3ltYm9sLCByZXR1cm4gYSBzdHJpbmcgdGhhdCB1bmlxdWVseSBpZGVudGlmaWVzIHRoaXNcbiAqIHN5bWJvbC4gSWYgYHN5bWAgaXMgYSBub24tcGFzc2FibGUgc3ltYm9sLCByZXR1cm4gYHVuZGVmaW5lZGAuXG4gKlxuICogVGhlIHBhc3NhYmxlIHN5bWJvbHMgYXJlIHRoZSB3ZWxsIGtub3duIHN5bWJvbHMgKHRoZSBzeW1ib2wgdmFsdWVzXG4gKiBvZiBzdGF0aWMgcHJvcGVydGllcyBvZiB0aGUgYFN5bWJvbGAgY29uc3RydWN0b3IpIGFuZCB0aGUgcmVnaXN0ZXJlZFxuICogc3ltYm9scy4gU2luY2UgdGhlIHJlZ2lzdHJhdGlvbiBzdHJpbmcgb2YgYSByZWdpc3RlcmVkIHN5bWJvbCBjYW4gYmUgYW55XG4gKiBzdHJpbmcsIGlmIHdlIHNpbXBseSB1c2VkIHRoYXQgdG8gaWRlbnRpZnkgdGhvc2Ugc3ltYm9scywgdGhlcmUgd291bGQgbm90XG4gKiBiZSBhbnkgcmVtYWluaW5nIHN0cmluZ3MgbGVmdCBvdmVyIHRvIGlkZW50aWZ5IHRoZSB3ZWxsLWtub3duIHN5bWJvbHMuXG4gKiBJbnN0ZWFkLCB3ZSByZXNlcnZlIHN0cmluZ3MgYmVnaW5uaW5nIHdpdGggYFwiQEBcImAgZm9yIHB1cnBvc2VzIG9mIHRoaXNcbiAqIGVuY29kaW5nLiBXZSBpZGVudGlmeSBhIHdlbGwga25vd24gc3ltYm9sIHN1Y2ggYXMgYFN5bWJvbC5pdGVyYXRvcmBcbiAqIGJ5IHByZWZpeGluZyB0aGUgcHJvcGVydHkgbmFtZSB3aXRoIGBcIkBAXCJgLCBzdWNoIGFzIGBcIkBAaXRlcmF0b3JcImAuXG4gKiBGb3IgcmVnaXN0ZXJlZCBzeW1ib2xzIHdob3NlIG5hbWUgaGFwcGVucyB0byBiZWdpbiB3aXRoIGBcIkBAXCJgLCBzdWNoXG4gKiBhcyBgU3ltYm9sLmZvcignQEBpdGVyYXRvcicpYCBvciBgU3ltYm9sLmZvcignQEBmb28nKWAsIHdlIGlkZW50aWZ5XG4gKiB0aGVtIGJ5IHByZWZpeGluZyB0aGVtIHdpdGggYW4gZXh0cmEgYFwiQEBcImAsIHN1Y2ggYXNcbiAqIGBcIkBAQEBpdGVyYXRvclwiYCBvciBgXCJAQEBAZm9vXCJgLiAoVGhpcyBpcyB0aGUgSGlsYmVydCBIb3RlbCBlbmNvZGluZ1xuICogdGVjaG5pcXVlLilcbiAqXG4gKiBAcGFyYW0ge3N5bWJvbH0gc3ltXG4gKiBAcmV0dXJucyB7c3RyaW5nPX1cbiAqL1xuY29uc3QgICAgICAgIG5hbWVGb3JQYXNzYWJsZVN5bWJvbD0oc3ltKT0+e1xuY29uc3QgbmFtZT1TeW1ib2wua2V5Rm9yKHN5bSk7XG5pZihuYW1lPT09dW5kZWZpbmVkKXtcbnJldHVybiB3ZWxsS25vd25TeW1ib2xOYW1lcy5nZXQoc3ltKTtcbiB9XG5pZihuYW1lLnN0YXJ0c1dpdGgoJ0BAJykpe1xucmV0dXJuIGBAQCR7bmFtZX1gO1xuIH1cbnJldHVybiBuYW1lO1xuIH07JGjigI1fb25jZS5uYW1lRm9yUGFzc2FibGVTeW1ib2wobmFtZUZvclBhc3NhYmxlU3ltYm9sKTtcbmhhcmRlbihuYW1lRm9yUGFzc2FibGVTeW1ib2wpO1xuXG5jb25zdCBBdEF0UHJlZml4UGF0dGVybj0vXkBAKC4qKSQvO1xuaGFyZGVuKEF0QXRQcmVmaXhQYXR0ZXJuKTtcblxuLyoqXG4gKiBJZiBgbmFtZWAgaXMgYSBzdHJpbmcgdGhhdCBjb3VsZCBoYXZlIGJlZW4gcHJvZHVjZWQgYnlcbiAqIGBuYW1lRm9yUGFzc2FibGVTeW1ib2xgLCByZXR1cm4gdGhlIHN5bWJvbCBhcmd1bWVudCBpdCB3YXMgcHJvZHVjZWQgdG9cbiAqIHJlcHJlc2VudC5cbiAqXG4gKiAgICBJZiBgbmFtZWAgZG9lcyBub3QgYmVnaW4gd2l0aCBgXCJAQFwiYCwgdGhlbiBqdXN0IHRoZSBjb3JyZXNwb25kaW5nXG4gKiAgICAgIHJlZ2lzdGVyZWQgc3ltYm9sLCBgU3ltYm9sLmZvcihuYW1lKWAuXG4gKiAgICBJZiBgbmFtZWAgaXMgYFwiQEBcImAgZm9sbG93ZWQgYnkgYSB3ZWxsIGtub3duIHN5bWJvbCdzIHByb3BlcnR5IG5hbWUgb25cbiAqICAgICAgYFN5bWJvbGAgc3VjaCBgXCJAQGl0ZXJhdG9yXCIsIHJldHVybiB0aGF0IHdlbGwga25vd24gc3ltYm9sIHN1Y2ggYXNcbiAqICAgICAgYFN5bWJvbC5pdGVyYXRvcmBcbiAqICAgIElmIGBuYW1lYCBiZWdpbnMgd2l0aCBgXCJAQEBAXCJgIGl0IGVuY29kZXMgdGhlIHJlZ2lzdGVyZWQgc3ltYm9sIHdob3NlXG4gKiAgICAgIG5hbWUgYmVnaW5zIHdpdGggYFwiQEBcImAgaW5zdGVhZC5cbiAqICAgIE90aGVyd2lzZSwgaWYgbmFtZSBiZWdpbnMgd2l0aCBgXCJAQFwiYCBpdCBtYXkgZW5jb2RlIGEgcmVnaXN0ZXJlZCBzeW1ib2xcbiAqICAgICAgZnJvbSBhIGZ1dHVyZSB2ZXJzaW9uIG9mIEphdmFTY3JpcHQsIGJ1dCBpdCBpcyBub3Qgb25lIHdlIGNhbiBkZWNvZGVcbiAqICAgICAgeWV0LCBzbyB0aHJvdy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHJldHVybnMge3N5bWJvbD19XG4gKi9cbmNvbnN0ICAgICAgICBwYXNzYWJsZVN5bWJvbEZvck5hbWU9KG5hbWUpPT57XG5pZih0eXBlb2YgbmFtZSE9PSdzdHJpbmcnKXtcbnJldHVybiB1bmRlZmluZWQ7XG4gfVxuY29uc3QgbWF0Y2g9QXRBdFByZWZpeFBhdHRlcm4uZXhlYyhuYW1lKTtcbmlmKG1hdGNoKXtcbmNvbnN0IHN1ZmZpeD1tYXRjaFsxXTtcbmlmKHN1ZmZpeC5zdGFydHNXaXRoKCdAQCcpKXtcbnJldHVybiBTeW1ib2wuZm9yKHN1ZmZpeCk7XG4gfWVsc2V7XG5jb25zdCBzeW09U3ltYm9sW3N1ZmZpeF07XG5pZih0eXBlb2Ygc3ltPT09J3N5bWJvbCcpe1xucmV0dXJuIHN5bTtcbiB9XG5GYWlsIGBSZXNlcnZlZCBmb3Igd2VsbCBrbm93biBzeW1ib2wgJHtxKHN1ZmZpeCl9OiAke3EobmFtZSl9YDtcbiB9XG4gfVxucmV0dXJuIFN5bWJvbC5mb3IobmFtZSk7XG4gfTskaOKAjV9vbmNlLnBhc3NhYmxlU3ltYm9sRm9yTmFtZShwYXNzYWJsZVN5bWJvbEZvck5hbWUpO1xuaGFyZGVuKHBhc3NhYmxlU3ltYm9sRm9yTmFtZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaXNQYXNzYWJsZVN5bWJvbCI6WyJpc1Bhc3NhYmxlU3ltYm9sIl0sImFzc2VydFBhc3NhYmxlU3ltYm9sIjpbImFzc2VydFBhc3NhYmxlU3ltYm9sIl0sIm5hbWVGb3JQYXNzYWJsZVN5bWJvbCI6WyJuYW1lRm9yUGFzc2FibGVTeW1ib2wiXSwicGFzc2FibGVTeW1ib2xGb3JOYW1lIjpbInBhc3NhYmxlU3ltYm9sRm9yTmFtZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAlvFz7/QcAAP0HAAAlAAAAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjcvc3JjL3RhZ2dlZC5qc3siaW1wb3J0cyI6WyIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIl0sImV4cG9ydHMiOlsiVGFnZ2VkSGVscGVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydENoZWNrZXIsY2hlY2tUYWdSZWNvcmQsUEFTU19TVFlMRSxjaGVja05vcm1hbFByb3BlcnR5LGNoZWNrUGFzc1N0eWxlOyRo4oCNX2ltcG9ydHMoW1tcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIiwgWyRo4oCNX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaOKAjV9hKV1dLFtcImNoZWNrVGFnUmVjb3JkXCIsIFskaOKAjV9hID0+IChjaGVja1RhZ1JlY29yZCA9ICRo4oCNX2EpXV0sW1wiUEFTU19TVFlMRVwiLCBbJGjigI1fYSA9PiAoUEFTU19TVFlMRSA9ICRo4oCNX2EpXV0sW1wiY2hlY2tOb3JtYWxQcm9wZXJ0eVwiLCBbJGjigI1fYSA9PiAoY2hlY2tOb3JtYWxQcm9wZXJ0eSA9ICRo4oCNX2EpXV0sW1wiY2hlY2tQYXNzU3R5bGVcIiwgWyRo4oCNX2EgPT4gKGNoZWNrUGFzc1N0eWxlID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5jb25zdHtGYWlsfT1hc3NlcnQ7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuY29uc3R7Z2V0T3duUHJvcGVydHlEZXNjcmlwdG9yc309T2JqZWN0O1xuXG4vKipcbiAqXG4gKiBAdHlwZSB7WGltcG9ydCgnLi9pbnRlcm5hbC10eXBlcy5qcycpLlBhc3NTdHlsZUhlbHBlcn1cbiAqL1xuY29uc3QgICAgICAgIFRhZ2dlZEhlbHBlcj1oYXJkZW4oe1xuc3R5bGVOYW1lOid0YWdnZWQnLFxuXG5jYW5CZVZhbGlkOihjYW5kaWRhdGUsY2hlY2s9dW5kZWZpbmVkKT0+XG5jaGVja1Bhc3NTdHlsZShjYW5kaWRhdGUsJ3RhZ2dlZCcsY2hlY2spLFxuXG5hc3NlcnRWYWxpZDooY2FuZGlkYXRlLHBhc3NTdHlsZU9mUmVjdXIpPT57XG5jaGVja1RhZ1JlY29yZChjYW5kaWRhdGUsJ3RhZ2dlZCcsYXNzZXJ0Q2hlY2tlcik7XG5cbi8qIFR5cGVjYXN0cyBuZWVkZWQgZHVlIHRvIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvMTg2MyovXG5jb25zdCBwYXNzU3R5bGVLZXk9LyoqIEB0eXBlIHt1bmtub3dufSAqL1BBU1NfU1RZTEU7XG5jb25zdCB0YWdLZXk9LyoqIEB0eXBlIHt1bmtub3dufSAqL1N5bWJvbC50b1N0cmluZ1RhZztcbmNvbnN0e1xuLyogY2hlY2tUYWdSZWNvcmQgYWxyZWFkeSB2ZXJpZmllZCBQQVNTX1NUWUxFIGFuZCBTeW1ib2wudG9TdHJpbmdUYWcgb3duIGRhdGEgcHJvcGVydGllcy4qL1xuWy8qKiBAdHlwZSB7c3RyaW5nfSAqL3Bhc3NTdHlsZUtleV06X3Bhc3NTdHlsZURlc2MsXG5bLyoqIEB0eXBlIHtzdHJpbmd9ICovdGFnS2V5XTpfbGFiZWxEZXNjLFxucGF5bG9hZDpfcGF5bG9hZERlc2MsLyogdmFsdWUgY2hlY2tlZCBieSByZWN1cnNpdmUgd2FsayBhdCB0aGUgZW5kKi9cbi4uLnJlc3REZXNjc309XG5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKGNhbmRpZGF0ZSk7XG5vd25LZXlzKHJlc3REZXNjcykubGVuZ3RoPT09MHx8XG5GYWlsIGBVbmV4cGVjdGVkIHByb3BlcnRpZXMgb24gdGFnZ2VkIHJlY29yZCAke293bktleXMocmVzdERlc2NzKX1gO1xuXG5jaGVja05vcm1hbFByb3BlcnR5KGNhbmRpZGF0ZSwncGF5bG9hZCcsdHJ1ZSxhc3NlcnRDaGVja2VyKTtcblxuLyogUmVjdXJzaXZlbHkgdmFsaWRhdGUgdGhhdCBlYWNoIG1lbWJlciBpcyBwYXNzYWJsZS4qL1xucGFzc1N0eWxlT2ZSZWN1cihjYW5kaWRhdGUucGF5bG9hZCk7XG4gfX0pOyRo4oCNX29uY2UuVGFnZ2VkSGVscGVyKFRhZ2dlZEhlbHBlcik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiVGFnZ2VkSGVscGVyIjpbIlRhZ2dlZEhlbHBlciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB6oH5oEg0AABINAAApAAAAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjcvc3JjL3R5cGVHdWFyZHMuanN7ImltcG9ydHMiOlsiLi9wYXNzU3R5bGVPZi5qcyJdLCJleHBvcnRzIjpbImFzc2VydENvcHlBcnJheSIsImFzc2VydFJlY29yZCIsImFzc2VydFJlbW90YWJsZSIsImlzQ29weUFycmF5IiwiaXNSZWNvcmQiLCJpc1JlbW90YWJsZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBwYXNzU3R5bGVPZjskaOKAjV9pbXBvcnRzKFtbXCIuL3Bhc3NTdHlsZU9mLmpzXCIsIFtbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlT2YgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUGFzc2FibGV9IFBhc3NhYmxlICovXG4vKiogQHRlbXBsYXRlIFQgQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5Db3B5QXJyYXk8VD59IENvcHlBcnJheSAqL1xuLyoqIEB0ZW1wbGF0ZSBUIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuQ29weVJlY29yZDxUPn0gQ29weVJlY29yZCAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUmVtb3RhYmxlT2JqZWN0fSBSZW1vdGFibGUgKi9cblxuY29uc3R7RmFpbCxxdW90ZTpxfT1hc3NlcnQ7XG5cbi8qKlxuICogQ2hlY2sgd2hldGhlciB0aGUgYXJndW1lbnQgaXMgYSBwYXNzLWJ5LWNvcHkgYXJyYXksIEFLQSBhIFwiY29weUFycmF5XCJcbiAqIGluIEBlbmRvL21hcnNoYWwgdGVybXNcbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBhcnJcbiAqIEByZXR1cm5zIHthcnIgaXMgQ29weUFycmF5PGFueT59XG4gKi9cbmNvbnN0IGlzQ29weUFycmF5PShhcnIpPT5wYXNzU3R5bGVPZihhcnIpPT09J2NvcHlBcnJheSc7JGjigI1fb25jZS5pc0NvcHlBcnJheShpc0NvcHlBcnJheSk7XG5oYXJkZW4oaXNDb3B5QXJyYXkpO1xuXG4vKipcbiAqIENoZWNrIHdoZXRoZXIgdGhlIGFyZ3VtZW50IGlzIGEgcGFzcy1ieS1jb3B5IHJlY29yZCwgQUtBIGFcbiAqIFwiY29weVJlY29yZFwiIGluIEBlbmRvL21hcnNoYWwgdGVybXNcbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSByZWNvcmRcbiAqIEByZXR1cm5zIHtyZWNvcmQgaXMgQ29weVJlY29yZDxhbnk+fVxuICovXG5jb25zdCBpc1JlY29yZD0ocmVjb3JkKT0+cGFzc1N0eWxlT2YocmVjb3JkKT09PSdjb3B5UmVjb3JkJzskaOKAjV9vbmNlLmlzUmVjb3JkKGlzUmVjb3JkKTtcbmhhcmRlbihpc1JlY29yZCk7XG5cbi8qKlxuICogQ2hlY2sgd2hldGhlciB0aGUgYXJndW1lbnQgaXMgYSByZW1vdGFibGUuXG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gcmVtb3RhYmxlXG4gKiBAcmV0dXJucyB7cmVtb3RhYmxlIGlzIFJlbW90YWJsZX1cbiAqL1xuY29uc3QgaXNSZW1vdGFibGU9KHJlbW90YWJsZSk9PnBhc3NTdHlsZU9mKHJlbW90YWJsZSk9PT0ncmVtb3RhYmxlJzskaOKAjV9vbmNlLmlzUmVtb3RhYmxlKGlzUmVtb3RhYmxlKTtcbmhhcmRlbihpc1JlbW90YWJsZSk7XG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydEFycmF5XG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBhcnJheVxuICogQHBhcmFtIHtzdHJpbmc9fSBvcHROYW1lT2ZBcnJheVxuICogQHJldHVybnMge2Fzc2VydHMgYXJyYXkgaXMgQ29weUFycmF5PGFueT59XG4gKi9cblxuLyoqIEB0eXBlIHtBc3NlcnRBcnJheX0gKi9cbmNvbnN0IGFzc2VydENvcHlBcnJheT0oYXJyYXksb3B0TmFtZU9mQXJyYXk9J0FsbGVnZWQgYXJyYXknKT0+e1xuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKGFycmF5KTtcbnBhc3NTdHlsZT09PSdjb3B5QXJyYXknfHxcbkZhaWwgYCR7cShvcHROYW1lT2ZBcnJheSl9ICR7YXJyYXl9IG11c3QgYmUgYSBwYXNzLWJ5LWNvcHkgYXJyYXksIG5vdCAke3EoXG5wYXNzU3R5bGUpXG4gfWA7XG4gfTskaOKAjV9vbmNlLmFzc2VydENvcHlBcnJheShhc3NlcnRDb3B5QXJyYXkpO1xuaGFyZGVuKGFzc2VydENvcHlBcnJheSk7XG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydFJlY29yZFxuICogQHBhcmFtIHtQYXNzYWJsZX0gcmVjb3JkXG4gKiBAcGFyYW0ge3N0cmluZz19IG9wdE5hbWVPZlJlY29yZFxuICogQHJldHVybnMge2Fzc2VydHMgcmVjb3JkIGlzIENvcHlSZWNvcmQ8YW55Pn1cbiAqL1xuXG4vKiogQHR5cGUge0Fzc2VydFJlY29yZH0gKi9cbmNvbnN0IGFzc2VydFJlY29yZD0ocmVjb3JkLG9wdE5hbWVPZlJlY29yZD0nQWxsZWdlZCByZWNvcmQnKT0+e1xuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHJlY29yZCk7XG5wYXNzU3R5bGU9PT0nY29weVJlY29yZCd8fFxuRmFpbCBgJHtxKG9wdE5hbWVPZlJlY29yZCl9ICR7cmVjb3JkfSBtdXN0IGJlIGEgcGFzcy1ieS1jb3B5IHJlY29yZCwgbm90ICR7cShcbnBhc3NTdHlsZSlcbiB9YDtcbiB9OyRo4oCNX29uY2UuYXNzZXJ0UmVjb3JkKGFzc2VydFJlY29yZCk7XG5oYXJkZW4oYXNzZXJ0UmVjb3JkKTtcblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0UmVtb3RhYmxlXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSByZW1vdGFibGVcbiAqIEBwYXJhbSB7c3RyaW5nPX0gb3B0TmFtZU9mUmVtb3RhYmxlXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyByZW1vdGFibGUgaXMgUmVtb3RhYmxlfVxuICovXG5cbi8qKiBAdHlwZSB7QXNzZXJ0UmVtb3RhYmxlfSAqL1xuY29uc3QgYXNzZXJ0UmVtb3RhYmxlPShcbnJlbW90YWJsZSxcbm9wdE5hbWVPZlJlbW90YWJsZT0nQWxsZWdlZCByZW1vdGFibGUnKT0+XG57XG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YocmVtb3RhYmxlKTtcbnBhc3NTdHlsZT09PSdyZW1vdGFibGUnfHxcbkZhaWwgYCR7cShvcHROYW1lT2ZSZW1vdGFibGUpfSAke3JlbW90YWJsZX0gbXVzdCBiZSBhIHJlbW90YWJsZSwgbm90ICR7cShcbnBhc3NTdHlsZSlcbiB9YDtcbiB9OyRo4oCNX29uY2UuYXNzZXJ0UmVtb3RhYmxlKGFzc2VydFJlbW90YWJsZSk7XG5oYXJkZW4oYXNzZXJ0UmVtb3RhYmxlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc0NvcHlBcnJheSI6WyJpc0NvcHlBcnJheSJdLCJpc1JlY29yZCI6WyJpc1JlY29yZCJdLCJpc1JlbW90YWJsZSI6WyJpc1JlbW90YWJsZSJdLCJhc3NlcnRDb3B5QXJyYXkiOlsiYXNzZXJ0Q29weUFycmF5Il0sImFzc2VydFJlY29yZCI6WyJhc3NlcnRSZWNvcmQiXSwiYXNzZXJ0UmVtb3RhYmxlIjpbImFzc2VydFJlbW90YWJsZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACYGTuzNAEAADQBAAAkAAAAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjcvc3JjL3R5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAIcVXWgeDQAAHg0AAB4AAABAZW5kby9wYXR0ZXJucy12MC4yLjYvaW5kZXguanN7ImltcG9ydHMiOlsiLi9zcmMva2V5cy9jaGVja0tleS5qcyIsIi4vc3JjL2tleXMvY29weVNldC5qcyIsIi4vc3JjL2tleXMvY29weUJhZy5qcyIsIi4vc3JjL2tleXMvY29tcGFyZUtleXMuanMiLCIuL3NyYy9rZXlzL21lcmdlLXNldC1vcGVyYXRvcnMuanMiLCIuL3NyYy9rZXlzL21lcmdlLWJhZy1vcGVyYXRvcnMuanMiLCIuL3NyYy9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanMiLCIuL3NyYy91dGlscy5qcyIsIi4vc3JjL3R5cGVzLmpzIl0sImV4cG9ydHMiOlsiYXNzZXJ0S2V5IiwiYXNzZXJ0S2V5IiwiYmFnVW5pb24iLCJiYWdVbmlvbiIsImVsZW1lbnRzSXNEaXNqb2ludCIsImVsZW1lbnRzSXNEaXNqb2ludCIsImdldFJhbmtDb3ZlciIsImdldFJhbmtDb3ZlciIsIm9iamVjdE1hcCIsIm9iamVjdE1hcCIsInNldENvbXBhcmUiLCJzZXRDb21wYXJlIixudWxsLG51bGxdLCJyZWV4cG9ydHMiOlsiLi9zcmMvdHlwZXMuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL3NyYy9rZXlzL2NoZWNrS2V5LmpzXCIsIFtdXSxbXCIuL3NyYy9rZXlzL2NvcHlTZXQuanNcIiwgW11dLFtcIi4vc3JjL2tleXMvY29weUJhZy5qc1wiLCBbXV0sW1wiLi9zcmMva2V5cy9jb21wYXJlS2V5cy5qc1wiLCBbXV0sW1wiLi9zcmMva2V5cy9tZXJnZS1zZXQtb3BlcmF0b3JzLmpzXCIsIFtdXSxbXCIuL3NyYy9rZXlzL21lcmdlLWJhZy1vcGVyYXRvcnMuanNcIiwgW11dLFtcIi4vc3JjL3BhdHRlcm5zL3BhdHRlcm5NYXRjaGVycy5qc1wiLCBbXV0sW1wiLi9zcmMvdXRpbHMuanNcIiwgW11dLFtcIi4vc3JjL3R5cGVzLmpzXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7Ii4vc3JjL2tleXMvY2hlY2tLZXkuanMiOltbImlzS2V5IiwiaXNLZXkiXSxbImFzc2VydEtleSIsImFzc2VydEtleSJdLFsiYXNzZXJ0U2NhbGFyS2V5IiwiYXNzZXJ0U2NhbGFyS2V5Il0sWyJpc0NvcHlTZXQiLCJpc0NvcHlTZXQiXSxbImFzc2VydENvcHlTZXQiLCJhc3NlcnRDb3B5U2V0Il0sWyJtYWtlQ29weVNldCIsIm1ha2VDb3B5U2V0Il0sWyJnZXRDb3B5U2V0S2V5cyIsImdldENvcHlTZXRLZXlzIl0sWyJpc0NvcHlCYWciLCJpc0NvcHlCYWciXSxbImFzc2VydENvcHlCYWciLCJhc3NlcnRDb3B5QmFnIl0sWyJtYWtlQ29weUJhZyIsIm1ha2VDb3B5QmFnIl0sWyJtYWtlQ29weUJhZ0Zyb21FbGVtZW50cyIsIm1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzIl0sWyJnZXRDb3B5QmFnRW50cmllcyIsImdldENvcHlCYWdFbnRyaWVzIl0sWyJpc0NvcHlNYXAiLCJpc0NvcHlNYXAiXSxbImFzc2VydENvcHlNYXAiLCJhc3NlcnRDb3B5TWFwIl0sWyJtYWtlQ29weU1hcCIsIm1ha2VDb3B5TWFwIl0sWyJnZXRDb3B5TWFwRW50cmllcyIsImdldENvcHlNYXBFbnRyaWVzIl1dLCIuL3NyYy9rZXlzL2NvcHlTZXQuanMiOltbImNvZXJjZVRvRWxlbWVudHMiLCJjb2VyY2VUb0VsZW1lbnRzIl1dLCIuL3NyYy9rZXlzL2NvcHlCYWcuanMiOltbImNvZXJjZVRvQmFnRW50cmllcyIsImNvZXJjZVRvQmFnRW50cmllcyJdXSwiLi9zcmMva2V5cy9jb21wYXJlS2V5cy5qcyI6W1siYmFnQ29tcGFyZSIsImJhZ0NvbXBhcmUiXSxbInNldENvbXBhcmUiLCJzZXRDb21wYXJlIl0sWyJjb21wYXJlS2V5cyIsImNvbXBhcmVLZXlzIl0sWyJrZXlMVCIsImtleUxUIl0sWyJrZXlMVEUiLCJrZXlMVEUiXSxbImtleUVRIiwia2V5RVEiXSxbImtleUdURSIsImtleUdURSJdLFsia2V5R1QiLCJrZXlHVCJdXSwiLi9zcmMva2V5cy9tZXJnZS1zZXQtb3BlcmF0b3JzLmpzIjpbWyJlbGVtZW50c0lzU3VwZXJzZXQiLCJlbGVtZW50c0lzU3VwZXJzZXQiXSxbImVsZW1lbnRzSXNEaXNqb2ludCIsImVsZW1lbnRzSXNEaXNqb2ludCJdLFsiZWxlbWVudHNDb21wYXJlIiwiZWxlbWVudHNDb21wYXJlIl0sWyJlbGVtZW50c1VuaW9uIiwiZWxlbWVudHNVbmlvbiJdLFsiZWxlbWVudHNEaXNqb2ludFVuaW9uIiwiZWxlbWVudHNEaXNqb2ludFVuaW9uIl0sWyJlbGVtZW50c0ludGVyc2VjdGlvbiIsImVsZW1lbnRzSW50ZXJzZWN0aW9uIl0sWyJlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QiLCJlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QiXSxbInNldElzU3VwZXJzZXQiLCJzZXRJc1N1cGVyc2V0Il0sWyJzZXRJc0Rpc2pvaW50Iiwic2V0SXNEaXNqb2ludCJdLFsic2V0VW5pb24iLCJzZXRVbmlvbiJdLFsic2V0RGlzam9pbnRVbmlvbiIsInNldERpc2pvaW50VW5pb24iXSxbInNldEludGVyc2VjdGlvbiIsInNldEludGVyc2VjdGlvbiJdLFsic2V0RGlzam9pbnRTdWJ0cmFjdCIsInNldERpc2pvaW50U3VidHJhY3QiXV0sIi4vc3JjL2tleXMvbWVyZ2UtYmFnLW9wZXJhdG9ycy5qcyI6W1siYmFnSXNTdXBlcmJhZyIsImJhZ0lzU3VwZXJiYWciXSxbImJhZ1VuaW9uIiwiYmFnVW5pb24iXSxbImJhZ0ludGVyc2VjdGlvbiIsImJhZ0ludGVyc2VjdGlvbiJdLFsiYmFnRGlzam9pbnRTdWJ0cmFjdCIsImJhZ0Rpc2pvaW50U3VidHJhY3QiXV0sIi4vc3JjL3BhdHRlcm5zL3BhdHRlcm5NYXRjaGVycy5qcyI6W1siTSIsIk0iXSxbImdldFJhbmtDb3ZlciIsImdldFJhbmtDb3ZlciJdLFsiaXNQYXR0ZXJuIiwiaXNQYXR0ZXJuIl0sWyJhc3NlcnRQYXR0ZXJuIiwiYXNzZXJ0UGF0dGVybiJdLFsibWF0Y2hlcyIsIm1hdGNoZXMiXSxbIm11c3RNYXRjaCIsIm11c3RNYXRjaCJdLFsiaXNBd2FpdEFyZ0d1YXJkIiwiaXNBd2FpdEFyZ0d1YXJkIl0sWyJhc3NlcnRBd2FpdEFyZ0d1YXJkIiwiYXNzZXJ0QXdhaXRBcmdHdWFyZCJdLFsiZ2V0QXdhaXRBcmdHdWFyZFBheWxvYWQiLCJnZXRBd2FpdEFyZ0d1YXJkUGF5bG9hZCJdLFsiYXNzZXJ0TWV0aG9kR3VhcmQiLCJhc3NlcnRNZXRob2RHdWFyZCJdLFsiZ2V0TWV0aG9kR3VhcmRQYXlsb2FkIiwiZ2V0TWV0aG9kR3VhcmRQYXlsb2FkIl0sWyJnZXRJbnRlcmZhY2VNZXRob2RLZXlzIiwiZ2V0SW50ZXJmYWNlTWV0aG9kS2V5cyJdLFsiYXNzZXJ0SW50ZXJmYWNlR3VhcmQiLCJhc3NlcnRJbnRlcmZhY2VHdWFyZCJdLFsiZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkIiwiZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkIl1dLCIuL3NyYy91dGlscy5qcyI6W1sibGlzdERpZmZlcmVuY2UiLCJsaXN0RGlmZmVyZW5jZSJdLFsib2JqZWN0TWFwIiwib2JqZWN0TWFwIl1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAOW3iokkgAAJJIAAAqAAAAQGVuZG8vcGF0dGVybnMtdjAuMi42L3NyYy9rZXlzL2NoZWNrS2V5LmpzeyJpbXBvcnRzIjpbIkBlbmRvL21hcnNoYWwiLCIuLi91dGlscy5qcyIsIi4vY29weVNldC5qcyIsIi4vY29weUJhZy5qcyJdLCJleHBvcnRzIjpbImFzc2VydENvcHlCYWciLCJhc3NlcnRDb3B5TWFwIiwiYXNzZXJ0Q29weVNldCIsImFzc2VydEtleSIsImFzc2VydFByaW1pdGl2ZUtleSIsImFzc2VydFNjYWxhcktleSIsImNoZWNrQ29weUJhZyIsImNoZWNrQ29weU1hcCIsImNoZWNrQ29weVNldCIsImNoZWNrS2V5IiwiY2hlY2tTY2FsYXJLZXkiLCJjb3B5TWFwS2V5U2V0IiwiZXZlcnlDb3B5QmFnRW50cnkiLCJldmVyeUNvcHlNYXBLZXkiLCJldmVyeUNvcHlNYXBWYWx1ZSIsImV2ZXJ5Q29weVNldEtleSIsImdldENvcHlCYWdFbnRyaWVzIiwiZ2V0Q29weU1hcEVudHJpZXMiLCJnZXRDb3B5TWFwRW50cnlBcnJheSIsImdldENvcHlNYXBLZXlzIiwiZ2V0Q29weU1hcFZhbHVlcyIsImdldENvcHlTZXRLZXlzIiwiaXNDb3B5QmFnIiwiaXNDb3B5TWFwIiwiaXNDb3B5U2V0IiwiaXNLZXkiLCJpc1ByaW1pdGl2ZUtleSIsImlzU2NhbGFyS2V5IiwibWFrZUNvcHlCYWciLCJtYWtlQ29weUJhZ0Zyb21FbGVtZW50cyIsIm1ha2VDb3B5TWFwIiwibWFrZUNvcHlTZXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0Q2hlY2tlcixhc3NlcnRQYXNzYWJsZSxGYXIsZ2V0VGFnLGlzT2JqZWN0LG1ha2VUYWdnZWQscGFzc1N0eWxlT2YsY29tcGFyZUFudGlSYW5rLG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0LHNvcnRCeVJhbmssaWRlbnRDaGVja2VyLGNoZWNrRWxlbWVudHMsbWFrZVNldE9mRWxlbWVudHMsY2hlY2tCYWdFbnRyaWVzLG1ha2VCYWdPZkVudHJpZXM7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRo4oCNX2EpXV0sW1wiYXNzZXJ0UGFzc2FibGVcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhc3NhYmxlID0gJGjigI1fYSldXSxbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV0sW1wiZ2V0VGFnXCIsIFskaOKAjV9hID0+IChnZXRUYWcgPSAkaOKAjV9hKV1dLFtcImlzT2JqZWN0XCIsIFskaOKAjV9hID0+IChpc09iamVjdCA9ICRo4oCNX2EpXV0sW1wibWFrZVRhZ2dlZFwiLCBbJGjigI1fYSA9PiAobWFrZVRhZ2dlZCA9ICRo4oCNX2EpXV0sW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXSxbXCJjb21wYXJlQW50aVJhbmtcIiwgWyRo4oCNX2EgPT4gKGNvbXBhcmVBbnRpUmFuayA9ICRo4oCNX2EpXV0sW1wibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0ID0gJGjigI1fYSldXSxbXCJzb3J0QnlSYW5rXCIsIFskaOKAjV9hID0+IChzb3J0QnlSYW5rID0gJGjigI1fYSldXV1dLFtcIi4uL3V0aWxzLmpzXCIsIFtbXCJpZGVudENoZWNrZXJcIiwgWyRo4oCNX2EgPT4gKGlkZW50Q2hlY2tlciA9ICRo4oCNX2EpXV1dXSxbXCIuL2NvcHlTZXQuanNcIiwgW1tcImNoZWNrRWxlbWVudHNcIiwgWyRo4oCNX2EgPT4gKGNoZWNrRWxlbWVudHMgPSAkaOKAjV9hKV1dLFtcIm1ha2VTZXRPZkVsZW1lbnRzXCIsIFskaOKAjV9hID0+IChtYWtlU2V0T2ZFbGVtZW50cyA9ICRo4oCNX2EpXV1dXSxbXCIuL2NvcHlCYWcuanNcIiwgW1tcImNoZWNrQmFnRW50cmllc1wiLCBbJGjigI1fYSA9PiAoY2hlY2tCYWdFbnRyaWVzID0gJGjigI1fYSldXSxbXCJtYWtlQmFnT2ZFbnRyaWVzXCIsIFskaOKAjV9hID0+IChtYWtlQmFnT2ZFbnRyaWVzID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdHtkZXRhaWxzOlgscXVvdGU6cSxGYWlsfT1hc3NlcnQ7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL21hcnNoYWwnKS5DaGVja2VyfSBDaGVja2VyICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL3Bhc3Mtc3R5bGUnKS5QYXNzYWJsZX0gUGFzc2FibGUgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi4vdHlwZXMnKS5LZXlDb21wYXJpc29ufSBLZXlDb21wYXJpc29uICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4uL3R5cGVzJykuS2V5fSBLZXkgKi9cbi8qKiBAdGVtcGxhdGUge0tleX0gW0s9S2V5XSBAdHlwZWRlZiB7WGltcG9ydCgnLi4vdHlwZXMnKS5Db3B5QmFnPEs+fSBDb3B5QmFnICovXG4vKiogQHRlbXBsYXRlIHtLZXl9IFtLPUtleV0gQHR5cGVkZWYge1hpbXBvcnQoJy4uL3R5cGVzJykuQ29weVNldDxLPn0gQ29weVNldCAqL1xuLyoqIEB0ZW1wbGF0ZSB7S2V5fSBbSz1LZXldIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFtWPVBhc3NhYmxlXSBAdHlwZWRlZiB7WGltcG9ydCgnLi4vdHlwZXMnKS5Db3B5TWFwPEssIFY+fSBDb3B5TWFwICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4uL3R5cGVzJykuS2V5Q29tcGFyZX0gS2V5Q29tcGFyZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuLi90eXBlcycpLkZ1bGxDb21wYXJlfSBGdWxsQ29tcGFyZSAqL1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8gUHJpbWl0aXZlIGFuZCBTY2FsYXIga2V5cyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gdmFsXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tQcmltaXRpdmVLZXk9KHZhbCxjaGVjayk9PntcbmlmKGlzT2JqZWN0KHZhbCkpe1xucmV0dXJuKFxuY2hlY2shPT1pZGVudENoZWNrZXImJlxuY2hlY2soZmFsc2UsWCBgQSAke3EodHlwZW9mIHZhbCl9IGNhbm5vdCBiZSBhIHByaW1pdGl2ZTogJHt2YWx9YCkpO1xuXG4gfVxuLyogVE9ETyBUaGVyZSBpcyBub3QgeWV0IGEgY2hlY2tQYXNzYWJsZSwgYnV0IHBlcmhhcHMgdGhlcmUgc2hvdWxkIGJlLiovXG4vKiBJZiB0aGF0IGhhcHBlbnMsIHdlIHNob3VsZCBjYWxsIGl0IGhlcmUgaW5zdGVhZC4qL1xuYXNzZXJ0UGFzc2FibGUodmFsKTtcbnJldHVybiB0cnVlO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gdmFsXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgICAgICAgIGlzUHJpbWl0aXZlS2V5PSh2YWwpPT5jaGVja1ByaW1pdGl2ZUtleSh2YWwsaWRlbnRDaGVja2VyKTskaOKAjV9vbmNlLmlzUHJpbWl0aXZlS2V5KGlzUHJpbWl0aXZlS2V5KTtcbmhhcmRlbihpc1ByaW1pdGl2ZUtleSk7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gdmFsXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuY29uc3QgICAgICAgIGFzc2VydFByaW1pdGl2ZUtleT0odmFsKT0+e1xuY2hlY2tQcmltaXRpdmVLZXkodmFsLGFzc2VydENoZWNrZXIpO1xuIH07JGjigI1fb25jZS5hc3NlcnRQcmltaXRpdmVLZXkoYXNzZXJ0UHJpbWl0aXZlS2V5KTtcbmhhcmRlbihhc3NlcnRQcmltaXRpdmVLZXkpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHZhbFxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0ICAgICAgICBjaGVja1NjYWxhcktleT0odmFsLGNoZWNrKT0+e1xuaWYoaXNQcmltaXRpdmVLZXkodmFsKSl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YodmFsKTtcbmlmKHBhc3NTdHlsZT09PSdyZW1vdGFibGUnKXtcbnJldHVybiB0cnVlO1xuIH1cbnJldHVybiBjaGVjayhmYWxzZSxYIGBBICR7cShwYXNzU3R5bGUpfSBjYW5ub3QgYmUgYSBzY2FsYXIga2V5OiAke3ZhbH1gKTtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHZhbFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi8kaOKAjV9vbmNlLmNoZWNrU2NhbGFyS2V5KGNoZWNrU2NhbGFyS2V5KTtcbmNvbnN0ICAgICAgICBpc1NjYWxhcktleT0odmFsKT0+Y2hlY2tTY2FsYXJLZXkodmFsLGlkZW50Q2hlY2tlcik7JGjigI1fb25jZS5pc1NjYWxhcktleShpc1NjYWxhcktleSk7XG5oYXJkZW4oaXNTY2FsYXJLZXkpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHZhbFxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmNvbnN0ICAgICAgICBhc3NlcnRTY2FsYXJLZXk9KHZhbCk9PntcbmNoZWNrU2NhbGFyS2V5KHZhbCxhc3NlcnRDaGVja2VyKTtcbiB9OyRo4oCNX29uY2UuYXNzZXJ0U2NhbGFyS2V5KGFzc2VydFNjYWxhcktleSk7XG5oYXJkZW4oYXNzZXJ0U2NhbGFyS2V5KTtcblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIEtleXMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKiogQHR5cGUge1dlYWtTZXQ8S2V5Pn0gKi9cbmNvbnN0IGtleU1lbW89bmV3IFdlYWtTZXQoKTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSB2YWxcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCAgICAgICAgY2hlY2tLZXk9KHZhbCxjaGVjayk9PntcbmlmKCFpc09iamVjdCh2YWwpKXtcbi8qIFRPRE8gVGhlcmUgaXMgbm90IHlldCBhIGNoZWNrUGFzc2FibGUsIGJ1dCBwZXJoYXBzIHRoZXJlIHNob3VsZCBiZS4qL1xuLyogSWYgdGhhdCBoYXBwZW5zLCB3ZSBzaG91bGQgY2FsbCBpdCBoZXJlIGluc3RlYWQuKi9cbmFzc2VydFBhc3NhYmxlKHZhbCk7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5pZihrZXlNZW1vLmhhcyh2YWwpKXtcbnJldHVybiB0cnVlO1xuIH1cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5jb25zdCByZXN1bHQ9Y2hlY2tLZXlJbnRlcm5hbCh2YWwsY2hlY2spO1xuaWYocmVzdWx0KXtcbi8qIERvbid0IGNhY2hlIHRoZSB1bmRlZmluZWQgY2FzZXMsIHNvIHRoYXQgaWYgaXQgaXMgdHJpZWQgYWdhaW4qL1xuLyogd2l0aCBgYXNzZXJ0Q2hlY2tlcmAgaXQnbGwgdGhyb3cgYSBkaWFnbm9zdGljIGFnYWluKi9cbmtleU1lbW8uYWRkKHZhbCk7XG4gfVxuLyogTm90ZSB0aGF0IHdlIGRvIG5vdCBtZW1vaXplIGEgbmVnYXRpdmUganVkZ2VtZW50LCBzbyB0aGF0IGlmIGl0IGlzIHRyaWVkKi9cbi8qIGFnYWluIHdpdGggYSBjaGVja2VyLCBpdCB3aWxsIHN0aWxsIHByb2R1Y2UgYSB1c2VmdWwgZGlhZ25vc3RpYy4qL1xucmV0dXJuIHJlc3VsdDtcbiB9OyRo4oCNX29uY2UuY2hlY2tLZXkoY2hlY2tLZXkpO1xuaGFyZGVuKGNoZWNrS2V5KTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSB2YWxcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCAgICAgICAgaXNLZXk9KHZhbCk9PmNoZWNrS2V5KHZhbCxpZGVudENoZWNrZXIpOyRo4oCNX29uY2UuaXNLZXkoaXNLZXkpO1xuaGFyZGVuKGlzS2V5KTtcblxuLyoqXG4gKiBAcGFyYW0ge0tleX0gdmFsXG4gKi9cbmNvbnN0ICAgICAgICBhc3NlcnRLZXk9KHZhbCk9PntcbmNoZWNrS2V5KHZhbCxhc3NlcnRDaGVja2VyKTtcbiB9OyRo4oCNX29uY2UuYXNzZXJ0S2V5KGFzc2VydEtleSk7XG5oYXJkZW4oYXNzZXJ0S2V5KTtcblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBDb3B5U2V0IC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKiBNb3ZlZCB0byBoZXJlIHNvIHRoZXkgY2FuIGNoZWNrIHRoYXQgdGhlIGNvcHlTZXQgY29udGFpbnMgb25seSBrZXlzKi9cbi8qIHdpdGhvdXQgY3JlYXRpbmcgYW4gaW1wb3J0IGN5Y2xlLiovXG5cbi8qKiBAdHlwZSB7V2Vha1NldDxDb3B5U2V0Pn0gKi9cbmNvbnN0IGNvcHlTZXRNZW1vPW5ldyBXZWFrU2V0KCk7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gc1xuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0ICAgICAgICBjaGVja0NvcHlTZXQ9KHMsY2hlY2spPT57XG5pZihjb3B5U2V0TWVtby5oYXMocykpe1xucmV0dXJuIHRydWU7XG4gfVxuY29uc3QgcmVzdWx0PVxuKHBhc3NTdHlsZU9mKHMpPT09J3RhZ2dlZCcmJmdldFRhZyhzKT09PSdjb3B5U2V0J3x8XG5jaGVjayhmYWxzZSxYIGBOb3QgYSBjb3B5U2V0OiAke3N9YCkpJiZcbmNoZWNrRWxlbWVudHMocy5wYXlsb2FkLGNoZWNrKSYmXG5jaGVja0tleShzLnBheWxvYWQsY2hlY2spO1xuaWYocmVzdWx0KXtcbmNvcHlTZXRNZW1vLmFkZChzKTtcbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH07JGjigI1fb25jZS5jaGVja0NvcHlTZXQoY2hlY2tDb3B5U2V0KTtcbmhhcmRlbihjaGVja0NvcHlTZXQpO1xuXG4vKipcbiAqIEBjYWxsYmFjayBJc0NvcHlTZXRcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHNcbiAqIEByZXR1cm5zIHtzIGlzIENvcHlTZXR9XG4gKi9cblxuLyoqIEB0eXBlIHtJc0NvcHlTZXR9ICovXG5jb25zdCAgICAgICAgaXNDb3B5U2V0PShzKT0+Y2hlY2tDb3B5U2V0KHMsaWRlbnRDaGVja2VyKTskaOKAjV9vbmNlLmlzQ29weVNldChpc0NvcHlTZXQpO1xuaGFyZGVuKGlzQ29weVNldCk7XG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydENvcHlTZXRcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHNcbiAqIEByZXR1cm5zIHthc3NlcnRzIHMgaXMgQ29weVNldH1cbiAqL1xuXG4vKiogQHR5cGUge0Fzc2VydENvcHlTZXR9ICovXG5jb25zdCAgICAgICAgYXNzZXJ0Q29weVNldD0ocyk9PntcbmNoZWNrQ29weVNldChzLGFzc2VydENoZWNrZXIpO1xuIH07JGjigI1fb25jZS5hc3NlcnRDb3B5U2V0KGFzc2VydENvcHlTZXQpO1xuaGFyZGVuKGFzc2VydENvcHlTZXQpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAcGFyYW0ge0NvcHlTZXQ8Sz59IHNcbiAqIEByZXR1cm5zIHtLW119XG4gKi9cbmNvbnN0ICAgICAgICBnZXRDb3B5U2V0S2V5cz0ocyk9PntcbmFzc2VydENvcHlTZXQocyk7XG5yZXR1cm4gcy5wYXlsb2FkO1xuIH07JGjigI1fb25jZS5nZXRDb3B5U2V0S2V5cyhnZXRDb3B5U2V0S2V5cyk7XG5oYXJkZW4oZ2V0Q29weVNldEtleXMpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAcGFyYW0ge0NvcHlTZXQ8Sz59IHNcbiAqIEBwYXJhbSB7KGtleTogSywgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbn0gZm5cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCAgICAgICAgZXZlcnlDb3B5U2V0S2V5PShzLGZuKT0+XG5nZXRDb3B5U2V0S2V5cyhzKS5ldmVyeSgoa2V5LGluZGV4KT0+Zm4oa2V5LGluZGV4KSk7JGjigI1fb25jZS5ldmVyeUNvcHlTZXRLZXkoZXZlcnlDb3B5U2V0S2V5KTtcbmhhcmRlbihldmVyeUNvcHlTZXRLZXkpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPEs+fSBlbGVtZW50SXRlclxuICogQHJldHVybnMge0NvcHlTZXQ8Sz59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlQ29weVNldD0oZWxlbWVudEl0ZXIpPT57XG5jb25zdCByZXN1bHQ9bWFrZVNldE9mRWxlbWVudHMoZWxlbWVudEl0ZXIpO1xuYXNzZXJ0Q29weVNldChyZXN1bHQpO1xucmV0dXJuIHJlc3VsdDtcbiB9OyRo4oCNX29uY2UubWFrZUNvcHlTZXQobWFrZUNvcHlTZXQpO1xuaGFyZGVuKG1ha2VDb3B5U2V0KTtcblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBDb3B5QmFnIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKiBNb3ZlZCB0byBoZXJlIHNvIHRoZXkgY2FuIGNoZWNrIHRoYXQgdGhlIGNvcHlCYWcgY29udGFpbnMgb25seSBrZXlzKi9cbi8qIHdpdGhvdXQgY3JlYXRpbmcgYW4gaW1wb3J0IGN5Y2xlLiovXG5cbi8qKiBAdHlwZSB7V2Vha1NldDxDb3B5QmFnPn0gKi9cbmNvbnN0IGNvcHlCYWdNZW1vPW5ldyBXZWFrU2V0KCk7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gYlxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0ICAgICAgICBjaGVja0NvcHlCYWc9KGIsY2hlY2spPT57XG5pZihjb3B5QmFnTWVtby5oYXMoYikpe1xucmV0dXJuIHRydWU7XG4gfVxuY29uc3QgcmVzdWx0PVxuKHBhc3NTdHlsZU9mKGIpPT09J3RhZ2dlZCcmJmdldFRhZyhiKT09PSdjb3B5QmFnJ3x8XG5jaGVjayhmYWxzZSxYIGBOb3QgYSBjb3B5QmFnOiAke2J9YCkpJiZcbmNoZWNrQmFnRW50cmllcyhiLnBheWxvYWQsY2hlY2spJiZcbmNoZWNrS2V5KGIucGF5bG9hZCxjaGVjayk7XG5pZihyZXN1bHQpe1xuY29weUJhZ01lbW8uYWRkKGIpO1xuIH1cbnJldHVybiByZXN1bHQ7XG4gfTskaOKAjV9vbmNlLmNoZWNrQ29weUJhZyhjaGVja0NvcHlCYWcpO1xuaGFyZGVuKGNoZWNrQ29weUJhZyk7XG5cbi8qKlxuICogQGNhbGxiYWNrIElzQ29weUJhZ1xuICogQHBhcmFtIHtQYXNzYWJsZX0gYlxuICogQHJldHVybnMge2IgaXMgQ29weUJhZ31cbiAqL1xuXG4vKiogQHR5cGUge0lzQ29weUJhZ30gKi9cbmNvbnN0ICAgICAgICBpc0NvcHlCYWc9KGIpPT5jaGVja0NvcHlCYWcoYixpZGVudENoZWNrZXIpOyRo4oCNX29uY2UuaXNDb3B5QmFnKGlzQ29weUJhZyk7XG5oYXJkZW4oaXNDb3B5QmFnKTtcblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0Q29weUJhZ1xuICogQHBhcmFtIHtQYXNzYWJsZX0gYlxuICogQHJldHVybnMge2Fzc2VydHMgYiBpcyBDb3B5QmFnfVxuICovXG5cbi8qKiBAdHlwZSB7QXNzZXJ0Q29weUJhZ30gKi9cbmNvbnN0ICAgICAgICBhc3NlcnRDb3B5QmFnPShiKT0+e1xuY2hlY2tDb3B5QmFnKGIsYXNzZXJ0Q2hlY2tlcik7XG4gfTskaOKAjV9vbmNlLmFzc2VydENvcHlCYWcoYXNzZXJ0Q29weUJhZyk7XG5oYXJkZW4oYXNzZXJ0Q29weUJhZyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIEtcbiAqIEBwYXJhbSB7Q29weUJhZzxLPn0gYlxuICogQHJldHVybnMge0NvcHlCYWc8Sz5bJ3BheWxvYWQnXX1cbiAqL1xuY29uc3QgICAgICAgIGdldENvcHlCYWdFbnRyaWVzPShiKT0+e1xuYXNzZXJ0Q29weUJhZyhiKTtcbnJldHVybiBiLnBheWxvYWQ7XG4gfTskaOKAjV9vbmNlLmdldENvcHlCYWdFbnRyaWVzKGdldENvcHlCYWdFbnRyaWVzKTtcbmhhcmRlbihnZXRDb3B5QmFnRW50cmllcyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIEtcbiAqIEBwYXJhbSB7Q29weUJhZzxLPn0gYlxuICogQHBhcmFtIHsoZW50cnk6IFtLLCBiaWdpbnRdLCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFufSBmblxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0ICAgICAgICBldmVyeUNvcHlCYWdFbnRyeT0oYixmbik9PlxuZ2V0Q29weUJhZ0VudHJpZXMoYikuZXZlcnkoKGVudHJ5LGluZGV4KT0+Zm4oZW50cnksaW5kZXgpKTskaOKAjV9vbmNlLmV2ZXJ5Q29weUJhZ0VudHJ5KGV2ZXJ5Q29weUJhZ0VudHJ5KTtcbmhhcmRlbihldmVyeUNvcHlCYWdFbnRyeSk7XG5cbi8qKlxuICogQHRlbXBsYXRlIEtcbiAqIEBwYXJhbSB7SXRlcmFibGU8W0ssYmlnaW50XT59IGJhZ0VudHJ5SXRlclxuICogQHJldHVybnMge0NvcHlCYWc8Sz59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlQ29weUJhZz0oYmFnRW50cnlJdGVyKT0+e1xuY29uc3QgcmVzdWx0PW1ha2VCYWdPZkVudHJpZXMoYmFnRW50cnlJdGVyKTtcbmFzc2VydENvcHlCYWcocmVzdWx0KTtcbnJldHVybiByZXN1bHQ7XG4gfTskaOKAjV9vbmNlLm1ha2VDb3B5QmFnKG1ha2VDb3B5QmFnKTtcbmhhcmRlbihtYWtlQ29weUJhZyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIEtcbiAqIEBwYXJhbSB7SXRlcmFibGU8Sz59IGVsZW1lbnRJdGVyXG4gKiBAcmV0dXJucyB7Q29weUJhZzxLPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzPShlbGVtZW50SXRlcik9Pntcbi8qIFRoaXMgZnVsbE9yZGVyIGNvbnRhaW5zIGhpc3RvcnkgZGVwZW5kZW50IHN0YXRlLiBJdCBpcyBzcGVjaWZpYyovXG4vKiB0byB0aGlzIG9uZSBjYWxsIGFuZCBkb2VzIG5vdCBzdXJ2aXZlIGl0LiovXG5jb25zdCBmdWxsQ29tcGFyZT1tYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCgpLmFudGlDb21wYXJhdG9yO1xuY29uc3Qgc29ydGVkPXNvcnRCeVJhbmsoZWxlbWVudEl0ZXIsZnVsbENvbXBhcmUpO1xuLyoqIEB0eXBlIHtbSyxiaWdpbnRdW119ICovXG5jb25zdCBlbnRyaWVzPVtdO1xuZm9yKGxldCBpPTA7aTxzb3J0ZWQubGVuZ3RoOyl7XG5jb25zdCBrPXNvcnRlZFtpXTtcbmxldCBqPWkrMTtcbndoaWxlKGo8c29ydGVkLmxlbmd0aCYmZnVsbENvbXBhcmUoayxzb3J0ZWRbal0pPT09MCl7XG5qKz0xO1xuIH1cbmVudHJpZXMucHVzaChbayxCaWdJbnQoai1pKV0pO1xuaT1qO1xuIH1cbnJldHVybiBtYWtlQ29weUJhZyhlbnRyaWVzKTtcbiB9OyRo4oCNX29uY2UubWFrZUNvcHlCYWdGcm9tRWxlbWVudHMobWFrZUNvcHlCYWdGcm9tRWxlbWVudHMpO1xuaGFyZGVuKG1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzKTtcblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBDb3B5TWFwIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKiBNb3ZlZCB0byBoZXJlIHNvIHRoZXkgY2FuIGNoZWNrIHRoYXQgdGhlIGNvcHlNYXAncyBrZXlzIGNvbnRhaW5zIG9ubHkga2V5cyovXG4vKiB3aXRob3V0IGNyZWF0aW5nIGFuIGltcG9ydCBjeWNsZS4qL1xuXG4vKiogQHR5cGUge1dlYWtTZXQ8Q29weU1hcD59ICovXG5jb25zdCBjb3B5TWFwTWVtbz1uZXcgV2Vha1NldCgpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IG1cbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCAgICAgICAgY2hlY2tDb3B5TWFwPShtLGNoZWNrKT0+e1xuaWYoY29weU1hcE1lbW8uaGFzKG0pKXtcbnJldHVybiB0cnVlO1xuIH1cbmlmKCEocGFzc1N0eWxlT2YobSk9PT0ndGFnZ2VkJyYmZ2V0VGFnKG0pPT09J2NvcHlNYXAnKSl7XG5yZXR1cm4gY2hlY2soZmFsc2UsWCBgTm90IGEgY29weU1hcDogJHttfWApO1xuIH1cbmNvbnN0e3BheWxvYWR9PW07XG5pZihwYXNzU3R5bGVPZihwYXlsb2FkKSE9PSdjb3B5UmVjb3JkJyl7XG5yZXR1cm4gY2hlY2soZmFsc2UsWCBgQSBjb3B5TWFwJ3MgcGF5bG9hZCBtdXN0IGJlIGEgcmVjb3JkOiAke219YCk7XG4gfVxuY29uc3R7a2V5cyx2YWx1ZXMsLi4ucmVzdH09cGF5bG9hZDtcbmNvbnN0IHJlc3VsdD1cbihvd25LZXlzKHJlc3QpLmxlbmd0aD09PTB8fFxuY2hlY2soXG5mYWxzZSxcblggYEEgY29weU1hcCdzIHBheWxvYWQgbXVzdCBvbmx5IGhhdmUgLmtleXMgYW5kIC52YWx1ZXM6ICR7bX1gKSkmJlxuXG5jaGVja0VsZW1lbnRzKGtleXMsY2hlY2spJiZcbmNoZWNrS2V5KGtleXMsY2hlY2spJiYoXG5wYXNzU3R5bGVPZih2YWx1ZXMpPT09J2NvcHlBcnJheSd8fFxuY2hlY2soZmFsc2UsWCBgQSBjb3B5TWFwJ3MgLnZhbHVlcyBtdXN0IGJlIGEgY29weUFycmF5OiAke219YCkpJiYoXG5rZXlzLmxlbmd0aD09PXZhbHVlcy5sZW5ndGh8fFxuY2hlY2soXG5mYWxzZSxcblggYEEgY29weU1hcCBtdXN0IGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIGtleXMgYW5kIHZhbHVlczogJHttfWApKTtcblxuaWYocmVzdWx0KXtcbmNvcHlNYXBNZW1vLmFkZChtKTtcbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH07JGjigI1fb25jZS5jaGVja0NvcHlNYXAoY2hlY2tDb3B5TWFwKTtcbmhhcmRlbihjaGVja0NvcHlNYXApO1xuXG4vKipcbiAqIEBjYWxsYmFjayBJc0NvcHlNYXBcbiAqIEBwYXJhbSB7UGFzc2FibGV9IG1cbiAqIEByZXR1cm5zIHttIGlzIENvcHlNYXA8S2V5LCBQYXNzYWJsZT59XG4gKi9cblxuLyoqIEB0eXBlIHtJc0NvcHlNYXB9ICovXG5jb25zdCAgICAgICAgaXNDb3B5TWFwPShtKT0+Y2hlY2tDb3B5TWFwKG0saWRlbnRDaGVja2VyKTskaOKAjV9vbmNlLmlzQ29weU1hcChpc0NvcHlNYXApO1xuaGFyZGVuKGlzQ29weU1hcCk7XG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydENvcHlNYXBcbiAqIEBwYXJhbSB7UGFzc2FibGV9IG1cbiAqIEByZXR1cm5zIHthc3NlcnRzIG0gaXMgQ29weU1hcDxLZXksIFBhc3NhYmxlPn1cbiAqL1xuXG4vKiogQHR5cGUge0Fzc2VydENvcHlNYXB9ICovXG5jb25zdCAgICAgICAgYXNzZXJ0Q29weU1hcD0obSk9PntcbmNoZWNrQ29weU1hcChtLGFzc2VydENoZWNrZXIpO1xuIH07JGjigI1fb25jZS5hc3NlcnRDb3B5TWFwKGFzc2VydENvcHlNYXApO1xuaGFyZGVuKGFzc2VydENvcHlNYXApO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBWXG4gKiBAcGFyYW0ge0NvcHlNYXA8SyxWPn0gbVxuICogQHJldHVybnMge0tbXX1cbiAqL1xuY29uc3QgICAgICAgIGdldENvcHlNYXBLZXlzPShtKT0+e1xuYXNzZXJ0Q29weU1hcChtKTtcbnJldHVybiBtLnBheWxvYWQua2V5cztcbiB9OyRo4oCNX29uY2UuZ2V0Q29weU1hcEtleXMoZ2V0Q29weU1hcEtleXMpO1xuaGFyZGVuKGdldENvcHlNYXBLZXlzKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleX0gS1xuICogQHRlbXBsYXRlIHtQYXNzYWJsZX0gVlxuICogQHBhcmFtIHtDb3B5TWFwPEssVj59IG1cbiAqIEByZXR1cm5zIHtWW119XG4gKi9cbmNvbnN0ICAgICAgICBnZXRDb3B5TWFwVmFsdWVzPShtKT0+e1xuYXNzZXJ0Q29weU1hcChtKTtcbnJldHVybiBtLnBheWxvYWQudmFsdWVzO1xuIH07JGjigI1fb25jZS5nZXRDb3B5TWFwVmFsdWVzKGdldENvcHlNYXBWYWx1ZXMpO1xuaGFyZGVuKGdldENvcHlNYXBWYWx1ZXMpO1xuXG4vKipcbiAqIFJldHVybnMgYW4gYXJyYXkgb2YgYSBDb3B5TWFwJ3MgZW50cmllcyBpbiBzdG9yYWdlIG9yZGVyLlxuICpcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBWXG4gKiBAcGFyYW0ge0NvcHlNYXA8SyxWPn0gbVxuICogQHJldHVybnMge0FycmF5PFtLLFZdPn1cbiAqL1xuY29uc3QgICAgICAgIGdldENvcHlNYXBFbnRyeUFycmF5PShtKT0+e1xuYXNzZXJ0Q29weU1hcChtKTtcbmNvbnN0e1xucGF5bG9hZDp7a2V5cyx2YWx1ZXN9fT1cbm07XG5yZXR1cm4gaGFyZGVuKGtleXMubWFwKChrZXksaSk9PltrZXksdmFsdWVzW2ldXSkpO1xuIH07JGjigI1fb25jZS5nZXRDb3B5TWFwRW50cnlBcnJheShnZXRDb3B5TWFwRW50cnlBcnJheSk7XG5oYXJkZW4oZ2V0Q29weU1hcEVudHJ5QXJyYXkpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBWXG4gKiBAcGFyYW0ge0NvcHlNYXA8SyxWPn0gbVxuICogQHJldHVybnMge0l0ZXJhYmxlPFtLLFZdPn1cbiAqL1xuY29uc3QgICAgICAgIGdldENvcHlNYXBFbnRyaWVzPShtKT0+e1xuYXNzZXJ0Q29weU1hcChtKTtcbmNvbnN0e1xucGF5bG9hZDp7a2V5cyx2YWx1ZXN9fT1cbm07XG5jb25zdHtsZW5ndGh9PS8qKiBAdHlwZSB7QXJyYXl9ICova2V5cztcbnJldHVybiBGYXIoJ0NvcHlNYXAgZW50cmllcyBpdGVyYWJsZScse1xuW1N5bWJvbC5pdGVyYXRvcl06KCk9PntcbmxldCBpPTA7XG5yZXR1cm4gRmFyKCdDb3B5TWFwIGVudHJpZXMgaXRlcmF0b3InLHtcbm5leHQ6KCk9Pntcbi8qKiBAdHlwZSB7SXRlcmF0b3JSZXN1bHQ8W0ssVl0sdm9pZD59ICovXG5sZXQgcmVzdWx0O1xuaWYoaTxsZW5ndGgpe1xucmVzdWx0PWhhcmRlbih7ZG9uZTpmYWxzZSx2YWx1ZTpba2V5c1tpXSx2YWx1ZXNbaV1dfSk7XG5pKz0xO1xucmV0dXJuIHJlc3VsdDtcbiB9ZWxzZXtcbnJlc3VsdD1oYXJkZW4oe2RvbmU6dHJ1ZSx2YWx1ZTp1bmRlZmluZWR9KTtcbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH19KTtcblxuIH19KTtcblxuIH07JGjigI1fb25jZS5nZXRDb3B5TWFwRW50cmllcyhnZXRDb3B5TWFwRW50cmllcyk7XG5oYXJkZW4oZ2V0Q29weU1hcEVudHJpZXMpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBWXG4gKiBAcGFyYW0ge0NvcHlNYXA8SyxWPn0gbVxuICogQHBhcmFtIHsoa2V5OiBLLCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFufSBmblxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0ICAgICAgICBldmVyeUNvcHlNYXBLZXk9KG0sZm4pPT5cbmdldENvcHlNYXBLZXlzKG0pLmV2ZXJ5KChrZXksaW5kZXgpPT5mbihrZXksaW5kZXgpKTskaOKAjV9vbmNlLmV2ZXJ5Q29weU1hcEtleShldmVyeUNvcHlNYXBLZXkpO1xuaGFyZGVuKGV2ZXJ5Q29weU1hcEtleSk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IEtcbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFZcbiAqIEBwYXJhbSB7Q29weU1hcDxLLFY+fSBtXG4gKiBAcGFyYW0geyh2YWx1ZTogViwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbn0gZm5cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCAgICAgICAgZXZlcnlDb3B5TWFwVmFsdWU9KG0sZm4pPT5cbmdldENvcHlNYXBWYWx1ZXMobSkuZXZlcnkoKHZhbHVlLGluZGV4KT0+Zm4odmFsdWUsaW5kZXgpKTskaOKAjV9vbmNlLmV2ZXJ5Q29weU1hcFZhbHVlKGV2ZXJ5Q29weU1hcFZhbHVlKTtcbmhhcmRlbihldmVyeUNvcHlNYXBWYWx1ZSk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IEtcbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFZcbiAqIEBwYXJhbSB7Q29weU1hcDxLLFY+fSBtXG4gKiBAcmV0dXJucyB7Q29weVNldDxLPn1cbiAqL1xuY29uc3QgICAgICAgIGNvcHlNYXBLZXlTZXQ9KG0pPT5cbi8qIEEgY29weU1hcCdzIGtleXMgYXJlIGFscmVhZHkgaW4gdGhlIGludGVybmFsIGZvcm0gdXNlZCBieSBjb3B5U2V0cy4qL1xubWFrZVRhZ2dlZCgnY29weVNldCcsbS5wYXlsb2FkLmtleXMpOyRo4oCNX29uY2UuY29weU1hcEtleVNldChjb3B5TWFwS2V5U2V0KTtcbmhhcmRlbihjb3B5TWFwS2V5U2V0KTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleX0gS1xuICogQHRlbXBsYXRlIHtQYXNzYWJsZX0gVlxuICogQHBhcmFtIHtJdGVyYWJsZTxbSywgVl0+fSBlbnRyaWVzXG4gKiBAcmV0dXJucyB7Q29weU1hcDxLLFY+fVxuICovXG5jb25zdCAgICAgICAgbWFrZUNvcHlNYXA9KGVudHJpZXMpPT57XG4vKiBUaGlzIGlzIHdlaXJkLCBidXQgcmV2ZXJzZSByYW5rIHNvcnRpbmcgdGhlIGVudHJpZXMgaXMgYSBnb29kIGZpcnN0IHN0ZXAqL1xuLyogZm9yIGdldHRpbmcgdGhlIHJhbmsgc29ydGVkIGtleXMgdG9nZXRoZXIgd2l0aCB0aGUgdmFsdWVzKi9cbi8qIG9yZ2FuaXplZCBieSB0aG9zZSBrZXlzLiBBbHNvLCBhbW9uZyB2YWx1ZXMgYXNzb2NpYXRlZCB3aXRoKi9cbi8qIGtleXMgaW4gdGhlIHNhbWUgZXF1aXZhbGVuY2UgY2xhc3MsIHRob3NlIGFyZSByYW5rIHNvcnRlZC4qL1xuLyogVE9ETyBUaGlzKi9cbi8qIGNvdWxkIHNvbHZlIHRoZSBjb3B5TWFwIGNvdmVyIGlzc3VlIGV4cGxhaW5lZCBpbiBwYXR0ZXJuTWF0Y2hlcnMuanMuKi9cbi8qIEJ1dCBvbmx5IGlmIHdlIGluY2x1ZGUgdGhpcyBjcml0ZXJpYSBpbiBvdXIgdmFsaWRhdGlvbiBvZiBjb3B5TWFwcywqL1xuLyogd2hpY2ggd2UgY3VycmVudGx5IGRvIG5vdC4qL1xuY29uc3Qgc29ydGVkRW50cmllcz1zb3J0QnlSYW5rKGVudHJpZXMsY29tcGFyZUFudGlSYW5rKTtcbmNvbnN0IGtleXM9c29ydGVkRW50cmllcy5tYXAoKFtrLF92XSk9PmspO1xuY29uc3QgdmFsdWVzPXNvcnRlZEVudHJpZXMubWFwKChbX2ssdl0pPT52KTtcbmNvbnN0IHJlc3VsdD1tYWtlVGFnZ2VkKCdjb3B5TWFwJyx7a2V5cyx2YWx1ZXN9KTtcbmFzc2VydENvcHlNYXAocmVzdWx0KTtcbnJldHVybiByZXN1bHQ7XG4gfTskaOKAjV9vbmNlLm1ha2VDb3B5TWFwKG1ha2VDb3B5TWFwKTtcbmhhcmRlbihtYWtlQ29weU1hcCk7XG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBLZXlzIFJlY3VyIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSB2YWxcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjaGVja0tleUludGVybmFsPSh2YWwsY2hlY2spPT57XG5jb25zdCBjaGVja0l0PShjaGlsZCk9PmNoZWNrS2V5KGNoaWxkLGNoZWNrKTtcblxuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHZhbCk7XG5zd2l0Y2gocGFzc1N0eWxlKXtcbmNhc2UnY29weVJlY29yZCc6e1xuLyogQSBjb3B5UmVjb3JkIGlzIGEga2V5IGlmZiBhbGwgaXRzIGNoaWxkcmVuIGFyZSBrZXlzKi9cbnJldHVybiBPYmplY3QudmFsdWVzKHZhbCkuZXZlcnkoY2hlY2tJdCk7XG4gfVxuY2FzZSdjb3B5QXJyYXknOntcbi8qIEEgY29weUFycmF5IGlzIGEga2V5IGlmZiBhbGwgaXRzIGNoaWxkcmVuIGFyZSBrZXlzKi9cbnJldHVybiB2YWwuZXZlcnkoY2hlY2tJdCk7XG4gfVxuY2FzZSd0YWdnZWQnOntcbmNvbnN0IHRhZz1nZXRUYWcodmFsKTtcbnN3aXRjaCh0YWcpe1xuY2FzZSdjb3B5U2V0Jzp7XG5yZXR1cm4gY2hlY2tDb3B5U2V0KHZhbCxjaGVjayk7XG4gfVxuY2FzZSdjb3B5QmFnJzp7XG5yZXR1cm4gY2hlY2tDb3B5QmFnKHZhbCxjaGVjayk7XG4gfVxuY2FzZSdjb3B5TWFwJzp7XG5yZXR1cm4oXG5jaGVja0NvcHlNYXAodmFsLGNoZWNrKSYmXG4vKiBGb3IgYSBjb3B5TWFwIHRvIGJlIGEga2V5LCBhbGwgaXRzIGtleXMgYW5kIHZhbHVlcyBtdXN0Ki9cbi8qIGJlIGtleXMuIEtleXMgYWxyZWFkeSBjaGVja2VkIGJ5IGBjaGVja0NvcHlNYXBgIHNpbmNlKi9cbi8qIHRoYXQncyBhIGNvcHlNYXAgcmVxdWlyZW1lbnQgaW4gZ2VuZXJhbC4qL1xuZXZlcnlDb3B5TWFwVmFsdWUodmFsLGNoZWNrSXQpKTtcblxuIH1cbmRlZmF1bHQ6e1xucmV0dXJuKFxuY2hlY2shPT1pZGVudENoZWNrZXImJlxuY2hlY2soZmFsc2UsWCBgQSBwYXNzYWJsZSB0YWdnZWQgJHtxKHRhZyl9IGlzIG5vdCBhIGtleTogJHt2YWx9YCkpO1xuXG4gfX1cblxuIH1cbmNhc2UncmVtb3RhYmxlJzp7XG4vKiBBbGwgcmVtb3RhYmxlcyBhcmUga2V5cy4qL1xucmV0dXJuIHRydWU7XG4gfVxuY2FzZSdlcnJvcic6XG5jYXNlJ3Byb21pc2UnOntcbnJldHVybiBjaGVjayhmYWxzZSxYIGBBICR7cShwYXNzU3R5bGUpfSBjYW5ub3QgYmUgYSBrZXlgKTtcbiB9XG5kZWZhdWx0Ontcbi8qIFVuZXhwZWN0ZWQgdGFncyBhcmUganVzdCBub24ta2V5cywgYnV0IGFuIHVuZXhwZWN0ZWQgcGFzc1N0eWxlKi9cbi8qIGlzIGFsd2F5cyBhbiBlcnJvci4qL1xudGhyb3cgRmFpbCBgdW5leHBlY3RlZCBwYXNzU3R5bGUgJHtxKHBhc3NTdHlsZSl9OiAke3ZhbH1gO1xuIH19XG5cbiB9O1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzUHJpbWl0aXZlS2V5IjpbImlzUHJpbWl0aXZlS2V5Il0sImFzc2VydFByaW1pdGl2ZUtleSI6WyJhc3NlcnRQcmltaXRpdmVLZXkiXSwiY2hlY2tTY2FsYXJLZXkiOlsiY2hlY2tTY2FsYXJLZXkiXSwiaXNTY2FsYXJLZXkiOlsiaXNTY2FsYXJLZXkiXSwiYXNzZXJ0U2NhbGFyS2V5IjpbImFzc2VydFNjYWxhcktleSJdLCJjaGVja0tleSI6WyJjaGVja0tleSJdLCJpc0tleSI6WyJpc0tleSJdLCJhc3NlcnRLZXkiOlsiYXNzZXJ0S2V5Il0sImNoZWNrQ29weVNldCI6WyJjaGVja0NvcHlTZXQiXSwiaXNDb3B5U2V0IjpbImlzQ29weVNldCJdLCJhc3NlcnRDb3B5U2V0IjpbImFzc2VydENvcHlTZXQiXSwiZ2V0Q29weVNldEtleXMiOlsiZ2V0Q29weVNldEtleXMiXSwiZXZlcnlDb3B5U2V0S2V5IjpbImV2ZXJ5Q29weVNldEtleSJdLCJtYWtlQ29weVNldCI6WyJtYWtlQ29weVNldCJdLCJjaGVja0NvcHlCYWciOlsiY2hlY2tDb3B5QmFnIl0sImlzQ29weUJhZyI6WyJpc0NvcHlCYWciXSwiYXNzZXJ0Q29weUJhZyI6WyJhc3NlcnRDb3B5QmFnIl0sImdldENvcHlCYWdFbnRyaWVzIjpbImdldENvcHlCYWdFbnRyaWVzIl0sImV2ZXJ5Q29weUJhZ0VudHJ5IjpbImV2ZXJ5Q29weUJhZ0VudHJ5Il0sIm1ha2VDb3B5QmFnIjpbIm1ha2VDb3B5QmFnIl0sIm1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzIjpbIm1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzIl0sImNoZWNrQ29weU1hcCI6WyJjaGVja0NvcHlNYXAiXSwiaXNDb3B5TWFwIjpbImlzQ29weU1hcCJdLCJhc3NlcnRDb3B5TWFwIjpbImFzc2VydENvcHlNYXAiXSwiZ2V0Q29weU1hcEtleXMiOlsiZ2V0Q29weU1hcEtleXMiXSwiZ2V0Q29weU1hcFZhbHVlcyI6WyJnZXRDb3B5TWFwVmFsdWVzIl0sImdldENvcHlNYXBFbnRyeUFycmF5IjpbImdldENvcHlNYXBFbnRyeUFycmF5Il0sImdldENvcHlNYXBFbnRyaWVzIjpbImdldENvcHlNYXBFbnRyaWVzIl0sImV2ZXJ5Q29weU1hcEtleSI6WyJldmVyeUNvcHlNYXBLZXkiXSwiZXZlcnlDb3B5TWFwVmFsdWUiOlsiZXZlcnlDb3B5TWFwVmFsdWUiXSwiY29weU1hcEtleVNldCI6WyJjb3B5TWFwS2V5U2V0Il0sIm1ha2VDb3B5TWFwIjpbIm1ha2VDb3B5TWFwIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKSprUujIQAAoyEAAC0AAABAZW5kby9wYXR0ZXJucy12MC4yLjYvc3JjL2tleXMvY29tcGFyZUtleXMuanN7ImltcG9ydHMiOlsiQGVuZG8vbWFyc2hhbCIsIi4vY2hlY2tLZXkuanMiLCIuL2tleWNvbGxlY3Rpb24tb3BlcmF0b3JzLmpzIl0sImV4cG9ydHMiOlsiYmFnQ29tcGFyZSIsImNvbXBhcmVLZXlzIiwia2V5RVEiLCJrZXlHVCIsImtleUdURSIsImtleUxUIiwia2V5TFRFIiwic2V0Q29tcGFyZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBwYXNzU3R5bGVPZixnZXRUYWcsY29tcGFyZVJhbmsscmVjb3JkTmFtZXMscmVjb3JkVmFsdWVzLHRyaXZpYWxDb21wYXJhdG9yLGFzc2VydEtleSxnZXRDb3B5QmFnRW50cmllcyxnZXRDb3B5TWFwRW50cnlBcnJheSxnZXRDb3B5U2V0S2V5cyxtYWtlQ29tcGFyZUNvbGxlY3Rpb247JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXSxbXCJnZXRUYWdcIiwgWyRo4oCNX2EgPT4gKGdldFRhZyA9ICRo4oCNX2EpXV0sW1wiY29tcGFyZVJhbmtcIiwgWyRo4oCNX2EgPT4gKGNvbXBhcmVSYW5rID0gJGjigI1fYSldXSxbXCJyZWNvcmROYW1lc1wiLCBbJGjigI1fYSA9PiAocmVjb3JkTmFtZXMgPSAkaOKAjV9hKV1dLFtcInJlY29yZFZhbHVlc1wiLCBbJGjigI1fYSA9PiAocmVjb3JkVmFsdWVzID0gJGjigI1fYSldXSxbXCJ0cml2aWFsQ29tcGFyYXRvclwiLCBbJGjigI1fYSA9PiAodHJpdmlhbENvbXBhcmF0b3IgPSAkaOKAjV9hKV1dXV0sW1wiLi9jaGVja0tleS5qc1wiLCBbW1wiYXNzZXJ0S2V5XCIsIFskaOKAjV9hID0+IChhc3NlcnRLZXkgPSAkaOKAjV9hKV1dLFtcImdldENvcHlCYWdFbnRyaWVzXCIsIFskaOKAjV9hID0+IChnZXRDb3B5QmFnRW50cmllcyA9ICRo4oCNX2EpXV0sW1wiZ2V0Q29weU1hcEVudHJ5QXJyYXlcIiwgWyRo4oCNX2EgPT4gKGdldENvcHlNYXBFbnRyeUFycmF5ID0gJGjigI1fYSldXSxbXCJnZXRDb3B5U2V0S2V5c1wiLCBbJGjigI1fYSA9PiAoZ2V0Q29weVNldEtleXMgPSAkaOKAjV9hKV1dXV0sW1wiLi9rZXljb2xsZWN0aW9uLW9wZXJhdG9ycy5qc1wiLCBbW1wibWFrZUNvbXBhcmVDb2xsZWN0aW9uXCIsIFskaOKAjV9hID0+IChtYWtlQ29tcGFyZUNvbGxlY3Rpb24gPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHRlbXBsYXRlIHtLZXl9IFtLPUtleV0gQHR5cGVkZWYge1hpbXBvcnQoJy4uL3R5cGVzJykuQ29weVNldDxLPn0gQ29weVNldCAqL1xuXG5jb25zdHtxdW90ZTpxLEZhaWx9PWFzc2VydDtcblxuLyoqXG4gKiBDb3B5U2V0IFggaXMgc21hbGxlciB0aGFuIENvcHlTZXQgWSBpZmYgYWxsIG9mIHRoZXNlIGNvbmRpdGlvbnMgaG9sZDpcbiAqIDEuIEZvciBldmVyeSB4IGluIFgsIHggaXMgYWxzbyBpbiBZLlxuICogMi4gVGhlcmUgaXMgYSB5IGluIFkgdGhhdCBpcyBub3QgaW4gWC5cbiAqXG4gKiBYIGlzIGVxdWl2YWxlbnQgdG8gWSBpZmYgdGhlIGNvbmRpdGlvbiAxIGhvbGRzIGJ1dCBjb25kaXRpb24gMiBkb2VzIG5vdC5cbiAqL1xuY29uc3QgICAgICAgIHNldENvbXBhcmU9bWFrZUNvbXBhcmVDb2xsZWN0aW9uKFxuLyoqIEB0eXBlIHs8SyBleHRlbmRzIHVua25vd24+KHM6IENvcHlTZXQ8Sz4pID0+IEFycmF5PFtLLCAxXT59ICovXG4ocyk9PmhhcmRlbihnZXRDb3B5U2V0S2V5cyhzKS5tYXAoKGtleSk9PltrZXksMV0pKSxcblxuMCxcbnRyaXZpYWxDb21wYXJhdG9yKTskaOKAjV9vbmNlLnNldENvbXBhcmUoc2V0Q29tcGFyZSk7XG5cbmhhcmRlbihzZXRDb21wYXJlKTtcblxuLyoqXG4gKiBDb3B5QmFnIFggaXMgc21hbGxlciB0aGFuIENvcHlCYWcgWSBpZmYgYWxsIG9mIHRoZXNlIGNvbmRpdGlvbnMgaG9sZFxuICogKHdoZXJlIGBjb3VudChBLCBhKWAgaXMgc2hvcnRoYW5kIGZvciB0aGUgY291bnQgYXNzb2NpYXRlZCB3aXRoIGBhYCBpbiBgQWApOlxuICogMS4gRm9yIGV2ZXJ5IHggaW4gWCwgeCBpcyBhbHNvIGluIFkgYW5kIGNvdW50KFgsIHgpIDw9IGNvdW50KFksIHgpLlxuICogMi4gVGhlcmUgaXMgYSB5IGluIFkgc3VjaCB0aGF0IHkgaXMgbm90IGluIFggb3IgY291bnQoWCwgeSkgPCBjb3VudChZLCB5KS5cbiAqXG4gKiBYIGlzIGVxdWl2YWxlbnQgdG8gWSBpZmYgdGhlIGNvbmRpdGlvbiAxIGhvbGRzIGJ1dCBjb25kaXRpb24gMiBkb2VzIG5vdC5cbiAqL1xuY29uc3QgICAgICAgIGJhZ0NvbXBhcmU9bWFrZUNvbXBhcmVDb2xsZWN0aW9uKFxuZ2V0Q29weUJhZ0VudHJpZXMsXG4wbixcbnRyaXZpYWxDb21wYXJhdG9yKTskaOKAjV9vbmNlLmJhZ0NvbXBhcmUoYmFnQ29tcGFyZSk7XG5cbmhhcmRlbihiYWdDb21wYXJlKTtcblxuLyogVE9ETyBUaGUgZGVzaXJlZCBzZW1hbnRpY3MgZm9yIENvcHlNYXAgY29tcGFyaXNvbiBoYXZlIG5vdCB5ZXQgYmVlbiBkZWNpZGVkLiovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL3B1bGwvMTczNyNwdWxscmVxdWVzdHJldmlldy0xNTk2NTk1NDExKi9cbi8qIFRoZSBiZWxvdyBpcyBhIGN1cnJlbnRseS11bnVzZWQgZXh0ZW5zaW9uIG9mIENvcHlCYWcgc2VtYW50aWNzIChpLmUuLCBhYnNlbnQqL1xuLyogZW50cmllcyB0cmVhdGVkIGFzIHByZXNlbnQgd2l0aCBhIHZhbHVlIHRoYXQgaXMgc21hbGxlciB0aGFuIGV2ZXJ5dGhpbmcpLiovXG4vKipcbiAqIEEgdW5pcXVlIGxvY2FsIHZhbHVlIHRoYXQgaXMgZ3VhcmFudGVlZCB0byBub3QgZXhpc3QgaW4gYW55IGluYm91bmQgZGF0YVxuICogc3RydWN0dXJlICh3aGljaCB3b3VsZCBub3QgYmUgdGhlIGNhc2UgaWYgd2UgdXNlZCBgU3ltYm9sLmZvcmApLlxuICovXG5jb25zdCBBQlNFTlQ9U3ltYm9sKCdhYnNlbnQnKTtcbi8qKlxuICogQ29weU1hcCBYIGlzIHNtYWxsZXIgdGhhbiBDb3B5TWFwIFkgaWZmIGFsbCBvZiB0aGVzZSBjb25kaXRpb25zIGhvbGQ6XG4gKiAxLiBYIGFuZCBZIGFyZSBib3RoIEtleXMgKGkuZS4sIG5laXRoZXIgY29udGFpbnMgbm9uLWNvbXBhcmFibGUgZGF0YSkuXG4gKiAyLiBGb3IgZXZlcnkgeCBpbiBYLCB4IGlzIGFsc28gaW4gWSBhbmQgWFt4XSBpcyBzbWFsbGVyIHRoYW4gb3IgZXF1aXZhbGVudCB0byBZW3hdLlxuICogMy4gVGhlcmUgaXMgYSB5IGluIFkgc3VjaCB0aGF0IHkgaXMgbm90IGluIFggb3IgWFt5XSBpcyBzbWFsbGVyIHRoYW4gWVt5XS5cbiAqXG4gKiBYIGlzIGVxdWl2YWxlbnQgdG8gWSBpZmYgY29uZGl0aW9ucyAxIGFuZCAyIGhvbGQgYnV0IGNvbmRpdGlvbiAzIGRvZXMgbm90LlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZXJzY29yZS1kYW5nbGUqL1xuY29uc3QgX21hcENvbXBhcmU9bWFrZUNvbXBhcmVDb2xsZWN0aW9uKFxuZ2V0Q29weU1hcEVudHJ5QXJyYXksXG5BQlNFTlQsXG4obGVmdFZhbHVlLHJpZ2h0VmFsdWUpPT57XG5pZihsZWZ0VmFsdWU9PT1BQlNFTlQmJnJpZ2h0VmFsdWU9PT1BQlNFTlQpe1xudGhyb3cgRmFpbCBgSW50ZXJuYWw6IFVuZXhwZWN0ZWQgYWJzZW50IGVudHJ5IHBhaXJgO1xuIH1lbHNlIGlmKGxlZnRWYWx1ZT09PUFCU0VOVCl7XG5yZXR1cm4tMTtcbiB9ZWxzZSBpZihyaWdodFZhbHVlPT09QUJTRU5UKXtcbnJldHVybiAxO1xuIH1lbHNle1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbnJldHVybiBjb21wYXJlS2V5cyhsZWZ0VmFsdWUscmlnaHRWYWx1ZSk7XG4gfVxuIH0pO1xuXG5oYXJkZW4oX21hcENvbXBhcmUpO1xuXG4vKiogQHR5cGUge1hpbXBvcnQoJy4uL3R5cGVzJykuS2V5Q29tcGFyZX0gKi9cbmNvbnN0ICAgICAgICBjb21wYXJlS2V5cz0obGVmdCxyaWdodCk9PntcbmFzc2VydEtleShsZWZ0KTtcbmFzc2VydEtleShyaWdodCk7XG5jb25zdCBsZWZ0U3R5bGU9cGFzc1N0eWxlT2YobGVmdCk7XG5jb25zdCByaWdodFN0eWxlPXBhc3NTdHlsZU9mKHJpZ2h0KTtcbmlmKGxlZnRTdHlsZSE9PXJpZ2h0U3R5bGUpe1xuLyogRGlmZmVyZW50IHBhc3NTdHlsZXMgYXJlIGluY29tbWVuc3VyYXRlKi9cbnJldHVybiBOYU47XG4gfVxuc3dpdGNoKGxlZnRTdHlsZSl7XG5jYXNlJ3VuZGVmaW5lZCc6XG5jYXNlJ251bGwnOlxuY2FzZSdib29sZWFuJzpcbmNhc2UnYmlnaW50JzpcbmNhc2Unc3RyaW5nJzpcbmNhc2Unc3ltYm9sJzp7XG4vKiBmb3IgdGhlc2UsIGtleXMgY29tcGFyZSB0aGUgc2FtZSBhcyByYW5rKi9cbnJldHVybiBjb21wYXJlUmFuayhsZWZ0LHJpZ2h0KTtcbiB9XG5jYXNlJ251bWJlcic6e1xuY29uc3QgcmFua0NvbXA9Y29tcGFyZVJhbmsobGVmdCxyaWdodCk7XG5pZihyYW5rQ29tcD09PTApe1xucmV0dXJuIDA7XG4gfVxuaWYoTnVtYmVyLmlzTmFOKGxlZnQpfHxOdW1iZXIuaXNOYU4ocmlnaHQpKXtcbi8qIE5hTiBpcyBlcXVhbCB0byBpdHNlbGYsIGJ1dCBpbmNvbW1lbnN1cmF0ZSB3aXRoIGV2ZXJ5dGhpbmcgZWxzZSovXG5hc3NlcnQoIU51bWJlci5pc05hTihsZWZ0KXx8IU51bWJlci5pc05hTihyaWdodCkpO1xucmV0dXJuIE5hTjtcbiB9XG4vKiBBbW9uZyBub24tTmFOIG51bWJlcnMsIGtleSBvcmRlciBpcyB0aGUgc2FtZSBhcyByYW5rIG9yZGVyLiBOb3RlIHRoYXQqL1xuLyogaW4gYm90aCBvcmRlcnMsIGAtMGAgaXMgaW4gdGhlIHNhbWUgZXF1aXZhbGVuY2UgY2xhc3MgYXMgYDBgLiovXG5yZXR1cm4gcmFua0NvbXA7XG4gfVxuY2FzZSdyZW1vdGFibGUnOntcbmlmKGxlZnQ9PT1yaWdodCl7XG5yZXR1cm4gMDtcbiB9XG4vKiBJZiB0d28gcmVtb3RhYmxlcyBhcmUgbm90IGlkZW50aWNhbCwgdGhlbiBhcyBrZXlzIHRoZXkgYXJlKi9cbi8qIGluY29tbWVuc3VyYXRlLiovXG5yZXR1cm4gTmFOO1xuIH1cbmNhc2UnY29weUFycmF5Jzp7XG4vKiBMZXhpY29ncmFwaGljIGJ5IGtleSBvcmRlci4gUmFuayBvcmRlciBvZiBhcnJheXMgaXMgbGV4aWNvZ3JhcGhpYyBieSovXG4vKiByYW5rIG9yZGVyLiovXG4vKiBCZWNhdXNlIHRoZSBpbnZhcmlhbnRzIGFib3ZlIGFwcGx5IHRvIHRoZSBlbGVtZW50cyBvZiB0aGUgYXJyYXksKi9cbi8qIHRoZXkgYXBwbHkgdG8gdGhlIGFycmF5IGFzIGEgd2hvbGUuKi9cbmNvbnN0IGxlbj1NYXRoLm1pbihsZWZ0Lmxlbmd0aCxyaWdodC5sZW5ndGgpO1xuZm9yKGxldCBpPTA7aTxsZW47aSs9MSl7XG5jb25zdCByZXN1bHQ9Y29tcGFyZUtleXMobGVmdFtpXSxyaWdodFtpXSk7XG5pZihyZXN1bHQhPT0wKXtcbnJldHVybiByZXN1bHQ7XG4gfVxuIH1cbi8qIElmIGFsbCBtYXRjaGluZyBlbGVtZW50cyBhcmUga2V5RVEsIHRoZW4gYWNjb3JkaW5nIHRvIHRoZWlyIGxlbmd0aHMuKi9cbi8qIFRodXMsIGlmIGFycmF5IFggaXMgYSBwcmVmaXggb2YgYXJyYXkgWSwgdGhlbiBYIGlzIHNtYWxsZXIgdGhhbiBZLiovXG5yZXR1cm4gY29tcGFyZVJhbmsobGVmdC5sZW5ndGgscmlnaHQubGVuZ3RoKTtcbiB9XG5jYXNlJ2NvcHlSZWNvcmQnOntcbi8qIFBhcmV0byBwYXJ0aWFsIG9yZGVyIGNvbXBhcmlzb24uKi9cbmNvbnN0IGxlZnROYW1lcz1yZWNvcmROYW1lcyhsZWZ0KTtcbmNvbnN0IHJpZ2h0TmFtZXM9cmVjb3JkTmFtZXMocmlnaHQpO1xuXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuaWYoIWtleUVRKGxlZnROYW1lcyxyaWdodE5hbWVzKSl7XG4vKiBJZiB0aGV5IGRvIG5vdCBoYXZlIGV4YWN0bHkgdGhlIHNhbWUgcHJvcGVydGllcywqL1xuLyogdGhleSBhcmUgaW5jb21tZW5zdXJhdGUuKi9cbi8qIE5vdGUgdGhhdCByYW5rIHNvcnRpbmcgb2YgY29weVJlY29yZHMgZ3JvdXBzIGFsbCBjb3B5UmVjb3JkcyB3aXRoKi9cbi8qIHRoZSBzYW1lIGtleXMgdG9nZXRoZXIsIGVuYWJsaW5nIHJhbmdlIHNlYXJjaGluZyBvdmVyIGNvcHlSZWNvcmRzKi9cbi8qIHRvIGF2b2lkIG1vcmUgaXJyZWxldmFudCBvbmVzLiovXG5yZXR1cm4gTmFOO1xuIH1cbmNvbnN0IGxlZnRWYWx1ZXM9cmVjb3JkVmFsdWVzKGxlZnQsbGVmdE5hbWVzKTtcbmNvbnN0IHJpZ2h0VmFsdWVzPXJlY29yZFZhbHVlcyhyaWdodCxyaWdodE5hbWVzKTtcbi8qIFByZXN1bWUgdGhhdCBib3RoIGNvcHlSZWNvcmRzIGhhdmUgdGhlIHNhbWUga2V5IG9yZGVyKi9cbi8qIHVudGlsIGVuY291bnRlcmluZyBhIHByb3BlcnR5IGRpc3Byb3ZpbmcgdGhhdCBoeXBvdGhlc2lzLiovXG5sZXQgcmVzdWx0PTA7XG5mb3IobGV0IGk9MDtpPGxlZnRWYWx1ZXMubGVuZ3RoO2krPTEpe1xuY29uc3QgY29tcD1jb21wYXJlS2V5cyhsZWZ0VmFsdWVzW2ldLHJpZ2h0VmFsdWVzW2ldKTtcbmlmKE51bWJlci5pc05hTihjb21wKSl7XG5yZXR1cm4gTmFOO1xuIH1cbmlmKHJlc3VsdCE9PWNvbXAmJmNvbXAhPT0wKXtcbmlmKHJlc3VsdD09PTApe1xucmVzdWx0PWNvbXA7XG4gfWVsc2V7XG5hc3NlcnQoXG5yZXN1bHQ9PT0tMSYmY29tcD09PTF8fHJlc3VsdD09PTEmJmNvbXA9PT0tMSk7XG5cbnJldHVybiBOYU47XG4gfVxuIH1cbiB9XG4vKiBJZiBjb3B5UmVjb3JkIFggaXMgc21hbGxlciB0aGFuIGNvcHlSZWNvcmQgWSwgdGhlbiB0aGV5IG11c3QgaGF2ZSB0aGUqL1xuLyogc2FtZSBwcm9wZXJ0eSBuYW1lcyBhbmQgZXZlcnkgdmFsdWUgaW4gWCBtdXN0IGJlIHNtYWxsZXIgb3IgZXF1YWwgdG8qL1xuLyogdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgaW4gWSAod2l0aCBhdCBsZWFzdCBvbmUgdmFsdWUgc21hbGxlcikuKi9cbi8qIFRoZSByYW5rIG9yZGVyIG9mIFggYW5kIFkgaXMgYmFzZWQgb24gbGV4aWNvZ3JhcGhpYyByYW5rIG9yZGVyIG9mKi9cbi8qIHRoZWlyIHZhbHVlcywgYXMgb3JnYW5pemVkIGJ5IHJldmVyc2UgbGV4aWNvZ3JhcGhpYyBvcmRlciBvZiB0aGVpciovXG4vKiBwcm9wZXJ0eSBuYW1lcy4qL1xuLyogVGh1cyBpZiBjb21wYXJlS2V5cyhYLFkpIDwgMCB0aGVuIGNvbXBhcmVSYW5rKFgsWSkgPCAwLiovXG5yZXR1cm4gcmVzdWx0O1xuIH1cbmNhc2UndGFnZ2VkJzp7XG5jb25zdCBsZWZ0VGFnPWdldFRhZyhsZWZ0KTtcbmNvbnN0IHJpZ2h0VGFnPWdldFRhZyhyaWdodCk7XG5pZihsZWZ0VGFnIT09cmlnaHRUYWcpe1xuLyogZGlmZmVyZW50IHRhZ3MgYXJlIGluY29tbWVuc3VyYXRlKi9cbnJldHVybiBOYU47XG4gfVxuc3dpdGNoKGxlZnRUYWcpe1xuY2FzZSdjb3B5U2V0Jzp7XG5yZXR1cm4gc2V0Q29tcGFyZShsZWZ0LHJpZ2h0KTtcbiB9XG5jYXNlJ2NvcHlCYWcnOntcbnJldHVybiBiYWdDb21wYXJlKGxlZnQscmlnaHQpO1xuIH1cbmNhc2UnY29weU1hcCc6e1xuLyogVE9ETyBUaGUgZGVzaXJlZCBzZW1hbnRpY3MgZm9yIENvcHlNYXAgY29tcGFyaXNvbiBoYXZlIG5vdCB5ZXQgYmVlbiBkZWNpZGVkLiovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL3B1bGwvMTczNyNwdWxscmVxdWVzdHJldmlldy0xNTk2NTk1NDExKi9cbnRocm93IEZhaWwgYE1hcCBjb21wYXJpc29uIG5vdCB5ZXQgaW1wbGVtZW50ZWQ6ICR7bGVmdH0gdnMgJHtyaWdodH1gO1xuIH1cbmRlZmF1bHQ6e1xudGhyb3cgRmFpbCBgdW5leHBlY3RlZCB0YWcgJHtxKGxlZnRUYWcpfTogJHtsZWZ0fWA7XG4gfX1cblxuIH1cbmRlZmF1bHQ6e1xudGhyb3cgRmFpbCBgdW5leHBlY3RlZCBwYXNzU3R5bGUgJHtxKGxlZnRTdHlsZSl9OiAke2xlZnR9YDtcbiB9fVxuXG4gfTskaOKAjV9vbmNlLmNvbXBhcmVLZXlzKGNvbXBhcmVLZXlzKTtcbmhhcmRlbihjb21wYXJlS2V5cyk7XG5cbmNvbnN0ICAgICAgICBrZXlMVD0obGVmdCxyaWdodCk9PmNvbXBhcmVLZXlzKGxlZnQscmlnaHQpPDA7JGjigI1fb25jZS5rZXlMVChrZXlMVCk7XG5oYXJkZW4oa2V5TFQpO1xuXG5jb25zdCAgICAgICAga2V5TFRFPShsZWZ0LHJpZ2h0KT0+Y29tcGFyZUtleXMobGVmdCxyaWdodCk8PTA7JGjigI1fb25jZS5rZXlMVEUoa2V5TFRFKTtcbmhhcmRlbihrZXlMVEUpO1xuXG5jb25zdCAgICAgICAga2V5RVE9KGxlZnQscmlnaHQpPT5jb21wYXJlS2V5cyhsZWZ0LHJpZ2h0KT09PTA7JGjigI1fb25jZS5rZXlFUShrZXlFUSk7XG5oYXJkZW4oa2V5RVEpO1xuXG5jb25zdCAgICAgICAga2V5R1RFPShsZWZ0LHJpZ2h0KT0+Y29tcGFyZUtleXMobGVmdCxyaWdodCk+PTA7JGjigI1fb25jZS5rZXlHVEUoa2V5R1RFKTtcbmhhcmRlbihrZXlHVEUpO1xuXG5jb25zdCAgICAgICAga2V5R1Q9KGxlZnQscmlnaHQpPT5jb21wYXJlS2V5cyhsZWZ0LHJpZ2h0KT4wOyRo4oCNX29uY2Uua2V5R1Qoa2V5R1QpO1xuaGFyZGVuKGtleUdUKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJzZXRDb21wYXJlIjpbInNldENvbXBhcmUiXSwiYmFnQ29tcGFyZSI6WyJiYWdDb21wYXJlIl0sImNvbXBhcmVLZXlzIjpbImNvbXBhcmVLZXlzIl0sImtleUxUIjpbImtleUxUIl0sImtleUxURSI6WyJrZXlMVEUiXSwia2V5RVEiOlsia2V5RVEiXSwia2V5R1RFIjpbImtleUdURSJdLCJrZXlHVCI6WyJrZXlHVCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABVIML9KhQAACoUAAApAAAAQGVuZG8vcGF0dGVybnMtdjAuMi42L3NyYy9rZXlzL2NvcHlCYWcuanN7ImltcG9ydHMiOlsiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbImFzc2VydEJhZ0VudHJpZXMiLCJhc3NlcnROb0R1cGxpY2F0ZUtleXMiLCJjaGVja0JhZ0VudHJpZXMiLCJjb2VyY2VUb0JhZ0VudHJpZXMiLCJtYWtlQmFnT2ZFbnRyaWVzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydENoZWNrZXIsbWFrZVRhZ2dlZCxwYXNzU3R5bGVPZixjb21wYXJlQW50aVJhbmssaXNSYW5rU29ydGVkLG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0LHNvcnRCeVJhbms7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRo4oCNX2EpXV0sW1wibWFrZVRhZ2dlZFwiLCBbJGjigI1fYSA9PiAobWFrZVRhZ2dlZCA9ICRo4oCNX2EpXV0sW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXSxbXCJjb21wYXJlQW50aVJhbmtcIiwgWyRo4oCNX2EgPT4gKGNvbXBhcmVBbnRpUmFuayA9ICRo4oCNX2EpXV0sW1wiaXNSYW5rU29ydGVkXCIsIFskaOKAjV9hID0+IChpc1JhbmtTb3J0ZWQgPSAkaOKAjV9hKV1dLFtcIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0XCIsIFskaOKAjV9hID0+IChtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCA9ICRo4oCNX2EpXV0sW1wic29ydEJ5UmFua1wiLCBbJGjigI1fYSA9PiAoc29ydEJ5UmFuayA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuLyovIDxyZWZlcmVuY2UgdHlwZXM9XCJzZXNcIi8+Ki9cblxuY29uc3R7ZGV0YWlsczpYfT1hc3NlcnQ7XG5cbi8qKiBAdGVtcGxhdGUge0tleX0gW0s9S2V5XSBAdHlwZWRlZiB7WGltcG9ydCgnLi4vdHlwZXMnKS5Db3B5QmFnPEs+fSBDb3B5QmFnICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4uL3R5cGVzJykuS2V5fSBLZXkgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi4vdHlwZXMnKS5GdWxsQ29tcGFyZX0gRnVsbENvbXBhcmUgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vbWFyc2hhbCcpLkNoZWNrZXJ9IENoZWNrZXIgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vcGFzcy1zdHlsZScpLlBhc3NhYmxlfSBQYXNzYWJsZSAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1tULGJpZ2ludF1bXX0gYmFnRW50cmllc1xuICogQHBhcmFtIHtGdWxsQ29tcGFyZSB8IHVuZGVmaW5lZH0gZnVsbENvbXBhcmUgSWYgcHJvdmlkZWQgYW5kIGBiYWdFbnRyaWVzYCBpcyBhbHJlYWR5XG4gKiBrbm93biB0byBiZSBzb3J0ZWQgYnkgdGhpcyBgZnVsbENvbXBhcmVgLCB0aGVuIHdlIHNob3VsZCBnZXQgYSBtZW1vIGhpdFxuICogcmF0aGVyIHRoYW4gYSByZXNvcnRpbmcuIEhvd2V2ZXIsIGN1cnJlbnRseSwgd2Ugc3RpbGwgZW51bWVyYXRlIHRoZSBlbnRpcmVcbiAqIGFycmF5IGVhY2ggdGltZS5cbiAqXG4gKiBUT0RPOiBJZiBkb2luZyB0aGlzIHJlZHVudGFudGx5IHR1cm5zIG91dCB0byBiZSBleHBlbnNpdmUsIHdlXG4gKiBjb3VsZCBtZW1vaXplIHRoaXMgbm8tZHVwbGljYXRlLWtleXMgZmluZGluZyBhcyB3ZWxsLCBpbmRlcGVuZGVudFxuICogb2YgdGhlIGBmdWxsT3JkZXJgIHVzZSB0byByZWFjaCB0aGlzIGZpbmRpbmcuXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tOb0R1cGxpY2F0ZUtleXM9KGJhZ0VudHJpZXMsZnVsbENvbXBhcmUsY2hlY2spPT57XG4vKiBUaGlzIGZ1bGxPcmRlciBjb250YWlucyBoaXN0b3J5IGRlcGVuZGVudCBzdGF0ZS4gSXQgaXMgc3BlY2lmaWMqL1xuLyogdG8gdGhpcyBvbmUgY2FsbCBhbmQgZG9lcyBub3Qgc3Vydml2ZSBpdC4qL1xuLyogVE9ETyBPbmNlIGFsbCBvdXIgdG9vbGluZyBpcyByZWFkeSBmb3IgYCYmPWAsIHRoZSBmb2xsb3dpbmcqL1xuLyogbGluZSBzaG91bGQgYmUgcmV3cml0dGVuIHVzaW5nIGl0LiovXG5mdWxsQ29tcGFyZT1mdWxsQ29tcGFyZXx8bWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQoKS5hbnRpQ29tcGFyYXRvcjtcblxuLyogU2luY2UgdGhlIGtleSBpcyBtb3JlIHNpZ25pZmljYW50IHRoYW4gdGhlIHZhbHVlICh0aGUgY291bnQpLCovXG4vKiBzb3J0aW5nIGJ5IGZ1bGxPcmRlciBpcyBndWFyYW50ZWVkIHRvIG1ha2UgZHVwbGljYXRlIGtleXMqL1xuLyogYWRqYWNlbnQgaW5kZXBlbmRlbnQgb2YgdGhlaXIgY291bnRzLiovXG5iYWdFbnRyaWVzPXNvcnRCeVJhbmsoYmFnRW50cmllcyxmdWxsQ29tcGFyZSk7XG5jb25zdHtsZW5ndGh9PWJhZ0VudHJpZXM7XG5mb3IobGV0IGk9MTtpPGxlbmd0aDtpKz0xKXtcbmNvbnN0IGswPWJhZ0VudHJpZXNbaS0xXVswXTtcbmNvbnN0IGsxPWJhZ0VudHJpZXNbaV1bMF07XG5pZihmdWxsQ29tcGFyZShrMCxrMSk9PT0wKXtcbnJldHVybiBjaGVjayhmYWxzZSxYIGB2YWx1ZSBoYXMgZHVwbGljYXRlIGtleXM6ICR7azB9YCk7XG4gfVxuIH1cbnJldHVybiB0cnVlO1xuIH07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7W1QsYmlnaW50XVtdfSBiYWdFbnRyaWVzXG4gKiBAcGFyYW0ge0Z1bGxDb21wYXJlfSBbZnVsbENvbXBhcmVdXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuY29uc3QgICAgICAgIGFzc2VydE5vRHVwbGljYXRlS2V5cz0oYmFnRW50cmllcyxmdWxsQ29tcGFyZT11bmRlZmluZWQpPT57XG5jaGVja05vRHVwbGljYXRlS2V5cyhiYWdFbnRyaWVzLGZ1bGxDb21wYXJlLGFzc2VydENoZWNrZXIpO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtbUGFzc2FibGUsYmlnaW50XVtdfSBiYWdFbnRyaWVzXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqLyRo4oCNX29uY2UuYXNzZXJ0Tm9EdXBsaWNhdGVLZXlzKGFzc2VydE5vRHVwbGljYXRlS2V5cyk7XG5jb25zdCAgICAgICAgY2hlY2tCYWdFbnRyaWVzPShiYWdFbnRyaWVzLGNoZWNrKT0+e1xuaWYocGFzc1N0eWxlT2YoYmFnRW50cmllcykhPT0nY29weUFycmF5Jyl7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYFRoZSBlbnRyaWVzIG9mIGEgY29weUJhZyBtdXN0IGJlIGEgY29weUFycmF5OiAke2JhZ0VudHJpZXN9YCk7XG5cbiB9XG5pZighaXNSYW5rU29ydGVkKGJhZ0VudHJpZXMsY29tcGFyZUFudGlSYW5rKSl7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYFRoZSBlbnRyaWVzIG9mIGEgY29weUJhZyBtdXN0IGJlIHNvcnRlZCBpbiByZXZlcnNlIHJhbmsgb3JkZXI6ICR7YmFnRW50cmllc31gKTtcblxuIH1cbmZvcihjb25zdCBlbnRyeSBvZiBiYWdFbnRyaWVzKXtcbmlmKFxucGFzc1N0eWxlT2YoZW50cnkpIT09J2NvcHlBcnJheSd8fFxuZW50cnkubGVuZ3RoIT09Mnx8XG50eXBlb2YgZW50cnlbMV0hPT0nYmlnaW50JylcbntcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgRWFjaCBlbnRyeSBvZiBhIGNvcHlCYWcgbXVzdCBiZSBwYWlyIG9mIGEga2V5IGFuZCBhIGJpZ2ludCByZXByZXNlbnRpbmcgYSBjb3VudDogJHtlbnRyeX1gKTtcblxuIH1cbmlmKGVudHJ5WzFdPDEpe1xucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGBFYWNoIGVudHJ5IG9mIGEgY29weUJhZyBtdXN0IGhhdmUgYSBwb3NpdGl2ZSBjb3VudDogJHtlbnRyeX1gKTtcblxuIH1cbiB9XG5yZXR1cm4gY2hlY2tOb0R1cGxpY2F0ZUtleXMoYmFnRW50cmllcyx1bmRlZmluZWQsY2hlY2spO1xuIH07JGjigI1fb25jZS5jaGVja0JhZ0VudHJpZXMoY2hlY2tCYWdFbnRyaWVzKTtcbmhhcmRlbihjaGVja0JhZ0VudHJpZXMpO1xuXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUganNkb2MvcmVxdWlyZS1yZXR1cm5zLWNoZWNrIC0tIGRvZXNuJ3QgdW5kZXJzdGFuZCBhc3NlcnRzKi9cbi8qKlxuICogQHBhcmFtIHtbUGFzc2FibGUsYmlnaW50XVtdfSBiYWdFbnRyaWVzXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBiYWdFbnRyaWVzIGlzIFtQYXNzYWJsZSxiaWdpbnRdW119XG4gKi9cbmNvbnN0ICAgICAgICBhc3NlcnRCYWdFbnRyaWVzPShiYWdFbnRyaWVzKT0+e1xuY2hlY2tCYWdFbnRyaWVzKGJhZ0VudHJpZXMsYXNzZXJ0Q2hlY2tlcik7XG4gfTskaOKAjV9vbmNlLmFzc2VydEJhZ0VudHJpZXMoYXNzZXJ0QmFnRW50cmllcyk7XG5oYXJkZW4oYXNzZXJ0QmFnRW50cmllcyk7XG5cbmNvbnN0ICAgICAgICBjb2VyY2VUb0JhZ0VudHJpZXM9KGJhZ0VudHJpZXNMaXN0KT0+e1xuY29uc3QgYmFnRW50cmllcz1zb3J0QnlSYW5rKGJhZ0VudHJpZXNMaXN0LGNvbXBhcmVBbnRpUmFuayk7XG5hc3NlcnRCYWdFbnRyaWVzKGJhZ0VudHJpZXMpO1xucmV0dXJuIGJhZ0VudHJpZXM7XG4gfTskaOKAjV9vbmNlLmNvZXJjZVRvQmFnRW50cmllcyhjb2VyY2VUb0JhZ0VudHJpZXMpO1xuaGFyZGVuKGNvZXJjZVRvQmFnRW50cmllcyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIEtcbiAqIEBwYXJhbSB7SXRlcmFibGU8W0ssIGJpZ2ludF0+fSBiYWdFbnRyeUl0ZXJcbiAqIEByZXR1cm5zIHtDb3B5QmFnPEs+fVxuICovXG5jb25zdCAgICAgICAgbWFrZUJhZ09mRW50cmllcz0oYmFnRW50cnlJdGVyKT0+XG5tYWtlVGFnZ2VkKCdjb3B5QmFnJyxjb2VyY2VUb0JhZ0VudHJpZXMoYmFnRW50cnlJdGVyKSk7JGjigI1fb25jZS5tYWtlQmFnT2ZFbnRyaWVzKG1ha2VCYWdPZkVudHJpZXMpO1xuaGFyZGVuKG1ha2VCYWdPZkVudHJpZXMpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImFzc2VydE5vRHVwbGljYXRlS2V5cyI6WyJhc3NlcnROb0R1cGxpY2F0ZUtleXMiXSwiY2hlY2tCYWdFbnRyaWVzIjpbImNoZWNrQmFnRW50cmllcyJdLCJhc3NlcnRCYWdFbnRyaWVzIjpbImFzc2VydEJhZ0VudHJpZXMiXSwiY29lcmNlVG9CYWdFbnRyaWVzIjpbImNvZXJjZVRvQmFnRW50cmllcyJdLCJtYWtlQmFnT2ZFbnRyaWVzIjpbIm1ha2VCYWdPZkVudHJpZXMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAmHXkr6cQAACnEAAAKQAAAEBlbmRvL3BhdHRlcm5zLXYwLjIuNi9zcmMva2V5cy9jb3B5U2V0LmpzeyJpbXBvcnRzIjpbIkBlbmRvL21hcnNoYWwiXSwiZXhwb3J0cyI6WyJhc3NlcnRFbGVtZW50cyIsImFzc2VydE5vRHVwbGljYXRlcyIsImNoZWNrRWxlbWVudHMiLCJjb2VyY2VUb0VsZW1lbnRzIiwibWFrZVNldE9mRWxlbWVudHMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0Q2hlY2tlcixtYWtlVGFnZ2VkLHBhc3NTdHlsZU9mLGNvbXBhcmVBbnRpUmFuayxpc1JhbmtTb3J0ZWQsbWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQsc29ydEJ5UmFuazskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsIFskaOKAjV9hID0+IChhc3NlcnRDaGVja2VyID0gJGjigI1fYSldXSxbXCJtYWtlVGFnZ2VkXCIsIFskaOKAjV9hID0+IChtYWtlVGFnZ2VkID0gJGjigI1fYSldXSxbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlT2YgPSAkaOKAjV9hKV1dLFtcImNvbXBhcmVBbnRpUmFua1wiLCBbJGjigI1fYSA9PiAoY29tcGFyZUFudGlSYW5rID0gJGjigI1fYSldXSxbXCJpc1JhbmtTb3J0ZWRcIiwgWyRo4oCNX2EgPT4gKGlzUmFua1NvcnRlZCA9ICRo4oCNX2EpXV0sW1wibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0ID0gJGjigI1fYSldXSxbXCJzb3J0QnlSYW5rXCIsIFskaOKAjV9hID0+IChzb3J0QnlSYW5rID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG4vKi8gPHJlZmVyZW5jZSB0eXBlcz1cInNlc1wiLz4qL1xuXG5jb25zdHtkZXRhaWxzOlh9PWFzc2VydDtcblxuLyoqIEB0ZW1wbGF0ZSB7S2V5fSBbSz1LZXldIEB0eXBlZGVmIHtYaW1wb3J0KCcuLi90eXBlcycpLkNvcHlTZXQ8Sz59IENvcHlTZXQgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi4vdHlwZXMnKS5LZXl9IEtleSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuLi90eXBlcycpLkZ1bGxDb21wYXJlfSBGdWxsQ29tcGFyZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9tYXJzaGFsJykuQ2hlY2tlcn0gQ2hlY2tlciAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9wYXNzLXN0eWxlJykuUGFzc2FibGV9IFBhc3NhYmxlICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7VFtdfSBlbGVtZW50c1xuICogQHBhcmFtIHtGdWxsQ29tcGFyZSB8IHVuZGVmaW5lZH0gZnVsbENvbXBhcmUgSWYgcHJvdmlkZWQgYW5kIGBlbGVtZW50c2AgaXMgYWxyZWFkeSBrbm93blxuICogdG8gYmUgc29ydGVkIGJ5IHRoaXMgYGZ1bGxDb21wYXJlYCwgdGhlbiB3ZSBzaG91bGQgZ2V0IGEgbWVtbyBoaXQgcmF0aGVyXG4gKiB0aGFuIGEgcmVzb3J0aW5nLiBIb3dldmVyLCBjdXJyZW50bHksIHdlIHN0aWxsIGVudW1lcmF0ZSB0aGUgZW50aXJlIGFycmF5XG4gKiBlYWNoIHRpbWUuXG4gKlxuICogVE9ETzogSWYgZG9pbmcgdGhpcyByZWR1bnRhbnRseSB0dXJucyBvdXQgdG8gYmUgZXhwZW5zaXZlLCB3ZVxuICogY291bGQgbWVtb2l6ZSB0aGlzIG5vLWR1cGxpY2F0ZSBmaW5kaW5nIGFzIHdlbGwsIGluZGVwZW5kZW50XG4gKiBvZiB0aGUgYGZ1bGxPcmRlcmAgdXNlIHRvIHJlYWNoIHRoaXMgZmluZGluZy5cbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjaGVja05vRHVwbGljYXRlcz0oZWxlbWVudHMsZnVsbENvbXBhcmUsY2hlY2spPT57XG4vKiBUaGlzIGZ1bGxPcmRlciBjb250YWlucyBoaXN0b3J5IGRlcGVuZGVudCBzdGF0ZS4gSXQgaXMgc3BlY2lmaWMqL1xuLyogdG8gdGhpcyBvbmUgY2FsbCBhbmQgZG9lcyBub3Qgc3Vydml2ZSBpdC4qL1xuLyogVE9ETyBPbmNlIGFsbCBvdXIgdG9vbGluZyBpcyByZWFkeSBmb3IgYCYmPWAsIHRoZSBmb2xsb3dpbmcqL1xuLyogbGluZSBzaG91bGQgYmUgcmV3cml0dGVuIHVzaW5nIGl0LiovXG5mdWxsQ29tcGFyZT1mdWxsQ29tcGFyZXx8bWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQoKS5hbnRpQ29tcGFyYXRvcjtcblxuZWxlbWVudHM9c29ydEJ5UmFuayhlbGVtZW50cyxmdWxsQ29tcGFyZSk7XG5jb25zdHtsZW5ndGh9PWVsZW1lbnRzO1xuZm9yKGxldCBpPTE7aTxsZW5ndGg7aSs9MSl7XG5jb25zdCBrMD1lbGVtZW50c1tpLTFdO1xuY29uc3QgazE9ZWxlbWVudHNbaV07XG5pZihmdWxsQ29tcGFyZShrMCxrMSk9PT0wKXtcbnJldHVybiBjaGVjayhmYWxzZSxYIGB2YWx1ZSBoYXMgZHVwbGljYXRlIGtleXM6ICR7azB9YCk7XG4gfVxuIH1cbnJldHVybiB0cnVlO1xuIH07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7VFtdfSBlbGVtZW50c1xuICogQHBhcmFtIHtGdWxsQ29tcGFyZX0gW2Z1bGxDb21wYXJlXVxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmNvbnN0ICAgICAgICBhc3NlcnROb0R1cGxpY2F0ZXM9KGVsZW1lbnRzLGZ1bGxDb21wYXJlPXVuZGVmaW5lZCk9PntcbmNoZWNrTm9EdXBsaWNhdGVzKGVsZW1lbnRzLGZ1bGxDb21wYXJlLGFzc2VydENoZWNrZXIpO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZVtdfSBlbGVtZW50c1xuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi8kaOKAjV9vbmNlLmFzc2VydE5vRHVwbGljYXRlcyhhc3NlcnROb0R1cGxpY2F0ZXMpO1xuY29uc3QgICAgICAgIGNoZWNrRWxlbWVudHM9KGVsZW1lbnRzLGNoZWNrKT0+e1xuaWYocGFzc1N0eWxlT2YoZWxlbWVudHMpIT09J2NvcHlBcnJheScpe1xucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGBUaGUga2V5cyBvZiBhIGNvcHlTZXQgb3IgY29weU1hcCBtdXN0IGJlIGEgY29weUFycmF5OiAke2VsZW1lbnRzfWApO1xuXG4gfVxuaWYoIWlzUmFua1NvcnRlZChlbGVtZW50cyxjb21wYXJlQW50aVJhbmspKXtcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgVGhlIGtleXMgb2YgYSBjb3B5U2V0IG9yIGNvcHlNYXAgbXVzdCBiZSBzb3J0ZWQgaW4gcmV2ZXJzZSByYW5rIG9yZGVyOiAke2VsZW1lbnRzfWApO1xuXG4gfVxucmV0dXJuIGNoZWNrTm9EdXBsaWNhdGVzKGVsZW1lbnRzLHVuZGVmaW5lZCxjaGVjayk7XG4gfTskaOKAjV9vbmNlLmNoZWNrRWxlbWVudHMoY2hlY2tFbGVtZW50cyk7XG5oYXJkZW4oY2hlY2tFbGVtZW50cyk7XG5cbmNvbnN0ICAgICAgICBhc3NlcnRFbGVtZW50cz0oZWxlbWVudHMpPT57XG5jaGVja0VsZW1lbnRzKGVsZW1lbnRzLGFzc2VydENoZWNrZXIpO1xuIH07JGjigI1fb25jZS5hc3NlcnRFbGVtZW50cyhhc3NlcnRFbGVtZW50cyk7XG5oYXJkZW4oYXNzZXJ0RWxlbWVudHMpO1xuXG5jb25zdCAgICAgICAgY29lcmNlVG9FbGVtZW50cz0oZWxlbWVudHNMaXN0KT0+e1xuY29uc3QgZWxlbWVudHM9c29ydEJ5UmFuayhlbGVtZW50c0xpc3QsY29tcGFyZUFudGlSYW5rKTtcbmFzc2VydEVsZW1lbnRzKGVsZW1lbnRzKTtcbnJldHVybiBlbGVtZW50cztcbiB9OyRo4oCNX29uY2UuY29lcmNlVG9FbGVtZW50cyhjb2VyY2VUb0VsZW1lbnRzKTtcbmhhcmRlbihjb2VyY2VUb0VsZW1lbnRzKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgS1xuICogQHBhcmFtIHtJdGVyYWJsZTxLPn0gZWxlbWVudEl0ZXJcbiAqIEByZXR1cm5zIHtDb3B5U2V0PEs+fVxuICovXG5jb25zdCAgICAgICAgbWFrZVNldE9mRWxlbWVudHM9KGVsZW1lbnRJdGVyKT0+XG5tYWtlVGFnZ2VkKCdjb3B5U2V0Jyxjb2VyY2VUb0VsZW1lbnRzKGVsZW1lbnRJdGVyKSk7JGjigI1fb25jZS5tYWtlU2V0T2ZFbGVtZW50cyhtYWtlU2V0T2ZFbGVtZW50cyk7XG5oYXJkZW4obWFrZVNldE9mRWxlbWVudHMpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImFzc2VydE5vRHVwbGljYXRlcyI6WyJhc3NlcnROb0R1cGxpY2F0ZXMiXSwiY2hlY2tFbGVtZW50cyI6WyJjaGVja0VsZW1lbnRzIl0sImFzc2VydEVsZW1lbnRzIjpbImFzc2VydEVsZW1lbnRzIl0sImNvZXJjZVRvRWxlbWVudHMiOlsiY29lcmNlVG9FbGVtZW50cyJdLCJtYWtlU2V0T2ZFbGVtZW50cyI6WyJtYWtlU2V0T2ZFbGVtZW50cyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAyCIKnIh8AACIfAAA5AAAAQGVuZG8vcGF0dGVybnMtdjAuMi42L3NyYy9rZXlzL2tleWNvbGxlY3Rpb24tb3BlcmF0b3JzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL21hcnNoYWwiLCIuLi91dGlscy5qcyJdLCJleHBvcnRzIjpbImdlbmVyYXRlQ29sbGVjdGlvblBhaXJFbnRyaWVzIiwibWFrZUNvbXBhcmVDb2xsZWN0aW9uIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydFJhbmtTb3J0ZWQsY29tcGFyZUFudGlSYW5rLG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0LHNvcnRCeVJhbmssbWFrZUl0ZXJhdG9yLG1ha2VBcnJheUl0ZXJhdG9yOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcImFzc2VydFJhbmtTb3J0ZWRcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFJhbmtTb3J0ZWQgPSAkaOKAjV9hKV1dLFtcImNvbXBhcmVBbnRpUmFua1wiLCBbJGjigI1fYSA9PiAoY29tcGFyZUFudGlSYW5rID0gJGjigI1fYSldXSxbXCJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdFwiLCBbJGjigI1fYSA9PiAobWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQgPSAkaOKAjV9hKV1dLFtcInNvcnRCeVJhbmtcIiwgWyRo4oCNX2EgPT4gKHNvcnRCeVJhbmsgPSAkaOKAjV9hKV1dXV0sW1wiLi4vdXRpbHMuanNcIiwgW1tcIm1ha2VJdGVyYXRvclwiLCBbJGjigI1fYSA9PiAobWFrZUl0ZXJhdG9yID0gJGjigI1fYSldXSxbXCJtYWtlQXJyYXlJdGVyYXRvclwiLCBbJGjigI1fYSA9PiAobWFrZUFycmF5SXRlcmF0b3IgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL21hcnNoYWwnKS5SYW5rQ29tcGFyZX0gUmFua0NvbXBhcmUgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi4vdHlwZXMnKS5LZXlDb21wYXJpc29ufSBLZXlDb21wYXJpc29uICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4uL3R5cGVzJykuS2V5Q29tcGFyZX0gS2V5Q29tcGFyZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuLi90eXBlcycpLkZ1bGxDb21wYXJlfSBGdWxsQ29tcGFyZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuLi90eXBlcycpLktleUNvbGxlY3Rpb259IEtleUNvbGxlY3Rpb24gKi9cblxuY29uc3R7cXVvdGU6cSxGYWlsfT1hc3NlcnQ7XG5cbi8qKlxuICogUmVmaW5lcyBhIHNlcXVlbmNlIG9mIGVudHJpZXMgdGhhdCBpcyBhbHJlYWR5IHNvcnRlZCBvdmVyIGl0cyBrZXlzIGJ5IHRoZVxuICogYHJhbmtDb21wYXJlYCBwcmVvcmRlciwgd2hlcmUgdGhlcmUgbWF5IGJlIGludGVybmFsIHJ1bnMgdGllZCBmb3IgdGhlIHNhbWVcbiAqIHJhbmssIGludG8gYW4gaXRlcmFibGUgdGhhdCByZXNvbHZlcyB0aG9zZSB0aWVzIHVzaW5nIGBmdWxsQ29tcGFyZWAuXG4gKlxuICogQHRlbXBsYXRlIFtWPXVua25vd25dXG4gKiBAcGFyYW0ge0FycmF5PFtLZXksIFZdPn0gZW50cmllc1xuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gcmFua0NvbXBhcmVcbiAqIEBwYXJhbSB7RnVsbENvbXBhcmV9IGZ1bGxDb21wYXJlXG4gKiBAcmV0dXJucyB7SXRlcmFibGVJdGVyYXRvcjxbS2V5LCBWXT59XG4gKi9cbmNvbnN0IGdlbmVyYXRlRnVsbFNvcnRlZEVudHJpZXM9KGVudHJpZXMscmFua0NvbXBhcmUsZnVsbENvbXBhcmUpPT57XG5hc3NlcnRSYW5rU29ydGVkKGVudHJpZXMscmFua0NvbXBhcmUpO1xuY29uc3R7bGVuZ3RofT1lbnRyaWVzO1xubGV0IGk9MDtcbmxldCBzYW1lUmFua0l0ZXJhdG9yO1xucmV0dXJuIG1ha2VJdGVyYXRvcigoKT0+e1xuaWYoc2FtZVJhbmtJdGVyYXRvcil7XG5jb25zdCByZXN1bHQ9c2FtZVJhbmtJdGVyYXRvci5uZXh0KCk7XG5pZighcmVzdWx0LmRvbmUpe1xucmV0dXJuIHJlc3VsdDtcbiB9XG5zYW1lUmFua0l0ZXJhdG9yPXVuZGVmaW5lZDtcbiB9XG5pZihpPGxlbmd0aCl7XG5jb25zdCBlbnRyeT1lbnRyaWVzW2ldO1xuLyogTG9vayBhaGVhZCBmb3Igc2FtZS1yYW5rIHRpZXMuKi9cbmxldCBqPWkrMTtcbndoaWxlKGo8bGVuZ3RoJiZyYW5rQ29tcGFyZShlbnRyeVswXSxlbnRyaWVzW2pdWzBdKT09PTApe1xuais9MTtcbiB9XG5pZihqPT09aSsxKXtcbi8qIE5vIHRpZXMgZm91bmQuKi9cbmk9ajtcbnJldHVybiBoYXJkZW4oe2RvbmU6ZmFsc2UsdmFsdWU6ZW50cnl9KTtcbiB9XG5jb25zdCB0aWVzPWVudHJpZXMuc2xpY2UoaSxqKTtcbmk9ajtcblxuLyogU29ydCB0aGUgdGllcyBieSBgZnVsbENvbXBhcmVgLCBlbmZvcmNlIGtleSB1bmlxdWVuZXNzLCBhbmQgZGVsZWdhdGUgdG8qL1xuLyogYSBzdWItaXRlcmF0b3IuKi9cbmNvbnN0IHNvcnRlZFRpZXM9c29ydEJ5UmFuayh0aWVzLGZ1bGxDb21wYXJlKTtcbmZvcihsZXQgaz0xO2s8c29ydGVkVGllcy5sZW5ndGg7ays9MSl7XG5jb25zdFtrZXkwXT1zb3J0ZWRUaWVzW2stMV07XG5jb25zdFtrZXkxXT1zb3J0ZWRUaWVzW2tdO1xuTWF0aC5zaWduKGZ1bGxDb21wYXJlKGtleTAsa2V5MSkpfHxcbkZhaWwgYER1cGxpY2F0ZSBlbnRyeSBrZXk6ICR7a2V5MH1gO1xuIH1cbnNhbWVSYW5rSXRlcmF0b3I9bWFrZUFycmF5SXRlcmF0b3Ioc29ydGVkVGllcyk7XG5yZXR1cm4gc2FtZVJhbmtJdGVyYXRvci5uZXh0KCk7XG4gfVxucmV0dXJuIGhhcmRlbih7ZG9uZTp0cnVlLHZhbHVlOnVuZGVmaW5lZH0pO1xuIH0pO1xuIH07XG5oYXJkZW4oZ2VuZXJhdGVGdWxsU29ydGVkRW50cmllcyk7XG5cbi8qKlxuICogUmV0dXJucyBhbiBpdGVyYXRvciB0aGF0IG1lcmdlcyByZXZlcnNlLXJhbmstc29ydGVkIFtrZXksIHZhbHVlXSBlbnRyaWVzIG9mXG4gKiB0d28gS2V5Q29sbGVjdGlvbnMgaW50byBhIHJldmVyc2UtZnVsbC1zb3J0ZWQgW2tleSwgdmFsdWUxLCB2YWx1ZTJdIGVudHJpZXNcbiAqIGJ5IHRoZSBrZXkgdGhleSBoYXZlIGluIGNvbW1vbiwgcmVwcmVzZW50aW5nIHRoZSB2YWx1ZSBmb3IgYW4gYWJzZW50IGVudHJ5IGluXG4gKiBlaXRoZXIgY29sbGVjdGlvbiBhcyBgYWJzZW50VmFsdWVgLlxuICpcbiAqIEB0ZW1wbGF0ZSBbQz1LZXlDb2xsZWN0aW9uXVxuICogQHRlbXBsYXRlIFtWPXVua25vd25dXG4gKiBAcGFyYW0ge0N9IGMxXG4gKiBAcGFyYW0ge0N9IGMyXG4gKiBAcGFyYW0geyhjb2xsZWN0aW9uOiBDKSA9PiBBcnJheTxbS2V5LCBWXT59IGdldEVudHJpZXNcbiAqIEBwYXJhbSB7YW55fSBhYnNlbnRWYWx1ZVxuICogQHJldHVybnMge0l0ZXJhYmxlSXRlcmF0b3I8W0tleSwgViB8IGFic2VudFZhbHVlLCBWIHwgYWJzZW50VmFsdWVdPn1cbiAqL1xuY29uc3QgICAgICAgIGdlbmVyYXRlQ29sbGVjdGlvblBhaXJFbnRyaWVzPShcbmMxLFxuYzIsXG5nZXRFbnRyaWVzLFxuYWJzZW50VmFsdWUpPT5cbntcbmNvbnN0IGUxPWdldEVudHJpZXMoYzEpO1xuY29uc3QgZTI9Z2V0RW50cmllcyhjMik7XG5cbi8qIEVzdGFibGlzaCBhIGhpc3RvcnktZGVwZW5kZW50IGNvbXBhcmlzb24gc2NvcGVkIHRvIHRoZSBhY3RpdmUgaW52b2NhdGlvbiovXG4vKiBhbmQgdXNlIGl0IHRvIG1hcCByZXZlcnNlLXByZW9yZGVyZWQgZW50cmllcyBpbnRvIGFuIGl0ZXJhdG9yIHdpdGggYSovXG4vKiBuYXJyb3dlciB0b3RhbCBvcmRlci4qL1xuY29uc3QgZnVsbENvbXBhcmU9bWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQoKS5hbnRpQ29tcGFyYXRvcjtcbmNvbnN0IHg9Z2VuZXJhdGVGdWxsU29ydGVkRW50cmllcyhlMSxjb21wYXJlQW50aVJhbmssZnVsbENvbXBhcmUpO1xuY29uc3QgeT1nZW5lcmF0ZUZ1bGxTb3J0ZWRFbnRyaWVzKGUyLGNvbXBhcmVBbnRpUmFuayxmdWxsQ29tcGFyZSk7XG5cbi8qIE1haW50YWluIGEgc2luZ2xlLXJlc3VsdCB7IGRvbmUsIGtleSwgdmFsdWUgfSBidWZmZXIgZm9yIGVhY2ggaXRlcmF0b3IqL1xuLyogc28gdGhleSBjYW4gYmUgbWVyZ2VkLiovXG5sZXQgeERvbmU7XG5sZXQgeEtleTtcbmxldCB4VmFsdWU7XG5sZXQgeURvbmU7XG5sZXQgeUtleTtcbmxldCB5VmFsdWU7XG5jb25zdCBub25FbnRyeT1bdW5kZWZpbmVkLHVuZGVmaW5lZF07XG5jb25zdCBuZXh0WD0oKT0+e1xuIXhEb25lfHxGYWlsIGBJbnRlcm5hbDogbmV4dFggbXVzdCBub3QgYmUgY2FsbGVkIG9uY2UgZG9uZWA7XG5jb25zdCByZXN1bHQ9eFZhbHVlO1xuKHtkb25lOnhEb25lLHZhbHVlOlt4S2V5LHhWYWx1ZV09bm9uRW50cnl9PXgubmV4dCgpKTtcbnJldHVybiByZXN1bHQ7XG4gfTtcbm5leHRYKCk7XG5jb25zdCBuZXh0WT0oKT0+e1xuIXlEb25lfHxGYWlsIGBJbnRlcm5hbDogbmV4dFkgbXVzdCBub3QgYmUgY2FsbGVkIG9uY2UgZG9uZWA7XG5jb25zdCByZXN1bHQ9eVZhbHVlO1xuKHtkb25lOnlEb25lLHZhbHVlOlt5S2V5LHlWYWx1ZV09bm9uRW50cnl9PXkubmV4dCgpKTtcbnJldHVybiByZXN1bHQ7XG4gfTtcbm5leHRZKCk7XG5yZXR1cm4gbWFrZUl0ZXJhdG9yKCgpPT57XG5sZXQgZG9uZT1mYWxzZTtcbi8qKiBAdHlwZSB7W0tleSwgViB8IGFic2VudFZhbHVlLCBWIHwgYWJzZW50VmFsdWVdfSAqL1xubGV0IHZhbHVlO1xuaWYoeERvbmUmJnlEb25lKXtcbmRvbmU9dHJ1ZTtcbnZhbHVlPVt1bmRlZmluZWQsYWJzZW50VmFsdWUsYWJzZW50VmFsdWVdO1xuIH1lbHNlIGlmKHhEb25lKXtcbnZhbHVlPVt5S2V5LGFic2VudFZhbHVlLG5leHRZKCldO1xuIH1lbHNlIGlmKHlEb25lKXtcbnZhbHVlPVt4S2V5LG5leHRYKCksYWJzZW50VmFsdWVdO1xuIH1lbHNle1xuLyogQ29tcGFyZSB0aGUga2V5cyB0byBkZXRlcm1pbmUgaWYgd2Ugc2hvdWxkIHJldHVybiBhIG1lcmdlZCByZXN1bHQqL1xuLyogb3IgYSBvbmUtc2lkZWQgcmVzdWx0LiovXG5jb25zdCBjb21wPWZ1bGxDb21wYXJlKHhLZXkseUtleSk7XG5pZihjb21wPT09MCl7XG52YWx1ZT1beEtleSxuZXh0WCgpLG5leHRZKCldO1xuIH1lbHNlIGlmKGNvbXA8MCl7XG52YWx1ZT1beEtleSxuZXh0WCgpLGFic2VudFZhbHVlXTtcbiB9ZWxzZSBpZihjb21wPjApe1xudmFsdWU9W3lLZXksYWJzZW50VmFsdWUsbmV4dFkoKV07XG4gfWVsc2V7XG50aHJvdyBGYWlsIGBVbmV4cGVjdGVkIGtleSBjb21wYXJpc29uICR7cShjb21wKX0gZm9yICR7eEtleX0gdnMgJHt5S2V5fWA7XG4gfVxuIH1cbnJldHVybiBoYXJkZW4oe2RvbmUsdmFsdWV9KTtcbiB9KTtcbiB9OyRo4oCNX29uY2UuZ2VuZXJhdGVDb2xsZWN0aW9uUGFpckVudHJpZXMoZ2VuZXJhdGVDb2xsZWN0aW9uUGFpckVudHJpZXMpO1xuaGFyZGVuKGdlbmVyYXRlQ29sbGVjdGlvblBhaXJFbnRyaWVzKTtcblxuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24gZm9yIGNvbXBhcmluZyB0d28gS2V5Q29sbGVjdGlvbnMgb2YgdGhlIHNhbWUgdHlwZSB1c2luZ1xuICogdGhlIHByb3ZpZGVkIGVudHJpZXMgZmFjdG9yeSBhbmQgc2FtZS1rZXkgZW50cnkgdmFsdWUgY29tcGFyYXRvciAod2hlcmUgdGhlXG4gKiB2YWx1ZSBmb3IgYW4gYWJzZW50IGVudHJ5IGluIG9uZSBjb2xsZWN0aW9uIGlzIGBhYnNlbnRWYWx1ZWApLlxuICpcbiAqIElmIHRoZSBjb3JyZXNwb25kaW5nIGVudHJpZXMgZm9yIGFueSBzaW5nbGUga2V5IGFyZSBpbmNvbXBhcmFibGUgb3IgdGhlXG4gKiBjb21wYXJpc29uIHJlc3VsdCBoYXMgdGhlIG9wcG9zaXRlIHNpZ24gb2YgdGhlIHJlc3VsdCBmb3IgYSBkaWZmZXJlbnQga2V5LFxuICogdGhlbiB0aGUgS2V5Q29sbGVjdGlvbnMgYXJlIGluY29tcGFyYWJsZS4gT3RoZXJ3aXNlLCB0aGUgY29sbGVjdGlvbnMgY29tcGFyZVxuICogYnkgdGhlIHJlc3VsdCBvZiBhbnkgbm9uLWVxdWFsIGVudHJ5IGNvbXBhcmlzb24sIG9yIGNvbXBhcmUgZXF1YWwgaWYgdGhlcmUgaXNcbiAqIG5vIG5vbi1lcXVhbCBlbnRyeSBjb21wYXJpc29uIHJlc3VsdC5cbiAqIEZvciBleGFtcGxlLCBnaXZlbiBDb3B5QmFncyBYIGFuZCBZIGFuZCBhIHZhbHVlIGNvbXBhcmF0b3IgdGhhdCBnb2VzIGJ5IGNvdW50XG4gKiAoZGVmYXVsdGluZyBhYnNlbnQga2V5cyB0byBhIGNvdW50IG9mIDApLCBYIGlzIHNtYWxsZXIgdGhhbiBZIChgcmVzdWx0IDwgMGApXG4gKiBpZmYgdGhlcmUgYXJlIG5vIGtleXMgaW4gWCB0aGF0IGFyZSBlaXRoZXIgYWJzZW50IGZyb20gWVxuICogKGBjb21wYXJlVmFsdWVzKHhDb3VudCwgYWJzZW50VmFsdWUpID4gMGApIG9yIHByZXNlbnQgaW4gWSB3aXRoIGEgbG93ZXIgY291bnRcbiAqIChgY29tcGFyZVZhbHVlcyh4Q291bnQsIHlDb3VudCkgPiAwYCkgQU5EIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBrZXkgaW4gWSB0aGF0XG4gKiBpcyBlaXRoZXIgYWJzZW50IGZyb20gWCAoYGNvbXBhcmVWYWx1ZXMoYWJzZW50VmFsdWUsIHlDb3VudCkgPCAwYCkgb3IgcHJlc2VudFxuICogd2l0aCBhIGxvd2VyIGNvdW50IChgY29tcGFyZVZhbHVlcyh4Q291bnQsIHlDb3VudCkgPCAwYCkuXG4gKlxuICogVGhpcyBjYW4gYmUgZ2VuZXJhbGl6ZWQgdG8gdmlydHVhbCBjb2xsZWN0aW9ucyBpbiB0aGUgZnV0dXJlIGJ5IHJlcGxhY2luZ1xuICogYGdldEVudHJpZXMgPT4gQXJyYXlgIHdpdGggYGdlbmVyYXRlRW50cmllcyA9PiBJdGVyYWJsZUl0ZXJhdG9yYC5cbiAqXG4gKiBAdGVtcGxhdGUgW0M9S2V5Q29sbGVjdGlvbl1cbiAqIEB0ZW1wbGF0ZSBbVj11bmtub3duXVxuICogQHBhcmFtIHsoY29sbGVjdGlvbjogQykgPT4gQXJyYXk8W0tleSwgVl0+fSBnZXRFbnRyaWVzXG4gKiBAcGFyYW0ge2FueX0gYWJzZW50VmFsdWVcbiAqIEBwYXJhbSB7S2V5Q29tcGFyZX0gY29tcGFyZVZhbHVlc1xuICogQHJldHVybnMgeyhsZWZ0OiBDLCByaWdodDogQykgPT4gS2V5Q29tcGFyaXNvbn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VDb21wYXJlQ29sbGVjdGlvbj0oZ2V0RW50cmllcyxhYnNlbnRWYWx1ZSxjb21wYXJlVmFsdWVzKT0+XG5oYXJkZW4oKGxlZnQscmlnaHQpPT57XG5jb25zdCBtZXJnZWQ9Z2VuZXJhdGVDb2xsZWN0aW9uUGFpckVudHJpZXMoXG5sZWZ0LFxucmlnaHQsXG5nZXRFbnRyaWVzLFxuYWJzZW50VmFsdWUpO1xuXG5sZXQgbGVmdElzQmlnZ2VyPWZhbHNlO1xubGV0IHJpZ2h0SXNCaWdnZXI9ZmFsc2U7XG5mb3IoY29uc3RbX2tleSxsZWZ0VmFsdWUscmlnaHRWYWx1ZV1vZiBtZXJnZWQpe1xuY29uc3QgY29tcD1jb21wYXJlVmFsdWVzKGxlZnRWYWx1ZSxyaWdodFZhbHVlKTtcbmlmKGNvbXA9PT0wKXtcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb250aW51ZSovXG5jb250aW51ZTtcbiB9ZWxzZSBpZihjb21wPDApe1xuLyogQmFzZWQgb24gdGhpcyBrZXksIGxlZnQgPCByaWdodC4qL1xucmlnaHRJc0JpZ2dlcj10cnVlO1xuIH1lbHNlIGlmKGNvbXA+MCl7XG4vKiBCYXNlZCBvbiB0aGlzIGtleSwgbGVmdCA+IHJpZ2h0LiovXG5sZWZ0SXNCaWdnZXI9dHJ1ZTtcbiB9ZWxzZXtcbk51bWJlci5pc05hTihjb21wKXx8XG4vKiBwcmV0dGllci1pZ25vcmUqL1xuRmFpbCBgVW5leHBlY3RlZCB2YWx1ZSBjb21wYXJpc29uICR7cShjb21wKX0gZm9yICR7bGVmdFZhbHVlfSB2cyAke3JpZ2h0VmFsdWV9YDtcbnJldHVybiBOYU47XG4gfVxuaWYobGVmdElzQmlnZ2VyJiZyaWdodElzQmlnZ2VyKXtcbnJldHVybiBOYU47XG4gfVxuIH1cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXN0ZWQtdGVybmFyeSovXG5yZXR1cm4gbGVmdElzQmlnZ2VyPzE6cmlnaHRJc0JpZ2dlcj8tMTowO1xuIH0pOyRo4oCNX29uY2UubWFrZUNvbXBhcmVDb2xsZWN0aW9uKG1ha2VDb21wYXJlQ29sbGVjdGlvbik7XG5oYXJkZW4obWFrZUNvbXBhcmVDb2xsZWN0aW9uKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJnZW5lcmF0ZUNvbGxlY3Rpb25QYWlyRW50cmllcyI6WyJnZW5lcmF0ZUNvbGxlY3Rpb25QYWlyRW50cmllcyJdLCJtYWtlQ29tcGFyZUNvbGxlY3Rpb24iOlsibWFrZUNvbXBhcmVDb2xsZWN0aW9uIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACd4z8QHIgAAByIAADUAAABAZW5kby9wYXR0ZXJucy12MC4yLjYvc3JjL2tleXMvbWVyZ2UtYmFnLW9wZXJhdG9ycy5qc3siaW1wb3J0cyI6WyJAZW5kby9tYXJzaGFsIiwiLi9jb3B5QmFnLmpzIl0sImV4cG9ydHMiOlsiYmFnRGlzam9pbnRTdWJ0cmFjdCIsImJhZ0ludGVyc2VjdGlvbiIsImJhZ0lzRGlzam9pbnQiLCJiYWdJc1N1cGVyYmFnIiwiYmFnVW5pb24iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0UmFua1NvcnRlZCxjb21wYXJlQW50aVJhbmssbWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQsc29ydEJ5UmFuayxhc3NlcnROb0R1cGxpY2F0ZUtleXMsbWFrZUJhZ09mRW50cmllczskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJhc3NlcnRSYW5rU29ydGVkXCIsIFskaOKAjV9hID0+IChhc3NlcnRSYW5rU29ydGVkID0gJGjigI1fYSldXSxbXCJjb21wYXJlQW50aVJhbmtcIiwgWyRo4oCNX2EgPT4gKGNvbXBhcmVBbnRpUmFuayA9ICRo4oCNX2EpXV0sW1wibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0ID0gJGjigI1fYSldXSxbXCJzb3J0QnlSYW5rXCIsIFskaOKAjV9hID0+IChzb3J0QnlSYW5rID0gJGjigI1fYSldXV1dLFtcIi4vY29weUJhZy5qc1wiLCBbW1wiYXNzZXJ0Tm9EdXBsaWNhdGVLZXlzXCIsIFskaOKAjV9hID0+IChhc3NlcnROb0R1cGxpY2F0ZUtleXMgPSAkaOKAjV9hKV1dLFtcIm1ha2VCYWdPZkVudHJpZXNcIiwgWyRo4oCNX2EgPT4gKG1ha2VCYWdPZkVudHJpZXMgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuY29uc3R7cXVvdGU6cSxGYWlsfT1hc3NlcnQ7XG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi4vdHlwZXMnKS5LZXlDb21wYXJpc29ufSBLZXlDb21wYXJpc29uICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4uL3R5cGVzJykuRnVsbENvbXBhcmV9IEZ1bGxDb21wYXJlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL21hcnNoYWwnKS5SYW5rQ29tcGFyZX0gUmFua0NvbXBhcmUgKi9cblxuLyogQmFzZWQgb24gbWVyZ2Utc2V0LW9wZXJhdG9ycy5qcywgYnV0IGFsdGVyZWQgZm9yIHRoZSBiYWcgcmVwcmVzZW50YXRpb24uKi9cbi8qIFRPRE8gc2hhcmUgbW9yZSBjb2RlIHdpdGggdGhhdCBmaWxlIGFuZCBrZXljb2xsZWN0aW9uLW9wZXJhdG9ycy5qcy4qL1xuXG4vKipcbiAqIEFzc2VydHMgdGhhdCBgYmFnRW50cmllc2AgaXMgYWxyZWFkeSByYW5rIHNvcnRlZCBieSBgcmFua0NvbXBhcmVgLCB3aGVyZVxuICogdGhlcmVcbiAqIG1heSBiZSBjb250aWd1b3VzIHJlZ2lvbnMgb2YgYmFnRW50cmllcyB3aG9zZSBrZXlzIGFyZSB0aWVkIGZvciB0aGUgc2FtZVxuICogcmFuay5cbiAqIFJldHVybnMgYW4gaXRlcmFibGUgdGhhdCB3aWxsIGVudW1lcmF0ZSBhbGwgdGhlIGJhZ0VudHJpZXMgaW4gb3JkZXJcbiAqIGFjY29yZGluZyB0byBgZnVsbE9yZGVyYCwgd2hpY2ggc2hvdWxkIGRpZmZlciBmcm9tIGByYW5rT3JkZXJgIG9ubHlcbiAqIGJ5IGJlaW5nIG1vcmUgcHJlY2lzZS5cbiAqXG4gKiBUaGlzIHNob3VsZCBiZSBlcXVpdmFsZW50IHRvIHJlc29ydGluZyB0aGUgZW50aXJlIGBiYWdFbnRyaWVzYCBhcnJheVxuICogYWNjb3JkaW5nXG4gKiB0byBgZnVsbE9yZGVyYC4gSG93ZXZlciwgaXQgb3B0aW1pemVzIGZvciB0aGUgY2FzZSB3aGVyZSB0aGVzZSBjb250aWd1b3VzXG4gKiBydW5zIHRoYXQgbmVlZCB0byBiZSByZXNvcnRlZCBhcmUgZWl0aGVyIGFic2VudCBvciBzbWFsbC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtbVCxiaWdpbnRdW119IGJhZ0VudHJpZXNcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IHJhbmtDb21wYXJlXG4gKiBAcGFyYW0ge0Z1bGxDb21wYXJlfSBmdWxsQ29tcGFyZVxuICogQHJldHVybnMge0l0ZXJhYmxlPFtULGJpZ2ludF0+fVxuICovXG5jb25zdCBiYWdXaW5kb3dSZXNvcnQ9KGJhZ0VudHJpZXMscmFua0NvbXBhcmUsZnVsbENvbXBhcmUpPT57XG5hc3NlcnRSYW5rU29ydGVkKGJhZ0VudHJpZXMscmFua0NvbXBhcmUpO1xuY29uc3R7bGVuZ3RofT1iYWdFbnRyaWVzO1xubGV0IGk9MDtcbmxldCBvcHRJbm5lckl0ZXJhdG9yO1xucmV0dXJuIGhhcmRlbih7XG5bU3ltYm9sLml0ZXJhdG9yXTooKT0+XG5oYXJkZW4oe1xubmV4dDooKT0+e1xuaWYob3B0SW5uZXJJdGVyYXRvcil7XG5jb25zdCByZXN1bHQ9b3B0SW5uZXJJdGVyYXRvci5uZXh0KCk7XG5pZihyZXN1bHQuZG9uZSl7XG5vcHRJbm5lckl0ZXJhdG9yPXVuZGVmaW5lZDtcbi8qIGZhbGwgdGhyb3VnaCovXG4gfWVsc2V7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbiB9XG5pZihpPGxlbmd0aCl7XG5jb25zdCBlbnRyeT1iYWdFbnRyaWVzW2ldO1xubGV0IGo9aSsxO1xud2hpbGUoXG5qPGxlbmd0aCYmXG5yYW5rQ29tcGFyZShlbnRyeVswXSxiYWdFbnRyaWVzW2pdWzBdKT09PTApXG57XG5qKz0xO1xuIH1cbmlmKGo9PT1pKzEpe1xuaT1qO1xucmV0dXJuIGhhcmRlbih7ZG9uZTpmYWxzZSx2YWx1ZTplbnRyeX0pO1xuIH1cbmNvbnN0IHNpbWlsYXJSdW49YmFnRW50cmllcy5zbGljZShpLGopO1xuaT1qO1xuY29uc3QgcmVzb3J0ZWQ9c29ydEJ5UmFuayhzaW1pbGFyUnVuLGZ1bGxDb21wYXJlKTtcbi8qIFByb3ZpZGluZyB0aGUgc2FtZSBgZnVsbENvbXBhcmVgIHNob3VsZCBjYXVzZSBhIG1lbW8gaGl0Ki9cbi8qIHdpdGhpbiBgYXNzZXJ0Tm9EdXBsaWNhdGVzYCBlbmFibGluZyBpdCB0byBhdm9pZCBhKi9cbi8qIHJlZHVuZGFudCByZXNvcnRpbmcuKi9cbmFzc2VydE5vRHVwbGljYXRlS2V5cyhyZXNvcnRlZCxmdWxsQ29tcGFyZSk7XG4vKiBUaGlzIGlzIHRoZSByYXcgSlMgYXJyYXkgaXRlcmF0b3Igd2hvc2UgYC5uZXh0KClgIG1ldGhvZCovXG4vKiBkb2VzIG5vdCBoYXJkZW4gdGhlIEl0ZXJhdG9yUmVzdWx0LCBpbiB2aW9sYXRpb24gb2Ygb3VyKi9cbi8qIGNvbnZlbnRpb25zLiBGaXhpbmcgdGhpcyBpcyBleHBlbnNpdmUgYW5kIEknbSBjb25maWRlbnQgdGhlKi9cbi8qIHVuZnJvemVuIHZhbHVlIGRvZXMgbm90IGVzY2FwZSB0aGlzIGZpbGUsIHNvIEknbSBsZWF2aW5nIHRoaXMqL1xuLyogYXMgaXMuKi9cbm9wdElubmVySXRlcmF0b3I9cmVzb3J0ZWRbU3ltYm9sLml0ZXJhdG9yXSgpO1xucmV0dXJuIG9wdElubmVySXRlcmF0b3IubmV4dCgpO1xuIH1lbHNle1xucmV0dXJuIGhhcmRlbih7ZG9uZTp0cnVlLHZhbHVlOltudWxsLDBuXX0pO1xuIH1cbiB9fSl9KTtcblxuXG4gfTtcblxuLyoqXG4gKiBSZXR1cm5zIGFuIGl0ZXJhYmxlIHdob3NlIGl0ZXJhdGlvbiByZXN1bHRzIGFyZSBba2V5LCB4Q291bnQsIHlDb3VudF0gdHVwbGVzXG4gKiByZXByZXNlbnRpbmcgdGhlIG5leHQga2V5IGluIHRoZSBsb2NhbCBmdWxsIG9yZGVyLCBhcyB3ZWxsIGFzIGhvdyBtYW55XG4gKiB0aW1lcyBpdCBvY2N1cnJlZCBpbiB0aGUgeCBpbnB1dCBpdGVyYXRvciBhbmQgdGhlIHkgaW5wdXQgaXRlcmF0b3IuXG4gKlxuICogRm9yIHNldHMsIHRoZXNlIGNvdW50cyBhcmUgYWx3YXlzIDAgb3IgMSwgYnV0IHRoaXMgcmVwcmVzZW50YXRpb25cbiAqIGdlbmVyYWxpemVzIG5pY2VseSBmb3IgYmFncy5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtbVCxiaWdpbnRdW119IHhiYWdFbnRyaWVzXG4gKiBAcGFyYW0ge1tULGJpZ2ludF1bXX0geWJhZ0VudHJpZXNcbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxbVCxiaWdpbnQsYmlnaW50XT59XG4gKi9cbmNvbnN0IG1lcmdlPSh4YmFnRW50cmllcyx5YmFnRW50cmllcyk9Pntcbi8qIFRoaXMgZnVsbE9yZGVyIGNvbnRhaW5zIGhpc3RvcnkgZGVwZW5kZW50IHN0YXRlLiBJdCBpcyBzcGVjaWZpYyovXG4vKiB0byB0aGlzIG9uZSBgbWVyZ2VgIGNhbGwgYW5kIGRvZXMgbm90IHN1cnZpdmUgaXQuKi9cbmNvbnN0IGZ1bGxDb21wYXJlPW1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0KCkuYW50aUNvbXBhcmF0b3I7XG5cbmNvbnN0IHhzPWJhZ1dpbmRvd1Jlc29ydCh4YmFnRW50cmllcyxjb21wYXJlQW50aVJhbmssZnVsbENvbXBhcmUpO1xuY29uc3QgeXM9YmFnV2luZG93UmVzb3J0KHliYWdFbnRyaWVzLGNvbXBhcmVBbnRpUmFuayxmdWxsQ29tcGFyZSk7XG5yZXR1cm4gaGFyZGVuKHtcbltTeW1ib2wuaXRlcmF0b3JdOigpPT57XG4vKiBUaGVzZSBzaXggYGxldGAgdmFyaWFibGVzIGFyZSBidWZmZXJpbmcgb25lIGFoZWFkIGZyb20gdGhlIHVuZGVybHlpbmcqL1xuLyogaXRlcmF0b3JzLiBFYWNoIGl0ZXJhdGlvbiByZXBvcnRzIG9uZSBvciB0aGUgb3RoZXIgb3IgYm90aCwgYW5kKi9cbi8qIHRoZW4gcmVmaWxscyB0aGUgYnVmZmVycyBvZiB0aG9zZSBpdCBhZHZhbmNlZC4qL1xuLyoqIEB0eXBlIHtUfSAqL1xubGV0IHg7XG5sZXQgeGM7XG5sZXQgeERvbmU7XG4vKiogQHR5cGUge1R9ICovXG5sZXQgeTtcbmxldCB5YztcbmxldCB5RG9uZTtcblxuY29uc3QgeGk9eHNbU3ltYm9sLml0ZXJhdG9yXSgpO1xuY29uc3QgbmV4dFg9KCk9PntcbiF4RG9uZXx8RmFpbCBgSW50ZXJuYWw6IG5leHRYIHNob3VsZCBub3QgYmUgY2FsbGVkIG9uY2UgZG9uZWA7XG4oe1xuZG9uZTp4RG9uZSxcbnZhbHVlOlt4LHhjXX09XG54aS5uZXh0KCkpO1xuIH07XG5uZXh0WCgpO1xuXG5jb25zdCB5aT15c1tTeW1ib2wuaXRlcmF0b3JdKCk7XG5jb25zdCBuZXh0WT0oKT0+e1xuIXlEb25lfHxGYWlsIGBJbnRlcm5hbDogbmV4dFkgc2hvdWxkIG5vdCBiZSBjYWxsZWQgb25jZSBkb25lYDtcbih7XG5kb25lOnlEb25lLFxudmFsdWU6W3kseWNdfT1cbnlpLm5leHQoKSk7XG4gfTtcbm5leHRZKCk7XG5cbnJldHVybiBoYXJkZW4oe1xubmV4dDooKT0+e1xuLyoqIEB0eXBlIHtib29sZWFufSAqL1xubGV0IGRvbmU9ZmFsc2U7XG4vKiogQHR5cGUge1tULGJpZ2ludCxiaWdpbnRdfSAqL1xubGV0IHZhbHVlO1xuaWYoeERvbmUmJnlEb25lKXtcbmRvbmU9dHJ1ZTtcbi8qIEB0cy1leHBlY3QtZXJyb3IgQmVjYXVzZSB0aGUgdGVybWluYXRpbmcgdmFsdWUgZG9lcyBub3QgbWF0dGVyKi9cbnZhbHVlPVtudWxsLDBuLDBuXTtcbiB9ZWxzZSBpZih4RG9uZSl7XG4vKiBvbmx5IHlzIGFyZSBsZWZ0Ki9cbnZhbHVlPVt5LDBuLHljXTtcbm5leHRZKCk7XG4gfWVsc2UgaWYoeURvbmUpe1xuLyogb25seSB4cyBhcmUgbGVmdCovXG52YWx1ZT1beCx4Yywwbl07XG5uZXh0WCgpO1xuIH1lbHNle1xuY29uc3QgY29tcD1mdWxsQ29tcGFyZSh4LHkpO1xuaWYoY29tcD09PTApe1xuLyogeCBhbmQgeSBhcmUgZXF1aXZhbGVudCwgc28gcmVwb3J0IGJvdGgqL1xudmFsdWU9W3gseGMseWNdO1xubmV4dFgoKTtcbm5leHRZKCk7XG4gfWVsc2UgaWYoY29tcDwwKXtcbi8qIHggaXMgZWFybGllciwgc28gcmVwb3J0IGl0Ki9cbnZhbHVlPVt4LHhjLDBuXTtcbm5leHRYKCk7XG4gfWVsc2V7XG4vKiB5IGlzIGVhcmxpZXIsIHNvIHJlcG9ydCBpdCovXG5jb21wPjB8fEZhaWwgYEludGVybmFsOiBVbmV4cGVjdGVkIGNvbXAgJHtxKGNvbXApfWA7XG52YWx1ZT1beSwwbix5Y107XG5uZXh0WSgpO1xuIH1cbiB9XG5yZXR1cm4gaGFyZGVuKHtkb25lLHZhbHVlfSk7XG4gfX0pO1xuXG4gfX0pO1xuXG4gfTtcbmhhcmRlbihtZXJnZSk7XG5cbi8qIFdlIHNob3VsZCBiZSBhYmxlIHRvIHVzZSB0aGlzIGZvciBpdGVySXNTdXBlcnNldCBhcyB3ZWxsLiovXG4vKiBUaGUgZ2VuZXJhbGl6YXRpb24gaXMgZnJlZS4qL1xuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtJdGVyYWJsZTxbVCxiaWdpbnQsYmlnaW50XT59IHh5aVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGJhZ0l0ZXJJc1N1cGVyYmFnPSh4eWkpPT57XG5mb3IoY29uc3RbX20seGMseWNdb2YgeHlpKXtcbmlmKHhjPHljKXtcbi8qIHNvbWV0aGluZyBpbiB5IGlzIG5vdCBpbiB4LCBzbyB4IGlzIG5vdCBhIHN1cGVyYmFnIG9mIHkqL1xucmV0dXJuIGZhbHNlO1xuIH1cbiB9XG5yZXR1cm4gdHJ1ZTtcbiB9O1xuXG4vKiBXZSBzaG91bGQgYmUgYWJsZSB0byB1c2UgdGhpcyBmb3IgaXRlcklzRGlzam9pbnQgYXMgd2VsbC4qL1xuLyogVGhlIGNvZGUgaXMgaWRlbnRpY2FsLiovXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFtULGJpZ2ludCxiaWdpbnRdPn0geHlpXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgYmFnSXRlcklzRGlzam9pbnQ9KHh5aSk9PntcbmZvcihjb25zdFtfbSx4Yyx5Y11vZiB4eWkpe1xuaWYoeGM+PTFuJiZ5Yz49MW4pe1xuLyogU29tZXRoaW5nIGluIGJvdGgsIHNvIG5vdCBkaXNqb2ludCovXG5yZXR1cm4gZmFsc2U7XG4gfVxuIH1cbnJldHVybiB0cnVlO1xuIH07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7W1QsYmlnaW50LGJpZ2ludF1bXX0geHlpXG4gKiBAcmV0dXJucyB7W1QsYmlnaW50XVtdfVxuICovXG5jb25zdCBiYWdJdGVyVW5pb249KHh5aSk9Pntcbi8qKiBAdHlwZSB7W1QsYmlnaW50XVtdfSAqL1xuY29uc3QgcmVzdWx0PVtdO1xuZm9yKGNvbnN0W20seGMseWNdb2YgeHlpKXtcbnJlc3VsdC5wdXNoKFttLHhjK3ljXSk7XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFtULGJpZ2ludCxiaWdpbnRdPn0geHlpXG4gKiBAcmV0dXJucyB7W1QsYmlnaW50XVtdfVxuICovXG5jb25zdCBiYWdJdGVySW50ZXJzZWN0aW9uPSh4eWkpPT57XG4vKiogQHR5cGUge1tULGJpZ2ludF1bXX0gKi9cbmNvbnN0IHJlc3VsdD1bXTtcbmZvcihjb25zdFttLHhjLHljXW9mIHh5aSl7XG5jb25zdCBtYz14Yzw9eWM/eGM6eWM7XG5yZXN1bHQucHVzaChbbSxtY10pO1xuIH1cbnJldHVybiByZXN1bHQ7XG4gfTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtJdGVyYWJsZTxbVCxiaWdpbnQsYmlnaW50XT59IHh5aVxuICogQHJldHVybnMge1tULGJpZ2ludF1bXX1cbiAqL1xuY29uc3QgYmFnSXRlckRpc2pvaW50U3VidHJhY3Q9KHh5aSk9Pntcbi8qKiBAdHlwZSB7W1QsYmlnaW50XVtdfSAqL1xuY29uc3QgcmVzdWx0PVtdO1xuZm9yKGNvbnN0W20seGMseWNdb2YgeHlpKXtcbmNvbnN0IG1jPXhjLXljO1xubWM+PTBufHxGYWlsIGByaWdodCBlbGVtZW50ICR7bX0gd2FzIG5vdCBpbiBsZWZ0YDtcbmlmKG1jPj0xbil7XG4vKiB0aGUgeCB3YXMgbm90IGluIHkqL1xucmVzdWx0LnB1c2goW20sbWNdKTtcbiB9XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9O1xuXG5jb25zdCBtZXJnZWlmeT0oYmFnSXRlck9wKT0+KHhiYWdFbnRyaWVzLHliYWdFbnRyaWVzKT0+XG5iYWdJdGVyT3AobWVyZ2UoeGJhZ0VudHJpZXMseWJhZ0VudHJpZXMpKTtcblxuY29uc3QgYmFnRW50cmllc0lzU3VwZXJiYWc9bWVyZ2VpZnkoYmFnSXRlcklzU3VwZXJiYWcpO1xuY29uc3QgYmFnRW50cmllc0lzRGlzam9pbnQ9bWVyZ2VpZnkoYmFnSXRlcklzRGlzam9pbnQpO1xuY29uc3QgYmFnRW50cmllc1VuaW9uPW1lcmdlaWZ5KGJhZ0l0ZXJVbmlvbik7XG5jb25zdCBiYWdFbnRyaWVzSW50ZXJzZWN0aW9uPW1lcmdlaWZ5KGJhZ0l0ZXJJbnRlcnNlY3Rpb24pO1xuY29uc3QgYmFnRW50cmllc0Rpc2pvaW50U3VidHJhY3Q9bWVyZ2VpZnkoYmFnSXRlckRpc2pvaW50U3VidHJhY3QpO1xuXG5jb25zdCByYXdCYWdpZnk9KGJhZ0VudHJpZXNPcCk9Pih4YmFnLHliYWcpPT5cbmJhZ0VudHJpZXNPcCh4YmFnLnBheWxvYWQseWJhZy5wYXlsb2FkKTtcblxuY29uc3QgYmFnaWZ5PShiYWdFbnRyaWVzT3ApPT4oeGJhZyx5YmFnKT0+XG5tYWtlQmFnT2ZFbnRyaWVzKGJhZ0VudHJpZXNPcCh4YmFnLnBheWxvYWQseWJhZy5wYXlsb2FkKSk7XG5cbmNvbnN0ICAgICAgICBiYWdJc1N1cGVyYmFnPXJhd0JhZ2lmeShiYWdFbnRyaWVzSXNTdXBlcmJhZyk7JGjigI1fb25jZS5iYWdJc1N1cGVyYmFnKGJhZ0lzU3VwZXJiYWcpO1xuY29uc3QgICAgICAgIGJhZ0lzRGlzam9pbnQ9cmF3QmFnaWZ5KGJhZ0VudHJpZXNJc0Rpc2pvaW50KTskaOKAjV9vbmNlLmJhZ0lzRGlzam9pbnQoYmFnSXNEaXNqb2ludCk7XG5jb25zdCAgICAgICAgYmFnVW5pb249YmFnaWZ5KGJhZ0VudHJpZXNVbmlvbik7JGjigI1fb25jZS5iYWdVbmlvbihiYWdVbmlvbik7XG5jb25zdCAgICAgICAgYmFnSW50ZXJzZWN0aW9uPWJhZ2lmeShiYWdFbnRyaWVzSW50ZXJzZWN0aW9uKTskaOKAjV9vbmNlLmJhZ0ludGVyc2VjdGlvbihiYWdJbnRlcnNlY3Rpb24pO1xuY29uc3QgICAgICAgIGJhZ0Rpc2pvaW50U3VidHJhY3Q9YmFnaWZ5KGJhZ0VudHJpZXNEaXNqb2ludFN1YnRyYWN0KTskaOKAjV9vbmNlLmJhZ0Rpc2pvaW50U3VidHJhY3QoYmFnRGlzam9pbnRTdWJ0cmFjdCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYmFnSXNTdXBlcmJhZyI6WyJiYWdJc1N1cGVyYmFnIl0sImJhZ0lzRGlzam9pbnQiOlsiYmFnSXNEaXNqb2ludCJdLCJiYWdVbmlvbiI6WyJiYWdVbmlvbiJdLCJiYWdJbnRlcnNlY3Rpb24iOlsiYmFnSW50ZXJzZWN0aW9uIl0sImJhZ0Rpc2pvaW50U3VidHJhY3QiOlsiYmFnRGlzam9pbnRTdWJ0cmFjdCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAezYcuXCgAAFwoAAA1AAAAQGVuZG8vcGF0dGVybnMtdjAuMi42L3NyYy9rZXlzL21lcmdlLXNldC1vcGVyYXRvcnMuanN7ImltcG9ydHMiOlsiQGVuZG8vbWFyc2hhbCIsIi4vY29weVNldC5qcyJdLCJleHBvcnRzIjpbImVsZW1lbnRzQ29tcGFyZSIsImVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCIsImVsZW1lbnRzRGlzam9pbnRVbmlvbiIsImVsZW1lbnRzSW50ZXJzZWN0aW9uIiwiZWxlbWVudHNJc0Rpc2pvaW50IiwiZWxlbWVudHNJc1N1cGVyc2V0IiwiZWxlbWVudHNVbmlvbiIsInNldERpc2pvaW50U3VidHJhY3QiLCJzZXREaXNqb2ludFVuaW9uIiwic2V0SW50ZXJzZWN0aW9uIiwic2V0SXNEaXNqb2ludCIsInNldElzU3VwZXJzZXQiLCJzZXRVbmlvbiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnRSYW5rU29ydGVkLGNvbXBhcmVBbnRpUmFuayxtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCxzb3J0QnlSYW5rLGFzc2VydE5vRHVwbGljYXRlcyxtYWtlU2V0T2ZFbGVtZW50czskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJhc3NlcnRSYW5rU29ydGVkXCIsIFskaOKAjV9hID0+IChhc3NlcnRSYW5rU29ydGVkID0gJGjigI1fYSldXSxbXCJjb21wYXJlQW50aVJhbmtcIiwgWyRo4oCNX2EgPT4gKGNvbXBhcmVBbnRpUmFuayA9ICRo4oCNX2EpXV0sW1wibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0ID0gJGjigI1fYSldXSxbXCJzb3J0QnlSYW5rXCIsIFskaOKAjV9hID0+IChzb3J0QnlSYW5rID0gJGjigI1fYSldXV1dLFtcIi4vY29weVNldC5qc1wiLCBbW1wiYXNzZXJ0Tm9EdXBsaWNhdGVzXCIsIFskaOKAjV9hID0+IChhc3NlcnROb0R1cGxpY2F0ZXMgPSAkaOKAjV9hKV1dLFtcIm1ha2VTZXRPZkVsZW1lbnRzXCIsIFskaOKAjV9hID0+IChtYWtlU2V0T2ZFbGVtZW50cyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5jb25zdHtxdW90ZTpxLEZhaWx9PWFzc2VydDtcblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuLi90eXBlcycpLktleUNvbXBhcmlzb259IEtleUNvbXBhcmlzb24gKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi4vdHlwZXMnKS5GdWxsQ29tcGFyZX0gRnVsbENvbXBhcmUgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vbWFyc2hhbCcpLlJhbmtDb21wYXJlfSBSYW5rQ29tcGFyZSAqL1xuXG4vKiBUT0RPIHNoYXJlIG1vcmUgY29kZSB3aXRoIGtleWNvbGxlY3Rpb24tb3BlcmF0b3JzLmpzLiovXG5cbi8qKlxuICogQXNzZXJ0cyB0aGF0IGBlbGVtZW50c2AgaXMgYWxyZWFkeSByYW5rIHNvcnRlZCBieSBgcmFua0NvbXBhcmVgLCB3aGVyZSB0aGVyZVxuICogbWF5IGJlIGNvbnRpZ3VvdXMgcmVnaW9ucyBvZiBlbGVtZW50cyB0aWVkIGZvciB0aGUgc2FtZSByYW5rLlxuICogUmV0dXJucyBhbiBpdGVyYWJsZSB0aGF0IHdpbGwgZW51bWVyYXRlIGFsbCB0aGUgZWxlbWVudHMgaW4gb3JkZXJcbiAqIGFjY29yZGluZyB0byBgZnVsbE9yZGVyYCwgd2hpY2ggc2hvdWxkIGRpZmZlciBmcm9tIGByYW5rT3JkZXJgIG9ubHlcbiAqIGJ5IGJlaW5nIG1vcmUgcHJlY2lzZS5cbiAqXG4gKiBUaGlzIHNob3VsZCBiZSBlcXVpdmFsZW50IHRvIHJlc29ydGluZyB0aGUgZW50aXJlIGBlbGVtZW50c2AgYXJyYXkgYWNjb3JkaW5nXG4gKiAgdG8gYGZ1bGxPcmRlcmAuIEhvd2V2ZXIsIGl0IG9wdGltaXplcyBmb3IgdGhlIGNhc2Ugd2hlcmUgdGhlc2UgY29udGlndW91c1xuICogcnVucyB0aGF0IG5lZWQgdG8gYmUgcmVzb3J0ZWQgYXJlIGVpdGhlciBhYnNlbnQgb3Igc21hbGwuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7VFtdfSBlbGVtZW50c1xuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gcmFua0NvbXBhcmVcbiAqIEBwYXJhbSB7RnVsbENvbXBhcmV9IGZ1bGxDb21wYXJlXG4gKiBAcmV0dXJucyB7SXRlcmFibGU8VD59XG4gKi9cbmNvbnN0IHdpbmRvd1Jlc29ydD0oZWxlbWVudHMscmFua0NvbXBhcmUsZnVsbENvbXBhcmUpPT57XG5hc3NlcnRSYW5rU29ydGVkKGVsZW1lbnRzLHJhbmtDb21wYXJlKTtcbmNvbnN0e2xlbmd0aH09ZWxlbWVudHM7XG5sZXQgaT0wO1xubGV0IG9wdElubmVySXRlcmF0b3I7XG5yZXR1cm4gaGFyZGVuKHtcbltTeW1ib2wuaXRlcmF0b3JdOigpPT5cbmhhcmRlbih7XG5uZXh0OigpPT57XG5pZihvcHRJbm5lckl0ZXJhdG9yKXtcbmNvbnN0IHJlc3VsdD1vcHRJbm5lckl0ZXJhdG9yLm5leHQoKTtcbmlmKHJlc3VsdC5kb25lKXtcbm9wdElubmVySXRlcmF0b3I9dW5kZWZpbmVkO1xuLyogZmFsbCB0aHJvdWdoKi9cbiB9ZWxzZXtcbnJldHVybiByZXN1bHQ7XG4gfVxuIH1cbmlmKGk8bGVuZ3RoKXtcbmNvbnN0IHZhbHVlPWVsZW1lbnRzW2ldO1xubGV0IGo9aSsxO1xud2hpbGUoajxsZW5ndGgmJnJhbmtDb21wYXJlKHZhbHVlLGVsZW1lbnRzW2pdKT09PTApe1xuais9MTtcbiB9XG5pZihqPT09aSsxKXtcbmk9ajtcbnJldHVybiBoYXJkZW4oe2RvbmU6ZmFsc2UsdmFsdWV9KTtcbiB9XG5jb25zdCBzaW1pbGFyUnVuPWVsZW1lbnRzLnNsaWNlKGksaik7XG5pPWo7XG5jb25zdCByZXNvcnRlZD1zb3J0QnlSYW5rKHNpbWlsYXJSdW4sZnVsbENvbXBhcmUpO1xuLyogUHJvdmlkaW5nIHRoZSBzYW1lIGBmdWxsQ29tcGFyZWAgc2hvdWxkIGNhdXNlIGEgbWVtbyBoaXQqL1xuLyogd2l0aGluIGBhc3NlcnROb0R1cGxpY2F0ZXNgIGVuYWJsaW5nIGl0IHRvIGF2b2lkIGEqL1xuLyogcmVkdW5kYW50IHJlc29ydGluZy4qL1xuYXNzZXJ0Tm9EdXBsaWNhdGVzKHJlc29ydGVkLGZ1bGxDb21wYXJlKTtcbi8qIFRoaXMgaXMgdGhlIHJhdyBKUyBhcnJheSBpdGVyYXRvciB3aG9zZSBgLm5leHQoKWAgbWV0aG9kKi9cbi8qIGRvZXMgbm90IGhhcmRlbiB0aGUgSXRlcmF0b3JSZXN1bHQsIGluIHZpb2xhdGlvbiBvZiBvdXIqL1xuLyogY29udmVudGlvbnMuIEZpeGluZyB0aGlzIGlzIGV4cGVuc2l2ZSBhbmQgSSdtIGNvbmZpZGVudCB0aGUqL1xuLyogdW5mcm96ZW4gdmFsdWUgZG9lcyBub3QgZXNjYXBlIHRoaXMgZmlsZSwgc28gSSdtIGxlYXZpbmcgdGhpcyovXG4vKiBhcyBpcy4qL1xub3B0SW5uZXJJdGVyYXRvcj1yZXNvcnRlZFtTeW1ib2wuaXRlcmF0b3JdKCk7XG5yZXR1cm4gb3B0SW5uZXJJdGVyYXRvci5uZXh0KCk7XG4gfWVsc2V7XG5yZXR1cm4gaGFyZGVuKHtkb25lOnRydWUsdmFsdWU6bnVsbH0pO1xuIH1cbiB9fSl9KTtcblxuXG4gfTtcblxuLyoqXG4gKiBSZXR1cm5zIGFuIGl0ZXJhYmxlIHdob3NlIGl0ZXJhdGlvbiByZXN1bHRzIGFyZSBba2V5LCB4Q291bnQsIHlDb3VudF0gdHVwbGVzXG4gKiByZXByZXNlbnRpbmcgdGhlIG5leHQga2V5IGluIHRoZSBsb2NhbCBmdWxsIG9yZGVyLCBhcyB3ZWxsIGFzIGhvdyBtYW55XG4gKiB0aW1lcyBpdCBvY2N1cnJlZCBpbiB0aGUgeCBpbnB1dCBpdGVyYXRvciBhbmQgdGhlIHkgaW5wdXQgaXRlcmF0b3IuXG4gKlxuICogRm9yIHNldHMsIHRoZXNlIGNvdW50cyBhcmUgYWx3YXlzIDAgb3IgMSwgYnV0IHRoaXMgcmVwcmVzZW50YXRpb25cbiAqIGdlbmVyYWxpemVzIG5pY2VseSBmb3IgYmFncy5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtUW119IHhlbGVtZW50c1xuICogQHBhcmFtIHtUW119IHllbGVtZW50c1xuICogQHJldHVybnMge0l0ZXJhYmxlPFtULGJpZ2ludCxiaWdpbnRdPn1cbiAqL1xuY29uc3QgbWVyZ2U9KHhlbGVtZW50cyx5ZWxlbWVudHMpPT57XG4vKiBUaGlzIGZ1bGxPcmRlciBjb250YWlucyBoaXN0b3J5IGRlcGVuZGVudCBzdGF0ZS4gSXQgaXMgc3BlY2lmaWMqL1xuLyogdG8gdGhpcyBvbmUgYG1lcmdlYCBjYWxsIGFuZCBkb2VzIG5vdCBzdXJ2aXZlIGl0LiovXG5jb25zdCBmdWxsQ29tcGFyZT1tYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCgpLmFudGlDb21wYXJhdG9yO1xuXG5jb25zdCB4cz13aW5kb3dSZXNvcnQoeGVsZW1lbnRzLGNvbXBhcmVBbnRpUmFuayxmdWxsQ29tcGFyZSk7XG5jb25zdCB5cz13aW5kb3dSZXNvcnQoeWVsZW1lbnRzLGNvbXBhcmVBbnRpUmFuayxmdWxsQ29tcGFyZSk7XG5yZXR1cm4gaGFyZGVuKHtcbltTeW1ib2wuaXRlcmF0b3JdOigpPT57XG4vKiBUaGVzZSBmb3VyIGBsZXRgIHZhcmlhYmxlcyBhcmUgYnVmZmVyaW5nIG9uZSBhaGVhZCBmcm9tIHRoZSB1bmRlcmx5aW5nKi9cbi8qIGl0ZXJhdG9ycy4gRWFjaCBpdGVyYXRpb24gcmVwb3J0cyBvbmUgb3IgdGhlIG90aGVyIG9yIGJvdGgsIGFuZCovXG4vKiB0aGVuIHJlZmlsbHMgdGhlIGJ1ZmZlcnMgb2YgdGhvc2UgaXQgYWR2YW5jZWQuKi9cbi8qKiBAdHlwZSB7VH0gKi9cbmxldCB4O1xubGV0IHhEb25lO1xuLyoqIEB0eXBlIHtUfSAqL1xubGV0IHk7XG5sZXQgeURvbmU7XG5cbmNvbnN0IHhpPXhzW1N5bWJvbC5pdGVyYXRvcl0oKTtcbmNvbnN0IG5leHRYPSgpPT57XG4heERvbmV8fEZhaWwgYEludGVybmFsOiBuZXh0WCBzaG91bGQgbm90IGJlIGNhbGxlZCBvbmNlIGRvbmVgO1xuKHtkb25lOnhEb25lLHZhbHVlOnh9PXhpLm5leHQoKSk7XG4gfTtcbm5leHRYKCk7XG5cbmNvbnN0IHlpPXlzW1N5bWJvbC5pdGVyYXRvcl0oKTtcbmNvbnN0IG5leHRZPSgpPT57XG4heURvbmV8fEZhaWwgYEludGVybmFsOiBuZXh0WSBzaG91bGQgbm90IGJlIGNhbGxlZCBvbmNlIGRvbmVgO1xuKHtkb25lOnlEb25lLHZhbHVlOnl9PXlpLm5leHQoKSk7XG4gfTtcbm5leHRZKCk7XG5cbnJldHVybiBoYXJkZW4oe1xubmV4dDooKT0+e1xuLyoqIEB0eXBlIHtib29sZWFufSAqL1xubGV0IGRvbmU9ZmFsc2U7XG4vKiogQHR5cGUge1tULGJpZ2ludCxiaWdpbnRdfSAqL1xubGV0IHZhbHVlO1xuaWYoeERvbmUmJnlEb25lKXtcbmRvbmU9dHJ1ZTtcbi8qIEB0cy1leHBlY3QtZXJyb3IgQmVjYXVzZSB0aGUgdGVybWluYXRpbmcgdmFsdWUgZG9lcyBub3QgbWF0dGVyKi9cbnZhbHVlPVtudWxsLDBuLDBuXTtcbiB9ZWxzZSBpZih4RG9uZSl7XG4vKiBvbmx5IHlzIGFyZSBsZWZ0Ki9cbnZhbHVlPVt5LDBuLDFuXTtcbm5leHRZKCk7XG4gfWVsc2UgaWYoeURvbmUpe1xuLyogb25seSB4cyBhcmUgbGVmdCovXG52YWx1ZT1beCwxbiwwbl07XG5uZXh0WCgpO1xuIH1lbHNle1xuY29uc3QgY29tcD1mdWxsQ29tcGFyZSh4LHkpO1xuaWYoY29tcD09PTApe1xuLyogeCBhbmQgeSBhcmUgZXF1aXZhbGVudCwgc28gcmVwb3J0IGJvdGgqL1xudmFsdWU9W3gsMW4sMW5dO1xubmV4dFgoKTtcbm5leHRZKCk7XG4gfWVsc2UgaWYoY29tcDwwKXtcbi8qIHggaXMgZWFybGllciwgc28gcmVwb3J0IGl0Ki9cbnZhbHVlPVt4LDFuLDBuXTtcbm5leHRYKCk7XG4gfWVsc2V7XG4vKiB5IGlzIGVhcmxpZXIsIHNvIHJlcG9ydCBpdCovXG5jb21wPjB8fEZhaWwgYEludGVybmFsOiBVbmV4cGVjdGVkIGNvbXAgJHtxKGNvbXApfWA7XG52YWx1ZT1beSwwbiwxbl07XG5uZXh0WSgpO1xuIH1cbiB9XG5yZXR1cm4gaGFyZGVuKHtkb25lLHZhbHVlfSk7XG4gfX0pO1xuXG4gfX0pO1xuXG4gfTtcbmhhcmRlbihtZXJnZSk7XG5cbmNvbnN0IGl0ZXJJc1N1cGVyc2V0PSh4eWkpPT57XG5mb3IoY29uc3RbX20seGMsX3ljXW9mIHh5aSl7XG5pZih4Yz09PTBuKXtcbi8qIHNvbWV0aGluZyBpbiB5IGlzIG5vdCBpbiB4LCBzbyB4IGlzIG5vdCBhIHN1cGVyc2V0IG9mIHkqL1xucmV0dXJuIGZhbHNlO1xuIH1cbiB9XG5yZXR1cm4gdHJ1ZTtcbiB9O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFtULGJpZ2ludCxiaWdpbnRdPn0geHlpXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgaXRlcklzRGlzam9pbnQ9KHh5aSk9PntcbmZvcihjb25zdFtfbSx4Yyx5Y11vZiB4eWkpe1xuaWYoeGM+PTFuJiZ5Yz49MW4pe1xuLyogU29tZXRoaW5nIGluIGJvdGgsIHNvIG5vdCBkaXNqb2ludCovXG5yZXR1cm4gZmFsc2U7XG4gfVxuIH1cbnJldHVybiB0cnVlO1xuIH07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7SXRlcmFibGU8W1QsYmlnaW50LGJpZ2ludF0+fSB4eWlcbiAqIEByZXR1cm5zIHtLZXlDb21wYXJpc29ufVxuICovXG5jb25zdCBpdGVyQ29tcGFyZT0oeHlpKT0+e1xubGV0IGxvbmVZPWZhbHNlO1xubGV0IGxvbmVYPWZhbHNlO1xuZm9yKGNvbnN0W19tLHhjLHljXW9mIHh5aSl7XG5pZih4Yz09PTBuKXtcbi8qIHNvbWV0aGluZyBpbiB5IGlzIG5vdCBpbiB4LCBzbyB4IGlzIG5vdCBhIHN1cGVyc2V0IG9mIHkqL1xubG9uZVk9dHJ1ZTtcbiB9XG5pZih5Yz09PTBuKXtcbi8qIHNvbWV0aGluZyBpbiB4IGlzIG5vdCBpbiB5LCBzbyB5IGlzIG5vdCBhIHN1cGVyc2V0IG9mIHgqL1xubG9uZVg9dHJ1ZTtcbiB9XG5pZihsb25lWCYmbG9uZVkpe1xucmV0dXJuIE5hTjtcbiB9XG4gfVxuaWYobG9uZVgpe1xucmV0dXJuIDE7XG4gfWVsc2UgaWYobG9uZVkpe1xucmV0dXJuLTE7XG4gfWVsc2V7XG4hbG9uZVgmJiFsb25lWXx8XG5GYWlsIGBJbnRlcm5hbDogVW5leHBlY3RlZCBsb25lIHBhaXIgJHtxKFtsb25lWCxsb25lWV0pfWA7XG5yZXR1cm4gMDtcbiB9XG4gfTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtJdGVyYWJsZTxbVCxiaWdpbnQsYmlnaW50XT59IHh5aVxuICogQHJldHVybnMge1RbXX1cbiAqL1xuY29uc3QgaXRlclVuaW9uPSh4eWkpPT57XG5jb25zdCByZXN1bHQ9W107XG5mb3IoY29uc3RbbSx4Yyx5Y11vZiB4eWkpe1xuaWYoeGM+PTBuKXtcbnJlc3VsdC5wdXNoKG0pO1xuIH1lbHNle1xueWM+PTBufHxGYWlsIGBJbnRlcm5hbDogVW5leHBlY3RlZCBjb3VudCAke3EoeWMpfWA7XG4vKiBpZiB4IGFuZCB5IHdlcmUgYm90aCByZWFkeSwgdGhlbiB0aGV5IHdlcmUgZXF1aXZhbGVudCBhbmQqL1xuLyogYWJvdmUgY2xhdXNlIGFscmVhZHkgdG9vayBjYXJlIG9mIGl0LiBPdGhlcndpc2UgcHVzaCBoZXJlLiovXG5yZXN1bHQucHVzaChtKTtcbiB9XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFtULGJpZ2ludCxiaWdpbnRdPn0geHlpXG4gKiBAcmV0dXJucyB7VFtdfVxuICovXG5jb25zdCBpdGVyRGlzam9pbnRVbmlvbj0oeHlpKT0+e1xuY29uc3QgcmVzdWx0PVtdO1xuZm9yKGNvbnN0W20seGMseWNdb2YgeHlpKXtcbnhjPT09MG58fHljPT09MG58fEZhaWwgYFNldHMgbXVzdCBub3QgaGF2ZSBjb21tb24gZWxlbWVudHM6ICR7bX1gO1xuaWYoeGM+PTFuKXtcbnJlc3VsdC5wdXNoKG0pO1xuIH1lbHNle1xueWM+PTFufHxGYWlsIGBJbnRlcm5hbDogVW5leHBlY3RlZCBjb3VudCAke3EoeWMpfWA7XG5yZXN1bHQucHVzaChtKTtcbiB9XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFtULGJpZ2ludCxiaWdpbnRdPn0geHlpXG4gKiBAcmV0dXJucyB7VFtdfVxuICovXG5jb25zdCBpdGVySW50ZXJzZWN0aW9uPSh4eWkpPT57XG5jb25zdCByZXN1bHQ9W107XG5mb3IoY29uc3RbbSx4Yyx5Y11vZiB4eWkpe1xuaWYoeGM+PTFuJiZ5Yz49MW4pe1xuLyogSWYgdGhleSBhcmUgYm90aCBwcmVzZW50LCB0aGVuIHRoZXkgd2VyZSBlcXVpdmFsZW50Ki9cbnJlc3VsdC5wdXNoKG0pO1xuIH1cbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7SXRlcmFibGU8W1QsYmlnaW50LGJpZ2ludF0+fSB4eWlcbiAqIEByZXR1cm5zIHtUW119XG4gKi9cbmNvbnN0IGl0ZXJEaXNqb2ludFN1YnRyYWN0PSh4eWkpPT57XG5jb25zdCByZXN1bHQ9W107XG5mb3IoY29uc3RbbSx4Yyx5Y11vZiB4eWkpe1xueGM+PTFufHxGYWlsIGByaWdodCBlbGVtZW50ICR7bX0gd2FzIG5vdCBpbiBsZWZ0YDtcbmlmKHljPT09MG4pe1xuLyogdGhlIHggd2FzIG5vdCBpbiB5Ki9cbnJlc3VsdC5wdXNoKG0pO1xuIH1cbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH07XG5cbmNvbnN0IG1lcmdlaWZ5PShpdGVyT3ApPT4oeGVsZW1lbnRzLHllbGVtZW50cyk9PlxuaXRlck9wKG1lcmdlKHhlbGVtZW50cyx5ZWxlbWVudHMpKTtcblxuY29uc3QgICAgICAgIGVsZW1lbnRzSXNTdXBlcnNldD1tZXJnZWlmeShpdGVySXNTdXBlcnNldCk7JGjigI1fb25jZS5lbGVtZW50c0lzU3VwZXJzZXQoZWxlbWVudHNJc1N1cGVyc2V0KTtcbmNvbnN0ICAgICAgICBlbGVtZW50c0lzRGlzam9pbnQ9bWVyZ2VpZnkoaXRlcklzRGlzam9pbnQpOyRo4oCNX29uY2UuZWxlbWVudHNJc0Rpc2pvaW50KGVsZW1lbnRzSXNEaXNqb2ludCk7XG5jb25zdCAgICAgICAgZWxlbWVudHNDb21wYXJlPW1lcmdlaWZ5KGl0ZXJDb21wYXJlKTskaOKAjV9vbmNlLmVsZW1lbnRzQ29tcGFyZShlbGVtZW50c0NvbXBhcmUpO1xuY29uc3QgICAgICAgIGVsZW1lbnRzVW5pb249bWVyZ2VpZnkoaXRlclVuaW9uKTskaOKAjV9vbmNlLmVsZW1lbnRzVW5pb24oZWxlbWVudHNVbmlvbik7XG5jb25zdCAgICAgICAgZWxlbWVudHNEaXNqb2ludFVuaW9uPW1lcmdlaWZ5KGl0ZXJEaXNqb2ludFVuaW9uKTskaOKAjV9vbmNlLmVsZW1lbnRzRGlzam9pbnRVbmlvbihlbGVtZW50c0Rpc2pvaW50VW5pb24pO1xuY29uc3QgICAgICAgIGVsZW1lbnRzSW50ZXJzZWN0aW9uPW1lcmdlaWZ5KGl0ZXJJbnRlcnNlY3Rpb24pOyRo4oCNX29uY2UuZWxlbWVudHNJbnRlcnNlY3Rpb24oZWxlbWVudHNJbnRlcnNlY3Rpb24pO1xuY29uc3QgICAgICAgIGVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdD1tZXJnZWlmeShpdGVyRGlzam9pbnRTdWJ0cmFjdCk7JGjigI1fb25jZS5lbGVtZW50c0Rpc2pvaW50U3VidHJhY3QoZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0KTtcblxuY29uc3QgcmF3U2V0aWZ5PShlbGVtZW50c09wKT0+KHhzZXQseXNldCk9PlxuZWxlbWVudHNPcCh4c2V0LnBheWxvYWQseXNldC5wYXlsb2FkKTtcblxuY29uc3Qgc2V0aWZ5PShlbGVtZW50c09wKT0+KHhzZXQseXNldCk9PlxubWFrZVNldE9mRWxlbWVudHMoZWxlbWVudHNPcCh4c2V0LnBheWxvYWQseXNldC5wYXlsb2FkKSk7XG5cbmNvbnN0ICAgICAgICBzZXRJc1N1cGVyc2V0PXJhd1NldGlmeShlbGVtZW50c0lzU3VwZXJzZXQpOyRo4oCNX29uY2Uuc2V0SXNTdXBlcnNldChzZXRJc1N1cGVyc2V0KTtcbmNvbnN0ICAgICAgICBzZXRJc0Rpc2pvaW50PXJhd1NldGlmeShlbGVtZW50c0lzRGlzam9pbnQpOyRo4oCNX29uY2Uuc2V0SXNEaXNqb2ludChzZXRJc0Rpc2pvaW50KTtcbmNvbnN0ICAgICAgICBzZXRVbmlvbj1zZXRpZnkoZWxlbWVudHNVbmlvbik7JGjigI1fb25jZS5zZXRVbmlvbihzZXRVbmlvbik7XG5jb25zdCAgICAgICAgc2V0RGlzam9pbnRVbmlvbj1zZXRpZnkoZWxlbWVudHNEaXNqb2ludFVuaW9uKTskaOKAjV9vbmNlLnNldERpc2pvaW50VW5pb24oc2V0RGlzam9pbnRVbmlvbik7XG5jb25zdCAgICAgICAgc2V0SW50ZXJzZWN0aW9uPXNldGlmeShlbGVtZW50c0ludGVyc2VjdGlvbik7JGjigI1fb25jZS5zZXRJbnRlcnNlY3Rpb24oc2V0SW50ZXJzZWN0aW9uKTtcbmNvbnN0ICAgICAgICBzZXREaXNqb2ludFN1YnRyYWN0PXNldGlmeShlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QpOyRo4oCNX29uY2Uuc2V0RGlzam9pbnRTdWJ0cmFjdChzZXREaXNqb2ludFN1YnRyYWN0KTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJlbGVtZW50c0lzU3VwZXJzZXQiOlsiZWxlbWVudHNJc1N1cGVyc2V0Il0sImVsZW1lbnRzSXNEaXNqb2ludCI6WyJlbGVtZW50c0lzRGlzam9pbnQiXSwiZWxlbWVudHNDb21wYXJlIjpbImVsZW1lbnRzQ29tcGFyZSJdLCJlbGVtZW50c1VuaW9uIjpbImVsZW1lbnRzVW5pb24iXSwiZWxlbWVudHNEaXNqb2ludFVuaW9uIjpbImVsZW1lbnRzRGlzam9pbnRVbmlvbiJdLCJlbGVtZW50c0ludGVyc2VjdGlvbiI6WyJlbGVtZW50c0ludGVyc2VjdGlvbiJdLCJlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QiOlsiZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0Il0sInNldElzU3VwZXJzZXQiOlsic2V0SXNTdXBlcnNldCJdLCJzZXRJc0Rpc2pvaW50IjpbInNldElzRGlzam9pbnQiXSwic2V0VW5pb24iOlsic2V0VW5pb24iXSwic2V0RGlzam9pbnRVbmlvbiI6WyJzZXREaXNqb2ludFVuaW9uIl0sInNldEludGVyc2VjdGlvbiI6WyJzZXRJbnRlcnNlY3Rpb24iXSwic2V0RGlzam9pbnRTdWJ0cmFjdCI6WyJzZXREaXNqb2ludFN1YnRyYWN0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAPxgReXqDgAA6g4AADQAAABAZW5kby9wYXR0ZXJucy12MC4yLjYvc3JjL3BhdHRlcm5zL2ludGVybmFsLXR5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyovIDxyZWZlcmVuY2UgdHlwZXM9XCJzZXNcIi8+Ki9cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9tYXJzaGFsJykuUGFzc2FibGV9IFBhc3NhYmxlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL21hcnNoYWwnKS5QYXNzU3R5bGV9IFBhc3NTdHlsZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9tYXJzaGFsJykuQ29weVRhZ2dlZH0gQ29weVRhZ2dlZCAqL1xuLyoqIEB0ZW1wbGF0ZSBUIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9tYXJzaGFsJykuQ29weVJlY29yZDxUPn0gQ29weVJlY29yZCAqL1xuLyoqIEB0ZW1wbGF0ZSBUIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9tYXJzaGFsJykuQ29weUFycmF5PFQ+fSBDb3B5QXJyYXkgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vbWFyc2hhbCcpLkNoZWNrZXJ9IENoZWNrZXIgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vbWFyc2hhbCcpLlJhbmtDb21wYXJlfSBSYW5rQ29tcGFyZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9tYXJzaGFsJykuUmFua0NvdmVyfSBSYW5rQ292ZXIgKi9cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuLi90eXBlcy5qcycpLkF3YWl0QXJnR3VhcmRQYXlsb2FkfSBBd2FpdEFyZ0d1YXJkUGF5bG9hZCAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuLi90eXBlcy5qcycpLkF3YWl0QXJnR3VhcmR9IEF3YWl0QXJnR3VhcmQgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi4vdHlwZXMuanMnKS5BcmdHdWFyZH0gQXJnR3VhcmQgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi4vdHlwZXMuanMnKS5NZXRob2RHdWFyZFBheWxvYWR9IE1ldGhvZEd1YXJkUGF5bG9hZCAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuLi90eXBlcy5qcycpLk1ldGhvZEd1YXJkfSBNZXRob2RHdWFyZCAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuLi90eXBlcy5qcycpLkludGVyZmFjZUd1YXJkUGF5bG9hZH0gSW50ZXJmYWNlR3VhcmRQYXlsb2FkICovXG4vKipcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPFByb3BlcnR5S2V5LCBNZXRob2RHdWFyZD59IFtUID0gUmVjb3JkPFByb3BlcnR5S2V5LCBNZXRob2RHdWFyZD5dXG4gKiBAdHlwZWRlZiB7WGltcG9ydCgnLi4vdHlwZXMuanMnKS5JbnRlcmZhY2VHdWFyZDxUPn0gSW50ZXJmYWNlR3VhcmRcbiAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuLi90eXBlcy5qcycpLk1ldGhvZEd1YXJkTWFrZXIwfSBNZXRob2RHdWFyZE1ha2VyMCAqL1xuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4uL3R5cGVzJykuTWF0Y2hlck5hbWVzcGFjZX0gTWF0Y2hlck5hbWVzcGFjZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuLi90eXBlcycpLktleX0gS2V5ICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4uL3R5cGVzJykuUGF0dGVybn0gUGF0dGVybiAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuLi90eXBlcycpLkNoZWNrUGF0dGVybn0gQ2hlY2tQYXR0ZXJuICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4uL3R5cGVzJykuTGltaXRzfSBMaW1pdHMgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi4vdHlwZXMnKS5BbGxMaW1pdHN9IEFsbExpbWl0cyAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuLi90eXBlcycpLkdldFJhbmtDb3Zlcn0gR2V0UmFua0NvdmVyICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gTWF0Y2hIZWxwZXJcbiAqIFRoaXMgZmFjdG9ycyBvdXQgb25seSB0aGUgcGFydHMgc3BlY2lmaWMgdG8gZWFjaCBraW5kIG9mIE1hdGNoZXIuIEl0IGlzXG4gKiBlbmNhcHN1bGF0ZWQsIGFuZCBpdHMgbWV0aG9kcyBjYW4gbWFrZSB0aGUgc3RhdGVkIHVuY2hlY2tlZCBhc3N1bXB0aW9uc1xuICogZW5mb3JjZWQgYnkgdGhlIGNvbW1vbiBjYWxsaW5nIGxvZ2ljLlxuICpcbiAqIEBwcm9wZXJ0eSB7KGFsbGVnZWRQYXlsb2FkOiBQYXNzYWJsZSxcbiAqICAgICAgICAgICAgIGNoZWNrOiBDaGVja2VyXG4gKiApID0+IGJvb2xlYW59IGNoZWNrSXNXZWxsRm9ybWVkXG4gKiBSZXBvcnRzIHdoZXRoZXIgYGFsbGVnZWRQYXlsb2FkYCBpcyB2YWxpZCBhcyB0aGUgcGF5bG9hZCBvZiBhIENvcHlUYWdnZWRcbiAqIHdob3NlIHRhZyBjb3JyZXNwb25kcyB3aXRoIHRoaXMgTWF0Y2hIZWxwZXIncyBNYXRjaGVycy5cbiAqXG4gKiBAcHJvcGVydHkgeyhzcGVjaW1lbjogUGFzc2FibGUsXG4gKiAgICAgICAgICAgICBtYXRjaGVyUGF5bG9hZDogUGFzc2FibGUsXG4gKiAgICAgICAgICAgICBjaGVjazogQ2hlY2tlcixcbiAqICkgPT4gYm9vbGVhbn0gY2hlY2tNYXRjaGVzXG4gKiBBc3N1bWluZyB2YWxpZGl0eSBvZiBgbWF0Y2hlclBheWxvYWRgIGFzIHRoZSBwYXlsb2FkIG9mIGEgTWF0Y2hlciBjb3JyZXNwb25kaW5nXG4gKiB3aXRoIHRoaXMgTWF0Y2hIZWxwZXIsIHJlcG9ydHMgd2hldGhlciBgc3BlY2ltZW5gIGlzIG1hdGNoZWQgYnkgdGhhdCBNYXRjaGVyLlxuICpcbiAqIEBwcm9wZXJ0eSB7WGltcG9ydCgnLi4vdHlwZXMnKS5HZXRSYW5rQ292ZXJ9IGdldFJhbmtDb3ZlclxuICogQXNzdW1lcyB0aGlzIGlzIHRoZSBwYXlsb2FkIG9mIGEgQ29weVRhZ2dlZCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nXG4gKiBtYXRjaFRhZy4gUmV0dXJuIGEgUmFua0NvdmVyIHRvIGJvdW5kIGZyb20gYmVsb3cgYW5kIGFib3ZlLFxuICogaW4gcmFuayBvcmRlciwgYWxsIHBvc3NpYmxlIFBhc3NhYmxlcyB0aGF0IHdvdWxkIG1hdGNoIHRoaXMgTWF0Y2hlci5cbiAqIFRoZSBsZWZ0IGVsZW1lbnQgbXVzdCBiZSBiZWZvcmUgb3IgdGhlIHNhbWUgcmFuayBhcyBhbnkgcG9zc2libGVcbiAqIG1hdGNoaW5nIHNwZWNpbWVuLiBUaGUgcmlnaHQgZWxlbWVudCBtdXN0IGJlIGFmdGVyIG9yIHRoZSBzYW1lXG4gKiByYW5rIGFzIGFueSBwb3NzaWJsZSBtYXRjaGluZyBzcGVjaW1lbi5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFBhdHRlcm5LaXRcbiAqIEBwcm9wZXJ0eSB7KHNwZWNpbWVuOiBQYXNzYWJsZSxcbiAqICAgICAgICAgICAgIHBhdHQ6IFBhc3NhYmxlLFxuICogICAgICAgICAgICAgY2hlY2s6IENoZWNrZXIsXG4gKiAgICAgICAgICAgICBsYWJlbD86IHN0cmluZ3xudW1iZXJcbiAqICkgPT4gYm9vbGVhbn0gY2hlY2tNYXRjaGVzXG4gKiBAcHJvcGVydHkgeyhzcGVjaW1lbjogUGFzc2FibGUsIHBhdHQ6IFBhdHRlcm4pID0+IGJvb2xlYW59IG1hdGNoZXNcbiAqIEBwcm9wZXJ0eSB7KHNwZWNpbWVuOiBQYXNzYWJsZSwgcGF0dDogUGF0dGVybiwgbGFiZWw/OiBzdHJpbmd8bnVtYmVyKSA9PiB2b2lkfSBtdXN0TWF0Y2hcbiAqIEBwcm9wZXJ0eSB7KHBhdHQ6IFBhdHRlcm4pID0+IHZvaWR9IGFzc2VydFBhdHRlcm5cbiAqIEBwcm9wZXJ0eSB7KHBhdHQ6IFBhc3NhYmxlKSA9PiBib29sZWFufSBpc1BhdHRlcm5cbiAqIEBwcm9wZXJ0eSB7R2V0UmFua0NvdmVyfSBnZXRSYW5rQ292ZXJcbiAqIEBwcm9wZXJ0eSB7TWF0Y2hlck5hbWVzcGFjZX0gTVxuICovXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAIMl/z2b2gAAm9oAADUAAABAZW5kby9wYXR0ZXJucy12MC4yLjYvc3JjL3BhdHRlcm5zL3BhdHRlcm5NYXRjaGVycy5qc3siaW1wb3J0cyI6WyJAZW5kby9tYXJzaGFsIiwiLi4vdXRpbHMuanMiLCIuLi9rZXlzL2NvbXBhcmVLZXlzLmpzIiwiLi4va2V5cy9jaGVja0tleS5qcyIsIi4uL2tleXMva2V5Y29sbGVjdGlvbi1vcGVyYXRvcnMuanMiLCIuL2ludGVybmFsLXR5cGVzLmpzIl0sImV4cG9ydHMiOlsiTSIsImFzc2VydEF3YWl0QXJnR3VhcmQiLCJhc3NlcnRJbnRlcmZhY2VHdWFyZCIsImFzc2VydE1ldGhvZEd1YXJkIiwiYXNzZXJ0UGF0dGVybiIsImNoZWNrTWF0Y2hlcyIsImRlZmF1bHRMaW1pdHMiLCJnZXRBd2FpdEFyZ0d1YXJkUGF5bG9hZCIsImdldEludGVyZmFjZUd1YXJkUGF5bG9hZCIsImdldEludGVyZmFjZU1ldGhvZEtleXMiLCJnZXRNZXRob2RHdWFyZFBheWxvYWQiLCJnZXRSYW5rQ292ZXIiLCJpc0F3YWl0QXJnR3VhcmQiLCJpc1BhdHRlcm4iLCJtYXRjaGVzIiwibXVzdE1hdGNoIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydENoZWNrZXIsRmFyLGdldFRhZyxtYWtlVGFnZ2VkLHBhc3NTdHlsZU9mLGhhc093blByb3BlcnR5T2YsbmFtZUZvclBhc3NhYmxlU3ltYm9sLGNvbXBhcmVSYW5rLGdldFBhc3NTdHlsZUNvdmVyLGludGVyc2VjdFJhbmtDb3ZlcnMsdW5pb25SYW5rQ292ZXJzLHJlY29yZE5hbWVzLHJlY29yZFZhbHVlcyxpZGVudENoZWNrZXIsYXBwbHlMYWJlbGluZ0Vycm9yLGZyb21VbmlxdWVFbnRyaWVzLGxpc3REaWZmZXJlbmNlLGtleUVRLGtleUdULGtleUdURSxrZXlMVCxrZXlMVEUsYXNzZXJ0S2V5LGNoZWNrS2V5LGlzS2V5LGNoZWNrU2NhbGFyS2V5LGNoZWNrQ29weVNldCxjaGVja0NvcHlNYXAsY29weU1hcEtleVNldCxjaGVja0NvcHlCYWcsZ2V0Q29weU1hcEVudHJ5QXJyYXksbWFrZUNvcHlNYXAsZ2V0Q29weU1hcEtleXMsZ2VuZXJhdGVDb2xsZWN0aW9uUGFpckVudHJpZXM7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRo4oCNX2EpXV0sW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dLFtcImdldFRhZ1wiLCBbJGjigI1fYSA9PiAoZ2V0VGFnID0gJGjigI1fYSldXSxbXCJtYWtlVGFnZ2VkXCIsIFskaOKAjV9hID0+IChtYWtlVGFnZ2VkID0gJGjigI1fYSldXSxbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlT2YgPSAkaOKAjV9hKV1dLFtcImhhc093blByb3BlcnR5T2ZcIiwgWyRo4oCNX2EgPT4gKGhhc093blByb3BlcnR5T2YgPSAkaOKAjV9hKV1dLFtcIm5hbWVGb3JQYXNzYWJsZVN5bWJvbFwiLCBbJGjigI1fYSA9PiAobmFtZUZvclBhc3NhYmxlU3ltYm9sID0gJGjigI1fYSldXSxbXCJjb21wYXJlUmFua1wiLCBbJGjigI1fYSA9PiAoY29tcGFyZVJhbmsgPSAkaOKAjV9hKV1dLFtcImdldFBhc3NTdHlsZUNvdmVyXCIsIFskaOKAjV9hID0+IChnZXRQYXNzU3R5bGVDb3ZlciA9ICRo4oCNX2EpXV0sW1wiaW50ZXJzZWN0UmFua0NvdmVyc1wiLCBbJGjigI1fYSA9PiAoaW50ZXJzZWN0UmFua0NvdmVycyA9ICRo4oCNX2EpXV0sW1widW5pb25SYW5rQ292ZXJzXCIsIFskaOKAjV9hID0+ICh1bmlvblJhbmtDb3ZlcnMgPSAkaOKAjV9hKV1dLFtcInJlY29yZE5hbWVzXCIsIFskaOKAjV9hID0+IChyZWNvcmROYW1lcyA9ICRo4oCNX2EpXV0sW1wicmVjb3JkVmFsdWVzXCIsIFskaOKAjV9hID0+IChyZWNvcmRWYWx1ZXMgPSAkaOKAjV9hKV1dXV0sW1wiLi4vdXRpbHMuanNcIiwgW1tcImlkZW50Q2hlY2tlclwiLCBbJGjigI1fYSA9PiAoaWRlbnRDaGVja2VyID0gJGjigI1fYSldXSxbXCJhcHBseUxhYmVsaW5nRXJyb3JcIiwgWyRo4oCNX2EgPT4gKGFwcGx5TGFiZWxpbmdFcnJvciA9ICRo4oCNX2EpXV0sW1wiZnJvbVVuaXF1ZUVudHJpZXNcIiwgWyRo4oCNX2EgPT4gKGZyb21VbmlxdWVFbnRyaWVzID0gJGjigI1fYSldXSxbXCJsaXN0RGlmZmVyZW5jZVwiLCBbJGjigI1fYSA9PiAobGlzdERpZmZlcmVuY2UgPSAkaOKAjV9hKV1dXV0sW1wiLi4va2V5cy9jb21wYXJlS2V5cy5qc1wiLCBbW1wia2V5RVFcIiwgWyRo4oCNX2EgPT4gKGtleUVRID0gJGjigI1fYSldXSxbXCJrZXlHVFwiLCBbJGjigI1fYSA9PiAoa2V5R1QgPSAkaOKAjV9hKV1dLFtcImtleUdURVwiLCBbJGjigI1fYSA9PiAoa2V5R1RFID0gJGjigI1fYSldXSxbXCJrZXlMVFwiLCBbJGjigI1fYSA9PiAoa2V5TFQgPSAkaOKAjV9hKV1dLFtcImtleUxURVwiLCBbJGjigI1fYSA9PiAoa2V5TFRFID0gJGjigI1fYSldXV1dLFtcIi4uL2tleXMvY2hlY2tLZXkuanNcIiwgW1tcImFzc2VydEtleVwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0S2V5ID0gJGjigI1fYSldXSxbXCJjaGVja0tleVwiLCBbJGjigI1fYSA9PiAoY2hlY2tLZXkgPSAkaOKAjV9hKV1dLFtcImlzS2V5XCIsIFskaOKAjV9hID0+IChpc0tleSA9ICRo4oCNX2EpXV0sW1wiY2hlY2tTY2FsYXJLZXlcIiwgWyRo4oCNX2EgPT4gKGNoZWNrU2NhbGFyS2V5ID0gJGjigI1fYSldXSxbXCJjaGVja0NvcHlTZXRcIiwgWyRo4oCNX2EgPT4gKGNoZWNrQ29weVNldCA9ICRo4oCNX2EpXV0sW1wiY2hlY2tDb3B5TWFwXCIsIFskaOKAjV9hID0+IChjaGVja0NvcHlNYXAgPSAkaOKAjV9hKV1dLFtcImNvcHlNYXBLZXlTZXRcIiwgWyRo4oCNX2EgPT4gKGNvcHlNYXBLZXlTZXQgPSAkaOKAjV9hKV1dLFtcImNoZWNrQ29weUJhZ1wiLCBbJGjigI1fYSA9PiAoY2hlY2tDb3B5QmFnID0gJGjigI1fYSldXSxbXCJnZXRDb3B5TWFwRW50cnlBcnJheVwiLCBbJGjigI1fYSA9PiAoZ2V0Q29weU1hcEVudHJ5QXJyYXkgPSAkaOKAjV9hKV1dLFtcIm1ha2VDb3B5TWFwXCIsIFskaOKAjV9hID0+IChtYWtlQ29weU1hcCA9ICRo4oCNX2EpXV0sW1wiZ2V0Q29weU1hcEtleXNcIiwgWyRo4oCNX2EgPT4gKGdldENvcHlNYXBLZXlzID0gJGjigI1fYSldXV1dLFtcIi4uL2tleXMva2V5Y29sbGVjdGlvbi1vcGVyYXRvcnMuanNcIiwgW1tcImdlbmVyYXRlQ29sbGVjdGlvblBhaXJFbnRyaWVzXCIsIFskaOKAjV9hID0+IChnZW5lcmF0ZUNvbGxlY3Rpb25QYWlyRW50cmllcyA9ICRo4oCNX2EpXV1dXSxbXCIuL2ludGVybmFsLXR5cGVzLmpzXCIsIFtdXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyovIDxyZWZlcmVuY2UgdHlwZXM9XCJzZXNcIi8+Ki9cblxuY29uc3R7cXVvdGU6cSxiYXJlOmIsZGV0YWlsczpYLEZhaWx9PWFzc2VydDtcbmNvbnN0e2VudHJpZXMsdmFsdWVzfT1PYmplY3Q7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuXG4vKiogQHR5cGUge1dlYWtTZXQ8UGF0dGVybj59ICovXG5jb25zdCBwYXR0ZXJuTWVtbz1uZXcgV2Vha1NldCgpO1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBNYXRjaCBIZWxwZXJzIEhlbHBlcnMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKiogRm9yIGZvcndhcmQgcmVmZXJlbmNlcyB0byBgTWAgKi9cbmxldCBNTTtcblxuLyoqXG4gKiBUaGUgYWN0dWFsIGRlZmF1bHQgdmFsdWVzIGhlcmUgYXJlLCBhdCB0aGUgcHJlc2VudCB0aW1lLCBmYWlybHlcbiAqIGFyYml0cmFyeSBjaG9pY2VzIGFuZCBtYXkgY2hhbmdlIGJlZm9yZSB0aGV5IHNldHRsZSBkb3duLiBPZiBjb3Vyc2VcbiAqIGF0IHNvbWUgcG9pbnQgd2UnbGwgbmVlZCB0byBzdG9wIGNoYW5naW5nIHRoZW0uIEJ1dCB3ZSBzaG91bGQgZmlyc3RcbiAqIHNlZSBob3cgb3VyIHN5c3RlbSBob2xkcyB1cCB3aXRoIHRoZXNlIGNob2ljZXMuIFRoZSBtYWluIGNyaXRlcmlhXG4gKiBpcyB0aGF0IHRoZXkgYmUgYmlnIGVub3VnaCB0aGF0IFwibm9ybWFsXCIgaW5ub2NlbnQgcHJvZ3JhbXMgcmFyZWx5XG4gKiBlbmNvdW50ZXIgdGhlc2UgbGltaXRzLlxuICpcbiAqIEV4cG9ydGVkIHByaW1hcmlseSBmb3IgdGVzdGluZy5cbiAqL1xuY29uc3QgICAgICAgIGRlZmF1bHRMaW1pdHM9aGFyZGVuKHtcbmRlY2ltYWxEaWdpdHNMaW1pdDoxMDAsXG5zdHJpbmdMZW5ndGhMaW1pdDoxMDBfMDAwLFxuc3ltYm9sTmFtZUxlbmd0aExpbWl0OjEwMCxcbm51bVByb3BlcnRpZXNMaW1pdDo4MCxcbnByb3BlcnR5TmFtZUxlbmd0aExpbWl0OjEwMCxcbmFycmF5TGVuZ3RoTGltaXQ6MTBfMDAwLFxubnVtU2V0RWxlbWVudHNMaW1pdDoxMF8wMDAsXG5udW1VbmlxdWVCYWdFbGVtZW50c0xpbWl0OjEwXzAwMCxcbm51bU1hcEVudHJpZXNMaW1pdDo1MDAwfSk7XG5cblxuLyoqXG4gKiBVc2UgdGhlIHJlc3VsdCBvbmx5IHRvIGdldCB0aGUgbGltaXRzIHlvdSBuZWVkIGJ5IGRlc3RydWN0dXJpbmcuXG4gKiBUaHVzLCB0aGUgcmVzdWx0IG9ubHkgbmVlZHMgdG8gc3VwcG9ydCBkZXN0cnVjdHVyaW5nLiBUaGUgY3VycmVudFxuICogaW1wbGVtZW50YXRpb24gdXNlcyBpbmhlcml0YW5jZSBhcyBhIGNoZWFwIGhhY2suXG4gKlxuICogQHBhcmFtIHtMaW1pdHN9IFtsaW1pdHNdXG4gKiBAcmV0dXJucyB7QWxsTGltaXRzfVxuICovJGjigI1fb25jZS5kZWZhdWx0TGltaXRzKGRlZmF1bHRMaW1pdHMpO1xuY29uc3QgbGltaXQ9KGxpbWl0cz17fSk9PlxuLyoqIEB0eXBlIHtBbGxMaW1pdHN9ICovaGFyZGVuKHtfX3Byb3RvX186ZGVmYXVsdExpbWl0cywuLi5saW1pdHN9KTtcblxuY29uc3QgY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQ9KFxucGF5bG9hZCxcbm1haW5QYXlsb2FkU2hhcGUsXG5jaGVjayxcbmxhYmVsKT0+XG57XG5hc3NlcnQoQXJyYXkuaXNBcnJheShtYWluUGF5bG9hZFNoYXBlKSk7XG5pZighQXJyYXkuaXNBcnJheShwYXlsb2FkKSl7XG5yZXR1cm4gY2hlY2soZmFsc2UsWCBgJHtxKGxhYmVsKX0gcGF5bG9hZCBtdXN0IGJlIGFuIGFycmF5OiAke3BheWxvYWR9YCk7XG4gfVxuXG4vKiBXYXMgdGhlIGZvbGxvd2luZywgYnV0IGl0cyBvdmVydXNlIG9mIHBhdHRlcm5zIGNhdXNlZCBhbiBpbmZpbml0ZSByZWdyZXNzKi9cbi8qIGNvbnN0IHBheWxvYWRMaW1pdFNoYXBlID0gaGFyZGVuKCovXG4vKiBNLnNwbGl0KCovXG4vKiBtYWluUGF5bG9hZFNoYXBlLCovXG4vKiBNLnBhcnRpYWwoaGFyZGVuKFtNLnJlY29yZE9mKE0uc3RyaW5nKCksIE0ubnVtYmVyKCkpXSksIGhhcmRlbihbXSkpLCovXG4vKiApLCovXG4vKiApOyovXG4vKiByZXR1cm4gY2hlY2tNYXRjaGVzKHBheWxvYWQsIHBheWxvYWRMaW1pdFNoYXBlLCBjaGVjaywgbGFiZWwpOyovXG5cbmNvbnN0IG1haW5MZW5ndGg9bWFpblBheWxvYWRTaGFwZS5sZW5ndGg7XG5pZighKHBheWxvYWQubGVuZ3RoPT09bWFpbkxlbmd0aHx8cGF5bG9hZC5sZW5ndGg9PT1tYWluTGVuZ3RoKzEpKXtcbnJldHVybiBjaGVjayhmYWxzZSxYIGAke3EobGFiZWwpfSBwYXlsb2FkIHVuZXhwZWN0ZWQgc2l6ZTogJHtwYXlsb2FkfWApO1xuIH1cbmNvbnN0IGxpbWl0cz1wYXlsb2FkW21haW5MZW5ndGhdO1xucGF5bG9hZD1oYXJkZW4ocGF5bG9hZC5zbGljZSgwLG1haW5MZW5ndGgpKTtcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5pZighY2hlY2tNYXRjaGVzKHBheWxvYWQsbWFpblBheWxvYWRTaGFwZSxjaGVjayxsYWJlbCkpe1xucmV0dXJuIGZhbHNlO1xuIH1cbmlmKGxpbWl0cz09PXVuZGVmaW5lZCl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5yZXR1cm4oXG4ocGFzc1N0eWxlT2YobGltaXRzKT09PSdjb3B5UmVjb3JkJ3x8XG5jaGVjayhmYWxzZSxYIGBMaW1pdHMgbXVzdCBiZSBhIHJlY29yZDogJHtxKGxpbWl0cyl9YCkpJiZcbmVudHJpZXMobGltaXRzKS5ldmVyeShcbihba2V5LHZhbHVlXSk9PlxucGFzc1N0eWxlT2YodmFsdWUpPT09J251bWJlcid8fFxuY2hlY2soZmFsc2UsWCBgVmFsdWUgb2YgbGltaXQgJHtxKGtleSl9IGJ1dCBiZSBhIG51bWJlcjogJHtxKHZhbHVlKX1gKSkpO1xuXG5cbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7bnVtYmVyfSBkZWNpbWFsRGlnaXRzTGltaXRcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqL1xuY29uc3QgY2hlY2tEZWNpbWFsRGlnaXRzTGltaXQ9KHNwZWNpbWVuLGRlY2ltYWxEaWdpdHNMaW1pdCxjaGVjayk9PntcbmlmKFxuTWF0aC5mbG9vcihNYXRoLmxvZzEwKE1hdGguYWJzKE51bWJlcihzcGVjaW1lbikpKSkrMTw9XG5kZWNpbWFsRGlnaXRzTGltaXQpXG57XG5yZXR1cm4gdHJ1ZTtcbiB9XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYGJpZ2ludCAke3NwZWNpbWVufSBtdXN0IG5vdCBoYXZlIG1vcmUgdGhhbiAke2RlY2ltYWxEaWdpdHNMaW1pdH0gZGlnaXRzYCk7XG5cbiB9O1xuXG4vKipcbiAqIEByZXR1cm5zIHtQYXR0ZXJuS2l0fVxuICovXG5jb25zdCBtYWtlUGF0dGVybktpdD0oKT0+e1xuLyoqXG4gKiBJZiB0aGlzIGlzIGEgcmVjb2duaXplZCBtYXRjaCB0YWcsIHJldHVybiB0aGUgTWF0Y2hIZWxwZXIuXG4gKiBPdGhlcndpc2UgcmVzdWx0IHVuZGVmaW5lZC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnXG4gKiBAcmV0dXJucyB7TWF0Y2hIZWxwZXIgfCB1bmRlZmluZWR9XG4gKi9cbmNvbnN0IG1heWJlTWF0Y2hIZWxwZXI9KHRhZyk9PlxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbkhlbHBlcnNCeU1hdGNoVGFnW3RhZ107XG5cbi8qKlxuICogQHR5cGVkZWYge0V4Y2x1ZGU8UGFzc1N0eWxlLCAndGFnZ2VkJz4gfFxuICogICAnY29weVNldCcgfCAnY29weUJhZycgfCAnY29weU1hcCcgfCBrZXlvZiBIZWxwZXJzQnlNYXRjaFRhZ1xuICogfSBLaW5kXG4gKiBJdCBpcyBlaXRoZXIgYSBQYXNzU3R5bGUgb3RoZXIgdGhhbiAndGFnZ2VkJywgb3IsIGlmIHRoZSB1bmRlcmx5aW5nXG4gKiBQYXNzU3R5bGUgaXMgJ3RhZ2dlZCcsIHRoZW4gdGhlIGBnZXRUYWdgIHZhbHVlIGZvciB0YWdzIHRoYXQgYXJlXG4gKiByZWNvZ25pemVkIGF0IHRoZSBzdG9yZSBsZXZlbCBvZiBhYnN0cmFjdGlvbi4gRm9yIGVhY2ggb2YgdGhvc2VcbiAqIHRhZ3MsIGEgdGFnZ2VkIHJlY29yZCBvbmx5IGhhcyB0aGF0IGtpbmQgaWYgaXQgc2F0aXNmaWVzIHRoZSBpbnZhcmlhbnRzXG4gKiB0aGF0IHRoZSBzdG9yZSBsZXZlbCBhc3NvY2lhdGVzIHdpdGggdGhhdCBraW5kLlxuICovXG5cbi8qKiBAdHlwZSB7TWFwPEtpbmQsIHVua25vd24+fSAqL1xuY29uc3Qgc2luZ2xldG9uS2luZHM9bmV3IE1hcChbXG5bJ251bGwnLG51bGxdLFxuWyd1bmRlZmluZWQnLHVuZGVmaW5lZF1dKTtcblxuXG4vKipcbiAqIEB0eXBlIHtXZWFrTWFwPENvcHlUYWdnZWQsIEtpbmQ+fVxuICogT25seSBmb3IgdGFnZ2VkIHJlY29yZHMgb2YgcmVjb2duaXplZCBraW5kcyB3aG9zZSBzdG9yZS1sZXZlbCBpbnZhcmlhbnRzXG4gKiBoYXZlIGFscmVhZHkgYmVlbiBjaGVja2VkLlxuICovXG5jb25zdCB0YWdNZW1vPW5ldyBXZWFrTWFwKCk7XG5cbi8qKlxuICogQ2hlY2tzIG9ubHkgcmVjb2duaXplZCB0YWdzLCBhbmQgb25seSBpZiB0aGUgdGFnZ2VkXG4gKiBwYXNzZXMgdGhlIGludmFyaWFudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgcmVjb2duaXRpb24uXG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gdGFnZ2VkXG4gKiBAcGFyYW0ge0tpbmR9IHRhZ1xuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNoZWNrVGFnZ2VkPSh0YWdnZWQsdGFnLGNoZWNrKT0+e1xuY29uc3QgbWF0Y2hIZWxwZXI9bWF5YmVNYXRjaEhlbHBlcih0YWcpO1xuaWYobWF0Y2hIZWxwZXIpe1xuLyogQnVyaWVkIGhlcmUgaXMgdGhlIGltcG9ydGFudCBjYXNlLCB3aGVyZSB3ZSBwcm9jZXNzKi9cbi8qIHRoZSB2YXJpb3VzIHBhdHRlcm5Ob2RlcyovXG5yZXR1cm4gbWF0Y2hIZWxwZXIuY2hlY2tJc1dlbGxGb3JtZWQodGFnZ2VkLnBheWxvYWQsY2hlY2spO1xuIH1cbnN3aXRjaCh0YWcpe1xuY2FzZSdjb3B5U2V0Jzp7XG5yZXR1cm4gY2hlY2tDb3B5U2V0KHRhZ2dlZCxjaGVjayk7XG4gfVxuY2FzZSdjb3B5QmFnJzp7XG5yZXR1cm4gY2hlY2tDb3B5QmFnKHRhZ2dlZCxjaGVjayk7XG4gfVxuY2FzZSdjb3B5TWFwJzp7XG5yZXR1cm4gY2hlY2tDb3B5TWFwKHRhZ2dlZCxjaGVjayk7XG4gfVxuZGVmYXVsdDp7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYGNhbm5vdCBjaGVjayB1bnJlY29nbml6ZWQgdGFnICR7cSh0YWcpfTogJHt0YWdnZWR9YCk7XG5cbiB9fVxuXG4gfTtcblxuLyoqXG4gKiBSZXR1cm5zIG9ubHkgYSByZWNvZ25pemVkIGtpbmQsIGFuZCBvbmx5IGlmIHRoZSBzcGVjaW1lbiBwYXNzZXMgdGhlXG4gKiBpbnZhcmlhbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IHJlY29nbml0aW9uLlxuICogT3RoZXJ3aXNlLCBgY2hlY2soZmFsc2UsIC4uLilgIGFuZCByZXR1cm5zIHVuZGVmaW5lZFxuICpcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHNwZWNpbWVuXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IFtjaGVja11cbiAqIEByZXR1cm5zIHtLaW5kIHwgdW5kZWZpbmVkfVxuICovXG5jb25zdCBraW5kT2Y9KHNwZWNpbWVuLGNoZWNrPWlkZW50Q2hlY2tlcik9PntcbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihzcGVjaW1lbik7XG5pZihwYXNzU3R5bGUhPT0ndGFnZ2VkJyl7XG5yZXR1cm4gcGFzc1N0eWxlO1xuIH1cbi8qIEF0IHRoaXMgcG9pbnQgd2Uga25vdyB0aGF0IHNwZWNpbWVuIGlzIHdlbGwgZm9ybWVkKi9cbi8qIGFzIGEgdGFnZ2VkIHJlY29yZCwgd2hpY2ggaXMgZGVmaW5lZCBhdCB0aGUgbWFyc2hhbCBsZXZlbCBvZiBhYnN0cmFjdGlvbiwqL1xuLyogc2luY2UgYHBhc3NTdHlsZU9mYCBjaGVja3MgdGhvc2UgaW52YXJpYW50cy4qL1xuaWYodGFnTWVtby5oYXMoc3BlY2ltZW4pKXtcbnJldHVybiB0YWdNZW1vLmdldChzcGVjaW1lbik7XG4gfVxuY29uc3QgdGFnPWdldFRhZyhzcGVjaW1lbik7XG5pZihjaGVja1RhZ2dlZChzcGVjaW1lbix0YWcsY2hlY2spKXtcbnRhZ01lbW8uc2V0KHNwZWNpbWVuLHRhZyk7XG5yZXR1cm4gdGFnO1xuIH1cbmlmKGNoZWNrIT09aWRlbnRDaGVja2VyKXtcbmNoZWNrKGZhbHNlLFggYGNhbm5vdCBjaGVjayB1bnJlY29nbml6ZWQgdGFnICR7cSh0YWcpfWApO1xuIH1cbnJldHVybiB1bmRlZmluZWQ7XG4gfTtcbmhhcmRlbihraW5kT2YpO1xuXG4vKipcbiAqIENoZWNrcyBvbmx5IHJlY29nbml6ZWQga2luZHMsIGFuZCBvbmx5IGlmIHRoZSBzcGVjaW1lblxuICogcGFzc2VzIHRoZSBpbnZhcmlhbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IHJlY29nbml0aW9uLlxuICpcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHNwZWNpbWVuXG4gKiBAcGFyYW0ge0tpbmR9IGtpbmRcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjaGVja0tpbmQ9KHNwZWNpbWVuLGtpbmQsY2hlY2spPT57XG4vKiBjaGVjayBudWxsIGFuZCB1bmRlZmluZWQgYXMgS2V5cyovXG5pZihzaW5nbGV0b25LaW5kcy5oYXMoa2luZCkpe1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbnJldHVybiBjaGVja0FzS2V5UGF0dChzcGVjaW1lbixzaW5nbGV0b25LaW5kcy5nZXQoa2luZCksY2hlY2spO1xuIH1cblxuY29uc3QgcmVhbEtpbmQ9a2luZE9mKHNwZWNpbWVuLGNoZWNrKTtcbmlmKGtpbmQ9PT1yZWFsS2luZCl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5pZihjaGVjayE9PWlkZW50Q2hlY2tlcil7XG4vKiBga2luZGAgYW5kIGByZWFsS2luZGAgY2FuIGJlIGVtYmVkZGVkIHdpdGhvdXQgcXVvdGVzKi9cbi8qIGJlY2F1c2UgdGhleSBhcmUgZHJhd24gZnJvbSB0aGUgZW51bWVyYXRlZCBjb2xsZWN0aW9uIG9mIGtub3duIEtpbmRzLiovXG5jaGVjayhmYWxzZSxYIGAke2IocmVhbEtpbmQpfSAke3NwZWNpbWVufSAtIE11c3QgYmUgYSAke2Ioa2luZCl9YCk7XG4gfVxucmV0dXJuIGZhbHNlO1xuIH07XG5cbi8qKlxuICogQ2hlY2tzIG9ubHkgcmVjb2duaXplZCBraW5kcywgYW5kIG9ubHkgaWYgdGhlIHNwZWNpbWVuXG4gKiBwYXNzZXMgdGhlIGludmFyaWFudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgcmVjb2duaXRpb24uXG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7S2luZH0ga2luZFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGlzS2luZD0oc3BlY2ltZW4sa2luZCk9PmNoZWNrS2luZChzcGVjaW1lbixraW5kLGlkZW50Q2hlY2tlcik7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7S2V5fSBrZXlBc1BhdHRlcm5cbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjaGVja0FzS2V5UGF0dD0oc3BlY2ltZW4sa2V5QXNQYXR0ZXJuLGNoZWNrKT0+e1xuaWYoaXNLZXkoc3BlY2ltZW4pJiZrZXlFUShzcGVjaW1lbixrZXlBc1BhdHRlcm4pKXtcbnJldHVybiB0cnVlO1xuIH1cbnJldHVybihcbmNoZWNrIT09aWRlbnRDaGVja2VyJiZcbi8qIFdoZW4gdGhlIG1pc21hdGNoIG9jY3VycyBhZ2FpbnN0IGEga2V5IHVzZWQgYXMgYSBwYXR0ZXJuLCovXG4vKiB0aGUgcGF0dGVybiBzaG91bGQgc3RpbGwgYmUgcmVkYWN0ZWQuKi9cbmNoZWNrKGZhbHNlLFggYCR7c3BlY2ltZW59IC0gTXVzdCBiZTogJHtrZXlBc1BhdHRlcm59YCkpO1xuXG4gfTtcblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gaXNQYXR0ZXJuIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqIEB0eXBlIHtDaGVja1BhdHRlcm59ICovXG5jb25zdCBjaGVja1BhdHRlcm49KHBhdHQsY2hlY2spPT57XG5pZihpc0tleShwYXR0KSl7XG4vKiBBbGwga2V5cyBhcmUgcGF0dGVybnMuIEZvciB0aGVzZSwgdGhlIGtleU1lbW8gd2lsbCBkby4qL1xuLyogQWxsIHByaW1pdGl2ZXMgdGhhdCBhcmUgcGF0dGVybnMgYXJlIGFsc28ga2V5cywgd2hpY2ggdGhpcyovXG4vKiBhbHNvIHRha2VzIGNhcmUgb2Ygd2l0aG91dCBtZW1vLiBUaGUgcmVzdCBvZiBvdXIgY2hlY2tpbmcgbG9naWMqL1xuLyogaXMgb25seSBjb25jZXJuZWQgd2l0aCBub24ta2V5IHBhdHRlcm5zLiovXG5yZXR1cm4gdHJ1ZTtcbiB9XG5pZihwYXR0ZXJuTWVtby5oYXMocGF0dCkpe1xucmV0dXJuIHRydWU7XG4gfVxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbmNvbnN0IHJlc3VsdD1jaGVja1BhdHRlcm5JbnRlcm5hbChwYXR0LGNoZWNrKTtcbmlmKHJlc3VsdCl7XG5wYXR0ZXJuTWVtby5hZGQocGF0dCk7XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHBhdHQgLSBrbm93biBub3QgdG8gYmUgYSBrZXksIGFuZCB0aGVyZWZvcmUga25vd25cbiAqIG5vdCB0byBiZSBwcmltaXRpdmUuXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tQYXR0ZXJuSW50ZXJuYWw9KHBhdHQsY2hlY2spPT57XG4vKiBQdXJwb3NlbHkgcGFyYWxsZWxzIGNoZWNrS2V5LiBUT0RPIHJldXNlIG1vcmUgbG9naWMgYmV0d2VlbiB0aGVtLiovXG4vKiBNb3N0IG9mIHRoZSB0ZXh0IG9mIHRoZSBzd2l0Y2ggYmVsb3cgbm90IGRlYWxpbmcgd2l0aCBtYXRjaGVycyBpcyovXG4vKiBlc3NlbnRpYWxseSBpZGVudGljYWwuKi9cbmNvbnN0IGNoZWNrSXQ9KGNoaWxkKT0+Y2hlY2tQYXR0ZXJuKGNoaWxkLGNoZWNrKTtcblxuY29uc3Qga2luZD1raW5kT2YocGF0dCxjaGVjayk7XG5zd2l0Y2goa2luZCl7XG5jYXNlIHVuZGVmaW5lZDp7XG5yZXR1cm4gZmFsc2U7XG4gfVxuY2FzZSdjb3B5UmVjb3JkJzp7XG4vKiBBIGNvcHlSZWNvcmQgaXMgYSBwYXR0ZXJuIGlmZiBhbGwgaXRzIGNoaWxkcmVuIGFyZSovXG4vKiBwYXR0ZXJucyovXG5yZXR1cm4gdmFsdWVzKHBhdHQpLmV2ZXJ5KGNoZWNrSXQpO1xuIH1cbmNhc2UnY29weUFycmF5Jzp7XG4vKiBBIGNvcHlBcnJheSBpcyBhIHBhdHRlcm4gaWZmIGFsbCBpdHMgY2hpbGRyZW4gYXJlKi9cbi8qIHBhdHRlcm5zKi9cbnJldHVybiBwYXR0LmV2ZXJ5KGNoZWNrSXQpO1xuIH1cbmNhc2UnY29weU1hcCc6e1xuLyogQSBjb3B5TWFwJ3Mga2V5cyBhcmUga2V5cyBhbmQgdGhlcmVmb3JlIGFscmVhZHkga25vd24gdG8gYmUqL1xuLyogcGF0dGVybnMuKi9cbi8qIEEgY29weU1hcCBpcyBhIHBhdHRlcm4gaWYgaXRzIHZhbHVlcyBhcmUgcGF0dGVybnMuKi9cbnJldHVybiBjaGVja1BhdHRlcm4ocGF0dC52YWx1ZXMsY2hlY2spO1xuIH1cbmNhc2UnZXJyb3InOlxuY2FzZSdwcm9taXNlJzp7XG5yZXR1cm4gY2hlY2soZmFsc2UsWCBgQSAke3Eoa2luZCl9IGNhbm5vdCBiZSBhIHBhdHRlcm5gKTtcbiB9XG5kZWZhdWx0OntcbmlmKG1heWJlTWF0Y2hIZWxwZXIoa2luZCkhPT11bmRlZmluZWQpe1xucmV0dXJuIHRydWU7XG4gfVxucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGBBIHBhc3NhYmxlIG9mIGtpbmQgJHtxKGtpbmQpfSBpcyBub3QgYSBwYXR0ZXJuOiAke3BhdHR9YCk7XG5cbiB9fVxuXG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBwYXR0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgaXNQYXR0ZXJuPShwYXR0KT0+Y2hlY2tQYXR0ZXJuKHBhdHQsaWRlbnRDaGVja2VyKTtcblxuLyoqXG4gKiBAcGFyYW0ge1BhdHRlcm59IHBhdHRcbiAqL1xuY29uc3QgYXNzZXJ0UGF0dGVybj0ocGF0dCk9PntcbmNoZWNrUGF0dGVybihwYXR0LGFzc2VydENoZWNrZXIpO1xuIH07XG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIG1hdGNoZXMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7UGF0dGVybn0gcGF0dGVyblxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBbbGFiZWxdXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tNYXRjaGVzPShzcGVjaW1lbixwYXR0ZXJuLGNoZWNrLGxhYmVsPXVuZGVmaW5lZCk9PlxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbmFwcGx5TGFiZWxpbmdFcnJvcihjaGVja01hdGNoZXNJbnRlcm5hbCxbc3BlY2ltZW4scGF0dGVybixjaGVja10sbGFiZWwpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHNwZWNpbWVuXG4gKiBAcGFyYW0ge1BhdHRlcm59IHBhdHRcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjaGVja01hdGNoZXNJbnRlcm5hbD0oc3BlY2ltZW4scGF0dCxjaGVjayk9Pntcbi8qIFdvcnRoIGJlaW5nIGEgYml0IHZlcmJvc2UgYW5kIHJlcGV0aXRpdmUgaW4gb3JkZXIgdG8gb3B0aW1pemUqL1xuY29uc3QgcGF0dGVybktpbmQ9a2luZE9mKHBhdHQsY2hlY2spO1xuY29uc3Qgc3BlY2ltZW5LaW5kPWtpbmRPZihzcGVjaW1lbik7LyogbWF5IGJlIHVuZGVmaW5lZCovXG5zd2l0Y2gocGF0dGVybktpbmQpe1xuY2FzZSB1bmRlZmluZWQ6e1xucmV0dXJuIEZhaWwgYHBhdHRlcm4gZXhwZWN0ZWQ6ICR7cGF0dH1gO1xuIH1cbmNhc2UncHJvbWlzZSc6e1xucmV0dXJuIEZhaWwgYHByb21pc2VzIGNhbm5vdCBiZSBwYXR0ZXJuczogJHtwYXR0fWA7XG4gfVxuY2FzZSdlcnJvcic6e1xucmV0dXJuIEZhaWwgYGVycm9ycyBjYW5ub3QgYmUgcGF0dGVybnM6ICR7cGF0dH1gO1xuIH1cbmNhc2UndW5kZWZpbmVkJzpcbmNhc2UnbnVsbCc6XG5jYXNlJ2Jvb2xlYW4nOlxuY2FzZSdudW1iZXInOlxuY2FzZSdiaWdpbnQnOlxuY2FzZSdzdHJpbmcnOlxuY2FzZSdzeW1ib2wnOlxuY2FzZSdjb3B5U2V0JzpcbmNhc2UnY29weUJhZyc6XG5jYXNlJ3JlbW90YWJsZSc6e1xuLyogVGhlc2Uga2luZHMgYXJlIG5lY2Vzc2FyaWx5IGtleXMqL1xucmV0dXJuIGNoZWNrQXNLZXlQYXR0KHNwZWNpbWVuLHBhdHQsY2hlY2spO1xuIH1cbmNhc2UnY29weUFycmF5Jzp7XG5pZihpc0tleShwYXR0KSl7XG4vKiBUYWtlcyBjYXJlIG9mIHBhdHRlcm5zIHdoaWNoIGFyZSBrZXlzLCBzbyB0aGUgcmVzdCBvZiB0aGlzKi9cbi8qIGxvZ2ljIGNhbiBhc3N1bWUgcGF0dGVybnMgdGhhdCBhcmUgbm90IGtleXMuKi9cbnJldHVybiBjaGVja0FzS2V5UGF0dChzcGVjaW1lbixwYXR0LGNoZWNrKTtcbiB9XG5pZihzcGVjaW1lbktpbmQhPT0nY29weUFycmF5Jyl7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYCR7c3BlY2ltZW59IC0gTXVzdCBiZSBhIGNvcHlBcnJheSB0byBtYXRjaCBhIGNvcHlBcnJheSBwYXR0ZXJuOiAke3EoXG5wYXR0KVxuIH1gKTtcblxuIH1cbmNvbnN0e2xlbmd0aH09cGF0dDtcbmlmKHNwZWNpbWVuLmxlbmd0aCE9PWxlbmd0aCl7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYEFycmF5ICR7c3BlY2ltZW59IC0gTXVzdCBiZSBhcyBsb25nIGFzIGNvcHlBcnJheSBwYXR0ZXJuOiAke3EoXG5wYXR0KVxuIH1gKTtcblxuIH1cbnJldHVybiBwYXR0LmV2ZXJ5KChwLGkpPT5jaGVja01hdGNoZXMoc3BlY2ltZW5baV0scCxjaGVjayxpKSk7XG4gfVxuY2FzZSdjb3B5UmVjb3JkJzp7XG5pZihpc0tleShwYXR0KSl7XG4vKiBUYWtlcyBjYXJlIG9mIHBhdHRlcm5zIHdoaWNoIGFyZSBrZXlzLCBzbyB0aGUgcmVzdCBvZiB0aGlzKi9cbi8qIGxvZ2ljIGNhbiBhc3N1bWUgcGF0dGVybnMgdGhhdCBhcmUgbm90IGtleXMuKi9cbnJldHVybiBjaGVja0FzS2V5UGF0dChzcGVjaW1lbixwYXR0LGNoZWNrKTtcbiB9XG5pZihzcGVjaW1lbktpbmQhPT0nY29weVJlY29yZCcpe1xucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGAke3NwZWNpbWVufSAtIE11c3QgYmUgYSBjb3B5UmVjb3JkIHRvIG1hdGNoIGEgY29weVJlY29yZCBwYXR0ZXJuOiAke3EoXG5wYXR0KVxuIH1gKTtcblxuIH1cbi8qIFRPRE8gRGV0ZWN0IGFuZCBhY2N1bXVsYXRlIGRpZmZlcmVuY2UgaW4gb25lIHBhc3MuKi9cbi8qIFJhdGhlciB0aGFuIHVzaW5nIHR3byBjYWxscyB0byBgbGlzdERpZmZlcmVuY2VgIHRvIGRldGVjdCBhbmQqL1xuLyogcmVwb3J0IGlmIGFuZCBob3cgdGhlc2UgbGlzdHMgZGlmZmVyLCBzaW5jZSB0aGV5IGFyZSBhbHJlYWR5Ki9cbi8qIGluIHNvcnRlZCBvcmRlciwgd2Ugc2hvdWxkIGluc3RlYWQgdXNlIGFuIGFsZ29yaXRobSBsaWtlKi9cbi8qIGBpdGVyRGlzam9pbnRVbmlvbmAgZnJvbSBtZXJnZS1zb3J0LW9wZXJhdG9ycy5qcyovXG5jb25zdCBzcGVjaW1lbk5hbWVzPXJlY29yZE5hbWVzKHNwZWNpbWVuKTtcbmNvbnN0IHBhdHROYW1lcz1yZWNvcmROYW1lcyhwYXR0KTtcbmNvbnN0IG1pc3Npbmc9bGlzdERpZmZlcmVuY2UocGF0dE5hbWVzLHNwZWNpbWVuTmFtZXMpO1xuaWYobWlzc2luZy5sZW5ndGg+PTEpe1xucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGAke3NwZWNpbWVufSAtIE11c3QgaGF2ZSBtaXNzaW5nIHByb3BlcnRpZXMgJHtxKG1pc3NpbmcpfWApO1xuXG4gfVxuY29uc3QgdW5leHBlY3RlZD1saXN0RGlmZmVyZW5jZShzcGVjaW1lbk5hbWVzLHBhdHROYW1lcyk7XG5pZih1bmV4cGVjdGVkLmxlbmd0aD49MSl7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYCR7c3BlY2ltZW59IC0gTXVzdCBub3QgaGF2ZSB1bmV4cGVjdGVkIHByb3BlcnRpZXM6ICR7cShcbnVuZXhwZWN0ZWQpXG4gfWApO1xuXG4gfVxuY29uc3Qgc3BlY2ltZW5WYWx1ZXM9cmVjb3JkVmFsdWVzKHNwZWNpbWVuLHNwZWNpbWVuTmFtZXMpO1xuY29uc3QgcGF0dFZhbHVlcz1yZWNvcmRWYWx1ZXMocGF0dCxwYXR0TmFtZXMpO1xucmV0dXJuIHBhdHROYW1lcy5ldmVyeSgobGFiZWwsaSk9PlxuY2hlY2tNYXRjaGVzKHNwZWNpbWVuVmFsdWVzW2ldLHBhdHRWYWx1ZXNbaV0sY2hlY2ssbGFiZWwpKTtcblxuIH1cbmNhc2UnY29weU1hcCc6e1xuaWYoaXNLZXkocGF0dCkpe1xuLyogVGFrZXMgY2FyZSBvZiBwYXR0ZXJucyB3aGljaCBhcmUga2V5cywgc28gdGhlIHJlc3Qgb2YgdGhpcyovXG4vKiBsb2dpYyBjYW4gYXNzdW1lIHBhdHRlcm5zIHRoYXQgYXJlIG5vdCBrZXlzLiovXG5yZXR1cm4gY2hlY2tBc0tleVBhdHQoc3BlY2ltZW4scGF0dCxjaGVjayk7XG4gfVxuaWYoc3BlY2ltZW5LaW5kIT09J2NvcHlNYXAnKXtcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgJHtzcGVjaW1lbn0gLSBNdXN0IGJlIGEgY29weU1hcCB0byBtYXRjaCBhIGNvcHlNYXAgcGF0dGVybjogJHtxKFxucGF0dClcbiB9YCk7XG5cbiB9XG4vKiBDb21wYXJlIGtleXMgYXMgY29weVNldHMqL1xuY29uc3QgcGF0dEtleVNldD1jb3B5TWFwS2V5U2V0KHBhdHQpO1xuY29uc3Qgc3BlY2ltZW5LZXlTZXQ9Y29weU1hcEtleVNldChzcGVjaW1lbik7XG5pZighY2hlY2tNYXRjaGVzKHNwZWNpbWVuS2V5U2V0LHBhdHRLZXlTZXQsY2hlY2spKXtcbnJldHVybiBmYWxzZTtcbiB9XG4vKiBDb21wYXJlIHZhbHVlcyBhcyBjb3B5QXJyYXlzIGFmdGVyIGFwcGx5aW5nIGEgc2hhcmVkIHRvdGFsIG9yZGVyLiovXG4vKiBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHRoZSBhbnRpUmFua09yZGVyIHNvcnRpbmcgb2YgZWFjaCBtYXAncyovXG4vKiBlbnRyaWVzIGlzIGEgcHJlb3JkZXIgdGhhdCBhZG1pdHMgdGllcy4qL1xuY29uc3QgcGF0dFZhbHVlcz1bXTtcbmNvbnN0IHNwZWNpbWVuVmFsdWVzPVtdO1xuY29uc3QgZW50cnlQYWlycz1nZW5lcmF0ZUNvbGxlY3Rpb25QYWlyRW50cmllcyhcbnBhdHQsXG5zcGVjaW1lbixcbmdldENvcHlNYXBFbnRyeUFycmF5LFxudW5kZWZpbmVkKTtcblxuZm9yKGNvbnN0W19rZXkscGF0dFZhbHVlLHNwZWNpbWVuVmFsdWVdb2YgZW50cnlQYWlycyl7XG5wYXR0VmFsdWVzLnB1c2gocGF0dFZhbHVlKTtcbnNwZWNpbWVuVmFsdWVzLnB1c2goc3BlY2ltZW5WYWx1ZSk7XG4gfVxucmV0dXJuIGNoZWNrTWF0Y2hlcyhoYXJkZW4oc3BlY2ltZW5WYWx1ZXMpLGhhcmRlbihwYXR0VmFsdWVzKSxjaGVjayk7XG4gfVxuZGVmYXVsdDp7XG5jb25zdCBtYXRjaEhlbHBlcj1tYXliZU1hdGNoSGVscGVyKHBhdHRlcm5LaW5kKTtcbmlmKG1hdGNoSGVscGVyKXtcbnJldHVybiBtYXRjaEhlbHBlci5jaGVja01hdGNoZXMoc3BlY2ltZW4scGF0dC5wYXlsb2FkLGNoZWNrKTtcbiB9XG50aHJvdyBGYWlsIGBpbnRlcm5hbDogc2hvdWxkIGhhdmUgcmVjb2duaXplZCAke3EocGF0dGVybktpbmQpfSBgO1xuIH19XG5cbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHNwZWNpbWVuXG4gKiBAcGFyYW0ge1BhdHRlcm59IHBhdHRcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBtYXRjaGVzPShzcGVjaW1lbixwYXR0KT0+XG5jaGVja01hdGNoZXMoc3BlY2ltZW4scGF0dCxpZGVudENoZWNrZXIpO1xuXG4vKipcbiAqIFJldHVybmluZyBub3JtYWxseSBpbmRpY2F0ZXMgc3VjY2Vzcy4gTWF0Y2ggZmFpbHVyZSBpcyBpbmRpY2F0ZWQgYnlcbiAqIHRocm93aW5nLlxuICpcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHNwZWNpbWVuXG4gKiBAcGFyYW0ge1BhdHRlcm59IHBhdHRcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gW2xhYmVsXVxuICovXG5jb25zdCBtdXN0TWF0Y2g9KHNwZWNpbWVuLHBhdHQsbGFiZWw9dW5kZWZpbmVkKT0+e1xuaWYoY2hlY2tNYXRjaGVzKHNwZWNpbWVuLHBhdHQsaWRlbnRDaGVja2VyLGxhYmVsKSl7XG5yZXR1cm47XG4gfVxuLyogc2hvdWxkIG9ubHkgdGhyb3cqL1xuY2hlY2tNYXRjaGVzKHNwZWNpbWVuLHBhdHQsYXNzZXJ0Q2hlY2tlcixsYWJlbCk7XG5GYWlsIGBpbnRlcm5hbDogJHtsYWJlbH06IGluY29uc2lzdGVudCBwYXR0ZXJuIG1hdGNoOiAke3EocGF0dCl9YDtcbiB9O1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBnZXRSYW5rQ292ZXIgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKiogQHR5cGUge0dldFJhbmtDb3Zlcn0gKi9cbmNvbnN0IGdldFJhbmtDb3Zlcj0ocGF0dCxlbmNvZGVQYXNzYWJsZSk9PntcbmlmKGlzS2V5KHBhdHQpKXtcbmNvbnN0IGVuY29kZWQ9ZW5jb2RlUGFzc2FibGUocGF0dCk7XG5pZihlbmNvZGVkIT09dW5kZWZpbmVkKXtcbnJldHVybltlbmNvZGVkLCBgJHtlbmNvZGVkfX5gXTtcbiB9XG4gfVxuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHBhdHQpO1xuc3dpdGNoKHBhc3NTdHlsZSl7XG5jYXNlJ2NvcHlBcnJheSc6e1xuLyogWFhYIHRoaXMgZG9lc24ndCBnZXQgYWxvbmcgd2l0aCB0aGUgd29ybGQgb2YgY292ZXIgPT09IHBhaXIgb2YqL1xuLyogc3RyaW5ncy4gSW4gdGhlIG1lYW50aW1lLCBmYWxsIHRocm91Z2ggdG8gdGhlIGRlZmF1bHQgd2hpY2gqL1xuLyogcmV0dXJucyBhIGNvdmVyIHRoYXQgY292ZXJzIGFsbCBjb3B5QXJyYXlzLiovXG4vKiovXG4vKiBjb25zdCByYW5rQ292ZXJzID0gcGF0dC5tYXAocCA9PiBnZXRSYW5rQ292ZXIocCwgZW5jb2RlUGFzc2FibGUpKTsqL1xuLyogcmV0dXJuIGhhcmRlbihbKi9cbi8qIHJhbmtDb3ZlcnMubWFwKChbbGVmdCwgX3JpZ2h0XSkgPT4gbGVmdCksKi9cbi8qIHJhbmtDb3ZlcnMubWFwKChbX2xlZnQsIHJpZ2h0XSkgPT4gcmlnaHQpLCovXG4vKiBdKTsqL1xuYnJlYWs7XG4gfVxuY2FzZSdjb3B5UmVjb3JkJzp7XG4vKiBYWFggdGhpcyBkb2Vzbid0IGdldCBhbG9uZyB3aXRoIHRoZSB3b3JsZCBvZiBjb3ZlciA9PT0gcGFpciBvZiovXG4vKiBzdHJpbmdzLiBJbiB0aGUgbWVhbnRpbWUsIGZhbGwgdGhyb3VnaCB0byB0aGUgZGVmYXVsdCB3aGljaCovXG4vKiByZXR1cm5zIGEgY292ZXIgdGhhdCBjb3ZlcnMgYWxsIGNvcHlSZWNvcmRzLiovXG4vKiovXG4vKiBjb25zdCBwYXR0S2V5cyA9IG93bktleXMocGF0dCk7Ki9cbi8qIGNvbnN0IHBhdHRFbnRyaWVzID0gaGFyZGVuKHBhdHRLZXlzLm1hcChrZXkgPT4gW2tleSwgcGF0dFtrZXldXSkpOyovXG4vKiBjb25zdCBbbGVmdEVudHJpZXNMaW1pdCwgcmlnaHRFbnRyaWVzTGltaXRdID0qL1xuLyogZ2V0UmFua0NvdmVyKHBhdHRFbnRyaWVzKTsqL1xuLyogcmV0dXJuIGhhcmRlbihbKi9cbi8qIGZyb21VbmlxdWVFbnRyaWVzKGxlZnRFbnRyaWVzTGltaXQpLCovXG4vKiBmcm9tVW5pcXVlRW50cmllcyhyaWdodEVudHJpZXNMaW1pdCksKi9cbi8qIF0pOyovXG5icmVhaztcbiB9XG5jYXNlJ3RhZ2dlZCc6e1xuY29uc3QgdGFnPWdldFRhZyhwYXR0KTtcbmNvbnN0IG1hdGNoSGVscGVyPW1heWJlTWF0Y2hIZWxwZXIodGFnKTtcbmlmKG1hdGNoSGVscGVyKXtcbi8qIEJ1cmllZCBoZXJlIGlzIHRoZSBpbXBvcnRhbnQgY2FzZSwgd2hlcmUgd2UgcHJvY2VzcyovXG4vKiB0aGUgdmFyaW91cyBwYXR0ZXJuTm9kZXMqL1xucmV0dXJuIG1hdGNoSGVscGVyLmdldFJhbmtDb3ZlcihwYXR0LnBheWxvYWQsZW5jb2RlUGFzc2FibGUpO1xuIH1cbnN3aXRjaCh0YWcpe1xuY2FzZSdjb3B5U2V0Jzp7XG4vKiBYWFggdGhpcyBkb2Vzbid0IGdldCBhbG9uZyB3aXRoIHRoZSB3b3JsZCBvZiBjb3ZlciA9PT0gcGFpciBvZiovXG4vKiBzdHJpbmdzLiBJbiB0aGUgbWVhbnRpbWUsIGZhbGwgdGhyb3VnaCB0byB0aGUgZGVmYXVsdCB3aGljaCovXG4vKiByZXR1cm5zIGEgY292ZXIgdGhhdCBjb3ZlcnMgYWxsIGNvcHlTZXRzLiovXG4vKiovXG4vKiAvLyBTaG91bGQgYWxyZWFkeSBiZSB2YWxpZGF0ZWQgYnkgY2hlY2tQYXR0ZXJuLiBCdXQgYmVjYXVzZSB0aGlzKi9cbi8qIC8vIGlzIGEgY2hlY2sgdGhhdCBtYXkgbG9vc2VuIG92ZXIgdGltZSwgd2UgYWxzbyBhc3NlcnQqL1xuLyogLy8gZXZlcnl3aGVyZSB3ZSBzdGlsbCByZWx5IG9uIHRoZSByZXN0cmljdGlvbi4qL1xuLyogYGBganMqL1xuLyogcGF0dC5wYXlsb2FkLmxlbmd0aCA9PT0gMSB8fCovXG4vKiBGYWlsYE5vbi1zaW5nbGV0b24gY29weVNldHMgd2l0aCBtYXRjaGVyIG5vdCB5ZXQgaW1wbGVtZW50ZWQ6ICR7cGF0dH1gOyovXG4vKiBgYGAqL1xuLyoqL1xuLyogY29uc3QgW2xlZnRFbGVtZW50TGltaXQsIHJpZ2h0RWxlbWVudExpbWl0XSA9IGdldFJhbmtDb3ZlcigqL1xuLyogcGF0dC5wYXlsb2FkWzBdLCovXG4vKiApOyovXG4vKiByZXR1cm4gaGFyZGVuKFsqL1xuLyogbWFrZUNvcHlTZXQoW2xlZnRFbGVtZW50TGltaXRdKSwqL1xuLyogbWFrZUNvcHlTZXQoW3JpZ2h0RWxlbWVudExpbWl0XSksKi9cbi8qIF0pOyovXG5icmVhaztcbiB9XG5jYXNlJ2NvcHlNYXAnOntcbi8qIFhYWCB0aGlzIGRvZXNuJ3QgZ2V0IGFsb25nIHdpdGggdGhlIHdvcmxkIG9mIGNvdmVyID09PSBwYWlyIG9mKi9cbi8qIHN0cmluZ3MuIEluIHRoZSBtZWFudGltZSwgZmFsbCB0aHJvdWdoIHRvIHRoZSBkZWZhdWx0IHdoaWNoKi9cbi8qIHJldHVybnMgYSBjb3ZlciB0aGF0IGNvdmVycyBhbGwgY29weU1hcHMuKi9cbi8qKi9cbi8qIC8vIEEgbWF0Y2hpbmcgY29weU1hcCBtdXN0IGhhdmUgdGhlIHNhbWUga2V5cywgb3IgYXQgbW9zdCBvbmUqL1xuLyogLy8gbm9uLWtleSBrZXkgcGF0dGVybi4gVGh1cyB3ZSBjYW4gYXNzdW1lIHRoYXQgdmFsdWUgcG9zaXRpb25zKi9cbi8qIC8vIG1hdGNoIDEtdG8tMS4qL1xuLyogLy8qL1xuLyogLy8gVE9ETyBJIG1heSBiZSBvdmVybG9va2luZyB0aGF0IHRoZSBsZXNzIHByZWNpc2UgcmFua09yZGVyKi9cbi8qIC8vIGVxdWl2YWxlbmNlIGNsYXNzIG1heSBjYXVzZSB2YWx1ZXMgdG8gYmUgb3V0IG9mIG9yZGVyLCovXG4vKiAvLyBtYWtpbmcgdGhpcyByYW5rQ292ZXIgbm90IGFjdHVhbGx5IGNvdmVyLiBJbiB0aGF0IGNhc2UsIGZvciovXG4vKiAvLyBhbGwgdGhlIHZhbHVlcyBmb3Iga2V5cyBhdCB0aGUgc2FtZSByYW5rLCB3ZSBzaG91bGQgdW5pb24gdGhlaXIqL1xuLyogLy8gcmFuayBjb3ZlcnMuIFRPRE8gUE9TU0lCTEUgU0lMRU5UIENPUlJFQ1RORVNTIEJVRyovXG4vKiAvLyovXG4vKiAvLyBJZiB0aGlzIGlzIGEgYnVnLCBpdCBwcm9iYWJseSBhZmZlY3RzIHRoZSBnZXRSYW5rQ292ZXIqL1xuLyogLy8gY2FzZXMgb2YgbWF0Y2hMVEVIZWxwZXIgYW5kIG1hdGNoR1RFSGVscGVyIG9uIGNvcHlNYXAgYXMqL1xuLyogLy8gd2VsbC4gU2VlIG1ha2VDb3B5TWFwIGZvciBhbiBpZGVhIG9uIGZpeGluZyovXG4vKiAvLyB0aGlzIGJ1Zy4qL1xuLyogY29uc3QgW2xlZnRQYXlsb2FkTGltaXQsIHJpZ2h0UGF5bG9hZExpbWl0XSA9IGdldFJhbmtDb3ZlcigqL1xuLyogcGF0dC5wYXlsb2FkLCovXG4vKiBlbmNvZGVQYXNzYWJsZSwqL1xuLyogKTsqL1xuLyogcmV0dXJuIGhhcmRlbihbKi9cbi8qIG1ha2VUYWdnZWQoJ2NvcHlNYXAnLCBsZWZ0UGF5bG9hZExpbWl0KSwqL1xuLyogbWFrZVRhZ2dlZCgnY29weU1hcCcsIHJpZ2h0UGF5bG9hZExpbWl0KSwqL1xuLyogXSk7Ki9cbmJyZWFrO1xuIH1cbmRlZmF1bHQ6e1xuYnJlYWs7LyogZmFsbCB0aHJvdWdoIHRvIGRlZmF1bHQqL1xuIH19XG5cbmJyZWFrOy8qIGZhbGwgdGhyb3VnaCB0byBkZWZhdWx0Ki9cbiB9XG5kZWZhdWx0OntcbmJyZWFrOy8qIGZhbGwgdGhyb3VnaCB0byBkZWZhdWx0Ki9cbiB9fVxuXG5yZXR1cm4gZ2V0UGFzc1N0eWxlQ292ZXIocGFzc1N0eWxlKTtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGVbXX0gYXJyYXlcbiAqIEBwYXJhbSB7UGF0dGVybn0gcGF0dFxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHBhcmFtIHtzdHJpbmd9IFtsYWJlbFByZWZpeF1cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBhcnJheUV2ZXJ5TWF0Y2hQYXR0ZXJuPShhcnJheSxwYXR0LGNoZWNrLGxhYmVsUHJlZml4PScnKT0+e1xuaWYoaXNLaW5kKHBhdHQsJ21hdGNoOmFueScpKXtcbi8qIGlmIHRoZSBwYXR0ZXJuIGlzIE0uYW55KCksIHdlIGtub3cgaXRzIHRydWUqL1xucmV0dXJuIHRydWU7XG4gfVxucmV0dXJuIGFycmF5LmV2ZXJ5KChlbCxpKT0+XG5jaGVja01hdGNoZXMoZWwscGF0dCxjaGVjaywgYCR7bGFiZWxQcmVmaXh9WyR7aX1dYCkpO1xuXG4gfTtcblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gTWF0Y2ggSGVscGVycyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoQW55SGVscGVyPUZhcignbWF0Y2g6YW55IGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihfc3BlY2ltZW4sX21hdGNoZXJQYXlsb2FkLF9jaGVjayk9PnRydWUsXG5cbmNoZWNrSXNXZWxsRm9ybWVkOihtYXRjaGVyUGF5bG9hZCxjaGVjayk9PlxubWF0Y2hlclBheWxvYWQ9PT11bmRlZmluZWR8fFxuY2hlY2soZmFsc2UsWCBgbWF0Y2g6YW55IHBheWxvYWQ6ICR7bWF0Y2hlclBheWxvYWR9IC0gTXVzdCBiZSB1bmRlZmluZWRgKSxcblxuZ2V0UmFua0NvdmVyOihfbWF0Y2hQYXlsb2FkLF9lbmNvZGVQYXNzYWJsZSk9PlsnJywneyddfSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoQW5kSGVscGVyPUZhcignbWF0Y2g6YW5kIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixwYXR0cyxjaGVjayk9PntcbnJldHVybiBwYXR0cy5ldmVyeSgocGF0dCk9PmNoZWNrTWF0Y2hlcyhzcGVjaW1lbixwYXR0LGNoZWNrKSk7XG4gfSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6KGFsbGVnZWRQYXR0cyxjaGVjayk9PntcbmNvbnN0IGNoZWNrSXQ9KHBhdHQpPT5jaGVja1BhdHRlcm4ocGF0dCxjaGVjayk7XG5yZXR1cm4oXG4ocGFzc1N0eWxlT2YoYWxsZWdlZFBhdHRzKT09PSdjb3B5QXJyYXknfHxcbmNoZWNrKGZhbHNlLFggYE5lZWRzIGFycmF5IG9mIHN1Yi1wYXR0ZXJuczogJHtxKGFsbGVnZWRQYXR0cyl9YCkpJiZcbmFsbGVnZWRQYXR0cy5ldmVyeShjaGVja0l0KSk7XG5cbiB9LFxuXG5nZXRSYW5rQ292ZXI6KHBhdHRzLGVuY29kZVBhc3NhYmxlKT0+XG5pbnRlcnNlY3RSYW5rQ292ZXJzKFxuY29tcGFyZVJhbmssXG5wYXR0cy5tYXAoKHApPT5nZXRSYW5rQ292ZXIocCxlbmNvZGVQYXNzYWJsZSkpKX0pO1xuXG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoT3JIZWxwZXI9RmFyKCdtYXRjaDpvciBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4scGF0dHMsY2hlY2spPT57XG5jb25zdHtsZW5ndGh9PXBhdHRzO1xuaWYobGVuZ3RoPT09MCl7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYCR7c3BlY2ltZW59IC0gbm8gcGF0dGVybiBkaXNqdW5jdHMgdG8gbWF0Y2g6ICR7cShwYXR0cyl9YCk7XG5cbiB9XG5pZihcbnBhdHRzLmxlbmd0aD09PTImJlxuIW1hdGNoZXMoc3BlY2ltZW4scGF0dHNbMF0pJiZcbmlzS2luZChwYXR0c1swXSwnbWF0Y2g6a2luZCcpJiZcbnBhdHRzWzBdLnBheWxvYWQ9PT0ndW5kZWZpbmVkJylcbntcbi8qIFdvcnRoIHNwZWNpYWwgY2FzaW5nIHRoZSBvcHRpb25hbCBwYXR0ZXJuIGZvciovXG4vKiBiZXR0ZXIgZXJyb3IgbWVzc2FnZXMuKi9cbnJldHVybiBjaGVja01hdGNoZXMoc3BlY2ltZW4scGF0dHNbMV0sY2hlY2spO1xuIH1cbmlmKHBhdHRzLnNvbWUoKHBhdHQpPT5tYXRjaGVzKHNwZWNpbWVuLHBhdHQpKSl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5yZXR1cm4gY2hlY2soZmFsc2UsWCBgJHtzcGVjaW1lbn0gLSBNdXN0IG1hdGNoIG9uZSBvZiAke3EocGF0dHMpfWApO1xuIH0sXG5cbmNoZWNrSXNXZWxsRm9ybWVkOm1hdGNoQW5kSGVscGVyLmNoZWNrSXNXZWxsRm9ybWVkLFxuXG5nZXRSYW5rQ292ZXI6KHBhdHRzLGVuY29kZVBhc3NhYmxlKT0+XG51bmlvblJhbmtDb3ZlcnMoXG5jb21wYXJlUmFuayxcbnBhdHRzLm1hcCgocCk9PmdldFJhbmtDb3ZlcihwLGVuY29kZVBhc3NhYmxlKSkpfSk7XG5cblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hOb3RIZWxwZXI9RmFyKCdtYXRjaDpub3QgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLHBhdHQsY2hlY2spPT57XG5pZihtYXRjaGVzKHNwZWNpbWVuLHBhdHQpKXtcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgJHtzcGVjaW1lbn0gLSBNdXN0IGZhaWwgbmVnYXRlZCBwYXR0ZXJuOiAke3EocGF0dCl9YCk7XG5cbiB9ZWxzZXtcbnJldHVybiB0cnVlO1xuIH1cbiB9LFxuXG5jaGVja0lzV2VsbEZvcm1lZDpjaGVja1BhdHRlcm4sXG5cbmdldFJhbmtDb3ZlcjooX3BhdHQsX2VuY29kZVBhc3NhYmxlKT0+WycnLCd7J119KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hTY2FsYXJIZWxwZXI9RmFyKCdtYXRjaDpzY2FsYXIgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLF9tYXRjaGVyUGF5bG9hZCxjaGVjayk9PlxuY2hlY2tTY2FsYXJLZXkoc3BlY2ltZW4sY2hlY2spLFxuXG5jaGVja0lzV2VsbEZvcm1lZDptYXRjaEFueUhlbHBlci5jaGVja0lzV2VsbEZvcm1lZCxcblxuZ2V0UmFua0NvdmVyOihfbWF0Y2hQYXlsb2FkLF9lbmNvZGVQYXNzYWJsZSk9PlsnYScsJ3p+J119KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hLZXlIZWxwZXI9RmFyKCdtYXRjaDprZXkgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLF9tYXRjaGVyUGF5bG9hZCxjaGVjayk9PlxuY2hlY2tLZXkoc3BlY2ltZW4sY2hlY2spLFxuXG5jaGVja0lzV2VsbEZvcm1lZDptYXRjaEFueUhlbHBlci5jaGVja0lzV2VsbEZvcm1lZCxcblxuZ2V0UmFua0NvdmVyOihfbWF0Y2hQYXlsb2FkLF9lbmNvZGVQYXNzYWJsZSk9PlsnYScsJ3p+J119KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hQYXR0ZXJuSGVscGVyPUZhcignbWF0Y2g6cGF0dGVybiBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4sX21hdGNoZXJQYXlsb2FkLGNoZWNrKT0+XG5jaGVja1BhdHRlcm4oc3BlY2ltZW4sY2hlY2spLFxuXG5jaGVja0lzV2VsbEZvcm1lZDptYXRjaEFueUhlbHBlci5jaGVja0lzV2VsbEZvcm1lZCxcblxuZ2V0UmFua0NvdmVyOihfbWF0Y2hQYXlsb2FkLF9lbmNvZGVQYXNzYWJsZSk9PlsnYScsJ3p+J119KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hLaW5kSGVscGVyPUZhcignbWF0Y2g6a2luZCBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczpjaGVja0tpbmQsXG5cbmNoZWNrSXNXZWxsRm9ybWVkOihhbGxlZ2VkS2V5S2luZCxjaGVjayk9PlxudHlwZW9mIGFsbGVnZWRLZXlLaW5kPT09J3N0cmluZyd8fFxuY2hlY2soXG5mYWxzZSxcblggYG1hdGNoOmtpbmQ6IHBheWxvYWQ6ICR7YWxsZWdlZEtleUtpbmR9IC0gQSBraW5kIG5hbWUgbXVzdCBiZSBhIHN0cmluZ2ApLFxuXG5cbmdldFJhbmtDb3Zlcjooa2luZCxfZW5jb2RlUGFzc2FibGUpPT57XG5sZXQgc3R5bGU7XG5zd2l0Y2goa2luZCl7XG5jYXNlJ2NvcHlTZXQnOlxuY2FzZSdjb3B5TWFwJzp7XG5zdHlsZT0ndGFnZ2VkJztcbmJyZWFrO1xuIH1cbmRlZmF1bHQ6e1xuc3R5bGU9a2luZDtcbmJyZWFrO1xuIH19XG5cbnJldHVybiBnZXRQYXNzU3R5bGVDb3ZlcihzdHlsZSk7XG4gfX0pO1xuXG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaEJpZ2ludEhlbHBlcj1GYXIoJ21hdGNoOmJpZ2ludCBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4sW2xpbWl0cz11bmRlZmluZWRdLGNoZWNrKT0+e1xuY29uc3R7ZGVjaW1hbERpZ2l0c0xpbWl0fT1saW1pdChsaW1pdHMpO1xucmV0dXJuKFxuY2hlY2tLaW5kKHNwZWNpbWVuLCdiaWdpbnQnLGNoZWNrKSYmXG5jaGVja0RlY2ltYWxEaWdpdHNMaW1pdChzcGVjaW1lbixkZWNpbWFsRGlnaXRzTGltaXQsY2hlY2spKTtcblxuIH0sXG5cbmNoZWNrSXNXZWxsRm9ybWVkOihwYXlsb2FkLGNoZWNrKT0+XG5jaGVja0lzV2VsbEZvcm1lZFdpdGhMaW1pdChcbnBheWxvYWQsXG5oYXJkZW4oW10pLFxuY2hlY2ssXG4nbWF0Y2g6YmlnaW50IHBheWxvYWQnKSxcblxuXG5nZXRSYW5rQ292ZXI6KF9tYXRjaFBheWxvYWQsX2VuY29kZVBhc3NhYmxlKT0+XG5nZXRQYXNzU3R5bGVDb3ZlcignYmlnaW50Jyl9KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hOYXRIZWxwZXI9RmFyKCdtYXRjaDpuYXQgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLFtsaW1pdHM9dW5kZWZpbmVkXSxjaGVjayk9PntcbmNvbnN0e2RlY2ltYWxEaWdpdHNMaW1pdH09bGltaXQobGltaXRzKTtcbnJldHVybihcbmNoZWNrS2luZChzcGVjaW1lbiwnYmlnaW50JyxjaGVjaykmJlxuY2hlY2soXG4vKiogQHR5cGUge2JpZ2ludH0gKi9zcGVjaW1lbj49MG4sXG5YIGAke3NwZWNpbWVufSAtIE11c3QgYmUgbm9uLW5lZ2F0aXZlYCkmJlxuXG5jaGVja0RlY2ltYWxEaWdpdHNMaW1pdChzcGVjaW1lbixkZWNpbWFsRGlnaXRzTGltaXQsY2hlY2spKTtcblxuIH0sXG5cbmNoZWNrSXNXZWxsRm9ybWVkOihwYXlsb2FkLGNoZWNrKT0+XG5jaGVja0lzV2VsbEZvcm1lZFdpdGhMaW1pdChcbnBheWxvYWQsXG5oYXJkZW4oW10pLFxuY2hlY2ssXG4nbWF0Y2g6bmF0IHBheWxvYWQnKSxcblxuXG5nZXRSYW5rQ292ZXI6KF9tYXRjaFBheWxvYWQsX2VuY29kZVBhc3NhYmxlKT0+XG4vKiBUT0RPIENvdWxkIGJlIG1vcmUgcHJlY2lzZSovXG5nZXRQYXNzU3R5bGVDb3ZlcignYmlnaW50Jyl9KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hTdHJpbmdIZWxwZXI9RmFyKCdtYXRjaDpzdHJpbmcgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLFtsaW1pdHM9dW5kZWZpbmVkXSxjaGVjayk9PntcbmNvbnN0e3N0cmluZ0xlbmd0aExpbWl0fT1saW1pdChsaW1pdHMpO1xuLyogcHJldHRpZXItaWdub3JlKi9cbnJldHVybihcbmNoZWNrS2luZChzcGVjaW1lbiwnc3RyaW5nJyxjaGVjaykmJihcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAZW5kby9yZXN0cmljdC1jb21wYXJpc29uLW9wZXJhbmRzKi9cbi8qKiBAdHlwZSB7c3RyaW5nfSAqL3NwZWNpbWVuLmxlbmd0aDw9c3RyaW5nTGVuZ3RoTGltaXR8fFxuY2hlY2soXG5mYWxzZSxcblggYHN0cmluZyAke3NwZWNpbWVufSBtdXN0IG5vdCBiZSBiaWdnZXIgdGhhbiAke3N0cmluZ0xlbmd0aExpbWl0fWApKSk7XG5cblxuIH0sXG5cbmNoZWNrSXNXZWxsRm9ybWVkOihwYXlsb2FkLGNoZWNrKT0+XG5jaGVja0lzV2VsbEZvcm1lZFdpdGhMaW1pdChcbnBheWxvYWQsXG5oYXJkZW4oW10pLFxuY2hlY2ssXG4nbWF0Y2g6c3RyaW5nIHBheWxvYWQnKSxcblxuXG5nZXRSYW5rQ292ZXI6KF9tYXRjaFBheWxvYWQsX2VuY29kZVBhc3NhYmxlKT0+XG5nZXRQYXNzU3R5bGVDb3Zlcignc3RyaW5nJyl9KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hTeW1ib2xIZWxwZXI9RmFyKCdtYXRjaDpzeW1ib2wgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLFtsaW1pdHM9dW5kZWZpbmVkXSxjaGVjayk9PntcbmNvbnN0e3N5bWJvbE5hbWVMZW5ndGhMaW1pdH09bGltaXQobGltaXRzKTtcbmlmKCFjaGVja0tpbmQoc3BlY2ltZW4sJ3N5bWJvbCcsY2hlY2spKXtcbnJldHVybiBmYWxzZTtcbiB9XG5jb25zdCBzeW1ib2xOYW1lPW5hbWVGb3JQYXNzYWJsZVN5bWJvbChzcGVjaW1lbik7XG5cbmlmKHR5cGVvZiBzeW1ib2xOYW1lIT09J3N0cmluZycpe1xudGhyb3cgRmFpbCBgaW50ZXJuYWw6IFBhc3NhYmxlIHN5bWJvbCAke3NwZWNpbWVufSBtdXN0IGhhdmUgYSBwYXNzYWJsZSBuYW1lYDtcbiB9XG5yZXR1cm4gY2hlY2soXG5zeW1ib2xOYW1lLmxlbmd0aDw9c3ltYm9sTmFtZUxlbmd0aExpbWl0LFxuWCBgU3ltYm9sIG5hbWUgJHtxKFxuc3ltYm9sTmFtZSlcbiB9IG11c3Qgbm90IGJlIGJpZ2dlciB0aGFuICR7c3ltYm9sTmFtZUxlbmd0aExpbWl0fWApO1xuXG4gfSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6KHBheWxvYWQsY2hlY2spPT5cbmNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxucGF5bG9hZCxcbmhhcmRlbihbXSksXG5jaGVjayxcbidtYXRjaDpzeW1ib2wgcGF5bG9hZCcpLFxuXG5cbmdldFJhbmtDb3ZlcjooX21hdGNoUGF5bG9hZCxfZW5jb2RlUGFzc2FibGUpPT5cbmdldFBhc3NTdHlsZUNvdmVyKCdzeW1ib2wnKX0pO1xuXG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaFJlbW90YWJsZUhlbHBlcj1GYXIoJ21hdGNoOnJlbW90YWJsZSBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4scmVtb3RhYmxlRGVzYyxjaGVjayk9PntcbmlmKGlzS2luZChzcGVjaW1lbiwncmVtb3RhYmxlJykpe1xucmV0dXJuIHRydWU7XG4gfVxuaWYoY2hlY2s9PT1pZGVudENoZWNrZXIpe1xucmV0dXJuIGZhbHNlO1xuIH1cbmNvbnN0e2xhYmVsfT1yZW1vdGFibGVEZXNjO1xuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHNwZWNpbWVuKTtcbmNvbnN0IGtpbmREZXRhaWxzPVxucGFzc1N0eWxlIT09J3RhZ2dlZCc/XG4vKiBQYXNzIHN0eWxlIGNhbiBiZSBlbWJlZGRlZCBpbiBkZXRhaWxzIHdpdGhvdXQgcXVvdGVzLiovXG5iKHBhc3NTdHlsZSk6XG4vKiBUYWcgbXVzdCBiZSBxdW90ZWQgYmVjYXVzZSBpdCBpcyBwb3RlbnRpYWxseSBhdHRhY2tlci1jb250cm9sbGVkKi9cbi8qICh1bmxpa2UgYGtpbmRPZmAsIHRoaXMgZG9lcyBub3QgcmVqZWN0IHVucmVjb2duaXplZCB0YWdzKS4qL1xucShnZXRUYWcoc3BlY2ltZW4pKTtcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuLyogYGxhYmVsYCBjYW4gYmUgZW1iZWRkZWQgd2l0aG91dCBxdW90ZXMgYmVjYXVzZSBpdCBpcyBwcm92aWRlZCBieSovXG4vKiBsb2NhbCBjb2RlIGxpa2UgYE0ucmVtb3RhYmxlKFwiLi4uXCIpYC4qL1xuWCBgJHtzcGVjaW1lbn0gLSBNdXN0IGJlIGEgcmVtb3RhYmxlICR7YihsYWJlbCl9LCBub3QgJHtraW5kRGV0YWlsc31gKTtcblxuIH0sXG5cbmNoZWNrSXNXZWxsRm9ybWVkOihhbGxlZ2VkUmVtb3RhYmxlRGVzYyxjaGVjayk9PlxuY2hlY2tNYXRjaGVzKFxuYWxsZWdlZFJlbW90YWJsZURlc2MsXG5oYXJkZW4oe2xhYmVsOk1NLnN0cmluZygpfSksXG5jaGVjayxcbidtYXRjaDpyZW1vdGFibGUgcGF5bG9hZCcpLFxuXG5cbmdldFJhbmtDb3ZlcjooX3JlbW90YWJsZURlc2MsX2VuY29kZVBhc3NhYmxlKT0+XG5nZXRQYXNzU3R5bGVDb3ZlcigncmVtb3RhYmxlJyl9KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hMVEVIZWxwZXI9RmFyKCdtYXRjaDpsdGUgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLHJpZ2h0T3BlcmFuZCxjaGVjayk9Plxua2V5TFRFKHNwZWNpbWVuLHJpZ2h0T3BlcmFuZCl8fFxuY2hlY2soZmFsc2UsWCBgJHtzcGVjaW1lbn0gLSBNdXN0IGJlIDw9ICR7cmlnaHRPcGVyYW5kfWApLFxuXG5jaGVja0lzV2VsbEZvcm1lZDpjaGVja0tleSxcblxuZ2V0UmFua0NvdmVyOihyaWdodE9wZXJhbmQsZW5jb2RlUGFzc2FibGUpPT57XG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YocmlnaHRPcGVyYW5kKTtcbi8qIFRoZSBwcmVmZXItY29uc3QgbWFrZXMgbm8gc2Vuc2Ugd2hlbiBzb21lIG9mIHRoZSB2YXJpYWJsZXMgbmVlZCovXG4vKiB0byBiZSBgbGV0YCovXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWNvbnN0Ki9cbmxldFtsZWZ0Qm91bmQscmlnaHRCb3VuZF09Z2V0UGFzc1N0eWxlQ292ZXIocGFzc1N0eWxlKTtcbmNvbnN0IG5ld1JpZ2h0Qm91bmQ9IGAke2VuY29kZVBhc3NhYmxlKHJpZ2h0T3BlcmFuZCl9fmA7XG5pZihuZXdSaWdodEJvdW5kIT09dW5kZWZpbmVkKXtcbnJpZ2h0Qm91bmQ9bmV3UmlnaHRCb3VuZDtcbiB9XG5yZXR1cm5bbGVmdEJvdW5kLHJpZ2h0Qm91bmRdO1xuIH19KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hMVEhlbHBlcj1GYXIoJ21hdGNoOmx0IGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixyaWdodE9wZXJhbmQsY2hlY2spPT5cbmtleUxUKHNwZWNpbWVuLHJpZ2h0T3BlcmFuZCl8fFxuY2hlY2soZmFsc2UsWCBgJHtzcGVjaW1lbn0gLSBNdXN0IGJlIDwgJHtyaWdodE9wZXJhbmR9YCksXG5cbmNoZWNrSXNXZWxsRm9ybWVkOmNoZWNrS2V5LFxuXG5nZXRSYW5rQ292ZXI6bWF0Y2hMVEVIZWxwZXIuZ2V0UmFua0NvdmVyfSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoR1RFSGVscGVyPUZhcignbWF0Y2g6Z3RlIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixyaWdodE9wZXJhbmQsY2hlY2spPT5cbmtleUdURShzcGVjaW1lbixyaWdodE9wZXJhbmQpfHxcbmNoZWNrKGZhbHNlLFggYCR7c3BlY2ltZW59IC0gTXVzdCBiZSA+PSAke3JpZ2h0T3BlcmFuZH1gKSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6Y2hlY2tLZXksXG5cbmdldFJhbmtDb3ZlcjoocmlnaHRPcGVyYW5kLGVuY29kZVBhc3NhYmxlKT0+e1xuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHJpZ2h0T3BlcmFuZCk7XG4vKiBUaGUgcHJlZmVyLWNvbnN0IG1ha2VzIG5vIHNlbnNlIHdoZW4gc29tZSBvZiB0aGUgdmFyaWFibGVzIG5lZWQqL1xuLyogdG8gYmUgYGxldGAqL1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdCovXG5sZXRbbGVmdEJvdW5kLHJpZ2h0Qm91bmRdPWdldFBhc3NTdHlsZUNvdmVyKHBhc3NTdHlsZSk7XG5jb25zdCBuZXdMZWZ0Qm91bmQ9ZW5jb2RlUGFzc2FibGUocmlnaHRPcGVyYW5kKTtcbmlmKG5ld0xlZnRCb3VuZCE9PXVuZGVmaW5lZCl7XG5sZWZ0Qm91bmQ9bmV3TGVmdEJvdW5kO1xuIH1cbnJldHVybltsZWZ0Qm91bmQscmlnaHRCb3VuZF07XG4gfX0pO1xuXG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaEdUSGVscGVyPUZhcignbWF0Y2g6Z3QgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLHJpZ2h0T3BlcmFuZCxjaGVjayk9Plxua2V5R1Qoc3BlY2ltZW4scmlnaHRPcGVyYW5kKXx8XG5jaGVjayhmYWxzZSxYIGAke3NwZWNpbWVufSAtIE11c3QgYmUgPiAke3JpZ2h0T3BlcmFuZH1gKSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6Y2hlY2tLZXksXG5cbmdldFJhbmtDb3ZlcjptYXRjaEdURUhlbHBlci5nZXRSYW5rQ292ZXJ9KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hSZWNvcmRPZkhlbHBlcj1GYXIoJ21hdGNoOnJlY29yZE9mIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihcbnNwZWNpbWVuLFxuW2tleVBhdHQsdmFsdWVQYXR0LGxpbWl0cz11bmRlZmluZWRdLFxuY2hlY2spPT5cbntcbmNvbnN0e251bVByb3BlcnRpZXNMaW1pdCxwcm9wZXJ0eU5hbWVMZW5ndGhMaW1pdH09bGltaXQobGltaXRzKTtcbnJldHVybihcbmNoZWNrS2luZChzcGVjaW1lbiwnY29weVJlY29yZCcsY2hlY2spJiZcbmNoZWNrKFxub3duS2V5cyhzcGVjaW1lbikubGVuZ3RoPD1udW1Qcm9wZXJ0aWVzTGltaXQsXG5YIGBNdXN0IG5vdCBoYXZlIG1vcmUgdGhhbiAke3EoXG5udW1Qcm9wZXJ0aWVzTGltaXQpXG4gfSBwcm9wZXJ0aWVzOiAke3NwZWNpbWVufWApJiZcblxuZW50cmllcyhzcGVjaW1lbikuZXZlcnkoXG4oW2tleSx2YWx1ZV0pPT5cbmFwcGx5TGFiZWxpbmdFcnJvcihcbmNoZWNrLFxuW1xua2V5Lmxlbmd0aDw9cHJvcGVydHlOYW1lTGVuZ3RoTGltaXQsXG5YIGBQcm9wZXJ0eSBuYW1lIG11c3Qgbm90IGJlIGxvbmdlciB0aGFuICR7cShcbnByb3BlcnR5TmFtZUxlbmd0aExpbWl0KVxuIH1gXSxcblxua2V5KSYmXG5cbmNoZWNrTWF0Y2hlcyhcbmhhcmRlbihba2V5LHZhbHVlXSksXG5oYXJkZW4oW2tleVBhdHQsdmFsdWVQYXR0XSksXG5jaGVjayxcbmtleSkpKTtcblxuXG5cbiB9LFxuXG5jaGVja0lzV2VsbEZvcm1lZDoocGF5bG9hZCxjaGVjayk9PlxuY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG5wYXlsb2FkLFxuaGFyZGVuKFtNTS5wYXR0ZXJuKCksTU0ucGF0dGVybigpXSksXG5jaGVjayxcbidtYXRjaDpyZWNvcmRPZiBwYXlsb2FkJyksXG5cblxuZ2V0UmFua0NvdmVyOihfZW50cnlQYXR0KT0+Z2V0UGFzc1N0eWxlQ292ZXIoJ2NvcHlSZWNvcmQnKX0pO1xuXG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaEFycmF5T2ZIZWxwZXI9RmFyKCdtYXRjaDphcnJheU9mIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixbc3ViUGF0dCxsaW1pdHM9dW5kZWZpbmVkXSxjaGVjayk9PntcbmNvbnN0e2FycmF5TGVuZ3RoTGltaXR9PWxpbWl0KGxpbWl0cyk7XG4vKiBwcmV0dGllci1pZ25vcmUqL1xucmV0dXJuKFxuY2hlY2tLaW5kKHNwZWNpbWVuLCdjb3B5QXJyYXknLGNoZWNrKSYmKFxuLyoqIEB0eXBlIHtBcnJheX0gKi9zcGVjaW1lbi5sZW5ndGg8PWFycmF5TGVuZ3RoTGltaXR8fFxuY2hlY2soXG5mYWxzZSxcblggYEFycmF5IGxlbmd0aCAke3NwZWNpbWVuLmxlbmd0aH0gbXVzdCBiZSA8PSBsaW1pdCAke2FycmF5TGVuZ3RoTGltaXR9YCkpJiZcblxuYXJyYXlFdmVyeU1hdGNoUGF0dGVybihzcGVjaW1lbixzdWJQYXR0LGNoZWNrKSk7XG5cbiB9LFxuXG5jaGVja0lzV2VsbEZvcm1lZDoocGF5bG9hZCxjaGVjayk9PlxuY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG5wYXlsb2FkLFxuaGFyZGVuKFtNTS5wYXR0ZXJuKCldKSxcbmNoZWNrLFxuJ21hdGNoOmFycmF5T2YgcGF5bG9hZCcpLFxuXG5cbmdldFJhbmtDb3ZlcjooKT0+Z2V0UGFzc1N0eWxlQ292ZXIoJ2NvcHlBcnJheScpfSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoU2V0T2ZIZWxwZXI9RmFyKCdtYXRjaDpzZXRPZiBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4sW2tleVBhdHQsbGltaXRzPXVuZGVmaW5lZF0sY2hlY2spPT57XG5jb25zdHtudW1TZXRFbGVtZW50c0xpbWl0fT1saW1pdChsaW1pdHMpO1xucmV0dXJuKFxuY2hlY2tLaW5kKHNwZWNpbWVuLCdjb3B5U2V0JyxjaGVjaykmJlxuY2hlY2soXG4vKiogQHR5cGUge0FycmF5fSAqL3NwZWNpbWVuLnBheWxvYWQubGVuZ3RoPG51bVNldEVsZW1lbnRzTGltaXQsXG5YIGBTZXQgbXVzdCBub3QgaGF2ZSBtb3JlIHRoYW4gJHtxKG51bVNldEVsZW1lbnRzTGltaXQpfSBlbGVtZW50czogJHtcbnNwZWNpbWVuLnBheWxvYWQubGVuZ3RoXG4gfWApJiZcblxuYXJyYXlFdmVyeU1hdGNoUGF0dGVybihzcGVjaW1lbi5wYXlsb2FkLGtleVBhdHQsY2hlY2ssJ3NldCBlbGVtZW50cycpKTtcblxuIH0sXG5cbmNoZWNrSXNXZWxsRm9ybWVkOihwYXlsb2FkLGNoZWNrKT0+XG5jaGVja0lzV2VsbEZvcm1lZFdpdGhMaW1pdChcbnBheWxvYWQsXG5oYXJkZW4oW01NLnBhdHRlcm4oKV0pLFxuY2hlY2ssXG4nbWF0Y2g6c2V0T2YgcGF5bG9hZCcpLFxuXG5cbmdldFJhbmtDb3ZlcjooKT0+Z2V0UGFzc1N0eWxlQ292ZXIoJ3RhZ2dlZCcpfSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoQmFnT2ZIZWxwZXI9RmFyKCdtYXRjaDpiYWdPZiBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooXG5zcGVjaW1lbixcbltrZXlQYXR0LGNvdW50UGF0dCxsaW1pdHM9dW5kZWZpbmVkXSxcbmNoZWNrKT0+XG57XG5jb25zdHtudW1VbmlxdWVCYWdFbGVtZW50c0xpbWl0LGRlY2ltYWxEaWdpdHNMaW1pdH09bGltaXQobGltaXRzKTtcbnJldHVybihcbmNoZWNrS2luZChzcGVjaW1lbiwnY29weUJhZycsY2hlY2spJiZcbmNoZWNrKFxuLyoqIEB0eXBlIHtBcnJheX0gKi9zcGVjaW1lbi5wYXlsb2FkLmxlbmd0aDw9XG5udW1VbmlxdWVCYWdFbGVtZW50c0xpbWl0LFxuWCBgQmFnIG11c3Qgbm90IGhhdmUgbW9yZSB0aGFuICR7cShcbm51bVVuaXF1ZUJhZ0VsZW1lbnRzTGltaXQpXG4gfSB1bmlxdWUgZWxlbWVudHM6ICR7c3BlY2ltZW59YCkmJlxuXG5zcGVjaW1lbi5wYXlsb2FkLmV2ZXJ5KFxuKFtrZXksY291bnRdLGkpPT5cbmNoZWNrTWF0Y2hlcyhrZXksa2V5UGF0dCxjaGVjaywgYGJhZyBrZXlzWyR7aX1dYCkmJlxuYXBwbHlMYWJlbGluZ0Vycm9yKFxuY2hlY2tEZWNpbWFsRGlnaXRzTGltaXQsXG5bY291bnQsZGVjaW1hbERpZ2l0c0xpbWl0LGNoZWNrXSxcbiBgYmFnIGNvdW50c1ske2l9XWApJiZcblxuY2hlY2tNYXRjaGVzKGNvdW50LGNvdW50UGF0dCxjaGVjaywgYGJhZyBjb3VudHNbJHtpfV1gKSkpO1xuXG5cbiB9LFxuXG5jaGVja0lzV2VsbEZvcm1lZDoocGF5bG9hZCxjaGVjayk9PlxuY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG5wYXlsb2FkLFxuaGFyZGVuKFtNTS5wYXR0ZXJuKCksTU0ucGF0dGVybigpXSksXG5jaGVjayxcbidtYXRjaDpiYWdPZiBwYXlsb2FkJyksXG5cblxuZ2V0UmFua0NvdmVyOigpPT5nZXRQYXNzU3R5bGVDb3ZlcigndGFnZ2VkJyl9KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hNYXBPZkhlbHBlcj1GYXIoJ21hdGNoOm1hcE9mIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihcbnNwZWNpbWVuLFxuW2tleVBhdHQsdmFsdWVQYXR0LGxpbWl0cz11bmRlZmluZWRdLFxuY2hlY2spPT5cbntcbmNvbnN0e251bU1hcEVudHJpZXNMaW1pdH09bGltaXQobGltaXRzKTtcbnJldHVybihcbmNoZWNrS2luZChzcGVjaW1lbiwnY29weU1hcCcsY2hlY2spJiZcbmNoZWNrKFxuLyoqIEB0eXBlIHtBcnJheX0gKi9zcGVjaW1lbi5wYXlsb2FkLmtleXMubGVuZ3RoPD1cbm51bU1hcEVudHJpZXNMaW1pdCxcblggYENvcHlNYXAgbXVzdCBoYXZlIG5vIG1vcmUgdGhhbiAke3EoXG5udW1NYXBFbnRyaWVzTGltaXQpXG4gfSBlbnRyaWVzOiAke3NwZWNpbWVufWApJiZcblxuYXJyYXlFdmVyeU1hdGNoUGF0dGVybihcbnNwZWNpbWVuLnBheWxvYWQua2V5cyxcbmtleVBhdHQsXG5jaGVjayxcbidtYXAga2V5cycpJiZcblxuYXJyYXlFdmVyeU1hdGNoUGF0dGVybihcbnNwZWNpbWVuLnBheWxvYWQudmFsdWVzLFxudmFsdWVQYXR0LFxuY2hlY2ssXG4nbWFwIHZhbHVlcycpKTtcblxuXG4gfSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6KHBheWxvYWQsY2hlY2spPT5cbmNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxucGF5bG9hZCxcbmhhcmRlbihbTU0ucGF0dGVybigpLE1NLnBhdHRlcm4oKV0pLFxuY2hlY2ssXG4nbWF0Y2g6bWFwT2YgcGF5bG9hZCcpLFxuXG5cbmdldFJhbmtDb3ZlcjooX2VudHJ5UGF0dCk9PmdldFBhc3NTdHlsZUNvdmVyKCd0YWdnZWQnKX0pO1xuXG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZVtdfSBzcGVjaW1lblxuICogQHBhcmFtIHtQYXR0ZXJuW119IHJlcXVpcmVkUGF0dFxuICogQHBhcmFtIHtQYXR0ZXJuW119IG9wdGlvbmFsUGF0dFxuICogQHJldHVybnMge3tcbiAqICAgcmVxdWlyZWRTcGVjaW1lbjogUGFzc2FibGVbXSxcbiAqICAgb3B0aW9uYWxTcGVjaW1lbjogUGFzc2FibGVbXSxcbiAqICAgcmVzdFNwZWNpbWVuOiBQYXNzYWJsZVtdXG4gKiB9fVxuICovXG5jb25zdCBzcGxpdEFycmF5UGFydHM9KHNwZWNpbWVuLHJlcXVpcmVkUGF0dCxvcHRpb25hbFBhdHQpPT57XG5jb25zdCBudW1SZXF1aXJlZD1yZXF1aXJlZFBhdHQubGVuZ3RoO1xuY29uc3QgbnVtT3B0aW9uYWw9b3B0aW9uYWxQYXR0Lmxlbmd0aDtcbmNvbnN0IHJlcXVpcmVkU3BlY2ltZW49c3BlY2ltZW4uc2xpY2UoMCxudW1SZXF1aXJlZCk7XG5jb25zdCBvcHRpb25hbFNwZWNpbWVuPXNwZWNpbWVuLnNsaWNlKFxubnVtUmVxdWlyZWQsXG5udW1SZXF1aXJlZCtudW1PcHRpb25hbCk7XG5cbmNvbnN0IHJlc3RTcGVjaW1lbj1zcGVjaW1lbi5zbGljZShudW1SZXF1aXJlZCtudW1PcHRpb25hbCk7XG5yZXR1cm4gaGFyZGVuKHtyZXF1aXJlZFNwZWNpbWVuLG9wdGlvbmFsU3BlY2ltZW4scmVzdFNwZWNpbWVufSk7XG4gfTtcblxuLyoqXG4gKiBPcHRpb25hbCBzcGVjaW1lbiBlbGVtZW50cyB3aGljaCBhcmUgYHVuZGVmaW5lZGAgcGFzcyB1bmNvbmRpdGlvbmFsbHkuXG4gKiBXZSBlbmNvZGUgdGhpcyB3aXRoIHRoZSBgTS5vcmAgcGF0dGVybiBzbyBpdCBhbHNvIHByb2R1Y2VzIGEgZ29vZFxuICogY29tcHJlc3Npb24gZGlzdGluZ3Vpc2hpbmcgYHVuZGVmaW5lZGAgZnJvbSBhYnNlbmNlLlxuICpcbiAqIEBwYXJhbSB7UGF0dGVybltdfSBvcHRpb25hbFBhdHRcbiAqIEBwYXJhbSB7bnVtYmVyfSBsZW5ndGhcbiAqIEByZXR1cm5zIHtQYXR0ZXJuW119IFRoZSBwYXJ0aWFsUGF0dFxuICovXG5jb25zdCBhZGFwdEFycmF5UGF0dGVybj0ob3B0aW9uYWxQYXR0LGxlbmd0aCk9PlxuaGFyZGVuKG9wdGlvbmFsUGF0dC5zbGljZSgwLGxlbmd0aCkubWFwKChwYXR0KT0+TU0ub3B0KHBhdHQpKSk7XG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaFNwbGl0QXJyYXlIZWxwZXI9RmFyKCdtYXRjaDpzcGxpdEFycmF5IGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihcbnNwZWNpbWVuLFxuW3JlcXVpcmVkUGF0dCxvcHRpb25hbFBhdHQ9W10scmVzdFBhdHQ9TU0uYW55KCldLFxuY2hlY2spPT5cbntcbmlmKCFjaGVja0tpbmQoc3BlY2ltZW4sJ2NvcHlBcnJheScsY2hlY2spKXtcbnJldHVybiBmYWxzZTtcbiB9XG5jb25zdHtyZXF1aXJlZFNwZWNpbWVuLG9wdGlvbmFsU3BlY2ltZW4scmVzdFNwZWNpbWVufT1cbnNwbGl0QXJyYXlQYXJ0cyhzcGVjaW1lbixyZXF1aXJlZFBhdHQsb3B0aW9uYWxQYXR0KTtcbmNvbnN0IHBhcnRpYWxQYXR0PWFkYXB0QXJyYXlQYXR0ZXJuKFxub3B0aW9uYWxQYXR0LFxub3B0aW9uYWxTcGVjaW1lbi5sZW5ndGgpO1xuXG5sZXQgYXJnTnVtPTA7XG5yZXR1cm4oXG4ocmVxdWlyZWRTcGVjaW1lbi5sZW5ndGg9PT1yZXF1aXJlZFBhdHQubGVuZ3RofHxcbmNoZWNrKFxuZmFsc2UsXG5YIGBFeHBlY3RlZCBhdCBsZWFzdCAke3EoXG5yZXF1aXJlZFBhdHQubGVuZ3RoKVxuIH0gYXJndW1lbnRzOiAke3NwZWNpbWVufWApKSYmXG5cbnJlcXVpcmVkUGF0dC5ldmVyeSgocCxpKT0+XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGx1c3BsdXMqL1xuY2hlY2tNYXRjaGVzKHJlcXVpcmVkU3BlY2ltZW5baV0scCxjaGVjaywgYGFyZyAke2FyZ051bSsrfWApKSYmXG5cbnBhcnRpYWxQYXR0LmV2ZXJ5KChwLGkpPT5cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wbHVzcGx1cyovXG5jaGVja01hdGNoZXMob3B0aW9uYWxTcGVjaW1lbltpXSxwLGNoZWNrLCBgYXJnICR7YXJnTnVtKyt9P2ApKSYmXG5cbmNoZWNrTWF0Y2hlcyhyZXN0U3BlY2ltZW4scmVzdFBhdHQsY2hlY2ssJy4uLnJlc3QnKSk7XG5cbiB9LFxuXG4vKipcbiAqIEBwYXJhbSB7QXJyYXl9IHNwbGl0QXJyYXlcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqL1xuY2hlY2tJc1dlbGxGb3JtZWQ6KHNwbGl0QXJyYXksY2hlY2spPT57XG5pZihcbnBhc3NTdHlsZU9mKHNwbGl0QXJyYXkpPT09J2NvcHlBcnJheScmJihcbnNwbGl0QXJyYXkubGVuZ3RoPj0xfHxzcGxpdEFycmF5Lmxlbmd0aDw9MykpXG57XG5jb25zdFtyZXF1aXJlZFBhdHQsb3B0aW9uYWxQYXR0PXVuZGVmaW5lZCxyZXN0UGF0dD11bmRlZmluZWRdPVxuc3BsaXRBcnJheTtcbmlmKFxuaXNQYXR0ZXJuKHJlcXVpcmVkUGF0dCkmJlxucGFzc1N0eWxlT2YocmVxdWlyZWRQYXR0KT09PSdjb3B5QXJyYXknJiYoXG5vcHRpb25hbFBhdHQ9PT11bmRlZmluZWR8fFxuaXNQYXR0ZXJuKG9wdGlvbmFsUGF0dCkmJlxucGFzc1N0eWxlT2Yob3B0aW9uYWxQYXR0KT09PSdjb3B5QXJyYXknKSYmKFxucmVzdFBhdHQ9PT11bmRlZmluZWR8fGlzUGF0dGVybihyZXN0UGF0dCkpKVxue1xucmV0dXJuIHRydWU7XG4gfVxuIH1cbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgTXVzdCBiZSBhbiBhcnJheSBvZiBhIHJlcXVpcmVkUGF0dCBhcnJheSwgYW4gb3B0aW9uYWwgb3B0aW9uYWxQYXR0IGFycmF5LCBhbmQgYW4gb3B0aW9uYWwgcmVzdFBhdHQ6ICR7cShcbnNwbGl0QXJyYXkpXG4gfWApO1xuXG4gfSxcblxuZ2V0UmFua0NvdmVyOihbXG5fcmVxdWlyZWRQYXR0LFxuX29wdGlvbmFsUGF0dD11bmRlZmluZWQsXG5fcmVzdFBhdHQ9dW5kZWZpbmVkXSk9PlxuZ2V0UGFzc1N0eWxlQ292ZXIoJ2NvcHlBcnJheScpfSk7XG5cblxuLyoqXG4gKiBAcGFyYW0ge0NvcHlSZWNvcmQ8UGFzc2FibGU+fSBzcGVjaW1lblxuICogQHBhcmFtIHtDb3B5UmVjb3JkPFBhdHRlcm4+fSByZXF1aXJlZFBhdHRcbiAqIEBwYXJhbSB7Q29weVJlY29yZDxQYXR0ZXJuPn0gb3B0aW9uYWxQYXR0XG4gKiBAcmV0dXJucyB7e1xuICogICByZXF1aXJlZFNwZWNpbWVuOiBDb3B5UmVjb3JkPFBhc3NhYmxlPixcbiAqICAgb3B0aW9uYWxTcGVjaW1lbjogQ29weVJlY29yZDxQYXNzYWJsZT4sXG4gKiAgIHJlc3RTcGVjaW1lbjogQ29weVJlY29yZDxQYXNzYWJsZT5cbiAqIH19XG4gKi9cbmNvbnN0IHNwbGl0UmVjb3JkUGFydHM9KHNwZWNpbWVuLHJlcXVpcmVkUGF0dCxvcHRpb25hbFBhdHQpPT57XG4vKiBOb3QgZnJvemVuISBNdXRhdGVkIGluIHBsYWNlKi9cbi8qKiBAdHlwZSB7W3N0cmluZywgUGFzc2FibGVdW119ICovXG5jb25zdCByZXF1aXJlZEVudHJpZXM9W107XG4vKiogQHR5cGUge1tzdHJpbmcsIFBhc3NhYmxlXVtdfSAqL1xuY29uc3Qgb3B0aW9uYWxFbnRyaWVzPVtdO1xuLyoqIEB0eXBlIHtbc3RyaW5nLCBQYXNzYWJsZV1bXX0gKi9cbmNvbnN0IHJlc3RFbnRyaWVzPVtdO1xuZm9yKGNvbnN0W25hbWUsdmFsdWVdb2YgZW50cmllcyhzcGVjaW1lbikpe1xuaWYoaGFzT3duUHJvcGVydHlPZihyZXF1aXJlZFBhdHQsbmFtZSkpe1xucmVxdWlyZWRFbnRyaWVzLnB1c2goW25hbWUsdmFsdWVdKTtcbiB9ZWxzZSBpZihoYXNPd25Qcm9wZXJ0eU9mKG9wdGlvbmFsUGF0dCxuYW1lKSl7XG5vcHRpb25hbEVudHJpZXMucHVzaChbbmFtZSx2YWx1ZV0pO1xuIH1lbHNle1xucmVzdEVudHJpZXMucHVzaChbbmFtZSx2YWx1ZV0pO1xuIH1cbiB9XG5yZXR1cm4gaGFyZGVuKHtcbnJlcXVpcmVkU3BlY2ltZW46ZnJvbVVuaXF1ZUVudHJpZXMocmVxdWlyZWRFbnRyaWVzKSxcbm9wdGlvbmFsU3BlY2ltZW46ZnJvbVVuaXF1ZUVudHJpZXMob3B0aW9uYWxFbnRyaWVzKSxcbnJlc3RTcGVjaW1lbjpmcm9tVW5pcXVlRW50cmllcyhyZXN0RW50cmllcyl9KTtcblxuIH07XG5cbi8qKlxuICogT3B0aW9uYWwgc3BlY2ltZW4gdmFsdWVzIHdoaWNoIGFyZSBgdW5kZWZpbmVkYCBwYXNzIHVuY29uZGl0aW9uYWxseS5cbiAqIFdlIGVuY29kZSB0aGlzIHdpdGggdGhlIGBNLm9yYCBwYXR0ZXJuIHNvIGl0IGFsc28gcHJvZHVjZXMgYSBnb29kXG4gKiBjb21wcmVzc2lvbiBkaXN0aW5ndWlzaGluZyBgdW5kZWZpbmVkYCBmcm9tIGFic2VuY2UuXG4gKlxuICogQHBhcmFtIHtDb3B5UmVjb3JkPFBhdHRlcm4+fSBvcHRpb25hbFBhdHRcbiAqIEBwYXJhbSB7c3RyaW5nW119IG5hbWVzXG4gKiBAcmV0dXJucyB7Q29weVJlY29yZDxQYXR0ZXJuPn0gVGhlIHBhcnRpYWxQYXR0XG4gKi9cbmNvbnN0IGFkYXB0UmVjb3JkUGF0dGVybj0ob3B0aW9uYWxQYXR0LG5hbWVzKT0+XG5mcm9tVW5pcXVlRW50cmllcyhuYW1lcy5tYXAoKG5hbWUpPT5bbmFtZSxNTS5vcHQob3B0aW9uYWxQYXR0W25hbWVdKV0pKTtcblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoU3BsaXRSZWNvcmRIZWxwZXI9RmFyKCdtYXRjaDpzcGxpdFJlY29yZCBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooXG5zcGVjaW1lbixcbltyZXF1aXJlZFBhdHQsb3B0aW9uYWxQYXR0PXt9LHJlc3RQYXR0PU1NLmFueSgpXSxcbmNoZWNrKT0+XG57XG5pZighY2hlY2tLaW5kKHNwZWNpbWVuLCdjb3B5UmVjb3JkJyxjaGVjaykpe1xucmV0dXJuIGZhbHNlO1xuIH1cbmNvbnN0e3JlcXVpcmVkU3BlY2ltZW4sb3B0aW9uYWxTcGVjaW1lbixyZXN0U3BlY2ltZW59PVxuc3BsaXRSZWNvcmRQYXJ0cyhzcGVjaW1lbixyZXF1aXJlZFBhdHQsb3B0aW9uYWxQYXR0KTtcblxuY29uc3QgcGFydGlhbE5hbWVzPS8qKiBAdHlwZSB7c3RyaW5nW119ICovb3duS2V5cyhvcHRpb25hbFNwZWNpbWVuKTtcbmNvbnN0IHBhcnRpYWxQYXR0PWFkYXB0UmVjb3JkUGF0dGVybihvcHRpb25hbFBhdHQscGFydGlhbE5hbWVzKTtcbnJldHVybihcbmNoZWNrTWF0Y2hlcyhyZXF1aXJlZFNwZWNpbWVuLHJlcXVpcmVkUGF0dCxjaGVjaykmJlxucGFydGlhbE5hbWVzLmV2ZXJ5KChuYW1lKT0+XG5jaGVja01hdGNoZXMoXG5vcHRpb25hbFNwZWNpbWVuW25hbWVdLFxucGFydGlhbFBhdHRbbmFtZV0sXG5jaGVjayxcbiBgJHtuYW1lfT9gKSkmJlxuXG5cbmNoZWNrTWF0Y2hlcyhyZXN0U3BlY2ltZW4scmVzdFBhdHQsY2hlY2ssJy4uLnJlc3QnKSk7XG5cbiB9LFxuXG4vKipcbiAqIEBwYXJhbSB7QXJyYXl9IHNwbGl0QXJyYXlcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqL1xuY2hlY2tJc1dlbGxGb3JtZWQ6KHNwbGl0QXJyYXksY2hlY2spPT57XG5pZihcbnBhc3NTdHlsZU9mKHNwbGl0QXJyYXkpPT09J2NvcHlBcnJheScmJihcbnNwbGl0QXJyYXkubGVuZ3RoPj0xfHxzcGxpdEFycmF5Lmxlbmd0aDw9MykpXG57XG5jb25zdFtyZXF1aXJlZFBhdHQsb3B0aW9uYWxQYXR0PXVuZGVmaW5lZCxyZXN0UGF0dD11bmRlZmluZWRdPVxuc3BsaXRBcnJheTtcbmlmKFxuaXNQYXR0ZXJuKHJlcXVpcmVkUGF0dCkmJlxucGFzc1N0eWxlT2YocmVxdWlyZWRQYXR0KT09PSdjb3B5UmVjb3JkJyYmKFxub3B0aW9uYWxQYXR0PT09dW5kZWZpbmVkfHxcbmlzUGF0dGVybihvcHRpb25hbFBhdHQpJiZcbnBhc3NTdHlsZU9mKG9wdGlvbmFsUGF0dCk9PT0nY29weVJlY29yZCcpJiYoXG5yZXN0UGF0dD09PXVuZGVmaW5lZHx8aXNQYXR0ZXJuKHJlc3RQYXR0KSkpXG57XG5yZXR1cm4gdHJ1ZTtcbiB9XG4gfVxucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGBNdXN0IGJlIGFuIGFycmF5IG9mIGEgcmVxdWlyZWRQYXR0IHJlY29yZCwgYW4gb3B0aW9uYWwgb3B0aW9uYWxQYXR0IHJlY29yZCwgYW5kIGFuIG9wdGlvbmFsIHJlc3RQYXR0OiAke3EoXG5zcGxpdEFycmF5KVxuIH1gKTtcblxuIH0sXG5cbmdldFJhbmtDb3ZlcjooW1xucmVxdWlyZWRQYXR0LFxuX29wdGlvbmFsUGF0dD11bmRlZmluZWQsXG5fcmVzdFBhdHQ9dW5kZWZpbmVkXSk9PlxuZ2V0UGFzc1N0eWxlQ292ZXIocGFzc1N0eWxlT2YocmVxdWlyZWRQYXR0KSl9KTtcblxuXG4vKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIE1hdGNoSGVscGVyPn0gKi9cbmNvbnN0IEhlbHBlcnNCeU1hdGNoVGFnPWhhcmRlbih7XG4nbWF0Y2g6YW55JzptYXRjaEFueUhlbHBlcixcbidtYXRjaDphbmQnOm1hdGNoQW5kSGVscGVyLFxuJ21hdGNoOm9yJzptYXRjaE9ySGVscGVyLFxuJ21hdGNoOm5vdCc6bWF0Y2hOb3RIZWxwZXIsXG5cbidtYXRjaDpzY2FsYXInOm1hdGNoU2NhbGFySGVscGVyLFxuJ21hdGNoOmtleSc6bWF0Y2hLZXlIZWxwZXIsXG4nbWF0Y2g6cGF0dGVybic6bWF0Y2hQYXR0ZXJuSGVscGVyLFxuJ21hdGNoOmtpbmQnOm1hdGNoS2luZEhlbHBlcixcbidtYXRjaDpiaWdpbnQnOm1hdGNoQmlnaW50SGVscGVyLFxuJ21hdGNoOm5hdCc6bWF0Y2hOYXRIZWxwZXIsXG4nbWF0Y2g6c3RyaW5nJzptYXRjaFN0cmluZ0hlbHBlcixcbidtYXRjaDpzeW1ib2wnOm1hdGNoU3ltYm9sSGVscGVyLFxuJ21hdGNoOnJlbW90YWJsZSc6bWF0Y2hSZW1vdGFibGVIZWxwZXIsXG5cbidtYXRjaDpsdCc6bWF0Y2hMVEhlbHBlcixcbidtYXRjaDpsdGUnOm1hdGNoTFRFSGVscGVyLFxuJ21hdGNoOmd0ZSc6bWF0Y2hHVEVIZWxwZXIsXG4nbWF0Y2g6Z3QnOm1hdGNoR1RIZWxwZXIsXG5cbidtYXRjaDphcnJheU9mJzptYXRjaEFycmF5T2ZIZWxwZXIsXG4nbWF0Y2g6cmVjb3JkT2YnOm1hdGNoUmVjb3JkT2ZIZWxwZXIsXG4nbWF0Y2g6c2V0T2YnOm1hdGNoU2V0T2ZIZWxwZXIsXG4nbWF0Y2g6YmFnT2YnOm1hdGNoQmFnT2ZIZWxwZXIsXG4nbWF0Y2g6bWFwT2YnOm1hdGNoTWFwT2ZIZWxwZXIsXG4nbWF0Y2g6c3BsaXRBcnJheSc6bWF0Y2hTcGxpdEFycmF5SGVscGVyLFxuJ21hdGNoOnNwbGl0UmVjb3JkJzptYXRjaFNwbGl0UmVjb3JkSGVscGVyfSk7XG5cblxuY29uc3QgbWFrZU1hdGNoZXI9KHRhZyxwYXlsb2FkKT0+e1xuY29uc3QgbWF0Y2hlcj1tYWtlVGFnZ2VkKHRhZyxwYXlsb2FkKTtcbmFzc2VydFBhdHRlcm4obWF0Y2hlcik7XG5yZXR1cm4gbWF0Y2hlcjtcbiB9O1xuXG5jb25zdCBtYWtlS2luZE1hdGNoZXI9KGtpbmQpPT5tYWtlTWF0Y2hlcignbWF0Y2g6a2luZCcsa2luZCk7XG5cbmNvbnN0IEFueVNoYXBlPW1ha2VNYXRjaGVyKCdtYXRjaDphbnknLHVuZGVmaW5lZCk7XG5jb25zdCBTY2FsYXJTaGFwZT1tYWtlTWF0Y2hlcignbWF0Y2g6c2NhbGFyJyx1bmRlZmluZWQpO1xuY29uc3QgS2V5U2hhcGU9bWFrZU1hdGNoZXIoJ21hdGNoOmtleScsdW5kZWZpbmVkKTtcbmNvbnN0IFBhdHRlcm5TaGFwZT1tYWtlTWF0Y2hlcignbWF0Y2g6cGF0dGVybicsdW5kZWZpbmVkKTtcbmNvbnN0IEJvb2xlYW5TaGFwZT1tYWtlS2luZE1hdGNoZXIoJ2Jvb2xlYW4nKTtcbmNvbnN0IE51bWJlclNoYXBlPW1ha2VLaW5kTWF0Y2hlcignbnVtYmVyJyk7XG5jb25zdCBCaWdJbnRTaGFwZT1tYWtlVGFnZ2VkKCdtYXRjaDpiaWdpbnQnLFtdKTtcbmNvbnN0IE5hdFNoYXBlPW1ha2VUYWdnZWQoJ21hdGNoOm5hdCcsW10pO1xuY29uc3QgU3RyaW5nU2hhcGU9bWFrZVRhZ2dlZCgnbWF0Y2g6c3RyaW5nJyxbXSk7XG5jb25zdCBTeW1ib2xTaGFwZT1tYWtlVGFnZ2VkKCdtYXRjaDpzeW1ib2wnLFtdKTtcbmNvbnN0IFJlY29yZFNoYXBlPW1ha2VUYWdnZWQoJ21hdGNoOnJlY29yZE9mJyxbQW55U2hhcGUsQW55U2hhcGVdKTtcbmNvbnN0IEFycmF5U2hhcGU9bWFrZVRhZ2dlZCgnbWF0Y2g6YXJyYXlPZicsW0FueVNoYXBlXSk7XG5jb25zdCBTZXRTaGFwZT1tYWtlVGFnZ2VkKCdtYXRjaDpzZXRPZicsW0FueVNoYXBlXSk7XG5jb25zdCBCYWdTaGFwZT1tYWtlVGFnZ2VkKCdtYXRjaDpiYWdPZicsW0FueVNoYXBlLEFueVNoYXBlXSk7XG5jb25zdCBNYXBTaGFwZT1tYWtlVGFnZ2VkKCdtYXRjaDptYXBPZicsW0FueVNoYXBlLEFueVNoYXBlXSk7XG5jb25zdCBSZW1vdGFibGVTaGFwZT1tYWtlS2luZE1hdGNoZXIoJ3JlbW90YWJsZScpO1xuY29uc3QgRXJyb3JTaGFwZT1tYWtlS2luZE1hdGNoZXIoJ2Vycm9yJyk7XG5jb25zdCBQcm9taXNlU2hhcGU9bWFrZUtpbmRNYXRjaGVyKCdwcm9taXNlJyk7XG5jb25zdCBVbmRlZmluZWRTaGFwZT1tYWtlS2luZE1hdGNoZXIoJ3VuZGVmaW5lZCcpO1xuXG4vKipcbiAqIEZvciB3aGVuIHRoZSBsYXN0IGVsZW1lbnQgb2YgdGhlIHBheWxvYWQgaXMgdGhlIG9wdGlvbmFsIGxpbWl0cyxcbiAqIHNvIHRoYXQgd2hlbiBpdCBpcyBgdW5kZWZpbmVkYCBpdCBpcyBkcm9wcGVkIGZyb20gdGhlIGVuZCBvZiB0aGVcbiAqIHBheWxvYWRzIGFycmF5LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAqIEBwYXJhbSB7UGFzc2FibGVbXX0gcGF5bG9hZFxuICovXG5jb25zdCBtYWtlTGltaXRzTWF0Y2hlcj0odGFnLHBheWxvYWQpPT57XG5pZihwYXlsb2FkW3BheWxvYWQubGVuZ3RoLTFdPT09dW5kZWZpbmVkKXtcbnBheWxvYWQ9aGFyZGVuKHBheWxvYWQuc2xpY2UoMCxwYXlsb2FkLmxlbmd0aC0xKSk7XG4gfVxucmV0dXJuIG1ha2VNYXRjaGVyKHRhZyxwYXlsb2FkKTtcbiB9O1xuXG5jb25zdCBtYWtlUmVtb3RhYmxlTWF0Y2hlcj0obGFiZWw9dW5kZWZpbmVkKT0+XG5sYWJlbD09PXVuZGVmaW5lZD9cblJlbW90YWJsZVNoYXBlOlxubWFrZU1hdGNoZXIoJ21hdGNoOnJlbW90YWJsZScsaGFyZGVuKHtsYWJlbH0pKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtUfSBlbXB0eVxuICogQHBhcmFtIHtUfSBiYXNlXG4gKiBAcGFyYW0ge1R9IFtvcHRpb25hbF1cbiAqIEBwYXJhbSB7VH0gW3Jlc3RdXG4gKiBAcmV0dXJucyB7VFtdfVxuICovXG5jb25zdCBtYWtlU3BsaXRQYXlsb2FkPShcbmVtcHR5LFxuYmFzZSxcbm9wdGlvbmFsPXVuZGVmaW5lZCxcbnJlc3Q9dW5kZWZpbmVkKT0+XG57XG5pZihyZXN0KXtcbnJldHVybltiYXNlLG9wdGlvbmFsfHxlbXB0eSxyZXN0XTtcbiB9XG5pZihvcHRpb25hbCl7XG5yZXR1cm5bYmFzZSxvcHRpb25hbF07XG4gfVxucmV0dXJuW2Jhc2VdO1xuIH07XG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKiBAdHlwZSB7TWF0Y2hlck5hbWVzcGFjZX0gKi9cbmNvbnN0IE09aGFyZGVuKHtcbmFueTooKT0+QW55U2hhcGUsXG5hbmQ6KC4uLnBhdHRzKT0+bWFrZU1hdGNoZXIoJ21hdGNoOmFuZCcscGF0dHMpLFxub3I6KC4uLnBhdHRzKT0+bWFrZU1hdGNoZXIoJ21hdGNoOm9yJyxwYXR0cyksXG5ub3Q6KHN1YlBhdHQpPT5tYWtlTWF0Y2hlcignbWF0Y2g6bm90JyxzdWJQYXR0KSxcblxuc2NhbGFyOigpPT5TY2FsYXJTaGFwZSxcbmtleTooKT0+S2V5U2hhcGUsXG5wYXR0ZXJuOigpPT5QYXR0ZXJuU2hhcGUsXG5raW5kOm1ha2VLaW5kTWF0Y2hlcixcbmJvb2xlYW46KCk9PkJvb2xlYW5TaGFwZSxcbm51bWJlcjooKT0+TnVtYmVyU2hhcGUsXG5iaWdpbnQ6KGxpbWl0cz11bmRlZmluZWQpPT5cbmxpbWl0cz9tYWtlTGltaXRzTWF0Y2hlcignbWF0Y2g6YmlnaW50JyxbbGltaXRzXSk6QmlnSW50U2hhcGUsXG5uYXQ6KGxpbWl0cz11bmRlZmluZWQpPT5cbmxpbWl0cz9tYWtlTGltaXRzTWF0Y2hlcignbWF0Y2g6bmF0JyxbbGltaXRzXSk6TmF0U2hhcGUsXG5zdHJpbmc6KGxpbWl0cz11bmRlZmluZWQpPT5cbmxpbWl0cz9tYWtlTGltaXRzTWF0Y2hlcignbWF0Y2g6c3RyaW5nJyxbbGltaXRzXSk6U3RyaW5nU2hhcGUsXG5zeW1ib2w6KGxpbWl0cz11bmRlZmluZWQpPT5cbmxpbWl0cz9tYWtlTGltaXRzTWF0Y2hlcignbWF0Y2g6c3ltYm9sJyxbbGltaXRzXSk6U3ltYm9sU2hhcGUsXG5yZWNvcmQ6KGxpbWl0cz11bmRlZmluZWQpPT5cbmxpbWl0cz9NLnJlY29yZE9mKE0uYW55KCksTS5hbnkoKSxsaW1pdHMpOlJlY29yZFNoYXBlLFxuYXJyYXk6KGxpbWl0cz11bmRlZmluZWQpPT5cbmxpbWl0cz9NLmFycmF5T2YoTS5hbnkoKSxsaW1pdHMpOkFycmF5U2hhcGUsXG5zZXQ6KGxpbWl0cz11bmRlZmluZWQpPT5saW1pdHM/TS5zZXRPZihNLmFueSgpLGxpbWl0cyk6U2V0U2hhcGUsXG5iYWc6KGxpbWl0cz11bmRlZmluZWQpPT5cbmxpbWl0cz9NLmJhZ09mKE0uYW55KCksTS5hbnkoKSxsaW1pdHMpOkJhZ1NoYXBlLFxubWFwOihsaW1pdHM9dW5kZWZpbmVkKT0+XG5saW1pdHM/TS5tYXBPZihNLmFueSgpLE0uYW55KCksbGltaXRzKTpNYXBTaGFwZSxcbnJlbW90YWJsZTptYWtlUmVtb3RhYmxlTWF0Y2hlcixcbmVycm9yOigpPT5FcnJvclNoYXBlLFxucHJvbWlzZTooKT0+UHJvbWlzZVNoYXBlLFxudW5kZWZpbmVkOigpPT5VbmRlZmluZWRTaGFwZSxcbm51bGw6KCk9Pm51bGwsXG5cbmx0OihyaWdodE9wZXJhbmQpPT5tYWtlTWF0Y2hlcignbWF0Y2g6bHQnLHJpZ2h0T3BlcmFuZCksXG5sdGU6KHJpZ2h0T3BlcmFuZCk9Pm1ha2VNYXRjaGVyKCdtYXRjaDpsdGUnLHJpZ2h0T3BlcmFuZCksXG5lcTooa2V5KT0+e1xuYXNzZXJ0S2V5KGtleSk7XG5yZXR1cm4ga2V5PT09dW5kZWZpbmVkP00udW5kZWZpbmVkKCk6a2V5O1xuIH0sXG5uZXE6KGtleSk9Pk0ubm90KE0uZXEoa2V5KSksXG5ndGU6KHJpZ2h0T3BlcmFuZCk9Pm1ha2VNYXRjaGVyKCdtYXRjaDpndGUnLHJpZ2h0T3BlcmFuZCksXG5ndDoocmlnaHRPcGVyYW5kKT0+bWFrZU1hdGNoZXIoJ21hdGNoOmd0JyxyaWdodE9wZXJhbmQpLFxuXG5yZWNvcmRPZjooa2V5UGF0dD1NLmFueSgpLHZhbHVlUGF0dD1NLmFueSgpLGxpbWl0cz11bmRlZmluZWQpPT5cbm1ha2VMaW1pdHNNYXRjaGVyKCdtYXRjaDpyZWNvcmRPZicsW2tleVBhdHQsdmFsdWVQYXR0LGxpbWl0c10pLFxuYXJyYXlPZjooc3ViUGF0dD1NLmFueSgpLGxpbWl0cz11bmRlZmluZWQpPT5cbm1ha2VMaW1pdHNNYXRjaGVyKCdtYXRjaDphcnJheU9mJyxbc3ViUGF0dCxsaW1pdHNdKSxcbnNldE9mOihrZXlQYXR0PU0uYW55KCksbGltaXRzPXVuZGVmaW5lZCk9PlxubWFrZUxpbWl0c01hdGNoZXIoJ21hdGNoOnNldE9mJyxba2V5UGF0dCxsaW1pdHNdKSxcbmJhZ09mOihrZXlQYXR0PU0uYW55KCksY291bnRQYXR0PU0uYW55KCksbGltaXRzPXVuZGVmaW5lZCk9PlxubWFrZUxpbWl0c01hdGNoZXIoJ21hdGNoOmJhZ09mJyxba2V5UGF0dCxjb3VudFBhdHQsbGltaXRzXSksXG5tYXBPZjooa2V5UGF0dD1NLmFueSgpLHZhbHVlUGF0dD1NLmFueSgpLGxpbWl0cz11bmRlZmluZWQpPT5cbm1ha2VMaW1pdHNNYXRjaGVyKCdtYXRjaDptYXBPZicsW2tleVBhdHQsdmFsdWVQYXR0LGxpbWl0c10pLFxuc3BsaXRBcnJheTooYmFzZSxvcHRpb25hbD11bmRlZmluZWQscmVzdD11bmRlZmluZWQpPT5cbm1ha2VNYXRjaGVyKFxuJ21hdGNoOnNwbGl0QXJyYXknLFxubWFrZVNwbGl0UGF5bG9hZChbXSxiYXNlLG9wdGlvbmFsLHJlc3QpKSxcblxuc3BsaXRSZWNvcmQ6KGJhc2Usb3B0aW9uYWw9dW5kZWZpbmVkLHJlc3Q9dW5kZWZpbmVkKT0+XG5tYWtlTWF0Y2hlcihcbidtYXRjaDpzcGxpdFJlY29yZCcsXG5tYWtlU3BsaXRQYXlsb2FkKHt9LGJhc2Usb3B0aW9uYWwscmVzdCkpLFxuXG5zcGxpdDooYmFzZSxyZXN0PXVuZGVmaW5lZCk9PntcbmlmKHBhc3NTdHlsZU9mKGhhcmRlbihiYXNlKSk9PT0nY29weUFycmF5Jyl7XG4vKiBAdHMtZXhwZWN0LWVycm9yIFdlIGtub3cgaXQgc2hvdWxkIGJlIGFuIGFycmF5Ki9cbnJldHVybiBNLnNwbGl0QXJyYXkoYmFzZSxyZXN0JiZbXSxyZXN0KTtcbiB9ZWxzZXtcbnJldHVybiBNLnNwbGl0UmVjb3JkKGJhc2UscmVzdCYme30scmVzdCk7XG4gfVxuIH0sXG5wYXJ0aWFsOihiYXNlLHJlc3Q9dW5kZWZpbmVkKT0+e1xuaWYocGFzc1N0eWxlT2YoaGFyZGVuKGJhc2UpKT09PSdjb3B5QXJyYXknKXtcbi8qIEB0cy1leHBlY3QtZXJyb3IgV2Uga25vdyBpdCBzaG91bGQgYmUgYW4gYXJyYXkqL1xucmV0dXJuIE0uc3BsaXRBcnJheShbXSxiYXNlLHJlc3QpO1xuIH1lbHNle1xucmV0dXJuIE0uc3BsaXRSZWNvcmQoe30sYmFzZSxyZXN0KTtcbiB9XG4gfSxcblxuZXJlZjoodCk9Pk0ub3IodCxNLnByb21pc2UoKSksXG5vcHQ6KHQpPT5NLm9yKE0udW5kZWZpbmVkKCksdCksXG5cbmludGVyZmFjZTooaW50ZXJmYWNlTmFtZSxtZXRob2RHdWFyZHMsb3B0aW9ucyk9PlxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbm1ha2VJbnRlcmZhY2VHdWFyZChpbnRlcmZhY2VOYW1lLG1ldGhvZEd1YXJkcyxvcHRpb25zKSxcbmNhbGw6KC4uLmFyZ1BhdHRlcm5zKT0+XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xubWFrZU1ldGhvZEd1YXJkTWFrZXIoJ3N5bmMnLGFyZ1BhdHRlcm5zKSxcbmNhbGxXaGVuOiguLi5hcmdHdWFyZHMpPT5cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5tYWtlTWV0aG9kR3VhcmRNYWtlcignYXN5bmMnLGFyZ0d1YXJkcyksXG5cbmF3YWl0OihhcmdQYXR0ZXJuKT0+XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xubWFrZUF3YWl0QXJnR3VhcmQoYXJnUGF0dGVybil9KTtcblxuXG5yZXR1cm4gaGFyZGVuKHtcbmNoZWNrTWF0Y2hlcyxcbm1hdGNoZXMsXG5tdXN0TWF0Y2gsXG5hc3NlcnRQYXR0ZXJuLFxuaXNQYXR0ZXJuLFxuZ2V0UmFua0NvdmVyLFxuTX0pO1xuXG4gfTtcblxuLyogT25seSBpbmNsdWRlIHRob3NlIHdob3NlIG1lYW5pbmcgaXMgaW5kZXBlbmRlbnQgb2YgYW4gaW1wdXRlZCBzb3J0IG9yZGVyKi9cbi8qIG9mIHJlbW90YWJsZXMsIG9yIG9mIGVuY29kaW5nIG9mIHBhc3NhYmxlIGFzIHNvcnRhYmxlIHN0cmluZ3MuIFRodXMsKi9cbi8qIGdldFJhbmtDb3ZlciBpcyBvbWl0dGVkLiBUbyBnZXQgb25lLCB5b3UnZCBuZWVkIHRvIGluc3RhbnRpYXRlKi9cbi8qIGBtYWtlUGF0dGVybktpdCgpYCB5b3Vyc2VsZi4gU2luY2UgdGhlcmUgYXJlIGN1cnJlbnRseSBubyBleHRlcm5hbCovXG4vKiB1c2VzIG9mIGBnZXRSYW5rQ292ZXJgLCBmb3IgY2xhcml0eSBkdXJpbmcgZGV2ZWxvcG1lbnQsIGBtYWtlUGF0dGVybktpdGAqL1xuLyogaXMgbm90IGN1cnJlbnRseSBleHBvcnRlZC4qL1xuY29uc3QgICAgICAge1xuY2hlY2tNYXRjaGVzLFxubWF0Y2hlcyxcbm11c3RNYXRjaCxcbmFzc2VydFBhdHRlcm4sXG5pc1BhdHRlcm4sXG5nZXRSYW5rQ292ZXIsXG5NfT1cbm1ha2VQYXR0ZXJuS2l0KCk7JGjigI1fb25jZS5jaGVja01hdGNoZXMoY2hlY2tNYXRjaGVzKTskaOKAjV9vbmNlLm1hdGNoZXMobWF0Y2hlcyk7JGjigI1fb25jZS5tdXN0TWF0Y2gobXVzdE1hdGNoKTskaOKAjV9vbmNlLmFzc2VydFBhdHRlcm4oYXNzZXJ0UGF0dGVybik7JGjigI1fb25jZS5pc1BhdHRlcm4oaXNQYXR0ZXJuKTskaOKAjV9vbmNlLmdldFJhbmtDb3ZlcihnZXRSYW5rQ292ZXIpOyRo4oCNX29uY2UuTShNKTtcblxuTU09TTtcblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBHdWFyZHMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuY29uc3QgQXdhaXRBcmdHdWFyZFNoYXBlPWhhcmRlbih7XG5rbGFzczonYXdhaXRBcmcnLFxuYXJnR3VhcmQ6TS5wYXR0ZXJuKCl9KTtcblxuXG4vKipcbiAqIEBwYXJhbSB7YW55fSBzcGVjaW1lblxuICogQHJldHVybnMge3NwZWNpbWVuIGlzIEF3YWl0QXJnR3VhcmR9XG4gKi9cbmNvbnN0ICAgICAgICBpc0F3YWl0QXJnR3VhcmQ9KHNwZWNpbWVuKT0+XG5tYXRjaGVzKHNwZWNpbWVuLEF3YWl0QXJnR3VhcmRTaGFwZSk7JGjigI1fb25jZS5pc0F3YWl0QXJnR3VhcmQoaXNBd2FpdEFyZ0d1YXJkKTtcbmhhcmRlbihpc0F3YWl0QXJnR3VhcmQpO1xuXG4vKipcbiAqIEBwYXJhbSB7YW55fSBzcGVjaW1lblxuICogQHJldHVybnMge2Fzc2VydHMgc3BlY2ltZW4gaXMgQXdhaXRBcmdHdWFyZH1cbiAqL1xuY29uc3QgICAgICAgIGFzc2VydEF3YWl0QXJnR3VhcmQ9KHNwZWNpbWVuKT0+e1xubXVzdE1hdGNoKHNwZWNpbWVuLEF3YWl0QXJnR3VhcmRTaGFwZSwnYXdhaXRBcmdHdWFyZCcpO1xuIH07JGjigI1fb25jZS5hc3NlcnRBd2FpdEFyZ0d1YXJkKGFzc2VydEF3YWl0QXJnR3VhcmQpO1xuaGFyZGVuKGFzc2VydEF3YWl0QXJnR3VhcmQpO1xuXG4vKipcbiAqIEJ5IHVzaW5nIHRoaXMgYWJzdHJhY3Rpb24gcmF0aGVyIHRoYW4gYWNjZXNzaW5nIHRoZSBwcm9wZXJ0aWVzIGRpcmVjdGx5LFxuICogd2Ugc21vb3RoIHRoZSB0cmFuc2l0aW9uIHRvIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzE3MTJcbiAqXG4gKiBAcGFyYW0ge0F3YWl0QXJnR3VhcmR9IGF3YWl0QXJnR3VhcmRcbiAqIEByZXR1cm5zIHtBd2FpdEFyZ0d1YXJkUGF5bG9hZH1cbiAqL1xuY29uc3QgICAgICAgIGdldEF3YWl0QXJnR3VhcmRQYXlsb2FkPShhd2FpdEFyZ0d1YXJkKT0+e1xuYXNzZXJ0QXdhaXRBcmdHdWFyZChhd2FpdEFyZ0d1YXJkKTtcbmNvbnN0e2tsYXNzOl8sLi4ucGF5bG9hZH09YXdhaXRBcmdHdWFyZDtcbi8qKiBAdHlwZSB7QXdhaXRBcmdHdWFyZFBheWxvYWR9ICovXG5yZXR1cm4gcGF5bG9hZDtcbiB9OyRo4oCNX29uY2UuZ2V0QXdhaXRBcmdHdWFyZFBheWxvYWQoZ2V0QXdhaXRBcmdHdWFyZFBheWxvYWQpO1xuaGFyZGVuKGdldEF3YWl0QXJnR3VhcmRQYXlsb2FkKTtcblxuLyoqXG4gKiBAcGFyYW0ge1BhdHRlcm59IGFyZ1BhdHRlcm5cbiAqIEByZXR1cm5zIHtBd2FpdEFyZ0d1YXJkfVxuICovXG5jb25zdCBtYWtlQXdhaXRBcmdHdWFyZD0oYXJnUGF0dGVybik9Pntcbi8qKiBAdHlwZSB7QXdhaXRBcmdHdWFyZH0gKi9cbmNvbnN0IHJlc3VsdD1oYXJkZW4oe1xua2xhc3M6J2F3YWl0QXJnJyxcbmFyZ0d1YXJkOmFyZ1BhdHRlcm59KTtcblxuYXNzZXJ0QXdhaXRBcmdHdWFyZChyZXN1bHQpO1xucmV0dXJuIHJlc3VsdDtcbiB9O1xuXG5jb25zdCBQYXR0ZXJuTGlzdFNoYXBlPU0uYXJyYXlPZihNLnBhdHRlcm4oKSk7XG5cbmNvbnN0IEFyZ0d1YXJkU2hhcGU9TS5vcihNLnBhdHRlcm4oKSxBd2FpdEFyZ0d1YXJkU2hhcGUpO1xuY29uc3QgQXJnR3VhcmRMaXN0U2hhcGU9TS5hcnJheU9mKEFyZ0d1YXJkU2hhcGUpO1xuXG5jb25zdCBTeW5jTWV0aG9kR3VhcmRTaGFwZT1oYXJkZW4oe1xua2xhc3M6J21ldGhvZEd1YXJkJyxcbmNhbGxLaW5kOidzeW5jJyxcbmFyZ0d1YXJkczpQYXR0ZXJuTGlzdFNoYXBlLFxub3B0aW9uYWxBcmdHdWFyZHM6TS5vcHQoUGF0dGVybkxpc3RTaGFwZSksXG5yZXN0QXJnR3VhcmQ6TS5vcHQoTS5wYXR0ZXJuKCkpLFxucmV0dXJuR3VhcmQ6TS5wYXR0ZXJuKCl9KTtcblxuXG5jb25zdCBBc3luY01ldGhvZEd1YXJkU2hhcGU9aGFyZGVuKHtcbmtsYXNzOidtZXRob2RHdWFyZCcsXG5jYWxsS2luZDonYXN5bmMnLFxuYXJnR3VhcmRzOkFyZ0d1YXJkTGlzdFNoYXBlLFxub3B0aW9uYWxBcmdHdWFyZHM6TS5vcHQoQXJnR3VhcmRMaXN0U2hhcGUpLFxucmVzdEFyZ0d1YXJkOk0ub3B0KE0ucGF0dGVybigpKSxcbnJldHVybkd1YXJkOk0ucGF0dGVybigpfSk7XG5cblxuY29uc3QgTWV0aG9kR3VhcmRTaGFwZT1NLm9yKFN5bmNNZXRob2RHdWFyZFNoYXBlLEFzeW5jTWV0aG9kR3VhcmRTaGFwZSk7XG5cbi8qKlxuICogQHBhcmFtIHthbnl9IHNwZWNpbWVuXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBzcGVjaW1lbiBpcyBNZXRob2RHdWFyZH1cbiAqL1xuY29uc3QgICAgICAgIGFzc2VydE1ldGhvZEd1YXJkPShzcGVjaW1lbik9Pntcbm11c3RNYXRjaChzcGVjaW1lbixNZXRob2RHdWFyZFNoYXBlLCdtZXRob2RHdWFyZCcpO1xuIH07JGjigI1fb25jZS5hc3NlcnRNZXRob2RHdWFyZChhc3NlcnRNZXRob2RHdWFyZCk7XG5oYXJkZW4oYXNzZXJ0TWV0aG9kR3VhcmQpO1xuXG4vKipcbiAqIEJ5IHVzaW5nIHRoaXMgYWJzdHJhY3Rpb24gcmF0aGVyIHRoYW4gYWNjZXNzaW5nIHRoZSBwcm9wZXJ0aWVzIGRpcmVjdGx5LFxuICogd2Ugc21vb3RoIHRoZSB0cmFuc2l0aW9uIHRvIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzE3MTJcbiAqXG4gKiBAcGFyYW0ge01ldGhvZEd1YXJkfSBtZXRob2RHdWFyZFxuICogQHJldHVybnMge01ldGhvZEd1YXJkUGF5bG9hZH1cbiAqL1xuY29uc3QgICAgICAgIGdldE1ldGhvZEd1YXJkUGF5bG9hZD0obWV0aG9kR3VhcmQpPT57XG5hc3NlcnRNZXRob2RHdWFyZChtZXRob2RHdWFyZCk7XG5jb25zdHtrbGFzczpfLC4uLnBheWxvYWR9PW1ldGhvZEd1YXJkO1xuLyoqIEB0eXBlIHtNZXRob2RHdWFyZFBheWxvYWR9ICovXG5yZXR1cm4gcGF5bG9hZDtcbiB9OyRo4oCNX29uY2UuZ2V0TWV0aG9kR3VhcmRQYXlsb2FkKGdldE1ldGhvZEd1YXJkUGF5bG9hZCk7XG5oYXJkZW4oZ2V0TWV0aG9kR3VhcmRQYXlsb2FkKTtcblxuLyoqXG4gKiBAcGFyYW0geydzeW5jJ3wnYXN5bmMnfSBjYWxsS2luZFxuICogQHBhcmFtIHtBcmdHdWFyZFtdfSBhcmdHdWFyZHNcbiAqIEBwYXJhbSB7QXJnR3VhcmRbXX0gW29wdGlvbmFsQXJnR3VhcmRzXVxuICogQHBhcmFtIHtBcmdHdWFyZH0gW3Jlc3RBcmdHdWFyZF1cbiAqIEByZXR1cm5zIHtNZXRob2RHdWFyZE1ha2VyMH1cbiAqL1xuY29uc3QgbWFrZU1ldGhvZEd1YXJkTWFrZXI9KFxuY2FsbEtpbmQsXG5hcmdHdWFyZHMsXG5vcHRpb25hbEFyZ0d1YXJkcz11bmRlZmluZWQsXG5yZXN0QXJnR3VhcmQ9dW5kZWZpbmVkKT0+XG5cbmhhcmRlbih7XG5vcHRpb25hbDooLi4ub3B0QXJnR3VhcmRzKT0+e1xub3B0aW9uYWxBcmdHdWFyZHM9PT11bmRlZmluZWR8fFxuRmFpbCBgQ2FuIG9ubHkgaGF2ZSBvbmUgc2V0IG9mIG9wdGlvbmFsIGd1YXJkc2A7XG5yZXN0QXJnR3VhcmQ9PT11bmRlZmluZWR8fFxuRmFpbCBgb3B0aW9uYWwgYXJnIGd1YXJkcyBtdXN0IGNvbWUgYmVmb3JlIHJlc3QgYXJnYDtcbnJldHVybiBtYWtlTWV0aG9kR3VhcmRNYWtlcihjYWxsS2luZCxhcmdHdWFyZHMsb3B0QXJnR3VhcmRzKTtcbiB9LFxucmVzdDoockFyZ0d1YXJkKT0+e1xucmVzdEFyZ0d1YXJkPT09dW5kZWZpbmVkfHxGYWlsIGBDYW4gb25seSBoYXZlIG9uZSByZXN0IGFyZ2A7XG5yZXR1cm4gbWFrZU1ldGhvZEd1YXJkTWFrZXIoXG5jYWxsS2luZCxcbmFyZ0d1YXJkcyxcbm9wdGlvbmFsQXJnR3VhcmRzLFxuckFyZ0d1YXJkKTtcblxuIH0sXG5yZXR1cm5zOihyZXR1cm5HdWFyZD1NLnVuZGVmaW5lZCgpKT0+e1xuLyoqIEB0eXBlIHtNZXRob2RHdWFyZH0gKi9cbmNvbnN0IHJlc3VsdD1oYXJkZW4oe1xua2xhc3M6J21ldGhvZEd1YXJkJyxcbmNhbGxLaW5kLFxuYXJnR3VhcmRzLFxub3B0aW9uYWxBcmdHdWFyZHMsXG5yZXN0QXJnR3VhcmQsXG5yZXR1cm5HdWFyZH0pO1xuXG5hc3NlcnRNZXRob2RHdWFyZChyZXN1bHQpO1xucmV0dXJuIHJlc3VsdDtcbiB9fSk7XG5cblxuY29uc3QgSW50ZXJmYWNlR3VhcmRTaGFwZT1NLnNwbGl0UmVjb3JkKFxue1xua2xhc3M6J0ludGVyZmFjZScsXG5pbnRlcmZhY2VOYW1lOk0uc3RyaW5nKCksXG5tZXRob2RHdWFyZHM6TS5yZWNvcmRPZihNLnN0cmluZygpLE1ldGhvZEd1YXJkU2hhcGUpLFxuc2xvcHB5Ok0uYm9vbGVhbigpfSxcblxue1xuc3ltYm9sTWV0aG9kR3VhcmRzOk0ubWFwT2YoTS5zeW1ib2woKSxNZXRob2RHdWFyZFNoYXBlKX0pO1xuXG5cblxuLyoqXG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW5cbiAqIEByZXR1cm5zIHthc3NlcnRzIHNwZWNpbWVuIGlzIEludGVyZmFjZUd1YXJkfVxuICovXG5jb25zdCAgICAgICAgYXNzZXJ0SW50ZXJmYWNlR3VhcmQ9KHNwZWNpbWVuKT0+e1xubXVzdE1hdGNoKHNwZWNpbWVuLEludGVyZmFjZUd1YXJkU2hhcGUsJ2ludGVyZmFjZUd1YXJkJyk7XG4gfTskaOKAjV9vbmNlLmFzc2VydEludGVyZmFjZUd1YXJkKGFzc2VydEludGVyZmFjZUd1YXJkKTtcbmhhcmRlbihhc3NlcnRJbnRlcmZhY2VHdWFyZCk7XG5cbi8qKlxuICogQnkgdXNpbmcgdGhpcyBhYnN0cmFjdGlvbiByYXRoZXIgdGhhbiBhY2Nlc3NpbmcgdGhlIHByb3BlcnRpZXMgZGlyZWN0bHksXG4gKiB3ZSBzbW9vdGggdGhlIHRyYW5zaXRpb24gdG8gaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL3B1bGwvMTcxMlxuICpcbiAqIEBwYXJhbSB7SW50ZXJmYWNlR3VhcmR9IGludGVyZmFjZUd1YXJkXG4gKiBAcmV0dXJucyB7SW50ZXJmYWNlR3VhcmRQYXlsb2FkfVxuICovXG5jb25zdCAgICAgICAgZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkPShpbnRlcmZhY2VHdWFyZCk9PntcbmFzc2VydEludGVyZmFjZUd1YXJkKGludGVyZmFjZUd1YXJkKTtcbmNvbnN0e2tsYXNzOl8sLi4ucGF5bG9hZH09aW50ZXJmYWNlR3VhcmQ7XG4vKiogQHR5cGUge0ludGVyZmFjZUd1YXJkUGF5bG9hZH0gKi9cbnJldHVybiBwYXlsb2FkO1xuIH07JGjigI1fb25jZS5nZXRJbnRlcmZhY2VHdWFyZFBheWxvYWQoZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkKTtcbmhhcmRlbihnZXRJbnRlcmZhY2VHdWFyZFBheWxvYWQpO1xuXG5jb25zdCBlbXB0eUNvcHlNYXA9bWFrZUNvcHlNYXAoW10pO1xuXG4vKipcbiAqIEBwYXJhbSB7SW50ZXJmYWNlR3VhcmR9IGludGVyZmFjZUd1YXJkXG4gKiBAcmV0dXJucyB7KHN0cmluZyB8IHN5bWJvbClbXX1cbiAqL1xuY29uc3QgICAgICAgIGdldEludGVyZmFjZU1ldGhvZEtleXM9KGludGVyZmFjZUd1YXJkKT0+e1xuY29uc3R7bWV0aG9kR3VhcmRzLHN5bWJvbE1ldGhvZEd1YXJkcz1lbXB0eUNvcHlNYXB9PVxuZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkKGludGVyZmFjZUd1YXJkKTtcbi8qKiBAdHlwZSB7KHN0cmluZyB8IHN5bWJvbClbXX0gKi9cbi8qIEB0cy1leHBlY3QtZXJyb3IgaW5mZXJlbmNlIGlzIHRvbyB3ZWFrIHRvIHNlZSB0aGlzIGlzIG9rKi9cbnJldHVybiBoYXJkZW4oW1xuLi4uUmVmbGVjdC5vd25LZXlzKG1ldGhvZEd1YXJkcyksXG4uLi5nZXRDb3B5TWFwS2V5cyhzeW1ib2xNZXRob2RHdWFyZHMpXSk7XG5cbiB9OyRo4oCNX29uY2UuZ2V0SW50ZXJmYWNlTWV0aG9kS2V5cyhnZXRJbnRlcmZhY2VNZXRob2RLZXlzKTtcbmhhcmRlbihnZXRJbnRlcmZhY2VNZXRob2RLZXlzKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge1JlY29yZDxQcm9wZXJ0eUtleSwgTWV0aG9kR3VhcmQ+fSBbTSA9IFJlY29yZDxQcm9wZXJ0eUtleSwgTWV0aG9kR3VhcmQ+XVxuICogQHBhcmFtIHtzdHJpbmd9IGludGVyZmFjZU5hbWVcbiAqIEBwYXJhbSB7TX0gbWV0aG9kR3VhcmRzXG4gKiBAcGFyYW0ge3sgc2xvcHB5PzogYm9vbGVhbiB9fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHtJbnRlcmZhY2VHdWFyZDxNPn1cbiAqL1xuY29uc3QgbWFrZUludGVyZmFjZUd1YXJkPShpbnRlcmZhY2VOYW1lLG1ldGhvZEd1YXJkcyxvcHRpb25zPXt9KT0+e1xuY29uc3R7c2xvcHB5PWZhbHNlfT1vcHRpb25zO1xuLyogRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCBzdHJpbmcta2V5ZWQgbWV0aG9kIGd1YXJkcyBhcmUgcmVwcmVzZW50ZWQgaW4qL1xuLyogYSBDb3B5UmVjb3JkLiBCdXQgc3ltYm9sLWtleWVkIG1ldGhvZHMgY2Fubm90IGJlLCBzbyB3ZSBwdXQgdGhvc2UgaW4gYSovXG4vKiBDb3B5TWFwIHdoZW4gcHJlc2VudC4qL1xuLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBNZXRob2RHdWFyZD59ICovXG5jb25zdCBzdHJpbmdNZXRob2RHdWFyZHM9e307XG4vKiogQHR5cGUge0FycmF5PFtzeW1ib2wsIE1ldGhvZEd1YXJkXT59ICovXG5jb25zdCBzeW1ib2xNZXRob2RHdWFyZHNFbnRyaWVzPVtdO1xuZm9yKGNvbnN0IGtleSBvZiBvd25LZXlzKG1ldGhvZEd1YXJkcykpe1xuY29uc3QgdmFsdWU9bWV0aG9kR3VhcmRzWy8qKiBAdHlwZSB7c3RyaW5nfSAqL2tleV07XG5pZih0eXBlb2Yga2V5PT09J3N5bWJvbCcpe1xuc3ltYm9sTWV0aG9kR3VhcmRzRW50cmllcy5wdXNoKFtrZXksdmFsdWVdKTtcbiB9ZWxzZXtcbnN0cmluZ01ldGhvZEd1YXJkc1trZXldPXZhbHVlO1xuIH1cbiB9XG5jb25zdCByZXN1bHQ9aGFyZGVuKHtcbmtsYXNzOidJbnRlcmZhY2UnLFxuaW50ZXJmYWNlTmFtZSxcbm1ldGhvZEd1YXJkczpzdHJpbmdNZXRob2RHdWFyZHMsXG4uLi4oc3ltYm9sTWV0aG9kR3VhcmRzRW50cmllcy5sZW5ndGg/XG57c3ltYm9sTWV0aG9kR3VhcmRzOm1ha2VDb3B5TWFwKHN5bWJvbE1ldGhvZEd1YXJkc0VudHJpZXMpfTpcbnt9KSxcbnNsb3BweX0pO1xuXG5hc3NlcnRJbnRlcmZhY2VHdWFyZChyZXN1bHQpO1xucmV0dXJuICgvKiogQHR5cGUge0ludGVyZmFjZUd1YXJkPE0+fSAqL3Jlc3VsdCk7XG4gfTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWZhdWx0TGltaXRzIjpbImRlZmF1bHRMaW1pdHMiXSwiY2hlY2tNYXRjaGVzIjpbImNoZWNrTWF0Y2hlcyJdLCJtYXRjaGVzIjpbIm1hdGNoZXMiXSwibXVzdE1hdGNoIjpbIm11c3RNYXRjaCJdLCJhc3NlcnRQYXR0ZXJuIjpbImFzc2VydFBhdHRlcm4iXSwiaXNQYXR0ZXJuIjpbImlzUGF0dGVybiJdLCJnZXRSYW5rQ292ZXIiOlsiZ2V0UmFua0NvdmVyIl0sIk0iOlsiTSJdLCJpc0F3YWl0QXJnR3VhcmQiOlsiaXNBd2FpdEFyZ0d1YXJkIl0sImFzc2VydEF3YWl0QXJnR3VhcmQiOlsiYXNzZXJ0QXdhaXRBcmdHdWFyZCJdLCJnZXRBd2FpdEFyZ0d1YXJkUGF5bG9hZCI6WyJnZXRBd2FpdEFyZ0d1YXJkUGF5bG9hZCJdLCJhc3NlcnRNZXRob2RHdWFyZCI6WyJhc3NlcnRNZXRob2RHdWFyZCJdLCJnZXRNZXRob2RHdWFyZFBheWxvYWQiOlsiZ2V0TWV0aG9kR3VhcmRQYXlsb2FkIl0sImFzc2VydEludGVyZmFjZUd1YXJkIjpbImFzc2VydEludGVyZmFjZUd1YXJkIl0sImdldEludGVyZmFjZUd1YXJkUGF5bG9hZCI6WyJnZXRJbnRlcmZhY2VHdWFyZFBheWxvYWQiXSwiZ2V0SW50ZXJmYWNlTWV0aG9kS2V5cyI6WyJnZXRJbnRlcmZhY2VNZXRob2RLZXlzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJgZO7M0AQAANAEAACIAAABAZW5kby9wYXR0ZXJucy12MC4yLjYvc3JjL3R5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAABbdppjtHgAA7R4AACIAAABAZW5kby9wYXR0ZXJucy12MC4yLjYvc3JjL3V0aWxzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAZW5kby9wcm9taXNlLWtpdCJdLCJleHBvcnRzIjpbImFwcGx5TGFiZWxpbmdFcnJvciIsImZyb21VbmlxdWVFbnRyaWVzIiwiaWRlbnRDaGVja2VyIiwibGlzdERpZmZlcmVuY2UiLCJtYWtlQXJyYXlJdGVyYXRvciIsIm1ha2VJdGVyYXRvciIsIm9iamVjdE1hcCIsInRocm93TGFiZWxlZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBFLGlzUHJvbWlzZTskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJpc1Byb21pc2VcIiwgWyRo4oCNX2EgPT4gKGlzUHJvbWlzZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9tYXJzaGFsJykuQ2hlY2tlcn0gQ2hlY2tlciAqL1xuXG5jb25zdHtmcm9tRW50cmllcyxlbnRyaWVzfT1PYmplY3Q7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuXG5jb25zdHtkZXRhaWxzOlgscXVvdGU6cSxGYWlsfT1hc3NlcnQ7XG5cbi8qIFRPRE8gbWlncmF0ZSB0byBwcm9wZXIgaG9tZSovXG4vKiBGcm9tIHRoZSBgYWdvcmljLXNka2AgbW9ub3JlcG8uIE1vdmVkIGhlcmUgdGVtcG9yYXJpbHkgYmVjYXVzZSB0aGUgcGF0dGVybiovXG4vKiBjb2RlIGlzIG1pZ3JhdGVkIGZyb20gYEBhZ29yaWMvc3RvcmVgIHRvIGBAZW5kby9wYXR0ZXJuc2AsIGFuZCBkZXBlbmRzIG9uKi9cbi8qIHRoZSBmdW5jdGlvbmFsaXR5IGluIHRoaXMgZmlsZSwgd2hpY2ggaXMgb3RoZXJ3aXNlIGF2YWlsYWJsZSBvbmx5Ki9cbi8qIHdpdGhpbiB0aGUgYGFnb3JpYy1zZGtgIG1vbm9yZXBvLiovXG5cbi8qKlxuICogVE9ETyBhcyBsb25nIGFzIGBAZW5kby9wYXNzLXN0eWxlYCByZW1haW5zIHRoZSBwcm9wZXIgaG9tZSBvZiB0aGVcbiAqIGBDaGVja2VyYCB0eXBlLCBpdCBwcm9iYWJseSBtYWtlcyBtb3N0IHNlbnNlIHRvIG1vdmUgYGlkZW50Q2hlY2tlcmBcbiAqIGludG8gYEBlbmRvL3Bhc3Mtc3R5bGVgIGFzIHdlbGwuXG4gKlxuICogSW4gdGhlIGBhc3NlcnRGb29gL2Bpc0Zvb2AvYGNoZWNrRm9vYCBwYXR0ZXJuLCBgY2hlY2tGb29gIGhhcyBhIGBjaGVja2BcbiAqIHBhcmFtZXRlciBvZiB0eXBlIGBDaGVja2VyYC4gYGFzc2VydEZvb2AgY2FsbHMgYGNoZWNrRm9vYCBwYXNzZXNcbiAqIGBhc3NlcnRDaGVja2VyYCBhcyB0aGUgYGNoZWNrYCBhcmd1bWVudC4gYGlzRm9vYCBwYXNzZXMgYGlkZW50Q2hlY2tlcmBcbiAqIGFzIHRoZSBgY2hlY2tgIGFyZ3VtZW50LiBgaWRlbnRDaGVja2VyYCBhY3RzIHByZWNpc2VseSBsaWtlIGFuXG4gKiBpZGVudGl0eSBmdW5jdGlvbiwgYnV0IGlzIHR5cGVkIGFzIGEgYENoZWNrZXJgIHRvIGluZGljYXRlIGl0c1xuICogaW50ZW5kZWQgdXNlLlxuICpcbiAqIEB0eXBlIHtDaGVja2VyfVxuICovXG5jb25zdCAgICAgICAgaWRlbnRDaGVja2VyPShjb25kLF9kZXRhaWxzKT0+Y29uZDskaOKAjV9vbmNlLmlkZW50Q2hlY2tlcihpZGVudENoZWNrZXIpO1xuaGFyZGVuKGlkZW50Q2hlY2tlcik7XG5cbi8qKlxuICogVGhyb3dzIGlmIG11bHRpcGxlIGVudHJpZXMgdXNlIHRoZSBzYW1lIHByb3BlcnR5IG5hbWUuIE90aGVyd2lzZSBhY3RzXG4gKiBsaWtlIGBPYmplY3QuZnJvbUVudHJpZXNgIGJ1dCBoYXJkZW5zIHRoZSByZXN1bHQuXG4gKiBVc2UgaXQgdG8gcHJvdGVjdCBmcm9tIHByb3BlcnR5IG5hbWVzIGNvbXB1dGVkIGZyb20gdXNlci1wcm92aWRlZCBkYXRhLlxuICpcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEBwYXJhbSB7SXRlcmFibGU8W0ssVl0+fSBhbGxFbnRyaWVzXG4gKiBAcmV0dXJucyB7e1trOiBLXTogVn19XG4gKi9cbmNvbnN0ICAgICAgICBmcm9tVW5pcXVlRW50cmllcz0oYWxsRW50cmllcyk9PntcbmNvbnN0IGVudHJpZXNBcnJheT1bLi4uYWxsRW50cmllc107XG5jb25zdCByZXN1bHQ9aGFyZGVuKGZyb21FbnRyaWVzKGVudHJpZXNBcnJheSkpO1xuaWYob3duS2V5cyhyZXN1bHQpLmxlbmd0aD09PWVudHJpZXNBcnJheS5sZW5ndGgpe1xucmV0dXJuIHJlc3VsdDtcbiB9XG5jb25zdCBuYW1lcz1uZXcgU2V0KCk7XG5mb3IoY29uc3RbbmFtZSxfXW9mIGVudHJpZXNBcnJheSl7XG5pZihuYW1lcy5oYXMobmFtZSkpe1xuRmFpbCBgY29sbGlzaW9uIG9uIHByb3BlcnR5IG5hbWUgJHtxKG5hbWUpfTogJHtlbnRyaWVzQXJyYXl9YDtcbiB9XG5uYW1lcy5hZGQobmFtZSk7XG4gfVxudGhyb3cgRmFpbCBgaW50ZXJuYWw6IGZhaWxlZCB0byBjcmVhdGUgb2JqZWN0IGZyb20gdW5pcXVlIGVudHJpZXNgO1xuIH07JGjigI1fb25jZS5mcm9tVW5pcXVlRW50cmllcyhmcm9tVW5pcXVlRW50cmllcyk7XG5oYXJkZW4oZnJvbVVuaXF1ZUVudHJpZXMpO1xuXG4vKipcbiAqIEJ5IGFuYWxvZ3kgd2l0aCBob3cgYEFycmF5LnByb3RvdHlwZS5tYXBgIHdpbGwgbWFwIHRoZSBlbGVtZW50cyBvZlxuICogYW4gYXJyYXkgdG8gdHJhbnNmb3JtZWQgZWxlbWVudHMgb2YgYW4gYXJyYXkgb2YgdGhlIHNhbWUgc2hhcGUsXG4gKiBgb2JqZWN0TWFwYCB3aWxsIGRvIGxpa2V3aXNlIGZvciB0aGUgc3RyaW5nLW5hbWVkIG93biBlbnVtZXJhYmxlXG4gKiBwcm9wZXJ0aWVzIG9mIGFuIG9iamVjdC5cbiAqXG4gKiBUeXBpY2FsIHVzYWdlIGFwcGxpZXMgYG9iamVjdE1hcGAgdG8gYSBDb3B5UmVjb3JkLCBpLmUuLFxuICogYW4gb2JqZWN0IGZvciB3aGljaCBgcGFzc1N0eWxlT2Yob3JpZ2luYWwpID09PSAnY29weVJlY29yZCdgLiBGb3IgdGhlc2UsXG4gKiBub25lIG9mIHRoZSBmb2xsb3dpbmcgZWRnZSBjYXNlcyBhcmlzZS4gVGhlIHJlc3VsdCB3aWxsIGJlIGEgQ29weVJlY29yZFxuICogd2l0aCBleGFjdGx5IHRoZSBzYW1lIHByb3BlcnR5IG5hbWVzLCB3aG9zZSB2YWx1ZXMgYXJlIHRoZSBtYXBwZWQgZm9ybSBvZlxuICogdGhlIG9yaWdpbmFsJ3MgdmFsdWVzLlxuICpcbiAqIFdoZW4gdGhlIG9yaWdpbmFsIGlzIG5vdCBhIENvcHlSZWNvcmQsIHNvbWUgZWRnZSBjYXNlcyB0byBiZSBhd2FyZSBvZlxuICogICAgKiBObyBtYXR0ZXIgaG93IG11dGFibGUgdGhlIG9yaWdpbmFsIG9iamVjdCwgdGhlIHJldHVybmVkIG9iamVjdCBpc1xuICogICAgICBoYXJkZW5lZC5cbiAqICAgICogT25seSB0aGUgc3RyaW5nLW5hbWVkIGVudW1lcmFibGUgb3duIHByb3BlcnRpZXMgb2YgdGhlIG9yaWdpbmFsXG4gKiAgICAgIGFyZSBtYXBwZWQuIEFsbCBvdGhlciBwcm9wZXJ0aWVzIGFyZSBpZ25vcmVkLlxuICogICAgKiBJZiBhbnkgb2YgdGhlIG9yaWdpbmFsIHByb3BlcnRpZXMgd2VyZSBhY2Nlc3NvcnMsIGBPYmplY3QuZW50cmllc2BcbiAqICAgICAgd2lsbCBjYXVzZSBpdHMgYGdldHRlcmAgdG8gYmUgY2FsbGVkIGFuZCB3aWxsIHVzZSB0aGUgcmVzdWx0aW5nXG4gKiAgICAgIHZhbHVlLlxuICogICAgKiBObyBtYXR0ZXIgd2hldGhlciB0aGUgb3JpZ2luYWwgcHJvcGVydHkgd2FzIGFuIGFjY2Vzc29yLCB3cml0YWJsZSxcbiAqICAgICAgb3IgY29uZmlndXJhYmxlLCBhbGwgdGhlIHByb3BlcnRpZXMgb2YgdGhlIHJldHVybmVkIG9iamVjdCB3aWxsIGJlXG4gKiAgICAgIG5vbi13cml0YWJsZSwgbm9uLWNvbmZpZ3VyYWJsZSwgZGF0YSBwcm9wZXJ0aWVzLlxuICogICAgKiBObyBtYXR0ZXIgd2hhdCB0aGUgb3JpZ2luYWwgb2JqZWN0IG1heSBoYXZlIGluaGVyaXRlZCBmcm9tLCBhbmRcbiAqICAgICAgbm8gbWF0dGVyIHdoZXRoZXIgaXQgd2FzIGEgc3BlY2lhbCBraW5kIG9mIG9iamVjdCBzdWNoIGFzIGFuIGFycmF5LFxuICogICAgICB0aGUgcmV0dXJuZWQgb2JqZWN0IHdpbGwgYWx3YXlzIGJlIGEgcGxhaW4gb2JqZWN0IGluaGVyaXRpbmcgZGlyZWN0bHlcbiAqICAgICAgZnJvbSBgT2JqZWN0LnByb3RvdHlwZWAgYW5kIHdob3NlIHN0YXRlIGlzIG9ubHkgdGhlc2UgbmV3IG1hcHBlZFxuICogICAgICBvd24gcHJvcGVydGllcy5cbiAqXG4gKiBXaXRoIHRoZXNlIGRpZmZlcmVuY2VzLCBldmVuIGlmIHRoZSBvcmlnaW5hbCBvYmplY3Qgd2FzIG5vdCBhIENvcHlSZWNvcmQsXG4gKiBpZiBhbGwgdGhlIG1hcHBlZCB2YWx1ZXMgYXJlIFBhc3NhYmxlLCB0aGVuIHRoZSByZXR1cm5lZCBvYmplY3Qgd2lsbCBiZVxuICogYSBDb3B5UmVjb3JkLlxuICpcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPHN0cmluZywgYW55Pn0gT1xuICogQHBhcmFtIHtPfSBvcmlnaW5hbFxuICogQHRlbXBsYXRlIFIgbWFwIHJlc3VsdFxuICogQHBhcmFtIHsodmFsdWU6IE9ba2V5b2YgT10sIGtleToga2V5b2YgTykgPT4gUn0gbWFwRm5cbiAqIEByZXR1cm5zIHt7IFtQIGluIGtleW9mIE9dOiBSfX1cbiAqL1xuY29uc3QgICAgICAgIG9iamVjdE1hcD0ob3JpZ2luYWwsbWFwRm4pPT57XG5jb25zdCBlbnRzPWVudHJpZXMob3JpZ2luYWwpO1xuY29uc3QgbWFwRW50cz1lbnRzLm1hcCgoW2ssdl0pPT5bayxtYXBGbih2LGspXSk7XG5yZXR1cm4gaGFyZGVuKGZyb21FbnRyaWVzKG1hcEVudHMpKTtcbiB9OyRo4oCNX29uY2Uub2JqZWN0TWFwKG9iamVjdE1hcCk7XG5oYXJkZW4ob2JqZWN0TWFwKTtcblxuLyoqXG4gKlxuICogQHBhcmFtIHtBcnJheTxzdHJpbmcgfCBzeW1ib2w+fSBsZWZ0TmFtZXNcbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nIHwgc3ltYm9sPn0gcmlnaHROYW1lc1xuICovXG5jb25zdCAgICAgICAgbGlzdERpZmZlcmVuY2U9KGxlZnROYW1lcyxyaWdodE5hbWVzKT0+e1xuY29uc3QgcmlnaHRTZXQ9bmV3IFNldChyaWdodE5hbWVzKTtcbnJldHVybiBsZWZ0TmFtZXMuZmlsdGVyKChuYW1lKT0+IXJpZ2h0U2V0LmhhcyhuYW1lKSk7XG4gfTskaOKAjV9vbmNlLmxpc3REaWZmZXJlbmNlKGxpc3REaWZmZXJlbmNlKTtcbmhhcmRlbihsaXN0RGlmZmVyZW5jZSk7XG5cbi8qKlxuICogQHBhcmFtIHtFcnJvcn0gaW5uZXJFcnJcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gbGFiZWxcbiAqIEBwYXJhbSB7RXJyb3JDb25zdHJ1Y3Rvcj19IEVycm9yQ29uc3RydWN0b3JcbiAqIEByZXR1cm5zIHtuZXZlcn1cbiAqL1xuXG4vKiBFdmFkZSBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vaXNzdWVzLzE0NTAgdXNpbmcgYmxhbmsgbGluZSovXG5jb25zdCAgICAgICAgdGhyb3dMYWJlbGVkPShpbm5lckVycixsYWJlbCxFcnJvckNvbnN0cnVjdG9yPXVuZGVmaW5lZCk9PntcbmlmKHR5cGVvZiBsYWJlbD09PSdudW1iZXInKXtcbmxhYmVsPSBgWyR7bGFiZWx9XWA7XG4gfVxuY29uc3Qgb3V0ZXJFcnI9YXNzZXJ0LmVycm9yKFxuIGAke2xhYmVsfTogJHtpbm5lckVyci5tZXNzYWdlfWAsXG5FcnJvckNvbnN0cnVjdG9yKTtcblxuYXNzZXJ0Lm5vdGUob3V0ZXJFcnIsWCBgQ2F1c2VkIGJ5ICR7aW5uZXJFcnJ9YCk7XG50aHJvdyBvdXRlckVycjtcbiB9OyRo4oCNX29uY2UudGhyb3dMYWJlbGVkKHRocm93TGFiZWxlZCk7XG5oYXJkZW4odGhyb3dMYWJlbGVkKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgQSxSXG4gKiBAcGFyYW0geyguLi5hcmdzOiBBW10pID0+IFJ9IGZ1bmNcbiAqIEBwYXJhbSB7QVtdfSBhcmdzXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IFtsYWJlbF1cbiAqIEByZXR1cm5zIHtSfVxuICovXG5jb25zdCAgICAgICAgYXBwbHlMYWJlbGluZ0Vycm9yPShmdW5jLGFyZ3MsbGFiZWw9dW5kZWZpbmVkKT0+e1xuaWYobGFiZWw9PT11bmRlZmluZWQpe1xucmV0dXJuIGZ1bmMoLi4uYXJncyk7XG4gfVxubGV0IHJlc3VsdDtcbnRyeXtcbnJlc3VsdD1mdW5jKC4uLmFyZ3MpO1xuIH1jYXRjaChlcnIpe1xudGhyb3dMYWJlbGVkKGVycixsYWJlbCk7XG4gfVxuaWYoaXNQcm9taXNlKHJlc3VsdCkpe1xuLyogQHRzLWV4cGVjdC1lcnJvciBJZiByZXN1bHQgaXMgYSByZWplY3RlZCBwcm9taXNlLCB0aGlzIHdpbGwqL1xuLyogcmV0dXJuIGEgcHJvbWlzZSB3aXRoIGEgZGlmZmVyZW50IHJlamVjdGlvbiByZWFzb24uIEJ1dCB0aGlzKi9cbi8qIGNvbmZ1c2VzIFR5cGVTY3JpcHQgYmVjYXVzZSBpdCB0eXBlcyB0aGF0IGNhc2UgYXMgYFByb21pc2U8bmV2ZXI+YCovXG4vKiB3aGljaCBpcyBjb29sIGZvciBhIHByb21pc2UgdGhhdCB3aWxsIG5ldmVyIGZ1bGZsbC4qL1xuLyogQnV0IFR5cGVTY3JpcHQgZG9lc24ndCB1bmRlcnN0YW5kIHRoYXQgdGhpcyB3aWxsIG9ubHkgaGFwcGVuKi9cbi8qIHdoZW4gYHJlc3VsdGAgd2FzIGEgcmVqZWN0ZWQgcHJvbWlzZS4gSW4gb25seSB0aGlzIGNhc2UgYFJgKi9cbi8qIHNob3VsZCBhbHJlYWR5IGFsbG93IGBQcm9taXNlPG5ldmVyPmAgYXMgYSBzdWJ0eXBlLiovXG5yZXR1cm4gRS53aGVuKHJlc3VsdCx1bmRlZmluZWQsKHJlYXNvbik9PnRocm93TGFiZWxlZChyZWFzb24sbGFiZWwpKTtcbiB9ZWxzZXtcbnJldHVybiByZXN1bHQ7XG4gfVxuIH07JGjigI1fb25jZS5hcHBseUxhYmVsaW5nRXJyb3IoYXBwbHlMYWJlbGluZ0Vycm9yKTtcbmhhcmRlbihhcHBseUxhYmVsaW5nRXJyb3IpO1xuXG4vKipcbiAqIE1ha2VzIGEgb25lLXNob3QgaXRlcmFibGUgaXRlcmF0b3IgZnJvbSBhIHByb3ZpZGVkIGBuZXh0YCBmdW5jdGlvbi5cbiAqXG4gKiBAdGVtcGxhdGUgW1Q9dW5rbm93bl1cbiAqIEBwYXJhbSB7KCkgPT4gSXRlcmF0b3JSZXN1bHQ8VD59IG5leHRcbiAqIEByZXR1cm5zIHtJdGVyYWJsZUl0ZXJhdG9yPFQ+fVxuICovXG5jb25zdCAgICAgICAgbWFrZUl0ZXJhdG9yPShuZXh0KT0+e1xuY29uc3QgaXRlcj1oYXJkZW4oe1xuW1N5bWJvbC5pdGVyYXRvcl06KCk9Pml0ZXIsXG5uZXh0fSk7XG5cbnJldHVybiBpdGVyO1xuIH07JGjigI1fb25jZS5tYWtlSXRlcmF0b3IobWFrZUl0ZXJhdG9yKTtcbmhhcmRlbihtYWtlSXRlcmF0b3IpO1xuXG4vKipcbiAqIEEgYGhhcmRlbmBpbmcgYW5hbG9nIG9mIEFycmF5LnByb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdLlxuICpcbiAqIEB0ZW1wbGF0ZSBbVD11bmtub3duXVxuICogQHBhcmFtIHtBcnJheTxUPn0gYXJyXG4gKiBAcmV0dXJucyB7SXRlcmFibGVJdGVyYXRvcjxUPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VBcnJheUl0ZXJhdG9yPShhcnIpPT57XG5jb25zdHtsZW5ndGh9PWFycjtcbmxldCBpPTA7XG5yZXR1cm4gbWFrZUl0ZXJhdG9yKCgpPT57XG4vKiogQHR5cGUge1R9ICovXG5sZXQgdmFsdWU7XG5pZihpPGxlbmd0aCl7XG52YWx1ZT1hcnJbaV07XG5pKz0xO1xucmV0dXJuIGhhcmRlbih7ZG9uZTpmYWxzZSx2YWx1ZX0pO1xuIH1cbi8qIEB0cy1leHBlY3QtZXJyb3IgVGhlIHRlcm1pbmFsIHZhbHVlIGRvZXNuJ3QgbWF0dGVyKi9cbnJldHVybiBoYXJkZW4oe2RvbmU6dHJ1ZSx2YWx1ZX0pO1xuIH0pO1xuIH07JGjigI1fb25jZS5tYWtlQXJyYXlJdGVyYXRvcihtYWtlQXJyYXlJdGVyYXRvcik7XG5oYXJkZW4obWFrZUFycmF5SXRlcmF0b3IpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlkZW50Q2hlY2tlciI6WyJpZGVudENoZWNrZXIiXSwiZnJvbVVuaXF1ZUVudHJpZXMiOlsiZnJvbVVuaXF1ZUVudHJpZXMiXSwib2JqZWN0TWFwIjpbIm9iamVjdE1hcCJdLCJsaXN0RGlmZmVyZW5jZSI6WyJsaXN0RGlmZmVyZW5jZSJdLCJ0aHJvd0xhYmVsZWQiOlsidGhyb3dMYWJlbGVkIl0sImFwcGx5TGFiZWxpbmdFcnJvciI6WyJhcHBseUxhYmVsaW5nRXJyb3IiXSwibWFrZUl0ZXJhdG9yIjpbIm1ha2VJdGVyYXRvciJdLCJtYWtlQXJyYXlJdGVyYXRvciI6WyJtYWtlQXJyYXlJdGVyYXRvciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAABwljLcAkAAHAJAAAiAAAAQGVuZG8vcHJvbWlzZS1raXQtdjAuMi42MC9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3NyYy9wcm9taXNlLWV4ZWN1dG9yLWtpdC5qcyIsIi4vc3JjL21lbW8tcmFjZS5qcyIsIi4vc3JjL2lzLXByb21pc2UuanMiLCIuL3NyYy90eXBlcy5qcyJdLCJleHBvcnRzIjpbIm1ha2VQcm9taXNlS2l0IiwicmFjZVByb21pc2VzIl0sInJlZXhwb3J0cyI6WyIuL3NyYy9pcy1wcm9taXNlLmpzIiwiLi9zcmMvdHlwZXMuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgbWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0LG1lbW9SYWNlOyRo4oCNX2ltcG9ydHMoW1tcIi4vc3JjL3Byb21pc2UtZXhlY3V0b3Ita2l0LmpzXCIsIFtbXCJtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCA9ICRo4oCNX2EpXV1dXSxbXCIuL3NyYy9tZW1vLXJhY2UuanNcIiwgW1tcIm1lbW9SYWNlXCIsIFskaOKAjV9hID0+IChtZW1vUmFjZSA9ICRo4oCNX2EpXV1dXSxbXCIuL3NyYy9pcy1wcm9taXNlLmpzXCIsIFtdXSxbXCIuL3NyYy90eXBlcy5qc1wiLCBbXV1dKTtPYmplY3QuZGVmaW5lUHJvcGVydHkobWFrZVByb21pc2VLaXQsICduYW1lJywge3ZhbHVlOiBcIm1ha2VQcm9taXNlS2l0XCJ9KTskaOKAjV9vbmNlLm1ha2VQcm9taXNlS2l0KG1ha2VQcm9taXNlS2l0KTtPYmplY3QuZGVmaW5lUHJvcGVydHkocmFjZVByb21pc2VzLCAnbmFtZScsIHt2YWx1ZTogXCJyYWNlUHJvbWlzZXNcIn0pOyRo4oCNX29uY2UucmFjZVByb21pc2VzKHJhY2VQcm9taXNlcyk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZSB7UHJvbWlzZUNvbnN0cnVjdG9yfSAqL1xuY29uc3QgQmVzdFBpcGVsaW5hYmxlUHJvbWlzZT1nbG9iYWxUaGlzLkhhbmRsZWRQcm9taXNlfHxQcm9taXNlO1xuXG4vKipcbiAqIG1ha2VQcm9taXNlS2l0KCkgYnVpbGRzIGEgUHJvbWlzZSBvYmplY3QsIGFuZCByZXR1cm5zIGEgcmVjb3JkXG4gKiBjb250YWluaW5nIHRoZSBwcm9taXNlIGl0c2VsZiwgYXMgd2VsbCBhcyBzZXBhcmF0ZSBmYWNldHMgZm9yIHJlc29sdmluZ1xuICogYW5kIHJlamVjdGluZyBpdC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHJldHVybnMge1hpbXBvcnQoJy4vc3JjL3R5cGVzLmpzJykuUHJvbWlzZUtpdDxUPn1cbiAqL1xuZnVuY3Rpb24gICAgICAgIG1ha2VQcm9taXNlS2l0KCl7XG5jb25zdHtyZXNvbHZlLHJlamVjdCxleGVjdXRvcn09bWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0KCk7XG5cbmNvbnN0IHByb21pc2U9bmV3IEJlc3RQaXBlbGluYWJsZVByb21pc2UoZXhlY3V0b3IpO1xuXG5yZXR1cm4gaGFyZGVuKHtwcm9taXNlLHJlc29sdmUscmVqZWN0fSk7XG4gfVxuaGFyZGVuKG1ha2VQcm9taXNlS2l0KTtcblxuLyogTkI6IEFub3RoZXIgaW1wbGVtZW50YXRpb24gZm9yIFByb21pc2UucmFjZSB3b3VsZCBiZSB0byB1c2UgdGhlIHJlbGVhc2luZyBleGVjdXRvciwqL1xuLyogSG93ZXZlciB3aGlsZSBpdCB3b3VsZCBubyBsb25nZXIgbGVhayB0aGUgcmFjZWQgcHJvbWlzZSBvYmplY3RzIHRoZW1zZWx2ZXMsIGl0IHdvdWxkKi9cbi8qIHN0aWxsIGxlYWsgcmVhY3Rpb25zIG9uIHRoZSBub24tcmVzb2x2ZWQgcHJvbWlzZXMgY29udGVuZGluZyBmb3IgdGhlIHJhY2UuKi9cblxuLyoqXG4gKiBDcmVhdGVzIGEgUHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIG9yIHJlamVjdGVkIHdoZW4gYW55IG9mIHRoZSBwcm92aWRlZCBQcm9taXNlcyBhcmUgcmVzb2x2ZWRcbiAqIG9yIHJlamVjdGVkLlxuICpcbiAqIFVubGlrZSBgUHJvbWlzZS5yYWNlYCBpdCBjbGVhbnMgdXAgYWZ0ZXIgaXRzZWxmIHNvIGEgbm9uLXJlc29sdmVkIHZhbHVlIGRvZXNuJ3QgaG9sZCBvbnRvXG4gKiB0aGUgcmVzdWx0IHByb21pc2UuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7SXRlcmFibGU8VD59IHZhbHVlcyBBbiBpdGVyYWJsZSBvZiBQcm9taXNlcy5cbiAqIEByZXR1cm5zIHtQcm9taXNlPEF3YWl0ZWQ8VD4+fSBBIG5ldyBQcm9taXNlLlxuICovXG5mdW5jdGlvbiAgICAgICAgcmFjZVByb21pc2VzKHZhbHVlcyl7XG5yZXR1cm4gaGFyZGVuKG1lbW9SYWNlLmNhbGwoQmVzdFBpcGVsaW5hYmxlUHJvbWlzZSx2YWx1ZXMpKTtcbiB9XG5oYXJkZW4ocmFjZVByb21pc2VzKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlUHJvbWlzZUtpdCI6WyJtYWtlUHJvbWlzZUtpdCJdLCJyYWNlUHJvbWlzZXMiOlsicmFjZVByb21pc2VzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAIh9gazfAgAA3wIAACsAAABAZW5kby9wcm9taXNlLWtpdC12MC4yLjYwL3NyYy9pcy1wcm9taXNlLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJpc1Byb21pc2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoaXNQcm9taXNlLCAnbmFtZScsIHt2YWx1ZTogXCJpc1Byb21pc2VcIn0pOyRo4oCNX29uY2UuaXNQcm9taXNlKGlzUHJvbWlzZSk7ICAgLyoqXG4gKiBEZXRlcm1pbmUgaWYgdGhlIGFyZ3VtZW50IGlzIGEgUHJvbWlzZS5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IG1heWJlUHJvbWlzZSBUaGUgdmFsdWUgdG8gZXhhbWluZVxuICogQHJldHVybnMge21heWJlUHJvbWlzZSBpcyBQcm9taXNlfSBXaGV0aGVyIGl0IGlzIGEgcHJvbWlzZVxuICovXG5mdW5jdGlvbiAgICAgICAgaXNQcm9taXNlKG1heWJlUHJvbWlzZSl7XG5yZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG1heWJlUHJvbWlzZSk9PT1tYXliZVByb21pc2U7XG4gfVxuaGFyZGVuKGlzUHJvbWlzZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaXNQcm9taXNlIjpbImlzUHJvbWlzZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAdp03rvhIAAL4SAAAqAAAAQGVuZG8vcHJvbWlzZS1raXQtdjAuMi42MC9zcmMvbWVtby1yYWNlLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJtZW1vUmFjZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qIEluaXRpYWwgdmVyc2lvbiBhdXRob3JlZCBieSBCcmlhbiBLaW06XG5odHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUvaXNzdWVzLzE3NDY5I2lzc3VlY29tbWVudC02ODUyMTY3NzdcbiBUaGlzIGlzIGZyZWUgYW5kIHVuZW5jdW1iZXJlZCBzb2Z0d2FyZSByZWxlYXNlZCBpbnRvIHRoZSBwdWJsaWMgZG9tYWluLlxuIEFueW9uZSBpcyBmcmVlIHRvIGNvcHksIG1vZGlmeSwgcHVibGlzaCwgdXNlLCBjb21waWxlLCBzZWxsLCBvclxuZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLCBlaXRoZXIgaW4gc291cmNlIGNvZGUgZm9ybSBvciBhcyBhIGNvbXBpbGVkXG5iaW5hcnksIGZvciBhbnkgcHVycG9zZSwgY29tbWVyY2lhbCBvciBub24tY29tbWVyY2lhbCwgYW5kIGJ5IGFueVxubWVhbnMuXG4gSW4ganVyaXNkaWN0aW9ucyB0aGF0IHJlY29nbml6ZSBjb3B5cmlnaHQgbGF3cywgdGhlIGF1dGhvciBvciBhdXRob3JzXG5vZiB0aGlzIHNvZnR3YXJlIGRlZGljYXRlIGFueSBhbmQgYWxsIGNvcHlyaWdodCBpbnRlcmVzdCBpbiB0aGVcbnNvZnR3YXJlIHRvIHRoZSBwdWJsaWMgZG9tYWluLiBXZSBtYWtlIHRoaXMgZGVkaWNhdGlvbiBmb3IgdGhlIGJlbmVmaXRcbm9mIHRoZSBwdWJsaWMgYXQgbGFyZ2UgYW5kIHRvIHRoZSBkZXRyaW1lbnQgb2Ygb3VyIGhlaXJzIGFuZFxuc3VjY2Vzc29ycy4gV2UgaW50ZW5kIHRoaXMgZGVkaWNhdGlvbiB0byBiZSBhbiBvdmVydCBhY3Qgb2ZcbnJlbGlucXVpc2htZW50IGluIHBlcnBldHVpdHkgb2YgYWxsIHByZXNlbnQgYW5kIGZ1dHVyZSByaWdodHMgdG8gdGhpc1xuc29mdHdhcmUgdW5kZXIgY29weXJpZ2h0IGxhdy5cbiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELFxuRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG5NRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuXG5JTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUlxuT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsXG5BUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1Jcbk9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cbiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIHJlZmVyIHRvIDxodHRwOi8vdW5saWNlbnNlLm9yZy8+XG4qL1xuXG5cblxuXG5cblxuXG5jb25zdCBpc09iamVjdD0odmFsdWUpPT5PYmplY3QodmFsdWUpPT09dmFsdWU7XG5cbi8qKlxuICogQHRlbXBsYXRlIFtUPWFueV1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IERlZmVycmVkXG4gKiBAcHJvcGVydHkgeyh2YWx1ZT86IFhpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkVSZWY8VD4gKSA9PiB2b2lkfSByZXNvbHZlXG4gKiBAcHJvcGVydHkgeyhlcnI/OiBhbnkgKSA9PiB2b2lkfSByZWplY3RcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsgbmV2ZXJcbiAqICB8IHtzZXR0bGVkOiBmYWxzZSwgZGVmZXJyZWRzOiBTZXQ8RGVmZXJyZWQ+fVxuICogIHwge3NldHRsZWQ6IHRydWUsIGRlZmVycmVkcz86IHVuZGVmaW5lZH1cbiAqIH0gUHJvbWlzZU1lbW9SZWNvcmRcbiAqL1xuXG4vKiBLZXlzIGFyZSB0aGUgdmFsdWVzIHBhc3NlZCB0byByYWNlLCB2YWx1ZXMgYXJlIGEgcmVjb3JkIG9mIGRhdGEgY29udGFpbmluZyBhKi9cbi8qIHNldCBvZiBkZWZlcnJlZHMgYW5kIHdoZXRoZXIgdGhlIHZhbHVlIGhhcyBzZXR0bGVkLiovXG4vKiogQHR5cGUge1dlYWtNYXA8b2JqZWN0LCBQcm9taXNlTWVtb1JlY29yZD59ICovXG5jb25zdCBrbm93blByb21pc2VzPW5ldyBXZWFrTWFwKCk7XG5cbi8qKlxuICogQHBhcmFtIHtQcm9taXNlTWVtb1JlY29yZCB8IHVuZGVmaW5lZH0gcmVjb3JkXG4gKiBAcmV0dXJucyB7U2V0PERlZmVycmVkPn1cbiAqL1xuY29uc3QgbWFya1NldHRsZWQ9KHJlY29yZCk9PntcbmlmKCFyZWNvcmR8fHJlY29yZC5zZXR0bGVkKXtcbnJldHVybiBuZXcgU2V0KCk7XG4gfVxuXG5jb25zdHtkZWZlcnJlZHN9PXJlY29yZDtcbk9iamVjdC5hc3NpZ24ocmVjb3JkLHtcbmRlZmVycmVkczp1bmRlZmluZWQsXG5zZXR0bGVkOnRydWV9KTtcblxuT2JqZWN0LmZyZWV6ZShyZWNvcmQpO1xucmV0dXJuIGRlZmVycmVkcztcbiB9O1xuXG4vKipcbiAqXG4gKiBAcGFyYW0ge2FueX0gdmFsdWVcbiAqIEByZXR1cm5zIHtQcm9taXNlTWVtb1JlY29yZH1cbiAqL1xuY29uc3QgZ2V0TWVtb1JlY29yZD0odmFsdWUpPT57XG5pZighaXNPYmplY3QodmFsdWUpKXtcbi8qIElmIHRoZSBjb250ZW5kZXIgaXMgYSBwcmltaXRpdmUsIGF0dGVtcHRpbmcgdG8gdXNlIGl0IGFzIGEga2V5IGluIHRoZSovXG4vKiB3ZWFrbWFwIHdvdWxkIHRocm93IGFuIGVycm9yLiBMdWNraWx5LCBpdCBpcyBzYWZlIHRvIGNhbGwqL1xuLyogYFByb21pc2UucmVzb2x2ZShjb250ZW5kZXIpLnRoZW5gIG9uIGEgcHJpbWl0aXZlIHZhbHVlIG11bHRpcGxlIHRpbWVzKi9cbi8qIGJlY2F1c2UgdGhlIHByb21pc2UgZnVsZmlsbHMgaW1tZWRpYXRlbHkuIFNvIHdlIGZha2UgYSBzZXR0bGVkIHJlY29yZC4qL1xucmV0dXJuIGhhcmRlbih7c2V0dGxlZDp0cnVlfSk7XG4gfVxuXG5sZXQgcmVjb3JkPWtub3duUHJvbWlzZXMuZ2V0KHZhbHVlKTtcblxuaWYoIXJlY29yZCl7XG5yZWNvcmQ9e2RlZmVycmVkczpuZXcgU2V0KCksc2V0dGxlZDpmYWxzZX07XG5rbm93blByb21pc2VzLnNldCh2YWx1ZSxyZWNvcmQpO1xuLyogVGhpcyBjYWxsIHRvIGB0aGVuYCBoYXBwZW5zIG9uY2UgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUgdmFsdWUuKi9cblByb21pc2UucmVzb2x2ZSh2YWx1ZSkudGhlbihcbih2YWwpPT57XG5mb3IoY29uc3R7cmVzb2x2ZX1vZiBtYXJrU2V0dGxlZChyZWNvcmQpKXtcbnJlc29sdmUodmFsKTtcbiB9XG4gfSxcbihlcnIpPT57XG5mb3IoY29uc3R7cmVqZWN0fW9mIG1hcmtTZXR0bGVkKHJlY29yZCkpe1xucmVqZWN0KGVycik7XG4gfVxuIH0pO1xuXG4gfVxucmV0dXJuIHJlY29yZDtcbiB9O1xuXG5jb25zdHtyYWNlfT17XG4vKipcbiAqIENyZWF0ZXMgYSBQcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgb3IgcmVqZWN0ZWQgd2hlbiBhbnkgb2YgdGhlIHByb3ZpZGVkIFByb21pc2VzIGFyZSByZXNvbHZlZFxuICogb3IgcmVqZWN0ZWQuXG4gKlxuICogVW5saWtlIGBQcm9taXNlLnJhY2VgIGl0IGNsZWFucyB1cCBhZnRlciBpdHNlbGYgc28gYSBub24tcmVzb2x2ZWQgdmFsdWUgZG9lc24ndCBob2xkIG9udG9cbiAqIHRoZSByZXN1bHQgcHJvbWlzZS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHRlbXBsYXRlIHtQcm9taXNlQ29uc3RydWN0b3J9IFtQPVByb21pc2VDb25zdHJ1Y3Rvcl1cbiAqIEB0aGlzIHtQfVxuICogQHBhcmFtIHtJdGVyYWJsZTxUPn0gdmFsdWVzIEFuIGl0ZXJhYmxlIG9mIFByb21pc2VzLlxuICogQHJldHVybnMge1Byb21pc2U8QXdhaXRlZDxUPj59IEEgbmV3IFByb21pc2UuXG4gKi9cbnJhY2UodmFsdWVzKXtcbmxldCBkZWZlcnJlZDtcbi8qKiBAdHlwZSB7VFtdfSAqL1xuY29uc3QgY2FjaGVkVmFsdWVzPVtdO1xuY29uc3QgQz10aGlzO1xuY29uc3QgcmVzdWx0PW5ldyBDKChyZXNvbHZlLHJlamVjdCk9PntcbmRlZmVycmVkPXtyZXNvbHZlLHJlamVjdH07XG5mb3IoY29uc3QgdmFsdWUgb2YgdmFsdWVzKXtcbmNhY2hlZFZhbHVlcy5wdXNoKHZhbHVlKTtcbmNvbnN0e3NldHRsZWQsZGVmZXJyZWRzfT1nZXRNZW1vUmVjb3JkKHZhbHVlKTtcbmlmKHNldHRsZWQpe1xuLyogSWYgdGhlIGNvbnRlbmRlciBpcyBzZXR0bGVkIChpbmNsdWRpbmcgcHJpbWl0aXZlcyksIGl0IGlzIHNhZmUqL1xuLyogdG8gY2FsbCBgUHJvbWlzZS5yZXNvbHZlKHZhbHVlKS50aGVuYCBvbiBpdC4qL1xuQy5yZXNvbHZlKHZhbHVlKS50aGVuKHJlc29sdmUscmVqZWN0KTtcbiB9ZWxzZXtcbmRlZmVycmVkcy5hZGQoZGVmZXJyZWQpO1xuIH1cbiB9XG4gfSk7XG5cbi8qIFRoZSBmaW5hbGx5IGNhbGxiYWNrIGV4ZWN1dGVzIHdoZW4gYW55IHZhbHVlIHNldHRsZXMsIHByZXZlbnRpbmcgYW55IG9mKi9cbi8qIHRoZSB1bnJlc29sdmVkIHZhbHVlcyBmcm9tIHJldGFpbmluZyBhIHJlZmVyZW5jZSB0byB0aGUgcmVzb2x2ZWQgdmFsdWUuKi9cbnJldHVybiByZXN1bHQuZmluYWxseSgoKT0+e1xuZm9yKGNvbnN0IHZhbHVlIG9mIGNhY2hlZFZhbHVlcyl7XG5jb25zdHtkZWZlcnJlZHN9PWdldE1lbW9SZWNvcmQodmFsdWUpO1xuaWYoZGVmZXJyZWRzKXtcbmRlZmVycmVkcy5kZWxldGUoZGVmZXJyZWQpO1xuIH1cbiB9XG4gfSk7XG4gfX07JGjigI1fb25jZS5yYWNlKHJhY2UpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1lbW9SYWNlIjpbInJhY2UiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA00Ow7mkHAABpBwAANQAAAEBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNjAvc3JjL3Byb21pc2UtZXhlY3V0b3Ita2l0LmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKi8gPHJlZmVyZW5jZSB0eXBlcz1cInNlc1wiLz4qL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAY2FsbGJhY2sgUHJvbWlzZUV4ZWN1dG9yIFRoZSBwcm9taXNlIGV4ZWN1dG9yXG4gKiBAcGFyYW0geyh2YWx1ZTogWGltcG9ydCgnLi90eXBlcy5qcycpLkVSZWY8VD4pID0+IHZvaWR9IHJlc29sdmVcbiAqIEBwYXJhbSB7KHJlYXNvbjogYW55KSA9PiB2b2lkfSByZWplY3RcbiAqL1xuXG4vKipcbiAqIG1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCgpIGJ1aWxkcyByZXNvbHZlL3JlamVjdCBmdW5jdGlvbnMgd2hpY2ggZHJvcCByZWZlcmVuY2VzXG4gKiB0byB0aGUgcmVzb2x2ZS9yZWplY3QgZnVuY3Rpb25zIGdhdGhlcmVkIGZyb20gYW4gZXhlY3V0b3IgdG8gYmUgdXNlZCB3aXRoIGFcbiAqIHByb21pc2UgY29uc3RydWN0b3IuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEByZXR1cm5zIHtQaWNrPFhpbXBvcnQoJy4vdHlwZXMuanMnKS5Qcm9taXNlS2l0PFQ+LCAncmVzb2x2ZScgfCAncmVqZWN0Jz4gJiB7IGV4ZWN1dG9yOiBQcm9taXNlRXhlY3V0b3I8VD59fVxuICovXG5jb25zdCAgICAgICAgbWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0PSgpPT57XG4vKiogQHR5cGUge251bGwgfCB1bmRlZmluZWQgfCAoKHZhbHVlOiBYaW1wb3J0KCcuL3R5cGVzLmpzJykuRVJlZjxUPikgPT4gdm9pZCl9ICovXG5sZXQgaW50ZXJuYWxSZXNvbHZlO1xuLyoqIEB0eXBlIHtudWxsIHwgdW5kZWZpbmVkIHwgKChyZWFzb246IHVua25vd24pID0+IHZvaWQpfSAqL1xubGV0IGludGVybmFsUmVqZWN0O1xuXG4vKiogQHBhcmFtIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuRVJlZjxUPn0gdmFsdWUgKi9cbmNvbnN0IHJlc29sdmU9KHZhbHVlKT0+e1xuaWYoaW50ZXJuYWxSZXNvbHZlKXtcbmludGVybmFsUmVzb2x2ZSh2YWx1ZSk7XG5pbnRlcm5hbFJlc29sdmU9bnVsbDtcbmludGVybmFsUmVqZWN0PW51bGw7XG4gfWVsc2V7XG5hc3NlcnQoaW50ZXJuYWxSZXNvbHZlPT09bnVsbCk7XG4gfVxuIH07XG5cbi8qKiBAcGFyYW0ge3Vua25vd259IHJlYXNvbiAqL1xuY29uc3QgcmVqZWN0PShyZWFzb24pPT57XG5pZihpbnRlcm5hbFJlamVjdCl7XG5pbnRlcm5hbFJlamVjdChyZWFzb24pO1xuaW50ZXJuYWxSZXNvbHZlPW51bGw7XG5pbnRlcm5hbFJlamVjdD1udWxsO1xuIH1lbHNle1xuYXNzZXJ0KGludGVybmFsUmVqZWN0PT09bnVsbCk7XG4gfVxuIH07XG5cbmNvbnN0IGV4ZWN1dG9yPShyZXMscmVqKT0+e1xuYXNzZXJ0KGludGVybmFsUmVzb2x2ZT09PXVuZGVmaW5lZCYmaW50ZXJuYWxSZWplY3Q9PT11bmRlZmluZWQpO1xuaW50ZXJuYWxSZXNvbHZlPXJlcztcbmludGVybmFsUmVqZWN0PXJlajtcbiB9O1xuXG5yZXR1cm4gaGFyZGVuKHtyZXNvbHZlLHJlamVjdCxleGVjdXRvcn0pO1xuIH07JGjigI1fb25jZS5tYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQobWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0KTtcbmhhcmRlbihtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCI6WyJtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAmBk7szQBAAA0AQAAJgAAAEBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNjAvc3JjL3R5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAyuJeT0GAAA9BgAAB0AAABAZW5kby9zdHJlYW0tdjAuMy4yOS9pbmRleC5qc3siaW1wb3J0cyI6WyJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGVuZG8vcHJvbWlzZS1raXQiXSwiZXhwb3J0cyI6WyJtYWtlUGlwZSIsIm1ha2VRdWV1ZSIsIm1ha2VTdHJlYW0iLCJtYXBSZWFkZXIiLCJtYXBXcml0ZXIiLCJwcmltZSIsInB1bXAiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRSxtYWtlUHJvbWlzZUtpdDskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJtYWtlUHJvbWlzZUtpdFwiLCBbJGjigI1fYSA9PiAobWFrZVByb21pc2VLaXQgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHt7XG4gKiAgIHJlc29sdmUodmFsdWU/OiBUIHwgUHJvbWlzZTxUPik6IHZvaWQsXG4gKiAgIHJlamVjdChlcnJvcjogRXJyb3IpOiB2b2lkLFxuICogICBwcm9taXNlOiBQcm9taXNlPFQ+XG4gKiB9fSBQcm9taXNlS2l0XG4gKi9cblxuLyogVHlwZVNjcmlwdCBSZWFkT25seSBzZW1hbnRpY3MgYXJlIG5vdCBzdWZmaWNpZW50bHkgZXhwcmVzc2l2ZSB0byBkaXN0aW5ndWlzaCovXG4vKiBhIHZhbHVlIG9uZSBwcm9taXNlcyBub3QgdG8gYWx0ZXIgZnJvbSBhIHZhbHVlIG9uZSBtdXN0IG5vdCBhbHRlciwqL1xuLyogbWFraW5nIGl0IHVzZWxlc3MuKi9cbmNvbnN0IGZyZWV6ZT0vKiogQHR5cGUgezxUPih2OiBUIHwgUmVhZG9ubHk8VD4pID0+IFR9ICovT2JqZWN0LmZyZWV6ZTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHJldHVybnMge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5Bc3luY1F1ZXVlPFQ+fVxuICovXG5jb25zdCAgICAgICAgbWFrZVF1ZXVlPSgpPT57XG5sZXR7cHJvbWlzZTp0YWlsUHJvbWlzZSxyZXNvbHZlOnRhaWxSZXNvbHZlfT1tYWtlUHJvbWlzZUtpdCgpO1xucmV0dXJue1xucHV0KHZhbHVlKXtcbmNvbnN0e3Jlc29sdmUscHJvbWlzZX09bWFrZVByb21pc2VLaXQoKTtcbnRhaWxSZXNvbHZlKGZyZWV6ZSh7dmFsdWUscHJvbWlzZX0pKTtcbnRhaWxSZXNvbHZlPXJlc29sdmU7XG4gfSxcbmdldCgpe1xuY29uc3QgcHJvbWlzZT10YWlsUHJvbWlzZS50aGVuKChuZXh0KT0+bmV4dC52YWx1ZSk7XG50YWlsUHJvbWlzZT10YWlsUHJvbWlzZS50aGVuKChuZXh0KT0+bmV4dC5wcm9taXNlKTtcbnJldHVybiBoYXJkZW4ocHJvbWlzZSk7XG4gfX07XG5cbiB9OyRo4oCNX29uY2UubWFrZVF1ZXVlKG1ha2VRdWV1ZSk7XG5oYXJkZW4obWFrZVF1ZXVlKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFJlYWRcbiAqIEB0ZW1wbGF0ZSBUV3JpdGVcbiAqIEB0ZW1wbGF0ZSBUUmVhZFJldHVyblxuICogQHRlbXBsYXRlIFRXcml0ZVJldHVyblxuICogQHBhcmFtIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuQXN5bmNRdWV1ZTxJdGVyYXRvclJlc3VsdDxUUmVhZCwgVFJlYWRSZXR1cm4+Pn0gYWNrc1xuICogQHBhcmFtIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuQXN5bmNRdWV1ZTxJdGVyYXRvclJlc3VsdDxUV3JpdGUsIFRXcml0ZVJldHVybj4+fSBkYXRhXG4gKi9cbmNvbnN0ICAgICAgICBtYWtlU3RyZWFtPShhY2tzLGRhdGEpPT57XG5jb25zdCBzdHJlYW09aGFyZGVuKHtcbi8qKlxuICogQHBhcmFtIHtUV3JpdGV9IHZhbHVlXG4gKi9cbm5leHQodmFsdWUpe1xuLyogTm90ZSB0aGUgc2hhbGxvdyBmcmVlemUgc2luY2UgdmFsdWUgaXMgbm90IGd1YXJhbnRlZWQgdG8gYmUgZnJlZXphYmxlKi9cbi8qICh0eXBlZCBhcnJheXMgYXJlIG5vdCkuKi9cbmRhdGEucHV0KGZyZWV6ZSh7dmFsdWUsZG9uZTpmYWxzZX0pKTtcbnJldHVybiBhY2tzLmdldCgpO1xuIH0sXG4vKipcbiAqIEBwYXJhbSB7VFdyaXRlUmV0dXJufSB2YWx1ZVxuICovXG5yZXR1cm4odmFsdWUpe1xuZGF0YS5wdXQoZnJlZXplKHt2YWx1ZSxkb25lOnRydWV9KSk7XG5yZXR1cm4gYWNrcy5nZXQoKTtcbiB9LFxuLyoqXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJvclxuICovXG50aHJvdyhlcnJvcil7XG5kYXRhLnB1dChoYXJkZW4oUHJvbWlzZS5yZWplY3QoZXJyb3IpKSk7XG5yZXR1cm4gYWNrcy5nZXQoKTtcbiB9LFxuW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpe1xucmV0dXJuIHN0cmVhbTtcbiB9fSk7XG5cbnJldHVybiBzdHJlYW07XG4gfTskaOKAjV9vbmNlLm1ha2VTdHJlYW0obWFrZVN0cmVhbSk7XG5oYXJkZW4obWFrZVN0cmVhbSk7XG5cbi8qIEpTRG9jIFR5cGVTY3JpcHQgc2VlbXMgdW5hYmxlIHRvIGV4cHJlc3MgdGhpcyBwYXJ0aWN1bGFyIGZ1bmN0aW9uJ3MqL1xuLyogZW50YW5nbGVtZW50IG9mIHF1ZXVlcywgYnV0IHRoZSBkZWZpbml0aW9uIGluIHR5cGVzLmQudHMgd29ya3MgZm9yIHRoZSBlbmQqL1xuLyogdXNlci4qL1xuY29uc3QgICAgICAgIG1ha2VQaXBlPSgpPT57XG5jb25zdCBkYXRhPW1ha2VRdWV1ZSgpO1xuY29uc3QgYWNrcz1tYWtlUXVldWUoKTtcbmNvbnN0IHJlYWRlcj1tYWtlU3RyZWFtKGFja3MsZGF0YSk7XG5jb25zdCB3cml0ZXI9bWFrZVN0cmVhbShkYXRhLGFja3MpO1xucmV0dXJuIGhhcmRlbihbd3JpdGVyLHJlYWRlcl0pO1xuIH07JGjigI1fb25jZS5tYWtlUGlwZShtYWtlUGlwZSk7XG5oYXJkZW4obWFrZVBpcGUpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUUmVhZFxuICogQHRlbXBsYXRlIFRXcml0ZVxuICogQHRlbXBsYXRlIFRSZWFkUmV0dXJuXG4gKiBAdGVtcGxhdGUgVFdyaXRlUmV0dXJuXG4gKiBAcGFyYW0ge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5TdHJlYW08VFdyaXRlLCBUUmVhZCwgVFdyaXRlUmV0dXJuLCBUUmVhZFJldHVybj59IHdyaXRlclxuICogQHBhcmFtIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuU3RyZWFtPFRSZWFkLCBUV3JpdGUsIFRSZWFkUmV0dXJuLCBUV3JpdGVSZXR1cm4+fSByZWFkZXJcbiAqIEBwYXJhbSB7VFdyaXRlfSBwcmltZXJcbiAqL1xuY29uc3QgICAgICAgIHB1bXA9YXN5bmMod3JpdGVyLHJlYWRlcixwcmltZXIpPT57XG4vKiogQHBhcmFtIHtQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PFRSZWFkLCBUUmVhZFJldHVybj4+fSBwcm9taXNlICovXG5jb25zdCB0aWNrPShwcm9taXNlKT0+XG5FLndoZW4oXG5wcm9taXNlLFxuKHJlc3VsdCk9PntcbmlmKHJlc3VsdC5kb25lKXtcbnJldHVybiB3cml0ZXIucmV0dXJuKHJlc3VsdC52YWx1ZSk7XG4gfWVsc2V7XG4vKiBCZWhvbGQ6IG11dHVhbCByZWN1cnNpb24uKi9cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5yZXR1cm4gdG9jayh3cml0ZXIubmV4dChyZXN1bHQudmFsdWUpKTtcbiB9XG4gfSxcbigvKiogQHR5cGUge0Vycm9yfSAqL2Vycm9yKT0+e1xucmV0dXJuIHdyaXRlci50aHJvdyhlcnJvcik7XG4gfSk7XG5cbi8qKiBAcGFyYW0ge1Byb21pc2U8SXRlcmF0b3JSZXN1bHQ8VFdyaXRlLCBUV3JpdGVSZXR1cm4+Pn0gcHJvbWlzZSAqL1xuY29uc3QgdG9jaz0ocHJvbWlzZSk9PlxuRS53aGVuKFxucHJvbWlzZSxcbihyZXN1bHQpPT57XG5pZihyZXN1bHQuZG9uZSl7XG5yZXR1cm4gcmVhZGVyLnJldHVybihyZXN1bHQudmFsdWUpO1xuIH1lbHNle1xucmV0dXJuIHRpY2socmVhZGVyLm5leHQocmVzdWx0LnZhbHVlKSk7XG4gfVxuIH0sXG4oLyoqIEB0eXBlIHtFcnJvcn0gKi9lcnJvcik9PntcbnJldHVybiByZWFkZXIudGhyb3coZXJyb3IpO1xuIH0pO1xuXG5hd2FpdCB0aWNrKHJlYWRlci5uZXh0KHByaW1lcikpO1xucmV0dXJuIHVuZGVmaW5lZDtcbiB9OyRo4oCNX29uY2UucHVtcChwdW1wKTtcbmhhcmRlbihwdW1wKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFJlYWRcbiAqIEB0ZW1wbGF0ZSBUV3JpdGVcbiAqIEB0ZW1wbGF0ZSBUUmV0dXJuXG4gKiBAcGFyYW0ge0FzeW5jR2VuZXJhdG9yPFRSZWFkLCBUUmV0dXJuLCBUV3JpdGU+fSBnZW5lcmF0b3JcbiAqIEBwYXJhbSB7VFdyaXRlfSBwcmltZXJcbiAqL1xuY29uc3QgICAgICAgIHByaW1lPShnZW5lcmF0b3IscHJpbWVyKT0+e1xuLyogV2UgY2FwdHVyZSB0aGUgZmlyc3QgcmV0dXJuZWQgcHJvbWlzZS4qL1xuY29uc3QgZmlyc3Q9Z2VuZXJhdG9yLm5leHQocHJpbWVyKTtcbi8qKiBAdHlwZSB7SXRlcmF0b3JSZXN1bHQ8VFJlYWQsIFRSZXR1cm4+PX0gKi9cbmxldCByZXN1bHQ7XG5jb25zdCBwcmltZWQ9aGFyZGVuKHtcbi8qKiBAcGFyYW0ge1RXcml0ZX0gdmFsdWUgKi9cbiAgICAgIGFzeW5jIG5leHQodmFsdWUpe1xuaWYocmVzdWx0PT09dW5kZWZpbmVkKXtcbnJlc3VsdD1hd2FpdCBmaXJzdDtcbmlmKHJlc3VsdC5kb25lKXtcbnJldHVybiByZXN1bHQ7XG4gfVxuIH1cbnJldHVybiBnZW5lcmF0b3IubmV4dCh2YWx1ZSk7XG4gfSxcbi8qKiBAcGFyYW0ge1RSZXR1cm59IHZhbHVlICovXG4gICAgICBhc3luYyByZXR1cm4odmFsdWUpe1xuaWYocmVzdWx0PT09dW5kZWZpbmVkKXtcbnJlc3VsdD1hd2FpdCBmaXJzdDtcbmlmKHJlc3VsdC5kb25lKXtcbnJldHVybiByZXN1bHQ7XG4gfVxuIH1cbnJldHVybiBnZW5lcmF0b3IucmV0dXJuKHZhbHVlKTtcbiB9LFxuLyoqIEBwYXJhbSB7RXJyb3J9IGVycm9yICovXG4gICAgICBhc3luYyB0aHJvdyhlcnJvcil7XG5pZihyZXN1bHQ9PT11bmRlZmluZWQpe1xucmVzdWx0PWF3YWl0IGZpcnN0O1xuaWYocmVzdWx0LmRvbmUpe1xudGhyb3cgZXJyb3I7XG4gfVxuIH1cbnJldHVybiBnZW5lcmF0b3IudGhyb3coZXJyb3IpO1xuIH19KTtcblxucmV0dXJuIHByaW1lZDtcbiB9OyRo4oCNX29uY2UucHJpbWUocHJpbWUpO1xuaGFyZGVuKHByaW1lKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVEluXG4gKiBAdGVtcGxhdGUgVE91dFxuICogQHBhcmFtIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUmVhZGVyPFRJbj59IHJlYWRlclxuICogQHBhcmFtIHsodmFsdWU6IFRJbikgPT4gVE91dH0gdHJhbnNmb3JtXG4gKiBAcmV0dXJucyB7WGltcG9ydCgnLi90eXBlcy5qcycpLlJlYWRlcjxUT3V0Pn1cbiAqL1xuY29uc3QgICAgICAgIG1hcFJlYWRlcj0ocmVhZGVyLHRyYW5zZm9ybSk9PntcbmFzeW5jIGZ1bmN0aW9uKnRyYW5zZm9ybUdlbmVyYXRvcigpe1xuZm9yIGF3YWl0KGNvbnN0IHZhbHVlIG9mIHJlYWRlcil7XG55aWVsZCB0cmFuc2Zvcm0odmFsdWUpO1xuIH1cbnJldHVybiB1bmRlZmluZWQ7XG4gfVxucmV0dXJuIGhhcmRlbih0cmFuc2Zvcm1HZW5lcmF0b3IoKSk7XG4gfTskaOKAjV9vbmNlLm1hcFJlYWRlcihtYXBSZWFkZXIpO1xuaGFyZGVuKG1hcFJlYWRlcik7XG5cbi8qKlxuICogQHRlbXBsYXRlIFRJblxuICogQHRlbXBsYXRlIFRPdXRcbiAqIEBwYXJhbSB7WGltcG9ydCgnLi90eXBlcy5qcycpLldyaXRlcjxUT3V0Pn0gd3JpdGVyXG4gKiBAcGFyYW0geyh2YWx1ZTogVEluKSA9PiBUT3V0fSB0cmFuc2Zvcm1cbiAqIEByZXR1cm5zIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuV3JpdGVyPFRJbj59XG4gKi9cbmNvbnN0ICAgICAgICBtYXBXcml0ZXI9KHdyaXRlcix0cmFuc2Zvcm0pPT57XG5jb25zdCB0cmFuc2Zvcm1lZFdyaXRlcj1oYXJkZW4oe1xuLyoqXG4gKiBAcGFyYW0ge1RJbn0gdmFsdWVcbiAqL1xuICAgICAgYXN5bmMgbmV4dCh2YWx1ZSl7XG5yZXR1cm4gd3JpdGVyLm5leHQodHJhbnNmb3JtKHZhbHVlKSk7XG4gfSxcbi8qKlxuICogQHBhcmFtIHtFcnJvcn0gZXJyb3JcbiAqL1xuICAgICAgYXN5bmMgdGhyb3coZXJyb3Ipe1xucmV0dXJuIHdyaXRlci50aHJvdyhlcnJvcik7XG4gfSxcbi8qKlxuICogQHBhcmFtIHt1bmRlZmluZWR9IHZhbHVlXG4gKi9cbiAgICAgIGFzeW5jIHJldHVybih2YWx1ZSl7XG5yZXR1cm4gd3JpdGVyLnJldHVybih2YWx1ZSk7XG4gfSxcbltTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKXtcbnJldHVybiB0cmFuc2Zvcm1lZFdyaXRlcjtcbiB9fSk7XG5cbnJldHVybiB0cmFuc2Zvcm1lZFdyaXRlcjtcbiB9OyRo4oCNX29uY2UubWFwV3JpdGVyKG1hcFdyaXRlcik7XG5oYXJkZW4obWFwV3JpdGVyKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlUXVldWUiOlsibWFrZVF1ZXVlIl0sIm1ha2VTdHJlYW0iOlsibWFrZVN0cmVhbSJdLCJtYWtlUGlwZSI6WyJtYWtlUGlwZSJdLCJwdW1wIjpbInB1bXAiXSwicHJpbWUiOlsicHJpbWUiXSwibWFwUmVhZGVyIjpbIm1hcFJlYWRlciJdLCJtYXBXcml0ZXIiOlsibWFwV3JpdGVyIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAIu6h5KtAQAArQEAABwAAABqZXNzaWUuanMtdjAuMy4yL3NyYy9tYWluLmpzeyJpbXBvcnRzIjpbIi4vcmluZzAvbWFpbi5qcyIsIi4vcmluZzEvbWFpbi5qcyJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbIi4vcmluZzAvbWFpbi5qcyIsIi4vcmluZzEvbWFpbi5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIi4vcmluZzAvbWFpbi5qc1wiLCBbXV0sW1wiLi9yaW5nMS9tYWluLmpzXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACdzxOJXQEAAF0BAAAfAAAAamVzc2llLmpzLXYwLjMuMi9zcmMvcmluZzAvRS5qc3siaW1wb3J0cyI6WyJAZW5kby9mYXIiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6WyJAZW5kby9mYXIiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9mYXJcIiwgW11dXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAPi0yb+pAwAAqQMAACwAAABqZXNzaWUuanMtdjAuMy4yL3NyYy9yaW5nMC9hc3luYy1nZW5lcmF0ZS5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiYXN5bmNHZW5lcmF0ZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qIEB0cy1jaGVjayovXG5cbi8qKlxuICogUmV0dXJuIGFuIGFzeW5jIGl0ZXJhYmxlIHRoYXQgcHJvZHVjZXMgaXRlcmF0b3IgcmVzdWx0cyB2aWEgYG5leHRgLlxuICpcbiAqIFRoaXMgd29ya3MgYXJvdW5kIEplc3NpZSdzIGZvcmJpZGRhbmNlIG9mIFN5bWJvbC5cbiAqXG4gKiBAdGVtcGxhdGUgVCxUUmV0dXJuXG4gKiBAcGFyYW0geygpID0+IEl0ZXJhdG9yUmVzdWx0PFQsIFRSZXR1cm4+IHxcbiAqICAgICAgICAgICAgICAgUHJvbWlzZTxJdGVyYXRvclJlc3VsdDxULCBUUmV0dXJuPj5cbiAqIH0gbmV4dCBwcm9kdWNlIGEgc2luZ2xlLXN0ZXAgaXRlcmF0b3IgcmVzdWx0XG4gKiBAcmV0dXJucyB7QXN5bmNJdGVyYWJsZTxUPn1cbiAqL1xuY29uc3QgICAgICAgIGFzeW5jR2VuZXJhdGU9KG5leHQpPT57XG5yZXR1cm4gaGFyZGVuKHtcbltTeW1ib2wuYXN5bmNJdGVyYXRvcl06KCk9PntcbnJldHVybiBoYXJkZW4oe1xubmV4dDphc3luYygpPT5oYXJkZW4obmV4dCgpKX0pO1xuXG4gfX0pO1xuXG4gfTskaOKAjV9vbmNlLmFzeW5jR2VuZXJhdGUoYXN5bmNHZW5lcmF0ZSk7XG5oYXJkZW4oYXN5bmNHZW5lcmF0ZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYXN5bmNHZW5lcmF0ZSI6WyJhc3luY0dlbmVyYXRlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKCj2XrQAQAA0AEAACIAAABqZXNzaWUuanMtdjAuMy4yL3NyYy9yaW5nMC9tYWluLmpzeyJpbXBvcnRzIjpbIi4vRS5qcyIsIi4vbWFrZXJzLmpzIiwiLi9hc3luYy1nZW5lcmF0ZS5qcyJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbIi4vRS5qcyIsIi4vYXN5bmMtZ2VuZXJhdGUuanMiLCIuL21ha2Vycy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIi4vRS5qc1wiLCBbXV0sW1wiLi9tYWtlcnMuanNcIiwgW11dLFtcIi4vYXN5bmMtZ2VuZXJhdGUuanNcIiwgW11dXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAG+be2LjCAAA4wgAACQAAABqZXNzaWUuanMtdjAuMy4yL3NyYy9yaW5nMC9tYWtlcnMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIm1ha2VNYXAiLCJtYWtlUHJvbWlzZSIsIm1ha2VTZXQiLCJtYWtlV2Vha01hcCIsIm1ha2VXZWFrU2V0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyogQHRzLWNoZWNrKi9cbi8qIFRoZXNlIHdvcmsgYXJvdW5kIEplc3NpZSdzIGZvcmJpZGRhbmNlIG9mIGBuZXdgLiovXG4vKi8gPHJlZmVyZW5jZSB0eXBlcz1cInNlc1wiIC8+Ki9cblxuLyoqIEB0eXBlIHs8VD4oZXhlY3V0b3I6IChyZXNvbHZlOiAodmFsdWU6IFQpID0+IHZvaWQsIHJlamVjdDogKHJlYXNvbj86IGFueSkgPT5cbiAqIHZvaWQpID0+IHZvaWQpID0+IFByb21pc2U8VD59ICovXG5jb25zdCAgICAgICAgbWFrZVByb21pc2U9KGV4ZWN1dG9yKT0+aGFyZGVuKG5ldyBQcm9taXNlKGV4ZWN1dG9yKSk7JGjigI1fb25jZS5tYWtlUHJvbWlzZShtYWtlUHJvbWlzZSk7XG5oYXJkZW4obWFrZVByb21pc2UpO1xuXG4vKiogQHR5cGVkZWYgezxLLCBWPihlbnRyaWVzPzogcmVhZG9ubHkgKHJlYWRvbmx5IFtLLCBWXSlbXSkgPT4gTWFwPEssIFY+fSBNYXBGcm9tRW50cmllcyAqL1xuLyoqIEB0eXBlZGVmIHs8SywgVj4oaXRlcmFibGU6IEl0ZXJhYmxlPHJlYWRvbmx5IFtLLCBWXT4pID0+IE1hcDxLLCBWPn0gTWFwRnJvbUl0ZXJhYmxlICovXG5cbi8qKiBAdHlwZSB7TWFwRnJvbUVudHJpZXMgJiBNYXBGcm9tSXRlcmFibGV9ICovXG5jb25zdCAgICAgICAgbWFrZU1hcD0oZW50cmllc09ySXRlcmFibGUpPT5oYXJkZW4obmV3IE1hcChlbnRyaWVzT3JJdGVyYWJsZSkpOyRo4oCNX29uY2UubWFrZU1hcChtYWtlTWFwKTtcbmhhcmRlbihtYWtlTWFwKTtcblxuLyoqIEB0eXBlZGVmIHs8VD4odmFsdWVzPzogcmVhZG9ubHkgVFtdKSA9PiBTZXQ8VD59IFNldEZyb21WYWx1ZXMgKi9cbi8qKiBAdHlwZWRlZiB7PFQ+KGl0ZXJhYmxlOiBJdGVyYWJsZTxUPikgPT4gU2V0PFQ+fSBTZXRGcm9tSXRlcmFibGUgKi9cbi8qKiBAdHlwZSB7U2V0RnJvbVZhbHVlcyAmIFNldEZyb21JdGVyYWJsZX0gKi9cbmNvbnN0ICAgICAgICBtYWtlU2V0PSh2YWx1ZXMpPT5oYXJkZW4obmV3IFNldCh2YWx1ZXMpKTskaOKAjV9vbmNlLm1ha2VTZXQobWFrZVNldCk7XG5oYXJkZW4obWFrZVNldCk7XG5cbi8qKiBAdHlwZWRlZiB7PEsgZXh0ZW5kcyB7fSwgViA9IGFueT4oZW50cmllcz86IHJlYWRvbmx5IFtLLCBWXVtdIHwgbnVsbCkgPT4gV2Vha01hcDxLLCBWPn0gV2Vha01hcEZyb21FbnRyaWVzICovXG4vKiogQHR5cGVkZWYgezxLIGV4dGVuZHMge30sIFY+KGl0ZXJhYmxlOiBJdGVyYWJsZTxbSywgVl0+KSA9PiBXZWFrTWFwPEssIFY+fSBXZWFrTWFwRnJvbUl0ZXJhYmxlICovXG4vKiogQHR5cGUge1dlYWtNYXBGcm9tRW50cmllcyAmIFdlYWtNYXBGcm9tSXRlcmFibGV9ICovXG5jb25zdCAgICAgICAgbWFrZVdlYWtNYXA9KGVudHJpZXMpPT5oYXJkZW4obmV3IFdlYWtNYXAoZW50cmllcykpOyRo4oCNX29uY2UubWFrZVdlYWtNYXAobWFrZVdlYWtNYXApO1xuaGFyZGVuKG1ha2VXZWFrTWFwKTtcblxuLyoqIEB0eXBlZGVmIHs8VCBleHRlbmRzIHt9Pih2YWx1ZXM/OiByZWFkb25seSBUW10pID0+IFdlYWtTZXQ8VD59IFdlYWtTZXRGcm9tVmFsdWVzICovXG4vKiogQHR5cGVkZWYgezxUIGV4dGVuZHMge30+KGl0ZXJhYmxlOiBJdGVyYWJsZTxUPikgPT4gV2Vha1NldDxUPn0gV2Vha1NldEZyb21JdGVyYWJsZSAqL1xuLyoqIEB0eXBlIHtXZWFrU2V0RnJvbVZhbHVlcyAmIFdlYWtTZXRGcm9tSXRlcmFibGV9ICovXG5jb25zdCAgICAgICAgbWFrZVdlYWtTZXQ9KHZhbHVlcyk9PmhhcmRlbihuZXcgV2Vha1NldCh2YWx1ZXMpKTskaOKAjV9vbmNlLm1ha2VXZWFrU2V0KG1ha2VXZWFrU2V0KTtcbmhhcmRlbihtYWtlV2Vha1NldCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVByb21pc2UiOlsibWFrZVByb21pc2UiXSwibWFrZU1hcCI6WyJtYWtlTWFwIl0sIm1ha2VTZXQiOlsibWFrZVNldCJdLCJtYWtlV2Vha01hcCI6WyJtYWtlV2Vha01hcCJdLCJtYWtlV2Vha1NldCI6WyJtYWtlV2Vha1NldCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAC0LPWY/gQAAP4EAAApAAAAamVzc2llLmpzLXYwLjMuMi9zcmMvcmluZzEvYXN5bmMtdG9vbHMuanN7ImltcG9ydHMiOlsiLi4vcmluZzAvbWFpbi5qcyJdLCJleHBvcnRzIjpbImFzeW5jRG9XaGlsZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBtYWtlUHJvbWlzZTskaOKAjV9pbXBvcnRzKFtbXCIuLi9yaW5nMC9tYWluLmpzXCIsIFtbXCJtYWtlUHJvbWlzZVwiLCBbJGjigI1fYSA9PiAobWFrZVByb21pc2UgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cbi8qKlxuICogUmVzb2x2ZSByZXR1cm5lZCBwcm9taXNlIHdpdGggdW5kZWZpbmVkIHdoZW4gYGJvZHlgIHJldHVybnMgZmFsc3kuXG4gKlxuICogVGhpcyB3b3JrcyBhcm91bmQgSmVzc2llJ3MgZm9yYmlkZGFuY2Ugb2YgYGF3YWl0YCBub3QgYXQgdGhlIGZ1bmN0aW9uLWxldmVsLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0geygpID0+IFQgfCBQcm9taXNlPFQ+fSBib2R5IHBlcmZvcm0gc2lkZS1lZmZlY3RzLCBhbmQgcmV0dXJuIHRydXRoeSBpZlxuICogd2Ugc2hvdWxkIHJ1biBhZ2FpblxuICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gKi9cbmNvbnN0ICAgICAgICBhc3luY0RvV2hpbGU9KGJvZHkpPT57XG5jb25zdCBsb29wPWFzeW5jKHJlc29sdmUscmVqZWN0KT0+e1xuY29uc3QgZG9Db250aW51ZT1hd2FpdCBib2R5KCk7XG5pZighZG9Db250aW51ZSl7XG4vKiBSZXNvbHZlIHRoZSBvdXRlcm1vc3QgcHJvbWlzZS4qL1xucmVzb2x2ZSh1bmRlZmluZWQpO1xucmV0dXJuO1xuIH1cblxuLyogRG8gdGhlIGxvb3AgYWdhaW4uICBXZSBhcmUgY2FyZWZ1bCBub3QgdG8gYXdhaXQgc28gdGhhdCB3ZSBkb24ndCBjcmVhdGUgYSovXG4vKiBwcm9taXNlIGNoYWluLiovXG5sb29wKHJlc29sdmUscmVqZWN0KS5jYXRjaChyZWplY3QpO1xuIH07XG5cbnJldHVybiBtYWtlUHJvbWlzZSgocmVzb2x2ZSxyZWplY3QpPT5sb29wKHJlc29sdmUscmVqZWN0KS5jYXRjaChyZWplY3QpKTtcbiB9OyRo4oCNX29uY2UuYXN5bmNEb1doaWxlKGFzeW5jRG9XaGlsZSk7XG5oYXJkZW4oYXN5bmNEb1doaWxlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJhc3luY0RvV2hpbGUiOlsiYXN5bmNEb1doaWxlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJYTQrJyAQAAcgEAACIAAABqZXNzaWUuanMtdjAuMy4yL3NyYy9yaW5nMS9tYWluLmpzeyJpbXBvcnRzIjpbIi4vYXN5bmMtdG9vbHMuanMiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6WyIuL2FzeW5jLXRvb2xzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbW1wiLi9hc3luYy10b29scy5qc1wiLCBbXV1dKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAQIeAwoAAAAAAAAAAABLzpU2eiMBAHojAQAUAAAAAAAAAAAAAACkgQAAAABjb21wYXJ0bWVudC1tYXAuanNvblBLAQIeAwoAAAAAAAAAAAAIUObC7Q4AAO0OAAAjAAAAAAAAAAAAAACkgawjAQBAYWdvcmljL2Fzc2VydC12MC42LjAvc3JjL2Fzc2VydC5qc1BLAQIeAwoAAAAAAAAAAAAJW/y1aQEAAGkBAAAgAAAAAAAAAAAAAACkgdoyAQBAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAvaGVhcC5qc1BLAQIeAwoAAAAAAAAAAAATrxqB7AoAAOwKAAAkAAAAAAAAAAAAAACkgYE0AQBAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAvc3JjL2hlYXAuanNQSwECHgMKAAAAAAAAAAAAKn6KPpEEAACRBAAAKwAAAAAAAAAAAAAApIGvPwEAQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4wL3NyYy9pcy1wYXNzYWJsZS5qc1BLAQIeAwoAAAAAAAAAAAC/YR9zyQMAAMkDAAAkAAAAAAAAAAAAAACkgYlEAQBAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAvc3JjL2tleXMuanNQSwECHgMKAAAAAAAAAAAAzkg2GcENAADBDQAAKQAAAAAAAAAAAAAApIGUSAEAQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4wL3NyYy9tYWtlLW9uY2UuanNQSwECHgMKAAAAAAAAAAAAq4ojpmwBAABsAQAAIAAAAAAAAAAAAAAApIGcVgEAQGFnb3JpYy9lcnRwLXYwLjE2LjIvZXhwb3J0ZWQuanNQSwECHgMKAAAAAAAAAAAAiD2WJjw3AAA8NwAAJgAAAAAAAAAAAAAApIFGWAEAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL2Ftb3VudE1hdGguanNQSwECHgMKAAAAAAAAAAAAwEtCX9UFAADVBQAAJwAAAAAAAAAAAAAApIHGjwEAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL2Rpc3BsYXlJbmZvLmpzUEsBAh4DCgAAAAAAAAAAAEMwe9zoAQAA6AEAACEAAAAAAAAAAAAAAKSB4JUBAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAAAjsTHpyC8AAMgvAAAlAAAAAAAAAAAAAACkgQeYAQBAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvaXNzdWVyS2l0LmpzUEsBAh4DCgAAAAAAAAAAAE7CGdqtBQAArQUAADoAAAAAAAAAAAAAAKSBEsgBAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9tYXRoSGVscGVycy9jb3B5QmFnTWF0aEhlbHBlcnMuanNQSwECHgMKAAAAAAAAAAAAXCn+PsEFAADBBQAAOgAAAAAAAAAAAAAApIEXzgEAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL21hdGhIZWxwZXJzL2NvcHlTZXRNYXRoSGVscGVycy5qc1BLAQIeAwoAAAAAAAAAAADxAWHrJgYAACYGAAA2AAAAAAAAAAAAAACkgTDUAQBAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvbWF0aEhlbHBlcnMvbmF0TWF0aEhlbHBlcnMuanNQSwECHgMKAAAAAAAAAAAAY0mQ2p8HAACfBwAANgAAAAAAAAAAAAAApIGq2gEAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL21hdGhIZWxwZXJzL3NldE1hdGhIZWxwZXJzLmpzUEsBAh4DCgAAAAAAAAAAAJAGsC+cBQAAnAUAACMAAAAAAAAAAAAAAKSBneIBAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9wYXltZW50LmpzUEsBAh4DCgAAAAAAAAAAAMPKryoSMgAAEjIAACkAAAAAAAAAAAAAAKSBeugBAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9wYXltZW50TGVkZ2VyLmpzUEsBAh4DCgAAAAAAAAAAAOYW4qSyEQAAshEAACEAAAAAAAAAAAAAAKSB0xoCAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9wdXJzZS5qc1BLAQIeAwoAAAAAAAAAAAA+rFNgFAYAABQGAAAtAAAAAAAAAAAAAACkgcQsAgBAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvdHJhbnNpZW50Tm90aWZpZXIuanNQSwECHgMKAAAAAAAAAAAAEnOAkIUnAACFJwAAJgAAAAAAAAAAAAAApIEjMwIAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL3R5cGVHdWFyZHMuanNQSwECHgMKAAAAAAAAAAAA6c8s05E8AACRPAAAKQAAAAAAAAAAAAAApIHsWgIAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL3R5cGVzLWFtYmllbnQuanNQSwECHgMKAAAAAAAAAAAA2Tc6imQpAABkKQAAJwAAAAAAAAAAAAAApIHElwIAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL2NhbGxiYWNrLmpzUEsBAh4DCgAAAAAAAAAAAKqP3UYiBgAAIgYAACUAAAAAAAAAAAAAAKSBbcECAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9jb25maWcuanNQSwECHgMKAAAAAAAAAAAAF8kzgMgEAADIBAAAJAAAAAAAAAAAAAAApIHSxwIAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL2RlYnVnLmpzUEsBAh4DCgAAAAAAAAAAALhz8tZDAgAAQwIAACQAAAAAAAAAAAAAAKSB3MwCAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAADh0rdqKioAACoqAAAvAAAAAAAAAAAAAACkgWHPAgBAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvbGliLWNoYWluU3RvcmFnZS5qc1BLAQIeAwoAAAAAAAAAAACi7siA3hAAAN4QAAArAAAAAAAAAAAAAACkgdj5AgBAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvbWV0aG9kLXRvb2xzLmpzUEsBAh4DCgAAAAAAAAAAAI7ABZJZAwAAWQMAACkAAAAAAAAAAAAAAKSB/woDAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy90eXBlR3VhcmRzLmpzUEsBAh4DCgAAAAAAAAAAAN7GoowrBwAAKwcAACoAAAAAAAAAAAAAAKSBnw4DAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy91cGdyYWRlLWFwaS5qc1BLAQIeAwoAAAAAAAAAAACi6bGS4zwAAOM8AAAkAAAAAAAAAAAAAACkgRIWAwBAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvdXRpbHMuanNQSwECHgMKAAAAAAAAAAAAzbURkdUSAADVEgAAMwAAAAAAAAAAAAAApIE3UwMAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzUEsBAh4DCgAAAAAAAAAAAE3i7xocBwAAHAcAACQAAAAAAAAAAAAAAKSBXWYDAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAADLr+BaWhgAAFoYAAAnAAAAAAAAAAAAAACkgbttAwBAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvbm90aWZpZXIuanNQSwECHgMKAAAAAAAAAAAAvTv4HxY5AAAWOQAAKgAAAAAAAAAAAAAApIFahgMAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL3B1Ymxpc2gta2l0LmpzUEsBAh4DCgAAAAAAAAAAAFlqkoyDCgAAgwoAAC4AAAAAAAAAAAAAAKSBuL8DAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy9zdG9yZWQtbm90aWZpZXIuanNQSwECHgMKAAAAAAAAAAAAP99Lb9UhAADVIQAAJwAAAAAAAAAAAAAApIGHygMAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL3N0b3Jlc3ViLmpzUEsBAh4DCgAAAAAAAAAAADn7qBoiJAAAIiQAACgAAAAAAAAAAAAAAKSBoewDAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy9zdWJzY3JpYmUuanNQSwECHgMKAAAAAAAAAAAAzEjhp8ULAADFCwAAKQAAAAAAAAAAAAAApIEJEQQAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL3N1YnNjcmliZXIuanNQSwECHgMKAAAAAAAAAAAAkI6zQwwGAAAMBgAAJAAAAAAAAAAAAAAApIEVHQQAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL3RvcGljLmpzUEsBAh4DCgAAAAAAAAAAAPhRDxM/MAAAPzAAACwAAAAAAAAAAAAAAKSBYyMEAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy90eXBlcy1hbWJpZW50LmpzUEsBAh4DCgAAAAAAAAAAAD5iXDZcAQAAXAEAACAAAAAAAAAAAAAAAKSB7FMEAEBhZ29yaWMvc3RvcmUtdjAuOS4yL2V4cG9ydGVkLmpzUEsBAh4DCgAAAAAAAAAAADbb+SojDAAAIwwAACEAAAAAAAAAAAAAAKSBhlUEAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAADo7WSpMgsAADILAAAsAAAAAAAAAAAAAACkgehhBABAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvbGVnYWN5L2xlZ2FjeU1hcC5qc1BLAQIeAwoAAAAAAAAAAABnvA5DvQYAAL0GAAAwAAAAAAAAAAAAAACkgWRtBABAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvbGVnYWN5L2xlZ2FjeVdlYWtNYXAuanNQSwECHgMKAAAAAAAAAAAABSRq9RIWAAASFgAAMQAAAAAAAAAAAAAApIFvdAQAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL3N0b3Jlcy9zY2FsYXJNYXBTdG9yZS5qc1BLAQIeAwoAAAAAAAAAAADFBzAsOw8AADsPAAAxAAAAAAAAAAAAAACkgdCKBABAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvc3RvcmVzL3NjYWxhclNldFN0b3JlLmpzUEsBAh4DCgAAAAAAAAAAAO/WNtpzEwAAcxMAADUAAAAAAAAAAAAAAKSBWpoEAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy9zdG9yZXMvc2NhbGFyV2Vha01hcFN0b3JlLmpzUEsBAh4DCgAAAAAAAAAAAOp4RTsJDwAACQ8AADUAAAAAAAAAAAAAAKSBIK4EAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy9zdG9yZXMvc2NhbGFyV2Vha1NldFN0b3JlLmpzUEsBAh4DCgAAAAAAAAAAAK8QKk7lGQAA5RkAAC4AAAAAAAAAAAAAAKSBfL0EAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy9zdG9yZXMvc3RvcmUtdXRpbHMuanNQSwECHgMKAAAAAAAAAAAAVv6AxdAfAADQHwAAIQAAAAAAAAAAAAAApIGt1wQAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL3R5cGVzLmpzUEsBAh4DCgAAAAAAAAAAACGYIdi/AQAAvwEAABwAAAAAAAAAAAAAAKSBvPcEAEBhZ29yaWMvdGltZS12MC4zLjIvaW5kZXguanNQSwECHgMKAAAAAAAAAAAA2PclavAiAADwIgAAIwAAAAAAAAAAAAAApIG1+QQAQGFnb3JpYy90aW1lLXYwLjMuMi9zcmMvdGltZU1hdGguanNQSwECHgMKAAAAAAAAAAAAntgJoakHAACpBwAAJQAAAAAAAAAAAAAApIHmHAUAQGFnb3JpYy90aW1lLXYwLjMuMi9zcmMvdHlwZUd1YXJkcy5qc1BLAQIeAwoAAAAAAAAAAABUG+WdMSkAADEpAAAoAAAAAAAAAAAAAACkgdIkBQBAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMi9zcmMvZXhvLXV0aWxzLmpzUEsBAh4DCgAAAAAAAAAAACeMtJmSCAAAkggAACQAAAAAAAAAAAAAAKSBSU4FAEBhZ29yaWMvdmF0LWRhdGEtdjAuNS4yL3NyYy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAACShkCK+ygAAPsoAAAwAAAAAAAAAAAAAACkgR1XBQBAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMi9zcmMvdmF0LWRhdGEtYmluZGluZ3MuanNQSwECHgMKAAAAAAAAAAAAT92a1ooHAACKBwAAIwAAAAAAAAAAAAAApIFmgAUAQGFnb3JpYy92YXRzLXYwLjE1LjEvc3JjL3ZhdC16b2UuanNQSwECHgMKAAAAAAAAAAAA5SQy2UAcAABAHAAAKAAAAAAAAAAAAAAApIExiAUAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvY2xlYW5Qcm9wb3NhbC5qc1BLAQIeAwoAAAAAAAAAAACaqDlCvBAAALwQAAA0AAAAAAAAAAAAAACkgbekBQBAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdEZhY2V0L29mZmVyU2FmZXR5LmpzUEsBAh4DCgAAAAAAAAAAABYcS6czEQAAMxEAADAAAAAAAAAAAAAAAKSBxbUFAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL2luc3RhbmNlUmVjb3JkU3RvcmFnZS5qc1BLAQIeAwoAAAAAAAAAAACkSgu/9icAAPYnAAApAAAAAAAAAAAAAACkgUbHBQBAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9pbnRlcm5hbC10eXBlcy5qc1BLAQIeAwoAAAAAAAAAAAAmjM+rJgUAACYFAAAnAAAAAAAAAAAAAACkgYPvBQBAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9pc3N1ZXJSZWNvcmQuanNQSwECHgMKAAAAAAAAAAAAsAHqtUkdAABJHQAAKAAAAAAAAAAAAAAApIHu9AUAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvaXNzdWVyU3RvcmFnZS5qc1BLAQIeAwoAAAAAAAAAAADvhxsJVggAAFYIAAAlAAAAAAAAAAAAAACkgX0SBgBAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9tYWtlSGFuZGxlLmpzUEsBAh4DCgAAAAAAAAAAAMb6lweiBQAAogUAAC0AAAAAAAAAAAAAAKSBFhsGAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL29iakFycmF5Q29udmVyc2lvbi5qc1BLAQIeAwoAAAAAAAAAAACPB+Og6UQAAOlEAAAlAAAAAAAAAAAAAACkgQMhBgBAYWdvcmljL3pvZS12MC4yNi4yL3NyYy90eXBlR3VhcmRzLmpzUEsBAh4DCgAAAAAAAAAAAOkNAWuWBwAAlgcAACAAAAAAAAAAAAAAAKSBL2YGAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL3R5cGVzLmpzUEsBAh4DCgAAAAAAAAAAAHaIg87aAwAA2gMAADIAAAAAAAAAAAAAAKSBA24GAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL3pvZVNlcnZpY2UvY3JlYXRlWkNGVmF0LmpzUEsBAh4DCgAAAAAAAAAAALgCaEDZEgAA2RIAADMAAAAAAAAAAAAAAKSBLXIGAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL3pvZVNlcnZpY2UvZXNjcm93U3RvcmFnZS5qc1BLAQIeAwoAAAAAAAAAAABLxQCVeg0AAHoNAAAtAAAAAAAAAAAAAACkgVeFBgBAYWdvcmljL3pvZS12MC4yNi4yL3NyYy96b2VTZXJ2aWNlL2ZlZU1pbnQuanNQSwECHgMKAAAAAAAAAAAA1X/sJOcXAADnFwAAOQAAAAAAAAAAAAAApIEckwYAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvem9lU2VydmljZS9pbnN0YWxsYXRpb25TdG9yYWdlLmpzUEsBAh4DCgAAAAAAAAAAACnrIKgvKAAALygAADoAAAAAAAAAAAAAAKSBWqsGAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL3pvZVNlcnZpY2UvaW5zdGFuY2VBZG1pblN0b3JhZ2UuanNQSwECHgMKAAAAAAAAAAAASlv/UX4UAAB+FAAANAAAAAAAAAAAAAAApIHh0wYAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvem9lU2VydmljZS9pbnRlcm5hbC10eXBlcy5qc1BLAQIeAwoAAAAAAAAAAAAqaTevkQUAAJEFAAA3AAAAAAAAAAAAAACkgbHoBgBAYWdvcmljL3pvZS12MC4yNi4yL3NyYy96b2VTZXJ2aWNlL2ludml0YXRpb25RdWVyaWVzLmpzUEsBAh4DCgAAAAAAAAAAAJ5kEj1lCAAAZQgAADQAAAAAAAAAAAAAAKSBl+4GAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL3pvZVNlcnZpY2UvbWFrZUludml0YXRpb24uanNQSwECHgMKAAAAAAAAAAAAjvVUmqkGAACpBgAAOgAAAAAAAAAAAAAApIFO9wYAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvem9lU2VydmljZS9vZmZlci9idXJuSW52aXRhdGlvbi5qc1BLAQIeAwoAAAAAAAAAAABmdKOCTwsAAE8LAAAxAAAAAAAAAAAAAACkgU/+BgBAYWdvcmljL3pvZS12MC4yNi4yL3NyYy96b2VTZXJ2aWNlL29mZmVyL29mZmVyLmpzUEsBAh4DCgAAAAAAAAAAAP1KjOGCKwAAgisAADMAAAAAAAAAAAAAAKSB7QkHAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL3pvZVNlcnZpY2Uvc3RhcnRJbnN0YW5jZS5qc1BLAQIeAwoAAAAAAAAAAADIsxF2myIAAJsiAAApAAAAAAAAAAAAAACkgcA1BwBAYWdvcmljL3pvZS12MC4yNi4yL3NyYy96b2VTZXJ2aWNlL3pvZS5qc1BLAQIeAwoAAAAAAAAAAAALJm4R2ioAANoqAAAtAAAAAAAAAAAAAACkgaJYBwBAYWdvcmljL3pvZS12MC4yNi4yL3NyYy96b2VTZXJ2aWNlL3pvZVNlYXQuanNQSwECHgMKAAAAAAAAAAAAHbLPLQA6AAAAOgAANwAAAAAAAAAAAAAApIHHgwcAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvem9lU2VydmljZS96b2VTdG9yYWdlTWFuYWdlci5qc1BLAQIeAwoAAAAAAAAAAAAeKPu0fgEAAH4BAAAhAAAAAAAAAAAAAACkgRy+BwBAZW5kby9lbnYtb3B0aW9ucy12MC4xLjQvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAshzifZgMAACYDAAAKwAAAAAAAAAAAAAApIHZvwcAQGVuZG8vZW52LW9wdGlvbnMtdjAuMS40L3NyYy9lbnYtb3B0aW9ucy5qc1BLAQIeAwoAAAAAAAAAAAC0L4uCBy4AAAcuAAAkAAAAAAAAAAAAAACkgbrMBwBAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE3LjYvc3JjL0UuanNQSwECHgMKAAAAAAAAAAAAmBk7szQBAAA0AQAAKgAAAAAAAAAAAAAApIED+wcAQGVuZG8vZXZlbnR1YWwtc2VuZC12MC4xNy42L3NyYy9leHBvcnRzLmpzUEsBAh4DCgAAAAAAAAAAAPsYdN1FAgAARQIAACoAAAAAAAAAAAAAAKSBf/wHAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTcuNi9zcmMvbm8tc2hpbS5qc1BLAQIeAwoAAAAAAAAAAADqoR10lxAAAJcQAAAuAAAAAAAAAAAAAACkgQz/BwBAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE3LjYvc3JjL3RyYWNrLXR1cm5zLmpzUEsBAh4DCgAAAAAAAAAAAIMvo76YAgAAmAIAABkAAAAAAAAAAAAAAKSB7w8IAEBlbmRvL2V4by12MC4yLjYvaW5kZXguanNQSwECHgMKAAAAAAAAAAAA/bYqBmkcAABpHAAAIgAAAAAAAAAAAAAApIG+EggAQGVuZG8vZXhvLXYwLjIuNi9zcmMvZXhvLW1ha2Vycy5qc1BLAQIeAwoAAAAAAAAAAADhI84H8i4AAPIuAAAhAAAAAAAAAAAAAACkgWcvCABAZW5kby9leG8tdjAuMi42L3NyYy9leG8tdG9vbHMuanNQSwECHgMKAAAAAAAAAAAAQQwzlEACAABAAgAAHgAAAAAAAAAAAAAApIGYXggAQGVuZG8vZmFyLXYwLjIuMjIvc3JjL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAGqFXqN+BwAAfgcAAB0AAAAAAAAAAAAAAKSBFGEIAEBlbmRvL21hcnNoYWwtdjAuOC45L2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAA5MahaaDQAAmg0AACsAAAAAAAAAAAAAAKSBzWgIAEBlbmRvL21hcnNoYWwtdjAuOC45L3NyYy9kZWVwbHlGdWxmaWxsZWQuanNQSwECHgMKAAAAAAAAAAAAO3LPgOQ/AADkPwAAKgAAAAAAAAAAAAAApIGwdggAQGVuZG8vbWFyc2hhbC12MC44Ljkvc3JjL2VuY29kZVBhc3NhYmxlLmpzUEsBAh4DCgAAAAAAAAAAAAGyqe0OQAAADkAAACsAAAAAAAAAAAAAAKSB3LYIAEBlbmRvL21hcnNoYWwtdjAuOC45L3NyYy9lbmNvZGVUb0NhcERhdGEuanNQSwECHgMKAAAAAAAAAAAAw9fKAd07AADdOwAALQAAAAAAAAAAAAAApIEz9wgAQGVuZG8vbWFyc2hhbC12MC44Ljkvc3JjL2VuY29kZVRvU21hbGxjYXBzLmpzUEsBAh4DCgAAAAAAAAAAAIWqexcDKwAAAysAACoAAAAAAAAAAAAAAKSBWzMJAEBlbmRvL21hcnNoYWwtdjAuOC45L3NyYy9tYXJzaGFsLWp1c3Rpbi5qc1BLAQIeAwoAAAAAAAAAAAAT09Ub3AYAANwGAAAtAAAAAAAAAAAAAACkgaZeCQBAZW5kby9tYXJzaGFsLXYwLjguOS9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanNQSwECHgMKAAAAAAAAAAAAEAoNFuwyAADsMgAAIwAAAAAAAAAAAAAApIHNZQkAQGVuZG8vbWFyc2hhbC12MC44Ljkvc3JjL21hcnNoYWwuanNQSwECHgMKAAAAAAAAAAAAuBba6PNAAADzQAAAJQAAAAAAAAAAAAAApIH6mAkAQGVuZG8vbWFyc2hhbC12MC44Ljkvc3JjL3JhbmtPcmRlci5qc1BLAQIeAwoAAAAAAAAAAACYGTuzNAEAADQBAAAhAAAAAAAAAAAAAACkgTDaCQBAZW5kby9tYXJzaGFsLXYwLjguOS9zcmMvdHlwZXMuanNQSwECHgMKAAAAAAAAAAAATbI/K78LAAC/CwAAHgAAAAAAAAAAAAAApIGj2wkAQGVuZG8vbmF0LXY0LjEuMzEvc3JjL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAPlDfNZ8CAAAfAgAACAAAAAAAAAAAAAAAKSBnucJAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS43L2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAN5GtqqTBwAAkwcAACgAAAAAAAAAAAAAAKSBWPAJAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS43L3NyYy9jb3B5QXJyYXkuanNQSwECHgMKAAAAAAAAAAAAg/XbLM8HAADPBwAAKQAAAAAAAAAAAAAApIEx+AkAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjcvc3JjL2NvcHlSZWNvcmQuanNQSwECHgMKAAAAAAAAAAAAane7GUsSAABLEgAAJAAAAAAAAAAAAAAApIFHAAoAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjcvc3JjL2Vycm9yLmpzUEsBAh4DCgAAAAAAAAAAAEo7ZoNVCAAAVQgAACsAAAAAAAAAAAAAAKSB1BIKAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS43L3NyYy9pdGVyLWhlbHBlcnMuanNQSwECHgMKAAAAAAAAAAAA+lX/zTIaAAAyGgAAJwAAAAAAAAAAAAAApIFyGwoAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjcvc3JjL21ha2UtZmFyLmpzUEsBAh4DCgAAAAAAAAAAAAKRe+UdBAAAHQQAACkAAAAAAAAAAAAAAKSB6TUKAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS43L3NyYy9tYWtlVGFnZ2VkLmpzUEsBAh4DCgAAAAAAAAAAABlAKMb1GQAA9RkAADAAAAAAAAAAAAAAAKSBTToKAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS43L3NyYy9wYXNzU3R5bGUtaGVscGVycy5qc1BLAQIeAwoAAAAAAAAAAADNV8Qs1x4AANceAAAqAAAAAAAAAAAAAACkgZBUCgBAZW5kby9wYXNzLXN0eWxlLXYwLjEuNy9zcmMvcGFzc1N0eWxlT2YuanNQSwECHgMKAAAAAAAAAAAAFLGifcMhAADDIQAAKAAAAAAAAAAAAAAApIGvcwoAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjcvc3JjL3JlbW90YWJsZS5qc1BLAQIeAwoAAAAAAAAAAAAym6GHmg8AAJoPAAArAAAAAAAAAAAAAACkgbiVCgBAZW5kby9wYXNzLXN0eWxlLXYwLjEuNy9zcmMvc2FmZS1wcm9taXNlLmpzUEsBAh4DCgAAAAAAAAAAAMcf1VBHEgAARxIAACUAAAAAAAAAAAAAAKSBm6UKAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS43L3NyYy9zeW1ib2wuanNQSwECHgMKAAAAAAAAAAAAJbxc+/0HAAD9BwAAJQAAAAAAAAAAAAAApIEluAoAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjcvc3JjL3RhZ2dlZC5qc1BLAQIeAwoAAAAAAAAAAAB6oH5oEg0AABINAAApAAAAAAAAAAAAAACkgWXACgBAZW5kby9wYXNzLXN0eWxlLXYwLjEuNy9zcmMvdHlwZUd1YXJkcy5qc1BLAQIeAwoAAAAAAAAAAACYGTuzNAEAADQBAAAkAAAAAAAAAAAAAACkgb7NCgBAZW5kby9wYXNzLXN0eWxlLXYwLjEuNy9zcmMvdHlwZXMuanNQSwECHgMKAAAAAAAAAAAAhxVdaB4NAAAeDQAAHgAAAAAAAAAAAAAApIE0zwoAQGVuZG8vcGF0dGVybnMtdjAuMi42L2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAA5beKiSSAAAkkgAACoAAAAAAAAAAAAAAKSBjtwKAEBlbmRvL3BhdHRlcm5zLXYwLjIuNi9zcmMva2V5cy9jaGVja0tleS5qc1BLAQIeAwoAAAAAAAAAAACkqa1LoyEAAKMhAAAtAAAAAAAAAAAAAACkgWglCwBAZW5kby9wYXR0ZXJucy12MC4yLjYvc3JjL2tleXMvY29tcGFyZUtleXMuanNQSwECHgMKAAAAAAAAAAAAVSDC/SoUAAAqFAAAKQAAAAAAAAAAAAAApIFWRwsAQGVuZG8vcGF0dGVybnMtdjAuMi42L3NyYy9rZXlzL2NvcHlCYWcuanNQSwECHgMKAAAAAAAAAAAAmHXkr6cQAACnEAAAKQAAAAAAAAAAAAAApIHHWwsAQGVuZG8vcGF0dGVybnMtdjAuMi42L3NyYy9rZXlzL2NvcHlTZXQuanNQSwECHgMKAAAAAAAAAAAAMgiCpyIfAAAiHwAAOQAAAAAAAAAAAAAApIG1bAsAQGVuZG8vcGF0dGVybnMtdjAuMi42L3NyYy9rZXlzL2tleWNvbGxlY3Rpb24tb3BlcmF0b3JzLmpzUEsBAh4DCgAAAAAAAAAAACd4z8QHIgAAByIAADUAAAAAAAAAAAAAAKSBLowLAEBlbmRvL3BhdHRlcm5zLXYwLjIuNi9zcmMva2V5cy9tZXJnZS1iYWctb3BlcmF0b3JzLmpzUEsBAh4DCgAAAAAAAAAAAB7Nhy5cKAAAXCgAADUAAAAAAAAAAAAAAKSBiK4LAEBlbmRvL3BhdHRlcm5zLXYwLjIuNi9zcmMva2V5cy9tZXJnZS1zZXQtb3BlcmF0b3JzLmpzUEsBAh4DCgAAAAAAAAAAAPxgReXqDgAA6g4AADQAAAAAAAAAAAAAAKSBN9cLAEBlbmRvL3BhdHRlcm5zLXYwLjIuNi9zcmMvcGF0dGVybnMvaW50ZXJuYWwtdHlwZXMuanNQSwECHgMKAAAAAAAAAAAAgyX/PZvaAACb2gAANQAAAAAAAAAAAAAApIFz5gsAQGVuZG8vcGF0dGVybnMtdjAuMi42L3NyYy9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanNQSwECHgMKAAAAAAAAAAAAmBk7szQBAAA0AQAAIgAAAAAAAAAAAAAApIFhwQwAQGVuZG8vcGF0dGVybnMtdjAuMi42L3NyYy90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAAAW3aaY7R4AAO0eAAAiAAAAAAAAAAAAAACkgdXCDABAZW5kby9wYXR0ZXJucy12MC4yLjYvc3JjL3V0aWxzLmpzUEsBAh4DCgAAAAAAAAAAAAHCWMtwCQAAcAkAACIAAAAAAAAAAAAAAKSBAuIMAEBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNjAvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAiH2BrN8CAADfAgAAKwAAAAAAAAAAAAAApIGy6wwAQGVuZG8vcHJvbWlzZS1raXQtdjAuMi42MC9zcmMvaXMtcHJvbWlzZS5qc1BLAQIeAwoAAAAAAAAAAAAdp03rvhIAAL4SAAAqAAAAAAAAAAAAAACkgdruDABAZW5kby9wcm9taXNlLWtpdC12MC4yLjYwL3NyYy9tZW1vLXJhY2UuanNQSwECHgMKAAAAAAAAAAAA00Ow7mkHAABpBwAANQAAAAAAAAAAAAAApIHgAQ0AQGVuZG8vcHJvbWlzZS1raXQtdjAuMi42MC9zcmMvcHJvbWlzZS1leGVjdXRvci1raXQuanNQSwECHgMKAAAAAAAAAAAAmBk7szQBAAA0AQAAJgAAAAAAAAAAAAAApIGcCQ0AQGVuZG8vcHJvbWlzZS1raXQtdjAuMi42MC9zcmMvdHlwZXMuanNQSwECHgMKAAAAAAAAAAAADK4l5PQYAAD0GAAAHQAAAAAAAAAAAAAApIEUCw0AQGVuZG8vc3RyZWFtLXYwLjMuMjkvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAi7qHkq0BAACtAQAAHAAAAAAAAAAAAAAApIFDJA0AamVzc2llLmpzLXYwLjMuMi9zcmMvbWFpbi5qc1BLAQIeAwoAAAAAAAAAAACdzxOJXQEAAF0BAAAfAAAAAAAAAAAAAACkgSomDQBqZXNzaWUuanMtdjAuMy4yL3NyYy9yaW5nMC9FLmpzUEsBAh4DCgAAAAAAAAAAAPi0yb+pAwAAqQMAACwAAAAAAAAAAAAAAKSBxCcNAGplc3NpZS5qcy12MC4zLjIvc3JjL3JpbmcwL2FzeW5jLWdlbmVyYXRlLmpzUEsBAh4DCgAAAAAAAAAAAKCj2XrQAQAA0AEAACIAAAAAAAAAAAAAAKSBtysNAGplc3NpZS5qcy12MC4zLjIvc3JjL3JpbmcwL21haW4uanNQSwECHgMKAAAAAAAAAAAAb5t7YuMIAADjCAAAJAAAAAAAAAAAAAAApIHHLQ0AamVzc2llLmpzLXYwLjMuMi9zcmMvcmluZzAvbWFrZXJzLmpzUEsBAh4DCgAAAAAAAAAAALQs9Zj+BAAA/gQAACkAAAAAAAAAAAAAAKSB7DYNAGplc3NpZS5qcy12MC4zLjIvc3JjL3JpbmcxL2FzeW5jLXRvb2xzLmpzUEsBAh4DCgAAAAAAAAAAAJYTQrJyAQAAcgEAACIAAAAAAAAAAAAAAKSBMTwNAGplc3NpZS5qcy12MC4zLjIvc3JjL3JpbmcxL21haW4uanNQSwUGAAAAAI8AjwCvMAAA4z0NAAAA", + "endoZipBase64Sha512": "a63b1a57ccaf4f9b89e7d3e1e79d97406445c687dbf3c58ed45643b9da63b72bef9e3bff78d7ed2daf458f0376c3a4db8961c16204e1e7b7deaa30326553b66f" +} \ No newline at end of file diff --git a/proposals/b:zoe1/submission/upgrade-zoe-permit.json b/proposals/b:zoe1/submission/upgrade-zoe-permit.json new file mode 100644 index 00000000..a1ed50b3 --- /dev/null +++ b/proposals/b:zoe1/submission/upgrade-zoe-permit.json @@ -0,0 +1,18 @@ +{ + "consume": { + "vatAdminSvc": "vatAdminSvc", + "vatStore": "vatStore", + "agoricNamesAdmin": "makeCoreProposalBehavior", + "zoe": "makeCoreProposalBehavior" + }, + "produce": {}, + "evaluateBundleCap": "makeCoreProposalBehavior", + "installation": { + "produce": "makeCoreProposalBehavior" + }, + "modules": { + "utils": { + "runModuleBehaviors": "makeCoreProposalBehavior" + } + } +} \ No newline at end of file diff --git a/proposals/b:zoe1/submission/upgrade-zoe.js b/proposals/b:zoe1/submission/upgrade-zoe.js new file mode 100644 index 00000000..3b3f8845 --- /dev/null +++ b/proposals/b:zoe1/submission/upgrade-zoe.js @@ -0,0 +1,134 @@ +// This is generated by writeCoreProposal; please edit! +/* eslint-disable */ + +const manifestBundleRef = {bundleID:"b1-a3dc21c56535b4bebdf8c8413650eec2b37a6d9f5669b27f8c571601a6f641ffae2b925dd7e3d67c6953a1f8122c8ba814305e034c9087056816a6f05dd41069"}; +const getManifestCall = harden([ + "getManifestForUpgradingZoe", + { + zoeRef: { + bundleID: "b1-a63b1a57ccaf4f9b89e7d3e1e79d97406445c687dbf3c58ed45643b9da63b72bef9e3bff78d7ed2daf458f0376c3a4db8961c16204e1e7b7deaa30326553b66f", + }, + }, +]); +const overrideManifest = { + upgradeZoe: { + consume: { + vatAdminSvc: "vatAdminSvc", + vatStore: "vatStore", + }, + produce: {}, + }, +}; + +// Make the behavior the completion value. +(({ + manifestBundleRef, + getManifestCall, + overrideManifest, + E, + log = console.info, + restoreRef: overrideRestoreRef, +}) => { + const { entries, fromEntries } = Object; + + // deeplyFulfilled is a bit overkill for what we need. + const shallowlyFulfilled = async obj => { + if (!obj) { + return obj; + } + const ents = await Promise.all( + entries(obj).map(async ([key, valueP]) => { + const value = await valueP; + return [key, value]; + }), + ); + return fromEntries(ents); + }; + + /** @param {ChainBootstrapSpace & BootstrapPowers & { evaluateBundleCap: any }} allPowers */ + const behavior = async allPowers => { + // NOTE: If updating any of these names extracted from `allPowers`, you must + // change `permits` above to reflect their accessibility. + const { + consume: { vatAdminSvc, zoe, agoricNamesAdmin }, + evaluateBundleCap, + installation: { produce: produceInstallations }, + modules: { + utils: { runModuleBehaviors }, + }, + } = allPowers; + const [exportedGetManifest, ...manifestArgs] = getManifestCall; + + /** @type {(ref: import\('./externalTypes.js').ManifestBundleRef) => Promise>} */ + const defaultRestoreRef = async ref => { + // extract-proposal.js creates these records, and bundleName is + // the name under which the bundle was installed into + // config.bundles + const p = + 'bundleName' in ref + ? E(vatAdminSvc).getBundleIDByName(ref.bundleName) + : ref.bundleID; + const bundleID = await p; + const label = bundleID.slice(0, 8); + return E(zoe).installBundleID(bundleID, label); + }; + const restoreRef = overrideRestoreRef || defaultRestoreRef; + + // Get the on-chain installation containing the manifest and behaviors. + console.info('evaluateBundleCap', { + manifestBundleRef, + exportedGetManifest, + vatAdminSvc, + }); + let bcapP; + if ('bundleName' in manifestBundleRef) { + bcapP = E(vatAdminSvc).getNamedBundleCap(manifestBundleRef.bundleName); + } else { + bcapP = E(vatAdminSvc).getBundleCap(manifestBundleRef.bundleID); + } + const bundleCap = await bcapP; + + const manifestNS = await evaluateBundleCap(bundleCap); + + console.error('execute', { + exportedGetManifest, + behaviors: Object.keys(manifestNS), + }); + const { + manifest, + options: rawOptions, + installations: rawInstallations, + } = await manifestNS[exportedGetManifest]( + harden({ restoreRef }), + ...manifestArgs, + ); + + // Await references in the options or installations. + const [options, installations] = await Promise.all( + [rawOptions, rawInstallations].map(shallowlyFulfilled), + ); + + // Publish the installations for behavior dependencies. + const installAdmin = E(agoricNamesAdmin).lookupAdmin('installation'); + await Promise.all( + entries(installations || {}).map(([key, value]) => { + produceInstallations[key].resolve(value); + return E(installAdmin).update(key, value); + }), + ); + + // Evaluate the manifest for our behaviors. + return runModuleBehaviors({ + allPowers, + behaviors: manifestNS, + manifest: overrideManifest || manifest, + makeConfig: (name, _permit) => { + log('coreProposal:', name); + return { options }; + }, + }); + }; + + // Make the behavior the completion value. + return behavior; +})({ manifestBundleRef, getManifestCall, overrideManifest, E }); diff --git a/proposals/b:zoe1/test.sh b/proposals/b:zoe1/test.sh new file mode 100644 index 00000000..20c2c2a4 --- /dev/null +++ b/proposals/b:zoe1/test.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +set -e + +source /usr/src/upgrade-test-scripts/env_setup.sh + +yarn ava post.test.js diff --git a/proposals/b:zoe1/use.sh b/proposals/b:zoe1/use.sh new file mode 100644 index 00000000..cffcf2a8 --- /dev/null +++ b/proposals/b:zoe1/use.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +# Exit when any command fails +set -e + +echo "TODO remove once https://github.com/Agoric/agoric-3-proposals/pull/20 lands" diff --git a/proposals/b:zoe1/yarn.lock b/proposals/b:zoe1/yarn.lock new file mode 100644 index 00000000..42763199 --- /dev/null +++ b/proposals/b:zoe1/yarn.lock @@ -0,0 +1,2349 @@ +# This file is generated by running "yarn install" inside your project. +# Manual changes might be lost - proceed with caution! + +__metadata: + version: 8 + cacheKey: 10c0 + +"@endo/zip@npm:^0.2.35": + version: 0.2.35 + resolution: "@endo/zip@npm:0.2.35" + checksum: bb81c085e47a5d67342dcc039b2f471e4679e08de95cea3cdba598e2644125ec0b2002e7a1d3ff9a10977380487a58688d7e2c4d1d5525c16e46fed4b735372d + languageName: node + linkType: hard + +"@isaacs/cliui@npm:^8.0.2": + version: 8.0.2 + resolution: "@isaacs/cliui@npm:8.0.2" + dependencies: + string-width: "npm:^5.1.2" + string-width-cjs: "npm:string-width@^4.2.0" + strip-ansi: "npm:^7.0.1" + strip-ansi-cjs: "npm:strip-ansi@^6.0.1" + wrap-ansi: "npm:^8.1.0" + wrap-ansi-cjs: "npm:wrap-ansi@^7.0.0" + checksum: b1bf42535d49f11dc137f18d5e4e63a28c5569de438a221c369483731e9dac9fb797af554e8bf02b6192d1e5eba6e6402cf93900c3d0ac86391d00d04876789e + languageName: node + linkType: hard + +"@nodelib/fs.scandir@npm:2.1.5": + version: 2.1.5 + resolution: "@nodelib/fs.scandir@npm:2.1.5" + dependencies: + "@nodelib/fs.stat": "npm:2.0.5" + run-parallel: "npm:^1.1.9" + checksum: 732c3b6d1b1e967440e65f284bd06e5821fedf10a1bea9ed2bb75956ea1f30e08c44d3def9d6a230666574edbaf136f8cfd319c14fd1f87c66e6a44449afb2eb + languageName: node + linkType: hard + +"@nodelib/fs.stat@npm:2.0.5, @nodelib/fs.stat@npm:^2.0.2": + version: 2.0.5 + resolution: "@nodelib/fs.stat@npm:2.0.5" + checksum: 88dafe5e3e29a388b07264680dc996c17f4bda48d163a9d4f5c1112979f0ce8ec72aa7116122c350b4e7976bc5566dc3ddb579be1ceaacc727872eb4ed93926d + languageName: node + linkType: hard + +"@nodelib/fs.walk@npm:^1.2.3": + version: 1.2.8 + resolution: "@nodelib/fs.walk@npm:1.2.8" + dependencies: + "@nodelib/fs.scandir": "npm:2.1.5" + fastq: "npm:^1.6.0" + checksum: db9de047c3bb9b51f9335a7bb46f4fcfb6829fb628318c12115fbaf7d369bfce71c15b103d1fc3b464812d936220ee9bc1c8f762d032c9f6be9acc99249095b1 + languageName: node + linkType: hard + +"@npmcli/agent@npm:^2.0.0": + version: 2.2.0 + resolution: "@npmcli/agent@npm:2.2.0" + dependencies: + agent-base: "npm:^7.1.0" + http-proxy-agent: "npm:^7.0.0" + https-proxy-agent: "npm:^7.0.1" + lru-cache: "npm:^10.0.1" + socks-proxy-agent: "npm:^8.0.1" + checksum: 7b89590598476dda88e79c473766b67c682aae6e0ab0213491daa6083dcc0c171f86b3868f5506f22c09aa5ea69ad7dfb78f4bf39a8dca375d89a42f408645b3 + languageName: node + linkType: hard + +"@npmcli/fs@npm:^3.1.0": + version: 3.1.0 + resolution: "@npmcli/fs@npm:3.1.0" + dependencies: + semver: "npm:^7.3.5" + checksum: 162b4a0b8705cd6f5c2470b851d1dc6cd228c86d2170e1769d738c1fbb69a87160901411c3c035331e9e99db72f1f1099a8b734bf1637cc32b9a5be1660e4e1e + languageName: node + linkType: hard + +"@pkgjs/parseargs@npm:^0.11.0": + version: 0.11.0 + resolution: "@pkgjs/parseargs@npm:0.11.0" + checksum: 5bd7576bb1b38a47a7fc7b51ac9f38748e772beebc56200450c4a817d712232b8f1d3ef70532c80840243c657d491cf6a6be1e3a214cff907645819fdc34aadd + languageName: node + linkType: hard + +"abbrev@npm:^2.0.0": + version: 2.0.0 + resolution: "abbrev@npm:2.0.0" + checksum: f742a5a107473946f426c691c08daba61a1d15942616f300b5d32fd735be88fef5cba24201757b6c407fd564555fb48c751cfa33519b2605c8a7aadd22baf372 + languageName: node + linkType: hard + +"acorn-walk@npm:^8.2.0": + version: 8.3.0 + resolution: "acorn-walk@npm:8.3.0" + checksum: 24346e595f507b6e704a60d35f3c5e1aa9891d4fb6a3fc3d856503ab718cc26cabb5e3e1ff0ff8da6ec03d60a8226ebdb602805a94f970e7f797ea3b8b09437f + languageName: node + linkType: hard + +"acorn@npm:^8.8.2": + version: 8.11.2 + resolution: "acorn@npm:8.11.2" + bin: + acorn: bin/acorn + checksum: a3ed76c761b75ec54b1ec3068fb7f113a182e95aea7f322f65098c2958d232e3d211cb6dac35ff9c647024b63714bc528a26d54a925d1fef2c25585b4c8e4017 + languageName: node + linkType: hard + +"agent-base@npm:^7.0.2, agent-base@npm:^7.1.0": + version: 7.1.0 + resolution: "agent-base@npm:7.1.0" + dependencies: + debug: "npm:^4.3.4" + checksum: fc974ab57ffdd8421a2bc339644d312a9cca320c20c3393c9d8b1fd91731b9bbabdb985df5fc860f5b79d81c3e350daa3fcb31c5c07c0bb385aafc817df004ce + languageName: node + linkType: hard + +"aggregate-error@npm:^3.0.0": + version: 3.1.0 + resolution: "aggregate-error@npm:3.1.0" + dependencies: + clean-stack: "npm:^2.0.0" + indent-string: "npm:^4.0.0" + checksum: a42f67faa79e3e6687a4923050e7c9807db3848a037076f791d10e092677d65c1d2d863b7848560699f40fc0502c19f40963fb1cd1fb3d338a7423df8e45e039 + languageName: node + linkType: hard + +"aggregate-error@npm:^4.0.0": + version: 4.0.1 + resolution: "aggregate-error@npm:4.0.1" + dependencies: + clean-stack: "npm:^4.0.0" + indent-string: "npm:^5.0.0" + checksum: 75fd739f5c4c60a667cce35ccaf0edf135e147ef0be9a029cab75de14ac9421779b15339d562e58d25b233ea0ef2bbd4c916f149fdbcb73c2b9a62209e611343 + languageName: node + linkType: hard + +"ansi-regex@npm:^5.0.1": + version: 5.0.1 + resolution: "ansi-regex@npm:5.0.1" + checksum: 9a64bb8627b434ba9327b60c027742e5d17ac69277960d041898596271d992d4d52ba7267a63ca10232e29f6107fc8a835f6ce8d719b88c5f8493f8254813737 + languageName: node + linkType: hard + +"ansi-regex@npm:^6.0.1": + version: 6.0.1 + resolution: "ansi-regex@npm:6.0.1" + checksum: cbe16dbd2c6b2735d1df7976a7070dd277326434f0212f43abf6d87674095d247968209babdaad31bb00882fa68807256ba9be340eec2f1004de14ca75f52a08 + languageName: node + linkType: hard + +"ansi-styles@npm:^4.0.0": + version: 4.3.0 + resolution: "ansi-styles@npm:4.3.0" + dependencies: + color-convert: "npm:^2.0.1" + checksum: 895a23929da416f2bd3de7e9cb4eabd340949328ab85ddd6e484a637d8f6820d485f53933446f5291c3b760cbc488beb8e88573dd0f9c7daf83dccc8fe81b041 + languageName: node + linkType: hard + +"ansi-styles@npm:^6.0.0, ansi-styles@npm:^6.1.0, ansi-styles@npm:^6.2.1": + version: 6.2.1 + resolution: "ansi-styles@npm:6.2.1" + checksum: 5d1ec38c123984bcedd996eac680d548f31828bd679a66db2bdf11844634dde55fec3efa9c6bb1d89056a5e79c1ac540c4c784d592ea1d25028a92227d2f2d5c + languageName: node + linkType: hard + +"anymatch@npm:~3.1.2": + version: 3.1.3 + resolution: "anymatch@npm:3.1.3" + dependencies: + normalize-path: "npm:^3.0.0" + picomatch: "npm:^2.0.4" + checksum: 57b06ae984bc32a0d22592c87384cd88fe4511b1dd7581497831c56d41939c8a001b28e7b853e1450f2bf61992dfcaa8ae2d0d161a0a90c4fb631ef07098fbac + languageName: node + linkType: hard + +"argparse@npm:^1.0.7": + version: 1.0.10 + resolution: "argparse@npm:1.0.10" + dependencies: + sprintf-js: "npm:~1.0.2" + checksum: b2972c5c23c63df66bca144dbc65d180efa74f25f8fd9b7d9a0a6c88ae839db32df3d54770dcb6460cf840d232b60695d1a6b1053f599d84e73f7437087712de + languageName: node + linkType: hard + +"array-find-index@npm:^1.0.1": + version: 1.0.2 + resolution: "array-find-index@npm:1.0.2" + checksum: 86b9485c74ddd324feab807e10a6de3f9c1683856267236fac4bb4d4667ada6463e106db3f6c540ae6b720e0442b590ec701d13676df4c6af30ebf4da09b4f57 + languageName: node + linkType: hard + +"arrgv@npm:^1.0.2": + version: 1.0.2 + resolution: "arrgv@npm:1.0.2" + checksum: 7e6e782e6b749923ac7cbc4048ef6fe0844c4a59bfc8932fcd4c44566ba25eed46501f94dd7cf3c7297da88f3f599ca056bfb77d0c2484aebc92f04239f69124 + languageName: node + linkType: hard + +"arrify@npm:^3.0.0": + version: 3.0.0 + resolution: "arrify@npm:3.0.0" + checksum: 2e26601b8486f29780f1f70f7ac05a226755814c2a3ab42e196748f650af1dc310cd575a11dd4b9841c70fd7460b2dd2b8fe6fb7a3375878e2660706efafa58e + languageName: node + linkType: hard + +"ava@npm:^5.3.1": + version: 5.3.1 + resolution: "ava@npm:5.3.1" + dependencies: + acorn: "npm:^8.8.2" + acorn-walk: "npm:^8.2.0" + ansi-styles: "npm:^6.2.1" + arrgv: "npm:^1.0.2" + arrify: "npm:^3.0.0" + callsites: "npm:^4.0.0" + cbor: "npm:^8.1.0" + chalk: "npm:^5.2.0" + chokidar: "npm:^3.5.3" + chunkd: "npm:^2.0.1" + ci-info: "npm:^3.8.0" + ci-parallel-vars: "npm:^1.0.1" + clean-yaml-object: "npm:^0.1.0" + cli-truncate: "npm:^3.1.0" + code-excerpt: "npm:^4.0.0" + common-path-prefix: "npm:^3.0.0" + concordance: "npm:^5.0.4" + currently-unhandled: "npm:^0.4.1" + debug: "npm:^4.3.4" + emittery: "npm:^1.0.1" + figures: "npm:^5.0.0" + globby: "npm:^13.1.4" + ignore-by-default: "npm:^2.1.0" + indent-string: "npm:^5.0.0" + is-error: "npm:^2.2.2" + is-plain-object: "npm:^5.0.0" + is-promise: "npm:^4.0.0" + matcher: "npm:^5.0.0" + mem: "npm:^9.0.2" + ms: "npm:^2.1.3" + p-event: "npm:^5.0.1" + p-map: "npm:^5.5.0" + picomatch: "npm:^2.3.1" + pkg-conf: "npm:^4.0.0" + plur: "npm:^5.1.0" + pretty-ms: "npm:^8.0.0" + resolve-cwd: "npm:^3.0.0" + stack-utils: "npm:^2.0.6" + strip-ansi: "npm:^7.0.1" + supertap: "npm:^3.0.1" + temp-dir: "npm:^3.0.0" + write-file-atomic: "npm:^5.0.1" + yargs: "npm:^17.7.2" + peerDependencies: + "@ava/typescript": "*" + peerDependenciesMeta: + "@ava/typescript": + optional: true + bin: + ava: entrypoints/cli.mjs + checksum: 262cbdb9e8c3ce7177be91b92ba521e9d5aef577dcc8095cc591f86baaa291b91c88925928f5d26832c4d1b381a6ae99f2e8804077c592d0d32322c1212605cc + languageName: node + linkType: hard + +"balanced-match@npm:^1.0.0": + version: 1.0.2 + resolution: "balanced-match@npm:1.0.2" + checksum: 9308baf0a7e4838a82bbfd11e01b1cb0f0cf2893bc1676c27c2a8c0e70cbae1c59120c3268517a8ae7fb6376b4639ef81ca22582611dbee4ed28df945134aaee + languageName: node + linkType: hard + +"base64-js@npm:^1.3.1": + version: 1.5.1 + resolution: "base64-js@npm:1.5.1" + checksum: f23823513b63173a001030fae4f2dabe283b99a9d324ade3ad3d148e218134676f1ee8568c877cd79ec1c53158dcf2d2ba527a97c606618928ba99dd930102bf + languageName: node + linkType: hard + +"better-sqlite3@npm:^8.5.1": + version: 8.7.0 + resolution: "better-sqlite3@npm:8.7.0" + dependencies: + bindings: "npm:^1.5.0" + node-gyp: "npm:latest" + prebuild-install: "npm:^7.1.1" + checksum: 2583401b08531eee74c083c73f3a5902bc142b0e1c16de5b9caa92ee94f544e2cb512c214de2f762a6c83e593f26f70013214344a9ea66ace6d0619efbf04a1e + languageName: node + linkType: hard + +"binary-extensions@npm:^2.0.0": + version: 2.2.0 + resolution: "binary-extensions@npm:2.2.0" + checksum: d73d8b897238a2d3ffa5f59c0241870043aa7471335e89ea5e1ff48edb7c2d0bb471517a3e4c5c3f4c043615caa2717b5f80a5e61e07503d51dc85cb848e665d + languageName: node + linkType: hard + +"bindings@npm:^1.5.0": + version: 1.5.0 + resolution: "bindings@npm:1.5.0" + dependencies: + file-uri-to-path: "npm:1.0.0" + checksum: 3dab2491b4bb24124252a91e656803eac24292473e56554e35bbfe3cc1875332cfa77600c3bac7564049dc95075bf6fcc63a4609920ff2d64d0fe405fcf0d4ba + languageName: node + linkType: hard + +"bl@npm:^4.0.3": + version: 4.1.0 + resolution: "bl@npm:4.1.0" + dependencies: + buffer: "npm:^5.5.0" + inherits: "npm:^2.0.4" + readable-stream: "npm:^3.4.0" + checksum: 02847e1d2cb089c9dc6958add42e3cdeaf07d13f575973963335ac0fdece563a50ac770ac4c8fa06492d2dd276f6cc3b7f08c7cd9c7a7ad0f8d388b2a28def5f + languageName: node + linkType: hard + +"blueimp-md5@npm:^2.10.0": + version: 2.19.0 + resolution: "blueimp-md5@npm:2.19.0" + checksum: 85d04343537dd99a288c62450341dcce7380d3454c81f8e5a971ddd80307d6f9ef51b5b92ad7d48aaaa92fd6d3a1f6b2f4fada068faae646887f7bfabc17a346 + languageName: node + linkType: hard + +"brace-expansion@npm:^1.1.7": + version: 1.1.11 + resolution: "brace-expansion@npm:1.1.11" + dependencies: + balanced-match: "npm:^1.0.0" + concat-map: "npm:0.0.1" + checksum: 695a56cd058096a7cb71fb09d9d6a7070113c7be516699ed361317aca2ec169f618e28b8af352e02ab4233fb54eb0168460a40dc320bab0034b36ab59aaad668 + languageName: node + linkType: hard + +"brace-expansion@npm:^2.0.1": + version: 2.0.1 + resolution: "brace-expansion@npm:2.0.1" + dependencies: + balanced-match: "npm:^1.0.0" + checksum: b358f2fe060e2d7a87aa015979ecea07f3c37d4018f8d6deb5bd4c229ad3a0384fe6029bb76cd8be63c81e516ee52d1a0673edbe2023d53a5191732ae3c3e49f + languageName: node + linkType: hard + +"braces@npm:^3.0.2, braces@npm:~3.0.2": + version: 3.0.2 + resolution: "braces@npm:3.0.2" + dependencies: + fill-range: "npm:^7.0.1" + checksum: 321b4d675791479293264019156ca322163f02dc06e3c4cab33bb15cd43d80b51efef69b0930cfde3acd63d126ebca24cd0544fa6f261e093a0fb41ab9dda381 + languageName: node + linkType: hard + +"buffer@npm:^5.5.0": + version: 5.7.1 + resolution: "buffer@npm:5.7.1" + dependencies: + base64-js: "npm:^1.3.1" + ieee754: "npm:^1.1.13" + checksum: 27cac81cff434ed2876058d72e7c4789d11ff1120ef32c9de48f59eab58179b66710c488987d295ae89a228f835fc66d088652dffeb8e3ba8659f80eb091d55e + languageName: node + linkType: hard + +"cacache@npm:^18.0.0": + version: 18.0.0 + resolution: "cacache@npm:18.0.0" + dependencies: + "@npmcli/fs": "npm:^3.1.0" + fs-minipass: "npm:^3.0.0" + glob: "npm:^10.2.2" + lru-cache: "npm:^10.0.1" + minipass: "npm:^7.0.3" + minipass-collect: "npm:^1.0.2" + minipass-flush: "npm:^1.0.5" + minipass-pipeline: "npm:^1.2.4" + p-map: "npm:^4.0.0" + ssri: "npm:^10.0.0" + tar: "npm:^6.1.11" + unique-filename: "npm:^3.0.0" + checksum: e359823778d712ad365740cef3f488d4f74c62cc79be5935896d9597a7d81033e50c54c15898fa9cc018620879307ab30d1dddc476ae705bfd5b29c145ae6938 + languageName: node + linkType: hard + +"callsites@npm:^4.0.0": + version: 4.1.0 + resolution: "callsites@npm:4.1.0" + checksum: 91700844127a6dcd4792d231a12dd8e9ec10525eb9962180a8558417d7e3f443e52a4f14746ad2838eaf14f79431ee1539d13bd188da280f720a06a91bd1157a + languageName: node + linkType: hard + +"cbor@npm:^8.1.0": + version: 8.1.0 + resolution: "cbor@npm:8.1.0" + dependencies: + nofilter: "npm:^3.1.0" + checksum: a836e2e7ea0efb1b9c4e5a4be906c57113d730cc42293a34072e0164ed110bb8ac035dc7dca2e3ebb641bd4b37e00fdbbf09c951aa864b3d4888a6ed8c6243f7 + languageName: node + linkType: hard + +"chalk@npm:^5.2.0": + version: 5.3.0 + resolution: "chalk@npm:5.3.0" + checksum: 8297d436b2c0f95801103ff2ef67268d362021b8210daf8ddbe349695333eb3610a71122172ff3b0272f1ef2cf7cc2c41fdaa4715f52e49ffe04c56340feed09 + languageName: node + linkType: hard + +"chokidar@npm:^3.5.3": + version: 3.5.3 + resolution: "chokidar@npm:3.5.3" + dependencies: + anymatch: "npm:~3.1.2" + braces: "npm:~3.0.2" + fsevents: "npm:~2.3.2" + glob-parent: "npm:~5.1.2" + is-binary-path: "npm:~2.1.0" + is-glob: "npm:~4.0.1" + normalize-path: "npm:~3.0.0" + readdirp: "npm:~3.6.0" + dependenciesMeta: + fsevents: + optional: true + checksum: 1076953093e0707c882a92c66c0f56ba6187831aa51bb4de878c1fec59ae611a3bf02898f190efec8e77a086b8df61c2b2a3ea324642a0558bdf8ee6c5dc9ca1 + languageName: node + linkType: hard + +"chownr@npm:^1.1.1": + version: 1.1.4 + resolution: "chownr@npm:1.1.4" + checksum: ed57952a84cc0c802af900cf7136de643d3aba2eecb59d29344bc2f3f9bf703a301b9d84cdc71f82c3ffc9ccde831b0d92f5b45f91727d6c9da62f23aef9d9db + languageName: node + linkType: hard + +"chownr@npm:^2.0.0": + version: 2.0.0 + resolution: "chownr@npm:2.0.0" + checksum: 594754e1303672171cc04e50f6c398ae16128eb134a88f801bf5354fd96f205320f23536a045d9abd8b51024a149696e51231565891d4efdab8846021ecf88e6 + languageName: node + linkType: hard + +"chunkd@npm:^2.0.1": + version: 2.0.1 + resolution: "chunkd@npm:2.0.1" + checksum: 4e0c5aac6048ecedfa4cd0a5f6c4f010c70a7b7645aeca7bfeb47cb0733c3463054f0ced3f2667b2e0e67edd75d68a8e05481b01115ba3f8a952a93026254504 + languageName: node + linkType: hard + +"ci-info@npm:^3.8.0": + version: 3.9.0 + resolution: "ci-info@npm:3.9.0" + checksum: 6f0109e36e111684291d46123d491bc4e7b7a1934c3a20dea28cba89f1d4a03acd892f5f6a81ed3855c38647e285a150e3c9ba062e38943bef57fee6c1554c3a + languageName: node + linkType: hard + +"ci-parallel-vars@npm:^1.0.1": + version: 1.0.1 + resolution: "ci-parallel-vars@npm:1.0.1" + checksum: 80952f699cbbc146092b077b4f3e28d085620eb4e6be37f069b4dbb3db0ee70e8eec3beef4ebe70ff60631e9fc743b9d0869678489f167442cac08b260e5ac08 + languageName: node + linkType: hard + +"clean-stack@npm:^2.0.0": + version: 2.2.0 + resolution: "clean-stack@npm:2.2.0" + checksum: 1f90262d5f6230a17e27d0c190b09d47ebe7efdd76a03b5a1127863f7b3c9aec4c3e6c8bb3a7bbf81d553d56a1fd35728f5a8ef4c63f867ac8d690109742a8c1 + languageName: node + linkType: hard + +"clean-stack@npm:^4.0.0": + version: 4.2.0 + resolution: "clean-stack@npm:4.2.0" + dependencies: + escape-string-regexp: "npm:5.0.0" + checksum: 2bdf981a0fef0a23c14255df693b30eb9ae27eedf212470d8c400a0c0b6fb82fbf1ff8c5216ccd5721e3670b700389c886b1dce5070776dc9fbcc040957758c0 + languageName: node + linkType: hard + +"clean-yaml-object@npm:^0.1.0": + version: 0.1.0 + resolution: "clean-yaml-object@npm:0.1.0" + checksum: a6505310590038afb9f0adc7f17a4c66787719c94d23f8491267ea4d9c405cdd378bd576ae1926169b6d997d4c59a8b86516bf4d16ba228280cf615598c58e05 + languageName: node + linkType: hard + +"cli-truncate@npm:^3.1.0": + version: 3.1.0 + resolution: "cli-truncate@npm:3.1.0" + dependencies: + slice-ansi: "npm:^5.0.0" + string-width: "npm:^5.0.0" + checksum: a19088878409ec0e5dc2659a5166929629d93cfba6d68afc9cde2282fd4c751af5b555bf197047e31c87c574396348d011b7aa806fec29c4139ea4f7f00b324c + languageName: node + linkType: hard + +"cliui@npm:^8.0.1": + version: 8.0.1 + resolution: "cliui@npm:8.0.1" + dependencies: + string-width: "npm:^4.2.0" + strip-ansi: "npm:^6.0.1" + wrap-ansi: "npm:^7.0.0" + checksum: 4bda0f09c340cbb6dfdc1ed508b3ca080f12992c18d68c6be4d9cf51756033d5266e61ec57529e610dacbf4da1c634423b0c1b11037709cc6b09045cbd815df5 + languageName: node + linkType: hard + +"code-excerpt@npm:^4.0.0": + version: 4.0.0 + resolution: "code-excerpt@npm:4.0.0" + dependencies: + convert-to-spaces: "npm:^2.0.1" + checksum: b6c5a06e039cecd2ab6a0e10ee0831de8362107d1f298ca3558b5f9004cb8e0260b02dd6c07f57b9a0e346c76864d2873311ee1989809fdeb05bd5fbbadde773 + languageName: node + linkType: hard + +"color-convert@npm:^2.0.1": + version: 2.0.1 + resolution: "color-convert@npm:2.0.1" + dependencies: + color-name: "npm:~1.1.4" + checksum: 37e1150172f2e311fe1b2df62c6293a342ee7380da7b9cfdba67ea539909afbd74da27033208d01d6d5cfc65ee7868a22e18d7e7648e004425441c0f8a15a7d7 + languageName: node + linkType: hard + +"color-name@npm:~1.1.4": + version: 1.1.4 + resolution: "color-name@npm:1.1.4" + checksum: a1a3f914156960902f46f7f56bc62effc6c94e84b2cae157a526b1c1f74b677a47ec602bf68a61abfa2b42d15b7c5651c6dbe72a43af720bc588dff885b10f95 + languageName: node + linkType: hard + +"common-path-prefix@npm:^3.0.0": + version: 3.0.0 + resolution: "common-path-prefix@npm:3.0.0" + checksum: c4a74294e1b1570f4a8ab435285d185a03976c323caa16359053e749db4fde44e3e6586c29cd051100335e11895767cbbd27ea389108e327d62f38daf4548fdb + languageName: node + linkType: hard + +"concat-map@npm:0.0.1": + version: 0.0.1 + resolution: "concat-map@npm:0.0.1" + checksum: c996b1cfdf95b6c90fee4dae37e332c8b6eb7d106430c17d538034c0ad9a1630cb194d2ab37293b1bdd4d779494beee7786d586a50bd9376fd6f7bcc2bd4c98f + languageName: node + linkType: hard + +"concordance@npm:^5.0.4": + version: 5.0.4 + resolution: "concordance@npm:5.0.4" + dependencies: + date-time: "npm:^3.1.0" + esutils: "npm:^2.0.3" + fast-diff: "npm:^1.2.0" + js-string-escape: "npm:^1.0.1" + lodash: "npm:^4.17.15" + md5-hex: "npm:^3.0.1" + semver: "npm:^7.3.2" + well-known-symbols: "npm:^2.0.0" + checksum: 59b440f330df3a7c9aa148ba588b3e99aed86acab225b4f01ffcea34ace4cf11f817e31153254e8f38ed48508998dad40b9106951a743c334d751f7ab21afb8a + languageName: node + linkType: hard + +"convert-to-spaces@npm:^2.0.1": + version: 2.0.1 + resolution: "convert-to-spaces@npm:2.0.1" + checksum: d90aa0e3b6a27f9d5265a8d32def3c5c855b3e823a9db1f26d772f8146d6b91020a2fdfd905ce8048a73fad3aaf836fef8188c67602c374405e2ae8396c4ac46 + languageName: node + linkType: hard + +"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.3": + version: 7.0.3 + resolution: "cross-spawn@npm:7.0.3" + dependencies: + path-key: "npm:^3.1.0" + shebang-command: "npm:^2.0.0" + which: "npm:^2.0.1" + checksum: 5738c312387081c98d69c98e105b6327b069197f864a60593245d64c8089c8a0a744e16349281210d56835bb9274130d825a78b2ad6853ca13cfbeffc0c31750 + languageName: node + linkType: hard + +"currently-unhandled@npm:^0.4.1": + version: 0.4.1 + resolution: "currently-unhandled@npm:0.4.1" + dependencies: + array-find-index: "npm:^1.0.1" + checksum: 32d197689ec32f035910202c1abb0dc6424dce01d7b51779c685119b380d98535c110ffff67a262fc7e367612a7dfd30d3d3055f9a6634b5a9dd1302de7ef11c + languageName: node + linkType: hard + +"date-time@npm:^3.1.0": + version: 3.1.0 + resolution: "date-time@npm:3.1.0" + dependencies: + time-zone: "npm:^1.0.0" + checksum: aa3e2e930d74b0b9e90f69de7a16d3376e30f21f1f4ce9a2311d8fec32d760e776efea752dafad0ce188187265235229013036202be053fc2d7979813bfb6ded + languageName: node + linkType: hard + +"debug@npm:4, debug@npm:^4.3.4": + version: 4.3.4 + resolution: "debug@npm:4.3.4" + dependencies: + ms: "npm:2.1.2" + peerDependenciesMeta: + supports-color: + optional: true + checksum: cedbec45298dd5c501d01b92b119cd3faebe5438c3917ff11ae1bff86a6c722930ac9c8659792824013168ba6db7c4668225d845c633fbdafbbf902a6389f736 + languageName: node + linkType: hard + +"decompress-response@npm:^6.0.0": + version: 6.0.0 + resolution: "decompress-response@npm:6.0.0" + dependencies: + mimic-response: "npm:^3.1.0" + checksum: bd89d23141b96d80577e70c54fb226b2f40e74a6817652b80a116d7befb8758261ad073a8895648a29cc0a5947021ab66705cb542fa9c143c82022b27c5b175e + languageName: node + linkType: hard + +"deep-extend@npm:^0.6.0": + version: 0.6.0 + resolution: "deep-extend@npm:0.6.0" + checksum: 1c6b0abcdb901e13a44c7d699116d3d4279fdb261983122a3783e7273844d5f2537dc2e1c454a23fcf645917f93fbf8d07101c1d03c015a87faa662755212566 + languageName: node + linkType: hard + +"detect-libc@npm:^2.0.0": + version: 2.0.2 + resolution: "detect-libc@npm:2.0.2" + checksum: a9f4ffcd2701525c589617d98afe5a5d0676c8ea82bcc4ed6f3747241b79f781d36437c59a5e855254c864d36a3e9f8276568b6b531c28d6e53b093a15703f11 + languageName: node + linkType: hard + +"dir-glob@npm:^3.0.1": + version: 3.0.1 + resolution: "dir-glob@npm:3.0.1" + dependencies: + path-type: "npm:^4.0.0" + checksum: dcac00920a4d503e38bb64001acb19df4efc14536ada475725e12f52c16777afdee4db827f55f13a908ee7efc0cb282e2e3dbaeeb98c0993dd93d1802d3bf00c + languageName: node + linkType: hard + +"eastasianwidth@npm:^0.2.0": + version: 0.2.0 + resolution: "eastasianwidth@npm:0.2.0" + checksum: 26f364ebcdb6395f95124fda411f63137a4bfb5d3a06453f7f23dfe52502905bd84e0488172e0f9ec295fdc45f05c23d5d91baf16bd26f0fe9acd777a188dc39 + languageName: node + linkType: hard + +"emittery@npm:^1.0.1": + version: 1.0.1 + resolution: "emittery@npm:1.0.1" + checksum: 2587f2f42bb5e004ba1cde61352d2151f4dd4f29eb79ad36f82e200da2faec9742d7bfca1492a024d60396e001e4b07d9b2b9c43be33547ff751ba8ff87c42ce + languageName: node + linkType: hard + +"emoji-regex@npm:^8.0.0": + version: 8.0.0 + resolution: "emoji-regex@npm:8.0.0" + checksum: b6053ad39951c4cf338f9092d7bfba448cdfd46fe6a2a034700b149ac9ffbc137e361cbd3c442297f86bed2e5f7576c1b54cc0a6bf8ef5106cc62f496af35010 + languageName: node + linkType: hard + +"emoji-regex@npm:^9.2.2": + version: 9.2.2 + resolution: "emoji-regex@npm:9.2.2" + checksum: af014e759a72064cf66e6e694a7fc6b0ed3d8db680427b021a89727689671cefe9d04151b2cad51dbaf85d5ba790d061cd167f1cf32eb7b281f6368b3c181639 + languageName: node + linkType: hard + +"encoding@npm:^0.1.13": + version: 0.1.13 + resolution: "encoding@npm:0.1.13" + dependencies: + iconv-lite: "npm:^0.6.2" + checksum: 36d938712ff00fe1f4bac88b43bcffb5930c1efa57bbcdca9d67e1d9d6c57cfb1200fb01efe0f3109b2ce99b231f90779532814a81370a1bd3274a0f58585039 + languageName: node + linkType: hard + +"end-of-stream@npm:^1.1.0, end-of-stream@npm:^1.4.1": + version: 1.4.4 + resolution: "end-of-stream@npm:1.4.4" + dependencies: + once: "npm:^1.4.0" + checksum: 870b423afb2d54bb8d243c63e07c170409d41e20b47eeef0727547aea5740bd6717aca45597a9f2745525667a6b804c1e7bede41f856818faee5806dd9ff3975 + languageName: node + linkType: hard + +"env-paths@npm:^2.2.0": + version: 2.2.1 + resolution: "env-paths@npm:2.2.1" + checksum: 285325677bf00e30845e330eec32894f5105529db97496ee3f598478e50f008c5352a41a30e5e72ec9de8a542b5a570b85699cd63bd2bc646dbcb9f311d83bc4 + languageName: node + linkType: hard + +"err-code@npm:^2.0.2": + version: 2.0.3 + resolution: "err-code@npm:2.0.3" + checksum: b642f7b4dd4a376e954947550a3065a9ece6733ab8e51ad80db727aaae0817c2e99b02a97a3d6cecc648a97848305e728289cf312d09af395403a90c9d4d8a66 + languageName: node + linkType: hard + +"escalade@npm:^3.1.1": + version: 3.1.1 + resolution: "escalade@npm:3.1.1" + checksum: afd02e6ca91ffa813e1108b5e7756566173d6bc0d1eb951cb44d6b21702ec17c1cf116cfe75d4a2b02e05acb0b808a7a9387d0d1ca5cf9c04ad03a8445c3e46d + languageName: node + linkType: hard + +"escape-string-regexp@npm:5.0.0, escape-string-regexp@npm:^5.0.0": + version: 5.0.0 + resolution: "escape-string-regexp@npm:5.0.0" + checksum: 6366f474c6f37a802800a435232395e04e9885919873e382b157ab7e8f0feb8fed71497f84a6f6a81a49aab41815522f5839112bd38026d203aea0c91622df95 + languageName: node + linkType: hard + +"escape-string-regexp@npm:^2.0.0": + version: 2.0.0 + resolution: "escape-string-regexp@npm:2.0.0" + checksum: 2530479fe8db57eace5e8646c9c2a9c80fa279614986d16dcc6bcaceb63ae77f05a851ba6c43756d816c61d7f4534baf56e3c705e3e0d884818a46808811c507 + languageName: node + linkType: hard + +"esprima@npm:^4.0.0": + version: 4.0.1 + resolution: "esprima@npm:4.0.1" + bin: + esparse: ./bin/esparse.js + esvalidate: ./bin/esvalidate.js + checksum: ad4bab9ead0808cf56501750fd9d3fb276f6b105f987707d059005d57e182d18a7c9ec7f3a01794ebddcca676773e42ca48a32d67a250c9d35e009ca613caba3 + languageName: node + linkType: hard + +"esutils@npm:^2.0.3": + version: 2.0.3 + resolution: "esutils@npm:2.0.3" + checksum: 9a2fe69a41bfdade834ba7c42de4723c97ec776e40656919c62cbd13607c45e127a003f05f724a1ea55e5029a4cf2de444b13009f2af71271e42d93a637137c7 + languageName: node + linkType: hard + +"execa@npm:^7.2.0": + version: 7.2.0 + resolution: "execa@npm:7.2.0" + dependencies: + cross-spawn: "npm:^7.0.3" + get-stream: "npm:^6.0.1" + human-signals: "npm:^4.3.0" + is-stream: "npm:^3.0.0" + merge-stream: "npm:^2.0.0" + npm-run-path: "npm:^5.1.0" + onetime: "npm:^6.0.0" + signal-exit: "npm:^3.0.7" + strip-final-newline: "npm:^3.0.0" + checksum: 098cd6a1bc26d509e5402c43f4971736450b84d058391820c6f237aeec6436963e006fd8423c9722f148c53da86aa50045929c7278b5522197dff802d10f9885 + languageName: node + linkType: hard + +"expand-template@npm:^2.0.3": + version: 2.0.3 + resolution: "expand-template@npm:2.0.3" + checksum: 1c9e7afe9acadf9d373301d27f6a47b34e89b3391b1ef38b7471d381812537ef2457e620ae7f819d2642ce9c43b189b3583813ec395e2938319abe356a9b2f51 + languageName: node + linkType: hard + +"exponential-backoff@npm:^3.1.1": + version: 3.1.1 + resolution: "exponential-backoff@npm:3.1.1" + checksum: 160456d2d647e6019640bd07111634d8c353038d9fa40176afb7cd49b0548bdae83b56d05e907c2cce2300b81cae35d800ef92fefb9d0208e190fa3b7d6bb579 + languageName: node + linkType: hard + +"fast-diff@npm:^1.2.0": + version: 1.3.0 + resolution: "fast-diff@npm:1.3.0" + checksum: 5c19af237edb5d5effda008c891a18a585f74bf12953be57923f17a3a4d0979565fc64dbc73b9e20926b9d895f5b690c618cbb969af0cf022e3222471220ad29 + languageName: node + linkType: hard + +"fast-glob@npm:^3.3.0": + version: 3.3.1 + resolution: "fast-glob@npm:3.3.1" + dependencies: + "@nodelib/fs.stat": "npm:^2.0.2" + "@nodelib/fs.walk": "npm:^1.2.3" + glob-parent: "npm:^5.1.2" + merge2: "npm:^1.3.0" + micromatch: "npm:^4.0.4" + checksum: b68431128fb6ce4b804c5f9622628426d990b66c75b21c0d16e3d80e2d1398bf33f7e1724e66a2e3f299285dcf5b8d745b122d0304e7dd66f5231081f33ec67c + languageName: node + linkType: hard + +"fastq@npm:^1.6.0": + version: 1.15.0 + resolution: "fastq@npm:1.15.0" + dependencies: + reusify: "npm:^1.0.4" + checksum: 5ce4f83afa5f88c9379e67906b4d31bc7694a30826d6cc8d0f0473c966929017fda65c2174b0ec89f064ede6ace6c67f8a4fe04cef42119b6a55b0d465554c24 + languageName: node + linkType: hard + +"figures@npm:^5.0.0": + version: 5.0.0 + resolution: "figures@npm:5.0.0" + dependencies: + escape-string-regexp: "npm:^5.0.0" + is-unicode-supported: "npm:^1.2.0" + checksum: ce0f17d4ea8b0fc429c5207c343534a2f5284ecfb22aa08607da7dc84ed9e1cf754f5b97760e8dcb98d3c9d1a1e4d3d578fe3b5b99c426f05d0f06c7ba618e16 + languageName: node + linkType: hard + +"file-uri-to-path@npm:1.0.0": + version: 1.0.0 + resolution: "file-uri-to-path@npm:1.0.0" + checksum: 3b545e3a341d322d368e880e1c204ef55f1d45cdea65f7efc6c6ce9e0c4d22d802d5629320eb779d006fe59624ac17b0e848d83cc5af7cd101f206cb704f5519 + languageName: node + linkType: hard + +"fill-range@npm:^7.0.1": + version: 7.0.1 + resolution: "fill-range@npm:7.0.1" + dependencies: + to-regex-range: "npm:^5.0.1" + checksum: 7cdad7d426ffbaadf45aeb5d15ec675bbd77f7597ad5399e3d2766987ed20bda24d5fac64b3ee79d93276f5865608bb22344a26b9b1ae6c4d00bd94bf611623f + languageName: node + linkType: hard + +"find-up@npm:^6.0.0": + version: 6.3.0 + resolution: "find-up@npm:6.3.0" + dependencies: + locate-path: "npm:^7.1.0" + path-exists: "npm:^5.0.0" + checksum: 07e0314362d316b2b13f7f11ea4692d5191e718ca3f7264110127520f3347996349bf9e16805abae3e196805814bc66ef4bff2b8904dc4a6476085fc9b0eba07 + languageName: node + linkType: hard + +"foreground-child@npm:^3.1.0": + version: 3.1.1 + resolution: "foreground-child@npm:3.1.1" + dependencies: + cross-spawn: "npm:^7.0.0" + signal-exit: "npm:^4.0.1" + checksum: 9700a0285628abaeb37007c9a4d92bd49f67210f09067638774338e146c8e9c825c5c877f072b2f75f41dc6a2d0be8664f79ffc03f6576649f54a84fb9b47de0 + languageName: node + linkType: hard + +"fs-constants@npm:^1.0.0": + version: 1.0.0 + resolution: "fs-constants@npm:1.0.0" + checksum: a0cde99085f0872f4d244e83e03a46aa387b74f5a5af750896c6b05e9077fac00e9932fdf5aef84f2f16634cd473c63037d7a512576da7d5c2b9163d1909f3a8 + languageName: node + linkType: hard + +"fs-minipass@npm:^2.0.0": + version: 2.1.0 + resolution: "fs-minipass@npm:2.1.0" + dependencies: + minipass: "npm:^3.0.0" + checksum: 703d16522b8282d7299337539c3ed6edddd1afe82435e4f5b76e34a79cd74e488a8a0e26a636afc2440e1a23b03878e2122e3a2cfe375a5cf63c37d92b86a004 + languageName: node + linkType: hard + +"fs-minipass@npm:^3.0.0": + version: 3.0.3 + resolution: "fs-minipass@npm:3.0.3" + dependencies: + minipass: "npm:^7.0.3" + checksum: 63e80da2ff9b621e2cb1596abcb9207f1cf82b968b116ccd7b959e3323144cce7fb141462200971c38bbf2ecca51695069db45265705bed09a7cd93ae5b89f94 + languageName: node + linkType: hard + +"fs.realpath@npm:^1.0.0": + version: 1.0.0 + resolution: "fs.realpath@npm:1.0.0" + checksum: 444cf1291d997165dfd4c0d58b69f0e4782bfd9149fd72faa4fe299e68e0e93d6db941660b37dd29153bf7186672ececa3b50b7e7249477b03fdf850f287c948 + languageName: node + linkType: hard + +"fsevents@npm:~2.3.2": + version: 2.3.3 + resolution: "fsevents@npm:2.3.3" + dependencies: + node-gyp: "npm:latest" + checksum: a1f0c44595123ed717febbc478aa952e47adfc28e2092be66b8ab1635147254ca6cfe1df792a8997f22716d4cbafc73309899ff7bfac2ac3ad8cf2e4ecc3ec60 + conditions: os=darwin + languageName: node + linkType: hard + +"fsevents@patch:fsevents@npm%3A~2.3.2#optional!builtin": + version: 2.3.3 + resolution: "fsevents@patch:fsevents@npm%3A2.3.3#optional!builtin::version=2.3.3&hash=df0bf1" + dependencies: + node-gyp: "npm:latest" + conditions: os=darwin + languageName: node + linkType: hard + +"get-caller-file@npm:^2.0.5": + version: 2.0.5 + resolution: "get-caller-file@npm:2.0.5" + checksum: c6c7b60271931fa752aeb92f2b47e355eac1af3a2673f47c9589e8f8a41adc74d45551c1bc57b5e66a80609f10ffb72b6f575e4370d61cc3f7f3aaff01757cde + languageName: node + linkType: hard + +"get-stream@npm:^6.0.1": + version: 6.0.1 + resolution: "get-stream@npm:6.0.1" + checksum: 49825d57d3fd6964228e6200a58169464b8e8970489b3acdc24906c782fb7f01f9f56f8e6653c4a50713771d6658f7cfe051e5eb8c12e334138c9c918b296341 + languageName: node + linkType: hard + +"github-from-package@npm:0.0.0": + version: 0.0.0 + resolution: "github-from-package@npm:0.0.0" + checksum: 737ee3f52d0a27e26332cde85b533c21fcdc0b09fb716c3f8e522cfaa9c600d4a631dec9fcde179ec9d47cca89017b7848ed4d6ae6b6b78f936c06825b1fcc12 + languageName: node + linkType: hard + +"glob-parent@npm:^5.1.2, glob-parent@npm:~5.1.2": + version: 5.1.2 + resolution: "glob-parent@npm:5.1.2" + dependencies: + is-glob: "npm:^4.0.1" + checksum: cab87638e2112bee3f839ef5f6e0765057163d39c66be8ec1602f3823da4692297ad4e972de876ea17c44d652978638d2fd583c6713d0eb6591706825020c9ee + languageName: node + linkType: hard + +"glob@npm:^10.2.2, glob@npm:^10.3.10": + version: 10.3.10 + resolution: "glob@npm:10.3.10" + dependencies: + foreground-child: "npm:^3.1.0" + jackspeak: "npm:^2.3.5" + minimatch: "npm:^9.0.1" + minipass: "npm:^5.0.0 || ^6.0.2 || ^7.0.0" + path-scurry: "npm:^1.10.1" + bin: + glob: dist/esm/bin.mjs + checksum: 13d8a1feb7eac7945f8c8480e11cd4a44b24d26503d99a8d8ac8d5aefbf3e9802a2b6087318a829fad04cb4e829f25c5f4f1110c68966c498720dd261c7e344d + languageName: node + linkType: hard + +"glob@npm:^7.1.3": + version: 7.2.3 + resolution: "glob@npm:7.2.3" + dependencies: + fs.realpath: "npm:^1.0.0" + inflight: "npm:^1.0.4" + inherits: "npm:2" + minimatch: "npm:^3.1.1" + once: "npm:^1.3.0" + path-is-absolute: "npm:^1.0.0" + checksum: 65676153e2b0c9095100fe7f25a778bf45608eeb32c6048cf307f579649bcc30353277b3b898a3792602c65764e5baa4f643714dfbdfd64ea271d210c7a425fe + languageName: node + linkType: hard + +"globby@npm:^13.1.4": + version: 13.2.2 + resolution: "globby@npm:13.2.2" + dependencies: + dir-glob: "npm:^3.0.1" + fast-glob: "npm:^3.3.0" + ignore: "npm:^5.2.4" + merge2: "npm:^1.4.1" + slash: "npm:^4.0.0" + checksum: a8d7cc7cbe5e1b2d0f81d467bbc5bc2eac35f74eaded3a6c85fc26d7acc8e6de22d396159db8a2fc340b8a342e74cac58de8f4aee74146d3d146921a76062664 + languageName: node + linkType: hard + +"graceful-fs@npm:^4.2.6": + version: 4.2.11 + resolution: "graceful-fs@npm:4.2.11" + checksum: 386d011a553e02bc594ac2ca0bd6d9e4c22d7fa8cfbfc448a6d148c59ea881b092db9dbe3547ae4b88e55f1b01f7c4a2ecc53b310c042793e63aa44cf6c257f2 + languageName: node + linkType: hard + +"http-cache-semantics@npm:^4.1.1": + version: 4.1.1 + resolution: "http-cache-semantics@npm:4.1.1" + checksum: ce1319b8a382eb3cbb4a37c19f6bfe14e5bb5be3d09079e885e8c513ab2d3cd9214902f8a31c9dc4e37022633ceabfc2d697405deeaf1b8f3552bb4ed996fdfc + languageName: node + linkType: hard + +"http-proxy-agent@npm:^7.0.0": + version: 7.0.0 + resolution: "http-proxy-agent@npm:7.0.0" + dependencies: + agent-base: "npm:^7.1.0" + debug: "npm:^4.3.4" + checksum: a11574ff39436cee3c7bc67f259444097b09474605846ddd8edf0bf4ad8644be8533db1aa463426e376865047d05dc22755e638632819317c0c2f1b2196657c8 + languageName: node + linkType: hard + +"https-proxy-agent@npm:^7.0.1": + version: 7.0.2 + resolution: "https-proxy-agent@npm:7.0.2" + dependencies: + agent-base: "npm:^7.0.2" + debug: "npm:4" + checksum: 7735eb90073db087e7e79312e3d97c8c04baf7ea7ca7b013382b6a45abbaa61b281041a98f4e13c8c80d88f843785bcc84ba189165b4b4087b1e3496ba656d77 + languageName: node + linkType: hard + +"human-signals@npm:^4.3.0": + version: 4.3.1 + resolution: "human-signals@npm:4.3.1" + checksum: 40498b33fe139f5cc4ef5d2f95eb1803d6318ac1b1c63eaf14eeed5484d26332c828de4a5a05676b6c83d7b9e57727c59addb4b1dea19cb8d71e83689e5b336c + languageName: node + linkType: hard + +"iconv-lite@npm:^0.6.2": + version: 0.6.3 + resolution: "iconv-lite@npm:0.6.3" + dependencies: + safer-buffer: "npm:>= 2.1.2 < 3.0.0" + checksum: 98102bc66b33fcf5ac044099d1257ba0b7ad5e3ccd3221f34dd508ab4070edff183276221684e1e0555b145fce0850c9f7d2b60a9fcac50fbb4ea0d6e845a3b1 + languageName: node + linkType: hard + +"ieee754@npm:^1.1.13": + version: 1.2.1 + resolution: "ieee754@npm:1.2.1" + checksum: b0782ef5e0935b9f12883a2e2aa37baa75da6e66ce6515c168697b42160807d9330de9a32ec1ed73149aea02e0d822e572bca6f1e22bdcbd2149e13b050b17bb + languageName: node + linkType: hard + +"ignore-by-default@npm:^2.1.0": + version: 2.1.0 + resolution: "ignore-by-default@npm:2.1.0" + checksum: 3a6040dac25ed9da39dee73bf1634fdd1e15b0eb7cf52a6bdec81c310565782d8811c104ce40acb3d690d61c5fc38a91c78e6baee830a8a2232424dbc6b66981 + languageName: node + linkType: hard + +"ignore@npm:^5.2.4": + version: 5.2.4 + resolution: "ignore@npm:5.2.4" + checksum: 7c7cd90edd9fea6e037f9b9da4b01bf0a86b198ce78345f9bbd983929d68ff14830be31111edc5d70c264921f4962404d75b7262b4d9cc3bc12381eccbd03096 + languageName: node + linkType: hard + +"imurmurhash@npm:^0.1.4": + version: 0.1.4 + resolution: "imurmurhash@npm:0.1.4" + checksum: 8b51313850dd33605c6c9d3fd9638b714f4c4c40250cff658209f30d40da60f78992fb2df5dabee4acf589a6a82bbc79ad5486550754bd9ec4e3fc0d4a57d6a6 + languageName: node + linkType: hard + +"indent-string@npm:^4.0.0": + version: 4.0.0 + resolution: "indent-string@npm:4.0.0" + checksum: 1e1904ddb0cb3d6cce7cd09e27a90184908b7a5d5c21b92e232c93579d314f0b83c246ffb035493d0504b1e9147ba2c9b21df0030f48673fba0496ecd698161f + languageName: node + linkType: hard + +"indent-string@npm:^5.0.0": + version: 5.0.0 + resolution: "indent-string@npm:5.0.0" + checksum: 8ee77b57d92e71745e133f6f444d6fa3ed503ad0e1bcd7e80c8da08b42375c07117128d670589725ed07b1978065803fa86318c309ba45415b7fe13e7f170220 + languageName: node + linkType: hard + +"inflight@npm:^1.0.4": + version: 1.0.6 + resolution: "inflight@npm:1.0.6" + dependencies: + once: "npm:^1.3.0" + wrappy: "npm:1" + checksum: 7faca22584600a9dc5b9fca2cd5feb7135ac8c935449837b315676b4c90aa4f391ec4f42240178244b5a34e8bede1948627fda392ca3191522fc46b34e985ab2 + languageName: node + linkType: hard + +"inherits@npm:2, inherits@npm:^2.0.3, inherits@npm:^2.0.4": + version: 2.0.4 + resolution: "inherits@npm:2.0.4" + checksum: 4e531f648b29039fb7426fb94075e6545faa1eb9fe83c29f0b6d9e7263aceb4289d2d4557db0d428188eeb449cc7c5e77b0a0b2c4e248ff2a65933a0dee49ef2 + languageName: node + linkType: hard + +"ini@npm:~1.3.0": + version: 1.3.8 + resolution: "ini@npm:1.3.8" + checksum: ec93838d2328b619532e4f1ff05df7909760b6f66d9c9e2ded11e5c1897d6f2f9980c54dd638f88654b00919ce31e827040631eab0a3969e4d1abefa0719516a + languageName: node + linkType: hard + +"ip@npm:^2.0.0": + version: 2.0.0 + resolution: "ip@npm:2.0.0" + checksum: 8d186cc5585f57372847ae29b6eba258c68862055e18a75cc4933327232cb5c107f89800ce29715d542eef2c254fbb68b382e780a7414f9ee7caf60b7a473958 + languageName: node + linkType: hard + +"irregular-plurals@npm:^3.3.0": + version: 3.5.0 + resolution: "irregular-plurals@npm:3.5.0" + checksum: 7c033bbe7325e5a6e0a26949cc6863b6ce273403d4cd5b93bd99b33fecb6605b0884097c4259c23ed0c52c2133bf7d1cdcdd7a0630e8c325161fe269b3447918 + languageName: node + linkType: hard + +"is-binary-path@npm:~2.1.0": + version: 2.1.0 + resolution: "is-binary-path@npm:2.1.0" + dependencies: + binary-extensions: "npm:^2.0.0" + checksum: a16eaee59ae2b315ba36fad5c5dcaf8e49c3e27318f8ab8fa3cdb8772bf559c8d1ba750a589c2ccb096113bb64497084361a25960899cb6172a6925ab6123d38 + languageName: node + linkType: hard + +"is-error@npm:^2.2.2": + version: 2.2.2 + resolution: "is-error@npm:2.2.2" + checksum: 475d3463968bf16e94485555d7cb7a879ed68685e08d365a3370972e626054f1846ebbb3934403091e06682445568601fe919e41646096e5007952d0c1f4fd9b + languageName: node + linkType: hard + +"is-extglob@npm:^2.1.1": + version: 2.1.1 + resolution: "is-extglob@npm:2.1.1" + checksum: 5487da35691fbc339700bbb2730430b07777a3c21b9ebaecb3072512dfd7b4ba78ac2381a87e8d78d20ea08affb3f1971b4af629173a6bf435ff8a4c47747912 + languageName: node + linkType: hard + +"is-fullwidth-code-point@npm:^3.0.0": + version: 3.0.0 + resolution: "is-fullwidth-code-point@npm:3.0.0" + checksum: bb11d825e049f38e04c06373a8d72782eee0205bda9d908cc550ccb3c59b99d750ff9537982e01733c1c94a58e35400661f57042158ff5e8f3e90cf936daf0fc + languageName: node + linkType: hard + +"is-fullwidth-code-point@npm:^4.0.0": + version: 4.0.0 + resolution: "is-fullwidth-code-point@npm:4.0.0" + checksum: df2a717e813567db0f659c306d61f2f804d480752526886954a2a3e2246c7745fd07a52b5fecf2b68caf0a6c79dcdace6166fdf29cc76ed9975cc334f0a018b8 + languageName: node + linkType: hard + +"is-glob@npm:^4.0.1, is-glob@npm:~4.0.1": + version: 4.0.3 + resolution: "is-glob@npm:4.0.3" + dependencies: + is-extglob: "npm:^2.1.1" + checksum: 17fb4014e22be3bbecea9b2e3a76e9e34ff645466be702f1693e8f1ee1adac84710d0be0bd9f967d6354036fd51ab7c2741d954d6e91dae6bb69714de92c197a + languageName: node + linkType: hard + +"is-lambda@npm:^1.0.1": + version: 1.0.1 + resolution: "is-lambda@npm:1.0.1" + checksum: 85fee098ae62ba6f1e24cf22678805473c7afd0fb3978a3aa260e354cb7bcb3a5806cf0a98403188465efedec41ab4348e8e4e79305d409601323855b3839d4d + languageName: node + linkType: hard + +"is-number@npm:^7.0.0": + version: 7.0.0 + resolution: "is-number@npm:7.0.0" + checksum: b4686d0d3053146095ccd45346461bc8e53b80aeb7671cc52a4de02dbbf7dc0d1d2a986e2fe4ae206984b4d34ef37e8b795ebc4f4295c978373e6575e295d811 + languageName: node + linkType: hard + +"is-plain-object@npm:^5.0.0": + version: 5.0.0 + resolution: "is-plain-object@npm:5.0.0" + checksum: 893e42bad832aae3511c71fd61c0bf61aa3a6d853061c62a307261842727d0d25f761ce9379f7ba7226d6179db2a3157efa918e7fe26360f3bf0842d9f28942c + languageName: node + linkType: hard + +"is-promise@npm:^4.0.0": + version: 4.0.0 + resolution: "is-promise@npm:4.0.0" + checksum: ebd5c672d73db781ab33ccb155fb9969d6028e37414d609b115cc534654c91ccd061821d5b987eefaa97cf4c62f0b909bb2f04db88306de26e91bfe8ddc01503 + languageName: node + linkType: hard + +"is-stream@npm:^3.0.0": + version: 3.0.0 + resolution: "is-stream@npm:3.0.0" + checksum: eb2f7127af02ee9aa2a0237b730e47ac2de0d4e76a4a905a50a11557f2339df5765eaea4ceb8029f1efa978586abe776908720bfcb1900c20c6ec5145f6f29d8 + languageName: node + linkType: hard + +"is-unicode-supported@npm:^1.2.0": + version: 1.3.0 + resolution: "is-unicode-supported@npm:1.3.0" + checksum: b8674ea95d869f6faabddc6a484767207058b91aea0250803cbf1221345cb0c56f466d4ecea375dc77f6633d248d33c47bd296fb8f4cdba0b4edba8917e83d8a + languageName: node + linkType: hard + +"isexe@npm:^2.0.0": + version: 2.0.0 + resolution: "isexe@npm:2.0.0" + checksum: 228cfa503fadc2c31596ab06ed6aa82c9976eec2bfd83397e7eaf06d0ccf42cd1dfd6743bf9aeb01aebd4156d009994c5f76ea898d2832c1fe342da923ca457d + languageName: node + linkType: hard + +"isexe@npm:^3.1.1": + version: 3.1.1 + resolution: "isexe@npm:3.1.1" + checksum: 9ec257654093443eb0a528a9c8cbba9c0ca7616ccb40abd6dde7202734d96bb86e4ac0d764f0f8cd965856aacbff2f4ce23e730dc19dfb41e3b0d865ca6fdcc7 + languageName: node + linkType: hard + +"jackspeak@npm:^2.3.5": + version: 2.3.6 + resolution: "jackspeak@npm:2.3.6" + dependencies: + "@isaacs/cliui": "npm:^8.0.2" + "@pkgjs/parseargs": "npm:^0.11.0" + dependenciesMeta: + "@pkgjs/parseargs": + optional: true + checksum: f01d8f972d894cd7638bc338e9ef5ddb86f7b208ce177a36d718eac96ec86638a6efa17d0221b10073e64b45edc2ce15340db9380b1f5d5c5d000cbc517dc111 + languageName: node + linkType: hard + +"js-string-escape@npm:^1.0.1": + version: 1.0.1 + resolution: "js-string-escape@npm:1.0.1" + checksum: 2c33b9ff1ba6b84681c51ca0997e7d5a1639813c95d5b61cb7ad47e55cc28fa4a0b1935c3d218710d8e6bcee5d0cd8c44755231e3a4e45fc604534d9595a3628 + languageName: node + linkType: hard + +"js-yaml@npm:^3.14.1": + version: 3.14.1 + resolution: "js-yaml@npm:3.14.1" + dependencies: + argparse: "npm:^1.0.7" + esprima: "npm:^4.0.0" + bin: + js-yaml: bin/js-yaml.js + checksum: 6746baaaeac312c4db8e75fa22331d9a04cccb7792d126ed8ce6a0bbcfef0cedaddd0c5098fade53db067c09fe00aa1c957674b4765610a8b06a5a189e46433b + languageName: node + linkType: hard + +"load-json-file@npm:^7.0.0": + version: 7.0.1 + resolution: "load-json-file@npm:7.0.1" + checksum: 7117459608a0b6329c7f78e6e1f541b3162dd901c29dd5af721fec8b270177d2e3d7999c971f344fff04daac368d052732e2c7146014bc84d15e0b636975e19a + languageName: node + linkType: hard + +"locate-path@npm:^7.1.0": + version: 7.2.0 + resolution: "locate-path@npm:7.2.0" + dependencies: + p-locate: "npm:^6.0.0" + checksum: 139e8a7fe11cfbd7f20db03923cacfa5db9e14fa14887ea121345597472b4a63c1a42a8a5187defeeff6acf98fd568da7382aa39682d38f0af27433953a97751 + languageName: node + linkType: hard + +"lodash@npm:^4.17.15": + version: 4.17.21 + resolution: "lodash@npm:4.17.21" + checksum: d8cbea072bb08655bb4c989da418994b073a608dffa608b09ac04b43a791b12aeae7cd7ad919aa4c925f33b48490b5cfe6c1f71d827956071dae2e7bb3a6b74c + languageName: node + linkType: hard + +"lru-cache@npm:^10.0.1, lru-cache@npm:^9.1.1 || ^10.0.0": + version: 10.0.1 + resolution: "lru-cache@npm:10.0.1" + checksum: 982dabfb227b9a2daf56d712ae0e72e01115a28c0a2068cd71277bca04568f3417bbf741c6c7941abc5c620fd8059e34f15607f90ebccbfa0a17533322d27a8e + languageName: node + linkType: hard + +"lru-cache@npm:^6.0.0": + version: 6.0.0 + resolution: "lru-cache@npm:6.0.0" + dependencies: + yallist: "npm:^4.0.0" + checksum: cb53e582785c48187d7a188d3379c181b5ca2a9c78d2bce3e7dee36f32761d1c42983da3fe12b55cb74e1779fa94cdc2e5367c028a9b35317184ede0c07a30a9 + languageName: node + linkType: hard + +"make-fetch-happen@npm:^13.0.0": + version: 13.0.0 + resolution: "make-fetch-happen@npm:13.0.0" + dependencies: + "@npmcli/agent": "npm:^2.0.0" + cacache: "npm:^18.0.0" + http-cache-semantics: "npm:^4.1.1" + is-lambda: "npm:^1.0.1" + minipass: "npm:^7.0.2" + minipass-fetch: "npm:^3.0.0" + minipass-flush: "npm:^1.0.5" + minipass-pipeline: "npm:^1.2.4" + negotiator: "npm:^0.6.3" + promise-retry: "npm:^2.0.1" + ssri: "npm:^10.0.0" + checksum: 43b9f6dcbc6fe8b8604cb6396957c3698857a15ba4dbc38284f7f0e61f248300585ef1eb8cc62df54e9c724af977e45b5cdfd88320ef7f53e45070ed3488da55 + languageName: node + linkType: hard + +"map-age-cleaner@npm:^0.1.3": + version: 0.1.3 + resolution: "map-age-cleaner@npm:0.1.3" + dependencies: + p-defer: "npm:^1.0.0" + checksum: 7495236c7b0950956c144fd8b4bc6399d4e78072a8840a4232fe1c4faccbb5eb5d842e5c0a56a60afc36d723f315c1c672325ca03c1b328650f7fcc478f385fd + languageName: node + linkType: hard + +"matcher@npm:^5.0.0": + version: 5.0.0 + resolution: "matcher@npm:5.0.0" + dependencies: + escape-string-regexp: "npm:^5.0.0" + checksum: eda5471fc9d5b7264d63c81727824adc3585ddb5cfdc5fce5a9b7c86f946ff181610735d330b1c37a84811df872d1290bf4e9401d2be2a414204343701144b18 + languageName: node + linkType: hard + +"md5-hex@npm:^3.0.1": + version: 3.0.1 + resolution: "md5-hex@npm:3.0.1" + dependencies: + blueimp-md5: "npm:^2.10.0" + checksum: ee2b4d8da16b527b3a3fe4d7a96720f43afd07b46a82d49421208b5a126235fb75cfb30b80d4029514772c8844273f940bddfbf4155c787f968f3be4060d01e4 + languageName: node + linkType: hard + +"mem@npm:^9.0.2": + version: 9.0.2 + resolution: "mem@npm:9.0.2" + dependencies: + map-age-cleaner: "npm:^0.1.3" + mimic-fn: "npm:^4.0.0" + checksum: c2c56141399e520d8f0e50186bb7e4b49300b33984dc919682f3f13e53dec0e6608fbd327d5ae99494f45061a3a05a8ee04ccba6dcf795c3c215b5aa906eb41f + languageName: node + linkType: hard + +"merge-stream@npm:^2.0.0": + version: 2.0.0 + resolution: "merge-stream@npm:2.0.0" + checksum: 867fdbb30a6d58b011449b8885601ec1690c3e41c759ecd5a9d609094f7aed0096c37823ff4a7190ef0b8f22cc86beb7049196ff68c016e3b3c671d0dac91ce5 + languageName: node + linkType: hard + +"merge2@npm:^1.3.0, merge2@npm:^1.4.1": + version: 1.4.1 + resolution: "merge2@npm:1.4.1" + checksum: 254a8a4605b58f450308fc474c82ac9a094848081bf4c06778200207820e5193726dc563a0d2c16468810516a5c97d9d3ea0ca6585d23c58ccfff2403e8dbbeb + languageName: node + linkType: hard + +"micromatch@npm:^4.0.4": + version: 4.0.5 + resolution: "micromatch@npm:4.0.5" + dependencies: + braces: "npm:^3.0.2" + picomatch: "npm:^2.3.1" + checksum: 3d6505b20f9fa804af5d8c596cb1c5e475b9b0cd05f652c5b56141cf941bd72adaeb7a436fda344235cef93a7f29b7472efc779fcdb83b478eab0867b95cdeff + languageName: node + linkType: hard + +"mimic-fn@npm:^4.0.0": + version: 4.0.0 + resolution: "mimic-fn@npm:4.0.0" + checksum: de9cc32be9996fd941e512248338e43407f63f6d497abe8441fa33447d922e927de54d4cc3c1a3c6d652857acd770389d5a3823f311a744132760ce2be15ccbf + languageName: node + linkType: hard + +"mimic-response@npm:^3.1.0": + version: 3.1.0 + resolution: "mimic-response@npm:3.1.0" + checksum: 0d6f07ce6e03e9e4445bee655202153bdb8a98d67ee8dc965ac140900d7a2688343e6b4c9a72cfc9ef2f7944dfd76eef4ab2482eb7b293a68b84916bac735362 + languageName: node + linkType: hard + +"minimatch@npm:^3.1.1": + version: 3.1.2 + resolution: "minimatch@npm:3.1.2" + dependencies: + brace-expansion: "npm:^1.1.7" + checksum: 0262810a8fc2e72cca45d6fd86bd349eee435eb95ac6aa45c9ea2180e7ee875ef44c32b55b5973ceabe95ea12682f6e3725cbb63d7a2d1da3ae1163c8b210311 + languageName: node + linkType: hard + +"minimatch@npm:^9.0.1": + version: 9.0.3 + resolution: "minimatch@npm:9.0.3" + dependencies: + brace-expansion: "npm:^2.0.1" + checksum: 85f407dcd38ac3e180f425e86553911d101455ca3ad5544d6a7cec16286657e4f8a9aa6695803025c55e31e35a91a2252b5dc8e7d527211278b8b65b4dbd5eac + languageName: node + linkType: hard + +"minimist@npm:^1.2.0, minimist@npm:^1.2.3": + version: 1.2.8 + resolution: "minimist@npm:1.2.8" + checksum: 19d3fcdca050087b84c2029841a093691a91259a47def2f18222f41e7645a0b7c44ef4b40e88a1e58a40c84d2ef0ee6047c55594d298146d0eb3f6b737c20ce6 + languageName: node + linkType: hard + +"minipass-collect@npm:^1.0.2": + version: 1.0.2 + resolution: "minipass-collect@npm:1.0.2" + dependencies: + minipass: "npm:^3.0.0" + checksum: 8f82bd1f3095b24f53a991b04b67f4c710c894e518b813f0864a31de5570441a509be1ca17e0bb92b047591a8fdbeb886f502764fefb00d2f144f4011791e898 + languageName: node + linkType: hard + +"minipass-fetch@npm:^3.0.0": + version: 3.0.4 + resolution: "minipass-fetch@npm:3.0.4" + dependencies: + encoding: "npm:^0.1.13" + minipass: "npm:^7.0.3" + minipass-sized: "npm:^1.0.3" + minizlib: "npm:^2.1.2" + dependenciesMeta: + encoding: + optional: true + checksum: 1b63c1f3313e88eeac4689f1b71c9f086598db9a189400e3ee960c32ed89e06737fa23976c9305c2d57464fb3fcdc12749d3378805c9d6176f5569b0d0ee8a75 + languageName: node + linkType: hard + +"minipass-flush@npm:^1.0.5": + version: 1.0.5 + resolution: "minipass-flush@npm:1.0.5" + dependencies: + minipass: "npm:^3.0.0" + checksum: 2a51b63feb799d2bb34669205eee7c0eaf9dce01883261a5b77410c9408aa447e478efd191b4de6fc1101e796ff5892f8443ef20d9544385819093dbb32d36bd + languageName: node + linkType: hard + +"minipass-pipeline@npm:^1.2.4": + version: 1.2.4 + resolution: "minipass-pipeline@npm:1.2.4" + dependencies: + minipass: "npm:^3.0.0" + checksum: cbda57cea20b140b797505dc2cac71581a70b3247b84480c1fed5ca5ba46c25ecc25f68bfc9e6dcb1a6e9017dab5c7ada5eab73ad4f0a49d84e35093e0c643f2 + languageName: node + linkType: hard + +"minipass-sized@npm:^1.0.3": + version: 1.0.3 + resolution: "minipass-sized@npm:1.0.3" + dependencies: + minipass: "npm:^3.0.0" + checksum: 298f124753efdc745cfe0f2bdfdd81ba25b9f4e753ca4a2066eb17c821f25d48acea607dfc997633ee5bf7b6dfffb4eee4f2051eb168663f0b99fad2fa4829cb + languageName: node + linkType: hard + +"minipass@npm:^3.0.0": + version: 3.3.6 + resolution: "minipass@npm:3.3.6" + dependencies: + yallist: "npm:^4.0.0" + checksum: a114746943afa1dbbca8249e706d1d38b85ed1298b530f5808ce51f8e9e941962e2a5ad2e00eae7dd21d8a4aae6586a66d4216d1a259385e9d0358f0c1eba16c + languageName: node + linkType: hard + +"minipass@npm:^5.0.0": + version: 5.0.0 + resolution: "minipass@npm:5.0.0" + checksum: a91d8043f691796a8ac88df039da19933ef0f633e3d7f0d35dcd5373af49131cf2399bfc355f41515dc495e3990369c3858cd319e5c2722b4753c90bf3152462 + languageName: node + linkType: hard + +"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.2, minipass@npm:^7.0.3": + version: 7.0.4 + resolution: "minipass@npm:7.0.4" + checksum: 6c7370a6dfd257bf18222da581ba89a5eaedca10e158781232a8b5542a90547540b4b9b7e7f490e4cda43acfbd12e086f0453728ecf8c19e0ef6921bc5958ac5 + languageName: node + linkType: hard + +"minizlib@npm:^2.1.1, minizlib@npm:^2.1.2": + version: 2.1.2 + resolution: "minizlib@npm:2.1.2" + dependencies: + minipass: "npm:^3.0.0" + yallist: "npm:^4.0.0" + checksum: 64fae024e1a7d0346a1102bb670085b17b7f95bf6cfdf5b128772ec8faf9ea211464ea4add406a3a6384a7d87a0cd1a96263692134323477b4fb43659a6cab78 + languageName: node + linkType: hard + +"mkdirp-classic@npm:^0.5.2, mkdirp-classic@npm:^0.5.3": + version: 0.5.3 + resolution: "mkdirp-classic@npm:0.5.3" + checksum: 95371d831d196960ddc3833cc6907e6b8f67ac5501a6582f47dfae5eb0f092e9f8ce88e0d83afcae95d6e2b61a01741ba03714eeafb6f7a6e9dcc158ac85b168 + languageName: node + linkType: hard + +"mkdirp@npm:^1.0.3": + version: 1.0.4 + resolution: "mkdirp@npm:1.0.4" + bin: + mkdirp: bin/cmd.js + checksum: 46ea0f3ffa8bc6a5bc0c7081ffc3907777f0ed6516888d40a518c5111f8366d97d2678911ad1a6882bf592fa9de6c784fea32e1687bb94e1f4944170af48a5cf + languageName: node + linkType: hard + +"ms@npm:2.1.2": + version: 2.1.2 + resolution: "ms@npm:2.1.2" + checksum: a437714e2f90dbf881b5191d35a6db792efbca5badf112f87b9e1c712aace4b4b9b742dd6537f3edf90fd6f684de897cec230abde57e87883766712ddda297cc + languageName: node + linkType: hard + +"ms@npm:^2.1.3": + version: 2.1.3 + resolution: "ms@npm:2.1.3" + checksum: d924b57e7312b3b63ad21fc5b3dc0af5e78d61a1fc7cfb5457edaf26326bf62be5307cc87ffb6862ef1c2b33b0233cdb5d4f01c4c958cc0d660948b65a287a48 + languageName: node + linkType: hard + +"napi-build-utils@npm:^1.0.1": + version: 1.0.2 + resolution: "napi-build-utils@npm:1.0.2" + checksum: 37fd2cd0ff2ad20073ce78d83fd718a740d568b225924e753ae51cb69d68f330c80544d487e5e5bd18e28702ed2ca469c2424ad948becd1862c1b0209542b2e9 + languageName: node + linkType: hard + +"negotiator@npm:^0.6.3": + version: 0.6.3 + resolution: "negotiator@npm:0.6.3" + checksum: 3ec9fd413e7bf071c937ae60d572bc67155262068ed522cf4b3be5edbe6ddf67d095ec03a3a14ebf8fc8e95f8e1d61be4869db0dbb0de696f6b837358bd43fc2 + languageName: node + linkType: hard + +"node-abi@npm:^3.3.0": + version: 3.51.0 + resolution: "node-abi@npm:3.51.0" + dependencies: + semver: "npm:^7.3.5" + checksum: 2f0a56a9923bd21ff13650b6e8d2caebda211795761b40ae0ec3ea08e6687f6722535302cde87c928d6959a6afec196db3c54f8ae2db0bbaa401459dcf0f073c + languageName: node + linkType: hard + +"node-gyp@npm:latest": + version: 10.0.1 + resolution: "node-gyp@npm:10.0.1" + dependencies: + env-paths: "npm:^2.2.0" + exponential-backoff: "npm:^3.1.1" + glob: "npm:^10.3.10" + graceful-fs: "npm:^4.2.6" + make-fetch-happen: "npm:^13.0.0" + nopt: "npm:^7.0.0" + proc-log: "npm:^3.0.0" + semver: "npm:^7.3.5" + tar: "npm:^6.1.2" + which: "npm:^4.0.0" + bin: + node-gyp: bin/node-gyp.js + checksum: abddfff7d873312e4ed4a5fb75ce893a5c4fb69e7fcb1dfa71c28a6b92a7f1ef6b62790dffb39181b5a82728ba8f2f32d229cf8cbe66769fe02cea7db4a555aa + languageName: node + linkType: hard + +"nofilter@npm:^3.1.0": + version: 3.1.0 + resolution: "nofilter@npm:3.1.0" + checksum: 92459f3864a067b347032263f0b536223cbfc98153913b5dce350cb39c8470bc1813366e41993f22c33cc6400c0f392aa324a4b51e24c22040635c1cdb046499 + languageName: node + linkType: hard + +"nopt@npm:^7.0.0": + version: 7.2.0 + resolution: "nopt@npm:7.2.0" + dependencies: + abbrev: "npm:^2.0.0" + bin: + nopt: bin/nopt.js + checksum: 9bd7198df6f16eb29ff16892c77bcf7f0cc41f9fb5c26280ac0def2cf8cf319f3b821b3af83eba0e74c85807cc430a16efe0db58fe6ae1f41e69519f585b6aff + languageName: node + linkType: hard + +"normalize-path@npm:^3.0.0, normalize-path@npm:~3.0.0": + version: 3.0.0 + resolution: "normalize-path@npm:3.0.0" + checksum: e008c8142bcc335b5e38cf0d63cfd39d6cf2d97480af9abdbe9a439221fd4d749763bab492a8ee708ce7a194bb00c9da6d0a115018672310850489137b3da046 + languageName: node + linkType: hard + +"npm-run-path@npm:^5.1.0": + version: 5.1.0 + resolution: "npm-run-path@npm:5.1.0" + dependencies: + path-key: "npm:^4.0.0" + checksum: ff6d77514489f47fa1c3b1311d09cd4b6d09a874cc1866260f9dea12cbaabda0436ed7f8c2ee44d147bf99a3af29307c6f63b0f83d242b0b6b0ab25dff2629e3 + languageName: node + linkType: hard + +"once@npm:^1.3.0, once@npm:^1.3.1, once@npm:^1.4.0": + version: 1.4.0 + resolution: "once@npm:1.4.0" + dependencies: + wrappy: "npm:1" + checksum: 5d48aca287dfefabd756621c5dfce5c91a549a93e9fdb7b8246bc4c4790aa2ec17b34a260530474635147aeb631a2dcc8b32c613df0675f96041cbb8244517d0 + languageName: node + linkType: hard + +"onetime@npm:^6.0.0": + version: 6.0.0 + resolution: "onetime@npm:6.0.0" + dependencies: + mimic-fn: "npm:^4.0.0" + checksum: 4eef7c6abfef697dd4479345a4100c382d73c149d2d56170a54a07418c50816937ad09500e1ed1e79d235989d073a9bade8557122aee24f0576ecde0f392bb6c + languageName: node + linkType: hard + +"p-defer@npm:^1.0.0": + version: 1.0.0 + resolution: "p-defer@npm:1.0.0" + checksum: ed603c3790e74b061ac2cb07eb6e65802cf58dce0fbee646c113a7b71edb711101329ad38f99e462bd2e343a74f6e9366b496a35f1d766c187084d3109900487 + languageName: node + linkType: hard + +"p-event@npm:^5.0.1": + version: 5.0.1 + resolution: "p-event@npm:5.0.1" + dependencies: + p-timeout: "npm:^5.0.2" + checksum: 2317171489537f316661fa863f3bb711b2ceb89182937238422cec10223cbb958c432d6c26a238446a622d788187bdd295b1d8ecedbe2e467e045930d60202b0 + languageName: node + linkType: hard + +"p-limit@npm:^4.0.0": + version: 4.0.0 + resolution: "p-limit@npm:4.0.0" + dependencies: + yocto-queue: "npm:^1.0.0" + checksum: a56af34a77f8df2ff61ddfb29431044557fcbcb7642d5a3233143ebba805fc7306ac1d448de724352861cb99de934bc9ab74f0d16fe6a5460bdbdf938de875ad + languageName: node + linkType: hard + +"p-locate@npm:^6.0.0": + version: 6.0.0 + resolution: "p-locate@npm:6.0.0" + dependencies: + p-limit: "npm:^4.0.0" + checksum: d72fa2f41adce59c198270aa4d3c832536c87a1806e0f69dffb7c1a7ca998fb053915ca833d90f166a8c082d3859eabfed95f01698a3214c20df6bb8de046312 + languageName: node + linkType: hard + +"p-map@npm:^4.0.0": + version: 4.0.0 + resolution: "p-map@npm:4.0.0" + dependencies: + aggregate-error: "npm:^3.0.0" + checksum: 592c05bd6262c466ce269ff172bb8de7c6975afca9b50c975135b974e9bdaafbfe80e61aaaf5be6d1200ba08b30ead04b88cfa7e25ff1e3b93ab28c9f62a2c75 + languageName: node + linkType: hard + +"p-map@npm:^5.5.0": + version: 5.5.0 + resolution: "p-map@npm:5.5.0" + dependencies: + aggregate-error: "npm:^4.0.0" + checksum: 410bce846b1e3db6bb2ccab6248372ecf4e635fc2b31331c8f56478e73fec9e146e8b4547585e635703160a3d252a6a65b8f855834aebc2c3408eb5789630cc4 + languageName: node + linkType: hard + +"p-timeout@npm:^5.0.2": + version: 5.1.0 + resolution: "p-timeout@npm:5.1.0" + checksum: 1b026cf9d5878c64bec4341ca9cda8ec6b8b3aea8a57885ca0fe2b35753a20d767fb6f9d3aa41e1252f42bc95432c05ea33b6b18f271fb10bfb0789591850a41 + languageName: node + linkType: hard + +"parse-ms@npm:^3.0.0": + version: 3.0.0 + resolution: "parse-ms@npm:3.0.0" + checksum: 056b4a32a9d3749f3f4cfffefb45c45540491deaa8e1d8ad43c2ddde7ba04edd076bd1b298f521238bb5fb084a9b2c4a2ebb78aefa651afbc4c2b0af4232fc54 + languageName: node + linkType: hard + +"path-exists@npm:^5.0.0": + version: 5.0.0 + resolution: "path-exists@npm:5.0.0" + checksum: b170f3060b31604cde93eefdb7392b89d832dfbc1bed717c9718cbe0f230c1669b7e75f87e19901da2250b84d092989a0f9e44d2ef41deb09aa3ad28e691a40a + languageName: node + linkType: hard + +"path-is-absolute@npm:^1.0.0": + version: 1.0.1 + resolution: "path-is-absolute@npm:1.0.1" + checksum: 127da03c82172a2a50099cddbf02510c1791fc2cc5f7713ddb613a56838db1e8168b121a920079d052e0936c23005562059756d653b7c544c53185efe53be078 + languageName: node + linkType: hard + +"path-key@npm:^3.1.0": + version: 3.1.1 + resolution: "path-key@npm:3.1.1" + checksum: 748c43efd5a569c039d7a00a03b58eecd1d75f3999f5a28303d75f521288df4823bc057d8784eb72358b2895a05f29a070bc9f1f17d28226cc4e62494cc58c4c + languageName: node + linkType: hard + +"path-key@npm:^4.0.0": + version: 4.0.0 + resolution: "path-key@npm:4.0.0" + checksum: 794efeef32863a65ac312f3c0b0a99f921f3e827ff63afa5cb09a377e202c262b671f7b3832a4e64731003fa94af0263713962d317b9887bd1e0c48a342efba3 + languageName: node + linkType: hard + +"path-scurry@npm:^1.10.1": + version: 1.10.1 + resolution: "path-scurry@npm:1.10.1" + dependencies: + lru-cache: "npm:^9.1.1 || ^10.0.0" + minipass: "npm:^5.0.0 || ^6.0.2 || ^7.0.0" + checksum: e5dc78a7348d25eec61ab166317e9e9c7b46818aa2c2b9006c507a6ff48c672d011292d9662527213e558f5652ce0afcc788663a061d8b59ab495681840c0c1e + languageName: node + linkType: hard + +"path-type@npm:^4.0.0": + version: 4.0.0 + resolution: "path-type@npm:4.0.0" + checksum: 666f6973f332f27581371efaf303fd6c272cc43c2057b37aa99e3643158c7e4b2626549555d88626e99ea9e046f82f32e41bbde5f1508547e9a11b149b52387c + languageName: node + linkType: hard + +"picomatch@npm:^2.0.4, picomatch@npm:^2.2.1, picomatch@npm:^2.3.1": + version: 2.3.1 + resolution: "picomatch@npm:2.3.1" + checksum: 26c02b8d06f03206fc2ab8d16f19960f2ff9e81a658f831ecb656d8f17d9edc799e8364b1f4a7873e89d9702dff96204be0fa26fe4181f6843f040f819dac4be + languageName: node + linkType: hard + +"pkg-conf@npm:^4.0.0": + version: 4.0.0 + resolution: "pkg-conf@npm:4.0.0" + dependencies: + find-up: "npm:^6.0.0" + load-json-file: "npm:^7.0.0" + checksum: 27d027609f27228edcde121f6f707b4ba1f5488e95e98f2e58652ae4e99792081bd1de67d591f4a0f05b02c0b66d745591d49f82041cbc8d41e2238ef5d73eb4 + languageName: node + linkType: hard + +"plur@npm:^5.1.0": + version: 5.1.0 + resolution: "plur@npm:5.1.0" + dependencies: + irregular-plurals: "npm:^3.3.0" + checksum: 26bb622b8545fcfd47bbf56fbcca66c08693708a232e403fa3589e00003c56c14231ac57c7588ca5db83ef4be1f61383402c4ea954000768f779f8aef6eb6da8 + languageName: node + linkType: hard + +"prebuild-install@npm:^7.1.1": + version: 7.1.1 + resolution: "prebuild-install@npm:7.1.1" + dependencies: + detect-libc: "npm:^2.0.0" + expand-template: "npm:^2.0.3" + github-from-package: "npm:0.0.0" + minimist: "npm:^1.2.3" + mkdirp-classic: "npm:^0.5.3" + napi-build-utils: "npm:^1.0.1" + node-abi: "npm:^3.3.0" + pump: "npm:^3.0.0" + rc: "npm:^1.2.7" + simple-get: "npm:^4.0.0" + tar-fs: "npm:^2.0.0" + tunnel-agent: "npm:^0.6.0" + bin: + prebuild-install: bin.js + checksum: 6dc70f36b0f4adcb2fe0ed38d874ab28b571fb1a9725d769e8ba3f64a15831e58462de09f3e6e64569bcc4a3e03b9328b56faa0d45fe10ae1574478814536c76 + languageName: node + linkType: hard + +"pretty-ms@npm:^8.0.0": + version: 8.0.0 + resolution: "pretty-ms@npm:8.0.0" + dependencies: + parse-ms: "npm:^3.0.0" + checksum: e960d633ecca45445cf5c6dffc0f5e4bef6744c92449ab0e8c6c704800675ab71e181c5e02ece5265e02137a33e313d3f3e355fbf8ea30b4b5b23de423329f8d + languageName: node + linkType: hard + +"proc-log@npm:^3.0.0": + version: 3.0.0 + resolution: "proc-log@npm:3.0.0" + checksum: f66430e4ff947dbb996058f6fd22de2c66612ae1a89b097744e17fb18a4e8e7a86db99eda52ccf15e53f00b63f4ec0b0911581ff2aac0355b625c8eac509b0dc + languageName: node + linkType: hard + +"promise-retry@npm:^2.0.1": + version: 2.0.1 + resolution: "promise-retry@npm:2.0.1" + dependencies: + err-code: "npm:^2.0.2" + retry: "npm:^0.12.0" + checksum: 9c7045a1a2928094b5b9b15336dcd2a7b1c052f674550df63cc3f36cd44028e5080448175b6f6ca32b642de81150f5e7b1a98b728f15cb069f2dd60ac2616b96 + languageName: node + linkType: hard + +"pump@npm:^3.0.0": + version: 3.0.0 + resolution: "pump@npm:3.0.0" + dependencies: + end-of-stream: "npm:^1.1.0" + once: "npm:^1.3.1" + checksum: bbdeda4f747cdf47db97428f3a135728669e56a0ae5f354a9ac5b74556556f5446a46f720a8f14ca2ece5be9b4d5d23c346db02b555f46739934cc6c093a5478 + languageName: node + linkType: hard + +"queue-microtask@npm:^1.2.2": + version: 1.2.3 + resolution: "queue-microtask@npm:1.2.3" + checksum: 900a93d3cdae3acd7d16f642c29a642aea32c2026446151f0778c62ac089d4b8e6c986811076e1ae180a694cedf077d453a11b58ff0a865629a4f82ab558e102 + languageName: node + linkType: hard + +"rc@npm:^1.2.7": + version: 1.2.8 + resolution: "rc@npm:1.2.8" + dependencies: + deep-extend: "npm:^0.6.0" + ini: "npm:~1.3.0" + minimist: "npm:^1.2.0" + strip-json-comments: "npm:~2.0.1" + bin: + rc: ./cli.js + checksum: 24a07653150f0d9ac7168e52943cc3cb4b7a22c0e43c7dff3219977c2fdca5a2760a304a029c20811a0e79d351f57d46c9bde216193a0f73978496afc2b85b15 + languageName: node + linkType: hard + +"readable-stream@npm:^3.1.1, readable-stream@npm:^3.4.0": + version: 3.6.2 + resolution: "readable-stream@npm:3.6.2" + dependencies: + inherits: "npm:^2.0.3" + string_decoder: "npm:^1.1.1" + util-deprecate: "npm:^1.0.1" + checksum: e37be5c79c376fdd088a45fa31ea2e423e5d48854be7a22a58869b4e84d25047b193f6acb54f1012331e1bcd667ffb569c01b99d36b0bd59658fb33f513511b7 + languageName: node + linkType: hard + +"readdirp@npm:~3.6.0": + version: 3.6.0 + resolution: "readdirp@npm:3.6.0" + dependencies: + picomatch: "npm:^2.2.1" + checksum: 6fa848cf63d1b82ab4e985f4cf72bd55b7dcfd8e0a376905804e48c3634b7e749170940ba77b32804d5fe93b3cc521aa95a8d7e7d725f830da6d93f3669ce66b + languageName: node + linkType: hard + +"require-directory@npm:^2.1.1": + version: 2.1.1 + resolution: "require-directory@npm:2.1.1" + checksum: 83aa76a7bc1531f68d92c75a2ca2f54f1b01463cb566cf3fbc787d0de8be30c9dbc211d1d46be3497dac5785fe296f2dd11d531945ac29730643357978966e99 + languageName: node + linkType: hard + +"resolve-cwd@npm:^3.0.0": + version: 3.0.0 + resolution: "resolve-cwd@npm:3.0.0" + dependencies: + resolve-from: "npm:^5.0.0" + checksum: e608a3ebd15356264653c32d7ecbc8fd702f94c6703ea4ac2fb81d9c359180cba0ae2e6b71faa446631ed6145454d5a56b227efc33a2d40638ac13f8beb20ee4 + languageName: node + linkType: hard + +"resolve-from@npm:^5.0.0": + version: 5.0.0 + resolution: "resolve-from@npm:5.0.0" + checksum: b21cb7f1fb746de8107b9febab60095187781137fd803e6a59a76d421444b1531b641bba5857f5dc011974d8a5c635d61cec49e6bd3b7fc20e01f0fafc4efbf2 + languageName: node + linkType: hard + +"retry@npm:^0.12.0": + version: 0.12.0 + resolution: "retry@npm:0.12.0" + checksum: 59933e8501727ba13ad73ef4a04d5280b3717fd650408460c987392efe9d7be2040778ed8ebe933c5cbd63da3dcc37919c141ef8af0a54a6e4fca5a2af177bfe + languageName: node + linkType: hard + +"reusify@npm:^1.0.4": + version: 1.0.4 + resolution: "reusify@npm:1.0.4" + checksum: c19ef26e4e188f408922c46f7ff480d38e8dfc55d448310dfb518736b23ed2c4f547fb64a6ed5bdba92cd7e7ddc889d36ff78f794816d5e71498d645ef476107 + languageName: node + linkType: hard + +"rimraf@npm:^3.0.0": + version: 3.0.2 + resolution: "rimraf@npm:3.0.2" + dependencies: + glob: "npm:^7.1.3" + bin: + rimraf: bin.js + checksum: 9cb7757acb489bd83757ba1a274ab545eafd75598a9d817e0c3f8b164238dd90eba50d6b848bd4dcc5f3040912e882dc7ba71653e35af660d77b25c381d402e8 + languageName: node + linkType: hard + +"root-workspace-0b6124@workspace:.": + version: 0.0.0-use.local + resolution: "root-workspace-0b6124@workspace:." + dependencies: + "@endo/zip": "npm:^0.2.35" + ava: "npm:^5.3.1" + better-sqlite3: "npm:^8.5.1" + execa: "npm:^7.2.0" + tmp: "npm:^0.2.1" + languageName: unknown + linkType: soft + +"run-parallel@npm:^1.1.9": + version: 1.2.0 + resolution: "run-parallel@npm:1.2.0" + dependencies: + queue-microtask: "npm:^1.2.2" + checksum: 200b5ab25b5b8b7113f9901bfe3afc347e19bb7475b267d55ad0eb86a62a46d77510cb0f232507c9e5d497ebda569a08a9867d0d14f57a82ad5564d991588b39 + languageName: node + linkType: hard + +"safe-buffer@npm:^5.0.1, safe-buffer@npm:~5.2.0": + version: 5.2.1 + resolution: "safe-buffer@npm:5.2.1" + checksum: 6501914237c0a86e9675d4e51d89ca3c21ffd6a31642efeba25ad65720bce6921c9e7e974e5be91a786b25aa058b5303285d3c15dbabf983a919f5f630d349f3 + languageName: node + linkType: hard + +"safer-buffer@npm:>= 2.1.2 < 3.0.0": + version: 2.1.2 + resolution: "safer-buffer@npm:2.1.2" + checksum: 7e3c8b2e88a1841c9671094bbaeebd94448111dd90a81a1f606f3f67708a6ec57763b3b47f06da09fc6054193e0e6709e77325415dc8422b04497a8070fa02d4 + languageName: node + linkType: hard + +"semver@npm:^7.3.2, semver@npm:^7.3.5": + version: 7.5.4 + resolution: "semver@npm:7.5.4" + dependencies: + lru-cache: "npm:^6.0.0" + bin: + semver: bin/semver.js + checksum: 5160b06975a38b11c1ab55950cb5b8a23db78df88275d3d8a42ccf1f29e55112ac995b3a26a522c36e3b5f76b0445f1eef70d696b8c7862a2b4303d7b0e7609e + languageName: node + linkType: hard + +"serialize-error@npm:^7.0.1": + version: 7.0.1 + resolution: "serialize-error@npm:7.0.1" + dependencies: + type-fest: "npm:^0.13.1" + checksum: 7982937d578cd901276c8ab3e2c6ed8a4c174137730f1fb0402d005af209a0e84d04acc874e317c936724c7b5b26c7a96ff7e4b8d11a469f4924a4b0ea814c05 + languageName: node + linkType: hard + +"shebang-command@npm:^2.0.0": + version: 2.0.0 + resolution: "shebang-command@npm:2.0.0" + dependencies: + shebang-regex: "npm:^3.0.0" + checksum: a41692e7d89a553ef21d324a5cceb5f686d1f3c040759c50aab69688634688c5c327f26f3ecf7001ebfd78c01f3c7c0a11a7c8bfd0a8bc9f6240d4f40b224e4e + languageName: node + linkType: hard + +"shebang-regex@npm:^3.0.0": + version: 3.0.0 + resolution: "shebang-regex@npm:3.0.0" + checksum: 1dbed0726dd0e1152a92696c76c7f06084eb32a90f0528d11acd764043aacf76994b2fb30aa1291a21bd019d6699164d048286309a278855ee7bec06cf6fb690 + languageName: node + linkType: hard + +"signal-exit@npm:^3.0.7": + version: 3.0.7 + resolution: "signal-exit@npm:3.0.7" + checksum: 25d272fa73e146048565e08f3309d5b942c1979a6f4a58a8c59d5fa299728e9c2fcd1a759ec870863b1fd38653670240cd420dad2ad9330c71f36608a6a1c912 + languageName: node + linkType: hard + +"signal-exit@npm:^4.0.1": + version: 4.1.0 + resolution: "signal-exit@npm:4.1.0" + checksum: 41602dce540e46d599edba9d9860193398d135f7ff72cab629db5171516cfae628d21e7bfccde1bbfdf11c48726bc2a6d1a8fb8701125852fbfda7cf19c6aa83 + languageName: node + linkType: hard + +"simple-concat@npm:^1.0.0": + version: 1.0.1 + resolution: "simple-concat@npm:1.0.1" + checksum: 62f7508e674414008910b5397c1811941d457dfa0db4fd5aa7fa0409eb02c3609608dfcd7508cace75b3a0bf67a2a77990711e32cd213d2c76f4fd12ee86d776 + languageName: node + linkType: hard + +"simple-get@npm:^4.0.0": + version: 4.0.1 + resolution: "simple-get@npm:4.0.1" + dependencies: + decompress-response: "npm:^6.0.0" + once: "npm:^1.3.1" + simple-concat: "npm:^1.0.0" + checksum: b0649a581dbca741babb960423248899203165769747142033479a7dc5e77d7b0fced0253c731cd57cf21e31e4d77c9157c3069f4448d558ebc96cf9e1eebcf0 + languageName: node + linkType: hard + +"slash@npm:^4.0.0": + version: 4.0.0 + resolution: "slash@npm:4.0.0" + checksum: b522ca75d80d107fd30d29df0549a7b2537c83c4c4ecd12cd7d4ea6c8aaca2ab17ada002e7a1d78a9d736a0261509f26ea5b489082ee443a3a810586ef8eff18 + languageName: node + linkType: hard + +"slice-ansi@npm:^5.0.0": + version: 5.0.0 + resolution: "slice-ansi@npm:5.0.0" + dependencies: + ansi-styles: "npm:^6.0.0" + is-fullwidth-code-point: "npm:^4.0.0" + checksum: 2d4d40b2a9d5cf4e8caae3f698fe24ae31a4d778701724f578e984dcb485ec8c49f0c04dab59c401821e80fcdfe89cace9c66693b0244e40ec485d72e543914f + languageName: node + linkType: hard + +"smart-buffer@npm:^4.2.0": + version: 4.2.0 + resolution: "smart-buffer@npm:4.2.0" + checksum: a16775323e1404dd43fabafe7460be13a471e021637bc7889468eb45ce6a6b207261f454e4e530a19500cc962c4cc5348583520843b363f4193cee5c00e1e539 + languageName: node + linkType: hard + +"socks-proxy-agent@npm:^8.0.1": + version: 8.0.2 + resolution: "socks-proxy-agent@npm:8.0.2" + dependencies: + agent-base: "npm:^7.0.2" + debug: "npm:^4.3.4" + socks: "npm:^2.7.1" + checksum: a842402fc9b8848a31367f2811ca3cd14c4106588b39a0901cd7a69029998adfc6456b0203617c18ed090542ad0c24ee4e9d4c75a0c4b75071e214227c177eb7 + languageName: node + linkType: hard + +"socks@npm:^2.7.1": + version: 2.7.1 + resolution: "socks@npm:2.7.1" + dependencies: + ip: "npm:^2.0.0" + smart-buffer: "npm:^4.2.0" + checksum: 43f69dbc9f34fc8220bc51c6eea1c39715ab3cfdb115d6e3285f6c7d1a603c5c75655668a5bbc11e3c7e2c99d60321fb8d7ab6f38cda6a215fadd0d6d0b52130 + languageName: node + linkType: hard + +"sprintf-js@npm:~1.0.2": + version: 1.0.3 + resolution: "sprintf-js@npm:1.0.3" + checksum: ecadcfe4c771890140da5023d43e190b7566d9cf8b2d238600f31bec0fc653f328da4450eb04bd59a431771a8e9cc0e118f0aa3974b683a4981b4e07abc2a5bb + languageName: node + linkType: hard + +"ssri@npm:^10.0.0": + version: 10.0.5 + resolution: "ssri@npm:10.0.5" + dependencies: + minipass: "npm:^7.0.3" + checksum: b091f2ae92474183c7ac5ed3f9811457e1df23df7a7e70c9476eaa9a0c4a0c8fc190fb45acefbf023ca9ee864dd6754237a697dc52a0fb182afe65d8e77443d8 + languageName: node + linkType: hard + +"stack-utils@npm:^2.0.6": + version: 2.0.6 + resolution: "stack-utils@npm:2.0.6" + dependencies: + escape-string-regexp: "npm:^2.0.0" + checksum: 651c9f87667e077584bbe848acaecc6049bc71979f1e9a46c7b920cad4431c388df0f51b8ad7cfd6eed3db97a2878d0fc8b3122979439ea8bac29c61c95eec8a + languageName: node + linkType: hard + +"string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^4.1.0, string-width@npm:^4.2.0, string-width@npm:^4.2.3": + version: 4.2.3 + resolution: "string-width@npm:4.2.3" + dependencies: + emoji-regex: "npm:^8.0.0" + is-fullwidth-code-point: "npm:^3.0.0" + strip-ansi: "npm:^6.0.1" + checksum: 1e525e92e5eae0afd7454086eed9c818ee84374bb80328fc41217ae72ff5f065ef1c9d7f72da41de40c75fa8bb3dee63d92373fd492c84260a552c636392a47b + languageName: node + linkType: hard + +"string-width@npm:^5.0.0, string-width@npm:^5.0.1, string-width@npm:^5.1.2": + version: 5.1.2 + resolution: "string-width@npm:5.1.2" + dependencies: + eastasianwidth: "npm:^0.2.0" + emoji-regex: "npm:^9.2.2" + strip-ansi: "npm:^7.0.1" + checksum: ab9c4264443d35b8b923cbdd513a089a60de339216d3b0ed3be3ba57d6880e1a192b70ae17225f764d7adbf5994e9bb8df253a944736c15a0240eff553c678ca + languageName: node + linkType: hard + +"string_decoder@npm:^1.1.1": + version: 1.3.0 + resolution: "string_decoder@npm:1.3.0" + dependencies: + safe-buffer: "npm:~5.2.0" + checksum: 810614ddb030e271cd591935dcd5956b2410dd079d64ff92a1844d6b7588bf992b3e1b69b0f4d34a3e06e0bd73046ac646b5264c1987b20d0601f81ef35d731d + languageName: node + linkType: hard + +"strip-ansi-cjs@npm:strip-ansi@^6.0.1, strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": + version: 6.0.1 + resolution: "strip-ansi@npm:6.0.1" + dependencies: + ansi-regex: "npm:^5.0.1" + checksum: 1ae5f212a126fe5b167707f716942490e3933085a5ff6c008ab97ab2f272c8025d3aa218b7bd6ab25729ca20cc81cddb252102f8751e13482a5199e873680952 + languageName: node + linkType: hard + +"strip-ansi@npm:^7.0.1": + version: 7.1.0 + resolution: "strip-ansi@npm:7.1.0" + dependencies: + ansi-regex: "npm:^6.0.1" + checksum: a198c3762e8832505328cbf9e8c8381de14a4fa50a4f9b2160138158ea88c0f5549fb50cb13c651c3088f47e63a108b34622ec18c0499b6c8c3a5ddf6b305ac4 + languageName: node + linkType: hard + +"strip-final-newline@npm:^3.0.0": + version: 3.0.0 + resolution: "strip-final-newline@npm:3.0.0" + checksum: a771a17901427bac6293fd416db7577e2bc1c34a19d38351e9d5478c3c415f523f391003b42ed475f27e33a78233035df183525395f731d3bfb8cdcbd4da08ce + languageName: node + linkType: hard + +"strip-json-comments@npm:~2.0.1": + version: 2.0.1 + resolution: "strip-json-comments@npm:2.0.1" + checksum: b509231cbdee45064ff4f9fd73609e2bcc4e84a4d508e9dd0f31f70356473fde18abfb5838c17d56fb236f5a06b102ef115438de0600b749e818a35fbbc48c43 + languageName: node + linkType: hard + +"supertap@npm:^3.0.1": + version: 3.0.1 + resolution: "supertap@npm:3.0.1" + dependencies: + indent-string: "npm:^5.0.0" + js-yaml: "npm:^3.14.1" + serialize-error: "npm:^7.0.1" + strip-ansi: "npm:^7.0.1" + checksum: 8164674f2e280cab875f0fef5bb36c15553c13e29697ff92f4e0d6bc62149f0303a89eee47535413ed145ea72e14a24d065bab233059d48a499ec5ebb4566b0f + languageName: node + linkType: hard + +"tar-fs@npm:^2.0.0": + version: 2.1.1 + resolution: "tar-fs@npm:2.1.1" + dependencies: + chownr: "npm:^1.1.1" + mkdirp-classic: "npm:^0.5.2" + pump: "npm:^3.0.0" + tar-stream: "npm:^2.1.4" + checksum: 871d26a934bfb7beeae4c4d8a09689f530b565f79bd0cf489823ff0efa3705da01278160da10bb006d1a793fa0425cf316cec029b32a9159eacbeaff4965fb6d + languageName: node + linkType: hard + +"tar-stream@npm:^2.1.4": + version: 2.2.0 + resolution: "tar-stream@npm:2.2.0" + dependencies: + bl: "npm:^4.0.3" + end-of-stream: "npm:^1.4.1" + fs-constants: "npm:^1.0.0" + inherits: "npm:^2.0.3" + readable-stream: "npm:^3.1.1" + checksum: 2f4c910b3ee7196502e1ff015a7ba321ec6ea837667220d7bcb8d0852d51cb04b87f7ae471008a6fb8f5b1a1b5078f62f3a82d30c706f20ada1238ac797e7692 + languageName: node + linkType: hard + +"tar@npm:^6.1.11, tar@npm:^6.1.2": + version: 6.2.0 + resolution: "tar@npm:6.2.0" + dependencies: + chownr: "npm:^2.0.0" + fs-minipass: "npm:^2.0.0" + minipass: "npm:^5.0.0" + minizlib: "npm:^2.1.1" + mkdirp: "npm:^1.0.3" + yallist: "npm:^4.0.0" + checksum: 02ca064a1a6b4521fef88c07d389ac0936730091f8c02d30ea60d472e0378768e870769ab9e986d87807bfee5654359cf29ff4372746cc65e30cbddc352660d8 + languageName: node + linkType: hard + +"temp-dir@npm:^3.0.0": + version: 3.0.0 + resolution: "temp-dir@npm:3.0.0" + checksum: a86978a400984cd5f315b77ebf3fe53bb58c61f192278cafcb1f3fb32d584a21dc8e08b93171d7874b7cc972234d3455c467306cc1bfc4524b622e5ad3bfd671 + languageName: node + linkType: hard + +"time-zone@npm:^1.0.0": + version: 1.0.0 + resolution: "time-zone@npm:1.0.0" + checksum: d00ebd885039109011b6e2423ebbf225160927333c2ade6d833e9cc4676db20759f1f3855fafde00d1bd668c243a6aa68938ce71fe58aab0d514e820d59c1d81 + languageName: node + linkType: hard + +"tmp@npm:^0.2.1": + version: 0.2.1 + resolution: "tmp@npm:0.2.1" + dependencies: + rimraf: "npm:^3.0.0" + checksum: 67607aa012059c9ce697bee820ee51bc0f39b29a8766def4f92d3f764d67c7cf9205d537d24e0cb1ce9685c40d4c628ead010910118ea18348666b5c46ed9123 + languageName: node + linkType: hard + +"to-regex-range@npm:^5.0.1": + version: 5.0.1 + resolution: "to-regex-range@npm:5.0.1" + dependencies: + is-number: "npm:^7.0.0" + checksum: 487988b0a19c654ff3e1961b87f471702e708fa8a8dd02a298ef16da7206692e8552a0250e8b3e8759270f62e9d8314616f6da274734d3b558b1fc7b7724e892 + languageName: node + linkType: hard + +"tunnel-agent@npm:^0.6.0": + version: 0.6.0 + resolution: "tunnel-agent@npm:0.6.0" + dependencies: + safe-buffer: "npm:^5.0.1" + checksum: 4c7a1b813e7beae66fdbf567a65ec6d46313643753d0beefb3c7973d66fcec3a1e7f39759f0a0b4465883499c6dc8b0750ab8b287399af2e583823e40410a17a + languageName: node + linkType: hard + +"type-fest@npm:^0.13.1": + version: 0.13.1 + resolution: "type-fest@npm:0.13.1" + checksum: 0c0fa07ae53d4e776cf4dac30d25ad799443e9eef9226f9fddbb69242db86b08584084a99885cfa5a9dfe4c063ebdc9aa7b69da348e735baede8d43f1aeae93b + languageName: node + linkType: hard + +"unique-filename@npm:^3.0.0": + version: 3.0.0 + resolution: "unique-filename@npm:3.0.0" + dependencies: + unique-slug: "npm:^4.0.0" + checksum: 6363e40b2fa758eb5ec5e21b3c7fb83e5da8dcfbd866cc0c199d5534c42f03b9ea9ab069769cc388e1d7ab93b4eeef28ef506ab5f18d910ef29617715101884f + languageName: node + linkType: hard + +"unique-slug@npm:^4.0.0": + version: 4.0.0 + resolution: "unique-slug@npm:4.0.0" + dependencies: + imurmurhash: "npm:^0.1.4" + checksum: cb811d9d54eb5821b81b18205750be84cb015c20a4a44280794e915f5a0a70223ce39066781a354e872df3572e8155c228f43ff0cce94c7cbf4da2cc7cbdd635 + languageName: node + linkType: hard + +"util-deprecate@npm:^1.0.1": + version: 1.0.2 + resolution: "util-deprecate@npm:1.0.2" + checksum: 41a5bdd214df2f6c3ecf8622745e4a366c4adced864bc3c833739791aeeeb1838119af7daed4ba36428114b5c67dcda034a79c882e97e43c03e66a4dd7389942 + languageName: node + linkType: hard + +"well-known-symbols@npm:^2.0.0": + version: 2.0.0 + resolution: "well-known-symbols@npm:2.0.0" + checksum: cb6c12e98877e8952ec28d13ae6f4fdb54ae1cb49b16a728720276dadd76c930e6cb0e174af3a4620054dd2752546f842540122920c6e31410208abd4958ee6b + languageName: node + linkType: hard + +"which@npm:^2.0.1": + version: 2.0.2 + resolution: "which@npm:2.0.2" + dependencies: + isexe: "npm:^2.0.0" + bin: + node-which: ./bin/node-which + checksum: 66522872a768b60c2a65a57e8ad184e5372f5b6a9ca6d5f033d4b0dc98aff63995655a7503b9c0a2598936f532120e81dd8cc155e2e92ed662a2b9377cc4374f + languageName: node + linkType: hard + +"which@npm:^4.0.0": + version: 4.0.0 + resolution: "which@npm:4.0.0" + dependencies: + isexe: "npm:^3.1.1" + bin: + node-which: bin/which.js + checksum: 449fa5c44ed120ccecfe18c433296a4978a7583bf2391c50abce13f76878d2476defde04d0f79db8165bdf432853c1f8389d0485ca6e8ebce3bbcded513d5e6a + languageName: node + linkType: hard + +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0, wrap-ansi@npm:^7.0.0": + version: 7.0.0 + resolution: "wrap-ansi@npm:7.0.0" + dependencies: + ansi-styles: "npm:^4.0.0" + string-width: "npm:^4.1.0" + strip-ansi: "npm:^6.0.0" + checksum: d15fc12c11e4cbc4044a552129ebc75ee3f57aa9c1958373a4db0292d72282f54373b536103987a4a7594db1ef6a4f10acf92978f79b98c49306a4b58c77d4da + languageName: node + linkType: hard + +"wrap-ansi@npm:^8.1.0": + version: 8.1.0 + resolution: "wrap-ansi@npm:8.1.0" + dependencies: + ansi-styles: "npm:^6.1.0" + string-width: "npm:^5.0.1" + strip-ansi: "npm:^7.0.1" + checksum: 138ff58a41d2f877eae87e3282c0630fc2789012fc1af4d6bd626eeb9a2f9a65ca92005e6e69a75c7b85a68479fe7443c7dbe1eb8fbaa681a4491364b7c55c60 + languageName: node + linkType: hard + +"wrappy@npm:1": + version: 1.0.2 + resolution: "wrappy@npm:1.0.2" + checksum: 56fece1a4018c6a6c8e28fbc88c87e0fbf4ea8fd64fc6c63b18f4acc4bd13e0ad2515189786dd2c30d3eec9663d70f4ecf699330002f8ccb547e4a18231fc9f0 + languageName: node + linkType: hard + +"write-file-atomic@npm:^5.0.1": + version: 5.0.1 + resolution: "write-file-atomic@npm:5.0.1" + dependencies: + imurmurhash: "npm:^0.1.4" + signal-exit: "npm:^4.0.1" + checksum: e8c850a8e3e74eeadadb8ad23c9d9d63e4e792bd10f4836ed74189ef6e996763959f1249c5650e232f3c77c11169d239cbfc8342fc70f3fe401407d23810505d + languageName: node + linkType: hard + +"y18n@npm:^5.0.5": + version: 5.0.8 + resolution: "y18n@npm:5.0.8" + checksum: 4df2842c36e468590c3691c894bc9cdbac41f520566e76e24f59401ba7d8b4811eb1e34524d57e54bc6d864bcb66baab7ffd9ca42bf1eda596618f9162b91249 + languageName: node + linkType: hard + +"yallist@npm:^4.0.0": + version: 4.0.0 + resolution: "yallist@npm:4.0.0" + checksum: 2286b5e8dbfe22204ab66e2ef5cc9bbb1e55dfc873bbe0d568aa943eb255d131890dfd5bf243637273d31119b870f49c18fcde2c6ffbb7a7a092b870dc90625a + languageName: node + linkType: hard + +"yargs-parser@npm:^21.1.1": + version: 21.1.1 + resolution: "yargs-parser@npm:21.1.1" + checksum: f84b5e48169479d2f402239c59f084cfd1c3acc197a05c59b98bab067452e6b3ea46d4dd8ba2985ba7b3d32a343d77df0debd6b343e5dae3da2aab2cdf5886b2 + languageName: node + linkType: hard + +"yargs@npm:^17.7.2": + version: 17.7.2 + resolution: "yargs@npm:17.7.2" + dependencies: + cliui: "npm:^8.0.1" + escalade: "npm:^3.1.1" + get-caller-file: "npm:^2.0.5" + require-directory: "npm:^2.1.1" + string-width: "npm:^4.2.3" + y18n: "npm:^5.0.5" + yargs-parser: "npm:^21.1.1" + checksum: ccd7e723e61ad5965fffbb791366db689572b80cca80e0f96aad968dfff4156cd7cd1ad18607afe1046d8241e6fb2d6c08bf7fa7bfb5eaec818735d8feac8f05 + languageName: node + linkType: hard + +"yocto-queue@npm:^1.0.0": + version: 1.0.0 + resolution: "yocto-queue@npm:1.0.0" + checksum: 856117aa15cf5103d2a2fb173f0ab4acb12b4b4d0ed3ab249fdbbf612e55d1cadfd27a6110940e24746fb0a78cf640b522cc8bca76f30a3b00b66e90cf82abe0 + languageName: node + linkType: hard diff --git a/upgrade-test-scripts/lib/.yarn/install-state.gz b/upgrade-test-scripts/lib/.yarn/install-state.gz deleted file mode 100644 index 47c05a59..00000000 Binary files a/upgrade-test-scripts/lib/.yarn/install-state.gz and /dev/null differ diff --git a/upgrade-test-scripts/run_eval.sh b/upgrade-test-scripts/run_eval.sh index a30d96a4..e9027f78 100644 --- a/upgrade-test-scripts/run_eval.sh +++ b/upgrade-test-scripts/run_eval.sh @@ -6,8 +6,6 @@ set -e source ./env_setup.sh -export SLOGFILE=slog.slog - PROPOSAL_PATH=$1 startAgd diff --git a/upgrade-test-scripts/run_test.sh b/upgrade-test-scripts/run_test.sh index 116d549a..2df0c46f 100644 --- a/upgrade-test-scripts/run_test.sh +++ b/upgrade-test-scripts/run_test.sh @@ -6,8 +6,6 @@ set -e source ./env_setup.sh -export SLOGFILE=slog.slog - PROPOSAL_PATH=$1 startAgd diff --git a/upgrade-test-scripts/run_use.sh b/upgrade-test-scripts/run_use.sh index c1a19076..11948380 100644 --- a/upgrade-test-scripts/run_use.sh +++ b/upgrade-test-scripts/run_use.sh @@ -23,8 +23,6 @@ fi source ./env_setup.sh -export SLOGFILE=slog.slog - echo "Starting agd in the background." startAgd diff --git a/upgrade-test-scripts/start_agd.sh b/upgrade-test-scripts/start_agd.sh index ecdd2092..5003c233 100644 --- a/upgrade-test-scripts/start_agd.sh +++ b/upgrade-test-scripts/start_agd.sh @@ -6,7 +6,5 @@ grep -qF 'printKeys' /root/.bashrc || echo "printKeys" >>/root/.bashrc source ./env_setup.sh -export SLOGFILE=slog.slog - # don't use startAgd() because that backgrounds agd start --log_level warn "$@" diff --git a/upgrade-test-scripts/start_to_to.sh b/upgrade-test-scripts/start_to_to.sh index a58d64ee..974f617a 100644 --- a/upgrade-test-scripts/start_to_to.sh +++ b/upgrade-test-scripts/start_to_to.sh @@ -6,8 +6,6 @@ grep -qF 'printKeys' /root/.bashrc || echo "printKeys" >>/root/.bashrc source ./env_setup.sh -export SLOGFILE=slog.slog - startAgd if [[ -z "${UPGRADE_TO}" ]]; then