UNPKG

cdk-iam-floyd

Version:

AWS IAM policy statement generator with fluent interface for AWS CDK

574 lines 52.6 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ConnectCampaigns = void 0; const shared_1 = require("../../shared"); /** * Statement provider for service [connect-campaigns](https://docs.aws.amazon.com/service-authorization/latest/reference/list_connect-outbound-campaigns.html). * * @param sid [SID](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_sid.html) of the statement */ class ConnectCampaigns extends shared_1.PolicyStatement { /** * Grants permission to create a campaign * * Access Level: Write * * https://docs.aws.amazon.com/connect/latest/adminguide/enable-outbound-campaigns.html */ toCreateCampaign() { return this.to('CreateCampaign'); } /** * Grants permission to delete a campaign * * Access Level: Write * * https://docs.aws.amazon.com/connect/latest/adminguide/enable-outbound-campaigns.html */ toDeleteCampaign() { return this.to('DeleteCampaign'); } /** * Grants permission to delete the channel subtype configuration of a campaign * * Access Level: Write * * https://docs.aws.amazon.com/connect/latest/adminguide/enable-outbound-campaigns.html */ toDeleteCampaignChannelSubtypeConfig() { return this.to('DeleteCampaignChannelSubtypeConfig'); } /** * Grants permission to delete the communication limits configuration of a campaign * * Access Level: Write * * https://docs.aws.amazon.com/connect/latest/adminguide/enable-outbound-campaigns.html */ toDeleteCampaignCommunicationLimits() { return this.to('DeleteCampaignCommunicationLimits'); } /** * Grants permission to delete the communication time configuration of a campaign * * Access Level: Write * * https://docs.aws.amazon.com/connect/latest/adminguide/enable-outbound-campaigns.html */ toDeleteCampaignCommunicationTime() { return this.to('DeleteCampaignCommunicationTime'); } /** * Grants permission to delete the entry limits configuration of a campaign * * Access Level: Write * * https://docs.aws.amazon.com/connect/latest/adminguide/enable-outbound-campaigns.html */ toDeleteCampaignEntryLimits() { return this.to('DeleteCampaignEntryLimits'); } /** * Grants permission to remove configuration information for an Amazon Connect instance * * Access Level: Write * * https://docs.aws.amazon.com/connect/latest/adminguide/enable-outbound-campaigns.html */ toDeleteConnectInstanceConfig() { return this.to('DeleteConnectInstanceConfig'); } /** * Grants permission to remove integration information for an Amazon Connect instance * * Access Level: Write * * https://docs.aws.amazon.com/connect/latest/adminguide/enable-outbound-campaigns.html */ toDeleteConnectInstanceIntegration() { return this.to('DeleteConnectInstanceIntegration'); } /** * Grants permission to remove onboarding job for an Amazon Connect instance * * Access Level: Write * * https://docs.aws.amazon.com/connect/latest/adminguide/enable-outbound-campaigns.html */ toDeleteInstanceOnboardingJob() { return this.to('DeleteInstanceOnboardingJob'); } /** * Grants permission to describe a specific campaign * * Access Level: Read * * https://docs.aws.amazon.com/connect/latest/adminguide/enable-outbound-campaigns.html */ toDescribeCampaign() { return this.to('DescribeCampaign'); } /** * Grants permission to get state of a campaign * * Access Level: Read * * https://docs.aws.amazon.com/connect/latest/adminguide/enable-outbound-campaigns.html */ toGetCampaignState() { return this.to('GetCampaignState'); } /** * Grants permission to get state of campaigns * * Access Level: Read * * https://docs.aws.amazon.com/connect/latest/adminguide/enable-outbound-campaigns.html */ toGetCampaignStateBatch() { return this.to('GetCampaignStateBatch'); } /** * Grants permission to get configuration information for an Amazon Connect instance * * Access Level: Read * * https://docs.aws.amazon.com/connect/latest/adminguide/enable-outbound-campaigns.html */ toGetConnectInstanceConfig() { return this.to('GetConnectInstanceConfig'); } /** * Grants permission to get the communication limits configuration of an Amazon Connect instance * * Access Level: Read * * https://docs.aws.amazon.com/connect/latest/adminguide/enable-outbound-campaigns.html */ toGetInstanceCommunicationLimits() { return this.to('GetInstanceCommunicationLimits'); } /** * Grants permission to get onboarding job status for an Amazon Connect instance * * Access Level: Read * * https://docs.aws.amazon.com/connect/latest/adminguide/enable-outbound-campaigns.html */ toGetInstanceOnboardingJobStatus() { return this.to('GetInstanceOnboardingJobStatus'); } /** * Grants permission to provide summary of all campaigns * * Access Level: List * * Possible conditions: * - .ifAwsRequestTag() * * https://docs.aws.amazon.com/connect/latest/adminguide/enable-outbound-campaigns.html */ toListCampaigns() { return this.to('ListCampaigns'); } /** * Grants permission to provide summary of all integrations with an Amazon Connect instance * * Access Level: List * * https://docs.aws.amazon.com/connect/latest/adminguide/enable-outbound-campaigns.html */ toListConnectInstanceIntegrations() { return this.to('ListConnectInstanceIntegrations'); } /** * Grants permission to list tags for a resource * * Access Level: Read * * https://docs.aws.amazon.com/connect/latest/adminguide/enable-outbound-campaigns.html */ toListTagsForResource() { return this.to('ListTagsForResource'); } /** * Grants permission to pause a campaign * * Access Level: Write * * https://docs.aws.amazon.com/connect/latest/adminguide/enable-outbound-campaigns.html */ toPauseCampaign() { return this.to('PauseCampaign'); } /** * Grants permission to put an integration configuration with an Amazon Connect instance * * Access Level: Write * * https://docs.aws.amazon.com/connect/latest/adminguide/enable-outbound-campaigns.html */ toPutConnectInstanceIntegration() { return this.to('PutConnectInstanceIntegration'); } /** * Grants permission to create dial requests for the specified campaign * * Access Level: Write * * https://docs.aws.amazon.com/connect/latest/adminguide/enable-outbound-campaigns.html */ toPutDialRequestBatch() { return this.to('PutDialRequestBatch'); } /** * Grants permission to put the communication limits configuration of an Amazon Connect instance * * Access Level: Write * * https://docs.aws.amazon.com/connect/latest/adminguide/enable-outbound-campaigns.html */ toPutInstanceCommunicationLimits() { return this.to('PutInstanceCommunicationLimits'); } /** * Grants permission to create dial requests for the specified campaign * * Access Level: Write * * https://docs.aws.amazon.com/connect/latest/adminguide/enable-outbound-campaigns.html */ toPutOutboundRequestBatch() { return this.to('PutOutboundRequestBatch'); } /** * Grants permission to create profile outbound requests for the specified campaign * * Access Level: Write * * https://docs.aws.amazon.com/connect/latest/adminguide/enable-outbound-campaigns.html */ toPutProfileOutboundRequestBatch() { return this.to('PutProfileOutboundRequestBatch'); } /** * Grants permission to resume a campaign * * Access Level: Write * * https://docs.aws.amazon.com/connect/latest/adminguide/enable-outbound-campaigns.html */ toResumeCampaign() { return this.to('ResumeCampaign'); } /** * Grants permission to start a campaign * * Access Level: Write * * https://docs.aws.amazon.com/connect/latest/adminguide/enable-outbound-campaigns.html */ toStartCampaign() { return this.to('StartCampaign'); } /** * Grants permission to start onboarding job for an Amazon Connect instance * * Access Level: Write * * https://docs.aws.amazon.com/connect/latest/adminguide/enable-outbound-campaigns.html */ toStartInstanceOnboardingJob() { return this.to('StartInstanceOnboardingJob'); } /** * Grants permission to stop a campaign * * Access Level: Write * * https://docs.aws.amazon.com/connect/latest/adminguide/enable-outbound-campaigns.html */ toStopCampaign() { return this.to('StopCampaign'); } /** * Grants permission to tag a resource * * Access Level: Tagging, Write * * https://docs.aws.amazon.com/connect/latest/adminguide/enable-outbound-campaigns.html */ toTagResource() { return this.to('TagResource'); } /** * Grants permission to untag a resource * * Access Level: Tagging, Write * * https://docs.aws.amazon.com/connect/latest/adminguide/enable-outbound-campaigns.html */ toUntagResource() { return this.to('UntagResource'); } /** * Grants permission to update the channel subtype configuration of a campaign * * Access Level: Write * * https://docs.aws.amazon.com/connect/latest/adminguide/enable-outbound-campaigns.html */ toUpdateCampaignChannelSubtypeConfig() { return this.to('UpdateCampaignChannelSubtypeConfig'); } /** * Grants permission to update the communication limits configuration of a campaign * * Access Level: Write * * https://docs.aws.amazon.com/connect/latest/adminguide/enable-outbound-campaigns.html */ toUpdateCampaignCommunicationLimits() { return this.to('UpdateCampaignCommunicationLimits'); } /** * Grants permission to update the communication time configuration of a campaign * * Access Level: Write * * https://docs.aws.amazon.com/connect/latest/adminguide/enable-outbound-campaigns.html */ toUpdateCampaignCommunicationTime() { return this.to('UpdateCampaignCommunicationTime'); } /** * Grants permission to update the dialer configuration of a campaign * * Access Level: Write * * https://docs.aws.amazon.com/connect/latest/adminguide/enable-outbound-campaigns.html */ toUpdateCampaignDialerConfig() { return this.to('UpdateCampaignDialerConfig'); } /** * Grants permission to update the entry limits configuration of a campaign * * Access Level: Write * * https://docs.aws.amazon.com/connect/latest/adminguide/enable-outbound-campaigns.html */ toUpdateCampaignEntryLimits() { return this.to('UpdateCampaignEntryLimits'); } /** * Grants permission to update the flow association of a campaign * * Access Level: Write * * https://docs.aws.amazon.com/connect/latest/adminguide/enable-outbound-campaigns.html */ toUpdateCampaignFlowAssociation() { return this.to('UpdateCampaignFlowAssociation'); } /** * Grants permission to update the name of a campaign * * Access Level: Write * * https://docs.aws.amazon.com/connect/latest/adminguide/enable-outbound-campaigns.html */ toUpdateCampaignName() { return this.to('UpdateCampaignName'); } /** * Grants permission to update the outbound call configuration of a campaign * * Access Level: Write * * https://docs.aws.amazon.com/connect/latest/adminguide/enable-outbound-campaigns.html */ toUpdateCampaignOutboundCallConfig() { return this.to('UpdateCampaignOutboundCallConfig'); } /** * Grants permission to update the schedule of a campaign * * Access Level: Write * * https://docs.aws.amazon.com/connect/latest/adminguide/enable-outbound-campaigns.html */ toUpdateCampaignSchedule() { return this.to('UpdateCampaignSchedule'); } /** * Grants permission to update the source of a campaign * * Access Level: Write * * https://docs.aws.amazon.com/connect/latest/adminguide/enable-outbound-campaigns.html */ toUpdateCampaignSource() { return this.to('UpdateCampaignSource'); } /** * Adds a resource of type campaign to the statement * * https://docs.aws.amazon.com/connect/latest/adminguide/enable-outbound-campaigns.html * * @param campaignId - Identifier for the campaignId. * @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() */ onCampaign(campaignId, account, region, partition) { return this.on(`arn:${partition ?? this.defaultPartition}:connect-campaigns:${region ?? this.defaultRegion}:${account ?? this.defaultAccount}:campaign/${campaignId}`); } /** * Filters access by actions based on the presence of tag key-value pairs in the request * * https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-requesttag * * Applies to actions: * - .toCreateCampaign() * - .toDescribeCampaign() * - .toGetCampaignState() * - .toGetCampaignStateBatch() * - .toListCampaigns() * - .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 actions based on tag key-value pairs attached to the resource * * https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-resourcetag * * Applies to actions: * - .toCreateCampaign() * - .toDeleteCampaign() * - .toDeleteCampaignChannelSubtypeConfig() * - .toDeleteCampaignCommunicationLimits() * - .toDeleteCampaignCommunicationTime() * - .toDeleteCampaignEntryLimits() * - .toDescribeCampaign() * - .toGetCampaignState() * - .toGetCampaignStateBatch() * - .toListTagsForResource() * - .toPauseCampaign() * - .toPutDialRequestBatch() * - .toPutOutboundRequestBatch() * - .toPutProfileOutboundRequestBatch() * - .toResumeCampaign() * - .toStartCampaign() * - .toStopCampaign() * - .toTagResource() * - .toUntagResource() * - .toUpdateCampaignChannelSubtypeConfig() * - .toUpdateCampaignCommunicationLimits() * - .toUpdateCampaignCommunicationTime() * - .toUpdateCampaignDialerConfig() * - .toUpdateCampaignEntryLimits() * - .toUpdateCampaignFlowAssociation() * - .toUpdateCampaignName() * - .toUpdateCampaignOutboundCallConfig() * - .toUpdateCampaignSchedule() * - .toUpdateCampaignSource() * * Applies to resource types: * - campaign * * @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 actions based on the presence of tag keys in the request * * https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-tagkeys * * Applies to actions: * - .toCreateCampaign() * - .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 [connect-campaigns](https://docs.aws.amazon.com/service-authorization/latest/reference/list_connect-outbound-campaigns.html). * */ constructor(props) { super(props); this.servicePrefix = 'connect-campaigns'; this.accessLevelList = { Write: [ 'CreateCampaign', 'DeleteCampaign', 'DeleteCampaignChannelSubtypeConfig', 'DeleteCampaignCommunicationLimits', 'DeleteCampaignCommunicationTime', 'DeleteCampaignEntryLimits', 'DeleteConnectInstanceConfig', 'DeleteConnectInstanceIntegration', 'DeleteInstanceOnboardingJob', 'PauseCampaign', 'PutConnectInstanceIntegration', 'PutDialRequestBatch', 'PutInstanceCommunicationLimits', 'PutOutboundRequestBatch', 'PutProfileOutboundRequestBatch', 'ResumeCampaign', 'StartCampaign', 'StartInstanceOnboardingJob', 'StopCampaign', 'TagResource', 'UntagResource', 'UpdateCampaignChannelSubtypeConfig', 'UpdateCampaignCommunicationLimits', 'UpdateCampaignCommunicationTime', 'UpdateCampaignDialerConfig', 'UpdateCampaignEntryLimits', 'UpdateCampaignFlowAssociation', 'UpdateCampaignName', 'UpdateCampaignOutboundCallConfig', 'UpdateCampaignSchedule', 'UpdateCampaignSource' ], Read: [ 'DescribeCampaign', 'GetCampaignState', 'GetCampaignStateBatch', 'GetConnectInstanceConfig', 'GetInstanceCommunicationLimits', 'GetInstanceOnboardingJobStatus', 'ListTagsForResource' ], List: [ 'ListCampaigns', 'ListConnectInstanceIntegrations' ], Tagging: [ 'TagResource', 'UntagResource' ] }; } } exports.ConnectCampaigns = ConnectCampaigns; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29ubmVjdC1vdXRib3VuZC1jYW1wYWlnbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjb25uZWN0LW91dGJvdW5kLWNhbXBhaWducy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSx5Q0FBeUQ7QUFHekQ7Ozs7R0FJRztBQUNILE1BQWEsZ0JBQWlCLFNBQVEsd0JBQWU7SUFHbkQ7Ozs7OztPQU1HO0lBQ0ksZ0JBQWdCO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxnQkFBZ0I7UUFDckIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLG9DQUFvQztRQUN6QyxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsb0NBQW9DLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksbUNBQW1DO1FBQ3hDLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxpQ0FBaUM7UUFDdEMsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLGlDQUFpQyxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLDJCQUEyQjtRQUNoQyxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsMkJBQTJCLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksNkJBQTZCO1FBQ2xDLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxrQ0FBa0M7UUFDdkMsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLGtDQUFrQyxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJ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O2dCQUNoQixvQ0FBb0M7Z0JBQ3BDLG1DQUFtQztnQkFDbkMsaUNBQWlDO2dCQUNqQywyQkFBMkI7Z0JBQzNCLDZCQUE2QjtnQkFDN0Isa0NBQWtDO2dCQUNsQyw2QkFBNkI7Z0JBQzdCLGVBQWU7Z0JBQ2YsK0JBQStCO2dCQUMvQixxQkFBcUI7Z0JBQ3JCLGdDQUFnQztnQkFDaEMseUJBQXlCO2dCQUN6QixnQ0FBZ0M7Z0JBQ2hDLGdCQUFnQjtnQkFDaEIsZUFBZTtnQkFDZiw0QkFBNEI7Z0JBQzVCLGNBQWM7Z0JBQ2QsYUFBYTtnQkFDYixlQUFlO2dCQUNmLG9DQUFvQztnQkFDcEMsbUNBQW1DO2dCQUNuQyxpQ0FBaUM7Z0JBQ2pDLDRCQUE0QjtnQkFDNUIsMkJBQTJCO2dCQUMzQiwrQkFBK0I7Z0JBQy9CLG9CQUFvQjtnQkFDcEIsa0NBQWtDO2dCQUNsQyx3QkFBd0I7Z0JBQ3hCLHNCQUFzQjthQUN2QjtZQUNELElBQUksRUFBRTtnQkFDSixrQkFBa0I7Z0JBQ2xCLGtCQUFrQjtnQkFDbEIsdUJBQXVCO2dCQUN2QiwwQkFBMEI7Z0JBQzFCLGdDQUFnQztnQkFDaEMsZ0NBQWdDO2dCQUNoQyxxQkFBcUI7YUFDdEI7WUFDRCxJQUFJLEVBQUU7Z0JBQ0osZUFBZTtnQkFDZixpQ0FBaUM7YUFDbEM7WUFDRCxPQUFPLEVBQUU7Z0JBQ1AsYUFBYTtnQkFDYixlQUFlO2FBQ2hCO1NBQ0YsQ0FBQztJQThHRixDQUFDO0NBQ0Y7QUFobUJELDRDQWdtQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBY2Nlc3NMZXZlbExpc3QgfSBmcm9tICcuLi8uLi9zaGFyZWQvYWNjZXNzLWxldmVsJztcbmltcG9ydCB7IFBvbGljeVN0YXRlbWVudCwgT3BlcmF0b3IgfSBmcm9tICcuLi8uLi9zaGFyZWQnO1xuaW1wb3J0IHsgYXdzX2lhbSBhcyBpYW0gfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcblxuLyoqXG4gKiBTdGF0ZW1lbnQgcHJvdmlkZXIgZm9yIHNlcnZpY2UgW2Nvbm5lY3QtY2FtcGFpZ25zXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc2VydmljZS1hdXRob3JpemF0aW9uL2xhdGVzdC9yZWZlcmVuY2UvbGlzdF9jb25uZWN0LW91dGJvdW5kLWNhbXBhaWducy5odG1sKS5cbiAqXG4gKiBAcGFyYW0gc2lkIFtTSURdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfc2lkLmh0bWwpIG9mIHRoZSBzdGF0ZW1lbnRcbiAqL1xuZXhwb3J0IGNsYXNzIENvbm5lY3RDYW1wYWlnbnMgZXh0ZW5kcyBQb2xpY3lTdGF0ZW1lbnQge1xuICBwdWJsaWMgc2VydmljZVByZWZpeCA9ICdjb25uZWN0LWNhbXBhaWducyc7XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhIGNhbXBhaWduXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2Nvbm5lY3QvbGF0ZXN0L2FkbWluZ3VpZGUvZW5hYmxlLW91dGJvdW5kLWNhbXBhaWducy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVDYW1wYWlnbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlQ2FtcGFpZ24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgYSBjYW1wYWlnblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jb25uZWN0L2xhdGVzdC9hZG1pbmd1aWRlL2VuYWJsZS1vdXRib3VuZC1jYW1wYWlnbnMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlQ2FtcGFpZ24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZUNhbXBhaWduJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIHRoZSBjaGFubmVsIHN1YnR5cGUgY29uZmlndXJhdGlvbiBvZiBhIGNhbXBhaWduXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2Nvbm5lY3QvbGF0ZXN0L2FkbWluZ3VpZGUvZW5hYmxlLW91dGJvdW5kLWNhbXBhaWducy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVDYW1wYWlnbkNoYW5uZWxTdWJ0eXBlQ29uZmlnKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVDYW1wYWlnbkNoYW5uZWxTdWJ0eXBlQ29uZmlnJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIHRoZSBjb21tdW5pY2F0aW9uIGxpbWl0cyBjb25maWd1cmF0aW9uIG9mIGEgY2FtcGFpZ25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY29ubmVjdC9sYXRlc3QvYWRtaW5ndWlkZS9lbmFibGUtb3V0Ym91bmQtY2FtcGFpZ25zLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZUNhbXBhaWduQ29tbXVuaWNhdGlvbkxpbWl0cygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlQ2FtcGFpZ25Db21tdW5pY2F0aW9uTGltaXRzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIHRoZSBjb21tdW5pY2F0aW9uIHRpbWUgY29uZmlndXJhdGlvbiBvZiBhIGNhbXBhaWduXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2Nvbm5lY3QvbGF0ZXN0L2FkbWluZ3VpZGUvZW5hYmxlLW91dGJvdW5kLWNhbXBhaWducy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVDYW1wYWlnbkNvbW11bmljYXRpb25UaW1lKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVDYW1wYWlnbkNvbW11bmljYXRpb25UaW1lJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIHRoZSBlbnRyeSBsaW1pdHMgY29uZmlndXJhdGlvbiBvZiBhIGNhbXBhaWduXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2Nvbm5lY3QvbGF0ZXN0L2FkbWluZ3VpZGUvZW5hYmxlLW91dGJvdW5kLWNhbXBhaWducy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVDYW1wYWlnbkVudHJ5TGltaXRzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVDYW1wYWlnbkVudHJ5TGltaXRzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmVtb3ZlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIGFuIEFtYXpvbiBDb25uZWN0IGluc3RhbmNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2Nvbm5lY3QvbGF0ZXN0L2FkbWluZ3VpZGUvZW5hYmxlLW91dGJvdW5kLWNhbXBhaWducy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVDb25uZWN0SW5zdGFuY2VDb25maWcoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0RlbGV0ZUNvbm5lY3RJbnN0YW5jZUNvbmZpZycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJlbW92ZSBpbnRlZ3JhdGlvbiBpbmZvcm1hdGlvbiBmb3IgYW4gQW1hem9uIENvbm5lY3QgaW5zdGFuY2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY29ubmVjdC9sYXRlc3QvYWRtaW5ndWlkZS9lbmFibGUtb3V0Ym91bmQtY2FtcGFpZ25zLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZUNvbm5lY3RJbnN0YW5jZUludGVncmF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVDb25uZWN0SW5zdGFuY2VJbnRlZ3JhdGlvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJlbW92ZSBvbmJvYXJkaW5nIGpvYiBmb3IgYW4gQW1hem9uIENvbm5lY3QgaW5zdGFuY2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY29ubmVjdC9sYXRlc3QvYWRtaW5ndWlkZS9lbmFibGUtb3V0Ym91bmQtY2FtcGFpZ25zLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZUluc3RhbmNlT25ib2FyZGluZ0pvYigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlSW5zdGFuY2VPbmJvYXJkaW5nSm9iJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVzY3JpYmUgYSBzcGVjaWZpYyBjYW1wYWlnblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2Nvbm5lY3QvbGF0ZXN0L2FkbWluZ3VpZGUvZW5hYmxlLW91dGJvdW5kLWNhbXBhaWducy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZXNjcmliZUNhbXBhaWduKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZXNjcmliZUNhbXBhaWduJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZ2V0IHN0YXRlIG9mIGEgY2FtcGFpZ25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jb25uZWN0L2xhdGVzdC9hZG1pbmd1aWRlL2VuYWJsZS1vdXRib3VuZC1jYW1wYWlnbnMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0Q2FtcGFpZ25TdGF0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0Q2FtcGFpZ25TdGF0ZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdldCBzdGF0ZSBvZiBjYW1wYWlnbnNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jb25uZWN0L2xhdGVzdC9hZG1pbmd1aWRlL2VuYWJsZS1vdXRib3VuZC1jYW1wYWlnbnMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0Q2FtcGFpZ25TdGF0ZUJhdGNoKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRDYW1wYWlnblN0YXRlQmF0Y2gnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgYW4gQW1hem9uIENvbm5lY3QgaW5zdGFuY2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jb25uZWN0L2xhdGVzdC9hZG1pbmd1aWRlL2VuYWJsZS1vdXRib3VuZC1jYW1wYWlnbnMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0Q29ubmVjdEluc3RhbmNlQ29uZmlnKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRDb25uZWN0SW5zdGFuY2VDb25maWcnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgdGhlIGNvbW11bmljYXRpb24gbGltaXRzIGNvbmZpZ3VyYXRpb24gb2YgYW4gQW1hem9uIENvbm5lY3QgaW5zdGFuY2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jb25uZWN0L2xhdGVzdC9hZG1pbmd1aWRlL2VuYWJsZS1vdXRib3VuZC1jYW1wYWlnbnMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0SW5zdGFuY2VDb21tdW5pY2F0aW9uTGltaXRzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRJbnN0YW5jZUNvbW11bmljYXRpb25MaW1pdHMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgb25ib2FyZGluZyBqb2Igc3RhdHVzIGZvciBhbiBBbWF6b24gQ29ubmVjdCBpbnN0YW5jZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2Nvbm5lY3QvbGF0ZXN0L2FkbWluZ3VpZGUvZW5hYmxlLW91dGJvdW5kLWNhbXBhaWducy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRJbnN0YW5jZU9uYm9hcmRpbmdKb2JTdGF0dXMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldEluc3RhbmNlT25ib2FyZGluZ0pvYlN0YXR1cycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHByb3ZpZGUgc3VtbWFyeSBvZiBhbGwgY2FtcGFpZ25zXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkF3c1JlcXVlc3RUYWcoKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY29ubmVjdC9sYXRlc3QvYWRtaW5ndWlkZS9lbmFibGUtb3V0Ym91bmQtY2FtcGFpZ25zLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RDYW1wYWlnbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RDYW1wYWlnbnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBwcm92aWRlIHN1bW1hcnkgb2YgYWxsIGludGVncmF0aW9ucyB3aXRoIGFuIEFtYXpvbiBDb25uZWN0IGluc3RhbmNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY29ubmVjdC9sYXRlc3QvYWRtaW5ndWlkZS9lbmFibGUtb3V0Ym91bmQtY2FtcGFpZ25zLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RDb25uZWN0SW5zdGFuY2VJbnRlZ3JhdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RDb25uZWN0SW5zdGFuY2VJbnRlZ3JhdGlvbnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0IHRhZ3MgZm9yIGEgcmVzb3VyY2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jb25uZWN0L2xhdGVzdC9hZG1pbmd1aWRlL2VuYWJsZS1vdXRib3VuZC1jYW1wYWlnbnMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdFRhZ3NGb3JSZXNvdXJjZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdFRhZ3NGb3JSZXNvdXJjZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHBhdXNlIGEgY2FtcGFpZ25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY29ubmVjdC9sYXRlc3QvYWRtaW5ndWlkZS9lbmFibGUtb3V0Ym91bmQtY2FtcGFpZ25zLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1BhdXNlQ2FtcGFpZ24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1BhdXNlQ2FtcGFpZ24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBwdXQgYW4gaW50ZWdyYXRpb24gY29uZmlndXJhdGlvbiB3aXRoIGFuIEFtYXpvbiBDb25uZWN0IGluc3RhbmNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2Nvbm5lY3QvbGF0ZXN0L2FkbWluZ3VpZGUvZW5hYmxlLW91dGJvdW5kLWNhbXBhaWducy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9QdXRDb25uZWN0SW5zdGFuY2VJbnRlZ3JhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnUHV0Q29ubmVjdEluc3RhbmNlSW50ZWdyYXRpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgZGlhbCByZXF1ZXN0cyBmb3IgdGhlIHNwZWNpZmllZCBjYW1wYWlnblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jb25uZWN0L2xhdGVzdC9hZG1pbmd1aWRlL2VuYWJsZS1vdXRib3VuZC1jYW1wYWlnbnMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvUHV0RGlhbFJlcXVlc3RCYXRjaCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnUHV0RGlhbFJlcXVlc3RCYXRjaCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHB1dCB0aGUgY29tbXVuaWNhdGlvbiBsaW1pdHMgY29uZmlndXJhdGlvbiBvZiBhbiBBbWF6b24gQ29ubmVjdCBpbnN0YW5jZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jb25uZWN0L2xhdGVzdC9hZG1pbmd1aWRlL2VuYWJsZS1vdXRib3VuZC1jYW1wYWlnbnMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvUHV0SW5zdGFuY2VDb21tdW5pY2F0aW9uTGltaXRzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdQdXRJbnN0YW5jZUNvbW11bmljYXRpb25MaW1pdHMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgZGlhbCByZXF1ZXN0cyBmb3IgdGhlIHNwZWNpZmllZCBjYW1wYWlnblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jb25uZWN0L2xhdGVzdC9hZG1pbmd1aWRlL2VuYWJsZS1vdXRib3VuZC1jYW1wYWlnbnMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvUHV0T3V0Ym91bmRSZXF1ZXN0QmF0Y2goKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1B1dE91dGJvdW5kUmVxdWVzdEJhdGNoJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY3JlYXRlIHByb2ZpbGUgb3V0Ym91bmQgcmVxdWVzdHMgZm9yIHRoZSBzcGVjaWZpZWQgY2FtcGFpZ25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY29ubmVjdC9sYXRlc3QvYWRtaW5ndWlkZS9lbmFibGUtb3V0Ym91bmQtY2FtcGFpZ25zLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1B1dFByb2ZpbGVPdXRib3VuZFJlcXVlc3RCYXRjaCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnUHV0UHJvZmlsZU91dGJvdW5kUmVxdWVzdEJhdGNoJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmVzdW1lIGEgY2FtcGFpZ25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY29ubmVjdC9sYXRlc3QvYWRtaW5ndWlkZS9lbmFibGUtb3V0Ym91bmQtY2FtcGFpZ25zLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1Jlc3VtZUNhbXBhaWduKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdSZXN1bWVDYW1wYWlnbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHN0YXJ0IGEgY2FtcGFpZ25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY29ubmVjdC9sYXRlc3QvYWRtaW5ndWlkZS9lbmFibGUtb3V0Ym91bmQtY2FtcGFpZ25zLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1N0YXJ0Q2FtcGFpZ24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1N0YXJ0Q2FtcGFpZ24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBzdGFydCBvbmJvYXJkaW5nIGpvYiBmb3IgYW4gQW1hem9uIENvbm5lY3QgaW5zdGFuY2VcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY29ubmVjdC9sYXRlc3QvYWRtaW5ndWlkZS9lbmFibGUtb3V0Ym91bmQtY2FtcGFpZ25zLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1N0YXJ0SW5zdGFuY2VPbmJvYXJkaW5nSm9iKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdTdGFydEluc3RhbmNlT25ib2FyZGluZ0pvYicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHN0b3AgYSBjYW1wYWlnblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jb25uZWN0L2xhdGVzdC9hZG1pbmd1aWRlL2VuYWJsZS1vdXRib3VuZC1jYW1wYWlnbnMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvU3RvcENhbXBhaWduKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdTdG9wQ2FtcGFpZ24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byB0YWcgYSByZXNvdXJjZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFRhZ2dpbmcsIFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jb25uZWN0L2xhdGVzdC9hZG1pbmd1aWRlL2VuYWJsZS1vdXRib3VuZC1jYW1wYWlnbnMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvVGFnUmVzb3VyY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1RhZ1Jlc291cmNlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gdW50YWcgYSByZXNvdXJjZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFRhZ2dpbmcsIFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jb25uZWN0L2xhdGVzdC9hZG1pbmd1aWRlL2VuYWJsZS1vdXRib3VuZC1jYW1wYWlnbnMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvVW50YWdSZXNvdXJjZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVW50YWdSZXNvdXJjZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHVwZGF0ZSB0aGUgY2hhbm5lbCBzdWJ0eXBlIGNvbmZpZ3VyYXRpb24gb2YgYSBjYW1wYWlnblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jb25uZWN0L2xhdGVzdC9hZG1pbmd1aWRlL2VuYWJsZS1vdXRib3VuZC1jYW1wYWlnbnMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvVXBkYXRlQ2FtcGFpZ25DaGFubmVsU3VidHlwZUNvbmZpZygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVXBkYXRlQ2FtcGFpZ25DaGFubmVsU3VidHlwZUNvbmZpZycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHVwZGF0ZSB0aGUgY29tbXVuaWNhdGlvbiBsaW1pdHMgY29uZmlndXJhdGlvbiBvZiBhIGNhbXBhaWduXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2Nvbm5lY3QvbGF0ZXN0L2FkbWluZ3VpZGUvZW5hYmxlLW91dGJvdW5kLWNhbXBhaWducy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9VcGRhdGVDYW1wYWlnbkNvbW11bmljYXRpb25MaW1pdHMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1VwZGF0ZUNhbXBhaWduQ29tbXVuaWNhdGlvbkxpbWl0cycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHVwZGF0ZSB0aGUgY29tbXVuaWNhdGlvbiB0aW1lIGNvbmZpZ3VyYXRpb24gb2YgYSBjYW1wYWlnblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jb25uZWN0L2xhdGVzdC9hZG1pbmd1aWRlL2VuYWJsZS1vdXRib3VuZC1jYW1wYWlnbnMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvVXBkYXRlQ2FtcGFpZ25Db21tdW5pY2F0aW9uVGltZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVXBkYXRlQ2FtcGFpZ25Db21tdW5pY2F0aW9uVGltZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHVwZGF0ZSB0aGUgZGlhbGVyIGNvbmZpZ3VyYXRpb24gb2YgYSBjYW1wYWlnblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jb25uZWN0L2xhdGVzdC9hZG1pbmd1aWRlL2VuYWJsZS1vdXRib3VuZC1jYW1wYWlnbnMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvVXBkYXRlQ2FtcGFpZ25EaWFsZXJDb25maWcoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1VwZGF0ZUNhbXBhaWduRGlhbGVyQ29uZmlnJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gdXBkYXRlIHRoZSBlbnRyeSBsaW1pdHMgY29uZmlndXJhdGlvbiBvZiBhIGNhbXBhaWduXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2Nvbm5lY3QvbGF0ZXN0L2FkbWluZ3VpZGUvZW5hYmxlLW91dGJvdW5kLWNhbXBhaWducy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9VcGRhdGVDYW1wYWlnbkVudHJ5TGltaXRzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdVcGRhdGVDYW1wYWlnbkVudHJ5TGltaXRzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gdXBkYXRlIHRoZSBmbG93IGFzc29jaWF0aW9uIG9mIGEgY2FtcGFpZ25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY29ubmVjdC9sYXRlc3QvYWRtaW5ndWlkZS9lbmFibGUtb3V0Ym91bmQtY2FtcGFpZ25zLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1VwZGF0ZUNhbXBhaWduRmxvd0Fzc29jaWF0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdVcGRhdGVDYW1wYWlnbkZsb3dBc3NvY2lhdGlvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHVwZGF0ZSB0aGUgbmFtZSBvZiBhIGNhbXBhaWduXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2Nvbm5lY3QvbGF0ZXN0L2FkbWluZ3VpZGUvZW5hYmxlLW91dGJvdW5kLWNhbXBhaWducy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9VcGRhdGVDYW1wYWlnbk5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ1VwZGF0ZUNhbXBhaWduTmFtZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHVwZGF0ZSB0aGUgb3V0Ym91bmQgY2FsbCBjb25maWd1cmF0aW9uIG9mIGEgY2FtcGFpZ25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY29ubmVjdC9sYXRlc3QvYWRtaW5ndWlkZS9lbmFibGUtb3V0Ym91bmQtY2FtcGFpZ25zLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1VwZGF0ZUNhbXBhaWduT3V0Ym91bmRDYWxsQ29uZmlnKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdVcGRhdGVDYW1wYWlnbk91dGJvdW5kQ2FsbENvbmZpZycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHVwZGF0ZSB0aGUgc2NoZWR1bGUgb2YgYSBjYW1wYWlnblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jb25uZWN0L2xhdGVzdC9hZG1pbmd1aWRlL2VuYWJsZS1vdXRib3VuZC1jYW1wYWlnbnMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvVXBkYXRlQ2FtcGFpZ25TY2hlZHVsZSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnVXBkYXRlQ2FtcGFpZ25TY2hlZHVsZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHVwZGF0ZSB0aGUgc291cmNlIG9mIGEgY2FtcGFpZ25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY29ubmVjdC9sYXRlc3QvYWRtaW5ndWlkZS9lbmFibGUtb3V0Ym91bmQtY2FtcGFpZ25zLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b1VwZGF0ZUNhbXBhaWduU291cmNlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdVcGRhdGVDYW1wYWlnblNvdXJjZScpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFjY2Vzc0xldmVsTGlzdDogQWNjZXNzTGV2ZWxMaXN0ID0ge1xuICAgIFdyaXRlOiBbXG4gICAgICAnQ3JlYXRlQ2FtcGFpZ24nLFxuICAgICAgJ0RlbGV0ZUNhbXBhaWduJyxcbiAgICAgICdEZWxldGVDYW1wYWlnbkNoYW5uZWxTdWJ0eXBlQ29uZmlnJyxcbiAgICAgICdEZWxldGVDYW1wYWlnbkNvbW11bmljYXRpb25MaW1pdHMnLFxuICAgICAgJ0RlbGV0ZUNhbXBhaWduQ29tbXVuaWNhdGlvblRpbWUnLFxuICAgICAgJ0RlbGV0ZUNhbXBhaWduRW50cnlMaW1pdHMnLFxuICAgICAgJ0RlbGV0ZUNvbm5lY3RJbnN0YW5jZUNvbmZpZycsXG4gICAgICAnRGVsZXRlQ29ubmVjdEluc3RhbmNlSW50ZWdyYXRpb24nLFxuICAgICAgJ0RlbGV0ZUluc3RhbmNlT25ib2FyZGluZ0pvYicsXG4gICAgICAnUGF1c2VDYW1wYWlnbicsXG4gICAgICAnUHV0Q29ubmVjdEluc3RhbmNlSW50ZWdyYXRpb24nLFxuICAgICAgJ1B1dERpYWxSZXF1ZXN0QmF0Y2gnLFxuICAgICAgJ1B1dEluc3RhbmNlQ29tbXVuaWNhdGlvbkxpbWl0cycsXG4gICAgICAnUHV0T3V0Ym91bmRSZXF1ZXN0QmF0Y2gnLFxuICAgICAgJ1B1dFByb2ZpbGVPdXRib3VuZFJlcXVlc3RCYXRjaCcsXG4gICAgICAnUmVzdW1lQ2FtcGFpZ24nLFxuICAgICAgJ1N0YXJ0Q2FtcGFpZ24nLFxuICAgICAgJ1N0YXJ0SW5zdGFuY2VPbmJvYXJkaW5nSm9iJyxcbiAgICAgICdTdG9wQ2FtcGFpZ24nLFxuICAgICAgJ1RhZ1Jlc291cmNlJyxcbiAgICAgICdVbnRhZ1Jlc291cmNlJyxcbiAgICAgICdVcGRhdGVDYW1wYWlnbkNoYW5uZWxTdWJ0eXBlQ29uZmlnJyxcbiAgICAgICdVcGRhdGVDYW1wYWlnbkNvbW11bmljYXRpb25MaW1pdHMnLFxuICAgICAgJ1VwZGF0ZUNhbXBhaWduQ29tbXVuaWNhdGlvblRpbWUnLFxuICAgICAgJ1VwZGF0ZUNhbXBhaWduRGlhbGVyQ29uZmlnJyxcbiAgICAgICdVcGRhdGVDYW1wYWlnbkVudHJ5TGltaXRzJyxcbiAgICAgICdVcGRhdGVDYW1wYWlnbkZsb3dBc3NvY2lhdGlvbicsXG4gICAgICAnVXBkYXRlQ2FtcGFpZ25OYW1lJyxcbiAgICAgICdVcGRhdGVDYW1wYWlnbk91dGJvdW5kQ2FsbENvbmZpZycsXG4gICAgICAnVXBkYXRlQ2FtcGFpZ25TY2hlZHVsZScsXG4gICAgICAnVXBkYXRlQ2FtcGFpZ25Tb3VyY2UnXG4gICAgXSxcbiAgICBSZWFkOiBbXG4gICAgICAnRGVzY3JpYmVDYW1wYWlnbicsXG4gICAgICAnR2V0Q2FtcGFpZ25TdGF0ZScsXG4gICAgICAnR2V0Q2FtcGFpZ25TdGF0ZUJhdGNoJyxcbiAgICAgICdHZXRDb25uZWN0SW5zdGFuY2VDb25maWcnLFxuICAgICAgJ0dldEluc3RhbmNlQ29tbXVuaWNhdGlvbkxpbWl0cycsXG4gICAgICAnR2V0SW5zdGFuY2VPbmJvYXJkaW5nSm9iU3RhdHVzJyxcbiAgICAgICdMaXN0VGFnc0ZvclJlc291cmNlJ1xuICAgIF0sXG4gICAgTGlzdDogW1xuICAgICAgJ0xpc3RDYW1wYWlnbnMnLFxuICAgICAgJ0xpc3RDb25uZWN0SW5zdGFuY2VJbnRlZ3JhdGlvbnMnXG4gICAgXSxcbiAgICBUYWdnaW5nOiBbXG4gICAgICAnVGFnUmVzb3VyY2UnLFxuICAgICAgJ1VudGFnUmVzb3VyY2UnXG4gICAgXVxuICB9O1xuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVzb3VyY2Ugb2YgdHlwZSBjYW1wYWlnbiB0byB0aGUgc3RhdGVtZW50XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jb25uZWN0L2xhdGVzdC9hZG1pbmd1aWRlL2VuYWJsZS1vdXRib3VuZC1jYW1wYWlnbnMuaHRtbFxuICAgKlxuICAgKiBAcGFyYW0gY2FtcGFpZ25JZCAtIElkZW50aWZpZXIgZm9yIHRoZSBjYW1wYWlnbklkLlxuICAgKiBAcGFyYW0gYWNjb3VudCAtIEFjY291bnQgb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIGFjY291bnQuXG4gICAqIEBwYXJhbSByZWdpb24gLSBSZWdpb24gb2YgdGhlIHJlc291cmNlOyBkZWZhdWx0cyB0byBgKmAsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHJlZ2lvbi5cbiAgICogQHBhcmFtIHBhcnRpdGlvbiAtIFBhcnRpdGlvbiBvZiB0aGUgQVdTIGFjY291bnQgW2F3cywgYXdzLWNuLCBhd3MtdXMtZ292XTsgZGVmYXVsdHMgdG8gYGF3c2AsIHVubGVzcyB1c2luZyB0aGUgQ0RLLCB3aGVyZSB0aGUgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBTdGFjaydzIHBhcnRpdGlvbi5cbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZBd3NSZXNvdXJjZVRhZygpXG4gICAqL1xuICBwdWJsaWMgb25DYW1wYWlnbihjYW1wYWlnbklkOiBzdHJpbmcsIGFjY291bnQ/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZywgcGFydGl0aW9uPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMub24oYGFybjokeyBwYXJ0aXRpb24gPz8gdGhpcy5kZWZhdWx0UGFydGl0aW9uIH06Y29ubmVjdC1jYW1wYWlnbnM6JHsgcmVnaW9uID8/IHRoaXMuZGVmYXVsdFJlZ2lvbiB9OiR7IGFjY291bnQgPz8gdGhpcy5kZWZhdWx0QWNjb3VudCB9OmNhbXBhaWduLyR7IGNhbXBhaWduSWQgfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYWNjZXNzIGJ5IGFjdGlvbnMgYmFzZWQgb24gdGhlIHByZXNlbmNlIG9mIHRhZyBrZXktdmFsdWUgcGFpcnMgaW4gdGhlIHJlcXVlc3RcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19jb25kaXRpb24ta2V5cy5odG1sI2NvbmRpdGlvbi1rZXlzLXJlcXVlc3R0YWdcbiAgICpcbiAgICogQXBwbGllcyB0byBhY3Rpb25zOlxuICAgKiAtIC50b0NyZWF0ZUNhbXBhaWduKClcbiAgICogLSAudG9EZXNjcmliZUNhbXBhaWduKClcbiAgICogLSAudG9HZXRDYW1wYWlnblN0YXRlKClcbiAgICogLSAudG9HZXRDYW1wYWlnblN0YXRlQmF0Y2goKVxuICAgKiAtIC50b0xpc3RDYW1wYWlnbnMoKVxuICAgKiAtIC50b1RhZ1Jlc291cmNlKClcbiAgICpcbiAgICogQHBhcmFtIHRhZ0tleSBUaGUgdGFnIGtleSB0byBjaGVja1xuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlKHMpIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBvcGVyYXRvciBXb3JrcyB3aXRoIFtzdHJpbmcgb3BlcmF0b3JzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX2NvbmRpdGlvbl9vcGVyYXRvcnMuaHRtbCNDb25kaXRpb25zX1N0cmluZykuICoqRGVmYXVsdDoqKiBgU3RyaW5nTGlrZWBcbiAgICovXG4gIHB1YmxpYyBpZkF3c1JlcXVlc3RUYWcodGFnS2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSwgb3BlcmF0b3I/OiBPcGVyYXRvciB8IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmlmKGBhd3M6UmVxdWVzdFRhZy8keyB0YWdLZXkgfWAsIHZhbHVlLCBvcGVyYXRvciA/PyAnU3RyaW5nTGlrZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgYWNjZXNzIGJ5IGFjdGlvbnMgYmFzZWQgb24gdGFnIGtleS12YWx1ZSBwYWlycyBhdHRhY2hlZCB0byB0aGUgcmVzb3VyY2VcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0lBTS9sYXRlc3QvVXNlckd1aWRlL3JlZmVyZW5jZV9wb2xpY2llc19jb25kaXRpb24ta2V5cy5odG1sI2NvbmRpdGlvbi1rZXlzLXJlc291cmNldGFnXG4gICAqXG4gICAqIEFwcGxpZXMgdG8gYWN0aW9uczpcbiAgICogLSAudG9DcmVhdGVDYW1wYWlnbigpXG4gICAqIC0gLnRvRGVsZXRlQ2FtcGFpZ24oKVxuICAgKiAtIC50b0RlbGV0ZUNhbXBhaWduQ2hhbm5lbFN1YnR5cGVDb25maWcoKVxuICAgKiAtIC50b0RlbGV0ZUNhbXBhaWduQ29tbXVuaWNhdGlvbkxpbWl0cygpXG4gICAqIC0gLnRvRGVsZXRlQ2FtcGFpZ25Db21tdW5pY2F0aW9uVGltZSgpXG4gICAqIC0gLnRvRGVsZXRlQ2FtcGFpZ25FbnRyeUxpbWl0cygpXG4gICAqIC0gLnRvRGVzY3JpYmVDYW1wYWlnbigpXG4gICAqIC0gLnRvR2V0Q2FtcGFpZ25TdGF0ZSgpXG4gICAqIC0gLnRvR2V0Q2FtcGFpZ25TdGF0ZUJhdGNoKClcbiAgICogLSAudG9MaXN0VGFnc0ZvclJlc291cmNlKClcbiAgICogLSAudG9QYXVzZUNhbXBhaWduKClcbiAgICogLSAudG9QdXREaWFsUmVxdWVzdEJhdGNoKClcbiAgICogLSAudG9QdXRPdXRib3VuZFJlcXVlc3RCYXRjaCgpXG4gICAqIC0gLnRvUHV0UHJvZmlsZU91dGJvdW5kUmVxdWVzdEJhdGNoKClcbiAgICogLSAudG9SZXN1bWVDYW1wYWlnbigpXG4gICAqIC0gLnRvU3RhcnRDYW1wYWlnbigpXG4gICAqIC0gLnRvU3RvcENhbXBhaWduKClcbiAgICogLSAudG9UYWdSZXNvdXJjZSgpXG4gICAqIC0gLnRvVW50YWdSZXNvdXJjZSgpXG4gICAqIC0gLnRvVXBkYXR