UNPKG

cdk-iam-floyd

Version:

AWS IAM policy statement generator with fluent interface for AWS CDK

618 lines 60.1 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Lakeformation = void 0; const shared_1 = require("../../shared"); /** * Statement provider for service [lakeformation](https://docs.aws.amazon.com/service-authorization/latest/reference/list_awslakeformation.html). * * @param sid [SID](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_sid.html) of the statement */ class Lakeformation extends shared_1.PolicyStatement { /** * Grants permission to attach Lake Formation tags to catalog resources * * Access Level: Tagging * * https://docs.aws.amazon.com/lake-formation/latest/dg/aws-lake-formation-api-tagging-api.html#aws-lake-formation-api-tagging-api-AddLFTagsToResource */ toAddLFTagsToResource() { return this.to('AddLFTagsToResource'); } /** * Grants permission to data lake permissions to one or more principals in a batch * * Access Level: Permissions management * * https://docs.aws.amazon.com/lake-formation/latest/dg/aws-lake-formation-api-tagging-api.html#aws-lake-formation-api-tagging-api-BatchGrantPermissions */ toBatchGrantPermissions() { return this.to('BatchGrantPermissions'); } /** * Grants permission to revoke data lake permissions from one or more principals in a batch * * Access Level: Permissions management * * https://docs.aws.amazon.com/lake-formation/latest/dg/aws-lake-formation-api-tagging-api.html#aws-lake-formation-api-tagging-api-BatchRevokePermissions */ toBatchRevokePermissions() { return this.to('BatchRevokePermissions'); } /** * Grants permission to cancel the given transaction * * Access Level: Write * * https://docs.aws.amazon.com/lake-formation/latest/dg/aws-lake-formation-api-transactions-api.html#aws-lake-formation-api-transactions-api-CancelTransaction */ toCancelTransaction() { return this.to('CancelTransaction'); } /** * Grants permission to commit the given transaction * * Access Level: Write * * https://docs.aws.amazon.com/lake-formation/latest/dg/aws-lake-formation-api-transactions-api.html#aws-lake-formation-api-transactions-api-CommitTransaction */ toCommitTransaction() { return this.to('CommitTransaction'); } /** * Grants permission to create a Lake Formation data cell filter * * Access Level: Write * * https://docs.aws.amazon.com/lake-formation/latest/dg/aws-lake-formation-api-data-filter.html#aws-lake-formation-api-data-filter-CreateDataCellsFilter */ toCreateDataCellsFilter() { return this.to('CreateDataCellsFilter'); } /** * Grants permission to create a Lake Formation tag * * Access Level: Write * * https://docs.aws.amazon.com/lake-formation/latest/dg/aws-lake-formation-api-tagging-api.html#aws-lake-formation-api-tagging-api-CreateLFTag */ toCreateLFTag() { return this.to('CreateLFTag'); } /** * Grants permission to create an IAM Identity Center connection with Lake Formation to allow IAM Identity Center users and groups to access Data Catalog resources * * Access Level: Write * * https://docs.aws.amazon.com/lake-formation/latest/dg/aws-lake-formation-api-Identity-center-integ.html#API_CreateLakeFormationIdentityCenterConfiguration.html */ toCreateLakeFormationIdentityCenterConfiguration() { return this.to('CreateLakeFormationIdentityCenterConfiguration'); } /** * Enforce Lake Formation permissions for the given databases, tables, and principals * * Access Level: Write * * https://docs.aws.amazon.com/lake-formation/latest/dg/aws-lake-formation-api-hybrid-access-mode.html#API_CreateLakeFormationOptIn.html */ toCreateLakeFormationOptIn() { return this.to('CreateLakeFormationOptIn'); } /** * Grants permission to delete a Lake Formation data cell filter * * Access Level: Write * * https://docs.aws.amazon.com/lake-formation/latest/dg/aws-lake-formation-api-data-filter.html#aws-lake-formation-api-data-filter-DeleteDataCellsFilter */ toDeleteDataCellsFilter() { return this.to('DeleteDataCellsFilter'); } /** * Grants permission to delete a Lake Formation tag * * Access Level: Write * * https://docs.aws.amazon.com/lake-formation/latest/dg/aws-lake-formation-api-tagging-api.html#aws-lake-formation-api-tagging-api-DeleteLFTag */ toDeleteLFTag() { return this.to('DeleteLFTag'); } /** * Grants permission to delete an IAM Identity Center connection with Lake Formation * * Access Level: Write * * https://docs.aws.amazon.com/lake-formation/latest/dg/aws-lake-formation-api-Identity-center-integ.html#API_DeleteLakeFormationIdentityCenterConfiguration.html */ toDeleteLakeFormationIdentityCenterConfiguration() { return this.to('DeleteLakeFormationIdentityCenterConfiguration'); } /** * Remove the Lake Formation permissions enforcement of the given databases, tables, and principals * * Access Level: Write * * https://docs.aws.amazon.com/lake-formation/latest/dg/aws-lake-formation-api-hybrid-access-mode.html#API_DeleteLakeFormationOptIn.html */ toDeleteLakeFormationOptIn() { return this.to('DeleteLakeFormationOptIn'); } /** * Grants permission to delete the specified objects if the transaction is canceled * * Access Level: Write * * https://docs.aws.amazon.com/lake-formation/latest/dg/aws-lake-formation-api-transactions-api.html#aws-lake-formation-api-transactions-api-DeleteObjectsOnCancel */ toDeleteObjectsOnCancel() { return this.to('DeleteObjectsOnCancel'); } /** * Grants permission to deregister a registered location * * Access Level: Write * * https://docs.aws.amazon.com/lake-formation/latest/dg/aws-lake-formation-api-tagging-api.html#aws-lake-formation-api-tagging-api-DeregisterResource */ toDeregisterResource() { return this.to('DeregisterResource'); } /** * Grants permission to describe the IAM Identity Center connection with Lake Formation * * Access Level: Read * * https://docs.aws.amazon.com/lake-formation/latest/dg/aws-lake-formation-api-Identity-center-integ.html#API_DescribeLakeFormationIdentityCenterConfiguration.html */ toDescribeLakeFormationIdentityCenterConfiguration() { return this.to('DescribeLakeFormationIdentityCenterConfiguration'); } /** * Grants permission to describe a registered location * * Access Level: Read * * https://docs.aws.amazon.com/lake-formation/latest/dg/aws-lake-formation-api-tagging-api.html#aws-lake-formation-api-tagging-api-DescribeResource */ toDescribeResource() { return this.to('DescribeResource'); } /** * Grants permission to get status of the given transaction * * Access Level: Read * * https://docs.aws.amazon.com/lake-formation/latest/dg/aws-lake-formation-api-transactions-api.html#aws-lake-formation-api-transactions-api-DescribeTransaction */ toDescribeTransaction() { return this.to('DescribeTransaction'); } /** * Grants permission to extend the timeout of the given transaction * * Access Level: Write * * https://docs.aws.amazon.com/lake-formation/latest/dg/aws-lake-formation-api-transactions-api.html#aws-lake-formation-api-transactions-api-ExtendTransaction */ toExtendTransaction() { return this.to('ExtendTransaction'); } /** * Grants permission to virtual data lake access * * Access Level: Write * * https://docs.aws.amazon.com/lake-formation/latest/dg/aws-lake-formation-api-tagging-api.html#aws-lake-formation-api-tagging-api-GetDataAccess */ toGetDataAccess() { return this.to('GetDataAccess'); } /** * Grants permission to retrieve a Lake Formation data cell filter * * Access Level: Read * * https://docs.aws.amazon.com/lake-formation/latest/dg/aws-lake-formation-api-data-filter.html#aws-lake-formation-api-data-filter-GetDataCellsFilter */ toGetDataCellsFilter() { return this.to('GetDataCellsFilter'); } /** * Grants permission to retrieve data lake settings such as the list of data lake administrators and database and table default permissions * * Access Level: Read * * https://docs.aws.amazon.com/lake-formation/latest/dg/aws-lake-formation-api-tagging-api.html#aws-lake-formation-api-tagging-api-GetDataLakeSettings */ toGetDataLakeSettings() { return this.to('GetDataLakeSettings'); } /** * Grants permission to retrieve permissions attached to resources in the given path * * Access Level: Read * * https://docs.aws.amazon.com/lake-formation/latest/dg/aws-lake-formation-api-tagging-api.html#aws-lake-formation-api-tagging-api-GetEffectivePermissionsForPath */ toGetEffectivePermissionsForPath() { return this.to('GetEffectivePermissionsForPath'); } /** * Grants permission to retrieve a Lake Formation tag * * Access Level: Read * * https://docs.aws.amazon.com/lake-formation/latest/dg/aws-lake-formation-api-tagging-api.html#aws-lake-formation-api-tagging-api-GetLFTag */ toGetLFTag() { return this.to('GetLFTag'); } /** * Grants permission to retrieve the state of the given query * * Access Level: Read * * Dependent actions: * - lakeformation:StartQueryPlanning * * https://docs.aws.amazon.com/lake-formation/latest/dg/aws-lake-formation-api-querying.html#aws-lake-formation-api-querying-GetQueryState */ toGetQueryState() { return this.to('GetQueryState'); } /** * Grants permission to retrieve the statistics for the given query * * Access Level: Read * * Dependent actions: * - lakeformation:StartQueryPlanning * * https://docs.aws.amazon.com/lake-formation/latest/dg/aws-lake-formation-api-querying.html#aws-lake-formation-api-querying-GetQueryStatistics */ toGetQueryStatistics() { return this.to('GetQueryStatistics'); } /** * Grants permission to retrieve lakeformation tags on a catalog resource * * Access Level: Read * * https://docs.aws.amazon.com/lake-formation/latest/dg/aws-lake-formation-api-tagging-api.html#aws-lake-formation-api-tagging-api-GetResourceLFTags */ toGetResourceLFTags() { return this.to('GetResourceLFTags'); } /** * Grants permission to retrieve objects from a table * * Access Level: Read * * https://docs.aws.amazon.com/lake-formation/latest/dg/aws-lake-formation-api-objects.html#aws-lake-formation-api-objects-GetTableObjects */ toGetTableObjects() { return this.to('GetTableObjects'); } /** * Grants permission to retrieve the results for the given work units * * Access Level: Read * * Dependent actions: * - lakeformation:GetWorkUnits * - lakeformation:StartQueryPlanning * * https://docs.aws.amazon.com/lake-formation/latest/dg/aws-lake-formation-api-querying.html#aws-lake-formation-api-querying-GetWorkUnitResults */ toGetWorkUnitResults() { return this.to('GetWorkUnitResults'); } /** * Grants permission to retrieve the work units for the given query * * Access Level: Read * * Dependent actions: * - lakeformation:StartQueryPlanning * * https://docs.aws.amazon.com/lake-formation/latest/dg/aws-lake-formation-api-querying.html#aws-lake-formation-api-querying-GetWorkUnits */ toGetWorkUnits() { return this.to('GetWorkUnits'); } /** * Grants permission to data lake permissions to a principal * * Access Level: Permissions management * * https://docs.aws.amazon.com/lake-formation/latest/dg/aws-lake-formation-api-tagging-api.html#aws-lake-formation-api-tagging-api-GrantPermissions */ toGrantPermissions() { return this.to('GrantPermissions'); } /** * Grants permission to list cell filters * * Access Level: List * * https://docs.aws.amazon.com/lake-formation/latest/dg/aws-lake-formation-api-data-filter.html#aws-lake-formation-api-data-filter-ListDataCellsFilter */ toListDataCellsFilter() { return this.to('ListDataCellsFilter'); } /** * Grants permission to list Lake Formation tags * * Access Level: Read * * https://docs.aws.amazon.com/lake-formation/latest/dg/aws-lake-formation-api-tagging-api.html#aws-lake-formation-api-tagging-api-ListLFTags */ toListLFTags() { return this.to('ListLFTags'); } /** * Retrieve the current list of resources and principals that are opt in to enforce Lake Formation permissions * * Access Level: List * * https://docs.aws.amazon.com/lake-formation/latest/dg/aws-lake-formation-api-hybrid-access-mode.html#API_ListLakeFormationOptIns.html */ toListLakeFormationOptIns() { return this.to('ListLakeFormationOptIns'); } /** * Grants permission to list permissions filtered by principal or resource * * Access Level: List * * https://docs.aws.amazon.com/lake-formation/latest/dg/aws-lake-formation-api-tagging-api.html#aws-lake-formation-api-tagging-api-ListPermissions */ toListPermissions() { return this.to('ListPermissions'); } /** * Grants permission to List registered locations * * Access Level: List * * https://docs.aws.amazon.com/lake-formation/latest/dg/aws-lake-formation-api-tagging-api.html#aws-lake-formation-api-tagging-api-ListResources */ toListResources() { return this.to('ListResources'); } /** * Grants permission to list all the storage optimizers for the Governed table * * Access Level: List * * https://docs.aws.amazon.com/lake-formation/latest/dg/aws-lake-formation-api-optimizers.html#aws-lake-formation-api-optimizers-ListTableStorageOptimizers */ toListTableStorageOptimizers() { return this.to('ListTableStorageOptimizers'); } /** * Grants permission to list all transactions in the system * * Access Level: List * * https://docs.aws.amazon.com/lake-formation/latest/dg/aws-lake-formation-api-transactions-api.html#aws-lake-formation-api-transactions-api-ListTransactions */ toListTransactions() { return this.to('ListTransactions'); } /** * Grants permission to overwrite data lake settings such as the list of data lake administrators and database and table default permissions * * Access Level: Permissions management * * https://docs.aws.amazon.com/lake-formation/latest/dg/aws-lake-formation-api-tagging-api.html#aws-lake-formation-api-tagging-api-PutDataLakeSettings */ toPutDataLakeSettings() { return this.to('PutDataLakeSettings'); } /** * Grants permission to register a new location to be managed by Lake Formation * * Access Level: Write * * https://docs.aws.amazon.com/lake-formation/latest/dg/aws-lake-formation-api-tagging-api.html#aws-lake-formation-api-tagging-api-RegisterResource */ toRegisterResource() { return this.to('RegisterResource'); } /** * Grants permission to remove lakeformation tags from catalog resources * * Access Level: Tagging * * https://docs.aws.amazon.com/lake-formation/latest/dg/aws-lake-formation-api-tagging-api.html#aws-lake-formation-api-tagging-api-RemoveLFTagsFromResource */ toRemoveLFTagsFromResource() { return this.to('RemoveLFTagsFromResource'); } /** * Grants permission to revoke data lake permissions from a principal * * Access Level: Permissions management * * https://docs.aws.amazon.com/lake-formation/latest/dg/aws-lake-formation-api-tagging-api.html#aws-lake-formation-api-tagging-api-RevokePermissions */ toRevokePermissions() { return this.to('RevokePermissions'); } /** * Grants permission to list catalog databases with Lake Formation tags * * Access Level: Read * * https://docs.aws.amazon.com/lake-formation/latest/dg/aws-lake-formation-api-tagging-api.html#aws-lake-formation-api-tagging-api-SearchDatabasesByLFTags */ toSearchDatabasesByLFTags() { return this.to('SearchDatabasesByLFTags'); } /** * Grants permission to list catalog tables with Lake Formation tags * * Access Level: Read * * https://docs.aws.amazon.com/lake-formation/latest/dg/aws-lake-formation-api-tagging-api.html#aws-lake-formation-api-tagging-api-SearchTablesByLFTags */ toSearchTablesByLFTags() { return this.to('SearchTablesByLFTags'); } /** * Grants permission to initiate the planning of the given query * * Access Level: Write * * https://docs.aws.amazon.com/lake-formation/latest/dg/aws-lake-formation-api-querying.html#aws-lake-formation-api-querying-StartQueryPlanning */ toStartQueryPlanning() { return this.to('StartQueryPlanning'); } /** * Grants permission to start a new transaction * * Access Level: Write * * https://docs.aws.amazon.com/lake-formation/latest/dg/aws-lake-formation-api-transactions-api.html#aws-lake-formation-api-transactions-api-StartTransaction */ toStartTransaction() { return this.to('StartTransaction'); } /** * Grants permission to update a Lake Formation data cell filter * * Access Level: Write * * https://docs.aws.amazon.com/lake-formation/latest/dg/aws-lake-formation-api-data-filter.html#aws-lake-formation-api-data-filter-UpdateDataCellsFilter */ toUpdateDataCellsFilter() { return this.to('UpdateDataCellsFilter'); } /** * Grants permission to update a Lake Formation tag * * Access Level: Write * * https://docs.aws.amazon.com/lake-formation/latest/dg/aws-lake-formation-api-tagging-api.html#aws-lake-formation-api-tagging-api-UpdateLFTag */ toUpdateLFTag() { return this.to('UpdateLFTag'); } /** * Grants permission to update the IAM Identity Center connection parameters * * Access Level: Write * * https://docs.aws.amazon.com/lake-formation/latest/dg/aws-lake-formation-api-Identity-center-integ.html#API_UpdateLakeFormationIdentityCenterConfiguration.html */ toUpdateLakeFormationIdentityCenterConfiguration() { return this.to('UpdateLakeFormationIdentityCenterConfiguration'); } /** * Grants permission to update a registered location * * Access Level: Write * * https://docs.aws.amazon.com/lake-formation/latest/dg/aws-lake-formation-api-tagging-api.html#aws-lake-formation-api-tagging-api-UpdateResource */ toUpdateResource() { return this.to('UpdateResource'); } /** * Grants permission to add or delete the specified objects to or from a table * * Access Level: Write * * https://docs.aws.amazon.com/lake-formation/latest/dg/aws-lake-formation-api-objects.html#aws-lake-formation-api-objects-UpdateTableObjects */ toUpdateTableObjects() { return this.to('UpdateTableObjects'); } /** * Grants permission to update the configuration of the storage optimizer for the Governed table * * Access Level: Write * * https://docs.aws.amazon.com/lake-formation/latest/dg/aws-lake-formation-api-optimizers.html#aws-lake-formation-api-optimizers-UpdateTableStorageOptimizer */ toUpdateTableStorageOptimizer() { return this.to('UpdateTableStorageOptimizer'); } /** * Statement provider for service [lakeformation](https://docs.aws.amazon.com/service-authorization/latest/reference/list_awslakeformation.html). * */ constructor(props) { super(props); this.servicePrefix = 'lakeformation'; this.accessLevelList = { Tagging: [ 'AddLFTagsToResource', 'RemoveLFTagsFromResource' ], 'Permissions management': [ 'BatchGrantPermissions', 'BatchRevokePermissions', 'GrantPermissions', 'PutDataLakeSettings', 'RevokePermissions' ], Write: [ 'CancelTransaction', 'CommitTransaction', 'CreateDataCellsFilter', 'CreateLFTag', 'CreateLakeFormationIdentityCenterConfiguration', 'CreateLakeFormationOptIn', 'DeleteDataCellsFilter', 'DeleteLFTag', 'DeleteLakeFormationIdentityCenterConfiguration', 'DeleteLakeFormationOptIn', 'DeleteObjectsOnCancel', 'DeregisterResource', 'ExtendTransaction', 'GetDataAccess', 'RegisterResource', 'StartQueryPlanning', 'StartTransaction', 'UpdateDataCellsFilter', 'UpdateLFTag', 'UpdateLakeFormationIdentityCenterConfiguration', 'UpdateResource', 'UpdateTableObjects', 'UpdateTableStorageOptimizer' ], Read: [ 'DescribeLakeFormationIdentityCenterConfiguration', 'DescribeResource', 'DescribeTransaction', 'GetDataCellsFilter', 'GetDataLakeSettings', 'GetEffectivePermissionsForPath', 'GetLFTag', 'GetQueryState', 'GetQueryStatistics', 'GetResourceLFTags', 'GetTableObjects', 'GetWorkUnitResults', 'GetWorkUnits', 'ListLFTags', 'SearchDatabasesByLFTags', 'SearchTablesByLFTags' ], List: [ 'ListDataCellsFilter', 'ListLakeFormationOptIns', 'ListPermissions', 'ListResources', 'ListTableStorageOptimizers', 'ListTransactions' ] }; } } exports.Lakeformation = Lakeformation; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGFrZWZvcm1hdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImxha2Vmb3JtYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EseUNBQStDO0FBRy9DOzs7O0dBSUc7QUFDSCxNQUFhLGFBQWMsU0FBUSx3QkFBZTtJQUdoRDs7Ozs7O09BTUc7SUFDSSxxQkFBcUI7UUFDMUIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLHFCQUFxQixDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLHVCQUF1QjtRQUM1QixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsdUJBQXVCLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksd0JBQXdCO1FBQzdCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxtQkFBbUI7UUFDeEIsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLG1CQUFtQjtRQUN4QixPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksdUJBQXVCO1FBQzVCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxhQUFhO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksZ0RBQWdEO1FBQ3JELE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxnREFBZ0QsQ0FBQyxDQUFDO0lBQ25FLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSwwQkFBMEI7UUFDL0IsT0FBTyxJQUFJLENBQUMsRUFB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QUF5QjtnQkFDekIsc0JBQXNCO2FBQ3ZCO1lBQ0QsSUFBSSxFQUFFO2dCQUNKLHFCQUFxQjtnQkFDckIseUJBQXlCO2dCQUN6QixpQkFBaUI7Z0JBQ2pCLGVBQWU7Z0JBQ2YsNEJBQTRCO2dCQUM1QixrQkFBa0I7YUFDbkI7U0FDRixDQUFDO0lBUUYsQ0FBQztDQUNGO0FBcHBCRCxzQ0FvcEJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWNjZXNzTGV2ZWxMaXN0IH0gZnJvbSAnLi4vLi4vc2hhcmVkL2FjY2Vzcy1sZXZlbCc7XG5pbXBvcnQgeyBQb2xpY3lTdGF0ZW1lbnQgfSBmcm9tICcuLi8uLi9zaGFyZWQnO1xuaW1wb3J0IHsgYXdzX2lhbSBhcyBpYW0gfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcblxuLyoqXG4gKiBTdGF0ZW1lbnQgcHJvdmlkZXIgZm9yIHNlcnZpY2UgW2xha2Vmb3JtYXRpb25dKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9zZXJ2aWNlLWF1dGhvcml6YXRpb24vbGF0ZXN0L3JlZmVyZW5jZS9saXN0X2F3c2xha2Vmb3JtYXRpb24uaHRtbCkuXG4gKlxuICogQHBhcmFtIHNpZCBbU0lEXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vSUFNL2xhdGVzdC9Vc2VyR3VpZGUvcmVmZXJlbmNlX3BvbGljaWVzX2VsZW1lbnRzX3NpZC5odG1sKSBvZiB0aGUgc3RhdGVtZW50XG4gKi9cbmV4cG9ydCBjbGFzcyBMYWtlZm9ybWF0aW9uIGV4dGVuZHMgUG9saWN5U3RhdGVtZW50IHtcbiAgcHVibGljIHNlcnZpY2VQcmVmaXggPSAnbGFrZWZvcm1hdGlvbic7XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGF0dGFjaCBMYWtlIEZvcm1hdGlvbiB0YWdzIHRvIGNhdGFsb2cgcmVzb3VyY2VzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogVGFnZ2luZ1xuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGFrZS1mb3JtYXRpb24vbGF0ZXN0L2RnL2F3cy1sYWtlLWZvcm1hdGlvbi1hcGktdGFnZ2luZy1hcGkuaHRtbCNhd3MtbGFrZS1mb3JtYXRpb24tYXBpLXRhZ2dpbmctYXBpLUFkZExGVGFnc1RvUmVzb3VyY2VcbiAgICovXG4gIHB1YmxpYyB0b0FkZExGVGFnc1RvUmVzb3VyY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0FkZExGVGFnc1RvUmVzb3VyY2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkYXRhIGxha2UgcGVybWlzc2lvbnMgdG8gb25lIG9yIG1vcmUgcHJpbmNpcGFscyBpbiBhIGJhdGNoXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUGVybWlzc2lvbnMgbWFuYWdlbWVudFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGFrZS1mb3JtYXRpb24vbGF0ZXN0L2RnL2F3cy1sYWtlLWZvcm1hdGlvbi1hcGktdGFnZ2luZy1hcGkuaHRtbCNhd3MtbGFrZS1mb3JtYXRpb24tYXBpLXRhZ2dpbmctYXBpLUJhdGNoR3JhbnRQZXJtaXNzaW9uc1xuICAgKi9cbiAgcHVibGljIHRvQmF0Y2hHcmFudFBlcm1pc3Npb25zKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdCYXRjaEdyYW50UGVybWlzc2lvbnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXZva2UgZGF0YSBsYWtlIHBlcm1pc3Npb25zIGZyb20gb25lIG9yIG1vcmUgcHJpbmNpcGFscyBpbiBhIGJhdGNoXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUGVybWlzc2lvbnMgbWFuYWdlbWVudFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGFrZS1mb3JtYXRpb24vbGF0ZXN0L2RnL2F3cy1sYWtlLWZvcm1hdGlvbi1hcGktdGFnZ2luZy1hcGkuaHRtbCNhd3MtbGFrZS1mb3JtYXRpb24tYXBpLXRhZ2dpbmctYXBpLUJhdGNoUmV2b2tlUGVybWlzc2lvbnNcbiAgICovXG4gIHB1YmxpYyB0b0JhdGNoUmV2b2tlUGVybWlzc2lvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0JhdGNoUmV2b2tlUGVybWlzc2lvbnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBjYW5jZWwgdGhlIGdpdmVuIHRyYW5zYWN0aW9uXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2xha2UtZm9ybWF0aW9uL2xhdGVzdC9kZy9hd3MtbGFrZS1mb3JtYXRpb24tYXBpLXRyYW5zYWN0aW9ucy1hcGkuaHRtbCNhd3MtbGFrZS1mb3JtYXRpb24tYXBpLXRyYW5zYWN0aW9ucy1hcGktQ2FuY2VsVHJhbnNhY3Rpb25cbiAgICovXG4gIHB1YmxpYyB0b0NhbmNlbFRyYW5zYWN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDYW5jZWxUcmFuc2FjdGlvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNvbW1pdCB0aGUgZ2l2ZW4gdHJhbnNhY3Rpb25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGFrZS1mb3JtYXRpb24vbGF0ZXN0L2RnL2F3cy1sYWtlLWZvcm1hdGlvbi1hcGktdHJhbnNhY3Rpb25zLWFwaS5odG1sI2F3cy1sYWtlLWZvcm1hdGlvbi1hcGktdHJhbnNhY3Rpb25zLWFwaS1Db21taXRUcmFuc2FjdGlvblxuICAgKi9cbiAgcHVibGljIHRvQ29tbWl0VHJhbnNhY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NvbW1pdFRyYW5zYWN0aW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gY3JlYXRlIGEgTGFrZSBGb3JtYXRpb24gZGF0YSBjZWxsIGZpbHRlclxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9sYWtlLWZvcm1hdGlvbi9sYXRlc3QvZGcvYXdzLWxha2UtZm9ybWF0aW9uLWFwaS1kYXRhLWZpbHRlci5odG1sI2F3cy1sYWtlLWZvcm1hdGlvbi1hcGktZGF0YS1maWx0ZXItQ3JlYXRlRGF0YUNlbGxzRmlsdGVyXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVEYXRhQ2VsbHNGaWx0ZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZURhdGFDZWxsc0ZpbHRlcicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhIExha2UgRm9ybWF0aW9uIHRhZ1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9sYWtlLWZvcm1hdGlvbi9sYXRlc3QvZGcvYXdzLWxha2UtZm9ybWF0aW9uLWFwaS10YWdnaW5nLWFwaS5odG1sI2F3cy1sYWtlLWZvcm1hdGlvbi1hcGktdGFnZ2luZy1hcGktQ3JlYXRlTEZUYWdcbiAgICovXG4gIHB1YmxpYyB0b0NyZWF0ZUxGVGFnKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdDcmVhdGVMRlRhZycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSBhbiBJQU0gSWRlbnRpdHkgQ2VudGVyIGNvbm5lY3Rpb24gd2l0aCBMYWtlIEZvcm1hdGlvbiB0byBhbGxvdyBJQU0gSWRlbnRpdHkgQ2VudGVyIHVzZXJzIGFuZCBncm91cHMgdG8gYWNjZXNzIERhdGEgQ2F0YWxvZyByZXNvdXJjZXNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGFrZS1mb3JtYXRpb24vbGF0ZXN0L2RnL2F3cy1sYWtlLWZvcm1hdGlvbi1hcGktSWRlbnRpdHktY2VudGVyLWludGVnLmh0bWwjQVBJX0NyZWF0ZUxha2VGb3JtYXRpb25JZGVudGl0eUNlbnRlckNvbmZpZ3VyYXRpb24uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvQ3JlYXRlTGFrZUZvcm1hdGlvbklkZW50aXR5Q2VudGVyQ29uZmlndXJhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnQ3JlYXRlTGFrZUZvcm1hdGlvbklkZW50aXR5Q2VudGVyQ29uZmlndXJhdGlvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuZm9yY2UgTGFrZSBGb3JtYXRpb24gcGVybWlzc2lvbnMgZm9yIHRoZSBnaXZlbiBkYXRhYmFzZXMsIHRhYmxlcywgYW5kIHByaW5jaXBhbHNcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGFrZS1mb3JtYXRpb24vbGF0ZXN0L2RnL2F3cy1sYWtlLWZvcm1hdGlvbi1hcGktaHlicmlkLWFjY2Vzcy1tb2RlLmh0bWwjQVBJX0NyZWF0ZUxha2VGb3JtYXRpb25PcHRJbi5odG1sXG4gICAqL1xuICBwdWJsaWMgdG9DcmVhdGVMYWtlRm9ybWF0aW9uT3B0SW4oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0NyZWF0ZUxha2VGb3JtYXRpb25PcHRJbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGRlbGV0ZSBhIExha2UgRm9ybWF0aW9uIGRhdGEgY2VsbCBmaWx0ZXJcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGFrZS1mb3JtYXRpb24vbGF0ZXN0L2RnL2F3cy1sYWtlLWZvcm1hdGlvbi1hcGktZGF0YS1maWx0ZXIuaHRtbCNhd3MtbGFrZS1mb3JtYXRpb24tYXBpLWRhdGEtZmlsdGVyLURlbGV0ZURhdGFDZWxsc0ZpbHRlclxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlRGF0YUNlbGxzRmlsdGVyKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZWxldGVEYXRhQ2VsbHNGaWx0ZXInKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgYSBMYWtlIEZvcm1hdGlvbiB0YWdcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGFrZS1mb3JtYXRpb24vbGF0ZXN0L2RnL2F3cy1sYWtlLWZvcm1hdGlvbi1hcGktdGFnZ2luZy1hcGkuaHRtbCNhd3MtbGFrZS1mb3JtYXRpb24tYXBpLXRhZ2dpbmctYXBpLURlbGV0ZUxGVGFnXG4gICAqL1xuICBwdWJsaWMgdG9EZWxldGVMRlRhZygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlTEZUYWcnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZWxldGUgYW4gSUFNIElkZW50aXR5IENlbnRlciBjb25uZWN0aW9uIHdpdGggTGFrZSBGb3JtYXRpb25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGFrZS1mb3JtYXRpb24vbGF0ZXN0L2RnL2F3cy1sYWtlLWZvcm1hdGlvbi1hcGktSWRlbnRpdHktY2VudGVyLWludGVnLmh0bWwjQVBJX0RlbGV0ZUxha2VGb3JtYXRpb25JZGVudGl0eUNlbnRlckNvbmZpZ3VyYXRpb24uaHRtbFxuICAgKi9cbiAgcHVibGljIHRvRGVsZXRlTGFrZUZvcm1hdGlvbklkZW50aXR5Q2VudGVyQ29uZmlndXJhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlTGFrZUZvcm1hdGlvbklkZW50aXR5Q2VudGVyQ29uZmlndXJhdGlvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSB0aGUgTGFrZSBGb3JtYXRpb24gcGVybWlzc2lvbnMgZW5mb3JjZW1lbnQgb2YgdGhlIGdpdmVuIGRhdGFiYXNlcywgdGFibGVzLCBhbmQgcHJpbmNpcGFsc1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFdyaXRlXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9sYWtlLWZvcm1hdGlvbi9sYXRlc3QvZGcvYXdzLWxha2UtZm9ybWF0aW9uLWFwaS1oeWJyaWQtYWNjZXNzLW1vZGUuaHRtbCNBUElfRGVsZXRlTGFrZUZvcm1hdGlvbk9wdEluLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZUxha2VGb3JtYXRpb25PcHRJbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlTGFrZUZvcm1hdGlvbk9wdEluJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVsZXRlIHRoZSBzcGVjaWZpZWQgb2JqZWN0cyBpZiB0aGUgdHJhbnNhY3Rpb24gaXMgY2FuY2VsZWRcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGFrZS1mb3JtYXRpb24vbGF0ZXN0L2RnL2F3cy1sYWtlLWZvcm1hdGlvbi1hcGktdHJhbnNhY3Rpb25zLWFwaS5odG1sI2F3cy1sYWtlLWZvcm1hdGlvbi1hcGktdHJhbnNhY3Rpb25zLWFwaS1EZWxldGVPYmplY3RzT25DYW5jZWxcbiAgICovXG4gIHB1YmxpYyB0b0RlbGV0ZU9iamVjdHNPbkNhbmNlbCgpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVsZXRlT2JqZWN0c09uQ2FuY2VsJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVyZWdpc3RlciBhIHJlZ2lzdGVyZWQgbG9jYXRpb25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGFrZS1mb3JtYXRpb24vbGF0ZXN0L2RnL2F3cy1sYWtlLWZvcm1hdGlvbi1hcGktdGFnZ2luZy1hcGkuaHRtbCNhd3MtbGFrZS1mb3JtYXRpb24tYXBpLXRhZ2dpbmctYXBpLURlcmVnaXN0ZXJSZXNvdXJjZVxuICAgKi9cbiAgcHVibGljIHRvRGVyZWdpc3RlclJlc291cmNlKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdEZXJlZ2lzdGVyUmVzb3VyY2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkZXNjcmliZSB0aGUgSUFNIElkZW50aXR5IENlbnRlciBjb25uZWN0aW9uIHdpdGggTGFrZSBGb3JtYXRpb25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9sYWtlLWZvcm1hdGlvbi9sYXRlc3QvZGcvYXdzLWxha2UtZm9ybWF0aW9uLWFwaS1JZGVudGl0eS1jZW50ZXItaW50ZWcuaHRtbCNBUElfRGVzY3JpYmVMYWtlRm9ybWF0aW9uSWRlbnRpdHlDZW50ZXJDb25maWd1cmF0aW9uLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0Rlc2NyaWJlTGFrZUZvcm1hdGlvbklkZW50aXR5Q2VudGVyQ29uZmlndXJhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVzY3JpYmVMYWtlRm9ybWF0aW9uSWRlbnRpdHlDZW50ZXJDb25maWd1cmF0aW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gZGVzY3JpYmUgYSByZWdpc3RlcmVkIGxvY2F0aW9uXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGFrZS1mb3JtYXRpb24vbGF0ZXN0L2RnL2F3cy1sYWtlLWZvcm1hdGlvbi1hcGktdGFnZ2luZy1hcGkuaHRtbCNhd3MtbGFrZS1mb3JtYXRpb24tYXBpLXRhZ2dpbmctYXBpLURlc2NyaWJlUmVzb3VyY2VcbiAgICovXG4gIHB1YmxpYyB0b0Rlc2NyaWJlUmVzb3VyY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0Rlc2NyaWJlUmVzb3VyY2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBnZXQgc3RhdHVzIG9mIHRoZSBnaXZlbiB0cmFuc2FjdGlvblxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2xha2UtZm9ybWF0aW9uL2xhdGVzdC9kZy9hd3MtbGFrZS1mb3JtYXRpb24tYXBpLXRyYW5zYWN0aW9ucy1hcGkuaHRtbCNhd3MtbGFrZS1mb3JtYXRpb24tYXBpLXRyYW5zYWN0aW9ucy1hcGktRGVzY3JpYmVUcmFuc2FjdGlvblxuICAgKi9cbiAgcHVibGljIHRvRGVzY3JpYmVUcmFuc2FjdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy50bygnRGVzY3JpYmVUcmFuc2FjdGlvbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGV4dGVuZCB0aGUgdGltZW91dCBvZiB0aGUgZ2l2ZW4gdHJhbnNhY3Rpb25cbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBXcml0ZVxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGFrZS1mb3JtYXRpb24vbGF0ZXN0L2RnL2F3cy1sYWtlLWZvcm1hdGlvbi1hcGktdHJhbnNhY3Rpb25zLWFwaS5odG1sI2F3cy1sYWtlLWZvcm1hdGlvbi1hcGktdHJhbnNhY3Rpb25zLWFwaS1FeHRlbmRUcmFuc2FjdGlvblxuICAgKi9cbiAgcHVibGljIHRvRXh0ZW5kVHJhbnNhY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0V4dGVuZFRyYW5zYWN0aW9uJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gdmlydHVhbCBkYXRhIGxha2UgYWNjZXNzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogV3JpdGVcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2xha2UtZm9ybWF0aW9uL2xhdGVzdC9kZy9hd3MtbGFrZS1mb3JtYXRpb24tYXBpLXRhZ2dpbmctYXBpLmh0bWwjYXdzLWxha2UtZm9ybWF0aW9uLWFwaS10YWdnaW5nLWFwaS1HZXREYXRhQWNjZXNzXG4gICAqL1xuICBwdWJsaWMgdG9HZXREYXRhQWNjZXNzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXREYXRhQWNjZXNzJyk7XG4gIH1cblxuICAvKipcbiAgICogR3JhbnRzIHBlcm1pc3Npb24gdG8gcmV0cmlldmUgYSBMYWtlIEZvcm1hdGlvbiBkYXRhIGNlbGwgZmlsdGVyXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGFrZS1mb3JtYXRpb24vbGF0ZXN0L2RnL2F3cy1sYWtlLWZvcm1hdGlvbi1hcGktZGF0YS1maWx0ZXIuaHRtbCNhd3MtbGFrZS1mb3JtYXRpb24tYXBpLWRhdGEtZmlsdGVyLUdldERhdGFDZWxsc0ZpbHRlclxuICAgKi9cbiAgcHVibGljIHRvR2V0RGF0YUNlbGxzRmlsdGVyKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXREYXRhQ2VsbHNGaWx0ZXInKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXRyaWV2ZSBkYXRhIGxha2Ugc2V0dGluZ3Mgc3VjaCBhcyB0aGUgbGlzdCBvZiBkYXRhIGxha2UgYWRtaW5pc3RyYXRvcnMgYW5kIGRhdGFiYXNlIGFuZCB0YWJsZSBkZWZhdWx0IHBlcm1pc3Npb25zXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGFrZS1mb3JtYXRpb24vbGF0ZXN0L2RnL2F3cy1sYWtlLWZvcm1hdGlvbi1hcGktdGFnZ2luZy1hcGkuaHRtbCNhd3MtbGFrZS1mb3JtYXRpb24tYXBpLXRhZ2dpbmctYXBpLUdldERhdGFMYWtlU2V0dGluZ3NcbiAgICovXG4gIHB1YmxpYyB0b0dldERhdGFMYWtlU2V0dGluZ3MoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldERhdGFMYWtlU2V0dGluZ3MnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXRyaWV2ZSBwZXJtaXNzaW9ucyBhdHRhY2hlZCB0byByZXNvdXJjZXMgaW4gdGhlIGdpdmVuIHBhdGhcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9sYWtlLWZvcm1hdGlvbi9sYXRlc3QvZGcvYXdzLWxha2UtZm9ybWF0aW9uLWFwaS10YWdnaW5nLWFwaS5odG1sI2F3cy1sYWtlLWZvcm1hdGlvbi1hcGktdGFnZ2luZy1hcGktR2V0RWZmZWN0aXZlUGVybWlzc2lvbnNGb3JQYXRoXG4gICAqL1xuICBwdWJsaWMgdG9HZXRFZmZlY3RpdmVQZXJtaXNzaW9uc0ZvclBhdGgoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldEVmZmVjdGl2ZVBlcm1pc3Npb25zRm9yUGF0aCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJldHJpZXZlIGEgTGFrZSBGb3JtYXRpb24gdGFnXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGFrZS1mb3JtYXRpb24vbGF0ZXN0L2RnL2F3cy1sYWtlLWZvcm1hdGlvbi1hcGktdGFnZ2luZy1hcGkuaHRtbCNhd3MtbGFrZS1mb3JtYXRpb24tYXBpLXRhZ2dpbmctYXBpLUdldExGVGFnXG4gICAqL1xuICBwdWJsaWMgdG9HZXRMRlRhZygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0TEZUYWcnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXRyaWV2ZSB0aGUgc3RhdGUgb2YgdGhlIGdpdmVuIHF1ZXJ5XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBEZXBlbmRlbnQgYWN0aW9uczpcbiAgICogLSBsYWtlZm9ybWF0aW9uOlN0YXJ0UXVlcnlQbGFubmluZ1xuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGFrZS1mb3JtYXRpb24vbGF0ZXN0L2RnL2F3cy1sYWtlLWZvcm1hdGlvbi1hcGktcXVlcnlpbmcuaHRtbCNhd3MtbGFrZS1mb3JtYXRpb24tYXBpLXF1ZXJ5aW5nLUdldFF1ZXJ5U3RhdGVcbiAgICovXG4gIHB1YmxpYyB0b0dldFF1ZXJ5U3RhdGUoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldFF1ZXJ5U3RhdGUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXRyaWV2ZSB0aGUgc3RhdGlzdGljcyBmb3IgdGhlIGdpdmVuIHF1ZXJ5XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBEZXBlbmRlbnQgYWN0aW9uczpcbiAgICogLSBsYWtlZm9ybWF0aW9uOlN0YXJ0UXVlcnlQbGFubmluZ1xuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGFrZS1mb3JtYXRpb24vbGF0ZXN0L2RnL2F3cy1sYWtlLWZvcm1hdGlvbi1hcGktcXVlcnlpbmcuaHRtbCNhd3MtbGFrZS1mb3JtYXRpb24tYXBpLXF1ZXJ5aW5nLUdldFF1ZXJ5U3RhdGlzdGljc1xuICAgKi9cbiAgcHVibGljIHRvR2V0UXVlcnlTdGF0aXN0aWNzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRRdWVyeVN0YXRpc3RpY3MnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXRyaWV2ZSBsYWtlZm9ybWF0aW9uIHRhZ3Mgb24gYSBjYXRhbG9nIHJlc291cmNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGFrZS1mb3JtYXRpb24vbGF0ZXN0L2RnL2F3cy1sYWtlLWZvcm1hdGlvbi1hcGktdGFnZ2luZy1hcGkuaHRtbCNhd3MtbGFrZS1mb3JtYXRpb24tYXBpLXRhZ2dpbmctYXBpLUdldFJlc291cmNlTEZUYWdzXG4gICAqL1xuICBwdWJsaWMgdG9HZXRSZXNvdXJjZUxGVGFncygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR2V0UmVzb3VyY2VMRlRhZ3MnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXRyaWV2ZSBvYmplY3RzIGZyb20gYSB0YWJsZVxuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2xha2UtZm9ybWF0aW9uL2xhdGVzdC9kZy9hd3MtbGFrZS1mb3JtYXRpb24tYXBpLW9iamVjdHMuaHRtbCNhd3MtbGFrZS1mb3JtYXRpb24tYXBpLW9iamVjdHMtR2V0VGFibGVPYmplY3RzXG4gICAqL1xuICBwdWJsaWMgdG9HZXRUYWJsZU9iamVjdHMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0dldFRhYmxlT2JqZWN0cycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIHJldHJpZXZlIHRoZSByZXN1bHRzIGZvciB0aGUgZ2l2ZW4gd29yayB1bml0c1xuICAgKlxuICAgKiBBY2Nlc3MgTGV2ZWw6IFJlYWRcbiAgICpcbiAgICogRGVwZW5kZW50IGFjdGlvbnM6XG4gICAqIC0gbGFrZWZvcm1hdGlvbjpHZXRXb3JrVW5pdHNcbiAgICogLSBsYWtlZm9ybWF0aW9uOlN0YXJ0UXVlcnlQbGFubmluZ1xuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGFrZS1mb3JtYXRpb24vbGF0ZXN0L2RnL2F3cy1sYWtlLWZvcm1hdGlvbi1hcGktcXVlcnlpbmcuaHRtbCNhd3MtbGFrZS1mb3JtYXRpb24tYXBpLXF1ZXJ5aW5nLUdldFdvcmtVbml0UmVzdWx0c1xuICAgKi9cbiAgcHVibGljIHRvR2V0V29ya1VuaXRSZXN1bHRzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRXb3JrVW5pdFJlc3VsdHMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byByZXRyaWV2ZSB0aGUgd29yayB1bml0cyBmb3IgdGhlIGdpdmVuIHF1ZXJ5XG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogUmVhZFxuICAgKlxuICAgKiBEZXBlbmRlbnQgYWN0aW9uczpcbiAgICogLSBsYWtlZm9ybWF0aW9uOlN0YXJ0UXVlcnlQbGFubmluZ1xuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGFrZS1mb3JtYXRpb24vbGF0ZXN0L2RnL2F3cy1sYWtlLWZvcm1hdGlvbi1hcGktcXVlcnlpbmcuaHRtbCNhd3MtbGFrZS1mb3JtYXRpb24tYXBpLXF1ZXJ5aW5nLUdldFdvcmtVbml0c1xuICAgKi9cbiAgcHVibGljIHRvR2V0V29ya1VuaXRzKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdHZXRXb3JrVW5pdHMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBkYXRhIGxha2UgcGVybWlzc2lvbnMgdG8gYSBwcmluY2lwYWxcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBQZXJtaXNzaW9ucyBtYW5hZ2VtZW50XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9sYWtlLWZvcm1hdGlvbi9sYXRlc3QvZGcvYXdzLWxha2UtZm9ybWF0aW9uLWFwaS10YWdnaW5nLWFwaS5odG1sI2F3cy1sYWtlLWZvcm1hdGlvbi1hcGktdGFnZ2luZy1hcGktR3JhbnRQZXJtaXNzaW9uc1xuICAgKi9cbiAgcHVibGljIHRvR3JhbnRQZXJtaXNzaW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnR3JhbnRQZXJtaXNzaW9ucycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgY2VsbCBmaWx0ZXJzXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGFrZS1mb3JtYXRpb24vbGF0ZXN0L2RnL2F3cy1sYWtlLWZvcm1hdGlvbi1hcGktZGF0YS1maWx0ZXIuaHRtbCNhd3MtbGFrZS1mb3JtYXRpb24tYXBpLWRhdGEtZmlsdGVyLUxpc3REYXRhQ2VsbHNGaWx0ZXJcbiAgICovXG4gIHB1YmxpYyB0b0xpc3REYXRhQ2VsbHNGaWx0ZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3REYXRhQ2VsbHNGaWx0ZXInKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0IExha2UgRm9ybWF0aW9uIHRhZ3NcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBSZWFkXG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9sYWtlLWZvcm1hdGlvbi9sYXRlc3QvZGcvYXdzLWxha2UtZm9ybWF0aW9uLWFwaS10YWdnaW5nLWFwaS5odG1sI2F3cy1sYWtlLWZvcm1hdGlvbi1hcGktdGFnZ2luZy1hcGktTGlzdExGVGFnc1xuICAgKi9cbiAgcHVibGljIHRvTGlzdExGVGFncygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdExGVGFncycpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlIHRoZSBjdXJyZW50IGxpc3Qgb2YgcmVzb3VyY2VzIGFuZCBwcmluY2lwYWxzIHRoYXQgYXJlIG9wdCBpbiB0byBlbmZvcmNlIExha2UgRm9ybWF0aW9uIHBlcm1pc3Npb25zXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGFrZS1mb3JtYXRpb24vbGF0ZXN0L2RnL2F3cy1sYWtlLWZvcm1hdGlvbi1hcGktaHlicmlkLWFjY2Vzcy1tb2RlLmh0bWwjQVBJX0xpc3RMYWtlRm9ybWF0aW9uT3B0SW5zLmh0bWxcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RMYWtlRm9ybWF0aW9uT3B0SW5zKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0TGFrZUZvcm1hdGlvbk9wdElucycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50cyBwZXJtaXNzaW9uIHRvIGxpc3QgcGVybWlzc2lvbnMgZmlsdGVyZWQgYnkgcHJpbmNpcGFsIG9yIHJlc291cmNlXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGFrZS1mb3JtYXRpb24vbGF0ZXN0L2RnL2F3cy1sYWtlLWZvcm1hdGlvbi1hcGktdGFnZ2luZy1hcGkuaHRtbCNhd3MtbGFrZS1mb3JtYXRpb24tYXBpLXRhZ2dpbmctYXBpLUxpc3RQZXJtaXNzaW9uc1xuICAgKi9cbiAgcHVibGljIHRvTGlzdFBlcm1pc3Npb25zKCkge1xuICAgIHJldHVybiB0aGlzLnRvKCdMaXN0UGVybWlzc2lvbnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBMaXN0IHJlZ2lzdGVyZWQgbG9jYXRpb25zXG4gICAqXG4gICAqIEFjY2VzcyBMZXZlbDogTGlzdFxuICAgKlxuICAgKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGFrZS1mb3JtYXRpb24vbGF0ZXN0L2RnL2F3cy1sYWtlLWZvcm1hdGlvbi1hcGktdGFnZ2luZy1hcGkuaHRtbCNhd3MtbGFrZS1mb3JtYXRpb24tYXBpLXRhZ2dpbmctYXBpLUxpc3RSZXNvdXJjZXNcbiAgICovXG4gIHB1YmxpYyB0b0xpc3RSZXNvdXJjZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMudG8oJ0xpc3RSZXNvdXJjZXMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0IGFsbCB0aGUgc3RvcmFnZSBvcHRpbWl6ZXJzIGZvciB0aGUgR292ZXJuZWQgdGFibGVcbiAgICpcbiAgICogQWNjZXNzIExldmVsOiBMaXN0XG4gICAqXG4gICAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9sYWtlLWZvcm1hdGlvbi9sYXRlc3QvZGcvYXdzLWxha2UtZm9ybWF0aW9uLWFwaS1vcHRpbWl6ZXJzLmh0bWwjYXdzLWxha2UtZm9ybWF0aW9uLWFwaS1vcHRpbWl6ZXJzLUxpc3RUYWJsZVN0b3JhZ2VPcHRpbWl6ZXJzXG4gICAqL1xuICBwdWJsaWMgdG9MaXN0VGFibGVTdG9yYWdlT3B0aW1pemVycygpIHtcbiAgICByZXR1cm4gdGhpcy50bygnTGlzdFRhYmxlU3RvcmFnZU9wdGltaXplcnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgcGVybWlzc2lvbiB0byBsaXN0IGFsbCB0cmFuc2FjdGlvbnMgaW4gdGhlIHN5c3RlbVxuICAgKlxuICAgKiBBY2Nlc3MgTG