cdk-iam-floyd
Version:
AWS IAM policy statement generator with fluent interface for AWS CDK
491 lines • 48.3 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.SocialMessaging = void 0;
const shared_1 = require("../../shared");
/**
* Statement provider for service [social-messaging](https://docs.aws.amazon.com/service-authorization/latest/reference/list_socialmessaging.html).
*
* @param sid [SID](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_sid.html) of the statement
*/
class SocialMessaging extends shared_1.PolicyStatement {
/**
* Grants permission to associate a WhatsApp Business Account with your AWS account
*
* Access Level: Write
*
* Possible conditions:
* - .ifAwsRequestTag()
* - .ifAwsResourceTag()
* - .ifAwsTagKeys()
*
* https://docs.aws.amazon.com/social-messaging/latest/APIReference/API_AssociateWhatsAppBusinessAccount.html
*/
toAssociateWhatsAppBusinessAccount() {
return this.to('AssociateWhatsAppBusinessAccount');
}
/**
* Grants permission to create a new WhatsApp Flow
*
* Access Level: Write
*
* https://docs.aws.amazon.com/social-messaging/latest/APIReference/API_CreateWhatsAppFlow.html
*/
toCreateWhatsAppFlow() {
return this.to('CreateWhatsAppFlow');
}
/**
* Grants permission to create a WhatsApp message template
*
* Access Level: Write
*
* https://docs.aws.amazon.com/social-messaging/latest/APIReference/API_CreateWhatsAppMessageTemplate.html
*/
toCreateWhatsAppMessageTemplate() {
return this.to('CreateWhatsAppMessageTemplate');
}
/**
* Grants permission to create a WhatsApp message template from Meta's template library
*
* Access Level: Write
*
* https://docs.aws.amazon.com/social-messaging/latest/APIReference/API_CreateWhatsAppMessageTemplateFromLibrary.html
*/
toCreateWhatsAppMessageTemplateFromLibrary() {
return this.to('CreateWhatsAppMessageTemplateFromLibrary');
}
/**
* Grants permission to create media for WhatsApp message templates
*
* Access Level: Write
*
* https://docs.aws.amazon.com/social-messaging/latest/APIReference/API_CreateWhatsAppMessageTemplateMedia.html
*/
toCreateWhatsAppMessageTemplateMedia() {
return this.to('CreateWhatsAppMessageTemplateMedia');
}
/**
* Grants permission to delete a WhatsApp Flow
*
* Access Level: Write
*
* https://docs.aws.amazon.com/social-messaging/latest/APIReference/API_DeleteWhatsAppFlow.html
*/
toDeleteWhatsAppFlow() {
return this.to('DeleteWhatsAppFlow');
}
/**
* Grants permission to delete a media object from WhatsApp
*
* Access Level: Write
*
* https://docs.aws.amazon.com/social-messaging/latest/APIReference/API_DeleteWhatsAppMessageMedia.html
*/
toDeleteWhatsAppMessageMedia() {
return this.to('DeleteWhatsAppMessageMedia');
}
/**
* Grants permission to delete a WhatsApp message template
*
* Access Level: Write
*
* https://docs.aws.amazon.com/social-messaging/latest/APIReference/API_DeleteWhatsAppMessageTemplate.html
*/
toDeleteWhatsAppMessageTemplate() {
return this.to('DeleteWhatsAppMessageTemplate');
}
/**
* Grants permission to deprecate a published WhatsApp Flow
*
* Access Level: Write
*
* https://docs.aws.amazon.com/social-messaging/latest/APIReference/API_DeprecateWhatsAppFlow.html
*/
toDeprecateWhatsAppFlow() {
return this.to('DeprecateWhatsAppFlow');
}
/**
* Grants permission to disassociate a WhatsApp Business Account from your AWS account
*
* Access Level: Write
*
* https://docs.aws.amazon.com/social-messaging/latest/APIReference/API_DisassociateWhatsAppBusinessAccount.html
*/
toDisassociateWhatsAppBusinessAccount() {
return this.to('DisassociateWhatsAppBusinessAccount');
}
/**
* Grants permission to view the details of a WhatsApp Business Account
*
* Access Level: Read
*
* https://docs.aws.amazon.com/social-messaging/latest/APIReference/API_GetLinkedWhatsAppBusinessAccount.html
*/
toGetLinkedWhatsAppBusinessAccount() {
return this.to('GetLinkedWhatsAppBusinessAccount');
}
/**
* Grants permission to view the details of a phone number
*
* Access Level: Read
*
* https://docs.aws.amazon.com/social-messaging/latest/APIReference/API_GetLinkedWhatsAppBusinessAccountPhoneNumber.html
*/
toGetLinkedWhatsAppBusinessAccountPhoneNumber() {
return this.to('GetLinkedWhatsAppBusinessAccountPhoneNumber');
}
/**
* Grants permission to retrieve the metadata and status of a WhatsApp Flow
*
* Access Level: Read
*
* https://docs.aws.amazon.com/social-messaging/latest/APIReference/API_GetWhatsAppFlow.html
*/
toGetWhatsAppFlow() {
return this.to('GetWhatsAppFlow');
}
/**
* Grants permission to generate a web preview URL for testing a WhatsApp Flow
*
* Access Level: Read
*
* https://docs.aws.amazon.com/social-messaging/latest/APIReference/API_GetWhatsAppFlowPreview.html
*/
toGetWhatsAppFlowPreview() {
return this.to('GetWhatsAppFlowPreview');
}
/**
* Grants permission to get a media object from WhatsApp
*
* Access Level: Write
*
* https://docs.aws.amazon.com/social-messaging/latest/APIReference/API_GetWhatsAppMessageMedia.html
*/
toGetWhatsAppMessageMedia() {
return this.to('GetWhatsAppMessageMedia');
}
/**
* Grants permission to get details of a WhatsApp message template
*
* Access Level: Read
*
* https://docs.aws.amazon.com/social-messaging/latest/APIReference/API_GetWhatsAppMessageTemplate.html
*/
toGetWhatsAppMessageTemplate() {
return this.to('GetWhatsAppMessageTemplate');
}
/**
* Grants permission to view all of your WhatsApp Business Accounts
*
* Access Level: List
*
* https://docs.aws.amazon.com/social-messaging/latest/APIReference/API_ListLinkedWhatsAppBusinessAccounts.html
*/
toListLinkedWhatsAppBusinessAccounts() {
return this.to('ListLinkedWhatsAppBusinessAccounts');
}
/**
* Grants permission to list tags for a resource
*
* Access Level: Read
*
* https://docs.aws.amazon.com/social-messaging/latest/APIReference/API_ListTagsForResource.html
*/
toListTagsForResource() {
return this.to('ListTagsForResource');
}
/**
* Grants permission to list the assets of a WhatsApp Flow
*
* Access Level: List
*
* https://docs.aws.amazon.com/social-messaging/latest/APIReference/API_ListWhatsAppFlowAssets.html
*/
toListWhatsAppFlowAssets() {
return this.to('ListWhatsAppFlowAssets');
}
/**
* Grants permission to list all WhatsApp Flows for a WhatsApp Business Account
*
* Access Level: List
*
* https://docs.aws.amazon.com/social-messaging/latest/APIReference/API_ListWhatsAppFlows.html
*/
toListWhatsAppFlows() {
return this.to('ListWhatsAppFlows');
}
/**
* Grants permission to list WhatsApp message templates
*
* Access Level: List
*
* https://docs.aws.amazon.com/social-messaging/latest/APIReference/API_ListWhatsAppMessageTemplates.html
*/
toListWhatsAppMessageTemplates() {
return this.to('ListWhatsAppMessageTemplates');
}
/**
* Grants permission to list available templates from Meta's template library
*
* Access Level: List
*
* https://docs.aws.amazon.com/social-messaging/latest/APIReference/API_ListWhatsAppTemplateLibrary.html
*/
toListWhatsAppTemplateLibrary() {
return this.to('ListWhatsAppTemplateLibrary');
}
/**
* Grants permission to upload a media object to WhatsApp
*
* Access Level: Write
*
* https://docs.aws.amazon.com/social-messaging/latest/APIReference/API_PostWhatsAppMessageMedia.html
*/
toPostWhatsAppMessageMedia() {
return this.to('PostWhatsAppMessageMedia');
}
/**
* Grants permission to publish a WhatsApp Flow
*
* Access Level: Write
*
* https://docs.aws.amazon.com/social-messaging/latest/APIReference/API_PublishWhatsAppFlow.html
*/
toPublishWhatsAppFlow() {
return this.to('PublishWhatsAppFlow');
}
/**
* Grants permission to update a WhatsApp Business Accounts event destination
*
* Access Level: Write
*
* https://docs.aws.amazon.com/social-messaging/latest/APIReference/API_PutWhatsAppBusinessAccountEventDestinations.html
*/
toPutWhatsAppBusinessAccountEventDestinations() {
return this.to('PutWhatsAppBusinessAccountEventDestinations');
}
/**
* Grants permission to send a message through WhatsApp
*
* Access Level: Write
*
* https://docs.aws.amazon.com/social-messaging/latest/APIReference/API_SendWhatsAppMessage.html
*/
toSendWhatsAppMessage() {
return this.to('SendWhatsAppMessage');
}
/**
* Grants permission to add a tag to a resource
*
* Access Level: Tagging, Write
*
* https://docs.aws.amazon.com/social-messaging/latest/APIReference/API_TagResource.html
*/
toTagResource() {
return this.to('TagResource');
}
/**
* Grants permission to remove a tag from a resource
*
* Access Level: Tagging, Write
*
* https://docs.aws.amazon.com/social-messaging/latest/APIReference/API_UntagResource.html
*/
toUntagResource() {
return this.to('UntagResource');
}
/**
* Grants permission to update the metadata of a WhatsApp Flow
*
* Access Level: Write
*
* https://docs.aws.amazon.com/social-messaging/latest/APIReference/API_UpdateWhatsAppFlow.html
*/
toUpdateWhatsAppFlow() {
return this.to('UpdateWhatsAppFlow');
}
/**
* Grants permission to update the Flow JSON definition of a WhatsApp Flow
*
* Access Level: Write
*
* https://docs.aws.amazon.com/social-messaging/latest/APIReference/API_UpdateWhatsAppFlowAssets.html
*/
toUpdateWhatsAppFlowAssets() {
return this.to('UpdateWhatsAppFlowAssets');
}
/**
* Grants permission to update a WhatsApp message template
*
* Access Level: Write
*
* https://docs.aws.amazon.com/social-messaging/latest/APIReference/API_UpdateWhatsAppMessageTemplate.html
*/
toUpdateWhatsAppMessageTemplate() {
return this.to('UpdateWhatsAppMessageTemplate');
}
/**
* Adds a resource of type phone-number-id to the statement
*
* https://docs.aws.amazon.com/social-messaging/latest/APIReference/API_WhatsAppPhoneNumberDetail.html
*
* @param originationPhoneNumberId - Identifier for the originationPhoneNumberId.
* @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()
*/
onPhoneNumberId(originationPhoneNumberId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:social-messaging:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:phone-number-id/${originationPhoneNumberId}`);
}
/**
* Adds a resource of type waba to the statement
*
* https://docs.aws.amazon.com/social-messaging/latest/APIReference/API_LinkedWhatsAppBusinessAccountSummary.html
*
* @param wabaId - Identifier for the wabaId.
* @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()
*/
onWaba(wabaId, account, region, partition) {
return this.on(`arn:${partition ?? this.defaultPartition}:social-messaging:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:waba/${wabaId}`);
}
/**
* 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:
* - .toAssociateWhatsAppBusinessAccount()
* - .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:
* - .toAssociateWhatsAppBusinessAccount()
* - .toCreateWhatsAppFlow()
* - .toCreateWhatsAppMessageTemplate()
* - .toCreateWhatsAppMessageTemplateFromLibrary()
* - .toCreateWhatsAppMessageTemplateMedia()
* - .toDeleteWhatsAppFlow()
* - .toDeleteWhatsAppMessageMedia()
* - .toDeleteWhatsAppMessageTemplate()
* - .toDeprecateWhatsAppFlow()
* - .toDisassociateWhatsAppBusinessAccount()
* - .toGetLinkedWhatsAppBusinessAccount()
* - .toGetLinkedWhatsAppBusinessAccountPhoneNumber()
* - .toGetWhatsAppFlow()
* - .toGetWhatsAppFlowPreview()
* - .toGetWhatsAppMessageMedia()
* - .toGetWhatsAppMessageTemplate()
* - .toListTagsForResource()
* - .toListWhatsAppFlowAssets()
* - .toListWhatsAppFlows()
* - .toListWhatsAppMessageTemplates()
* - .toListWhatsAppTemplateLibrary()
* - .toPostWhatsAppMessageMedia()
* - .toPublishWhatsAppFlow()
* - .toPutWhatsAppBusinessAccountEventDestinations()
* - .toSendWhatsAppMessage()
* - .toTagResource()
* - .toUntagResource()
* - .toUpdateWhatsAppFlow()
* - .toUpdateWhatsAppFlowAssets()
* - .toUpdateWhatsAppMessageTemplate()
*
* Applies to resource types:
* - phone-number-id
* - waba
*
* @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:
* - .toAssociateWhatsAppBusinessAccount()
* - .toTagResource()
* - .toUntagResource()
*
* @param value The value(s) to check
* @param operator Works with [string operators](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html#Conditions_String). **Default:** `StringLike`
*/
ifAwsTagKeys(value, operator) {
return this.if(`aws:TagKeys`, value, operator ?? 'StringLike');
}
/**
* Statement provider for service [social-messaging](https://docs.aws.amazon.com/service-authorization/latest/reference/list_socialmessaging.html).
*
*/
constructor(props) {
super(props);
this.servicePrefix = 'social-messaging';
this.accessLevelList = {
Write: [
'AssociateWhatsAppBusinessAccount',
'CreateWhatsAppFlow',
'CreateWhatsAppMessageTemplate',
'CreateWhatsAppMessageTemplateFromLibrary',
'CreateWhatsAppMessageTemplateMedia',
'DeleteWhatsAppFlow',
'DeleteWhatsAppMessageMedia',
'DeleteWhatsAppMessageTemplate',
'DeprecateWhatsAppFlow',
'DisassociateWhatsAppBusinessAccount',
'GetWhatsAppMessageMedia',
'PostWhatsAppMessageMedia',
'PublishWhatsAppFlow',
'PutWhatsAppBusinessAccountEventDestinations',
'SendWhatsAppMessage',
'TagResource',
'UntagResource',
'UpdateWhatsAppFlow',
'UpdateWhatsAppFlowAssets',
'UpdateWhatsAppMessageTemplate'
],
Read: [
'GetLinkedWhatsAppBusinessAccount',
'GetLinkedWhatsAppBusinessAccountPhoneNumber',
'GetWhatsAppFlow',
'GetWhatsAppFlowPreview',
'GetWhatsAppMessageTemplate',
'ListTagsForResource'
],
List: [
'ListLinkedWhatsAppBusinessAccounts',
'ListWhatsAppFlowAssets',
'ListWhatsAppFlows',
'ListWhatsAppMessageTemplates',
'ListWhatsAppTemplateLibrary'
],
Tagging: [
'TagResource',
'UntagResource'
]
};
}
}
exports.SocialMessaging = SocialMessaging;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29jaWFsbWVzc2FnaW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic29jaWFsbWVzc2FnaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLHlDQUF5RDtBQUd6RDs7OztHQUlHO0FBQ0gsTUFBYSxlQUFnQixTQUFRLHdCQUFlO0lBR2xEOzs7Ozs7Ozs7OztPQVdHO0lBQ0ksa0NBQWtDO1FBQ3ZDLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxvQkFBb0I7UUFDekIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLG9CQUFvQixDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLCtCQUErQjtRQUNwQyxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsK0JBQStCLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksMENBQTBDO1FBQy9DLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxvQ0FBb0M7UUFDekMsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLG9DQUFvQyxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLG9CQUFvQjtRQUN6QixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsb0JBQW9CLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksNEJBQTRCO1FBQ2pDLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSwrQkFBK0I7UUFDcEMsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLCtCQUErQixDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLHVCQUF1QjtRQUM1QixPQUFP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dGVudCI6WyJpbXBvcnQgeyBBY2Nlc3NMZXZlbExpc3QgfSBmcm9tICcuLi8uLi9zaGFyZWQvYWNjZXNzLWxldmVsJztcbmltcG9ydCB7IFBvbGljeVN0YXRlbWVudCwgT3BlcmF0b3IgfSBmcm9tICcuLi8uLi9zaGFyZWQnO1xuaW1wb3J0IHsgYXdzX2lhbSBhcyBpYW0gfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcblxuLyoqXG4gKiBTdGF0ZW1lbnQgcHJvdmlkZXIgZm9yIHNlcnZpY2UgW3NvY2lhbC1tZXNzYWdpbmddKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zZXJ2aWNlLWF1dGhvcml6YXRpb24vbGF0ZXN0L3JlZmVyZW5jZS9saXN0X3NvY2lhbG1lc3NhZ2luZy5odG1sKS5cbiAqXG4gKiBAcGFyYW0gc2lkIFtTSURdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfc2lkLmh0bWwpIG9mIHRoZSBzdGF0ZW1lbnRcbiAqL1xuZXhwb3J0IGNsYXNzIFNvY2lhbE1lc3NhZ2luZyBleHRlbmRzIFBvbGljeVN0YXRlbWVudCB7XG4gIHB1YmxpYyBzZXJ2aWNlUHJlZml4ID0gJ3NvY2lhbC1tZXNzYWdpbmcnO1xuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBhc3NvY2lhdGUgYSBXaGF0c0FwcCBCdXNpbmVzcyBBY2NvdW50IHdpdGggeW91ciBBV1MgYWNjb3VudFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVxdWVzdFRhZygpXG4gICAqIC0gLmlmQXdzUmVzb3VyY2VUYWcoKVxuICAgKiAtIC5pZkF3c1RhZ0tleXMoKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc29jaWFsLW1lc3NhZ2luZy9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9Bc3NvY2lhdGVXaGF0c0FwcEJ1c2luZXNzQWNjb3VudC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9Bc3NvY2lhdGVXaGF0c0FwcEJ1c2luZXNzQWNjb3VudCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQXNzb2NpYXRlV2hhdHNBcHBCdXNpbmVzc0FjY291bnQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYSBuZXcgV2hhdHNBcHAgRmxvd1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zb2NpYWwtbWVzc2FnaW5nL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0NyZWF0ZVdoYXRzQXBwRmxvdy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVXaGF0c0FwcEZsb3coKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZVdoYXRzQXBwRmxvdycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhIFdoYXRzQXBwIG1lc3NhZ2UgdGVtcGxhdGVcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc29jaWFsLW1lc3NhZ2luZy9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9DcmVhdGVXaGF0c0FwcE1lc3NhZ2VUZW1wbGF0ZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVXaGF0c0FwcE1lc3NhZ2VUZW1wbGF0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlV2hhdHNBcHBNZXNzYWdlVGVtcGxhdGUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgYSBXaGF0c0FwcCBtZXNzYWdlIHRlbXBsYXRlIGZyb20gTWV0YSdzIHRlbXBsYXRlIGxpYnJhcnlcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc29jaWFsLW1lc3NhZ2luZy9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9DcmVhdGVXaGF0c0FwcE1lc3NhZ2VUZW1wbGF0ZUZyb21MaWJyYXJ5Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZVdoYXRzQXBwTWVzc2FnZVRlbXBsYXRlRnJvbUxpYnJhcnkoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZVdoYXRzQXBwTWVzc2FnZVRlbXBsYXRlRnJvbUxpYnJhcnknKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgbWVkaWEgZm9yIFdoYXRzQXBwIG1lc3NhZ2UgdGVtcGxhdGVzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3NvY2lhbC1tZXNzYWdpbmcvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfQ3JlYXRlV2hhdHNBcHBNZXNzYWdlVGVtcGxhdGVNZWRpYS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVXaGF0c0FwcE1lc3NhZ2VUZW1wbGF0ZU1lZGlhKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVXaGF0c0FwcE1lc3NhZ2VUZW1wbGF0ZU1lZGlhJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGEgV2hhdHNBcHAgRmxvd1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zb2NpYWwtbWVzc2FnaW5nL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0RlbGV0ZVdoYXRzQXBwRmxvdy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVXaGF0c0FwcEZsb3coKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZVdoYXRzQXBwRmxvdycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlbGV0ZSBhIG1lZGlhIG9iamVjdCBmcm9tIFdoYXRzQXBwXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3NvY2lhbC1tZXNzYWdpbmcvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVsZXRlV2hhdHNBcHBNZXNzYWdlTWVkaWEuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlV2hhdHNBcHBNZXNzYWdlTWVkaWEoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZVdoYXRzQXBwTWVzc2FnZU1lZGlhJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIGEgV2hhdHNBcHAgbWVzc2FnZSB0ZW1wbGF0ZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zb2NpYWwtbWVzc2FnaW5nL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0RlbGV0ZVdoYXRzQXBwTWVzc2FnZVRlbXBsYXRlLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZVdoYXRzQXBwTWVzc2FnZVRlbXBsYXRlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVXaGF0c0FwcE1lc3NhZ2VUZW1wbGF0ZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlcHJlY2F0ZSBhIHB1Ymxpc2hlZCBXaGF0c0FwcCBGbG93XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3NvY2lhbC1tZXNzYWdpbmcvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfRGVwcmVjYXRlV2hhdHNBcHBGbG93Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0RlcHJlY2F0ZVdoYXRzQXBwRmxvdygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVwcmVjYXRlV2hhdHNBcHBGbG93Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGlzYXNzb2NpYXRlIGEgV2hhdHNBcHAgQnVzaW5lc3MgQWNjb3VudCBmcm9tIHlvdXIgQVdTIGFjY291bnRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc29jaWFsLW1lc3NhZ2luZy9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9EaXNhc3NvY2lhdGVXaGF0c0FwcEJ1c2luZXNzQWNjb3VudC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EaXNhc3NvY2lhdGVXaGF0c0FwcEJ1c2luZXNzQWNjb3VudCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGlzYXNzb2NpYXRlV2hhdHNBcHBCdXNpbmVzc0FjY291bnQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byB2aWV3IHRoZSBkZXRhaWxzIG9mIGEgV2hhdHNBcHAgQnVzaW5lc3MgQWNjb3VudFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3NvY2lhbC1tZXNzYWdpbmcvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfR2V0TGlua2VkV2hhdHNBcHBCdXNpbmVzc0FjY291bnQuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0TGlua2VkV2hhdHNBcHBCdXNpbmVzc0FjY291bnQoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldExpbmtlZFdoYXRzQXBwQnVzaW5lc3NBY2NvdW50Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gdmlldyB0aGUgZGV0YWlscyBvZiBhIHBob25lIG51bWJlclxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3NvY2lhbC1tZXNzYWdpbmcvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfR2V0TGlua2VkV2hhdHNBcHBCdXNpbmVzc0FjY291bnRQaG9uZU51bWJlci5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRMaW5rZWRXaGF0c0FwcEJ1c2luZXNzQWNjb3VudFBob25lTnVtYmVyKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRMaW5rZWRXaGF0c0FwcEJ1c2luZXNzQWNjb3VudFBob25lTnVtYmVyJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmV0cmlldmUgdGhlIG1ldGFkYXRhIGFuZCBzdGF0dXMgb2YgYSBXaGF0c0FwcCBGbG93XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc29jaWFsLW1lc3NhZ2luZy9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9HZXRXaGF0c0FwcEZsb3cuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0V2hhdHNBcHBGbG93KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRXaGF0c0FwcEZsb3cnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZW5lcmF0ZSBhIHdlYiBwcmV2aWV3IFVSTCBmb3IgdGVzdGluZyBhIFdoYXRzQXBwIEZsb3dcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zb2NpYWwtbWVzc2FnaW5nL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0dldFdoYXRzQXBwRmxvd1ByZXZpZXcuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0V2hhdHNBcHBGbG93UHJldmlldygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0V2hhdHNBcHBGbG93UHJldmlldycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdldCBhIG1lZGlhIG9iamVjdCBmcm9tIFdoYXRzQXBwXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3NvY2lhbC1tZXNzYWdpbmcvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfR2V0V2hhdHNBcHBNZXNzYWdlTWVkaWEuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0V2hhdHNBcHBNZXNzYWdlTWVkaWEoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldFdoYXRzQXBwTWVzc2FnZU1lZGlhJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZ2V0IGRldGFpbHMgb2YgYSBXaGF0c0FwcCBtZXNzYWdlIHRlbXBsYXRlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc29jaWFsLW1lc3NhZ2luZy9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9HZXRXaGF0c0FwcE1lc3NhZ2VUZW1wbGF0ZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRXaGF0c0FwcE1lc3NhZ2VUZW1wbGF0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0V2hhdHNBcHBNZXNzYWdlVGVtcGxhdGUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byB2aWV3IGFsbCBvZiB5b3VyIFdoYXRzQXBwIEJ1c2luZXNzIEFjY291bnRzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc29jaWFsLW1lc3NhZ2luZy9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9MaXN0TGlua2VkV2hhdHNBcHBCdXNpbmVzc0FjY291bnRzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RMaW5rZWRXaGF0c0FwcEJ1c2luZXNzQWNjb3VudHMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RMaW5rZWRXaGF0c0FwcEJ1c2luZXNzQWNjb3VudHMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0IHRhZ3MgZm9yIGEgcmVzb3VyY2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zb2NpYWwtbWVzc2FnaW5nL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0xpc3RUYWdzRm9yUmVzb3VyY2UuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdFRhZ3NGb3JSZXNvdXJjZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdFRhZ3NGb3JSZXNvdXJjZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgdGhlIGFzc2V0cyBvZiBhIFdoYXRzQXBwIEZsb3dcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zb2NpYWwtbWVzc2FnaW5nL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0xpc3RXaGF0c0FwcEZsb3dBc3NldHMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdFdoYXRzQXBwRmxvd0Fzc2V0cygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdFdoYXRzQXBwRmxvd0Fzc2V0cycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgYWxsIFdoYXRzQXBwIEZsb3dzIGZvciBhIFdoYXRzQXBwIEJ1c2luZXNzIEFjY291bnRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zb2NpYWwtbWVzc2FnaW5nL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0xpc3RXaGF0c0FwcEZsb3dzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RXaGF0c0FwcEZsb3dzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0V2hhdHNBcHBGbG93cycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgV2hhdHNBcHAgbWVzc2FnZSB0ZW1wbGF0ZXNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zb2NpYWwtbWVzc2FnaW5nL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX0xpc3RXaGF0c0FwcE1lc3NhZ2VUZW1wbGF0ZXMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdFdoYXRzQXBwTWVzc2FnZVRlbXBsYXRlcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdFdoYXRzQXBwTWVzc2FnZVRlbXBsYXRlcycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgYXZhaWxhYmxlIHRlbXBsYXRlcyBmcm9tIE1ldGEncyB0ZW1wbGF0ZSBsaWJyYXJ5XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc29jaWFsLW1lc3NhZ2luZy9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9MaXN0V2hhdHNBcHBUZW1wbGF0ZUxpYnJhcnkuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdFdoYXRzQXBwVGVtcGxhdGVMaWJyYXJ5KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0V2hhdHNBcHBUZW1wbGF0ZUxpYnJhcnknKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byB1cGxvYWQgYSBtZWRpYSBvYmplY3QgdG8gV2hhdHNBcHBcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc29jaWFsLW1lc3NhZ2luZy9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9Qb3N0V2hhdHNBcHBNZXNzYWdlTWVkaWEuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvUG9zdFdoYXRzQXBwTWVzc2FnZU1lZGlhKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdQb3N0V2hhdHNBcHBNZXNzYWdlTWVkaWEnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBwdWJsaXNoIGEgV2hhdHNBcHAgRmxvd1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zb2NpYWwtbWVzc2FnaW5nL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX1B1Ymxpc2hXaGF0c0FwcEZsb3cuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvUHVibGlzaFdoYXRzQXBwRmxvdygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnUHVibGlzaFdoYXRzQXBwRmxvdycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHVwZGF0ZSBhIFdoYXRzQXBwIEJ1c2luZXNzIEFjY291bnRzIGV2ZW50IGRlc3RpbmF0aW9uXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3NvY2lhbC1tZXNzYWdpbmcvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfUHV0V2hhdHNBcHBCdXNpbmVzc0FjY291bnRFdmVudERlc3RpbmF0aW9ucy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9QdXRXaGF0c0FwcEJ1c2luZXNzQWNjb3VudEV2ZW50RGVzdGluYXRpb25zKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdQdXRXaGF0c0FwcEJ1c2luZXNzQWNjb3VudEV2ZW50RGVzdGluYXRpb25zJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gc2VuZCBhIG1lc3NhZ2UgdGhyb3VnaCBXaGF0c0FwcFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zb2NpYWwtbWVzc2FnaW5nL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX1NlbmRXaGF0c0FwcE1lc3NhZ2UuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvU2VuZFdoYXRzQXBwTWVzc2FnZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnU2VuZFdoYXRzQXBwTWVzc2FnZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGFkZCBhIHRhZyB0byBhIHJlc291cmNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogVGFnZ2luZywgV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3NvY2lhbC1tZXNzYWdpbmcvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfVGFnUmVzb3VyY2UuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvVGFnUmVzb3VyY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1RhZ1Jlc291cmNlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmVtb3ZlIGEgdGFnIGZyb20gYSByZXNvdXJjZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFRhZ2dpbmcsIFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zb2NpYWwtbWVzc2FnaW5nL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX1VudGFnUmVzb3VyY2UuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvVW50YWdSZXNvdXJjZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVW50YWdSZXNvdXJjZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHVwZGF0ZSB0aGUgbWV0YWRhdGEgb2YgYSBXaGF0c0FwcCBGbG93XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3NvY2lhbC1tZXNzYWdpbmcvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfVXBkYXRlV2hhdHNBcHBGbG93Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1VwZGF0ZVdoYXRzQXBwRmxvdygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVXBkYXRlV2hhdHNBcHBGbG93Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gdXBkYXRlIHRoZSBGbG93IEpTT04gZGVmaW5pdGlvbiBvZiBhIFdoYXRzQXBwIEZsb3dcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc29jaWFsLW1lc3NhZ2luZy9sYXRlc3QvQVBJUmVmZXJlbmNlL0FQSV9VcGRhdGVXaGF0c0FwcEZsb3dBc3NldHMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvVXBkYXRlV2hhdHNBcHBGbG93QXNzZXRzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdVcGRhdGVXaGF0c0FwcEZsb3dBc3NldHMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byB1cGRhdGUgYSBXaGF0c0FwcCBtZXNzYWdlIHRlbXBsYXRlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3NvY2lhbC1tZXNzYWdpbmcvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfVXBkYXRlV2hhdHNBcHBNZXNzYWdlVGVtcGxhdGUuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvVXBkYXRlV2hhdHNBcHBNZXNzYWdlVGVtcGxhdGUoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1VwZGF0ZVdoYXRzQXBwTWVzc2FnZVRlbXBsYXRlJyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWNjZXNzTGV2ZWxMaXN0OiBBY2Nlc3NMZXZlbExpc3QgPSB7XG4gICAgV3JpdGU6IFtcbiAgICAgICdBc3NvY2lhdGVXaGF0c0FwcEJ1c2luZXNzQWNjb3VudCcsXG4gICAgICAnQ3JlYXRlV2hhdHNBcHBGbG93JyxcbiAgICAgICdDcmVhdGVXaGF0c0FwcE1lc3NhZ2VUZW1wbGF0ZScsXG4gICAgICAnQ3JlYXRlV2hhdHNBcHBNZXNzYWdlVGVtcGxhdGVGcm9tTGlicmFyeScsXG4gICAgICAnQ3JlYXRlV2hhdHNBcHBNZXNzYWdlVGVtcGxhdGVNZWRpYScsXG4gICAgICAnRGVsZXRlV2hhdHNBcHBGbG93JyxcbiAgICAgICdEZWxldGVXaGF0c0FwcE1lc3NhZ2VNZWRpYScsXG4gICAgICAnRGVsZXRlV2hhdHNBcHBNZXNzYWdlVGVtcGxhdGUnLFxuICAgICAgJ0RlcHJlY2F0ZVdoYXRzQXBwRmxvdycsXG4gICAgICAnRGlzYXNzb2NpYXRlV2hhdHNBcHBCdXNpbmVzc0FjY291bnQnLFxuICAgICAgJ0dldFdoYXRzQXBwTWVzc2FnZU1lZGlhJyxcbiAgICAgICdQb3N0V2hhdHNBcHBNZXNzYWdlTWVkaWEnLFxuICAgICAgJ1B1Ymxpc2hXaGF0c0FwcEZsb3cnLFxuICAgICAgJ1B1dFdoYXRzQXBwQnVzaW5lc3NBY2NvdW50RXZlbnREZXN0aW5hdGlvbnMnLFxuICAgICAgJ1NlbmRXaGF0c0FwcE1lc3NhZ2UnLFxuICAgICAgJ1RhZ1Jlc291cmNlJyxcbiAgICAgICdVbnRhZ1Jlc291cmNlJyxcbiAgICAgICdVcGRhdGVXaGF0c0FwcEZsb3cnLFxuICAgICAgJ1VwZGF0ZVdoYXRzQXBwRmxvd0Fzc2V0cycsXG4gICAgICAnVXBkYXRlV2hhdHNBcHBNZXNzYWdlVGVtcGxhdGUnXG4gICAgXSxcbiAgICBSZWFkOiBbXG4gICAgICAnR2V0TGlua2VkV2hhdHNBcHBCdXNpbmVzc0FjY291bnQnLFxuICAgICAgJ0dldExpbmtlZFdoYXRzQXBwQnVzaW5lc3NBY2NvdW50UGhvbmVOdW1iZXInLFxuICAgICAgJ0dldFdoYXRzQXBwRmxvdycsXG4gICAgICAnR2V0V2hhdHNBcHBGbG93UHJldmlldycsXG4gICAgICAnR2V0V2hhdHNBcHBNZXNzYWdlVGVtcGxhdGUnLFxuICAgICAgJ0xpc3RUYWdzRm9yUmVzb3VyY2UnXG4gICAgXSxcbiAgICBMaXN0OiBbXG4gICAgICAnTGlzdExpbmtlZFdoYXRzQXBwQnVzaW5lc3NBY2NvdW50cycsXG4gICAgICAnTGlzdFdoYXRzQXBwRmxvd0Fzc2V0cycsXG4gICAgICAnTGlzdFdoYXRzQXBwRmxvd3MnLFxuICAgICAgJ0xpc3RXaGF0c0FwcE1lc3NhZ2VUZW1wbGF0ZXMnLFxuICAgICAgJ0xpc3RXaGF0c0FwcFRlbXBsYXRlTGlicmFyeSdcbiAgICBdLFxuICAgIFRhZ2dpbmc6IFtcbiAgICAgICdUYWdSZXNvdXJjZScsXG4gICAgICAnVW50YWdSZXNvdXJjZSdcbiAgICBdXG4gIH07XG5cbiAgLyoqXG4gICAqIEFkZHMgYSByZXNvdXJjZSBvZiB0eXBlIHBob25lLW51bWJlci1pZCB0byB0aGUgc3RhdGVtZW50XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zb2NpYWwtbWVzc2FnaW5nL2xhdGVzdC9BUElSZWZlcmVuY2UvQVBJX1doYXRzQXBwUGhvbmVOdW1iZXJEZXRhaWwuaHRtbFxuICAgKlxuICAgKiBAcGFyYW0gb3JpZ2luYXRpb25QaG9uZU51bWJlcklkIC0gSWRlbnRpZmllciBmb3IgdGhlIG9yaWdpbmF0aW9uUGhvbmVOdW1iZXJJZC5cbiAgICogQHBhcmFtIGFjY291bnQgLSBBY2NvdW50IG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBhY2NvdW50LlxuICAgKiBAcGFyYW0gcmVnaW9uIC0gUmVnaW9uIG9mIHRoZSByZXNvdXJjZTsgZGVmYXVsdHMgdG8gYCpgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyByZWdpb24uXG4gICAqIEBwYXJhbSBwYXJ0aXRpb24gLSBQYXJ0aXRpb24gb2YgdGhlIEFXUyBhY2NvdW50IFthd3MsIGF3cy1jbiwgYXdzLXVzLWdvdl07IGRlZmF1bHRzIHRvIGBhd3NgLCB1bmxlc3MgdXNpbmcgdGhlIENESywgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgU3RhY2sncyBwYXJ0aXRpb24uXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmQXdzUmVzb3VyY2VUYWcoKVxuICAgKi9cbiAgcHVibGljIG9uUGhvbmVOdW1iZXJJZChvcmlnaW5hdGlvblBob25lTnVtYmVySWQ6IHN0cmluZywgYWNjb3VudD86IHN0cmluZywgcmVnaW9uPzogc3RyaW5nLCBwYXJ0aXRpb24/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5vbihgYXJuOiR7IHBhcnRpdGlvbiA/PyB0aGlzLmRlZmF1bHRQYXJ0aXRpb24gfTpzb2NpYWwtbWVzc2FnaW5nOiR7IHJlZ2lvbiA/PyB0aGlzLmRlZmF1bHRSZWdpb24gfTokeyBhY2NvdW50ID8/IHRoaXMuZGVmYXVsdEFjY291bnQgfTpwaG9uZS1udW1iZXItaWQvJHsgb3JpZ2luYXRpb25QaG9uZU51bWJlcklkIH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVzb3VyY2Ugb2YgdHlwZSB3YWJhIHRvIHRoZSBzdGF0ZW1lbnRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3NvY2lhbC1tZXNzYWdpbmcvbGF0ZXN0L0FQSVJlZmVyZW5jZS9BUElfTGlua2VkV2hhdHNBcHBCdXNpbmVzc0FjY291bnRTdW1tYXJ5Lmh0bWxcbiAgICpcbiAgICogQHBhcmFtIHdhYmFJZCAtIElkZW50aWZpZXIgZm9yIHRoZSB3YWJhSWQuXG4gICAqIEBwYXJhbSBhY2NvdW50IC0gQWNjb3VudCBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgYWNjb3VudC5cbiAgICogQHBhcmFtIHJlZ2lvbiAtIFJlZ2lvbiBvZiB0aGUgcmVzb3VyY2U7IGRlZmF1bHRzIHRvIGAqYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcmVnaW9uLlxuICAgKiBAcGFyYW0gcGFydGl0aW9uIC0gUGFydGl0aW9uIG9mIHRoZSBBV1MgYWNjb3VudCBbYXdzLCBhd3MtY24sIGF3cy11cy1nb3ZdOyBkZWZhdWx0cyB0byBgYXdzYCwgdW5sZXNzIHVzaW5nIHRoZSBDREssIHdoZXJlIHRoZSBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IFN0YWNrJ3MgcGFydGl0aW9uLlxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkF3c1Jlc291cmNlVGFnKClcbiAgICovXG4gIHB1YmxpYyBvbldhYmEod2FiYUlkOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06c29jaWFsLW1lc3NhZ2luZzokeyByZWdpb24gPz8gdGhpcy5kZWZhdWx0UmVnaW9uIH06JHsgYWNjb3VudCA/PyB0aGlzLmRlZmF1bHRBY2NvdW50IH06d2FiYS8keyB3YWJhSWQgfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYWNjZXNzIGJ5IHRoZSB0YWdzIHRoYXQgYXJlIHBhc3NlZCBpbiB0aGUgcmVxdWVzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2NvbmRpdGlvbi1rZXlzLmh0bWwjY29uZGl0aW9uLWtleXMtcmVxdWVzdHRhZ1xuICAgKlxuICAgKiBBcHBsaWVzIHRvIGFjdGlvbnM6XG4gICAqIC0gLnRvQXNzb2NpYXRlV2hhdHNBcHBCdXNpbmVzc0FjY291bnQoKVxuICAgKiAtIC50b1RhZ1Jlc291cmNlKClcbiAgICpcbiAgICogQHBhcmFtIHRhZ0tleSBUaGUgdGFnIGtleSB0byBjaGVja1xuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlKHMpIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBvcGVyYXRvciBXb3JrcyB3aXRoIFtzdHJpbmcgb3BlcmF0b3JzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbl9vcGVyYXRvcnMuaHRtbCNDb25kaXRpb25zX1N0cmluZykuICoqRGVmYXVsdDoqKiBgU3RyaW5nTGlrZWBcbiAgICovXG4gIHB1YmxpYyBpZkF3c1JlcXVlc3RUYWcodGFnS2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSwgb3BlcmF0b3I/OiBPcGVyYXRvciB8IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmlmKGBhd3M6UmVxdWVzdFRhZy8keyB0YWdLZXkgfWAsIHZhbHVlLCBvcGVyYXRvciA/PyAnU3RyaW5nTGlrZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYWNjZXNzIGJ5IHRoZSB0YWdzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVzb3VyY2VcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19jb25kaXRpb24ta2V5cy5odG1sI2NvbmRpdGlvbi1rZXlzLXJlc291cmNldGFnXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9Bc3NvY2lhdGVXaGF0c0FwcEJ1c2luZXNzQWNjb3VudCgpXG4gICAqIC0gLnRvQ3JlYXRlV2hhdHNBcHBGbG93KClcbiAgICogLSAudG9DcmVhdGVXaGF0c0FwcE1lc3NhZ2VUZW1wbGF0ZSgpXG4gICAqIC0gLnRvQ3JlYXRlV2hhdHNBcHBNZXNzYWdlVGVtcGxhdGVGcm9tTGlicmFyeSgpXG4gICAqIC0gLnRvQ3JlYXRlV2hhdHNBcHBNZXNzYWdlVGVtcGxhdGVNZWRpYSgpXG4gICAqIC0gLnRvRGVsZXRlV2hhdHNBcHBGbG93KClcbiAgICogLSAudG9EZWxldGVXaGF0c0FwcE1lc3NhZ2VNZWRpYSgpXG4gICAqIC0gLnRvRGVsZXRlV2hhdHNBcHBNZXNzYWdlVGVtcGxhdGUoKVxuICAgKiAtIC50b0RlcHJlY2F0ZVdoYXRzQXBwRmxvdygpXG4gICAqIC0gLnRvRGlzYXNzb2NpYXRlV2hhdHNBcHBCdXNpbmVzc0FjY291bnQoKVxuICAgKiAtIC50b0dldExpbmtlZFdoYXRzQXBwQnVzaW5lc3NBY2NvdW50KClcbiAgICogLSAudG9HZXRMaW5rZWRXaGF0c0FwcEJ1c2luZXNzQWNjb3VudFBob25lTnVtYmVyKClcbiAgICogLSAudG9HZXRXaGF0c0FwcEZsb3coKVxuICAgKiAtIC50b0dldFdoYXRzQXBwRmxvd1ByZXZpZXcoKVxuICAgKiAtIC50b0dldFdoYXRzQXBwTWVzc2FnZU1lZGlhKClcbiAgICogLSAudG9HZXRXaGF0c0FwcE1lc3NhZ2VUZW1wbGF0ZSgpXG4gICAqIC0gLnRvTGlzdFRhZ3NGb3JSZXNvdXJjZSgpXG4gICAqIC0gLnRvTGlzdFdoYXRzQXBwRmxvd0Fzc2V0cygpXG4gICAqIC0gLnRvTGlzdFdoYXRzQXBwRmxvd3MoKVxuICAgKiAtIC50b0xpc3RXaGF0c0FwcE1lc3NhZ2VUZW1wbGF0ZXMoKVxuICAgKiAtIC50b0xpc3RXaGF0c0FwcFRlbXBsYXRlTGlicmFyeSgpXG4gICAqIC0gLnRvUG9zdFdoYXRzQXBwTWVzc2FnZU1lZGlhKClcbiAgICogLSAudG9QdWJsaXNoV2hhdHNBcHBGbG93KClcbiAgICogLSAudG9QdXRXaGF0c0FwcEJ1c2luZXNzQWNjb3VudEV2ZW50RGVzdGluYXRpb25zKClcbiAgICogLSAudG9TZW5kV2hhdHNBcHBNZXNzYWdlKClcbiAgICogLSAudG9UYWdSZXNvdXJjZSgpXG4gICAqIC0gLnRvVW50YWdSZXNvdXJjZSgpXG4gICAqIC0gLnRvVXBkYXRlV2hhdHNBcHBGbG93KClcbiAgICogLSAudG9VcGRhdGVXaGF0c0FwcEZsb3dBc3NldHMoKVxuICAgKiAtIC50b1VwZGF0ZVdoYXRzQXBwTWVzc2FnZVRlbXBsYXRlKClcbiAgICpcbiAgICogQXBwbGllcyB0byByZXNvdXJjZSB0eXBlczpcbiAgICogLSBwaG9uZS1udW1iZXItaWRcbiAgICogLSB3YWJhXG4gICAqXG4gICAqIEBwYXJhbSB0YWdLZXkgVGhlIHRhZyBrZXkgdG8gY2hlY2tcbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZShzKSB0byBjaGVja1xuICAgKiBAcGFyYW0gb3BlcmF0b3IgV29ya3Mgd2l0aCBbc3RyaW5nIG9wZXJhdG9yc10oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19lbGVtZW50c19jb25kaXRpb25fb3BlcmF0b3JzLmh0bWwjQ29uZGl0aW9uc19TdHJpbmcpLiAqKkRlZmF1bHQ6KiogYFN0cmluZ0xpa2VgXG4gICAqL1xuICBwdWJsaWMgaWZBd3NSZXNvdXJjZVRhZyh0YWdLZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdLCBvcGVyYXRvcj86IE9wZXJhdG9yIHwgc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaWYoYGF3czpSZXNvdXJjZVRhZy8keyB0YWdLZXkgfWAsIHZhbHVlLCBvcGVyYXRvciA/PyAnU3RyaW5nTGlrZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYWNjZXNzIGJ5IHRoZSB0YWcga2V5cyB0aGF0IGFyZSBwYXNzZWQgaW4gdGhlIHJlcXVlc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19jb25kaXRpb24ta2V5cy5odG1sI2NvbmRpdGlvbi1rZXlzLXRhZ2tleXNcbiAgICpcbiAgICogQXBwbGllcyB0byBhY3Rpb25zOlxuICAgKiAtIC50b0Fzc29jaWF0ZVdoYXRzQXBwQnVzaW5lc3NBY2NvdW50KClcbiAgICogLSAudG9UYWdSZXNvdXJjZSgpXG4gICAqIC0gLnRvVW50YWdSZXNvdXJjZSgpXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUocykgdG8gY2hlY2tcbiAgICogQHBhcmFtIG9wZXJhdG9yIFdvcmtzIHdpdGggW3N0cmluZyBvcGVyYXRvcnNdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfY29uZGl0aW9uX29wZXJhdG9ycy5odG1sI0NvbmRpdGlvbnNfU3RyaW5nKS4gKipEZWZhdWx0OioqIGBTdHJpbmdMaWtlYFxuICAgKi9cbiAgcHVibGljIGlmQXdzVGFnS2V5cyh2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10sIG9wZXJhdG9yPzogT3BlcmF0b3IgfCBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pZihgYXdzOlRhZ0tleXNgLCB2YWx1ZSwgb3BlcmF0b3IgPz8gJ1N0cmluZ0xpa2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGF0ZW1lbnQgcHJvdmlkZXIgZm9yIHNlcnZpY2UgW3NvY2lhbC1tZXNzYWdpbmddKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zZXJ2aWNlLWF1dGhvcml6YXRpb24vbGF0ZXN0L3JlZmVyZW5jZS9saXN0X3NvY2lhbG1lc3NhZ2luZy5odG1sKS5cbiAgICpcbiAgICovXG4gIGNvbnN0cnVjdG9yKHByb3BzPzogaWFtLlBvbGljeVN0YXRlbWVudFByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICB9XG59XG4iXX0=