UNPKG

cdk-iam-floyd

Version:

AWS IAM policy statement generator with fluent interface for AWS CDK

843 lines 75.2 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Q = void 0; const shared_1 = require("../../shared"); /** * Statement provider for service [q](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonq.html). * * @param sid [SID](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_sid.html) of the statement */ class Q extends shared_1.PolicyStatement { /** * Grants permission to associate an AWS resource with an Amazon Q connector * * Access Level: Write * * https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/security_iam_manage-access-with-policies.html */ toAssociateConnectorResource() { return this.to('AssociateConnectorResource'); } /** * Grants permission to associate a login domain with an Amazon Q Developer Profile * * Access Level: Write * * https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/security_iam_manage-access-with-policies.html */ toAssociateLoginDomain() { return this.to('AssociateLoginDomain'); } /** * Grants permission to describe multiple groups for an Amazon Q Developer Profile * * Access Level: Read * * https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/security_iam_manage-access-with-policies.html */ toBatchDescribeGroups() { return this.to('BatchDescribeGroups'); } /** * Grants permission to describe multiple users for an Amazon Q Developer Profile * * Access Level: Read * * https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/security_iam_manage-access-with-policies.html */ toBatchDescribeUsers() { return this.to('BatchDescribeUsers'); } /** * Grants permission to get multiple groups for an Amazon Q Developer Profile * * Access Level: Read * * https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/security_iam_manage-access-with-policies.html */ toBatchGetGroups() { return this.to('BatchGetGroups'); } /** * Grants permission to get multiple users for an Amazon Q Developer Profile * * Access Level: Read * * https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/security_iam_manage-access-with-policies.html */ toBatchGetUsers() { return this.to('BatchGetUsers'); } /** * Grants permission to create an artifact with Amazon Q * * Access Level: Write * * https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/security_iam_manage-access-with-policies.html */ toCreateArtifact() { return this.to('CreateArtifact'); } /** * Grants permission to create a user or group assignment for an Amazon Q Developer Profile * * Access Level: Write * * Possible conditions: * - .ifIdentitystoreUserId() * - .ifIdentitystoreGroupId() * * https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/security_iam_manage-access-with-policies.html */ toCreateAssignment() { return this.to('CreateAssignment'); } /** * Grants permission to create OAuth user in Amazon Q * * Access Level: Write * * Dependent actions: * - kms:Decrypt * - kms:GenerateDataKeyWithoutPlaintext * - kms:ReEncryptFrom * - kms:ReEncryptTo * * https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/security_iam_manage-access-with-policies.html */ toCreateAuthGrant() { return this.to('CreateAuthGrant'); } /** * Grants permission to register an OAuth application in Amazon Q * * Access Level: Write * * Dependent actions: * - kms:Decrypt * - kms:GenerateDataKeyWithoutPlaintext * - kms:ReEncryptFrom * - kms:ReEncryptTo * * https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/security_iam_manage-access-with-policies.html */ toCreateOAuthAppConnection() { return this.to('CreateOAuthAppConnection'); } /** * Grants permission to create and configure a third party plugin in Amazon Q * * Access Level: Write * * Possible conditions: * - .ifAwsTagKeys() * - .ifAwsRequestTag() * * https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/security_iam_manage-access-with-policies.html */ toCreatePlugin() { return this.to('CreatePlugin'); } /** * Grants permission to create a SCIM access token for an Amazon Q Developer Profile * * Access Level: Write * * https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/security_iam_manage-access-with-policies.html */ toCreateScimAccessToken() { return this.to('CreateScimAccessToken'); } /** * Grants permission to delete a user or group assignment for an Amazon Q Developer Profile * * Access Level: Write * * Possible conditions: * - .ifIdentitystoreUserId() * - .ifIdentitystoreGroupId() * * https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/security_iam_manage-access-with-policies.html */ toDeleteAssignment() { return this.to('DeleteAssignment'); } /** * Grants permission to delete a conversation with Amazon Q * * Access Level: Write * * https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/security_iam_manage-access-with-policies.html */ toDeleteConversation() { return this.to('DeleteConversation'); } /** * Grants permission to delete an OAuth application in Amazon Q * * Access Level: Write * * Dependent actions: * - kms:Decrypt * - kms:GenerateDataKeyWithoutPlaintext * - kms:ReEncryptFrom * - kms:ReEncryptTo * * https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/security_iam_manage-access-with-policies.html */ toDeleteOAuthAppConnection() { return this.to('DeleteOAuthAppConnection'); } /** * Grants permission to delete a configured plugin in Amazon Q * * Access Level: Write * * Possible conditions: * - .ifAwsResourceTag() * * https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/security_iam_manage-access-with-policies.html */ toDeletePlugin() { return this.to('DeletePlugin'); } /** * Grants permission to delete a SCIM access token for an Amazon Q Developer Profile * * Access Level: Write * * https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/security_iam_manage-access-with-policies.html */ toDeleteScimAccessToken() { return this.to('DeleteScimAccessToken'); } /** * Grants permission to disassociate a login domain from an Amazon Q Developer Profile * * Access Level: Write * * https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/security_iam_manage-access-with-policies.html */ toDisassociateLoginDomain() { return this.to('DisassociateLoginDomain'); } /** * Grants permission to generate code from CLI commands in Amazon Q * * Access Level: Read * * https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/security_iam_manage-access-with-policies.html */ toGenerateCodeFromCommands() { return this.to('GenerateCodeFromCommands'); } /** * Grants permission to generate code recommendations in Amazon Q * * Access Level: Read * * https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/security_iam_manage-access-with-policies.html */ toGenerateCodeRecommendations() { return this.to('GenerateCodeRecommendations'); } /** * Grants permission to view an Amazon Q artifact * * Access Level: Read * * https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/security_iam_manage-access-with-policies.html */ toGetArtifact() { return this.to('GetArtifact'); } /** * Grants permission to view results of an action in an Amazon Q artifact * * Access Level: Read * * Dependent actions: * - cloudformation:GetResource * - cloudformation:GetResourceRequestStatus * - cloudformation:ListResourceRequests * * https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/security_iam_manage-access-with-policies.html */ toGetArtifactActionResult() { return this.to('GetArtifactActionResult'); } /** * Grants permission to view information about a specific Amazon Q connector * * Access Level: Read * * https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/security_iam_manage-access-with-policies.html */ toGetConnector() { return this.to('GetConnector'); } /** * Grants permission to get individual messages associated with a specific conversation with Amazon Q * * Access Level: Read * * https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/security_iam_manage-access-with-policies.html */ toGetConversation() { return this.to('GetConversation'); } /** * Grants permission to Amazon Q to get the identity metadata * * Access Level: Read * * https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/security_iam_manage-access-with-policies.html */ toGetIdentityMetadata() { return this.to('GetIdentityMetadata'); } /** * Grants permission to view information about a specific configured Amazon Q plugin * * Access Level: Read * * Possible conditions: * - .ifAwsResourceTag() * * https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/security_iam_manage-access-with-policies.html */ toGetPlugin() { return this.to('GetPlugin'); } /** * Grants permission to get troubleshooting results with Amazon Q * * Access Level: Read * * https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/security_iam_manage-access-with-policies.html */ toGetTroubleshootingResults() { return this.to('GetTroubleshootingResults'); } /** * Grants permission to list individual conversations associated with a specific Amazon Q user * * Access Level: Read * * https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/security_iam_manage-access-with-policies.html */ toListConversations() { return this.to('ListConversations'); } /** * Grants permission to read metrics to populate Amazon Q dashboard * * Access Level: List * * https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/security_iam_manage-access-with-policies.html */ toListDashboardMetrics() { return this.to('ListDashboardMetrics'); } /** * Grants permission to list groups for an Amazon Q Developer Profile * * Access Level: List * * https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/security_iam_manage-access-with-policies.html */ toListGroups() { return this.to('ListGroups'); } /** * Grants permission to list login domains for an Amazon Q Developer Profile * * Access Level: List * * https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/security_iam_manage-access-with-policies.html */ toListLoginDomains() { return this.to('ListLoginDomains'); } /** * Grants permission to list available plugins in Amazon Q * * Access Level: List * * https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/security_iam_manage-access-with-policies.html */ toListPluginProviders() { return this.to('ListPluginProviders'); } /** * Grants permission to list configured plugins in Amazon Q * * Access Level: List * * https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/security_iam_manage-access-with-policies.html */ toListPlugins() { return this.to('ListPlugins'); } /** * Grants permission to list SCIM access tokens for an Amazon Q Developer Profile * * Access Level: List * * https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/security_iam_manage-access-with-policies.html */ toListScimAccessTokens() { return this.to('ListScimAccessTokens'); } /** * Grants permission to list all tags associated with an Amazon Q resource * * Access Level: List * * Possible conditions: * - .ifAwsResourceTag() * * https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/security_iam_manage-access-with-policies.html */ toListTagsForResource() { return this.to('ListTagsForResource'); } /** * Grants permission to list users for an Amazon Q Developer Profile * * Access Level: List * * https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/security_iam_manage-access-with-policies.html */ toListUsers() { return this.to('ListUsers'); } /** * Grants permission to allow Amazon Q to perform actions on your behalf * * Access Level: Write * * https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/security_iam_manage-access-with-policies.html */ toPassRequest() { return this.to('PassRequest'); } /** * Grants permission to perform an action in an Amazon Q artifact * * Access Level: Write * * Dependent actions: * - cloudformation:CancelResourceRequest * - cloudformation:CreateResource * - cloudformation:GetResource * - cloudformation:GetResourceRequestStatus * - cloudformation:ListResourceRequests * - cloudformation:UpdateResource * - iam:AttachRolePolicy * - iam:CreatePolicy * - iam:CreateRole * - iam:PutRolePolicy * * https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/security_iam_manage-access-with-policies.html */ toPerformArtifactAction() { return this.to('PerformArtifactAction'); } /** * Grants permission to reject a connection request for an Amazon Q connector * * Access Level: Write * * https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/security_iam_manage-access-with-policies.html */ toRejectConnector() { return this.to('RejectConnector'); } /** * Grants permission to trigger asynchronous Amazon Q actions * * Access Level: Write * * Dependent actions: * - kms:Decrypt * - kms:GenerateDataKeyWithoutPlaintext * - kms:ReEncryptFrom * - kms:ReEncryptTo * * https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/security_iam_manage-access-with-policies.html */ toSendEvent() { return this.to('SendEvent'); } /** * Grants permission to send a message to Amazon Q * * Access Level: Write * * https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/security_iam_manage-access-with-policies.html */ toSendMessage() { return this.to('SendMessage'); } /** * Grants permission to start a conversation with Amazon Q * * Access Level: Write * * https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/security_iam_manage-access-with-policies.html */ toStartConversation() { return this.to('StartConversation'); } /** * Grants permission to start a troubleshooting analysis with Amazon Q * * Access Level: Write * * https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/security_iam_manage-access-with-policies.html */ toStartTroubleshootingAnalysis() { return this.to('StartTroubleshootingAnalysis'); } /** * Grants permission to start a troubleshooting resolution explanation with Amazon Q * * Access Level: Write * * https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/security_iam_manage-access-with-policies.html */ toStartTroubleshootingResolutionExplanation() { return this.to('StartTroubleshootingResolutionExplanation'); } /** * Grants permission to associate tags with an Amazon Q resource * * Access Level: Tagging * * Possible conditions: * - .ifAwsResourceTag() * - .ifAwsTagKeys() * - .ifAwsRequestTag() * * https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/security_iam_manage-access-with-policies.html */ toTagResource() { return this.to('TagResource'); } /** * Grants permission to remove tags associated with an Amazon Q resource * * Access Level: Tagging * * Possible conditions: * - .ifAwsResourceTag() * - .ifAwsTagKeys() * * https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/security_iam_manage-access-with-policies.html */ toUntagResource() { return this.to('UntagResource'); } /** * Grants permission to update a user or group assignment for an Amazon Q Developer Profile * * Access Level: Write * * Possible conditions: * - .ifIdentitystoreUserId() * - .ifIdentitystoreGroupId() * * https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/security_iam_manage-access-with-policies.html */ toUpdateAssignment() { return this.to('UpdateAssignment'); } /** * Grants permission to update OAuth user in Amazon Q * * Access Level: Write * * Dependent actions: * - kms:Decrypt * - kms:GenerateDataKeyWithoutPlaintext * - kms:ReEncryptFrom * - kms:ReEncryptTo * * https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/security_iam_manage-access-with-policies.html */ toUpdateAuthGrant() { return this.to('UpdateAuthGrant'); } /** * Grants permission to update a conversation with Amazon Q * * Access Level: Write * * https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/security_iam_manage-access-with-policies.html */ toUpdateConversation() { return this.to('UpdateConversation'); } /** * Grants permission to update an OAuth application in Amazon Q * * Access Level: Write * * Dependent actions: * - kms:Decrypt * - kms:GenerateDataKeyWithoutPlaintext * - kms:ReEncryptFrom * - kms:ReEncryptTo * * https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/security_iam_manage-access-with-policies.html */ toUpdateOAuthAppConnection() { return this.to('UpdateOAuthAppConnection'); } /** * Grants permission to update a third party plugin in Amazon Q * * Access Level: Write * * Possible conditions: * - .ifAwsTagKeys() * - .ifAwsRequestTag() * * https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/security_iam_manage-access-with-policies.html */ toUpdatePlugin() { return this.to('UpdatePlugin'); } /** * Grants permission to update a troubleshooting command result with Amazon Q * * Access Level: Write * * https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/security_iam_manage-access-with-policies.html */ toUpdateTroubleshootingCommandResult() { return this.to('UpdateTroubleshootingCommandResult'); } /** * Grants permission to use Amazon Q plugins * * Access Level: Write * * https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/security_iam_manage-access-with-policies.html */ toUsePlugin() { return this.to('UsePlugin'); } /** * Grants permission to verify an OAuth application in Amazon Q * * Access Level: Write * * Dependent actions: * - kms:Decrypt * - kms:GenerateDataKeyWithoutPlaintext * - kms:ReEncryptFrom * - kms:ReEncryptTo * * https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/security_iam_manage-access-with-policies.html */ toVerifyOAuthAppConnection() { return this.to('VerifyOAuthAppConnection'); } /** * Adds a resource of type profile to the statement * * https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/as-whisper-admin.html#about-profiles * * @param identifier - Identifier for the identifier. * @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() */ onProfile(identifier, account, region, partition) { return this.on(`arn:${partition ?? this.defaultPartition}:codewhisperer:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:profile/${identifier}`); } /** * Adds a resource of type plugin to the statement * * https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/plugins.html * * @param identifier - Identifier for the identifier. * @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() */ onPlugin(identifier, account, region, partition) { return this.on(`arn:${partition ?? this.defaultPartition}:qdeveloper:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:plugin/${identifier}`); } /** * Filters access by the tags that are passed in the request * * https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/security-iam-service-with-iam.html * * Applies to actions: * - .toCreatePlugin() * - .toTagResource() * - .toUpdatePlugin() * * @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 Amazon Q resource * * https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/security-iam-service-with-iam.html * * Applies to actions: * - .toDeletePlugin() * - .toGetPlugin() * - .toListTagsForResource() * - .toTagResource() * - .toUntagResource() * * Applies to resource types: * - profile * - plugin * * @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/amazonq/latest/qdeveloper-ug/security-iam-service-with-iam.html * * Applies to actions: * - .toCreatePlugin() * - .toTagResource() * - .toUntagResource() * - .toUpdatePlugin() * * @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 IAM Identity Center Group ID * * https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/security-iam-service-with-iam.html * * Applies to actions: * - .toCreateAssignment() * - .toDeleteAssignment() * - .toUpdateAssignment() * * @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` */ ifIdentitystoreGroupId(value, operator) { return this.if(`identitystore:GroupId`, value, operator ?? 'StringLike'); } /** * Filters access by IAM Identity Center User ID * * https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/security-iam-service-with-iam.html * * Applies to actions: * - .toCreateAssignment() * - .toDeleteAssignment() * - .toUpdateAssignment() * * @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` */ ifIdentitystoreUserId(value, operator) { return this.if(`identitystore:UserId`, value, operator ?? 'StringLike'); } /** * Statement provider for service [q](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amazonq.html). * */ constructor(props) { super(props); this.servicePrefix = 'q'; this.accessLevelList = { Write: [ 'AssociateConnectorResource', 'AssociateLoginDomain', 'CreateArtifact', 'CreateAssignment', 'CreateAuthGrant', 'CreateOAuthAppConnection', 'CreatePlugin', 'CreateScimAccessToken', 'DeleteAssignment', 'DeleteConversation', 'DeleteOAuthAppConnection', 'DeletePlugin', 'DeleteScimAccessToken', 'DisassociateLoginDomain', 'PassRequest', 'PerformArtifactAction', 'RejectConnector', 'SendEvent', 'SendMessage', 'StartConversation', 'StartTroubleshootingAnalysis', 'StartTroubleshootingResolutionExplanation', 'UpdateAssignment', 'UpdateAuthGrant', 'UpdateConversation', 'UpdateOAuthAppConnection', 'UpdatePlugin', 'UpdateTroubleshootingCommandResult', 'UsePlugin', 'VerifyOAuthAppConnection' ], Read: [ 'BatchDescribeGroups', 'BatchDescribeUsers', 'BatchGetGroups', 'BatchGetUsers', 'GenerateCodeFromCommands', 'GenerateCodeRecommendations', 'GetArtifact', 'GetArtifactActionResult', 'GetConnector', 'GetConversation', 'GetIdentityMetadata', 'GetPlugin', 'GetTroubleshootingResults', 'ListConversations' ], List: [ 'ListDashboardMetrics', 'ListGroups', 'ListLoginDomains', 'ListPluginProviders', 'ListPlugins', 'ListScimAccessTokens', 'ListTagsForResource', 'ListUsers' ], Tagging: [ 'TagResource', 'UntagResource' ] }; } } exports.Q = Q; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EseUNBQXlEO0FBR3pEOzs7O0dBSUc7QUFDSCxNQUFhLENBQUUsU0FBUSx3QkFBZTtJQUdwQzs7Ozs7O09BTUc7SUFDSSw0QkFBNEI7UUFDakMsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLDRCQUE0QixDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLHNCQUFzQjtRQUMzQixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsc0JBQXNCLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0kscUJBQXFCO1FBQzFCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxvQkFBb0I7UUFDekIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLG9CQUFvQixDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLGdCQUFnQjtRQUNyQixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksZUFBZTtRQUNwQixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLGdCQUFnQjtRQUNyQixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7T0FVRztJQUNJLGtCQUFrQjtRQUN2QixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsa0JBQWtCLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7OztPQVlHO0lBQ0ksaUJBQWlCO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxpQkFBaUIs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QUNsQixvQkFBb0I7Z0JBQ3BCLDBCQUEwQjtnQkFDMUIsY0FBYztnQkFDZCx1QkFBdUI7Z0JBQ3ZCLHlCQUF5QjtnQkFDekIsYUFBYTtnQkFDYix1QkFBdUI7Z0JBQ3ZCLGlCQUFpQjtnQkFDakIsV0FBVztnQkFDWCxhQUFhO2dCQUNiLG1CQUFtQjtnQkFDbkIsOEJBQThCO2dCQUM5QiwyQ0FBMkM7Z0JBQzNDLGtCQUFrQjtnQkFDbEIsaUJBQWlCO2dCQUNqQixvQkFBb0I7Z0JBQ3BCLDBCQUEwQjtnQkFDMUIsY0FBYztnQkFDZCxvQ0FBb0M7Z0JBQ3BDLFdBQVc7Z0JBQ1gsMEJBQTBCO2FBQzNCO1lBQ0QsSUFBSSxFQUFFO2dCQUNKLHFCQUFxQjtnQkFDckIsb0JBQW9CO2dCQUNwQixnQkFBZ0I7Z0JBQ2hCLGVBQWU7Z0JBQ2YsMEJBQTBCO2dCQUMxQiw2QkFBNkI7Z0JBQzdCLGFBQWE7Z0JBQ2IseUJBQXlCO2dCQUN6QixjQUFjO2dCQUNkLGlCQUFpQjtnQkFDakIscUJBQXFCO2dCQUNyQixXQUFXO2dCQUNYLDJCQUEyQjtnQkFDM0IsbUJBQW1CO2FBQ3BCO1lBQ0QsSUFBSSxFQUFFO2dCQUNKLHNCQUFzQjtnQkFDdEIsWUFBWTtnQkFDWixrQkFBa0I7Z0JBQ2xCLHFCQUFxQjtnQkFDckIsYUFBYTtnQkFDYixzQkFBc0I7Z0JBQ3RCLHFCQUFxQjtnQkFDckIsV0FBVzthQUNaO1lBQ0QsT0FBTyxFQUFFO2dCQUNQLGFBQWE7Z0JBQ2IsZUFBZTthQUNoQjtTQUNGLENBQUM7SUF3SUYsQ0FBQztDQUNGO0FBOTNCRCxjQTgzQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBY2Nlc3NMZXZlbExpc3QgfSBmcm9tICcuLi8uLi9zaGFyZWQvYWNjZXNzLWxldmVsJztcbmltcG9ydCB7IFBvbGljeVN0YXRlbWVudCwgT3BlcmF0b3IgfSBmcm9tICcuLi8uLi9zaGFyZWQnO1xuaW1wb3J0IHsgYXdzX2lhbSBhcyBpYW0gfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcblxuLyoqXG4gKiBTdGF0ZW1lbnQgcHJvdmlkZXIgZm9yIHNlcnZpY2UgW3FdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zZXJ2aWNlLWF1dGhvcml6YXRpb24vbGF0ZXN0L3JlZmVyZW5jZS9saXN0X2FtYXpvbnEuaHRtbCkuXG4gKlxuICogQHBhcmFtIHNpZCBbU0lEXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX3NpZC5odG1sKSBvZiB0aGUgc3RhdGVtZW50XG4gKi9cbmV4cG9ydCBjbGFzcyBRIGV4dGVuZHMgUG9saWN5U3RhdGVtZW50IHtcbiAgcHVibGljIHNlcnZpY2VQcmVmaXggPSAncSc7XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGFzc29jaWF0ZSBhbiBBV1MgcmVzb3VyY2Ugd2l0aCBhbiBBbWF6b24gUSBjb25uZWN0b3JcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYW1hem9ucS9sYXRlc3QvcWRldmVsb3Blci11Zy9zZWN1cml0eV9pYW1fbWFuYWdlLWFjY2Vzcy13aXRoLXBvbGljaWVzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Fzc29jaWF0ZUNvbm5lY3RvclJlc291cmNlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdBc3NvY2lhdGVDb25uZWN0b3JSZXNvdXJjZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGFzc29jaWF0ZSBhIGxvZ2luIGRvbWFpbiB3aXRoIGFuIEFtYXpvbiBRIERldmVsb3BlciBQcm9maWxlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FtYXpvbnEvbGF0ZXN0L3FkZXZlbG9wZXItdWcvc2VjdXJpdHlfaWFtX21hbmFnZS1hY2Nlc3Mtd2l0aC1wb2xpY2llcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9Bc3NvY2lhdGVMb2dpbkRvbWFpbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQXNzb2NpYXRlTG9naW5Eb21haW4nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZXNjcmliZSBtdWx0aXBsZSBncm91cHMgZm9yIGFuIEFtYXpvbiBRIERldmVsb3BlciBQcm9maWxlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYW1hem9ucS9sYXRlc3QvcWRldmVsb3Blci11Zy9zZWN1cml0eV9pYW1fbWFuYWdlLWFjY2Vzcy13aXRoLXBvbGljaWVzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0JhdGNoRGVzY3JpYmVHcm91cHMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0JhdGNoRGVzY3JpYmVHcm91cHMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZXNjcmliZSBtdWx0aXBsZSB1c2VycyBmb3IgYW4gQW1hem9uIFEgRGV2ZWxvcGVyIFByb2ZpbGVcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hbWF6b25xL2xhdGVzdC9xZGV2ZWxvcGVyLXVnL3NlY3VyaXR5X2lhbV9tYW5hZ2UtYWNjZXNzLXdpdGgtcG9saWNpZXMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQmF0Y2hEZXNjcmliZVVzZXJzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdCYXRjaERlc2NyaWJlVXNlcnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgbXVsdGlwbGUgZ3JvdXBzIGZvciBhbiBBbWF6b24gUSBEZXZlbG9wZXIgUHJvZmlsZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FtYXpvbnEvbGF0ZXN0L3FkZXZlbG9wZXItdWcvc2VjdXJpdHlfaWFtX21hbmFnZS1hY2Nlc3Mtd2l0aC1wb2xpY2llcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9CYXRjaEdldEdyb3VwcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQmF0Y2hHZXRHcm91cHMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgbXVsdGlwbGUgdXNlcnMgZm9yIGFuIEFtYXpvbiBRIERldmVsb3BlciBQcm9maWxlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYW1hem9ucS9sYXRlc3QvcWRldmVsb3Blci11Zy9zZWN1cml0eV9pYW1fbWFuYWdlLWFjY2Vzcy13aXRoLXBvbGljaWVzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0JhdGNoR2V0VXNlcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0JhdGNoR2V0VXNlcnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYW4gYXJ0aWZhY3Qgd2l0aCBBbWF6b24gUVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hbWF6b25xL2xhdGVzdC9xZGV2ZWxvcGVyLXVnL3NlY3VyaXR5X2lhbV9tYW5hZ2UtYWNjZXNzLXdpdGgtcG9saWNpZXMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlQXJ0aWZhY3QoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZUFydGlmYWN0Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY3JlYXRlIGEgdXNlciBvciBncm91cCBhc3NpZ25tZW50IGZvciBhbiBBbWF6b24gUSBEZXZlbG9wZXIgUHJvZmlsZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmSWRlbnRpdHlzdG9yZVVzZXJJZCgpXG4gICAqIC0gLmlmSWRlbnRpdHlzdG9yZUdyb3VwSWQoKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYW1hem9ucS9sYXRlc3QvcWRldmVsb3Blci11Zy9zZWN1cml0eV9pYW1fbWFuYWdlLWFjY2Vzcy13aXRoLXBvbGljaWVzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZUFzc2lnbm1lbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZUFzc2lnbm1lbnQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgT0F1dGggdXNlciBpbiBBbWF6b24gUVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIERlcGVuZGVudCBhY3Rpb25zOlxuICAgKiAtIGttczpEZWNyeXB0XG4gICAqIC0ga21zOkdlbmVyYXRlRGF0YUtleVdpdGhvdXRQbGFpbnRleHRcbiAgICogLSBrbXM6UmVFbmNyeXB0RnJvbVxuICAgKiAtIGttczpSZUVuY3J5cHRUb1xuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYW1hem9ucS9sYXRlc3QvcWRldmVsb3Blci11Zy9zZWN1cml0eV9pYW1fbWFuYWdlLWFjY2Vzcy13aXRoLXBvbGljaWVzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZUF1dGhHcmFudCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlQXV0aEdyYW50Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmVnaXN0ZXIgYW4gT0F1dGggYXBwbGljYXRpb24gaW4gQW1hem9uIFFcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBEZXBlbmRlbnQgYWN0aW9uczpcbiAgICogLSBrbXM6RGVjcnlwdFxuICAgKiAtIGttczpHZW5lcmF0ZURhdGFLZXlXaXRob3V0UGxhaW50ZXh0XG4gICAqIC0ga21zOlJlRW5jcnlwdEZyb21cbiAgICogLSBrbXM6UmVFbmNyeXB0VG9cbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FtYXpvbnEvbGF0ZXN0L3FkZXZlbG9wZXItdWcvc2VjdXJpdHlfaWFtX21hbmFnZS1hY2Nlc3Mtd2l0aC1wb2xpY2llcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVPQXV0aEFwcENvbm5lY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZU9BdXRoQXBwQ29ubmVjdGlvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhbmQgY29uZmlndXJlIGEgdGhpcmQgcGFydHkgcGx1Z2luIGluIEFtYXpvbiBRXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NUYWdLZXlzKClcbiAgICogLSAuaWZBd3NSZXF1ZXN0VGFnKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FtYXpvbnEvbGF0ZXN0L3FkZXZlbG9wZXItdWcvc2VjdXJpdHlfaWFtX21hbmFnZS1hY2Nlc3Mtd2l0aC1wb2xpY2llcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVQbHVnaW4oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZVBsdWdpbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhIFNDSU0gYWNjZXNzIHRva2VuIGZvciBhbiBBbWF6b24gUSBEZXZlbG9wZXIgUHJvZmlsZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hbWF6b25xL2xhdGVzdC9xZGV2ZWxvcGVyLXVnL3NlY3VyaXR5X2lhbV9tYW5hZ2UtYWNjZXNzLXdpdGgtcG9saWNpZXMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlU2NpbUFjY2Vzc1Rva2VuKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVTY2ltQWNjZXNzVG9rZW4nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgYSB1c2VyIG9yIGdyb3VwIGFzc2lnbm1lbnQgZm9yIGFuIEFtYXpvbiBRIERldmVsb3BlciBQcm9maWxlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZJZGVudGl0eXN0b3JlVXNlcklkKClcbiAgICogLSAuaWZJZGVudGl0eXN0b3JlR3JvdXBJZCgpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hbWF6b25xL2xhdGVzdC9xZGV2ZWxvcGVyLXVnL3NlY3VyaXR5X2lhbV9tYW5hZ2UtYWNjZXNzLXdpdGgtcG9saWNpZXMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlQXNzaWdubWVudCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlQXNzaWdubWVudCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlbGV0ZSBhIGNvbnZlcnNhdGlvbiB3aXRoIEFtYXpvbiBRXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FtYXpvbnEvbGF0ZXN0L3FkZXZlbG9wZXItdWcvc2VjdXJpdHlfaWFtX21hbmFnZS1hY2Nlc3Mtd2l0aC1wb2xpY2llcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVDb252ZXJzYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZUNvbnZlcnNhdGlvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlbGV0ZSBhbiBPQXV0aCBhcHBsaWNhdGlvbiBpbiBBbWF6b24gUVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIERlcGVuZGVudCBhY3Rpb25zOlxuICAgKiAtIGttczpEZWNyeXB0XG4gICAqIC0ga21zOkdlbmVyYXRlRGF0YUtleVdpdGhvdXRQbGFpbnRleHRcbiAgICogLSBrbXM6UmVFbmNyeXB0RnJvbVxuICAgKiAtIGttczpSZUVuY3J5cHRUb1xuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYW1hem9ucS9sYXRlc3QvcWRldmVsb3Blci11Zy9zZWN1cml0eV9pYW1fbWFuYWdlLWFjY2Vzcy13aXRoLXBvbGljaWVzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZU9BdXRoQXBwQ29ubmVjdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlT0F1dGhBcHBDb25uZWN0aW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGEgY29uZmlndXJlZCBwbHVnaW4gaW4gQW1hem9uIFFcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkF3c1Jlc291cmNlVGFnKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FtYXpvbnEvbGF0ZXN0L3FkZXZlbG9wZXItdWcvc2VjdXJpdHlfaWFtX21hbmFnZS1hY2Nlc3Mtd2l0aC1wb2xpY2llcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVQbHVnaW4oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZVBsdWdpbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlbGV0ZSBhIFNDSU0gYWNjZXNzIHRva2VuIGZvciBhbiBBbWF6b24gUSBEZXZlbG9wZXIgUHJvZmlsZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hbWF6b25xL2xhdGVzdC9xZGV2ZWxvcGVyLXVnL3NlY3VyaXR5X2lhbV9tYW5hZ2UtYWNjZXNzLXdpdGgtcG9saWNpZXMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlU2NpbUFjY2Vzc1Rva2VuKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVTY2ltQWNjZXNzVG9rZW4nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkaXNhc3NvY2lhdGUgYSBsb2dpbiBkb21haW4gZnJvbSBhbiBBbWF6b24gUSBEZXZlbG9wZXIgUHJvZmlsZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hbWF6b25xL2xhdGVzdC9xZGV2ZWxvcGVyLXVnL3NlY3VyaXR5X2lhbV9tYW5hZ2UtYWNjZXNzLXdpdGgtcG9saWNpZXMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGlzYXNzb2NpYXRlTG9naW5Eb21haW4oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rpc2Fzc29jaWF0ZUxvZ2luRG9tYWluJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZ2VuZXJhdGUgY29kZSBmcm9tIENMSSBjb21tYW5kcyBpbiBBbWF6b24gUVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FtYXpvbnEvbGF0ZXN0L3FkZXZlbG9wZXItdWcvc2VjdXJpdHlfaWFtX21hbmFnZS1hY2Nlc3Mtd2l0aC1wb2xpY2llcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZW5lcmF0ZUNvZGVGcm9tQ29tbWFuZHMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dlbmVyYXRlQ29kZUZyb21Db21tYW5kcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdlbmVyYXRlIGNvZGUgcmVjb21tZW5kYXRpb25zIGluIEFtYXpvbiBRXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYW1hem9ucS9sYXRlc3QvcWRldmVsb3Blci11Zy9zZWN1cml0eV9pYW1fbWFuYWdlLWFjY2Vzcy13aXRoLXBvbGljaWVzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dlbmVyYXRlQ29kZVJlY29tbWVuZGF0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2VuZXJhdGVDb2RlUmVjb21tZW5kYXRpb25zJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gdmlldyBhbiBBbWF6b24gUSBhcnRpZmFjdFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FtYXpvbnEvbGF0ZXN0L3FkZXZlbG9wZXItdWcvc2VjdXJpdHlfaWFtX21hbmFnZS1hY2Nlc3Mtd2l0aC1wb2xpY2llcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRBcnRpZmFjdCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0QXJ0aWZhY3QnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byB2aWV3IHJlc3VsdHMgb2YgYW4gYWN0aW9uIGluIGFuIEFtYXpvbiBRIGFydGlmYWN0XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBEZXBlbmRlbnQgYWN0aW9uczpcbiAgICogLSBjbG91ZGZvcm1hdGlvbjpHZXRSZXNvdXJjZVxuICAgKiAtIGNsb3VkZm9ybWF0aW9uOkdldFJlc291cmNlUmVxdWVzdFN0YXR1c1xuICAgKiAtIGNsb3VkZm9ybWF0aW9uOkxpc3RSZXNvdXJjZVJlcXVlc3RzXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hbWF6b25xL2xhdGVzdC9xZGV2ZWxvcGVyLXVnL3NlY3VyaXR5X2lhbV9tYW5hZ2UtYWNjZXNzLXdpdGgtcG9saWNpZXMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0QXJ0aWZhY3RBY3Rpb25SZXN1bHQoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldEFydGlmYWN0QWN0aW9uUmVzdWx0Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gdmlldyBpbmZvcm1hdGlvbiBhYm91dCBhIHNwZWNpZmljIEFtYXpvbiBRIGNvbm5lY3RvclxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FtYXpvbnEvbGF0ZXN0L3FkZXZlbG9wZXItdWcvc2VjdXJpdHlfaWFtX21hbmFnZS1hY2Nlc3Mtd2l0aC1wb2xpY2llcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRDb25uZWN0b3IoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldENvbm5lY3RvcicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdldCBpbmRpdmlkdWFsIG1lc3NhZ2VzIGFzc29jaWF0ZWQgd2l0aCBhIHNwZWNpZmljIGNvbnZlcnNhdGlvbiB3aXRoIEFtYXpvbiBRXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYW1hem9ucS9sYXRlc3QvcWRldmVsb