UNPKG

cdk-iam-floyd

Version:

AWS IAM policy statement generator with fluent interface for AWS CDK

972 lines 90.3 kB
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.S3tables = void 0;
const shared_1 = require("../../shared");
/**
 * Statement provider for service [s3tables](https://docs.aws.amazon.com/service-authorization/latest/reference/list_s3tables.html).
 *
 * @param sid [SID](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_sid.html) of the statement
 */
class S3tables extends shared_1.PolicyStatement {
    /**
     * Grants permission to create a namespace
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/AmazonS3/latest/API/API_s3Buckets_CreateNamespace.html
     */
    toCreateNamespace() {
        return this.to('CreateNamespace');
    }
    /**
     * Grants permission to create a table
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/AmazonS3/latest/API/API_s3Buckets_CreateTable.html
     */
    toCreateTable() {
        return this.to('CreateTable');
    }
    /**
     * Grants permission to create a table bucket
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/AmazonS3/latest/API/API_s3Buckets_CreateTableBucket.html
     */
    toCreateTableBucket() {
        return this.to('CreateTableBucket');
    }
    /**
     * Grants permission to delete a namespace
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/AmazonS3/latest/API/API_s3Buckets_DeleteNamespace.html
     */
    toDeleteNamespace() {
        return this.to('DeleteNamespace');
    }
    /**
     * Grants permission to delete a table
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/AmazonS3/latest/API/API_s3Buckets_DeleteTable.html
     */
    toDeleteTable() {
        return this.to('DeleteTable');
    }
    /**
     * Grants permission to delete a table bucket
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/AmazonS3/latest/API/API_s3Buckets_DeleteTableBucket.html
     */
    toDeleteTableBucket() {
        return this.to('DeleteTableBucket');
    }
    /**
     * Grants permission to delete encryption configuration on a table bucket
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/AmazonS3/latest/API/API_s3Buckets_DeleteTableBucketEncryption.html
     */
    toDeleteTableBucketEncryption() {
        return this.to('DeleteTableBucketEncryption');
    }
    /**
     * Grants permission to delete a metrics configuration on a table bucket
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/AmazonS3/latest/API/API_s3Buckets_DeleteTableBucketMetricsConfiguration.html
     */
    toDeleteTableBucketMetricsConfiguration() {
        return this.to('DeleteTableBucketMetricsConfiguration');
    }
    /**
     * Grants permission to delete a policy on a table bucket
     *
     * Access Level: Permissions management, Write
     *
     * https://docs.aws.amazon.com/AmazonS3/latest/API/API_s3Buckets_DeleteTableBucketPolicy.html
     */
    toDeleteTableBucketPolicy() {
        return this.to('DeleteTableBucketPolicy');
    }
    /**
     * Grants permission to delete table bucket replication configuration on a bucket
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/AmazonS3/latest/API/API_s3Buckets_DeleteTableBucketReplication.html
     */
    toDeleteTableBucketReplication() {
        return this.to('DeleteTableBucketReplication');
    }
    /**
     * Grants permission to delete a policy on a table
     *
     * Access Level: Permissions management, Write
     *
     * https://docs.aws.amazon.com/AmazonS3/latest/API/API_s3Buckets_DeleteTablePolicy.html
     */
    toDeleteTablePolicy() {
        return this.to('DeleteTablePolicy');
    }
    /**
     * Grants permission to delete table replication configuration on a table
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/AmazonS3/latest/API/API_s3Buckets_DeleteTableReplication.html
     */
    toDeleteTableReplication() {
        return this.to('DeleteTableReplication');
    }
    /**
     * Grants permission to get a namespace
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/AmazonS3/latest/API/API_s3Buckets_GetNamespace.html
     */
    toGetNamespace() {
        return this.to('GetNamespace');
    }
    /**
     * Grants permission to retrieve a table
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/AmazonS3/latest/API/API_s3Buckets_GetTable.html
     */
    toGetTable() {
        return this.to('GetTable');
    }
    /**
     * Grants permission to retrieve a table bucket
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/AmazonS3/latest/API/API_s3Buckets_GetTableBucket.html
     */
    toGetTableBucket() {
        return this.to('GetTableBucket');
    }
    /**
     * Grants permission to retrieve encryption configuration on a table bucket
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/AmazonS3/latest/API/API_s3Buckets_GetTableBucketEncryption.html
     */
    toGetTableBucketEncryption() {
        return this.to('GetTableBucketEncryption');
    }
    /**
     * Grants permission to retrieve a maintenance configuration on a table bucket
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/AmazonS3/latest/API/API_s3Buckets_GetTableBucketMaintenanceConfiguration.html
     */
    toGetTableBucketMaintenanceConfiguration() {
        return this.to('GetTableBucketMaintenanceConfiguration');
    }
    /**
     * Grants permission to retrieve a metrics configuration on a bucket
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/AmazonS3/latest/API/API_s3Buckets_GetTableBucketMetricsConfiguration.html
     */
    toGetTableBucketMetricsConfiguration() {
        return this.to('GetTableBucketMetricsConfiguration');
    }
    /**
     * Grants permission to retrieve a policy on a table bucket
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/AmazonS3/latest/API/API_s3Buckets_GetTableBucketPolicy.html
     */
    toGetTableBucketPolicy() {
        return this.to('GetTableBucketPolicy');
    }
    /**
     * Grants permission to retrieve a table bucket replication configuration on a bucket
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/AmazonS3/latest/API/API_s3Buckets_GetTableBucketReplication.html
     */
    toGetTableBucketReplication() {
        return this.to('GetTableBucketReplication');
    }
    /**
     * Grants permission to retrieve the storage class configuration for a table bucket
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/AmazonS3/latest/API/API_s3Buckets_GetTableBucketStorageClass.html
     */
    toGetTableBucketStorageClass() {
        return this.to('GetTableBucketStorageClass');
    }
    /**
     * Grants permission to retrieve encryption configuration on a table
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/AmazonS3/latest/API/API_s3Buckets_GetTableEncryption.html
     */
    toGetTableEncryption() {
        return this.to('GetTableEncryption');
    }
    /**
     * Grants permission to retrieve a maintenance configuration on a table
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/AmazonS3/latest/API/API_s3Buckets_GetTableMaintenanceConfiguration.html
     */
    toGetTableMaintenanceConfiguration() {
        return this.to('GetTableMaintenanceConfiguration');
    }
    /**
     * Grants permission to retrieve the status of maintenance jobs on a table
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/AmazonS3/latest/API/API_s3Buckets_GetTableMaintenanceJobStatus.html
     */
    toGetTableMaintenanceJobStatus() {
        return this.to('GetTableMaintenanceJobStatus');
    }
    /**
     * Grants permission to retrieve the metadata location of a table
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/AmazonS3/latest/API/API_s3Buckets_GetTableMetadataLocation.html
     */
    toGetTableMetadataLocation() {
        return this.to('GetTableMetadataLocation');
    }
    /**
     * Grants permission to retrieve a policy on a table
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/AmazonS3/latest/API/API_s3Buckets_GetTablePolicy.html
     */
    toGetTablePolicy() {
        return this.to('GetTablePolicy');
    }
    /**
     * Grants permission to retrieve a table maintenance configuration on a system table
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/AmazonS3/latest/API/API_s3Buckets_GetTableRecordExpirationConfiguration.html
     */
    toGetTableRecordExpirationConfiguration() {
        return this.to('GetTableRecordExpirationConfiguration');
    }
    /**
     * Grants permission to retrieve the status of table record expiration jobs on a system table
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/AmazonS3/latest/API/API_s3Buckets_GetTableRecordExpirationJobStatus.html
     */
    toGetTableRecordExpirationJobStatus() {
        return this.to('GetTableRecordExpirationJobStatus');
    }
    /**
     * Grants permission to retrieve a table replication configuration on a table
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/AmazonS3/latest/API/API_s3Buckets_GetTableReplication.html
     */
    toGetTableReplication() {
        return this.to('GetTableReplication');
    }
    /**
     * Grants permission to retrieve a table replication status on a table
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/AmazonS3/latest/API/API_s3Buckets_GetTableReplicationStatus.html
     */
    toGetTableReplicationStatus() {
        return this.to('GetTableReplicationStatus');
    }
    /**
     * Grants permission to retrieve the storage class configuration for a specific table
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/AmazonS3/latest/API/API_s3Buckets_GetTableStorageClass.html
     */
    toGetTableStorageClass() {
        return this.to('GetTableStorageClass');
    }
    /**
     * Grants permission to list namespaces
     *
     * Access Level: List
     *
     * https://docs.aws.amazon.com/AmazonS3/latest/API/API_s3Buckets_ListNamespaces.html
     */
    toListNamespaces() {
        return this.to('ListNamespaces');
    }
    /**
     * Grants permission to list table buckets
     *
     * Access Level: List
     *
     * https://docs.aws.amazon.com/AmazonS3/latest/API/API_s3Buckets_ListTableBuckets.html
     */
    toListTableBuckets() {
        return this.to('ListTableBuckets');
    }
    /**
     * Grants permission to list tables
     *
     * Access Level: List
     *
     * https://docs.aws.amazon.com/AmazonS3/latest/API/API_s3Buckets_ListTables.html
     */
    toListTables() {
        return this.to('ListTables');
    }
    /**
     * Grants permission to list the tags for an S3 Tables resource
     *
     * Access Level: List
     *
     * https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-tables-tagging.html
     */
    toListTagsForResource() {
        return this.to('ListTagsForResource');
    }
    /**
     * Grants permission to put or overwrite encryption configuration on a table bucket
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/AmazonS3/latest/API/API_s3Buckets_PutTableBucketEncryption.html
     */
    toPutTableBucketEncryption() {
        return this.to('PutTableBucketEncryption');
    }
    /**
     * Grants permission to put a maintenance configuration on a table bucket
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/AmazonS3/latest/API/API_s3Buckets_PutTableBucketMaintenanceConfiguration.html
     */
    toPutTableBucketMaintenanceConfiguration() {
        return this.to('PutTableBucketMaintenanceConfiguration');
    }
    /**
     * Grants permission to create or overwrite a metrics configuration on a table bucket
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/AmazonS3/latest/API/API_s3Buckets_PutTableBucketMetricsConfiguration.html
     */
    toPutTableBucketMetricsConfiguration() {
        return this.to('PutTableBucketMetricsConfiguration');
    }
    /**
     * Grants permission to create or overwrite a policy on a table bucket
     *
     * Access Level: Permissions management, Write
     *
     * https://docs.aws.amazon.com/AmazonS3/latest/API/API_s3Buckets_PutTableBucketPolicy.html
     */
    toPutTableBucketPolicy() {
        return this.to('PutTableBucketPolicy');
    }
    /**
     * Grants permission to put table bucket replication configuration on a bucket
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/AmazonS3/latest/API/API_s3Buckets_PutTableBucketReplication.html
     */
    toPutTableBucketReplication() {
        return this.to('PutTableBucketReplication');
    }
    /**
     * Grants permission to set or update the storage class configuration for a table bucket
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/AmazonS3/latest/API/API_s3Buckets_PutTableBucketStorageClass.html
     */
    toPutTableBucketStorageClass() {
        return this.to('PutTableBucketStorageClass');
    }
    /**
     * Grants permission to put a maintenance configuration on a table
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/AmazonS3/latest/API/API_s3Buckets_PutTableMaintenanceConfiguration.html
     */
    toPutTableMaintenanceConfiguration() {
        return this.to('PutTableMaintenanceConfiguration');
    }
    /**
     * Grants permission to create or overwrite a policy on a table
     *
     * Access Level: Permissions management, Write
     *
     * https://docs.aws.amazon.com/AmazonS3/latest/API/API_s3Buckets_PutTablePolicy.html
     */
    toPutTablePolicy() {
        return this.to('PutTablePolicy');
    }
    /**
     * Grants permission to put a table record expiration configuration on a system table
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/AmazonS3/latest/API/API_s3Buckets_PutTableRecordExpirationConfiguration.html
     */
    toPutTableRecordExpirationConfiguration() {
        return this.to('PutTableRecordExpirationConfiguration');
    }
    /**
     * Grants permission to put table replication configuration on a table
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/AmazonS3/latest/API/API_s3Buckets_PutTableReplication.html
     */
    toPutTableReplication() {
        return this.to('PutTableReplication');
    }
    /**
     * Grants permission to set or update the storage class configuration for a table
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/AmazonS3/latest/API/API_s3Buckets_PutTableStorageClass.html
     */
    toPutTableStorageClass() {
        return this.to('PutTableStorageClass');
    }
    /**
     * Grants permission to rename a table or move a table across namespaces
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/AmazonS3/latest/API/API_s3Buckets_RenameTable.html
     */
    toRenameTable() {
        return this.to('RenameTable');
    }
    /**
     * Grants permission to tag a S3 Tables resource
     *
     * Access Level: Tagging, Write
     *
     * https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-tables-tagging.html
     */
    toTagResource() {
        return this.to('TagResource');
    }
    /**
     * Grants permission to untag a S3 Tables resource
     *
     * Access Level: Tagging, Write
     *
     * https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-tables-tagging.html
     */
    toUntagResource() {
        return this.to('UntagResource');
    }
    /**
     * Grants permission to update the metadata location of a table
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/AmazonS3/latest/API/API_s3Buckets_UpdateTableMetadataLocation.html
     */
    toUpdateTableMetadataLocation() {
        return this.to('UpdateTableMetadataLocation');
    }
    /**
     * Grants permission to read metadata and data objects from a table storage endpoint using S3 APIs
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-setting-up.html#s3-tables-actions
     */
    toGetTableData() {
        return this.to('GetTableData');
    }
    /**
     * Grants permission to write metadata and data objects to a table storage endpoint using S3 APIs
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-setting-up.html#s3-tables-actions
     */
    toPutTableData() {
        return this.to('PutTableData');
    }
    /**
     * Grants permission to put encryption configuration on a table
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-setting-up.html#s3-tables-actions
     */
    toPutTableEncryption() {
        return this.to('PutTableEncryption');
    }
    /**
     * Adds a resource of type Table to the statement
     *
     * https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-tables.html
     *
     * @param tableBucketName - Identifier for the tableBucketName.
     * @param tableID - Identifier for the tableID.
     * @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
     * @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
     * @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
     *
     * Possible conditions:
     * - .ifAwsResourceTag()
     * - .ifTableBucketTag()
     * - .ifNamespace()
     * - .ifTableName()
     */
    onTable(tableBucketName, tableID, account, region, partition) {
        return this.on(`arn:${partition ?? this.defaultPartition}:s3tables:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:bucket/${tableBucketName}/table/${tableID}`);
    }
    /**
     * Adds a resource of type TableBucket to the statement
     *
     * https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-buckets.html
     *
     * @param tableBucketName - Identifier for the tableBucketName.
     * @param account - Account of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's account.
     * @param region - Region of the resource; defaults to `*`, unless using the CDK, where the default is the current Stack's region.
     * @param partition - Partition of the AWS account [aws, aws-cn, aws-us-gov]; defaults to `aws`, unless using the CDK, where the default is the current Stack's partition.
     *
     * Possible conditions:
     * - .ifAwsResourceTag()
     * - .ifTableBucketTag()
     */
    onTableBucket(tableBucketName, account, region, partition) {
        return this.on(`arn:${partition ?? this.defaultPartition}:s3tables:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:bucket/${tableBucketName}`);
    }
    /**
     * Filters access by the tags that are passed in the request
     *
     * https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-requesttag
     *
     * Applies to actions:
     * - .toCreateTable()
     * - .toCreateTableBucket()
     * - .toTagResource()
     *
     * @param tagKey The tag key to check
     * @param value The value(s) to check
     * @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
     */
    ifAwsRequestTag(tagKey, value, operator) {
        return this.if(`aws:RequestTag/${tagKey}`, value, operator ?? 'StringLike');
    }
    /**
     * Filters access by the tags associated with the resource
     *
     * https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-resourcetag
     *
     * Applies to actions:
     * - .toCreateNamespace()
     * - .toCreateTable()
     * - .toCreateTableBucket()
     * - .toDeleteNamespace()
     * - .toDeleteTable()
     * - .toDeleteTableBucket()
     * - .toDeleteTableBucketEncryption()
     * - .toDeleteTableBucketMetricsConfiguration()
     * - .toDeleteTableBucketPolicy()
     * - .toDeleteTableBucketReplication()
     * - .toDeleteTablePolicy()
     * - .toDeleteTableReplication()
     * - .toGetNamespace()
     * - .toGetTable()
     * - .toGetTableBucket()
     * - .toGetTableBucketEncryption()
     * - .toGetTableBucketMaintenanceConfiguration()
     * - .toGetTableBucketMetricsConfiguration()
     * - .toGetTableBucketPolicy()
     * - .toGetTableBucketReplication()
     * - .toGetTableBucketStorageClass()
     * - .toGetTableEncryption()
     * - .toGetTableMaintenanceConfiguration()
     * - .toGetTableMaintenanceJobStatus()
     * - .toGetTableMetadataLocation()
     * - .toGetTablePolicy()
     * - .toGetTableRecordExpirationConfiguration()
     * - .toGetTableRecordExpirationJobStatus()
     * - .toGetTableReplication()
     * - .toGetTableReplicationStatus()
     * - .toGetTableStorageClass()
     * - .toListNamespaces()
     * - .toListTables()
     * - .toListTagsForResource()
     * - .toPutTableBucketEncryption()
     * - .toPutTableBucketMaintenanceConfiguration()
     * - .toPutTableBucketMetricsConfiguration()
     * - .toPutTableBucketPolicy()
     * - .toPutTableBucketReplication()
     * - .toPutTableBucketStorageClass()
     * - .toPutTableMaintenanceConfiguration()
     * - .toPutTablePolicy()
     * - .toPutTableRecordExpirationConfiguration()
     * - .toPutTableReplication()
     * - .toPutTableStorageClass()
     * - .toRenameTable()
     * - .toTagResource()
     * - .toUntagResource()
     * - .toUpdateTableMetadataLocation()
     * - .toGetTableData()
     * - .toPutTableData()
     * - .toPutTableEncryption()
     *
     * Applies to resource types:
     * - Table
     * - TableBucket
     *
     * @param tagKey The tag key to check
     * @param value The value(s) to check
     * @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
     */
    ifAwsResourceTag(tagKey, value, operator) {
        return this.if(`aws:ResourceTag/${tagKey}`, value, operator ?? 'StringLike');
    }
    /**
     * Filters access by the tag keys that are passed in the request
     *
     * https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-tagkeys
     *
     * Applies to actions:
     * - .toCreateTable()
     * - .toCreateTableBucket()
     * - .toTagResource()
     * - .toUntagResource()
     *
     * @param value The value(s) to check
     * @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
     */
    ifAwsTagKeys(value, operator) {
        return this.if(`aws:TagKeys`, value, operator ?? 'StringLike');
    }
    /**
     * Filters access by the AWS KMS key ARN for the key used to encrypt a table
     *
     * https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-setting-up.htmls3-tables-setting-up.html
     *
     * Applies to actions:
     * - .toCreateTable()
     * - .toCreateTableBucket()
     * - .toPutTableBucketEncryption()
     * - .toPutTableEncryption()
     *
     * @param value The value(s) to check
     * @param operator Works with [arn operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_ARN). **Default:** `ArnLike`
     */
    ifKMSKeyArn(value, operator) {
        return this.if(`KMSKeyArn`, value, operator ?? 'ArnLike');
    }
    /**
     * Filters access by the server-side encryption algorithm used to encrypt a table
     *
     * https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-setting-up.htmls3-tables-setting-up.html
     *
     * Applies to actions:
     * - .toCreateTable()
     * - .toCreateTableBucket()
     * - .toPutTableBucketEncryption()
     * - .toPutTableEncryption()
     *
     * @param value The value(s) to check
     * @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
     */
    ifSSEAlgorithm(value, operator) {
        return this.if(`SSEAlgorithm`, value, operator ?? 'StringLike');
    }
    /**
     * Filters access by the storage class that can be set on tables under a table bucket
     *
     * https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-setting-up.htmls3-tables-setting-up.html
     *
     * Applies to actions:
     * - .toPutTableBucketStorageClass()
     * - .toPutTableStorageClass()
     *
     * @param value The value(s) to check
     * @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
     */
    ifStorageClass(value, operator) {
        return this.if(`StorageClass`, value, operator ?? 'StringLike');
    }
    /**
     * Filters access by the tags associated with the table bucket
     *
     * https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-setting-up.htmls3-tables-setting-up.html
     *
     * Applies to actions:
     * - .toCreateNamespace()
     * - .toCreateTable()
     * - .toCreateTableBucket()
     * - .toDeleteNamespace()
     * - .toDeleteTable()
     * - .toDeleteTableBucket()
     * - .toDeleteTableBucketEncryption()
     * - .toDeleteTableBucketMetricsConfiguration()
     * - .toDeleteTableBucketPolicy()
     * - .toDeleteTableBucketReplication()
     * - .toDeleteTablePolicy()
     * - .toDeleteTableReplication()
     * - .toGetNamespace()
     * - .toGetTable()
     * - .toGetTableBucket()
     * - .toGetTableBucketEncryption()
     * - .toGetTableBucketMaintenanceConfiguration()
     * - .toGetTableBucketMetricsConfiguration()
     * - .toGetTableBucketPolicy()
     * - .toGetTableBucketReplication()
     * - .toGetTableBucketStorageClass()
     * - .toGetTableEncryption()
     * - .toGetTableMaintenanceConfiguration()
     * - .toGetTableMaintenanceJobStatus()
     * - .toGetTableMetadataLocation()
     * - .toGetTablePolicy()
     * - .toGetTableRecordExpirationConfiguration()
     * - .toGetTableRecordExpirationJobStatus()
     * - .toGetTableReplication()
     * - .toGetTableReplicationStatus()
     * - .toGetTableStorageClass()
     * - .toListNamespaces()
     * - .toListTables()
     * - .toListTagsForResource()
     * - .toPutTableBucketEncryption()
     * - .toPutTableBucketMaintenanceConfiguration()
     * - .toPutTableBucketMetricsConfiguration()
     * - .toPutTableBucketPolicy()
     * - .toPutTableBucketReplication()
     * - .toPutTableBucketStorageClass()
     * - .toPutTableMaintenanceConfiguration()
     * - .toPutTablePolicy()
     * - .toPutTableRecordExpirationConfiguration()
     * - .toPutTableReplication()
     * - .toPutTableStorageClass()
     * - .toRenameTable()
     * - .toTagResource()
     * - .toUntagResource()
     * - .toUpdateTableMetadataLocation()
     * - .toGetTableData()
     * - .toPutTableData()
     * - .toPutTableEncryption()
     *
     * Applies to resource types:
     * - Table
     * - TableBucket
     *
     * @param tagKey The tag key to check
     * @param value The value(s) to check
     * @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
     */
    ifTableBucketTag(tagKey, value, operator) {
        return this.if(`TableBucketTag/${tagKey}`, value, operator ?? 'StringLike');
    }
    /**
     * Filters access by the namespaces created in the table bucket
     *
     * https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-setting-up.htmls3-tables-setting-up.html
     *
     * Applies to actions:
     * - .toCreateTable()
     * - .toDeleteNamespace()
     * - .toDeleteTable()
     * - .toDeleteTablePolicy()
     * - .toDeleteTableReplication()
     * - .toGetNamespace()
     * - .toGetTable()
     * - .toGetTableEncryption()
     * - .toGetTableMaintenanceConfiguration()
     * - .toGetTableMaintenanceJobStatus()
     * - .toGetTableMetadataLocation()
     * - .toGetTablePolicy()
     * - .toGetTableRecordExpirationConfiguration()
     * - .toGetTableRecordExpirationJobStatus()
     * - .toGetTableReplication()
     * - .toGetTableReplicationStatus()
     * - .toGetTableStorageClass()
     * - .toListTables()
     * - .toListTagsForResource()
     * - .toPutTableMaintenanceConfiguration()
     * - .toPutTablePolicy()
     * - .toPutTableRecordExpirationConfiguration()
     * - .toPutTableReplication()
     * - .toPutTableStorageClass()
     * - .toRenameTable()
     * - .toTagResource()
     * - .toUntagResource()
     * - .toUpdateTableMetadataLocation()
     * - .toGetTableData()
     * - .toPutTableData()
     * - .toPutTableEncryption()
     *
     * Applies to resource types:
     * - Table
     *
     * @param value The value(s) to check
     * @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
     */
    ifNamespace(value, operator) {
        return this.if(`namespace`, value, operator ?? 'StringLike');
    }
    /**
     * Filters access by the name of the tables in the table bucket
     *
     * https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-setting-up.htmls3-tables-setting-up.html
     *
     * Applies to actions:
     * - .toDeleteTable()
     * - .toDeleteTablePolicy()
     * - .toDeleteTableReplication()
     * - .toGetTable()
     * - .toGetTableEncryption()
     * - .toGetTableMaintenanceConfiguration()
     * - .toGetTableMaintenanceJobStatus()
     * - .toGetTableMetadataLocation()
     * - .toGetTablePolicy()
     * - .toGetTableRecordExpirationConfiguration()
     * - .toGetTableRecordExpirationJobStatus()
     * - .toGetTableReplication()
     * - .toGetTableReplicationStatus()
     * - .toGetTableStorageClass()
     * - .toListTagsForResource()
     * - .toPutTableMaintenanceConfiguration()
     * - .toPutTablePolicy()
     * - .toPutTableRecordExpirationConfiguration()
     * - .toPutTableReplication()
     * - .toPutTableStorageClass()
     * - .toRenameTable()
     * - .toTagResource()
     * - .toUntagResource()
     * - .toUpdateTableMetadataLocation()
     * - .toGetTableData()
     * - .toPutTableData()
     * - .toPutTableEncryption()
     *
     * Applies to resource types:
     * - Table
     *
     * @param value The value(s) to check
     * @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
     */
    ifTableName(value, operator) {
        return this.if(`tableName`, value, operator ?? 'StringLike');
    }
    /**
     * Statement provider for service [s3tables](https://docs.aws.amazon.com/service-authorization/latest/reference/list_s3tables.html).
     *
     */
    constructor(props) {
        super(props);
        this.servicePrefix = 's3tables';
        this.accessLevelList = {
            Write: [
                'CreateNamespace',
                'CreateTable',
                'CreateTableBucket',
                'DeleteNamespace',
                'DeleteTable',
                'DeleteTableBucket',
                'DeleteTableBucketEncryption',
                'DeleteTableBucketMetricsConfiguration',
                'DeleteTableBucketPolicy',
                'DeleteTableBucketReplication',
                'DeleteTablePolicy',
                'DeleteTableReplication',
                'PutTableBucketEncryption',
                'PutTableBucketMaintenanceConfiguration',
                'PutTableBucketMetricsConfiguration',
                'PutTableBucketPolicy',
                'PutTableBucketReplication',
                'PutTableBucketStorageClass',
                'PutTableMaintenanceConfiguration',
                'PutTablePolicy',
                'PutTableRecordExpirationConfiguration',
                'PutTableReplication',
                'PutTableStorageClass',
                'RenameTable',
                'TagResource',
                'UntagResource',
                'UpdateTableMetadataLocation',
                'PutTableData',
                'PutTableEncryption'
            ],
            'Permissions management': [
                'DeleteTableBucketPolicy',
                'DeleteTablePolicy',
                'PutTableBucketPolicy',
                'PutTablePolicy'
            ],
            Read: [
                'GetNamespace',
                'GetTable',
                'GetTableBucket',
                'GetTableBucketEncryption',
                'GetTableBucketMaintenanceConfiguration',
                'GetTableBucketMetricsConfiguration',
                'GetTableBucketPolicy',
                'GetTableBucketReplication',
                'GetTableBucketStorageClass',
                'GetTableEncryption',
                'GetTableMaintenanceConfiguration',
                'GetTableMaintenanceJobStatus',
                'GetTableMetadataLocation',
                'GetTablePolicy',
                'GetTableRecordExpirationConfiguration',
                'GetTableRecordExpirationJobStatus',
                'GetTableReplication',
                'GetTableReplicationStatus',
                'GetTableStorageClass',
                'GetTableData'
            ],
            List: [
                'ListNamespaces',
                'ListTableBuckets',
                'ListTables',
                'ListTagsForResource'
            ],
            Tagging: [
                'TagResource',
                'UntagResource'
            ]
        };
    }
}
exports.S3tables = S3tables;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiczN0YWJsZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJzM3RhYmxlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSx5Q0FBeUQ7QUFHekQ7Ozs7R0FJRztBQUNILE1BQWEsUUFBUyxTQUFRLHdCQUFlO0lBRzNDOzs7Ozs7T0FNRztJQUNJLGlCQUFpQjtRQUN0QixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksYUFBYTtRQUNsQixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLG1CQUFtQjtRQUN4QixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksaUJBQWlCO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxhQUFhO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksbUJBQW1CO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSw2QkFBNkI7UUFDbEMsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLDZCQUE2QixDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLHVDQUF1QztRQUM1QyxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsdUNBQXVDLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0kseUJBQXlCO1FBQzlCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyx5QkFBeUIs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QUU7Z0JBQ3hCLHlCQUF5QjtnQkFDekIsbUJBQW1CO2dCQUNuQixzQkFBc0I7Z0JBQ3RCLGdCQUFnQjthQUNqQjtZQUNELElBQUksRUFBRTtnQkFDSixjQUFjO2dCQUNkLFVBQVU7Z0JBQ1YsZ0JBQWdCO2dCQUNoQiwwQkFBMEI7Z0JBQzFCLHdDQUF3QztnQkFDeEMsb0NBQW9DO2dCQUNwQyxzQkFBc0I7Z0JBQ3RCLDJCQUEyQjtnQkFDM0IsNEJBQTRCO2dCQUM1QixvQkFBb0I7Z0JBQ3BCLGtDQUFrQztnQkFDbEMsOEJBQThCO2dCQUM5QiwwQkFBMEI7Z0JBQzFCLGdCQUFnQjtnQkFDaEIsdUNBQXVDO2dCQUN2QyxtQ0FBbUM7Z0JBQ25DLHFCQUFxQjtnQkFDckIsMkJBQTJCO2dCQUMzQixzQkFBc0I7Z0JBQ3RCLGNBQWM7YUFDZjtZQUNELElBQUksRUFBRTtnQkFDSixnQkFBZ0I7Z0JBQ2hCLGtCQUFrQjtnQkFDbEIsWUFBWTtnQkFDWixxQkFBcUI7YUFDdEI7WUFDRCxPQUFPLEVBQUU7Z0JBQ1AsYUFBYTtnQkFDYixlQUFlO2FBQ2hCO1NBQ0YsQ0FBQztJQWlYRixDQUFDO0NBQ0Y7QUFsZ0NELDRCQWtnQ0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBY2Nlc3NMZXZlbExpc3QgfSBmcm9tICcuLi8uLi9zaGFyZWQvYWNjZXNzLWxldmVsJztcbmltcG9ydCB7IFBvbGljeVN0YXRlbWVudCwgT3BlcmF0b3IgfSBmcm9tICcuLi8uLi9zaGFyZWQnO1xuaW1wb3J0IHsgYXdzX2lhbSBhcyBpYW0gfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcblxuLyoqXG4gKiBTdGF0ZW1lbnQgcHJvdmlkZXIgZm9yIHNlcnZpY2UgW3MzdGFibGVzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc2VydmljZS1hdXRob3JpemF0aW9uL2xhdGVzdC9yZWZlcmVuY2UvbGlzdF9zM3RhYmxlcy5odG1sKS5cbiAqXG4gKiBAcGFyYW0gc2lkIFtTSURdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfc2lkLmh0bWwpIG9mIHRoZSBzdGF0ZW1lbnRcbiAqL1xuZXhwb3J0IGNsYXNzIFMzdGFibGVzIGV4dGVuZHMgUG9saWN5U3RhdGVtZW50IHtcbiAgcHVibGljIHNlcnZpY2VQcmVmaXggPSAnczN0YWJsZXMnO1xuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYSBuYW1lc3BhY2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L0FQSS9BUElfczNCdWNrZXRzX0NyZWF0ZU5hbWVzcGFjZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVOYW1lc3BhY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZU5hbWVzcGFjZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhIHRhYmxlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC9BUEkvQVBJX3MzQnVja2V0c19DcmVhdGVUYWJsZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVUYWJsZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlVGFibGUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYSB0YWJsZSBidWNrZXRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L0FQSS9BUElfczNCdWNrZXRzX0NyZWF0ZVRhYmxlQnVja2V0Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZVRhYmxlQnVja2V0KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVUYWJsZUJ1Y2tldCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlbGV0ZSBhIG5hbWVzcGFjZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25TMy9sYXRlc3QvQVBJL0FQSV9zM0J1Y2tldHNfRGVsZXRlTmFtZXNwYWNlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZU5hbWVzcGFjZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlTmFtZXNwYWNlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGEgdGFibGVcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L0FQSS9BUElfczNCdWNrZXRzX0RlbGV0ZVRhYmxlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZVRhYmxlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVUYWJsZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlbGV0ZSBhIHRhYmxlIGJ1Y2tldFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25TMy9sYXRlc3QvQVBJL0FQSV9zM0J1Y2tldHNfRGVsZXRlVGFibGVCdWNrZXQuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlVGFibGVCdWNrZXQoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZVRhYmxlQnVja2V0Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGVuY3J5cHRpb24gY29uZmlndXJhdGlvbiBvbiBhIHRhYmxlIGJ1Y2tldFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25TMy9sYXRlc3QvQVBJL0FQSV9zM0J1Y2tldHNfRGVsZXRlVGFibGVCdWNrZXRFbmNyeXB0aW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZVRhYmxlQnVja2V0RW5jcnlwdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlVGFibGVCdWNrZXRFbmNyeXB0aW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGEgbWV0cmljcyBjb25maWd1cmF0aW9uIG9uIGEgdGFibGUgYnVja2V0XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC9BUEkvQVBJX3MzQnVja2V0c19EZWxldGVUYWJsZUJ1Y2tldE1ldHJpY3NDb25maWd1cmF0aW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZVRhYmxlQnVja2V0TWV0cmljc0NvbmZpZ3VyYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZVRhYmxlQnVja2V0TWV0cmljc0NvbmZpZ3VyYXRpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgYSBwb2xpY3kgb24gYSB0YWJsZSBidWNrZXRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBQZXJtaXNzaW9ucyBtYW5hZ2VtZW50LCBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L0FQSS9BUElfczNCdWNrZXRzX0RlbGV0ZVRhYmxlQnVja2V0UG9saWN5Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZVRhYmxlQnVja2V0UG9saWN5KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVUYWJsZUJ1Y2tldFBvbGljeScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlbGV0ZSB0YWJsZSBidWNrZXQgcmVwbGljYXRpb24gY29uZmlndXJhdGlvbiBvbiBhIGJ1Y2tldFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25TMy9sYXRlc3QvQVBJL0FQSV9zM0J1Y2tldHNfRGVsZXRlVGFibGVCdWNrZXRSZXBsaWNhdGlvbi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVUYWJsZUJ1Y2tldFJlcGxpY2F0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVUYWJsZUJ1Y2tldFJlcGxpY2F0aW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGEgcG9saWN5IG9uIGEgdGFibGVcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBQZXJtaXNzaW9ucyBtYW5hZ2VtZW50LCBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L0FQSS9BUElfczNCdWNrZXRzX0RlbGV0ZVRhYmxlUG9saWN5Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZVRhYmxlUG9saWN5KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVUYWJsZVBvbGljeScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlbGV0ZSB0YWJsZSByZXBsaWNhdGlvbiBjb25maWd1cmF0aW9uIG9uIGEgdGFibGVcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L0FQSS9BUElfczNCdWNrZXRzX0RlbGV0ZVRhYmxlUmVwbGljYXRpb24uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlVGFibGVSZXBsaWNhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlVGFibGVSZXBsaWNhdGlvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdldCBhIG5hbWVzcGFjZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC9BUEkvQVBJX3MzQnVja2V0c19HZXROYW1lc3BhY2UuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0TmFtZXNwYWNlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXROYW1lc3BhY2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXRyaWV2ZSBhIHRhYmxlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L0FQSS9BUElfczNCdWNrZXRzX0dldFRhYmxlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldFRhYmxlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRUYWJsZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJldHJpZXZlIGEgdGFibGUgYnVja2V0XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L0FQSS9BUElfczNCdWNrZXRzX0dldFRhYmxlQnVja2V0Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldFRhYmxlQnVja2V0KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRUYWJsZUJ1Y2tldCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJldHJpZXZlIGVuY3J5cHRpb24gY29uZmlndXJhdGlvbiBvbiBhIHRhYmxlIGJ1Y2tldFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC9BUEkvQVBJX3MzQnVja2V0c19HZXRUYWJsZUJ1Y2tldEVuY3J5cHRpb24uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0VGFibGVCdWNrZXRFbmNyeXB0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRUYWJsZUJ1Y2tldEVuY3J5cHRpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXRyaWV2ZSBhIG1haW50ZW5hbmNlIGNvbmZpZ3VyYXRpb24gb24gYSB0YWJsZSBidWNrZXRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25TMy9sYXRlc3QvQVBJL0FQSV9zM0J1Y2tldHNfR2V0VGFibGVCdWNrZXRNYWludGVuYW5jZUNvbmZpZ3VyYXRpb24uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0VGFibGVCdWNrZXRNYWludGVuYW5jZUNvbmZpZ3VyYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldFRhYmxlQnVja2V0TWFpbnRlbmFuY2VDb25maWd1cmF0aW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmV0cmlldmUgYSBtZXRyaWNzIGNvbmZpZ3VyYXRpb24gb24gYSBidWNrZXRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25TMy9sYXRlc3QvQVBJL0FQSV9zM0J1Y2tldHNfR2V0VGFibGVCdWNrZXRNZXRyaWNzQ29uZmlndXJhdGlvbi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRUYWJsZUJ1Y2tldE1ldHJpY3NDb25maWd1cmF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRUYWJsZUJ1Y2tldE1ldHJpY3NDb25maWd1cmF0aW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmV0cmlldmUgYSBwb2xpY3kgb24gYSB0YWJsZSBidWNrZXRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25TMy9sYXRlc3QvQVBJL0FQSV9zM0J1Y2tldHNfR2V0VGFibGVCdWNrZXRQb2xpY3kuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0VGFibGVCdWNrZXRQb2xpY3koKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldFRhYmxlQnVja2V0UG9saWN5Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmV0cmlldmUgYSB0YWJsZSBidWNrZXQgcmVwbGljYXRpb24gY29uZmlndXJhdGlvbiBvbiBhIGJ1Y2tldFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC9BUEkvQVBJX3MzQnVja2V0c19HZXRUYWJsZUJ1Y2tldFJlcGxpY2F0aW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldFRhYmxlQnVja2V0UmVwbGljYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldFRhYmxlQnVja2V0UmVwbGljYXRpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXRyaWV2ZSB0aGUgc3RvcmFnZSBjbGFzcyBjb25maWd1cmF0aW9uIGZvciBhIHRhYmxlIGJ1Y2tldFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC9BUEkvQVBJX3MzQnVja2V0c19HZXRUYWJsZUJ1Y2tldFN0b3JhZ2VDbGFzcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRUYWJsZUJ1Y2tldFN0b3JhZ2VDbGFzcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0VGFibGVCdWNrZXRTdG9yYWdlQ2xhc3MnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXRyaWV2ZSBlbmNyeXB0aW9uIGNvbmZpZ3VyYXRpb24gb24gYSB0YWJsZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC9BUEkvQVBJX3MzQnVja2V0c19HZXRUYWJsZUVuY3J5cHRpb24uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0VGFibGVFbmNyeXB0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRUYWJsZUVuY3J5cHRpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXRyaWV2ZSBhIG1haW50ZW5hbmNlIGNvbmZpZ3VyYXRpb24gb24gYSB0YWJsZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC9BUEkvQVBJX3MzQnVja2V0c19HZXRUYWJsZU1haW50ZW5hbmNlQ29uZmlndXJhdGlvbi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRUYWJsZU1haW50ZW5hbmNlQ29uZmlndXJhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0VGFibGVNYWludGVuYW5jZUNvbmZpZ3VyYXRpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXRyaWV2ZSB0aGUgc3RhdHVzIG9mIG1haW50ZW5hbmNlIGpvYnMgb24gYSB0YWJsZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC9BUEkvQVBJX3MzQnVja2V0c19HZXRUYWJsZU1haW50ZW5hbmNlSm9iU3RhdHVzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldFRhYmxlTWFpbnRlbmFuY2VKb2JTdGF0dXMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldFRhYmxlTWFpbnRlbmFuY2VKb2JTdGF0dXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXRyaWV2ZSB0aGUgbWV0YWRhdGEgbG9jYXRpb24gb2YgYSB0YWJsZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC9BUEkvQVBJX3MzQnVja2V0c19HZXRUYWJsZU1ldGFkYXRhTG9jYXRpb24uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0VGFibGVNZXRhZGF0YUxvY2F0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRUYWJsZU1ldGFkYXRhTG9jYXRpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXRyaWV2ZSBhIHBvbGljeSBvbiBhIHRhYmxlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L0FQSS9BUElfczNCdWNrZXRzX0dldFRhYmxlUG9saWN5Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldFRhYmxlUG9saWN5KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRUYWJsZVBvbGljeScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJldHJpZXZlIGEgdGFibGUgbWFpbnRlbmFuY2UgY29uZmlndXJhdGlvbiBvbiBhIHN5c3RlbSB0YWJsZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC9BUEkvQVBJX3MzQnVja2V0c19HZXRUYWJsZVJlY29yZEV4cGlyYXRpb25Db25maWd1cmF0aW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldFRhYmxlUmVjb3JkRXhwaXJhdGlvbkNvbmZpZ3VyYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldFRhYmxlUmVjb3JkRXhwaXJhdGlvbkNvbmZpZ3VyYXRpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXRyaWV2ZSB0aGUgc3RhdHVzIG9mIHRhYmxlIHJlY29yZCBleHBpcmF0aW9uIGpvYnMgb24gYSBzeXN0ZW0gdGFibGVcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25TMy9sYXRlc3QvQVBJL0FQSV9zM0J1Y2tldHNfR2V0VGFibGVSZWNvcmRFeHBpcmF0aW9uSm9iU3RhdHVzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldFRhYmxlUmVjb3JkRXhwaXJhdGlvbkpvYlN0YXR1cygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0VGFibGVSZWNvcmRFeHBpcmF0aW9uSm9iU3RhdHVzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmV0cmlldmUgYSB0YWJsZSByZXBsaWNhdGlvbiBjb25maWd1cmF0aW9uIG9uIGEgdGFibGVcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25TMy9sYXRlc3QvQVBJL0FQSV9zM0J1Y2tldHNfR2V0VGFibGVSZXBsaWNhdGlvbi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRUYWJsZVJlcGxpY2F0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRUYWJsZVJlcGxpY2F0aW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmV0cmlldmUgYSB0YWJsZSByZXBsaWNhdGlvbiBzdGF0dXMgb24gYSB0YWJsZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC9BUEkvQVBJX3MzQnVja2V0c19HZXRUYWJsZVJlcGxpY2F0aW9uU3RhdHVzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldFRhYmxlUmVwbGljYXRpb25TdGF0dXMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldFRhYmxlUmVwbGljYXRpb25TdGF0dXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXRyaWV2ZSB0aGUgc3RvcmFnZSBjbGFzcyBjb25maWd1cmF0aW9uIGZvciBhIHNwZWNpZmljIHRhYmxlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L0FQSS9BUElfczNCdWNrZXRzX0dldFRhYmxlU3RvcmFnZUNsYXNzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldFRhYmxlU3RvcmFnZUNsYXNzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRUYWJsZVN0b3JhZ2VDbGFzcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgbmFtZXNwYWNlc1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC9BUEkvQVBJX3MzQnVja2V0c19MaXN0TmFtZXNwYWNlcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0TmFtZXNwYWNlcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdE5hbWVzcGFjZXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0IHRhYmxlIGJ1Y2tldHNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25TMy9sYXRlc3QvQVBJL0FQSV9zM0J1Y2tldHNfTGlzdFRhYmxlQnVja2V0cy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0VGFibGVCdWNrZXRzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0VGFibGVCdWNrZXRzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCB0YWJsZXNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25TMy9sYXRlc3QvQVBJL0FQSV9zM0J1Y2tldHNfTGlzdFRhYmxlcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0VGFibGVzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0VGFibGVzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCB0aGUgdGFncyBmb3IgYW4gUzMgVGFibGVzIHJlc291cmNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L3VzZXJndWlkZS9zMy10YWJsZXMtdGFibGVzLXRhZ2dpbmcuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdFRhZ3NGb3JSZXNvdXJjZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdFRhZ3NGb3JSZXNvdXJjZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHB1dCBvciBvdmVyd3JpdGUgZW5jcnlwdGlvbiBjb25maWd1cmF0aW9uIG9uIGEgdGFibGUgYnVja2V0XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC9BUEkvQVBJX3MzQnVja2V0c19QdXRUYWJsZUJ1Y2tldEVuY3J5cHRpb24uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvUHV0VGFibGVCdWNrZXRFbmNyeXB0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdQdXRUYWJsZUJ1Y2tldEVuY3J5cHRpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBwdXQgYSBtYWludGVuYW5jZSBjb25maWd1cmF0aW9uIG9uIGEgdGFibGUgYnVja2V0XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC9BUEkvQVBJX3MzQnVja2V0c19QdXRUYWJsZUJ1Y2tldE1haW50ZW5hbmNlQ29uZmlndXJhdGlvbi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9QdXRUYWJsZUJ1Y2tldE1haW50ZW5hbmNlQ29uZmlndXJhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnUHV0VGFibGVCdWNrZXRNYWludGVuYW5jZUNvbmZpZ3VyYXRpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgb3Igb3ZlcndyaXRlIGEgbWV0cmljcyBjb25maWd1cmF0aW9uIG9uIGEgdGFibGUgYnVja2V0XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC9BUEkvQVBJX3MzQnVja2V0c19QdXRUYWJsZUJ1Y2tldE1ldHJpY3NDb25maWd1cmF0aW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1B1dFRhYmxlQnVja2V0TWV0cmljc0NvbmZpZ3VyYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1B1dFRhYmxlQnVja2V0TWV0cmljc0NvbmZpZ3VyYXRpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgb3Igb3ZlcndyaXRlIGEgcG9saWN5IG9uIGEgdGFibGUgYnVja2V0XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUGVybWlzc2lvbnMgbWFuYWdlbWVudCwgV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC9BUEkvQVBJX3MzQnVja2V0c19QdXRUYWJsZUJ1Y2tldFBvbGljeS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9QdXRUYWJsZUJ1Y2tldFBvbGljeSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnUHV0VGFibGVCdWNrZXRQb2xpY3knKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBwdXQgdGFibGUgYnVja2V0IHJlcGxpY2F0aW9uIGNvbmZpZ3VyYXRpb24gb24gYSBidWNrZXRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L0FQSS9BUElfczNCdWNrZXRzX1B1dFRhYmxlQnVja2V0UmVwbGljYXRpb24uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvUHV0VGFibGVCdWNrZXRSZXBsaWNhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnUHV0VGFibGVCdWNrZXRSZXBsaWNhdGlvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHNldCBvciB1cGRhdGUgdGhlIHN0b3JhZ2UgY2xhc3MgY29uZmlndXJhdGlvbiBmb3IgYSB0YWJsZSBidWNrZXRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L0FQSS9BUElfczNCdWNrZXRzX1B1dFRhYmxlQnVja2V0U3RvcmFnZUNsYXNzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1B1dFRhYmxlQnVja2V0U3RvcmFnZUNsYXNzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdQdXRUYWJsZUJ1Y2tldFN0b3JhZ2VDbGFzcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHB1dCBhIG1haW50ZW5hbmNlIGNvbmZpZ3VyYXRpb24gb24gYSB0YWJsZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25TMy9sYXRlc3QvQVBJL0FQSV9zM0J1Y2tldHNfUHV0VGFibGVNYWludGVuYW5jZUNvbmZpZ3VyYXRpb24uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvUHV0VGFibGVNYWludGVuYW5jZUNvbmZpZ3VyYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1B1dFRhYmxlTWFpbnRlbmFuY2VDb25maWd1cmF0aW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY3JlYXRlIG9yIG92ZXJ3cml0ZSBhIHBvbGljeSBvbiBhIHRhYmxlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUGVybWlzc2lvbnMgbWFuYWdlbWVudCwgV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC9BUEkvQVBJX3MzQnVja2V0c19QdXRUYWJsZVBvbGljeS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9QdXRUYWJsZVBvbGljeSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnUHV0VGFibGVQb2xpY3knKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBwdXQgYSB0YWJsZSByZWNvcmQgZXhwaXJhdGlvbiBjb25maWd1cmF0aW9uIG9uIGEgc3lzdGVtIHRhYmxlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC9BUEkvQVBJX3MzQnVja2V0c19QdXRUYWJsZVJlY29yZEV4cGlyYXRpb25Db25maWd1cmF0aW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1B1dFRhYmxlUmVjb3JkRXhwaXJhdGlvbkNvbmZpZ3VyYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1B1dFRhYmxlUmVjb3JkRXhwaXJhdGlvbkNvbmZpZ3VyYXRpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBwdXQgdGFibGUgcmVwbGljYXRpb24gY29uZmlndXJhdGlvbiBvbiBhIHRhYmxlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC9BUEkvQVBJX3MzQnVja2V0c19QdXRUYWJsZVJlcGxpY2F0aW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1B1dFRhYmxlUmVwbGljYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1B1dFRhYmxlUmVwbGljYXRpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBzZXQgb3IgdXBkYXRlIHRoZSBzdG9yYWdlIGNsYXNzIGNvbmZpZ3VyYXRpb24gZm9yIGEgdGFibGVcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L0FQSS9BUElfczNCdWNrZXRzX1B1dFRhYmxlU3RvcmFnZUNsYXNzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1B1dFRhYmxlU3RvcmFnZUNsYXNzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdQdXRUYWJsZVN0b3JhZ2VDbGFzcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJlbmFtZSBhIHRhYmxlIG9yIG1vdmUgYSB0YWJsZSBhY3Jvc3MgbmFtZXNwYWNlc1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25TMy9sYXRlc3QvQVBJL0FQSV9zM0J1Y2tldHNfUmVuYW1lVGFibGUuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvUmVuYW1lVGFibGUoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1JlbmFtZVRhYmxlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gdGFnIGEgUzMgVGFibGVzIHJlc291cmNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogVGFnZ2luZywgV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC91c2VyZ3VpZGUvczMtdGFibGVzLXRhYmxlcy10YWdnaW5nLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1RhZ1Jlc291cmNlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdUYWdSZXNvdXJjZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHVudGFnIGEgUzMgVGFibGVzIHJlc291cmNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogVGFnZ2luZywgV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC91c2VyZ3VpZGUvczMtdGFibGVzLXRhYmxlcy10YWdnaW5nLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1VudGFnUmVzb3VyY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1VudGFnUmVzb3VyY2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byB1cGRhdGUgdGhlIG1ldGFkYXRhIGxvY2F0aW9uIG9mIGEgdGFibGVcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L0FQSS9BUElfczNCdWNrZXRzX1VwZGF0ZVRhYmxlTWV0YWRhdGFMb2NhdGlvbi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9VcGRhdGVUYWJsZU1ldGFkYXRhTG9jYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1VwZGF0ZVRhYmxlTWV0YWRhdGFMb2NhdGlvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJlYWQgbWV0YWRhdGEgYW5kIGRhdGEgb2JqZWN0cyBmcm9tIGEgdGFibGUgc3RvcmFnZSBlbmRwb2ludCB1c2luZyBTMyBBUElzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L3VzZXJndWlkZS9zMy10YWJsZXMtc2V0dGluZy11cC5odG1sI3MzLXRhYmxlcy1hY3Rpb25zXG4gICAqL1xuICBwdWJsaWMgdG9HZXRUYWJsZURhdGEoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldFRhYmxlRGF0YScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHdyaXRlIG1ldGFkYXRhIGFuZCBkYXRhIG9iamVjdHMgdG8gYSB0YWJsZSBzdG9yYWdlIGVuZHBvaW50IHVzaW5nIFMzIEFQSXNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L3VzZXJndWlkZS9zMy10YWJsZXMtc2V0dGluZy11cC5odG1sI3MzLXRhYmxlcy1hY3Rpb25zXG4gICAqL1xuICBwdWJsaWMgdG9QdXRUYWJsZURhdGEoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1B1dFRhYmxlRGF0YScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHB1dCBlbmNyeXB0aW9uIGNvbmZpZ3VyYXRpb24gb24gYSB0YWJsZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25TMy9sYXRlc3QvdXNlcmd1aWRlL3MzLXRhYmxlcy1zZXR0aW5nLXVwLmh0bWwjczMtdGFibGVzLWFjdGlvbnNcbiAgICovXG4gIHB1YmxpYyB0b1B1dFRhYmxlRW5jcnlwdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnUHV0VGFibGVFbmNyeXB0aW9uJyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWNjZXNzTGV2ZWxMaXN0OiBBY2Nlc3NMZXZlbExpc3QgPSB7XG4gICAgV3JpdGU6IFtcbiAgICAgICdDcmVhdGVOYW1lc3BhY2UnLFxuICAgICAgJ0NyZWF0ZVRhYmxlJyxcbiAgICAgICdDcmVhdGVUYWJsZUJ1Y2tldCcsXG4gICAgICAnRGVsZXRlTmFtZXNwYWNlJyxcbiAgICAgICdEZWxldGVUYWJsZScsXG4gICAgICAnRGVsZXRlVGFibGVCdWNrZXQnLFxuICAgICAgJ0RlbGV0ZVRhYmxlQnVja2V0RW5jcnlwdGlvbicsXG4gICAgICAnRGVsZXRlVGFibGVCdWNrZXRNZXRyaWNzQ29uZmlndXJhdGlvbicsXG4gICAgICAnRGVsZXRlVGFibGVCdWNrZXRQb2xpY3knLFxuICAgICAgJ0RlbGV0ZVRhYmxlQnVja2V0UmVwbGljYXRpb24nLFxuICAgICAgJ0RlbGV0ZVRhYmxlUG9saWN5JyxcbiAgICAgICdEZWxldGVUYWJsZVJlcGxpY2F0aW9uJyxcbiAgICAgICdQdXRUYWJsZUJ1Y2tldEVuY3J5cHRpb24nLFxuICAgICAgJ1B1dFRhYmxlQnVja2V0TWFpbnRlbmFuY2VDb25maWd1cmF0aW9uJyxcbiAgICAgICdQdXRUYWJsZUJ1Y2tldE1ldHJpY3NDb25maWd1cmF0aW9uJyxcbiAgICAgICdQdXRUYWJsZUJ1Y2tldFBvbGljeScsXG4gICAgICAnUHV0VGFibGVCdWNrZXRSZXBsaWNhdGlvbicsXG4gICAgICAnUHV0VGFibGVCdWNrZXRTdG9yYWdlQ2xhc3MnLFxuICAgICAgJ1B1dFRhYmxlTWFpbnRlbmFuY2VDb25maWd1cmF0aW9uJyxcbiAgICAgICdQdXRUYWJsZVBvbGljeScsXG4gICAgICAnUHV0VGFibGVSZWNvcmRFeHBpcmF0aW9uQ29uZmlndXJhdGlvbicsXG4gICAgICAnUHV0VGFibGVSZXBsaWNhdGlvbicsXG4gICAgICAnUHV0VGFibGVTdG9yYWdlQ2xhc3MnLFxuICAgICAgJ1JlbmFtZVRhYmxlJyxcbiAgICAgICdUYWdSZXNvdXJjZScsXG4gICAgICAnVW50YWdSZXNvdXJjZScsXG4gICAgICAnVXBkYXRlVGFibGVNZXRhZGF0YUxvY2F0aW9uJyxcbiAgICAgICdQdXRUYWJsZURhdGEnLFxuICAgICAgJ1B1dFRhYmxlRW5jcnlwdGlvbidcbiAgICBdLFxuICAgICdQZXJtaXNzaW9ucyBtYW5hZ2VtZW50JzogW1xuICAgICAgJ0RlbGV0ZVRhYmxlQnVja2V0UG9saWN5JyxcbiAgICAgICdEZWxldGVUYWJsZVBvbGljeScsXG4gICAgICAnUHV0VGFibGVCdWNrZXRQb2xpY3knLFxuICAgICAgJ1B1dFRhYmxlUG9saWN5J1xuICAgIF0sXG4gICAgUmVhZDogW1xuICAgICAgJ0dldE5hbWVzcGFjZScsXG4gICAgICAnR2V0VGFibGUnLFxuICAgICAgJ0dldFRhYmxlQnVja2V0JyxcbiAgICAgICdHZXRUYWJsZUJ1Y2tldEVuY3J5cHRpb24nLFxuICAgICAgJ0dldFRhYmxlQnVja2V0TWFpbnRlbmFuY2VDb25maWd1cmF0aW9uJyxcbiAgICAgICdHZXRUYWJsZUJ1Y2tldE1ldHJpY3NDb25maWd1cmF0aW9uJyxcbiAgICAgICdHZXRUYWJsZUJ1Y2tldFBvbGljeScsXG4gICAgICAnR2V0VGFibGVCdWNrZXRSZXBsaWNhdGlvbicsXG4gICAgICAnR2V0VGFibGVCdWNrZXRTdG9yYWdlQ2xhc3MnLFxuICAgICAgJ0dldFRhYmxlRW5jcnlwdGlvbicsXG4gICAgICAnR2V0VGFibGVNYWludGVuYW5jZUNvbmZpZ3VyYXRpb24nLFxuICAgICAgJ0dldFRhYmxlTWFpbnRlbmFuY2VKb2JTdGF0dXMnLFxuICAgICAgJ0dldFRhYmxlTWV0YWRhdGFMb2NhdGlvbicsXG4gICAgICAnR2V0VGFibGVQb2xpY3knLFxuICAgICAgJ0dldFRhYmxlUmVjb3JkRXhwaXJhdGlvbkNvbmZpZ3VyYXRpb24nLFxuICAgICAgJ0dldFRhYmxlUmVjb3JkRXhwaXJhdGlvbkpvYlN0YXR1cycsXG4gICAgICAnR2V0VGFibGVSZXBsaWNhdGlvbicsXG4gICAgICAnR2V0VGFibGVSZXBsaWNhdGlvblN0YXR1cycsXG4gICAgICAnR2V0VGFibGVTdG9yYWdlQ2xhc3MnLFxuICAgICAgJ0dldFRhYmxlRGF0YSdcbiAgICBdLFxuICAgIExpc3Q6IFtcbiAgICAgICdMaXN0TmFtZXNwYWNlcycsXG4gICAgICAnTGlzdFRhYmxlQnVja2V0cycsXG4gICAgICAnTGlzdFRhYmxlcycsXG4gICAgICAnTGlzdFRhZ3NGb3JSZXNvdXJjZSdcbiAgICBdLFxuICAgIFRhZ2dpbmc6IFtcbiAgICAgICdUYWdSZXNvdXJjZScsXG4gICAgICAnVW50YWdSZXNvdXJjZSdcbiAgICBdXG4gIH07XG5cbiAgLyoqXG4gICAqIEFkZHMgYSByZXNvdXJjZSBvZiB0eXBlIFRhYmxlIHRvIHRoZSBzdGF0ZW1lbnRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC91c2VyZ3VpZGUvczMtdGFibGVzLXRhYmxlcy5odG1sXG4gICAqXG4gICAqIEBwYXJhbSB0YWJsZUJ1Y2tldE5hbWUgLSBJZGVudGlmaWVyIGZvciB0aGUgdGFibGVCdWNrZXROYW1lLlxuICAgKiBAcGFyYW0gdGFibGVJRCAtIElkZW50aWZpZXIgZm9yIHRoZSB0YWJsZUlELlxuICAgKiBAcGFyYW0gYWNjb3VudCAtIEFjY291bnQgb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIGFjY291bnQuXG4gICAqIEBwYXJhbSByZWdpb24gLSBSZWdpb24gb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHJlZ2lvbi5cbiAgICogQHBhcmFtIHBhcnRpdGlvbiAtIFBhcnRpdGlvbiBvZiB0aGUgQVdTIGFjY291bnQgW2F3cywgYXdzLWNuLCBhd3MtdXMtZ292XTsgZGVmYXVsdHMgdG8gYGF3c2AsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHBhcnRpdGlvbi5cbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NSZXNvdXJjZVRhZygpXG4gICAqIC0gLmlmVGFibGVCdWNrZXRUYWcoKVxuICAgKiAtIC5pZk5hbWVzcGFjZSgpXG4gICAqIC0gLmlmVGFibGVOYW1lKClcbiAgICovXG4gIHB1YmxpYyBvblRhYmxlKHRhYmxlQnVja2V0TmFtZTogc3RyaW5nLCB0YWJsZUlEOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06czN0YWJsZXM6JHsgcmVnaW9uID8/IHRoaXMuZGVmYXVsdFJlZ2lvbiB9OiR7IGFjY291bnQgPz8gdGhpcy5kZWZhdWx0QWNjb3VudCB9OmJ1Y2tldC8keyB0YWJsZUJ1Y2tldE5hbWUgfS90YWJsZS8keyB0YWJsZUlEIH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVzb3VyY2Ugb2YgdHlwZSBUYWJsZUJ1Y2tldCB0byB0aGUgc3RhdGVtZW50XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25TMy9sYXRlc3QvdXNlcmd1aWRlL3MzLXRhYmxlcy1idWNrZXRzLmh0bWxcbiAgICpcbiAgICogQHBhcmFtIHRhYmxlQnVja2V0TmFtZSAtIElkZW50aWZpZXIgZm9yIHRoZSB0YWJsZUJ1Y2tldE5hbWUuXG4gICAqIEBwYXJhbSBhY2NvdW50IC0gQWNjb3VudCBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgYWNjb3VudC5cbiAgICogQHBhcmFtIHJlZ2lvbiAtIFJlZ2lvbiBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcmVnaW9uLlxuICAgKiBAcGFyYW0gcGFydGl0aW9uIC0gUGFydGl0aW9uIG9mIHRoZSBBV1MgYWNjb3VudCBbYXdzLCBhd3MtY24sIGF3cy11cy1nb3ZdOyBkZWZhdWx0cyB0byBgYXdzYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcGFydGl0aW9uLlxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkF3c1Jlc291cmNlVGFnKClcbiAgICogLSAuaWZUYWJsZUJ1Y2tldFRhZygpXG4gICAqL1xuICBwdWJsaWMgb25UYWJsZUJ1Y2tldCh0YWJsZUJ1Y2tldE5hbWU6IHN0cmluZywgYWNjb3VudD86IHN0cmluZywgcmVnaW9uPzogc3RyaW5nLCBwYXJ0aXRpb24/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5vbihgYXJuOiR7IHBhcnRpdGlvbiA/PyB0aGlzLmRlZmF1bHRQYXJ0aXRpb24gfTpzM3RhYmxlczokeyByZWdpb24gPz8gdGhpcy5kZWZhdWx0UmVnaW9uIH06JHsgYWNjb3VudCA/PyB0aGlzLmRlZmF1bHRBY2NvdW50IH06YnVja2V0LyR7IHRhYmxlQnVja2V0TmFtZSB9YCk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgdGhlIHRhZ3MgdGhhdCBhcmUgcGFzc2VkIGluIHRoZSByZXF1ZXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfY29uZGl0aW9uLWtleXMuaHRtbCNjb25kaXRpb24ta2V5cy1yZXF1ZXN0dGFnXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9DcmVhdGVUYWJsZSgpXG4gICAqIC0gLnRvQ3JlYXRlVGFibGVCdWNrZXQoKVxuICAgKiAtIC50b1RhZ1Jlc291cmNlKClcbiAgICpcbiAgICogQHBhcmFtIHRhZ0tleSBUaGUgdGFnIGtleSB0byBjaGVja1xuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlKHMpIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBvcGVyYXRvciBXb3JrcyB3aXRoIFtzdHJpbmcgb3BlcmF0b3JzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbl9vcGVyYXRvcnMuaHRtbCNDb25kaXRpb25zX1N0cmluZykuICoqRGVmYXVsdDoqKiBgU3RyaW5nTGlrZWBcbiAgICovXG4gIHB1YmxpYyBpZkF3c1JlcXVlc3RUYWcodGFnS2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSwgb3BlcmF0b3I/OiBPcGVyYXRvciB8IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmlmKGBhd3M6UmVxdWVzdFRhZy8keyB0YWdLZXkgfWAsIHZhbHVlLCBvcGVyYXRvciA/PyAnU3RyaW5nTGlrZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYWNjZXNzIGJ5IHRoZSB0YWdzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVzb3VyY2VcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19jb25kaXRpb24ta2V5cy5odG1sI2NvbmRpdGlvbi1rZXlzLXJlc291cmNldGFnXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9DcmVhdGVOYW1lc3BhY2UoKVxuICAgKiAtIC50b0NyZWF0ZVRhYmxlKClcbiAgICogLSAudG9DcmVhdGVUYWJsZUJ1Y2tldCgpXG4gICAqIC0gLnRvRGVsZXRlTmFtZXNwYWNlKClcbiAgICogLSAudG9EZWxldGVUYWJsZSgpXG4gICAqIC0gLnRvRGVsZXRlVGFibGVCdWNrZXQoKVxuICAgKiAtIC50b0RlbGV0ZVRhYmxlQnVja2V0RW5jcnlwdGlvbigpXG4gICAqIC0gLnRvRGVsZXRlVGFibGVCdWNrZXRNZXRyaWNzQ29uZmlndXJhdGlvbigpXG4gICAqIC0gLnRvRGVsZXRlVGFibGVCdWNrZXRQb2xpY3koKVxuICAgKiAtIC50b0RlbGV0ZVRhYmxlQnVja2V0UmVwbGljYXRpb24oKVxuICAgKiAtIC50b0RlbGV0ZVRhYmxlUG9saWN5KClcbiAgICogLSAudG9EZWxldGVUYWJsZVJlcGxpY2F0aW9uKClcbiAgICogLSAudG9HZXROYW1lc3BhY2UoKVxuICAgKiAtIC50b0dldFRhYmxlKClcbiAgICogLSAudG9HZXRUYWJsZUJ1Y2tldCgpXG4gICAqIC0gLnRvR2V0VGFibGVCdWNrZXRFbmNyeXB0aW9uKClcbiAgICogLSAudG9HZXRUYWJsZUJ1Y2tldE1haW50ZW5hbmNlQ29uZmlndXJhdGlvbigpXG4gICAqIC0gLnRvR2V0VGFibGVCdWNrZXRNZXRyaWNzQ29uZmlndXJhdGlvbigpXG4gICAqIC0gLnRvR2V0VGFibGVCdWNrZXRQb2xpY3koKVxuICAgKiAtIC50b0dldFRhYmxlQnVja2V0UmVwbGljYXRpb24oKVxuICAgKiAtIC50b0dldFRhYmxlQnVja2V0U3RvcmFnZUNsYXNzKClcbiAgICogLSAudG9HZXRUYWJsZUVuY3J5cHRpb24oKVxuICAgKiAtIC50b0dldFRhYmxlTWFpbnRlbmFuY2VDb25maWd1cmF0aW9uKClcbiAgICogLSAudG9HZXRUYWJsZU1haW50ZW5hbmNlSm9iU3RhdHVzKClcbiAgICogLSAudG9HZXRUYWJsZU1ldGFkYXRhTG9jYXRpb24oKVxuICAgKiAtIC50b0dldFRhYmxlUG9saWN5KClcbiAgICogLSAudG9HZXRUYWJsZVJlY29yZEV4cGlyYXRpb25Db25maWd1cmF0aW9uKClcbiAgICogLSAudG9HZXRUYWJsZVJlY29yZEV4cGlyYXRpb25Kb2JTdGF0dXMoKVxuICAgKiAtIC50b0dldFRhYmxlUmVwbGljYXRpb24oKVxuICAgKiAtIC50b0dldFRhYmxlUmVwbGljYXRpb25TdGF0dXMoKVxuICAgKiAtIC50b0dldFRhYmxlU3RvcmFnZUNsYXNzKClcbiAgICogLSAudG9MaXN0TmFtZXNwYWNlcygpXG4gICAqIC0gLnRvTGlzdFRhYmxlcygpXG4gICAqIC0gLnRvTGlzdFRhZ3NGb3JSZXNvdXJjZSgpXG4gICAqIC0gLnRvUHV0VGFibGVCdWNrZXRFbmNyeXB0aW9uKClcbiAgICogLSAudG9QdXRUYWJsZUJ1Y2tldE1haW50ZW5hbmNlQ29uZmlndXJhdGlvbigpXG4gICAqIC0gLnRvUHV0VGFibGVCdWNrZXRNZXRyaWNzQ29uZmlndXJhdGlvbigpXG4gICAqIC0gLnRvUHV0VGFibGVCdWNrZXRQb2xpY3koKVxuICAgKiAtIC50b1B1dFRhYmxlQnVja2V0UmVwbGljYXRpb24oKVxuICAgKiAtIC50b1B1dFRhYmxlQnVja2V0U3RvcmFnZUNsYXNzKClcbiAgICogLSAudG9QdXRUYWJsZU1haW50ZW5hbmNlQ29uZmlndXJhdGlvbigpXG4gICAqIC0gLnRvUHV0VGFibGVQb2xpY3koKVxuICAgKiAtIC50b1B1dFRhYmxlUmVjb3JkRXhwaXJhdGlvbkNvbmZpZ3VyYXRpb24oKVxuICAgKiAtIC50b1B1dFRhYmxlUmVwbGljYXRpb24oKVxuICAgKiAtIC50b1B1dFRhYmxlU3RvcmFnZUNsYXNzKClcbiAgICogLSAudG9SZW5hbWVUYWJsZSgpXG4gICAqIC0gLnRvVGFnUmVzb3VyY2UoKVxuICAgKiAtIC50b1VudGFnUmVzb3VyY2UoKVxuICAgKiAtIC50b1VwZGF0ZVRhYmxlTWV0YWRhdGFMb2NhdGlvbigpXG4gICAqIC0gLnRvR2V0VGFibGVEYXRhKClcbiAgICogLSAudG9QdXRUYWJsZURhdGEoKVxuICAgKiAtIC50b1B1dFRhYmxlRW5jcnlwdGlvbigpXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gcmVzb3VyY2UgdHlwZXM6XG4gICAqIC0gVGFibGVcbiAgICogLSBUYWJsZUJ1Y2tldFxuICAgKlxuICAgKiBAcGFyYW0gdGFnS2V5IFRoZSB0YWcga2V5IHRvIGNoZWNrXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW3N0cmluZyBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfU3RyaW5nKS4gKipEZWZhdWx0OioqIGBTdHJpbmdMaWtlYFxuICAgKi9cbiAgcHVibGljIGlmQXdzUmVzb3VyY2VUYWcodGFnS2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSwgb3BlcmF0b3I/OiBPcGVyYXRvciB8IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmlmKGBhd3M6UmVzb3VyY2VUYWcvJHsgdGFnS2V5IH1gLCB2YWx1ZSwgb3BlcmF0b3IgPz8gJ1N0cmluZ0xpa2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIGFjY2VzcyBieSB0aGUgdGFnIGtleXMgdGhhdCBhcmUgcGFzc2VkIGluIHRoZSByZXF1ZXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfY29uZGl0aW9uLWtleXMuaHRtbCNjb25kaXRpb24ta2V5cy10YWdrZXlzXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9DcmVhdGVUYWJsZSgpXG4gICAqIC0gLnRvQ3JlYXRlVGFibGVCdWNrZXQoKVxuICAgKiAtIC50b1RhZ1Jlc291cmNlKClcbiAgICogLSAudG9VbnRhZ1Jlc291cmNlKClcbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZShzKSB0byBjaGVja1xuICAgKiBAcGFyYW0gb3BlcmF0b3IgV29ya3Mgd2l0aCBbc3RyaW5nIG9wZXJhdG9yc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19jb25kaXRpb25fb3BlcmF0b3JzLmh0bWwjQ29uZGl0aW9uc19TdHJpbmcpLiAqKkRlZmF1bHQ6KiogYFN0cmluZ0xpa2VgXG4gICAqL1xuICBwdWJsaWMgaWZBd3NUYWdLZXlzKHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSwgb3BlcmF0b3I/OiBPcGVyYXRvciB8IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmlmKGBhd3M6VGFnS2V5c2AsIHZhbHVlLCBvcGVyYXRvciA/PyAnU3RyaW5nTGlrZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYWNjZXNzIGJ5IHRoZSBBV1MgS01TIGtleSBBUk4gZm9yIHRoZSBrZXkgdXNlZCB0byBlbmNyeXB0IGEgdGFibGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC91c2VyZ3VpZGUvczMtdGFibGVzLXNldHRpbmctdXAuaHRtbHMzLXRhYmxlcy1zZXR0aW5nLXVwLmh0bWxcbiAgICpcbiAgICogQXBwbGllcyB0byBhY3Rpb25zOlxuICAgKiAtIC50b0NyZWF0ZVRhYmxlKClcbiAgICogLSAudG9DcmVhdGVUYWJsZUJ1Y2tldCgpXG4gICAqIC0gLnRvUHV0VGFibGVCdWNrZXRFbmNyeXB0aW9uKClcbiAgICogLSAudG9QdXRUYWJsZUVuY3J5cHRpb24oKVxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlKHMpIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBvcGVyYXRvciBXb3JrcyB3aXRoIFthcm4gb3BlcmF0b3JzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbl9vcGVyYXRvcnMuaHRtbCNDb25kaXRpb25zX0FSTikuICoqRGVmYXVsdDoqKiBgQXJuTGlrZWBcbiAgICovXG4gIHB1YmxpYyBpZktNU0tleUFybih2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pZihgS01TS2V5QXJuYCwgdmFsdWUsIG9wZXJhdG9yID8/ICdBcm5MaWtlJyk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgdGhlIHNlcnZlci1zaWRlIGVuY3J5cHRpb24gYWxnb3JpdGhtIHVzZWQgdG8gZW5jcnlwdCBhIHRhYmxlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25TMy9sYXRlc3QvdXNlcmd1aWRlL3MzLXRhYmxlcy1zZXR0aW5nLXVwLmh0bWxzMy10YWJsZXMtc2V0dGluZy11cC5odG1sXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9DcmVhdGVUYWJsZSgpXG4gICAqIC0gLnRvQ3JlYXRlVGFibGVCdWNrZXQoKVxuICAgKiAtIC50b1B1dFRhYmxlQnVja2V0RW5jcnlwdGlvbigpXG4gICAqIC0gLnRvUHV0VGFibGVFbmNyeXB0aW9uKClcbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZShzKSB0byBjaGVja1xuICAgKiBAcGFyYW0gb3BlcmF0b3IgV29ya3Mgd2l0aCBbc3RyaW5nIG9wZXJhdG9yc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19jb25kaXRpb25fb3BlcmF0b3JzLmh0bWwjQ29uZGl0aW9uc19TdHJpbmcpLiAqKkRlZmF1bHQ6KiogYFN0cmluZ0xpa2VgXG4gICAqL1xuICBwdWJsaWMgaWZTU0VBbGdvcml0aG0odmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdLCBvcGVyYXRvcj86IE9wZXJhdG9yIHwgc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaWYoYFNTRUFsZ29yaXRobWAsIHZhbHVlLCBvcGVyYXRvciA/PyAnU3RyaW5nTGlrZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYWNjZXNzIGJ5IHRoZSBzdG9yYWdlIGNsYXNzIHRoYXQgY2FuIGJlIHNldCBvbiB0YWJsZXMgdW5kZXIgYSB0YWJsZSBidWNrZXRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC91c2VyZ3VpZGUvczMtdGFibGVzLXNldHRpbmctdXAuaHRtbHMzLXRhYmxlcy1zZXR0aW5nLXVwLmh0bWxcbiAgICpcbiAgICogQXBwbGllcyB0byBhY3Rpb25zOlxuICAgKiAtIC50b1B1dFRhYmxlQnVja2V0U3RvcmFnZUNsYXNzKClcbiAgICogLSAudG9QdXRUYWJsZVN0b3JhZ2VDbGFzcygpXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW3N0cmluZyBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfU3RyaW5nKS4gKipEZWZhdWx0OioqIGBTdHJpbmdMaWtlYFxuICAgKi9cbiAgcHVibGljIGlmU3RvcmFnZUNsYXNzKHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSwgb3BlcmF0b3I/OiBPcGVyYXRvciB8IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmlmKGBTdG9yYWdlQ2xhc3NgLCB2YWx1ZSwgb3BlcmF0b3IgPz8gJ1N0cmluZ0xpa2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIGFjY2VzcyBieSB0aGUgdGFncyBhc3NvY2lhdGVkIHdpdGggdGhlIHRhYmxlIGJ1Y2tldFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L3VzZXJndWlkZS9zMy10YWJsZXMtc2V0dGluZy11cC5odG1sczMtdGFibGVzLXNldHRpbmctdXAuaHRtbFxuICAgKlxuICAgKiBBcHBsaWVzIHRvIGFjdGlvbnM6XG4gICAqIC0gLnRvQ3JlYXRlTmFtZXNwYWNlKClcbiAgICogLSAudG9DcmVhdGVUYWJsZSgpXG4gICAqIC0gLnRvQ3JlYXRlVGFibGVCdWNrZXQoKVxuICAgKiAtIC50b0RlbGV0ZU5hbWVzcGFjZSgpXG4gICAqIC0gLnRvRGVsZXRlVGFibGUoKVxuICAgKiAtIC50b0RlbGV0ZVRhYmxlQnVja2V0KClcbiAgICogLSAudG9EZWxldGVUYWJsZUJ1Y2tldEVuY3J5cHRpb24oKVxuICAgKiAtIC50b0RlbGV0ZVRhYmxlQnVja2V0TWV0cmljc0NvbmZpZ3VyYXRpb24oKVxuICAgKiAtIC50b0RlbGV0ZVRhYmxlQnVja2V0UG9saWN5KClcbiAgICogLSAudG9EZWxldGVUYWJsZUJ1Y2tldFJlcGxpY2F0aW9uKClcbiAgICogLSAudG9EZWxldGVUYWJsZVBvbGljeSgpXG4gICAqIC0gLnRvRGVsZXRlVGFibGVSZXBsaWNhdGlvbigpXG4gICAqIC0gLnRvR2V0TmFtZXNwYWNlKClcbiAgICogLSAudG9HZXRUYWJsZSgpXG4gICAqIC0gLnRvR2V0VGFibGVCdWNrZXQoKVxuICAgKiAtIC50b0dldFRhYmxlQnVja2V0RW5jcnlwdGlvbigpXG4gICAqIC0gLnRvR2V0VGFibGVCdWNrZXRNYWludGVuYW5jZUNvbmZpZ3VyYXRpb24oKVxuICAgKiAtIC50b0dldFRhYmxlQnVja2V0TWV0cmljc0NvbmZpZ3VyYXRpb24oKVxuICAgKiAtIC50b0dldFRhYmxlQnVja2V0UG9saWN5KClcbiAgICogLSAudG9HZXRUYWJsZUJ1Y2tldFJlcGxpY2F0aW9uKClcbiAgICogLSAudG9HZXRUYWJsZUJ1Y2tldFN0b3JhZ2VDbGFzcygpXG4gICAqIC0gLnRvR2V0VGFibGVFbmNyeXB0aW9uKClcbiAgICogLSAudG9HZXRUYWJsZU1haW50ZW5hbmNlQ29uZmlndXJhdGlvbigpXG4gICAqIC0gLnRvR2V0VGFibGVNYWludGVuYW5jZUpvYlN0YXR1cygpXG4gICAqIC0gLnRvR2V0VGFibGVNZXRhZGF0YUxvY2F0aW9uKClcbiAgICogLSAudG9HZXRUYWJsZVBvbGljeSgpXG4gICAqIC0gLnRvR2V0VGFibGVSZWNvcmRFeHBpcmF0aW9uQ29uZmlndXJhdGlvbigpXG4gICAqIC0gLnRvR2V0VGFibGVSZWNvcmRFeHBpcmF0aW9uSm9iU3RhdHVzKClcbiAgICogLSAudG9HZXRUYWJsZVJlcGxpY2F0aW9uKClcbiAgICogLSAudG9HZXRUYWJsZVJlcGxpY2F0aW9uU3RhdHVzKClcbiAgICogLSAudG9HZXRUYWJsZVN0b3JhZ2VDbGFzcygpXG4gICAqIC0gLnRvTGlzdE5hbWVzcGFjZXMoKVxuICAgKiAtIC50b0xpc3RUYWJsZXMoKVxuICAgKiAtIC50b0xpc3RUYWdzRm9yUmVzb3VyY2UoKVxuICAgKiAtIC50b1B1dFRhYmxlQnVja2V0RW5jcnlwdGlvbigpXG4gICAqIC0gLnRvUHV0VGFibGVCdWNrZXRNYWludGVuYW5jZUNvbmZpZ3VyYXRpb24oKVxuICAgKiAtIC50b1B1dFRhYmxlQnVja2V0TWV0cmljc0NvbmZpZ3VyYXRpb24oKVxuICAgKiAtIC50b1B1dFRhYmxlQnVja2V0UG9saWN5KClcbiAgICogLSAudG9QdXRUYWJsZUJ1Y2tldFJlcGxpY2F0aW9uKClcbiAgICogLSAudG9QdXRUYWJsZUJ1Y2tldFN0b3JhZ2VDbGFzcygpXG4gICAqIC0gLnRvUHV0VGFibGVNYWludGVuYW5jZUNvbmZpZ3VyYXRpb24oKVxuICAgKiAtIC50b1B1dFRhYmxlUG9saWN5KClcbiAgICogLSAudG9QdXRUYWJsZVJlY29yZEV4cGlyYXRpb25Db25maWd1cmF0aW9uKClcbiAgICogLSAudG9QdXRUYWJsZVJlcGxpY2F0aW9uKClcbiAgICogLSAudG9QdXRUYWJsZVN0b3JhZ2VDbGFzcygpXG4gICAqIC0gLnRvUmVuYW1lVGFibGUoKVxuICAgKiAtIC50b1RhZ1Jlc291cmNlKClcbiAgICogLSAudG9VbnRhZ1Jlc291cmNlKClcbiAgICogLSAudG9VcGRhdGVUYWJsZU1ldGFkYXRhTG9jYXRpb24oKVxuICAgKiAtIC50b0dldFRhYmxlRGF0YSgpXG4gICAqIC0gLnRvUHV0VGFibGVEYXRhKClcbiAgICogLSAudG9QdXRUYWJsZUVuY3J5cHRpb24oKVxuICAgKlxuICAgKiBBcHBsaWVzIHRvIHJlc291cmNlIHR5cGVzOlxuICAgKiAtIFRhYmxlXG4gICAqIC0gVGFibGVCdWNrZXRcbiAgICpcbiAgICogQHBhcmFtIHRhZ0tleSBUaGUgdGFnIGtleSB0byBjaGVja1xuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlKHMpIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBvcGVyYXRvciBXb3JrcyB3aXRoIFtzdHJpbmcgb3BlcmF0b3JzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbl9vcGVyYXRvcnMuaHRtbCNDb25kaXRpb25zX1N0cmluZykuICoqRGVmYXVsdDoqKiBgU3RyaW5nTGlrZWBcbiAgICovXG4gIHB1YmxpYyBpZlRhYmxlQnVja2V0VGFnKHRhZ0tleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pZihgVGFibGVCdWNrZXRUYWcvJHsgdGFnS2V5IH1gLCB2YWx1ZSwgb3BlcmF0b3IgPz8gJ1N0cmluZ0xpa2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIGFjY2VzcyBieSB0aGUgbmFtZXNwYWNlcyBjcmVhdGVkIGluIHRoZSB0YWJsZSBidWNrZXRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC91c2VyZ3VpZGUvczMtdGFibGVzLXNldHRpbmctdXAuaHRtbHMzLXRhYmxlcy1zZXR0aW5nLXVwLmh0bWxcbiAgICpcbiAgICogQXBwbGllcyB0byBhY3Rpb25zOlxuICAgKiAtIC50b0NyZWF0ZVRhYmxlKClcbiAgICogLSAudG9EZWxldGVOYW1lc3BhY2UoKVxuICAgKiAtIC50b0RlbGV0ZVRhYmxlKClcbiAgICogLSAudG9EZWxldGVUYWJsZVBvbGljeSgpXG4gICAqIC0gLnRvRGVsZXRlVGFibGVSZXBsaWNhdGlvbigpXG4gICAqIC0gLnRvR2V0TmFtZXNwYWNlKClcbiAgICogLSAudG9HZXRUYWJsZSgpXG4gICAqIC0gLnRvR2V0VGFibGVFbmNyeXB0aW9uKClcbiAgICogLSAudG9HZXRUYWJsZU1haW50ZW5hbmNlQ29uZmlndXJhdGlvbigpXG4gICAqIC0gLnRvR2V0VGFibGVNYWludGVuYW5jZUpvYlN0YXR1cygpXG4gICAqIC0gLnRvR2V0VGFibGVNZXRhZGF0YUxvY2F0aW9uKClcbiAgICogLSAudG9HZXRUYWJsZVBvbGljeSgpXG4gICAqIC0gLnRvR2V0VGFibGVSZWNvcmRFeHBpcmF0aW9uQ29uZmlndXJhdGlvbigpXG4gICAqIC0gLnRvR2V0VGFibGVSZWNvcmRFeHBpcmF0aW9uSm9iU3RhdHVzKClcbiAgICogLSAudG9HZXRUYWJsZVJlcGxpY2F0aW9uKClcbiAgICogLSAudG9HZXRUYWJsZVJlcGxpY2F0aW9uU3RhdHVzKClcbiAgICogLSAudG9HZXRUYWJsZVN0b3JhZ2VDbGFzcygpXG4gICAqIC0gLnRvTGlzdFRhYmxlcygpXG4gICAqIC0gLnRvTGlzdFRhZ3NGb3JSZXNvdXJjZSgpXG4gICAqIC0gLnRvUHV0VGFibGVNYWludGVuYW5jZUNvbmZpZ3VyYXRpb24oKVxuICAgKiAtIC50b1B1dFRhYmxlUG9saWN5KClcbiAgICogLSAudG9QdXRUYWJsZVJlY29yZEV4cGlyYXRpb25Db25maWd1cmF0aW9uKClcbiAgICogLSAudG9QdXRUYWJsZVJlcGxpY2F0aW9uKClcbiAgICogLSAudG9QdXRUYWJsZVN0b3JhZ2VDbGFzcygpXG4gICAqIC0gLnRvUmVuYW1lVGFibGUoKVxuICAgKiAtIC50b1RhZ1Jlc291cmNlKClcbiAgICogLSAudG9VbnRhZ1Jlc291cmNlKClcbiAgICogLSAudG9VcGRhdGVUYWJsZU1ldGFkYXRhTG9jYXRpb24oKVxuICAgKiAtIC50b0dldFRhYmxlRGF0YSgpXG4gICAqIC0gLnRvUHV0VGFibGVEYXRhKClcbiAgICogLSAudG9QdXRUYWJsZUVuY3J5cHRpb24oKVxuICAgKlxuICAgKiBBcHBsaWVzIHRvIHJlc291cmNlIHR5cGVzOlxuICAgKiAtIFRhYmxlXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW3N0cmluZyBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfU3RyaW5nKS4gKipEZWZhdWx0OioqIGBTdHJpbmdMaWtlYFxuICAgKi9cbiAgcHVibGljIGlmTmFtZXNwYWNlKHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSwgb3BlcmF0b3I/OiBPcGVyYXRvciB8IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmlmKGBuYW1lc3BhY2VgLCB2YWx1ZSwgb3BlcmF0b3IgPz8gJ1N0cmluZ0xpa2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIGFjY2VzcyBieSB0aGUgbmFtZSBvZiB0aGUgdGFibGVzIGluIHRoZSB0YWJsZSBidWNrZXRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC91c2VyZ3VpZGUvczMtdGFibGVzLXNldHRpbmctdXAuaHRtbHMzLXRhYmxlcy1zZXR0aW5nLXVwLmh0bWxcbiAgICpcbiAgICogQXBwbGllcyB0byBhY3Rpb25zOlxuICAgKiAtIC50b0RlbGV0ZVRhYmxlKClcbiAgICogLSAudG9EZWxldGVUYWJsZVBvbGljeSgpXG4gICAqIC0gLnRvRGVsZXRlVGFibGVSZXBsaWNhdGlvbigpXG4gICAqIC0gLnRvR2V0VGFibGUoKVxuICAgKiAtIC50b0dldFRhYmxlRW5jcnlwdGlvbigpXG4gICAqIC0gLnRvR2V0VGFibGVNYWludGVuYW5jZUNvbmZpZ3VyYXRpb24oKVxuICAgKiAtIC50b0dldFRhYmxlTWFpbnRlbmFuY2VKb2JTdGF0dXMoKVxuICAgKiAtIC50b0dldFRhYmxlTWV0YWRhdGFMb2NhdGlvbigpXG4gICAqIC0gLnRvR2V0VGFibGVQb2xpY3koKVxuICAgKiAtIC50b0dldFRhYmxlUmVjb3JkRXhwaXJhdGlvbkNvbmZpZ3VyYXRpb24oKVxuICAgKiAtIC50b0dldFRhYmxlUmVjb3JkRXhwaXJhdGlvbkpvYlN0YXR1cygpXG4gICAqIC0gLnRvR2V0VGFibGVSZXBsaWNhdGlvbigpXG4gICAqIC0gLnRvR2V0VGFibGVSZXBsaWNhdGlvblN0YXR1cygpXG4gICAqIC0gLnRvR2V0VGFibGVTdG9yYWdlQ2xhc3MoKVxuICAgKiAtIC50b0xpc3RUYWdzRm9yUmVzb3VyY2UoKVxuICAgKiAtIC50b1B1dFRhYmxlTWFpbnRlbmFuY2VDb25maWd1cmF0aW9uKClcbiAgICogLSAudG9QdXRUYWJsZVBvbGljeSgpXG4gICAqIC0gLnRvUHV0VGFibGVSZWNvcmRFeHBpcmF0aW9uQ29uZmlndXJhdGlvbigpXG4gICAqIC0gLnRvUHV0VGFibGVSZXBsaWNhdGlvbigpXG4gICAqIC0gLnRvUHV0VGFibGVTdG9yYWdlQ2xhc3MoKVxuICAgKiAtIC50b1JlbmFtZVRhYmxlKClcbiAgICogLSAudG9UYWdSZXNvdXJjZSgpXG4gICAqIC0gLnRvVW50YWdSZXNvdXJjZSgpXG4gICAqIC0gLnRvVXBkYXRlVGFibGVNZXRhZGF0YUxvY2F0aW9uKClcbiAgICogLSAudG9HZXRUYWJsZURhdGEoKVxuICAgKiAtIC50b1B1dFRhYmxlRGF0YSgpXG4gICAqIC0gLnRvUHV0VGFibGVFbmNyeXB0aW9uKClcbiAgICpcbiAgICogQXBwbGllcyB0byByZXNvdXJjZSB0eXBlczpcbiAgICogLSBUYWJsZVxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlKHMpIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBvcGVyYXRvciBXb3JrcyB3aXRoIFtzdHJpbmcgb3BlcmF0b3JzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbl9vcGVyYXRvcnMuaHRtbCNDb25kaXRpb25zX1N0cmluZykuICoqRGVmYXVsdDoqKiBgU3RyaW5nTGlrZWBcbiAgICovXG4gIHB1YmxpYyBpZlRhYmxlTmFtZSh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pZihgdGFibGVOYW1lYCwgdmFsdWUsIG9wZXJhdG9yID8/ICdTdHJpbmdMaWtlJyk7XG4gIH1cblxuICAvKipcbiAgICogU3RhdGVtZW50IHByb3ZpZGVyIGZvciBzZXJ2aWNlIFtzM3RhYmxlc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3NlcnZpY2UtYXV0aG9yaXphdGlvbi9sYXRlc3QvcmVmZXJlbmNlL2xpc3RfczN0YWJsZXMuaHRtbCkuXG4gICAqXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihwcm9wcz86IGlhbS5Qb2xpY3lTdGF0ZW1lbnRQcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgfVxufVxuIl19