@aws-cdk/aws-bedrock-agentcore-alpha 2.221.1-alpha.0 → 2.223.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 (33) hide show
  1. package/.jsii +3396 -138
  2. package/.jsii.tabl.json.gz +0 -0
  3. package/.warnings.jsii.js +69 -1
  4. package/README.md +327 -5
  5. package/agentcore/index.d.ts +4 -0
  6. package/agentcore/index.js +5 -1
  7. package/agentcore/memory/memory-strategy.d.ts +162 -0
  8. package/agentcore/memory/memory-strategy.js +174 -0
  9. package/agentcore/memory/memory.d.ts +531 -0
  10. package/agentcore/memory/memory.js +661 -0
  11. package/agentcore/memory/perms.d.ts +63 -0
  12. package/agentcore/memory/perms.js +90 -0
  13. package/agentcore/memory/strategies/managed-strategy.d.ts +130 -0
  14. package/agentcore/memory/strategies/managed-strategy.js +209 -0
  15. package/agentcore/memory/strategies/self-managed-strategy.d.ts +119 -0
  16. package/agentcore/memory/strategies/self-managed-strategy.js +254 -0
  17. package/agentcore/memory/validation-helpers.d.ts +41 -0
  18. package/agentcore/memory/validation-helpers.js +89 -0
  19. package/agentcore/network/network-configuration.js +4 -4
  20. package/agentcore/runtime/runtime-artifact.js +1 -1
  21. package/agentcore/runtime/runtime-authorizer-configuration.d.ts +4 -4
  22. package/agentcore/runtime/runtime-authorizer-configuration.js +13 -32
  23. package/agentcore/runtime/runtime-base.js +3 -13
  24. package/agentcore/runtime/runtime-endpoint-base.js +1 -1
  25. package/agentcore/runtime/runtime-endpoint.js +1 -1
  26. package/agentcore/runtime/runtime.d.ts +2 -2
  27. package/agentcore/runtime/runtime.js +16 -17
  28. package/agentcore/runtime/types.d.ts +5 -1
  29. package/agentcore/runtime/types.js +5 -1
  30. package/agentcore/tools/browser.js +2 -2
  31. package/agentcore/tools/code-interpreter.js +2 -2
  32. package/package.json +14 -7
  33. package/rosetta/default.ts-fixture +4 -0
@@ -0,0 +1,661 @@
1
+ "use strict";
2
+ var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
3
+ var useValue = arguments.length > 2;
4
+ for (var i = 0; i < initializers.length; i++) {
5
+ value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
6
+ }
7
+ return useValue ? value : void 0;
8
+ };
9
+ var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
10
+ function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
11
+ var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
12
+ var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
13
+ var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
14
+ var _, done = false;
15
+ for (var i = decorators.length - 1; i >= 0; i--) {
16
+ var context = {};
17
+ for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
18
+ for (var p in contextIn.access) context.access[p] = contextIn.access[p];
19
+ context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
20
+ var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
21
+ if (kind === "accessor") {
22
+ if (result === void 0) continue;
23
+ if (result === null || typeof result !== "object") throw new TypeError("Object expected");
24
+ if (_ = accept(result.get)) descriptor.get = _;
25
+ if (_ = accept(result.set)) descriptor.set = _;
26
+ if (_ = accept(result.init)) initializers.unshift(_);
27
+ }
28
+ else if (_ = accept(result)) {
29
+ if (kind === "field") initializers.unshift(_);
30
+ else descriptor[key] = _;
31
+ }
32
+ }
33
+ if (target) Object.defineProperty(target, contextIn.name, descriptor);
34
+ done = true;
35
+ };
36
+ Object.defineProperty(exports, "__esModule", { value: true });
37
+ exports.Memory = exports.MemoryBase = void 0;
38
+ const jsiiDeprecationWarnings = require("../../.warnings.jsii.js");
39
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
40
+ /**
41
+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
42
+ *
43
+ * Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance
44
+ * with the License. A copy of the License is located at
45
+ *
46
+ * http://www.apache.org/licenses/LICENSE-2.0
47
+ *
48
+ * or in the 'license' file accompanying this file. This file is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES
49
+ * OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions
50
+ * and limitations under the License.
51
+ */
52
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
53
+ const aws_bedrockagentcore_1 = require("aws-cdk-lib/aws-bedrockagentcore");
54
+ const aws_cloudwatch_1 = require("aws-cdk-lib/aws-cloudwatch");
55
+ const iam = require("aws-cdk-lib/aws-iam");
56
+ const kms = require("aws-cdk-lib/aws-kms");
57
+ const metadata_resource_1 = require("aws-cdk-lib/core/lib/metadata-resource");
58
+ const prop_injectable_1 = require("aws-cdk-lib/core/lib/prop-injectable");
59
+ const perms_1 = require("./perms");
60
+ const validation_helpers_1 = require("./validation-helpers");
61
+ /******************************************************************************
62
+ * CONSTANTS
63
+ *****************************************************************************/
64
+ /**
65
+ * Minimum length for browser name
66
+ * @internal
67
+ */
68
+ const MEMORY_NAME_MIN_LENGTH = 1;
69
+ /**
70
+ * Maximum length for browser name
71
+ * @internal
72
+ */
73
+ const MEMORY_NAME_MAX_LENGTH = 48;
74
+ /**
75
+ * Minimum length for browser tags
76
+ * @internal
77
+ */
78
+ const MEMORY_TAG_MIN_LENGTH = 1;
79
+ /**
80
+ * Maximum length for browser tags
81
+ * @internal
82
+ */
83
+ const MEMORY_TAG_MAX_LENGTH = 256;
84
+ /**
85
+ * Minimum length for memory expiration days
86
+ * @internal
87
+ */
88
+ const MEMORY_EXPIRATION_DAYS_MIN = 7;
89
+ /**
90
+ * Maximum length for memory expiration days
91
+ * @internal
92
+ */
93
+ const MEMORY_EXPIRATION_DAYS_MAX = 365;
94
+ /******************************************************************************
95
+ * ABSTRACT BASE CLASS
96
+ *****************************************************************************/
97
+ /**
98
+ * Abstract base class for a Memory.
99
+ * Contains methods and attributes valid for Memories either created with CDK or imported.
100
+ */
101
+ class MemoryBase extends aws_cdk_lib_1.Resource {
102
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-bedrock-agentcore-alpha.MemoryBase", version: "2.223.0-alpha.0" };
103
+ constructor(scope, id) {
104
+ super(scope, id);
105
+ }
106
+ /**
107
+ * Grants IAM actions to the IAM Principal
108
+ * @param grantee - The IAM principal to grant permissions to
109
+ * @param actions - The actions to grant
110
+ * @returns An IAM Grant object representing the granted permissions
111
+ */
112
+ grant(grantee, ...actions) {
113
+ return iam.Grant.addToPrincipal({
114
+ grantee,
115
+ actions,
116
+ resourceArns: [this.memoryArn],
117
+ scope: this,
118
+ });
119
+ }
120
+ /**
121
+ * Grant the given principal identity permissions to write content to short-term memory.
122
+ *
123
+ * @param grantee - The IAM principal to grant read permissions to
124
+ * @default - Default grant configuration:
125
+ * - actions: ['bedrock-agentcore:CreateEvent'] on this.memoryArn
126
+ * @returns An IAM Grant object representing the granted permissions
127
+ */
128
+ grantWrite(grantee) {
129
+ return this.grant(grantee, ...perms_1.MemoryPerms.STM.WRITE_PERMS);
130
+ }
131
+ /**
132
+ * Grant the given principal identity permissions to read the contents of this memory.
133
+ * Both Short-Term Memory (STM) and Long-Term Memory (LTM).
134
+ *
135
+ * @param grantee - The IAM principal to grant read permissions to
136
+ * @default - Default grant configuration:
137
+ * - actions: ['bedrock-agentcore:GetMemoryRecord',
138
+ 'bedrock-agentcore:RetrieveMemoryRecords',
139
+ 'bedrock-agentcore:ListMemoryRecords',
140
+ 'bedrock-agentcore:ListActors',
141
+ 'bedrock-agentcore:ListSessions] on this.memoryArn
142
+ * @returns An IAM Grant object representing the granted permissions
143
+ */
144
+ grantRead(grantee) {
145
+ return this.grant(grantee, ...perms_1.MemoryPerms.READ_PERMS);
146
+ }
147
+ /**
148
+ * Grant the given principal identity permissions to read the Short-Term Memory (STM) contents of this memory.
149
+ *
150
+ * @param grantee - The IAM principal to grant read permissions to
151
+ * @default - Default grant configuration:
152
+ * - actions: ['bedrock-agentcore:GetEvent',
153
+ 'bedrock-agentcore:ListEvents',
154
+ 'bedrock-agentcore:ListActors',
155
+ 'bedrock-agentcore:ListSessions',] on this.memoryArn
156
+ * @returns An IAM Grant object representing the granted permissions
157
+ */
158
+ grantReadShortTermMemory(grantee) {
159
+ return this.grant(grantee, ...perms_1.MemoryPerms.STM.READ_PERMS);
160
+ }
161
+ /**
162
+ * Grant the given principal identity permissions to read the Long-Term Memory (LTM) contents of this memory.
163
+ *
164
+ * @param grantee - The IAM principal to grant read permissions to
165
+ * @default - Default grant configuration:
166
+ * - actions: ['bedrock-agentcore:GetMemoryRecord',
167
+ 'bedrock-agentcore:RetrieveMemoryRecords',
168
+ 'bedrock-agentcore:ListMemoryRecords',
169
+ 'bedrock-agentcore:ListActors',
170
+ 'bedrock-agentcore:ListSessions',] on this.memoryArn
171
+ * @returns An IAM Grant object representing the granted permissions
172
+ */
173
+ grantReadLongTermMemory(grantee) {
174
+ return this.grant(grantee, ...perms_1.MemoryPerms.LTM.READ_PERMS);
175
+ }
176
+ /**
177
+ * Grant the given principal identity permissions to delete content on this memory.
178
+ *
179
+ * Both Short-Term Memory (STM) and Long-Term Memory (LTM).
180
+ *
181
+ * @param grantee - The IAM principal to grant delete permissions to
182
+ * @default - Default grant configuration:
183
+ * - actions: ['bedrock-agentcore:DeleteEvent',
184
+ 'bedrock-agentcore:DeleteMemoryRecord'] on this.memoryArn
185
+ * @returns An IAM Grant object representing the granted permissions
186
+ */
187
+ grantDelete(grantee) {
188
+ return this.grant(grantee, ...perms_1.MemoryPerms.DELETE_PERMS);
189
+ }
190
+ /**
191
+ * Grant the given principal identity permissions to delete Short-Term Memory (STM) content on this memory.
192
+ *
193
+ * @param grantee - The IAM principal to grant delete permissions to
194
+ * @default - Default grant configuration:
195
+ * - actions: ['bedrock-agentcore:DeleteEvent'] on this.memoryArn
196
+ * @returns An IAM Grant object representing the granted permissions
197
+ */
198
+ grantDeleteShortTermMemory(grantee) {
199
+ return this.grant(grantee, ...perms_1.MemoryPerms.STM.DELETE_PERMS);
200
+ }
201
+ /**
202
+ * Grant the given principal identity permissions to delete Long-Term Memory (LTM) content on this memory.
203
+ *
204
+ * @param grantee - The IAM principal to grant delete permissions to
205
+ * @default - Default grant configuration:
206
+ * - actions: ['bedrock-agentcore:DeleteMemoryRecord'] on this.memoryArn
207
+ * @returns An IAM Grant object representing the granted permissions
208
+ */
209
+ grantDeleteLongTermMemory(grantee) {
210
+ return this.grant(grantee, ...perms_1.MemoryPerms.LTM.DELETE_PERMS);
211
+ }
212
+ /**
213
+ * Grant the given principal identity permissions to manage the control plane of this memory.
214
+ *
215
+ * @param grantee - The IAM principal to grant admin permissions to
216
+ * @default - Default grant configuration:
217
+ * - actions: ['bedrock-agentcore:CreateMemory',
218
+ 'bedrock-agentcore:GetMemory',
219
+ 'bedrock-agentcore:DeleteMemory',
220
+ 'bedrock-agentcore:UpdateMemory'] on this.memoryArn
221
+ * @returns An IAM Grant object representing the granted permissions
222
+ */
223
+ grantAdmin(grantee) {
224
+ return this.grant(grantee, ...perms_1.MemoryPerms.ADMIN_PERMS);
225
+ }
226
+ /**
227
+ * Grant the given principal identity permissions to do every action on this memory.
228
+ *
229
+ * @param grantee - The IAM principal to grant full access permissions to
230
+ * @default - Default grant configuration:
231
+ * - actions: ['bedrock-agentcore:CreateEvent',
232
+ 'bedrock-agentcore:GetEvent',
233
+ 'bedrock-agentcore:DeleteEvent',
234
+ 'bedrock-agentcore:GetMemoryRecord',
235
+ 'bedrock-agentcore:RetrieveMemoryRecords',
236
+ 'bedrock-agentcore:ListMemoryRecords',
237
+ 'bedrock-agentcore:ListActors',
238
+ 'bedrock-agentcore:ListSessions',
239
+ 'bedrock-agentcore:CreateMemory',
240
+ 'bedrock-agentcore:GetMemory',
241
+ 'bedrock-agentcore:DeleteMemory',
242
+ 'bedrock-agentcore:UpdateMemory'] on this.memoryArn
243
+ * @returns An IAM Grant object representing the granted permissions
244
+ */
245
+ grantFullAccess(grantee) {
246
+ return this.grant(grantee, ...perms_1.MemoryPerms.FULL_ACCESS_PERMS);
247
+ }
248
+ // ------------------------------------------------------
249
+ // Metrics
250
+ // ------------------------------------------------------
251
+ /**
252
+ * Return the given named metric for this memory.
253
+ *
254
+ * By default, the metric will be calculated as a sum over a period of 5 minutes.
255
+ * You can customize this by using the `statistic` and `period` properties.
256
+ */
257
+ metric(metricName, dimensions, props) {
258
+ const metricProps = {
259
+ namespace: 'AWS/Bedrock-AgentCore',
260
+ metricName,
261
+ dimensionsMap: { ...dimensions, Resource: this.memoryArn },
262
+ ...props,
263
+ };
264
+ return this.configureMetric(metricProps);
265
+ }
266
+ /**
267
+ * Return the given named metric related to the API operation performed on this memory.
268
+ */
269
+ metricForApiOperation(metricName, operation, props) {
270
+ return this.metric(metricName, { Operation: operation }, props);
271
+ }
272
+ /**
273
+ * Return a metric measuring the latency of a specific API operation performed on this memory.
274
+ *
275
+ * The latency metric represents the total time elapsed between receiving the request and sending
276
+ * the final response token, measuring complete end-to-end processing time.
277
+ *
278
+ * For memory creation events specifically, this measures the time from the last CreateEvent
279
+ * that met strategy criteria until memory storage is completed.
280
+ *
281
+ */
282
+ metricLatencyForApiOperation(operation, props) {
283
+ return this.metricForApiOperation('Latency', operation, { statistic: aws_cloudwatch_1.Stats.AVERAGE, ...props });
284
+ }
285
+ /**
286
+ * Return a metric containing the total number of API requests made for a specific memory operation like
287
+ * `CreateEvent`, `ListEvents`, `RetrieveMemoryRecords` ...
288
+ */
289
+ metricInvocationsForApiOperation(operation, props) {
290
+ return this.metricForApiOperation('Invocations', operation, {
291
+ statistic: aws_cloudwatch_1.Stats.SUM,
292
+ ...props,
293
+ });
294
+ }
295
+ /**
296
+ * Return a metric containing the number of errors for a specific API operation performed on this memory.
297
+ */
298
+ metricErrorsForApiOperation(operation, props) {
299
+ return this.metricForApiOperation('Errors', operation, { statistic: aws_cloudwatch_1.Stats.SUM, ...props });
300
+ }
301
+ /**
302
+ * Returns the metric containing the number of short-term memory events.
303
+ */
304
+ metricEventCreationCount(props) {
305
+ return this.metric('CreationCount', { ItemType: 'Event' }, { statistic: aws_cloudwatch_1.Stats.SUM, ...props });
306
+ }
307
+ /**
308
+ * Returns the metric containing the number of long-term memory records
309
+ * created by the long-term extraction strategies.
310
+ */
311
+ metricMemoryRecordCreationCount(props) {
312
+ return this.metric('CreationCount', { ItemType: 'MemoryRecordsExtracted' }, { statistic: aws_cloudwatch_1.Stats.SUM, ...props });
313
+ }
314
+ /**
315
+ * Internal method to create a metric.
316
+ */
317
+ configureMetric(props) {
318
+ return new aws_cloudwatch_1.Metric({
319
+ ...props,
320
+ region: props?.region ?? this.stack.region,
321
+ account: props?.account ?? this.stack.account,
322
+ });
323
+ }
324
+ }
325
+ exports.MemoryBase = MemoryBase;
326
+ /******************************************************************************
327
+ * Class
328
+ *****************************************************************************/
329
+ /**
330
+ * Long-term memory store for extracted insights like user preferences, semantic facts and summaries.
331
+ * Enables knowledge retention across sessions by storing user preferences (e.g. coding style),
332
+ * semantic facts (e.g. learned info) and interaction summaries for context optimization.
333
+ *
334
+ * @see https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/memory.html
335
+ * @resource AWS::BedrockAgentCore::Memory
336
+ */
337
+ let Memory = (() => {
338
+ let _classDecorators = [prop_injectable_1.propertyInjectable];
339
+ let _classDescriptor;
340
+ let _classExtraInitializers = [];
341
+ let _classThis;
342
+ let _classSuper = MemoryBase;
343
+ let _instanceExtraInitializers = [];
344
+ let _addMemoryStrategy_decorators;
345
+ var Memory = class extends _classSuper {
346
+ static { _classThis = this; }
347
+ static {
348
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
349
+ _addMemoryStrategy_decorators = [(0, metadata_resource_1.MethodMetadata)()];
350
+ __esDecorate(this, null, _addMemoryStrategy_decorators, { kind: "method", name: "addMemoryStrategy", static: false, private: false, access: { has: obj => "addMemoryStrategy" in obj, get: obj => obj.addMemoryStrategy }, metadata: _metadata }, null, _instanceExtraInitializers);
351
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
352
+ Memory = _classThis = _classDescriptor.value;
353
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
354
+ }
355
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-bedrock-agentcore-alpha.Memory", version: "2.223.0-alpha.0" };
356
+ /** Uniquely identifies this class. */
357
+ static PROPERTY_INJECTION_ID = '@aws-cdk.aws-bedrock-agentcore-alpha.Memory';
358
+ /**
359
+ * Static Method for importing an existing Bedrock AgentCore Memory.
360
+ */
361
+ /**
362
+ * Creates an Memory reference from an existing memory's attributes.
363
+ *
364
+ * @param scope - The construct scope
365
+ * @param id - Identifier of the construct
366
+ * @param attrs - Attributes of the existing browser custom
367
+ * @returns An IBrowserCustom reference to the existing browser
368
+ */
369
+ static fromMemoryAttributes(scope, id, attrs) {
370
+ try {
371
+ jsiiDeprecationWarnings._aws_cdk_aws_bedrock_agentcore_alpha_MemoryAttributes(attrs);
372
+ }
373
+ catch (error) {
374
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
375
+ Error.captureStackTrace(error, this.fromMemoryAttributes);
376
+ }
377
+ throw error;
378
+ }
379
+ class Import extends MemoryBase {
380
+ memoryArn = attrs.memoryArn;
381
+ memoryId = aws_cdk_lib_1.Arn.split(attrs.memoryArn, aws_cdk_lib_1.ArnFormat.SLASH_RESOURCE_NAME).resourceName;
382
+ executionRole = iam.Role.fromRoleArn(scope, `${id}Role`, attrs.roleArn);
383
+ kmsKey = attrs.kmsKeyArn ? kms.Key.fromKeyArn(scope, `${id}Key`, attrs.kmsKeyArn) : undefined;
384
+ updatedAt = attrs.updatedAt;
385
+ grantPrincipal = this.executionRole;
386
+ status = attrs.status;
387
+ createdAt = attrs.createdAt;
388
+ constructor(s, i) {
389
+ super(s, i);
390
+ this.grantPrincipal = this.executionRole || new iam.UnknownPrincipal({ resource: this });
391
+ }
392
+ }
393
+ // Return new Memory
394
+ return new Import(scope, id);
395
+ }
396
+ // ------------------------------------------------------
397
+ // Attributes
398
+ // ------------------------------------------------------
399
+ /**
400
+ * The ARN of the memory resource.
401
+ * @attribute
402
+ */
403
+ memoryArn = __runInitializers(this, _instanceExtraInitializers);
404
+ /**
405
+ * The name of the memory.
406
+ * @attribute
407
+ */
408
+ memoryName;
409
+ /**
410
+ * The id of the memory.
411
+ * @attribute
412
+ */
413
+ memoryId;
414
+ /**
415
+ * The expiration days of the memory.
416
+ */
417
+ expirationDuration;
418
+ /**
419
+ * The failure reason of the browser
420
+ * @attribute
421
+ */
422
+ failureReason;
423
+ /**
424
+ * The description of the memory.
425
+ */
426
+ description;
427
+ /**
428
+ * The execution role of the memory.
429
+ */
430
+ executionRole;
431
+ /**
432
+ * The status of the memory.
433
+ */
434
+ status;
435
+ /**
436
+ * The created timestamp of the memory.
437
+ */
438
+ createdAt;
439
+ /**
440
+ * The updated at timestamp of the memory.
441
+ */
442
+ updatedAt;
443
+ /**
444
+ * Tags applied to this browser resource
445
+ * A map of key-value pairs for resource tagging
446
+ * @default - No tags applied
447
+ */
448
+ tags;
449
+ /**
450
+ * The principal to grant permissions to
451
+ */
452
+ grantPrincipal;
453
+ /**
454
+ * The KMS key used to encrypt the memory.
455
+ */
456
+ kmsKey;
457
+ /**
458
+ * The memory strategies used by the memory.
459
+ * @attribute
460
+ */
461
+ memoryStrategies = [];
462
+ // ------------------------------------------------------
463
+ // Internal Only
464
+ // ------------------------------------------------------
465
+ __resource;
466
+ // ------------------------------------------------------
467
+ // CONSTRUCTOR
468
+ // ------------------------------------------------------
469
+ constructor(scope, id, props) {
470
+ super(scope, id);
471
+ try {
472
+ jsiiDeprecationWarnings._aws_cdk_aws_bedrock_agentcore_alpha_MemoryProps(props);
473
+ }
474
+ catch (error) {
475
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
476
+ Error.captureStackTrace(error, Memory);
477
+ }
478
+ throw error;
479
+ }
480
+ // Enhanced CDK Analytics Telemetry
481
+ (0, metadata_resource_1.addConstructMetadata)(this, props);
482
+ // ------------------------------------------------------
483
+ // Set properties and defaults
484
+ // ------------------------------------------------------
485
+ this.memoryName = props.memoryName;
486
+ this.expirationDuration = props.expirationDuration ?? aws_cdk_lib_1.Duration.days(90);
487
+ this.description = props.description;
488
+ this.kmsKey = props.kmsKey;
489
+ this.executionRole = props.executionRole ?? this._createMemoryRole();
490
+ this.grantPrincipal = this.executionRole;
491
+ this.tags = props.tags;
492
+ // ------------------------------------------------------
493
+ // Permissions
494
+ // ------------------------------------------------------
495
+ // For KMS permissions see https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/storage-encryption.html
496
+ if (this.kmsKey) {
497
+ this.kmsKey.grant(this.executionRole, 'kms:CreateGrant', 'kms:Decrypt', 'kms:DescribeKey', 'kms:GenerateDataKey', 'kms:GenerateDataKeyWithoutPlaintext', 'kms:ReEncrypt*');
498
+ }
499
+ // ------------------------------------------------------
500
+ // Validations
501
+ // ------------------------------------------------------
502
+ // Validate memory name
503
+ (0, validation_helpers_1.throwIfInvalid)(this._validateMemoryName, this.memoryName, this);
504
+ // Validate expiration duration
505
+ (0, validation_helpers_1.throwIfInvalid)(this._validateMemoryExpirationDays, this.expirationDuration.toDays());
506
+ // Validate memory tags
507
+ (0, validation_helpers_1.throwIfInvalid)(this._validateMemoryTags, this.tags, this);
508
+ // Memory strategies are already validated when building them, so no need to validate them here
509
+ // ------------------------------------------------------
510
+ // CFN Props - With Lazy support
511
+ // ------------------------------------------------------
512
+ const cfnProps = {
513
+ name: this.memoryName,
514
+ description: this.description,
515
+ eventExpiryDuration: this.expirationDuration.toDays(),
516
+ encryptionKeyArn: this.kmsKey?.keyArn,
517
+ memoryExecutionRoleArn: this.executionRole?.roleArn,
518
+ memoryStrategies: aws_cdk_lib_1.Lazy.any({ produce: () => this._renderMemoryStrategies() }, { omitEmptyArray: true }),
519
+ tags: this.tags,
520
+ };
521
+ // ------------------------------------------------------
522
+ // CFN Resource
523
+ // ------------------------------------------------------
524
+ this.__resource = new aws_bedrockagentcore_1.CfnMemory(this, 'Memory', cfnProps);
525
+ this.memoryId = this.__resource.attrMemoryId;
526
+ this.memoryArn = this.__resource.attrMemoryArn;
527
+ this.status = this.__resource.attrStatus;
528
+ this.updatedAt = this.__resource.attrUpdatedAt;
529
+ this.createdAt = this.__resource.attrCreatedAt;
530
+ this.failureReason = this.__resource.attrFailureReason;
531
+ // Add memory strategies to the memory
532
+ for (const strategy of props.memoryStrategies ?? []) {
533
+ this.addMemoryStrategy(strategy);
534
+ }
535
+ }
536
+ // ------------------------------------------------------
537
+ // HELPER METHODS - addX()
538
+ // ------------------------------------------------------
539
+ /**
540
+ * Add memory strategy to the memory.
541
+ * @default - No memory strategies.
542
+ */
543
+ addMemoryStrategy(memoryStrategy) {
544
+ try {
545
+ jsiiDeprecationWarnings._aws_cdk_aws_bedrock_agentcore_alpha_IMemoryStrategy(memoryStrategy);
546
+ }
547
+ catch (error) {
548
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
549
+ Error.captureStackTrace(error, this.addMemoryStrategy);
550
+ }
551
+ throw error;
552
+ }
553
+ // Add the memory strategy to the memory
554
+ this.memoryStrategies.push(memoryStrategy);
555
+ // Grant necessary permissions to the execution role
556
+ const grant = memoryStrategy.grant(this.executionRole);
557
+ grant?.applyBefore(this.__resource);
558
+ }
559
+ /**
560
+ * Creates execution role needed for the memory to access AWS services
561
+ * @returns The created role
562
+ * @internal This is an internal core function and should not be called directly.
563
+ */
564
+ _createMemoryRole() {
565
+ const role = new iam.Role(this, 'ServiceRole', {
566
+ assumedBy: new iam.ServicePrincipal('bedrock-agentcore.amazonaws.com'),
567
+ });
568
+ return role;
569
+ }
570
+ // ------------------------------------------------------
571
+ // VALIDATORS
572
+ // ------------------------------------------------------
573
+ /**
574
+ * Validates the memory tags format
575
+ * @param tags The tags object to validate
576
+ * @returns Array of validation error messages, empty if valid
577
+ */
578
+ _validateMemoryTags = (tags, scope) => {
579
+ let errors = [];
580
+ if (!tags) {
581
+ return errors; // Tags are optional
582
+ }
583
+ // Validate each tag key and value
584
+ for (const [key, value] of Object.entries(tags)) {
585
+ errors.push(...(0, validation_helpers_1.validateStringFieldLength)({
586
+ value: key,
587
+ fieldName: 'Tag key',
588
+ minLength: MEMORY_TAG_MIN_LENGTH,
589
+ maxLength: MEMORY_TAG_MAX_LENGTH,
590
+ }, scope));
591
+ // Validate tag key pattern: ^[a-zA-Z0-9\s._:/=+@-]*$
592
+ const validKeyPattern = /^[a-zA-Z0-9\s._:/=+@-]*$/;
593
+ errors.push(...(0, validation_helpers_1.validateFieldPattern)(key, 'Tag key', validKeyPattern, undefined, scope));
594
+ // Validate tag value
595
+ errors.push(...(0, validation_helpers_1.validateStringFieldLength)({
596
+ value: value,
597
+ fieldName: 'Tag value',
598
+ minLength: MEMORY_TAG_MIN_LENGTH,
599
+ maxLength: MEMORY_TAG_MAX_LENGTH,
600
+ }, scope));
601
+ // Validate tag value pattern: ^[a-zA-Z0-9\s._:/=+@-]*$
602
+ const validValuePattern = /^[a-zA-Z0-9\s._:/=+@-]*$/;
603
+ errors.push(...(0, validation_helpers_1.validateFieldPattern)(value, 'Tag value', validValuePattern, undefined, scope));
604
+ }
605
+ return errors;
606
+ };
607
+ /**
608
+ * Validates the memory name format
609
+ * @param name The memory name to validate
610
+ * @returns Array of validation error messages, empty if valid
611
+ */
612
+ _validateMemoryName = (name, scope) => {
613
+ let errors = [];
614
+ errors.push(...(0, validation_helpers_1.validateStringFieldLength)({
615
+ value: name,
616
+ fieldName: 'Memory name',
617
+ minLength: MEMORY_NAME_MIN_LENGTH,
618
+ maxLength: MEMORY_NAME_MAX_LENGTH,
619
+ }, scope));
620
+ // Check if name matches the AWS API pattern: [a-zA-Z][a-zA-Z0-9_]{0,47}
621
+ // Must start with a letter, followed by up to 47 letters, numbers, or underscores
622
+ const validNamePattern = /^[a-zA-Z][a-zA-Z0-9_]{0,47}$/;
623
+ errors.push(...(0, validation_helpers_1.validateFieldPattern)(name, 'Memory name', validNamePattern, undefined, scope));
624
+ return errors;
625
+ };
626
+ /**
627
+ * Validates the memory expiration days
628
+ * @param expirationDays The memory expiration days to validate
629
+ * @returns Array of validation error messages, empty if valid
630
+ */
631
+ _validateMemoryExpirationDays = (expirationDays) => {
632
+ let errors = [];
633
+ if (expirationDays < MEMORY_EXPIRATION_DAYS_MIN || expirationDays > MEMORY_EXPIRATION_DAYS_MAX) {
634
+ errors.push(`Memory expiration days must be between ${MEMORY_EXPIRATION_DAYS_MIN} and ${MEMORY_EXPIRATION_DAYS_MAX}`);
635
+ }
636
+ return errors;
637
+ };
638
+ // ------------------------------------------------------
639
+ // RENDERERS
640
+ // ------------------------------------------------------
641
+ /**
642
+ * Render the memory strategies.
643
+ *
644
+ * @returns Array of MemoryStrategyProperty objects in CloudFormation format, or undefined if no strategies are defined
645
+ * @default - undefined if no strategies are defined or array is empty
646
+ * @internal This is an internal core function and should not be called directly.
647
+ */
648
+ _renderMemoryStrategies() {
649
+ if (!this.memoryStrategies || this.memoryStrategies.length === 0) {
650
+ return undefined;
651
+ }
652
+ return this.memoryStrategies.map(ms => ms.render());
653
+ }
654
+ static {
655
+ __runInitializers(_classThis, _classExtraInitializers);
656
+ }
657
+ };
658
+ return Memory = _classThis;
659
+ })();
660
+ exports.Memory = Memory;
661
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVtb3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsibWVtb3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOzs7Ozs7Ozs7OztHQVdHO0FBRUgsNkNBQWtGO0FBR2xGLDJFQUE2RTtBQUM3RSwrREFNb0M7QUFDcEMsMkNBQTJDO0FBQzNDLDJDQUEyQztBQUMzQyw4RUFBOEY7QUFDOUYsMEVBQTBFO0FBRzFFLG1DQUFzQztBQUN0Qyw2REFBdUc7QUFFdkc7OytFQUUrRTtBQUMvRTs7O0dBR0c7QUFDSCxNQUFNLHNCQUFzQixHQUFHLENBQUMsQ0FBQztBQUVqQzs7O0dBR0c7QUFDSCxNQUFNLHNCQUFzQixHQUFHLEVBQUUsQ0FBQztBQUVsQzs7O0dBR0c7QUFDSCxNQUFNLHFCQUFxQixHQUFHLENBQUMsQ0FBQztBQUVoQzs7O0dBR0c7QUFDSCxNQUFNLHFCQUFxQixHQUFHLEdBQUcsQ0FBQztBQUVsQzs7O0dBR0c7QUFDSCxNQUFNLDBCQUEwQixHQUFHLENBQUMsQ0FBQztBQUNyQzs7O0dBR0c7QUFDSCxNQUFNLDBCQUEwQixHQUFHLEdBQUcsQ0FBQztBQWlIdkM7OytFQUUrRTtBQUMvRTs7O0dBR0c7QUFDSCxNQUFzQixVQUFXLFNBQVEsc0JBQVE7O0lBYS9DLFlBQVksS0FBZ0IsRUFBRSxFQUFVO1FBQ3RDLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7S0FDbEI7SUFDRDs7Ozs7T0FLRztJQUNILEtBQUssQ0FBQyxPQUF1QixFQUFFLEdBQUcsT0FBaUI7UUFDakQsT0FBTyxHQUFHLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQztZQUM5QixPQUFPO1lBQ1AsT0FBTztZQUNQLFlBQVksRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7WUFDOUIsS0FBSyxFQUFFLElBQUk7U0FDWixDQUFDLENBQUM7S0FDSjtJQUNEOzs7Ozs7O09BT0c7SUFDSCxV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TSIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogIENvcHlyaWdodCBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpLiBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4gKiAgd2l0aCB0aGUgTGljZW5zZS4gQSBjb3B5IG9mIHRoZSBMaWNlbnNlIGlzIGxvY2F0ZWQgYXRcbiAqXG4gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqICBvciBpbiB0aGUgJ2xpY2Vuc2UnIGZpbGUgYWNjb21wYW55aW5nIHRoaXMgZmlsZS4gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICdBUyBJUycgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFU1xuICogIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zXG4gKiAgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IEFybiwgQXJuRm9ybWF0LCBEdXJhdGlvbiwgSVJlc291cmNlLCBMYXp5LCBSZXNvdXJjZSB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IElDb25zdHJ1Y3QsIENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0ICogYXMgYmVkcm9ja2FnZW50Y29yZSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtYmVkcm9ja2FnZW50Y29yZSc7XG5pbXBvcnQgeyBDZm5NZW1vcnksIENmbk1lbW9yeVByb3BzIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWJlZHJvY2thZ2VudGNvcmUnO1xuaW1wb3J0IHtcbiAgRGltZW5zaW9uc01hcCxcbiAgTWV0cmljLFxuICBNZXRyaWNPcHRpb25zLFxuICBNZXRyaWNQcm9wcyxcbiAgU3RhdHMsXG59IGZyb20gJ2F3cy1jZGstbGliL2F3cy1jbG91ZHdhdGNoJztcbmltcG9ydCAqIGFzIGlhbSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcbmltcG9ydCAqIGFzIGttcyBmcm9tICdhd3MtY2RrLWxpYi9hd3Mta21zJztcbmltcG9ydCB7IGFkZENvbnN0cnVjdE1ldGFkYXRhLCBNZXRob2RNZXRhZGF0YSB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUvbGliL21ldGFkYXRhLXJlc291cmNlJztcbmltcG9ydCB7IHByb3BlcnR5SW5qZWN0YWJsZSB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUvbGliL3Byb3AtaW5qZWN0YWJsZSc7XG4vLyBJbnRlcm5hbCBMaWJzXG5pbXBvcnQgeyBJTWVtb3J5U3RyYXRlZ3kgfSBmcm9tICcuL21lbW9yeS1zdHJhdGVneSc7XG5pbXBvcnQgeyBNZW1vcnlQZXJtcyB9IGZyb20gJy4vcGVybXMnO1xuaW1wb3J0IHsgdmFsaWRhdGVGaWVsZFBhdHRlcm4sIHZhbGlkYXRlU3RyaW5nRmllbGRMZW5ndGgsIHRocm93SWZJbnZhbGlkIH0gZnJvbSAnLi92YWxpZGF0aW9uLWhlbHBlcnMnO1xuXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlNUQU5UU1xuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqXG4gKiBNaW5pbXVtIGxlbmd0aCBmb3IgYnJvd3NlciBuYW1lXG4gKiBAaW50ZXJuYWxcbiAqL1xuY29uc3QgTUVNT1JZX05BTUVfTUlOX0xFTkdUSCA9IDE7XG5cbi8qKlxuICogTWF4aW11bSBsZW5ndGggZm9yIGJyb3dzZXIgbmFtZVxuICogQGludGVybmFsXG4gKi9cbmNvbnN0IE1FTU9SWV9OQU1FX01BWF9MRU5HVEggPSA0ODtcblxuLyoqXG4gKiBNaW5pbXVtIGxlbmd0aCBmb3IgYnJvd3NlciB0YWdzXG4gKiBAaW50ZXJuYWxcbiAqL1xuY29uc3QgTUVNT1JZX1RBR19NSU5fTEVOR1RIID0gMTtcblxuLyoqXG4gKiBNYXhpbXVtIGxlbmd0aCBmb3IgYnJvd3NlciB0YWdzXG4gKiBAaW50ZXJuYWxcbiAqL1xuY29uc3QgTUVNT1JZX1RBR19NQVhfTEVOR1RIID0gMjU2O1xuXG4vKipcbiAqIE1pbmltdW0gbGVuZ3RoIGZvciBtZW1vcnkgZXhwaXJhdGlvbiBkYXlzXG4gKiBAaW50ZXJuYWxcbiAqL1xuY29uc3QgTUVNT1JZX0VYUElSQVRJT05fREFZU19NSU4gPSA3O1xuLyoqXG4gKiBNYXhpbXVtIGxlbmd0aCBmb3IgbWVtb3J5IGV4cGlyYXRpb24gZGF5c1xuICogQGludGVybmFsXG4gKi9cbmNvbnN0IE1FTU9SWV9FWFBJUkFUSU9OX0RBWVNfTUFYID0gMzY1O1xuXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZXJmYWNlXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKipcbiAqIEludGVyZmFjZSBmb3IgTWVtb3J5IHJlc291cmNlc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIElNZW1vcnkgZXh0ZW5kcyBJUmVzb3VyY2UsIGlhbS5JR3JhbnRhYmxlIHtcbiAgLyoqXG4gICAqIFRoZSBBUk4gb2YgdGhlIG1lbW9yeSByZXNvdXJjZVxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBtZW1vcnlBcm46IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBpZCBvZiB0aGUgbWVtb3J5XG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IG1lbW9yeUlkOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgSUFNIHJvbGUgdGhhdCBwcm92aWRlcyBwZXJtaXNzaW9ucyBmb3IgdGhlIG1lbW9yeSB0byBhY2Nlc3MgQVdTIHNlcnZpY2VzLlxuICAgKi9cbiAgcmVhZG9ubHkgZXhlY3V0aW9uUm9sZT86IGlhbS5JUm9sZTtcbiAgLyoqXG4gICAqIEN1c3RvbSBLTVMga2V5IGZvciBlbmNyeXB0aW9uIChpZiBwcm92aWRlZClcbiAgICovXG4gIHJlYWRvbmx5IGttc0tleT86IGttcy5JS2V5O1xuICAvKipcbiAgICogVGhlIHN0YXR1cyBvZiB0aGUgbWVtb3J5XG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IHN0YXR1cz86IHN0cmluZztcbiAgLyoqXG4gICAqIFRpbWVzdGFtcCB3aGVuIHRoZSBtZW1vcnkgd2FzIGxhc3QgdXBkYXRlZFxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSB1cGRhdGVkQXQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaW1lc3RhbXAgd2hlbiB0aGUgbWVtb3J5IHdhcyBjcmVhdGVkXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IGNyZWF0ZWRBdD86IHN0cmluZztcbiAgLyoqXG4gICAqIEdyYW50IHRoZSBnaXZlbiBwcmluY2lwYWwgaWRlbnRpdHkgcGVybWlzc2lvbnMgdG8gcGVyZm9ybSBhY3Rpb25zIG9uIHRoaXMgbWVtb3J5LlxuICAgKi9cbiAgZ3JhbnQoZ3JhbnRlZTogaWFtLklHcmFudGFibGUsIC4uLmFjdGlvbnM6IHN0cmluZ1tdKTogaWFtLkdyYW50O1xuICAvKipcbiAgICogR3JhbnQgdGhlIGdpdmVuIHByaW5jaXBhbCBpZGVudGl0eSBwZXJtaXNzaW9ucyB0byB3cml0ZSBjb250ZW50IHRvIHRoaXMgbWVtb3J5LlxuICAgKi9cbiAgZ3JhbnRXcml0ZShncmFudGVlOiBpYW0uSUdyYW50YWJsZSk6IGlhbS5HcmFudDtcbiAgLyoqXG4gICAqIEdyYW50IHRoZSBnaXZlbiBwcmluY2lwYWwgaWRlbnRpdHkgcGVybWlzc2lvbnMgdG8gcmVhZCB0aGUgY29udGVudHMgb2YgdGhpcyBtZW1vcnkuXG4gICAqIEJvdGggU2hvcnQtVGVybSBNZW1vcnkgKFNUTSkgYW5kIExvbmctVGVybSBNZW1vcnkgKExUTSkuXG4gICAqL1xuICBncmFudFJlYWQoZ3JhbnRlZTogaWFtLklHcmFudGFibGUpOiBpYW0uR3JhbnQ7XG4gIC8qKlxuICAgKiBHcmFudCB0aGUgZ2l2ZW4gcHJpbmNpcGFsIGlkZW50aXR5IHBlcm1pc3Npb25zIHRvIHJlYWQgdGhlIFNob3J0LVRlcm0gTWVtb3J5IChTVE0pIGNvbnRlbnRzIG9mIHRoaXMgbWVtb3J5LlxuICAgKi9cbiAgZ3JhbnRSZWFkU2hvcnRUZXJtTWVtb3J5KGdyYW50ZWU6IGlhbS5JR3JhbnRhYmxlKTogaWFtLkdyYW50O1xuICAvKipcbiAgICogR3JhbnQgdGhlIGdpdmVuIHByaW5jaXBhbCBpZGVudGl0eSBwZXJtaXNzaW9ucyB0byByZWFkIHRoZSBMb25nLVRlcm0gTWVtb3J5IChMVE0pIGNvbnRlbnRzIG9mIHRoaXMgbWVtb3J5LlxuICAgKi9cbiAgZ3JhbnRSZWFkTG9uZ1Rlcm1NZW1vcnkoZ3JhbnRlZTogaWFtLklHcmFudGFibGUpOiBpYW0uR3JhbnQ7XG4gIC8qKlxuICAgKiBHcmFudCB0aGUgZ2l2ZW4gcHJpbmNpcGFsIGlkZW50aXR5IHBlcm1pc3Npb25zIHRvIGRlbGV0ZSBjb250ZW50IG9uIHRoaXMgbWVtb3J5LlxuICAgKi9cbiAgZ3JhbnREZWxldGUoZ3JhbnRlZTogaWFtLklHcmFudGFibGUpOiBpYW0uR3JhbnQ7XG4gIC8qKlxuICAgKiBHcmFudCB0aGUgZ2l2ZW4gcHJpbmNpcGFsIGlkZW50aXR5IHBlcm1pc3Npb25zIHRvIGRlbGV0ZSBTaG9ydC1UZXJtIE1lbW9yeSAoU1RNKSBjb250ZW50IG9uIHRoaXMgbWVtb3J5LlxuICAgKi9cbiAgZ3JhbnREZWxldGVTaG9ydFRlcm1NZW1vcnkoZ3JhbnRlZTogaWFtLklHcmFudGFibGUpOiBpYW0uR3JhbnQ7XG4gIC8qKlxuICAgKiBHcmFudCB0aGUgZ2l2ZW4gcHJpbmNpcGFsIGlkZW50aXR5IHBlcm1pc3Npb25zIHRvIGRlbGV0ZSBMb25nLVRlcm0gTWVtb3J5IChMVE0pIGNvbnRlbnQgb24gdGhpcyBtZW1vcnkuXG4gICAqL1xuICBncmFudERlbGV0ZUxvbmdUZXJtTWVtb3J5KGdyYW50ZWU6IGlhbS5JR3JhbnRhYmxlKTogaWFtLkdyYW50O1xuICAvKipcbiAgICogR3JhbnQgdGhlIGdpdmVuIHByaW5jaXBhbCBpZGVudGl0eSBwZXJtaXNzaW9ucyB0byBtYW5hZ2UgdGhlIGNvbnRyb2wgcGxhbmUgb2YgdGhpcyBtZW1vcnkuXG4gICAqL1xuICBncmFudEFkbWluKGdyYW50ZWU6IGlhbS5JR3JhbnRhYmxlKTogaWFtLkdyYW50O1xuICAvKipcbiAgICogR3JhbnQgdGhlIGdpdmVuIHByaW5jaXBhbCBpZGVudGl0eSBwZXJtaXNzaW9ucyB0byBkbyBldmVyeSBhY3Rpb24gb24gdGhpcyBtZW1vcnkuXG4gICAqL1xuICBncmFudEZ1bGxBY2Nlc3MoZ3JhbnRlZTogaWFtLklHcmFudGFibGUpOiBpYW0uR3JhbnQ7XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIE1ldHJpY3NcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIGdpdmVuIG5hbWVkIG1ldHJpYyBmb3IgdGhpcyBtZW1vcnkuXG4gICAqL1xuICBtZXRyaWMobWV0cmljTmFtZTogc3RyaW5nLCBkaW1lbnNpb25zOiBEaW1lbnNpb25zTWFwLCBwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWM7XG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIGdpdmVuIG5hbWVkIG1ldHJpYyByZWxhdGVkIHRvIHRoZSBBUEkgb3BlcmF0aW9uIHBlcmZvcm1lZCBvbiB0aGlzIG1lbW9yeS5cbiAgICovXG4gIG1ldHJpY0ZvckFwaU9wZXJhdGlvbihtZXRyaWNOYW1lOiBzdHJpbmcsIG9wZXJhdGlvbjogc3RyaW5nLCBwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWM7XG4gIC8qKlxuICAgKiBSZXR1cm4gYSBtZXRyaWMgbWVhc3VyaW5nIHRoZSBsYXRlbmN5IG9mIGEgc3BlY2lmaWMgQVBJIG9wZXJhdGlvbiBwZXJmb3JtZWQgb24gdGhpcyBtZW1vcnkuXG4gICAqL1xuICBtZXRyaWNMYXRlbmN5Rm9yQXBpT3BlcmF0aW9uKG9wZXJhdGlvbjogc3RyaW5nLCBwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWM7XG4gIC8qKlxuICAgKiBSZXR1cm4gYSBtZXRyaWMgY29udGFpbmluZyB0aGUgdG90YWwgbnVtYmVyIG9mIEFQSSByZXF1ZXN0cyBtYWRlIGZvciBhIHNwZWNpZmljIG1lbW9yeSBvcGVyYXRpb24uXG4gICAqL1xuICBtZXRyaWNJbnZvY2F0aW9uc0ZvckFwaU9wZXJhdGlvbihvcGVyYXRpb246IHN0cmluZywgcHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljO1xuICAvKipcbiAgICogUmV0dXJuIGEgbWV0cmljIGNvbnRhaW5pbmcgdGhlIG51bWJlciBvZiBlcnJvcnMgZm9yIGEgc3BlY2lmaWMgQVBJIG9wZXJhdGlvbiBwZXJmb3JtZWQgb24gdGhpcyBtZW1vcnkuXG4gICAqL1xuICBtZXRyaWNFcnJvcnNGb3JBcGlPcGVyYXRpb24ob3BlcmF0aW9uOiBzdHJpbmcsIHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYztcbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIG1ldHJpYyBjb250YWluaW5nIHRoZSBudW1iZXIgb2YgY3JlYXRlZCBtZW1vcnkgZXZlbnRzIGFuZCBtZW1vcnkgcmVjb3Jkcy5cbiAgICovXG4gIG1ldHJpY0V2ZW50Q3JlYXRpb25Db3VudChwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWM7XG59XG5cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAqICAgICAgICAgICAgICAgICAgICAgICAgQUJTVFJBQ1QgQkFTRSBDTEFTU1xuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqXG4gKiBBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBhIE1lbW9yeS5cbiAqIENvbnRhaW5zIG1ldGhvZHMgYW5kIGF0dHJpYnV0ZXMgdmFsaWQgZm9yIE1lbW9yaWVzIGVpdGhlciBjcmVhdGVkIHdpdGggQ0RLIG9yIGltcG9ydGVkLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTWVtb3J5QmFzZSBleHRlbmRzIFJlc291cmNlIGltcGxlbWVudHMgSU1lbW9yeSB7XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBtZW1vcnlBcm46IHN0cmluZztcbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IG1lbW9yeUlkOiBzdHJpbmc7XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBzdGF0dXM/OiBzdHJpbmc7XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSB1cGRhdGVkQXQ/OiBzdHJpbmc7XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBjcmVhdGVkQXQ/OiBzdHJpbmc7XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBleGVjdXRpb25Sb2xlPzogaWFtLklSb2xlO1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkga21zS2V5Pzoga21zLklLZXk7XG4gIC8qKlxuICAgKiBUaGUgcHJpbmNpcGFsIHRvIGdyYW50IHBlcm1pc3Npb25zIHRvXG4gICAqL1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgZ3JhbnRQcmluY2lwYWw6IGlhbS5JUHJpbmNpcGFsO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuICB9XG4gIC8qKlxuICAgKiBHcmFudHMgSUFNIGFjdGlvbnMgdG8gdGhlIElBTSBQcmluY2lwYWxcbiAgICogQHBhcmFtIGdyYW50ZWUgLSBUaGUgSUFNIHByaW5jaXBhbCB0byBncmFudCBwZXJtaXNzaW9ucyB0b1xuICAgKiBAcGFyYW0gYWN0aW9ucyAtIFRoZSBhY3Rpb25zIHRvIGdyYW50XG4gICAqIEByZXR1cm5zIEFuIElBTSBHcmFudCBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBncmFudGVkIHBlcm1pc3Npb25zXG4gICAqL1xuICBncmFudChncmFudGVlOiBpYW0uSUdyYW50YWJsZSwgLi4uYWN0aW9uczogc3RyaW5nW10pOiBpYW0uR3JhbnQge1xuICAgIHJldHVybiBpYW0uR3JhbnQuYWRkVG9QcmluY2lwYWwoe1xuICAgICAgZ3JhbnRlZSxcbiAgICAgIGFjdGlvbnMsXG4gICAgICByZXNvdXJjZUFybnM6IFt0aGlzLm1lbW9yeUFybl0sXG4gICAgICBzY29wZTogdGhpcyxcbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogR3JhbnQgdGhlIGdpdmVuIHByaW5jaXBhbCBpZGVudGl0eSBwZXJtaXNzaW9ucyB0byB3cml0ZSBjb250ZW50IHRvIHNob3J0LXRlcm0gbWVtb3J5LlxuICAgKlxuICAgKiBAcGFyYW0gZ3JhbnRlZSAtIFRoZSBJQU0gcHJpbmNpcGFsIHRvIGdyYW50IHJlYWQgcGVybWlzc2lvbnMgdG9cbiAgICogQGRlZmF1bHQgLSBEZWZhdWx0IGdyYW50IGNvbmZpZ3VyYXRpb246XG4gICAqIC0gYWN0aW9uczogWydiZWRyb2NrLWFnZW50Y29yZTpDcmVhdGVFdmVudCddIG9uIHRoaXMubWVtb3J5QXJuXG4gICAqIEByZXR1cm5zIEFuIElBTSBHcmFudCBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBncmFudGVkIHBlcm1pc3Npb25zXG4gICAqL1xuICBncmFudFdyaXRlKGdyYW50ZWU6IGlhbS5JR3JhbnRhYmxlKTogaWFtLkdyYW50IHtcbiAgICByZXR1cm4gdGhpcy5ncmFudChncmFudGVlLCAuLi5NZW1vcnlQZXJtcy5TVE0uV1JJVEVfUEVSTVMpO1xuICB9XG4gIC8qKlxuICAgKiBHcmFudCB0aGUgZ2l2ZW4gcHJpbmNpcGFsIGlkZW50aXR5IHBlcm1pc3Npb25zIHRvIHJlYWQgdGhlIGNvbnRlbnRzIG9mIHRoaXMgbWVtb3J5LlxuICAgKiBCb3RoIFNob3J0LVRlcm0gTWVtb3J5IChTVE0pIGFuZCBMb25nLVRlcm0gTWVtb3J5IChMVE0pLlxuICAgKlxuICAgKiBAcGFyYW0gZ3JhbnRlZSAtIFRoZSBJQU0gcHJpbmNpcGFsIHRvIGdyYW50IHJlYWQgcGVybWlzc2lvbnMgdG9cbiAgICogQGRlZmF1bHQgLSBEZWZhdWx0IGdyYW50IGNvbmZpZ3VyYXRpb246XG4gICAqIC0gYWN0aW9uczogWydiZWRyb2NrLWFnZW50Y29yZTpHZXRNZW1vcnlSZWNvcmQnLFxuICAgICAgJ2JlZHJvY2stYWdlbnRjb3JlOlJldHJpZXZlTWVtb3J5UmVjb3JkcycsXG4gICAgICAnYmVkcm9jay1hZ2VudGNvcmU6TGlzdE1lbW9yeVJlY29yZHMnLFxuICAgICAgJ2JlZHJvY2stYWdlbnRjb3JlOkxpc3RBY3RvcnMnLFxuICAgICAgJ2JlZHJvY2stYWdlbnRjb3JlOkxpc3RTZXNzaW9uc10gb24gdGhpcy5tZW1vcnlBcm5cbiAgICogQHJldHVybnMgQW4gSUFNIEdyYW50IG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGdyYW50ZWQgcGVybWlzc2lvbnNcbiAgICovXG4gIGdyYW50UmVhZChncmFudGVlOiBpYW0uSUdyYW50YWJsZSk6IGlhbS5HcmFudCB7XG4gICAgcmV0dXJuIHRoaXMuZ3JhbnQoZ3JhbnRlZSwgLi4uTWVtb3J5UGVybXMuUkVBRF9QRVJNUyk7XG4gIH1cbiAgLyoqXG4gICAqIEdyYW50IHRoZSBnaXZlbiBwcmluY2lwYWwgaWRlbnRpdHkgcGVybWlzc2lvbnMgdG8gcmVhZCB0aGUgU2hvcnQtVGVybSBNZW1vcnkgKFNUTSkgY29udGVudHMgb2YgdGhpcyBtZW1vcnkuXG4gICAqXG4gICAqIEBwYXJhbSBncmFudGVlIC0gVGhlIElBTSBwcmluY2lwYWwgdG8gZ3JhbnQgcmVhZCBwZXJtaXNzaW9ucyB0b1xuICAgKiBAZGVmYXVsdCAtIERlZmF1bHQgZ3JhbnQgY29uZmlndXJhdGlvbjpcbiAgICogLSBhY3Rpb25zOiBbJ2JlZHJvY2stYWdlbnRjb3JlOkdldEV2ZW50JyxcbiAgICAgICdiZWRyb2NrLWFnZW50Y29yZTpMaXN0RXZlbnRzJyxcbiAgICAgICdiZWRyb2NrLWFnZW50Y29yZTpMaXN0QWN0b3JzJyxcbiAgICAgICdiZWRyb2NrLWFnZW50Y29yZTpMaXN0U2Vzc2lvbnMnLF0gb24gdGhpcy5tZW1vcnlBcm5cbiAgICogQHJldHVybnMgQW4gSUFNIEdyYW50IG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGdyYW50ZWQgcGVybWlzc2lvbnNcbiAgICovXG4gIGdyYW50UmVhZFNob3J0VGVybU1lbW9yeShncmFudGVlOiBpYW0uSUdyYW50YWJsZSk6IGlhbS5HcmFudCB7XG4gICAgcmV0dXJuIHRoaXMuZ3JhbnQoZ3JhbnRlZSwgLi4uTWVtb3J5UGVybXMuU1RNLlJFQURfUEVSTVMpO1xuICB9XG4gIC8qKlxuICAgKiBHcmFudCB0aGUgZ2l2ZW4gcHJpbmNpcGFsIGlkZW50aXR5IHBlcm1pc3Npb25zIHRvIHJlYWQgdGhlIExvbmctVGVybSBNZW1vcnkgKExUTSkgY29udGVudHMgb2YgdGhpcyBtZW1vcnkuXG4gICAqXG4gICAqIEBwYXJhbSBncmFudGVlIC0gVGhlIElBTSBwcmluY2lwYWwgdG8gZ3JhbnQgcmVhZCBwZXJtaXNzaW9ucyB0b1xuICAgKiBAZGVmYXVsdCAtIERlZmF1bHQgZ3JhbnQgY29uZmlndXJhdGlvbjpcbiAgICogLSBhY3Rpb25zOiBbJ2JlZHJvY2stYWdlbnRjb3JlOkdldE1lbW9yeVJlY29yZCcsXG4gICAgICAnYmVkcm9jay1hZ2VudGNvcmU6UmV0cmlldmVNZW1vcnlSZWNvcmRzJyxcbiAgICAgICdiZWRyb2NrLWFnZW50Y29yZTpMaXN0TWVtb3J5UmVjb3JkcycsXG4gICAgICAnYmVkcm9jay1hZ2VudGNvcmU6TGlzdEFjdG9ycycsXG4gICAgICAnYmVkcm9jay1hZ2VudGNvcmU6TGlzdFNlc3Npb25zJyxdIG9uIHRoaXMubWVtb3J5QXJuXG4gICAqIEByZXR1cm5zIEFuIElBTSBHcmFudCBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBncmFudGVkIHBlcm1pc3Npb25zXG4gICAqL1xuICBncmFudFJlYWRMb25nVGVybU1lbW9yeShncmFudGVlOiBpYW0uSUdyYW50YWJsZSk6IGlhbS5HcmFudCB7XG4gICAgcmV0dXJuIHRoaXMuZ3JhbnQoZ3JhbnRlZSwgLi4uTWVtb3J5UGVybXMuTFRNLlJFQURfUEVSTVMpO1xuICB9XG4gIC8qKlxuICAgKiBHcmFudCB0aGUgZ2l2ZW4gcHJpbmNpcGFsIGlkZW50aXR5IHBlcm1pc3Npb25zIHRvIGRlbGV0ZSBjb250ZW50IG9uIHRoaXMgbWVtb3J5LlxuICAgKlxuICAgKiBCb3RoIFNob3J0LVRlcm0gTWVtb3J5IChTVE0pIGFuZCBMb25nLVRlcm0gTWVtb3J5IChMVE0pLlxuICAgKlxuICAgKiBAcGFyYW0gZ3JhbnRlZSAtIFRoZSBJQU0gcHJpbmNpcGFsIHRvIGdyYW50IGRlbGV0ZSBwZXJtaXNzaW9ucyB0b1xuICAgKiBAZGVmYXVsdCAtIERlZmF1bHQgZ3JhbnQgY29uZmlndXJhdGlvbjpcbiAgICogLSBhY3Rpb25zOiBbJ2JlZHJvY2stYWdlbnRjb3JlOkRlbGV0ZUV2ZW50JyxcbiAgICAgICdiZWRyb2NrLWFnZW50Y29yZTpEZWxldGVNZW1vcnlSZWNvcmQnXSBvbiB0aGlzLm1lbW9yeUFyblxuICAgKiBAcmV0dXJucyBBbiBJQU0gR3JhbnQgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgZ3JhbnRlZCBwZXJtaXNzaW9uc1xuICAgKi9cbiAgZ3JhbnREZWxldGUoZ3JhbnRlZTogaWFtLklHcmFudGFibGUpOiBpYW0uR3JhbnQge1xuICAgIHJldHVybiB0aGlzLmdyYW50KGdyYW50ZWUsIC4uLk1lbW9yeVBlcm1zLkRFTEVURV9QRVJNUyk7XG4gIH1cbiAgLyoqXG4gICAqIEdyYW50IHRoZSBnaXZlbiBwcmluY2lwYWwgaWRlbnRpdHkgcGVybWlzc2lvbnMgdG8gZGVsZXRlIFNob3J0LVRlcm0gTWVtb3J5IChTVE0pIGNvbnRlbnQgb24gdGhpcyBtZW1vcnkuXG4gICAqXG4gICAqIEBwYXJhbSBncmFudGVlIC0gVGhlIElBTSBwcmluY2lwYWwgdG8gZ3JhbnQgZGVsZXRlIHBlcm1pc3Npb25zIHRvXG4gICAqIEBkZWZhdWx0IC0gRGVmYXVsdCBncmFudCBjb25maWd1cmF0aW9uOlxuICAgKiAtIGFjdGlvbnM6IFsnYmVkcm9jay1hZ2VudGNvcmU6RGVsZXRlRXZlbnQnXSBvbiB0aGlzLm1lbW9yeUFyblxuICAgKiBAcmV0dXJucyBBbiBJQU0gR3JhbnQgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgZ3JhbnRlZCBwZXJtaXNzaW9uc1xuICAgKi9cbiAgZ3JhbnREZWxldGVTaG9ydFRlcm1NZW1vcnkoZ3JhbnRlZTogaWFtLklHcmFudGFibGUpOiBpYW0uR3JhbnQge1xuICAgIHJldHVybiB0aGlzLmdyYW50KGdyYW50ZWUsIC4uLk1lbW9yeVBlcm1zLlNUTS5ERUxFVEVfUEVSTVMpO1xuICB9XG4gIC8qKlxuICAgKiBHcmFudCB0aGUgZ2l2ZW4gcHJpbmNpcGFsIGlkZW50aXR5IHBlcm1pc3Npb25zIHRvIGRlbGV0ZSBMb25nLVRlcm0gTWVtb3J5IChMVE0pIGNvbnRlbnQgb24gdGhpcyBtZW1vcnkuXG4gICAqXG4gICAqIEBwYXJhbSBncmFudGVlIC0gVGhlIElBTSBwcmluY2lwYWwgdG8gZ3JhbnQgZGVsZXRlIHBlcm1pc3Npb25zIHRvXG4gICAqIEBkZWZhdWx0IC0gRGVmYXVsdCBncmFudCBjb25maWd1cmF0aW9uOlxuICAgKiAtIGFjdGlvbnM6IFsnYmVkcm9jay1hZ2VudGNvcmU6RGVsZXRlTWVtb3J5UmVjb3JkJ10gb24gdGhpcy5tZW1vcnlBcm5cbiAgICogQHJldHVybnMgQW4gSUFNIEdyYW50IG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGdyYW50ZWQgcGVybWlzc2lvbnNcbiAgICovXG4gIGdyYW50RGVsZXRlTG9uZ1Rlcm1NZW1vcnkoZ3JhbnRlZTogaWFtLklHcmFudGFibGUpOiBpYW0uR3JhbnQge1xuICAgIHJldHVybiB0aGlzLmdyYW50KGdyYW50ZWUsIC4uLk1lbW9yeVBlcm1zLkxUTS5ERUxFVEVfUEVSTVMpO1xuICB9XG4gIC8qKlxuICAgKiBHcmFudCB0aGUgZ2l2ZW4gcHJpbmNpcGFsIGlkZW50aXR5IHBlcm1pc3Npb25zIHRvIG1hbmFnZSB0aGUgY29udHJvbCBwbGFuZSBvZiB0aGlzIG1lbW9yeS5cbiAgICpcbiAgICogQHBhcmFtIGdyYW50ZWUgLSBUaGUgSUFNIHByaW5jaXBhbCB0byBncmFudCBhZG1pbiBwZXJtaXNzaW9ucyB0b1xuICAgKiBAZGVmYXVsdCAtIERlZmF1bHQgZ3JhbnQgY29uZmlndXJhdGlvbjpcbiAgICogLSBhY3Rpb25zOiBbJ2JlZHJvY2stYWdlbnRjb3JlOkNyZWF0ZU1lbW9yeScsXG4gICAgICAnYmVkcm9jay1hZ2VudGNvcmU6R2V0TWVtb3J5JyxcbiAgICAgICdiZWRyb2NrLWFnZW50Y29yZTpEZWxldGVNZW1vcnknLFxuICAgICAgJ2JlZHJvY2stYWdlbnRjb3JlOlVwZGF0ZU1lbW9yeSddIG9uIHRoaXMubWVtb3J5QXJuXG4gICAqIEByZXR1cm5zIEFuIElBTSBHcmFudCBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBncmFudGVkIHBlcm1pc3Npb25zXG4gICAqL1xuICBncmFudEFkbWluKGdyYW50ZWU6IGlhbS5JR3JhbnRhYmxlKTogaWFtLkdyYW50IHtcbiAgICByZXR1cm4gdGhpcy5ncmFudChncmFudGVlLCAuLi5NZW1vcnlQZXJtcy5BRE1JTl9QRVJNUyk7XG4gIH1cbiAgLyoqXG4gICAqIEdyYW50IHRoZSBnaXZlbiBwcmluY2lwYWwgaWRlbnRpdHkgcGVybWlzc2lvbnMgdG8gZG8gZXZlcnkgYWN0aW9uIG9uIHRoaXMgbWVtb3J5LlxuICAgKlxuICAgKiBAcGFyYW0gZ3JhbnRlZSAtIFRoZSBJQU0gcHJpbmNpcGFsIHRvIGdyYW50IGZ1bGwgYWNjZXNzIHBlcm1pc3Npb25zIHRvXG4gICAqIEBkZWZhdWx0IC0gRGVmYXVsdCBncmFudCBjb25maWd1cmF0aW9uOlxuICAgKiAtIGFjdGlvbnM6IFsnYmVkcm9jay1hZ2VudGNvcmU6Q3JlYXRlRXZlbnQnLFxuICAgICAgJ2JlZHJvY2stYWdlbnRjb3JlOkdldEV2ZW50JyxcbiAgICAgICdiZWRyb2NrLWFnZW50Y29yZTpEZWxldGVFdmVudCcsXG4gICAgICAnYmVkcm9jay1hZ2VudGNvcmU6R2V0TWVtb3J5UmVjb3JkJyxcbiAgICAgICdiZWRyb2NrLWFnZW50Y29yZTpSZXRyaWV2ZU1lbW9yeVJlY29yZHMnLFxuICAgICAgJ2JlZHJvY2stYWdlbnRjb3JlOkxpc3RNZW1vcnlSZWNvcmRzJyxcbiAgICAgICdiZWRyb2NrLWFnZW50Y29yZTpMaXN0QWN0b3JzJyxcbiAgICAgICdiZWRyb2NrLWFnZW50Y29yZTpMaXN0U2Vzc2lvbnMnLFxuICAgICAgJ2JlZHJvY2stYWdlbnRjb3JlOkNyZWF0ZU1lbW9yeScsXG4gICAgICAnYmVkcm9jay1hZ2VudGNvcmU6R2V0TWVtb3J5JyxcbiAgICAgICdiZWRyb2NrLWFnZW50Y29yZTpEZWxldGVNZW1vcnknLFxuICAgICAgJ2JlZHJvY2stYWdlbnRjb3JlOlVwZGF0ZU1lbW9yeSddIG9uIHRoaXMubWVtb3J5QXJuXG4gICAqIEByZXR1cm5zIEFuIElBTSBHcmFudCBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBncmFudGVkIHBlcm1pc3Npb25zXG4gICAqL1xuICBncmFudEZ1bGxBY2Nlc3MoZ3JhbnRlZTogaWFtLklHcmFudGFibGUpOiBpYW0uR3JhbnQge1xuICAgIHJldHVybiB0aGlzLmdyYW50KGdyYW50ZWUsIC4uLk1lbW9yeVBlcm1zLkZVTExfQUNDRVNTX1BFUk1TKTtcbiAgfVxuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBNZXRyaWNzXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvKipcbiAgICogUmV0dXJuIHRoZSBnaXZlbiBuYW1lZCBtZXRyaWMgZm9yIHRoaXMgbWVtb3J5LlxuICAgKlxuICAgKiBCeSBkZWZhdWx0LCB0aGUgbWV0cmljIHdpbGwgYmUgY2FsY3VsYXRlZCBhcyBhIHN1bSBvdmVyIGEgcGVyaW9kIG9mIDUgbWludXRlcy5cbiAgICogWW91IGNhbiBjdXN0b21pemUgdGhpcyBieSB1c2luZyB0aGUgYHN0YXRpc3RpY2AgYW5kIGBwZXJpb2RgIHByb3BlcnRpZXMuXG4gICAqL1xuICBwdWJsaWMgbWV0cmljKG1ldHJpY05hbWU6IHN0cmluZywgZGltZW5zaW9uczogRGltZW5zaW9uc01hcCwgcHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljIHtcbiAgICBjb25zdCBtZXRyaWNQcm9wczogTWV0cmljUHJvcHMgPSB7XG4gICAgICBuYW1lc3BhY2U6ICdBV1MvQmVkcm9jay1BZ2VudENvcmUnLFxuICAgICAgbWV0cmljTmFtZSxcbiAgICAgIGRpbWVuc2lvbnNNYXA6IHsgLi4uZGltZW5zaW9ucywgUmVzb3VyY2U6IHRoaXMubWVtb3J5QXJuIH0sXG4gICAgICAuLi5wcm9wcyxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmNvbmZpZ3VyZU1ldHJpYyhtZXRyaWNQcm9wcyk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgZ2l2ZW4gbmFtZWQgbWV0cmljIHJlbGF0ZWQgdG8gdGhlIEFQSSBvcGVyYXRpb24gcGVyZm9ybWVkIG9uIHRoaXMgbWVtb3J5LlxuICAgKi9cbiAgcHVibGljIG1ldHJpY0ZvckFwaU9wZXJhdGlvbihcbiAgICBtZXRyaWNOYW1lOiBzdHJpbmcsXG4gICAgb3BlcmF0aW9uOiBzdHJpbmcsXG4gICAgcHJvcHM/OiBNZXRyaWNPcHRpb25zLFxuICApOiBNZXRyaWMge1xuICAgIHJldHVybiB0aGlzLm1ldHJpYyhtZXRyaWNOYW1lLCB7IE9wZXJhdGlvbjogb3BlcmF0aW9uIH0sIHByb3BzKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJuIGEgbWV0cmljIG1lYXN1cmluZyB0aGUgbGF0ZW5jeSBvZiBhIHNwZWNpZmljIEFQSSBvcGVyYXRpb24gcGVyZm9ybWVkIG9uIHRoaXMgbWVtb3J5LlxuICAgKlxuICAgKiBUaGUgbGF0ZW5jeSBtZXRyaWMgcmVwcmVzZW50cyB0aGUgdG90YWwgdGltZSBlbGFwc2VkIGJldHdlZW4gcmVjZWl2aW5nIHRoZSByZXF1ZXN0IGFuZCBzZW5kaW5nXG4gICAqIHRoZSBmaW5hbCByZXNwb25zZSB0b2tlbiwgbWVhc3VyaW5nIGNvbXBsZXRlIGVuZC10by1lbmQgcHJvY2Vzc2luZyB0aW1lLlxuICAgKlxuICAgKiBGb3IgbWVtb3J5IGNyZWF0aW9uIGV2ZW50cyBzcGVjaWZpY2FsbHksIHRoaXMgbWVhc3VyZXMgdGhlIHRpbWUgZnJvbSB0aGUgbGFzdCBDcmVhdGVFdmVudFxuICAgKiB0aGF0IG1ldCBzdHJhdGVneSBjcml0ZXJpYSB1bnRpbCBtZW1vcnkgc3RvcmFnZSBpcyBjb21wbGV0ZWQuXG4gICAqXG4gICAqL1xuICBwdWJsaWMgbWV0cmljTGF0ZW5jeUZvckFwaU9wZXJhdGlvbihvcGVyYXRpb246IHN0cmluZywgcHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljIHtcbiAgICByZXR1cm4gdGhpcy5tZXRyaWNGb3JBcGlPcGVyYXRpb24oJ0xhdGVuY3knLCBvcGVyYXRpb24sIHsgc3RhdGlzdGljOiBTdGF0cy5BVkVSQUdFLCAuLi5wcm9wcyB9KTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJuIGEgbWV0cmljIGNvbnRhaW5pbmcgdGhlIHRvdGFsIG51bWJlciBvZiBBUEkgcmVxdWVzdHMgbWFkZSBmb3IgYSBzcGVjaWZpYyBtZW1vcnkgb3BlcmF0aW9uIGxpa2VcbiAgICogYENyZWF0ZUV2ZW50YCwgYExpc3RFdmVudHNgLCBgUmV0cmlldmVNZW1vcnlSZWNvcmRzYCAuLi5cbiAgICovXG4gIHB1YmxpYyBtZXRyaWNJbnZvY2F0aW9uc0ZvckFwaU9wZXJhdGlvbihvcGVyYXRpb246IHN0cmluZywgcHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljIHtcbiAgICByZXR1cm4gdGhpcy5tZXRyaWNGb3JBcGlPcGVyYXRpb24oJ0ludm9jYXRpb25zJywgb3BlcmF0aW9uLCB7XG4gICAgICBzdGF0aXN0aWM6IFN0YXRzLlNVTSxcbiAgICAgIC4uLnByb3BzLFxuICAgIH0pO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm4gYSBtZXRyaWMgY29udGFpbmluZyB0aGUgbnVtYmVyIG9mIGVycm9ycyBmb3IgYSBzcGVjaWZpYyBBUEkgb3BlcmF0aW9uIHBlcmZvcm1lZCBvbiB0aGlzIG1lbW9yeS5cbiAgICovXG4gIHB1YmxpYyBtZXRyaWNFcnJvcnNGb3JBcGlPcGVyYXRpb24ob3BlcmF0aW9uOiBzdHJpbmcsIHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYyB7XG4gICAgcmV0dXJuIHRoaXMubWV0cmljRm9yQXBpT3BlcmF0aW9uKCdFcnJvcnMnLCBvcGVyYXRpb24sIHsgc3RhdGlzdGljOiBTdGF0cy5TVU0sIC4uLnByb3BzIH0pO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBtZXRyaWMgY29udGFpbmluZyB0aGUgbnVtYmVyIG9mIHNob3J0LXRlcm0gbWVtb3J5IGV2ZW50cy5cbiAgICovXG4gIHB1YmxpYyBtZXRyaWNFdmVudENyZWF0aW9uQ291bnQocHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljIHtcbiAgICByZXR1cm4gdGhpcy5tZXRyaWMoJ0NyZWF0aW9uQ291bnQnLCB7IEl0ZW1UeXBlOiAnRXZlbnQnIH0sIHsgc3RhdGlzdGljOiBTdGF0cy5TVU0sIC4uLnByb3BzIH0pO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBtZXRyaWMgY29udGFpbmluZyB0aGUgbnVtYmVyIG9mIGxvbmctdGVybSBtZW1vcnkgcmVjb3Jkc1xuICAgKiBjcmVhdGVkIGJ5IHRoZSBsb25nLXRlcm0gZXh0cmFjdGlvbiBzdHJhdGVnaWVzLlxuICAgKi9cbiAgcHVibGljIG1ldHJpY01lbW9yeVJlY29yZENyZWF0aW9uQ291bnQocHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljIHtcbiAgICByZXR1cm4gdGhpcy5tZXRyaWMoXG4gICAgICAnQ3JlYXRpb25Db3VudCcsXG4gICAgICB7IEl0ZW1UeXBlOiAnTWVtb3J5UmVjb3Jkc0V4dHJhY3RlZCcgfSxcbiAgICAgIHsgc3RhdGlzdGljOiBTdGF0cy5TVU0sIC4uLnByb3BzIH0sXG4gICAgKTtcbiAgfVxuICAvKipcbiAgICogSW50ZXJuYWwgbWV0aG9kIHRvIGNyZWF0ZSBhIG1ldHJpYy5cbiAgICovXG4gIHByaXZhdGUgY29uZmlndXJlTWV0cmljKHByb3BzOiBNZXRyaWNQcm9wcykge1xuICAgIHJldHVybiBuZXcgTWV0cmljKHtcbiAgICAgIC4uLnByb3BzLFxuICAgICAgcmVnaW9uOiBwcm9wcz8ucmVnaW9uID8/IHRoaXMuc3RhY2sucmVnaW9uLFxuICAgICAgYWNjb3VudDogcHJvcHM/LmFjY291bnQgPz8gdGhpcy5zdGFjay5hY2NvdW50LFxuICAgIH0pO1xuICB9XG59XG5cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAqICAgICAgICAgICAgICAgICAgICAgICAgUFJPUFMgRk9SIE5FVyBDT05TVFJVQ1RcbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKlxuICogUHJvcGVydGllcyBmb3IgY3JlYXRpbmcgYSBNZW1vcnkgcmVzb3VyY2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNZW1vcnlQcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgbWVtb3J5XG4gICAqIFZhbGlkIGNoYXJhY3RlcnMgYXJlIGEteiwgQS1aLCAwLTksIF8gKHVuZGVyc2NvcmUpXG4gICAqIFRoZSBuYW1lIG11c3Qgc3RhcnQgd2l0aCBhIGxldHRlciBhbmQgY2FuIGJlIHVwIHRvIDQ4IGNoYXJhY3RlcnMgbG9uZ1xuICAgKiBQYXR0ZXJuOiBbYS16QS1aXVthLXpBLVowLTlfXXswLDQ3fVxuICAgKi9cbiAgcmVhZG9ubHkgbWVtb3J5TmFtZTogc3RyaW5nO1xuICAvKipcbiAgICogU2hvcnQtdGVybSBtZW1vcnkgZXhwaXJhdGlvbiBpbiBkYXlzIChiZXR3ZWVuIDcgYW5kIDM2NSkuXG4gICAqIFNldHMgdGhlIHNob3J0LXRlcm0gKHJhdyBldmVudCkgbWVtb3J5IHJldGVudGlvbi5cbiAgICogRXZlbnRzIG9sZGVyIHRoYW4gdGhlIHNwZWNpZmllZCBkdXJhdGlvbiB3aWxsIGV4cGlyZSBhbmQgbm8gbG9uZ2VyIGJlIHN0b3JlZC5cbiAgICogQGRlZmF1bHQgLSA5MCBkYXlzXG4gICAqL1xuICByZWFkb25seSBleHBpcmF0aW9uRHVyYXRpb24/OiBEdXJhdGlvbjtcbiAgLyoqXG4gICAqIE9wdGlvbmFsIGRlc2NyaXB0aW9uIGZvciB0aGUgbWVtb3J5XG4gICAqIFZhbGlkIGNoYXJhY3RlcnMgYXJlIGEteiwgQS1aLCAwLTksIF8gKHVuZGVyc2NvcmUpLCAtIChoeXBoZW4pIGFuZCBzcGFjZXNcbiAgICogVGhlIGRlc2NyaXB0aW9uIGNhbiBoYXZlIHVwIHRvIDIwMCBjaGFyYWN0ZXJzXG4gICAqIEBkZWZhdWx0IC0gTm8gZGVzY3JpcHRpb25cbiAgICovXG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAvKipcbiAgICogQ3VzdG9tIEtNUyBrZXkgdG8gdXNlIGZvciBlbmNyeXB0aW9uLlxuICAgKiBAZGVmYXVsdCAtIFlvdXIgZGF0YSBpcyBlbmNyeXB0ZWQgd2l0aCBhIGtleSB0aGF0IEFXUyBvd25zIGFuZCBtYW5hZ2VzIGZvciB5b3VcbiAgICovXG4gIHJlYWRvbmx5IGttc0tleT86IGttcy5JS2V5O1xuICAvKipcbiAgICogSWYgeW91IG5lZWQgbG9uZy10ZXJtIG1lbW9yeSBmb3IgY29udGV4dCByZWNhbGwgYWNyb3NzIHNlc3Npb25zLFxuICAgKiB5b3UgY2FuIHNldHVwIG1lbW9yeSBleHRyYWN0aW9uIHN0cmF0ZWdpZXMgdG8gZXh0cmFjdCB0aGUgcmVsZXZhbnQgbWVtb3J5IGZyb20gdGhlIHJhdyBldmVudHMuXG4gICAqIEBkZWZhdWx0IC0gTm8gZXh0cmFjdGlvbiBzdHJhdGVnaWVzIChzaG9ydCB0ZXJtIG1lbW9yeSBvbmx5KVxuICAgKi9cbiAgcmVhZG9ubHkgbWVtb3J5U3RyYXRlZ2llcz86IElNZW1vcnlTdHJhdGVneVtdO1xuICAvKipcbiAgICogVGhlIElBTSByb2xlIHRoYXQgcHJvdmlkZXMgcGVybWlzc2lvbnMgZm9yIHRoZSBtZW1vcnkgdG8gYWNjZXNzIEFXUyBzZXJ2aWNlc1xuICAgKiB3aGVuIHVzaW5nIGN1c3RvbSBzdHJhdGVnaWVzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIEEgbmV3IHJvbGUgd2lsbCBiZSBjcmVhdGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgZXhlY3V0aW9uUm9sZT86IGlhbS5JUm9sZTtcbiAgLyoqXG4gICAqIFRhZ3MgKG9wdGlvbmFsKVxuICAgKiBBIGxpc3Qgb2Yga2V5OnZhbHVlIHBhaXJzIG9mIHRhZ3MgdG8gYXBwbHkgdG8gdGhpcyBtZW1vcnkgcmVzb3VyY2VcbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyB0YWdzXG4gICAqL1xuICByZWFkb25seSB0YWdzPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcbn1cblxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICogICAgICAgICAgICAgICAgICAgICAgQVRUUlMgRk9SIElNUE9SVEVEIENPTlNUUlVDVFxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqXG4gKiBBdHRyaWJ1dGVzIGZvciBzcGVjaWZ5aW5nIGFuIGltcG9ydGVkIE1lbW9yeS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNZW1vcnlBdHRyaWJ1dGVzIHtcbiAgLyoqXG4gICAqIFRoZSBBUk4gb2YgdGhlIG1lbW9yeS5cbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgbWVtb3J5QXJuOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgQVJOIG9mIHRoZSBJQU0gcm9sZSBhc3NvY2lhdGVkIHRvIHRoZSBtZW1vcnkuXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IHJvbGVBcm46IHN0cmluZztcbiAgLyoqXG4gICAqIFdoZW4gdGhpcyBtZW1vcnkgd2FzIGxhc3QgdXBkYXRlZC5cbiAgICogQGRlZmF1bHQgdW5kZWZpbmVkIC0gTm8gbGFzdCB1cGRhdGVkIHRpbWVzdGFtcCBpcyBwcm92aWRlZFxuICAgKi9cbiAgcmVhZG9ubHkgdXBkYXRlZEF0Pzogc3RyaW5nO1xuICAvKipcbiAgICogT3B0aW9uYWwgS01TIGVuY3J5cHRpb24ga2V5IGFzc29jaWF0ZWQgd2l0aCB0aGlzIG1lbW9yeVxuICAgKiBAZGVmYXVsdCB1bmRlZmluZWQgLSBBbiBBV1MgbWFuYWdlZCBrZXkgaXMgdXNlZFxuICAgKi9cbiAgcmVhZG9ubHkga21zS2V5QXJuPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHN0YXR1cyBvZiB0aGUgbWVtb3J5LlxuICAgKiBAZGVmYXVsdCB1bmRlZmluZWQgLSBObyBzdGF0dXMgaXMgcHJvdmlkZWRcbiAgICovXG4gIHJlYWRvbmx5IHN0YXR1cz86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBjcmVhdGVkIHRpbWVzdGFtcCBvZiB0aGUgbWVtb3J5LlxuICAgKiBAZGVmYXVsdCB1bmRlZmluZWQgLSBObyBjcmVhdGVkIHRpbWVzdGFtcCBpcyBwcm92aWRlZFxuICAgKi9cbiAgcmVhZG9ubHkgY3JlYXRlZEF0Pzogc3RyaW5nO1xufVxuXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NcbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKlxuICogTG9uZy10ZXJtIG1lbW9yeSBzdG9yZSBmb3IgZXh0cmFjdGVkIGluc2lnaHRzIGxpa2UgdXNlciBwcmVmZXJlbmNlcywgc2VtYW50aWMgZmFjdHMgYW5kIHN1bW1hcmllcy5cbiAqIEVuYWJsZXMga25vd2xlZGdlIHJldGVudGlvbiBhY3Jvc3Mgc2Vzc2lvbnMgYnkgc3RvcmluZyB1c2VyIHByZWZlcmVuY2VzIChlLmcuIGNvZGluZyBzdHlsZSksXG4gKiBzZW1hbnRpYyBmYWN0cyAoZS5nLiBsZWFybmVkIGluZm8pIGFuZCBpbnRlcmFjdGlvbiBzdW1tYXJpZXMgZm9yIGNvbnRleHQgb3B0aW1pemF0aW9uLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2JlZHJvY2stYWdlbnRjb3JlL2xhdGVzdC9kZXZndWlkZS9tZW1vcnkuaHRtbFxuICogQHJlc291cmNlIEFXUzo6QmVkcm9ja0FnZW50Q29yZTo6TWVtb3J5XG4gKi9cbkBwcm9wZXJ0eUluamVjdGFibGVcbmV4cG9ydCBjbGFzcyBNZW1vcnkgZXh0ZW5kcyBNZW1vcnlCYXNlIHtcbiAgLyoqIFVuaXF1ZWx5IGlkZW50aWZpZXMgdGhpcyBjbGFzcy4gKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBQUk9QRVJUWV9JTkpFQ1RJT05fSUQ6IHN0cmluZyA9ICdAYXdzLWNkay5hd3MtYmVkcm9jay1hZ2VudGNvcmUtYWxwaGEuTWVtb3J5JztcblxuICAvKipcbiAgICogU3RhdGljIE1ldGhvZCBmb3IgaW1wb3J0aW5nIGFuIGV4aXN0aW5nIEJlZHJvY2sgQWdlbnRDb3JlIE1lbW9yeS5cbiAgICovXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIE1lbW9yeSByZWZlcmVuY2UgZnJvbSBhbiBleGlzdGluZyBtZW1vcnkncyBhdHRyaWJ1dGVzLlxuICAgKlxuICAgKiBAcGFyYW0gc2NvcGUgLSBUaGUgY29uc3RydWN0IHNjb3BlXG4gICAqIEBwYXJhbSBpZCAtIElkZW50aWZpZXIgb2YgdGhlIGNvbnN0cnVjdFxuICAgKiBAcGFyYW0gYXR0cnMgLSBBdHRyaWJ1dGVzIG9mIHRoZSBleGlzdGluZyBicm93c2VyIGN1c3RvbVxuICAgKiBAcmV0dXJucyBBbiBJQnJvd3NlckN1c3RvbSByZWZlcmVuY2UgdG8gdGhlIGV4aXN0aW5nIGJyb3dzZXJcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbU1lbW9yeUF0dHJpYnV0ZXMoc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgYXR0cnM6IE1lbW9yeUF0dHJpYnV0ZXMpOiBJTWVtb3J5IHtcbiAgICBjbGFzcyBJbXBvcnQgZXh0ZW5kcyBNZW1vcnlCYXNlIHtcbiAgICAgIHB1YmxpYyByZWFkb25seSBtZW1vcnlBcm4gPSBhdHRycy5tZW1vcnlBcm47XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgbWVtb3J5SWQgPSBBcm4uc3BsaXQoYXR0cnMubWVtb3J5QXJuLCBBcm5Gb3JtYXQuU0xBU0hfUkVTT1VSQ0VfTkFNRSkucmVzb3VyY2VOYW1lITtcbiAgICAgIHB1YmxpYyByZWFkb25seSBleGVjdXRpb25Sb2xlID0gaWFtLlJvbGUuZnJvbVJvbGVBcm4oc2NvcGUsIGAke2lkfVJvbGVgLCBhdHRycy5yb2xlQXJuKTtcbiAgICAgIHB1YmxpYyByZWFkb25seSBrbXNLZXkgPSBhdHRycy5rbXNLZXlBcm4gPyBrbXMuS2V5LmZyb21LZXlBcm4oc2NvcGUsIGAke2lkfUtleWAsIGF0dHJzLmttc0tleUFybikgOiB1bmRlZmluZWQ7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgdXBkYXRlZEF0ID0gYXR0cnMudXBkYXRlZEF0O1xuICAgICAgcHVibGljIHJlYWRvbmx5IGdyYW50UHJpbmNpcGFsID0gdGhpcy5leGVjdXRpb25Sb2xlO1xuICAgICAgcHVibGljIHJlYWRvbmx5IHN0YXR1cyA9IGF0dHJzLnN0YXR1cztcbiAgICAgIHB1YmxpYyByZWFkb25seSBjcmVhdGVkQXQgPSBhdHRycy5jcmVhdGVkQXQ7XG5cbiAgICAgIGNvbnN0cnVjdG9yKHM6IENvbnN0cnVjdCwgaTogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKHMsIGkpO1xuXG4gICAgICAgIHRoaXMuZ3JhbnRQcmluY2lwYWwgPSB0aGlzLmV4ZWN1dGlvblJvbGUgfHwgbmV3IGlhbS5Vbmtub3duUHJpbmNpcGFsKHsgcmVzb3VyY2U6IHRoaXMgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIG5ldyBNZW1vcnlcbiAgICByZXR1cm4gbmV3IEltcG9ydChzY29wZSwgaWQpO1xuICB9XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIEF0dHJpYnV0ZXNcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8qKlxuICAgKiBUaGUgQVJOIG9mIHRoZSBtZW1vcnkgcmVzb3VyY2UuXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBtZW1vcnlBcm46IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBtZW1vcnkuXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBtZW1vcnlOYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgaWQgb2YgdGhlIG1lbW9yeS5cbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG1lbW9yeUlkOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgZXhwaXJhdGlvbiBkYXlzIG9mIHRoZSBtZW1vcnkuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZXhwaXJhdGlvbkR1cmF0aW9uPzogRHVyYXRpb247XG4gIC8qKlxuICAgKiBUaGUgZmFpbHVyZSByZWFzb24gb2YgdGhlIGJyb3dzZXJcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGZhaWx1cmVSZWFzb24/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIG1lbW9yeS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBleGVjdXRpb24gcm9sZSBvZiB0aGUgbWVtb3J5LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGV4ZWN1dGlvblJvbGU/OiBpYW0uSVJvbGU7XG4gIC8qKlxuICAgKiBUaGUgc3RhdHVzIG9mIHRoZSBtZW1vcnkuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgc3RhdHVzPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGNyZWF0ZWQgdGltZXN0YW1wIG9mIHRoZSBtZW1vcnkuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY3JlYXRlZEF0Pzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHVwZGF0ZWQgYXQgdGltZXN0YW1wIG9mIHRoZSBtZW1vcnkuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdXBkYXRlZEF0Pzogc3RyaW5nO1xuICAvKipcbiAgICogVGFncyBhcHBsaWVkIHRvIHRoaXMgYnJvd3NlciByZXNvdXJjZVxuICAgKiBBIG1hcCBvZiBrZXktdmFsdWUgcGFpcnMgZm9yIHJlc291cmNlIHRhZ2dpbmdcbiAgICogQGRlZmF1bHQgLSBObyB0YWdzIGFwcGxpZWRcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB0YWdzPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcbiAgLyoqXG4gICAqIFRoZSBwcmluY2lwYWwgdG8gZ3JhbnQgcGVybWlzc2lvbnMgdG9cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBncmFudFByaW5jaXBhbDogaWFtLklQcmluY2lwYWw7XG4gIC8qKlxuICAgKiBUaGUgS01TIGtleSB1c2VkIHRvIGVuY3J5cHQgdGhlIG1lbW9yeS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBrbXNLZXk/OiBrbXMuSUtleTtcbiAgLyoqXG4gICAqIFRoZSBtZW1vcnkgc3RyYXRlZ2llcyB1c2VkIGJ5IHRoZSBtZW1vcnkuXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBtZW1vcnlTdHJhdGVnaWVzOiBJTWVtb3J5U3RyYXRlZ3lbXSA9IFtdO1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gSW50ZXJuYWwgT25seVxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgcHJpdmF0ZSByZWFkb25seSBfX3Jlc291cmNlOiBDZm5NZW1vcnk7XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIENPTlNUUlVDVE9SXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogTWVtb3J5UHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuICAgIC8vIEVuaGFuY2VkIENESyBBbmFseXRpY3MgVGVsZW1ldHJ5XG4gICAgYWRkQ29uc3RydWN0TWV0YWRhdGEodGhpcywgcHJvcHMpO1xuXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gU2V0IHByb3BlcnRpZXMgYW5kIGRlZmF1bHRzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgdGhpcy5tZW1vcnlOYW1lID0gcHJvcHMubWVtb3J5TmFtZTtcbiAgICB0aGlzLmV4cGlyYXRpb25EdXJhdGlvbiA9IHByb3BzLmV4cGlyYXRpb25EdXJhdGlvbiA/PyBEdXJhdGlvbi5kYXlzKDkwKTtcbiAgICB0aGlzLmRlc2NyaXB0aW9uID0gcHJvcHMuZGVzY3JpcHRpb247XG4gICAgdGhpcy5rbXNLZXkgPSBwcm9wcy5rbXNLZXk7XG4gICAgdGhpcy5leGVjdXRpb25Sb2xlID0gcHJvcHMuZXhlY3V0aW9uUm9sZSA/PyB0aGlzLl9jcmVhdGVNZW1vcnlSb2xlKCk7XG4gICAgdGhpcy5ncmFudFByaW5jaXBhbCA9IHRoaXMuZXhlY3V0aW9uUm9sZTtcbiAgICB0aGlzLnRhZ3MgPSBwcm9wcy50YWdzO1xuXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gUGVybWlzc2lvbnNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBGb3IgS01TIHBlcm1pc3Npb25zIHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYmVkcm9jay1hZ2VudGNvcmUvbGF0ZXN0L2Rldmd1aWRlL3N0b3JhZ2UtZW5jcnlwdGlvbi5odG1sXG4gICAgaWYgKHRoaXMua21zS2V5KSB7XG4gICAgICB0aGlzLmttc0tleS5ncmFudCh0aGlzLmV4ZWN1dGlvblJvbGUsXG4gICAgICAgICdrbXM6Q3JlYXRlR3JhbnQnLFxuICAgICAgICAna21zOkRlY3J5cHQnLFxuICAgICAgICAna21zOkRlc2NyaWJlS2V5JyxcbiAgICAgICAgJ2ttczpHZW5lcmF0ZURhdGFLZXknLFxuICAgICAgICAna21zOkdlbmVyYXRlRGF0YUtleVdpdGhvdXRQbGFpbnRleHQnLFxuICAgICAgICAna21zOlJlRW5jcnlwdConLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBWYWxpZGF0aW9uc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gICAgLy8gVmFsaWRhdGUgbWVtb3J5IG5hbWVcbiAgICB0aHJvd0lmSW52YWxpZCh0aGlzLl92YWxpZGF0ZU1lbW9yeU5hbWUsIHRoaXMubWVtb3J5TmFtZSwgdGhpcyk7XG5cbiAgICAvLyBWYWxpZGF0ZSBleHBpcmF0aW9uIGR1cmF0aW9uXG4gICAgdGhyb3dJZkludmFsaWQodGhpcy5fdmFsaWRhdGVNZW1vcnlFeHBpcmF0aW9uRGF5cywgdGhpcy5leHBpcmF0aW9uRHVyYXRpb24udG9EYXlzKCkpO1xuXG4gICAgLy8gVmFsaWRhdGUgbWVtb3J5IHRhZ3NcbiAgICB0aHJvd0lmSW52YWxpZCh0aGlzLl92YWxpZGF0ZU1lbW9yeVRhZ3MsIHRoaXMudGFncywgdGhpcyk7XG5cbiAgICAvLyBNZW1vcnkgc3RyYXRlZ2llcyBhcmUgYWxyZWFkeSB2YWxpZGF0ZWQgd2hlbiBidWlsZGluZyB0aGVtLCBzbyBubyBuZWVkIHRvIHZhbGlkYXRlIHRoZW0gaGVyZVxuXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gQ0ZOIFByb3BzIC0gV2l0aCBMYXp5IHN1cHBvcnRcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBjb25zdCBjZm5Qcm9wczogQ2ZuTWVtb3J5UHJvcHMgPSB7XG4gICAgICBuYW1lOiB0aGlzLm1lbW9yeU5hbWUsXG4gICAgICBkZXNjcmlwdGlvbjogdGhpcy5kZXNjcmlwdGlvbixcbiAgICAgIGV2ZW50RXhwaXJ5RHVyYXRpb246IHRoaXMuZXhwaXJhdGlvbkR1cmF0aW9uLnRvRGF5cygpLFxuICAgICAgZW5jcnlwdGlvbktleUFybjogdGhpcy5rbXNLZXk/LmtleUFybixcbiAgICAgIG1lbW9yeUV4ZWN1dGlvblJvbGVBcm46IHRoaXMuZXhlY3V0aW9uUm9sZT8ucm9sZUFybixcbiAgICAgIG1lbW9yeVN0cmF0ZWdpZXM6IExhenkuYW55KHsgcHJvZHVjZTogKCkgPT4gdGhpcy5fcmVuZGVyTWVtb3J5U3RyYXRlZ2llcygpIH0sIHsgb21pdEVtcHR5QXJyYXk6IHRydWUgfSksXG4gICAgICB0YWdzOiB0aGlzLnRhZ3MsXG4gICAgfTtcblxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIENGTiBSZXNvdXJjZVxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIHRoaXMuX19yZXNvdXJjZSA9IG5ldyBDZm5NZW1vcnkodGhpcywgJ01lbW9yeScsIGNmblByb3BzKTtcblxuICAgIHRoaXMubWVtb3J5SWQgPSB0aGlzLl9fcmVzb3VyY2UuYXR0ck1lbW9yeUlkO1xuICAgIHRoaXMubWVtb3J5QXJuID0gdGhpcy5fX3Jlc291cmNlLmF0dHJNZW1vcnlBcm47XG4gICAgdGhpcy5zdGF0dXMgPSB0aGlzLl9fcmVzb3VyY2UuYXR0clN0YXR1cztcbiAgICB0aGlzLnVwZGF0ZWRBdCA9IHRoaXMuX19yZXNvdXJjZS5hdHRyVXBkYXRlZEF0O1xuICAgIHRoaXMuY3JlYXRlZEF0ID0gdGhpcy5fX3Jlc291cmNlLmF0dHJDcmVhdGVkQXQ7XG4gICAgdGhpcy5mYWlsdXJlUmVhc29uID0gdGhpcy5fX3Jlc291cmNlLmF0dHJGYWlsdXJlUmVhc29uO1xuXG4gICAgLy8gQWRkIG1lbW9yeSBzdHJhdGVnaWVzIHRvIHRoZSBtZW1vcnlcbiAgICBmb3IgKGNvbnN0IHN0cmF0ZWd5IG9mIHByb3BzLm1lbW9yeVN0cmF0ZWdpZXMgPz8gW10pIHt0aGlzLmFkZE1lbW9yeVN0cmF0ZWd5KHN0cmF0ZWd5KTt9XG4gIH1cblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gSEVMUEVSIE1FVEhPRFMgLSBhZGRYKClcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8qKlxuICAgKiBBZGQgbWVtb3J5IHN0cmF0ZWd5IHRvIHRoZSBtZW1vcnkuXG4gICAqIEBkZWZhdWx0IC0gTm8gbWVtb3J5IHN0cmF0ZWdpZXMuXG4gICAqL1xuICBATWV0aG9kTWV0YWRhdGEoKVxuICBwdWJsaWMgYWRkTWVtb3J5U3RyYXRlZ3kobWVtb3J5U3RyYXRlZ3k6IElNZW1vcnlTdHJhdGVneSkge1xuICAgIC8vIEFkZCB0aGUgbWVtb3J5IHN0cmF0ZWd5IHRvIHRoZSBtZW1vcnlcbiAgICB0aGlzLm1lbW9yeVN0cmF0ZWdpZXMucHVzaChtZW1vcnlTdHJhdGVneSk7XG5cbiAgICAvLyBHcmFudCBuZWNlc3NhcnkgcGVybWlzc2lvbnMgdG8gdGhlIGV4ZWN1dGlvbiByb2xlXG4gICAgY29uc3QgZ3JhbnQgPSBtZW1vcnlTdHJhdGVneS5ncmFudCh0aGlzLmV4ZWN1dGlvblJvbGUgYXMgaWFtLklSb2xlKTtcbiAgICBncmFudD8uYXBwbHlCZWZvcmUodGhpcy5fX3Jlc291cmNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGV4ZWN1dGlvbiByb2xlIG5lZWRlZCBmb3IgdGhlIG1lbW9yeSB0byBhY2Nlc3MgQVdTIHNlcnZpY2VzXG4gICAqIEByZXR1cm5zIFRoZSBjcmVhdGVkIHJvbGVcbiAgICogQGludGVybmFsIFRoaXMgaXMgYW4gaW50ZXJuYWwgY29yZSBmdW5jdGlvbiBhbmQgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZGlyZWN0bHkuXG4gICAqL1xuICBwcml2YXRlIF9jcmVhdGVNZW1vcnlSb2xlKCk6IGlhbS5JUm9sZSB7XG4gICAgY29uc3Qgcm9sZSA9IG5ldyBpYW0uUm9sZSh0aGlzLCAnU2VydmljZVJvbGUnLCB7XG4gICAgICBhc3N1bWVkQnk6IG5ldyBpYW0uU2VydmljZVByaW5jaXBhbCgnYmVkcm9jay1hZ2VudGNvcmUuYW1hem9uYXdzLmNvbScpLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJvbGU7XG4gIH1cblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gVkFMSURBVE9SU1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyB0aGUgbWVtb3J5IHRhZ3MgZm9ybWF0XG4gICAqIEBwYXJhbSB0YWdzIFRoZSB0YWdzIG9iamVjdCB0byB2YWxpZGF0ZVxuICAgKiBAcmV0dXJucyBBcnJheSBvZiB2YWxpZGF0aW9uIGVycm9yIG1lc3NhZ2VzLCBlbXB0eSBpZiB2YWxpZFxuICAgKi9cbiAgcHJpdmF0ZSBfdmFsaWRhdGVNZW1vcnlUYWdzID0gKHRhZ3M/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9LCBzY29wZT86IElDb25zdHJ1Y3QpOiBzdHJpbmdbXSA9PiB7XG4gICAgbGV0IGVycm9yczogc3RyaW5nW10gPSBbXTtcbiAgICBpZiAoIXRhZ3MpIHtcbiAgICAgIHJldHVybiBlcnJvcnM7IC8vIFRhZ3MgYXJlIG9wdGlvbmFsXG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgZWFjaCB0YWcga2V5IGFuZCB2YWx1ZVxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHRhZ3MpKSB7XG4gICAgICBlcnJvcnMucHVzaCguLi52YWxpZGF0ZVN0cmluZ0ZpZWxkTGVuZ3RoKHtcbiAgICAgICAgdmFsdWU6IGtleSxcbiAgICAgICAgZmllbGROYW1lOiAnVGFnIGtleScsXG4gICAgICAgIG1pbkxlbmd0aDogTUVNT1JZX1RBR19NSU5fTEVOR1RILFxuICAgICAgICBtYXhMZW5ndGg6IE1FTU9SWV9UQUdfTUFYX0xFTkdUSCxcbiAgICAgIH0sIHNjb3BlKSk7XG5cbiAgICAgIC8vIFZhbGlkYXRlIHRhZyBrZXkgcGF0dGVybjogXlthLXpBLVowLTlcXHMuXzovPStALV0qJFxuICAgICAgY29uc3QgdmFsaWRLZXlQYXR0ZXJuID0gL15bYS16QS1aMC05XFxzLl86Lz0rQC1dKiQvO1xuICAgICAgZXJyb3JzLnB1c2goLi4udmFsaWRhdGVGaWVsZFBhdHRlcm4oa2V5LCAnVGFnIGtleScsIHZhbGlkS2V5UGF0dGVybiwgdW5kZWZpbmVkLCBzY29wZSkpO1xuXG4gICAgICAvLyBWYWxpZGF0ZSB0YWcgdmFsdWVcbiAgICAgIGVycm9ycy5wdXNoKC4uLnZhbGlkYXRlU3RyaW5nRmllbGRMZW5ndGgoe1xuICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgIGZpZWxkTmFtZTogJ1RhZyB2YWx1ZScsXG4gICAgICAgIG1pbkxlbmd0aDogTUVNT1JZX1RBR19NSU5fTEVOR1RILFxuICAgICAgICBtYXhMZW5ndGg6IE1FTU9SWV9UQUdfTUFYX0xFTkdUSCxcbiAgICAgIH0sIHNjb3BlKSk7XG5cbiAgICAgIC8vIFZhbGlkYXRlIHRhZyB2YWx1ZSBwYXR0ZXJuOiBeW2EtekEtWjAtOVxccy5fOi89K0AtXSokXG4gICAgICBjb25zdCB2YWxpZFZhbHVlUGF0dGVybiA9IC9eW2EtekEtWjAtOVxccy5fOi89K0AtXSokLztcbiAgICAgIGVycm9ycy5wdXNoKC4uLnZhbGlkYXRlRmllbGRQYXR0ZXJuKHZhbHVlLCAnVGFnIHZhbHVlJywgdmFsaWRWYWx1ZVBhdHRlcm4sIHVuZGVmaW5lZCwgc2NvcGUpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZXJyb3JzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgdGhlIG1lbW9yeSBuYW1lIGZvcm1hdFxuICAgKiBAcGFyYW0gbmFtZSBUaGUgbWVtb3J5IG5hbWUgdG8gdmFsaWRhdGVcbiAgICogQHJldHVybnMgQXJyYXkgb2YgdmFsaWRhdGlvbiBlcnJvciBtZXNzYWdlcywgZW1wdHkgaWYgdmFsaWRcbiAgICovXG4gIHByaXZhdGUgX3ZhbGlkYXRlTWVtb3J5TmFtZSA9IChuYW1lOiBzdHJpbmcsIHNjb3BlPzogSUNvbnN0cnVjdCk6IHN0cmluZ1tdID0+IHtcbiAgICBsZXQgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgZXJyb3JzLnB1c2goLi4udmFsaWRhdGVTdHJpbmdGaWVsZExlbmd0aCh7XG4gICAgICB2YWx1ZTogbmFtZSxcbiAgICAgIGZpZWxkTmFtZTogJ01lbW9yeSBuYW1lJyxcbiAgICAgIG1pbkxlbmd0aDogTUVNT1JZX05BTUVfTUlOX0xFTkdUSCxcbiAgICAgIG1heExlbmd0aDogTUVNT1JZX05BTUVfTUFYX0xFTkdUSCxcbiAgICB9LCBzY29wZSkpO1xuXG4gICAgLy8gQ2hlY2sgaWYgbmFtZSBtYXRjaGVzIHRoZSBBV1MgQVBJIHBhdHRlcm46IFthLXpBLVpdW2EtekEtWjAtOV9dezAsNDd9XG4gICAgLy8gTXVzdCBzdGFydCB3aXRoIGEgbGV0dGVyLCBmb2xsb3dlZCBieSB1cCB0byA0NyBsZXR0ZXJzLCBudW1iZXJzLCBvciB1bmRlcnNjb3Jlc1xuICAgIGNvbnN0IHZhbGlkTmFtZVBhdHRlcm4gPSAvXlthLXpBLVpdW2EtekEtWjAtOV9dezAsNDd9JC87XG4gICAgZXJyb3JzLnB1c2goLi4udmFsaWRhdGVGaWVsZFBhdHRlcm4obmFtZSwgJ01lbW9yeSBuYW1lJywgdmFsaWROYW1lUGF0dGVybiwgdW5kZWZpbmVkLCBzY29wZSkpO1xuXG4gICAgcmV0dXJuIGVycm9ycztcbiAgfTtcblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoZSBtZW1vcnkgZXhwaXJhdGlvbiBkYXlzXG4gICAqIEBwYXJhbSBleHBpcmF0aW9uRGF5cyBUaGUgbWVtb3J5IGV4cGlyYXRpb24gZGF5cyB0byB2YWxpZGF0ZVxuICAgKiBAcmV0dXJucyBBcnJheSBvZiB2YWxpZGF0aW9uIGVycm9yIG1lc3NhZ2VzLCBlbXB0eSBpZiB2YWxpZFxuICAgKi9cbiAgcHJpdmF0ZSBfdmFsaWRhdGVNZW1vcnlFeHBpcmF0aW9uRGF5cyA9IChleHBpcmF0aW9uRGF5czogbnVtYmVyKTogc3RyaW5nW10gPT4ge1xuICAgIGxldCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG5cbiAgICBpZiAoZXhwaXJhdGlvbkRheXMgPCBNRU1PUllfRVhQSVJBVElPTl9EQVlTX01JTiB8fCBleHBpcmF0aW9uRGF5cyA+IE1FTU9SWV9FWFBJUkFUSU9OX0RBWVNfTUFYKSB7XG4gICAgICBlcnJvcnMucHVzaChgTWVtb3J5IGV4cGlyYXRpb24gZGF5cyBtdXN0IGJlIGJldHdlZW4gJHtNRU1PUllfRVhQSVJBVElPTl9EQVlTX01JTn0gYW5kICR7TUVNT1JZX0VYUElSQVRJT05fREFZU19NQVh9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVycm9ycztcbiAgfTtcblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gUkVOREVSRVJTXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvKipcbiAgICogUmVuZGVyIHRoZSBtZW1vcnkgc3RyYXRlZ2llcy5cbiAgICpcbiAgICogQHJldHVybnMgQXJyYXkgb2YgTWVtb3J5U3RyYXRlZ3lQcm9wZXJ0eSBvYmplY3RzIGluIENsb3VkRm9ybWF0aW9uIGZvcm1hdCwgb3IgdW5kZWZpbmVkIGlmIG5vIHN0cmF0ZWdpZXMgYXJlIGRlZmluZWRcbiAgICogQGRlZmF1bHQgLSB1bmRlZmluZWQgaWYgbm8gc3RyYXRlZ2llcyBhcmUgZGVmaW5lZCBvciBhcnJheSBpcyBlbXB0eVxuICAgKiBAaW50ZXJuYWwgVGhpcyBpcyBhbiBpbnRlcm5hbCBjb3JlIGZ1bmN0aW9uIGFuZCBzaG91bGQgbm90IGJlIGNhbGxlZCBkaXJlY3RseS5cbiAgICovXG4gIHByaXZhdGUgX3JlbmRlck1lbW9yeVN0cmF0ZWdpZXMoKTogYmVkcm9ja2FnZW50Y29yZS5DZm5NZW1vcnkuTWVtb3J5U3RyYXRlZ3lQcm9wZXJ0eVtdIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXRoaXMubWVtb3J5U3RyYXRlZ2llcyB8fCB0aGlzLm1lbW9yeVN0cmF0ZWdpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLm1lbW9yeVN0cmF0ZWdpZXMubWFwKG1zID0+IG1zLnJlbmRlcigpKTtcbiAgfVxufVxuIl19