@aws-cdk/aws-glue-alpha 2.265.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 (51) hide show
  1. package/.jsii +982 -776
  2. package/.jsii.tabl.json.gz +0 -0
  3. package/.warnings.jsii.js +25 -91
  4. package/README.md +158 -72
  5. package/awslint.json +6 -1
  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.d.ts +2 -2
  11. package/lib/data-format.js +8 -8
  12. package/lib/data-quality-ruleset.d.ts +28 -3
  13. package/lib/data-quality-ruleset.js +37 -5
  14. package/lib/database.d.ts +1 -1
  15. package/lib/database.js +2 -2
  16. package/lib/external-table.js +6 -4
  17. package/lib/index.d.ts +0 -1
  18. package/lib/index.js +1 -2
  19. package/lib/jobs/job.d.ts +1 -24
  20. package/lib/jobs/job.js +3 -3
  21. package/lib/jobs/pyspark-etl-job.d.ts +2 -1
  22. package/lib/jobs/pyspark-etl-job.js +10 -5
  23. package/lib/jobs/pyspark-flex-etl-job.d.ts +3 -2
  24. package/lib/jobs/pyspark-flex-etl-job.js +7 -6
  25. package/lib/jobs/pyspark-streaming-job.d.ts +2 -1
  26. package/lib/jobs/pyspark-streaming-job.js +6 -5
  27. package/lib/jobs/python-shell-job.js +1 -1
  28. package/lib/jobs/ray-job.d.ts +8 -0
  29. package/lib/jobs/ray-job.js +3 -7
  30. package/lib/jobs/scala-spark-etl-job.js +4 -8
  31. package/lib/jobs/scala-spark-flex-etl-job.js +4 -4
  32. package/lib/jobs/scala-spark-streaming-job.js +4 -8
  33. package/lib/jobs/spark-job.d.ts +26 -0
  34. package/lib/jobs/spark-job.js +2 -2
  35. package/lib/partition-projection.d.ts +8 -8
  36. package/lib/partition-projection.js +49 -2
  37. package/lib/s3-table.d.ts +83 -39
  38. package/lib/s3-table.js +136 -86
  39. package/lib/schema.d.ts +26 -6
  40. package/lib/schema.js +74 -82
  41. package/lib/security-configuration.d.ts +41 -47
  42. package/lib/security-configuration.js +83 -25
  43. package/lib/storage-parameter.d.ts +14 -3
  44. package/lib/storage-parameter.js +16 -6
  45. package/lib/table-base.d.ts +34 -1
  46. package/lib/table-base.js +33 -2
  47. package/lib/triggers/trigger-options.js +1 -1
  48. package/lib/triggers/workflow.js +2 -2
  49. package/package.json +7 -7
  50. package/lib/table-deprecated.d.ts +0 -13
  51. package/lib/table-deprecated.js +0 -70
package/lib/s3-table.js CHANGED
@@ -67,7 +67,7 @@ var __importStar = (this && this.__importStar) || (function () {
67
67
  };
68
68
  })();
69
69
  Object.defineProperty(exports, "__esModule", { value: true });
70
- exports.S3Table = exports.TableEncryption = void 0;
70
+ exports.S3Table = exports.TableClientSideEncryption = exports.S3TableStorage = exports.S3TableEncryption = void 0;
71
71
  const jsiiDeprecationWarnings = require("../.warnings.jsii.js");
72
72
  const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
73
73
  const aws_cdk_lib_1 = require("aws-cdk-lib");
@@ -79,35 +79,122 @@ const metadata_resource_1 = require("aws-cdk-lib/core/lib/metadata-resource");
79
79
  const prop_injectable_1 = require("aws-cdk-lib/core/lib/prop-injectable");
80
80
  const table_base_1 = require("./table-base");
81
81
  /**
82
- * Encryption options for a Table.
82
+ * Server-side encryption for the S3 bucket that a managed `S3Table` creates.
83
83
  *
84
- * @see https://docs.aws.amazon.com/athena/latest/ug/encryption.html
84
+ * Applies only when the table manages its own bucket (via
85
+ * `S3TableStorage.managedBucket`). An existing bucket keeps whatever encryption
86
+ * it was created with.
85
87
  */
86
- var TableEncryption;
87
- (function (TableEncryption) {
88
+ class S3TableEncryption {
89
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.S3TableEncryption", version: "2.267.0-alpha.0" };
88
90
  /**
89
- * Server side encryption (SSE) with an Amazon S3-managed key.
91
+ * Server-side encryption (SSE-S3) with an Amazon S3-managed key.
92
+ */
93
+ static s3Managed() {
94
+ return new S3TableEncryption(s3.BucketEncryption.S3_MANAGED);
95
+ }
96
+ /**
97
+ * Server-side encryption (SSE-KMS) with an AWS KMS key managed by the account owner.
90
98
  *
91
- * @see https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingServerSideEncryption.html
99
+ * @param key the KMS key used to encrypt the data. A key is created if one is not provided.
100
+ */
101
+ static kms(key) {
102
+ return new S3TableEncryption(s3.BucketEncryption.KMS, key);
103
+ }
104
+ /**
105
+ * Server-side encryption (SSE-KMS) with an AWS KMS key managed by the KMS service.
92
106
  */
93
- TableEncryption["S3_MANAGED"] = "SSE-S3";
107
+ static kmsManaged() {
108
+ return new S3TableEncryption(s3.BucketEncryption.KMS_MANAGED);
109
+ }
110
+ /** @internal */
111
+ _bucketEncryption;
112
+ /** @internal */
113
+ _kmsKey;
114
+ constructor(bucketEncryption, kmsKey) {
115
+ this._bucketEncryption = bucketEncryption;
116
+ this._kmsKey = kmsKey;
117
+ }
118
+ }
119
+ exports.S3TableEncryption = S3TableEncryption;
120
+ /**
121
+ * Where an `S3Table` stores its data.
122
+ *
123
+ * The two paths are mutually exclusive: a managed bucket may specify its
124
+ * server-side encryption, while an existing bucket keeps its own encryption — so
125
+ * an encryption choice can never be paired with a bring-your-own bucket.
126
+ */
127
+ class S3TableStorage {
128
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.S3TableStorage", version: "2.267.0-alpha.0" };
94
129
  /**
95
- * Server-side encryption (SSE) with an AWS KMS key managed by the account owner.
130
+ * Store the table's data in a bucket created and managed by the table.
96
131
  *
97
- * @see https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingKMSEncryption.html
132
+ * @param encryption the server-side encryption for the created bucket.
133
+ * @default - S3-managed (SSE-S3) encryption
98
134
  */
99
- TableEncryption["KMS"] = "SSE-KMS";
135
+ static managedBucket(encryption) {
136
+ try {
137
+ jsiiDeprecationWarnings._aws_cdk_aws_glue_alpha_S3TableEncryption(encryption);
138
+ }
139
+ catch (error) {
140
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
141
+ Error.captureStackTrace(error, this.managedBucket);
142
+ }
143
+ throw error;
144
+ }
145
+ return new S3TableStorage(undefined, encryption);
146
+ }
100
147
  /**
101
- * Server-side encryption (SSE) with an AWS KMS key managed by the KMS service.
148
+ * Store the table's data in an existing bucket. CDK does not manage the
149
+ * bucket's encryption.
150
+ *
151
+ * The bucket can be one you don't own, imported with
152
+ * `Bucket.fromBucketArn()` or `Bucket.fromBucketAttributes()`. If that bucket
153
+ * is KMS-encrypted, import it with `Bucket.fromBucketAttributes()` and supply
154
+ * the `encryptionKey` attribute. Otherwise, CDK has no reference to the key,
155
+ * which means that `S3Table.grantRead()`/`grantWrite()` will correctly grant
156
+ * S3 access but silently skip the KMS permissions on the key. As a consequence,
157
+ * at runtime, reads and writes will fail with access denied on the key.
158
+ *
159
+ * @param bucket the bucket that holds the table's data.
102
160
  */
103
- TableEncryption["KMS_MANAGED"] = "SSE-KMS-MANAGED";
161
+ static fromBucket(bucket) {
162
+ return new S3TableStorage(bucket, undefined);
163
+ }
164
+ /** @internal */
165
+ _bucket;
166
+ /** @internal */
167
+ _encryption;
168
+ constructor(bucket, encryption) {
169
+ this._bucket = bucket;
170
+ this._encryption = encryption;
171
+ }
172
+ }
173
+ exports.S3TableStorage = S3TableStorage;
174
+ /**
175
+ * Client-side encryption for an `S3Table`'s data.
176
+ *
177
+ * Independent of the bucket's server-side encryption and of who owns the bucket:
178
+ * the data is encrypted by the client before it is written to S3. When set, the
179
+ * `grant*` methods also grant the relevant KMS permissions on the key.
180
+ */
181
+ class TableClientSideEncryption {
182
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.TableClientSideEncryption", version: "2.267.0-alpha.0" };
104
183
  /**
105
- * Client-side encryption (CSE) with an AWS KMS key managed by the account owner.
184
+ * Client-side encryption (CSE-KMS) with an AWS KMS key managed by the account owner.
106
185
  *
107
- * @see https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingClientSideEncryption.html
186
+ * @param key the KMS key used to encrypt the data. A key is created if one is not provided.
108
187
  */
109
- TableEncryption["CLIENT_SIDE_KMS"] = "CSE-KMS";
110
- })(TableEncryption || (exports.TableEncryption = TableEncryption = {}));
188
+ static kms(key) {
189
+ return new TableClientSideEncryption(key);
190
+ }
191
+ /** @internal */
192
+ _kmsKey;
193
+ constructor(kmsKey) {
194
+ this._kmsKey = kmsKey;
195
+ }
196
+ }
197
+ exports.TableClientSideEncryption = TableClientSideEncryption;
111
198
  /**
112
199
  * A Glue table that targets a S3 dataset.
113
200
  * @resource AWS::Glue::Table
@@ -142,7 +229,7 @@ let S3Table = (() => {
142
229
  S3Table = _classThis = _classDescriptor.value;
143
230
  if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
144
231
  }
145
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.S3Table", version: "2.265.0-alpha.0" };
232
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.S3Table", version: "2.267.0-alpha.0" };
146
233
  /** Uniquely identifies this class. */
147
234
  static PROPERTY_INJECTION_ID = '@aws-cdk.aws-glue-alpha.S3Table';
148
235
  resource = __runInitializers(this, _instanceExtraInitializers);
