@workflow/builders 4.1.0 → 4.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/apply-swc-transform.d.ts +7 -2
- package/dist/apply-swc-transform.d.ts.map +1 -1
- package/dist/apply-swc-transform.js +10 -4
- package/dist/base-builder-logging.test.d.ts +2 -0
- package/dist/base-builder-logging.test.d.ts.map +1 -0
- package/dist/base-builder-logging.test.js +99 -0
- package/dist/base-builder.d.ts +37 -14
- package/dist/base-builder.d.ts.map +1 -1
- package/dist/base-builder.js +296 -54
- package/dist/config-helpers.d.ts +2 -0
- package/dist/config-helpers.d.ts.map +1 -1
- package/dist/config-helpers.js +62 -1
- package/dist/config-helpers.test.d.ts +2 -0
- package/dist/config-helpers.test.d.ts.map +1 -0
- package/dist/config-helpers.test.js +17 -0
- package/dist/fast-discovery.d.ts +14 -0
- package/dist/fast-discovery.d.ts.map +1 -0
- package/dist/fast-discovery.js +663 -0
- package/dist/fast-discovery.test.d.ts +2 -0
- package/dist/fast-discovery.test.d.ts.map +1 -0
- package/dist/fast-discovery.test.js +338 -0
- package/dist/get-input-files.test.js +34 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/module-specifier.d.ts +13 -0
- package/dist/module-specifier.d.ts.map +1 -1
- package/dist/module-specifier.js +20 -1
- package/dist/standalone.d.ts.map +1 -1
- package/dist/standalone.js +4 -4
- package/dist/step-source-registration.test.d.ts +2 -0
- package/dist/step-source-registration.test.d.ts.map +1 -0
- package/dist/step-source-registration.test.js +82 -0
- package/dist/swc-esbuild-plugin.d.ts +1 -0
- package/dist/swc-esbuild-plugin.d.ts.map +1 -1
- package/dist/swc-esbuild-plugin.js +5 -3
- package/dist/swc-esbuild-plugin.test.js +25 -3
- package/dist/transform-utils.d.ts.map +1 -1
- package/dist/transform-utils.js +45 -6
- package/dist/transform-utils.test.js +92 -1
- package/dist/types.d.ts +8 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +1 -1
- package/dist/vercel-build-output-api.d.ts.map +1 -1
- package/dist/vercel-build-output-api.js +8 -8
- package/dist/workflows-extractor.js +8 -3
- package/dist/workflows-extractor.test.d.ts +2 -0
- package/dist/workflows-extractor.test.d.ts.map +1 -0
- package/dist/workflows-extractor.test.js +70 -0
- package/package.json +3 -3
package/dist/base-builder.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { randomUUID } from 'node:crypto';
|
|
2
|
-
import { mkdir, readFile, realpath, rename, writeFile } from 'node:fs/promises';
|
|
2
|
+
import { mkdir, readFile, realpath, rename, rm, writeFile, } from 'node:fs/promises';
|
|
3
3
|
import { createRequire } from 'node:module';
|
|
4
4
|
import { basename, dirname, join, relative, resolve } from 'node:path';
|
|
5
5
|
import { promisify } from 'node:util';
|
|
6
|
+
import { buildLogger } from '@workflow/core/logger';
|
|
6
7
|
import { pluralize, usesVercelWorld } from '@workflow/utils';
|
|
7
8
|
import chalk from 'chalk';
|
|
8
9
|
import enhancedResolveOriginal from 'enhanced-resolve';
|
|
@@ -11,9 +12,9 @@ import { findUp } from 'find-up';
|
|
|
11
12
|
import { glob } from 'tinyglobby';
|
|
12
13
|
import { applySwcTransform, } from './apply-swc-transform.js';
|
|
13
14
|
import { createWorkflowEntrypointOptionsCode } from './constants.js';
|
|
14
|
-
import { createDiscoverEntriesPlugin } from './discover-entries-esbuild-plugin.js';
|
|
15
15
|
import { getEsbuildTsconfigOptions } from './esbuild-tsconfig.js';
|
|
16
|
-
import {
|
|
16
|
+
import { fastDiscoverEntries, } from './fast-discovery.js';
|
|
17
|
+
import { getImportPath, resolveModuleSpecifier, stripPackageVersion, } from './module-specifier.js';
|
|
17
18
|
import { createNodeModuleErrorPlugin } from './node-module-esbuild-plugin.js';
|
|
18
19
|
import { createPseudoPackagePlugin } from './pseudo-package-esbuild-plugin.js';
|
|
19
20
|
import { createSwcPlugin } from './swc-esbuild-plugin.js';
|
|
@@ -21,7 +22,34 @@ import { detectWorkflowPatterns } from './transform-utils.js';
|
|
|
21
22
|
import { extractWorkflowGraphs } from './workflows-extractor.js';
|
|
22
23
|
const enhancedResolve = promisify(enhancedResolveOriginal);
|
|
23
24
|
const require = createRequire(import.meta.url);
|
|
25
|
+
/**
|
|
26
|
+
* Thrown when the workflow build pipeline (esbuild, SWC transform, file
|
|
27
|
+
* discovery, bundler integration) fails in a way the user can act on.
|
|
28
|
+
*/
|
|
29
|
+
class WorkflowBuildError extends Error {
|
|
30
|
+
hint;
|
|
31
|
+
constructor(message, options) {
|
|
32
|
+
const body = options?.hint
|
|
33
|
+
? `${message}\n\nhint: ${options.hint}`
|
|
34
|
+
: message;
|
|
35
|
+
super(body, { cause: options?.cause });
|
|
36
|
+
this.name = 'WorkflowBuildError';
|
|
37
|
+
this.hint = options?.hint;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Legacy opt-in for source maps on the final workflow wrapper + webhook
|
|
42
|
+
* bundles (which default to off, unlike the step/interim workflow bundles
|
|
43
|
+
* that default to inline). Superseded by the `sourcemap` config option and
|
|
44
|
+
* the `WORKFLOW_SOURCEMAP` environment variable; kept for back-compat.
|
|
45
|
+
*/
|
|
24
46
|
const EMIT_SOURCEMAPS_FOR_DEBUGGING = process.env.WORKFLOW_EMIT_SOURCEMAPS_FOR_DEBUGGING === '1';
|
|
47
|
+
function formatBuildDuration(durationMs) {
|
|
48
|
+
if (durationMs < 1000) {
|
|
49
|
+
return `${durationMs}ms`;
|
|
50
|
+
}
|
|
51
|
+
return `${(durationMs / 1000).toFixed(1)}s`;
|
|
52
|
+
}
|
|
25
53
|
/**
|
|
26
54
|
* Normalize an array of file paths by appending the `realpath()` of each entry
|
|
27
55
|
* (to handle symlinks, e.g. pnpm/workspace layouts) and deduplicating.
|
|
@@ -32,6 +60,64 @@ async function withRealpaths(entries) {
|
|
|
32
60
|
return resolved ? [entry, resolved] : [entry];
|
|
33
61
|
}))).flat()));
|
|
34
62
|
}
|
|
63
|
+
/**
|
|
64
|
+
* Canonical "what module does this file represent?" key used to dedupe
|
|
65
|
+
* virtual-entry imports.
|
|
66
|
+
*
|
|
67
|
+
* If the file resolves to a real package specifier (`workflow/internal/builtins`,
|
|
68
|
+
* `@internal/agent/server`, etc.), we return the bare specifier — version
|
|
69
|
+
* stripped — because esbuild's package resolution will collapse all
|
|
70
|
+
* importers of that specifier to the same physical module regardless of
|
|
71
|
+
* which on-disk copy (src vs dist) any one importer wrote.
|
|
72
|
+
*
|
|
73
|
+
* Otherwise we fall back to the absolute file path. Distinct local-app
|
|
74
|
+
* files have distinct paths, so this still dedupes a file against itself
|
|
75
|
+
* (e.g. if it shows up in both `stepFiles` and `serdeOnlyFiles`) without
|
|
76
|
+
* conflating unrelated files.
|
|
77
|
+
*/
|
|
78
|
+
function moduleIdentityKey(file, moduleSpecifierRoot) {
|
|
79
|
+
const { moduleSpecifier } = resolveModuleSpecifier(file, moduleSpecifierRoot);
|
|
80
|
+
if (moduleSpecifier) {
|
|
81
|
+
// Strip the "@<version>" suffix so source and dist copies of the same
|
|
82
|
+
// export collapse to the same key.
|
|
83
|
+
return stripPackageVersion(moduleSpecifier);
|
|
84
|
+
}
|
|
85
|
+
return file.replace(/\\/g, '/');
|
|
86
|
+
}
|
|
87
|
+
function formatIdLocation(location) {
|
|
88
|
+
return `${location.filePath}#${location.name}`;
|
|
89
|
+
}
|
|
90
|
+
function assertUniqueManifestIds(entriesByFile, ids, getId, label) {
|
|
91
|
+
for (const [filePath, entries] of Object.entries(entriesByFile || {})) {
|
|
92
|
+
for (const [name, data] of Object.entries(entries)) {
|
|
93
|
+
const id = getId(data);
|
|
94
|
+
const existing = ids.get(id);
|
|
95
|
+
const current = { filePath, name };
|
|
96
|
+
if (existing &&
|
|
97
|
+
(existing.filePath !== current.filePath ||
|
|
98
|
+
existing.name !== current.name)) {
|
|
99
|
+
const idName = label === 'step' ? 'workflow step ID' : 'workflow ID';
|
|
100
|
+
const functionName = `${label} function`;
|
|
101
|
+
const capitalizedLabel = label === 'step' ? 'Step' : 'Workflow';
|
|
102
|
+
throw new WorkflowBuildError(`Duplicate ${idName} "${id}" generated for ${formatIdLocation(existing)} and ${formatIdLocation(current)}.`, {
|
|
103
|
+
hint: `${capitalizedLabel} IDs must be unique across a build. ` +
|
|
104
|
+
`If you own one of the colliding files, rename the ${functionName} or export ` +
|
|
105
|
+
`the package file through a unique package subpath. If the collision is in a ` +
|
|
106
|
+
`transitive dependency you don't control, file an issue with the upstream ` +
|
|
107
|
+
`package or pin to a non-colliding version.`,
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
ids.set(id, current);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
function mergeWorkflowManifest(target, incoming, stepIds, workflowIds) {
|
|
115
|
+
assertUniqueManifestIds(incoming.steps, stepIds, (data) => data.stepId, 'step');
|
|
116
|
+
assertUniqueManifestIds(incoming.workflows, workflowIds, (data) => data.workflowId, 'workflow');
|
|
117
|
+
target.workflows = Object.assign(target.workflows || {}, incoming.workflows);
|
|
118
|
+
target.steps = Object.assign(target.steps || {}, incoming.steps);
|
|
119
|
+
target.classes = Object.assign(target.classes || {}, incoming.classes);
|
|
120
|
+
}
|
|
35
121
|
/**
|
|
36
122
|
* Base class for workflow builders. Provides common build logic for transforming
|
|
37
123
|
* workflow source files into deployable bundles using esbuild and SWC.
|
|
@@ -45,23 +131,33 @@ export class BaseBuilder {
|
|
|
45
131
|
* to avoid duplicate warnings across multiple discoverEntries() calls.
|
|
46
132
|
*/
|
|
47
133
|
warnedExternalPackages = new Set();
|
|
134
|
+
workflowBuildStartTime;
|
|
135
|
+
workflowBuildSummaryCount = 0;
|
|
48
136
|
constructor(config) {
|
|
49
137
|
this.config = config;
|
|
50
138
|
}
|
|
51
139
|
get transformProjectRoot() {
|
|
52
140
|
return this.config.projectRoot || this.config.workingDir;
|
|
53
141
|
}
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
* Subclasses can override this to silence progress logs while keeping warnings/errors.
|
|
57
|
-
*/
|
|
58
|
-
get shouldLogBaseBuilderInfo() {
|
|
59
|
-
return true;
|
|
142
|
+
get moduleSpecifierRoot() {
|
|
143
|
+
return this.config.moduleSpecifierRoot || this.transformProjectRoot;
|
|
60
144
|
}
|
|
61
145
|
logBaseBuilderInfo(...args) {
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
146
|
+
buildLogger.debug(args.map(String).join(' '));
|
|
147
|
+
}
|
|
148
|
+
startWorkflowBuildTimer() {
|
|
149
|
+
this.workflowBuildStartTime = Date.now();
|
|
150
|
+
}
|
|
151
|
+
getWorkflowBuildDuration() {
|
|
152
|
+
return Date.now() - (this.workflowBuildStartTime ?? Date.now());
|
|
153
|
+
}
|
|
154
|
+
resetWorkflowBuildTimer() {
|
|
155
|
+
this.workflowBuildStartTime = undefined;
|
|
156
|
+
}
|
|
157
|
+
getWorkflowBuildSummaryPrefix() {
|
|
158
|
+
return this.workflowBuildSummaryCount === 0
|
|
159
|
+
? 'workflows build complete'
|
|
160
|
+
: 'workflows rebuilt';
|
|
65
161
|
}
|
|
66
162
|
logCreateWorkflowsBundleInfo(...args) {
|
|
67
163
|
if (!this.config.suppressCreateWorkflowsBundleLogs) {
|
|
@@ -123,6 +219,7 @@ export class BaseBuilder {
|
|
|
123
219
|
'**/.workflow-data/**',
|
|
124
220
|
'**/.workflow-vitest/**',
|
|
125
221
|
'**/.well-known/workflow/**',
|
|
222
|
+
'**/.swc/**',
|
|
126
223
|
'**/.svelte-kit/**',
|
|
127
224
|
'**/.turbo/**',
|
|
128
225
|
'**/.cache/**',
|
|
@@ -151,6 +248,9 @@ export class BaseBuilder {
|
|
|
151
248
|
* (e.g., when files are added/removed during watch mode).
|
|
152
249
|
*/
|
|
153
250
|
discoveredEntries = new WeakMap();
|
|
251
|
+
clearDiscoveredEntriesCache() {
|
|
252
|
+
this.discoveredEntries = new WeakMap();
|
|
253
|
+
}
|
|
154
254
|
/**
|
|
155
255
|
* Pseudo-packages that should not be checked for workflow patterns.
|
|
156
256
|
*/
|
|
@@ -261,34 +361,55 @@ export class BaseBuilder {
|
|
|
261
361
|
discoveredSerdeFiles: new Set(),
|
|
262
362
|
};
|
|
263
363
|
const discoverStart = Date.now();
|
|
364
|
+
// Resolve the SDK runtime serde entry point so that the discovery pass
|
|
365
|
+
// discovers classes like `Run` that live inside SDK packages. Without this,
|
|
366
|
+
// files like `run.js` are only discovered when user code imports them.
|
|
367
|
+
// This is resolved here (rather than in callers) so that the original
|
|
368
|
+
// `inputs` array reference is preserved for WeakMap caching — callers
|
|
369
|
+
// like createWorkflowsBundle and createStepsBundle can share the same
|
|
370
|
+
// cache entry when they pass the same inputFiles array.
|
|
371
|
+
const resolvedWorkflowRuntime = await enhancedResolve(outdir, '@workflow/core/runtime/run').catch(() => undefined);
|
|
372
|
+
const entryPoints = resolvedWorkflowRuntime
|
|
373
|
+
? [...inputs, resolvedWorkflowRuntime]
|
|
374
|
+
: inputs;
|
|
264
375
|
const effectiveTsconfigPath = tsconfigPath ?? (await this.findTsConfigPath());
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
createDiscoverEntriesPlugin(state, this.transformProjectRoot),
|
|
272
|
-
],
|
|
273
|
-
platform: 'node',
|
|
274
|
-
write: false,
|
|
275
|
-
outdir,
|
|
276
|
-
bundle: true,
|
|
277
|
-
sourcemap: false,
|
|
278
|
-
absWorkingDir: this.config.workingDir,
|
|
279
|
-
logLevel: 'silent',
|
|
280
|
-
...esbuildTsconfigOptions,
|
|
281
|
-
// External packages that should not be bundled during discovery
|
|
282
|
-
external: this.config.externalPackages || [],
|
|
283
|
-
});
|
|
284
|
-
}
|
|
285
|
-
catch (_) { }
|
|
376
|
+
await fastDiscoverEntries({
|
|
377
|
+
entryPoints,
|
|
378
|
+
state,
|
|
379
|
+
defaultTsconfigPath: effectiveTsconfigPath,
|
|
380
|
+
workingDir: this.config.workingDir,
|
|
381
|
+
});
|
|
286
382
|
this.logBaseBuilderInfo(`Discovering workflow directives`, `${Date.now() - discoverStart}ms`);
|
|
287
383
|
// Warn about external packages that contain workflow code
|
|
288
384
|
await this.warnAboutExternalWorkflowPackages();
|
|
289
385
|
this.discoveredEntries.set(inputs, state);
|
|
290
386
|
return state;
|
|
291
387
|
}
|
|
388
|
+
/**
|
|
389
|
+
* Writes generated files atomically where possible. On Windows, Next.js can
|
|
390
|
+
* briefly hold generated route files open while compiling them, which makes
|
|
391
|
+
* rename-over-existing fail with EPERM/EACCES. In that case, fall back to a
|
|
392
|
+
* direct overwrite so watch rebuilds can still make progress.
|
|
393
|
+
*/
|
|
394
|
+
async writeGeneratedFile(targetPath, content) {
|
|
395
|
+
const tempPath = `${targetPath}.${randomUUID()}.tmp`;
|
|
396
|
+
await writeFile(tempPath, content);
|
|
397
|
+
try {
|
|
398
|
+
await rename(tempPath, targetPath);
|
|
399
|
+
}
|
|
400
|
+
catch (error) {
|
|
401
|
+
const errorCode = error && typeof error === 'object' && 'code' in error
|
|
402
|
+
? error.code
|
|
403
|
+
: undefined;
|
|
404
|
+
if (process.platform === 'win32' &&
|
|
405
|
+
(errorCode === 'EPERM' || errorCode === 'EACCES')) {
|
|
406
|
+
await writeFile(targetPath, content);
|
|
407
|
+
await rm(tempPath, { force: true });
|
|
408
|
+
return;
|
|
409
|
+
}
|
|
410
|
+
throw error;
|
|
411
|
+
}
|
|
412
|
+
}
|
|
292
413
|
/**
|
|
293
414
|
* Writes debug information to a JSON file for troubleshooting build issues.
|
|
294
415
|
* Uses atomic write (temp file + rename) to prevent race conditions when
|
|
@@ -316,12 +437,7 @@ export class BaseBuilder {
|
|
|
316
437
|
...existing,
|
|
317
438
|
...debugData,
|
|
318
439
|
}, null, 2);
|
|
319
|
-
|
|
320
|
-
// rename() is atomic on POSIX systems and provides best-effort atomicity on Windows.
|
|
321
|
-
// Prevents race conditions where concurrent builds read partially-written files.
|
|
322
|
-
const tempPath = `${targetPath}.${randomUUID()}.tmp`;
|
|
323
|
-
await writeFile(tempPath, mergedData);
|
|
324
|
-
await rename(tempPath, targetPath);
|
|
440
|
+
await this.writeGeneratedFile(targetPath, mergedData);
|
|
325
441
|
}
|
|
326
442
|
catch (error) {
|
|
327
443
|
console.warn('Failed to write debug file:', error);
|
|
@@ -376,15 +492,92 @@ export class BaseBuilder {
|
|
|
376
492
|
}
|
|
377
493
|
return relativePath;
|
|
378
494
|
}
|
|
495
|
+
createRouteImportSpecifier(file, routeDir) {
|
|
496
|
+
const { importPath, isPackage } = getImportPath(file, this.config.workingDir);
|
|
497
|
+
if (isPackage) {
|
|
498
|
+
return importPath;
|
|
499
|
+
}
|
|
500
|
+
let relativePath = relative(routeDir, file).replace(/\\/g, '/');
|
|
501
|
+
if (!relativePath.startsWith('./') && !relativePath.startsWith('../')) {
|
|
502
|
+
relativePath = `./${relativePath}`;
|
|
503
|
+
}
|
|
504
|
+
return relativePath;
|
|
505
|
+
}
|
|
506
|
+
async createStepSourceRegistrationFile({ inputFiles, outfile, tsconfigPath, discoveredEntries, }) {
|
|
507
|
+
const stepsBundleStart = Date.now();
|
|
508
|
+
const workflowManifest = {};
|
|
509
|
+
const builtInSteps = 'workflow/internal/builtins';
|
|
510
|
+
const resolvedBuiltInSteps = (await enhancedResolve(dirname(outfile), builtInSteps).catch((err) => {
|
|
511
|
+
throw new WorkflowBuildError(`Failed to resolve built-in steps sources.\n\nCaused by: ${String(err)}`, {
|
|
512
|
+
hint: 'run `pnpm install workflow` to resolve this issue.',
|
|
513
|
+
cause: err,
|
|
514
|
+
});
|
|
515
|
+
}));
|
|
516
|
+
const discovered = discoveredEntries ??
|
|
517
|
+
(await this.discoverEntries(inputFiles, dirname(outfile), tsconfigPath));
|
|
518
|
+
const stepFiles = [...discovered.discoveredSteps].sort();
|
|
519
|
+
const workflowFiles = [...discovered.discoveredWorkflows].sort();
|
|
520
|
+
const serdeFiles = [...discovered.discoveredSerdeFiles].sort();
|
|
521
|
+
const stepFilesSet = new Set(stepFiles);
|
|
522
|
+
const serdeOnlyFiles = serdeFiles.filter((f) => !stepFilesSet.has(f));
|
|
523
|
+
await this.writeDebugFile(outfile, {
|
|
524
|
+
stepFiles,
|
|
525
|
+
workflowFiles,
|
|
526
|
+
serdeOnlyFiles,
|
|
527
|
+
sourceImports: true,
|
|
528
|
+
});
|
|
529
|
+
const emittedImportIdentities = new Set([builtInSteps]);
|
|
530
|
+
const importStatements = [];
|
|
531
|
+
const routeDir = dirname(outfile);
|
|
532
|
+
const addRegistrationImport = (specifier) => {
|
|
533
|
+
importStatements.push(`import ${JSON.stringify(specifier)};`);
|
|
534
|
+
};
|
|
535
|
+
const addRegistrationFileImport = (file) => {
|
|
536
|
+
const identity = moduleIdentityKey(file, this.moduleSpecifierRoot);
|
|
537
|
+
if (emittedImportIdentities.has(identity)) {
|
|
538
|
+
return;
|
|
539
|
+
}
|
|
540
|
+
emittedImportIdentities.add(identity);
|
|
541
|
+
addRegistrationImport(this.createRouteImportSpecifier(file, routeDir));
|
|
542
|
+
};
|
|
543
|
+
addRegistrationImport(builtInSteps);
|
|
544
|
+
for (const file of stepFiles) {
|
|
545
|
+
addRegistrationFileImport(file);
|
|
546
|
+
}
|
|
547
|
+
for (const file of serdeOnlyFiles) {
|
|
548
|
+
addRegistrationFileImport(file);
|
|
549
|
+
}
|
|
550
|
+
const output = `// biome-ignore-all lint: generated file
|
|
551
|
+
/* eslint-disable */
|
|
552
|
+
${importStatements.join('\n')}
|
|
553
|
+
|
|
554
|
+
export const __steps_registered = true;
|
|
555
|
+
`;
|
|
556
|
+
await mkdir(dirname(outfile), { recursive: true });
|
|
557
|
+
await this.writeGeneratedFile(outfile, output);
|
|
558
|
+
const manifestFiles = Array.from(new Set([...stepFiles, ...serdeOnlyFiles, resolvedBuiltInSteps])).sort();
|
|
559
|
+
const stepIds = new Map();
|
|
560
|
+
const workflowIds = new Map();
|
|
561
|
+
await Promise.all(manifestFiles.map(async (file) => {
|
|
562
|
+
const source = await readFile(file, 'utf8');
|
|
563
|
+
const relativeFilepath = this.getRelativeFilepath(file);
|
|
564
|
+
const { workflowManifest: fileManifest } = await applySwcTransform(relativeFilepath, source, 'step', file, this.transformProjectRoot, this.moduleSpecifierRoot);
|
|
565
|
+
mergeWorkflowManifest(workflowManifest, fileManifest, stepIds, workflowIds);
|
|
566
|
+
}));
|
|
567
|
+
await this.ensureSwcIgnored();
|
|
568
|
+
this.logBaseBuilderInfo('Created step registrations', `${Date.now() - stepsBundleStart}ms`);
|
|
569
|
+
return workflowManifest;
|
|
570
|
+
}
|
|
379
571
|
/**
|
|
380
572
|
* Creates a bundle for workflow step functions.
|
|
381
573
|
* Steps have full Node.js runtime access and handle side effects, API calls, etc.
|
|
382
574
|
*
|
|
383
575
|
* @param externalizeNonSteps - If true, only bundles step entry points and externalizes other code
|
|
576
|
+
* @param sourceStepRegistrationImports - If true, emits a source import registration file instead of bundling step registrations
|
|
384
577
|
* @param bundleTransitiveLocalStepDependencies - If true, also bundles project-local files imported by step entries for direct runtime loading
|
|
385
578
|
* @returns Build context (for watch mode) and the collected workflow manifest
|
|
386
579
|
*/
|
|
387
|
-
async createStepsBundle({ inputFiles, format = 'cjs', outfile, externalizeNonSteps, bundleTransitiveLocalStepDependencies, rewriteTsExtensions, tsconfigPath, discoveredEntries, }) {
|
|
580
|
+
async createStepsBundle({ inputFiles, format = 'cjs', outfile, externalizeNonSteps, bundleTransitiveLocalStepDependencies, sourceStepRegistrationImports, rewriteTsExtensions, tsconfigPath, discoveredEntries, }) {
|
|
388
581
|
// These need to handle watching for dev to scan for
|
|
389
582
|
// new entries and changes to existing ones
|
|
390
583
|
const discovered = discoveredEntries ??
|
|
@@ -397,6 +590,19 @@ export class BaseBuilder {
|
|
|
397
590
|
// when receiving data from workflows and serialized when returning data to workflows.
|
|
398
591
|
const stepFilesSet = new Set(stepFiles);
|
|
399
592
|
const serdeOnlyFiles = serdeFiles.filter((f) => !stepFilesSet.has(f));
|
|
593
|
+
if (sourceStepRegistrationImports &&
|
|
594
|
+
externalizeNonSteps &&
|
|
595
|
+
!bundleTransitiveLocalStepDependencies) {
|
|
596
|
+
return {
|
|
597
|
+
context: undefined,
|
|
598
|
+
manifest: await this.createStepSourceRegistrationFile({
|
|
599
|
+
inputFiles,
|
|
600
|
+
outfile,
|
|
601
|
+
tsconfigPath,
|
|
602
|
+
discoveredEntries: discovered,
|
|
603
|
+
}),
|
|
604
|
+
};
|
|
605
|
+
}
|
|
400
606
|
// log the step files for debugging
|
|
401
607
|
await this.writeDebugFile(outfile, {
|
|
402
608
|
stepFiles,
|
|
@@ -521,6 +727,7 @@ export class BaseBuilder {
|
|
|
521
727
|
entriesToBundle: normalizedEntriesToBundle,
|
|
522
728
|
outdir: outfile ? dirname(outfile) : undefined,
|
|
523
729
|
projectRoot: this.transformProjectRoot,
|
|
730
|
+
moduleSpecifierRoot: this.moduleSpecifierRoot,
|
|
524
731
|
workflowManifest,
|
|
525
732
|
bundleTransitiveLocalStepDependencies,
|
|
526
733
|
rewriteTsExtensions,
|
|
@@ -542,7 +749,7 @@ export class BaseBuilder {
|
|
|
542
749
|
try {
|
|
543
750
|
const source = await readFile(workflowFile, 'utf8');
|
|
544
751
|
const relativeFilepath = this.getRelativeFilepath(workflowFile);
|
|
545
|
-
const { workflowManifest: fileManifest } = await applySwcTransform(relativeFilepath, source, 'workflow', workflowFile, this.transformProjectRoot);
|
|
752
|
+
const { workflowManifest: fileManifest } = await applySwcTransform(relativeFilepath, source, 'workflow', workflowFile, this.transformProjectRoot, this.moduleSpecifierRoot);
|
|
546
753
|
if (fileManifest.workflows) {
|
|
547
754
|
workflowManifest.workflows = Object.assign(workflowManifest.workflows || {}, fileManifest.workflows);
|
|
548
755
|
}
|
|
@@ -555,8 +762,7 @@ export class BaseBuilder {
|
|
|
555
762
|
console.warn(`Warning: Failed to extract workflow metadata from ${workflowFile}:`, error instanceof Error ? error.message : String(error));
|
|
556
763
|
}
|
|
557
764
|
}));
|
|
558
|
-
|
|
559
|
-
await this.createSwcGitignore();
|
|
765
|
+
await this.ensureSwcIgnored();
|
|
560
766
|
if (this.config.watch) {
|
|
561
767
|
return { context: esbuildCtx, manifest: workflowManifest };
|
|
562
768
|
}
|
|
@@ -570,6 +776,7 @@ export class BaseBuilder {
|
|
|
570
776
|
* @param bundleFinalOutput - If false, skips the final bundling step (used by Next.js)
|
|
571
777
|
*/
|
|
572
778
|
async createWorkflowsBundle({ inputFiles, format = 'cjs', outfile, bundleFinalOutput = true, keepInterimBundleContext = this.config.watch, tsconfigPath, discoveredEntries, }) {
|
|
779
|
+
this.startWorkflowBuildTimer();
|
|
573
780
|
const discovered = discoveredEntries ??
|
|
574
781
|
(await this.discoverEntries(inputFiles, dirname(outfile), tsconfigPath));
|
|
575
782
|
const workflowFiles = [...discovered.discoveredWorkflows].sort();
|
|
@@ -672,6 +879,7 @@ export class BaseBuilder {
|
|
|
672
879
|
createSwcPlugin({
|
|
673
880
|
mode: 'workflow',
|
|
674
881
|
projectRoot: this.transformProjectRoot,
|
|
882
|
+
moduleSpecifierRoot: this.moduleSpecifierRoot,
|
|
675
883
|
workflowManifest,
|
|
676
884
|
sideEffectEntries: normalizedWorkflowSideEffectEntries,
|
|
677
885
|
}),
|
|
@@ -708,8 +916,7 @@ export class BaseBuilder {
|
|
|
708
916
|
await mkdir(dirname(resolvedPath), { recursive: true });
|
|
709
917
|
await writeFile(resolvedPath, prefix + JSON.stringify(workflowManifest, null, 2));
|
|
710
918
|
}
|
|
711
|
-
|
|
712
|
-
await this.createSwcGitignore();
|
|
919
|
+
await this.ensureSwcIgnored();
|
|
713
920
|
if (!interimBundle.outputFiles ||
|
|
714
921
|
interimBundle.outputFiles.length === 0) {
|
|
715
922
|
throw new Error('No output files generated from esbuild');
|
|
@@ -768,11 +975,7 @@ export const POST = handler;`;
|
|
|
768
975
|
// Ensure the output directory exists
|
|
769
976
|
const outputDir = dirname(outfile);
|
|
770
977
|
await mkdir(outputDir, { recursive: true });
|
|
771
|
-
|
|
772
|
-
// file watchers from reading partial file during write
|
|
773
|
-
const tempPath = `${outfile}.${randomUUID()}.tmp`;
|
|
774
|
-
await writeFile(tempPath, workflowFunctionCode);
|
|
775
|
-
await rename(tempPath, outfile);
|
|
978
|
+
await this.writeGeneratedFile(outfile, workflowFunctionCode);
|
|
776
979
|
return;
|
|
777
980
|
}
|
|
778
981
|
const bundleStartTime = Date.now();
|
|
@@ -922,13 +1125,13 @@ export const POST = handler;`;
|
|
|
922
1125
|
createSwcPlugin({
|
|
923
1126
|
mode: 'client',
|
|
924
1127
|
projectRoot: this.transformProjectRoot,
|
|
1128
|
+
moduleSpecifierRoot: this.moduleSpecifierRoot,
|
|
925
1129
|
sideEffectEntries: normalizedClientSideEffectEntries,
|
|
926
1130
|
}),
|
|
927
1131
|
],
|
|
928
1132
|
});
|
|
929
1133
|
this.logEsbuildMessages(clientResult, 'client library bundle');
|
|
930
|
-
|
|
931
|
-
await this.createSwcGitignore();
|
|
1134
|
+
await this.ensureSwcIgnored();
|
|
932
1135
|
}
|
|
933
1136
|
/**
|
|
934
1137
|
* Creates a webhook handler bundle for resuming workflows via HTTP callbacks.
|
|
@@ -1060,7 +1263,40 @@ export const OPTIONS = handler;`;
|
|
|
1060
1263
|
async ensureDirectory(filePath) {
|
|
1061
1264
|
await mkdir(dirname(filePath), { recursive: true });
|
|
1062
1265
|
}
|
|
1063
|
-
async
|
|
1266
|
+
async ensureSwcIgnored() {
|
|
1267
|
+
await this.ensureProjectSwcGitignoreEntry();
|
|
1268
|
+
await this.createSwcDirectoryGitignore();
|
|
1269
|
+
}
|
|
1270
|
+
async ensureProjectSwcGitignoreEntry() {
|
|
1271
|
+
const gitignorePath = join(this.config.workingDir, '.gitignore');
|
|
1272
|
+
try {
|
|
1273
|
+
let content = '';
|
|
1274
|
+
try {
|
|
1275
|
+
content = await readFile(gitignorePath, 'utf-8');
|
|
1276
|
+
}
|
|
1277
|
+
catch (error) {
|
|
1278
|
+
if (error.code !== 'ENOENT') {
|
|
1279
|
+
return;
|
|
1280
|
+
}
|
|
1281
|
+
}
|
|
1282
|
+
const hasSwcEntry = content.split(/\r?\n/).some((line) => {
|
|
1283
|
+
const trimmed = line.trim();
|
|
1284
|
+
return (trimmed === '.swc' ||
|
|
1285
|
+
trimmed === '.swc/' ||
|
|
1286
|
+
trimmed === '/.swc' ||
|
|
1287
|
+
trimmed === '/.swc/');
|
|
1288
|
+
});
|
|
1289
|
+
if (hasSwcEntry) {
|
|
1290
|
+
return;
|
|
1291
|
+
}
|
|
1292
|
+
const separator = content.length > 0 && !content.endsWith('\n') ? '\n' : '';
|
|
1293
|
+
await writeFile(gitignorePath, `${content}${separator}/.swc\n`);
|
|
1294
|
+
}
|
|
1295
|
+
catch {
|
|
1296
|
+
// We're intentionally silently ignoring this error - updating .gitignore isn't critical
|
|
1297
|
+
}
|
|
1298
|
+
}
|
|
1299
|
+
async createSwcDirectoryGitignore() {
|
|
1064
1300
|
try {
|
|
1065
1301
|
await writeFile(join(this.config.workingDir, '.swc', '.gitignore'), '*\n');
|
|
1066
1302
|
}
|
|
@@ -1109,10 +1345,16 @@ export const OPTIONS = handler;`;
|
|
|
1109
1345
|
const workflowCount = Object.values(workflows).reduce((acc, w) => acc + Object.keys(w).length, 0);
|
|
1110
1346
|
const classCount = Object.values(classes).reduce((acc, c) => acc + Object.keys(c).length, 0);
|
|
1111
1347
|
this.logCreateManifestInfo(`Created manifest with ${stepCount} ${pluralize('step', 'steps', stepCount)}, ${workflowCount} ${pluralize('workflow', 'workflows', workflowCount)}, and ${classCount} ${pluralize('class', 'classes', classCount)}`, `${Date.now() - buildStart}ms`);
|
|
1348
|
+
if (!this.config.suppressCreateManifestLogs) {
|
|
1349
|
+
console.log(`${this.getWorkflowBuildSummaryPrefix()} (${stepCount} ${pluralize('step', 'steps', stepCount)}, ${workflowCount} ${pluralize('workflow', 'workflows', workflowCount)}, time ${formatBuildDuration(this.getWorkflowBuildDuration())})`);
|
|
1350
|
+
}
|
|
1351
|
+
this.workflowBuildSummaryCount += 1;
|
|
1352
|
+
this.resetWorkflowBuildTimer();
|
|
1112
1353
|
return manifestJson;
|
|
1113
1354
|
}
|
|
1114
1355
|
catch (error) {
|
|
1115
1356
|
console.warn('Failed to create manifest:', error instanceof Error ? error.message : String(error));
|
|
1357
|
+
this.resetWorkflowBuildTimer();
|
|
1116
1358
|
return undefined;
|
|
1117
1359
|
}
|
|
1118
1360
|
}
|
|
@@ -1172,4 +1414,4 @@ export const OPTIONS = handler;`;
|
|
|
1172
1414
|
return result;
|
|
1173
1415
|
}
|
|
1174
1416
|
}
|
|
1175
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1idWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2Jhc2UtYnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDaEYsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUM1QyxPQUFPLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUN2RSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxTQUFTLEVBQUUsZUFBZSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDN0QsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sdUJBQXVCLE1BQU0sa0JBQWtCLENBQUM7QUFDdkQsT0FBTyxLQUFLLE9BQU8sTUFBTSxTQUFTLENBQUM7QUFDbkMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNqQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ2xDLE9BQU8sRUFDTCxpQkFBaUIsR0FFbEIsTUFBTSwwQkFBMEIsQ0FBQztBQUNsQyxPQUFPLEVBQUUsbUNBQW1DLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyRSxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUNuRixPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDdEQsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0saUNBQWlD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cnlwdG8nO1xuaW1wb3J0IHsgbWtkaXIsIHJlYWRGaWxlLCByZWFscGF0aCwgcmVuYW1lLCB3cml0ZUZpbGUgfSBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCB7IGNyZWF0ZVJlcXVpcmUgfSBmcm9tICdub2RlOm1vZHVsZSc7XG5pbXBvcnQgeyBiYXNlbmFtZSwgZGlybmFtZSwgam9pbiwgcmVsYXRpdmUsIHJlc29sdmUgfSBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHsgcHJvbWlzaWZ5IH0gZnJvbSAnbm9kZTp1dGlsJztcbmltcG9ydCB7IHBsdXJhbGl6ZSwgdXNlc1ZlcmNlbFdvcmxkIH0gZnJvbSAnQHdvcmtmbG93L3V0aWxzJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgZW5oYW5jZWRSZXNvbHZlT3JpZ2luYWwgZnJvbSAnZW5oYW5jZWQtcmVzb2x2ZSc7XG5pbXBvcnQgKiBhcyBlc2J1aWxkIGZyb20gJ2VzYnVpbGQnO1xuaW1wb3J0IHsgZmluZFVwIH0gZnJvbSAnZmluZC11cCc7XG5pbXBvcnQgeyBnbG9iIH0gZnJvbSAndGlueWdsb2JieSc7XG5pbXBvcnQge1xuICBhcHBseVN3Y1RyYW5zZm9ybSxcbiAgdHlwZSBXb3JrZmxvd01hbmlmZXN0LFxufSBmcm9tICcuL2FwcGx5LXN3Yy10cmFuc2Zvcm0uanMnO1xuaW1wb3J0IHsgY3JlYXRlV29ya2Zsb3dFbnRyeXBvaW50T3B0aW9uc0NvZGUgfSBmcm9tICcuL2NvbnN0YW50cy5qcyc7XG5pbXBvcnQgeyBjcmVhdGVEaXNjb3ZlckVudHJpZXNQbHVnaW4gfSBmcm9tICcuL2Rpc2NvdmVyLWVudHJpZXMtZXNidWlsZC1wbHVnaW4uanMnO1xuaW1wb3J0IHsgZ2V0RXNidWlsZFRzY29uZmlnT3B0aW9ucyB9IGZyb20gJy4vZXNidWlsZC10c2NvbmZpZy5qcyc7XG5pbXBvcnQgeyBnZXRJbXBvcnRQYXRoIH0gZnJvbSAnLi9tb2R1bGUtc3BlY2lmaWVyLmpzJztcbmltcG9ydCB7IGNyZWF0ZU5vZGVNb2R1bGVFcnJvclBsdWdpbiB9IGZyb20gJy4vbm9kZS1tb2R1bGUtZXNidWlsZC1wbHVnaW4uanMnO1xuaW1wb3J0IHsgY3JlYXRlUHNldWRvUGFja2FnZVBsdWdpbiB9IGZyb20gJy4vcHNldWRvLXBhY2thZ2UtZXNidWlsZC1wbHVnaW4uanMnO1xuaW1wb3J0IHsgY3JlYXRlU3djUGx1Z2luIH0gZnJvbSAnLi9zd2MtZXNidWlsZC1wbHVnaW4uanMnO1xuaW1wb3J0IHsgZGV0ZWN0V29ya2Zsb3dQYXR0ZXJucyB9IGZyb20gJy4vdHJhbnNmb3JtLXV0aWxzLmpzJztcbmltcG9ydCB0eXBlIHsgV29ya2Zsb3dDb25maWcgfSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7IGV4dHJhY3RXb3JrZmxvd0dyYXBocyB9IGZyb20gJy4vd29ya2Zsb3dzLWV4dHJhY3Rvci5qcyc7XG5cbmNvbnN0IGVuaGFuY2VkUmVzb2x2ZSA9IHByb21pc2lmeShlbmhhbmNlZFJlc29sdmVPcmlnaW5hbCk7XG5jb25zdCByZXF1aXJlID0gY3JlYXRlUmVxdWlyZShpbXBvcnQubWV0YS51cmwpO1xuXG5jb25zdCBFTUlUX1NPVVJDRU1BUFNfRk9SX0RFQlVHR0lORyA9XG4gIHByb2Nlc3MuZW52LldPUktGTE9XX0VNSVRfU09VUkNFTUFQU19GT1JfREVCVUdHSU5HID09PSAnMSc7XG5cbi8qKlxuICogTm9ybWFsaXplIGFuIGFycmF5IG9mIGZpbGUgcGF0aHMgYnkgYXBwZW5kaW5nIHRoZSBgcmVhbHBhdGgoKWAgb2YgZWFjaCBlbnRyeVxuICogKHRvIGhhbmRsZSBzeW1saW5rcywgZS5nLiBwbnBtL3dvcmtzcGFjZSBsYXlvdXRzKSBhbmQgZGVkdXBsaWNhdGluZy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gd2l0aFJlYWxwYXRocyhlbnRyaWVzOiBzdHJpbmdbXSk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgcmV0dXJuIEFycmF5LmZyb20oXG4gICAgbmV3IFNldChcbiAgICAgIChcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgZW50cmllcy5tYXAoYXN5bmMgKGVudHJ5KSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXNvbHZlZCA9IGF3YWl0IHJlYWxwYXRoKGVudHJ5KS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVkID8gW2VudHJ5LCByZXNvbHZlZF0gOiBbZW50cnldO1xuICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICAgICkuZmxhdCgpXG4gICAgKVxuICApO1xufVxuXG5leHBvcnQgdHlwZSBEaXNjb3ZlcmVkRW50cnlDb2xsZWN0aW9uID0gc3RyaW5nW10gfCBTZXQ8c3RyaW5nPjtcblxuZXhwb3J0IGludGVyZmFjZSBEaXNjb3ZlcmVkRW50cmllcyB7XG4gIGRpc2NvdmVyZWRTdGVwczogRGlzY292ZXJlZEVudHJ5Q29sbGVjdGlvbjtcbiAgZGlzY292ZXJlZFdvcmtmbG93czogRGlzY292ZXJlZEVudHJ5Q29sbGVjdGlvbjtcbiAgZGlzY292ZXJlZFNlcmRlRmlsZXM6IERpc2NvdmVyZWRFbnRyeUNvbGxlY3Rpb247XG59XG5cbi8qKlxuICogQmFzZSBjbGFzcyBmb3Igd29ya2Zsb3cgYnVpbGRlcnMuIFByb3ZpZGVzIGNvbW1vbiBidWlsZCBsb2dpYyBmb3IgdHJhbnNmb3JtaW5nXG4gKiB3b3JrZmxvdyBzb3VyY2UgZmlsZXMgaW50byBkZXBsb3lhYmxlIGJ1bmRsZXMgdXNpbmcgZXNidWlsZCBhbmQgU1dDLlxuICpcbiAqIFN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQgdGhlIGJ1aWxkKCkgbWV0aG9kIHRvIGRlZmluZSBidWlsZGVyLXNwZWNpZmljIGxvZ2ljLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZUJ1aWxkZXIge1xuICBwcm90ZWN0ZWQgY29uZmlnOiBXb3JrZmxvd0NvbmZpZztcblxuICAvKipcbiAgICogVHJhY2tzIHdoaWNoIGV4dGVybmFsIHBhY2thZ2VzIGhhdmUgYWxyZWFkeSBiZWVuIHdhcm5lZCBhYm91dFxuICAgKiB0byBhdm9pZCBkdXBsaWNhdGUgd2FybmluZ3MgYWNyb3NzIG11bHRpcGxlIGRpc2NvdmVyRW50cmllcygpIGNhbGxzLlxuICAgKi9cbiAgcHJpdmF0ZSB3YXJuZWRFeHRlcm5hbFBhY2thZ2VzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBXb3JrZmxvd0NvbmZpZykge1xuICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCB0cmFuc2Zvcm1Qcm9qZWN0Um9vdCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5wcm9qZWN0Um9vdCB8fCB0aGlzLmNvbmZpZy53b3JraW5nRGlyO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgaW5mb3JtYXRpb25hbCBCYXNlQnVpbGRlciBsb2dzIHNob3VsZCBiZSBwcmludGVkLlxuICAgKiBTdWJjbGFzc2VzIGNhbiBvdmVycmlkZSB0aGlzIHRvIHNpbGVuY2UgcHJvZ3Jlc3MgbG9ncyB3aGlsZSBrZWVwaW5nIHdhcm5pbmdzL2Vycm9ycy5cbiAgICovXG4gIHByb3RlY3RlZCBnZXQgc2hvdWxkTG9nQmFzZUJ1aWxkZXJJbmZvKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHJvdGVjdGVkIGxvZ0Jhc2VCdWlsZGVySW5mbyguLi5hcmdzOiB1bmtub3duW10pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zaG91bGRMb2dCYXNlQnVpbGRlckluZm8pIHtcbiAgICAgIGNvbnNvbGUubG9nKC4uLmFyZ3MpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbG9nQ3JlYXRlV29ya2Zsb3dzQnVuZGxlSW5mbyguLi5hcmdzOiB1bmtub3duW10pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY29uZmlnLnN1cHByZXNzQ3JlYXRlV29ya2Zsb3dzQnVuZGxlTG9ncykge1xuICAgICAgdGhpcy5sb2dCYXNlQnVpbGRlckluZm8oLi4uYXJncyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBsb2dDcmVhdGVXZWJob29rQnVuZGxlSW5mbyguLi5hcmdzOiB1bmtub3duW10pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY29uZmlnLnN1cHByZXNzQ3JlYXRlV2ViaG9va0J1bmRsZUxvZ3MpIHtcbiAgICAgIHRoaXMubG9nQmFzZUJ1aWxkZXJJbmZvKC4uLmFyZ3MpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgbG9nQ3JlYXRlTWFuaWZlc3RJbmZvKC4uLmFyZ3M6IHVua25vd25bXSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jb25maWcuc3VwcHJlc3NDcmVhdGVNYW5pZmVzdExvZ3MpIHtcbiAgICAgIHRoaXMubG9nQmFzZUJ1aWxkZXJJbmZvKC4uLmFyZ3MpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBXaGVuIG91dHB1dHRpbmcgQ0pTLCBlc2J1aWxkIHJlcGxhY2VzIGBpbXBvcnQubWV0YWAgd2l0aCBhbiBlbXB0eSBvYmplY3QsXG4gICAqIG1ha2luZyBgaW1wb3J0Lm1ldGEudXJsYCAoYW5kIGBpbXBvcnQubWV0YS5yZXNvbHZlYCkgdW5kZWZpbmVkLiBUaGlzIG1ldGhvZFxuICAgKiByZXR1cm5zIGJhbm5lciBjb2RlIGFuZCBgZGVmaW5lYCBlbnRyaWVzIHRoYXQgcG9seWZpbGwgdGhlbSB1c2luZyBDSlNcbiAgICogZXF1aXZhbGVudHMgKGBfX2ZpbGVuYW1lYCwgYHJlcXVpcmUucmVzb2x2ZWApIHNvIHVzZXIgY29kZSAoZS5nLiBQcmlzbWEpXG4gICAqIHRoYXQgcmVsaWVzIG9uIGBpbXBvcnQubWV0YS51cmxgIHdvcmtzIGNvcnJlY3RseSBpbiBidW5kbGVkIENKUyBvdXRwdXQuXG4gICAqL1xuICBwcml2YXRlIGdldENqc0ltcG9ydE1ldGFQb2x5ZmlsbChmb3JtYXQ6IHN0cmluZyk6IHtcbiAgICBiYW5uZXI6IHN0cmluZztcbiAgICBkZWZpbmU6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIH0ge1xuICAgIGlmIChmb3JtYXQgIT09ICdjanMnKSByZXR1cm4geyBiYW5uZXI6ICcnLCBkZWZpbmU6IHt9IH07XG4gICAgcmV0dXJuIHtcbiAgICAgIGJhbm5lcjpcbiAgICAgICAgJ3ZhciBfX2ltcG9ydF9tZXRhX3VybCA9IHR5cGVvZiBfX2ZpbGVuYW1lICE9PSBcInVuZGVmaW5lZFwiID8gcmVxdWlyZShcInVybFwiKS5wYXRoVG9GaWxlVVJMKF9fZmlsZW5hbWUpLmhyZWYgOiB1bmRlZmluZWQ7XFxuJyArXG4gICAgICAgICd2YXIgX19pbXBvcnRfbWV0YV9yZXNvbHZlID0gdHlwZW9mIHJlcXVpcmUgIT09IFwidW5kZWZpbmVkXCIgJiYgdHlwZW9mIF9fZmlsZW5hbWUgIT09IFwidW5kZWZpbmVkXCIgJyArXG4gICAgICAgICc/IChzKSA9PiByZXF1aXJlKFwidXJsXCIpLnBhdGhUb0ZpbGVVUkwocmVxdWlyZS5yZXNvbHZlKHMpKS5ocmVmIDogdW5kZWZpbmVkO1xcbicsXG4gICAgICBkZWZpbmU6IHtcbiAgICAgICAgJ2ltcG9ydC5tZXRhLnVybCc6ICdfX2ltcG9ydF9tZXRhX3VybCcsXG4gICAgICAgICdpbXBvcnQubWV0YS5yZXNvbHZlJzogJ19faW1wb3J0X21ldGFfcmVzb2x2ZScsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUGVyZm9ybXMgdGhlIGNvbXBsZXRlIGJ1aWxkIHByb2Nlc3MgZm9yIHdvcmtmbG93cy5cbiAgICogU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCB0aGlzIHRvIGRlZmluZSB0aGVpciBzcGVjaWZpYyBidWlsZCBzdGVwcy5cbiAgICovXG4gIGFic3RyYWN0IGJ1aWxkKCk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIEZpbmRzIHRzY29uZmlnLmpzb24vanNjb25maWcuanNvbiBmb3IgdGhlIHByb2plY3QuXG4gICAqIFVzZWQgYnkgZXNidWlsZCB0byBwcm9wZXJseSByZXNvbHZlIG1vZHVsZSBpbXBvcnRzIGR1cmluZyBidW5kbGluZy5cbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBmaW5kVHNDb25maWdQYXRoKCk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3QgY3dkID0gdGhpcy5jb25maWcud29ya2luZ0RpciB8fCBwcm9jZXNzLmN3ZCgpO1xuICAgIHJldHVybiBmaW5kVXAoWyd0c2NvbmZpZy5qc29uJywgJ2pzY29uZmlnLmpzb24nXSwgeyBjd2QgfSk7XG4gIH1cblxuICAvKipcbiAgICogRGlzY292ZXJzIGFsbCBzb3VyY2UgZmlsZXMgaW4gdGhlIGNvbmZpZ3VyZWQgZGlyZWN0b3JpZXMuXG4gICAqIFNlYXJjaGVzIGZvciBUeXBlU2NyaXB0IGFuZCBKYXZhU2NyaXB0IGZpbGVzIHdoaWxlIGV4Y2x1ZGluZyBjb21tb24gYnVpbGRcbiAgICogYW5kIGRlcGVuZGVuY3kgZGlyZWN0b3JpZXMuXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgZ2V0SW5wdXRGaWxlcygpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgY29uc3QgaWdub3JlID0gW1xuICAgICAgJyoqL25vZGVfbW9kdWxlcy8qKicsXG4gICAgICAnKiovLmdpdC8qKicsXG4gICAgICAnKiovLm5leHQvKionLFxuICAgICAgJyoqLy5uaXRyby8qKicsXG4gICAgICAnKiovLm51eHQvKionLFxuICAgICAgJyoqLy5vdXRwdXQvKionLFxuICAgICAgJyoqLy52ZXJjZWwvKionLFxuICAgICAgJyoqLy53b3JrZmxvdy1kYXRhLyoqJyxcbiAgICAgICcqKi8ud29ya2Zsb3ctdml0ZXN0LyoqJyxcbiAgICAgICcqKi8ud2VsbC1rbm93bi93b3JrZmxvdy8qKicsXG4gICAgICAnKiovLnN2ZWx0ZS1raXQvKionLFxuICAgICAgJyoqLy50dXJiby8qKicsXG4gICAgICAnKiovLmNhY2hlLyoqJyxcbiAgICAgICcqKi8ueWFybi8qKicsXG4gICAgICAnKiovLnBucG0tc3RvcmUvKionLFxuICAgIF07XG5cbiAgICAvLyBVc2UgcmVsYXRpdmUgcGF0dGVybnMgd2l0aCBgY3dkYCBwZXIgZGlyZWN0b3J5IHNvIHRoYXQgYGRvdDogdHJ1ZWBcbiAgICAvLyBhcHBsaWVzIGNvbnNpc3RlbnRseSB0byBib3RoIHRoZSBzZWFyY2ggcGF0dGVybiAqYW5kKiB0aGUgaWdub3JlXG4gICAgLy8gcGF0dGVybnMuIFdoZW4gYWJzb2x1dGUgcGF0dGVybnMgYXJlIHVzZWQgd2l0aCB0aW55Z2xvYmJ5LCB0aGUgYCoqYFxuICAgIC8vIGluIGlnbm9yZSBwYXR0ZXJucyBkb2VzIG5vdCBtYXRjaCBkb3QtcHJlZml4ZWQgcGF0aCBzZWdtZW50cy5cbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICB0aGlzLmNvbmZpZy5kaXJzLm1hcCgoZGlyKSA9PiB7XG4gICAgICAgIGNvbnN0IGN3ZCA9IHJlc29sdmUodGhpcy5jb25maWcud29ya2luZ0RpciwgZGlyKTtcbiAgICAgICAgcmV0dXJuIGdsb2IoWycqKi8qLnt0cyx0c3gsbXRzLGN0cyxqcyxqc3gsbWpzLGNqc30nXSwge1xuICAgICAgICAgIGN3ZCxcbiAgICAgICAgICBpZ25vcmUsXG4gICAgICAgICAgYWJzb2x1dGU6IHRydWUsXG4gICAgICAgICAgZG90OiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIHJldHVybiByZXN1bHRzLmZsYXQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWNoZXMgZGlzY292ZXJlZCB3b3JrZmxvdyBlbnRyaWVzIGJ5IGlucHV0IGFycmF5IHJlZmVyZW5jZS5cbiAgICogVXNlcyBXZWFrTWFwIHRvIGFsbG93IGdhcmJhZ2UgY29sbGVjdGlvbiB3aGVuIGlucHV0IGFycmF5cyBhcmUgbm8gbG9uZ2VyIHJlZmVyZW5jZWQuXG4gICAqIFRoaXMgY2FjaGUgaXMgaW52YWxpZGF0ZWQgYXV0b21hdGljYWxseSB3aGVuIHRoZSBpbnB1dHMgYXJyYXkgcmVmZXJlbmNlIGNoYW5nZXNcbiAgICogKGUuZy4sIHdoZW4gZmlsZXMgYXJlIGFkZGVkL3JlbW92ZWQgZHVyaW5nIHdhdGNoIG1vZGUpLlxuICAgKi9cbiAgcHJpdmF0ZSBkaXNjb3ZlcmVkRW50cmllczogV2Vha01hcDxzdHJpbmdbXSwgRGlzY292ZXJlZEVudHJpZXM+ID1cbiAgICBuZXcgV2Vha01hcCgpO1xuXG4gIC8qKlxuICAgKiBQc2V1ZG8tcGFja2FnZXMgdGhhdCBzaG91bGQgbm90IGJlIGNoZWNrZWQgZm9yIHdvcmtmbG93IHBhdHRlcm5zLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgUFNFVURPX1BBQ0tBR0VTID0gbmV3IFNldChbXG4gICAgJ3NlcnZlci1vbmx5JyxcbiAgICAnY2xpZW50LW9ubHknLFxuICBdKTtcblxuICAvKipcbiAgICogQ2hlY2tzIGVhY2ggcGFja2FnZSBpbiBleHRlcm5hbFBhY2thZ2VzIGZvciB3b3JrZmxvdyBwYXR0ZXJucyBhbmQgZW1pdHNcbiAgICogd2FybmluZ3MgaWYgYW55IGNvbnRhaW4gXCJ1c2Ugc3RlcFwiLCBcInVzZSB3b3JrZmxvd1wiIGRpcmVjdGl2ZXMsIG9yXG4gICAqIHNlcmlhbGl6YXRpb24gY2xhc3Nlcy4gVGhlc2UgcGF0dGVybnMgd2lsbCBub3QgYmUgdHJhbnNmb3JtZWQgYnkgdGhlXG4gICAqIHdvcmtmbG93IGNvbXBpbGVyIHdoZW4gdGhlIHBhY2thZ2UgaXMgZXh0ZXJuYWxpemVkLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB3YXJuQWJvdXRFeHRlcm5hbFdvcmtmbG93UGFja2FnZXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZXh0ZXJuYWxQYWNrYWdlcyA9IHRoaXMuY29uZmlnLmV4dGVybmFsUGFja2FnZXM7XG4gICAgaWYgKCFleHRlcm5hbFBhY2thZ2VzPy5sZW5ndGgpIHJldHVybjtcblxuICAgIGZvciAoY29uc3QgcGtnIG9mIGV4dGVybmFsUGFja2FnZXMpIHtcbiAgICAgIGlmIChCYXNlQnVpbGRlci5QU0VVRE9fUEFDS0FHRVMuaGFzKHBrZykpIGNvbnRpbnVlO1xuICAgICAgaWYgKHRoaXMud2FybmVkRXh0ZXJuYWxQYWNrYWdlcy5oYXMocGtnKSkgY29udGludWU7XG5cbiAgICAgIGlmIChcbiAgICAgICAgcGtnLnN0YXJ0c1dpdGgoJy4nKSB8fFxuICAgICAgICBwa2cuc3RhcnRzV2l0aCgnLycpIHx8XG4gICAgICAgIHBrZy5zdGFydHNXaXRoKCckJykgfHxcbiAgICAgICAgcGtnLmluY2x1ZGVzKCcqJykgfHxcbiAgICAgICAgcGtnLmluY2x1ZGVzKCc6JylcbiAgICAgICkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gQ2hlY2sgcGFja2FnZS5qc29uIGRlcGVuZGVuY2llcyBmb3IgQHdvcmtmbG93L3NlcmRlIChmYXN0IHBhdGgpXG4gICAgICAgIGxldCBoYXNXb3JrZmxvd1NlcmRlRGVwID0gZmFsc2U7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcGtnSnNvblBhdGggPSByZXF1aXJlLnJlc29sdmUoYCR7cGtnfS9wYWNrYWdlLmpzb25gLCB7XG4gICAgICAgICAgICBwYXRoczogW3RoaXMuY29uZmlnLndvcmtpbmdEaXJdLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGNvbnN0IHBrZ0pzb25Tb3VyY2UgPSBhd2FpdCByZWFkRmlsZShwa2dKc29uUGF0aCwgJ3V0Zi04Jyk7XG4gICAgICAgICAgY29uc3QgcGtnSnNvbiA9IEpTT04ucGFyc2UocGtnSnNvblNvdXJjZSkgYXMge1xuICAgICAgICAgICAgZGVwZW5kZW5jaWVzPzogdW5rbm93bjtcbiAgICAgICAgICAgIHBlZXJEZXBlbmRlbmNpZXM/OiB1bmtub3duO1xuICAgICAgICAgIH07XG4gICAgICAgICAgY29uc3QgZGVwZW5kZW5jaWVzID1cbiAgICAgICAgICAgIHR5cGVvZiBwa2dKc29uLmRlcGVuZGVuY2llcyA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgICAgIHBrZ0pzb24uZGVwZW5kZW5jaWVzICE9PSBudWxsICYmXG4gICAgICAgICAgICAhQXJyYXkuaXNBcnJheShwa2dKc29uLmRlcGVuZGVuY2llcylcbiAgICAgICAgICAgICAgPyAocGtnSnNvbi5kZXBlbmRlbmNpZXMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pXG4gICAgICAgICAgICAgIDoge307XG4gICAgICAgICAgY29uc3QgcGVlckRlcGVuZGVuY2llcyA9XG4gICAgICAgICAgICB0eXBlb2YgcGtnSnNvbi5wZWVyRGVwZW5kZW5jaWVzID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgICAgcGtnSnNvbi5wZWVyRGVwZW5kZW5jaWVzICE9PSBudWxsICYmXG4gICAgICAgICAgICAhQXJyYXkuaXNBcnJheShwa2dKc29uLnBlZXJEZXBlbmRlbmNpZXMpXG4gICAgICAgICAgICAgID8gKHBrZ0pzb24ucGVlckRlcGVuZGVuY2llcyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilcbiAgICAgICAgICAgICAgOiB7fTtcbiAgICAgICAgICBoYXNXb3JrZmxvd1NlcmRlRGVwID1cbiAgICAgICAgICAgIE9iamVjdC5oYXNPd24oZGVwZW5kZW5jaWVzLCAnQHdvcmtmbG93L3NlcmRlJykgfHxcbiAgICAgICAgICAgIE9iamVjdC5oYXNPd24ocGVlckRlcGVuZGVuY2llcywgJ0B3b3JrZmxvdy9zZXJkZScpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBwYWNrYWdlLmpzb24gbm90IHJlc29sdmFibGUgLSBjb250aW51ZSB0byBzb3VyY2UgY2hlY2tcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIHNvdXJjZSBwYXR0ZXJucyAodGhvcm91Z2ggcGF0aCkuXG4gICAgICAgIC8vIE5vdGU6IHJlcXVpcmUucmVzb2x2ZSBvbmx5IGluc3BlY3RzIHRoZSBwYWNrYWdlJ3MgbWFpbiBlbnRyeSBwb2ludC5cbiAgICAgICAgLy8gSWYgd29ya2Zsb3cgY29uc3RydWN0cyBsaXZlIGluIHN1Yi1wYXRocyAoZS5nLiBgbXktcGtnL3dvcmtmbG93c2ApLFxuICAgICAgICAvLyB0aGV5IHdvbid0IGJlIGRldGVjdGVkIGhlcmUuIFRoZSBAd29ya2Zsb3cvc2VyZGUgZGVwIGNoZWNrIGFib3ZlXG4gICAgICAgIC8vIHBhcnRpYWxseSBjb3ZlcnMgc2VyZGUgY2FzZXMuIFRoaXMgaXMgYWNjZXB0YWJsZSBhcyBhIGJlc3QtZWZmb3J0XG4gICAgICAgIC8vIGhldXJpc3RpYyDigJQgdGhlIHByaW1hcnkgZml4IGlzIGF1dG8tcmVtb3ZhbCBpbiB3aXRoV29ya2Zsb3coKS5cbiAgICAgICAgbGV0IGhhc1VzZVN0ZXAgPSBmYWxzZTtcbiAgICAgICAgbGV0IGhhc1VzZVdvcmtmbG93ID0gZmFsc2U7XG4gICAgICAgIGxldCBoYXNTZXJkZSA9IGhhc1dvcmtmbG93U2VyZGVEZXA7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgZW50cnlQYXRoID0gcmVxdWlyZS5yZXNvbHZlKHBrZywge1xuICAgICAgICAgICAgcGF0aHM6IFt0aGlzLmNvbmZpZy53b3JraW5nRGlyXSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjb25zdCBzb3VyY2UgPSBhd2FpdCByZWFkRmlsZShlbnRyeVBhdGgsICd1dGYtOCcpO1xuICAgICAgICAgIGNvbnN0IHBhdHRlcm5zID0gZGV0ZWN0V29ya2Zsb3dQYXR0ZXJucyhzb3VyY2UpO1xuICAgICAgICAgIGhhc1VzZVN0ZXAgPSBwYXR0ZXJucy5oYXNVc2VTdGVwO1xuICAgICAgICAgIGhhc1VzZVdvcmtmbG93ID0gcGF0dGVybnMuaGFzVXNlV29ya2Zsb3c7XG4gICAgICAgICAgaWYgKCFoYXNTZXJkZSkge1xuICAgICAgICAgICAgaGFzU2VyZGUgPSBwYXR0ZXJucy5oYXNTZXJkZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIEVudHJ5IGZpbGUgbm90IHJlc29sdmFibGUgb3Igbm90IHJlYWRhYmxlIC0gdXNlIHdoYXQgd2UgaGF2ZVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFoYXNVc2VTdGVwICYmICFoYXNVc2VXb3JrZmxvdyAmJiAhaGFzU2VyZGUpIGNvbnRpbnVlO1xuXG4gICAgICAgIC8vIEJ1aWxkIGEgc3BlY2lmaWMgZGVzY3JpcHRpb24gb2Ygd2hhdCB3YXMgZm91bmRcbiAgICAgICAgY29uc3QgaXNzdWVzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBpZiAoaGFzVXNlV29ya2Zsb3cpIGlzc3Vlcy5wdXNoKCdcInVzZSB3b3JrZmxvd1wiIGZ1bmN0aW9ucycpO1xuICAgICAgICBpZiAoaGFzVXNlU3RlcCkgaXNzdWVzLnB1c2goJ1widXNlIHN0ZXBcIiBmdW5jdGlvbnMnKTtcbiAgICAgICAgaWYgKGhhc1NlcmRlKSBpc3N1ZXMucHVzaCgnc2VyaWFsaXphdGlvbiBjbGFzc2VzJyk7XG5cbiAgICAgICAgdGhpcy53YXJuZWRFeHRlcm5hbFBhY2thZ2VzLmFkZChwa2cpO1xuXG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgXFxuJHtjaGFsay55ZWxsb3coJ+KaoCcpfSBXYXJuaW5nOiAke2NoYWxrLmJvbGQoYFwiJHtwa2d9XCJgKX0gaXMgbGlzdGVkIGluICR7Y2hhbGsuYm9sZCgnZXh0ZXJuYWxQYWNrYWdlcycpfSAoJHtjaGFsay5ib2xkKCdzZXJ2ZXJFeHRlcm5hbFBhY2thZ2VzJyl9IGluIE5leHQuanMpIGJ1dCBjb250YWlucyB3b3JrZmxvdyBjb2RlICgke2lzc3Vlcy5qb2luKCcsICcpfSkuYCArXG4gICAgICAgICAgICBgXFxuICBUaGlzIGNvZGUgd2lsbCAke2NoYWxrLmJvbGQoJ25vdCcpfSBiZSB0cmFuc2Zvcm1lZCBieSB0aGUgd29ya2Zsb3cgY29tcGlsZXIsIHdoaWNoIGNhbiBjYXVzZSBydW50aW1lIGZhaWx1cmVzLmAgK1xuICAgICAgICAgICAgYFxcbiAgUmVtb3ZlICR7Y2hhbGsuYm9sZChgXCIke3BrZ31cImApfSBmcm9tICR7Y2hhbGsuYm9sZCgnZXh0ZXJuYWxQYWNrYWdlcycpfSAoJHtjaGFsay5ib2xkKCdzZXJ2ZXJFeHRlcm5hbFBhY2thZ2VzJyl9IGluIE5leHQuanMpIHRvIGZpeCB0aGlzLlxcbmBcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBCZXN0LWVmZm9ydDogaWYgYW55dGhpbmcgZ29lcyB3cm9uZywgc2tpcCB0aGlzIHBhY2thZ2Ugc2lsZW50bHlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgZGlzY292ZXJFbnRyaWVzKFxuICAgIGlucHV0czogc3RyaW5nW10sXG4gICAgb3V0ZGlyOiBzdHJpbmcsXG4gICAgdHNjb25maWdQYXRoPzogc3RyaW5nXG4gICk6IFByb21pc2U8RGlzY292ZXJlZEVudHJpZXM+IHtcbiAgICBjb25zdCBwcmV2aW91c1Jlc3VsdCA9IHRoaXMuZGlzY292ZXJlZEVudHJpZXMuZ2V0KGlucHV0cyk7XG5cbiAgICBpZiAocHJldmlvdXNSZXN1bHQpIHtcbiAgICAgIHJldHVybiBwcmV2aW91c1Jlc3VsdDtcbiAgICB9XG4gICAgY29uc3Qgc3RhdGU6IERpc2NvdmVyZWRFbnRyaWVzID0ge1xuICAgICAgZGlzY292ZXJlZFN0ZXBzOiBuZXcgU2V0KCksXG4gICAgICBkaXNjb3ZlcmVkV29ya2Zsb3dzOiBuZXcgU2V0KCksXG4gICAgICBkaXNjb3ZlcmVkU2VyZGVGaWxlczogbmV3IFNldCgpLFxuICAgIH07XG5cbiAgICBjb25zdCBkaXNjb3ZlclN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCBlZmZlY3RpdmVUc2NvbmZpZ1BhdGggPVxuICAgICAgdHNjb25maWdQYXRoID8/IChhd2FpdCB0aGlzLmZpbmRUc0NvbmZpZ1BhdGgoKSk7XG4gICAgY29uc3QgZXNidWlsZFRzY29uZmlnT3B0aW9ucyA9IGF3YWl0IGdldEVzYnVpbGRUc2NvbmZpZ09wdGlvbnMoXG4gICAgICBlZmZlY3RpdmVUc2NvbmZpZ1BhdGhcbiAgICApO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBlc2J1aWxkLmJ1aWxkKHtcbiAgICAgICAgdHJlZVNoYWtpbmc6IHRydWUsXG4gICAgICAgIGVudHJ5UG9pbnRzOiBpbnB1dHMsXG4gICAgICAgIHBsdWdpbnM6IFtcbiAgICAgICAgICBjcmVhdGVEaXNjb3ZlckVudHJpZXNQbHVnaW4oc3RhdGUsIHRoaXMudHJhbnNmb3JtUHJvamVjdFJvb3QpLFxuICAgICAgICBdLFxuICAgICAgICBwbGF0Zm9ybTogJ25vZGUnLFxuICAgICAgICB3cml0ZTogZmFsc2UsXG4gICAgICAgIG91dGRpcixcbiAgICAgICAgYnVuZGxlOiB0cnVlLFxuICAgICAgICBzb3VyY2VtYXA6IGZhbHNlLFxuICAgICAgICBhYnNXb3JraW5nRGlyOiB0aGlzLmNvbmZpZy53b3JraW5nRGlyLFxuICAgICAgICBsb2dMZXZlbDogJ3NpbGVudCcsXG4gICAgICAgIC4uLmVzYnVpbGRUc2NvbmZpZ09wdGlvbnMsXG4gICAgICAgIC8vIEV4dGVybmFsIHBhY2thZ2VzIHRoYXQgc2hvdWxkIG5vdCBiZSBidW5kbGVkIGR1cmluZyBkaXNjb3ZlcnlcbiAgICAgICAgZXh0ZXJuYWw6IHRoaXMuY29uZmlnLmV4dGVybmFsUGFja2FnZXMgfHwgW10sXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChfKSB7fVxuXG4gICAgdGhpcy5sb2dCYXNlQnVpbGRlckluZm8oXG4gICAgICBgRGlzY292ZXJpbmcgd29ya2Zsb3cgZGlyZWN0aXZlc2AsXG4gICAgICBgJHtEYXRlLm5vdygpIC0gZGlzY292ZXJTdGFydH1tc2BcbiAgICApO1xuXG4gICAgLy8gV2FybiBhYm91dCBleHRlcm5hbCBwYWNrYWdlcyB0aGF0IGNvbnRhaW4gd29ya2Zsb3cgY29kZVxuICAgIGF3YWl0IHRoaXMud2FybkFib3V0RXh0ZXJuYWxXb3JrZmxvd1BhY2thZ2VzKCk7XG5cbiAgICB0aGlzLmRpc2NvdmVyZWRFbnRyaWVzLnNldChpbnB1dHMsIHN0YXRlKTtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cblxuICAvKipcbiAgICogV3JpdGVzIGRlYnVnIGluZm9ybWF0aW9uIHRvIGEgSlNPTiBmaWxlIGZvciB0cm91Ymxlc2hvb3RpbmcgYnVpbGQgaXNzdWVzLlxuICAgKiBVc2VzIGF0b21pYyB3cml0ZSAodGVtcCBmaWxlICsgcmVuYW1lKSB0byBwcmV2ZW50IHJhY2UgY29uZGl0aW9ucyB3aGVuXG4gICAqIG11bHRpcGxlIGJ1aWxkcyBydW4gY29uY3VycmVudGx5LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB3cml0ZURlYnVnRmlsZShcbiAgICBvdXRmaWxlOiBzdHJpbmcsXG4gICAgZGVidWdEYXRhOiBvYmplY3QsXG4gICAgbWVyZ2U/OiBib29sZWFuXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHByZWZpeCA9IHRoaXMuY29uZmlnLmRlYnVnRmlsZVByZWZpeCB8fCAnJztcbiAgICBjb25zdCB0YXJnZXRQYXRoID0gYCR7ZGlybmFtZShvdXRmaWxlKX0vJHtwcmVmaXh9JHtiYXNlbmFtZShvdXRmaWxlKX0uZGVidWcuanNvbmA7XG4gICAgbGV0IGV4aXN0aW5nID0ge307XG5cbiAgICB0cnkge1xuICAgICAgaWYgKG1lcmdlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IHJlYWRGaWxlKHRhcmdldFBhdGgsICd1dGY4Jyk7XG4gICAgICAgICAgZXhpc3RpbmcgPSBKU09OLnBhcnNlKGNvbnRlbnQpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgLy8gRmlsZSBkb2Vzbid0IGV4aXN0IHlldCBvciBpcyBjb3JydXB0ZWQgLSBzdGFydCBmcmVzaC5cbiAgICAgICAgICAvLyBEb24ndCBsb2cgZXJyb3IgZm9yIEVOT0VOVCAoZmlsZSBub3QgZm91bmQpIGFzIHRoYXQncyBleHBlY3RlZCBvbiBmaXJzdCBydW4uXG4gICAgICAgICAgaWYgKChlIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbikuY29kZSAhPT0gJ0VOT0VOVCcpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignRXJyb3IgcmVhZGluZyBkZWJ1ZyBmaWxlLCBzdGFydGluZyBmcmVzaDonLCBlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgbWVyZ2VkRGF0YSA9IEpTT04uc3RyaW5naWZ5KFxuICAgICAgICB7XG4gICAgICAgICAgLi4uZXhpc3RpbmcsXG4gICAgICAgICAgLi4uZGVidWdEYXRhLFxuICAgICAgICB9LFxuICAgICAgICBudWxsLFxuICAgICAgICAyXG4gICAgICApO1xuXG4gICAgICAvLyBXcml0ZSBhdG9taWNhbGx5OiB3cml0ZSB0byB0ZW1wIGZpbGUsIHRoZW4gcmVuYW1lLlxuICAgICAgLy8gcmVuYW1lKCkgaXMgYXRvbWljIG9uIFBPU0lYIHN5c3RlbXMgYW5kIHByb3ZpZGVzIGJlc3QtZWZmb3J0IGF0b21pY2l0eSBvbiBXaW5kb3dzLlxuICAgICAgLy8gUHJldmVudHMgcmFjZSBjb25kaXRpb25zIHdoZXJlIGNvbmN1cnJlbnQgYnVpbGRzIHJlYWQgcGFydGlhbGx5LXdyaXR0ZW4gZmlsZXMuXG4gICAgICBjb25zdCB0ZW1wUGF0aCA9IGAke3RhcmdldFBhdGh9LiR7cmFuZG9tVVVJRCgpfS50bXBgO1xuICAgICAgYXdhaXQgd3JpdGVGaWxlKHRlbXBQYXRoLCBtZXJnZWREYXRhKTtcbiAgICAgIGF3YWl0IHJlbmFtZSh0ZW1wUGF0aCwgdGFyZ2V0UGF0aCk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIGNvbnNvbGUud2FybignRmFpbGVkIHRvIHdyaXRlIGRlYnVnIGZpbGU6JywgZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBMb2dzIGFuZCBvcHRpb25hbGx5IHRocm93cyBvbiBlc2J1aWxkIGVycm9ycyBhbmQgd2FybmluZ3MuXG4gICAqIEBwYXJhbSB0aHJvd09uRXJyb3IgLSBJZiB0cnVlLCB0aHJvd3MgYW4gZXJyb3Igd2hlbiBlc2J1aWxkIGVycm9ycyBhcmUgcHJlc2VudFxuICAgKi9cbiAgcHJpdmF0ZSBsb2dFc2J1aWxkTWVzc2FnZXMoXG4gICAgcmVzdWx0OiB7IGVycm9ycz86IGFueVtdOyB3YXJuaW5ncz86IGFueVtdIH0sXG4gICAgcGhhc2U6IHN0cmluZyxcbiAgICB0aHJvd09uRXJyb3IgPSB0cnVlLFxuICAgIG9wdGlvbnM/OiB7XG4gICAgICBzdXBwcmVzc1dhcm5pbmdzPzogYm9vbGVhbjtcbiAgICB9XG4gICk6IHZvaWQge1xuICAgIGlmIChyZXN1bHQuZXJyb3JzICYmIHJlc3VsdC5lcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc29sZS5lcnJvcihg4p2MIGVzYnVpbGQgZXJyb3JzIGluICR7cGhhc2V9OmApO1xuICAgICAgY29uc3QgZXJyb3JNZXNzYWdlczogc3RyaW5nW10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgZXJyb3Igb2YgcmVzdWx0LmVycm9ycykge1xuICAgICAgICBjb25zb2xlLmVycm9yKGAgICR7ZXJyb3IudGV4dH1gKTtcbiAgICAgICAgZXJyb3JNZXNzYWdlcy5wdXNoKGVycm9yLnRleHQpO1xuICAgICAgICBpZiAoZXJyb3IubG9jYXRpb24pIHtcbiAgICAgICAgICBjb25zdCBsb2NhdGlvbiA9IGAgICAgYXQgJHtlcnJvci5sb2NhdGlvbi5maWxlfToke2Vycm9yLmxvY2F0aW9uLmxpbmV9OiR7ZXJyb3IubG9jYXRpb24uY29sdW1ufWA7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihsb2NhdGlvbik7XG4gICAgICAgICAgZXJyb3JNZXNzYWdlcy5wdXNoKGxvY2F0aW9uKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodGhyb3dPbkVycm9yKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgQnVpbGQgZmFpbGVkIGR1cmluZyAke3BoYXNlfTpcXG4ke2Vycm9yTWVzc2FnZXMuam9pbignXFxuJyl9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChcbiAgICAgICFvcHRpb25zPy5zdXBwcmVzc1dhcm5pbmdzICYmXG4gICAgICByZXN1bHQud2FybmluZ3MgJiZcbiAgICAgIHJlc3VsdC53YXJuaW5ncy5sZW5ndGggPiAwXG4gICAgKSB7XG4gICAgICBjb25zb2xlLndhcm4oYCEgIGVzYnVpbGQgd2FybmluZ3MgaW4gJHtwaGFzZX06YCk7XG4gICAgICBmb3IgKGNvbnN0IHdhcm5pbmcgb2YgcmVzdWx0Lndhcm5pbmdzKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgICAke3dhcm5pbmcudGV4dH1gKTtcbiAgICAgICAgaWYgKHdhcm5pbmcubG9jYXRpb24pIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICBgICAgIGF0ICR7d2FybmluZy5sb2NhdGlvbi5maWxlfToke3dhcm5pbmcubG9jYXRpb24ubGluZX06JHt3YXJuaW5nLmxvY2F0aW9uLmNvbHVtbn1gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhbiBhYnNvbHV0ZSBmaWxlIHBhdGggdG8gYSBub3JtYWxpemVkIHJlbGF0aXZlIHBhdGggZm9yIHRoZSBtYW5pZmVzdC5cbiAgICovXG4gIHByaXZhdGUgZ2V0UmVsYXRpdmVGaWxlcGF0aChhYnNvbHV0ZVBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3Qgbm9ybWFsaXplZEZpbGUgPSBhYnNvbHV0ZVBhdGgucmVwbGFjZSgvXFxcXC9nLCAnLycpO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRXb3JraW5nRGlyID0gdGhpcy5jb25maWcud29ya2luZ0Rpci5yZXBsYWNlKC9cXFxcL2csICcvJyk7XG4gICAgbGV0IHJlbGF0aXZlUGF0aCA9IHJlbGF0aXZlKG5vcm1hbGl6ZWRXb3JraW5nRGlyLCBub3JtYWxpemVkRmlsZSkucmVwbGFjZShcbiAgICAgIC9cXFxcL2csXG4gICAgICAnLydcbiAgICApO1xuICAgIC8vIEhhbmRsZSBmaWxlcyBkaXNjb3ZlcmVkIG91dHNpZGUgdGhlIHdvcmtpbmcgZGlyZWN0b3J5XG4gICAgaWYgKHJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKCcuLi8nKSkge1xuICAgICAgcmVsYXRpdmVQYXRoID0gcmVsYXRpdmVQYXRoXG4gICAgICAgIC5zcGxpdCgnLycpXG4gICAgICAgIC5maWx0ZXIoKHBhcnQpID0+IHBhcnQgIT09ICcuLicpXG4gICAgICAgIC5qb2luKCcvJyk7XG4gICAgfVxuICAgIHJldHVybiByZWxhdGl2ZVBhdGg7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIGJ1bmRsZSBmb3Igd29ya2Zsb3cgc3RlcCBmdW5jdGlvbnMuXG4gICAqIFN0ZXBzIGhhdmUgZnVsbCBOb2RlLmpzIHJ1bnRpbWUgYWNjZXNzIGFuZCBoYW5kbGUgc2lkZSBlZmZlY3RzLCBBUEkgY2FsbHMsIGV0Yy5cbiAgICpcbiAgICogQHBhcmFtIGV4dGVybmFsaXplTm9uU3RlcHMgLSBJZiB0cnVlLCBvbmx5IGJ1bmRsZXMgc3RlcCBlbnRyeSBwb2ludHMgYW5kIGV4dGVybmFsaXplcyBvdGhlciBjb2RlXG4gICAqIEBwYXJhbSBidW5kbGVUcmFuc2l0aXZlTG9jYWxTdGVwRGVwZW5kZW5jaWVzIC0gSWYgdHJ1ZSwgYWxzbyBidW5kbGVzIHByb2plY3QtbG9jYWwgZmlsZXMgaW1wb3J0ZWQgYnkgc3RlcCBlbnRyaWVzIGZvciBkaXJlY3QgcnVudGltZSBsb2FkaW5nXG4gICAqIEByZXR1cm5zIEJ1aWxkIGNvbnRleHQgKGZvciB3YXRjaCBtb2RlKSBhbmQgdGhlIGNvbGxlY3RlZCB3b3JrZmxvdyBtYW5pZmVzdFxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGNyZWF0ZVN0ZXBzQnVuZGxlKHtcbiAgICBpbnB1dEZpbGVzLFxuICAgIGZvcm1hdCA9ICdjanMnLFxuICAgIG91dGZpbGUsXG4gICAgZXh0ZXJuYWxpemVOb25TdGVwcyxcbiAgICBidW5kbGVUcmFuc2l0aXZlTG9jYWxTdGVwRGVwZW5kZW5jaWVzLFxuICAgIHJld3JpdGVUc0V4dGVuc2lvbnMsXG4gICAgdHNjb25maWdQYXRoLFxuICAgIGRpc2NvdmVyZWRFbnRyaWVzLFxuICB9OiB7XG4gICAgdHNjb25maWdQYXRoPzogc3RyaW5nO1xuICAgIGlucHV0RmlsZXM6IHN0cmluZ1tdO1xuICAgIG91dGZpbGU6IHN0cmluZztcbiAgICBmb3JtYXQ/OiAnY2pzJyB8ICdlc20nO1xuICAgIGV4dGVybmFsaXplTm9uU3RlcHM/OiBib29sZWFuO1xuICAgIGJ1bmRsZVRyYW5zaXRpdmVMb2NhbFN0ZXBEZXBlbmRlbmNpZXM/OiBib29sZWFuO1xuICAgIHJld3JpdGVUc0V4dGVuc2lvbnM/OiBib29sZWFuO1xuICAgIGRpc2NvdmVyZWRFbnRyaWVzPzogRGlzY292ZXJlZEVudHJpZXM7XG4gIH0pOiBQcm9taXNlPHtcbiAgICBjb250ZXh0OiBlc2J1aWxkLkJ1aWxkQ29udGV4dCB8IHVuZGVmaW5lZDtcbiAgICBtYW5pZmVzdDogV29ya2Zsb3dNYW5pZmVzdDtcbiAgfT4ge1xuICAgIC8vIFRoZXNlIG5lZWQgdG8gaGFuZGxlIHdhdGNoaW5nIGZvciBkZXYgdG8gc2NhbiBmb3JcbiAgICAvLyBuZXcgZW50cmllcyBhbmQgY2hhbmdlcyB0byBleGlzdGluZyBvbmVzXG4gICAgY29uc3QgZGlzY292ZXJlZCA9XG4gICAgICBkaXNjb3ZlcmVkRW50cmllcyA/P1xuICAgICAgKGF3YWl0IHRoaXMuZGlzY292ZXJFbnRyaWVzKGlucHV0RmlsZXMsIGRpcm5hbWUob3V0ZmlsZSksIHRzY29uZmlnUGF0aCkpO1xuICAgIGNvbnN0IHN0ZXBGaWxlcyA9IFsuLi5kaXNjb3ZlcmVkLmRpc2NvdmVyZWRTdGVwc10uc29ydCgpO1xuICAgIGNvbnN0IHdvcmtmbG93RmlsZXMgPSBbLi4uZGlzY292ZXJlZC5kaXNjb3ZlcmVkV29ya2Zsb3dzXS5zb3J0KCk7XG4gICAgY29uc3Qgc2VyZGVGaWxlcyA9IFsuLi5kaXNjb3ZlcmVkLmRpc2NvdmVyZWRTZXJkZUZpbGVzXS5zb3J0KCk7XG5cbiAgICAvLyBJbmNsdWRlIHNlcmRlIGZpbGVzIHRoYXQgYXJlbid0IGFscmVhZHkgc3RlcCBmaWxlcyBmb3IgY3Jvc3MtY29udGV4dCBjbGFzcyByZWdpc3RyYXRpb24uXG4gICAgLy8gQ2xhc3NlcyBuZWVkIHRvIGJlIHJlZ2lzdGVyZWQgaW4gdGhlIHN0ZXAgYnVuZGxlIHNvIHRoZXkgY2FuIGJlIGRlc2VyaWFsaXplZFxuICAgIC8vIHdoZW4gcmVjZWl2aW5nIGRhdGEgZnJvbSB3b3JrZmxvd3MgYW5kIHNlcmlhbGl6ZWQgd2hlbiByZXR1cm5pbmcgZGF0YSB0byB3b3JrZmxvd3MuXG4gICAgY29uc3Qgc3RlcEZpbGVzU2V0ID0gbmV3IFNldChzdGVwRmlsZXMpO1xuICAgIGNvbnN0IHNlcmRlT25seUZpbGVzID0gc2VyZGVGaWxlcy5maWx0ZXIoKGYpID0+ICFzdGVwRmlsZXNTZXQuaGFzKGYpKTtcblxuICAgIC8vIGxvZyB0aGUgc3RlcCBmaWxlcyBmb3IgZGVidWdnaW5nXG4gICAgYXdhaXQgdGhpcy53cml0ZURlYnVnRmlsZShvdXRmaWxlLCB7XG4gICAgICBzdGVwRmlsZXMsXG4gICAgICB3b3JrZmxvd0ZpbGVzLFxuICAgICAgc2VyZGVPbmx5RmlsZXMsXG4gICAgfSk7XG5cbiAgICBjb25zdCBzdGVwc0J1bmRsZVN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCB3b3JrZmxvd01hbmlmZXN0OiBXb3JrZmxvd01hbmlmZXN0ID0ge307XG4gICAgY29uc3QgYnVpbHRJblN0ZXBzID0gJ3dvcmtmbG93L2ludGVybmFsL2J1aWx0aW5zJztcblxuICAgIGNvbnN0IHJlc29sdmVkQnVpbHRJblN0ZXBzID0gYXdhaXQgZW5oYW5jZWRSZXNvbHZlKFxuICAgICAgZGlybmFtZShvdXRmaWxlKSxcbiAgICAgICd3b3JrZmxvdy9pbnRlcm5hbC9idWlsdGlucydcbiAgICApLmNhdGNoKChlcnIpID0+IHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgW1xuICAgICAgICAgIGNoYWxrLnJlZCgnRmFpbGVkIHRvIHJlc29sdmUgYnVpbHQtaW4gc3RlcHMgc291cmNlcy4nKSxcbiAgICAgICAgICBgJHtjaGFsay55ZWxsb3cuYm9sZCgnaGludDonKX0gcnVuIFxcYCR7Y2hhbGsuY3lhbi5pdGFsaWMoJ25wbSBpbnN0YWxsIHdvcmtmbG93Jyl9XFxgIHRvIHJlc29sdmUgdGhpcyBpc3N1ZS5gLFxuICAgICAgICAgICcnLFxuICAgICAgICAgIGBDYXVzZWQgYnk6ICR7Y2hhbGsucmVkKFN0cmluZyhlcnIpKX1gLFxuICAgICAgICBdLmpvaW4oJ1xcbicpXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgLy8gSGVscGVyIHRvIGNyZWF0ZSBpbXBvcnQgc3RhdGVtZW50IGZyb20gZmlsZSBwYXRoXG4gICAgLy8gRm9yIHdvcmtzcGFjZS9ub2RlX21vZHVsZXMgcGFja2FnZXMsIHVzZXMgdGhlIHBhY2thZ2UgbmFtZSBzbyBlc2J1aWxkXG4gICAgLy8gd2lsbCByZXNvbHZlIHRocm91Z2ggcGFja2FnZS5qc29uIGV4cG9ydHMgd2l0aCB0aGUgYXBwcm9wcmlhdGUgY29uZGl0aW9uc1xuICAgIGNvbnN0IGNyZWF0ZUltcG9ydCA9IChmaWxlOiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IHsgaW1wb3J0UGF0aCwgaXNQYWNrYWdlIH0gPSBnZXRJbXBvcnRQYXRoKFxuICAgICAgICBmaWxlLFxuICAgICAgICB0aGlzLmNvbmZpZy53b3JraW5nRGlyXG4gICAgICApO1xuXG4gICAgICBpZiAoaXNQYWNrYWdlKSB7XG4gICAgICAgIC8vIFVzZSBwYWNrYWdlIG5hbWUgLSBlc2J1aWxkIHdpbGwgcmVzb2x2ZSB2aWEgcGFja2FnZS5qc29uIGV4cG9ydHNcbiAgICAgICAgcmV0dXJuIGBpbXBvcnQgJyR7aW1wb3J0UGF0aH0nO2A7XG4gICAgICB9XG5cbiAgICAgIC8vIExvY2FsIGFwcCBmaWxlIC0gdXNlIHJlbGF0aXZlIHBhdGhcbiAgICAgIC8vIE5vcm1hbGl6ZSBib3RoIHBhdGhzIHRvIGZvcndhcmQgc2xhc2hlcyBiZWZvcmUgY2FsbGluZyByZWxhdGl2ZSgpXG4gICAgICAvLyBUaGlzIGlzIGNyaXRpY2FsIG9uIFdpbmRvd3Mgd2hlcmUgcmVsYXRpdmUoKSBjYW4gcHJvZHVjZSB1bmV4cGVjdGVkIHJlc3VsdHMgd2l0aCBtaXhlZCBwYXRoIGZvcm1hdHNcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRXb3JraW5nRGlyID0gdGhpcy5jb25maWcud29ya2luZ0Rpci5yZXBsYWNlKC9cXFxcL2csICcvJyk7XG4gICAgICBjb25zdCBub3JtYWxpemVkRmlsZSA9IGZpbGUucmVwbGFjZSgvXFxcXC9nLCAnLycpO1xuICAgICAgLy8gQ2FsY3VsYXRlIHJlbGF0aXZlIHBhdGggZnJvbSB3b3JraW5nIGRpcmVjdG9yeSB0byB0aGUgZmlsZVxuICAgICAgbGV0IHJlbGF0aXZlUGF0aCA9IHJlbGF0aXZlKG5vcm1hbGl6ZWRXb3JraW5nRGlyLCBub3JtYWxpemVkRmlsZSkucmVwbGFjZShcbiAgICAgICAgL1xcXFwvZyxcbiAgICAgICAgJy8nXG4gICAgICApO1xuICAgICAgLy8gRW5zdXJlIHJlbGF0aXZlIHBhdGhzIHN0YXJ0IHdpdGggLi8gc28gZXNidWlsZCByZXNvbHZlcyB0aGVtIGNvcnJlY3RseS5cbiAgICAgIC8vIFBhdGhzIGxpa2UgXCIub3V0cHV0Ly4uLlwiIGFyZSBub3QgdmFsaWQgcmVsYXRpdmUgc3BlY2lmaWVycyBhbmQgbXVzdFxuICAgICAgLy8gYmVjb21lIFwiLi8ub3V0cHV0Ly4uLlwiLlxuICAgICAgaWYgKCFyZWxhdGl2ZVBhdGguc3RhcnRzV2l0aCgnLi8nKSAmJiAhcmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoJy4uLycpKSB7XG4gICAgICAgIHJlbGF0aXZlUGF0aCA9IGAuLyR7cmVsYXRpdmVQYXRofWA7XG4gICAgICB9XG4gICAgICByZXR1cm4gYGltcG9ydCAnJHtyZWxhdGl2ZVBhdGh9JztgO1xuICAgIH07XG5cbiAgICAvLyBDcmVhdGUgYSB2aXJ0dWFsIGVudHJ5IHRoYXQgaW1wb3J0cyBhbGwgZmlsZXMuIEFsbCBzdGVwIGRlZmluaXRpb25zXG4gICAgLy8gd2lsbCBnZXQgcmVnaXN0ZXJlZCB0aGFua3MgdG8gdGhlIHN3YyB0cmFuc2Zvcm0uXG4gICAgY29uc3Qgc3RlcEltcG9ydHMgPSBzdGVwRmlsZXMubWFwKGNyZWF0ZUltcG9ydCkuam9pbignXFxuJyk7XG5cbiAgICAvLyBJbmNsdWRlIHNlcmRlLW9ubHkgZmlsZXMgZm9yIGNsYXNzIHJlZ2lzdHJhdGlvbiBzaWRlIGVmZmVjdHNcbiAgICBjb25zdCBzZXJkZUltcG9ydHMgPSBzZXJkZU9ubHlGaWxlcy5tYXAoY3JlYXRlSW1wb3J0KS5qb2luKCdcXG4nKTtcblxuICAgIGNvbnN0IGVudHJ5Q29udGVudCA9IGBcbiAgICAvLyBCdWlsdCBpbiBzdGVwc1xuICAgIGltcG9ydCAnJHtidWlsdEluU3RlcHN9JztcbiAgICAvLyBVc2VyIHN0ZXBzXG4gICAgJHtzdGVwSW1wb3J0c31cbiAgICAvLyBTZXJkZSBmaWxlcyBmb3IgY3Jvc3MtY29udGV4dCBjbGFzcyByZWdpc3RyYXRpb25cbiAgICAke3NlcmRlSW1wb3J0c31cbiAgICAvLyBBUEkgZW50cnlwb2ludFxuICAgIGV4cG9ydCB7IHN0ZXBFbnRyeXBvaW50IGFzIEhFQUQsIHN0ZXBFbnRyeXBvaW50IGFzIFBPU1QgfSBmcm9tICd3b3JrZmxvdy9ydW50aW1lJztgO1xuXG4gICAgLy8gQnVuZGxlIHdpdGggZXNidWlsZCBhbmQgb3VyIGN1c3RvbSBTV0MgcGx1Z2luXG4gICAgY29uc3QgZW50cmllc1RvQnVuZGxlID0gZXh0ZXJuYWxpemVOb25TdGVwc1xuICAgICAgPyBbXG4gICAgICAgICAgLi4uc3RlcEZpbGVzLFxuICAgICAgICAgIC4uLnNlcmRlRmlsZXMsXG4gICAgICAgICAgLi4uKHJlc29sdmVkQnVpbHRJblN0ZXBzID8gW3Jlc29sdmVkQnVpbHRJblN0ZXBzXSA6IFtdKSxcbiAgICAgICAgXVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3Qgbm9ybWFsaXplZEVudHJpZXNUb0J1bmRsZSA9IGVudHJpZXNUb0J1bmRsZVxuICAgICAgPyBhd2FpdCB3aXRoUmVhbHBhdGhzKGVudHJpZXNUb0J1bmRsZSlcbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRTaWRlRWZmZWN0RW50cmllcyA9IGF3YWl0IHdpdGhSZWFscGF0aHMoW1xuICAgICAgLi4uc3RlcEZpbGVzLFxuICAgICAgLi4uc2VyZGVPbmx5RmlsZXMsXG4gICAgICAuLi4ocmVzb2x2ZWRCdWlsdEluU3RlcHMgPyBbcmVzb2x2ZWRCdWlsdEluU3RlcHNdIDogW10pLFxuICAgIF0pO1xuICAgIGNvbnN0IGVzYnVpbGRUc2NvbmZpZ09wdGlvbnMgPVxuICAgICAgYXdhaXQgZ2V0RXNidWlsZFRzY29uZmlnT3B0aW9ucyh0c2NvbmZpZ1BhdGgpO1xuICAgIGNvbnN0IHsgYmFubmVyOiBpbXBvcnRNZXRhQmFubmVyLCBkZWZpbmU6IGltcG9ydE1ldGFEZWZpbmUgfSA9XG4gICAgICB0aGlzLmdldENqc0ltcG9ydE1ldGFQb2x5ZmlsbChmb3JtYXQpO1xuXG4gICAgY29uc3QgZXNidWlsZEN0eCA9IGF3YWl0IGVzYnVpbGQuY29udGV4dCh7XG4gICAgICBiYW5uZXI6IHtcbiAgICAgICAganM6IGAvLyBiaW9tZS1pZ25vcmUtYWxsIGxpbnQ6IGdlbmVyYXRlZCBmaWxlXFxuLyogZXNsaW50LWRpc2FibGUgKi9cXG4ke2ltcG9ydE1ldGFCYW5uZXJ9YCxcbiAgICAgIH0sXG4gICAgICBzdGRpbjoge1xuICAgICAgICBjb250ZW50czogZW50cnlDb250ZW50LFxuICAgICAgICByZXNvbHZlRGlyOiB0aGlzLmNvbmZpZy53b3JraW5nRGlyLFxuICAgICAgICBzb3VyY2VmaWxlOiAndmlydHVhbC1lbnRyeS5qcycsXG4gICAgICAgIGxvYWRlcjogJ2pzJyxcbiAgICAgIH0sXG4gICAgICBvdXRmaWxlLFxuICAgICAgYWJzV29ya2luZ0RpcjogdGhpcy5jb25maWcud29ya2luZ0RpcixcbiAgICAgIGJ1bmRsZTogdHJ1ZSxcbiAgICAgIGZvcm1hdCxcbiAgICAgIHBsYXRmb3JtOiAnbm9kZScsXG4gICAgICBjb25kaXRpb25zOiBbJ25vZGUnXSxcbiAgICAgIHRhcmdldDogJ2VzMjAyMicsXG4gICAgICB3cml0ZTogdHJ1ZSxcbiAgICAgIHRyZWVTaGFraW5nOiB0cnVlLFxuICAgICAga2VlcE5hbWVzOiB0cnVlLFxuICAgICAgbWluaWZ5OiBmYWxzZSxcbiAgICAgIGpzeDogJ3ByZXNlcnZlJyxcbiAgICAgIGxvZ0xldmVsOiAnZXJyb3InLFxuICAgICAgLy8gVXNlIHRzY29uZmlnIGZvciBwYXRoIGFsaWFzIHJlc29sdXRpb24uXG4gICAgICAvLyBGb3Igc3ltbGlua2VkIGNvbmZpZ3MgdGhpcyB1c2VzIHRzY29uZmlnUmF3IHRvIHByZXNlcnZlIGN3ZC1yZWxhdGl2ZSBhbGlhc2VzLlxuICAgICAgLi4uZXNidWlsZFRzY29uZmlnT3B0aW9ucyxcbiAgICAgIGRlZmluZTogaW1wb3J0TWV0YURlZmluZSxcbiAgICAgIHJlc29sdmVFeHRlbnNpb25zOiBbXG4gICAgICAgICcudHMnLFxuICAgICAgICAnLnRzeCcsXG4gICAgICAgICcubXRzJyxcbiAgICAgICAgJy5jdHMnLFxuICAgICAgICAnLmpzJyxcbiAgICAgICAgJy5qc3gnLFxuICAgICAgICAnLm1qcycsXG4gICAgICAgICcuY2pzJyxcbiAgICAgIF0sXG4gICAgICAvLyBJbmxpbmUgc291cmNlIG1hcHMgZm9yIGJldHRlciBzdGFjayB0cmFjZXMgaW4gc3RlcCBleGVjdXRpb24uXG4gICAgICAvLyBTdGVwcyBleGVjdXRlIGluIE5vZGUuanMgY29udGV4dCBhbmQgaW5saW5lIHNvdXJjZW1hcHMgZW5zdXJlIHdlIGdldFxuICAgICAgLy8gbWVhbmluZ2Z1bCBzdGFjayB0cmFjZXMgd2l0aCBwcm9wZXIgZmlsZSBuYW1lcyBhbmQgbGluZSBudW1iZXJzIHdoZW4gZXJyb3JzXG4gICAgICAvLyBvY2N1ciBpbiBkZWVwbHkgbmVzdGVkIGZ1bmN0aW9uIGNhbGxzIGFjcm9zcyBtdWx0aXBsZSBmaWxlcy5cbiAgICAgIHNvdXJjZW1hcDogJ2lubGluZScsXG4gICAgICBwbHVnaW5zOiBbXG4gICAgICAgIC8vIEhhbmRsZSBwc2V1ZG8tcGFja2FnZXMgbGlrZSAnc2VydmVyLW9ubHknIGFuZCAnY2xpZW50LW9ubHknIGJ5IHByb3ZpZGluZ1xuICAgICAgICAvLyBlbXB0eSBtb2R1bGVzLiBNdXN0IHJ1biBmaXJzdCB0byBpbnRlcmNlcHQgdGhlc2UgYmVmb3JlIG90aGVyIHJlc29sdXRpb24uXG4gICAgICAgIGNyZWF0ZVBzZXVkb1BhY2thZ2VQbHVnaW4oKSxcbiAgICAgICAgY3JlYXRlU3djUGx1Z2luKHtcbiAgICAgICAgICBtb2RlOiAnc3RlcCcsXG4gICAgICAgICAgZW50cmllc1RvQnVuZGxlOiBub3JtYWxpemVkRW50cmllc1RvQnVuZGxlLFxuICAgICAgICAgIG91dGRpcjogb3V0ZmlsZSA/IGRpcm5hbWUob3V0ZmlsZSkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgcHJvamVjdFJvb3Q6IHRoaXMudHJhbnNmb3JtUHJvamVjdFJvb3QsXG4gICAgICAgICAgd29ya2Zsb3dNYW5pZmVzdCxcbiAgICAgICAgICBidW5kbGVUcmFuc2l0aXZlTG9jYWxTdGVwRGVwZW5kZW5jaWVzLFxuICAgICAgICAgIHJld3JpdGVUc0V4dGVuc2lvbnMsXG4gICAgICAgICAgc2lkZUVmZmVjdEVudHJpZXM6IG5vcm1hbGl6ZWRTaWRlRWZmZWN0RW50cmllcyxcbiAgICAgICAgfSksXG4gICAgICBdLFxuICAgICAgLy8gUGx1Z2luIHNob3VsZCBjYXRjaCBtb3N0IHRoaW5ncywgYnV0IHRoaXMgbGV0cyB1c2VycyBoYXJkIG92ZXJyaWRlXG4gICAgICAvLyBpZiB0aGUgcGx1Z2luIG1pc3NlcyBhbnl0aGluZyB0aGF0IHNob3VsZCBiZSBleHRlcm5hbGl6ZWRcbiAgICAgIGV4dGVybmFsOiBbJ2J1bicsICdidW46KicsIC4uLih0aGlzLmNvbmZpZy5leHRlcm5hbFBhY2thZ2VzIHx8IFtdKV0sXG4gICAgfSk7XG5cbiAgICBjb25zdCBzdGVwc1Jlc3VsdCA9IGF3YWl0IGVzYnVpbGRDdHgucmVidWlsZCgpO1xuXG4gICAgdGhpcy5sb2dFc2J1aWxkTWVzc2FnZXMoc3RlcHNSZXN1bHQsICdzdGVwcyBidW5kbGUgY3JlYXRpb24nKTtcbiAgICB0aGlzLmxvZ0Jhc2VCdWlsZGVySW5mbyhcbiAgICAgICdDcmVhdGVkIHN0ZXBzIGJ1bmRsZScsXG4gICAgICBgJHtEYXRlLm5vdygpIC0gc3RlcHNCdW5kbGVTdGFydH1tc2BcbiAgICApO1xuXG4gICAgLy8gSGFuZGxlIHdvcmtmbG93LW9ubHkgZmlsZXMgdGhhdCBtYXkgaGF2ZSBiZWVuIHRyZWUtc2hha2VuIGZyb20gdGhlIGJ1bmRsZS5cbiAgICAvLyBUaGVzZSBmaWxlcyBoYXZlIG5vIHN0ZXBzLCBzbyBlc2J1aWxkIHJlbW92ZXMgdGhlbSwgYnV0IHdlIHN0aWxsIG5lZWQgdGhlaXJcbiAgICAvLyB3b3JrZmxvdyBtZXRhZGF0YSBmb3IgdGhlIG1hbmlmZXN0LiBUcmFuc2Zvcm0gdGhlbSBzZXBhcmF0ZWx5LlxuICAgIGNvbnN0IHdvcmtmbG93T25seUZpbGVzID0gd29ya2Zsb3dGaWxlcy5maWx0ZXIoXG4gICAgICAoZikgPT4gIXN0ZXBGaWxlcy5pbmNsdWRlcyhmKVxuICAgICk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICB3b3JrZmxvd09ubHlGaWxlcy5tYXAoYXN5bmMgKHdvcmtmbG93RmlsZSkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHNvdXJjZSA9IGF3YWl0IHJlYWRGaWxlKHdvcmtmbG93RmlsZSwgJ3V0ZjgnKTtcbiAgICAgICAgICBjb25zdCByZWxhdGl2ZUZpbGVwYXRoID0gdGhpcy5nZXRSZWxhdGl2ZUZpbGVwYXRoKHdvcmtmbG93RmlsZSk7XG4gICAgICAgICAgY29uc3QgeyB3b3JrZmxvd01hbmlmZXN0OiBmaWxlTWFuaWZlc3QgfSA9IGF3YWl0IGFwcGx5U3djVHJhbnNmb3JtKFxuICAgICAgICAgICAgcmVsYXRpdmVGaWxlcGF0aCxcbiAgICAgICAgICAgIHNvdXJjZSxcbiAgICAgICAgICAgICd3b3JrZmxvdycsXG4gICAgICAgICAgICB3b3JrZmxvd0ZpbGUsXG4gICAgICAgICAgICB0aGlzLnRyYW5zZm9ybVByb2plY3RSb290XG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoZmlsZU1hbmlmZXN0LndvcmtmbG93cykge1xuICAgICAgICAgICAgd29ya2Zsb3dNYW5pZmVzdC53b3JrZmxvd3MgPSBPYmplY3QuYXNzaWduKFxuICAgICAgICAgICAgICB3b3JrZmxvd01hbmlmZXN0LndvcmtmbG93cyB8fCB7fSxcbiAgICAgICAgICAgICAgZmlsZU1hbmlmZXN0LndvcmtmbG93c1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGZpbGVNYW5pZmVzdC5jbGFzc2VzKSB7XG4gICAgICAgICAgICB3b3JrZmxvd01hbmlmZXN0LmNsYXNzZXMgPSBPYmplY3QuYXNzaWduKFxuICAgICAgICAgICAgICB3b3JrZmxvd01hbmlmZXN0LmNsYXNzZXMgfHwge30sXG4gICAgICAgICAgICAgIGZpbGVNYW5pZmVzdC5jbGFzc2VzXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAvLyBMb2cgd2FybmluZyBidXQgY29udGludWUgLSBkb24ndCBmYWlsIGJ1aWxkIGZvciB3b3JrZmxvdy1vbmx5IGZpbGUgaXNzdWVzXG4gICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgYFdhcm5pbmc6IEZhaWxlZCB0byBleHRyYWN0IHdvcmtmbG93IG1ldGFkYXRhIGZyb20gJHt3b3JrZmxvd0ZpbGV9OmAsXG4gICAgICAgICAgICBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcilcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG5cbiAgICAvLyBDcmVhdGUgLmdpdGlnbm9yZSBpbiAuc3djIGRpcmVjdG9yeVxuICAgIGF3YWl0IHRoaXMuY3JlYXRlU3djR2l0aWdub3JlKCk7XG5cbiAgICBpZiAodGhpcy5jb25maWcud2F0Y2gpIHtcbiAgICAgIHJldHVybiB7IGNvbnRleHQ6IGVzYnVpbGRDdHgsIG1hbmlmZXN0OiB3b3JrZmxvd01hbmlmZXN0IH07XG4gICAgfVxuICAgIGF3YWl0IGVzYnVpbGRDdHguZGlzcG9zZSgpO1xuICAgIHJldHVybiB7IGNvbnRleHQ6IHVuZGVmaW5lZCwgbWFuaWZlc3Q6IHdvcmtmbG93TWFuaWZlc3QgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgYnVuZGxlIGZvciB3b3JrZmxvdyBvcmNoZXN0cmF0aW9uIGZ1bmN0aW9ucy5cbiAgICogV29ya2Zsb3dzIHJ1biBpbiBhIHNhbmRib3hlZCBWTSBhbmQgY29vcmRpbmF0ZSBzdGVwIGV4ZWN1dGlvbi5cbiAgICpcbiAgICogQHBhcmFtIGJ1bmRsZUZpbmFsT3V0cHV0IC0gSWYgZmFsc2UsIHNraXBzIHRoZSBmaW5hbCBidW5kbGluZyBzdGVwICh1c2VkIGJ5IE5leHQuanMpXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgY3JlYXRlV29ya2Zsb3dzQnVuZGxlKHtcbiAgICBpbnB1dEZpbGVzLFxuICAgIGZvcm1hdCA9ICdjanMnLFxuICAgIG91dGZpbGUsXG4gICAgYnVuZGxlRmluYWxPdXRwdXQgPSB0cnVlLFxuICAgIGtlZXBJbnRlcmltQnVuZGxlQ29udGV4dCA9IHRoaXMuY29uZmlnLndhdGNoLFxuICAgIHRzY29uZmlnUGF0aCxcbiAgICBkaXNjb3ZlcmVkRW50cmllcyxcbiAgfToge1xuICAgIHRzY29uZmlnUGF0aD86IHN0cmluZztcbiAgICBpbnB1dEZpbGVzOiBzdHJpbmdbXTtcbiAgICBvdXRmaWxlOiBzdHJpbmc7XG4gICAgZm9ybWF0PzogJ2NqcycgfCAnZXNtJztcbiAgICBidW5kbGVGaW5hbE91dHB1dD86IGJvb2xlYW47XG4gICAga2VlcEludGVyaW1CdW5kbGVDb250ZXh0PzogYm9vbGVhbjtcbiAgICBkaXNjb3ZlcmVkRW50cmllcz86IERpc2NvdmVyZWRFbnRyaWVzO1xuICB9KTogUHJvbWlzZTx7XG4gICAgbWFuaWZlc3Q6IFdvcmtmbG93TWFuaWZlc3Q7XG4gICAgaW50ZXJpbUJ1bmRsZUN0eD86IGVzYnVpbGQuQnVpbGRDb250ZXh0O1xuICAgIGJ1bmRsZUZpbmFsPzogKGludGVyaW1CdW5kbGVSZXN1bHQ6IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPjtcbiAgfT4ge1xuICAgIGNvbnN0IGRpc2NvdmVyZWQgPVxuICAgICAgZGlzY292ZXJlZEVudHJpZXMgPz9cbiAgICAgIChhd2FpdCB0aGlzLmRpc2NvdmVyRW50cmllcyhpbnB1dEZpbGVzLCBkaXJuYW1lKG91dGZpbGUpLCB0c2NvbmZpZ1BhdGgpKTtcbiAgICBjb25zdCB3b3JrZmxvd0ZpbGVzID0gWy4uLmRpc2NvdmVyZWQuZGlzY292ZXJlZFdvcmtmbG93c10uc29ydCgpO1xuICAgIGNvbnN0IHNlcmRlRmlsZXMgPSBbLi4uZGlzY292ZXJlZC5kaXNjb3ZlcmVkU2VyZGVGaWxlc10uc29ydCgpO1xuXG4gICAgLy8gSW5jbHVkZSBzZXJkZSBmaWxlcyB0aGF0IGFyZW4ndCBhbHJlYWR5IHdvcmtmbG93IGZpbGVzIGZvciBjcm9zcy1jb250ZXh0IGNsYXNzIHJlZ2lzdHJhdGlvbi5cbiAgICAvLyBDbGFzc2VzIG5lZWQgdG8gYmUgcmVnaXN0ZXJlZCBpbiB0aGUgd29ya2Zsb3cgYnVuZGxlIHNvIHRoZXkgY2FuIGJlIGRlc2VyaWFsaXplZFxuICAgIC8vIHdoZW4gcmVjZWl2aW5nIGRhdGEgZnJvbSBzdGVwcyBvciB3aGVuIHNlcmlhbGl6aW5nIGRhdGEgdG8gc2VuZCB0byBzdGVwcy5cbiAgICBjb25zdCB3b3JrZmxvd0ZpbGVzU2V0ID0gbmV3IFNldCh3b3JrZmxvd0ZpbGVzKTtcbiAgICBjb25zdCBzZXJkZU9ubHlGaWxlcyA9IHNlcmRlRmlsZXMuZmlsdGVyKChmKSA9PiAhd29ya2Zsb3dGaWxlc1NldC5oYXMoZikpO1xuXG4gICAgLy8gbG9nIHRoZSB3b3JrZmxvdyBmaWxlcyBmb3IgZGVidWdnaW5nXG4gICAgYXdhaXQgdGhpcy53cml0ZURlYnVnRmlsZShvdXRmaWxlLCB7IHdvcmtmbG93RmlsZXMsIHNlcmRlT25seUZpbGVzIH0pO1xuXG4gICAgLy8gSGVscGVyIHRvIGNyZWF0ZSBpbXBvcnQgc3RhdGVtZW50IGZyb20gZmlsZSBwYXRoXG4gICAgLy8gRm9yIHBhY2thZ2VzLCB1c2VzIHRoZSBwYWNrYWdlIG5hbWUgc28gZXNidWlsZCB3aWxsIHJlc29sdmUgdGhyb3VnaFxuICAgIC8vIHBhY2thZ2UuanNvbiBleHBvcnRzIHdpdGggY29uZGl0aW9uczogWyd3b3JrZmxvdyddXG4gICAgY29uc3QgY3JlYXRlSW1wb3J0ID0gKGZpbGU6IHN0cmluZykgPT4ge1xuICAgICAgY29uc3QgeyBpbXBvcnRQYXRoLCBpc1BhY2thZ2UgfSA9IGdldEltcG9ydFBhdGgoXG4gICAgICAgIGZpbGUsXG4gICAgICAgIHRoaXMuY29uZmlnLndvcmtpbmdEaXJcbiAgICAgICk7XG5cbiAgICAgIGlmIChpc1BhY2thZ2UpIHtcbiAgICAgICAgLy8gVXNlIHBhY2thZ2UgbmFtZSAtIGVzYnVpbGQgd2lsbCByZXNvbHZlIHZpYSBwYWNrYWdlLmpzb24gZXhwb3J0c1xuICAgICAgICAvLyBhbmQgYXBwbHkgdGhlICd3b3JrZmxvdycgY29uZGl0aW9uXG4gICAgICAgIHJldHVybiBgaW1wb3J0ICcke2ltcG9ydFBhdGh9JztgO1xuICAgICAgfVxuXG4gICAgICAvLyBMb2NhbCBhcHAgZmlsZSAtIHVzZSByZWxhdGl2ZSBwYXRoXG4gICAgICAvLyBOb3JtYWxpemUgYm90aCBwYXRocyB0byBmb3J3YXJkIHNsYXNoZXMgYmVmb3JlIGNhbGxpbmcgcmVsYXRpdmUoKVxuICAgICAgLy8gVGhpcyBpcyBjcml0aWNhbCBvbiBXaW5kb3dzIHdoZXJlIHJlbGF0aXZlKCkgY2FuIHByb2R1Y2UgdW5leHBlY3RlZCByZXN1bHRzIHdpdGggbWl4ZWQgcGF0aCBmb3JtYXRzXG4gICAgICBjb25zdCBub3JtYWxpemVkV29ya2luZ0RpciA9IHRoaXMuY29uZmlnLndvcmtpbmdEaXIucmVwbGFjZSgvXFxcXC9nLCAnLycpO1xuICAgICAgY29uc3Qgbm9ybWFsaXplZEZpbGUgPSBmaWxlLnJlcGxhY2UoL1xcXFwvZywgJy8nKTtcbiAgICAgIC8vIENhbGN1bGF0ZSByZWxhdGl2ZSBwYXRoIGZyb20gd29ya2luZyBkaXJlY3RvcnkgdG8gdGhlIGZpbGVcbiAgICAgIGxldCByZWxhdGl2ZVBhdGggPSByZWxhdGl2ZShub3JtYWxpemVkV29ya2luZ0Rpciwgbm9ybWFsaXplZEZpbGUpLnJlcGxhY2UoXG4gICAgICAgIC9cXFxcL2csXG4gICAgICAgICcvJ1xuICAgICAgKTtcbiAgICAgIC8vIEVuc3VyZSByZWxhdGl2ZSBwYXRocyBzdGFydCB3aXRoIC4vIHNvIGVzYnVpbGQgcmVzb2x2ZXMgdGhlbSBjb3JyZWN0bHkuXG4gICAgICAvLyBQYXRocyBsaWtlIFwiLm91dHB1dC8uLi5cIiBhcmUgbm90IHZhbGlkIHJlbGF0aXZlIHNwZWNpZmllcnMgYW5kIG11c3RcbiAgICAgIC8vIGJlY29tZSBcIi4vLm91dHB1dC8uLi5cIi5cbiAgICAgIGlmICghcmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoJy4vJykgJiYgIXJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKCcuLi8nKSkge1xuICAgICAgICByZWxhdGl2ZVBhdGggPSBgLi8ke3JlbGF0aXZlUGF0aH1gO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGBpbXBvcnQgJyR7cmVsYXRpdmVQYXRofSc7YDtcbiAgICB9O1xuXG4gICAgLy8gQ3JlYXRlIGEgdmlydHVhbCBlbnRyeSB0aGF0IGltcG9ydHMgYWxsIHdvcmtmbG93IGZpbGVzXG4gICAgLy8gVGhlIFNXQyBwbHVnaW4gaW4gd29ya2Zsb3cgbW9kZSBlbWl0cyBgZ2xvYmFsVGhpcy5fX3ByaXZhdGVfd29ya2Zsb3dzLnNldCh3b3JrZmxvd0lkLCBmbilgXG4gICAgLy8gY2FsbHMgZGlyZWN0bHksIHNvIHdlIGp1c3QgbmVlZCB0byBpbXBvcnQgdGhlIGZpbGVzIChNYXAgaXMgaW5pdGlhbGl6ZWQgdmlhIGJhbm5lcilcbiAgICBjb25zdCB3b3JrZmxvd0ltcG9ydHMgPSB3b3JrZmxvd0ZpbGVzLm1hcChjcmVhdGVJbXBvcnQpLmpvaW4oJ1xcbicpO1xuXG4gICAgLy8gSW5jbHVkZSBzZXJkZS1vbmx5IGZpbGVzIGZvciBjbGFzcyByZWdpc3RyYXRpb24gc2lkZSBlZmZlY3RzXG4gICAgY29uc3Qgc2VyZGVJbXBvcnRzID0gc2VyZGVPbmx5RmlsZXMubWFwKGNyZWF0ZUltcG9ydCkuam9pbignXFxuJyk7XG5cbiAgICBjb25zdCBpbXBvcnRzID0gc2VyZGVJbXBvcnRzXG4gICAgICA/IGAke3dvcmtmbG93SW1wb3J0c31cXG4vLyBTZXJkZSBmaWxlcyBmb3IgY3Jvc3MtY29udGV4dCBjbGFzcyByZWdpc3RyYXRpb25cXG4ke3NlcmRlSW1wb3J0c31gXG4gICAgICA6IHdvcmtmbG93SW1wb3J0cztcblxuICAgIGNvbnN0IGJ1bmRsZVN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgY29uc3Qgd29ya2Zsb3dNYW5pZmVzdDogV29ya2Zsb3dNYW5pZmVzdCA9IHt9O1xuICAgIGNvbnN0IGVzYnVpbGRUc2NvbmZpZ09wdGlvbnMgPVxuICAgICAgYXdhaXQgZ2V0RXNidWlsZFRzY29uZmlnT3B0aW9ucyh0c2NvbmZpZ1BhdGgpO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRXb3JrZmxvd1NpZGVFZmZlY3RFbnRyaWVzID0gYXdhaXQgd2l0aFJlYWxwYXRocyhbXG4gICAgICAuLi53b3JrZmxvd0ZpbGVzLFxuICAgICAgLi4uc2VyZGVPbmx5RmlsZXMsXG4gICAgXSk7XG5cbiAgICAvLyBCdW5kbGUgd2l0aCBlc2J1aWxkIGFuZCBvdXIgY3VzdG9tIFNXQyBwbHVnaW4gaW4gd29ya2Zsb3cgbW9kZS5cbiAgICAvLyB0aGlzIGJ1bmRsZSB3aWxsIGJlIHJ1biBpbnNpZGUgYSB2bSBpc29sYXRlXG4gICAgY29uc3QgaW50ZXJpbUJ1bmRsZUN0eCA9IGF3YWl0IGVzYnVpbGQuY29udGV4dCh7XG4gICAgICBzdGRpbjoge1xuICAgICAgICBjb250ZW50czogaW1wb3J0cyxcbiAgICAgICAgcmVzb2x2ZURpcjogdGhpcy5jb25maWcud29ya2luZ0RpcixcbiAgICAgICAgc291cmNlZmlsZTogJ3ZpcnR1YWwtZW50cnkuanMnLFxuICAgICAgICBsb2FkZXI6ICdqcycsXG4gICAgICB9LFxuICAgICAgYnVuZGxlOiB0cnVlLFxuICAgICAgYWJzV29ya2luZ0RpcjogdGhpcy5jb25maWcud29ya2luZ0RpcixcbiAgICAgIGZvcm1hdDogJ2NqcycsIC8vIFJ1bnMgaW5zaWRlIHRoZSBWTSB3aGljaCBleHBlY3RzIGNqc1xuICAgICAgcGxhdGZvcm06ICduZXV0cmFsJywgLy8gVGhlIHBsYXRmb3JtIGlzIG5laXRoZXIgbm9kZSBub3IgYnJvd3NlclxuICAgICAgbWFpbkZpZWxkczogWydtb2R1bGUnLCAnbWFpbiddLCAvLyBUbyBzdXBwb3J0IG5wbSBzdHlsZSBpbXBvcnRzXG4gICAgICBjb25kaXRpb25zOiBbJ3dvcmtmbG93J10sIC8vIEFsbG93IHBhY2thZ2VzIHRvIGV4cG9ydCAnd29ya2Zsb3cnIGNvbXBsaWFudCB2ZXJzaW9uc1xuICAgICAgdGFyZ2V0OiAnZXMyMDIyJyxcbiAgICAgIHdyaXRlOiBmYWxzZSxcbiAgICAgIHRyZWVTaGFraW5nOiB0cnVlLFxuICAgICAga2VlcE5hbWVzOiB0cnVlLFxuICAgICAgbWluaWZ5OiBmYWxzZSxcbiAgICAgIC8vIEluaXRpYWxpemUgdGhlIHdvcmtmbG93IHJlZ2lzdHJ5IGF0IHRoZSB2ZXJ5IHRvcCBvZiB0aGUgYnVuZGxlXG4gICAgICAvLyBUaGlzIG11c3QgYmUgaW4gYmFubmVyIChub3QgdGhlIHZpcnR1YWwgZW50cnkpIGJlY2F1c2UgZXNidWlsZCdzIGJ1bmRsaW5nXG4gICAgICAvLyBjYW4gcmVvcmRlciBjb2RlLCBhbmQgdGhlIC5zZXQoKSBjYWxscyBuZWVkIHRoZSBNYXAgdG8gZXhpc3QgZmlyc3RcbiAgICAgIGJhbm5lcjoge1xuICAgICAgICBqczogJ2dsb2JhbFRoaXMuX19wcml2YXRlX3dvcmtmbG93cyA9IG5ldyBNYXAoKTsnLFxuICAgICAgfSxcbiAgICAgIC8vIElubGluZSBzb3VyY2UgbWFwcyBmb3IgYmV0dGVyIHN0YWNrIHRyYWNlcyBpbiB3b3JrZmxvdyBWTSBleGVjdXRpb24uXG4gICAgICAvLyBUaGlzIGludGVybWVkaWF0ZSBidW5kbGUgaXMgZXhlY3V0ZWQgdmlhIHJ1bkluQ29udGV4dCgpIGluIGEgVk0sIHNvIHdlIG5lZWRcbiAgICAgIC8vIGlubGluZSBzb3VyY2UgbWFwcyB0byBnZXQgbWVhbmluZ2Z1bCBzdGFjayB0cmFjZXMgaW5zdGVhZCBvZiBcImV2YWxtYWNoaW5lLjxhbm9ueW1vdXM+XCIuXG4gICAgICBzb3VyY2VtYXA6ICdpbmxpbmUnLFxuICAgICAgLy8gVXNlIHRzY29uZmlnIGZvciBwYXRoIGFsaWFzIHJlc29sdXRpb24uXG4gICAgICAvLyBGb3Igc3ltbGlua2VkIGNvbmZpZ3MgdGhpcyB1c2VzIHRzY29uZmlnUmF3IHRvIHByZXNlcnZlIGN3ZC1yZWxhdGl2ZSBhbGlhc2VzLlxuICAgICAgLi4uZXNidWlsZFRzY29uZmlnT3B0aW9ucyxcbiAgICAgIHJlc29sdmVFeHRlbnNpb25zOiBbXG4gICAgICAgICcudHMnLFxuICAgICAgICAnLnRzeCcsXG4gICAgICAgICcubXRzJyxcbiAgICAgICAgJy5jdHMnLFxuICAgICAgICAnLmpzJyxcbiAgICAgICAgJy5qc3gnLFxuICAgICAgICAnLm1qcycsXG4gICAgICAgICcuY2pzJyxcbiAgICAgIF0sXG4gICAgICBwbHVnaW5zOiBbXG4gICAgICAgIC8vIEhhbmRsZSBwc2V1ZG8tcGFja2FnZXMgbGlrZSAnc2VydmVyLW9ubHknIGFuZCAnY2xpZW50LW9ubHknIGJ5IHByb3ZpZGluZ1xuICAgICAgICAvLyBlbXB0eSBtb2R1bGVzLiBNdXN0IHJ1biBmaXJzdCB0byBpbnRlcmNlcHQgdGhlc2UgYmVmb3JlIG90aGVyIHJlc29sdXRpb24uXG4gICAgICAgIGNyZWF0ZVBzZXVkb1BhY2thZ2VQbHVnaW4oKSxcbiAgICAgICAgY3JlYXRlU3djUGx1Z2luKHtcbiAgICAgICAgICBtb2RlOiAnd29ya2Zsb3cnLFxuICAgICAgICAgIHByb2plY3RSb290OiB0aGlzLnRyYW5zZm9ybVByb2plY3RSb290LFxuICAgICAgICAgIHdvcmtmbG93TWFuaWZlc3QsXG4gICAgICAgICAgc2lkZUVmZmVjdEVudHJpZXM6IG5vcm1hbGl6ZWRXb3JrZmxvd1NpZGVFZmZlY3RFbnRyaWVzLFxuICAgICAgICB9KSxcbiAgICAgICAgLy8gVGhpcyBwbHVnaW4gbXVzdCBydW4gYWZ0ZXIgdGhlIHN3YyBwbHVnaW4gdG8gZW5zdXJlIGRlYWQgY29kZSBlbGltaW5hdGlvblxuICAgICAgICAvLyBoYXBwZW5zIGZpcnN0LCBwcmV2ZW50aW5nIGZhbHNlIHBvc2l0aXZlcyBvbiBOb2RlLmpzIGltcG9ydHMgaW4gdW51c2VkIGNvZGUgcGF0aHNcbiAgICAgICAgY3JlYXRlTm9kZU1vZHVsZUVycm9yUGx1Z2luKCksXG4gICAgICBdLFxuICAgICAgLy8gTk9URTogV2UgaW50ZW50aW9uYWxseSBkbyBOT1QgdXNlIHRoZSBleHRlcm5hbCBvcHRpb24gaGVyZSBmb3Igd29ya2Zsb3cgYnVuZGxlcy5cbiAgICAgIC8vIFdoZW4gcGFja2FnZXMgYXJlIG1hcmtlZCBleHRlcm5hbCB3aXRoIGZvcm1hdDogJ2NqcycsIGVzYnVpbGQgZ2VuZXJhdGVzIHJlcXVpcmUoKSBjYWxscy5cbiAgICAgIC8vIEhvd2V2ZXIsIHRoZSB3b3JrZmxvdyBWTSAodm0ucnVuSW5Db250ZXh0KSBkb2VzIG5vdCBoYXZlIHJlcXVpcmUoKSBkZWZpbmVkIC0gaXQgb25seVxuICAgICAgLy8gcHJvdmlkZXMgbW9kdWxlLmV4cG9ydHMgYW5kIGV4cG9ydHMuIEV4dGVybmFsIHBhY2thZ2VzIHdvdWxkIGZhaWwgYXQgcnVudGltZSB3aXRoOlxuICAgICAgLy8gICBSZWZlcmVuY2VFcnJvcjogcmVxdWlyZSBpcyBub3QgZGVmaW5lZFxuICAgICAgLy8gSW5zdGVhZCwgd2UgYnVuZGxlIGV2ZXJ5dGhpbmcgYW5kIHJlbHkgb246XG4gICAgICAvLyAtIGNyZWF0ZVBzZXVkb1BhY2thZ2VQbHVnaW4oKSB0byBoYW5kbGUgc2VydmVyLW9ubHkvY2xpZW50LW9ubHkgd2l0aCBlbXB0eSBtb2R1bGVzXG4gICAgICAvLyAtIGNyZWF0ZU5vZGVNb2R1bGVFcnJvclBsdWdpbigpIHRvIGNhdGNoIE5vZGUuanMgYnVpbHRpbiBpbXBvcnRzIGF0IGJ1aWxkIHRpbWVcbiAgICB9KTtcbiAgICBsZXQgc2hvdWxkRGlzcG9zZUludGVyaW1CdW5kbGVDdHggPSAha2VlcEludGVyaW1CdW5kbGVDb250ZXh0O1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBpbnRlcmltQnVuZGxlID0gYXdhaXQgaW50ZXJpbUJ1bmRsZUN0eC5yZWJ1aWxkKCk7XG5cbiAgICAgIHRoaXMubG9nRXNidWlsZE1lc3NhZ2VzKFxuICAgICAgICBpbnRlcmltQnVuZGxlLFxuICAgICAgICAnaW50ZXJtZWRpYXRlIHdvcmtmbG93IGJ1bmRsZScsXG4gICAgICAgIHRydWUsXG4gICAgICAgIHtcbiAgICAgICAgICBzdXBwcmVzc1dhcm5pbmdzOiB0aGlzLmNvbmZpZy5zdXBwcmVzc0NyZWF0ZVdvcmtmbG93c0J1bmRsZVdhcm5pbmdzLFxuICAgICAgICB9XG4gICAgICApO1xuICAgICAgdGhpcy5sb2dDcmVhdGVXb3JrZmxvd3NCdW5kbGVJbmZvKFxuICAgICAgICAnQ3JlYXRlZCBpbnRlcm1lZGlhdGUgd29ya2Zsb3cgYnVuZGxlJyxcbiAgICAgICAgYCR7RGF0ZS5ub3coKSAtIGJ1bmRsZVN0YXJ0VGltZX1tc2BcbiAgICAgICk7XG5cbiAgICAgIGlmICh0aGlzLmNvbmZpZy53b3JrZmxvd01hbmlmZXN0UGF0aCkge1xuICAgICAgICBjb25zdCByZXNvbHZlZFBhdGggPSByZXNvbHZlKFxuICAgICAgICAgIHByb2Nlc3MuY3dkKCksXG4gICAgICAgICAgdGhpcy5jb25maWcud29ya2Zsb3dNYW5pZmVzdFBhdGhcbiAgICAgICAgKTtcbiAgICAgICAgbGV0IHByZWZpeCA9ICcnO1xuXG4gICAgICAgIGlmIChyZXNvbHZlZFBhdGguZW5kc1dpdGgoJy5janMnKSkge1xuICAgICAgICAgIHByZWZpeCA9ICdtb2R1bGUuZXhwb3J0cyA9ICc7XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgcmVzb2x2ZWRQYXRoLmVuZHNXaXRoKCcuanMnKSB8fFxuICAgICAgICAgIHJlc29sdmVkUGF0aC5lbmRzV2l0aCgnLm1qcycpXG4gICAgICAgICkge1xuICAgICAgICAgIHByZWZpeCA9ICdleHBvcnQgZGVmYXVsdCAnO1xuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgbWtkaXIoZGlybmFtZShyZXNvbHZlZFBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgYXdhaXQgd3JpdGVGaWxlKFxuICAgICAgICAgIHJlc29sdmVkUGF0aCxcbiAgICAgICAgICBwcmVmaXggKyBKU09OLnN0cmluZ2lmeSh3b3JrZmxvd01hbmlmZXN0LCBudWxsLCAyKVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBDcmVhdGUgLmdpdGlnbm9yZSBpbiAuc3djIGRpcmVjdG9yeVxuICAgICAgYXdhaXQgdGhpcy5jcmVhdGVTd2NHaXRpZ25vcmUoKTtcblxuICAgICAgaWYgKFxuICAgICAgICAhaW50ZXJpbUJ1bmRsZS5vdXRwdXRGaWxlcyB8fFxuICAgICAgICBpbnRlcmltQnVuZGxlLm91dHB1dEZpbGVzLmxlbmd0aCA9PT0gMFxuICAgICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gb3V0cHV0IGZpbGVzIGdlbmVyYXRlZCBmcm9tIGVzYnVpbGQnKTtcbiAgICAgIH1cblxuICAgICAgLy8gU2VyZGUgY29tcGxpYW5jZSB3YXJuaW5nczogY2hlY2sgaWYgd29ya2Zsb3cgYnVuZGxlIGhhcyBOb2RlLmpzIGltcG9ydHNcbiAgICAgIC8vIGFsb25nc2lkZSBzZXJkZS1yZWdpc3RlcmVkIGNsYXNzZXMgKHRoZXNlIHdpbGwgZmFpbCBhdCBydW50aW1lIGluIHRoZSBzYW5kYm94KVxuICAgICAgaWYgKFxuICAgICAgICB3b3JrZmxvd01hbmlmZXN0LmNsYXNzZXMgJiZcbiAgICAgICAgT2JqZWN0LmtleXMod29ya2Zsb3dNYW5pZmVzdC5jbGFzc2VzKS5sZW5ndGggPiAwXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgeyBhbmFseXplU2VyZGVDb21wbGlhbmNlIH0gPSBhd2FpdCBpbXBvcnQoJy4vc2VyZGUtY2hlY2tlci5qcycpO1xuICAgICAgICBjb25zdCBidW5kbGVUZXh0ID0gaW50ZXJpbUJ1bmRsZS5vdXRwdXRGaWxlc1swXS50ZXh0O1xuICAgICAgICBjb25zdCBzZXJkZVJlc3VsdCA9IGFuYWx5emVTZXJkZUNvbXBsaWFuY2Uoe1xuICAgICAgICAgIHNvdXJjZUNvZGU6ICcnLFxuICAgICAgICAgIHdvcmtmbG93Q29kZTogYnVuZGxlVGV4dCxcbiAgICAgICAgICBtYW5pZmVzdDogd29ya2Zsb3dNYW5pZmVzdCxcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIERlLWR1cGUgd2FybmluZ3M6IGdyb3VwIGlkZW50aWNhbCBpc3N1ZXMgYWNyb3NzIGNsYXNzZXNcbiAgICAgICAgY29uc3QgaXNzdWVzVG9DbGFzc2VzID0gbmV3IE1hcDxzdHJpbmcsIFNldDxzdHJpbmc+PigpO1xuICAgICAgICBmb3IgKGNvbnN0IGNscyBvZiBzZXJkZVJlc3VsdC5jbGFzc2VzKSB7XG4gICAgICAgICAgaWYgKCFjbHMuY29tcGxpYW50KSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGlzc3VlIG9mIGNscy5pc3N1ZXMpIHtcbiAgICAgICAgICAgICAgbGV0IGFmZmVjdGVkQ2xhc3NlcyA9IGlzc3Vlc1RvQ2xhc3Nlcy5nZXQoaXNzdWUpO1xuICAgICAgICAgICAgICBpZiAoIWFmZmVjdGVkQ2xhc3Nlcykge1xuICAgICAgICAgICAgICAgIGFmZmVjdGVkQ2xhc3NlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgICAgICAgICAgIGlzc3Vlc1RvQ2xhc3Nlcy5zZXQoaXNzdWUsIGFmZmVjdGVkQ2xhc3Nlcyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgYWZmZWN0ZWRDbGFzc2VzLmFkZChjbHMuY2xhc3NOYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBbaXNzdWUsIGFmZmVjdGVkQ2xhc3Nlc10gb2YgaXNzdWVzVG9DbGFzc2VzKSB7XG4gICAgICAgICAgY29uc3QgY2xhc3NOYW1lcyA9IFsuLi5hZmZlY3RlZENsYXNzZXNdO1xuICAgICAgICAgIGNvbnN0IGNsYXNzTGFiZWwgPVxuICAgICAgICAgICAgY2xhc3NOYW1lcy5sZW5ndGggPT09IDFcbiAgICAgICAgICAgICAgPyBgY2xhc3MgXCIke2NsYXNzTmFtZXNbMF19XCJgXG4gICAgICAgICAgICAgIDogYGNsYXNzZXMgJHtjbGFzc05hbWVzLm1hcCgobmFtZSkgPT4gYFwiJHtuYW1lfVwiYCkuam9pbignLCAnKX1gO1xuICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgIGNoYWxrLnllbGxvdyhg4pqgIFNlcmRlIHdhcm5pbmcgZm9yICR7Y2xhc3NMYWJlbH06IGApICsgaXNzdWVcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHdvcmtmbG93RW50cnlwb2ludE9wdGlvbnNDb2RlID1cbiAgICAgICAgY3JlYXRlV29ya2Zsb3dFbnRyeXBvaW50T3B0aW9uc0NvZGUoKTtcblxuICAgICAgY29uc3QgYnVuZGxlRmluYWwgPSBhc3luYyAoaW50ZXJpbUJ1bmRsZTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IHdvcmtmbG93QnVuZGxlQ29kZSA9IGludGVyaW1CdW5kbGU7XG5cbiAgICAgICAgY29uc3Qgd29ya2Zsb3dGdW5jdGlvbkNvZGUgPSBgLy8gYmlvbWUtaWdub3JlLWFsbCBsaW50OiBnZW5lcmF0ZWQgZmlsZVxuLyogZXNsaW50LWRpc2FibGUgKi9cbmltcG9ydCB7IHdvcmtmbG93RW50cnlwb2ludCB9IGZyb20gJ3dvcmtmbG93L3J1bnRpbWUnO1xuXG5jb25zdCB3b3JrZmxvd0NvZGUgPSBcXGAke3dvcmtmbG93QnVuZGxlQ29kZS5yZXBsYWNlKC9bXFxcXGAkXS9nLCAnXFxcXCQmJyl9XFxgO1xuXG5jb25zdCBoYW5kbGVyID0gd29ya2Zsb3dFbnRyeXBvaW50KHdvcmtmbG93Q29kZSR7d29ya2Zsb3dFbnRyeXBvaW50T3B0aW9uc0NvZGV9KTtcblxuZXhwb3J0IGNvbnN0IEhFQUQgPSBoYW5kbGVyO1xuZXhwb3J0IGNvbnN0IFBPU1QgPSBoYW5kbGVyO2A7XG5cbiAgICAgICAgLy8gd2Ugc2tpcCB0aGUgZmluYWwgYnVuZGxpbmcgc3RlcCBmb3IgTmV4dC5qcyBzbyBpdCBjYW4gYnVuZGxlIGl0c2VsZlxuICAgICAgICBpZiAoIWJ1bmRsZUZpbmFsT3V0cHV0KSB7XG4gICAgICAgICAgaWYgKCFvdXRmaWxlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFyaWFudDogbWlzc2luZyBvdXRmaWxlIGZvciB3b3JrZmxvdyBidW5kbGVgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gRW5zdXJlIHRoZSBvdXRwdXQgZGlyZWN0b3J5IGV4aXN0c1xuICAgICAgICAgIGNvbnN0IG91dHB1dERpciA9IGRpcm5hbWUob3V0ZmlsZSk7XG4gICAgICAgICAgYXdhaXQgbWtkaXIob3V0cHV0RGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgICAgICAgIC8vIEF0b21pYyB3cml0ZTogd3JpdGUgdG8gdGVtcCBmaWxlIHRoZW4gcmVuYW1lIHRvIHByZXZlbnRcbiAgICAgICAgICAvLyBmaWxlIHdhdGNoZXJzIGZyb20gcmVhZGluZyBwYXJ0aWFsIGZpbGUgZHVyaW5nIHdyaXRlXG4gICAgICAgICAgY29uc3QgdGVtcFBhdGggPSBgJHtvdXRmaWxlfS4ke3JhbmRvbVVVSUQoKX0udG1wYDtcbiAgICAgICAgICBhd2FpdCB3cml0ZUZpbGUodGVtcFBhdGgsIHdvcmtmbG93RnVuY3Rpb25Db2RlKTtcbiAgICAgICAgICBhd2FpdCByZW5hbWUodGVtcFBhdGgsIG91dGZpbGUpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGJ1bmRsZVN0YXJ0VGltZSA9IERhdGUubm93KCk7XG5cbiAgICAgICAgLy8gTm93IGJ1bmRsZSB0aGlzIHNvIHdlIGNhbiByZXNvbHZlIHRoZSBAd29ya2Zsb3cvY29yZSBkZXBlbmRlbmN5XG4gICAgICAgIC8vIHdlIGNvdWxkIHJlbW92ZSB0aGlzIGlmIHdlIGRvIG5mdCB0cmFjaW5nIG9yIHNpbWlsYXIgaW5zdGVhZFxuICAgICAgICBjb25zdCBmaW5hbFdvcmtmbG93UmVzdWx0ID0gYXdhaXQgZXNidWlsZC5idWlsZCh7XG4gICAgICAgICAgYmFubmVyOiB7XG4gICAgICAgICAgICBqczogJy8vIGJpb21lLWlnbm9yZS1hbGwgbGludDogZ2VuZXJhdGVkIGZpbGVcXG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xcbicsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzdGRpbjoge1xuICAgICAgICAgICAgY29udGVudHM6IHdvcmtmbG93RnVuY3Rpb25Db2RlLFxuICAgICAgICAgICAgcmVzb2x2ZURpcjogdGhpcy5jb25maWcud29ya2luZ0RpcixcbiAgICAgICAgICAgIHNvdXJjZWZpbGU6ICd2aXJ0dWFsLWVudHJ5LmpzJyxcbiAgICAgICAgICAgIGxvYWRlcjogJ2pzJyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIG91dGZpbGUsXG4gICAgICAgICAgLy8gU291cmNlIG1hcHMgZm9yIHRoZSBmaW5hbCB3b3JrZmxvdyBidW5kbGUgd3JhcHBlciAobm90IGltcG9ydGFudCBzaW5jZSB0aGlzIGNvZGVcbiAgICAgICAgICAvLyBkb2Vzbid0IHJ1biBpbiB0aGUgVk0gLSBvbmx5IHRoZSBpbnRlcm1lZGlhdGUgYnVuZGxlIHNvdXJjZW1hcCBpcyByZWxldmFudClcbiAgICAgICAgICBzb3VyY2VtYXA6IEVNSVRfU09VUkNFTUFQU19GT1JfREVCVUdHSU5HLFxuICAgICAgICAgIGFic1dvcmtpbmdEaXI6IHRoaXMuY29uZmlnLndvcmtpbmdEaXIsXG4gICAgICAgICAgYnVuZGxlOiB0cnVlLFxuICAgICAgICAgIGZvcm1hdCxcbiAgICAgICAgICBwbGF0Zm9ybTogJ25vZGUnLFxuICAgICAgICAgIHRhcmdldDogJ2VzMjAyMicsXG4gICAgICAgICAgd3JpdGU6IHRydWUsXG4gICAgICAgICAga2VlcE5hbWVzOiB0cnVlLFxuICAgICAgICAgIG1pbmlmeTogZmFsc2UsXG4gICAgICAgICAgZXh0ZXJuYWw6IFsnQGF3cy1zZGsvY3JlZGVudGlhbC1wcm92aWRlci13ZWItaWRlbnRpdHknXSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5sb2dFc2J1aWxkTWVzc2FnZXMoXG4gICAgICAgICAgZmluYWxXb3JrZmxvd1Jlc3VsdCxcbiAgICAgICAgICAnZmluYWwgd29ya2Zsb3cgYnVuZGxlJyxcbiAgICAgICAgICB0cnVlLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHN1cHByZXNzV2FybmluZ3M6IHRoaXMuY29uZmlnLnN1cHByZXNzQ3JlYXRlV29ya2Zsb3dzQnVuZGxlV2FybmluZ3MsXG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgICB0aGlzLmxvZ0NyZWF0ZVdvcmtmbG93c0J1bmRsZUluZm8oXG4gICAgICAgICAgJ0NyZWF0ZWQgZmluYWwgd29ya2Zsb3cgYnVuZGxlJyxcbiAgICAgICAgICBgJHtEYXRlLm5vdygpIC0gYnVuZGxlU3RhcnRUaW1lfW1zYFxuICAgICAgICApO1xuICAgICAgfTtcbiAgICAgIGF3YWl0IGJ1bmRsZUZpbmFsKGludGVyaW1CdW5kbGUub3V0cHV0RmlsZXNbMF0udGV4dCk7XG5cbiAgICAgIGlmIChrZWVwSW50ZXJpbUJ1bmRsZUNvbnRleHQpIHtcbiAgICAgICAgc2hvdWxkRGlzcG9zZUludGVyaW1CdW5kbGVDdHggPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBtYW5pZmVzdDogd29ya2Zsb3dNYW5pZmVzdCxcbiAgICAgICAgICBpbnRlcmltQnVuZGxlQ3R4LFxuICAgICAgICAgIGJ1bmRsZUZpbmFsLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgbWFuaWZlc3Q6IHdvcmtmbG93TWFuaWZlc3QgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgc2hvdWxkRGlzcG9zZUludGVyaW1CdW5kbGVDdHggPSB0cnVlO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmIChzaG91bGREaXNwb3NlSW50ZXJpbUJ1bmRsZUN0eCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IGludGVyaW1CdW5kbGVDdHguZGlzcG9zZSgpO1xuICAgICAgICB9IGNhdGNoIChkaXNwb3NlRXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAnV2FybmluZzogRmFpbGVkIHRvIGRpc3Bvc2Ugd29ya2Zsb3cgYnVuZGxlIGNvbnRleHQnLFxuICAgICAgICAgICAgZGlzcG9zZUVycm9yXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgY2xpZW50IGxpYnJhcnkgYnVuZGxlIGZvciB3b3JrZmxvdyBleGVjdXRpb24uXG4gICAqIFRoZSBjbGllbnQgbGlicmFyeSBhbGxvd3MgaW1wb3J0aW5nIGFuZCBjYWxsaW5nIHdvcmtmbG93cyBmcm9tIGFwcGxpY2F0aW9uIGNvZGUuXG4gICAqIE9ubHkgZ2VuZXJhdGVkIGlmIGNsaWVudEJ1bmRsZVBhdGggaXMgc3BlY2lmaWVkIGluIGNvbmZpZy5cbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBjcmVhdGVDbGllbnRMaWJyYXJ5KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5jb25maWcuY2xpZW50QnVuZGxlUGF0aCkge1xuICAgICAgLy8gU2lsZW50bHkgZXhpdCBzaW5jZSBubyBjbGllbnQgYnVuZGxlIHdhcyByZXF1ZXN0ZWRcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmxvZ0Jhc2VCdWlsZGVySW5mbyhcbiAgICAgICdHZW5lcmF0aW5nIGEgY2xpZW50IGxpYnJhcnkgYXQnLFxuICAgICAgdGhpcy5jb25maWcuY2xpZW50QnVuZGxlUGF0aFxuICAgICk7XG4gICAgdGhpcy5sb2dCYXNlQnVpbGRlckluZm8oXG4gICAgICAnTk9URTogVGhlIHJlY29tbWVuZGVkIHdheSB0byB1c2Ugd29ya2Zsb3cgd2l0aCBhIGZyYW1ld29yayBsaWtlIE5leHRKUyBpcyB1c2luZyB0aGUgbG9hZGVyL3BsdWdpbiB3aXRoIHdlYnBhY2svdHVyYm9icGFjay9yb2xsdXAnXG4gICAgKTtcblxuICAgIC8vIEVuc3VyZSB3ZSBoYXZlIHRoZSBkaXJlY3RvcnkgZm9yIHRoZSBjbGllbnQgYnVuZGxlXG4gICAgY29uc3Qgb3V0cHV0RGlyID0gZGlybmFtZSh0aGlzLmNvbmZpZy5jbGllbnRCdW5kbGVQYXRoKTtcbiAgICBhd2FpdCBta2RpcihvdXRwdXREaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gICAgY29uc3QgaW5wdXRGaWxlcyA9IGF3YWl0IHRoaXMuZ2V0SW5wdXRGaWxlcygpO1xuXG4gICAgLy8gRGlzY292ZXIgc2VyZGUgZmlsZXMgZnJvbSB0aGUgaW5wdXQgZmlsZXMnIGRlcGVuZGVuY3kgdHJlZSBmb3IgY3Jvc3MtY29udGV4dCBjbGFzcyByZWdpc3RyYXRpb24uXG4gICAgLy8gQ2xhc3NlcyBuZWVkIHRvIGJlIHJlZ2lzdGVyZWQgaW4gdGhlIGNsaWVudCBidW5kbGUgc28gdGhleSBjYW4gYmUgc2VyaWFsaXplZFxuICAgIC8vIHdoZW4gcGFzc2luZyBkYXRhIHRvIHdvcmtmbG93cyB2aWEgc3RhcnQoKSBhbmQgZGVzZXJpYWxpemVkIHdoZW4gcmVjZWl2aW5nIHdvcmtmbG93IHJlc3VsdHMuXG4gICAgY29uc3QgeyBkaXNjb3ZlcmVkU2VyZGVGaWxlcyB9ID0gYXdhaXQgdGhpcy5kaXNjb3ZlckVudHJpZXMoXG4gICAgICBpbnB1dEZpbGVzLFxuICAgICAgb3V0cHV0RGlyXG4gICAgKTtcblxuICAgIC8vIElkZW50aWZ5IHNlcmRlIGZpbGVzIHRoYXQgYXJlbid0IGluIHRoZSBpbnB1dEZpbGVzIChkZWR1cGxpY2F0ZWQpXG4gICAgY29uc3QgaW5wdXRGaWxlc05vcm1hbGl6ZWQgPSBuZXcgU2V0KFxuICAgICAgaW5wdXRGaWxlcy5tYXAoKGYpID0+IGYucmVwbGFjZSgvXFxcXC9nLCAnLycpKVxuICAgICk7XG4gICAgY29uc3Qgc2VyZGVPbmx5RmlsZXMgPSBbLi4uZGlzY292ZXJlZFNlcmRlRmlsZXNdLmZpbHRlcihcbiAgICAgIChmKSA9PiAhaW5wdXRGaWxlc05vcm1hbGl6ZWQuaGFzKGYpXG4gICAgKTtcblxuICAgIC8vIFJlLWV4cG9ydHMgZm9yIGlucHV0IGZpbGVzICh1c2VyJ3Mgd29ya2Zsb3cvc3RlcCBkZWZpbml0aW9ucykuXG4gICAgLy8gVGhlc2UgbXVzdCB1c2UgdmFsaWQgcmVsYXRpdmUgc3BlY2lmaWVycyBiZWNhdXNlIHNvbWUgZnJhbWV3b3JrcyBwYXNzXG4gICAgLy8gZ2VuZXJhdGVkIGZpbGVzIGxpa2UgXCIub3V0cHV0L3NlcnZlci9pbmRleC5tanNcIiBhcyBpbnB1dCBmaWxlcy5cbiAgICBjb25zdCByZWV4cG9ydHMgPSBpbnB1dEZpbGVzXG4gICAgICAubWFwKChmaWxlKSA9PiB7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRXb3JraW5nRGlyID0gdGhpcy5jb25maWcud29ya2luZ0Rpci5yZXBsYWNlKC9cXFxcL2csICcvJyk7XG4gICAgICAgIGxldCByZWxhdGl2ZVBhdGggPSByZWxhdGl2ZShub3JtYWxpemVkV29ya2luZ0RpciwgZmlsZSkucmVwbGFjZShcbiAgICAgICAgICAvXFxcXC9nLFxuICAgICAgICAgICcvJ1xuICAgICAgICApO1xuICAgICAgICBpZiAoIXJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKCcuLycpICYmICFyZWxhdGl2ZVBhdGguc3RhcnRzV2l0aCgnLi4vJykpIHtcbiAgICAgICAgICByZWxhdGl2ZVBhdGggPSBgLi8ke3JlbGF0aXZlUGF0aH1gO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgZXhwb3J0ICogZnJvbSAnJHtyZWxhdGl2ZVBhdGh9JztgO1xuICAgICAgfSlcbiAgICAgIC5qb2luKCdcXG4nKTtcblxuICAgIC8vIFNpZGUtZWZmZWN0IGltcG9ydHMgZm9yIHNlcmRlIGZpbGVzIG5vdCBpbiBpbnB1dEZpbGVzIChmb3IgY2xhc3MgcmVnaXN0cmF0aW9uKVxuICAgIGNvbnN0IHNlcmRlSW1wb3J0cyA9IHNlcmRlT25seUZpbGVzXG4gICAgICAubWFwKChmaWxlKSA9PiB7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRXb3JraW5nRGlyID0gdGhpcy5jb25maWcud29ya2luZ0Rpci5yZXBsYWNlKC9cXFxcL2csICcvJyk7XG4gICAgICAgIGxldCByZWxhdGl2ZVBhdGggPSByZWxhdGl2ZShub3JtYWxpemVkV29ya2luZ0RpciwgZmlsZSkucmVwbGFjZShcbiAgICAgICAgICAvXFxcXC9nLFxuICAgICAgICAgICcvJ1xuICAgICAgICApO1xuICAgICAgICBpZiAoIXJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKCcuLycpICYmICFyZWxhdGl2ZVBhdGguc3RhcnRzV2l0aCgnLi4vJykpIHtcbiAgICAgICAgICByZWxhdGl2ZVBhdGggPSBgLi8ke3JlbGF0aXZlUGF0aH1gO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgaW1wb3J0ICcke3JlbGF0aXZlUGF0aH0nO2A7XG4gICAgICB9KVxuICAgICAgLmpvaW4oJ1xcbicpO1xuXG4gICAgLy8gQ29tYmluZTogc2VyZGUgaW1wb3J0cyAoZm9yIHJlZ2lzdHJhdGlvbiBzaWRlIGVmZmVjdHMpICsgcmUtZXhwb3J0c1xuICAgIGNvbnN0IGVudHJ5Q29udGVudCA9IHNlcmRlSW1wb3J0c1xuICAgICAgPyBgLy8gU2VyZGUgZmlsZXMgZm9yIGNyb3NzLWNvbnRleHQgY2xhc3MgcmVnaXN0cmF0aW9uXFxuJHtzZXJkZUltcG9ydHN9XFxuJHtyZWV4cG9ydHN9YFxuICAgICAgOiByZWV4cG9ydHM7XG5cbiAgICAvLyBCdW5kbGUgd2l0aCBlc2J1aWxkIGFuZCBvdXIgY3VzdG9tIFNXQyBwbHVnaW5cbiAgICBjb25zdCBub3JtYWxpemVkQ2xpZW50U2lkZUVmZmVjdEVudHJpZXMgPSBhd2FpdCB3aXRoUmVhbHBhdGhzKFtcbiAgICAgIC4uLmlucHV0RmlsZXMsXG4gICAgICAuLi5zZXJkZU9ubHlGaWxlcyxcbiAgICBdKTtcbiAgICBjb25zdCBjbGllbnRSZXN1bHQgPSBhd2FpdCBlc2J1aWxkLmJ1aWxkKHtcbiAgICAgIGJhbm5lcjoge1xuICAgICAgICBqczogJy8vIGJpb21lLWlnbm9yZS1hbGwgbGludDogZ2VuZXJhdGVkIGZpbGVcXG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xcbicsXG4gICAgICB9LFxuICAgICAgc3RkaW46IHtcbiAgICAgICAgY29udGVudHM6IGVudHJ5Q29udGVudCxcbiAgICAgICAgcmVzb2x2ZURpcjogdGhpcy5jb25maWcud29ya2luZ0RpcixcbiAgICAgICAgc291cmNlZmlsZTogJ3ZpcnR1YWwtZW50cnkuanMnLFxuICAgICAgICBsb2FkZXI6ICdqcycsXG4gICAgICB9LFxuICAgICAgb3V0ZmlsZTogdGhpcy5jb25maWcuY2xpZW50QnVuZGxlUGF0aCxcbiAgICAgIGJ1bmRsZTogdHJ1ZSxcbiAgICAgIGZvcm1hdDogJ2VzbScsXG4gICAgICBwbGF0Zm9ybTogJ25vZGUnLFxuICAgICAganN4OiAncHJlc2VydmUnLFxuICAgICAgdGFyZ2V0OiAnZXMyMDIyJyxcbiAgICAgIHdyaXRlOiB0cnVlLFxuICAgICAgdHJlZVNoYWtpbmc6IHRydWUsXG4gICAgICBleHRlcm5hbDogWydAd29ya2Zsb3cvY29yZSddLFxuICAgICAgcmVzb2x2ZUV4dGVuc2lvbnM6IFtcbiAgICAgICAgJy50cycsXG4gICAgICAgICcudHN4JyxcbiAgICAgICAgJy5tdHMnLFxuICAgICAgICAnLmN0cycsXG4gICAgICAgICcuanMnLFxuICAgICAgICAnLmpzeCcsXG4gICAgICAgICcubWpzJyxcbiAgICAgICAgJy5janMnLFxuICAgICAgXSxcbiAgICAgIHBsdWdpbnM6IFtcbiAgICAgICAgY3JlYXRlU3djUGx1Z2luKHtcbiAgICAgICAgICBtb2RlOiAnY2xpZW50JyxcbiAgICAgICAgICBwcm9qZWN0Um9vdDogdGhpcy50cmFuc2Zvcm1Qcm9qZWN0Um9vdCxcbiAgICAgICAgICBzaWRlRWZmZWN0RW50cmllczogbm9ybWFsaXplZENsaWVudFNpZGVFZmZlY3RFbnRyaWVzLFxuICAgICAgICB9KSxcbiAgICAgIF0sXG4gICAgfSk7XG5cbiAgICB0aGlzLmxvZ0VzYnVpbGRNZXNzYWdlcyhjbGllbnRSZXN1bHQsICdjbGllbnQgbGlicmFyeSBidW5kbGUnKTtcblxuICAgIC8vIENyZWF0ZSAuZ2l0aWdub3JlIGluIC5zd2MgZGlyZWN0b3J5XG4gICAgYXdhaXQgdGhpcy5jcmVhdGVTd2NHaXRpZ25vcmUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgd2ViaG9vayBoYW5kbGVyIGJ1bmRsZSBmb3IgcmVzdW1pbmcgd29ya2Zsb3dzIHZpYSBIVFRQIGNhbGxiYWNrcy5cbiAgICpcbiAgICogQHBhcmFtIGJ1bmRsZSAtIElmIHRydWUsIGJ1bmRsZXMgZGVwZW5kZW5jaWVzIChuZWVkZWQgZm9yIEJ1aWxkIE91dHB1dCBBUEkpXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgY3JlYXRlV2ViaG9va0J1bmRsZSh7XG4gICAgb3V0ZmlsZSxcbiAgICBidW5kbGUgPSBmYWxzZSxcbiAgfToge1xuICAgIG91dGZpbGU6IHN0cmluZztcbiAgICBidW5kbGU/OiBib29sZWFuO1xuICB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5sb2dDcmVhdGVXZWJob29rQnVuZGxlSW5mbygnQ3JlYXRpbmcgd2ViaG9vayByb3V0ZScpO1xuICAgIGF3YWl0IG1rZGlyKGRpcm5hbWUob3V0ZmlsZSksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gICAgLy8gQ3JlYXRlIGEgc3RhdGljIHJvdXRlIHRoYXQgY2FsbHMgcmVzdW1lV2ViaG9va1xuICAgIC8vIFRoaXMgcm91dGUgd29ya3MgZm9yIGJvdGggTmV4dC5qcyBhbmQgVmVyY2VsIEJ1aWxkIE91dHB1dCBBUElcbiAgICBjb25zdCByb3V0ZUNvbnRlbnQgPSBgaW1wb3J0IHsgcmVzdW1lV2ViaG9vayB9IGZyb20gJ3dvcmtmbG93L2FwaSc7XG5cbmFzeW5jIGZ1bmN0aW9uIGhhbmRsZXIocmVxdWVzdCkge1xuICBjb25zdCB1cmwgPSBuZXcgVVJMKHJlcXVlc3QudXJsKTtcbiAgLy8gRXh0cmFjdCB0b2tlbiBmcm9tIHBhdGhuYW1lOiAvLndlbGwta25vd24vd29ya2Zsb3cvdjEvd2ViaG9vay97dG9rZW59XG4gIGNvbnN0IHBhdGhQYXJ0cyA9IHVybC5wYXRobmFtZS5zcGxpdCgnLycpO1xuICBjb25zdCB0b2tlbiA9IGRlY29kZVVSSUNvbXBvbmVudChwYXRoUGFydHNbcGF0aFBhcnRzLmxlbmd0aCAtIDFdKTtcblxuICBpZiAoIXRva2VuKSB7XG4gICAgcmV0dXJuIG5ldyBSZXNwb25zZSgnTWlzc2luZyB0b2tlbicsIHsgc3RhdHVzOiA0MDAgfSk7XG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgcmVzdW1lV2ViaG9vayh0b2tlbiwgcmVxdWVzdCk7XG4gICAgcmV0dXJuIHJlc3BvbnNlO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIC8vIFRPRE86IGRpZmZlcmVudGlhdGUgYmV0d2VlbiBpbnZhbGlkIHRva2VuIGFuZCBvdGhlciBlcnJvcnNcbiAgICBjb25zb2xlLmVycm9yKCdFcnJvciBkdXJpbmcgcmVzdW1lV2ViaG9vaycsIGVycm9yKTtcbiAgICByZXR1cm4gbmV3IFJlc3BvbnNlKG51bGwsIHsgc3RhdHVzOiA0MDQgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IEdFVCA9IGhhbmRsZXI7XG5leHBvcnQgY29uc3QgUE9TVCA9IGhhbmRsZXI7XG5leHBvcnQgY29uc3QgUFVUID0gaGFuZGxlcjtcbmV4cG9ydCBjb25zdCBQQVRDSCA9IGhhbmRsZXI7XG5leHBvcnQgY29uc3QgREVMRVRFID0gaGFuZGxlcjtcbmV4cG9ydCBjb25zdCBIRUFEID0gaGFuZGxlcjtcbmV4cG9ydCBjb25zdCBPUFRJT05TID0gaGFuZGxlcjtgO1xuXG4gICAgaWYgKCFidW5kbGUpIHtcbiAgICAgIC8vIEZvciBOZXh0LmpzLCBqdXN0IHdyaXRlIHRoZSB1bmJ1bmRsZWQgZmlsZVxuICAgICAgYXdhaXQgd3JpdGVGaWxlKG91dGZpbGUsIHJvdXRlQ29udGVudCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gRm9yIEJ1aWxkIE91dHB1dCBBUEksIGJ1bmRsZSB3aXRoIGVzYnVpbGQgdG8gcmVzb2x2ZSBpbXBvcnRzXG5cbiAgICBjb25zdCB3ZWJob29rRm9ybWF0ID0gJ2NqcycgYXMgY29uc3Q7XG4gICAgY29uc3QgeyBiYW5uZXI6IHdlYmhvb2tJbXBvcnRNZXRhQmFubmVyLCBkZWZpbmU6IHdlYmhvb2tJbXBvcnRNZXRhRGVmaW5lIH0gPVxuICAgICAgdGhpcy5nZXRDanNJbXBvcnRNZXRhUG9seWZpbGwod2ViaG9va0Zvcm1hdCk7XG5cbiAgICBjb25zdCB3ZWJob29rQnVuZGxlU3RhcnQgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGVzYnVpbGQuYnVpbGQoe1xuICAgICAgYmFubmVyOiB7XG4gICAgICAgIGpzOiBgLy8gYmlvbWUtaWdub3JlLWFsbCBsaW50OiBnZW5lcmF0ZWQgZmlsZVxcbi8qIGVzbGludC1kaXNhYmxlICovXFxuJHt3ZWJob29rSW1wb3J0TWV0YUJhbm5lcn1gLFxuICAgICAgfSxcbiAgICAgIHN0ZGluOiB7XG4gICAgICAgIGNvbnRlbnRzOiByb3V0ZUNvbnRlbnQsXG4gICAgICAgIHJlc29sdmVEaXI6IHRoaXMuY29uZmlnLndvcmtpbmdEaXIsXG4gICAgICAgIHNvdXJjZWZpbGU6ICd3ZWJob29rLXJvdXRlLmpzJyxcbiAgICAgICAgbG9hZGVyOiAnanMnLFxuICAgICAgfSxcbiAgICAgIG91dGZpbGUsXG4gICAgICBhYnNXb3JraW5nRGlyOiB0aGlzLmNvbmZpZy53b3JraW5nRGlyLFxuICAgICAgYnVuZGxlOiB0cnVlLFxuICAgICAganN4OiAncHJlc2VydmUnLFxuICAgICAgZm9ybWF0OiB3ZWJob29rRm9ybWF0LFxuICAgICAgcGxhdGZvcm06ICdub2RlJyxcbiAgICAgIGNvbmRpdGlvbnM6IFsnaW1wb3J0JywgJ21vZHVsZScsICdub2RlJywgJ2RlZmF1bHQnXSxcbiAgICAgIHRhcmdldDogJ2VzMjAyMicsXG4gICAgICB3cml0ZTogdHJ1ZSxcbiAgICAgIHRyZWVTaGFraW5nOiB0cnVlLFxuICAgICAga2VlcE5hbWVzOiB0cnVlLFxuICAgICAgbWluaWZ5OiBmYWxzZSxcbiAgICAgIGRlZmluZTogd2ViaG9va0ltcG9ydE1ldGFEZWZpbmUsXG4gICAgICByZXNvbHZlRXh0ZW5zaW9uczogW1xuICAgICAgICAnLnRzJyxcbiAgICAgICAgJy50c3gnLFxuICAgICAgICAnLm10cycsXG4gICAgICAgICcuY3RzJyxcbiAgICAgICAgJy5qcycsXG4gICAgICAgICcuanN4JyxcbiAgICAgICAgJy5tanMnLFxuICAgICAgICAnLmNqcycsXG4gICAgICBdLFxuICAgICAgc291cmNlbWFwOiBFTUlUX1NPVVJDRU1BUFNfRk9SX0RFQlVHR0lORyxcbiAgICAgIG1haW5GaWVsZHM6IFsnbW9kdWxlJywgJ21haW4nXSxcbiAgICAgIC8vIERvbid0IGV4dGVybmFsaXplIGFueXRoaW5nIC0gYnVuZGxlIGV2ZXJ5dGhpbmcgaW5jbHVkaW5nIHdvcmtmbG93IHBhY2thZ2VzXG4gICAgICBleHRlcm5hbDogW10sXG4gICAgfSk7XG5cbiAgICB0aGlzLmxvZ0VzYnVpbGRNZXNzYWdlcyhyZXN1bHQsICd3ZWJob29rIGJ1bmRsZSBjcmVhdGlvbicpO1xuICAgIHRoaXMubG9nQ3JlYXRlV2ViaG9va0J1bmRsZUluZm8oXG4gICAgICAnQ3JlYXRlZCB3ZWJob29rIGJ1bmRsZScsXG4gICAgICBgJHtEYXRlLm5vdygpIC0gd2ViaG9va0J1bmRsZVN0YXJ0fW1zYFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHBhY2thZ2UuanNvbiBmaWxlIHdpdGggdGhlIHNwZWNpZmllZCBtb2R1bGUgdHlwZS5cbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBjcmVhdGVQYWNrYWdlSnNvbihcbiAgICBkaXI6IHN0cmluZyxcbiAgICB0eXBlOiAnY29tbW9uanMnIHwgJ21vZHVsZSdcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGFja2FnZUpzb24gPSB7IHR5cGUgfTtcbiAgICBhd2FpdCB3cml0ZUZpbGUoXG4gICAgICBqb2luKGRpciwgJ3BhY2thZ2UuanNvbicpLFxuICAgICAgSlNPTi5zdHJpbmdpZnkocGFja2FnZUpzb24sIG51bGwsIDIpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgLnZjLWNvbmZpZy5qc29uIGZpbGUgZm9yIFZlcmNlbCBCdWlsZCBPdXRwdXQgQVBJIGZ1bmN0aW9ucy5cbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBjcmVhdGVWY0NvbmZpZyhcbiAgICBkaXI6IHN0cmluZyxcbiAgICBjb25maWc6IHtcbiAgICAgIHJ1bnRpbWU/OiBzdHJpbmc7XG4gICAgICBoYW5kbGVyPzogc3RyaW5nO1xuICAgICAgbGF1bmNoZXJUeXBlPzogc3RyaW5nO1xuICAgICAgYXJjaGl0ZWN0dXJlPzogc3RyaW5nO1xuICAgICAgc2hvdWxkQWRkSGVscGVycz86IGJvb2xlYW47XG4gICAgICBzaG91bGRBZGRTb3VyY2VtYXBTdXBwb3J0PzogYm9vbGVhbjtcbiAgICAgIG1heER1cmF0aW9uPzogbnVtYmVyIHwgJ21heCc7XG4gICAgICBleHBlcmltZW50YWxUcmlnZ2Vycz86IEFycmF5PHtcbiAgICAgICAgdHlwZTogJ3F1ZXVlL3YyYmV0YSc7XG4gICAgICAgIHRvcGljOiBzdHJpbmc7XG4gICAgICAgIGNvbnN1bWVyOiBzdHJpbmc7XG4gICAgICAgIG1heERlbGl2ZXJpZXM/OiBudW1iZXI7XG4gICAgICAgIHJldHJ5QWZ0ZXJTZWNvbmRzPzogbnVtYmVyO1xuICAgICAgICBpbml0aWFsRGVsYXlTZWNvbmRzPzogbnVtYmVyO1xuICAgICAgfT47XG4gICAgfVxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB2Y0NvbmZpZyA9IHtcbiAgICAgIHJ1bnRpbWU6IGNvbmZpZy5ydW50aW1lID8/ICdub2RlanMyMi54JyxcbiAgICAgIGhhbmRsZXI6IGNvbmZpZy5oYW5kbGVyID8/ICdpbmRleC5qcycsXG4gICAgICBsYXVuY2hlclR5cGU6IGNvbmZpZy5sYXVuY2hlclR5cGUgPz8gJ05vZGVqcycsXG4gICAgICBhcmNoaXRlY3R1cmU6IGNvbmZpZy5hcmNoaXRlY3R1cmUgPz8gJ2FybTY0JyxcbiAgICAgIHNob3VsZEFkZEhlbHBlcnM6IGNvbmZpZy5zaG91bGRBZGRIZWxwZXJzID8/IHRydWUsXG4gICAgICAuLi4oY29uZmlnLm1heER1cmF0aW9uICE9PSB1bmRlZmluZWQgJiYge1xuICAgICAgICBtYXhEdXJhdGlvbjogY29uZmlnLm1heER1cmF0aW9uLFxuICAgICAgfSksXG4gICAgICAuLi4oY29uZmlnLnNob3VsZEFkZFNvdXJjZW1hcFN1cHBvcnQgIT09IHVuZGVmaW5lZCAmJiB7XG4gICAgICAgIHNob3VsZEFkZFNvdXJjZW1hcFN1cHBvcnQ6IGNvbmZpZy5zaG91bGRBZGRTb3VyY2VtYXBTdXBwb3J0LFxuICAgICAgfSksXG4gICAgICAuLi4oY29uZmlnLmV4cGVyaW1lbnRhbFRyaWdnZXJzICYmIHtcbiAgICAgICAgZXhwZXJpbWVudGFsVHJpZ2dlcnM6IGNvbmZpZy5leHBlcmltZW50YWxUcmlnZ2VycyxcbiAgICAgIH0pLFxuICAgIH07XG5cbiAgICBhd2FpdCB3cml0ZUZpbGUoXG4gICAgICBqb2luKGRpciwgJy52Yy1jb25maWcuanNvbicpLFxuICAgICAgSlNPTi5zdHJpbmdpZnkodmNDb25maWcsIG51bGwsIDIpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyBhIHBhdGggcmVsYXRpdmUgdG8gdGhlIHdvcmtpbmcgZGlyZWN0b3J5LlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlc29sdmVQYXRoKHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHJlc29sdmUodGhpcy5jb25maWcud29ya2luZ0RpciwgcGF0aCk7XG4gIH1cblxuICAvKipcbiAgICogRW5zdXJlcyB0aGUgZGlyZWN0b3J5IGZvciBhIGZpbGUgcGF0aCBleGlzdHMsIGNyZWF0aW5nIGl0IGlmIG5lY2Vzc2FyeS5cbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBlbnN1cmVEaXJlY3RvcnkoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IG1rZGlyKGRpcm5hbWUoZmlsZVBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY3JlYXRlU3djR2l0aWdub3JlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB3cml0ZUZpbGUoXG4gICAgICAgIGpvaW4odGhpcy5jb25maWcud29ya2luZ0RpciwgJy5zd2MnLCAnLmdpdGlnbm9yZScpLFxuICAgICAgICAnKlxcbidcbiAgICAgICk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBXZSdyZSBpbnRlbnRpb25hbGx5IHNpbGVudGx5IGlnbm9yaW5nIHRoaXMgZXJyb3IgLSBjcmVhdGluZyAuZ2l0aWdub3JlIGlzbid0IGNyaXRpY2FsXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIG1hbmlmZXN0IHNob3VsZCBiZSBleHBvc2VkIGFzIGEgcHVibGljIEhUVFAgcm91dGUuXG4gICAqIENvbnRyb2xsZWQgYnkgdGhlIGBXT1JLRkxPV19QVUJMSUNfTUFOSUZFU1RgIGVudmlyb25tZW50IHZhcmlhYmxlLlxuICAgKi9cbiAgcHJvdGVjdGVkIGdldCBzaG91bGRFeHBvc2VQdWJsaWNNYW5pZmVzdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gcHJvY2Vzcy5lbnYuV09SS0ZMT1dfUFVCTElDX01BTklGRVNUID09PSAnMSc7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciBkaWFnbm9zdGljcyBhcnRpZmFjdHMgc2hvdWxkIGJlIGVtaXR0ZWQgdG8gVmVyY2VsIG91dHB1dC5cbiAgICogVGhpcyBpcyBlbmFibGVkIHdoZW4gdGhlIHJlc29sdmVkIHdvcmxkIHRhcmdldCBpcyBWZXJjZWwuXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0IHNob3VsZEVtaXRWZXJjZWxEaWFnbm9zdGljcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgdXNlc1ZlcmNlbFdvcmxkKCkgfHwgdGhpcy5jb25maWcuYnVpbGRUYXJnZXQgPT09ICd2ZXJjZWwtYnVpbGQtb3V0cHV0LWFwaSdcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBtYW5pZmVzdCBKU09OIGZpbGUgY29udGFpbmluZyBzdGVwL3dvcmtmbG93L2NsYXNzIG1ldGFkYXRhXG4gICAqIGFuZCBncmFwaCBkYXRhIGZvciB2aXN1YWxpemF0aW9uLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgbWFuaWZlc3QgSlNPTiBzdHJpbmcsIG9yIHVuZGVmaW5lZCBpZiBtYW5pZmVzdCBjcmVhdGlvbiBmYWlsZWQuXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgY3JlYXRlTWFuaWZlc3Qoe1xuICAgIHdvcmtmbG93QnVuZGxlUGF0aCxcbiAgICBtYW5pZmVzdERpcixcbiAgICBtYW5pZmVzdCxcbiAgfToge1xuICAgIHdvcmtmbG93QnVuZGxlUGF0aDogc3RyaW5nO1xuICAgIG1hbmlmZXN0RGlyOiBzdHJpbmc7XG4gICAgbWFuaWZlc3Q6IFdvcmtmbG93TWFuaWZlc3Q7XG4gIH0pOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IGJ1aWxkU3RhcnQgPSBEYXRlLm5vdygpO1xuICAgIHRoaXMubG9nQ3JlYXRlTWFuaWZlc3RJbmZvKCdDcmVhdGluZyBtYW5pZmVzdC4uLicpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHdvcmtmbG93R3JhcGhzID0gYXdhaXQgZXh0cmFjdFdvcmtmbG93R3JhcGhzKHdvcmtmbG93QnVuZGxlUGF0aCk7XG5cbiAgICAgIGNvbnN0IHN0ZXBzID0gdGhpcy5jb252ZXJ0U3RlcHNNYW5pZmVzdChtYW5pZmVzdC5zdGVwcyk7XG4gICAgICBjb25zdCB3b3JrZmxvd3MgPSB0aGlzLmNvbnZlcnRXb3JrZmxvd3NNYW5pZmVzdChcbiAgICAgICAgbWFuaWZlc3Qud29ya2Zsb3dzLFxuICAgICAgICB3b3JrZmxvd0dyYXBoc1xuICAgICAgKTtcbiAgICAgIGNvbnN0IGNsYXNzZXMgPSB0aGlzLmNvbnZlcnRDbGFzc2VzTWFuaWZlc3QobWFuaWZlc3QuY2xhc3Nlcyk7XG5cbiAgICAgIGNvbnN0IG91dHB1dCA9IHsgdmVyc2lvbjogJzEuMC4wJywgc3RlcHMsIHdvcmtmbG93cywgY2xhc3NlcyB9O1xuICAgICAgY29uc3QgbWFuaWZlc3RKc29uID0gSlNPTi5zdHJpbmdpZnkob3V0cHV0LCBudWxsLCAyKTtcblxuICAgICAgYXdhaXQgbWtkaXIobWFuaWZlc3REaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgYXdhaXQgd3JpdGVGaWxlKGpvaW4obWFuaWZlc3REaXIsICdtYW5pZmVzdC5qc29uJyksIG1hbmlmZXN0SnNvbik7XG4gICAgICBpZiAodGhpcy5zaG91bGRFbWl0VmVyY2VsRGlhZ25vc3RpY3MpIHtcbiAgICAgICAgY29uc3QgZGlhZ25vc3RpY3NNYW5pZmVzdFBhdGggPSB0aGlzLnJlc29sdmVQYXRoKFxuICAgICAgICAgICcudmVyY2VsL291dHB1dC9kaWFnbm9zdGljcy93b3JrZmxvd3MtbWFuaWZlc3QuanNvbidcbiAgICAgICAgKTtcbiAgICAgICAgYXdhaXQgdGhpcy5lbnN1cmVEaXJlY3RvcnkoZGlhZ25vc3RpY3NNYW5pZmVzdFBhdGgpO1xuICAgICAgICBhd2FpdCB3cml0ZUZpbGUoZGlhZ25vc3RpY3NNYW5pZmVzdFBhdGgsIG1hbmlmZXN0SnNvbik7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHN0ZXBDb3VudCA9IE9iamVjdC52YWx1ZXMoc3RlcHMpLnJlZHVjZShcbiAgICAgICAgKGFjYywgcykgPT4gYWNjICsgT2JqZWN0LmtleXMocykubGVuZ3RoLFxuICAgICAgICAwXG4gICAgICApO1xuICAgICAgY29uc3Qgd29ya2Zsb3dDb3VudCA9IE9iamVjdC52YWx1ZXMod29ya2Zsb3dzKS5yZWR1Y2UoXG4gICAgICAgIChhY2MsIHcpID0+IGFjYyArIE9iamVjdC5rZXlzKHcpLmxlbmd0aCxcbiAgICAgICAgMFxuICAgICAgKTtcbiAgICAgIGNvbnN0IGNsYXNzQ291bnQgPSBPYmplY3QudmFsdWVzKGNsYXNzZXMpLnJlZHVjZShcbiAgICAgICAgKGFjYywgYykgPT4gYWNjICsgT2JqZWN0LmtleXMoYykubGVuZ3RoLFxuICAgICAgICAwXG4gICAgICApO1xuXG4gICAgICB0aGlzLmxvZ0NyZWF0ZU1hbmlmZXN0SW5mbyhcbiAgICAgICAgYENyZWF0ZWQgbWFuaWZlc3Qgd2l0aCAke3N0ZXBDb3VudH0gJHtwbHVyYWxpemUoJ3N0ZXAnLCAnc3RlcHMnLCBzdGVwQ291bnQpfSwgJHt3b3JrZmxvd0NvdW50fSAke3BsdXJhbGl6ZSgnd29ya2Zsb3cnLCAnd29ya2Zsb3dzJywgd29ya2Zsb3dDb3VudCl9LCBhbmQgJHtjbGFzc0NvdW50fSAke3BsdXJhbGl6ZSgnY2xhc3MnLCAnY2xhc3NlcycsIGNsYXNzQ291bnQpfWAsXG4gICAgICAgIGAke0RhdGUubm93KCkgLSBidWlsZFN0YXJ0fW1zYFxuICAgICAgKTtcblxuICAgICAgcmV0dXJuIG1hbmlmZXN0SnNvbjtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAnRmFpbGVkIHRvIGNyZWF0ZSBtYW5pZmVzdDonLFxuICAgICAgICBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcilcbiAgICAgICk7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY29udmVydFN0ZXBzTWFuaWZlc3QoXG4gICAgc3RlcHM6IFdvcmtmbG93TWFuaWZlc3RbJ3N0ZXBzJ11cbiAgKTogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgeyBzdGVwSWQ6IHN0cmluZyB9Pj4ge1xuICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgeyBzdGVwSWQ6IHN0cmluZyB9Pj4gPSB7fTtcbiAgICBpZiAoIXN0ZXBzKSByZXR1cm4gcmVzdWx0O1xuXG4gICAgZm9yIChjb25zdCBbZmlsZVBhdGgsIGVudHJpZXNdIG9mIE9iamVjdC5lbnRyaWVzKHN0ZXBzKSkge1xuICAgICAgcmVzdWx0W2ZpbGVQYXRoXSA9IHt9O1xuICAgICAgZm9yIChjb25zdCBbbmFtZSwgZGF0YV0gb2YgT2JqZWN0LmVudHJpZXMoZW50cmllcykpIHtcbiAgICAgICAgcmVzdWx0W2ZpbGVQYXRoXVtuYW1lXSA9IHsgc3RlcElkOiBkYXRhLnN0ZXBJZCB9O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0V29ya2Zsb3dzTWFuaWZlc3QoXG4gICAgd29ya2Zsb3dzOiBXb3JrZmxvd01hbmlmZXN0Wyd3b3JrZmxvd3MnXSxcbiAgICBncmFwaHM6IFJlY29yZDxcbiAgICAgIHN0cmluZyxcbiAgICAgIFJlY29yZDxzdHJpbmcsIHsgZ3JhcGg6IHsgbm9kZXM6IGFueVtdOyBlZGdlczogYW55W10gfSB9PlxuICAgID5cbiAgKTogUmVjb3JkPFxuICAgIHN0cmluZyxcbiAgICBSZWNvcmQ8XG4gICAgICBzdHJpbmcsXG4gICAgICB7IHdvcmtmbG93SWQ6IHN0cmluZzsgZ3JhcGg6IHsgbm9kZXM6IGFueVtdOyBlZGdlczogYW55W10gfSB9XG4gICAgPlxuICA+IHtcbiAgICBjb25zdCByZXN1bHQ6IFJlY29yZDxcbiAgICAgIHN0cmluZyxcbiAgICAgIFJlY29yZDxcbiAgICAgICAgc3RyaW5nLFxuICAgICAgICB7IHdvcmtmbG93SWQ6IHN0cmluZzsgZ3JhcGg6IHsgbm9kZXM6IGFueVtdOyBlZGdlczogYW55W10gfSB9XG4gICAgICA+XG4gICAgPiA9IHt9O1xuICAgIGlmICghd29ya2Zsb3dzKSByZXR1cm4gcmVzdWx0O1xuXG4gICAgLy8gQnVpbGQgYSBub3JtYWxpemVkIGxvb2t1cCBmb3IgZ3JhcGhzIHNpbmNlIHRoZSBncmFwaCBleHRyYWN0b3IgdXNlc1xuICAgIC8vIHBhdGhzIGZyb20gd29ya2Zsb3dJZCAoZS5nLiBcIi4vd29ya2Zsb3dzL2hlbGxvLWFnZW50XCIpIHdoaWxlIHRoZVxuICAgIC8vIG1hbmlmZXN0IHVzZXMgc291cmNlIGZpbGUgcGF0aHMgKGUuZy4gXCJ3b3JrZmxvd3MvaGVsbG8tYWdlbnQudHNcIikuXG4gICAgLy8gTm9ybWFsaXplIGJ5IHN0cmlwcGluZyBsZWFkaW5nIFwiLi9cIiBhbmQgZmlsZSBleHRlbnNpb25zLlxuICAgIGNvbnN0IG5vcm1hbGl6ZWRHcmFwaHMgPSBuZXcgTWFwPFxuICAgICAgc3RyaW5nLFxuICAgICAgUmVjb3JkPHN0cmluZywgeyBncmFwaDogeyBub2RlczogYW55W107IGVkZ2VzOiBhbnlbXSB9IH0+XG4gICAgPigpO1xuICAgIGZvciAoY29uc3QgW2dyYXBoUGF0aCwgZ3JhcGhFbnRyaWVzXSBvZiBPYmplY3QuZW50cmllcyhncmFwaHMpKSB7XG4gICAgICBjb25zdCBub3JtYWxpemVkID0gZ3JhcGhQYXRoXG4gICAgICAgIC5yZXBsYWNlKC9eXFwuXFwvLywgJycpXG4gICAgICAgIC5yZXBsYWNlKC9cXC5bXi8uXSskLywgJycpO1xuICAgICAgbm9ybWFsaXplZEdyYXBocy5zZXQobm9ybWFsaXplZCwgZ3JhcGhFbnRyaWVzKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtmaWxlUGF0aCwgZW50cmllc10gb2YgT2JqZWN0LmVudHJpZXMod29ya2Zsb3dzKSkge1xuICAgICAgcmVzdWx0W2ZpbGVQYXRoXSA9IHt9O1xuICAgICAgLy8gTm9ybWFsaXplIHRoZSBtYW5pZmVzdCBmaWxlIHBhdGggZm9yIGxvb2t1cFxuICAgICAgY29uc3Qgbm9ybWFsaXplZEZpbGVQYXRoID0gZmlsZVBhdGhcbiAgICAgICAgLnJlcGxhY2UoL15cXC5cXC8vLCAnJylcbiAgICAgICAgLnJlcGxhY2UoL1xcLlteLy5dKyQvLCAnJyk7XG5cbiAgICAgIGNvbnN0IGdyYXBoRW50cmllcyA9XG4gICAgICAgIGdyYXBoc1tmaWxlUGF0aF0gfHwgbm9ybWFsaXplZEdyYXBocy5nZXQobm9ybWFsaXplZEZpbGVQYXRoKTtcblxuICAgICAgZm9yIChjb25zdCBbbmFtZSwgZGF0YV0gb2YgT2JqZWN0LmVudHJpZXMoZW50cmllcykpIHtcbiAgICAgICAgcmVzdWx0W2ZpbGVQYXRoXVtuYW1lXSA9IHtcbiAgICAgICAgICB3b3JrZmxvd0lkOiBkYXRhLndvcmtmbG93SWQsXG4gICAgICAgICAgZ3JhcGg6IGdyYXBoRW50cmllcz8uW25hbWVdPy5ncmFwaCB8fCB7IG5vZGVzOiBbXSwgZWRnZXM6IFtdIH0sXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRDbGFzc2VzTWFuaWZlc3QoXG4gICAgY2xhc3NlczogV29ya2Zsb3dNYW5pZmVzdFsnY2xhc3NlcyddXG4gICk6IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHsgY2xhc3NJZDogc3RyaW5nIH0+PiB7XG4gICAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB7IGNsYXNzSWQ6IHN0cmluZyB9Pj4gPSB7fTtcbiAgICBpZiAoIWNsYXNzZXMpIHJldHVybiByZXN1bHQ7XG5cbiAgICBmb3IgKGNvbnN0IFtmaWxlUGF0aCwgZW50cmllc10gb2YgT2JqZWN0LmVudHJpZXMoY2xhc3NlcykpIHtcbiAgICAgIHJlc3VsdFtmaWxlUGF0aF0gPSB7fTtcbiAgICAgIGZvciAoY29uc3QgW25hbWUsIGRhdGFdIG9mIE9iamVjdC5lbnRyaWVzKGVudHJpZXMpKSB7XG4gICAgICAgIHJlc3VsdFtmaWxlUGF0aF1bbmFtZV0gPSB7IGNsYXNzSWQ6IGRhdGEuY2xhc3NJZCB9O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG4iXX0=
|
|
1417
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1idWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2Jhc2UtYnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3pDLE9BQU8sRUFDTCxLQUFLLEVBQ0wsUUFBUSxFQUNSLFFBQVEsRUFDUixNQUFNLEVBQ04sRUFBRSxFQUNGLFNBQVMsR0FDVixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDNUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDdkUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUN0QyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDcEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxlQUFlLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM3RCxPQUFPLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDMUIsT0FBTyx1QkFBdUIsTUFBTSxrQkFBa0IsQ0FBQztBQUN2RCxPQUFPLEtBQUssT0FBTyxNQUFNLFNBQVMsQ0FBQztBQUNuQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ2pDLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDbEMsT0FBTyxFQUNMLGlCQUFpQixHQUVsQixNQUFNLDBCQUEwQixDQUFDO0FBQ2xDLE9BQU8sRUFBRSxtQ0FBbUMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3JFLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ2xFLE9BQU8sRUFDTCxtQkFBbUIsR0FFcEIsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQ0wsYUFBYSxFQUNiLHNCQUFzQixFQUN0QixtQkFBbUIsR0FDcEIsTUFBTSx1QkFBdUIsQ0FBQztBQUMvQixPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUM5RSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUMvRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDMUQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFOUQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFakUsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDLHVCQUF1QixDQUFDLENBQUM7QUFDM0QsTUFBTSxPQUFPLEdBQUcsYUFBYSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUF3Qi9DOzs7R0FHRztBQUNILE1BQU0sa0JBQW1CLFNBQVEsS0FBSztJQUMzQixJQUFJLENBQVU7SUFFdkIsWUFBWSxPQUFlLEVBQUUsT0FBbUM7UUFDOUQsTUFBTSxJQUFJLEdBQUcsT0FBTyxFQUFFLElBQUk7WUFDeEIsQ0FBQyxDQUFDLEdBQUcsT0FBTyxhQUFhLE9BQU8sQ0FBQyxJQUFJLEVBQUU7WUFDdkMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztRQUNaLEtBQUssQ0FBQyxJQUFJLEVBQUUsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDdkMsSUFBSSxDQUFDLElBQUksR0FBRyxvQkFBb0IsQ0FBQztRQUNqQyxJQUFJLENBQUMsSUFBSSxHQUFHLE9BQU8sRUFBRSxJQUFJLENBQUM7SUFDNUIsQ0FBQztDQUNGO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLDZCQUE2QixHQUNqQyxPQUFPLENBQUMsR0FBRyxDQUFDLHNDQUFzQyxLQUFLLEdBQUcsQ0FBQztBQUU3RCxTQUFTLG1CQUFtQixDQUFDLFVBQWtCO0lBQzdDLElBQUksVUFBVSxHQUFHLElBQUksRUFBRSxDQUFDO1FBQ3RCLE9BQU8sR0FBRyxVQUFVLElBQUksQ0FBQztJQUMzQixDQUFDO0lBRUQsT0FBTyxHQUFHLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO0FBQzlDLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxLQUFLLFVBQVUsYUFBYSxDQUFDLE9BQWlCO0lBQzVDLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FDZixJQUFJLEdBQUcsQ0FDTCxDQUNFLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FDZixPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRTtRQUMxQixNQUFNLFFBQVEsR0FBRyxNQUFNLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDOUQsT0FBTyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2hELENBQUMsQ0FBQyxDQUNILENBQ0YsQ0FBQyxJQUFJLEVBQUUsQ0FDVCxDQUNGLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxTQUFTLGlCQUFpQixDQUFDLElBQVksRUFBRSxtQkFBMkI7SUFDbEUsTUFBTSxFQUFFLGVBQWUsRUFBRSxHQUFHLHNCQUFzQixDQUFDLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO0lBQzlFLElBQUksZUFBZSxFQUFFLENBQUM7UUFDcEIsc0VBQXNFO1FBQ3RFLG1DQUFtQztRQUNuQyxPQUFPLG1CQUFtQixDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFDRCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ2xDLENBQUM7QUFPRCxTQUFTLGdCQUFnQixDQUFDLFFBQStCO0lBQ3ZELE9BQU8sR0FBRyxRQUFRLENBQUMsUUFBUSxJQUFJLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUNqRCxDQUFDO0FBRUQsU0FBUyx1QkFBdUIsQ0FDOUIsYUFBaUUsRUFDakUsR0FBdUMsRUFDdkMsS0FBZ0MsRUFDaEMsS0FBMEI7SUFFMUIsS0FBSyxNQUFNLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFDdEUsS0FBSyxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNuRCxNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdkIsTUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUM3QixNQUFNLE9BQU8sR0FBRyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQztZQUNuQyxJQUNFLFFBQVE7Z0JBQ1IsQ0FBQyxRQUFRLENBQUMsUUFBUSxLQUFLLE9BQU8sQ0FBQyxRQUFRO29CQUNyQyxRQUFRLENBQUMsSUFBSSxLQUFLLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFDakMsQ0FBQztnQkFDRCxNQUFNLE1BQU0sR0FBRyxLQUFLLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDO2dCQUNyRSxNQUFNLFlBQVksR0FBRyxHQUFHLEtBQUssV0FBVyxDQUFDO2dCQUN6QyxNQUFNLGdCQUFnQixHQUFHLEtBQUssS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDO2dCQUNoRSxNQUFNLElBQUksa0JBQWtCLENBQzFCLGFBQWEsTUFBTSxLQUFLLEVBQUUsbUJBQW1CLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxRQUFRLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQzNHO29CQUNFLElBQUksRUFDRixHQUFHLGdCQUFnQixzQ0FBc0M7d0JBQ3pELHFEQUFxRCxZQUFZLGFBQWE7d0JBQzlFLDhFQUE4RTt3QkFDOUUsMkVBQTJFO3dCQUMzRSw0Q0FBNEM7aUJBQy9DLENBQ0YsQ0FBQztZQUNKLENBQUM7WUFDRCxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUN2QixDQUFDO0lBQ0gsQ0FBQztBQUNILENBQUM7QUFFRCxTQUFTLHFCQUFxQixDQUM1QixNQUF3QixFQUN4QixRQUEwQixFQUMxQixPQUEyQyxFQUMzQyxXQUErQztJQUUvQyx1QkFBdUIsQ0FDckIsUUFBUSxDQUFDLEtBQUssRUFDZCxPQUFPLEVBQ1AsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQ3JCLE1BQU0sQ0FDUCxDQUFDO0lBQ0YsdUJBQXVCLENBQ3JCLFFBQVEsQ0FBQyxTQUFTLEVBQ2xCLFdBQVcsRUFDWCxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFDekIsVUFBVSxDQUNYLENBQUM7SUFFRixNQUFNLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsSUFBSSxFQUFFLEVBQUUsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzdFLE1BQU0sQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxJQUFJLEVBQUUsRUFBRSxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDakUsTUFBTSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLElBQUksRUFBRSxFQUFFLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUN6RSxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLE9BQWdCLFdBQVc7SUFDckIsTUFBTSxDQUFpQjtJQUVqQzs7O09BR0c7SUFDSyxzQkFBc0IsR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0lBQzNDLHNCQUFzQixDQUFxQjtJQUMzQyx5QkFBeUIsR0FBRyxDQUFDLENBQUM7SUFFdEMsWUFBWSxNQUFzQjtRQUNoQyxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztJQUN2QixDQUFDO0lBRUQsSUFBYyxvQkFBb0I7UUFDaEMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQztJQUMzRCxDQUFDO0lBRUQsSUFBYyxtQkFBbUI7UUFDL0IsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLG1CQUFtQixJQUFJLElBQUksQ0FBQyxvQkFBb0IsQ0FBQztJQUN0RSxDQUFDO0lBRVMsa0JBQWtCLENBQUMsR0FBRyxJQUFlO1FBQzdDLFdBQVcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRU8sdUJBQXVCO1FBQzdCLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDM0MsQ0FBQztJQUVPLHdCQUF3QjtRQUM5QixPQUFPLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxzQkFBc0IsSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBRU8sdUJBQXVCO1FBQzdCLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxTQUFTLENBQUM7SUFDMUMsQ0FBQztJQUVPLDZCQUE2QjtRQUNuQyxPQUFPLElBQUksQ0FBQyx5QkFBeUIsS0FBSyxDQUFDO1lBQ3pDLENBQUMsQ0FBQywwQkFBMEI7WUFDNUIsQ0FBQyxDQUFDLG1CQUFtQixDQUFDO0lBQzFCLENBQUM7SUFFTyw0QkFBNEIsQ0FBQyxHQUFHLElBQWU7UUFDckQsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsaUNBQWlDLEVBQUUsQ0FBQztZQUNuRCxJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztRQUNuQyxDQUFDO0lBQ0gsQ0FBQztJQUVPLDBCQUEwQixDQUFDLEdBQUcsSUFBZTtRQUNuRCxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQywrQkFBK0IsRUFBRSxDQUFDO1lBQ2pELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQ25DLENBQUM7SUFDSCxDQUFDO0lBRU8scUJBQXFCLENBQUMsR0FBRyxJQUFlO1FBQzlDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLDBCQUEwQixFQUFFLENBQUM7WUFDNUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7UUFDbkMsQ0FBQztJQUNILENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSyx3QkFBd0IsQ0FBQyxNQUFjO1FBSTdDLElBQUksTUFBTSxLQUFLLEtBQUs7WUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUM7UUFDeEQsT0FBTztZQUNMLE1BQU0sRUFDSiwwSEFBMEg7Z0JBQzFILGtHQUFrRztnQkFDbEcsK0VBQStFO1lBQ2pGLE1BQU0sRUFBRTtnQkFDTixpQkFBaUIsRUFBRSxtQkFBbUI7Z0JBQ3RDLHFCQUFxQixFQUFFLHVCQUF1QjthQUMvQztTQUNGLENBQUM7SUFDSixDQUFDO0lBUUQ7OztPQUdHO0lBQ08sS0FBSyxDQUFDLGdCQUFnQjtRQUM5QixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsSUFBSSxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDcEQsT0FBTyxNQUFNLENBQUMsQ0FBQyxlQUFlLEVBQUUsZUFBZSxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFFRDs7OztPQUlHO0lBQ08sS0FBSyxDQUFDLGFBQWE7UUFDM0IsTUFBTSxNQUFNLEdBQUc7WUFDYixvQkFBb0I7WUFDcEIsWUFBWTtZQUNaLGFBQWE7WUFDYixjQUFjO1lBQ2QsYUFBYTtZQUNiLGVBQWU7WUFDZixlQUFlO1lBQ2Ysc0JBQXNCO1lBQ3RCLHdCQUF3QjtZQUN4Qiw0QkFBNEI7WUFDNUIsWUFBWTtZQUNaLG1CQUFtQjtZQUNuQixjQUFjO1lBQ2QsY0FBYztZQUNkLGFBQWE7WUFDYixtQkFBbUI7U0FDcEIsQ0FBQztRQUVGLHFFQUFxRTtRQUNyRSxtRUFBbUU7UUFDbkUsc0VBQXNFO1FBQ3RFLGdFQUFnRTtRQUNoRSxNQUFNLE9BQU8sR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQy9CLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQzNCLE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUNqRCxPQUFPLElBQUksQ0FBQyxDQUFDLHNDQUFzQyxDQUFDLEVBQUU7Z0JBQ3BELEdBQUc7Z0JBQ0gsTUFBTTtnQkFDTixRQUFRLEVBQUUsSUFBSTtnQkFDZCxHQUFHLEVBQUUsSUFBSTthQUNWLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUNILENBQUM7UUFFRixPQUFPLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyxpQkFBaUIsR0FDdkIsSUFBSSxPQUFPLEVBQUUsQ0FBQztJQUVULDJCQUEyQjtRQUNoQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztJQUN6QyxDQUFDO0lBRUQ7O09BRUc7SUFDSyxNQUFNLENBQVUsZUFBZSxHQUFHLElBQUksR0FBRyxDQUFDO1FBQ2hELGFBQWE7UUFDYixhQUFhO0tBQ2QsQ0FBQyxDQUFDO0lBRUg7Ozs7O09BS0c7SUFDSyxLQUFLLENBQUMsaUNBQWlDO1FBQzdDLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQztRQUN0RCxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsTUFBTTtZQUFFLE9BQU87UUFFdEMsS0FBSyxNQUFNLEdBQUcsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO1lBQ25DLElBQUksV0FBVyxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO2dCQUFFLFNBQVM7WUFDbkQsSUFBSSxJQUFJLENBQUMsc0JBQXNCLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztnQkFBRSxTQUFTO1lBRW5ELElBQ0UsR0FBRyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUM7Z0JBQ25CLEdBQUcsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDO2dCQUNuQixHQUFHLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQztnQkFDbkIsR0FBRyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7Z0JBQ2pCLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQ2pCLENBQUM7Z0JBQ0QsU0FBUztZQUNYLENBQUM7WUFFRCxJQUFJLENBQUM7Z0JBQ0gsa0VBQWtFO2dCQUNsRSxJQUFJLG1CQUFtQixHQUFHLEtBQUssQ0FBQztnQkFDaEMsSUFBSSxDQUFDO29CQUNILE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxHQUFHLGVBQWUsRUFBRTt3QkFDekQsS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUM7cUJBQ2hDLENBQUMsQ0FBQztvQkFDSCxNQUFNLGFBQWEsR0FBRyxNQUFNLFFBQVEsQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUM7b0JBQzNELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUd2QyxDQUFDO29CQUNGLE1BQU0sWUFBWSxHQUNoQixPQUFPLE9BQU8sQ0FBQyxZQUFZLEtBQUssUUFBUTt3QkFDeEMsT0FBTyxDQUFDLFlBQVksS0FBSyxJQUFJO3dCQUM3QixDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQzt3QkFDbEMsQ0FBQyxDQUFFLE9BQU8sQ0FBQyxZQUF3Qzt3QkFDbkQsQ0FBQyxDQUFDLEVBQUUsQ0FBQztvQkFDVCxNQUFNLGdCQUFnQixHQUNwQixPQUFPLE9BQU8sQ0FBQyxnQkFBZ0IsS0FBSyxRQUFRO3dCQUM1QyxPQUFPLENBQUMsZ0JBQWdCLEtBQUssSUFBSTt3QkFDakMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQzt3QkFDdEMsQ0FBQyxDQUFFLE9BQU8sQ0FBQyxnQkFBNEM7d0JBQ3ZELENBQUMsQ0FBQyxFQUFFLENBQUM7b0JBQ1QsbUJBQW1CO3dCQUNqQixNQUFNLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxpQkFBaUIsQ0FBQzs0QkFDOUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO2dCQUN2RCxDQUFDO2dCQUFDLE1BQU0sQ0FBQztvQkFDUCx5REFBeUQ7Z0JBQzNELENBQUM7Z0JBRUQseUNBQXlDO2dCQUN6QyxzRUFBc0U7Z0JBQ3RFLHNFQUFzRTtnQkFDdEUsbUVBQW1FO2dCQUNuRSxvRUFBb0U7Z0JBQ3BFLGlFQUFpRTtnQkFDakUsSUFBSSxVQUFVLEdBQUcsS0FBSyxDQUFDO2dCQUN2QixJQUFJLGNBQWMsR0FBRyxLQUFLLENBQUM7Z0JBQzNCLElBQUksUUFBUSxHQUFHLG1CQUFtQixDQUFDO2dCQUNuQyxJQUFJLENBQUM7b0JBQ0gsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUU7d0JBQ3JDLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDO3FCQUNoQyxDQUFDLENBQUM7b0JBQ0gsTUFBTSxNQUFNLEdBQUcsTUFBTSxRQUFRLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO29CQUNsRCxNQUFNLFFBQVEsR0FBRyxzQkFBc0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztvQkFDaEQsVUFBVSxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUM7b0JBQ2pDLGNBQWMsR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDO29CQUN6QyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7d0JBQ2QsUUFBUSxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUM7b0JBQy9CLENBQUM7Z0JBQ0gsQ0FBQztnQkFBQyxNQUFNLENBQUM7b0JBQ1AsK0RBQStEO2dCQUNqRSxDQUFDO2dCQUVELElBQUksQ0FBQyxVQUFVLElBQUksQ0FBQyxjQUFjLElBQUksQ0FBQyxRQUFRO29CQUFFLFNBQVM7Z0JBRTFELGlEQUFpRDtnQkFDakQsTUFBTSxNQUFNLEdBQWEsRUFBRSxDQUFDO2dCQUM1QixJQUFJLGNBQWM7b0JBQUUsTUFBTSxDQUFDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO2dCQUM1RCxJQUFJLFVBQVU7b0JBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO2dCQUNwRCxJQUFJLFFBQVE7b0JBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO2dCQUVuRCxJQUFJLENBQUMsc0JBQXNCLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUVyQyxPQUFPLENBQUMsSUFBSSxDQUNWLEtBQUssS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsYUFBYSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsaUJBQWlCLEtBQUssQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxLQUFLLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLDRDQUE0QyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJO29CQUNoTixzQkFBc0IsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsNkVBQTZFO29CQUNwSCxjQUFjLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxTQUFTLEtBQUssQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxLQUFLLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLDZCQUE2QixDQUNwSixDQUFDO1lBQ0osQ0FBQztZQUFDLE1BQU0sQ0FBQztnQkFDUCxrRUFBa0U7WUFDcEUsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRVMsS0FBSyxDQUFDLGVBQWUsQ0FDN0IsTUFBZ0IsRUFDaEIsTUFBYyxFQUNkLFlBQXFCO1FBRXJCLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFMUQsSUFBSSxjQUFjLEVBQUUsQ0FBQztZQUNuQixPQUFPLGNBQWMsQ0FBQztRQUN4QixDQUFDO1FBQ0QsTUFBTSxLQUFLLEdBQXNCO1lBQy9CLGVBQWUsRUFBRSxJQUFJLEdBQUcsRUFBRTtZQUMxQixtQkFBbUIsRUFBRSxJQUFJLEdBQUcsRUFBRTtZQUM5QixvQkFBb0IsRUFBRSxJQUFJLEdBQUcsRUFBRTtTQUNoQyxDQUFDO1FBRUYsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBRWpDLHVFQUF1RTtRQUN2RSw0RUFBNEU7UUFDNUUsdUVBQXVFO1FBQ3ZFLHNFQUFzRTtRQUN0RSxzRUFBc0U7UUFDdEUsc0VBQXNFO1FBQ3RFLHdEQUF3RDtRQUN4RCxNQUFNLHVCQUF1QixHQUFHLE1BQU0sZUFBZSxDQUNuRCxNQUFNLEVBQ04sNEJBQTRCLENBQzdCLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3pCLE1BQU0sV0FBVyxHQUFHLHVCQUF1QjtZQUN6QyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sRUFBRSx1QkFBdUIsQ0FBQztZQUN0QyxDQUFDLENBQUMsTUFBTSxDQUFDO1FBRVgsTUFBTSxxQkFBcUIsR0FDekIsWUFBWSxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO1FBRWxELE1BQU0sbUJBQW1CLENBQUM7WUFDeEIsV0FBVztZQUNYLEtBQUs7WUFDTCxtQkFBbUIsRUFBRSxxQkFBcUI7WUFDMUMsVUFBVSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVTtTQUNuQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsa0JBQWtCLENBQ3JCLGlDQUFpQyxFQUNqQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxhQUFhLElBQUksQ0FDbEMsQ0FBQztRQUVGLDBEQUEwRDtRQUMxRCxNQUFNLElBQUksQ0FBQyxpQ0FBaUMsRUFBRSxDQUFDO1FBRS9DLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzFDLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ssS0FBSyxDQUFDLGtCQUFrQixDQUM5QixVQUFrQixFQUNsQixPQUFlO1FBRWYsTUFBTSxRQUFRLEdBQUcsR0FBRyxVQUFVLElBQUksVUFBVSxFQUFFLE1BQU0sQ0FBQztRQUNyRCxNQUFNLFNBQVMsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDbkMsSUFBSSxDQUFDO1lBQ0gsTUFBTSxNQUFNLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ3JDLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsTUFBTSxTQUFTLEdBQ2IsS0FBSyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxNQUFNLElBQUksS0FBSztnQkFDbkQsQ0FBQyxDQUFFLEtBQStCLENBQUMsSUFBSTtnQkFDdkMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUNoQixJQUNFLE9BQU8sQ0FBQyxRQUFRLEtBQUssT0FBTztnQkFDNUIsQ0FBQyxTQUFTLEtBQUssT0FBTyxJQUFJLFNBQVMsS0FBSyxRQUFRLENBQUMsRUFDakQsQ0FBQztnQkFDRCxNQUFNLFNBQVMsQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQ3JDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO2dCQUNwQyxPQUFPO1lBQ1QsQ0FBQztZQUNELE1BQU0sS0FBSyxDQUFDO1FBQ2QsQ0FBQztJQUNILENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssS0FBSyxDQUFDLGNBQWMsQ0FDMUIsT0FBZSxFQUNmLFNBQWlCLEVBQ2pCLEtBQWU7UUFFZixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsSUFBSSxFQUFFLENBQUM7UUFDakQsTUFBTSxVQUFVLEdBQUcsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksTUFBTSxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDO1FBQ2xGLElBQUksUUFBUSxHQUFHLEVBQUUsQ0FBQztRQUVsQixJQUFJLENBQUM7WUFDSCxJQUFJLEtBQUssRUFBRSxDQUFDO2dCQUNWLElBQUksQ0FBQztvQkFDSCxNQUFNLE9BQU8sR0FBRyxNQUFNLFFBQVEsQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUM7b0JBQ25ELFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUNqQyxDQUFDO2dCQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7b0JBQ1gsd0RBQXdEO29CQUN4RCwrRUFBK0U7b0JBQy9FLElBQUssQ0FBMkIsQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7d0JBQ25ELE9BQU8sQ0FBQyxJQUFJLENBQUMsMkNBQTJDLEVBQUUsQ0FBQyxDQUFDLENBQUM7b0JBQy9ELENBQUM7Z0JBQ0gsQ0FBQztZQUNILENBQUM7WUFFRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUMvQjtnQkFDRSxHQUFHLFFBQVE7Z0JBQ1gsR0FBRyxTQUFTO2FBQ2IsRUFDRCxJQUFJLEVBQ0osQ0FBQyxDQUNGLENBQUM7WUFFRixNQUFNLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDeEQsQ0FBQztRQUFDLE9BQU8sS0FBYyxFQUFFLENBQUM7WUFDeEIsT0FBTyxDQUFDLElBQUksQ0FBQyw2QkFBNkIsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNyRCxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNLLGtCQUFrQixDQUN4QixNQUE0QyxFQUM1QyxLQUFhLEVBQ2IsWUFBWSxHQUFHLElBQUksRUFDbkIsT0FFQztRQUVELElBQUksTUFBTSxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUM5QyxPQUFPLENBQUMsS0FBSyxDQUFDLHVCQUF1QixLQUFLLEdBQUcsQ0FBQyxDQUFDO1lBQy9DLE1BQU0sYUFBYSxHQUFhLEVBQUUsQ0FBQztZQUNuQyxLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDbEMsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO2dCQUNqQyxhQUFhLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDL0IsSUFBSSxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7b0JBQ25CLE1BQU0sUUFBUSxHQUFHLFVBQVUsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztvQkFDakcsT0FBTyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztvQkFDeEIsYUFBYSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDL0IsQ0FBQztZQUNILENBQUM7WUFFRCxJQUFJLFlBQVksRUFBRSxDQUFDO2dCQUNqQixNQUFNLElBQUksS0FBSyxDQUNiLHVCQUF1QixLQUFLLE1BQU0sYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUM3RCxDQUFDO1lBQ0osQ0FBQztRQUNILENBQUM7UUFFRCxJQUNFLENBQUMsT0FBTyxFQUFFLGdCQUFnQjtZQUMxQixNQUFNLENBQUMsUUFBUTtZQUNmLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFDMUIsQ0FBQztZQUNELE9BQU8sQ0FBQyxJQUFJLENBQUMsMEJBQTBCLEtBQUssR0FBRyxDQUFDLENBQUM7WUFDakQsS0FBSyxNQUFNLE9BQU8sSUFBSSxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ3RDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztnQkFDbEMsSUFBSSxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUM7b0JBQ3JCLE9BQU8sQ0FBQyxJQUFJLENBQ1YsVUFBVSxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUN0RixDQUFDO2dCQUNKLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNLLG1CQUFtQixDQUFDLFlBQW9CO1FBQzlDLE1BQU0sY0FBYyxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3hELE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN4RSxJQUFJLFlBQVksR0FBRyxRQUFRLENBQUMsb0JBQW9CLEVBQUUsY0FBYyxDQUFDLENBQUMsT0FBTyxDQUN2RSxLQUFLLEVBQ0wsR0FBRyxDQUNKLENBQUM7UUFDRix3REFBd0Q7UUFDeEQsSUFBSSxZQUFZLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDbkMsWUFBWSxHQUFHLFlBQVk7aUJBQ3hCLEtBQUssQ0FBQyxHQUFHLENBQUM7aUJBQ1YsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDO2lCQUMvQixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDZixDQUFDO1FBQ0QsT0FBTyxZQUFZLENBQUM7SUFDdEIsQ0FBQztJQUVTLDBCQUEwQixDQUFDLElBQVksRUFBRSxRQUFnQjtRQUNqRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxHQUFHLGFBQWEsQ0FDN0MsSUFBSSxFQUNKLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUN2QixDQUFDO1FBQ0YsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUNkLE9BQU8sVUFBVSxDQUFDO1FBQ3BCLENBQUM7UUFFRCxJQUFJLFlBQVksR0FBRyxRQUFRLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDaEUsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDdEUsWUFBWSxHQUFHLEtBQUssWUFBWSxFQUFFLENBQUM7UUFDckMsQ0FBQztRQUNELE9BQU8sWUFBWSxDQUFDO0lBQ3RCLENBQUM7SUFFTyxLQUFLLENBQUMsZ0NBQWdDLENBQUMsRUFDN0MsVUFBVSxFQUNWLE9BQU8sRUFDUCxZQUFZLEVBQ1osaUJBQWlCLEdBTWxCO1FBQ0MsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDcEMsTUFBTSxnQkFBZ0IsR0FBcUIsRUFBRSxDQUFDO1FBQzlDLE1BQU0sWUFBWSxHQUFHLDRCQUE0QixDQUFDO1FBQ2xELE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxNQUFNLGVBQWUsQ0FDakQsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUNoQixZQUFZLENBQ2IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUNkLE1BQU0sSUFBSSxrQkFBa0IsQ0FDMUIsMkRBQTJELE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUN4RTtnQkFDRSxJQUFJLEVBQUUsb0RBQW9EO2dCQUMxRCxLQUFLLEVBQUUsR0FBRzthQUNYLENBQ0YsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFXLENBQUM7UUFFZCxNQUFNLFVBQVUsR0FDZCxpQkFBaUI7WUFDakIsQ0FBQyxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDO1FBQzNFLE1BQU0sU0FBUyxHQUFHLENBQUMsR0FBRyxVQUFVLENBQUMsZUFBZSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDekQsTUFBTSxhQUFhLEdBQUcsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2pFLE1BQU0sVUFBVSxHQUFHLENBQUMsR0FBRyxVQUFVLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUMvRCxNQUFNLFlBQVksR0FBRyxJQUFJLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN4QyxNQUFNLGNBQWMsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUV0RSxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFO1lBQ2pDLFNBQVM7WUFDVCxhQUFhO1lBQ2IsY0FBYztZQUNkLGFBQWEsRUFBRSxJQUFJO1NBQ3BCLENBQUMsQ0FBQztRQUVILE1BQU0sdUJBQXVCLEdBQUcsSUFBSSxHQUFHLENBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO1FBQ2hFLE1BQU0sZ0JBQWdCLEdBQWEsRUFBRSxDQUFDO1FBQ3RDLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNsQyxNQUFNLHFCQUFxQixHQUFHLENBQUMsU0FBaUIsRUFBUSxFQUFFO1lBQ3hELGdCQUFnQixDQUFDLElBQUksQ0FBQyxVQUFVLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2hFLENBQUMsQ0FBQztRQUNGLE1BQU0seUJBQXlCLEdBQUcsQ0FBQyxJQUFZLEVBQVEsRUFBRTtZQUN2RCxNQUFNLFFBQVEsR0FBRyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7WUFDbkUsSUFBSSx1QkFBdUIsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztnQkFDMUMsT0FBTztZQUNULENBQUM7WUFDRCx1QkFBdUIsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDdEMscUJBQXFCLENBQUMsSUFBSSxDQUFDLDBCQUEwQixDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQ3pFLENBQUMsQ0FBQztRQUVGLHFCQUFxQixDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3BDLEtBQUssTUFBTSxJQUFJLElBQUksU0FBUyxFQUFFLENBQUM7WUFDN0IseUJBQXlCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbEMsQ0FBQztRQUNELEtBQUssTUFBTSxJQUFJLElBQUksY0FBYyxFQUFFLENBQUM7WUFDbEMseUJBQXlCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbEMsQ0FBQztRQUVELE1BQU0sTUFBTSxHQUFHOztFQUVqQixnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDOzs7Q0FHNUIsQ0FBQztRQUNFLE1BQU0sS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ25ELE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztRQUUvQyxNQUFNLGFBQWEsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUM5QixJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsU0FBUyxFQUFFLEdBQUcsY0FBYyxFQUFFLG9CQUFvQixDQUFDLENBQUMsQ0FDakUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNULE1BQU0sT0FBTyxHQUFHLElBQUksR0FBRyxFQUFpQyxDQUFDO1FBQ3pELE1BQU0sV0FBVyxHQUFHLElBQUksR0FBRyxFQUFpQyxDQUFDO1FBQzdELE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FDZixhQUFhLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsRUFBRTtZQUMvQixNQUFNLE1BQU0sR0FBRyxNQUFNLFFBQVEsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDNUMsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDeEQsTUFBTSxFQUFFLGdCQUFnQixFQUFFLFlBQVksRUFBRSxHQUFHLE1BQU0saUJBQWlCLENBQ2hFLGdCQUFnQixFQUNoQixNQUFNLEVBQ04sTUFBTSxFQUNOLElBQUksRUFDSixJQUFJLENBQUMsb0JBQW9CLEVBQ3pCLElBQUksQ0FBQyxtQkFBbUIsQ0FDekIsQ0FBQztZQUNGLHFCQUFxQixDQUNuQixnQkFBZ0IsRUFDaEIsWUFBWSxFQUNaLE9BQU8sRUFDUCxXQUFXLENBQ1osQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUNILENBQUM7UUFFRixNQUFNLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQzlCLElBQUksQ0FBQyxrQkFBa0IsQ0FDckIsNEJBQTRCLEVBQzVCLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLGdCQUFnQixJQUFJLENBQ3JDLENBQUM7UUFDRixPQUFPLGdCQUFnQixDQUFDO0lBQzFCLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNPLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxFQUNoQyxVQUFVLEVBQ1YsTUFBTSxHQUFHLEtBQUssRUFDZCxPQUFPLEVBQ1AsbUJBQW1CLEVBQ25CLHFDQUFxQyxFQUNyQyw2QkFBNkIsRUFDN0IsbUJBQW1CLEVBQ25CLFlBQVksRUFDWixpQkFBaUIsR0FXbEI7UUFJQyxvREFBb0Q7UUFDcEQsMkNBQTJDO1FBQzNDLE1BQU0sVUFBVSxHQUNkLGlCQUFpQjtZQUNqQixDQUFDLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUM7UUFDM0UsTUFBTSxTQUFTLEdBQUcsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxlQUFlLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN6RCxNQUFNLGFBQWEsR0FBRyxDQUFDLEdBQUcsVUFBVSxDQUFDLG1CQUFtQixDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDakUsTUFBTSxVQUFVLEdBQUcsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1FBRS9ELDJGQUEyRjtRQUMzRiwrRUFBK0U7UUFDL0Usc0ZBQXNGO1FBQ3RGLE1BQU0sWUFBWSxHQUFHLElBQUksR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3hDLE1BQU0sY0FBYyxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXRFLElBQ0UsNkJBQTZCO1lBQzdCLG1CQUFtQjtZQUNuQixDQUFDLHFDQUFxQyxFQUN0QyxDQUFDO1lBQ0QsT0FBTztnQkFDTCxPQUFPLEVBQUUsU0FBUztnQkFDbEIsUUFBUSxFQUFFLE1BQU0sSUFBSSxDQUFDLGdDQUFnQyxDQUFDO29CQUNwRCxVQUFVO29CQUNWLE9BQU87b0JBQ1AsWUFBWTtvQkFDWixpQkFBaUIsRUFBRSxVQUFVO2lCQUM5QixDQUFDO2FBQ0gsQ0FBQztRQUNKLENBQUM7UUFFRCxtQ0FBbUM7UUFDbkMsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRTtZQUNqQyxTQUFTO1lBQ1QsYUFBYTtZQUNiLGNBQWM7U0FDZixDQUFDLENBQUM7UUFFSCxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNwQyxNQUFNLGdCQUFnQixHQUFxQixFQUFFLENBQUM7UUFDOUMsTUFBTSxZQUFZLEdBQUcsNEJBQTRCLENBQUM7UUFFbEQsTUFBTSxvQkFBb0IsR0FBRyxNQUFNLGVBQWUsQ0FDaEQsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUNoQiw0QkFBNEIsQ0FDN0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUNkLE1BQU0sSUFBSSxLQUFLLENBQ2I7Z0JBQ0UsS0FBSyxDQUFDLEdBQUcsQ0FBQywyQ0FBMkMsQ0FBQztnQkFDdEQsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQywyQkFBMkI7Z0JBQzNHLEVBQUU7Z0JBQ0YsY0FBYyxLQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFO2FBQ3ZDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUNiLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztRQUVILG1EQUFtRDtRQUNuRCx3RUFBd0U7UUFDeEUsNEVBQTRFO1FBQzVFLE1BQU0sWUFBWSxHQUFHLENBQUMsSUFBWSxFQUFFLEVBQUU7WUFDcEMsTUFBTSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsR0FBRyxhQUFhLENBQzdDLElBQUksRUFDSixJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FDdkIsQ0FBQztZQUVGLElBQUksU0FBUyxFQUFFLENBQUM7Z0JBQ2QsbUVBQW1FO2dCQUNuRSxPQUFPLFdBQVcsVUFBVSxJQUFJLENBQUM7WUFDbkMsQ0FBQztZQUVELHFDQUFxQztZQUNyQyxvRUFBb0U7WUFDcEUsc0dBQXNHO1lBQ3RHLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztZQUN4RSxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztZQUNoRCw2REFBNkQ7WUFDN0QsSUFBSSxZQUFZLEdBQUcsUUFBUSxDQUFDLG9CQUFvQixFQUFFLGNBQWMsQ0FBQyxDQUFDLE9BQU8sQ0FDdkUsS0FBSyxFQUNMLEdBQUcsQ0FDSixDQUFDO1lBQ0YsMEVBQTBFO1lBQzFFLHNFQUFzRTtZQUN0RSwwQkFBMEI7WUFDMUIsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ3RFLFlBQVksR0FBRyxLQUFLLFlBQVksRUFBRSxDQUFDO1lBQ3JDLENBQUM7WUFDRCxPQUFPLFdBQVcsWUFBWSxJQUFJLENBQUM7UUFDckMsQ0FBQyxDQUFDO1FBRUYsc0VBQXNFO1FBQ3RFLG1EQUFtRDtRQUNuRCxNQUFNLFdBQVcsR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUUzRCwrREFBK0Q7UUFDL0QsTUFBTSxZQUFZLEdBQUcsY0FBYyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFakUsTUFBTSxZQUFZLEdBQUc7O2NBRVgsWUFBWTs7TUFFcEIsV0FBVzs7TUFFWCxZQUFZOzt1RkFFcUUsQ0FBQztRQUVwRixnREFBZ0Q7UUFDaEQsTUFBTSxlQUFlLEdBQUcsbUJBQW1CO1lBQ3pDLENBQUMsQ0FBQztnQkFDRSxHQUFHLFNBQVM7Z0JBQ1osR0FBRyxVQUFVO2dCQUNiLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7YUFDeEQ7WUFDSCxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQ2QsTUFBTSx5QkFBeUIsR0FBRyxlQUFlO1lBQy9DLENBQUMsQ0FBQyxNQUFNLGFBQWEsQ0FBQyxlQUFlLENBQUM7WUFDdEMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUNkLE1BQU0sMkJBQTJCLEdBQUcsTUFBTSxhQUFhLENBQUM7WUFDdEQsR0FBRyxTQUFTO1lBQ1osR0FBRyxjQUFjO1lBQ2pCLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7U0FDeEQsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxzQkFBc0IsR0FDMUIsTUFBTSx5QkFBeUIsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNoRCxNQUFNLEVBQUUsTUFBTSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxnQkFBZ0IsRUFBRSxHQUMxRCxJQUFJLENBQUMsd0JBQXdCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFeEMsTUFBTSxVQUFVLEdBQUcsTUFBTSxPQUFPLENBQUMsT0FBTyxDQUFDO1lBQ3ZDLE1BQU0sRUFBRTtnQkFDTixFQUFFLEVBQUUsbUVBQW1FLGdCQUFnQixFQUFFO2FBQzFGO1lBQ0QsS0FBSyxFQUFFO2dCQUNMLFFBQVEsRUFBRSxZQUFZO2dCQUN0QixVQUFVLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVO2dCQUNsQyxVQUFVLEVBQUUsa0JBQWtCO2dCQUM5QixNQUFNLEVBQUUsSUFBSTthQUNiO1lBQ0QsT0FBTztZQUNQLGFBQWEsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVU7WUFDckMsTUFBTSxFQUFFLElBQUk7WUFDWixNQUFNO1lBQ04sUUFBUSxFQUFFLE1BQU07WUFDaEIsVUFBVSxFQUFFLENBQUMsTUFBTSxDQUFDO1lBQ3BCLE1BQU0sRUFBRSxRQUFRO1lBQ2hCLEtBQUssRUFBRSxJQUFJO1lBQ1gsV0FBVyxFQUFFLElBQUk7WUFDakIsU0FBUyxFQUFFLElBQUk7WUFDZixNQUFNLEVBQUUsS0FBSztZQUNiLEdBQUcsRUFBRSxVQUFVO1lBQ2YsUUFBUSxFQUFFLE9BQU87WUFDakIsMENBQTBDO1lBQzFDLGdGQUFnRjtZQUNoRixHQUFHLHNCQUFzQjtZQUN6QixNQUFNLEVBQUUsZ0JBQWdCO1lBQ3hCLGlCQUFpQixFQUFFO2dCQUNqQixLQUFLO2dCQUNMLE1BQU07Z0JBQ04sTUFBTTtnQkFDTixNQUFNO2dCQUNOLEtBQUs7Z0JBQ0wsTUFBTTtnQkFDTixNQUFNO2dCQUNOLE1BQU07YUFDUDtZQUNELGdFQUFnRTtZQUNoRSx1RUFBdUU7WUFDdkUsOEVBQThFO1lBQzlFLCtEQUErRDtZQUMvRCxTQUFTLEVBQUUsUUFBUTtZQUNuQixPQUFPLEVBQUU7Z0JBQ1AsMkVBQTJFO2dCQUMzRSw0RUFBNEU7Z0JBQzVFLHlCQUF5QixFQUFFO2dCQUMzQixlQUFlLENBQUM7b0JBQ2QsSUFBSSxFQUFFLE1BQU07b0JBQ1osZUFBZSxFQUFFLHlCQUF5QjtvQkFDMUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTO29CQUM5QyxXQUFXLEVBQUUsSUFBSSxDQUFDLG9CQUFvQjtvQkFDdEMsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLG1CQUFtQjtvQkFDN0MsZ0JBQWdCO29CQUNoQixxQ0FBcUM7b0JBQ3JDLG1CQUFtQjtvQkFDbkIsaUJBQWlCLEVBQUUsMkJBQTJCO2lCQUMvQyxDQUFDO2FBQ0g7WUFDRCxxRUFBcUU7WUFDckUsNERBQTREO1lBQzVELFFBQVEsRUFBRSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLElBQUksRUFBRSxDQUFDLENBQUM7U0FDcEUsQ0FBQyxDQUFDO1FBRUgsTUFBTSxXQUFXLEdBQUcsTUFBTSxVQUFVLENBQUMsT0FBTyxFQUFFLENBQUM7UUFFL0MsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFdBQVcsRUFBRSx1QkFBdUIsQ0FBQyxDQUFDO1FBQzlELElBQUksQ0FBQyxrQkFBa0IsQ0FDckIsc0JBQXNCLEVBQ3RCLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLGdCQUFnQixJQUFJLENBQ3JDLENBQUM7UUFFRiw2RUFBNkU7UUFDN0UsOEVBQThFO1FBQzlFLGlFQUFpRTtRQUNqRSxNQUFNLGlCQUFpQixHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQzVDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQzlCLENBQUM7UUFDRixNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQ2YsaUJBQWlCLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxZQUFZLEVBQUUsRUFBRTtZQUMzQyxJQUFJLENBQUM7Z0JBQ0gsTUFBTSxNQUFNLEdBQUcsTUFBTSxRQUFRLENBQUMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxDQUFDO2dCQUNwRCxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxZQUFZLENBQUMsQ0FBQztnQkFDaEUsTUFBTSxFQUFFLGdCQUFnQixFQUFFLFlBQVksRUFBRSxHQUFHLE1BQU0saUJBQWlCLENBQ2hFLGdCQUFnQixFQUNoQixNQUFNLEVBQ04sVUFBVSxFQUNWLFlBQVksRUFDWixJQUFJLENBQUMsb0JBQW9CLEVBQ3pCLElBQUksQ0FBQyxtQkFBbUIsQ0FDekIsQ0FBQztnQkFDRixJQUFJLFlBQVksQ0FBQyxTQUFTLEVBQUUsQ0FBQztvQkFDM0IsZ0JBQWdCLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQ3hDLGdCQUFnQixDQUFDLFNBQVMsSUFBSSxFQUFFLEVBQ2hDLFlBQVksQ0FBQyxTQUFTLENBQ3ZCLENBQUM7Z0JBQ0osQ0FBQztnQkFDRCxJQUFJLFlBQVksQ0FBQyxPQUFPLEVBQUUsQ0FBQztvQkFDekIsZ0JBQWdCLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQ3RDLGdCQUFnQixDQUFDLE9BQU8sSUFBSSxFQUFFLEVBQzlCLFlBQVksQ0FBQyxPQUFPLENBQ3JCLENBQUM7Z0JBQ0osQ0FBQztZQUNILENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNmLDRFQUE0RTtnQkFDNUUsT0FBTyxDQUFDLElBQUksQ0FDVixxREFBcUQsWUFBWSxHQUFHLEVBQ3BFLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FDdkQsQ0FBQztZQUNKLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FDSCxDQUFDO1FBRUYsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUU5QixJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDdEIsT0FBTyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLGdCQUFnQixFQUFFLENBQUM7UUFDN0QsQ0FBQztRQUNELE1BQU0sVUFBVSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzNCLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxnQkFBZ0IsRUFBRSxDQUFDO0lBQzVELENBQUM7SUFFRDs7Ozs7T0FLRztJQUNPLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxFQUNwQyxVQUFVLEVBQ1YsTUFBTSxHQUFHLEtBQUssRUFDZCxPQUFPLEVBQ1AsaUJBQWlCLEdBQUcsSUFBSSxFQUN4Qix3QkFBd0IsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFDNUMsWUFBWSxFQUNaLGlCQUFpQixHQVNsQjtRQUtDLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1FBRS9CLE1BQU0sVUFBVSxHQUNkLGlCQUFpQjtZQUNqQixDQUFDLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUM7UUFDM0UsTUFBTSxhQUFhLEdBQUcsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2pFLE1BQU0sVUFBVSxHQUFHLENBQUMsR0FBRyxVQUFVLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUUvRCwrRkFBK0Y7UUFDL0YsbUZBQW1GO1FBQ25GLDRFQUE0RTtRQUM1RSxNQUFNLGdCQUFnQixHQUFHLElBQUksR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ2hELE1BQU0sY0FBYyxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFMUUsdUNBQXVDO1FBQ3ZDLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxhQUFhLEVBQUUsY0FBYyxFQUFFLENBQUMsQ0FBQztRQUV0RSxtREFBbUQ7UUFDbkQsc0VBQXNFO1FBQ3RFLHFEQUFxRDtRQUNyRCxNQUFNLFlBQVksR0FBRyxDQUFDLElBQVksRUFBRSxFQUFFO1lBQ3BDLE1BQU0sRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLEdBQUcsYUFBYSxDQUM3QyxJQUFJLEVBQ0osSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQ3ZCLENBQUM7WUFFRixJQUFJLFNBQVMsRUFBRSxDQUFDO2dCQUNkLG1FQUFtRTtnQkFDbkUscUNBQXFDO2dCQUNyQyxPQUFPLFdBQVcsVUFBVSxJQUFJLENBQUM7WUFDbkMsQ0FBQztZQUVELHFDQUFxQztZQUNyQyxvRUFBb0U7WUFDcEUsc0dBQXNHO1lBQ3RHLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztZQUN4RSxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztZQUNoRCw2REFBNkQ7WUFDN0QsSUFBSSxZQUFZLEdBQUcsUUFBUSxDQUFDLG9CQUFvQixFQUFFLGNBQWMsQ0FBQyxDQUFDLE9BQU8sQ0FDdkUsS0FBSyxFQUNMLEdBQUcsQ0FDSixDQUFDO1lBQ0YsMEVBQTBFO1lBQzFFLHNFQUFzRTtZQUN0RSwwQkFBMEI7WUFDMUIsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ3RFLFlBQVksR0FBRyxLQUFLLFlBQVksRUFBRSxDQUFDO1lBQ3JDLENBQUM7WUFDRCxPQUFPLFdBQVcsWUFBWSxJQUFJLENBQUM7UUFDckMsQ0FBQyxDQUFDO1FBRUYseURBQXlEO1FBQ3pELDZGQUE2RjtRQUM3RixzRkFBc0Y7UUFDdEYsTUFBTSxlQUFlLEdBQUcsYUFBYSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFbkUsK0RBQStEO1FBQy9ELE1BQU0sWUFBWSxHQUFHLGNBQWMsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRWpFLE1BQU0sT0FBTyxHQUFHLFlBQVk7WUFDMUIsQ0FBQyxDQUFDLEdBQUcsZUFBZSwwREFBMEQsWUFBWSxFQUFFO1lBQzVGLENBQUMsQ0FBQyxlQUFlLENBQUM7UUFFcEIsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ25DLE1BQU0sZ0JBQWdCLEdBQXFCLEVBQUUsQ0FBQztRQUM5QyxNQUFNLHNCQUFzQixHQUMxQixNQUFNLHlCQUF5QixDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ2hELE1BQU0sbUNBQW1DLEdBQUcsTUFBTSxhQUFhLENBQUM7WUFDOUQsR0FBRyxhQUFhO1lBQ2hCLEdBQUcsY0FBYztTQUNsQixDQUFDLENBQUM7UUFFSCxrRUFBa0U7UUFDbEUsOENBQThDO1FBQzlDLE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxPQUFPLENBQUMsT0FBTyxDQUFDO1lBQzdDLEtBQUssRUFBRTtnQkFDTCxRQUFRLEVBQUUsT0FBTztnQkFDakIsVUFBVSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVTtnQkFDbEMsVUFBVSxFQUFFLGtCQUFrQjtnQkFDOUIsTUFBTSxFQUFFLElBQUk7YUFDYjtZQUNELE1BQU0sRUFBRSxJQUFJO1lBQ1osYUFBYSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVTtZQUNyQyxNQUFNLEVBQUUsS0FBSyxFQUFFLHVDQUF1QztZQUN0RCxRQUFRLEVBQUUsU0FBUyxFQUFFLDJDQUEyQztZQUNoRSxVQUFVLEVBQUUsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLEVBQUUsK0JBQStCO1lBQy9ELFVBQVUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxFQUFFLHlEQUF5RDtZQUNuRixNQUFNLEVBQUUsUUFBUTtZQUNoQixLQUFLLEVBQUUsS0FBSztZQUNaLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsTUFBTSxFQUFFLEtBQUs7WUFDYixpRUFBaUU7WUFDakUsNEVBQTRFO1lBQzVFLHFFQUFxRTtZQUNyRSxNQUFNLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLDZDQUE2QzthQUNsRDtZQUNELHVFQUF1RTtZQUN2RSw4RUFBOEU7WUFDOUUsMEZBQTBGO1lBQzFGLFNBQVMsRUFBRSxRQUFRO1lBQ25CLDBDQUEwQztZQUMxQyxnRkFBZ0Y7WUFDaEYsR0FBRyxzQkFBc0I7WUFDekIsaUJBQWlCLEVBQUU7Z0JBQ2pCLEtBQUs7Z0JBQ0wsTUFBTTtnQkFDTixNQUFNO2dCQUNOLE1BQU07Z0JBQ04sS0FBSztnQkFDTCxNQUFNO2dCQUNOLE1BQU07Z0JBQ04sTUFBTTthQUNQO1lBQ0QsT0FBTyxFQUFFO2dCQUNQLDJFQUEyRTtnQkFDM0UsNEVBQTRFO2dCQUM1RSx5QkFBeUIsRUFBRTtnQkFDM0IsZUFBZSxDQUFDO29CQUNkLElBQUksRUFBRSxVQUFVO29CQUNoQixXQUFXLEVBQUUsSUFBSSxDQUFDLG9CQUFvQjtvQkFDdEMsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLG1CQUFtQjtvQkFDN0MsZ0JBQWdCO29CQUNoQixpQkFBaUIsRUFBRSxtQ0FBbUM7aUJBQ3ZELENBQUM7Z0JBQ0YsNEVBQTRFO2dCQUM1RSxvRkFBb0Y7Z0JBQ3BGLDJCQUEyQixFQUFFO2FBQzlCO1lBQ0QsbUZBQW1GO1lBQ25GLDJGQUEyRjtZQUMzRix1RkFBdUY7WUFDdkYscUZBQXFGO1lBQ3JGLDJDQUEyQztZQUMzQyw2Q0FBNkM7WUFDN0MscUZBQXFGO1lBQ3JGLGlGQUFpRjtTQUNsRixDQUFDLENBQUM7UUFDSCxJQUFJLDZCQUE2QixHQUFHLENBQUMsd0JBQXdCLENBQUM7UUFDOUQsSUFBSSxDQUFDO1lBQ0gsTUFBTSxhQUFhLEdBQUcsTUFBTSxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUV2RCxJQUFJLENBQUMsa0JBQWtCLENBQ3JCLGFBQWEsRUFDYiw4QkFBOEIsRUFDOUIsSUFBSSxFQUNKO2dCQUNFLGdCQUFnQixFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMscUNBQXFDO2FBQ3BFLENBQ0YsQ0FBQztZQUNGLElBQUksQ0FBQyw0QkFBNEIsQ0FDL0Isc0NBQXNDLEVBQ3RDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLGVBQWUsSUFBSSxDQUNwQyxDQUFDO1lBRUYsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLG9CQUFvQixFQUFFLENBQUM7Z0JBQ3JDLE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FDMUIsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUNiLElBQUksQ0FBQyxNQUFNLENBQUMsb0JBQW9CLENBQ2pDLENBQUM7Z0JBQ0YsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDO2dCQUVoQixJQUFJLFlBQVksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztvQkFDbEMsTUFBTSxHQUFHLG1CQUFtQixDQUFDO2dCQUMvQixDQUFDO3FCQUFNLElBQ0wsWUFBWSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7b0JBQzVCLFlBQVksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQzdCLENBQUM7b0JBQ0QsTUFBTSxHQUFHLGlCQUFpQixDQUFDO2dCQUM3QixDQUFDO2dCQUVELE1BQU0sS0FBSyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO2dCQUN4RCxNQUFNLFNBQVMsQ0FDYixZQUFZLEVBQ1osTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUNuRCxDQUFDO1lBQ0osQ0FBQztZQUVELE1BQU0sSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFFOUIsSUFDRSxDQUFDLGFBQWEsQ0FBQyxXQUFXO2dCQUMxQixhQUFhLENBQUMsV0FBVyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQ3RDLENBQUM7Z0JBQ0QsTUFBTSxJQUFJLEtBQUssQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFDO1lBQzVELENBQUM7WUFFRCwwRUFBMEU7WUFDMUUsaUZBQWlGO1lBQ2pGLElBQ0UsZ0JBQWdCLENBQUMsT0FBTztnQkFDeEIsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUNoRCxDQUFDO2dCQUNELE1BQU0sRUFBRSxzQkFBc0IsRUFBRSxHQUFHLE1BQU0sTUFBTSxDQUFDLG9CQUFvQixDQUFDLENBQUM7Z0JBQ3RFLE1BQU0sVUFBVSxHQUFHLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO2dCQUNyRCxNQUFNLFdBQVcsR0FBRyxzQkFBc0IsQ0FBQztvQkFDekMsVUFBVSxFQUFFLEVBQUU7b0JBQ2QsWUFBWSxFQUFFLFVBQVU7b0JBQ3hCLFFBQVEsRUFBRSxnQkFBZ0I7aUJBQzNCLENBQUMsQ0FBQztnQkFDSCwwREFBMEQ7Z0JBQzFELE1BQU0sZUFBZSxHQUFHLElBQUksR0FBRyxFQUF1QixDQUFDO2dCQUN2RCxLQUFLLE1BQU0sR0FBRyxJQUFJLFdBQVcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztvQkFDdEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsQ0FBQzt3QkFDbkIsS0FBSyxNQUFNLEtBQUssSUFBSSxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUM7NEJBQy9CLElBQUksZUFBZSxHQUFHLGVBQWUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7NEJBQ2pELElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztnQ0FDckIsZUFBZSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7Z0NBQ3BDLGVBQWUsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLGVBQWUsQ0FBQyxDQUFDOzRCQUM5QyxDQUFDOzRCQUNELGVBQWUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO3dCQUNyQyxDQUFDO29CQUNILENBQUM7Z0JBQ0gsQ0FBQztnQkFDRCxLQUFLLE1BQU0sQ0FBQyxLQUFLLEVBQUUsZUFBZSxDQUFDLElBQUksZUFBZSxFQUFFLENBQUM7b0JBQ3ZELE1BQU0sVUFBVSxHQUFHLENBQUMsR0FBRyxlQUFlLENBQUMsQ0FBQztvQkFDeEMsTUFBTSxVQUFVLEdBQ2QsVUFBVSxDQUFDLE1BQU0sS0FBSyxDQUFDO3dCQUNyQixDQUFDLENBQUMsVUFBVSxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUc7d0JBQzVCLENBQUMsQ0FBQyxXQUFXLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztvQkFDcEUsT0FBTyxDQUFDLElBQUksQ0FDVixLQUFLLENBQUMsTUFBTSxDQUFDLHVCQUF1QixVQUFVLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FDNUQsQ0FBQztnQkFDSixDQUFDO1lBQ0gsQ0FBQztZQUVELE1BQU0sNkJBQTZCLEdBQ2pDLG1DQUFtQyxFQUFFLENBQUM7WUFFeEMsTUFBTSxXQUFXLEdBQUcsS0FBSyxFQUFFLGFBQXFCLEVBQUUsRUFBRTtnQkFDbEQsTUFBTSxrQkFBa0IsR0FBRyxhQUFhLENBQUM7Z0JBRXpDLE1BQU0sb0JBQW9CLEdBQUc7Ozs7eUJBSVosa0JBQWtCLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUM7O2lEQUVyQiw2QkFBNkI7Ozs2QkFHakQsQ0FBQztnQkFFdEIsc0VBQXNFO2dCQUN0RSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztvQkFDdkIsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO3dCQUNiLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0RBQWdELENBQUMsQ0FBQztvQkFDcEUsQ0FBQztvQkFDRCxxQ0FBcUM7b0JBQ3JDLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFDbkMsTUFBTSxLQUFLLENBQUMsU0FBUyxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7b0JBRTVDLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO29CQUM3RCxPQUFPO2dCQUNULENBQUM7Z0JBRUQsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUVuQyxrRUFBa0U7Z0JBQ2xFLCtEQUErRDtnQkFDL0QsTUFBTSxtQkFBbUIsR0FBRyxNQUFNLE9BQU8sQ0FBQyxLQUFLLENBQUM7b0JBQzlDLE1BQU0sRUFBRTt3QkFDTixFQUFFLEVBQUUsa0VBQWtFO3FCQUN2RTtvQkFDRCxLQUFLLEVBQUU7d0JBQ0wsUUFBUSxFQUFFLG9CQUFvQjt3QkFDOUIsVUFBVSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVTt3QkFDbEMsVUFBVSxFQUFFLGtCQUFrQjt3QkFDOUIsTUFBTSxFQUFFLElBQUk7cUJBQ2I7b0JBQ0QsT0FBTztvQkFDUCxtRkFBbUY7b0JBQ25GLDhFQUE4RTtvQkFDOUUsU0FBUyxFQUFFLDZCQUE2QjtvQkFDeEMsYUFBYSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVTtvQkFDckMsTUFBTSxFQUFFLElBQUk7b0JBQ1osTUFBTTtvQkFDTixRQUFRLEVBQUUsTUFBTTtvQkFDaEIsTUFBTSxFQUFFLFFBQVE7b0JBQ2hCLEtBQUssRUFBRSxJQUFJO29CQUNYLFNBQVMsRUFBRSxJQUFJO29CQUNmLE1BQU0sRUFBRSxLQUFLO29CQUNiLFFBQVEsRUFBRSxDQUFDLDJDQUEyQyxDQUFDO2lCQUN4RCxDQUFDLENBQUM7Z0JBRUgsSUFBSSxDQUFDLGtCQUFrQixDQUNyQixtQkFBbUIsRUFDbkIsdUJBQXVCLEVBQ3ZCLElBQUksRUFDSjtvQkFDRSxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLHFDQUFxQztpQkFDcEUsQ0FDRixDQUFDO2dCQUNGLElBQUksQ0FBQyw0QkFBNEIsQ0FDL0IsK0JBQStCLEVBQy9CLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLGVBQWUsSUFBSSxDQUNwQyxDQUFDO1lBQ0osQ0FBQyxDQUFDO1lBQ0YsTUFBTSxXQUFXLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUVyRCxJQUFJLHdCQUF3QixFQUFFLENBQUM7Z0JBQzdCLDZCQUE2QixHQUFHLEtBQUssQ0FBQztnQkFDdEMsT0FBTztvQkFDTCxRQUFRLEVBQUUsZ0JBQWdCO29CQUMxQixnQkFBZ0I7b0JBQ2hCLFdBQVc7aUJBQ1osQ0FBQztZQUNKLENBQUM7WUFDRCxPQUFPLEVBQUUsUUFBUSxFQUFFLGdCQUFnQixFQUFFLENBQUM7UUFDeEMsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZiw2QkFBNkIsR0FBRyxJQUFJLENBQUM7WUFDckMsTUFBTSxLQUFLLENBQUM7UUFDZCxDQUFDO2dCQUFTLENBQUM7WUFDVCxJQUFJLDZCQUE2QixFQUFFLENBQUM7Z0JBQ2xDLElBQUksQ0FBQztvQkFDSCxNQUFNLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNuQyxDQUFDO2dCQUFDLE9BQU8sWUFBWSxFQUFFLENBQUM7b0JBQ3RCLE9BQU8sQ0FBQyxJQUFJLENBQ1Ysb0RBQW9ELEVBQ3BELFlBQVksQ0FDYixDQUFDO2dCQUNKLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRDs7OztPQUlHO0lBQ08sS0FBSyxDQUFDLG1CQUFtQjtRQUNqQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ2xDLHFEQUFxRDtZQUNyRCxPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksQ0FBQyxrQkFBa0IsQ0FDckIsZ0NBQWdDLEVBQ2hDLElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQzdCLENBQUM7UUFDRixJQUFJLENBQUMsa0JBQWtCLENBQ3JCLGtJQUFrSSxDQUNuSSxDQUFDO1FBRUYscURBQXFEO1FBQ3JELE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDeEQsTUFBTSxLQUFLLENBQUMsU0FBUyxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFFNUMsTUFBTSxVQUFVLEdBQUcsTUFBTSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFFOUMsbUdBQW1HO1FBQ25HLCtFQUErRTtRQUMvRSwrRkFBK0Y7UUFDL0YsTUFBTSxFQUFFLG9CQUFvQixFQUFFLEdBQUcsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUN6RCxVQUFVLEVBQ1YsU0FBUyxDQUNWLENBQUM7UUFFRixvRUFBb0U7UUFDcEUsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLEdBQUcsQ0FDbEMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FDN0MsQ0FBQztRQUNGLE1BQU0sY0FBYyxHQUFHLENBQUMsR0FBRyxvQkFBb0IsQ0FBQyxDQUFDLE1BQU0sQ0FDckQsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsb0JBQW9CLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUNwQyxDQUFDO1FBRUYsaUVBQWlFO1FBQ2pFLHdFQUF3RTtRQUN4RSxrRUFBa0U7UUFDbEUsTUFBTSxTQUFTLEdBQUcsVUFBVTthQUN6QixHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUNaLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztZQUN4RSxJQUFJLFlBQVksR0FBRyxRQUFRLENBQUMsb0JBQW9CLEVBQUUsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUM3RCxLQUFLLEVBQ0wsR0FBRyxDQUNKLENBQUM7WUFDRixJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDdEUsWUFBWSxHQUFHLEtBQUssWUFBWSxFQUFFLENBQUM7WUFDckMsQ0FBQztZQUNELE9BQU8sa0JBQWtCLFlBQVksSUFBSSxDQUFDO1FBQzVDLENBQUMsQ0FBQzthQUNELElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVkLGlGQUFpRjtRQUNqRixNQUFNLFlBQVksR0FBRyxjQUFjO2FBQ2hDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQ1osTUFBTSxvQkFBb0IsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ3hFLElBQUksWUFBWSxHQUFHLFFBQVEsQ0FBQyxvQkFBb0IsRUFBRSxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQzdELEtBQUssRUFDTCxHQUFHLENBQ0osQ0FBQztZQUNGLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUN0RSxZQUFZLEdBQUcsS0FBSyxZQUFZLEVBQUUsQ0FBQztZQUNyQyxDQUFDO1lBQ0QsT0FBTyxXQUFXLFlBQVksSUFBSSxDQUFDO1FBQ3JDLENBQUMsQ0FBQzthQUNELElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVkLHNFQUFzRTtRQUN0RSxNQUFNLFlBQVksR0FBRyxZQUFZO1lBQy9CLENBQUMsQ0FBQyx3REFBd0QsWUFBWSxLQUFLLFNBQVMsRUFBRTtZQUN0RixDQUFDLENBQUMsU0FBUyxDQUFDO1FBRWQsZ0RBQWdEO1FBQ2hELE1BQU0saUNBQWlDLEdBQUcsTUFBTSxhQUFhLENBQUM7WUFDNUQsR0FBRyxVQUFVO1lBQ2IsR0FBRyxjQUFjO1NBQ2xCLENBQUMsQ0FBQztRQUNILE1BQU0sWUFBWSxHQUFHLE1BQU0sT0FBTyxDQUFDLEtBQUssQ0FBQztZQUN2QyxNQUFNLEVBQUU7Z0JBQ04sRUFBRSxFQUFFLGtFQUFrRTthQUN2RTtZQUNELEtBQUssRUFBRTtnQkFDTCxRQUFRLEVBQUUsWUFBWTtnQkFDdEIsVUFBVSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVTtnQkFDbEMsVUFBVSxFQUFFLGtCQUFrQjtnQkFDOUIsTUFBTSxFQUFFLElBQUk7YUFDYjtZQUNELE9BQU8sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQjtZQUNyQyxNQUFNLEVBQUUsSUFBSTtZQUNaLE1BQU0sRUFBRSxLQUFLO1lBQ2IsUUFBUSxFQUFFLE1BQU07WUFDaEIsR0FBRyxFQUFFLFVBQVU7WUFDZixNQUFNLEVBQUUsUUFBUTtZQUNoQixLQUFLLEVBQUUsSUFBSTtZQUNYLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFFBQVEsRUFBRSxDQUFDLGdCQUFnQixDQUFDO1lBQzVCLGlCQUFpQixFQUFFO2dCQUNqQixLQUFLO2dCQUNMLE1BQU07Z0JBQ04sTUFBTTtnQkFDTixNQUFNO2dCQUNOLEtBQUs7Z0JBQ0wsTUFBTTtnQkFDTixNQUFNO2dCQUNOLE1BQU07YUFDUDtZQUNELE9BQU8sRUFBRTtnQkFDUCxlQUFlLENBQUM7b0JBQ2QsSUFBSSxFQUFFLFFBQVE7b0JBQ2QsV0FBVyxFQUFFLElBQUksQ0FBQyxvQkFBb0I7b0JBQ3RDLG1CQUFtQixFQUFFLElBQUksQ0FBQyxtQkFBbUI7b0JBQzdDLGlCQUFpQixFQUFFLGlDQUFpQztpQkFDckQsQ0FBQzthQUNIO1NBQ0YsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFlBQVksRUFBRSx1QkFBdUIsQ0FBQyxDQUFDO1FBRS9ELE1BQU0sSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7SUFDaEMsQ0FBQztJQUVEOzs7O09BSUc7SUFDTyxLQUFLLENBQUMsbUJBQW1CLENBQUMsRUFDbEMsT0FBTyxFQUNQLE1BQU0sR0FBRyxLQUFLLEdBSWY7UUFDQyxJQUFJLENBQUMsMEJBQTBCLENBQUMsd0JBQXdCLENBQUMsQ0FBQztRQUMxRCxNQUFNLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUVuRCxpREFBaUQ7UUFDakQsZ0VBQWdFO1FBQ2hFLE1BQU0sWUFBWSxHQUFHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O2dDQTRCTyxDQUFDO1FBRTdCLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNaLDZDQUE2QztZQUM3QyxNQUFNLFNBQVMsQ0FBQyxPQUFPLEVBQUUsWUFBWSxDQUFDLENBQUM7WUFDdkMsT0FBTztRQUNULENBQUM7UUFFRCwrREFBK0Q7UUFFL0QsTUFBTSxhQUFhLEdBQUcsS0FBYyxDQUFDO1FBQ3JDLE1BQU0sRUFBRSxNQUFNLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxFQUFFLHVCQUF1QixFQUFFLEdBQ3hFLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUUvQyxNQUFNLGtCQUFrQixHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN0QyxNQUFNLE1BQU0sR0FBRyxNQUFNLE9BQU8sQ0FBQyxLQUFLLENBQUM7WUFDakMsTUFBTSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxtRUFBbUUsdUJBQXVCLEVBQUU7YUFDakc7WUFDRCxLQUFLLEVBQUU7Z0JBQ0wsUUFBUSxFQUFFLFlBQVk7Z0JBQ3RCLFVBQVUsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVU7Z0JBQ2xDLFVBQVUsRUFBRSxrQkFBa0I7Z0JBQzlCLE1BQU0sRUFBRSxJQUFJO2FBQ2I7WUFDRCxPQUFPO1lBQ1AsYUFBYSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVTtZQUNyQyxNQUFNLEVBQUUsSUFBSTtZQUNaLEdBQUcsRUFBRSxVQUFVO1lBQ2YsTUFBTSxFQUFFLGFBQWE7WUFDckIsUUFBUSxFQUFFLE1BQU07WUFDaEIsVUFBVSxFQUFFLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsU0FBUyxDQUFDO1lBQ25ELE1BQU0sRUFBRSxRQUFRO1lBQ2hCLEtBQUssRUFBRSxJQUFJO1lBQ1gsV0FBVyxFQUFFLElBQUk7WUFDakIsU0FBUyxFQUFFLElBQUk7WUFDZixNQUFNLEVBQUUsS0FBSztZQUNiLE1BQU0sRUFBRSx1QkFBdUI7WUFDL0IsaUJBQWlCLEVBQUU7Z0JBQ2pCLEtBQUs7Z0JBQ0wsTUFBTTtnQkFDTixNQUFNO2dCQUNOLE1BQU07Z0JBQ04sS0FBSztnQkFDTCxNQUFNO2dCQUNOLE1BQU07Z0JBQ04sTUFBTTthQUNQO1lBQ0QsU0FBUyxFQUFFLDZCQUE2QjtZQUN4QyxVQUFVLEVBQUUsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDO1lBQzlCLDZFQUE2RTtZQUM3RSxRQUFRLEVBQUUsRUFBRTtTQUNiLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUseUJBQXlCLENBQUMsQ0FBQztRQUMzRCxJQUFJLENBQUMsMEJBQTBCLENBQzdCLHdCQUF3QixFQUN4QixHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxrQkFBa0IsSUFBSSxDQUN2QyxDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ08sS0FBSyxDQUFDLGlCQUFpQixDQUMvQixHQUFXLEVBQ1gsSUFBMkI7UUFFM0IsTUFBTSxXQUFXLEdBQUcsRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUM3QixNQUFNLFNBQVMsQ0FDYixJQUFJLENBQUMsR0FBRyxFQUFFLGNBQWMsQ0FBQyxFQUN6QixJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQ3JDLENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDTyxLQUFLLENBQUMsY0FBYyxDQUM1QixHQUFXLEVBQ1gsTUFnQkM7UUFFRCxNQUFNLFFBQVEsR0FBRztZQUNmLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTyxJQUFJLFlBQVk7WUFDdkMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPLElBQUksVUFBVTtZQUNyQyxZQUFZLEVBQUUsTUFBTSxDQUFDLFlBQVksSUFBSSxRQUFRO1lBQzdDLFlBQVksRUFBRSxNQUFNLENBQUMsWUFBWSxJQUFJLE9BQU87WUFDNUMsZ0JBQWdCLEVBQUUsTUFBTSxDQUFDLGdCQUFnQixJQUFJLElBQUk7WUFDakQsR0FBRyxDQUFDLE1BQU0sQ0FBQyxXQUFXLEtBQUssU0FBUyxJQUFJO2dCQUN0QyxXQUFXLEVBQUUsTUFBTSxDQUFDLFdBQVc7YUFDaEMsQ0FBQztZQUNGLEdBQUcsQ0FBQyxNQUFNLENBQUMseUJBQXlCLEtBQUssU0FBUyxJQUFJO2dCQUNwRCx5QkFBeUIsRUFBRSxNQUFNLENBQUMseUJBQXlCO2FBQzVELENBQUM7WUFDRixHQUFHLENBQUMsTUFBTSxDQUFDLG9CQUFvQixJQUFJO2dCQUNqQyxvQkFBb0IsRUFBRSxNQUFNLENBQUMsb0JBQW9CO2FBQ2xELENBQUM7U0FDSCxDQUFDO1FBRUYsTUFBTSxTQUFTLENBQ2IsSUFBSSxDQUFDLEdBQUcsRUFBRSxpQkFBaUIsQ0FBQyxFQUM1QixJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQ2xDLENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDTyxXQUFXLENBQUMsSUFBWTtRQUNoQyxPQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBRUQ7O09BRUc7SUFDTyxLQUFLLENBQUMsZUFBZSxDQUFDLFFBQWdCO1FBQzlDLE1BQU0sS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFUyxLQUFLLENBQUMsZ0JBQWdCO1FBQzlCLE1BQU0sSUFBSSxDQUFDLDhCQUE4QixFQUFFLENBQUM7UUFDNUMsTUFBTSxJQUFJLENBQUMsMkJBQTJCLEVBQUUsQ0FBQztJQUMzQyxDQUFDO0lBRU8sS0FBSyxDQUFDLDhCQUE4QjtRQUMxQyxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFFakUsSUFBSSxDQUFDO1lBQ0gsSUFBSSxPQUFPLEdBQUcsRUFBRSxDQUFDO1lBQ2pCLElBQUksQ0FBQztnQkFDSCxPQUFPLEdBQUcsTUFBTSxRQUFRLENBQUMsYUFBYSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ25ELENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNmLElBQUssS0FBK0IsQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7b0JBQ3ZELE9BQU87Z0JBQ1QsQ0FBQztZQUNILENBQUM7WUFFRCxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUN2RCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQzVCLE9BQU8sQ0FDTCxPQUFPLEtBQUssTUFBTTtvQkFDbEIsT0FBTyxLQUFLLE9BQU87b0JBQ25CLE9BQU8sS0FBSyxPQUFPO29CQUNuQixPQUFPLEtBQUssUUFBUSxDQUNyQixDQUFDO1lBQ0osQ0FBQyxDQUFDLENBQUM7WUFFSCxJQUFJLFdBQVcsRUFBRSxDQUFDO2dCQUNoQixPQUFPO1lBQ1QsQ0FBQztZQUVELE1BQU0sU0FBUyxHQUNiLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDNUQsTUFBTSxTQUFTLENBQUMsYUFBYSxFQUFFLEdBQUcsT0FBTyxHQUFHLFNBQVMsU0FBUyxDQUFDLENBQUM7UUFDbEUsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNQLHdGQUF3RjtRQUMxRixDQUFDO0lBQ0gsQ0FBQztJQUVPLEtBQUssQ0FBQywyQkFBMkI7UUFDdkMsSUFBSSxDQUFDO1lBQ0gsTUFBTSxTQUFTLENBQ2IsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLE1BQU0sRUFBRSxZQUFZLENBQUMsRUFDbEQsS0FBSyxDQUNOLENBQUM7UUFDSixDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1Asd0ZBQXdGO1FBQzFGLENBQUM7SUFDSCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsSUFBYywwQkFBMEI7UUFDdEMsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLHdCQUF3QixLQUFLLEdBQUcsQ0FBQztJQUN0RCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsSUFBYywyQkFBMkI7UUFDdkMsT0FBTyxDQUNMLGVBQWUsRUFBRSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxLQUFLLHlCQUF5QixDQUMzRSxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7OztPQUtHO0lBQ08sS0FBSyxDQUFDLGNBQWMsQ0FBQyxFQUM3QixrQkFBa0IsRUFDbEIsV0FBVyxFQUNYLFFBQVEsR0FLVDtRQUNDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUM5QixJQUFJLENBQUMscUJBQXFCLENBQUMsc0JBQXNCLENBQUMsQ0FBQztRQUVuRCxJQUFJLENBQUM7WUFDSCxNQUFNLGNBQWMsR0FBRyxNQUFNLHFCQUFxQixDQUFDLGtCQUFrQixDQUFDLENBQUM7WUFFdkUsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN4RCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQzdDLFFBQVEsQ0FBQyxTQUFTLEVBQ2xCLGNBQWMsQ0FDZixDQUFDO1lBQ0YsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUU5RCxNQUFNLE1BQU0sR0FBRyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsQ0FBQztZQUMvRCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFFckQsTUFBTSxLQUFLLENBQUMsV0FBVyxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFDOUMsTUFBTSxTQUFTLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxlQUFlLENBQUMsRUFBRSxZQUFZLENBQUMsQ0FBQztZQUNsRSxJQUFJLElBQUksQ0FBQywyQkFBMkIsRUFBRSxDQUFDO2dCQUNyQyxNQUFNLHVCQUF1QixHQUFHLElBQUksQ0FBQyxXQUFXLENBQzlDLG9EQUFvRCxDQUNyRCxDQUFDO2dCQUNGLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO2dCQUNwRCxNQUFNLFNBQVMsQ0FBQyx1QkFBdUIsRUFBRSxZQUFZLENBQUMsQ0FBQztZQUN6RCxDQUFDO1lBRUQsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQzNDLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUN2QyxDQUFDLENBQ0YsQ0FBQztZQUNGLE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxDQUNuRCxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFDdkMsQ0FBQyxDQUNGLENBQUM7WUFDRixNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FDOUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQ3ZDLENBQUMsQ0FDRixDQUFDO1lBRUYsSUFBSSxDQUFDLHFCQUFxQixDQUN4Qix5QkFBeUIsU0FBUyxJQUFJLFNBQVMsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLFNBQVMsQ0FBQyxLQUFLLGFBQWEsSUFBSSxTQUFTLENBQUMsVUFBVSxFQUFFLFdBQVcsRUFBRSxhQUFhLENBQUMsU0FBUyxVQUFVLElBQUksU0FBUyxDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxDQUFDLEVBQUUsRUFDcE4sR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsVUFBVSxJQUFJLENBQy9CLENBQUM7WUFFRixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQywwQkFBMEIsRUFBRSxDQUFDO2dCQUM1QyxPQUFPLENBQUMsR0FBRyxDQUNULEdBQUcsSUFBSSxDQUFDLDZCQUE2QixFQUFFLEtBQUssU0FBUyxJQUFJLFNBQVMsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLFNBQVMsQ0FBQyxLQUFLLGFBQWEsSUFBSSxTQUFTLENBQUMsVUFBVSxFQUFFLFdBQVcsRUFBRSxhQUFhLENBQUMsVUFBVSxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQyxHQUFHLENBQ3ZPLENBQUM7WUFDSixDQUFDO1lBQ0QsSUFBSSxDQUFDLHlCQUF5QixJQUFJLENBQUMsQ0FBQztZQUNwQyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztZQUUvQixPQUFPLFlBQVksQ0FBQztRQUN0QixDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE9BQU8sQ0FBQyxJQUFJLENBQ1YsNEJBQTRCLEVBQzVCLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FDdkQsQ0FBQztZQUNGLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1lBQy9CLE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7SUFDSCxDQUFDO0lBRU8sb0JBQW9CLENBQzFCLEtBQWdDO1FBRWhDLE1BQU0sTUFBTSxHQUF1RCxFQUFFLENBQUM7UUFDdEUsSUFBSSxDQUFDLEtBQUs7WUFBRSxPQUFPLE1BQU0sQ0FBQztRQUUxQixLQUFLLE1BQU0sQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3hELE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDdEIsS0FBSyxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztnQkFDbkQsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNuRCxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFTyx3QkFBd0IsQ0FDOUIsU0FBd0MsRUFDeEMsTUFHQztRQVFELE1BQU0sTUFBTSxHQU1SLEVBQUUsQ0FBQztRQUNQLElBQUksQ0FBQyxTQUFTO1lBQUUsT0FBTyxNQUFNLENBQUM7UUFFOUIsc0VBQXNFO1FBQ3RFLG1FQUFtRTtRQUNuRSxxRUFBcUU7UUFDckUsMkRBQTJEO1FBQzNELE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxHQUFHLEVBRzdCLENBQUM7UUFDSixLQUFLLE1BQU0sQ0FBQyxTQUFTLEVBQUUsWUFBWSxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQy9ELE1BQU0sVUFBVSxHQUFHLFNBQVM7aUJBQ3pCLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO2lCQUNwQixPQUFPLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQzVCLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDakQsQ0FBQztRQUVELEtBQUssTUFBTSxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7WUFDNUQsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUN0Qiw4Q0FBOEM7WUFDOUMsTUFBTSxrQkFBa0IsR0FBRyxRQUFRO2lCQUNoQyxPQUFPLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQztpQkFDcEIsT0FBTyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUU1QixNQUFNLFlBQVksR0FDaEIsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1lBRS9ELEtBQUssTUFBTSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7Z0JBQ25ELE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRztvQkFDdkIsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVO29CQUMzQixLQUFLLEVBQUUsWUFBWSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxJQUFJLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFO2lCQUMvRCxDQUFDO1lBQ0osQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRU8sc0JBQXNCLENBQzVCLE9BQW9DO1FBRXBDLE1BQU0sTUFBTSxHQUF3RCxFQUFFLENBQUM7UUFDdkUsSUFBSSxDQUFDLE9BQU87WUFBRSxPQUFPLE1BQU0sQ0FBQztRQUU1QixLQUFLLE1BQU0sQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQzFELE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDdEIsS0FBSyxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztnQkFDbkQsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNyRCxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByYW5kb21VVUlEIH0gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IHtcbiAgbWtkaXIsXG4gIHJlYWRGaWxlLFxuICByZWFscGF0aCxcbiAgcmVuYW1lLFxuICBybSxcbiAgd3JpdGVGaWxlLFxufSBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCB7IGNyZWF0ZVJlcXVpcmUgfSBmcm9tICdub2RlOm1vZHVsZSc7XG5pbXBvcnQgeyBiYXNlbmFtZSwgZGlybmFtZSwgam9pbiwgcmVsYXRpdmUsIHJlc29sdmUgfSBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHsgcHJvbWlzaWZ5IH0gZnJvbSAnbm9kZTp1dGlsJztcbmltcG9ydCB7IGJ1aWxkTG9nZ2VyIH0gZnJvbSAnQHdvcmtmbG93L2NvcmUvbG9nZ2VyJztcbmltcG9ydCB7IHBsdXJhbGl6ZSwgdXNlc1ZlcmNlbFdvcmxkIH0gZnJvbSAnQHdvcmtmbG93L3V0aWxzJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgZW5oYW5jZWRSZXNvbHZlT3JpZ2luYWwgZnJvbSAnZW5oYW5jZWQtcmVzb2x2ZSc7XG5pbXBvcnQgKiBhcyBlc2J1aWxkIGZyb20gJ2VzYnVpbGQnO1xuaW1wb3J0IHsgZmluZFVwIH0gZnJvbSAnZmluZC11cCc7XG5pbXBvcnQgeyBnbG9iIH0gZnJvbSAndGlueWdsb2JieSc7XG5pbXBvcnQge1xuICBhcHBseVN3Y1RyYW5zZm9ybSxcbiAgdHlwZSBXb3JrZmxvd01hbmlmZXN0LFxufSBmcm9tICcuL2FwcGx5LXN3Yy10cmFuc2Zvcm0uanMnO1xuaW1wb3J0IHsgY3JlYXRlV29ya2Zsb3dFbnRyeXBvaW50T3B0aW9uc0NvZGUgfSBmcm9tICcuL2NvbnN0YW50cy5qcyc7XG5pbXBvcnQgeyBnZXRFc2J1aWxkVHNjb25maWdPcHRpb25zIH0gZnJvbSAnLi9lc2J1aWxkLXRzY29uZmlnLmpzJztcbmltcG9ydCB7XG4gIGZhc3REaXNjb3ZlckVudHJpZXMsXG4gIHR5cGUgRGlzY292ZXJlZEVudHJpZXMsXG59IGZyb20gJy4vZmFzdC1kaXNjb3ZlcnkuanMnO1xuaW1wb3J0IHtcbiAgZ2V0SW1wb3J0UGF0aCxcbiAgcmVzb2x2ZU1vZHVsZVNwZWNpZmllcixcbiAgc3RyaXBQYWNrYWdlVmVyc2lvbixcbn0gZnJvbSAnLi9tb2R1bGUtc3BlY2lmaWVyLmpzJztcbmltcG9ydCB7IGNyZWF0ZU5vZGVNb2R1bGVFcnJvclBsdWdpbiB9IGZyb20gJy4vbm9kZS1tb2R1bGUtZXNidWlsZC1wbHVnaW4uanMnO1xuaW1wb3J0IHsgY3JlYXRlUHNldWRvUGFja2FnZVBsdWdpbiB9IGZyb20gJy4vcHNldWRvLXBhY2thZ2UtZXNidWlsZC1wbHVnaW4uanMnO1xuaW1wb3J0IHsgY3JlYXRlU3djUGx1Z2luIH0gZnJvbSAnLi9zd2MtZXNidWlsZC1wbHVnaW4uanMnO1xuaW1wb3J0IHsgZGV0ZWN0V29ya2Zsb3dQYXR0ZXJucyB9IGZyb20gJy4vdHJhbnNmb3JtLXV0aWxzLmpzJztcbmltcG9ydCB0eXBlIHsgV29ya2Zsb3dDb25maWcgfSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7IGV4dHJhY3RXb3JrZmxvd0dyYXBocyB9IGZyb20gJy4vd29ya2Zsb3dzLWV4dHJhY3Rvci5qcyc7XG5cbmNvbnN0IGVuaGFuY2VkUmVzb2x2ZSA9IHByb21pc2lmeShlbmhhbmNlZFJlc29sdmVPcmlnaW5hbCk7XG5jb25zdCByZXF1aXJlID0gY3JlYXRlUmVxdWlyZShpbXBvcnQubWV0YS51cmwpO1xuXG5leHBvcnQgdHlwZSB7IERpc2NvdmVyZWRFbnRyaWVzIH0gZnJvbSAnLi9mYXN0LWRpc2NvdmVyeS5qcyc7XG5cbi8qKlxuICogUGVybWlzc2l2ZSBzaGFwZSBhY2NlcHRlZCBieSB0aGUgYnVuZGxlIGNyZWF0aW9uIGhlbHBlcnMuIFRoZSBmYXN0IGRpc2NvdmVyeVxuICogcGFzcyBwcm9kdWNlcyBgU2V0PHN0cmluZz5gIGNvbGxlY3Rpb25zLCBidXQgc29tZSBjYWxsZXJzIChlLmcuIHRoZSBkZWZlcnJlZFxuICogTmV4dC5qcyBidWlsZGVyKSB0cmFjayBkaXNjb3ZlcmVkIGVudHJpZXMgYXMgYHN0cmluZ1tdYC4gQ29uc3VtZXJzIG9ubHkgZXZlclxuICogaXRlcmF0ZSB0aGVzZSBjb2xsZWN0aW9ucywgc28gYWNjZXB0IGVpdGhlciBmb3JtIGhlcmUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGlzY292ZXJlZEVudHJpZXNJbnB1dCB7XG4gIGRpc2NvdmVyZWRTdGVwczogc3RyaW5nW10gfCBTZXQ8c3RyaW5nPjtcbiAgZGlzY292ZXJlZFdvcmtmbG93czogc3RyaW5nW10gfCBTZXQ8c3RyaW5nPjtcbiAgZGlzY292ZXJlZFNlcmRlRmlsZXM6IHN0cmluZ1tdIHwgU2V0PHN0cmluZz47XG59XG5cbmludGVyZmFjZSBXb3JrZmxvd0J1aWxkRXJyb3JPcHRpb25zIGV4dGVuZHMgRXJyb3JPcHRpb25zIHtcbiAgLyoqXG4gICAqIEFuIG9wdGlvbmFsIGFjdGlvbmFibGUgaGludCBhcHBlbmRlZCB0byB0aGUgbWFpbiBtZXNzYWdlLCBleHBsYWluaW5nIGhvd1xuICAgKiB0aGUgdXNlciBjYW4gcmVzb2x2ZSB0aGUgZmFpbHVyZS5cbiAgICovXG4gIGhpbnQ/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhyb3duIHdoZW4gdGhlIHdvcmtmbG93IGJ1aWxkIHBpcGVsaW5lIChlc2J1aWxkLCBTV0MgdHJhbnNmb3JtLCBmaWxlXG4gKiBkaXNjb3ZlcnksIGJ1bmRsZXIgaW50ZWdyYXRpb24pIGZhaWxzIGluIGEgd2F5IHRoZSB1c2VyIGNhbiBhY3Qgb24uXG4gKi9cbmNsYXNzIFdvcmtmbG93QnVpbGRFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgcmVhZG9ubHkgaGludD86IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIG9wdGlvbnM/OiBXb3JrZmxvd0J1aWxkRXJyb3JPcHRpb25zKSB7XG4gICAgY29uc3QgYm9keSA9IG9wdGlvbnM/LmhpbnRcbiAgICAgID8gYCR7bWVzc2FnZX1cXG5cXG5oaW50OiAke29wdGlvbnMuaGludH1gXG4gICAgICA6IG1lc3NhZ2U7XG4gICAgc3VwZXIoYm9keSwgeyBjYXVzZTogb3B0aW9ucz8uY2F1c2UgfSk7XG4gICAgdGhpcy5uYW1lID0gJ1dvcmtmbG93QnVpbGRFcnJvcic7XG4gICAgdGhpcy5oaW50ID0gb3B0aW9ucz8uaGludDtcbiAgfVxufVxuXG4vKipcbiAqIExlZ2FjeSBvcHQtaW4gZm9yIHNvdXJjZSBtYXBzIG9uIHRoZSBmaW5hbCB3b3JrZmxvdyB3cmFwcGVyICsgd2ViaG9va1xuICogYnVuZGxlcyAod2hpY2ggZGVmYXVsdCB0byBvZmYsIHVubGlrZSB0aGUgc3RlcC9pbnRlcmltIHdvcmtmbG93IGJ1bmRsZXNcbiAqIHRoYXQgZGVmYXVsdCB0byBpbmxpbmUpLiBTdXBlcnNlZGVkIGJ5IHRoZSBgc291cmNlbWFwYCBjb25maWcgb3B0aW9uIGFuZFxuICogdGhlIGBXT1JLRkxPV19TT1VSQ0VNQVBgIGVudmlyb25tZW50IHZhcmlhYmxlOyBrZXB0IGZvciBiYWNrLWNvbXBhdC5cbiAqL1xuY29uc3QgRU1JVF9TT1VSQ0VNQVBTX0ZPUl9ERUJVR0dJTkcgPVxuICBwcm9jZXNzLmVudi5XT1JLRkxPV19FTUlUX1NPVVJDRU1BUFNfRk9SX0RFQlVHR0lORyA9PT0gJzEnO1xuXG5mdW5jdGlvbiBmb3JtYXRCdWlsZER1cmF0aW9uKGR1cmF0aW9uTXM6IG51bWJlcik6IHN0cmluZyB7XG4gIGlmIChkdXJhdGlvbk1zIDwgMTAwMCkge1xuICAgIHJldHVybiBgJHtkdXJhdGlvbk1zfW1zYDtcbiAgfVxuXG4gIHJldHVybiBgJHsoZHVyYXRpb25NcyAvIDEwMDApLnRvRml4ZWQoMSl9c2A7XG59XG5cbi8qKlxuICogTm9ybWFsaXplIGFuIGFycmF5IG9mIGZpbGUgcGF0aHMgYnkgYXBwZW5kaW5nIHRoZSBgcmVhbHBhdGgoKWAgb2YgZWFjaCBlbnRyeVxuICogKHRvIGhhbmRsZSBzeW1saW5rcywgZS5nLiBwbnBtL3dvcmtzcGFjZSBsYXlvdXRzKSBhbmQgZGVkdXBsaWNhdGluZy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gd2l0aFJlYWxwYXRocyhlbnRyaWVzOiBzdHJpbmdbXSk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgcmV0dXJuIEFycmF5LmZyb20oXG4gICAgbmV3IFNldChcbiAgICAgIChcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgZW50cmllcy5tYXAoYXN5bmMgKGVudHJ5KSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXNvbHZlZCA9IGF3YWl0IHJlYWxwYXRoKGVudHJ5KS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVkID8gW2VudHJ5LCByZXNvbHZlZF0gOiBbZW50cnldO1xuICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICAgICkuZmxhdCgpXG4gICAgKVxuICApO1xufVxuXG4vKipcbiAqIENhbm9uaWNhbCBcIndoYXQgbW9kdWxlIGRvZXMgdGhpcyBmaWxlIHJlcHJlc2VudD9cIiBrZXkgdXNlZCB0byBkZWR1cGVcbiAqIHZpcnR1YWwtZW50cnkgaW1wb3J0cy5cbiAqXG4gKiBJZiB0aGUgZmlsZSByZXNvbHZlcyB0byBhIHJlYWwgcGFja2FnZSBzcGVjaWZpZXIgKGB3b3JrZmxvdy9pbnRlcm5hbC9idWlsdGluc2AsXG4gKiBgQGludGVybmFsL2FnZW50L3NlcnZlcmAsIGV0Yy4pLCB3ZSByZXR1cm4gdGhlIGJhcmUgc3BlY2lmaWVyIOKAlCB2ZXJzaW9uXG4gKiBzdHJpcHBlZCDigJQgYmVjYXVzZSBlc2J1aWxkJ3MgcGFja2FnZSByZXNvbHV0aW9uIHdpbGwgY29sbGFwc2UgYWxsXG4gKiBpbXBvcnRlcnMgb2YgdGhhdCBzcGVjaWZpZXIgdG8gdGhlIHNhbWUgcGh5c2ljYWwgbW9kdWxlIHJlZ2FyZGxlc3Mgb2ZcbiAqIHdoaWNoIG9uLWRpc2sgY29weSAoc3JjIHZzIGRpc3QpIGFueSBvbmUgaW1wb3J0ZXIgd3JvdGUuXG4gKlxuICogT3RoZXJ3aXNlIHdlIGZhbGwgYmFjayB0byB0aGUgYWJzb2x1dGUgZmlsZSBwYXRoLiBEaXN0aW5jdCBsb2NhbC1hcHBcbiAqIGZpbGVzIGhhdmUgZGlzdGluY3QgcGF0aHMsIHNvIHRoaXMgc3RpbGwgZGVkdXBlcyBhIGZpbGUgYWdhaW5zdCBpdHNlbGZcbiAqIChlLmcuIGlmIGl0IHNob3dzIHVwIGluIGJvdGggYHN0ZXBGaWxlc2AgYW5kIGBzZXJkZU9ubHlGaWxlc2ApIHdpdGhvdXRcbiAqIGNvbmZsYXRpbmcgdW5yZWxhdGVkIGZpbGVzLlxuICovXG5mdW5jdGlvbiBtb2R1bGVJZGVudGl0eUtleShmaWxlOiBzdHJpbmcsIG1vZHVsZVNwZWNpZmllclJvb3Q6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHsgbW9kdWxlU3BlY2lmaWVyIH0gPSByZXNvbHZlTW9kdWxlU3BlY2lmaWVyKGZpbGUsIG1vZHVsZVNwZWNpZmllclJvb3QpO1xuICBpZiAobW9kdWxlU3BlY2lmaWVyKSB7XG4gICAgLy8gU3RyaXAgdGhlIFwiQDx2ZXJzaW9uPlwiIHN1ZmZpeCBzbyBzb3VyY2UgYW5kIGRpc3QgY29waWVzIG9mIHRoZSBzYW1lXG4gICAgLy8gZXhwb3J0IGNvbGxhcHNlIHRvIHRoZSBzYW1lIGtleS5cbiAgICByZXR1cm4gc3RyaXBQYWNrYWdlVmVyc2lvbihtb2R1bGVTcGVjaWZpZXIpO1xuICB9XG4gIHJldHVybiBmaWxlLnJlcGxhY2UoL1xcXFwvZywgJy8nKTtcbn1cblxudHlwZSBNYW5pZmVzdEVudHJ5TG9jYXRpb24gPSB7XG4gIGZpbGVQYXRoOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbn07XG5cbmZ1bmN0aW9uIGZvcm1hdElkTG9jYXRpb24obG9jYXRpb246IE1hbmlmZXN0RW50cnlMb2NhdGlvbik6IHN0cmluZyB7XG4gIHJldHVybiBgJHtsb2NhdGlvbi5maWxlUGF0aH0jJHtsb2NhdGlvbi5uYW1lfWA7XG59XG5cbmZ1bmN0aW9uIGFzc2VydFVuaXF1ZU1hbmlmZXN0SWRzPFRFbnRyeT4oXG4gIGVudHJpZXNCeUZpbGU6IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIFRFbnRyeT4+IHwgdW5kZWZpbmVkLFxuICBpZHM6IE1hcDxzdHJpbmcsIE1hbmlmZXN0RW50cnlMb2NhdGlvbj4sXG4gIGdldElkOiAoZW50cnk6IFRFbnRyeSkgPT4gc3RyaW5nLFxuICBsYWJlbDogJ3N0ZXAnIHwgJ3dvcmtmbG93J1xuKTogdm9pZCB7XG4gIGZvciAoY29uc3QgW2ZpbGVQYXRoLCBlbnRyaWVzXSBvZiBPYmplY3QuZW50cmllcyhlbnRyaWVzQnlGaWxlIHx8IHt9KSkge1xuICAgIGZvciAoY29uc3QgW25hbWUsIGRhdGFdIG9mIE9iamVjdC5lbnRyaWVzKGVudHJpZXMpKSB7XG4gICAgICBjb25zdCBpZCA9IGdldElkKGRhdGEpO1xuICAgICAgY29uc3QgZXhpc3RpbmcgPSBpZHMuZ2V0KGlkKTtcbiAgICAgIGNvbnN0IGN1cnJlbnQgPSB7IGZpbGVQYXRoLCBuYW1lIH07XG4gICAgICBpZiAoXG4gICAgICAgIGV4aXN0aW5nICYmXG4gICAgICAgIChleGlzdGluZy5maWxlUGF0aCAhPT0gY3VycmVudC5maWxlUGF0aCB8fFxuICAgICAgICAgIGV4aXN0aW5nLm5hbWUgIT09IGN1cnJlbnQubmFtZSlcbiAgICAgICkge1xuICAgICAgICBjb25zdCBpZE5hbWUgPSBsYWJlbCA9PT0gJ3N0ZXAnID8gJ3dvcmtmbG93IHN0ZXAgSUQnIDogJ3dvcmtmbG93IElEJztcbiAgICAgICAgY29uc3QgZnVuY3Rpb25OYW1lID0gYCR7bGFiZWx9IGZ1bmN0aW9uYDtcbiAgICAgICAgY29uc3QgY2FwaXRhbGl6ZWRMYWJlbCA9IGxhYmVsID09PSAnc3RlcCcgPyAnU3RlcCcgOiAnV29ya2Zsb3cnO1xuICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dCdWlsZEVycm9yKFxuICAgICAgICAgIGBEdXBsaWNhdGUgJHtpZE5hbWV9IFwiJHtpZH1cIiBnZW5lcmF0ZWQgZm9yICR7Zm9ybWF0SWRMb2NhdGlvbihleGlzdGluZyl9IGFuZCAke2Zvcm1hdElkTG9jYXRpb24oY3VycmVudCl9LmAsXG4gICAgICAgICAge1xuICAgICAgICAgICAgaGludDpcbiAgICAgICAgICAgICAgYCR7Y2FwaXRhbGl6ZWRMYWJlbH0gSURzIG11c3QgYmUgdW5pcXVlIGFjcm9zcyBhIGJ1aWxkLiBgICtcbiAgICAgICAgICAgICAgYElmIHlvdSBvd24gb25lIG9mIHRoZSBjb2xsaWRpbmcgZmlsZXMsIHJlbmFtZSB0aGUgJHtmdW5jdGlvbk5hbWV9IG9yIGV4cG9ydCBgICtcbiAgICAgICAgICAgICAgYHRoZSBwYWNrYWdlIGZpbGUgdGhyb3VnaCBhIHVuaXF1ZSBwYWNrYWdlIHN1YnBhdGguIElmIHRoZSBjb2xsaXNpb24gaXMgaW4gYSBgICtcbiAgICAgICAgICAgICAgYHRyYW5zaXRpdmUgZGVwZW5kZW5jeSB5b3UgZG9uJ3QgY29udHJvbCwgZmlsZSBhbiBpc3N1ZSB3aXRoIHRoZSB1cHN0cmVhbSBgICtcbiAgICAgICAgICAgICAgYHBhY2thZ2Ugb3IgcGluIHRvIGEgbm9uLWNvbGxpZGluZyB2ZXJzaW9uLmAsXG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWRzLnNldChpZCwgY3VycmVudCk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIG1lcmdlV29ya2Zsb3dNYW5pZmVzdChcbiAgdGFyZ2V0OiBXb3JrZmxvd01hbmlmZXN0LFxuICBpbmNvbWluZzogV29ya2Zsb3dNYW5pZmVzdCxcbiAgc3RlcElkczogTWFwPHN0cmluZywgTWFuaWZlc3RFbnRyeUxvY2F0aW9uPixcbiAgd29ya2Zsb3dJZHM6IE1hcDxzdHJpbmcsIE1hbmlmZXN0RW50cnlMb2NhdGlvbj5cbik6IHZvaWQge1xuICBhc3NlcnRVbmlxdWVNYW5pZmVzdElkcyhcbiAgICBpbmNvbWluZy5zdGVwcyxcbiAgICBzdGVwSWRzLFxuICAgIChkYXRhKSA9PiBkYXRhLnN0ZXBJZCxcbiAgICAnc3RlcCdcbiAgKTtcbiAgYXNzZXJ0VW5pcXVlTWFuaWZlc3RJZHMoXG4gICAgaW5jb21pbmcud29ya2Zsb3dzLFxuICAgIHdvcmtmbG93SWRzLFxuICAgIChkYXRhKSA9PiBkYXRhLndvcmtmbG93SWQsXG4gICAgJ3dvcmtmbG93J1xuICApO1xuXG4gIHRhcmdldC53b3JrZmxvd3MgPSBPYmplY3QuYXNzaWduKHRhcmdldC53b3JrZmxvd3MgfHwge30sIGluY29taW5nLndvcmtmbG93cyk7XG4gIHRhcmdldC5zdGVwcyA9IE9iamVjdC5hc3NpZ24odGFyZ2V0LnN0ZXBzIHx8IHt9LCBpbmNvbWluZy5zdGVwcyk7XG4gIHRhcmdldC5jbGFzc2VzID0gT2JqZWN0LmFzc2lnbih0YXJnZXQuY2xhc3NlcyB8fCB7fSwgaW5jb21pbmcuY2xhc3Nlcyk7XG59XG5cbi8qKlxuICogQmFzZSBjbGFzcyBmb3Igd29ya2Zsb3cgYnVpbGRlcnMuIFByb3ZpZGVzIGNvbW1vbiBidWlsZCBsb2dpYyBmb3IgdHJhbnNmb3JtaW5nXG4gKiB3b3JrZmxvdyBzb3VyY2UgZmlsZXMgaW50byBkZXBsb3lhYmxlIGJ1bmRsZXMgdXNpbmcgZXNidWlsZCBhbmQgU1dDLlxuICpcbiAqIFN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQgdGhlIGJ1aWxkKCkgbWV0aG9kIHRvIGRlZmluZSBidWlsZGVyLXNwZWNpZmljIGxvZ2ljLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZUJ1aWxkZXIge1xuICBwcm90ZWN0ZWQgY29uZmlnOiBXb3JrZmxvd0NvbmZpZztcblxuICAvKipcbiAgICogVHJhY2tzIHdoaWNoIGV4dGVybmFsIHBhY2thZ2VzIGhhdmUgYWxyZWFkeSBiZWVuIHdhcm5lZCBhYm91dFxuICAgKiB0byBhdm9pZCBkdXBsaWNhdGUgd2FybmluZ3MgYWNyb3NzIG11bHRpcGxlIGRpc2NvdmVyRW50cmllcygpIGNhbGxzLlxuICAgKi9cbiAgcHJpdmF0ZSB3YXJuZWRFeHRlcm5hbFBhY2thZ2VzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIHByaXZhdGUgd29ya2Zsb3dCdWlsZFN0YXJ0VGltZTogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHdvcmtmbG93QnVpbGRTdW1tYXJ5Q291bnQgPSAwO1xuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogV29ya2Zsb3dDb25maWcpIHtcbiAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgdHJhbnNmb3JtUHJvamVjdFJvb3QoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcucHJvamVjdFJvb3QgfHwgdGhpcy5jb25maWcud29ya2luZ0RpcjtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgbW9kdWxlU3BlY2lmaWVyUm9vdCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5tb2R1bGVTcGVjaWZpZXJSb290IHx8IHRoaXMudHJhbnNmb3JtUHJvamVjdFJvb3Q7XG4gIH1cblxuICBwcm90ZWN0ZWQgbG9nQmFzZUJ1aWxkZXJJbmZvKC4uLmFyZ3M6IHVua25vd25bXSk6IHZvaWQge1xuICAgIGJ1aWxkTG9nZ2VyLmRlYnVnKGFyZ3MubWFwKFN0cmluZykuam9pbignICcpKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhcnRXb3JrZmxvd0J1aWxkVGltZXIoKTogdm9pZCB7XG4gICAgdGhpcy53b3JrZmxvd0J1aWxkU3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0V29ya2Zsb3dCdWlsZER1cmF0aW9uKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIERhdGUubm93KCkgLSAodGhpcy53b3JrZmxvd0J1aWxkU3RhcnRUaW1lID8/IERhdGUubm93KCkpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNldFdvcmtmbG93QnVpbGRUaW1lcigpOiB2b2lkIHtcbiAgICB0aGlzLndvcmtmbG93QnVpbGRTdGFydFRpbWUgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIGdldFdvcmtmbG93QnVpbGRTdW1tYXJ5UHJlZml4KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMud29ya2Zsb3dCdWlsZFN1bW1hcnlDb3VudCA9PT0gMFxuICAgICAgPyAnd29ya2Zsb3dzIGJ1aWxkIGNvbXBsZXRlJ1xuICAgICAgOiAnd29ya2Zsb3dzIHJlYnVpbHQnO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2dDcmVhdGVXb3JrZmxvd3NCdW5kbGVJbmZvKC4uLmFyZ3M6IHVua25vd25bXSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jb25maWcuc3VwcHJlc3NDcmVhdGVXb3JrZmxvd3NCdW5kbGVMb2dzKSB7XG4gICAgICB0aGlzLmxvZ0Jhc2VCdWlsZGVySW5mbyguLi5hcmdzKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGxvZ0NyZWF0ZVdlYmhvb2tCdW5kbGVJbmZvKC4uLmFyZ3M6IHVua25vd25bXSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jb25maWcuc3VwcHJlc3NDcmVhdGVXZWJob29rQnVuZGxlTG9ncykge1xuICAgICAgdGhpcy5sb2dCYXNlQnVpbGRlckluZm8oLi4uYXJncyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBsb2dDcmVhdGVNYW5pZmVzdEluZm8oLi4uYXJnczogdW5rbm93bltdKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNvbmZpZy5zdXBwcmVzc0NyZWF0ZU1hbmlmZXN0TG9ncykge1xuICAgICAgdGhpcy5sb2dCYXNlQnVpbGRlckluZm8oLi4uYXJncyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFdoZW4gb3V0cHV0dGluZyBDSlMsIGVzYnVpbGQgcmVwbGFjZXMgYGltcG9ydC5tZXRhYCB3aXRoIGFuIGVtcHR5IG9iamVjdCxcbiAgICogbWFraW5nIGBpbXBvcnQubWV0YS51cmxgIChhbmQgYGltcG9ydC5tZXRhLnJlc29sdmVgKSB1bmRlZmluZWQuIFRoaXMgbWV0aG9kXG4gICAqIHJldHVybnMgYmFubmVyIGNvZGUgYW5kIGBkZWZpbmVgIGVudHJpZXMgdGhhdCBwb2x5ZmlsbCB0aGVtIHVzaW5nIENKU1xuICAgKiBlcXVpdmFsZW50cyAoYF9fZmlsZW5hbWVgLCBgcmVxdWlyZS5yZXNvbHZlYCkgc28gdXNlciBjb2RlIChlLmcuIFByaXNtYSlcbiAgICogdGhhdCByZWxpZXMgb24gYGltcG9ydC5tZXRhLnVybGAgd29ya3MgY29ycmVjdGx5IGluIGJ1bmRsZWQgQ0pTIG91dHB1dC5cbiAgICovXG4gIHByaXZhdGUgZ2V0Q2pzSW1wb3J0TWV0YVBvbHlmaWxsKGZvcm1hdDogc3RyaW5nKToge1xuICAgIGJhbm5lcjogc3RyaW5nO1xuICAgIGRlZmluZTogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgfSB7XG4gICAgaWYgKGZvcm1hdCAhPT0gJ2NqcycpIHJldHVybiB7IGJhbm5lcjogJycsIGRlZmluZToge30gfTtcbiAgICByZXR1cm4ge1xuICAgICAgYmFubmVyOlxuICAgICAgICAndmFyIF9faW1wb3J0X21ldGFfdXJsID0gdHlwZW9mIF9fZmlsZW5hbWUgIT09IFwidW5kZWZpbmVkXCIgPyByZXF1aXJlKFwidXJsXCIpLnBhdGhUb0ZpbGVVUkwoX19maWxlbmFtZSkuaHJlZiA6IHVuZGVmaW5lZDtcXG4nICtcbiAgICAgICAgJ3ZhciBfX2ltcG9ydF9tZXRhX3Jlc29sdmUgPSB0eXBlb2YgcmVxdWlyZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiB0eXBlb2YgX19maWxlbmFtZSAhPT0gXCJ1bmRlZmluZWRcIiAnICtcbiAgICAgICAgJz8gKHMpID0+IHJlcXVpcmUoXCJ1cmxcIikucGF0aFRvRmlsZVVSTChyZXF1aXJlLnJlc29sdmUocykpLmhyZWYgOiB1bmRlZmluZWQ7XFxuJyxcbiAgICAgIGRlZmluZToge1xuICAgICAgICAnaW1wb3J0Lm1ldGEudXJsJzogJ19faW1wb3J0X21ldGFfdXJsJyxcbiAgICAgICAgJ2ltcG9ydC5tZXRhLnJlc29sdmUnOiAnX19pbXBvcnRfbWV0YV9yZXNvbHZlJyxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtcyB0aGUgY29tcGxldGUgYnVpbGQgcHJvY2VzcyBmb3Igd29ya2Zsb3dzLlxuICAgKiBTdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50IHRoaXMgdG8gZGVmaW5lIHRoZWlyIHNwZWNpZmljIGJ1aWxkIHN0ZXBzLlxuICAgKi9cbiAgYWJzdHJhY3QgYnVpbGQoKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogRmluZHMgdHNjb25maWcuanNvbi9qc2NvbmZpZy5qc29uIGZvciB0aGUgcHJvamVjdC5cbiAgICogVXNlZCBieSBlc2J1aWxkIHRvIHByb3Blcmx5IHJlc29sdmUgbW9kdWxlIGltcG9ydHMgZHVyaW5nIGJ1bmRsaW5nLlxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGZpbmRUc0NvbmZpZ1BhdGgoKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCBjd2QgPSB0aGlzLmNvbmZpZy53b3JraW5nRGlyIHx8IHByb2Nlc3MuY3dkKCk7XG4gICAgcmV0dXJuIGZpbmRVcChbJ3RzY29uZmlnLmpzb24nLCAnanNjb25maWcuanNvbiddLCB7IGN3ZCB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNjb3ZlcnMgYWxsIHNvdXJjZSBmaWxlcyBpbiB0aGUgY29uZmlndXJlZCBkaXJlY3Rvcmllcy5cbiAgICogU2VhcmNoZXMgZm9yIFR5cGVTY3JpcHQgYW5kIEphdmFTY3JpcHQgZmlsZXMgd2hpbGUgZXhjbHVkaW5nIGNvbW1vbiBidWlsZFxuICAgKiBhbmQgZGVwZW5kZW5jeSBkaXJlY3Rvcmllcy5cbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBnZXRJbnB1dEZpbGVzKCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBjb25zdCBpZ25vcmUgPSBbXG4gICAgICAnKiovbm9kZV9tb2R1bGVzLyoqJyxcbiAgICAgICcqKi8uZ2l0LyoqJyxcbiAgICAgICcqKi8ubmV4dC8qKicsXG4gICAgICAnKiovLm5pdHJvLyoqJyxcbiAgICAgICcqKi8ubnV4dC8qKicsXG4gICAgICAnKiovLm91dHB1dC8qKicsXG4gICAgICAnKiovLnZlcmNlbC8qKicsXG4gICAgICAnKiovLndvcmtmbG93LWRhdGEvKionLFxuICAgICAgJyoqLy53b3JrZmxvdy12aXRlc3QvKionLFxuICAgICAgJyoqLy53ZWxsLWtub3duL3dvcmtmbG93LyoqJyxcbiAgICAgICcqKi8uc3djLyoqJyxcbiAgICAgICcqKi8uc3ZlbHRlLWtpdC8qKicsXG4gICAgICAnKiovLnR1cmJvLyoqJyxcbiAgICAgICcqKi8uY2FjaGUvKionLFxuICAgICAgJyoqLy55YXJuLyoqJyxcbiAgICAgICcqKi8ucG5wbS1zdG9yZS8qKicsXG4gICAgXTtcblxuICAgIC8vIFVzZSByZWxhdGl2ZSBwYXR0ZXJucyB3aXRoIGBjd2RgIHBlciBkaXJlY3Rvcnkgc28gdGhhdCBgZG90OiB0cnVlYFxuICAgIC8vIGFwcGxpZXMgY29uc2lzdGVudGx5IHRvIGJvdGggdGhlIHNlYXJjaCBwYXR0ZXJuICphbmQqIHRoZSBpZ25vcmVcbiAgICAvLyBwYXR0ZXJucy4gV2hlbiBhYnNvbHV0ZSBwYXR0ZXJucyBhcmUgdXNlZCB3aXRoIHRpbnlnbG9iYnksIHRoZSBgKipgXG4gICAgLy8gaW4gaWdub3JlIHBhdHRlcm5zIGRvZXMgbm90IG1hdGNoIGRvdC1wcmVmaXhlZCBwYXRoIHNlZ21lbnRzLlxuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHRoaXMuY29uZmlnLmRpcnMubWFwKChkaXIpID0+IHtcbiAgICAgICAgY29uc3QgY3dkID0gcmVzb2x2ZSh0aGlzLmNvbmZpZy53b3JraW5nRGlyLCBkaXIpO1xuICAgICAgICByZXR1cm4gZ2xvYihbJyoqLyoue3RzLHRzeCxtdHMsY3RzLGpzLGpzeCxtanMsY2pzfSddLCB7XG4gICAgICAgICAgY3dkLFxuICAgICAgICAgIGlnbm9yZSxcbiAgICAgICAgICBhYnNvbHV0ZTogdHJ1ZSxcbiAgICAgICAgICBkb3Q6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgcmV0dXJuIHJlc3VsdHMuZmxhdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhY2hlcyBkaXNjb3ZlcmVkIHdvcmtmbG93IGVudHJpZXMgYnkgaW5wdXQgYXJyYXkgcmVmZXJlbmNlLlxuICAgKiBVc2VzIFdlYWtNYXAgdG8gYWxsb3cgZ2FyYmFnZSBjb2xsZWN0aW9uIHdoZW4gaW5wdXQgYXJyYXlzIGFyZSBubyBsb25nZXIgcmVmZXJlbmNlZC5cbiAgICogVGhpcyBjYWNoZSBpcyBpbnZhbGlkYXRlZCBhdXRvbWF0aWNhbGx5IHdoZW4gdGhlIGlucHV0cyBhcnJheSByZWZlcmVuY2UgY2hhbmdlc1xuICAgKiAoZS5nLiwgd2hlbiBmaWxlcyBhcmUgYWRkZWQvcmVtb3ZlZCBkdXJpbmcgd2F0Y2ggbW9kZSkuXG4gICAqL1xuICBwcml2YXRlIGRpc2NvdmVyZWRFbnRyaWVzOiBXZWFrTWFwPHN0cmluZ1tdLCBEaXNjb3ZlcmVkRW50cmllcz4gPVxuICAgIG5ldyBXZWFrTWFwKCk7XG5cbiAgcHVibGljIGNsZWFyRGlzY292ZXJlZEVudHJpZXNDYWNoZSgpOiB2b2lkIHtcbiAgICB0aGlzLmRpc2NvdmVyZWRFbnRyaWVzID0gbmV3IFdlYWtNYXAoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQc2V1ZG8tcGFja2FnZXMgdGhhdCBzaG91bGQgbm90IGJlIGNoZWNrZWQgZm9yIHdvcmtmbG93IHBhdHRlcm5zLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgUFNFVURPX1BBQ0tBR0VTID0gbmV3IFNldChbXG4gICAgJ3NlcnZlci1vbmx5JyxcbiAgICAnY2xpZW50LW9ubHknLFxuICBdKTtcblxuICAvKipcbiAgICogQ2hlY2tzIGVhY2ggcGFja2FnZSBpbiBleHRlcm5hbFBhY2thZ2VzIGZvciB3b3JrZmxvdyBwYXR0ZXJucyBhbmQgZW1pdHNcbiAgICogd2FybmluZ3MgaWYgYW55IGNvbnRhaW4gXCJ1c2Ugc3RlcFwiLCBcInVzZSB3b3JrZmxvd1wiIGRpcmVjdGl2ZXMsIG9yXG4gICAqIHNlcmlhbGl6YXRpb24gY2xhc3Nlcy4gVGhlc2UgcGF0dGVybnMgd2lsbCBub3QgYmUgdHJhbnNmb3JtZWQgYnkgdGhlXG4gICAqIHdvcmtmbG93IGNvbXBpbGVyIHdoZW4gdGhlIHBhY2thZ2UgaXMgZXh0ZXJuYWxpemVkLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB3YXJuQWJvdXRFeHRlcm5hbFdvcmtmbG93UGFja2FnZXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZXh0ZXJuYWxQYWNrYWdlcyA9IHRoaXMuY29uZmlnLmV4dGVybmFsUGFja2FnZXM7XG4gICAgaWYgKCFleHRlcm5hbFBhY2thZ2VzPy5sZW5ndGgpIHJldHVybjtcblxuICAgIGZvciAoY29uc3QgcGtnIG9mIGV4dGVybmFsUGFja2FnZXMpIHtcbiAgICAgIGlmIChCYXNlQnVpbGRlci5QU0VVRE9fUEFDS0FHRVMuaGFzKHBrZykpIGNvbnRpbnVlO1xuICAgICAgaWYgKHRoaXMud2FybmVkRXh0ZXJuYWxQYWNrYWdlcy5oYXMocGtnKSkgY29udGludWU7XG5cbiAgICAgIGlmIChcbiAgICAgICAgcGtnLnN0YXJ0c1dpdGgoJy4nKSB8fFxuICAgICAgICBwa2cuc3RhcnRzV2l0aCgnLycpIHx8XG4gICAgICAgIHBrZy5zdGFydHNXaXRoKCckJykgfHxcbiAgICAgICAgcGtnLmluY2x1ZGVzKCcqJykgfHxcbiAgICAgICAgcGtnLmluY2x1ZGVzKCc6JylcbiAgICAgICkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gQ2hlY2sgcGFja2FnZS5qc29uIGRlcGVuZGVuY2llcyBmb3IgQHdvcmtmbG93L3NlcmRlIChmYXN0IHBhdGgpXG4gICAgICAgIGxldCBoYXNXb3JrZmxvd1NlcmRlRGVwID0gZmFsc2U7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcGtnSnNvblBhdGggPSByZXF1aXJlLnJlc29sdmUoYCR7cGtnfS9wYWNrYWdlLmpzb25gLCB7XG4gICAgICAgICAgICBwYXRoczogW3RoaXMuY29uZmlnLndvcmtpbmdEaXJdLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGNvbnN0IHBrZ0pzb25Tb3VyY2UgPSBhd2FpdCByZWFkRmlsZShwa2dKc29uUGF0aCwgJ3V0Zi04Jyk7XG4gICAgICAgICAgY29uc3QgcGtnSnNvbiA9IEpTT04ucGFyc2UocGtnSnNvblNvdXJjZSkgYXMge1xuICAgICAgICAgICAgZGVwZW5kZW5jaWVzPzogdW5rbm93bjtcbiAgICAgICAgICAgIHBlZXJEZXBlbmRlbmNpZXM/OiB1bmtub3duO1xuICAgICAgICAgIH07XG4gICAgICAgICAgY29uc3QgZGVwZW5kZW5jaWVzID1cbiAgICAgICAgICAgIHR5cGVvZiBwa2dKc29uLmRlcGVuZGVuY2llcyA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgICAgIHBrZ0pzb24uZGVwZW5kZW5jaWVzICE9PSBudWxsICYmXG4gICAgICAgICAgICAhQXJyYXkuaXNBcnJheShwa2dKc29uLmRlcGVuZGVuY2llcylcbiAgICAgICAgICAgICAgPyAocGtnSnNvbi5kZXBlbmRlbmNpZXMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pXG4gICAgICAgICAgICAgIDoge307XG4gICAgICAgICAgY29uc3QgcGVlckRlcGVuZGVuY2llcyA9XG4gICAgICAgICAgICB0eXBlb2YgcGtnSnNvbi5wZWVyRGVwZW5kZW5jaWVzID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgICAgcGtnSnNvbi5wZWVyRGVwZW5kZW5jaWVzICE9PSBudWxsICYmXG4gICAgICAgICAgICAhQXJyYXkuaXNBcnJheShwa2dKc29uLnBlZXJEZXBlbmRlbmNpZXMpXG4gICAgICAgICAgICAgID8gKHBrZ0pzb24ucGVlckRlcGVuZGVuY2llcyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilcbiAgICAgICAgICAgICAgOiB7fTtcbiAgICAgICAgICBoYXNXb3JrZmxvd1NlcmRlRGVwID1cbiAgICAgICAgICAgIE9iamVjdC5oYXNPd24oZGVwZW5kZW5jaWVzLCAnQHdvcmtmbG93L3NlcmRlJykgfHxcbiAgICAgICAgICAgIE9iamVjdC5oYXNPd24ocGVlckRlcGVuZGVuY2llcywgJ0B3b3JrZmxvdy9zZXJkZScpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBwYWNrYWdlLmpzb24gbm90IHJlc29sdmFibGUgLSBjb250aW51ZSB0byBzb3VyY2UgY2hlY2tcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIHNvdXJjZSBwYXR0ZXJucyAodGhvcm91Z2ggcGF0aCkuXG4gICAgICAgIC8vIE5vdGU6IHJlcXVpcmUucmVzb2x2ZSBvbmx5IGluc3BlY3RzIHRoZSBwYWNrYWdlJ3MgbWFpbiBlbnRyeSBwb2ludC5cbiAgICAgICAgLy8gSWYgd29ya2Zsb3cgY29uc3RydWN0cyBsaXZlIGluIHN1Yi1wYXRocyAoZS5nLiBgbXktcGtnL3dvcmtmbG93c2ApLFxuICAgICAgICAvLyB0aGV5IHdvbid0IGJlIGRldGVjdGVkIGhlcmUuIFRoZSBAd29ya2Zsb3cvc2VyZGUgZGVwIGNoZWNrIGFib3ZlXG4gICAgICAgIC8vIHBhcnRpYWxseSBjb3ZlcnMgc2VyZGUgY2FzZXMuIFRoaXMgaXMgYWNjZXB0YWJsZSBhcyBhIGJlc3QtZWZmb3J0XG4gICAgICAgIC8vIGhldXJpc3RpYyDigJQgdGhlIHByaW1hcnkgZml4IGlzIGF1dG8tcmVtb3ZhbCBpbiB3aXRoV29ya2Zsb3coKS5cbiAgICAgICAgbGV0IGhhc1VzZVN0ZXAgPSBmYWxzZTtcbiAgICAgICAgbGV0IGhhc1VzZVdvcmtmbG93ID0gZmFsc2U7XG4gICAgICAgIGxldCBoYXNTZXJkZSA9IGhhc1dvcmtmbG93U2VyZGVEZXA7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgZW50cnlQYXRoID0gcmVxdWlyZS5yZXNvbHZlKHBrZywge1xuICAgICAgICAgICAgcGF0aHM6IFt0aGlzLmNvbmZpZy53b3JraW5nRGlyXSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjb25zdCBzb3VyY2UgPSBhd2FpdCByZWFkRmlsZShlbnRyeVBhdGgsICd1dGYtOCcpO1xuICAgICAgICAgIGNvbnN0IHBhdHRlcm5zID0gZGV0ZWN0V29ya2Zsb3dQYXR0ZXJucyhzb3VyY2UpO1xuICAgICAgICAgIGhhc1VzZVN0ZXAgPSBwYXR0ZXJucy5oYXNVc2VTdGVwO1xuICAgICAgICAgIGhhc1VzZVdvcmtmbG93ID0gcGF0dGVybnMuaGFzVXNlV29ya2Zsb3c7XG4gICAgICAgICAgaWYgKCFoYXNTZXJkZSkge1xuICAgICAgICAgICAgaGFzU2VyZGUgPSBwYXR0ZXJucy5oYXNTZXJkZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIEVudHJ5IGZpbGUgbm90IHJlc29sdmFibGUgb3Igbm90IHJlYWRhYmxlIC0gdXNlIHdoYXQgd2UgaGF2ZVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFoYXNVc2VTdGVwICYmICFoYXNVc2VXb3JrZmxvdyAmJiAhaGFzU2VyZGUpIGNvbnRpbnVlO1xuXG4gICAgICAgIC8vIEJ1aWxkIGEgc3BlY2lmaWMgZGVzY3JpcHRpb24gb2Ygd2hhdCB3YXMgZm91bmRcbiAgICAgICAgY29uc3QgaXNzdWVzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBpZiAoaGFzVXNlV29ya2Zsb3cpIGlzc3Vlcy5wdXNoKCdcInVzZSB3b3JrZmxvd1wiIGZ1bmN0aW9ucycpO1xuICAgICAgICBpZiAoaGFzVXNlU3RlcCkgaXNzdWVzLnB1c2goJ1widXNlIHN0ZXBcIiBmdW5jdGlvbnMnKTtcbiAgICAgICAgaWYgKGhhc1NlcmRlKSBpc3N1ZXMucHVzaCgnc2VyaWFsaXphdGlvbiBjbGFzc2VzJyk7XG5cbiAgICAgICAgdGhpcy53YXJuZWRFeHRlcm5hbFBhY2thZ2VzLmFkZChwa2cpO1xuXG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgXFxuJHtjaGFsay55ZWxsb3coJ+KaoCcpfSBXYXJuaW5nOiAke2NoYWxrLmJvbGQoYFwiJHtwa2d9XCJgKX0gaXMgbGlzdGVkIGluICR7Y2hhbGsuYm9sZCgnZXh0ZXJuYWxQYWNrYWdlcycpfSAoJHtjaGFsay5ib2xkKCdzZXJ2ZXJFeHRlcm5hbFBhY2thZ2VzJyl9IGluIE5leHQuanMpIGJ1dCBjb250YWlucyB3b3JrZmxvdyBjb2RlICgke2lzc3Vlcy5qb2luKCcsICcpfSkuYCArXG4gICAgICAgICAgICBgXFxuICBUaGlzIGNvZGUgd2lsbCAke2NoYWxrLmJvbGQoJ25vdCcpfSBiZSB0cmFuc2Zvcm1lZCBieSB0aGUgd29ya2Zsb3cgY29tcGlsZXIsIHdoaWNoIGNhbiBjYXVzZSBydW50aW1lIGZhaWx1cmVzLmAgK1xuICAgICAgICAgICAgYFxcbiAgUmVtb3ZlICR7Y2hhbGsuYm9sZChgXCIke3BrZ31cImApfSBmcm9tICR7Y2hhbGsuYm9sZCgnZXh0ZXJuYWxQYWNrYWdlcycpfSAoJHtjaGFsay5ib2xkKCdzZXJ2ZXJFeHRlcm5hbFBhY2thZ2VzJyl9IGluIE5leHQuanMpIHRvIGZpeCB0aGlzLlxcbmBcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBCZXN0LWVmZm9ydDogaWYgYW55dGhpbmcgZ29lcyB3cm9uZywgc2tpcCB0aGlzIHBhY2thZ2Ugc2lsZW50bHlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgZGlzY292ZXJFbnRyaWVzKFxuICAgIGlucHV0czogc3RyaW5nW10sXG4gICAgb3V0ZGlyOiBzdHJpbmcsXG4gICAgdHNjb25maWdQYXRoPzogc3RyaW5nXG4gICk6IFByb21pc2U8RGlzY292ZXJlZEVudHJpZXM+IHtcbiAgICBjb25zdCBwcmV2aW91c1Jlc3VsdCA9IHRoaXMuZGlzY292ZXJlZEVudHJpZXMuZ2V0KGlucHV0cyk7XG5cbiAgICBpZiAocHJldmlvdXNSZXN1bHQpIHtcbiAgICAgIHJldHVybiBwcmV2aW91c1Jlc3VsdDtcbiAgICB9XG4gICAgY29uc3Qgc3RhdGU6IERpc2NvdmVyZWRFbnRyaWVzID0ge1xuICAgICAgZGlzY292ZXJlZFN0ZXBzOiBuZXcgU2V0KCksXG4gICAgICBkaXNjb3ZlcmVkV29ya2Zsb3dzOiBuZXcgU2V0KCksXG4gICAgICBkaXNjb3ZlcmVkU2VyZGVGaWxlczogbmV3IFNldCgpLFxuICAgIH07XG5cbiAgICBjb25zdCBkaXNjb3ZlclN0YXJ0ID0gRGF0ZS5ub3coKTtcblxuICAgIC8vIFJlc29sdmUgdGhlIFNESyBydW50aW1lIHNlcmRlIGVudHJ5IHBvaW50IHNvIHRoYXQgdGhlIGRpc2NvdmVyeSBwYXNzXG4gICAgLy8gZGlzY292ZXJzIGNsYXNzZXMgbGlrZSBgUnVuYCB0aGF0IGxpdmUgaW5zaWRlIFNESyBwYWNrYWdlcy4gV2l0aG91dCB0aGlzLFxuICAgIC8vIGZpbGVzIGxpa2UgYHJ1bi5qc2AgYXJlIG9ubHkgZGlzY292ZXJlZCB3aGVuIHVzZXIgY29kZSBpbXBvcnRzIHRoZW0uXG4gICAgLy8gVGhpcyBpcyByZXNvbHZlZCBoZXJlIChyYXRoZXIgdGhhbiBpbiBjYWxsZXJzKSBzbyB0aGF0IHRoZSBvcmlnaW5hbFxuICAgIC8vIGBpbnB1dHNgIGFycmF5IHJlZmVyZW5jZSBpcyBwcmVzZXJ2ZWQgZm9yIFdlYWtNYXAgY2FjaGluZyDigJQgY2FsbGVyc1xuICAgIC8vIGxpa2UgY3JlYXRlV29ya2Zsb3dzQnVuZGxlIGFuZCBjcmVhdGVTdGVwc0J1bmRsZSBjYW4gc2hhcmUgdGhlIHNhbWVcbiAgICAvLyBjYWNoZSBlbnRyeSB3aGVuIHRoZXkgcGFzcyB0aGUgc2FtZSBpbnB1dEZpbGVzIGFycmF5LlxuICAgIGNvbnN0IHJlc29sdmVkV29ya2Zsb3dSdW50aW1lID0gYXdhaXQgZW5oYW5jZWRSZXNvbHZlKFxuICAgICAgb3V0ZGlyLFxuICAgICAgJ0B3b3JrZmxvdy9jb3JlL3J1bnRpbWUvcnVuJ1xuICAgICkuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgICBjb25zdCBlbnRyeVBvaW50cyA9IHJlc29sdmVkV29ya2Zsb3dSdW50aW1lXG4gICAgICA/IFsuLi5pbnB1dHMsIHJlc29sdmVkV29ya2Zsb3dSdW50aW1lXVxuICAgICAgOiBpbnB1dHM7XG5cbiAgICBjb25zdCBlZmZlY3RpdmVUc2NvbmZpZ1BhdGggPVxuICAgICAgdHNjb25maWdQYXRoID8/IChhd2FpdCB0aGlzLmZpbmRUc0NvbmZpZ1BhdGgoKSk7XG5cbiAgICBhd2FpdCBmYXN0RGlzY292ZXJFbnRyaWVzKHtcbiAgICAgIGVudHJ5UG9pbnRzLFxuICAgICAgc3RhdGUsXG4gICAgICBkZWZhdWx0VHNjb25maWdQYXRoOiBlZmZlY3RpdmVUc2NvbmZpZ1BhdGgsXG4gICAgICB3b3JraW5nRGlyOiB0aGlzLmNvbmZpZy53b3JraW5nRGlyLFxuICAgIH0pO1xuXG4gICAgdGhpcy5sb2dCYXNlQnVpbGRlckluZm8oXG4gICAgICBgRGlzY292ZXJpbmcgd29ya2Zsb3cgZGlyZWN0aXZlc2AsXG4gICAgICBgJHtEYXRlLm5vdygpIC0gZGlzY292ZXJTdGFydH1tc2BcbiAgICApO1xuXG4gICAgLy8gV2FybiBhYm91dCBleHRlcm5hbCBwYWNrYWdlcyB0aGF0IGNvbnRhaW4gd29ya2Zsb3cgY29kZVxuICAgIGF3YWl0IHRoaXMud2FybkFib3V0RXh0ZXJuYWxXb3JrZmxvd1BhY2thZ2VzKCk7XG5cbiAgICB0aGlzLmRpc2NvdmVyZWRFbnRyaWVzLnNldChpbnB1dHMsIHN0YXRlKTtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cblxuICAvKipcbiAgICogV3JpdGVzIGdlbmVyYXRlZCBmaWxlcyBhdG9taWNhbGx5IHdoZXJlIHBvc3NpYmxlLiBPbiBXaW5kb3dzLCBOZXh0LmpzIGNhblxuICAgKiBicmllZmx5IGhvbGQgZ2VuZXJhdGVkIHJvdXRlIGZpbGVzIG9wZW4gd2hpbGUgY29tcGlsaW5nIHRoZW0sIHdoaWNoIG1ha2VzXG4gICAqIHJlbmFtZS1vdmVyLWV4aXN0aW5nIGZhaWwgd2l0aCBFUEVSTS9FQUNDRVMuIEluIHRoYXQgY2FzZSwgZmFsbCBiYWNrIHRvIGFcbiAgICogZGlyZWN0IG92ZXJ3cml0ZSBzbyB3YXRjaCByZWJ1aWxkcyBjYW4gc3RpbGwgbWFrZSBwcm9ncmVzcy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgd3JpdGVHZW5lcmF0ZWRGaWxlKFxuICAgIHRhcmdldFBhdGg6IHN0cmluZyxcbiAgICBjb250ZW50OiBzdHJpbmdcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdGVtcFBhdGggPSBgJHt0YXJnZXRQYXRofS4ke3JhbmRvbVVVSUQoKX0udG1wYDtcbiAgICBhd2FpdCB3cml0ZUZpbGUodGVtcFBhdGgsIGNvbnRlbnQpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCByZW5hbWUodGVtcFBhdGgsIHRhcmdldFBhdGgpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBlcnJvckNvZGUgPVxuICAgICAgICBlcnJvciAmJiB0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmICdjb2RlJyBpbiBlcnJvclxuICAgICAgICAgID8gKGVycm9yIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbikuY29kZVxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgaWYgKFxuICAgICAgICBwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInICYmXG4gICAgICAgIChlcnJvckNvZGUgPT09ICdFUEVSTScgfHwgZXJyb3JDb2RlID09PSAnRUFDQ0VTJylcbiAgICAgICkge1xuICAgICAgICBhd2FpdCB3cml0ZUZpbGUodGFyZ2V0UGF0aCwgY29udGVudCk7XG4gICAgICAgIGF3YWl0IHJtKHRlbXBQYXRoLCB7IGZvcmNlOiB0cnVlIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogV3JpdGVzIGRlYnVnIGluZm9ybWF0aW9uIHRvIGEgSlNPTiBmaWxlIGZvciB0cm91Ymxlc2hvb3RpbmcgYnVpbGQgaXNzdWVzLlxuICAgKiBVc2VzIGF0b21pYyB3cml0ZSAodGVtcCBmaWxlICsgcmVuYW1lKSB0byBwcmV2ZW50IHJhY2UgY29uZGl0aW9ucyB3aGVuXG4gICAqIG11bHRpcGxlIGJ1aWxkcyBydW4gY29uY3VycmVudGx5LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB3cml0ZURlYnVnRmlsZShcbiAgICBvdXRmaWxlOiBzdHJpbmcsXG4gICAgZGVidWdEYXRhOiBvYmplY3QsXG4gICAgbWVyZ2U/OiBib29sZWFuXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHByZWZpeCA9IHRoaXMuY29uZmlnLmRlYnVnRmlsZVByZWZpeCB8fCAnJztcbiAgICBjb25zdCB0YXJnZXRQYXRoID0gYCR7ZGlybmFtZShvdXRmaWxlKX0vJHtwcmVmaXh9JHtiYXNlbmFtZShvdXRmaWxlKX0uZGVidWcuanNvbmA7XG4gICAgbGV0IGV4aXN0aW5nID0ge307XG5cbiAgICB0cnkge1xuICAgICAgaWYgKG1lcmdlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IHJlYWRGaWxlKHRhcmdldFBhdGgsICd1dGY4Jyk7XG4gICAgICAgICAgZXhpc3RpbmcgPSBKU09OLnBhcnNlKGNvbnRlbnQpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgLy8gRmlsZSBkb2Vzbid0IGV4aXN0IHlldCBvciBpcyBjb3JydXB0ZWQgLSBzdGFydCBmcmVzaC5cbiAgICAgICAgICAvLyBEb24ndCBsb2cgZXJyb3IgZm9yIEVOT0VOVCAoZmlsZSBub3QgZm91bmQpIGFzIHRoYXQncyBleHBlY3RlZCBvbiBmaXJzdCBydW4uXG4gICAgICAgICAgaWYgKChlIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbikuY29kZSAhPT0gJ0VOT0VOVCcpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignRXJyb3IgcmVhZGluZyBkZWJ1ZyBmaWxlLCBzdGFydGluZyBmcmVzaDonLCBlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgbWVyZ2VkRGF0YSA9IEpTT04uc3RyaW5naWZ5KFxuICAgICAgICB7XG4gICAgICAgICAgLi4uZXhpc3RpbmcsXG4gICAgICAgICAgLi4uZGVidWdEYXRhLFxuICAgICAgICB9LFxuICAgICAgICBudWxsLFxuICAgICAgICAyXG4gICAgICApO1xuXG4gICAgICBhd2FpdCB0aGlzLndyaXRlR2VuZXJhdGVkRmlsZSh0YXJnZXRQYXRoLCBtZXJnZWREYXRhKTtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgY29uc29sZS53YXJuKCdGYWlsZWQgdG8gd3JpdGUgZGVidWcgZmlsZTonLCBlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIExvZ3MgYW5kIG9wdGlvbmFsbHkgdGhyb3dzIG9uIGVzYnVpbGQgZXJyb3JzIGFuZCB3YXJuaW5ncy5cbiAgICogQHBhcmFtIHRocm93T25FcnJvciAtIElmIHRydWUsIHRocm93cyBhbiBlcnJvciB3aGVuIGVzYnVpbGQgZXJyb3JzIGFyZSBwcmVzZW50XG4gICAqL1xuICBwcml2YXRlIGxvZ0VzYnVpbGRNZXNzYWdlcyhcbiAgICByZXN1bHQ6IHsgZXJyb3JzPzogYW55W107IHdhcm5pbmdzPzogYW55W10gfSxcbiAgICBwaGFzZTogc3RyaW5nLFxuICAgIHRocm93T25FcnJvciA9IHRydWUsXG4gICAgb3B0aW9ucz86IHtcbiAgICAgIHN1cHByZXNzV2FybmluZ3M/OiBib29sZWFuO1xuICAgIH1cbiAgKTogdm9pZCB7XG4gICAgaWYgKHJlc3VsdC5lcnJvcnMgJiYgcmVzdWx0LmVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGDinYwgZXNidWlsZCBlcnJvcnMgaW4gJHtwaGFzZX06YCk7XG4gICAgICBjb25zdCBlcnJvck1lc3NhZ2VzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCBlcnJvciBvZiByZXN1bHQuZXJyb3JzKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYCAgJHtlcnJvci50ZXh0fWApO1xuICAgICAgICBlcnJvck1lc3NhZ2VzLnB1c2goZXJyb3IudGV4dCk7XG4gICAgICAgIGlmIChlcnJvci5sb2NhdGlvbikge1xuICAgICAgICAgIGNvbnN0IGxvY2F0aW9uID0gYCAgICBhdCAke2Vycm9yLmxvY2F0aW9uLmZpbGV9OiR7ZXJyb3IubG9jYXRpb24ubGluZX06JHtlcnJvci5sb2NhdGlvbi5jb2x1bW59YDtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGxvY2F0aW9uKTtcbiAgICAgICAgICBlcnJvck1lc3NhZ2VzLnB1c2gobG9jYXRpb24pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICh0aHJvd09uRXJyb3IpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBCdWlsZCBmYWlsZWQgZHVyaW5nICR7cGhhc2V9OlxcbiR7ZXJyb3JNZXNzYWdlcy5qb2luKCdcXG4nKX1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgIW9wdGlvbnM/LnN1cHByZXNzV2FybmluZ3MgJiZcbiAgICAgIHJlc3VsdC53YXJuaW5ncyAmJlxuICAgICAgcmVzdWx0Lndhcm5pbmdzLmxlbmd0aCA+IDBcbiAgICApIHtcbiAgICAgIGNvbnNvbGUud2FybihgISAgZXNidWlsZCB3YXJuaW5ncyBpbiAke3BoYXNlfTpgKTtcbiAgICAgIGZvciAoY29uc3Qgd2FybmluZyBvZiByZXN1bHQud2FybmluZ3MpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGAgICR7d2FybmluZy50ZXh0fWApO1xuICAgICAgICBpZiAod2FybmluZy5sb2NhdGlvbikge1xuICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgIGAgICAgYXQgJHt3YXJuaW5nLmxvY2F0aW9uLmZpbGV9OiR7d2FybmluZy5sb2NhdGlvbi5saW5lfToke3dhcm5pbmcubG9jYXRpb24uY29sdW1ufWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGFuIGFic29sdXRlIGZpbGUgcGF0aCB0byBhIG5vcm1hbGl6ZWQgcmVsYXRpdmUgcGF0aCBmb3IgdGhlIG1hbmlmZXN0LlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRSZWxhdGl2ZUZpbGVwYXRoKGFic29sdXRlUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBub3JtYWxpemVkRmlsZSA9IGFic29sdXRlUGF0aC5yZXBsYWNlKC9cXFxcL2csICcvJyk7XG4gICAgY29uc3Qgbm9ybWFsaXplZFdvcmtpbmdEaXIgPSB0aGlzLmNvbmZpZy53b3JraW5nRGlyLnJlcGxhY2UoL1xcXFwvZywgJy8nKTtcbiAgICBsZXQgcmVsYXRpdmVQYXRoID0gcmVsYXRpdmUobm9ybWFsaXplZFdvcmtpbmdEaXIsIG5vcm1hbGl6ZWRGaWxlKS5yZXBsYWNlKFxuICAgICAgL1xcXFwvZyxcbiAgICAgICcvJ1xuICAgICk7XG4gICAgLy8gSGFuZGxlIGZpbGVzIGRpc2NvdmVyZWQgb3V0c2lkZSB0aGUgd29ya2luZyBkaXJlY3RvcnlcbiAgICBpZiAocmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoJy4uLycpKSB7XG4gICAgICByZWxhdGl2ZVBhdGggPSByZWxhdGl2ZVBhdGhcbiAgICAgICAgLnNwbGl0KCcvJylcbiAgICAgICAgLmZpbHRlcigocGFydCkgPT4gcGFydCAhPT0gJy4uJylcbiAgICAgICAgLmpvaW4oJy8nKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlbGF0aXZlUGF0aDtcbiAgfVxuXG4gIHByb3RlY3RlZCBjcmVhdGVSb3V0ZUltcG9ydFNwZWNpZmllcihmaWxlOiBzdHJpbmcsIHJvdXRlRGlyOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHsgaW1wb3J0UGF0aCwgaXNQYWNrYWdlIH0gPSBnZXRJbXBvcnRQYXRoKFxuICAgICAgZmlsZSxcbiAgICAgIHRoaXMuY29uZmlnLndvcmtpbmdEaXJcbiAgICApO1xuICAgIGlmIChpc1BhY2thZ2UpIHtcbiAgICAgIHJldHVybiBpbXBvcnRQYXRoO1xuICAgIH1cblxuICAgIGxldCByZWxhdGl2ZVBhdGggPSByZWxhdGl2ZShyb3V0ZURpciwgZmlsZSkucmVwbGFjZSgvXFxcXC9nLCAnLycpO1xuICAgIGlmICghcmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoJy4vJykgJiYgIXJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKCcuLi8nKSkge1xuICAgICAgcmVsYXRpdmVQYXRoID0gYC4vJHtyZWxhdGl2ZVBhdGh9YDtcbiAgICB9XG4gICAgcmV0dXJuIHJlbGF0aXZlUGF0aDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY3JlYXRlU3RlcFNvdXJjZVJlZ2lzdHJhdGlvbkZpbGUoe1xuICAgIGlucHV0RmlsZXMsXG4gICAgb3V0ZmlsZSxcbiAgICB0c2NvbmZpZ1BhdGgsXG4gICAgZGlzY292ZXJlZEVudHJpZXMsXG4gIH06IHtcbiAgICBpbnB1dEZpbGVzOiBzdHJpbmdbXTtcbiAgICBvdXRmaWxlOiBzdHJpbmc7XG4gICAgdHNjb25maWdQYXRoPzogc3RyaW5nO1xuICAgIGRpc2NvdmVyZWRFbnRyaWVzPzogRGlzY292ZXJlZEVudHJpZXNJbnB1dDtcbiAgfSk6IFByb21pc2U8V29ya2Zsb3dNYW5pZmVzdD4ge1xuICAgIGNvbnN0IHN0ZXBzQnVuZGxlU3RhcnQgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IHdvcmtmbG93TWFuaWZlc3Q6IFdvcmtmbG93TWFuaWZlc3QgPSB7fTtcbiAgICBjb25zdCBidWlsdEluU3RlcHMgPSAnd29ya2Zsb3cvaW50ZXJuYWwvYnVpbHRpbnMnO1xuICAgIGNvbnN0IHJlc29sdmVkQnVpbHRJblN0ZXBzID0gKGF3YWl0IGVuaGFuY2VkUmVzb2x2ZShcbiAgICAgIGRpcm5hbWUob3V0ZmlsZSksXG4gICAgICBidWlsdEluU3RlcHNcbiAgICApLmNhdGNoKChlcnIpID0+IHtcbiAgICAgIHRocm93IG5ldyBXb3JrZmxvd0J1aWxkRXJyb3IoXG4gICAgICAgIGBGYWlsZWQgdG8gcmVzb2x2ZSBidWlsdC1pbiBzdGVwcyBzb3VyY2VzLlxcblxcbkNhdXNlZCBieTogJHtTdHJpbmcoZXJyKX1gLFxuICAgICAgICB7XG4gICAgICAgICAgaGludDogJ3J1biBgcG5wbSBpbnN0YWxsIHdvcmtmbG93YCB0byByZXNvbHZlIHRoaXMgaXNzdWUuJyxcbiAgICAgICAgICBjYXVzZTogZXJyLFxuICAgICAgICB9XG4gICAgICApO1xuICAgIH0pKSBhcyBzdHJpbmc7XG5cbiAgICBjb25zdCBkaXNjb3ZlcmVkID1cbiAgICAgIGRpc2NvdmVyZWRFbnRyaWVzID8/XG4gICAgICAoYXdhaXQgdGhpcy5kaXNjb3ZlckVudHJpZXMoaW5wdXRGaWxlcywgZGlybmFtZShvdXRmaWxlKSwgdHNjb25maWdQYXRoKSk7XG4gICAgY29uc3Qgc3RlcEZpbGVzID0gWy4uLmRpc2NvdmVyZWQuZGlzY292ZXJlZFN0ZXBzXS5zb3J0KCk7XG4gICAgY29uc3Qgd29ya2Zsb3dGaWxlcyA9IFsuLi5kaXNjb3ZlcmVkLmRpc2NvdmVyZWRXb3JrZmxvd3NdLnNvcnQoKTtcbiAgICBjb25zdCBzZXJkZUZpbGVzID0gWy4uLmRpc2NvdmVyZWQuZGlzY292ZXJlZFNlcmRlRmlsZXNdLnNvcnQoKTtcbiAgICBjb25zdCBzdGVwRmlsZXNTZXQgPSBuZXcgU2V0KHN0ZXBGaWxlcyk7XG4gICAgY29uc3Qgc2VyZGVPbmx5RmlsZXMgPSBzZXJkZUZpbGVzLmZpbHRlcigoZikgPT4gIXN0ZXBGaWxlc1NldC5oYXMoZikpO1xuXG4gICAgYXdhaXQgdGhpcy53cml0ZURlYnVnRmlsZShvdXRmaWxlLCB7XG4gICAgICBzdGVwRmlsZXMsXG4gICAgICB3b3JrZmxvd0ZpbGVzLFxuICAgICAgc2VyZGVPbmx5RmlsZXMsXG4gICAgICBzb3VyY2VJbXBvcnRzOiB0cnVlLFxuICAgIH0pO1xuXG4gICAgY29uc3QgZW1pdHRlZEltcG9ydElkZW50aXRpZXMgPSBuZXcgU2V0PHN0cmluZz4oW2J1aWx0SW5TdGVwc10pO1xuICAgIGNvbnN0IGltcG9ydFN0YXRlbWVudHM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3Qgcm91dGVEaXIgPSBkaXJuYW1lKG91dGZpbGUpO1xuICAgIGNvbnN0IGFkZFJlZ2lzdHJhdGlvbkltcG9ydCA9IChzcGVjaWZpZXI6IHN0cmluZyk6IHZvaWQgPT4ge1xuICAgICAgaW1wb3J0U3RhdGVtZW50cy5wdXNoKGBpbXBvcnQgJHtKU09OLnN0cmluZ2lmeShzcGVjaWZpZXIpfTtgKTtcbiAgICB9O1xuICAgIGNvbnN0IGFkZFJlZ2lzdHJhdGlvbkZpbGVJbXBvcnQgPSAoZmlsZTogc3RyaW5nKTogdm9pZCA9PiB7XG4gICAgICBjb25zdCBpZGVudGl0eSA9IG1vZHVsZUlkZW50aXR5S2V5KGZpbGUsIHRoaXMubW9kdWxlU3BlY2lmaWVyUm9vdCk7XG4gICAgICBpZiAoZW1pdHRlZEltcG9ydElkZW50aXRpZXMuaGFzKGlkZW50aXR5KSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBlbWl0dGVkSW1wb3J0SWRlbnRpdGllcy5hZGQoaWRlbnRpdHkpO1xuICAgICAgYWRkUmVnaXN0cmF0aW9uSW1wb3J0KHRoaXMuY3JlYXRlUm91dGVJbXBvcnRTcGVjaWZpZXIoZmlsZSwgcm91dGVEaXIpKTtcbiAgICB9O1xuXG4gICAgYWRkUmVnaXN0cmF0aW9uSW1wb3J0KGJ1aWx0SW5TdGVwcyk7XG4gICAgZm9yIChjb25zdCBmaWxlIG9mIHN0ZXBGaWxlcykge1xuICAgICAgYWRkUmVnaXN0cmF0aW9uRmlsZUltcG9ydChmaWxlKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBmaWxlIG9mIHNlcmRlT25seUZpbGVzKSB7XG4gICAgICBhZGRSZWdpc3RyYXRpb25GaWxlSW1wb3J0KGZpbGUpO1xuICAgIH1cblxuICAgIGNvbnN0IG91dHB1dCA9IGAvLyBiaW9tZS1pZ25vcmUtYWxsIGxpbnQ6IGdlbmVyYXRlZCBmaWxlXG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xuJHtpbXBvcnRTdGF0ZW1lbnRzLmpvaW4oJ1xcbicpfVxuXG5leHBvcnQgY29uc3QgX19zdGVwc19yZWdpc3RlcmVkID0gdHJ1ZTtcbmA7XG4gICAgYXdhaXQgbWtkaXIoZGlybmFtZShvdXRmaWxlKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgYXdhaXQgdGhpcy53cml0ZUdlbmVyYXRlZEZpbGUob3V0ZmlsZSwgb3V0cHV0KTtcblxuICAgIGNvbnN0IG1hbmlmZXN0RmlsZXMgPSBBcnJheS5mcm9tKFxuICAgICAgbmV3IFNldChbLi4uc3RlcEZpbGVzLCAuLi5zZXJkZU9ubHlGaWxlcywgcmVzb2x2ZWRCdWlsdEluU3RlcHNdKVxuICAgICkuc29ydCgpO1xuICAgIGNvbnN0IHN0ZXBJZHMgPSBuZXcgTWFwPHN0cmluZywgTWFuaWZlc3RFbnRyeUxvY2F0aW9uPigpO1xuICAgIGNvbnN0IHdvcmtmbG93SWRzID0gbmV3IE1hcDxzdHJpbmcsIE1hbmlmZXN0RW50cnlMb2NhdGlvbj4oKTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIG1hbmlmZXN0RmlsZXMubWFwKGFzeW5jIChmaWxlKSA9PiB7XG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IGF3YWl0IHJlYWRGaWxlKGZpbGUsICd1dGY4Jyk7XG4gICAgICAgIGNvbnN0IHJlbGF0aXZlRmlsZXBhdGggPSB0aGlzLmdldFJlbGF0aXZlRmlsZXBhdGgoZmlsZSk7XG4gICAgICAgIGNvbnN0IHsgd29ya2Zsb3dNYW5pZmVzdDogZmlsZU1hbmlmZXN0IH0gPSBhd2FpdCBhcHBseVN3Y1RyYW5zZm9ybShcbiAgICAgICAgICByZWxhdGl2ZUZpbGVwYXRoLFxuICAgICAgICAgIHNvdXJjZSxcbiAgICAgICAgICAnc3RlcCcsXG4gICAgICAgICAgZmlsZSxcbiAgICAgICAgICB0aGlzLnRyYW5zZm9ybVByb2plY3RSb290LFxuICAgICAgICAgIHRoaXMubW9kdWxlU3BlY2lmaWVyUm9vdFxuICAgICAgICApO1xuICAgICAgICBtZXJnZVdvcmtmbG93TWFuaWZlc3QoXG4gICAgICAgICAgd29ya2Zsb3dNYW5pZmVzdCxcbiAgICAgICAgICBmaWxlTWFuaWZlc3QsXG4gICAgICAgICAgc3RlcElkcyxcbiAgICAgICAgICB3b3JrZmxvd0lkc1xuICAgICAgICApO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgYXdhaXQgdGhpcy5lbnN1cmVTd2NJZ25vcmVkKCk7XG4gICAgdGhpcy5sb2dCYXNlQnVpbGRlckluZm8oXG4gICAgICAnQ3JlYXRlZCBzdGVwIHJlZ2lzdHJhdGlvbnMnLFxuICAgICAgYCR7RGF0ZS5ub3coKSAtIHN0ZXBzQnVuZGxlU3RhcnR9bXNgXG4gICAgKTtcbiAgICByZXR1cm4gd29ya2Zsb3dNYW5pZmVzdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgYnVuZGxlIGZvciB3b3JrZmxvdyBzdGVwIGZ1bmN0aW9ucy5cbiAgICogU3RlcHMgaGF2ZSBmdWxsIE5vZGUuanMgcnVudGltZSBhY2Nlc3MgYW5kIGhhbmRsZSBzaWRlIGVmZmVjdHMsIEFQSSBjYWxscywgZXRjLlxuICAgKlxuICAgKiBAcGFyYW0gZXh0ZXJuYWxpemVOb25TdGVwcyAtIElmIHRydWUsIG9ubHkgYnVuZGxlcyBzdGVwIGVudHJ5IHBvaW50cyBhbmQgZXh0ZXJuYWxpemVzIG90aGVyIGNvZGVcbiAgICogQHBhcmFtIHNvdXJjZVN0ZXBSZWdpc3RyYXRpb25JbXBvcnRzIC0gSWYgdHJ1ZSwgZW1pdHMgYSBzb3VyY2UgaW1wb3J0IHJlZ2lzdHJhdGlvbiBmaWxlIGluc3RlYWQgb2YgYnVuZGxpbmcgc3RlcCByZWdpc3RyYXRpb25zXG4gICAqIEBwYXJhbSBidW5kbGVUcmFuc2l0aXZlTG9jYWxTdGVwRGVwZW5kZW5jaWVzIC0gSWYgdHJ1ZSwgYWxzbyBidW5kbGVzIHByb2plY3QtbG9jYWwgZmlsZXMgaW1wb3J0ZWQgYnkgc3RlcCBlbnRyaWVzIGZvciBkaXJlY3QgcnVudGltZSBsb2FkaW5nXG4gICAqIEByZXR1cm5zIEJ1aWxkIGNvbnRleHQgKGZvciB3YXRjaCBtb2RlKSBhbmQgdGhlIGNvbGxlY3RlZCB3b3JrZmxvdyBtYW5pZmVzdFxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGNyZWF0ZVN0ZXBzQnVuZGxlKHtcbiAgICBpbnB1dEZpbGVzLFxuICAgIGZvcm1hdCA9ICdjanMnLFxuICAgIG91dGZpbGUsXG4gICAgZXh0ZXJuYWxpemVOb25TdGVwcyxcbiAgICBidW5kbGVUcmFuc2l0aXZlTG9jYWxTdGVwRGVwZW5kZW5jaWVzLFxuICAgIHNvdXJjZVN0ZXBSZWdpc3RyYXRpb25JbXBvcnRzLFxuICAgIHJld3JpdGVUc0V4dGVuc2lvbnMsXG4gICAgdHNjb25maWdQYXRoLFxuICAgIGRpc2NvdmVyZWRFbnRyaWVzLFxuICB9OiB7XG4gICAgdHNjb25maWdQYXRoPzogc3RyaW5nO1xuICAgIGlucHV0RmlsZXM6IHN0cmluZ1tdO1xuICAgIG91dGZpbGU6IHN0cmluZztcbiAgICBmb3JtYXQ/OiAnY2pzJyB8ICdlc20nO1xuICAgIGV4dGVybmFsaXplTm9uU3RlcHM/OiBib29sZWFuO1xuICAgIGJ1bmRsZVRyYW5zaXRpdmVMb2NhbFN0ZXBEZXBlbmRlbmNpZXM/OiBib29sZWFuO1xuICAgIHNvdXJjZVN0ZXBSZWdpc3RyYXRpb25JbXBvcnRzPzogYm9vbGVhbjtcbiAgICByZXdyaXRlVHNFeHRlbnNpb25zPzogYm9vbGVhbjtcbiAgICBkaXNjb3ZlcmVkRW50cmllcz86IERpc2NvdmVyZWRFbnRyaWVzSW5wdXQ7XG4gIH0pOiBQcm9taXNlPHtcbiAgICBjb250ZXh0OiBlc2J1aWxkLkJ1aWxkQ29udGV4dCB8IHVuZGVmaW5lZDtcbiAgICBtYW5pZmVzdDogV29ya2Zsb3dNYW5pZmVzdDtcbiAgfT4ge1xuICAgIC8vIFRoZXNlIG5lZWQgdG8gaGFuZGxlIHdhdGNoaW5nIGZvciBkZXYgdG8gc2NhbiBmb3JcbiAgICAvLyBuZXcgZW50cmllcyBhbmQgY2hhbmdlcyB0byBleGlzdGluZyBvbmVzXG4gICAgY29uc3QgZGlzY292ZXJlZCA9XG4gICAgICBkaXNjb3ZlcmVkRW50cmllcyA/P1xuICAgICAgKGF3YWl0IHRoaXMuZGlzY292ZXJFbnRyaWVzKGlucHV0RmlsZXMsIGRpcm5hbWUob3V0ZmlsZSksIHRzY29uZmlnUGF0aCkpO1xuICAgIGNvbnN0IHN0ZXBGaWxlcyA9IFsuLi5kaXNjb3ZlcmVkLmRpc2NvdmVyZWRTdGVwc10uc29ydCgpO1xuICAgIGNvbnN0IHdvcmtmbG93RmlsZXMgPSBbLi4uZGlzY292ZXJlZC5kaXNjb3ZlcmVkV29ya2Zsb3dzXS5zb3J0KCk7XG4gICAgY29uc3Qgc2VyZGVGaWxlcyA9IFsuLi5kaXNjb3ZlcmVkLmRpc2NvdmVyZWRTZXJkZUZpbGVzXS5zb3J0KCk7XG5cbiAgICAvLyBJbmNsdWRlIHNlcmRlIGZpbGVzIHRoYXQgYXJlbid0IGFscmVhZHkgc3RlcCBmaWxlcyBmb3IgY3Jvc3MtY29udGV4dCBjbGFzcyByZWdpc3RyYXRpb24uXG4gICAgLy8gQ2xhc3NlcyBuZWVkIHRvIGJlIHJlZ2lzdGVyZWQgaW4gdGhlIHN0ZXAgYnVuZGxlIHNvIHRoZXkgY2FuIGJlIGRlc2VyaWFsaXplZFxuICAgIC8vIHdoZW4gcmVjZWl2aW5nIGRhdGEgZnJvbSB3b3JrZmxvd3MgYW5kIHNlcmlhbGl6ZWQgd2hlbiByZXR1cm5pbmcgZGF0YSB0byB3b3JrZmxvd3MuXG4gICAgY29uc3Qgc3RlcEZpbGVzU2V0ID0gbmV3IFNldChzdGVwRmlsZXMpO1xuICAgIGNvbnN0IHNlcmRlT25seUZpbGVzID0gc2VyZGVGaWxlcy5maWx0ZXIoKGYpID0+ICFzdGVwRmlsZXNTZXQuaGFzKGYpKTtcblxuICAgIGlmIChcbiAgICAgIHNvdXJjZVN0ZXBSZWdpc3RyYXRpb25JbXBvcnRzICYmXG4gICAgICBleHRlcm5hbGl6ZU5vblN0ZXBzICYmXG4gICAgICAhYnVuZGxlVHJhbnNpdGl2ZUxvY2FsU3RlcERlcGVuZGVuY2llc1xuICAgICkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGV4dDogdW5kZWZpbmVkLFxuICAgICAgICBtYW5pZmVzdDogYXdhaXQgdGhpcy5jcmVhdGVTdGVwU291cmNlUmVnaXN0cmF0aW9uRmlsZSh7XG4gICAgICAgICAgaW5wdXRGaWxlcyxcbiAgICAgICAgICBvdXRmaWxlLFxuICAgICAgICAgIHRzY29uZmlnUGF0aCxcbiAgICAgICAgICBkaXNjb3ZlcmVkRW50cmllczogZGlzY292ZXJlZCxcbiAgICAgICAgfSksXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIGxvZyB0aGUgc3RlcCBmaWxlcyBmb3IgZGVidWdnaW5nXG4gICAgYXdhaXQgdGhpcy53cml0ZURlYnVnRmlsZShvdXRmaWxlLCB7XG4gICAgICBzdGVwRmlsZXMsXG4gICAgICB3b3JrZmxvd0ZpbGVzLFxuICAgICAgc2VyZGVPbmx5RmlsZXMsXG4gICAgfSk7XG5cbiAgICBjb25zdCBzdGVwc0J1bmRsZVN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCB3b3JrZmxvd01hbmlmZXN0OiBXb3JrZmxvd01hbmlmZXN0ID0ge307XG4gICAgY29uc3QgYnVpbHRJblN0ZXBzID0gJ3dvcmtmbG93L2ludGVybmFsL2J1aWx0aW5zJztcblxuICAgIGNvbnN0IHJlc29sdmVkQnVpbHRJblN0ZXBzID0gYXdhaXQgZW5oYW5jZWRSZXNvbHZlKFxuICAgICAgZGlybmFtZShvdXRmaWxlKSxcbiAgICAgICd3b3JrZmxvdy9pbnRlcm5hbC9idWlsdGlucydcbiAgICApLmNhdGNoKChlcnIpID0+IHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgW1xuICAgICAgICAgIGNoYWxrLnJlZCgnRmFpbGVkIHRvIHJlc29sdmUgYnVpbHQtaW4gc3RlcHMgc291cmNlcy4nKSxcbiAgICAgICAgICBgJHtjaGFsay55ZWxsb3cuYm9sZCgnaGludDonKX0gcnVuIFxcYCR7Y2hhbGsuY3lhbi5pdGFsaWMoJ25wbSBpbnN0YWxsIHdvcmtmbG93Jyl9XFxgIHRvIHJlc29sdmUgdGhpcyBpc3N1ZS5gLFxuICAgICAgICAgICcnLFxuICAgICAgICAgIGBDYXVzZWQgYnk6ICR7Y2hhbGsucmVkKFN0cmluZyhlcnIpKX1gLFxuICAgICAgICBdLmpvaW4oJ1xcbicpXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgLy8gSGVscGVyIHRvIGNyZWF0ZSBpbXBvcnQgc3RhdGVtZW50IGZyb20gZmlsZSBwYXRoXG4gICAgLy8gRm9yIHdvcmtzcGFjZS9ub2RlX21vZHVsZXMgcGFja2FnZXMsIHVzZXMgdGhlIHBhY2thZ2UgbmFtZSBzbyBlc2J1aWxkXG4gICAgLy8gd2lsbCByZXNvbHZlIHRocm91Z2ggcGFja2FnZS5qc29uIGV4cG9ydHMgd2l0aCB0aGUgYXBwcm9wcmlhdGUgY29uZGl0aW9uc1xuICAgIGNvbnN0IGNyZWF0ZUltcG9ydCA9IChmaWxlOiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IHsgaW1wb3J0UGF0aCwgaXNQYWNrYWdlIH0gPSBnZXRJbXBvcnRQYXRoKFxuICAgICAgICBmaWxlLFxuICAgICAgICB0aGlzLmNvbmZpZy53b3JraW5nRGlyXG4gICAgICApO1xuXG4gICAgICBpZiAoaXNQYWNrYWdlKSB7XG4gICAgICAgIC8vIFVzZSBwYWNrYWdlIG5hbWUgLSBlc2J1aWxkIHdpbGwgcmVzb2x2ZSB2aWEgcGFja2FnZS5qc29uIGV4cG9ydHNcbiAgICAgICAgcmV0dXJuIGBpbXBvcnQgJyR7aW1wb3J0UGF0aH0nO2A7XG4gICAgICB9XG5cbiAgICAgIC8vIExvY2FsIGFwcCBmaWxlIC0gdXNlIHJlbGF0aXZlIHBhdGhcbiAgICAgIC8vIE5vcm1hbGl6ZSBib3RoIHBhdGhzIHRvIGZvcndhcmQgc2xhc2hlcyBiZWZvcmUgY2FsbGluZyByZWxhdGl2ZSgpXG4gICAgICAvLyBUaGlzIGlzIGNyaXRpY2FsIG9uIFdpbmRvd3Mgd2hlcmUgcmVsYXRpdmUoKSBjYW4gcHJvZHVjZSB1bmV4cGVjdGVkIHJlc3VsdHMgd2l0aCBtaXhlZCBwYXRoIGZvcm1hdHNcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRXb3JraW5nRGlyID0gdGhpcy5jb25maWcud29ya2luZ0Rpci5yZXBsYWNlKC9cXFxcL2csICcvJyk7XG4gICAgICBjb25zdCBub3JtYWxpemVkRmlsZSA9IGZpbGUucmVwbGFjZSgvXFxcXC9nLCAnLycpO1xuICAgICAgLy8gQ2FsY3VsYXRlIHJlbGF0aXZlIHBhdGggZnJvbSB3b3JraW5nIGRpcmVjdG9yeSB0byB0aGUgZmlsZVxuICAgICAgbGV0IHJlbGF0aXZlUGF0aCA9IHJlbGF0aXZlKG5vcm1hbGl6ZWRXb3JraW5nRGlyLCBub3JtYWxpemVkRmlsZSkucmVwbGFjZShcbiAgICAgICAgL1xcXFwvZyxcbiAgICAgICAgJy8nXG4gICAgICApO1xuICAgICAgLy8gRW5zdXJlIHJlbGF0aXZlIHBhdGhzIHN0YXJ0IHdpdGggLi8gc28gZXNidWlsZCByZXNvbHZlcyB0aGVtIGNvcnJlY3RseS5cbiAgICAgIC8vIFBhdGhzIGxpa2UgXCIub3V0cHV0Ly4uLlwiIGFyZSBub3QgdmFsaWQgcmVsYXRpdmUgc3BlY2lmaWVycyBhbmQgbXVzdFxuICAgICAgLy8gYmVjb21lIFwiLi8ub3V0cHV0Ly4uLlwiLlxuICAgICAgaWYgKCFyZWxhdGl2ZVBhdGguc3RhcnRzV2l0aCgnLi8nKSAmJiAhcmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoJy4uLycpKSB7XG4gICAgICAgIHJlbGF0aXZlUGF0aCA9IGAuLyR7cmVsYXRpdmVQYXRofWA7XG4gICAgICB9XG4gICAgICByZXR1cm4gYGltcG9ydCAnJHtyZWxhdGl2ZVBhdGh9JztgO1xuICAgIH07XG5cbiAgICAvLyBDcmVhdGUgYSB2aXJ0dWFsIGVudHJ5IHRoYXQgaW1wb3J0cyBhbGwgZmlsZXMuIEFsbCBzdGVwIGRlZmluaXRpb25zXG4gICAgLy8gd2lsbCBnZXQgcmVnaXN0ZXJlZCB0aGFua3MgdG8gdGhlIHN3YyB0cmFuc2Zvcm0uXG4gICAgY29uc3Qgc3RlcEltcG9ydHMgPSBzdGVwRmlsZXMubWFwKGNyZWF0ZUltcG9ydCkuam9pbignXFxuJyk7XG5cbiAgICAvLyBJbmNsdWRlIHNlcmRlLW9ubHkgZmlsZXMgZm9yIGNsYXNzIHJlZ2lzdHJhdGlvbiBzaWRlIGVmZmVjdHNcbiAgICBjb25zdCBzZXJkZUltcG9ydHMgPSBzZXJkZU9ubHlGaWxlcy5tYXAoY3JlYXRlSW1wb3J0KS5qb2luKCdcXG4nKTtcblxuICAgIGNvbnN0IGVudHJ5Q29udGVudCA9IGBcbiAgICAvLyBCdWlsdCBpbiBzdGVwc1xuICAgIGltcG9ydCAnJHtidWlsdEluU3RlcHN9JztcbiAgICAvLyBVc2VyIHN0ZXBzXG4gICAgJHtzdGVwSW1wb3J0c31cbiAgICAvLyBTZXJkZSBmaWxlcyBmb3IgY3Jvc3MtY29udGV4dCBjbGFzcyByZWdpc3RyYXRpb25cbiAgICAke3NlcmRlSW1wb3J0c31cbiAgICAvLyBBUEkgZW50cnlwb2ludFxuICAgIGV4cG9ydCB7IHN0ZXBFbnRyeXBvaW50IGFzIEhFQUQsIHN0ZXBFbnRyeXBvaW50IGFzIFBPU1QgfSBmcm9tICd3b3JrZmxvdy9ydW50aW1lJztgO1xuXG4gICAgLy8gQnVuZGxlIHdpdGggZXNidWlsZCBhbmQgb3VyIGN1c3RvbSBTV0MgcGx1Z2luXG4gICAgY29uc3QgZW50cmllc1RvQnVuZGxlID0gZXh0ZXJuYWxpemVOb25TdGVwc1xuICAgICAgPyBbXG4gICAgICAgICAgLi4uc3RlcEZpbGVzLFxuICAgICAgICAgIC4uLnNlcmRlRmlsZXMsXG4gICAgICAgICAgLi4uKHJlc29sdmVkQnVpbHRJblN0ZXBzID8gW3Jlc29sdmVkQnVpbHRJblN0ZXBzXSA6IFtdKSxcbiAgICAgICAgXVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3Qgbm9ybWFsaXplZEVudHJpZXNUb0J1bmRsZSA9IGVudHJpZXNUb0J1bmRsZVxuICAgICAgPyBhd2FpdCB3aXRoUmVhbHBhdGhzKGVudHJpZXNUb0J1bmRsZSlcbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRTaWRlRWZmZWN0RW50cmllcyA9IGF3YWl0IHdpdGhSZWFscGF0aHMoW1xuICAgICAgLi4uc3RlcEZpbGVzLFxuICAgICAgLi4uc2VyZGVPbmx5RmlsZXMsXG4gICAgICAuLi4ocmVzb2x2ZWRCdWlsdEluU3RlcHMgPyBbcmVzb2x2ZWRCdWlsdEluU3RlcHNdIDogW10pLFxuICAgIF0pO1xuICAgIGNvbnN0IGVzYnVpbGRUc2NvbmZpZ09wdGlvbnMgPVxuICAgICAgYXdhaXQgZ2V0RXNidWlsZFRzY29uZmlnT3B0aW9ucyh0c2NvbmZpZ1BhdGgpO1xuICAgIGNvbnN0IHsgYmFubmVyOiBpbXBvcnRNZXRhQmFubmVyLCBkZWZpbmU6IGltcG9ydE1ldGFEZWZpbmUgfSA9XG4gICAgICB0aGlzLmdldENqc0ltcG9ydE1ldGFQb2x5ZmlsbChmb3JtYXQpO1xuXG4gICAgY29uc3QgZXNidWlsZEN0eCA9IGF3YWl0IGVzYnVpbGQuY29udGV4dCh7XG4gICAgICBiYW5uZXI6IHtcbiAgICAgICAganM6IGAvLyBiaW9tZS1pZ25vcmUtYWxsIGxpbnQ6IGdlbmVyYXRlZCBmaWxlXFxuLyogZXNsaW50LWRpc2FibGUgKi9cXG4ke2ltcG9ydE1ldGFCYW5uZXJ9YCxcbiAgICAgIH0sXG4gICAgICBzdGRpbjoge1xuICAgICAgICBjb250ZW50czogZW50cnlDb250ZW50LFxuICAgICAgICByZXNvbHZlRGlyOiB0aGlzLmNvbmZpZy53b3JraW5nRGlyLFxuICAgICAgICBzb3VyY2VmaWxlOiAndmlydHVhbC1lbnRyeS5qcycsXG4gICAgICAgIGxvYWRlcjogJ2pzJyxcbiAgICAgIH0sXG4gICAgICBvdXRmaWxlLFxuICAgICAgYWJzV29ya2luZ0RpcjogdGhpcy5jb25maWcud29ya2luZ0RpcixcbiAgICAgIGJ1bmRsZTogdHJ1ZSxcbiAgICAgIGZvcm1hdCxcbiAgICAgIHBsYXRmb3JtOiAnbm9kZScsXG4gICAgICBjb25kaXRpb25zOiBbJ25vZGUnXSxcbiAgICAgIHRhcmdldDogJ2VzMjAyMicsXG4gICAgICB3cml0ZTogdHJ1ZSxcbiAgICAgIHRyZWVTaGFraW5nOiB0cnVlLFxuICAgICAga2VlcE5hbWVzOiB0cnVlLFxuICAgICAgbWluaWZ5OiBmYWxzZSxcbiAgICAgIGpzeDogJ3ByZXNlcnZlJyxcbiAgICAgIGxvZ0xldmVsOiAnZXJyb3InLFxuICAgICAgLy8gVXNlIHRzY29uZmlnIGZvciBwYXRoIGFsaWFzIHJlc29sdXRpb24uXG4gICAgICAvLyBGb3Igc3ltbGlua2VkIGNvbmZpZ3MgdGhpcyB1c2VzIHRzY29uZmlnUmF3IHRvIHByZXNlcnZlIGN3ZC1yZWxhdGl2ZSBhbGlhc2VzLlxuICAgICAgLi4uZXNidWlsZFRzY29uZmlnT3B0aW9ucyxcbiAgICAgIGRlZmluZTogaW1wb3J0TWV0YURlZmluZSxcbiAgICAgIHJlc29sdmVFeHRlbnNpb25zOiBbXG4gICAgICAgICcudHMnLFxuICAgICAgICAnLnRzeCcsXG4gICAgICAgICcubXRzJyxcbiAgICAgICAgJy5jdHMnLFxuICAgICAgICAnLmpzJyxcbiAgICAgICAgJy5qc3gnLFxuICAgICAgICAnLm1qcycsXG4gICAgICAgICcuY2pzJyxcbiAgICAgIF0sXG4gICAgICAvLyBJbmxpbmUgc291cmNlIG1hcHMgZm9yIGJldHRlciBzdGFjayB0cmFjZXMgaW4gc3RlcCBleGVjdXRpb24uXG4gICAgICAvLyBTdGVwcyBleGVjdXRlIGluIE5vZGUuanMgY29udGV4dCBhbmQgaW5saW5lIHNvdXJjZW1hcHMgZW5zdXJlIHdlIGdldFxuICAgICAgLy8gbWVhbmluZ2Z1bCBzdGFjayB0cmFjZXMgd2l0aCBwcm9wZXIgZmlsZSBuYW1lcyBhbmQgbGluZSBudW1iZXJzIHdoZW4gZXJyb3JzXG4gICAgICAvLyBvY2N1ciBpbiBkZWVwbHkgbmVzdGVkIGZ1bmN0aW9uIGNhbGxzIGFjcm9zcyBtdWx0aXBsZSBmaWxlcy5cbiAgICAgIHNvdXJjZW1hcDogJ2lubGluZScsXG4gICAgICBwbHVnaW5zOiBbXG4gICAgICAgIC8vIEhhbmRsZSBwc2V1ZG8tcGFja2FnZXMgbGlrZSAnc2VydmVyLW9ubHknIGFuZCAnY2xpZW50LW9ubHknIGJ5IHByb3ZpZGluZ1xuICAgICAgICAvLyBlbXB0eSBtb2R1bGVzLiBNdXN0IHJ1biBmaXJzdCB0byBpbnRlcmNlcHQgdGhlc2UgYmVmb3JlIG90aGVyIHJlc29sdXRpb24uXG4gICAgICAgIGNyZWF0ZVBzZXVkb1BhY2thZ2VQbHVnaW4oKSxcbiAgICAgICAgY3JlYXRlU3djUGx1Z2luKHtcbiAgICAgICAgICBtb2RlOiAnc3RlcCcsXG4gICAgICAgICAgZW50cmllc1RvQnVuZGxlOiBub3JtYWxpemVkRW50cmllc1RvQnVuZGxlLFxuICAgICAgICAgIG91dGRpcjogb3V0ZmlsZSA/IGRpcm5hbWUob3V0ZmlsZSkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgcHJvamVjdFJvb3Q6IHRoaXMudHJhbnNmb3JtUHJvamVjdFJvb3QsXG4gICAgICAgICAgbW9kdWxlU3BlY2lmaWVyUm9vdDogdGhpcy5tb2R1bGVTcGVjaWZpZXJSb290LFxuICAgICAgICAgIHdvcmtmbG93TWFuaWZlc3QsXG4gICAgICAgICAgYnVuZGxlVHJhbnNpdGl2ZUxvY2FsU3RlcERlcGVuZGVuY2llcyxcbiAgICAgICAgICByZXdyaXRlVHNFeHRlbnNpb25zLFxuICAgICAgICAgIHNpZGVFZmZlY3RFbnRyaWVzOiBub3JtYWxpemVkU2lkZUVmZmVjdEVudHJpZXMsXG4gICAgICAgIH0pLFxuICAgICAgXSxcbiAgICAgIC8vIFBsdWdpbiBzaG91bGQgY2F0Y2ggbW9zdCB0aGluZ3MsIGJ1dCB0aGlzIGxldHMgdXNlcnMgaGFyZCBvdmVycmlkZVxuICAgICAgLy8gaWYgdGhlIHBsdWdpbiBtaXNzZXMgYW55dGhpbmcgdGhhdCBzaG91bGQgYmUgZXh0ZXJuYWxpemVkXG4gICAgICBleHRlcm5hbDogWydidW4nLCAnYnVuOionLCAuLi4odGhpcy5jb25maWcuZXh0ZXJuYWxQYWNrYWdlcyB8fCBbXSldLFxuICAgIH0pO1xuXG4gICAgY29uc3Qgc3RlcHNSZXN1bHQgPSBhd2FpdCBlc2J1aWxkQ3R4LnJlYnVpbGQoKTtcblxuICAgIHRoaXMubG9nRXNidWlsZE1lc3NhZ2VzKHN0ZXBzUmVzdWx0LCAnc3RlcHMgYnVuZGxlIGNyZWF0aW9uJyk7XG4gICAgdGhpcy5sb2dCYXNlQnVpbGRlckluZm8oXG4gICAgICAnQ3JlYXRlZCBzdGVwcyBidW5kbGUnLFxuICAgICAgYCR7RGF0ZS5ub3coKSAtIHN0ZXBzQnVuZGxlU3RhcnR9bXNgXG4gICAgKTtcblxuICAgIC8vIEhhbmRsZSB3b3JrZmxvdy1vbmx5IGZpbGVzIHRoYXQgbWF5IGhhdmUgYmVlbiB0cmVlLXNoYWtlbiBmcm9tIHRoZSBidW5kbGUuXG4gICAgLy8gVGhlc2UgZmlsZXMgaGF2ZSBubyBzdGVwcywgc28gZXNidWlsZCByZW1vdmVzIHRoZW0sIGJ1dCB3ZSBzdGlsbCBuZWVkIHRoZWlyXG4gICAgLy8gd29ya2Zsb3cgbWV0YWRhdGEgZm9yIHRoZSBtYW5pZmVzdC4gVHJhbnNmb3JtIHRoZW0gc2VwYXJhdGVseS5cbiAgICBjb25zdCB3b3JrZmxvd09ubHlGaWxlcyA9IHdvcmtmbG93RmlsZXMuZmlsdGVyKFxuICAgICAgKGYpID0+ICFzdGVwRmlsZXMuaW5jbHVkZXMoZilcbiAgICApO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgd29ya2Zsb3dPbmx5RmlsZXMubWFwKGFzeW5jICh3b3JrZmxvd0ZpbGUpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBzb3VyY2UgPSBhd2FpdCByZWFkRmlsZSh3b3JrZmxvd0ZpbGUsICd1dGY4Jyk7XG4gICAgICAgICAgY29uc3QgcmVsYXRpdmVGaWxlcGF0aCA9IHRoaXMuZ2V0UmVsYXRpdmVGaWxlcGF0aCh3b3JrZmxvd0ZpbGUpO1xuICAgICAgICAgIGNvbnN0IHsgd29ya2Zsb3dNYW5pZmVzdDogZmlsZU1hbmlmZXN0IH0gPSBhd2FpdCBhcHBseVN3Y1RyYW5zZm9ybShcbiAgICAgICAgICAgIHJlbGF0aXZlRmlsZXBhdGgsXG4gICAgICAgICAgICBzb3VyY2UsXG4gICAgICAgICAgICAnd29ya2Zsb3cnLFxuICAgICAgICAgICAgd29ya2Zsb3dGaWxlLFxuICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm1Qcm9qZWN0Um9vdCxcbiAgICAgICAgICAgIHRoaXMubW9kdWxlU3BlY2lmaWVyUm9vdFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKGZpbGVNYW5pZmVzdC53b3JrZmxvd3MpIHtcbiAgICAgICAgICAgIHdvcmtmbG93TWFuaWZlc3Qud29ya2Zsb3dzID0gT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgICAgd29ya2Zsb3dNYW5pZmVzdC53b3JrZmxvd3MgfHwge30sXG4gICAgICAgICAgICAgIGZpbGVNYW5pZmVzdC53b3JrZmxvd3NcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChmaWxlTWFuaWZlc3QuY2xhc3Nlcykge1xuICAgICAgICAgICAgd29ya2Zsb3dNYW5pZmVzdC5jbGFzc2VzID0gT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgICAgd29ya2Zsb3dNYW5pZmVzdC5jbGFzc2VzIHx8IHt9LFxuICAgICAgICAgICAgICBmaWxlTWFuaWZlc3QuY2xhc3Nlc1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgLy8gTG9nIHdhcm5pbmcgYnV0IGNvbnRpbnVlIC0gZG9uJ3QgZmFpbCBidWlsZCBmb3Igd29ya2Zsb3ctb25seSBmaWxlIGlzc3Vlc1xuICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgIGBXYXJuaW5nOiBGYWlsZWQgdG8gZXh0cmFjdCB3b3JrZmxvdyBtZXRhZGF0YSBmcm9tICR7d29ya2Zsb3dGaWxlfTpgLFxuICAgICAgICAgICAgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuXG4gICAgYXdhaXQgdGhpcy5lbnN1cmVTd2NJZ25vcmVkKCk7XG5cbiAgICBpZiAodGhpcy5jb25maWcud2F0Y2gpIHtcbiAgICAgIHJldHVybiB7IGNvbnRleHQ6IGVzYnVpbGRDdHgsIG1hbmlmZXN0OiB3b3JrZmxvd01hbmlmZXN0IH07XG4gICAgfVxuICAgIGF3YWl0IGVzYnVpbGRDdHguZGlzcG9zZSgpO1xuICAgIHJldHVybiB7IGNvbnRleHQ6IHVuZGVmaW5lZCwgbWFuaWZlc3Q6IHdvcmtmbG93TWFuaWZlc3QgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgYnVuZGxlIGZvciB3b3JrZmxvdyBvcmNoZXN0cmF0aW9uIGZ1bmN0aW9ucy5cbiAgICogV29ya2Zsb3dzIHJ1biBpbiBhIHNhbmRib3hlZCBWTSBhbmQgY29vcmRpbmF0ZSBzdGVwIGV4ZWN1dGlvbi5cbiAgICpcbiAgICogQHBhcmFtIGJ1bmRsZUZpbmFsT3V0cHV0IC0gSWYgZmFsc2UsIHNraXBzIHRoZSBmaW5hbCBidW5kbGluZyBzdGVwICh1c2VkIGJ5IE5leHQuanMpXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgY3JlYXRlV29ya2Zsb3dzQnVuZGxlKHtcbiAgICBpbnB1dEZpbGVzLFxuICAgIGZvcm1hdCA9ICdjanMnLFxuICAgIG91dGZpbGUsXG4gICAgYnVuZGxlRmluYWxPdXRwdXQgPSB0cnVlLFxuICAgIGtlZXBJbnRlcmltQnVuZGxlQ29udGV4dCA9IHRoaXMuY29uZmlnLndhdGNoLFxuICAgIHRzY29uZmlnUGF0aCxcbiAgICBkaXNjb3ZlcmVkRW50cmllcyxcbiAgfToge1xuICAgIHRzY29uZmlnUGF0aD86IHN0cmluZztcbiAgICBpbnB1dEZpbGVzOiBzdHJpbmdbXTtcbiAgICBvdXRmaWxlOiBzdHJpbmc7XG4gICAgZm9ybWF0PzogJ2NqcycgfCAnZXNtJztcbiAgICBidW5kbGVGaW5hbE91dHB1dD86IGJvb2xlYW47XG4gICAga2VlcEludGVyaW1CdW5kbGVDb250ZXh0PzogYm9vbGVhbjtcbiAgICBkaXNjb3ZlcmVkRW50cmllcz86IERpc2NvdmVyZWRFbnRyaWVzSW5wdXQ7XG4gIH0pOiBQcm9taXNlPHtcbiAgICBtYW5pZmVzdDogV29ya2Zsb3dNYW5pZmVzdDtcbiAgICBpbnRlcmltQnVuZGxlQ3R4PzogZXNidWlsZC5CdWlsZENvbnRleHQ7XG4gICAgYnVuZGxlRmluYWw/OiAoaW50ZXJpbUJ1bmRsZVJlc3VsdDogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+O1xuICB9PiB7XG4gICAgdGhpcy5zdGFydFdvcmtmbG93QnVpbGRUaW1lcigpO1xuXG4gICAgY29uc3QgZGlzY292ZXJlZCA9XG4gICAgICBkaXNjb3ZlcmVkRW50cmllcyA/P1xuICAgICAgKGF3YWl0IHRoaXMuZGlzY292ZXJFbnRyaWVzKGlucHV0RmlsZXMsIGRpcm5hbWUob3V0ZmlsZSksIHRzY29uZmlnUGF0aCkpO1xuICAgIGNvbnN0IHdvcmtmbG93RmlsZXMgPSBbLi4uZGlzY292ZXJlZC5kaXNjb3ZlcmVkV29ya2Zsb3dzXS5zb3J0KCk7XG4gICAgY29uc3Qgc2VyZGVGaWxlcyA9IFsuLi5kaXNjb3ZlcmVkLmRpc2NvdmVyZWRTZXJkZUZpbGVzXS5zb3J0KCk7XG5cbiAgICAvLyBJbmNsdWRlIHNlcmRlIGZpbGVzIHRoYXQgYXJlbid0IGFscmVhZHkgd29ya2Zsb3cgZmlsZXMgZm9yIGNyb3NzLWNvbnRleHQgY2xhc3MgcmVnaXN0cmF0aW9uLlxuICAgIC8vIENsYXNzZXMgbmVlZCB0byBiZSByZWdpc3RlcmVkIGluIHRoZSB3b3JrZmxvdyBidW5kbGUgc28gdGhleSBjYW4gYmUgZGVzZXJpYWxpemVkXG4gICAgLy8gd2hlbiByZWNlaXZpbmcgZGF0YSBmcm9tIHN0ZXBzIG9yIHdoZW4gc2VyaWFsaXppbmcgZGF0YSB0byBzZW5kIHRvIHN0ZXBzLlxuICAgIGNvbnN0IHdvcmtmbG93RmlsZXNTZXQgPSBuZXcgU2V0KHdvcmtmbG93RmlsZXMpO1xuICAgIGNvbnN0IHNlcmRlT25seUZpbGVzID0gc2VyZGVGaWxlcy5maWx0ZXIoKGYpID0+ICF3b3JrZmxvd0ZpbGVzU2V0LmhhcyhmKSk7XG5cbiAgICAvLyBsb2cgdGhlIHdvcmtmbG93IGZpbGVzIGZvciBkZWJ1Z2dpbmdcbiAgICBhd2FpdCB0aGlzLndyaXRlRGVidWdGaWxlKG91dGZpbGUsIHsgd29ya2Zsb3dGaWxlcywgc2VyZGVPbmx5RmlsZXMgfSk7XG5cbiAgICAvLyBIZWxwZXIgdG8gY3JlYXRlIGltcG9ydCBzdGF0ZW1lbnQgZnJvbSBmaWxlIHBhdGhcbiAgICAvLyBGb3IgcGFja2FnZXMsIHVzZXMgdGhlIHBhY2thZ2UgbmFtZSBzbyBlc2J1aWxkIHdpbGwgcmVzb2x2ZSB0aHJvdWdoXG4gICAgLy8gcGFja2FnZS5qc29uIGV4cG9ydHMgd2l0aCBjb25kaXRpb25zOiBbJ3dvcmtmbG93J11cbiAgICBjb25zdCBjcmVhdGVJbXBvcnQgPSAoZmlsZTogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCB7IGltcG9ydFBhdGgsIGlzUGFja2FnZSB9ID0gZ2V0SW1wb3J0UGF0aChcbiAgICAgICAgZmlsZSxcbiAgICAgICAgdGhpcy5jb25maWcud29ya2luZ0RpclxuICAgICAgKTtcblxuICAgICAgaWYgKGlzUGFja2FnZSkge1xuICAgICAgICAvLyBVc2UgcGFja2FnZSBuYW1lIC0gZXNidWlsZCB3aWxsIHJlc29sdmUgdmlhIHBhY2thZ2UuanNvbiBleHBvcnRzXG4gICAgICAgIC8vIGFuZCBhcHBseSB0aGUgJ3dvcmtmbG93JyBjb25kaXRpb25cbiAgICAgICAgcmV0dXJuIGBpbXBvcnQgJyR7aW1wb3J0UGF0aH0nO2A7XG4gICAgICB9XG5cbiAgICAgIC8vIExvY2FsIGFwcCBmaWxlIC0gdXNlIHJlbGF0aXZlIHBhdGhcbiAgICAgIC8vIE5vcm1hbGl6ZSBib3RoIHBhdGhzIHRvIGZvcndhcmQgc2xhc2hlcyBiZWZvcmUgY2FsbGluZyByZWxhdGl2ZSgpXG4gICAgICAvLyBUaGlzIGlzIGNyaXRpY2FsIG9uIFdpbmRvd3Mgd2hlcmUgcmVsYXRpdmUoKSBjYW4gcHJvZHVjZSB1bmV4cGVjdGVkIHJlc3VsdHMgd2l0aCBtaXhlZCBwYXRoIGZvcm1hdHNcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRXb3JraW5nRGlyID0gdGhpcy5jb25maWcud29ya2luZ0Rpci5yZXBsYWNlKC9cXFxcL2csICcvJyk7XG4gICAgICBjb25zdCBub3JtYWxpemVkRmlsZSA9IGZpbGUucmVwbGFjZSgvXFxcXC9nLCAnLycpO1xuICAgICAgLy8gQ2FsY3VsYXRlIHJlbGF0aXZlIHBhdGggZnJvbSB3b3JraW5nIGRpcmVjdG9yeSB0byB0aGUgZmlsZVxuICAgICAgbGV0IHJlbGF0aXZlUGF0aCA9IHJlbGF0aXZlKG5vcm1hbGl6ZWRXb3JraW5nRGlyLCBub3JtYWxpemVkRmlsZSkucmVwbGFjZShcbiAgICAgICAgL1xcXFwvZyxcbiAgICAgICAgJy8nXG4gICAgICApO1xuICAgICAgLy8gRW5zdXJlIHJlbGF0aXZlIHBhdGhzIHN0YXJ0IHdpdGggLi8gc28gZXNidWlsZCByZXNvbHZlcyB0aGVtIGNvcnJlY3RseS5cbiAgICAgIC8vIFBhdGhzIGxpa2UgXCIub3V0cHV0Ly4uLlwiIGFyZSBub3QgdmFsaWQgcmVsYXRpdmUgc3BlY2lmaWVycyBhbmQgbXVzdFxuICAgICAgLy8gYmVjb21lIFwiLi8ub3V0cHV0Ly4uLlwiLlxuICAgICAgaWYgKCFyZWxhdGl2ZVBhdGguc3RhcnRzV2l0aCgnLi8nKSAmJiAhcmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoJy4uLycpKSB7XG4gICAgICAgIHJlbGF0aXZlUGF0aCA9IGAuLyR7cmVsYXRpdmVQYXRofWA7XG4gICAgICB9XG4gICAgICByZXR1cm4gYGltcG9ydCAnJHtyZWxhdGl2ZVBhdGh9JztgO1xuICAgIH07XG5cbiAgICAvLyBDcmVhdGUgYSB2aXJ0dWFsIGVudHJ5IHRoYXQgaW1wb3J0cyBhbGwgd29ya2Zsb3cgZmlsZXNcbiAgICAvLyBUaGUgU1dDIHBsdWdpbiBpbiB3b3JrZmxvdyBtb2RlIGVtaXRzIGBnbG9iYWxUaGlzLl9fcHJpdmF0ZV93b3JrZmxvd3Muc2V0KHdvcmtmbG93SWQsIGZuKWBcbiAgICAvLyBjYWxscyBkaXJlY3RseSwgc28gd2UganVzdCBuZWVkIHRvIGltcG9ydCB0aGUgZmlsZXMgKE1hcCBpcyBpbml0aWFsaXplZCB2aWEgYmFubmVyKVxuICAgIGNvbnN0IHdvcmtmbG93SW1wb3J0cyA9IHdvcmtmbG93RmlsZXMubWFwKGNyZWF0ZUltcG9ydCkuam9pbignXFxuJyk7XG5cbiAgICAvLyBJbmNsdWRlIHNlcmRlLW9ubHkgZmlsZXMgZm9yIGNsYXNzIHJlZ2lzdHJhdGlvbiBzaWRlIGVmZmVjdHNcbiAgICBjb25zdCBzZXJkZUltcG9ydHMgPSBzZXJkZU9ubHlGaWxlcy5tYXAoY3JlYXRlSW1wb3J0KS5qb2luKCdcXG4nKTtcblxuICAgIGNvbnN0IGltcG9ydHMgPSBzZXJkZUltcG9ydHNcbiAgICAgID8gYCR7d29ya2Zsb3dJbXBvcnRzfVxcbi8vIFNlcmRlIGZpbGVzIGZvciBjcm9zcy1jb250ZXh0IGNsYXNzIHJlZ2lzdHJhdGlvblxcbiR7c2VyZGVJbXBvcnRzfWBcbiAgICAgIDogd29ya2Zsb3dJbXBvcnRzO1xuXG4gICAgY29uc3QgYnVuZGxlU3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCB3b3JrZmxvd01hbmlmZXN0OiBXb3JrZmxvd01hbmlmZXN0ID0ge307XG4gICAgY29uc3QgZXNidWlsZFRzY29uZmlnT3B0aW9ucyA9XG4gICAgICBhd2FpdCBnZXRFc2J1aWxkVHNjb25maWdPcHRpb25zKHRzY29uZmlnUGF0aCk7XG4gICAgY29uc3Qgbm9ybWFsaXplZFdvcmtmbG93U2lkZUVmZmVjdEVudHJpZXMgPSBhd2FpdCB3aXRoUmVhbHBhdGhzKFtcbiAgICAgIC4uLndvcmtmbG93RmlsZXMsXG4gICAgICAuLi5zZXJkZU9ubHlGaWxlcyxcbiAgICBdKTtcblxuICAgIC8vIEJ1bmRsZSB3aXRoIGVzYnVpbGQgYW5kIG91ciBjdXN0b20gU1dDIHBsdWdpbiBpbiB3b3JrZmxvdyBtb2RlLlxuICAgIC8vIHRoaXMgYnVuZGxlIHdpbGwgYmUgcnVuIGluc2lkZSBhIHZtIGlzb2xhdGVcbiAgICBjb25zdCBpbnRlcmltQnVuZGxlQ3R4ID0gYXdhaXQgZXNidWlsZC5jb250ZXh0KHtcbiAgICAgIHN0ZGluOiB7XG4gICAgICAgIGNvbnRlbnRzOiBpbXBvcnRzLFxuICAgICAgICByZXNvbHZlRGlyOiB0aGlzLmNvbmZpZy53b3JraW5nRGlyLFxuICAgICAgICBzb3VyY2VmaWxlOiAndmlydHVhbC1lbnRyeS5qcycsXG4gICAgICAgIGxvYWRlcjogJ2pzJyxcbiAgICAgIH0sXG4gICAgICBidW5kbGU6IHRydWUsXG4gICAgICBhYnNXb3JraW5nRGlyOiB0aGlzLmNvbmZpZy53b3JraW5nRGlyLFxuICAgICAgZm9ybWF0OiAnY2pzJywgLy8gUnVucyBpbnNpZGUgdGhlIFZNIHdoaWNoIGV4cGVjdHMgY2pzXG4gICAgICBwbGF0Zm9ybTogJ25ldXRyYWwnLCAvLyBUaGUgcGxhdGZvcm0gaXMgbmVpdGhlciBub2RlIG5vciBicm93c2VyXG4gICAgICBtYWluRmllbGRzOiBbJ21vZHVsZScsICdtYWluJ10sIC8vIFRvIHN1cHBvcnQgbnBtIHN0eWxlIGltcG9ydHNcbiAgICAgIGNvbmRpdGlvbnM6IFsnd29ya2Zsb3cnXSwgLy8gQWxsb3cgcGFja2FnZXMgdG8gZXhwb3J0ICd3b3JrZmxvdycgY29tcGxpYW50IHZlcnNpb25zXG4gICAgICB0YXJnZXQ6ICdlczIwMjInLFxuICAgICAgd3JpdGU6IGZhbHNlLFxuICAgICAgdHJlZVNoYWtpbmc6IHRydWUsXG4gICAgICBrZWVwTmFtZXM6IHRydWUsXG4gICAgICBtaW5pZnk6IGZhbHNlLFxuICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgd29ya2Zsb3cgcmVnaXN0cnkgYXQgdGhlIHZlcnkgdG9wIG9mIHRoZSBidW5kbGVcbiAgICAgIC8vIFRoaXMgbXVzdCBiZSBpbiBiYW5uZXIgKG5vdCB0aGUgdmlydHVhbCBlbnRyeSkgYmVjYXVzZSBlc2J1aWxkJ3MgYnVuZGxpbmdcbiAgICAgIC8vIGNhbiByZW9yZGVyIGNvZGUsIGFuZCB0aGUgLnNldCgpIGNhbGxzIG5lZWQgdGhlIE1hcCB0byBleGlzdCBmaXJzdFxuICAgICAgYmFubmVyOiB7XG4gICAgICAgIGpzOiAnZ2xvYmFsVGhpcy5fX3ByaXZhdGVfd29ya2Zsb3dzID0gbmV3IE1hcCgpOycsXG4gICAgICB9LFxuICAgICAgLy8gSW5saW5lIHNvdXJjZSBtYXBzIGZvciBiZXR0ZXIgc3RhY2sgdHJhY2VzIGluIHdvcmtmbG93IFZNIGV4ZWN1dGlvbi5cbiAgICAgIC8vIFRoaXMgaW50ZXJtZWRpYXRlIGJ1bmRsZSBpcyBleGVjdXRlZCB2aWEgcnVuSW5Db250ZXh0KCkgaW4gYSBWTSwgc28gd2UgbmVlZFxuICAgICAgLy8gaW5saW5lIHNvdXJjZSBtYXBzIHRvIGdldCBtZWFuaW5nZnVsIHN0YWNrIHRyYWNlcyBpbnN0ZWFkIG9mIFwiZXZhbG1hY2hpbmUuPGFub255bW91cz5cIi5cbiAgICAgIHNvdXJjZW1hcDogJ2lubGluZScsXG4gICAgICAvLyBVc2UgdHNjb25maWcgZm9yIHBhdGggYWxpYXMgcmVzb2x1dGlvbi5cbiAgICAgIC8vIEZvciBzeW1saW5rZWQgY29uZmlncyB0aGlzIHVzZXMgdHNjb25maWdSYXcgdG8gcHJlc2VydmUgY3dkLXJlbGF0aXZlIGFsaWFzZXMuXG4gICAgICAuLi5lc2J1aWxkVHNjb25maWdPcHRpb25zLFxuICAgICAgcmVzb2x2ZUV4dGVuc2lvbnM6IFtcbiAgICAgICAgJy50cycsXG4gICAgICAgICcudHN4JyxcbiAgICAgICAgJy5tdHMnLFxuICAgICAgICAnLmN0cycsXG4gICAgICAgICcuanMnLFxuICAgICAgICAnLmpzeCcsXG4gICAgICAgICcubWpzJyxcbiAgICAgICAgJy5janMnLFxuICAgICAgXSxcbiAgICAgIHBsdWdpbnM6IFtcbiAgICAgICAgLy8gSGFuZGxlIHBzZXVkby1wYWNrYWdlcyBsaWtlICdzZXJ2ZXItb25seScgYW5kICdjbGllbnQtb25seScgYnkgcHJvdmlkaW5nXG4gICAgICAgIC8vIGVtcHR5IG1vZHVsZXMuIE11c3QgcnVuIGZpcnN0IHRvIGludGVyY2VwdCB0aGVzZSBiZWZvcmUgb3RoZXIgcmVzb2x1dGlvbi5cbiAgICAgICAgY3JlYXRlUHNldWRvUGFja2FnZVBsdWdpbigpLFxuICAgICAgICBjcmVhdGVTd2NQbHVnaW4oe1xuICAgICAgICAgIG1vZGU6ICd3b3JrZmxvdycsXG4gICAgICAgICAgcHJvamVjdFJvb3Q6IHRoaXMudHJhbnNmb3JtUHJvamVjdFJvb3QsXG4gICAgICAgICAgbW9kdWxlU3BlY2lmaWVyUm9vdDogdGhpcy5tb2R1bGVTcGVjaWZpZXJSb290LFxuICAgICAgICAgIHdvcmtmbG93TWFuaWZlc3QsXG4gICAgICAgICAgc2lkZUVmZmVjdEVudHJpZXM6IG5vcm1hbGl6ZWRXb3JrZmxvd1NpZGVFZmZlY3RFbnRyaWVzLFxuICAgICAgICB9KSxcbiAgICAgICAgLy8gVGhpcyBwbHVnaW4gbXVzdCBydW4gYWZ0ZXIgdGhlIHN3YyBwbHVnaW4gdG8gZW5zdXJlIGRlYWQgY29kZSBlbGltaW5hdGlvblxuICAgICAgICAvLyBoYXBwZW5zIGZpcnN0LCBwcmV2ZW50aW5nIGZhbHNlIHBvc2l0aXZlcyBvbiBOb2RlLmpzIGltcG9ydHMgaW4gdW51c2VkIGNvZGUgcGF0aHNcbiAgICAgICAgY3JlYXRlTm9kZU1vZHVsZUVycm9yUGx1Z2luKCksXG4gICAgICBdLFxuICAgICAgLy8gTk9URTogV2UgaW50ZW50aW9uYWxseSBkbyBOT1QgdXNlIHRoZSBleHRlcm5hbCBvcHRpb24gaGVyZSBmb3Igd29ya2Zsb3cgYnVuZGxlcy5cbiAgICAgIC8vIFdoZW4gcGFja2FnZXMgYXJlIG1hcmtlZCBleHRlcm5hbCB3aXRoIGZvcm1hdDogJ2NqcycsIGVzYnVpbGQgZ2VuZXJhdGVzIHJlcXVpcmUoKSBjYWxscy5cbiAgICAgIC8vIEhvd2V2ZXIsIHRoZSB3b3JrZmxvdyBWTSAodm0ucnVuSW5Db250ZXh0KSBkb2VzIG5vdCBoYXZlIHJlcXVpcmUoKSBkZWZpbmVkIC0gaXQgb25seVxuICAgICAgLy8gcHJvdmlkZXMgbW9kdWxlLmV4cG9ydHMgYW5kIGV4cG9ydHMuIEV4dGVybmFsIHBhY2thZ2VzIHdvdWxkIGZhaWwgYXQgcnVudGltZSB3aXRoOlxuICAgICAgLy8gICBSZWZlcmVuY2VFcnJvcjogcmVxdWlyZSBpcyBub3QgZGVmaW5lZFxuICAgICAgLy8gSW5zdGVhZCwgd2UgYnVuZGxlIGV2ZXJ5dGhpbmcgYW5kIHJlbHkgb246XG4gICAgICAvLyAtIGNyZWF0ZVBzZXVkb1BhY2thZ2VQbHVnaW4oKSB0byBoYW5kbGUgc2VydmVyLW9ubHkvY2xpZW50LW9ubHkgd2l0aCBlbXB0eSBtb2R1bGVzXG4gICAgICAvLyAtIGNyZWF0ZU5vZGVNb2R1bGVFcnJvclBsdWdpbigpIHRvIGNhdGNoIE5vZGUuanMgYnVpbHRpbiBpbXBvcnRzIGF0IGJ1aWxkIHRpbWVcbiAgICB9KTtcbiAgICBsZXQgc2hvdWxkRGlzcG9zZUludGVyaW1CdW5kbGVDdHggPSAha2VlcEludGVyaW1CdW5kbGVDb250ZXh0O1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBpbnRlcmltQnVuZGxlID0gYXdhaXQgaW50ZXJpbUJ1bmRsZUN0eC5yZWJ1aWxkKCk7XG5cbiAgICAgIHRoaXMubG9nRXNidWlsZE1lc3NhZ2VzKFxuICAgICAgICBpbnRlcmltQnVuZGxlLFxuICAgICAgICAnaW50ZXJtZWRpYXRlIHdvcmtmbG93IGJ1bmRsZScsXG4gICAgICAgIHRydWUsXG4gICAgICAgIHtcbiAgICAgICAgICBzdXBwcmVzc1dhcm5pbmdzOiB0aGlzLmNvbmZpZy5zdXBwcmVzc0NyZWF0ZVdvcmtmbG93c0J1bmRsZVdhcm5pbmdzLFxuICAgICAgICB9XG4gICAgICApO1xuICAgICAgdGhpcy5sb2dDcmVhdGVXb3JrZmxvd3NCdW5kbGVJbmZvKFxuICAgICAgICAnQ3JlYXRlZCBpbnRlcm1lZGlhdGUgd29ya2Zsb3cgYnVuZGxlJyxcbiAgICAgICAgYCR7RGF0ZS5ub3coKSAtIGJ1bmRsZVN0YXJ0VGltZX1tc2BcbiAgICAgICk7XG5cbiAgICAgIGlmICh0aGlzLmNvbmZpZy53b3JrZmxvd01hbmlmZXN0UGF0aCkge1xuICAgICAgICBjb25zdCByZXNvbHZlZFBhdGggPSByZXNvbHZlKFxuICAgICAgICAgIHByb2Nlc3MuY3dkKCksXG4gICAgICAgICAgdGhpcy5jb25maWcud29ya2Zsb3dNYW5pZmVzdFBhdGhcbiAgICAgICAgKTtcbiAgICAgICAgbGV0IHByZWZpeCA9ICcnO1xuXG4gICAgICAgIGlmIChyZXNvbHZlZFBhdGguZW5kc1dpdGgoJy5janMnKSkge1xuICAgICAgICAgIHByZWZpeCA9ICdtb2R1bGUuZXhwb3J0cyA9ICc7XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgcmVzb2x2ZWRQYXRoLmVuZHNXaXRoKCcuanMnKSB8fFxuICAgICAgICAgIHJlc29sdmVkUGF0aC5lbmRzV2l0aCgnLm1qcycpXG4gICAgICAgICkge1xuICAgICAgICAgIHByZWZpeCA9ICdleHBvcnQgZGVmYXVsdCAnO1xuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgbWtkaXIoZGlybmFtZShyZXNvbHZlZFBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgYXdhaXQgd3JpdGVGaWxlKFxuICAgICAgICAgIHJlc29sdmVkUGF0aCxcbiAgICAgICAgICBwcmVmaXggKyBKU09OLnN0cmluZ2lmeSh3b3JrZmxvd01hbmlmZXN0LCBudWxsLCAyKVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCB0aGlzLmVuc3VyZVN3Y0lnbm9yZWQoKTtcblxuICAgICAgaWYgKFxuICAgICAgICAhaW50ZXJpbUJ1bmRsZS5vdXRwdXRGaWxlcyB8fFxuICAgICAgICBpbnRlcmltQnVuZGxlLm91dHB1dEZpbGVzLmxlbmd0aCA9PT0gMFxuICAgICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gb3V0cHV0IGZpbGVzIGdlbmVyYXRlZCBmcm9tIGVzYnVpbGQnKTtcbiAgICAgIH1cblxuICAgICAgLy8gU2VyZGUgY29tcGxpYW5jZSB3YXJuaW5nczogY2hlY2sgaWYgd29ya2Zsb3cgYnVuZGxlIGhhcyBOb2RlLmpzIGltcG9ydHNcbiAgICAgIC8vIGFsb25nc2lkZSBzZXJkZS1yZWdpc3RlcmVkIGNsYXNzZXMgKHRoZXNlIHdpbGwgZmFpbCBhdCBydW50aW1lIGluIHRoZSBzYW5kYm94KVxuICAgICAgaWYgKFxuICAgICAgICB3b3JrZmxvd01hbmlmZXN0LmNsYXNzZXMgJiZcbiAgICAgICAgT2JqZWN0LmtleXMod29ya2Zsb3dNYW5pZmVzdC5jbGFzc2VzKS5sZW5ndGggPiAwXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgeyBhbmFseXplU2VyZGVDb21wbGlhbmNlIH0gPSBhd2FpdCBpbXBvcnQoJy4vc2VyZGUtY2hlY2tlci5qcycpO1xuICAgICAgICBjb25zdCBidW5kbGVUZXh0ID0gaW50ZXJpbUJ1bmRsZS5vdXRwdXRGaWxlc1swXS50ZXh0O1xuICAgICAgICBjb25zdCBzZXJkZVJlc3VsdCA9IGFuYWx5emVTZXJkZUNvbXBsaWFuY2Uoe1xuICAgICAgICAgIHNvdXJjZUNvZGU6ICcnLFxuICAgICAgICAgIHdvcmtmbG93Q29kZTogYnVuZGxlVGV4dCxcbiAgICAgICAgICBtYW5pZmVzdDogd29ya2Zsb3dNYW5pZmVzdCxcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIERlLWR1cGUgd2FybmluZ3M6IGdyb3VwIGlkZW50aWNhbCBpc3N1ZXMgYWNyb3NzIGNsYXNzZXNcbiAgICAgICAgY29uc3QgaXNzdWVzVG9DbGFzc2VzID0gbmV3IE1hcDxzdHJpbmcsIFNldDxzdHJpbmc+PigpO1xuICAgICAgICBmb3IgKGNvbnN0IGNscyBvZiBzZXJkZVJlc3VsdC5jbGFzc2VzKSB7XG4gICAgICAgICAgaWYgKCFjbHMuY29tcGxpYW50KSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGlzc3VlIG9mIGNscy5pc3N1ZXMpIHtcbiAgICAgICAgICAgICAgbGV0IGFmZmVjdGVkQ2xhc3NlcyA9IGlzc3Vlc1RvQ2xhc3Nlcy5nZXQoaXNzdWUpO1xuICAgICAgICAgICAgICBpZiAoIWFmZmVjdGVkQ2xhc3Nlcykge1xuICAgICAgICAgICAgICAgIGFmZmVjdGVkQ2xhc3NlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgICAgICAgICAgIGlzc3Vlc1RvQ2xhc3Nlcy5zZXQoaXNzdWUsIGFmZmVjdGVkQ2xhc3Nlcyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgYWZmZWN0ZWRDbGFzc2VzLmFkZChjbHMuY2xhc3NOYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBbaXNzdWUsIGFmZmVjdGVkQ2xhc3Nlc10gb2YgaXNzdWVzVG9DbGFzc2VzKSB7XG4gICAgICAgICAgY29uc3QgY2xhc3NOYW1lcyA9IFsuLi5hZmZlY3RlZENsYXNzZXNdO1xuICAgICAgICAgIGNvbnN0IGNsYXNzTGFiZWwgPVxuICAgICAgICAgICAgY2xhc3NOYW1lcy5sZW5ndGggPT09IDFcbiAgICAgICAgICAgICAgPyBgY2xhc3MgXCIke2NsYXNzTmFtZXNbMF19XCJgXG4gICAgICAgICAgICAgIDogYGNsYXNzZXMgJHtjbGFzc05hbWVzLm1hcCgobmFtZSkgPT4gYFwiJHtuYW1lfVwiYCkuam9pbignLCAnKX1gO1xuICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgIGNoYWxrLnllbGxvdyhg4pqgIFNlcmRlIHdhcm5pbmcgZm9yICR7Y2xhc3NMYWJlbH06IGApICsgaXNzdWVcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHdvcmtmbG93RW50cnlwb2ludE9wdGlvbnNDb2RlID1cbiAgICAgICAgY3JlYXRlV29ya2Zsb3dFbnRyeXBvaW50T3B0aW9uc0NvZGUoKTtcblxuICAgICAgY29uc3QgYnVuZGxlRmluYWwgPSBhc3luYyAoaW50ZXJpbUJ1bmRsZTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IHdvcmtmbG93QnVuZGxlQ29kZSA9IGludGVyaW1CdW5kbGU7XG5cbiAgICAgICAgY29uc3Qgd29ya2Zsb3dGdW5jdGlvbkNvZGUgPSBgLy8gYmlvbWUtaWdub3JlLWFsbCBsaW50OiBnZW5lcmF0ZWQgZmlsZVxuLyogZXNsaW50LWRpc2FibGUgKi9cbmltcG9ydCB7IHdvcmtmbG93RW50cnlwb2ludCB9IGZyb20gJ3dvcmtmbG93L3J1bnRpbWUnO1xuXG5jb25zdCB3b3JrZmxvd0NvZGUgPSBcXGAke3dvcmtmbG93QnVuZGxlQ29kZS5yZXBsYWNlKC9bXFxcXGAkXS9nLCAnXFxcXCQmJyl9XFxgO1xuXG5jb25zdCBoYW5kbGVyID0gd29ya2Zsb3dFbnRyeXBvaW50KHdvcmtmbG93Q29kZSR7d29ya2Zsb3dFbnRyeXBvaW50T3B0aW9uc0NvZGV9KTtcblxuZXhwb3J0IGNvbnN0IEhFQUQgPSBoYW5kbGVyO1xuZXhwb3J0IGNvbnN0IFBPU1QgPSBoYW5kbGVyO2A7XG5cbiAgICAgICAgLy8gd2Ugc2tpcCB0aGUgZmluYWwgYnVuZGxpbmcgc3RlcCBmb3IgTmV4dC5qcyBzbyBpdCBjYW4gYnVuZGxlIGl0c2VsZlxuICAgICAgICBpZiAoIWJ1bmRsZUZpbmFsT3V0cHV0KSB7XG4gICAgICAgICAgaWYgKCFvdXRmaWxlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFyaWFudDogbWlzc2luZyBvdXRmaWxlIGZvciB3b3JrZmxvdyBidW5kbGVgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gRW5zdXJlIHRoZSBvdXRwdXQgZGlyZWN0b3J5IGV4aXN0c1xuICAgICAgICAgIGNvbnN0IG91dHB1dERpciA9IGRpcm5hbWUob3V0ZmlsZSk7XG4gICAgICAgICAgYXdhaXQgbWtkaXIob3V0cHV0RGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgICAgICAgIGF3YWl0IHRoaXMud3JpdGVHZW5lcmF0ZWRGaWxlKG91dGZpbGUsIHdvcmtmbG93RnVuY3Rpb25Db2RlKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBidW5kbGVTdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuXG4gICAgICAgIC8vIE5vdyBidW5kbGUgdGhpcyBzbyB3ZSBjYW4gcmVzb2x2ZSB0aGUgQHdvcmtmbG93L2NvcmUgZGVwZW5kZW5jeVxuICAgICAgICAvLyB3ZSBjb3VsZCByZW1vdmUgdGhpcyBpZiB3ZSBkbyBuZnQgdHJhY2luZyBvciBzaW1pbGFyIGluc3RlYWRcbiAgICAgICAgY29uc3QgZmluYWxXb3JrZmxvd1Jlc3VsdCA9IGF3YWl0IGVzYnVpbGQuYnVpbGQoe1xuICAgICAgICAgIGJhbm5lcjoge1xuICAgICAgICAgICAganM6ICcvLyBiaW9tZS1pZ25vcmUtYWxsIGxpbnQ6IGdlbmVyYXRlZCBmaWxlXFxuLyogZXNsaW50LWRpc2FibGUgKi9cXG4nLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgc3RkaW46IHtcbiAgICAgICAgICAgIGNvbnRlbnRzOiB3b3JrZmxvd0Z1bmN0aW9uQ29kZSxcbiAgICAgICAgICAgIHJlc29sdmVEaXI6IHRoaXMuY29uZmlnLndvcmtpbmdEaXIsXG4gICAgICAgICAgICBzb3VyY2VmaWxlOiAndmlydHVhbC1lbnRyeS5qcycsXG4gICAgICAgICAgICBsb2FkZXI6ICdqcycsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBvdXRmaWxlLFxuICAgICAgICAgIC8vIFNvdXJjZSBtYXBzIGZvciB0aGUgZmluYWwgd29ya2Zsb3cgYnVuZGxlIHdyYXBwZXIgKG5vdCBpbXBvcnRhbnQgc2luY2UgdGhpcyBjb2RlXG4gICAgICAgICAgLy8gZG9lc24ndCBydW4gaW4gdGhlIFZNIC0gb25seSB0aGUgaW50ZXJtZWRpYXRlIGJ1bmRsZSBzb3VyY2VtYXAgaXMgcmVsZXZhbnQpXG4gICAgICAgICAgc291cmNlbWFwOiBFTUlUX1NPVVJDRU1BUFNfRk9SX0RFQlVHR0lORyxcbiAgICAgICAgICBhYnNXb3JraW5nRGlyOiB0aGlzLmNvbmZpZy53b3JraW5nRGlyLFxuICAgICAgICAgIGJ1bmRsZTogdHJ1ZSxcbiAgICAgICAgICBmb3JtYXQsXG4gICAgICAgICAgcGxhdGZvcm06ICdub2RlJyxcbiAgICAgICAgICB0YXJnZXQ6ICdlczIwMjInLFxuICAgICAgICAgIHdyaXRlOiB0cnVlLFxuICAgICAgICAgIGtlZXBOYW1lczogdHJ1ZSxcbiAgICAgICAgICBtaW5pZnk6IGZhbHNlLFxuICAgICAgICAgIGV4dGVybmFsOiBbJ0Bhd3Mtc2RrL2NyZWRlbnRpYWwtcHJvdmlkZXItd2ViLWlkZW50aXR5J10sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMubG9nRXNidWlsZE1lc3NhZ2VzKFxuICAgICAgICAgIGZpbmFsV29ya2Zsb3dSZXN1bHQsXG4gICAgICAgICAgJ2ZpbmFsIHdvcmtmbG93IGJ1bmRsZScsXG4gICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBzdXBwcmVzc1dhcm5pbmdzOiB0aGlzLmNvbmZpZy5zdXBwcmVzc0NyZWF0ZVdvcmtmbG93c0J1bmRsZVdhcm5pbmdzLFxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5sb2dDcmVhdGVXb3JrZmxvd3NCdW5kbGVJbmZvKFxuICAgICAgICAgICdDcmVhdGVkIGZpbmFsIHdvcmtmbG93IGJ1bmRsZScsXG4gICAgICAgICAgYCR7RGF0ZS5ub3coKSAtIGJ1bmRsZVN0YXJ0VGltZX1tc2BcbiAgICAgICAgKTtcbiAgICAgIH07XG4gICAgICBhd2FpdCBidW5kbGVGaW5hbChpbnRlcmltQnVuZGxlLm91dHB1dEZpbGVzWzBdLnRleHQpO1xuXG4gICAgICBpZiAoa2VlcEludGVyaW1CdW5kbGVDb250ZXh0KSB7XG4gICAgICAgIHNob3VsZERpc3Bvc2VJbnRlcmltQnVuZGxlQ3R4ID0gZmFsc2U7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbWFuaWZlc3Q6IHdvcmtmbG93TWFuaWZlc3QsXG4gICAgICAgICAgaW50ZXJpbUJ1bmRsZUN0eCxcbiAgICAgICAgICBidW5kbGVGaW5hbCxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IG1hbmlmZXN0OiB3b3JrZmxvd01hbmlmZXN0IH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHNob3VsZERpc3Bvc2VJbnRlcmltQnVuZGxlQ3R4ID0gdHJ1ZTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAoc2hvdWxkRGlzcG9zZUludGVyaW1CdW5kbGVDdHgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBpbnRlcmltQnVuZGxlQ3R4LmRpc3Bvc2UoKTtcbiAgICAgICAgfSBjYXRjaCAoZGlzcG9zZUVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgJ1dhcm5pbmc6IEZhaWxlZCB0byBkaXNwb3NlIHdvcmtmbG93IGJ1bmRsZSBjb250ZXh0JyxcbiAgICAgICAgICAgIGRpc3Bvc2VFcnJvclxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIGNsaWVudCBsaWJyYXJ5IGJ1bmRsZSBmb3Igd29ya2Zsb3cgZXhlY3V0aW9uLlxuICAgKiBUaGUgY2xpZW50IGxpYnJhcnkgYWxsb3dzIGltcG9ydGluZyBhbmQgY2FsbGluZyB3b3JrZmxvd3MgZnJvbSBhcHBsaWNhdGlvbiBjb2RlLlxuICAgKiBPbmx5IGdlbmVyYXRlZCBpZiBjbGllbnRCdW5kbGVQYXRoIGlzIHNwZWNpZmllZCBpbiBjb25maWcuXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgY3JlYXRlQ2xpZW50TGlicmFyeSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuY29uZmlnLmNsaWVudEJ1bmRsZVBhdGgpIHtcbiAgICAgIC8vIFNpbGVudGx5IGV4aXQgc2luY2Ugbm8gY2xpZW50IGJ1bmRsZSB3YXMgcmVxdWVzdGVkXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5sb2dCYXNlQnVpbGRlckluZm8oXG4gICAgICAnR2VuZXJhdGluZyBhIGNsaWVudCBsaWJyYXJ5IGF0JyxcbiAgICAgIHRoaXMuY29uZmlnLmNsaWVudEJ1bmRsZVBhdGhcbiAgICApO1xuICAgIHRoaXMubG9nQmFzZUJ1aWxkZXJJbmZvKFxuICAgICAgJ05PVEU6IFRoZSByZWNvbW1lbmRlZCB3YXkgdG8gdXNlIHdvcmtmbG93IHdpdGggYSBmcmFtZXdvcmsgbGlrZSBOZXh0SlMgaXMgdXNpbmcgdGhlIGxvYWRlci9wbHVnaW4gd2l0aCB3ZWJwYWNrL3R1cmJvYnBhY2svcm9sbHVwJ1xuICAgICk7XG5cbiAgICAvLyBFbnN1cmUgd2UgaGF2ZSB0aGUgZGlyZWN0b3J5IGZvciB0aGUgY2xpZW50IGJ1bmRsZVxuICAgIGNvbnN0IG91dHB1dERpciA9IGRpcm5hbWUodGhpcy5jb25maWcuY2xpZW50QnVuZGxlUGF0aCk7XG4gICAgYXdhaXQgbWtkaXIob3V0cHV0RGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIGNvbnN0IGlucHV0RmlsZXMgPSBhd2FpdCB0aGlzLmdldElucHV0RmlsZXMoKTtcblxuICAgIC8vIERpc2NvdmVyIHNlcmRlIGZpbGVzIGZyb20gdGhlIGlucHV0IGZpbGVzJyBkZXBlbmRlbmN5IHRyZWUgZm9yIGNyb3NzLWNvbnRleHQgY2xhc3MgcmVnaXN0cmF0aW9uLlxuICAgIC8vIENsYXNzZXMgbmVlZCB0byBiZSByZWdpc3RlcmVkIGluIHRoZSBjbGllbnQgYnVuZGxlIHNvIHRoZXkgY2FuIGJlIHNlcmlhbGl6ZWRcbiAgICAvLyB3aGVuIHBhc3NpbmcgZGF0YSB0byB3b3JrZmxvd3MgdmlhIHN0YXJ0KCkgYW5kIGRlc2VyaWFsaXplZCB3aGVuIHJlY2VpdmluZyB3b3JrZmxvdyByZXN1bHRzLlxuICAgIGNvbnN0IHsgZGlzY292ZXJlZFNlcmRlRmlsZXMgfSA9IGF3YWl0IHRoaXMuZGlzY292ZXJFbnRyaWVzKFxuICAgICAgaW5wdXRGaWxlcyxcbiAgICAgIG91dHB1dERpclxuICAgICk7XG5cbiAgICAvLyBJZGVudGlmeSBzZXJkZSBmaWxlcyB0aGF0IGFyZW4ndCBpbiB0aGUgaW5wdXRGaWxlcyAoZGVkdXBsaWNhdGVkKVxuICAgIGNvbnN0IGlucHV0RmlsZXNOb3JtYWxpemVkID0gbmV3IFNldChcbiAgICAgIGlucHV0RmlsZXMubWFwKChmKSA9PiBmLnJlcGxhY2UoL1xcXFwvZywgJy8nKSlcbiAgICApO1xuICAgIGNvbnN0IHNlcmRlT25seUZpbGVzID0gWy4uLmRpc2NvdmVyZWRTZXJkZUZpbGVzXS5maWx0ZXIoXG4gICAgICAoZikgPT4gIWlucHV0RmlsZXNOb3JtYWxpemVkLmhhcyhmKVxuICAgICk7XG5cbiAgICAvLyBSZS1leHBvcnRzIGZvciBpbnB1dCBmaWxlcyAodXNlcidzIHdvcmtmbG93L3N0ZXAgZGVmaW5pdGlvbnMpLlxuICAgIC8vIFRoZXNlIG11c3QgdXNlIHZhbGlkIHJlbGF0aXZlIHNwZWNpZmllcnMgYmVjYXVzZSBzb21lIGZyYW1ld29ya3MgcGFzc1xuICAgIC8vIGdlbmVyYXRlZCBmaWxlcyBsaWtlIFwiLm91dHB1dC9zZXJ2ZXIvaW5kZXgubWpzXCIgYXMgaW5wdXQgZmlsZXMuXG4gICAgY29uc3QgcmVleHBvcnRzID0gaW5wdXRGaWxlc1xuICAgICAgLm1hcCgoZmlsZSkgPT4ge1xuICAgICAgICBjb25zdCBub3JtYWxpemVkV29ya2luZ0RpciA9IHRoaXMuY29uZmlnLndvcmtpbmdEaXIucmVwbGFjZSgvXFxcXC9nLCAnLycpO1xuICAgICAgICBsZXQgcmVsYXRpdmVQYXRoID0gcmVsYXRpdmUobm9ybWFsaXplZFdvcmtpbmdEaXIsIGZpbGUpLnJlcGxhY2UoXG4gICAgICAgICAgL1xcXFwvZyxcbiAgICAgICAgICAnLydcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCFyZWxhdGl2ZVBhdGguc3RhcnRzV2l0aCgnLi8nKSAmJiAhcmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoJy4uLycpKSB7XG4gICAgICAgICAgcmVsYXRpdmVQYXRoID0gYC4vJHtyZWxhdGl2ZVBhdGh9YDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYGV4cG9ydCAqIGZyb20gJyR7cmVsYXRpdmVQYXRofSc7YDtcbiAgICAgIH0pXG4gICAgICAuam9pbignXFxuJyk7XG5cbiAgICAvLyBTaWRlLWVmZmVjdCBpbXBvcnRzIGZvciBzZXJkZSBmaWxlcyBub3QgaW4gaW5wdXRGaWxlcyAoZm9yIGNsYXNzIHJlZ2lzdHJhdGlvbilcbiAgICBjb25zdCBzZXJkZUltcG9ydHMgPSBzZXJkZU9ubHlGaWxlc1xuICAgICAgLm1hcCgoZmlsZSkgPT4ge1xuICAgICAgICBjb25zdCBub3JtYWxpemVkV29ya2luZ0RpciA9IHRoaXMuY29uZmlnLndvcmtpbmdEaXIucmVwbGFjZSgvXFxcXC9nLCAnLycpO1xuICAgICAgICBsZXQgcmVsYXRpdmVQYXRoID0gcmVsYXRpdmUobm9ybWFsaXplZFdvcmtpbmdEaXIsIGZpbGUpLnJlcGxhY2UoXG4gICAgICAgICAgL1xcXFwvZyxcbiAgICAgICAgICAnLydcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCFyZWxhdGl2ZVBhdGguc3RhcnRzV2l0aCgnLi8nKSAmJiAhcmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoJy4uLycpKSB7XG4gICAgICAgICAgcmVsYXRpdmVQYXRoID0gYC4vJHtyZWxhdGl2ZVBhdGh9YDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYGltcG9ydCAnJHtyZWxhdGl2ZVBhdGh9JztgO1xuICAgICAgfSlcbiAgICAgIC5qb2luKCdcXG4nKTtcblxuICAgIC8vIENvbWJpbmU6IHNlcmRlIGltcG9ydHMgKGZvciByZWdpc3RyYXRpb24gc2lkZSBlZmZlY3RzKSArIHJlLWV4cG9ydHNcbiAgICBjb25zdCBlbnRyeUNvbnRlbnQgPSBzZXJkZUltcG9ydHNcbiAgICAgID8gYC8vIFNlcmRlIGZpbGVzIGZvciBjcm9zcy1jb250ZXh0IGNsYXNzIHJlZ2lzdHJhdGlvblxcbiR7c2VyZGVJbXBvcnRzfVxcbiR7cmVleHBvcnRzfWBcbiAgICAgIDogcmVleHBvcnRzO1xuXG4gICAgLy8gQnVuZGxlIHdpdGggZXNidWlsZCBhbmQgb3VyIGN1c3RvbSBTV0MgcGx1Z2luXG4gICAgY29uc3Qgbm9ybWFsaXplZENsaWVudFNpZGVFZmZlY3RFbnRyaWVzID0gYXdhaXQgd2l0aFJlYWxwYXRocyhbXG4gICAgICAuLi5pbnB1dEZpbGVzLFxuICAgICAgLi4uc2VyZGVPbmx5RmlsZXMsXG4gICAgXSk7XG4gICAgY29uc3QgY2xpZW50UmVzdWx0ID0gYXdhaXQgZXNidWlsZC5idWlsZCh7XG4gICAgICBiYW5uZXI6IHtcbiAgICAgICAganM6ICcvLyBiaW9tZS1pZ25vcmUtYWxsIGxpbnQ6IGdlbmVyYXRlZCBmaWxlXFxuLyogZXNsaW50LWRpc2FibGUgKi9cXG4nLFxuICAgICAgfSxcbiAgICAgIHN0ZGluOiB7XG4gICAgICAgIGNvbnRlbnRzOiBlbnRyeUNvbnRlbnQsXG4gICAgICAgIHJlc29sdmVEaXI6IHRoaXMuY29uZmlnLndvcmtpbmdEaXIsXG4gICAgICAgIHNvdXJjZWZpbGU6ICd2aXJ0dWFsLWVudHJ5LmpzJyxcbiAgICAgICAgbG9hZGVyOiAnanMnLFxuICAgICAgfSxcbiAgICAgIG91dGZpbGU6IHRoaXMuY29uZmlnLmNsaWVudEJ1bmRsZVBhdGgsXG4gICAgICBidW5kbGU6IHRydWUsXG4gICAgICBmb3JtYXQ6ICdlc20nLFxuICAgICAgcGxhdGZvcm06ICdub2RlJyxcbiAgICAgIGpzeDogJ3ByZXNlcnZlJyxcbiAgICAgIHRhcmdldDogJ2VzMjAyMicsXG4gICAgICB3cml0ZTogdHJ1ZSxcbiAgICAgIHRyZWVTaGFraW5nOiB0cnVlLFxuICAgICAgZXh0ZXJuYWw6IFsnQHdvcmtmbG93L2NvcmUnXSxcbiAgICAgIHJlc29sdmVFeHRlbnNpb25zOiBbXG4gICAgICAgICcudHMnLFxuICAgICAgICAnLnRzeCcsXG4gICAgICAgICcubXRzJyxcbiAgICAgICAgJy5jdHMnLFxuICAgICAgICAnLmpzJyxcbiAgICAgICAgJy5qc3gnLFxuICAgICAgICAnLm1qcycsXG4gICAgICAgICcuY2pzJyxcbiAgICAgIF0sXG4gICAgICBwbHVnaW5zOiBbXG4gICAgICAgIGNyZWF0ZVN3Y1BsdWdpbih7XG4gICAgICAgICAgbW9kZTogJ2NsaWVudCcsXG4gICAgICAgICAgcHJvamVjdFJvb3Q6IHRoaXMudHJhbnNmb3JtUHJvamVjdFJvb3QsXG4gICAgICAgICAgbW9kdWxlU3BlY2lmaWVyUm9vdDogdGhpcy5tb2R1bGVTcGVjaWZpZXJSb290LFxuICAgICAgICAgIHNpZGVFZmZlY3RFbnRyaWVzOiBub3JtYWxpemVkQ2xpZW50U2lkZUVmZmVjdEVudHJpZXMsXG4gICAgICAgIH0pLFxuICAgICAgXSxcbiAgICB9KTtcblxuICAgIHRoaXMubG9nRXNidWlsZE1lc3NhZ2VzKGNsaWVudFJlc3VsdCwgJ2NsaWVudCBsaWJyYXJ5IGJ1bmRsZScpO1xuXG4gICAgYXdhaXQgdGhpcy5lbnN1cmVTd2NJZ25vcmVkKCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHdlYmhvb2sgaGFuZGxlciBidW5kbGUgZm9yIHJlc3VtaW5nIHdvcmtmbG93cyB2aWEgSFRUUCBjYWxsYmFja3MuXG4gICAqXG4gICAqIEBwYXJhbSBidW5kbGUgLSBJZiB0cnVlLCBidW5kbGVzIGRlcGVuZGVuY2llcyAobmVlZGVkIGZvciBCdWlsZCBPdXRwdXQgQVBJKVxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGNyZWF0ZVdlYmhvb2tCdW5kbGUoe1xuICAgIG91dGZpbGUsXG4gICAgYnVuZGxlID0gZmFsc2UsXG4gIH06IHtcbiAgICBvdXRmaWxlOiBzdHJpbmc7XG4gICAgYnVuZGxlPzogYm9vbGVhbjtcbiAgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMubG9nQ3JlYXRlV2ViaG9va0J1bmRsZUluZm8oJ0NyZWF0aW5nIHdlYmhvb2sgcm91dGUnKTtcbiAgICBhd2FpdCBta2RpcihkaXJuYW1lKG91dGZpbGUpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIC8vIENyZWF0ZSBhIHN0YXRpYyByb3V0ZSB0aGF0IGNhbGxzIHJlc3VtZVdlYmhvb2tcbiAgICAvLyBUaGlzIHJvdXRlIHdvcmtzIGZvciBib3RoIE5leHQuanMgYW5kIFZlcmNlbCBCdWlsZCBPdXRwdXQgQVBJXG4gICAgY29uc3Qgcm91dGVDb250ZW50ID0gYGltcG9ydCB7IHJlc3VtZVdlYmhvb2sgfSBmcm9tICd3b3JrZmxvdy9hcGknO1xuXG5hc3luYyBmdW5jdGlvbiBoYW5kbGVyKHJlcXVlc3QpIHtcbiAgY29uc3QgdXJsID0gbmV3IFVSTChyZXF1ZXN0LnVybCk7XG4gIC8vIEV4dHJhY3QgdG9rZW4gZnJvbSBwYXRobmFtZTogLy53ZWxsLWtub3duL3dvcmtmbG93L3YxL3dlYmhvb2sve3Rva2VufVxuICBjb25zdCBwYXRoUGFydHMgPSB1cmwucGF0aG5hbWUuc3BsaXQoJy8nKTtcbiAgY29uc3QgdG9rZW4gPSBkZWNvZGVVUklDb21wb25lbnQocGF0aFBhcnRzW3BhdGhQYXJ0cy5sZW5ndGggLSAxXSk7XG5cbiAgaWYgKCF0b2tlbikge1xuICAgIHJldHVybiBuZXcgUmVzcG9uc2UoJ01pc3NpbmcgdG9rZW4nLCB7IHN0YXR1czogNDAwIH0pO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHJlc3VtZVdlYmhvb2sodG9rZW4sIHJlcXVlc3QpO1xuICAgIHJldHVybiByZXNwb25zZTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAvLyBUT0RPOiBkaWZmZXJlbnRpYXRlIGJldHdlZW4gaW52YWxpZCB0b2tlbiBhbmQgb3RoZXIgZXJyb3JzXG4gICAgY29uc29sZS5lcnJvcignRXJyb3IgZHVyaW5nIHJlc3VtZVdlYmhvb2snLCBlcnJvcik7XG4gICAgcmV0dXJuIG5ldyBSZXNwb25zZShudWxsLCB7IHN0YXR1czogNDA0IH0pO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBHRVQgPSBoYW5kbGVyO1xuZXhwb3J0IGNvbnN0IFBPU1QgPSBoYW5kbGVyO1xuZXhwb3J0IGNvbnN0IFBVVCA9IGhhbmRsZXI7XG5leHBvcnQgY29uc3QgUEFUQ0ggPSBoYW5kbGVyO1xuZXhwb3J0IGNvbnN0IERFTEVURSA9IGhhbmRsZXI7XG5leHBvcnQgY29uc3QgSEVBRCA9IGhhbmRsZXI7XG5leHBvcnQgY29uc3QgT1BUSU9OUyA9IGhhbmRsZXI7YDtcblxuICAgIGlmICghYnVuZGxlKSB7XG4gICAgICAvLyBGb3IgTmV4dC5qcywganVzdCB3cml0ZSB0aGUgdW5idW5kbGVkIGZpbGVcbiAgICAgIGF3YWl0IHdyaXRlRmlsZShvdXRmaWxlLCByb3V0ZUNvbnRlbnQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEZvciBCdWlsZCBPdXRwdXQgQVBJLCBidW5kbGUgd2l0aCBlc2J1aWxkIHRvIHJlc29sdmUgaW1wb3J0c1xuXG4gICAgY29uc3Qgd2ViaG9va0Zvcm1hdCA9ICdjanMnIGFzIGNvbnN0O1xuICAgIGNvbnN0IHsgYmFubmVyOiB3ZWJob29rSW1wb3J0TWV0YUJhbm5lciwgZGVmaW5lOiB3ZWJob29rSW1wb3J0TWV0YURlZmluZSB9ID1cbiAgICAgIHRoaXMuZ2V0Q2pzSW1wb3J0TWV0YVBvbHlmaWxsKHdlYmhvb2tGb3JtYXQpO1xuXG4gICAgY29uc3Qgd2ViaG9va0J1bmRsZVN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBlc2J1aWxkLmJ1aWxkKHtcbiAgICAgIGJhbm5lcjoge1xuICAgICAgICBqczogYC8vIGJpb21lLWlnbm9yZS1hbGwgbGludDogZ2VuZXJhdGVkIGZpbGVcXG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xcbiR7d2ViaG9va0ltcG9ydE1ldGFCYW5uZXJ9YCxcbiAgICAgIH0sXG4gICAgICBzdGRpbjoge1xuICAgICAgICBjb250ZW50czogcm91dGVDb250ZW50LFxuICAgICAgICByZXNvbHZlRGlyOiB0aGlzLmNvbmZpZy53b3JraW5nRGlyLFxuICAgICAgICBzb3VyY2VmaWxlOiAnd2ViaG9vay1yb3V0ZS5qcycsXG4gICAgICAgIGxvYWRlcjogJ2pzJyxcbiAgICAgIH0sXG4gICAgICBvdXRmaWxlLFxuICAgICAgYWJzV29ya2luZ0RpcjogdGhpcy5jb25maWcud29ya2luZ0RpcixcbiAgICAgIGJ1bmRsZTogdHJ1ZSxcbiAgICAgIGpzeDogJ3ByZXNlcnZlJyxcbiAgICAgIGZvcm1hdDogd2ViaG9va0Zvcm1hdCxcbiAgICAgIHBsYXRmb3JtOiAnbm9kZScsXG4gICAgICBjb25kaXRpb25zOiBbJ2ltcG9ydCcsICdtb2R1bGUnLCAnbm9kZScsICdkZWZhdWx0J10sXG4gICAgICB0YXJnZXQ6ICdlczIwMjInLFxuICAgICAgd3JpdGU6IHRydWUsXG4gICAgICB0cmVlU2hha2luZzogdHJ1ZSxcbiAgICAgIGtlZXBOYW1lczogdHJ1ZSxcbiAgICAgIG1pbmlmeTogZmFsc2UsXG4gICAgICBkZWZpbmU6IHdlYmhvb2tJbXBvcnRNZXRhRGVmaW5lLFxuICAgICAgcmVzb2x2ZUV4dGVuc2lvbnM6IFtcbiAgICAgICAgJy50cycsXG4gICAgICAgICcudHN4JyxcbiAgICAgICAgJy5tdHMnLFxuICAgICAgICAnLmN0cycsXG4gICAgICAgICcuanMnLFxuICAgICAgICAnLmpzeCcsXG4gICAgICAgICcubWpzJyxcbiAgICAgICAgJy5janMnLFxuICAgICAgXSxcbiAgICAgIHNvdXJjZW1hcDogRU1JVF9TT1VSQ0VNQVBTX0ZPUl9ERUJVR0dJTkcsXG4gICAgICBtYWluRmllbGRzOiBbJ21vZHVsZScsICdtYWluJ10sXG4gICAgICAvLyBEb24ndCBleHRlcm5hbGl6ZSBhbnl0aGluZyAtIGJ1bmRsZSBldmVyeXRoaW5nIGluY2x1ZGluZyB3b3JrZmxvdyBwYWNrYWdlc1xuICAgICAgZXh0ZXJuYWw6IFtdLFxuICAgIH0pO1xuXG4gICAgdGhpcy5sb2dFc2J1aWxkTWVzc2FnZXMocmVzdWx0LCAnd2ViaG9vayBidW5kbGUgY3JlYXRpb24nKTtcbiAgICB0aGlzLmxvZ0NyZWF0ZVdlYmhvb2tCdW5kbGVJbmZvKFxuICAgICAgJ0NyZWF0ZWQgd2ViaG9vayBidW5kbGUnLFxuICAgICAgYCR7RGF0ZS5ub3coKSAtIHdlYmhvb2tCdW5kbGVTdGFydH1tc2BcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBwYWNrYWdlLmpzb24gZmlsZSB3aXRoIHRoZSBzcGVjaWZpZWQgbW9kdWxlIHR5cGUuXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgY3JlYXRlUGFja2FnZUpzb24oXG4gICAgZGlyOiBzdHJpbmcsXG4gICAgdHlwZTogJ2NvbW1vbmpzJyB8ICdtb2R1bGUnXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBhY2thZ2VKc29uID0geyB0eXBlIH07XG4gICAgYXdhaXQgd3JpdGVGaWxlKFxuICAgICAgam9pbihkaXIsICdwYWNrYWdlLmpzb24nKSxcbiAgICAgIEpTT04uc3RyaW5naWZ5KHBhY2thZ2VKc29uLCBudWxsLCAyKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIC52Yy1jb25maWcuanNvbiBmaWxlIGZvciBWZXJjZWwgQnVpbGQgT3V0cHV0IEFQSSBmdW5jdGlvbnMuXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgY3JlYXRlVmNDb25maWcoXG4gICAgZGlyOiBzdHJpbmcsXG4gICAgY29uZmlnOiB7XG4gICAgICBydW50aW1lPzogc3RyaW5nO1xuICAgICAgaGFuZGxlcj86IHN0cmluZztcbiAgICAgIGxhdW5jaGVyVHlwZT86IHN0cmluZztcbiAgICAgIGFyY2hpdGVjdHVyZT86IHN0cmluZztcbiAgICAgIHNob3VsZEFkZEhlbHBlcnM/OiBib29sZWFuO1xuICAgICAgc2hvdWxkQWRkU291cmNlbWFwU3VwcG9ydD86IGJvb2xlYW47XG4gICAgICBtYXhEdXJhdGlvbj86IG51bWJlciB8ICdtYXgnO1xuICAgICAgZXhwZXJpbWVudGFsVHJpZ2dlcnM/OiBBcnJheTx7XG4gICAgICAgIHR5cGU6ICdxdWV1ZS92MmJldGEnO1xuICAgICAgICB0b3BpYzogc3RyaW5nO1xuICAgICAgICBjb25zdW1lcjogc3RyaW5nO1xuICAgICAgICBtYXhEZWxpdmVyaWVzPzogbnVtYmVyO1xuICAgICAgICByZXRyeUFmdGVyU2Vjb25kcz86IG51bWJlcjtcbiAgICAgICAgaW5pdGlhbERlbGF5U2Vjb25kcz86IG51bWJlcjtcbiAgICAgIH0+O1xuICAgIH1cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdmNDb25maWcgPSB7XG4gICAgICBydW50aW1lOiBjb25maWcucnVudGltZSA/PyAnbm9kZWpzMjIueCcsXG4gICAgICBoYW5kbGVyOiBjb25maWcuaGFuZGxlciA/PyAnaW5kZXguanMnLFxuICAgICAgbGF1bmNoZXJUeXBlOiBjb25maWcubGF1bmNoZXJUeXBlID8/ICdOb2RlanMnLFxuICAgICAgYXJjaGl0ZWN0dXJlOiBjb25maWcuYXJjaGl0ZWN0dXJlID8/ICdhcm02NCcsXG4gICAgICBzaG91bGRBZGRIZWxwZXJzOiBjb25maWcuc2hvdWxkQWRkSGVscGVycyA/PyB0cnVlLFxuICAgICAgLi4uKGNvbmZpZy5tYXhEdXJhdGlvbiAhPT0gdW5kZWZpbmVkICYmIHtcbiAgICAgICAgbWF4RHVyYXRpb246IGNvbmZpZy5tYXhEdXJhdGlvbixcbiAgICAgIH0pLFxuICAgICAgLi4uKGNvbmZpZy5zaG91bGRBZGRTb3VyY2VtYXBTdXBwb3J0ICE9PSB1bmRlZmluZWQgJiYge1xuICAgICAgICBzaG91bGRBZGRTb3VyY2VtYXBTdXBwb3J0OiBjb25maWcuc2hvdWxkQWRkU291cmNlbWFwU3VwcG9ydCxcbiAgICAgIH0pLFxuICAgICAgLi4uKGNvbmZpZy5leHBlcmltZW50YWxUcmlnZ2VycyAmJiB7XG4gICAgICAgIGV4cGVyaW1lbnRhbFRyaWdnZXJzOiBjb25maWcuZXhwZXJpbWVudGFsVHJpZ2dlcnMsXG4gICAgICB9KSxcbiAgICB9O1xuXG4gICAgYXdhaXQgd3JpdGVGaWxlKFxuICAgICAgam9pbihkaXIsICcudmMtY29uZmlnLmpzb24nKSxcbiAgICAgIEpTT04uc3RyaW5naWZ5KHZjQ29uZmlnLCBudWxsLCAyKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgYSBwYXRoIHJlbGF0aXZlIHRvIHRoZSB3b3JraW5nIGRpcmVjdG9yeS5cbiAgICovXG4gIHByb3RlY3RlZCByZXNvbHZlUGF0aChwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiByZXNvbHZlKHRoaXMuY29uZmlnLndvcmtpbmdEaXIsIHBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuc3VyZXMgdGhlIGRpcmVjdG9yeSBmb3IgYSBmaWxlIHBhdGggZXhpc3RzLCBjcmVhdGluZyBpdCBpZiBuZWNlc3NhcnkuXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgZW5zdXJlRGlyZWN0b3J5KGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBta2RpcihkaXJuYW1lKGZpbGVQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgZW5zdXJlU3djSWdub3JlZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZVByb2plY3RTd2NHaXRpZ25vcmVFbnRyeSgpO1xuICAgIGF3YWl0IHRoaXMuY3JlYXRlU3djRGlyZWN0b3J5R2l0aWdub3JlKCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGVuc3VyZVByb2plY3RTd2NHaXRpZ25vcmVFbnRyeSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBnaXRpZ25vcmVQYXRoID0gam9pbih0aGlzLmNvbmZpZy53b3JraW5nRGlyLCAnLmdpdGlnbm9yZScpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGxldCBjb250ZW50ID0gJyc7XG4gICAgICB0cnkge1xuICAgICAgICBjb250ZW50ID0gYXdhaXQgcmVhZEZpbGUoZ2l0aWdub3JlUGF0aCwgJ3V0Zi04Jyk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoKGVycm9yIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbikuY29kZSAhPT0gJ0VOT0VOVCcpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgaGFzU3djRW50cnkgPSBjb250ZW50LnNwbGl0KC9cXHI/XFxuLykuc29tZSgobGluZSkgPT4ge1xuICAgICAgICBjb25zdCB0cmltbWVkID0gbGluZS50cmltKCk7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgdHJpbW1lZCA9PT0gJy5zd2MnIHx8XG4gICAgICAgICAgdHJpbW1lZCA9PT0gJy5zd2MvJyB8fFxuICAgICAgICAgIHRyaW1tZWQgPT09ICcvLnN3YycgfHxcbiAgICAgICAgICB0cmltbWVkID09PSAnLy5zd2MvJ1xuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChoYXNTd2NFbnRyeSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNlcGFyYXRvciA9XG4gICAgICAgIGNvbnRlbnQubGVuZ3RoID4gMCAmJiAhY29udGVudC5lbmRzV2l0aCgnXFxuJykgPyAnXFxuJyA6ICcnO1xuICAgICAgYXdhaXQgd3JpdGVGaWxlKGdpdGlnbm9yZVBhdGgsIGAke2NvbnRlbnR9JHtzZXBhcmF0b3J9Ly5zd2NcXG5gKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIFdlJ3JlIGludGVudGlvbmFsbHkgc2lsZW50bHkgaWdub3JpbmcgdGhpcyBlcnJvciAtIHVwZGF0aW5nIC5naXRpZ25vcmUgaXNuJ3QgY3JpdGljYWxcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNyZWF0ZVN3Y0RpcmVjdG9yeUdpdGlnbm9yZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgd3JpdGVGaWxlKFxuICAgICAgICBqb2luKHRoaXMuY29uZmlnLndvcmtpbmdEaXIsICcuc3djJywgJy5naXRpZ25vcmUnKSxcbiAgICAgICAgJypcXG4nXG4gICAgICApO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gV2UncmUgaW50ZW50aW9uYWxseSBzaWxlbnRseSBpZ25vcmluZyB0aGlzIGVycm9yIC0gY3JlYXRpbmcgLmdpdGlnbm9yZSBpc24ndCBjcml0aWNhbFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBtYW5pZmVzdCBzaG91bGQgYmUgZXhwb3NlZCBhcyBhIHB1YmxpYyBIVFRQIHJvdXRlLlxuICAgKiBDb250cm9sbGVkIGJ5IHRoZSBgV09SS0ZMT1dfUFVCTElDX01BTklGRVNUYCBlbnZpcm9ubWVudCB2YXJpYWJsZS5cbiAgICovXG4gIHByb3RlY3RlZCBnZXQgc2hvdWxkRXhwb3NlUHVibGljTWFuaWZlc3QoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHByb2Nlc3MuZW52LldPUktGTE9XX1BVQkxJQ19NQU5JRkVTVCA9PT0gJzEnO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgZGlhZ25vc3RpY3MgYXJ0aWZhY3RzIHNob3VsZCBiZSBlbWl0dGVkIHRvIFZlcmNlbCBvdXRwdXQuXG4gICAqIFRoaXMgaXMgZW5hYmxlZCB3aGVuIHRoZSByZXNvbHZlZCB3b3JsZCB0YXJnZXQgaXMgVmVyY2VsLlxuICAgKi9cbiAgcHJvdGVjdGVkIGdldCBzaG91bGRFbWl0VmVyY2VsRGlhZ25vc3RpY3MoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHVzZXNWZXJjZWxXb3JsZCgpIHx8IHRoaXMuY29uZmlnLmJ1aWxkVGFyZ2V0ID09PSAndmVyY2VsLWJ1aWxkLW91dHB1dC1hcGknXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbWFuaWZlc3QgSlNPTiBmaWxlIGNvbnRhaW5pbmcgc3RlcC93b3JrZmxvdy9jbGFzcyBtZXRhZGF0YVxuICAgKiBhbmQgZ3JhcGggZGF0YSBmb3IgdmlzdWFsaXphdGlvbi5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIG1hbmlmZXN0IEpTT04gc3RyaW5nLCBvciB1bmRlZmluZWQgaWYgbWFuaWZlc3QgY3JlYXRpb24gZmFpbGVkLlxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGNyZWF0ZU1hbmlmZXN0KHtcbiAgICB3b3JrZmxvd0J1bmRsZVBhdGgsXG4gICAgbWFuaWZlc3REaXIsXG4gICAgbWFuaWZlc3QsXG4gIH06IHtcbiAgICB3b3JrZmxvd0J1bmRsZVBhdGg6IHN0cmluZztcbiAgICBtYW5pZmVzdERpcjogc3RyaW5nO1xuICAgIG1hbmlmZXN0OiBXb3JrZmxvd01hbmlmZXN0O1xuICB9KTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCBidWlsZFN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICB0aGlzLmxvZ0NyZWF0ZU1hbmlmZXN0SW5mbygnQ3JlYXRpbmcgbWFuaWZlc3QuLi4nKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB3b3JrZmxvd0dyYXBocyA9IGF3YWl0IGV4dHJhY3RXb3JrZmxvd0dyYXBocyh3b3JrZmxvd0J1bmRsZVBhdGgpO1xuXG4gICAgICBjb25zdCBzdGVwcyA9IHRoaXMuY29udmVydFN0ZXBzTWFuaWZlc3QobWFuaWZlc3Quc3RlcHMpO1xuICAgICAgY29uc3Qgd29ya2Zsb3dzID0gdGhpcy5jb252ZXJ0V29ya2Zsb3dzTWFuaWZlc3QoXG4gICAgICAgIG1hbmlmZXN0LndvcmtmbG93cyxcbiAgICAgICAgd29ya2Zsb3dHcmFwaHNcbiAgICAgICk7XG4gICAgICBjb25zdCBjbGFzc2VzID0gdGhpcy5jb252ZXJ0Q2xhc3Nlc01hbmlmZXN0KG1hbmlmZXN0LmNsYXNzZXMpO1xuXG4gICAgICBjb25zdCBvdXRwdXQgPSB7IHZlcnNpb246ICcxLjAuMCcsIHN0ZXBzLCB3b3JrZmxvd3MsIGNsYXNzZXMgfTtcbiAgICAgIGNvbnN0IG1hbmlmZXN0SnNvbiA9IEpTT04uc3RyaW5naWZ5KG91dHB1dCwgbnVsbCwgMik7XG5cbiAgICAgIGF3YWl0IG1rZGlyKG1hbmlmZXN0RGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIGF3YWl0IHdyaXRlRmlsZShqb2luKG1hbmlmZXN0RGlyLCAnbWFuaWZlc3QuanNvbicpLCBtYW5pZmVzdEpzb24pO1xuICAgICAgaWYgKHRoaXMuc2hvdWxkRW1pdFZlcmNlbERpYWdub3N0aWNzKSB7XG4gICAgICAgIGNvbnN0IGRpYWdub3N0aWNzTWFuaWZlc3RQYXRoID0gdGhpcy5yZXNvbHZlUGF0aChcbiAgICAgICAgICAnLnZlcmNlbC9vdXRwdXQvZGlhZ25vc3RpY3Mvd29ya2Zsb3dzLW1hbmlmZXN0Lmpzb24nXG4gICAgICAgICk7XG4gICAgICAgIGF3YWl0IHRoaXMuZW5zdXJlRGlyZWN0b3J5KGRpYWdub3N0aWNzTWFuaWZlc3RQYXRoKTtcbiAgICAgICAgYXdhaXQgd3JpdGVGaWxlKGRpYWdub3N0aWNzTWFuaWZlc3RQYXRoLCBtYW5pZmVzdEpzb24pO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzdGVwQ291bnQgPSBPYmplY3QudmFsdWVzKHN0ZXBzKS5yZWR1Y2UoXG4gICAgICAgIChhY2MsIHMpID0+IGFjYyArIE9iamVjdC5rZXlzKHMpLmxlbmd0aCxcbiAgICAgICAgMFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHdvcmtmbG93Q291bnQgPSBPYmplY3QudmFsdWVzKHdvcmtmbG93cykucmVkdWNlKFxuICAgICAgICAoYWNjLCB3KSA9PiBhY2MgKyBPYmplY3Qua2V5cyh3KS5sZW5ndGgsXG4gICAgICAgIDBcbiAgICAgICk7XG4gICAgICBjb25zdCBjbGFzc0NvdW50ID0gT2JqZWN0LnZhbHVlcyhjbGFzc2VzKS5yZWR1Y2UoXG4gICAgICAgIChhY2MsIGMpID0+IGFjYyArIE9iamVjdC5rZXlzKGMpLmxlbmd0aCxcbiAgICAgICAgMFxuICAgICAgKTtcblxuICAgICAgdGhpcy5sb2dDcmVhdGVNYW5pZmVzdEluZm8oXG4gICAgICAgIGBDcmVhdGVkIG1hbmlmZXN0IHdpdGggJHtzdGVwQ291bnR9ICR7cGx1cmFsaXplKCdzdGVwJywgJ3N0ZXBzJywgc3RlcENvdW50KX0sICR7d29ya2Zsb3dDb3VudH0gJHtwbHVyYWxpemUoJ3dvcmtmbG93JywgJ3dvcmtmbG93cycsIHdvcmtmbG93Q291bnQpfSwgYW5kICR7Y2xhc3NDb3VudH0gJHtwbHVyYWxpemUoJ2NsYXNzJywgJ2NsYXNzZXMnLCBjbGFzc0NvdW50KX1gLFxuICAgICAgICBgJHtEYXRlLm5vdygpIC0gYnVpbGRTdGFydH1tc2BcbiAgICAgICk7XG5cbiAgICAgIGlmICghdGhpcy5jb25maWcuc3VwcHJlc3NDcmVhdGVNYW5pZmVzdExvZ3MpIHtcbiAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgYCR7dGhpcy5nZXRXb3JrZmxvd0J1aWxkU3VtbWFyeVByZWZpeCgpfSAoJHtzdGVwQ291bnR9ICR7cGx1cmFsaXplKCdzdGVwJywgJ3N0ZXBzJywgc3RlcENvdW50KX0sICR7d29ya2Zsb3dDb3VudH0gJHtwbHVyYWxpemUoJ3dvcmtmbG93JywgJ3dvcmtmbG93cycsIHdvcmtmbG93Q291bnQpfSwgdGltZSAke2Zvcm1hdEJ1aWxkRHVyYXRpb24odGhpcy5nZXRXb3JrZmxvd0J1aWxkRHVyYXRpb24oKSl9KWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHRoaXMud29ya2Zsb3dCdWlsZFN1bW1hcnlDb3VudCArPSAxO1xuICAgICAgdGhpcy5yZXNldFdvcmtmbG93QnVpbGRUaW1lcigpO1xuXG4gICAgICByZXR1cm4gbWFuaWZlc3RKc29uO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICdGYWlsZWQgdG8gY3JlYXRlIG1hbmlmZXN0OicsXG4gICAgICAgIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKVxuICAgICAgKTtcbiAgICAgIHRoaXMucmVzZXRXb3JrZmxvd0J1aWxkVGltZXIoKTtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0U3RlcHNNYW5pZmVzdChcbiAgICBzdGVwczogV29ya2Zsb3dNYW5pZmVzdFsnc3RlcHMnXVxuICApOiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB7IHN0ZXBJZDogc3RyaW5nIH0+PiB7XG4gICAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB7IHN0ZXBJZDogc3RyaW5nIH0+PiA9IHt9O1xuICAgIGlmICghc3RlcHMpIHJldHVybiByZXN1bHQ7XG5cbiAgICBmb3IgKGNvbnN0IFtmaWxlUGF0aCwgZW50cmllc10gb2YgT2JqZWN0LmVudHJpZXMoc3RlcHMpKSB7XG4gICAgICByZXN1bHRbZmlsZVBhdGhdID0ge307XG4gICAgICBmb3IgKGNvbnN0IFtuYW1lLCBkYXRhXSBvZiBPYmplY3QuZW50cmllcyhlbnRyaWVzKSkge1xuICAgICAgICByZXN1bHRbZmlsZVBhdGhdW25hbWVdID0geyBzdGVwSWQ6IGRhdGEuc3RlcElkIH07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRXb3JrZmxvd3NNYW5pZmVzdChcbiAgICB3b3JrZmxvd3M6IFdvcmtmbG93TWFuaWZlc3RbJ3dvcmtmbG93cyddLFxuICAgIGdyYXBoczogUmVjb3JkPFxuICAgICAgc3RyaW5nLFxuICAgICAgUmVjb3JkPHN0cmluZywgeyBncmFwaDogeyBub2RlczogYW55W107IGVkZ2VzOiBhbnlbXSB9IH0+XG4gICAgPlxuICApOiBSZWNvcmQ8XG4gICAgc3RyaW5nLFxuICAgIFJlY29yZDxcbiAgICAgIHN0cmluZyxcbiAgICAgIHsgd29ya2Zsb3dJZDogc3RyaW5nOyBncmFwaDogeyBub2RlczogYW55W107IGVkZ2VzOiBhbnlbXSB9IH1cbiAgICA+XG4gID4ge1xuICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPFxuICAgICAgc3RyaW5nLFxuICAgICAgUmVjb3JkPFxuICAgICAgICBzdHJpbmcsXG4gICAgICAgIHsgd29ya2Zsb3dJZDogc3RyaW5nOyBncmFwaDogeyBub2RlczogYW55W107IGVkZ2VzOiBhbnlbXSB9IH1cbiAgICAgID5cbiAgICA+ID0ge307XG4gICAgaWYgKCF3b3JrZmxvd3MpIHJldHVybiByZXN1bHQ7XG5cbiAgICAvLyBCdWlsZCBhIG5vcm1hbGl6ZWQgbG9va3VwIGZvciBncmFwaHMgc2luY2UgdGhlIGdyYXBoIGV4dHJhY3RvciB1c2VzXG4gICAgLy8gcGF0aHMgZnJvbSB3b3JrZmxvd0lkIChlLmcuIFwiLi93b3JrZmxvd3MvaGVsbG8tYWdlbnRcIikgd2hpbGUgdGhlXG4gICAgLy8gbWFuaWZlc3QgdXNlcyBzb3VyY2UgZmlsZSBwYXRocyAoZS5nLiBcIndvcmtmbG93cy9oZWxsby1hZ2VudC50c1wiKS5cbiAgICAvLyBOb3JtYWxpemUgYnkgc3RyaXBwaW5nIGxlYWRpbmcgXCIuL1wiIGFuZCBmaWxlIGV4dGVuc2lvbnMuXG4gICAgY29uc3Qgbm9ybWFsaXplZEdyYXBocyA9IG5ldyBNYXA8XG4gICAgICBzdHJpbmcsXG4gICAgICBSZWNvcmQ8c3RyaW5nLCB7IGdyYXBoOiB7IG5vZGVzOiBhbnlbXTsgZWRnZXM6IGFueVtdIH0gfT5cbiAgICA+KCk7XG4gICAgZm9yIChjb25zdCBbZ3JhcGhQYXRoLCBncmFwaEVudHJpZXNdIG9mIE9iamVjdC5lbnRyaWVzKGdyYXBocykpIHtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBncmFwaFBhdGhcbiAgICAgICAgLnJlcGxhY2UoL15cXC5cXC8vLCAnJylcbiAgICAgICAgLnJlcGxhY2UoL1xcLlteLy5dKyQvLCAnJyk7XG4gICAgICBub3JtYWxpemVkR3JhcGhzLnNldChub3JtYWxpemVkLCBncmFwaEVudHJpZXMpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgW2ZpbGVQYXRoLCBlbnRyaWVzXSBvZiBPYmplY3QuZW50cmllcyh3b3JrZmxvd3MpKSB7XG4gICAgICByZXN1bHRbZmlsZVBhdGhdID0ge307XG4gICAgICAvLyBOb3JtYWxpemUgdGhlIG1hbmlmZXN0IGZpbGUgcGF0aCBmb3IgbG9va3VwXG4gICAgICBjb25zdCBub3JtYWxpemVkRmlsZVBhdGggPSBmaWxlUGF0aFxuICAgICAgICAucmVwbGFjZSgvXlxcLlxcLy8sICcnKVxuICAgICAgICAucmVwbGFjZSgvXFwuW14vLl0rJC8sICcnKTtcblxuICAgICAgY29uc3QgZ3JhcGhFbnRyaWVzID1cbiAgICAgICAgZ3JhcGhzW2ZpbGVQYXRoXSB8fCBub3JtYWxpemVkR3JhcGhzLmdldChub3JtYWxpemVkRmlsZVBhdGgpO1xuXG4gICAgICBmb3IgKGNvbnN0IFtuYW1lLCBkYXRhXSBvZiBPYmplY3QuZW50cmllcyhlbnRyaWVzKSkge1xuICAgICAgICByZXN1bHRbZmlsZVBhdGhdW25hbWVdID0ge1xuICAgICAgICAgIHdvcmtmbG93SWQ6IGRhdGEud29ya2Zsb3dJZCxcbiAgICAgICAgICBncmFwaDogZ3JhcGhFbnRyaWVzPy5bbmFtZV0/LmdyYXBoIHx8IHsgbm9kZXM6IFtdLCBlZGdlczogW10gfSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydENsYXNzZXNNYW5pZmVzdChcbiAgICBjbGFzc2VzOiBXb3JrZmxvd01hbmlmZXN0WydjbGFzc2VzJ11cbiAgKTogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgeyBjbGFzc0lkOiBzdHJpbmcgfT4+IHtcbiAgICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHsgY2xhc3NJZDogc3RyaW5nIH0+PiA9IHt9O1xuICAgIGlmICghY2xhc3NlcykgcmV0dXJuIHJlc3VsdDtcblxuICAgIGZvciAoY29uc3QgW2ZpbGVQYXRoLCBlbnRyaWVzXSBvZiBPYmplY3QuZW50cmllcyhjbGFzc2VzKSkge1xuICAgICAgcmVzdWx0W2ZpbGVQYXRoXSA9IHt9O1xuICAgICAgZm9yIChjb25zdCBbbmFtZSwgZGF0YV0gb2YgT2JqZWN0LmVudHJpZXMoZW50cmllcykpIHtcbiAgICAgICAgcmVzdWx0W2ZpbGVQYXRoXVtuYW1lXSA9IHsgY2xhc3NJZDogZGF0YS5jbGFzc0lkIH07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cbiJdfQ==
|