angular2gridsterv3
Version:
137 lines • 25 kB
JavaScript
import { Injectable } from '@angular/core';
import { Subject, merge } from 'rxjs';
import { takeUntil, switchMap, map, scan, filter, share, tap } from 'rxjs/operators';
import { utils } from '../utils/utils';
import * as i0 from "@angular/core";
export class GridsterPrototypeService {
constructor() {
this.isDragging = false;
this.dragSubject = new Subject();
this.dragStartSubject = new Subject();
this.dragStopSubject = new Subject();
}
observeDropOver(gridster) {
return this.dragStopSubject.pipe(filter((data) => {
const gridsterEl = gridster.gridsterComponent.$element;
const isOverNestedGridster = [].slice.call(gridsterEl.querySelectorAll('gridster'))
.reduce((isOverGridster, nestedGridsterEl) => {
return isOverGridster ||
this.isOverGridster(data.item, nestedGridsterEl, data.event, gridster.options);
}, false);
if (isOverNestedGridster) {
return false;
}
return this.isOverGridster(data.item, gridsterEl, data.event, gridster.options);
}), tap((data) => {
// TODO: what we should provide as a param?
// prototype.drop.emit({item: prototype.item});
data.item.onDrop(gridster);
}));
}
observeDropOut(gridster) {
return this.dragStopSubject.pipe(filter((data) => {
const gridsterEl = gridster.gridsterComponent.$element;
return !this.isOverGridster(data.item, gridsterEl, data.event, gridster.options);
}), tap((data) => {
// TODO: what we should provide as a param?
data.item.onCancel();
}));
}
observeDragOver(gridster) {
const over = this.dragSubject.pipe(map((data) => {
const gridsterEl = gridster.gridsterComponent.$element;
return {
item: data.item,
event: data.event,
isOver: this.isOverGridster(data.item, gridsterEl, data.event, gridster.options),
isDrop: false
};
}));
const drop = this.dragStopSubject.pipe(map((data) => {
const gridsterEl = gridster.gridsterComponent.$element;
return {
item: data.item,
event: data.event,
isOver: this.isOverGridster(data.item, gridsterEl, data.event, gridster.options),
isDrop: true
};
}));
const dragExt = merge(
// dragStartSubject is connected in case when item prototype is placed above gridster
// and drag enter is not fired
this.dragStartSubject.pipe(map(() => ({ item: null, isOver: false, isDrop: false }))), over, drop).pipe(scan((prev, next) => {
return {
item: next.item,
event: next.event,
isOver: next.isOver,
isEnter: prev.isOver === false && next.isOver === true,
isOut: prev.isOver === true && next.isOver === false && !prev.isDrop,
isDrop: next.isDrop
};
}), filter((data) => {
return !data.isDrop;
}), share());
const dragEnter = this.createDragEnterObservable(dragExt, gridster);
const dragOut = this.createDragOutObservable(dragExt, gridster);
const dragOver = dragEnter
.pipe(switchMap(() => this.dragSubject.pipe(takeUntil(dragOut))), map((data) => data.item));
return { dragEnter, dragOut, dragOver };
}
dragItemStart(item, event) {
this.isDragging = true;
this.dragStartSubject.next({ item, event });
}
dragItemStop(item, event) {
this.isDragging = false;
this.dragStopSubject.next({ item, event });
}
updatePrototypePosition(item, event) {
this.dragSubject.next({ item, event });
}
/**
* Creates observable that is fired on dragging over gridster container.
*/
createDragOverObservable(dragIsOver, gridster) {
return dragIsOver.pipe(filter((data) => data.isOver && !data.isEnter && !data.isOut), map((data) => data.item), tap((item) => item.onOver(gridster)));
}
/**
* Creates observable that is fired on drag enter gridster container.
*/
createDragEnterObservable(dragIsOver, gridster) {
return dragIsOver.pipe(filter((data) => data.isEnter), map((data) => data.item), tap((item) => item.onEnter(gridster)));
}
/**
* Creates observable that is fired on drag out gridster container.
*/
createDragOutObservable(dragIsOver, gridster) {
return dragIsOver.pipe(filter((data) => data.isOut), map((data) => data.item), tap((item) => item.onOut(gridster)));
}
/**
* Checks whether "element" position fits inside "containerEl" position.
* It checks if "element" is totally covered by "containerEl" area.
*/
isOverGridster(item, gridsterEl, event, options) {
const el = item.$element;
const parentItem = gridsterEl.parentElement &&
gridsterEl.parentElement.closest('gridster-item');
if (parentItem) {
return this.isOverGridster(item, parentItem, event, options);
}
switch (options.tolerance) {
case 'fit':
return utils.isElementFitContainer(el, gridsterEl);
case 'intersect':
return utils.isElementIntersectContainer(el, gridsterEl);
case 'touch':
return utils.isElementTouchContainer(el, gridsterEl);
default:
return utils.isCursorAboveElement(event, gridsterEl);
}
}
}
GridsterPrototypeService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: GridsterPrototypeService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
GridsterPrototypeService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: GridsterPrototypeService });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: GridsterPrototypeService, decorators: [{
type: Injectable
}], ctorParameters: function () { return []; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZHN0ZXItcHJvdG90eXBlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyMmdyaWRzdGVydjMvc3JjL2xpYi9ncmlkc3Rlci1wcm90b3R5cGUvZ3JpZHN0ZXItcHJvdG90eXBlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQWMsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNsRCxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFJckYsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGdCQUFnQixDQUFDOztBQUl2QyxNQUFNLE9BQU8sd0JBQXdCO0lBVWpDO1FBUlEsZUFBVSxHQUFHLEtBQUssQ0FBQztRQUVuQixnQkFBVyxHQUFHLElBQUksT0FBTyxFQUFPLENBQUM7UUFFakMscUJBQWdCLEdBQUcsSUFBSSxPQUFPLEVBQU8sQ0FBQztRQUV0QyxvQkFBZSxHQUFHLElBQUksT0FBTyxFQUFPLENBQUM7SUFFOUIsQ0FBQztJQUVoQixlQUFlLENBQUUsUUFBeUI7UUFDdEMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FDNUIsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDWixNQUFNLFVBQVUsR0FBRyxRQUFRLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDO1lBQ3ZELE1BQU0sb0JBQW9CLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxDQUFDO2lCQUM5RSxNQUFNLENBQUMsQ0FBQyxjQUFjLEVBQUUsZ0JBQWdCLEVBQUUs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dkQsS0FBSyxXQUFXO2dCQUNaLE9BQU8sS0FBSyxDQUFDLDJCQUEyQixDQUFDLEVBQUUsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUM3RCxLQUFLLE9BQU87Z0JBQ1IsT0FBTyxLQUFLLENBQUMsdUJBQXVCLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQ3pEO2dCQUNJLE9BQU8sS0FBSyxDQUFDLG9CQUFvQixDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsQ0FBQztTQUM1RDtJQUNMLENBQUM7O3FIQWpNUSx3QkFBd0I7eUhBQXhCLHdCQUF3QjsyRkFBeEIsd0JBQXdCO2tCQURwQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0LCBtZXJnZSB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyB0YWtlVW50aWwsIHN3aXRjaE1hcCwgbWFwLCBzY2FuLCBmaWx0ZXIsIHNoYXJlLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcblxyXG5pbXBvcnQgeyBHcmlkc3RlclNlcnZpY2UgfSBmcm9tICcuLi9ncmlkc3Rlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgR3JpZHN0ZXJJdGVtUHJvdG90eXBlRGlyZWN0aXZlIH0gZnJvbSAnLi9ncmlkc3Rlci1pdGVtLXByb3RvdHlwZS5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyB1dGlscyB9IGZyb20gJy4uL3V0aWxzL3V0aWxzJztcclxuaW1wb3J0IHsgRHJhZ2dhYmxlRXZlbnQgfSBmcm9tICcuLi91dGlscy9EcmFnZ2FibGVFdmVudCc7XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBHcmlkc3RlclByb3RvdHlwZVNlcnZpY2Uge1xyXG5cclxuICAgIHByaXZhdGUgaXNEcmFnZ2luZyA9IGZhbHNlO1xyXG5cclxuICAgIHByaXZhdGUgZHJhZ1N1YmplY3QgPSBuZXcgU3ViamVjdDxhbnk+KCk7XHJcblxyXG4gICAgcHJpdmF0ZSBkcmFnU3RhcnRTdWJqZWN0ID0gbmV3IFN1YmplY3Q8YW55PigpO1xyXG5cclxuICAgIHByaXZhdGUgZHJhZ1N0b3BTdWJqZWN0ID0gbmV3IFN1YmplY3Q8YW55PigpO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge31cclxuXHJcbiAgICBvYnNlcnZlRHJvcE92ZXIgKGdyaWRzdGVyOiBHcmlkc3RlclNlcnZpY2UpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kcmFnU3RvcFN1YmplY3QucGlwZShcclxuICAgICAgICAgICAgZmlsdGVyKChkYXRhKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBncmlkc3RlckVsID0gZ3JpZHN0ZXIuZ3JpZHN0ZXJDb21wb25lbnQuJGVsZW1lbnQ7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpc092ZXJOZXN0ZWRHcmlkc3RlciA9IFtdLnNsaWNlLmNhbGwoZ3JpZHN0ZXJFbC5xdWVyeVNlbGVjdG9yQWxsKCdncmlkc3RlcicpKVxyXG4gICAgICAgICAgICAgICAgICAgIC5yZWR1Y2UoKGlzT3ZlckdyaWRzdGVyLCBuZXN0ZWRHcmlkc3RlckVsKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpc092ZXJHcmlkc3RlciB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc092ZXJHcmlkc3RlcihkYXRhLml0ZW0sIG5lc3RlZEdyaWRzdGVyRWwsIGRhdGEuZXZlbnQsIGdyaWRzdGVyLm9wdGlvbnMpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0sIGZhbHNlKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoaXNPdmVyTmVzdGVkR3JpZHN0ZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXNPdmVyR3JpZHN0ZXIoZGF0YS5pdGVtLCBncmlkc3RlckVsLCBkYXRhLmV2ZW50LCBncmlkc3Rlci5vcHRpb25zKTtcclxuICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgIHRhcCgoZGF0YSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy8gVE9ETzogd2hhdCB3ZSBzaG91bGQgcHJvdmlkZSBhcyBhIHBhcmFtP1xyXG4gICAgICAgICAgICAgICAgLy8gcHJvdG90eXBlLmRyb3AuZW1pdCh7aXRlbTogcHJvdG90eXBlLml0ZW19KTtcclxuICAgICAgICAgICAgICAgIGRhdGEuaXRlbS5vbkRyb3AoZ3JpZHN0ZXIpO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgb2JzZXJ2ZURyb3BPdXQgKGdyaWRzdGVyOiBHcmlkc3RlclNlcnZpY2UpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kcmFnU3RvcFN1YmplY3QucGlwZShcclxuICAgICAgICAgICAgZmlsdGVyKChkYXRhKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBncmlkc3RlckVsID0gZ3JpZHN0ZXIuZ3JpZHN0ZXJDb21wb25lbnQuJGVsZW1lbnQ7XHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuICF0aGlzLmlzT3ZlckdyaWRzdGVyKGRhdGEuaXRlbSwgZ3JpZHN0ZXJFbCwgZGF0YS5ldmVudCwgZ3JpZHN0ZXIub3B0aW9ucyk7XHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICB0YXAoKGRhdGEpID0+IHtcclxuICAgICAgICAgICAgICAgIC8vIFRPRE86IHdoYXQgd2Ugc2hvdWxkIHByb3ZpZGUgYXMgYSBwYXJhbT9cclxuICAgICAgICAgICAgICAgIGRhdGEuaXRlbS5vbkNhbmNlbCgpO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgb2JzZXJ2ZURyYWdPdmVyKGdyaWRzdGVyOiBHcmlkc3RlclNlcnZpY2UpOiB7XHJcbiAgICAgICAgZHJhZ092ZXI6IE9ic2VydmFibGU8R3JpZHN0ZXJJdGVtUHJvdG90eXBlRGlyZWN0aXZlPixcclxuICAgICAgICBkcmFnRW50ZXI6IE9ic2VydmFibGU8R3JpZHN0ZXJJdGVtUHJvdG90eXBlRGlyZWN0aXZlPixcclxuICAgICAgICBkcmFnT3V0OiBPYnNlcnZhYmxlPEdyaWRzdGVySXRlbVByb3RvdHlwZURpcmVjdGl2ZT5cclxuICAgIH0ge1xyXG4gICAgICAgIGNvbnN0IG92ZXIgPSB0aGlzLmRyYWdTdWJqZWN0LnBpcGUoXHJcbiAgICAgICAgICAgIG1hcCgoZGF0YSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZ3JpZHN0ZXJFbCA9IGdyaWRzdGVyLmdyaWRzdGVyQ29tcG9uZW50LiRlbGVtZW50O1xyXG5cclxuICAgICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgIGl0ZW06IGRhdGEuaXRlbSxcclxuICAgICAgICAgICAgICAgICAgZXZlbnQ6IGRhdGEuZXZlbnQsXHJcbiAgICAgICAgICAgICAgICAgIGlzT3ZlcjogdGhpcy5pc092ZXJHcmlkc3RlcihkYXRhLml0ZW0sIGdyaWRzdGVyRWwsIGRhdGEuZXZlbnQsIGdyaWRzdGVyLm9wdGlvbnMpLFxyXG4gICAgICAgICAgICAgICAgICBpc0Ryb3A6IGZhbHNlXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIGNvbnN0IGRyb3AgPSB0aGlzLmRyYWdTdG9wU3ViamVjdC5waXBlKFxyXG4gICAgICAgICAgICBtYXAoKGRhdGEpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGdyaWRzdGVyRWwgPSBncmlkc3Rlci5ncmlkc3RlckNvbXBvbmVudC4kZWxlbWVudDtcclxuXHJcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGl0ZW06IGRhdGEuaXRlbSxcclxuICAgICAgICAgICAgICAgICAgICBldmVudDogZGF0YS5ldmVudCxcclxuICAgICAgICAgICAgICAgICAgICBpc092ZXI6IHRoaXMuaXNPdmVyR3JpZHN0ZXIoZGF0YS5pdGVtLCBncmlkc3RlckVsLCBkYXRhLmV2ZW50LCBncmlkc3Rlci5vcHRpb25zKSxcclxuICAgICAgICAgICAgICAgICAgICBpc0Ryb3A6IHRydWVcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgY29uc3QgZHJhZ0V4dCA9IG1lcmdlKFxyXG4gICAgICAgICAgICAgICAgLy8gZHJhZ1N0YXJ0U3ViamVjdCBpcyBjb25uZWN0ZWQgaW4gY2FzZSB3aGVuIGl0ZW0gcHJvdG90eXBlIGlzIHBsYWNlZCBhYm92ZSBncmlkc3RlclxyXG4gICAgICAgICAgICAgICAgLy8gYW5kIGRyYWcgZW50ZXIgaXMgbm90IGZpcmVkXHJcbiAgICAgICAgICAgICAgICB0aGlzLmRyYWdTdGFydFN1YmplY3QucGlwZShtYXAoKCkgPT4gKHsgaXRlbTogbnVsbCwgaXNPdmVyOiBmYWxzZSwgaXNEcm9wOiBmYWxzZSB9KSkpLFxyXG4gICAgICAgICAgICAgICAgb3ZlcixcclxuICAgICAgICAgICAgICAgIGRyb3BcclxuICAgICAgICAgICAgKS5waXBlKFxyXG4gICAgICAgICAgICAgICAgc2NhbigocHJldjogYW55LCBuZXh0OiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtOiBuZXh0Lml0ZW0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50OiBuZXh0LmV2ZW50LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpc092ZXI6IG5leHQuaXNPdmVyLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpc0VudGVyOiBwcmV2LmlzT3ZlciA9PT0gZmFsc2UgJiYgbmV4dC5pc092ZXIgPT09IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzT3V0OiBwcmV2LmlzT3ZlciA9PT0gdHJ1ZSAmJiBuZXh0LmlzT3ZlciA9PT0gZmFsc2UgJiYgIXByZXYuaXNEcm9wLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpc0Ryb3A6IG5leHQuaXNEcm9wXHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICAgICAgZmlsdGVyKChkYXRhOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gIWRhdGEuaXNEcm9wO1xyXG4gICAgICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgICAgICBzaGFyZSgpXHJcbiAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgIGNvbnN0IGRyYWdFbnRlciA9IHRoaXMuY3JlYXRlRHJhZ0VudGVyT2JzZXJ2YWJsZShkcmFnRXh0LCBncmlkc3Rlcik7XHJcbiAgICAgICAgY29uc3QgZHJhZ091dCA9IHRoaXMuY3JlYXRlRHJhZ091dE9ic2VydmFibGUoZHJhZ0V4dCwgZ3JpZHN0ZXIpO1xyXG4gICAgICAgIGNvbnN0IGRyYWdPdmVyID0gZHJhZ0VudGVyXHJcbiAgICAgICAgICAgIC5waXBlKFxyXG4gICAgICAgICAgICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMuZHJhZ1N1YmplY3QucGlwZSh0YWtlVW50aWwoZHJhZ091dCkpKSxcclxuICAgICAgICAgICAgICAgIG1hcCgoZGF0YTogYW55KSA9PiBkYXRhLml0ZW0pXHJcbiAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgIHJldHVybiB7IGRyYWdFbnRlciwgZHJhZ091dCwgZHJhZ092ZXIgfTtcclxuICAgIH1cclxuXHJcbiAgICBkcmFnSXRlbVN0YXJ0KGl0ZW06IEdyaWRzdGVySXRlbVByb3RvdHlwZURpcmVjdGl2ZSwgZXZlbnQ6IERyYWdnYWJsZUV2ZW50KSB7XHJcbiAgICAgICAgdGhpcy5pc0RyYWdnaW5nID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmRyYWdTdGFydFN1YmplY3QubmV4dCh7IGl0ZW0sIGV2ZW50IH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGRyYWdJdGVtU3RvcChpdGVtOiBHcmlkc3Rlckl0ZW1Qcm90b3R5cGVEaXJlY3RpdmUsIGV2ZW50OiBEcmFnZ2FibGVFdmVudCkge1xyXG4gICAgICAgIHRoaXMuaXNEcmFnZ2luZyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuZHJhZ1N0b3BTdWJqZWN0Lm5leHQoeyBpdGVtLCBldmVudCB9KTtcclxuICAgIH1cclxuXHJcbiAgICB1cGRhdGVQcm90b3R5cGVQb3NpdGlvbihpdGVtOiBHcmlkc3Rlckl0ZW1Qcm90b3R5cGVEaXJlY3RpdmUsIGV2ZW50OiBEcmFnZ2FibGVFdmVudCkge1xyXG4gICAgICAgIHRoaXMuZHJhZ1N1YmplY3QubmV4dCh7IGl0ZW0sIGV2ZW50IH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBvYnNlcnZhYmxlIHRoYXQgaXMgZmlyZWQgb24gZHJhZ2dpbmcgb3ZlciBncmlkc3RlciBjb250YWluZXIuXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgY3JlYXRlRHJhZ092ZXJPYnNlcnZhYmxlIChcclxuICAgICAgICBkcmFnSXNPdmVyOiBPYnNlcnZhYmxlPHtpdGVtOiBHcmlkc3Rlckl0ZW1Qcm90b3R5cGVEaXJlY3RpdmUsIGlzT3ZlcjogYm9vbGVhbn0+LFxyXG4gICAgICAgIGdyaWRzdGVyOiBHcmlkc3RlclNlcnZpY2VcclxuICAgICkge1xyXG4gICAgICAgIHJldHVybiBkcmFnSXNPdmVyLnBpcGUoXHJcbiAgICAgICAgICAgIGZpbHRlcigoZGF0YTogYW55KSA9PiBkYXRhLmlzT3ZlciAmJiAhZGF0YS5pc0VudGVyICYmICFkYXRhLmlzT3V0KSxcclxuICAgICAgICAgICAgbWFwKChkYXRhOiBhbnkpOiBHcmlkc3Rlckl0ZW1Qcm90b3R5cGVEaXJlY3RpdmUgPT4gZGF0YS5pdGVtKSxcclxuICAgICAgICAgICAgdGFwKChpdGVtKSA9PiBpdGVtLm9uT3Zlcihncmlkc3RlcikpXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBvYnNlcnZhYmxlIHRoYXQgaXMgZmlyZWQgb24gZHJhZyBlbnRlciBncmlkc3RlciBjb250YWluZXIuXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgY3JlYXRlRHJhZ0VudGVyT2JzZXJ2YWJsZSAoXHJcbiAgICAgICAgZHJhZ0lzT3ZlcjogT2JzZXJ2YWJsZTx7aXRlbTogR3JpZHN0ZXJJdGVtUHJvdG90eXBlRGlyZWN0aXZlLCBpc092ZXI6IGJvb2xlYW59PixcclxuICAgICAgICBncmlkc3RlcjogR3JpZHN0ZXJTZXJ2aWNlXHJcbiAgICApIHtcclxuICAgICAgICByZXR1cm4gZHJhZ0lzT3Zlci5waXBlKFxyXG4gICAgICAgICAgICBmaWx0ZXIoKGRhdGE6IGFueSkgPT4gZGF0YS5pc0VudGVyKSxcclxuICAgICAgICAgICAgbWFwKChkYXRhOiBhbnkpOiBHcmlkc3Rlckl0ZW1Qcm90b3R5cGVEaXJlY3RpdmUgPT4gZGF0YS5pdGVtKSxcclxuICAgICAgICAgICAgdGFwKChpdGVtKSA9PiBpdGVtLm9uRW50ZXIoZ3JpZHN0ZXIpKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgb2JzZXJ2YWJsZSB0aGF0IGlzIGZpcmVkIG9uIGRyYWcgb3V0IGdyaWRzdGVyIGNvbnRhaW5lci5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBjcmVhdGVEcmFnT3V0T2JzZXJ2YWJsZSAoXHJcbiAgICAgICAgZHJhZ0lzT3ZlcjogT2JzZXJ2YWJsZTx7aXRlbTogR3JpZHN0ZXJJdGVtUHJvdG90eXBlRGlyZWN0aXZlLFxyXG4gICAgICAgIGlzT3ZlcjogYm9vbGVhbn0+LFxyXG4gICAgICAgIGdyaWRzdGVyOiBHcmlkc3RlclNlcnZpY2VcclxuICAgICkge1xyXG4gICAgICAgIHJldHVybiBkcmFnSXNPdmVyLnBpcGUoXHJcbiAgICAgICAgICAgIGZpbHRlcigoZGF0YTogYW55KSA9PiBkYXRhLmlzT3V0KSxcclxuICAgICAgICAgICAgbWFwKChkYXRhOiBhbnkpOiBHcmlkc3Rlckl0ZW1Qcm90b3R5cGVEaXJlY3RpdmUgPT4gZGF0YS5pdGVtKSxcclxuICAgICAgICAgICAgdGFwKChpdGVtKSA9PiBpdGVtLm9uT3V0KGdyaWRzdGVyKSlcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgXCJlbGVtZW50XCIgcG9zaXRpb24gZml0cyBpbnNpZGUgXCJjb250YWluZXJFbFwiIHBvc2l0aW9uLlxyXG4gICAgICogSXQgY2hlY2tzIGlmIFwiZWxlbWVudFwiIGlzIHRvdGFsbHkgY292ZXJlZCBieSBcImNvbnRhaW5lckVsXCIgYXJlYS5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBpc092ZXJHcmlkc3RlcihpdGVtOiBHcmlkc3Rlckl0ZW1Qcm90b3R5cGVEaXJlY3RpdmUsIGdyaWRzdGVyRWw6IEhUTUxFbGVtZW50LCBldmVudCwgb3B0aW9ucyk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGNvbnN0IGVsID0gaXRlbS4kZWxlbWVudDtcclxuICAgICAgICBjb25zdCBwYXJlbnRJdGVtID0gPEhUTUxFbGVtZW50PmdyaWRzdGVyRWwucGFyZW50RWxlbWVudCAmJlxyXG4gICAgICAgICAgICA8SFRNTEVsZW1lbnQ+Z3JpZHN0ZXJFbC5wYXJlbnRFbGVtZW50LmNsb3Nlc3QoJ2dyaWRzdGVyLWl0ZW0nKTtcclxuXHJcbiAgICAgICAgaWYgKHBhcmVudEl0ZW0pIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXNPdmVyR3JpZHN0ZXIoaXRlbSwgcGFyZW50SXRlbSwgZXZlbnQsIG9wdGlvbnMpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc3dpdGNoIChvcHRpb25zLnRvbGVyYW5jZSkge1xyXG4gICAgICAgICAgICBjYXNlICdmaXQnOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHV0aWxzLmlzRWxlbWVudEZpdENvbnRhaW5lcihlbCwgZ3JpZHN0ZXJFbCk7XHJcbiAgICAgICAgICAgIGNhc2UgJ2ludGVyc2VjdCc6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdXRpbHMuaXNFbGVtZW50SW50ZXJzZWN0Q29udGFpbmVyKGVsLCBncmlkc3RlckVsKTtcclxuICAgICAgICAgICAgY2FzZSAndG91Y2gnOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHV0aWxzLmlzRWxlbWVudFRvdWNoQ29udGFpbmVyKGVsLCBncmlkc3RlckVsKTtcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIHJldHVybiB1dGlscy5pc0N1cnNvckFib3ZlRWxlbWVudChldmVudCwgZ3JpZHN0ZXJFbCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbiJdfQ==