cdk-iam-floyd
Version:
AWS IAM policy statement generator with fluent interface for AWS CDK
691 lines • 67.1 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.Qapps = void 0;
const shared_1 = require("../../shared");
/**
* Statement provider for service [qapps](https://docs.aws.amazon.com/service-authorization/latest/reference/list_qapps.html).
*
* @param sid [SID](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_sid.html) of the statement
*/
class Qapps extends shared_1.PolicyStatement {
/**
* Grants permission to associate a library item review in the Q Business application environment
*
* Access Level: Write
*
* https://docs.aws.amazon.com/amazonq/latest/api-reference/API_qapps_AssociateLibraryItemReview.html
*/
toAssociateLibraryItemReview() {
return this.to('AssociateLibraryItemReview');
}
/**
* Grants permission to associate Q App with a user in the Q Business application environment
*
* Access Level: Write
*
* https://docs.aws.amazon.com/amazonq/latest/api-reference/API_qapps_AssociateQAppWithUser.html
*/
toAssociateQAppWithUser() {
return this.to('AssociateQAppWithUser');
}
/**
* Grants permission to create the categories of a library in the Q Business application environment
*
* Access Level: Write
*
* https://docs.aws.amazon.com/amazonq/latest/api-reference/API_qapps_BatchCreateCategory.html
*/
toBatchCreateCategory() {
return this.to('BatchCreateCategory');
}
/**
* Grants permission to delete the categories of a library in the Q Business application environment
*
* Access Level: Write
*
* https://docs.aws.amazon.com/amazonq/latest/api-reference/API_qapps_BatchDeleteCategory.html
*/
toBatchDeleteCategory() {
return this.to('BatchDeleteCategory');
}
/**
* Grants permission to update the categories of a library in the Q Business application environment
*
* Access Level: Write
*
* https://docs.aws.amazon.com/amazonq/latest/api-reference/API_qapps_BatchUpdateCategory.html
*/
toBatchUpdateCategory() {
return this.to('BatchUpdateCategory');
}
/**
* Grants permission to create a library item in the Q Business application environment
*
* Access Level: Write
*
* https://docs.aws.amazon.com/amazonq/latest/api-reference/API_qapps_CreateLibraryItem.html
*/
toCreateLibraryItem() {
return this.to('CreateLibraryItem');
}
/**
* Grants permission to create Q App in the Q Business application environment
*
* Access Level: Write
*
* https://docs.aws.amazon.com/amazonq/latest/api-reference/API_qapps_CreateQApp.html
*/
toCreateQApp() {
return this.to('CreateQApp');
}
/**
* Grants permission to delete a library item in the Q Business application environment
*
* Access Level: Write
*
* https://docs.aws.amazon.com/amazonq/latest/api-reference/API_qapps_DeleteLibraryItem.html
*/
toDeleteLibraryItem() {
return this.to('DeleteLibraryItem');
}
/**
* Grants permission to delete Q App in the Q Business application environment
*
* Access Level: Write
*
* https://docs.aws.amazon.com/amazonq/latest/api-reference/API_qapps_DeleteQApp.html
*/
toDeleteQApp() {
return this.to('DeleteQApp');
}
/**
* Grants permission to get Q App sharing permissions in the Q Business application environment
*
* Access Level: Read
*
* https://docs.aws.amazon.com/amazonq/latest/api-reference/API_qapps_DescribeQAppPermissions.html
*/
toDescribeQAppPermissions() {
return this.to('DescribeQAppPermissions');
}
/**
* Grants permission to disassociate a library item review in the Q Business application environment
*
* Access Level: Write
*
* https://docs.aws.amazon.com/amazonq/latest/api-reference/API_qapps_DisassociateLibraryItemReview.html
*/
toDisassociateLibraryItemReview() {
return this.to('DisassociateLibraryItemReview');
}
/**
* Grants permission to disassociate Q App with a user in the Q Business application environment
*
* Access Level: Write
*
* https://docs.aws.amazon.com/amazonq/latest/api-reference/API_qapps_DisassociateQAppFromUser.html
*/
toDisassociateQAppFromUser() {
return this.to('DisassociateQAppFromUser');
}
/**
* Grants permission to export Q App session data in the Q Business application environment
*
* Access Level: Write
*
* https://docs.aws.amazon.com/amazonq/latest/qbusiness-ug/purpose-built-qapps.html
*/
toExportQAppSessionData() {
return this.to('ExportQAppSessionData');
}
/**
* Grants permission to get a library item in the Q Business application environment
*
* Access Level: Read
*
* https://docs.aws.amazon.com/amazonq/latest/api-reference/API_qapps_GetLibraryItem.html
*/
toGetLibraryItem() {
return this.to('GetLibraryItem');
}
/**
* Grants permission to get Q App in the Q Business application environment
*
* Access Level: Read
*
* https://docs.aws.amazon.com/amazonq/latest/api-reference/API_qapps_GetQApp.html
*/
toGetQApp() {
return this.to('GetQApp');
}
/**
* Grants permission to get Q App session in the Q Business application environment
*
* Access Level: Read
*
* https://docs.aws.amazon.com/amazonq/latest/api-reference/API_qapps_GetQAppSession.html
*/
toGetQAppSession() {
return this.to('GetQAppSession');
}
/**
* Grants permission to get Q App session metadata in the Q Business application environment
*
* Access Level: Read
*
* https://docs.aws.amazon.com/amazonq/latest/qbusiness-ug/purpose-built-qapps.html
*/
toGetQAppSessionMetadata() {
return this.to('GetQAppSessionMetadata');
}
/**
* Grants permission to import a document to Q App or Q App Session in the Q Business application environment
*
* Access Level: Write
*
* https://docs.aws.amazon.com/amazonq/latest/api-reference/API_qapps_ImportDocument.html
*/
toImportDocument() {
return this.to('ImportDocument');
}
/**
* Grants permission to list categories in the Q Business application environment
*
* Access Level: List
*
* https://docs.aws.amazon.com/amazonq/latest/api-reference/API_qapps_ListCategories.html
*/
toListCategories() {
return this.to('ListCategories');
}
/**
* Grants permission to list library items in the Q Business application environment
*
* Access Level: List
*
* https://docs.aws.amazon.com/amazonq/latest/api-reference/API_qapps_ListLibraryItems.html
*/
toListLibraryItems() {
return this.to('ListLibraryItems');
}
/**
* Grants permission to get Q App session data in the Q Business application environment
*
* Access Level: Read
*
* https://docs.aws.amazon.com/amazonq/latest/qbusiness-ug/purpose-built-qapps.html
*/
toListQAppSessionData() {
return this.to('ListQAppSessionData');
}
/**
* Grants permission to list Q Apps in the Q Business application environment
*
* Access Level: List
*
* https://docs.aws.amazon.com/amazonq/latest/api-reference/API_qapps_ListQApps.html
*/
toListQApps() {
return this.to('ListQApps');
}
/**
* Grants permission to list tags for a resource
*
* Access Level: Read
*
* https://docs.aws.amazon.com/amazonq/latest/api-reference/API_ListTagsForResource.html
*/
toListTagsForResource() {
return this.to('ListTagsForResource');
}
/**
* Grants permission to predict Q App from conversation log or problem statement in the Q Business application environment
*
* Access Level: Write
*
* https://docs.aws.amazon.com/amazonq/latest/api-reference/API_qapps_PredictQApp.html
*/
toPredictQApp() {
return this.to('PredictQApp');
}
/**
* Grants permission to start Q App session in the Q Business application environment
*
* Access Level: Write
*
* https://docs.aws.amazon.com/amazonq/latest/api-reference/API_qapps_StartQAppSession.html
*/
toStartQAppSession() {
return this.to('StartQAppSession');
}
/**
* Grants permission to stop Q App session in the Q Business application environment
*
* Access Level: Write
*
* https://docs.aws.amazon.com/amazonq/latest/api-reference/API_qapps_StopQAppSession.html
*/
toStopQAppSession() {
return this.to('StopQAppSession');
}
/**
* Grants permission to tag a resource with given key value pairs
*
* Access Level: Tagging, Write
*
* https://docs.aws.amazon.com/amazonq/latest/api-reference/API_TagResource.html
*/
toTagResource() {
return this.to('TagResource');
}
/**
* Grants permission to remove the tag with the given key from a resource
*
* Access Level: Tagging, Write
*
* https://docs.aws.amazon.com/amazonq/latest/api-reference/API_UntagResource.html
*/
toUntagResource() {
return this.to('UntagResource');
}
/**
* Grants permission to update a library item in the Q Business application environment
*
* Access Level: Write
*
* https://docs.aws.amazon.com/amazonq/latest/api-reference/API_qapps_UpdateLibraryItem.html
*/
toUpdateLibraryItem() {
return this.to('UpdateLibraryItem');
}
/**
* Grants permission to update the metadata of a library item in the Q Business application environment
*
* Access Level: Write
*
* https://docs.aws.amazon.com/amazonq/latest/api-reference/API_qapps_UpdateLibraryItemMetadata.html
*/
toUpdateLibraryItemMetadata() {
return this.to('UpdateLibraryItemMetadata');
}
/**
* Grants permission to update Q App in the Q Business application environment
*
* Access Level: Write
*
* https://docs.aws.amazon.com/amazonq/latest/api-reference/API_qapps_UpdateQApp.html
*/
toUpdateQApp() {
return this.to('UpdateQApp');
}
/**
* Grants permission to update Q App sharing permissions in the Q Business application environment
*
* Access Level: Write
*
* https://docs.aws.amazon.com/amazonq/latest/api-reference/API_qapps_UpdateQAppPermissions.html
*/
toUpdateQAppPermissions() {
return this.to('UpdateQAppPermissions');
}
/**
* Grants permission to update Q App session in the Q Business application environment
*
* Access Level: Write
*
* https://docs.aws.amazon.com/amazonq/latest/api-reference/API_qapps_UpdateQAppSession.html
*/
toUpdateQAppSession() {
return this.to('UpdateQAppSession');
}
/**
* Grants permission to update Q App session metadata in the Q Business application environment
*
* Access Level: Write
*
* https://docs.aws.amazon.com/amazonq/latest/qbusiness-ug/purpose-built-qapps.html
*/
toUpdateQAppSessionMetadata() {
return this.to('UpdateQAppSessionMetadata');
}
/**
* Grants permission to copy Q App in the Q Business application environment
*
* Access Level: Write
*
* https://docs.aws.amazon.com/amazonq/latest/qbusiness-ug/purpose-built-qapps.html
*/
toCopyQApp() {
return this.to('CopyQApp');
}
/**
* Grants permission to create a library item review in the Q Business application environment
*
* Access Level: Write
*
* https://docs.aws.amazon.com/amazonq/latest/qbusiness-ug/purpose-built-qapps.html
*/
toCreateLibraryItemReview() {
return this.to('CreateLibraryItemReview');
}
/**
* Grants permission to subscribe to a Q App event bus topic in the Q Business application environment
*
* Access Level: Write
*
* https://docs.aws.amazon.com/amazonq/latest/qbusiness-ug/purpose-built-qapps.html
*/
toCreateSubscriptionToken() {
return this.to('CreateSubscriptionToken');
}
/**
* Grants permission to predict problem statement from conversation log in the Q Business application environment
*
* Access Level: Write
*
* https://docs.aws.amazon.com/amazonq/latest/qbusiness-ug/purpose-built-qapps.html
*/
toPredictProblemStatementFromConversation() {
return this.to('PredictProblemStatementFromConversation');
}
/**
* Grants permission to predict Q App metadata from problem statement in the Q Business application environment
*
* Access Level: Write
*
* https://docs.aws.amazon.com/amazonq/latest/qbusiness-ug/purpose-built-qapps.html
*/
toPredictQAppFromProblemStatement() {
return this.to('PredictQAppFromProblemStatement');
}
/**
* Adds a resource of type application to the statement
*
* https://docs.aws.amazon.com/amazonq/latest/qbusiness-ug/create-app.html
*
* @param applicationId - Identifier for the applicationId.
* @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.
*/
onApplication(applicationId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:qbusiness:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:application/${applicationId}`);
}
/**
* Adds a resource of type qapp to the statement
*
* https://docs.aws.amazon.com/amazonq/latest/qbusiness-ug/purpose-built-qapps.html
*
* @param applicationId - Identifier for the applicationId.
* @param appId - Identifier for the appId.
* @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()
*/
onQapp(applicationId, appId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:qapps:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:application/${applicationId}/qapp/${appId}`);
}
/**
* Adds a resource of type qapp-session to the statement
*
* https://docs.aws.amazon.com/amazonq/latest/qbusiness-ug/purpose-built-qapps.html
*
* @param applicationId - Identifier for the applicationId.
* @param appId - Identifier for the appId.
* @param sessionId - Identifier for the sessionId.
* @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()
*/
onQappSession(applicationId, appId, sessionId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:qapps:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:application/${applicationId}/qapp/${appId}/session/${sessionId}`);
}
/**
* Filters access by the tags that are passed in the request
*
* https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-requesttag
*
* Applies to actions:
* - .toCreateQApp()
* - .toStartQAppSession()
* - .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 tags associated with the resource
*
* https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-resourcetag
*
* Applies to actions:
* - .toAssociateLibraryItemReview()
* - .toAssociateQAppWithUser()
* - .toCreateLibraryItem()
* - .toDeleteLibraryItem()
* - .toDeleteQApp()
* - .toDescribeQAppPermissions()
* - .toDisassociateLibraryItemReview()
* - .toDisassociateQAppFromUser()
* - .toExportQAppSessionData()
* - .toGetLibraryItem()
* - .toGetQApp()
* - .toGetQAppSession()
* - .toGetQAppSessionMetadata()
* - .toImportDocument()
* - .toListQAppSessionData()
* - .toListTagsForResource()
* - .toStartQAppSession()
* - .toStopQAppSession()
* - .toTagResource()
* - .toUntagResource()
* - .toUpdateLibraryItem()
* - .toUpdateLibraryItemMetadata()
* - .toUpdateQApp()
* - .toUpdateQAppPermissions()
* - .toUpdateQAppSession()
* - .toUpdateQAppSessionMetadata()
* - .toCopyQApp()
* - .toCreateLibraryItemReview()
*
* Applies to resource types:
* - qapp
* - qapp-session
*
* @param tagKey The tag key to check
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifAwsResourceTag(tagKey, value, operator) {
return this.if(`aws:ResourceTag/${tagKey}`, value, operator ?? 'StringLike');
}
/**
* Filters access by the tag keys that are passed in the request
*
* https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-tagkeys
*
* Applies to actions:
* - .toCreateQApp()
* - .toStartQAppSession()
* - .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');
}
/**
* Filters access by whether Q App is published
*
* https://docs.aws.amazon.com/amazonq/latest/qbusiness-ug/security-iam.html
*
* Applies to actions:
* - .toAssociateLibraryItemReview()
* - .toAssociateQAppWithUser()
* - .toCreateLibraryItem()
* - .toDeleteLibraryItem()
* - .toDeleteQApp()
* - .toDescribeQAppPermissions()
* - .toDisassociateLibraryItemReview()
* - .toDisassociateQAppFromUser()
* - .toGetLibraryItem()
* - .toGetQApp()
* - .toGetQAppSession()
* - .toImportDocument()
* - .toStartQAppSession()
* - .toStopQAppSession()
* - .toUpdateLibraryItem()
* - .toUpdateLibraryItemMetadata()
* - .toUpdateQApp()
* - .toUpdateQAppPermissions()
* - .toUpdateQAppSession()
* - .toCopyQApp()
* - .toCreateLibraryItemReview()
*
* @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`
*/
ifAppIsPublished(value, operator) {
return this.if(`AppIsPublished`, value, operator ?? 'StringLike');
}
/**
* Filters access by whether Q App Session is shared
*
* https://docs.aws.amazon.com/amazonq/latest/qbusiness-ug/security-iam.html
*
* Applies to actions:
* - .toGetQAppSession()
* - .toImportDocument()
* - .toStopQAppSession()
* - .toUpdateQAppSession()
*
* @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`
*/
ifSessionIsShared(value, operator) {
return this.if(`SessionIsShared`, value, operator ?? 'StringLike');
}
/**
* Filters access by whether requester is Q App owner
*
* https://docs.aws.amazon.com/amazonq/latest/qbusiness-ug/security-iam.html
*
* Applies to actions:
* - .toAssociateLibraryItemReview()
* - .toAssociateQAppWithUser()
* - .toCreateLibraryItem()
* - .toDeleteLibraryItem()
* - .toDeleteQApp()
* - .toDescribeQAppPermissions()
* - .toDisassociateLibraryItemReview()
* - .toDisassociateQAppFromUser()
* - .toGetLibraryItem()
* - .toGetQApp()
* - .toGetQAppSession()
* - .toImportDocument()
* - .toStartQAppSession()
* - .toStopQAppSession()
* - .toUpdateLibraryItem()
* - .toUpdateQApp()
* - .toUpdateQAppPermissions()
* - .toUpdateQAppSession()
* - .toCopyQApp()
* - .toCreateLibraryItemReview()
*
* @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`
*/
ifUserIsAppOwner(value, operator) {
return this.if(`UserIsAppOwner`, value, operator ?? 'StringLike');
}
/**
* Filters access by whether requester is Q App Session moderator
*
* https://docs.aws.amazon.com/amazonq/latest/qbusiness-ug/security-iam.html
*
* Applies to actions:
* - .toGetQAppSession()
* - .toImportDocument()
* - .toStopQAppSession()
* - .toUpdateQAppSession()
*
* @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`
*/
ifUserIsSessionModerator(value, operator) {
return this.if(`UserIsSessionModerator`, value, operator ?? 'StringLike');
}
/**
* Statement provider for service [qapps](https://docs.aws.amazon.com/service-authorization/latest/reference/list_qapps.html).
*
*/
constructor(props) {
super(props);
this.servicePrefix = 'qapps';
this.accessLevelList = {
Write: [
'AssociateLibraryItemReview',
'AssociateQAppWithUser',
'BatchCreateCategory',
'BatchDeleteCategory',
'BatchUpdateCategory',
'CreateLibraryItem',
'CreateQApp',
'DeleteLibraryItem',
'DeleteQApp',
'DisassociateLibraryItemReview',
'DisassociateQAppFromUser',
'ExportQAppSessionData',
'ImportDocument',
'PredictQApp',
'StartQAppSession',
'StopQAppSession',
'TagResource',
'UntagResource',
'UpdateLibraryItem',
'UpdateLibraryItemMetadata',
'UpdateQApp',
'UpdateQAppPermissions',
'UpdateQAppSession',
'UpdateQAppSessionMetadata',
'CopyQApp',
'CreateLibraryItemReview',
'CreateSubscriptionToken',
'PredictProblemStatementFromConversation',
'PredictQAppFromProblemStatement'
],
Read: [
'DescribeQAppPermissions',
'GetLibraryItem',
'GetQApp',
'GetQAppSession',
'GetQAppSessionMetadata',
'ListQAppSessionData',
'ListTagsForResource'
],
List: [
'ListCategories',
'ListLibraryItems',
'ListQApps'
],
Tagging: [
'TagResource',
'UntagResource'
]
};
}
}
exports.Qapps = Qapps;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicWFwcHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJxYXBwcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSx5Q0FBeUQ7QUFHekQ7Ozs7R0FJRztBQUNILE1BQWEsS0FBTSxTQUFRLHdCQUFlO0lBR3hDOzs7Ozs7T0FNRztJQUNJLDRCQUE0QjtRQUNqQyxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsNEJBQTRCLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksdUJBQXVCO1FBQzVCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxxQkFBcUI7UUFDMUIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLHFCQUFxQixDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLHFCQUFxQjtRQUMxQixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMscUJBQXFCLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0kscUJBQXFCO1FBQzFCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxtQkFBbUI7UUFDeEIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLFlBQVk7UUFDakIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxtQkFBbUI7UUFDeEIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLFlBQVk7UUFDakIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxD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Q0FBQztRQXZ0QlIsa0JBQWEsR0FBRyxPQUFPLENBQUM7UUErYXJCLG9CQUFlLEdBQW9CO1lBQzNDLEtBQUssRUFBRTtnQkFDTCw0QkFBNEI7Z0JBQzVCLHVCQUF1QjtnQkFDdkIscUJBQXFCO2dCQUNyQixxQkFBcUI7Z0JBQ3JCLHFCQUFxQjtnQkFDckIsbUJBQW1CO2dCQUNuQixZQUFZO2dCQUNaLG1CQUFtQjtnQkFDbkIsWUFBWTtnQkFDWiwrQkFBK0I7Z0JBQy9CLDBCQUEwQjtnQkFDMUIsdUJBQXVCO2dCQUN2QixnQkFBZ0I7Z0JBQ2hCLGFBQWE7Z0JBQ2Isa0JBQWtCO2dCQUNsQixpQkFBaUI7Z0JBQ2pCLGFBQWE7Z0JBQ2IsZUFBZTtnQkFDZixtQkFBbUI7Z0JBQ25CLDJCQUEyQjtnQkFDM0IsWUFBWTtnQkFDWix1QkFBdUI7Z0JBQ3ZCLG1CQUFtQjtnQkFDbkIsMkJBQTJCO2dCQUMzQixVQUFVO2dCQUNWLHlCQUF5QjtnQkFDekIseUJBQXlCO2dCQUN6Qix5Q0FBeUM7Z0JBQ3pDLGlDQUFpQzthQUNsQztZQUNELElBQUksRUFBRTtnQkFDSix5QkFBeUI7Z0JBQ3pCLGdCQUFnQjtnQkFDaEIsU0FBUztnQkFDVCxnQkFBZ0I7Z0JBQ2hCLHdCQUF3QjtnQkFDeEIscUJBQXFCO2dCQUNyQixxQkFBcUI7YUFDdEI7WUFDRCxJQUFJLEVBQUU7Z0JBQ0osZ0JBQWdCO2dCQUNoQixrQkFBa0I7Z0JBQ2xCLFdBQVc7YUFDWjtZQUNELE9BQU8sRUFBRTtnQkFDUCxhQUFhO2dCQUNiLGVBQWU7YUFDaEI7U0FDRixDQUFDO0lBdVBGLENBQUM7Q0FDRjtBQTF0QkQsc0JBMHRCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFjY2Vzc0xldmVsTGlzdCB9IGZyb20gJy4uLy4uL3NoYXJlZC9hY2Nlc3MtbGV2ZWwnO1xuaW1wb3J0IHsgUG9saWN5U3RhdGVtZW50LCBPcGVyYXRvciB9IGZyb20gJy4uLy4uL3NoYXJlZCc7XG5pbXBvcnQgeyBhd3NfaWFtIGFzIGlhbSB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuXG4vKipcbiAqIFN0YXRlbWVudCBwcm92aWRlciBmb3Igc2VydmljZSBbcWFwcHNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zZXJ2aWNlLWF1dGhvcml6YXRpb24vbGF0ZXN0L3JlZmVyZW5jZS9saXN0X3FhcHBzLmh0bWwpLlxuICpcbiAqIEBwYXJhbSBzaWQgW1NJRF0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19zaWQuaHRtbCkgb2YgdGhlIHN0YXRlbWVudFxuICovXG5leHBvcnQgY2xhc3MgUWFwcHMgZXh0ZW5kcyBQb2xpY3lTdGF0ZW1lbnQge1xuICBwdWJsaWMgc2VydmljZVByZWZpeCA9ICdxYXBwcyc7XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGFzc29jaWF0ZSBhIGxpYnJhcnkgaXRlbSByZXZpZXcgaW4gdGhlIFEgQnVzaW5lc3MgYXBwbGljYXRpb24gZW52aXJvbm1lbnRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYW1hem9ucS9sYXRlc3QvYXBpLXJlZmVyZW5jZS9BUElfcWFwcHNfQXNzb2NpYXRlTGlicmFyeUl0ZW1SZXZpZXcuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQXNzb2NpYXRlTGlicmFyeUl0ZW1SZXZpZXcoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Fzc29jaWF0ZUxpYnJhcnlJdGVtUmV2aWV3Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gYXNzb2NpYXRlIFEgQXBwIHdpdGggYSB1c2VyIGluIHRoZSBRIEJ1c2luZXNzIGFwcGxpY2F0aW9uIGVudmlyb25tZW50XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FtYXpvbnEvbGF0ZXN0L2FwaS1yZWZlcmVuY2UvQVBJX3FhcHBzX0Fzc29jaWF0ZVFBcHBXaXRoVXNlci5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9Bc3NvY2lhdGVRQXBwV2l0aFVzZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Fzc29jaWF0ZVFBcHBXaXRoVXNlcicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSB0aGUgY2F0ZWdvcmllcyBvZiBhIGxpYnJhcnkgaW4gdGhlIFEgQnVzaW5lc3MgYXBwbGljYXRpb24gZW52aXJvbm1lbnRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYW1hem9ucS9sYXRlc3QvYXBpLXJlZmVyZW5jZS9BUElfcWFwcHNfQmF0Y2hDcmVhdGVDYXRlZ29yeS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9CYXRjaENyZWF0ZUNhdGVnb3J5KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdCYXRjaENyZWF0ZUNhdGVnb3J5Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIHRoZSBjYXRlZ29yaWVzIG9mIGEgbGlicmFyeSBpbiB0aGUgUSBCdXNpbmVzcyBhcHBsaWNhdGlvbiBlbnZpcm9ubWVudFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hbWF6b25xL2xhdGVzdC9hcGktcmVmZXJlbmNlL0FQSV9xYXBwc19CYXRjaERlbGV0ZUNhdGVnb3J5Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0JhdGNoRGVsZXRlQ2F0ZWdvcnkoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0JhdGNoRGVsZXRlQ2F0ZWdvcnknKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byB1cGRhdGUgdGhlIGNhdGVnb3JpZXMgb2YgYSBsaWJyYXJ5IGluIHRoZSBRIEJ1c2luZXNzIGFwcGxpY2F0aW9uIGVudmlyb25tZW50XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FtYXpvbnEvbGF0ZXN0L2FwaS1yZWZlcmVuY2UvQVBJX3FhcHBzX0JhdGNoVXBkYXRlQ2F0ZWdvcnkuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQmF0Y2hVcGRhdGVDYXRlZ29yeSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQmF0Y2hVcGRhdGVDYXRlZ29yeScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhIGxpYnJhcnkgaXRlbSBpbiB0aGUgUSBCdXNpbmVzcyBhcHBsaWNhdGlvbiBlbnZpcm9ubWVudFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hbWF6b25xL2xhdGVzdC9hcGktcmVmZXJlbmNlL0FQSV9xYXBwc19DcmVhdGVMaWJyYXJ5SXRlbS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVMaWJyYXJ5SXRlbSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlTGlicmFyeUl0ZW0nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgUSBBcHAgaW4gdGhlIFEgQnVzaW5lc3MgYXBwbGljYXRpb24gZW52aXJvbm1lbnRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYW1hem9ucS9sYXRlc3QvYXBpLXJlZmVyZW5jZS9BUElfcWFwcHNfQ3JlYXRlUUFwcC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVRQXBwKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVRQXBwJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGEgbGlicmFyeSBpdGVtIGluIHRoZSBRIEJ1c2luZXNzIGFwcGxpY2F0aW9uIGVudmlyb25tZW50XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FtYXpvbnEvbGF0ZXN0L2FwaS1yZWZlcmVuY2UvQVBJX3FhcHBzX0RlbGV0ZUxpYnJhcnlJdGVtLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZUxpYnJhcnlJdGVtKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVMaWJyYXJ5SXRlbScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlbGV0ZSBRIEFwcCBpbiB0aGUgUSBCdXNpbmVzcyBhcHBsaWNhdGlvbiBlbnZpcm9ubWVudFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hbWF6b25xL2xhdGVzdC9hcGktcmVmZXJlbmNlL0FQSV9xYXBwc19EZWxldGVRQXBwLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZVFBcHAoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZVFBcHAnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgUSBBcHAgc2hhcmluZyBwZXJtaXNzaW9ucyBpbiB0aGUgUSBCdXNpbmVzcyBhcHBsaWNhdGlvbiBlbnZpcm9ubWVudFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FtYXpvbnEvbGF0ZXN0L2FwaS1yZWZlcmVuY2UvQVBJX3FhcHBzX0Rlc2NyaWJlUUFwcFBlcm1pc3Npb25zLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rlc2NyaWJlUUFwcFBlcm1pc3Npb25zKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZXNjcmliZVFBcHBQZXJtaXNzaW9ucycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRpc2Fzc29jaWF0ZSBhIGxpYnJhcnkgaXRlbSByZXZpZXcgaW4gdGhlIFEgQnVzaW5lc3MgYXBwbGljYXRpb24gZW52aXJvbm1lbnRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYW1hem9ucS9sYXRlc3QvYXBpLXJlZmVyZW5jZS9BUElfcWFwcHNfRGlzYXNzb2NpYXRlTGlicmFyeUl0ZW1SZXZpZXcuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGlzYXNzb2NpYXRlTGlicmFyeUl0ZW1SZXZpZXcoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rpc2Fzc29jaWF0ZUxpYnJhcnlJdGVtUmV2aWV3Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGlzYXNzb2NpYXRlIFEgQXBwIHdpdGggYSB1c2VyIGluIHRoZSBRIEJ1c2luZXNzIGFwcGxpY2F0aW9uIGVudmlyb25tZW50XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FtYXpvbnEvbGF0ZXN0L2FwaS1yZWZlcmVuY2UvQVBJX3FhcHBzX0Rpc2Fzc29jaWF0ZVFBcHBGcm9tVXNlci5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EaXNhc3NvY2lhdGVRQXBwRnJvbVVzZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rpc2Fzc29jaWF0ZVFBcHBGcm9tVXNlcicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGV4cG9ydCBRIEFwcCBzZXNzaW9uIGRhdGEgaW4gdGhlIFEgQnVzaW5lc3MgYXBwbGljYXRpb24gZW52aXJvbm1lbnRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYW1hem9ucS9sYXRlc3QvcWJ1c2luZXNzLXVnL3B1cnBvc2UtYnVpbHQtcWFwcHMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRXhwb3J0UUFwcFNlc3Npb25EYXRhKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdFeHBvcnRRQXBwU2Vzc2lvbkRhdGEnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgYSBsaWJyYXJ5IGl0ZW0gaW4gdGhlIFEgQnVzaW5lc3MgYXBwbGljYXRpb24gZW52aXJvbm1lbnRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hbWF6b25xL2xhdGVzdC9hcGktcmVmZXJlbmNlL0FQSV9xYXBwc19HZXRMaWJyYXJ5SXRlbS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRMaWJyYXJ5SXRlbSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0TGlicmFyeUl0ZW0nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgUSBBcHAgaW4gdGhlIFEgQnVzaW5lc3MgYXBwbGljYXRpb24gZW52aXJvbm1lbnRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hbWF6b25xL2xhdGVzdC9hcGktcmVmZXJlbmNlL0FQSV9xYXBwc19HZXRRQXBwLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldFFBcHAoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldFFBcHAnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgUSBBcHAgc2Vzc2lvbiBpbiB0aGUgUSBCdXNpbmVzcyBhcHBsaWNhdGlvbiBlbnZpcm9ubWVudFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FtYXpvbnEvbGF0ZXN0L2FwaS1yZWZlcmVuY2UvQVBJX3FhcHBzX0dldFFBcHBTZXNzaW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldFFBcHBTZXNzaW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRRQXBwU2Vzc2lvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdldCBRIEFwcCBzZXNzaW9uIG1ldGFkYXRhIGluIHRoZSBRIEJ1c2luZXNzIGFwcGxpY2F0aW9uIGVudmlyb25tZW50XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYW1hem9ucS9sYXRlc3QvcWJ1c2luZXNzLXVnL3B1cnBvc2UtYnVpbHQtcWFwcHMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0UUFwcFNlc3Npb25NZXRhZGF0YSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0UUFwcFNlc3Npb25NZXRhZGF0YScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGltcG9ydCBhIGRvY3VtZW50IHRvIFEgQXBwIG9yIFEgQXBwIFNlc3Npb24gaW4gdGhlIFEgQnVzaW5lc3MgYXBwbGljYXRpb24gZW52aXJvbm1lbnRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYW1hem9ucS9sYXRlc3QvYXBpLXJlZmVyZW5jZS9BUElfcWFwcHNfSW1wb3J0RG9jdW1lbnQuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvSW1wb3J0RG9jdW1lbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0ltcG9ydERvY3VtZW50Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCBjYXRlZ29yaWVzIGluIHRoZSBRIEJ1c2luZXNzIGFwcGxpY2F0aW9uIGVudmlyb25tZW50XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYW1hem9ucS9sYXRlc3QvYXBpLXJlZmVyZW5jZS9BUElfcWFwcHNfTGlzdENhdGVnb3JpZXMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdENhdGVnb3JpZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RDYXRlZ29yaWVzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCBsaWJyYXJ5IGl0ZW1zIGluIHRoZSBRIEJ1c2luZXNzIGFwcGxpY2F0aW9uIGVudmlyb25tZW50XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYW1hem9ucS9sYXRlc3QvYXBpLXJlZmVyZW5jZS9BUElfcWFwcHNfTGlzdExpYnJhcnlJdGVtcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0TGlicmFyeUl0ZW1zKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0TGlicmFyeUl0ZW1zJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZ2V0IFEgQXBwIHNlc3Npb24gZGF0YSBpbiB0aGUgUSBCdXNpbmVzcyBhcHBsaWNhdGlvbiBlbnZpcm9ubWVudFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FtYXpvbnEvbGF0ZXN0L3FidXNpbmVzcy11Zy9wdXJwb3NlLWJ1aWx0LXFhcHBzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RRQXBwU2Vzc2lvbkRhdGEoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RRQXBwU2Vzc2lvbkRhdGEnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0IFEgQXBwcyBpbiB0aGUgUSBCdXNpbmVzcyBhcHBsaWNhdGlvbiBlbnZpcm9ubWVudFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IExpc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FtYXpvbnEvbGF0ZXN0L2FwaS1yZWZlcmVuY2UvQVBJX3FhcHBzX0xpc3RRQXBwcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0UUFwcHMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RRQXBwcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgdGFncyBmb3IgYSByZXNvdXJjZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FtYXpvbnEvbGF0ZXN0L2FwaS1yZWZlcmVuY2UvQVBJX0xpc3RUYWdzRm9yUmVzb3VyY2UuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdFRhZ3NGb3JSZXNvdXJjZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdFRhZ3NGb3JSZXNvdXJjZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHByZWRpY3QgUSBBcHAgZnJvbSBjb252ZXJzYXRpb24gbG9nIG9yIHByb2JsZW0gc3RhdGVtZW50IGluIHRoZSBRIEJ1c2luZXNzIGFwcGxpY2F0aW9uIGVudmlyb25tZW50XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FtYXpvbnEvbGF0ZXN0L2FwaS1yZWZlcmVuY2UvQVBJX3FhcHBzX1ByZWRpY3RRQXBwLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1ByZWRpY3RRQXBwKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdQcmVkaWN0UUFwcCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHN0YXJ0IFEgQXBwIHNlc3Npb24gaW4gdGhlIFEgQnVzaW5lc3MgYXBwbGljYXRpb24gZW52aXJvbm1lbnRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYW1hem9ucS9sYXRlc3QvYXBpLXJlZmVyZW5jZS9BUElfcWFwcHNfU3RhcnRRQXBwU2Vzc2lvbi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9TdGFydFFBcHBTZXNzaW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdTdGFydFFBcHBTZXNzaW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gc3RvcCBRIEFwcCBzZXNzaW9uIGluIHRoZSBRIEJ1c2luZXNzIGFwcGxpY2F0aW9uIGVudmlyb25tZW50XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FtYXpvbnEvbGF0ZXN0L2FwaS1yZWZlcmVuY2UvQVBJX3FhcHBzX1N0b3BRQXBwU2Vzc2lvbi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9TdG9wUUFwcFNlc3Npb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1N0b3BRQXBwU2Vzc2lvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHRhZyBhIHJlc291cmNlIHdpdGggZ2l2ZW4ga2V5IHZhbHVlIHBhaXJzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogVGFnZ2luZywgV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FtYXpvbnEvbGF0ZXN0L2FwaS1yZWZlcmVuY2UvQVBJX1RhZ1Jlc291cmNlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1RhZ1Jlc291cmNlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdUYWdSZXNvdXJjZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJlbW92ZSB0aGUgdGFnIHdpdGggdGhlIGdpdmVuIGtleSBmcm9tIGEgcmVzb3VyY2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBUYWdnaW5nLCBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYW1hem9ucS9sYXRlc3QvYXBpLXJlZmVyZW5jZS9BUElfVW50YWdSZXNvdXJjZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9VbnRhZ1Jlc291cmNlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdVbnRhZ1Jlc291cmNlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gdXBkYXRlIGEgbGlicmFyeSBpdGVtIGluIHRoZSBRIEJ1c2luZXNzIGFwcGxpY2F0aW9uIGVudmlyb25tZW50XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FtYXpvbnEvbGF0ZXN0L2FwaS1yZWZlcmVuY2UvQVBJX3FhcHBzX1VwZGF0ZUxpYnJhcnlJdGVtLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1VwZGF0ZUxpYnJhcnlJdGVtKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdVcGRhdGVMaWJyYXJ5SXRlbScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHVwZGF0ZSB0aGUgbWV0YWRhdGEgb2YgYSBsaWJyYXJ5IGl0ZW0gaW4gdGhlIFEgQnVzaW5lc3MgYXBwbGljYXRpb24gZW52aXJvbm1lbnRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYW1hem9ucS9sYXRlc3QvYXBpLXJlZmVyZW5jZS9BUElfcWFwcHNfVXBkYXRlTGlicmFyeUl0ZW1NZXRhZGF0YS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9VcGRhdGVMaWJyYXJ5SXRlbU1ldGFkYXRhKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdVcGRhdGVMaWJyYXJ5SXRlbU1ldGFkYXRhJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gdXBkYXRlIFEgQXBwIGluIHRoZSBRIEJ1c2luZXNzIGFwcGxpY2F0aW9uIGVudmlyb25tZW50XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FtYXpvbnEvbGF0ZXN0L2FwaS1yZWZlcmVuY2UvQVBJX3FhcHBzX1VwZGF0ZVFBcHAuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvVXBkYXRlUUFwcCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVXBkYXRlUUFwcCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHVwZGF0ZSBRIEFwcCBzaGFyaW5nIHBlcm1pc3Npb25zIGluIHRoZSBRIEJ1c2luZXNzIGFwcGxpY2F0aW9uIGVudmlyb25tZW50XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FtYXpvbnEvbGF0ZXN0L2FwaS1yZWZlcmVuY2UvQVBJX3FhcHBzX1VwZGF0ZVFBcHBQZXJtaXNzaW9ucy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9VcGRhdGVRQXBwUGVybWlzc2lvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1VwZGF0ZVFBcHBQZXJtaXNzaW9ucycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHVwZGF0ZSBRIEFwcCBzZXNzaW9uIGluIHRoZSBRIEJ1c2luZXNzIGFwcGxpY2F0aW9uIGVudmlyb25tZW50XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FtYXpvbnEvbGF0ZXN0L2FwaS1yZWZlcmVuY2UvQVBJX3FhcHBzX1VwZGF0ZVFBcHBTZXNzaW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1VwZGF0ZVFBcHBTZXNzaW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdVcGRhdGVRQXBwU2Vzc2lvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHVwZGF0ZSBRIEFwcCBzZXNzaW9uIG1ldGFkYXRhIGluIHRoZSBRIEJ1c2luZXNzIGFwcGxpY2F0aW9uIGVudmlyb25tZW50XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FtYXpvbnEvbGF0ZXN0L3FidXNpbmVzcy11Zy9wdXJwb3NlLWJ1aWx0LXFhcHBzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1VwZGF0ZVFBcHBTZXNzaW9uTWV0YWRhdGEoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1VwZGF0ZVFBcHBTZXNzaW9uTWV0YWRhdGEnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjb3B5IFEgQXBwIGluIHRoZSBRIEJ1c2luZXNzIGFwcGxpY2F0aW9uIGVudmlyb25tZW50XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FtYXpvbnEvbGF0ZXN0L3FidXNpbmVzcy11Zy9wdXJwb3NlLWJ1aWx0LXFhcHBzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NvcHlRQXBwKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDb3B5UUFwcCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhIGxpYnJhcnkgaXRlbSByZXZpZXcgaW4gdGhlIFEgQnVzaW5lc3MgYXBwbGljYXRpb24gZW52aXJvbm1lbnRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYW1hem9ucS9sYXRlc3QvcWJ1c2luZXNzLXVnL3B1cnBvc2UtYnVpbHQtcWFwcHMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlTGlicmFyeUl0ZW1SZXZpZXcoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZUxpYnJhcnlJdGVtUmV2aWV3Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gc3Vic2NyaWJlIHRvIGEgUSBBcHAgZXZlbnQgYnVzIHRvcGljIGluIHRoZSBRIEJ1c2luZXNzIGFwcGxpY2F0aW9uIGVudmlyb25tZW50XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FtYXpvbnEvbGF0ZXN0L3FidXNpbmVzcy11Zy9wdXJwb3NlLWJ1aWx0LXFhcHBzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZVN1YnNjcmlwdGlvblRva2VuKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVTdWJzY3JpcHRpb25Ub2tlbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHByZWRpY3QgcHJvYmxlbSBzdGF0ZW1lbnQgZnJvbSBjb252ZXJzYXRpb24gbG9nIGluIHRoZSBRIEJ1c2luZXNzIGFwcGxpY2F0aW9uIGVudmlyb25tZW50XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FtYXpvbnEvbGF0ZXN0L3FidXNpbmVzcy11Zy9wdXJwb3NlLWJ1aWx0LXFhcHBzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1ByZWRpY3RQcm9ibGVtU3RhdGVtZW50RnJvbUNvbnZlcnNhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnUHJlZGljdFByb2JsZW1TdGF0ZW1lbnRGcm9tQ29udmVyc2F0aW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcHJlZGljdCBRIEFwcCBtZXRhZGF0YSBmcm9tIHByb2JsZW0gc3RhdGVtZW50IGluIHRoZSBRIEJ1c2luZXNzIGFwcGxpY2F0aW9uIGVudmlyb25tZW50XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FtYXpvbnEvbGF0ZXN0L3FidXNpbmVzcy11Zy9wdXJwb3NlLWJ1aWx0LXFhcHBzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1ByZWRpY3RRQXBwRnJvbVByb2JsZW1TdGF0ZW1lbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1ByZWRpY3RRQXBwRnJvbVByb2JsZW1TdGF0ZW1lbnQnKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhY2Nlc3NMZXZlbExpc3Q6IEFjY2Vzc0xldmVsTGlzdCA9IHtcbiAgICBXcml0ZTogW1xuICAgICAgJ0Fzc29jaWF0ZUxpYnJhcnlJdGVtUmV2aWV3JyxcbiAgICAgICdBc3NvY2lhdGVRQXBwV2l0aFVzZXInLFxuICAgICAgJ0JhdGNoQ3JlYXRlQ2F0ZWdvcnknLFxuICAgICAgJ0JhdGNoRGVsZXRlQ2F0ZWdvcnknLFxuICAgICAgJ0JhdGNoVXBkYXRlQ2F0ZWdvcnknLFxuICAgICAgJ0NyZWF0ZUxpYnJhcnlJdGVtJyxcbiAgICAgICdDcmVhdGVRQXBwJyxcbiAgICAgICdEZWxldGVMaWJyYXJ5SXRlbScsXG4gICAgICAnRGVsZXRlUUFwcCcsXG4gICAgICAnRGlzYXNzb2NpYXRlTGlicmFyeUl0ZW1SZXZpZXcnLFxuICAgICAgJ0Rpc2Fzc29jaWF0ZVFBcHBGcm9tVXNlcicsXG4gICAgICAnRXhwb3J0UUFwcFNlc3Npb25EYXRhJyxcbiAgICAgICdJbXBvcnREb2N1bWVudCcsXG4gICAgICAnUHJlZGljdFFBcHAnLFxuICAgICAgJ1N0YXJ0UUFwcFNlc3Npb24nLFxuICAgICAgJ1N0b3BRQXBwU2Vzc2lvbicsXG4gICAgICAnVGFnUmVzb3VyY2UnLFxuICAgICAgJ1VudGFnUmVzb3VyY2UnLFxuICAgICAgJ1VwZGF0ZUxpYnJhcnlJdGVtJyxcbiAgICAgICdVcGRhdGVMaWJyYXJ5SXRlbU1ldGFkYXRhJyxcbiAgICAgICdVcGRhdGVRQXBwJyxcbiAgICAgICdVcGRhdGVRQXBwUGVybWlzc2lvbnMnLFxuICAgICAgJ1VwZGF0ZVFBcHBTZXNzaW9uJyxcbiAgICAgICdVcGRhdGVRQXBwU2Vzc2lvbk1ldGFkYXRhJyxcbiAgICAgICdDb3B5UUFwcCcsXG4gICAgICAnQ3JlYXRlTGlicmFyeUl0ZW1SZXZpZXcnLFxuICAgICAgJ0NyZWF0ZVN1YnNjcmlwdGlvblRva2VuJyxcbiAgICAgICdQcmVkaWN0UHJvYmxlbVN0YXRlbWVudEZyb21Db252ZXJzYXRpb24nLFxuICAgICAgJ1ByZWRpY3RRQXBwRnJvbVByb2JsZW1TdGF0ZW1lbnQnXG4gICAgXSxcbiAgICBSZWFkOiBbXG4gICAgICAnRGVzY3JpYmVRQXBwUGVybWlzc2lvbnMnLFxuICAgICAgJ0dldExpYnJhcnlJdGVtJyxcbiAgICAgICdHZXRRQXBwJyxcbiAgICAgICdHZXRRQXBwU2Vzc2lvbicsXG4gICAgICAnR2V0UUFwcFNlc3Npb25NZXRhZGF0YScsXG4gICAgICAnTGlzdFFBcHBTZXNzaW9uRGF0YScsXG4gICAgICAnTGlzdFRhZ3NGb3JSZXNvdXJjZSdcbiAgICBdLFxuICAgIExpc3Q6IFtcbiAgICAgICdMaXN0Q2F0ZWdvcmllcycsXG4gICAgICAnTGlzdExpYnJhcnlJdGVtcycsXG4gICAgICAnTGlzdFFBcHBzJ1xuICAgIF0sXG4gICAgVGFnZ2luZzogW1xuICAgICAgJ1RhZ1Jlc291cmNlJyxcbiAgICAgICdVbnRhZ1Jlc291cmNlJ1xuICAgIF1cbiAgfTtcblxuICAvKipcbiAgICogQWRkcyBhIHJlc291cmNlIG9mIHR5cGUgYXBwbGljYXRpb24gdG8gdGhlIHN0YXRlbWVudFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYW1hem9ucS9sYXRlc3QvcWJ1c2luZXNzLXVnL2NyZWF0ZS1hcHAuaHRtbFxuICAgKlxuICAgKiBAcGFyYW0gYXBwbGljYXRpb25JZCAtIElkZW50aWZpZXIgZm9yIHRoZSBhcHBsaWNhdGlvbklkLlxuICAgKiBAcGFyYW0gYWNjb3VudCAtIEFjY291bnQgb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIGFjY291bnQuXG4gICAqIEBwYXJhbSByZWdpb24gLSBSZWdpb24gb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHJlZ2lvbi5cbiAgICogQHBhcmFtIHBhcnRpdGlvbiAtIFBhcnRpdGlvbiBvZiB0aGUgQVdTIGFjY291bnQgW2F3cywgYXdzLWNuLCBhd3MtdXMtZ292XTsgZGVmYXVsdHMgdG8gYGF3c2AsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHBhcnRpdGlvbi5cbiAgICovXG4gIHB1YmxpYyBvbkFwcGxpY2F0aW9uKGFwcGxpY2F0aW9uSWQ6IHN0cmluZywgYWNjb3VudD86IHN0cmluZywgcmVnaW9uPzogc3RyaW5nLCBwYXJ0aXRpb24/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5vbihgYXJuOiR7IHBhcnRpdGlvbiA/PyB0aGlzLmRlZmF1bHRQYXJ0aXRpb24gfTpxYnVzaW5lc3M6JHsgcmVnaW9uID8/IHRoaXMuZGVmYXVsdFJlZ2lvbiB9OiR7IGFjY291bnQgPz8gdGhpcy5kZWZhdWx0QWNjb3VudCB9OmFwcGxpY2F0aW9uLyR7IGFwcGxpY2F0aW9uSWQgfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSByZXNvdXJjZSBvZiB0eXBlIHFhcHAgdG8gdGhlIHN0YXRlbWVudFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYW1hem9ucS9sYXRlc3QvcWJ1c2luZXNzLXVnL3B1cnBvc2UtYnVpbHQtcWFwcHMuaHRtbFxuICAgKlxuICAgKiBAcGFyYW0gYXBwbGljYXRpb25JZCAtIElkZW50aWZpZXIgZm9yIHRoZSBhcHBsaWNhdGlvbklkLlxuICAgKiBAcGFyYW0gYXBwSWQgLSBJZGVudGlmaWVyIGZvciB0aGUgYXBwSWQuXG4gICAqIEBwYXJhbSBhY2NvdW50IC0gQWNjb3VudCBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgYWNjb3VudC5cbiAgICogQHBhcmFtIHJlZ2lvbiAtIFJlZ2lvbiBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcmVnaW9uLlxuICAgKiBAcGFyYW0gcGFydGl0aW9uIC0gUGFydGl0aW9uIG9mIHRoZSBBV1MgYWNjb3VudCBbYXdzLCBhd3MtY24sIGF3cy11cy1nb3ZdOyBkZWZhdWx0cyB0byBgYXdzYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcGFydGl0aW9uLlxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkF3c1Jlc291cmNlVGFnKClcbiAgICovXG4gIHB1YmxpYyBvblFhcHAoYXBwbGljYXRpb25JZDogc3RyaW5nLCBhcHBJZDogc3RyaW5nLCBhY2NvdW50Pzogc3RyaW5nLCByZWdpb24/OiBzdHJpbmcsIHBhcnRpdGlvbj86IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLm9uKGBhcm46JHsgcGFydGl0aW9uID8/IHRoaXMuZGVmYXVsdFBhcnRpdGlvbiB9OnFhcHBzOiR7IHJlZ2lvbiA/PyB0aGlzLmRlZmF1bHRSZWdpb24gfTokeyBhY2NvdW50ID8/IHRoaXMuZGVmYXVsdEFjY291bnQgfTphcHBsaWNhdGlvbi8keyBhcHBsaWNhdGlvbklkIH0vcWFwcC8keyBhcHBJZCB9YCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHJlc291cmNlIG9mIHR5cGUgcWFwcC1zZXNzaW9uIHRvIHRoZSBzdGF0ZW1lbnRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FtYXpvbnEvbGF0ZXN0L3FidXNpbmVzcy11Zy9wdXJwb3NlLWJ1aWx0LXFhcHBzLmh0bWxcbiAgICpcbiAgICogQHBhcmFtIGFwcGxpY2F0aW9uSWQgLSBJZGVudGlmaWVyIGZvciB0aGUgYXBwbGljYXRpb25JZC5cbiAgICogQHBhcmFtIGFwcElkIC0gSWRlbnRpZmllciBmb3IgdGhlIGFwcElkLlxuICAgKiBAcGFyYW0gc2Vzc2lvbklkIC0gSWRlbnRpZmllciBmb3IgdGhlIHNlc3Npb25JZC5cbiAgICogQHBhcmFtIGFjY291bnQgLSBBY2NvdW50IG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBhY2NvdW50LlxuICAgKiBAcGFyYW0gcmVnaW9uIC0gUmVnaW9uIG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyByZWdpb24uXG4gICAqIEBwYXJhbSBwYXJ0aXRpb24gLSBQYXJ0aXRpb24gb2YgdGhlIEFXUyBhY2NvdW50IFthd3MsIGF3cy1jbiwgYXdzLXVzLWdvdl07IGRlZmF1bHRzIHRvIGBhd3NgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBwYXJ0aXRpb24uXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVzb3VyY2VUYWcoKVxuICAgKi9cbiAgcHVibGljIG9uUWFwcFNlc3Npb24oYXBwbGljYXRpb25JZDogc3RyaW5nLCBhcHBJZDogc3RyaW5nLCBzZXNzaW9uSWQ6IHN0cmluZywgYWNjb3VudD86IHN0cmluZywgcmVnaW9uPzogc3RyaW5nLCBwYXJ0aXRpb24/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5vbihgYXJuOiR7IHBhcnRpdGlvbiA/PyB0aGlzLmRlZmF1bHRQYXJ0aXRpb24gfTpxYXBwczokeyByZWdpb24gPz8gdGhpcy5kZWZhdWx0UmVnaW9uIH06JHsgYWNjb3VudCA/PyB0aGlzLmRlZmF1bHRBY2NvdW50IH06YXBwbGljYXRpb24vJHsgYXBwbGljYXRpb25JZCB9L3FhcHAvJHsgYXBwSWQgfS9zZXNzaW9uLyR7IHNlc3Npb25JZCB9YCk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgdGhlIHRhZ3MgdGhhdCBhcmUgcGFzc2VkIGluIHRoZSByZXF1ZXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfY29uZGl0aW9uLWtleXMuaHRtbCNjb25kaXRpb24ta2V5cy1yZXF1ZXN0dGFnXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9DcmVhdGVRQXBwKClcbiAgICogLSAudG9TdGFydFFBcHBTZXNzaW9uKClcbiAgICogLSAudG9UYWdSZXNvdXJjZSgpXG4gICAqXG4gICAqIEBwYXJhbSB0YWdLZXkgVGhlIHRhZyBrZXkgdG8gY2hlY2tcbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZShzKSB0byBjaGVja1xuICAgKiBAcGFyYW0gb3BlcmF0b3IgV29ya3Mgd2l0aCBbc3RyaW5nIG9wZXJhdG9yc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19jb25kaXRpb25fb3BlcmF0b3JzLmh0bWwjQ29uZGl0aW9uc19TdHJpbmcpLiAqKkRlZmF1bHQ6KiogYFN0cmluZ0xpa2VgXG4gICAqL1xuICBwdWJsaWMgaWZBd3NSZXF1ZXN0VGFnKHRhZ0tleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pZihgYXdzOlJlcXVlc3RUYWcvJHsgdGFnS2V5IH1gLCB2YWx1ZSwgb3BlcmF0b3IgPz8gJ1N0cmluZ0xpa2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIGFjY2VzcyBieSB0aGUgdGFncyBhc3NvY2lhdGVkIHdpdGggdGhlIHJlc291cmNlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfY29uZGl0aW9uLWtleXMuaHRtbCNjb25kaXRpb24ta2V5cy1yZXNvdXJjZXRhZ1xuICAgKlxuICAgKiBBcHBsaWVzIHRvIGFjdGlvbnM6XG4gICAqIC0gLnRvQXNzb2NpYXRlTGlicmFyeUl0ZW1SZXZpZXcoKVxuICAgKiAtIC50b0Fzc29jaWF0ZVFBcHBXaXRoVXNlcigpXG4gICAqIC0gLnRvQ3JlYXRlTGlicmFyeUl0ZW0oKVxuICAgKiAtIC50b0RlbGV0ZUxpYnJhcnlJdGVtKClcbiAgICogLSAudG9EZWxldGVRQXBwKClcbiAgICogLSAudG9EZXNjcmliZVFBcHBQZXJtaXNzaW9ucygpXG4gICAqIC0gLnRvRGlzYXNzb2NpYXRlTGlicmFyeUl0ZW1SZXZpZXcoKVxuICAgKiAtIC50b0Rpc2Fzc29jaWF0ZVFBcHBGcm9tVXNlcigpXG4gICAqIC0gLnRvRXhwb3J0UUFwcFNlc3Npb25EYXRhKClcbiAgICogLSAudG9HZXRMaWJyYXJ5SXRlbSgpXG4gICAqIC0gLnRvR2V0UUFwcCgpXG4gICAqIC0gLnRvR2V0UUFwcFNlc3Npb24oKVxuICAgKiAtIC50b0dldFFBcHBTZXNzaW9uTWV0YWRhdGEoKVxuICAgKiAtIC50b0ltcG9ydERvY3VtZW50KClcbiAgICogLSAudG9MaXN0UUFwcFNlc3Npb25EYXRhKClcbiAgICogLSAudG9MaXN0VGFnc0ZvclJlc291cmNlKClcbiAgICogLSAudG9TdGFydFFBcHBTZXNzaW9uKClcbiAgICogLSAudG9TdG9wUUFwcFNlc3Npb24oKVxuICAgKiAtIC50b1RhZ1Jlc291cmNlKClcbiAgICogLSAudG9VbnRhZ1Jlc291cmNlKClcbiAgICogLSAudG9VcGRhdGVMaWJyYXJ5SXRlbSgpXG4gICAqIC0gLnRvVXBkYXRlTGlicmFyeUl0ZW1NZXRhZGF0YSgpXG4gICAqIC0gLnRvVXBkYXRlUUFwcCgpXG4gICAqIC0gLnRvVXBkYXRlUUFwcFBlcm1pc3Npb25zKClcbiAgICogLSAudG9VcGRhdGVRQXBwU2Vzc2lvbigpXG4gICAqIC0gLnRvVXBkYXRlUUFwcFNlc3Npb25NZXRhZGF0YSgpXG4gICAqIC0gLnRvQ29weVFBcHAoKVxuICAgKiAtIC50b0NyZWF0ZUxpYnJhcnlJdGVtUmV2aWV3KClcbiAgICpcbiAgICogQXBwbGllcyB0byByZXNvdXJjZSB0eXBlczpcbiAgICogLSBxYXBwXG4gICAqIC0gcWFwcC1zZXNzaW9uXG4gICAqXG4gICAqIEBwYXJhbSB0YWdLZXkgVGhlIHRhZyBrZXkgdG8gY2hlY2tcbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZShzKSB0byBjaGVja1xuICAgKiBAcGFyYW0gb3BlcmF0b3IgV29ya3Mgd2l0aCBbc3RyaW5nIG9wZXJhdG9yc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19jb25kaXRpb25fb3BlcmF0b3JzLmh0bWwjQ29uZGl0aW9uc19TdHJpbmcpLiAqKkRlZmF1bHQ6KiogYFN0cmluZ0xpa2VgXG4gICAqL1xuICBwdWJsaWMgaWZBd3NSZXNvdXJjZVRhZyh0YWdLZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdLCBvcGVyYXRvcj86IE9wZXJhdG9yIHwgc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaWYoYGF3czpSZXNvdXJjZVRhZy8keyB0YWdLZXkgfWAsIHZhbHVlLCBvcGVyYXRvciA/PyAnU3RyaW5nTGlrZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYWNjZXNzIGJ5IHRoZSB0YWcga2V5cyB0aGF0IGFyZSBwYXNzZWQgaW4gdGhlIHJlcXVlc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19jb25kaXRpb24ta2V5cy5odG1sI2NvbmRpdGlvbi1rZXlzLXRhZ2tleXNcbiAgICpcbiAgICogQXBwbGllcyB0byBhY3Rpb25zOlxuICAgKiAtIC50b0NyZWF0ZVFBcHAoKVxuICAgKiAtIC50b1N0YXJ0UUFwcFNlc3Npb24oKVxuICAgKiAtIC50b1RhZ1Jlc291cmNlKClcbiAgICogLSAudG9VbnRhZ1Jlc291cmNlKClcbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZShzKSB0byBjaGVja1xuICAgKiBAcGFyYW0gb3BlcmF0b3IgV29ya3Mgd2l0aCBbc3RyaW5nIG9wZXJhdG9yc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19jb25kaXRpb25fb3BlcmF0b3JzLmh0bWwjQ29uZGl0aW9uc19TdHJpbmcpLiAqKkRlZmF1bHQ6KiogYFN0cmluZ0xpa2VgXG4gICAqL1xuICBwdWJsaWMgaWZBd3NUYWdLZXlzKHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSwgb3BlcmF0b3I/OiBPcGVyYXRvciB8IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmlmKGBhd3M6VGFnS2V5c2AsIHZhbHVlLCBvcGVyYXRvciA/PyAnU3RyaW5nTGlrZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYWNjZXNzIGJ5IHdoZXRoZXIgUSBBcHAgaXMgcHVibGlzaGVkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hbWF6b25xL2xhdGVzdC9xYnVzaW5lc3MtdWcvc2VjdXJpdHktaWFtLmh0bWxcbiAgICpcbiAgICogQXBwbGllcyB0byBhY3Rpb25zOlxuICAgKiAtIC50b0Fzc29jaWF0ZUxpYnJhcnlJdGVtUmV2aWV3KClcbiAgICogLSAudG9Bc3NvY2lhdGVRQXBwV2l0aFVzZXIoKVxuICAgKiAtIC50b0NyZWF0ZUxpYnJhcnlJdGVtKClcbiAgICogLSAudG9EZWxldGVMaWJyYXJ5SXRlbSgpXG4gICAqIC0gLnRvRGVsZXRlUUFwcCgpXG4gICAqIC0gLnRvRGVzY3JpYmVRQXBwUGVybWlzc2lvbnMoKVxuICAgKiAtIC50b0Rpc2Fzc29jaWF0ZUxpYnJhcnlJdGVtUmV2aWV3KClcbiAgICogLSAudG9EaXNhc3NvY2lhdGVRQXBwRnJvbVVzZXIoKVxuICAgKiAtIC50b0dldExpYnJhcnlJdGVtKClcbiAgICogLSAudG9HZXRRQXBwKClcbiAgICogLSAudG9HZXRRQXBwU2Vzc2lvbigpXG4gICAqIC0gLnRvSW1wb3J0RG9jdW1lbnQoKVxuICAgKiAtIC50b1N0YXJ0UUFwcFNlc3Npb24oKVxuICAgKiAtIC50b1N0b3BRQXBwU2Vzc2lvbigpXG4gICAqIC0gLnRvVXBkYXRlTGlicmFyeUl0ZW0oKVxuICAgKiAtIC50b1VwZGF0ZUxpYnJhcnlJdGVtTWV0YWRhdGEoKVxuICAgKiAtIC50b1VwZGF0ZVFBcHAoKVxuICAgKiAtIC50b1VwZGF0ZVFBcHBQZXJtaXNzaW9ucygpXG4gICAqIC0gLnRvVXBkYXRlUUFwcFNlc3Npb24oKVxuICAgKiAtIC50b0NvcHlRQXBwKClcbiAgICogLSAudG9DcmVhdGVMaWJyYXJ5SXRlbVJldmlldygpXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW3N0cmluZyBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfU3RyaW5nKS4gKipEZWZhdWx0OioqIGBTdHJpbmdMaWtlYFxuICAgKi9cbiAgcHVibGljIGlmQXBwSXNQdWJsaXNoZWQodmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdLCBvcGVyYXRvcj86IE9wZXJhdG9yIHwgc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaWYoYEFwcElzUHVibGlzaGVkYCwgdmFsdWUsIG9wZXJhdG9yID8/ICdTdHJpbmdMaWtlJyk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgd2hldGhlciBRIEFwcCBTZXNzaW9uIGlzIHNoYXJlZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYW1hem9ucS9sYXRlc3QvcWJ1c2luZXNzLXVnL3NlY3VyaXR5LWlhbS5odG1sXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9HZXRRQXBwU2Vzc2lvbigpXG4gICAqIC0gLnRvSW1wb3J0RG9jdW1lbnQoKVxuICAgKiAtIC50b1N0b3BRQXBwU2Vzc2lvbigpXG4gICAqIC0gLnRvVXBkYXRlUUFwcFNlc3Npb24oKVxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlKHMpIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBvcGVyYXRvciBXb3JrcyB3aXRoIFtzdHJpbmcgb3BlcmF0b3JzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbl9vcGVyYXRvcnMuaHRtbCNDb25kaXRpb25zX1N0cmluZykuICoqRGVmYXVsdDoqKiBgU3RyaW5nTGlrZWBcbiAgICovXG4gIHB1YmxpYyBpZlNlc3Npb25Jc1NoYXJlZCh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pZihgU2Vzc2lvbklzU2hhcmVkYCwgdmFsdWUsIG9wZXJhdG9yID8/ICdTdHJpbmdMaWtlJyk7XG4gIH1cblxuICAvKipcbiAgICogRmlsdGVycyBhY2Nlc3MgYnkgd2hldGhlciByZXF1ZXN0ZXIgaXMgUSBBcHAgb3duZXJcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FtYXpvbnEvbGF0ZXN0L3FidXNpbmVzcy11Zy9zZWN1cml0eS1pYW0uaHRtbFxuICAgKlxuICAgKiBBcHBsaWVzIHRvIGFjdGlvbnM6XG4gICAqIC0gLnRvQXNzb2NpYXRlTGlicmFyeUl0ZW1SZXZpZXcoKVxuICAgKiAtIC50b0Fzc29jaWF0ZVFBcHBXaXRoVXNlcigpXG4gICAqIC0gLnRvQ3JlYXRlTGlicmFyeUl0ZW0oKVxuICAgKiAtIC50b0RlbGV0ZUxpYnJhcnlJdGVtKClcbiAgICogLSAudG9EZWxldGVRQXBwKClcbiAgICogLSAudG9EZXNjcmliZVFBcHBQZXJtaXNzaW9ucygpXG4gICAqIC0gLnRvRGlzYXNzb2NpYXRlTGlicmFyeUl0ZW1SZXZpZXcoKVxuICAgKiAtIC50b0Rpc2Fzc29jaWF0ZVFBcHBGcm9tVXNlcigpXG4gICAqIC0gLnRvR2V0TGlicmFyeUl0ZW0oKVxuICAgKiAtIC50b0dldFFBcHAoKVxuICAgKiAtIC50b0dldFFBcHBTZXNzaW9uKClcbiAgICogLSAudG9JbXBvcnREb2N1bWVudCgpXG4gICAqIC0gLnRvU3RhcnRRQXBwU2Vzc2lvbigpXG4gICAqIC0gLnRvU3RvcFFBcHBTZXNzaW9uKClcbiAgICogLSAudG9VcGRhdGVMaWJyYXJ5SXRlbSgpXG4gICAqIC0gLnRvVXBkYXRlUUFwcCgpXG4gICAqIC0gLnRvVXBkYXRlUUFwcFBlcm1pc3Npb25zKClcbiAgICogLSAudG9VcGRhdGVRQXBwU2Vzc2lvbigpXG4gICAqIC0gLnRvQ29weVFBcHAoKVxuICAgKiAtIC50b0NyZWF0ZUxpYnJhcnlJdGVtUmV2aWV3KClcbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZShzKSB0byBjaGVja1xuICAgKiBAcGFyYW0gb3BlcmF0b3IgV29ya3Mgd2l0aCBbc3RyaW5nIG9wZXJhdG9yc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19jb25kaXRpb25fb3BlcmF0b3JzLmh0bWwjQ29uZGl0aW9uc19TdHJpbmcpLiAqKkRlZmF1bHQ6KiogYFN0cmluZ0xpa2VgXG4gICAqL1xuICBwdWJsaWMgaWZVc2VySXNBcHBPd25lcih2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pZihgVXNlcklzQXBwT3duZXJgLCB2YWx1ZSwgb3BlcmF0b3IgPz8gJ1N0cmluZ0xpa2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIGFjY2VzcyBieSB3aGV0aGVyIHJlcXVlc3RlciBpcyBRIEFwcCBTZXNzaW9uIG1vZGVyYXRvclxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYW1hem9ucS9sYXRlc3QvcWJ1c2luZXNzLXVnL3NlY3VyaXR5LWlhbS5odG1sXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9HZXRRQXBwU2Vzc2lvbigpXG4gICAqIC0gLnRvSW1wb3J0RG9jdW1lbnQoKVxuICAgKiAtIC50b1N0b3BRQXBwU2Vzc2lvbigpXG4gICAqIC0gLnRvVXBkYXRlUUFwcFNlc3Npb24oKVxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlKHMpIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBvcGVyYXRvciBXb3JrcyB3aXRoIFtzdHJpbmcgb3BlcmF0b3JzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbl9vcGVyYXRvcnMuaHRtbCNDb25kaXRpb25zX1N0cmluZykuICoqRGVmYXVsdDoqKiBgU3RyaW5nTGlrZWBcbiAgICovXG4gIHB1YmxpYyBpZlVzZXJJc1Nlc3Npb25Nb2RlcmF0b3IodmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdLCBvcGVyYXRvcj86IE9wZXJhdG9yIHwgc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaWYoYFVzZXJJc1Nlc3Npb25Nb2RlcmF0b3JgLCB2YWx1ZSwgb3BlcmF0b3IgPz8gJ1N0cmluZ0xpa2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGF0ZW1lbnQgcHJvdmlkZXIgZm9yIHNlcnZpY2UgW3FhcHBzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc2VydmljZS1hdXRob3JpemF0aW9uL2xhdGVzdC9yZWZlcmVuY2UvbGlzdF9xYXBwcy5odG1sKS5cbiAgICpcbiAgICovXG4gIGNvbnN0cnVjdG9yKHByb3BzPzogaWFtLlBvbGljeVN0YXRlbWVudFByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICB9XG59XG4iXX0=