@alfresco/adf-content-services
Version:
Alfresco ADF content services
256 lines • 34.9 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 { MatDialog } from '@angular/material/dialog';
import { EventEmitter, Injectable, Output } from '@angular/core';
import { ThumbnailService, TranslationService } from '@alfresco/adf-core';
import { Subject, throwError } from 'rxjs';
import { AllowableOperationsEnum } from '../common/models/allowable-operations.enum';
import { ContentService } from '../common/services/content.service';
import { DocumentListService } from '../document-list/services/document-list.service';
import { ContentNodeSelectorComponent } from './content-node-selector.component';
import { NodeAction } from '../document-list/models/node-action.enum';
import { NodeLockDialogComponent } from '../dialogs/node-lock/node-lock.dialog';
import { switchMap } from 'rxjs/operators';
import { SitesService } from '../common/services/sites.service';
import * as i0 from "@angular/core";
import * as i1 from "@angular/material/dialog";
import * as i2 from "../common/services/content.service";
import * as i3 from "../document-list/services/document-list.service";
import * as i4 from "../common/services/sites.service";
import * as i5 from "@alfresco/adf-core";
// eslint-disable-next-line @angular-eslint/directive-class-suffix
export class ContentNodeDialogService {
static { this.nonDocumentSiteContent = ['blog', 'calendar', 'dataLists', 'discussions', 'links', 'wiki']; }
constructor(dialog, contentService, documentListService, siteService, translation, thumbnailService) {
this.dialog = dialog;
this.contentService = contentService;
this.documentListService = documentListService;
this.siteService = siteService;
this.translation = translation;
this.thumbnailService = thumbnailService;
/** Emitted when an error occurs. */
this.error = new EventEmitter();
}
/**
* Opens a file browser at a chosen folder location.
* shows files and folders in the dialog search result.
*
* @param folderNodeId ID of the folder to use
* @returns Information about the selected file(s)
*/
openFileBrowseDialogByFolderId(folderNodeId) {
return this.documentListService
.getFolderNode(folderNodeId)
.pipe(switchMap((nodeEntry) => this.openUploadFileDialog(NodeAction.CHOOSE, nodeEntry.entry, true)));
}
/**
* Opens a lock node dialog.
*
* @param contentEntry Node to lock
* @returns Error/status message (if any)
*/
openLockNodeDialog(contentEntry) {
const observable = new Subject();
if (this.contentService.hasAllowableOperations(contentEntry, AllowableOperationsEnum.LOCK)) {
this.dialog.open(NodeLockDialogComponent, {
data: {
node: contentEntry,
onError: (error) => {
this.error.emit(error);
observable.error(error);
}
},
width: '400px'
});
}
else {
observable.error('OPERATION.FAIL.NODE.NO_PERMISSION');
}
return observable;
}
/**
* Opens a file browser at a chosen site location.
* shows files and folders in the dialog search result.
*
* @returns Information about the selected file(s)
*/
openFileBrowseDialogBySite() {
return this.siteService
.getSites()
.pipe(switchMap((response) => this.openFileBrowseDialogByFolderId(response.list.entries[0].entry.guid)));
}
/**
* Opens a file browser at a default myFile location.
* shows files and folders in the dialog search result.
*
* @returns Information about the selected file(s)
*/
openFileBrowseDialogByDefaultLocation() {
return this.openFileBrowseDialogByFolderId('-my-');
}
/**
* Opens a folder browser at a chosen site location.
*
* @returns Information about the selected folder(s)
*/
openFolderBrowseDialogBySite() {
return this.openFolderBrowseDialogByFolderId('-my-');
}
/**
* Opens a folder browser at a chosen folder location.
*
* @param folderNodeId ID of the folder to use
* @returns Information about the selected folder(s)
*/
openFolderBrowseDialogByFolderId(folderNodeId) {
return this.documentListService
.getFolderNode(folderNodeId)
.pipe(switchMap((node) => this.openUploadFolderDialog(NodeAction.CHOOSE, node.entry)));
}
/**
* Opens a dialog to copy or move an item to a new location.
*
* @param action Name of the action (eg, "Copy" or "Move") to show in the title
* @param contentEntry Item to be copied or moved
* @param permission Permission for the operation
* @param excludeSiteContent The site content that should be filtered out
* @returns Information about files that were copied/moved
*/
openCopyMoveDialog(action, contentEntry, permission, excludeSiteContent) {
if (this.contentService.hasAllowableOperations(contentEntry, permission)) {
const select = new Subject();
const data = {
title: this.getTitleTranslation(action, contentEntry.name),
actionName: action,
selectionMode: 'single',
currentFolderId: contentEntry.parentId,
imageResolver: this.imageResolver.bind(this),
where: '(isFolder=true)',
isSelectionValid: this.isCopyMoveSelectionValid.bind(this),
excludeSiteContent: excludeSiteContent || ContentNodeDialogService.nonDocumentSiteContent,
select
};
const dialogRef = this.openContentNodeDialog(data, 'adf-content-node-selector-dialog', '630px');
dialogRef.afterClosed().subscribe({ next: () => select.complete() });
return select;
}
else {
const errors = new Error(JSON.stringify({ error: { statusCode: 403 } }));
return throwError(errors);
}
}
/**
* Gets the translation of the dialog title.
*
* @param action Name of the action to display in the dialog title
* @param name Name of the item on which the action is being performed
* @returns Translated version of the title
*/
getTitleTranslation(action, name) {
return this.translation.instant(`NODE_SELECTOR.${action.toUpperCase()}_ITEM`, { name });
}
/**
* Opens a dialog to choose folders to upload.
*
* @param action Name of the action to show in the title
* @param contentEntry Item to upload
* @returns Information about the chosen folder(s)
*/
openUploadFolderDialog(action, contentEntry) {
const select = new Subject();
const data = {
title: this.getTitleTranslation(action, this.translation.instant('DROPDOWN.MY_FILES_OPTION')),
actionName: action,
selectionMode: 'single',
currentFolderId: contentEntry.id,
imageResolver: this.imageResolver.bind(this),
isSelectionValid: this.hasAllowableOperationsOnNodeFolder.bind(this),
where: '(isFolder=true)',
select
};
const dialogRef = this.openContentNodeDialog(data, 'adf-content-node-selector-dialog', '630px');
dialogRef.afterClosed().subscribe({ next: () => select.complete() });
return select;
}
/**
* Opens a dialog to choose a file to upload.
*
* @param action Name of the action to show in the title
* @param contentEntry Item to upload
* @param showFilesInResult Show files in dialog search result
* @returns Information about the chosen file(s)
*/
openUploadFileDialog(action, contentEntry, showFilesInResult = false) {
const select = new Subject();
const data = {
title: this.getTitleTranslation(action, this.translation.instant('DROPDOWN.MY_FILES_OPTION')),
actionName: action,
selectionMode: 'single',
currentFolderId: contentEntry.id,
imageResolver: this.imageResolver.bind(this),
isSelectionValid: (entry) => entry.isFile,
select,
showFilesInResult
};
const dialogRef = this.openContentNodeDialog(data, 'adf-content-node-selector-dialog', '630px');
dialogRef.afterClosed().subscribe({ next: () => select.complete() });
return select;
}
openContentNodeDialog(data, panelClass, width) {
return this.dialog.open(ContentNodeSelectorComponent, {
data,
panelClass,
width,
disableClose: true
});
}
imageResolver(row) {
const entry = row.node.entry;
if (!this.contentService.hasAllowableOperations(entry, 'create')) {
if (this.isNodeFolder(entry)) {
return this.thumbnailService.getMimeTypeIcon('disable/folder');
}
}
return null;
}
hasAllowableOperationsOnNodeFolder(entry) {
return this.isNodeFolder(entry) && this.contentService.hasAllowableOperations(entry, 'create');
}
isNodeFolder(entry) {
return entry.isFolder;
}
isCopyMoveSelectionValid(entry) {
return this.hasEntityCreatePermission(entry) && !this.isSite(entry);
}
hasEntityCreatePermission(entry) {
return this.contentService.hasAllowableOperations(entry, 'create');
}
isSite(entry) {
return !!entry.guid || entry.nodeType === 'st:site' || entry.nodeType === 'st:sites';
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: ContentNodeDialogService, deps: [{ token: i1.MatDialog }, { token: i2.ContentService }, { token: i3.DocumentListService }, { token: i4.SitesService }, { token: i5.TranslationService }, { token: i5.ThumbnailService }], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: ContentNodeDialogService, providedIn: 'root' }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: ContentNodeDialogService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root'
}]
}], ctorParameters: () => [{ type: i1.MatDialog }, { type: i2.ContentService }, { type: i3.DocumentListService }, { type: i4.SitesService }, { type: i5.TranslationService }, { type: i5.ThumbnailService }], propDecorators: { error: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGVudC1ub2RlLWRpYWxvZy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGliL2NvbnRlbnQtc2VydmljZXMvc3JjL2xpYi9jb250ZW50LW5vZGUtc2VsZWN0b3IvY29udGVudC1ub2RlLWRpYWxvZy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBRSxTQUFTLEVBQWdCLE1BQU0sMEJBQTBCLENBQUM7QUFDbkUsT0FBTyxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzFFLE9BQU8sRUFBRSxPQUFPLEVBQWMsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXZELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQ3JGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUVwRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxpREFBaUQsQ0FBQztBQUN0RixPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUVqRixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFDdEUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDaEYsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQzs7Ozs7OztBQUtoRSxrRUFBa0U7QUFDbEUsTUFBTSxPQUFPLHdCQUF3QjthQUMxQiwyQkFBc0IsR0FBRyxDQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLGFBQWEsRUFBRSxP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IEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgwqkgMjAwNS0yMDI1IEh5bGFuZCBTb2Z0d2FyZSwgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IE1hdERpYWxvZywgTWF0RGlhbG9nUmVmIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciwgSW5qZWN0YWJsZSwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUaHVtYm5haWxTZXJ2aWNlLCBUcmFuc2xhdGlvblNlcnZpY2UgfSBmcm9tICdAYWxmcmVzY28vYWRmLWNvcmUnO1xuaW1wb3J0IHsgU3ViamVjdCwgT2JzZXJ2YWJsZSwgdGhyb3dFcnJvciB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgU2hhcmVEYXRhUm93IH0gZnJvbSAnLi4vZG9jdW1lbnQtbGlzdC9kYXRhL3NoYXJlLWRhdGEtcm93Lm1vZGVsJztcbmltcG9ydCB7IEFsbG93YWJsZU9wZXJhdGlvbnNFbnVtIH0gZnJvbSAnLi4vY29tbW9uL21vZGVscy9hbGxvd2FibGUtb3BlcmF0aW9ucy5lbnVtJztcbmltcG9ydCB7IENvbnRlbnRTZXJ2aWNlIH0gZnJvbSAnLi4vY29tbW9uL3NlcnZpY2VzL2NvbnRlbnQuc2VydmljZSc7XG5pbXBvcnQgeyBOb2RlLCBOb2RlRW50cnksIFNpdGVQYWdpbmcgfSBmcm9tICdAYWxmcmVzY28vanMtYXBpJztcbmltcG9ydCB7IERvY3VtZW50TGlzdFNlcnZpY2UgfSBmcm9tICcuLi9kb2N1bWVudC1saXN0L3NlcnZpY2VzL2RvY3VtZW50LWxpc3Quc2VydmljZSc7XG5pbXBvcnQgeyBDb250ZW50Tm9kZVNlbGVjdG9yQ29tcG9uZW50IH0gZnJvbSAnLi9jb250ZW50LW5vZGUtc2VsZWN0b3IuY29tcG9uZW50JztcbmltcG9ydCB7IENvbnRlbnROb2RlU2VsZWN0b3JDb21wb25lbnREYXRhIH0gZnJvbSAnLi9jb250ZW50LW5vZGUtc2VsZWN0b3IuY29tcG9uZW50LWRhdGEuaW50ZXJmYWNlJztcbmltcG9ydCB7IE5vZGVBY3Rpb24gfSBmcm9tICcuLi9kb2N1bWVudC1saXN0L21vZGVscy9ub2RlLWFjdGlvbi5lbnVtJztcbmltcG9ydCB7IE5vZGVMb2NrRGlhbG9nQ29tcG9uZW50IH0gZnJvbSAnLi4vZGlhbG9ncy9ub2RlLWxvY2svbm9kZS1sb2NrLmRpYWxvZyc7XG5pbXBvcnQgeyBzd2l0Y2hNYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBTaXRlc1NlcnZpY2UgfSBmcm9tICcuLi9jb21tb24vc2VydmljZXMvc2l0ZXMuc2VydmljZSc7XG5cbkBJbmplY3RhYmxlKHtcbiAgICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L2RpcmVjdGl2ZS1jbGFzcy1zdWZmaXhcbmV4cG9ydCBjbGFzcyBDb250ZW50Tm9kZURpYWxvZ1NlcnZpY2Uge1xuICAgIHN0YXRpYyBub25Eb2N1bWVudFNpdGVDb250ZW50ID0gWydibG9nJywgJ2NhbGVuZGFyJywgJ2RhdGFMaXN0cycsICdkaXNjdXNzaW9ucycsICdsaW5rcycsICd3aWtpJ107XG5cbiAgICAvKiogRW1pdHRlZCB3aGVuIGFuIGVycm9yIG9jY3Vycy4gKi9cbiAgICBAT3V0cHV0KClcbiAgICBlcnJvcjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIGRpYWxvZzogTWF0RGlhbG9nLFxuICAgICAgICBwcml2YXRlIGNvbnRlbnRTZXJ2aWNlOiBDb250ZW50U2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBkb2N1bWVudExpc3RTZXJ2aWNlOiBEb2N1bWVudExpc3RTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHNpdGVTZXJ2aWNlOiBTaXRlc1NlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgdHJhbnNsYXRpb246IFRyYW5zbGF0aW9uU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSB0aHVtYm5haWxTZXJ2aWNlOiBUaHVtYm5haWxTZXJ2aWNlXG4gICAgKSB7fVxuXG4gICAgLyoqXG4gICAgICogT3BlbnMgYSBmaWxlIGJyb3dzZXIgYXQgYSBjaG9zZW4gZm9sZGVyIGxvY2F0aW9uLlxuICAgICAqIHNob3dzIGZpbGVzIGFuZCBmb2xkZXJzIGluIHRoZSBkaWFsb2cgc2VhcmNoIHJlc3VsdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBmb2xkZXJOb2RlSWQgSUQgb2YgdGhlIGZvbGRlciB0byB1c2VcbiAgICAgKiBAcmV0dXJucyBJbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VsZWN0ZWQgZmlsZShzKVxuICAgICAqL1xuICAgIG9wZW5GaWxlQnJvd3NlRGlhbG9nQnlGb2xkZXJJZChmb2xkZXJOb2RlSWQ6IHN0cmluZyk6IE9ic2VydmFibGU8Tm9kZVtdPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmRvY3VtZW50TGlzdFNlcnZpY2VcbiAgICAgICAgICAgIC5nZXRGb2xkZXJOb2RlKGZvbGRlck5vZGVJZClcbiAgICAgICAgICAgIC5waXBlKHN3aXRjaE1hcCgobm9kZUVudHJ5OiBOb2RlRW50cnkpID0+IHRoaXMub3BlblVwbG9hZEZpbGVEaWFsb2coTm9kZUFjdGlvbi5DSE9PU0UsIG5vZGVFbnRyeS5lbnRyeSwgdHJ1ZSkpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPcGVucyBhIGxvY2sgbm9kZSBkaWFsb2cuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY29udGVudEVudHJ5IE5vZGUgdG8gbG9ja1xuICAgICAqIEByZXR1cm5zIEVycm9yL3N0YXR1cyBtZXNzYWdlIChpZiBhbnkpXG4gICAgICovXG4gICAgcHVibGljIG9wZW5Mb2NrTm9kZURpYWxvZyhjb250ZW50RW50cnk6IE5vZGUpOiBTdWJqZWN0PHN0cmluZz4ge1xuICAgICAgICBjb25zdCBvYnNlcnZhYmxlOiBTdWJqZWN0PHN0cmluZz4gPSBuZXcgU3ViamVjdDxzdHJpbmc+KCk7XG5cbiAgICAgICAgaWYgKHRoaXMuY29udGVudFNlcnZpY2UuaGFzQWxsb3dhYmxlT3BlcmF0aW9ucyhjb250ZW50RW50cnksIEFsbG93YWJsZU9wZXJhdGlvbnNFbnVtLkxPQ0spKSB7XG4gICAgICAgICAgICB0aGlzLmRpYWxvZy5vcGVuKE5vZGVMb2NrRGlhbG9nQ29tcG9uZW50LCB7XG4gICAgICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgICAgICBub2RlOiBjb250ZW50RW50cnksXG4gICAgICAgICAgICAgICAgICAgIG9uRXJyb3I6IChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lcnJvci5lbWl0KGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9ic2VydmFibGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB3aWR0aDogJzQwMHB4J1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBvYnNlcnZhYmxlLmVycm9yKCdPUEVSQVRJT04uRkFJTC5OT0RFLk5PX1BFUk1JU1NJT04nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvYnNlcnZhYmxlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE9wZW5zIGEgZmlsZSBicm93c2VyIGF0IGEgY2hvc2VuIHNpdGUgbG9jYXRpb24uXG4gICAgICogc2hvd3MgZmlsZXMgYW5kIGZvbGRlcnMgaW4gdGhlIGRpYWxvZyBzZWFyY2ggcmVzdWx0LlxuICAgICAqXG4gICAgICogQHJldHVybnMgSW5mb3JtYXRpb24gYWJvdXQgdGhlIHNlbGVjdGVkIGZpbGUocylcbiAgICAgKi9cbiAgICBvcGVuRmlsZUJyb3dzZURpYWxvZ0J5U2l0ZSgpOiBPYnNlcnZhYmxlPE5vZGVbXT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zaXRlU2VydmljZVxuICAgICAgICAgICAgLmdldFNpdGVzKClcbiAgICAgICAgICAgIC5waXBlKHN3aXRjaE1hcCgocmVzcG9uc2U6IFNpdGVQYWdpbmcpID0+IHRoaXMub3BlbkZpbGVCcm93c2VEaWFsb2dCeUZvbGRlcklkKHJlc3BvbnNlLmxpc3QuZW50cmllc1swXS5lbnRyeS5ndWlkKSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE9wZW5zIGEgZmlsZSBicm93c2VyIGF0IGEgZGVmYXVsdCBteUZpbGUgbG9jYXRpb24uXG4gICAgICogc2hvd3MgZmlsZXMgYW5kIGZvbGRlcnMgaW4gdGhlIGRpYWxvZyBzZWFyY2ggcmVzdWx0LlxuICAgICAqXG4gICAgICogQHJldHVybnMgSW5mb3JtYXRpb24gYWJvdXQgdGhlIHNlbGVjdGVkIGZpbGUocylcbiAgICAgKi9cbiAgICBvcGVuRmlsZUJyb3dzZURpYWxvZ0J5RGVmYXVsdExvY2F0aW9uKCk6IE9ic2VydmFibGU8Tm9kZVtdPiB7XG4gICAgICAgIHJldHVybiB0aGlzLm9wZW5GaWxlQnJvd3NlRGlhbG9nQnlGb2xkZXJJZCgnLW15LScpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE9wZW5zIGEgZm9sZGVyIGJyb3dzZXIgYXQgYSBjaG9zZW4gc2l0ZSBsb2NhdGlvbi5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIEluZm9ybWF0aW9uIGFib3V0IHRoZSBzZWxlY3RlZCBmb2xkZXIocylcbiAgICAgKi9cbiAgICBvcGVuRm9sZGVyQnJvd3NlRGlhbG9nQnlTaXRlKCk6IE9ic2VydmFibGU8Tm9kZVtdPiB7XG4gICAgICAgIHJldHVybiB0aGlzLm9wZW5Gb2xkZXJCcm93c2VEaWFsb2dCeUZvbGRlcklkKCctbXktJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT3BlbnMgYSBmb2xkZXIgYnJvd3NlciBhdCBhIGNob3NlbiBmb2xkZXIgbG9jYXRpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZm9sZGVyTm9kZUlkIElEIG9mIHRoZSBmb2xkZXIgdG8gdXNlXG4gICAgICogQHJldHVybnMgSW5mb3JtYXRpb24gYWJvdXQgdGhlIHNlbGVjdGVkIGZvbGRlcihzKVxuICAgICAqL1xuICAgIG9wZW5Gb2xkZXJCcm93c2VEaWFsb2dCeUZvbGRlcklkKGZvbGRlck5vZGVJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxOb2RlW10+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZG9jdW1lbnRMaXN0U2VydmljZVxuICAgICAgICAgICAgLmdldEZvbGRlck5vZGUoZm9sZGVyTm9kZUlkKVxuICAgICAgICAgICAgLnBpcGUoc3dpdGNoTWFwKChub2RlOiBOb2RlRW50cnkpID0+IHRoaXMub3BlblVwbG9hZEZvbGRlckRpYWxvZyhOb2RlQWN0aW9uLkNIT09TRSwgbm9kZS5lbnRyeSkpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPcGVucyBhIGRpYWxvZyB0byBjb3B5IG9yIG1vdmUgYW4gaXRlbSB0byBhIG5ldyBsb2NhdGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBhY3Rpb24gTmFtZSBvZiB0aGUgYWN0aW9uIChlZywgXCJDb3B5XCIgb3IgXCJNb3ZlXCIpIHRvIHNob3cgaW4gdGhlIHRpdGxlXG4gICAgICogQHBhcmFtIGNvbnRlbnRFbnRyeSBJdGVtIHRvIGJlIGNvcGllZCBvciBtb3ZlZFxuICAgICAqIEBwYXJhbSBwZXJtaXNzaW9uIFBlcm1pc3Npb24gZm9yIHRoZSBvcGVyYXRpb25cbiAgICAgKiBAcGFyYW0gZXhjbHVkZVNpdGVDb250ZW50IFRoZSBzaXRlIGNvbnRlbnQgdGhhdCBzaG91bGQgYmUgZmlsdGVyZWQgb3V0XG4gICAgICogQHJldHVybnMgSW5mb3JtYXRpb24gYWJvdXQgZmlsZXMgdGhhdCB3ZXJlIGNvcGllZC9tb3ZlZFxuICAgICAqL1xuICAgIG9wZW5Db3B5TW92ZURpYWxvZyhhY3Rpb246IE5vZGVBY3Rpb24sIGNvbnRlbnRFbnRyeTogTm9kZSwgcGVybWlzc2lvbj86IHN0cmluZywgZXhjbHVkZVNpdGVDb250ZW50Pzogc3RyaW5nW10pOiBPYnNlcnZhYmxlPE5vZGVbXT4ge1xuICAgICAgICBpZiAodGhpcy5jb250ZW50U2VydmljZS5oYXNBbGxvd2FibGVPcGVyYXRpb25zKGNvbnRlbnRFbnRyeSwgcGVybWlzc2lvbikpIHtcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdCA9IG5ldyBTdWJqZWN0PE5vZGVbXT4oKTtcblxuICAgICAgICAgICAgY29uc3QgZGF0YTogQ29udGVudE5vZGVTZWxlY3RvckNvbXBvbmVudERhdGEgPSB7XG4gICAgICAgICAgICAgICAgdGl0bGU6IHRoaXMuZ2V0VGl0bGVUcmFuc2xhdGlvbihhY3Rpb24sIGNvbnRlbnRFbnRyeS5uYW1lKSxcbiAgICAgICAgICAgICAgICBhY3Rpb25OYW1lOiBhY3Rpb24sXG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uTW9kZTogJ3NpbmdsZScsXG4gICAgICAgICAgICAgICAgY3VycmVudEZvbGRlcklkOiBjb250ZW50RW50cnkucGFyZW50SWQsXG4gICAgICAgICAgICAgICAgaW1hZ2VSZXNvbHZlcjogdGhpcy5pbWFnZVJlc29sdmVyLmJpbmQodGhpcyksXG4gICAgICAgICAgICAgICAgd2hlcmU6ICcoaXNGb2xkZXI9dHJ1ZSknLFxuICAgICAgICAgICAgICAgIGlzU2VsZWN0aW9uVmFsaWQ6IHRoaXMuaXNDb3B5TW92ZVNlbGVjdGlvblZhbGlkLmJpbmQodGhpcyksXG4gICAgICAgICAgICAgICAgZXhjbHVkZVNpdGVDb250ZW50OiBleGNsdWRlU2l0ZUNvbnRlbnQgfHwgQ29udGVudE5vZGVEaWFsb2dTZXJ2aWNlLm5vbkRvY3VtZW50U2l0ZUNvbnRlbnQsXG4gICAgICAgICAgICAgICAgc2VsZWN0XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLm9wZW5Db250ZW50Tm9kZURpYWxvZyhkYXRhLCAnYWRmLWNvbnRlbnQtbm9kZS1zZWxlY3Rvci1kaWFsb2cnLCAnNjMwcHgnKTtcbiAgICAgICAgICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSh7IG5leHQ6ICgpID0+IHNlbGVjdC5jb21wbGV0ZSgpIH0pO1xuXG4gICAgICAgICAgICByZXR1cm4gc2VsZWN0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZXJyb3JzID0gbmV3IEVycm9yKEpTT04uc3RyaW5naWZ5KHsgZXJyb3I6IHsgc3RhdHVzQ29kZTogNDAzIH0gfSkpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoZXJyb3JzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHRyYW5zbGF0aW9uIG9mIHRoZSBkaWFsb2cgdGl0bGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYWN0aW9uIE5hbWUgb2YgdGhlIGFjdGlvbiB0byBkaXNwbGF5IGluIHRoZSBkaWFsb2cgdGl0bGVcbiAgICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBpdGVtIG9uIHdoaWNoIHRoZSBhY3Rpb24gaXMgYmVpbmcgcGVyZm9ybWVkXG4gICAgICogQHJldHVybnMgVHJhbnNsYXRlZCB2ZXJzaW9uIG9mIHRoZSB0aXRsZVxuICAgICAqL1xuICAgIGdldFRpdGxlVHJhbnNsYXRpb24oYWN0aW9uOiBzdHJpbmcsIG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnRyYW5zbGF0aW9uLmluc3RhbnQoYE5PREVfU0VMRUNUT1IuJHthY3Rpb24udG9VcHBlckNhc2UoKX1fSVRFTWAsIHsgbmFtZSB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPcGVucyBhIGRpYWxvZyB0byBjaG9vc2UgZm9sZGVycyB0byB1cGxvYWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYWN0aW9uIE5hbWUgb2YgdGhlIGFjdGlvbiB0byBzaG93IGluIHRoZSB0aXRsZVxuICAgICAqIEBwYXJhbSBjb250ZW50RW50cnkgIEl0ZW0gdG8gdXBsb2FkXG4gICAgICogQHJldHVybnMgSW5mb3JtYXRpb24gYWJvdXQgdGhlIGNob3NlbiBmb2xkZXIocylcbiAgICAgKi9cbiAgICBvcGVuVXBsb2FkRm9sZGVyRGlhbG9nKGFjdGlvbjogTm9kZUFjdGlvbiwgY29udGVudEVudHJ5OiBOb2RlKTogT2JzZXJ2YWJsZTxOb2RlW10+IHtcbiAgICAgICAgY29uc3Qgc2VsZWN0ID0gbmV3IFN1YmplY3Q8Tm9kZVtdPigpO1xuXG4gICAgICAgIGNvbnN0IGRhdGE6IENvbnRlbnROb2RlU2VsZWN0b3JDb21wb25lbnREYXRhID0ge1xuICAgICAgICAgICAgdGl0bGU6IHRoaXMuZ2V0VGl0bGVUcmFuc2xhdGlvbihhY3Rpb24sIHRoaXMudHJhbnNsYXRpb24uaW5zdGFudCgnRFJPUERPV04uTVlfRklMRVNfT1BUSU9OJykpLFxuICAgICAgICAgICAgYWN0aW9uTmFtZTogYWN0aW9uLFxuICAgICAgICAgICAgc2VsZWN0aW9uTW9kZTogJ3NpbmdsZScsXG4gICAgICAgICAgICBjdXJyZW50Rm9sZGVySWQ6IGNvbnRlbnRFbnRyeS5pZCxcbiAgICAgICAgICAgIGltYWdlUmVzb2x2ZXI6IHRoaXMuaW1hZ2VSZXNvbHZlci5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgaXNTZWxlY3Rpb25WYWxpZDogdGhpcy5oYXNBbGxvd2FibGVPcGVyYXRpb25zT25Ob2RlRm9sZGVyLmJpbmQodGhpcyksXG4gICAgICAgICAgICB3aGVyZTogJyhpc0ZvbGRlcj10cnVlKScsXG4gICAgICAgICAgICBzZWxlY3RcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLm9wZW5Db250ZW50Tm9kZURpYWxvZyhkYXRhLCAnYWRmLWNvbnRlbnQtbm9kZS1zZWxlY3Rvci1kaWFsb2cnLCAnNjMwcHgnKTtcbiAgICAgICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKHsgbmV4dDogKCkgPT4gc2VsZWN0LmNvbXBsZXRlKCkgfSk7XG5cbiAgICAgICAgcmV0dXJuIHNlbGVjdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPcGVucyBhIGRpYWxvZyB0byBjaG9vc2UgYSBmaWxlIHRvIHVwbG9hZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBhY3Rpb24gTmFtZSBvZiB0aGUgYWN0aW9uIHRvIHNob3cgaW4gdGhlIHRpdGxlXG4gICAgICogQHBhcmFtIGNvbnRlbnRFbnRyeSBJdGVtIHRvIHVwbG9hZFxuICAgICAqIEBwYXJhbSBzaG93RmlsZXNJblJlc3VsdCBTaG93IGZpbGVzIGluIGRpYWxvZyBzZWFyY2ggcmVzdWx0XG4gICAgICogQHJldHVybnMgSW5mb3JtYXRpb24gYWJvdXQgdGhlIGNob3NlbiBmaWxlKHMpXG4gICAgICovXG4gICAgb3BlblVwbG9hZEZpbGVEaWFsb2coYWN0aW9uOiBOb2RlQWN0aW9uLCBjb250ZW50RW50cnk6IE5vZGUsIHNob3dGaWxlc0luUmVzdWx0ID0gZmFsc2UpOiBPYnNlcnZhYmxlPE5vZGVbXT4ge1xuICAgICAgICBjb25zdCBzZWxlY3QgPSBuZXcgU3ViamVjdDxOb2RlW10+KCk7XG5cbiAgICAgICAgY29uc3QgZGF0YTogQ29udGVudE5vZGVTZWxlY3RvckNvbXBvbmVudERhdGEgPSB7XG4gICAgICAgICAgICB0aXRsZTogdGhpcy5nZXRUaXRsZVRyYW5zbGF0aW9uKGFjdGlvbiwgdGhpcy50cmFuc2xhdGlvbi5pbnN0YW50KCdEUk9QRE9XTi5NWV9GSUxFU19PUFRJT04nKSksXG4gICAgICAgICAgICBhY3Rpb25OYW1lOiBhY3Rpb24sXG4gICAgICAgICAgICBzZWxlY3Rpb25Nb2RlOiAnc2luZ2xlJyxcbiAgICAgICAgICAgIGN1cnJlbnRGb2xkZXJJZDogY29udGVudEVudHJ5LmlkLFxuICAgICAgICAgICAgaW1hZ2VSZXNvbHZlcjogdGhpcy5pbWFnZVJlc29sdmVyLmJpbmQodGhpcyksXG4gICAgICAgICAgICBpc1NlbGVjdGlvblZhbGlkOiAoZW50cnk6IE5vZGUpID0+IGVudHJ5LmlzRmlsZSxcbiAgICAgICAgICAgIHNlbGVjdCxcbiAgICAgICAgICAgIHNob3dGaWxlc0luUmVzdWx0XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5vcGVuQ29udGVudE5vZGVEaWFsb2coZGF0YSwgJ2FkZi1jb250ZW50LW5vZGUtc2VsZWN0b3ItZGlhbG9nJywgJzYzMHB4Jyk7XG4gICAgICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSh7IG5leHQ6ICgpID0+IHNlbGVjdC5jb21wbGV0ZSgpIH0pO1xuXG4gICAgICAgIHJldHVybiBzZWxlY3Q7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvcGVuQ29udGVudE5vZGVEaWFsb2coXG4gICAgICAgIGRhdGE6IENvbnRlbnROb2RlU2VsZWN0b3JDb21wb25lbnREYXRhLFxuICAgICAgICBwYW5lbENsYXNzOiBzdHJpbmcsXG4gICAgICAgIHdpZHRoOiBzdHJpbmdcbiAgICApOiBNYXREaWFsb2dSZWY8Q29udGVudE5vZGVTZWxlY3RvckNvbXBvbmVudD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5kaWFsb2cub3BlbihDb250ZW50Tm9kZVNlbGVjdG9yQ29tcG9uZW50LCB7XG4gICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgcGFuZWxDbGFzcyxcbiAgICAgICAgICAgIHdpZHRoLFxuICAgICAgICAgICAgZGlzYWJsZUNsb3NlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgaW1hZ2VSZXNvbHZlcihyb3c6IFNoYXJlRGF0YVJvdyk6IHN0cmluZyB8IG51bGwge1xuICAgICAgICBjb25zdCBlbnRyeTogTm9kZSA9IHJvdy5ub2RlLmVudHJ5O1xuICAgICAgICBpZiAoIXRoaXMuY29udGVudFNlcnZpY2UuaGFzQWxsb3dhYmxlT3BlcmF0aW9ucyhlbnRyeSwgJ2NyZWF0ZScpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pc05vZGVGb2xkZXIoZW50cnkpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudGh1bWJuYWlsU2VydmljZS5nZXRNaW1lVHlwZUljb24oJ2Rpc2FibGUvZm9sZGVyJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGhhc0FsbG93YWJsZU9wZXJhdGlvbnNPbk5vZGVGb2xkZXIoZW50cnk6IE5vZGUpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNOb2RlRm9sZGVyKGVudHJ5KSAmJiB0aGlzLmNvbnRlbnRTZXJ2aWNlLmhhc0FsbG93YWJsZU9wZXJhdGlvbnMoZW50cnksICdjcmVhdGUnKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzTm9kZUZvbGRlcihlbnRyeTogTm9kZSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gZW50cnkuaXNGb2xkZXI7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc0NvcHlNb3ZlU2VsZWN0aW9uVmFsaWQoZW50cnk6IE5vZGUpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGFzRW50aXR5Q3JlYXRlUGVybWlzc2lvbihlbnRyeSkgJiYgIXRoaXMuaXNTaXRlKGVudHJ5KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGhhc0VudGl0eUNyZWF0ZVBlcm1pc3Npb24oZW50cnk6IE5vZGUpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGVudFNlcnZpY2UuaGFzQWxsb3dhYmxlT3BlcmF0aW9ucyhlbnRyeSwgJ2NyZWF0ZScpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNTaXRlKGVudHJ5KSB7XG4gICAgICAgIHJldHVybiAhIWVudHJ5Lmd1aWQgfHwgZW50cnkubm9kZVR5cGUgPT09ICdzdDpzaXRlJyB8fCBlbnRyeS5ub2RlVHlwZSA9PT0gJ3N0OnNpdGVzJztcbiAgICB9XG59XG4iXX0=