UNPKG

angular2gridsterv3

Version:
137 lines 25 kB
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==