cdk-iam-floyd
Version:
AWS IAM policy statement generator with fluent interface for AWS CDK
354 lines • 41.7 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.Signin = void 0;
const shared_1 = require("../../shared");
/**
* Statement provider for service [signin](https://docs.aws.amazon.com/service-authorization/latest/reference/list_signin.html).
*
* @param sid [SID](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_sid.html) of the statement
*/
class Signin extends shared_1.PolicyStatement {
/**
* Grants permission to authenticate to the AWS Management Console
*
* Access Level: Read
*
* https://docs.aws.amazon.com/signin/latest/APIReference/API_Authenticate.html
*/
toAuthenticate() {
return this.to('Authenticate');
}
/**
* Grants permission to authenticate through a browser and obtain an OAuth 2.0 authorization code for credential exchange
*
* Access Level: Read
*
* https://docs.aws.amazon.com/signin/latest/APIReference/API_AuthorizeOAuth2Access.html
*/
toAuthorizeOAuth2Access() {
return this.to('AuthorizeOAuth2Access');
}
/**
* Grants permission to dynamically register an OAuth 2.0 public client for use with AWS Sign-In
*
* Access Level: Write
*
* https://docs.aws.amazon.com/signin/latest/APIReference/API_CreateOAuth2PublicClient.html
*/
toCreateOAuth2PublicClient() {
return this.to('CreateOAuth2PublicClient');
}
/**
* Grants permission to exchange an authorization code for OAuth 2.0 access token and refresh token that can be used to access AWS services from developer tools and applications
*
* Access Level: Read
*
* https://docs.aws.amazon.com/signin/latest/APIReference/API_CreateOAuth2Token.html
*/
toCreateOAuth2Token() {
return this.to('CreateOAuth2Token');
}
/**
* Grants permission to create an Identity Center application that represents the AWS Management Console on an Identity Center organization instance
*
* Access Level: Write
*
* https://docs.aws.amazon.com/signin/latest/APIReference/API_CreateTrustedIdentityPropagationApplicationForConsole.html
*/
toCreateTrustedIdentityPropagationApplicationForConsole() {
return this.to('CreateTrustedIdentityPropagationApplicationForConsole');
}
/**
* Grants permission to disable console authorization configuration for an AWS account or organization
*
* Access Level: Write
*
* https://docs.aws.amazon.com/signin/latest/APIReference/API_DeleteConsoleAuthorizationConfiguration.html
*/
toDeleteConsoleAuthorizationConfiguration() {
return this.to('DeleteConsoleAuthorizationConfiguration');
}
/**
* Grants permission to remove a permission statement from the account's SignIn Resource Based Policy
*
* Access Level: Write
*
* https://docs.aws.amazon.com/signin/latest/APIReference/API_DeleteResourcePermissionStatement.html
*/
toDeleteResourcePermissionStatement() {
return this.to('DeleteResourcePermissionStatement');
}
/**
* Grants permission to retrieve console authorization configuration for an AWS account or organization
*
* Access Level: Read
*
* https://docs.aws.amazon.com/signin/latest/APIReference/API_GetConsoleAuthorizationConfiguration.html
*/
toGetConsoleAuthorizationConfiguration() {
return this.to('GetConsoleAuthorizationConfiguration');
}
/**
* Grants permission to retrieve SignIn Resource Based Policy document that is attached with your account
*
* Access Level: Read
*
* https://docs.aws.amazon.com/signin/latest/APIReference/API_GetResourcePolicy.html
*/
toGetResourcePolicy() {
return this.to('GetResourcePolicy');
}
/**
* Grants permission to inspect the metadata and active state of an OAuth 2.0 access token or refresh token
*
* Access Level: Read
*
* https://docs.aws.amazon.com/signin/latest/APIReference/API_IntrospectOAuth2Token.html
*/
toIntrospectOAuth2Token() {
return this.to('IntrospectOAuth2Token');
}
/**
* Grants permission to list the SignIn Resource Based Policy statements in your account
*
* Access Level: List
*
* https://docs.aws.amazon.com/signin/latest/APIReference/API_ListResourcePermissionStatements.html
*/
toListResourcePermissionStatements() {
return this.to('ListResourcePermissionStatements');
}
/**
* Grants permission to list all Identity Center applications that represent the AWS Management Console
*
* Access Level: List
*
* https://docs.aws.amazon.com/signin/latest/APIReference/API_ListTrustedIdentityPropagationApplicationsForConsole.html
*/
toListTrustedIdentityPropagationApplicationsForConsole() {
return this.to('ListTrustedIdentityPropagationApplicationsForConsole');
}
/**
* Grants permission to enable console authorization configuration for an AWS account or organization
*
* Access Level: Write
*
* https://docs.aws.amazon.com/signin/latest/APIReference/API_PutConsoleAuthorizationConfiguration.html
*/
toPutConsoleAuthorizationConfiguration() {
return this.to('PutConsoleAuthorizationConfiguration');
}
/**
* Grants permission to create a permission statement in the account's SignIn resource-based policy
*
* Access Level: Write
*
* https://docs.aws.amazon.com/signin/latest/APIReference/API_PutResourcePermissionStatement.html
*/
toPutResourcePermissionStatement() {
return this.to('PutResourcePermissionStatement');
}
/**
* Grants permission to revoke an OAuth 2.0 refresh token and its associated refresh tokens
*
* Access Level: Write
*
* https://docs.aws.amazon.com/signin/latest/APIReference/API_RevokeOAuth2Token.html
*/
toRevokeOAuth2Token() {
return this.to('RevokeOAuth2Token');
}
/**
* Grants permission to create an AWS account through the AWS Management Console sign-up flow
*
* Access Level: Write
*
* https://docs.aws.amazon.com/awsconsolehelpdocs/latest/gsg/console-private-access.html
*/
toCreateAccount() {
return this.to('CreateAccount');
}
/**
* Adds a resource of type console to the statement
*
* https://docs.aws.amazon.com/signin/latest/APIReference
*
* @param consoleName - Identifier for the consoleName.
* @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.
*/
onConsole(consoleName, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:signin:::console/${consoleName}`);
}
/**
* Adds a resource of type oauth2-public-client-localhost to the statement
*
* https://docs.aws.amazon.com/signin/latest/APIReference
*
* @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.
*/
onOauth2PublicClientLocalhost(account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:signin:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:oauth2/public-client/localhost`);
}
/**
* Adds a resource of type oauth2-public-client-registration to the statement
*
* https://docs.aws.amazon.com/signin/latest/APIReference
*
* @param resourceName - Identifier for the resourceName.
* @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.
*/
onOauth2PublicClientRegistration(resourceName, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:signin:${region ?? this.defaultRegion}::external-client/dcr/${resourceName}`);
}
/**
* Adds a resource of type oauth2-public-client-remote to the statement
*
* https://docs.aws.amazon.com/signin/latest/APIReference
*
* @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.
*/
onOauth2PublicClientRemote(account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:signin:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:oauth2/public-client/remote`);
}
/**
* Adds a resource of type oauth2-resource-service-principal to the statement
*
* https://docs.aws.amazon.com/signin/latest/APIReference
*
* @param servicePrincipalName - Identifier for the servicePrincipalName.
* @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.
*/
onOauth2ResourceServicePrincipal(servicePrincipalName, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:signin:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:service-principal/${servicePrincipalName}`);
}
/**
* Filters access by the client authentication method used in the OAuth token request
*
* https://docs.aws.amazon.com/signin/latest/userguide/reference-signin-condition-keys.html
*
* Applies to actions:
* - .toCreateOAuth2Token()
*
* @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`
*/
ifOAuthClientAuthentication(value, operator) {
return this.if(`OAuthClientAuthentication`, value, operator ?? 'StringLike');
}
/**
* Filters access by the OAuth client ID used in the authorization or token request
*
* https://docs.aws.amazon.com/signin/latest/userguide/reference-signin-condition-keys.html
*
* Applies to actions:
* - .toAuthorizeOAuth2Access()
* - .toCreateOAuth2Token()
* - .toIntrospectOAuth2Token()
*
* @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`
*/
ifOAuthClientId(value, operator) {
return this.if(`OAuthClientId`, value, operator ?? 'StringLike');
}
/**
* Filters access by the OAuth grant type used in the token request
*
* https://docs.aws.amazon.com/signin/latest/userguide/reference-signin-condition-keys.html
*
* Applies to actions:
* - .toCreateOAuth2Token()
*
* @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`
*/
ifOAuthGrantType(value, operator) {
return this.if(`OAuthGrantType`, value, operator ?? 'StringLike');
}
/**
* Filters access by the redirect URI specified in the OAuth authorization request
*
* https://docs.aws.amazon.com/signin/latest/userguide/reference-signin-condition-keys.html
*
* Applies to actions:
* - .toAuthorizeOAuth2Access()
* - .toCreateOAuth2PublicClient()
* - .toCreateOAuth2Token()
*
* @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`
*/
ifOAuthRedirectUri(value, operator) {
return this.if(`OAuthRedirectUri`, value, operator ?? 'StringLike');
}
/**
* Filters access by the type of OAuth token being operated on
*
* https://docs.aws.amazon.com/signin/latest/userguide/reference-signin-condition-keys.html
*
* Applies to actions:
* - .toIntrospectOAuth2Token()
* - .toRevokeOAuth2Token()
*
* @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`
*/
ifOAuthTokenType(value, operator) {
return this.if(`OAuthTokenType`, value, operator ?? 'StringLike');
}
/**
* Filters access by the principal ARN during pre-authentication console sign-in
*
* https://docs.aws.amazon.com/signin/latest/userguide/reference-signin-condition-keys.html
*
* Applies to actions:
* - .toAuthenticate()
*
* @param value The value(s) to check
* @param operator Works with [arn operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_ARN). **Default:** `ArnLike`
*/
ifPrincipalArn(value, operator) {
return this.if(`PrincipalArn`, value, operator ?? 'ArnLike');
}
/**
* Statement provider for service [signin](https://docs.aws.amazon.com/service-authorization/latest/reference/list_signin.html).
*
*/
constructor(props) {
super(props);
this.servicePrefix = 'signin';
this.accessLevelList = {
Read: [
'Authenticate',
'AuthorizeOAuth2Access',
'CreateOAuth2Token',
'GetConsoleAuthorizationConfiguration',
'GetResourcePolicy',
'IntrospectOAuth2Token'
],
Write: [
'CreateOAuth2PublicClient',
'CreateTrustedIdentityPropagationApplicationForConsole',
'DeleteConsoleAuthorizationConfiguration',
'DeleteResourcePermissionStatement',
'PutConsoleAuthorizationConfiguration',
'PutResourcePermissionStatement',
'RevokeOAuth2Token',
'CreateAccount'
],
List: [
'ListResourcePermissionStatements',
'ListTrustedIdentityPropagationApplicationsForConsole'
]
};
}
}
exports.Signin = Signin;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbmluLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic2lnbmluLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLHlDQUF5RDtBQUd6RDs7OztHQUlHO0FBQ0gsTUFBYSxNQUFPLFNBQVEsd0JBQWU7SUFHekM7Ozs7OztPQU1HO0lBQ0ksY0FBYztRQUNuQixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLHVCQUF1QjtRQUM1QixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsdUJBQXVCLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksMEJBQTBCO1FBQy9CLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxtQkFBbUI7UUFDeEIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLHVEQUF1RDtRQUM1RCxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsdURBQXVELENBQUMsQ0FBQztJQUMxRSxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0kseUNBQXlDO1FBQzlDLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxtQ0FBbUM7UUFDeEMsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLG1DQUFtQyxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLHNDQUFzQztRQUMzQyxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsc0NBQXNDLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksbUJBQW1CO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxtQkFBbUIs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QkFBMEI7Z0JBQzFCLHVEQUF1RDtnQkFDdkQseUNBQXlDO2dCQUN6QyxtQ0FBbUM7Z0JBQ25DLHNDQUFzQztnQkFDdEMsZ0NBQWdDO2dCQUNoQyxtQkFBbUI7Z0JBQ25CLGVBQWU7YUFDaEI7WUFDRCxJQUFJLEVBQUU7Z0JBQ0osa0NBQWtDO2dCQUNsQyxzREFBc0Q7YUFDdkQ7U0FDRixDQUFDO0lBd0tGLENBQUM7Q0FDRjtBQW5YRCx3QkFtWEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBY2Nlc3NMZXZlbExpc3QgfSBmcm9tICcuLi8uLi9zaGFyZWQvYWNjZXNzLWxldmVsJztcbmltcG9ydCB7IFBvbGljeVN0YXRlbWVudCwgT3BlcmF0b3IgfSBmcm9tICcuLi8uLi9zaGFyZWQnO1xuaW1wb3J0IHsgYXdzX2lhbSBhcyBpYW0gfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcblxuLyoqXG4gKiBTdGF0ZW1lbnQgcHJvdmlkZXIgZm9yIHNlcnZpY2UgW3NpZ25pbl0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3NlcnZpY2UtYXV0aG9yaXphdGlvbi9sYXRlc3QvcmVmZXJlbmNlL2xpc3Rfc2lnbmluLmh0bWwpLlxuICpcbiAqIEBwYXJhbSBzaWQgW1NJRF0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19zaWQuaHRtbCkgb2YgdGhlIHN0YXRlbWVudFxuICovXG5leHBvcnQgY2xhc3MgU2lnbmluIGV4dGVuZHMgUG9saWN5U3RhdGVtZW50IHtcbiAgcHVibGljIHNlcnZpY2VQcmVmaXggPSAnc2lnbmluJztcblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gYXV0aGVudGljYXRlIHRvIHRoZSBBV1MgTWFuYWdlbWVudCBDb25zb2xlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc2lnbmluL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0F1dGhlbnRpY2F0ZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9BdXRoZW50aWNhdGUoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0F1dGhlbnRpY2F0ZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGF1dGhlbnRpY2F0ZSB0aHJvdWdoIGEgYnJvd3NlciBhbmQgb2J0YWluIGFuIE9BdXRoIDIuMCBhdXRob3JpemF0aW9uIGNvZGUgZm9yIGNyZWRlbnRpYWwgZXhjaGFuZ2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zaWduaW4vbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQXV0aG9yaXplT0F1dGgyQWNjZXNzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0F1dGhvcml6ZU9BdXRoMkFjY2VzcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQXV0aG9yaXplT0F1dGgyQWNjZXNzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZHluYW1pY2FsbHkgcmVnaXN0ZXIgYW4gT0F1dGggMi4wIHB1YmxpYyBjbGllbnQgZm9yIHVzZSB3aXRoIEFXUyBTaWduLUluXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3NpZ25pbi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9DcmVhdGVPQXV0aDJQdWJsaWNDbGllbnQuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlT0F1dGgyUHVibGljQ2xpZW50KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVPQXV0aDJQdWJsaWNDbGllbnQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBleGNoYW5nZSBhbiBhdXRob3JpemF0aW9uIGNvZGUgZm9yIE9BdXRoIDIuMCBhY2Nlc3MgdG9rZW4gYW5kIHJlZnJlc2ggdG9rZW4gdGhhdCBjYW4gYmUgdXNlZCB0byBhY2Nlc3MgQVdTIHNlcnZpY2VzIGZyb20gZGV2ZWxvcGVyIHRvb2xzIGFuZCBhcHBsaWNhdGlvbnNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zaWduaW4vbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQ3JlYXRlT0F1dGgyVG9rZW4uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlT0F1dGgyVG9rZW4oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZU9BdXRoMlRva2VuJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY3JlYXRlIGFuIElkZW50aXR5IENlbnRlciBhcHBsaWNhdGlvbiB0aGF0IHJlcHJlc2VudHMgdGhlIEFXUyBNYW5hZ2VtZW50IENvbnNvbGUgb24gYW4gSWRlbnRpdHkgQ2VudGVyIG9yZ2FuaXphdGlvbiBpbnN0YW5jZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zaWduaW4vbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQ3JlYXRlVHJ1c3RlZElkZW50aXR5UHJvcGFnYXRpb25BcHBsaWNhdGlvbkZvckNvbnNvbGUuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlVHJ1c3RlZElkZW50aXR5UHJvcGFnYXRpb25BcHBsaWNhdGlvbkZvckNvbnNvbGUoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZVRydXN0ZWRJZGVudGl0eVByb3BhZ2F0aW9uQXBwbGljYXRpb25Gb3JDb25zb2xlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGlzYWJsZSBjb25zb2xlIGF1dGhvcml6YXRpb24gY29uZmlndXJhdGlvbiBmb3IgYW4gQVdTIGFjY291bnQgb3Igb3JnYW5pemF0aW9uXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3NpZ25pbi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EZWxldGVDb25zb2xlQXV0aG9yaXphdGlvbkNvbmZpZ3VyYXRpb24uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlQ29uc29sZUF1dGhvcml6YXRpb25Db25maWd1cmF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVDb25zb2xlQXV0aG9yaXphdGlvbkNvbmZpZ3VyYXRpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZW1vdmUgYSBwZXJtaXNzaW9uIHN0YXRlbWVudCBmcm9tIHRoZSBhY2NvdW50J3MgU2lnbkluIFJlc291cmNlIEJhc2VkIFBvbGljeVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zaWduaW4vbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVsZXRlUmVzb3VyY2VQZXJtaXNzaW9uU3RhdGVtZW50Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZVJlc291cmNlUGVybWlzc2lvblN0YXRlbWVudCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlUmVzb3VyY2VQZXJtaXNzaW9uU3RhdGVtZW50Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmV0cmlldmUgY29uc29sZSBhdXRob3JpemF0aW9uIGNvbmZpZ3VyYXRpb24gZm9yIGFuIEFXUyBhY2NvdW50IG9yIG9yZ2FuaXphdGlvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3NpZ25pbi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9HZXRDb25zb2xlQXV0aG9yaXphdGlvbkNvbmZpZ3VyYXRpb24uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0Q29uc29sZUF1dGhvcml6YXRpb25Db25maWd1cmF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRDb25zb2xlQXV0aG9yaXphdGlvbkNvbmZpZ3VyYXRpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXRyaWV2ZSBTaWduSW4gUmVzb3VyY2UgQmFzZWQgUG9saWN5IGRvY3VtZW50IHRoYXQgaXMgYXR0YWNoZWQgd2l0aCB5b3VyIGFjY291bnRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zaWduaW4vbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfR2V0UmVzb3VyY2VQb2xpY3kuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0UmVzb3VyY2VQb2xpY3koKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldFJlc291cmNlUG9saWN5Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gaW5zcGVjdCB0aGUgbWV0YWRhdGEgYW5kIGFjdGl2ZSBzdGF0ZSBvZiBhbiBPQXV0aCAyLjAgYWNjZXNzIHRva2VuIG9yIHJlZnJlc2ggdG9rZW5cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zaWduaW4vbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfSW50cm9zcGVjdE9BdXRoMlRva2VuLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0ludHJvc3BlY3RPQXV0aDJUb2tlbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnSW50cm9zcGVjdE9BdXRoMlRva2VuJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCB0aGUgU2lnbkluIFJlc291cmNlIEJhc2VkIFBvbGljeSBzdGF0ZW1lbnRzIGluIHlvdXIgYWNjb3VudFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3NpZ25pbi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9MaXN0UmVzb3VyY2VQZXJtaXNzaW9uU3RhdGVtZW50cy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0UmVzb3VyY2VQZXJtaXNzaW9uU3RhdGVtZW50cygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdFJlc291cmNlUGVybWlzc2lvblN0YXRlbWVudHMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0IGFsbCBJZGVudGl0eSBDZW50ZXIgYXBwbGljYXRpb25zIHRoYXQgcmVwcmVzZW50IHRoZSBBV1MgTWFuYWdlbWVudCBDb25zb2xlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc2lnbmluL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0xpc3RUcnVzdGVkSWRlbnRpdHlQcm9wYWdhdGlvbkFwcGxpY2F0aW9uc0ZvckNvbnNvbGUuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdFRydXN0ZWRJZGVudGl0eVByb3BhZ2F0aW9uQXBwbGljYXRpb25zRm9yQ29uc29sZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdFRydXN0ZWRJZGVudGl0eVByb3BhZ2F0aW9uQXBwbGljYXRpb25zRm9yQ29uc29sZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGVuYWJsZSBjb25zb2xlIGF1dGhvcml6YXRpb24gY29uZmlndXJhdGlvbiBmb3IgYW4gQVdTIGFjY291bnQgb3Igb3JnYW5pemF0aW9uXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3NpZ25pbi9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9QdXRDb25zb2xlQXV0aG9yaXphdGlvbkNvbmZpZ3VyYXRpb24uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvUHV0Q29uc29sZUF1dGhvcml6YXRpb25Db25maWd1cmF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdQdXRDb25zb2xlQXV0aG9yaXphdGlvbkNvbmZpZ3VyYXRpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYSBwZXJtaXNzaW9uIHN0YXRlbWVudCBpbiB0aGUgYWNjb3VudCdzIFNpZ25JbiByZXNvdXJjZS1iYXNlZCBwb2xpY3lcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc2lnbmluL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX1B1dFJlc291cmNlUGVybWlzc2lvblN0YXRlbWVudC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9QdXRSZXNvdXJjZVBlcm1pc3Npb25TdGF0ZW1lbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1B1dFJlc291cmNlUGVybWlzc2lvblN0YXRlbWVudCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJldm9rZSBhbiBPQXV0aCAyLjAgcmVmcmVzaCB0b2tlbiBhbmQgaXRzIGFzc29jaWF0ZWQgcmVmcmVzaCB0b2tlbnNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc2lnbmluL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX1Jldm9rZU9BdXRoMlRva2VuLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1Jldm9rZU9BdXRoMlRva2VuKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdSZXZva2VPQXV0aDJUb2tlbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhbiBBV1MgYWNjb3VudCB0aHJvdWdoIHRoZSBBV1MgTWFuYWdlbWVudCBDb25zb2xlIHNpZ24tdXAgZmxvd1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hd3Njb25zb2xlaGVscGRvY3MvbGF0ZXN0L2dzZy9jb25zb2xlLXByaXZhdGUtYWNjZXNzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZUFjY291bnQoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZUFjY291bnQnKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhY2Nlc3NMZXZlbExpc3Q6IEFjY2Vzc0xldmVsTGlzdCA9IHtcbiAgICBSZWFkOiBbXG4gICAgICAnQXV0aGVudGljYXRlJyxcbiAgICAgICdBdXRob3JpemVPQXV0aDJBY2Nlc3MnLFxuICAgICAgJ0NyZWF0ZU9BdXRoMlRva2VuJyxcbiAgICAgICdHZXRDb25zb2xlQXV0aG9yaXphdGlvbkNvbmZpZ3VyYXRpb24nLFxuICAgICAgJ0dldFJlc291cmNlUG9saWN5JyxcbiAgICAgICdJbnRyb3NwZWN0T0F1dGgyVG9rZW4nXG4gICAgXSxcbiAgICBXcml0ZTogW1xuICAgICAgJ0NyZWF0ZU9BdXRoMlB1YmxpY0NsaWVudCcsXG4gICAgICAnQ3JlYXRlVHJ1c3RlZElkZW50aXR5UHJvcGFnYXRpb25BcHBsaWNhdGlvbkZvckNvbnNvbGUnLFxuICAgICAgJ0RlbGV0ZUNvbnNvbGVBdXRob3JpemF0aW9uQ29uZmlndXJhdGlvbicsXG4gICAgICAnRGVsZXRlUmVzb3VyY2VQZXJtaXNzaW9uU3RhdGVtZW50JyxcbiAgICAgICdQdXRDb25zb2xlQXV0aG9yaXphdGlvbkNvbmZpZ3VyYXRpb24nLFxuICAgICAgJ1B1dFJlc291cmNlUGVybWlzc2lvblN0YXRlbWVudCcsXG4gICAgICAnUmV2b2tlT0F1dGgyVG9rZW4nLFxuICAgICAgJ0NyZWF0ZUFjY291bnQnXG4gICAgXSxcbiAgICBMaXN0OiBbXG4gICAgICAnTGlzdFJlc291cmNlUGVybWlzc2lvblN0YXRlbWVudHMnLFxuICAgICAgJ0xpc3RUcnVzdGVkSWRlbnRpdHlQcm9wYWdhdGlvbkFwcGxpY2F0aW9uc0ZvckNvbnNvbGUnXG4gICAgXVxuICB9O1xuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVzb3VyY2Ugb2YgdHlwZSBjb25zb2xlIHRvIHRoZSBzdGF0ZW1lbnRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3NpZ25pbi9sYXRlc3QvQVBJUmVmZXJlbmNlXG4gICAqXG4gICAqIEBwYXJhbSBjb25zb2xlTmFtZSAtIElkZW50aWZpZXIgZm9yIHRoZSBjb25zb2xlTmFtZS5cbiAgICogQHBhcmFtIHBhcnRpdGlvbiAtIFBhcnRpdGlvbiBvZiB0aGUgQVdTIGFjY291bnQgW2F3cywgYXdzLWNuLCBhd3MtdXMtZ292XTsgZGVmYXVsdHMgdG8gYGF3c2AsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHBhcnRpdGlvbi5cbiAgICovXG4gIHB1YmxpYyBvbkNvbnNvbGUoY29uc29sZU5hbWU6IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06c2lnbmluOjo6Y29uc29sZS8keyBjb25zb2xlTmFtZSB9YCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHJlc291cmNlIG9mIHR5cGUgb2F1dGgyLXB1YmxpYy1jbGllbnQtbG9jYWxob3N0IHRvIHRoZSBzdGF0ZW1lbnRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3NpZ25pbi9sYXRlc3QvQVBJUmVmZXJlbmNlXG4gICAqXG4gICAqIEBwYXJhbSBhY2NvdW50IC0gQWNjb3VudCBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgYWNjb3VudC5cbiAgICogQHBhcmFtIHJlZ2lvbiAtIFJlZ2lvbiBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcmVnaW9uLlxuICAgKiBAcGFyYW0gcGFydGl0aW9uIC0gUGFydGl0aW9uIG9mIHRoZSBBV1MgYWNjb3VudCBbYXdzLCBhd3MtY24sIGF3cy11cy1nb3ZdOyBkZWZhdWx0cyB0byBgYXdzYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcGFydGl0aW9uLlxuICAgKi9cbiAgcHVibGljIG9uT2F1dGgyUHVibGljQ2xpZW50TG9jYWxob3N0KGFjY291bnQ/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06c2lnbmluOiR7IHJlZ2lvbiA/PyB0aGlzLmRlZmF1bHRSZWdpb24gfTokeyBhY2NvdW50ID8/IHRoaXMuZGVmYXVsdEFjY291bnQgfTpvYXV0aDIvcHVibGljLWNsaWVudC9sb2NhbGhvc3RgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVzb3VyY2Ugb2YgdHlwZSBvYXV0aDItcHVibGljLWNsaWVudC1yZWdpc3RyYXRpb24gdG8gdGhlIHN0YXRlbWVudFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc2lnbmluL2xhdGVzdC9BUElSZWZlcmVuY2VcbiAgICpcbiAgICogQHBhcmFtIHJlc291cmNlTmFtZSAtIElkZW50aWZpZXIgZm9yIHRoZSByZXNvdXJjZU5hbWUuXG4gICAqIEBwYXJhbSByZWdpb24gLSBSZWdpb24gb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHJlZ2lvbi5cbiAgICogQHBhcmFtIHBhcnRpdGlvbiAtIFBhcnRpdGlvbiBvZiB0aGUgQVdTIGFjY291bnQgW2F3cywgYXdzLWNuLCBhd3MtdXMtZ292XTsgZGVmYXVsdHMgdG8gYGF3c2AsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHBhcnRpdGlvbi5cbiAgICovXG4gIHB1YmxpYyBvbk9hdXRoMlB1YmxpY0NsaWVudFJlZ2lzdHJhdGlvbihyZXNvdXJjZU5hbWU6IHN0cmluZywgcmVnaW9uPzogc3RyaW5nLCBwYXJ0aXRpb24/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5vbihgYXJuOiR7IHBhcnRpdGlvbiA/PyB0aGlzLmRlZmF1bHRQYXJ0aXRpb24gfTpzaWduaW46JHsgcmVnaW9uID8/IHRoaXMuZGVmYXVsdFJlZ2lvbiB9OjpleHRlcm5hbC1jbGllbnQvZGNyLyR7IHJlc291cmNlTmFtZSB9YCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHJlc291cmNlIG9mIHR5cGUgb2F1dGgyLXB1YmxpYy1jbGllbnQtcmVtb3RlIHRvIHRoZSBzdGF0ZW1lbnRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3NpZ25pbi9sYXRlc3QvQVBJUmVmZXJlbmNlXG4gICAqXG4gICAqIEBwYXJhbSBhY2NvdW50IC0gQWNjb3VudCBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgYWNjb3VudC5cbiAgICogQHBhcmFtIHJlZ2lvbiAtIFJlZ2lvbiBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcmVnaW9uLlxuICAgKiBAcGFyYW0gcGFydGl0aW9uIC0gUGFydGl0aW9uIG9mIHRoZSBBV1MgYWNjb3VudCBbYXdzLCBhd3MtY24sIGF3cy11cy1nb3ZdOyBkZWZhdWx0cyB0byBgYXdzYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcGFydGl0aW9uLlxuICAgKi9cbiAgcHVibGljIG9uT2F1dGgyUHVibGljQ2xpZW50UmVtb3RlKGFjY291bnQ/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06c2lnbmluOiR7IHJlZ2lvbiA/PyB0aGlzLmRlZmF1bHRSZWdpb24gfTokeyBhY2NvdW50ID8/IHRoaXMuZGVmYXVsdEFjY291bnQgfTpvYXV0aDIvcHVibGljLWNsaWVudC9yZW1vdGVgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVzb3VyY2Ugb2YgdHlwZSBvYXV0aDItcmVzb3VyY2Utc2VydmljZS1wcmluY2lwYWwgdG8gdGhlIHN0YXRlbWVudFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc2lnbmluL2xhdGVzdC9BUElSZWZlcmVuY2VcbiAgICpcbiAgICogQHBhcmFtIHNlcnZpY2VQcmluY2lwYWxOYW1lIC0gSWRlbnRpZmllciBmb3IgdGhlIHNlcnZpY2VQcmluY2lwYWxOYW1lLlxuICAgKiBAcGFyYW0gYWNjb3VudCAtIEFjY291bnQgb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIGFjY291bnQuXG4gICAqIEBwYXJhbSByZWdpb24gLSBSZWdpb24gb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHJlZ2lvbi5cbiAgICogQHBhcmFtIHBhcnRpdGlvbiAtIFBhcnRpdGlvbiBvZiB0aGUgQVdTIGFjY291bnQgW2F3cywgYXdzLWNuLCBhd3MtdXMtZ292XTsgZGVmYXVsdHMgdG8gYGF3c2AsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHBhcnRpdGlvbi5cbiAgICovXG4gIHB1YmxpYyBvbk9hdXRoMlJlc291cmNlU2VydmljZVByaW5jaXBhbChzZXJ2aWNlUHJpbmNpcGFsTmFtZTogc3RyaW5nLCBhY2NvdW50Pzogc3RyaW5nLCByZWdpb24/OiBzdHJpbmcsIHBhcnRpdGlvbj86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLm9uKGBhcm46JHsgcGFydGl0aW9uID8/IHRoaXMuZGVmYXVsdFBhcnRpdGlvbiB9OnNpZ25pbjokeyByZWdpb24gPz8gdGhpcy5kZWZhdWx0UmVnaW9uIH06JHsgYWNjb3VudCA/PyB0aGlzLmRlZmF1bHRBY2NvdW50IH06c2VydmljZS1wcmluY2lwYWwvJHsgc2VydmljZVByaW5jaXBhbE5hbWUgfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYWNjZXNzIGJ5IHRoZSBjbGllbnQgYXV0aGVudGljYXRpb24gbWV0aG9kIHVzZWQgaW4gdGhlIE9BdXRoIHRva2VuIHJlcXVlc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3NpZ25pbi9sYXRlc3QvdXNlcmd1aWRlL3JlZmVyZW5jZS1zaWduaW4tY29uZGl0aW9uLWtleXMuaHRtbFxuICAgKlxuICAgKiBBcHBsaWVzIHRvIGFjdGlvbnM6XG4gICAqIC0gLnRvQ3JlYXRlT0F1dGgyVG9rZW4oKVxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlKHMpIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBvcGVyYXRvciBXb3JrcyB3aXRoIFtzdHJpbmcgb3BlcmF0b3JzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbl9vcGVyYXRvcnMuaHRtbCNDb25kaXRpb25zX1N0cmluZykuICoqRGVmYXVsdDoqKiBgU3RyaW5nTGlrZWBcbiAgICovXG4gIHB1YmxpYyBpZk9BdXRoQ2xpZW50QXV0aGVudGljYXRpb24odmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdLCBvcGVyYXRvcj86IE9wZXJhdG9yIHwgc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaWYoYE9BdXRoQ2xpZW50QXV0aGVudGljYXRpb25gLCB2YWx1ZSwgb3BlcmF0b3IgPz8gJ1N0cmluZ0xpa2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIGFjY2VzcyBieSB0aGUgT0F1dGggY2xpZW50IElEIHVzZWQgaW4gdGhlIGF1dGhvcml6YXRpb24gb3IgdG9rZW4gcmVxdWVzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc2lnbmluL2xhdGVzdC91c2VyZ3VpZGUvcmVmZXJlbmNlLXNpZ25pbi1jb25kaXRpb24ta2V5cy5odG1sXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9BdXRob3JpemVPQXV0aDJBY2Nlc3MoKVxuICAgKiAtIC50b0NyZWF0ZU9BdXRoMlRva2VuKClcbiAgICogLSAudG9JbnRyb3NwZWN0T0F1dGgyVG9rZW4oKVxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlKHMpIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBvcGVyYXRvciBXb3JrcyB3aXRoIFtzdHJpbmcgb3BlcmF0b3JzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbl9vcGVyYXRvcnMuaHRtbCNDb25kaXRpb25zX1N0cmluZykuICoqRGVmYXVsdDoqKiBgU3RyaW5nTGlrZWBcbiAgICovXG4gIHB1YmxpYyBpZk9BdXRoQ2xpZW50SWQodmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdLCBvcGVyYXRvcj86IE9wZXJhdG9yIHwgc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaWYoYE9BdXRoQ2xpZW50SWRgLCB2YWx1ZSwgb3BlcmF0b3IgPz8gJ1N0cmluZ0xpa2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIGFjY2VzcyBieSB0aGUgT0F1dGggZ3JhbnQgdHlwZSB1c2VkIGluIHRoZSB0b2tlbiByZXF1ZXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zaWduaW4vbGF0ZXN0L3VzZXJndWlkZS9yZWZlcmVuY2Utc2lnbmluLWNvbmRpdGlvbi1rZXlzLmh0bWxcbiAgICpcbiAgICogQXBwbGllcyB0byBhY3Rpb25zOlxuICAgKiAtIC50b0NyZWF0ZU9BdXRoMlRva2VuKClcbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZShzKSB0byBjaGVja1xuICAgKiBAcGFyYW0gb3BlcmF0b3IgV29ya3Mgd2l0aCBbc3RyaW5nIG9wZXJhdG9yc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19jb25kaXRpb25fb3BlcmF0b3JzLmh0bWwjQ29uZGl0aW9uc19TdHJpbmcpLiAqKkRlZmF1bHQ6KiogYFN0cmluZ0xpa2VgXG4gICAqL1xuICBwdWJsaWMgaWZPQXV0aEdyYW50VHlwZSh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pZihgT0F1dGhHcmFudFR5cGVgLCB2YWx1ZSwgb3BlcmF0b3IgPz8gJ1N0cmluZ0xpa2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIGFjY2VzcyBieSB0aGUgcmVkaXJlY3QgVVJJIHNwZWNpZmllZCBpbiB0aGUgT0F1dGggYXV0aG9yaXphdGlvbiByZXF1ZXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zaWduaW4vbGF0ZXN0L3VzZXJndWlkZS9yZWZlcmVuY2Utc2lnbmluLWNvbmRpdGlvbi1rZXlzLmh0bWxcbiAgICpcbiAgICogQXBwbGllcyB0byBhY3Rpb25zOlxuICAgKiAtIC50b0F1dGhvcml6ZU9BdXRoMkFjY2VzcygpXG4gICAqIC0gLnRvQ3JlYXRlT0F1dGgyUHVibGljQ2xpZW50KClcbiAgICogLSAudG9DcmVhdGVPQXV0aDJUb2tlbigpXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW3N0cmluZyBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfU3RyaW5nKS4gKipEZWZhdWx0OioqIGBTdHJpbmdMaWtlYFxuICAgKi9cbiAgcHVibGljIGlmT0F1dGhSZWRpcmVjdFVyaSh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pZihgT0F1dGhSZWRpcmVjdFVyaWAsIHZhbHVlLCBvcGVyYXRvciA/PyAnU3RyaW5nTGlrZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYWNjZXNzIGJ5IHRoZSB0eXBlIG9mIE9BdXRoIHRva2VuIGJlaW5nIG9wZXJhdGVkIG9uXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zaWduaW4vbGF0ZXN0L3VzZXJndWlkZS9yZWZlcmVuY2Utc2lnbmluLWNvbmRpdGlvbi1rZXlzLmh0bWxcbiAgICpcbiAgICogQXBwbGllcyB0byBhY3Rpb25zOlxuICAgKiAtIC50b0ludHJvc3BlY3RPQXV0aDJUb2tlbigpXG4gICAqIC0gLnRvUmV2b2tlT0F1dGgyVG9rZW4oKVxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlKHMpIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBvcGVyYXRvciBXb3JrcyB3aXRoIFtzdHJpbmcgb3BlcmF0b3JzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbl9vcGVyYXRvcnMuaHRtbCNDb25kaXRpb25zX1N0cmluZykuICoqRGVmYXVsdDoqKiBgU3RyaW5nTGlrZWBcbiAgICovXG4gIHB1YmxpYyBpZk9BdXRoVG9rZW5UeXBlKHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSwgb3BlcmF0b3I/OiBPcGVyYXRvciB8IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmlmKGBPQXV0aFRva2VuVHlwZWAsIHZhbHVlLCBvcGVyYXRvciA/PyAnU3RyaW5nTGlrZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYWNjZXNzIGJ5IHRoZSBwcmluY2lwYWwgQVJOIGR1cmluZyBwcmUtYXV0aGVudGljYXRpb24gY29uc29sZSBzaWduLWluXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zaWduaW4vbGF0ZXN0L3VzZXJndWlkZS9yZWZlcmVuY2Utc2lnbmluLWNvbmRpdGlvbi1rZXlzLmh0bWxcbiAgICpcbiAgICogQXBwbGllcyB0byBhY3Rpb25zOlxuICAgKiAtIC50b0F1dGhlbnRpY2F0ZSgpXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW2FybiBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfQVJOKS4gKipEZWZhdWx0OioqIGBBcm5MaWtlYFxuICAgKi9cbiAgcHVibGljIGlmUHJpbmNpcGFsQXJuKHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSwgb3BlcmF0b3I/OiBPcGVyYXRvciB8IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmlmKGBQcmluY2lwYWxBcm5gLCB2YWx1ZSwgb3BlcmF0b3IgPz8gJ0Fybkxpa2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGF0ZW1lbnQgcHJvdmlkZXIgZm9yIHNlcnZpY2UgW3NpZ25pbl0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3NlcnZpY2UtYXV0aG9yaXphdGlvbi9sYXRlc3QvcmVmZXJlbmNlL2xpc3Rfc2lnbmluLmh0bWwpLlxuICAgKlxuICAgKi9cbiAgY29uc3RydWN0b3IocHJvcHM/OiBpYW0uUG9saWN5U3RhdGVtZW50UHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG4gIH1cbn1cbiJdfQ==