@blare/angular2gridster
Version:
[](https://badge.fury.io/js/angular2gridster)
204 lines • 25.3 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc
*/
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';
export class GridsterPrototypeService {
constructor() {
this.isDragging = false;
this.dragSubject = new Subject();
this.dragStartSubject = new Subject();
this.dragStopSubject = new Subject();
}
/**
* @param {?} gridster
* @return {?}
*/
observeDropOver(gridster) {
return this.dragStopSubject.pipe(filter((data) => {
/** @type {?} */
const gridsterEl = gridster.gridsterComponent.$element;
/** @type {?} */
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);
}));
}
/**
* @param {?} gridster
* @return {?}
*/
observeDropOut(gridster) {
return this.dragStopSubject.pipe(filter((data) => {
/** @type {?} */
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();
}));
}
/**
* @param {?} gridster
* @return {?}
*/
observeDragOver(gridster) {
/** @type {?} */
const over = this.dragSubject.pipe(map((data) => {
/** @type {?} */
const gridsterEl = gridster.gridsterComponent.$element;
return {
item: data.item,
event: data.event,
isOver: this.isOverGridster(data.item, gridsterEl, data.event, gridster.options),
isDrop: false
};
}));
/** @type {?} */
const drop = this.dragStopSubject.pipe(map((data) => {
/** @type {?} */
const gridsterEl = gridster.gridsterComponent.$element;
return {
item: data.item,
event: data.event,
isOver: this.isOverGridster(data.item, gridsterEl, data.event, gridster.options),
isDrop: true
};
}));
/** @type {?} */
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());
/** @type {?} */
const dragEnter = this.createDragEnterObservable(dragExt, gridster);
/** @type {?} */
const dragOut = this.createDragOutObservable(dragExt, gridster);
/** @type {?} */
const dragOver = dragEnter
.pipe(switchMap(() => this.dragSubject.pipe(takeUntil(dragOut))), map((data) => data.item));
return { dragEnter, dragOut, dragOver };
}
/**
* @param {?} item
* @param {?} event
* @return {?}
*/
dragItemStart(item, event) {
this.isDragging = true;
this.dragStartSubject.next({ item, event });
}
/**
* @param {?} item
* @param {?} event
* @return {?}
*/
dragItemStop(item, event) {
this.isDragging = false;
this.dragStopSubject.next({ item, event });
}
/**
* @param {?} item
* @param {?} event
* @return {?}
*/
updatePrototypePosition(item, event) {
this.dragSubject.next({ item, event });
}
/**
* Creates observable that is fired on dragging over gridster container.
* @param {?} dragIsOver
* @param {?} gridster
* @return {?}
*/
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.
* @param {?} dragIsOver
* @param {?} gridster
* @return {?}
*/
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.
* @param {?} dragIsOver
* @param {?} gridster
* @return {?}
*/
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.
* @param {?} item
* @param {?} gridsterEl
* @param {?} event
* @param {?} options
* @return {?}
*/
isOverGridster(item, gridsterEl, event, options) {
/** @type {?} */
const el = item.$element;
/** @type {?} */
const parentItem = (/** @type {?} */ (gridsterEl.parentElement)) &&
(/** @type {?} */ (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.decorators = [
{ type: Injectable }
];
/** @nocollapse */
GridsterPrototypeService.ctorParameters = () => [];
if (false) {
/** @type {?} */
GridsterPrototypeService.prototype.isDragging;
/** @type {?} */
GridsterPrototypeService.prototype.dragSubject;
/** @type {?} */
GridsterPrototypeService.prototype.dragStartSubject;
/** @type {?} */
GridsterPrototypeService.prototype.dragStopSubject;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZHN0ZXItcHJvdG90eXBlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AYmxhcmUvYW5ndWxhcjJncmlkc3Rlci8iLCJzb3VyY2VzIjpbImxpYi9ncmlkc3Rlci1wcm90b3R5cGUvZ3JpZHN0ZXItcHJvdG90eXBlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFjLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDbEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBSXJGLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUl2QyxNQUFNLE9BQU8sd0JBQXdCO0lBVWpDO1FBUlEsZUFBVSxHQUFHLEtBQUssQ0FBQztRQUVuQixnQkFBVyxHQUFHLElBQUksT0FBTyxFQUFPLENBQUM7UUFFakMscUJBQWdCLEdBQUcsSUFBSSxPQUFPLEVBQU8sQ0FBQztRQUV0QyxvQkFBZSxHQUFHLElBQUksT0FBTyxFQUFPLENBQUM7SUFFOUIsQ0FBQzs7Ozs7SUFFaEIsZUFBZSxDQUFFLFFBQXlCO1FBQ3RDLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQzVCLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFOztrQkFDTixVQUFVLEdBQUcsUUFBUSxDQUFDLGlCQUFpQixDQUFDLFFBQVE7O2tCQUNoRCxvQkFBb0IsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLENBQUM7aUJBQzlFLE1BQU0sQ0FBQyxDQUFDLGNBQWMsRUFBRSxnQkFBZ0IsRUFBRSxFQUFFO2dCQUN6QyxPQUFPLGNBQWM7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LEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxFQUFFLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDekQ7Z0JBQ0ksT0FBTyxLQUFLLENBQUMsb0JBQW9CLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1NBQzVEO0lBQ0wsQ0FBQzs7O1lBbE1KLFVBQVU7Ozs7OztJQUdQLDhDQUEyQjs7SUFFM0IsK0NBQXlDOztJQUV6QyxvREFBOEM7O0lBRTlDLG1EQUE2QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QsIG1lcmdlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlVW50aWwsIHN3aXRjaE1hcCwgbWFwLCBzY2FuLCBmaWx0ZXIsIHNoYXJlLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IEdyaWRzdGVyU2VydmljZSB9IGZyb20gJy4uL2dyaWRzdGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgR3JpZHN0ZXJJdGVtUHJvdG90eXBlRGlyZWN0aXZlIH0gZnJvbSAnLi9ncmlkc3Rlci1pdGVtLXByb3RvdHlwZS5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgdXRpbHMgfSBmcm9tICcuLi91dGlscy91dGlscyc7XG5pbXBvcnQge0RyYWdnYWJsZUV2ZW50fSBmcm9tICcuLi91dGlscy9EcmFnZ2FibGVFdmVudCc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBHcmlkc3RlclByb3RvdHlwZVNlcnZpY2Uge1xuXG4gICAgcHJpdmF0ZSBpc0RyYWdnaW5nID0gZmFsc2U7XG5cbiAgICBwcml2YXRlIGRyYWdTdWJqZWN0ID0gbmV3IFN1YmplY3Q8YW55PigpO1xuXG4gICAgcHJpdmF0ZSBkcmFnU3RhcnRTdWJqZWN0ID0gbmV3IFN1YmplY3Q8YW55PigpO1xuXG4gICAgcHJpdmF0ZSBkcmFnU3RvcFN1YmplY3QgPSBuZXcgU3ViamVjdDxhbnk+KCk7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgICBvYnNlcnZlRHJvcE92ZXIgKGdyaWRzdGVyOiBHcmlkc3RlclNlcnZpY2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZHJhZ1N0b3BTdWJqZWN0LnBpcGUoXG4gICAgICAgICAgICBmaWx0ZXIoKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBncmlkc3RlckVsID0gZ3JpZHN0ZXIuZ3JpZHN0ZXJDb21wb25lbnQuJGVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgY29uc3QgaXNPdmVyTmVzdGVkR3JpZHN0ZXIgPSBbXS5zbGljZS5jYWxsKGdyaWRzdGVyRWwucXVlcnlTZWxlY3RvckFsbCgnZ3JpZHN0ZXInKSlcbiAgICAgICAgICAgICAgICAgICAgLnJlZHVjZSgoaXNPdmVyR3JpZHN0ZXIsIG5lc3RlZEdyaWRzdGVyRWwpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpc092ZXJHcmlkc3RlciB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNPdmVyR3JpZHN0ZXIoZGF0YS5pdGVtLCBuZXN0ZWRHcmlkc3RlckVsLCBkYXRhLmV2ZW50LCBncmlkc3Rlci5vcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgfSwgZmFsc2UpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGlzT3Zlck5lc3RlZEdyaWRzdGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pc092ZXJHcmlkc3RlcihkYXRhLml0ZW0sIGdyaWRzdGVyRWwsIGRhdGEuZXZlbnQsIGdyaWRzdGVyLm9wdGlvbnMpO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB0YXAoKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBUT0RPOiB3aGF0IHdlIHNob3VsZCBwcm92aWRlIGFzIGEgcGFyYW0/XG4gICAgICAgICAgICAgICAgLy8gcHJvdG90eXBlLmRyb3AuZW1pdCh7aXRlbTogcHJvdG90eXBlLml0ZW19KTtcbiAgICAgICAgICAgICAgICBkYXRhLml0ZW0ub25Ecm9wKGdyaWRzdGVyKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgb2JzZXJ2ZURyb3BPdXQgKGdyaWRzdGVyOiBHcmlkc3RlclNlcnZpY2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZHJhZ1N0b3BTdWJqZWN0LnBpcGUoXG4gICAgICAgICAgICBmaWx0ZXIoKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBncmlkc3RlckVsID0gZ3JpZHN0ZXIuZ3JpZHN0ZXJDb21wb25lbnQuJGVsZW1lbnQ7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gIXRoaXMuaXNPdmVyR3JpZHN0ZXIoZGF0YS5pdGVtLCBncmlkc3RlckVsLCBkYXRhLmV2ZW50LCBncmlkc3Rlci5vcHRpb25zKTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgdGFwKChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gVE9ETzogd2hhdCB3ZSBzaG91bGQgcHJvdmlkZSBhcyBhIHBhcmFtP1xuICAgICAgICAgICAgICAgIGRhdGEuaXRlbS5vbkNhbmNlbCgpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBvYnNlcnZlRHJhZ092ZXIoZ3JpZHN0ZXI6IEdyaWRzdGVyU2VydmljZSk6IHtcbiAgICAgICAgZHJhZ092ZXI6IE9ic2VydmFibGU8R3JpZHN0ZXJJdGVtUHJvdG90eXBlRGlyZWN0aXZlPixcbiAgICAgICAgZHJhZ0VudGVyOiBPYnNlcnZhYmxlPEdyaWRzdGVySXRlbVByb3RvdHlwZURpcmVjdGl2ZT4sXG4gICAgICAgIGRyYWdPdXQ6IE9ic2VydmFibGU8R3JpZHN0ZXJJdGVtUHJvdG90eXBlRGlyZWN0aXZlPlxuICAgIH0ge1xuICAgICAgICBjb25zdCBvdmVyID0gdGhpcy5kcmFnU3ViamVjdC5waXBlKFxuICAgICAgICAgICAgbWFwKChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZ3JpZHN0ZXJFbCA9IGdyaWRzdGVyLmdyaWRzdGVyQ29tcG9uZW50LiRlbGVtZW50O1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgIGl0ZW06IGRhdGEuaXRlbSxcbiAgICAgICAgICAgICAgICAgIGV2ZW50OiBkYXRhLmV2ZW50LFxuICAgICAgICAgICAgICAgICAgaXNPdmVyOiB0aGlzLmlzT3ZlckdyaWRzdGVyKGRhdGEuaXRlbSwgZ3JpZHN0ZXJFbCwgZGF0YS5ldmVudCwgZ3JpZHN0ZXIub3B0aW9ucyksXG4gICAgICAgICAgICAgICAgICBpc0Ryb3A6IGZhbHNlXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgZHJvcCA9IHRoaXMuZHJhZ1N0b3BTdWJqZWN0LnBpcGUoXG4gICAgICAgICAgICBtYXAoKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBncmlkc3RlckVsID0gZ3JpZHN0ZXIuZ3JpZHN0ZXJDb21wb25lbnQuJGVsZW1lbnQ7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBpdGVtOiBkYXRhLml0ZW0sXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50OiBkYXRhLmV2ZW50LFxuICAgICAgICAgICAgICAgICAgICBpc092ZXI6IHRoaXMuaXNPdmVyR3JpZHN0ZXIoZGF0YS5pdGVtLCBncmlkc3RlckVsLCBkYXRhLmV2ZW50LCBncmlkc3Rlci5vcHRpb25zKSxcbiAgICAgICAgICAgICAgICAgICAgaXNEcm9wOiB0cnVlXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgZHJhZ0V4dCA9IG1lcmdlKFxuICAgICAgICAgICAgICAgIC8vIGRyYWdTdGFydFN1YmplY3QgaXMgY29ubmVjdGVkIGluIGNhc2Ugd2hlbiBpdGVtIHByb3RvdHlwZSBpcyBwbGFjZWQgYWJvdmUgZ3JpZHN0ZXJcbiAgICAgICAgICAgICAgICAvLyBhbmQgZHJhZyBlbnRlciBpcyBub3QgZmlyZWRcbiAgICAgICAgICAgICAgICB0aGlzLmRyYWdTdGFydFN1YmplY3QucGlwZShtYXAoKCkgPT4gKHsgaXRlbTogbnVsbCwgaXNPdmVyOiBmYWxzZSwgaXNEcm9wOiBmYWxzZSB9KSkpLFxuICAgICAgICAgICAgICAgIG92ZXIsXG4gICAgICAgICAgICAgICAgZHJvcFxuICAgICAgICAgICAgKS5waXBlKFxuICAgICAgICAgICAgICAgIHNjYW4oKHByZXY6IGFueSwgbmV4dDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtOiBuZXh0Lml0ZW0sXG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudDogbmV4dC5ldmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzT3ZlcjogbmV4dC5pc092ZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICBpc0VudGVyOiBwcmV2LmlzT3ZlciA9PT0gZmFsc2UgJiYgbmV4dC5pc092ZXIgPT09IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBpc091dDogcHJldi5pc092ZXIgPT09IHRydWUgJiYgbmV4dC5pc092ZXIgPT09IGZhbHNlICYmICFwcmV2LmlzRHJvcCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzRHJvcDogbmV4dC5pc0Ryb3BcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICBmaWx0ZXIoKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gIWRhdGEuaXNEcm9wO1xuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIHNoYXJlKClcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgZHJhZ0VudGVyID0gdGhpcy5jcmVhdGVEcmFnRW50ZXJPYnNlcnZhYmxlKGRyYWdFeHQsIGdyaWRzdGVyKTtcbiAgICAgICAgY29uc3QgZHJhZ091dCA9IHRoaXMuY3JlYXRlRHJhZ091dE9ic2VydmFibGUoZHJhZ0V4dCwgZ3JpZHN0ZXIpO1xuICAgICAgICBjb25zdCBkcmFnT3ZlciA9IGRyYWdFbnRlclxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMuZHJhZ1N1YmplY3QucGlwZSh0YWtlVW50aWwoZHJhZ091dCkpKSxcbiAgICAgICAgICAgICAgICBtYXAoKGRhdGE6IGFueSkgPT4gZGF0YS5pdGVtKVxuICAgICAgICAgICAgKTtcblxuICAgICAgICByZXR1cm4geyBkcmFnRW50ZXIsIGRyYWdPdXQsIGRyYWdPdmVyIH07XG4gICAgfVxuXG4gICAgZHJhZ0l0ZW1TdGFydChpdGVtOiBHcmlkc3Rlckl0ZW1Qcm90b3R5cGVEaXJlY3RpdmUsIGV2ZW50OiBEcmFnZ2FibGVFdmVudCkge1xuICAgICAgICB0aGlzLmlzRHJhZ2dpbmcgPSB0cnVlO1xuICAgICAgICB0aGlzLmRyYWdTdGFydFN1YmplY3QubmV4dCh7IGl0ZW0sIGV2ZW50IH0pO1xuICAgIH1cblxuICAgIGRyYWdJdGVtU3RvcChpdGVtOiBHcmlkc3Rlckl0ZW1Qcm90b3R5cGVEaXJlY3RpdmUsIGV2ZW50OiBEcmFnZ2FibGVFdmVudCkge1xuICAgICAgICB0aGlzLmlzRHJhZ2dpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5kcmFnU3RvcFN1YmplY3QubmV4dCh7IGl0ZW0sIGV2ZW50IH0pO1xuICAgIH1cblxuICAgIHVwZGF0ZVByb3RvdHlwZVBvc2l0aW9uKGl0ZW06IEdyaWRzdGVySXRlbVByb3RvdHlwZURpcmVjdGl2ZSwgZXZlbnQ6IERyYWdnYWJsZUV2ZW50KSB7XG4gICAgICAgIHRoaXMuZHJhZ1N1YmplY3QubmV4dCh7IGl0ZW0sIGV2ZW50IH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgb2JzZXJ2YWJsZSB0aGF0IGlzIGZpcmVkIG9uIGRyYWdnaW5nIG92ZXIgZ3JpZHN0ZXIgY29udGFpbmVyLlxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlRHJhZ092ZXJPYnNlcnZhYmxlIChcbiAgICAgICAgZHJhZ0lzT3ZlcjogT2JzZXJ2YWJsZTx7aXRlbTogR3JpZHN0ZXJJdGVtUHJvdG90eXBlRGlyZWN0aXZlLCBpc092ZXI6IGJvb2xlYW59PixcbiAgICAgICAgZ3JpZHN0ZXI6IEdyaWRzdGVyU2VydmljZVxuICAgICkge1xuICAgICAgICByZXR1cm4gZHJhZ0lzT3Zlci5waXBlKFxuICAgICAgICAgICAgZmlsdGVyKChkYXRhOiBhbnkpID0+IGRhdGEuaXNPdmVyICYmICFkYXRhLmlzRW50ZXIgJiYgIWRhdGEuaXNPdXQpLFxuICAgICAgICAgICAgbWFwKChkYXRhOiBhbnkpOiBHcmlkc3Rlckl0ZW1Qcm90b3R5cGVEaXJlY3RpdmUgPT4gZGF0YS5pdGVtKSxcbiAgICAgICAgICAgIHRhcCgoaXRlbSkgPT4gaXRlbS5vbk92ZXIoZ3JpZHN0ZXIpKVxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIG9ic2VydmFibGUgdGhhdCBpcyBmaXJlZCBvbiBkcmFnIGVudGVyIGdyaWRzdGVyIGNvbnRhaW5lci5cbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZURyYWdFbnRlck9ic2VydmFibGUgKFxuICAgICAgICBkcmFnSXNPdmVyOiBPYnNlcnZhYmxlPHtpdGVtOiBHcmlkc3Rlckl0ZW1Qcm90b3R5cGVEaXJlY3RpdmUsIGlzT3ZlcjogYm9vbGVhbn0+LFxuICAgICAgICBncmlkc3RlcjogR3JpZHN0ZXJTZXJ2aWNlXG4gICAgKSB7XG4gICAgICAgIHJldHVybiBkcmFnSXNPdmVyLnBpcGUoXG4gICAgICAgICAgICBmaWx0ZXIoKGRhdGE6IGFueSkgPT4gZGF0YS5pc0VudGVyKSxcbiAgICAgICAgICAgIG1hcCgoZGF0YTogYW55KTogR3JpZHN0ZXJJdGVtUHJvdG90eXBlRGlyZWN0aXZlID0+IGRhdGEuaXRlbSksXG4gICAgICAgICAgICB0YXAoKGl0ZW0pID0+IGl0ZW0ub25FbnRlcihncmlkc3RlcikpXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgb2JzZXJ2YWJsZSB0aGF0IGlzIGZpcmVkIG9uIGRyYWcgb3V0IGdyaWRzdGVyIGNvbnRhaW5lci5cbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZURyYWdPdXRPYnNlcnZhYmxlIChcbiAgICAgICAgZHJhZ0lzT3ZlcjogT2JzZXJ2YWJsZTx7aXRlbTogR3JpZHN0ZXJJdGVtUHJvdG90eXBlRGlyZWN0aXZlLFxuICAgICAgICBpc092ZXI6IGJvb2xlYW59PixcbiAgICAgICAgZ3JpZHN0ZXI6IEdyaWRzdGVyU2VydmljZVxuICAgICkge1xuICAgICAgICByZXR1cm4gZHJhZ0lzT3Zlci5waXBlKFxuICAgICAgICAgICAgZmlsdGVyKChkYXRhOiBhbnkpID0+IGRhdGEuaXNPdXQpLFxuICAgICAgICAgICAgbWFwKChkYXRhOiBhbnkpOiBHcmlkc3Rlckl0ZW1Qcm90b3R5cGVEaXJlY3RpdmUgPT4gZGF0YS5pdGVtKSxcbiAgICAgICAgICAgIHRhcCgoaXRlbSkgPT4gaXRlbS5vbk91dChncmlkc3RlcikpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgXCJlbGVtZW50XCIgcG9zaXRpb24gZml0cyBpbnNpZGUgXCJjb250YWluZXJFbFwiIHBvc2l0aW9uLlxuICAgICAqIEl0IGNoZWNrcyBpZiBcImVsZW1lbnRcIiBpcyB0b3RhbGx5IGNvdmVyZWQgYnkgXCJjb250YWluZXJFbFwiIGFyZWEuXG4gICAgICovXG4gICAgcHJpdmF0ZSBpc092ZXJHcmlkc3RlcihpdGVtOiBHcmlkc3Rlckl0ZW1Qcm90b3R5cGVEaXJlY3RpdmUsIGdyaWRzdGVyRWw6IEhUTUxFbGVtZW50LCBldmVudCwgb3B0aW9ucyk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBlbCA9IGl0ZW0uJGVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IHBhcmVudEl0ZW0gPSA8SFRNTEVsZW1lbnQ+Z3JpZHN0ZXJFbC5wYXJlbnRFbGVtZW50ICYmXG4gICAgICAgICAgICA8SFRNTEVsZW1lbnQ+Z3JpZHN0ZXJFbC5wYXJlbnRFbGVtZW50LmNsb3Nlc3QoJ2dyaWRzdGVyLWl0ZW0nKTtcblxuICAgICAgICBpZiAocGFyZW50SXRlbSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXNPdmVyR3JpZHN0ZXIoaXRlbSwgcGFyZW50SXRlbSwgZXZlbnQsIG9wdGlvbnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgc3dpdGNoIChvcHRpb25zLnRvbGVyYW5jZSkge1xuICAgICAgICAgICAgY2FzZSAnZml0JzpcbiAgICAgICAgICAgICAgICByZXR1cm4gdXRpbHMuaXNFbGVtZW50Rml0Q29udGFpbmVyKGVsLCBncmlkc3RlckVsKTtcbiAgICAgICAgICAgIGNhc2UgJ2ludGVyc2VjdCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHV0aWxzLmlzRWxlbWVudEludGVyc2VjdENvbnRhaW5lcihlbCwgZ3JpZHN0ZXJFbCk7XG4gICAgICAgICAgICBjYXNlICd0b3VjaCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHV0aWxzLmlzRWxlbWVudFRvdWNoQ29udGFpbmVyKGVsLCBncmlkc3RlckVsKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHV0aWxzLmlzQ3Vyc29yQWJvdmVFbGVtZW50KGV2ZW50LCBncmlkc3RlckVsKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiJdfQ==