@pipeline-builder/pipeline-core 4.1.15 → 4.1.16
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/lib/cdk.d.ts +1 -0
- package/lib/cdk.js +2 -1
- package/lib/config/app-config.d.ts +5 -8
- package/lib/config/app-config.js +36 -38
- package/lib/config/config-types.d.ts +9 -112
- package/lib/config/config-types.js +1 -1
- package/lib/config/handler-constants.d.ts +12 -3
- package/lib/config/handler-constants.js +9 -26
- package/lib/config/infrastructure-config.js +44 -43
- package/lib/config/server-config.d.ts +1 -1
- package/lib/config/server-config.js +33 -32
- package/lib/config/service-client.d.ts +3 -7
- package/lib/config/service-client.js +5 -11
- package/lib/core/artifact-manager.d.ts +0 -17
- package/lib/core/artifact-manager.js +1 -17
- package/lib/core/metadata-helpers.d.ts +16 -0
- package/lib/core/metadata-helpers.js +41 -1
- package/lib/core/pipeline-helpers.js +23 -58
- package/lib/core/plugin-contract.d.ts +126 -0
- package/lib/core/plugin-contract.js +217 -0
- package/lib/core/plugin-lookup-envelope.d.ts +14 -0
- package/lib/core/plugin-lookup-envelope.js +29 -0
- package/lib/core/step-manifest.d.ts +50 -0
- package/lib/core/step-manifest.js +47 -0
- package/lib/handlers/platform-credential.d.ts +47 -0
- package/lib/handlers/platform-credential.js +87 -0
- package/lib/handlers/plugin-lookup-handler.d.ts +1 -1
- package/lib/handlers/plugin-lookup-handler.js +48 -42
- package/lib/index.d.ts +8 -8
- package/lib/index.js +10 -9
- package/lib/pipeline/pipeline-builder.d.ts +7 -0
- package/lib/pipeline/pipeline-builder.js +25 -9
- package/lib/pipeline/pipeline-configuration.js +6 -5
- package/lib/pipeline/plugin-lookup.d.ts +0 -1
- package/lib/pipeline/plugin-lookup.js +55 -23
- package/lib/pipeline/plugin-spec.d.ts +41 -0
- package/lib/pipeline/plugin-spec.js +1 -1
- package/lib/pipeline/stage-builder.d.ts +11 -0
- package/lib/pipeline/stage-builder.js +31 -12
- package/lib/pipeline/step-manifest-recorder.d.ts +22 -0
- package/lib/pipeline/step-manifest-recorder.js +57 -0
- package/lib/pipeline/step-types.d.ts +16 -4
- package/lib/pipeline/step-types.js +1 -1
- package/lib/template/index.d.ts +4 -4
- package/lib/template/index.js +5 -5
- package/lib/template/plugin-resolver.js +5 -5
- package/lib/template/tokenizer.d.ts +4 -0
- package/lib/template/tokenizer.js +11 -7
- package/lib/testing/exports.json +72 -0
- package/package.json +36 -8
- package/lib/config/billing-config.d.ts +0 -27
- package/lib/config/billing-config.js +0 -534
- package/lib/config/entitlements.d.ts +0 -23
- package/lib/config/entitlements.js +0 -46
|
@@ -14,15 +14,17 @@ import { Construct } from 'constructs';
|
|
|
14
14
|
import { PipelineConfiguration } from './pipeline-configuration.js';
|
|
15
15
|
import { PluginLookup } from './plugin-lookup.js';
|
|
16
16
|
import { SourceBuilder } from './source-builder.js';
|
|
17
|
-
import { StageBuilder } from './stage-builder.js';
|
|
17
|
+
import { StageBuilder, codePipelineStageName } from './stage-builder.js';
|
|
18
|
+
import { StepManifestRecorder } from './step-manifest-recorder.js';
|
|
18
19
|
import { Config, CoreConstants } from '../config/app-config.js';
|
|
19
20
|
import { lambdaArchitecture, lambdaRuntime, lambdaTimeout } from '../config/aws-config-cdk.js';
|
|
20
|
-
import { ArtifactManager
|
|
21
|
+
import { ArtifactManager } from '../core/artifact-manager.js';
|
|
21
22
|
import { UniqueId } from '../core/id-generator.js';
|
|
22
23
|
import { asInt, isTrue, metadataForCodePipeline, networkConfigFromMetadata, parsePipelineVariables, roleConfigFromMetadata, securityGroupConfigFromMetadata, } from '../core/metadata-builder.js';
|
|
23
24
|
import { resolveNetwork, networkConfigFromEnv } from '../core/network.js';
|
|
24
25
|
import { createCodeBuildStep, getComputeType, resolveDefaultBuildImage } from '../core/pipeline-helpers.js';
|
|
25
26
|
import { MetadataKeys, TriggerType } from '../core/pipeline-types.js';
|
|
27
|
+
import { assertPluginContract, contractScopeFromTemplateScope, pluginArtifactAlias } from '../core/plugin-contract.js';
|
|
26
28
|
import { resolveRole } from '../core/role.js';
|
|
27
29
|
import { resolveSecurityGroup } from '../core/security-group.js';
|
|
28
30
|
const PIPELINE_EVENT_MAP = {
|
|
@@ -51,7 +53,9 @@ function tagSafeToken(value) {
|
|
|
51
53
|
/** AWS tag-value hard limit; `pb.deploys` must never exceed this. */
|
|
52
54
|
const MAX_TAG_VALUE_LENGTH = 256;
|
|
53
55
|
/**
|
|
54
|
-
* Build the `pb.deploys` tag value: `<stage>:<env>` pairs joined by
|
|
56
|
+
* Build the `pb.deploys` tag value: `<stage>:<env>` pairs joined by `+`, where
|
|
57
|
+
* `<stage>` is the CodePipeline stage name ({@link codePipelineStageName} — the
|
|
58
|
+
* wave id events report as `detail.stage`), never the display `stageName`.
|
|
55
59
|
*
|
|
56
60
|
* A stage is a deploy iff it declares an `environment`. Precedence:
|
|
57
61
|
* - Multi-env: any stage with a per-stage `environment` — list each such stage.
|
|
@@ -61,7 +65,7 @@ const MAX_TAG_VALUE_LENGTH = 256;
|
|
|
61
65
|
* with a synth warning recommending explicit per-stage `environment`), or a
|
|
62
66
|
* literal `Deploy:<env>` when there are no stages to name.
|
|
63
67
|
*
|
|
64
|
-
* The assembled value is capped at AWS's 256-char tag-value limit
|
|
68
|
+
* The assembled value is capped at AWS's 256-char tag-value limit: the
|
|
65
69
|
* headline/production pair is kept first and trailing overflow pairs are dropped
|
|
66
70
|
* with a synth warning naming them. Never returns a value longer than 256 chars.
|
|
67
71
|
*
|
|
@@ -73,20 +77,20 @@ function buildDeploysTag(props) {
|
|
|
73
77
|
let pairs;
|
|
74
78
|
if (stagesWithEnv.length > 0) {
|
|
75
79
|
pairs = stagesWithEnv.map(s => ({
|
|
76
|
-
str: `${tagSafeToken(s
|
|
80
|
+
str: `${tagSafeToken(codePipelineStageName(s))}:${tagSafeToken(s.environment)}`,
|
|
77
81
|
env: s.environment,
|
|
78
82
|
}));
|
|
79
83
|
}
|
|
80
84
|
else if (props.environment) {
|
|
81
85
|
let stageName;
|
|
82
86
|
if (stages.length === 1) {
|
|
83
|
-
stageName = stages[0]
|
|
87
|
+
stageName = codePipelineStageName(stages[0]);
|
|
84
88
|
}
|
|
85
89
|
else if (stages.length > 1) {
|
|
86
90
|
// Pipeline-level environment on a multi-stage pipeline: attribute it to the
|
|
87
91
|
// LAST stage (deploys are conventionally final) rather than an unmatched
|
|
88
92
|
// literal `Deploy`. Warn so authors move to explicit per-stage `environment`.
|
|
89
|
-
stageName = stages[stages.length - 1]
|
|
93
|
+
stageName = codePipelineStageName(stages[stages.length - 1]);
|
|
90
94
|
createLogger('pipeline-builder').warn(`Pipeline-level environment "${props.environment}" attributed to the last stage ` +
|
|
91
95
|
`"${stageName}" of a ${stages.length}-stage pipeline. Declare a per-stage ` +
|
|
92
96
|
'`environment` on the actual deploy stage(s) for precise DORA attribution.');
|
|
@@ -162,6 +166,12 @@ function capDeploysValue(pairs) {
|
|
|
162
166
|
export class PipelineBuilder extends Construct {
|
|
163
167
|
pipeline;
|
|
164
168
|
config;
|
|
169
|
+
/**
|
|
170
|
+
* Which plugin each CodePipeline action runs, read off the built
|
|
171
|
+
* pipeline. The CLI ships it with the registry registration so event ingest
|
|
172
|
+
* can attribute action outcomes to a plugin version.
|
|
173
|
+
*/
|
|
174
|
+
stepManifest;
|
|
165
175
|
constructor(scope, id, props) {
|
|
166
176
|
super(scope, id);
|
|
167
177
|
// Apply platform-sourced registry overrides BEFORE any Config.get('registry')
|
|
@@ -217,7 +227,7 @@ export class PipelineBuilder extends Construct {
|
|
|
217
227
|
// pluginLookup.plugin() reads `resolvedPlugins` internally and returns
|
|
218
228
|
// the cached entry when present — so calling it always wins over
|
|
219
229
|
// bootstrap() when pre-resolution succeeded.
|
|
220
|
-
const synthCacheKey = this.config.plugin
|
|
230
|
+
const synthCacheKey = pluginArtifactAlias(this.config.plugin);
|
|
221
231
|
const plugin = props.resolvedPlugins?.[synthCacheKey]
|
|
222
232
|
? pluginLookup.plugin(this.config.plugin)
|
|
223
233
|
: pluginLookup.bootstrap();
|
|
@@ -227,6 +237,9 @@ export class PipelineBuilder extends Construct {
|
|
|
227
237
|
// config so the synth step, every stage step, and the source token all
|
|
228
238
|
// resolve against the same snapshot (see PipelineConfiguration.getPipelineScope).
|
|
229
239
|
const pipelineScope = this.config.getPipelineScope();
|
|
240
|
+
// Contract — see StageBuilder.resolveStep.
|
|
241
|
+
assertPluginContract(plugin, contractScopeFromTemplateScope(pipelineScope), 'synth');
|
|
242
|
+
const stepManifest = new StepManifestRecorder();
|
|
230
243
|
const synth = createCodeBuildStep({
|
|
231
244
|
...this.config.synthCustomization,
|
|
232
245
|
id: uniqueId.generate('cdk:synth'),
|
|
@@ -247,6 +260,7 @@ export class PipelineBuilder extends Construct {
|
|
|
247
260
|
orgId: props.orgId,
|
|
248
261
|
pipelineScope,
|
|
249
262
|
});
|
|
263
|
+
stepManifest.record(synth, plugin);
|
|
250
264
|
// Resolve pipeline-level defaults into codeBuildDefaults
|
|
251
265
|
// Build the per-org platform secret name for CodeBuild env vars
|
|
252
266
|
const platformSecretName = props.orgId
|
|
@@ -291,6 +305,7 @@ export class PipelineBuilder extends Construct {
|
|
|
291
305
|
artifactManager,
|
|
292
306
|
orgId: props.orgId,
|
|
293
307
|
pipelineScope,
|
|
308
|
+
stepManifest,
|
|
294
309
|
});
|
|
295
310
|
stageBuilder.addStages(this.pipeline, props.stages);
|
|
296
311
|
}
|
|
@@ -329,6 +344,7 @@ export class PipelineBuilder extends Construct {
|
|
|
329
344
|
// Build the internal pipeline before accessing its properties
|
|
330
345
|
this.pipeline.buildPipeline();
|
|
331
346
|
const cdkPipeline = this.pipeline.pipeline;
|
|
347
|
+
this.stepManifest = stepManifest.entries(cdkPipeline);
|
|
332
348
|
const meta = this.config.metadata.merged;
|
|
333
349
|
// ── Pipeline-level Variables (CodePipeline V2) ──
|
|
334
350
|
for (const v of parsePipelineVariables(meta[MetadataKeys.PIPELINE_VARIABLES])) {
|
|
@@ -479,4 +495,4 @@ export class PipelineBuilder extends Construct {
|
|
|
479
495
|
};
|
|
480
496
|
}
|
|
481
497
|
}
|
|
482
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGlwZWxpbmUtYnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9waXBlbGluZS9waXBlbGluZS1idWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRTFELE9BQU8sRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUM1RCxPQUFPLEtBQUssVUFBVSxNQUFNLDRCQUE0QixDQUFDO0FBQ3pELE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbEcsT0FBTyxLQUFLLE1BQU0sTUFBTSx3QkFBd0IsQ0FBQztBQUNqRCxPQUFPLEtBQUssT0FBTyxNQUFNLGdDQUFnQyxDQUFDO0FBQzFELE9BQU8sS0FBSyxHQUFHLE1BQU0scUJBQXFCLENBQUM7QUFDM0MsT0FBTyxLQUFLLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN6QyxPQUFPLEtBQUssR0FBRyxNQUFNLHFCQUFxQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxZQUFZLEVBQXlCLE1BQU0sdUJBQXVCLENBQUM7QUFDNUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUN2QyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNwRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUVsRCxPQUFPLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxhQUFh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LyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9hcGktY29yZSc7XG5pbXBvcnQgdHlwZSB7IFBsdWdpbiB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL3BpcGVsaW5lLWRhdGEnO1xuaW1wb3J0IHsgRHVyYXRpb24sIFJlbW92YWxQb2xpY3ksIFRhZ3MgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgKiBhcyBjbG91ZHdhdGNoIGZyb20gJ2F3cy1jZGstbGliL2F3cy1jbG91ZHdhdGNoJztcbmltcG9ydCB7IFBpcGVsaW5lTm90aWZpY2F0aW9uRXZlbnRzLCBQaXBlbGluZVR5cGUsIFZhcmlhYmxlIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWNvZGVwaXBlbGluZSc7XG5pbXBvcnQgKiBhcyBldmVudHMgZnJvbSAnYXdzLWNkay1saWIvYXdzLWV2ZW50cyc7XG5pbXBvcnQgKiBhcyB0YXJnZXRzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1ldmVudHMtdGFyZ2V0cyc7XG5pbXBvcnQgKiBhcyBrbXMgZnJvbSAnYXdzLWNkay1saWIvYXdzLWttcyc7XG5pbXBvcnQgKiBhcyBzMyBmcm9tICdhd3MtY2RrLWxpYi9hd3MtczMnO1xuaW1wb3J0ICogYXMgc25zIGZyb20gJ2F3cy1jZGstbGliL2F3cy1zbnMnO1xuaW1wb3J0IHsgQ29kZVBpcGVsaW5lLCB0eXBlIENvZGVCdWlsZE9wdGlvbnMgfSBmcm9tICdhd3MtY2RrLWxpYi9waXBlbGluZXMnO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBQaXBlbGluZUNvbmZpZ3VyYXRpb24gfSBmcm9tICcuL3BpcGVsaW5lLWNvbmZpZ3VyYXRpb24uanMnO1xuaW1wb3J0IHsgUGx1Z2luTG9va3VwIH0gZnJvbSAnLi9wbHVnaW4tbG9va3VwLmpzJztcbmltcG9ydCB7IFNvdXJjZUJ1aWxkZXIgfSBmcm9tICcuL3NvdXJjZS1idWlsZGVyLmpzJztcbmltcG9ydCB7IFN0YWdlQnVpbGRlciB9IGZyb20gJy4vc3RhZ2UtYnVpbGRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFN0YWdlT3B0aW9ucywgU3ludGhPcHRpb25zIH0gZnJvbSAnLi9zdGVwLXR5cGVzLmpzJztcbmltcG9ydCB7IENvbmZpZywgQ29yZUNvbnN0YW50cyB9IGZyb20gJy4uL2NvbmZpZy9hcHAtY29uZmlnLmpzJztcbmltcG9ydCB7IGxhbWJkYUFyY2hpdGVjdHVyZSwgbGFtYmRhUnVudGltZSwgbGFtYmRhVGltZW91dCB9IGZyb20gJy4uL2NvbmZpZy9hd3MtY29uZmlnLWNkay5qcyc7XG5pbXBvcnQgdHlwZSB7IFJlZ2lzdHJ5Q29uZmlnIH0gZnJvbSAnLi4vY29uZmlnL2NvbmZpZy10eXBlcy5qcyc7XG5pbXBvcnQgeyBBcnRpZmFjdE1hbmFnZXIsIHBsdWdpbkFydGlmYWN0QWxpYXMgfSBmcm9tICcuLi9jb3JlL2FydGlmYWN0LW1hbmFnZXIuanMnO1xuaW1wb3J0IHsgVW5pcXVlSWQgfSBmcm9tICcuLi9jb3JlL2lkLWdlbmVyYXRvci5qcyc7XG5pbXBvcnQge1xuICBhc0ludCxcbiAgaXNUcnVlLFxuICBtZXRhZGF0YUZvckNvZGVQaXBlbGluZSxcbiAgbmV0d29ya0NvbmZpZ0Zyb21NZXRhZGF0YSxcbiAgcGFyc2VQaXBlbGluZVZhcmlhYmxlcyxcbiAgcm9sZUNvbmZpZ0Zyb21NZXRhZGF0YSxcbiAgc2VjdXJpdHlHcm91cENvbmZpZ0Zyb21NZXRhZGF0YSxcbn0gZnJvbSAnLi4vY29yZS9tZXRhZGF0YS1idWlsZGVyLmpzJztcbmltcG9ydCB0eXBlIHsgQ29kZUJ1aWxkRGVmYXVsdHMgfSBmcm9tICcuLi9jb3JlL25ldHdvcmstdHlwZXMuanMnO1xuaW1wb3J0IHsgcmVzb2x2ZU5ldHdvcmssIG5ldHdvcmtDb25maWdGcm9tRW52IH0gZnJvbSAnLi4vY29yZS9uZXR3b3JrLmpzJztcbmltcG9ydCB7IGNyZWF0ZUNvZGVCdWlsZFN0ZXAsIGdldENvbXB1dGVUeXBlLCByZXNvbHZlRGVmYXVsdEJ1aWxkSW1hZ2UgfSBmcm9tICcuLi9jb3JlL3BpcGVsaW5lLWhlbHBlcnMuanMnO1xuaW1wb3J0IHsgTWV0YWRhdGFLZXlzLCBUcmlnZ2VyVHlwZSB9IGZyb20gJy4uL2NvcmUvcGlwZWxpbmUtdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBNZXRhRGF0YVR5cGUgfSBmcm9tICcuLi9jb3JlL3BpcGVsaW5lLXR5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgUm9sZUNvbmZpZyB9IGZyb20gJy4uL2NvcmUvcm9sZS10eXBlcy5qcyc7XG5pbXBvcnQgeyByZXNvbHZlUm9sZSB9IGZyb20gJy4uL2NvcmUvcm9sZS5qcyc7XG5pbXBvcnQgeyByZXNvbHZlU2VjdXJpdHlHcm91cCB9IGZyb20gJy4uL2NvcmUvc2VjdXJpdHktZ3JvdXAuanMnO1xuXG5jb25zdCBQSVBFTElORV9FVkVOVF9NQVA6IFJlY29yZDxzdHJpbmcsIFBpcGVsaW5lTm90aWZpY2F0aW9uRXZlbnRzPiA9IHtcbiAgRkFJTEVEOiBQaXBlbGluZU5vdGlmaWNhdGlvbkV2ZW50cy5QSVBFTElORV9FWEVDVVRJT05fRkFJTEVELFxuICBTVUNDRUVERUQ6IFBpcGVsaW5lTm90aWZpY2F0aW9uRXZlbnRzLlBJUEVMSU5FX0VYRUNVVElPTl9TVUNDRUVERUQsXG4gIFNUQVJURUQ6IFBpcGVsaW5lTm90aWZpY2F0aW9uRXZlbnRzLlBJUEVMSU5FX0VYRUNVVElPTl9TVEFSVEVELFxuICBDQU5DRUxFRDogUGlwZWxpbmVOb3RpZmljYXRpb25FdmVudHMuUElQRUxJTkVfRVhFQ1VUSU9OX0NBTkNFTEVELFxuICBTVVBFUlNFREVEOiBQaXBlbGluZU5vdGlmaWNhdGlvbkV2ZW50cy5QSVBFTElORV9FWEVDVVRJT05fU1VQRVJTRURFRCxcbn07XG5cbmZ1bmN0aW9uIHBhcnNlTm90aWZpY2F0aW9uRXZlbnRzKHZhbHVlOiB1bmtub3duKTogc3RyaW5nW10ge1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiB2YWx1ZTtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHJldHVybiB2YWx1ZS5zcGxpdCgnLCcpLm1hcChzID0+IHMudHJpbSgpKTtcbiAgcmV0dXJuIFsnRkFJTEVEJywgJ1NVQ0NFRURFRCddO1xufVxuXG4vKipcbiAqIFNhbml0aXplIGEgc2luZ2xlIGBwYi5kZXBsb3lzYCB0b2tlbiAoc3RhZ2UgbmFtZSBvciBlbnZpcm9ubWVudCkgdG9cbiAqIENvZGVQaXBlbGluZS10YWctc2FmZSBjaGFyYWN0ZXJzLiBgOmAgYW5kIGArYCBhcmUgdGhlIHBhaXIvbGlzdCBkZWxpbWl0ZXJzLCBzb1xuICogdGhleSAoYW5kIGFueSBvdGhlciBkaXNhbGxvd2VkIGNoYXIpIGFyZSBzdHJpcHBlZCB0byBgLWAgaW5zaWRlIGEgdG9rZW4gdG9cbiAqIGtlZXAgdGhlIHZhbHVlIHVuYW1iaWd1b3VzbHkgcGFyc2VhYmxlIGFuZCBKU09OLWZyZWUuXG4gKi9cbmZ1bmN0aW9uIHRhZ1NhZmVUb2tlbih2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoL1teQS1aYS16MC05Ll8vQD0tXS9nLCAnLScpO1xufVxuXG4vKiogQVdTIHRhZy12YWx1ZSBoYXJkIGxpbWl0OyBgcGIuZGVwbG95c2AgbXVzdCBuZXZlciBleGNlZWQgdGhpcy4gKi9cbmNvbnN0IE1BWF9UQUdfVkFMVUVfTEVOR1RIID0gMjU2O1xuXG4vKiogQSByZXNvbHZlZCBkZXBsb3kgYXR0cmlidXRpb246IGEgc2FuaXRpemVkIGA8c3RhZ2U+OjxlbnY+YCB0b2tlbiBwbHVzIGl0cyBlbnYuICovXG5pbnRlcmZhY2UgRGVwbG95UGFpciB7XG4gIHJlYWRvbmx5IHN0cjogc3RyaW5nO1xuICByZWFkb25seSBlbnY6IHN0cmluZztcbn1cblxuLyoqXG4gKiBCdWlsZCB0aGUgYHBiLmRlcGxveXNgIHRhZyB2YWx1ZTogYDxzdGFnZT46PGVudj5gIHBhaXJzIGpvaW5lZCBieSBgK2AuXG4gKlxuICogQSBzdGFnZSBpcyBhIGRlcGxveSBpZmYgaXQgZGVjbGFyZXMgYW4gYGVudmlyb25tZW50YC4gUHJlY2VkZW5jZTpcbiAqICAtIE11bHRpLWVudjogYW55IHN0YWdlIHdpdGggYSBwZXItc3RhZ2UgYGVudmlyb25tZW50YCDigJQgbGlzdCBlYWNoIHN1Y2ggc3RhZ2UuXG4gKiAgLSBTaW5nbGUtZW52OiBubyBwZXItc3RhZ2UgZW52aXJvbm1lbnQgYnV0IGEgcGlwZWxpbmUtbGV2ZWwgYGVudmlyb25tZW50YCDigJRcbiAqICAgIGF0dHJpYnV0ZSBpdCB0byB0aGUgc29sZSBzdGFnZSAoYDxvbmx5U3RhZ2U+OjxlbnY+YCksIHRoZSBMQVNUIHN0YWdlIG9mIGFcbiAqICAgIG11bHRpLXN0YWdlIHBpcGVsaW5lIChkZXBsb3lzIGFyZSBjb252ZW50aW9uYWxseSB0aGUgZmluYWwgc3RhZ2Ug4oCUIGVtaXR0ZWRcbiAqICAgIHdpdGggYSBzeW50aCB3YXJuaW5nIHJlY29tbWVuZGluZyBleHBsaWNpdCBwZXItc3RhZ2UgYGVudmlyb25tZW50YCksIG9yIGFcbiAqICAgIGxpdGVyYWwgYERlcGxveTo8ZW52PmAgd2hlbiB0aGVyZSBhcmUgbm8gc3RhZ2VzIHRvIG5hbWUuXG4gKlxuICogVGhlIGFzc2VtYmxlZCB2YWx1ZSBpcyBjYXBwZWQgYXQgQVdTJ3MgMjU2LWNoYXIgdGFnLXZhbHVlIGxpbWl0IChENik6IHRoZVxuICogaGVhZGxpbmUvcHJvZHVjdGlvbiBwYWlyIGlzIGtlcHQgZmlyc3QgYW5kIHRyYWlsaW5nIG92ZXJmbG93IHBhaXJzIGFyZSBkcm9wcGVkXG4gKiB3aXRoIGEgc3ludGggd2FybmluZyBuYW1pbmcgdGhlbS4gTmV2ZXIgcmV0dXJucyBhIHZhbHVlIGxvbmdlciB0aGFuIDI1NiBjaGFycy5cbiAqXG4gKiBSZXR1cm5zIHVuZGVmaW5lZCB3aGVuIG5vdGhpbmcgZGVjbGFyZXMgYW4gZW52aXJvbm1lbnQgKG5vIGRlcGxveSBzaWduYWwpLlxuICovXG5mdW5jdGlvbiBidWlsZERlcGxveXNUYWcocHJvcHM6IEJ1aWxkZXJQcm9wcyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHN0YWdlcyA9IHByb3BzLnN0YWdlcyA/PyBbXTtcbiAgY29uc3Qgc3RhZ2VzV2l0aEVudiA9IHN0YWdlcy5maWx0ZXIocyA9PiB0eXBlb2Ygcy5lbnZpcm9ubWVudCA9PT0gJ3N0cmluZycgJiYgcy5lbnZpcm9ubWVudC5sZW5ndGggPiAwKTtcblxuICBsZXQgcGFpcnM6IERlcGxveVBhaXJbXTtcbiAgaWYgKHN0YWdlc1dpdGhFbnYubGVuZ3RoID4gMCkge1xuICAgIHBhaXJzID0gc3RhZ2VzV2l0aEVudi5tYXAocyA9PiAoe1xuICAgICAgc3RyOiBgJHt0YWdTYWZlVG9rZW4ocy5zdGFnZU5hbWUpfToke3RhZ1NhZmVUb2tlbihzLmVudmlyb25tZW50IGFzIHN0cmluZyl9YCxcbiAgICAgIGVudjogcy5lbnZpcm9ubWVudCBhcyBzdHJpbmcsXG4gICAgfSkpO1xuICB9IGVsc2UgaWYgKHByb3BzLmVudmlyb25tZW50KSB7XG4gICAgbGV0IHN0YWdlTmFtZTogc3RyaW5nO1xuICAgIGlmIChzdGFnZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICBzdGFnZU5hbWUgPSBzdGFnZXNbMF0uc3RhZ2VOYW1lO1xuICAgIH0gZWxzZSBpZiAoc3RhZ2VzLmxlbmd0aCA+IDEpIHtcbiAgICAgIC8vIFBpcGVsaW5lLWxldmVsIGVudmlyb25tZW50IG9uIGEgbXVsdGktc3RhZ2UgcGlwZWxpbmU6IGF0dHJpYnV0ZSBpdCB0byB0aGVcbiAgICAgIC8vIExBU1Qgc3RhZ2UgKGRlcGxveXMgYXJlIGNvbnZlbnRpb25hbGx5IGZpbmFsKSByYXRoZXIgdGhhbiBhbiB1bm1hdGNoZWRcbiAgICAgIC8vIGxpdGVyYWwgYERlcGxveWAuIFdhcm4gc28gYXV0aG9ycyBtb3ZlIHRvIGV4cGxpY2l0IHBlci1zdGFnZSBgZW52aXJvbm1lbnRgLlxuICAgICAgc3RhZ2VOYW1lID0gc3RhZ2VzW3N0YWdlcy5sZW5ndGggLSAxXS5zdGFnZU5hbWU7XG4gICAgICBjcmVhdGVMb2dnZXIoJ3BpcGVsaW5lLWJ1aWxkZXInKS53YXJuKFxuICAgICAgICBgUGlwZWxpbmUtbGV2ZWwgZW52aXJvbm1lbnQgXCIke3Byb3BzLmVudmlyb25tZW50fVwiIGF0dHJpYnV0ZWQgdG8gdGhlIGxhc3Qgc3RhZ2UgYCArXG4gICAgICAgIGBcIiR7c3RhZ2VOYW1lfVwiIG9mIGEgJHtzdGFnZXMubGVuZ3RofS1zdGFnZSBwaXBlbGluZS4gRGVjbGFyZSBhIHBlci1zdGFnZSBgICtcbiAgICAgICAgJ2BlbnZpcm9ubWVudGAgb24gdGhlIGFjdHVhbCBkZXBsb3kgc3RhZ2UocykgZm9yIHByZWNpc2UgRE9SQSBhdHRyaWJ1dGlvbi4nLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhZ2VOYW1lID0gJ0RlcGxveSc7XG4gICAgfVxuICAgIHBhaXJzID0gW3sgc3RyOiBgJHt0YWdTYWZlVG9rZW4oc3RhZ2VOYW1lKX06JHt0YWdTYWZlVG9rZW4ocHJvcHMuZW52aXJvbm1lbnQpfWAsIGVudjogcHJvcHMuZW52aXJvbm1lbnQgfV07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHJldHVybiBjYXBEZXBsb3lzVmFsdWUocGFpcnMpO1xufVxuXG4vKipcbiAqIEpvaW4gYHBiLmRlcGxveXNgIHBhaXJzIHdpdGggYCtgLCBjYXBwZWQgYXQge0BsaW5rIE1BWF9UQUdfVkFMVUVfTEVOR1RIfS4gV2hlblxuICogdGhlIGZ1bGwgdmFsdWUgd291bGQgZXhjZWVkIHRoZSBjYXAsIHRoZSBoZWFkbGluZS9wcm9kdWN0aW9uIHBhaXIgaXMgcGxhY2VkXG4gKiBmaXJzdCBhbmQgb25seSB0aGUgbGVhZGluZyBwYWlycyB0aGF0IGZpdCBhcmUga2VwdDsgdGhlIHRyYWlsaW5nIG92ZXJmbG93IHBhaXJzXG4gKiBhcmUgZHJvcHBlZCBhbmQgbmFtZWQgaW4gYSBzeW50aCB3YXJuaW5nLiBOZXZlciBlbWl0cyBtb3JlIHRoYW4gMjU2IGNoYXJzLlxuICovXG5mdW5jdGlvbiBjYXBEZXBsb3lzVmFsdWUocGFpcnM6IERlcGxveVBhaXJbXSk6IHN0cmluZyB7XG4gIGNvbnN0IGZ1bGwgPSBwYWlycy5tYXAocCA9PiBwLnN0cikuam9pbignKycpO1xuICBpZiAoZnVsbC5sZW5ndGggPD0gTUFYX1RBR19WQUxVRV9MRU5HVEgpIHJldHVybiBmdWxsO1xuXG4gIC8vIFByaW9yaXRpemUgdGhlIGhlYWRsaW5lIHBhaXIg4oCUIHRoZSBwcm9kdWN0aW9uIGRlcGxveSBpZiBwcmVzZW50LCBlbHNlIHRoZVxuICAvLyBmaXJzdCBwYWlyIOKAlCBzbyBhIGNhcCBuZXZlciBkcm9wcyB0aGUgbW9zdCBvcGVyYXRpb25hbGx5LXNpZ25pZmljYW50IGRlcGxveS5cbiAgY29uc3QgaGVhZGxpbmVJZHggPSBwYWlycy5maW5kSW5kZXgocCA9PiBwLmVudi50b0xvd2VyQ2FzZSgpID09PSAncHJvZHVjdGlvbicpO1xuICBjb25zdCBvcmRlcmVkID0gaGVhZGxpbmVJZHggPiAwXG4gICAgPyBbcGFpcnNbaGVhZGxpbmVJZHhdLCAuLi5wYWlycy5maWx0ZXIoKF8sIGkpID0+IGkgIT09IGhlYWRsaW5lSWR4KV1cbiAgICA6IHBhaXJzO1xuXG4gIGNvbnN0IGtlcHQ6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IGRyb3BwZWQ6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgcCBvZiBvcmRlcmVkKSB7XG4gICAgY29uc3QgY2FuZGlkYXRlID0ga2VwdC5sZW5ndGggPT09IDAgPyBwLnN0ciA6IGAke2tlcHQuam9pbignKycpfSske3Auc3RyfWA7XG4gICAgaWYgKGNhbmRpZGF0ZS5sZW5ndGggPD0gTUFYX1RBR19WQUxVRV9MRU5HVEgpIHtcbiAgICAgIGtlcHQucHVzaChwLnN0cik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRyb3BwZWQucHVzaChwLnN0cik7XG4gICAgfVxuICB9XG5cbiAgY3JlYXRlTG9nZ2VyKCdwaXBlbGluZS1idWlsZGVyJykud2FybihcbiAgICBgcGIuZGVwbG95cyB0YWcgdmFsdWUgZXhjZWVkZWQgdGhlICR7TUFYX1RBR19WQUxVRV9MRU5HVEh9LWNoYXIgQVdTIHRhZy12YWx1ZSBsaW1pdDsgYCArXG4gICAgYGRyb3BwZWQgJHtkcm9wcGVkLmxlbmd0aH0gZGVwbG95IHBhaXIocyk6ICR7ZHJvcHBlZC5qb2luKCcsICcpfS4gYCArXG4gICAgJ1RoZXNlIGVudmlyb25tZW50cyB3aWxsIG5vdCBwcm9kdWNlIERPUkEgZGVwbG95IHNpZ25hbHMg4oCUIHJlZHVjZSBzdGFnZS9lbnZpcm9ubWVudCAnICtcbiAgICAnbmFtZSBsZW5ndGhzIG9yIHNwbGl0IGludG8gc2VwYXJhdGUgcGlwZWxpbmVzLicsXG4gICk7XG4gIHJldHVybiBrZXB0LmpvaW4oJysnKTtcbn1cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIHByb3BlcnRpZXMgZm9yIHRoZSBQaXBlbGluZUJ1aWxkZXIgY29uc3RydWN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVpbGRlclByb3BzIHtcbiAgLyoqIFByb2plY3QgaWRlbnRpZmllciAod2lsbCBiZSBzYW5pdGl6ZWQgdG8gbG93ZXJjYXNlIGFscGhhbnVtZXJpYyB3aXRoIHVuZGVyc2NvcmVzKSAqL1xuICByZWFkb25seSBwcm9qZWN0OiBzdHJpbmc7XG5cbiAgLyoqIE9yZ2FuaXphdGlvbiBpZGVudGlmaWVyICh3aWxsIGJlIHNhbml0aXplZCB0byBsb3dlcmNhc2UgYWxwaGFudW1lcmljIHdpdGggdW5kZXJzY29yZXMpICovXG4gIHJlYWRvbmx5IG9yZ2FuaXphdGlvbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBkZXBsb3kgZW52aXJvbm1lbnQgKGUuZy4gYHByb2R1Y3Rpb25gLCBgc3RhZ2luZ2ApIGZvciB0aGVcbiAgICogc2luZ2xlLWVudmlyb25tZW50IGNhc2UuIFdoZW4gc2V0IChhbmQgbm8gc3RhZ2UgZGVjbGFyZXMgaXRzIG93blxuICAgKiBgZW52aXJvbm1lbnRgKSwgcGlwZWxpbmUtY29yZSBkZXJpdmVzIHRoZSBgcGIuZGVwbG95c2AgdGFnIGZyb20gaXQsIG1hcmtpbmdcbiAgICogdGhlIHNvbGUgc3RhZ2Ug4oCUIG9yIHRoZSBMQVNUIHN0YWdlIG9mIGEgbXVsdGktc3RhZ2UgcGlwZWxpbmUgKHdpdGggYSBzeW50aFxuICAgKiB3YXJuaW5nKSwgb3IgYSBsaXRlcmFsIGBEZXBsb3lgIHN0YWdlIHdoZW4gdGhlcmUgYXJlIG5vIHN0YWdlcyB0byBuYW1lIOKAlCBhc1xuICAgKiB0aGUgZGVwbG95IGZvciBET1JBIG1ldHJpY3MuIEZvciBtdWx0aS1lbnZpcm9ubWVudCBwaXBlbGluZXMsIGRlY2xhcmVcbiAgICogYGVudmlyb25tZW50YCBwZXIgc3RhZ2UgaW5zdGVhZCAoc2VlIGBTdGFnZU9wdGlvbnMuZW52aXJvbm1lbnRgKS5cbiAgICovXG4gIHJlYWRvbmx5IGVudmlyb25tZW50Pzogc3RyaW5nO1xuXG4gIC8qKiBUZW5hbnQgaWRlbnRpZmllciBmb3IgcmVzb2x2aW5nIHBlci1vcmcgc2VjcmV0cyBmcm9tIEFXUyBTZWNyZXRzIE1hbmFnZXIgKi9cbiAgcmVhZG9ubHkgb3JnSWQ/OiBzdHJpbmc7XG5cbiAgLyoqIFBpcGVsaW5lIGRhdGFiYXNlIHJlY29yZCBJRCDigJQgaW5qZWN0ZWQgYXMgUElQRUxJTkVfSUQgZW52IHZhciBmb3IgYXV0b25vbW91cyBzeW50aCAqL1xuICByZWFkb25seSBwaXBlbGluZUlkPzogc3RyaW5nO1xuXG4gIC8qKiBPcHRpb25hbCBjdXN0b20gcGlwZWxpbmUgbmFtZS4gRGVmYXVsdHMgdG86IHtvcmdhbml6YXRpb259LXtwcm9qZWN0fS1waXBlbGluZSAqL1xuICByZWFkb25seSBwaXBlbGluZU5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqIEdsb2JhbCBtZXRhZGF0YSBpbmhlcml0ZWQgYnkgYWxsIHBpcGVsaW5lIHN0ZXBzICovXG4gIHJlYWRvbmx5IGdsb2JhbD86IE1ldGFEYXRhVHlwZTtcblxuICAvKipcbiAgICogUGlwZWxpbmUtbGV2ZWwgdGVtcGxhdGUgdmFyaWFibGVzLCBleHBvc2VkIHRvIGB7eyBwaXBlbGluZS52YXJzLiogfX1gIGluXG4gICAqIHBpcGVsaW5lIGNvbmZpZ3MgYW5kIHBsdWdpbiBzcGVjcyAoc2VlIGBQbHVnaW5TcGVjLnJlcXVpcmVkVmFyc2ApLiBEZWNsYXJlZFxuICAgKiBoZXJlIHNvIHRoZSBgcGlwZWxpbmUudmFyc2AgdGVtcGxhdGUgc2NvcGUgaXMgdHlwZS1jaGVja2VkIGVuZC10by1lbmQuXG4gICAqL1xuICByZWFkb25seSB2YXJzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgLyoqXG4gICAqIFBpcGVsaW5lLWxldmVsIENvZGVCdWlsZCBkZWZhdWx0cyBhcHBsaWVkIHRvIGFsbCBDb2RlQnVpbGQgYWN0aW9uc1xuICAgKiAoc3ludGgsIHNlbGYtbXV0YXRpb24sIGFzc2V0IHB1Ymxpc2hpbmcpIHZpYSBgY29kZUJ1aWxkRGVmYXVsdHNgLlxuICAgKi9cbiAgcmVhZG9ubHkgZGVmYXVsdHM/OiBDb2RlQnVpbGREZWZhdWx0cztcblxuICAvKipcbiAgICogT3B0aW9uYWwgSUFNIHJvbGUgZm9yIHRoZSBDb2RlUGlwZWxpbmUuXG4gICAqIFdoZW4gcHJvdmlkZWQsIHJlc29sdmVzIHRvIGEgQ0RLIElSb2xlIGFuZCBpcyBwYXNzZWQgdG8gdGhlIENvZGVQaXBlbGluZSBjb25zdHJ1Y3QuXG4gICAqIFdoZW4gb21pdHRlZCwgQ0RLIGF1dG8tY3JlYXRlcyBhIHJvbGUgd2l0aCB0aGUgY29ycmVjdCBjb2RlcGlwZWxpbmUuYW1hem9uYXdzLmNvbSBwcmluY2lwYWwuXG4gICAqL1xuICByZWFkb25seSByb2xlPzogUm9sZUNvbmZpZztcblxuICAvKiogU3ludGhlc2lzIGNvbmZpZ3VyYXRpb24gaW5jbHVkaW5nIHNvdXJjZSBhbmQgcGx1Z2luIGRldGFpbHMgKi9cbiAgcmVhZG9ubHkgc3ludGg6IFN5bnRoT3B0aW9ucztcblxuICAvKipcbiAgICogT3B0aW9uYWwgcGlwZWxpbmUgc3RhZ2VzLCBlYWNoIGNvbnRhaW5pbmcgb25lIG9yIG1vcmUgQ29kZUJ1aWxkIHN0ZXBzLlxuICAgKiBTdGFnZXMgYXJlIGFkZGVkIGFzIHdhdmVzIHRvIHRoZSBDb2RlUGlwZWxpbmUgYWZ0ZXIgdGhlIHN5bnRoIHN0ZXAuXG4gICAqL1xuICByZWFkb25seSBzdGFnZXM/OiBTdGFnZU9wdGlvbnNbXTtcblxuICAvKiogT3B0aW9uYWwgY3Jvbi9yYXRlIGV4cHJlc3Npb24gZm9yIHNjaGVkdWxlZCBwaXBlbGluZSBleGVjdXRpb24uICovXG4gIHJlYWRvbmx5IHNjaGVkdWxlPzogc3RyaW5nO1xuXG4gIC8qKiBDdXN0b20gdGFncyBhcHBsaWVkIHRvIGFsbCBwaXBlbGluZSByZXNvdXJjZXMuICovXG4gIHJlYWRvbmx5IHRhZ3M/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBQbHVnaW5zIHByZS1yZXNvbHZlZCBieSBgcGlwZWxpbmUtbWFuYWdlciBwaXBlbGluZSBzeW50aGAgZnJvbSB0aGUgcGxhdGZvcm0gQVBJLFxuICAgKiBrZXllZCBieSBgYWxpYXMgfHwgbmFtZWAuIFdoZW4gcHJlc2VudCwgYFBsdWdpbkxvb2t1cC5wbHVnaW4oKWAgcmV0dXJuc1xuICAgKiB0aGUgbWF0Y2hpbmcgZW50cnkgZGlyZWN0bHkgYW5kIHNraXBzIHRoZSBjdXN0b20gcmVzb3VyY2Ug4oCUIHNvIHRoZVxuICAgKiBzeW50aGVzaXplZCBDRk4gdGVtcGxhdGUgc2hpcHMgd2l0aCB0aGUgcmVhbCBDb2RlQnVpbGQgaW1hZ2UgYmFrZWQgaW4uXG4gICAqIFBvcHVsYXRlZCBieSB0aGUgQ0xJIGJlZm9yZSBpbnZva2luZyB0aGUgYm9pbGVycGxhdGUgYXBwOyBDREsgY29uc3VtZXJzXG4gICAqIHdobyBjb25zdHJ1Y3QgUGlwZWxpbmVCdWlsZGVyIGRpcmVjdGx5IG5vcm1hbGx5IGxlYXZlIHRoaXMgdW5zZXQuXG4gICAqL1xuICByZWFkb25seSByZXNvbHZlZFBsdWdpbnM/OiBSZWNvcmQ8c3RyaW5nLCBQbHVnaW4+O1xuXG4gIC8qKlxuICAgKiBQbGF0Zm9ybS1zb3VyY2VkIHJlZ2lzdHJ5IG92ZXJyaWRlcywgYXBwbGllZCBvdmVyIHRoZSBlbnYtbG9hZGVkIGByZWdpc3RyeWBcbiAgICogY29uZmlnIGF0IHN5bnRoIHN0YXJ0LiBwaXBlbGluZS1tYW5hZ2VyIHBvcHVsYXRlcyB0aGlzIGZyb20gdGhlIHBsYXRmb3JtIFVSTFxuICAgKiBpdCBkZXBsb3lzIGFnYWluc3Qgc28gdGhlIENvZGVCdWlsZCBpbWFnZSBVUklzIHVzZSBhIHB1bGwgaG9zdCBBV1MgQ29kZUJ1aWxkXG4gICAqIGNhbiByZXNvbHZlIChpbnN0ZWFkIG9mIHRoZSBpbi1jbHVzdGVyIGByZWdpc3RyeTo1MDAwYCBkZWZhdWx0KS4gQ0RLXG4gICAqIGNvbnN1bWVycyBjb25zdHJ1Y3RpbmcgUGlwZWxpbmVCdWlsZGVyIGRpcmVjdGx5IG5vcm1hbGx5IGxlYXZlIHRoaXMgdW5zZXQuXG4gICAqL1xuICByZWFkb25seSByZWdpc3RyeT86IFBhcnRpYWw8UmVnaXN0cnlDb25maWc+O1xufVxuXG4vKipcbiAqIENESyBjb25zdHJ1Y3QgdGhhdCBjcmVhdGVzIGFuZCBjb25maWd1cmVzIGEgQ29kZVBpcGVsaW5lIGZvciBjb250aW51b3VzIGRlcGxveW1lbnQuXG4gKlxuICogRmVhdHVyZXM6XG4gKiAtIE11bHRpLXNvdXJjZSBzdXBwb3J0IChTMywgR2l0SHViLCBDb2RlU3RhcilcbiAqIC0gUGx1Z2luLWJhc2VkIGJ1aWxkIHN0ZXBzXG4gKiAtIE1ldGFkYXRhLWRyaXZlbiBjb25maWd1cmF0aW9uXG4gKiAtIEF1dG9tYXRpYyB0YWdnaW5nXG4gKiAtIEF1dG9tYXRpYyBzYW5pdGl6YXRpb24gb2YgcHJvamVjdCBhbmQgb3JnYW5pemF0aW9uIG5hbWVzXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIG5ldyBQaXBlbGluZUJ1aWxkZXIodGhpcywgJ015UGlwZWxpbmUnLCB7XG4gKiAgIHByb2plY3Q6ICdteS1hcHAnLFxuICogICBvcmdhbml6YXRpb246ICdteS1vcmcnLFxuICogICBzeW50aDoge1xuICogICAgIHNvdXJjZToge1xuICogICAgICAgdHlwZTogJ2dpdGh1YicsXG4gKiAgICAgICBvcHRpb25zOiB7IHJlcG86ICdvd25lci9yZXBvJywgYnJhbmNoOiAnbWFpbicgfVxuICogICAgIH0sXG4gKiAgICAgcGx1Z2luOiB7IG5hbWU6ICdzeW50aCcgfVxuICogICB9XG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgUGlwZWxpbmVCdWlsZGVyIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgcHVibGljIHJlYWRvbmx5IHBpcGVsaW5lOiBDb2RlUGlwZWxpbmU7XG4gIHB1YmxpYyByZWFkb25seSBjb25maWc6IFBpcGVsaW5lQ29uZmlndXJhdGlvbjtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogQnVpbGRlclByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIC8vIEFwcGx5IHBsYXRmb3JtLXNvdXJjZWQgcmVnaXN0cnkgb3ZlcnJpZGVzIEJFRk9SRSBhbnkgQ29uZmlnLmdldCgncmVnaXN0cnknKVxuICAgIC8vIChwbHVnaW4vZGVmYXVsdCBidWlsZC1pbWFnZSByZXNvbHV0aW9uIGJlbG93KSBzbyB0aGUgc3ludGggdXNlcyB0aGUgcHVsbFxuICAgIC8vIGhvc3QgdGhlIHBsYXRmb3JtIGRlcGxveXMgYWdhaW5zdCwgbm90IHRoZSBpbi1jbHVzdGVyIGVudiBkZWZhdWx0LiBUaGUgQ0xJXG4gICAgLy8gb25seSBzZXRzIHByb3BzLnJlZ2lzdHJ5IHdoZW4gSU1BR0VfUkVHSVNUUllfUFVMTF9IT1NUIGlzIHVuc2V0LCBzbyBhblxuICAgIC8vIGV4cGxpY2l0IG9wZXJhdG9yIHB1bGwgaG9zdCBpcyBuZXZlciBjbG9iYmVyZWQgKHNlZSBiYWtlUGxhdGZvcm1SZWdpc3RyeSkuXG4gICAgLy9cbiAgICAvLyBTY29wZWQgKyByZXN0b3JlZCBzbyB0aGUgb3ZlcnJpZGUgZG9lcyBOT1QgbGVhayBpbnRvIHRoZSBwcm9jZXNzLXdpZGVcbiAgICAvLyBDb25maWcgY2FjaGU6IGluIGEgbXVsdGktcGlwZWxpbmUgQ0RLIGFwcCwgcGlwZWxpbmUgQidzIHJlZ2lzdHJ5IG11c3Qgbm90XG4gICAgLy8gYmxlZWQgaW50byBwaXBlbGluZSBBJ3MgaW1hZ2UgcmVzb2x1dGlvbi4gQWxsIHJlZ2lzdHJ5IHJlYWRzIGhhcHBlblxuICAgIC8vIHN5bmNocm9ub3VzbHkgYmVsb3cgKGJ1aWxkLWltYWdlIHJlc29sdXRpb24pLCBzbyByZXN0b3JpbmcgYXQgdGhlIGVuZCBvZlxuICAgIC8vIHRoZSBjb25zdHJ1Y3RvciBrZWVwcyBzaW5nbGUtcGlwZWxpbmUgYmVoYXZpb3IgaWRlbnRpY2FsLlxuICAgIGNvbnN0IHJlc3RvcmVSZWdpc3RyeSA9IHByb3BzLnJlZ2lzdHJ5XG4gICAgICA/IENvbmZpZy5vdmVycmlkZVNjb3BlZCgncmVnaXN0cnknLCBwcm9wcy5yZWdpc3RyeSlcbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIHRyeSB7XG4gICAgICAvLyBVc2UgUGlwZWxpbmVDb25maWd1cmF0aW9uIGZvciBhbGwgYnVzaW5lc3MgbG9naWMgKHZhbGlkYXRpb24sIHNhbml0aXphdGlvbiwgbWV0YWRhdGEgbWVyZ2luZylcbiAgICAgIHRoaXMuY29uZmlnID0gbmV3IFBpcGVsaW5lQ29uZmlndXJhdGlvbihwcm9wcyk7XG5cbiAgICAgIGNvbnN0IHNlcnZlckNvbmZpZyA9IENvbmZpZy5nZXQoJ3NlcnZlcicpO1xuICAgICAgY29uc3QgYXdzQ29uZmlnID0gQ29uZmlnLmdldCgnYXdzJyk7XG4gICAgICAvLyBQYXNzIG9yZytwcm9qZWN0IHNvIGxvZyBncm91cCAvIElBTSByb2xlIG5hbWVzIGdldCBhIHN0YWJsZSBoYXNoXG4gICAgICAvLyBzdWZmaXggcGVyIHBpcGVsaW5lLiBQcmV2ZW50cyBgUmVzb3VyY2UgYWxyZWFkeSBleGlzdHNgIGNvbGxpc2lvbnNcbiAgICAgIC8vIGFjcm9zcyBzdGFja3MgZGVwbG95ZWQgdG8gdGhlIHNhbWUgQVdTIGFjY291bnQuXG4gICAgICBjb25zdCB1bmlxdWVJZCA9IG5ldyBVbmlxdWVJZCh7XG4gICAgICAgIG9yZ2FuaXphdGlvbjogdGhpcy5jb25maWcub3JnYW5pemF0aW9uLFxuICAgICAgICBwcm9qZWN0OiB0aGlzLmNvbmZpZy5wcm9qZWN0LFxuICAgICAgfSk7XG4gICAgICBjb25zdCBwbHVnaW5Mb29rdXAgPSBuZXcgUGx1Z2luTG9va3VwKFxuICAgICAgICB0aGlzLFxuICAgICAgICB1bmlxdWVJZC5nZW5lcmF0ZSgncGx1Z2luOmxvb2t1cCcpLFxuICAgICAgICB7XG4gICAgICAgICAgb3JnYW5pemF0aW9uOiB0aGlzLmNvbmZpZy5vcmdhbml6YXRpb24sXG4gICAgICAgICAgcHJvamVjdDogdGhpcy5jb25maWcucHJvamVjdCxcbiAgICAgICAgICBwbGF0Zm9ybVVybDogc2VydmVyQ29uZmlnLnBsYXRmb3JtVXJsLFxuICAgICAgICAgIHVuaXF1ZUlkLFxuICAgICAgICAgIG9yZ0lkOiBwcm9wcy5vcmdJZCxcbiAgICAgICAgICBydW50aW1lOiBsYW1iZGFSdW50aW1lKGF3c0NvbmZpZy5sYW1iZGEucnVudGltZSksXG4gICAgICAgICAgdGltZW91dDogbGFtYmRhVGltZW91dChhd3NDb25maWcubGFtYmRhLnRpbWVvdXRTZWNvbmRzKSxcbiAgICAgICAgICBhcmNoaXRlY3R1cmU6IGxhbWJkYUFyY2hpdGVjdHVyZShhd3NDb25maWcubGFtYmRhLmFyY2hpdGVjdHVyZSksXG4gICAgICAgICAgcmVzZXJ2ZWRDb25jdXJyZW50RXhlY3V0aW9uczogYXdzQ29uZmlnLmxhbWJkYS5yZXNlcnZlZENvbmN1cnJlbnRFeGVjdXRpb25zLFxuICAgICAgICAgIHJlc29sdmVkUGx1Z2luczogcHJvcHMucmVzb2x2ZWRQbHVnaW5zLFxuICAgICAgICB9LFxuICAgICAgKTtcblxuICAgICAgLy8gQ3JlYXRlIHNvdXJjZSBhbmQgYnVpbGQgc3RlcFxuICAgICAgY29uc3Qgc291cmNlQnVpbGRlciA9IG5ldyBTb3VyY2VCdWlsZGVyKHRoaXMsIHRoaXMuY29uZmlnKTtcbiAgICAgIGNvbnN0IHNvdXJjZSA9IHNvdXJjZUJ1aWxkZXIuY3JlYXRlKHVuaXF1ZUlkKTtcblxuICAgICAgLy8gU3ludGgtcGx1Z2luIHJlc29sdXRpb246XG4gICAgICAvLyAgIDEuIFByZS1yZXNvbHZlZCBieSBgcGlwZWxpbmUtbWFuYWdlciBwaXBlbGluZSBzeW50aC9kZXBsb3lgIGZyb20gdGhlIHBsYXRmb3JtXG4gICAgICAvLyAgICAgIEFQSSDihpIgdXNlIGl0LiBTeW50aCBzdGVwIHJ1bnMgb24gdGhlIHJlYWwgYGNkay1zeW50aGAgaW1hZ2Ugd2l0aFxuICAgICAgLy8gICAgICByZWFsIGNvbW1hbmRzIGJha2VkIGludG8gdGhlIHRlbXBsYXRlLlxuICAgICAgLy8gICAyLiBPdGhlcndpc2Ug4oaSIGBib290c3RyYXAoKWA6IGNvbGQtc3RhcnQgYHBpcGVsaW5lLW1hbmFnZXIgcGlwZWxpbmUgc3ludGhgXG4gICAgICAvLyAgICAgIG9uIHRoZSBjb25maWd1cmVkIENPREVCVUlMRF9ERUZBVUxUX0lNQUdFIChkZWZhdWx0XG4gICAgICAvLyAgICAgIHBpcGVsaW5lLWJvb3RzdHJhcDoxLjApLiBVc2VkIHdoZW4gdGhlIHBsYXRmb3JtIGlzbid0IHJlYWNoYWJsZVxuICAgICAgLy8gICAgICBhdCBzeW50aCB0aW1lIChDTEkgbG9ncyBhIHdhcm5pbmcgcGVyIG1pc3NlZCBwbHVnaW4pLlxuICAgICAgLy9cbiAgICAgIC8vIHBsdWdpbkxvb2t1cC5wbHVnaW4oKSByZWFkcyBgcmVzb2x2ZWRQbHVnaW5zYCBpbnRlcm5hbGx5IGFuZCByZXR1cm5zXG4gICAgICAvLyB0aGUgY2FjaGVkIGVudHJ5IHdoZW4gcHJlc2VudCDigJQgc28gY2FsbGluZyBpdCBhbHdheXMgd2lucyBvdmVyXG4gICAgICAvLyBib290c3RyYXAoKSB3aGVuIHByZS1yZXNvbHV0aW9uIHN1Y2NlZWRlZC5cbiAgICAgIGNvbnN0IHN5bnRoQ2FjaGVLZXkgPVxuICAgICAgdGhpcy5jb25maWcucGx1Z2luLmFsaWFzIHx8IGAke3RoaXMuY29uZmlnLnBsdWdpbi5uYW1lfS1hbGlhc2A7XG4gICAgICBjb25zdCBwbHVnaW4gPSBwcm9wcy5yZXNvbHZlZFBsdWdpbnM/LltzeW50aENhY2hlS2V5XVxuICAgICAgICA/IHBsdWdpbkxvb2t1cC5wbHVnaW4odGhpcy5jb25maWcucGx1Z2luKVxuICAgICAgICA6IHBsdWdpbkxvb2t1cC5ib290c3RyYXAoKTtcbiAgICAgIGNvbnN0IGRlZmF1bHRDb21wdXRlVHlwZSA9IGdldENvbXB1dGVUeXBlKGF3c0NvbmZpZy5jb2RlQnVpbGQuY29tcHV0ZVR5cGUpO1xuICAgICAgY29uc3QgYXJ0aWZhY3RNYW5hZ2VyID0gbmV3IEFydGlmYWN0TWFuYWdlcigpO1xuXG4gICAgICAvLyBTY29wZSBleHBvc2VkIHRvIHBsdWdpbi1zcGVjIHRlbXBsYXRlcyBhcyBgcGlwZWxpbmUuKmAuIFNvdXJjZWQgZnJvbSB0aGVcbiAgICAgIC8vIGNvbmZpZyBzbyB0aGUgc3ludGggc3RlcCwgZXZlcnkgc3RhZ2Ugc3RlcCwgYW5kIHRoZSBzb3VyY2UgdG9rZW4gYWxsXG4gICAgICAvLyByZXNvbHZlIGFnYWluc3QgdGhlIHNhbWUgc25hcHNob3QgKHNlZSBQaXBlbGluZUNvbmZpZ3VyYXRpb24uZ2V0UGlwZWxpbmVTY29wZSkuXG4gICAgICBjb25zdCBwaXBlbGluZVNjb3BlID0gdGhpcy5jb25maWcuZ2V0UGlwZWxpbmVTY29wZSgpO1xuXG4gICAgICBjb25zdCBzeW50aCA9IGNyZWF0ZUNvZGVCdWlsZFN0ZXAoe1xuICAgICAgICAuLi50aGlzLmNvbmZpZy5zeW50aEN1c3RvbWl6YXRpb24sXG4gICAgICAgIGlkOiB1bmlxdWVJZC5nZW5lcmF0ZSgnY2RrOnN5bnRoJyksXG4gICAgICAgIHVuaXF1ZUlkLFxuICAgICAgICBwbHVnaW4sXG4gICAgICAgIGlucHV0OiBzb3VyY2UsXG4gICAgICAgIG1ldGFkYXRhOiB0aGlzLmNvbmZpZy5tZXRhZGF0YS5tZXJnZWQsXG4gICAgICAgIG5ldHdvcms6IHRoaXMuY29uZmlnLm5ldHdvcmssXG4gICAgICAgIHNjb3BlOiB0aGlzLFxuICAgICAgICBkZWZhdWx0Q29tcHV0ZVR5cGUsXG4gICAgICAgIGFydGlmYWN0TWFuYWdlcixcbiAgICAgICAgc3RhZ2VOYW1lOiAnbm8tc3RhZ2UnLFxuICAgICAgICBzdGFnZUFsaWFzOiAnbm8tc3RhZ2UtYWxpYXMnLFxuICAgICAgICAvLyBUaGUgY2Fub25pY2FsIGtleSBzZWdtZW50LiBgJHthbGlhcyA/PyBuYW1lfS1hbGlhc2Agc3VmZml4ZWQgYW5cbiAgICAgICAgLy8gRVhQTElDSVQgYWxpYXMgdG9vIChgbXktc3ludGhgIOKGkiBgbXktc3ludGgtYWxpYXNgKSwgc28gYSBzdGFnZSB0aGF0XG4gICAgICAgIC8vIHBpY2tlZCB0aGUgc3ludGggb3V0cHV0IGluIHRoZSBVSSBhc2tlZCBmb3IgYSBrZXkgbmV2ZXIgcmVnaXN0ZXJlZC5cbiAgICAgICAgcGx1Z2luQWxpYXM6IHBsdWdpbkFydGlmYWN0QWxpYXModGhpcy5jb25maWcucGx1Z2luKSxcbiAgICAgICAgb3JnSWQ6IHByb3BzLm9yZ0lkLFxuICAgICAgICBwaXBlbGluZVNjb3BlLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIFJlc29sdmUgcGlwZWxpbmUtbGV2ZWwgZGVmYXVsdHMgaW50byBjb2RlQnVpbGREZWZhdWx0c1xuICAgICAgLy8gQnVpbGQgdGhlIHBlci1vcmcgcGxhdGZvcm0gc2VjcmV0IG5hbWUgZm9yIENvZGVCdWlsZCBlbnYgdmFyc1xuICAgICAgY29uc3QgcGxhdGZvcm1TZWNyZXROYW1lID0gcHJvcHMub3JnSWRcbiAgICAgICAgPyBDb3JlQ29uc3RhbnRzLnNlY3JldFBhdGgocHJvcHMub3JnSWQsICdwbGF0Zm9ybScpXG4gICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICBjb25zdCBjb2RlQnVpbGREZWZhdWx0cyA9IHRoaXMucmVzb2x2ZURlZmF1bHRzKHRoaXMuY29uZmlnLmRlZmF1bHRzLCB1bmlxdWVJZCwgcHJvcHMucGlwZWxpbmVJZCwgcGxhdGZvcm1TZWNyZXROYW1lLCBzZXJ2ZXJDb25maWcucGxhdGZvcm1VcmwsIHByb3BzLm9yZ0lkKTtcblxuICAgICAgLy8gUmVzb2x2ZSBJQU0gcm9sZTogZXhwbGljaXQgcHJvcCB3aW5zLCBlbHNlIGBpYW06cm9sZWAgbWV0YWRhdGEsIGVsc2UgbGV0XG4gICAgICAvLyBDREsgYXV0by1jcmVhdGUgdGhlIHBpcGVsaW5lIHJvbGUgKGNvZGVwaXBlbGluZS5hbWF6b25hd3MuY29tIHByaW5jaXBhbCkuXG4gICAgICBjb25zdCByb2xlQ29uZmlnID0gcHJvcHMucm9sZSA/PyByb2xlQ29uZmlnRnJvbU1ldGFkYXRhKHRoaXMuY29uZmlnLm1ldGFkYXRhLm1lcmdlZCk7XG4gICAgICBpZiAocm9sZUNvbmZpZz8udHlwZSA9PT0gJ2NvZGVCdWlsZERlZmF1bHQnKSB7XG4gICAgICAgIGNyZWF0ZUxvZ2dlcigncGlwZWxpbmUtYnVpbGRlcicpLndhcm4oXG4gICAgICAgICAgJ2NvZGVCdWlsZERlZmF1bHQgcm9sZSB0eXBlIHVzZXMgY29kZWJ1aWxkLmFtYXpvbmF3cy5jb20gdHJ1c3QgcHJpbmNpcGFsIOKAlCAnICtcbiAgICAgICAgJ3RoaXMgaXMgbm90IHN1aXRhYmxlIGFzIHRoZSBwaXBlbGluZS1sZXZlbCByb2xlLiBDb25zaWRlciB1c2luZyByb2xlQXJuL3JvbGVOYW1lICcgK1xuICAgICAgICAnb3Igb21pdHRpbmcgdGhlIHJvbGUgdG8gbGV0IENESyBhdXRvLWNyZWF0ZSBvbmUgd2l0aCBjb2RlcGlwZWxpbmUuYW1hem9uYXdzLmNvbS4nLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY29uc3Qgcm9sZSA9IHJvbGVDb25maWdcbiAgICAgICAgPyByZXNvbHZlUm9sZSh0aGlzLCB1bmlxdWVJZCwgcm9sZUNvbmZpZylcbiAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAgIC8vIOKUgOKUgCBBcnRpZmFjdCBidWNrZXQgKEtNUyBlbmNyeXB0aW9uICsgcmV0ZW50aW9uKSDilIDilIBcbiAgICAgIC8vIFdoZW4gYGVuY3J5cHRpb24ua21zS2V5QXJuYCBhbmQvb3IgYG9wZXJhdGlvbnMuYXJ0aWZhY3RSZXRlbnRpb25EYXlzYCBhcmVcbiAgICAgIC8vIHNldCB3ZSBjcmVhdGUgYSBjdXN0b20gYXJ0aWZhY3QgYnVja2V0IGFuZCBwYXNzIGl0IHRvIENvZGVQaXBlbGluZTsgdGhhdFxuICAgICAgLy8gaXMgdGhlIG9ubHkgd2F5IHRvIGF0dGFjaCBhIGN1c3RvbWVyLW1hbmFnZWQga2V5ICh0aGUgTDMgY29uc3RydWN0IGV4cG9zZXNcbiAgICAgIC8vIGBhcnRpZmFjdEJ1Y2tldGAsIG5vdCBgZW5jcnlwdGlvbktleWApLiBBYnNlbnQgYm90aCBrZXlzLCBDREsgYXV0by1jcmVhdGVzXG4gICAgICAvLyB0aGUgYnVja2V0IGFuZCBiZWhhdmlvciBpcyB1bmNoYW5nZWQuXG4gICAgICBjb25zdCBhcnRpZmFjdEJ1Y2tldCA9IHRoaXMuYnVpbGRBcnRpZmFjdEJ1Y2tldCgpO1xuXG4gICAgICAvLyBDcmVhdGUgQ29kZVBpcGVsaW5lIGNvbnN0cnVjdFxuICAgICAgdGhpcy5waXBlbGluZSA9IG5ldyBDb2RlUGlwZWxpbmUodGhpcywgdW5pcXVlSWQuZ2VuZXJhdGUoJ3BpcGVsaW5lczpjb2RlcGlwZWxpbmUnKSwge1xuICAgICAgICAuLi4oY29kZUJ1aWxkRGVmYXVsdHMgJiYgeyBjb2RlQnVpbGREZWZhdWx0cyB9KSxcbiAgICAgICAgLi4uKHJvbGUgJiYgeyByb2xlIH0pLFxuICAgICAgICAuLi4oYXJ0aWZhY3RCdWNrZXQgJiYgeyBhcnRpZmFjdEJ1Y2tldCB9KSxcbiAgICAgICAgcGlwZWxpbmVUeXBlOiBQaXBlbGluZVR5cGUuVjIsXG4gICAgICAgIHBpcGVsaW5lTmFtZTogdGhpcy5jb25maWcucGlwZWxpbmVOYW1lLFxuICAgICAgICBzeW50aCxcbiAgICAgICAgLi4ubWV0YWRhdGFGb3JDb2RlUGlwZWxpbmUodGhpcy5jb25maWcubWV0YWRhdGEubWVyZ2VkKSxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAocHJvcHMuc3RhZ2VzKSB7XG4gICAgICAgIGNvbnN0IHN0YWdlQnVpbGRlciA9IG5ldyBTdGFnZUJ1aWxkZXIoe1xuICAgICAgICAgIHNjb3BlOiB0aGlzLFxuICAgICAgICAgIHBsdWdpbkxvb2t1cCxcbiAgICAgICAgICB1bmlxdWVJZCxcbiAgICAgICAgICBnbG9iYWxNZXRhZGF0YTogdGhpcy5jb25maWcubWV0YWRhdGEubWVyZ2VkLFxuICAgICAgICAgIGRlZmF1bHRDb21wdXRlVHlwZSxcbiAgICAgICAgICBhcnRpZmFjdE1hbmFnZXIsXG4gICAgICAgICAgb3JnSWQ6IHByb3BzLm9yZ0lkLFxuICAgICAgICAgIHBpcGVsaW5lU2NvcGUsXG4gICAgICAgIH0pO1xuICAgICAgICBzdGFnZUJ1aWxkZXIuYWRkU3RhZ2VzKHRoaXMucGlwZWxpbmUsIHByb3BzLnN0YWdlcyk7XG4gICAgICB9XG5cbiAgICAgIC8vIOKUgOKUgCBUYWdzIOKUgOKUgFxuICAgICAgLy8gVGhlIGZpcnN0IHRocmVlIGFyZSBvcGVyYXRpb25zLWVzc2VudGlhbCBhbmQgdXNlZCBieSBgcGlwZWxpbmUtbWFuYWdlclxuICAgICAgLy8gYXVkaXQgc3RhY2tzYCB0byBkaWZmIENGTiBzdGFja3MgYWdhaW5zdCB0aGUgcGlwZWxpbmVfcmVnaXN0cnkgdGFibGUuXG4gICAgICAvLyBgT3JnSWRgIGlzIHRoZSBjYW5vbmljYWwga2V5IGZvciBjb3N0IGF0dHJpYnV0aW9uIChBV1MgQ29zdCBFeHBsb3JlclxuICAgICAgLy8gZ3JvdXBzIGJ5IHRhZyBrZXkvdmFsdWUgd2hlbiBhY3RpdmF0ZWQgaW4gQmlsbGluZyBzZXR0aW5ncykuXG4gICAgICBUYWdzLm9mKHRoaXMucGlwZWxpbmUpLmFkZCgncGlwZWxpbmUtYnVpbGRlcicsICd0cnVlJyk7XG4gICAgICBUYWdzLm9mKHRoaXMucGlwZWxpbmUpLmFkZCgncHJvamVjdCcsIHRoaXMuY29uZmlnLnByb2plY3QpO1xuICAgICAgVGFncy5vZih0aGlzLnBpcGVsaW5lKS5hZGQoJ29yZ2FuaXphdGlvbicsIHRoaXMuY29uZmlnLm9yZ2FuaXphdGlvbik7XG4gICAgICBpZiAocHJvcHMub3JnSWQpIHtcbiAgICAgICAgVGFncy5vZih0aGlzLnBpcGVsaW5lKS5hZGQoJ09yZ0lkJywgcHJvcHMub3JnSWQpO1xuICAgICAgfVxuICAgICAgLy8gU3RhYmxlIGV2ZW50LXJlcG9ydGluZyBrZXkuIEFwcGxpZWQgYXQgc3ludGggKHRoZSBwaXBlbGluZUlkIGlzIGtub3duXG4gICAgICAvLyBoZXJlKSwgc28gaXQncyBwcmVzZW50IGZyb20gc3RhY2sgY3JlYXRpb24g4oCUIHRoZSBldmVudHMgTGFtYmRhIHJlYWRzIHRoaXNcbiAgICAgIC8vIHRhZyB0byBhdHRyaWJ1dGUgQ29kZVBpcGVsaW5lIHN0YXRlLWNoYW5nZSBldmVudHMgdG8gdGhlIHBpcGVsaW5lIHdpdGhvdXRcbiAgICAgIC8vIGV2ZXIgaGFuZGxpbmcgdGhlIEFSTi9hY2NvdW50LiBTZWUgcGFja2FnZXMvcGlwZWxpbmUtZXZlbnRzLlxuICAgICAgaWYgKHByb3BzLnBpcGVsaW5lSWQpIHtcbiAgICAgICAgVGFncy5vZih0aGlzLnBpcGVsaW5lKS5hZGQoJ3BiLnBpcGVsaW5lLWlkJywgcHJvcHMucGlwZWxpbmVJZCk7XG4gICAgICB9XG4gICAgICAvLyBEZXBsb3ktZW52aXJvbm1lbnQgYXR0cmlidXRpb24gZm9yIERPUkEgbWV0cmljcy4gYHBiLmRlcGxveXNgIGxpc3RzIGV2ZXJ5XG4gICAgICAvLyBkZXBsb3kgc3RhZ2UgYXMgYDxzdGFnZU5hbWU+OjxlbnZpcm9ubWVudD5gIHBhaXJzIGpvaW5lZCBieSBgK2AsIHJlYWQgYnlcbiAgICAgIC8vIHRoZSBldmVudHMgTGFtYmRhIGZyb20gdGhlIHNhbWUgTGlzdFRhZ3MgY2FsbCB0byBtYXJrIHdoaWNoIHN0YWdlcyBhcmVcbiAgICAgIC8vIGRlcGxveXMgYW5kIHRvIHdoaWNoIGVudmlyb25tZW50LiBBYnNlbnQgd2hlbiBubyBlbnZpcm9ubWVudCBpcyBkZWNsYXJlZFxuICAgICAgLy8g4oCUIHN1Y2ggcGlwZWxpbmVzIHByb2R1Y2Ugbm8gRE9SQSBkZXBsb3kgc2lnbmFsIHVudGlsIHRoZXkgcmUtc3ludGguXG4gICAgICBjb25zdCBkZXBsb3lzVGFnID0gYnVpbGREZXBsb3lzVGFnKHByb3BzKTtcbiAgICAgIGlmIChkZXBsb3lzVGFnKSB7XG4gICAgICAgIFRhZ3Mub2YodGhpcy5waXBlbGluZSkuYWRkKCdwYi5kZXBsb3lzJywgZGVwbG95c1RhZyk7XG4gICAgICB9XG4gICAgICBpZiAocHJvcHMudGFncykge1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhwcm9wcy50YWdzKSkge1xuICAgICAgICAgIFRhZ3Mub2YodGhpcy5waXBlbGluZSkuYWRkKGtleSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEJ1aWxkIHRoZSBpbnRlcm5hbCBwaXBlbGluZSBiZWZvcmUgYWNjZXNzaW5nIGl0cyBwcm9wZXJ0aWVzXG4gICAgICB0aGlzLnBpcGVsaW5lLmJ1aWxkUGlwZWxpbmUoKTtcbiAgICAgIGNvbnN0IGNka1BpcGVsaW5lID0gdGhpcy5waXBlbGluZS5waXBlbGluZTtcbiAgICAgIGNvbnN0IG1ldGEgPSB0aGlzLmNvbmZpZy5tZXRhZGF0YS5tZXJnZWQ7XG5cbiAgICAgIC8vIOKUgOKUgCBQaXBlbGluZS1sZXZlbCBWYXJpYWJsZXMgKENvZGVQaXBlbGluZSBWMikg4pSA4pSAXG4gICAgICBmb3IgKGNvbnN0IHYgb2YgcGFyc2VQaXBlbGluZVZhcmlhYmxlcyhtZXRhW01ldGFkYXRhS2V5cy5QSVBFTElORV9WQVJJQUJMRVNdKSkge1xuICAgICAgICBjZGtQaXBlbGluZS5hZGRWYXJpYWJsZShuZXcgVmFyaWFibGUoe1xuICAgICAgICAgIHZhcmlhYmxlTmFtZTogdi5uYW1lLFxuICAgICAgICAgIC4uLih2LmRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkICYmIHsgZGVmYXVsdFZhbHVlOiB2LmRlZmF1bHRWYWx1ZSB9KSxcbiAgICAgICAgICAuLi4odi5kZXNjcmlwdGlvbiAhPT0gdW5kZWZpbmVkICYmIHsgZGVzY3JpcHRpb246IHYuZGVzY3JpcHRpb24gfSksXG4gICAgICAgIH0pKTtcbiAgICAgIH1cblxuICAgICAgLy8g4pSA4pSAIFNOUyBOb3RpZmljYXRpb25zIOKUgOKUgFxuICAgICAgY29uc3Qgbm90aWZpY2F0aW9uVG9waWNBcm4gPSBtZXRhW01ldGFkYXRhS2V5cy5OT1RJRklDQVRJT05fVE9QSUNfQVJOXTtcbiAgICAgIGlmICh0eXBlb2Ygbm90aWZpY2F0aW9uVG9waWNBcm4gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGNvbnN0IHRvcGljID0gc25zLlRvcGljLmZyb21Ub3BpY0Fybih0aGlzLCAnTm90aWZpY2F0aW9uVG9waWMnLCBub3RpZmljYXRpb25Ub3BpY0Fybik7XG4gICAgICAgIGNvbnN0IG5vdGlmaWNhdGlvbkV2ZW50cyA9IHBhcnNlTm90aWZpY2F0aW9uRXZlbnRzKG1ldGFbTWV0YWRhdGFLZXlzLk5PVElGSUNBVElPTl9FVkVOVFNdKVxuICAgICAgICAgIC5tYXAoZSA9PiBQSVBFTElORV9FVkVOVF9NQVBbZS50b1VwcGVyQ2FzZSgpXSlcbiAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pO1xuICAgICAgICBpZiAobm90aWZpY2F0aW9uRXZlbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjZGtQaXBlbGluZS5ub3RpZnlPbignUGlwZWxpbmVOb3RpZmljYXRpb24nLCB0b3BpYywgeyBldmVudHM6IG5vdGlmaWNhdGlvbkV2ZW50cyB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyDilIDilIAgU2NoZWR1bGVkIEV4ZWN1dGlvbiDilIDilIBcbiAgICAgIGlmIChwcm9wcy5zeW50aC5zb3VyY2Uub3B0aW9ucz8udHJpZ2dlciA9PT0gVHJpZ2dlclR5cGUuU0NIRURVTEUgfHwgcHJvcHMuc2NoZWR1bGUpIHtcbiAgICAgICAgY29uc3QgZXhwciA9IHByb3BzLnNjaGVkdWxlIHx8IChwcm9wcy5zeW50aC5zb3VyY2Uub3B0aW9ucyBhcyB7IHNjaGVkdWxlPzogc3RyaW5nIH0pPy5zY2hlZHVsZSB8fCAncmF0ZSgxIGRheSknO1xuICAgICAgICBuZXcgZXZlbnRzLlJ1bGUodGhpcywgJ1NjaGVkdWxlUnVsZScsIHtcbiAgICAgICAgICBzY2hlZHVsZTogZXZlbnRzLlNjaGVkdWxlLmV4cHJlc3Npb24oZXhwciksXG4gICAgICAgICAgdGFyZ2V0czogW25ldyB0YXJnZXRzLkNvZGVQaXBlbGluZShjZGtQaXBlbGluZSldLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8g4pSA4pSAIEV4ZWN1dGlvbiBFdmVudCBUcmFja2luZyAoZm9yd2FyZCBwaXBlbGluZSBzdGF0ZSBjaGFuZ2VzIHRvIFNOUykg4pSA4pSAXG4gICAgICAvLyBgaXNUcnVlYCwgbm90IHRydXRoaW5lc3M6IGBcImZhbHNlXCJgIGlzIGEgdHJ1dGh5IHN0cmluZywgc28gdGhlIG1ldGFkYXRhXG4gICAgICAvLyBgXCJhd3M6Y2RrOm9wZXJhdGlvbnM6ZXhlY3V0aW9uZXZlbnRzXCI6IFwiZmFsc2VcImAgdXNlZCB0byBDUkVBVEUgdGhlIHJ1bGUuXG4gICAgICBpZiAoaXNUcnVlKG1ldGFbTWV0YWRhdGFLZXlzLkVOQUJMRV9FWEVDVVRJT05fRVZFTlRTXSkgJiYgdHlwZW9mIG5vdGlmaWNhdGlvblRvcGljQXJuID09PSAnc3RyaW5nJykge1xuICAgICAgICBuZXcgZXZlbnRzLlJ1bGUodGhpcywgJ0V4ZWN1dGlvbkV2ZW50UnVsZScsIHtcbiAgICAgICAgICBldmVudFBhdHRlcm46IHtcbiAgICAgICAgICAgIHNvdXJjZTogWydhd3MuY29kZXBpcGVsaW5lJ10sXG4gICAgICAgICAgICBkZXRhaWxUeXBlOiBbJ0NvZGVQaXBlbGluZSBQaXBlbGluZSBFeGVjdXRpb24gU3RhdGUgQ2hhbmdlJ10sXG4gICAgICAgICAgICByZXNvdXJjZXM6IFtjZGtQaXBlbGluZS5waXBlbGluZUFybl0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0YXJnZXRzOiBbbmV3IHRhcmdldHMuU25zVG9waWMoXG4gICAgICAgICAgICBzbnMuVG9waWMuZnJvbVRvcGljQXJuKHRoaXMsICdFeGVjdXRpb25FdmVudFRvcGljJywgbm90aWZpY2F0aW9uVG9waWNBcm4pLFxuICAgICAgICAgICldLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8g4pSA4pSAIFBpcGVsaW5lIE1ldHJpY3MgJiBBbGFybXMg4pSA4pSAXG4gICAgICAvLyBTYW1lIHRyYXA6IGBcImF3czpjZGs6b3BlcmF0aW9uczptZXRyaWNzXCI6IFwiZmFsc2VcImAgY3JlYXRlZCB0aGUgYWxhcm0uXG4gICAgICBjb25zdCBlbmFibGVNZXRyaWNzID0gaXNUcnVlKHRoaXMuY29uZmlnLm1ldGFkYXRhLm1lcmdlZFtNZXRhZGF0YUtleXMuRU5BQkxFX01FVFJJQ1NdKTtcbiAgICAgIGlmIChlbmFibGVNZXRyaWNzKSB7XG4gICAgICAgIG5ldyBjbG91ZHdhdGNoLkFsYXJtKHRoaXMsICdQaXBlbGluZUZhaWx1cmVBbGFybScsIHtcbiAgICAgICAgICBtZXRyaWM6IG5ldyBjbG91ZHdhdGNoLk1ldHJpYyh7XG4gICAgICAgICAgICBuYW1lc3BhY2U6ICdBV1MvQ29kZVBpcGVsaW5lJyxcbiAgICAgICAgICAgIG1ldHJpY05hbWU6ICdGYWlsZWRQaXBlbGluZUV4ZWN1dGlvbkNvdW50JyxcbiAgICAgICAgICAgIGRpbWVuc2lvbnNNYXA6IHsgUGlwZWxpbmVOYW1lOiB0aGlzLmNvbmZpZy5waXBlbGluZU5hbWUgfSxcbiAgICAgICAgICAgIHN0YXRpc3RpYzogJ1N1bScsXG4gICAgICAgICAgICBwZXJpb2Q6IER1cmF0aW9uLm1pbnV0ZXMoNSksXG4gICAgICAgICAgfSksXG4gICAgICAgICAgdGhyZXNob2xkOiAxLFxuICAgICAgICAgIGV2YWx1YXRpb25QZXJpb2RzOiAxLFxuICAgICAgICAgIGFsYXJtRGVzY3JpcHRpb246IGBQaXBlbGluZSAke3RoaXMuY29uZmlnLnBpcGVsaW5lTmFtZX0gZXhlY3V0aW9uIGZhaWxlZGAsXG4gICAgICAgICAgY29tcGFyaXNvbk9wZXJhdG9yOiBjbG91ZHdhdGNoLkNvbXBhcmlzb25PcGVyYXRvci5HUkVBVEVSX1RIQU5fT1JfRVFVQUxfVE9fVEhSRVNIT0xELFxuICAgICAgICAgIHRyZWF0TWlzc2luZ0RhdGE6IGNsb3Vkd2F0Y2guVHJlYXRNaXNzaW5nRGF0YS5OT1RfQlJFQUNISU5HLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgLy8gUmV2ZXJ0IHRoZSBwZXItYnVpbGRlciByZWdpc3RyeSBvdmVycmlkZSBzbyBpdCBuZXZlciBsZWFrcyBpbnRvIHRoZVxuICAgICAgLy8gcHJvY2Vzcy13aWRlIENvbmZpZyBjYWNoZSAoc2VlIHRoZSBvdmVycmlkZSBhdCB0aGUgdG9wIG9mIHRoZSBjb25zdHJ1Y3RvcikuXG4gICAgICByZXN0b3JlUmVnaXN0cnk/LigpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBhIGN1c3RvbSBhcnRpZmFjdCBidWNrZXQgd2hlbiBgZW5jcnlwdGlvbi5rbXNLZXlBcm5gIGFuZC9vclxuICAgKiBgb3BlcmF0aW9ucy5hcnRpZmFjdFJldGVudGlvbkRheXNgIGFyZSBzZXQuIFJldHVybnMgdW5kZWZpbmVkIG90aGVyd2lzZSBzb1xuICAgKiBDREsgYXV0by1jcmVhdGVzIHRoZSBkZWZhdWx0IGFydGlmYWN0IGJ1Y2tldCAodW5jaGFuZ2VkIGJlaGF2aW9yKS5cbiAgICovXG4gIHByaXZhdGUgYnVpbGRBcnRpZmFjdEJ1Y2tldCgpOiBzMy5JQnVja2V0IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBtZXRhID0gdGhpcy5jb25maWcubWV0YWRhdGEubWVyZ2VkO1xuICAgIGNvbnN0IGttc0tleUFybiA9IHR5cGVvZiBtZXRhW01ldGFkYXRhS2V5cy5LTVNfS0VZX0FSTl0gPT09ICdzdHJpbmcnXG4gICAgICA/IChtZXRhW01ldGFkYXRhS2V5cy5LTVNfS0VZX0FSTl0gYXMgc3RyaW5nKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgcmV0ZW50aW9uRGF5cyA9IGFzSW50KG1ldGFbTWV0YWRhdGFLZXlzLkFSVElGQUNUX1JFVEVOVElPTl9EQVlTXSk7XG5cbiAgICBpZiAoIWttc0tleUFybiAmJiByZXRlbnRpb25EYXlzID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBlbmNyeXB0aW9uS2V5ID0ga21zS2V5QXJuXG4gICAgICA/IGttcy5LZXkuZnJvbUtleUFybih0aGlzLCAnQXJ0aWZhY3RLZXknLCBrbXNLZXlBcm4pXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IGJ1Y2tldCA9IG5ldyBzMy5CdWNrZXQodGhpcywgJ0FydGlmYWN0QnVja2V0Jywge1xuICAgICAgZW5jcnlwdGlvbjogZW5jcnlwdGlvbktleSA/IHMzLkJ1Y2tldEVuY3J5cHRpb24uS01TIDogczMuQnVja2V0RW5jcnlwdGlvbi5TM19NQU5BR0VELFxuICAgICAgLi4uKGVuY3J5cHRpb25LZXkgJiYgeyBlbmNyeXB0aW9uS2V5IH0pLFxuICAgICAgLi4uKHJldGVudGlvbkRheXMgIT09IHVuZGVmaW5lZCAmJiB7XG4gICAgICAgIGxpZmVjeWNsZVJ1bGVzOiBbeyBleHBpcmF0aW9uOiBEdXJhdGlvbi5kYXlzKHJldGVudGlvbkRheXMpIH1dLFxuICAgICAgfSksXG4gICAgICBlbmZvcmNlU1NMOiB0cnVlLFxuICAgICAgYmxvY2tQdWJsaWNBY2Nlc3M6IHMzLkJsb2NrUHVibGljQWNjZXNzLkJMT0NLX0FMTCxcbiAgICAgIHJlbW92YWxQb2xpY3k6IFJlbW92YWxQb2xpY3kuREVTVFJPWSxcbiAgICAgIGF1dG9EZWxldGVPYmplY3RzOiB0cnVlLFxuICAgIH0pO1xuICAgIFRhZ3Mub2YoYnVja2V0KS5hZGQoJ3BpcGVsaW5lJywgdGhpcy5jb25maWcucGlwZWxpbmVOYW1lKTtcbiAgICByZXR1cm4gYnVja2V0O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIENvZGVCdWlsZERlZmF1bHRzIGludG8gdGhlIHNoYXBlIGV4cGVjdGVkIGJ5IENESydzIGNvZGVCdWlsZERlZmF1bHRzLlxuICAgKiBDb21iaW5lcyBuZXR3b3JrIGNvbmZpZywgc2VjdXJpdHkgZ3JvdXBzLCBhbmQgcGlwZWxpbmUtbGV2ZWwgZW52aXJvbm1lbnQgdmFyaWFibGVzXG4gICAqIChQSVBFTElORV9JRCwgRVhFQ1VUSU9OX0lELCBQTEFURk9STV9CQVNFX1VSTCkgYXZhaWxhYmxlIHRvIGFsbCBDb2RlQnVpbGQgYWN0aW9ucy5cbiAgICovXG4gIHByaXZhdGUgcmVzb2x2ZURlZmF1bHRzKFxuICAgIGRlZmF1bHRzOiBDb2RlQnVpbGREZWZhdWx0cyB8IHVuZGVmaW5lZCxcbiAgICBpZDogVW5pcXVlSWQsXG4gICAgcGlwZWxpbmVJZDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIHBsYXRmb3JtU2VjcmV0TmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIHBsYXRmb3JtVXJsOiBzdHJpbmcsXG4gICAgb3JnSWQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgKTogQ29kZUJ1aWxkT3B0aW9ucyB8IHVuZGVmaW5lZCB7XG4gICAgLy8gUGVyLXBpcGVsaW5lIG5ldHdvcmsgY29uZmlnIHdpbnM7IG90aGVyd2lzZSBmYWxsIGJhY2sgdG8gYW4gZW52LWRyaXZlblxuICAgIC8vIGdsb2JhbCBWUEMgKGludGVybmFsIC8gaW5zaWRlLUFXUy1vbmx5IG1vZGUpIHNvIGV2ZXJ5IHBpcGVsaW5lJ3NcbiAgICAvLyBDb2RlQnVpbGQgcnVucyBpbiB0aGUgVlBDIGFuZCBjYW4gcmVhY2ggdGhlIHByaXZhdGUgZ2F0ZXdheS4gVW5zZXQgaW5cbiAgICAvLyBwdWJsaWMgZGVwbG95cyDihpIgQ29kZUJ1aWxkIHN0YXlzIGluIHRoZSBBV1MtbWFuYWdlZCBuZXR3b3JrLlxuICAgIC8vIFByZWNlZGVuY2U6IGV4cGxpY2l0IHByb3AgPiBgZWMyOm5ldHdvcmtgIG1ldGFkYXRhID4gZW52LWRyaXZlbiBnbG9iYWwgVlBDLlxuICAgIGNvbnN0IG5ldHdvcmsgPSBkZWZhdWx0cz8ubmV0d29yayA/PyBuZXR3b3JrQ29uZmlnRnJvbU1ldGFkYXRhKHRoaXMuY29uZmlnLm1ldGFkYXRhLm1lcmdlZCkgPz8gbmV0d29ya0NvbmZpZ0Zyb21FbnYoKTtcbiAgICBjb25zdCBuZXR3b3JrUHJvcHMgPSBuZXR3b3JrXG4gICAgICA/IHJlc29sdmVOZXR3b3JrKHRoaXMsIGlkLCBuZXR3b3JrKVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAvLyBTYW1lIHByZWNlZGVuY2UgZm9yIHN0YW5kYWxvbmUgc2VjdXJpdHkgZ3JvdXBzIChwcm9wID4gYGVjMjpzZWN1cml0eWdyb3VwYCBtZXRhZGF0YSkuXG4gICAgY29uc3Qgc2VjdXJpdHlHcm91cENvbmZpZyA9IGRlZmF1bHRzPy5zZWN1cml0eUdyb3VwcyA/PyBzZWN1cml0eUdyb3VwQ29uZmlnRnJvbU1ldGFkYXRhKHRoaXMuY29uZmlnLm1ldGFkYXRhLm1lcmdlZCk7XG4gICAgY29uc3Qgc3RhbmRhbG9uZVNlY3VyaXR5R3JvdXBzID0gc2VjdXJpdHlHcm91cENvbmZpZ1xuICAgICAgPyByZXNvbHZlU2VjdXJpdHlHcm91cCh0aGlzLCBpZCwgc2VjdXJpdHlHcm91cENvbmZpZylcbiAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgLy8gUGlwZWxpbmUtbGV2ZWwgZW52IHZhcnMgYXZhaWxhYmxlIHRvIGFsbCBDb2RlQnVpbGQgYWN0aW9uc1xuICAgIC8vIE5vdGU6ICN7Y29kZXBpcGVsaW5lLip9IHJlc29sdmVkIHZhcmlhYmxlcyBtdXN0IGdvIHRocm91Z2ggQ29kZUJ1aWxkU3RlcC5lbnZcbiAgICAvLyAoYWN0aW9uLWxldmVsKSwgbm90IGJ1aWxkRW52aXJvbm1lbnQuZW52aXJvbm1lbnRWYXJpYWJsZXMgKHByb2plY3QtbGV2ZWwpLlxuICAgIGNvbnN0IHBpcGVsaW5lRW52VmFyczogUmVjb3JkPHN0cmluZywgeyB2YWx1ZTogc3RyaW5nIH0+ID0ge1xuICAgICAgUExBVEZPUk1fQkFTRV9VUkw6IHsgdmFsdWU6IHBsYXRmb3JtVXJsIH0sXG4gICAgICAuLi4ocGlwZWxpbmVJZCAmJiB7IFBJUEVMSU5FX0lEOiB7IHZhbHVlOiBwaXBlbGluZUlkIH0gfSksXG4gICAgICAuLi4ocGxhdGZvcm1TZWNyZXROYW1lICYmIHsgUExBVEZPUk1fU0VDUkVUX05BTUU6IHsgdmFsdWU6IHBsYXRmb3JtU2VjcmV0TmFtZSB9IH0pLFxuICAgICAgLy8gUHJvcGFnYXRlIFRMUyB2ZXJpZmljYXRpb24gc2V0dGluZyBzbyBhbGwgQ29kZUJ1aWxkIHN0ZXBzIGNhbiByZWFjaFxuICAgICAgLy8gdGhlIHBsYXRmb3JtIEFQSSB3aGVuIHVzaW5nIHNlbGYtc2lnbmVkIGNlcnRpZmljYXRlc1xuICAgICAgLi4uKHByb2Nlc3MuZW52Lk5PREVfVExTX1JFSkVDVF9VTkFVVEhPUklaRUQgPT09ICcwJyAmJiB7XG4gICAgICAgIE5PREVfVExTX1JFSkVDVF9VTkFVVEhPUklaRUQ6IHsgdmFsdWU6ICcwJyB9LFxuICAgICAgfSksXG4gICAgfTtcblxuICAgIGNvbnN0IHNlY3VyaXR5R3JvdXBzID0gW1xuICAgICAgLi4uKG5ldHdvcmtQcm9wcz8uc2VjdXJpdHlHcm91cHMgPz8gW10pLFxuICAgICAgLi4uKHN0YW5kYWxvbmVTZWN1cml0eUdyb3VwcyA/PyBbXSksXG4gICAgXTtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi4obmV0d29ya1Byb3BzICYmIHsgdnBjOiBuZXR3b3JrUHJvcHMudnBjLCBzdWJuZXRTZWxlY3Rpb246IG5ldHdvcmtQcm9wcy5zdWJuZXRTZWxlY3Rpb24gfSksXG4gICAgICAuLi4oc2VjdXJpdHlHcm91cHMubGVuZ3RoID4gMCAmJiB7IHNlY3VyaXR5R3JvdXBzIH0pLFxuICAgICAgLy8gYnVpbGRJbWFnZSBhdCB0aGlzIGxldmVsIHJlYWNoZXMgQ0RLIFBpcGVsaW5lcycgaW50ZXJuYWxseS13cmFwcGVkXG4gICAgICAvLyBTaGVsbFN0ZXAgQ29kZUJ1aWxkIGFjdGlvbiwgd2hpY2ggb3RoZXJ3aXNlIGhhcmRjb2Rlc1xuICAgICAgLy8gQ0RLJ3MgZGVmYXVsdCBjdXJhdGVkIHN0YW5kYXJkIGltYWdlLiBTZXR0aW5nIGl0IGhlcmUgY2xvc2VzIHRoZSBnYXBcbiAgICAgIC8vIGV4cG9zZWQgaW4gdGhlIHNhbWUgZW52IHZhciAoYENPREVCVUlMRF9ERUZBVUxUX0lNQUdFYCkgdGhhdCB0aGVcbiAgICAgIC8vIENvZGVCdWlsZFN0ZXAgcGF0aCBhbHJlYWR5IGhvbm9ycyB2aWEgcmVzb2x2ZVBsdWdpbkltYWdlKCknc1xuICAgICAgLy8gZmFsbGJhY2suIFBlci1zdGVwIGBidWlsZEltYWdlYCBvbiBhIENvZGVCdWlsZFN0ZXAgc3RpbGwgd2lucy5cbiAgICAgIGJ1aWxkRW52aXJvbm1lbnQ6IHtcbiAgICAgICAgYnVpbGRJbWFnZTogcmVzb2x2ZURlZmF1bHRCdWlsZEltYWdlKHRoaXMsIG9yZ0lkKSxcbiAgICAgICAgZW52aXJvbm1lbnRWYXJpYWJsZXM6IHBpcGVsaW5lRW52VmFycyxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxufVxuIl19
|
|
498
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGlwZWxpbmUtYnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9waXBlbGluZS9waXBlbGluZS1idWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRTFELE9BQU8sRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUM1RCxPQUFPLEtBQUssVUFBVSxNQUFNLDRCQUE0QixDQUFDO0FBQ3pELE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbEcsT0FBTyxLQUFLLE1BQU0sTUFBTSx3QkFBd0IsQ0FBQztBQUNqRCxPQUFPLEtBQUssT0FBTyxNQUFNLGdDQUFnQyxDQUFDO0FBQzFELE9BQU8sS0FBSyxHQUFHLE1BQU0scUJBQXFCLENBQUM7QUFDM0MsT0FBTyxLQUFLLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN6QyxPQUFPLEtBQUssR0FBRyxNQUFNLHFCQUFxQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxZQUFZLEVBQXlCLE1BQU0sdUJBQXVCLENBQUM7QUFDNUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUN2QyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNwRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxZQUFZLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUVuRSxPQUFPLEVBQUUsTUFBTSxFQUFFLGFB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LGVBQWUsRUFBRSxZQUFZLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDN0YsR0FBRyxDQUFDLGNBQWMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLEVBQUUsY0FBYyxFQUFFLENBQUM7WUFDcEQscUVBQXFFO1lBQ3JFLHdEQUF3RDtZQUN4RCx1RUFBdUU7WUFDdkUsbUVBQW1FO1lBQ25FLCtEQUErRDtZQUMvRCxpRUFBaUU7WUFDakUsZ0JBQWdCLEVBQUU7Z0JBQ2hCLFVBQVUsRUFBRSx3QkFBd0IsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDO2dCQUNqRCxvQkFBb0IsRUFBRSxlQUFlO2FBQ3RDO1NBQ0YsQ0FBQztJQUNKLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9hcGktY29yZSc7XG5pbXBvcnQgdHlwZSB7IFBsdWdpbiB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL3BpcGVsaW5lLWRhdGEnO1xuaW1wb3J0IHsgRHVyYXRpb24sIFJlbW92YWxQb2xpY3ksIFRhZ3MgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgKiBhcyBjbG91ZHdhdGNoIGZyb20gJ2F3cy1jZGstbGliL2F3cy1jbG91ZHdhdGNoJztcbmltcG9ydCB7IFBpcGVsaW5lTm90aWZpY2F0aW9uRXZlbnRzLCBQaXBlbGluZVR5cGUsIFZhcmlhYmxlIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWNvZGVwaXBlbGluZSc7XG5pbXBvcnQgKiBhcyBldmVudHMgZnJvbSAnYXdzLWNkay1saWIvYXdzLWV2ZW50cyc7XG5pbXBvcnQgKiBhcyB0YXJnZXRzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1ldmVudHMtdGFyZ2V0cyc7XG5pbXBvcnQgKiBhcyBrbXMgZnJvbSAnYXdzLWNkay1saWIvYXdzLWttcyc7XG5pbXBvcnQgKiBhcyBzMyBmcm9tICdhd3MtY2RrLWxpYi9hd3MtczMnO1xuaW1wb3J0ICogYXMgc25zIGZyb20gJ2F3cy1jZGstbGliL2F3cy1zbnMnO1xuaW1wb3J0IHsgQ29kZVBpcGVsaW5lLCB0eXBlIENvZGVCdWlsZE9wdGlvbnMgfSBmcm9tICdhd3MtY2RrLWxpYi9waXBlbGluZXMnO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBQaXBlbGluZUNvbmZpZ3VyYXRpb24gfSBmcm9tICcuL3BpcGVsaW5lLWNvbmZpZ3VyYXRpb24uanMnO1xuaW1wb3J0IHsgUGx1Z2luTG9va3VwIH0gZnJvbSAnLi9wbHVnaW4tbG9va3VwLmpzJztcbmltcG9ydCB7IFNvdXJjZUJ1aWxkZXIgfSBmcm9tICcuL3NvdXJjZS1idWlsZGVyLmpzJztcbmltcG9ydCB7IFN0YWdlQnVpbGRlciwgY29kZVBpcGVsaW5lU3RhZ2VOYW1lIH0gZnJvbSAnLi9zdGFnZS1idWlsZGVyLmpzJztcbmltcG9ydCB7IFN0ZXBNYW5pZmVzdFJlY29yZGVyIH0gZnJvbSAnLi9zdGVwLW1hbmlmZXN0LXJlY29yZGVyLmpzJztcbmltcG9ydCB0eXBlIHsgU3RhZ2VPcHRpb25zLCBTeW50aE9wdGlvbnMgfSBmcm9tICcuL3N0ZXAtdHlwZXMuanMnO1xuaW1wb3J0IHsgQ29uZmlnLCBDb3JlQ29uc3RhbnRzIH0gZnJvbSAnLi4vY29uZmlnL2FwcC1jb25maWcuanMnO1xuaW1wb3J0IHsgbGFtYmRhQXJjaGl0ZWN0dXJlLCBsYW1iZGFSdW50aW1lLCBsYW1iZGFUaW1lb3V0IH0gZnJvbSAnLi4vY29uZmlnL2F3cy1jb25maWctY2RrLmpzJztcbmltcG9ydCB0eXBlIHsgUmVnaXN0cnlDb25maWcgfSBmcm9tICcuLi9jb25maWcvY29uZmlnLXR5cGVzLmpzJztcbmltcG9ydCB7IEFydGlmYWN0TWFuYWdlciB9IGZyb20gJy4uL2NvcmUvYXJ0aWZhY3QtbWFuYWdlci5qcyc7XG5pbXBvcnQgeyBVbmlxdWVJZCB9IGZyb20gJy4uL2NvcmUvaWQtZ2VuZXJhdG9yLmpzJztcbmltcG9ydCB7XG4gIGFzSW50LFxuICBpc1RydWUsXG4gIG1ldGFkYXRhRm9yQ29kZVBpcGVsaW5lLFxuICBuZXR3b3JrQ29uZmlnRnJvbU1ldGFkYXRhLFxuICBwYXJzZVBpcGVsaW5lVmFyaWFibGVzLFxuICByb2xlQ29uZmlnRnJvbU1ldGFkYXRhLFxuICBzZWN1cml0eUdyb3VwQ29uZmlnRnJvbU1ldGFkYXRhLFxufSBmcm9tICcuLi9jb3JlL21ldGFkYXRhLWJ1aWxkZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBDb2RlQnVpbGREZWZhdWx0cyB9IGZyb20gJy4uL2NvcmUvbmV0d29yay10eXBlcy5qcyc7XG5pbXBvcnQgeyByZXNvbHZlTmV0d29yaywgbmV0d29ya0NvbmZpZ0Zyb21FbnYgfSBmcm9tICcuLi9jb3JlL25ldHdvcmsuanMnO1xuaW1wb3J0IHsgY3JlYXRlQ29kZUJ1aWxkU3RlcCwgZ2V0Q29tcHV0ZVR5cGUsIHJlc29sdmVEZWZhdWx0QnVpbGRJbWFnZSB9IGZyb20gJy4uL2NvcmUvcGlwZWxpbmUtaGVscGVycy5qcyc7XG5pbXBvcnQgeyBNZXRhZGF0YUtleXMsIFRyaWdnZXJUeXBlIH0gZnJvbSAnLi4vY29yZS9waXBlbGluZS10eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IE1ldGFEYXRhVHlwZSB9IGZyb20gJy4uL2NvcmUvcGlwZWxpbmUtdHlwZXMuanMnO1xuaW1wb3J0IHsgYXNzZXJ0UGx1Z2luQ29udHJhY3QsIGNvbnRyYWN0U2NvcGVGcm9tVGVtcGxhdGVTY29wZSwgcGx1Z2luQXJ0aWZhY3RBbGlhcyB9IGZyb20gJy4uL2NvcmUvcGx1Z2luLWNvbnRyYWN0LmpzJztcbmltcG9ydCB0eXBlIHsgUm9sZUNvbmZpZyB9IGZyb20gJy4uL2NvcmUvcm9sZS10eXBlcy5qcyc7XG5pbXBvcnQgeyByZXNvbHZlUm9sZSB9IGZyb20gJy4uL2NvcmUvcm9sZS5qcyc7XG5pbXBvcnQgeyByZXNvbHZlU2VjdXJpdHlHcm91cCB9IGZyb20gJy4uL2NvcmUvc2VjdXJpdHktZ3JvdXAuanMnO1xuaW1wb3J0IHR5cGUgeyBTdGVwTWFuaWZlc3RFbnRyeSB9IGZyb20gJy4uL2NvcmUvc3RlcC1tYW5pZmVzdC5qcyc7XG5cbmNvbnN0IFBJUEVMSU5FX0VWRU5UX01BUDogUmVjb3JkPHN0cmluZywgUGlwZWxpbmVOb3RpZmljYXRpb25FdmVudHM+ID0ge1xuICBGQUlMRUQ6IFBpcGVsaW5lTm90aWZpY2F0aW9uRXZlbnRzLlBJUEVMSU5FX0VYRUNVVElPTl9GQUlMRUQsXG4gIFNVQ0NFRURFRDogUGlwZWxpbmVOb3RpZmljYXRpb25FdmVudHMuUElQRUxJTkVfRVhFQ1VUSU9OX1NVQ0NFRURFRCxcbiAgU1RBUlRFRDogUGlwZWxpbmVOb3RpZmljYXRpb25FdmVudHMuUElQRUxJTkVfRVhFQ1VUSU9OX1NUQVJURUQsXG4gIENBTkNFTEVEOiBQaXBlbGluZU5vdGlmaWNhdGlvbkV2ZW50cy5QSVBFTElORV9FWEVDVVRJT05fQ0FOQ0VMRUQsXG4gIFNVUEVSU0VERUQ6IFBpcGVsaW5lTm90aWZpY2F0aW9uRXZlbnRzLlBJUEVMSU5FX0VYRUNVVElPTl9TVVBFUlNFREVELFxufTtcblxuZnVuY3Rpb24gcGFyc2VOb3RpZmljYXRpb25FdmVudHModmFsdWU6IHVua25vd24pOiBzdHJpbmdbXSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIHZhbHVlO1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykgcmV0dXJuIHZhbHVlLnNwbGl0KCcsJykubWFwKHMgPT4gcy50cmltKCkpO1xuICByZXR1cm4gWydGQUlMRUQnLCAnU1VDQ0VFREVEJ107XG59XG5cbi8qKlxuICogU2FuaXRpemUgYSBzaW5nbGUgYHBiLmRlcGxveXNgIHRva2VuIChzdGFnZSBuYW1lIG9yIGVudmlyb25tZW50KSB0b1xuICogQ29kZVBpcGVsaW5lLXRhZy1zYWZlIGNoYXJhY3RlcnMuIGA6YCBhbmQgYCtgIGFyZSB0aGUgcGFpci9saXN0IGRlbGltaXRlcnMsIHNvXG4gKiB0aGV5IChhbmQgYW55IG90aGVyIGRpc2FsbG93ZWQgY2hhcikgYXJlIHN0cmlwcGVkIHRvIGAtYCBpbnNpZGUgYSB0b2tlbiB0b1xuICoga2VlcCB0aGUgdmFsdWUgdW5hbWJpZ3VvdXNseSBwYXJzZWFibGUgYW5kIEpTT04tZnJlZS5cbiAqL1xuZnVuY3Rpb24gdGFnU2FmZVRva2VuKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdmFsdWUucmVwbGFjZSgvW15BLVphLXowLTkuXy9APS1dL2csICctJyk7XG59XG5cbi8qKiBBV1MgdGFnLXZhbHVlIGhhcmQgbGltaXQ7IGBwYi5kZXBsb3lzYCBtdXN0IG5ldmVyIGV4Y2VlZCB0aGlzLiAqL1xuY29uc3QgTUFYX1RBR19WQUxVRV9MRU5HVEggPSAyNTY7XG5cbi8qKiBBIHJlc29sdmVkIGRlcGxveSBhdHRyaWJ1dGlvbjogYSBzYW5pdGl6ZWQgYDxzdGFnZT46PGVudj5gIHRva2VuIHBsdXMgaXRzIGVudi4gKi9cbmludGVyZmFjZSBEZXBsb3lQYWlyIHtcbiAgcmVhZG9ubHkgc3RyOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGVudjogc3RyaW5nO1xufVxuXG4vKipcbiAqIEJ1aWxkIHRoZSBgcGIuZGVwbG95c2AgdGFnIHZhbHVlOiBgPHN0YWdlPjo8ZW52PmAgcGFpcnMgam9pbmVkIGJ5IGArYCwgd2hlcmVcbiAqIGA8c3RhZ2U+YCBpcyB0aGUgQ29kZVBpcGVsaW5lIHN0YWdlIG5hbWUgKHtAbGluayBjb2RlUGlwZWxpbmVTdGFnZU5hbWV9IOKAlCB0aGVcbiAqIHdhdmUgaWQgZXZlbnRzIHJlcG9ydCBhcyBgZGV0YWlsLnN0YWdlYCksIG5ldmVyIHRoZSBkaXNwbGF5IGBzdGFnZU5hbWVgLlxuICpcbiAqIEEgc3RhZ2UgaXMgYSBkZXBsb3kgaWZmIGl0IGRlY2xhcmVzIGFuIGBlbnZpcm9ubWVudGAuIFByZWNlZGVuY2U6XG4gKiAgLSBNdWx0aS1lbnY6IGFueSBzdGFnZSB3aXRoIGEgcGVyLXN0YWdlIGBlbnZpcm9ubWVudGAg4oCUIGxpc3QgZWFjaCBzdWNoIHN0YWdlLlxuICogIC0gU2luZ2xlLWVudjogbm8gcGVyLXN0YWdlIGVudmlyb25tZW50IGJ1dCBhIHBpcGVsaW5lLWxldmVsIGBlbnZpcm9ubWVudGAg4oCUXG4gKiAgICBhdHRyaWJ1dGUgaXQgdG8gdGhlIHNvbGUgc3RhZ2UgKGA8b25seVN0YWdlPjo8ZW52PmApLCB0aGUgTEFTVCBzdGFnZSBvZiBhXG4gKiAgICBtdWx0aS1zdGFnZSBwaXBlbGluZSAoZGVwbG95cyBhcmUgY29udmVudGlvbmFsbHkgdGhlIGZpbmFsIHN0YWdlIOKAlCBlbWl0dGVkXG4gKiAgICB3aXRoIGEgc3ludGggd2FybmluZyByZWNvbW1lbmRpbmcgZXhwbGljaXQgcGVyLXN0YWdlIGBlbnZpcm9ubWVudGApLCBvciBhXG4gKiAgICBsaXRlcmFsIGBEZXBsb3k6PGVudj5gIHdoZW4gdGhlcmUgYXJlIG5vIHN0YWdlcyB0byBuYW1lLlxuICpcbiAqIFRoZSBhc3NlbWJsZWQgdmFsdWUgaXMgY2FwcGVkIGF0IEFXUydzIDI1Ni1jaGFyIHRhZy12YWx1ZSBsaW1pdDogdGhlXG4gKiBoZWFkbGluZS9wcm9kdWN0aW9uIHBhaXIgaXMga2VwdCBmaXJzdCBhbmQgdHJhaWxpbmcgb3ZlcmZsb3cgcGFpcnMgYXJlIGRyb3BwZWRcbiAqIHdpdGggYSBzeW50aCB3YXJuaW5nIG5hbWluZyB0aGVtLiBOZXZlciByZXR1cm5zIGEgdmFsdWUgbG9uZ2VyIHRoYW4gMjU2IGNoYXJzLlxuICpcbiAqIFJldHVybnMgdW5kZWZpbmVkIHdoZW4gbm90aGluZyBkZWNsYXJlcyBhbiBlbnZpcm9ubWVudCAobm8gZGVwbG95IHNpZ25hbCkuXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkRGVwbG95c1RhZyhwcm9wczogQnVpbGRlclByb3BzKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgc3RhZ2VzID0gcHJvcHMuc3RhZ2VzID8/IFtdO1xuICBjb25zdCBzdGFnZXNXaXRoRW52ID0gc3RhZ2VzLmZpbHRlcihzID0+IHR5cGVvZiBzLmVudmlyb25tZW50ID09PSAnc3RyaW5nJyAmJiBzLmVudmlyb25tZW50Lmxlbmd0aCA+IDApO1xuXG4gIGxldCBwYWlyczogRGVwbG95UGFpcltdO1xuICBpZiAoc3RhZ2VzV2l0aEVudi5sZW5ndGggPiAwKSB7XG4gICAgcGFpcnMgPSBzdGFnZXNXaXRoRW52Lm1hcChzID0+ICh7XG4gICAgICBzdHI6IGAke3RhZ1NhZmVUb2tlbihjb2RlUGlwZWxpbmVTdGFnZU5hbWUocykpfToke3RhZ1NhZmVUb2tlbihzLmVudmlyb25tZW50IGFzIHN0cmluZyl9YCxcbiAgICAgIGVudjogcy5lbnZpcm9ubWVudCBhcyBzdHJpbmcsXG4gICAgfSkpO1xuICB9IGVsc2UgaWYgKHByb3BzLmVudmlyb25tZW50KSB7XG4gICAgbGV0IHN0YWdlTmFtZTogc3RyaW5nO1xuICAgIGlmIChzdGFnZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICBzdGFnZU5hbWUgPSBjb2RlUGlwZWxpbmVTdGFnZU5hbWUoc3RhZ2VzWzBdKTtcbiAgICB9IGVsc2UgaWYgKHN0YWdlcy5sZW5ndGggPiAxKSB7XG4gICAgICAvLyBQaXBlbGluZS1sZXZlbCBlbnZpcm9ubWVudCBvbiBhIG11bHRpLXN0YWdlIHBpcGVsaW5lOiBhdHRyaWJ1dGUgaXQgdG8gdGhlXG4gICAgICAvLyBMQVNUIHN0YWdlIChkZXBsb3lzIGFyZSBjb252ZW50aW9uYWxseSBmaW5hbCkgcmF0aGVyIHRoYW4gYW4gdW5tYXRjaGVkXG4gICAgICAvLyBsaXRlcmFsIGBEZXBsb3lgLiBXYXJuIHNvIGF1dGhvcnMgbW92ZSB0byBleHBsaWNpdCBwZXItc3RhZ2UgYGVudmlyb25tZW50YC5cbiAgICAgIHN0YWdlTmFtZSA9IGNvZGVQaXBlbGluZVN0YWdlTmFtZShzdGFnZXNbc3RhZ2VzLmxlbmd0aCAtIDFdKTtcbiAgICAgIGNyZWF0ZUxvZ2dlcigncGlwZWxpbmUtYnVpbGRlcicpLndhcm4oXG4gICAgICAgIGBQaXBlbGluZS1sZXZlbCBlbnZpcm9ubWVudCBcIiR7cHJvcHMuZW52aXJvbm1lbnR9XCIgYXR0cmlidXRlZCB0byB0aGUgbGFzdCBzdGFnZSBgICtcbiAgICAgICAgYFwiJHtzdGFnZU5hbWV9XCIgb2YgYSAke3N0YWdlcy5sZW5ndGh9LXN0YWdlIHBpcGVsaW5lLiBEZWNsYXJlIGEgcGVyLXN0YWdlIGAgK1xuICAgICAgICAnYGVudmlyb25tZW50YCBvbiB0aGUgYWN0dWFsIGRlcGxveSBzdGFnZShzKSBmb3IgcHJlY2lzZSBET1JBIGF0dHJpYnV0aW9uLicsXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGFnZU5hbWUgPSAnRGVwbG95JztcbiAgICB9XG4gICAgcGFpcnMgPSBbeyBzdHI6IGAke3RhZ1NhZmVUb2tlbihzdGFnZU5hbWUpfToke3RhZ1NhZmVUb2tlbihwcm9wcy5lbnZpcm9ubWVudCl9YCwgZW52OiBwcm9wcy5lbnZpcm9ubWVudCB9XTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcmV0dXJuIGNhcERlcGxveXNWYWx1ZShwYWlycyk7XG59XG5cbi8qKlxuICogSm9pbiBgcGIuZGVwbG95c2AgcGFpcnMgd2l0aCBgK2AsIGNhcHBlZCBhdCB7QGxpbmsgTUFYX1RBR19WQUxVRV9MRU5HVEh9LiBXaGVuXG4gKiB0aGUgZnVsbCB2YWx1ZSB3b3VsZCBleGNlZWQgdGhlIGNhcCwgdGhlIGhlYWRsaW5lL3Byb2R1Y3Rpb24gcGFpciBpcyBwbGFjZWRcbiAqIGZpcnN0IGFuZCBvbmx5IHRoZSBsZWFkaW5nIHBhaXJzIHRoYXQgZml0IGFyZSBrZXB0OyB0aGUgdHJhaWxpbmcgb3ZlcmZsb3cgcGFpcnNcbiAqIGFyZSBkcm9wcGVkIGFuZCBuYW1lZCBpbiBhIHN5bnRoIHdhcm5pbmcuIE5ldmVyIGVtaXRzIG1vcmUgdGhhbiAyNTYgY2hhcnMuXG4gKi9cbmZ1bmN0aW9uIGNhcERlcGxveXNWYWx1ZShwYWlyczogRGVwbG95UGFpcltdKTogc3RyaW5nIHtcbiAgY29uc3QgZnVsbCA9IHBhaXJzLm1hcChwID0+IHAuc3RyKS5qb2luKCcrJyk7XG4gIGlmIChmdWxsLmxlbmd0aCA8PSBNQVhfVEFHX1ZBTFVFX0xFTkdUSCkgcmV0dXJuIGZ1bGw7XG5cbiAgLy8gUHJpb3JpdGl6ZSB0aGUgaGVhZGxpbmUgcGFpciDigJQgdGhlIHByb2R1Y3Rpb24gZGVwbG95IGlmIHByZXNlbnQsIGVsc2UgdGhlXG4gIC8vIGZpcnN0IHBhaXIg4oCUIHNvIGEgY2FwIG5ldmVyIGRyb3BzIHRoZSBtb3N0IG9wZXJhdGlvbmFsbHktc2lnbmlmaWNhbnQgZGVwbG95LlxuICBjb25zdCBoZWFkbGluZUlkeCA9IHBhaXJzLmZpbmRJbmRleChwID0+IHAuZW52LnRvTG93ZXJDYXNlKCkgPT09ICdwcm9kdWN0aW9uJyk7XG4gIGNvbnN0IG9yZGVyZWQgPSBoZWFkbGluZUlkeCA+IDBcbiAgICA/IFtwYWlyc1toZWFkbGluZUlkeF0sIC4uLnBhaXJzLmZpbHRlcigoXywgaSkgPT4gaSAhPT0gaGVhZGxpbmVJZHgpXVxuICAgIDogcGFpcnM7XG5cbiAgY29uc3Qga2VwdDogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgZHJvcHBlZDogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBwIG9mIG9yZGVyZWQpIHtcbiAgICBjb25zdCBjYW5kaWRhdGUgPSBrZXB0Lmxlbmd0aCA9PT0gMCA/IHAuc3RyIDogYCR7a2VwdC5qb2luKCcrJyl9KyR7cC5zdHJ9YDtcbiAgICBpZiAoY2FuZGlkYXRlLmxlbmd0aCA8PSBNQVhfVEFHX1ZBTFVFX0xFTkdUSCkge1xuICAgICAga2VwdC5wdXNoKHAuc3RyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZHJvcHBlZC5wdXNoKHAuc3RyKTtcbiAgICB9XG4gIH1cblxuICBjcmVhdGVMb2dnZXIoJ3BpcGVsaW5lLWJ1aWxkZXInKS53YXJuKFxuICAgIGBwYi5kZXBsb3lzIHRhZyB2YWx1ZSBleGNlZWRlZCB0aGUgJHtNQVhfVEFHX1ZBTFVFX0xFTkdUSH0tY2hhciBBV1MgdGFnLXZhbHVlIGxpbWl0OyBgICtcbiAgICBgZHJvcHBlZCAke2Ryb3BwZWQubGVuZ3RofSBkZXBsb3kgcGFpcihzKTogJHtkcm9wcGVkLmpvaW4oJywgJyl9LiBgICtcbiAgICAnVGhlc2UgZW52aXJvbm1lbnRzIHdpbGwgbm90IHByb2R1Y2UgRE9SQSBkZXBsb3kgc2lnbmFscyDigJQgcmVkdWNlIHN0YWdlL2Vudmlyb25tZW50ICcgK1xuICAgICduYW1lIGxlbmd0aHMgb3Igc3BsaXQgaW50byBzZXBhcmF0ZSBwaXBlbGluZXMuJyxcbiAgKTtcbiAgcmV0dXJuIGtlcHQuam9pbignKycpO1xufVxuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gcHJvcGVydGllcyBmb3IgdGhlIFBpcGVsaW5lQnVpbGRlciBjb25zdHJ1Y3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWlsZGVyUHJvcHMge1xuICAvKiogUHJvamVjdCBpZGVudGlmaWVyICh3aWxsIGJlIHNhbml0aXplZCB0byBsb3dlcmNhc2UgYWxwaGFudW1lcmljIHdpdGggdW5kZXJzY29yZXMpICovXG4gIHJlYWRvbmx5IHByb2plY3Q6IHN0cmluZztcblxuICAvKiogT3JnYW5pemF0aW9uIGlkZW50aWZpZXIgKHdpbGwgYmUgc2FuaXRpemVkIHRvIGxvd2VyY2FzZSBhbHBoYW51bWVyaWMgd2l0aCB1bmRlcnNjb3JlcykgKi9cbiAgcmVhZG9ubHkgb3JnYW5pemF0aW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsIGRlcGxveSBlbnZpcm9ubWVudCAoZS5nLiBgcHJvZHVjdGlvbmAsIGBzdGFnaW5nYCkgZm9yIHRoZVxuICAgKiBzaW5nbGUtZW52aXJvbm1lbnQgY2FzZS4gV2hlbiBzZXQgKGFuZCBubyBzdGFnZSBkZWNsYXJlcyBpdHMgb3duXG4gICAqIGBlbnZpcm9ubWVudGApLCBwaXBlbGluZS1jb3JlIGRlcml2ZXMgdGhlIGBwYi5kZXBsb3lzYCB0YWcgZnJvbSBpdCwgbWFya2luZ1xuICAgKiB0aGUgc29sZSBzdGFnZSDigJQgb3IgdGhlIExBU1Qgc3RhZ2Ugb2YgYSBtdWx0aS1zdGFnZSBwaXBlbGluZSAod2l0aCBhIHN5bnRoXG4gICAqIHdhcm5pbmcpLCBvciBhIGxpdGVyYWwgYERlcGxveWAgc3RhZ2Ugd2hlbiB0aGVyZSBhcmUgbm8gc3RhZ2VzIHRvIG5hbWUg4oCUIGFzXG4gICAqIHRoZSBkZXBsb3kgZm9yIERPUkEgbWV0cmljcy4gRm9yIG11bHRpLWVudmlyb25tZW50IHBpcGVsaW5lcywgZGVjbGFyZVxuICAgKiBgZW52aXJvbm1lbnRgIHBlciBzdGFnZSBpbnN0ZWFkIChzZWUgYFN0YWdlT3B0aW9ucy5lbnZpcm9ubWVudGApLlxuICAgKi9cbiAgcmVhZG9ubHkgZW52aXJvbm1lbnQ/OiBzdHJpbmc7XG5cbiAgLyoqIFRlbmFudCBpZGVudGlmaWVyIGZvciByZXNvbHZpbmcgcGVyLW9yZyBzZWNyZXRzIGZyb20gQVdTIFNlY3JldHMgTWFuYWdlciAqL1xuICByZWFkb25seSBvcmdJZD86IHN0cmluZztcblxuICAvKiogUGlwZWxpbmUgZGF0YWJhc2UgcmVjb3JkIElEIOKAlCBpbmplY3RlZCBhcyBQSVBFTElORV9JRCBlbnYgdmFyIGZvciBhdXRvbm9tb3VzIHN5bnRoICovXG4gIHJlYWRvbmx5IHBpcGVsaW5lSWQ/OiBzdHJpbmc7XG5cbiAgLyoqIE9wdGlvbmFsIGN1c3RvbSBwaXBlbGluZSBuYW1lLiBEZWZhdWx0cyB0bzoge29yZ2FuaXphdGlvbn0te3Byb2plY3R9LXBpcGVsaW5lICovXG4gIHJlYWRvbmx5IHBpcGVsaW5lTmFtZT86IHN0cmluZztcblxuICAvKiogR2xvYmFsIG1ldGFkYXRhIGluaGVyaXRlZCBieSBhbGwgcGlwZWxpbmUgc3RlcHMgKi9cbiAgcmVhZG9ubHkgZ2xvYmFsPzogTWV0YURhdGFUeXBlO1xuXG4gIC8qKlxuICAgKiBQaXBlbGluZS1sZXZlbCB0ZW1wbGF0ZSB2YXJpYWJsZXMsIGV4cG9zZWQgdG8gYHt7IHBpcGVsaW5lLnZhcnMuKiB9fWAgaW5cbiAgICogcGlwZWxpbmUgY29uZmlncyBhbmQgcGx1Z2luIHNwZWNzIChzZWUgYFBsdWdpblNwZWMucmVxdWlyZWRWYXJzYCkuIERlY2xhcmVkXG4gICAqIGhlcmUgc28gdGhlIGBwaXBlbGluZS52YXJzYCB0ZW1wbGF0ZSBzY29wZSBpcyB0eXBlLWNoZWNrZWQgZW5kLXRvLWVuZC5cbiAgICovXG4gIHJlYWRvbmx5IHZhcnM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICAvKipcbiAgICogUGlwZWxpbmUtbGV2ZWwgQ29kZUJ1aWxkIGRlZmF1bHRzIGFwcGxpZWQgdG8gYWxsIENvZGVCdWlsZCBhY3Rpb25zXG4gICAqIChzeW50aCwgc2VsZi1tdXRhdGlvbiwgYXNzZXQgcHVibGlzaGluZykgdmlhIGBjb2RlQnVpbGREZWZhdWx0c2AuXG4gICAqL1xuICByZWFkb25seSBkZWZhdWx0cz86IENvZGVCdWlsZERlZmF1bHRzO1xuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBJQU0gcm9sZSBmb3IgdGhlIENvZGVQaXBlbGluZS5cbiAgICogV2hlbiBwcm92aWRlZCwgcmVzb2x2ZXMgdG8gYSBDREsgSVJvbGUgYW5kIGlzIHBhc3NlZCB0byB0aGUgQ29kZVBpcGVsaW5lIGNvbnN0cnVjdC5cbiAgICogV2hlbiBvbWl0dGVkLCBDREsgYXV0by1jcmVhdGVzIGEgcm9sZSB3aXRoIHRoZSBjb3JyZWN0IGNvZGVwaXBlbGluZS5hbWF6b25hd3MuY29tIHByaW5jaXBhbC5cbiAgICovXG4gIHJlYWRvbmx5IHJvbGU/OiBSb2xlQ29uZmlnO1xuXG4gIC8qKiBTeW50aGVzaXMgY29uZmlndXJhdGlvbiBpbmNsdWRpbmcgc291cmNlIGFuZCBwbHVnaW4gZGV0YWlscyAqL1xuICByZWFkb25seSBzeW50aDogU3ludGhPcHRpb25zO1xuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBwaXBlbGluZSBzdGFnZXMsIGVhY2ggY29udGFpbmluZyBvbmUgb3IgbW9yZSBDb2RlQnVpbGQgc3RlcHMuXG4gICAqIFN0YWdlcyBhcmUgYWRkZWQgYXMgd2F2ZXMgdG8gdGhlIENvZGVQaXBlbGluZSBhZnRlciB0aGUgc3ludGggc3RlcC5cbiAgICovXG4gIHJlYWRvbmx5IHN0YWdlcz86IFN0YWdlT3B0aW9uc1tdO1xuXG4gIC8qKiBPcHRpb25hbCBjcm9uL3JhdGUgZXhwcmVzc2lvbiBmb3Igc2NoZWR1bGVkIHBpcGVsaW5lIGV4ZWN1dGlvbi4gKi9cbiAgcmVhZG9ubHkgc2NoZWR1bGU/OiBzdHJpbmc7XG5cbiAgLyoqIEN1c3RvbSB0YWdzIGFwcGxpZWQgdG8gYWxsIHBpcGVsaW5lIHJlc291cmNlcy4gKi9cbiAgcmVhZG9ubHkgdGFncz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG5cbiAgLyoqXG4gICAqIFBsdWdpbnMgcHJlLXJlc29sdmVkIGJ5IGBwaXBlbGluZS1tYW5hZ2VyIHBpcGVsaW5lIHN5bnRoYCBmcm9tIHRoZSBwbGF0Zm9ybSBBUEksXG4gICAqIGtleWVkIGJ5IGBhbGlhcyB8fCBuYW1lYC4gV2hlbiBwcmVzZW50LCBgUGx1Z2luTG9va3VwLnBsdWdpbigpYCByZXR1cm5zXG4gICAqIHRoZSBtYXRjaGluZyBlbnRyeSBkaXJlY3RseSBhbmQgc2tpcHMgdGhlIGN1c3RvbSByZXNvdXJjZSDigJQgc28gdGhlXG4gICAqIHN5bnRoZXNpemVkIENGTiB0ZW1wbGF0ZSBzaGlwcyB3aXRoIHRoZSByZWFsIENvZGVCdWlsZCBpbWFnZSBiYWtlZCBpbi5cbiAgICogUG9wdWxhdGVkIGJ5IHRoZSBDTEkgYmVmb3JlIGludm9raW5nIHRoZSBib2lsZXJwbGF0ZSBhcHA7IENESyBjb25zdW1lcnNcbiAgICogd2hvIGNvbnN0cnVjdCBQaXBlbGluZUJ1aWxkZXIgZGlyZWN0bHkgbm9ybWFsbHkgbGVhdmUgdGhpcyB1bnNldC5cbiAgICovXG4gIHJlYWRvbmx5IHJlc29sdmVkUGx1Z2lucz86IFJlY29yZDxzdHJpbmcsIFBsdWdpbj47XG5cbiAgLyoqXG4gICAqIFBsYXRmb3JtLXNvdXJjZWQgcmVnaXN0cnkgb3ZlcnJpZGVzLCBhcHBsaWVkIG92ZXIgdGhlIGVudi1sb2FkZWQgYHJlZ2lzdHJ5YFxuICAgKiBjb25maWcgYXQgc3ludGggc3RhcnQuIHBpcGVsaW5lLW1hbmFnZXIgcG9wdWxhdGVzIHRoaXMgZnJvbSB0aGUgcGxhdGZvcm0gVVJMXG4gICAqIGl0IGRlcGxveXMgYWdhaW5zdCBzbyB0aGUgQ29kZUJ1aWxkIGltYWdlIFVSSXMgdXNlIGEgcHVsbCBob3N0IEFXUyBDb2RlQnVpbGRcbiAgICogY2FuIHJlc29sdmUgKGluc3RlYWQgb2YgdGhlIGluLWNsdXN0ZXIgYHJlZ2lzdHJ5OjUwMDBgIGRlZmF1bHQpLiBDREtcbiAgICogY29uc3VtZXJzIGNvbnN0cnVjdGluZyBQaXBlbGluZUJ1aWxkZXIgZGlyZWN0bHkgbm9ybWFsbHkgbGVhdmUgdGhpcyB1bnNldC5cbiAgICovXG4gIHJlYWRvbmx5IHJlZ2lzdHJ5PzogUGFydGlhbDxSZWdpc3RyeUNvbmZpZz47XG59XG5cbi8qKlxuICogQ0RLIGNvbnN0cnVjdCB0aGF0IGNyZWF0ZXMgYW5kIGNvbmZpZ3VyZXMgYSBDb2RlUGlwZWxpbmUgZm9yIGNvbnRpbnVvdXMgZGVwbG95bWVudC5cbiAqXG4gKiBGZWF0dXJlczpcbiAqIC0gTXVsdGktc291cmNlIHN1cHBvcnQgKFMzLCBHaXRIdWIsIENvZGVTdGFyKVxuICogLSBQbHVnaW4tYmFzZWQgYnVpbGQgc3RlcHNcbiAqIC0gTWV0YWRhdGEtZHJpdmVuIGNvbmZpZ3VyYXRpb25cbiAqIC0gQXV0b21hdGljIHRhZ2dpbmdcbiAqIC0gQXV0b21hdGljIHNhbml0aXphdGlvbiBvZiBwcm9qZWN0IGFuZCBvcmdhbml6YXRpb24gbmFtZXNcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogbmV3IFBpcGVsaW5lQnVpbGRlcih0aGlzLCAnTXlQaXBlbGluZScsIHtcbiAqICAgcHJvamVjdDogJ215LWFwcCcsXG4gKiAgIG9yZ2FuaXphdGlvbjogJ215LW9yZycsXG4gKiAgIHN5bnRoOiB7XG4gKiAgICAgc291cmNlOiB7XG4gKiAgICAgICB0eXBlOiAnZ2l0aHViJyxcbiAqICAgICAgIG9wdGlvbnM6IHsgcmVwbzogJ293bmVyL3JlcG8nLCBicmFuY2g6ICdtYWluJyB9XG4gKiAgICAgfSxcbiAqICAgICBwbHVnaW46IHsgbmFtZTogJ3N5bnRoJyB9XG4gKiAgIH1cbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBQaXBlbGluZUJ1aWxkZXIgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICBwdWJsaWMgcmVhZG9ubHkgcGlwZWxpbmU6IENvZGVQaXBlbGluZTtcbiAgcHVibGljIHJlYWRvbmx5IGNvbmZpZzogUGlwZWxpbmVDb25maWd1cmF0aW9uO1xuICAvKipcbiAgICogV2hpY2ggcGx1Z2luIGVhY2ggQ29kZVBpcGVsaW5lIGFjdGlvbiBydW5zLCByZWFkIG9mZiB0aGUgYnVpbHRcbiAgICogcGlwZWxpbmUuIFRoZSBDTEkgc2hpcHMgaXQgd2l0aCB0aGUgcmVnaXN0cnkgcmVnaXN0cmF0aW9uIHNvIGV2ZW50IGluZ2VzdFxuICAgKiBjYW4gYXR0cmlidXRlIGFjdGlvbiBvdXRjb21lcyB0byBhIHBsdWdpbiB2ZXJzaW9uLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHN0ZXBNYW5pZmVzdDogU3RlcE1hbmlmZXN0RW50cnlbXTtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogQnVpbGRlclByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIC8vIEFwcGx5IHBsYXRmb3JtLXNvdXJjZWQgcmVnaXN0cnkgb3ZlcnJpZGVzIEJFRk9SRSBhbnkgQ29uZmlnLmdldCgncmVnaXN0cnknKVxuICAgIC8vIChwbHVnaW4vZGVmYXVsdCBidWlsZC1pbWFnZSByZXNvbHV0aW9uIGJlbG93KSBzbyB0aGUgc3ludGggdXNlcyB0aGUgcHVsbFxuICAgIC8vIGhvc3QgdGhlIHBsYXRmb3JtIGRlcGxveXMgYWdhaW5zdCwgbm90IHRoZSBpbi1jbHVzdGVyIGVudiBkZWZhdWx0LiBUaGUgQ0xJXG4gICAgLy8gb25seSBzZXRzIHByb3BzLnJlZ2lzdHJ5IHdoZW4gSU1BR0VfUkVHSVNUUllfUFVMTF9IT1NUIGlzIHVuc2V0LCBzbyBhblxuICAgIC8vIGV4cGxpY2l0IG9wZXJhdG9yIHB1bGwgaG9zdCBpcyBuZXZlciBjbG9iYmVyZWQgKHNlZSBiYWtlUGxhdGZvcm1SZWdpc3RyeSkuXG4gICAgLy9cbiAgICAvLyBTY29wZWQgKyByZXN0b3JlZCBzbyB0aGUgb3ZlcnJpZGUgZG9lcyBOT1QgbGVhayBpbnRvIHRoZSBwcm9jZXNzLXdpZGVcbiAgICAvLyBDb25maWcgY2FjaGU6IGluIGEgbXVsdGktcGlwZWxpbmUgQ0RLIGFwcCwgcGlwZWxpbmUgQidzIHJlZ2lzdHJ5IG11c3Qgbm90XG4gICAgLy8gYmxlZWQgaW50byBwaXBlbGluZSBBJ3MgaW1hZ2UgcmVzb2x1dGlvbi4gQWxsIHJlZ2lzdHJ5IHJlYWRzIGhhcHBlblxuICAgIC8vIHN5bmNocm9ub3VzbHkgYmVsb3cgKGJ1aWxkLWltYWdlIHJlc29sdXRpb24pLCBzbyByZXN0b3JpbmcgYXQgdGhlIGVuZCBvZlxuICAgIC8vIHRoZSBjb25zdHJ1Y3RvciBrZWVwcyBzaW5nbGUtcGlwZWxpbmUgYmVoYXZpb3IgaWRlbnRpY2FsLlxuICAgIGNvbnN0IHJlc3RvcmVSZWdpc3RyeSA9IHByb3BzLnJlZ2lzdHJ5XG4gICAgICA/IENvbmZpZy5vdmVycmlkZVNjb3BlZCgncmVnaXN0cnknLCBwcm9wcy5yZWdpc3RyeSlcbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIHRyeSB7XG4gICAgICAvLyBVc2UgUGlwZWxpbmVDb25maWd1cmF0aW9uIGZvciBhbGwgYnVzaW5lc3MgbG9naWMgKHZhbGlkYXRpb24sIHNhbml0aXphdGlvbiwgbWV0YWRhdGEgbWVyZ2luZylcbiAgICAgIHRoaXMuY29uZmlnID0gbmV3IFBpcGVsaW5lQ29uZmlndXJhdGlvbihwcm9wcyk7XG5cbiAgICAgIGNvbnN0IHNlcnZlckNvbmZpZyA9IENvbmZpZy5nZXQoJ3NlcnZlcicpO1xuICAgICAgY29uc3QgYXdzQ29uZmlnID0gQ29uZmlnLmdldCgnYXdzJyk7XG4gICAgICAvLyBQYXNzIG9yZytwcm9qZWN0IHNvIGxvZyBncm91cCAvIElBTSByb2xlIG5hbWVzIGdldCBhIHN0YWJsZSBoYXNoXG4gICAgICAvLyBzdWZmaXggcGVyIHBpcGVsaW5lLiBQcmV2ZW50cyBgUmVzb3VyY2UgYWxyZWFkeSBleGlzdHNgIGNvbGxpc2lvbnNcbiAgICAgIC8vIGFjcm9zcyBzdGFja3MgZGVwbG95ZWQgdG8gdGhlIHNhbWUgQVdTIGFjY291bnQuXG4gICAgICBjb25zdCB1bmlxdWVJZCA9IG5ldyBVbmlxdWVJZCh7XG4gICAgICAgIG9yZ2FuaXphdGlvbjogdGhpcy5jb25maWcub3JnYW5pemF0aW9uLFxuICAgICAgICBwcm9qZWN0OiB0aGlzLmNvbmZpZy5wcm9qZWN0LFxuICAgICAgfSk7XG4gICAgICBjb25zdCBwbHVnaW5Mb29rdXAgPSBuZXcgUGx1Z2luTG9va3VwKFxuICAgICAgICB0aGlzLFxuICAgICAgICB1bmlxdWVJZC5nZW5lcmF0ZSgncGx1Z2luOmxvb2t1cCcpLFxuICAgICAgICB7XG4gICAgICAgICAgb3JnYW5pemF0aW9uOiB0aGlzLmNvbmZpZy5vcmdhbml6YXRpb24sXG4gICAgICAgICAgcHJvamVjdDogdGhpcy5jb25maWcucHJvamVjdCxcbiAgICAgICAgICBwbGF0Zm9ybVVybDogc2VydmVyQ29uZmlnLnBsYXRmb3JtVXJsLFxuICAgICAgICAgIHVuaXF1ZUlkLFxuICAgICAgICAgIG9yZ0lkOiBwcm9wcy5vcmdJZCxcbiAgICAgICAgICBydW50aW1lOiBsYW1iZGFSdW50aW1lKGF3c0NvbmZpZy5sYW1iZGEucnVudGltZSksXG4gICAgICAgICAgdGltZW91dDogbGFtYmRhVGltZW91dChhd3NDb25maWcubGFtYmRhLnRpbWVvdXRTZWNvbmRzKSxcbiAgICAgICAgICBhcmNoaXRlY3R1cmU6IGxhbWJkYUFyY2hpdGVjdHVyZShhd3NDb25maWcubGFtYmRhLmFyY2hpdGVjdHVyZSksXG4gICAgICAgICAgcmVzZXJ2ZWRDb25jdXJyZW50RXhlY3V0aW9uczogYXdzQ29uZmlnLmxhbWJkYS5yZXNlcnZlZENvbmN1cnJlbnRFeGVjdXRpb25zLFxuICAgICAgICAgIHJlc29sdmVkUGx1Z2luczogcHJvcHMucmVzb2x2ZWRQbHVnaW5zLFxuICAgICAgICB9LFxuICAgICAgKTtcblxuICAgICAgLy8gQ3JlYXRlIHNvdXJjZSBhbmQgYnVpbGQgc3RlcFxuICAgICAgY29uc3Qgc291cmNlQnVpbGRlciA9IG5ldyBTb3VyY2VCdWlsZGVyKHRoaXMsIHRoaXMuY29uZmlnKTtcbiAgICAgIGNvbnN0IHNvdXJjZSA9IHNvdXJjZUJ1aWxkZXIuY3JlYXRlKHVuaXF1ZUlkKTtcblxuICAgICAgLy8gU3ludGgtcGx1Z2luIHJlc29sdXRpb246XG4gICAgICAvLyAgIDEuIFByZS1yZXNvbHZlZCBieSBgcGlwZWxpbmUtbWFuYWdlciBwaXBlbGluZSBzeW50aC9kZXBsb3lgIGZyb20gdGhlIHBsYXRmb3JtXG4gICAgICAvLyAgICAgIEFQSSDihpIgdXNlIGl0LiBTeW50aCBzdGVwIHJ1bnMgb24gdGhlIHJlYWwgYGNkay1zeW50aGAgaW1hZ2Ugd2l0aFxuICAgICAgLy8gICAgICByZWFsIGNvbW1hbmRzIGJha2VkIGludG8gdGhlIHRlbXBsYXRlLlxuICAgICAgLy8gICAyLiBPdGhlcndpc2Ug4oaSIGBib290c3RyYXAoKWA6IGNvbGQtc3RhcnQgYHBpcGVsaW5lLW1hbmFnZXIgcGlwZWxpbmUgc3ludGhgXG4gICAgICAvLyAgICAgIG9uIHRoZSBjb25maWd1cmVkIENPREVCVUlMRF9ERUZBVUxUX0lNQUdFIChkZWZhdWx0XG4gICAgICAvLyAgICAgIHBpcGVsaW5lLWJvb3RzdHJhcDoxLjApLiBVc2VkIHdoZW4gdGhlIHBsYXRmb3JtIGlzbid0IHJlYWNoYWJsZVxuICAgICAgLy8gICAgICBhdCBzeW50aCB0aW1lIChDTEkgbG9ncyBhIHdhcm5pbmcgcGVyIG1pc3NlZCBwbHVnaW4pLlxuICAgICAgLy9cbiAgICAgIC8vIHBsdWdpbkxvb2t1cC5wbHVnaW4oKSByZWFkcyBgcmVzb2x2ZWRQbHVnaW5zYCBpbnRlcm5hbGx5IGFuZCByZXR1cm5zXG4gICAgICAvLyB0aGUgY2FjaGVkIGVudHJ5IHdoZW4gcHJlc2VudCDigJQgc28gY2FsbGluZyBpdCBhbHdheXMgd2lucyBvdmVyXG4gICAgICAvLyBib290c3RyYXAoKSB3aGVuIHByZS1yZXNvbHV0aW9uIHN1Y2NlZWRlZC5cbiAgICAgIGNvbnN0IHN5bnRoQ2FjaGVLZXkgPSBwbHVnaW5BcnRpZmFjdEFsaWFzKHRoaXMuY29uZmlnLnBsdWdpbik7XG4gICAgICBjb25zdCBwbHVnaW4gPSBwcm9wcy5yZXNvbHZlZFBsdWdpbnM/LltzeW50aENhY2hlS2V5XVxuICAgICAgICA/IHBsdWdpbkxvb2t1cC5wbHVnaW4odGhpcy5jb25maWcucGx1Z2luKVxuICAgICAgICA6IHBsdWdpbkxvb2t1cC5ib290c3RyYXAoKTtcbiAgICAgIGNvbnN0IGRlZmF1bHRDb21wdXRlVHlwZSA9IGdldENvbXB1dGVUeXBlKGF3c0NvbmZpZy5jb2RlQnVpbGQuY29tcHV0ZVR5cGUpO1xuICAgICAgY29uc3QgYXJ0aWZhY3RNYW5hZ2VyID0gbmV3IEFydGlmYWN0TWFuYWdlcigpO1xuXG4gICAgICAvLyBTY29wZSBleHBvc2VkIHRvIHBsdWdpbi1zcGVjIHRlbXBsYXRlcyBhcyBgcGlwZWxpbmUuKmAuIFNvdXJjZWQgZnJvbSB0aGVcbiAgICAgIC8vIGNvbmZpZyBzbyB0aGUgc3ludGggc3RlcCwgZXZlcnkgc3RhZ2Ugc3RlcCwgYW5kIHRoZSBzb3VyY2UgdG9rZW4gYWxsXG4gICAgICAvLyByZXNvbHZlIGFnYWluc3QgdGhlIHNhbWUgc25hcHNob3QgKHNlZSBQaXBlbGluZUNvbmZpZ3VyYXRpb24uZ2V0UGlwZWxpbmVTY29wZSkuXG4gICAgICBjb25zdCBwaXBlbGluZVNjb3BlID0gdGhpcy5jb25maWcuZ2V0UGlwZWxpbmVTY29wZSgpO1xuICAgICAgLy8gQ29udHJhY3Qg4oCUIHNlZSBTdGFnZUJ1aWxkZXIucmVzb2x2ZVN0ZXAuXG4gICAgICBhc3NlcnRQbHVnaW5Db250cmFjdChwbHVnaW4sIGNvbnRyYWN0U2NvcGVGcm9tVGVtcGxhdGVTY29wZShwaXBlbGluZVNjb3BlKSwgJ3N5bnRoJyk7XG5cbiAgICAgIGNvbnN0IHN0ZXBNYW5pZmVzdCA9IG5ldyBTdGVwTWFuaWZlc3RSZWNvcmRlcigpO1xuICAgICAgY29uc3Qgc3ludGggPSBjcmVhdGVDb2RlQnVpbGRTdGVwKHtcbiAgICAgICAgLi4udGhpcy5jb25maWcuc3ludGhDdXN0b21pemF0aW9uLFxuICAgICAgICBpZDogdW5pcXVlSWQuZ2VuZXJhdGUoJ2NkazpzeW50aCcpLFxuICAgICAgICB1bmlxdWVJZCxcbiAgICAgICAgcGx1Z2luLFxuICAgICAgICBpbnB1dDogc291cmNlLFxuICAgICAgICBtZXRhZGF0YTogdGhpcy5jb25maWcubWV0YWRhdGEubWVyZ2VkLFxuICAgICAgICBuZXR3b3JrOiB0aGlzLmNvbmZpZy5uZXR3b3JrLFxuICAgICAgICBzY29wZTogdGhpcyxcbiAgICAgICAgZGVmYXVsdENvbXB1dGVUeXBlLFxuICAgICAgICBhcnRpZmFjdE1hbmFnZXIsXG4gICAgICAgIHN0YWdlTmFtZTogJ25vLXN0YWdlJyxcbiAgICAgICAgc3RhZ2VBbGlhczogJ25vLXN0YWdlLWFsaWFzJyxcbiAgICAgICAgLy8gVGhlIGNhbm9uaWNhbCBrZXkgc2VnbWVudC4gYCR7YWxpYXMgPz8gbmFtZX0tYWxpYXNgIHN1ZmZpeGVkIGFuXG4gICAgICAgIC8vIEVYUExJQ0lUIGFsaWFzIHRvbyAoYG15LXN5bnRoYCDihpIgYG15LXN5bnRoLWFsaWFzYCksIHNvIGEgc3RhZ2UgdGhhdFxuICAgICAgICAvLyBwaWNrZWQgdGhlIHN5bnRoIG91dHB1dCBpbiB0aGUgVUkgYXNrZWQgZm9yIGEga2V5IG5ldmVyIHJlZ2lzdGVyZWQuXG4gICAgICAgIHBsdWdpbkFsaWFzOiBwbHVnaW5BcnRpZmFjdEFsaWFzKHRoaXMuY29uZmlnLnBsdWdpbiksXG4gICAgICAgIG9yZ0lkOiBwcm9wcy5vcmdJZCxcbiAgICAgICAgcGlwZWxpbmVTY29wZSxcbiAgICAgIH0pO1xuICAgICAgc3RlcE1hbmlmZXN0LnJlY29yZChzeW50aCwgcGx1Z2luKTtcblxuICAgICAgLy8gUmVzb2x2ZSBwaXBlbGluZS1sZXZlbCBkZWZhdWx0cyBpbnRvIGNvZGVCdWlsZERlZmF1bHRzXG4gICAgICAvLyBCdWlsZCB0aGUgcGVyLW9yZyBwbGF0Zm9ybSBzZWNyZXQgbmFtZSBmb3IgQ29kZUJ1aWxkIGVudiB2YXJzXG4gICAgICBjb25zdCBwbGF0Zm9ybVNlY3JldE5hbWUgPSBwcm9wcy5vcmdJZFxuICAgICAgICA/IENvcmVDb25zdGFudHMuc2VjcmV0UGF0aChwcm9wcy5vcmdJZCwgJ3BsYXRmb3JtJylcbiAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAgIGNvbnN0IGNvZGVCdWlsZERlZmF1bHRzID0gdGhpcy5yZXNvbHZlRGVmYXVsdHModGhpcy5jb25maWcuZGVmYXVsdHMsIHVuaXF1ZUlkLCBwcm9wcy5waXBlbGluZUlkLCBwbGF0Zm9ybVNlY3JldE5hbWUsIHNlcnZlckNvbmZpZy5wbGF0Zm9ybVVybCwgcHJvcHMub3JnSWQpO1xuXG4gICAgICAvLyBSZXNvbHZlIElBTSByb2xlOiBleHBsaWNpdCBwcm9wIHdpbnMsIGVsc2UgYGlhbTpyb2xlYCBtZXRhZGF0YSwgZWxzZSBsZXRcbiAgICAgIC8vIENESyBhdXRvLWNyZWF0ZSB0aGUgcGlwZWxpbmUgcm9sZSAoY29kZXBpcGVsaW5lLmFtYXpvbmF3cy5jb20gcHJpbmNpcGFsKS5cbiAgICAgIGNvbnN0IHJvbGVDb25maWcgPSBwcm9wcy5yb2xlID8/IHJvbGVDb25maWdGcm9tTWV0YWRhdGEodGhpcy5jb25maWcubWV0YWRhdGEubWVyZ2VkKTtcbiAgICAgIGlmIChyb2xlQ29uZmlnPy50eXBlID09PSAnY29kZUJ1aWxkRGVmYXVsdCcpIHtcbiAgICAgICAgY3JlYXRlTG9nZ2VyKCdwaXBlbGluZS1idWlsZGVyJykud2FybihcbiAgICAgICAgICAnY29kZUJ1aWxkRGVmYXVsdCByb2xlIHR5cGUgdXNlcyBjb2RlYnVpbGQuYW1hem9uYXdzLmNvbSB0cnVzdCBwcmluY2lwYWwg4oCUICcgK1xuICAgICAgICAndGhpcyBpcyBub3Qgc3VpdGFibGUgYXMgdGhlIHBpcGVsaW5lLWxldmVsIHJvbGUuIENvbnNpZGVyIHVzaW5nIHJvbGVBcm4vcm9sZU5hbWUgJyArXG4gICAgICAgICdvciBvbWl0dGluZyB0aGUgcm9sZSB0byBsZXQgQ0RLIGF1dG8tY3JlYXRlIG9uZSB3aXRoIGNvZGVwaXBlbGluZS5hbWF6b25hd3MuY29tLicsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjb25zdCByb2xlID0gcm9sZUNvbmZpZ1xuICAgICAgICA/IHJlc29sdmVSb2xlKHRoaXMsIHVuaXF1ZUlkLCByb2xlQ29uZmlnKVxuICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgICAgLy8g4pSA4pSAIEFydGlmYWN0IGJ1Y2tldCAoS01TIGVuY3J5cHRpb24gKyByZXRlbnRpb24pIOKUgOKUgFxuICAgICAgLy8gV2hlbiBgZW5jcnlwdGlvbi5rbXNLZXlBcm5gIGFuZC9vciBgb3BlcmF0aW9ucy5hcnRpZmFjdFJldGVudGlvbkRheXNgIGFyZVxuICAgICAgLy8gc2V0IHdlIGNyZWF0ZSBhIGN1c3RvbSBhcnRpZmFjdCBidWNrZXQgYW5kIHBhc3MgaXQgdG8gQ29kZVBpcGVsaW5lOyB0aGF0XG4gICAgICAvLyBpcyB0aGUgb25seSB3YXkgdG8gYXR0YWNoIGEgY3VzdG9tZXItbWFuYWdlZCBrZXkgKHRoZSBMMyBjb25zdHJ1Y3QgZXhwb3Nlc1xuICAgICAgLy8gYGFydGlmYWN0QnVja2V0YCwgbm90IGBlbmNyeXB0aW9uS2V5YCkuIEFic2VudCBib3RoIGtleXMsIENESyBhdXRvLWNyZWF0ZXNcbiAgICAgIC8vIHRoZSBidWNrZXQgYW5kIGJlaGF2aW9yIGlzIHVuY2hhbmdlZC5cbiAgICAgIGNvbnN0IGFydGlmYWN0QnVja2V0ID0gdGhpcy5idWlsZEFydGlmYWN0QnVja2V0KCk7XG5cbiAgICAgIC8vIENyZWF0ZSBDb2RlUGlwZWxpbmUgY29uc3RydWN0XG4gICAgICB0aGlzLnBpcGVsaW5lID0gbmV3IENvZGVQaXBlbGluZSh0aGlzLCB1bmlxdWVJZC5nZW5lcmF0ZSgncGlwZWxpbmVzOmNvZGVwaXBlbGluZScpLCB7XG4gICAgICAgIC4uLihjb2RlQnVpbGREZWZhdWx0cyAmJiB7IGNvZGVCdWlsZERlZmF1bHRzIH0pLFxuICAgICAgICAuLi4ocm9sZSAmJiB7IHJvbGUgfSksXG4gICAgICAgIC4uLihhcnRpZmFjdEJ1Y2tldCAmJiB7IGFydGlmYWN0QnVja2V0IH0pLFxuICAgICAgICBwaXBlbGluZVR5cGU6IFBpcGVsaW5lVHlwZS5WMixcbiAgICAgICAgcGlwZWxpbmVOYW1lOiB0aGlzLmNvbmZpZy5waXBlbGluZU5hbWUsXG4gICAgICAgIHN5bnRoLFxuICAgICAgICAuLi5tZXRhZGF0YUZvckNvZGVQaXBlbGluZSh0aGlzLmNvbmZpZy5tZXRhZGF0YS5tZXJnZWQpLFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChwcm9wcy5zdGFnZXMpIHtcbiAgICAgICAgY29uc3Qgc3RhZ2VCdWlsZGVyID0gbmV3IFN0YWdlQnVpbGRlcih7XG4gICAgICAgICAgc2NvcGU6IHRoaXMsXG4gICAgICAgICAgcGx1Z2luTG9va3VwLFxuICAgICAgICAgIHVuaXF1ZUlkLFxuICAgICAgICAgIGdsb2JhbE1ldGFkYXRhOiB0aGlzLmNvbmZpZy5tZXRhZGF0YS5tZXJnZWQsXG4gICAgICAgICAgZGVmYXVsdENvbXB1dGVUeXBlLFxuICAgICAgICAgIGFydGlmYWN0TWFuYWdlcixcbiAgICAgICAgICBvcmdJZDogcHJvcHMub3JnSWQsXG4gICAgICAgICAgcGlwZWxpbmVTY29wZSxcbiAgICAgICAgICBzdGVwTWFuaWZlc3QsXG4gICAgICAgIH0pO1xuICAgICAgICBzdGFnZUJ1aWxkZXIuYWRkU3RhZ2VzKHRoaXMucGlwZWxpbmUsIHByb3BzLnN0YWdlcyk7XG4gICAgICB9XG5cbiAgICAgIC8vIOKUgOKUgCBUYWdzIOKUgOKUgFxuICAgICAgLy8gVGhlIGZpcnN0IHRocmVlIGFyZSBvcGVyYXRpb25zLWVzc2VudGlhbCBhbmQgdXNlZCBieSBgcGlwZWxpbmUtbWFuYWdlclxuICAgICAgLy8gYXVkaXQgc3RhY2tzYCB0byBkaWZmIENGTiBzdGFja3MgYWdhaW5zdCB0aGUgcGlwZWxpbmVfcmVnaXN0cnkgdGFibGUuXG4gICAgICAvLyBgT3JnSWRgIGlzIHRoZSBjYW5vbmljYWwga2V5IGZvciBjb3N0IGF0dHJpYnV0aW9uIChBV1MgQ29zdCBFeHBsb3JlclxuICAgICAgLy8gZ3JvdXBzIGJ5IHRhZyBrZXkvdmFsdWUgd2hlbiBhY3RpdmF0ZWQgaW4gQmlsbGluZyBzZXR0aW5ncykuXG4gICAgICBUYWdzLm9mKHRoaXMucGlwZWxpbmUpLmFkZCgncGlwZWxpbmUtYnVpbGRlcicsICd0cnVlJyk7XG4gICAgICBUYWdzLm9mKHRoaXMucGlwZWxpbmUpLmFkZCgncHJvamVjdCcsIHRoaXMuY29uZmlnLnByb2plY3QpO1xuICAgICAgVGFncy5vZih0aGlzLnBpcGVsaW5lKS5hZGQoJ29yZ2FuaXphdGlvbicsIHRoaXMuY29uZmlnLm9yZ2FuaXphdGlvbik7XG4gICAgICBpZiAocHJvcHMub3JnSWQpIHtcbiAgICAgICAgVGFncy5vZih0aGlzLnBpcGVsaW5lKS5hZGQoJ09yZ0lkJywgcHJvcHMub3JnSWQpO1xuICAgICAgfVxuICAgICAgLy8gU3RhYmxlIGV2ZW50LXJlcG9ydGluZyBrZXkuIEFwcGxpZWQgYXQgc3ludGggKHRoZSBwaXBlbGluZUlkIGlzIGtub3duXG4gICAgICAvLyBoZXJlKSwgc28gaXQncyBwcmVzZW50IGZyb20gc3RhY2sgY3JlYXRpb24g4oCUIHRoZSBldmVudHMgTGFtYmRhIHJlYWRzIHRoaXNcbiAgICAgIC8vIHRhZyB0byBhdHRyaWJ1dGUgQ29kZVBpcGVsaW5lIHN0YXRlLWNoYW5nZSBldmVudHMgdG8gdGhlIHBpcGVsaW5lIHdpdGhvdXRcbiAgICAgIC8vIGV2ZXIgaGFuZGxpbmcgdGhlIEFSTi9hY2NvdW50LiBTZWUgcGFja2FnZXMvcGlwZWxpbmUtZXZlbnRzLlxuICAgICAgaWYgKHByb3BzLnBpcGVsaW5lSWQpIHtcbiAgICAgICAgVGFncy5vZih0aGlzLnBpcGVsaW5lKS5hZGQoJ3BiLnBpcGVsaW5lLWlkJywgcHJvcHMucGlwZWxpbmVJZCk7XG4gICAgICB9XG4gICAgICAvLyBEZXBsb3ktZW52aXJvbm1lbnQgYXR0cmlidXRpb24gZm9yIERPUkEgbWV0cmljcy4gYHBiLmRlcGxveXNgIGxpc3RzIGV2ZXJ5XG4gICAgICAvLyBkZXBsb3kgc3RhZ2UgYXMgYDxzdGFnZU5hbWU+OjxlbnZpcm9ubWVudD5gIHBhaXJzIGpvaW5lZCBieSBgK2AsIHJlYWQgYnlcbiAgICAgIC8vIHRoZSBldmVudHMgTGFtYmRhIGZyb20gdGhlIHNhbWUgTGlzdFRhZ3MgY2FsbCB0byBtYXJrIHdoaWNoIHN0YWdlcyBhcmVcbiAgICAgIC8vIGRlcGxveXMgYW5kIHRvIHdoaWNoIGVudmlyb25tZW50LiBBYnNlbnQgd2hlbiBubyBlbnZpcm9ubWVudCBpcyBkZWNsYXJlZFxuICAgICAgLy8g4oCUIHN1Y2ggcGlwZWxpbmVzIHByb2R1Y2Ugbm8gRE9SQSBkZXBsb3kgc2lnbmFsIHVudGlsIHRoZXkgcmUtc3ludGguXG4gICAgICBjb25zdCBkZXBsb3lzVGFnID0gYnVpbGREZXBsb3lzVGFnKHByb3BzKTtcbiAgICAgIGlmIChkZXBsb3lzVGFnKSB7XG4gICAgICAgIFRhZ3Mub2YodGhpcy5waXBlbGluZSkuYWRkKCdwYi5kZXBsb3lzJywgZGVwbG95c1RhZyk7XG4gICAgICB9XG4gICAgICBpZiAocHJvcHMudGFncykge1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhwcm9wcy50YWdzKSkge1xuICAgICAgICAgIFRhZ3Mub2YodGhpcy5waXBlbGluZSkuYWRkKGtleSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEJ1aWxkIHRoZSBpbnRlcm5hbCBwaXBlbGluZSBiZWZvcmUgYWNjZXNzaW5nIGl0cyBwcm9wZXJ0aWVzXG4gICAgICB0aGlzLnBpcGVsaW5lLmJ1aWxkUGlwZWxpbmUoKTtcbiAgICAgIGNvbnN0IGNka1BpcGVsaW5lID0gdGhpcy5waXBlbGluZS5waXBlbGluZTtcbiAgICAgIHRoaXMuc3RlcE1hbmlmZXN0ID0gc3RlcE1hbmlmZXN0LmVudHJpZXMoY2RrUGlwZWxpbmUpO1xuICAgICAgY29uc3QgbWV0YSA9IHRoaXMuY29uZmlnLm1ldGFkYXRhLm1lcmdlZDtcblxuICAgICAgLy8g4pSA4pSAIFBpcGVsaW5lLWxldmVsIFZhcmlhYmxlcyAoQ29kZVBpcGVsaW5lIFYyKSDilIDilIBcbiAgICAgIGZvciAoY29uc3QgdiBvZiBwYXJzZVBpcGVsaW5lVmFyaWFibGVzKG1ldGFbTWV0YWRhdGFLZXlzLlBJUEVMSU5FX1ZBUklBQkxFU10pKSB7XG4gICAgICAgIGNka1BpcGVsaW5lLmFkZFZhcmlhYmxlKG5ldyBWYXJpYWJsZSh7XG4gICAgICAgICAgdmFyaWFibGVOYW1lOiB2Lm5hbWUsXG4gICAgICAgICAgLi4uKHYuZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQgJiYgeyBkZWZhdWx0VmFsdWU6IHYuZGVmYXVsdFZhbHVlIH0pLFxuICAgICAgICAgIC4uLih2LmRlc2NyaXB0aW9uICE9PSB1bmRlZmluZWQgJiYgeyBkZXNjcmlwdGlvbjogdi5kZXNjcmlwdGlvbiB9KSxcbiAgICAgICAgfSkpO1xuICAgICAgfVxuXG4gICAgICAvLyDilIDilIAgU05TIE5vdGlmaWNhdGlvbnMg4pSA4pSAXG4gICAgICBjb25zdCBub3RpZmljYXRpb25Ub3BpY0FybiA9IG1ldGFbTWV0YWRhdGFLZXlzLk5PVElGSUNBVElPTl9UT1BJQ19BUk5dO1xuICAgICAgaWYgKHR5cGVvZiBub3RpZmljYXRpb25Ub3BpY0FybiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgY29uc3QgdG9waWMgPSBzbnMuVG9waWMuZnJvbVRvcGljQXJuKHRoaXMsICdOb3RpZmljYXRpb25Ub3BpYycsIG5vdGlmaWNhdGlvblRvcGljQXJuKTtcbiAgICAgICAgY29uc3Qgbm90aWZpY2F0aW9uRXZlbnRzID0gcGFyc2VOb3RpZmljYXRpb25FdmVudHMobWV0YVtNZXRhZGF0YUtleXMuTk9USUZJQ0FUSU9OX0VWRU5UU10pXG4gICAgICAgICAgLm1hcChlID0+IFBJUEVMSU5FX0VWRU5UX01BUFtlLnRvVXBwZXJDYXNlKCldKVxuICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbik7XG4gICAgICAgIGlmIChub3RpZmljYXRpb25FdmVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNka1BpcGVsaW5lLm5vdGlmeU9uKCdQaXBlbGluZU5vdGlmaWNhdGlvbicsIHRvcGljLCB7IGV2ZW50czogbm90aWZpY2F0aW9uRXZlbnRzIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIOKUgOKUgCBTY2hlZHVsZWQgRXhlY3V0aW9uIOKUgOKUgFxuICAgICAgaWYgKHByb3BzLnN5bnRoLnNvdXJjZS5vcHRpb25zPy50cmlnZ2VyID09PSBUcmlnZ2VyVHlwZS5TQ0hFRFVMRSB8fCBwcm9wcy5zY2hlZHVsZSkge1xuICAgICAgICBjb25zdCBleHByID0gcHJvcHMuc2NoZWR1bGUgfHwgKHByb3BzLnN5bnRoLnNvdXJjZS5vcHRpb25zIGFzIHsgc2NoZWR1bGU/OiBzdHJpbmcgfSk/LnNjaGVkdWxlIHx8ICdyYXRlKDEgZGF5KSc7XG4gICAgICAgIG5ldyBldmVudHMuUnVsZSh0aGlzLCAnU2NoZWR1bGVSdWxlJywge1xuICAgICAgICAgIHNjaGVkdWxlOiBldmVudHMuU2NoZWR1bGUuZXhwcmVzc2lvbihleHByKSxcbiAgICAgICAgICB0YXJnZXRzOiBbbmV3IHRhcmdldHMuQ29kZVBpcGVsaW5lKGNka1BpcGVsaW5lKV0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyDilIDilIAgRXhlY3V0aW9uIEV2ZW50IFRyYWNraW5nIChmb3J3YXJkIHBpcGVsaW5lIHN0YXRlIGNoYW5nZXMgdG8gU05TKSDilIDilIBcbiAgICAgIC8vIGBpc1RydWVgLCBub3QgdHJ1dGhpbmVzczogYFwiZmFsc2VcImAgaXMgYSB0cnV0aHkgc3RyaW5nLCBzbyB0aGUgbWV0YWRhdGFcbiAgICAgIC8vIGBcImF3czpjZGs6b3BlcmF0aW9uczpleGVjdXRpb25ldmVudHNcIjogXCJmYWxzZVwiYCB1c2VkIHRvIENSRUFURSB0aGUgcnVsZS5cbiAgICAgIGlmIChpc1RydWUobWV0YVtNZXRhZGF0YUtleXMuRU5BQkxFX0VYRUNVVElPTl9FVkVOVFNdKSAmJiB0eXBlb2Ygbm90aWZpY2F0aW9uVG9waWNBcm4gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIG5ldyBldmVudHMuUnVsZSh0aGlzLCAnRXhlY3V0aW9uRXZlbnRSdWxlJywge1xuICAgICAgICAgIGV2ZW50UGF0dGVybjoge1xuICAgICAgICAgICAgc291cmNlOiBbJ2F3cy5jb2RlcGlwZWxpbmUnXSxcbiAgICAgICAgICAgIGRldGFpbFR5cGU6IFsnQ29kZVBpcGVsaW5lIFBpcGVsaW5lIEV4ZWN1dGlvbiBTdGF0ZSBDaGFuZ2UnXSxcbiAgICAgICAgICAgIHJlc291cmNlczogW2Nka1BpcGVsaW5lLnBpcGVsaW5lQXJuXSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHRhcmdldHM6IFtuZXcgdGFyZ2V0cy5TbnNUb3BpYyhcbiAgICAgICAgICAgIHNucy5Ub3BpYy5mcm9tVG9waWNBcm4odGhpcywgJ0V4ZWN1dGlvbkV2ZW50VG9waWMnLCBub3RpZmljYXRpb25Ub3BpY0FybiksXG4gICAgICAgICAgKV0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyDilIDilIAgUGlwZWxpbmUgTWV0cmljcyAmIEFsYXJtcyDilIDilIBcbiAgICAgIC8vIFNhbWUgdHJhcDogYFwiYXdzOmNkazpvcGVyYXRpb25zOm1ldHJpY3NcIjogXCJmYWxzZVwiYCBjcmVhdGVkIHRoZSBhbGFybS5cbiAgICAgIGNvbnN0IGVuYWJsZU1ldHJpY3MgPSBpc1RydWUodGhpcy5jb25maWcubWV0YWRhdGEubWVyZ2VkW01ldGFkYXRhS2V5cy5FTkFCTEVfTUVUUklDU10pO1xuICAgICAgaWYgKGVuYWJsZU1ldHJpY3MpIHtcbiAgICAgICAgbmV3IGNsb3Vkd2F0Y2guQWxhcm0odGhpcywgJ1BpcGVsaW5lRmFpbHVyZUFsYXJtJywge1xuICAgICAgICAgIG1ldHJpYzogbmV3IGNsb3Vkd2F0Y2guTWV0cmljKHtcbiAgICAgICAgICAgIG5hbWVzcGFjZTogJ0FXUy9Db2RlUGlwZWxpbmUnLFxuICAgICAgICAgICAgbWV0cmljTmFtZTogJ0ZhaWxlZFBpcGVsaW5lRXhlY3V0aW9uQ291bnQnLFxuICAgICAgICAgICAgZGltZW5zaW9uc01hcDogeyBQaXBlbGluZU5hbWU6IHRoaXMuY29uZmlnLnBpcGVsaW5lTmFtZSB9LFxuICAgICAgICAgICAgc3RhdGlzdGljOiAnU3VtJyxcbiAgICAgICAgICAgIHBlcmlvZDogRHVyYXRpb24ubWludXRlcyg1KSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICB0aHJlc2hvbGQ6IDEsXG4gICAgICAgICAgZXZhbHVhdGlvblBlcmlvZHM6IDEsXG4gICAgICAgICAgYWxhcm1EZXNjcmlwdGlvbjogYFBpcGVsaW5lICR7dGhpcy5jb25maWcucGlwZWxpbmVOYW1lfSBleGVjdXRpb24gZmFpbGVkYCxcbiAgICAgICAgICBjb21wYXJpc29uT3BlcmF0b3I6IGNsb3Vkd2F0Y2guQ29tcGFyaXNvbk9wZXJhdG9yLkdSRUFURVJfVEhBTl9PUl9FUVVBTF9UT19USFJFU0hPTEQsXG4gICAgICAgICAgdHJlYXRNaXNzaW5nRGF0YTogY2xvdWR3YXRjaC5UcmVhdE1pc3NpbmdEYXRhLk5PVF9CUkVBQ0hJTkcsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICAvLyBSZXZlcnQgdGhlIHBlci1idWlsZGVyIHJlZ2lzdHJ5IG92ZXJyaWRlIHNvIGl0IG5ldmVyIGxlYWtzIGludG8gdGhlXG4gICAgICAvLyBwcm9jZXNzLXdpZGUgQ29uZmlnIGNhY2hlIChzZWUgdGhlIG92ZXJyaWRlIGF0IHRoZSB0b3Agb2YgdGhlIGNvbnN0cnVjdG9yKS5cbiAgICAgIHJlc3RvcmVSZWdpc3RyeT8uKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGEgY3VzdG9tIGFydGlmYWN0IGJ1Y2tldCB3aGVuIGBlbmNyeXB0aW9uLmttc0tleUFybmAgYW5kL29yXG4gICAqIGBvcGVyYXRpb25zLmFydGlmYWN0UmV0ZW50aW9uRGF5c2AgYXJlIHNldC4gUmV0dXJucyB1bmRlZmluZWQgb3RoZXJ3aXNlIHNvXG4gICAqIENESyBhdXRvLWNyZWF0ZXMgdGhlIGRlZmF1bHQgYXJ0aWZhY3QgYnVja2V0ICh1bmNoYW5nZWQgYmVoYXZpb3IpLlxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZEFydGlmYWN0QnVja2V0KCk6IHMzLklCdWNrZXQgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IG1ldGEgPSB0aGlzLmNvbmZpZy5tZXRhZGF0YS5tZXJnZWQ7XG4gICAgY29uc3Qga21zS2V5QXJuID0gdHlwZW9mIG1ldGFbTWV0YWRhdGFLZXlzLktNU19LRVlfQVJOXSA9PT0gJ3N0cmluZydcbiAgICAgID8gKG1ldGFbTWV0YWRhdGFLZXlzLktNU19LRVlfQVJOXSBhcyBzdHJpbmcpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCByZXRlbnRpb25EYXlzID0gYXNJbnQobWV0YVtNZXRhZGF0YUtleXMuQVJUSUZBQ1RfUkVURU5USU9OX0RBWVNdKTtcblxuICAgIGlmICgha21zS2V5QXJuICYmIHJldGVudGlvbkRheXMgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IGVuY3J5cHRpb25LZXkgPSBrbXNLZXlBcm5cbiAgICAgID8ga21zLktleS5mcm9tS2V5QXJuKHRoaXMsICdBcnRpZmFjdEtleScsIGttc0tleUFybilcbiAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgYnVja2V0ID0gbmV3IHMzLkJ1Y2tldCh0aGlzLCAnQXJ0aWZhY3RCdWNrZXQnLCB7XG4gICAgICBlbmNyeXB0aW9uOiBlbmNyeXB0aW9uS2V5ID8gczMuQnVja2V0RW5jcnlwdGlvbi5LTVMgOiBzMy5CdWNrZXRFbmNyeXB0aW9uLlMzX01BTkFHRUQsXG4gICAgICAuLi4oZW5jcnlwdGlvbktleSAmJiB7IGVuY3J5cHRpb25LZXkgfSksXG4gICAgICAuLi4ocmV0ZW50aW9uRGF5cyAhPT0gdW5kZWZpbmVkICYmIHtcbiAgICAgICAgbGlmZWN5Y2xlUnVsZXM6IFt7IGV4cGlyYXRpb246IER1cmF0aW9uLmRheXMocmV0ZW50aW9uRGF5cykgfV0sXG4gICAgICB9KSxcbiAgICAgIGVuZm9yY2VTU0w6IHRydWUsXG4gICAgICBibG9ja1B1YmxpY0FjY2VzczogczMuQmxvY2tQdWJsaWNBY2Nlc3MuQkxPQ0tfQUxMLFxuICAgICAgcmVtb3ZhbFBvbGljeTogUmVtb3ZhbFBvbGljeS5ERVNUUk9ZLFxuICAgICAgYXV0b0RlbGV0ZU9iamVjdHM6IHRydWUsXG4gICAgfSk7XG4gICAgVGFncy5vZihidWNrZXQpLmFkZCgncGlwZWxpbmUnLCB0aGlzLmNvbmZpZy5waXBlbGluZU5hbWUpO1xuICAgIHJldHVybiBidWNrZXQ7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgQ29kZUJ1aWxkRGVmYXVsdHMgaW50byB0aGUgc2hhcGUgZXhwZWN0ZWQgYnkgQ0RLJ3MgY29kZUJ1aWxkRGVmYXVsdHMuXG4gICAqIENvbWJpbmVzIG5ldHdvcmsgY29uZmlnLCBzZWN1cml0eSBncm91cHMsIGFuZCBwaXBlbGluZS1sZXZlbCBlbnZpcm9ubWVudCB2YXJpYWJsZXNcbiAgICogKFBJUEVMSU5FX0lELCBFWEVDVVRJT05fSUQsIFBMQVRGT1JNX0JBU0VfVVJMKSBhdmFpbGFibGUgdG8gYWxsIENvZGVCdWlsZCBhY3Rpb25zLlxuICAgKi9cbiAgcHJpdmF0ZSByZXNvbHZlRGVmYXVsdHMoXG4gICAgZGVmYXVsdHM6IENvZGVCdWlsZERlZmF1bHRzIHwgdW5kZWZpbmVkLFxuICAgIGlkOiBVbmlxdWVJZCxcbiAgICBwaXBlbGluZUlkOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgcGxhdGZvcm1TZWNyZXROYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgcGxhdGZvcm1Vcmw6IHN0cmluZyxcbiAgICBvcmdJZDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICApOiBDb2RlQnVpbGRPcHRpb25zIHwgdW5kZWZpbmVkIHtcbiAgICAvLyBQZXItcGlwZWxpbmUgbmV0d29yayBjb25maWcgd2luczsgb3RoZXJ3aXNlIGZhbGwgYmFjayB0byBhbiBlbnYtZHJpdmVuXG4gICAgLy8gZ2xvYmFsIFZQQyAoaW50ZXJuYWwgLyBpbnNpZGUtQVdTLW9ubHkgbW9kZSkgc28gZXZlcnkgcGlwZWxpbmUnc1xuICAgIC8vIENvZGVCdWlsZCBydW5zIGluIHRoZSBWUEMgYW5kIGNhbiByZWFjaCB0aGUgcHJpdmF0ZSBnYXRld2F5LiBVbnNldCBpblxuICAgIC8vIHB1YmxpYyBkZXBsb3lzIOKGkiBDb2RlQnVpbGQgc3RheXMgaW4gdGhlIEFXUy1tYW5hZ2VkIG5ldHdvcmsuXG4gICAgLy8gUHJlY2VkZW5jZTogZXhwbGljaXQgcHJvcCA+IGBlYzI6bmV0d29ya2AgbWV0YWRhdGEgPiBlbnYtZHJpdmVuIGdsb2JhbCBWUEMuXG4gICAgY29uc3QgbmV0d29yayA9IGRlZmF1bHRzPy5uZXR3b3JrID8/IG5ldHdvcmtDb25maWdGcm9tTWV0YWRhdGEodGhpcy5jb25maWcubWV0YWRhdGEubWVyZ2VkKSA/PyBuZXR3b3JrQ29uZmlnRnJvbUVudigpO1xuICAgIGNvbnN0IG5ldHdvcmtQcm9wcyA9IG5ldHdvcmtcbiAgICAgID8gcmVzb2x2ZU5ldHdvcmsodGhpcywgaWQsIG5ldHdvcmspXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIC8vIFNhbWUgcHJlY2VkZW5jZSBmb3Igc3RhbmRhbG9uZSBzZWN1cml0eSBncm91cHMgKHByb3AgPiBgZWMyOnNlY3VyaXR5Z3JvdXBgIG1ldGFkYXRhKS5cbiAgICBjb25zdCBzZWN1cml0eUdyb3VwQ29uZmlnID0gZGVmYXVsdHM/LnNlY3VyaXR5R3JvdXBzID8/IHNlY3VyaXR5R3JvdXBDb25maWdGcm9tTWV0YWRhdGEodGhpcy5jb25maWcubWV0YWRhdGEubWVyZ2VkKTtcbiAgICBjb25zdCBzdGFuZGFsb25lU2VjdXJpdHlHcm91cHMgPSBzZWN1cml0eUdyb3VwQ29uZmlnXG4gICAgICA/IHJlc29sdmVTZWN1cml0eUdyb3VwKHRoaXMsIGlkLCBzZWN1cml0eUdyb3VwQ29uZmlnKVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAvLyBQaXBlbGluZS1sZXZlbCBlbnYgdmFycyBhdmFpbGFibGUgdG8gYWxsIENvZGVCdWlsZCBhY3Rpb25zXG4gICAgLy8gTm90ZTogI3tjb2RlcGlwZWxpbmUuKn0gcmVzb2x2ZWQgdmFyaWFibGVzIG11c3QgZ28gdGhyb3VnaCBDb2RlQnVpbGRTdGVwLmVudlxuICAgIC8vIChhY3Rpb24tbGV2ZWwpLCBub3QgYnVpbGRFbnZpcm9ubWVudC5lbnZpcm9ubWVudFZhcmlhYmxlcyAocHJvamVjdC1sZXZlbCkuXG4gICAgY29uc3QgcGlwZWxpbmVFbnZWYXJzOiBSZWNvcmQ8c3RyaW5nLCB7IHZhbHVlOiBzdHJpbmcgfT4gPSB7XG4gICAgICBQTEFURk9STV9CQVNFX1VSTDogeyB2YWx1ZTogcGxhdGZvcm1VcmwgfSxcbiAgICAgIC4uLihwaXBlbGluZUlkICYmIHsgUElQRUxJTkVfSUQ6IHsgdmFsdWU6IHBpcGVsaW5lSWQgfSB9KSxcbiAgICAgIC4uLihwbGF0Zm9ybVNlY3JldE5hbWUgJiYgeyBQTEFURk9STV9TRUNSRVRfTkFNRTogeyB2YWx1ZTogcGxhdGZvcm1TZWNyZXROYW1lIH0gfSksXG4gICAgICAvLyBQcm9wYWdhdGUgVExTIHZlcmlmaWNhdGlvbiBzZXR0aW5nIHNvIGFsbCBDb2RlQnVpbGQgc3RlcHMgY2FuIHJlYWNoXG4gICAgICAvLyB0aGUgcGxhdGZvcm0gQVBJIHdoZW4gdXNpbmcgc2VsZi1zaWduZWQgY2VydGlmaWNhdGVzXG4gICAgICAuLi4ocHJvY2Vzcy5lbnYuTk9ERV9UTFNfUkVKRUNUX1VOQVVUSE9SSVpFRCA9PT0gJzAnICYmIHtcbiAgICAgICAgTk9ERV9UTFNfUkVKRUNUX1VOQVVUSE9SSVpFRDogeyB2YWx1ZTogJzAnIH0sXG4gICAgICB9KSxcbiAgICB9O1xuXG4gICAgY29uc3Qgc2VjdXJpdHlHcm91cHMgPSBbXG4gICAgICAuLi4obmV0d29ya1Byb3BzPy5zZWN1cml0eUdyb3VwcyA/PyBbXSksXG4gICAgICAuLi4oc3RhbmRhbG9uZVNlY3VyaXR5R3JvdXBzID8/IFtdKSxcbiAgICBdO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLihuZXR3b3JrUHJvcHMgJiYgeyB2cGM6IG5ldHdvcmtQcm9wcy52cGMsIHN1Ym5ldFNlbGVjdGlvbjogbmV0d29ya1Byb3BzLnN1Ym5ldFNlbGVjdGlvbiB9KSxcbiAgICAgIC4uLihzZWN1cml0eUdyb3Vwcy5sZW5ndGggPiAwICYmIHsgc2VjdXJpdHlHcm91cHMgfSksXG4gICAgICAvLyBidWlsZEltYWdlIGF0IHRoaXMgbGV2ZWwgcmVhY2hlcyBDREsgUGlwZWxpbmVzJyBpbnRlcm5hbGx5LXdyYXBwZWRcbiAgICAgIC8vIFNoZWxsU3RlcCBDb2RlQnVpbGQgYWN0aW9uLCB3aGljaCBvdGhlcndpc2UgaGFyZGNvZGVzXG4gICAgICAvLyBDREsncyBkZWZhdWx0IGN1cmF0ZWQgc3RhbmRhcmQgaW1hZ2UuIFNldHRpbmcgaXQgaGVyZSBjbG9zZXMgdGhlIGdhcFxuICAgICAgLy8gZXhwb3NlZCBpbiB0aGUgc2FtZSBlbnYgdmFyIChgQ09ERUJVSUxEX0RFRkFVTFRfSU1BR0VgKSB0aGF0IHRoZVxuICAgICAgLy8gQ29kZUJ1aWxkU3RlcCBwYXRoIGFscmVhZHkgaG9ub3JzIHZpYSByZXNvbHZlUGx1Z2luSW1hZ2UoKSdzXG4gICAgICAvLyBmYWxsYmFjay4gUGVyLXN0ZXAgYGJ1aWxkSW1hZ2VgIG9uIGEgQ29kZUJ1aWxkU3RlcCBzdGlsbCB3aW5zLlxuICAgICAgYnVpbGRFbnZpcm9ubWVudDoge1xuICAgICAgICBidWlsZEltYWdlOiByZXNvbHZlRGVmYXVsdEJ1aWxkSW1hZ2UodGhpcywgb3JnSWQpLFxuICAgICAgICBlbnZpcm9ubWVudFZhcmlhYmxlczogcGlwZWxpbmVFbnZWYXJzLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG59XG4iXX0=
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
// Copyright 2026 Pipeline Builder Contributors
|
|
2
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
3
3
|
import { CoreConstants } from '../config/app-config.js';
|
|
4
|
-
import {
|
|
4
|
+
import { replaceNonAlphanumeric } from '../core/metadata-helpers.js';
|
|
5
5
|
import { TriggerType } from '../core/pipeline-types.js';
|
|
6
|
+
import { pipelineScopeMetadata } from '../core/plugin-contract.js';
|
|
6
7
|
/**
|
|
7
8
|
* Validated and processed pipeline configuration (business logic layer).
|
|
8
9
|
* This class handles all non-CDK logic: validation, sanitization, and metadata merging.
|
|
@@ -40,13 +41,13 @@ export class PipelineConfiguration {
|
|
|
40
41
|
this.organization = replaceNonAlphanumeric(props.organization, '_').toLowerCase();
|
|
41
42
|
// Calculate pipeline name
|
|
42
43
|
this.pipelineName = props.pipelineName ?? `${this.organization}-${this.project}-pipeline`;
|
|
43
|
-
// Metadata merging: global → defaults → synth-specific
|
|
44
|
+
// Metadata merging: global → defaults → synth-specific. The one definition
|
|
45
|
+
// of `pipeline.metadata` — the API's plugin-contract check reads it too.
|
|
44
46
|
const global = { ...(props.global ?? {}) };
|
|
45
|
-
const withDefaults = merge(global, props.defaults?.metadata ?? {});
|
|
46
47
|
this.metadata = {
|
|
47
48
|
global,
|
|
48
49
|
synth: props.synth.metadata ?? {},
|
|
49
|
-
merged:
|
|
50
|
+
merged: pipelineScopeMetadata(props),
|
|
50
51
|
};
|
|
51
52
|
// Expose synth/builder properties directly
|
|
52
53
|
this.source = props.synth.source;
|
|
@@ -211,4 +212,4 @@ export class PipelineConfiguration {
|
|
|
211
212
|
};
|
|
212
213
|
}
|
|
213
214
|
}
|
|
214
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGlwZWxpbmUtY29uZmlndXJhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9waXBlbGluZS9waXBlbGluZS1jb25maWd1cmF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFLdEMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3hELE9BQU8sRUFBRSxLQUFLLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUc1RSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFeEQ7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFDSCxNQUFNLE9BQU8scUJBQXFCO0lBQ2hCLE9BQU8sQ0FBUztJQUNoQixZQUFZLENBQVM7SUFDckIsWUFBWSxDQUFTO0lBQ3JCLFFBQVEsQ0FJdEI7SUFDYyxNQUFNLENBQWE7SUFDbkIsTUFBTSxDQUFnQjtJQUN0QixPQUFPLENBQTRCO0lBQ25DLFFBQVEsQ0FBZ0M7SUFDeEMsa0JBQWtCLENBQW9CO0lBQ3RDLE1BQU0sQ0FBNkI7SUFDbkQsNkVBQTZFO0lBQzdELElBQUksQ0FBMEI7SUFFOUMsWUFBWSxLQUFtQjtRQUM3QixJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRTFCLDBDQUEwQztRQUMxQyxJQUFJLENBQUMsT0FBTyxHQUFHLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDeEUsSUFBSSxDQUFDLFlBQVksR0FBRyxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUFFLEdBQUcsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBRWxGLDBCQUEwQjtRQUMxQixJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQyxZQUFZLElBQUksR0FBRyxJQUFJLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxP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Q0gsb0JBQW9CO1FBQ2xCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDM0IsSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLFlBQVksRUFBRSxDQUFDO1lBQ2pDLE1BQU0sSUFBSSxLQUFLLENBQUMsK0JBQStCLENBQUMsQ0FBQztRQUNuRCxDQUFDO1FBRUQsT0FBTztZQUNMLEdBQUcsTUFBTSxDQUFDLE9BQU87WUFDakIsTUFBTSxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxJQUFJLE1BQU07WUFDdkMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxJQUFJLFdBQVcsQ0FBQyxJQUFJO1NBQ3BELENBQUM7SUFDSixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHR5cGUgeyBCdWlsZGVyUHJvcHMgfSBmcm9tICcuL3BpcGVsaW5lLWJ1aWxkZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBDb2RlQ29tbWl0T3B0aW9ucywgQ29kZVN0YXJPcHRpb25zLCBHaXRIdWJPcHRpb25zLCBTM09wdGlvbnMsIFNvdXJjZVR5cGUgfSBmcm9tICcuL3NvdXJjZS10eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IFBsdWdpbk9wdGlvbnMsIFN0YWdlT3B0aW9ucywgU3RlcEN1c3RvbWl6YXRpb24gfSBmcm9tICcuL3N0ZXAtdHlwZXMuanMnO1xuaW1wb3J0IHsgQ29yZUNvbnN0YW50cyB9IGZyb20gJy4uL2NvbmZpZy9hcHAtY29uZmlnLmpzJztcbmltcG9ydCB7IG1lcmdlLCByZXBsYWNlTm9uQWxwaGFudW1lcmljIH0gZnJvbSAnLi4vY29yZS9tZXRhZGF0YS1oZWxwZXJzLmpzJztcbmltcG9ydCB0eXBlIHsgQ29kZUJ1aWxkRGVmYXVsdHMsIE5ldHdvcmtDb25maWcgfSBmcm9tICcuLi9jb3JlL25ldHdvcmstdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBNZXRhRGF0YVR5cGUgfSBmcm9tICcuLi9jb3JlL3BpcGVsaW5lLXR5cGVzLmpzJztcbmltcG9ydCB7IFRyaWdnZXJUeXBlIH0gZnJvbSAnLi4vY29yZS9waXBlbGluZS10eXBlcy5qcyc7XG5cbi8qKlxuICogVmFsaWRhdGVkIGFuZCBwcm9jZXNzZWQgcGlwZWxpbmUgY29uZmlndXJhdGlvbiAoYnVzaW5lc3MgbG9naWMgbGF5ZXIpLlxuICogVGhpcyBjbGFzcyBoYW5kbGVzIGFsbCBub24tQ0RLIGxvZ2ljOiB2YWxpZGF0aW9uLCBzYW5pdGl6YXRpb24sIGFuZCBtZXRhZGF0YSBtZXJnaW5nLlxuICogSXQgY2FuIGJlIHRlc3RlZCBpbmRlcGVuZGVudGx5IHdpdGhvdXQgQ0RLIGRlcGVuZGVuY2llcy5cbiAqXG4gKiAjIyBNZXRhZGF0YSBtZXJnZSBjaGFpbiAobGFzdCB3aW5zKVxuICpcbiAqIDEuIGBCdWlsZGVyUHJvcHMuZ2xvYmFsYCDigJQgYmFzZSBtZXRhZGF0YSBpbmhlcml0ZWQgYnkgYWxsIHN0ZXBzXG4gKiAyLiBgQnVpbGRlclByb3BzLmRlZmF1bHRzLm1ldGFkYXRhYCDigJQgcGlwZWxpbmUtbGV2ZWwgQ29kZUJ1aWxkIGRlZmF1bHRzIG1ldGFkYXRhXG4gKiAzLiBgQnVpbGRlclByb3BzLnN5bnRoLm1ldGFkYXRhYCBvciBgU3RhZ2VTdGVwT3B0aW9ucy5tZXRhZGF0YWAg4oCUIHBlci1zdGVwIG1ldGFkYXRhXG4gKiA0LiBgcGx1Z2luLm1ldGFkYXRhYCDigJQgcGx1Z2luJ3Mgb3duIG1ldGFkYXRhIChtZXJnZWQgaW4gYGNyZWF0ZUNvZGVCdWlsZFN0ZXBgKVxuICogNS4gYG1ldGFkYXRhRm9yWHh4KClgIOKAlCBleHRyYWN0ZWQgQ0RLIHByb3BzIHNwcmVhZCBsYXN0IGludG8gY29uc3RydWN0IGNhbGxzXG4gKlxuICogU3RlcHMgMeKAkzMgYXJlIG1lcmdlZCBoZXJlIGludG8gYHRoaXMubWV0YWRhdGEubWVyZ2VkYC5cbiAqIFN0ZXAgNCBoYXBwZW5zIGluIGBjcmVhdGVDb2RlQnVpbGRTdGVwYCB2aWEgYG1lcmdlKG1ldGFkYXRhLCBwbHVnaW4ubWV0YWRhdGEpYC5cbiAqIFN0ZXAgNSBpcyBzcHJlYWQgbGFzdCBpbiB0aGUgQ0RLIGNvbnN0cnVjdG9yIGNhbGwsIGdpdmluZyBtZXRhZGF0YSBmdWxsIG92ZXJyaWRlIGF1dGhvcml0eS5cbiAqL1xuZXhwb3J0IGNsYXNzIFBpcGVsaW5lQ29uZmlndXJhdGlvbiB7XG4gIHB1YmxpYyByZWFkb25seSBwcm9qZWN0OiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSBvcmdhbml6YXRpb246IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IHBpcGVsaW5lTmFtZTogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgbWV0YWRhdGE6IHtcbiAgICByZWFkb25seSBnbG9iYWw6IE1ldGFEYXRhVHlwZTtcbiAgICByZWFkb25seSBzeW50aDogTWV0YURhdGFUeXBlO1xuICAgIHJlYWRvbmx5IG1lcmdlZDogTWV0YURhdGFUeXBlO1xuICB9O1xuICBwdWJsaWMgcmVhZG9ubHkgc291cmNlOiBTb3VyY2VUeXBlO1xuICBwdWJsaWMgcmVhZG9ubHkgcGx1Z2luOiBQbHVnaW5PcHRpb25zO1xuICBwdWJsaWMgcmVhZG9ubHkgbmV0d29yazogTmV0d29ya0NvbmZpZyB8IHVuZGVmaW5lZDtcbiAgcHVibGljIHJlYWRvbmx5IGRlZmF1bHRzOiBDb2RlQnVpbGREZWZhdWx0cyB8IHVuZGVmaW5lZDtcbiAgcHVibGljIHJlYWRvbmx5IHN5bnRoQ3VzdG9taXphdGlvbjogU3RlcEN1c3RvbWl6YXRpb247XG4gIHB1YmxpYyByZWFkb25seSBzdGFnZXM6IFN0YWdlT3B0aW9uc1tdIHwgdW5kZWZpbmVkO1xuICAvKiogUGlwZWxpbmUtbGV2ZWwgdGVtcGxhdGUgdmFyaWFibGVzLCBleHBvc2VkIHRvIGB7eyBwaXBlbGluZS52YXJzLiogfX1gLiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdmFyczogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgY29uc3RydWN0b3IocHJvcHM6IEJ1aWxkZXJQcm9wcykge1xuICAgIHRoaXMudmFsaWRhdGVQcm9wcyhwcm9wcyk7XG5cbiAgICAvLyBTYW5pdGl6ZSBwcm9qZWN0IGFuZCBvcmdhbml6YXRpb24gbmFtZXNcbiAgICB0aGlzLnByb2plY3QgPSByZXBsYWNlTm9uQWxwaGFudW1lcmljKHByb3BzLnByb2plY3QsICdfJykudG9Mb3dlckNhc2UoKTtcbiAgICB0aGlzLm9yZ2FuaXphdGlvbiA9IHJlcGxhY2VOb25BbHBoYW51bWVyaWMocHJvcHMub3JnYW5pemF0aW9uLCAnXycpLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAvLyBDYWxjdWxhdGUgcGlwZWxpbmUgbmFtZVxuICAgIHRoaXMucGlwZWxpbmVOYW1lID0gcHJvcHMucGlwZWxpbmVOYW1lID8/IGAke3RoaXMub3JnYW5pemF0aW9ufS0ke3RoaXMucHJvamVjdH0tcGlwZWxpbmVgO1xuXG4gICAgLy8gTWV0YWRhdGEgbWVyZ2luZzogZ2xvYmFsIOKGkiBkZWZhdWx0cyDihpIgc3ludGgtc3BlY2lmaWNcbiAgICBjb25zdCBnbG9iYWwgPSB7IC4uLihwcm9wcy5nbG9iYWwgPz8ge30pIH07XG4gICAgY29uc3Qgd2l0aERlZmF1bHRzID0gbWVyZ2UoZ2xvYmFsLCBwcm9wcy5kZWZhdWx0cz8ubWV0YWRhdGEgPz8ge30pO1xuICAgIHRoaXMubWV0YWRhdGEgPSB7XG4gICAgICBnbG9iYWwsXG4gICAgICBzeW50aDogcHJvcHMuc3ludGgubWV0YWRhdGEgPz8ge30sXG4gICAgICBtZXJnZWQ6IG1lcmdlKHdpdGhEZWZhdWx0cywgcHJvcHMuc3ludGgubWV0YWRhdGEgPz8ge30pLFxuICAgIH07XG5cbiAgICAvLyBFeHBvc2Ugc3ludGgvYnVpbGRlciBwcm9wZXJ0aWVzIGRpcmVjdGx5XG4gICAgdGhpcy5zb3VyY2UgPSBwcm9wcy5zeW50aC5zb3VyY2U7XG4gICAgdGhpcy5wbHVnaW4gPSBwcm9wcy5zeW50aC5wbHVnaW47XG4gICAgdGhpcy5uZXR3b3JrID0gcHJvcHMuc3ludGgubmV0d29yaztcbiAgICB0aGlzLmRlZmF1bHRzID0gcHJvcHMuZGVmYXVsdHM7XG4gICAgdGhpcy5zeW50aEN1c3RvbWl6YXRpb24gPSB7XG4gICAgICBwcmVJbnN0YWxsQ29tbWFuZHM6IHByb3BzLnN5bnRoLnByZUluc3RhbGxDb21tYW5kcyxcbiAgICAgIHBvc3RJbnN0YWxsQ29tbWFuZHM6IHByb3BzLnN5bnRoLnBvc3RJbnN0YWxsQ29tbWFuZHMsXG4gICAgICBwcmVDb21tYW5kczogcHJvcHMuc3ludGgucHJlQ29tbWFuZHMsXG4gICAgICBwb3N0Q29tbWFuZHM6IHByb3BzLnN5bnRoLnBvc3RDb21tYW5kcyxcbiAgICAgIGVudjogcHJvcHMuc3ludGguZW52LFxuICAgIH07XG4gICAgdGhpcy5zdGFnZXMgPSBwcm9wcy5zdGFnZXM7XG4gICAgdGhpcy52YXJzID0gcHJvcHMudmFycyA/PyB7fTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUZW1wbGF0ZSBzY29wZSBleHBvc2VkIGFzIGBwaXBlbGluZS4qYCB0byBwaXBlbGluZSBjb25maWdzLCBwbHVnaW4gc3BlY3MsIGFuZFxuICAgKiB0aGUgc291cmNlIGJ1aWxkZXIuIEJ1aWx0IG9uY2UgaGVyZSBzbyBldmVyeSBjb25zdW1lciDigJQgdGhlIHN5bnRoIHN0ZXAsIGVhY2hcbiAgICogc3RhZ2Ugc3RlcCwgYW5kIHRoZSBzb3VyY2UgdG9rZW4g4oCUIHJlc29sdmVzIGB7eyBwaXBlbGluZS4qIH19YCBhZ2FpbnN0IHRoZVxuICAgKiBpZGVudGljYWwgc25hcHNob3QgKG5vIGRyaWZ0IGJldHdlZW4gY2FsbCBzaXRlcykuXG4gICAqL1xuICBnZXRQaXBlbGluZVNjb3BlKCk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICByZXR1cm4ge1xuICAgICAgcGlwZWxpbmU6IHtcbiAgICAgICAgcHJvamVjdE5hbWU6IHRoaXMucHJvamVjdCxcbiAgICAgICAgcHJvamVjdDogdGhpcy5wcm9qZWN0LFxuICAgICAgICBvcmdJZDogdGhpcy5vcmdhbml6YXRpb24sXG4gICAgICAgIG9yZ2FuaXphdGlvbjogdGhpcy5vcmdhbml6YXRpb24sXG4gICAgICAgIHBpcGVsaW5lTmFtZTogdGhpcy5waXBlbGluZU5hbWUsXG4gICAgICAgIG1ldGFkYXRhOiB0aGlzLm1ldGFkYXRhLm1lcmdlZCxcbiAgICAgICAgdmFyczogdGhpcy52YXJzLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyBCdWlsZGVyUHJvcHMgdG8gZW5zdXJlIGFsbCByZXF1aXJlZCBmaWVsZHMgYXJlIHByZXNlbnQuXG4gICAqIFRocm93cyBhbiBlcnJvciB3aXRoIGRldGFpbGVkIG1lc3NhZ2VzIGlmIHZhbGlkYXRpb24gZmFpbHMuXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlUHJvcHMocHJvcHM6IEJ1aWxkZXJQcm9wcyk6IHZvaWQge1xuICAgIGNvbnN0IGVycm9yczogc3RyaW5nW10gPSBbXTtcblxuICAgIGlmICghcHJvcHMucHJvamVjdCkge1xuICAgICAgZXJyb3JzLnB1c2goJ0J1aWxkZXJQcm9wcy5wcm9qZWN0IGlzIHJlcXVpcmVkJyk7XG4gICAgfVxuXG4gICAgaWYgKCFwcm9wcy5vcmdhbml6YXRpb24pIHtcbiAgICAgIGVycm9ycy5wdXNoKCdCdWlsZGVyUHJvcHMub3JnYW5pemF0aW9uIGlzIHJlcXVpcmVkJyk7XG4gICAgfVxuXG4gICAgaWYgKCFwcm9wcy5zeW50aD8uc291cmNlKSB7XG4gICAgICBlcnJvcnMucHVzaCgnQnVpbGRlclByb3BzLnN5bnRoLnNvdXJjZSBpcyByZXF1aXJlZCcpO1xuICAgIH1cblxuICAgIGlmICghcHJvcHMuc3ludGg/LnBsdWdpbikge1xuICAgICAgZXJyb3JzLnB1c2goJ0J1aWxkZXJQcm9wcy5zeW50aC5wbHVnaW4gaXMgcmVxdWlyZWQnKTtcbiAgICB9IGVsc2UgaWYgKCFwcm9wcy5zeW50aC5wbHVnaW4ubmFtZT8udHJpbSgpKSB7XG4gICAgICBlcnJvcnMucHVzaCgnQnVpbGRlclByb3BzLnN5bnRoLnBsdWdpbi5uYW1lIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nJyk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgcmVwbyBmb3JtYXQgZm9yIEdpdEh1YiBhbmQgQ29kZVN0YXIgc291cmNlcyAoYm90aCB1c2UgXCJvd25lci9yZXBvXCIpXG4gICAgY29uc3Qgc291cmNlVHlwZSA9IHByb3BzLnN5bnRoPy5zb3VyY2U/LnR5cGU7XG4gICAgaWYgKHNvdXJjZVR5cGUgPT09ICdnaXRodWInIHx8IHNvdXJjZVR5cGUgPT09ICdjb2Rlc3RhcicpIHtcbiAgICAgIGNvbnN0IHJlcG8gPSBwcm9wcy5zeW50aD8uc291cmNlPy5vcHRpb25zPy5yZXBvO1xuICAgICAgaWYgKHJlcG8gJiYgIXJlcG8uaW5jbHVkZXMoJy8nKSkge1xuICAgICAgICBlcnJvcnMucHVzaChgSW52YWxpZCAke3NvdXJjZVR5cGV9IHJlcG9zaXRvcnkgZm9ybWF0OiBcIiR7cmVwb31cIi4gRXhwZWN0ZWQgZm9ybWF0OiBcIm93bmVyL3JlcG9cImApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIHBpcGVsaW5lIG5hbWUgbGVuZ3RoIChBV1MgbWF4IDEwMCBjaGFyYWN0ZXJzKVxuICAgIGNvbnN0IE1BWF9QSVBFTElORV9OQU1FX0xFTkdUSCA9IENvcmVDb25zdGFudHMuUElQRUxJTkVfTkFNRV9NQVhfTEVOR1RIO1xuICAgIGNvbnN0IHBpcGVsaW5lTmFtZSA9IHByb3BzLnBpcGVsaW5lTmFtZVxuICAgICAgPz8gYCR7cmVwbGFjZU5vbkFscGhhbnVtZXJpYyhwcm9wcy5vcmdhbml6YXRpb24gPz8gJycsICdfJykudG9Mb3dlckNhc2UoKX0tJHtyZXBsYWNlTm9uQWxwaGFudW1lcmljKHByb3BzLnByb2plY3QgPz8gJycsICdfJykudG9Mb3dlckNhc2UoKX0tcGlwZWxpbmVgO1xuICAgIGlmIChwaXBlbGluZU5hbWUubGVuZ3RoID4gTUFYX1BJUEVMSU5FX05BTUVfTEVOR1RIKSB7XG4gICAgICBlcnJvcnMucHVzaChgUGlwZWxpbmUgbmFtZSBcIiR7cGlwZWxpbmVOYW1lfVwiIGV4Y2VlZHMgQVdTIG1heGltdW0gb2YgJHtNQVhfUElQRUxJTkVfTkFNRV9MRU5HVEh9IGNoYXJhY3RlcnMgKCR7cGlwZWxpbmVOYW1lLmxlbmd0aH0pYCk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgc3RhZ2VzXG4gICAgaWYgKHByb3BzLnN0YWdlcykge1xuICAgICAgY29uc3Qgc3RhZ2VOYW1lcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgZm9yIChjb25zdCBzdGFnZSBvZiBwcm9wcy5zdGFnZXMpIHtcbiAgICAgICAgaWYgKCFzdGFnZS5zdGFnZU5hbWU/LnRyaW0oKSkge1xuICAgICAgICAgIGVycm9ycy5wdXNoKCdFYWNoIHN0YWdlIG11c3QgaGF2ZSBhIG5vbi1lbXB0eSBzdGFnZU5hbWUnKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGFnZU5hbWVzLmhhcyhzdGFnZS5zdGFnZU5hbWUpKSB7XG4gICAgICAgICAgZXJyb3JzLnB1c2goYER1cGxpY2F0ZSBzdGFnZSBuYW1lOiBcIiR7c3RhZ2Uuc3RhZ2VOYW1lfVwiYCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3RhZ2VOYW1lcy5hZGQoc3RhZ2Uuc3RhZ2VOYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXN0YWdlLnN0ZXBzPy5sZW5ndGgpIHtcbiAgICAgICAgICBlcnJvcnMucHVzaChgU3RhZ2UgXCIke3N0YWdlLnN0YWdlTmFtZSA/PyAnKHVubmFtZWQpJ31cIiBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIHN0ZXBgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnUGlwZWxpbmUgY29uZmlndXJhdGlvbiB2YWxpZGF0aW9uIGZhaWxlZDpcXG4nICtcbiAgICAgICAgZXJyb3JzLm1hcChlID0+IGAgIC0gJHtlfWApLmpvaW4oJ1xcbicpLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRXh0cmFjdHMgUzMgc291cmNlIG9wdGlvbnMgd2l0aCBkZWZhdWx0cyBhcHBsaWVkLlxuICAgKlxuICAgKiBAcmV0dXJucyBTMyBvcHRpb25zIHdpdGggYG9iamVjdEtleWAgZGVmYXVsdGluZyB0byBgJ3NvdXJjZS56aXAnYCBhbmQgYHRyaWdnZXJgIGRlZmF1bHRpbmcgdG8gYE5PTkVgXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgY29uZmlndXJlZCBzb3VyY2UgdHlwZSBpcyBub3QgYHMzYFxuICAgKi9cbiAgZ2V0UzNPcHRpb25zKCk6IFJlcXVpcmVkPFBpY2s8UzNPcHRpb25zLCAnYnVja2V0TmFtZScgfCAnb2JqZWN0S2V5JyB8ICd0cmlnZ2VyJz4+ICYgT21pdDxTM09wdGlvbnMsICdidWNrZXROYW1lJyB8ICdvYmplY3RLZXknIHwgJ3RyaWdnZXInPiB7XG4gICAgY29uc3Qgc291cmNlID0gdGhpcy5zb3VyY2U7XG4gICAgaWYgKHNvdXJjZS50eXBlICE9PSAnczMnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NvdXJjZSB0eXBlIGlzIG5vdCBTMycpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAuLi5zb3VyY2Uub3B0aW9ucyxcbiAgICAgIG9iamVjdEtleTogc291cmNlLm9wdGlvbnMub2JqZWN0S2V5ID8/ICdzb3VyY2UuemlwJyxcbiAgICAgIHRyaWdnZXI6IHNvdXJjZS5vcHRpb25zLnRyaWdnZXIgPz8gVHJpZ2dlclR5cGUuTk9ORSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEV4dHJhY3RzIEdpdEh1YiBzb3VyY2Ugb3B0aW9ucyB3aXRoIGRlZmF1bHRzIGFwcGxpZWQuXG4gICAqXG4gICAqIEByZXR1cm5zIEdpdEh1YiBvcHRpb25zIHdpdGggYGJyYW5jaGAgZGVmYXVsdGluZyB0byBgJ21haW4nYCBhbmQgYHRyaWdnZXJgIGRlZmF1bHRpbmcgdG8gYE5PTkVgXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgY29uZmlndXJlZCBzb3VyY2UgdHlwZSBpcyBub3QgYGdpdGh1YmBcbiAgICovXG4gIGdldEdpdEh1Yk9wdGlvbnMoKTogUmVxdWlyZWQ8UGljazxHaXRIdWJPcHRpb25zLCAncmVwbycgfCAnYnJhbmNoJyB8ICd0cmlnZ2VyJz4+ICYgT21pdDxHaXRIdWJPcHRpb25zLCAncmVwbycgfCAnYnJhbmNoJyB8ICd0cmlnZ2VyJz4ge1xuICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMuc291cmNlO1xuICAgIGlmIChzb3VyY2UudHlwZSAhPT0gJ2dpdGh1YicpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignU291cmNlIHR5cGUgaXMgbm90IEdpdEh1YicpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAuLi5zb3VyY2Uub3B0aW9ucyxcbiAgICAgIGJyYW5jaDogc291cmNlLm9wdGlvbnMuYnJhbmNoID8/ICdtYWluJyxcbiAgICAgIHRyaWdnZXI6IHNvdXJjZS5vcHRpb25zLnRyaWdnZXIgPz8gVHJpZ2dlclR5cGUuTk9ORSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEV4dHJhY3RzIENvZGVTdGFyIHNvdXJjZSBvcHRpb25zIHdpdGggZGVmYXVsdHMgYXBwbGllZC5cbiAgICpcbiAgICogQHJldHVybnMgQ29kZVN0YXIgb3B0aW9ucyB3aXRoIGBicmFuY2hgIGRlZmF1bHRpbmcgdG8gYCdtYWluJ2AsIGB0cmlnZ2VyYCBkZWZhdWx0aW5nIHRvIGBOT05FYCwgYW5kIGBjb2RlQnVpbGRDbG9uZU91dHB1dGAgZGVmYXVsdGluZyB0byBgZmFsc2VgXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgY29uZmlndXJlZCBzb3VyY2UgdHlwZSBpcyBub3QgYGNvZGVzdGFyYFxuICAgKi9cbiAgZ2V0Q29kZVN0YXJPcHRpb25zKCk6IFJlcXVpcmVkPFBpY2s8Q29kZVN0YXJPcHRpb25zLCAncmVwbycgfCAnYnJhbmNoJyB8ICd0cmlnZ2VyJyB8ICdjb2RlQnVpbGRDbG9uZU91dHB1dCcgfCAnY29ubmVjdGlvbkFybic+PiB7XG4gICAgY29uc3Qgc291cmNlID0gdGhpcy5zb3VyY2U7XG4gICAgaWYgKHNvdXJjZS50eXBlICE9PSAnY29kZXN0YXInKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NvdXJjZSB0eXBlIGlzIG5vdCBDb2RlU3RhcicpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAuLi5zb3VyY2Uub3B0aW9ucyxcbiAgICAgIGJyYW5jaDogc291cmNlLm9wdGlvbnMuYnJhbmNoID8/ICdtYWluJyxcbiAgICAgIHRyaWdnZXI6IHNvdXJjZS5vcHRpb25zLnRyaWdnZXIgPz8gVHJpZ2dlclR5cGUuTk9ORSxcbiAgICAgIGNvZGVCdWlsZENsb25lT3V0cHV0OiBzb3VyY2Uub3B0aW9ucy5jb2RlQnVpbGRDbG9uZU91dHB1dCA/PyBmYWxzZSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEV4dHJhY3RzIENvZGVDb21taXQgc291cmNlIG9wdGlvbnMgd2l0aCBkZWZhdWx0cyBhcHBsaWVkLlxuICAgKlxuICAgKiBAcmV0dXJucyBDb2RlQ29tbWl0IG9wdGlvbnMgd2l0aCBgYnJhbmNoYCBkZWZhdWx0aW5nIHRvIGAnbWFpbidgIGFuZCBgdHJpZ2dlcmAgZGVmYXVsdGluZyB0byBgTk9ORWBcbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBjb25maWd1cmVkIHNvdXJjZSB0eXBlIGlzIG5vdCBgY29kZWNvbW1pdGBcbiAgICovXG4gIGdldENvZGVDb21taXRPcHRpb25zKCk6IFJlcXVpcmVkPFBpY2s8Q29kZUNvbW1pdE9wdGlvbnMsICdyZXBvc2l0b3J5TmFtZScgfCAnYnJhbmNoJyB8ICd0cmlnZ2VyJz4+IHtcbiAgICBjb25zdCBzb3VyY2UgPSB0aGlzLnNvdXJjZTtcbiAgICBpZiAoc291cmNlLnR5cGUgIT09ICdjb2RlY29tbWl0Jykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdTb3VyY2UgdHlwZSBpcyBub3QgQ29kZUNvbW1pdCcpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAuLi5zb3VyY2Uub3B0aW9ucyxcbiAgICAgIGJyYW5jaDogc291cmNlLm9wdGlvbnMuYnJhbmNoID8/ICdtYWluJyxcbiAgICAgIHRyaWdnZXI6IHNvdXJjZS5vcHRpb25zLnRyaWdnZXIgPz8gVHJpZ2dlclR5cGUuTk9ORSxcbiAgICB9O1xuICB9XG59XG4iXX0=
|
|
215
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGlwZWxpbmUtY29uZmlndXJhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9waXBlbGluZS9waXBlbGluZS1jb25maWd1cmF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFLdEMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3hELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBR3JFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN4RCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUVuRTs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUNILE1BQU0sT0FBTyxxQkFBcUI7SUFDaEIsT0FBTyxDQUFTO0lBQ2hCLFlBQVksQ0FBUztJQUNyQixZQUFZLENBQVM7SUFDckIsUUFBUSxDQUl0QjtJQUNjLE1BQU0sQ0FBYTtJQUNuQixNQUFNLENBQWdCO0lBQ3RCLE9BQU8sQ0FBNEI7SUFDbkMsUUFBUSxDQUFnQztJQUN4QyxrQkFBa0IsQ0FBb0I7SUFDdEMsTUFBTSxDQUE2QjtJQUNuRCw2RUFBNkU7SUFDN0QsSUFBSSxDQUEwQjtJQUU5QyxZQUFZLEtBQW1CO1FBQzdCLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFMUIsMENBQTBDO1FBQzFDLElBQUksQ0FBQyxPQUFPLEdBQUcsc0JBQXNCLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUN4RSxJQUFJLENBQUMsWUFBWSxHQUFHLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUUsR0FBRyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7UUFFbEYsMEJBQTBCO1FBQzFCLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDLFlBQVksSUFBSSxH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LEtBQUssWUFBWSxFQUFFLENBQUM7WUFDakMsTUFBTSxJQUFJLEtBQUssQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO1FBQ25ELENBQUM7UUFFRCxPQUFPO1lBQ0wsR0FBRyxNQUFNLENBQUMsT0FBTztZQUNqQixNQUFNLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLElBQUksTUFBTTtZQUN2QyxPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLElBQUksV0FBVyxDQUFDLElBQUk7U0FDcEQsQ0FBQztJQUNKLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgdHlwZSB7IEJ1aWxkZXJQcm9wcyB9IGZyb20gJy4vcGlwZWxpbmUtYnVpbGRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IENvZGVDb21taXRPcHRpb25zLCBDb2RlU3Rhck9wdGlvbnMsIEdpdEh1Yk9wdGlvbnMsIFMzT3B0aW9ucywgU291cmNlVHlwZSB9IGZyb20gJy4vc291cmNlLXR5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgUGx1Z2luT3B0aW9ucywgU3RhZ2VPcHRpb25zLCBTdGVwQ3VzdG9taXphdGlvbiB9IGZyb20gJy4vc3RlcC10eXBlcy5qcyc7XG5pbXBvcnQgeyBDb3JlQ29uc3RhbnRzIH0gZnJvbSAnLi4vY29uZmlnL2FwcC1jb25maWcuanMnO1xuaW1wb3J0IHsgcmVwbGFjZU5vbkFscGhhbnVtZXJpYyB9IGZyb20gJy4uL2NvcmUvbWV0YWRhdGEtaGVscGVycy5qcyc7XG5pbXBvcnQgdHlwZSB7IENvZGVCdWlsZERlZmF1bHRzLCBOZXR3b3JrQ29uZmlnIH0gZnJvbSAnLi4vY29yZS9uZXR3b3JrLXR5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgTWV0YURhdGFUeXBlIH0gZnJvbSAnLi4vY29yZS9waXBlbGluZS10eXBlcy5qcyc7XG5pbXBvcnQgeyBUcmlnZ2VyVHlwZSB9IGZyb20gJy4uL2NvcmUvcGlwZWxpbmUtdHlwZXMuanMnO1xuaW1wb3J0IHsgcGlwZWxpbmVTY29wZU1ldGFkYXRhIH0gZnJvbSAnLi4vY29yZS9wbHVnaW4tY29udHJhY3QuanMnO1xuXG4vKipcbiAqIFZhbGlkYXRlZCBhbmQgcHJvY2Vzc2VkIHBpcGVsaW5lIGNvbmZpZ3VyYXRpb24gKGJ1c2luZXNzIGxvZ2ljIGxheWVyKS5cbiAqIFRoaXMgY2xhc3MgaGFuZGxlcyBhbGwgbm9uLUNESyBsb2dpYzogdmFsaWRhdGlvbiwgc2FuaXRpemF0aW9uLCBhbmQgbWV0YWRhdGEgbWVyZ2luZy5cbiAqIEl0IGNhbiBiZSB0ZXN0ZWQgaW5kZXBlbmRlbnRseSB3aXRob3V0IENESyBkZXBlbmRlbmNpZXMuXG4gKlxuICogIyMgTWV0YWRhdGEgbWVyZ2UgY2hhaW4gKGxhc3Qgd2lucylcbiAqXG4gKiAxLiBgQnVpbGRlclByb3BzLmdsb2JhbGAg4oCUIGJhc2UgbWV0YWRhdGEgaW5oZXJpdGVkIGJ5IGFsbCBzdGVwc1xuICogMi4gYEJ1aWxkZXJQcm9wcy5kZWZhdWx0cy5tZXRhZGF0YWAg4oCUIHBpcGVsaW5lLWxldmVsIENvZGVCdWlsZCBkZWZhdWx0cyBtZXRhZGF0YVxuICogMy4gYEJ1aWxkZXJQcm9wcy5zeW50aC5tZXRhZGF0YWAgb3IgYFN0YWdlU3RlcE9wdGlvbnMubWV0YWRhdGFgIOKAlCBwZXItc3RlcCBtZXRhZGF0YVxuICogNC4gYHBsdWdpbi5tZXRhZGF0YWAg4oCUIHBsdWdpbidzIG93biBtZXRhZGF0YSAobWVyZ2VkIGluIGBjcmVhdGVDb2RlQnVpbGRTdGVwYClcbiAqIDUuIGBtZXRhZGF0YUZvclh4eCgpYCDigJQgZXh0cmFjdGVkIENESyBwcm9wcyBzcHJlYWQgbGFzdCBpbnRvIGNvbnN0cnVjdCBjYWxsc1xuICpcbiAqIFN0ZXBzIDHigJMzIGFyZSBtZXJnZWQgaGVyZSBpbnRvIGB0aGlzLm1ldGFkYXRhLm1lcmdlZGAuXG4gKiBTdGVwIDQgaGFwcGVucyBpbiBgY3JlYXRlQ29kZUJ1aWxkU3RlcGAgdmlhIGBtZXJnZShtZXRhZGF0YSwgcGx1Z2luLm1ldGFkYXRhKWAuXG4gKiBTdGVwIDUgaXMgc3ByZWFkIGxhc3QgaW4gdGhlIENESyBjb25zdHJ1Y3RvciBjYWxsLCBnaXZpbmcgbWV0YWRhdGEgZnVsbCBvdmVycmlkZSBhdXRob3JpdHkuXG4gKi9cbmV4cG9ydCBjbGFzcyBQaXBlbGluZUNvbmZpZ3VyYXRpb24ge1xuICBwdWJsaWMgcmVhZG9ubHkgcHJvamVjdDogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgb3JnYW5pemF0aW9uOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSBwaXBlbGluZU5hbWU6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IG1ldGFkYXRhOiB7XG4gICAgcmVhZG9ubHkgZ2xvYmFsOiBNZXRhRGF0YVR5cGU7XG4gICAgcmVhZG9ubHkgc3ludGg6IE1ldGFEYXRhVHlwZTtcbiAgICByZWFkb25seSBtZXJnZWQ6IE1ldGFEYXRhVHlwZTtcbiAgfTtcbiAgcHVibGljIHJlYWRvbmx5IHNvdXJjZTogU291cmNlVHlwZTtcbiAgcHVibGljIHJlYWRvbmx5IHBsdWdpbjogUGx1Z2luT3B0aW9ucztcbiAgcHVibGljIHJlYWRvbmx5IG5ldHdvcms6IE5ldHdvcmtDb25maWcgfCB1bmRlZmluZWQ7XG4gIHB1YmxpYyByZWFkb25seSBkZWZhdWx0czogQ29kZUJ1aWxkRGVmYXVsdHMgfCB1bmRlZmluZWQ7XG4gIHB1YmxpYyByZWFkb25seSBzeW50aEN1c3RvbWl6YXRpb246IFN0ZXBDdXN0b21pemF0aW9uO1xuICBwdWJsaWMgcmVhZG9ubHkgc3RhZ2VzOiBTdGFnZU9wdGlvbnNbXSB8IHVuZGVmaW5lZDtcbiAgLyoqIFBpcGVsaW5lLWxldmVsIHRlbXBsYXRlIHZhcmlhYmxlcywgZXhwb3NlZCB0byBge3sgcGlwZWxpbmUudmFycy4qIH19YC4gKi9cbiAgcHVibGljIHJlYWRvbmx5IHZhcnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzOiBCdWlsZGVyUHJvcHMpIHtcbiAgICB0aGlzLnZhbGlkYXRlUHJvcHMocHJvcHMpO1xuXG4gICAgLy8gU2FuaXRpemUgcHJvamVjdCBhbmQgb3JnYW5pemF0aW9uIG5hbWVzXG4gICAgdGhpcy5wcm9qZWN0ID0gcmVwbGFjZU5vbkFscGhhbnVtZXJpYyhwcm9wcy5wcm9qZWN0LCAnXycpLnRvTG93ZXJDYXNlKCk7XG4gICAgdGhpcy5vcmdhbml6YXRpb24gPSByZXBsYWNlTm9uQWxwaGFudW1lcmljKHByb3BzLm9yZ2FuaXphdGlvbiwgJ18nKS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgLy8gQ2FsY3VsYXRlIHBpcGVsaW5lIG5hbWVcbiAgICB0aGlzLnBpcGVsaW5lTmFtZSA9IHByb3BzLnBpcGVsaW5lTmFtZSA/PyBgJHt0aGlzLm9yZ2FuaXphdGlvbn0tJHt0aGlzLnByb2plY3R9LXBpcGVsaW5lYDtcblxuICAgIC8vIE1ldGFkYXRhIG1lcmdpbmc6IGdsb2JhbCDihpIgZGVmYXVsdHMg4oaSIHN5bnRoLXNwZWNpZmljLiBUaGUgb25lIGRlZmluaXRpb25cbiAgICAvLyBvZiBgcGlwZWxpbmUubWV0YWRhdGFgIOKAlCB0aGUgQVBJJ3MgcGx1Z2luLWNvbnRyYWN0IGNoZWNrIHJlYWRzIGl0IHRvby5cbiAgICBjb25zdCBnbG9iYWwgPSB7IC4uLihwcm9wcy5nbG9iYWwgPz8ge30pIH07XG4gICAgdGhpcy5tZXRhZGF0YSA9IHtcbiAgICAgIGdsb2JhbCxcbiAgICAgIHN5bnRoOiBwcm9wcy5zeW50aC5tZXRhZGF0YSA/PyB7fSxcbiAgICAgIG1lcmdlZDogcGlwZWxpbmVTY29wZU1ldGFkYXRhKHByb3BzKSxcbiAgICB9O1xuXG4gICAgLy8gRXhwb3NlIHN5bnRoL2J1aWxkZXIgcHJvcGVydGllcyBkaXJlY3RseVxuICAgIHRoaXMuc291cmNlID0gcHJvcHMuc3ludGguc291cmNlO1xuICAgIHRoaXMucGx1Z2luID0gcHJvcHMuc3ludGgucGx1Z2luO1xuICAgIHRoaXMubmV0d29yayA9IHByb3BzLnN5bnRoLm5ldHdvcms7XG4gICAgdGhpcy5kZWZhdWx0cyA9IHByb3BzLmRlZmF1bHRzO1xuICAgIHRoaXMuc3ludGhDdXN0b21pemF0aW9uID0ge1xuICAgICAgcHJlSW5zdGFsbENvbW1hbmRzOiBwcm9wcy5zeW50aC5wcmVJbnN0YWxsQ29tbWFuZHMsXG4gICAgICBwb3N0SW5zdGFsbENvbW1hbmRzOiBwcm9wcy5zeW50aC5wb3N0SW5zdGFsbENvbW1hbmRzLFxuICAgICAgcHJlQ29tbWFuZHM6IHByb3BzLnN5bnRoLnByZUNvbW1hbmRzLFxuICAgICAgcG9zdENvbW1hbmRzOiBwcm9wcy5zeW50aC5wb3N0Q29tbWFuZHMsXG4gICAgICBlbnY6IHByb3BzLnN5bnRoLmVudixcbiAgICB9O1xuICAgIHRoaXMuc3RhZ2VzID0gcHJvcHMuc3RhZ2VzO1xuICAgIHRoaXMudmFycyA9IHByb3BzLnZhcnMgPz8ge307XG4gIH1cblxuICAvKipcbiAgICogVGVtcGxhdGUgc2NvcGUgZXhwb3NlZCBhcyBgcGlwZWxpbmUuKmAgdG8gcGlwZWxpbmUgY29uZmlncywgcGx1Z2luIHNwZWNzLCBhbmRcbiAgICogdGhlIHNvdXJjZSBidWlsZGVyLiBCdWlsdCBvbmNlIGhlcmUgc28gZXZlcnkgY29uc3VtZXIg4oCUIHRoZSBzeW50aCBzdGVwLCBlYWNoXG4gICAqIHN0YWdlIHN0ZXAsIGFuZCB0aGUgc291cmNlIHRva2VuIOKAlCByZXNvbHZlcyBge3sgcGlwZWxpbmUuKiB9fWAgYWdhaW5zdCB0aGVcbiAgICogaWRlbnRpY2FsIHNuYXBzaG90IChubyBkcmlmdCBiZXR3ZWVuIGNhbGwgc2l0ZXMpLlxuICAgKi9cbiAgZ2V0UGlwZWxpbmVTY29wZSgpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBpcGVsaW5lOiB7XG4gICAgICAgIHByb2plY3ROYW1lOiB0aGlzLnByb2plY3QsXG4gICAgICAgIHByb2plY3Q6IHRoaXMucHJvamVjdCxcbiAgICAgICAgb3JnSWQ6IHRoaXMub3JnYW5pemF0aW9uLFxuICAgICAgICBvcmdhbml6YXRpb246IHRoaXMub3JnYW5pemF0aW9uLFxuICAgICAgICBwaXBlbGluZU5hbWU6IHRoaXMucGlwZWxpbmVOYW1lLFxuICAgICAgICBtZXRhZGF0YTogdGhpcy5tZXRhZGF0YS5tZXJnZWQsXG4gICAgICAgIHZhcnM6IHRoaXMudmFycyxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgQnVpbGRlclByb3BzIHRvIGVuc3VyZSBhbGwgcmVxdWlyZWQgZmllbGRzIGFyZSBwcmVzZW50LlxuICAgKiBUaHJvd3MgYW4gZXJyb3Igd2l0aCBkZXRhaWxlZCBtZXNzYWdlcyBpZiB2YWxpZGF0aW9uIGZhaWxzLlxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZVByb3BzKHByb3BzOiBCdWlsZGVyUHJvcHMpOiB2b2lkIHtcbiAgICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG5cbiAgICBpZiAoIXByb3BzLnByb2plY3QpIHtcbiAgICAgIGVycm9ycy5wdXNoKCdCdWlsZGVyUHJvcHMucHJvamVjdCBpcyByZXF1aXJlZCcpO1xuICAgIH1cblxuICAgIGlmICghcHJvcHMub3JnYW5pemF0aW9uKSB7XG4gICAgICBlcnJvcnMucHVzaCgnQnVpbGRlclByb3BzLm9yZ2FuaXphdGlvbiBpcyByZXF1aXJlZCcpO1xuICAgIH1cblxuICAgIGlmICghcHJvcHMuc3ludGg/LnNvdXJjZSkge1xuICAgICAgZXJyb3JzLnB1c2goJ0J1aWxkZXJQcm9wcy5zeW50aC5zb3VyY2UgaXMgcmVxdWlyZWQnKTtcbiAgICB9XG5cbiAgICBpZiAoIXByb3BzLnN5bnRoPy5wbHVnaW4pIHtcbiAgICAgIGVycm9ycy5wdXNoKCdCdWlsZGVyUHJvcHMuc3ludGgucGx1Z2luIGlzIHJlcXVpcmVkJyk7XG4gICAgfSBlbHNlIGlmICghcHJvcHMuc3ludGgucGx1Z2luLm5hbWU/LnRyaW0oKSkge1xuICAgICAgZXJyb3JzLnB1c2goJ0J1aWxkZXJQcm9wcy5zeW50aC5wbHVnaW4ubmFtZSBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZycpO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIHJlcG8gZm9ybWF0IGZvciBHaXRIdWIgYW5kIENvZGVTdGFyIHNvdXJjZXMgKGJvdGggdXNlIFwib3duZXIvcmVwb1wiKVxuICAgIGNvbnN0IHNvdXJjZVR5cGUgPSBwcm9wcy5zeW50aD8uc291cmNlPy50eXBlO1xuICAgIGlmIChzb3VyY2VUeXBlID09PSAnZ2l0aHViJyB8fCBzb3VyY2VUeXBlID09PSAnY29kZXN0YXInKSB7XG4gICAgICBjb25zdCByZXBvID0gcHJvcHMuc3ludGg/LnNvdXJjZT8ub3B0aW9ucz8ucmVwbztcbiAgICAgIGlmIChyZXBvICYmICFyZXBvLmluY2x1ZGVzKCcvJykpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goYEludmFsaWQgJHtzb3VyY2VUeXBlfSByZXBvc2l0b3J5IGZvcm1hdDogXCIke3JlcG99XCIuIEV4cGVjdGVkIGZvcm1hdDogXCJvd25lci9yZXBvXCJgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBwaXBlbGluZSBuYW1lIGxlbmd0aCAoQVdTIG1heCAxMDAgY2hhcmFjdGVycylcbiAgICBjb25zdCBNQVhfUElQRUxJTkVfTkFNRV9MRU5HVEggPSBDb3JlQ29uc3RhbnRzLlBJUEVMSU5FX05BTUVfTUFYX0xFTkdUSDtcbiAgICBjb25zdCBwaXBlbGluZU5hbWUgPSBwcm9wcy5waXBlbGluZU5hbWVcbiAgICAgID8/IGAke3JlcGxhY2VOb25BbHBoYW51bWVyaWMocHJvcHMub3JnYW5pemF0aW9uID8/ICcnLCAnXycpLnRvTG93ZXJDYXNlKCl9LSR7cmVwbGFjZU5vbkFscGhhbnVtZXJpYyhwcm9wcy5wcm9qZWN0ID8/ICcnLCAnXycpLnRvTG93ZXJDYXNlKCl9LXBpcGVsaW5lYDtcbiAgICBpZiAocGlwZWxpbmVOYW1lLmxlbmd0aCA+IE1BWF9QSVBFTElORV9OQU1FX0xFTkdUSCkge1xuICAgICAgZXJyb3JzLnB1c2goYFBpcGVsaW5lIG5hbWUgXCIke3BpcGVsaW5lTmFtZX1cIiBleGNlZWRzIEFXUyBtYXhpbXVtIG9mICR7TUFYX1BJUEVMSU5FX05BTUVfTEVOR1RIfSBjaGFyYWN0ZXJzICgke3BpcGVsaW5lTmFtZS5sZW5ndGh9KWApO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIHN0YWdlc1xuICAgIGlmIChwcm9wcy5zdGFnZXMpIHtcbiAgICAgIGNvbnN0IHN0YWdlTmFtZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgIGZvciAoY29uc3Qgc3RhZ2Ugb2YgcHJvcHMuc3RhZ2VzKSB7XG4gICAgICAgIGlmICghc3RhZ2Uuc3RhZ2VOYW1lPy50cmltKCkpIHtcbiAgICAgICAgICBlcnJvcnMucHVzaCgnRWFjaCBzdGFnZSBtdXN0IGhhdmUgYSBub24tZW1wdHkgc3RhZ2VOYW1lJyk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhZ2VOYW1lcy5oYXMoc3RhZ2Uuc3RhZ2VOYW1lKSkge1xuICAgICAgICAgIGVycm9ycy5wdXNoKGBEdXBsaWNhdGUgc3RhZ2UgbmFtZTogXCIke3N0YWdlLnN0YWdlTmFtZX1cImApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0YWdlTmFtZXMuYWRkKHN0YWdlLnN0YWdlTmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzdGFnZS5zdGVwcz8ubGVuZ3RoKSB7XG4gICAgICAgICAgZXJyb3JzLnB1c2goYFN0YWdlIFwiJHtzdGFnZS5zdGFnZU5hbWUgPz8gJyh1bm5hbWVkKSd9XCIgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBzdGVwYCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ1BpcGVsaW5lIGNvbmZpZ3VyYXRpb24gdmFsaWRhdGlvbiBmYWlsZWQ6XFxuJyArXG4gICAgICAgIGVycm9ycy5tYXAoZSA9PiBgICAtICR7ZX1gKS5qb2luKCdcXG4nKSxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEV4dHJhY3RzIFMzIHNvdXJjZSBvcHRpb25zIHdpdGggZGVmYXVsdHMgYXBwbGllZC5cbiAgICpcbiAgICogQHJldHVybnMgUzMgb3B0aW9ucyB3aXRoIGBvYmplY3RLZXlgIGRlZmF1bHRpbmcgdG8gYCdzb3VyY2UuemlwJ2AgYW5kIGB0cmlnZ2VyYCBkZWZhdWx0aW5nIHRvIGBOT05FYFxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIGNvbmZpZ3VyZWQgc291cmNlIHR5cGUgaXMgbm90IGBzM2BcbiAgICovXG4gIGdldFMzT3B0aW9ucygpOiBSZXF1aXJlZDxQaWNrPFMzT3B0aW9ucywgJ2J1Y2tldE5hbWUnIHwgJ29iamVjdEtleScgfCAndHJpZ2dlcic+PiAmIE9taXQ8UzNPcHRpb25zLCAnYnVja2V0TmFtZScgfCAnb2JqZWN0S2V5JyB8ICd0cmlnZ2VyJz4ge1xuICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMuc291cmNlO1xuICAgIGlmIChzb3VyY2UudHlwZSAhPT0gJ3MzJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdTb3VyY2UgdHlwZSBpcyBub3QgUzMnKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uc291cmNlLm9wdGlvbnMsXG4gICAgICBvYmplY3RLZXk6IHNvdXJjZS5vcHRpb25zLm9iamVjdEtleSA/PyAnc291cmNlLnppcCcsXG4gICAgICB0cmlnZ2VyOiBzb3VyY2Uub3B0aW9ucy50cmlnZ2VyID8/IFRyaWdnZXJUeXBlLk5PTkUsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHRyYWN0cyBHaXRIdWIgc291cmNlIG9wdGlvbnMgd2l0aCBkZWZhdWx0cyBhcHBsaWVkLlxuICAgKlxuICAgKiBAcmV0dXJucyBHaXRIdWIgb3B0aW9ucyB3aXRoIGBicmFuY2hgIGRlZmF1bHRpbmcgdG8gYCdtYWluJ2AgYW5kIGB0cmlnZ2VyYCBkZWZhdWx0aW5nIHRvIGBOT05FYFxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIGNvbmZpZ3VyZWQgc291cmNlIHR5cGUgaXMgbm90IGBnaXRodWJgXG4gICAqL1xuICBnZXRHaXRIdWJPcHRpb25zKCk6IFJlcXVpcmVkPFBpY2s8R2l0SHViT3B0aW9ucywgJ3JlcG8nIHwgJ2JyYW5jaCcgfCAndHJpZ2dlcic+PiAmIE9taXQ8R2l0SHViT3B0aW9ucywgJ3JlcG8nIHwgJ2JyYW5jaCcgfCAndHJpZ2dlcic+IHtcbiAgICBjb25zdCBzb3VyY2UgPSB0aGlzLnNvdXJjZTtcbiAgICBpZiAoc291cmNlLnR5cGUgIT09ICdnaXRodWInKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NvdXJjZSB0eXBlIGlzIG5vdCBHaXRIdWInKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uc291cmNlLm9wdGlvbnMsXG4gICAgICBicmFuY2g6IHNvdXJjZS5vcHRpb25zLmJyYW5jaCA/PyAnbWFpbicsXG4gICAgICB0cmlnZ2VyOiBzb3VyY2Uub3B0aW9ucy50cmlnZ2VyID8/IFRyaWdnZXJUeXBlLk5PTkUsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHRyYWN0cyBDb2RlU3RhciBzb3VyY2Ugb3B0aW9ucyB3aXRoIGRlZmF1bHRzIGFwcGxpZWQuXG4gICAqXG4gICAqIEByZXR1cm5zIENvZGVTdGFyIG9wdGlvbnMgd2l0aCBgYnJhbmNoYCBkZWZhdWx0aW5nIHRvIGAnbWFpbidgLCBgdHJpZ2dlcmAgZGVmYXVsdGluZyB0byBgTk9ORWAsIGFuZCBgY29kZUJ1aWxkQ2xvbmVPdXRwdXRgIGRlZmF1bHRpbmcgdG8gYGZhbHNlYFxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIGNvbmZpZ3VyZWQgc291cmNlIHR5cGUgaXMgbm90IGBjb2Rlc3RhcmBcbiAgICovXG4gIGdldENvZGVTdGFyT3B0aW9ucygpOiBSZXF1aXJlZDxQaWNrPENvZGVTdGFyT3B0aW9ucywgJ3JlcG8nIHwgJ2JyYW5jaCcgfCAndHJpZ2dlcicgfCAnY29kZUJ1aWxkQ2xvbmVPdXRwdXQnIHwgJ2Nvbm5lY3Rpb25Bcm4nPj4ge1xuICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMuc291cmNlO1xuICAgIGlmIChzb3VyY2UudHlwZSAhPT0gJ2NvZGVzdGFyJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdTb3VyY2UgdHlwZSBpcyBub3QgQ29kZVN0YXInKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uc291cmNlLm9wdGlvbnMsXG4gICAgICBicmFuY2g6IHNvdXJjZS5vcHRpb25zLmJyYW5jaCA/PyAnbWFpbicsXG4gICAgICB0cmlnZ2VyOiBzb3VyY2Uub3B0aW9ucy50cmlnZ2VyID8/IFRyaWdnZXJUeXBlLk5PTkUsXG4gICAgICBjb2RlQnVpbGRDbG9uZU91dHB1dDogc291cmNlLm9wdGlvbnMuY29kZUJ1aWxkQ2xvbmVPdXRwdXQgPz8gZmFsc2UsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHRyYWN0cyBDb2RlQ29tbWl0IHNvdXJjZSBvcHRpb25zIHdpdGggZGVmYXVsdHMgYXBwbGllZC5cbiAgICpcbiAgICogQHJldHVybnMgQ29kZUNvbW1pdCBvcHRpb25zIHdpdGggYGJyYW5jaGAgZGVmYXVsdGluZyB0byBgJ21haW4nYCBhbmQgYHRyaWdnZXJgIGRlZmF1bHRpbmcgdG8gYE5PTkVgXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgY29uZmlndXJlZCBzb3VyY2UgdHlwZSBpcyBub3QgYGNvZGVjb21taXRgXG4gICAqL1xuICBnZXRDb2RlQ29tbWl0T3B0aW9ucygpOiBSZXF1aXJlZDxQaWNrPENvZGVDb21taXRPcHRpb25zLCAncmVwb3NpdG9yeU5hbWUnIHwgJ2JyYW5jaCcgfCAndHJpZ2dlcic+PiB7XG4gICAgY29uc3Qgc291cmNlID0gdGhpcy5zb3VyY2U7XG4gICAgaWYgKHNvdXJjZS50eXBlICE9PSAnY29kZWNvbW1pdCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignU291cmNlIHR5cGUgaXMgbm90IENvZGVDb21taXQnKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uc291cmNlLm9wdGlvbnMsXG4gICAgICBicmFuY2g6IHNvdXJjZS5vcHRpb25zLmJyYW5jaCA/PyAnbWFpbicsXG4gICAgICB0cmlnZ2VyOiBzb3VyY2Uub3B0aW9ucy50cmlnZ2VyID8/IFRyaWdnZXJUeXBlLk5PTkUsXG4gICAgfTtcbiAgfVxufVxuIl19
|
|
@@ -91,7 +91,6 @@ export declare class PluginLookup extends Construct {
|
|
|
91
91
|
* Access control (orgId scoping, public/private visibility) is handled by
|
|
92
92
|
* the platform's access control query builder based on the JWT's organizationId.
|
|
93
93
|
*/
|
|
94
|
-
private defaultFilter;
|
|
95
94
|
private normalize;
|
|
96
95
|
/**
|
|
97
96
|
* Creates a CustomResource instance that triggers plugin lookup during deployment
|