@@ -155,13 +242,12 @@ let S3Table = (() => {
155
242
  */
156
243
  s3Prefix;
157
244
  /**
158
- * The type of encryption enabled for the table.
159
- */
160
- encryption;
161
- /**
162
- * The KMS key used to secure the data if `encryption` is set to `CSE-KMS` or `SSE-KMS`. Otherwise, `undefined`.
245
+ * The KMS key used for client-side encryption of the table's data, if
246
+ * `clientSideEncryption` was configured. Otherwise, `undefined`.
247
+ *
248
+ * For server-side (bucket) encryption, read `bucket.encryptionKey` instead.
163
249
  */
164
- encryptionKey;
250
+ clientSideEncryptionKey;
165
251
  /**
166
252
  * This table's partition indexes.
167
253
  */
@@ -187,11 +273,14 @@ let S3Table = (() => {
187
273
  // Enhanced CDK Analytics Telemetry
188
274
  (0, metadata_resource_1.addConstructMetadata)(this, props);
189
275
  this.s3Prefix = props.s3Prefix ?? '';
190
- this.userProvidedBucket = props.bucket !== undefined;
191
- const { bucket, encryption, encryptionKey } = createBucket(this, props);
192
- this.bucket = bucket;
193
- this.encryption = encryption;
194
- this.encryptionKey = encryptionKey;
276
+ const storage = props.storage ?? S3TableStorage.managedBucket();
277
+ this.userProvidedBucket = storage._bucket !== undefined;
278
+ this.bucket = storage._bucket ?? this.createManagedBucket(storage._encryption);
279
+ if (props.clientSideEncryption) {
280
+ // CSE-KMS: use the provided key or create one automatically. The bucket's
281
+ // own server-side encryption is independent and comes from `storage`.
282
+ this.clientSideEncryptionKey = props.clientSideEncryption._kmsKey ?? new kms.Key(this, 'Key');
283
+ }
195
284
  this.resource = new aws_glue_1.CfnTable(this, 'Table', {
196
285
  catalogId: props.database.catalog.catalogId,
197
286
  databaseName: props.database.databaseName,
@@ -201,9 +290,11 @@ let S3Table = (() => {
201
290
  partitionKeys: renderColumns(props.partitionKeys),
202
291
  parameters: {
203
292
  'classification': props.dataFormat.classificationString?.value,
204
- 'has_encrypted_data': true,
205
293
  'partition_filtering.enabled': props.enablePartitionFiltering,
206
294
  ...this.parameters,
295
+ // Managed keys are emitted last so free-form `parameters` cannot
296
+ // silently override them. Conflicts are rejected in `TableBase`.
297
+ 'has_encrypted_data': this.hasEncryptedData,
207
298
  },
208
299
  storageDescriptor: {
209
300
  location: `s3://${this.bucket.bucketName}/${this.s3Prefix}`,
@@ -259,8 +350,8 @@ let S3Table = (() => {
259
350
  */
260
351
  grantRead(grantee) {
261
352
  const ret = this.grant(grantee, readPermissions);
262
- if (this.encryptionKey && this.encryption === TableEncryption.CLIENT_SIDE_KMS) {
263
- this.encryptionKey.grantDecrypt(grantee);
353
+ if (this.clientSideEncryptionKey) {
354
+ this.clientSideEncryptionKey.grantDecrypt(grantee);
264
355
  }
265
356
  this.bucket.grantRead(grantee, this.generateS3PrefixForGrant());
266
357
  return ret;
@@ -273,8 +364,8 @@ let S3Table = (() => {
273
364
  */
274
365
  grantWrite(grantee) {
275
366
  const ret = this.grant(grantee, writePermissions);
276
- if (this.encryptionKey && this.encryption === TableEncryption.CLIENT_SIDE_KMS) {
277
- this.encryptionKey.grantEncrypt(grantee);
367
+ if (this.clientSideEncryptionKey) {
368
+ this.clientSideEncryptionKey.grantEncrypt(grantee);
278
369
  }
279
370
  this.bucket.grantWrite(grantee, this.generateS3PrefixForGrant());
280
371
  return ret;
@@ -287,8 +378,8 @@ let S3Table = (() => {
287
378
  */
288
379
  grantReadWrite(grantee) {
289
380
  const ret = this.grant(grantee, [...readPermissions, ...writePermissions]);
290
- if (this.encryptionKey && this.encryption === TableEncryption.CLIENT_SIDE_KMS) {
291
- this.encryptionKey.grantEncryptDecrypt(grantee);
381
+ if (this.clientSideEncryptionKey) {
382
+ this.clientSideEncryptionKey.grantEncryptDecrypt(grantee);
292
383
  }
293
384
  this.bucket.grantReadWrite(grantee, this.generateS3PrefixForGrant());
294
385
  return ret;
@@ -304,6 +395,14 @@ let S3Table = (() => {
304
395
  }
305
396
  return this.s3Prefix + '*';
306
397
  }
398
+ createManagedBucket(encryption) {
399
+ const enc = encryption ?? S3TableEncryption.s3Managed();
400
+ return new s3.Bucket(this, 'Bucket', {
401
+ encryption: enc._bucketEncryption,
402
+ encryptionKey: enc._kmsKey,
403
+ enforceSSL: true,
404
+ });
405
+ }
307
406
  static {
308
407
  __runInitializers(_classThis, _classExtraInitializers);
309
408
  }
@@ -327,55 +426,6 @@ const writePermissions = [
327
426
  'glue:DeletePartition',
328
427
  'glue:UpdatePartition',
329
428
  ];
330
- // map TableEncryption to bucket's SSE configuration (s3.BucketEncryption)
331
- const encryptionMappings = {
332
- [TableEncryption.S3_MANAGED]: s3.BucketEncryption.S3_MANAGED,
333
- [TableEncryption.KMS_MANAGED]: s3.BucketEncryption.KMS_MANAGED,
334
- [TableEncryption.KMS]: s3.BucketEncryption.KMS,
335
- [TableEncryption.CLIENT_SIDE_KMS]: s3.BucketEncryption.S3_MANAGED,
336
- };
337
- // create the bucket to store a table's data depending on the `encryption` and `encryptionKey` properties.
338
- function createBucket(table, props) {
339
- let bucket = props.bucket;
340
- if (bucket && (props.encryption !== undefined && props.encryption !== TableEncryption.CLIENT_SIDE_KMS)) {
341
- throw new aws_cdk_lib_1.UnscopedValidationError((0, helpers_internal_1.lit) `EncryptionWithProvidedBucket`, 'you can not specify encryption settings if you also provide a bucket');
342
- }
343
- const encryption = props.encryption || TableEncryption.S3_MANAGED;
344
- let encryptionKey;
345
- if (encryption === TableEncryption.CLIENT_SIDE_KMS && props.encryptionKey === undefined) {
346
- // CSE-KMS should behave the same as SSE-KMS - use the provided key or create one automatically
347
- // Since Bucket only knows about SSE, we repeat the logic for CSE-KMS at the Table level.
348
- encryptionKey = new kms.Key(table, 'Key');
349
- }
350
- else {
351
- encryptionKey = props.encryptionKey;
352
- }
353
- // create the bucket if none was provided
354
- if (!bucket) {
355
- if (encryption === TableEncryption.CLIENT_SIDE_KMS) {
356
- // The `encryptionKey` here is used for client-side encryption (granted to
357
- // principals via the grant* methods), not for the bucket's SSE. The bucket
358
- // still gets server-side encryption at rest as defense in depth.
359
- bucket = new s3.Bucket(table, 'Bucket', {
360
- encryption: encryptionMappings[encryption],
361
- enforceSSL: true,
362
- });
363
- }
364
- else {
365
- bucket = new s3.Bucket(table, 'Bucket', {
366
- encryption: encryptionMappings[encryption],
367
- encryptionKey,
368
- enforceSSL: true,
369
- });
370
- encryptionKey = bucket.encryptionKey;
371
- }
372
- }
373
- return {
374
- bucket,
375
- encryption,
376
- encryptionKey,
377
- };
378
- }
379
429
  function renderColumns(columns) {
380
430
  if (columns === undefined) {
381
431
  return undefined;
@@ -388,4 +438,4 @@ function renderColumns(columns) {
388
438
  };
389
439
  });
390
440
  }
391
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiczMtdGFibGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJzMy10YWJsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSw2Q0FBb0Y7QUFDcEYsbURBQWdEO0FBRWhELHlEQUEyQztBQUMzQyx1REFBeUM7QUFDekMsNEVBQTRFO0FBQzVFLDhFQUE4RjtBQUM5RiwwRUFBMEU7QUFJMUUsNkNBQXlDO0FBRXpDOzs7O0dBSUc7QUFDSCxJQUFZLGVBMEJYO0FBMUJELFdBQVksZUFBZTtJQUN6Qjs7OztPQUlHO0lBQ0gsd0NBQXFCLENBQUE7SUFFckI7Ozs7T0FJRztJQUNILGtDQUFlLENBQUE7SUFFZjs7T0FFRztJQUNILGtEQUErQixDQUFBO0lBRS9COzs7O09BSUc7SUFDSCw4Q0FBMkIsQ0FBQTtBQUM3QixDQUFDLEVBMUJXLGVBQWUsK0JBQWYsZUFBZSxRQTBCMUI7QUEyQ0Q7OztHQUdHO0lBRVUsT0FBTzs0QkFEbkIsb0NBQWtCOzs7O3NCQUNVLHNCQUFTOzs7Ozs7O3VCQUFqQixTQUFRLFdBQVM7Ozs7eUNBeUduQyxpQ0FBYzt3Q0FRZCxpQ0FBYztxQ0FlZCxJQUFBLGtDQUFjLEdBQUU7c0NBY2hCLElBQUEsa0NBQWMsR0FBRTswQ0FjaEIsSUFBQSxrQ0FBYyxHQUFFO1lBbERqQixrTEFBVyxTQUFTLDZEQUVuQjtZQU1ELCtLQUFXLFFBQVEsNkRBTWxCO1lBU0QsOEtBQU8sU0FBUyw2REFLZjtZQVNELGlMQUFPLFVBQVUsNkRBS2hCO1lBU0QsNkxBQU8sY0FBYyw2REFLcEI7WUFsS0gsNktBa0xDOzs7OztRQWpMQyxzQ0FBc0M7UUFDL0IsTUFBTSxDQUFVLHFCQUFxQixHQUFXLGlDQUFpQyxDQUFDO1FBRWpGLFFBQVEsR0FKTCxtREFBTyxDQUlTO1FBRTNCOztXQUVHO1FBQ2EsTUFBTSxDQUFhO1FBRW5DOztX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QUNOLE1BQU0sR0FBRyxJQUFJLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRTtnQkFDdEMsVUFBVSxFQUFFLGtCQUFrQixDQUFDLFVBQVUsQ0FBQztnQkFDMUMsYUFBYTtnQkFDYixVQUFVLEVBQUUsSUFBSTthQUNqQixDQUFDLENBQUM7WUFDSCxhQUFhLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQztRQUN2QyxDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU87UUFDTCxNQUFNO1FBQ04sVUFBVTtRQUNWLGFBQWE7S0FDZCxDQUFDO0FBQ0osQ0FBQztBQUVELFNBQVMsYUFBYSxDQUFDLE9BQWdDO0lBQ3JELElBQUksT0FBTyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQzFCLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFDRCxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUU7UUFDMUIsT0FBTztZQUNMLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSTtZQUNqQixJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXO1lBQzdCLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTztTQUN4QixDQUFDO0lBQ0osQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQW5ub3RhdGlvbnMsIFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yLCBWYWxpZGF0aW9uRXJyb3IgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBDZm5UYWJsZSB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1nbHVlJztcbmltcG9ydCB0eXBlICogYXMgaWFtIGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xuaW1wb3J0ICogYXMga21zIGZyb20gJ2F3cy1jZGstbGliL2F3cy1rbXMnO1xuaW1wb3J0ICogYXMgczMgZnJvbSAnYXdzLWNkay1saWIvYXdzLXMzJztcbmltcG9ydCB7IG1lbW9pemVkR2V0dGVyLCBsaXQgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlL2xpYi9oZWxwZXJzLWludGVybmFsJztcbmltcG9ydCB7IGFkZENvbnN0cnVjdE1ldGFkYXRhLCBNZXRob2RNZXRhZGF0YSB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUvbGliL21ldGFkYXRhLXJlc291cmNlJztcbmltcG9ydCB7IHByb3BlcnR5SW5qZWN0YWJsZSB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUvbGliL3Byb3AtaW5qZWN0YWJsZSc7XG5pbXBvcnQgdHlwZSB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHR5cGUgeyBDb2x1bW4gfSBmcm9tICcuL3NjaGVtYSc7XG5pbXBvcnQgdHlwZSB7IFBhcnRpdGlvbkluZGV4LCBUYWJsZUJhc2VQcm9wcyB9IGZyb20gJy4vdGFibGUtYmFzZSc7XG5pbXBvcnQgeyBUYWJsZUJhc2UgfSBmcm9tICcuL3RhYmxlLWJhc2UnO1xuXG4vKipcbiAqIEVuY3J5cHRpb24gb3B0aW9ucyBmb3IgYSBUYWJsZS5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hdGhlbmEvbGF0ZXN0L3VnL2VuY3J5cHRpb24uaHRtbFxuICovXG5leHBvcnQgZW51bSBUYWJsZUVuY3J5cHRpb24ge1xuICAvKipcbiAgICogU2VydmVyIHNpZGUgZW5jcnlwdGlvbiAoU1NFKSB3aXRoIGFuIEFtYXpvbiBTMy1tYW5hZ2VkIGtleS5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L2Rldi9Vc2luZ1NlcnZlclNpZGVFbmNyeXB0aW9uLmh0bWxcbiAgICovXG4gIFMzX01BTkFHRUQgPSAnU1NFLVMzJyxcblxuICAvKipcbiAgICogU2VydmVyLXNpZGUgZW5jcnlwdGlvbiAoU1NFKSB3aXRoIGFuIEFXUyBLTVMga2V5IG1hbmFnZWQgYnkgdGhlIGFjY291bnQgb3duZXIuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC9kZXYvVXNpbmdLTVNFbmNyeXB0aW9uLmh0bWxcbiAgICovXG4gIEtNUyA9ICdTU0UtS01TJyxcblxuICAvKipcbiAgICogU2VydmVyLXNpZGUgZW5jcnlwdGlvbiAoU1NFKSB3aXRoIGFuIEFXUyBLTVMga2V5IG1hbmFnZWQgYnkgdGhlIEtNUyBzZXJ2aWNlLlxuICAgKi9cbiAgS01TX01BTkFHRUQgPSAnU1NFLUtNUy1NQU5BR0VEJyxcblxuICAvKipcbiAgICogQ2xpZW50LXNpZGUgZW5jcnlwdGlvbiAoQ1NFKSB3aXRoIGFuIEFXUyBLTVMga2V5IG1hbmFnZWQgYnkgdGhlIGFjY291bnQgb3duZXIuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC9kZXYvVXNpbmdDbGllbnRTaWRlRW5jcnlwdGlvbi5odG1sXG4gICAqL1xuICBDTElFTlRfU0lERV9LTVMgPSAnQ1NFLUtNUycsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUzNUYWJsZVByb3BzIGV4dGVuZHMgVGFibGVCYXNlUHJvcHMge1xuICAvKipcbiAgICogUzMgYnVja2V0IGluIHdoaWNoIHRvIHN0b3JlIGRhdGEuXG4gICAqXG4gICAqIEBkZWZhdWx0IG9uZSBpcyBjcmVhdGVkIGZvciB5b3VcbiAgICovXG4gIHJlYWRvbmx5IGJ1Y2tldD86IHMzLklCdWNrZXQ7XG5cbiAgLyoqXG4gICAqIFMzIHByZWZpeCB1bmRlciB3aGljaCB0YWJsZSBvYmplY3RzIGFyZSBzdG9yZWQuXG4gICAqXG4gICAqIFdoZW4gdGhlIHRhYmxlIHNoYXJlcyBhIGJ1Y2tldCB3aXRoIG90aGVyIHRhYmxlcyBvciBjb25zdW1lcnMsIHNldCB0aGlzIHNvXG4gICAqIHRoYXQgdGhlIGBncmFudCpgIG1ldGhvZHMgc2NvcGUgUzMgYWNjZXNzIHRvIHRoaXMgdGFibGUncyBkYXRhLiBXaXRob3V0IGFcbiAgICogcHJlZml4LCB0aG9zZSBncmFudHMgY292ZXIgdGhlIGVudGlyZSBidWNrZXQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gcHJlZml4LiBUaGUgZGF0YSB3aWxsIGJlIHN0b3JlZCB1bmRlciB0aGUgcm9vdCBvZiB0aGUgYnVja2V0LlxuICAgKi9cbiAgcmVhZG9ubHkgczNQcmVmaXg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBraW5kIG9mIGVuY3J5cHRpb24gdG8gc2VjdXJlIHRoZSBkYXRhIHdpdGguXG4gICAqXG4gICAqIFlvdSBjYW4gb25seSBwcm92aWRlIHRoaXMgb3B0aW9uIGlmIHlvdSBhcmUgbm90IGV4cGxpY2l0bHkgcGFzc2luZyBpbiBhIGJ1Y2tldC5cbiAgICpcbiAgICogSWYgeW91IGNob29zZSBgU1NFLUtNU2AsIHlvdSAqY2FuKiBwcm92aWRlIGFuIHVuLW1hbmFnZWQgS01TIGtleSB3aXRoIGBlbmNyeXB0aW9uS2V5YC5cbiAgICogSWYgeW91IGNob29zZSBgQ1NFLUtNU2AsIHlvdSAqbXVzdCogcHJvdmlkZSBhbiB1bi1tYW5hZ2VkIEtNUyBrZXkgd2l0aCBgZW5jcnlwdGlvbktleWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IEJ1Y2tldEVuY3J5cHRpb24uUzNfTUFOQUdFRFxuICAgKi9cbiAgcmVhZG9ubHkgZW5jcnlwdGlvbj86IFRhYmxlRW5jcnlwdGlvbjtcblxuICAvKipcbiAgICogRXh0ZXJuYWwgS01TIGtleSB0byB1c2UgZm9yIGJ1Y2tldCBlbmNyeXB0aW9uLlxuICAgKlxuICAgKiBUaGUgYGVuY3J5cHRpb25gIHByb3BlcnR5IG11c3QgYmUgYFNTRS1LTVNgIG9yIGBDU0UtS01TYC5cbiAgICpcbiAgICogQGRlZmF1bHQga2V5IGlzIG1hbmFnZWQgYnkgS01TLlxuICAgKi9cbiAgcmVhZG9ubHkgZW5jcnlwdGlvbktleT86IGttcy5JS2V5O1xufVxuXG4vKipcbiAqIEEgR2x1ZSB0YWJsZSB0aGF0IHRhcmdldHMgYSBTMyBkYXRhc2V0LlxuICogQHJlc291cmNlIEFXUzo6R2x1ZTo6VGFibGVcbiAqL1xuQHByb3BlcnR5SW5qZWN0YWJsZVxuZXhwb3J0IGNsYXNzIFMzVGFibGUgZXh0ZW5kcyBUYWJsZUJhc2Uge1xuICAvKiogVW5pcXVlbHkgaWRlbnRpZmllcyB0aGlzIGNsYXNzLiAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFBST1BFUlRZX0lOSkVDVElPTl9JRDogc3RyaW5nID0gJ0Bhd3MtY2RrLmF3cy1nbHVlLWFscGhhLlMzVGFibGUnO1xuXG4gIHByaXZhdGUgcmVzb3VyY2U6IENmblRhYmxlO1xuXG4gIC8qKlxuICAgKiBTMyBidWNrZXQgaW4gd2hpY2ggdGhlIHRhYmxlJ3MgZGF0YSByZXNpZGVzLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGJ1Y2tldDogczMuSUJ1Y2tldDtcblxuICAvKipcbiAgICogUzMgS2V5IFByZWZpeCB1bmRlciB3aGljaCB0aGlzIHRhYmxlJ3MgZmlsZXMgYXJlIHN0b3JlZCBpbiBTMy5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBzM1ByZWZpeDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiBlbmNyeXB0aW9uIGVuYWJsZWQgZm9yIHRoZSB0YWJsZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBlbmNyeXB0aW9uOiBUYWJsZUVuY3J5cHRpb247XG5cbiAgLyoqXG4gICAqIFRoZSBLTVMga2V5IHVzZWQgdG8gc2VjdXJlIHRoZSBkYXRhIGlmIGBlbmNyeXB0aW9uYCBpcyBzZXQgdG8gYENTRS1LTVNgIG9yIGBTU0UtS01TYC4gT3RoZXJ3aXNlLCBgdW5kZWZpbmVkYC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBlbmNyeXB0aW9uS2V5Pzoga21zLklLZXk7XG5cbiAgLyoqXG4gICAqIFRoaXMgdGFibGUncyBwYXJ0aXRpb24gaW5kZXhlcy5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwYXJ0aXRpb25JbmRleGVzPzogUGFydGl0aW9uSW5kZXhbXTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgdGFibGVSZXNvdXJjZTogQ2ZuVGFibGU7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGRhdGEgYnVja2V0IHdhcyBzdXBwbGllZCBieSB0aGUgdXNlciAoYXMgb3Bwb3NlZCB0byBjcmVhdGVkIGJ5XG4gICAqIHRoaXMgY29uc3RydWN0KS4gQSB1c2VyLXN1cHBsaWVkIGJ1Y2tldCBtYXkgaG9sZCBkYXRhIGZvciBvdGhlciB0YWJsZXMsIHNvXG4gICAqIGdyYW50aW5nIGFjY2VzcyB0byB0aGUgd2hvbGUgYnVja2V0IGNhbiBvdmVyLWdyYW50LlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSB1c2VyUHJvdmlkZWRCdWNrZXQ6IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFMzVGFibGVQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwgcHJvcHMpO1xuICAgIC8vIEVuaGFuY2VkIENESyBBbmFseXRpY3MgVGVsZW1ldHJ5XG4gICAgYWRkQ29uc3RydWN0TWV0YWRhdGEodGhpcywgcHJvcHMpO1xuICAgIHRoaXMuczNQcmVmaXggPSBwcm9wcy5zM1ByZWZpeCA/PyAnJztcbiAgICB0aGlzLnVzZXJQcm92aWRlZEJ1Y2tldCA9IHByb3BzLmJ1Y2tldCAhPT0gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHsgYnVja2V0LCBlbmNyeXB0aW9uLCBlbmNyeXB0aW9uS2V5IH0gPSBjcmVhdGVCdWNrZXQodGhpcywgcHJvcHMpO1xuICAgIHRoaXMuYnVja2V0ID0gYnVja2V0O1xuICAgIHRoaXMuZW5jcnlwdGlvbiA9IGVuY3J5cHRpb247XG4gICAgdGhpcy5lbmNyeXB0aW9uS2V5ID0gZW5jcnlwdGlvbktleTtcblxuICAgIHRoaXMucmVzb3VyY2UgPSBuZXcgQ2ZuVGFibGUodGhpcywgJ1RhYmxlJywge1xuICAgICAgY2F0YWxvZ0lkOiBwcm9wcy5kYXRhYmFzZS5jYXRhbG9nLmNhdGFsb2dJZCxcblxuICAgICAgZGF0YWJhc2VOYW1lOiBwcm9wcy5kYXRhYmFzZS5kYXRhYmFzZU5hbWUsXG5cbiAgICAgIHRhYmxlSW5wdXQ6IHtcbiAgICAgICAgbmFtZTogdGhpcy5waHlzaWNhbE5hbWUsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBwcm9wcy5kZXNjcmlwdGlvbiB8fCBgJHt0aGlzLnBoeXNpY2FsTmFtZX0gZ2VuZXJhdGVkIGJ5IENES2AsXG5cbiAgICAgICAgcGFydGl0aW9uS2V5czogcmVuZGVyQ29sdW1ucyhwcm9wcy5wYXJ0aXRpb25LZXlzKSxcblxuICAgICAgICBwYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgJ2NsYXNzaWZpY2F0aW9uJzogcHJvcHMuZGF0YUZvcm1hdC5jbGFzc2lmaWNhdGlvblN0cmluZz8udmFsdWUsXG4gICAgICAgICAgJ2hhc19lbmNyeXB0ZWRfZGF0YSc6IHRydWUsXG4gICAgICAgICAgJ3BhcnRpdGlvbl9maWx0ZXJpbmcuZW5hYmxlZCc6IHByb3BzLmVuYWJsZVBhcnRpdGlvbkZpbHRlcmluZyxcbiAgICAgICAgICAuLi50aGlzLnBhcmFtZXRlcnMsXG4gICAgICAgIH0sXG4gICAgICAgIHN0b3JhZ2VEZXNjcmlwdG9yOiB7XG4gICAgICAgICAgbG9jYXRpb246IGBzMzovLyR7dGhpcy5idWNrZXQuYnVja2V0TmFtZX0vJHt0aGlzLnMzUHJlZml4fWAsXG4gICAgICAgICAgY29tcHJlc3NlZDogdGhpcy5jb21wcmVzc2VkLFxuICAgICAgICAgIHN0b3JlZEFzU3ViRGlyZWN0b3JpZXM6IHByb3BzLnN0b3JlZEFzU3ViRGlyZWN0b3JpZXMgPz8gZmFsc2UsXG4gICAgICAgICAgY29sdW1uczogcmVuZGVyQ29sdW1ucyhwcm9wcy5jb2x1bW5zKSxcbiAgICAgICAgICBpbnB1dEZvcm1hdDogcHJvcHMuZGF0YUZvcm1hdC5pbnB1dEZvcm1hdC5jbGFzc05hbWUsXG4gICAgICAgICAgb3V0cHV0Rm9ybWF0OiBwcm9wcy5kYXRhRm9ybWF0Lm91dHB1dEZvcm1hdC5jbGFzc05hbWUsXG4gICAgICAgICAgc2VyZGVJbmZvOiB7XG4gICAgICAgICAgICBzZXJpYWxpemF0aW9uTGlicmFyeTogcHJvcHMuZGF0YUZvcm1hdC5zZXJpYWxpemF0aW9uTGlicmFyeS5jbGFzc05hbWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBwYXJhbWV0ZXJzOiBwcm9wcy5zdG9yYWdlUGFyYW1ldGVycyA/IHByb3BzLnN0b3JhZ2VQYXJhbWV0ZXJzLnJlZHVjZSgoYWNjLCBwYXJhbSkgPT4ge1xuICAgICAgICAgICAgaWYgKHBhcmFtLmtleSBpbiBhY2MpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihsaXRgRHVwbGljYXRlU3RvcmFnZVBhcmFtZXRlcktleWAsIGBEdXBsaWNhdGUgc3RvcmFnZSBwYXJhbWV0ZXIga2V5OiAke3BhcmFtLmtleX1gLCB0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGtleSA9IHBhcmFtLmtleTtcbiAgICAgICAgICAgIGFjY1trZXldID0gcGFyYW0udmFsdWU7XG4gICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICAgIH0sIHt9IGFzIHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0pIDogdW5kZWZpbmVkLFxuICAgICAgICB9LFxuXG4gICAgICAgIHRhYmxlVHlwZTogJ0VYVEVSTkFMX1RBQkxFJyxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICB0aGlzLnRhYmxlUmVzb3VyY2UgPSB0aGlzLnJlc291cmNlO1xuICAgIHRoaXMubm9kZS5kZWZhdWx0Q2hpbGQgPSB0aGlzLnJlc291cmNlO1xuXG4gICAgLy8gUGFydGl0aW9uIGluZGV4IGNyZWF0aW9uIHJlbGllcyBvbiBjcmVhdGVkIHRhYmxlLlxuICAgIGlmIChwcm9wcy5wYXJ0aXRpb25JbmRleGVzKSB7XG4gICAgICB0aGlzLnBhcnRpdGlvbkluZGV4ZXMgPSBwcm9wcy5wYXJ0aXRpb25JbmRleGVzO1xuICAgICAgdGhpcy5wYXJ0aXRpb25JbmRleGVzLmZvckVhY2goKGluZGV4KSA9PiB0aGlzLmFkZFBhcnRpdGlvbkluZGV4KGluZGV4KSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhpcyB0YWJsZS5cbiAgICovXG4gIEBtZW1vaXplZEdldHRlclxuICBwdWJsaWMgZ2V0IHRhYmxlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFJlc291cmNlTmFtZUF0dHJpYnV0ZSh0aGlzLnJlc291cmNlLnJlZik7XG4gIH1cblxuICAvKipcbiAgICogQVJOIG9mIHRoaXMgdGFibGUuXG4gICAqL1xuICBAbWVtb2l6ZWRHZXR0ZXJcbiAgcHVibGljIGdldCB0YWJsZUFybigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnN0YWNrLmZvcm1hdEFybih7XG4gICAgICBzZXJ2aWNlOiAnZ2x1ZScsXG4gICAgICByZXNvdXJjZTogJ3RhYmxlJyxcbiAgICAgIHJlc291cmNlTmFtZTogYCR7dGhpcy5kYXRhYmFzZS5kYXRhYmFzZU5hbWV9LyR7dGhpcy50YWJsZU5hbWV9YCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudCByZWFkIHBlcm1pc3Npb25zIHRvIHRoZSB0YWJsZSBhbmQgdGhlIHVuZGVybHlpbmcgZGF0YSBzdG9yZWQgaW4gUzMgdG8gYW4gSUFNIHByaW5jaXBhbC5cbiAgICogW2Rpc2FibGUtYXdzbGludDpuby1ncmFudHNdXG4gICAqXG4gICAqIEBwYXJhbSBncmFudGVlIHRoZSBwcmluY2lwYWxcbiAgICovXG4gIEBNZXRob2RNZXRhZGF0YSgpXG4gIHB1YmxpYyBncmFudFJlYWQoZ3JhbnRlZTogaWFtLklHcmFudGFibGUpOiBpYW0uR3JhbnQge1xuICAgIGNvbnN0IHJldCA9IHRoaXMuZ3JhbnQoZ3JhbnRlZSwgcmVhZFBlcm1pc3Npb25zKTtcbiAgICBpZiAodGhpcy5lbmNyeXB0aW9uS2V5ICYmIHRoaXMuZW5jcnlwdGlvbiA9PT0gVGFibGVFbmNyeXB0aW9uLkNMSUVOVF9TSURFX0tNUykgeyB0aGlzLmVuY3J5cHRpb25LZXkuZ3JhbnREZWNyeXB0KGdyYW50ZWUpOyB9XG4gICAgdGhpcy5idWNrZXQuZ3JhbnRSZWFkKGdyYW50ZWUsIHRoaXMuZ2VuZXJhdGVTM1ByZWZpeEZvckdyYW50KCkpO1xuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnQgd3JpdGUgcGVybWlzc2lvbnMgdG8gdGhlIHRhYmxlIGFuZCB0aGUgdW5kZXJseWluZyBkYXRhIHN0b3JlZCBpbiBTMyB0byBhbiBJQU0gcHJpbmNpcGFsLlxuICAgKiBbZGlzYWJsZS1hd3NsaW50Om5vLWdyYW50c11cbiAgICpcbiAgICogQHBhcmFtIGdyYW50ZWUgdGhlIHByaW5jaXBhbFxuICAgKi9cbiAgQE1ldGhvZE1ldGFkYXRhKClcbiAgcHVibGljIGdyYW50V3JpdGUoZ3JhbnRlZTogaWFtLklHcmFudGFibGUpOiBpYW0uR3JhbnQge1xuICAgIGNvbnN0IHJldCA9IHRoaXMuZ3JhbnQoZ3JhbnRlZSwgd3JpdGVQZXJtaXNzaW9ucyk7XG4gICAgaWYgKHRoaXMuZW5jcnlwdGlvbktleSAmJiB0aGlzLmVuY3J5cHRpb24gPT09IFRhYmxlRW5jcnlwdGlvbi5DTElFTlRfU0lERV9LTVMpIHsgdGhpcy5lbmNyeXB0aW9uS2V5LmdyYW50RW5jcnlwdChncmFudGVlKTsgfVxuICAgIHRoaXMuYnVja2V0LmdyYW50V3JpdGUoZ3JhbnRlZSwgdGhpcy5nZW5lcmF0ZVMzUHJlZml4Rm9yR3JhbnQoKSk7XG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudCByZWFkIGFuZCB3cml0ZSBwZXJtaXNzaW9ucyB0byB0aGUgdGFibGUgYW5kIHRoZSB1bmRlcmx5aW5nIGRhdGEgc3RvcmVkIGluIFMzIHRvIGFuIElBTSBwcmluY2lwYWwuXG4gICAqIFtkaXNhYmxlLWF3c2xpbnQ6bm8tZ3JhbnRzXVxuICAgKlxuICAgKiBAcGFyYW0gZ3JhbnRlZSB0aGUgcHJpbmNpcGFsXG4gICAqL1xuICBATWV0aG9kTWV0YWRhdGEoKVxuICBwdWJsaWMgZ3JhbnRSZWFkV3JpdGUoZ3JhbnRlZTogaWFtLklHcmFudGFibGUpOiBpYW0uR3JhbnQge1xuICAgIGNvbnN0IHJldCA9IHRoaXMuZ3JhbnQoZ3JhbnRlZSwgWy4uLnJlYWRQZXJtaXNzaW9ucywgLi4ud3JpdGVQZXJtaXNzaW9uc10pO1xuICAgIGlmICh0aGlzLmVuY3J5cHRpb25LZXkgJiYgdGhpcy5lbmNyeXB0aW9uID09PSBUYWJsZUVuY3J5cHRpb24uQ0xJRU5UX1NJREVfS01TKSB7IHRoaXMuZW5jcnlwdGlvbktleS5ncmFudEVuY3J5cHREZWNyeXB0KGdyYW50ZWUpOyB9XG4gICAgdGhpcy5idWNrZXQuZ3JhbnRSZWFkV3JpdGUoZ3JhbnRlZSwgdGhpcy5nZW5lcmF0ZVMzUHJlZml4Rm9yR3JhbnQoKSk7XG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZW5lcmF0ZVMzUHJlZml4Rm9yR3JhbnQoKSB7XG4gICAgLy8gV2hlbiB0aGUgdXNlciBzdXBwbGllZCB0aGVpciBvd24gYnVja2V0IGFuZCBkaWQgbm90IHNjb3BlIHRoZSB0YWJsZSB0byBhXG4gICAgLy8gcHJlZml4LCB0aGUgZ3JhbnQgY292ZXJzIGV2ZXJ5IG9iamVjdCBpbiB0aGUgYnVja2V0IC0gd2hpY2ggbWF5IGluY2x1ZGVcbiAgICAvLyBkYXRhIG93bmVkIGJ5IG90aGVyIHRhYmxlcyBvciBjb25zdW1lcnMgc2hhcmluZyB0aGF0IGJ1Y2tldC4gV2FybiBzbyB0aGVcbiAgICAvLyBvdmVyLWdyYW50IGlzIGEgZGVsaWJlcmF0ZSBjaG9pY2UgcmF0aGVyIHRoYW4gYSBzaWxlbnQgc3VycHJpc2UuXG4gICAgaWYgKHRoaXMudXNlclByb3ZpZGVkQnVja2V0ICYmIHRoaXMuczNQcmVmaXggPT09ICcnKSB7XG4gICAgICBBbm5vdGF0aW9ucy5vZih0aGlzKS5hZGRXYXJuaW5nVjIoXG4gICAgICAgICdAYXdzLWNkay9hd3MtZ2x1ZS1hbHBoYTpncmFudFNjb3BlZFRvV2hvbGVCdWNrZXQnLFxuICAgICAgICAnZ3JhbnRpbmcgYWNjZXNzIHRvIHRoZSBlbnRpcmUgZGF0YSBidWNrZXQgYmVjYXVzZSBgczNQcmVmaXhgIGlzIGVtcHR5IGFuZCBhIHNoYXJlZCBidWNrZXQgd2FzIHByb3ZpZGVkOyAnICtcbiAgICAgICAgICAnc2V0IGBzM1ByZWZpeGAgdG8gc2NvcGUgZ3JhbnRzIHRvIHRoaXMgdGFibGVcXCdzIGRhdGEgYW5kIGF2b2lkIGdyYW50aW5nIGFjY2VzcyB0byBvdGhlciB0YWJsZXMgc2hhcmluZyB0aGUgYnVja2V0LicsXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zM1ByZWZpeCArICcqJztcbiAgfVxufVxuXG5jb25zdCByZWFkUGVybWlzc2lvbnMgPSBbXG4gICdnbHVlOkJhdGNoR2V0UGFydGl0aW9uJyxcbiAgJ2dsdWU6R2V0UGFydGl0aW9uJyxcbiAgJ2dsdWU6R2V0UGFydGl0aW9ucycsXG4gICdnbHVlOkdldFRhYmxlJyxcbiAgJ2dsdWU6R2V0VGFibGVzJyxcbiAgJ2dsdWU6R2V0VGFibGVWZXJzaW9uJyxcbiAgJ2dsdWU6R2V0VGFibGVWZXJzaW9ucycsXG5dO1xuXG5jb25zdCB3cml0ZVBlcm1pc3Npb25zID0gW1xuICAnZ2x1ZTpCYXRjaENyZWF0ZVBhcnRpdGlvbicsXG4gICdnbHVlOkJhdGNoRGVsZXRlUGFydGl0aW9uJyxcbiAgJ2dsdWU6Q3JlYXRlUGFydGl0aW9uJyxcbiAgJ2dsdWU6RGVsZXRlUGFydGl0aW9uJyxcbiAgJ2dsdWU6VXBkYXRlUGFydGl0aW9uJyxcbl07XG5cbi8vIG1hcCBUYWJsZUVuY3J5cHRpb24gdG8gYnVja2V0J3MgU1NFIGNvbmZpZ3VyYXRpb24gKHMzLkJ1Y2tldEVuY3J5cHRpb24pXG5jb25zdCBlbmNyeXB0aW9uTWFwcGluZ3MgPSB7XG4gIFtUYWJsZUVuY3J5cHRpb24uUzNfTUFOQUdFRF06IHMzLkJ1Y2tldEVuY3J5cHRpb24uUzNfTUFOQUdFRCxcbiAgW1RhYmxlRW5jcnlwdGlvbi5LTVNfTUFOQUdFRF06IHMzLkJ1Y2tldEVuY3J5cHRpb24uS01TX01BTkFHRUQsXG4gIFtUYWJsZUVuY3J5cHRpb24uS01TXTogczMuQnVja2V0RW5jcnlwdGlvbi5LTVMsXG4gIFtUYWJsZUVuY3J5cHRpb24uQ0xJRU5UX1NJREVfS01TXTogczMuQnVja2V0RW5jcnlwdGlvbi5TM19NQU5BR0VELFxufTtcblxuLy8gY3JlYXRlIHRoZSBidWNrZXQgdG8gc3RvcmUgYSB0YWJsZSdzIGRhdGEgZGVwZW5kaW5nIG9uIHRoZSBgZW5jcnlwdGlvbmAgYW5kIGBlbmNyeXB0aW9uS2V5YCBwcm9wZXJ0aWVzLlxuZnVuY3Rpb24gY3JlYXRlQnVja2V0KHRhYmxlOiBTM1RhYmxlLCBwcm9wczogUzNUYWJsZVByb3BzKSB7XG4gIGxldCBidWNrZXQgPSBwcm9wcy5idWNrZXQ7XG5cbiAgaWYgKGJ1Y2tldCAmJiAocHJvcHMuZW5jcnlwdGlvbiAhPT0gdW5kZWZpbmVkICYmIHByb3BzLmVuY3J5cHRpb24gIT09IFRhYmxlRW5jcnlwdGlvbi5DTElFTlRfU0lERV9LTVMpKSB7XG4gICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKGxpdGBFbmNyeXB0aW9uV2l0aFByb3ZpZGVkQnVja2V0YCwgJ3lvdSBjYW4gbm90IHNwZWNpZnkgZW5jcnlwdGlvbiBzZXR0aW5ncyBpZiB5b3UgYWxzbyBwcm92aWRlIGEgYnVja2V0Jyk7XG4gIH1cblxuICBjb25zdCBlbmNyeXB0aW9uID0gcHJvcHMuZW5jcnlwdGlvbiB8fCBUYWJsZUVuY3J5cHRpb24uUzNfTUFOQUdFRDtcblxuICBsZXQgZW5jcnlwdGlvbktleToga21zLklLZXkgfCB1bmRlZmluZWQ7XG4gIGlmIChlbmNyeXB0aW9uID09PSBUYWJsZUVuY3J5cHRpb24uQ0xJRU5UX1NJREVfS01TICYmIHByb3BzLmVuY3J5cHRpb25LZXkgPT09IHVuZGVmaW5lZCkge1xuICAgIC8vIENTRS1LTVMgc2hvdWxkIGJlaGF2ZSB0aGUgc2FtZSBhcyBTU0UtS01TIC0gdXNlIHRoZSBwcm92aWRlZCBrZXkgb3IgY3JlYXRlIG9uZSBhdXRvbWF0aWNhbGx5XG4gICAgLy8gU2luY2UgQnVja2V0IG9ubHkga25vd3MgYWJvdXQgU1NFLCB3ZSByZXBlYXQgdGhlIGxvZ2ljIGZvciBDU0UtS01TIGF0IHRoZSBUYWJsZSBsZXZlbC5cbiAgICBlbmNyeXB0aW9uS2V5ID0gbmV3IGttcy5LZXkodGFibGUsICdLZXknKTtcbiAgfSBlbHNlIHtcbiAgICBlbmNyeXB0aW9uS2V5ID0gcHJvcHMuZW5jcnlwdGlvbktleTtcbiAgfVxuXG4gIC8vIGNyZWF0ZSB0aGUgYnVja2V0IGlmIG5vbmUgd2FzIHByb3ZpZGVkXG4gIGlmICghYnVja2V0KSB7XG4gICAgaWYgKGVuY3J5cHRpb24gPT09IFRhYmxlRW5jcnlwdGlvbi5DTElFTlRfU0lERV9LTVMpIHtcbiAgICAgIC8vIFRoZSBgZW5jcnlwdGlvbktleWAgaGVyZSBpcyB1c2VkIGZvciBjbGllbnQtc2lkZSBlbmNyeXB0aW9uIChncmFudGVkIHRvXG4gICAgICAvLyBwcmluY2lwYWxzIHZpYSB0aGUgZ3JhbnQqIG1ldGhvZHMpLCBub3QgZm9yIHRoZSBidWNrZXQncyBTU0UuIFRoZSBidWNrZXRcbiAgICAgIC8vIHN0aWxsIGdldHMgc2VydmVyLXNpZGUgZW5jcnlwdGlvbiBhdCByZXN0IGFzIGRlZmVuc2UgaW4gZGVwdGguXG4gICAgICBidWNrZXQgPSBuZXcgczMuQnVja2V0KHRhYmxlLCAnQnVja2V0Jywge1xuICAgICAgICBlbmNyeXB0aW9uOiBlbmNyeXB0aW9uTWFwcGluZ3NbZW5jcnlwdGlvbl0sXG4gICAgICAgIGVuZm9yY2VTU0w6IHRydWUsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgYnVja2V0ID0gbmV3IHMzLkJ1Y2tldCh0YWJsZSwgJ0J1Y2tldCcsIHtcbiAgICAgICAgZW5jcnlwdGlvbjogZW5jcnlwdGlvbk1hcHBpbmdzW2VuY3J5cHRpb25dLFxuICAgICAgICBlbmNyeXB0aW9uS2V5LFxuICAgICAgICBlbmZvcmNlU1NMOiB0cnVlLFxuICAgICAgfSk7XG4gICAgICBlbmNyeXB0aW9uS2V5ID0gYnVja2V0LmVuY3J5cHRpb25LZXk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBidWNrZXQsXG4gICAgZW5jcnlwdGlvbixcbiAgICBlbmNyeXB0aW9uS2V5LFxuICB9O1xufVxuXG5mdW5jdGlvbiByZW5kZXJDb2x1bW5zKGNvbHVtbnM/OiBBcnJheTxDb2x1bW4gfCBDb2x1bW4+KSB7XG4gIGlmIChjb2x1bW5zID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiBjb2x1bW5zLm1hcChjb2x1bW4gPT4ge1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiBjb2x1bW4ubmFtZSxcbiAgICAgIHR5cGU6IGNvbHVtbi50eXBlLmlucHV0U3RyaW5nLFxuICAgICAgY29tbWVudDogY29sdW1uLmNvbW1lbnQsXG4gICAgfTtcbiAgfSk7XG59XG4iXX0=
441
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiczMtdGFibGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJzMy10YWJsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSw2Q0FBMkQ7QUFDM0QsbURBQWdEO0FBRWhELHlEQUEyQztBQUMzQyx1REFBeUM7QUFDekMsNEVBQTRFO0FBQzVFLDhFQUE4RjtBQUM5RiwwRUFBMEU7QUFJMUUsNkNBQXlDO0FBRXpDOzs7Ozs7R0FNRztBQUNILE1BQWEsaUJBQWlCOztJQUM1Qjs7T0FFRztJQUNJLE1BQU0sQ0FBQyxTQUFTO1FBQ3JCLE9BQU8sSUFBSSxpQkFBaUIsQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLENBQUM7S0FDOUQ7SUFFRDs7OztPQUlHO0lBQ0ksTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFjO1FBQzlCLE9BQU8sSUFBSSxpQkFBaUIsQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0tBQzVEO0lBRUQ7O09BRUc7SUFDSSxNQUFNLENBQUMsVUFBVTtRQUN0QixPQUFPLElBQUksaUJBQWlCLENBQUMsRUFBRSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxDQUFDO0tBQy9EO0lBRUQsZ0JBQWdCO0lBQ0EsaUJBQWlCLENBQXNCO0lBRXZELGdCQUFnQjtJQUNBLE9BQU8sQ0FBWTtJQUVuQyxZQUFvQixnQkFBcUMsRUFBRSxNQUFpQjtRQUMxRSxJQUFJLENBQUMsaUJBQWlCLEdBQUcsZ0JBQWdCLENBQUM7UUFDMUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7S0FDdkI7O0FBakNILDhDQWtDQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQWEsY0FBYzs7SUFDekI7Ozs7O09BS0c7SUFDSSxNQUFNLENBQUMsYUFBYSxDQUFDLFVBQThCOzs7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O0lBQ3RCLHVCQUF1QjtDQUN4QixDQUFDO0FBRUYsTUFBTSxnQkFBZ0IsR0FBRztJQUN2QiwyQkFBMkI7SUFDM0IsMkJBQTJCO0lBQzNCLHNCQUFzQjtJQUN0QixzQkFBc0I7SUFDdEIsc0JBQXNCO0NBQ3ZCLENBQUM7QUFFRixTQUFTLGFBQWEsQ0FBQyxPQUFrQjtJQUN2QyxJQUFJLE9BQU8sS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUMxQixPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBQ0QsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1FBQzFCLE9BQU87WUFDTCxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUk7WUFDakIsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVztZQUM3QixPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU87U0FDeEIsQ0FBQztJQUNKLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFubm90YXRpb25zLCBWYWxpZGF0aW9uRXJyb3IgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBDZm5UYWJsZSB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1nbHVlJztcbmltcG9ydCB0eXBlICogYXMgaWFtIGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xuaW1wb3J0ICogYXMga21zIGZyb20gJ2F3cy1jZGstbGliL2F3cy1rbXMnO1xuaW1wb3J0ICogYXMgczMgZnJvbSAnYXdzLWNkay1saWIvYXdzLXMzJztcbmltcG9ydCB7IG1lbW9pemVkR2V0dGVyLCBsaXQgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlL2xpYi9oZWxwZXJzLWludGVybmFsJztcbmltcG9ydCB7IGFkZENvbnN0cnVjdE1ldGFkYXRhLCBNZXRob2RNZXRhZGF0YSB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUvbGliL21ldGFkYXRhLXJlc291cmNlJztcbmltcG9ydCB7IHByb3BlcnR5SW5qZWN0YWJsZSB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUvbGliL3Byb3AtaW5qZWN0YWJsZSc7XG5pbXBvcnQgdHlwZSB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHR5cGUgeyBDb2x1bW4gfSBmcm9tICcuL3NjaGVtYSc7XG5pbXBvcnQgdHlwZSB7IFBhcnRpdGlvbkluZGV4LCBUYWJsZUJhc2VQcm9wcyB9IGZyb20gJy4vdGFibGUtYmFzZSc7XG5pbXBvcnQgeyBUYWJsZUJhc2UgfSBmcm9tICcuL3RhYmxlLWJhc2UnO1xuXG4vKipcbiAqIFNlcnZlci1zaWRlIGVuY3J5cHRpb24gZm9yIHRoZSBTMyBidWNrZXQgdGhhdCBhIG1hbmFnZWQgYFMzVGFibGVgIGNyZWF0ZXMuXG4gKlxuICogQXBwbGllcyBvbmx5IHdoZW4gdGhlIHRhYmxlIG1hbmFnZXMgaXRzIG93biBidWNrZXQgKHZpYVxuICogYFMzVGFibGVTdG9yYWdlLm1hbmFnZWRCdWNrZXRgKS4gQW4gZXhpc3RpbmcgYnVja2V0IGtlZXBzIHdoYXRldmVyIGVuY3J5cHRpb25cbiAqIGl0IHdhcyBjcmVhdGVkIHdpdGguXG4gKi9cbmV4cG9ydCBjbGFzcyBTM1RhYmxlRW5jcnlwdGlvbiB7XG4gIC8qKlxuICAgKiBTZXJ2ZXItc2lkZSBlbmNyeXB0aW9uIChTU0UtUzMpIHdpdGggYW4gQW1hem9uIFMzLW1hbmFnZWQga2V5LlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBzM01hbmFnZWQoKTogUzNUYWJsZUVuY3J5cHRpb24ge1xuICAgIHJldHVybiBuZXcgUzNUYWJsZUVuY3J5cHRpb24oczMuQnVja2V0RW5jcnlwdGlvbi5TM19NQU5BR0VEKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJ2ZXItc2lkZSBlbmNyeXB0aW9uIChTU0UtS01TKSB3aXRoIGFuIEFXUyBLTVMga2V5IG1hbmFnZWQgYnkgdGhlIGFjY291bnQgb3duZXIuXG4gICAqXG4gICAqIEBwYXJhbSBrZXkgdGhlIEtNUyBrZXkgdXNlZCB0byBlbmNyeXB0IHRoZSBkYXRhLiBBIGtleSBpcyBjcmVhdGVkIGlmIG9uZSBpcyBub3QgcHJvdmlkZWQuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGttcyhrZXk/OiBrbXMuSUtleSk6IFMzVGFibGVFbmNyeXB0aW9uIHtcbiAgICByZXR1cm4gbmV3IFMzVGFibGVFbmNyeXB0aW9uKHMzLkJ1Y2tldEVuY3J5cHRpb24uS01TLCBrZXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcnZlci1zaWRlIGVuY3J5cHRpb24gKFNTRS1LTVMpIHdpdGggYW4gQVdTIEtNUyBrZXkgbWFuYWdlZCBieSB0aGUgS01TIHNlcnZpY2UuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGttc01hbmFnZWQoKTogUzNUYWJsZUVuY3J5cHRpb24ge1xuICAgIHJldHVybiBuZXcgUzNUYWJsZUVuY3J5cHRpb24oczMuQnVja2V0RW5jcnlwdGlvbi5LTVNfTUFOQUdFRCk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIHB1YmxpYyByZWFkb25seSBfYnVja2V0RW5jcnlwdGlvbjogczMuQnVja2V0RW5jcnlwdGlvbjtcblxuICAvKiogQGludGVybmFsICovXG4gIHB1YmxpYyByZWFkb25seSBfa21zS2V5Pzoga21zLklLZXk7XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihidWNrZXRFbmNyeXB0aW9uOiBzMy5CdWNrZXRFbmNyeXB0aW9uLCBrbXNLZXk/OiBrbXMuSUtleSkge1xuICAgIHRoaXMuX2J1Y2tldEVuY3J5cHRpb24gPSBidWNrZXRFbmNyeXB0aW9uO1xuICAgIHRoaXMuX2ttc0tleSA9IGttc0tleTtcbiAgfVxufVxuXG4vKipcbiAqIFdoZXJlIGFuIGBTM1RhYmxlYCBzdG9yZXMgaXRzIGRhdGEuXG4gKlxuICogVGhlIHR3byBwYXRocyBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlOiBhIG1hbmFnZWQgYnVja2V0IG1heSBzcGVjaWZ5IGl0c1xuICogc2VydmVyLXNpZGUgZW5jcnlwdGlvbiwgd2hpbGUgYW4gZXhpc3RpbmcgYnVja2V0IGtlZXBzIGl0cyBvd24gZW5jcnlwdGlvbiDigJQgc29cbiAqIGFuIGVuY3J5cHRpb24gY2hvaWNlIGNhbiBuZXZlciBiZSBwYWlyZWQgd2l0aCBhIGJyaW5nLXlvdXItb3duIGJ1Y2tldC5cbiAqL1xuZXhwb3J0IGNsYXNzIFMzVGFibGVTdG9yYWdlIHtcbiAgLyoqXG4gICAqIFN0b3JlIHRoZSB0YWJsZSdzIGRhdGEgaW4gYSBidWNrZXQgY3JlYXRlZCBhbmQgbWFuYWdlZCBieSB0aGUgdGFibGUuXG4gICAqXG4gICAqIEBwYXJhbSBlbmNyeXB0aW9uIHRoZSBzZXJ2ZXItc2lkZSBlbmNyeXB0aW9uIGZvciB0aGUgY3JlYXRlZCBidWNrZXQuXG4gICAqIEBkZWZhdWx0IC0gUzMtbWFuYWdlZCAoU1NFLVMzKSBlbmNyeXB0aW9uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIG1hbmFnZWRCdWNrZXQoZW5jcnlwdGlvbj86IFMzVGFibGVFbmNyeXB0aW9uKTogUzNUYWJsZVN0b3JhZ2Uge1xuICAgIHJldHVybiBuZXcgUzNUYWJsZVN0b3JhZ2UodW5kZWZpbmVkLCBlbmNyeXB0aW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9yZSB0aGUgdGFibGUncyBkYXRhIGluIGFuIGV4aXN0aW5nIGJ1Y2tldC4gQ0RLIGRvZXMgbm90IG1hbmFnZSB0aGVcbiAgICogYnVja2V0J3MgZW5jcnlwdGlvbi5cbiAgICpcbiAgICogVGhlIGJ1Y2tldCBjYW4gYmUgb25lIHlvdSBkb24ndCBvd24sIGltcG9ydGVkIHdpdGhcbiAgICogYEJ1Y2tldC5mcm9tQnVja2V0QXJuKClgIG9yIGBCdWNrZXQuZnJvbUJ1Y2tldEF0dHJpYnV0ZXMoKWAuIElmIHRoYXQgYnVja2V0XG4gICAqIGlzIEtNUy1lbmNyeXB0ZWQsIGltcG9ydCBpdCB3aXRoIGBCdWNrZXQuZnJvbUJ1Y2tldEF0dHJpYnV0ZXMoKWAgYW5kIHN1cHBseVxuICAgKiB0aGUgYGVuY3J5cHRpb25LZXlgIGF0dHJpYnV0ZS4gT3RoZXJ3aXNlLCBDREsgaGFzIG5vIHJlZmVyZW5jZSB0byB0aGUga2V5LFxuICAgKiB3aGljaCBtZWFucyB0aGF0IGBTM1RhYmxlLmdyYW50UmVhZCgpYC9gZ3JhbnRXcml0ZSgpYCB3aWxsIGNvcnJlY3RseSBncmFudFxuICAgKiBTMyBhY2Nlc3MgYnV0IHNpbGVudGx5IHNraXAgdGhlIEtNUyBwZXJtaXNzaW9ucyBvbiB0aGUga2V5LiBBcyBhIGNvbnNlcXVlbmNlLFxuICAgKiBhdCBydW50aW1lLCByZWFkcyBhbmQgd3JpdGVzIHdpbGwgZmFpbCB3aXRoIGFjY2VzcyBkZW5pZWQgb24gdGhlIGtleS5cbiAgICpcbiAgICogQHBhcmFtIGJ1Y2tldCB0aGUgYnVja2V0IHRoYXQgaG9sZHMgdGhlIHRhYmxlJ3MgZGF0YS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbUJ1Y2tldChidWNrZXQ6IHMzLklCdWNrZXQpOiBTM1RhYmxlU3RvcmFnZSB7XG4gICAgcmV0dXJuIG5ldyBTM1RhYmxlU3RvcmFnZShidWNrZXQsIHVuZGVmaW5lZCk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIHB1YmxpYyByZWFkb25seSBfYnVja2V0PzogczMuSUJ1Y2tldDtcblxuICAvKiogQGludGVybmFsICovXG4gIHB1YmxpYyByZWFkb25seSBfZW5jcnlwdGlvbj86IFMzVGFibGVFbmNyeXB0aW9uO1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IoYnVja2V0PzogczMuSUJ1Y2tldCwgZW5jcnlwdGlvbj86IFMzVGFibGVFbmNyeXB0aW9uKSB7XG4gICAgdGhpcy5fYnVja2V0ID0gYnVja2V0O1xuICAgIHRoaXMuX2VuY3J5cHRpb24gPSBlbmNyeXB0aW9uO1xuICB9XG59XG5cbi8qKlxuICogQ2xpZW50LXNpZGUgZW5jcnlwdGlvbiBmb3IgYW4gYFMzVGFibGVgJ3MgZGF0YS5cbiAqXG4gKiBJbmRlcGVuZGVudCBvZiB0aGUgYnVja2V0J3Mgc2VydmVyLXNpZGUgZW5jcnlwdGlvbiBhbmQgb2Ygd2hvIG93bnMgdGhlIGJ1Y2tldDpcbiAqIHRoZSBkYXRhIGlzIGVuY3J5cHRlZCBieSB0aGUgY2xpZW50IGJlZm9yZSBpdCBpcyB3cml0dGVuIHRvIFMzLiBXaGVuIHNldCwgdGhlXG4gKiBgZ3JhbnQqYCBtZXRob2RzIGFsc28gZ3JhbnQgdGhlIHJlbGV2YW50IEtNUyBwZXJtaXNzaW9ucyBvbiB0aGUga2V5LlxuICovXG5leHBvcnQgY2xhc3MgVGFibGVDbGllbnRTaWRlRW5jcnlwdGlvbiB7XG4gIC8qKlxuICAgKiBDbGllbnQtc2lkZSBlbmNyeXB0aW9uIChDU0UtS01TKSB3aXRoIGFuIEFXUyBLTVMga2V5IG1hbmFnZWQgYnkgdGhlIGFjY291bnQgb3duZXIuXG4gICAqXG4gICAqIEBwYXJhbSBrZXkgdGhlIEtNUyBrZXkgdXNlZCB0byBlbmNyeXB0IHRoZSBkYXRhLiBBIGtleSBpcyBjcmVhdGVkIGlmIG9uZSBpcyBub3QgcHJvdmlkZWQuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGttcyhrZXk/OiBrbXMuSUtleSk6IFRhYmxlQ2xpZW50U2lkZUVuY3J5cHRpb24ge1xuICAgIHJldHVybiBuZXcgVGFibGVDbGllbnRTaWRlRW5jcnlwdGlvbihrZXkpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwdWJsaWMgcmVhZG9ubHkgX2ttc0tleT86IGttcy5JS2V5O1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3Ioa21zS2V5Pzoga21zLklLZXkpIHtcbiAgICB0aGlzLl9rbXNLZXkgPSBrbXNLZXk7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBTM1RhYmxlUHJvcHMgZXh0ZW5kcyBUYWJsZUJhc2VQcm9wcyB7XG4gIC8qKlxuICAgKiBXaGVyZSB0aGUgdGFibGUncyBkYXRhIGlzIHN0b3JlZDogYSBidWNrZXQgY3JlYXRlZCBhbmQgbWFuYWdlZCBieSB0aGUgdGFibGUsXG4gICAqIG9yIGFuIGV4aXN0aW5nIGJ1Y2tldCB5b3UgcHJvdmlkZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBhIG1hbmFnZWQgYnVja2V0IHdpdGggUzMtbWFuYWdlZCAoU1NFLVMzKSBlbmNyeXB0aW9uXG4gICAqL1xuICByZWFkb25seSBzdG9yYWdlPzogUzNUYWJsZVN0b3JhZ2U7XG5cbiAgLyoqXG4gICAqIFMzIHByZWZpeCB1bmRlciB3aGljaCB0YWJsZSBvYmplY3RzIGFyZSBzdG9yZWQuXG4gICAqXG4gICAqIFdoZW4gdGhlIHRhYmxlIHNoYXJlcyBhIGJ1Y2tldCB3aXRoIG90aGVyIHRhYmxlcyBvciBjb25zdW1lcnMsIHNldCB0aGlzIHNvXG4gICAqIHRoYXQgdGhlIGBncmFudCpgIG1ldGhvZHMgc2NvcGUgUzMgYWNjZXNzIHRvIHRoaXMgdGFibGUncyBkYXRhLiBXaXRob3V0IGFcbiAgICogcHJlZml4LCB0aG9zZSBncmFudHMgY292ZXIgdGhlIGVudGlyZSBidWNrZXQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gcHJlZml4LiBUaGUgZGF0YSB3aWxsIGJlIHN0b3JlZCB1bmRlciB0aGUgcm9vdCBvZiB0aGUgYnVja2V0LlxuICAgKi9cbiAgcmVhZG9ubHkgczNQcmVmaXg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIENsaWVudC1zaWRlIGVuY3J5cHRpb24gKENTRS1LTVMpIGZvciB0aGUgdGFibGUncyBkYXRhLlxuICAgKlxuICAgKiBJbmRlcGVuZGVudCBvZiB0aGUgYnVja2V0J3Mgc2VydmVyLXNpZGUgZW5jcnlwdGlvbiwgYW5kIHZhbGlkIHdoZXRoZXIgdGhlXG4gICAqIGJ1Y2tldCBpcyBtYW5hZ2VkIG9yIHByb3ZpZGVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGNsaWVudC1zaWRlIGVuY3J5cHRpb25cbiAgICovXG4gIHJlYWRvbmx5IGNsaWVudFNpZGVFbmNyeXB0aW9uPzogVGFibGVDbGllbnRTaWRlRW5jcnlwdGlvbjtcbn1cblxuLyoqXG4gKiBBIEdsdWUgdGFibGUgdGhhdCB0YXJnZXRzIGEgUzMgZGF0YXNldC5cbiAqIEByZXNvdXJjZSBBV1M6OkdsdWU6OlRhYmxlXG4gKi9cbkBwcm9wZXJ0eUluamVjdGFibGVcbmV4cG9ydCBjbGFzcyBTM1RhYmxlIGV4dGVuZHMgVGFibGVCYXNlIHtcbiAgLyoqIFVuaXF1ZWx5IGlkZW50aWZpZXMgdGhpcyBjbGFzcy4gKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBQUk9QRVJUWV9JTkpFQ1RJT05fSUQ6IHN0cmluZyA9ICdAYXdzLWNkay5hd3MtZ2x1ZS1hbHBoYS5TM1RhYmxlJztcblxuICBwcml2YXRlIHJlc291cmNlOiBDZm5UYWJsZTtcblxuICAvKipcbiAgICogUzMgYnVja2V0IGluIHdoaWNoIHRoZSB0YWJsZSdzIGRhdGEgcmVzaWRlcy5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBidWNrZXQ6IHMzLklCdWNrZXQ7XG5cbiAgLyoqXG4gICAqIFMzIEtleSBQcmVmaXggdW5kZXIgd2hpY2ggdGhpcyB0YWJsZSdzIGZpbGVzIGFyZSBzdG9yZWQgaW4gUzMuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgczNQcmVmaXg6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIEtNUyBrZXkgdXNlZCBmb3IgY2xpZW50LXNpZGUgZW5jcnlwdGlvbiBvZiB0aGUgdGFibGUncyBkYXRhLCBpZlxuICAgKiBgY2xpZW50U2lkZUVuY3J5cHRpb25gIHdhcyBjb25maWd1cmVkLiBPdGhlcndpc2UsIGB1bmRlZmluZWRgLlxuICAgKlxuICAgKiBGb3Igc2VydmVyLXNpZGUgKGJ1Y2tldCkgZW5jcnlwdGlvbiwgcmVhZCBgYnVja2V0LmVuY3J5cHRpb25LZXlgIGluc3RlYWQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY2xpZW50U2lkZUVuY3J5cHRpb25LZXk/OiBrbXMuSUtleTtcblxuICAvKipcbiAgICogVGhpcyB0YWJsZSdzIHBhcnRpdGlvbiBpbmRleGVzLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHBhcnRpdGlvbkluZGV4ZXM/OiBQYXJ0aXRpb25JbmRleFtdO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSB0YWJsZVJlc291cmNlOiBDZm5UYWJsZTtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgZGF0YSBidWNrZXQgd2FzIHN1cHBsaWVkIGJ5IHRoZSB1c2VyIChhcyBvcHBvc2VkIHRvIGNyZWF0ZWQgYnlcbiAgICogdGhpcyBjb25zdHJ1Y3QpLiBBIHVzZXItc3VwcGxpZWQgYnVja2V0IG1heSBob2xkIGRhdGEgZm9yIG90aGVyIHRhYmxlcywgc29cbiAgICogZ3JhbnRpbmcgYWNjZXNzIHRvIHRoZSB3aG9sZSBidWNrZXQgY2FuIG92ZXItZ3JhbnQuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHVzZXJQcm92aWRlZEJ1Y2tldDogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogUzNUYWJsZVByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCBwcm9wcyk7XG4gICAgLy8gRW5oYW5jZWQgQ0RLIEFuYWx5dGljcyBUZWxlbWV0cnlcbiAgICBhZGRDb25zdHJ1Y3RNZXRhZGF0YSh0aGlzLCBwcm9wcyk7XG4gICAgdGhpcy5zM1ByZWZpeCA9IHByb3BzLnMzUHJlZml4ID8/ICcnO1xuICAgIGNvbnN0IHN0b3JhZ2UgPSBwcm9wcy5zdG9yYWdlID8/IFMzVGFibGVTdG9yYWdlLm1hbmFnZWRCdWNrZXQoKTtcbiAgICB0aGlzLnVzZXJQcm92aWRlZEJ1Y2tldCA9IHN0b3JhZ2UuX2J1Y2tldCAhPT0gdW5kZWZpbmVkO1xuICAgIHRoaXMuYnVja2V0ID0gc3RvcmFnZS5fYnVja2V0ID8/IHRoaXMuY3JlYXRlTWFuYWdlZEJ1Y2tldChzdG9yYWdlLl9lbmNyeXB0aW9uKTtcbiAgICBpZiAocHJvcHMuY2xpZW50U2lkZUVuY3J5cHRpb24pIHtcbiAgICAgIC8vIENTRS1LTVM6IHVzZSB0aGUgcHJvdmlkZWQga2V5IG9yIGNyZWF0ZSBvbmUgYXV0b21hdGljYWxseS4gVGhlIGJ1Y2tldCdzXG4gICAgICAvLyBvd24gc2VydmVyLXNpZGUgZW5jcnlwdGlvbiBpcyBpbmRlcGVuZGVudCBhbmQgY29tZXMgZnJvbSBgc3RvcmFnZWAuXG4gICAgICB0aGlzLmNsaWVudFNpZGVFbmNyeXB0aW9uS2V5ID0gcHJvcHMuY2xpZW50U2lkZUVuY3J5cHRpb24uX2ttc0tleSA/PyBuZXcga21zLktleSh0aGlzLCAnS2V5Jyk7XG4gICAgfVxuXG4gICAgdGhpcy5yZXNvdXJjZSA9IG5ldyBDZm5UYWJsZSh0aGlzLCAnVGFibGUnLCB7XG4gICAgICBjYXRhbG9nSWQ6IHByb3BzLmRhdGFiYXNlLmNhdGFsb2cuY2F0YWxvZ0lkLFxuXG4gICAgICBkYXRhYmFzZU5hbWU6IHByb3BzLmRhdGFiYXNlLmRhdGFiYXNlTmFtZSxcblxuICAgICAgdGFibGVJbnB1dDoge1xuICAgICAgICBuYW1lOiB0aGlzLnBoeXNpY2FsTmFtZSxcbiAgICAgICAgZGVzY3JpcHRpb246IHByb3BzLmRlc2NyaXB0aW9uIHx8IGAke3RoaXMucGh5c2ljYWxOYW1lfSBnZW5lcmF0ZWQgYnkgQ0RLYCxcblxuICAgICAgICBwYXJ0aXRpb25LZXlzOiByZW5kZXJDb2x1bW5zKHByb3BzLnBhcnRpdGlvbktleXMpLFxuXG4gICAgICAgIHBhcmFtZXRlcnM6IHtcbiAgICAgICAgICAnY2xhc3NpZmljYXRpb24nOiBwcm9wcy5kYXRhRm9ybWF0LmNsYXNzaWZpY2F0aW9uU3RyaW5nPy52YWx1ZSxcbiAgICAgICAgICAncGFydGl0aW9uX2ZpbHRlcmluZy5lbmFibGVkJzogcHJvcHMuZW5hYmxlUGFydGl0aW9uRmlsdGVyaW5nLFxuICAgICAgICAgIC4uLnRoaXMucGFyYW1ldGVycyxcbiAgICAgICAgICAvLyBNYW5hZ2VkIGtleXMgYXJlIGVtaXR0ZWQgbGFzdCBzbyBmcmVlLWZvcm0gYHBhcmFtZXRlcnNgIGNhbm5vdFxuICAgICAgICAgIC8vIHNpbGVudGx5IG92ZXJyaWRlIHRoZW0uIENvbmZsaWN0cyBhcmUgcmVqZWN0ZWQgaW4gYFRhYmxlQmFzZWAuXG4gICAgICAgICAgJ2hhc19lbmNyeXB0ZWRfZGF0YSc6IHRoaXMuaGFzRW5jcnlwdGVkRGF0YSxcbiAgICAgICAgfSxcbiAgICAgICAgc3RvcmFnZURlc2NyaXB0b3I6IHtcbiAgICAgICAgICBsb2NhdGlvbjogYHMzOi8vJHt0aGlzLmJ1Y2tldC5idWNrZXROYW1lfS8ke3RoaXMuczNQcmVmaXh9YCxcbiAgICAgICAgICBjb21wcmVzc2VkOiB0aGlzLmNvbXByZXNzZWQsXG4gICAgICAgICAgc3RvcmVkQXNTdWJEaXJlY3RvcmllczogcHJvcHMuc3RvcmVkQXNTdWJEaXJlY3RvcmllcyA/PyBmYWxzZSxcbiAgICAgICAgICBjb2x1bW5zOiByZW5kZXJDb2x1bW5zKHByb3BzLmNvbHVtbnMpLFxuICAgICAgICAgIGlucHV0Rm9ybWF0OiBwcm9wcy5kYXRhRm9ybWF0LmlucHV0Rm9ybWF0LmNsYXNzTmFtZSxcbiAgICAgICAgICBvdXRwdXRGb3JtYXQ6IHByb3BzLmRhdGFGb3JtYXQub3V0cHV0Rm9ybWF0LmNsYXNzTmFtZSxcbiAgICAgICAgICBzZXJkZUluZm86IHtcbiAgICAgICAgICAgIHNlcmlhbGl6YXRpb25MaWJyYXJ5OiBwcm9wcy5kYXRhRm9ybWF0LnNlcmlhbGl6YXRpb25MaWJyYXJ5LmNsYXNzTmFtZSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHBhcmFtZXRlcnM6IHByb3BzLnN0b3JhZ2VQYXJhbWV0ZXJzID8gcHJvcHMuc3RvcmFnZVBhcmFtZXRlcnMucmVkdWNlKChhY2MsIHBhcmFtKSA9PiB7XG4gICAgICAgICAgICBpZiAocGFyYW0ua2V5IGluIGFjYykge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGxpdGBEdXBsaWNhdGVTdG9yYWdlUGFyYW1ldGVyS2V5YCwgYER1cGxpY2F0ZSBzdG9yYWdlIHBhcmFtZXRlciBrZXk6ICR7cGFyYW0ua2V5fWAsIHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qga2V5ID0gcGFyYW0ua2V5O1xuICAgICAgICAgICAgYWNjW2tleV0gPSBwYXJhbS52YWx1ZTtcbiAgICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgICAgfSwge30gYXMgeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSkgOiB1bmRlZmluZWQsXG4gICAgICAgIH0sXG5cbiAgICAgICAgdGFibGVUeXBlOiAnRVhURVJOQUxfVEFCTEUnLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHRoaXMudGFibGVSZXNvdXJjZSA9IHRoaXMucmVzb3VyY2U7XG4gICAgdGhpcy5ub2RlLmRlZmF1bHRDaGlsZCA9IHRoaXMucmVzb3VyY2U7XG5cbiAgICAvLyBQYXJ0aXRpb24gaW5kZXggY3JlYXRpb24gcmVsaWVzIG9uIGNyZWF0ZWQgdGFibGUuXG4gICAgaWYgKHByb3BzLnBhcnRpdGlvbkluZGV4ZXMpIHtcbiAgICAgIHRoaXMucGFydGl0aW9uSW5kZXhlcyA9IHByb3BzLnBhcnRpdGlvbkluZGV4ZXM7XG4gICAgICB0aGlzLnBhcnRpdGlvbkluZGV4ZXMuZm9yRWFjaCgoaW5kZXgpID0+IHRoaXMuYWRkUGFydGl0aW9uSW5kZXgoaW5kZXgpKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTmFtZSBvZiB0aGlzIHRhYmxlLlxuICAgKi9cbiAgQG1lbW9pemVkR2V0dGVyXG4gIHB1YmxpYyBnZXQgdGFibGVOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0UmVzb3VyY2VOYW1lQXR0cmlidXRlKHRoaXMucmVzb3VyY2UucmVmKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBUk4gb2YgdGhpcyB0YWJsZS5cbiAgICovXG4gIEBtZW1vaXplZEdldHRlclxuICBwdWJsaWMgZ2V0IHRhYmxlQXJuKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuc3RhY2suZm9ybWF0QXJuKHtcbiAgICAgIHNlcnZpY2U6ICdnbHVlJyxcbiAgICAgIHJlc291cmNlOiAndGFibGUnLFxuICAgICAgcmVzb3VyY2VOYW1lOiBgJHt0aGlzLmRhdGFiYXNlLmRhdGFiYXNlTmFtZX0vJHt0aGlzLnRhYmxlTmFtZX1gLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50IHJlYWQgcGVybWlzc2lvbnMgdG8gdGhlIHRhYmxlIGFuZCB0aGUgdW5kZXJseWluZyBkYXRhIHN0b3JlZCBpbiBTMyB0byBhbiBJQU0gcHJpbmNpcGFsLlxuICAgKiBbZGlzYWJsZS1hd3NsaW50Om5vLWdyYW50c11cbiAgICpcbiAgICogQHBhcmFtIGdyYW50ZWUgdGhlIHByaW5jaXBhbFxuICAgKi9cbiAgQE1ldGhvZE1ldGFkYXRhKClcbiAgcHVibGljIGdyYW50UmVhZChncmFudGVlOiBpYW0uSUdyYW50YWJsZSk6IGlhbS5HcmFudCB7XG4gICAgY29uc3QgcmV0ID0gdGhpcy5ncmFudChncmFudGVlLCByZWFkUGVybWlzc2lvbnMpO1xuICAgIGlmICh0aGlzLmNsaWVudFNpZGVFbmNyeXB0aW9uS2V5KSB7IHRoaXMuY2xpZW50U2lkZUVuY3J5cHRpb25LZXkuZ3JhbnREZWNyeXB0KGdyYW50ZWUpOyB9XG4gICAgdGhpcy5idWNrZXQuZ3JhbnRSZWFkKGdyYW50ZWUsIHRoaXMuZ2VuZXJhdGVTM1ByZWZpeEZvckdyYW50KCkpO1xuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnQgd3JpdGUgcGVybWlzc2lvbnMgdG8gdGhlIHRhYmxlIGFuZCB0aGUgdW5kZXJseWluZyBkYXRhIHN0b3JlZCBpbiBTMyB0byBhbiBJQU0gcHJpbmNpcGFsLlxuICAgKiBbZGlzYWJsZS1hd3NsaW50Om5vLWdyYW50c11cbiAgICpcbiAgICogQHBhcmFtIGdyYW50ZWUgdGhlIHByaW5jaXBhbFxuICAgKi9cbiAgQE1ldGhvZE1ldGFkYXRhKClcbiAgcHVibGljIGdyYW50V3JpdGUoZ3JhbnRlZTogaWFtLklHcmFudGFibGUpOiBpYW0uR3JhbnQge1xuICAgIGNvbnN0IHJldCA9IHRoaXMuZ3JhbnQoZ3JhbnRlZSwgd3JpdGVQZXJtaXNzaW9ucyk7XG4gICAgaWYgKHRoaXMuY2xpZW50U2lkZUVuY3J5cHRpb25LZXkpIHsgdGhpcy5jbGllbnRTaWRlRW5jcnlwdGlvbktleS5ncmFudEVuY3J5cHQoZ3JhbnRlZSk7IH1cbiAgICB0aGlzLmJ1Y2tldC5ncmFudFdyaXRlKGdyYW50ZWUsIHRoaXMuZ2VuZXJhdGVTM1ByZWZpeEZvckdyYW50KCkpO1xuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnQgcmVhZCBhbmQgd3JpdGUgcGVybWlzc2lvbnMgdG8gdGhlIHRhYmxlIGFuZCB0aGUgdW5kZXJseWluZyBkYXRhIHN0b3JlZCBpbiBTMyB0byBhbiBJQU0gcHJpbmNpcGFsLlxuICAgKiBbZGlzYWJsZS1hd3NsaW50Om5vLWdyYW50c11cbiAgICpcbiAgICogQHBhcmFtIGdyYW50ZWUgdGhlIHByaW5jaXBhbFxuICAgKi9cbiAgQE1ldGhvZE1ldGFkYXRhKClcbiAgcHVibGljIGdyYW50UmVhZFdyaXRlKGdyYW50ZWU6IGlhbS5JR3JhbnRhYmxlKTogaWFtLkdyYW50IHtcbiAgICBjb25zdCByZXQgPSB0aGlzLmdyYW50KGdyYW50ZWUsIFsuLi5yZWFkUGVybWlzc2lvbnMsIC4uLndyaXRlUGVybWlzc2lvbnNdKTtcbiAgICBpZiAodGhpcy5jbGllbnRTaWRlRW5jcnlwdGlvbktleSkgeyB0aGlzLmNsaWVudFNpZGVFbmNyeXB0aW9uS2V5LmdyYW50RW5jcnlwdERlY3J5cHQoZ3JhbnRlZSk7IH1cbiAgICB0aGlzLmJ1Y2tldC5ncmFudFJlYWRXcml0ZShncmFudGVlLCB0aGlzLmdlbmVyYXRlUzNQcmVmaXhGb3JHcmFudCgpKTtcbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgcHJvdGVjdGVkIGdlbmVyYXRlUzNQcmVmaXhGb3JHcmFudCgpIHtcbiAgICAvLyBXaGVuIHRoZSB1c2VyIHN1cHBsaWVkIHRoZWlyIG93biBidWNrZXQgYW5kIGRpZCBub3Qgc2NvcGUgdGhlIHRhYmxlIHRvIGFcbiAgICAvLyBwcmVmaXgsIHRoZSBncmFudCBjb3ZlcnMgZXZlcnkgb2JqZWN0IGluIHRoZSBidWNrZXQgLSB3aGljaCBtYXkgaW5jbHVkZVxuICAgIC8vIGRhdGEgb3duZWQgYnkgb3RoZXIgdGFibGVzIG9yIGNvbnN1bWVycyBzaGFyaW5nIHRoYXQgYnVja2V0LiBXYXJuIHNvIHRoZVxuICAgIC8vIG92ZXItZ3JhbnQgaXMgYSBkZWxpYmVyYXRlIGNob2ljZSByYXRoZXIgdGhhbiBhIHNpbGVudCBzdXJwcmlzZS5cbiAgICBpZiAodGhpcy51c2VyUHJvdmlkZWRCdWNrZXQgJiYgdGhpcy5zM1ByZWZpeCA9PT0gJycpIHtcbiAgICAgIEFubm90YXRpb25zLm9mKHRoaXMpLmFkZFdhcm5pbmdWMihcbiAgICAgICAgJ0Bhd3MtY2RrL2F3cy1nbHVlLWFscGhhOmdyYW50U2NvcGVkVG9XaG9sZUJ1Y2tldCcsXG4gICAgICAgICdncmFudGluZyBhY2Nlc3MgdG8gdGhlIGVudGlyZSBkYXRhIGJ1Y2tldCBiZWNhdXNlIGBzM1ByZWZpeGAgaXMgZW1wdHkgYW5kIGEgc2hhcmVkIGJ1Y2tldCB3YXMgcHJvdmlkZWQ7ICcgK1xuICAgICAgICAgICdzZXQgYHMzUHJlZml4YCB0byBzY29wZSBncmFudHMgdG8gdGhpcyB0YWJsZVxcJ3MgZGF0YSBhbmQgYXZvaWQgZ3JhbnRpbmcgYWNjZXNzIHRvIG90aGVyIHRhYmxlcyBzaGFyaW5nIHRoZSBidWNrZXQuJyxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnMzUHJlZml4ICsgJyonO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVNYW5hZ2VkQnVja2V0KGVuY3J5cHRpb24/OiBTM1RhYmxlRW5jcnlwdGlvbik6IHMzLkJ1Y2tldCB7XG4gICAgY29uc3QgZW5jID0gZW5jcnlwdGlvbiA/PyBTM1RhYmxlRW5jcnlwdGlvbi5zM01hbmFnZWQoKTtcbiAgICByZXR1cm4gbmV3IHMzLkJ1Y2tldCh0aGlzLCAnQnVja2V0Jywge1xuICAgICAgZW5jcnlwdGlvbjogZW5jLl9idWNrZXRFbmNyeXB0aW9uLFxuICAgICAgZW5jcnlwdGlvbktleTogZW5jLl9rbXNLZXksXG4gICAgICBlbmZvcmNlU1NMOiB0cnVlLFxuICAgIH0pO1xuICB9XG59XG5cbmNvbnN0IHJlYWRQZXJtaXNzaW9ucyA9IFtcbiAgJ2dsdWU6QmF0Y2hHZXRQYXJ0aXRpb24nLFxuICAnZ2x1ZTpHZXRQYXJ0aXRpb24nLFxuICAnZ2x1ZTpHZXRQYXJ0aXRpb25zJyxcbiAgJ2dsdWU6R2V0VGFibGUnLFxuICAnZ2x1ZTpHZXRUYWJsZXMnLFxuICAnZ2x1ZTpHZXRUYWJsZVZlcnNpb24nLFxuICAnZ2x1ZTpHZXRUYWJsZVZlcnNpb25zJyxcbl07XG5cbmNvbnN0IHdyaXRlUGVybWlzc2lvbnMgPSBbXG4gICdnbHVlOkJhdGNoQ3JlYXRlUGFydGl0aW9uJyxcbiAgJ2dsdWU6QmF0Y2hEZWxldGVQYXJ0aXRpb24nLFxuICAnZ2x1ZTpDcmVhdGVQYXJ0aXRpb24nLFxuICAnZ2x1ZTpEZWxldGVQYXJ0aXRpb24nLFxuICAnZ2x1ZTpVcGRhdGVQYXJ0aXRpb24nLFxuXTtcblxuZnVuY3Rpb24gcmVuZGVyQ29sdW1ucyhjb2x1bW5zPzogQ29sdW1uW10pIHtcbiAgaWYgKGNvbHVtbnMgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIGNvbHVtbnMubWFwKGNvbHVtbiA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IGNvbHVtbi5uYW1lLFxuICAgICAgdHlwZTogY29sdW1uLnR5cGUuaW5wdXRTdHJpbmcsXG4gICAgICBjb21tZW50OiBjb2x1bW4uY29tbWVudCxcbiAgICB9O1xuICB9KTtcbn1cbiJdfQ==
package/lib/schema.d.ts CHANGED
@@ -18,9 +18,19 @@ export interface Column {
18
18
  readonly comment?: string;
19
19
  }
20
20
  /**
21
- * Represents a type of a column in a table schema.
21
+ * The type of a column in a table schema.
22
+ *
23
+ * Instances are opaque: obtain one from a `Schema` factory (for example
24
+ * `Schema.STRING`, `Schema.decimal(...)`, `Schema.array(...)`) or, for a type the
25
+ * `Schema` factories don't model, from `Schema.custom(...)`.
22
26
  */
23
- export interface Type {
27
+ export declare class Type {
28
+ /**
29
+ * Create a `Type` from its parts.
30
+ *
31
+ * @internal
32
+ */
33
+ static _of(inputString: string, isPrimitive: boolean): Type;
24
34
  /**
25
35
  * Indicates whether this type is a primitive data type.
26
36
  */
@@ -29,6 +39,7 @@ export interface Type {
29
39
  * Glue InputString for this type.
30
40
  */
31
41
  readonly inputString: string;
42
+ private constructor();
32
43
  }
33
44
  /**
34
45
  * @see https://docs.aws.amazon.com/athena/latest/ug/data-types.html
@@ -69,10 +80,9 @@ export declare class Schema {
69
80
  /**
70
81
  * Creates a decimal type.
71
82
  *
72
- * TODO: Bounds
73
- *
74
- * @param precision the total number of digits
75
- * @param scale the number of digits in fractional part, the default is 0
83
+ * @param precision the total number of digits, between 1 and 38
84
+ * @param scale the number of digits in the fractional part, between 0 and 38; the default is 0
85
+ * @see https://docs.aws.amazon.com/athena/latest/ug/data-types.html
76
86
  */
77
87
  static decimal(precision: number, scale?: number): Type;
78
88
  /**
@@ -106,4 +116,14 @@ export declare class Schema {
106
116
  * @param columns the columns of the structure.
107
117
  */
108
118
  static struct(columns: Column[]): Type;
119
+ /**
120
+ * Creates a custom type from a raw Glue input string.
121
+ *
122
+ * Escape hatch for column types the other `Schema` factories don't model. The
123
+ * `inputString` is emitted verbatim and is not validated.
124
+ *
125
+ * @param inputString the Glue input string for the type (for example `interval_day_to_second`).
126
+ * @param isPrimitive whether the type is a primitive (non-nested) data type. Defaults to true.
127
+ */
128
+ static custom(inputString: string, isPrimitive?: boolean): Type;
109
129
  }