@blare/angular2gridster
Version:
[](https://badge.fury.io/js/angular2gridster)
276 lines • 28.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';
var GridsterPrototypeService = /** @class */ (function () {
function GridsterPrototypeService() {
this.isDragging = false;
this.dragSubject = new Subject();
this.dragStartSubject = new Subject();
this.dragStopSubject = new Subject();
}
/**
* @param {?} gridster
* @return {?}
*/
GridsterPrototypeService.prototype.observeDropOver = /**
* @param {?} gridster
* @return {?}
*/
function (gridster) {
var _this = this;
return this.dragStopSubject.pipe(filter(function (data) {
/** @type {?} */
var gridsterEl = gridster.gridsterComponent.$element;
/** @type {?} */
var isOverNestedGridster = [].slice.call(gridsterEl.querySelectorAll('gridster'))
.reduce(function (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(function (data) {
// TODO: what we should provide as a param?
// prototype.drop.emit({item: prototype.item});
data.item.onDrop(gridster);
}));
};
/**
* @param {?} gridster
* @return {?}
*/
GridsterPrototypeService.prototype.observeDropOut = /**
* @param {?} gridster
* @return {?}
*/
function (gridster) {
var _this = this;
return this.dragStopSubject.pipe(filter(function (data) {
/** @type {?} */
var gridsterEl = gridster.gridsterComponent.$element;
return !_this.isOverGridster(data.item, gridsterEl, data.event, gridster.options);
}), tap(function (data) {
// TODO: what we should provide as a param?
data.item.onCancel();
}));
};
/**
* @param {?} gridster
* @return {?}
*/
GridsterPrototypeService.prototype.observeDragOver = /**
* @param {?} gridster
* @return {?}
*/
function (gridster) {
var _this = this;
/** @type {?} */
var over = this.dragSubject.pipe(map(function (data) {
/** @type {?} */
var gridsterEl = gridster.gridsterComponent.$element;
return {
item: data.item,
event: data.event,
isOver: _this.isOverGridster(data.item, gridsterEl, data.event, gridster.options),
isDrop: false
};
}));
/** @type {?} */
var drop = this.dragStopSubject.pipe(map(function (data) {
/** @type {?} */
var gridsterEl = gridster.gridsterComponent.$element;
return {
item: data.item,
event: data.event,
isOver: _this.isOverGridster(data.item, gridsterEl, data.event, gridster.options),
isDrop: true
};
}));
/** @type {?} */
var dragExt = merge(
// dragStartSubject is connected in case when item prototype is placed above gridster
// and drag enter is not fired
this.dragStartSubject.pipe(map(function () { return ({ item: null, isOver: false, isDrop: false }); })), over, drop).pipe(scan(function (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(function (data) {
return !data.isDrop;
}), share());
/** @type {?} */
var dragEnter = this.createDragEnterObservable(dragExt, gridster);
/** @type {?} */
var dragOut = this.createDragOutObservable(dragExt, gridster);
/** @type {?} */
var dragOver = dragEnter
.pipe(switchMap(function () { return _this.dragSubject.pipe(takeUntil(dragOut)); }), map(function (data) { return data.item; }));
return { dragEnter: dragEnter, dragOut: dragOut, dragOver: dragOver };
};
/**
* @param {?} item
* @param {?} event
* @return {?}
*/
GridsterPrototypeService.prototype.dragItemStart = /**
* @param {?} item
* @param {?} event
* @return {?}
*/
function (item, event) {
this.isDragging = true;
this.dragStartSubject.next({ item: item, event: event });
};
/**
* @param {?} item
* @param {?} event
* @return {?}
*/
GridsterPrototypeService.prototype.dragItemStop = /**
* @param {?} item
* @param {?} event
* @return {?}
*/
function (item, event) {
this.isDragging = false;
this.dragStopSubject.next({ item: item, event: event });
};
/**
* @param {?} item
* @param {?} event
* @return {?}
*/
GridsterPrototypeService.prototype.updatePrototypePosition = /**
* @param {?} item
* @param {?} event
* @return {?}
*/
function (item, event) {
this.dragSubject.next({ item: item, event: event });
};
/**
* Creates observable that is fired on dragging over gridster container.
*/
/**
* Creates observable that is fired on dragging over gridster container.
* @param {?} dragIsOver
* @param {?} gridster
* @return {?}
*/
GridsterPrototypeService.prototype.createDragOverObservable = /**
* Creates observable that is fired on dragging over gridster container.
* @param {?} dragIsOver
* @param {?} gridster
* @return {?}
*/
function (dragIsOver, gridster) {
return dragIsOver.pipe(filter(function (data) { return data.isOver && !data.isEnter && !data.isOut; }), map(function (data) { return data.item; }), tap(function (item) { return item.onOver(gridster); }));
};
/**
* Creates observable that is fired on drag enter gridster container.
*/
/**
* Creates observable that is fired on drag enter gridster container.
* @param {?} dragIsOver
* @param {?} gridster
* @return {?}
*/
GridsterPrototypeService.prototype.createDragEnterObservable = /**
* Creates observable that is fired on drag enter gridster container.
* @param {?} dragIsOver
* @param {?} gridster
* @return {?}
*/
function (dragIsOver, gridster) {
return dragIsOver.pipe(filter(function (data) { return data.isEnter; }), map(function (data) { return data.item; }), tap(function (item) { return item.onEnter(gridster); }));
};
/**
* Creates observable that is fired on drag out gridster container.
*/
/**
* Creates observable that is fired on drag out gridster container.
* @param {?} dragIsOver
* @param {?} gridster
* @return {?}
*/
GridsterPrototypeService.prototype.createDragOutObservable = /**
* Creates observable that is fired on drag out gridster container.
* @param {?} dragIsOver
* @param {?} gridster
* @return {?}
*/
function (dragIsOver, gridster) {
return dragIsOver.pipe(filter(function (data) { return data.isOut; }), map(function (data) { return data.item; }), tap(function (item) { return item.onOut(gridster); }));
};
/**
* Checks whether "element" position fits inside "containerEl" position.
* It checks if "element" is totally covered by "containerEl" area.
*/
/**
* 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 {?}
*/
GridsterPrototypeService.prototype.isOverGridster = /**
* 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 {?}
*/
function (item, gridsterEl, event, options) {
/** @type {?} */
var el = item.$element;
/** @type {?} */
var 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 = function () { return []; };
return GridsterPrototypeService;
}());
export { GridsterPrototypeService };
if (false) {
/** @type {?} */
GridsterPrototypeService.prototype.isDragging;
/** @type {?} */
GridsterPrototypeService.prototype.dragSubject;
/** @type {?} */
GridsterPrototypeService.prototype.dragStartSubject;
/** @type {?} */
GridsterPrototypeService.prototype.dragStopSubject;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZHN0ZXItcHJvdG90eXBlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AYmxhcmUvYW5ndWxhcjJncmlkc3Rlci8iLCJzb3VyY2VzIjpbImxpYi9ncmlkc3Rlci1wcm90b3R5cGUvZ3JpZHN0ZXItcHJvdG90eXBlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFjLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDbEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBSXJGLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUd2QztJQVdJO1FBUlEsZUFBVSxHQUFHLEtBQUssQ0FBQztRQUVuQixnQkFBVyxHQUFHLElBQUksT0FBTyxFQUFPLENBQUM7UUFFakMscUJBQWdCLEdBQUcsSUFBSSxPQUFPLEVBQU8sQ0FBQztRQUV0QyxvQkFBZSxHQUFHLElBQUksT0FBTyxFQUFPLENBQUM7SUFFOUIsQ0FBQzs7Ozs7SUFFaEIsa0RBQWU7Ozs7SUFBZixVQUFpQixRQUF5QjtRQUExQyxpQkFzQkM7UUFyQkcsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FDNUIsTUFBTSxDQUFDLFVBQUMsSUFBSTs7Z0JBQ0YsVUFBVSxHQUFHLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxRQUFROztnQkFDaEQsb0JBQW9CLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxDQUFDO2lCQUM5RSxNQUFNLENBQUMsVUFBQyxjQUFjLEVBQUUsZ0JBQWdCO2dCQUNyQyxPQUFPLGNBQWM7b0JBQ2pCLEtBQUksQ0FB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QVEsT0FBTyxDQUFDLFNBQVMsRUFBRTtZQUN2QixLQUFLLEtBQUs7Z0JBQ04sT0FBTyxLQUFLLENBQUMscUJBQXFCLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQ3ZELEtBQUssV0FBVztnQkFDWixPQUFPLEtBQUssQ0FBQywyQkFBMkIsQ0FBQyxFQUFFLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDN0QsS0FBSyxPQUFPO2dCQUNSLE9BQU8sS0FBSyxDQUFDLHVCQUF1QixDQUFDLEVBQUUsRUFBRSxVQUFVLENBQUMsQ0FBQztZQUN6RDtnQkFDSSxPQUFPLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLENBQUM7U0FDNUQ7SUFDTCxDQUFDOztnQkFsTUosVUFBVTs7OztJQW1NWCwrQkFBQztDQUFBLEFBbk1ELElBbU1DO1NBbE1ZLHdCQUF3Qjs7O0lBRWpDLDhDQUEyQjs7SUFFM0IsK0NBQXlDOztJQUV6QyxvREFBOEM7O0lBRTlDLG1EQUE2QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QsIG1lcmdlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlVW50aWwsIHN3aXRjaE1hcCwgbWFwLCBzY2FuLCBmaWx0ZXIsIHNoYXJlLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IEdyaWRzdGVyU2VydmljZSB9IGZyb20gJy4uL2dyaWRzdGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgR3JpZHN0ZXJJdGVtUHJvdG90eXBlRGlyZWN0aXZlIH0gZnJvbSAnLi9ncmlkc3Rlci1pdGVtLXByb3RvdHlwZS5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgdXRpbHMgfSBmcm9tICcuLi91dGlscy91dGlscyc7XG5pbXBvcnQge0RyYWdnYWJsZUV2ZW50fSBmcm9tICcuLi91dGlscy9EcmFnZ2FibGVFdmVudCc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBHcmlkc3RlclByb3RvdHlwZVNlcnZpY2Uge1xuXG4gICAgcHJpdmF0ZSBpc0RyYWdnaW5nID0gZmFsc2U7XG5cbiAgICBwcml2YXRlIGRyYWdTdWJqZWN0ID0gbmV3IFN1YmplY3Q8YW55PigpO1xuXG4gICAgcHJpdmF0ZSBkcmFnU3RhcnRTdWJqZWN0ID0gbmV3IFN1YmplY3Q8YW55PigpO1xuXG4gICAgcHJpdmF0ZSBkcmFnU3RvcFN1YmplY3QgPSBuZXcgU3ViamVjdDxhbnk+KCk7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgICBvYnNlcnZlRHJvcE92ZXIgKGdyaWRzdGVyOiBHcmlkc3RlclNlcnZpY2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZHJhZ1N0b3BTdWJqZWN0LnBpcGUoXG4gICAgICAgICAgICBmaWx0ZXIoKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBncmlkc3RlckVsID0gZ3JpZHN0ZXIuZ3JpZHN0ZXJDb21wb25lbnQuJGVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgY29uc3QgaXNPdmVyTmVzdGVkR3JpZHN0ZXIgPSBbXS5zbGljZS5jYWxsKGdyaWRzdGVyRWwucXVlcnlTZWxlY3RvckFsbCgnZ3JpZHN0ZXInKSlcbiAgICAgICAgICAgICAgICAgICAgLnJlZHVjZSgoaXNPdmVyR3JpZHN0ZXIsIG5lc3RlZEdyaWRzdGVyRWwpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpc092ZXJHcmlkc3RlciB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNPdmVyR3JpZHN0ZXIoZGF0YS5pdGVtLCBuZXN0ZWRHcmlkc3RlckVsLCBkYXRhLmV2ZW50LCBncmlkc3Rlci5vcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgfSwgZmFsc2UpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGlzT3Zlck5lc3RlZEdyaWRzdGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pc092ZXJHcmlkc3RlcihkYXRhLml0ZW0sIGdyaWRzdGVyRWwsIGRhdGEuZXZlbnQsIGdyaWRzdGVyLm9wdGlvbnMpO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB0YXAoKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBUT0RPOiB3aGF0IHdlIHNob3VsZCBwcm92aWRlIGFzIGEgcGFyYW0/XG4gICAgICAgICAgICAgICAgLy8gcHJvdG90eXBlLmRyb3AuZW1pdCh7aXRlbTogcHJvdG90eXBlLml0ZW19KTtcbiAgICAgICAgICAgICAgICBkYXRhLml0ZW0ub25Ecm9wKGdyaWRzdGVyKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgb2JzZXJ2ZURyb3BPdXQgKGdyaWRzdGVyOiBHcmlkc3RlclNlcnZpY2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZHJhZ1N0b3BTdWJqZWN0LnBpcGUoXG4gICAgICAgICAgICBmaWx0ZXIoKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBncmlkc3RlckVsID0gZ3JpZHN0ZXIuZ3JpZHN0ZXJDb21wb25lbnQuJGVsZW1lbnQ7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gIXRoaXMuaXNPdmVyR3JpZHN0ZXIoZGF0YS5pdGVtLCBncmlkc3RlckVsLCBkYXRhLmV2ZW50LCBncmlkc3Rlci5vcHRpb25zKTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgdGFwKChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gVE9ETzogd2hhdCB3ZSBzaG91bGQgcHJvdmlkZSBhcyBhIHBhcmFtP1xuICAgICAgICAgICAgICAgIGRhdGEuaXRlbS5vbkNhbmNlbCgpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBvYnNlcnZlRHJhZ092ZXIoZ3JpZHN0ZXI6IEdyaWRzdGVyU2VydmljZSk6IHtcbiAgICAgICAgZHJhZ092ZXI6IE9ic2VydmFibGU8R3JpZHN0ZXJJdGVtUHJvdG90eXBlRGlyZWN0aXZlPixcbiAgICAgICAgZHJhZ0VudGVyOiBPYnNlcnZhYmxlPEdyaWRzdGVySXRlbVByb3RvdHlwZURpcmVjdGl2ZT4sXG4gICAgICAgIGRyYWdPdXQ6IE9ic2VydmFibGU8R3JpZHN0ZXJJdGVtUHJvdG90eXBlRGlyZWN0aXZlPlxuICAgIH0ge1xuICAgICAgICBjb25zdCBvdmVyID0gdGhpcy5kcmFnU3ViamVjdC5waXBlKFxuICAgICAgICAgICAgbWFwKChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZ3JpZHN0ZXJFbCA9IGdyaWRzdGVyLmdyaWRzdGVyQ29tcG9uZW50LiRlbGVtZW50O1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgIGl0ZW06IGRhdGEuaXRlbSxcbiAgICAgICAgICAgICAgICAgIGV2ZW50OiBkYXRhLmV2ZW50LFxuICAgICAgICAgICAgICAgICAgaXNPdmVyOiB0aGlzLmlzT3ZlckdyaWRzdGVyKGRhdGEuaXRlbSwgZ3JpZHN0ZXJFbCwgZGF0YS5ldmVudCwgZ3JpZHN0ZXIub3B0aW9ucyksXG4gICAgICAgICAgICAgICAgICBpc0Ryb3A6IGZhbHNlXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgZHJvcCA9IHRoaXMuZHJhZ1N0b3BTdWJqZWN0LnBpcGUoXG4gICAgICAgICAgICBtYXAoKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBncmlkc3RlckVsID0gZ3JpZHN0ZXIuZ3JpZHN0ZXJDb21wb25lbnQuJGVsZW1lbnQ7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBpdGVtOiBkYXRhLml0ZW0sXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50OiBkYXRhLmV2ZW50LFxuICAgICAgICAgICAgICAgICAgICBpc092ZXI6IHRoaXMuaXNPdmVyR3JpZHN0ZXIoZGF0YS5pdGVtLCBncmlkc3RlckVsLCBkYXRhLmV2ZW50LCBncmlkc3Rlci5vcHRpb25zKSxcbiAgICAgICAgICAgICAgICAgICAgaXNEcm9wOiB0cnVlXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgZHJhZ0V4dCA9IG1lcmdlKFxuICAgICAgICAgICAgICAgIC8vIGRyYWdTdGFydFN1YmplY3QgaXMgY29ubmVjdGVkIGluIGNhc2Ugd2hlbiBpdGVtIHByb3RvdHlwZSBpcyBwbGFjZWQgYWJvdmUgZ3JpZHN0ZXJcbiAgICAgICAgICAgICAgICAvLyBhbmQgZHJhZyBlbnRlciBpcyBub3QgZmlyZWRcbiAgICAgICAgICAgICAgICB0aGlzLmRyYWdTdGFydFN1YmplY3QucGlwZShtYXAoKCkgPT4gKHsgaXRlbTogbnVsbCwgaXNPdmVyOiBmYWxzZSwgaXNEcm9wOiBmYWxzZSB9KSkpLFxuICAgICAgICAgICAgICAgIG92ZXIsXG4gICAgICAgICAgICAgICAgZHJvcFxuICAgICAgICAgICAgKS5waXBlKFxuICAgICAgICAgICAgICAgIHNjYW4oKHByZXY6IGFueSwgbmV4dDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtOiBuZXh0Lml0ZW0sXG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudDogbmV4dC5ldmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzT3ZlcjogbmV4dC5pc092ZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICBpc0VudGVyOiBwcmV2LmlzT3ZlciA9PT0gZmFsc2UgJiYgbmV4dC5pc092ZXIgPT09IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBpc091dDogcHJldi5pc092ZXIgPT09IHRydWUgJiYgbmV4dC5pc092ZXIgPT09IGZhbHNlICYmICFwcmV2LmlzRHJvcCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzRHJvcDogbmV4dC5pc0Ryb3BcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICBmaWx0ZXIoKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gIWRhdGEuaXNEcm9wO1xuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIHNoYXJlKClcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgZHJhZ0VudGVyID0gdGhpcy5jcmVhdGVEcmFnRW50ZXJPYnNlcnZhYmxlKGRyYWdFeHQsIGdyaWRzdGVyKTtcbiAgICAgICAgY29uc3QgZHJhZ091dCA9IHRoaXMuY3JlYXRlRHJhZ091dE9ic2VydmFibGUoZHJhZ0V4dCwgZ3JpZHN0ZXIpO1xuICAgICAgICBjb25zdCBkcmFnT3ZlciA9IGRyYWdFbnRlclxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMuZHJhZ1N1YmplY3QucGlwZSh0YWtlVW50aWwoZHJhZ091dCkpKSxcbiAgICAgICAgICAgICAgICBtYXAoKGRhdGE6IGFueSkgPT4gZGF0YS5pdGVtKVxuICAgICAgICAgICAgKTtcblxuICAgICAgICByZXR1cm4geyBkcmFnRW50ZXIsIGRyYWdPdXQsIGRyYWdPdmVyIH07XG4gICAgfVxuXG4gICAgZHJhZ0l0ZW1TdGFydChpdGVtOiBHcmlkc3Rlckl0ZW1Qcm90b3R5cGVEaXJlY3RpdmUsIGV2ZW50OiBEcmFnZ2FibGVFdmVudCkge1xuICAgICAgICB0aGlzLmlzRHJhZ2dpbmcgPSB0cnVlO1xuICAgICAgICB0aGlzLmRyYWdTdGFydFN1YmplY3QubmV4dCh7IGl0ZW0sIGV2ZW50IH0pO1xuICAgIH1cblxuICAgIGRyYWdJdGVtU3RvcChpdGVtOiBHcmlkc3Rlckl0ZW1Qcm90b3R5cGVEaXJlY3RpdmUsIGV2ZW50OiBEcmFnZ2FibGVFdmVudCkge1xuICAgICAgICB0aGlzLmlzRHJhZ2dpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5kcmFnU3RvcFN1YmplY3QubmV4dCh7IGl0ZW0sIGV2ZW50IH0pO1xuICAgIH1cblxuICAgIHVwZGF0ZVByb3RvdHlwZVBvc2l0aW9uKGl0ZW06IEdyaWRzdGVySXRlbVByb3RvdHlwZURpcmVjdGl2ZSwgZXZlbnQ6IERyYWdnYWJsZUV2ZW50KSB7XG4gICAgICAgIHRoaXMuZHJhZ1N1YmplY3QubmV4dCh7IGl0ZW0sIGV2ZW50IH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgb2JzZXJ2YWJsZSB0aGF0IGlzIGZpcmVkIG9uIGRyYWdnaW5nIG92ZXIgZ3JpZHN0ZXIgY29udGFpbmVyLlxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlRHJhZ092ZXJPYnNlcnZhYmxlIChcbiAgICAgICAgZHJhZ0lzT3ZlcjogT2JzZXJ2YWJsZTx7aXRlbTogR3JpZHN0ZXJJdGVtUHJvdG90eXBlRGlyZWN0aXZlLCBpc092ZXI6IGJvb2xlYW59PixcbiAgICAgICAgZ3JpZHN0ZXI6IEdyaWRzdGVyU2VydmljZVxuICAgICkge1xuICAgICAgICByZXR1cm4gZHJhZ0lzT3Zlci5waXBlKFxuICAgICAgICAgICAgZmlsdGVyKChkYXRhOiBhbnkpID0+IGRhdGEuaXNPdmVyICYmICFkYXRhLmlzRW50ZXIgJiYgIWRhdGEuaXNPdXQpLFxuICAgICAgICAgICAgbWFwKChkYXRhOiBhbnkpOiBHcmlkc3Rlckl0ZW1Qcm90b3R5cGVEaXJlY3RpdmUgPT4gZGF0YS5pdGVtKSxcbiAgICAgICAgICAgIHRhcCgoaXRlbSkgPT4gaXRlbS5vbk92ZXIoZ3JpZHN0ZXIpKVxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIG9ic2VydmFibGUgdGhhdCBpcyBmaXJlZCBvbiBkcmFnIGVudGVyIGdyaWRzdGVyIGNvbnRhaW5lci5cbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZURyYWdFbnRlck9ic2VydmFibGUgKFxuICAgICAgICBkcmFnSXNPdmVyOiBPYnNlcnZhYmxlPHtpdGVtOiBHcmlkc3Rlckl0ZW1Qcm90b3R5cGVEaXJlY3RpdmUsIGlzT3ZlcjogYm9vbGVhbn0+LFxuICAgICAgICBncmlkc3RlcjogR3JpZHN0ZXJTZXJ2aWNlXG4gICAgKSB7XG4gICAgICAgIHJldHVybiBkcmFnSXNPdmVyLnBpcGUoXG4gICAgICAgICAgICBmaWx0ZXIoKGRhdGE6IGFueSkgPT4gZGF0YS5pc0VudGVyKSxcbiAgICAgICAgICAgIG1hcCgoZGF0YTogYW55KTogR3JpZHN0ZXJJdGVtUHJvdG90eXBlRGlyZWN0aXZlID0+IGRhdGEuaXRlbSksXG4gICAgICAgICAgICB0YXAoKGl0ZW0pID0+IGl0ZW0ub25FbnRlcihncmlkc3RlcikpXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgb2JzZXJ2YWJsZSB0aGF0IGlzIGZpcmVkIG9uIGRyYWcgb3V0IGdyaWRzdGVyIGNvbnRhaW5lci5cbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZURyYWdPdXRPYnNlcnZhYmxlIChcbiAgICAgICAgZHJhZ0lzT3ZlcjogT2JzZXJ2YWJsZTx7aXRlbTogR3JpZHN0ZXJJdGVtUHJvdG90eXBlRGlyZWN0aXZlLFxuICAgICAgICBpc092ZXI6IGJvb2xlYW59PixcbiAgICAgICAgZ3JpZHN0ZXI6IEdyaWRzdGVyU2VydmljZVxuICAgICkge1xuICAgICAgICByZXR1cm4gZHJhZ0lzT3Zlci5waXBlKFxuICAgICAgICAgICAgZmlsdGVyKChkYXRhOiBhbnkpID0+IGRhdGEuaXNPdXQpLFxuICAgICAgICAgICAgbWFwKChkYXRhOiBhbnkpOiBHcmlkc3Rlckl0ZW1Qcm90b3R5cGVEaXJlY3RpdmUgPT4gZGF0YS5pdGVtKSxcbiAgICAgICAgICAgIHRhcCgoaXRlbSkgPT4gaXRlbS5vbk91dChncmlkc3RlcikpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgXCJlbGVtZW50XCIgcG9zaXRpb24gZml0cyBpbnNpZGUgXCJjb250YWluZXJFbFwiIHBvc2l0aW9uLlxuICAgICAqIEl0IGNoZWNrcyBpZiBcImVsZW1lbnRcIiBpcyB0b3RhbGx5IGNvdmVyZWQgYnkgXCJjb250YWluZXJFbFwiIGFyZWEuXG4gICAgICovXG4gICAgcHJpdmF0ZSBpc092ZXJHcmlkc3RlcihpdGVtOiBHcmlkc3Rlckl0ZW1Qcm90b3R5cGVEaXJlY3RpdmUsIGdyaWRzdGVyRWw6IEhUTUxFbGVtZW50LCBldmVudCwgb3B0aW9ucyk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBlbCA9IGl0ZW0uJGVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IHBhcmVudEl0ZW0gPSA8SFRNTEVsZW1lbnQ+Z3JpZHN0ZXJFbC5wYXJlbnRFbGVtZW50ICYmXG4gICAgICAgICAgICA8SFRNTEVsZW1lbnQ+Z3JpZHN0ZXJFbC5wYXJlbnRFbGVtZW50LmNsb3Nlc3QoJ2dyaWRzdGVyLWl0ZW0nKTtcblxuICAgICAgICBpZiAocGFyZW50SXRlbSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXNPdmVyR3JpZHN0ZXIoaXRlbSwgcGFyZW50SXRlbSwgZXZlbnQsIG9wdGlvbnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgc3dpdGNoIChvcHRpb25zLnRvbGVyYW5jZSkge1xuICAgICAgICAgICAgY2FzZSAnZml0JzpcbiAgICAgICAgICAgICAgICByZXR1cm4gdXRpbHMuaXNFbGVtZW50Rml0Q29udGFpbmVyKGVsLCBncmlkc3RlckVsKTtcbiAgICAgICAgICAgIGNhc2UgJ2ludGVyc2VjdCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHV0aWxzLmlzRWxlbWVudEludGVyc2VjdENvbnRhaW5lcihlbCwgZ3JpZHN0ZXJFbCk7XG4gICAgICAgICAgICBjYXNlICd0b3VjaCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHV0aWxzLmlzRWxlbWVudFRvdWNoQ29udGFpbmVyKGVsLCBncmlkc3RlckVsKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHV0aWxzLmlzQ3Vyc29yQWJvdmVFbGVtZW50KGV2ZW50LCBncmlkc3RlckVsKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiJdfQ==