iam-floyd
Version:
AWS IAM policy statement generator with fluent interface
415 lines • 41.2 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.Networkflowmonitor = void 0;
const shared_1 = require("../../shared");
/**
* Statement provider for service [networkflowmonitor](https://docs.aws.amazon.com/service-authorization/latest/reference/list_networkflowmonitor.html).
*
* @param sid [SID](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_sid.html) of the statement
*/
class Networkflowmonitor extends shared_1.PolicyStatement {
/**
* Statement provider for service [networkflowmonitor](https://docs.aws.amazon.com/service-authorization/latest/reference/list_networkflowmonitor.html).
*
* @param sid [SID](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_sid.html) of the statement
*/
constructor(sid) {
super(sid);
this.servicePrefix = 'networkflowmonitor';
this.accessLevelList = {
Write: [
'CreateMonitor',
'CreateScope',
'DeleteMonitor',
'DeleteScope',
'Publish',
'StartQueryMonitorTopContributors',
'StartQueryWorkloadInsightsTopContributors',
'StartQueryWorkloadInsightsTopContributorsData',
'StopQueryMonitorTopContributors',
'StopQueryWorkloadInsightsTopContributors',
'StopQueryWorkloadInsightsTopContributorsData',
'UpdateMonitor',
'UpdateScope'
],
Read: [
'GetMonitor',
'GetQueryResultsMonitorTopContributors',
'GetQueryResultsWorkloadInsightsTopContributors',
'GetQueryResultsWorkloadInsightsTopContributorsData',
'GetQueryStatusMonitorTopContributors',
'GetQueryStatusWorkloadInsightsTopContributors',
'GetQueryStatusWorkloadInsightsTopContributorsData',
'GetScope',
'ListTagsForResource'
],
List: [
'ListMonitors',
'ListScopes'
],
Tagging: [
'TagResource',
'UntagResource'
]
};
}
/**
* Grants permission to create a monitor
*
* Access Level: Write
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsTagKeys()
*
* https://docs.aws.amazon.com/networkflowmonitor/2.0/APIReference/API_CreateMonitor.html
*/
toCreateMonitor() {
return this.to('CreateMonitor');
}
/**
* Grants permission to create a scope
*
* Access Level: Write
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsTagKeys()
*
* https://docs.aws.amazon.com/networkflowmonitor/2.0/APIReference/API_CreateScope.html
*/
toCreateScope() {
return this.to('CreateScope');
}
/**
* Grants permission to delete a monitor
*
* Access Level: Write
*
* https://docs.aws.amazon.com/networkflowmonitor/2.0/APIReference/API_DeleteMonitor.html
*/
toDeleteMonitor() {
return this.to('DeleteMonitor');
}
/**
* Grants permission to delete a scope
*
* Access Level: Write
*
* https://docs.aws.amazon.com/networkflowmonitor/2.0/APIReference/API_DeleteScope.html
*/
toDeleteScope() {
return this.to('DeleteScope');
}
/**
* Grants permission to get information about a monitor
*
* Access Level: Read
*
* https://docs.aws.amazon.com/networkflowmonitor/2.0/APIReference/API_GetMonitor.html
*/
toGetMonitor() {
return this.to('GetMonitor');
}
/**
* Grants permission to get the results of a query that retrieves top contributors data for a monitor
*
* Access Level: Read
*
* https://docs.aws.amazon.com/networkflowmonitor/2.0/APIReference/API_GetQueryResultsMonitorTopContributors.html
*/
toGetQueryResultsMonitorTopContributors() {
return this.to('GetQueryResultsMonitorTopContributors');
}
/**
* Grants permission to get the results of a query that retrieves top contributors for workload insights
*
* Access Level: Read
*
* https://docs.aws.amazon.com/networkflowmonitor/2.0/APIReference/API_GetQueryResultsWorkloadInsightsTopContributors.html
*/
toGetQueryResultsWorkloadInsightsTopContributors() {
return this.to('GetQueryResultsWorkloadInsightsTopContributors');
}
/**
* Grants permission to get the results of a query that retrieves top contributors data points for workload insights
*
* Access Level: Read
*
* https://docs.aws.amazon.com/networkflowmonitor/2.0/APIReference/API_GetQueryResultsWorkloadInsightsTopContributorsData.html
*/
toGetQueryResultsWorkloadInsightsTopContributorsData() {
return this.to('GetQueryResultsWorkloadInsightsTopContributorsData');
}
/**
* Grants permission to get the status of a query that retrieves top contributors data for a monitor
*
* Access Level: Read
*
* https://docs.aws.amazon.com/networkflowmonitor/2.0/APIReference/API_GetQueryStatusMonitorTopContributors.html
*/
toGetQueryStatusMonitorTopContributors() {
return this.to('GetQueryStatusMonitorTopContributors');
}
/**
* Grants permission to get the status of a query that retrieves top contributors for workload insights
*
* Access Level: Read
*
* https://docs.aws.amazon.com/networkflowmonitor/2.0/APIReference/API_GetQueryStatusWorkloadInsightsTopContributors.html
*/
toGetQueryStatusWorkloadInsightsTopContributors() {
return this.to('GetQueryStatusWorkloadInsightsTopContributors');
}
/**
* Grants permission to get the status of a query that retrieves top contributors data points for workload insights
*
* Access Level: Read
*
* https://docs.aws.amazon.com/networkflowmonitor/2.0/APIReference/API_GetQueryStatusWorkloadInsightsTopContributorsData.html
*/
toGetQueryStatusWorkloadInsightsTopContributorsData() {
return this.to('GetQueryStatusWorkloadInsightsTopContributorsData');
}
/**
* Grants permission to get information about a scope
*
* Access Level: Read
*
* https://docs.aws.amazon.com/networkflowmonitor/2.0/APIReference/API_GetScope.html
*/
toGetScope() {
return this.to('GetScope');
}
/**
* Grants permission to list all monitors in an account and their statuses
*
* Access Level: List
*
* https://docs.aws.amazon.com/networkflowmonitor/2.0/APIReference/API_ListMonitors.html
*/
toListMonitors() {
return this.to('ListMonitors');
}
/**
* Grants permission to get all scopes for an account
*
* Access Level: List
*
* https://docs.aws.amazon.com/networkflowmonitor/2.0/APIReference/API_ListScopes.html
*/
toListScopes() {
return this.to('ListScopes');
}
/**
* Grants permission to list the tags for a resource
*
* Access Level: Read
*
* https://docs.aws.amazon.com/networkflowmonitor/2.0/APIReference/API_ListTagsForResource.html
*/
toListTagsForResource() {
return this.to('ListTagsForResource');
}
/**
* Grants permission to publish a report
*
* Access Level: Write
*
* https://docs.aws.amazon.com/networkflowmonitor/2.0/APIReference/API_Publish.html
*/
toPublish() {
return this.to('Publish');
}
/**
* Grants permission to start a query for retrieving top contributors data for a monitor
*
* Access Level: Write
*
* https://docs.aws.amazon.com/networkflowmonitor/2.0/APIReference/API_StartQueryMonitorTopContributors.html
*/
toStartQueryMonitorTopContributors() {
return this.to('StartQueryMonitorTopContributors');
}
/**
* Grants permission to start a query for retrieving top contributors data for workload insights
*
* Access Level: Write
*
* https://docs.aws.amazon.com/networkflowmonitor/2.0/APIReference/API_StartQueryWorkloadInsightsTopContributors.html
*/
toStartQueryWorkloadInsightsTopContributors() {
return this.to('StartQueryWorkloadInsightsTopContributors');
}
/**
* Grants permission to start a query for retrieving top contributors data points for workload insights
*
* Access Level: Write
*
* https://docs.aws.amazon.com/networkflowmonitor/2.0/APIReference/API_StartQueryWorkloadInsightsTopContributorsData.html
*/
toStartQueryWorkloadInsightsTopContributorsData() {
return this.to('StartQueryWorkloadInsightsTopContributorsData');
}
/**
* Grants permission to stop a query for retrieving top contributors data for a monitor
*
* Access Level: Write
*
* https://docs.aws.amazon.com/networkflowmonitor/2.0/APIReference/API_StopQueryMonitorTopContributors.html
*/
toStopQueryMonitorTopContributors() {
return this.to('StopQueryMonitorTopContributors');
}
/**
* Grants permission to stop a query for retrieving top contributors for workload insights
*
* Access Level: Write
*
* https://docs.aws.amazon.com/networkflowmonitor/2.0/APIReference/API_StopQueryWorkloadInsightsTopContributors.html
*/
toStopQueryWorkloadInsightsTopContributors() {
return this.to('StopQueryWorkloadInsightsTopContributors');
}
/**
* Grants permission to stop a query for retrieving top contributors data points for workload insights
*
* Access Level: Write
*
* https://docs.aws.amazon.com/networkflowmonitor/2.0/APIReference/API_StopQueryWorkloadInsightsTopContributorsData.html
*/
toStopQueryWorkloadInsightsTopContributorsData() {
return this.to('StopQueryWorkloadInsightsTopContributorsData');
}
/**
* Grants permission to add tags to a resource
*
* Access Level: Tagging
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsTagKeys()
*
* https://docs.aws.amazon.com/networkflowmonitor/2.0/APIReference/API_TagResource.html
*/
toTagResource() {
return this.to('TagResource');
}
/**
* Grants permission to remove tags from a resource
*
* Access Level: Tagging
*
* Possible conditions:
* - .ifAwsTagKeys()
*
* https://docs.aws.amazon.com/networkflowmonitor/2.0/APIReference/API_UntagResource.html
*/
toUntagResource() {
return this.to('UntagResource');
}
/**
* Grants permission to update a monitor
*
* Access Level: Write
*
* https://docs.aws.amazon.com/networkflowmonitor/2.0/APIReference/API_UpdateMonitor.html
*/
toUpdateMonitor() {
return this.to('UpdateMonitor');
}
/**
* Grants permission to update a scope
*
* Access Level: Write
*
* https://docs.aws.amazon.com/networkflowmonitor/2.0/APIReference/API_UpdateScope.html
*/
toUpdateScope() {
return this.to('UpdateScope');
}
/**
* Adds a resource of type monitor to the statement
*
* https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-NetworkFlowMonitor-configure-monitors.html
*
* @param monitorName - Identifier for the monitorName.
* @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()
*/
onMonitor(monitorName, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:networkflowmonitor:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:monitor/${monitorName}`);
}
/**
* Adds a resource of type scope to the statement
*
* https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-NetworkFlowMonitor-organizations.html
*
* @param scopeId - Identifier for the scopeId.
* @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()
*/
onScope(scopeId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:networkflowmonitor:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:scope/${scopeId}`);
}
/**
* Filters access by the tag key-value pairs in the request
*
* https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-requesttag
*
* Applies to actions:
* - .toCreateMonitor()
* - .toCreateScope()
* - .toTagResource()
*
* @param tagKey The tag key to check
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifAwsRequestTag(tagKey, value, operator) {
return this.if(`aws:RequestTag/${tagKey}`, value, operator ?? 'StringLike');
}
/**
* Filters access by the tag key-value pairs attached to the resource
*
* https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-resourcetag
*
* Applies to resource types:
* - monitor
* - scope
*
* @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 in the request
*
* https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-tagkeys
*
* Applies to actions:
* - .toCreateMonitor()
* - .toCreateScope()
* - .toTagResource()
* - .toUntagResource()
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifAwsTagKeys(value, operator) {
return this.if(`aws:TagKeys`, value, operator ?? 'StringLike');
}
}
exports.Networkflowmonitor = Networkflowmonitor;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV0d29ya2Zsb3dtb25pdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsibmV0d29ya2Zsb3dtb25pdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLHlDQUF5RDtBQUV6RDs7OztHQUlHO0FBQ0gsTUFBYSxrQkFBbUIsU0FBUSx3QkFBZTtJQUdyRDs7OztPQUlHO0lBQ0gsWUFBWSxHQUFZO1FBQ3RCLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQVJOLGtCQUFhLEdBQUcsb0JBQW9CLENBQUM7UUF3VGxDLG9CQUFlLEdBQW9CO1lBQzNDLEtBQUssRUFBRTtnQkFDTCxlQUFlO2dCQUNmLGFBQWE7Z0JBQ2IsZUFBZTtnQkFDZixhQUFhO2dCQUNiLFNBQVM7Z0JBQ1Qsa0NBQWtDO2dCQUNsQywyQ0FBMkM7Z0JBQzNDLCtDQUErQztnQkFDL0MsaUNBQWlDO2dCQUNqQywwQ0FBMEM7Z0JBQzFDLDhDQUE4QztnQkFDOUMsZUFBZTtnQkFDZixhQUFhO2FBQ2Q7WUFDRCxJQUFJLEVBQUU7Z0JBQ0osWUFBWTtnQkFDWix1Q0FBdUM7Z0JBQ3ZDLGdEQUFnRDtnQkFDaEQsb0RBQW9EO2dCQUNwRCxzQ0FBc0M7Z0JBQ3RDLCtDQUErQztnQkFDL0MsbURBQW1EO2dCQUNuRCxVQUFVO2dCQUNWLHFCQUFxQjthQUN0QjtZQUNELElBQUksRUFBRTtnQkFDSixjQUFjO2dCQUNkLFlBQVk7YUFDYjtZQUNELE9BQU8sRUFBRTtnQkFDUCxhQUFhO2dCQUNiLGVBQWU7YUFDaEI7U0FDRixDQUFDO0lBbFZGLENBQUM7SUFFRDs7Ozs7Ozs7OztPQVVHO0lBQ0ksZUFBZTtRQUNwQixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVEOzs7Ozs7Ozs7O09BVUc7SUFDSSxhQUFhO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksZUFBZTtRQUNwQixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLGFBQWE7UUFDbEIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxZQUFZO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksdUNBQXVDO1FBQzVDLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxnREFBZ0Q7UUFDckQsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLGdEQUFnRCxDQUFDLENBQUM7SUFDbkUsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLG9EQUFvRDtRQUN6RCxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsb0RBQW9ELENBQUMsQ0FBQztJQUN2RSxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksc0NBQXNDO1FBQzNDLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSwrQ0FBK0M7UUFDcEQsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLCtDQUErQyxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLG1EQUFtRDtRQUN4RCxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsbURBQW1ELENBQUMsQ0FBQztJQUN0RSxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksVUFBVTtRQUNmLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksY0FBYztRQUNuQixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLFlBQVk7UUFDakIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxxQkFBcUI7UUFDMUIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLHFCQUFxQixDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLFNBQVM7UUFDZCxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLGtDQUFrQztRQUN2QyxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsa0NBQWtDLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksMkNBQTJDO1FBQ2hELE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSwrQ0FBK0M7UUFDcEQsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLCtDQUErQyxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLGlDQUFpQztRQUN0QyxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsaUNBQWlDLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksMENBQTBDO1FBQy9DLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSw4Q0FBOEM7UUFDbkQsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLDhDQUE4QyxDQUFDLENBQUM7SUFDakUsQ0FBQztJQUVEOzs7Ozs7Ozs7O09BVUc7SUFDSSxhQUFhO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0ksZUFBZTtRQUNwQixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLGVBQWU7UUFDcEIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxhQUFhO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBdUNEOzs7Ozs7Ozs7Ozs7T0FZRztJQUNJLFNBQVMsQ0FBQyxXQUFtQixFQUFFLE9BQWdCLEVBQUUsTUFBZSxFQUFFLFNBQWtCO1FBQ3pGLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFRLFNBQVMsSUFBSSxJQUFJLENBQUMsZ0JBQWlCLHVCQUF3QixNQUFNLElBQUksSUFBSSxDQUFDLGFBQWMsSUFBSyxPQUFPLElBQUksSUFBSSxDQUFDLGNBQWUsWUFBYSxXQUFZLEVBQUUsQ0FBQyxDQUFDO0lBQ2xMLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7O09BWUc7SUFDSSxPQUFPLENBQUMsT0FBZSxFQUFFLE9BQWdCLEVBQUUsTUFBZSxFQUFFLFNBQWtCO1FBQ25GLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFRLFNBQVMsSUFBSSxJQUFJLENBQUMsZ0JBQWlCLHVCQUF3QixNQUFNLElBQUksSUFBSSxDQUFDLGFBQWMsSUFBSyxPQUFPLElBQUksSUFBSSxDQUFDLGNBQWUsVUFBVyxPQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQzVLLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7OztPQWFHO0lBQ0ksZUFBZSxDQUFDLE1BQWMsRUFBRSxLQUF3QixFQUFFLFFBQTRCO1FBQzNGLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxrQkFBbUIsTUFBTyxFQUFFLEVBQUUsS0FBSyxFQUFFLFFBQVEsSUFBSSxZQUFZLENBQUMsQ0FBQztJQUNoRixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7OztPQVlHO0lBQ0ksZ0JBQWdCLENBQUMsTUFBYyxFQUFFLEtBQXdCLEVBQUUsUUFBNEI7UUFDNUYsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLG1CQUFvQixNQUFPLEVBQUUsRUFBRSxLQUFLLEVBQUUsUUFBUSxJQUFJLFlBQVksQ0FBQyxDQUFDO0lBQ2pGLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7OztPQWFHO0lBQ0ksWUFBWSxDQUFDLEtBQXdCLEVBQUUsUUFBNEI7UUFDeEUsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsRUFBRSxLQUFLLEVBQUUsUUFBUSxJQUFJLFlBQVksQ0FBQyxDQUFDO0lBQ2pFLENBQUM7Q0FDRjtBQXBiRCxnREFvYkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBY2Nlc3NMZXZlbExpc3QgfSBmcm9tICcuLi8uLi9zaGFyZWQvYWNjZXNzLWxldmVsJztcbmltcG9ydCB7IFBvbGljeVN0YXRlbWVudCwgT3BlcmF0b3IgfSBmcm9tICcuLi8uLi9zaGFyZWQnO1xuXG4vKipcbiAqIFN0YXRlbWVudCBwcm92aWRlciBmb3Igc2VydmljZSBbbmV0d29ya2Zsb3dtb25pdG9yXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc2VydmljZS1hdXRob3JpemF0aW9uL2xhdGVzdC9yZWZlcmVuY2UvbGlzdF9uZXR3b3JrZmxvd21vbml0b3IuaHRtbCkuXG4gKlxuICogQHBhcmFtIHNpZCBbU0lEXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX3NpZC5odG1sKSBvZiB0aGUgc3RhdGVtZW50XG4gKi9cbmV4cG9ydCBjbGFzcyBOZXR3b3JrZmxvd21vbml0b3IgZXh0ZW5kcyBQb2xpY3lTdGF0ZW1lbnQge1xuICBwdWJsaWMgc2VydmljZVByZWZpeCA9ICduZXR3b3JrZmxvd21vbml0b3InO1xuXG4gIC8qKlxuICAgKiBTdGF0ZW1lbnQgcHJvdmlkZXIgZm9yIHNlcnZpY2UgW25ldHdvcmtmbG93bW9uaXRvcl0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3NlcnZpY2UtYXV0aG9yaXphdGlvbi9sYXRlc3QvcmVmZXJlbmNlL2xpc3RfbmV0d29ya2Zsb3dtb25pdG9yLmh0bWwpLlxuICAgKlxuICAgKiBAcGFyYW0gc2lkIFtTSURdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfc2lkLmh0bWwpIG9mIHRoZSBzdGF0ZW1lbnRcbiAgICovXG4gIGNvbnN0cnVjdG9yKHNpZD86IHN0cmluZykge1xuICAgIHN1cGVyKHNpZCk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY3JlYXRlIGEgbW9uaXRvclxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVxdWVzdFRhZygpXG4gICAqIC0gLmlmQXdzVGFnS2V5cygpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9uZXR3b3JrZmxvd21vbml0b3IvMi4wL0FQSVJlZmVyZW5jZS9BUElfQ3JlYXRlTW9uaXRvci5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVNb25pdG9yKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVNb25pdG9yJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY3JlYXRlIGEgc2NvcGVcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkF3c1JlcXVlc3RUYWcoKVxuICAgKiAtIC5pZkF3c1RhZ0tleXMoKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbmV0d29ya2Zsb3dtb25pdG9yLzIuMC9BUElSZWZlcmVuY2UvQVBJX0NyZWF0ZVNjb3BlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZVNjb3BlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVTY29wZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlbGV0ZSBhIG1vbml0b3JcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbmV0d29ya2Zsb3dtb25pdG9yLzIuMC9BUElSZWZlcmVuY2UvQVBJX0RlbGV0ZU1vbml0b3IuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlTW9uaXRvcigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlTW9uaXRvcicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlbGV0ZSBhIHNjb3BlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL25ldHdvcmtmbG93bW9uaXRvci8yLjAvQVBJUmVmZXJlbmNlL0FQSV9EZWxldGVTY29wZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVTY29wZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlU2NvcGUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgaW5mb3JtYXRpb24gYWJvdXQgYSBtb25pdG9yXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbmV0d29ya2Zsb3dtb25pdG9yLzIuMC9BUElSZWZlcmVuY2UvQVBJX0dldE1vbml0b3IuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0TW9uaXRvcigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0TW9uaXRvcicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdldCB0aGUgcmVzdWx0cyBvZiBhIHF1ZXJ5IHRoYXQgcmV0cmlldmVzIHRvcCBjb250cmlidXRvcnMgZGF0YSBmb3IgYSBtb25pdG9yXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbmV0d29ya2Zsb3dtb25pdG9yLzIuMC9BUElSZWZlcmVuY2UvQVBJX0dldFF1ZXJ5UmVzdWx0c01vbml0b3JUb3BDb250cmlidXRvcnMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0UXVlcnlSZXN1bHRzTW9uaXRvclRvcENvbnRyaWJ1dG9ycygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0UXVlcnlSZXN1bHRzTW9uaXRvclRvcENvbnRyaWJ1dG9ycycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdldCB0aGUgcmVzdWx0cyBvZiBhIHF1ZXJ5IHRoYXQgcmV0cmlldmVzIHRvcCBjb250cmlidXRvcnMgZm9yIHdvcmtsb2FkIGluc2lnaHRzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbmV0d29ya2Zsb3dtb25pdG9yLzIuMC9BUElSZWZlcmVuY2UvQVBJX0dldFF1ZXJ5UmVzdWx0c1dvcmtsb2FkSW5zaWdodHNUb3BDb250cmlidXRvcnMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0UXVlcnlSZXN1bHRzV29ya2xvYWRJbnNpZ2h0c1RvcENvbnRyaWJ1dG9ycygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0UXVlcnlSZXN1bHRzV29ya2xvYWRJbnNpZ2h0c1RvcENvbnRyaWJ1dG9ycycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdldCB0aGUgcmVzdWx0cyBvZiBhIHF1ZXJ5IHRoYXQgcmV0cmlldmVzIHRvcCBjb250cmlidXRvcnMgZGF0YSBwb2ludHMgZm9yIHdvcmtsb2FkIGluc2lnaHRzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbmV0d29ya2Zsb3dtb25pdG9yLzIuMC9BUElSZWZlcmVuY2UvQVBJX0dldFF1ZXJ5UmVzdWx0c1dvcmtsb2FkSW5zaWdodHNUb3BDb250cmlidXRvcnNEYXRhLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldFF1ZXJ5UmVzdWx0c1dvcmtsb2FkSW5zaWdodHNUb3BDb250cmlidXRvcnNEYXRhKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRRdWVyeVJlc3VsdHNXb3JrbG9hZEluc2lnaHRzVG9wQ29udHJpYnV0b3JzRGF0YScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdldCB0aGUgc3RhdHVzIG9mIGEgcXVlcnkgdGhhdCByZXRyaWV2ZXMgdG9wIGNvbnRyaWJ1dG9ycyBkYXRhIGZvciBhIG1vbml0b3JcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9uZXR3b3JrZmxvd21vbml0b3IvMi4wL0FQSVJlZmVyZW5jZS9BUElfR2V0UXVlcnlTdGF0dXNNb25pdG9yVG9wQ29udHJpYnV0b3JzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldFF1ZXJ5U3RhdHVzTW9uaXRvclRvcENvbnRyaWJ1dG9ycygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0UXVlcnlTdGF0dXNNb25pdG9yVG9wQ29udHJpYnV0b3JzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZ2V0IHRoZSBzdGF0dXMgb2YgYSBxdWVyeSB0aGF0IHJldHJpZXZlcyB0b3AgY29udHJpYnV0b3JzIGZvciB3b3JrbG9hZCBpbnNpZ2h0c1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL25ldHdvcmtmbG93bW9uaXRvci8yLjAvQVBJUmVmZXJlbmNlL0FQSV9HZXRRdWVyeVN0YXR1c1dvcmtsb2FkSW5zaWdodHNUb3BDb250cmlidXRvcnMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0UXVlcnlTdGF0dXNXb3JrbG9hZEluc2lnaHRzVG9wQ29udHJpYnV0b3JzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRRdWVyeVN0YXR1c1dvcmtsb2FkSW5zaWdodHNUb3BDb250cmlidXRvcnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgdGhlIHN0YXR1cyBvZiBhIHF1ZXJ5IHRoYXQgcmV0cmlldmVzIHRvcCBjb250cmlidXRvcnMgZGF0YSBwb2ludHMgZm9yIHdvcmtsb2FkIGluc2lnaHRzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbmV0d29ya2Zsb3dtb25pdG9yLzIuMC9BUElSZWZlcmVuY2UvQVBJX0dldFF1ZXJ5U3RhdHVzV29ya2xvYWRJbnNpZ2h0c1RvcENvbnRyaWJ1dG9yc0RhdGEuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0UXVlcnlTdGF0dXNXb3JrbG9hZEluc2lnaHRzVG9wQ29udHJpYnV0b3JzRGF0YSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0UXVlcnlTdGF0dXNXb3JrbG9hZEluc2lnaHRzVG9wQ29udHJpYnV0b3JzRGF0YScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdldCBpbmZvcm1hdGlvbiBhYm91dCBhIHNjb3BlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbmV0d29ya2Zsb3dtb25pdG9yLzIuMC9BUElSZWZlcmVuY2UvQVBJX0dldFNjb3BlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldFNjb3BlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRTY29wZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgYWxsIG1vbml0b3JzIGluIGFuIGFjY291bnQgYW5kIHRoZWlyIHN0YXR1c2VzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbmV0d29ya2Zsb3dtb25pdG9yLzIuMC9BUElSZWZlcmVuY2UvQVBJX0xpc3RNb25pdG9ycy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0TW9uaXRvcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RNb25pdG9ycycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdldCBhbGwgc2NvcGVzIGZvciBhbiBhY2NvdW50XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbmV0d29ya2Zsb3dtb25pdG9yLzIuMC9BUElSZWZlcmVuY2UvQVBJX0xpc3RTY29wZXMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdFNjb3BlcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdFNjb3BlcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgdGhlIHRhZ3MgZm9yIGEgcmVzb3VyY2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9uZXR3b3JrZmxvd21vbml0b3IvMi4wL0FQSVJlZmVyZW5jZS9BUElfTGlzdFRhZ3NGb3JSZXNvdXJjZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0VGFnc0ZvclJlc291cmNlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0VGFnc0ZvclJlc291cmNlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcHVibGlzaCBhIHJlcG9ydFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9uZXR3b3JrZmxvd21vbml0b3IvMi4wL0FQSVJlZmVyZW5jZS9BUElfUHVibGlzaC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9QdWJsaXNoKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdQdWJsaXNoJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gc3RhcnQgYSBxdWVyeSBmb3IgcmV0cmlldmluZyB0b3AgY29udHJpYnV0b3JzIGRhdGEgZm9yIGEgbW9uaXRvclxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9uZXR3b3JrZmxvd21vbml0b3IvMi4wL0FQSVJlZmVyZW5jZS9BUElfU3RhcnRRdWVyeU1vbml0b3JUb3BDb250cmlidXRvcnMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvU3RhcnRRdWVyeU1vbml0b3JUb3BDb250cmlidXRvcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1N0YXJ0UXVlcnlNb25pdG9yVG9wQ29udHJpYnV0b3JzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gc3RhcnQgYSBxdWVyeSBmb3IgcmV0cmlldmluZyB0b3AgY29udHJpYnV0b3JzIGRhdGEgZm9yIHdvcmtsb2FkIGluc2lnaHRzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL25ldHdvcmtmbG93bW9uaXRvci8yLjAvQVBJUmVmZXJlbmNlL0FQSV9TdGFydFF1ZXJ5V29ya2xvYWRJbnNpZ2h0c1RvcENvbnRyaWJ1dG9ycy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9TdGFydFF1ZXJ5V29ya2xvYWRJbnNpZ2h0c1RvcENvbnRyaWJ1dG9ycygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnU3RhcnRRdWVyeVdvcmtsb2FkSW5zaWdodHNUb3BDb250cmlidXRvcnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBzdGFydCBhIHF1ZXJ5IGZvciByZXRyaWV2aW5nIHRvcCBjb250cmlidXRvcnMgZGF0YSBwb2ludHMgZm9yIHdvcmtsb2FkIGluc2lnaHRzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL25ldHdvcmtmbG93bW9uaXRvci8yLjAvQVBJUmVmZXJlbmNlL0FQSV9TdGFydFF1ZXJ5V29ya2xvYWRJbnNpZ2h0c1RvcENvbnRyaWJ1dG9yc0RhdGEuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvU3RhcnRRdWVyeVdvcmtsb2FkSW5zaWdodHNUb3BDb250cmlidXRvcnNEYXRhKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdTdGFydFF1ZXJ5V29ya2xvYWRJbnNpZ2h0c1RvcENvbnRyaWJ1dG9yc0RhdGEnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBzdG9wIGEgcXVlcnkgZm9yIHJldHJpZXZpbmcgdG9wIGNvbnRyaWJ1dG9ycyBkYXRhIGZvciBhIG1vbml0b3JcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbmV0d29ya2Zsb3dtb25pdG9yLzIuMC9BUElSZWZlcmVuY2UvQVBJX1N0b3BRdWVyeU1vbml0b3JUb3BDb250cmlidXRvcnMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvU3RvcFF1ZXJ5TW9uaXRvclRvcENvbnRyaWJ1dG9ycygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnU3RvcFF1ZXJ5TW9uaXRvclRvcENvbnRyaWJ1dG9ycycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHN0b3AgYSBxdWVyeSBmb3IgcmV0cmlldmluZyB0b3AgY29udHJpYnV0b3JzIGZvciB3b3JrbG9hZCBpbnNpZ2h0c1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9uZXR3b3JrZmxvd21vbml0b3IvMi4wL0FQSVJlZmVyZW5jZS9BUElfU3RvcFF1ZXJ5V29ya2xvYWRJbnNpZ2h0c1RvcENvbnRyaWJ1dG9ycy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9TdG9wUXVlcnlXb3JrbG9hZEluc2lnaHRzVG9wQ29udHJpYnV0b3JzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdTdG9wUXVlcnlXb3JrbG9hZEluc2lnaHRzVG9wQ29udHJpYnV0b3JzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gc3RvcCBhIHF1ZXJ5IGZvciByZXRyaWV2aW5nIHRvcCBjb250cmlidXRvcnMgZGF0YSBwb2ludHMgZm9yIHdvcmtsb2FkIGluc2lnaHRzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL25ldHdvcmtmbG93bW9uaXRvci8yLjAvQVBJUmVmZXJlbmNlL0FQSV9TdG9wUXVlcnlXb3JrbG9hZEluc2lnaHRzVG9wQ29udHJpYnV0b3JzRGF0YS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9TdG9wUXVlcnlXb3JrbG9hZEluc2lnaHRzVG9wQ29udHJpYnV0b3JzRGF0YSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnU3RvcFF1ZXJ5V29ya2xvYWRJbnNpZ2h0c1RvcENvbnRyaWJ1dG9yc0RhdGEnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBhZGQgdGFncyB0byBhIHJlc291cmNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogVGFnZ2luZ1xuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkF3c1JlcXVlc3RUYWcoKVxuICAgKiAtIC5pZkF3c1RhZ0tleXMoKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbmV0d29ya2Zsb3dtb25pdG9yLzIuMC9BUElSZWZlcmVuY2UvQVBJX1RhZ1Jlc291cmNlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1RhZ1Jlc291cmNlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdUYWdSZXNvdXJjZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJlbW92ZSB0YWdzIGZyb20gYSByZXNvdXJjZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFRhZ2dpbmdcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NUYWdLZXlzKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL25ldHdvcmtmbG93bW9uaXRvci8yLjAvQVBJUmVmZXJlbmNlL0FQSV9VbnRhZ1Jlc291cmNlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1VudGFnUmVzb3VyY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1VudGFnUmVzb3VyY2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byB1cGRhdGUgYSBtb25pdG9yXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL25ldHdvcmtmbG93bW9uaXRvci8yLjAvQVBJUmVmZXJlbmNlL0FQSV9VcGRhdGVNb25pdG9yLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1VwZGF0ZU1vbml0b3IoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1VwZGF0ZU1vbml0b3InKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byB1cGRhdGUgYSBzY29wZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9uZXR3b3JrZmxvd21vbml0b3IvMi4wL0FQSVJlZmVyZW5jZS9BUElfVXBkYXRlU2NvcGUuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvVXBkYXRlU2NvcGUoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1VwZGF0ZVNjb3BlJyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWNjZXNzTGV2ZWxMaXN0OiBBY2Nlc3NMZXZlbExpc3QgPSB7XG4gICAgV3JpdGU6IFtcbiAgICAgICdDcmVhdGVNb25pdG9yJyxcbiAgICAgICdDcmVhdGVTY29wZScsXG4gICAgICAnRGVsZXRlTW9uaXRvcicsXG4gICAgICAnRGVsZXRlU2NvcGUnLFxuICAgICAgJ1B1Ymxpc2gnLFxuICAgICAgJ1N0YXJ0UXVlcnlNb25pdG9yVG9wQ29udHJpYnV0b3JzJyxcbiAgICAgICdTdGFydFF1ZXJ5V29ya2xvYWRJbnNpZ2h0c1RvcENvbnRyaWJ1dG9ycycsXG4gICAgICAnU3RhcnRRdWVyeVdvcmtsb2FkSW5zaWdodHNUb3BDb250cmlidXRvcnNEYXRhJyxcbiAgICAgICdTdG9wUXVlcnlNb25pdG9yVG9wQ29udHJpYnV0b3JzJyxcbiAgICAgICdTdG9wUXVlcnlXb3JrbG9hZEluc2lnaHRzVG9wQ29udHJpYnV0b3JzJyxcbiAgICAgICdTdG9wUXVlcnlXb3JrbG9hZEluc2lnaHRzVG9wQ29udHJpYnV0b3JzRGF0YScsXG4gICAgICAnVXBkYXRlTW9uaXRvcicsXG4gICAgICAnVXBkYXRlU2NvcGUnXG4gICAgXSxcbiAgICBSZWFkOiBbXG4gICAgICAnR2V0TW9uaXRvcicsXG4gICAgICAnR2V0UXVlcnlSZXN1bHRzTW9uaXRvclRvcENvbnRyaWJ1dG9ycycsXG4gICAgICAnR2V0UXVlcnlSZXN1bHRzV29ya2xvYWRJbnNpZ2h0c1RvcENvbnRyaWJ1dG9ycycsXG4gICAgICAnR2V0UXVlcnlSZXN1bHRzV29ya2xvYWRJbnNpZ2h0c1RvcENvbnRyaWJ1dG9yc0RhdGEnLFxuICAgICAgJ0dldFF1ZXJ5U3RhdHVzTW9uaXRvclRvcENvbnRyaWJ1dG9ycycsXG4gICAgICAnR2V0UXVlcnlTdGF0dXNXb3JrbG9hZEluc2lnaHRzVG9wQ29udHJpYnV0b3JzJyxcbiAgICAgICdHZXRRdWVyeVN0YXR1c1dvcmtsb2FkSW5zaWdodHNUb3BDb250cmlidXRvcnNEYXRhJyxcbiAgICAgICdHZXRTY29wZScsXG4gICAgICAnTGlzdFRhZ3NGb3JSZXNvdXJjZSdcbiAgICBdLFxuICAgIExpc3Q6IFtcbiAgICAgICdMaXN0TW9uaXRvcnMnLFxuICAgICAgJ0xpc3RTY29wZXMnXG4gICAgXSxcbiAgICBUYWdnaW5nOiBbXG4gICAgICAnVGFnUmVzb3VyY2UnLFxuICAgICAgJ1VudGFnUmVzb3VyY2UnXG4gICAgXVxuICB9O1xuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVzb3VyY2Ugb2YgdHlwZSBtb25pdG9yIHRvIHRoZSBzdGF0ZW1lbnRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkV2F0Y2gvbGF0ZXN0L21vbml0b3JpbmcvQ2xvdWRXYXRjaC1OZXR3b3JrRmxvd01vbml0b3ItY29uZmlndXJlLW1vbml0b3JzLmh0bWxcbiAgICpcbiAgICogQHBhcmFtIG1vbml0b3JOYW1lIC0gSWRlbnRpZmllciBmb3IgdGhlIG1vbml0b3JOYW1lLlxuICAgKiBAcGFyYW0gYWNjb3VudCAtIEFjY291bnQgb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIGFjY291bnQuXG4gICAqIEBwYXJhbSByZWdpb24gLSBSZWdpb24gb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHJlZ2lvbi5cbiAgICogQHBhcmFtIHBhcnRpdGlvbiAtIFBhcnRpdGlvbiBvZiB0aGUgQVdTIGFjY291bnQgW2F3cywgYXdzLWNuLCBhd3MtdXMtZ292XTsgZGVmYXVsdHMgdG8gYGF3c2AsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHBhcnRpdGlvbi5cbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NSZXNvdXJjZVRhZygpXG4gICAqL1xuICBwdWJsaWMgb25Nb25pdG9yKG1vbml0b3JOYW1lOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06bmV0d29ya2Zsb3dtb25pdG9yOiR7IHJlZ2lvbiA/PyB0aGlzLmRlZmF1bHRSZWdpb24gfTokeyBhY2NvdW50ID8/IHRoaXMuZGVmYXVsdEFjY291bnQgfTptb25pdG9yLyR7IG1vbml0b3JOYW1lIH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVzb3VyY2Ugb2YgdHlwZSBzY29wZSB0byB0aGUgc3RhdGVtZW50XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25DbG91ZFdhdGNoL2xhdGVzdC9tb25pdG9yaW5nL0Nsb3VkV2F0Y2gtTmV0d29ya0Zsb3dNb25pdG9yLW9yZ2FuaXphdGlvbnMuaHRtbFxuICAgKlxuICAgKiBAcGFyYW0gc2NvcGVJZCAtIElkZW50aWZpZXIgZm9yIHRoZSBzY29wZUlkLlxuICAgKiBAcGFyYW0gYWNjb3VudCAtIEFjY291bnQgb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIGFjY291bnQuXG4gICAqIEBwYXJhbSByZWdpb24gLSBSZWdpb24gb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHJlZ2lvbi5cbiAgICogQHBhcmFtIHBhcnRpdGlvbiAtIFBhcnRpdGlvbiBvZiB0aGUgQVdTIGFjY291bnQgW2F3cywgYXdzLWNuLCBhd3MtdXMtZ292XTsgZGVmYXVsdHMgdG8gYGF3c2AsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHBhcnRpdGlvbi5cbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NSZXNvdXJjZVRhZygpXG4gICAqL1xuICBwdWJsaWMgb25TY29wZShzY29wZUlkOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06bmV0d29ya2Zsb3dtb25pdG9yOiR7IHJlZ2lvbiA/PyB0aGlzLmRlZmF1bHRSZWdpb24gfTokeyBhY2NvdW50ID8/IHRoaXMuZGVmYXVsdEFjY291bnQgfTpzY29wZS8keyBzY29wZUlkIH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIGFjY2VzcyBieSB0aGUgdGFnIGtleS12YWx1ZSBwYWlycyBpbiB0aGUgcmVxdWVzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2NvbmRpdGlvbi1rZXlzLmh0bWwjY29uZGl0aW9uLWtleXMtcmVxdWVzdHRhZ1xuICAgKlxuICAgKiBBcHBsaWVzIHRvIGFjdGlvbnM6XG4gICAqIC0gLnRvQ3JlYXRlTW9uaXRvcigpXG4gICAqIC0gLnRvQ3JlYXRlU2NvcGUoKVxuICAgKiAtIC50b1RhZ1Jlc291cmNlKClcbiAgICpcbiAgICogQHBhcmFtIHRhZ0tleSBUaGUgdGFnIGtleSB0byBjaGVja1xuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlKHMpIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBvcGVyYXRvciBXb3JrcyB3aXRoIFtzdHJpbmcgb3BlcmF0b3JzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbl9vcGVyYXRvcnMuaHRtbCNDb25kaXRpb25zX1N0cmluZykuICoqRGVmYXVsdDoqKiBgU3RyaW5nTGlrZWBcbiAgICovXG4gIHB1YmxpYyBpZkF3c1JlcXVlc3RUYWcodGFnS2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSwgb3BlcmF0b3I/OiBPcGVyYXRvciB8IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmlmKGBhd3M6UmVxdWVzdFRhZy8keyB0YWdLZXkgfWAsIHZhbHVlLCBvcGVyYXRvciA/PyAnU3RyaW5nTGlrZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYWNjZXNzIGJ5IHRoZSB0YWcga2V5LXZhbHVlIHBhaXJzIGF0dGFjaGVkIHRvIHRoZSByZXNvdXJjZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2NvbmRpdGlvbi1rZXlzLmh0bWwjY29uZGl0aW9uLWtleXMtcmVzb3VyY2V0YWdcbiAgICpcbiAgICogQXBwbGllcyB0byByZXNvdXJjZSB0eXBlczpcbiAgICogLSBtb25pdG9yXG4gICAqIC0gc2NvcGVcbiAgICpcbiAgICogQHBhcmFtIHRhZ0tleSBUaGUgdGFnIGtleSB0byBjaGVja1xuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlKHMpIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBvcGVyYXRvciBXb3JrcyB3aXRoIFtzdHJpbmcgb3BlcmF0b3JzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbl9vcGVyYXRvcnMuaHRtbCNDb25kaXRpb25zX1N0cmluZykuICoqRGVmYXVsdDoqKiBgU3RyaW5nTGlrZWBcbiAgICovXG4gIHB1YmxpYyBpZkF3c1Jlc291cmNlVGFnKHRhZ0tleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pZihgYXdzOlJlc291cmNlVGFnLyR7IHRhZ0tleSB9YCwgdmFsdWUsIG9wZXJhdG9yID8/ICdTdHJpbmdMaWtlJyk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgdGhlIHRhZyBrZXlzIGluIHRoZSByZXF1ZXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfY29uZGl0aW9uLWtleXMuaHRtbCNjb25kaXRpb24ta2V5cy10YWdrZXlzXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9DcmVhdGVNb25pdG9yKClcbiAgICogLSAudG9DcmVhdGVTY29wZSgpXG4gICAqIC0gLnRvVGFnUmVzb3VyY2UoKVxuICAgKiAtIC50b1VudGFnUmVzb3VyY2UoKVxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlKHMpIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBvcGVyYXRvciBXb3JrcyB3aXRoIFtzdHJpbmcgb3BlcmF0b3JzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbl9vcGVyYXRvcnMuaHRtbCNDb25kaXRpb25zX1N0cmluZykuICoqRGVmYXVsdDoqKiBgU3RyaW5nTGlrZWBcbiAgICovXG4gIHB1YmxpYyBpZkF3c1RhZ0tleXModmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdLCBvcGVyYXRvcj86IE9wZXJhdG9yIHwgc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaWYoYGF3czpUYWdLZXlzYCwgdmFsdWUsIG9wZXJhdG9yID8/ICdTdHJpbmdMaWtlJyk7XG4gIH1cbn1cbiJdfQ==