UNPKG

@alfresco/adf-content-services

Version:
180 lines 24 kB
/*! * @license * Copyright © 2005-2025 Hyland Software, Inc. and its affiliates. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import { Injectable } from '@angular/core'; import { ContentApi } from '@alfresco/js-api'; import { Subject } from 'rxjs'; import { AuthenticationService, ThumbnailService } from '@alfresco/adf-core'; import { PermissionsEnum } from '../models/permissions.enum'; import { AllowableOperationsEnum } from '../models/allowable-operations.enum'; import { AlfrescoApiService } from '../../services/alfresco-api.service'; import * as i0 from "@angular/core"; import * as i1 from "@alfresco/adf-core"; import * as i2 from "../../services/alfresco-api.service"; export class ContentService { get contentApi() { this._contentApi = this._contentApi ?? new ContentApi(this.apiService.getInstance()); return this._contentApi; } constructor(authService, apiService, thumbnailService) { this.authService = authService; this.apiService = apiService; this.thumbnailService = thumbnailService; this.folderCreated = new Subject(); this.folderCreate = new Subject(); this.folderEdit = new Subject(); } /** * Gets a content URL for the given node. * * @param node Node or Node ID to get URL for. * @param attachment Toggles whether to retrieve content as an attachment for download * @param ticket Custom ticket to use for authentication * @returns URL string or `null` */ getContentUrl(node, attachment, ticket) { if (node) { let nodeId; if (typeof node === 'string') { nodeId = node; } else if (node.entry) { nodeId = node.entry.id; } return this.contentApi.getContentUrl(nodeId, attachment, ticket); } return null; } getDocumentThumbnailUrl(nodeId, attachment, ticket) { return this.contentApi.getDocumentThumbnailUrl(nodeId, attachment, ticket); } /** * Checks if the user has permission on that node * * @param node Node to check permissions * @param permission Required permission type * @param userId Optional current user id will be taken by default * @returns True if the user has the required permissions, false otherwise */ hasPermissions(node, permission, userId) { let hasPermissions = false; userId = userId ?? this.authService.getEcmUsername(); const permissions = [...(node.permissions?.locallySet || []), ...(node.permissions?.inherited || [])].filter((currentPermission) => currentPermission.authorityId === userId); if (permissions.length) { if (permission?.startsWith('!')) { hasPermissions = !permissions.find((currentPermission) => currentPermission.name === permission.replace('!', '')); } else { hasPermissions = !!permissions.find((currentPermission) => currentPermission.name === permission); } } else { if (permission === PermissionsEnum.CONSUMER) { hasPermissions = true; } else if (permission === PermissionsEnum.NOT_CONSUMER) { hasPermissions = false; } else if (permission?.startsWith('!')) { hasPermissions = true; } } return hasPermissions; } /** * Checks if the user has permissions on that node * * @param node Node to check allowableOperations * @param allowableOperation Create, delete, update, updatePermissions, !create, !delete, !update, !updatePermissions * @returns True if the user has the required permissions, false otherwise */ hasAllowableOperations(node, allowableOperation) { let hasAllowableOperations = false; if (node?.allowableOperations) { if (allowableOperation?.startsWith('!')) { hasAllowableOperations = !node.allowableOperations.find((currentOperation) => currentOperation === allowableOperation.replace('!', '')); } else { hasAllowableOperations = !!node.allowableOperations.find((currentOperation) => currentOperation === allowableOperation); } } else { if (allowableOperation?.startsWith('!')) { hasAllowableOperations = true; } } if (allowableOperation === AllowableOperationsEnum.COPY) { hasAllowableOperations = true; } if (allowableOperation === AllowableOperationsEnum.LOCK) { hasAllowableOperations = node.isFile; if (node.isLocked && node.allowableOperations) { hasAllowableOperations = !!~node.allowableOperations.indexOf('updatePermissions'); } } return hasAllowableOperations; } getNodeIcon(node) { if (node?.isFolder) { return this.getFolderIcon(node); } if (node?.isFile) { return this.thumbnailService.getMimeTypeIcon(node?.content?.mimeType); } return this.thumbnailService.getDefaultMimeTypeIcon(); } getFolderIcon(node) { if (this.isSmartFolder(node)) { return this.thumbnailService.getMimeTypeIcon('smartFolder'); } else if (this.isRuleFolder(node)) { return this.thumbnailService.getMimeTypeIcon('ruleFolder'); } else if (this.isLinkFolder(node)) { return this.thumbnailService.getMimeTypeIcon('linkFolder'); } else { return this.thumbnailService.getMimeTypeIcon('folder'); } } isSmartFolder(node) { if (node) { return this.hasAspect(node, 'smf:customConfigSmartFolder') || this.hasAspect(node, 'smf:systemConfigSmartFolder'); } return false; } isRuleFolder(node) { if (node) { return this.hasAspect(node, 'rule:rules'); } return false; } isLinkFolder(node) { return node?.nodeType === 'app:folderlink'; } hasAspect(node, aspectName) { return node?.aspectNames?.includes(aspectName); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: ContentService, deps: [{ token: i1.AuthenticationService }, { token: i2.AlfrescoApiService }, { token: i1.ThumbnailService }], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: ContentService, providedIn: 'root' }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: ContentService, decorators: [{ type: Injectable, args: [{ providedIn: 'root' }] }], ctorParameters: () => [{ type: i1.AuthenticationService }, { type: i2.AlfrescoApiService }, { type: i1.ThumbnailService }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGVudC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGliL2NvbnRlbnQtc2VydmljZXMvc3JjL2xpYi9jb21tb24vc2VydmljZXMvY29udGVudC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLFVBQVUsRUFBbUIsTUFBTSxrQkFBa0IsQ0FBQztBQUMvRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzdFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUM5RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQzs7OztBQVl6RSxNQUFNLE9BQU8sY0FBYztJQU12QixJQUFJLFVBQVU7UUFDVixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1FBQ3JGLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUM1QixDQUFDO0lBRUQsWUFBbUIsV0FBa0MsRUFBUyxVQUE4QixFQUFVLGdCQUFtQztRQUF0SCxnQkFBVyxHQUFYLFdBQVcsQ0FBdUI7UUFBUyxlQUFVLEdBQVYsVUFBVSxDQUFvQjtRQUFVLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBbUI7UUFWekksa0JBQWEsR0FBRyxJQUFJLE9BQU8sRUFBc0IsQ0FBQztRQUNsRCxpQkFBWSxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7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QUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQztRQUM5QyxDQUFDO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQUVELFlBQVksQ0FBQyxJQUFVO1FBQ25CLE9BQU8sSUFBSSxFQUFFLFFBQVEsS0FBSyxnQkFBZ0IsQ0FBQztJQUMvQyxDQUFDO0lBRU8sU0FBUyxDQUFDLElBQVUsRUFBRSxVQUFrQjtRQUM1QyxPQUFPLElBQUksRUFBRSxXQUFXLEVBQUUsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ25ELENBQUM7OEdBNUpRLGNBQWM7a0hBQWQsY0FBYyxjQUZYLE1BQU07OzJGQUVULGNBQWM7a0JBSDFCLFVBQVU7bUJBQUM7b0JBQ1IsVUFBVSxFQUFFLE1BQU07aUJBQ3JCIiwic291cmNlc0NvbnRlbnQiOlsiLyohXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IMKpIDIwMDUtMjAyNSBIeWxhbmQgU29mdHdhcmUsIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb250ZW50QXBpLCBOb2RlLCBOb2RlRW50cnkgfSBmcm9tICdAYWxmcmVzY28vanMtYXBpJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEF1dGhlbnRpY2F0aW9uU2VydmljZSwgVGh1bWJuYWlsU2VydmljZSB9IGZyb20gJ0BhbGZyZXNjby9hZGYtY29yZSc7XG5pbXBvcnQgeyBQZXJtaXNzaW9uc0VudW0gfSBmcm9tICcuLi9tb2RlbHMvcGVybWlzc2lvbnMuZW51bSc7XG5pbXBvcnQgeyBBbGxvd2FibGVPcGVyYXRpb25zRW51bSB9IGZyb20gJy4uL21vZGVscy9hbGxvd2FibGUtb3BlcmF0aW9ucy5lbnVtJztcbmltcG9ydCB7IEFsZnJlc2NvQXBpU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2FsZnJlc2NvLWFwaS5zZXJ2aWNlJztcblxuZXhwb3J0IGludGVyZmFjZSBGb2xkZXJDcmVhdGVkRXZlbnQge1xuICAgIG5hbWU6IHN0cmluZztcbiAgICByZWxhdGl2ZVBhdGg/OiBzdHJpbmc7XG4gICAgcGFyZW50SWQ/OiBzdHJpbmc7XG4gICAgbm9kZT86IE5vZGVFbnRyeTtcbn1cblxuQEluamVjdGFibGUoe1xuICAgIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBDb250ZW50U2VydmljZSB7XG4gICAgZm9sZGVyQ3JlYXRlZCA9IG5ldyBTdWJqZWN0PEZvbGRlckNyZWF0ZWRFdmVudD4oKTtcbiAgICBmb2xkZXJDcmVhdGUgPSBuZXcgU3ViamVjdDxOb2RlPigpO1xuICAgIGZvbGRlckVkaXQgPSBuZXcgU3ViamVjdDxOb2RlPigpO1xuXG4gICAgcHJpdmF0ZSBfY29udGVudEFwaTogQ29udGVudEFwaTtcbiAgICBnZXQgY29udGVudEFwaSgpOiBDb250ZW50QXBpIHtcbiAgICAgICAgdGhpcy5fY29udGVudEFwaSA9IHRoaXMuX2NvbnRlbnRBcGkgPz8gbmV3IENvbnRlbnRBcGkodGhpcy5hcGlTZXJ2aWNlLmdldEluc3RhbmNlKCkpO1xuICAgICAgICByZXR1cm4gdGhpcy5fY29udGVudEFwaTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgYXV0aFNlcnZpY2U6IEF1dGhlbnRpY2F0aW9uU2VydmljZSwgcHVibGljIGFwaVNlcnZpY2U6IEFsZnJlc2NvQXBpU2VydmljZSwgcHJpdmF0ZSB0aHVtYm5haWxTZXJ2aWNlPzogVGh1bWJuYWlsU2VydmljZSkge31cblxuICAgIC8qKlxuICAgICAqIEdldHMgYSBjb250ZW50IFVSTCBmb3IgdGhlIGdpdmVuIG5vZGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbm9kZSBOb2RlIG9yIE5vZGUgSUQgdG8gZ2V0IFVSTCBmb3IuXG4gICAgICogQHBhcmFtIGF0dGFjaG1lbnQgVG9nZ2xlcyB3aGV0aGVyIHRvIHJldHJpZXZlIGNvbnRlbnQgYXMgYW4gYXR0YWNobWVudCBmb3IgZG93bmxvYWRcbiAgICAgKiBAcGFyYW0gdGlja2V0IEN1c3RvbSB0aWNrZXQgdG8gdXNlIGZvciBhdXRoZW50aWNhdGlvblxuICAgICAqIEByZXR1cm5zIFVSTCBzdHJpbmcgb3IgYG51bGxgXG4gICAgICovXG4gICAgZ2V0Q29udGVudFVybChub2RlOiBOb2RlRW50cnkgfCBzdHJpbmcsIGF0dGFjaG1lbnQ/OiBib29sZWFuLCB0aWNrZXQ/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBpZiAobm9kZSkge1xuICAgICAgICAgICAgbGV0IG5vZGVJZDogc3RyaW5nO1xuXG4gICAgICAgICAgICBpZiAodHlwZW9mIG5vZGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgbm9kZUlkID0gbm9kZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobm9kZS5lbnRyeSkge1xuICAgICAgICAgICAgICAgIG5vZGVJZCA9IG5vZGUuZW50cnkuaWQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnRlbnRBcGkuZ2V0Q29udGVudFVybChub2RlSWQsIGF0dGFjaG1lbnQsIHRpY2tldCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBnZXREb2N1bWVudFRodW1ibmFpbFVybChub2RlSWQ6IHN0cmluZywgYXR0YWNobWVudD86IGJvb2xlYW4sIHRpY2tldD86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRlbnRBcGkuZ2V0RG9jdW1lbnRUaHVtYm5haWxVcmwobm9kZUlkLCBhdHRhY2htZW50LCB0aWNrZXQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0aGUgdXNlciBoYXMgcGVybWlzc2lvbiBvbiB0aGF0IG5vZGVcbiAgICAgKlxuICAgICAqIEBwYXJhbSBub2RlIE5vZGUgdG8gY2hlY2sgcGVybWlzc2lvbnNcbiAgICAgKiBAcGFyYW0gcGVybWlzc2lvbiBSZXF1aXJlZCBwZXJtaXNzaW9uIHR5cGVcbiAgICAgKiBAcGFyYW0gdXNlcklkIE9wdGlvbmFsIGN1cnJlbnQgdXNlciBpZCB3aWxsIGJlIHRha2VuIGJ5IGRlZmF1bHRcbiAgICAgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSB1c2VyIGhhcyB0aGUgcmVxdWlyZWQgcGVybWlzc2lvbnMsIGZhbHNlIG90aGVyd2lzZVxuICAgICAqL1xuICAgIGhhc1Blcm1pc3Npb25zKG5vZGU6IE5vZGUsIHBlcm1pc3Npb246IFBlcm1pc3Npb25zRW51bSB8IHN0cmluZywgdXNlcklkPzogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGxldCBoYXNQZXJtaXNzaW9ucyA9IGZhbHNlO1xuICAgICAgICB1c2VySWQgPSB1c2VySWQgPz8gdGhpcy5hdXRoU2VydmljZS5nZXRFY21Vc2VybmFtZSgpO1xuXG4gICAgICAgIGNvbnN0IHBlcm1pc3Npb25zID0gWy4uLihub2RlLnBlcm1pc3Npb25zPy5sb2NhbGx5U2V0IHx8IFtdKSwgLi4uKG5vZGUucGVybWlzc2lvbnM/LmluaGVyaXRlZCB8fCBbXSldLmZpbHRlcihcbiAgICAgICAgICAgIChjdXJyZW50UGVybWlzc2lvbikgPT4gY3VycmVudFBlcm1pc3Npb24uYXV0aG9yaXR5SWQgPT09IHVzZXJJZFxuICAgICAgICApO1xuICAgICAgICBpZiAocGVybWlzc2lvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAocGVybWlzc2lvbj8uc3RhcnRzV2l0aCgnIScpKSB7XG4gICAgICAgICAgICAgICAgaGFzUGVybWlzc2lvbnMgPSAhcGVybWlzc2lvbnMuZmluZCgoY3VycmVudFBlcm1pc3Npb24pID0+IGN1cnJlbnRQZXJtaXNzaW9uLm5hbWUgPT09IHBlcm1pc3Npb24ucmVwbGFjZSgnIScsICcnKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGhhc1Blcm1pc3Npb25zID0gISFwZXJtaXNzaW9ucy5maW5kKChjdXJyZW50UGVybWlzc2lvbikgPT4gY3VycmVudFBlcm1pc3Npb24ubmFtZSA9PT0gcGVybWlzc2lvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAocGVybWlzc2lvbiA9PT0gUGVybWlzc2lvbnNFbnVtLkNPTlNVTUVSKSB7XG4gICAgICAgICAgICAgICAgaGFzUGVybWlzc2lvbnMgPSB0cnVlO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwZXJtaXNzaW9uID09PSBQZXJtaXNzaW9uc0VudW0uTk9UX0NPTlNVTUVSKSB7XG4gICAgICAgICAgICAgICAgaGFzUGVybWlzc2lvbnMgPSBmYWxzZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocGVybWlzc2lvbj8uc3RhcnRzV2l0aCgnIScpKSB7XG4gICAgICAgICAgICAgICAgaGFzUGVybWlzc2lvbnMgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGhhc1Blcm1pc3Npb25zO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0aGUgdXNlciBoYXMgcGVybWlzc2lvbnMgb24gdGhhdCBub2RlXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbm9kZSBOb2RlIHRvIGNoZWNrIGFsbG93YWJsZU9wZXJhdGlvbnNcbiAgICAgKiBAcGFyYW0gYWxsb3dhYmxlT3BlcmF0aW9uIENyZWF0ZSwgZGVsZXRlLCB1cGRhdGUsIHVwZGF0ZVBlcm1pc3Npb25zLCAhY3JlYXRlLCAhZGVsZXRlLCAhdXBkYXRlLCAhdXBkYXRlUGVybWlzc2lvbnNcbiAgICAgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSB1c2VyIGhhcyB0aGUgcmVxdWlyZWQgcGVybWlzc2lvbnMsIGZhbHNlIG90aGVyd2lzZVxuICAgICAqL1xuICAgIGhhc0FsbG93YWJsZU9wZXJhdGlvbnMobm9kZTogTm9kZSwgYWxsb3dhYmxlT3BlcmF0aW9uOiBBbGxvd2FibGVPcGVyYXRpb25zRW51bSB8IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBsZXQgaGFzQWxsb3dhYmxlT3BlcmF0aW9ucyA9IGZhbHNlO1xuXG4gICAgICAgIGlmIChub2RlPy5hbGxvd2FibGVPcGVyYXRpb25zKSB7XG4gICAgICAgICAgICBpZiAoYWxsb3dhYmxlT3BlcmF0aW9uPy5zdGFydHNXaXRoKCchJykpIHtcbiAgICAgICAgICAgICAgICBoYXNBbGxvd2FibGVPcGVyYXRpb25zID0gIW5vZGUuYWxsb3dhYmxlT3BlcmF0aW9ucy5maW5kKFxuICAgICAgICAgICAgICAgICAgICAoY3VycmVudE9wZXJhdGlvbikgPT4gY3VycmVudE9wZXJhdGlvbiA9PT0gYWxsb3dhYmxlT3BlcmF0aW9uLnJlcGxhY2UoJyEnLCAnJylcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBoYXNBbGxvd2FibGVPcGVyYXRpb25zID0gISFub2RlLmFsbG93YWJsZU9wZXJhdGlvbnMuZmluZCgoY3VycmVudE9wZXJhdGlvbikgPT4gY3VycmVudE9wZXJhdGlvbiA9PT0gYWxsb3dhYmxlT3BlcmF0aW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChhbGxvd2FibGVPcGVyYXRpb24/LnN0YXJ0c1dpdGgoJyEnKSkge1xuICAgICAgICAgICAgICAgIGhhc0FsbG93YWJsZU9wZXJhdGlvbnMgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFsbG93YWJsZU9wZXJhdGlvbiA9PT0gQWxsb3dhYmxlT3BlcmF0aW9uc0VudW0uQ09QWSkge1xuICAgICAgICAgICAgaGFzQWxsb3dhYmxlT3BlcmF0aW9ucyA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYWxsb3dhYmxlT3BlcmF0aW9uID09PSBBbGxvd2FibGVPcGVyYXRpb25zRW51bS5MT0NLKSB7XG4gICAgICAgICAgICBoYXNBbGxvd2FibGVPcGVyYXRpb25zID0gbm9kZS5pc0ZpbGU7XG5cbiAgICAgICAgICAgIGlmIChub2RlLmlzTG9ja2VkICYmIG5vZGUuYWxsb3dhYmxlT3BlcmF0aW9ucykge1xuICAgICAgICAgICAgICAgIGhhc0FsbG93YWJsZU9wZXJhdGlvbnMgPSAhIX5ub2RlLmFsbG93YWJsZU9wZXJhdGlvbnMuaW5kZXhPZigndXBkYXRlUGVybWlzc2lvbnMnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBoYXNBbGxvd2FibGVPcGVyYXRpb25zO1xuICAgIH1cblxuICAgIGdldE5vZGVJY29uKG5vZGU6IE5vZGUpOiBzdHJpbmcge1xuICAgICAgICBpZiAobm9kZT8uaXNGb2xkZXIpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldEZvbGRlckljb24obm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGU/LmlzRmlsZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudGh1bWJuYWlsU2VydmljZS5nZXRNaW1lVHlwZUljb24obm9kZT8uY29udGVudD8ubWltZVR5cGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnRodW1ibmFpbFNlcnZpY2UuZ2V0RGVmYXVsdE1pbWVUeXBlSWNvbigpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0Rm9sZGVySWNvbihub2RlOiBOb2RlKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKHRoaXMuaXNTbWFydEZvbGRlcihub2RlKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudGh1bWJuYWlsU2VydmljZS5nZXRNaW1lVHlwZUljb24oJ3NtYXJ0Rm9sZGVyJyk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc1J1bGVGb2xkZXIobm9kZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRodW1ibmFpbFNlcnZpY2UuZ2V0TWltZVR5cGVJY29uKCdydWxlRm9sZGVyJyk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc0xpbmtGb2xkZXIobm9kZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRodW1ibmFpbFNlcnZpY2UuZ2V0TWltZVR5cGVJY29uKCdsaW5rRm9sZGVyJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50aHVtYm5haWxTZXJ2aWNlLmdldE1pbWVUeXBlSWNvbignZm9sZGVyJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpc1NtYXJ0Rm9sZGVyKG5vZGU6IE5vZGUpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKG5vZGUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmhhc0FzcGVjdChub2RlLCAnc21mOmN1c3RvbUNvbmZpZ1NtYXJ0Rm9sZGVyJykgfHwgdGhpcy5oYXNBc3BlY3Qobm9kZSwgJ3NtZjpzeXN0ZW1Db25maWdTbWFydEZvbGRlcicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpc1J1bGVGb2xkZXIobm9kZTogTm9kZSk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAobm9kZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaGFzQXNwZWN0KG5vZGUsICdydWxlOnJ1bGVzJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlzTGlua0ZvbGRlcihub2RlOiBOb2RlKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBub2RlPy5ub2RlVHlwZSA9PT0gJ2FwcDpmb2xkZXJsaW5rJztcbiAgICB9XG5cbiAgICBwcml2YXRlIGhhc0FzcGVjdChub2RlOiBOb2RlLCBhc3BlY3ROYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIG5vZGU/LmFzcGVjdE5hbWVzPy5pbmNsdWRlcyhhc3BlY3ROYW1lKTtcbiAgICB9XG59XG4iXX0=