@aws-cdk/aws-s3tables-alpha 2.269.0-alpha.0 → 2.271.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.
package/.jsii CHANGED
@@ -8,7 +8,7 @@
8
8
  "url": "https://aws.amazon.com"
9
9
  },
10
10
  "dependencies": {
11
- "aws-cdk-lib": "^2.269.0",
11
+ "aws-cdk-lib": "^2.271.0",
12
12
  "constructs": "^10.5.0"
13
13
  },
14
14
  "dependencyClosure": {
@@ -9614,7 +9614,7 @@
9614
9614
  },
9615
9615
  "name": "@aws-cdk/aws-s3tables-alpha",
9616
9616
  "readme": {
9617
- "markdown": "# Amazon S3 Tables Construct Library\n<!--BEGIN STABILITY BANNER-->\n\n---\n\n![cdk-constructs: Experimental](https://img.shields.io/badge/cdk--constructs-experimental-important.svg?style=for-the-badge)\n\n> The APIs of higher level constructs in this module are experimental and under active development.\n> They are subject to non-backward compatible changes or removal in any future version. These are\n> not subject to the [Semantic Versioning](https://semver.org/) model and breaking changes will be\n> announced in the release notes. This means that while you may use them, you may need to update\n> your source code when upgrading to a newer version of this package.\n\n---\n\n<!--END STABILITY BANNER-->\n\n## Amazon S3 Tables\n\nAmazon S3 Tables deliver the first cloud object store with built-in Apache Iceberg support and streamline storing tabular data at scale.\n\n[Product Page](https://aws.amazon.com/s3/features/tables/) | [User Guide](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables.html)\n\n\n## Usage\n\n### Define an S3 Table Bucket\n\n```ts\n// Build a Table bucket\nconst sampleTableBucket = new TableBucket(scope, 'ExampleTableBucket', {\n tableBucketName: 'example-bucket-1',\n // optional fields:\n unreferencedFileRemoval: {\n status: UnreferencedFileRemovalStatus.ENABLED,\n noncurrentDays: 20,\n unreferencedDays: 20,\n }\n});\n```\n\n### Define an S3 Tables Namespace\n\n```ts\n// Build a namespace\nconst sampleNamespace = new Namespace(scope, 'ExampleNamespace', {\n namespaceName: 'example-namespace-1',\n tableBucket: tableBucket,\n});\n```\n\n### Define an S3 Table\n\n```ts\n// Build a table\nconst sampleTable = new Table(scope, 'ExampleTable', {\n tableName: 'example_table',\n namespace: namespace,\n openTableFormat: OpenTableFormat.ICEBERG,\n withoutMetadata: true,\n});\n\n// Build a table with an Iceberg Schema\nconst sampleTableWithSchema = new Table(scope, 'ExampleSchemaTable', {\n tableName: 'example_table_with_schema',\n namespace: namespace,\n openTableFormat: OpenTableFormat.ICEBERG,\n icebergMetadata: {\n icebergSchema: {\n schemaFieldList: [\n {\n name: 'id',\n type: 'int',\n required: true,\n },\n {\n name: 'name',\n type: 'string',\n },\n ],\n },\n },\n compaction: {\n status: Status.ENABLED,\n targetFileSizeMb: 128,\n },\n snapshotManagement: {\n status: Status.ENABLED,\n maxSnapshotAgeHours: 48,\n minSnapshotsToKeep: 5,\n },\n});\n```\n\nLearn more about table buckets maintenance operations and default behavior from the [S3 Tables User Guide](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-table-buckets-maintenance.html)\n\n### Advanced Iceberg Table Configuration\n\nYou can configure partition specifications, sort orders, and table properties for optimized query performance.\n\nThe simplest way to add partitioning to your table:\n\n```ts\n// Build a table with partition spec (minimal configuration)\nconst partitionedTable = new Table(scope, 'PartitionedTable', {\n tableName: 'partitioned_table',\n namespace: namespace,\n openTableFormat: OpenTableFormat.ICEBERG,\n icebergMetadata: {\n icebergSchema: {\n schemaFieldList: [\n { name: 'event_date', type: 'date', required: true },\n { name: 'event_name', type: 'string' },\n ],\n },\n icebergPartitionSpec: {\n fields: [\n {\n sourceId: 1,\n transform: IcebergTransform.IDENTITY,\n name: 'date_partition',\n },\n ],\n },\n },\n});\n```\n\nFor full control, you can also configure sort orders and table properties:\n\n```ts\n// Build a table with partition spec, sort order, and table properties\nconst advancedTable = new Table(scope, 'AdvancedTable', {\n tableName: 'advanced_table',\n namespace: namespace,\n openTableFormat: OpenTableFormat.ICEBERG,\n icebergMetadata: {\n icebergSchema: {\n schemaFieldList: [\n { id: 1, name: 'event_date', type: 'date', required: true },\n { id: 2, name: 'user_id', type: 'string', required: true },\n ],\n },\n icebergPartitionSpec: {\n specId: 0,\n fields: [\n {\n sourceId: 1,\n transform: IcebergTransform.IDENTITY,\n name: 'date_partition',\n fieldId: 1000,\n },\n ],\n },\n icebergSortOrder: {\n orderId: 1,\n fields: [\n {\n sourceId: 1,\n transform: IcebergTransform.IDENTITY,\n direction: SortDirection.ASC,\n nullOrder: NullOrder.NULLS_LAST,\n },\n ],\n },\n tableProperties: [\n { key: 'write.format.default', value: 'parquet' },\n ],\n },\n});\n```\n\n### Controlling Table Bucket Permissions\n\n```ts\n// Grant the principal read permissions to the bucket and all tables within\nconst accountId = '123456789012'\ntableBucket.grantRead(new iam.AccountPrincipal(accountId), '*');\n\n// Grant the role write permissions to the bucket and all tables within\nconst role = new iam.Role(stack, 'MyRole', { assumedBy: new iam.ServicePrincipal('sample') });\ntableBucket.grantWrite(role, '*');\n\n// Grant the user read and write permissions to the bucket and all tables within\ntableBucket.grantReadWrite(new iam.User(stack, 'MyUser'), '*');\n\n// Grant permissions to the bucket and a particular table within it\nconst tableId = '6ba046b2-26de-44cf-9144-0c7862593a7b'\ntableBucket.grantReadWrite(new iam.AccountPrincipal(accountId), tableId);\n\n// Add custom resource policy statements\nconst permissions = new iam.PolicyStatement({\n effect: iam.Effect.ALLOW,\n actions: ['s3tables:*'],\n principals: [ new iam.ServicePrincipal('example.aws.internal') ],\n resources: ['*']\n});\n\ntableBucket.addToResourcePolicy(permissions);\n```\n\n### Controlling Table Bucket Encryption Settings\n\nS3 TableBuckets have SSE (server-side encryption with AES-256) enabled by default with S3 managed keys.\nYou can also bring your own KMS key for KMS-SSE or have S3 create a KMS key for you.\n\nIf a bucket is encrypted with KMS, grant functions on the bucket will also grant access\nto the TableBucket's associated KMS key.\n\n```ts\n// Provide a user defined KMS Key:\nconst key = new kms.Key(scope, 'UserKey', {});\nconst encryptedBucket = new TableBucket(scope, 'EncryptedTableBucket', {\n tableBucketName: 'table-bucket-1',\n encryption: TableBucketEncryption.KMS,\n encryptionKey: key,\n});\n// This account principal will also receive kms:Decrypt access to the KMS key\nencryptedBucket.grantRead(new iam.AccountPrincipal('123456789012'), '*');\n\n// Use S3 managed server side encryption (default)\nconst encryptedBucketDefault = new TableBucket(scope, 'EncryptedTableBucketDefault', {\n tableBucketName: 'table-bucket-3',\n encryption: TableBucketEncryption.S3_MANAGED, // Uses AES-256 encryption by default\n});\n```\n\nWhen using KMS encryption (`TableBucketEncryption.KMS`), if no encryption key is provided, CDK will automatically create a new KMS key for the table bucket with necessary permissions.\n\n```ts\n// If no key is provided, one will be created automatically\nconst encryptedBucketAuto = new TableBucket(scope, 'EncryptedTableBucketAuto', {\n tableBucketName: 'table-bucket-2',\n encryption: TableBucketEncryption.KMS,\n});\n```\n\n### Enabling CloudWatch Request Metrics\n\nYou can enable CloudWatch request metrics for your table bucket. Request metrics provide insight into Amazon S3 Tables requests, helping you monitor and optimize your table bucket usage.\n\nFor more information about S3 Tables CloudWatch metrics, see the [S3 Tables CloudWatch Metrics documentation](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-cloudwatch-metrics.html).\n\n```ts\n// Enable CloudWatch request metrics for the table bucket\nconst tableBucketWithMetrics = new TableBucket(scope, 'TableBucketWithMetrics', {\n tableBucketName: 'metrics-enabled-bucket',\n requestMetricsStatus: RequestMetricsStatus.ENABLED,\n});\n```\n\n### Configuring Storage Class\n\nYou can configure the storage class for your table bucket and tables. Storage class determines how data is stored and billed, allowing you to optimize for different access patterns.\n\n```ts\n// Create a table bucket with INTELLIGENT_TIERING storage class\nconst tableBucketWithStorageClass = new TableBucket(scope, 'TableBucketWithStorageClass', {\n tableBucketName: 'storage-class-bucket',\n storageClass: StorageClass.INTELLIGENT_TIERING,\n});\n```\n\nTables inherit the storage class from their parent bucket by default. You can also override the storage class at the table level:\n\n```ts\n// Create a table with explicit storage class (overrides bucket default)\nconst tableWithStorageClass = new Table(scope, 'TableWithStorageClass', {\n tableName: 'storage_class_table',\n namespace: namespace,\n openTableFormat: OpenTableFormat.ICEBERG,\n withoutMetadata: true,\n storageClass: StorageClass.STANDARD,\n});\n```\n\nAvailable storage classes:\n\n- `StorageClass.STANDARD` - For frequently accessed data\n- `StorageClass.INTELLIGENT_TIERING` - Automatically moves data between access tiers based on usage patterns\n\nNote: Table storage class is a create-only property and cannot be changed after the table is created.\n\n### Controlling Table Permissions\n\n```ts\n// Grant the principal read permissions to the table\nconst accountId = '123456789012'\ntable.grantRead(new iam.AccountPrincipal(accountId));\n\n// Grant the role write permissions to the table\nconst role = new iam.Role(stack, 'MyRole', { assumedBy: new iam.ServicePrincipal('sample') });\ntable.grantWrite(role);\n\n// Grant the user read and write permissions to the table\ntable.grantReadWrite(new iam.User(stack, 'MyUser'));\n\n// Grant an account permissions to the table\ntable.grantReadWrite(new iam.AccountPrincipal(accountId));\n\n// Add custom resource policy statements\nconst permissions = new iam.PolicyStatement({\n effect: iam.Effect.ALLOW,\n actions: ['s3tables:*'],\n principals: [ new iam.ServicePrincipal('example.aws.internal') ],\n resources: ['*']\n});\n\ntable.addToResourcePolicy(permissions);\n```\n\n### Tagging\n\nBoth `TableBucket` and `Table` support tagging through CDK's standard tagging mechanism:\n\n```ts\nTags.of(tableBucket).add('Environment', 'Production');\nTags.of(table).add('Team', 'DataEngineering');\n\n// Stack-level tags propagate to all resources\nTags.of(stack).add('Project', 'DataLake');\n```\n\n## Coming Soon\n\nL2 Construct support for:\n\n- KMS encryption support for Tables\n"
9617
+ "markdown": "# Amazon S3 Tables Construct Library\n<!--BEGIN STABILITY BANNER-->\n\n---\n\n![cdk-constructs: Experimental](https://img.shields.io/badge/cdk--constructs-experimental-important.svg?style=for-the-badge)\n\n> The APIs of higher level constructs in this module are experimental and under active development.\n> They are subject to non-backward compatible changes or removal in any future version. These are\n> not subject to the [Semantic Versioning](https://semver.org/) model and breaking changes will be\n> announced in the release notes. This means that while you may use them, you may need to update\n> your source code when upgrading to a newer version of this package.\n\n---\n\n<!--END STABILITY BANNER-->\n\n## Amazon S3 Tables\n\nAmazon S3 Tables deliver the first cloud object store with built-in Apache Iceberg support and streamline storing tabular data at scale.\n\n[Product Page](https://aws.amazon.com/s3/features/tables/) | [User Guide](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables.html)\n\n\n## Usage\n\n### Define an S3 Table Bucket\n\n```ts\n// Build a Table bucket\nconst sampleTableBucket = new TableBucket(scope, 'ExampleTableBucket', {\n // optional fields:\n tableBucketName: 'example-bucket-1', // if omitted, CDK generates a unique name that satisfies the S3 Tables naming rules\n unreferencedFileRemoval: {\n status: UnreferencedFileRemovalStatus.ENABLED,\n noncurrentDays: 20,\n unreferencedDays: 20,\n }\n});\n```\n\nWhen `tableBucketName` is omitted, CDK derives the name from the stack name and the\nconstruct path. Because the path is part of the input, the generated name is **not\nstable across stack or construct renames** — renaming or moving the construct will\nproduce a different name and replace the bucket. If you need a fixed, predictable\nname (for example, to reference the bucket from outside CDK or across separate\ndeployments), pass `tableBucketName` explicitly.\n\n### Define an S3 Tables Namespace\n\n```ts\n// Build a namespace\nconst sampleNamespace = new Namespace(scope, 'ExampleNamespace', {\n namespaceName: 'example-namespace-1',\n tableBucket: tableBucket,\n});\n```\n\n### Define an S3 Table\n\n```ts\n// Build a table\nconst sampleTable = new Table(scope, 'ExampleTable', {\n tableName: 'example_table',\n namespace: namespace,\n openTableFormat: OpenTableFormat.ICEBERG,\n withoutMetadata: true,\n});\n\n// Build a table with an Iceberg Schema\nconst sampleTableWithSchema = new Table(scope, 'ExampleSchemaTable', {\n tableName: 'example_table_with_schema',\n namespace: namespace,\n openTableFormat: OpenTableFormat.ICEBERG,\n icebergMetadata: {\n icebergSchema: {\n schemaFieldList: [\n {\n name: 'id',\n type: 'int',\n required: true,\n },\n {\n name: 'name',\n type: 'string',\n },\n ],\n },\n },\n compaction: {\n status: Status.ENABLED,\n targetFileSizeMb: 128,\n },\n snapshotManagement: {\n status: Status.ENABLED,\n maxSnapshotAgeHours: 48,\n minSnapshotsToKeep: 5,\n },\n});\n```\n\nLearn more about table buckets maintenance operations and default behavior from the [S3 Tables User Guide](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-table-buckets-maintenance.html)\n\n### Advanced Iceberg Table Configuration\n\nYou can configure partition specifications, sort orders, and table properties for optimized query performance.\n\nThe simplest way to add partitioning to your table:\n\n```ts\n// Build a table with partition spec (minimal configuration)\nconst partitionedTable = new Table(scope, 'PartitionedTable', {\n tableName: 'partitioned_table',\n namespace: namespace,\n openTableFormat: OpenTableFormat.ICEBERG,\n icebergMetadata: {\n icebergSchema: {\n schemaFieldList: [\n { name: 'event_date', type: 'date', required: true },\n { name: 'event_name', type: 'string' },\n ],\n },\n icebergPartitionSpec: {\n fields: [\n {\n sourceId: 1,\n transform: IcebergTransform.IDENTITY,\n name: 'date_partition',\n },\n ],\n },\n },\n});\n```\n\nFor full control, you can also configure sort orders and table properties:\n\n```ts\n// Build a table with partition spec, sort order, and table properties\nconst advancedTable = new Table(scope, 'AdvancedTable', {\n tableName: 'advanced_table',\n namespace: namespace,\n openTableFormat: OpenTableFormat.ICEBERG,\n icebergMetadata: {\n icebergSchema: {\n schemaFieldList: [\n { id: 1, name: 'event_date', type: 'date', required: true },\n { id: 2, name: 'user_id', type: 'string', required: true },\n ],\n },\n icebergPartitionSpec: {\n specId: 0,\n fields: [\n {\n sourceId: 1,\n transform: IcebergTransform.IDENTITY,\n name: 'date_partition',\n fieldId: 1000,\n },\n ],\n },\n icebergSortOrder: {\n orderId: 1,\n fields: [\n {\n sourceId: 1,\n transform: IcebergTransform.IDENTITY,\n direction: SortDirection.ASC,\n nullOrder: NullOrder.NULLS_LAST,\n },\n ],\n },\n tableProperties: [\n { key: 'write.format.default', value: 'parquet' },\n ],\n },\n});\n```\n\n### Controlling Table Bucket Permissions\n\n```ts\n// Grant the principal read permissions to the bucket and all tables within\nconst accountId = '123456789012'\ntableBucket.grantRead(new iam.AccountPrincipal(accountId), '*');\n\n// Grant the role write permissions to the bucket and all tables within\nconst role = new iam.Role(stack, 'MyRole', { assumedBy: new iam.ServicePrincipal('sample') });\ntableBucket.grantWrite(role, '*');\n\n// Grant the user read and write permissions to the bucket and all tables within\ntableBucket.grantReadWrite(new iam.User(stack, 'MyUser'), '*');\n\n// Grant permissions to the bucket and a particular table within it\nconst tableId = '6ba046b2-26de-44cf-9144-0c7862593a7b'\ntableBucket.grantReadWrite(new iam.AccountPrincipal(accountId), tableId);\n\n// Add custom resource policy statements\nconst permissions = new iam.PolicyStatement({\n effect: iam.Effect.ALLOW,\n actions: ['s3tables:*'],\n principals: [ new iam.ServicePrincipal('example.aws.internal') ],\n resources: ['*']\n});\n\ntableBucket.addToResourcePolicy(permissions);\n```\n\n### Controlling Table Bucket Encryption Settings\n\nS3 TableBuckets have SSE (server-side encryption with AES-256) enabled by default with S3 managed keys.\nYou can also bring your own KMS key for KMS-SSE or have S3 create a KMS key for you.\n\nIf a bucket is encrypted with KMS, grant functions on the bucket will also grant access\nto the TableBucket's associated KMS key.\n\n```ts\n// Provide a user defined KMS Key:\nconst key = new kms.Key(scope, 'UserKey', {});\nconst encryptedBucket = new TableBucket(scope, 'EncryptedTableBucket', {\n tableBucketName: 'table-bucket-1',\n encryption: TableBucketEncryption.KMS,\n encryptionKey: key,\n});\n// This account principal will also receive kms:Decrypt access to the KMS key\nencryptedBucket.grantRead(new iam.AccountPrincipal('123456789012'), '*');\n\n// Use S3 managed server side encryption (default)\nconst encryptedBucketDefault = new TableBucket(scope, 'EncryptedTableBucketDefault', {\n tableBucketName: 'table-bucket-3',\n encryption: TableBucketEncryption.S3_MANAGED, // Uses AES-256 encryption by default\n});\n```\n\nWhen using KMS encryption (`TableBucketEncryption.KMS`), if no encryption key is provided, CDK will automatically create a new KMS key for the table bucket with necessary permissions.\n\n```ts\n// If no key is provided, one will be created automatically\nconst encryptedBucketAuto = new TableBucket(scope, 'EncryptedTableBucketAuto', {\n tableBucketName: 'table-bucket-2',\n encryption: TableBucketEncryption.KMS,\n});\n```\n\n### Enabling CloudWatch Request Metrics\n\nYou can enable CloudWatch request metrics for your table bucket. Request metrics provide insight into Amazon S3 Tables requests, helping you monitor and optimize your table bucket usage.\n\nFor more information about S3 Tables CloudWatch metrics, see the [S3 Tables CloudWatch Metrics documentation](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-cloudwatch-metrics.html).\n\n```ts\n// Enable CloudWatch request metrics for the table bucket\nconst tableBucketWithMetrics = new TableBucket(scope, 'TableBucketWithMetrics', {\n tableBucketName: 'metrics-enabled-bucket',\n requestMetricsStatus: RequestMetricsStatus.ENABLED,\n});\n```\n\n### Configuring Storage Class\n\nYou can configure the storage class for your table bucket and tables. Storage class determines how data is stored and billed, allowing you to optimize for different access patterns.\n\n```ts\n// Create a table bucket with INTELLIGENT_TIERING storage class\nconst tableBucketWithStorageClass = new TableBucket(scope, 'TableBucketWithStorageClass', {\n tableBucketName: 'storage-class-bucket',\n storageClass: StorageClass.INTELLIGENT_TIERING,\n});\n```\n\nTables inherit the storage class from their parent bucket by default. You can also override the storage class at the table level:\n\n```ts\n// Create a table with explicit storage class (overrides bucket default)\nconst tableWithStorageClass = new Table(scope, 'TableWithStorageClass', {\n tableName: 'storage_class_table',\n namespace: namespace,\n openTableFormat: OpenTableFormat.ICEBERG,\n withoutMetadata: true,\n storageClass: StorageClass.STANDARD,\n});\n```\n\nAvailable storage classes:\n\n- `StorageClass.STANDARD` - For frequently accessed data\n- `StorageClass.INTELLIGENT_TIERING` - Automatically moves data between access tiers based on usage patterns\n\nNote: Table storage class is a create-only property and cannot be changed after the table is created.\n\n### Controlling Table Permissions\n\n```ts\n// Grant the principal read permissions to the table\nconst accountId = '123456789012'\ntable.grantRead(new iam.AccountPrincipal(accountId));\n\n// Grant the role write permissions to the table\nconst role = new iam.Role(stack, 'MyRole', { assumedBy: new iam.ServicePrincipal('sample') });\ntable.grantWrite(role);\n\n// Grant the user read and write permissions to the table\ntable.grantReadWrite(new iam.User(stack, 'MyUser'));\n\n// Grant an account permissions to the table\ntable.grantReadWrite(new iam.AccountPrincipal(accountId));\n\n// Add custom resource policy statements\nconst permissions = new iam.PolicyStatement({\n effect: iam.Effect.ALLOW,\n actions: ['s3tables:*'],\n principals: [ new iam.ServicePrincipal('example.aws.internal') ],\n resources: ['*']\n});\n\ntable.addToResourcePolicy(permissions);\n```\n\n### Tagging\n\nBoth `TableBucket` and `Table` support tagging through CDK's standard tagging mechanism:\n\n```ts\nTags.of(tableBucket).add('Environment', 'Production');\nTags.of(table).add('Team', 'DataEngineering');\n\n// Stack-level tags propagate to all resources\nTags.of(stack).add('Project', 'DataLake');\n```\n\n## Coming Soon\n\nL2 Construct support for:\n\n- KMS encryption support for Tables\n"
9618
9618
  },
9619
9619
  "repository": {
9620
9620
  "directory": "packages/@aws-cdk/aws-s3tables-alpha",
@@ -11987,7 +11987,7 @@
11987
11987
  },
11988
11988
  "locationInModule": {
11989
11989
  "filename": "lib/table-bucket.ts",
11990
- "line": 646
11990
+ "line": 652
11991
11991
  },
