UNPKG

@alfresco/adf-content-services

Version:
146 lines 30.6 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 { Component, EventEmitter, Input, Output, ViewChild, ViewEncapsulation } from '@angular/core'; import { Node } from '@alfresco/js-api'; import { VersionListComponent } from './version-list.component'; import { animate, state, style, transition, trigger } from '@angular/animations'; import { ContentService } from '../common/services/content.service'; import { NodesApiService } from '../common/services/nodes-api.service'; import { CommonModule } from '@angular/common'; import { VersionComparisonComponent } from './version-comparison.component'; import { VersionUploadComponent } from './version-upload.component'; import { MatButtonModule } from '@angular/material/button'; import { TranslateModule } from '@ngx-translate/core'; import * as i0 from "@angular/core"; import * as i1 from "../common/services/content.service"; import * as i2 from "../common/services/nodes-api.service"; import * as i3 from "@angular/common"; import * as i4 from "@angular/material/button"; import * as i5 from "@ngx-translate/core"; export class VersionManagerComponent { constructor(contentService, nodesApiService) { this.contentService = contentService; this.nodesApiService = nodesApiService; /** Toggles showing/hiding of comments. */ this.showComments = true; /** Toggles showing/hiding the version comparison component. */ this.showVersionComparison = false; /** Enable/disable downloading a version of the current node. */ this.allowDownload = true; /** Toggles showing/hiding of version actions. */ this.showActions = true; /** Enable/disable viewing versions of the current node. */ this.allowViewVersions = true; /** Enable/disable deletion of version */ this.allowVersionDelete = true; /** Emitted when a file is uploaded successfully. */ this.uploadSuccess = new EventEmitter(); /** Emitted when an error occurs during upload. */ this.uploadError = new EventEmitter(); /** Emitted when an cancelling during upload. */ this.uploadCancel = new EventEmitter(); /** Emitted when viewing a version. */ this.viewVersion = new EventEmitter(); this.uploadState = 'close'; } ngOnInit() { if (this.newFileVersion) { this.toggleNewVersion(); } } refresh(node) { this.nodesApiService.nodeUpdated.next(node); this.versionListComponent.loadVersionHistory(); this.uploadSuccess.emit(node); this.uploadState = 'close'; } onUploadSuccess(event) { this.showVersionComparison = false; this.newFileVersion = null; this.nodesApiService.nodeUpdated.next(event.value.entry); this.versionListComponent.loadVersionHistory(); this.uploadSuccess.emit(event.value.entry); this.uploadState = 'close'; } onUploadError(event) { this.uploadError.emit(event); } onUploadCancel() { this.uploadState = 'close'; this.showVersionComparison = false; this.newFileVersion = null; this.uploadCancel.emit(true); } onViewVersion(versionId) { this.viewVersion.emit(versionId); } toggleNewVersion() { this.uploadState = this.uploadState === 'open' ? 'close' : 'open'; } canUpdate() { return this.contentService.hasAllowableOperations(this.node, 'update'); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: VersionManagerComponent, deps: [{ token: i1.ContentService }, { token: i2.NodesApiService }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.1.3", type: VersionManagerComponent, isStandalone: true, selector: "adf-version-manager", inputs: { node: "node", newFileVersion: "newFileVersion", showComments: "showComments", showVersionComparison: "showVersionComparison", allowDownload: "allowDownload", showActions: "showActions", allowViewVersions: "allowViewVersions", allowVersionDelete: "allowVersionDelete" }, outputs: { uploadSuccess: "uploadSuccess", uploadError: "uploadError", uploadCancel: "uploadCancel", viewVersion: "viewVersion" }, viewQueries: [{ propertyName: "versionListComponent", first: true, predicate: ["versionList"], descendants: true, static: true }], ngImport: i0, template: "<div class=\"adf-new-version-container\">\n <adf-version-comparison *ngIf=\"showVersionComparison\" [node]=\"node\" [newFileVersion]=\"newFileVersion\" />\n <div class=\"adf-new-version-uploader-container\" id=\"adf-new-version-uploader-container\" [@uploadToggle]=\"uploadState\">\n <table class=\"adf-version-upload\" *ngIf=\"uploadState !== 'close' && !versionList.isLoading\">\n <tr>\n <td>\n <adf-version-upload\n id=\"adf-version-upload-button\"\n [node]=\"node\"\n [newFileVersion]=\"newFileVersion\"\n [currentVersion]=\"versionList?.latestVersion?.entry\"\n (success)=\"onUploadSuccess($event)\"\n (cancel)=\"onUploadCancel()\"\n (error)=\"onUploadError($event)\" />\n </td>\n </tr>\n </table>\n </div>\n <div class=\"adf-version-list-container\">\n <div class=\"adf-version-list-table\">\n <div>\n <button mat-raised-button\n id=\"adf-show-version-upload-button\"\n class=\"adf-version-manager-upload-button\"\n (click)=\"toggleNewVersion()\" color=\"primary\"\n *ngIf=\"uploadState ==='close'\">{{ 'ADF_VERSION_LIST.ACTIONS.UPLOAD.ADD' | translate }}\n </button>\n </div>\n <div>\n <adf-version-list\n #versionList\n [node]=\"node\"\n [allowDownload]=\"allowDownload\"\n [showComments]=\"showComments\"\n [showActions]=\"showActions\"\n [allowViewVersions]=\"allowViewVersions\"\n [allowVersionDelete]=\"allowVersionDelete\"\n (deleted)=\"refresh($event)\"\n (restored)=\"refresh($event)\"\n (viewVersion)=\"onViewVersion($event)\" />\n </div>\n </div>\n </div>\n</div>\n", styles: ["adf-version-manager .adf-version-list .adf-version-list-item:has(.adf-version-list-item-line){height:auto;width:100%;padding:16px 0}.adf-version-list-item-comment.adf-version-list-item-line{height:100%;word-break:break-all;white-space:unset;overflow:unset}.adf-button.adf-upload-new-version{box-shadow:none;width:100%;height:175px;float:left;position:relative}.adf-new-version-container{height:inherit;overflow:hidden}.adf-new-version-container .adf-new-version-uploader-container{padding:16px 0;width:100%;height:0;float:left;position:relative}.adf-new-version-container .adf-version-list.adf-version-list-element{width:100%;float:left}.adf-version-list-table{width:100%}.adf-version-list-table .adf-version-manager-upload-button{margin-left:20px}.adf-version-list-table adf-version-list{display:flex;height:538px}.adf-version-upload-table{width:100%}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: VersionComparisonComponent, selector: "adf-version-comparison", inputs: ["node", "newFileVersion"] }, { kind: "component", type: VersionUploadComponent, selector: "adf-version-upload", inputs: ["node", "newFileVersion", "showUploadButton", "showCancelButton", "currentVersion"], outputs: ["success", "error", "cancel", "versionChanged", "commentChanged", "uploadStarted"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i4.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i5.TranslatePipe, name: "translate" }, { kind: "component", type: VersionListComponent, selector: "adf-version-list", inputs: ["node", "showComments", "allowDownload", "allowViewVersions", "showActions", "allowVersionDelete"], outputs: ["restored", "deleted", "viewVersion"] }], animations: [ trigger('uploadToggle', [ state('open', style({ height: '175px', opacity: 1, visibility: 'visible' })), state('close', style({ height: '0%', opacity: 0, visibility: 'hidden' })), transition('open => close', [style({ visibility: 'hidden' }), animate('0.4s cubic-bezier(0.25, 0.8, 0.25, 1)')]), transition('close => open', [style({ visibility: 'visible' }), animate('0.4s cubic-bezier(0.25, 0.8, 0.25, 1)')]) ]) ], encapsulation: i0.ViewEncapsulation.None }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: VersionManagerComponent, decorators: [{ type: Component, args: [{ selector: 'adf-version-manager', standalone: true, imports: [CommonModule, VersionComparisonComponent, VersionUploadComponent, MatButtonModule, TranslateModule, VersionListComponent], animations: [ trigger('uploadToggle', [ state('open', style({ height: '175px', opacity: 1, visibility: 'visible' })), state('close', style({ height: '0%', opacity: 0, visibility: 'hidden' })), transition('open => close', [style({ visibility: 'hidden' }), animate('0.4s cubic-bezier(0.25, 0.8, 0.25, 1)')]), transition('close => open', [style({ visibility: 'visible' }), animate('0.4s cubic-bezier(0.25, 0.8, 0.25, 1)')]) ]) ], encapsulation: ViewEncapsulation.None, template: "<div class=\"adf-new-version-container\">\n <adf-version-comparison *ngIf=\"showVersionComparison\" [node]=\"node\" [newFileVersion]=\"newFileVersion\" />\n <div class=\"adf-new-version-uploader-container\" id=\"adf-new-version-uploader-container\" [@uploadToggle]=\"uploadState\">\n <table class=\"adf-version-upload\" *ngIf=\"uploadState !== 'close' && !versionList.isLoading\">\n <tr>\n <td>\n <adf-version-upload\n id=\"adf-version-upload-button\"\n [node]=\"node\"\n [newFileVersion]=\"newFileVersion\"\n [currentVersion]=\"versionList?.latestVersion?.entry\"\n (success)=\"onUploadSuccess($event)\"\n (cancel)=\"onUploadCancel()\"\n (error)=\"onUploadError($event)\" />\n </td>\n </tr>\n </table>\n </div>\n <div class=\"adf-version-list-container\">\n <div class=\"adf-version-list-table\">\n <div>\n <button mat-raised-button\n id=\"adf-show-version-upload-button\"\n class=\"adf-version-manager-upload-button\"\n (click)=\"toggleNewVersion()\" color=\"primary\"\n *ngIf=\"uploadState ==='close'\">{{ 'ADF_VERSION_LIST.ACTIONS.UPLOAD.ADD' | translate }}\n </button>\n </div>\n <div>\n <adf-version-list\n #versionList\n [node]=\"node\"\n [allowDownload]=\"allowDownload\"\n [showComments]=\"showComments\"\n [showActions]=\"showActions\"\n [allowViewVersions]=\"allowViewVersions\"\n [allowVersionDelete]=\"allowVersionDelete\"\n (deleted)=\"refresh($event)\"\n (restored)=\"refresh($event)\"\n (viewVersion)=\"onViewVersion($event)\" />\n </div>\n </div>\n </div>\n</div>\n", styles: ["adf-version-manager .adf-version-list .adf-version-list-item:has(.adf-version-list-item-line){height:auto;width:100%;padding:16px 0}.adf-version-list-item-comment.adf-version-list-item-line{height:100%;word-break:break-all;white-space:unset;overflow:unset}.adf-button.adf-upload-new-version{box-shadow:none;width:100%;height:175px;float:left;position:relative}.adf-new-version-container{height:inherit;overflow:hidden}.adf-new-version-container .adf-new-version-uploader-container{padding:16px 0;width:100%;height:0;float:left;position:relative}.adf-new-version-container .adf-version-list.adf-version-list-element{width:100%;float:left}.adf-version-list-table{width:100%}.adf-version-list-table .adf-version-manager-upload-button{margin-left:20px}.adf-version-list-table adf-version-list{display:flex;height:538px}.adf-version-upload-table{width:100%}\n"] }] }], ctorParameters: () => [{ type: i1.ContentService }, { type: i2.NodesApiService }], propDecorators: { node: [{ type: Input, args: [{ required: true }] }], newFileVersion: [{ type: Input }], showComments: [{ type: Input }], showVersionComparison: [{ type: Input }], allowDownload: [{ type: Input }], showActions: [{ type: Input }], allowViewVersions: [{ type: Input }], allowVersionDelete: [{ type: Input }], uploadSuccess: [{ type: Output }], uploadError: [{ type: Output }], uploadCancel: [{ type: Output }], viewVersion: [{ type: Output }], versionListComponent: [{ type: ViewChild, args: ['versionList', { static: true }] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi1tYW5hZ2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYi9jb250ZW50LXNlcnZpY2VzL3NyYy9saWIvdmVyc2lvbi1tYW5hZ2VyL3ZlcnNpb24tbWFuYWdlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9saWIvY29udGVudC1zZXJ2aWNlcy9zcmMvbGliL3ZlcnNpb24tbWFuYWdlci92ZXJzaW9uLW1hbmFnZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxTQUFTLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0csT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3hDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDakYsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUV2RSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDNUUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDcEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7Ozs7OztBQWtCdEQsTUFB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QyxPQUFPLEVBQUUsS0FBSyxDQUFDLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDOzRCQUN6RSxVQUFVLENBQUMsZUFBZSxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsT0FBTyxDQUFDLHVDQUF1QyxDQUFDLENBQUMsQ0FBQzs0QkFDaEgsVUFBVSxDQUFDLGVBQWUsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFLE9BQU8sQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDLENBQUM7eUJBQ3BILENBQUM7cUJBQ0wsaUJBQ2MsaUJBQWlCLENBQUMsSUFBSTtpSEFLckMsSUFBSTtzQkFESCxLQUFLO3VCQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRTtnQkFLekIsY0FBYztzQkFEYixLQUFLO2dCQUtOLFlBQVk7c0JBRFgsS0FBSztnQkFLTixxQkFBcUI7c0JBRHBCLEtBQUs7Z0JBS04sYUFBYTtzQkFEWixLQUFLO2dCQUtOLFdBQVc7c0JBRFYsS0FBSztnQkFLTixpQkFBaUI7c0JBRGhCLEtBQUs7Z0JBS04sa0JBQWtCO3NCQURqQixLQUFLO2dCQUtOLGFBQWE7c0JBRFosTUFBTTtnQkFLUCxXQUFXO3NCQURWLE1BQU07Z0JBS1AsWUFBWTtzQkFEWCxNQUFNO2dCQUtQLFdBQVc7c0JBRFYsTUFBTTtnQkFJUCxvQkFBb0I7c0JBRG5CLFNBQVM7dUJBQUMsYUFBYSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSIsInNvdXJjZXNDb250ZW50IjpbIi8qIVxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCDCqSAyMDA1LTIwMjUgSHlsYW5kIFNvZnR3YXJlLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCwgVmlld0NoaWxkLCBWaWV3RW5jYXBzdWxhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTm9kZSB9IGZyb20gJ0BhbGZyZXNjby9qcy1hcGknO1xuaW1wb3J0IHsgVmVyc2lvbkxpc3RDb21wb25lbnQgfSBmcm9tICcuL3ZlcnNpb24tbGlzdC5jb21wb25lbnQnO1xuaW1wb3J0IHsgYW5pbWF0ZSwgc3RhdGUsIHN0eWxlLCB0cmFuc2l0aW9uLCB0cmlnZ2VyIH0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucyc7XG5pbXBvcnQgeyBDb250ZW50U2VydmljZSB9IGZyb20gJy4uL2NvbW1vbi9zZXJ2aWNlcy9jb250ZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgTm9kZXNBcGlTZXJ2aWNlIH0gZnJvbSAnLi4vY29tbW9uL3NlcnZpY2VzL25vZGVzLWFwaS5zZXJ2aWNlJztcbmltcG9ydCB7IEZpbGVVcGxvYWRFcnJvckV2ZW50IH0gZnJvbSAnLi4vY29tbW9uL2V2ZW50cy9maWxlLmV2ZW50JztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBWZXJzaW9uQ29tcGFyaXNvbkNvbXBvbmVudCB9IGZyb20gJy4vdmVyc2lvbi1jb21wYXJpc29uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBWZXJzaW9uVXBsb2FkQ29tcG9uZW50IH0gZnJvbSAnLi92ZXJzaW9uLXVwbG9hZC5jb21wb25lbnQnO1xuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2FkZi12ZXJzaW9uLW1hbmFnZXInLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgVmVyc2lvbkNvbXBhcmlzb25Db21wb25lbnQsIFZlcnNpb25VcGxvYWRDb21wb25lbnQsIE1hdEJ1dHRvbk1vZHVsZSwgVHJhbnNsYXRlTW9kdWxlLCBWZXJzaW9uTGlzdENvbXBvbmVudF0sXG4gICAgdGVtcGxhdGVVcmw6ICcuL3ZlcnNpb24tbWFuYWdlci5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vdmVyc2lvbi1tYW5hZ2VyLmNvbXBvbmVudC5zY3NzJ10sXG4gICAgYW5pbWF0aW9uczogW1xuICAgICAgICB0cmlnZ2VyKCd1cGxvYWRUb2dnbGUnLCBbXG4gICAgICAgICAgICBzdGF0ZSgnb3BlbicsIHN0eWxlKHsgaGVpZ2h0OiAnMTc1cHgnLCBvcGFjaXR5OiAxLCB2aXNpYmlsaXR5OiAndmlzaWJsZScgfSkpLFxuICAgICAgICAgICAgc3RhdGUoJ2Nsb3NlJywgc3R5bGUoeyBoZWlnaHQ6ICcwJScsIG9wYWNpdHk6IDAsIHZpc2liaWxpdHk6ICdoaWRkZW4nIH0pKSxcbiAgICAgICAgICAgIHRyYW5zaXRpb24oJ29wZW4gPT4gY2xvc2UnLCBbc3R5bGUoeyB2aXNpYmlsaXR5OiAnaGlkZGVuJyB9KSwgYW5pbWF0ZSgnMC40cyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKScpXSksXG4gICAgICAgICAgICB0cmFuc2l0aW9uKCdjbG9zZSA9PiBvcGVuJywgW3N0eWxlKHsgdmlzaWJpbGl0eTogJ3Zpc2libGUnIH0pLCBhbmltYXRlKCcwLjRzIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpJyldKVxuICAgICAgICBdKVxuICAgIF0sXG4gICAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZVxufSlcbmV4cG9ydCBjbGFzcyBWZXJzaW9uTWFuYWdlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gICAgLyoqIFRhcmdldCBub2RlIHRvIG1hbmFnZSB2ZXJzaW9uIGhpc3RvcnkuICovXG4gICAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSlcbiAgICBub2RlOiBOb2RlO1xuXG4gICAgLyoqIE5ldyBmaWxlIGZvciB1cGRhdGluZyBjdXJyZW50IHZlcnNpb24uICovXG4gICAgQElucHV0KClcbiAgICBuZXdGaWxlVmVyc2lvbjogRmlsZTtcblxuICAgIC8qKiBUb2dnbGVzIHNob3dpbmcvaGlkaW5nIG9mIGNvbW1lbnRzLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgc2hvd0NvbW1lbnRzID0gdHJ1ZTtcblxuICAgIC8qKiBUb2dnbGVzIHNob3dpbmcvaGlkaW5nIHRoZSB2ZXJzaW9uIGNvbXBhcmlzb24gY29tcG9uZW50LiAqL1xuICAgIEBJbnB1dCgpXG4gICAgc2hvd1ZlcnNpb25Db21wYXJpc29uID0gZmFsc2U7XG5cbiAgICAvKiogRW5hYmxlL2Rpc2FibGUgZG93bmxvYWRpbmcgYSB2ZXJzaW9uIG9mIHRoZSBjdXJyZW50IG5vZGUuICovXG4gICAgQElucHV0KClcbiAgICBhbGxvd0Rvd25sb2FkID0gdHJ1ZTtcblxuICAgIC8qKiBUb2dnbGVzIHNob3dpbmcvaGlkaW5nIG9mIHZlcnNpb24gYWN0aW9ucy4gKi9cbiAgICBASW5wdXQoKVxuICAgIHNob3dBY3Rpb25zID0gdHJ1ZTtcblxuICAgIC8qKiBFbmFibGUvZGlzYWJsZSB2aWV3aW5nIHZlcnNpb25zIG9mIHRoZSBjdXJyZW50IG5vZGUuICovXG4gICAgQElucHV0KClcbiAgICBhbGxvd1ZpZXdWZXJzaW9ucyA9IHRydWU7XG5cbiAgICAvKiogRW5hYmxlL2Rpc2FibGUgZGVsZXRpb24gb2YgdmVyc2lvbiAqL1xuICAgIEBJbnB1dCgpXG4gICAgYWxsb3dWZXJzaW9uRGVsZXRlID0gdHJ1ZTtcblxuICAgIC8qKiBFbWl0dGVkIHdoZW4gYSBmaWxlIGlzIHVwbG9hZGVkIHN1Y2Nlc3NmdWxseS4gKi9cbiAgICBAT3V0cHV0KClcbiAgICB1cGxvYWRTdWNjZXNzID0gbmV3IEV2ZW50RW1pdHRlcjxOb2RlPigpO1xuXG4gICAgLyoqIEVtaXR0ZWQgd2hlbiBhbiBlcnJvciBvY2N1cnMgZHVyaW5nIHVwbG9hZC4gKi9cbiAgICBAT3V0cHV0KClcbiAgICB1cGxvYWRFcnJvciA9IG5ldyBFdmVudEVtaXR0ZXI8RmlsZVVwbG9hZEVycm9yRXZlbnQ+KCk7XG5cbiAgICAvKiogRW1pdHRlZCB3aGVuIGFuIGNhbmNlbGxpbmcgZHVyaW5nIHVwbG9hZC4gKi9cbiAgICBAT3V0cHV0KClcbiAgICB1cGxvYWRDYW5jZWwgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgICAvKiogRW1pdHRlZCB3aGVuIHZpZXdpbmcgYSB2ZXJzaW9uLiAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHZpZXdWZXJzaW9uID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cbiAgICBAVmlld0NoaWxkKCd2ZXJzaW9uTGlzdCcsIHsgc3RhdGljOiB0cnVlIH0pXG4gICAgdmVyc2lvbkxpc3RDb21wb25lbnQ6IFZlcnNpb25MaXN0Q29tcG9uZW50O1xuXG4gICAgdXBsb2FkU3RhdGU6IHN0cmluZyA9ICdjbG9zZSc7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNvbnRlbnRTZXJ2aWNlOiBDb250ZW50U2VydmljZSwgcHJpdmF0ZSBub2Rlc0FwaVNlcnZpY2U6IE5vZGVzQXBpU2VydmljZSkge31cblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICBpZiAodGhpcy5uZXdGaWxlVmVyc2lvbikge1xuICAgICAgICAgICAgdGhpcy50b2dnbGVOZXdWZXJzaW9uKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZWZyZXNoKG5vZGU6IE5vZGUpIHtcbiAgICAgICAgdGhpcy5ub2Rlc0FwaVNlcnZpY2Uubm9kZVVwZGF0ZWQubmV4dChub2RlKTtcbiAgICAgICAgdGhpcy52ZXJzaW9uTGlzdENvbXBvbmVudC5sb2FkVmVyc2lvbkhpc3RvcnkoKTtcbiAgICAgICAgdGhpcy51cGxvYWRTdWNjZXNzLmVtaXQobm9kZSk7XG4gICAgICAgIHRoaXMudXBsb2FkU3RhdGUgPSAnY2xvc2UnO1xuICAgIH1cblxuICAgIG9uVXBsb2FkU3VjY2VzcyhldmVudDogYW55KSB7XG4gICAgICAgIHRoaXMuc2hvd1ZlcnNpb25Db21wYXJpc29uID0gZmFsc2U7XG4gICAgICAgIHRoaXMubmV3RmlsZVZlcnNpb24gPSBudWxsO1xuICAgICAgICB0aGlzLm5vZGVzQXBpU2VydmljZS5ub2RlVXBkYXRlZC5uZXh0KGV2ZW50LnZhbHVlLmVudHJ5KTtcbiAgICAgICAgdGhpcy52ZXJzaW9uTGlzdENvbXBvbmVudC5sb2FkVmVyc2lvbkhpc3RvcnkoKTtcbiAgICAgICAgdGhpcy51cGxvYWRTdWNjZXNzLmVtaXQoZXZlbnQudmFsdWUuZW50cnkpO1xuICAgICAgICB0aGlzLnVwbG9hZFN0YXRlID0gJ2Nsb3NlJztcbiAgICB9XG5cbiAgICBvblVwbG9hZEVycm9yKGV2ZW50OiBGaWxlVXBsb2FkRXJyb3JFdmVudCkge1xuICAgICAgICB0aGlzLnVwbG9hZEVycm9yLmVtaXQoZXZlbnQpO1xuICAgIH1cblxuICAgIG9uVXBsb2FkQ2FuY2VsKCkge1xuICAgICAgICB0aGlzLnVwbG9hZFN0YXRlID0gJ2Nsb3NlJztcbiAgICAgICAgdGhpcy5zaG93VmVyc2lvbkNvbXBhcmlzb24gPSBmYWxzZTtcbiAgICAgICAgdGhpcy5uZXdGaWxlVmVyc2lvbiA9IG51bGw7XG4gICAgICAgIHRoaXMudXBsb2FkQ2FuY2VsLmVtaXQodHJ1ZSk7XG4gICAgfVxuXG4gICAgb25WaWV3VmVyc2lvbih2ZXJzaW9uSWQ6IHN0cmluZykge1xuICAgICAgICB0aGlzLnZpZXdWZXJzaW9uLmVtaXQodmVyc2lvbklkKTtcbiAgICB9XG5cbiAgICB0b2dnbGVOZXdWZXJzaW9uKCkge1xuICAgICAgICB0aGlzLnVwbG9hZFN0YXRlID0gdGhpcy51cGxvYWRTdGF0ZSA9PT0gJ29wZW4nID8gJ2Nsb3NlJyA6ICdvcGVuJztcbiAgICB9XG5cbiAgICBjYW5VcGRhdGUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRlbnRTZXJ2aWNlLmhhc0FsbG93YWJsZU9wZXJhdGlvbnModGhpcy5ub2RlLCAndXBkYXRlJyk7XG4gICAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImFkZi1uZXctdmVyc2lvbi1jb250YWluZXJcIj5cbiAgICA8YWRmLXZlcnNpb24tY29tcGFyaXNvbiAqbmdJZj1cInNob3dWZXJzaW9uQ29tcGFyaXNvblwiIFtub2RlXT1cIm5vZGVcIiBbbmV3RmlsZVZlcnNpb25dPVwibmV3RmlsZVZlcnNpb25cIiAvPlxuICAgIDxkaXYgY2xhc3M9XCJhZGYtbmV3LXZlcnNpb24tdXBsb2FkZXItY29udGFpbmVyXCIgaWQ9XCJhZGYtbmV3LXZlcnNpb24tdXBsb2FkZXItY29udGFpbmVyXCIgW0B1cGxvYWRUb2dnbGVdPVwidXBsb2FkU3RhdGVcIj5cbiAgICAgICAgPHRhYmxlIGNsYXNzPVwiYWRmLXZlcnNpb24tdXBsb2FkXCIgKm5nSWY9XCJ1cGxvYWRTdGF0ZSAhPT0gJ2Nsb3NlJyAmJiAhdmVyc2lvbkxpc3QuaXNMb2FkaW5nXCI+XG4gICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgICAgICA8YWRmLXZlcnNpb24tdXBsb2FkXG4gICAgICAgICAgICAgICAgICAgICAgICBpZD1cImFkZi12ZXJzaW9uLXVwbG9hZC1idXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW25vZGVdPVwibm9kZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmV3RmlsZVZlcnNpb25dPVwibmV3RmlsZVZlcnNpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2N1cnJlbnRWZXJzaW9uXT1cInZlcnNpb25MaXN0Py5sYXRlc3RWZXJzaW9uPy5lbnRyeVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoc3VjY2Vzcyk9XCJvblVwbG9hZFN1Y2Nlc3MoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2FuY2VsKT1cIm9uVXBsb2FkQ2FuY2VsKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGVycm9yKT1cIm9uVXBsb2FkRXJyb3IoJGV2ZW50KVwiIC8+XG4gICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDwvdHI+XG4gICAgICAgIDwvdGFibGU+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImFkZi12ZXJzaW9uLWxpc3QtY29udGFpbmVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJhZGYtdmVyc2lvbi1saXN0LXRhYmxlXCI+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwiYWRmLXNob3ctdmVyc2lvbi11cGxvYWQtYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYWRmLXZlcnNpb24tbWFuYWdlci11cGxvYWQtYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVOZXdWZXJzaW9uKClcIiBjb2xvcj1cInByaW1hcnlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJ1cGxvYWRTdGF0ZSA9PT0nY2xvc2UnXCI+e3sgJ0FERl9WRVJTSU9OX0xJU1QuQUNUSU9OUy5VUExPQUQuQUREJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIDxhZGYtdmVyc2lvbi1saXN0XG4gICAgICAgICAgICAgICAgICAgICN2ZXJzaW9uTGlzdFxuICAgICAgICAgICAgICAgICAgICBbbm9kZV09XCJub2RlXCJcbiAgICAgICAgICAgICAgICAgICAgW2FsbG93RG93bmxvYWRdPVwiYWxsb3dEb3dubG9hZFwiXG4gICAgICAgICAgICAgICAgICAgIFtzaG93Q29tbWVudHNdPVwic2hvd0NvbW1lbnRzXCJcbiAgICAgICAgICAgICAgICAgICAgW3Nob3dBY3Rpb25zXT1cInNob3dBY3Rpb25zXCJcbiAgICAgICAgICAgICAgICAgICAgW2FsbG93Vmlld1ZlcnNpb25zXT1cImFsbG93Vmlld1ZlcnNpb25zXCJcbiAgICAgICAgICAgICAgICAgICAgW2FsbG93VmVyc2lvbkRlbGV0ZV09XCJhbGxvd1ZlcnNpb25EZWxldGVcIlxuICAgICAgICAgICAgICAgICAgICAoZGVsZXRlZCk9XCJyZWZyZXNoKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAocmVzdG9yZWQpPVwicmVmcmVzaCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgKHZpZXdWZXJzaW9uKT1cIm9uVmlld1ZlcnNpb24oJGV2ZW50KVwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==