@aws-cdk/aws-glue-alpha 2.266.0-alpha.0 → 2.267.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 (41) hide show
  1. package/.jsii +487 -349
  2. package/.jsii.tabl.json.gz +0 -0
  3. package/.warnings.jsii.js +0 -58
  4. package/README.md +47 -29
  5. package/awslint.json +4 -0
  6. package/lib/catalog.js +3 -3
  7. package/lib/code.js +3 -3
  8. package/lib/connection.d.ts +41 -1
  9. package/lib/connection.js +48 -9
  10. package/lib/data-format.js +5 -5
  11. package/lib/data-quality-ruleset.js +3 -3
  12. package/lib/database.js +1 -1
  13. package/lib/external-table.js +1 -1
  14. package/lib/index.d.ts +0 -1
  15. package/lib/index.js +1 -2
  16. package/lib/jobs/job.js +2 -2
  17. package/lib/jobs/pyspark-etl-job.js +1 -1
  18. package/lib/jobs/pyspark-flex-etl-job.js +1 -1
  19. package/lib/jobs/pyspark-streaming-job.js +1 -1
  20. package/lib/jobs/python-shell-job.js +1 -1
  21. package/lib/jobs/ray-job.js +1 -1
  22. package/lib/jobs/scala-spark-etl-job.js +1 -1
  23. package/lib/jobs/scala-spark-flex-etl-job.js +1 -1
  24. package/lib/jobs/scala-spark-streaming-job.js +1 -1
  25. package/lib/jobs/spark-job.js +1 -1
  26. package/lib/partition-projection.d.ts +8 -8
  27. package/lib/partition-projection.js +49 -2
  28. package/lib/s3-table.d.ts +83 -40
  29. package/lib/s3-table.js +133 -85
  30. package/lib/schema.d.ts +26 -6
  31. package/lib/schema.js +74 -77
  32. package/lib/security-configuration.js +4 -4
  33. package/lib/storage-parameter.d.ts +14 -3
  34. package/lib/storage-parameter.js +16 -6
  35. package/lib/table-base.d.ts +1 -1
  36. package/lib/table-base.js +2 -2
  37. package/lib/triggers/trigger-options.js +1 -1
  38. package/lib/triggers/workflow.js +2 -2
  39. package/package.json +7 -7
  40. package/lib/table-deprecated.d.ts +0 -13
  41. package/lib/table-deprecated.js +0 -70
