cdk-iam-floyd
Version:
AWS IAM policy statement generator with fluent interface for AWS CDK
654 lines • 73.6 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.AwsMarketplaceCatalog = void 0;
const shared_1 = require("../../shared");
/**
* Statement provider for service [aws-marketplace-catalog](https://docs.aws.amazon.com/service-authorization/latest/reference/list_marketplace-catalog.html).
*
* @param sid [SID](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_sid.html) of the statement
*/
class AwsMarketplaceCatalog extends shared_1.PolicyStatement {
/**
* Grants permission to cancel a running change set
*
* Access Level: Write
*
* https://docs.aws.amazon.com/marketplace-catalog/latest/api-reference/API_CancelChangeSet.html
*/
toCancelChangeSet() {
return this.to('CancelChangeSet');
}
/**
* Grants permission to create a new verification evidence resource for BusinessVerification
*
* Access Level: Write
*
* https://docs.aws.amazon.com/marketplace/latest/APIReference/compliance-api-access-control.html
*/
toCreateVerificationEvidence() {
return this.to('CreateVerificationEvidence');
}
/**
* Grants permission to delete the resource policy of an existing entity
*
* Access Level: Permissions management, Write
*
* https://docs.aws.amazon.com/marketplace-catalog/latest/api-reference/API_DeleteResourcePolicy.html
*/
toDeleteResourcePolicy() {
return this.to('DeleteResourcePolicy');
}
/**
* Grants permission to return the details of an existing assessment
*
* Access Level: Read
*
* https://docs.aws.amazon.com/marketplace-catalog/latest/api-reference/API_DescribeAssessment.html
*/
toDescribeAssessment() {
return this.to('DescribeAssessment');
}
/**
* Grants permission to return the details of an existing change set
*
* Access Level: Read
*
* https://docs.aws.amazon.com/marketplace-catalog/latest/api-reference/API_DescribeChangeSet.html
*/
toDescribeChangeSet() {
return this.to('DescribeChangeSet');
}
/**
* Grants permission to return the details of an existing entity
*
* Access Level: Read
*
* https://docs.aws.amazon.com/marketplace-catalog/latest/api-reference/API_DescribeEntity.html
*/
toDescribeEntity() {
return this.to('DescribeEntity');
}
/**
* Grants permission to retrieve details of an existing invoice submission task
*
* Access Level: Read
*
* https://docs.aws.amazon.com/marketplace/latest/APIReference/compliance-api-access-control.html
*/
toGetInvoiceSubmissionTask() {
return this.to('GetInvoiceSubmissionTask');
}
/**
* Grants permission to retrieve details of a specific tax invoice issued by AWS on behalf of a seller
*
* Access Level: Read
*
* https://docs.aws.amazon.com/marketplace/latest/APIReference/compliance-api-access-control.html
*/
toGetIssuedTaxInvoice() {
return this.to('GetIssuedTaxInvoice');
}
/**
* Grants permission to get the resource policy of an existing entity
*
* Access Level: Read
*
* https://docs.aws.amazon.com/marketplace-catalog/latest/api-reference/API_GetResourcePolicy.html
*/
toGetResourcePolicy() {
return this.to('GetResourcePolicy');
}
/**
* Grants permission to retrieve details of a tax compliance profile including artifacts with download URLs
*
* Access Level: Read
*
* https://docs.aws.amazon.com/marketplace/latest/APIReference/compliance-api-access-control.html
*/
toGetTaxComplianceProfile() {
return this.to('GetTaxComplianceProfile');
}
/**
* Grants permission to retrieve the detailed status of a specific verification process, including PSP validation results
*
* Access Level: Read
*
* Possible conditions:
* - .ifVerificationType()
*
* https://docs.aws.amazon.com/marketplace/latest/APIReference/compliance-api-access-control.html
*/
toGetVerification() {
return this.to('GetVerification');
}
/**
* Grants permission to retrieve the complete content of a specific verification evidence resource
*
* Access Level: Read
*
* https://docs.aws.amazon.com/marketplace/latest/APIReference/compliance-api-access-control.html
*/
toGetVerificationEvidence() {
return this.to('GetVerificationEvidence');
}
/**
* Grants permission to list existing assessments
*
* Access Level: List
*
* https://docs.aws.amazon.com/marketplace-catalog/latest/api-reference/API_ListAssessments.html
*/
toListAssessments() {
return this.to('ListAssessments');
}
/**
* Grants permission to list existing change sets
*
* Access Level: List
*
* https://docs.aws.amazon.com/marketplace-catalog/latest/api-reference/API_ListChangeSets.html
*/
toListChangeSets() {
return this.to('ListChangeSets');
}
/**
* Grants permission to list existing entities
*
* Access Level: List
*
* https://docs.aws.amazon.com/marketplace-catalog/latest/api-reference/API_ListEntities.html
*/
toListEntities() {
return this.to('ListEntities');
}
/**
* Grants permission to list existing invoice submission tasks
*
* Access Level: List
*
* https://docs.aws.amazon.com/marketplace/latest/APIReference/compliance-api-access-control.html
*/
toListInvoiceSubmissionTasks() {
return this.to('ListInvoiceSubmissionTasks');
}
/**
* Grants permission to list tax invoices issued by AWS on behalf of a seller
*
* Access Level: List
*
* https://docs.aws.amazon.com/marketplace/latest/APIReference/compliance-api-access-control.html
*/
toListIssuedTaxInvoices() {
return this.to('ListIssuedTaxInvoices');
}
/**
* Grants permission to list payables of the specified payable provenance
*
* Access Level: List
*
* https://docs.aws.amazon.com/marketplace/latest/APIReference/compliance-api-access-control.html
*/
toListPayables() {
return this.to('ListPayables');
}
/**
* Grants permission to list tags on an existing entity, change set, invoice submission task, issued tax invoice, VerificationEvidence, TaxComplianceProfile, or TaxComplianceProfileChangeTask
*
* Access Level: Read
*
* https://docs.aws.amazon.com/marketplace-catalog/latest/api-reference/API_ListTagsForResource.html
*/
toListTagsForResource() {
return this.to('ListTagsForResource');
}
/**
* Grants permission to list tax compliance profile change tasks with optional filters
*
* Access Level: List
*
* https://docs.aws.amazon.com/marketplace/latest/APIReference/compliance-api-access-control.html
*/
toListTaxComplianceProfileChangeTasks() {
return this.to('ListTaxComplianceProfileChangeTasks');
}
/**
* Grants permission to list tax compliance profiles with optional filters
*
* Access Level: List
*
* https://docs.aws.amazon.com/marketplace/latest/APIReference/compliance-api-access-control.html
*/
toListTaxComplianceProfiles() {
return this.to('ListTaxComplianceProfiles');
}
/**
* Grants permission to list verification evidence resources with summary metadata
*
* Access Level: List
*
* https://docs.aws.amazon.com/marketplace/latest/APIReference/compliance-api-access-control.html
*/
toListVerificationEvidence() {
return this.to('ListVerificationEvidence');
}
/**
* Grants permission to list all verification statuses across jurisdictions and verification types
*
* Access Level: List
*
* Possible conditions:
* - .ifVerificationType()
*
* https://docs.aws.amazon.com/marketplace/latest/APIReference/compliance-api-access-control.html
*/
toListVerifications() {
return this.to('ListVerifications');
}
/**
* Grants permission to attach a resource policy to an existing entity
*
* Access Level: Permissions management, Write
*
* https://docs.aws.amazon.com/marketplace-catalog/latest/api-reference/API_PutResourcePolicy.html
*/
toPutResourcePolicy() {
return this.to('PutResourcePolicy');
}
/**
* Grants permission to request a new change set (Note: resource-level permissions for this action and condition context keys for this action are only supported when used with Catalog API and are not supported when used with AWS Marketplace Management Portal)
*
* Access Level: Write
*
* https://docs.aws.amazon.com/marketplace-catalog/latest/api-reference/API_StartChangeSet.html
*/
toStartChangeSet() {
return this.to('StartChangeSet');
}
/**
* Grants permission to initiate tasks that submit invoices for processing in AWS Marketplace
*
* Access Level: Write
*
* https://docs.aws.amazon.com/marketplace/latest/APIReference/compliance-api-access-control.html
*/
toStartInvoiceSubmissionTask() {
return this.to('StartInvoiceSubmissionTask');
}
/**
* Grants permission to initiate asynchronous processing of a tax compliance profile create or update with artifact validation
*
* Access Level: Write
*
* https://docs.aws.amazon.com/marketplace/latest/APIReference/compliance-api-access-control.html
*/
toStartTaxComplianceProfileChangeTask() {
return this.to('StartTaxComplianceProfileChangeTask');
}
/**
* Grants permission to submit verification evidence to a Payment Service Provider and enable data sharing for a specified jurisdiction
*
* Access Level: Write
*
* https://docs.aws.amazon.com/marketplace/latest/APIReference/compliance-api-access-control.html
*/
toStartVerification() {
return this.to('StartVerification');
}
/**
* Grants permission to add new tags to a resource. Supported resources: Entity, ChangeSet, InvoiceSubmissionTask, IssuedTaxInvoice, VerificationEvidence, TaxComplianceProfile, and TaxComplianceProfileChangeTask
*
* Access Level: Tagging, Write
*
* https://docs.aws.amazon.com/marketplace-catalog/latest/api-reference/API_TagResource.html
*/
toTagResource() {
return this.to('TagResource');
}
/**
* Grants permission to remove tags from a resource. Supported resources: Entity, ChangeSet, InvoiceSubmissionTask, IssuedTaxInvoice, VerificationEvidence, TaxComplianceProfile, and TaxComplianceProfileChangeTask
*
* Access Level: Tagging, Write
*
* https://docs.aws.amazon.com/marketplace-catalog/latest/api-reference/API_UntagResource.html
*/
toUntagResource() {
return this.to('UntagResource');
}
/**
* Grants permission to update an existing verification evidence resource using full replacement semantics
*
* Access Level: Write
*
* https://docs.aws.amazon.com/marketplace/latest/APIReference/compliance-api-access-control.html
*/
toUpdateVerificationEvidence() {
return this.to('UpdateVerificationEvidence');
}
/**
* Adds a resource of type Assessment to the statement
*
* https://docs.aws.amazon.com/marketplace-catalog/latest/api-reference/API_DescribeAssessment.html#API_DescribeAssessment_ResponseSyntax
*
* @param catalog - Identifier for the catalog.
* @param resourceId - Identifier for the resourceId.
* @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.
*/
onAssessment(catalog, resourceId, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:aws-marketplace:${region ?? this.defaultRegion}::${catalog}/Assessment/${resourceId}`);
}
/**
* Adds a resource of type ChangeSet to the statement
*
* https://docs.aws.amazon.com/marketplace-catalog/latest/api-reference/API_StartChangeSet.html#API_StartChangeSet_ResponseSyntax
*
* @param catalog - Identifier for the catalog.
* @param resourceId - Identifier for the resourceId.
* @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()
* - .ifCatalogChangeType()
*/
onChangeSet(catalog, resourceId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:aws-marketplace:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:${catalog}/ChangeSet/${resourceId}`);
}
/**
* Adds a resource of type Entity to the statement
*
* https://docs.aws.amazon.com/marketplace-catalog/latest/api-reference/API_DescribeEntity.html#API_DescribeEntity_ResponseSyntax
*
* @param catalog - Identifier for the catalog.
* @param entityType - Identifier for the entityType.
* @param resourceId - Identifier for the resourceId.
* @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()
* - .ifCatalogChangeType()
*/
onEntity(catalog, entityType, resourceId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:aws-marketplace:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:${catalog}/${entityType}/${resourceId}`);
}
/**
* Adds a resource of type InvoiceSubmissionTask to the statement
*
* https://docs.aws.amazon.com/marketplace/latest/APIReference/compliance-api-access-control.html
*
* @param catalog - Identifier for the catalog.
* @param resourceId - Identifier for the resourceId.
* @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()
*/
onInvoiceSubmissionTask(catalog, resourceId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:aws-marketplace:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:catalog/${catalog}/invoice-submission-task/${resourceId}`);
}
/**
* Adds a resource of type IssuedTaxInvoice to the statement
*
* https://docs.aws.amazon.com/marketplace/latest/APIReference/compliance-api-access-control.html
*
* @param catalog - Identifier for the catalog.
* @param resourceId - Identifier for the resourceId.
* @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()
*/
onIssuedTaxInvoice(catalog, resourceId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:aws-marketplace:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:catalog/${catalog}/issued-tax-invoice/${resourceId}`);
}
/**
* Adds a resource of type TaxComplianceProfile to the statement
*
* https://docs.aws.amazon.com/marketplace/latest/APIReference/compliance-api-access-control.html
*
* @param resourceId - Identifier for the resourceId.
* @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()
*/
onTaxComplianceProfile(resourceId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:aws-marketplace:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:tax-compliance-profile/${resourceId}`);
}
/**
* Adds a resource of type TaxComplianceProfileChangeTask to the statement
*
* https://docs.aws.amazon.com/marketplace/latest/APIReference/compliance-api-access-control.html
*
* @param resourceId - Identifier for the resourceId.
* @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()
*/
onTaxComplianceProfileChangeTask(resourceId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:aws-marketplace:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:tax-compliance-profile-change-task/${resourceId}`);
}
/**
* Adds a resource of type VerificationEvidence to the statement
*
* https://docs.aws.amazon.com/marketplace/latest/APIReference/compliance-api-access-control.html
*
* @param verificationType - Identifier for the verificationType.
* @param resourceId - Identifier for the resourceId.
* @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()
*/
onVerificationEvidence(verificationType, resourceId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:aws-marketplace:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:verification-type/${verificationType}/verification-evidence/${resourceId}`);
}
/**
* Filters access by the Intent parameter in the StartChangeSet request
*
* https://docs.aws.amazon.com/marketplace-catalog/latest/api-reference/api-access-control.html
*
* Applies to actions:
* - .toStartChangeSet()
*
* @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`
*/
ifIntent(value, operator) {
return this.if(`Intent`, value, operator ?? 'StringLike');
}
/**
* Filters access by the verification type for verification process operations (StartVerification, GetVerification, ListVerifications). Valid values: BusinessVerification
*
* https://docs.aws.amazon.com/marketplace/latest/APIReference/compliance-api-access-control.html
*
* Applies to actions:
* - .toGetVerification()
* - .toListVerifications()
* - .toStartVerification()
*
* @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`
*/
ifVerificationType(value, operator) {
return this.if(`VerificationType`, value, operator ?? 'StringLike');
}
/**
* 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:
* - .toCreateVerificationEvidence()
* - .toStartChangeSet()
* - .toStartInvoiceSubmissionTask()
* - .toStartTaxComplianceProfileChangeTask()
* - .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:
* - .toCancelChangeSet()
* - .toCreateVerificationEvidence()
* - .toDeleteResourcePolicy()
* - .toDescribeChangeSet()
* - .toDescribeEntity()
* - .toGetInvoiceSubmissionTask()
* - .toGetIssuedTaxInvoice()
* - .toGetResourcePolicy()
* - .toGetTaxComplianceProfile()
* - .toGetVerificationEvidence()
* - .toListTagsForResource()
* - .toPutResourcePolicy()
* - .toStartChangeSet()
* - .toStartInvoiceSubmissionTask()
* - .toStartTaxComplianceProfileChangeTask()
* - .toStartVerification()
* - .toTagResource()
* - .toUntagResource()
* - .toUpdateVerificationEvidence()
*
* Applies to resource types:
* - ChangeSet
* - Entity
* - InvoiceSubmissionTask
* - IssuedTaxInvoice
* - TaxComplianceProfile
* - TaxComplianceProfileChangeTask
* - VerificationEvidence
*
* @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:
* - .toCreateVerificationEvidence()
* - .toStartChangeSet()
* - .toStartInvoiceSubmissionTask()
* - .toStartTaxComplianceProfileChangeTask()
* - .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 change type in the StartChangeSet request
*
* https://docs.aws.amazon.com/marketplace-catalog/latest/api-reference/api-access-control.html
*
* Applies to actions:
* - .toCancelChangeSet()
* - .toDeleteResourcePolicy()
* - .toDescribeChangeSet()
* - .toDescribeEntity()
* - .toGetResourcePolicy()
* - .toListTagsForResource()
* - .toPutResourcePolicy()
* - .toStartChangeSet()
* - .toTagResource()
* - .toUntagResource()
*
* Applies to resource types:
* - ChangeSet
* - Entity
*
* @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`
*/
ifCatalogChangeType(value, operator) {
return this.if(`catalog:ChangeType`, value, operator ?? 'StringLike');
}
/**
* Statement provider for service [aws-marketplace-catalog](https://docs.aws.amazon.com/service-authorization/latest/reference/list_marketplace-catalog.html).
*
*/
constructor(props) {
super(props);
this.servicePrefix = 'aws-marketplace';
this.accessLevelList = {
Write: [
'CancelChangeSet',
'CreateVerificationEvidence',
'DeleteResourcePolicy',
'PutResourcePolicy',
'StartChangeSet',
'StartInvoiceSubmissionTask',
'StartTaxComplianceProfileChangeTask',
'StartVerification',
'TagResource',
'UntagResource',
'UpdateVerificationEvidence'
],
'Permissions management': [
'DeleteResourcePolicy',
'PutResourcePolicy'
],
Read: [
'DescribeAssessment',
'DescribeChangeSet',
'DescribeEntity',
'GetInvoiceSubmissionTask',
'GetIssuedTaxInvoice',
'GetResourcePolicy',
'GetTaxComplianceProfile',
'GetVerification',
'GetVerificationEvidence',
'ListTagsForResource'
],
List: [
'ListAssessments',
'ListChangeSets',
'ListEntities',
'ListInvoiceSubmissionTasks',
'ListIssuedTaxInvoices',
'ListPayables',
'ListTaxComplianceProfileChangeTasks',
'ListTaxComplianceProfiles',
'ListVerificationEvidence',
'ListVerifications'
],
Tagging: [
'TagResource',
'UntagResource'
]
};
}
}
exports.AwsMarketplaceCatalog = AwsMarketplaceCatalog;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXdzLW1hcmtldHBsYWNlLWNhdGFsb2cuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJhd3MtbWFya2V0cGxhY2UtY2F0YWxvZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSx5Q0FBeUQ7QUFHekQ7Ozs7R0FJRztBQUNILE1BQWEscUJBQXNCLFNBQVEsd0JBQWU7SUFHeEQ7Ozs7OztPQU1HO0lBQ0ksaUJBQWlCO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSw0QkFBNEI7UUFDakMsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLDRCQUE0QixDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLHNCQUFzQjtRQUMzQixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsc0JBQXNCLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksb0JBQW9CO1FBQ3pCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxtQkFBbUI7UUFDeEIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLGdCQUFnQjtRQUNyQixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksMEJBQTBCO1FBQy9CLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxxQkFBcUI7UUFDMUIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLHFCQUFxQixDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLG1CQUFt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SixpQkFBaUI7Z0JBQ2pCLGdCQUFnQjtnQkFDaEIsY0FBYztnQkFDZCw0QkFBNEI7Z0JBQzVCLHVCQUF1QjtnQkFDdkIsY0FBYztnQkFDZCxxQ0FBcUM7Z0JBQ3JDLDJCQUEyQjtnQkFDM0IsMEJBQTBCO2dCQUMxQixtQkFBbUI7YUFDcEI7WUFDRCxPQUFPLEVBQUU7Z0JBQ1AsYUFBYTtnQkFDYixlQUFlO2FBQ2hCO1NBQ0YsQ0FBQztJQW9TRixDQUFDO0NBQ0Y7QUFqckJELHNEQWlyQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBY2Nlc3NMZXZlbExpc3QgfSBmcm9tICcuLi8uLi9zaGFyZWQvYWNjZXNzLWxldmVsJztcbmltcG9ydCB7IFBvbGljeVN0YXRlbWVudCwgT3BlcmF0b3IgfSBmcm9tICcuLi8uLi9zaGFyZWQnO1xuaW1wb3J0IHsgYXdzX2lhbSBhcyBpYW0gfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcblxuLyoqXG4gKiBTdGF0ZW1lbnQgcHJvdmlkZXIgZm9yIHNlcnZpY2UgW2F3cy1tYXJrZXRwbGFjZS1jYXRhbG9nXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc2VydmljZS1hdXRob3JpemF0aW9uL2xhdGVzdC9yZWZlcmVuY2UvbGlzdF9tYXJrZXRwbGFjZS1jYXRhbG9nLmh0bWwpLlxuICpcbiAqIEBwYXJhbSBzaWQgW1NJRF0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19zaWQuaHRtbCkgb2YgdGhlIHN0YXRlbWVudFxuICovXG5leHBvcnQgY2xhc3MgQXdzTWFya2V0cGxhY2VDYXRhbG9nIGV4dGVuZHMgUG9saWN5U3RhdGVtZW50IHtcbiAgcHVibGljIHNlcnZpY2VQcmVmaXggPSAnYXdzLW1hcmtldHBsYWNlJztcblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY2FuY2VsIGEgcnVubmluZyBjaGFuZ2Ugc2V0XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL21hcmtldHBsYWNlLWNhdGFsb2cvbGF0ZXN0L2FwaS1yZWZlcmVuY2UvQVBJX0NhbmNlbENoYW5nZVNldC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DYW5jZWxDaGFuZ2VTZXQoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NhbmNlbENoYW5nZVNldCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhIG5ldyB2ZXJpZmljYXRpb24gZXZpZGVuY2UgcmVzb3VyY2UgZm9yIEJ1c2luZXNzVmVyaWZpY2F0aW9uXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL21hcmtldHBsYWNlL2xhdGVzdC9BUElSZWZlcmVuY2UvY29tcGxpYW5jZS1hcGktYWNjZXNzLWNvbnRyb2wuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlVmVyaWZpY2F0aW9uRXZpZGVuY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZVZlcmlmaWNhdGlvbkV2aWRlbmNlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIHRoZSByZXNvdXJjZSBwb2xpY3kgb2YgYW4gZXhpc3RpbmcgZW50aXR5XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUGVybWlzc2lvbnMgbWFuYWdlbWVudCwgV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL21hcmtldHBsYWNlLWNhdGFsb2cvbGF0ZXN0L2FwaS1yZWZlcmVuY2UvQVBJX0RlbGV0ZVJlc291cmNlUG9saWN5Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZVJlc291cmNlUG9saWN5KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVSZXNvdXJjZVBvbGljeScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJldHVybiB0aGUgZGV0YWlscyBvZiBhbiBleGlzdGluZyBhc3Nlc3NtZW50XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbWFya2V0cGxhY2UtY2F0YWxvZy9sYXRlc3QvYXBpLXJlZmVyZW5jZS9BUElfRGVzY3JpYmVBc3Nlc3NtZW50Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rlc2NyaWJlQXNzZXNzbWVudCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVzY3JpYmVBc3Nlc3NtZW50Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmV0dXJuIHRoZSBkZXRhaWxzIG9mIGFuIGV4aXN0aW5nIGNoYW5nZSBzZXRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9tYXJrZXRwbGFjZS1jYXRhbG9nL2xhdGVzdC9hcGktcmVmZXJlbmNlL0FQSV9EZXNjcmliZUNoYW5nZVNldC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZXNjcmliZUNoYW5nZVNldCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVzY3JpYmVDaGFuZ2VTZXQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXR1cm4gdGhlIGRldGFpbHMgb2YgYW4gZXhpc3RpbmcgZW50aXR5XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbWFya2V0cGxhY2UtY2F0YWxvZy9sYXRlc3QvYXBpLXJlZmVyZW5jZS9BUElfRGVzY3JpYmVFbnRpdHkuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVzY3JpYmVFbnRpdHkoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rlc2NyaWJlRW50aXR5Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmV0cmlldmUgZGV0YWlscyBvZiBhbiBleGlzdGluZyBpbnZvaWNlIHN1Ym1pc3Npb24gdGFza1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL21hcmtldHBsYWNlL2xhdGVzdC9BUElSZWZlcmVuY2UvY29tcGxpYW5jZS1hcGktYWNjZXNzLWNvbnRyb2wuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0SW52b2ljZVN1Ym1pc3Npb25UYXNrKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRJbnZvaWNlU3VibWlzc2lvblRhc2snKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXRyaWV2ZSBkZXRhaWxzIG9mIGEgc3BlY2lmaWMgdGF4IGludm9pY2UgaXNzdWVkIGJ5IEFXUyBvbiBiZWhhbGYgb2YgYSBzZWxsZXJcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9tYXJrZXRwbGFjZS9sYXRlc3QvQVBJUmVmZXJlbmNlL2NvbXBsaWFuY2UtYXBpLWFjY2Vzcy1jb250cm9sLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldElzc3VlZFRheEludm9pY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldElzc3VlZFRheEludm9pY2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgdGhlIHJlc291cmNlIHBvbGljeSBvZiBhbiBleGlzdGluZyBlbnRpdHlcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9tYXJrZXRwbGFjZS1jYXRhbG9nL2xhdGVzdC9hcGktcmVmZXJlbmNlL0FQSV9HZXRSZXNvdXJjZVBvbGljeS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRSZXNvdXJjZVBvbGljeSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0UmVzb3VyY2VQb2xpY3knKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXRyaWV2ZSBkZXRhaWxzIG9mIGEgdGF4IGNvbXBsaWFuY2UgcHJvZmlsZSBpbmNsdWRpbmcgYXJ0aWZhY3RzIHdpdGggZG93bmxvYWQgVVJMc1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL21hcmtldHBsYWNlL2xhdGVzdC9BUElSZWZlcmVuY2UvY29tcGxpYW5jZS1hcGktYWNjZXNzLWNvbnRyb2wuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0VGF4Q29tcGxpYW5jZVByb2ZpbGUoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldFRheENvbXBsaWFuY2VQcm9maWxlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmV0cmlldmUgdGhlIGRldGFpbGVkIHN0YXR1cyBvZiBhIHNwZWNpZmljIHZlcmlmaWNhdGlvbiBwcm9jZXNzLCBpbmNsdWRpbmcgUFNQIHZhbGlkYXRpb24gcmVzdWx0c1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZWZXJpZmljYXRpb25UeXBlKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL21hcmtldHBsYWNlL2xhdGVzdC9BUElSZWZlcmVuY2UvY29tcGxpYW5jZS1hcGktYWNjZXNzLWNvbnRyb2wuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0VmVyaWZpY2F0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRWZXJpZmljYXRpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXRyaWV2ZSB0aGUgY29tcGxldGUgY29udGVudCBvZiBhIHNwZWNpZmljIHZlcmlmaWNhdGlvbiBldmlkZW5jZSByZXNvdXJjZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL21hcmtldHBsYWNlL2xhdGVzdC9BUElSZWZlcmVuY2UvY29tcGxpYW5jZS1hcGktYWNjZXNzLWNvbnRyb2wuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0VmVyaWZpY2F0aW9uRXZpZGVuY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldFZlcmlmaWNhdGlvbkV2aWRlbmNlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCBleGlzdGluZyBhc3Nlc3NtZW50c1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL21hcmtldHBsYWNlLWNhdGFsb2cvbGF0ZXN0L2FwaS1yZWZlcmVuY2UvQVBJX0xpc3RBc3Nlc3NtZW50cy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0QXNzZXNzbWVudHMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RBc3Nlc3NtZW50cycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgZXhpc3RpbmcgY2hhbmdlIHNldHNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9tYXJrZXRwbGFjZS1jYXRhbG9nL2xhdGVzdC9hcGktcmVmZXJlbmNlL0FQSV9MaXN0Q2hhbmdlU2V0cy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0Q2hhbmdlU2V0cygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdENoYW5nZVNldHMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0IGV4aXN0aW5nIGVudGl0aWVzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbWFya2V0cGxhY2UtY2F0YWxvZy9sYXRlc3QvYXBpLXJlZmVyZW5jZS9BUElfTGlzdEVudGl0aWVzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RFbnRpdGllcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdEVudGl0aWVzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCBleGlzdGluZyBpbnZvaWNlIHN1Ym1pc3Npb24gdGFza3NcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9tYXJrZXRwbGFjZS9sYXRlc3QvQVBJUmVmZXJlbmNlL2NvbXBsaWFuY2UtYXBpLWFjY2Vzcy1jb250cm9sLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RJbnZvaWNlU3VibWlzc2lvblRhc2tzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0SW52b2ljZVN1Ym1pc3Npb25UYXNrcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgdGF4IGludm9pY2VzIGlzc3VlZCBieSBBV1Mgb24gYmVoYWxmIG9mIGEgc2VsbGVyXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbWFya2V0cGxhY2UvbGF0ZXN0L0FQSVJlZmVyZW5jZS9jb21wbGlhbmNlLWFwaS1hY2Nlc3MtY29udHJvbC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0SXNzdWVkVGF4SW52b2ljZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RJc3N1ZWRUYXhJbnZvaWNlcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgcGF5YWJsZXMgb2YgdGhlIHNwZWNpZmllZCBwYXlhYmxlIHByb3ZlbmFuY2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9tYXJrZXRwbGFjZS9sYXRlc3QvQVBJUmVmZXJlbmNlL2NvbXBsaWFuY2UtYXBpLWFjY2Vzcy1jb250cm9sLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RQYXlhYmxlcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdFBheWFibGVzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCB0YWdzIG9uIGFuIGV4aXN0aW5nIGVudGl0eSwgY2hhbmdlIHNldCwgaW52b2ljZSBzdWJtaXNzaW9uIHRhc2ssIGlzc3VlZCB0YXggaW52b2ljZSwgVmVyaWZpY2F0aW9uRXZpZGVuY2UsIFRheENvbXBsaWFuY2VQcm9maWxlLCBvciBUYXhDb21wbGlhbmNlUHJvZmlsZUNoYW5nZVRhc2tcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9tYXJrZXRwbGFjZS1jYXRhbG9nL2xhdGVzdC9hcGktcmVmZXJlbmNlL0FQSV9MaXN0VGFnc0ZvclJlc291cmNlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RUYWdzRm9yUmVzb3VyY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RUYWdzRm9yUmVzb3VyY2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0IHRheCBjb21wbGlhbmNlIHByb2ZpbGUgY2hhbmdlIHRhc2tzIHdpdGggb3B0aW9uYWwgZmlsdGVyc1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL21hcmtldHBsYWNlL2xhdGVzdC9BUElSZWZlcmVuY2UvY29tcGxpYW5jZS1hcGktYWNjZXNzLWNvbnRyb2wuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdFRheENvbXBsaWFuY2VQcm9maWxlQ2hhbmdlVGFza3MoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RUYXhDb21wbGlhbmNlUHJvZmlsZUNoYW5nZVRhc2tzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCB0YXggY29tcGxpYW5jZSBwcm9maWxlcyB3aXRoIG9wdGlvbmFsIGZpbHRlcnNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9tYXJrZXRwbGFjZS9sYXRlc3QvQVBJUmVmZXJlbmNlL2NvbXBsaWFuY2UtYXBpLWFjY2Vzcy1jb250cm9sLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RUYXhDb21wbGlhbmNlUHJvZmlsZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RUYXhDb21wbGlhbmNlUHJvZmlsZXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0IHZlcmlmaWNhdGlvbiBldmlkZW5jZSByZXNvdXJjZXMgd2l0aCBzdW1tYXJ5IG1ldGFkYXRhXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbWFya2V0cGxhY2UvbGF0ZXN0L0FQSVJlZmVyZW5jZS9jb21wbGlhbmNlLWFwaS1hY2Nlc3MtY29udHJvbC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0VmVyaWZpY2F0aW9uRXZpZGVuY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RWZXJpZmljYXRpb25FdmlkZW5jZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgYWxsIHZlcmlmaWNhdGlvbiBzdGF0dXNlcyBhY3Jvc3MganVyaXNkaWN0aW9ucyBhbmQgdmVyaWZpY2F0aW9uIHR5cGVzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlZlcmlmaWNhdGlvblR5cGUoKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbWFya2V0cGxhY2UvbGF0ZXN0L0FQSVJlZmVyZW5jZS9jb21wbGlhbmNlLWFwaS1hY2Nlc3MtY29udHJvbC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0VmVyaWZpY2F0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdFZlcmlmaWNhdGlvbnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBhdHRhY2ggYSByZXNvdXJjZSBwb2xpY3kgdG8gYW4gZXhpc3RpbmcgZW50aXR5XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUGVybWlzc2lvbnMgbWFuYWdlbWVudCwgV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL21hcmtldHBsYWNlLWNhdGFsb2cvbGF0ZXN0L2FwaS1yZWZlcmVuY2UvQVBJX1B1dFJlc291cmNlUG9saWN5Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1B1dFJlc291cmNlUG9saWN5KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdQdXRSZXNvdXJjZVBvbGljeScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJlcXVlc3QgYSBuZXcgY2hhbmdlIHNldCAoTm90ZTogcmVzb3VyY2UtbGV2ZWwgcGVybWlzc2lvbnMgZm9yIHRoaXMgYWN0aW9uIGFuZCBjb25kaXRpb24gY29udGV4dCBrZXlzIGZvciB0aGlzIGFjdGlvbiBhcmUgb25seSBzdXBwb3J0ZWQgd2hlbiB1c2VkIHdpdGggQ2F0YWxvZyBBUEkgYW5kIGFyZSBub3Qgc3VwcG9ydGVkIHdoZW4gdXNlZCB3aXRoIEFXUyBNYXJrZXRwbGFjZSBNYW5hZ2VtZW50IFBvcnRhbClcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbWFya2V0cGxhY2UtY2F0YWxvZy9sYXRlc3QvYXBpLXJlZmVyZW5jZS9BUElfU3RhcnRDaGFuZ2VTZXQuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvU3RhcnRDaGFuZ2VTZXQoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1N0YXJ0Q2hhbmdlU2V0Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gaW5pdGlhdGUgdGFza3MgdGhhdCBzdWJtaXQgaW52b2ljZXMgZm9yIHByb2Nlc3NpbmcgaW4gQVdTIE1hcmtldHBsYWNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL21hcmtldHBsYWNlL2xhdGVzdC9BUElSZWZlcmVuY2UvY29tcGxpYW5jZS1hcGktYWNjZXNzLWNvbnRyb2wuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvU3RhcnRJbnZvaWNlU3VibWlzc2lvblRhc2soKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1N0YXJ0SW52b2ljZVN1Ym1pc3Npb25UYXNrJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gaW5pdGlhdGUgYXN5bmNocm9ub3VzIHByb2Nlc3Npbmcgb2YgYSB0YXggY29tcGxpYW5jZSBwcm9maWxlIGNyZWF0ZSBvciB1cGRhdGUgd2l0aCBhcnRpZmFjdCB2YWxpZGF0aW9uXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL21hcmtldHBsYWNlL2xhdGVzdC9BUElSZWZlcmVuY2UvY29tcGxpYW5jZS1hcGktYWNjZXNzLWNvbnRyb2wuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvU3RhcnRUYXhDb21wbGlhbmNlUHJvZmlsZUNoYW5nZVRhc2soKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1N0YXJ0VGF4Q29tcGxpYW5jZVByb2ZpbGVDaGFuZ2VUYXNrJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gc3VibWl0IHZlcmlmaWNhdGlvbiBldmlkZW5jZSB0byBhIFBheW1lbnQgU2VydmljZSBQcm92aWRlciBhbmQgZW5hYmxlIGRhdGEgc2hhcmluZyBmb3IgYSBzcGVjaWZpZWQganVyaXNkaWN0aW9uXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL21hcmtldHBsYWNlL2xhdGVzdC9BUElSZWZlcmVuY2UvY29tcGxpYW5jZS1hcGktYWNjZXNzLWNvbnRyb2wuaHRtbFxuI