@fjall/components-infrastructure 0.79.3 → 0.81.2

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 (63) hide show
  1. package/dist/lib/__tests__/setup.js +1 -78
  2. package/dist/lib/app.d.ts +39 -2
  3. package/dist/lib/app.js +85 -4
  4. package/dist/lib/aspects/resourceInventory.d.ts +41 -0
  5. package/dist/lib/aspects/resourceInventory.js +56 -0
  6. package/dist/lib/config/audit.d.ts +18 -0
  7. package/dist/lib/config/audit.js +22 -0
  8. package/dist/lib/config/aws/accountId.js +3 -3
  9. package/dist/lib/config/aws/ecrDefaultImage.js +7 -7
  10. package/dist/lib/config/aws/identityCenter.js +7 -8
  11. package/dist/lib/config/aws/identityCenterGroupMembership.js +6 -6
  12. package/dist/lib/config/aws/ipam.js +3 -3
  13. package/dist/lib/config/aws/ipamPoolId.js +4 -4
  14. package/dist/lib/config/aws/organisation.js +2 -3
  15. package/dist/lib/config/aws/organisationId.js +4 -4
  16. package/dist/lib/patterns/aws/auditRole.d.ts +44 -0
  17. package/dist/lib/patterns/aws/auditRole.js +58 -0
  18. package/dist/lib/patterns/aws/buildkite.js +12 -12
  19. package/dist/lib/patterns/aws/compute.d.ts +32 -13
  20. package/dist/lib/patterns/aws/compute.js +24 -14
  21. package/dist/lib/patterns/aws/database.d.ts +2 -1
  22. package/dist/lib/patterns/aws/database.js +7 -2
  23. package/dist/lib/patterns/aws/hostedZone.js +1 -1
  24. package/dist/lib/patterns/aws/index.d.ts +1 -0
  25. package/dist/lib/patterns/aws/index.js +2 -1
  26. package/dist/lib/patterns/aws/managedAccount.js +3 -4
  27. package/dist/lib/patterns/aws/storage.js +3 -2
  28. package/dist/lib/patterns/aws/subdomainHostedZone.js +2 -2
  29. package/dist/lib/resources/aws/audit/auditRole.d.ts +32 -0
  30. package/dist/lib/resources/aws/audit/auditRole.js +44 -0
  31. package/dist/lib/resources/aws/backup/backupPlan.js +3 -4
  32. package/dist/lib/resources/aws/backup/backupVault.js +3 -4
  33. package/dist/lib/resources/aws/base/awsStack.js +1 -2
  34. package/dist/lib/resources/aws/compute/ecs.d.ts +65 -11
  35. package/dist/lib/resources/aws/compute/ecs.js +293 -124
  36. package/dist/lib/resources/aws/compute/ecsFreeTier.js +1 -355
  37. package/dist/lib/resources/aws/compute/ecsSpot.js +1 -335
  38. package/dist/lib/resources/aws/compute/lambda.d.ts +10 -1
  39. package/dist/lib/resources/aws/compute/lambda.js +71 -4
  40. package/dist/lib/resources/aws/compute/utilities/capacityProviderDrainWaiter.js +1 -180
  41. package/dist/lib/resources/aws/database/database.js +1 -1
  42. package/dist/lib/resources/aws/database/rdsAurora.js +5 -5
  43. package/dist/lib/resources/aws/database/rdsAuroraGlobal.js +7 -7
  44. package/dist/lib/resources/aws/database/rdsInstance.js +3 -3
  45. package/dist/lib/resources/aws/iam/identityCenter/assignment.js +2 -2
  46. package/dist/lib/resources/aws/iam/identityCenter/attachManagedPolicy.js +1 -1
  47. package/dist/lib/resources/aws/iam/identityCenter/group.js +1 -1
  48. package/dist/lib/resources/aws/iam/identityCenter/permissionSet.js +1 -1
  49. package/dist/lib/resources/aws/logging/cloudTrail.js +1 -1
  50. package/dist/lib/resources/aws/monitoring/monitoringRole.js +2 -3
  51. package/dist/lib/resources/aws/networking/ipamPool.js +1 -1
  52. package/dist/lib/resources/aws/networking/vpc.d.ts +1 -0
  53. package/dist/lib/resources/aws/networking/vpc.js +7 -3
  54. package/dist/lib/resources/aws/secrets/secret.js +1 -1
  55. package/dist/lib/resources/aws/storage/ecr.d.ts +1 -2
  56. package/dist/lib/resources/aws/storage/ecr.js +2 -2
  57. package/dist/lib/resources/aws/utilities/cfnOutput.js +1 -13
  58. package/dist/lib/resources/aws/utilities/codeBuild.d.ts +1 -2
  59. package/dist/lib/resources/aws/utilities/codeBuild.js +1 -1
  60. package/dist/lib/resources/aws/utilities/customResource.d.ts +2 -1
  61. package/dist/lib/resources/aws/utilities/customResource.js +1 -1
  62. package/dist/lib/utils/getStackOutput.js +2 -2
  63. package/package.json +6 -5
@@ -1,13 +1,16 @@
1
1
  import { SingletonFunction as singletonFunction, Function, type Code, type Runtime, FunctionUrlAuthType, type FunctionUrlCorsOptions } from "aws-cdk-lib/aws-lambda";
2
- import { type PolicyStatement, type IRole } from "aws-cdk-lib/aws-iam";
2
+ import { PolicyStatement, type IRole } from "aws-cdk-lib/aws-iam";
3
+ import { type IVpc } from "aws-cdk-lib/aws-ec2";
3
4
  import { type Construct } from "constructs";
4
5
  import { type KeyValue } from "../../../types";
6
+ import { type SecretImport } from "../secrets";
5
7
  export interface lambdaFunctionProps {
6
8
  code: Code;
7
9
  handler: string;
8
10
  lambdaDescription?: string;
9
11
  roleDescription?: string;
10
12
  runtime: Runtime;
13
+ vpc?: IVpc;
11
14
  timeout?: number;
12
15
  memorySize?: number;
13
16
  inlinePolicy: PolicyStatement[];
@@ -16,9 +19,14 @@ export interface lambdaFunctionProps {
16
19
  functionUrlCors?: FunctionUrlCorsOptions;
17
20
  environment?: KeyValue;
18
21
  tags?: KeyValue;
22
+ scheduleExpression?: string;
23
+ containerSecretsImport?: {
24
+ [key: string]: SecretImport;
25
+ };
19
26
  }
20
27
  export interface SingletonFunctionProps extends lambdaFunctionProps {
21
28
  uuid?: string;
29
+ ephemeralStorageSize?: number;
22
30
  }
23
31
  export declare class SingletonFunction extends singletonFunction {
24
32
  constructor(scope: Construct, id: string, props: SingletonFunctionProps);
@@ -35,4 +43,5 @@ export declare class LambdaFunction extends Function {
35
43
  */
36
44
  get executionRole(): IRole | undefined;
37
45
  private addPoliciesToRole;
46
+ private addContainerSecretsImportToRole;
38
47
  }
@@ -3,8 +3,14 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.LambdaFunction = exports.SingletonFunction = void 0;
4
4
  const aws_cdk_lib_1 = require("aws-cdk-lib");
5
5
  const aws_lambda_1 = require("aws-cdk-lib/aws-lambda");
6
+ const aws_iam_1 = require("aws-cdk-lib/aws-iam");
7
+ const aws_ec2_1 = require("aws-cdk-lib/aws-ec2");
8
+ const aws_events_1 = require("aws-cdk-lib/aws-events");
9
+ const aws_events_targets_1 = require("aws-cdk-lib/aws-events-targets");
10
+ const aws_logs_1 = require("aws-cdk-lib/aws-logs");
11
+ const aws_secretsmanager_1 = require("aws-cdk-lib/aws-secretsmanager");
6
12
  const uuid_1 = require("uuid");
7
- const cfnOutput_1 = require("../utilities/cfnOutput");
13
+ const vpc_1 = require("../networking/vpc");
8
14
  class SingletonFunction extends aws_lambda_1.SingletonFunction {
9
15
  constructor(scope, id, props) {
10
16
  super(scope, id, {
@@ -12,7 +18,10 @@ class SingletonFunction extends aws_lambda_1.SingletonFunction {
12
18
  uuid: (0, uuid_1.v4)(),
13
19
  timeout: aws_cdk_lib_1.Duration.seconds(300),
14
20
  description: props.lambdaDescription || `${id} singleton lambda`,
15
- runtime: props.runtime
21
+ runtime: props.runtime,
22
+ ephemeralStorageSize: props.ephemeralStorageSize
23
+ ? aws_cdk_lib_1.Size.mebibytes(props.ephemeralStorageSize)
24
+ : undefined
16
25
  });
17
26
  // Add inline policies to the Lambda's auto-generated role
18
27
  this.addPoliciesToRole(props.inlinePolicy);
@@ -32,8 +41,21 @@ class SingletonFunction extends aws_lambda_1.SingletonFunction {
32
41
  exports.SingletonFunction = SingletonFunction;
33
42
  class LambdaFunction extends aws_lambda_1.Function {
34
43
  constructor(scope, id, props) {
44
+ // Explicitly set subnet selection to match VPC endpoint placement
45
+ // - With NAT: PRIVATE_WITH_EGRESS (can access internet via NAT)
46
+ // - Without NAT: PRIVATE_ISOLATED (can access VPC endpoints only, no internet)
47
+ let vpcSubnets;
48
+ if (props.vpc) {
49
+ const hasNatGateways = props.vpc instanceof vpc_1.Vpc ? props.vpc.hasNatGateways : true;
50
+ vpcSubnets = {
51
+ subnetType: hasNatGateways
52
+ ? aws_ec2_1.SubnetType.PRIVATE_WITH_EGRESS
53
+ : aws_ec2_1.SubnetType.PRIVATE_ISOLATED
54
+ };
55
+ }
35
56
  super(scope, id, {
36
57
  ...props,
58
+ vpcSubnets,
37
59
  timeout: props.timeout
38
60
  ? aws_cdk_lib_1.Duration.seconds(props.timeout)
39
61
  : aws_cdk_lib_1.Duration.seconds(300),
@@ -43,16 +65,30 @@ class LambdaFunction extends aws_lambda_1.Function {
43
65
  });
44
66
  // Add inline policies to the Lambda's auto-generated role
45
67
  this.addPoliciesToRole(props.inlinePolicy);
68
+ this.addContainerSecretsImportToRole(id, props.containerSecretsImport);
46
69
  if (props.enableFunctionUrl) {
47
70
  const functionUrl = this.addFunctionUrl({
48
71
  authType: props.functionUrlAuthType || aws_lambda_1.FunctionUrlAuthType.AWS_IAM,
49
72
  cors: props.functionUrlCors
50
73
  });
51
- new cfnOutput_1.CfnOutput(this, "LambdaFunctionUrl", {
74
+ new aws_cdk_lib_1.CfnOutput(this, `${id}FunctionUrl`, {
75
+ key: `${id}FunctionUrl`,
52
76
  value: functionUrl.url,
53
77
  description: `${id} Function URL`
54
78
  });
55
79
  }
80
+ // Add schedule if provided
81
+ if (props.scheduleExpression) {
82
+ const rule = new aws_events_1.Rule(this, `${id}ScheduleRule`, {
83
+ schedule: aws_events_1.Schedule.expression(props.scheduleExpression)
84
+ });
85
+ rule.addTarget(new aws_events_targets_1.LambdaFunction(this));
86
+ }
87
+ // Create log group with one week retention
88
+ new aws_logs_1.LogGroup(this, `${id}LogGroup`, {
89
+ logGroupName: `/aws/lambda/${this.functionName}`,
90
+ retention: aws_logs_1.RetentionDays.ONE_WEEK
91
+ });
56
92
  }
57
93
  /**
58
94
  * The Lambda's execution role (auto-generated by CDK)
@@ -65,6 +101,37 @@ class LambdaFunction extends aws_lambda_1.Function {
65
101
  this.addToRolePolicy(statement);
66
102
  }
67
103
  }
104
+ addContainerSecretsImportToRole(id, containerSecretsImport) {
105
+ if (!containerSecretsImport)
106
+ return;
107
+ let addedSecrets = false;
108
+ for (const [key, secretImport] of Object.entries(containerSecretsImport)) {
109
+ // Import the secret from Secrets Manager
110
+ const secret = aws_secretsmanager_1.Secret.fromSecretNameV2(this, `${id}ImportedSecret${key}`, secretImport.name);
111
+ // For Lambda, inject the secret ARN as an env var
112
+ // The Lambda function code will retrieve the actual value at runtime
113
+ this.addEnvironment(key, secret.secretArn);
114
+ // Grant read access to the lambda itself
115
+ // (this should auto attach to the generated role)
116
+ secret.grantRead(this);
117
+ addedSecrets = true;
118
+ }
119
+ if (addedSecrets) {
120
+ // Add KMS decrypt permissions for secrets
121
+ // When importing secrets with fromSecretNameV2, we don't have access to the KMS key,
122
+ // so we need to grant decrypt permission on all keys used by Secrets Manager
123
+ this.addToRolePolicy(new aws_iam_1.PolicyStatement({
124
+ effect: aws_iam_1.Effect.ALLOW,
125
+ actions: ["kms:Decrypt", "kms:DescribeKey"],
126
+ resources: ["*"],
127
+ conditions: {
128
+ StringEquals: {
129
+ "kms:ViaService": `secretsmanager.${aws_cdk_lib_1.Stack.of(this).region}.amazonaws.com`
130
+ }
131
+ }
132
+ }));
133
+ }
134
+ }
68
135
  }
69
136
  exports.LambdaFunction = LambdaFunction;
70
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGFtYmRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGliL3Jlc291cmNlcy9hd3MvY29tcHV0ZS9sYW1iZGEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkNBQXVDO0FBQ3ZDLHVEQU9nQztBQUdoQywrQkFBa0M7QUFFbEMsc0RBQW1EO0FBNkJuRCxNQUFhLGlCQUFrQixTQUFRLDhCQUFpQjtJQUN0RCxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQTZCO1FBQ3JFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFO1lBQ2YsR0FBRyxLQUFLO1lBQ1IsSUFBSSxFQUFFLElBQUEsU0FBSSxHQUFFO1lBQ1osT0FBTyxFQUFFLHNCQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQztZQUM5QixXQUFXLEVBQUUsS0FBSyxDQUFDLGlCQUFpQixJQUFJLEdBQUcsRUFBRSxtQkFBbUI7WUFDaEUsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPO1NBQ3ZCLENBQUMsQ0FBQztRQUVILDBEQUEwRDtRQUMxRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRDs7T0FFRztJQUNILElBQVcsYUFBYTtRQUN0QixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDbkIsQ0FBQztJQUVPLGlCQUFpQixDQUFDLFVBQTZCO1FBQ3JELEtBQUssTUFBTSxTQUFTLElBQUksVUFBVSxFQUFFLENBQUM7WUFDbkMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNsQyxDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBMUJELDhDQTBCQztBQUVELE1BQWEsY0FBZSxTQUFRLHFCQUFRO0lBQzFDLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBMEI7UUFDbEUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUU7WUFDZixHQUFHLEtBQUs7WUFDUixPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU87Z0JBQ3BCLENBQUMsQ0FBQyxzQkFBUSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDO2dCQUNqQyxDQUFDLENBQUMsc0JBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDO1lBQ3pCLFVBQVUsRUFBRSxLQUFLLENBQUMsVUFBVSxJQUFJLEdBQUc7WUFDbkMsV0FBVyxFQUFFLEtBQUssQ0FBQyxpQkFBaUIsSUFBSSxHQUFHLEVBQUUsU0FBUztZQUN0RCxXQUFXLEVBQUUsS0FBSyxDQUFDLFdBQVc7U0FDL0IsQ0FBQyxDQUFDO1FBRUgsMERBQTBEO1FBQzFELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7UUFFM0MsSUFBSSxLQUFLLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUM1QixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDO2dCQUN0QyxRQUFRLEVBQUUsS0FBSyxDQUFDLG1CQUFtQixJQUFJLGdDQUFtQixDQUFDLE9BQU87Z0JBQ2xFLElBQUksRUFBRSxLQUFLLENBQUMsZUFBZTthQUM1QixDQUFDLENBQUM7WUFFSCxJQUFJLHFCQUFTLENBQUMsSUFBSSxFQUFFLG1CQUFtQixFQUFFO2dCQUN2QyxLQUFLLEVBQUUsV0FBVyxDQUFDLEdBQUc7Z0JBQ3RCLFdBQVcsRUFBRSxHQUFHLEVBQUUsZUFBZTthQUNsQyxDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBVyxhQUFhO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQztJQUNuQixDQUFDO0lBRU8saUJBQWlCLENBQUMsVUFBNkI7UUFDckQsS0FBSyxNQUFNLFNBQVMsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUNuQyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2xDLENBQUM7SUFDSCxDQUFDO0NBQ0Y7QUF4Q0Qsd0NBd0NDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRHVyYXRpb24gfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7XG4gIFNpbmdsZXRvbkZ1bmN0aW9uIGFzIHNpbmdsZXRvbkZ1bmN0aW9uLFxuICBGdW5jdGlvbixcbiAgdHlwZSBDb2RlLFxuICB0eXBlIFJ1bnRpbWUsXG4gIEZ1bmN0aW9uVXJsQXV0aFR5cGUsXG4gIHR5cGUgRnVuY3Rpb25VcmxDb3JzT3B0aW9uc1xufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxhbWJkYVwiO1xuaW1wb3J0IHsgdHlwZSBQb2xpY3lTdGF0ZW1lbnQsIHR5cGUgSVJvbGUgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWlhbVwiO1xuaW1wb3J0IHsgdHlwZSBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHsgdjQgYXMgdXVpZCB9IGZyb20gXCJ1dWlkXCI7XG5cbmltcG9ydCB7IENmbk91dHB1dCB9IGZyb20gXCIuLi91dGlsaXRpZXMvY2ZuT3V0cHV0XCI7XG5pbXBvcnQgeyB0eXBlIEtleVZhbHVlIH0gZnJvbSBcIi4uLy4uLy4uL3R5cGVzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgbGFtYmRhRnVuY3Rpb25Qcm9wcyB7XG4gIGNvZGU6IENvZGU7XG4gIGhhbmRsZXI6IHN0cmluZztcbiAgbGFtYmRhRGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIHJvbGVEZXNjcmlwdGlvbj86IHN0cmluZztcbiAgcnVudGltZTogUnVudGltZTtcbiAgdGltZW91dD86IG51bWJlcjtcbiAgbWVtb3J5U2l6ZT86IG51bWJlcjtcbiAgaW5saW5lUG9saWN5OiBQb2xpY3lTdGF0ZW1lbnRbXTtcblxuICAvLyBMYW1iZGEgVVJMIHByb3BlcnRpZXNcbiAgZW5hYmxlRnVuY3Rpb25Vcmw/OiBib29sZWFuO1xuICBmdW5jdGlvblVybEF1dGhUeXBlPzogRnVuY3Rpb25VcmxBdXRoVHlwZTtcbiAgZnVuY3Rpb25VcmxDb3JzPzogRnVuY3Rpb25VcmxDb3JzT3B0aW9ucztcblxuICAvLyBFbnZpcm9ubWVudCB2YXJpYWJsZXNcbiAgZW52aXJvbm1lbnQ/OiBLZXlWYWx1ZTtcblxuICAvLyBUYWdzXG4gIHRhZ3M/OiBLZXlWYWx1ZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTaW5nbGV0b25GdW5jdGlvblByb3BzIGV4dGVuZHMgbGFtYmRhRnVuY3Rpb25Qcm9wcyB7XG4gIHV1aWQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBTaW5nbGV0b25GdW5jdGlvbiBleHRlbmRzIHNpbmdsZXRvbkZ1bmN0aW9uIHtcbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFNpbmdsZXRvbkZ1bmN0aW9uUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHtcbiAgICAgIC4uLnByb3BzLFxuICAgICAgdXVpZDogdXVpZCgpLFxuICAgICAgdGltZW91dDogRHVyYXRpb24uc2Vjb25kcygzMDApLFxuICAgICAgZGVzY3JpcHRpb246IHByb3BzLmxhbWJkYURlc2NyaXB0aW9uIHx8IGAke2lkfSBzaW5nbGV0b24gbGFtYmRhYCxcbiAgICAgIHJ1bnRpbWU6IHByb3BzLnJ1bnRpbWVcbiAgICB9KTtcblxuICAgIC8vIEFkZCBpbmxpbmUgcG9saWNpZXMgdG8gdGhlIExhbWJkYSdzIGF1dG8tZ2VuZXJhdGVkIHJvbGVcbiAgICB0aGlzLmFkZFBvbGljaWVzVG9Sb2xlKHByb3BzLmlubGluZVBvbGljeSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIExhbWJkYSdzIGV4ZWN1dGlvbiByb2xlIChhdXRvLWdlbmVyYXRlZCBieSBDREspXG4gICAqL1xuICBwdWJsaWMgZ2V0IGV4ZWN1dGlvblJvbGUoKTogSVJvbGUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnJvbGU7XG4gIH1cblxuICBwcml2YXRlIGFkZFBvbGljaWVzVG9Sb2xlKHN0YXRlbWVudHM6IFBvbGljeVN0YXRlbWVudFtdKSB7XG4gICAgZm9yIChjb25zdCBzdGF0ZW1lbnQgb2Ygc3RhdGVtZW50cykge1xuICAgICAgdGhpcy5hZGRUb1JvbGVQb2xpY3koc3RhdGVtZW50KTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIExhbWJkYUZ1bmN0aW9uIGV4dGVuZHMgRnVuY3Rpb24ge1xuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogbGFtYmRhRnVuY3Rpb25Qcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwge1xuICAgICAgLi4ucHJvcHMsXG4gICAgICB0aW1lb3V0OiBwcm9wcy50aW1lb3V0XG4gICAgICAgID8gRHVyYXRpb24uc2Vjb25kcyhwcm9wcy50aW1lb3V0KVxuICAgICAgICA6IER1cmF0aW9uLnNlY29uZHMoMzAwKSxcbiAgICAgIG1lbW9yeVNpemU6IHByb3BzLm1lbW9yeVNpemUgfHwgMTI4LFxuICAgICAgZGVzY3JpcHRpb246IHByb3BzLmxhbWJkYURlc2NyaXB0aW9uIHx8IGAke2lkfSBMYW1iZGFgLFxuICAgICAgZW52aXJvbm1lbnQ6IHByb3BzLmVudmlyb25tZW50XG4gICAgfSk7XG5cbiAgICAvLyBBZGQgaW5saW5lIHBvbGljaWVzIHRvIHRoZSBMYW1iZGEncyBhdXRvLWdlbmVyYXRlZCByb2xlXG4gICAgdGhpcy5hZGRQb2xpY2llc1RvUm9sZShwcm9wcy5pbmxpbmVQb2xpY3kpO1xuXG4gICAgaWYgKHByb3BzLmVuYWJsZUZ1bmN0aW9uVXJsKSB7XG4gICAgICBjb25zdCBmdW5jdGlvblVybCA9IHRoaXMuYWRkRnVuY3Rpb25Vcmwoe1xuICAgICAgICBhdXRoVHlwZTogcHJvcHMuZnVuY3Rpb25VcmxBdXRoVHlwZSB8fCBGdW5jdGlvblVybEF1dGhUeXBlLkFXU19JQU0sXG4gICAgICAgIGNvcnM6IHByb3BzLmZ1bmN0aW9uVXJsQ29yc1xuICAgICAgfSk7XG5cbiAgICAgIG5ldyBDZm5PdXRwdXQodGhpcywgXCJMYW1iZGFGdW5jdGlvblVybFwiLCB7XG4gICAgICAgIHZhbHVlOiBmdW5jdGlvblVybC51cmwsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBgJHtpZH0gRnVuY3Rpb24gVVJMYFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBMYW1iZGEncyBleGVjdXRpb24gcm9sZSAoYXV0by1nZW5lcmF0ZWQgYnkgQ0RLKVxuICAgKi9cbiAgcHVibGljIGdldCBleGVjdXRpb25Sb2xlKCk6IElSb2xlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5yb2xlO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRQb2xpY2llc1RvUm9sZShzdGF0ZW1lbnRzOiBQb2xpY3lTdGF0ZW1lbnRbXSkge1xuICAgIGZvciAoY29uc3Qgc3RhdGVtZW50IG9mIHN0YXRlbWVudHMpIHtcbiAgICAgIHRoaXMuYWRkVG9Sb2xlUG9saWN5KHN0YXRlbWVudCk7XG4gICAgfVxuICB9XG59XG4iXX0=
137
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGFtYmRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGliL3Jlc291cmNlcy9hd3MvY29tcHV0ZS9sYW1iZGEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkNBQStEO0FBQy9ELHVEQU9nQztBQUNoQyxpREFBMEU7QUFDMUUsaURBQTREO0FBQzVELHVEQUF3RDtBQUN4RCx1RUFBZ0Y7QUFDaEYsbURBQStEO0FBQy9ELHVFQUF3RDtBQUV4RCwrQkFBa0M7QUFHbEMsMkNBQXdDO0FBc0N4QyxNQUFhLGlCQUFrQixTQUFRLDhCQUFpQjtJQUN0RCxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQTZCO1FBQ3JFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFO1lBQ2YsR0FBRyxLQUFLO1lBQ1IsSUFBSSxFQUFFLElBQUEsU0FBSSxHQUFFO1lBQ1osT0FBTyxFQUFFLHNCQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQztZQUM5QixXQUFXLEVBQUUsS0FBSyxDQUFDLGlCQUFpQixJQUFJLEdBQUcsRUFBRSxtQkFBbUI7WUFDaEUsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPO1lBQ3RCLG9CQUFvQixFQUFFLEtBQUssQ0FBQyxvQkFBb0I7Z0JBQzlDLENBQUMsQ0FBQyxrQkFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsb0JBQW9CLENBQUM7Z0JBQzVDLENBQUMsQ0FBQyxTQUFTO1NBQ2QsQ0FBQyxDQUFDO1FBRUgsMERBQTBEO1FBQzFELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBVyxhQUFhO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQztJQUNuQixDQUFDO0lBRU8saUJBQWlCLENBQUMsVUFBNkI7UUFDckQsS0FBSyxNQUFNLFNBQVMsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUNuQyxJQUFJ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RUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sZ0JBQWdCO3FCQUMxRTtpQkFDRjthQUNGLENBQUMsQ0FDSCxDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7Q0FDRjtBQXZIRCx3Q0F1SEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDZm5PdXRwdXQsIER1cmF0aW9uLCBTdGFjaywgU2l6ZSB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHtcbiAgU2luZ2xldG9uRnVuY3Rpb24gYXMgc2luZ2xldG9uRnVuY3Rpb24sXG4gIEZ1bmN0aW9uLFxuICB0eXBlIENvZGUsXG4gIHR5cGUgUnVudGltZSxcbiAgRnVuY3Rpb25VcmxBdXRoVHlwZSxcbiAgdHlwZSBGdW5jdGlvblVybENvcnNPcHRpb25zXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbGFtYmRhXCI7XG5pbXBvcnQgeyBQb2xpY3lTdGF0ZW1lbnQsIHR5cGUgSVJvbGUsIEVmZmVjdCB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtaWFtXCI7XG5pbXBvcnQgeyB0eXBlIElWcGMsIFN1Ym5ldFR5cGUgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVjMlwiO1xuaW1wb3J0IHsgUnVsZSwgU2NoZWR1bGUgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWV2ZW50c1wiO1xuaW1wb3J0IHsgTGFtYmRhRnVuY3Rpb24gYXMgTGFtYmRhVGFyZ2V0IH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1ldmVudHMtdGFyZ2V0c1wiO1xuaW1wb3J0IHsgTG9nR3JvdXAsIFJldGVudGlvbkRheXMgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxvZ3NcIjtcbmltcG9ydCB7IFNlY3JldCB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3Mtc2VjcmV0c21hbmFnZXJcIjtcbmltcG9ydCB7IHR5cGUgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IHY0IGFzIHV1aWQgfSBmcm9tIFwidXVpZFwiO1xuaW1wb3J0IHsgdHlwZSBLZXlWYWx1ZSB9IGZyb20gXCIuLi8uLi8uLi90eXBlc1wiO1xuaW1wb3J0IHsgdHlwZSBTZWNyZXRJbXBvcnQgfSBmcm9tIFwiLi4vc2VjcmV0c1wiO1xuaW1wb3J0IHsgVnBjIH0gZnJvbSBcIi4uL25ldHdvcmtpbmcvdnBjXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgbGFtYmRhRnVuY3Rpb25Qcm9wcyB7XG4gIGNvZGU6IENvZGU7XG4gIGhhbmRsZXI6IHN0cmluZztcbiAgbGFtYmRhRGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIHJvbGVEZXNjcmlwdGlvbj86IHN0cmluZztcbiAgcnVudGltZTogUnVudGltZTtcbiAgdnBjPzogSVZwYztcbiAgdGltZW91dD86IG51bWJlcjtcbiAgbWVtb3J5U2l6ZT86IG51bWJlcjtcbiAgaW5saW5lUG9saWN5OiBQb2xpY3lTdGF0ZW1lbnRbXTtcblxuICAvLyBMYW1iZGEgVVJMIHByb3BlcnRpZXNcbiAgZW5hYmxlRnVuY3Rpb25Vcmw/OiBib29sZWFuO1xuICBmdW5jdGlvblVybEF1dGhUeXBlPzogRnVuY3Rpb25VcmxBdXRoVHlwZTtcbiAgZnVuY3Rpb25VcmxDb3JzPzogRnVuY3Rpb25VcmxDb3JzT3B0aW9ucztcblxuICAvLyBFbnZpcm9ubWVudCB2YXJpYWJsZXNcbiAgZW52aXJvbm1lbnQ/OiBLZXlWYWx1ZTtcblxuICAvLyBUYWdzXG4gIHRhZ3M/OiBLZXlWYWx1ZTtcblxuICAvLyBTY2hlZHVsZSAoY3JvbiBvciByYXRlKVxuICBzY2hlZHVsZUV4cHJlc3Npb24/OiBzdHJpbmc7IC8vIGUuZy4gJ2Nyb24oMCAxMiAqICogPyAqKScgb3IgJ3JhdGUoNSBtaW51dGVzKSdcblxuICAvLyBDb250YWluZXIgc2VjcmV0cyBpbXBvcnQgKGtleTogZW52IHZhciwgdmFsdWU6IFNlY3JldEltcG9ydClcbiAgY29udGFpbmVyU2VjcmV0c0ltcG9ydD86IHtcbiAgICBba2V5OiBzdHJpbmddOiBTZWNyZXRJbXBvcnQ7XG4gIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2luZ2xldG9uRnVuY3Rpb25Qcm9wcyBleHRlbmRzIGxhbWJkYUZ1bmN0aW9uUHJvcHMge1xuICB1dWlkPzogc3RyaW5nO1xuICBlcGhlbWVyYWxTdG9yYWdlU2l6ZT86IG51bWJlcjtcbn1cblxuZXhwb3J0IGNsYXNzIFNpbmdsZXRvbkZ1bmN0aW9uIGV4dGVuZHMgc2luZ2xldG9uRnVuY3Rpb24ge1xuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogU2luZ2xldG9uRnVuY3Rpb25Qcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwge1xuICAgICAgLi4ucHJvcHMsXG4gICAgICB1dWlkOiB1dWlkKCksXG4gICAgICB0aW1lb3V0OiBEdXJhdGlvbi5zZWNvbmRzKDMwMCksXG4gICAgICBkZXNjcmlwdGlvbjogcHJvcHMubGFtYmRhRGVzY3JpcHRpb24gfHwgYCR7aWR9IHNpbmdsZXRvbiBsYW1iZGFgLFxuICAgICAgcnVudGltZTogcHJvcHMucnVudGltZSxcbiAgICAgIGVwaGVtZXJhbFN0b3JhZ2VTaXplOiBwcm9wcy5lcGhlbWVyYWxTdG9yYWdlU2l6ZVxuICAgICAgICA/IFNpemUubWViaWJ5dGVzKHByb3BzLmVwaGVtZXJhbFN0b3JhZ2VTaXplKVxuICAgICAgICA6IHVuZGVmaW5lZFxuICAgIH0pO1xuXG4gICAgLy8gQWRkIGlubGluZSBwb2xpY2llcyB0byB0aGUgTGFtYmRhJ3MgYXV0by1nZW5lcmF0ZWQgcm9sZVxuICAgIHRoaXMuYWRkUG9saWNpZXNUb1JvbGUocHJvcHMuaW5saW5lUG9saWN5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgTGFtYmRhJ3MgZXhlY3V0aW9uIHJvbGUgKGF1dG8tZ2VuZXJhdGVkIGJ5IENESylcbiAgICovXG4gIHB1YmxpYyBnZXQgZXhlY3V0aW9uUm9sZSgpOiBJUm9sZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucm9sZTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkUG9saWNpZXNUb1JvbGUoc3RhdGVtZW50czogUG9saWN5U3RhdGVtZW50W10pIHtcbiAgICBmb3IgKGNvbnN0IHN0YXRlbWVudCBvZiBzdGF0ZW1lbnRzKSB7XG4gICAgICB0aGlzLmFkZFRvUm9sZVBvbGljeShzdGF0ZW1lbnQpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTGFtYmRhRnVuY3Rpb24gZXh0ZW5kcyBGdW5jdGlvbiB7XG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBsYW1iZGFGdW5jdGlvblByb3BzKSB7XG4gICAgLy8gRXhwbGljaXRseSBzZXQgc3VibmV0IHNlbGVjdGlvbiB0byBtYXRjaCBWUEMgZW5kcG9pbnQgcGxhY2VtZW50XG4gICAgLy8gLSBXaXRoIE5BVDogUFJJVkFURV9XSVRIX0VHUkVTUyAoY2FuIGFjY2VzcyBpbnRlcm5ldCB2aWEgTkFUKVxuICAgIC8vIC0gV2l0aG91dCBOQVQ6IFBSSVZBVEVfSVNPTEFURUQgKGNhbiBhY2Nlc3MgVlBDIGVuZHBvaW50cyBvbmx5LCBubyBpbnRlcm5ldClcbiAgICBsZXQgdnBjU3VibmV0cztcbiAgICBpZiAocHJvcHMudnBjKSB7XG4gICAgICBjb25zdCBoYXNOYXRHYXRld2F5cyA9XG4gICAgICAgIHByb3BzLnZwYyBpbnN0YW5jZW9mIFZwYyA/IHByb3BzLnZwYy5oYXNOYXRHYXRld2F5cyA6IHRydWU7XG4gICAgICB2cGNTdWJuZXRzID0ge1xuICAgICAgICBzdWJuZXRUeXBlOiBoYXNOYXRHYXRld2F5c1xuICAgICAgICAgID8gU3VibmV0VHlwZS5QUklWQVRFX1dJVEhfRUdSRVNTXG4gICAgICAgICAgOiBTdWJuZXRUeXBlLlBSSVZBVEVfSVNPTEFURURcbiAgICAgIH07XG4gICAgfVxuXG4gICAgc3VwZXIoc2NvcGUsIGlkLCB7XG4gICAgICAuLi5wcm9wcyxcbiAgICAgIHZwY1N1Ym5ldHMsXG4gICAgICB0aW1lb3V0OiBwcm9wcy50aW1lb3V0XG4gICAgICAgID8gRHVyYXRpb24uc2Vjb25kcyhwcm9wcy50aW1lb3V0KVxuICAgICAgICA6IER1cmF0aW9uLnNlY29uZHMoMzAwKSxcbiAgICAgIG1lbW9yeVNpemU6IHByb3BzLm1lbW9yeVNpemUgfHwgMTI4LFxuICAgICAgZGVzY3JpcHRpb246IHByb3BzLmxhbWJkYURlc2NyaXB0aW9uIHx8IGAke2lkfSBMYW1iZGFgLFxuICAgICAgZW52aXJvbm1lbnQ6IHByb3BzLmVudmlyb25tZW50XG4gICAgfSk7XG5cbiAgICAvLyBBZGQgaW5saW5lIHBvbGljaWVzIHRvIHRoZSBMYW1iZGEncyBhdXRvLWdlbmVyYXRlZCByb2xlXG4gICAgdGhpcy5hZGRQb2xpY2llc1RvUm9sZShwcm9wcy5pbmxpbmVQb2xpY3kpO1xuICAgIHRoaXMuYWRkQ29udGFpbmVyU2VjcmV0c0ltcG9ydFRvUm9sZShpZCwgcHJvcHMuY29udGFpbmVyU2VjcmV0c0ltcG9ydCk7XG5cbiAgICBpZiAocHJvcHMuZW5hYmxlRnVuY3Rpb25VcmwpIHtcbiAgICAgIGNvbnN0IGZ1bmN0aW9uVXJsID0gdGhpcy5hZGRGdW5jdGlvblVybCh7XG4gICAgICAgIGF1dGhUeXBlOiBwcm9wcy5mdW5jdGlvblVybEF1dGhUeXBlIHx8IEZ1bmN0aW9uVXJsQXV0aFR5cGUuQVdTX0lBTSxcbiAgICAgICAgY29yczogcHJvcHMuZnVuY3Rpb25VcmxDb3JzXG4gICAgICB9KTtcblxuICAgICAgbmV3IENmbk91dHB1dCh0aGlzLCBgJHtpZH1GdW5jdGlvblVybGAsIHtcbiAgICAgICAga2V5OiBgJHtpZH1GdW5jdGlvblVybGAsXG4gICAgICAgIHZhbHVlOiBmdW5jdGlvblVybC51cmwsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBgJHtpZH0gRnVuY3Rpb24gVVJMYFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQWRkIHNjaGVkdWxlIGlmIHByb3ZpZGVkXG4gICAgaWYgKHByb3BzLnNjaGVkdWxlRXhwcmVzc2lvbikge1xuICAgICAgY29uc3QgcnVsZSA9IG5ldyBSdWxlKHRoaXMsIGAke2lkfVNjaGVkdWxlUnVsZWAsIHtcbiAgICAgICAgc2NoZWR1bGU6IFNjaGVkdWxlLmV4cHJlc3Npb24ocHJvcHMuc2NoZWR1bGVFeHByZXNzaW9uKVxuICAgICAgfSk7XG4gICAgICBydWxlLmFkZFRhcmdldChuZXcgTGFtYmRhVGFyZ2V0KHRoaXMpKTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgbG9nIGdyb3VwIHdpdGggb25lIHdlZWsgcmV0ZW50aW9uXG4gICAgbmV3IExvZ0dyb3VwKHRoaXMsIGAke2lkfUxvZ0dyb3VwYCwge1xuICAgICAgbG9nR3JvdXBOYW1lOiBgL2F3cy9sYW1iZGEvJHt0aGlzLmZ1bmN0aW9uTmFtZX1gLFxuICAgICAgcmV0ZW50aW9uOiBSZXRlbnRpb25EYXlzLk9ORV9XRUVLXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIExhbWJkYSdzIGV4ZWN1dGlvbiByb2xlIChhdXRvLWdlbmVyYXRlZCBieSBDREspXG4gICAqL1xuICBwdWJsaWMgZ2V0IGV4ZWN1dGlvblJvbGUoKTogSVJvbGUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnJvbGU7XG4gIH1cblxuICBwcml2YXRlIGFkZFBvbGljaWVzVG9Sb2xlKHN0YXRlbWVudHM6IFBvbGljeVN0YXRlbWVudFtdKSB7XG4gICAgZm9yIChjb25zdCBzdGF0ZW1lbnQgb2Ygc3RhdGVtZW50cykge1xuICAgICAgdGhpcy5hZGRUb1JvbGVQb2xpY3koc3RhdGVtZW50KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFkZENvbnRhaW5lclNlY3JldHNJbXBvcnRUb1JvbGUoXG4gICAgaWQ6IHN0cmluZyxcbiAgICBjb250YWluZXJTZWNyZXRzSW1wb3J0Pzoge1xuICAgICAgW2tleTogc3RyaW5nXTogU2VjcmV0SW1wb3J0O1xuICAgIH1cbiAgKSB7XG4gICAgaWYgKCFjb250YWluZXJTZWNyZXRzSW1wb3J0KSByZXR1cm47XG5cbiAgICBsZXQgYWRkZWRTZWNyZXRzID0gZmFsc2U7XG5cbiAgICBmb3IgKGNvbnN0IFtrZXksIHNlY3JldEltcG9ydF0gb2YgT2JqZWN0LmVudHJpZXMoY29udGFpbmVyU2VjcmV0c0ltcG9ydCkpIHtcbiAgICAgIC8vIEltcG9ydCB0aGUgc2VjcmV0IGZyb20gU2VjcmV0cyBNYW5hZ2VyXG4gICAgICBjb25zdCBzZWNyZXQgPSBTZWNyZXQuZnJvbVNlY3JldE5hbWVWMihcbiAgICAgICAgdGhpcyxcbiAgICAgICAgYCR7aWR9SW1wb3J0ZWRTZWNyZXQke2tleX1gLFxuICAgICAgICBzZWNyZXRJbXBvcnQubmFtZVxuICAgICAgKTtcblxuICAgICAgLy8gRm9yIExhbWJkYSwgaW5qZWN0IHRoZSBzZWNyZXQgQVJOIGFzIGFuIGVudiB2YXJcbiAgICAgIC8vIFRoZSBMYW1iZGEgZnVuY3Rpb24gY29kZSB3aWxsIHJldHJpZXZlIHRoZSBhY3R1YWwgdmFsdWUgYXQgcnVudGltZVxuICAgICAgdGhpcy5hZGRFbnZpcm9ubWVudChrZXksIHNlY3JldC5zZWNyZXRBcm4pO1xuXG4gICAgICAvLyBHcmFudCByZWFkIGFjY2VzcyB0byB0aGUgbGFtYmRhIGl0c2VsZlxuICAgICAgLy8gKHRoaXMgc2hvdWxkIGF1dG8gYXR0YWNoIHRvIHRoZSBnZW5lcmF0ZWQgcm9sZSlcbiAgICAgIHNlY3JldC5ncmFudFJlYWQodGhpcyk7XG5cbiAgICAgIGFkZGVkU2VjcmV0cyA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGFkZGVkU2VjcmV0cykge1xuICAgICAgLy8gQWRkIEtNUyBkZWNyeXB0IHBlcm1pc3Npb25zIGZvciBzZWNyZXRzXG4gICAgICAvLyBXaGVuIGltcG9ydGluZyBzZWNyZXRzIHdpdGggZnJvbVNlY3JldE5hbWVWMiwgd2UgZG9uJ3QgaGF2ZSBhY2Nlc3MgdG8gdGhlIEtNUyBrZXksXG4gICAgICAvLyBzbyB3ZSBuZWVkIHRvIGdyYW50IGRlY3J5cHQgcGVybWlzc2lvbiBvbiBhbGwga2V5cyB1c2VkIGJ5IFNlY3JldHMgTWFuYWdlclxuICAgICAgdGhpcy5hZGRUb1JvbGVQb2xpY3koXG4gICAgICAgIG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICAgIGVmZmVjdDogRWZmZWN0LkFMTE9XLFxuICAgICAgICAgIGFjdGlvbnM6IFtcImttczpEZWNyeXB0XCIsIFwia21zOkRlc2NyaWJlS2V5XCJdLFxuICAgICAgICAgIHJlc291cmNlczogW1wiKlwiXSxcbiAgICAgICAgICBjb25kaXRpb25zOiB7XG4gICAgICAgICAgICBTdHJpbmdFcXVhbHM6IHtcbiAgICAgICAgICAgICAgXCJrbXM6VmlhU2VydmljZVwiOiBgc2VjcmV0c21hbmFnZXIuJHtTdGFjay5vZih0aGlzKS5yZWdpb259LmFtYXpvbmF3cy5jb21gXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==