Binary file
package/.warnings.jsii.js CHANGED
@@ -46,35 +46,6 @@ const VALIDATORS = { _aws_cdk_aws_glue_alpha_CatalogEncryptionOptions: function
46
46
  finally {
47
47
  visitedObjects.delete(p);
48
48
  }
49
- }, _aws_cdk_aws_glue_alpha_S3TableProps: function _aws_cdk_aws_glue_alpha_S3TableProps(p) {
50
- if (p == null)
51
- return;
52
- visitedObjects.add(p);
53
- try {
54
- if (p.columns != null)
55
- for (const o of p.columns)
56
- if (!visitedObjects.has(o))
57
- module.exports._aws_cdk_aws_glue_alpha_Column(o);
58
- if (p.partitionIndexes != null)
59
- for (const o of p.partitionIndexes)
60
- if (!visitedObjects.has(o))
61
- module.exports._aws_cdk_aws_glue_alpha_PartitionIndex(o);
62
- if (p.partitionKeys != null)
63
- for (const o of p.partitionKeys)
64
- if (!visitedObjects.has(o))
65
- module.exports._aws_cdk_aws_glue_alpha_Column(o);
66
- if (p.partitionProjection != null)
67
- for (const o of Object.values(p.partitionProjection))
68
- if (!visitedObjects.has(o))
69
- module.exports._aws_cdk_aws_glue_alpha_PartitionProjectionConfiguration(o);
70
- if (p.storageParameters != null)
71
- for (const o of p.storageParameters)
72
- if (!visitedObjects.has(o))
73
- module.exports._aws_cdk_aws_glue_alpha_StorageParameter(o);
74
- }
75
- finally {
76
- visitedObjects.delete(p);
77
- }
78
49
  }, _aws_cdk_aws_glue_alpha_WorkerType: function _aws_cdk_aws_glue_alpha_WorkerType(p) {
79
50
  if (p == null)
80
51
  return;
@@ -374,35 +345,6 @@ const VALIDATORS = { _aws_cdk_aws_glue_alpha_CatalogEncryptionOptions: function
374
345
  finally {
375
346
  visitedObjects.delete(p);
376
347
  }
377
- }, _aws_cdk_aws_glue_alpha_TableProps: function _aws_cdk_aws_glue_alpha_TableProps(p) {
378
- if (p == null)
379
- return;
380
- visitedObjects.add(p);
381
- try {
382
- if (p.columns != null)
383
- for (const o of p.columns)
384
- if (!visitedObjects.has(o))
385
- module.exports._aws_cdk_aws_glue_alpha_Column(o);
386
- if (p.partitionIndexes != null)
387
- for (const o of p.partitionIndexes)
388
- if (!visitedObjects.has(o))
389
- module.exports._aws_cdk_aws_glue_alpha_PartitionIndex(o);
390
- if (p.partitionKeys != null)
391
- for (const o of p.partitionKeys)
392
- if (!visitedObjects.has(o))
393
- module.exports._aws_cdk_aws_glue_alpha_Column(o);
394
- if (p.partitionProjection != null)
395
- for (const o of Object.values(p.partitionProjection))
396
- if (!visitedObjects.has(o))
397
- module.exports._aws_cdk_aws_glue_alpha_PartitionProjectionConfiguration(o);
398
- if (p.storageParameters != null)
399
- for (const o of p.storageParameters)
400
- if (!visitedObjects.has(o))
401
- module.exports._aws_cdk_aws_glue_alpha_StorageParameter(o);
402
- }
403
- finally {
404
- visitedObjects.delete(p);
405
- }
406
348
  }, _aws_cdk_aws_glue_alpha_TriggerOptions: function _aws_cdk_aws_glue_alpha_TriggerOptions(p) {
407
349
  if (p == null)
408
350
  return;
package/README.md CHANGED
@@ -445,18 +445,21 @@ A `Connection` allows Glue jobs, crawlers and development endpoints to access
445
445
  certain types of data stores.
446
446
 
447
447
  * **Secrets Management**
448
- You must specify JDBC connection credentials in Secrets Manager and
449
- provide the Secrets Manager Key name as a property to the job connection.
448
+ Manage JDBC connection credentials in Secrets Manager and pass the secret
449
+ to the connection via the `secret` property (see the example below), rather
450
+ than embedding credentials in `properties`.
450
451
 
451
452
  * **Networking - the CDK determines the best fit subnet for Glue connection
452
453
  configuration**
453
- The prior version of the glue-alpha-module requires the developer to
454
- specify the subnet of the Connection when it’s defined. Now, you can still
455
- specify the specific subnet you want to use, but are no longer required
456
- to. You are only required to provide a VPC and either a public or private
457
- subnet selection. Without a specific subnet provided, the L2 leverages the
458
- existing [EC2 Subnet Selection](https://docs.aws.amazon.com/cdk/api/v2/python/aws_cdk.aws_ec2/SubnetSelection.html)
459
- library to make the best choice selection for the subnet.
454
+ You can specify the exact subnet of the Connection when it's defined, but
455
+ you are not required to. Instead, you can provide a `vpc` and, optionally, a
456
+ `vpcSubnets` selection, and the L2 leverages the existing
457
+ [EC2 Subnet Selection](https://docs.aws.amazon.com/cdk/api/v2/python/aws_cdk.aws_ec2/SubnetSelection.html)
458
+ library to make the best choice selection for the subnet. A Glue connection
459
+ targets a single subnet, so the first subnet of the selection is used.
460
+ `subnet` and `vpc` are mutually exclusive.
461
+
462
+ Pin the connection to a specific subnet:
460
463
 
461
464
  ```ts
462
465
  declare const securityGroup: ec2.SecurityGroup;
@@ -470,7 +473,21 @@ new glue.Connection(this, 'MyConnection', {
470
473
  });
471
474
  ```
472
475
 
473
- For RDS `Connection` by JDBC, it is recommended to manage credentials using AWS Secrets Manager. To use Secret, specify `SECRET_ID` in `properties` like the following code. Note that in this case, the subnet must have a route to the AWS Secrets Manager VPC endpoint or to the AWS Secrets Manager endpoint through a NAT gateway.
476
+ Or let the CDK select a subnet from a VPC:
477
+
478
+ ```ts
479
+ declare const securityGroup: ec2.SecurityGroup;
480
+ declare const vpc: ec2.Vpc;
481
+ new glue.Connection(this, 'MyConnection', {
482
+ type: glue.ConnectionType.NETWORK,
483
+ securityGroups: [securityGroup],
484
+ vpc,
485
+ // Optional - defaults to private subnets
486
+ vpcSubnets: { subnetType: ec2.SubnetType.PRIVATE_WITH_EGRESS },
487
+ });
488
+ ```
489
+
490
+ For RDS `Connection` by JDBC, it is recommended to manage credentials using AWS Secrets Manager. Pass the secret via the `secret` property: Glue reads the credentials at runtime through the connection's `SECRET_ID`, so the secret value never enters the template. Note that in this case, the subnet must have a route to the AWS Secrets Manager VPC endpoint or to the AWS Secrets Manager endpoint through a NAT gateway.
474
491
 
475
492
  ```ts
476
493
  declare const securityGroup: ec2.SecurityGroup;
@@ -480,18 +497,18 @@ new glue.Connection(this, "RdsConnection", {
480
497
  type: glue.ConnectionType.JDBC,
481
498
  securityGroups: [securityGroup],
482
499
  subnet,
500
+ secret: db.secret,
483
501
  properties: {
484
502
  JDBC_CONNECTION_URL: `jdbc:mysql://${db.clusterEndpoint.socketAddress}/databasename`,
485
503
  JDBC_ENFORCE_SSL: "false",
486
- SECRET_ID: db.secret!.secretName,
487
504
  },
488
505
  });
489
506
  ```
490
507
 
491
- Connection `properties` are emitted verbatim into the CloudFormation template, so
492
- any credential placed there in plaintext is stored in plaintext in the template,
493
- `cdk.out`, and source control. Reference a Secrets Manager secret through
494
- `SECRET_ID` (as above) instead. If a property key looks like a credential (for
508
+ Prefer the `secret` property over placing credentials in `properties`. Connection
509
+ `properties` are emitted verbatim into the CloudFormation template, so any
510
+ credential placed there in plaintext is stored in plaintext in the template,
511
+ `cdk.out`, and source control. If a property key looks like a credential (for
495
512
  example `PASSWORD`, `SECRET`, or `TOKEN`) and holds a plaintext literal, the
496
513
  construct emits a synthesis-time warning.
497
514
 
@@ -724,13 +741,13 @@ new glue.S3Table(this, 'MyTable', {
724
741
  });
725
742
  ```
726
743
 
727
- By default, a S3 bucket will be created to store the table's data but you can manually pass the `bucket` and `s3Prefix`:
744
+ By default, a S3 bucket will be created to store the table's data but you can bring your own with `S3TableStorage.fromBucket` and set an `s3Prefix`:
728
745
 
729
746
  ```ts
730
747
  declare const myBucket: s3.Bucket;
731
748
  declare const myDatabase: glue.Database;
732
749
  new glue.S3Table(this, 'MyTable', {
733
- bucket: myBucket,
750
+ storage: glue.S3TableStorage.fromBucket(myBucket),
734
751
  s3Prefix: 'my-table/',
735
752
  // ...
736
753
  database: myDatabase,
@@ -1095,16 +1112,17 @@ full rule syntax.
1095
1112
 
1096
1113
  ## [Encryption](https://docs.aws.amazon.com/athena/latest/ug/encryption.html)
1097
1114
 
1098
- When the table creates its own S3 bucket (i.e. you do not pass an explicit `bucket`), that bucket enforces SSL: a bucket policy denies any request made over plain HTTP. If you provide your own bucket, enabling `enforceSSL` on it is your responsibility.
1115
+ When the table creates its own S3 bucket (`S3TableStorage.managedBucket`, the default), that bucket enforces SSL: a bucket policy denies any request made over plain HTTP. If you bring your own bucket with `S3TableStorage.fromBucket`, enabling `enforceSSL` on it is your responsibility.
1099
1116
 
1100
- You can enable encryption on a Table's data:
1117
+ Server-side encryption applies only to a bucket the table manages. Choose it with
1118
+ `storage: glue.S3TableStorage.managedBucket(...)`:
1101
1119
 
1102
1120
  * [S3Managed](https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingServerSideEncryption.html) - (default) Server side encryption (`SSE-S3`) with an Amazon S3-managed key.
1103
1121
 
1104
1122
  ```ts
1105
1123
  declare const myDatabase: glue.Database;
1106
1124
  new glue.S3Table(this, 'MyTable', {
1107
- encryption: glue.TableEncryption.S3_MANAGED,
1125
+ storage: glue.S3TableStorage.managedBucket(glue.S3TableEncryption.s3Managed()),
1108
1126
  // ...
1109
1127
  database: myDatabase,
1110
1128
  columns: [{
@@ -1121,7 +1139,7 @@ new glue.S3Table(this, 'MyTable', {
1121
1139
  declare const myDatabase: glue.Database;
1122
1140
  // KMS key is created automatically
1123
1141
  new glue.S3Table(this, 'MyTable', {
1124
- encryption: glue.TableEncryption.KMS,
1142
+ storage: glue.S3TableStorage.managedBucket(glue.S3TableEncryption.kms()),
1125
1143
  // ...
1126
1144
  database: myDatabase,
1127
1145
  columns: [{
@@ -1133,8 +1151,7 @@ new glue.S3Table(this, 'MyTable', {
1133
1151
 
1134
1152
  // with an explicit KMS key
1135
1153
  new glue.S3Table(this, 'MyTable', {
1136
- encryption: glue.TableEncryption.KMS,
1137
- encryptionKey: new kms.Key(this, 'MyKey'),
1154
+ storage: glue.S3TableStorage.managedBucket(glue.S3TableEncryption.kms(new kms.Key(this, 'MyKey'))),
1138
1155
  // ...
1139
1156
  database: myDatabase,
1140
1157
  columns: [{
@@ -1150,7 +1167,7 @@ new glue.S3Table(this, 'MyTable', {
1150
1167
  ```ts
1151
1168
  declare const myDatabase: glue.Database;
1152
1169
  new glue.S3Table(this, 'MyTable', {
1153
- encryption: glue.TableEncryption.KMS_MANAGED,
1170
+ storage: glue.S3TableStorage.managedBucket(glue.S3TableEncryption.kmsManaged()),
1154
1171
  // ...
1155
1172
  database: myDatabase,
1156
1173
  columns: [{
@@ -1161,13 +1178,13 @@ new glue.S3Table(this, 'MyTable', {
1161
1178
  });
1162
1179
  ```
1163
1180
 
1164
- * [ClientSideKms](https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingClientSideEncryption.html#client-side-encryption-kms-managed-master-key-intro) - Client-side encryption (`CSE-KMS`) with an AWS KMS Key managed by the account owner.
1181
+ Client-side encryption ([CSE-KMS](https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingClientSideEncryption.html#client-side-encryption-kms-managed-master-key-intro)) is independent of the bucket's server-side encryption and works with either a managed or an existing bucket. Configure it with `clientSideEncryption`:
1165
1182
 
1166
1183
  ```ts
1167
1184
  declare const myDatabase: glue.Database;
1168
1185
  // KMS key is created automatically
1169
1186
  new glue.S3Table(this, 'MyTable', {
1170
- encryption: glue.TableEncryption.CLIENT_SIDE_KMS,
1187
+ clientSideEncryption: glue.TableClientSideEncryption.kms(),
1171
1188
  // ...
1172
1189
  database: myDatabase,
1173
1190
  columns: [{
@@ -1179,8 +1196,7 @@ new glue.S3Table(this, 'MyTable', {
1179
1196
 
1180
1197
  // with an explicit KMS key
1181
1198
  new glue.S3Table(this, 'MyTable', {
1182
- encryption: glue.TableEncryption.CLIENT_SIDE_KMS,
1183
- encryptionKey: new kms.Key(this, 'MyKey'),
1199
+ clientSideEncryption: glue.TableClientSideEncryption.kms(new kms.Key(this, 'MyKey')),
1184
1200
  // ...
1185
1201
  database: myDatabase,
1186
1202
  columns: [{
@@ -1191,7 +1207,7 @@ new glue.S3Table(this, 'MyTable', {
1191
1207
  });
1192
1208
  ```
1193
1209
 
1194
- *Note: you cannot provide a `Bucket` when creating the `S3Table` if you wish to use server-side encryption (`KMS`, `KMS_MANAGED` or `S3_MANAGED`)*.
1210
+ To store the table's data in an existing bucket, use `glue.S3TableStorage.fromBucket(bucket)`. CDK does not manage that bucket's server-side encryption, so an encryption choice can never be paired with a provided bucket — but client-side encryption still applies.
1195
1211
 
1196
1212
  ### Marking table data as encrypted
1197
1213
 
@@ -1250,6 +1266,8 @@ new glue.S3Table(this, 'MyTable', {
1250
1266
  });
1251
1267
  ```
1252
1268
 
1269
+ For a type the `Schema` factories don't model, use `glue.Schema.custom('...')`, which takes the raw Glue input string.
1270
+
1253
1271
  ## Public FAQ
1254
1272
 
1255
1273
  ### What are we launching today?
package/awslint.json CHANGED
@@ -110,6 +110,10 @@
110
110
  "interface-extends-ref:@aws-cdk/aws-glue-alpha.ITable",
111
111
  "interface-extends-ref:@aws-cdk/aws-glue-alpha.IWorkflow",
112
112
  "prefer-ref-interface:@aws-cdk/aws-glue-alpha.DatabaseProps.catalog",
113
+ "prefer-ref-interface:@aws-cdk/aws-glue-alpha.ConnectionProps.vpc",
114
+ "prefer-ref-interface:aws-cdk-lib.aws_ec2.ClientVpnEndpointOptions.securityGroups",
115
+ "prefer-ref-interface:aws-cdk-lib.aws_ec2.SubnetSelection.subnets",
116
+ "prefer-ref-interface:aws-cdk-lib.aws_ec2.InterfaceVpcEndpointOptions.securityGroups",
113
117
  "no-unused-type:@aws-cdk/aws-glue-alpha.S3EncryptionMode"
114
118
  ]
115
119
  }
package/lib/catalog.js CHANGED
@@ -74,7 +74,7 @@ var CatalogEncryptionMode;
74
74
  * @see https://docs.aws.amazon.com/glue/latest/webapi/API_EncryptionAtRest.html
75
75
  */
76
76
  class DataCatalogEncryptionAtRest {
77
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.DataCatalogEncryptionAtRest", version: "2.266.0-alpha.0" };
77
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.DataCatalogEncryptionAtRest", version: "2.267.0-alpha.0" };
78
78
  /**
79
79
  * Disable encryption at rest for the Data Catalog.
80
80
  */
@@ -130,7 +130,7 @@ exports.DataCatalogEncryptionAtRest = DataCatalogEncryptionAtRest;
130
130
  * construction, so a catalog either carries settings or it does not.
131
131
  */
132
132
  class CatalogBase extends core_1.Resource {
133
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.CatalogBase", version: "2.266.0-alpha.0" };
133
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.CatalogBase", version: "2.267.0-alpha.0" };
134
134
  _encryptionKey;
135
135
  _connectionPasswordKey;
136
136
  get encryptionKey() {
@@ -224,7 +224,7 @@ let Catalog = (() => {
224
224
  Catalog = _classThis = _classDescriptor.value;
225
225
  if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
226
226
  }
227
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.Catalog", version: "2.266.0-alpha.0" };
227
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.Catalog", version: "2.267.0-alpha.0" };
228
228
  /** Uniquely identifies this class. */
229
229
  static PROPERTY_INJECTION_ID = '@aws-cdk.aws-glue-alpha.Catalog';
230
230
  /**
package/lib/code.js CHANGED
@@ -43,7 +43,7 @@ const helpers_internal_1 = require("aws-cdk-lib/core/lib/helpers-internal");
43
43
  * Represents a Glue Job's Code assets (an asset can be a scripts, a jar, a python file or any other file).
44
44
  */
45
45
  class Code {
46
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.Code", version: "2.266.0-alpha.0" };
46
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.Code", version: "2.267.0-alpha.0" };
47
47
  /**
48
48
  * Job code as an S3 object.
49
49
  * @param bucket The S3 bucket
@@ -68,7 +68,7 @@ exports.Code = Code;
68
68
  class S3Code extends Code {
69
69
  bucket;
70
70
  key;
71
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.S3Code", version: "2.266.0-alpha.0" };
71
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.S3Code", version: "2.267.0-alpha.0" };
72
72
  constructor(bucket, key) {
73
73
  super();
74
74
  this.bucket = bucket;
@@ -91,7 +91,7 @@ exports.S3Code = S3Code;
91
91
  class AssetCode extends Code {
92
92
  path;
93
93
  options;
94
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.AssetCode", version: "2.266.0-alpha.0" };
94
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.AssetCode", version: "2.267.0-alpha.0" };
95
95
  asset;
96
96
  /**
97
97
  * @param path The path to the Code file.
@@ -1,4 +1,5 @@
1
1
  import type * as ec2 from 'aws-cdk-lib/aws-ec2';
2
+ import type { ISecretRef } from 'aws-cdk-lib/aws-secretsmanager';
2
3
  import * as cdk from 'aws-cdk-lib/core';
3
4
  import type * as constructs from 'constructs';
4
5
  /**
@@ -219,6 +220,17 @@ export interface ConnectionOptions {
219
220
  readonly properties?: {
220
221
  [key: string]: string;
221
222
  };
223
+ /**
224
+ * A reference to a Secrets Manager secret holding the credentials for this connection.
225
+ *
226
+ * The secret is referenced through the connection's `SECRET_ID` property, so
227
+ * Glue reads the credentials at runtime and the secret value never appears in
228
+ * the synthesized template. Prefer this over placing credentials directly in
229
+ * `properties`. Accepts any `secretsmanager.ISecret`.
230
+ *
231
+ * @default - no secret; any credentials must be supplied via `properties`
232
+ */
233
+ readonly secret?: ISecretRef;
222
234
  /**
223
235
  * A list of criteria that can be used in selecting this connection.
224
236
  * This is useful for filtering the results of https://awscli.amazonaws.com/v2/documentation/api/latest/reference/glue/get-connections.html
@@ -232,9 +244,32 @@ export interface ConnectionOptions {
232
244
  readonly securityGroups?: ec2.ISecurityGroup[];
233
245
  /**
234
246
  * The VPC subnet to connect to resources within a VPC. See more at https://docs.aws.amazon.com/glue/latest/dg/start-connecting.html.
235
- * @default no subnet
247
+ *
248
+ * Mutually exclusive with `vpc`: provide `subnet` to pin the connection to a
249
+ * specific subnet, or provide `vpc` (optionally with `vpcSubnets`) to let the
250
+ * CDK select one for you.
251
+ *
252
+ * @default - no subnet, unless `vpc` is provided
236
253
  */
237
254
  readonly subnet?: ec2.ISubnet;
255
+ /**
256
+ * The VPC to connect to resources within. When provided, the CDK selects a
257
+ * subnet from this VPC using `vpcSubnets`. A Glue connection targets a single
258
+ * subnet, so the first subnet of the selection is used.
259
+ *
260
+ * Mutually exclusive with `subnet`.
261
+ *
262
+ * @default - no VPC, the subnet is taken from `subnet` if provided
263
+ */
264
+ readonly vpc?: ec2.IVpc;
265
+ /**
266
+ * Which subnets of `vpc` to select the connection subnet from. Only used when
267
+ * `vpc` is provided. Since a Glue connection targets a single subnet, the
268
+ * first subnet of the selection is used.
269
+ *
270
+ * @default - private subnets
271
+ */
272
+ readonly vpcSubnets?: ec2.SubnetSelection;
238
273
  }
239
274
  /**
240
275
  * Construction properties for `Connection`
@@ -271,6 +306,11 @@ export declare class Connection extends cdk.Resource implements IConnection {
271
306
  private readonly properties;
272
307
  private readonly resource;
273
308
  constructor(scope: constructs.Construct, id: string, props: ConnectionProps);
309
+ /**
310
+ * Determines the single subnet the connection should target, either from an
311
+ * explicit `subnet` or by selecting one from `vpc`.
312
+ */
313
+ private resolveSubnet;
274
314
  /**
275
315
  * The name of the connection
276
316
  */
package/lib/connection.js CHANGED
@@ -85,7 +85,7 @@ const secret_detection_1 = require("./private/secret-detection");
85
85
  * @see https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-connection-connectioninput.html#cfn-glue-connection-connectioninput-connectiontype
86
86
  */
87
87
  class ConnectionType {
88
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.ConnectionType", version: "2.266.0-alpha.0" };
88
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.ConnectionType", version: "2.267.0-alpha.0" };
89
89
  /**
90
90
  * Designates a connection to a database through Java Database Connectivity (JDBC).
91
91
  */
@@ -290,7 +290,7 @@ let Connection = (() => {
290
290
  Connection = _classThis = _classDescriptor.value;
291
291
  if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
292
292
  }
293
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.Connection", version: "2.266.0-alpha.0" };
293
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.Connection", version: "2.267.0-alpha.0" };
294
294
  /** Uniquely identifies this class. */
295
295
  static PROPERTY_INJECTION_ID = '@aws-cdk.aws-glue-alpha.Connection';
296
296
  /**
@@ -346,20 +346,32 @@ let Connection = (() => {
346
346
  // Enhanced CDK Analytics Telemetry
347
347
  (0, metadata_resource_1.addConstructMetadata)(this, props);
348
348
  this.properties = props.properties || {};
349
- const physicalConnectionRequirements = props.subnet || props.securityGroups ? {
350
- availabilityZone: props.subnet ? props.subnet.availabilityZone : undefined,
351
- subnetId: props.subnet ? props.subnet.subnetId : undefined,
349
+ const subnet = this.resolveSubnet(props);
350
+ const physicalConnectionRequirements = subnet || props.securityGroups ? {
351
+ availabilityZone: subnet ? subnet.availabilityZone : undefined,
352
+ subnetId: subnet ? subnet.subnetId : undefined,
352
353
  securityGroupIdList: props.securityGroups ? props.securityGroups.map(sg => sg.securityGroupId) : undefined,
353
354
  } : undefined;
355
+ const secretId = props.secret?.secretRef.secretId;
354
356
  this.resource = new aws_glue_1.CfnConnection(this, 'Resource', {
355
357
  catalogId: cdk.Stack.of(this).account,
356
358
  connectionInput: {
357
359
  connectionProperties: cdk.Lazy.any({
358
360
  produce: () => {
359
361
  // Inspect the final property set at synthesis time so properties
360
- // added via `addProperty` are covered as well.
361
- (0, secret_detection_1.warnOnPlaintextSecrets)(this, this.properties, '@aws-cdk/aws-glue-alpha:plaintextConnectionSecret', 'Reference a Secrets Manager secret through the connection\'s `SECRET_ID` property instead.');
362
- return Object.keys(this.properties).length > 0 ? this.properties : undefined;
362
+ // added via `addProperty` are covered as well — a `SECRET_ID` added
363
+ // after construction would otherwise be silently overwritten by the
364
+ // one injected from `secret`.
365
+ if (secretId !== undefined && this.properties.SECRET_ID !== undefined) {
366
+ throw new cdk.ValidationError((0, helpers_internal_1.lit) `ConnectionSecretConflict`, 'cannot set both `secret` and a `SECRET_ID` connection property', this);
367
+ }
368
+ // The `SECRET_ID` injected from `secret` is a reference, not a
369
+ // credential, so it is merged in after this scan.
370
+ (0, secret_detection_1.warnOnPlaintextSecrets)(this, this.properties, '@aws-cdk/aws-glue-alpha:plaintextConnectionSecret', 'Pass a Secrets Manager secret via the connection\'s `secret` property instead.');
371
+ const properties = secretId !== undefined
372
+ ? { ...this.properties, SECRET_ID: secretId }
373
+ : this.properties;
374
+ return Object.keys(properties).length > 0 ? properties : undefined;
363
375
  },
364
376
  }),
365
377
  connectionType: props.type.name,
@@ -370,6 +382,33 @@ let Connection = (() => {
370
382
  },
371
383
  });
372
384
  }
385
+ /**
386
+ * Determines the single subnet the connection should target, either from an
387
+ * explicit `subnet` or by selecting one from `vpc`.
388
+ */
389
+ resolveSubnet(props) {
390
+ if (props.subnet && props.vpc) {
391
+ throw new cdk.ValidationError((0, helpers_internal_1.lit) `ConnectionSubnetConflict`, 'cannot specify both `subnet` and `vpc`; provide `subnet` for a specific subnet, or `vpc` (optionally with `vpcSubnets`) to let the CDK select one', this);
392
+ }
393
+ if (props.vpcSubnets && !props.vpc) {
394
+ throw new cdk.ValidationError((0, helpers_internal_1.lit) `ConnectionVpcSubnetsWithoutVpc`, '`vpcSubnets` can only be specified together with `vpc`', this);
395
+ }
396
+ if (props.subnet) {
397
+ return props.subnet;
398
+ }
399
+ if (props.vpc) {
400
+ // A Glue connection targets a single subnet, so use the first subnet of the selection.
401
+ const selected = props.vpc.selectSubnets(props.vpcSubnets);
402
+ // `isPendingLookup` is true for imported VPCs whose subnets are not yet
403
+ // resolved (e.g. `fromLookup`), where an empty selection is expected and
404
+ // will materialize on a later synth. Only fail on a genuinely empty selection.
405
+ if (!selected.isPendingLookup && selected.subnets.length === 0) {
406
+ throw new cdk.ValidationError((0, helpers_internal_1.lit) `ConnectionNoSubnetsSelected`, '`vpcSubnets` selected no subnets from the provided `vpc`; adjust the selection or use `subnet` to target a specific subnet', this);
407
+ }
408
+ return selected.subnets[0];
409
+ }
410
+ return undefined;
411
+ }
373
412
  /**
374
413
  * The name of the connection
375
414
  */
@@ -397,4 +436,4 @@ let Connection = (() => {
397
436
  return Connection = _classThis;
398
437
  })();
399
438
  exports.Connection = Connection;
400
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29ubmVjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImNvbm5lY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQ0EsbURBQXFEO0FBQ3JELHNEQUF3QztBQUN4Qyw0RUFBdUU7QUFDdkUsOEVBQThGO0FBQzlGLDBFQUEwRTtBQUUxRSxpRUFBb0U7QUFFcEU7Ozs7Ozs7R0FPRztBQUNILE1BQWEsY0FBYzs7SUFDekI7O09BRUc7SUFDSSxNQUFNLENBQVUsSUFBSSxHQUFHLElBQUksY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRXpEOztPQUVHO0lBQ0ksTUFBTSxDQUFVLEtBQUssR0FBRyxJQUFJLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUUzRDs7T0FFRztJQUNJLE1BQU0sQ0FBVSxPQUFPLEdBQUcsSUFBSSxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUM7SUFFL0Q7O09BRUc7SUFDSSxNQUFNLENBQVUsd0JBQXdCLEdBQUcsSUFBSSxjQUFjLENBQUMsMEJBQTBCLENBQUMsQ0FBQztJQUVqRzs7T0FFRztJQUNJLE1BQU0sQ0FBVSxzQkFBc0IsR0FBRyxJQUFJLGNBQWMsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO0lBRTdGOztPQUVHO0lBQ0ksTUFBTSxDQUFVLE9BQU8sR0FBRyxJQUFJLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUUvRDs7O09BR0c7SUFDSSxNQUFNLENBQVUsV0FBVyxHQUFHLElBQUksY0FBYyxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBRXZFOzs7T0FHRztJQUNJLE1BQU0sQ0FBVSxNQUFNLEdBQUcsSUFBSSxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUM7SUFFN0Q7O09BRUc7SUFDSSxNQUFNLENBQVUsV0FBVyxHQUFHLElBQUksY0FBYyxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lB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QUMvQixXQUFXLEVBQUUsS0FBSyxDQUFDLFdBQVc7b0JBQzlCLGFBQWEsRUFBRSxLQUFLLENBQUMsYUFBYTtvQkFDbEMsSUFBSSxFQUFFLEtBQUssQ0FBQyxjQUFjO29CQUMxQiw4QkFBOEI7aUJBQy9CO2FBQ0YsQ0FBQyxDQUFDO1NBQ0o7UUFFRDs7V0FFRztRQUVILElBQVcsY0FBYztZQUN2QixPQUFPLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ3pEO1FBRUQ7O1dBRUc7UUFFSCxJQUFXLGFBQWE7WUFDdEIsT0FBTyxVQUFVLENBQUMsa0JBQWtCLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztTQUNqRTtRQUVEOzs7O1dBSUc7UUFFSSxXQUFXLENBQUMsR0FBVyxFQUFFLEtBQWE7WUFDM0MsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUM7U0FDOUI7O1lBL0dVLHVEQUFVOzs7OztBQUFWLGdDQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgKiBhcyBlYzIgZnJvbSAnYXdzLWNkay1saWIvYXdzLWVjMic7XG5pbXBvcnQgeyBDZm5Db25uZWN0aW9uIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWdsdWUnO1xuaW1wb3J0ICogYXMgY2RrIGZyb20gJ2F3cy1jZGstbGliL2NvcmUnO1xuaW1wb3J0IHsgbWVtb2l6ZWRHZXR0ZXIgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlL2xpYi9oZWxwZXJzLWludGVybmFsJztcbmltcG9ydCB7IGFkZENvbnN0cnVjdE1ldGFkYXRhLCBNZXRob2RNZXRhZGF0YSB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUvbGliL21ldGFkYXRhLXJlc291cmNlJztcbmltcG9ydCB7IHByb3BlcnR5SW5qZWN0YWJsZSB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUvbGliL3Byb3AtaW5qZWN0YWJsZSc7XG5pbXBvcnQgdHlwZSAqIGFzIGNvbnN0cnVjdHMgZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyB3YXJuT25QbGFpbnRleHRTZWNyZXRzIH0gZnJvbSAnLi9wcml2YXRlL3NlY3JldC1kZXRlY3Rpb24nO1xuXG4vKipcbiAqIFRoZSB0eXBlIG9mIHRoZSBnbHVlIGNvbm5lY3Rpb25cbiAqXG4gKiBJZiB5b3UgbmVlZCB0byB1c2UgYSBjb25uZWN0aW9uIHR5cGUgdGhhdCBkb2Vzbid0IGV4aXN0IGFzIGEgc3RhdGljIG1lbWJlciwgeW91XG4gKiBjYW4gaW5zdGFudGlhdGUgYSBgQ29ubmVjdGlvblR5cGVgIG9iamVjdCwgZS5nOiBgbmV3IENvbm5lY3Rpb25UeXBlKCdORVdfVFlQRScpYC5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVXNlckd1aWRlL2F3cy1wcm9wZXJ0aWVzLWdsdWUtY29ubmVjdGlvbi1jb25uZWN0aW9uaW5wdXQuaHRtbCNjZm4tZ2x1ZS1jb25uZWN0aW9uLWNvbm5lY3Rpb25pbnB1dC1jb25uZWN0aW9udHlwZVxuICovXG5leHBvcnQgY2xhc3MgQ29ubmVjdGlvblR5cGUge1xuICAvKipcbiAgICogRGVzaWduYXRlcyBhIGNvbm5lY3Rpb24gdG8gYSBkYXRhYmFzZSB0aHJvdWdoIEphdmEgRGF0YWJhc2UgQ29ubmVjdGl2aXR5IChKREJDKS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgSkRCQyA9IG5ldyBDb25uZWN0aW9uVHlwZSgnSkRCQycpO1xuXG4gIC8qKlxuICAgKiBEZXNpZ25hdGVzIGEgY29ubmVjdGlvbiB0byBhbiBBcGFjaGUgS2Fma2Egc3RyZWFtaW5nIHBsYXRmb3JtLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBLQUZLQSA9IG5ldyBDb25uZWN0aW9uVHlwZSgnS0FGS0EnKTtcblxuICAvKipcbiAgICogRGVzaWduYXRlcyBhIGNvbm5lY3Rpb24gdG8gYSBNb25nb0RCIGRvY3VtZW50IGRhdGFiYXNlLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBNT05HT0RCID0gbmV3IENvbm5lY3Rpb25UeXBlKCdNT05HT0RCJyk7XG5cbiAgLyoqXG4gICAqIERlc2lnbmF0ZXMgYSBjb25uZWN0aW9uIHVzZWQgZm9yIHZpZXcgdmFsaWRhdGlvbiBieSBBbWF6b24gUmVkc2hpZnQuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFZJRVdfVkFMSURBVElPTl9SRURTSElGVCA9IG5ldyBDb25uZWN0aW9uVHlwZSgnVklFV19WQUxJREFUSU9OX1JFRFNISUZUJyk7XG5cbiAgLyoqXG4gICAqIERlc2lnbmF0ZXMgYSBjb25uZWN0aW9uIHVzZWQgZm9yIHZpZXcgdmFsaWRhdGlvbiBieSBBbWF6b24gQXRoZW5hLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBWSUVXX1ZBTElEQVRJT05fQVRIRU5BID0gbmV3IENvbm5lY3Rpb25UeXBlKCdWSUVXX1ZBTElEQVRJT05fQVRIRU5BJyk7XG5cbiAgLyoqXG4gICAqIERlc2lnbmF0ZXMgYSBuZXR3b3JrIGNvbm5lY3Rpb24gdG8gYSBkYXRhIHNvdXJjZSB3aXRoaW4gYW4gQW1hem9uIFZpcnR1YWwgUHJpdmF0ZSBDbG91ZCBlbnZpcm9ubWVudCAoQW1hem9uIFZQQykuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IE5FVFdPUksgPSBuZXcgQ29ubmVjdGlvblR5cGUoJ05FVFdPUksnKTtcblxuICAvKipcbiAgICogVXNlcyBjb25maWd1cmF0aW9uIHNldHRpbmdzIGNvbnRhaW5lZCBpbiBhIGNvbm5lY3RvciBwdXJjaGFzZWQgZnJvbSBBV1MgTWFya2V0cGxhY2VcbiAgICogdG8gcmVhZCBmcm9tIGFuZCB3cml0ZSB0byBkYXRhIHN0b3JlcyB0aGF0IGFyZSBub3QgbmF0aXZlbHkgc3VwcG9ydGVkIGJ5IEFXUyBHbHVlLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBNQVJLRVRQTEFDRSA9IG5ldyBDb25uZWN0aW9uVHlwZSgnTUFSS0VUUExBQ0UnKTtcblxuICAvKipcbiAgICogVXNlcyBjb25maWd1cmF0aW9uIHNldHRpbmdzIGNvbnRhaW5lZCBpbiBhIGN1c3RvbSBjb25uZWN0b3IgdG8gcmVhZCBmcm9tIGFuZCB3cml0ZSB0byBkYXRhIHN0b3Jlc1xuICAgKiB0aGF0IGFyZSBub3QgbmF0aXZlbHkgc3VwcG9ydGVkIGJ5IEFXUyBHbHVlLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBDVVNUT00gPSBuZXcgQ29ubmVjdGlvblR5cGUoJ0NVU1RPTScpO1xuXG4gIC8qKlxuICAgKiBEZXNpZ25hdGVzIGEgY29ubmVjdGlvbiB0byBGYWNlYm9vayBBZHMuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEZBQ0VCT09LQURTID0gbmV3IENvbm5lY3Rpb25UeXBlKCdGQUNFQk9PS0FEUycpO1xuXG4gIC8qKlxuICAgKiBEZXNpZ25hdGVzIGEgY29ubmVjdGlvbiB0byBHb29nbGUgQWRzLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBHT09HTEVBRFMgPSBuZXcgQ29ubmVjdGlvblR5cGUoJ0dPT0dMRUFEUycpO1xuXG4gIC8qKlxuICAgKiBEZXNpZ25hdGVzIGEgY29ubmVjdGlvbiB0byBHb29nbGUgU2hlZXRzLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBHT09HTEVTSEVFVFMgPSBuZXcgQ29ubmVjdGlvblR5cGUoJ0dPT0dMRVNIRUVUUycpO1xuXG4gIC8qKlxuICAgKiBEZXNpZ25hdGVzIGEgY29ubmVjdGlvbiB0byBHb29nbGUgQW5hbHl0aWNzIDQuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEdPT0dMRUFOQUxZVElDUzQgPSBuZXcgQ29ubmVjdGlvblR5cGUoJ0dPT0dMRUFOQUxZVElDUzQnKTtcblxuICAvKipcbiAgICogRGVzaWduYXRlcyBhIGNvbm5lY3Rpb24gdG8gSHViU3BvdC5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgSFVCU1BPVCA9IG5ldyBDb25uZWN0aW9uVHlwZSgnSFVCU1BPVCcpO1xuXG4gIC8qKlxuICAgKiBEZXNpZ25hdGVzIGEgY29ubmVjdGlvbiB0byBJbnN0YWdyYW0gQWRzLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBJTlNUQUdSQU1BRFMgPSBuZXcgQ29ubmVjdGlvblR5cGUoJ0lOU1RBR1JBTUFEUycpO1xuXG4gIC8qKlxuICAgKiBEZXNpZ25hdGVzIGEgY29ubmVjdGlvbiB0byBJbnRlcmNvbS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgSU5URVJDT00gPSBuZXcgQ29ubmVjdGlvblR5cGUoJ0lOVEVSQ09NJyk7XG5cbiAgLyoqXG4gICAqIERlc2lnbmF0ZXMgYSBjb25uZWN0aW9uIHRvIEppcmEgQ2xvdWQuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEpJUkFDTE9VRCA9IG5ldyBDb25uZWN0aW9uVHlwZSgnSklSQUNMT1VEJyk7XG5cbiAgLyoqXG4gICAqIERlc2lnbmF0ZXMgYSBjb25uZWN0aW9uIHRvIEFkb2JlIE1hcmtldG8gRW5nYWdlLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBNQVJLRVRPID0gbmV3IENvbm5lY3Rpb25UeXBlKCdNQVJLRVRPJyk7XG5cbiAgLyoqXG4gICAqIERlc2lnbmF0ZXMgYSBjb25uZWN0aW9uIHRvIE9yYWNsZSBOZXRTdWl0ZS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgTkVUU1VJVEVFUlAgPSBuZXcgQ29ubmVjdGlvblR5cGUoJ05FVFNVSVRFRVJQJyk7XG5cbiAgLyoqXG4gICAqIERlc2lnbmF0ZXMgYSBjb25uZWN0aW9uIHRvIFNhbGVzZm9yY2UgdXNpbmcgT0F1dGggYXV0aGVudGljYXRpb24uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFNBTEVTRk9SQ0UgPSBuZXcgQ29ubmVjdGlvblR5cGUoJ1NBTEVTRk9SQ0UnKTtcblxuICAvKipcbiAgICogRGVzaWduYXRlcyBhIGNvbm5lY3Rpb24gdG8gU2FsZXNmb3JjZSBNYXJrZXRpbmcgQ2xvdWQuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFNBTEVTRk9SQ0VNQVJLRVRJTkdDTE9VRCA9IG5ldyBDb25uZWN0aW9uVHlwZSgnU0FMRVNGT1JDRU1BUktFVElOR0NMT1VEJyk7XG5cbiAgLyoqXG4gICAqIERlc2lnbmF0ZXMgYSBjb25uZWN0aW9uIHRvIFNhbGVzZm9yY2UgTWFya2V0aW5nIENsb3VkIEFjY291bnQgRW5nYWdlbWVudCAoTUNBRSkuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFNBTEVTRk9SQ0VQQVJET1QgPSBuZXcgQ29ubmVjdGlvblR5cGUoJ1NBTEVTRk9SQ0VQQVJET1QnKTtcblxuICAvKipcbiAgICogRGVzaWduYXRlcyBhIGNvbm5lY3Rpb24gdG8gU0FQIE9EYXRhLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBTQVBPREFUQSA9IG5ldyBDb25uZWN0aW9uVHlwZSgnU0FQT0RBVEEnKTtcblxuICAvKipcbiAgICogRGVzaWduYXRlcyBhIGNvbm5lY3Rpb24gdG8gU2VydmljZU5vdy5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgU0VSVklDRU5PVyA9IG5ldyBDb25uZWN0aW9uVHlwZSgnU0VSVklDRU5PVycpO1xuXG4gIC8qKlxuICAgKiBEZXNpZ25hdGVzIGEgY29ubmVjdGlvbiB0byBTbGFjay5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgU0xBQ0sgPSBuZXcgQ29ubmVjdGlvblR5cGUoJ1NMQUNLJyk7XG5cbiAgLyoqXG4gICAqIERlc2lnbmF0ZXMgYSBjb25uZWN0aW9uIHRvIFNuYXBjaGF0IEFkcy5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgU05BUENIQVRBRFMgPSBuZXcgQ29ubmVjdGlvblR5cGUoJ1NOQVBDSEFUQURTJyk7XG5cbiAgLyoqXG4gICAqIERlc2lnbmF0ZXMgYSBjb25uZWN0aW9uIHRvIFN0cmlwZS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgU1RSSVBFID0gbmV3IENvbm5lY3Rpb25UeXBlKCdTVFJJUEUnKTtcblxuICAvKipcbiAgICogRGVzaWduYXRlcyBhIGNvbm5lY3Rpb24gdG8gWmVuZGVzay5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWkVOREVTSyA9IG5ldyBDb25uZWN0aW9uVHlwZSgnWkVOREVTSycpO1xuXG4gIC8qKlxuICAgKiBEZXNpZ25hdGVzIGEgY29ubmVjdGlvbiB0byBab2hvIENSTS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWk9IT0NSTSA9IG5ldyBDb25uZWN0aW9uVHlwZSgnWk9IT0NSTScpO1xuXG4gIC8qKlxuICAgKiBEZXNpZ25hdGVzIGEgY29ubmVjdGlvbiB0byBHb29nbGUgQmlnUXVlcnkuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEJJR1FVRVJZID0gbmV3IENvbm5lY3Rpb25UeXBlKCdCSUdRVUVSWScpO1xuXG4gIC8qKlxuICAgKiBEZXNpZ25hdGVzIGEgY29ubmVjdGlvbiB0byBBenVyZSBTUUwgRGF0YWJhc2UuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEFaVVJFU1FMID0gbmV3IENvbm5lY3Rpb25UeXBlKCdBWlVSRVNRTCcpO1xuXG4gIC8qKlxuICAgKiBEZXNpZ25hdGVzIGEgY29ubmVjdGlvbiB0byBBenVyZSBDb3Ntb3MgREIuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEFaVVJFQ09TTU9TID0gbmV3IENvbm5lY3Rpb25UeXBlKCdBWlVSRUNPU01PUycpO1xuXG4gIC8qKlxuICAgKiBEZXNpZ25hdGVzIGEgY29ubmVjdGlvbiB0byBBbWF6b24gT3BlblNlYXJjaCBTZXJ2aWNlLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBPUEVOU0VBUkNIID0gbmV3IENvbm5lY3Rpb25UeXBlKCdPUEVOU0VBUkNIJyk7XG5cbiAgLyoqXG4gICAqIERlc2lnbmF0ZXMgYSBjb25uZWN0aW9uIHRvIE15U1FMLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBNWVNRTCA9IG5ldyBDb25uZWN0aW9uVHlwZSgnTVlTUUwnKTtcblxuICAvKipcbiAgICogRGVzaWduYXRlcyBhIGNvbm5lY3Rpb24gdG8gUG9zdGdyZVNRTC5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgUE9TVEdSRVNRTCA9IG5ldyBDb25uZWN0aW9uVHlwZSgnUE9TVEdSRVNRTCcpO1xuXG4gIC8qKlxuICAgKiBEZXNpZ25hdGVzIGEgY29ubmVjdGlvbiB0byBPcmFjbGUgRGF0YWJhc2UuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IE9SQUNMRSA9IG5ldyBDb25uZWN0aW9uVHlwZSgnT1JBQ0xFJyk7XG5cbiAgLyoqXG4gICAqIERlc2lnbmF0ZXMgYSBjb25uZWN0aW9uIHRvIE1pY3Jvc29mdCBTUUwgU2VydmVyLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBTUUxTRVJWRVIgPSBuZXcgQ29ubmVjdGlvblR5cGUoJ1NRTFNFUlZFUicpO1xuXG4gIC8qKlxuICAgKiBEZXNpZ25hdGVzIGEgY29ubmVjdGlvbiB0byBTQVAgSEFOQS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgU0FQSEFOQSA9IG5ldyBDb25uZWN0aW9uVHlwZSgnU0FQSEFOQScpO1xuXG4gIC8qKlxuICAgKiBEZXNpZ25hdGVzIGEgY29ubmVjdGlvbiB0byBUZXJhZGF0YS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgVEVSQURBVEEgPSBuZXcgQ29ubmVjdGlvblR5cGUoJ1RFUkFEQVRBJyk7XG5cbiAgLyoqXG4gICAqIERlc2lnbmF0ZXMgYSBjb25uZWN0aW9uIHRvIFZlcnRpY2EuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFZFUlRJQ0EgPSBuZXcgQ29ubmVjdGlvblR5cGUoJ1ZFUlRJQ0EnKTtcblxuICAvKipcbiAgICogRGVzaWduYXRlcyBhIGNvbm5lY3Rpb24gdG8gQW1hem9uIER5bmFtb0RCLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBEWU5BTU9EQiA9IG5ldyBDb25uZWN0aW9uVHlwZSgnRFlOQU1PREInKTtcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhpcyBDb25uZWN0aW9uVHlwZSwgYXMgZXhwZWN0ZWQgYnkgQ29ubmVjdGlvbiByZXNvdXJjZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nKSB7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgY29ubmVjdGlvbiB0eXBlIG5hbWUgYXMgZXhwZWN0ZWQgYnkgQ29ubmVjdGlvbiByZXNvdXJjZS5cbiAgICovXG4gIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLm5hbWU7XG4gIH1cbn1cblxuLyoqXG4gKiBJbnRlcmZhY2UgcmVwcmVzZW50aW5nIGEgY3JlYXRlZCBvciBhbiBpbXBvcnRlZCBgQ29ubmVjdGlvbmBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJQ29ubmVjdGlvbiBleHRlbmRzIGNkay5JUmVzb3VyY2Uge1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGNvbm5lY3Rpb25cbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgY29ubmVjdGlvbk5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIEFSTiBvZiB0aGUgY29ubmVjdGlvblxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBjb25uZWN0aW9uQXJuOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQmFzZSBDb25uZWN0aW9uIE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb25uZWN0aW9uT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgY29ubmVjdGlvblxuICAgKiBAZGVmYXVsdCBjbG91ZGZvcm1hdGlvbiBnZW5lcmF0ZWQgbmFtZVxuICAgKi9cbiAgcmVhZG9ubHkgY29ubmVjdGlvbk5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgY29ubmVjdGlvbi5cbiAgICogQGRlZmF1bHQgbm8gZGVzY3JpcHRpb25cbiAgICovXG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiAgS2V5LVZhbHVlIHBhaXJzIHRoYXQgZGVmaW5lIHBhcmFtZXRlcnMgZm9yIHRoZSBjb25uZWN0aW9uLlxuICAgKiAgQGRlZmF1bHQgZW1wdHkgcHJvcGVydGllc1xuICAgKiAgQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZ2x1ZS9sYXRlc3QvZGcvYXdzLWdsdWUtcHJvZ3JhbW1pbmctZXRsLWNvbm5lY3QuaHRtbFxuICAgKi9cbiAgcmVhZG9ubHkgcHJvcGVydGllcz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG5cbiAgLyoqXG4gICAqIEEgbGlzdCBvZiBjcml0ZXJpYSB0aGF0IGNhbiBiZSB1c2VkIGluIHNlbGVjdGluZyB0aGlzIGNvbm5lY3Rpb24uXG4gICAqIFRoaXMgaXMgdXNlZnVsIGZvciBmaWx0ZXJpbmcgdGhlIHJlc3VsdHMgb2YgaHR0cHM6Ly9hd3NjbGkuYW1hem9uYXdzLmNvbS92Mi9kb2N1bWVudGF0aW9uL2FwaS9sYXRlc3QvcmVmZXJlbmNlL2dsdWUvZ2V0LWNvbm5lY3Rpb25zLmh0bWxcbiAgICogQGRlZmF1bHQgbm8gbWF0Y2ggY3JpdGVyaWFcbiAgICovXG4gIHJlYWRvbmx5IG1hdGNoQ3JpdGVyaWE/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogVGhlIGxpc3Qgb2Ygc2VjdXJpdHkgZ3JvdXBzIG5lZWRlZCB0byBzdWNjZXNzZnVsbHkgbWFrZSB0aGlzIGNvbm5lY3Rpb24gZS5nLiB0byBzdWNjZXNzZnVsbHkgY29ubmVjdCB0byBWUEMuXG4gICAqIEBkZWZhdWx0IG5vIHNlY3VyaXR5IGdyb3VwXG4gICAqL1xuICByZWFkb25seSBzZWN1cml0eUdyb3Vwcz86IGVjMi5JU2VjdXJpdHlHcm91cFtdO1xuXG4gIC8qKlxuICAgKiBUaGUgVlBDIHN1Ym5ldCB0byBjb25uZWN0IHRvIHJlc291cmNlcyB3aXRoaW4gYSBWUEMuIFNlZSBtb3JlIGF0IGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9nbHVlL2xhdGVzdC9kZy9zdGFydC1jb25uZWN0aW5nLmh0bWwuXG4gICAqIEBkZWZhdWx0IG5vIHN1Ym5ldFxuICAgKi9cbiAgcmVhZG9ubHkgc3VibmV0PzogZWMyLklTdWJuZXQ7XG59XG5cbi8qKlxuICogQ29uc3RydWN0aW9uIHByb3BlcnRpZXMgZm9yIGBDb25uZWN0aW9uYFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbm5lY3Rpb25Qcm9wcyBleHRlbmRzIENvbm5lY3Rpb25PcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHRoZSBjb25uZWN0aW9uXG4gICAqL1xuICByZWFkb25seSB0eXBlOiBDb25uZWN0aW9uVHlwZTtcbn1cblxuLyoqXG4gKiBBbiBBV1MgR2x1ZSBjb25uZWN0aW9uIHRvIGEgZGF0YSBzb3VyY2UuXG4gKi9cbkBwcm9wZXJ0eUluamVjdGFibGVcbmV4cG9ydCBjbGFzcyBDb25uZWN0aW9uIGV4dGVuZHMgY2RrLlJlc291cmNlIGltcGxlbWVudHMgSUNvbm5lY3Rpb24ge1xuICAvKiogVW5pcXVlbHkgaWRlbnRpZmllcyB0aGlzIGNsYXNzLiAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFBST1BFUlRZX0lOSkVDVElPTl9JRDogc3RyaW5nID0gJ0Bhd3MtY2RrLmF3cy1nbHVlLWFscGhhLkNvbm5lY3Rpb24nO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgQ29ubmVjdGlvbiBjb25zdHJ1Y3QgdGhhdCByZXByZXNlbnRzIGFuIGV4dGVybmFsIGNvbm5lY3Rpb24uXG4gICAqXG4gICAqIEBwYXJhbSBzY29wZSBUaGUgc2NvcGUgY3JlYXRpbmcgY29uc3RydWN0ICh1c3VhbGx5IGB0aGlzYCkuXG4gICAqIEBwYXJhbSBpZCBUaGUgY29uc3RydWN0J3MgaWQuXG4gICAqIEBwYXJhbSBjb25uZWN0aW9uQXJuIGFybiBvZiBleHRlcm5hbCBjb25uZWN0aW9uLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tQ29ubmVjdGlvbkFybihzY29wZTogY29uc3RydWN0cy5Db25zdHJ1Y3QsIGlkOiBzdHJpbmcsIGNvbm5lY3Rpb25Bcm46IHN0cmluZyk6IElDb25uZWN0aW9uIHtcbiAgICBjbGFzcyBJbXBvcnQgZXh0ZW5kcyBjZGsuUmVzb3VyY2UgaW1wbGVtZW50cyBJQ29ubmVjdGlvbiB7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgY29ubmVjdGlvbk5hbWUgPSBjZGsuQXJuLmV4dHJhY3RSZXNvdXJjZU5hbWUoY29ubmVjdGlvbkFybiwgJ2Nvbm5lY3Rpb24nKTtcbiAgICAgIHB1YmxpYyByZWFkb25seSBjb25uZWN0aW9uQXJuID0gY29ubmVjdGlvbkFybjtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IEltcG9ydChzY29wZSwgaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBDb25uZWN0aW9uIGNvbnN0cnVjdCB0aGF0IHJlcHJlc2VudHMgYW4gZXh0ZXJuYWwgY29ubmVjdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHNjb3BlIFRoZSBzY29wZSBjcmVhdGluZyBjb25zdHJ1Y3QgKHVzdWFsbHkgYHRoaXNgKS5cbiAgICogQHBhcmFtIGlkIFRoZSBjb25zdHJ1Y3QncyBpZC5cbiAgICogQHBhcmFtIGNvbm5lY3Rpb25OYW1lIG5hbWUgb2YgZXh0ZXJuYWwgY29ubmVjdGlvbi5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbUNvbm5lY3Rpb25OYW1lKHNjb3BlOiBjb25zdHJ1Y3RzLkNvbnN0cnVjdCwgaWQ6IHN0cmluZywgY29ubmVjdGlvbk5hbWU6IHN0cmluZyk6IElDb25uZWN0aW9uIHtcbiAgICBjbGFzcyBJbXBvcnQgZXh0ZW5kcyBjZGsuUmVzb3VyY2UgaW1wbGVtZW50cyBJQ29ubmVjdGlvbiB7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgY29ubmVjdGlvbk5hbWUgPSBjb25uZWN0aW9uTmFtZTtcbiAgICAgIHB1YmxpYyByZWFkb25seSBjb25uZWN0aW9uQXJuID0gQ29ubmVjdGlvbi5idWlsZENvbm5lY3Rpb25Bcm4oc2NvcGUsIGNvbm5lY3Rpb25OYW1lKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IEltcG9ydChzY29wZSwgaWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgYnVpbGRDb25uZWN0aW9uQXJuKHNjb3BlOiBjb25zdHJ1Y3RzLkNvbnN0cnVjdCwgY29ubmVjdGlvbk5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGNkay5TdGFjay5vZihzY29wZSkuZm9ybWF0QXJuKHtcbiAgICAgIHNlcnZpY2U6ICdnbHVlJyxcbiAgICAgIHJlc291cmNlOiAnY29ubmVjdGlvbicsXG4gICAgICByZXNvdXJjZU5hbWU6IGNvbm5lY3Rpb25OYW1lLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkb25seSBwcm9wZXJ0aWVzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuICBwcml2YXRlIHJlYWRvbmx5IHJlc291cmNlOiBDZm5Db25uZWN0aW9uO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBjb25zdHJ1Y3RzLkNvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IENvbm5lY3Rpb25Qcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwge1xuICAgICAgcGh5c2ljYWxOYW1lOiBwcm9wcy5jb25uZWN0aW9uTmFtZSxcbiAgICB9KTtcbiAgICAvLyBFbmhhbmNlZCBDREsgQW5hbHl0aWNzIFRlbGVtZXRyeVxuICAgIGFkZENvbnN0cnVjdE1ldGFkYXRhKHRoaXMsIHByb3BzKTtcblxuICAgIHRoaXMucHJvcGVydGllcyA9IHByb3BzLnByb3BlcnRpZXMgfHwge307XG5cbiAgICBjb25zdCBwaHlzaWNhbENvbm5lY3Rpb25SZXF1aXJlbWVudHMgPSBwcm9wcy5zdWJuZXQgfHwgcHJvcHMuc2VjdXJpdHlHcm91cHMgPyB7XG4gICAgICBhdmFpbGFiaWxpdHlab25lOiBwcm9wcy5zdWJuZXQgPyBwcm9wcy5zdWJuZXQuYXZhaWxhYmlsaXR5Wm9uZSA6IHVuZGVmaW5lZCxcbiAgICAgIHN1Ym5ldElkOiBwcm9wcy5zdWJuZXQgPyBwcm9wcy5zdWJuZXQuc3VibmV0SWQgOiB1bmRlZmluZWQsXG4gICAgICBzZWN1cml0eUdyb3VwSWRMaXN0OiBwcm9wcy5zZWN1cml0eUdyb3VwcyA/IHByb3BzLnNlY3VyaXR5R3JvdXBzLm1hcChzZyA9PiBzZy5zZWN1cml0eUdyb3VwSWQpIDogdW5kZWZpbmVkLFxuICAgIH0gOiB1bmRlZmluZWQ7XG5cbiAgICB0aGlzLnJlc291cmNlID0gbmV3IENmbkNvbm5lY3Rpb24odGhpcywgJ1Jlc291cmNlJywge1xuICAgICAgY2F0YWxvZ0lkOiBjZGsuU3RhY2sub2YodGhpcykuYWNjb3VudCxcbiAgICAgIGNvbm5lY3Rpb25JbnB1dDoge1xuICAgICAgICBjb25uZWN0aW9uUHJvcGVydGllczogY2RrLkxhenkuYW55KHtcbiAgICAgICAgICBwcm9kdWNlOiAoKSA9PiB7XG4gICAgICAgICAgICAvLyBJbnNwZWN0IHRoZSBmaW5hbCBwcm9wZXJ0eSBzZXQgYXQgc3ludGhlc2lzIHRpbWUgc28gcHJvcGVydGllc1xuICAgICAgICAgICAgLy8gYWRkZWQgdmlhIGBhZGRQcm9wZXJ0eWAgYXJlIGNvdmVyZWQgYXMgd2VsbC5cbiAgICAgICAgICAgIHdhcm5PblBsYWludGV4dFNlY3JldHMoXG4gICAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICAgIHRoaXMucHJvcGVydGllcyxcbiAgICAgICAgICAgICAgJ0Bhd3MtY2RrL2F3cy1nbHVlLWFscGhhOnBsYWludGV4dENvbm5lY3Rpb25TZWNyZXQnLFxuICAgICAgICAgICAgICAnUmVmZXJlbmNlIGEgU2VjcmV0cyBNYW5hZ2VyIHNlY3JldCB0aHJvdWdoIHRoZSBjb25uZWN0aW9uXFwncyBgU0VDUkVUX0lEYCBwcm9wZXJ0eSBpbnN0ZWFkLicsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMucHJvcGVydGllcykubGVuZ3RoID4gMCA/IHRoaXMucHJvcGVydGllcyA6IHVuZGVmaW5lZDtcbiAgICAgICAgICB9LFxuICAgICAgICB9KSxcbiAgICAgICAgY29ubmVjdGlvblR5cGU6IHByb3BzLnR5cGUubmFtZSxcbiAgICAgICAgZGVzY3JpcHRpb246IHByb3BzLmRlc2NyaXB0aW9uLFxuICAgICAgICBtYXRjaENyaXRlcmlhOiBwcm9wcy5tYXRjaENyaXRlcmlhLFxuICAgICAgICBuYW1lOiBwcm9wcy5jb25uZWN0aW9uTmFtZSxcbiAgICAgICAgcGh5c2ljYWxDb25uZWN0aW9uUmVxdWlyZW1lbnRzLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgY29ubmVjdGlvblxuICAgKi9cbiAgQG1lbW9pemVkR2V0dGVyXG4gIHB1YmxpYyBnZXQgY29ubmVjdGlvbk5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRSZXNvdXJjZU5hbWVBdHRyaWJ1dGUodGhpcy5yZXNvdXJjZS5yZWYpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBBUk4gb2YgdGhlIGNvbm5lY3Rpb25cbiAgICovXG4gIEBtZW1vaXplZEdldHRlclxuICBwdWJsaWMgZ2V0IGNvbm5lY3Rpb25Bcm4oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gQ29ubmVjdGlvbi5idWlsZENvbm5lY3Rpb25Bcm4odGhpcywgdGhpcy5jb25uZWN0aW9uTmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGFkZGl0aW9uYWwgY29ubmVjdGlvbiBwYXJhbWV0ZXJzXG4gICAqIEBwYXJhbSBrZXkgcGFyYW1ldGVyIGtleVxuICAgKiBAcGFyYW0gdmFsdWUgcGFyYW1ldGVyIHZhbHVlXG4gICAqL1xuICBATWV0aG9kTWV0YWRhdGEoKVxuICBwdWJsaWMgYWRkUHJvcGVydHkoa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnByb3BlcnRpZXNba2V5XSA9IHZhbHVlO1xuICB9XG59XG4iXX0=
439
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29ubmVjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImNvbm5lY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQ0EsbURBQXFEO0FBRXJELHNEQUF3QztBQUN4Qyw0RUFBNEU7QUFDNUUsOEVBQThGO0FBQzlGLDBFQUEwRTtBQUUxRSxpRUFBb0U7QUFFcEU7Ozs7Ozs7R0FPRztBQUNILE1BQWEsY0FBYzs7SUFDekI7O09BRUc7SUFDSSxNQUFNLENBQVUsSUFBSSxHQUFHLElBQUksY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRXpEOztPQUVHO0lBQ0ksTUFBTSxDQUFVLEtBQUssR0FBRyxJQUFJLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUUzRDs7T0FFRztJQUNJLE1BQU0sQ0FBVSxPQUFPLEdBQUcsSUFBSSxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUM7SUFFL0Q7O09BRUc7SUFDSSxNQUFNLENBQVUsd0JBQXdCLEdBQUcsSUFBSSxjQUFjLENBQUMsMEJBQTBCLENBQUMsQ0FBQztJQUVqRzs7T0FFRztJQUNJLE1BQU0sQ0FBVSxzQkFBc0IsR0FBRyxJQUFJLGNBQWMsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO0lBRTdGOztPQUVHO0lBQ0ksTUFBTSxDQUFVLE9BQU8sR0FBRyxJQUFJLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUUvRDs7O09BR0c7SUFDSSxNQUFNLENBQVUsV0FBVyxHQUFHLElBQUksY0FBYyxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBRXZFOzs7T0FHRztJQUNJLE1BQU0sQ0FBVSxNQUFNLEdBQUcsSUFBSSxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUM7SUFFN0Q7O09BRUc7SUFDSSxNQUFNLENBQVUsV0FBVyxHQUFHLElBQUksY0FBYyxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lB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bSAnYXdzLWNkay1saWIvYXdzLWVjMic7XG5pbXBvcnQgeyBDZm5Db25uZWN0aW9uIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWdsdWUnO1xuaW1wb3J0IHR5cGUgeyBJU2VjcmV0UmVmIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXNlY3JldHNtYW5hZ2VyJztcbmltcG9ydCAqIGFzIGNkayBmcm9tICdhd3MtY2RrLWxpYi9jb3JlJztcbmltcG9ydCB7IGxpdCwgbWVtb2l6ZWRHZXR0ZXIgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlL2xpYi9oZWxwZXJzLWludGVybmFsJztcbmltcG9ydCB7IGFkZENvbnN0cnVjdE1ldGFkYXRhLCBNZXRob2RNZXRhZGF0YSB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUvbGliL21ldGFkYXRhLXJlc291cmNlJztcbmltcG9ydCB7IHByb3BlcnR5SW5qZWN0YWJsZSB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUvbGliL3Byb3AtaW5qZWN0YWJsZSc7XG5pbXBvcnQgdHlwZSAqIGFzIGNvbnN0cnVjdHMgZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyB3YXJuT25QbGFpbnRleHRTZWNyZXRzIH0gZnJvbSAnLi9wcml2YXRlL3NlY3JldC1kZXRlY3Rpb24nO1xuXG4vKipcbiAqIFRoZSB0eXBlIG9mIHRoZSBnbHVlIGNvbm5lY3Rpb25cbiAqXG4gKiBJZiB5b3UgbmVlZCB0byB1c2UgYSBjb25uZWN0aW9uIHR5cGUgdGhhdCBkb2Vzbid0IGV4aXN0IGFzIGEgc3RhdGljIG1lbWJlciwgeW91XG4gKiBjYW4gaW5zdGFudGlhdGUgYSBgQ29ubmVjdGlvblR5cGVgIG9iamVjdCwgZS5nOiBgbmV3IENvbm5lY3Rpb25UeXBlKCdORVdfVFlQRScpYC5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVXNlckd1aWRlL2F3cy1wcm9wZXJ0aWVzLWdsdWUtY29ubmVjdGlvbi1jb25uZWN0aW9uaW5wdXQuaHRtbCNjZm4tZ2x1ZS1jb25uZWN0aW9uLWNvbm5lY3Rpb25pbnB1dC1jb25uZWN0aW9udHlwZVxuICovXG5leHBvcnQgY2xhc3MgQ29ubmVjdGlvblR5cGUge1xuICAvKipcbiAgICogRGVzaWduYXRlcyBhIGNvbm5lY3Rpb24gdG8gYSBkYXRhYmFzZSB0aHJvdWdoIEphdmEgRGF0YWJhc2UgQ29ubmVjdGl2aXR5IChKREJDKS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgSkRCQyA9IG5ldyBDb25uZWN0aW9uVHlwZSgnSkRCQycpO1xuXG4gIC8qKlxuICAgKiBEZXNpZ25hdGVzIGEgY29ubmVjdGlvbiB0byBhbiBBcGFjaGUgS2Fma2Egc3RyZWFtaW5nIHBsYXRmb3JtLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBLQUZLQSA9IG5ldyBDb25uZWN0aW9uVHlwZSgnS0FGS0EnKTtcblxuICAvKipcbiAgICogRGVzaWduYXRlcyBhIGNvbm5lY3Rpb24gdG8gYSBNb25nb0RCIGRvY3VtZW50IGRhdGFiYXNlLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBNT05HT0RCID0gbmV3IENvbm5lY3Rpb25UeXBlKCdNT05HT0RCJyk7XG5cbiAgLyoqXG4gICAqIERlc2lnbmF0ZXMgYSBjb25uZWN0aW9uIHVzZWQgZm9yIHZpZXcgdmFsaWRhdGlvbiBieSBBbWF6b24gUmVkc2hpZnQuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFZJRVdfVkFMSURBVElPTl9SRURTSElGVCA9IG5ldyBDb25uZWN0aW9uVHlwZSgnVklFV19WQUxJREFUSU9OX1JFRFNISUZUJyk7XG5cbiAgLyoqXG4gICAqIERlc2lnbmF0ZXMgYSBjb25uZWN0aW9uIHVzZWQgZm9yIHZpZXcgdmFsaWRhdGlvbiBieSBBbWF6b24gQXRoZW5hLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBWSUVXX1ZBTElEQVRJT05fQVRIRU5BID0gbmV3IENvbm5lY3Rpb25UeXBlKCdWSUVXX1ZBTElEQVRJT05fQVRIRU5BJyk7XG5cbiAgLyoqXG4gICAqIERlc2lnbmF0ZXMgYSBuZXR3b3JrIGNvbm5lY3Rpb24gdG8gYSBkYXRhIHNvdXJjZSB3aXRoaW4gYW4gQW1hem9uIFZpcnR1YWwgUHJpdmF0ZSBDbG91ZCBlbnZpcm9ubWVudCAoQW1hem9uIFZQQykuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IE5FVFdPUksgPSBuZXcgQ29ubmVjdGlvblR5cGUoJ05FVFdPUksnKTtcblxuICAvKipcbiAgICogVXNlcyBjb25maWd1cmF0aW9uIHNldHRpbmdzIGNvbnRhaW5lZCBpbiBhIGNvbm5lY3RvciBwdXJjaGFzZWQgZnJvbSBBV1MgTWFya2V0cGxhY2VcbiAgICogdG8gcmVhZCBmcm9tIGFuZCB3cml0ZSB0byBkYXRhIHN0b3JlcyB0aGF0IGFyZSBub3QgbmF0aXZlbHkgc3VwcG9ydGVkIGJ5IEFXUyBHbHVlLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBNQVJLRVRQTEFDRSA9IG5ldyBDb25uZWN0aW9uVHlwZSgnTUFSS0VUUExBQ0UnKTtcblxuICAvKipcbiAgICogVXNlcyBjb25maWd1cmF0aW9uIHNldHRpbmdzIGNvbnRhaW5lZCBpbiBhIGN1c3RvbSBjb25uZWN0b3IgdG8gcmVhZCBmcm9tIGFuZCB3cml0ZSB0byBkYXRhIHN0b3Jlc1xuICAgKiB0aGF0IGFyZSBub3QgbmF0aXZlbHkgc3VwcG9ydGVkIGJ5IEFXUyBHbHVlLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBDVVNUT00gPSBuZXcgQ29ubmVjdGlvblR5cGUoJ0NVU1RPTScpO1xuXG4gIC8qKlxuICAgKiBEZXNpZ25hdGVzIGEgY29ubmVjdGlvbiB0byBGYWNlYm9vayBBZHMuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEZBQ0VCT09LQURTID0gbmV3IENvbm5lY3Rpb25UeXBlKCdGQUNFQk9PS0FEUycpO1xuXG4gIC8qKlxuICAgKiBEZXNpZ25hdGVzIGEgY29ubmVjdGlvbiB0byBHb29nbGUgQWRzLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBHT09HTEVBRFMgPSBuZXcgQ29ubmVjdGlvblR5cGUoJ0dPT0dMRUFEUycpO1xuXG4gIC8qKlxuICAgKiBEZXNpZ25hdGVzIGEgY29ubmVjdGlvbiB0byBHb29nbGUgU2hlZXRzLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBHT09HTEVTSEVFVFMgPSBuZXcgQ29ubmVjdGlvblR5cGUoJ0dPT0dMRVNIRUVUUycpO1xuXG4gIC8qKlxuICAgKiBEZXNpZ25hdGVzIGEgY29ubmVjdGlvbiB0byBHb29nbGUgQW5hbHl0aWNzIDQuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEdPT0dMRUFOQUxZVElDUzQgPSBuZXcgQ29ubmVjdGlvblR5cGUoJ0dPT0dMRUFOQUxZVElDUzQnKTtcblxuICAvKipcbiAgICogRGVzaWduYXRlcyBhIGNvbm5lY3Rpb24gdG8gSHViU3BvdC5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgSFVCU1BPVCA9IG5ldyBDb25uZWN0aW9uVHlwZSgnSFVCU1BPVCcpO1xuXG4gIC8qKlxuICAgKiBEZXNpZ25hdGVzIGEgY29ubmVjdGlvbiB0byBJbnN0YWdyYW0gQWRzLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBJTlNUQUdSQU1BRFMgPSBuZXcgQ29ubmVjdGlvblR5cGUoJ0lOU1RBR1JBTUFEUycpO1xuXG4gIC8qKlxuICAgKiBEZXNpZ25hdGVzIGEgY29ubmVjdGlvbiB0byBJbnRlcmNvbS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgSU5URVJDT00gPSBuZXcgQ29ubmVjdGlvblR5cGUoJ0lOVEVSQ09NJyk7XG5cbiAgLyoqXG4gICAqIERlc2lnbmF0ZXMgYSBjb25uZWN0aW9uIHRvIEppcmEgQ2xvdWQuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEpJUkFDTE9VRCA9IG5ldyBDb25uZWN0aW9uVHlwZSgnSklSQUNMT1VEJyk7XG5cbiAgLyoqXG4gICAqIERlc2lnbmF0ZXMgYSBjb25uZWN0aW9uIHRvIEFkb2JlIE1hcmtldG8gRW5nYWdlLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBNQVJLRVRPID0gbmV3IENvbm5lY3Rpb25UeXBlKCdNQVJLRVRPJyk7XG5cbiAgLyoqXG4gICAqIERlc2lnbmF0ZXMgYSBjb25uZWN0aW9uIHRvIE9yYWNsZSBOZXRTdWl0ZS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgTkVUU1VJVEVFUlAgPSBuZXcgQ29ubmVjdGlvblR5cGUoJ05FVFNVSVRFRVJQJyk7XG5cbiAgLyoqXG4gICAqIERlc2lnbmF0ZXMgYSBjb25uZWN0aW9uIHRvIFNhbGVzZm9yY2UgdXNpbmcgT0F1dGggYXV0aGVudGljYXRpb24uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFNBTEVTRk9SQ0UgPSBuZXcgQ29ubmVjdGlvblR5cGUoJ1NBTEVTRk9SQ0UnKTtcblxuICAvKipcbiAgICogRGVzaWduYXRlcyBhIGNvbm5lY3Rpb24gdG8gU2FsZXNmb3JjZSBNYXJrZXRpbmcgQ2xvdWQuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFNBTEVTRk9SQ0VNQVJLRVRJTkdDTE9VRCA9IG5ldyBDb25uZWN0aW9uVHlwZSgnU0FMRVNGT1JDRU1BUktFVElOR0NMT1VEJyk7XG5cbiAgLyoqXG4gICAqIERlc2lnbmF0ZXMgYSBjb25uZWN0aW9uIHRvIFNhbGVzZm9yY2UgTWFya2V0aW5nIENsb3VkIEFjY291bnQgRW5nYWdlbWVudCAoTUNBRSkuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFNBTEVTRk9SQ0VQQVJET1QgPSBuZXcgQ29ubmVjdGlvblR5cGUoJ1NBTEVTRk9SQ0VQQVJET1QnKTtcblxuICAvKipcbiAgICogRGVzaWduYXRlcyBhIGNvbm5lY3Rpb24gdG8gU0FQIE9EYXRhLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBTQVBPREFUQSA9IG5ldyBDb25uZWN0aW9uVHlwZSgnU0FQT0RBVEEnKTtcblxuICAvKipcbiAgICogRGVzaWduYXRlcyBhIGNvbm5lY3Rpb24gdG8gU2VydmljZU5vdy5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgU0VSVklDRU5PVyA9IG5ldyBDb25uZWN0aW9uVHlwZSgnU0VSVklDRU5PVycpO1xuXG4gIC8qKlxuICAgKiBEZXNpZ25hdGVzIGEgY29ubmVjdGlvbiB0byBTbGFjay5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgU0xBQ0sgPSBuZXcgQ29ubmVjdGlvblR5cGUoJ1NMQUNLJyk7XG5cbiAgLyoqXG4gICAqIERlc2lnbmF0ZXMgYSBjb25uZWN0aW9uIHRvIFNuYXBjaGF0IEFkcy5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgU05BUENIQVRBRFMgPSBuZXcgQ29ubmVjdGlvblR5cGUoJ1NOQVBDSEFUQURTJyk7XG5cbiAgLyoqXG4gICAqIERlc2lnbmF0ZXMgYSBjb25uZWN0aW9uIHRvIFN0cmlwZS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgU1RSSVBFID0gbmV3IENvbm5lY3Rpb25UeXBlKCdTVFJJUEUnKTtcblxuICAvKipcbiAgICogRGVzaWduYXRlcyBhIGNvbm5lY3Rpb24gdG8gWmVuZGVzay5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWkVOREVTSyA9IG5ldyBDb25uZWN0aW9uVHlwZSgnWkVOREVTSycpO1xuXG4gIC8qKlxuICAgKiBEZXNpZ25hdGVzIGEgY29ubmVjdGlvbiB0byBab2hvIENSTS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWk9IT0NSTSA9IG5ldyBDb25uZWN0aW9uVHlwZSgnWk9IT0NSTScpO1xuXG4gIC8qKlxuICAgKiBEZXNpZ25hdGVzIGEgY29ubmVjdGlvbiB0byBHb29nbGUgQmlnUXVlcnkuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEJJR1FVRVJZID0gbmV3IENvbm5lY3Rpb25UeXBlKCdCSUdRVUVSWScpO1xuXG4gIC8qKlxuICAgKiBEZXNpZ25hdGVzIGEgY29ubmVjdGlvbiB0byBBenVyZSBTUUwgRGF0YWJhc2UuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEFaVVJFU1FMID0gbmV3IENvbm5lY3Rpb25UeXBlKCdBWlVSRVNRTCcpO1xuXG4gIC8qKlxuICAgKiBEZXNpZ25hdGVzIGEgY29ubmVjdGlvbiB0byBBenVyZSBDb3Ntb3MgREIuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEFaVVJFQ09TTU9TID0gbmV3IENvbm5lY3Rpb25UeXBlKCdBWlVSRUNPU01PUycpO1xuXG4gIC8qKlxuICAgKiBEZXNpZ25hdGVzIGEgY29ubmVjdGlvbiB0byBBbWF6b24gT3BlblNlYXJjaCBTZXJ2aWNlLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBPUEVOU0VBUkNIID0gbmV3IENvbm5lY3Rpb25UeXBlKCdPUEVOU0VBUkNIJyk7XG5cbiAgLyoqXG4gICAqIERlc2lnbmF0ZXMgYSBjb25uZWN0aW9uIHRvIE15U1FMLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBNWVNRTCA9IG5ldyBDb25uZWN0aW9uVHlwZSgnTVlTUUwnKTtcblxuICAvKipcbiAgICogRGVzaWduYXRlcyBhIGNvbm5lY3Rpb24gdG8gUG9zdGdyZVNRTC5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgUE9TVEdSRVNRTCA9IG5ldyBDb25uZWN0aW9uVHlwZSgnUE9TVEdSRVNRTCcpO1xuXG4gIC8qKlxuICAgKiBEZXNpZ25hdGVzIGEgY29ubmVjdGlvbiB0byBPcmFjbGUgRGF0YWJhc2UuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IE9SQUNMRSA9IG5ldyBDb25uZWN0aW9uVHlwZSgnT1JBQ0xFJyk7XG5cbiAgLyoqXG4gICAqIERlc2lnbmF0ZXMgYSBjb25uZWN0aW9uIHRvIE1pY3Jvc29mdCBTUUwgU2VydmVyLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBTUUxTRVJWRVIgPSBuZXcgQ29ubmVjdGlvblR5cGUoJ1NRTFNFUlZFUicpO1xuXG4gIC8qKlxuICAgKiBEZXNpZ25hdGVzIGEgY29ubmVjdGlvbiB0byBTQVAgSEFOQS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgU0FQSEFOQSA9IG5ldyBDb25uZWN0aW9uVHlwZSgnU0FQSEFOQScpO1xuXG4gIC8qKlxuICAgKiBEZXNpZ25hdGVzIGEgY29ubmVjdGlvbiB0byBUZXJhZGF0YS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgVEVSQURBVEEgPSBuZXcgQ29ubmVjdGlvblR5cGUoJ1RFUkFEQVRBJyk7XG5cbiAgLyoqXG4gICAqIERlc2lnbmF0ZXMgYSBjb25uZWN0aW9uIHRvIFZlcnRpY2EuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFZFUlRJQ0EgPSBuZXcgQ29ubmVjdGlvblR5cGUoJ1ZFUlRJQ0EnKTtcblxuICAvKipcbiAgICogRGVzaWduYXRlcyBhIGNvbm5lY3Rpb24gdG8gQW1hem9uIER5bmFtb0RCLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBEWU5BTU9EQiA9IG5ldyBDb25uZWN0aW9uVHlwZSgnRFlOQU1PREInKTtcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhpcyBDb25uZWN0aW9uVHlwZSwgYXMgZXhwZWN0ZWQgYnkgQ29ubmVjdGlvbiByZXNvdXJjZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nKSB7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgY29ubmVjdGlvbiB0eXBlIG5hbWUgYXMgZXhwZWN0ZWQgYnkgQ29ubmVjdGlvbiByZXNvdXJjZS5cbiAgICovXG4gIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLm5hbWU7XG4gIH1cbn1cblxuLyoqXG4gKiBJbnRlcmZhY2UgcmVwcmVzZW50aW5nIGEgY3JlYXRlZCBvciBhbiBpbXBvcnRlZCBgQ29ubmVjdGlvbmBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJQ29ubmVjdGlvbiBleHRlbmRzIGNkay5JUmVzb3VyY2Uge1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGNvbm5lY3Rpb25cbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgY29ubmVjdGlvbk5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIEFSTiBvZiB0aGUgY29ubmVjdGlvblxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBjb25uZWN0aW9uQXJuOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQmFzZSBDb25uZWN0aW9uIE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb25uZWN0aW9uT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgY29ubmVjdGlvblxuICAgKiBAZGVmYXVsdCBjbG91ZGZvcm1hdGlvbiBnZW5lcmF0ZWQgbmFtZVxuICAgKi9cbiAgcmVhZG9ubHkgY29ubmVjdGlvbk5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgY29ubmVjdGlvbi5cbiAgICogQGRlZmF1bHQgbm8gZGVzY3JpcHRpb25cbiAgICovXG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiAgS2V5LVZhbHVlIHBhaXJzIHRoYXQgZGVmaW5lIHBhcmFtZXRlcnMgZm9yIHRoZSBjb25uZWN0aW9uLlxuICAgKiAgQGRlZmF1bHQgZW1wdHkgcHJvcGVydGllc1xuICAgKiAgQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZ2x1ZS9sYXRlc3QvZGcvYXdzLWdsdWUtcHJvZ3JhbW1pbmctZXRsLWNvbm5lY3QuaHRtbFxuICAgKi9cbiAgcmVhZG9ubHkgcHJvcGVydGllcz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG5cbiAgLyoqXG4gICAqIEEgcmVmZXJlbmNlIHRvIGEgU2VjcmV0cyBNYW5hZ2VyIHNlY3JldCBob2xkaW5nIHRoZSBjcmVkZW50aWFscyBmb3IgdGhpcyBjb25uZWN0aW9uLlxuICAgKlxuICAgKiBUaGUgc2VjcmV0IGlzIHJlZmVyZW5jZWQgdGhyb3VnaCB0aGUgY29ubmVjdGlvbidzIGBTRUNSRVRfSURgIHByb3BlcnR5LCBzb1xuICAgKiBHbHVlIHJlYWRzIHRoZSBjcmVkZW50aWFscyBhdCBydW50aW1lIGFuZCB0aGUgc2VjcmV0IHZhbHVlIG5ldmVyIGFwcGVhcnMgaW5cbiAgICogdGhlIHN5bnRoZXNpemVkIHRlbXBsYXRlLiBQcmVmZXIgdGhpcyBvdmVyIHBsYWNpbmcgY3JlZGVudGlhbHMgZGlyZWN0bHkgaW5cbiAgICogYHByb3BlcnRpZXNgLiBBY2NlcHRzIGFueSBgc2VjcmV0c21hbmFnZXIuSVNlY3JldGAuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gc2VjcmV0OyBhbnkgY3JlZGVudGlhbHMgbXVzdCBiZSBzdXBwbGllZCB2aWEgYHByb3BlcnRpZXNgXG4gICAqL1xuICByZWFkb25seSBzZWNyZXQ/OiBJU2VjcmV0UmVmO1xuXG4gIC8qKlxuICAgKiBBIGxpc3Qgb2YgY3JpdGVyaWEgdGhhdCBjYW4gYmUgdXNlZCBpbiBzZWxlY3RpbmcgdGhpcyBjb25uZWN0aW9uLlxuICAgKiBUaGlzIGlzIHVzZWZ1bCBmb3IgZmlsdGVyaW5nIHRoZSByZXN1bHRzIG9mIGh0dHBzOi8vYXdzY2xpLmFtYXpvbmF3cy5jb20vdjIvZG9jdW1lbnRhdGlvbi9hcGkvbGF0ZXN0L3JlZmVyZW5jZS9nbHVlL2dldC1jb25uZWN0aW9ucy5odG1sXG4gICAqIEBkZWZhdWx0IG5vIG1hdGNoIGNyaXRlcmlhXG4gICAqL1xuICByZWFkb25seSBtYXRjaENyaXRlcmlhPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFRoZSBsaXN0IG9mIHNlY3VyaXR5IGdyb3VwcyBuZWVkZWQgdG8gc3VjY2Vzc2Z1bGx5IG1ha2UgdGhpcyBjb25uZWN0aW9uIGUuZy4gdG8gc3VjY2Vzc2Z1bGx5IGNvbm5lY3QgdG8gVlBDLlxuICAgKiBAZGVmYXVsdCBubyBzZWN1cml0eSBncm91cFxuICAgKi9cbiAgcmVhZG9ubHkgc2VjdXJpdHlHcm91cHM/OiBlYzIuSVNlY3VyaXR5R3JvdXBbXTtcblxuICAvKipcbiAgICogVGhlIFZQQyBzdWJuZXQgdG8gY29ubmVjdCB0byByZXNvdXJjZXMgd2l0aGluIGEgVlBDLiBTZWUgbW9yZSBhdCBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZ2x1ZS9sYXRlc3QvZGcvc3RhcnQtY29ubmVjdGluZy5odG1sLlxuICAgKlxuICAgKiBNdXR1YWxseSBleGNsdXNpdmUgd2l0aCBgdnBjYDogcHJvdmlkZSBgc3VibmV0YCB0byBwaW4gdGhlIGNvbm5lY3Rpb24gdG8gYVxuICAgKiBzcGVjaWZpYyBzdWJuZXQsIG9yIHByb3ZpZGUgYHZwY2AgKG9wdGlvbmFsbHkgd2l0aCBgdnBjU3VibmV0c2ApIHRvIGxldCB0aGVcbiAgICogQ0RLIHNlbGVjdCBvbmUgZm9yIHlvdS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBzdWJuZXQsIHVubGVzcyBgdnBjYCBpcyBwcm92aWRlZFxuICAgKi9cbiAgcmVhZG9ubHkgc3VibmV0PzogZWMyLklTdWJuZXQ7XG5cbiAgLyoqXG4gICAqIFRoZSBWUEMgdG8gY29ubmVjdCB0byByZXNvdXJjZXMgd2l0aGluLiBXaGVuIHByb3ZpZGVkLCB0aGUgQ0RLIHNlbGVjdHMgYVxuICAgKiBzdWJuZXQgZnJvbSB0aGlzIFZQQyB1c2luZyBgdnBjU3VibmV0c2AuIEEgR2x1ZSBjb25uZWN0aW9uIHRhcmdldHMgYSBzaW5nbGVcbiAgICogc3VibmV0LCBzbyB0aGUgZmlyc3Qgc3VibmV0IG9mIHRoZSBzZWxlY3Rpb24gaXMgdXNlZC5cbiAgICpcbiAgICogTXV0dWFsbHkgZXhjbHVzaXZlIHdpdGggYHN1Ym5ldGAuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gVlBDLCB0aGUgc3VibmV0IGlzIHRha2VuIGZyb20gYHN1Ym5ldGAgaWYgcHJvdmlkZWRcbiAgICovXG4gIHJlYWRvbmx5IHZwYz86IGVjMi5JVnBjO1xuXG4gIC8qKlxuICAgKiBXaGljaCBzdWJuZXRzIG9mIGB2cGNgIHRvIHNlbGVjdCB0aGUgY29ubmVjdGlvbiBzdWJuZXQgZnJvbS4gT25seSB1c2VkIHdoZW5cbiAgICogYHZwY2AgaXMgcHJvdmlkZWQuIFNpbmNlIGEgR2x1ZSBjb25uZWN0aW9uIHRhcmdldHMgYSBzaW5nbGUgc3VibmV0LCB0aGVcbiAgICogZmlyc3Qgc3VibmV0IG9mIHRoZSBzZWxlY3Rpb24gaXMgdXNlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBwcml2YXRlIHN1Ym5ldHNcbiAgICovXG4gIHJlYWRvbmx5IHZwY1N1Ym5ldHM/OiBlYzIuU3VibmV0U2VsZWN0aW9uO1xufVxuXG4vKipcbiAqIENvbnN0cnVjdGlvbiBwcm9wZXJ0aWVzIGZvciBgQ29ubmVjdGlvbmBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb25uZWN0aW9uUHJvcHMgZXh0ZW5kcyBDb25uZWN0aW9uT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiB0aGUgY29ubmVjdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgdHlwZTogQ29ubmVjdGlvblR5cGU7XG59XG5cbi8qKlxuICogQW4gQVdTIEdsdWUgY29ubmVjdGlvbiB0byBhIGRhdGEgc291cmNlLlxuICovXG5AcHJvcGVydHlJbmplY3RhYmxlXG5leHBvcnQgY2xhc3MgQ29ubmVjdGlvbiBleHRlbmRzIGNkay5SZXNvdXJjZSBpbXBsZW1lbnRzIElDb25uZWN0aW9uIHtcbiAgLyoqIFVuaXF1ZWx5IGlkZW50aWZpZXMgdGhpcyBjbGFzcy4gKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBQUk9QRVJUWV9JTkpFQ1RJT05fSUQ6IHN0cmluZyA9ICdAYXdzLWNkay5hd3MtZ2x1ZS1hbHBoYS5Db25uZWN0aW9uJztcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIENvbm5lY3Rpb24gY29uc3RydWN0IHRoYXQgcmVwcmVzZW50cyBhbiBleHRlcm5hbCBjb25uZWN0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gc2NvcGUgVGhlIHNjb3BlIGNyZWF0aW5nIGNvbnN0cnVjdCAodXN1YWxseSBgdGhpc2ApLlxuICAgKiBAcGFyYW0gaWQgVGhlIGNvbnN0cnVjdCdzIGlkLlxuICAgKiBAcGFyYW0gY29ubmVjdGlvbkFybiBhcm4gb2YgZXh0ZXJuYWwgY29ubmVjdGlvbi5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbUNvbm5lY3Rpb25Bcm4oc2NvcGU6IGNvbnN0cnVjdHMuQ29uc3RydWN0LCBpZDogc3RyaW5nLCBjb25uZWN0aW9uQXJuOiBzdHJpbmcpOiBJQ29ubmVjdGlvbiB7XG4gICAgY2xhc3MgSW1wb3J0IGV4dGVuZHMgY2RrLlJlc291cmNlIGltcGxlbWVudHMgSUNvbm5lY3Rpb24ge1xuICAgICAgcHVibGljIHJlYWRvbmx5IGNvbm5lY3Rpb25OYW1lID0gY2RrLkFybi5leHRyYWN0UmVzb3VyY2VOYW1lKGNvbm5lY3Rpb25Bcm4sICdjb25uZWN0aW9uJyk7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgY29ubmVjdGlvbkFybiA9IGNvbm5lY3Rpb25Bcm47XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBJbXBvcnQoc2NvcGUsIGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgQ29ubmVjdGlvbiBjb25zdHJ1Y3QgdGhhdCByZXByZXNlbnRzIGFuIGV4dGVybmFsIGNvbm5lY3Rpb24uXG4gICAqXG4gICAqIEBwYXJhbSBzY29wZSBUaGUgc2NvcGUgY3JlYXRpbmcgY29uc3RydWN0ICh1c3VhbGx5IGB0aGlzYCkuXG4gICAqIEBwYXJhbSBpZCBUaGUgY29uc3RydWN0J3MgaWQuXG4gICAqIEBwYXJhbSBjb25uZWN0aW9uTmFtZSBuYW1lIG9mIGV4dGVybmFsIGNvbm5lY3Rpb24uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21Db25uZWN0aW9uTmFtZShzY29wZTogY29uc3RydWN0cy5Db25zdHJ1Y3QsIGlkOiBzdHJpbmcsIGNvbm5lY3Rpb25OYW1lOiBzdHJpbmcpOiBJQ29ubmVjdGlvbiB7XG4gICAgY2xhc3MgSW1wb3J0IGV4dGVuZHMgY2RrLlJlc291cmNlIGltcGxlbWVudHMgSUNvbm5lY3Rpb24ge1xuICAgICAgcHVibGljIHJlYWRvbmx5IGNvbm5lY3Rpb25OYW1lID0gY29ubmVjdGlvbk5hbWU7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgY29ubmVjdGlvbkFybiA9IENvbm5lY3Rpb24uYnVpbGRDb25uZWN0aW9uQXJuKHNjb3BlLCBjb25uZWN0aW9uTmFtZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBJbXBvcnQoc2NvcGUsIGlkKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGJ1aWxkQ29ubmVjdGlvbkFybihzY29wZTogY29uc3RydWN0cy5Db25zdHJ1Y3QsIGNvbm5lY3Rpb25OYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBjZGsuU3RhY2sub2Yoc2NvcGUpLmZvcm1hdEFybih7XG4gICAgICBzZXJ2aWNlOiAnZ2x1ZScsXG4gICAgICByZXNvdXJjZTogJ2Nvbm5lY3Rpb24nLFxuICAgICAgcmVzb3VyY2VOYW1lOiBjb25uZWN0aW9uTmFtZSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgcHJvcGVydGllczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcbiAgcHJpdmF0ZSByZWFkb25seSByZXNvdXJjZTogQ2ZuQ29ubmVjdGlvbjtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogY29uc3RydWN0cy5Db25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBDb25uZWN0aW9uUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHtcbiAgICAgIHBoeXNpY2FsTmFtZTogcHJvcHMuY29ubmVjdGlvbk5hbWUsXG4gICAgfSk7XG4gICAgLy8gRW5oYW5jZWQgQ0RLIEFuYWx5dGljcyBUZWxlbWV0cnlcbiAgICBhZGRDb25zdHJ1Y3RNZXRhZGF0YSh0aGlzLCBwcm9wcyk7XG5cbiAgICB0aGlzLnByb3BlcnRpZXMgPSBwcm9wcy5wcm9wZXJ0aWVzIHx8IHt9O1xuXG4gICAgY29uc3Qgc3VibmV0ID0gdGhpcy5yZXNvbHZlU3VibmV0KHByb3BzKTtcblxuICAgIGNvbnN0IHBoeXNpY2FsQ29ubmVjdGlvblJlcXVpcmVtZW50cyA9IHN1Ym5ldCB8fCBwcm9wcy5zZWN1cml0eUdyb3VwcyA/IHtcbiAgICAgIGF2YWlsYWJpbGl0eVpvbmU6IHN1Ym5ldCA/IHN1Ym5ldC5hdmFpbGFiaWxpdHlab25lIDogdW5kZWZpbmVkLFxuICAgICAgc3VibmV0SWQ6IHN1Ym5ldCA/IHN1Ym5ldC5zdWJuZXRJZCA6IHVuZGVmaW5lZCxcbiAgICAgIHNlY3VyaXR5R3JvdXBJZExpc3Q6IHByb3BzLnNlY3VyaXR5R3JvdXBzID8gcHJvcHMuc2VjdXJpdHlHcm91cHMubWFwKHNnID0+IHNnLnNlY3VyaXR5R3JvdXBJZCkgOiB1bmRlZmluZWQsXG4gICAgfSA6IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IHNlY3JldElkID0gcHJvcHMuc2VjcmV0Py5zZWNyZXRSZWYuc2VjcmV0SWQ7XG5cbiAgICB0aGlzLnJlc291cmNlID0gbmV3IENmbkNvbm5lY3Rpb24odGhpcywgJ1Jlc291cmNlJywge1xuICAgICAgY2F0YWxvZ0lkOiBjZGsuU3RhY2sub2YodGhpcykuYWNjb3VudCxcbiAgICAgIGNvbm5lY3Rpb25JbnB1dDoge1xuICAgICAgICBjb25uZWN0aW9uUHJvcGVydGllczogY2RrLkxhenkuYW55KHtcbiAgICAgICAgICBwcm9kdWNlOiAoKSA9PiB7XG4gICAgICAgICAgICAvLyBJbnNwZWN0IHRoZSBmaW5hbCBwcm9wZXJ0eSBzZXQgYXQgc3ludGhlc2lzIHRpbWUgc28gcHJvcGVydGllc1xuICAgICAgICAgICAgLy8gYWRkZWQgdmlhIGBhZGRQcm9wZXJ0eWAgYXJlIGNvdmVyZWQgYXMgd2VsbCDigJQgYSBgU0VDUkVUX0lEYCBhZGRlZFxuICAgICAgICAgICAgLy8gYWZ0ZXIgY29uc3RydWN0aW9uIHdvdWxkIG90aGVyd2lzZSBiZSBzaWxlbnRseSBvdmVyd3JpdHRlbiBieSB0aGVcbiAgICAgICAgICAgIC8vIG9uZSBpbmplY3RlZCBmcm9tIGBzZWNyZXRgLlxuICAgICAgICAgICAgaWYgKHNlY3JldElkICE9PSB1bmRlZmluZWQgJiYgdGhpcy5wcm9wZXJ0aWVzLlNFQ1JFVF9JRCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBjZGsuVmFsaWRhdGlvbkVycm9yKGxpdGBDb25uZWN0aW9uU2VjcmV0Q29uZmxpY3RgLCAnY2Fubm90IHNldCBib3RoIGBzZWNyZXRgIGFuZCBhIGBTRUNSRVRfSURgIGNvbm5lY3Rpb24gcHJvcGVydHknLCB0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFRoZSBgU0VDUkVUX0lEYCBpbmplY3RlZCBmcm9tIGBzZWNyZXRgIGlzIGEgcmVmZXJlbmNlLCBub3QgYVxuICAgICAgICAgICAgLy8gY3JlZGVudGlhbCwgc28gaXQgaXMgbWVyZ2VkIGluIGFmdGVyIHRoaXMgc2Nhbi5cbiAgICAgICAgICAgIHdhcm5PblBsYWludGV4dFNlY3JldHMoXG4gICAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICAgIHRoaXMucHJvcGVydGllcyxcbiAgICAgICAgICAgICAgJ0Bhd3MtY2RrL2F3cy1nbHVlLWFscGhhOnBsYWludGV4dENvbm5lY3Rpb25TZWNyZXQnLFxuICAgICAgICAgICAgICAnUGFzcyBhIFNlY3JldHMgTWFuYWdlciBzZWNyZXQgdmlhIHRoZSBjb25uZWN0aW9uXFwncyBgc2VjcmV0YCBwcm9wZXJ0eSBpbnN0ZWFkLicsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29uc3QgcHJvcGVydGllcyA9IHNlY3JldElkICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgPyB7IC4uLnRoaXMucHJvcGVydGllcywgU0VDUkVUX0lEOiBzZWNyZXRJZCB9XG4gICAgICAgICAgICAgIDogdGhpcy5wcm9wZXJ0aWVzO1xuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHByb3BlcnRpZXMpLmxlbmd0aCA+IDAgPyBwcm9wZXJ0aWVzIDogdW5kZWZpbmVkO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0pLFxuICAgICAgICBjb25uZWN0aW9uVHlwZTogcHJvcHMudHlwZS5uYW1lLFxuICAgICAgICBkZXNjcmlwdGlvbjogcHJvcHMuZGVzY3JpcHRpb24sXG4gICAgICAgIG1hdGNoQ3JpdGVyaWE6IHByb3BzLm1hdGNoQ3JpdGVyaWEsXG4gICAgICAgIG5hbWU6IHByb3BzLmNvbm5lY3Rpb25OYW1lLFxuICAgICAgICBwaHlzaWNhbENvbm5lY3Rpb25SZXF1aXJlbWVudHMsXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgdGhlIHNpbmdsZSBzdWJuZXQgdGhlIGNvbm5lY3Rpb24gc2hvdWxkIHRhcmdldCwgZWl0aGVyIGZyb20gYW5cbiAgICogZXhwbGljaXQgYHN1Ym5ldGAgb3IgYnkgc2VsZWN0aW5nIG9uZSBmcm9tIGB2cGNgLlxuICAgKi9cbiAgcHJpdmF0ZSByZXNvbHZlU3VibmV0KHByb3BzOiBDb25uZWN0aW9uUHJvcHMpOiBlYzIuSVN1Ym5ldCB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHByb3BzLnN1Ym5ldCAmJiBwcm9wcy52cGMpIHtcbiAgICAgIHRocm93IG5ldyBjZGsuVmFsaWRhdGlvbkVycm9yKGxpdGBDb25uZWN0aW9uU3VibmV0Q29uZmxpY3RgLCAnY2Fubm90IHNwZWNpZnkgYm90aCBgc3VibmV0YCBhbmQgYHZwY2A7IHByb3ZpZGUgYHN1Ym5ldGAgZm9yIGEgc3BlY2lmaWMgc3VibmV0LCBvciBgdnBjYCAob3B0aW9uYWxseSB3aXRoIGB2cGNTdWJuZXRzYCkgdG8gbGV0IHRoZSBDREsgc2VsZWN0IG9uZScsIHRoaXMpO1xuICAgIH1cblxuICAgIGlmIChwcm9wcy52cGNTdWJuZXRzICYmICFwcm9wcy52cGMpIHtcbiAgICAgIHRocm93IG5ldyBjZGsuVmFsaWRhdGlvbkVycm9yKGxpdGBDb25uZWN0aW9uVnBjU3VibmV0c1dpdGhvdXRWcGNgLCAnYHZwY1N1Ym5ldHNgIGNhbiBvbmx5IGJlIHNwZWNpZmllZCB0b2dldGhlciB3aXRoIGB2cGNgJywgdGhpcyk7XG4gICAgfVxuXG4gICAgaWYgKHByb3BzLnN1Ym5ldCkge1xuICAgICAgcmV0dXJuIHByb3BzLnN1Ym5ldDtcbiAgICB9XG5cbiAgICBpZiAocHJvcHMudnBjKSB7XG4gICAgICAvLyBBIEdsdWUgY29ubmVjdGlvbiB0YXJnZXRzIGEgc2luZ2xlIHN1Ym5ldCwgc28gdXNlIHRoZSBmaXJzdCBzdWJuZXQgb2YgdGhlIHNlbGVjdGlvbi5cbiAgICAgIGNvbnN0IHNlbGVjdGVkID0gcHJvcHMudnBjLnNlbGVjdFN1Ym5ldHMocHJvcHMudnBjU3VibmV0cyk7XG4gICAgICAvLyBgaXNQZW5kaW5nTG9va3VwYCBpcyB0cnVlIGZvciBpbXBvcnRlZCBWUENzIHdob3NlIHN1Ym5ldHMgYXJlIG5vdCB5ZXRcbiAgICAgIC8vIHJlc29sdmVkIChlLmcuIGBmcm9tTG9va3VwYCksIHdoZXJlIGFuIGVtcHR5IHNlbGVjdGlvbiBpcyBleHBlY3RlZCBhbmRcbiAgICAgIC8vIHdpbGwgbWF0ZXJpYWxpemUgb24gYSBsYXRlciBzeW50aC4gT25seSBmYWlsIG9uIGEgZ2VudWluZWx5IGVtcHR5IHNlbGVjdGlvbi5cbiAgICAgIGlmICghc2VsZWN0ZWQuaXNQZW5kaW5nTG9va3VwICYmIHNlbGVjdGVkLnN1Ym5ldHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBjZGsuVmFsaWRhdGlvbkVycm9yKGxpdGBDb25uZWN0aW9uTm9TdWJuZXRzU2VsZWN0ZWRgLCAnYHZwY1N1Ym5ldHNgIHNlbGVjdGVkIG5vIHN1Ym5ldHMgZnJvbSB0aGUgcHJvdmlkZWQgYHZwY2A7IGFkanVzdCB0aGUgc2VsZWN0aW9uIG9yIHVzZSBgc3VibmV0YCB0byB0YXJnZXQgYSBzcGVjaWZpYyBzdWJuZXQnLCB0aGlzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzZWxlY3RlZC5zdWJuZXRzWzBdO1xuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGNvbm5lY3Rpb25cbiAgICovXG4gIEBtZW1vaXplZEdldHRlclxuICBwdWJsaWMgZ2V0IGNvbm5lY3Rpb25OYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UmVzb3VyY2VOYW1lQXR0cmlidXRlKHRoaXMucmVzb3VyY2UucmVmKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgQVJOIG9mIHRoZSBjb25uZWN0aW9uXG4gICAqL1xuICBAbWVtb2l6ZWRHZXR0ZXJcbiAgcHVibGljIGdldCBjb25uZWN0aW9uQXJuKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIENvbm5lY3Rpb24uYnVpbGRDb25uZWN0aW9uQXJuKHRoaXMsIHRoaXMuY29ubmVjdGlvbk5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhZGRpdGlvbmFsIGNvbm5lY3Rpb24gcGFyYW1ldGVyc1xuICAgKiBAcGFyYW0ga2V5IHBhcmFtZXRlciBrZXlcbiAgICogQHBhcmFtIHZhbHVlIHBhcmFtZXRlciB2YWx1ZVxuICAgKi9cbiAgQE1ldGhvZE1ldGFkYXRhKClcbiAgcHVibGljIGFkZFByb3BlcnR5KGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5wcm9wZXJ0aWVzW2tleV0gPSB2YWx1ZTtcbiAgfVxufVxuIl19