UNPKG

cdk-iam-floyd

Version:

AWS IAM policy statement generator with fluent interface for AWS CDK

763 lines 70.6 kB
"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_amazonqbusinessqapps.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 * * Possible conditions: * - .ifUserIsAppOwner() * - .ifAppIsPublished() * * 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 * * Possible conditions: * - .ifUserIsAppOwner() * - .ifAppIsPublished() * * 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 copy Q App in the Q Business application environment * * Access Level: Write * * Possible conditions: * - .ifUserIsAppOwner() * - .ifAppIsPublished() * * 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 in the Q Business application environment * * Access Level: Write * * Possible conditions: * - .ifUserIsAppOwner() * - .ifAppIsPublished() * * https://docs.aws.amazon.com/amazonq/latest/api-reference/API_qapps_CreateLibraryItem.html */ toCreateLibraryItem() { return this.to('CreateLibraryItem'); } /** * Grants permission to create a library item review in the Q Business application environment * * Access Level: Write * * Possible conditions: * - .ifUserIsAppOwner() * - .ifAppIsPublished() * * https://docs.aws.amazon.com/amazonq/latest/qbusiness-ug/purpose-built-qapps.html */ toCreateLibraryItemReview() { return this.to('CreateLibraryItemReview'); } /** * Grants permission to create Q App in the Q Business application environment * * Access Level: Write * * Possible conditions: * - .ifAwsRequestTag() * - .ifAwsTagKeys() * * https://docs.aws.amazon.com/amazonq/latest/api-reference/API_qapps_CreateQApp.html */ toCreateQApp() { return this.to('CreateQApp'); } /** * 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 delete a library item in the Q Business application environment * * Access Level: Write * * Possible conditions: * - .ifUserIsAppOwner() * - .ifAppIsPublished() * * 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 * * Possible conditions: * - .ifUserIsAppOwner() * - .ifAppIsPublished() * * 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 * * Possible conditions: * - .ifUserIsAppOwner() * - .ifAppIsPublished() * * 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 * * Possible conditions: * - .ifUserIsAppOwner() * - .ifAppIsPublished() * * 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 * * Possible conditions: * - .ifUserIsAppOwner() * - .ifAppIsPublished() * * 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 * * Possible conditions: * - .ifUserIsAppOwner() * - .ifAppIsPublished() * * 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 * * Possible conditions: * - .ifUserIsAppOwner() * - .ifAppIsPublished() * * 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 * * Possible conditions: * - .ifUserIsAppOwner() * - .ifAppIsPublished() * - .ifUserIsSessionModerator() * - .ifSessionIsShared() * * 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 * * Possible conditions: * - .ifUserIsAppOwner() * - .ifAppIsPublished() * - .ifUserIsSessionModerator() * - .ifSessionIsShared() * * 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 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 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 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'); } /** * Grants permission to start Q App session in the Q Business application environment * * Access Level: Write * * Possible conditions: * - .ifUserIsAppOwner() * - .ifAppIsPublished() * - .ifAwsRequestTag() * - .ifAwsTagKeys() * * 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 * * Possible conditions: * - .ifUserIsAppOwner() * - .ifAppIsPublished() * - .ifUserIsSessionModerator() * - .ifSessionIsShared() * * 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 * * Possible conditions: * - .ifAwsRequestTag() * - .ifAwsTagKeys() * * 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 * * Possible conditions: * - .ifAwsTagKeys() * * 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 * * Possible conditions: * - .ifUserIsAppOwner() * - .ifAppIsPublished() * * 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 * * Possible conditions: * - .ifAppIsPublished() * * 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 * * Possible conditions: * - .ifUserIsAppOwner() * - .ifAppIsPublished() * * 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 * * Possible conditions: * - .ifUserIsAppOwner() * - .ifAppIsPublished() * * 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 * * Possible conditions: * - .ifUserIsAppOwner() * - .ifAppIsPublished() * - .ifUserIsSessionModerator() * - .ifSessionIsShared() * * 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'); } /** * 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 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() * - .toCopyQApp() * - .toCreateLibraryItem() * - .toCreateLibraryItemReview() * - .toDeleteLibraryItem() * - .toDeleteQApp() * - .toDescribeQAppPermissions() * - .toDisassociateLibraryItemReview() * - .toDisassociateQAppFromUser() * - .toGetLibraryItem() * - .toGetQApp() * - .toGetQAppSession() * - .toImportDocument() * - .toStartQAppSession() * - .toStopQAppSession() * - .toUpdateLibraryItem() * - .toUpdateLibraryItemMetadata() * - .toUpdateQApp() * - .toUpdateQAppPermissions() * - .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` */ 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() * - .toCopyQApp() * - .toCreateLibraryItem() * - .toCreateLibraryItemReview() * - .toDeleteLibraryItem() * - .toDeleteQApp() * - .toDescribeQAppPermissions() * - .toDisassociateLibraryItemReview() * - .toDisassociateQAppFromUser() * - .toGetLibraryItem() * - .toGetQApp() * - .toGetQAppSession() * - .toImportDocument() * - .toStartQAppSession() * - .toStopQAppSession() * - .toUpdateLibraryItem() * - .toUpdateQApp() * - .toUpdateQAppPermissions() * - .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` */ 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_amazonqbusinessqapps.html). * */ constructor(props) { super(props); this.servicePrefix = 'qapps'; this.accessLevelList = { Write: [ 'AssociateLibraryItemReview', 'AssociateQAppWithUser', 'BatchCreateCategory', 'BatchDeleteCategory', 'BatchUpdateCategory', 'CopyQApp', 'CreateLibraryItem', 'CreateLibraryItemReview', 'CreateQApp', 'CreateSubscriptionToken', 'DeleteLibraryItem', 'DeleteQApp', 'DisassociateLibraryItemReview', 'DisassociateQAppFromUser', 'ExportQAppSessionData', 'ImportDocument', 'PredictProblemStatementFromConversation', 'PredictQApp', 'PredictQAppFromProblemStatement', 'StartQAppSession', 'StopQAppSession', 'UpdateLibraryItem', 'UpdateLibraryItemMetadata', 'UpdateQApp', 'UpdateQAppPermissions', 'UpdateQAppSession', 'UpdateQAppSessionMetadata' ], Read: [ 'DescribeQAppPermissions', 'GetLibraryItem', 'GetQApp', 'GetQAppSession', 'GetQAppSessionMetadata', 'ListQAppSessionData', 'ListTagsForResource' ], List: [ 'ListCategories', 'ListLibraryItems', 'ListQApps' ], Tagging: [ 'TagResource', 'UntagResource' ] }; } } exports.Qapps = Qapps; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicWJ1c2luZXNzcWFwcHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJxYnVzaW5lc3NxYXBwcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSx5Q0FBeUQ7QUFHekQ7Ozs7R0FJRztBQUNILE1BQWEsS0FBTSxTQUFRLHdCQUFlO0lBR3hDOzs7Ozs7Ozs7O09BVUc7SUFDSSw0QkFBNEI7UUFDakMsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLDRCQUE0QixDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVEOzs7Ozs7Ozs7O09BVUc7SUFDSSx1QkFBdUI7UUFDNUIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLHVCQUF1QixDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLHFCQUFxQjtRQUMxQixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMscUJBQXFCLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0kscUJBQXFCO1FBQzFCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxxQkFBcUI7UUFDMUIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLHFCQUFxQixDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVEOzs7Ozs7Ozs7O09BVUc7SUFDSSxVQUFVO1FBQ2YsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFFRDs7Ozs7Ozs7OztPQVVHO0lBQ0ksbUJBQW1CO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRDs7Ozs7Ozs7OztPQVVHO0lBQ0kseUJBQXlCO1FBQzlCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFRDs7Ozs7Ozs7OztPQVVHO0lBQ0ksWUFBWTtRQUNqQixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLHlCQUF5QjtRQUM5QixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMseUJBQXlCLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7T0FVRztJQUNJLG1CQUFtQjtRQUN4QixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7T0FVRztJQUNJLFlBQVk7UUFDakIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFRDs7Ozs7Ozs7OztPQVVHO0lBQ0kseUJBQXlCO1FBQzlCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFRDs7Ozs7Ozs7OztPQVVHO0lBQ0ksK0JBQStCO1FBQ3BDLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRDs7Ozs7Ozs7OztPQVVHO0lBQ0ksMEJBQTBCO1FBQy9CLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSx1QkFBdUI7UUFDNUIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLHVCQUF1QixDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVEOzs7Ozs7Ozs7O09BVUc7SUFDSSxnQkFBZ0I7UUFDckIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVEOzs7Ozs7Ozs7O09BVUc7SUFDSSxTQUFTO1FBQ2QsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7O09BWUc7SUFDSSxnQkFBZ0I7UUFDckIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLHdCQUF3QjtRQUM3QixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsd0JBQXdCLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7OztPQVlHO0lBQ0ksZ0JBQWdCO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxnQkFBZ0I7UUFDckIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLGtCQUFrQjtRQUN2QixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsa0JBQWtCLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0kscUJBQXFCO1FBQzFCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxXQUFXO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0kscUJBQXFCO1FBQzFCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSx5Q0FBeUM7UUFDOUMsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLHlDQUF5QyxDQUFDLENBQUM7SUFDNUQsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLGFBQWE7UUFDbEIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxpQ0FBaUM7UUFDdEMsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLGlDQUFpQyxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7T0FZRztJQUNJLGtCQUFrQjtRQUN2QixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsa0JBQWtCLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7OztPQVlHO0lBQ0ksaUJBQWlCO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFRDs7Ozs7Ozs7OztPQVVHO0lBQ0ksYUFBYTtRQUNsQixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVEOzs7Ozs7Ozs7T0FTRztJQUNJLGVBQWU7UUFDcEIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFFRDs7Ozs7Ozs7OztPQVVHO0lBQ0ksbUJBQW1CO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSSwyQkFBMkI7UUFDaEMsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLDJCQUEyQixDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVEOzs7Ozs7Ozs7O09BVUc7SUFDSSxZQUFZO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7T0FVRztJQUNJLHVCQUF1QjtRQUM1QixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsdUJBQXVCLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7OztPQVlHO0lBQ0ksbUJBQW1CO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSwyQkFBMkI7UUFDaEMsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLDJCQUEyQixDQUFDLENBQUM7SUFDOUMsQ0FBQztJQW9ERDs7Ozs7Ozs7O09BU0c7SUFDSSxhQUFhLENBQUMsYUFBcUIsRUFBRSxPQUFnQixFQUFFLE1BQWUsRUFBRSxTQUFrQjtRQUMvRixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBUSxTQUFTLElBQUksSUFBSSxDQUFDLGdCQUFpQixjQUFlLE1BQU0sSUFBSSxJQUFJLENBQUMsYUFBYyxJQUFLLE9BQU8sSUFBSSxJQUFJLENBQUMsY0FBZSxnQkFBaUIsYUFBYyxFQUFFLENBQUMsQ0FBQztJQUMvSyxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7T0FhRztJQUNJLE1BQU0sQ0FBQyxhQUFxQixFQUFFLEtBQWEsRUFBRSxPQUFnQixFQUFFLE1BQWUsRUFBRSxTQUFrQjtRQUN2RyxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBUSxTQUFTLElBQUksSUFBSSxDQUFDLGdCQUFpQixVQUFXLE1BQU0sSUFBSSxJQUFJLENBQUMsYUFBYyxJQUFLLE9BQU8sSUFBSSxJQUFJLENBQUMsY0FBZSxnQkFBaUIsYUFBYyxTQUFVLEtBQU0sRUFBRSxDQUFDLENBQUM7SUFDM0wsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7OztPQWNHO0lBQ0ksYUFBYSxDQUFDLGFBQXFCLEVBQUUsS0FBYSxFQUFFLFNBQWlCLEVBQUUsT0FBZ0IsRUFBRSxNQUFlLEVBQUUsU0FBa0I7UUFDakksT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQVEsU0FBUyxJQUFJLElBQUksQ0FBQyxnQkFBaUIsVUFBVyxNQUFNLElBQUksSUFBSSxDQUFDLGFBQWMsSUFBSyxPQUFPLElBQUksSUFBSSxDQUFDLGNBQWUsZ0JBQWlCLGFBQWMsU0FBVSxLQUFNLFlBQWEsU0FBVSxFQUFFLENBQUMsQ0FBQztJQUNsTixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7T0FhRztJQUNJLGVBQWUsQ0FBQyxNQUFjLEVBQUUsS0FBd0IsRUFBRSxRQUE0QjtRQUMzRixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsa0JBQW1CLE1BQU8sRUFBRSxFQUFFLEtBQUssRUFBRSxRQUFRLElBQUksWUFBWSxDQUFDLENBQUM7SUFDaEYsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7T0FZRztJQUNJLGdCQUFnQixDQUFDLE1BQWMsRUFBRSxLQUF3QixFQUFFLFFBQTRCO1FBQzVGLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxtQkFBb0IsTUFBTyxFQUFFLEVBQUUsS0FBSyxFQUFFLFFBQVEsSUFBSSxZQUFZLENBQUMsQ0FBQztJQUNqRixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7T0FhRztJQUNJLFlBQVksQ0FBQyxLQUF3QixFQUFFLFFBQTRCO1FBQ3hFLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLEVBQUUsS0FBSyxFQUFFLFFBQVEsSUFBSSxZQUFZLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQThCRztJQUNJLGdCQUFnQixDQUFDLEtBQXdCLEVBQUUsUUFBNEI7UUFDNUUsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLGdCQUFnQixFQUFFLEtBQUssRUFBRSxRQUFRLElBQUksWUFBWSxDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7O09BYUc7SUFDSSxpQkFBaUIsQ0FBQyxLQUF3QixFQUFFLFFBQTRCO1FBQzdFLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsRUFBRSxLQUFLLEVBQUUsUUFBUSxJQUFJLFlBQVksQ0FBQyxDQUFDO0lBQ3JFLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0E2Qkc7SUFDSSxnQkFBZ0IsQ0FBQyxLQUF3QixFQUFFLFFBQTRCO1FBQzVFLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsRUFBRSxLQUFLLEVBQUUsUUFBUSxJQUFJLFlBQVksQ0FBQyxDQUFDO0lBQ3BFLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7OztPQWFHO0lBQ0ksd0JBQXdCLENBQUMsS0FBd0IsRUFBRSxRQUE0QjtRQUNwRixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsd0JBQXdCLEVBQUUsS0FBSyxFQUFFLFFBQVEsSUFBSSxZQUFZLENBQUMsQ0FBQztJQUM1RSxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsWUFBWSxLQUFnQztRQUMxQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUEveEJSLGtCQUFhLEdBQUcsT0FBTyxDQUFDO1FBdWhCckIsb0JBQWUsR0FBb0I7WUFDM0MsS0FBSyxFQUFFO2dCQUNMLDRCQUE0QjtnQkFDNUIsdUJBQXVCO2dCQUN2QixxQkFBcUI7Z0JBQ3JCLHFCQUFxQjtnQkFDckIscUJBQXFCO2dCQUNyQixVQUFVO2dCQUNWLG1CQUFtQjtnQkFDbkIseUJBQXlCO2dCQUN6QixZQUFZO2dCQUNaLHlCQUF5QjtnQkFDekIsbUJBQW1CO2dCQUNuQixZQUFZO2dCQUNaLCtCQUErQjtnQkFDL0IsMEJBQTBCO2dCQUMxQix1QkFBdUI7Z0JBQ3ZCLGdCQUFnQjtnQkFDaEIseUNBQXlDO2dCQUN6QyxhQUFhO2dCQUNiLGlDQUFpQztnQkFDakMsa0JBQWtCO2dCQUNsQixpQkFBaUI7Z0JBQ2pCLG1CQUFtQjtnQkFDbkIsMkJBQTJCO2dCQUMzQixZQUFZO2dCQUNaLHVCQUF1QjtnQkFDdkIsbUJBQW1CO2dCQUNuQiwyQkFBMkI7YUFDNUI7WUFDRCxJQUFJLEVBQUU7Z0JBQ0oseUJBQXlCO2dCQUN6QixnQkFBZ0I7Z0JBQ2hCLFNBQVM7Z0JBQ1QsZ0JBQWdCO2dCQUNoQix3QkFBd0I7Z0JBQ3hCLHFCQUFxQjtnQkFDckIscUJBQXFCO2FBQ3RCO1lBQ0QsSUFBSSxFQUFFO2dCQUNKLGdCQUFnQjtnQkFDaEIsa0JBQWtCO2dCQUNsQixXQUFXO2FBQ1o7WUFDRCxPQUFPLEVBQUU7Z0JBQ1AsYUFBYTtnQkFDYixlQUFlO2FBQ2hCO1NBQ0YsQ0FBQztJQXlORixDQUFDO0NBQ0Y7QUFseUJELHNCQWt5QkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBY2Nlc3NMZXZlbExpc3QgfSBmcm9tICcuLi8uLi9zaGFyZWQvYWNjZXNzLWxldmVsJztcbmltcG9ydCB7IFBvbGljeVN0YXRlbWVudCwgT3BlcmF0b3IgfSBmcm9tICcuLi8uLi9zaGFyZWQnO1xuaW1wb3J0IHsgYXdzX2lhbSBhcyBpYW0gfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcblxuLyoqXG4gKiBTdGF0ZW1lbnQgcHJvdmlkZXIgZm9yIHNlcnZpY2UgW3FhcHBzXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc2VydmljZS1hdXRob3JpemF0aW9uL2xhdGVzdC9yZWZlcmVuY2UvbGlzdF9hbWF6b25xYnVzaW5lc3NxYXBwcy5odG1sKS5cbiAqXG4gKiBAcGFyYW0gc2lkIFtTSURdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9JQU0vbGF0ZXN0L1VzZXJHdWlkZS9yZWZlcmVuY2VfcG9saWNpZXNfZWxlbWVudHNfc2lkLmh0bWwpIG9mIHRoZSBzdGF0ZW1lbnRcbiAqL1xuZXhwb3J0IGNsYXNzIFFhcHBzIGV4dGVuZHMgUG9saWN5U3RhdGVtZW50IHtcbiAgcHVibGljIHNlcnZpY2VQcmVmaXggPSAncWFwcHMnO1xuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBhc3NvY2lhdGUgYSBsaWJyYXJ5IGl0ZW0gcmV2aWV3IGluIHRoZSBRIEJ1c2luZXNzIGFwcGxpY2F0aW9uIGVudmlyb25tZW50XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZVc2VySXNBcHBPd25lcigpXG4gICAqIC0gLmlmQXBwSXNQdWJsaXNoZWQoKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYW1hem9ucS9sYXRlc3QvYXBpLXJlZmVyZW5jZS9BUElfcWFwcHNfQXNzb2NpYXRlTGlicmFyeUl0ZW1SZXZpZXcuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQXNzb2NpYXRlTGlicmFyeUl0ZW1SZXZpZXcoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Fzc29jaWF0ZUxpYnJhcnlJdGVtUmV2aWV3Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gYXNzb2NpYXRlIFEgQXBwIHdpdGggYSB1c2VyIGluIHRoZSBRIEJ1c2luZXNzIGFwcGxpY2F0aW9uIGVudmlyb25tZW50XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZVc2VySXNBcHBPd25lcigpXG4gICAqIC0gLmlmQXBwSXNQdWJsaXNoZWQoKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYW1hem9ucS9sYXRlc3QvYXBpLXJlZmVyZW5jZS9BUElfcWFwcHNfQXNzb2NpYXRlUUFwcFdpdGhVc2VyLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Fzc29jaWF0ZVFBcHBXaXRoVXNlcigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQXNzb2NpYXRlUUFwcFdpdGhVc2VyJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY3JlYXRlIHRoZSBjYXRlZ29yaWVzIG9mIGEgbGlicmFyeSBpbiB0aGUgUSBCdXNpbmVzcyBhcHBsaWNhdGlvbiBlbnZpcm9ubWVudFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hbWF6b25xL2xhdGVzdC9hcGktcmVmZXJlbmNlL0FQSV9xYXBwc19CYXRjaENyZWF0ZUNhdGVnb3J5Lmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0JhdGNoQ3JlYXRlQ2F0ZWdvcnkoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0JhdGNoQ3JlYXRlQ2F0ZWdvcnknKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgdGhlIGNhdGVnb3JpZXMgb2YgYSBsaWJyYXJ5IGluIHRoZSBRIEJ1c2luZXNzIGFwcGxpY2F0aW9uIGVudmlyb25tZW50XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FtYXpvbnEvbGF0ZXN0L2FwaS1yZWZlcmVuY2UvQVBJX3FhcHBzX0JhdGNoRGVsZXRlQ2F0ZWdvcnkuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQmF0Y2hEZWxldGVDYXRlZ29yeSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQmF0Y2hEZWxldGVDYXRlZ29yeScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHVwZGF0ZSB0aGUgY2F0ZWdvcmllcyBvZiBhIGxpYnJhcnkgaW4gdGhlIFEgQnVzaW5lc3MgYXBwbGljYXRpb24gZW52aXJvbm1lbnRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYW1hem9ucS9sYXRlc3QvYXBpLXJlZmVyZW5jZS9BUElfcWFwcHNfQmF0Y2hVcGRhdGVDYXRlZ29yeS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9CYXRjaFVwZGF0ZUNhdGVnb3J5KCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdCYXRjaFVwZGF0ZUNhdGVnb3J5Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY29weSBRIEFwcCBpbiB0aGUgUSBCdXNpbmVzcyBhcHBsaWNhdGlvbiBlbnZpcm9ubWVudFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmVXNlcklzQXBwT3duZXIoKVxuICAgKiAtIC5pZkFwcElzUHVibGlzaGVkKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FtYXpvbnEvbGF0ZXN0L3FidXNpbmVzcy11Zy9wdXJwb3NlLWJ1aWx0LXFhcHBzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NvcHlRQXBwKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDb3B5UUFwcCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhIGxpYnJhcnkgaXRlbSBpbiB0aGUgUSBCdXNpbmVzcyBhcHBsaWNhdGlvbiBlbnZpcm9ubWVudFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmVXNlcklzQXBwT3duZXIoKVxuICAgKiAtIC5pZkFwcElzUHVibGlzaGVkKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FtYXpvbnEvbGF0ZXN0L2FwaS1yZWZlcmVuY2UvQVBJX3FhcHBzX0NyZWF0ZUxpYnJhcnlJdGVtLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZUxpYnJhcnlJdGVtKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVMaWJyYXJ5SXRlbScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhIGxpYnJhcnkgaXRlbSByZXZpZXcgaW4gdGhlIFEgQnVzaW5lc3MgYXBwbGljYXRpb24gZW52aXJvbm1lbnRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlVzZXJJc0FwcE93bmVyKClcbiAgICogLSAuaWZBcHBJc1B1Ymxpc2hlZCgpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hbWF6b25xL2xhdGVzdC9xYnVzaW5lc3MtdWcvcHVycG9zZS1idWlsdC1xYXBwcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVMaWJyYXJ5SXRlbVJldmlldygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlTGlicmFyeUl0ZW1SZXZpZXcnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjcmVhdGUgUSBBcHAgaW4gdGhlIFEgQnVzaW5lc3MgYXBwbGljYXRpb24gZW52aXJvbm1lbnRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZkF3c1JlcXVlc3RUYWcoKVxuICAgKiAtIC5pZkF3c1RhZ0tleXMoKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYW1hem9ucS9sYXRlc3QvYXBpLXJlZmVyZW5jZS9BUElfcWFwcHNfQ3JlYXRlUUFwcC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVRQXBwKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVRQXBwJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gc3Vic2NyaWJlIHRvIGEgUSBBcHAgZXZlbnQgYnVzIHRvcGljIGluIHRoZSBRIEJ1c2luZXNzIGFwcGxpY2F0aW9uIGVudmlyb25tZW50XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FtYXpvbnEvbGF0ZXN0L3FidXNpbmVzcy11Zy9wdXJwb3NlLWJ1aWx0LXFhcHBzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZVN1YnNjcmlwdGlvblRva2VuKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVTdWJzY3JpcHRpb25Ub2tlbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlbGV0ZSBhIGxpYnJhcnkgaXRlbSBpbiB0aGUgUSBCdXNpbmVzcyBhcHBsaWNhdGlvbiBlbnZpcm9ubWVudFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmVXNlcklzQXBwT3duZXIoKVxuICAgKiAtIC5pZkFwcElzUHVibGlzaGVkKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FtYXpvbnEvbGF0ZXN0L2FwaS1yZWZlcmVuY2UvQVBJX3FhcHBzX0RlbGV0ZUxpYnJhcnlJdGVtLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZUxpYnJhcnlJdGVtKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVMaWJyYXJ5SXRlbScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlbGV0ZSBRIEFwcCBpbiB0aGUgUSBCdXNpbmVzcyBhcHBsaWNhdGlvbiBlbnZpcm9ubWVudFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIFBvc3NpYmxlIGNvbmRpdGlvbnM6XG4gICAqIC0gLmlmVXNlcklzQXBwT3duZXIoKVxuICAgKiAtIC5pZkFwcElzUHVibGlzaGVkKClcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FtYXpvbnEvbGF0ZXN0L2FwaS1yZWZlcmVuY2UvQVBJX3FhcHBzX0RlbGV0ZVFBcHAuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlUUFwcCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlUUFwcCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdldCBRIEFwcCBzaGFyaW5nIHBlcm1pc3Npb25zIGluIHRoZSBRIEJ1c2luZXNzIGFwcGxpY2F0aW9uIGVudmlyb25tZW50XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlVzZXJJc0FwcE93bmVyKClcbiAgICogLSAuaWZBcHBJc1B1Ymxpc2hlZCgpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hbWF6b25xL2xhdGVzdC9hcGktcmVmZXJlbmNlL0FQSV9xYXBwc19EZXNjcmliZVFBcHBQZXJtaXNzaW9ucy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9EZXNjcmliZVFBcHBQZXJtaXNzaW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVzY3JpYmVRQXBwUGVybWlzc2lvbnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkaXNhc3NvY2lhdGUgYSBsaWJyYXJ5IGl0ZW0gcmV2aWV3IGluIHRoZSBRIEJ1c2luZXNzIGFwcGxpY2F0aW9uIGVudmlyb25tZW50XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZVc2VySXNBcHBPd25lcigpXG4gICAqIC0gLmlmQXBwSXNQdWJsaXNoZWQoKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYW1hem9ucS9sYXRlc3QvYXBpLXJlZmVyZW5jZS9BUElfcWFwcHNfRGlzYXNzb2NpYXRlTGlicmFyeUl0ZW1SZXZpZXcuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGlzYXNzb2NpYXRlTGlicmFyeUl0ZW1SZXZpZXcoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rpc2Fzc29jaWF0ZUxpYnJhcnlJdGVtUmV2aWV3Jyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGlzYXNzb2NpYXRlIFEgQXBwIHdpdGggYSB1c2VyIGluIHRoZSBRIEJ1c2luZXNzIGFwcGxpY2F0aW9uIGVudmlyb25tZW50XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZVc2VySXNBcHBPd25lcigpXG4gICAqIC0gLmlmQXBwSXNQdWJsaXNoZWQoKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYW1hem9ucS9sYXRlc3QvYXBpLXJlZmVyZW5jZS9BUElfcWFwcHNfRGlzYXNzb2NpYXRlUUFwcEZyb21Vc2VyLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rpc2Fzc29jaWF0ZVFBcHBGcm9tVXNlcigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGlzYXNzb2NpYXRlUUFwcEZyb21Vc2VyJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZXhwb3J0IFEgQXBwIHNlc3Npb24gZGF0YSBpbiB0aGUgUSBCdXNpbmVzcyBhcHBsaWNhdGlvbiBlbnZpcm9ubWVudFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hbWF6b25xL2xhdGVzdC9xYnVzaW5lc3MtdWcvcHVycG9zZS1idWlsdC1xYXBwcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9FeHBvcnRRQXBwU2Vzc2lvbkRhdGEoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0V4cG9ydFFBcHBTZXNzaW9uRGF0YScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGdldCBhIGxpYnJhcnkgaXRlbSBpbiB0aGUgUSBCdXNpbmVzcyBhcHBsaWNhdGlvbiBlbnZpcm9ubWVudFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZVc2VySXNBcHBPd25lcigpXG4gICAqIC0gLmlmQXBwSXNQdWJsaXNoZWQoKVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYW1hem9ucS9sYXRlc3QvYXBpLXJlZmVyZW5jZS9BUElfcWFwcHNfR2V0TGlicmFyeUl0ZW0uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvR2V0TGlicmFyeUl0ZW0oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldExpYnJhcnlJdGVtJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZ2V0IFEgQXBwIGluIHRoZSBRIEJ1c2luZXNzIGFwcGxpY2F0aW9uIGVudmlyb25tZW50XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBQb3NzaWJsZSBjb25kaXRpb25zOlxuICAgKiAtIC5pZlVzZXJJc0FwcE93bmVyKClcbiAgICogLSAuaWZBcHBJc1B1Ymxpc2hlZCgpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hbWF6b25xL2xhdGVzdC9hcGktcmVmZXJlbmNlL0FQSV9xYXBwc19HZXRRQXBwLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldFFBcHAoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldFFBcHAnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgUSBBcHAgc2Vzc2lvbiBpbiB0aGUgUSBCdXNpbmVzcyBhcHBsaWNhdGlvbiBlbnZpcm9ubWVudFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZVc2VySXNBcHBPd25lcigpXG4gICAqIC0gLmlmQXBwSXNQdWJsaXNoZWQoKVxuICAgKiAtIC5pZlVzZXJJc1Nlc3Npb25Nb2RlcmF0b3IoKVxuICAgKiAtIC5pZlNlc3Npb25Jc1NoYXJlZCgpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hbWF6b25xL2xhdGVzdC9hcGktcmVmZXJlbmNlL0FQSV9xYXBwc19HZXRRQXBwU2Vzc2lvbi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9HZXRRQXBwU2Vzc2lvbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0UUFwcFNlc3Npb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgUSBBcHAgc2Vzc2lvbiBtZXRhZGF0YSBpbiB0aGUgUSBCdXNpbmVzcyBhcHBsaWNhdGlvbiBlbnZpcm9ubWVudFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FtYXpvbnEvbGF0ZXN0L3FidXNpbmVzcy11Zy9wdXJwb3NlLWJ1aWx0LXFhcHBzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0dldFFBcHBTZXNzaW9uTWV0YWRhdGEoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldFFBcHBTZXNzaW9uTWV0YWRhdGEnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBpbXBvcnQgYSBkb2N1bWVudCB0byBRIEFwcCBvciBRIEFwcCBTZXNzaW9uIGluIHRoZSBRIEJ1c2luZXNzIGFwcGxpY2F0aW9uIGVudmlyb25tZW50XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogUG9zc2libGUgY29uZGl0aW9uczpcbiAgICogLSAuaWZVc2VySXNBcHBPd25lcigpXG4gICAqIC0gLmlmQXBwSXNQdWJsaXNoZWQoKVxuICAgKiAtIC5pZlVzZXJJc1Nlc3Npb25Nb2RlcmF0b3IoKVxuICAgKiAtIC5pZlNlc3Npb25Jc1NoYXJlZCgpXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hbWF6b25xL2xhdGVzdC9hcGktcmVmZXJlbmNlL0FQSV9xYXBwc19JbXBvcnREb2N1bWVudC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9JbXBvcnREb2N1bWVudCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnSW1wb3J0RG9jdW1lbnQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0IGNhdGVnb3JpZXMgaW4gdGhlIFEgQnVzaW5lc3MgYXBwbGljYXRpb24gZW52aXJvbm1lbnRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hbWF6b25xL2xhdGVzdC9hcGktcmVmZXJlbmNlL0FQSV9xYXBwc19MaXN0Q2F0ZWdvcmllcy5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0Q2F0ZWdvcmllcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdENhdGVnb3JpZXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0IGxpYnJhcnkgaXRlbXMgaW4gdGhlIFEgQnVzaW5lc3MgYXBwbGljYXRpb24gZW52aXJvbm1lbnRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hbWF6b25xL2xhdGVzdC9hcGktcmVmZXJlbmNlL0FQSV9xYXBwc19MaXN0TGlicmFyeUl0ZW1zLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RMaWJyYXJ5SXRlbXMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RMaWJyYXJ5SXRlbXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgUSBBcHAgc2Vzc2lvbiBkYXRhIGluIHRoZSBRIEJ1c2luZXNzIGFwcGxpY2F0aW9uIGVudmlyb25tZW50XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYW1hem9ucS9sYXRlc3QvcWJ1c2luZXNzLXVnL3B1cnBvc2UtYnVpbHQtcWFwcHMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvTGlzdFFBcHBTZXNzaW9uRGF0YSgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdFFBcHBTZXNzaW9uRGF0YScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgUSBBcHBzIGluIHRoZSBRIEJ1c2luZXNzIGFwcGxpY2F0aW9uIGVudmlyb25tZW50XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYW1hem9ucS9sYXRlc3QvYXBpLXJlZmVyZW5jZS9BUElfcWFwcHNfTGlzdFFBcHBzLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RRQXBwcygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdFFBcHBzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gbGlzdCB0YWdzIGZvciBhIHJlc291cmNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYW1hem9ucS9sYXRlc3QvYXBpLXJlZmVyZW5jZS9BUElfTGlzdFRhZ3NGb3JSZXNvdXJjZS5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0VGFnc0ZvclJlc291cmNlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0VGFnc0ZvclJlc291cmNlJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcHJlZGljdCBwcm9ibGVtIHN0YXRlbWVudCBmcm9tIGNvbnZlcnNhdGlvbiBsb2cgaW4gdGhlIFEgQnVzaW5lc3MgYXBwbGljYXRpb24gZW52aXJvbm1lbnRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYW1hem9ucS9sYXRlc3QvcWJ1c2luZXNzLXVnL3B1cnBvc2UtYnVpbHQtcWFwcHMuaHRtbFxuICAgKi9cbiAgcHVibGljIHRvUHJlZGljdFByb2JsZW1TdGF0ZW1lbnRGcm9tQ29udmVyc2F0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdQcmVkaWN0UHJvYmxlbVN0YXRlbWVudEZyb21Db252ZXJzYXRpb24nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBwcmVkaWN0IFEgQXBwIGZyb20gY29udmVyc2F0aW9uIGxvZyBvciBwcm9ibGVtIHN0YXRlbWVudCBpbiB0aGUgUSBCdXNpbmVzcyBhcHBsaWNhdGlvbiBlbnZpcm9ubWVudFxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hbWF6b25xL2xhdGVzdC9hcGktcmVmZXJlbmNlL0FQSV9xYXBwc19QcmVkaWN0UUFwcC5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9QcmVkaWN0UUFwcCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnUHJlZGljdFFBcHAnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBwcmVkaWN0IFEgQXBwIG1ldGFkYXR