UNPKG

cdk-iam-floyd

Version:

AWS IAM policy statement generator with fluent interface for AWS CDK

833 lines 81.8 kB
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.Rtbfabric = void 0;
const shared_1 = require("../../shared");
/**
 * Statement provider for service [rtbfabric](https://docs.aws.amazon.com/service-authorization/latest/reference/list_rtbfabric.html).
 *
 * @param sid [SID](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_sid.html) of the statement
 */
class Rtbfabric extends shared_1.PolicyStatement {
    /**
     * Grants permission to accept a link invitation from another Gateway
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/rtb-fabric/latest/api/API_AcceptLink.html
     */
    toAcceptLink() {
        return this.to('AcceptLink');
    }
    /**
     * Grants permission to associate an ACM certificate with a responder gateway
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/rtb-fabric/latest/api/API_AssociateCertificate.html
     */
    toAssociateCertificate() {
        return this.to('AssociateCertificate');
    }
    /**
     * Grants permission to create an inbound external link for a responder gateway
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/rtb-fabric/latest/api/API_CreateInboundExternalLink.html
     */
    toCreateInboundExternalLink() {
        return this.to('CreateInboundExternalLink');
    }
    /**
     * Grants permission to create a new link between RTB applications
     *
     * Access Level: Write
     *
     * Possible conditions:
     * - .ifAwsRequestTag()
     * - .ifAwsTagKeys()
     *
     * https://docs.aws.amazon.com/rtb-fabric/latest/api/API_CreateLink.html
     */
    toCreateLink() {
        return this.to('CreateLink');
    }
    /**
     * Grants permission to create a routing rule for a link
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/rtb-fabric/latest/api/API_CreateLinkRoutingRule.html
     */
    toCreateLinkRoutingRule() {
        return this.to('CreateLinkRoutingRule');
    }
    /**
     * Grants permission to create an outbound external link for a requester gateway to connect to external public responder endpoints
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/rtb-fabric/latest/api/API_CreateOutboundExternalLink.html
     */
    toCreateOutboundExternalLink() {
        return this.to('CreateOutboundExternalLink');
    }
    /**
     * Grants permission to create a requester gateway
     *
     * Access Level: Write
     *
     * Possible conditions:
     * - .ifAwsRequestTag()
     * - .ifAwsTagKeys()
     *
     * https://docs.aws.amazon.com/rtb-fabric/latest/api/API_CreateRequesterGateway.html
     */
    toCreateRequesterGateway() {
        return this.to('CreateRequesterGateway');
    }
    /**
     * Grants permission to create a responder gateway
     *
     * Access Level: Write
     *
     * Possible conditions:
     * - .ifAwsRequestTag()
     * - .ifAwsTagKeys()
     *
     * https://docs.aws.amazon.com/rtb-fabric/latest/api/API_CreateResponderGateway.html
     */
    toCreateResponderGateway() {
        return this.to('CreateResponderGateway');
    }
    /**
     * Grants permission to delete an inbound external link
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/rtb-fabric/latest/api/API_DeleteInboundExternalLink.html
     */
    toDeleteInboundExternalLink() {
        return this.to('DeleteInboundExternalLink');
    }
    /**
     * Grants permission to delete a link between RTB applications
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/rtb-fabric/latest/api/API_DeleteLink.html
     */
    toDeleteLink() {
        return this.to('DeleteLink');
    }
    /**
     * Grants permission to delete a routing rule from a link
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/rtb-fabric/latest/api/API_DeleteLinkRoutingRule.html
     */
    toDeleteLinkRoutingRule() {
        return this.to('DeleteLinkRoutingRule');
    }
    /**
     * Grants permission to delete an outbound external link
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/rtb-fabric/latest/api/API_DeleteOutboundExternalLink.html
     */
    toDeleteOutboundExternalLink() {
        return this.to('DeleteOutboundExternalLink');
    }
    /**
     * Grants permission to delete a requester gateway
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/rtb-fabric/latest/api/API_DeleteRequesterGateway.html
     */
    toDeleteRequesterGateway() {
        return this.to('DeleteRequesterGateway');
    }
    /**
     * Grants permission to delete a responder gateway
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/rtb-fabric/latest/api/API_DeleteResponderGateway.html
     */
    toDeleteResponderGateway() {
        return this.to('DeleteResponderGateway');
    }
    /**
     * Grants permission to remove a certificate association from a responder gateway
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/rtb-fabric/latest/api/API_DisassociateCertificate.html
     */
    toDisassociateCertificate() {
        return this.to('DisassociateCertificate');
    }
    /**
     * Grants permission to retrieve details of a certificate association with a responder gateway
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/rtb-fabric/latest/api/API_GetCertificateAssociation.html
     */
    toGetCertificateAssociation() {
        return this.to('GetCertificateAssociation');
    }
    /**
     * Grants permission to retrieve information about an inbound external link
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/rtb-fabric/latest/api/API_GetInboundExternalLink.html
     */
    toGetInboundExternalLink() {
        return this.to('GetInboundExternalLink');
    }
    /**
     * Grants permission to retrieve information about a link between RTB applications
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/rtb-fabric/latest/api/API_GetLink.html
     */
    toGetLink() {
        return this.to('GetLink');
    }
    /**
     * Grants permission to retrieve information about a routing rule for a link
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/rtb-fabric/latest/api/API_GetLinkRoutingRule.html
     */
    toGetLinkRoutingRule() {
        return this.to('GetLinkRoutingRule');
    }
    /**
     * Grants permission to retrieve information about an outbound external link
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/rtb-fabric/latest/api/API_GetOutboundExternalLink.html
     */
    toGetOutboundExternalLink() {
        return this.to('GetOutboundExternalLink');
    }
    /**
     * Grants permission to retrieve information about a requester gateway
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/rtb-fabric/latest/api/API_GetRequesterGateway.html
     */
    toGetRequesterGateway() {
        return this.to('GetRequesterGateway');
    }
    /**
     * Grants permission to retrieve information about a responder gateway
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/rtb-fabric/latest/api/API_GetResponderGateway.html
     */
    toGetResponderGateway() {
        return this.to('GetResponderGateway');
    }
    /**
     * Grants permission to list certificate associations for a responder gateway
     *
     * Access Level: List
     *
     * https://docs.aws.amazon.com/rtb-fabric/latest/api/API_ListCertificateAssociations.html
     */
    toListCertificateAssociations() {
        return this.to('ListCertificateAssociations');
    }
    /**
     * Grants permission to list routing rules for a link
     *
     * Access Level: List
     *
     * https://docs.aws.amazon.com/rtb-fabric/latest/api/API_ListLinkRoutingRules.html
     */
    toListLinkRoutingRules() {
        return this.to('ListLinkRoutingRules');
    }
    /**
     * Grants permission to list links associated with an RTB application
     *
     * Access Level: List
     *
     * https://docs.aws.amazon.com/rtb-fabric/latest/api/API_ListLinks.html
     */
    toListLinks() {
        return this.to('ListLinks');
    }
    /**
     * Grants permission to list requester gateways with optional filtering and pagination
     *
     * Access Level: List
     *
     * https://docs.aws.amazon.com/rtb-fabric/latest/api/API_ListRequesterGateways.html
     */
    toListRequesterGateways() {
        return this.to('ListRequesterGateways');
    }
    /**
     * Grants permission to list responder gateways with optional filtering and pagination
     *
     * Access Level: List
     *
     * https://docs.aws.amazon.com/rtb-fabric/latest/api/API_ListResponderGateways.html
     */
    toListResponderGateways() {
        return this.to('ListResponderGateways');
    }
    /**
     * Grants permission to list tags for a resource
     *
     * Access Level: Read
     *
     * https://docs.aws.amazon.com/rtb-fabric/latest/api/API_ListTagsForResource.html
     */
    toListTagsForResource() {
        return this.to('ListTagsForResource');
    }
    /**
     * Grants permission to reject a link request between RTB applications
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/rtb-fabric/latest/api/API_RejectLink.html
     */
    toRejectLink() {
        return this.to('RejectLink');
    }
    /**
     * Grants permission to assign one or more tags (key-value pairs) to the specified resource
     *
     * Access Level: Tagging, Write
     *
     * https://docs.aws.amazon.com/rtb-fabric/latest/api/API_TagResource.html
     */
    toTagResource() {
        return this.to('TagResource');
    }
    /**
     * Grants permission to remove a tag or tags from a resource
     *
     * Access Level: Tagging, Write
     *
     * https://docs.aws.amazon.com/rtb-fabric/latest/api/API_UntagResource.html
     */
    toUntagResource() {
        return this.to('UntagResource');
    }
    /**
     * Grants permission to update configuration settings for an existing link
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/rtb-fabric/latest/api/API_UpdateLink.html
     */
    toUpdateLink() {
        return this.to('UpdateLink');
    }
    /**
     * Grants permission to update a link module flow
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/rtb-fabric/latest/api/API_UpdateLinkModuleFlow.html
     */
    toUpdateLinkModuleFlow() {
        return this.to('UpdateLinkModuleFlow');
    }
    /**
     * Grants permission to update a routing rule for a link
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/rtb-fabric/latest/api/API_UpdateLinkRoutingRule.html
     */
    toUpdateLinkRoutingRule() {
        return this.to('UpdateLinkRoutingRule');
    }
    /**
     * Grants permission to update a requester gateway
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/rtb-fabric/latest/api/API_UpdateRequesterGateway.html
     */
    toUpdateRequesterGateway() {
        return this.to('UpdateRequesterGateway');
    }
    /**
     * Grants permission to update a responder gateway
     *
     * Access Level: Write
     *
     * https://docs.aws.amazon.com/rtb-fabric/latest/api/API_UpdateResponderGateway.html
     */
    toUpdateResponderGateway() {
        return this.to('UpdateResponderGateway');
    }
    /**
     * Adds a resource of type InboundExternalLink to the statement
     *
     * https://docs.aws.amazon.com/rtb-fabric/latest/userguide/links.html
     *
     * @param gatewayId - Identifier for the gatewayId.
     * @param linkId - Identifier for the linkId.
     * @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()
     * - .ifInboundExternalLinkLinkId()
     * - .ifResponderGatewayGatewayId()
     */
    onInboundExternalLink(gatewayId, linkId, account, region, partition) {
        return this.on(`arn:${partition ?? this.defaultPartition}:rtbfabric:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:gateway/${gatewayId}/link/${linkId}`);
    }
    /**
     * Adds a resource of type Link to the statement
     *
     * https://docs.aws.amazon.com/rtb-fabric/latest/userguide/links.html
     *
     * @param gatewayId - Identifier for the gatewayId.
     * @param linkId - Identifier for the linkId.
     * @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()
     * - .ifLinkLinkId()
     * - .ifRequesterGatewayGatewayId()
     * - .ifResponderGatewayGatewayId()
     */
    onLink(gatewayId, linkId, account, region, partition) {
        return this.on(`arn:${partition ?? this.defaultPartition}:rtbfabric:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:gateway/${gatewayId}/link/${linkId}`);
    }
    /**
     * Adds a resource of type LinkRoutingRule to the statement
     *
     * https://docs.aws.amazon.com/rtb-fabric/latest/userguide/links.html
     *
     * @param gatewayId - Identifier for the gatewayId.
     * @param linkId - Identifier for the linkId.
     * @param ruleId - Identifier for the ruleId.
     * @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()
     * - .ifLinkLinkId()
     * - .ifLinkRoutingRuleRuleId()
     */
    onLinkRoutingRule(gatewayId, linkId, ruleId, account, region, partition) {
        return this.on(`arn:${partition ?? this.defaultPartition}:rtbfabric:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:gateway/${gatewayId}/link/${linkId}/routing-rule/${ruleId}`);
    }
    /**
     * Adds a resource of type OutboundExternalLink to the statement
     *
     * https://docs.aws.amazon.com/rtb-fabric/latest/userguide/links.html
     *
     * @param gatewayId - Identifier for the gatewayId.
     * @param linkId - Identifier for the linkId.
     * @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()
     * - .ifOutboundExternalLinkLinkId()
     * - .ifRequesterGatewayGatewayId()
     */
    onOutboundExternalLink(gatewayId, linkId, account, region, partition) {
        return this.on(`arn:${partition ?? this.defaultPartition}:rtbfabric:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:gateway/${gatewayId}/link/${linkId}`);
    }
    /**
     * Adds a resource of type RequesterGateway to the statement
     *
     * https://docs.aws.amazon.com/rtb-fabric/latest/userguide/working-with-requester-rtb-applications.html
     *
     * @param gatewayId - Identifier for the gatewayId.
     * @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()
     * - .ifRequesterGatewayGatewayId()
     */
    onRequesterGateway(gatewayId, account, region, partition) {
        return this.on(`arn:${partition ?? this.defaultPartition}:rtbfabric:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:gateway/${gatewayId}`);
    }
    /**
     * Adds a resource of type ResponderGateway to the statement
     *
     * https://docs.aws.amazon.com/rtb-fabric/latest/userguide/working-with-responder-rtb-applications.html
     *
     * @param gatewayId - Identifier for the gatewayId.
     * @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()
     * - .ifResponderGatewayGatewayId()
     */
    onResponderGateway(gatewayId, account, region, partition) {
        return this.on(`arn:${partition ?? this.defaultPartition}:rtbfabric:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:gateway/${gatewayId}`);
    }
    /**
     * Filters access by a tag key and value pair that is allowed in the request
     *
     * https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-requesttag
     *
     * Applies to actions:
     * - .toCreateInboundExternalLink()
     * - .toCreateLink()
     * - .toCreateLinkRoutingRule()
     * - .toCreateOutboundExternalLink()
     * - .toCreateRequesterGateway()
     * - .toCreateResponderGateway()
     * - .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 a tag key and value pair of a resource
     *
     * https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-resourcetag
     *
     * Applies to actions:
     * - .toAcceptLink()
     * - .toAssociateCertificate()
     * - .toCreateInboundExternalLink()
     * - .toCreateLinkRoutingRule()
     * - .toCreateOutboundExternalLink()
     * - .toDeleteInboundExternalLink()
     * - .toDeleteLink()
     * - .toDeleteLinkRoutingRule()
     * - .toDeleteOutboundExternalLink()
     * - .toDeleteRequesterGateway()
     * - .toDeleteResponderGateway()
     * - .toDisassociateCertificate()
     * - .toGetCertificateAssociation()
     * - .toGetInboundExternalLink()
     * - .toGetLink()
     * - .toGetLinkRoutingRule()
     * - .toGetOutboundExternalLink()
     * - .toGetRequesterGateway()
     * - .toGetResponderGateway()
     * - .toListCertificateAssociations()
     * - .toListLinkRoutingRules()
     * - .toListTagsForResource()
     * - .toRejectLink()
     * - .toTagResource()
     * - .toUntagResource()
     * - .toUpdateLink()
     * - .toUpdateLinkModuleFlow()
     * - .toUpdateLinkRoutingRule()
     * - .toUpdateRequesterGateway()
     * - .toUpdateResponderGateway()
     *
     * Applies to resource types:
     * - InboundExternalLink
     * - Link
     * - LinkRoutingRule
     * - OutboundExternalLink
     * - RequesterGateway
     * - ResponderGateway
     *
     * @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 a list of tag keys that are allowed in the request
     *
     * https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-tagkeys
     *
     * Applies to actions:
     * - .toCreateInboundExternalLink()
     * - .toCreateLink()
     * - .toCreateLinkRoutingRule()
     * - .toCreateOutboundExternalLink()
     * - .toCreateRequesterGateway()
     * - .toCreateResponderGateway()
     * - .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 gateway identifier supporting rtb-gw-* formats
     *
     * https://docs.aws.amazon.com/rtb-fabric/latest/userguide/security_iam_service-with-iam.html
     *
     * @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`
     */
    ifInboundExternalLinkGatewayId(value, operator) {
        return this.if(`InboundExternalLinkGatewayId`, value, operator ?? 'StringLike');
    }
    /**
     * Filters access by InboundExternalLink resource linkId identifier
     *
     * https://docs.aws.amazon.com/rtb-fabric/latest/userguide/security_iam_service-with-iam.html
     *
     * Applies to actions:
     * - .toDeleteInboundExternalLink()
     * - .toGetInboundExternalLink()
     * - .toListTagsForResource()
     * - .toTagResource()
     * - .toUntagResource()
     *
     * Applies to resource types:
     * - InboundExternalLink
     *
     * @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`
     */
    ifInboundExternalLinkLinkId(value, operator) {
        return this.if(`InboundExternalLinkLinkId`, value, operator ?? 'StringLike');
    }
    /**
     * Filters access by Link resource linkId identifier
     *
     * https://docs.aws.amazon.com/rtb-fabric/latest/userguide/security_iam_service-with-iam.html
     *
     * Applies to actions:
     * - .toAcceptLink()
     * - .toCreateLinkRoutingRule()
     * - .toDeleteLink()
     * - .toDeleteLinkRoutingRule()
     * - .toGetLink()
     * - .toGetLinkRoutingRule()
     * - .toListLinkRoutingRules()
     * - .toListTagsForResource()
     * - .toRejectLink()
     * - .toTagResource()
     * - .toUntagResource()
     * - .toUpdateLink()
     * - .toUpdateLinkModuleFlow()
     * - .toUpdateLinkRoutingRule()
     *
     * Applies to resource types:
     * - Link
     * - LinkRoutingRule
     *
     * @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`
     */
    ifLinkLinkId(value, operator) {
        return this.if(`LinkLinkId`, value, operator ?? 'StringLike');
    }
    /**
     * Filters access by routing rule identifier supporting rule-* formats
     *
     * https://docs.aws.amazon.com/rtb-fabric/latest/userguide/security_iam_service-with-iam.html
     *
     * Applies to actions:
     * - .toDeleteLinkRoutingRule()
     * - .toGetLinkRoutingRule()
     * - .toListTagsForResource()
     * - .toTagResource()
     * - .toUntagResource()
     * - .toUpdateLinkRoutingRule()
     *
     * Applies to resource types:
     * - LinkRoutingRule
     *
     * @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`
     */
    ifLinkRoutingRuleRuleId(value, operator) {
        return this.if(`LinkRoutingRuleRuleId`, value, operator ?? 'StringLike');
    }
    /**
     * Filters access by OutboundExternalLink resource linkId identifier
     *
     * https://docs.aws.amazon.com/rtb-fabric/latest/userguide/security_iam_service-with-iam.html
     *
     * Applies to actions:
     * - .toDeleteOutboundExternalLink()
     * - .toGetOutboundExternalLink()
     * - .toListTagsForResource()
     * - .toTagResource()
     * - .toUntagResource()
     *
     * Applies to resource types:
     * - OutboundExternalLink
     *
     * @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`
     */
    ifOutboundExternalLinkLinkId(value, operator) {
        return this.if(`OutboundExternalLinkLinkId`, value, operator ?? 'StringLike');
    }
    /**
     * Filters access by gateway identifier supporting rtb-gw-* formats
     *
     * https://docs.aws.amazon.com/rtb-fabric/latest/userguide/security_iam_service-with-iam.html
     *
     * Applies to actions:
     * - .toAcceptLink()
     * - .toCreateLinkRoutingRule()
     * - .toCreateOutboundExternalLink()
     * - .toDeleteLink()
     * - .toDeleteLinkRoutingRule()
     * - .toDeleteOutboundExternalLink()
     * - .toDeleteRequesterGateway()
     * - .toGetLink()
     * - .toGetLinkRoutingRule()
     * - .toGetOutboundExternalLink()
     * - .toGetRequesterGateway()
     * - .toListLinkRoutingRules()
     * - .toListTagsForResource()
     * - .toRejectLink()
     * - .toTagResource()
     * - .toUntagResource()
     * - .toUpdateLink()
     * - .toUpdateLinkModuleFlow()
     * - .toUpdateLinkRoutingRule()
     * - .toUpdateRequesterGateway()
     *
     * Applies to resource types:
     * - Link
     * - OutboundExternalLink
     * - RequesterGateway
     *
     * @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`
     */
    ifRequesterGatewayGatewayId(value, operator) {
        return this.if(`RequesterGatewayGatewayId`, value, operator ?? 'StringLike');
    }
    /**
     * Filters access by gateway identifier supporting rtb-gw-* formats
     *
     * https://docs.aws.amazon.com/rtb-fabric/latest/userguide/security_iam_service-with-iam.html
     *
     * Applies to actions:
     * - .toAcceptLink()
     * - .toAssociateCertificate()
     * - .toCreateInboundExternalLink()
     * - .toCreateLinkRoutingRule()
     * - .toDeleteInboundExternalLink()
     * - .toDeleteLink()
     * - .toDeleteLinkRoutingRule()
     * - .toDeleteResponderGateway()
     * - .toDisassociateCertificate()
     * - .toGetCertificateAssociation()
     * - .toGetInboundExternalLink()
     * - .toGetLink()
     * - .toGetLinkRoutingRule()
     * - .toGetResponderGateway()
     * - .toListCertificateAssociations()
     * - .toListLinkRoutingRules()
     * - .toListTagsForResource()
     * - .toRejectLink()
     * - .toTagResource()
     * - .toUntagResource()
     * - .toUpdateLink()
     * - .toUpdateLinkModuleFlow()
     * - .toUpdateLinkRoutingRule()
     * - .toUpdateResponderGateway()
     *
     * Applies to resource types:
     * - InboundExternalLink
     * - Link
     * - ResponderGateway
     *
     * @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`
     */
    ifResponderGatewayGatewayId(value, operator) {
        return this.if(`ResponderGatewayGatewayId`, value, operator ?? 'StringLike');
    }
    /**
     * Statement provider for service [rtbfabric](https://docs.aws.amazon.com/service-authorization/latest/reference/list_rtbfabric.html).
     *
     */
    constructor(props) {
        super(props);
        this.servicePrefix = 'rtbfabric';
        this.accessLevelList = {
            Write: [
                'AcceptLink',
                'AssociateCertificate',
                'CreateInboundExternalLink',
                'CreateLink',
                'CreateLinkRoutingRule',
                'CreateOutboundExternalLink',
                'CreateRequesterGateway',
                'CreateResponderGateway',
                'DeleteInboundExternalLink',
                'DeleteLink',
                'DeleteLinkRoutingRule',
                'DeleteOutboundExternalLink',
                'DeleteRequesterGateway',
                'DeleteResponderGateway',
                'DisassociateCertificate',
                'RejectLink',
                'TagResource',
                'UntagResource',
                'UpdateLink',
                'UpdateLinkModuleFlow',
                'UpdateLinkRoutingRule',
                'UpdateRequesterGateway',
                'UpdateResponderGateway'
            ],
            Read: [
                'GetCertificateAssociation',
                'GetInboundExternalLink',
                'GetLink',
                'GetLinkRoutingRule',
                'GetOutboundExternalLink',
                'GetRequesterGateway',
                'GetResponderGateway',
                'ListTagsForResource'
            ],
            List: [
                'ListCertificateAssociations',
                'ListLinkRoutingRules',
                'ListLinks',
                'ListRequesterGateways',
                'ListResponderGateways'
            ],
            Tagging: [
                'TagResource',
                'UntagResource'
            ]
        };
    }
}
exports.Rtbfabric = Rtbfabric;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnRiZmFicmljLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsicnRiZmFicmljLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLHlDQUF5RDtBQUd6RDs7OztHQUlHO0FBQ0gsTUFBYSxTQUFVLFNBQVEsd0JBQWU7SUFHNUM7Ozs7OztPQU1HO0lBQ0ksWUFBWTtRQUNqQixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLHNCQUFzQjtRQUMzQixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsc0JBQXNCLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksMkJBQTJCO1FBQ2hDLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFRDs7Ozs7Ozs7OztPQVVHO0lBQ0ksWUFBWTtRQUNqQixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLHVCQUF1QjtRQUM1QixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsdUJBQXVCLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksNEJBQTRCO1FBQ2pDLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFRDs7Ozs7Ozs7OztPQVVHO0lBQ0ksd0JBQXdCO1FBQzdCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFFRDs7Ozs7Ozs7OztPQVVHO0lBQ0ksd0JBQXdCO1FBQzdCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSwyQkFBMkI7UUFDaEMsT0FBTyxJQUFJLENBQUMsRUFB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QUEyQixFQUFFLEtBQUssRUFBRSxRQUFRLElBQUksWUFBWSxDQUFDLENBQUM7SUFDL0UsQ0FBQztJQUVEOzs7T0FHRztJQUNILFlBQVksS0FBZ0M7UUFDMUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBeDJCUixrQkFBYSxHQUFHLFdBQVcsQ0FBQztRQTBaekIsb0JBQWUsR0FBb0I7WUFDM0MsS0FBSyxFQUFFO2dCQUNMLFlBQVk7Z0JBQ1osc0JBQXNCO2dCQUN0QiwyQkFBMkI7Z0JBQzNCLFlBQVk7Z0JBQ1osdUJBQXVCO2dCQUN2Qiw0QkFBNEI7Z0JBQzVCLHdCQUF3QjtnQkFDeEIsd0JBQXdCO2dCQUN4QiwyQkFBMkI7Z0JBQzNCLFlBQVk7Z0JBQ1osdUJBQXVCO2dCQUN2Qiw0QkFBNEI7Z0JBQzVCLHdCQUF3QjtnQkFDeEIsd0JBQXdCO2dCQUN4Qix5QkFBeUI7Z0JBQ3pCLFlBQVk7Z0JBQ1osYUFBYTtnQkFDYixlQUFlO2dCQUNmLFlBQVk7Z0JBQ1osc0JBQXNCO2dCQUN0Qix1QkFBdUI7Z0JBQ3ZCLHdCQUF3QjtnQkFDeEIsd0JBQXdCO2FBQ3pCO1lBQ0QsSUFBSSxFQUFFO2dCQUNKLDJCQUEyQjtnQkFDM0Isd0JBQXdCO2dCQUN4QixTQUFTO2dCQUNULG9CQUFvQjtnQkFDcEIseUJBQXlCO2dCQUN6QixxQkFBcUI7Z0JBQ3JCLHFCQUFxQjtnQkFDckIscUJBQXFCO2FBQ3RCO1lBQ0QsSUFBSSxFQUFFO2dCQUNKLDZCQUE2QjtnQkFDN0Isc0JBQXNCO2dCQUN0QixXQUFXO2dCQUNYLHVCQUF1QjtnQkFDdkIsdUJBQXVCO2FBQ3hCO1lBQ0QsT0FBTyxFQUFFO2dCQUNQLGFBQWE7Z0JBQ2IsZUFBZTthQUNoQjtTQUNGLENBQUM7SUFnYUYsQ0FBQztDQUNGO0FBMzJCRCw4QkEyMkJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWNjZXNzTGV2ZWxMaXN0IH0gZnJvbSAnLi4vLi4vc2hhcmVkL2FjY2Vzcy1sZXZlbCc7XG5pbXBvcnQgeyBQb2xpY3lTdGF0ZW1lbnQsIE9wZXJhdG9yIH0gZnJvbSAnLi4vLi4vc2hhcmVkJztcbmltcG9ydCB7IGF3c19pYW0gYXMgaWFtIH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5cbi8qKlxuICogU3RhdGVtZW50IHByb3ZpZGVyIGZvciBzZXJ2aWNlIFtydGJmYWJyaWNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zZXJ2aWNlLWF1dGhvcml6YXRpb24vbGF0ZXN0L3JlZmVyZW5jZS9saXN0X3J0YmZhYnJpYy5odG1sKS5cbiAqXG4gKiBAcGFyYW0gc2lkIFtTSURdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfc2lkLmh0bWwpIG9mIHRoZSBzdGF0ZW1lbnRcbiAqL1xuZXhwb3J0IGNsYXNzIFJ0YmZhYnJpYyBleHRlbmRzIFBvbGljeVN0YXRlbWVudCB7XG4gIHB1YmxpYyBzZXJ2aWNlUHJlZml4ID0gJ3J0YmZhYnJpYyc7XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGFjY2VwdCBhIGxpbmsgaW52aXRhdGlvbiBmcm9tIGFub3RoZXIgR2F0ZXdheVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9ydGItZmFicmljL2xhdGVzdC9hcGkvQVBJX0FjY2VwdExpbmsuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQWNjZXB0TGluaygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQWNjZXB0TGluaycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGFzc29jaWF0ZSBhbiBBQ00gY2VydGlmaWNhdGUgd2l0aCBhIHJlc3BvbmRlciBnYXRld2F5XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3J0Yi1mYWJyaWMvbGF0ZXN0L2FwaS9BUElfQXNzb2NpYXRlQ2VydGlmaWNhdGUuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQXNzb2NpYXRlQ2VydGlmaWNhdGUoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Fzc29jaWF0ZUNlcnRpZmljYXRlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY3JlYXRlIGFuIGluYm91bmQgZXh0ZXJuYWwgbGluayBmb3IgYSByZXNwb25kZXIgZ2F0ZXdheVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9ydGItZmFicmljL2xhdGVzdC9hcGkvQVBJX0NyZWF0ZUluYm91bmRFeHRlcm5hbExpbmsuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlSW5ib3VuZEV4dGVybmFsTGluaygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlSW5ib3VuZEV4dGVybmFsTGluaycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhIG5ldyBsaW5rIGJldHdlZW4gUlRCIGFwcGxpY2F0aW9uc1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVxdWVzdFRhZygpXG4gICAqIC0gLmlmQXdzVGFnS2V5cygpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9ydGItZmFicmljL2xhdGVzdC9hcGkvQVBJX0NyZWF0ZUxpbmsuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlTGluaygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlTGluaycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhIHJvdXRpbmcgcnVsZSBmb3IgYSBsaW5rXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3J0Yi1mYWJyaWMvbGF0ZXN0L2FwaS9BUElfQ3JlYXRlTGlua1JvdXRpbmdSdWxlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZUxpbmtSb3V0aW5nUnVsZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlTGlua1JvdXRpbmdSdWxlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY3JlYXRlIGFuIG91dGJvdW5kIGV4dGVybmFsIGxpbmsgZm9yIGEgcmVxdWVzdGVyIGdhdGV3YXkgdG8gY29ubmVjdCB0byBleHRlcm5hbCBwdWJsaWMgcmVzcG9uZGVyIGVuZHBvaW50c1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9ydGItZmFicmljL2xhdGVzdC9hcGkvQVBJX0NyZWF0ZU91dGJvdW5kRXh0ZXJuYWxMaW5rLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZU91dGJvdW5kRXh0ZXJuYWxMaW5rKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVPdXRib3VuZEV4dGVybmFsTGluaycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhIHJlcXVlc3RlciBnYXRld2F5XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NSZXF1ZXN0VGFnKClcbiAgICogLSAuaWZBd3NUYWdLZXlzKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3J0Yi1mYWJyaWMvbGF0ZXN0L2FwaS9BUElfQ3JlYXRlUmVxdWVzdGVyR2F0ZXdheS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVSZXF1ZXN0ZXJHYXRld2F5KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVSZXF1ZXN0ZXJHYXRld2F5Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY3JlYXRlIGEgcmVzcG9uZGVyIGdhdGV3YXlcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkF3c1JlcXVlc3RUYWcoKVxuICAgKiAtIC5pZkF3c1RhZ0tleXMoKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcnRiLWZhYnJpYy9sYXRlc3QvYXBpL0FQSV9DcmVhdGVSZXNwb25kZXJHYXRld2F5Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZVJlc3BvbmRlckdhdGV3YXkoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZVJlc3BvbmRlckdhdGV3YXknKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgYW4gaW5ib3VuZCBleHRlcm5hbCBsaW5rXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3J0Yi1mYWJyaWMvbGF0ZXN0L2FwaS9BUElfRGVsZXRlSW5ib3VuZEV4dGVybmFsTGluay5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVJbmJvdW5kRXh0ZXJuYWxMaW5rKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVJbmJvdW5kRXh0ZXJuYWxMaW5rJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGEgbGluayBiZXR3ZWVuIFJUQiBhcHBsaWNhdGlvbnNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcnRiLWZhYnJpYy9sYXRlc3QvYXBpL0FQSV9EZWxldGVMaW5rLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZUxpbmsoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZUxpbmsnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgYSByb3V0aW5nIHJ1bGUgZnJvbSBhIGxpbmtcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcnRiLWZhYnJpYy9sYXRlc3QvYXBpL0FQSV9EZWxldGVMaW5rUm91dGluZ1J1bGUuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlTGlua1JvdXRpbmdSdWxlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVMaW5rUm91dGluZ1J1bGUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgYW4gb3V0Ym91bmQgZXh0ZXJuYWwgbGlua1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9ydGItZmFicmljL2xhdGVzdC9hcGkvQVBJX0RlbGV0ZU91dGJvdW5kRXh0ZXJuYWxMaW5rLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZU91dGJvdW5kRXh0ZXJuYWxMaW5rKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVPdXRib3VuZEV4dGVybmFsTGluaycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlbGV0ZSBhIHJlcXVlc3RlciBnYXRld2F5XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3J0Yi1mYWJyaWMvbGF0ZXN0L2FwaS9BUElfRGVsZXRlUmVxdWVzdGVyR2F0ZXdheS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVSZXF1ZXN0ZXJHYXRld2F5KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVSZXF1ZXN0ZXJHYXRld2F5Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGEgcmVzcG9uZGVyIGdhdGV3YXlcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcnRiLWZhYnJpYy9sYXRlc3QvYXBpL0FQSV9EZWxldGVSZXNwb25kZXJHYXRld2F5Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZVJlc3BvbmRlckdhdGV3YXkoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZVJlc3BvbmRlckdhdGV3YXknKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZW1vdmUgYSBjZXJ0aWZpY2F0ZSBhc3NvY2lhdGlvbiBmcm9tIGEgcmVzcG9uZGVyIGdhdGV3YXlcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcnRiLWZhYnJpYy9sYXRlc3QvYXBpL0FQSV9EaXNhc3NvY2lhdGVDZXJ0aWZpY2F0ZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EaXNhc3NvY2lhdGVDZXJ0aWZpY2F0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGlzYXNzb2NpYXRlQ2VydGlmaWNhdGUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXRyaWV2ZSBkZXRhaWxzIG9mIGEgY2VydGlmaWNhdGUgYXNzb2NpYXRpb24gd2l0aCBhIHJlc3BvbmRlciBnYXRld2F5XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcnRiLWZhYnJpYy9sYXRlc3QvYXBpL0FQSV9HZXRDZXJ0aWZpY2F0ZUFzc29jaWF0aW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldENlcnRpZmljYXRlQXNzb2NpYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldENlcnRpZmljYXRlQXNzb2NpYXRpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXRyaWV2ZSBpbmZvcm1hdGlvbiBhYm91dCBhbiBpbmJvdW5kIGV4dGVybmFsIGxpbmtcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9ydGItZmFicmljL2xhdGVzdC9hcGkvQVBJX0dldEluYm91bmRFeHRlcm5hbExpbmsuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0SW5ib3VuZEV4dGVybmFsTGluaygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0SW5ib3VuZEV4dGVybmFsTGluaycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJldHJpZXZlIGluZm9ybWF0aW9uIGFib3V0IGEgbGluayBiZXR3ZWVuIFJUQiBhcHBsaWNhdGlvbnNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9ydGItZmFicmljL2xhdGVzdC9hcGkvQVBJX0dldExpbmsuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0TGluaygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0TGluaycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJldHJpZXZlIGluZm9ybWF0aW9uIGFib3V0IGEgcm91dGluZyBydWxlIGZvciBhIGxpbmtcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9ydGItZmFicmljL2xhdGVzdC9hcGkvQVBJX0dldExpbmtSb3V0aW5nUnVsZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRMaW5rUm91dGluZ1J1bGUoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldExpbmtSb3V0aW5nUnVsZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJldHJpZXZlIGluZm9ybWF0aW9uIGFib3V0IGFuIG91dGJvdW5kIGV4dGVybmFsIGxpbmtcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9ydGItZmFicmljL2xhdGVzdC9hcGkvQVBJX0dldE91dGJvdW5kRXh0ZXJuYWxMaW5rLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldE91dGJvdW5kRXh0ZXJuYWxMaW5rKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRPdXRib3VuZEV4dGVybmFsTGluaycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJldHJpZXZlIGluZm9ybWF0aW9uIGFib3V0IGEgcmVxdWVzdGVyIGdhdGV3YXlcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9ydGItZmFicmljL2xhdGVzdC9hcGkvQVBJX0dldFJlcXVlc3RlckdhdGV3YXkuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0UmVxdWVzdGVyR2F0ZXdheSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0UmVxdWVzdGVyR2F0ZXdheScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJldHJpZXZlIGluZm9ybWF0aW9uIGFib3V0IGEgcmVzcG9uZGVyIGdhdGV3YXlcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9ydGItZmFicmljL2xhdGVzdC9hcGkvQVBJX0dldFJlc3BvbmRlckdhdGV3YXkuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0UmVzcG9uZGVyR2F0ZXdheSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0UmVzcG9uZGVyR2F0ZXdheScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgY2VydGlmaWNhdGUgYXNzb2NpYXRpb25zIGZvciBhIHJlc3BvbmRlciBnYXRld2F5XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcnRiLWZhYnJpYy9sYXRlc3QvYXBpL0FQSV9MaXN0Q2VydGlmaWNhdGVBc3NvY2lhdGlvbnMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdENlcnRpZmljYXRlQXNzb2NpYXRpb25zKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0Q2VydGlmaWNhdGVBc3NvY2lhdGlvbnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0IHJvdXRpbmcgcnVsZXMgZm9yIGEgbGlua1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3J0Yi1mYWJyaWMvbGF0ZXN0L2FwaS9BUElfTGlzdExpbmtSb3V0aW5nUnVsZXMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdExpbmtSb3V0aW5nUnVsZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RMaW5rUm91dGluZ1J1bGVzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCBsaW5rcyBhc3NvY2lhdGVkIHdpdGggYW4gUlRCIGFwcGxpY2F0aW9uXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcnRiLWZhYnJpYy9sYXRlc3QvYXBpL0FQSV9MaXN0TGlua3MuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdExpbmtzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0TGlua3MnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0IHJlcXVlc3RlciBnYXRld2F5cyB3aXRoIG9wdGlvbmFsIGZpbHRlcmluZyBhbmQgcGFnaW5hdGlvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3J0Yi1mYWJyaWMvbGF0ZXN0L2FwaS9BUElfTGlzdFJlcXVlc3RlckdhdGV3YXlzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RSZXF1ZXN0ZXJHYXRld2F5cygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdFJlcXVlc3RlckdhdGV3YXlzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCByZXNwb25kZXIgZ2F0ZXdheXMgd2l0aCBvcHRpb25hbCBmaWx0ZXJpbmcgYW5kIHBhZ2luYXRpb25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9ydGItZmFicmljL2xhdGVzdC9hcGkvQVBJX0xpc3RSZXNwb25kZXJHYXRld2F5cy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0UmVzcG9uZGVyR2F0ZXdheXMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RSZXNwb25kZXJHYXRld2F5cycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgdGFncyBmb3IgYSByZXNvdXJjZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3J0Yi1mYWJyaWMvbGF0ZXN0L2FwaS9BUElfTGlzdFRhZ3NGb3JSZXNvdXJjZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0VGFnc0ZvclJlc291cmNlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0VGFnc0ZvclJlc291cmNlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmVqZWN0IGEgbGluayByZXF1ZXN0IGJldHdlZW4gUlRCIGFwcGxpY2F0aW9uc1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9ydGItZmFicmljL2xhdGVzdC9hcGkvQVBJX1JlamVjdExpbmsuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvUmVqZWN0TGluaygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnUmVqZWN0TGluaycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGFzc2lnbiBvbmUgb3IgbW9yZSB0YWdzIChrZXktdmFsdWUgcGFpcnMpIHRvIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBUYWdnaW5nLCBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcnRiLWZhYnJpYy9sYXRlc3QvYXBpL0FQSV9UYWdSZXNvdXJjZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9UYWdSZXNvdXJjZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVGFnUmVzb3VyY2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZW1vdmUgYSB0YWcgb3IgdGFncyBmcm9tIGEgcmVzb3VyY2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBUYWdnaW5nLCBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcnRiLWZhYnJpYy9sYXRlc3QvYXBpL0FQSV9VbnRhZ1Jlc291cmNlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1VudGFnUmVzb3VyY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1VudGFnUmVzb3VyY2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byB1cGRhdGUgY29uZmlndXJhdGlvbiBzZXR0aW5ncyBmb3IgYW4gZXhpc3RpbmcgbGlua1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9ydGItZmFicmljL2xhdGVzdC9hcGkvQVBJX1VwZGF0ZUxpbmsuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvVXBkYXRlTGluaygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVXBkYXRlTGluaycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHVwZGF0ZSBhIGxpbmsgbW9kdWxlIGZsb3dcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcnRiLWZhYnJpYy9sYXRlc3QvYXBpL0FQSV9VcGRhdGVMaW5rTW9kdWxlRmxvdy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9VcGRhdGVMaW5rTW9kdWxlRmxvdygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVXBkYXRlTGlua01vZHVsZUZsb3cnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byB1cGRhdGUgYSByb3V0aW5nIHJ1bGUgZm9yIGEgbGlua1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9ydGItZmFicmljL2xhdGVzdC9hcGkvQVBJX1VwZGF0ZUxpbmtSb3V0aW5nUnVsZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9VcGRhdGVMaW5rUm91dGluZ1J1bGUoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1VwZGF0ZUxpbmtSb3V0aW5nUnVsZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHVwZGF0ZSBhIHJlcXVlc3RlciBnYXRld2F5XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3J0Yi1mYWJyaWMvbGF0ZXN0L2FwaS9BUElfVXBkYXRlUmVxdWVzdGVyR2F0ZXdheS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9VcGRhdGVSZXF1ZXN0ZXJHYXRld2F5KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdVcGRhdGVSZXF1ZXN0ZXJHYXRld2F5Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gdXBkYXRlIGEgcmVzcG9uZGVyIGdhdGV3YXlcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcnRiLWZhYnJpYy9sYXRlc3QvYXBpL0FQSV9VcGRhdGVSZXNwb25kZXJHYXRld2F5Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1VwZGF0ZVJlc3BvbmRlckdhdGV3YXkoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1VwZGF0ZVJlc3BvbmRlckdhdGV3YXknKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhY2Nlc3NMZXZlbExpc3Q6IEFjY2Vzc0xldmVsTGlzdCA9IHtcbiAgICBXcml0ZTogW1xuICAgICAgJ0FjY2VwdExpbmsnLFxuICAgICAgJ0Fzc29jaWF0ZUNlcnRpZmljYXRlJyxcbiAgICAgICdDcmVhdGVJbmJvdW5kRXh0ZXJuYWxMaW5rJyxcbiAgICAgICdDcmVhdGVMaW5rJyxcbiAgICAgICdDcmVhdGVMaW5rUm91dGluZ1J1bGUnLFxuICAgICAgJ0NyZWF0ZU91dGJvdW5kRXh0ZXJuYWxMaW5rJyxcbiAgICAgICdDcmVhdGVSZXF1ZXN0ZXJHYXRld2F5JyxcbiAgICAgICdDcmVhdGVSZXNwb25kZXJHYXRld2F5JyxcbiAgICAgICdEZWxldGVJbmJvdW5kRXh0ZXJuYWxMaW5rJyxcbiAgICAgICdEZWxldGVMaW5rJyxcbiAgICAgICdEZWxldGVMaW5rUm91dGluZ1J1bGUnLFxuICAgICAgJ0RlbGV0ZU91dGJvdW5kRXh0ZXJuYWxMaW5rJyxcbiAgICAgICdEZWxldGVSZXF1ZXN0ZXJHYXRld2F5JyxcbiAgICAgICdEZWxldGVSZXNwb25kZXJHYXRld2F5JyxcbiAgICAgICdEaXNhc3NvY2lhdGVDZXJ0aWZpY2F0ZScsXG4gICAgICAnUmVqZWN0TGluaycsXG4gICAgICAnVGFnUmVzb3VyY2UnLFxuICAgICAgJ1VudGFnUmVzb3VyY2UnLFxuICAgICAgJ1VwZGF0ZUxpbmsnLFxuICAgICAgJ1VwZGF0ZUxpbmtNb2R1bGVGbG93JyxcbiAgICAgICdVcGRhdGVMaW5rUm91dGluZ1J1bGUnLFxuICAgICAgJ1VwZGF0ZVJlcXVlc3RlckdhdGV3YXknLFxuICAgICAgJ1VwZGF0ZVJlc3BvbmRlckdhdGV3YXknXG4gICAgXSxcbiAgICBSZWFkOiBbXG4gICAgICAnR2V0Q2VydGlmaWNhdGVBc3NvY2lhdGlvbicsXG4gICAgICAnR2V0SW5ib3VuZEV4dGVybmFsTGluaycsXG4gICAgICAnR2V0TGluaycsXG4gICAgICAnR2V0TGlua1JvdXRpbmdSdWxlJyxcbiAgICAgICdHZXRPdXRib3VuZEV4dGVybmFsTGluaycsXG4gICAgICAnR2V0UmVxdWVzdGVyR2F0ZXdheScsXG4gICAgICAnR2V0UmVzcG9uZGVyR2F0ZXdheScsXG4gICAgICAnTGlzdFRhZ3NGb3JSZXNvdXJjZSdcbiAgICBdLFxuICAgIExpc3Q6IFtcbiAgICAgICdMaXN0Q2VydGlmaWNhdGVBc3NvY2lhdGlvbnMnLFxuICAgICAgJ0xpc3RMaW5rUm91dGluZ1J1bGVzJyxcbiAgICAgICdMaXN0TGlua3MnLFxuICAgICAgJ0xpc3RSZXF1ZXN0ZXJHYXRld2F5cycsXG4gICAgICAnTGlzdFJlc3BvbmRlckdhdGV3YXlzJ1xuICAgIF0sXG4gICAgVGFnZ2luZzogW1xuICAgICAgJ1RhZ1Jlc291cmNlJyxcbiAgICAgICdVbnRhZ1Jlc291cmNlJ1xuICAgIF1cbiAgfTtcblxuICAvKipcbiAgICogQWRkcyBhIHJlc291cmNlIG9mIHR5cGUgSW5ib3VuZEV4dGVybmFsTGluayB0byB0aGUgc3RhdGVtZW50XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9ydGItZmFicmljL2xhdGVzdC91c2VyZ3VpZGUvbGlua3MuaHRtbFxuICAgKlxuICAgKiBAcGFyYW0gZ2F0ZXdheUlkIC0gSWRlbnRpZmllciBmb3IgdGhlIGdhdGV3YXlJZC5cbiAgICogQHBhcmFtIGxpbmtJZCAtIElkZW50aWZpZXIgZm9yIHRoZSBsaW5rSWQuXG4gICAqIEBwYXJhbSBhY2NvdW50IC0gQWNjb3VudCBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgYWNjb3VudC5cbiAgICogQHBhcmFtIHJlZ2lvbiAtIFJlZ2lvbiBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcmVnaW9uLlxuICAgKiBAcGFyYW0gcGFydGl0aW9uIC0gUGFydGl0aW9uIG9mIHRoZSBBV1MgYWNjb3VudCBbYXdzLCBhd3MtY24sIGF3cy11cy1nb3ZdOyBkZWZhdWx0cyB0byBgYXdzYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcGFydGl0aW9uLlxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkF3c1Jlc291cmNlVGFnKClcbiAgICogLSAuaWZJbmJvdW5kRXh0ZXJuYWxMaW5rTGlua0lkKClcbiAgICogLSAuaWZSZXNwb25kZXJHYXRld2F5R2F0ZXdheUlkKClcbiAgICovXG4gIHB1YmxpYyBvbkluYm91bmRFeHRlcm5hbExpbmsoZ2F0ZXdheUlkOiBzdHJpbmcsIGxpbmtJZDogc3RyaW5nLCBhY2NvdW50Pzogc3RyaW5nLCByZWdpb24/OiBzdHJpbmcsIHBhcnRpdGlvbj86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLm9uKGBhcm46JHsgcGFydGl0aW9uID8/IHRoaXMuZGVmYXVsdFBhcnRpdGlvbiB9OnJ0YmZhYnJpYzokeyByZWdpb24gPz8gdGhpcy5kZWZhdWx0UmVnaW9uIH06JHsgYWNjb3VudCA/PyB0aGlzLmRlZmF1bHRBY2NvdW50IH06Z2F0ZXdheS8keyBnYXRld2F5SWQgfS9saW5rLyR7IGxpbmtJZCB9YCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHJlc291cmNlIG9mIHR5cGUgTGluayB0byB0aGUgc3RhdGVtZW50XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9ydGItZmFicmljL2xhdGVzdC91c2VyZ3VpZGUvbGlua3MuaHRtbFxuICAgKlxuICAgKiBAcGFyYW0gZ2F0ZXdheUlkIC0gSWRlbnRpZmllciBmb3IgdGhlIGdhdGV3YXlJZC5cbiAgICogQHBhcmFtIGxpbmtJZCAtIElkZW50aWZpZXIgZm9yIHRoZSBsaW5rSWQuXG4gICAqIEBwYXJhbSBhY2NvdW50IC0gQWNjb3VudCBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgYWNjb3VudC5cbiAgICogQHBhcmFtIHJlZ2lvbiAtIFJlZ2lvbiBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcmVnaW9uLlxuICAgKiBAcGFyYW0gcGFydGl0aW9uIC0gUGFydGl0aW9uIG9mIHRoZSBBV1MgYWNjb3VudCBbYXdzLCBhd3MtY24sIGF3cy11cy1nb3ZdOyBkZWZhdWx0cyB0byBgYXdzYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcGFydGl0aW9uLlxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkF3c1Jlc291cmNlVGFnKClcbiAgICogLSAuaWZMaW5rTGlua0lkKClcbiAgICogLSAuaWZSZXF1ZXN0ZXJHYXRld2F5R2F0ZXdheUlkKClcbiAgICogLSAuaWZSZXNwb25kZXJHYXRld2F5R2F0ZXdheUlkKClcbiAgICovXG4gIHB1YmxpYyBvbkxpbmsoZ2F0ZXdheUlkOiBzdHJpbmcsIGxpbmtJZDogc3RyaW5nLCBhY2NvdW50Pzogc3RyaW5nLCByZWdpb24/OiBzdHJpbmcsIHBhcnRpdGlvbj86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLm9uKGBhcm46JHsgcGFydGl0aW9uID8/IHRoaXMuZGVmYXVsdFBhcnRpdGlvbiB9OnJ0YmZhYnJpYzokeyByZWdpb24gPz8gdGhpcy5kZWZhdWx0UmVnaW9uIH06JHsgYWNjb3VudCA/PyB0aGlzLmRlZmF1bHRBY2NvdW50IH06Z2F0ZXdheS8keyBnYXRld2F5SWQgfS9saW5rLyR7IGxpbmtJZCB9YCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHJlc291cmNlIG9mIHR5cGUgTGlua1JvdXRpbmdSdWxlIHRvIHRoZSBzdGF0ZW1lbnRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3J0Yi1mYWJyaWMvbGF0ZXN0L3VzZXJndWlkZS9saW5rcy5odG1sXG4gICAqXG4gICAqIEBwYXJhbSBnYXRld2F5SWQgLSBJZGVudGlmaWVyIGZvciB0aGUgZ2F0ZXdheUlkLlxuICAgKiBAcGFyYW0gbGlua0lkIC0gSWRlbnRpZmllciBmb3IgdGhlIGxpbmtJZC5cbiAgICogQHBhcmFtIHJ1bGVJZCAtIElkZW50aWZpZXIgZm9yIHRoZSBydWxlSWQuXG4gICAqIEBwYXJhbSBhY2NvdW50IC0gQWNjb3VudCBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgYWNjb3VudC5cbiAgICogQHBhcmFtIHJlZ2lvbiAtIFJlZ2lvbiBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcmVnaW9uLlxuICAgKiBAcGFyYW0gcGFydGl0aW9uIC0gUGFydGl0aW9uIG9mIHRoZSBBV1MgYWNjb3VudCBbYXdzLCBhd3MtY24sIGF3cy11cy1nb3ZdOyBkZWZhdWx0cyB0byBgYXdzYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcGFydGl0aW9uLlxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkF3c1Jlc291cmNlVGFnKClcbiAgICogLSAuaWZMaW5rTGlua0lkKClcbiAgICogLSAuaWZMaW5rUm91dGluZ1J1bGVSdWxlSWQoKVxuICAgKi9cbiAgcHVibGljIG9uTGlua1JvdXRpbmdSdWxlKGdhdGV3YXlJZDogc3RyaW5nLCBsaW5rSWQ6IHN0cmluZywgcnVsZUlkOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06cnRiZmFicmljOiR7IHJlZ2lvbiA/PyB0aGlzLmRlZmF1bHRSZWdpb24gfTokeyBhY2NvdW50ID8/IHRoaXMuZGVmYXVsdEFjY291bnQgfTpnYXRld2F5LyR7IGdhdGV3YXlJZCB9L2xpbmsvJHsgbGlua0lkIH0vcm91dGluZy1ydWxlLyR7IHJ1bGVJZCB9YCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHJlc291cmNlIG9mIHR5cGUgT3V0Ym91bmRFeHRlcm5hbExpbmsgdG8gdGhlIHN0YXRlbWVudFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcnRiLWZhYnJpYy9sYXRlc3QvdXNlcmd1aWRlL2xpbmtzLmh0bWxcbiAgICpcbiAgICogQHBhcmFtIGdhdGV3YXlJZCAtIElkZW50aWZpZXIgZm9yIHRoZSBnYXRld2F5SWQuXG4gICAqIEBwYXJhbSBsaW5rSWQgLSBJZGVudGlmaWVyIGZvciB0aGUgbGlua0lkLlxuICAgKiBAcGFyYW0gYWNjb3VudCAtIEFjY291bnQgb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIGFjY291bnQuXG4gICAqIEBwYXJhbSByZWdpb24gLSBSZWdpb24gb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHJlZ2lvbi5cbiAgICogQHBhcmFtIHBhcnRpdGlvbiAtIFBhcnRpdGlvbiBvZiB0aGUgQVdTIGFjY291bnQgW2F3cywgYXdzLWNuLCBhd3MtdXMtZ292XTsgZGVmYXVsdHMgdG8gYGF3c2AsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHBhcnRpdGlvbi5cbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NSZXNvdXJjZVRhZygpXG4gICAqIC0gLmlmT3V0Ym91bmRFeHRlcm5hbExpbmtMaW5rSWQoKVxuICAgKiAtIC5pZlJlcXVlc3RlckdhdGV3YXlHYXRld2F5SWQoKVxuICAgKi9cbiAgcHVibGljIG9uT3V0Ym91bmRFeHRlcm5hbExpbmsoZ2F0ZXdheUlkOiBzdHJpbmcsIGxpbmtJZDogc3RyaW5nLCBhY2NvdW50Pzogc3RyaW5nLCByZWdpb24/OiBzdHJpbmcsIHBhcnRpdGlvbj86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLm9uKGBhcm46JHsgcGFydGl0aW9uID8/IHRoaXMuZGVmYXVsdFBhcnRpdGlvbiB9OnJ0YmZhYnJpYzokeyByZWdpb24gPz8gdGhpcy5kZWZhdWx0UmVnaW9uIH06JHsgYWNjb3VudCA/PyB0aGlzLmRlZmF1bHRBY2NvdW50IH06Z2F0ZXdheS8keyBnYXRld2F5SWQgfS9saW5rLyR7IGxpbmtJZCB9YCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHJlc291cmNlIG9mIHR5cGUgUmVxdWVzdGVyR2F0ZXdheSB0byB0aGUgc3RhdGVtZW50XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9ydGItZmFicmljL2xhdGVzdC91c2VyZ3VpZGUvd29ya2luZy13aXRoLXJlcXVlc3Rlci1ydGItYXBwbGljYXRpb25zLmh0bWxcbiAgICpcbiAgICogQHBhcmFtIGdhdGV3YXlJZCAtIElkZW50aWZpZXIgZm9yIHRoZSBnYXRld2F5SWQuXG4gICAqIEBwYXJhbSBhY2NvdW50IC0gQWNjb3VudCBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgYWNjb3VudC5cbiAgICogQHBhcmFtIHJlZ2lvbiAtIFJlZ2lvbiBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcmVnaW9uLlxuICAgKiBAcGFyYW0gcGFydGl0aW9uIC0gUGFydGl0aW9uIG9mIHRoZSBBV1MgYWNjb3VudCBbYXdzLCBhd3MtY24sIGF3cy11cy1nb3ZdOyBkZWZhdWx0cyB0byBgYXdzYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcGFydGl0aW9uLlxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkF3c1Jlc291cmNlVGFnKClcbiAgICogLSAuaWZSZXF1ZXN0ZXJHYXRld2F5R2F0ZXdheUlkKClcbiAgICovXG4gIHB1YmxpYyBvblJlcXVlc3RlckdhdGV3YXkoZ2F0ZXdheUlkOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06cnRiZmFicmljOiR7IHJlZ2lvbiA/PyB0aGlzLmRlZmF1bHRSZWdpb24gfTokeyBhY2NvdW50ID8/IHRoaXMuZGVmYXVsdEFjY291bnQgfTpnYXRld2F5LyR7IGdhdGV3YXlJZCB9YCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHJlc291cmNlIG9mIHR5cGUgUmVzcG9uZGVyR2F0ZXdheSB0byB0aGUgc3RhdGVtZW50XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9ydGItZmFicmljL2xhdGVzdC91c2VyZ3VpZGUvd29ya2luZy13aXRoLXJlc3BvbmRlci1ydGItYXBwbGljYXRpb25zLmh0bWxcbiAgICpcbiAgICogQHBhcmFtIGdhdGV3YXlJZCAtIElkZW50aWZpZXIgZm9yIHRoZSBnYXRld2F5SWQuXG4gICAqIEBwYXJhbSBhY2NvdW50IC0gQWNjb3VudCBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgYWNjb3VudC5cbiAgICogQHBhcmFtIHJlZ2lvbiAtIFJlZ2lvbiBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcmVnaW9uLlxuICAgKiBAcGFyYW0gcGFydGl0aW9uIC0gUGFydGl0aW9uIG9mIHRoZSBBV1MgYWNjb3VudCBbYXdzLCBhd3MtY24sIGF3cy11cy1nb3ZdOyBkZWZhdWx0cyB0byBgYXdzYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcGFydGl0aW9uLlxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkF3c1Jlc291cmNlVGFnKClcbiAgICogLSAuaWZSZXNwb25kZXJHYXRld2F5R2F0ZXdheUlkKClcbiAgICovXG4gIHB1YmxpYyBvblJlc3BvbmRlckdhdGV3YXkoZ2F0ZXdheUlkOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06cnRiZmFicmljOiR7IHJlZ2lvbiA/PyB0aGlzLmRlZmF1bHRSZWdpb24gfTokeyBhY2NvdW50ID8/IHRoaXMuZGVmYXVsdEFjY291bnQgfTpnYXRld2F5LyR7IGdhdGV3YXlJZCB9YCk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgYSB0YWcga2V5IGFuZCB2YWx1ZSBwYWlyIHRoYXQgaXMgYWxsb3dlZCBpbiB0aGUgcmVxdWVzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2NvbmRpdGlvbi1rZXlzLmh0bWwjY29uZGl0aW9uLWtleXMtcmVxdWVzdHRhZ1xuICAgKlxuICAgKiBBcHBsaWVzIHRvIGFjdGlvbnM6XG4gICAqIC0gLnRvQ3JlYXRlSW5ib3VuZEV4dGVybmFsTGluaygpXG4gICAqIC0gLnRvQ3JlYXRlTGluaygpXG4gICAqIC0gLnRvQ3JlYXRlTGlua1JvdXRpbmdSdWxlKClcbiAgICogLSAudG9DcmVhdGVPdXRib3VuZEV4dGVybmFsTGluaygpXG4gICAqIC0gLnRvQ3JlYXRlUmVxdWVzdGVyR2F0ZXdheSgpXG4gICAqIC0gLnRvQ3JlYXRlUmVzcG9uZGVyR2F0ZXdheSgpXG4gICAqIC0gLnRvVGFnUmVzb3VyY2UoKVxuICAgKlxuICAgKiBAcGFyYW0gdGFnS2V5IFRoZSB0YWcga2V5IHRvIGNoZWNrXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW3N0cmluZyBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfU3RyaW5nKS4gKipEZWZhdWx0OioqIGBTdHJpbmdMaWtlYFxuICAgKi9cbiAgcHVibGljIGlmQXdzUmVxdWVzdFRhZyh0YWdLZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdLCBvcGVyYXRvcj86IE9wZXJhdG9yIHwgc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaWYoYGF3czpSZXF1ZXN0VGFnLyR7IHRhZ0tleSB9YCwgdmFsdWUsIG9wZXJhdG9yID8/ICdTdHJpbmdMaWtlJyk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgYSB0YWcga2V5IGFuZCB2YWx1ZSBwYWlyIG9mIGEgcmVzb3VyY2VcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19jb25kaXRpb24ta2V5cy5odG1sI2NvbmRpdGlvbi1rZXlzLXJlc291cmNldGFnXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9BY2NlcHRMaW5rKClcbiAgICogLSAudG9Bc3NvY2lhdGVDZXJ0aWZpY2F0ZSgpXG4gICAqIC0gLnRvQ3JlYXRlSW5ib3VuZEV4dGVybmFsTGluaygpXG4gICAqIC0gLnRvQ3JlYXRlTGlua1JvdXRpbmdSdWxlKClcbiAgICogLSAudG9DcmVhdGVPdXRib3VuZEV4dGVybmFsTGluaygpXG4gICAqIC0gLnRvRGVsZXRlSW5ib3VuZEV4dGVybmFsTGluaygpXG4gICAqIC0gLnRvRGVsZXRlTGluaygpXG4gICAqIC0gLnRvRGVsZXRlTGlua1JvdXRpbmdSdWxlKClcbiAgICogLSAudG9EZWxldGVPdXRib3VuZEV4dGVybmFsTGluaygpXG4gICAqIC0gLnRvRGVsZXRlUmVxdWVzdGVyR2F0ZXdheSgpXG4gICAqIC0gLnRvRGVsZXRlUmVzcG9uZGVyR2F0ZXdheSgpXG4gICAqIC0gLnRvRGlzYXNzb2NpYXRlQ2VydGlmaWNhdGUoKVxuICAgKiAtIC50b0dldENlcnRpZmljYXRlQXNzb2NpYXRpb24oKVxuICAgKiAtIC50b0dldEluYm91bmRFeHRlcm5hbExpbmsoKVxuICAgKiAtIC50b0dldExpbmsoKVxuICAgKiAtIC50b0dldExpbmtSb3V0aW5nUnVsZSgpXG4gICAqIC0gLnRvR2V0T3V0Ym91bmRFeHRlcm5hbExpbmsoKVxuICAgKiAtIC50b0dldFJlcXVlc3RlckdhdGV3YXkoKVxuICAgKiAtIC50b0dldFJlc3BvbmRlckdhdGV3YXkoKVxuICAgKiAtIC50b0xpc3RDZXJ0aWZpY2F0ZUFzc29jaWF0aW9ucygpXG4gICAqIC0gLnRvTGlzdExpbmtSb3V0aW5nUnVsZXMoKVxuICAgKiAtIC50b0xpc3RUYWdzRm9yUmVzb3VyY2UoKVxuICAgKiAtIC50b1JlamVjdExpbmsoKVxuICAgKiAtIC50b1RhZ1Jlc291cmNlKClcbiAgICogLSAudG9VbnRhZ1Jlc291cmNlKClcbiAgICogLSAudG9VcGRhdGVMaW5rKClcbiAgICogLSAudG9VcGRhdGVMaW5rTW9kdWxlRmxvdygpXG4gICAqIC0gLnRvVXBkYXRlTGlua1JvdXRpbmdSdWxlKClcbiAgICogLSAudG9VcGRhdGVSZXF1ZXN0ZXJHYXRld2F5KClcbiAgICogLSAudG9VcGRhdGVSZXNwb25kZXJHYXRld2F5KClcbiAgICpcbiAgICogQXBwbGllcyB0byByZXNvdXJjZSB0eXBlczpcbiAgICogLSBJbmJvdW5kRXh0ZXJuYWxMaW5rXG4gICAqIC0gTGlua1xuICAgKiAtIExpbmtSb3V0aW5nUnVsZVxuICAgKiAtIE91dGJvdW5kRXh0ZXJuYWxMaW5rXG4gICAqIC0gUmVxdWVzdGVyR2F0ZXdheVxuICAgKiAtIFJlc3BvbmRlckdhdGV3YXlcbiAgICpcbiAgICogQHBhcmFtIHRhZ0tleSBUaGUgdGFnIGtleSB0byBjaGVja1xuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlKHMpIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBvcGVyYXRvciBXb3JrcyB3aXRoIFtzdHJpbmcgb3BlcmF0b3JzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbl9vcGVyYXRvcnMuaHRtbCNDb25kaXRpb25zX1N0cmluZykuICoqRGVmYXVsdDoqKiBgU3RyaW5nTGlrZWBcbiAgICovXG4gIHB1YmxpYyBpZkF3c1Jlc291cmNlVGFnKHRhZ0tleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pZihgYXdzOlJlc291cmNlVGFnLyR7IHRhZ0tleSB9YCwgdmFsdWUsIG9wZXJhdG9yID8/ICdTdHJpbmdMaWtlJyk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgYSBsaXN0IG9mIHRhZyBrZXlzIHRoYXQgYXJlIGFsbG93ZWQgaW4gdGhlIHJlcXVlc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19jb25kaXRpb24ta2V5cy5odG1sI2NvbmRpdGlvbi1rZXlzLXRhZ2tleXNcbiAgICpcbiAgICogQXBwbGllcyB0byBhY3Rpb25zOlxuICAgKiAtIC50b0NyZWF0ZUluYm91bmRFeHRlcm5hbExpbmsoKVxuICAgKiAtIC50b0NyZWF0ZUxpbmsoKVxuICAgKiAtIC50b0NyZWF0ZUxpbmtSb3V0aW5nUnVsZSgpXG4gICAqIC0gLnRvQ3JlYXRlT3V0Ym91bmRFeHRlcm5hbExpbmsoKVxuICAgKiAtIC50b0NyZWF0ZVJlcXVlc3RlckdhdGV3YXkoKVxuICAgKiAtIC50b0NyZWF0ZVJlc3BvbmRlckdhdGV3YXkoKVxuICAgKiAtIC50b1RhZ1Jlc291cmNlKClcbiAgICogLSAudG9VbnRhZ1Jlc291cmNlKClcbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZShzKSB0byBjaGVja1xuICAgKiBAcGFyYW0gb3BlcmF0b3IgV29ya3Mgd2l0aCBbc3RyaW5nIG9wZXJhdG9yc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19jb25kaXRpb25fb3BlcmF0b3JzLmh0bWwjQ29uZGl0aW9uc19TdHJpbmcpLiAqKkRlZmF1bHQ6KiogYFN0cmluZ0xpa2VgXG4gICAqL1xuICBwdWJsaWMgaWZBd3NUYWdLZXlzKHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSwgb3BlcmF0b3I/OiBPcGVyYXRvciB8IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmlmKGBhd3M6VGFnS2V5c2AsIHZhbHVlLCBvcGVyYXRvciA/PyAnU3RyaW5nTGlrZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYWNjZXNzIGJ5IGdhdGV3YXkgaWRlbnRpZmllciBzdXBwb3J0aW5nIHJ0Yi1ndy0qIGZvcm1hdHNcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3J0Yi1mYWJyaWMvbGF0ZXN0L3VzZXJndWlkZS9zZWN1cml0eV9pYW1fc2VydmljZS13aXRoLWlhbS5odG1sXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW3N0cmluZyBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfU3RyaW5nKS4gKipEZWZhdWx0OioqIGBTdHJpbmdMaWtlYFxuICAgKi9cbiAgcHVibGljIGlmSW5ib3VuZEV4dGVybmFsTGlua0dhdGV3YXlJZCh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pZihgSW5ib3VuZEV4dGVybmFsTGlua0dhdGV3YXlJZGAsIHZhbHVlLCBvcGVyYXRvciA/PyAnU3RyaW5nTGlrZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYWNjZXNzIGJ5IEluYm91bmRFeHRlcm5hbExpbmsgcmVzb3VyY2UgbGlua0lkIGlkZW50aWZpZXJcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3J0Yi1mYWJyaWMvbGF0ZXN0L3VzZXJndWlkZS9zZWN1cml0eV9pYW1fc2VydmljZS13aXRoLWlhbS5odG1sXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9EZWxldGVJbmJvdW5kRXh0ZXJuYWxMaW5rKClcbiAgICogLSAudG9HZXRJbmJvdW5kRXh0ZXJuYWxMaW5rKClcbiAgICogLSAudG9MaXN0VGFnc0ZvclJlc291cmNlKClcbiAgICogLSAudG9UYWdSZXNvdXJjZSgpXG4gICAqIC0gLnRvVW50YWdSZXNvdXJjZSgpXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gcmVzb3VyY2UgdHlwZXM6XG4gICAqIC0gSW5ib3VuZEV4dGVybmFsTGlua1xuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlKHMpIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBvcGVyYXRvciBXb3JrcyB3aXRoIFtzdHJpbmcgb3BlcmF0b3JzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbl9vcGVyYXRvcnMuaHRtbCNDb25kaXRpb25zX1N0cmluZykuICoqRGVmYXVsdDoqKiBgU3RyaW5nTGlrZWBcbiAgICovXG4gIHB1YmxpYyBpZkluYm91bmRFeHRlcm5hbExpbmtMaW5rSWQodmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdLCBvcGVyYXRvcj86IE9wZXJhdG9yIHwgc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaWYoYEluYm91bmRFeHRlcm5hbExpbmtMaW5rSWRgLCB2YWx1ZSwgb3BlcmF0b3IgPz8gJ1N0cmluZ0xpa2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIGFjY2VzcyBieSBMaW5rIHJlc291cmNlIGxpbmtJZCBpZGVudGlmaWVyXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9ydGItZmFicmljL2xhdGVzdC91c2VyZ3VpZGUvc2VjdXJpdHlfaWFtX3NlcnZpY2Utd2l0aC1pYW0uaHRtbFxuICAgKlxuICAgKiBBcHBsaWVzIHRvIGFjdGlvbnM6XG4gICAqIC0gLnRvQWNjZXB0TGluaygpXG4gICAqIC0gLnRvQ3JlYXRlTGlua1JvdXRpbmdSdWxlKClcbiAgICogLSAudG9EZWxldGVMaW5rKClcbiAgICogLSAudG9EZWxldGVMaW5rUm91dGluZ1J1bGUoKVxuICAgKiAtIC50b0dldExpbmsoKVxuICAgKiAtIC50b0dldExpbmtSb3V0aW5nUnVsZSgpXG4gICAqIC0gLnRvTGlzdExpbmtSb3V0aW5nUnVsZXMoKVxuICAgKiAtIC50b0xpc3RUYWdzRm9yUmVzb3VyY2UoKVxuICAgKiAtIC50b1JlamVjdExpbmsoKVxuICAgKiAtIC50b1RhZ1Jlc291cmNlKClcbiAgICogLSAudG9VbnRhZ1Jlc291cmNlKClcbiAgICogLSAudG9VcGRhdGVMaW5rKClcbiAgICogLSAudG9VcGRhdGVMaW5rTW9kdWxlRmxvdygpXG4gICAqIC0gLnRvVXBkYXRlTGlua1JvdXRpbmdSdWxlKClcbiAgICpcbiAgICogQXBwbGllcyB0byByZXNvdXJjZSB0eXBlczpcbiAgICogLSBMaW5rXG4gICAqIC0gTGlua1JvdXRpbmdSdWxlXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW3N0cmluZyBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfU3RyaW5nKS4gKipEZWZhdWx0OioqIGBTdHJpbmdMaWtlYFxuICAgKi9cbiAgcHVibGljIGlmTGlua0xpbmtJZCh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pZihgTGlua0xpbmtJZGAsIHZhbHVlLCBvcGVyYXRvciA/PyAnU3RyaW5nTGlrZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYWNjZXNzIGJ5IHJvdXRpbmcgcnVsZSBpZGVudGlmaWVyIHN1cHBvcnRpbmcgcnVsZS0qIGZvcm1hdHNcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3J0Yi1mYWJyaWMvbGF0ZXN0L3VzZXJndWlkZS9zZWN1cml0eV9pYW1fc2VydmljZS13aXRoLWlhbS5odG1sXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9EZWxldGVMaW5rUm91dGluZ1J1bGUoKVxuICAgKiAtIC50b0dldExpbmtSb3V0aW5nUnVsZSgpXG4gICAqIC0gLnRvTGlzdFRhZ3NGb3JSZXNvdXJjZSgpXG4gICAqIC0gLnRvVGFnUmVzb3VyY2UoKVxuICAgKiAtIC50b1VudGFnUmVzb3VyY2UoKVxuICAgKiAtIC50b1VwZGF0ZUxpbmtSb3V0aW5nUnVsZSgpXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gcmVzb3VyY2UgdHlwZXM6XG4gICAqIC0gTGlua1JvdXRpbmdSdWxlXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW3N0cmluZyBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfU3RyaW5nKS4gKipEZWZhdWx0OioqIGBTdHJpbmdMaWtlYFxuICAgKi9cbiAgcHVibGljIGlmTGlua1JvdXRpbmdSdWxlUnVsZUlkKHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSwgb3BlcmF0b3I/OiBPcGVyYXRvciB8IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmlmKGBMaW5rUm91dGluZ1J1bGVSdWxlSWRgLCB2YWx1ZSwgb3BlcmF0b3IgPz8gJ1N0cmluZ0xpa2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIGFjY2VzcyBieSBPdXRib3VuZEV4dGVybmFsTGluayByZXNvdXJjZSBsaW5rSWQgaWRlbnRpZmllclxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcnRiLWZhYnJpYy9sYXRlc3QvdXNlcmd1aWRlL3NlY3VyaXR5X2lhbV9zZXJ2aWNlLXdpdGgtaWFtLmh0bWxcbiAgICpcbiAgICogQXBwbGllcyB0byBhY3Rpb25zOlxuICAgKiAtIC50b0RlbGV0ZU91dGJvdW5kRXh0ZXJuYWxMaW5rKClcbiAgICogLSAudG9HZXRPdXRib3VuZEV4dGVybmFsTGluaygpXG4gICAqIC0gLnRvTGlzdFRhZ3NGb3JSZXNvdXJjZSgpXG4gICAqIC0gLnRvVGFnUmVzb3VyY2UoKVxuICAgKiAtIC50b1VudGFnUmVzb3VyY2UoKVxuICAgKlxuICAgKiBBcHBsaWVzIHRvIHJlc291cmNlIHR5cGVzOlxuICAgKiAtIE91dGJvdW5kRXh0ZXJuYWxMaW5rXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW3N0cmluZyBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfU3RyaW5nKS4gKipEZWZhdWx0OioqIGBTdHJpbmdMaWtlYFxuICAgKi9cbiAgcHVibGljIGlmT3V0Ym91bmRFeHRlcm5hbExpbmtMaW5rSWQodmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdLCBvcGVyYXRvcj86IE9wZXJhdG9yIHwgc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaWYoYE91dGJvdW5kRXh0ZXJuYWxMaW5rTGlua0lkYCwgdmFsdWUsIG9wZXJhdG9yID8/ICdTdHJpbmdMaWtlJyk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgZ2F0ZXdheSBpZGVudGlmaWVyIHN1cHBvcnRpbmcgcnRiLWd3LSogZm9ybWF0c1xuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcnRiLWZhYnJpYy9sYXRlc3QvdXNlcmd1aWRlL3NlY3VyaXR5X2lhbV9zZXJ2aWNlLXdpdGgtaWFtLmh0bWxcbiAgICpcbiAgICogQXBwbGllcyB0byBhY3Rpb25zOlxuICAgKiAtIC50b0FjY2VwdExpbmsoKVxuICAgKiAtIC50b0NyZWF0ZUxpbmtSb3V0aW5nUnVsZSgpXG4gICAqIC0gLnRvQ3JlYXRlT3V0Ym91bmRFeHRlcm5hbExpbmsoKVxuICAgKiAtIC50b0RlbGV0ZUxpbmsoKVxuICAgKiAtIC50b0RlbGV0ZUxpbmtSb3V0aW5nUnVsZSgpXG4gICAqIC0gLnRvRGVsZXRlT3V0Ym91bmRFeHRlcm5hbExpbmsoKVxuICAgKiAtIC50b0RlbGV0ZVJlcXVlc3RlckdhdGV3YXkoKVxuICAgKiAtIC50b0dldExpbmsoKVxuICAgKiAtIC50b0dldExpbmtSb3V0aW5nUnVsZSgpXG4gICAqIC0gLnRvR2V0T3V0Ym91bmRFeHRlcm5hbExpbmsoKVxuICAgKiAtIC50b0dldFJlcXVlc3RlckdhdGV3YXkoKVxuICAgKiAtIC50b0xpc3RMaW5rUm91dGluZ1J1bGVzKClcbiAgICogLSAudG9MaXN0VGFnc0ZvclJlc291cmNlKClcbiAgICogLSAudG9SZWplY3RMaW5rKClcbiAgICogLSAudG9UYWdSZXNvdXJjZSgpXG4gICAqIC0gLnRvVW50YWdSZXNvdXJjZSgpXG4gICAqIC0gLnRvVXBkYXRlTGluaygpXG4gICAqIC0gLnRvVXBkYXRlTGlua01vZHVsZUZsb3coKVxuICAgKiAtIC50b1VwZGF0ZUxpbmtSb3V0aW5nUnVsZSgpXG4gICAqIC0gLnRvVXBkYXRlUmVxdWVzdGVyR2F0ZXdheSgpXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gcmVzb3VyY2UgdHlwZXM6XG4gICAqIC0gTGlua1xuICAgKiAtIE91dGJvdW5kRXh0ZXJuYWxMaW5rXG4gICAqIC0gUmVxdWVzdGVyR2F0ZXdheVxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlKHMpIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBvcGVyYXRvciBXb3JrcyB3aXRoIFtzdHJpbmcgb3BlcmF0b3JzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbl9vcGVyYXRvcnMuaHRtbCNDb25kaXRpb25zX1N0cmluZykuICoqRGVmYXVsdDoqKiBgU3RyaW5nTGlrZWBcbiAgICovXG4gIHB1YmxpYyBpZlJlcXVlc3RlckdhdGV3YXlHYXRld2F5SWQodmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdLCBvcGVyYXRvcj86IE9wZXJhdG9yIHwgc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaWYoYFJlcXVlc3RlckdhdGV3YXlHYXRld2F5SWRgLCB2YWx1ZSwgb3BlcmF0b3IgPz8gJ1N0cmluZ0xpa2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIGFjY2VzcyBieSBnYXRld2F5IGlkZW50aWZpZXIgc3VwcG9ydGluZyBydGItZ3ctKiBmb3JtYXRzXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9ydGItZmFicmljL2xhdGVzdC91c2VyZ3VpZGUvc2VjdXJpdHlfaWFtX3NlcnZpY2Utd2l0aC1pYW0uaHRtbFxuICAgKlxuICAgKiBBcHBsaWVzIHRvIGFjdGlvbnM6XG4gICAqIC0gLnRvQWNjZXB0TGluaygpXG4gICAqIC0gLnRvQXNzb2NpYXRlQ2VydGlmaWNhdGUoKVxuICAgKiAtIC50b0NyZWF0ZUluYm91bmRFeHRlcm5hbExpbmsoKVxuICAgKiAtIC50b0NyZWF0ZUxpbmtSb3V0aW5nUnVsZSgpXG4gICAqIC0gLnRvRGVsZXRlSW5ib3VuZEV4dGVybmFsTGluaygpXG4gICAqIC0gLnRvRGVsZXRlTGluaygpXG4gICAqIC0gLnRvRGVsZXRlTGlua1JvdXRpbmdSdWxlKClcbiAgICogLSAudG9EZWxldGVSZXNwb25kZXJHYXRld2F5KClcbiAgICogLSAudG9EaXNhc3NvY2lhdGVDZXJ0aWZpY2F0ZSgpXG4gICAqIC0gLnRvR2V0Q2VydGlmaWNhdGVBc3NvY2lhdGlvbigpXG4gICAqIC0gLnRvR2V0SW5ib3VuZEV4dGVybmFsTGluaygpXG4gICAqIC0gLnRvR2V0TGluaygpXG4gICAqIC0gLnRvR2V0TGlua1JvdXRpbmdSdWxlKClcbiAgICogLSAudG9HZXRSZXNwb25kZXJHYXRld2F5KClcbiAgICogLSAudG9MaXN0Q2VydGlmaWNhdGVBc3NvY2lhdGlvbnMoKVxuICAgKiAtIC50b0xpc3RMaW5rUm91dGluZ1J1bGVzKClcbiAgICogLSAudG9MaXN0VGFnc0ZvclJlc291cmNlKClcbiAgICogLSAudG9SZWplY3RMaW5rKClcbiAgICogLSAudG9UYWdSZXNvdXJjZSgpXG4gICAqIC0gLnRvVW50YWdSZXNvdXJjZSgpXG4gICAqIC0gLnRvVXBkYXRlTGluaygpXG4gICAqIC0gLnRvVXBkYXRlTGlua01vZHVsZUZsb3coKVxuICAgKiAtIC50b1VwZGF0ZUxpbmtSb3V0aW5nUnVsZSgpXG4gICAqIC0gLnRvVXBkYXRlUmVzcG9uZGVyR2F0ZXdheSgpXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gcmVzb3VyY2UgdHlwZXM6XG4gICAqIC0gSW5ib3VuZEV4dGVybmFsTGlua1xuICAgKiAtIExpbmtcbiAgICogLSBSZXNwb25kZXJHYXRld2F5XG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW3N0cmluZyBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfU3RyaW5nKS4gKipEZWZhdWx0OioqIGBTdHJpbmdMaWtlYFxuICAgKi9cbiAgcHVibGljIGlmUmVzcG9uZGVyR2F0ZXdheUdhdGV3YXlJZCh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pZihgUmVzcG9uZGVyR2F0ZXdheUdhdGV3YXlJZGAsIHZhbHVlLCBvcGVyYXRvciA/PyAnU3RyaW5nTGlrZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXRlbWVudCBwcm92aWRlciBmb3Igc2VydmljZSBbcnRiZmFicmljXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc2VydmljZS1hdXRob3JpemF0aW9uL2xhdGVzdC9yZWZlcmVuY2UvbGlzdF9ydGJmYWJyaWMuaHRtbCkuXG4gICAqXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihwcm9wcz86IGlhbS5Qb2xpY3lTdGF0ZW1lbnRQcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgfVxufVxuIl19