@aws-cdk/aws-bedrock-agentcore-alpha 2.221.0-alpha.0

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.
Files changed (43) hide show
  1. package/.eslintrc.js +4 -0
  2. package/.jsii +12000 -0
  3. package/.jsii.tabl.json.gz +0 -0
  4. package/.warnings.jsii.js +183 -0
  5. package/LICENSE +201 -0
  6. package/NOTICE +2 -0
  7. package/README.md +796 -0
  8. package/agentcore/index.d.ts +11 -0
  9. package/agentcore/index.js +36 -0
  10. package/agentcore/network/network-configuration.d.ts +152 -0
  11. package/agentcore/network/network-configuration.js +234 -0
  12. package/agentcore/runtime/perms.d.ts +67 -0
  13. package/agentcore/runtime/perms.js +101 -0
  14. package/agentcore/runtime/runtime-artifact.d.ts +42 -0
  15. package/agentcore/runtime/runtime-artifact.js +90 -0
  16. package/agentcore/runtime/runtime-authorizer-configuration.d.ts +62 -0
  17. package/agentcore/runtime/runtime-authorizer-configuration.js +165 -0
  18. package/agentcore/runtime/runtime-base.d.ts +309 -0
  19. package/agentcore/runtime/runtime-base.js +207 -0
  20. package/agentcore/runtime/runtime-endpoint-base.d.ts +130 -0
  21. package/agentcore/runtime/runtime-endpoint-base.js +31 -0
  22. package/agentcore/runtime/runtime-endpoint.d.ts +182 -0
  23. package/agentcore/runtime/runtime-endpoint.js +372 -0
  24. package/agentcore/runtime/runtime.d.ts +230 -0
  25. package/agentcore/runtime/runtime.js +590 -0
  26. package/agentcore/runtime/types.d.ts +16 -0
  27. package/agentcore/runtime/types.js +21 -0
  28. package/agentcore/runtime/validation-helpers.d.ts +37 -0
  29. package/agentcore/runtime/validation-helpers.js +85 -0
  30. package/agentcore/tools/browser.d.ts +519 -0
  31. package/agentcore/tools/browser.js +641 -0
  32. package/agentcore/tools/code-interpreter.d.ts +447 -0
  33. package/agentcore/tools/code-interpreter.js +553 -0
  34. package/agentcore/tools/perms.d.ts +74 -0
  35. package/agentcore/tools/perms.js +122 -0
  36. package/agentcore/tools/validation-helpers.d.ts +37 -0
  37. package/agentcore/tools/validation-helpers.js +85 -0
  38. package/jest.config.js +2 -0
  39. package/lib/index.d.ts +1 -0
  40. package/lib/index.js +22 -0
  41. package/package.json +122 -0
  42. package/rosetta/_generated.ts-fixture +6 -0
  43. package/rosetta/default.ts-fixture +19 -0
@@ -0,0 +1,641 @@
1
+ "use strict";
2
+ var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
3
+ function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
4
+ var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
5
+ var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
6
+ var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
7
+ var _, done = false;
8
+ for (var i = decorators.length - 1; i >= 0; i--) {
9
+ var context = {};
10
+ for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
11
+ for (var p in contextIn.access) context.access[p] = contextIn.access[p];
12
+ context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
13
+ var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
14
+ if (kind === "accessor") {
15
+ if (result === void 0) continue;
16
+ if (result === null || typeof result !== "object") throw new TypeError("Object expected");
17
+ if (_ = accept(result.get)) descriptor.get = _;
18
+ if (_ = accept(result.set)) descriptor.set = _;
19
+ if (_ = accept(result.init)) initializers.unshift(_);
20
+ }
21
+ else if (_ = accept(result)) {
22
+ if (kind === "field") initializers.unshift(_);
23
+ else descriptor[key] = _;
24
+ }
25
+ }
26
+ if (target) Object.defineProperty(target, contextIn.name, descriptor);
27
+ done = true;
28
+ };
29
+ var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
30
+ var useValue = arguments.length > 2;
31
+ for (var i = 0; i < initializers.length; i++) {
32
+ value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
33
+ }
34
+ return useValue ? value : void 0;
35
+ };
36
+ Object.defineProperty(exports, "__esModule", { value: true });
37
+ exports.BrowserCustom = exports.BrowserCustomBase = void 0;
38
+ const jsiiDeprecationWarnings = require("../../.warnings.jsii.js");
39
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
40
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
41
+ const aws_cloudwatch_1 = require("aws-cdk-lib/aws-cloudwatch");
42
+ const iam = require("aws-cdk-lib/aws-iam");
43
+ const s3 = require("aws-cdk-lib/aws-s3");
44
+ const ec2 = require("aws-cdk-lib/aws-ec2");
45
+ const agent_core = require("aws-cdk-lib/aws-bedrockagentcore");
46
+ const metadata_resource_1 = require("aws-cdk-lib/core/lib/metadata-resource");
47
+ const prop_injectable_1 = require("aws-cdk-lib/core/lib/prop-injectable");
48
+ // Internal Libs
49
+ const perms = require("./perms");
50
+ const validation_helpers_1 = require("./validation-helpers");
51
+ const network_configuration_1 = require("../network/network-configuration");
52
+ /******************************************************************************
53
+ * CONSTANTS
54
+ *****************************************************************************/
55
+ /**
56
+ * Minimum length for browser name
57
+ * @internal
58
+ */
59
+ const BROWSER_NAME_MIN_LENGTH = 1;
60
+ /**
61
+ * Maximum length for browser name
62
+ * @internal
63
+ */
64
+ const BROWSER_NAME_MAX_LENGTH = 48;
65
+ /**
66
+ * Minimum length for browser tags
67
+ * @internal
68
+ */
69
+ const BROWSER_TAG_MIN_LENGTH = 1;
70
+ /**
71
+ * Maximum length for browser tags
72
+ * @internal
73
+ */
74
+ const BROWSER_TAG_MAX_LENGTH = 256;
75
+ /******************************************************************************
76
+ * ABSTRACT BASE CLASS
77
+ *****************************************************************************/
78
+ /**
79
+ * Abstract base class for a Browser.
80
+ * Contains methods and attributes valid for Browsers either created with CDK or imported.
81
+ */
82
+ class BrowserCustomBase extends aws_cdk_lib_1.Resource {
83
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-bedrock-agentcore-alpha.BrowserCustomBase", version: "2.221.0-alpha.0" };
84
+ /**
85
+ * An accessor for the Connections object that will fail if this Browser does not have a VPC
86
+ * configured.
87
+ */
88
+ get connections() {
89
+ if (!this._connections) {
90
+ throw new Error('Cannot manage network access without configuring a VPC');
91
+ }
92
+ return this._connections;
93
+ }
94
+ /**
95
+ * The actual Connections object for this Browser. This may be unset in the event that a VPC has not
96
+ * been configured.
97
+ * @internal
98
+ */
99
+ _connections;
100
+ constructor(scope, id) {
101
+ super(scope, id);
102
+ }
103
+ /**
104
+ * Grants IAM actions to the IAM Principal
105
+ * @param grantee - The IAM principal to grant permissions to
106
+ * @param actions - The actions to grant
107
+ * @returns An IAM Grant object representing the granted permissions
108
+ */
109
+ grant(grantee, ...actions) {
110
+ return iam.Grant.addToPrincipal({
111
+ grantee: grantee,
112
+ resourceArns: [this.browserArn],
113
+ actions: actions,
114
+ });
115
+ }
116
+ /**
117
+ * Grant read permissions on this browser to an IAM principal.
118
+ * This includes both read permissions on the specific browser and list permissions on all browsers.
119
+ *
120
+ * @param grantee - The IAM principal to grant read permissions to
121
+ * @default - Default grant configuration:
122
+ * - actions: ['bedrock-agentcore:GetBrowser', 'bedrock-agentcore:GetBrowserSession'] on this.browserArn
123
+ * - actions: ['bedrock-agentcore:ListBrowsers', 'bedrock-agentcore:ListBrowserSessions'] on all resources (*)
124
+ * @returns An IAM Grant object representing the granted permissions
125
+ */
126
+ grantRead(grantee) {
127
+ const resourceSpecificGrant = this.grant(grantee, ...perms.BROWSER_READ_PERMS);
128
+ const allResourceGrant = iam.Grant.addToPrincipal({
129
+ grantee: grantee,
130
+ resourceArns: ['*'],
131
+ actions: perms.BROWSER_LIST_PERMS,
132
+ });
133
+ // Return combined grant
134
+ return resourceSpecificGrant.combine(allResourceGrant);
135
+ }
136
+ /**
137
+ * Grant invoke permissions on this browser to an IAM principal.
138
+ *
139
+ * @param grantee - The IAM principal to grant invoke permissions to
140
+ * @default - Default grant configuration:
141
+ * - actions: ['bedrock-agentcore:StartBrowserSession', 'bedrock-agentcore:UpdateBrowserStream', 'bedrock-agentcore:StopBrowserSession']
142
+ * - resourceArns: [this.browserArn]
143
+ * @returns An IAM Grant object representing the granted permissions
144
+ */
145
+ grantUse(grantee) {
146
+ return this.grant(grantee, ...perms.BROWSER_USE_PERMS);
147
+ }
148
+ // ------------------------------------------------------
149
+ // Metrics
150
+ // ------------------------------------------------------
151
+ /**
152
+ * Return the given named metric for this browser.
153
+ *
154
+ * By default, the metric will be calculated as a sum over a period of 5 minutes.
155
+ * You can customize this by using the `statistic` and `period` properties.
156
+ */
157
+ metric(metricName, dimensions, props) {
158
+ const metricProps = {
159
+ namespace: 'AWS/Bedrock-AgentCore',
160
+ metricName,
161
+ dimensionsMap: { ...dimensions, Resource: this.browserArn },
162
+ ...props,
163
+ };
164
+ return this.configureMetric(metricProps);
165
+ }
166
+ /**
167
+ * Creates a CloudWatch metric for tracking browser api operations..
168
+ *
169
+ * @param props - Configuration options for the metric
170
+ * @default - Default metric configuration:
171
+ * - namespace: 'AWS/Bedrock-AgentCore'
172
+ * - metricName: metricName
173
+ * - dimensionsMap: { BrowserId: this.browserId }
174
+ * @returns A CloudWatch Metric configured for browser api operations
175
+ */
176
+ metricForApiOperation(metricName, operation, props) {
177
+ return this.metric(metricName, { Operation: operation }, props);
178
+ }
179
+ /**
180
+ * Creates a CloudWatch metric for tracking browser latencies.
181
+ *
182
+ * @param props - Configuration options for the metric
183
+ * @default - Default metric configuration:
184
+ * - namespace: 'AWS/Bedrock-AgentCore'
185
+ * - metricName: Latency
186
+ * @returns A CloudWatch Metric configured for browser latencies
187
+ */
188
+ metricLatencyForApiOperation(operation, props) {
189
+ return this.metricForApiOperation('Latency', operation, { statistic: aws_cloudwatch_1.Stats.AVERAGE, ...props });
190
+ }
191
+ /**
192
+ * Creates a CloudWatch metric for tracking browser invocations.
193
+ *
194
+ * @param props - Configuration options for the metric
195
+ * @default - Default metric configuration:
196
+ * - namespace: 'AWS/Bedrock-AgentCore'
197
+ * - metricName: Invocations
198
+ * @returns A CloudWatch Metric configured for browser latencies
199
+ */
200
+ metricInvocationsForApiOperation(operation, props) {
201
+ return this.metricForApiOperation('Invocations', operation, {
202
+ statistic: aws_cloudwatch_1.Stats.SUM,
203
+ ...props,
204
+ });
205
+ }
206
+ /**
207
+ * Creates a CloudWatch metric for tracking browser errors.
208
+ *
209
+ * @param props - Configuration options for the metric
210
+ * @default - Default metric configuration:
211
+ * - namespace: 'AWS/Bedrock-AgentCore'
212
+ * - metricName: Errors
213
+ * @returns A CloudWatch Metric configured for browser errors
214
+ */
215
+ metricErrorsForApiOperation(operation, props) {
216
+ return this.metricForApiOperation('Errors', operation, { statistic: aws_cloudwatch_1.Stats.SUM, ...props });
217
+ }
218
+ /**
219
+ * Creates a CloudWatch metric for tracking browser throttles.
220
+ *
221
+ * @param props - Configuration options for the metric
222
+ * @default - Default metric configuration:
223
+ * - namespace: 'AWS/Bedrock-AgentCore'
224
+ * - metricName: Throttles
225
+ * @returns A CloudWatch Metric configured for browser throttles
226
+ */
227
+ metricThrottlesForApiOperation(operation, props) {
228
+ return this.metricForApiOperation('Throttles', operation, { statistic: aws_cloudwatch_1.Stats.SUM, ...props });
229
+ }
230
+ /**
231
+ * Creates a CloudWatch metric for tracking browser system errors.
232
+ *
233
+ * @param props - Configuration options for the metric
234
+ * @default - Default metric configuration:
235
+ * - namespace: 'AWS/Bedrock-AgentCore'
236
+ * - metricName: SystemErrors
237
+ * @returns A CloudWatch Metric configured for browser system errors
238
+ */
239
+ metricSystemErrorsForApiOperation(operation, props) {
240
+ return this.metricForApiOperation('SystemErrors', operation, { statistic: aws_cloudwatch_1.Stats.SUM, ...props });
241
+ }
242
+ /**
243
+ * Creates a CloudWatch metric for tracking browser user errors.
244
+ *
245
+ * @param props - Configuration options for the metric
246
+ * @default - Default metric configuration:
247
+ * - namespace: 'AWS/Bedrock-AgentCore'
248
+ * - metricName: UserErrors
249
+ * @returns A CloudWatch Metric configured for browser user errors
250
+ */
251
+ metricUserErrorsForApiOperation(operation, props) {
252
+ return this.metricForApiOperation('UserErrors', operation, { statistic: aws_cloudwatch_1.Stats.SUM, ...props });
253
+ }
254
+ /**
255
+ * Creates a CloudWatch metric for tracking browser session duration.
256
+ *
257
+ * @param props - Configuration options for the metric
258
+ * @default - Default metric configuration:
259
+ * - namespace: 'AWS/Bedrock-AgentCore'
260
+ * - metricName: Duration
261
+ * @returns A CloudWatch Metric configured for browser session duration
262
+ */
263
+ metricSessionDuration(props) {
264
+ return this.metric('Duration', { Operation: 'BrowserSession' }, { statistic: aws_cloudwatch_1.Stats.AVERAGE, ...props });
265
+ }
266
+ /**
267
+ * Creates a CloudWatch metric for tracking browser user takeovers.
268
+ *
269
+ * @param props - Configuration options for the metric
270
+ * @default - Default metric configuration:
271
+ * - namespace: 'AWS/Bedrock-AgentCore'
272
+ * - metricName: TakeOverCount
273
+ * @returns A CloudWatch Metric configured for browser user takeovers
274
+ */
275
+ metricTakeOverCount(props) {
276
+ return this.metric('TakeOverCount', {}, { statistic: aws_cloudwatch_1.Stats.SUM, ...props });
277
+ }
278
+ /**
279
+ * Creates a CloudWatch metric for tracking browser user takeovers released.
280
+ *
281
+ * @param props - Configuration options for the metric
282
+ * @default - Default metric configuration:
283
+ * - namespace: 'AWS/Bedrock-AgentCore'
284
+ * - metricName: TakeOverReleaseCount
285
+ * @returns A CloudWatch Metric configured for browser user takeovers released
286
+ */
287
+ metricTakeOverReleaseCount(props) {
288
+ return this.metric('TakeOverReleaseCount', {}, { statistic: aws_cloudwatch_1.Stats.SUM, ...props });
289
+ }
290
+ /**
291
+ * Creates a CloudWatch metric for tracking browser user takeovers duration.
292
+ *
293
+ * @param props - Configuration options for the metric
294
+ * @default - Default metric configuration:
295
+ * - namespace: 'AWS/Bedrock-AgentCore'
296
+ * - metricName: TakeOverDuration
297
+ * @returns A CloudWatch Metric configured for browser user takeovers duration
298
+ */
299
+ metricTakeOverDuration(props) {
300
+ return this.metric('TakeOverDuration', {}, { statistic: aws_cloudwatch_1.Stats.AVERAGE, ...props });
301
+ }
302
+ /**
303
+ * Internal method to create a metric.
304
+ *
305
+ * @param props - Configuration options for the metric
306
+ * @returns A CloudWatch Metric configured for browser api operations
307
+ */
308
+ configureMetric(props) {
309
+ return new aws_cloudwatch_1.Metric({
310
+ ...props,
311
+ region: props?.region ?? this.stack.region,
312
+ account: props?.account ?? this.stack.account,
313
+ });
314
+ }
315
+ }
316
+ exports.BrowserCustomBase = BrowserCustomBase;
317
+ /******************************************************************************
318
+ * Class
319
+ *****************************************************************************/
320
+ /**
321
+ * Browser resource for AWS Bedrock Agent Core.
322
+ * Provides a browser environment for web automation and interaction.
323
+ *
324
+ * @see https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/browser.html
325
+ * @resource AWS::BedrockAgentCore::BrowserCustom
326
+ */
327
+ let BrowserCustom = (() => {
328
+ let _classDecorators = [prop_injectable_1.propertyInjectable];
329
+ let _classDescriptor;
330
+ let _classExtraInitializers = [];
331
+ let _classThis;
332
+ let _classSuper = BrowserCustomBase;
333
+ var BrowserCustom = class extends _classSuper {
334
+ static { _classThis = this; }
335
+ static {
336
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
337
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
338
+ BrowserCustom = _classThis = _classDescriptor.value;
339
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
340
+ }
341
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-bedrock-agentcore-alpha.BrowserCustom", version: "2.221.0-alpha.0" };
342
+ /** Uniquely identifies this class. */
343
+ static PROPERTY_INJECTION_ID = '@aws-cdk.aws-bedrock-agentcore-alpha.BrowserCustom';
344
+ /**
345
+ * Static Method for importing an existing Bedrock AgentCore Browser Custom.
346
+ */
347
+ /**
348
+ * Creates an Browser Custom reference from an existing browser's attributes.
349
+ *
350
+ * @param scope - The construct scope
351
+ * @param id - Identifier of the construct
352
+ * @param attrs - Attributes of the existing browser custom
353
+ * @returns An IBrowserCustom reference to the existing browser
354
+ */
355
+ static fromBrowserCustomAttributes(scope, id, attrs) {
356
+ try {
357
+ jsiiDeprecationWarnings._aws_cdk_aws_bedrock_agentcore_alpha_BrowserCustomAttributes(attrs);
358
+ }
359
+ catch (error) {
360
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
361
+ Error.captureStackTrace(error, this.fromBrowserCustomAttributes);
362
+ }
363
+ throw error;
364
+ }
365
+ class Import extends BrowserCustomBase {
366
+ browserArn = attrs.browserArn;
367
+ browserId = aws_cdk_lib_1.Arn.split(attrs.browserArn, aws_cdk_lib_1.ArnFormat.SLASH_RESOURCE_NAME).resourceName;
368
+ executionRole = iam.Role.fromRoleArn(scope, `${id}Role`, attrs.roleArn);
369
+ lastUpdatedAt = attrs.lastUpdatedAt;
370
+ grantPrincipal = this.executionRole;
371
+ status = attrs.status;
372
+ createdAt = attrs.createdAt;
373
+ constructor(s, i) {
374
+ super(s, i);
375
+ this.grantPrincipal = this.executionRole || new iam.UnknownPrincipal({ resource: this });
376
+ if (attrs.securityGroups) {
377
+ this._connections = new ec2.Connections({
378
+ securityGroups: attrs.securityGroups,
379
+ });
380
+ }
381
+ }
382
+ }
383
+ // Return new Browser Custom
384
+ return new Import(scope, id);
385
+ }
386
+ // ------------------------------------------------------
387
+ // Attributes
388
+ // ------------------------------------------------------
389
+ /**
390
+ * The ARN of the browser resource.
391
+ * @attribute
392
+ */
393
+ browserArn;
394
+ /**
395
+ * The id of the browser
396
+ * @attribute
397
+ */
398
+ browserId;
399
+ /**
400
+ * The name of the browser
401
+ */
402
+ name;
403
+ /**
404
+ * The description of the browser
405
+ */
406
+ description;
407
+ /**
408
+ * The last updated timestamp of the browser
409
+ * @attribute
410
+ */
411
+ lastUpdatedAt;
412
+ /**
413
+ * The status of the browser
414
+ * @attribute
415
+ */
416
+ status;
417
+ /**
418
+ * The created timestamp of the browser
419
+ * @attribute
420
+ */
421
+ createdAt;
422
+ /**
423
+ * The failure reason of the browser
424
+ * @attribute
425
+ */
426
+ failureReason;
427
+ /**
428
+ * The IAM role associated to the browser.
429
+ */
430
+ executionRole;
431
+ /**
432
+ * Tags applied to this browser resource
433
+ * A map of key-value pairs for resource tagging
434
+ * @default - No tags applied
435
+ */
436
+ tags;
437
+ /**
438
+ * The principal to grant permissions to
439
+ */
440
+ grantPrincipal;
441
+ /**
442
+ * The network configuration of the browser
443
+ */
444
+ networkConfiguration;
445
+ /**
446
+ * The recording configuration of the browser
447
+ */
448
+ recordingConfig;
449
+ // ------------------------------------------------------
450
+ // Internal Only
451
+ // ------------------------------------------------------
452
+ __resource;
453
+ // ------------------------------------------------------
454
+ // CONSTRUCTOR
455
+ // ------------------------------------------------------
456
+ constructor(scope, id, props) {
457
+ super(scope, id);
458
+ try {
459
+ jsiiDeprecationWarnings._aws_cdk_aws_bedrock_agentcore_alpha_BrowserCustomProps(props);
460
+ }
461
+ catch (error) {
462
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
463
+ Error.captureStackTrace(error, BrowserCustom);
464
+ }
465
+ throw error;
466
+ }
467
+ // Enhanced CDK Analytics Telemetry
468
+ (0, metadata_resource_1.addConstructMetadata)(this, props);
469
+ // ------------------------------------------------------
470
+ // Set properties and defaults
471
+ // ------------------------------------------------------
472
+ this.name = props.browserCustomName;
473
+ this.description = props.description;
474
+ this.networkConfiguration = props.networkConfiguration ?? network_configuration_1.BrowserNetworkConfiguration.usingPublicNetwork();
475
+ this.recordingConfig = props.recordingConfig ?? { enabled: false };
476
+ this.executionRole = props.executionRole ?? this._createBrowserRole();
477
+ this.grantPrincipal = this.executionRole;
478
+ this.tags = props.tags;
479
+ // Validate browser name
480
+ (0, validation_helpers_1.throwIfInvalid)(this._validateBrowserName, this.name);
481
+ // Validate browser tags
482
+ (0, validation_helpers_1.throwIfInvalid)(this._validateBrowserTags, this.tags);
483
+ // Validate recording configuration
484
+ (0, validation_helpers_1.throwIfInvalid)(this._validateRecordingConfig, this.recordingConfig);
485
+ // Network configuration and validation is done in the network configuration class
486
+ // So we don't need to validate it here
487
+ // Set connections - create a shared connections object
488
+ if (this.networkConfiguration.connections) {
489
+ // Use the network configuration's connections as the shared object
490
+ this._connections = this.networkConfiguration.connections;
491
+ }
492
+ // ------------------------------------------------------
493
+ // CFN Props - With Lazy support
494
+ // ------------------------------------------------------
495
+ const cfnProps = {
496
+ name: this.name,
497
+ description: this.description,
498
+ networkConfiguration: aws_cdk_lib_1.Lazy.any({ produce: () => this.networkConfiguration._render(this._connections) }),
499
+ recordingConfig: this._renderRecordingConfig(),
500
+ executionRoleArn: this.executionRole?.roleArn,
501
+ tags: this.tags,
502
+ };
503
+ // L1 instantiation
504
+ this.__resource = new agent_core.CfnBrowserCustom(this, 'Resource', cfnProps);
505
+ // Get attributes directly from the CloudFormation resource
506
+ this.browserId = this.__resource.attrBrowserId;
507
+ this.browserArn = this.__resource.attrBrowserArn;
508
+ this.status = this.__resource.attrStatus;
509
+ this.createdAt = this.__resource.attrCreatedAt;
510
+ this.lastUpdatedAt = this.__resource.attrLastUpdatedAt;
511
+ this.failureReason = this.__resource.attrFailureReason;
512
+ // if recording is configured, add permissions to the execution role
513
+ if (this.recordingConfig && this.recordingConfig.s3Location) {
514
+ if (!aws_cdk_lib_1.Token.isUnresolved(this.recordingConfig.s3Location.bucketName)) {
515
+ aws_cdk_lib_1.Stack.of(this).resolve(this.recordingConfig.s3Location.bucketName);
516
+ }
517
+ const bucket = s3.Bucket.fromBucketName(this, `${this.name}RecordingBucket`, this.recordingConfig.s3Location.bucketName);
518
+ // Ensure the policy is applied before the browser resource is created
519
+ const grant = bucket.grantReadWrite(this.executionRole);
520
+ grant.applyBefore(this.__resource);
521
+ }
522
+ }
523
+ /**
524
+ * Render the recording configuration.
525
+ *
526
+ * @returns RecordingConfigProperty object in CloudFormation format, or undefined if no recording configuration is defined
527
+ * @default - undefined if no recording configuration is provided
528
+ * @internal This is an internal core function and should not be called directly.
529
+ */
530
+ _renderRecordingConfig() {
531
+ return this.recordingConfig ? {
532
+ enabled: this.recordingConfig.enabled,
533
+ s3Location: this.recordingConfig.s3Location ? {
534
+ bucket: this.recordingConfig.s3Location.bucketName,
535
+ prefix: this.recordingConfig.s3Location.objectKey,
536
+ } : undefined,
537
+ } : undefined;
538
+ }
539
+ /**
540
+ * Creates execution role needed for the browser to access AWS services
541
+ * @returns The created role
542
+ * @internal This is an internal core function and should not be called directly.
543
+ */
544
+ _createBrowserRole() {
545
+ const role = new iam.Role(this, 'ServiceRole', {
546
+ assumedBy: new iam.ServicePrincipal('bedrock-agentcore.amazonaws.com'),
547
+ });
548
+ return role;
549
+ }
550
+ // ------------------------------------------------------
551
+ // Validators
552
+ // ------------------------------------------------------
553
+ /**
554
+ * Validates the browser name format
555
+ * @param name The browser name to validate
556
+ * @returns Array of validation error messages, empty if valid
557
+ */
558
+ _validateBrowserName = (name) => {
559
+ let errors = [];
560
+ errors.push(...(0, validation_helpers_1.validateStringFieldLength)({
561
+ value: name,
562
+ fieldName: 'Browser name',
563
+ minLength: BROWSER_NAME_MIN_LENGTH,
564
+ maxLength: BROWSER_NAME_MAX_LENGTH,
565
+ }));
566
+ // Check if name matches the AWS API pattern: [a-zA-Z][a-zA-Z0-9_]{0,47}
567
+ // Must start with a letter, followed by up to 47 letters, numbers, or underscores
568
+ const validNamePattern = /^[a-zA-Z][a-zA-Z0-9_]{0,47}$/;
569
+ errors.push(...(0, validation_helpers_1.validateFieldPattern)(name, 'Browser name', validNamePattern));
570
+ return errors;
571
+ };
572
+ /**
573
+ * Validates the browser tags format
574
+ * @param tags The tags object to validate
575
+ * @returns Array of validation error messages, empty if valid
576
+ */
577
+ _validateBrowserTags = (tags) => {
578
+ let errors = [];
579
+ if (!tags) {
580
+ return errors; // Tags are optional
581
+ }
582
+ // Validate each tag key and value
583
+ for (const [key, value] of Object.entries(tags)) {
584
+ errors.push(...(0, validation_helpers_1.validateStringFieldLength)({
585
+ value: key,
586
+ fieldName: 'Tag key',
587
+ minLength: BROWSER_TAG_MIN_LENGTH,
588
+ maxLength: BROWSER_TAG_MAX_LENGTH,
589
+ }));
590
+ // Validate tag key pattern: ^[a-zA-Z0-9\s._:/=+@-]*$
591
+ const validKeyPattern = /^[a-zA-Z0-9\s._:/=+@-]*$/;
592
+ errors.push(...(0, validation_helpers_1.validateFieldPattern)(key, 'Tag key', validKeyPattern));
593
+ // Validate tag value
594
+ errors.push(...(0, validation_helpers_1.validateStringFieldLength)({
595
+ value: value,
596
+ fieldName: 'Tag value',
597
+ minLength: BROWSER_TAG_MIN_LENGTH,
598
+ maxLength: BROWSER_TAG_MAX_LENGTH,
599
+ }));
600
+ // Validate tag value pattern: ^[a-zA-Z0-9\s._:/=+@-]*$
601
+ const validValuePattern = /^[a-zA-Z0-9\s._:/=+@-]*$/;
602
+ errors.push(...(0, validation_helpers_1.validateFieldPattern)(value, 'Tag value', validValuePattern));
603
+ }
604
+ return errors;
605
+ };
606
+ /**
607
+ * Validates the recording configuration
608
+ * @param recordingConfig The recording configuration to validate
609
+ * @returns Array of validation error messages, empty if valid
610
+ */
611
+ _validateRecordingConfig = (recordingConfig) => {
612
+ let errors = [];
613
+ if (!recordingConfig) {
614
+ return errors; // No validation needed if no recording config is provided
615
+ }
616
+ const s3Location = recordingConfig.s3Location;
617
+ // Only validate S3 location if it's actually provided
618
+ if (s3Location) {
619
+ // Both bucket name and object key are required when S3 location is provided
620
+ if (!s3Location.bucketName) {
621
+ errors.push('S3 bucket name is required when S3 location is provided for recording configuration');
622
+ }
623
+ else {
624
+ // Validate bucket name pattern: ^[a-z0-9][a-z0-9.-]{1,61}[a-z0-9]$
625
+ const bucketNamePattern = /^[a-z0-9][a-z0-9.-]{1,61}[a-z0-9]$/;
626
+ errors.push(...(0, validation_helpers_1.validateFieldPattern)(s3Location.bucketName, 'S3 bucket name', bucketNamePattern));
627
+ }
628
+ if (!s3Location.objectKey) {
629
+ errors.push('S3 object key (prefix) is required when S3 location is provided for recording configuration');
630
+ }
631
+ }
632
+ return errors;
633
+ };
634
+ static {
635
+ __runInitializers(_classThis, _classExtraInitializers);
636
+ }
637
+ };
638
+ return BrowserCustom = _classThis;
639
+ })();
640
+ exports.BrowserCustom = BrowserCustom;
641
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJvd3Nlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImJyb3dzZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsNkNBUXFCO0FBQ3JCLCtEQU1vQztBQUNwQywyQ0FBMkM7QUFDM0MseUNBQXlDO0FBQ3pDLDJDQUEyQztBQUMzQywrREFBK0Q7QUFHL0QsOEVBQThFO0FBQzlFLDBFQUEwRTtBQUMxRSxnQkFBZ0I7QUFDaEIsaUNBQWlDO0FBQ2pDLDZEQUF1RztBQUN2Ryw0RUFBK0U7QUFFL0U7OytFQUUrRTtBQUMvRTs7O0dBR0c7QUFDSCxNQUFNLHVCQUF1QixHQUFHLENBQUMsQ0FBQztBQUVsQzs7O0dBR0c7QUFDSCxNQUFNLHVCQUF1QixHQUFHLEVBQUUsQ0FBQztBQUVuQzs7O0dBR0c7QUFDSCxNQUFNLHNCQUFzQixHQUFHLENBQUMsQ0FBQztBQUVqQzs7O0dBR0c7QUFDSCxNQUFNLHNCQUFzQixHQUFHLEdBQUcsQ0FBQztBQXlIbkM7OytFQUUrRTtBQUMvRTs7O0dBR0c7QUFDSCxNQUFzQixpQkFBa0IsU0FBUSxzQkFBUTs7SUFXdEQ7OztPQUdHO0lBQ0gsSUFBVyxXQUFXO1FBQ3BCLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDdkIsTUFBTSxJQUFJLEtBQUssQ0FBQyx3REFBd0QsQ0FBQyxDQUFDO1FBQzVFLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUM7S0FDMUI7SUFDRDs7OztPQUlHO0lBQ08sWUFBWSxDQUE4QjtJQUVwRCxZQUFZLEtBQWdCLEVBQUUsRUFBVTtRQUN0QyxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0tBQ2xCO0lBRUQ7Ozs7O09BS0c7SUFDSSxLQUFLLENBQUMsT0FBdUIsRUFBRSxHQUFHLE9BQWlCO1FBQ3hELE9BQU8sR0FBRyxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUM7WUFD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VUFBVSxHQUFHLGVBQWUsQ0FBQyxVQUFVLENBQUM7WUFFOUMsc0RBQXNEO1lBQ3RELElBQUksVUFBVSxFQUFFLENBQUM7Z0JBQ2YsNEVBQTRFO2dCQUM1RSxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxDQUFDO29CQUMzQixNQUFNLENBQUMsSUFBSSxDQUFDLHFGQUFxRixDQUFDLENBQUM7Z0JBQ3JHLENBQUM7cUJBQU0sQ0FBQztvQkFDTixtRUFBbUU7b0JBQ25FLE1BQU0saUJBQWlCLEdBQUcsb0NBQW9DLENBQUM7b0JBQy9ELE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFBLHlDQUFvQixFQUFDLFVBQVUsQ0FBQyxVQUFVLEVBQUUsZ0JBQWdCLEVBQUUsaUJBQWlCLENBQUMsQ0FBQyxDQUFDO2dCQUNuRyxDQUFDO2dCQUVELElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUFFLENBQUM7b0JBQzFCLE1BQU0sQ0FBQyxJQUFJLENBQUMsNkZBQTZGLENBQUMsQ0FBQztnQkFDN0csQ0FBQztZQUNILENBQUM7WUFFRCxPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDLENBQUM7O1lBdlRTLHVEQUFhOzs7OztBQUFiLHNDQUFhIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQXJuLFxuICBBcm5Gb3JtYXQsXG4gIElSZXNvdXJjZSxcbiAgTGF6eSxcbiAgUmVzb3VyY2UsXG4gIFRva2VuLFxuICBTdGFjayxcbn0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHtcbiAgRGltZW5zaW9uc01hcCxcbiAgTWV0cmljLFxuICBNZXRyaWNPcHRpb25zLFxuICBNZXRyaWNQcm9wcyxcbiAgU3RhdHMsXG59IGZyb20gJ2F3cy1jZGstbGliL2F3cy1jbG91ZHdhdGNoJztcbmltcG9ydCAqIGFzIGlhbSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcbmltcG9ydCAqIGFzIHMzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1zMyc7XG5pbXBvcnQgKiBhcyBlYzIgZnJvbSAnYXdzLWNkay1saWIvYXdzLWVjMic7XG5pbXBvcnQgKiBhcyBhZ2VudF9jb3JlIGZyb20gJ2F3cy1jZGstbGliL2F3cy1iZWRyb2NrYWdlbnRjb3JlJztcbmltcG9ydCB7IExvY2F0aW9uIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXMzJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgYWRkQ29uc3RydWN0TWV0YWRhdGEgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlL2xpYi9tZXRhZGF0YS1yZXNvdXJjZSc7XG5pbXBvcnQgeyBwcm9wZXJ0eUluamVjdGFibGUgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlL2xpYi9wcm9wLWluamVjdGFibGUnO1xuLy8gSW50ZXJuYWwgTGlic1xuaW1wb3J0ICogYXMgcGVybXMgZnJvbSAnLi9wZXJtcyc7XG5pbXBvcnQgeyB2YWxpZGF0ZUZpZWxkUGF0dGVybiwgdmFsaWRhdGVTdHJpbmdGaWVsZExlbmd0aCwgdGhyb3dJZkludmFsaWQgfSBmcm9tICcuL3ZhbGlkYXRpb24taGVscGVycyc7XG5pbXBvcnQgeyBCcm93c2VyTmV0d29ya0NvbmZpZ3VyYXRpb24gfSBmcm9tICcuLi9uZXR3b3JrL25ldHdvcmstY29uZmlndXJhdGlvbic7XG5cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OU1RBTlRTXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKipcbiAqIE1pbmltdW0gbGVuZ3RoIGZvciBicm93c2VyIG5hbWVcbiAqIEBpbnRlcm5hbFxuICovXG5jb25zdCBCUk9XU0VSX05BTUVfTUlOX0xFTkdUSCA9IDE7XG5cbi8qKlxuICogTWF4aW11bSBsZW5ndGggZm9yIGJyb3dzZXIgbmFtZVxuICogQGludGVybmFsXG4gKi9cbmNvbnN0IEJST1dTRVJfTkFNRV9NQVhfTEVOR1RIID0gNDg7XG5cbi8qKlxuICogTWluaW11bSBsZW5ndGggZm9yIGJyb3dzZXIgdGFnc1xuICogQGludGVybmFsXG4gKi9cbmNvbnN0IEJST1dTRVJfVEFHX01JTl9MRU5HVEggPSAxO1xuXG4vKipcbiAqIE1heGltdW0gbGVuZ3RoIGZvciBicm93c2VyIHRhZ3NcbiAqIEBpbnRlcm5hbFxuICovXG5jb25zdCBCUk9XU0VSX1RBR19NQVhfTEVOR1RIID0gMjU2O1xuXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZXJmYWNlXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKipcbiAqIEludGVyZmFjZSBmb3IgQnJvd3NlciByZXNvdXJjZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJQnJvd3NlckN1c3RvbSBleHRlbmRzIElSZXNvdXJjZSwgaWFtLklHcmFudGFibGUsIGVjMi5JQ29ubmVjdGFibGUge1xuICAvKipcbiAgICogVGhlIEFSTiBvZiB0aGUgYnJvd3NlciByZXNvdXJjZVxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBicm93c2VyQXJuOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBpZCBvZiB0aGUgYnJvd3NlclxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBicm93c2VySWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIElBTSByb2xlIHRoYXQgcHJvdmlkZXMgcGVybWlzc2lvbnMgZm9yIHRoZSBicm93c2VyIHRvIGFjY2VzcyBBV1Mgc2VydmljZXNcbiAgICovXG4gIHJlYWRvbmx5IGV4ZWN1dGlvblJvbGU6IGlhbS5JUm9sZTtcblxuICAvKipcbiAgICogVGltZXN0YW1wIHdoZW4gdGhlIGJyb3dzZXIgd2FzIGxhc3QgdXBkYXRlZFxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBsYXN0VXBkYXRlZEF0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgc3RhdHVzIG9mIHRoZSBicm93c2VyXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IHN0YXR1cz86IHN0cmluZztcblxuICAvKipcbiAgICogVGltZXN0YW1wIHdoZW4gdGhlIGJyb3dzZXIgd2FzIGNyZWF0ZWRcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgY3JlYXRlZEF0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBHcmFudHMgSUFNIGFjdGlvbnMgdG8gdGhlIElBTSBQcmluY2lwYWxcbiAgICovXG4gIGdyYW50KGdyYW50ZWU6IGlhbS5JR3JhbnRhYmxlLCAuLi5hY3Rpb25zOiBzdHJpbmdbXSk6IGlhbS5HcmFudDtcbiAgLyoqXG4gICAqIEdyYW50cyBgR2V0YCBhbmQgYExpc3RgIGFjdGlvbnMgb24gdGhlIEJyb3dzZXJcbiAgICovXG4gIGdyYW50UmVhZChncmFudGVlOiBpYW0uSUdyYW50YWJsZSk6IGlhbS5HcmFudDtcbiAgLyoqXG4gICAqIEdyYW50cyBgSW52b2tlYCwgYFN0YXJ0YCwgYW5kIGBVcGRhdGVgIGFjdGlvbnMgb24gdGhlIEJyb3dzZXJcbiAgICovXG4gIGdyYW50VXNlKGdyYW50ZWU6IGlhbS5JR3JhbnRhYmxlKTogaWFtLkdyYW50O1xuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBNZXRyaWNzXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvKipcbiAgICogUmV0dXJuIHRoZSBnaXZlbiBuYW1lZCBtZXRyaWMgZm9yIHRoaXMgYnJvd3Nlci5cbiAgICovXG4gIG1ldHJpYyhtZXRyaWNOYW1lOiBzdHJpbmcsIGRpbWVuc2lvbnM6IERpbWVuc2lvbnNNYXAsIHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYztcblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBnaXZlbiBuYW1lZCBtZXRyaWMgcmVsYXRlZCB0byB0aGUgQVBJIG9wZXJhdGlvbiBwZXJmb3JtZWQgb24gdGhpcyBicm93c2VyLlxuICAgKi9cbiAgbWV0cmljRm9yQXBpT3BlcmF0aW9uKG1ldHJpY05hbWU6IHN0cmluZywgb3BlcmF0aW9uOiBzdHJpbmcsIHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYztcblxuICAvKipcbiAgICogUmV0dXJuIGEgbWV0cmljIG1lYXN1cmluZyB0aGUgbGF0ZW5jeSBvZiBhIHNwZWNpZmljIEFQSSBvcGVyYXRpb24gcGVyZm9ybWVkIG9uIHRoaXMgYnJvd3Nlci5cbiAgICovXG4gIG1ldHJpY0xhdGVuY3lGb3JBcGlPcGVyYXRpb24ob3BlcmF0aW9uOiBzdHJpbmcsIHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYztcblxuICAvKipcbiAgICogUmV0dXJuIGEgbWV0cmljIGNvbnRhaW5pbmcgdGhlIHRvdGFsIG51bWJlciBvZiBBUEkgcmVxdWVzdHMgbWFkZSBmb3IgYSBzcGVjaWZpYyBicm93c2VyIG9wZXJhdGlvbi5cbiAgICovXG4gIG1ldHJpY0ludm9jYXRpb25zRm9yQXBpT3BlcmF0aW9uKG9wZXJhdGlvbjogc3RyaW5nLCBwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWM7XG5cbiAgLyoqXG4gICAqIFJldHVybiBhIG1ldHJpYyBjb250YWluaW5nIHRoZSBudW1iZXIgb2YgZXJyb3JzIGZvciBhIHNwZWNpZmljIEFQSSBvcGVyYXRpb24gcGVyZm9ybWVkIG9uIHRoaXMgYnJvd3Nlci5cbiAgICovXG4gIG1ldHJpY0Vycm9yc0ZvckFwaU9wZXJhdGlvbihvcGVyYXRpb246IHN0cmluZywgcHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljO1xuXG4gIC8qKlxuICAgKiBSZXR1cm4gYSBtZXRyaWMgY29udGFpbmluZyB0aGUgbnVtYmVyIG9mIHRocm90dGxlZCByZXF1ZXN0cyBmb3IgYSBzcGVjaWZpYyBBUEkgb3BlcmF0aW9uIHBlcmZvcm1lZCBvbiB0aGlzIGJyb3dzZXIuXG4gICAqL1xuICBtZXRyaWNUaHJvdHRsZXNGb3JBcGlPcGVyYXRpb24ob3BlcmF0aW9uOiBzdHJpbmcsIHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYztcblxuICAvKipcbiAgICogUmV0dXJuIGEgbWV0cmljIGNvbnRhaW5pbmcgdGhlIG51bWJlciBvZiBzeXN0ZW0gZXJyb3JzIGZvciBhIHNwZWNpZmljIEFQSSBvcGVyYXRpb24gcGVyZm9ybWVkIG9uIHRoaXMgYnJvd3Nlci5cbiAgICovXG4gIG1ldHJpY1N5c3RlbUVycm9yc0ZvckFwaU9wZXJhdGlvbihvcGVyYXRpb246IHN0cmluZywgcHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljO1xuXG4gIC8qKlxuICAgKiBSZXR1cm4gYSBtZXRyaWMgY29udGFpbmluZyB0aGUgbnVtYmVyIG9mIHVzZXIgZXJyb3JzIGZvciBhIHNwZWNpZmljIEFQSSBvcGVyYXRpb24gcGVyZm9ybWVkIG9uIHRoaXMgYnJvd3Nlci5cbiAgICovXG4gIG1ldHJpY1VzZXJFcnJvcnNGb3JBcGlPcGVyYXRpb24ob3BlcmF0aW9uOiBzdHJpbmcsIHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYztcblxuICAvKipcbiAgICogUmV0dXJuIGEgbWV0cmljIG1lYXN1cmluZyB0aGUgZHVyYXRpb24gb2YgYnJvd3NlciBzZXNzaW9ucy5cbiAgICovXG4gIG1ldHJpY1Nlc3Npb25EdXJhdGlvbihwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWM7XG5cbiAgLyoqXG4gICAqIFJldHVybiBhIG1ldHJpYyBjb250YWluaW5nIHRoZSBudW1iZXIgb2YgdXNlciB0YWtlb3ZlcnMuXG4gICAqL1xuICBtZXRyaWNUYWtlT3ZlckNvdW50KHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYztcblxuICAvKipcbiAgICogUmV0dXJuIGEgbWV0cmljIGNvbnRhaW5pbmcgdGhlIG51bWJlciBvZiB1c2VyIHRha2VvdmVycyByZWxlYXNlZC5cbiAgICovXG4gIG1ldHJpY1Rha2VPdmVyUmVsZWFzZUNvdW50KHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYztcblxuICAvKipcbiAgICogUmV0dXJuIGEgbWV0cmljIG1lYXN1cmluZyB0aGUgZHVyYXRpb24gb2YgdXNlciB0YWtlb3ZlcnMuXG4gICAqL1xuICBtZXRyaWNUYWtlT3ZlckR1cmF0aW9uKHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYztcbn1cblxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICogICAgICAgICAgICAgICAgICAgICAgICBBQlNUUkFDVCBCQVNFIENMQVNTXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKipcbiAqIEFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIGEgQnJvd3Nlci5cbiAqIENvbnRhaW5zIG1ldGhvZHMgYW5kIGF0dHJpYnV0ZXMgdmFsaWQgZm9yIEJyb3dzZXJzIGVpdGhlciBjcmVhdGVkIHdpdGggQ0RLIG9yIGltcG9ydGVkLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQnJvd3NlckN1c3RvbUJhc2UgZXh0ZW5kcyBSZXNvdXJjZSBpbXBsZW1lbnRzIElCcm93c2VyQ3VzdG9tIHtcbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IGJyb3dzZXJBcm46IHN0cmluZztcbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IGJyb3dzZXJJZDogc3RyaW5nO1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgbGFzdFVwZGF0ZWRBdD86IHN0cmluZztcbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IHN0YXR1cz86IHN0cmluZztcbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IGNyZWF0ZWRBdD86IHN0cmluZztcbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IGV4ZWN1dGlvblJvbGU6IGlhbS5JUm9sZTtcbiAgLyoqXG4gICAqIFRoZSBwcmluY2lwYWwgdG8gZ3JhbnQgcGVybWlzc2lvbnMgdG9cbiAgICovXG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBncmFudFByaW5jaXBhbDogaWFtLklQcmluY2lwYWw7XG4gIC8qKlxuICAgKiBBbiBhY2Nlc3NvciBmb3IgdGhlIENvbm5lY3Rpb25zIG9iamVjdCB0aGF0IHdpbGwgZmFpbCBpZiB0aGlzIEJyb3dzZXIgZG9lcyBub3QgaGF2ZSBhIFZQQ1xuICAgKiBjb25maWd1cmVkLlxuICAgKi9cbiAgcHVibGljIGdldCBjb25uZWN0aW9ucygpOiBlYzIuQ29ubmVjdGlvbnMge1xuICAgIGlmICghdGhpcy5fY29ubmVjdGlvbnMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IG1hbmFnZSBuZXR3b3JrIGFjY2VzcyB3aXRob3V0IGNvbmZpZ3VyaW5nIGEgVlBDJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9jb25uZWN0aW9ucztcbiAgfVxuICAvKipcbiAgICogVGhlIGFjdHVhbCBDb25uZWN0aW9ucyBvYmplY3QgZm9yIHRoaXMgQnJvd3Nlci4gVGhpcyBtYXkgYmUgdW5zZXQgaW4gdGhlIGV2ZW50IHRoYXQgYSBWUEMgaGFzIG5vdFxuICAgKiBiZWVuIGNvbmZpZ3VyZWQuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHJvdGVjdGVkIF9jb25uZWN0aW9uczogZWMyLkNvbm5lY3Rpb25zIHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBJQU0gYWN0aW9ucyB0byB0aGUgSUFNIFByaW5jaXBhbFxuICAgKiBAcGFyYW0gZ3JhbnRlZSAtIFRoZSBJQU0gcHJpbmNpcGFsIHRvIGdyYW50IHBlcm1pc3Npb25zIHRvXG4gICAqIEBwYXJhbSBhY3Rpb25zIC0gVGhlIGFjdGlvbnMgdG8gZ3JhbnRcbiAgICogQHJldHVybnMgQW4gSUFNIEdyYW50IG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGdyYW50ZWQgcGVybWlzc2lvbnNcbiAgICovXG4gIHB1YmxpYyBncmFudChncmFudGVlOiBpYW0uSUdyYW50YWJsZSwgLi4uYWN0aW9uczogc3RyaW5nW10pOiBpYW0uR3JhbnQge1xuICAgIHJldHVybiBpYW0uR3JhbnQuYWRkVG9QcmluY2lwYWwoe1xuICAgICAgZ3JhbnRlZTogZ3JhbnRlZSxcbiAgICAgIHJlc291cmNlQXJuczogW3RoaXMuYnJvd3NlckFybl0sXG4gICAgICBhY3Rpb25zOiBhY3Rpb25zLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50IHJlYWQgcGVybWlzc2lvbnMgb24gdGhpcyBicm93c2VyIHRvIGFuIElBTSBwcmluY2lwYWwuXG4gICAqIFRoaXMgaW5jbHVkZXMgYm90aCByZWFkIHBlcm1pc3Npb25zIG9uIHRoZSBzcGVjaWZpYyBicm93c2VyIGFuZCBsaXN0IHBlcm1pc3Npb25zIG9uIGFsbCBicm93c2Vycy5cbiAgICpcbiAgICogQHBhcmFtIGdyYW50ZWUgLSBUaGUgSUFNIHByaW5jaXBhbCB0byBncmFudCByZWFkIHBlcm1pc3Npb25zIHRvXG4gICAqIEBkZWZhdWx0IC0gRGVmYXVsdCBncmFudCBjb25maWd1cmF0aW9uOlxuICAgKiAtIGFjdGlvbnM6IFsnYmVkcm9jay1hZ2VudGNvcmU6R2V0QnJvd3NlcicsICdiZWRyb2NrLWFnZW50Y29yZTpHZXRCcm93c2VyU2Vzc2lvbiddIG9uIHRoaXMuYnJvd3NlckFyblxuICAgKiAtIGFjdGlvbnM6IFsnYmVkcm9jay1hZ2VudGNvcmU6TGlzdEJyb3dzZXJzJywgJ2JlZHJvY2stYWdlbnRjb3JlOkxpc3RCcm93c2VyU2Vzc2lvbnMnXSBvbiBhbGwgcmVzb3VyY2VzICgqKVxuICAgKiBAcmV0dXJucyBBbiBJQU0gR3JhbnQgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgZ3JhbnRlZCBwZXJtaXNzaW9uc1xuICAgKi9cbiAgcHVibGljIGdyYW50UmVhZChncmFudGVlOiBpYW0uSUdyYW50YWJsZSk6IGlhbS5HcmFudCB7XG4gICAgY29uc3QgcmVzb3VyY2VTcGVjaWZpY0dyYW50ID0gdGhpcy5ncmFudChcbiAgICAgIGdyYW50ZWUsXG4gICAgICAuLi5wZXJtcy5CUk9XU0VSX1JFQURfUEVSTVMsXG4gICAgKTtcblxuICAgIGNvbnN0IGFsbFJlc291cmNlR3JhbnQgPSBpYW0uR3JhbnQuYWRkVG9QcmluY2lwYWwoe1xuICAgICAgZ3JhbnRlZTogZ3JhbnRlZSxcbiAgICAgIHJlc291cmNlQXJuczogWycqJ10sXG4gICAgICBhY3Rpb25zOiBwZXJtcy5CUk9XU0VSX0xJU1RfUEVSTVMsXG4gICAgfSk7XG4gICAgLy8gUmV0dXJuIGNvbWJpbmVkIGdyYW50XG4gICAgcmV0dXJuIHJlc291cmNlU3BlY2lmaWNHcmFudC5jb21iaW5lKGFsbFJlc291cmNlR3JhbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50IGludm9rZSBwZXJtaXNzaW9ucyBvbiB0aGlzIGJyb3dzZXIgdG8gYW4gSUFNIHByaW5jaXBhbC5cbiAgICpcbiAgICogQHBhcmFtIGdyYW50ZWUgLSBUaGUgSUFNIHByaW5jaXBhbCB0byBncmFudCBpbnZva2UgcGVybWlzc2lvbnMgdG9cbiAgICogQGRlZmF1bHQgLSBEZWZhdWx0IGdyYW50IGNvbmZpZ3VyYXRpb246XG4gICAqIC0gYWN0aW9uczogWydiZWRyb2NrLWFnZW50Y29yZTpTdGFydEJyb3dzZXJTZXNzaW9uJywgJ2JlZHJvY2stYWdlbnRjb3JlOlVwZGF0ZUJyb3dzZXJTdHJlYW0nLCAnYmVkcm9jay1hZ2VudGNvcmU6U3RvcEJyb3dzZXJTZXNzaW9uJ11cbiAgICogLSByZXNvdXJjZUFybnM6IFt0aGlzLmJyb3dzZXJBcm5dXG4gICAqIEByZXR1cm5zIEFuIElBTSBHcmFudCBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBncmFudGVkIHBlcm1pc3Npb25zXG4gICAqL1xuICBwdWJsaWMgZ3JhbnRVc2UoZ3JhbnRlZTogaWFtLklHcmFudGFibGUpOiBpYW0uR3JhbnQge1xuICAgIHJldHVybiB0aGlzLmdyYW50KFxuICAgICAgZ3JhbnRlZSxcbiAgICAgIC4uLnBlcm1zLkJST1dTRVJfVVNFX1BFUk1TLFxuICAgICk7XG4gIH1cblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gTWV0cmljc1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgZ2l2ZW4gbmFtZWQgbWV0cmljIGZvciB0aGlzIGJyb3dzZXIuXG4gICAqXG4gICAqIEJ5IGRlZmF1bHQsIHRoZSBtZXRyaWMgd2lsbCBiZSBjYWxjdWxhdGVkIGFzIGEgc3VtIG92ZXIgYSBwZXJpb2Qgb2YgNSBtaW51dGVzLlxuICAgKiBZb3UgY2FuIGN1c3RvbWl6ZSB0aGlzIGJ5IHVzaW5nIHRoZSBgc3RhdGlzdGljYCBhbmQgYHBlcmlvZGAgcHJvcGVydGllcy5cbiAgICovXG4gIHB1YmxpYyBtZXRyaWMobWV0cmljTmFtZTogc3RyaW5nLCBkaW1lbnNpb25zOiBEaW1lbnNpb25zTWFwLCBwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWMge1xuICAgIGNvbnN0IG1ldHJpY1Byb3BzOiBNZXRyaWNQcm9wcyA9IHtcbiAgICAgIG5hbWVzcGFjZTogJ0FXUy9CZWRyb2NrLUFnZW50Q29yZScsXG4gICAgICBtZXRyaWNOYW1lLFxuICAgICAgZGltZW5zaW9uc01hcDogeyAuLi5kaW1lbnNpb25zLCBSZXNvdXJjZTogdGhpcy5icm93c2VyQXJuIH0sXG4gICAgICAuLi5wcm9wcyxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmNvbmZpZ3VyZU1ldHJpYyhtZXRyaWNQcm9wcyk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIENsb3VkV2F0Y2ggbWV0cmljIGZvciB0cmFja2luZyBicm93c2VyIGFwaSBvcGVyYXRpb25zLi5cbiAgICpcbiAgICogQHBhcmFtIHByb3BzIC0gQ29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgbWV0cmljXG4gICAqIEBkZWZhdWx0IC0gRGVmYXVsdCBtZXRyaWMgY29uZmlndXJhdGlvbjpcbiAgICogLSBuYW1lc3BhY2U6ICdBV1MvQmVkcm9jay1BZ2VudENvcmUnXG4gICAqIC0gbWV0cmljTmFtZTogbWV0cmljTmFtZVxuICAgKiAtIGRpbWVuc2lvbnNNYXA6IHsgQnJvd3NlcklkOiB0aGlzLmJyb3dzZXJJZCB9XG4gICAqIEByZXR1cm5zIEEgQ2xvdWRXYXRjaCBNZXRyaWMgY29uZmlndXJlZCBmb3IgYnJvd3NlciBhcGkgb3BlcmF0aW9uc1xuICAgKi9cbiAgcHVibGljIG1ldHJpY0ZvckFwaU9wZXJhdGlvbihcbiAgICBtZXRyaWNOYW1lOiBzdHJpbmcsXG4gICAgb3BlcmF0aW9uOiBzdHJpbmcsXG4gICAgcHJvcHM/OiBNZXRyaWNPcHRpb25zLFxuICApOiBNZXRyaWMge1xuICAgIHJldHVybiB0aGlzLm1ldHJpYyhtZXRyaWNOYW1lLCB7IE9wZXJhdGlvbjogb3BlcmF0aW9uIH0sIHByb3BzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgQ2xvdWRXYXRjaCBtZXRyaWMgZm9yIHRyYWNraW5nIGJyb3dzZXIgbGF0ZW5jaWVzLlxuICAgKlxuICAgKiBAcGFyYW0gcHJvcHMgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBtZXRyaWNcbiAgICogQGRlZmF1bHQgLSBEZWZhdWx0IG1ldHJpYyBjb25maWd1cmF0aW9uOlxuICAgKiAtIG5hbWVzcGFjZTogJ0FXUy9CZWRyb2NrLUFnZW50Q29yZSdcbiAgICogLSBtZXRyaWNOYW1lOiBMYXRlbmN5XG4gICAqIEByZXR1cm5zIEEgQ2xvdWRXYXRjaCBNZXRyaWMgY29uZmlndXJlZCBmb3IgYnJvd3NlciBsYXRlbmNpZXNcbiAgICovXG4gIHB1YmxpYyBtZXRyaWNMYXRlbmN5Rm9yQXBpT3BlcmF0aW9uKG9wZXJhdGlvbjogc3RyaW5nLCBwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWMge1xuICAgIHJldHVybiB0aGlzLm1ldHJpY0ZvckFwaU9wZXJhdGlvbignTGF0ZW5jeScsIG9wZXJhdGlvbiwgeyBzdGF0aXN0aWM6IFN0YXRzLkFWRVJBR0UsIC4uLnByb3BzIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBDbG91ZFdhdGNoIG1ldHJpYyBmb3IgdHJhY2tpbmcgYnJvd3NlciBpbnZvY2F0aW9ucy5cbiAgICpcbiAgICogQHBhcmFtIHByb3BzIC0gQ29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgbWV0cmljXG4gICAqIEBkZWZhdWx0IC0gRGVmYXVsdCBtZXRyaWMgY29uZmlndXJhdGlvbjpcbiAgICogLSBuYW1lc3BhY2U6ICdBV1MvQmVkcm9jay1BZ2VudENvcmUnXG4gICAqIC0gbWV0cmljTmFtZTogSW52b2NhdGlvbnNcbiAgICogQHJldHVybnMgQSBDbG91ZFdhdGNoIE1ldHJpYyBjb25maWd1cmVkIGZvciBicm93c2VyIGxhdGVuY2llc1xuICAgKi9cbiAgcHVibGljIG1ldHJpY0ludm9jYXRpb25zRm9yQXBpT3BlcmF0aW9uKG9wZXJhdGlvbjogc3RyaW5nLCBwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWMge1xuICAgIHJldHVybiB0aGlzLm1ldHJpY0ZvckFwaU9wZXJhdGlvbignSW52b2NhdGlvbnMnLCBvcGVyYXRpb24sIHtcbiAgICAgIHN0YXRpc3RpYzogU3RhdHMuU1VNLFxuICAgICAgLi4ucHJvcHMsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIENsb3VkV2F0Y2ggbWV0cmljIGZvciB0cmFja2luZyBicm93c2VyIGVycm9ycy5cbiAgICpcbiAgICogQHBhcmFtIHByb3BzIC0gQ29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgbWV0cmljXG4gICAqIEBkZWZhdWx0IC0gRGVmYXVsdCBtZXRyaWMgY29uZmlndXJhdGlvbjpcbiAgICogLSBuYW1lc3BhY2U6ICdBV1MvQmVkcm9jay1BZ2VudENvcmUnXG4gICAqIC0gbWV0cmljTmFtZTogRXJyb3JzXG4gICAqIEByZXR1cm5zIEEgQ2xvdWRXYXRjaCBNZXRyaWMgY29uZmlndXJlZCBmb3IgYnJvd3NlciBlcnJvcnNcbiAgICovXG4gIHB1YmxpYyBtZXRyaWNFcnJvcnNGb3JBcGlPcGVyYXRpb24ob3BlcmF0aW9uOiBzdHJpbmcsIHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYyB7XG4gICAgcmV0dXJuIHRoaXMubWV0cmljRm9yQXBpT3BlcmF0aW9uKCdFcnJvcnMnLCBvcGVyYXRpb24sIHsgc3RhdGlzdGljOiBTdGF0cy5TVU0sIC4uLnByb3BzIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBDbG91ZFdhdGNoIG1ldHJpYyBmb3IgdHJhY2tpbmcgYnJvd3NlciB0aHJvdHRsZXMuXG4gICAqXG4gICAqIEBwYXJhbSBwcm9wcyAtIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIG1ldHJpY1xuICAgKiBAZGVmYXVsdCAtIERlZmF1bHQgbWV0cmljIGNvbmZpZ3VyYXRpb246XG4gICAqIC0gbmFtZXNwYWNlOiAnQVdTL0JlZHJvY2stQWdlbnRDb3JlJ1xuICAgKiAtIG1ldHJpY05hbWU6IFRocm90dGxlc1xuICAgKiBAcmV0dXJucyBBIENsb3VkV2F0Y2ggTWV0cmljIGNvbmZpZ3VyZWQgZm9yIGJyb3dzZXIgdGhyb3R0bGVzXG4gICAqL1xuICBwdWJsaWMgbWV0cmljVGhyb3R0bGVzRm9yQXBpT3BlcmF0aW9uKG9wZXJhdGlvbjogc3RyaW5nLCBwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWMge1xuICAgIHJldHVybiB0aGlzLm1ldHJpY0ZvckFwaU9wZXJhdGlvbignVGhyb3R0bGVzJywgb3BlcmF0aW9uLCB7IHN0YXRpc3RpYzogU3RhdHMuU1VNLCAuLi5wcm9wcyB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgQ2xvdWRXYXRjaCBtZXRyaWMgZm9yIHRyYWNraW5nIGJyb3dzZXIgc3lzdGVtIGVycm9ycy5cbiAgICpcbiAgICogQHBhcmFtIHByb3BzIC0gQ29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgbWV0cmljXG4gICAqIEBkZWZhdWx0IC0gRGVmYXVsdCBtZXRyaWMgY29uZmlndXJhdGlvbjpcbiAgICogLSBuYW1lc3BhY2U6ICdBV1MvQmVkcm9jay1BZ2VudENvcmUnXG4gICAqIC0gbWV0cmljTmFtZTogU3lzdGVtRXJyb3JzXG4gICAqIEByZXR1cm5zIEEgQ2xvdWRXYXRjaCBNZXRyaWMgY29uZmlndXJlZCBmb3IgYnJvd3NlciBzeXN0ZW0gZXJyb3JzXG4gICAqL1xuICBwdWJsaWMgbWV0cmljU3lzdGVtRXJyb3JzRm9yQXBpT3BlcmF0aW9uKG9wZXJhdGlvbjogc3RyaW5nLCBwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWMge1xuICAgIHJldHVybiB0aGlzLm1ldHJpY0ZvckFwaU9wZXJhdGlvbignU3lzdGVtRXJyb3JzJywgb3BlcmF0aW9uLCB7IHN0YXRpc3RpYzogU3RhdHMuU1VNLCAuLi5wcm9wcyB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgQ2xvdWRXYXRjaCBtZXRyaWMgZm9yIHRyYWNraW5nIGJyb3dzZXIgdXNlciBlcnJvcnMuXG4gICAqXG4gICAqIEBwYXJhbSBwcm9wcyAtIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIG1ldHJpY1xuICAgKiBAZGVmYXVsdCAtIERlZmF1bHQgbWV0cmljIGNvbmZpZ3VyYXRpb246XG4gICAqIC0gbmFtZXNwYWNlOiAnQVdTL0JlZHJvY2stQWdlbnRDb3JlJ1xuICAgKiAtIG1ldHJpY05hbWU6IFVzZXJFcnJvcnNcbiAgICogQHJldHVybnMgQSBDbG91ZFdhdGNoIE1ldHJpYyBjb25maWd1cmVkIGZvciBicm93c2VyIHVzZXIgZXJyb3JzXG4gICAqL1xuICBwdWJsaWMgbWV0cmljVXNlckVycm9yc0ZvckFwaU9wZXJhdGlvbihvcGVyYXRpb246IHN0cmluZywgcHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljIHtcbiAgICByZXR1cm4gdGhpcy5tZXRyaWNGb3JBcGlPcGVyYXRpb24oJ1VzZXJFcnJvcnMnLCBvcGVyYXRpb24sIHsgc3RhdGlzdGljOiBTdGF0cy5TVU0sIC4uLnByb3BzIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBDbG91ZFdhdGNoIG1ldHJpYyBmb3IgdHJhY2tpbmcgYnJvd3NlciBzZXNzaW9uIGR1cmF0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gcHJvcHMgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBtZXRyaWNcbiAgICogQGRlZmF1bHQgLSBEZWZhdWx0IG1ldHJpYyBjb25maWd1cmF0aW9uOlxuICAgKiAtIG5hbWVzcGFjZTogJ0FXUy9CZWRyb2NrLUFnZW50Q29yZSdcbiAgICogLSBtZXRyaWNOYW1lOiBEdXJhdGlvblxuICAgKiBAcmV0dXJucyBBIENsb3VkV2F0Y2ggTWV0cmljIGNvbmZpZ3VyZWQgZm9yIGJyb3dzZXIgc2Vzc2lvbiBkdXJhdGlvblxuICAgKi9cbiAgcHVibGljIG1ldHJpY1Nlc3Npb25EdXJhdGlvbihwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWMge1xuICAgIHJldHVybiB0aGlzLm1ldHJpYygnRHVyYXRpb24nLCB7IE9wZXJhdGlvbjogJ0Jyb3dzZXJTZXNzaW9uJyB9LCB7IHN0YXRpc3RpYzogU3RhdHMuQVZFUkFHRSwgLi4ucHJvcHMgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIENsb3VkV2F0Y2ggbWV0cmljIGZvciB0cmFja2luZyBicm93c2VyIHVzZXIgdGFrZW92ZXJzLlxuICAgKlxuICAgKiBAcGFyYW0gcHJvcHMgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBtZXRyaWNcbiAgICogQGRlZmF1bHQgLSBEZWZhdWx0IG1ldHJpYyBjb25maWd1cmF0aW9uOlxuICAgKiAtIG5hbWVzcGFjZTogJ0FXUy9CZWRyb2NrLUFnZW50Q29yZSdcbiAgICogLSBtZXRyaWNOYW1lOiBUYWtlT3ZlckNvdW50XG4gICAqIEByZXR1cm5zIEEgQ2xvdWRXYXRjaCBNZXRyaWMgY29uZmlndXJlZCBmb3IgYnJvd3NlciB1c2VyIHRha2VvdmVyc1xuICAgKi9cbiAgcHVibGljIG1ldHJpY1Rha2VPdmVyQ291bnQocHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljIHtcbiAgICByZXR1cm4gdGhpcy5tZXRyaWMoJ1Rha2VPdmVyQ291bnQnLCB7fSwgeyBzdGF0aXN0aWM6IFN0YXRzLlNVTSwgLi4ucHJvcHMgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIENsb3VkV2F0Y2ggbWV0cmljIGZvciB0cmFja2luZyBicm93c2VyIHVzZXIgdGFrZW92ZXJzIHJlbGVhc2VkLlxuICAgKlxuICAgKiBAcGFyYW0gcHJvcHMgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBtZXRyaWNcbiAgICogQGRlZmF1bHQgLSBEZWZhdWx0IG1ldHJpYyBjb25maWd1cmF0aW9uOlxuICAgKiAtIG5hbWVzcGFjZTogJ0FXUy9CZWRyb2NrLUFnZW50Q29yZSdcbiAgICogLSBtZXRyaWNOYW1lOiBUYWtlT3ZlclJlbGVhc2VDb3VudFxuICAgKiBAcmV0dXJucyBBIENsb3VkV2F0Y2ggTWV0cmljIGNvbmZpZ3VyZWQgZm9yIGJyb3dzZXIgdXNlciB0YWtlb3ZlcnMgcmVsZWFzZWRcbiAgICovXG4gIHB1YmxpYyBtZXRyaWNUYWtlT3ZlclJlbGVhc2VDb3VudChwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWMge1xuICAgIHJldHVybiB0aGlzLm1ldHJpYygnVGFrZU92ZXJSZWxlYXNlQ291bnQnLCB7fSwgeyBzdGF0aXN0aWM6IFN0YXRzLlNVTSwgLi4ucHJvcHMgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIENsb3VkV2F0Y2ggbWV0cmljIGZvciB0cmFja2luZyBicm93c2VyIHVzZXIgdGFrZW92ZXJzIGR1cmF0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gcHJvcHMgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBtZXRyaWNcbiAgICogQGRlZmF1bHQgLSBEZWZhdWx0IG1ldHJpYyBjb25maWd1cmF0aW9uOlxuICAgKiAtIG5hbWVzcGFjZTogJ0FXUy9CZWRyb2NrLUFnZW50Q29yZSdcbiAgICogLSBtZXRyaWNOYW1lOiBUYWtlT3ZlckR1cmF0aW9uXG4gICAqIEByZXR1cm5zIEEgQ2xvdWRXYXRjaCBNZXRyaWMgY29uZmlndXJlZCBmb3IgYnJvd3NlciB1c2VyIHRha2VvdmVycyBkdXJhdGlvblxuICAgKi9cbiAgcHVibGljIG1ldHJpY1Rha2VPdmVyRHVyYXRpb24ocHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljIHtcbiAgICByZXR1cm4gdGhpcy5tZXRyaWMoJ1Rha2VPdmVyRHVyYXRpb24nLCB7fSwgeyBzdGF0aXN0aWM6IFN0YXRzLkFWRVJBR0UsIC4uLnByb3BzIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEludGVybmFsIG1ldGhvZCB0byBjcmVhdGUgYSBtZXRyaWMuXG4gICAqXG4gICAqIEBwYXJhbSBwcm9wcyAtIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIG1ldHJpY1xuICAgKiBAcmV0dXJucyBBIENsb3VkV2F0Y2ggTWV0cmljIGNvbmZpZ3VyZWQgZm9yIGJyb3dzZXIgYXBpIG9wZXJhdGlvbnNcbiAgICovXG4gIHByaXZhdGUgY29uZmlndXJlTWV0cmljKHByb3BzOiBNZXRyaWNQcm9wcykge1xuICAgIHJldHVybiBuZXcgTWV0cmljKHtcbiAgICAgIC4uLnByb3BzLFxuICAgICAgcmVnaW9uOiBwcm9wcz8ucmVnaW9uID8/IHRoaXMuc3RhY2sucmVnaW9uLFxuICAgICAgYWNjb3VudDogcHJvcHM/LmFjY291bnQgPz8gdGhpcy5zdGFjay5hY2NvdW50LFxuICAgIH0pO1xuICB9XG59XG5cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWNvcmRpbmcgQ29uZmlndXJhdGlvblxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4vKipcbiAqIFJlY29yZGluZyBjb25maWd1cmF0aW9uIGZvciBicm93c2VyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVjb3JkaW5nQ29uZmlnIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgcmVjb3JkaW5nIGlzIGVuYWJsZWRcbiAgICogQGRlZmF1bHQgLSBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFMzIExvY2F0aW9uIENvbmZpZ3VyYXRpb25cbiAgICogQGRlZmF1bHQgLSB1bmRlZmluZWRcbiAgICovXG4gIHJlYWRvbmx5IHMzTG9jYXRpb24/OiBMb2NhdGlvbjtcbn1cblxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICogICAgICAgICAgICAgICAgICAgICAgICBQUk9QUyBGT1IgTkVXIENPTlNUUlVDVFxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBjcmVhdGluZyBhIEJyb3dzZXIgcmVzb3VyY2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCcm93c2VyQ3VzdG9tUHJvcHMge1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGJyb3dzZXJcbiAgICogVmFsaWQgY2hhcmFjdGVycyBhcmUgYS16LCBBLVosIDAtOSwgXyAodW5kZXJzY29yZSlcbiAgICogVGhlIG5hbWUgbXVzdCBzdGFydCB3aXRoIGEgbGV0dGVyIGFuZCBjYW4gYmUgdXAgdG8gNDggY2hhcmFjdGVycyBsb25nXG4gICAqIFBhdHRlcm46IFthLXpBLVpdW2EtekEtWjAtOV9dezAsNDd9XG4gICAqIEByZXF1aXJlZCAtIFllc1xuICAgKi9cbiAgcmVhZG9ubHkgYnJvd3NlckN1c3RvbU5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogT3B0aW9uYWwgZGVzY3JpcHRpb24gZm9yIHRoZSBicm93c2VyXG4gICAqIFZhbGlkIGNoYXJhY3RlcnMgYXJlIGEteiwgQS1aLCAwLTksIF8gKHVuZGVyc2NvcmUpLCAtIChoeXBoZW4pIGFuZCBzcGFjZXNcbiAgICogVGhlIGRlc2NyaXB0aW9uIGNhbiBoYXZlIHVwIHRvIDIwMCBjaGFyYWN0ZXJzXG4gICAqIEBkZWZhdWx0IC0gTm8gZGVzY3JpcHRpb25cbiAgICogQHJlcXVpcmVkIC0gTm9cbiAgICovXG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBOZXR3b3JrIGNvbmZpZ3VyYXRpb24gZm9yIGJyb3dzZXJcbiAgICogQHJlcXVpcmVkIC0gTm9cbiAgICogQGRlZmF1bHQgLSBQVUJMSUMgbmV0d29yayBtb2RlXG4gICAqL1xuICByZWFkb25seSBuZXR3b3JrQ29uZmlndXJhdGlvbj86IEJyb3dzZXJOZXR3b3JrQ29uZmlndXJhdGlvbjtcblxuICAvKipcbiAgICogUmVjb3JkaW5nIGNvbmZpZ3VyYXRpb24gZm9yIGJyb3dzZXJcbiAgICogQHJlcXVpcmVkIC0gTm9cbiAgICogQGRlZmF1bHQgLSBObyByZWNvcmRpbmcgY29uZmlndXJhdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgcmVjb3JkaW5nQ29uZmlnPzogUmVjb3JkaW5nQ29uZmlnO1xuXG4gIC8qKlxuICAgKiBUaGUgSUFNIHJvbGUgdGhhdCBwcm92aWRlcyBwZXJtaXNzaW9ucyBmb3IgdGhlIGJyb3dzZXIgdG8gYWNjZXNzIEFXUyBzZXJ2aWNlc1xuICAgKiBAZGVmYXVsdCAtIEEgbmV3IHJvbGUgd2lsbCBiZSBjcmVhdGVkXG4gICAqIEByZXF1aXJlZCAtIE5vXG4gICAqL1xuICByZWFkb25seSBleGVjdXRpb25Sb2xlPzogaWFtLklSb2xlO1xuXG4gIC8qKlxuICAgKiBUYWdzIChvcHRpb25hbClcbiAgICogQSBsaXN0IG9mIGtleTp2YWx1ZSBwYWlycyBvZiB0YWdzIHRvIGFwcGx5IHRvIHRoaXMgQnJvd3NlciByZXNvdXJjZVxuICAgKlxuICAgKiBAZGVmYXVsdCB7fSAtIG5vIHRhZ3NcbiAgICogQHJlcXVpcmVkIC0gTm9cbiAgICovXG4gIHJlYWRvbmx5IHRhZ3M/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xufVxuXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gKiAgICAgICAgICAgICAgICAgICAgICBBVFRSUyBGT1IgSU1QT1JURUQgQ09OU1RSVUNUXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKipcbiAqIEF0dHJpYnV0ZXMgZm9yIHNwZWNpZnlpbmcgYW4gaW1wb3J0ZWQgQnJvd3NlciBDdXN0b20uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnJvd3NlckN1c3RvbUF0dHJpYnV0ZXMge1xuICAvKipcbiAgICogVGhlIEFSTiBvZiB0aGUgYWdlbnQuXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IGJyb3dzZXJBcm46IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBBUk4gb2YgdGhlIElBTSByb2xlIGFzc29jaWF0ZWQgdG8gdGhlIGJyb3dzZXIuXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IHJvbGVBcm46IHN0cmluZztcbiAgLyoqXG4gICAqIFdoZW4gdGhpcyBicm93c2VyIHdhcyBsYXN0IHVwZGF0ZWQuXG4gICAqIEBkZWZhdWx0IHVuZGVmaW5lZCAtIE5vIGxhc3QgdXBkYXRlZCB0aW1lc3RhbXAgaXMgcHJvdmlkZWRcbiAgICovXG4gIHJlYWRvbmx5IGxhc3RVcGRhdGVkQXQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgc3RhdHVzIG9mIHRoZSBicm93c2VyLlxuICAgKiBAZGVmYXVsdCB1bmRlZmluZWQgLSBObyBzdGF0dXMgaXMgcHJvdmlkZWRcbiAgICovXG4gIHJlYWRvbmx5IHN0YXR1cz86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBjcmVhdGVkIHRpbWVzdGFtcCBvZiB0aGUgYnJvd3Nlci5cbiAgICogQGRlZmF1bHQgdW5kZWZpbmVkIC0gTm8gY3JlYXRlZCB0aW1lc3RhbXAgaXMgcHJvdmlkZWRcbiAgICovXG4gIHJlYWRvbmx5IGNyZWF0ZWRBdD86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBzZWN1cml0eSBncm91cHMgZm9yIHRoaXMgYnJvd3NlciwgaWYgaW4gYSBWUEMuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gQnkgZGVmYXVsdCwgdGhlIGJyb3dzZXIgaXMgbm90IGluIGEgVlBDLlxuICAgKi9cbiAgcmVhZG9ubHkgc2VjdXJpdHlHcm91cHM/OiBlYzIuSVNlY3VyaXR5R3JvdXBbXTtcbn1cblxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKipcbiAqIEJyb3dzZXIgcmVzb3VyY2UgZm9yIEFXUyBCZWRyb2NrIEFnZW50IENvcmUuXG4gKiBQcm92aWRlcyBhIGJyb3dzZXIgZW52aXJvbm1lbnQgZm9yIHdlYiBhdXRvbWF0aW9uIGFuZCBpbnRlcmFjdGlvbi5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9iZWRyb2NrLWFnZW50Y29yZS9sYXRlc3QvZGV2Z3VpZGUvYnJvd3Nlci5odG1sXG4gKiBAcmVzb3VyY2UgQVdTOjpCZWRyb2NrQWdlbnRDb3JlOjpCcm93c2VyQ3VzdG9tXG4gKi9cbkBwcm9wZXJ0eUluamVjdGFibGVcbmV4cG9ydCBjbGFzcyBCcm93c2VyQ3VzdG9tIGV4dGVuZHMgQnJvd3NlckN1c3RvbUJhc2Uge1xuICAvKiogVW5pcXVlbHkgaWRlbnRpZmllcyB0aGlzIGNsYXNzLiAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFBST1BFUlRZX0lOSkVDVElPTl9JRDogc3RyaW5nID0gJ0Bhd3MtY2RrLmF3cy1iZWRyb2NrLWFnZW50Y29yZS1hbHBoYS5Ccm93c2VyQ3VzdG9tJztcblxuICAvKipcbiAgICogU3RhdGljIE1ldGhvZCBmb3IgaW1wb3J0aW5nIGFuIGV4aXN0aW5nIEJlZHJvY2sgQWdlbnRDb3JlIEJyb3dzZXIgQ3VzdG9tLlxuICAgKi9cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gQnJvd3NlciBDdXN0b20gcmVmZXJlbmNlIGZyb20gYW4gZXhpc3RpbmcgYnJvd3NlcidzIGF0dHJpYnV0ZXMuXG4gICAqXG4gICAqIEBwYXJhbSBzY29wZSAtIFRoZSBjb25zdHJ1Y3Qgc2NvcGVcbiAgICogQHBhcmFtIGlkIC0gSWRlbnRpZmllciBvZiB0aGUgY29uc3RydWN0XG4gICAqIEBwYXJhbSBhdHRycyAtIEF0dHJpYnV0ZXMgb2YgdGhlIGV4aXN0aW5nIGJyb3dzZXIgY3VzdG9tXG4gICAqIEByZXR1cm5zIEFuIElCcm93c2VyQ3VzdG9tIHJlZmVyZW5jZSB0byB0aGUgZXhpc3RpbmcgYnJvd3NlclxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tQnJvd3NlckN1c3RvbUF0dHJpYnV0ZXMoc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgYXR0cnM6IEJyb3dzZXJDdXN0b21BdHRyaWJ1dGVzKTogSUJyb3dzZXJDdXN0b20ge1xuICAgIGNsYXNzIEltcG9ydCBleHRlbmRzIEJyb3dzZXJDdXN0b21CYXNlIHtcbiAgICAgIHB1YmxpYyByZWFkb25seSBicm93c2VyQXJuID0gYXR0cnMuYnJvd3NlckFybjtcbiAgICAgIHB1YmxpYyByZWFkb25seSBicm93c2VySWQgPSBBcm4uc3BsaXQoYXR0cnMuYnJvd3NlckFybiwgQXJuRm9ybWF0LlNMQVNIX1JFU09VUkNFX05BTUUpLnJlc291cmNlTmFtZSE7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgZXhlY3V0aW9uUm9sZSA9IGlhbS5Sb2xlLmZyb21Sb2xlQXJuKHNjb3BlLCBgJHtpZH1Sb2xlYCwgYXR0cnMucm9sZUFybik7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgbGFzdFVwZGF0ZWRBdCA9IGF0dHJzLmxhc3RVcGRhdGVkQXQ7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgZ3JhbnRQcmluY2lwYWwgPSB0aGlzLmV4ZWN1dGlvblJvbGU7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgc3RhdHVzID0gYXR0cnMuc3RhdHVzO1xuICAgICAgcHVibGljIHJlYWRvbmx5IGNyZWF0ZWRBdCA9IGF0dHJzLmNyZWF0ZWRBdDtcblxuICAgICAgY29uc3RydWN0b3IoczogQ29uc3RydWN0LCBpOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIocywgaSk7XG5cbiAgICAgICAgdGhpcy5ncmFudFByaW5jaXBhbCA9IHRoaXMuZXhlY3V0aW9uUm9sZSB8fCBuZXcgaWFtLlVua25vd25QcmluY2lwYWwoeyByZXNvdXJjZTogdGhpcyB9KTtcbiAgICAgICAgaWYgKGF0dHJzLnNlY3VyaXR5R3JvdXBzKSB7XG4gICAgICAgICAgdGhpcy5fY29ubmVjdGlvbnMgPSBuZXcgZWMyLkNvbm5lY3Rpb25zKHtcbiAgICAgICAgICAgIHNlY3VyaXR5R3JvdXBzOiBhdHRycy5zZWN1cml0eUdyb3VwcyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJldHVybiBuZXcgQnJvd3NlciBDdXN0b21cbiAgICByZXR1cm4gbmV3IEltcG9ydChzY29wZSwgaWQpO1xuICB9XG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBBdHRyaWJ1dGVzXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvKipcbiAgICogVGhlIEFSTiBvZiB0aGUgYnJvd3NlciByZXNvdXJjZS5cbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGJyb3dzZXJBcm46IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBpZCBvZiB0aGUgYnJvd3NlclxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYnJvd3NlcklkOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgYnJvd3NlclxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgYnJvd3NlclxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGxhc3QgdXBkYXRlZCB0aW1lc3RhbXAgb2YgdGhlIGJyb3dzZXJcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGxhc3RVcGRhdGVkQXQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgc3RhdHVzIG9mIHRoZSBicm93c2VyXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBzdGF0dXM/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgY3JlYXRlZCB0aW1lc3RhbXAgb2YgdGhlIGJyb3dzZXJcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNyZWF0ZWRBdD86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBmYWlsdXJlIHJlYXNvbiBvZiB0aGUgYnJvd3NlclxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZmFpbHVyZVJlYXNvbj86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBJQU0gcm9sZSBhc3NvY2lhdGVkIHRvIHRoZSBicm93c2VyLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGV4ZWN1dGlvblJvbGU6IGlhbS5JUm9sZTtcbiAgLyoqXG4gICAqIFRhZ3MgYXBwbGllZCB0byB0aGlzIGJyb3dzZXIgcmVzb3VyY2VcbiAgICogQSBtYXAgb2Yga2V5LXZhbHVlIHBhaXJzIGZvciByZXNvdXJjZSB0YWdnaW5nXG4gICAqIEBkZWZhdWx0IC0gTm8gdGFncyBhcHBsaWVkXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdGFncz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG4gIC8qKlxuICAgKiBUaGUgcHJpbmNpcGFsIHRvIGdyYW50IHBlcm1pc3Npb25zIHRvXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZ3JhbnRQcmluY2lwYWw6IGlhbS5JUHJpbmNpcGFsO1xuICAvKipcbiAgICogVGhlIG5ldHdvcmsgY29uZmlndXJhdGlvbiBvZiB0aGUgYnJvd3NlclxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG5ldHdvcmtDb25maWd1cmF0aW9uOiBCcm93c2VyTmV0d29ya0NvbmZpZ3VyYXRpb247XG4gIC8qKlxuICAgKiBUaGUgcmVjb3JkaW5nIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGJyb3dzZXJcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSByZWNvcmRpbmdDb25maWc/OiBSZWNvcmRpbmdDb25maWc7XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIEludGVybmFsIE9ubHlcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIHByaXZhdGUgcmVhZG9ubHkgX19yZXNvdXJjZTogYWdlbnRfY29yZS5DZm5Ccm93c2VyQ3VzdG9tO1xuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBDT05TVFJVQ1RPUlxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IEJyb3dzZXJDdXN0b21Qcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG4gICAgLy8gRW5oYW5jZWQgQ0RLIEFuYWx5dGljcyBUZWxlbWV0cnlcbiAgICBhZGRDb25zdHJ1Y3RNZXRhZGF0YSh0aGlzLCBwcm9wcyk7XG5cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBTZXQgcHJvcGVydGllcyBhbmQgZGVmYXVsdHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICB0aGlzLm5hbWUgPSBwcm9wcy5icm93c2VyQ3VzdG9tTmFtZTtcbiAgICB0aGlzLmRlc2NyaXB0aW9uID0gcHJvcHMuZGVzY3JpcHRpb247XG4gICAgdGhpcy5uZXR3b3JrQ29uZmlndXJhdGlvbiA9IHByb3BzLm5ldHdvcmtDb25maWd1cmF0aW9uID8/IEJyb3dzZXJOZXR3b3JrQ29uZmlndXJhdGlvbi51c2luZ1B1YmxpY05ldHdvcmsoKTtcbiAgICB0aGlzLnJlY29yZGluZ0NvbmZpZyA9IHByb3BzLnJlY29yZGluZ0NvbmZpZyA/PyB7IGVuYWJsZWQ6IGZhbHNlIH07XG4gICAgdGhpcy5leGVjdXRpb25Sb2xlID0gcHJvcHMuZXhlY3V0aW9uUm9sZSA/PyB0aGlzLl9jcmVhdGVCcm93c2VyUm9sZSgpO1xuICAgIHRoaXMuZ3JhbnRQcmluY2lwYWwgPSB0aGlzLmV4ZWN1dGlvblJvbGU7XG4gICAgdGhpcy50YWdzID0gcHJvcHMudGFncztcblxuICAgIC8vIFZhbGlkYXRlIGJyb3dzZXIgbmFtZVxuICAgIHRocm93SWZJbnZhbGlkKHRoaXMuX3ZhbGlkYXRlQnJvd3Nlck5hbWUsIHRoaXMubmFtZSk7XG5cbiAgICAvLyBWYWxpZGF0ZSBicm93c2VyIHRhZ3NcbiAgICB0aHJvd0lmSW52YWxpZCh0aGlzLl92YWxpZGF0ZUJyb3dzZXJUYWdzLCB0aGlzLnRhZ3MpO1xuXG4gICAgLy8gVmFsaWRhdGUgcmVjb3JkaW5nIGNvbmZpZ3VyYXRpb25cbiAgICB0aHJvd0lmSW52YWxpZCh0aGlzLl92YWxpZGF0ZVJlY29yZGluZ0NvbmZpZywgdGhpcy5yZWNvcmRpbmdDb25maWcpO1xuXG4gICAgLy8gTmV0d29yayBjb25maWd1cmF0aW9uIGFuZCB2YWxpZGF0aW9uIGlzIGRvbmUgaW4gdGhlIG5ldHdvcmsgY29uZmlndXJhdGlvbiBjbGFzc1xuICAgIC8vIFNvIHdlIGRvbid0IG5lZWQgdG8gdmFsaWRhdGUgaXQgaGVyZVxuXG4gICAgLy8gU2V0IGNvbm5lY3Rpb25zIC0gY3JlYXRlIGEgc2hhcmVkIGNvbm5lY3Rpb25zIG9iamVjdFxuICAgIGlmICh0aGlzLm5ldHdvcmtDb25maWd1cmF0aW9uLmNvbm5lY3Rpb25zKSB7XG4gICAgICAvLyBVc2UgdGhlIG5ldHdvcmsgY29uZmlndXJhdGlvbidzIGNvbm5lY3Rpb25zIGFzIHRoZSBzaGFyZWQgb2JqZWN0XG4gICAgICB0aGlzLl9jb25uZWN0aW9ucyA9IHRoaXMubmV0d29ya0NvbmZpZ3VyYXRpb24uY29ubmVjdGlvbnM7XG4gICAgfVxuXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gQ0ZOIFByb3BzIC0gV2l0aCBMYXp5IHN1cHBvcnRcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBjb25zdCBjZm5Qcm9wczogYWdlbnRfY29yZS5DZm5Ccm93c2VyQ3VzdG9tUHJvcHMgPSB7XG4gICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICBkZXNjcmlwdGlvbjogdGhpcy5kZXNjcmlwdGlvbixcbiAgICAgIG5ldHdvcmtDb25maWd1cmF0aW9uOiBMYXp5LmFueSh7IHByb2R1Y2U6ICgpID0+IHRoaXMubmV0d29ya0NvbmZpZ3VyYXRpb24uX3JlbmRlcih0aGlzLl9jb25uZWN0aW9ucykgfSksXG4gICAgICByZWNvcmRpbmdDb25maWc6IHRoaXMuX3JlbmRlclJlY29yZGluZ0NvbmZpZygpLFxuICAgICAgZXhlY3V0aW9uUm9sZUFybjogdGhpcy5leGVjdXRpb25Sb2xlPy5yb2xlQXJuLFxuICAgICAgdGFnczogdGhpcy50YWdzLFxuICAgIH07XG5cbiAgICAvLyBMMSBpbnN0YW50aWF0aW9uXG4gICAgdGhpcy5fX3Jlc291cmNlID0gbmV3IGFnZW50X2NvcmUuQ2ZuQnJvd3NlckN1c3RvbSh0aGlzLCAnUmVzb3VyY2UnLCBjZm5Qcm9wcyk7XG5cbiAgICAvLyBHZXQgYXR0cmlidXRlcyBkaXJlY3RseSBmcm9tIHRoZSBDbG91ZEZvcm1hdGlvbiByZXNvdXJjZVxuICAgIHRoaXMuYnJvd3NlcklkID0gdGhpcy5fX3Jlc291cmNlLmF0dHJCcm93c2VySWQ7XG4gICAgdGhpcy5icm93c2VyQXJuID0gdGhpcy5fX3Jlc291cmNlLmF0dHJCcm93c2VyQXJuO1xuICAgIHRoaXMuc3RhdHVzID0gdGhpcy5fX3Jlc291cmNlLmF0dHJTdGF0dXM7XG4gICAgdGhpcy5jcmVhdGVkQXQgPSB0aGlzLl9fcmVzb3VyY2UuYXR0ckNyZWF0ZWRBdDtcbiAgICB0aGlzLmxhc3RVcGRhdGVkQXQgPSB0aGlzLl9fcmVzb3VyY2UuYXR0ckxhc3RVcGRhdGVkQXQ7XG4gICAgdGhpcy5mYWlsdXJlUmVhc29uID0gdGhpcy5fX3Jlc291cmNlLmF0dHJGYWlsdXJlUmVhc29uO1xuXG4gICAgLy8gaWYgcmVjb3JkaW5nIGlzIGNvbmZpZ3VyZWQsIGFkZCBwZXJtaXNzaW9ucyB0byB0aGUgZXhlY3V0aW9uIHJvbGVcbiAgICBpZiAodGhpcy5yZWNvcmRpbmdDb25maWcgJiYgdGhpcy5yZWNvcmRpbmdDb25maWcuczNMb2NhdGlvbikge1xuICAgICAgaWYgKCFUb2tlbi5pc1VucmVzb2x2ZWQodGhpcy5yZWNvcmRpbmdDb25maWcuczNMb2NhdGlvbi5idWNrZXROYW1lKSkge1xuICAgICAgICBTdGFjay5vZih0aGlzKS5yZXNvbHZlKHRoaXMucmVjb3JkaW5nQ29uZmlnLnMzTG9jYXRpb24uYnVja2V0TmFtZSk7XG4gICAgICB9XG4gICAgICBjb25zdCBidWNrZXQgPSBzMy5CdWNrZXQuZnJvbUJ1Y2tldE5hbWUoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIGAke3RoaXMubmFtZX1SZWNvcmRpbmdCdWNrZXRgLFxuICAgICAgICB0aGlzLnJlY29yZGluZ0NvbmZpZy5zM0xvY2F0aW9uLmJ1Y2tldE5hbWUsXG4gICAgICApO1xuICAgICAgLy8gRW5zdXJlIHRoZSBwb2xpY3kgaXMgYXBwbGllZCBiZWZvcmUgdGhlIGJyb3dzZXIgcmVzb3VyY2UgaXMgY3JlYXRlZFxuICAgICAgY29uc3QgZ3JhbnQgPSBidWNrZXQuZ3JhbnRSZWFkV3JpdGUodGhpcy5leGVjdXRpb25Sb2xlKTtcbiAgICAgIGdyYW50LmFwcGx5QmVmb3JlKHRoaXMuX19yZXNvdXJjZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlciB0aGUgcmVjb3JkaW5nIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEByZXR1cm5zIFJlY29yZGluZ0NvbmZpZ1Byb3BlcnR5IG9iamVjdCBpbiBDbG91ZEZvcm1hdGlvbiBmb3JtYXQsIG9yIHVuZGVmaW5lZCBpZiBubyByZWNvcmRpbmcgY29uZmlndXJhdGlvbiBpcyBkZWZpbmVkXG4gICAqIEBkZWZhdWx0IC0gdW5kZWZpbmVkIGlmIG5vIHJlY29yZGluZyBjb25maWd1cmF0aW9uIGlzIHByb3ZpZGVkXG4gICAqIEBpbnRlcm5hbCBUaGlzIGlzIGFuIGludGVybmFsIGNvcmUgZnVuY3Rpb24gYW5kIHNob3VsZCBub3QgYmUgY2FsbGVkIGRpcmVjdGx5LlxuICAgKi9cbiAgcHJpdmF0ZSBfcmVuZGVyUmVjb3JkaW5nQ29uZmlnKCk6IGFnZW50X2NvcmUuQ2ZuQnJvd3NlckN1c3RvbS5SZWNvcmRpbmdDb25maWdQcm9wZXJ0eSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucmVjb3JkaW5nQ29uZmlnID8ge1xuICAgICAgZW5hYmxlZDogdGhpcy5yZWNvcmRpbmdDb25maWcuZW5hYmxlZCxcbiAgICAgIHMzTG9jYXRpb246IHRoaXMucmVjb3JkaW5nQ29uZmlnLnMzTG9jYXRpb24gPyB7XG4gICAgICAgIGJ1Y2tldDogdGhpcy5yZWNvcmRpbmdDb25maWcuczNMb2NhdGlvbi5idWNrZXROYW1lLFxuICAgICAgICBwcmVmaXg6IHRoaXMucmVjb3JkaW5nQ29uZmlnLnMzTG9jYXRpb24ub2JqZWN0S2V5LFxuICAgICAgfSA6IHVuZGVmaW5lZCxcbiAgICB9IDogdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgZXhlY3V0aW9uIHJvbGUgbmVlZGVkIGZvciB0aGUgYnJvd3NlciB0byBhY2Nlc3MgQVdTIHNlcnZpY2VzXG4gICAqIEByZXR1cm5zIFRoZSBjcmVhdGVkIHJvbGVcbiAgICogQGludGVybmFsIFRoaXMgaXMgYW4gaW50ZXJuYWwgY29yZSBmdW5jdGlvbiBhbmQgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZGlyZWN0bHkuXG4gICAqL1xuICBwcml2YXRlIF9jcmVhdGVCcm93c2VyUm9sZSgpOiBpYW0uSVJvbGUge1xuICAgIGNvbnN0IHJvbGUgPSBuZXcgaWFtLlJvbGUodGhpcywgJ1NlcnZpY2VSb2xlJywge1xuICAgICAgYXNzdW1lZEJ5OiBuZXcgaWFtLlNlcnZpY2VQcmluY2lwYWwoJ2JlZHJvY2stYWdlbnRjb3JlLmFtYXpvbmF3cy5jb20nKSxcbiAgICB9KTtcblxuICAgIHJldHVybiByb2xlO1xuICB9XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIFZhbGlkYXRvcnNcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgdGhlIGJyb3dzZXIgbmFtZSBmb3JtYXRcbiAgICogQHBhcmFtIG5hbWUgVGhlIGJyb3dzZXIgbmFtZSB0byB2YWxpZGF0ZVxuICAgKiBAcmV0dXJucyBBcnJheSBvZiB2YWxpZGF0aW9uIGVycm9yIG1lc3NhZ2VzLCBlbXB0eSBpZiB2YWxpZFxuICAgKi9cbiAgcHJpdmF0ZSBfdmFsaWRhdGVCcm93c2VyTmFtZSA9IChuYW1lOiBzdHJpbmcpOiBzdHJpbmdbXSA9PiB7XG4gICAgbGV0IGVycm9yczogc3RyaW5nW10gPSBbXTtcblxuICAgIGVycm9ycy5wdXNoKC4uLnZhbGlkYXRlU3RyaW5nRmllbGRMZW5ndGgoe1xuICAgICAgdmFsdWU6IG5hbWUsXG4gICAgICBmaWVsZE5hbWU6ICdCcm93c2VyIG5hbWUnLFxuICAgICAgbWluTGVuZ3RoOiBCUk9XU0VSX05BTUVfTUlOX0xFTkdUSCxcbiAgICAgIG1heExlbmd0aDogQlJPV1NFUl9OQU1FX01BWF9MRU5HVEgsXG4gICAgfSkpO1xuXG4gICAgLy8gQ2hlY2sgaWYgbmFtZSBtYXRjaGVzIHRoZSBBV1MgQVBJIHBhdHRlcm46IFthLXpBLVpdW2EtekEtWjAtOV9dezAsNDd9XG4gICAgLy8gTXVzdCBzdGFydCB3aXRoIGEgbGV0dGVyLCBmb2xsb3dlZCBieSB1cCB0byA0NyBsZXR0ZXJzLCBudW1iZXJzLCBvciB1bmRlcnNjb3Jlc1xuICAgIGNvbnN0IHZhbGlkTmFtZVBhdHRlcm4gPSAvXlthLXpBLVpdW2EtekEtWjAtOV9dezAsNDd9JC87XG4gICAgZXJyb3JzLnB1c2goLi4udmFsaWRhdGVGaWVsZFBhdHRlcm4obmFtZSwgJ0Jyb3dzZXIgbmFtZScsIHZhbGlkTmFtZVBhdHRlcm4pKTtcblxuICAgIHJldHVybiBlcnJvcnM7XG4gIH07XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyB0aGUgYnJvd3NlciB0YWdzIGZvcm1hdFxuICAgKiBAcGFyYW0gdGFncyBUaGUgdGFncyBvYmplY3QgdG8gdmFsaWRhdGVcbiAgICogQHJldHVybnMgQXJyYXkgb2YgdmFsaWRhdGlvbiBlcnJvciBtZXNzYWdlcywgZW1wdHkgaWYgdmFsaWRcbiAgICovXG4gIHByaXZhdGUgX3ZhbGlkYXRlQnJvd3NlclRhZ3MgPSAodGFncz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0pOiBzdHJpbmdbXSA9PiB7XG4gICAgbGV0IGVycm9yczogc3RyaW5nW10gPSBbXTtcbiAgICBpZiAoIXRhZ3MpIHtcbiAgICAgIHJldHVybiBlcnJvcnM7IC8vIFRhZ3MgYXJlIG9wdGlvbmFsXG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgZWFjaCB0YWcga2V5IGFuZCB2YWx1ZVxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHRhZ3MpKSB7XG4gICAgICBlcnJvcnMucHVzaCguLi52YWxpZGF0ZVN0cmluZ0ZpZWxkTGVuZ3RoKHtcbiAgICAgICAgdmFsdWU6IGtleSxcbiAgICAgICAgZmllbGROYW1lOiAnVGFnIGtleScsXG4gICAgICAgIG1pbkxlbmd0aDogQlJPV1NFUl9UQUdfTUlOX0xFTkdUSCxcbiAgICAgICAgbWF4TGVuZ3RoOiBCUk9XU0VSX1RBR19NQVhfTEVOR1RILFxuICAgICAgfSkpO1xuXG4gICAgICAvLyBWYWxpZGF0ZSB0YWcga2V5IHBhdHRlcm46IF5bYS16QS1aMC05XFxzLl86Lz0rQC1dKiRcbiAgICAgIGNvbnN0IHZhbGlkS2V5UGF0dGVybiA9IC9eW2EtekEtWjAtOVxccy5fOi89K0AtXSokLztcbiAgICAgIGVycm9ycy5wdXNoKC4uLnZhbGlkYXRlRmllbGRQYXR0ZXJuKGtleSwgJ1RhZyBrZXknLCB2YWxpZEtleVBhdHRlcm4pKTtcblxuICAgICAgLy8gVmFsaWRhdGUgdGFnIHZhbHVlXG4gICAgICBlcnJvcnMucHVzaCguLi52YWxpZGF0ZVN0cmluZ0ZpZWxkTGVuZ3RoKHtcbiAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICBmaWVsZE5hbWU6ICdUYWcgdmFsdWUnLFxuICAgICAgICBtaW5MZW5ndGg6IEJST1dTRVJfVEFHX01JTl9MRU5HVEgsXG4gICAgICAgIG1heExlbmd0aDogQlJPV1NFUl9UQUdfTUFYX0xFTkdUSCxcbiAgICAgIH0pKTtcblxuICAgICAgLy8gVmFsaWRhdGUgdGFnIHZhbHVlIHBhdHRlcm46IF5bYS16QS1aMC05XFxzLl86Lz0rQC1dKiRcbiAgICAgIGNvbnN0IHZhbGlkVmFsdWVQYXR0ZXJuID0gL15bYS16QS1aMC05XFxzLl86Lz0rQC1dKiQvO1xuICAgICAgZXJyb3JzLnB1c2goLi4udmFsaWRhdGVGaWVsZFBhdHRlcm4odmFsdWUsICdUYWcgdmFsdWUnLCB2YWxpZFZhbHVlUGF0dGVybikpO1xuICAgIH1cblxuICAgIHJldHVybiBlcnJvcnM7XG4gIH07XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyB0aGUgcmVjb3JkaW5nIGNvbmZpZ3VyYXRpb25cbiAgICogQHBhcmFtIHJlY29yZGluZ0NvbmZpZyBUaGUgcmVjb3JkaW5nIGNvbmZpZ3VyYXRpb24gdG8gdmFsaWRhdGVcbiAgICogQHJldHVybnMgQXJyYXkgb2YgdmFsaWRhdGlvbiBlcnJvciBtZXNzYWdlcywgZW1wdHkgaWYgdmFsaWRcbiAgICovXG4gIHByaXZhdGUgX3ZhbGlkYXRlUmVjb3JkaW5nQ29uZmlnID0gKHJlY29yZGluZ0NvbmZpZz86IFJlY29yZGluZ0NvbmZpZyk6IHN0cmluZ1tdID0+IHtcbiAgICBsZXQgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGlmICghcmVjb3JkaW5nQ29uZmlnKSB7XG4gICAgICByZXR1cm4gZXJyb3JzOyAvLyBObyB2YWxpZGF0aW9uIG5lZWRlZCBpZiBubyByZWNvcmRpbmcgY29uZmlnIGlzIHByb3ZpZGVkXG4gICAgfVxuXG4gICAgY29uc3QgczNMb2NhdGlvbiA9IHJlY29yZGluZ0NvbmZpZy5zM0xvY2F0aW9uO1xuXG4gICAgLy8gT25seSB2YWxpZGF0ZSBTMyBsb2NhdGlvbiBpZiBpdCdzIGFjdHVhbGx5IHByb3ZpZGVkXG4gICAgaWYgKHMzTG9jYXRpb24pIHtcbiAgICAgIC8vIEJvdGggYnVja2V0IG5hbWUgYW5kIG9iamVjdCBrZXkgYXJlIHJlcXVpcmVkIHdoZW4gUzMgbG9jYXRpb24gaXMgcHJvdmlkZWRcbiAgICAgIGlmICghczNMb2NhdGlvbi5idWNrZXROYW1lKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKCdTMyBidWNrZXQgbmFtZSBpcyByZXF1aXJlZCB3aGVuIFMzIGxvY2F0aW9uIGlzIHByb3ZpZGVkIGZvciByZWNvcmRpbmcgY29uZmlndXJhdGlvbicpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVmFsaWRhdGUgYnVja2V0IG5hbWUgcGF0dGVybjogXlthLXowLTldW2EtejAtOS4tXXsxLDYxfVthLXowLTldJFxuICAgICAgICBjb25zdCBidWNrZXROYW1lUGF0dGVybiA9IC9eW2EtejAtOV1bYS16MC05Li1dezEsNjF9W2EtejAtOV0kLztcbiAgICAgICAgZXJyb3JzLnB1c2goLi4udmFsaWRhdGVGaWVsZFBhdHRlcm4oczNMb2NhdGlvbi5idWNrZXROYW1lLCAnUzMgYnVja2V0IG5hbWUnLCBidWNrZXROYW1lUGF0dGVybikpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXMzTG9jYXRpb24ub2JqZWN0S2V5KSB7XG4gICAgICAgIGVycm9ycy5wdXNoKCdTMyBvYmplY3Qga2V5IChwcmVmaXgpIGlzIHJlcXVpcmVkIHdoZW4gUzMgbG9jYXRpb24gaXMgcHJvdmlkZWQgZm9yIHJlY29yZGluZyBjb25maWd1cmF0aW9uJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGVycm9ycztcbiAgfTtcbn1cbiJdfQ==