cdk-iam-floyd
Version:
AWS IAM policy statement generator with fluent interface for AWS CDK
1,031 lines • 94.5 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.Aps = void 0;
const shared_1 = require("../../shared");
/**
* Statement provider for service [aps](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amp.html).
*
* @param sid [SID](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_sid.html) of the statement
*/
class Aps extends shared_1.PolicyStatement {
/**
* Grants permission to create alerts
*
* Access Level: Write
*
* https://docs.aws.amazon.com/prometheus/latest/userguide/AMP-APIReference-CreateAlertManagerAlerts.html
*/
toCreateAlertManagerAlerts() {
return this.to('CreateAlertManagerAlerts');
}
/**
* Grants permission to create an alert manager definition
*
* Access Level: Write
*
* https://docs.aws.amazon.com/prometheus/latest/APIReference/API_CreateAlertManagerDefinition.html
*/
toCreateAlertManagerDefinition() {
return this.to('CreateAlertManagerDefinition');
}
/**
* Grants permission to create an anomaly detector
*
* Access Level: Write
*
* https://docs.aws.amazon.com/prometheus/latest/APIReference/API_CreateAnomalyDetector.html
*/
toCreateAnomalyDetector() {
return this.to('CreateAnomalyDetector');
}
/**
* Grants permission to create a logging configuration
*
* Access Level: Write
*
* https://docs.aws.amazon.com/prometheus/latest/APIReference/API_CreateLoggingConfiguration.html
*/
toCreateLoggingConfiguration() {
return this.to('CreateLoggingConfiguration');
}
/**
* Grants permission to create a query logging configuration
*
* Access Level: Write
*
* https://docs.aws.amazon.com/prometheus/latest/APIReference/API_CreateQueryLoggingConfiguration.html
*/
toCreateQueryLoggingConfiguration() {
return this.to('CreateQueryLoggingConfiguration');
}
/**
* Grants permission to create a rule groups namespace
*
* Access Level: Write
*
* https://docs.aws.amazon.com/prometheus/latest/APIReference/API_CreateRuleGroupsNamespace.html
*/
toCreateRuleGroupsNamespace() {
return this.to('CreateRuleGroupsNamespace');
}
/**
* Grants permission to create a scraper
*
* Access Level: Write
*
* https://docs.aws.amazon.com/prometheus/latest/APIReference/API_CreateScraper.html
*/
toCreateScraper() {
return this.to('CreateScraper');
}
/**
* Grants permission to create a workspace
*
* Access Level: Write
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsTagKeys()
*
* https://docs.aws.amazon.com/prometheus/latest/APIReference/API_CreateWorkspace.html
*/
toCreateWorkspace() {
return this.to('CreateWorkspace');
}
/**
* Grants permission to delete an alert manager definition
*
* Access Level: Write
*
* https://docs.aws.amazon.com/prometheus/latest/APIReference/API_DeleteAlertManagerDefinition.html
*/
toDeleteAlertManagerDefinition() {
return this.to('DeleteAlertManagerDefinition');
}
/**
* Grants permission to delete a silence
*
* Access Level: Write
*
* https://docs.aws.amazon.com/prometheus/latest/userguide/AMP-APIReference-DeleteAlertManagerSilence.html
*/
toDeleteAlertManagerSilence() {
return this.to('DeleteAlertManagerSilence');
}
/**
* Grants permission to delete an anomaly detector
*
* Access Level: Write
*
* https://docs.aws.amazon.com/prometheus/latest/APIReference/API_DeleteAnomalyDetector.html
*/
toDeleteAnomalyDetector() {
return this.to('DeleteAnomalyDetector');
}
/**
* Grants permission to delete a logging configuration
*
* Access Level: Write
*
* https://docs.aws.amazon.com/prometheus/latest/APIReference/API_DeleteLoggingConfiguration.html
*/
toDeleteLoggingConfiguration() {
return this.to('DeleteLoggingConfiguration');
}
/**
* Grants permission to delete a query logging configuration
*
* Access Level: Write
*
* https://docs.aws.amazon.com/prometheus/latest/APIReference/API_DeleteQueryLoggingConfiguration.html
*/
toDeleteQueryLoggingConfiguration() {
return this.to('DeleteQueryLoggingConfiguration');
}
/**
* Grants permission to delete workspace resource policy
*
* Access Level: Write
*
* https://docs.aws.amazon.com/prometheus/latest/APIReference/API_DeleteResourcePolicy.html
*/
toDeleteResourcePolicy() {
return this.to('DeleteResourcePolicy');
}
/**
* Grants permission to delete a rule groups namespace
*
* Access Level: Write
*
* https://docs.aws.amazon.com/prometheus/latest/APIReference/API_DeleteRuleGroupsNamespace.html
*/
toDeleteRuleGroupsNamespace() {
return this.to('DeleteRuleGroupsNamespace');
}
/**
* Grants permission to delete a scraper
*
* Access Level: Write
*
* https://docs.aws.amazon.com/prometheus/latest/APIReference/API_DeleteScraper.html
*/
toDeleteScraper() {
return this.to('DeleteScraper');
}
/**
* Grants permission to delete a scraper logging configuration
*
* Access Level: Write
*
* https://docs.aws.amazon.com/prometheus/latest/APIReference/API_DeleteScraperLoggingConfiguration.html
*/
toDeleteScraperLoggingConfiguration() {
return this.to('DeleteScraperLoggingConfiguration');
}
/**
* Grants permission to delete a workspace
*
* Access Level: Write
*
* https://docs.aws.amazon.com/prometheus/latest/APIReference/API_DeleteWorkspace.html
*/
toDeleteWorkspace() {
return this.to('DeleteWorkspace');
}
/**
* Grants permission to describe an alert manager definition
*
* Access Level: Read
*
* https://docs.aws.amazon.com/prometheus/latest/APIReference/API_DescribeAlertManagerDefinition.html
*/
toDescribeAlertManagerDefinition() {
return this.to('DescribeAlertManagerDefinition');
}
/**
* Grants permission to describe an anomaly detector
*
* Access Level: Read
*
* https://docs.aws.amazon.com/prometheus/latest/APIReference/API_DescribeAnomalyDetector.html
*/
toDescribeAnomalyDetector() {
return this.to('DescribeAnomalyDetector');
}
/**
* Grants permission to describe a logging configuration
*
* Access Level: Read
*
* https://docs.aws.amazon.com/prometheus/latest/APIReference/API_DescribeLoggingConfiguration.html
*/
toDescribeLoggingConfiguration() {
return this.to('DescribeLoggingConfiguration');
}
/**
* Grants permission to describe a query logging configuration
*
* Access Level: Read
*
* https://docs.aws.amazon.com/prometheus/latest/APIReference/API_DescribeQueryLoggingConfiguration.html
*/
toDescribeQueryLoggingConfiguration() {
return this.to('DescribeQueryLoggingConfiguration');
}
/**
* Grants permission to describe workspace resource policy
*
* Access Level: Read
*
* https://docs.aws.amazon.com/prometheus/latest/APIReference/API_DescribeResourcePolicy.html
*/
toDescribeResourcePolicy() {
return this.to('DescribeResourcePolicy');
}
/**
* Grants permission to describe a rule groups namespace
*
* Access Level: Read
*
* https://docs.aws.amazon.com/prometheus/latest/APIReference/API_DescribeRuleGroupsNamespace.html
*/
toDescribeRuleGroupsNamespace() {
return this.to('DescribeRuleGroupsNamespace');
}
/**
* Grants permission to describe a scraper
*
* Access Level: Read
*
* https://docs.aws.amazon.com/prometheus/latest/APIReference/API_DescribeScraper.html
*/
toDescribeScraper() {
return this.to('DescribeScraper');
}
/**
* Grants permission to describe a scraper logging configuration
*
* Access Level: Read
*
* https://docs.aws.amazon.com/prometheus/latest/APIReference/API_DescribeScraperLoggingConfiguration.html
*/
toDescribeScraperLoggingConfiguration() {
return this.to('DescribeScraperLoggingConfiguration');
}
/**
* Grants permission to describe a workspace
*
* Access Level: Read
*
* https://docs.aws.amazon.com/prometheus/latest/APIReference/API_DescribeWorkspace.html
*/
toDescribeWorkspace() {
return this.to('DescribeWorkspace');
}
/**
* Grants permission to describe workspace configuration
*
* Access Level: Read
*
* https://docs.aws.amazon.com/prometheus/latest/APIReference/API_DescribeWorkspaceConfiguration.html
*/
toDescribeWorkspaceConfiguration() {
return this.to('DescribeWorkspaceConfiguration');
}
/**
* Grants permission to get a silence
*
* Access Level: Read
*
* https://docs.aws.amazon.com/prometheus/latest/userguide/AMP-APIReference-GetAlertManagerSilence.html
*/
toGetAlertManagerSilence() {
return this.to('GetAlertManagerSilence');
}
/**
* Grants permission to get current status of an alertmanager
*
* Access Level: Read
*
* https://docs.aws.amazon.com/prometheus/latest/userguide/AMP-APIReference-GetAlertManagerStatus.html
*/
toGetAlertManagerStatus() {
return this.to('GetAlertManagerStatus');
}
/**
* Grants permission to get default scraper configuration
*
* Access Level: Read
*
* https://docs.aws.amazon.com/prometheus/latest/APIReference/API_GetDefaultScraperConfiguration.html
*/
toGetDefaultScraperConfiguration() {
return this.to('GetDefaultScraperConfiguration');
}
/**
* Grants permission to retrieve AMP workspace labels
*
* Access Level: Read
*
* https://docs.aws.amazon.com/prometheus/latest/userguide/AMP-APIReference-GetLabels.html
*/
toGetLabels() {
return this.to('GetLabels');
}
/**
* Grants permission to retrieve the metadata for AMP workspace metrics
*
* Access Level: Read
*
* https://docs.aws.amazon.com/prometheus/latest/userguide/AMP-APIReference-GetMetricMetadata.html
*/
toGetMetricMetadata() {
return this.to('GetMetricMetadata');
}
/**
* Grants permission to retrieve AMP workspace time series data
*
* Access Level: Read
*
* https://docs.aws.amazon.com/prometheus/latest/userguide/AMP-APIReference-GetSeries.html
*/
toGetSeries() {
return this.to('GetSeries');
}
/**
* Grants permission to list groups
*
* Access Level: Read
*
* https://docs.aws.amazon.com/prometheus/latest/userguide/AMP-APIReference-ListAlertManagerAlertGroups.html
*/
toListAlertManagerAlertGroups() {
return this.to('ListAlertManagerAlertGroups');
}
/**
* Grants permission to list alerts
*
* Access Level: Read
*
* https://docs.aws.amazon.com/prometheus/latest/userguide/AMP-APIReference-ListAlertManagerAlerts.html
*/
toListAlertManagerAlerts() {
return this.to('ListAlertManagerAlerts');
}
/**
* Grants permission to list receivers
*
* Access Level: Read
*
* https://docs.aws.amazon.com/prometheus/latest/userguide/AMP-APIReference-ListAlertManagerReceivers.html
*/
toListAlertManagerReceivers() {
return this.to('ListAlertManagerReceivers');
}
/**
* Grants permission to list silences
*
* Access Level: Read
*
* https://docs.aws.amazon.com/prometheus/latest/userguide/AMP-APIReference-ListAlertManagerSilences.html
*/
toListAlertManagerSilences() {
return this.to('ListAlertManagerSilences');
}
/**
* Grants permission to list active alerts
*
* Access Level: Read
*
* https://docs.aws.amazon.com/prometheus/latest/userguide/AMP-APIReference-ListAlerts.html
*/
toListAlerts() {
return this.to('ListAlerts');
}
/**
* Grants permission to list anomaly detectors
*
* Access Level: List
*
* https://docs.aws.amazon.com/prometheus/latest/APIReference/API_ListAnomalyDetectors.html
*/
toListAnomalyDetectors() {
return this.to('ListAnomalyDetectors');
}
/**
* Grants permission to list rule groups namespaces
*
* Access Level: List
*
* https://docs.aws.amazon.com/prometheus/latest/APIReference/API_ListRuleGroupsNamespaces.html
*/
toListRuleGroupsNamespaces() {
return this.to('ListRuleGroupsNamespaces');
}
/**
* Grants permission to list alerting and recording rules
*
* Access Level: Read
*
* https://docs.aws.amazon.com/prometheus/latest/userguide/AMP-APIReference-ListRules.html
*/
toListRules() {
return this.to('ListRules');
}
/**
* Grants permission to list scrapers
*
* Access Level: List
*
* https://docs.aws.amazon.com/prometheus/latest/APIReference/API_ListScrapers.html
*/
toListScrapers() {
return this.to('ListScrapers');
}
/**
* Grants permission to list tags on an AMP resource
*
* Access Level: Read
*
* https://docs.aws.amazon.com/prometheus/latest/APIReference/API_ListTagsForResource.html
*/
toListTagsForResource() {
return this.to('ListTagsForResource');
}
/**
* Grants permission to list workspaces
*
* Access Level: List
*
* https://docs.aws.amazon.com/prometheus/latest/APIReference/API_ListWorkspaces.html
*/
toListWorkspaces() {
return this.to('ListWorkspaces');
}
/**
* Grants permission to preview anomaly detection on AMP workspace metrics
*
* Access Level: Read
*
* https://docs.aws.amazon.com/prometheus/latest/userguide/AMP-APIReference-PreviewAnomalyDetector.html
*/
toPreviewAnomalyDetector() {
return this.to('PreviewAnomalyDetector');
}
/**
* Grants permission to update an alert manager definition
*
* Access Level: Write
*
* https://docs.aws.amazon.com/prometheus/latest/APIReference/API_PutAlertManagerDefinition.html
*/
toPutAlertManagerDefinition() {
return this.to('PutAlertManagerDefinition');
}
/**
* Grants permission to create or update a silence
*
* Access Level: Write
*
* https://docs.aws.amazon.com/prometheus/latest/userguide/AMP-APIReference-PutAlertManagerSilences.html
*/
toPutAlertManagerSilences() {
return this.to('PutAlertManagerSilences');
}
/**
* Grants permission to update an anomaly detector
*
* Access Level: Write
*
* https://docs.aws.amazon.com/prometheus/latest/APIReference/API_PutAnomalyDetector.html
*/
toPutAnomalyDetector() {
return this.to('PutAnomalyDetector');
}
/**
* Grants permission to create and update workspace resource policy
*
* Access Level: Write
*
* https://docs.aws.amazon.com/prometheus/latest/APIReference/API_PutResourcePolicy.html
*/
toPutResourcePolicy() {
return this.to('PutResourcePolicy');
}
/**
* Grants permission to update a rule groups namespace
*
* Access Level: Write
*
* https://docs.aws.amazon.com/prometheus/latest/APIReference/API_PutRuleGroupsNamespace.html
*/
toPutRuleGroupsNamespace() {
return this.to('PutRuleGroupsNamespace');
}
/**
* Grants permission to run a query on AMP workspace metrics
*
* Access Level: Read
*
* https://docs.aws.amazon.com/prometheus/latest/userguide/AMP-APIReference-QueryMetrics.html
*/
toQueryMetrics() {
return this.to('QueryMetrics');
}
/**
* Grants permission to perform a remote write operation to initiate the streaming of metrics to AMP workspace
*
* Access Level: Write
*
* https://docs.aws.amazon.com/prometheus/latest/userguide/AMP-APIReference-RemoteWrite.html
*/
toRemoteWrite() {
return this.to('RemoteWrite');
}
/**
* Grants permission to tag an AMP resource
*
* Access Level: Tagging, Write
*
* https://docs.aws.amazon.com/prometheus/latest/APIReference/API_TagResource.html
*/
toTagResource() {
return this.to('TagResource');
}
/**
* Grants permission to untag an AMP resource
*
* Access Level: Tagging, Write
*
* https://docs.aws.amazon.com/prometheus/latest/APIReference/API_UntagResource.html
*/
toUntagResource() {
return this.to('UntagResource');
}
/**
* Grants permission to update a logging configuration
*
* Access Level: Write
*
* https://docs.aws.amazon.com/prometheus/latest/APIReference/API_UpdateLoggingConfiguration.html
*/
toUpdateLoggingConfiguration() {
return this.to('UpdateLoggingConfiguration');
}
/**
* Grants permission to update a query logging configuration
*
* Access Level: Write
*
* https://docs.aws.amazon.com/prometheus/latest/APIReference/API_UpdateQueryLoggingConfiguration.html
*/
toUpdateQueryLoggingConfiguration() {
return this.to('UpdateQueryLoggingConfiguration');
}
/**
* Grants permission to update a scraper
*
* Access Level: Write
*
* https://docs.aws.amazon.com/prometheus/latest/APIReference/API_UpdateScraper.html
*/
toUpdateScraper() {
return this.to('UpdateScraper');
}
/**
* Grants permission to put a scraper logging configuration
*
* Access Level: Write
*
* https://docs.aws.amazon.com/prometheus/latest/APIReference/API_UpdateScraperLoggingConfiguration.html
*/
toUpdateScraperLoggingConfiguration() {
return this.to('UpdateScraperLoggingConfiguration');
}
/**
* Grants permission to modify the alias of existing AMP workspace
*
* Access Level: Write
*
* https://docs.aws.amazon.com/prometheus/latest/APIReference/API_UpdateWorkspaceAlias.html
*/
toUpdateWorkspaceAlias() {
return this.to('UpdateWorkspaceAlias');
}
/**
* Grants permission to update workspace configuration
*
* Access Level: Write
*
* https://docs.aws.amazon.com/prometheus/latest/APIReference/API_UpdateWorkspaceConfiguration.html
*/
toUpdateWorkspaceConfiguration() {
return this.to('UpdateWorkspaceConfiguration');
}
/**
* Adds a resource of type anomalydetector to the statement
*
* https://docs.aws.amazon.com/prometheus/latest/userguide/security-iam.html
*
* @param workspaceId - Identifier for the workspaceId.
* @param anomalyDetectorId - Identifier for the anomalyDetectorId.
* @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:
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
* - .ifAwsTagKeys()
*/
onAnomalydetector(workspaceId, anomalyDetectorId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:aps:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:anomalydetector/${workspaceId}/${anomalyDetectorId}`);
}
/**
* Adds a resource of type cluster to the statement
*
* https://docs.aws.amazon.com/eks/latest/userguide/clusters.html
*
* @param clusterName - Identifier for the clusterName.
* @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()
*/
onCluster(clusterName, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:eks:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:cluster/${clusterName}`);
}
/**
* Adds a resource of type rulegroupsnamespace to the statement
*
* https://docs.aws.amazon.com/prometheus/latest/userguide/security-iam.html
*
* @param workspaceId - Identifier for the workspaceId.
* @param namespace - Identifier for the namespace.
* @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:
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
* - .ifAwsTagKeys()
*/
onRulegroupsnamespace(workspaceId, namespace, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:aps:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:rulegroupsnamespace/${workspaceId}/${namespace}`);
}
/**
* Adds a resource of type scraper to the statement
*
* https://docs.aws.amazon.com/prometheus/latest/userguide/security-iam.html
*
* @param scraperId - Identifier for the scraperId.
* @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:
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
* - .ifAwsTagKeys()
*/
onScraper(scraperId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:aps:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:scraper/${scraperId}`);
}
/**
* Adds a resource of type workspace to the statement
*
* https://docs.aws.amazon.com/prometheus/latest/userguide/security-iam.html
*
* @param workspaceId - Identifier for the workspaceId.
* @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:
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
* - .ifAwsTagKeys()
*/
onWorkspace(workspaceId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:aps:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:workspace/${workspaceId}`);
}
/**
* Filters access based on the tags that are passed in the request
*
* https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-requesttag
*
* Applies to actions:
* - .toCreateAlertManagerAlerts()
* - .toCreateAlertManagerDefinition()
* - .toCreateAnomalyDetector()
* - .toCreateLoggingConfiguration()
* - .toCreateQueryLoggingConfiguration()
* - .toCreateRuleGroupsNamespace()
* - .toCreateScraper()
* - .toCreateWorkspace()
* - .toDeleteAlertManagerDefinition()
* - .toDeleteAlertManagerSilence()
* - .toDeleteAnomalyDetector()
* - .toDeleteLoggingConfiguration()
* - .toDeleteQueryLoggingConfiguration()
* - .toDeleteResourcePolicy()
* - .toDeleteRuleGroupsNamespace()
* - .toDeleteScraper()
* - .toDeleteScraperLoggingConfiguration()
* - .toDeleteWorkspace()
* - .toDescribeAlertManagerDefinition()
* - .toDescribeAnomalyDetector()
* - .toDescribeLoggingConfiguration()
* - .toDescribeQueryLoggingConfiguration()
* - .toDescribeResourcePolicy()
* - .toDescribeRuleGroupsNamespace()
* - .toDescribeScraper()
* - .toDescribeScraperLoggingConfiguration()
* - .toDescribeWorkspace()
* - .toDescribeWorkspaceConfiguration()
* - .toGetAlertManagerSilence()
* - .toGetAlertManagerStatus()
* - .toGetLabels()
* - .toGetMetricMetadata()
* - .toGetSeries()
* - .toListAlertManagerAlertGroups()
* - .toListAlertManagerAlerts()
* - .toListAlertManagerReceivers()
* - .toListAlertManagerSilences()
* - .toListAlerts()
* - .toListAnomalyDetectors()
* - .toListRuleGroupsNamespaces()
* - .toListRules()
* - .toListTagsForResource()
* - .toPreviewAnomalyDetector()
* - .toPutAlertManagerDefinition()
* - .toPutAlertManagerSilences()
* - .toPutAnomalyDetector()
* - .toPutResourcePolicy()
* - .toPutRuleGroupsNamespace()
* - .toQueryMetrics()
* - .toRemoteWrite()
* - .toTagResource()
* - .toUntagResource()
* - .toUpdateLoggingConfiguration()
* - .toUpdateQueryLoggingConfiguration()
* - .toUpdateScraper()
* - .toUpdateScraperLoggingConfiguration()
* - .toUpdateWorkspaceAlias()
* - .toUpdateWorkspaceConfiguration()
*
* Applies to resource types:
* - anomalydetector
* - rulegroupsnamespace
* - scraper
* - workspace
*
* @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 based on the tags associated with the resource
*
* https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-resourcetag
*
* Applies to actions:
* - .toCreateAlertManagerAlerts()
* - .toCreateAlertManagerDefinition()
* - .toCreateAnomalyDetector()
* - .toCreateLoggingConfiguration()
* - .toCreateQueryLoggingConfiguration()
* - .toCreateRuleGroupsNamespace()
* - .toCreateScraper()
* - .toDeleteAlertManagerDefinition()
* - .toDeleteAlertManagerSilence()
* - .toDeleteAnomalyDetector()
* - .toDeleteLoggingConfiguration()
* - .toDeleteQueryLoggingConfiguration()
* - .toDeleteResourcePolicy()
* - .toDeleteRuleGroupsNamespace()
* - .toDeleteScraper()
* - .toDeleteScraperLoggingConfiguration()
* - .toDeleteWorkspace()
* - .toDescribeAlertManagerDefinition()
* - .toDescribeAnomalyDetector()
* - .toDescribeLoggingConfiguration()
* - .toDescribeQueryLoggingConfiguration()
* - .toDescribeResourcePolicy()
* - .toDescribeRuleGroupsNamespace()
* - .toDescribeScraper()
* - .toDescribeScraperLoggingConfiguration()
* - .toDescribeWorkspace()
* - .toDescribeWorkspaceConfiguration()
* - .toGetAlertManagerSilence()
* - .toGetAlertManagerStatus()
* - .toGetLabels()
* - .toGetMetricMetadata()
* - .toGetSeries()
* - .toListAlertManagerAlertGroups()
* - .toListAlertManagerAlerts()
* - .toListAlertManagerReceivers()
* - .toListAlertManagerSilences()
* - .toListAlerts()
* - .toListAnomalyDetectors()
* - .toListRuleGroupsNamespaces()
* - .toListRules()
* - .toListTagsForResource()
* - .toPreviewAnomalyDetector()
* - .toPutAlertManagerDefinition()
* - .toPutAlertManagerSilences()
* - .toPutAnomalyDetector()
* - .toPutResourcePolicy()
* - .toPutRuleGroupsNamespace()
* - .toQueryMetrics()
* - .toRemoteWrite()
* - .toTagResource()
* - .toUntagResource()
* - .toUpdateLoggingConfiguration()
* - .toUpdateQueryLoggingConfiguration()
* - .toUpdateScraper()
* - .toUpdateScraperLoggingConfiguration()
* - .toUpdateWorkspaceAlias()
* - .toUpdateWorkspaceConfiguration()
*
* Applies to resource types:
* - anomalydetector
* - cluster
* - rulegroupsnamespace
* - scraper
* - workspace
*
* @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 based on the tag keys that are passed in the request
*
* https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-tagkeys
*
* Applies to actions:
* - .toCreateAlertManagerAlerts()
* - .toCreateAlertManagerDefinition()
* - .toCreateAnomalyDetector()
* - .toCreateLoggingConfiguration()
* - .toCreateQueryLoggingConfiguration()
* - .toCreateRuleGroupsNamespace()
* - .toCreateScraper()
* - .toCreateWorkspace()
* - .toDeleteAlertManagerDefinition()
* - .toDeleteAlertManagerSilence()
* - .toDeleteAnomalyDetector()
* - .toDeleteLoggingConfiguration()
* - .toDeleteQueryLoggingConfiguration()
* - .toDeleteResourcePolicy()
* - .toDeleteRuleGroupsNamespace()
* - .toDeleteScraper()
* - .toDeleteScraperLoggingConfiguration()
* - .toDeleteWorkspace()
* - .toDescribeAlertManagerDefinition()
* - .toDescribeAnomalyDetector()
* - .toDescribeLoggingConfiguration()
* - .toDescribeQueryLoggingConfiguration()
* - .toDescribeResourcePolicy()
* - .toDescribeRuleGroupsNamespace()
* - .toDescribeScraper()
* - .toDescribeScraperLoggingConfiguration()
* - .toDescribeWorkspace()
* - .toDescribeWorkspaceConfiguration()
* - .toGetAlertManagerSilence()
* - .toGetAlertManagerStatus()
* - .toGetLabels()
* - .toGetMetricMetadata()
* - .toGetSeries()
* - .toListAlertManagerAlertGroups()
* - .toListAlertManagerAlerts()
* - .toListAlertManagerReceivers()
* - .toListAlertManagerSilences()
* - .toListAlerts()
* - .toListAnomalyDetectors()
* - .toListRuleGroupsNamespaces()
* - .toListRules()
* - .toListTagsForResource()
* - .toPreviewAnomalyDetector()
* - .toPutAlertManagerDefinition()
* - .toPutAlertManagerSilences()
* - .toPutAnomalyDetector()
* - .toPutResourcePolicy()
* - .toPutRuleGroupsNamespace()
* - .toQueryMetrics()
* - .toRemoteWrite()
* - .toTagResource()
* - .toUntagResource()
* - .toUpdateLoggingConfiguration()
* - .toUpdateQueryLoggingConfiguration()
* - .toUpdateScraper()
* - .toUpdateScraperLoggingConfiguration()
* - .toUpdateWorkspaceAlias()
* - .toUpdateWorkspaceConfiguration()
*
* Applies to resource types:
* - anomalydetector
* - rulegroupsnamespace
* - scraper
* - workspace
*
* @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');
}
/**
* Statement provider for service [aps](https://docs.aws.amazon.com/service-authorization/latest/reference/list_amp.html).
*
*/
constructor(props) {
super(props);
this.servicePrefix = 'aps';
this.accessLevelList = {
Write: [
'CreateAlertManagerAlerts',
'CreateAlertManagerDefinition',
'CreateAnomalyDetector',
'CreateLoggingConfiguration',
'CreateQueryLoggingConfiguration',
'CreateRuleGroupsNamespace',
'CreateScraper',
'CreateWorkspace',
'DeleteAlertManagerDefinition',
'DeleteAlertManagerSilence',
'DeleteAnomalyDetector',
'DeleteLoggingConfiguration',
'DeleteQueryLoggingConfiguration',
'DeleteResourcePolicy',
'DeleteRuleGroupsNamespace',
'DeleteScraper',
'DeleteScraperLoggingConfiguration',
'DeleteWorkspace',
'PutAlertManagerDefinition',
'PutAlertManagerSilences',
'PutAnomalyDetector',
'PutResourcePolicy',
'PutRuleGroupsNamespace',
'RemoteWrite',
'TagResource',
'UntagResource',
'UpdateLoggingConfiguration',
'UpdateQueryLoggingConfiguration',
'UpdateScraper',
'UpdateScraperLoggingConfiguration',
'UpdateWorkspaceAlias',
'UpdateWorkspaceConfiguration'
],
Read: [
'DescribeAlertManagerDefinition',
'DescribeAnomalyDetector',
'DescribeLoggingConfiguration',
'DescribeQueryLoggingConfiguration',
'DescribeResourcePolicy',
'DescribeRuleGroupsNamespace',
'DescribeScraper',
'DescribeScraperLoggingConfiguration',
'DescribeWorkspace',
'DescribeWorkspaceConfiguration',
'GetAlertManagerSilence',
'GetAlertManagerStatus',
'GetDefaultScraperConfiguration',
'GetLabels',
'GetMetricMetadata',
'GetSeries',
'ListAlertManagerAlertGroups',
'ListAlertManagerAlerts',
'ListAlertManagerReceivers',
'ListAlertManagerSilences',
'ListAlerts',
'ListRules',
'ListTagsForResource',
'PreviewAnomalyDetector',
'QueryMetrics'
],
List: [
'ListAnomalyDetectors',
'ListRuleGroupsNamespaces',
'ListScrapers',
'ListWorkspaces'
],
Tagging: [
'TagResource',
'UntagResource'
]
};
}
}
exports.Aps = Aps;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW1wLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYW1wLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLHlDQUF5RDtBQUd6RDs7OztHQUlHO0FBQ0gsTUFBYSxHQUFJLFNBQVEsd0JBQWU7SUFHdEM7Ozs7OztPQU1HO0lBQ0ksMEJBQTBCO1FBQy9CLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSw4QkFBOEI7UUFDbkMsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLDhCQUE4QixDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLHVCQUF1QjtRQUM1QixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsdUJBQXVCLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksNEJBQTRCO1FBQ2pDLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxpQ0FBaUM7UUFDdEMsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLGlDQUFpQyxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLDJCQUEyQjtRQUNoQyxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsMkJBQTJCLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksZUFBZTtRQUNwQixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVEOzs7Ozs7Ozs7O09BVUc7SUFDSSxpQkFBaUI7UUFDdEIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLDhCQUE4QjtRQUNuQyxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsOEJBQThCLENB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QkFDWCxxQkFBcUI7Z0JBQ3JCLHdCQUF3QjtnQkFDeEIsY0FBYzthQUNmO1lBQ0QsSUFBSSxFQUFFO2dCQUNKLHNCQUFzQjtnQkFDdEIsMEJBQTBCO2dCQUMxQixjQUFjO2dCQUNkLGdCQUFnQjthQUNqQjtZQUNELE9BQU8sRUFBRTtnQkFDUCxhQUFhO2dCQUNiLGVBQWU7YUFDaEI7U0FDRixDQUFDO0lBbVZGLENBQUM7Q0FDRjtBQWxrQ0Qsa0JBa2tDQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFjY2Vzc0xldmVsTGlzdCB9IGZyb20gJy4uLy4uL3NoYXJlZC9hY2Nlc3MtbGV2ZWwnO1xuaW1wb3J0IHsgUG9saWN5U3RhdGVtZW50LCBPcGVyYXRvciB9IGZyb20gJy4uLy4uL3NoYXJlZCc7XG5pbXBvcnQgeyBhd3NfaWFtIGFzIGlhbSB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuXG4vKipcbiAqIFN0YXRlbWVudCBwcm92aWRlciBmb3Igc2VydmljZSBbYXBzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc2VydmljZS1hdXRob3JpemF0aW9uL2xhdGVzdC9yZWZlcmVuY2UvbGlzdF9hbXAuaHRtbCkuXG4gKlxuICogQHBhcmFtIHNpZCBbU0lEXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX3NpZC5odG1sKSBvZiB0aGUgc3RhdGVtZW50XG4gKi9cbmV4cG9ydCBjbGFzcyBBcHMgZXh0ZW5kcyBQb2xpY3lTdGF0ZW1lbnQge1xuICBwdWJsaWMgc2VydmljZVByZWZpeCA9ICdhcHMnO1xuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYWxlcnRzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3Byb21ldGhldXMvbGF0ZXN0L3VzZXJndWlkZS9BTVAtQVBJUmVmZXJlbmNlLUNyZWF0ZUFsZXJ0TWFuYWdlckFsZXJ0cy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVBbGVydE1hbmFnZXJBbGVydHMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZUFsZXJ0TWFuYWdlckFsZXJ0cycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhbiBhbGVydCBtYW5hZ2VyIGRlZmluaXRpb25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcHJvbWV0aGV1cy9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9DcmVhdGVBbGVydE1hbmFnZXJEZWZpbml0aW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZUFsZXJ0TWFuYWdlckRlZmluaXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZUFsZXJ0TWFuYWdlckRlZmluaXRpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYW4gYW5vbWFseSBkZXRlY3RvclxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wcm9tZXRoZXVzL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0NyZWF0ZUFub21hbHlEZXRlY3Rvci5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVBbm9tYWx5RGV0ZWN0b3IoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZUFub21hbHlEZXRlY3RvcicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhIGxvZ2dpbmcgY29uZmlndXJhdGlvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wcm9tZXRoZXVzL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0NyZWF0ZUxvZ2dpbmdDb25maWd1cmF0aW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZUxvZ2dpbmdDb25maWd1cmF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVMb2dnaW5nQ29uZmlndXJhdGlvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhIHF1ZXJ5IGxvZ2dpbmcgY29uZmlndXJhdGlvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wcm9tZXRoZXVzL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0NyZWF0ZVF1ZXJ5TG9nZ2luZ0NvbmZpZ3VyYXRpb24uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlUXVlcnlMb2dnaW5nQ29uZmlndXJhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlUXVlcnlMb2dnaW5nQ29uZmlndXJhdGlvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhIHJ1bGUgZ3JvdXBzIG5hbWVzcGFjZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wcm9tZXRoZXVzL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0NyZWF0ZVJ1bGVHcm91cHNOYW1lc3BhY2UuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlUnVsZUdyb3Vwc05hbWVzcGFjZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlUnVsZUdyb3Vwc05hbWVzcGFjZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhIHNjcmFwZXJcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcHJvbWV0aGV1cy9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9DcmVhdGVTY3JhcGVyLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZVNjcmFwZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZVNjcmFwZXInKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYSB3b3Jrc3BhY2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkF3c1JlcXVlc3RUYWcoKVxuICAgKiAtIC5pZkF3c1RhZ0tleXMoKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcHJvbWV0aGV1cy9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9DcmVhdGVXb3Jrc3BhY2UuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlV29ya3NwYWNlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVXb3Jrc3BhY2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgYW4gYWxlcnQgbWFuYWdlciBkZWZpbml0aW9uXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3Byb21ldGhldXMvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVsZXRlQWxlcnRNYW5hZ2VyRGVmaW5pdGlvbi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVBbGVydE1hbmFnZXJEZWZpbml0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVBbGVydE1hbmFnZXJEZWZpbml0aW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGEgc2lsZW5jZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wcm9tZXRoZXVzL2xhdGVzdC91c2VyZ3VpZGUvQU1QLUFQSVJlZmVyZW5jZS1EZWxldGVBbGVydE1hbmFnZXJTaWxlbmNlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZUFsZXJ0TWFuYWdlclNpbGVuY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZUFsZXJ0TWFuYWdlclNpbGVuY2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgYW4gYW5vbWFseSBkZXRlY3RvclxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wcm9tZXRoZXVzL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0RlbGV0ZUFub21hbHlEZXRlY3Rvci5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVBbm9tYWx5RGV0ZWN0b3IoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZUFub21hbHlEZXRlY3RvcicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlbGV0ZSBhIGxvZ2dpbmcgY29uZmlndXJhdGlvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wcm9tZXRoZXVzL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0RlbGV0ZUxvZ2dpbmdDb25maWd1cmF0aW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZUxvZ2dpbmdDb25maWd1cmF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVMb2dnaW5nQ29uZmlndXJhdGlvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlbGV0ZSBhIHF1ZXJ5IGxvZ2dpbmcgY29uZmlndXJhdGlvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wcm9tZXRoZXVzL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0RlbGV0ZVF1ZXJ5TG9nZ2luZ0NvbmZpZ3VyYXRpb24uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlUXVlcnlMb2dnaW5nQ29uZmlndXJhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlUXVlcnlMb2dnaW5nQ29uZmlndXJhdGlvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlbGV0ZSB3b3Jrc3BhY2UgcmVzb3VyY2UgcG9saWN5XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3Byb21ldGhldXMvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVsZXRlUmVzb3VyY2VQb2xpY3kuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlUmVzb3VyY2VQb2xpY3koKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZVJlc291cmNlUG9saWN5Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGEgcnVsZSBncm91cHMgbmFtZXNwYWNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3Byb21ldGhldXMvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVsZXRlUnVsZUdyb3Vwc05hbWVzcGFjZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVSdWxlR3JvdXBzTmFtZXNwYWNlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVSdWxlR3JvdXBzTmFtZXNwYWNlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGEgc2NyYXBlclxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wcm9tZXRoZXVzL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0RlbGV0ZVNjcmFwZXIuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlU2NyYXBlcigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlU2NyYXBlcicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlbGV0ZSBhIHNjcmFwZXIgbG9nZ2luZyBjb25maWd1cmF0aW9uXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3Byb21ldGhldXMvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVsZXRlU2NyYXBlckxvZ2dpbmdDb25maWd1cmF0aW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZVNjcmFwZXJMb2dnaW5nQ29uZmlndXJhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlU2NyYXBlckxvZ2dpbmdDb25maWd1cmF0aW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGEgd29ya3NwYWNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3Byb21ldGhldXMvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVsZXRlV29ya3NwYWNlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZVdvcmtzcGFjZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlV29ya3NwYWNlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVzY3JpYmUgYW4gYWxlcnQgbWFuYWdlciBkZWZpbml0aW9uXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcHJvbWV0aGV1cy9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZXNjcmliZUFsZXJ0TWFuYWdlckRlZmluaXRpb24uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVzY3JpYmVBbGVydE1hbmFnZXJEZWZpbml0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZXNjcmliZUFsZXJ0TWFuYWdlckRlZmluaXRpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZXNjcmliZSBhbiBhbm9tYWx5IGRldGVjdG9yXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcHJvbWV0aGV1cy9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZXNjcmliZUFub21hbHlEZXRlY3Rvci5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZXNjcmliZUFub21hbHlEZXRlY3RvcigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVzY3JpYmVBbm9tYWx5RGV0ZWN0b3InKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZXNjcmliZSBhIGxvZ2dpbmcgY29uZmlndXJhdGlvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3Byb21ldGhldXMvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVzY3JpYmVMb2dnaW5nQ29uZmlndXJhdGlvbi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZXNjcmliZUxvZ2dpbmdDb25maWd1cmF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZXNjcmliZUxvZ2dpbmdDb25maWd1cmF0aW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVzY3JpYmUgYSBxdWVyeSBsb2dnaW5nIGNvbmZpZ3VyYXRpb25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wcm9tZXRoZXVzL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Rlc2NyaWJlUXVlcnlMb2dnaW5nQ29uZmlndXJhdGlvbi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZXNjcmliZVF1ZXJ5TG9nZ2luZ0NvbmZpZ3VyYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rlc2NyaWJlUXVlcnlMb2dnaW5nQ29uZmlndXJhdGlvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlc2NyaWJlIHdvcmtzcGFjZSByZXNvdXJjZSBwb2xpY3lcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wcm9tZXRoZXVzL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Rlc2NyaWJlUmVzb3VyY2VQb2xpY3kuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVzY3JpYmVSZXNvdXJjZVBvbGljeSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVzY3JpYmVSZXNvdXJjZVBvbGljeScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlc2NyaWJlIGEgcnVsZSBncm91cHMgbmFtZXNwYWNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcHJvbWV0aGV1cy9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZXNjcmliZVJ1bGVHcm91cHNOYW1lc3BhY2UuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVzY3JpYmVSdWxlR3JvdXBzTmFtZXNwYWNlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZXNjcmliZVJ1bGVHcm91cHNOYW1lc3BhY2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZXNjcmliZSBhIHNjcmFwZXJcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wcm9tZXRoZXVzL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Rlc2NyaWJlU2NyYXBlci5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZXNjcmliZVNjcmFwZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rlc2NyaWJlU2NyYXBlcicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlc2NyaWJlIGEgc2NyYXBlciBsb2dnaW5nIGNvbmZpZ3VyYXRpb25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wcm9tZXRoZXVzL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0Rlc2NyaWJlU2NyYXBlckxvZ2dpbmdDb25maWd1cmF0aW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rlc2NyaWJlU2NyYXBlckxvZ2dpbmdDb25maWd1cmF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZXNjcmliZVNjcmFwZXJMb2dnaW5nQ29uZmlndXJhdGlvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlc2NyaWJlIGEgd29ya3NwYWNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcHJvbWV0aGV1cy9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZXNjcmliZVdvcmtzcGFjZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZXNjcmliZVdvcmtzcGFjZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVzY3JpYmVXb3Jrc3BhY2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZXNjcmliZSB3b3Jrc3BhY2UgY29uZmlndXJhdGlvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3Byb21ldGhldXMvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVzY3JpYmVXb3Jrc3BhY2VDb25maWd1cmF0aW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rlc2NyaWJlV29ya3NwYWNlQ29uZmlndXJhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVzY3JpYmVXb3Jrc3BhY2VDb25maWd1cmF0aW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZ2V0IGEgc2lsZW5jZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3Byb21ldGhldXMvbGF0ZXN0L3VzZXJndWlkZS9BTVAtQVBJUmVmZXJlbmNlLUdldEFsZXJ0TWFuYWdlclNpbGVuY2UuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0QWxlcnRNYW5hZ2VyU2lsZW5jZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0QWxlcnRNYW5hZ2VyU2lsZW5jZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdldCBjdXJyZW50IHN0YXR1cyBvZiBhbiBhbGVydG1hbmFnZXJcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wcm9tZXRoZXVzL2xhdGVzdC91c2VyZ3VpZGUvQU1QLUFQSVJlZmVyZW5jZS1HZXRBbGVydE1hbmFnZXJTdGF0dXMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0QWxlcnRNYW5hZ2VyU3RhdHVzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRBbGVydE1hbmFnZXJTdGF0dXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgZGVmYXVsdCBzY3JhcGVyIGNvbmZpZ3VyYXRpb25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wcm9tZXRoZXVzL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0dldERlZmF1bHRTY3JhcGVyQ29uZmlndXJhdGlvbi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXREZWZhdWx0U2NyYXBlckNvbmZpZ3VyYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldERlZmF1bHRTY3JhcGVyQ29uZmlndXJhdGlvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJldHJpZXZlIEFNUCB3b3Jrc3BhY2UgbGFiZWxzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcHJvbWV0aGV1cy9sYXRlc3QvdXNlcmd1aWRlL0FNUC1BUElSZWZlcmVuY2UtR2V0TGFiZWxzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldExhYmVscygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0TGFiZWxzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmV0cmlldmUgdGhlIG1ldGFkYXRhIGZvciBBTVAgd29ya3NwYWNlIG1ldHJpY3NcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wcm9tZXRoZXVzL2xhdGVzdC91c2VyZ3VpZGUvQU1QLUFQSVJlZmVyZW5jZS1HZXRNZXRyaWNNZXRhZGF0YS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRNZXRyaWNNZXRhZGF0YSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0TWV0cmljTWV0YWRhdGEnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXRyaWV2ZSBBTVAgd29ya3NwYWNlIHRpbWUgc2VyaWVzIGRhdGFcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wcm9tZXRoZXVzL2xhdGVzdC91c2VyZ3VpZGUvQU1QLUFQSVJlZmVyZW5jZS1HZXRTZXJpZXMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0U2VyaWVzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRTZXJpZXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0IGdyb3Vwc1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3Byb21ldGhldXMvbGF0ZXN0L3VzZXJndWlkZS9BTVAtQVBJUmVmZXJlbmNlLUxpc3RBbGVydE1hbmFnZXJBbGVydEdyb3Vwcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0QWxlcnRNYW5hZ2VyQWxlcnRHcm91cHMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RBbGVydE1hbmFnZXJBbGVydEdyb3VwcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgYWxlcnRzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcHJvbWV0aGV1cy9sYXRlc3QvdXNlcmd1aWRlL0FNUC1BUElSZWZlcmVuY2UtTGlzdEFsZXJ0TWFuYWdlckFsZXJ0cy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0QWxlcnRNYW5hZ2VyQWxlcnRzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0QWxlcnRNYW5hZ2VyQWxlcnRzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCByZWNlaXZlcnNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wcm9tZXRoZXVzL2xhdGVzdC91c2VyZ3VpZGUvQU1QLUFQSVJlZmVyZW5jZS1MaXN0QWxlcnRNYW5hZ2VyUmVjZWl2ZXJzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RBbGVydE1hbmFnZXJSZWNlaXZlcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RBbGVydE1hbmFnZXJSZWNlaXZlcnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0IHNpbGVuY2VzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcHJvbWV0aGV1cy9sYXRlc3QvdXNlcmd1aWRlL0FNUC1BUElSZWZlcmVuY2UtTGlzdEFsZXJ0TWFuYWdlclNpbGVuY2VzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RBbGVydE1hbmFnZXJTaWxlbmNlcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdEFsZXJ0TWFuYWdlclNpbGVuY2VzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCBhY3RpdmUgYWxlcnRzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcHJvbWV0aGV1cy9sYXRlc3QvdXNlcmd1aWRlL0FNUC1BUElSZWZlcmVuY2UtTGlzdEFsZXJ0cy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0QWxlcnRzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0QWxlcnRzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCBhbm9tYWx5IGRldGVjdG9yc1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3Byb21ldGhldXMvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTGlzdEFub21hbHlEZXRlY3RvcnMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdEFub21hbHlEZXRlY3RvcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RBbm9tYWx5RGV0ZWN0b3JzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCBydWxlIGdyb3VwcyBuYW1lc3BhY2VzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcHJvbWV0aGV1cy9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9MaXN0UnVsZUdyb3Vwc05hbWVzcGFjZXMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdFJ1bGVHcm91cHNOYW1lc3BhY2VzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0UnVsZUdyb3Vwc05hbWVzcGFjZXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0IGFsZXJ0aW5nIGFuZCByZWNvcmRpbmcgcnVsZXNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wcm9tZXRoZXVzL2xhdGVzdC91c2VyZ3VpZGUvQU1QLUFQSVJlZmVyZW5jZS1MaXN0UnVsZXMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdFJ1bGVzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0UnVsZXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0IHNjcmFwZXJzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcHJvbWV0aGV1cy9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9MaXN0U2NyYXBlcnMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdFNjcmFwZXJzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0U2NyYXBlcnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0IHRhZ3Mgb24gYW4gQU1QIHJlc291cmNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcHJvbWV0aGV1cy9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9MaXN0VGFnc0ZvclJlc291cmNlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RUYWdzRm9yUmVzb3VyY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RUYWdzRm9yUmVzb3VyY2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0IHdvcmtzcGFjZXNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wcm9tZXRoZXVzL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0xpc3RXb3Jrc3BhY2VzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RXb3Jrc3BhY2VzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0V29ya3NwYWNlcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHByZXZpZXcgYW5vbWFseSBkZXRlY3Rpb24gb24gQU1QIHdvcmtzcGFjZSBtZXRyaWNzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcHJvbWV0aGV1cy9sYXRlc3QvdXNlcmd1aWRlL0FNUC1BUElSZWZlcmVuY2UtUHJldmlld0Fub21hbHlEZXRlY3Rvci5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9QcmV2aWV3QW5vbWFseURldGVjdG9yKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdQcmV2aWV3QW5vbWFseURldGVjdG9yJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gdXBkYXRlIGFuIGFsZXJ0IG1hbmFnZXIgZGVmaW5pdGlvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wcm9tZXRoZXVzL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX1B1dEFsZXJ0TWFuYWdlckRlZmluaXRpb24uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvUHV0QWxlcnRNYW5hZ2VyRGVmaW5pdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnUHV0QWxlcnRNYW5hZ2VyRGVmaW5pdGlvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBvciB1cGRhdGUgYSBzaWxlbmNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3Byb21ldGhldXMvbGF0ZXN0L3VzZXJndWlkZS9BTVAtQVBJUmVmZXJlbmNlLVB1dEFsZXJ0TWFuYWdlclNpbGVuY2VzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1B1dEFsZXJ0TWFuYWdlclNpbGVuY2VzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdQdXRBbGVydE1hbmFnZXJTaWxlbmNlcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHVwZGF0ZSBhbiBhbm9tYWx5IGRldGVjdG9yXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3Byb21ldGhldXMvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfUHV0QW5vbWFseURldGVjdG9yLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1B1dEFub21hbHlEZXRlY3RvcigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnUHV0QW5vbWFseURldGVjdG9yJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY3JlYXRlIGFuZCB1cGRhdGUgd29ya3NwYWNlIHJlc291cmNlIHBvbGljeVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wcm9tZXRoZXVzL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX1B1dFJlc291cmNlUG9saWN5Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1B1dFJlc291cmNlUG9saWN5KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdQdXRSZXNvdXJjZVBvbGljeScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHVwZGF0ZSBhIHJ1bGUgZ3JvdXBzIG5hbWVzcGFjZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wcm9tZXRoZXVzL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX1B1dFJ1bGVHcm91cHNOYW1lc3BhY2UuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvUHV0UnVsZUdyb3Vwc05hbWVzcGFjZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnUHV0UnVsZUdyb3Vwc05hbWVzcGFjZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJ1biBhIHF1ZXJ5IG9uIEFNUCB3b3Jrc3BhY2UgbWV0cmljc1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3Byb21ldGhldXMvbGF0ZXN0L3VzZXJndWlkZS9BTVAtQVBJUmVmZXJlbmNlLVF1ZXJ5TWV0cmljcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9RdWVyeU1ldHJpY3MoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1F1ZXJ5TWV0cmljcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHBlcmZvcm0gYSByZW1vdGUgd3JpdGUgb3BlcmF0aW9uIHRvIGluaXRpYXRlIHRoZSBzdHJlYW1pbmcgb2YgbWV0cmljcyB0byBBTVAgd29ya3NwYWNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3Byb21ldGhldXMvbGF0ZXN0L3VzZXJndWlkZS9BTVAtQVBJUmVmZXJlbmNlLVJlbW90ZVdyaXRlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1JlbW90ZVdyaXRlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdSZW1vdGVXcml0ZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHRhZyBhbiBBTVAgcmVzb3VyY2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBUYWdnaW5nLCBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcHJvbWV0aGV1cy9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9UYWdSZXNvdXJjZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9UYWdSZXNvdXJjZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVGFnUmVzb3VyY2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byB1bnRhZyBhbiBBTVAgcmVzb3VyY2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBUYWdnaW5nLCBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcHJvbWV0aGV1cy9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9VbnRhZ1Jlc291cmNlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1VudGFnUmVzb3VyY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1VudGFnUmVzb3VyY2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byB1cGRhdGUgYSBsb2dnaW5nIGNvbmZpZ3VyYXRpb25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcHJvbWV0aGV1cy9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9VcGRhdGVMb2dnaW5nQ29uZmlndXJhdGlvbi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9VcGRhdGVMb2dnaW5nQ29uZmlndXJhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVXBkYXRlTG9nZ2luZ0NvbmZpZ3VyYXRpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byB1cGRhdGUgYSBxdWVyeSBsb2dnaW5nIGNvbmZpZ3VyYXRpb25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcHJvbWV0aGV1cy9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9VcGRhdGVRdWVyeUxvZ2dpbmdDb25maWd1cmF0aW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1VwZGF0ZVF1ZXJ5TG9nZ2luZ0NvbmZpZ3VyYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1VwZGF0ZVF1ZXJ5TG9nZ2luZ0NvbmZpZ3VyYXRpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byB1cGRhdGUgYSBzY3JhcGVyXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3Byb21ldGhldXMvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfVXBkYXRlU2NyYXBlci5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9VcGRhdGVTY3JhcGVyKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdVcGRhdGVTY3JhcGVyJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcHV0IGEgc2NyYXBlciBsb2dnaW5nIGNvbmZpZ3VyYXRpb25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcHJvbWV0aGV1cy9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9VcGRhdGVTY3JhcGVyTG9nZ2luZ0NvbmZpZ3VyYXRpb24uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvVXBkYXRlU2NyYXBlckxvZ2dpbmdDb25maWd1cmF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdVcGRhdGVTY3JhcGVyTG9nZ2luZ0NvbmZpZ3VyYXRpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBtb2RpZnkgdGhlIGFsaWFzIG9mIGV4aXN0aW5nIEFNUCB3b3Jrc3BhY2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcHJvbWV0aGV1cy9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9VcGRhdGVXb3Jrc3BhY2VBbGlhcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9VcGRhdGVXb3Jrc3BhY2VBbGlhcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVXBkYXRlV29ya3NwYWNlQWxpYXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byB1cGRhdGUgd29ya3NwYWNlIGNvbmZpZ3VyYXRpb25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcHJvbWV0aGV1cy9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9VcGRhdGVXb3Jrc3BhY2VDb25maWd1cmF0aW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1VwZGF0ZVdvcmtzcGFjZUNvbmZpZ3VyYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1VwZGF0ZVdvcmtzcGFjZUNvbmZpZ3VyYXRpb24nKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhY2Nlc3NMZXZlbExpc3Q6IEFjY2Vzc0xldmVsTGlzdCA9IHtcbiAgICBXcml0ZTogW1xuICAgICAgJ0NyZWF0ZUFsZXJ0TWFuYWdlckFsZXJ0cycsXG4gICAgICAnQ3JlYXRlQWxlcnRNYW5hZ2VyRGVmaW5pdGlvbicsXG4gICAgICAnQ3JlYXRlQW5vbWFseURldGVjdG9yJyxcbiAgICAgICdDcmVhdGVMb2dnaW5nQ29uZmlndXJhdGlvbicsXG4gICAgICAnQ3JlYXRlUXVlcnlMb2dnaW5nQ29uZmlndXJhdGlvbicsXG4gICAgICAnQ3JlYXRlUnVsZUdyb3Vwc05hbWVzcGFjZScsXG4gICAgICAnQ3JlYXRlU2NyYXBlcicsXG4gICAgICAnQ3JlYXRlV29ya3NwYWNlJyxcbiAgICAgICdEZWxldGVBbGVydE1hbmFnZXJEZWZpbml0aW9uJyxcbiAgICAgICdEZWxldGVBbGVydE1hbmFnZXJTaWxlbmNlJyxcbiAgICAgICdEZWxldGVBbm9tYWx5RGV0ZWN0b3InLFxuICAgICAgJ0RlbGV0ZUxvZ2dpbmdDb25maWd1cmF0aW9uJyxcbiAgICAgICdEZWxldGVRdWVyeUxvZ2dpbmdDb25maWd1cmF0aW9uJyxcbiAgICAgICdEZWxldGVSZXNvdXJjZVBvbGljeScsXG4gICAgICAnRGVsZXRlUnVsZUdyb3Vwc05hbWVzcGFjZScsXG4gICAgICAnRGVsZXRlU2NyYXBlcicsXG4gICAgICAnRGVsZXRlU2NyYXBlckxvZ2dpbmdDb25maWd1cmF0aW9uJyxcbiAgICAgICdEZWxldGVXb3Jrc3BhY2UnLFxuICAgICAgJ1B1dEFsZXJ0TWFuYWdlckRlZmluaXRpb24nLFxuICAgICAgJ1B1dEFsZXJ0TWFuYWdlclNpbGVuY2VzJyxcbiAgICAgICdQdXRBbm9tYWx5RGV0ZWN0b3InLFxuICAgICAgJ1B1dFJlc291cmNlUG9saWN5JyxcbiAgICAgICdQdXRSdWxlR3JvdXBzTmFtZXNwYWNlJyxcbiAgICAgICdSZW1vdGVXcml0ZScsXG4gICAgICAnVGFnUmVzb3VyY2UnLFxuICAgICAgJ1VudGFnUmVzb3VyY2UnLFxuICAgICAgJ1VwZGF0ZUxvZ2dpbmdDb25maWd1cmF0aW9uJyxcbiAgICAgICdVcGRhdGVRdWVyeUxvZ2dpbmdDb25maWd1cmF0aW9uJyxcbiAgICAgICdVcGRhdGVTY3JhcGVyJyxcbiAgICAgICdVcGRhdGVTY3JhcGVyTG9nZ2luZ0NvbmZpZ3VyYXRpb24nLFxuICAgICAgJ1VwZGF0ZVdvcmtzcGFjZUFsaWFzJyxcbiAgICAgICdVcGRhdGVXb3Jrc3BhY2VDb25maWd1cmF0aW9uJ1xuICAgIF0sXG4gICAgUmVhZDogW1xuICAgICAgJ0Rlc2NyaWJlQWxlcnRNYW5hZ2VyRGVmaW5pdGlvbicsXG4gICAgICAnRGVzY3JpYmVBbm9tYWx5RGV0ZWN0b3InLFxuICAgICAgJ0Rlc2NyaWJlTG9nZ2luZ0NvbmZpZ3VyYXRpb24nLFxuICAgICAgJ0Rlc2NyaWJlUXVlcnlMb2dnaW5nQ29uZmlndXJhdGlvbicsXG4gICAgICAnRGVzY3JpYmVSZXNvdXJjZVBvbGljeScsXG4gICAgICAnRGVzY3JpYmVSdWxlR3JvdXBzTmFtZXNwYWNlJyxcbiAgICAgICdEZXNjcmliZVNjcmFwZXInLFxuICAgICAgJ0Rlc2NyaWJlU2NyYXBlckxvZ2dpbmdDb25maWd1cmF0aW9uJyxcbiAgICAgICdEZXNjcmliZVdvcmtzcGFjZScsXG4gICAgICAnRGVzY3JpYmVXb3Jrc3BhY2VDb25maWd1cmF0aW9uJyxcbiAgICAgICdHZXRBbGVydE1hbmFnZXJTaWxlbmNlJyxcbiAgICAgICdHZXRBbGVydE1hbmFnZXJTdGF0dXMnLFxuICAgICAgJ0dldERlZmF1bHRTY3JhcGVyQ29uZmlndXJhdGlvbicsXG4gICAgICAnR2V0TGFiZWxzJyxcbiAgICAgICdHZXRNZXRyaWNNZXRhZGF0YScsXG4gICAgICAnR2V0U2VyaWVzJyxcbiAgICAgICdMaXN0QWxlcnRNYW5hZ2VyQWxlcnRHcm91cHMnLFxuICAgICAgJ0xpc3RBbGVydE1hbmFnZXJBbGVydHMnLFxuICAgICAgJ0xpc3RBbGVydE1hbmFnZXJSZWNlaXZlcnMnLFxuICAgICAgJ0xpc3RBbGVydE1hbmFnZXJTaWxlbmNlcycsXG4gICAgICAnTGlzdEFsZXJ0cycsXG4gICAgICAnTGlzdFJ1bGVzJyxcbiAgICAgICdMaXN0VGFnc0ZvclJlc291cmNlJyxcbiAgICAgICdQcmV2aWV3QW5vbWFseURldGVjdG9yJyxcbiAgICAgICdRdWVyeU1ldHJpY3MnXG4gICAgXSxcbiAgICBMaXN0OiBbXG4gICAgICAnTGlzdEFub21hbHlEZXRlY3RvcnMnLFxuICAgICAgJ0xpc3RSdWxlR3JvdXBzTmFtZXNwYWNlcycsXG4gICAgICAnTGlzdFNjcmFwZXJzJyxcbiAgICAgICdMaXN0V29ya3NwYWNlcydcbiAgICBdLFxuICAgIFRhZ2dpbmc6IFtcbiAgICAgICdUYWdSZXNvdXJjZScsXG4gICAgICAnVW50YWdSZXNvdXJjZSdcbiAgICBdXG4gIH07XG5cbiAgLyoqXG4gICAqIEFkZHMgYSByZXNvdXJjZSBvZiB0eXBlIGFub21hbHlkZXRlY3RvciB0byB0aGUgc3RhdGVtZW50XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9wcm9tZXRoZXVzL2xhdGVzdC91c2VyZ3VpZGUvc2VjdXJpdHktaWFtLmh0bWxcbiAgICpcbiAgICogQHBhcmFtIHdvcmtzcGFjZUlkIC0gSWRlbnRpZmllciBmb3IgdGhlIHdvcmtzcGFjZUlkLlxuICAgKiBAcGFyYW0gYW5vbWFseURldGVjdG9ySWQgLSBJZGVudGlmaWVyIGZvciB0aGUgYW5vbWFseURldGVjdG9ySWQuXG4gICAqIEBwYXJhbSBhY2NvdW50IC0gQWNjb3VudCBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgYWNjb3VudC5cbiAgICogQHBhcmFtIHJlZ2lvbiAtIFJlZ2lvbiBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcmVnaW9uLlxuICAgKiBAcGFyYW0gcGFydGl0aW9uIC0gUGFydGl0aW9uIG9mIHRoZSBBV1MgYWNjb3VudCBbYXdzLCBhd3MtY24sIGF3cy11cy1nb3ZdOyBkZWZhdWx0cyB0byBgYXdzYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcGFydGl0aW9uLlxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkF3c1JlcXVlc3RUYWcoKVxuICAgKiAtIC5pZkF3c1Jlc291cmNlVGFnKClcbiAgICogLSAuaWZBd3NUYWdLZXlzKClcbiAgICovXG4gIHB1YmxpYyBvbkFub21hbHlkZXRlY3Rvcih3b3Jrc3BhY2VJZDogc3RyaW5nLCBhbm9tYWx5RGV0ZWN0b3JJZDogc3RyaW5nLCBhY2NvdW50Pzogc3RyaW5nLCByZWdpb24/OiBzdHJpbmcsIHBhcnRpdGlvbj86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLm9uKGBhcm46JHsgcGFydGl0aW9uID8/IHRoaXMuZGVmYXVsdFBhcnRpdGlvbiB9OmFwczokeyByZWdpb24gPz8gdGhpcy5kZWZhdWx0UmVnaW9uIH06JHsgYWNjb3VudCA/PyB0aGlzLmRlZmF1bHRBY2NvdW50IH06YW5vbWFseWRldGVjdG9yLyR7IHdvcmtzcGFjZUlkIH0vJHsgYW5vbWFseURldGVjdG9ySWQgfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSByZXNvdXJjZSBvZiB0eXBlIGNsdXN0ZXIgdG8gdGhlIHN0YXRlbWVudFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZWtzL2xhdGVzdC91c2VyZ3VpZGUvY2x1c3RlcnMuaHRtbFxuICAgKlxuICAgKiBAcGFyYW0gY2x1c3Rlck5hbWUgLSBJZGVudGlmaWVyIGZvciB0aGUgY2x1c3Rlck5hbWUuXG4gICAqIEBwYXJhbSBhY2NvdW50IC0gQWNjb3VudCBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgYWNjb3VudC5cbiAgICogQHBhcmFtIHJlZ2lvbiAtIFJlZ2lvbiBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcmVnaW9uLlxuICAgKiBAcGFyYW0gcGFydGl0aW9uIC0gUGFydGl0aW9uIG9mIHRoZSBBV1MgYWNjb3VudCBbYXdzLCBhd3MtY24sIGF3cy11cy1nb3ZdOyBkZWZhdWx0cyB0byBgYXdzYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcGFydGl0aW9uLlxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkF3c1Jlc291cmNlVGFnKClcbiAgICovXG4gIHB1YmxpYyBvbkNsdXN0ZXIoY2x1c3Rlck5hbWU6IHN0cmluZywgYWNjb3VudD86IHN0cmluZywgcmVnaW9uPzogc3RyaW5nLCBwYXJ0aXRpb24/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5vbihgYXJuOiR7IHBhcnRpdGlvbiA/PyB0aGlzLmRlZmF1bHRQYXJ0aXRpb24gfTpla3M6JHsgcmVnaW9uID8/IHRoaXMuZGVmYXVsdFJlZ2lvbiB9OiR7IGFjY291bnQgPz8gdGhpcy5kZWZhdWx0QWNjb3VudCB9OmNsdXN0ZXIvJHsgY2x1c3Rlck5hbWUgfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSByZXNvdXJjZSBvZiB0eXBlIHJ1bGVncm91cHNuYW1lc3BhY2UgdG8gdGhlIHN0YXRlbWVudFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcHJvbWV0aGV1cy9sYXRlc3QvdXNlcmd1aWRlL3NlY3VyaXR5LWlhbS5odG1sXG4gICAqXG4gICAqIEBwYXJhbSB3b3Jrc3BhY2VJZCAtIElkZW50aWZpZXIgZm9yIHRoZSB3b3Jrc3BhY2VJZC5cbiAgICogQHBhcmFtIG5hbWVzcGFjZSAtIElkZW50aWZpZXIgZm9yIHRoZSBuYW1lc3BhY2UuXG4gICAqIEBwYXJhbSBhY2NvdW50IC0gQWNjb3VudCBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgYWNjb3VudC5cbiAgICogQHBhcmFtIHJlZ2lvbiAtIFJlZ2lvbiBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcmVnaW9uLlxuICAgKiBAcGFyYW0gcGFydGl0aW9uIC0gUGFydGl0aW9uIG9mIHRoZSBBV1MgYWNjb3VudCBbYXdzLCBhd3MtY24sIGF3cy11cy1nb3ZdOyBkZWZhdWx0cyB0byBgYXdzYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcGFydGl0aW9uLlxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkF3c1JlcXVlc3RUYWcoKVxuICAgKiAtIC5pZkF3c1Jlc291cmNlVGFnKClcbiAgICogLSAuaWZBd3NUYWdLZXlzKClcbiAgICovXG4gIHB1YmxpYyBvblJ1bGVncm91cHNuYW1lc3BhY2Uod29ya3NwYWNlSWQ6IHN0cmluZywgbmFtZXNwYWNlOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06YXBzOiR7IHJlZ2lvbiA/PyB0aGlzLmRlZmF1bHRSZWdpb24gfTokeyBhY2NvdW50ID8/IHRoaXMuZGVmYXVsdEFjY291bnQgfTpydWxlZ3JvdXBzbmFtZXNwYWNlLyR7IHdvcmtzcGFjZUlkIH0vJHsgbmFtZXNwYWNlIH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVzb3VyY2Ugb2YgdHlwZSBzY3JhcGVyIHRvIHRoZSBzdGF0ZW1lbnRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3Byb21ldGhldXMvbGF0ZXN0L3VzZXJndWlkZS9zZWN1cml0eS1pYW0uaHRtbFxuICAgKlxuICAgKiBAcGFyYW0gc2NyYXBlcklkIC0gSWRlbnRpZmllciBmb3IgdGhlIHNjcmFwZXJJZC5cbiAgICogQHBhcmFtIGFjY291bnQgLSBBY2NvdW50IG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBhY2NvdW50LlxuICAgKiBAcGFyYW0gcmVnaW9uIC0gUmVnaW9uIG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyByZWdpb24uXG4gICAqIEBwYXJhbSBwYXJ0aXRpb24gLSBQYXJ0aXRpb24gb2YgdGhlIEFXUyBhY2NvdW50IFthd3MsIGF3cy1jbiwgYXdzLXVzLWdvdl07IGRlZmF1bHRzIHRvIGBhd3NgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBwYXJ0aXRpb24uXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVxdWVzdFRhZygpXG4gICAqIC0gLmlmQXdzUmVzb3VyY2VUYWcoKVxuICAgKiAtIC5pZkF3c1RhZ0tleXMoKVxuICAgKi9cbiAgcHVibGljIG9uU2NyYXBlcihzY3JhcGVySWQ6IHN0cmluZywgYWNjb3VudD86IHN0cmluZywgcmVnaW9uPzogc3RyaW5nLCBwYXJ0aXRpb24/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5vbihgYXJuOiR7IHBhcnRpdGlvbiA/PyB0aGlzLmRlZmF1bHRQYXJ0aXRpb24gfTphcHM6JHsgcmVnaW9uID8/IHRoaXMuZGVmYXVsdFJlZ2lvbiB9OiR7IGFjY291bnQgPz8gdGhpcy5kZWZhdWx0QWNjb3VudCB9OnNjcmFwZXIvJHsgc2NyYXBlcklkIH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVzb3VyY2Ugb2YgdHlwZSB3b3Jrc3BhY2UgdG8gdGhlIHN0YXRlbWVudFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vcHJvbWV0aGV1cy9sYXRlc3QvdXNlcmd1aWRlL3NlY3VyaXR5LWlhbS5odG1sXG4gICAqXG4gICAqIEBwYXJhbSB3b3Jrc3BhY2VJZCAtIElkZW50aWZpZXIgZm9yIHRoZSB3b3Jrc3BhY2VJZC5cbiAgICogQHBhcmFtIGFjY291bnQgLSBBY2NvdW50IG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBhY2NvdW50LlxuICAgKiBAcGFyYW0gcmVnaW9uIC0gUmVnaW9uIG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyByZWdpb24uXG4gICAqIEBwYXJhbSBwYXJ0aXRpb24gLSBQYXJ0aXRpb24gb2YgdGhlIEFXUyBhY2NvdW50IFthd3MsIGF3cy1jbiwgYXdzLXVzLWdvdl07IGRlZmF1bHRzIHRvIGBhd3NgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBwYXJ0aXRpb24uXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVxdWVzdFRhZygpXG4gICAqIC0gLmlmQXdzUmVzb3VyY2VUYWcoKVxuICAgKiAtIC5pZkF3c1RhZ0tleXMoKVxuICAgKi9cbiAgcHVibGljIG9uV29ya3NwYWNlKHdvcmtzcGFjZUlkOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06YXBzOiR7IHJlZ2lvbiA/PyB0aGlzLmRlZmF1bHRSZWdpb24gfTokeyBhY2NvdW50ID8/IHRoaXMuZGVmYXVsdEFjY291bnQgfTp3b3Jrc3BhY2UvJHsgd29ya3NwYWNlSWQgfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYWNjZXNzIGJhc2VkIG9uIHRoZSB0YWdzIHRoYXQgYXJlIHBhc3NlZCBpbiB0aGUgcmVxdWVzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2NvbmRpdGlvbi1rZXlzLmh0bWwjY29uZGl0aW9uLWtleXMtcmVxdWVzdHRhZ1xuICAgKlxuICAgKiBBcHBsaWVzIHRvIGFjdGlvbnM6XG4gICAqIC0gLnRvQ3JlYXRlQWxlcnRNYW5hZ2VyQWxlcnRzKClcbiAgICogLSAudG9DcmVhdGVBbGVydE1hbmFnZXJEZWZpbml0aW9uKClcbiAgICogLSAudG9DcmVhdGVBbm9tYWx5RGV0ZWN0b3IoKVxuICAgKiAtIC50b0NyZWF0ZUxvZ2dpbmdDb25maWd1cmF0aW9uKClcbiAgICogLSAudG9DcmVhdGVRdWVyeUxvZ2dpbmdDb25maWd1cmF0aW9uKClcbiAgICogLSAudG9DcmVhdGVSdWxlR3JvdXBzTmFtZXNwYWNlKClcbiAgICogLSAudG9DcmVhdGVTY3JhcGVyKClcbiAgICogLSAudG9DcmVhdGVXb3Jrc3BhY2UoKVxuICAgKiAtIC50b0RlbGV0ZUFsZXJ0TWFuYWdlckRlZmluaXRpb24oKVxuICAgKiAtIC50b0RlbGV0ZUFsZXJ0TWFuYWdlclNpbGVuY2UoKVxuICAgKiAtIC50b0RlbGV0ZUFub21hbHlEZXRlY3RvcigpXG4gICAqIC0gLnRvRGVsZXRlTG9nZ2luZ0NvbmZpZ3VyYXRpb24oKVxuICAgKiAtIC50b0RlbGV0ZVF1ZXJ5TG9nZ2luZ0NvbmZpZ3VyYXRpb24oKVxuICAgKiAtIC50b0RlbGV0ZVJlc291cmNlUG9saWN5KClcbiAgICogLSAudG9EZWxldGVSdWxlR3JvdXBzTmFtZXNwYWNlKClcbiAgICogLSAudG9EZWxldGVTY3JhcGVyKClcbiAgICogLSAudG9EZWxldGVTY3JhcGVyTG9nZ2luZ0NvbmZpZ3VyYXRpb24oKVxuICAgKiAtIC50b0RlbGV0ZVdvcmtzcGFjZSgpXG4gICAqIC0gLnRvRGVzY3JpYmVBbGVydE1hbmFnZXJEZWZpbml0aW9uKClcbiAgICogLSAudG9EZXNjcmliZUFub21hbHlEZXRlY3RvcigpXG4gICAqIC0gLnRvRGVzY3JpYmVMb2dnaW5nQ29uZmlndXJhdGlvbigpXG4gICAqIC0gLnRvRGVzY3JpYmVRdWVyeUxvZ2dpbmdDb25maWd1cmF0aW9uKClcbiAgICogLSAudG9EZXNjcmliZVJlc291cmNlUG9saWN5KClcbiAgICogLSAudG9EZXNjcmliZVJ1bGVHcm91cHNOYW1lc3BhY2UoKVxuICAgKiAtIC50b0Rlc2NyaWJlU2NyYXBlcigpXG4gICAqIC0gLnRvRGVzY3JpYmVTY3JhcGVyTG9nZ2luZ0NvbmZpZ3VyYXRpb24oKVxuICAgKiAtIC50b0Rlc2NyaWJlV29ya3NwYWNlKClcbiAgICogLSAudG9EZXNjcmliZVdvcmtzcGFjZUNvbmZpZ3VyYXRpb24oKVxuICAgKiAtIC50b0dldEFsZXJ0TWFuYWdlclNpbGVuY2UoKVxuICAgKiAtIC50b0dldEFsZXJ0TWFuYWdlclN0YXR1cygpXG4gICAqIC0gLnRvR2V0TGFiZWxzKClcbiAgICogLSAudG9HZXRNZXRyaWNNZXRhZGF0YSgpXG4gICAqIC0gLnRvR2V0U2VyaWVzKClcbiAgICogLSAudG9MaXN0QWxlcnRNYW5hZ2VyQWxlcnRHcm91cHMoKVxuICAgKiAtIC50b0xpc3RBbGVydE1hbmFnZXJBbGVydHMoKVxuICAgKiAtIC50b0xpc3RBbGVydE1hbmFnZXJSZWNlaXZlcnMoKVxuICAgKiAtIC50b0xpc3RBbGVydE1hbmFnZXJTaWxlbmNlcygpXG4gICAqIC0gLnRvTGlzdEFsZXJ0cygpXG4gICAqIC0gLnRvTGlzdEFub21hbHlEZXRlY3RvcnMoKVxuICAgKiAtIC50b0xpc3RSdWxlR3JvdXBzTmFtZXNwYWNlcygpXG4gICAqIC0gLnRvTGlzdFJ1bGVzKClcbiAgICogLSAudG9MaXN0VGFnc0ZvclJlc291cmNlKClcbiAgICogLSAudG9QcmV2aWV3QW5vbWFseURldGVjdG9yKClcbiAgICogLSAudG9QdXRBbGVydE1hbmFnZXJEZWZpbml0aW9uKClcbiAgICogLSAudG9QdXRBbGVydE1hbmFnZXJTaWxlbmNlcygpXG4gICAqIC0gLnRvUHV0QW5vbWFseURldGVjdG9yKClcbiAgICogLSAudG9QdXRSZXNvdXJjZVBvbGljeSgpXG4gICAqIC0gLnRvUHV0UnVsZUdyb3Vwc05hbWVzcGFjZSgpXG4gICAqIC0gLnRvUXVlcnlNZXRyaWNzKClcbiAgICogLSAudG9SZW1vdGVXcml0ZSgpXG4gICAqIC0gLnRvVGFnUmVzb3VyY2UoKVxuICAgKiAtIC50b1VudGFnUmVzb3VyY2UoKVxuICAgKiAtIC50b1VwZGF0ZUxvZ2dpbmdDb25maWd1cmF0aW9uKClcbiAgICogLSAudG9VcGRhdGVRdWVyeUxvZ2dpbmdDb25maWd1cmF0aW9uKClcbiAgICogLSAudG9VcGRhdGVTY3JhcGVyKClcbiAgICogLSAudG9VcGRhdGVTY3JhcGVyTG9nZ2luZ0NvbmZpZ3VyYXRpb24oKVxuICAgKiAtIC50b1VwZGF0ZVdvcmtzcGFjZUFsaWFzKClcbiAgICogLSAudG9VcGRhdGVXb3Jrc3BhY2VDb25maWd1cmF0aW9uKClcbiAgICpcbiAgICogQXBwbGllcyB0byByZXNvdXJjZSB0eXBlczpcbiAgICogLSBhbm9tYWx5ZGV0ZWN0b3JcbiAgICogLSBydWxlZ3JvdXBzbmFtZXNwYWNlXG4gICAqIC0gc2NyYXBlclxuICAgKiAtIHdvcmtzcGFjZVxuICAgKlxuICAgKiBAcGFyYW0gdGFnS2V5IFRoZSB0YWcga2V5IHRvIGNoZWNrXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW3N0cmluZyBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfU3RyaW5nKS4gKipEZWZhdWx0OioqIGBTdHJpbmdMaWtlYFxuICAgKi9cbiAgcHVibGljIGlmQXdzUmVxdWVzdFRhZyh0YWdLZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdLCBvcGVyYXRvcj86IE9wZXJhdG9yIHwgc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaWYoYGF3czpSZXF1ZXN0VGFnLyR7IHRhZ0tleSB9YCwgdmFsdWUsIG9wZXJhdG9yID8/ICdTdHJpbmdMaWtlJyk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYmFzZWQgb24gdGhlIHRhZ3MgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXNvdXJjZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2NvbmRpdGlvbi1rZXlzLmh0bWwjY29uZGl0aW9uLWtleXMtcmVzb3VyY2V0YWdcbiAgICpcbiAgICogQXBwbGllcyB0byBhY3Rpb25zOlxuICAgKiAtIC50b0NyZWF0ZUFsZXJ0TWFuYWdlckFsZXJ0cygpXG4gICAqIC0gLnRvQ3JlYXRlQWxlcnRNYW5hZ2VyRGVmaW5pdGlvbigpXG4gICAqIC0gLnRvQ3JlYXRlQW5vbWFseURldGVjdG9yKClcbiAgICogLSAudG9DcmVhdGVMb2dnaW5nQ29uZmlndXJhdGlvbigpXG4gICAqIC0gLnRvQ3JlYXRlUXVlcnlMb2dnaW5nQ29uZmlndXJhdGlvbigpXG4gICAqIC0gLnRvQ3JlYXRlUnVsZUdyb3Vwc05hbWVzcGFjZSgpXG4gICAqIC0gLnRvQ3JlYXRlU2NyYXBlcigpXG4gICAqIC0gLnRvRGVsZXRlQWxlcnRNYW5hZ2VyRGVmaW5pdGlvbigpXG4gICAqIC0gLnRvRGVsZXRlQWxlcnRNYW5hZ2VyU2lsZW5jZSgpXG4gICAqIC0gLnRvRGVsZXRlQW5vbWFseURldGVjdG9yKClcbiAgICogLSAudG9EZWxldGVMb2dnaW5nQ29uZmlndXJhdGlvbigpXG4gICAqIC0gLnRvRGVsZXRlUXVlcnlMb2dnaW5nQ29uZmlndXJhdGlvbigpXG4gICAqIC0gLnRvRGVsZXRlUmVzb3VyY2VQb2xpY3koKVxuICAgKiAtIC50b0RlbGV0ZVJ1bGVHcm91cHNOYW1lc3BhY2UoKVxuICAgKiAtIC50b0RlbGV0ZVNjcmFwZXIoKVxuICAgKiAtIC50b0RlbGV0ZVNjcmFwZXJMb2dnaW5nQ29uZmlndXJhdGlvbigpXG4gICAqIC0gLnRvRGVsZXRlV29ya3NwYWNlKClcbiAgICogLSAudG9EZXNjcmliZUFsZXJ0TWFuYWdlckRlZmluaXRpb24oKVxuICAgKiAtIC50b0Rlc2NyaWJlQW5vbWFseURldGVjdG9yKClcbiAgICogLSAudG9EZXNjcmliZUxvZ2dpbmdDb25maWd1cmF0aW9uKClcbiAgICogLSAudG9EZXNjcmliZVF1ZXJ5TG9nZ2luZ0NvbmZpZ3VyYXRpb24oKVxuICAgKiAtIC50b0Rlc2NyaWJlUmVzb3VyY2VQb2xpY3koKVxuICAgKiAtIC50b0Rlc2NyaWJlUnVsZUdyb3Vwc05hbWVzcGFjZSgpXG4gICAqIC0gLnRvRGVzY3JpYmVTY3JhcGVyKClcbiAgICogLSAudG9EZXNjcmliZVNjcmFwZXJMb2dnaW5nQ29uZmlndXJhdGlvbigpXG4gICAqIC0gLnRvRGVzY3JpYmVXb3Jrc3BhY2UoKVxuICAgKiAtIC50b0Rlc2NyaWJlV29ya3NwYWNlQ29uZmlndXJhdGlvbigpXG4gICAqIC0gLnRvR2V0QWxlcnRNYW5hZ2VyU2lsZW5jZSgpXG4gICAqIC0gLnRvR2V0QWxlcnRNYW5hZ2VyU3RhdHVzKClcbiAgICogLSAudG9HZXRMYWJlbHMoKVxuICAgKiAtIC50b0dldE1ldHJpY01ldGFkYXRhKClcbiAgICogLSAudG9HZXRTZXJpZXMoKVxuICAgKiAtIC50b0xpc3RBbGVydE1hbmFnZXJBbGVydEdyb3VwcygpXG4gICAqIC0gLnRvTGlzdEFsZXJ0TWFuYWdlckFsZXJ0cygpXG4gICAqIC0gLnRvTGlzdEFsZXJ0TWFuYWdlclJlY2VpdmVycygpXG4gICAqIC0gLnRvTGlzdEFsZXJ0TWFuYWdlclNpbGVuY2VzKClcbiAgICogLSAudG9MaXN0QWxlcnRzKClcbiAgICogLSAudG9MaXN0QW5vbWFseURldGVjdG9ycygpXG4gICAqIC0gLnRvTGlzdFJ1bGVHcm91cHNOYW1lc3BhY2VzKClcbiAgICogLSAudG9MaXN0UnVsZXMoKVxuICAgKiAtIC50b0xpc3RUYWdzRm9yUmVzb3VyY2UoKVxuICAgKiAtIC50b1ByZXZpZXdBbm9tYWx5RGV0ZWN0b3IoKVxuICAgKiAtIC50b1B1dEFsZXJ0TWFuYWdlckRlZmluaXRpb24oKVxuICAgKiAtIC50b1B1dEFsZXJ0TWFuYWdlclNpbGVuY2VzKClcbiAgICogLSAudG9QdXRBbm9tYWx5RGV0ZWN0b3IoKVxuICAgKiAtIC50b1B1dFJlc291cmNlUG9saWN5KClcbiAgICogLSAudG9QdXRSdWxlR3JvdXBzTmFtZXNwYWNlKClcbiAgICogLSAudG9RdWVyeU1ldHJpY3MoKVxuICAgKiAtIC50b1JlbW90ZVdyaXRlKClcbiAgICogLSAudG9UYWdSZXNvdXJjZSgpXG4gICAqIC0gLnRvVW50YWdSZXNvdXJjZSgpXG4gICAqIC0gLnRvVXBkYXRlTG9nZ2luZ0NvbmZpZ3VyYXRpb24oKVxuICAgKiAtIC50b1VwZGF0ZVF1ZXJ5TG9nZ2luZ0NvbmZpZ3VyYXRpb24oKVxuICAgKiAtIC50b1VwZGF0ZVNjcmFwZXIoKVxuICAgKiAtIC50b1VwZGF0ZVNjcmFwZXJMb2dnaW5nQ29uZmlndXJhdGlvbigpXG4gICAqIC0gLnRvVXBkYXRlV29ya3NwYWNlQWxpYXMoKVxuICAgKiAtIC50b1VwZGF0ZVdvcmtzcGFjZUNvbmZpZ3VyYXRpb24oKVxuICAgKlxuICAgKiBBcHBsaWVzIHRvIHJlc291cmNlIHR5cGVzOlxuICAgKiAtIGFub21hbHlkZXRlY3RvclxuICAgKiAtIGNsdXN0ZXJcbiAgICogLSBydWxlZ3JvdXBzbmFtZXNwYWNlXG4gICAqIC0gc2NyYXBlclxuICAgKiAtIHdvcmtzcGFjZVxuICAgKlxuICAgKiBAcGFyYW0gdGFnS2V5IFRoZSB0YWcga2V5IHRvIGNoZWNrXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW3N0cmluZyBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfU3RyaW5nKS4gKipEZWZhdWx0OioqIGBTdHJpbmdMaWtlYFxuICAgKi9cbiAgcHVibGljIGlmQXdzUmVzb3VyY2VUYWcodGFnS2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSwgb3BlcmF0b3I/OiBPcGVyYXRvciB8IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmlmKGBhd3M6UmVzb3VyY2VUYWcvJHsgdGFnS2V5IH1gLCB2YWx1ZSwgb3BlcmF0b3IgPz8gJ1N0cmluZ0xpa2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIGFjY2VzcyBiYXNlZCBvbiB0aGUgdGFnIGtleXMgdGhhdCBhcmUgcGFzc2VkIGluIHRoZSByZXF1ZXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfY29uZGl0aW9uLWtleXMuaHRtbCNjb25kaXRpb24ta2V5cy10YWdrZXlzXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9DcmVhdGVBbGVydE1hbmFnZXJBbGVydHMoKVxuICAgKiAtIC50b0NyZWF0ZUFsZXJ0TWFuYWdlckRlZmluaXRpb24oKVxuICAgKiAtIC50b0NyZWF0ZUFub21hbHlEZXRlY3RvcigpXG4gICAqIC0gLnRvQ3JlYXRlTG9nZ2luZ0NvbmZpZ3VyYXRpb24oKVxuICAgKiAtIC50b0NyZWF0ZVF1ZXJ5TG9nZ2luZ0NvbmZpZ3VyYXRpb24oKVxuICAgKiAtIC50b0NyZWF0ZVJ1bGVHcm91cHNOYW1lc3BhY2UoKVxuICAgKiAtIC50b0NyZWF0ZVNjcmFwZXIoKVxuICAgKiAtIC50b0NyZWF0ZVdvcmtzcGFjZSgpXG4gICAqIC0gLnRvRGVsZXRlQWxlcnRNYW5hZ2VyRGVmaW5pdGlvbigpXG4gICAqIC0gLnRvRGVsZXRlQWxlcnRNYW5hZ2VyU2lsZW5jZSgpXG4gICAqIC0gLnRvRGVsZXRlQW5vbWFseURldGVjdG9yKClcbiAgICogLSAudG9EZWxldGVMb2dnaW5nQ29uZmlndXJhdGlvbigpXG4gICAqIC0gLnRvRGVsZXRlUXVlcnlMb2dnaW5nQ29uZmlndXJhdGlvbigpXG4gICAqIC0gLnRvRGVsZXRlUmVzb3VyY2VQb2xpY3koKVxuICAgKiAtIC50b0RlbGV0ZVJ1bGVHcm91cHNOYW1lc3BhY2UoKVxuICAgKiAtIC50b0RlbGV0ZVNjcmFwZXIoKVxuICAgKiAtIC50b0RlbGV0ZVNjcmFwZXJMb2dnaW5nQ29uZmlndXJhdGlvbigpXG4gICAqIC0gLnRvRGVsZXRlV29ya3NwYWNlKClcbiAgICogLSAudG9EZXNjcmliZUFsZXJ0TWFuYWdlckRlZmluaXRpb24oKVxuICAgKiAtIC50b0Rlc2NyaWJlQW5vbWFseURldGVjdG9yKClcbiAgICogLSAudG9EZXNjcmliZUxvZ2dpbmdDb25maWd1cmF0aW9uKClcbiAgICogLSAudG9EZXNjcmliZVF1ZXJ5TG9nZ2luZ0NvbmZpZ3VyYXRpb24oKVxuICAgKiAtIC50b0Rlc2NyaWJlUmVzb3VyY2VQb2xpY3koKVxuICAgKiAtIC50b0Rlc2NyaWJlUnVsZUdyb3Vwc05hbWVzcGFjZSgpXG4gICAqIC0gLnRvRGVzY3JpYmVTY3JhcGVyKClcbiAgICogLSAudG9EZXNjcmliZVNjcmFwZXJMb2dnaW5nQ29uZmlndXJhdGlvbigpXG4gICAqIC0gLnRvRGVzY3JpYmVXb3Jrc3BhY2UoKVxuICAgKiAtIC50b0Rlc2NyaWJlV29ya3NwYWNlQ29uZmlndXJhdGlvbigpXG4gICAqIC0gLnRvR2V0QWxlcnRNYW5hZ2VyU2lsZW5jZSgpXG4gICAqIC0gLnRvR2V0QWxlcnRNYW5hZ2VyU3RhdHVzKClcbiAgICogLSAudG9HZXRMYWJlbHMoKVxuICAgKiAtIC50b0dldE1ldHJpY01ldGFkYXRhKClcbiAgICogLSAudG9HZXRTZXJpZXMoKVxuICAgKiAtIC50b0xpc3RBbGVydE1hbmFnZXJBbGVydEdyb3VwcygpXG4gICAqIC0gLnRvTGlzdEFsZXJ0TWFuYWdlckFsZXJ0cygpXG4gICAqIC0gLnRvTGlzdEFsZXJ0TWFuYWdlclJlY2VpdmVycygpXG4gICAqIC0gLnRvTGlzdEFsZXJ0TWFuYWdlclNpbGVuY2VzKClcbiAgICogLSAudG9MaXN0QWxlcnRzKClcbiAgICogLSAudG9MaXN0QW5vbWFseURldGVjdG9ycygpXG4gICAqIC0gLnRvTGlzdFJ1bGVHcm91cHNOYW1lc3BhY2VzKClcbiAgICogLSAudG9MaXN0UnVsZXMoKVxuICAgKiAtIC50b0xpc3RUYWdzRm9yUmVzb3VyY2UoKVxuICAgKiAtIC50b1ByZXZpZXdBbm9tYWx5RGV0ZWN0b3IoKVxuICAgKiAtIC50b1B1dEFsZXJ0TWFuYWdlckRlZmluaXRpb24oKVxuICAgKiAtIC50b1B1dEFsZXJ0TWFuYWdlclNpbGVuY2VzKClcbiAgICogLSAudG9QdXRBbm9tYWx5RGV0ZWN0b3IoKVxuICAgKiAtIC50b1B1dFJlc291cmNlUG9saWN5KClcbiAgICogLSAudG9QdXRSdWxlR3JvdXBzTmFtZXNwYWNlKClcbiAgICogLSAudG9RdWVyeU1ldHJpY3MoKVxuICAgKiAtIC50b1JlbW90ZVdyaXRlKClcbiAgICogLSAudG9UYWdSZXNvdXJjZSgpXG4gICAqIC0gLnRvVW50YWdSZXNvdXJjZSgpXG4gICAqIC0gLnRvVXBkYXRlTG9nZ2luZ0NvbmZpZ3VyYXRpb24oKVxuICAgKiAtIC50b1VwZGF0ZVF1ZXJ5TG9nZ2luZ0NvbmZpZ3VyYXRpb24oKVxuICAgKiAtIC50b1VwZGF0ZVNjcmFwZXIoKVxuICAgKiAtIC50b1VwZGF0ZVNjcmFwZXJMb2dnaW5nQ29uZmlndXJhdGlvbigpXG4gICAqIC0gLnRvVXBkYXRlV29ya3NwYWNlQWxpYXMoKVxuICAgKiAtIC50b1VwZGF0ZVdvcmtzcGFjZUNvbmZpZ3VyYXRpb24oKVxuICAgKlxuICAgKiBBcHBsaWVzIHRvIHJlc291cmNlIHR5cGVzOlxuICAgKiAtIGFub21hbHlkZXRlY3RvclxuICAgKiAtIHJ1bGVncm91cHNuYW1lc3BhY2VcbiAgICogLSBzY3JhcGVyXG4gICAqIC0gd29ya3NwYWNlXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW3N0cmluZyBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfU3RyaW5nKS4gKipEZWZhdWx0OioqIGBTdHJpbmdMaWtlYFxuICAgKi9cbiAgcHVibGljIGlmQXdzVGFnS2V5cyh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pZihgYXdzOlRhZ0tleXNgLCB2YWx1ZSwgb3BlcmF0b3IgPz8gJ1N0cmluZ0xpa2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGF0ZW1lbnQgcHJvdmlkZXIgZm9yIHNlcnZpY2UgW2Fwc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3NlcnZpY2UtYXV0aG9yaXphdGlvbi9sYXRlc3QvcmVmZXJlbmNlL2xpc3RfYW1wLmh0bWwpLlxuICAgKlxuICAgKi9cbiAgY29uc3RydWN0b3IocHJvcHM/OiBpYW0uUG9saWN5U3RhdGVtZW50UHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG4gIH1cbn1cbiJdfQ==