11992
11992
  "parameters": [
11993
11993
  {
@@ -12004,6 +12004,7 @@
12004
12004
  },
12005
12005
  {
12006
12006
  "name": "props",
12007
+ "optional": true,
12007
12008
  "type": {
12008
12009
  "fqn": "@aws-cdk/aws-s3tables-alpha.TableBucketProps"
12009
12010
  }
@@ -12017,7 +12018,7 @@
12017
12018
  "kind": "class",
12018
12019
  "locationInModule": {
12019
12020
  "filename": "lib/table-bucket.ts",
12020
- "line": 467
12021
+ "line": 473
12021
12022
  },
12022
12023
  "methods": [
12023
12024
  {
@@ -12027,7 +12028,7 @@
12027
12028
  },
12028
12029
  "locationInModule": {
12029
12030
  "filename": "lib/table-bucket.ts",
12030
- "line": 479
12031
+ "line": 485
12031
12032
  },
12032
12033
  "name": "fromTableBucketArn",
12033
12034
  "parameters": [
@@ -12073,7 +12074,7 @@
12073
12074
  },
12074
12075
  "locationInModule": {
12075
12076
  "filename": "lib/table-bucket.ts",
12076
- "line": 490
12077
+ "line": 496
12077
12078
  },
12078
12079
  "name": "fromTableBucketAttributes",
12079
12080
  "parameters": [
@@ -12120,7 +12121,7 @@
12120
12121
  },
12121
12122
  "locationInModule": {
12122
12123
  "filename": "lib/table-bucket.ts",
12123
- "line": 526
12124
+ "line": 532
12124
12125
  },
12125
12126
  "name": "validateTableBucketName",
12126
12127
  "parameters": [
@@ -12144,7 +12145,7 @@
12144
12145
  },
12145
12146
  "locationInModule": {
12146
12147
  "filename": "lib/table-bucket.ts",
12147
- "line": 583
12148
+ "line": 589
12148
12149
  },
12149
12150
  "name": "validateUnreferencedFileRemoval",
12150
12151
  "parameters": [
@@ -12296,7 +12297,7 @@
12296
12297
  "immutable": true,
12297
12298
  "locationInModule": {
12298
12299
  "filename": "lib/table-bucket.ts",
12299
- "line": 470
12300
+ "line": 476
12300
12301
  },
12301
12302
  "name": "PROPERTY_INJECTION_ID",
12302
12303
  "static": true,
@@ -12312,7 +12313,7 @@
12312
12313
  "immutable": true,
12313
12314
  "locationInModule": {
12314
12315
  "filename": "lib/table-bucket.ts",
12315
- "line": 635
12316
+ "line": 641
12316
12317
  },
12317
12318
  "name": "cdkTagManager",
12318
12319
  "overrides": "aws-cdk-lib.ITaggableV2",
@@ -12328,7 +12329,7 @@
12328
12329
  "immutable": true,
12329
12330
  "locationInModule": {
12330
12331
  "filename": "lib/table-bucket.ts",
12331
- "line": 686
12332
+ "line": 698
12332
12333
  },
12333
12334
  "name": "tableBucketArn",
12334
12335
  "overrides": "@aws-cdk/aws-s3tables-alpha.ITableBucket",
@@ -12344,7 +12345,7 @@
12344
12345
  "immutable": true,
12345
12346
  "locationInModule": {
12346
12347
  "filename": "lib/table-bucket.ts",
12347
- "line": 678
12348
+ "line": 690
12348
12349
  },
12349
12350
  "name": "tableBucketName",
12350
12351
  "overrides": "@aws-cdk/aws-s3tables-alpha.ITableBucket",
@@ -12360,7 +12361,7 @@
12360
12361
  "immutable": true,
12361
12362
  "locationInModule": {
12362
12363
  "filename": "lib/table-bucket.ts",
12363
- "line": 642
12364
+ "line": 648
12364
12365
  },
12365
12366
  "name": "encryptionKey",
12366
12367
  "optional": true,
@@ -12377,7 +12378,7 @@
12377
12378
  "immutable": true,
12378
12379
  "locationInModule": {
12379
12380
  "filename": "lib/table-bucket.ts",
12380
- "line": 640
12381
+ "line": 646
12381
12382
  },
12382
12383
  "name": "tableBucketPolicy",
12383
12384
  "optional": true,
@@ -12392,7 +12393,7 @@
12392
12393
  },
12393
12394
  "locationInModule": {
12394
12395
  "filename": "lib/table-bucket.ts",
12395
- "line": 644
12396
+ "line": 650
12396
12397
  },
12397
12398
  "name": "autoCreatePolicy",
12398
12399
  "protected": true,
@@ -12419,7 +12420,7 @@
12419
12420
  "kind": "interface",
12420
12421
  "locationInModule": {
12421
12422
  "filename": "lib/table-bucket.ts",
12422
- "line": 418
12423
+ "line": 424
12423
12424
  },
12424
12425
  "name": "TableBucketAttributes",
12425
12426
  "properties": [
@@ -12433,7 +12434,7 @@
12433
12434
  "immutable": true,
12434
12435
  "locationInModule": {
12435
12436
  "filename": "lib/table-bucket.ts",
12436
- "line": 429
12437
+ "line": 435
12437
12438
  },
12438
12439
  "name": "account",
12439
12440
  "optional": true,
@@ -12451,7 +12452,7 @@
12451
12452
  "immutable": true,
12452
12453
  "locationInModule": {
12453
12454
  "filename": "lib/table-bucket.ts",
12454
- "line": 447
12455
+ "line": 453
12455
12456
  },
12456
12457
  "name": "encryptionKey",
12457
12458
  "optional": true,
@@ -12469,7 +12470,7 @@
12469
12470
  "immutable": true,
12470
12471
  "locationInModule": {
12471
12472
  "filename": "lib/table-bucket.ts",
12472
- "line": 423
12473
+ "line": 429
12473
12474
  },
12474
12475
  "name": "region",
12475
12476
  "optional": true,
@@ -12487,7 +12488,7 @@
12487
12488
  "immutable": true,
12488
12489
  "locationInModule": {
12489
12490
  "filename": "lib/table-bucket.ts",
12490
- "line": 441
12491
+ "line": 447
12491
12492
  },
12492
12493
  "name": "tableBucketArn",
12493
12494
  "optional": true,
@@ -12505,7 +12506,7 @@
12505
12506
  "immutable": true,
12506
12507
  "locationInModule": {
12507
12508
  "filename": "lib/table-bucket.ts",
12508
- "line": 435
12509
+ "line": 441
12509
12510
  },
12510
12511
  "name": "tableBucketName",
12511
12512
  "optional": true,
@@ -12715,7 +12716,7 @@
12715
12716
  "docs": {
12716
12717
  "stability": "experimental",
12717
12718
  "summary": "Parameters for constructing a TableBucket.",
12718
- "example": "// Build a Table bucket\nconst sampleTableBucket = new TableBucket(scope, 'ExampleTableBucket', {\n tableBucketName: 'example-bucket-1',\n // optional fields:\n unreferencedFileRemoval: {\n status: UnreferencedFileRemovalStatus.ENABLED,\n noncurrentDays: 20,\n unreferencedDays: 20,\n }\n});",
12719
+ "example": "// Build a Table bucket\nconst sampleTableBucket = new TableBucket(scope, 'ExampleTableBucket', {\n // optional fields:\n tableBucketName: 'example-bucket-1', // if omitted, CDK generates a unique name that satisfies the S3 Tables naming rules\n unreferencedFileRemoval: {\n status: UnreferencedFileRemovalStatus.ENABLED,\n noncurrentDays: 20,\n unreferencedDays: 20,\n }\n});",
12719
12720
  "custom": {
12720
12721
  "exampleMetadata": "infused"
12721
12722
  }
@@ -12728,25 +12729,6 @@
12728
12729
  },
12729
12730
  "name": "TableBucketProps",
12730
12731
  "properties": [
12731
- {
12732
- "abstract": true,
12733
- "docs": {
12734
- "custom": {
12735
- "link": "https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-buckets-naming.html#table-buckets-naming-rules"
12736
- },
12737
- "stability": "experimental",
12738
- "summary": "Name of the S3 TableBucket."
12739
- },
12740
- "immutable": true,
12741
- "locationInModule": {
12742
- "filename": "lib/table-bucket.ts",
12743
- "line": 339
12744
- },
12745
- "name": "tableBucketName",
12746
- "type": {
12747
- "primitive": "string"
12748
- }
12749
- },
12750
12732
  {
12751
12733
  "abstract": true,
12752
12734
  "docs": {
@@ -12757,7 +12739,7 @@
12757
12739
  "immutable": true,
12758
12740
  "locationInModule": {
12759
12741
  "filename": "lib/table-bucket.ts",
12760
- "line": 361
12742
+ "line": 367
12761
12743
  },
12762
12744
  "name": "account",
12763
12745
  "optional": true,
@@ -12776,7 +12758,7 @@
12776
12758
  "immutable": true,
12777
12759
  "locationInModule": {
12778
12760
  "filename": "lib/table-bucket.ts",
12779
- "line": 371
12761
+ "line": 377
12780
12762
  },
12781
12763
  "name": "encryption",
12782
12764
  "optional": true,
@@ -12795,7 +12777,7 @@
12795
12777
  "immutable": true,
12796
12778
  "locationInModule": {
12797
12779
  "filename": "lib/table-bucket.ts",
12798
- "line": 382
12780
+ "line": 388
12799
12781
  },
12800
12782
  "name": "encryptionKey",
12801
12783
  "optional": true,
@@ -12813,7 +12795,7 @@
12813
12795
  "immutable": true,
12814
12796
  "locationInModule": {
12815
12797
  "filename": "lib/table-bucket.ts",
12816
- "line": 354
12798
+ "line": 360
12817
12799
  },
12818
12800
  "name": "region",
12819
12801
  "optional": true,
@@ -12831,7 +12813,7 @@
12831
12813
  "immutable": true,
12832
12814
  "locationInModule": {
12833
12815
  "filename": "lib/table-bucket.ts",
12834
- "line": 389
12816
+ "line": 395
12835
12817
  },
12836
12818
  "name": "removalPolicy",
12837
12819
  "optional": true,
@@ -12850,7 +12832,7 @@
12850
12832
  "immutable": true,
12851
12833
  "locationInModule": {
12852
12834
  "filename": "lib/table-bucket.ts",
12853
- "line": 399
12835
+ "line": 405
12854
12836
  },
12855
12837
  "name": "requestMetricsStatus",
12856
12838
  "optional": true,
@@ -12869,7 +12851,7 @@
12869
12851
  "immutable": true,
12870
12852
  "locationInModule": {
12871
12853
  "filename": "lib/table-bucket.ts",
12872
- "line": 409
12854
+ "line": 415
12873
12855
  },
12874
12856
  "name": "storageClass",
12875
12857
  "optional": true,
@@ -12877,6 +12859,27 @@
12877
12859
  "fqn": "@aws-cdk/aws-s3tables-alpha.StorageClass"
12878
12860
  }
12879
12861
  },
12862
+ {
12863
+ "abstract": true,
12864
+ "docs": {
12865
+ "custom": {
12866
+ "link": "https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-buckets-naming.html#table-buckets-naming-rules\n\nWhen omitted, the auto-generated name is derived from the construct path and is\ntherefore not stable across stack or construct renames — pass an explicit name\nwhen you need a fixed identifier across deployments."
12867
+ },
12868
+ "default": "- generated by CDK from the stack and construct path.",
12869
+ "stability": "experimental",
12870
+ "summary": "Name of the S3 TableBucket."
12871
+ },
12872
+ "immutable": true,
12873
+ "locationInModule": {
12874
+ "filename": "lib/table-bucket.ts",
12875
+ "line": 345
12876
+ },
12877
+ "name": "tableBucketName",
12878
+ "optional": true,
12879
+ "type": {
12880
+ "primitive": "string"
12881
+ }
12882
+ },
12880
12883
  {
12881
12884
  "abstract": true,
12882
12885
  "docs": {
@@ -12891,7 +12894,7 @@
12891
12894
  "immutable": true,
12892
12895
  "locationInModule": {
12893
12896
  "filename": "lib/table-bucket.ts",
12894
- "line": 347
12897
+ "line": 353
12895
12898
  },
12896
12899
  "name": "unreferencedFileRemoval",
12897
12900
  "optional": true,
@@ -13302,7 +13305,7 @@
13302
13305
  "docs": {
13303
13306
  "stability": "experimental",
13304
13307
  "summary": "Unreferenced file removal settings for the this table bucket.",
13305
- "example": "// Build a Table bucket\nconst sampleTableBucket = new TableBucket(scope, 'ExampleTableBucket', {\n tableBucketName: 'example-bucket-1',\n // optional fields:\n unreferencedFileRemoval: {\n status: UnreferencedFileRemovalStatus.ENABLED,\n noncurrentDays: 20,\n unreferencedDays: 20,\n }\n});",
13308
+ "example": "// Build a Table bucket\nconst sampleTableBucket = new TableBucket(scope, 'ExampleTableBucket', {\n // optional fields:\n tableBucketName: 'example-bucket-1', // if omitted, CDK generates a unique name that satisfies the S3 Tables naming rules\n unreferencedFileRemoval: {\n status: UnreferencedFileRemovalStatus.ENABLED,\n noncurrentDays: 20,\n unreferencedDays: 20,\n }\n});",
13306
13309
  "custom": {
13307
13310
  "exampleMetadata": "infused"
13308
13311
  }
@@ -13383,7 +13386,7 @@
13383
13386
  "docs": {
13384
13387
  "stability": "experimental",
13385
13388
  "summary": "Controls whether unreferenced file removal is enabled or disabled.",
13386
- "example": "// Build a Table bucket\nconst sampleTableBucket = new TableBucket(scope, 'ExampleTableBucket', {\n tableBucketName: 'example-bucket-1',\n // optional fields:\n unreferencedFileRemoval: {\n status: UnreferencedFileRemovalStatus.ENABLED,\n noncurrentDays: 20,\n unreferencedDays: 20,\n }\n});",
13389
+ "example": "// Build a Table bucket\nconst sampleTableBucket = new TableBucket(scope, 'ExampleTableBucket', {\n // optional fields:\n tableBucketName: 'example-bucket-1', // if omitted, CDK generates a unique name that satisfies the S3 Tables naming rules\n unreferencedFileRemoval: {\n status: UnreferencedFileRemovalStatus.ENABLED,\n noncurrentDays: 20,\n unreferencedDays: 20,\n }\n});",
13387
13390
  "custom": {
13388
13391
  "exampleMetadata": "infused"
13389
13392
  }
@@ -13414,6 +13417,6 @@
13414
13417
  "symbolId": "lib/table-bucket:UnreferencedFileRemovalStatus"
13415
13418
  }
13416
13419
  },
13417
- "version": "2.269.0-alpha.0",
13420
+ "version": "2.271.0-alpha.0",
13418
13421
  "fingerprint": "**********"
13419
13422
  }
Binary file
package/README.md CHANGED
@@ -29,8 +29,8 @@ Amazon S3 Tables deliver the first cloud object store with built-in Apache Icebe
29
29
  ```ts
30
30
  // Build a Table bucket
31
31
  const sampleTableBucket = new TableBucket(scope, 'ExampleTableBucket', {
32
- tableBucketName: 'example-bucket-1',
33
32
  // optional fields:
33
+ tableBucketName: 'example-bucket-1', // if omitted, CDK generates a unique name that satisfies the S3 Tables naming rules
34
34
  unreferencedFileRemoval: {
35
35
  status: UnreferencedFileRemovalStatus.ENABLED,
36
36
  noncurrentDays: 20,
@@ -39,6 +39,13 @@ const sampleTableBucket = new TableBucket(scope, 'ExampleTableBucket', {
39
39
  });
40
40
  ```
41
41
 
42
+ When `tableBucketName` is omitted, CDK derives the name from the stack name and the
43
+ construct path. Because the path is part of the input, the generated name is **not
44
+ stable across stack or construct renames** — renaming or moving the construct will
45
+ produce a different name and replace the bucket. If you need a fixed, predictable
46
+ name (for example, to reference the bucket from outside CDK or across separate
47
+ deployments), pass `tableBucketName` explicitly.
48
+
42
49
  ### Define an S3 Tables Namespace
43
50
 
44
51
  ```ts
package/lib/namespace.js CHANGED
@@ -62,7 +62,7 @@ let Namespace = (() => {
62
62
  Namespace = _classThis = _classDescriptor.value;
63
63
  if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
64
64
  }
65
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-s3tables-alpha.Namespace", version: "2.269.0-alpha.0" };
65
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-s3tables-alpha.Namespace", version: "2.271.0-alpha.0" };
66
66
  /** Uniquely identifies this class. */
67
67
  static PROPERTY_INJECTION_ID = '@aws-cdk.aws-s3tables-alpha.Namespace';
68
68
  /**
@@ -95,7 +95,7 @@ let TableBucketPolicy = (() => {
95
95
  TableBucketPolicy = _classThis = _classDescriptor.value;
96
96
  if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
97
97
  }
98
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-s3tables-alpha.TableBucketPolicy", version: "2.269.0-alpha.0" };
98
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-s3tables-alpha.TableBucketPolicy", version: "2.271.0-alpha.0" };
99
99
  /** Uniquely identifies this class. */
100
100
  static PROPERTY_INJECTION_ID = '@aws-cdk.aws-s3tables-alpha.TableBucketPolicy';
101
101
  /**
@@ -236,8 +236,14 @@ export interface TableBucketProps {
236
236
  /**
237
237
  * Name of the S3 TableBucket.
238
238
  * @link https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-buckets-naming.html#table-buckets-naming-rules
239
+ *
240
+ * When omitted, the auto-generated name is derived from the construct path and is
241
+ * therefore not stable across stack or construct renames — pass an explicit name
242
+ * when you need a fixed identifier across deployments.
243
+ *
244
+ * @default - generated by CDK from the stack and construct path.
239
245
  */
240
- readonly tableBucketName: string;
246
+ readonly tableBucketName?: string;
241
247
  /**
242
248
  * Unreferenced file removal settings for the S3 TableBucket.
243
249
  * @link https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-s3tables-tablebucket-unreferencedfileremoval.html
@@ -396,7 +402,7 @@ export declare class TableBucket extends TableBucketBase implements ITaggableV2
396
402
  readonly tableBucketPolicy?: TableBucketPolicy;
397
403
  readonly encryptionKey?: kms.IKey | undefined;
398
404
  protected autoCreatePolicy: boolean;
399
- constructor(scope: Construct, id: string, props: TableBucketProps);
405
+ constructor(scope: Construct, id: string, props?: TableBucketProps);
400
406
  /**
401
407
  * The name of this table bucket
402
408
  */
@@ -256,7 +256,7 @@ let TableBucket = (() => {
256
256
  TableBucket = _classThis = _classDescriptor.value;
257
257
  if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
258
258
  }
259
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-s3tables-alpha.TableBucket", version: "2.269.0-alpha.0" };
259
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-s3tables-alpha.TableBucket", version: "2.271.0-alpha.0" };
260
260
  /** Uniquely identifies this class. */
261
261
  static PROPERTY_INJECTION_ID = '@aws-cdk.aws-s3tables-alpha.TableBucket';
262
262
  /**
@@ -402,9 +402,15 @@ let TableBucket = (() => {
402
402
  tableBucketPolicy;
403
403
  encryptionKey;
404
404
  autoCreatePolicy = true;
405
- constructor(scope, id, props) {
405
+ constructor(scope, id, props = {}) {
406
406
  super(scope, id, {
407
- physicalName: props.tableBucketName,
407
+ physicalName: props.tableBucketName ?? core_1.Lazy.string({
408
+ produce: () => core_1.Names.uniqueResourceName(this, {
409
+ maxLength: 63,
410
+ allowedSpecialCharacters: '-',
411
+ separator: '-',
412
+ }).toLowerCase(),
413
+ }),
408
414
  });
409
415
  try {
410
416
  jsiiDeprecationWarnings._aws_cdk_aws_s3tables_alpha_TableBucketProps(props);
@@ -422,7 +428,7 @@ let TableBucket = (() => {
422
428
  const { bucketEncryption, encryptionKey } = this.parseEncryption(props);
423
429
  this.encryptionKey = encryptionKey;
424
430
  this.resource = new s3tables.CfnTableBucket(this, id, {
425
- tableBucketName: props.tableBucketName,
431
+ tableBucketName: this.physicalName,
426
432
  unreferencedFileRemoval: {
427
433
  ...props.unreferencedFileRemoval,
428
434
  noncurrentDays: props.unreferencedFileRemoval?.noncurrentDays,
@@ -483,7 +489,7 @@ let TableBucket = (() => {
483
489
  description: `Created by ${this.node.path}`,
484
490
  enableKeyRotation: true,
485
491
  });
486
- this.allowTablesMaintenanceAccessToKey(key, props.tableBucketName);
492
+ this.allowTablesMaintenanceAccessToKey(key, this.physicalName);
487
493
  }
488
494
  return {
489
495
  bucketEncryption: {
@@ -542,4 +548,4 @@ let TableBucket = (() => {
542
548
  return TableBucket = _classThis;
543
549
  })();
544
550
  exports.TableBucket = TableBucket;
545
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtYnVja2V0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsidGFibGUtYnVja2V0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDJCQUF5QjtBQUN6Qix5REFBMkM7QUFDM0MseURBQTJDO0FBQzNDLG1FQUFxRDtBQUVyRCwyQ0FBNEU7QUFDNUUsNEVBQTRFO0FBQzVFLDhFQUE4RTtBQUM5RSwwRUFBMEU7QUFFMUUscURBQXVDO0FBQ3ZDLCtEQUEwRDtBQUMxRCxpQ0FBdUQ7QUEwSHZEOztHQUVHO0FBQ0gsSUFBWSw2QkFVWDtBQVZELFdBQVksNkJBQTZCO0lBQ3ZDOztPQUVHO0lBQ0gsb0RBQW1CLENBQUE7SUFFbkI7O09BRUc7SUFDSCxzREFBcUIsQ0FBQTtBQUN2QixDQUFDLEVBVlcsNkJBQTZCLDZDQUE3Qiw2QkFBNkIsUUFVeEM7QUFFRDs7R0FFRztBQUNILElBQVksb0JBVVg7QUFWRCxXQUFZLG9CQUFvQjtJQUM5Qjs7T0FFRztJQUNILDJDQUFtQixDQUFBO0lBRW5COztPQUVHO0lBQ0gsNkNBQXFCLENBQUE7QUFDdkIsQ0FBQyxFQVZXLG9CQUFvQixvQ0FBcEIsb0JBQW9CLFFBVS9CO0FBRUQ7Ozs7O0dBS0c7QUFDSCxJQUFZLFlBZVg7QUFmRCxXQUFZLFlBQVk7SUFDdEI7Ozs7T0FJRztJQUNILHFDQUFxQixDQUFBO0lBRXJCOzs7OztPQUtHO0lBQ0gsMkRBQTJDLENBQUE7QUFDN0MsQ0FBQyxFQWZXLFlBQVksNEJBQVosWUFBWSxRQWV2QjtBQUVEOztHQUVHO0FBQ0gsSUFBWSxxQkFXWDtBQVhELFdBQVkscUJBQXFCO0lBQy9COzs7T0FHRztJQUNILHdDQUFlLENBQUE7SUFFZjs7T0FFRztJQUNILDhDQUFxQixDQUFBO0FBQ3ZCLENBQUMsRUFYVyxxQkFBcUIscUNBQXJCLHFCQUFxQixRQVdo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a0NBQWtDLEVBQUUsT0FBTyxTQUFTLGFBQWEsTUFBTSxJQUFJLE9BQU8sV0FBVyxlQUFlLElBQUk7cUJBQ2pIO2lCQUNGO2FBQ0YsQ0FBQyxDQUFDLENBQUM7U0FDTDs7WUE1VFUsdURBQVc7Ozs7O0FBQVgsa0NBQVciLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFT0wgfSBmcm9tICdvcyc7XG5pbXBvcnQgKiBhcyBpYW0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWlhbSc7XG5pbXBvcnQgKiBhcyBrbXMgZnJvbSAnYXdzLWNkay1saWIvYXdzLWttcyc7XG5pbXBvcnQgKiBhcyBzM3RhYmxlcyBmcm9tICdhd3MtY2RrLWxpYi9hd3MtczN0YWJsZXMnO1xuaW1wb3J0IHR5cGUgeyBJUmVzb3VyY2UsIElUYWdnYWJsZVYyLCBSZW1vdmFsUG9saWN5LCBUYWdNYW5hZ2VyIH0gZnJvbSAnYXdzLWNkay1saWIvY29yZSc7XG5pbXBvcnQgeyBSZXNvdXJjZSwgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IsIFRva2VuIH0gZnJvbSAnYXdzLWNkay1saWIvY29yZSc7XG5pbXBvcnQgeyBtZW1vaXplZEdldHRlciwgbGl0IH0gZnJvbSAnYXdzLWNkay1saWIvY29yZS9saWIvaGVscGVycy1pbnRlcm5hbCc7XG5pbXBvcnQgeyBhZGRDb25zdHJ1Y3RNZXRhZGF0YSB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUvbGliL21ldGFkYXRhLXJlc291cmNlJztcbmltcG9ydCB7IHByb3BlcnR5SW5qZWN0YWJsZSB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUvbGliL3Byb3AtaW5qZWN0YWJsZSc7XG5pbXBvcnQgdHlwZSB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0ICogYXMgcGVybXMgZnJvbSAnLi9wZXJtaXNzaW9ucyc7XG5pbXBvcnQgeyBUYWJsZUJ1Y2tldFBvbGljeSB9IGZyb20gJy4vdGFibGUtYnVja2V0LXBvbGljeSc7XG5pbXBvcnQgeyB2YWxpZGF0ZVRhYmxlQnVja2V0QXR0cmlidXRlcyB9IGZyb20gJy4vdXRpbCc7XG5cbi8qKlxuICogSW50ZXJmYWNlIGRlZmluaXRpb24gZm9yIFMzIFRhYmxlIEJ1Y2tldHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJVGFibGVCdWNrZXQgZXh0ZW5kcyBJUmVzb3VyY2Uge1xuICAvKipcbiAgICogVGhlIEFSTiBvZiB0aGUgdGFibGUgYnVja2V0LlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSB0YWJsZUJ1Y2tldEFybjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgdGFibGUgYnVja2V0LlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSB0YWJsZUJ1Y2tldE5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGFjY291bnRJZCBjb250YWluaW5nIHRoZSB0YWJsZSBidWNrZXQuXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IGFjY291bnQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSByZWdpb24gY29udGFpbmluZyB0aGUgdGFibGUgYnVja2V0LlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSByZWdpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsIEtNUyBlbmNyeXB0aW9uIGtleSBhc3NvY2lhdGVkIHdpdGggdGhpcyB0YWJsZSBidWNrZXQuXG4gICAqL1xuICByZWFkb25seSBlbmNyeXB0aW9uS2V5Pzoga21zLklLZXk7XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBzdGF0ZW1lbnQgdG8gdGhlIHJlc291cmNlIHBvbGljeSBmb3IgYSBwcmluY2lwYWwgKGkuZS5cbiAgICogYWNjb3VudC9yb2xlL3NlcnZpY2UpIHRvIHBlcmZvcm0gYWN0aW9ucyBvbiB0aGlzIHRhYmxlIGJ1Y2tldCBhbmQvb3IgaXRzXG4gICAqIHRhYmxlcy5cbiAgICpcbiAgICogTm90ZSB0aGF0IHRoZSBwb2xpY3kgc3RhdGVtZW50IG1heSBvciBtYXkgbm90IGJlIGFkZGVkIHRvIHRoZSBwb2xpY3kuXG4gICAqIEZvciBleGFtcGxlLCB3aGVuIGFuIGBJVGFibGVCdWNrZXRgIGlzIGNyZWF0ZWQgZnJvbSBhbiBleGlzdGluZyB0YWJsZSBidWNrZXQsXG4gICAqIGl0J3Mgbm90IHBvc3NpYmxlIHRvIHRlbGwgd2hldGhlciB0aGUgYnVja2V0IGFscmVhZHkgaGFzIGEgcG9saWN5XG4gICAqIGF0dGFjaGVkLCBsZXQgYWxvbmUgdG8gcmUtdXNlIHRoYXQgcG9saWN5IHRvIGFkZCBtb3JlIHN0YXRlbWVudHMgdG8gaXQuXG4gICAqIFNvIGl0J3Mgc2FmZXN0IHRvIGRvIG5vdGhpbmcgaW4gdGhlc2UgY2FzZXMuXG4gICAqXG4gICAqIEBwYXJhbSBzdGF0ZW1lbnQgdGhlIHBvbGljeSBzdGF0ZW1lbnQgdG8gYmUgYWRkZWQgdG8gdGhlIGJ1Y2tldCdzXG4gICAqIHBvbGljeS5cbiAgICogQHJldHVybnMgbWV0YWRhdGEgYWJvdXQgdGhlIGV4ZWN1dGlvbiBvZiB0aGlzIG1ldGhvZC4gSWYgdGhlIHBvbGljeVxuICAgKiB3YXMgbm90IGFkZGVkLCB0aGUgdmFsdWUgb2YgYHN0YXRlbWVudEFkZGVkYCB3aWxsIGJlIGBmYWxzZWAuIFlvdVxuICAgKiBzaG91bGQgYWx3YXlzIGNoZWNrIHRoaXMgdmFsdWUgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIG9wZXJhdGlvbiB3YXNcbiAgICogYWN0dWFsbHkgY2FycmllZCBvdXQuIE90aGVyd2lzZSwgc3ludGhlc2lzIGFuZCBkZXBsb3kgd2lsbCB0ZXJtaW5hdGVcbiAgICogc2lsZW50bHksIHdoaWNoIG1heSBiZSBjb25mdXNpbmcuXG4gICAqL1xuICBhZGRUb1Jlc291cmNlUG9saWN5KHN0YXRlbWVudDogaWFtLlBvbGljeVN0YXRlbWVudCk6IGlhbS5BZGRUb1Jlc291cmNlUG9saWN5UmVzdWx0O1xuXG4gIC8qKlxuICAgKiBHcmFudCByZWFkIHBlcm1pc3Npb25zIGZvciB0aGlzIHRhYmxlIGJ1Y2tldCBhbmQgaXRzIHRhYmxlc1xuICAgKiB0byBhbiBJQU0gcHJpbmNpcGFsIChSb2xlL0dyb3VwL1VzZXIpLlxuICAgKlxuICAgKiBJZiBlbmNyeXB0aW9uIGlzIHVzZWQsIHBlcm1pc3Npb24gdG8gdXNlIHRoZSBrZXkgdG8gZGVjcnlwdCB0aGUgY29udGVudHNcbiAgICogb2YgdGhlIGJ1Y2tldCB3aWxsIGFsc28gYmUgZ3JhbnRlZCB0byB0aGUgc2FtZSBwcmluY2lwYWwuXG4gICAqXG4gICAqIEBwYXJhbSBpZGVudGl0eSBUaGUgcHJpbmNpcGFsIHRvIGFsbG93IHJlYWQgcGVybWlzc2lvbnMgdG9cbiAgICogQHBhcmFtIHRhYmxlSWQgQWxsb3cgdGhlIHBlcm1pc3Npb25zIHRvIGFsbCB0YWJsZXMgdXNpbmcgJyonIG9yIHRvIHNpbmdsZSB0YWJsZSBieSBpdHMgdW5pcXVlIElELlxuICAgKi9cbiAgZ3JhbnRSZWFkKGlkZW50aXR5OiBpYW0uSUdyYW50YWJsZSwgdGFibGVJZDogc3RyaW5nKTogaWFtLkdyYW50O1xuXG4gIC8qKlxuICAgKiBHcmFudCB3cml0ZSBwZXJtaXNzaW9ucyBmb3IgdGhpcyB0YWJsZSBidWNrZXQgYW5kIGl0cyB0YWJsZXNcbiAgICogdG8gYW4gSUFNIHByaW5jaXBhbCAoUm9sZS9Hcm91cC9Vc2VyKS5cbiAgICpcbiAgICogSWYgZW5jcnlwdGlvbiBpcyB1c2VkLCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUga2V5IHRvIGVuY3J5cHQgdGhlIGNvbnRlbnRzXG4gICAqIG9mIHRoZSBidWNrZXQgd2lsbCBhbHNvIGJlIGdyYW50ZWQgdG8gdGhlIHNhbWUgcHJpbmNpcGFsLlxuICAgKlxuICAgKiBAcGFyYW0gaWRlbnRpdHkgVGhlIHByaW5jaXBhbCB0byBhbGxvdyB3cml0ZSBwZXJtaXNzaW9ucyB0b1xuICAgKiBAcGFyYW0gdGFibGVJZCBBbGxvdyB0aGUgcGVybWlzc2lvbnMgdG8gYWxsIHRhYmxlcyB1c2luZyAnKicgb3IgdG8gc2luZ2xlIHRhYmxlIGJ5IGl0cyB1bmlxdWUgSUQuXG4gICAqL1xuICBncmFudFdyaXRlKGlkZW50aXR5OiBpYW0uSUdyYW50YWJsZSwgdGFibGVJZDogc3RyaW5nKTogaWFtLkdyYW50O1xuXG4gIC8qKlxuICAgKiBHcmFudCByZWFkIGFuZCB3cml0ZSBwZXJtaXNzaW9ucyBmb3IgdGhpcyB0YWJsZSBidWNrZXQgYW5kIGl0cyB0YWJsZXNcbiAgICogdG8gYW4gSUFNIHByaW5jaXBhbCAoUm9sZS9Hcm91cC9Vc2VyKS5cbiAgICpcbiAgICogSWYgZW5jcnlwdGlvbiBpcyB1c2VkLCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUga2V5IHRvIGVuY3J5cHQvZGVjcnlwdCB0aGUgY29udGVudHNcbiAgICogb2YgdGhlIGJ1Y2tldCB3aWxsIGFsc28gYmUgZ3JhbnRlZCB0byB0aGUgc2FtZSBwcmluY2lwYWwuXG4gICAqXG4gICAqIEBwYXJhbSBpZGVudGl0eSBUaGUgcHJpbmNpcGFsIHRvIGFsbG93IHJlYWQgYW5kIHdyaXRlIHBlcm1pc3Npb25zIHRvXG4gICAqIEBwYXJhbSB0YWJsZUlkIEFsbG93IHRoZSBwZXJtaXNzaW9ucyB0byBhbGwgdGFibGVzIHVzaW5nICcqJyBvciB0byBzaW5nbGUgdGFibGUgYnkgaXRzIHVuaXF1ZSBJRC5cbiAgICovXG4gIGdyYW50UmVhZFdyaXRlKGlkZW50aXR5OiBpYW0uSUdyYW50YWJsZSwgdGFibGVJZDogc3RyaW5nKTogaWFtLkdyYW50O1xufVxuXG4vKipcbiAqIFVucmVmZXJlbmNlZCBmaWxlIHJlbW92YWwgc2V0dGluZ3MgZm9yIHRoZSB0aGlzIHRhYmxlIGJ1Y2tldC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVbnJlZmVyZW5jZWRGaWxlUmVtb3ZhbCB7XG4gIC8qKlxuICAgKiBEdXJhdGlvbiBhZnRlciB3aGljaCBub25jdXJyZW50IGZpbGVzIHNob3VsZCBiZSByZW1vdmVkLiBTaG91bGQgYmUgYXQgbGVhc3Qgb25lIGRheS5cbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L3VzZXJndWlkZS9zMy10YWJsZS1idWNrZXRzLW1haW50ZW5hbmNlLmh0bWxcbiAgICpcbiAgICogQGRlZmF1bHQgLSBTZWUgUzMgVGFibGVzIFVzZXIgR3VpZGVcbiAgICovXG4gIHJlYWRvbmx5IG5vbmN1cnJlbnREYXlzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBTdGF0dXMgb2YgdW5yZWZlcmVuY2VkIGZpbGUgcmVtb3ZhbC4gQ2FuIGJlIEVuYWJsZWQgb3IgRGlzYWJsZWQuXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC91c2VyZ3VpZGUvczMtdGFibGUtYnVja2V0cy1tYWludGVuYW5jZS5odG1sXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gU2VlIFMzIFRhYmxlcyBVc2VyIEd1aWRlXG4gICAqL1xuICByZWFkb25seSBzdGF0dXM/OiBVbnJlZmVyZW5jZWRGaWxlUmVtb3ZhbFN0YXR1cztcblxuICAvKipcbiAgICogRHVyYXRpb24gYWZ0ZXIgd2hpY2ggdW5yZWZlcmVuY2VkIGZpbGVzIHNob3VsZCBiZSByZW1vdmVkLiBTaG91bGQgYmUgYXQgbGVhc3Qgb25lIGRheS5cbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L3VzZXJndWlkZS9zMy10YWJsZS1idWNrZXRzLW1haW50ZW5hbmNlLmh0bWxcbiAgICpcbiAgICogQGRlZmF1bHQgLSBTZWUgUzMgVGFibGVzIFVzZXIgR3VpZGVcbiAgICovXG4gIHJlYWRvbmx5IHVucmVmZXJlbmNlZERheXM/OiBudW1iZXI7XG59XG5cbi8qKlxuICogQ29udHJvbHMgd2hldGhlciB1bnJlZmVyZW5jZWQgZmlsZSByZW1vdmFsIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuXG4gKi9cbmV4cG9ydCBlbnVtIFVucmVmZXJlbmNlZEZpbGVSZW1vdmFsU3RhdHVzIHtcbiAgLyoqXG4gICAqIEVuYWJsZSB1bnJlZmVyZW5jZWQgZmlsZSByZW1vdmFsLlxuICAgKi9cbiAgRU5BQkxFRCA9ICdFbmFibGVkJyxcblxuICAvKipcbiAgICogRGlzYWJsZSB1bnJlZmVyZW5jZWQgZmlsZSByZW1vdmFsLlxuICAgKi9cbiAgRElTQUJMRUQgPSAnRGlzYWJsZWQnLFxufVxuXG4vKipcbiAqIENvbnRyb2xzIHdoZXRoZXIgQ2xvdWRXYXRjaCByZXF1ZXN0IG1ldHJpY3MgYXJlIGVuYWJsZWQgb3IgZGlzYWJsZWQgZm9yIHRoZSB0YWJsZSBidWNrZXQuXG4gKi9cbmV4cG9ydCBlbnVtIFJlcXVlc3RNZXRyaWNzU3RhdHVzIHtcbiAgLyoqXG4gICAqIEVuYWJsZSBDbG91ZFdhdGNoIHJlcXVlc3QgbWV0cmljcyBmb3IgdGhlIHRhYmxlIGJ1Y2tldC5cbiAgICovXG4gIEVOQUJMRUQgPSAnRW5hYmxlZCcsXG5cbiAgLyoqXG4gICAqIERpc2FibGUgQ2xvdWRXYXRjaCByZXF1ZXN0IG1ldHJpY3MgZm9yIHRoZSB0YWJsZSBidWNrZXQuXG4gICAqL1xuICBESVNBQkxFRCA9ICdEaXNhYmxlZCcsXG59XG5cbi8qKlxuICogU3RvcmFnZSBjbGFzcyBmb3IgUzMgVGFibGVzLlxuICpcbiAqIERldGVybWluZXMgdGhlIHN0b3JhZ2UgdGllciB1c2VkIGZvciB0YWJsZSBkYXRhLCBhbGxvd2luZyBvcHRpbWl6YXRpb25cbiAqIGZvciBkaWZmZXJlbnQgYWNjZXNzIHBhdHRlcm5zIGFuZCBjb3N0IHByb2ZpbGVzLlxuICovXG5leHBvcnQgZW51bSBTdG9yYWdlQ2xhc3Mge1xuICAvKipcbiAgICogU3RhbmRhcmQgc3RvcmFnZSBjbGFzcyBmb3IgZnJlcXVlbnRseSBhY2Nlc3NlZCBkYXRhLlxuICAgKlxuICAgKiBVc2UgdGhpcyBmb3IgdGFibGVzIHdpdGggY29uc2lzdGVudCwgaGlnaC1mcmVxdWVuY3kgYWNjZXNzIHBhdHRlcm5zLlxuICAgKi9cbiAgU1RBTkRBUkQgPSAnU1RBTkRBUkQnLFxuXG4gIC8qKlxuICAgKiBJbnRlbGxpZ2VudC1UaWVyaW5nIHN0b3JhZ2UgY2xhc3MgdGhhdCBhdXRvbWF0aWNhbGx5IG1vdmVzIGRhdGEgYmV0d2VlbiBhY2Nlc3MgdGllcnMuXG4gICAqXG4gICAqIFVzZSB0aGlzIGZvciB0YWJsZXMgd2l0aCB1bmtub3duIG9yIGNoYW5naW5nIGFjY2VzcyBwYXR0ZXJucyB0byBvcHRpbWl6ZSBjb3N0c1xuICAgKiB3aGlsZSBtYWludGFpbmluZyBwZXJmb3JtYW5jZSBmb3IgZnJlcXVlbnRseSBhY2Nlc3NlZCBkYXRhLlxuICAgKi9cbiAgSU5URUxMSUdFTlRfVElFUklORyA9ICdJTlRFTExJR0VOVF9USUVSSU5HJyxcbn1cblxuLyoqXG4gKiBDb250cm9scyBTZXJ2ZXIgU2lkZSBFbmNyeXB0aW9uIChTU0UpIGZvciB0aGlzIFRhYmxlQnVja2V0LlxuICovXG5leHBvcnQgZW51bSBUYWJsZUJ1Y2tldEVuY3J5cHRpb24ge1xuICAvKipcbiAgICogVXNlIGEgY3VzdG9tZXIgZGVmaW5lZCBLTVMga2V5IGZvciBlbmNyeXB0aW9uXG4gICAqIElmIGBlbmNyeXB0aW9uS2V5YCBpcyBzcGVjaWZpZWQsIHRoaXMga2V5IHdpbGwgYmUgdXNlZCwgb3RoZXJ3aXNlLCBvbmUgd2lsbCBiZSBkZWZpbmVkLlxuICAgKi9cbiAgS01TID0gJ2F3czprbXMnLFxuXG4gIC8qKlxuICAgKiBVc2UgUzMgbWFuYWdlZCBlbmNyeXB0aW9uIGtleXMgd2l0aCBBRVMyNTYgZW5jcnlwdGlvblxuICAgKi9cbiAgUzNfTUFOQUdFRCA9ICdBRVMyNTYnLFxufVxuXG5hYnN0cmFjdCBjbGFzcyBUYWJsZUJ1Y2tldEJhc2UgZXh0ZW5kcyBSZXNvdXJjZSBpbXBsZW1lbnRzIElUYWJsZUJ1Y2tldCB7XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSB0YWJsZUJ1Y2tldEFybjogc3RyaW5nO1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgdGFibGVCdWNrZXROYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSByZXNvdXJjZSBwb2xpY3kgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdGFibGUgYnVja2V0LlxuICAgKlxuICAgKiBJZiBgYXV0b0NyZWF0ZVBvbGljeWAgaXMgdHJ1ZSwgYSBgVGFibGVCdWNrZXRQb2xpY3lgIHdpbGwgYmUgY3JlYXRlZCB1cG9uIHRoZVxuICAgKiBmaXJzdCBjYWxsIHRvIGFkZFRvUmVzb3VyY2VQb2xpY3kocykuXG4gICAqL1xuICBwdWJsaWMgYWJzdHJhY3QgdGFibGVCdWNrZXRQb2xpY3k/OiBUYWJsZUJ1Y2tldFBvbGljeTtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIGEgdGFibGUgYnVja2V0IHJlc291cmNlIHBvbGljeSBzaG91bGQgYXV0b21hdGljYWxseSBjcmVhdGVkIHVwb25cbiAgICogdGhlIGZpcnN0IGNhbGwgdG8gYGFkZFRvUmVzb3VyY2VQb2xpY3lgLlxuICAgKi9cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGF1dG9DcmVhdGVQb2xpY3k6IGJvb2xlYW47XG5cbiAgcHVibGljIGFic3RyYWN0IGVuY3J5cHRpb25LZXk/OiBrbXMuSUtleSB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQWRkcyBhIHN0YXRlbWVudCB0byB0aGUgcmVzb3VyY2UgcG9saWN5IGZvciBhIHByaW5jaXBhbCAoaS5lLlxuICAgKiBhY2NvdW50L3JvbGUvc2VydmljZSkgdG8gcGVyZm9ybSBhY3Rpb25zIG9uIHRoaXMgdGFibGUgYnVja2V0IGFuZC9vciBpdHNcbiAgICogY29udGVudHMuIFVzZSBgdGFibGVCdWNrZXRBcm5gIGFuZCBgYXJuRm9yT2JqZWN0cyhrZXlzKWAgdG8gb2J0YWluIEFSTnMgZm9yXG4gICAqIHRoaXMgYnVja2V0IG9yIG9iamVjdHMuXG4gICAqXG4gICAqIE5vdGUgdGhhdCB0aGUgcG9saWN5IHN0YXRlbWVudCBtYXkgb3IgbWF5IG5vdCBiZSBhZGRlZCB0byB0aGUgcG9saWN5LlxuICAgKiBGb3IgZXhhbXBsZSwgd2hlbiBhbiBgSVRhYmxlQnVja2V0YCBpcyBjcmVhdGVkIGZyb20gYW4gZXhpc3RpbmcgdGFibGUgYnVja2V0LFxuICAgKiBpdCdzIG5vdCBwb3NzaWJsZSB0byB0ZWxsIHdoZXRoZXIgdGhlIGJ1Y2tldCBhbHJlYWR5IGhhcyBhIHBvbGljeVxuICAgKiBhdHRhY2hlZCwgbGV0IGFsb25lIHRvIHJlLXVzZSB0aGF0IHBvbGljeSB0byBhZGQgbW9yZSBzdGF0ZW1lbnRzIHRvIGl0LlxuICAgKiBTbyBpdCdzIHNhZmVzdCB0byBkbyBub3RoaW5nIGluIHRoZXNlIGNhc2VzLlxuICAgKlxuICAgKiBAcGFyYW0gc3RhdGVtZW50IHRoZSBwb2xpY3kgc3RhdGVtZW50IHRvIGJlIGFkZGVkIHRvIHRoZSBidWNrZXQnc1xuICAgKiBwb2xpY3kuXG4gICAqIEByZXR1cm5zIG1ldGFkYXRhIGFib3V0IHRoZSBleGVjdXRpb24gb2YgdGhpcyBtZXRob2QuIElmIHRoZSBwb2xpY3lcbiAgICogd2FzIG5vdCBhZGRlZCwgdGhlIHZhbHVlIG9mIGBzdGF0ZW1lbnRBZGRlZGAgd2lsbCBiZSBgZmFsc2VgLiBZb3VcbiAgICogc2hvdWxkIGFsd2F5cyBjaGVjayB0aGlzIHZhbHVlIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBvcGVyYXRpb24gd2FzXG4gICAqIGFjdHVhbGx5IGNhcnJpZWQgb3V0LiBPdGhlcndpc2UsIHN5bnRoZXNpcyBhbmQgZGVwbG95IHdpbGwgdGVybWluYXRlXG4gICAqIHNpbGVudGx5LCB3aGljaCBtYXkgYmUgY29uZnVzaW5nLlxuICAgKi9cbiAgcHVibGljIGFkZFRvUmVzb3VyY2VQb2xpY3koXG4gICAgc3RhdGVtZW50OiBpYW0uUG9saWN5U3RhdGVtZW50LFxuICApOiBpYW0uQWRkVG9SZXNvdXJjZVBvbGljeVJlc3VsdCB7XG4gICAgaWYgKCF0aGlzLnRhYmxlQnVja2V0UG9saWN5ICYmIHRoaXMuYXV0b0NyZWF0ZVBvbGljeSkge1xuICAgICAgdGhpcy50YWJsZUJ1Y2tldFBvbGljeSA9IG5ldyBUYWJsZUJ1Y2tldFBvbGljeSh0aGlzLCAnRGVmYXVsdFBvbGljeScsIHtcbiAgICAgICAgdGFibGVCdWNrZXQ6IHRoaXMsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy50YWJsZUJ1Y2tldFBvbGljeSkge1xuICAgICAgdGhpcy50YWJsZUJ1Y2tldFBvbGljeS5kb2N1bWVudC5hZGRTdGF0ZW1lbnRzKHN0YXRlbWVudCk7XG4gICAgICByZXR1cm4geyBzdGF0ZW1lbnRBZGRlZDogdHJ1ZSwgcG9saWN5RGVwZW5kYWJsZTogdGhpcy50YWJsZUJ1Y2tldFBvbGljeSB9O1xuICAgIH1cblxuICAgIHJldHVybiB7IHN0YXRlbWVudEFkZGVkOiBmYWxzZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFtkaXNhYmxlLWF3c2xpbnQ6bm8tZ3JhbnRzXVxuICAgKi9cbiAgcHVibGljIGdyYW50UmVhZChpZGVudGl0eTogaWFtLklHcmFudGFibGUsIHRhYmxlSWQ6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmdyYW50KFxuICAgICAgaWRlbnRpdHksXG4gICAgICBwZXJtcy5UQUJMRV9CVUNLRVRfUkVBRF9BQ0NFU1MsXG4gICAgICBwZXJtcy5LRVlfUkVBRF9BQ0NFU1MsXG4gICAgICB0aGlzLnRhYmxlQnVja2V0QXJuLFxuICAgICAgdGhpcy5nZXRUYWJsZUFybih0YWJsZUlkKSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFtkaXNhYmxlLWF3c2xpbnQ6bm8tZ3JhbnRzXVxuICAgKi9cbiAgcHVibGljIGdyYW50V3JpdGUoaWRlbnRpdHk6IGlhbS5JR3JhbnRhYmxlLCB0YWJsZUlkOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5ncmFudChcbiAgICAgIGlkZW50aXR5LFxuICAgICAgcGVybXMuVEFCTEVfQlVDS0VUX1dSSVRFX0FDQ0VTUyxcbiAgICAgIHBlcm1zLktFWV9SRUFEX1dSSVRFX0FDQ0VTUyxcbiAgICAgIHRoaXMudGFibGVCdWNrZXRBcm4sXG4gICAgICB0aGlzLmdldFRhYmxlQXJuKHRhYmxlSWQpLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogW2Rpc2FibGUtYXdzbGludDpuby1ncmFudHNdXG4gICAqL1xuICBwdWJsaWMgZ3JhbnRSZWFkV3JpdGUoaWRlbnRpdHk6IGlhbS5JR3JhbnRhYmxlLCB0YWJsZUlkOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5ncmFudChcbiAgICAgIGlkZW50aXR5LFxuICAgICAgcGVybXMuVEFCTEVfQlVDS0VUX1JFQURfV1JJVEVfQUNDRVNTLFxuICAgICAgcGVybXMuS0VZX1dSSVRFX0FDQ0VTUyxcbiAgICAgIHRoaXMudGFibGVCdWNrZXRBcm4sXG4gICAgICB0aGlzLmdldFRhYmxlQXJuKHRhYmxlSWQpLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHRoZSBnaXZlbiBzM3RhYmxlcyBwZXJtaXNzaW9ucyB0byB0aGUgcHJvdmlkZWQgcHJpbmNpcGFsXG4gICAqIEByZXR1cm5zIEdyYW50IG9iamVjdFxuICAgKi9cbiAgcHJpdmF0ZSBncmFudChcbiAgICBncmFudGVlOiBpYW0uSUdyYW50YWJsZSxcbiAgICB0YWJsZUJ1Y2tldEFjdGlvbnM6IHN0cmluZ1tdLFxuICAgIGtleUFjdGlvbnM6IHN0cmluZ1tdLFxuICAgIHJlc291cmNlQXJuOiBzdHJpbmcsXG4gICAgLi4ub3RoZXJSZXNvdXJjZUFybnM6IChzdHJpbmcgfCB1bmRlZmluZWQpW10pIHtcbiAgICBjb25zdCByZXNvdXJjZXMgPSBbcmVzb3VyY2VBcm4sIC4uLm90aGVyUmVzb3VyY2VBcm5zXS5maWx0ZXIoYXJuID0+IGFybiAhPSB1bmRlZmluZWQpO1xuXG4gICAgY29uc3QgZ3JhbnQgPSBpYW0uR3JhbnQuYWRkVG9QcmluY2lwYWxPclJlc291cmNlKHtcbiAgICAgIGdyYW50ZWUsXG4gICAgICBhY3Rpb25zOiB0YWJsZUJ1Y2tldEFjdGlvbnMsXG4gICAgICByZXNvdXJjZUFybnM6IHJlc291cmNlcyxcbiAgICAgIHJlc291cmNlOiB0aGlzLFxuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMuZW5jcnlwdGlvbktleSAmJiBrZXlBY3Rpb25zICYmIGtleUFjdGlvbnMubGVuZ3RoICE9PSAwKSB7XG4gICAgICB0aGlzLmVuY3J5cHRpb25LZXkuZ3JhbnQoZ3JhbnRlZSwgLi4ua2V5QWN0aW9ucyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGdyYW50O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRUYWJsZUFybih0YWJsZUlkOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdGFibGVJZCA/IGAke3RoaXMudGFibGVCdWNrZXRBcm59L3RhYmxlLyR7dGFibGVJZH1gIDogdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3IgY29uc3RydWN0aW5nIGEgVGFibGVCdWNrZXRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUYWJsZUJ1Y2tldFByb3BzIHtcbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIFMzIFRhYmxlQnVja2V0LlxuICAgKiBAbGluayBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L3VzZXJndWlkZS9zMy10YWJsZXMtYnVja2V0cy1uYW1pbmcuaHRtbCN0YWJsZS1idWNrZXRzLW5hbWluZy1ydWxlc1xuICAgKi9cbiAgcmVhZG9ubHkgdGFibGVCdWNrZXROYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFVucmVmZXJlbmNlZCBmaWxlIHJlbW92YWwgc2V0dGluZ3MgZm9yIHRoZSBTMyBUYWJsZUJ1Y2tldC5cbiAgICogQGxpbmsgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0Nsb3VkRm9ybWF0aW9uL2xhdGVzdC9Vc2VyR3VpZGUvYXdzLXByb3BlcnRpZXMtczN0YWJsZXMtdGFibGVidWNrZXQtdW5yZWZlcmVuY2VkZmlsZXJlbW92YWwuaHRtbFxuICAgKiBAZGVmYXVsdCBFbmFibGVkIHdpdGggZGVmYXVsdCB2YWx1ZXNcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L3VzZXJndWlkZS9zMy10YWJsZS1idWNrZXRzLW1haW50ZW5hbmNlLmh0bWxcbiAgICovXG4gIHJlYWRvbmx5IHVucmVmZXJlbmNlZEZpbGVSZW1vdmFsPzogVW5yZWZlcmVuY2VkRmlsZVJlbW92YWw7XG5cbiAgLyoqXG4gICAqIEFXUyByZWdpb24gdGhhdCB0aGUgdGFibGUgYnVja2V0IGV4aXN0cyBpbi5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBpdCdzIGFzc3VtZWQgdGhlIGJ1Y2tldCBpcyBpbiB0aGUgc2FtZSByZWdpb24gYXMgdGhlIHNjb3BlIGl0J3MgYmVpbmcgaW1wb3J0ZWQgaW50b1xuICAgKi9cbiAgcmVhZG9ubHkgcmVnaW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBV1MgQWNjb3VudCBJRCBvZiB0aGUgdGFibGUgYnVja2V0IG93bmVyLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGl0J3MgYXNzdW1lZCB0aGUgYnVja2V0IGJlbG9uZ3MgdG8gdGhlIHNhbWUgYWNjb3VudCBhcyB0aGUgc2NvcGUgaXQncyBiZWluZyBpbXBvcnRlZCBpbnRvXG4gICAqL1xuICByZWFkb25seSBhY2NvdW50Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUga2luZCBvZiBzZXJ2ZXItc2lkZSBlbmNyeXB0aW9uIHRvIGFwcGx5IHRvIHRoaXMgYnVja2V0LlxuICAgKlxuICAgKiBJZiB5b3UgY2hvb3NlIEtNUywgeW91IGNhbiBzcGVjaWZ5IGEgS01TIGtleSB2aWEgYGVuY3J5cHRpb25LZXlgLiBJZlxuICAgKiBlbmNyeXB0aW9uIGtleSBpcyBub3Qgc3BlY2lmaWVkLCBhIGtleSB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgY3JlYXRlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBgS01TYCBpZiBgZW5jcnlwdGlvbktleWAgaXMgc3BlY2lmaWVkLCBvciBgUzNfTUFOQUdFRGAgb3RoZXJ3aXNlLlxuICAgKi9cbiAgcmVhZG9ubHkgZW5jcnlwdGlvbj86IFRhYmxlQnVja2V0RW5jcnlwdGlvbjtcblxuICAvKipcbiAgICogRXh0ZXJuYWwgS01TIGtleSB0byB1c2UgZm9yIGJ1Y2tldCBlbmNyeXB0aW9uLlxuICAgKlxuICAgKiBUaGUgYGVuY3J5cHRpb25gIHByb3BlcnR5IG11c3QgYmUgZWl0aGVyIG5vdCBzcGVjaWZpZWQgb3Igc2V0IHRvIGBLTVNgLlxuICAgKiBBbiBlcnJvciB3aWxsIGJlIGVtaXR0ZWQgaWYgYGVuY3J5cHRpb25gIGlzIHNldCB0byBgUzNfTUFOQUdFRGAuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gSWYgYGVuY3J5cHRpb25gIGlzIHNldCB0byBgS01TYCBhbmQgdGhpcyBwcm9wZXJ0eSBpcyB1bmRlZmluZWQsXG4gICAqIGEgbmV3IEtNUyBrZXkgd2lsbCBiZSBjcmVhdGVkIGFuZCBhc3NvY2lhdGVkIHdpdGggdGhpcyBidWNrZXQuXG4gICAqL1xuICByZWFkb25seSBlbmNyeXB0aW9uS2V5Pzoga21zLklLZXk7XG5cbiAgLyoqXG4gICAqIENvbnRyb2xzIHdoYXQgaGFwcGVucyB0byB0aGlzIHRhYmxlIGJ1Y2tldCBpdCBpdCBzdG9wZWQgYmVpbmcgbWFuYWdlZCBieSBjbG91ZGZvcm1hdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgUkVUQUlOXG4gICAqL1xuICByZWFkb25seSByZW1vdmFsUG9saWN5PzogUmVtb3ZhbFBvbGljeTtcblxuICAvKipcbiAgICogQ2xvdWRXYXRjaCByZXF1ZXN0IG1ldHJpY3MgY29uZmlndXJhdGlvbiBmb3IgdGhlIHRhYmxlIGJ1Y2tldC5cbiAgICpcbiAgICogV2hlbiBlbmFibGVkLCBTMyBUYWJsZXMgcHVibGlzaGVzIENsb3VkV2F0Y2ggcmVxdWVzdCBtZXRyaWNzIGZvciB0aGUgdGFibGUgYnVja2V0LlxuICAgKiBSZXF1ZXN0IG1ldHJpY3MgcHJvdmlkZSBpbnNpZ2h0IGludG8gQW1hem9uIFMzIFRhYmxlcyByZXF1ZXN0cy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBSZXF1ZXN0IG1ldHJpY3MgYXJlIGRpc2FibGVkXG4gICAqL1xuICByZWFkb25seSByZXF1ZXN0TWV0cmljc1N0YXR1cz86IFJlcXVlc3RNZXRyaWNzU3RhdHVzO1xuXG4gIC8qKlxuICAgKiBUaGUgc3RvcmFnZSBjbGFzcyBmb3IgdGhlIHRhYmxlIGJ1Y2tldC5cbiAgICpcbiAgICogRGV0ZXJtaW5lcyB0aGUgc3RvcmFnZSB0aWVyIHVzZWQgZm9yIHRhYmxlIGRhdGEsIGFsbG93aW5nIG9wdGltaXphdGlvblxuICAgKiBmb3IgZGlmZmVyZW50IGFjY2VzcyBwYXR0ZXJucyBhbmQgY29zdCBwcm9maWxlcy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBTVEFOREFSRCBzdG9yYWdlIGNsYXNzXG4gICAqL1xuICByZWFkb25seSBzdG9yYWdlQ2xhc3M/OiBTdG9yYWdlQ2xhc3M7XG59XG5cbi8qKlxuICogQSByZWZlcmVuY2UgdG8gYSB0YWJsZSBidWNrZXQgb3V0c2lkZSB0aGlzIHN0YWNrXG4gKlxuICogVGhlIHRhYmxlQnVja2V0TmFtZSwgcmVnaW9uLCBhbmQgYWNjb3VudCBjYW4gYmUgcHJvdmlkZWQgZXhwbGljaXRseVxuICogb3Igd2lsbCBiZSBpbmZlcnJlZCBmcm9tIHRoZSB0YWJsZUJ1Y2tldEFyblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRhYmxlQnVja2V0QXR0cmlidXRlcyB7XG4gIC8qKlxuICAgKiBBV1MgcmVnaW9uIHRoaXMgdGFibGUgYnVja2V0IGV4aXN0cyBpblxuICAgKiBAZGVmYXVsdCByZWdpb24gaW5mZXJyZWQgZnJvbSBzY29wZVxuICAgKi9cbiAgcmVhZG9ubHkgcmVnaW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgYWNjb3VudElkIGNvbnRhaW5pbmcgdGhpcyB0YWJsZSBidWNrZXRcbiAgICogQGRlZmF1bHQgYWNjb3VudCBpbmZlcnJlZCBmcm9tIHNjb3BlXG4gICAqL1xuICByZWFkb25seSBhY2NvdW50Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdGFibGUgYnVja2V0IG5hbWUsIHVuaXF1ZSBwZXIgcmVnaW9uXG4gICAqIEBkZWZhdWx0IHRhYmxlQnVja2V0TmFtZSBpbmZlcnJlZCBmcm9tIGFyblxuICAgKi9cbiAgcmVhZG9ubHkgdGFibGVCdWNrZXROYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdGFibGUgYnVja2V0J3MgQVJOLlxuICAgKiBAZGVmYXVsdCB0YWJsZUJ1Y2tldEFybiBjb25zdHJ1Y3RlZCBmcm9tIHJlZ2lvbiwgYWNjb3VudCBhbmQgdGFibGVCdWNrZXROYW1lIGFyZSBwcm92aWRlZFxuICAgKi9cbiAgcmVhZG9ubHkgdGFibGVCdWNrZXRBcm4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsIEtNUyBlbmNyeXB0aW9uIGtleSBhc3NvY2lhdGVkIHdpdGggdGhpcyBidWNrZXQuXG4gICAqIEBkZWZhdWx0IC0gdW5kZWZpbmVkXG4gICAqL1xuICByZWFkb25seSBlbmNyeXB0aW9uS2V5Pzoga21zLklLZXk7XG59XG5cbi8qKlxuICogQW4gUzMgdGFibGUgYnVja2V0IHdpdGggaGVscGVycyBmb3IgYXNzb2NpYXRlZCByZXNvdXJjZSBwb2xpY2llc1xuICpcbiAqIFRoaXMgYnVja2V0IG1heSBub3QgeWV0IGhhdmUgYWxsIGZlYXR1cmVzIHRoYXQgZXhwb3NlZCBieSB0aGUgdW5kZXJseWluZyBDZm5UYWJsZUJ1Y2tldC5cbiAqXG4gKiBAc3RhdGVmdWxcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBzYW1wbGVUYWJsZUJ1Y2tldCA9IG5ldyBUYWJsZUJ1Y2tldChzY29wZSwgJ0V4YW1wbGVUYWJsZUJ1Y2tldCcsIHtcbiAqICAgdGFibGVCdWNrZXROYW1lOiAnZXhhbXBsZS1idWNrZXQnLFxuICogICAvLyBPcHRpb25hbCBmaWVsZHM6XG4gKiAgIHVucmVmZXJlbmNlZEZpbGVSZW1vdmFsOiB7XG4gKiAgICAgbm9uY3VycmVudERheXM6IDEyMyxcbiAqICAgICBzdGF0dXM6IFVucmVmZXJlbmNlZEZpbGVSZW1vdmFsU3RhdHVzLkVOQUJMRUQsXG4gKiAgICAgdW5yZWZlcmVuY2VkRGF5czogMTIzLFxuICogICB9LFxuICogfSk7XG4gKi9cbkBwcm9wZXJ0eUluamVjdGFibGVcbmV4cG9ydCBjbGFzcyBUYWJsZUJ1Y2tldCBleHRlbmRzIFRhYmxlQnVja2V0QmFzZSBpbXBsZW1lbnRzIElUYWdnYWJsZVYyIHtcbiAgLyoqIFVuaXF1ZWx5IGlkZW50aWZpZXMgdGhpcyBjbGFzcy4gKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBQUk9QRVJUWV9JTkpFQ1RJT05fSUQ6IHN0cmluZyA9ICdAYXdzLWNkay5hd3MtczN0YWJsZXMtYWxwaGEuVGFibGVCdWNrZXQnO1xuXG4gIC8qKlxuICAgKiBEZWZpbmVzIGEgVGFibGVCdWNrZXQgY29uc3RydWN0IGZyb20gYW4gZXh0ZXJuYWwgdGFibGUgYnVja2V0IEFSTi5cbiAgICpcbiAgICogQHBhcmFtIHNjb3BlIFRoZSBwYXJlbnQgY3JlYXRpbmcgY29uc3RydWN0ICh1c3VhbGx5IGB0aGlzYCkuXG4gICAqIEBwYXJhbSBpZCBUaGUgY29uc3RydWN0J3MgbmFtZS5cbiAgICogQHBhcmFtIHRhYmxlQnVja2V0QXJuIEFtYXpvbiBSZXNvdXJjZSBOYW1lIChhcm4pIG9mIHRoZSB0YWJsZSBidWNrZXRcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbVRhYmxlQnVja2V0QXJuKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHRhYmxlQnVja2V0QXJuOiBzdHJpbmcpOiBJVGFibGVCdWNrZXQge1xuICAgIHJldHVybiBUYWJsZUJ1Y2tldC5mcm9tVGFibGVCdWNrZXRBdHRyaWJ1dGVzKHNjb3BlLCBpZCwgeyB0YWJsZUJ1Y2tldEFybiB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZpbmVzIGEgVGFibGVCdWNrZXQgY29uc3RydWN0IHRoYXQgcmVwcmVzZW50cyBhbiBleHRlcm5hbCB0YWJsZSBidWNrZXQuXG4gICAqXG4gICAqIEBwYXJhbSBzY29wZSBUaGUgcGFyZW50IGNyZWF0aW5nIGNvbnN0cnVjdCAodXN1YWxseSBgdGhpc2ApLlxuICAgKiBAcGFyYW0gaWQgVGhlIGNvbnN0cnVjdCdzIG5hbWUuXG4gICAqIEBwYXJhbSBhdHRycyBBIGBUYWJsZUJ1Y2tldEF0dHJpYnV0ZXNgIG9iamVjdC4gQ2FuIGJlIG1hbnVhbGx5IGNyZWF0ZWQuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21UYWJsZUJ1Y2tldEF0dHJpYnV0ZXMoXG4gICAgc2NvcGU6IENvbnN0cnVjdCxcbiAgICBpZDogc3RyaW5nLFxuICAgIGF0dHJzOiBUYWJsZUJ1Y2tldEF0dHJpYnV0ZXMsXG4gICk6IElUYWJsZUJ1Y2tldCB7XG4gICAgY29uc3QgeyB0YWJsZUJ1Y2tldE5hbWUsIHJlZ2lvbiwgYWNjb3VudCwgdGFibGVCdWNrZXRBcm4gfSA9IHZhbGlkYXRlVGFibGVCdWNrZXRBdHRyaWJ1dGVzKHNjb3BlLCBhdHRycyk7XG4gICAgVGFibGVCdWNrZXQudmFsaWRhdGVUYWJsZUJ1Y2tldE5hbWUodGFibGVCdWNrZXROYW1lKTtcbiAgICBjbGFzcyBJbXBvcnQgZXh0ZW5kcyBUYWJsZUJ1Y2tldEJhc2Uge1xuICAgICAgcHVibGljIHJlYWRvbmx5IHRhYmxlQnVja2V0TmFtZSA9IHRhYmxlQnVja2V0TmFtZSE7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgdGFibGVCdWNrZXRBcm4gPSB0YWJsZUJ1Y2tldEFybjtcbiAgICAgIHB1YmxpYyByZWFkb25seSB0YWJsZUJ1Y2tldFBvbGljeT86IFRhYmxlQnVja2V0UG9saWN5O1xuICAgICAgcHVibGljIHJlYWRvbmx5IHJlZ2lvbiA9IHJlZ2lvbjtcbiAgICAgIHB1YmxpYyByZWFkb25seSBhY2NvdW50ID0gYWNjb3VudDtcbiAgICAgIHB1YmxpYyByZWFkb25seSBlbmNyeXB0aW9uS2V5Pzoga21zLklLZXkgPSBhdHRycy5lbmNyeXB0aW9uS2V5O1xuICAgICAgcHJvdGVjdGVkIGF1dG9DcmVhdGVQb2xpY3k6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgICAgLyoqXG4gICAgICAgKiBFeHBvcnRzIHRoaXMgYnVja2V0IGZyb20gdGhlIHN0YWNrLlxuICAgICAgICovXG4gICAgICBwdWJsaWMgZXhwb3J0KCkge1xuICAgICAgICByZXR1cm4gYXR0cnM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBJbXBvcnQoc2NvcGUsIGlkLCB7XG4gICAgICBhY2NvdW50LFxuICAgICAgcmVnaW9uLFxuICAgICAgcGh5c2ljYWxOYW1lOiB0YWJsZUJ1Y2tldE5hbWUsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGUgZ2l2ZW4gdGFibGUgYnVja2V0IG5hbWUgaXMgbm90IHZhbGlkLlxuICAgKlxuICAgKiBAcGFyYW0gYnVja2V0TmFtZSBuYW1lIG9mIHRoZSBidWNrZXQuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHZhbGlkYXRlVGFibGVCdWNrZXROYW1lKFxuICAgIGJ1Y2tldE5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgKSB7XG4gICAgaWYgKGJ1Y2tldE5hbWUgPT0gdW5kZWZpbmVkIHx8IFRva2VuLmlzVW5yZXNvbHZlZChidWNrZXROYW1lKSkge1xuICAgICAgLy8gdGhlIG5hbWUgaXMgYSBsYXRlLWJvdW5kIHZhbHVlLCBub3QgYSBkZWZpbmVkIHN0cmluZywgc28gc2tpcCB2YWxpZGF0aW9uXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgLy8gTGVuZ3RoIHZhbGlkYXRpb25cbiAgICBpZiAoYnVja2V0TmFtZS5sZW5ndGggPCAzIHx8IGJ1Y2tldE5hbWUubGVuZ3RoID4gNjMpIHtcbiAgICAgIGVycm9ycy5wdXNoKFxuICAgICAgICAnQnVja2V0IG5hbWUgbXVzdCBiZSBhdCBsZWFzdCAzIGFuZCBubyBtb3JlIHRoYW4gNjMgY2hhcmFjdGVycycsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIENoYXJhY3RlciBzZXQgdmFsaWRhdGlvblxuICAgIGNvbnN0IGlsbGVnYWxDaGFyc2V0UmVnRXggPSAvW15hLXowLTktXS87XG4gICAgY29uc3QgYWxsb3dlZEVkZ2VDaGFyc2V0UmVnRXggPSAvW2EtejAtOV0vO1xuXG4gICAgY29uc3QgaWxsZWdhbENoYXJNYXRjaCA9IGJ1Y2tldE5hbWUubWF0Y2goaWxsZWdhbENoYXJzZXRSZWdFeCk7XG4gICAgaWYgKGlsbGVnYWxDaGFyTWF0Y2gpIHtcbiAgICAgIGVycm9ycy5wdXNoKFxuICAgICAgICAnQnVja2V0IG5hbWUgbXVzdCBvbmx5IGNvbnRhaW4gbG93ZXJjYXNlIGNoYXJhY3RlcnMsIG51bWJlcnMsIGFuZCBoeXBoZW5zICgtKScgK1xuICAgICAgICAgIGAgKG9mZnNldDogJHtpbGxlZ2FsQ2hhck1hdGNoLmluZGV4fSlgLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBFZGdlIGNoYXJhY3RlciB2YWxpZGF0aW9uXG4gICAgaWYgKCFhbGxvd2VkRWRnZUNoYXJzZXRSZWdFeC50ZXN0KGJ1Y2tldE5hbWUuY2hhckF0KDApKSkge1xuICAgICAgZXJyb3JzLnB1c2goXG4gICAgICAgICdCdWNrZXQgbmFtZSBtdXN0IHN0YXJ0IHdpdGggYSBsb3dlcmNhc2UgbGV0dGVyIG9yIG51bWJlciAob2Zmc2V0OiAwKScsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICAhYWxsb3dlZEVkZ2VDaGFyc2V0UmVnRXgudGVzdChidWNrZXROYW1lLmNoYXJBdChidWNrZXROYW1lLmxlbmd0aCAtIDEpKVxuICAgICkge1xuICAgICAgZXJyb3JzLnB1c2goXG4gICAgICAgIGBCdWNrZXQgbmFtZSBtdXN0IGVuZCB3aXRoIGEgbG93ZXJjYXNlIGxldHRlciBvciBudW1iZXIgKG9mZnNldDogJHtcbiAgICAgICAgICBidWNrZXROYW1lLmxlbmd0aCAtIDFcbiAgICAgICAgfSlgLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgbGl0YEludmFsaWRUYWJsZUJ1Y2tldE5hbWVgLFxuICAgICAgICBgSW52YWxpZCBTMyB0YWJsZSBidWNrZXQgbmFtZSAodmFsdWU6ICR7YnVja2V0TmFtZX0pJHtFT0x9JHtlcnJvcnMuam9pbihFT0wpfWAsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaHJvd3MgYW4gZXhjZXB0aW9uIGlmIHRoZSBnaXZlbiB1bnJlZmVyZW5jZWRGaWxlUmVtb3ZhbFByb3BlcnR5IGlzIG5vdCB2YWxpZC5cbiAgICogQHBhcmFtIHVucmVmZXJlbmNlZEZpbGVSZW1vdmFsIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSB0YWJsZSBidWNrZXRcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgdmFsaWRhdGVVbnJlZmVyZW5jZWRGaWxlUmVtb3ZhbChcbiAgICB1bnJlZmVyZW5jZWRGaWxlUmVtb3ZhbD86IFVucmVmZXJlbmNlZEZpbGVSZW1vdmFsLFxuICApOiB2b2lkIHtcbiAgICAvLyBTa2lwIHZhbGlkYXRpb24gaWYgcHJvcGVydHkgaXMgbm90IGRlZmluZWRcbiAgICBpZiAoIXVucmVmZXJlbmNlZEZpbGVSZW1vdmFsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgeyBub25jdXJyZW50RGF5cywgc3RhdHVzLCB1bnJlZmVyZW5jZWREYXlzIH0gPSB1bnJlZmVyZW5jZWRGaWxlUmVtb3ZhbDtcblxuICAgIGNvbnN0IGVycm9yczogc3RyaW5nW10gPSBbXTtcblxuICAgIGlmIChub25jdXJyZW50RGF5cyAhPSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChub25jdXJyZW50RGF5cyA8IDEpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goJ25vbmN1cnJlbnREYXlzIG11c3QgYmUgYXQgbGVhc3QgMSBkYXknKTtcbiAgICAgIH1cbiAgICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihub25jdXJyZW50RGF5cykpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goJ25vbmN1cnJlbnREYXlzIG11c3QgYmUgYSB3aG9sZSBudW1iZXInKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodW5yZWZlcmVuY2VkRGF5cyAhPSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICh1bnJlZmVyZW5jZWREYXlzIDwgMSkge1xuICAgICAgICBlcnJvcnMucHVzaCgndW5yZWZlcmVuY2VkRGF5cyBtdXN0IGJlIGF0IGxlYXN0IDEgZGF5Jyk7XG4gICAgICB9XG4gICAgICBpZiAoIU51bWJlci5pc0ludGVnZXIobm9uY3VycmVudERheXMpKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKCd1bnJlZmVyZW5jZWREYXlzIG11c3QgYmUgYSB3aG9sZSBudW1iZXInKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBhbGxvd2VkU3RhdHVzID0gWydFbmFibGVkJywgJ0Rpc2FibGVkJ107XG4gICAgaWYgKHN0YXR1cyAhPSB1bmRlZmluZWQgJiYgIWFsbG93ZWRTdGF0dXMuaW5jbHVkZXMoc3RhdHVzKSkge1xuICAgICAgZXJyb3JzLnB1c2goJ3N0YXR1cyBtdXN0IGJlIG9uZSBvZiBcXCdFbmFibGVkXFwnIG9yIFxcJ0Rpc2FibGVkXFwnJyk7XG4gICAgfVxuXG4gICAgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIGxpdGBJbnZhbGlkVW5yZWZlcmVuY2VkRmlsZVJlbW92YWxQcm9wZXJ0eWAsXG4gICAgICAgIGBJbnZhbGlkIFVucmVmZXJlbmNlZEZpbGVSZW1vdmFsUHJvcGVydHl9KSR7RU9MfSR7ZXJyb3JzLmpvaW4oRU9MKX1gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIHVuZGVybHlpbmcgQ2ZuVGFibGVCdWNrZXQgTDEgcmVzb3VyY2VcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHJlc291cmNlOiBzM3RhYmxlcy5DZm5UYWJsZUJ1Y2tldDtcblxuICAvKipcbiAgICogVGhlIHRhZyBtYW5hZ2VyIGZvciB0aGlzIHJlc291cmNlLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNka1RhZ01hbmFnZXI6IFRhZ01hbmFnZXI7XG5cbiAgLyoqXG4gICAqIFRoZSByZXNvdXJjZSBwb2xpY3kgZm9yIHRoaXMgdGFibGVCdWNrZXQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdGFibGVCdWNrZXRQb2xpY3k/OiBUYWJsZUJ1Y2tldFBvbGljeTtcblxuICBwdWJsaWMgcmVhZG9ubHkgZW5jcnlwdGlvbktleT86IGttcy5JS2V5IHwgdW5kZWZpbmVkO1xuXG4gIHByb3RlY3RlZCBhdXRvQ3JlYXRlUG9saWN5OiBib29sZWFuID0gdHJ1ZTtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogVGFibGVCdWNrZXRQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwge1xuICAgICAgcGh5c2ljYWxOYW1lOiBwcm9wcy50YWJsZUJ1Y2tldE5hbWUsXG4gICAgfSk7XG5cbiAgICAvLyBFbmhhbmNlZCBDREsgQW5hbHl0aWNzIFRlbGVtZXRyeVxuICAgIGFkZENvbnN0cnVjdE1ldGFkYXRhKHRoaXMsIHByb3BzKTtcblxuICAgIFRhYmxlQnVja2V0LnZhbGlkYXRlVGFibGVCdWNrZXROYW1lKHByb3BzLnRhYmxlQnVja2V0TmFtZSk7XG4gICAgVGFibGVCdWNrZXQudmFsaWRhdGVVbnJlZmVyZW5jZWRGaWxlUmVtb3ZhbChwcm9wcy51bnJlZmVyZW5jZWRGaWxlUmVtb3ZhbCk7XG4gICAgY29uc3QgeyBidWNrZXRFbmNyeXB0aW9uLCBlbmNyeXB0aW9uS2V5IH0gPSB0aGlzLnBhcnNlRW5jcnlwdGlvbihwcm9wcyk7XG4gICAgdGhpcy5lbmNyeXB0aW9uS2V5ID0gZW5jcnlwdGlvbktleTtcblxuICAgIHRoaXMucmVzb3VyY2UgPSBuZXcgczN0YWJsZXMuQ2ZuVGFibGVCdWNrZXQodGhpcywgaWQsIHtcbiAgICAgIHRhYmxlQnVja2V0TmFtZTogcHJvcHMudGFibGVCdWNrZXROYW1lLFxuICAgICAgdW5yZWZlcmVuY2VkRmlsZVJlbW92YWw6IHtcbiAgICAgICAgLi4ucHJvcHMudW5yZWZlcmVuY2VkRmlsZVJlbW92YWwsXG4gICAgICAgIG5vbmN1cnJlbnREYXlzOiBwcm9wcy51bnJlZmVyZW5jZWRGaWxlUmVtb3ZhbD8ubm9uY3VycmVudERheXMsXG4gICAgICAgIHVucmVmZXJlbmNlZERheXM6IHByb3BzLnVucmVmZXJlbmNlZEZpbGVSZW1vdmFsPy51bnJlZmVyZW5jZWREYXlzLFxuICAgICAgfSxcbiAgICAgIGVuY3J5cHRpb25Db25maWd1cmF0aW9uOiBidWNrZXRFbmNyeXB0aW9uLFxuICAgICAgbWV0cmljc0NvbmZpZ3VyYXRpb246IHByb3BzLnJlcXVlc3RNZXRyaWNzU3RhdHVzID8geyBzdGF0dXM6IHByb3BzLnJlcXVlc3RNZXRyaWNzU3RhdHVzIH0gOiB1bmRlZmluZWQsXG4gICAgICBzdG9yYWdlQ2xhc3NDb25maWd1cmF0aW9uOiBwcm9wcy5zdG9yYWdlQ2xhc3MgPyB7IHN0b3JhZ2VDbGFzczogcHJvcHMuc3RvcmFnZUNsYXNzIH0gOiB1bmRlZmluZWQsXG4gICAgfSk7XG5cbiAgICB0aGlzLmNka1RhZ01hbmFnZXIgPSB0aGlzLnJlc291cmNlLmNka1RhZ01hbmFnZXI7XG4gICAgdGhpcy5yZXNvdXJjZS5hcHBseVJlbW92YWxQb2xpY3kocHJvcHMucmVtb3ZhbFBvbGljeSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhpcyB0YWJsZSBidWNrZXRcbiAgICovXG4gIEBtZW1vaXplZEdldHRlclxuICBwdWJsaWMgZ2V0IHRhYmxlQnVja2V0TmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFJlc291cmNlTmFtZUF0dHJpYnV0ZSh0aGlzLnJlc291cmNlLnJlZik7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHVuaXF1ZSBBbWF6b24gUmVzb3VyY2UgTmFtZSAoYXJuKSBvZiB0aGlzIHRhYmxlIGJ1Y2tldFxuICAgKi9cbiAgQG1lbW9pemVkR2V0dGVyXG4gIHB1YmxpYyBnZXQgdGFibGVCdWNrZXRBcm4oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5yZXNvdXJjZS5hdHRyVGFibGVCdWNrZXRBcm47XG4gIH1cblxuICAvKipcbiAgICogU2V0IHVwIGtleSBwcm9wZXJ0aWVzIGFuZCByZXR1cm4gdGhlIEJ1Y2tldCBlbmNyeXB0aW9uIHByb3BlcnR5IGZyb20gdGhlXG4gICAqIHVzZXIncyBjb25maWd1cmF0aW9uLCBhY2NvcmRpbmcgdG8gdGhlIGZvbGxvd2luZyB0YWJsZTpcbiAgICpcbiAgICogfCBwcm9wcy5lbmNyeXB0aW9uIHwgcHJvcHMuZW5jcnlwdGlvbktleSB8IGJ1Y2tldEVuY3J5cHRpb24gKHJldHVybiB2YWx1ZSkgfCBlbmNyeXB0aW9uS2V5IChyZXR1cm4gdmFsdWUpICB8XG4gICAqIHwtLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfFxuICAgKiB8IHVuZGVmaW5lZCAgICAgICAgfCB1bmRlZmluZWQgICAgICAgICAgIHwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICB8IHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgIHxcbiAgICogfCB1bmRlZmluZWQgICAgICAgIHwgayAgICAgICAgICAgICAgICAgICB8IGF3czprbXMgICAgICAgICAgICAgICAgICAgICAgICAgfCBrICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAqIHwgS01TICAgICAgICAgICAgICB8IHVuZGVmaW5lZCAgICAgICAgICAgfCBhd3M6a21zICAgICAgICAgICAgICAgICAgICAgICAgIHwgbmV3IGtleSAoYWxsb3cgbWFpbnRlbmFuY2UgU1ApfFxuICAgKiB8IEtNUyAgICAgICAgICAgICAgfCBrICAgICAgICAgICAgICAgICAgIHwgYXdzOmttcyAgICAgICAgICAgICAgICAgICAgICAgICB8IGsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICogfCBTM19NQU5BR0VEICAgICAgIHwgdW5kZWZpbmVkICAgICAgICAgICB8IEFFUzI1NiAgICAgICAgICAgICAgICAgICAgICAgICAgfCB1bmRlZmluZWQgICAgICAgICAgICAgICAgICAgICB8XG4gICAqIHwgUzNfTUFOQUdFRCAgICAgICB8IGsgICAgICAgICAgICAgICAgICAgfCBFUlJPUiEgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRVJST1IhICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgKi9cbiAgcHJpdmF0ZSBwYXJzZUVuY3J5cHRpb24ocHJvcHM6IFRhYmxlQnVja2V0UHJvcHMpOiB7XG4gICAgYnVja2V0RW5jcnlwdGlvbj86IHMzdGFibGVzLkNmblRhYmxlQnVja2V0LkVuY3J5cHRpb25Db25maWd1cmF0aW9uUHJvcGVydHk7XG4gICAgZW5jcnlwdGlvbktleT86IGttcy5JS2V5O1xuICB9IHtcbiAgICBjb25zdCBlbmNyeXB0aW9uVHlwZSA9IHByb3BzLmVuY3J5cHRpb247XG4gICAgbGV0IGtleSA9IHByb3BzLmVuY3J5cHRpb25LZXk7XG5cbiAgICBpZiAoZW5jcnlwdGlvblR5cGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKCBrZXkgPT09IHVuZGVmaW5lZCApIHtcbiAgICAgICAgcmV0dXJuIHsgYnVja2V0RW5jcnlwdGlvbjogdW5kZWZpbmVkLCBlbmNyeXB0aW9uS2V5OiB1bmRlZmluZWQgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgYnVja2V0RW5jcnlwdGlvbjoge1xuICAgICAgICAgICAga21zS2V5QXJuOiBrZXkua2V5QXJuLFxuICAgICAgICAgICAgc3NlQWxnb3JpdGhtOiBUYWJsZUJ1Y2tldEVuY3J5cHRpb24uS01TLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgZW5jcnlwdGlvbktleToga2V5LFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChlbmNyeXB0aW9uVHlwZSA9PT0gVGFibGVCdWNrZXRFbmNyeXB0aW9uLktNUykge1xuICAgICAgaWYgKCBrZXkgPT09IHVuZGVmaW5lZCApIHtcbiAgICAgICAga2V5ID0gbmV3IGttcy5LZXkodGhpcywgJ0tleScsIHtcbiAgICAgICAgICBkZXNjcmlwdGlvbjogYENyZWF0ZWQgYnkgJHt0aGlzLm5vZGUucGF0aH1gLFxuICAgICAgICAgIGVuYWJsZUtleVJvdGF0aW9uOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5hbGxvd1RhYmxlc01haW50ZW5hbmNlQWNjZXNzVG9LZXkoa2V5LCBwcm9wcy50YWJsZUJ1Y2tldE5hbWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYnVja2V0RW5jcnlwdGlvbjoge1xuICAgICAgICAgIGttc0tleUFybjoga2V5LmtleUFybixcbiAgICAgICAgICBzc2VBbGdvcml0aG06IFRhYmxlQnVja2V0RW5jcnlwdGlvbi5LTVMsXG4gICAgICAgIH0sXG4gICAgICAgIGVuY3J5cHRpb25LZXk6IGtleSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKGVuY3J5cHRpb25UeXBlID09PSBUYWJsZUJ1Y2tldEVuY3J5cHRpb24uUzNfTUFOQUdFRCkge1xuICAgICAgaWYgKCBrZXkgPT09IHVuZGVmaW5lZCApIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBidWNrZXRFbmNyeXB0aW9uOiB7XG4gICAgICAgICAgICBzc2VBbGdvcml0aG06IFRhYmxlQnVja2V0RW5jcnlwdGlvbi5TM19NQU5BR0VELFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IobGl0YEludmFsaWRFbmNyeXB0aW9uQ29uZmlndXJhdGlvbmAsICdFeHBlY3RlZCBlbmNyeXB0aW9uID0gYEtNU2Agd2l0aCB1c2VyIHByb3ZpZGVkIGVuY3J5cHRpb24ga2V5Jyk7XG4gICAgICB9XG4gICAgfVxuICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihsaXRgVW5rbm93bkVuY3J5cHRpb25Db25maWd1cmF0aW9uYCwgYFVua25vd24gZW5jcnlwdGlvbiBjb25maWd1cmF0aW9uIGRldGVjdGVkOiAke3Byb3BzLmVuY3J5cHRpb259IHdpdGgga2V5ICR7cHJvcHMuZW5jcnlwdGlvbktleX1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbGxvd2xpc3QgUzMgVGFibGVzIE1haW50ZW5hbmNlIHRvIGFjY2VzcyB0aGlzIHRhYmxlIGJ1Y2tldCdzIGVuY3J5cHRpb24ga2V5XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC91c2VyZ3VpZGUvczMtdGFibGVzLWttcy1wZXJtaXNzaW9ucy5odG1sXG4gICAqIEBwYXJhbSBlbmNyeXB0aW9uS2V5IFRoZSBrZXkgdG8gcHJvdmlkZSBhY2Nlc3MgdG9cbiAgICovXG4gIHByaXZhdGUgYWxsb3dUYWJsZXNNYWludGVuYW5jZUFjY2Vzc1RvS2V5KGVuY3J5cHRpb25LZXk6IGttcy5JS2V5LCB0YWJsZUJ1Y2tldE5hbWU6IHN0cmluZykge1xuICAgIGNvbnN0IHJlZ2lvbiA9IHRoaXMuc3RhY2sucmVnaW9uO1xuICAgIGNvbnN0IGFjY291bnQgPSB0aGlzLnN0YWNrLmFjY291bnQ7XG4gICAgY29uc3QgcGFydGl0aW9uID0gdGhpcy5zdGFjay5wYXJ0aXRpb247XG5cbiAgICBlbmNyeXB0aW9uS2V5LmFkZFRvUmVzb3VyY2VQb2xpY3kobmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgc2lkOiAnQWxsb3dTM1RhYmxlc01haW50ZW5hbmNlQWNjZXNzJyxcbiAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgIHByaW5jaXBhbHM6IFtcbiAgICAgICAgbmV3IGlhbS5TZXJ2aWNlUHJpbmNpcGFsKCdtYWludGVuYW5jZS5zM3RhYmxlcy5hbWF6b25hd3MuY29tJyksXG4gICAgICBdLFxuICAgICAgYWN0aW9uczogW1xuICAgICAgICAna21zOkdlbmVyYXRlRGF0YUtleScsXG4gICAgICAgICdrbXM6RGVjcnlwdCcsXG4gICAgICBdLFxuICAgICAgcmVzb3VyY2VzOiBbJyonXSxcbiAgICAgIGNvbmRpdGlvbnM6IHtcbiAgICAgICAgU3RyaW5nTGlrZToge1xuICAgICAgICAgICdrbXM6RW5jcnlwdGlvbkNvbnRleHQ6YXdzOnMzOmFybic6IGBhcm46JHtwYXJ0aXRpb259OnMzdGFibGVzOiR7cmVnaW9ufToke2FjY291bnR9OmJ1Y2tldC8ke3RhYmxlQnVja2V0TmFtZX0vKmAsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pKTtcbiAgfVxufVxuIl19
551
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtYnVja2V0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsidGFibGUtYnVja2V0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDJCQUF5QjtBQUN6Qix5REFBMkM7QUFDM0MseURBQTJDO0FBQzNDLG1FQUFxRDtBQUVyRCwyQ0FBeUY7QUFDekYsNEVBQTRFO0FBQzVFLDhFQUE4RTtBQUM5RSwwRUFBMEU7QUFFMUUscURBQXVDO0FBQ3ZDLCtEQUEwRDtBQUMxRCxpQ0FBdUQ7QUEwSHZEOztHQUVHO0FBQ0gsSUFBWSw2QkFVWDtBQVZELFdBQVksNkJBQTZCO0lBQ3ZDOztPQUVHO0lBQ0gsb0RBQW1CLENBQUE7SUFFbkI7O09BRUc7SUFDSCxzREFBcUIsQ0FBQTtBQUN2QixDQUFDLEVBVlcsNkJBQTZCLDZDQUE3Qiw2QkFBNkIsUUFVeEM7QUFFRDs7R0FFRztBQUNILElBQVksb0JBVVg7QUFWRCxXQUFZLG9CQUFvQjtJQUM5Qjs7T0FFRztJQUNILDJDQUFtQixDQUFBO0lBRW5COztPQUVHO0lBQ0gsNkNBQXFCLENBQUE7QUFDdkIsQ0FBQyxFQVZXLG9CQUFvQixvQ0FBcEIsb0JBQW9CLFFBVS9CO0FBRUQ7Ozs7O0dBS0c7QUFDSCxJQUFZLFlBZVg7QUFmRCxXQUFZLFlBQVk7SUFDdEI7Ozs7T0FJRztJQUNILHFDQUFxQixDQUFBO0lBRXJCOzs7OztPQUtHO0lBQ0gsMkRBQTJDLENBQUE7QUFDN0MsQ0FBQyxFQWZXLFlBQVksNEJBQVosWUFBWSxRQWV2QjtBQUVEOztHQUVHO0FBQ0gsSUFBWSxxQkFXWDtBQVhELFdBQVkscUJBQXFCO0lBQy9COzs7T0FHRztJQUNILHdDQUFlLENBQUE7SUFFZjs7T0FFRztJQUNILDhDQUFxQixDQUFBO0FBQ3ZCLENBQUMsRUFYVyxxQkFBcUIscUNBQXJCLHFCQUFxQixRQVdo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TSxDQUFDLEtBQUs7Z0JBQ3hCLFVBQVUsRUFBRTtvQkFDVixJQUFJLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxvQ0FBb0MsQ0FBQztpQkFDL0Q7Z0JBQ0QsT0FBTyxFQUFFO29CQUNQLHFCQUFxQjtvQkFDckIsYUFBYTtpQkFDZDtnQkFDRCxTQUFTLEVBQUUsQ0FBQyxHQUFHLENBQUM7Z0JBQ2hCLFVBQVUsRUFBRTtvQkFDVixVQUFVLEVBQUU7d0JBQ1Ysa0NBQWtDLEVBQUUsT0FBTyxTQUFTLGFBQWEsTUFBTSxJQUFJLE9BQU8sV0FBVyxlQUFlLElBQUk7cUJBQ2pIO2lCQUNGO2FBQ0YsQ0FBQyxDQUFDLENBQUM7U0FDTDs7WUFsVVUsdURBQVc7Ozs7O0FBQVgsa0NBQVciLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFT0wgfSBmcm9tICdvcyc7XG5pbXBvcnQgKiBhcyBpYW0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWlhbSc7XG5pbXBvcnQgKiBhcyBrbXMgZnJvbSAnYXdzLWNkay1saWIvYXdzLWttcyc7XG5pbXBvcnQgKiBhcyBzM3RhYmxlcyBmcm9tICdhd3MtY2RrLWxpYi9hd3MtczN0YWJsZXMnO1xuaW1wb3J0IHR5cGUgeyBJUmVzb3VyY2UsIElUYWdnYWJsZVYyLCBSZW1vdmFsUG9saWN5LCBUYWdNYW5hZ2VyIH0gZnJvbSAnYXdzLWNkay1saWIvY29yZSc7XG5pbXBvcnQgeyBMYXp5LCBOYW1lcywgUmVzb3VyY2UsIFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yLCBUb2tlbiB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUnO1xuaW1wb3J0IHsgbWVtb2l6ZWRHZXR0ZXIsIGxpdCB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUvbGliL2hlbHBlcnMtaW50ZXJuYWwnO1xuaW1wb3J0IHsgYWRkQ29uc3RydWN0TWV0YWRhdGEgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlL2xpYi9tZXRhZGF0YS1yZXNvdXJjZSc7XG5pbXBvcnQgeyBwcm9wZXJ0eUluamVjdGFibGUgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlL2xpYi9wcm9wLWluamVjdGFibGUnO1xuaW1wb3J0IHR5cGUgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCAqIGFzIHBlcm1zIGZyb20gJy4vcGVybWlzc2lvbnMnO1xuaW1wb3J0IHsgVGFibGVCdWNrZXRQb2xpY3kgfSBmcm9tICcuL3RhYmxlLWJ1Y2tldC1wb2xpY3knO1xuaW1wb3J0IHsgdmFsaWRhdGVUYWJsZUJ1Y2tldEF0dHJpYnV0ZXMgfSBmcm9tICcuL3V0aWwnO1xuXG4vKipcbiAqIEludGVyZmFjZSBkZWZpbml0aW9uIGZvciBTMyBUYWJsZSBCdWNrZXRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSVRhYmxlQnVja2V0IGV4dGVuZHMgSVJlc291cmNlIHtcbiAgLyoqXG4gICAqIFRoZSBBUk4gb2YgdGhlIHRhYmxlIGJ1Y2tldC5cbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgdGFibGVCdWNrZXRBcm46IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIHRhYmxlIGJ1Y2tldC5cbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgdGFibGVCdWNrZXROYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBhY2NvdW50SWQgY29udGFpbmluZyB0aGUgdGFibGUgYnVja2V0LlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBhY2NvdW50Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVnaW9uIGNvbnRhaW5pbmcgdGhlIHRhYmxlIGJ1Y2tldC5cbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgcmVnaW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBLTVMgZW5jcnlwdGlvbiBrZXkgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdGFibGUgYnVja2V0LlxuICAgKi9cbiAgcmVhZG9ubHkgZW5jcnlwdGlvbktleT86IGttcy5JS2V5O1xuXG4gIC8qKlxuICAgKiBBZGRzIGEgc3RhdGVtZW50IHRvIHRoZSByZXNvdXJjZSBwb2xpY3kgZm9yIGEgcHJpbmNpcGFsIChpLmUuXG4gICAqIGFjY291bnQvcm9sZS9zZXJ2aWNlKSB0byBwZXJmb3JtIGFjdGlvbnMgb24gdGhpcyB0YWJsZSBidWNrZXQgYW5kL29yIGl0c1xuICAgKiB0YWJsZXMuXG4gICAqXG4gICAqIE5vdGUgdGhhdCB0aGUgcG9saWN5IHN0YXRlbWVudCBtYXkgb3IgbWF5IG5vdCBiZSBhZGRlZCB0byB0aGUgcG9saWN5LlxuICAgKiBGb3IgZXhhbXBsZSwgd2hlbiBhbiBgSVRhYmxlQnVja2V0YCBpcyBjcmVhdGVkIGZyb20gYW4gZXhpc3RpbmcgdGFibGUgYnVja2V0LFxuICAgKiBpdCdzIG5vdCBwb3NzaWJsZSB0byB0ZWxsIHdoZXRoZXIgdGhlIGJ1Y2tldCBhbHJlYWR5IGhhcyBhIHBvbGljeVxuICAgKiBhdHRhY2hlZCwgbGV0IGFsb25lIHRvIHJlLXVzZSB0aGF0IHBvbGljeSB0byBhZGQgbW9yZSBzdGF0ZW1lbnRzIHRvIGl0LlxuICAgKiBTbyBpdCdzIHNhZmVzdCB0byBkbyBub3RoaW5nIGluIHRoZXNlIGNhc2VzLlxuICAgKlxuICAgKiBAcGFyYW0gc3RhdGVtZW50IHRoZSBwb2xpY3kgc3RhdGVtZW50IHRvIGJlIGFkZGVkIHRvIHRoZSBidWNrZXQnc1xuICAgKiBwb2xpY3kuXG4gICAqIEByZXR1cm5zIG1ldGFkYXRhIGFib3V0IHRoZSBleGVjdXRpb24gb2YgdGhpcyBtZXRob2QuIElmIHRoZSBwb2xpY3lcbiAgICogd2FzIG5vdCBhZGRlZCwgdGhlIHZhbHVlIG9mIGBzdGF0ZW1lbnRBZGRlZGAgd2lsbCBiZSBgZmFsc2VgLiBZb3VcbiAgICogc2hvdWxkIGFsd2F5cyBjaGVjayB0aGlzIHZhbHVlIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBvcGVyYXRpb24gd2FzXG4gICAqIGFjdHVhbGx5IGNhcnJpZWQgb3V0LiBPdGhlcndpc2UsIHN5bnRoZXNpcyBhbmQgZGVwbG95IHdpbGwgdGVybWluYXRlXG4gICAqIHNpbGVudGx5LCB3aGljaCBtYXkgYmUgY29uZnVzaW5nLlxuICAgKi9cbiAgYWRkVG9SZXNvdXJjZVBvbGljeShzdGF0ZW1lbnQ6IGlhbS5Qb2xpY3lTdGF0ZW1lbnQpOiBpYW0uQWRkVG9SZXNvdXJjZVBvbGljeVJlc3VsdDtcblxuICAvKipcbiAgICogR3JhbnQgcmVhZCBwZXJtaXNzaW9ucyBmb3IgdGhpcyB0YWJsZSBidWNrZXQgYW5kIGl0cyB0YWJsZXNcbiAgICogdG8gYW4gSUFNIHByaW5jaXBhbCAoUm9sZS9Hcm91cC9Vc2VyKS5cbiAgICpcbiAgICogSWYgZW5jcnlwdGlvbiBpcyB1c2VkLCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUga2V5IHRvIGRlY3J5cHQgdGhlIGNvbnRlbnRzXG4gICAqIG9mIHRoZSBidWNrZXQgd2lsbCBhbHNvIGJlIGdyYW50ZWQgdG8gdGhlIHNhbWUgcHJpbmNpcGFsLlxuICAgKlxuICAgKiBAcGFyYW0gaWRlbnRpdHkgVGhlIHByaW5jaXBhbCB0byBhbGxvdyByZWFkIHBlcm1pc3Npb25zIHRvXG4gICAqIEBwYXJhbSB0YWJsZUlkIEFsbG93IHRoZSBwZXJtaXNzaW9ucyB0byBhbGwgdGFibGVzIHVzaW5nICcqJyBvciB0byBzaW5nbGUgdGFibGUgYnkgaXRzIHVuaXF1ZSBJRC5cbiAgICovXG4gIGdyYW50UmVhZChpZGVudGl0eTogaWFtLklHcmFudGFibGUsIHRhYmxlSWQ6IHN0cmluZyk6IGlhbS5HcmFudDtcblxuICAvKipcbiAgICogR3JhbnQgd3JpdGUgcGVybWlzc2lvbnMgZm9yIHRoaXMgdGFibGUgYnVja2V0IGFuZCBpdHMgdGFibGVzXG4gICAqIHRvIGFuIElBTSBwcmluY2lwYWwgKFJvbGUvR3JvdXAvVXNlcikuXG4gICAqXG4gICAqIElmIGVuY3J5cHRpb24gaXMgdXNlZCwgcGVybWlzc2lvbiB0byB1c2UgdGhlIGtleSB0byBlbmNyeXB0IHRoZSBjb250ZW50c1xuICAgKiBvZiB0aGUgYnVja2V0IHdpbGwgYWxzbyBiZSBncmFudGVkIHRvIHRoZSBzYW1lIHByaW5jaXBhbC5cbiAgICpcbiAgICogQHBhcmFtIGlkZW50aXR5IFRoZSBwcmluY2lwYWwgdG8gYWxsb3cgd3JpdGUgcGVybWlzc2lvbnMgdG9cbiAgICogQHBhcmFtIHRhYmxlSWQgQWxsb3cgdGhlIHBlcm1pc3Npb25zIHRvIGFsbCB0YWJsZXMgdXNpbmcgJyonIG9yIHRvIHNpbmdsZSB0YWJsZSBieSBpdHMgdW5pcXVlIElELlxuICAgKi9cbiAgZ3JhbnRXcml0ZShpZGVudGl0eTogaWFtLklHcmFudGFibGUsIHRhYmxlSWQ6IHN0cmluZyk6IGlhbS5HcmFudDtcblxuICAvKipcbiAgICogR3JhbnQgcmVhZCBhbmQgd3JpdGUgcGVybWlzc2lvbnMgZm9yIHRoaXMgdGFibGUgYnVja2V0IGFuZCBpdHMgdGFibGVzXG4gICAqIHRvIGFuIElBTSBwcmluY2lwYWwgKFJvbGUvR3JvdXAvVXNlcikuXG4gICAqXG4gICAqIElmIGVuY3J5cHRpb24gaXMgdXNlZCwgcGVybWlzc2lvbiB0byB1c2UgdGhlIGtleSB0byBlbmNyeXB0L2RlY3J5cHQgdGhlIGNvbnRlbnRzXG4gICAqIG9mIHRoZSBidWNrZXQgd2lsbCBhbHNvIGJlIGdyYW50ZWQgdG8gdGhlIHNhbWUgcHJpbmNpcGFsLlxuICAgKlxuICAgKiBAcGFyYW0gaWRlbnRpdHkgVGhlIHByaW5jaXBhbCB0byBhbGxvdyByZWFkIGFuZCB3cml0ZSBwZXJtaXNzaW9ucyB0b1xuICAgKiBAcGFyYW0gdGFibGVJZCBBbGxvdyB0aGUgcGVybWlzc2lvbnMgdG8gYWxsIHRhYmxlcyB1c2luZyAnKicgb3IgdG8gc2luZ2xlIHRhYmxlIGJ5IGl0cyB1bmlxdWUgSUQuXG4gICAqL1xuICBncmFudFJlYWRXcml0ZShpZGVudGl0eTogaWFtLklHcmFudGFibGUsIHRhYmxlSWQ6IHN0cmluZyk6IGlhbS5HcmFudDtcbn1cblxuLyoqXG4gKiBVbnJlZmVyZW5jZWQgZmlsZSByZW1vdmFsIHNldHRpbmdzIGZvciB0aGUgdGhpcyB0YWJsZSBidWNrZXQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVW5yZWZlcmVuY2VkRmlsZVJlbW92YWwge1xuICAvKipcbiAgICogRHVyYXRpb24gYWZ0ZXIgd2hpY2ggbm9uY3VycmVudCBmaWxlcyBzaG91bGQgYmUgcmVtb3ZlZC4gU2hvdWxkIGJlIGF0IGxlYXN0IG9uZSBkYXkuXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC91c2VyZ3VpZGUvczMtdGFibGUtYnVja2V0cy1tYWludGVuYW5jZS5odG1sXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gU2VlIFMzIFRhYmxlcyBVc2VyIEd1aWRlXG4gICAqL1xuICByZWFkb25seSBub25jdXJyZW50RGF5cz86IG51bWJlcjtcblxuICAvKipcbiAgICogU3RhdHVzIG9mIHVucmVmZXJlbmNlZCBmaWxlIHJlbW92YWwuIENhbiBiZSBFbmFibGVkIG9yIERpc2FibGVkLlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25TMy9sYXRlc3QvdXNlcmd1aWRlL3MzLXRhYmxlLWJ1Y2tldHMtbWFpbnRlbmFuY2UuaHRtbFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIFNlZSBTMyBUYWJsZXMgVXNlciBHdWlkZVxuICAgKi9cbiAgcmVhZG9ubHkgc3RhdHVzPzogVW5yZWZlcmVuY2VkRmlsZVJlbW92YWxTdGF0dXM7XG5cbiAgLyoqXG4gICAqIER1cmF0aW9uIGFmdGVyIHdoaWNoIHVucmVmZXJlbmNlZCBmaWxlcyBzaG91bGQgYmUgcmVtb3ZlZC4gU2hvdWxkIGJlIGF0IGxlYXN0IG9uZSBkYXkuXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC91c2VyZ3VpZGUvczMtdGFibGUtYnVja2V0cy1tYWludGVuYW5jZS5odG1sXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gU2VlIFMzIFRhYmxlcyBVc2VyIEd1aWRlXG4gICAqL1xuICByZWFkb25seSB1bnJlZmVyZW5jZWREYXlzPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIENvbnRyb2xzIHdoZXRoZXIgdW5yZWZlcmVuY2VkIGZpbGUgcmVtb3ZhbCBpcyBlbmFibGVkIG9yIGRpc2FibGVkLlxuICovXG5leHBvcnQgZW51bSBVbnJlZmVyZW5jZWRGaWxlUmVtb3ZhbFN0YXR1cyB7XG4gIC8qKlxuICAgKiBFbmFibGUgdW5yZWZlcmVuY2VkIGZpbGUgcmVtb3ZhbC5cbiAgICovXG4gIEVOQUJMRUQgPSAnRW5hYmxlZCcsXG5cbiAgLyoqXG4gICAqIERpc2FibGUgdW5yZWZlcmVuY2VkIGZpbGUgcmVtb3ZhbC5cbiAgICovXG4gIERJU0FCTEVEID0gJ0Rpc2FibGVkJyxcbn1cblxuLyoqXG4gKiBDb250cm9scyB3aGV0aGVyIENsb3VkV2F0Y2ggcmVxdWVzdCBtZXRyaWNzIGFyZSBlbmFibGVkIG9yIGRpc2FibGVkIGZvciB0aGUgdGFibGUgYnVja2V0LlxuICovXG5leHBvcnQgZW51bSBSZXF1ZXN0TWV0cmljc1N0YXR1cyB7XG4gIC8qKlxuICAgKiBFbmFibGUgQ2xvdWRXYXRjaCByZXF1ZXN0IG1ldHJpY3MgZm9yIHRoZSB0YWJsZSBidWNrZXQuXG4gICAqL1xuICBFTkFCTEVEID0gJ0VuYWJsZWQnLFxuXG4gIC8qKlxuICAgKiBEaXNhYmxlIENsb3VkV2F0Y2ggcmVxdWVzdCBtZXRyaWNzIGZvciB0aGUgdGFibGUgYnVja2V0LlxuICAgKi9cbiAgRElTQUJMRUQgPSAnRGlzYWJsZWQnLFxufVxuXG4vKipcbiAqIFN0b3JhZ2UgY2xhc3MgZm9yIFMzIFRhYmxlcy5cbiAqXG4gKiBEZXRlcm1pbmVzIHRoZSBzdG9yYWdlIHRpZXIgdXNlZCBmb3IgdGFibGUgZGF0YSwgYWxsb3dpbmcgb3B0aW1pemF0aW9uXG4gKiBmb3IgZGlmZmVyZW50IGFjY2VzcyBwYXR0ZXJucyBhbmQgY29zdCBwcm9maWxlcy5cbiAqL1xuZXhwb3J0IGVudW0gU3RvcmFnZUNsYXNzIHtcbiAgLyoqXG4gICAqIFN0YW5kYXJkIHN0b3JhZ2UgY2xhc3MgZm9yIGZyZXF1ZW50bHkgYWNjZXNzZWQgZGF0YS5cbiAgICpcbiAgICogVXNlIHRoaXMgZm9yIHRhYmxlcyB3aXRoIGNvbnNpc3RlbnQsIGhpZ2gtZnJlcXVlbmN5IGFjY2VzcyBwYXR0ZXJucy5cbiAgICovXG4gIFNUQU5EQVJEID0gJ1NUQU5EQVJEJyxcblxuICAvKipcbiAgICogSW50ZWxsaWdlbnQtVGllcmluZyBzdG9yYWdlIGNsYXNzIHRoYXQgYXV0b21hdGljYWxseSBtb3ZlcyBkYXRhIGJldHdlZW4gYWNjZXNzIHRpZXJzLlxuICAgKlxuICAgKiBVc2UgdGhpcyBmb3IgdGFibGVzIHdpdGggdW5rbm93biBvciBjaGFuZ2luZyBhY2Nlc3MgcGF0dGVybnMgdG8gb3B0aW1pemUgY29zdHNcbiAgICogd2hpbGUgbWFpbnRhaW5pbmcgcGVyZm9ybWFuY2UgZm9yIGZyZXF1ZW50bHkgYWNjZXNzZWQgZGF0YS5cbiAgICovXG4gIElOVEVMTElHRU5UX1RJRVJJTkcgPSAnSU5URUxMSUdFTlRfVElFUklORycsXG59XG5cbi8qKlxuICogQ29udHJvbHMgU2VydmVyIFNpZGUgRW5jcnlwdGlvbiAoU1NFKSBmb3IgdGhpcyBUYWJsZUJ1Y2tldC5cbiAqL1xuZXhwb3J0IGVudW0gVGFibGVCdWNrZXRFbmNyeXB0aW9uIHtcbiAgLyoqXG4gICAqIFVzZSBhIGN1c3RvbWVyIGRlZmluZWQgS01TIGtleSBmb3IgZW5jcnlwdGlvblxuICAgKiBJZiBgZW5jcnlwdGlvbktleWAgaXMgc3BlY2lmaWVkLCB0aGlzIGtleSB3aWxsIGJlIHVzZWQsIG90aGVyd2lzZSwgb25lIHdpbGwgYmUgZGVmaW5lZC5cbiAgICovXG4gIEtNUyA9ICdhd3M6a21zJyxcblxuICAvKipcbiAgICogVXNlIFMzIG1hbmFnZWQgZW5jcnlwdGlvbiBrZXlzIHdpdGggQUVTMjU2IGVuY3J5cHRpb25cbiAgICovXG4gIFMzX01BTkFHRUQgPSAnQUVTMjU2Jyxcbn1cblxuYWJzdHJhY3QgY2xhc3MgVGFibGVCdWNrZXRCYXNlIGV4dGVuZHMgUmVzb3VyY2UgaW1wbGVtZW50cyBJVGFibGVCdWNrZXQge1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgdGFibGVCdWNrZXRBcm46IHN0cmluZztcbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IHRhYmxlQnVja2V0TmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcmVzb3VyY2UgcG9saWN5IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRhYmxlIGJ1Y2tldC5cbiAgICpcbiAgICogSWYgYGF1dG9DcmVhdGVQb2xpY3lgIGlzIHRydWUsIGEgYFRhYmxlQnVja2V0UG9saWN5YCB3aWxsIGJlIGNyZWF0ZWQgdXBvbiB0aGVcbiAgICogZmlyc3QgY2FsbCB0byBhZGRUb1Jlc291cmNlUG9saWN5KHMpLlxuICAgKi9cbiAgcHVibGljIGFic3RyYWN0IHRhYmxlQnVja2V0UG9saWN5PzogVGFibGVCdWNrZXRQb2xpY3k7XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiBhIHRhYmxlIGJ1Y2tldCByZXNvdXJjZSBwb2xpY3kgc2hvdWxkIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCB1cG9uXG4gICAqIHRoZSBmaXJzdCBjYWxsIHRvIGBhZGRUb1Jlc291cmNlUG9saWN5YC5cbiAgICovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBhdXRvQ3JlYXRlUG9saWN5OiBib29sZWFuO1xuXG4gIHB1YmxpYyBhYnN0cmFjdCBlbmNyeXB0aW9uS2V5Pzoga21zLklLZXkgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBzdGF0ZW1lbnQgdG8gdGhlIHJlc291cmNlIHBvbGljeSBmb3IgYSBwcmluY2lwYWwgKGkuZS5cbiAgICogYWNjb3VudC9yb2xlL3NlcnZpY2UpIHRvIHBlcmZvcm0gYWN0aW9ucyBvbiB0aGlzIHRhYmxlIGJ1Y2tldCBhbmQvb3IgaXRzXG4gICAqIGNvbnRlbnRzLiBVc2UgYHRhYmxlQnVja2V0QXJuYCBhbmQgYGFybkZvck9iamVjdHMoa2V5cylgIHRvIG9idGFpbiBBUk5zIGZvclxuICAgKiB0aGlzIGJ1Y2tldCBvciBvYmplY3RzLlxuICAgKlxuICAgKiBOb3RlIHRoYXQgdGhlIHBvbGljeSBzdGF0ZW1lbnQgbWF5IG9yIG1heSBub3QgYmUgYWRkZWQgdG8gdGhlIHBvbGljeS5cbiAgICogRm9yIGV4YW1wbGUsIHdoZW4gYW4gYElUYWJsZUJ1Y2tldGAgaXMgY3JlYXRlZCBmcm9tIGFuIGV4aXN0aW5nIHRhYmxlIGJ1Y2tldCxcbiAgICogaXQncyBub3QgcG9zc2libGUgdG8gdGVsbCB3aGV0aGVyIHRoZSBidWNrZXQgYWxyZWFkeSBoYXMgYSBwb2xpY3lcbiAgICogYXR0YWNoZWQsIGxldCBhbG9uZSB0byByZS11c2UgdGhhdCBwb2xpY3kgdG8gYWRkIG1vcmUgc3RhdGVtZW50cyB0byBpdC5cbiAgICogU28gaXQncyBzYWZlc3QgdG8gZG8gbm90aGluZyBpbiB0aGVzZSBjYXNlcy5cbiAgICpcbiAgICogQHBhcmFtIHN0YXRlbWVudCB0aGUgcG9saWN5IHN0YXRlbWVudCB0byBiZSBhZGRlZCB0byB0aGUgYnVja2V0J3NcbiAgICogcG9saWN5LlxuICAgKiBAcmV0dXJucyBtZXRhZGF0YSBhYm91dCB0aGUgZXhlY3V0aW9uIG9mIHRoaXMgbWV0aG9kLiBJZiB0aGUgcG9saWN5XG4gICAqIHdhcyBub3QgYWRkZWQsIHRoZSB2YWx1ZSBvZiBgc3RhdGVtZW50QWRkZWRgIHdpbGwgYmUgYGZhbHNlYC4gWW91XG4gICAqIHNob3VsZCBhbHdheXMgY2hlY2sgdGhpcyB2YWx1ZSB0byBtYWtlIHN1cmUgdGhhdCB0aGUgb3BlcmF0aW9uIHdhc1xuICAgKiBhY3R1YWxseSBjYXJyaWVkIG91dC4gT3RoZXJ3aXNlLCBzeW50aGVzaXMgYW5kIGRlcGxveSB3aWxsIHRlcm1pbmF0ZVxuICAgKiBzaWxlbnRseSwgd2hpY2ggbWF5IGJlIGNvbmZ1c2luZy5cbiAgICovXG4gIHB1YmxpYyBhZGRUb1Jlc291cmNlUG9saWN5KFxuICAgIHN0YXRlbWVudDogaWFtLlBvbGljeVN0YXRlbWVudCxcbiAgKTogaWFtLkFkZFRvUmVzb3VyY2VQb2xpY3lSZXN1bHQge1xuICAgIGlmICghdGhpcy50YWJsZUJ1Y2tldFBvbGljeSAmJiB0aGlzLmF1dG9DcmVhdGVQb2xpY3kpIHtcbiAgICAgIHRoaXMudGFibGVCdWNrZXRQb2xpY3kgPSBuZXcgVGFibGVCdWNrZXRQb2xpY3kodGhpcywgJ0RlZmF1bHRQb2xpY3knLCB7XG4gICAgICAgIHRhYmxlQnVja2V0OiB0aGlzLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudGFibGVCdWNrZXRQb2xpY3kpIHtcbiAgICAgIHRoaXMudGFibGVCdWNrZXRQb2xpY3kuZG9jdW1lbnQuYWRkU3RhdGVtZW50cyhzdGF0ZW1lbnQpO1xuICAgICAgcmV0dXJuIHsgc3RhdGVtZW50QWRkZWQ6IHRydWUsIHBvbGljeURlcGVuZGFibGU6IHRoaXMudGFibGVCdWNrZXRQb2xpY3kgfTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBzdGF0ZW1lbnRBZGRlZDogZmFsc2UgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBbZGlzYWJsZS1hd3NsaW50Om5vLWdyYW50c11cbiAgICovXG4gIHB1YmxpYyBncmFudFJlYWQoaWRlbnRpdHk6IGlhbS5JR3JhbnRhYmxlLCB0YWJsZUlkOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5ncmFudChcbiAgICAgIGlkZW50aXR5LFxuICAgICAgcGVybXMuVEFCTEVfQlVDS0VUX1JFQURfQUNDRVNTLFxuICAgICAgcGVybXMuS0VZX1JFQURfQUNDRVNTLFxuICAgICAgdGhpcy50YWJsZUJ1Y2tldEFybixcbiAgICAgIHRoaXMuZ2V0VGFibGVBcm4odGFibGVJZCksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBbZGlzYWJsZS1hd3NsaW50Om5vLWdyYW50c11cbiAgICovXG4gIHB1YmxpYyBncmFudFdyaXRlKGlkZW50aXR5OiBpYW0uSUdyYW50YWJsZSwgdGFibGVJZDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuZ3JhbnQoXG4gICAgICBpZGVudGl0eSxcbiAgICAgIHBlcm1zLlRBQkxFX0JVQ0tFVF9XUklURV9BQ0NFU1MsXG4gICAgICBwZXJtcy5LRVlfUkVBRF9XUklURV9BQ0NFU1MsXG4gICAgICB0aGlzLnRhYmxlQnVja2V0QXJuLFxuICAgICAgdGhpcy5nZXRUYWJsZUFybih0YWJsZUlkKSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFtkaXNhYmxlLWF3c2xpbnQ6bm8tZ3JhbnRzXVxuICAgKi9cbiAgcHVibGljIGdyYW50UmVhZFdyaXRlKGlkZW50aXR5OiBpYW0uSUdyYW50YWJsZSwgdGFibGVJZDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuZ3JhbnQoXG4gICAgICBpZGVudGl0eSxcbiAgICAgIHBlcm1zLlRBQkxFX0JVQ0tFVF9SRUFEX1dSSVRFX0FDQ0VTUyxcbiAgICAgIHBlcm1zLktFWV9XUklURV9BQ0NFU1MsXG4gICAgICB0aGlzLnRhYmxlQnVja2V0QXJuLFxuICAgICAgdGhpcy5nZXRUYWJsZUFybih0YWJsZUlkKSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyB0aGUgZ2l2ZW4gczN0YWJsZXMgcGVybWlzc2lvbnMgdG8gdGhlIHByb3ZpZGVkIHByaW5jaXBhbFxuICAgKiBAcmV0dXJucyBHcmFudCBvYmplY3RcbiAgICovXG4gIHByaXZhdGUgZ3JhbnQoXG4gICAgZ3JhbnRlZTogaWFtLklHcmFudGFibGUsXG4gICAgdGFibGVCdWNrZXRBY3Rpb25zOiBzdHJpbmdbXSxcbiAgICBrZXlBY3Rpb25zOiBzdHJpbmdbXSxcbiAgICByZXNvdXJjZUFybjogc3RyaW5nLFxuICAgIC4uLm90aGVyUmVzb3VyY2VBcm5zOiAoc3RyaW5nIHwgdW5kZWZpbmVkKVtdKSB7XG4gICAgY29uc3QgcmVzb3VyY2VzID0gW3Jlc291cmNlQXJuLCAuLi5vdGhlclJlc291cmNlQXJuc10uZmlsdGVyKGFybiA9PiBhcm4gIT0gdW5kZWZpbmVkKTtcblxuICAgIGNvbnN0IGdyYW50ID0gaWFtLkdyYW50LmFkZFRvUHJpbmNpcGFsT3JSZXNvdXJjZSh7XG4gICAgICBncmFudGVlLFxuICAgICAgYWN0aW9uczogdGFibGVCdWNrZXRBY3Rpb25zLFxuICAgICAgcmVzb3VyY2VBcm5zOiByZXNvdXJjZXMsXG4gICAgICByZXNvdXJjZTogdGhpcyxcbiAgICB9KTtcblxuICAgIGlmICh0aGlzLmVuY3J5cHRpb25LZXkgJiYga2V5QWN0aW9ucyAmJiBrZXlBY3Rpb25zLmxlbmd0aCAhPT0gMCkge1xuICAgICAgdGhpcy5lbmNyeXB0aW9uS2V5LmdyYW50KGdyYW50ZWUsIC4uLmtleUFjdGlvbnMpO1xuICAgIH1cblxuICAgIHJldHVybiBncmFudDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VGFibGVBcm4odGFibGVJZDogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHRhYmxlSWQgPyBgJHt0aGlzLnRhYmxlQnVja2V0QXJufS90YWJsZS8ke3RhYmxlSWR9YCA6IHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIGNvbnN0cnVjdGluZyBhIFRhYmxlQnVja2V0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGFibGVCdWNrZXRQcm9wcyB7XG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSBTMyBUYWJsZUJ1Y2tldC5cbiAgICogQGxpbmsgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC91c2VyZ3VpZGUvczMtdGFibGVzLWJ1Y2tldHMtbmFtaW5nLmh0bWwjdGFibGUtYnVja2V0cy1uYW1pbmctcnVsZXNcbiAgICpcbiAgICogV2hlbiBvbWl0dGVkLCB0aGUgYXV0by1nZW5lcmF0ZWQgbmFtZSBpcyBkZXJpdmVkIGZyb20gdGhlIGNvbnN0cnVjdCBwYXRoIGFuZCBpc1xuICAgKiB0aGVyZWZvcmUgbm90IHN0YWJsZSBhY3Jvc3Mgc3RhY2sgb3IgY29uc3RydWN0IHJlbmFtZXMg4oCUIHBhc3MgYW4gZXhwbGljaXQgbmFtZVxuICAgKiB3aGVuIHlvdSBuZWVkIGEgZml4ZWQgaWRlbnRpZmllciBhY3Jvc3MgZGVwbG95bWVudHMuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gZ2VuZXJhdGVkIGJ5IENESyBmcm9tIHRoZSBzdGFjayBhbmQgY29uc3RydWN0IHBhdGguXG4gICAqL1xuICByZWFkb25seSB0YWJsZUJ1Y2tldE5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFVucmVmZXJlbmNlZCBmaWxlIHJlbW92YWwgc2V0dGluZ3MgZm9yIHRoZSBTMyBUYWJsZUJ1Y2tldC5cbiAgICogQGxpbmsgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0Nsb3VkRm9ybWF0aW9uL2xhdGVzdC9Vc2VyR3VpZGUvYXdzLXByb3BlcnRpZXMtczN0YWJsZXMtdGFibGVidWNrZXQtdW5yZWZlcmVuY2VkZmlsZXJlbW92YWwuaHRtbFxuICAgKiBAZGVmYXVsdCBFbmFibGVkIHdpdGggZGVmYXVsdCB2YWx1ZXNcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L3VzZXJndWlkZS9zMy10YWJsZS1idWNrZXRzLW1haW50ZW5hbmNlLmh0bWxcbiAgICovXG4gIHJlYWRvbmx5IHVucmVmZXJlbmNlZEZpbGVSZW1vdmFsPzogVW5yZWZlcmVuY2VkRmlsZVJlbW92YWw7XG5cbiAgLyoqXG4gICAqIEFXUyByZWdpb24gdGhhdCB0aGUgdGFibGUgYnVja2V0IGV4aXN0cyBpbi5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBpdCdzIGFzc3VtZWQgdGhlIGJ1Y2tldCBpcyBpbiB0aGUgc2FtZSByZWdpb24gYXMgdGhlIHNjb3BlIGl0J3MgYmVpbmcgaW1wb3J0ZWQgaW50b1xuICAgKi9cbiAgcmVhZG9ubHkgcmVnaW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBV1MgQWNjb3VudCBJRCBvZiB0aGUgdGFibGUgYnVja2V0IG93bmVyLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGl0J3MgYXNzdW1lZCB0aGUgYnVja2V0IGJlbG9uZ3MgdG8gdGhlIHNhbWUgYWNjb3VudCBhcyB0aGUgc2NvcGUgaXQncyBiZWluZyBpbXBvcnRlZCBpbnRvXG4gICAqL1xuICByZWFkb25seSBhY2NvdW50Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUga2luZCBvZiBzZXJ2ZXItc2lkZSBlbmNyeXB0aW9uIHRvIGFwcGx5IHRvIHRoaXMgYnVja2V0LlxuICAgKlxuICAgKiBJZiB5b3UgY2hvb3NlIEtNUywgeW91IGNhbiBzcGVjaWZ5IGEgS01TIGtleSB2aWEgYGVuY3J5cHRpb25LZXlgLiBJZlxuICAgKiBlbmNyeXB0aW9uIGtleSBpcyBub3Qgc3BlY2lmaWVkLCBhIGtleSB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgY3JlYXRlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBgS01TYCBpZiBgZW5jcnlwdGlvbktleWAgaXMgc3BlY2lmaWVkLCBvciBgUzNfTUFOQUdFRGAgb3RoZXJ3aXNlLlxuICAgKi9cbiAgcmVhZG9ubHkgZW5jcnlwdGlvbj86IFRhYmxlQnVja2V0RW5jcnlwdGlvbjtcblxuICAvKipcbiAgICogRXh0ZXJuYWwgS01TIGtleSB0byB1c2UgZm9yIGJ1Y2tldCBlbmNyeXB0aW9uLlxuICAgKlxuICAgKiBUaGUgYGVuY3J5cHRpb25gIHByb3BlcnR5IG11c3QgYmUgZWl0aGVyIG5vdCBzcGVjaWZpZWQgb3Igc2V0IHRvIGBLTVNgLlxuICAgKiBBbiBlcnJvciB3aWxsIGJlIGVtaXR0ZWQgaWYgYGVuY3J5cHRpb25gIGlzIHNldCB0byBgUzNfTUFOQUdFRGAuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gSWYgYGVuY3J5cHRpb25gIGlzIHNldCB0byBgS01TYCBhbmQgdGhpcyBwcm9wZXJ0eSBpcyB1bmRlZmluZWQsXG4gICAqIGEgbmV3IEtNUyBrZXkgd2lsbCBiZSBjcmVhdGVkIGFuZCBhc3NvY2lhdGVkIHdpdGggdGhpcyBidWNrZXQuXG4gICAqL1xuICByZWFkb25seSBlbmNyeXB0aW9uS2V5Pzoga21zLklLZXk7XG5cbiAgLyoqXG4gICAqIENvbnRyb2xzIHdoYXQgaGFwcGVucyB0byB0aGlzIHRhYmxlIGJ1Y2tldCBpdCBpdCBzdG9wZWQgYmVpbmcgbWFuYWdlZCBieSBjbG91ZGZvcm1hdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgUkVUQUlOXG4gICAqL1xuICByZWFkb25seSByZW1vdmFsUG9saWN5PzogUmVtb3ZhbFBvbGljeTtcblxuICAvKipcbiAgICogQ2xvdWRXYXRjaCByZXF1ZXN0IG1ldHJpY3MgY29uZmlndXJhdGlvbiBmb3IgdGhlIHRhYmxlIGJ1Y2tldC5cbiAgICpcbiAgICogV2hlbiBlbmFibGVkLCBTMyBUYWJsZXMgcHVibGlzaGVzIENsb3VkV2F0Y2ggcmVxdWVzdCBtZXRyaWNzIGZvciB0aGUgdGFibGUgYnVja2V0LlxuICAgKiBSZXF1ZXN0IG1ldHJpY3MgcHJvdmlkZSBpbnNpZ2h0IGludG8gQW1hem9uIFMzIFRhYmxlcyByZXF1ZXN0cy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBSZXF1ZXN0IG1ldHJpY3MgYXJlIGRpc2FibGVkXG4gICAqL1xuICByZWFkb25seSByZXF1ZXN0TWV0cmljc1N0YXR1cz86IFJlcXVlc3RNZXRyaWNzU3RhdHVzO1xuXG4gIC8qKlxuICAgKiBUaGUgc3RvcmFnZSBjbGFzcyBmb3IgdGhlIHRhYmxlIGJ1Y2tldC5cbiAgICpcbiAgICogRGV0ZXJtaW5lcyB0aGUgc3RvcmFnZSB0aWVyIHVzZWQgZm9yIHRhYmxlIGRhdGEsIGFsbG93aW5nIG9wdGltaXphdGlvblxuICAgKiBmb3IgZGlmZmVyZW50IGFjY2VzcyBwYXR0ZXJucyBhbmQgY29zdCBwcm9maWxlcy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBTVEFOREFSRCBzdG9yYWdlIGNsYXNzXG4gICAqL1xuICByZWFkb25seSBzdG9yYWdlQ2xhc3M/OiBTdG9yYWdlQ2xhc3M7XG59XG5cbi8qKlxuICogQSByZWZlcmVuY2UgdG8gYSB0YWJsZSBidWNrZXQgb3V0c2lkZSB0aGlzIHN0YWNrXG4gKlxuICogVGhlIHRhYmxlQnVja2V0TmFtZSwgcmVnaW9uLCBhbmQgYWNjb3VudCBjYW4gYmUgcHJvdmlkZWQgZXhwbGljaXRseVxuICogb3Igd2lsbCBiZSBpbmZlcnJlZCBmcm9tIHRoZSB0YWJsZUJ1Y2tldEFyblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRhYmxlQnVja2V0QXR0cmlidXRlcyB7XG4gIC8qKlxuICAgKiBBV1MgcmVnaW9uIHRoaXMgdGFibGUgYnVja2V0IGV4aXN0cyBpblxuICAgKiBAZGVmYXVsdCByZWdpb24gaW5mZXJyZWQgZnJvbSBzY29wZVxuICAgKi9cbiAgcmVhZG9ubHkgcmVnaW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgYWNjb3VudElkIGNvbnRhaW5pbmcgdGhpcyB0YWJsZSBidWNrZXRcbiAgICogQGRlZmF1bHQgYWNjb3VudCBpbmZlcnJlZCBmcm9tIHNjb3BlXG4gICAqL1xuICByZWFkb25seSBhY2NvdW50Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdGFibGUgYnVja2V0IG5hbWUsIHVuaXF1ZSBwZXIgcmVnaW9uXG4gICAqIEBkZWZhdWx0IHRhYmxlQnVja2V0TmFtZSBpbmZlcnJlZCBmcm9tIGFyblxuICAgKi9cbiAgcmVhZG9ubHkgdGFibGVCdWNrZXROYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdGFibGUgYnVja2V0J3MgQVJOLlxuICAgKiBAZGVmYXVsdCB0YWJsZUJ1Y2tldEFybiBjb25zdHJ1Y3RlZCBmcm9tIHJlZ2lvbiwgYWNjb3VudCBhbmQgdGFibGVCdWNrZXROYW1lIGFyZSBwcm92aWRlZFxuICAgKi9cbiAgcmVhZG9ubHkgdGFibGVCdWNrZXRBcm4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsIEtNUyBlbmNyeXB0aW9uIGtleSBhc3NvY2lhdGVkIHdpdGggdGhpcyBidWNrZXQuXG4gICAqIEBkZWZhdWx0IC0gdW5kZWZpbmVkXG4gICAqL1xuICByZWFkb25seSBlbmNyeXB0aW9uS2V5Pzoga21zLklLZXk7XG59XG5cbi8qKlxuICogQW4gUzMgdGFibGUgYnVja2V0IHdpdGggaGVscGVycyBmb3IgYXNzb2NpYXRlZCByZXNvdXJjZSBwb2xpY2llc1xuICpcbiAqIFRoaXMgYnVja2V0IG1heSBub3QgeWV0IGhhdmUgYWxsIGZlYXR1cmVzIHRoYXQgZXhwb3NlZCBieSB0aGUgdW5kZXJseWluZyBDZm5UYWJsZUJ1Y2tldC5cbiAqXG4gKiBAc3RhdGVmdWxcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBzYW1wbGVUYWJsZUJ1Y2tldCA9IG5ldyBUYWJsZUJ1Y2tldChzY29wZSwgJ0V4YW1wbGVUYWJsZUJ1Y2tldCcsIHtcbiAqICAgdGFibGVCdWNrZXROYW1lOiAnZXhhbXBsZS1idWNrZXQnLFxuICogICAvLyBPcHRpb25hbCBmaWVsZHM6XG4gKiAgIHVucmVmZXJlbmNlZEZpbGVSZW1vdmFsOiB7XG4gKiAgICAgbm9uY3VycmVudERheXM6IDEyMyxcbiAqICAgICBzdGF0dXM6IFVucmVmZXJlbmNlZEZpbGVSZW1vdmFsU3RhdHVzLkVOQUJMRUQsXG4gKiAgICAgdW5yZWZlcmVuY2VkRGF5czogMTIzLFxuICogICB9LFxuICogfSk7XG4gKi9cbkBwcm9wZXJ0eUluamVjdGFibGVcbmV4cG9ydCBjbGFzcyBUYWJsZUJ1Y2tldCBleHRlbmRzIFRhYmxlQnVja2V0QmFzZSBpbXBsZW1lbnRzIElUYWdnYWJsZVYyIHtcbiAgLyoqIFVuaXF1ZWx5IGlkZW50aWZpZXMgdGhpcyBjbGFzcy4gKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBQUk9QRVJUWV9JTkpFQ1RJT05fSUQ6IHN0cmluZyA9ICdAYXdzLWNkay5hd3MtczN0YWJsZXMtYWxwaGEuVGFibGVCdWNrZXQnO1xuXG4gIC8qKlxuICAgKiBEZWZpbmVzIGEgVGFibGVCdWNrZXQgY29uc3RydWN0IGZyb20gYW4gZXh0ZXJuYWwgdGFibGUgYnVja2V0IEFSTi5cbiAgICpcbiAgICogQHBhcmFtIHNjb3BlIFRoZSBwYXJlbnQgY3JlYXRpbmcgY29uc3RydWN0ICh1c3VhbGx5IGB0aGlzYCkuXG4gICAqIEBwYXJhbSBpZCBUaGUgY29uc3RydWN0J3MgbmFtZS5cbiAgICogQHBhcmFtIHRhYmxlQnVja2V0QXJuIEFtYXpvbiBSZXNvdXJjZSBOYW1lIChhcm4pIG9mIHRoZSB0YWJsZSBidWNrZXRcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbVRhYmxlQnVja2V0QXJuKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHRhYmxlQnVja2V0QXJuOiBzdHJpbmcpOiBJVGFibGVCdWNrZXQge1xuICAgIHJldHVybiBUYWJsZUJ1Y2tldC5mcm9tVGFibGVCdWNrZXRBdHRyaWJ1dGVzKHNjb3BlLCBpZCwgeyB0YWJsZUJ1Y2tldEFybiB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZpbmVzIGEgVGFibGVCdWNrZXQgY29uc3RydWN0IHRoYXQgcmVwcmVzZW50cyBhbiBleHRlcm5hbCB0YWJsZSBidWNrZXQuXG4gICAqXG4gICAqIEBwYXJhbSBzY29wZSBUaGUgcGFyZW50IGNyZWF0aW5nIGNvbnN0cnVjdCAodXN1YWxseSBgdGhpc2ApLlxuICAgKiBAcGFyYW0gaWQgVGhlIGNvbnN0cnVjdCdzIG5hbWUuXG4gICAqIEBwYXJhbSBhdHRycyBBIGBUYWJsZUJ1Y2tldEF0dHJpYnV0ZXNgIG9iamVjdC4gQ2FuIGJlIG1hbnVhbGx5IGNyZWF0ZWQuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21UYWJsZUJ1Y2tldEF0dHJpYnV0ZXMoXG4gICAgc2NvcGU6IENvbnN0cnVjdCxcbiAgICBpZDogc3RyaW5nLFxuICAgIGF0dHJzOiBUYWJsZUJ1Y2tldEF0dHJpYnV0ZXMsXG4gICk6IElUYWJsZUJ1Y2tldCB7XG4gICAgY29uc3QgeyB0YWJsZUJ1Y2tldE5hbWUsIHJlZ2lvbiwgYWNjb3VudCwgdGFibGVCdWNrZXRBcm4gfSA9IHZhbGlkYXRlVGFibGVCdWNrZXRBdHRyaWJ1dGVzKHNjb3BlLCBhdHRycyk7XG4gICAgVGFibGVCdWNrZXQudmFsaWRhdGVUYWJsZUJ1Y2tldE5hbWUodGFibGVCdWNrZXROYW1lKTtcbiAgICBjbGFzcyBJbXBvcnQgZXh0ZW5kcyBUYWJsZUJ1Y2tldEJhc2Uge1xuICAgICAgcHVibGljIHJlYWRvbmx5IHRhYmxlQnVja2V0TmFtZSA9IHRhYmxlQnVja2V0TmFtZSE7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgdGFibGVCdWNrZXRBcm4gPSB0YWJsZUJ1Y2tldEFybjtcbiAgICAgIHB1YmxpYyByZWFkb25seSB0YWJsZUJ1Y2tldFBvbGljeT86IFRhYmxlQnVja2V0UG9saWN5O1xuICAgICAgcHVibGljIHJlYWRvbmx5IHJlZ2lvbiA9IHJlZ2lvbjtcbiAgICAgIHB1YmxpYyByZWFkb25seSBhY2NvdW50ID0gYWNjb3VudDtcbiAgICAgIHB1YmxpYyByZWFkb25seSBlbmNyeXB0aW9uS2V5Pzoga21zLklLZXkgPSBhdHRycy5lbmNyeXB0aW9uS2V5O1xuICAgICAgcHJvdGVjdGVkIGF1dG9DcmVhdGVQb2xpY3k6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgICAgLyoqXG4gICAgICAgKiBFeHBvcnRzIHRoaXMgYnVja2V0IGZyb20gdGhlIHN0YWNrLlxuICAgICAgICovXG4gICAgICBwdWJsaWMgZXhwb3J0KCkge1xuICAgICAgICByZXR1cm4gYXR0cnM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBJbXBvcnQoc2NvcGUsIGlkLCB7XG4gICAgICBhY2NvdW50LFxuICAgICAgcmVnaW9uLFxuICAgICAgcGh5c2ljYWxOYW1lOiB0YWJsZUJ1Y2tldE5hbWUsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGUgZ2l2ZW4gdGFibGUgYnVja2V0IG5hbWUgaXMgbm90IHZhbGlkLlxuICAgKlxuICAgKiBAcGFyYW0gYnVja2V0TmFtZSBuYW1lIG9mIHRoZSBidWNrZXQuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHZhbGlkYXRlVGFibGVCdWNrZXROYW1lKFxuICAgIGJ1Y2tldE5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgKSB7XG4gICAgaWYgKGJ1Y2tldE5hbWUgPT0gdW5kZWZpbmVkIHx8IFRva2VuLmlzVW5yZXNvbHZlZChidWNrZXROYW1lKSkge1xuICAgICAgLy8gdGhlIG5hbWUgaXMgYSBsYXRlLWJvdW5kIHZhbHVlLCBub3QgYSBkZWZpbmVkIHN0cmluZywgc28gc2tpcCB2YWxpZGF0aW9uXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgLy8gTGVuZ3RoIHZhbGlkYXRpb25cbiAgICBpZiAoYnVja2V0TmFtZS5sZW5ndGggPCAzIHx8IGJ1Y2tldE5hbWUubGVuZ3RoID4gNjMpIHtcbiAgICAgIGVycm9ycy5wdXNoKFxuICAgICAgICAnQnVja2V0IG5hbWUgbXVzdCBiZSBhdCBsZWFzdCAzIGFuZCBubyBtb3JlIHRoYW4gNjMgY2hhcmFjdGVycycsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIENoYXJhY3RlciBzZXQgdmFsaWRhdGlvblxuICAgIGNvbnN0IGlsbGVnYWxDaGFyc2V0UmVnRXggPSAvW15hLXowLTktXS87XG4gICAgY29uc3QgYWxsb3dlZEVkZ2VDaGFyc2V0UmVnRXggPSAvW2EtejAtOV0vO1xuXG4gICAgY29uc3QgaWxsZWdhbENoYXJNYXRjaCA9IGJ1Y2tldE5hbWUubWF0Y2goaWxsZWdhbENoYXJzZXRSZWdFeCk7XG4gICAgaWYgKGlsbGVnYWxDaGFyTWF0Y2gpIHtcbiAgICAgIGVycm9ycy5wdXNoKFxuICAgICAgICAnQnVja2V0IG5hbWUgbXVzdCBvbmx5IGNvbnRhaW4gbG93ZXJjYXNlIGNoYXJhY3RlcnMsIG51bWJlcnMsIGFuZCBoeXBoZW5zICgtKScgK1xuICAgICAgICAgIGAgKG9mZnNldDogJHtpbGxlZ2FsQ2hhck1hdGNoLmluZGV4fSlgLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBFZGdlIGNoYXJhY3RlciB2YWxpZGF0aW9uXG4gICAgaWYgKCFhbGxvd2VkRWRnZUNoYXJzZXRSZWdFeC50ZXN0KGJ1Y2tldE5hbWUuY2hhckF0KDApKSkge1xuICAgICAgZXJyb3JzLnB1c2goXG4gICAgICAgICdCdWNrZXQgbmFtZSBtdXN0IHN0YXJ0IHdpdGggYSBsb3dlcmNhc2UgbGV0dGVyIG9yIG51bWJlciAob2Zmc2V0OiAwKScsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICAhYWxsb3dlZEVkZ2VDaGFyc2V0UmVnRXgudGVzdChidWNrZXROYW1lLmNoYXJBdChidWNrZXROYW1lLmxlbmd0aCAtIDEpKVxuICAgICkge1xuICAgICAgZXJyb3JzLnB1c2goXG4gICAgICAgIGBCdWNrZXQgbmFtZSBtdXN0IGVuZCB3aXRoIGEgbG93ZXJjYXNlIGxldHRlciBvciBudW1iZXIgKG9mZnNldDogJHtcbiAgICAgICAgICBidWNrZXROYW1lLmxlbmd0aCAtIDFcbiAgICAgICAgfSlgLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgbGl0YEludmFsaWRUYWJsZUJ1Y2tldE5hbWVgLFxuICAgICAgICBgSW52YWxpZCBTMyB0YWJsZSBidWNrZXQgbmFtZSAodmFsdWU6ICR7YnVja2V0TmFtZX0pJHtFT0x9JHtlcnJvcnMuam9pbihFT0wpfWAsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaHJvd3MgYW4gZXhjZXB0aW9uIGlmIHRoZSBnaXZlbiB1bnJlZmVyZW5jZWRGaWxlUmVtb3ZhbFByb3BlcnR5IGlzIG5vdCB2YWxpZC5cbiAgICogQHBhcmFtIHVucmVmZXJlbmNlZEZpbGVSZW1vdmFsIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSB0YWJsZSBidWNrZXRcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgdmFsaWRhdGVVbnJlZmVyZW5jZWRGaWxlUmVtb3ZhbChcbiAgICB1bnJlZmVyZW5jZWRGaWxlUmVtb3ZhbD86IFVucmVmZXJlbmNlZEZpbGVSZW1vdmFsLFxuICApOiB2b2lkIHtcbiAgICAvLyBTa2lwIHZhbGlkYXRpb24gaWYgcHJvcGVydHkgaXMgbm90IGRlZmluZWRcbiAgICBpZiAoIXVucmVmZXJlbmNlZEZpbGVSZW1vdmFsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgeyBub25jdXJyZW50RGF5cywgc3RhdHVzLCB1bnJlZmVyZW5jZWREYXlzIH0gPSB1bnJlZmVyZW5jZWRGaWxlUmVtb3ZhbDtcblxuICAgIGNvbnN0IGVycm9yczogc3RyaW5nW10gPSBbXTtcblxuICAgIGlmIChub25jdXJyZW50RGF5cyAhPSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChub25jdXJyZW50RGF5cyA8IDEpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goJ25vbmN1cnJlbnREYXlzIG11c3QgYmUgYXQgbGVhc3QgMSBkYXknKTtcbiAgICAgIH1cbiAgICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihub25jdXJyZW50RGF5cykpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goJ25vbmN1cnJlbnREYXlzIG11c3QgYmUgYSB3aG9sZSBudW1iZXInKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodW5yZWZlcmVuY2VkRGF5cyAhPSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICh1bnJlZmVyZW5jZWREYXlzIDwgMSkge1xuICAgICAgICBlcnJvcnMucHVzaCgndW5yZWZlcmVuY2VkRGF5cyBtdXN0IGJlIGF0IGxlYXN0IDEgZGF5Jyk7XG4gICAgICB9XG4gICAgICBpZiAoIU51bWJlci5pc0ludGVnZXIobm9uY3VycmVudERheXMpKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKCd1bnJlZmVyZW5jZWREYXlzIG11c3QgYmUgYSB3aG9sZSBudW1iZXInKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBhbGxvd2VkU3RhdHVzID0gWydFbmFibGVkJywgJ0Rpc2FibGVkJ107XG4gICAgaWYgKHN0YXR1cyAhPSB1bmRlZmluZWQgJiYgIWFsbG93ZWRTdGF0dXMuaW5jbHVkZXMoc3RhdHVzKSkge1xuICAgICAgZXJyb3JzLnB1c2goJ3N0YXR1cyBtdXN0IGJlIG9uZSBvZiBcXCdFbmFibGVkXFwnIG9yIFxcJ0Rpc2FibGVkXFwnJyk7XG4gICAgfVxuXG4gICAgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIGxpdGBJbnZhbGlkVW5yZWZlcmVuY2VkRmlsZVJlbW92YWxQcm9wZXJ0eWAsXG4gICAgICAgIGBJbnZhbGlkIFVucmVmZXJlbmNlZEZpbGVSZW1vdmFsUHJvcGVydHl9KSR7RU9MfSR7ZXJyb3JzLmpvaW4oRU9MKX1gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIHVuZGVybHlpbmcgQ2ZuVGFibGVCdWNrZXQgTDEgcmVzb3VyY2VcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHJlc291cmNlOiBzM3RhYmxlcy5DZm5UYWJsZUJ1Y2tldDtcblxuICAvKipcbiAgICogVGhlIHRhZyBtYW5hZ2VyIGZvciB0aGlzIHJlc291cmNlLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNka1RhZ01hbmFnZXI6IFRhZ01hbmFnZXI7XG5cbiAgLyoqXG4gICAqIFRoZSByZXNvdXJjZSBwb2xpY3kgZm9yIHRoaXMgdGFibGVCdWNrZXQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdGFibGVCdWNrZXRQb2xpY3k/OiBUYWJsZUJ1Y2tldFBvbGljeTtcblxuICBwdWJsaWMgcmVhZG9ubHkgZW5jcnlwdGlvbktleT86IGttcy5JS2V5IHwgdW5kZWZpbmVkO1xuXG4gIHByb3RlY3RlZCBhdXRvQ3JlYXRlUG9saWN5OiBib29sZWFuID0gdHJ1ZTtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogVGFibGVCdWNrZXRQcm9wcyA9IHt9KSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCB7XG4gICAgICBwaHlzaWNhbE5hbWU6IHByb3BzLnRhYmxlQnVja2V0TmFtZSA/PyBMYXp5LnN0cmluZyh7XG4gICAgICAgIHByb2R1Y2U6ICgpID0+IE5hbWVzLnVuaXF1ZVJlc291cmNlTmFtZSh0aGlzLCB7XG4gICAgICAgICAgbWF4TGVuZ3RoOiA2MyxcbiAgICAgICAgICBhbGxvd2VkU3BlY2lhbENoYXJhY3RlcnM6ICctJyxcbiAgICAgICAgICBzZXBhcmF0b3I6ICctJyxcbiAgICAgICAgfSkudG9Mb3dlckNhc2UoKSxcbiAgICAgIH0pLFxuICAgIH0pO1xuXG4gICAgLy8gRW5oYW5jZWQgQ0RLIEFuYWx5dGljcyBUZWxlbWV0cnlcbiAgICBhZGRDb25zdHJ1Y3RNZXRhZGF0YSh0aGlzLCBwcm9wcyk7XG5cbiAgICBUYWJsZUJ1Y2tldC52YWxpZGF0ZVRhYmxlQnVja2V0TmFtZShwcm9wcy50YWJsZUJ1Y2tldE5hbWUpO1xuICAgIFRhYmxlQnVja2V0LnZhbGlkYXRlVW5yZWZlcmVuY2VkRmlsZVJlbW92YWwocHJvcHMudW5yZWZlcmVuY2VkRmlsZVJlbW92YWwpO1xuICAgIGNvbnN0IHsgYnVja2V0RW5jcnlwdGlvbiwgZW5jcnlwdGlvbktleSB9ID0gdGhpcy5wYXJzZUVuY3J5cHRpb24ocHJvcHMpO1xuICAgIHRoaXMuZW5jcnlwdGlvbktleSA9IGVuY3J5cHRpb25LZXk7XG5cbiAgICB0aGlzLnJlc291cmNlID0gbmV3IHMzdGFibGVzLkNmblRhYmxlQnVja2V0KHRoaXMsIGlkLCB7XG4gICAgICB0YWJsZUJ1Y2tldE5hbWU6IHRoaXMucGh5c2ljYWxOYW1lLFxuICAgICAgdW5yZWZlcmVuY2VkRmlsZVJlbW92YWw6IHtcbiAgICAgICAgLi4ucHJvcHMudW5yZWZlcmVuY2VkRmlsZVJlbW92YWwsXG4gICAgICAgIG5vbmN1cnJlbnREYXlzOiBwcm9wcy51bnJlZmVyZW5jZWRGaWxlUmVtb3ZhbD8ubm9uY3VycmVudERheXMsXG4gICAgICAgIHVucmVmZXJlbmNlZERheXM6IHByb3BzLnVucmVmZXJlbmNlZEZpbGVSZW1vdmFsPy51bnJlZmVyZW5jZWREYXlzLFxuICAgICAgfSxcbiAgICAgIGVuY3J5cHRpb25Db25maWd1cmF0aW9uOiBidWNrZXRFbmNyeXB0aW9uLFxuICAgICAgbWV0cmljc0NvbmZpZ3VyYXRpb246IHByb3BzLnJlcXVlc3RNZXRyaWNzU3RhdHVzID8geyBzdGF0dXM6IHByb3BzLnJlcXVlc3RNZXRyaWNzU3RhdHVzIH0gOiB1bmRlZmluZWQsXG4gICAgICBzdG9yYWdlQ2xhc3NDb25maWd1cmF0aW9uOiBwcm9wcy5zdG9yYWdlQ2xhc3MgPyB7IHN0b3JhZ2VDbGFzczogcHJvcHMuc3RvcmFnZUNsYXNzIH0gOiB1bmRlZmluZWQsXG4gICAgfSk7XG5cbiAgICB0aGlzLmNka1RhZ01hbmFnZXIgPSB0aGlzLnJlc291cmNlLmNka1RhZ01hbmFnZXI7XG4gICAgdGhpcy5yZXNvdXJjZS5hcHBseVJlbW92YWxQb2xpY3kocHJvcHMucmVtb3ZhbFBvbGljeSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhpcyB0YWJsZSBidWNrZXRcbiAgICovXG4gIEBtZW1vaXplZEdldHRlclxuICBwdWJsaWMgZ2V0IHRhYmxlQnVja2V0TmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFJlc291cmNlTmFtZUF0dHJpYnV0ZSh0aGlzLnJlc291cmNlLnJlZik7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHVuaXF1ZSBBbWF6b24gUmVzb3VyY2UgTmFtZSAoYXJuKSBvZiB0aGlzIHRhYmxlIGJ1Y2tldFxuICAgKi9cbiAgQG1lbW9pemVkR2V0dGVyXG4gIHB1YmxpYyBnZXQgdGFibGVCdWNrZXRBcm4oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5yZXNvdXJjZS5hdHRyVGFibGVCdWNrZXRBcm47XG4gIH1cblxuICAvKipcbiAgICogU2V0IHVwIGtleSBwcm9wZXJ0aWVzIGFuZCByZXR1cm4gdGhlIEJ1Y2tldCBlbmNyeXB0aW9uIHByb3BlcnR5IGZyb20gdGhlXG4gICAqIHVzZXIncyBjb25maWd1cmF0aW9uLCBhY2NvcmRpbmcgdG8gdGhlIGZvbGxvd2luZyB0YWJsZTpcbiAgICpcbiAgICogfCBwcm9wcy5lbmNyeXB0aW9uIHwgcHJvcHMuZW5jcnlwdGlvbktleSB8IGJ1Y2tldEVuY3J5cHRpb24gKHJldHVybiB2YWx1ZSkgfCBlbmNyeXB0aW9uS2V5IChyZXR1cm4gdmFsdWUpICB8XG4gICAqIHwtLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfFxuICAgKiB8IHVuZGVmaW5lZCAgICAgICAgfCB1bmRlZmluZWQgICAgICAgICAgIHwgdW5kZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICB8IHVuZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgIHxcbiAgICogfCB1bmRlZmluZWQgICAgICAgIHwgayAgICAgICAgICAgICAgICAgICB8IGF3czprbXMgICAgICAgICAgICAgICAgICAgICAgICAgfCBrICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAqIHwgS01TICAgICAgICAgICAgICB8IHVuZGVmaW5lZCAgICAgICAgICAgfCBhd3M6a21zICAgICAgICAgICAgICAgICAgICAgICAgIHwgbmV3IGtleSAoYWxsb3cgbWFpbnRlbmFuY2UgU1ApfFxuICAgKiB8IEtNUyAgICAgICAgICAgICAgfCBrICAgICAgICAgICAgICAgICAgIHwgYXdzOmttcyAgICAgICAgICAgICAgICAgICAgICAgICB8IGsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICogfCBTM19NQU5BR0VEICAgICAgIHwgdW5kZWZpbmVkICAgICAgICAgICB8IEFFUzI1NiAgICAgICAgICAgICAgICAgICAgICAgICAgfCB1bmRlZmluZWQgICAgICAgICAgICAgICAgICAgICB8XG4gICAqIHwgUzNfTUFOQUdFRCAgICAgICB8IGsgICAgICAgICAgICAgICAgICAgfCBFUlJPUiEgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRVJST1IhICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgKi9cbiAgcHJpdmF0ZSBwYXJzZUVuY3J5cHRpb24ocHJvcHM6IFRhYmxlQnVja2V0UHJvcHMpOiB7XG4gICAgYnVja2V0RW5jcnlwdGlvbj86IHMzdGFibGVzLkNmblRhYmxlQnVja2V0LkVuY3J5cHRpb25Db25maWd1cmF0aW9uUHJvcGVydHk7XG4gICAgZW5jcnlwdGlvbktleT86IGttcy5JS2V5O1xuICB9IHtcbiAgICBjb25zdCBlbmNyeXB0aW9uVHlwZSA9IHByb3BzLmVuY3J5cHRpb247XG4gICAgbGV0IGtleSA9IHByb3BzLmVuY3J5cHRpb25LZXk7XG5cbiAgICBpZiAoZW5jcnlwdGlvblR5cGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKCBrZXkgPT09IHVuZGVmaW5lZCApIHtcbiAgICAgICAgcmV0dXJuIHsgYnVja2V0RW5jcnlwdGlvbjogdW5kZWZpbmVkLCBlbmNyeXB0aW9uS2V5OiB1bmRlZmluZWQgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgYnVja2V0RW5jcnlwdGlvbjoge1xuICAgICAgICAgICAga21zS2V5QXJuOiBrZXkua2V5QXJuLFxuICAgICAgICAgICAgc3NlQWxnb3JpdGhtOiBUYWJsZUJ1Y2tldEVuY3J5cHRpb24uS01TLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgZW5jcnlwdGlvbktleToga2V5LFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChlbmNyeXB0aW9uVHlwZSA9PT0gVGFibGVCdWNrZXRFbmNyeXB0aW9uLktNUykge1xuICAgICAgaWYgKCBrZXkgPT09IHVuZGVmaW5lZCApIHtcbiAgICAgICAga2V5ID0gbmV3IGttcy5LZXkodGhpcywgJ0tleScsIHtcbiAgICAgICAgICBkZXNjcmlwdGlvbjogYENyZWF0ZWQgYnkgJHt0aGlzLm5vZGUucGF0aH1gLFxuICAgICAgICAgIGVuYWJsZUtleVJvdGF0aW9uOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5hbGxvd1RhYmxlc01haW50ZW5hbmNlQWNjZXNzVG9LZXkoa2V5LCB0aGlzLnBoeXNpY2FsTmFtZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICBidWNrZXRFbmNyeXB0aW9uOiB7XG4gICAgICAgICAga21zS2V5QXJuOiBrZXkua2V5QXJuLFxuICAgICAgICAgIHNzZUFsZ29yaXRobTogVGFibGVCdWNrZXRFbmNyeXB0aW9uLktNUyxcbiAgICAgICAgfSxcbiAgICAgICAgZW5jcnlwdGlvbktleToga2V5LFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAoZW5jcnlwdGlvblR5cGUgPT09IFRhYmxlQnVja2V0RW5jcnlwdGlvbi5TM19NQU5BR0VEKSB7XG4gICAgICBpZiAoIGtleSA9PT0gdW5kZWZpbmVkICkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGJ1Y2tldEVuY3J5cHRpb246IHtcbiAgICAgICAgICAgIHNzZUFsZ29yaXRobTogVGFibGVCdWNrZXRFbmNyeXB0aW9uLlMzX01BTkFHRUQsXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihsaXRgSW52YWxpZEVuY3J5cHRpb25Db25maWd1cmF0aW9uYCwgJ0V4cGVjdGVkIGVuY3J5cHRpb24gPSBgS01TYCB3aXRoIHVzZXIgcHJvdmlkZWQgZW5jcnlwdGlvbiBrZXknKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKGxpdGBVbmtub3duRW5jcnlwdGlvbkNvbmZpZ3VyYXRpb25gLCBgVW5rbm93biBlbmNyeXB0aW9uIGNvbmZpZ3VyYXRpb24gZGV0ZWN0ZWQ6ICR7cHJvcHMuZW5jcnlwdGlvbn0gd2l0aCBrZXkgJHtwcm9wcy5lbmNyeXB0aW9uS2V5fWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFsbG93bGlzdCBTMyBUYWJsZXMgTWFpbnRlbmFuY2UgdG8gYWNjZXNzIHRoaXMgdGFibGUgYnVja2V0J3MgZW5jcnlwdGlvbiBrZXlcbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L3VzZXJndWlkZS9zMy10YWJsZXMta21zLXBlcm1pc3Npb25zLmh0bWxcbiAgICogQHBhcmFtIGVuY3J5cHRpb25LZXkgVGhlIGtleSB0byBwcm92aWRlIGFjY2VzcyB0b1xuICAgKi9cbiAgcHJpdmF0ZSBhbGxvd1RhYmxlc01haW50ZW5hbmNlQWNjZXNzVG9LZXkoZW5jcnlwdGlvbktleToga21zLklLZXksIHRhYmxlQnVja2V0TmFtZTogc3RyaW5nKSB7XG4gICAgY29uc3QgcmVnaW9uID0gdGhpcy5zdGFjay5yZWdpb247XG4gICAgY29uc3QgYWNjb3VudCA9IHRoaXMuc3RhY2suYWNjb3VudDtcbiAgICBjb25zdCBwYXJ0aXRpb24gPSB0aGlzLnN0YWNrLnBhcnRpdGlvbjtcblxuICAgIGVuY3J5cHRpb25LZXkuYWRkVG9SZXNvdXJjZVBvbGljeShuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICBzaWQ6ICdBbGxvd1MzVGFibGVzTWFpbnRlbmFuY2VBY2Nlc3MnLFxuICAgICAgZWZmZWN0OiBpYW0uRWZmZWN0LkFMTE9XLFxuICAgICAgcHJpbmNpcGFsczogW1xuICAgICAgICBuZXcgaWFtLlNlcnZpY2VQcmluY2lwYWwoJ21haW50ZW5hbmNlLnMzdGFibGVzLmFtYXpvbmF3cy5jb20nKSxcbiAgICAgIF0sXG4gICAgICBhY3Rpb25zOiBbXG4gICAgICAgICdrbXM6R2VuZXJhdGVEYXRhS2V5JyxcbiAgICAgICAgJ2ttczpEZWNyeXB0JyxcbiAgICAgIF0sXG4gICAgICByZXNvdXJjZXM6IFsnKiddLFxuICAgICAgY29uZGl0aW9uczoge1xuICAgICAgICBTdHJpbmdMaWtlOiB7XG4gICAgICAgICAgJ2ttczpFbmNyeXB0aW9uQ29udGV4dDphd3M6czM6YXJuJzogYGFybjoke3BhcnRpdGlvbn06czN0YWJsZXM6JHtyZWdpb259OiR7YWNjb3VudH06YnVja2V0LyR7dGFibGVCdWNrZXROYW1lfS8qYCxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSkpO1xuICB9XG59XG4iXX0=
@@ -95,7 +95,7 @@ let TablePolicy = (() => {
95
95
  TablePolicy = _classThis = _classDescriptor.value;
96
96
  if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
97
97
  }
98
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-s3tables-alpha.TablePolicy", version: "2.269.0-alpha.0" };
98
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-s3tables-alpha.TablePolicy", version: "2.271.0-alpha.0" };
99
99
  /** Uniquely identifies this class. */
100
100
  static PROPERTY_INJECTION_ID = '@aws-cdk.aws-s3tables-alpha.TablePolicy';
101
101
  /**
package/lib/table.js CHANGED
@@ -156,7 +156,7 @@ var Status;
156
156
  * Iceberg transform values for partition and sort fields.
157
157
  */
158
158
  class IcebergTransform {
159
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-s3tables-alpha.IcebergTransform", version: "2.269.0-alpha.0" };
159
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-s3tables-alpha.IcebergTransform", version: "2.271.0-alpha.0" };
160
160
  /**
161
161
  * Use the column value as the transform value without transformation.
162
162
  */
@@ -267,7 +267,7 @@ let Table = (() => {
267
267
  Table = _classThis = _classDescriptor.value;
268
268
  if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
269
269
  }
270
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-s3tables-alpha.Table", version: "2.269.0-alpha.0" };
270
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-s3tables-alpha.Table", version: "2.271.0-alpha.0" };
271
271
  /** Uniquely identifies this class. */
272
272
  static PROPERTY_INJECTION_ID = '@aws-cdk.aws-s3tables-alpha.Table';
273
273
  /**
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@aws-cdk/aws-s3tables-alpha",
3
3
  "private": false,
4
- "version": "2.269.0-alpha.0",
4
+ "version": "2.271.0-alpha.0",
5
5
  "description": "CDK Constructs for S3 Tables",
6
6
  "main": "lib/index.js",
7
7
  "types": "lib/index.d.ts",
@@ -77,17 +77,17 @@
77
77
  },
78
78
  "license": "Apache-2.0",
79
79
  "devDependencies": {
80
- "aws-cdk-lib": "2.269.0",
81
- "@aws-cdk/cdk-build-tools": "2.269.0-alpha.0",
82
- "@aws-cdk/pkglint": "2.269.0-alpha.0",
80
+ "aws-cdk-lib": "2.271.0",
81
+ "@aws-cdk/cdk-build-tools": "2.271.0-alpha.0",
82
+ "@aws-cdk/pkglint": "2.271.0-alpha.0",
83
83
  "@types/jest": "^29.5.14",
84
84
  "constructs": "^10.5.0",
85
85
  "jest": "^29.7.0",
86
- "@aws-cdk/integ-tests-alpha": "2.269.0-alpha.0"
86
+ "@aws-cdk/integ-tests-alpha": "2.271.0-alpha.0"
87
87
  },
88
88
  "homepage": "https://github.com/aws/aws-cdk",
89
89
  "peerDependencies": {
90
- "aws-cdk-lib": "^2.269.0",
90
+ "aws-cdk-lib": "^2.271.0",
91
91
  "constructs": "^10.5.0"
92
92
  },
93
93
  "separate-module": false,