gentics-ui-core
Version:
This is the common core framework for the Gentics CMS and Mesh UI, and other Angular applications.
219 lines • 28.6 kB
JavaScript
import { Directive, ElementRef, EventEmitter, Inject, Input, NgZone } from '@angular/core';
import { InjectionToken, Optional, Output } from '@angular/core';
import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';
import { clientReportsMimeTypesOnDrag, getDataTransfer, transferHasFiles } from './drag-drop-utils';
import { DragStateTrackerFactory } from './drag-state-tracker.service';
import { matchesMimeType } from './matches-mime-type';
import { PageFileDragHandler } from './page-file-drag-handler.service';
import * as i0 from "@angular/core";
import * as i1 from "./page-file-drag-handler.service";
import * as i2 from "./drag-state-tracker.service";
const defaultOptions = {
accept: '*',
disabled: false,
multiple: true
};
/**
* A token that can be used to inject a mock into the directive
* @internal
*/
export const FILE_DROPAREA_DRAG_EVENT_TARGET = new InjectionToken('FILE_DROPAREA_DRAG_EVENT_TARGET');
/**
* File upload area that accepts files via drag and drop.
*
* ```html
* <gtx-file-drop-area (fileDrop)="files = $event">Upload files via drag & drop</gtx-file-drop-area>
* <div gtx-file-drop-area (fileDrop)="files = $event">Upload files via drag & drop</div>
* ```
*/
export class FileDropArea {
constructor(elementRef, dragEventTarget, pageDrag, fileDrag, zone) {
this.pageDrag = pageDrag;
this.fileDrag = fileDrag;
/**
* Fires when a file or files are dragged over the drop area.
*/
this.fileDragEnter = new EventEmitter();
/**
* Fires when a file or files are dragged out of the drop area.
*/
this.fileDragLeave = new EventEmitter();
/**
* Fires when a file or files are dropped on the drop area.
*/
this.fileDrop = new EventEmitter();
/**
* Fires when a file or files which do not match the "accepted" option
* are dropped on the drop area.
*/
this.fileDropReject = new EventEmitter();
/**
* Fires when a file or files are dragged into the page.
*/
this.pageDragEnter = new EventEmitter();
/**
* Fires when a file or files is dragged out of the page.
*/
this.pageDragLeave = new EventEmitter();
this._draggedFiles = [];
this._isDraggedOver = false;
this._isPageDraggedOver = false;
this._filesDraggedInPage = [];
this._options = defaultOptions;
this._subscriptions = [];
this.accepts = (file) => {
return !clientReportsMimeTypesOnDrag() || matchesMimeType(file.type, this._options.accept);
};
this.onDragEnterOver = (event) => {
let transfer = getDataTransfer(event);
if (!transferHasFiles(transfer)) {
return;
}
if (this._isDraggedOver && !this._options.disabled) {
transfer.dropEffect = 'copy';
}
else {
transfer.dropEffect = 'none';
transfer.effectAllowed = 'none';
}
event.preventDefault();
};
this.onDrop = (event) => {
let transfer = getDataTransfer(event);
if (event.defaultPrevented || !transferHasFiles(transfer) || this._options.disabled) {
return;
}
event.preventDefault();
transfer.dropEffect = 'copy';
let files = Array.from(transfer.files);
let acceptedFiles = [];
let rejectedFiles = [];
// Check if the dropped files match the "accept" option
for (let file of files) {
if (matchesMimeType(file.type, this._options.accept)) {
acceptedFiles.push(file);
}
else {
rejectedFiles.push(file);
}
}
if (acceptedFiles.length > 0) {
this.fileDrop.emit(acceptedFiles);
}
if (rejectedFiles.length > 0) {
this.fileDropReject.emit(rejectedFiles);
}
};
this._eventTarget = dragEventTarget || elementRef.nativeElement;
this.draggedFiles$ = fileDrag.trackElement(this._eventTarget).pipe(map(files => files.filter(this.accepts)));
this.filesDraggedInPage$ = pageDrag.filesDragged$.pipe(map(files => files.filter(this.accepts)));
this._subscriptions = [
this.draggedFiles$.subscribe(files => {
zone.runGuarded(() => {
this._isDraggedOver = files.length > 0;
this._draggedFiles = files;
if (files.length > 0) {
this.fileDragEnter.emit(files);
}
else {
this.fileDragLeave.emit(undefined);
}
});
}),
this.filesDraggedInPage$.subscribe(filesInPage => {
zone.runGuarded(() => {
this._isPageDraggedOver = filesInPage.length > 0;
this._filesDraggedInPage = filesInPage;
if (filesInPage.length > 0) {
this.pageDragEnter.emit(filesInPage);
}
else {
this.pageDragLeave.emit(undefined);
}
});
})
];
}
/**
* Returns true if an accepted file is dragged on the drop area.
*/
get dragHovered() {
return this._isDraggedOver;
}
/**
* Returns a list of mime types of accepted files dragged over the drop area.
*/
get draggedFiles() {
return this._draggedFiles;
}
/**
* Returns true if an accepted file is dragged on the page.
*/
get pageDragHovered() {
return this._isPageDraggedOver;
}
/**
* If accepted files are dragged inside the current page / browser tab,
* returns a list of the dragged file types, `undefined` otherwise.
*/
get filesDraggedInPage() {
return this._filesDraggedInPage;
}
/**
* Sets options of this drop area.
*/
get options() {
return this._options;
}
set options(options) {
this._options = Object.freeze(Object.assign({}, defaultOptions, options));
}
ngOnInit() {
this._eventTarget.addEventListener('dragenter', this.onDragEnterOver);
this._eventTarget.addEventListener('dragover', this.onDragEnterOver);
this._eventTarget.addEventListener('drop', this.onDrop);
}
ngOnDestroy() {
this._subscriptions.forEach(s => s.unsubscribe());
this._eventTarget.removeEventListener('dragenter', this.onDragEnterOver);
this._eventTarget.removeEventListener('dragover', this.onDragEnterOver);
this._eventTarget.removeEventListener('drop', this.onDrop);
this.pageDrag.destroy();
}
}
/** @nocollapse */ FileDropArea.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: FileDropArea, deps: [{ token: i0.ElementRef }, { token: FILE_DROPAREA_DRAG_EVENT_TARGET, optional: true }, { token: i1.PageFileDragHandler }, { token: i2.DragStateTrackerFactory }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Directive });
/** @nocollapse */ FileDropArea.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.3.8", type: FileDropArea, selector: "gtx-file-drop-area, [gtxFileDropArea]", inputs: { options: ["gtxFileDropArea", "options"] }, outputs: { draggedFiles$: "draggedFiles$", filesDraggedInPage$: "filesDraggedInPage$", fileDragEnter: "fileDragEnter", fileDragLeave: "fileDragLeave", fileDrop: "fileDrop", fileDropReject: "fileDropReject", pageDragEnter: "pageDragEnter", pageDragLeave: "pageDragLeave" }, providers: [DragStateTrackerFactory, PageFileDragHandler], exportAs: ["gtxFileDropArea"], ngImport: i0 });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: FileDropArea, decorators: [{
type: Directive,
args: [{
selector: 'gtx-file-drop-area, [gtxFileDropArea]',
exportAs: 'gtxFileDropArea',
providers: [DragStateTrackerFactory, PageFileDragHandler]
}]
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: undefined, decorators: [{
type: Optional
}, {
type: Inject,
args: [FILE_DROPAREA_DRAG_EVENT_TARGET]
}] }, { type: i1.PageFileDragHandler }, { type: i2.DragStateTrackerFactory }, { type: i0.NgZone }]; }, propDecorators: { options: [{
type: Input,
args: ['gtxFileDropArea']
}], draggedFiles$: [{
type: Output
}], filesDraggedInPage$: [{
type: Output
}], fileDragEnter: [{
type: Output
}], fileDragLeave: [{
type: Output
}], fileDrop: [{
type: Output
}], fileDropReject: [{
type: Output
}], pageDragEnter: [{
type: Output
}], pageDragLeave: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS1kcm9wLWFyZWEuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvZmlsZS1kcm9wLWFyZWEvZmlsZS1kcm9wLWFyZWEuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN6RixPQUFPLEVBQUMsY0FBYyxFQUFxQixRQUFRLEVBQUUsTUFBTSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ2xGLE9BQU8sRUFBQyxVQUFVLEVBQWUsTUFBTSxNQUFNLENBQUM7QUFDOUMsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRW5DLE9BQU8sRUFBQyw0QkFBNEIsRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUNsRyxPQUFPLEVBQUMsdUJBQXVCLEVBQWdCLE1BQU0sOEJBQThCLENBQUM7QUFDcEYsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQ3BELE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLGtDQUFrQyxDQUFDOzs7O0FBd0JyRSxNQUFNLGNBQWMsR0FBeUI7SUFDekMsTUFBTSxFQUFFLEdBQUc7SUFDWCxRQUFRLEVBQUUsS0FBSztJQUNmLFFBQVEsRUFBRSxJQUFJO0NBQ2pCLENBQUM7QUFNRjs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSwrQkFBK0IsR0FBRyxJQUFJLGNBQWMsQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO0FBR3JHOzs7Ozs7O0dBT0c7QUFNSCxNQUFNLE9BQU8sWUFBWTtJQThGckIsWUFBWSxVQUFzQixFQUMrQixlQUFvQixFQUNqRSxRQUE2QixFQUM3QixRQUFpQyxFQUN6QyxJQUFZO1FBRkosYUFBUSxH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O2dCQUtHLGFBQWE7c0JBQXRCLE1BQU07Z0JBS0csUUFBUTtzQkFBakIsTUFBTTtnQkFNRyxjQUFjO3NCQUF2QixNQUFNO2dCQUtHLGFBQWE7c0JBQXRCLE1BQU07Z0JBS0csYUFBYTtzQkFBdEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7RGlyZWN0aXZlLCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIEluamVjdCwgSW5wdXQsIE5nWm9uZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0luamVjdGlvblRva2VuLCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3B0aW9uYWwsIE91dHB1dH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge09ic2VydmFibGUsIFN1YnNjcmlwdGlvbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQge21hcH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQge2NsaWVudFJlcG9ydHNNaW1lVHlwZXNPbkRyYWcsIGdldERhdGFUcmFuc2ZlciwgdHJhbnNmZXJIYXNGaWxlc30gZnJvbSAnLi9kcmFnLWRyb3AtdXRpbHMnO1xuaW1wb3J0IHtEcmFnU3RhdGVUcmFja2VyRmFjdG9yeSwgRmlsZURyYWdTdGF0ZX0gZnJvbSAnLi9kcmFnLXN0YXRlLXRyYWNrZXIuc2VydmljZSc7XG5pbXBvcnQge21hdGNoZXNNaW1lVHlwZX0gZnJvbSAnLi9tYXRjaGVzLW1pbWUtdHlwZSc7XG5pbXBvcnQge1BhZ2VGaWxlRHJhZ0hhbmRsZXJ9IGZyb20gJy4vcGFnZS1maWxlLWRyYWctaGFuZGxlci5zZXJ2aWNlJztcblxuZXhwb3J0IGludGVyZmFjZSBJRmlsZURyb3BBcmVhT3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIG1pbWUgdHlwZXMgYWNjZXB0ZWQgYnkgdGhlIGRyb3AgYXJlYS4gRGVmYXVsdHMgdG8gXCIqXCIuXG4gICAgICogU29tZSBtaW1lIHR5cGVzIHdpbGwgbm90IGJlIHJlcG9ydGVkIGJ5IHRoZSBjbGllbnQsIHRoZXkgZ2V0IG1hdGNoZWQgYXMgXCJ1bmtub3duL3Vua25vd25cIi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqICAgeyBhY2NlcHQ6ICdpbWFnZS8qLCAhaW1hZ2UvZ2lmJyB9XG4gICAgICogICB7IGFjY2VwdDogJ3RleHQvKicgfVxuICAgICAqICAgeyBhY2NlcHQ6ICd2aWRlby8qLCB1bmtub3duLyonIH1cbiAgICAgKi9cbiAgICBhY2NlcHQ/OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBTZXQgdG8gdHJ1ZSB0byBwcmV2ZW50IGludGVyYWN0aW9uIHdpdGggdGhlIGRyb3AgYXJlYS5cbiAgICAgKi9cbiAgICBkaXNhYmxlZD86IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBBbGxvdyBtdWx0aXBsZSBmaWxlcyB0byBiZSBkcm9wcGVkIG9uIHRoZSBkcm9wIGFyZWEuIERlZmF1bHRzIHRvIHRydWUuXG4gICAgICovXG4gICAgbXVsdGlwbGU/OiBib29sZWFuO1xufVxuXG5jb25zdCBkZWZhdWx0T3B0aW9uczogSUZpbGVEcm9wQXJlYU9wdGlvbnMgPSB7XG4gICAgYWNjZXB0OiAnKicsXG4gICAgZGlzYWJsZWQ6IGZhbHNlLFxuICAgIG11bHRpcGxlOiB0cnVlXG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIElEcmFnZ2VkRmlsZSB7XG4gICAgdHlwZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgdG9rZW4gdGhhdCBjYW4gYmUgdXNlZCB0byBpbmplY3QgYSBtb2NrIGludG8gdGhlIGRpcmVjdGl2ZVxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBGSUxFX0RST1BBUkVBX0RSQUdfRVZFTlRfVEFSR0VUID0gbmV3IEluamVjdGlvblRva2VuKCdGSUxFX0RST1BBUkVBX0RSQUdfRVZFTlRfVEFSR0VUJyk7XG5cblxuLyoqXG4gKiBGaWxlIHVwbG9hZCBhcmVhIHRoYXQgYWNjZXB0cyBmaWxlcyB2aWEgZHJhZyBhbmQgZHJvcC5cbiAqXG4gKiBgYGBodG1sXG4gKiA8Z3R4LWZpbGUtZHJvcC1hcmVhIChmaWxlRHJvcCk9XCJmaWxlcyA9ICRldmVudFwiPlVwbG9hZCBmaWxlcyB2aWEgZHJhZyAmIGRyb3A8L2d0eC1maWxlLWRyb3AtYXJlYT5cbiAqIDxkaXYgZ3R4LWZpbGUtZHJvcC1hcmVhIChmaWxlRHJvcCk9XCJmaWxlcyA9ICRldmVudFwiPlVwbG9hZCBmaWxlcyB2aWEgZHJhZyAmIGRyb3A8L2Rpdj5cbiAqIGBgYFxuICovXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogJ2d0eC1maWxlLWRyb3AtYXJlYSwgW2d0eEZpbGVEcm9wQXJlYV0nLFxuICAgIGV4cG9ydEFzOiAnZ3R4RmlsZURyb3BBcmVhJyxcbiAgICBwcm92aWRlcnM6IFtEcmFnU3RhdGVUcmFja2VyRmFjdG9yeSwgUGFnZUZpbGVEcmFnSGFuZGxlcl1cbn0pXG5leHBvcnQgY2xhc3MgRmlsZURyb3BBcmVhIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIGFuIGFjY2VwdGVkIGZpbGUgaXMgZHJhZ2dlZCBvbiB0aGUgZHJvcCBhcmVhLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZHJhZ0hvdmVyZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc0RyYWdnZWRPdmVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBsaXN0IG9mIG1pbWUgdHlwZXMgb2YgYWNjZXB0ZWQgZmlsZXMgZHJhZ2dlZCBvdmVyIHRoZSBkcm9wIGFyZWEuXG4gICAgICovXG4gICAgcHVibGljIGdldCBkcmFnZ2VkRmlsZXMoKTogRmlsZURyYWdTdGF0ZSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kcmFnZ2VkRmlsZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIGFuIGFjY2VwdGVkIGZpbGUgaXMgZHJhZ2dlZCBvbiB0aGUgcGFnZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHBhZ2VEcmFnSG92ZXJlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzUGFnZURyYWdnZWRPdmVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIElmIGFjY2VwdGVkIGZpbGVzIGFyZSBkcmFnZ2VkIGluc2lkZSB0aGUgY3VycmVudCBwYWdlIC8gYnJvd3NlciB0YWIsXG4gICAgICogcmV0dXJucyBhIGxpc3Qgb2YgdGhlIGRyYWdnZWQgZmlsZSB0eXBlcywgYHVuZGVmaW5lZGAgb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZmlsZXNEcmFnZ2VkSW5QYWdlKCk6IEZpbGVEcmFnU3RhdGUge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmlsZXNEcmFnZ2VkSW5QYWdlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgb3B0aW9ucyBvZiB0aGlzIGRyb3AgYXJlYS5cbiAgICAgKi9cbiAgICBASW5wdXQoJ2d0eEZpbGVEcm9wQXJlYScpIGdldCBvcHRpb25zKCk6IElGaWxlRHJvcEFyZWFPcHRpb25zIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29wdGlvbnM7XG4gICAgfVxuICAgIHNldCBvcHRpb25zKG9wdGlvbnM6IElGaWxlRHJvcEFyZWFPcHRpb25zKSB7XG4gICAgICAgIHRoaXMuX29wdGlvbnMgPSBPYmplY3QuZnJlZXplKE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRPcHRpb25zLCBvcHRpb25zKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW1pdHMgYSBsaXN0IHdoZW4gZmlsZXMgYXJlIGRyYWdnZWQgb3ZlciB0aGUgZHJvcCBhcmVhLCBgdW5kZWZpbmVkYCBvdGhlcndpc2UuXG4gICAgICogQ2FuIGJlIHVzZWQgd2l0aCBBc3luY1BpcGUgZm9yIGNoYW5nZSBkZXRlY3Rpb24gYW5kIHN1YnNjcmlwdGlvbiBoYW5kbGluZy5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgZHJhZ2dlZEZpbGVzJDogT2JzZXJ2YWJsZTxGaWxlRHJhZ1N0YXRlPjtcblxuICAgIC8qKlxuICAgICAqIEVtaXRzIGEgbGlzdCB3aGVuIGZpbGVzIGFyZSBkcmFnZ2VkIG92ZXIgdGhlIGRyb3AgYXJlYSwgYGZhbHNlYCBvdGhlcndpc2UuXG4gICAgICogQ2FuIGJlIHVzZWQgd2l0aCBBc3luY1BpcGUgZm9yIGNoYW5nZSBkZXRlY3Rpb24gYW5kIHN1YnNjcmlwdGlvbiBoYW5kbGluZy5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgZmlsZXNEcmFnZ2VkSW5QYWdlJDogT2JzZXJ2YWJsZTxGaWxlRHJhZ1N0YXRlPjtcblxuICAgIC8qKlxuICAgICAqIEZpcmVzIHdoZW4gYSBmaWxlIG9yIGZpbGVzIGFyZSBkcmFnZ2VkIG92ZXIgdGhlIGRyb3AgYXJlYS5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgZmlsZURyYWdFbnRlciA9IG5ldyBFdmVudEVtaXR0ZXI8RmlsZURyYWdTdGF0ZT4oKTtcblxuICAgIC8qKlxuICAgICAqIEZpcmVzIHdoZW4gYSBmaWxlIG9yIGZpbGVzIGFyZSBkcmFnZ2VkIG91dCBvZiB0aGUgZHJvcCBhcmVhLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBmaWxlRHJhZ0xlYXZlID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gICAgLyoqXG4gICAgICogRmlyZXMgd2hlbiBhIGZpbGUgb3IgZmlsZXMgYXJlIGRyb3BwZWQgb24gdGhlIGRyb3AgYXJlYS5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgZmlsZURyb3AgPSBuZXcgRXZlbnRFbWl0dGVyPEZpbGVbXT4oKTtcblxuICAgIC8qKlxuICAgICAqIEZpcmVzIHdoZW4gYSBmaWxlIG9yIGZpbGVzIHdoaWNoIGRvIG5vdCBtYXRjaCB0aGUgXCJhY2NlcHRlZFwiIG9wdGlvblxuICAgICAqIGFyZSBkcm9wcGVkIG9uIHRoZSBkcm9wIGFyZWEuXG4gICAgICovXG4gICAgQE91dHB1dCgpIGZpbGVEcm9wUmVqZWN0ID0gbmV3IEV2ZW50RW1pdHRlcjxGaWxlW10+KCk7XG5cbiAgICAvKipcbiAgICAgKiBGaXJlcyB3aGVuIGEgZmlsZSBvciBmaWxlcyBhcmUgZHJhZ2dlZCBpbnRvIHRoZSBwYWdlLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBwYWdlRHJhZ0VudGVyID0gbmV3IEV2ZW50RW1pdHRlcjxGaWxlRHJhZ1N0YXRlPigpO1xuXG4gICAgLyoqXG4gICAgICogRmlyZXMgd2hlbiBhIGZpbGUgb3IgZmlsZXMgaXMgZHJhZ2dlZCBvdXQgb2YgdGhlIHBhZ2UuXG4gICAgICovXG4gICAgQE91dHB1dCgpIHBhZ2VEcmFnTGVhdmUgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cblxuICAgIHByaXZhdGUgX2RyYWdnZWRGaWxlczogSURyYWdnZWRGaWxlW10gPSBbXTtcbiAgICBwcml2YXRlIF9pc0RyYWdnZWRPdmVyOiBib29sZWFuID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfaXNQYWdlRHJhZ2dlZE92ZXI6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBwcml2YXRlIF9maWxlc0RyYWdnZWRJblBhZ2U6IElEcmFnZ2VkRmlsZVtdID0gW107XG4gICAgcHJpdmF0ZSBfb3B0aW9ucyA9IGRlZmF1bHRPcHRpb25zO1xuICAgIHByaXZhdGUgX3N1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbltdID0gW107XG4gICAgcHJpdmF0ZSBfZXZlbnRUYXJnZXQ6IEV2ZW50VGFyZ2V0O1xuXG5cbiAgICBjb25zdHJ1Y3RvcihlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuICAgICAgICAgICAgICAgIEBPcHRpb25hbCgpIEBJbmplY3QoRklMRV9EUk9QQVJFQV9EUkFHX0VWRU5UX1RBUkdFVCkgZHJhZ0V2ZW50VGFyZ2V0OiBhbnksXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSBwYWdlRHJhZzogUGFnZUZpbGVEcmFnSGFuZGxlcixcbiAgICAgICAgICAgICAgICBwcml2YXRlIGZpbGVEcmFnOiBEcmFnU3RhdGVUcmFja2VyRmFjdG9yeSxcbiAgICAgICAgICAgICAgICB6b25lOiBOZ1pvbmUpIHtcblxuICAgICAgICB0aGlzLl9ldmVudFRhcmdldCA9IGRyYWdFdmVudFRhcmdldCB8fCBlbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICAgICAgdGhpcy5kcmFnZ2VkRmlsZXMkID0gZmlsZURyYWcudHJhY2tFbGVtZW50KHRoaXMuX2V2ZW50VGFyZ2V0KS5waXBlKFxuICAgICAgICAgICAgbWFwKGZpbGVzID0+IGZpbGVzLmZpbHRlcih0aGlzLmFjY2VwdHMpKVxuICAgICAgICApO1xuXG4gICAgICAgIHRoaXMuZmlsZXNEcmFnZ2VkSW5QYWdlJCA9IHBhZ2VEcmFnLmZpbGVzRHJhZ2dlZCQucGlwZShcbiAgICAgICAgICAgIG1hcChmaWxlcyA9PiBmaWxlcy5maWx0ZXIodGhpcy5hY2NlcHRzKSlcbiAgICAgICAgKTtcblxuICAgICAgICB0aGlzLl9zdWJzY3JpcHRpb25zID0gW1xuICAgICAgICAgICAgdGhpcy5kcmFnZ2VkRmlsZXMkLnN1YnNjcmliZShmaWxlcyA9PiB7XG4gICAgICAgICAgICAgICAgem9uZS5ydW5HdWFyZGVkKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNEcmFnZ2VkT3ZlciA9IGZpbGVzLmxlbmd0aCA+IDA7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2RyYWdnZWRGaWxlcyA9IGZpbGVzO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maWxlRHJhZ0VudGVyLmVtaXQoZmlsZXMpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maWxlRHJhZ0xlYXZlLmVtaXQodW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB0aGlzLmZpbGVzRHJhZ2dlZEluUGFnZSQuc3Vic2NyaWJlKGZpbGVzSW5QYWdlID0+IHtcbiAgICAgICAgICAgICAgICB6b25lLnJ1bkd1YXJkZWQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc1BhZ2VEcmFnZ2VkT3ZlciA9IGZpbGVzSW5QYWdlLmxlbmd0aCA+IDA7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2ZpbGVzRHJhZ2dlZEluUGFnZSA9IGZpbGVzSW5QYWdlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZXNJblBhZ2UubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYWdlRHJhZ0VudGVyLmVtaXQoZmlsZXNJblBhZ2UpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYWdlRHJhZ0xlYXZlLmVtaXQodW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgXTtcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fZXZlbnRUYXJnZXQuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ2VudGVyJywgdGhpcy5vbkRyYWdFbnRlck92ZXIpO1xuICAgICAgICB0aGlzLl9ldmVudFRhcmdldC5hZGRFdmVudExpc3RlbmVyKCdkcmFnb3ZlcicsIHRoaXMub25EcmFnRW50ZXJPdmVyKTtcbiAgICAgICAgdGhpcy5fZXZlbnRUYXJnZXQuYWRkRXZlbnRMaXN0ZW5lcignZHJvcCcsIHRoaXMub25Ecm9wKTtcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fc3Vic2NyaXB0aW9ucy5mb3JFYWNoKHMgPT4gcy51bnN1YnNjcmliZSgpKTtcbiAgICAgICAgdGhpcy5fZXZlbnRUYXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZHJhZ2VudGVyJywgdGhpcy5vbkRyYWdFbnRlck92ZXIpO1xuICAgICAgICB0aGlzLl9ldmVudFRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKCdkcmFnb3ZlcicsIHRoaXMub25EcmFnRW50ZXJPdmVyKTtcbiAgICAgICAgdGhpcy5fZXZlbnRUYXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZHJvcCcsIHRoaXMub25Ecm9wKTtcbiAgICAgICAgdGhpcy5wYWdlRHJhZy5kZXN0cm95KCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhY2NlcHRzID0gKGZpbGU6IHt0eXBlOiBzdHJpbmd9KTogYm9vbGVhbiA9PiB7XG4gICAgICAgIHJldHVybiAhY2xpZW50UmVwb3J0c01pbWVUeXBlc09uRHJhZygpIHx8IG1hdGNoZXNNaW1lVHlwZShmaWxlLnR5cGUsIHRoaXMuX29wdGlvbnMuYWNjZXB0KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9uRHJhZ0VudGVyT3ZlciA9IChldmVudDogRHJhZ0V2ZW50KSA9PiB7XG4gICAgICAgIGxldCB0cmFuc2ZlciA9IGdldERhdGFUcmFuc2ZlcihldmVudCk7XG4gICAgICAgIGlmICghdHJhbnNmZXJIYXNGaWxlcyh0cmFuc2ZlcikpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9pc0RyYWdnZWRPdmVyICYmICF0aGlzLl9vcHRpb25zLmRpc2FibGVkKSB7XG4gICAgICAgICAgICB0cmFuc2Zlci5kcm9wRWZmZWN0ID0gJ2NvcHknO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdHJhbnNmZXIuZHJvcEVmZmVjdCA9ICdub25lJztcbiAgICAgICAgICAgIHRyYW5zZmVyLmVmZmVjdEFsbG93ZWQgPSAnbm9uZSc7XG4gICAgICAgIH1cbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9uRHJvcCA9IChldmVudDogRHJhZ0V2ZW50KSA9PiB7XG4gICAgICAgIGxldCB0cmFuc2ZlciA9IGdldERhdGFUcmFuc2ZlcihldmVudCk7XG4gICAgICAgIGlmIChldmVudC5kZWZhdWx0UHJldmVudGVkIHx8ICF0cmFuc2Zlckhhc0ZpbGVzKHRyYW5zZmVyKSB8fCB0aGlzLl9vcHRpb25zLmRpc2FibGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0cmFuc2Zlci5kcm9wRWZmZWN0ID0gJ2NvcHknO1xuXG4gICAgICAgIGxldCBmaWxlcyA9IEFycmF5LmZyb20odHJhbnNmZXIuZmlsZXMpO1xuICAgICAgICBsZXQgYWNjZXB0ZWRGaWxlczogRmlsZVtdID0gW107XG4gICAgICAgIGxldCByZWplY3RlZEZpbGVzOiBGaWxlW10gPSBbXTtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgZHJvcHBlZCBmaWxlcyBtYXRjaCB0aGUgXCJhY2NlcHRcIiBvcHRpb25cbiAgICAgICAgZm9yIChsZXQgZmlsZSBvZiBmaWxlcykge1xuICAgICAgICAgICAgaWYgKG1hdGNoZXNNaW1lVHlwZShmaWxlLnR5cGUsIHRoaXMuX29wdGlvbnMuYWNjZXB0KSkge1xuICAgICAgICAgICAgICAgIGFjY2VwdGVkRmlsZXMucHVzaChmaWxlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVqZWN0ZWRGaWxlcy5wdXNoKGZpbGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChhY2NlcHRlZEZpbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuZmlsZURyb3AuZW1pdChhY2NlcHRlZEZpbGVzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVqZWN0ZWRGaWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmZpbGVEcm9wUmVqZWN0LmVtaXQocmVqZWN0ZWRGaWxlcyk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=