@alfresco/adf-content-services
Version:
Alfresco ADF content services
55 lines • 22.5 kB
JavaScript
/*!
* @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 { EXTENDIBLE_COMPONENT } from '@alfresco/adf-core';
import { Component, forwardRef, Input, ViewEncapsulation } from '@angular/core';
import { Node } from '@alfresco/js-api';
import { UploadButtonComponent } from './upload-button.component';
import { AllowableOperationsEnum } from '../../common/models/allowable-operations.enum';
import { CommonModule } from '@angular/common';
import { MatButtonModule } from '@angular/material/button';
import { TranslateModule } from '@ngx-translate/core';
import { MatIconModule } from '@angular/material/icon';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
import * as i2 from "@ngx-translate/core";
import * as i3 from "@angular/material/icon";
export class UploadVersionButtonComponent extends UploadButtonComponent {
createFileModel(file) {
const fileModel = super.createFileModel(file, this.rootFolderId, (file.webkitRelativePath || '').replace(/\/[^/]*$/, ''), this.node.id);
if (!this.isFileAcceptable(fileModel)) {
const message = this.translationService.instant('FILE_UPLOAD.VERSION.MESSAGES.INCOMPATIBLE_VERSION');
this.error.emit(message);
}
return fileModel;
}
ngOnInit() {
super.ngOnInit();
this.checkPermission();
}
checkPermission() {
this.permissionValue.next(this.nodeHasPermission(this.node, AllowableOperationsEnum.UPDATE));
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: UploadVersionButtonComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.1.3", type: UploadVersionButtonComponent, isStandalone: true, selector: "adf-upload-version-button", inputs: { node: "node" }, host: { classAttribute: "adf-upload-version-button" }, usesInheritance: true, ngImport: i0, template: "<form class=\"adf-upload-button-file-container\">\n <!--Files Upload-->\n <div *ngIf=\"!uploadFolders\">\n\n <!--Single Files Upload-->\n <ng-container *ngIf=\"!multipleFiles\">\n <input\n class=\"adf-upload-button-file-container-upload-single-file\"\n id=\"upload-single-file\"\n data-automation-id=\"upload-single-file\"\n [type]=\"file ? 'button' : 'file'\"\n name=\"uploadFiles\"\n accept=\"{{acceptedFilesType}}\"\n [attr.disabled]=\"isButtonDisabled()\"\n [title]=\"tooltip\"\n (change)=\"onFilesAdded($event)\"\n (click)=\"onClickUploadButton()\"/>\n <label for=\"upload-single-file\" class=\"adf-upload-button-label\">\n <mat-icon class=\"adf-upload-button-icon\">file_upload</mat-icon>\n <span id=\"upload-single-file-label\" *ngIf=\"!staticTitle\">\n {{ 'FILE_UPLOAD.BUTTON.UPLOAD_FILE' | translate }}</span>\n <span id=\"upload-single-file-label-static\" *ngIf=\"staticTitle\">\n {{ staticTitle }}</span>\n </label>\n </ng-container>\n\n <!--Multiple Files Upload-->\n <ng-container *ngIf=\"multipleFiles\">\n <input\n id=\"upload-multiple-files\"\n data-automation-id=\"upload-multiple-files\"\n type=\"file\"\n name=\"uploadFiles\"\n multiple=\"multiple\"\n accept=\"{{acceptedFilesType}}\"\n [attr.disabled]=\"isButtonDisabled()\"\n [title]=\"tooltip\"\n (change)=\"onFilesAdded($event)\"/>\n <label for=\"upload-multiple-files\" class=\"adf-upload-button-label\">\n <mat-icon class=\"adf-upload-button-icon\">file_upload</mat-icon>\n <span id=\"upload-multiple-file-label\" *ngIf=\"!staticTitle\">\n {{ 'FILE_UPLOAD.BUTTON.UPLOAD_FILE' | translate }}</span>\n <span id=\"upload-multiple-file-label-static\" *ngIf=\"staticTitle\">\n {{ staticTitle }}</span>\n </label>\n </ng-container>\n </div>\n\n <!--Folders Upload-->\n <ng-container *ngIf=\"uploadFolders\">\n <input\n id=\"uploadFolder\"\n data-automation-id=\"uploadFolder\"\n type=\"file\"\n name=\"uploadFiles\"\n multiple=\"multiple\"\n accept=\"{{acceptedFilesType}}\"\n webkitdirectory directory\n [attr.disabled]=\"isButtonDisabled()\"\n [title]=\"tooltip\"\n (change)=\"onDirectoryAdded($event)\"/>\n <label for=\"uploadFolder\" data-automation-id=\"uploadFolder\" class=\"adf-upload-button-label\">\n <mat-icon class=\"adf-upload-button-icon\">file_upload</mat-icon>\n <span id=\"uploadFolder-label\" *ngIf=\"!staticTitle\">\n {{ 'FILE_UPLOAD.BUTTON.UPLOAD_FOLDER' | translate }}</span>\n <span id=\"uploadFolder-label-static\" *ngIf=\"staticTitle\">\n {{ staticTitle }}</span>\n </label>\n </ng-container>\n</form>\n", styles: [".adf-upload-button-file-container .adf-upload-button-icon{margin:0;font-size:24px;width:24px;height:24px}.adf-upload-button-file-container input{display:none}.adf-upload-button-label{display:flex;align-items:center;cursor:pointer;padding:8px 16px;box-shadow:0 3px 1px -2px #0003,0 2px 2px #00000024,0 1px 5px #0000001f;border-radius:4px}.adf-upload-button-label:active{box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}.adf-upload-button-file-container-upload-single-file[disabled]+.adf-upload-button-label{background-color:var(--adf-disabled-button-background);color:var(--adf-theme-foreground-disabled-text-color);box-shadow:none;cursor:default}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], viewProviders: [{ provide: EXTENDIBLE_COMPONENT, useExisting: forwardRef(() => UploadVersionButtonComponent) }], encapsulation: i0.ViewEncapsulation.None }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: UploadVersionButtonComponent, decorators: [{
type: Component,
args: [{ selector: 'adf-upload-version-button', standalone: true, imports: [CommonModule, MatButtonModule, TranslateModule, MatIconModule], viewProviders: [{ provide: EXTENDIBLE_COMPONENT, useExisting: forwardRef(() => UploadVersionButtonComponent) }], encapsulation: ViewEncapsulation.None, host: { class: 'adf-upload-version-button' }, template: "<form class=\"adf-upload-button-file-container\">\n <!--Files Upload-->\n <div *ngIf=\"!uploadFolders\">\n\n <!--Single Files Upload-->\n <ng-container *ngIf=\"!multipleFiles\">\n <input\n class=\"adf-upload-button-file-container-upload-single-file\"\n id=\"upload-single-file\"\n data-automation-id=\"upload-single-file\"\n [type]=\"file ? 'button' : 'file'\"\n name=\"uploadFiles\"\n accept=\"{{acceptedFilesType}}\"\n [attr.disabled]=\"isButtonDisabled()\"\n [title]=\"tooltip\"\n (change)=\"onFilesAdded($event)\"\n (click)=\"onClickUploadButton()\"/>\n <label for=\"upload-single-file\" class=\"adf-upload-button-label\">\n <mat-icon class=\"adf-upload-button-icon\">file_upload</mat-icon>\n <span id=\"upload-single-file-label\" *ngIf=\"!staticTitle\">\n {{ 'FILE_UPLOAD.BUTTON.UPLOAD_FILE' | translate }}</span>\n <span id=\"upload-single-file-label-static\" *ngIf=\"staticTitle\">\n {{ staticTitle }}</span>\n </label>\n </ng-container>\n\n <!--Multiple Files Upload-->\n <ng-container *ngIf=\"multipleFiles\">\n <input\n id=\"upload-multiple-files\"\n data-automation-id=\"upload-multiple-files\"\n type=\"file\"\n name=\"uploadFiles\"\n multiple=\"multiple\"\n accept=\"{{acceptedFilesType}}\"\n [attr.disabled]=\"isButtonDisabled()\"\n [title]=\"tooltip\"\n (change)=\"onFilesAdded($event)\"/>\n <label for=\"upload-multiple-files\" class=\"adf-upload-button-label\">\n <mat-icon class=\"adf-upload-button-icon\">file_upload</mat-icon>\n <span id=\"upload-multiple-file-label\" *ngIf=\"!staticTitle\">\n {{ 'FILE_UPLOAD.BUTTON.UPLOAD_FILE' | translate }}</span>\n <span id=\"upload-multiple-file-label-static\" *ngIf=\"staticTitle\">\n {{ staticTitle }}</span>\n </label>\n </ng-container>\n </div>\n\n <!--Folders Upload-->\n <ng-container *ngIf=\"uploadFolders\">\n <input\n id=\"uploadFolder\"\n data-automation-id=\"uploadFolder\"\n type=\"file\"\n name=\"uploadFiles\"\n multiple=\"multiple\"\n accept=\"{{acceptedFilesType}}\"\n webkitdirectory directory\n [attr.disabled]=\"isButtonDisabled()\"\n [title]=\"tooltip\"\n (change)=\"onDirectoryAdded($event)\"/>\n <label for=\"uploadFolder\" data-automation-id=\"uploadFolder\" class=\"adf-upload-button-label\">\n <mat-icon class=\"adf-upload-button-icon\">file_upload</mat-icon>\n <span id=\"uploadFolder-label\" *ngIf=\"!staticTitle\">\n {{ 'FILE_UPLOAD.BUTTON.UPLOAD_FOLDER' | translate }}</span>\n <span id=\"uploadFolder-label-static\" *ngIf=\"staticTitle\">\n {{ staticTitle }}</span>\n </label>\n </ng-container>\n</form>\n", styles: [".adf-upload-button-file-container .adf-upload-button-icon{margin:0;font-size:24px;width:24px;height:24px}.adf-upload-button-file-container input{display:none}.adf-upload-button-label{display:flex;align-items:center;cursor:pointer;padding:8px 16px;box-shadow:0 3px 1px -2px #0003,0 2px 2px #00000024,0 1px 5px #0000001f;border-radius:4px}.adf-upload-button-label:active{box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}.adf-upload-button-file-container-upload-single-file[disabled]+.adf-upload-button-label{background-color:var(--adf-disabled-button-background);color:var(--adf-theme-foreground-disabled-text-color);box-shadow:none;cursor:default}\n"] }]
}], propDecorators: { node: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBsb2FkLXZlcnNpb24tYnV0dG9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYi9jb250ZW50LXNlcnZpY2VzL3NyYy9saWIvdXBsb2FkL2NvbXBvbmVudHMvdXBsb2FkLXZlcnNpb24tYnV0dG9uLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYi9jb250ZW50LXNlcnZpY2VzL3NyYy9saWIvdXBsb2FkL2NvbXBvbmVudHMvdXBsb2FkLWJ1dHRvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMxRCxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQWEsaUJBQWlCLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFDbkcsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3hDLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2xFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLCtDQUErQyxDQUFDO0FBRXhGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7Ozs7QUFZdkQsTUFBTSxPQUFPLDRCQUE2QixTQUFRLHFCQUFxQjtJQUt6RCxlQUFlLENBQUMsSUFBVTtRQUNoQyxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsZUFBZSxDQUNuQyxJQUFJLEVBQ0osSUFBSSxDQUFDLFlBQVksRUFDakIsQ0FBRSxJQUFZLENBQUMsa0JBQWtCLElBQUksRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsRUFDaEUsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQ2YsQ0FBQztRQUVGLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztZQUNwQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLG1EQUFtRCxDQUFDLENBQUM7WUFDckcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDN0IsQ0FBQztRQUVELE9BQU8sU0FBUyxDQUFDO0lBQ3JCLENBQUM7SUFFRCxRQUFRO1FBQ0osS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRUQsZUFBZTtRQUNYLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLHVCQUF1QixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDakcsQ0FBQzs4R0E1QlEsNEJBQTRCO2tHQUE1Qiw0QkFBNEIsNkxDdEN6Qyxxc0dBc0VBLGt1QkR2Q2MsWUFBWSxrSUFBRSxlQUFlLDhCQUFFLGVBQWUsMkZBQUUsYUFBYSx5S0FHeEQsQ0FBQyxFQUFFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLDRCQUE0QixDQUFDLEVBQUUsQ0FBQzs7MkZBSXRHLDRCQUE0QjtrQkFWeEMsU0FBUzsrQkFDSSwyQkFBMkIsY0FDekIsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLGVBQWUsRUFBRSxlQUFlLEVBQUUsYUFBYSxDQUFDLGlCQUd6RCxDQUFDLEVBQUUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLDZCQUE2QixDQUFDLEVBQUUsQ0FBQyxpQkFDaEcsaUJBQWlCLENBQUMsSUFBSSxRQUMvQixFQUFFLEtBQUssRUFBRSwyQkFBMkIsRUFBRTs4QkFLNUMsSUFBSTtzQkFESCxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiLyohXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IMKpIDIwMDUtMjAyNSBIeWxhbmQgU29mdHdhcmUsIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBFWFRFTkRJQkxFX0NPTVBPTkVOVCB9IGZyb20gJ0BhbGZyZXNjby9hZGYtY29yZSc7XG5pbXBvcnQgeyBDb21wb25lbnQsIGZvcndhcmRSZWYsIElucHV0LCBPbkNoYW5nZXMsIFZpZXdFbmNhcHN1bGF0aW9uLCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5vZGUgfSBmcm9tICdAYWxmcmVzY28vanMtYXBpJztcbmltcG9ydCB7IFVwbG9hZEJ1dHRvbkNvbXBvbmVudCB9IGZyb20gJy4vdXBsb2FkLWJ1dHRvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgQWxsb3dhYmxlT3BlcmF0aW9uc0VudW0gfSBmcm9tICcuLi8uLi9jb21tb24vbW9kZWxzL2FsbG93YWJsZS1vcGVyYXRpb25zLmVudW0nO1xuaW1wb3J0IHsgRmlsZU1vZGVsIH0gZnJvbSAnLi4vLi4vY29tbW9uL21vZGVscy9maWxlLm1vZGVsJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBNYXRCdXR0b25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBNYXRJY29uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnYWRmLXVwbG9hZC12ZXJzaW9uLWJ1dHRvbicsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBNYXRCdXR0b25Nb2R1bGUsIFRyYW5zbGF0ZU1vZHVsZSwgTWF0SWNvbk1vZHVsZV0sXG4gICAgdGVtcGxhdGVVcmw6ICcuL3VwbG9hZC1idXR0b24uY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL3VwbG9hZC1idXR0b24uY29tcG9uZW50LnNjc3MnXSxcbiAgICB2aWV3UHJvdmlkZXJzOiBbeyBwcm92aWRlOiBFWFRFTkRJQkxFX0NPTVBPTkVOVCwgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gVXBsb2FkVmVyc2lvbkJ1dHRvbkNvbXBvbmVudCkgfV0sXG4gICAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgICBob3N0OiB7IGNsYXNzOiAnYWRmLXVwbG9hZC12ZXJzaW9uLWJ1dHRvbicgfVxufSlcbmV4cG9ydCBjbGFzcyBVcGxvYWRWZXJzaW9uQnV0dG9uQ29tcG9uZW50IGV4dGVuZHMgVXBsb2FkQnV0dG9uQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzLCBPbkluaXQge1xuICAgIC8qKiAoKipSZXF1aXJlZCoqKSBUaGUgbm9kZSB0byBiZSB2ZXJzaW9uZWQuICovXG4gICAgQElucHV0KClcbiAgICBub2RlOiBOb2RlO1xuXG4gICAgcHJvdGVjdGVkIGNyZWF0ZUZpbGVNb2RlbChmaWxlOiBGaWxlKTogRmlsZU1vZGVsIHtcbiAgICAgICAgY29uc3QgZmlsZU1vZGVsID0gc3VwZXIuY3JlYXRlRmlsZU1vZGVsKFxuICAgICAgICAgICAgZmlsZSxcbiAgICAgICAgICAgIHRoaXMucm9vdEZvbGRlcklkLFxuICAgICAgICAgICAgKChmaWxlIGFzIGFueSkud2Via2l0UmVsYXRpdmVQYXRoIHx8ICcnKS5yZXBsYWNlKC9cXC9bXi9dKiQvLCAnJyksXG4gICAgICAgICAgICB0aGlzLm5vZGUuaWRcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoIXRoaXMuaXNGaWxlQWNjZXB0YWJsZShmaWxlTW9kZWwpKSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gdGhpcy50cmFuc2xhdGlvblNlcnZpY2UuaW5zdGFudCgnRklMRV9VUExPQUQuVkVSU0lPTi5NRVNTQUdFUy5JTkNPTVBBVElCTEVfVkVSU0lPTicpO1xuICAgICAgICAgICAgdGhpcy5lcnJvci5lbWl0KG1lc3NhZ2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZpbGVNb2RlbDtcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgc3VwZXIubmdPbkluaXQoKTtcbiAgICAgICAgdGhpcy5jaGVja1Blcm1pc3Npb24oKTtcbiAgICB9XG5cbiAgICBjaGVja1Blcm1pc3Npb24oKSB7XG4gICAgICAgIHRoaXMucGVybWlzc2lvblZhbHVlLm5leHQodGhpcy5ub2RlSGFzUGVybWlzc2lvbih0aGlzLm5vZGUsIEFsbG93YWJsZU9wZXJhdGlvbnNFbnVtLlVQREFURSkpO1xuICAgIH1cbn1cbiIsIjxmb3JtIGNsYXNzPVwiYWRmLXVwbG9hZC1idXR0b24tZmlsZS1jb250YWluZXJcIj5cbiAgICA8IS0tRmlsZXMgVXBsb2FkLS0+XG4gICAgPGRpdiAqbmdJZj1cIiF1cGxvYWRGb2xkZXJzXCI+XG5cbiAgICAgICAgPCEtLVNpbmdsZSBGaWxlcyBVcGxvYWQtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFtdWx0aXBsZUZpbGVzXCI+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICBjbGFzcz1cImFkZi11cGxvYWQtYnV0dG9uLWZpbGUtY29udGFpbmVyLXVwbG9hZC1zaW5nbGUtZmlsZVwiXG4gICAgICAgICAgICAgICAgaWQ9XCJ1cGxvYWQtc2luZ2xlLWZpbGVcIlxuICAgICAgICAgICAgICAgIGRhdGEtYXV0b21hdGlvbi1pZD1cInVwbG9hZC1zaW5nbGUtZmlsZVwiXG4gICAgICAgICAgICAgICAgW3R5cGVdPVwiZmlsZSA/ICdidXR0b24nIDogJ2ZpbGUnXCJcbiAgICAgICAgICAgICAgICBuYW1lPVwidXBsb2FkRmlsZXNcIlxuICAgICAgICAgICAgICAgIGFjY2VwdD1cInt7YWNjZXB0ZWRGaWxlc1R5cGV9fVwiXG4gICAgICAgICAgICAgICAgW2F0dHIuZGlzYWJsZWRdPVwiaXNCdXR0b25EaXNhYmxlZCgpXCJcbiAgICAgICAgICAgICAgICBbdGl0bGVdPVwidG9vbHRpcFwiXG4gICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvbkZpbGVzQWRkZWQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uQ2xpY2tVcGxvYWRCdXR0b24oKVwiLz5cbiAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJ1cGxvYWQtc2luZ2xlLWZpbGVcIiBjbGFzcz1cImFkZi11cGxvYWQtYnV0dG9uLWxhYmVsXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiYWRmLXVwbG9hZC1idXR0b24taWNvblwiPmZpbGVfdXBsb2FkPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBpZD1cInVwbG9hZC1zaW5nbGUtZmlsZS1sYWJlbFwiICpuZ0lmPVwiIXN0YXRpY1RpdGxlXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7ICdGSUxFX1VQTE9BRC5CVVRUT04uVVBMT0FEX0ZJTEUnIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGlkPVwidXBsb2FkLXNpbmdsZS1maWxlLWxhYmVsLXN0YXRpY1wiICpuZ0lmPVwic3RhdGljVGl0bGVcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgc3RhdGljVGl0bGUgfX08L3NwYW4+XG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8IS0tTXVsdGlwbGUgRmlsZXMgVXBsb2FkLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJtdWx0aXBsZUZpbGVzXCI+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICBpZD1cInVwbG9hZC1tdWx0aXBsZS1maWxlc1wiXG4gICAgICAgICAgICAgICAgZGF0YS1hdXRvbWF0aW9uLWlkPVwidXBsb2FkLW11bHRpcGxlLWZpbGVzXCJcbiAgICAgICAgICAgICAgICB0eXBlPVwiZmlsZVwiXG4gICAgICAgICAgICAgICAgbmFtZT1cInVwbG9hZEZpbGVzXCJcbiAgICAgICAgICAgICAgICBtdWx0aXBsZT1cIm11bHRpcGxlXCJcbiAgICAgICAgICAgICAgICBhY2NlcHQ9XCJ7e2FjY2VwdGVkRmlsZXNUeXBlfX1cIlxuICAgICAgICAgICAgICAgIFthdHRyLmRpc2FibGVkXT1cImlzQnV0dG9uRGlzYWJsZWQoKVwiXG4gICAgICAgICAgICAgICAgW3RpdGxlXT1cInRvb2x0aXBcIlxuICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25GaWxlc0FkZGVkKCRldmVudClcIi8+XG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwidXBsb2FkLW11bHRpcGxlLWZpbGVzXCIgY2xhc3M9XCJhZGYtdXBsb2FkLWJ1dHRvbi1sYWJlbFwiPlxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImFkZi11cGxvYWQtYnV0dG9uLWljb25cIj5maWxlX3VwbG9hZDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgPHNwYW4gaWQ9XCJ1cGxvYWQtbXVsdGlwbGUtZmlsZS1sYWJlbFwiICpuZ0lmPVwiIXN0YXRpY1RpdGxlXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7ICdGSUxFX1VQTE9BRC5CVVRUT04uVVBMT0FEX0ZJTEUnIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGlkPVwidXBsb2FkLW11bHRpcGxlLWZpbGUtbGFiZWwtc3RhdGljXCIgKm5nSWY9XCJzdGF0aWNUaXRsZVwiPlxuICAgICAgICAgICAgICAgICAgICB7eyBzdGF0aWNUaXRsZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLUZvbGRlcnMgVXBsb2FkLS0+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInVwbG9hZEZvbGRlcnNcIj5cbiAgICAgICAgPGlucHV0XG4gICAgICAgICAgICBpZD1cInVwbG9hZEZvbGRlclwiXG4gICAgICAgICAgICBkYXRhLWF1dG9tYXRpb24taWQ9XCJ1cGxvYWRGb2xkZXJcIlxuICAgICAgICAgICAgdHlwZT1cImZpbGVcIlxuICAgICAgICAgICAgbmFtZT1cInVwbG9hZEZpbGVzXCJcbiAgICAgICAgICAgIG11bHRpcGxlPVwibXVsdGlwbGVcIlxuICAgICAgICAgICAgYWNjZXB0PVwie3thY2NlcHRlZEZpbGVzVHlwZX19XCJcbiAgICAgICAgICAgIHdlYmtpdGRpcmVjdG9yeSBkaXJlY3RvcnlcbiAgICAgICAgICAgIFthdHRyLmRpc2FibGVkXT1cImlzQnV0dG9uRGlzYWJsZWQoKVwiXG4gICAgICAgICAgICBbdGl0bGVdPVwidG9vbHRpcFwiXG4gICAgICAgICAgICAoY2hhbmdlKT1cIm9uRGlyZWN0b3J5QWRkZWQoJGV2ZW50KVwiLz5cbiAgICAgICAgPGxhYmVsIGZvcj1cInVwbG9hZEZvbGRlclwiIGRhdGEtYXV0b21hdGlvbi1pZD1cInVwbG9hZEZvbGRlclwiIGNsYXNzPVwiYWRmLXVwbG9hZC1idXR0b24tbGFiZWxcIj5cbiAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImFkZi11cGxvYWQtYnV0dG9uLWljb25cIj5maWxlX3VwbG9hZDwvbWF0LWljb24+XG4gICAgICAgICAgICA8c3BhbiBpZD1cInVwbG9hZEZvbGRlci1sYWJlbFwiICpuZ0lmPVwiIXN0YXRpY1RpdGxlXCI+XG4gICAgICAgICAgICAgICAge3sgJ0ZJTEVfVVBMT0FELkJVVFRPTi5VUExPQURfRk9MREVSJyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGlkPVwidXBsb2FkRm9sZGVyLWxhYmVsLXN0YXRpY1wiICpuZ0lmPVwic3RhdGljVGl0bGVcIj5cbiAgICAgICAgICAgICAgICB7eyBzdGF0aWNUaXRsZSB9fTwvc3Bhbj5cbiAgICAgICAgPC9sYWJlbD5cbiAgICA8L25nLWNvbnRhaW5lcj5cbjwvZm9ybT5cbiJdfQ==