cdk-iam-floyd
Version:
AWS IAM policy statement generator with fluent interface for AWS CDK
635 lines • 52.7 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.Wickr = void 0;
const shared_1 = require("../../shared");
/**
* Statement provider for service [wickr](https://docs.aws.amazon.com/service-authorization/latest/reference/list_awswickr.html).
*
* @param sid [SID](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_sid.html) of the statement
*/
class Wickr extends shared_1.PolicyStatement {
/**
* Grants permission to batch create users in a Wickr network
*
* Access Level: Write
*
* https://docs.aws.amazon.com/wickr/latest/adminguide/security-iam.html
*/
toBatchCreateUser() {
return this.to('BatchCreateUser');
}
/**
* Grants permission to batch delete users from a Wickr network
*
* Access Level: Write
*
* https://docs.aws.amazon.com/wickr/latest/adminguide/security-iam.html
*/
toBatchDeleteUser() {
return this.to('BatchDeleteUser');
}
/**
* Grants permission to batch lookup user unames in a Wickr network
*
* Access Level: Read
*
* https://docs.aws.amazon.com/wickr/latest/adminguide/security-iam.html
*/
toBatchLookupUserUname() {
return this.to('BatchLookupUserUname');
}
/**
* Grants permission to batch reinvite users in a Wickr network
*
* Access Level: Write
*
* https://docs.aws.amazon.com/wickr/latest/adminguide/security-iam.html
*/
toBatchReinviteUser() {
return this.to('BatchReinviteUser');
}
/**
* Grants permission to batch reset devices for a user in a Wickr network
*
* Access Level: Write
*
* https://docs.aws.amazon.com/wickr/latest/adminguide/security-iam.html
*/
toBatchResetDevicesForUser() {
return this.to('BatchResetDevicesForUser');
}
/**
* Grants permission to batch toggle user suspend status in a Wickr network
*
* Access Level: Write
*
* https://docs.aws.amazon.com/wickr/latest/adminguide/security-iam.html
*/
toBatchToggleUserSuspendStatus() {
return this.to('BatchToggleUserSuspendStatus');
}
/**
* Grants permission to create and manage Wickr networks
*
* Access Level: Write
*
* https://docs.aws.amazon.com/wickr/latest/adminguide/security-iam.html
*/
toCreateAdminSession() {
return this.to('CreateAdminSession');
}
/**
* Grants permission to create a bot in a Wickr network
*
* Access Level: Write
*
* https://docs.aws.amazon.com/wickr/latest/adminguide/security-iam.html
*/
toCreateBot() {
return this.to('CreateBot');
}
/**
* Grants permission to create a data retention bot in a Wickr network
*
* Access Level: Write
*
* https://docs.aws.amazon.com/wickr/latest/adminguide/security-iam.html
*/
toCreateDataRetentionBot() {
return this.to('CreateDataRetentionBot');
}
/**
* Grants permission to create a data retention bot challenge in a Wickr network
*
* Access Level: Write
*
* https://docs.aws.amazon.com/wickr/latest/adminguide/security-iam.html
*/
toCreateDataRetentionBotChallenge() {
return this.to('CreateDataRetentionBotChallenge');
}
/**
* Grants permission to create a new Wickr network
*
* Access Level: Write
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsTagKeys()
*
* https://docs.aws.amazon.com/wickr/latest/adminguide/security-iam.html
*/
toCreateNetwork() {
return this.to('CreateNetwork');
}
/**
* Grants permission to create a security group in a Wickr network
*
* Access Level: Write
*
* https://docs.aws.amazon.com/wickr/latest/adminguide/security-iam.html
*/
toCreateSecurityGroup() {
return this.to('CreateSecurityGroup');
}
/**
* Grants permission to delete a bot from a Wickr network
*
* Access Level: Write
*
* https://docs.aws.amazon.com/wickr/latest/adminguide/security-iam.html
*/
toDeleteBot() {
return this.to('DeleteBot');
}
/**
* Grants permission to delete a data retention bot from a Wickr network
*
* Access Level: Write
*
* https://docs.aws.amazon.com/wickr/latest/adminguide/security-iam.html
*/
toDeleteDataRetentionBot() {
return this.to('DeleteDataRetentionBot');
}
/**
* Grants permission to delete Wickr networks
*
* Access Level: Write
*
* https://docs.aws.amazon.com/wickr/latest/adminguide/security-iam.html
*/
toDeleteNetwork() {
return this.to('DeleteNetwork');
}
/**
* Grants permission to delete a security group from a Wickr network
*
* Access Level: Write
*
* https://docs.aws.amazon.com/wickr/latest/adminguide/security-iam.html
*/
toDeleteSecurityGroup() {
return this.to('DeleteSecurityGroup');
}
/**
* Grants permission to get bot information in a Wickr network
*
* Access Level: Read
*
* https://docs.aws.amazon.com/wickr/latest/adminguide/security-iam.html
*/
toGetBot() {
return this.to('GetBot');
}
/**
* Grants permission to get bot count for a Wickr network
*
* Access Level: Read
*
* https://docs.aws.amazon.com/wickr/latest/adminguide/security-iam.html
*/
toGetBotsCount() {
return this.to('GetBotsCount');
}
/**
* Grants permission to get data retention bot information in a Wickr network
*
* Access Level: Read
*
* https://docs.aws.amazon.com/wickr/latest/adminguide/security-iam.html
*/
toGetDataRetentionBot() {
return this.to('GetDataRetentionBot');
}
/**
* Grants permission to get guest user history count for a Wickr network
*
* Access Level: Read
*
* https://docs.aws.amazon.com/wickr/latest/adminguide/security-iam.html
*/
toGetGuestUserHistoryCount() {
return this.to('GetGuestUserHistoryCount');
}
/**
* Grants permission to get details of a Wickr network
*
* Access Level: Read
*
* https://docs.aws.amazon.com/wickr/latest/adminguide/security-iam.html
*/
toGetNetwork() {
return this.to('GetNetwork');
}
/**
* Grants permission to get network settings for a Wickr network
*
* Access Level: Read
*
* https://docs.aws.amazon.com/wickr/latest/adminguide/security-iam.html
*/
toGetNetworkSettings() {
return this.to('GetNetworkSettings');
}
/**
* Grants permission to get OIDC information for a Wickr network
*
* Access Level: Read
*
* https://docs.aws.amazon.com/wickr/latest/adminguide/security-iam.html
*/
toGetOidcInfo() {
return this.to('GetOidcInfo');
}
/**
* Grants permission to retrieve the OpenTDF integration configuration for a Wickr network
*
* Access Level: Read
*
* https://docs.aws.amazon.com/wickr/latest/APIReference/API_GetOpentdfConfig.html
*/
toGetOpentdfConfig() {
return this.to('GetOpentdfConfig');
}
/**
* Grants permission to get security group information in a Wickr network
*
* Access Level: Read
*
* https://docs.aws.amazon.com/wickr/latest/adminguide/security-iam.html
*/
toGetSecurityGroup() {
return this.to('GetSecurityGroup');
}
/**
* Grants permission to get information about a user in a Wickr network
*
* Access Level: Read
*
* https://docs.aws.amazon.com/wickr/latest/adminguide/security-iam.html
*/
toGetUser() {
return this.to('GetUser');
}
/**
* Grants permission to get user count for a Wickr network
*
* Access Level: Read
*
* https://docs.aws.amazon.com/wickr/latest/adminguide/security-iam.html
*/
toGetUsersCount() {
return this.to('GetUsersCount');
}
/**
* Grants permission to list blocked guest users in a Wickr network
*
* Access Level: Read
*
* https://docs.aws.amazon.com/wickr/latest/adminguide/security-iam.html
*/
toListBlockedGuestUsers() {
return this.to('ListBlockedGuestUsers');
}
/**
* Grants permission to list bots in a Wickr network
*
* Access Level: Read
*
* https://docs.aws.amazon.com/wickr/latest/adminguide/security-iam.html
*/
toListBots() {
return this.to('ListBots');
}
/**
* Grants permission to list devices for a user in a Wickr network
*
* Access Level: Read
*
* https://docs.aws.amazon.com/wickr/latest/adminguide/security-iam.html
*/
toListDevicesForUser() {
return this.to('ListDevicesForUser');
}
/**
* Grants permission to list guest users in a Wickr network
*
* Access Level: Read
*
* https://docs.aws.amazon.com/wickr/latest/adminguide/security-iam.html
*/
toListGuestUsers() {
return this.to('ListGuestUsers');
}
/**
* Grants permission to list Wickr networks
*
* Access Level: Read
*
* https://docs.aws.amazon.com/wickr/latest/adminguide/security-iam.html
*/
toListNetworks() {
return this.to('ListNetworks');
}
/**
* Grants permission to list users in a security group in a Wickr network
*
* Access Level: Read
*
* https://docs.aws.amazon.com/wickr/latest/adminguide/security-iam.html
*/
toListSecurityGroupUsers() {
return this.to('ListSecurityGroupUsers');
}
/**
* Grants permission to list security groups in a Wickr network
*
* Access Level: Read
*
* https://docs.aws.amazon.com/wickr/latest/adminguide/security-iam.html
*/
toListSecurityGroups() {
return this.to('ListSecurityGroups');
}
/**
* Grants permission to list the tags applied to a Wickr resource
*
* Access Level: Read
*
* https://docs.aws.amazon.com/wickr/latest/adminguide/security-iam.html
*/
toListTagsForResource() {
return this.to('ListTagsForResource');
}
/**
* Grants permission to list users in a Wickr network
*
* Access Level: Read
*
* https://docs.aws.amazon.com/wickr/latest/adminguide/security-iam.html
*/
toListUsers() {
return this.to('ListUsers');
}
/**
* Grants permission to register OIDC configuration for a Wickr network
*
* Access Level: Write
*
* https://docs.aws.amazon.com/wickr/latest/adminguide/security-iam.html
*/
toRegisterOidcConfig() {
return this.to('RegisterOidcConfig');
}
/**
* Grants permission to test OIDC configuration for a Wickr network
*
* Access Level: Write
*
* https://docs.aws.amazon.com/wickr/latest/adminguide/security-iam.html
*/
toRegisterOidcConfigTest() {
return this.to('RegisterOidcConfigTest');
}
/**
* Grants permission to register and save OpenTDF integration configuration for a Wickr network
*
* Access Level: Write
*
* https://docs.aws.amazon.com/wickr/latest/APIReference/API_RegisterOpentdfConfig.html
*/
toRegisterOpentdfConfig() {
return this.to('RegisterOpentdfConfig');
}
/**
* Grants permission to add tags to a specified Wickr resource
*
* Access Level: Tagging
*
* Possible conditions:
* - .ifAwsTagKeys()
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
*
* https://docs.aws.amazon.com/wickr/latest/adminguide/security-iam.html
*/
toTagResource() {
return this.to('TagResource');
}
/**
* Grants permission to untag the specified tags from the specified Wickr resource
*
* Access Level: Tagging
*
* Possible conditions:
* - .ifAwsTagKeys()
*
* https://docs.aws.amazon.com/wickr/latest/adminguide/security-iam.html
*/
toUntagResource() {
return this.to('UntagResource');
}
/**
* Grants permission to update a bot in a Wickr network
*
* Access Level: Write
*
* https://docs.aws.amazon.com/wickr/latest/adminguide/security-iam.html
*/
toUpdateBot() {
return this.to('UpdateBot');
}
/**
* Grants permission to update data retention settings in a Wickr network
*
* Access Level: Write
*
* https://docs.aws.amazon.com/wickr/latest/adminguide/security-iam.html
*/
toUpdateDataRetention() {
return this.to('UpdateDataRetention');
}
/**
* Grants permission to update guest user status in a Wickr network
*
* Access Level: Write
*
* https://docs.aws.amazon.com/wickr/latest/adminguide/security-iam.html
*/
toUpdateGuestUser() {
return this.to('UpdateGuestUser');
}
/**
* Grants permission to update Wickr network details
*
* Access Level: Write
*
* https://docs.aws.amazon.com/wickr/latest/adminguide/security-iam.html
*/
toUpdateNetworkDetails() {
return this.to('UpdateNetworkDetails');
}
/**
* Grants permission to update network settings for a Wickr network
*
* Access Level: Write
*
* https://docs.aws.amazon.com/wickr/latest/adminguide/security-iam.html
*/
toUpdateNetworkSettings() {
return this.to('UpdateNetworkSettings');
}
/**
* Grants permission to update a security group in a Wickr network
*
* Access Level: Write
*
* https://docs.aws.amazon.com/wickr/latest/adminguide/security-iam.html
*/
toUpdateSecurityGroup() {
return this.to('UpdateSecurityGroup');
}
/**
* Grants permission to update user information in a Wickr network
*
* Access Level: Write
*
* https://docs.aws.amazon.com/wickr/latest/adminguide/security-iam.html
*/
toUpdateUser() {
return this.to('UpdateUser');
}
/**
* Adds a resource of type network to the statement
*
* https://docs.aws.amazon.com/wickr/latest/adminguide/
*
* @param networkId - Identifier for the networkId.
* @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()
*/
onNetwork(networkId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:wickr:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:network/${networkId}`);
}
/**
* Filters access by a tag's key and value in a request
*
* https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-requesttag
*
* Applies to actions:
* - .toCreateNetwork()
* - .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 actions:
* - .toTagResource()
*
* Applies to resource types:
* - network
*
* @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 a request
*
* https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-tagkeys
*
* Applies to actions:
* - .toCreateNetwork()
* - .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');
}
/**
* Statement provider for service [wickr](https://docs.aws.amazon.com/service-authorization/latest/reference/list_awswickr.html).
*
*/
constructor(props) {
super(props);
this.servicePrefix = 'wickr';
this.accessLevelList = {
Write: [
'BatchCreateUser',
'BatchDeleteUser',
'BatchReinviteUser',
'BatchResetDevicesForUser',
'BatchToggleUserSuspendStatus',
'CreateAdminSession',
'CreateBot',
'CreateDataRetentionBot',
'CreateDataRetentionBotChallenge',
'CreateNetwork',
'CreateSecurityGroup',
'DeleteBot',
'DeleteDataRetentionBot',
'DeleteNetwork',
'DeleteSecurityGroup',
'RegisterOidcConfig',
'RegisterOidcConfigTest',
'RegisterOpentdfConfig',
'UpdateBot',
'UpdateDataRetention',
'UpdateGuestUser',
'UpdateNetworkDetails',
'UpdateNetworkSettings',
'UpdateSecurityGroup',
'UpdateUser'
],
Read: [
'BatchLookupUserUname',
'GetBot',
'GetBotsCount',
'GetDataRetentionBot',
'GetGuestUserHistoryCount',
'GetNetwork',
'GetNetworkSettings',
'GetOidcInfo',
'GetOpentdfConfig',
'GetSecurityGroup',
'GetUser',
'GetUsersCount',
'ListBlockedGuestUsers',
'ListBots',
'ListDevicesForUser',
'ListGuestUsers',
'ListNetworks',
'ListSecurityGroupUsers',
'ListSecurityGroups',
'ListTagsForResource',
'ListUsers'
],
Tagging: [
'TagResource',
'UntagResource'
]
};
}
}
exports.Wickr = Wickr;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2lja3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ3aWNrci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSx5Q0FBeUQ7QUFHekQ7Ozs7R0FJRztBQUNILE1BQWEsS0FBTSxTQUFRLHdCQUFlO0lBR3hDOzs7Ozs7T0FNRztJQUNJLGlCQUFpQjtRQUN0QixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksaUJBQWlCO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxzQkFBc0I7UUFDM0IsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLHNCQUFzQixDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLG1CQUFtQjtRQUN4QixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksMEJBQTBCO1FBQy9CLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSw4QkFBOEI7UUFDbkMsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLDhCQUE4QixDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLG9CQUFvQjtRQUN6QixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsb0JBQW9CLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksV0FBVztRQUNoQixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLHdCQUF3QjtRQUM3QixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsd0JBQXdCLENB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LHNCQUFzQjtnQkFDdEIsUUFBUTtnQkFDUixjQUFjO2dCQUNkLHFCQUFxQjtnQkFDckIsMEJBQTBCO2dCQUMxQixZQUFZO2dCQUNaLG9CQUFvQjtnQkFDcEIsYUFBYTtnQkFDYixrQkFBa0I7Z0JBQ2xCLGtCQUFrQjtnQkFDbEIsU0FBUztnQkFDVCxlQUFlO2dCQUNmLHVCQUF1QjtnQkFDdkIsVUFBVTtnQkFDVixvQkFBb0I7Z0JBQ3BCLGdCQUFnQjtnQkFDaEIsY0FBYztnQkFDZCx3QkFBd0I7Z0JBQ3hCLG9CQUFvQjtnQkFDcEIscUJBQXFCO2dCQUNyQixXQUFXO2FBQ1o7WUFDRCxPQUFPLEVBQUU7Z0JBQ1AsYUFBYTtnQkFDYixlQUFlO2FBQ2hCO1NBQ0YsQ0FBQztJQThFRixDQUFDO0NBQ0Y7QUFycUJELHNCQXFxQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBY2Nlc3NMZXZlbExpc3QgfSBmcm9tICcuLi8uLi9zaGFyZWQvYWNjZXNzLWxldmVsJztcbmltcG9ydCB7IFBvbGljeVN0YXRlbWVudCwgT3BlcmF0b3IgfSBmcm9tICcuLi8uLi9zaGFyZWQnO1xuaW1wb3J0IHsgYXdzX2lhbSBhcyBpYW0gfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcblxuLyoqXG4gKiBTdGF0ZW1lbnQgcHJvdmlkZXIgZm9yIHNlcnZpY2UgW3dpY2tyXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc2VydmljZS1hdXRob3JpemF0aW9uL2xhdGVzdC9yZWZlcmVuY2UvbGlzdF9hd3N3aWNrci5odG1sKS5cbiAqXG4gKiBAcGFyYW0gc2lkIFtTSURdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfc2lkLmh0bWwpIG9mIHRoZSBzdGF0ZW1lbnRcbiAqL1xuZXhwb3J0IGNsYXNzIFdpY2tyIGV4dGVuZHMgUG9saWN5U3RhdGVtZW50IHtcbiAgcHVibGljIHNlcnZpY2VQcmVmaXggPSAnd2lja3InO1xuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBiYXRjaCBjcmVhdGUgdXNlcnMgaW4gYSBXaWNrciBuZXR3b3JrXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3dpY2tyL2xhdGVzdC9hZG1pbmd1aWRlL3NlY3VyaXR5LWlhbS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9CYXRjaENyZWF0ZVVzZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0JhdGNoQ3JlYXRlVXNlcicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGJhdGNoIGRlbGV0ZSB1c2VycyBmcm9tIGEgV2lja3IgbmV0d29ya1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS93aWNrci9sYXRlc3QvYWRtaW5ndWlkZS9zZWN1cml0eS1pYW0uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQmF0Y2hEZWxldGVVc2VyKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdCYXRjaERlbGV0ZVVzZXInKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBiYXRjaCBsb29rdXAgdXNlciB1bmFtZXMgaW4gYSBXaWNrciBuZXR3b3JrXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vd2lja3IvbGF0ZXN0L2FkbWluZ3VpZGUvc2VjdXJpdHktaWFtLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0JhdGNoTG9va3VwVXNlclVuYW1lKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdCYXRjaExvb2t1cFVzZXJVbmFtZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGJhdGNoIHJlaW52aXRlIHVzZXJzIGluIGEgV2lja3IgbmV0d29ya1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS93aWNrci9sYXRlc3QvYWRtaW5ndWlkZS9zZWN1cml0eS1pYW0uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQmF0Y2hSZWludml0ZVVzZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0JhdGNoUmVpbnZpdGVVc2VyJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gYmF0Y2ggcmVzZXQgZGV2aWNlcyBmb3IgYSB1c2VyIGluIGEgV2lja3IgbmV0d29ya1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS93aWNrci9sYXRlc3QvYWRtaW5ndWlkZS9zZWN1cml0eS1pYW0uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQmF0Y2hSZXNldERldmljZXNGb3JVc2VyKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdCYXRjaFJlc2V0RGV2aWNlc0ZvclVzZXInKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBiYXRjaCB0b2dnbGUgdXNlciBzdXNwZW5kIHN0YXR1cyBpbiBhIFdpY2tyIG5ldHdvcmtcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vd2lja3IvbGF0ZXN0L2FkbWluZ3VpZGUvc2VjdXJpdHktaWFtLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0JhdGNoVG9nZ2xlVXNlclN1c3BlbmRTdGF0dXMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0JhdGNoVG9nZ2xlVXNlclN1c3BlbmRTdGF0dXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYW5kIG1hbmFnZSBXaWNrciBuZXR3b3Jrc1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS93aWNrci9sYXRlc3QvYWRtaW5ndWlkZS9zZWN1cml0eS1pYW0uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlQWRtaW5TZXNzaW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVBZG1pblNlc3Npb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYSBib3QgaW4gYSBXaWNrciBuZXR3b3JrXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3dpY2tyL2xhdGVzdC9hZG1pbmd1aWRlL3NlY3VyaXR5LWlhbS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVCb3QoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZUJvdCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhIGRhdGEgcmV0ZW50aW9uIGJvdCBpbiBhIFdpY2tyIG5ldHdvcmtcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vd2lja3IvbGF0ZXN0L2FkbWluZ3VpZGUvc2VjdXJpdHktaWFtLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZURhdGFSZXRlbnRpb25Cb3QoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZURhdGFSZXRlbnRpb25Cb3QnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYSBkYXRhIHJldGVudGlvbiBib3QgY2hhbGxlbmdlIGluIGEgV2lja3IgbmV0d29ya1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS93aWNrci9sYXRlc3QvYWRtaW5ndWlkZS9zZWN1cml0eS1pYW0uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlRGF0YVJldGVudGlvbkJvdENoYWxsZW5nZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlRGF0YVJldGVudGlvbkJvdENoYWxsZW5nZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhIG5ldyBXaWNrciBuZXR3b3JrXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NSZXF1ZXN0VGFnKClcbiAgICogLSAuaWZBd3NUYWdLZXlzKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3dpY2tyL2xhdGVzdC9hZG1pbmd1aWRlL3NlY3VyaXR5LWlhbS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVOZXR3b3JrKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVOZXR3b3JrJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY3JlYXRlIGEgc2VjdXJpdHkgZ3JvdXAgaW4gYSBXaWNrciBuZXR3b3JrXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3dpY2tyL2xhdGVzdC9hZG1pbmd1aWRlL3NlY3VyaXR5LWlhbS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVTZWN1cml0eUdyb3VwKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVTZWN1cml0eUdyb3VwJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGEgYm90IGZyb20gYSBXaWNrciBuZXR3b3JrXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3dpY2tyL2xhdGVzdC9hZG1pbmd1aWRlL3NlY3VyaXR5LWlhbS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVCb3QoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZUJvdCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlbGV0ZSBhIGRhdGEgcmV0ZW50aW9uIGJvdCBmcm9tIGEgV2lja3IgbmV0d29ya1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS93aWNrci9sYXRlc3QvYWRtaW5ndWlkZS9zZWN1cml0eS1pYW0uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlRGF0YVJldGVudGlvbkJvdCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlRGF0YVJldGVudGlvbkJvdCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlbGV0ZSBXaWNrciBuZXR3b3Jrc1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS93aWNrci9sYXRlc3QvYWRtaW5ndWlkZS9zZWN1cml0eS1pYW0uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlTmV0d29yaygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlTmV0d29yaycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlbGV0ZSBhIHNlY3VyaXR5IGdyb3VwIGZyb20gYSBXaWNrciBuZXR3b3JrXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3dpY2tyL2xhdGVzdC9hZG1pbmd1aWRlL3NlY3VyaXR5LWlhbS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVTZWN1cml0eUdyb3VwKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVTZWN1cml0eUdyb3VwJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZ2V0IGJvdCBpbmZvcm1hdGlvbiBpbiBhIFdpY2tyIG5ldHdvcmtcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS93aWNrci9sYXRlc3QvYWRtaW5ndWlkZS9zZWN1cml0eS1pYW0uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0Qm90KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRCb3QnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgYm90IGNvdW50IGZvciBhIFdpY2tyIG5ldHdvcmtcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS93aWNrci9sYXRlc3QvYWRtaW5ndWlkZS9zZWN1cml0eS1pYW0uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0Qm90c0NvdW50KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRCb3RzQ291bnQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgZGF0YSByZXRlbnRpb24gYm90IGluZm9ybWF0aW9uIGluIGEgV2lja3IgbmV0d29ya1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3dpY2tyL2xhdGVzdC9hZG1pbmd1aWRlL3NlY3VyaXR5LWlhbS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXREYXRhUmV0ZW50aW9uQm90KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXREYXRhUmV0ZW50aW9uQm90Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZ2V0IGd1ZXN0IHVzZXIgaGlzdG9yeSBjb3VudCBmb3IgYSBXaWNrciBuZXR3b3JrXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vd2lja3IvbGF0ZXN0L2FkbWluZ3VpZGUvc2VjdXJpdHktaWFtLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldEd1ZXN0VXNlckhpc3RvcnlDb3VudCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0R3Vlc3RVc2VySGlzdG9yeUNvdW50Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZ2V0IGRldGFpbHMgb2YgYSBXaWNrciBuZXR3b3JrXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vd2lja3IvbGF0ZXN0L2FkbWluZ3VpZGUvc2VjdXJpdHktaWFtLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldE5ldHdvcmsoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldE5ldHdvcmsnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgbmV0d29yayBzZXR0aW5ncyBmb3IgYSBXaWNrciBuZXR3b3JrXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vd2lja3IvbGF0ZXN0L2FkbWluZ3VpZGUvc2VjdXJpdHktaWFtLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldE5ldHdvcmtTZXR0aW5ncygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0TmV0d29ya1NldHRpbmdzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZ2V0IE9JREMgaW5mb3JtYXRpb24gZm9yIGEgV2lja3IgbmV0d29ya1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3dpY2tyL2xhdGVzdC9hZG1pbmd1aWRlL3NlY3VyaXR5LWlhbS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRPaWRjSW5mbygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0T2lkY0luZm8nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXRyaWV2ZSB0aGUgT3BlblRERiBpbnRlZ3JhdGlvbiBjb25maWd1cmF0aW9uIGZvciBhIFdpY2tyIG5ldHdvcmtcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS93aWNrci9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9HZXRPcGVudGRmQ29uZmlnLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldE9wZW50ZGZDb25maWcoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldE9wZW50ZGZDb25maWcnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgc2VjdXJpdHkgZ3JvdXAgaW5mb3JtYXRpb24gaW4gYSBXaWNrciBuZXR3b3JrXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vd2lja3IvbGF0ZXN0L2FkbWluZ3VpZGUvc2VjdXJpdHktaWFtLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldFNlY3VyaXR5R3JvdXAoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldFNlY3VyaXR5R3JvdXAnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgaW5mb3JtYXRpb24gYWJvdXQgYSB1c2VyIGluIGEgV2lja3IgbmV0d29ya1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3dpY2tyL2xhdGVzdC9hZG1pbmd1aWRlL3NlY3VyaXR5LWlhbS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRVc2VyKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRVc2VyJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZ2V0IHVzZXIgY291bnQgZm9yIGEgV2lja3IgbmV0d29ya1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3dpY2tyL2xhdGVzdC9hZG1pbmd1aWRlL3NlY3VyaXR5LWlhbS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRVc2Vyc0NvdW50KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRVc2Vyc0NvdW50Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCBibG9ja2VkIGd1ZXN0IHVzZXJzIGluIGEgV2lja3IgbmV0d29ya1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3dpY2tyL2xhdGVzdC9hZG1pbmd1aWRlL3NlY3VyaXR5LWlhbS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0QmxvY2tlZEd1ZXN0VXNlcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RCbG9ja2VkR3Vlc3RVc2VycycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgYm90cyBpbiBhIFdpY2tyIG5ldHdvcmtcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS93aWNrci9sYXRlc3QvYWRtaW5ndWlkZS9zZWN1cml0eS1pYW0uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdEJvdHMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RCb3RzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCBkZXZpY2VzIGZvciBhIHVzZXIgaW4gYSBXaWNrciBuZXR3b3JrXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vd2lja3IvbGF0ZXN0L2FkbWluZ3VpZGUvc2VjdXJpdHktaWFtLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3REZXZpY2VzRm9yVXNlcigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdERldmljZXNGb3JVc2VyJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCBndWVzdCB1c2VycyBpbiBhIFdpY2tyIG5ldHdvcmtcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS93aWNrci9sYXRlc3QvYWRtaW5ndWlkZS9zZWN1cml0eS1pYW0uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdEd1ZXN0VXNlcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RHdWVzdFVzZXJzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCBXaWNrciBuZXR3b3Jrc1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3dpY2tyL2xhdGVzdC9hZG1pbmd1aWRlL3NlY3VyaXR5LWlhbS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0TmV0d29ya3MoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3ROZXR3b3JrcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgdXNlcnMgaW4gYSBzZWN1cml0eSBncm91cCBpbiBhIFdpY2tyIG5ldHdvcmtcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS93aWNrci9sYXRlc3QvYWRtaW5ndWlkZS9zZWN1cml0eS1pYW0uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdFNlY3VyaXR5R3JvdXBVc2VycygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdFNlY3VyaXR5R3JvdXBVc2VycycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3Qgc2VjdXJpdHkgZ3JvdXBzIGluIGEgV2lja3IgbmV0d29ya1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3dpY2tyL2xhdGVzdC9hZG1pbmd1aWRlL3NlY3VyaXR5LWlhbS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0U2VjdXJpdHlHcm91cHMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RTZWN1cml0eUdyb3VwcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgdGhlIHRhZ3MgYXBwbGllZCB0byBhIFdpY2tyIHJlc291cmNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vd2lja3IvbGF0ZXN0L2FkbWluZ3VpZGUvc2VjdXJpdHktaWFtLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RUYWdzRm9yUmVzb3VyY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RUYWdzRm9yUmVzb3VyY2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0IHVzZXJzIGluIGEgV2lja3IgbmV0d29ya1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3dpY2tyL2xhdGVzdC9hZG1pbmd1aWRlL3NlY3VyaXR5LWlhbS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0VXNlcnMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RVc2VycycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJlZ2lzdGVyIE9JREMgY29uZmlndXJhdGlvbiBmb3IgYSBXaWNrciBuZXR3b3JrXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3dpY2tyL2xhdGVzdC9hZG1pbmd1aWRlL3NlY3VyaXR5LWlhbS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9SZWdpc3Rlck9pZGNDb25maWcoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1JlZ2lzdGVyT2lkY0NvbmZpZycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHRlc3QgT0lEQyBjb25maWd1cmF0aW9uIGZvciBhIFdpY2tyIG5ldHdvcmtcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vd2lja3IvbGF0ZXN0L2FkbWluZ3VpZGUvc2VjdXJpdHktaWFtLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1JlZ2lzdGVyT2lkY0NvbmZpZ1Rlc3QoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1JlZ2lzdGVyT2lkY0NvbmZpZ1Rlc3QnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZWdpc3RlciBhbmQgc2F2ZSBPcGVuVERGIGludGVncmF0aW9uIGNvbmZpZ3VyYXRpb24gZm9yIGEgV2lja3IgbmV0d29ya1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS93aWNrci9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9SZWdpc3Rlck9wZW50ZGZDb25maWcuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvUmVnaXN0ZXJPcGVudGRmQ29uZmlnKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdSZWdpc3Rlck9wZW50ZGZDb25maWcnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBhZGQgdGFncyB0byBhIHNwZWNpZmllZCBXaWNrciByZXNvdXJjZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFRhZ2dpbmdcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NUYWdLZXlzKClcbiAgICogLSAuaWZBd3NSZXF1ZXN0VGFnKClcbiAgICogLSAuaWZBd3NSZXNvdXJjZVRhZygpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS93aWNrci9sYXRlc3QvYWRtaW5ndWlkZS9zZWN1cml0eS1pYW0uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvVGFnUmVzb3VyY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1RhZ1Jlc291cmNlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gdW50YWcgdGhlIHNwZWNpZmllZCB0YWdzIGZyb20gdGhlIHNwZWNpZmllZCBXaWNrciByZXNvdXJjZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFRhZ2dpbmdcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NUYWdLZXlzKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3dpY2tyL2xhdGVzdC9hZG1pbmd1aWRlL3NlY3VyaXR5LWlhbS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9VbnRhZ1Jlc291cmNlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdVbnRhZ1Jlc291cmNlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gdXBkYXRlIGEgYm90IGluIGEgV2lja3IgbmV0d29ya1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS93aWNrci9sYXRlc3QvYWRtaW5ndWlkZS9zZWN1cml0eS1pYW0uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvVXBkYXRlQm90KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdVcGRhdGVCb3QnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byB1cGRhdGUgZGF0YSByZXRlbnRpb24gc2V0dGluZ3MgaW4gYSBXaWNrciBuZXR3b3JrXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3dpY2tyL2xhdGVzdC9hZG1pbmd1aWRlL3NlY3VyaXR5LWlhbS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9VcGRhdGVEYXRhUmV0ZW50aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdVcGRhdGVEYXRhUmV0ZW50aW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gdXBkYXRlIGd1ZXN0IHVzZXIgc3RhdHVzIGluIGEgV2lja3IgbmV0d29ya1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS93aWNrci9sYXRlc3QvYWRtaW5ndWlkZS9zZWN1cml0eS1pYW0uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvVXBkYXRlR3Vlc3RVc2VyKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdVcGRhdGVHdWVzdFVzZXInKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byB1cGRhdGUgV2lja3IgbmV0d29yayBkZXRhaWxzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3dpY2tyL2xhdGVzdC9hZG1pbmd1aWRlL3NlY3VyaXR5LWlhbS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9VcGRhdGVOZXR3b3JrRGV0YWlscygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVXBkYXRlTmV0d29ya0RldGFpbHMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byB1cGRhdGUgbmV0d29yayBzZXR0aW5ncyBmb3IgYSBXaWNrciBuZXR3b3JrXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3dpY2tyL2xhdGVzdC9hZG1pbmd1aWRlL3NlY3VyaXR5LWlhbS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9VcGRhdGVOZXR3b3JrU2V0dGluZ3MoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1VwZGF0ZU5ldHdvcmtTZXR0aW5ncycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHVwZGF0ZSBhIHNlY3VyaXR5IGdyb3VwIGluIGEgV2lja3IgbmV0d29ya1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS93aWNrci9sYXRlc3QvYWRtaW5ndWlkZS9zZWN1cml0eS1pYW0uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvVXBkYXRlU2VjdXJpdHlHcm91cCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVXBkYXRlU2VjdXJpdHlHcm91cCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHVwZGF0ZSB1c2VyIGluZm9ybWF0aW9uIGluIGEgV2lja3IgbmV0d29ya1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS93aWNrci9sYXRlc3QvYWRtaW5ndWlkZS9zZWN1cml0eS1pYW0uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvVXBkYXRlVXNlcigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVXBkYXRlVXNlcicpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFjY2Vzc0xldmVsTGlzdDogQWNjZXNzTGV2ZWxMaXN0ID0ge1xuICAgIFdyaXRlOiBbXG4gICAgICAnQmF0Y2hDcmVhdGVVc2VyJyxcbiAgICAgICdCYXRjaERlbGV0ZVVzZXInLFxuICAgICAgJ0JhdGNoUmVpbnZpdGVVc2VyJyxcbiAgICAgICdCYXRjaFJlc2V0RGV2aWNlc0ZvclVzZXInLFxuICAgICAgJ0JhdGNoVG9nZ2xlVXNlclN1c3BlbmRTdGF0dXMnLFxuICAgICAgJ0NyZWF0ZUFkbWluU2Vzc2lvbicsXG4gICAgICAnQ3JlYXRlQm90JyxcbiAgICAgICdDcmVhdGVEYXRhUmV0ZW50aW9uQm90JyxcbiAgICAgICdDcmVhdGVEYXRhUmV0ZW50aW9uQm90Q2hhbGxlbmdlJyxcbiAgICAgICdDcmVhdGVOZXR3b3JrJyxcbiAgICAgICdDcmVhdGVTZWN1cml0eUdyb3VwJyxcbiAgICAgICdEZWxldGVCb3QnLFxuICAgICAgJ0RlbGV0ZURhdGFSZXRlbnRpb25Cb3QnLFxuICAgICAgJ0RlbGV0ZU5ldHdvcmsnLFxuICAgICAgJ0RlbGV0ZVNlY3VyaXR5R3JvdXAnLFxuICAgICAgJ1JlZ2lzdGVyT2lkY0NvbmZpZycsXG4gICAgICAnUmVnaXN0ZXJPaWRjQ29uZmlnVGVzdCcsXG4gICAgICAnUmVnaXN0ZXJPcGVudGRmQ29uZmlnJyxcbiAgICAgICdVcGRhdGVCb3QnLFxuICAgICAgJ1VwZGF0ZURhdGFSZXRlbnRpb24nLFxuICAgICAgJ1VwZGF0ZUd1ZXN0VXNlcicsXG4gICAgICAnVXBkYXRlTmV0d29ya0RldGFpbHMnLFxuICAgICAgJ1VwZGF0ZU5ldHdvcmtTZXR0aW5ncycsXG4gICAgICAnVXBkYXRlU2VjdXJpdHlHcm91cCcsXG4gICAgICAnVXBkYXRlVXNlcidcbiAgICBdLFxuICAgIFJlYWQ6IFtcbiAgICAgICdCYXRjaExvb2t1cFVzZXJVbmFtZScsXG4gICAgICAnR2V0Qm90JyxcbiAgICAgICdHZXRCb3RzQ291bnQnLFxuICAgICAgJ0dldERhdGFSZXRlbnRpb25Cb3QnLFxuICAgICAgJ0dldEd1ZXN0VXNlckhpc3RvcnlDb3VudCcsXG4gICAgICAnR2V0TmV0d29yaycsXG4gICAgICAnR2V0TmV0d29ya1NldHRpbmdzJyxcbiAgICAgICdHZXRPaWRjSW5mbycsXG4gICAgICAnR2V0T3BlbnRkZkNvbmZpZycsXG4gICAgICAnR2V0U2VjdXJpdHlHcm91cCcsXG4gICAgICAnR2V0VXNlcicsXG4gICAgICAnR2V0VXNlcnNDb3VudCcsXG4gICAgICAnTGlzdEJsb2NrZWRHdWVzdFVzZXJzJyxcbiAgICAgICdMaXN0Qm90cycsXG4gICAgICAnTGlzdERldmljZXNGb3JVc2VyJyxcbiAgICAgICdMaXN0R3Vlc3RVc2VycycsXG4gICAgICAnTGlzdE5ldHdvcmtzJyxcbiAgICAgICdMaXN0U2VjdXJpdHlHcm91cFVzZXJzJyxcbiAgICAgICdMaXN0U2VjdXJpdHlHcm91cHMnLFxuICAgICAgJ0xpc3RUYWdzRm9yUmVzb3VyY2UnLFxuICAgICAgJ0xpc3RVc2VycydcbiAgICBdLFxuICAgIFRhZ2dpbmc6IFtcbiAgICAgICdUYWdSZXNvdXJjZScsXG4gICAgICAnVW50YWdSZXNvdXJjZSdcbiAgICBdXG4gIH07XG5cbiAgLyoqXG4gICAqIEFkZHMgYSByZXNvdXJjZSBvZiB0eXBlIG5ldHdvcmsgdG8gdGhlIHN0YXRlbWVudFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vd2lja3IvbGF0ZXN0L2FkbWluZ3VpZGUvXG4gICAqXG4gICAqIEBwYXJhbSBuZXR3b3JrSWQgLSBJZGVudGlmaWVyIGZvciB0aGUgbmV0d29ya0lkLlxuICAgKiBAcGFyYW0gYWNjb3VudCAtIEFjY291bnQgb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIGFjY291bnQuXG4gICAqIEBwYXJhbSByZWdpb24gLSBSZWdpb24gb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHJlZ2lvbi5cbiAgICogQHBhcmFtIHBhcnRpdGlvbiAtIFBhcnRpdGlvbiBvZiB0aGUgQVdTIGFjY291bnQgW2F3cywgYXdzLWNuLCBhd3MtdXMtZ292XTsgZGVmYXVsdHMgdG8gYGF3c2AsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHBhcnRpdGlvbi5cbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NSZXNvdXJjZVRhZygpXG4gICAqL1xuICBwdWJsaWMgb25OZXR3b3JrKG5ldHdvcmtJZDogc3RyaW5nLCBhY2NvdW50Pzogc3RyaW5nLCByZWdpb24/OiBzdHJpbmcsIHBhcnRpdGlvbj86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLm9uKGBhcm46JHsgcGFydGl0aW9uID8/IHRoaXMuZGVmYXVsdFBhcnRpdGlvbiB9OndpY2tyOiR7IHJlZ2lvbiA/PyB0aGlzLmRlZmF1bHRSZWdpb24gfTokeyBhY2NvdW50ID8/IHRoaXMuZGVmYXVsdEFjY291bnQgfTpuZXR3b3JrLyR7IG5ldHdvcmtJZCB9YCk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgYSB0YWcncyBrZXkgYW5kIHZhbHVlIGluIGEgcmVxdWVzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2NvbmRpdGlvbi1rZXlzLmh0bWwjY29uZGl0aW9uLWtleXMtcmVxdWVzdHRhZ1xuICAgKlxuICAgKiBBcHBsaWVzIHRvIGFjdGlvbnM6XG4gICAqIC0gLnRvQ3JlYXRlTmV0d29yaygpXG4gICAqIC0gLnRvVGFnUmVzb3VyY2UoKVxuICAgKlxuICAgKiBAcGFyYW0gdGFnS2V5IFRoZSB0YWcga2V5IHRvIGNoZWNrXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW3N0cmluZyBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2