ngx-simple-modal
Version:
A simple unopinionated framework to implement simple modal based behaviour in angular (v2+) projects.
221 lines • 27.3 kB
JavaScript
import * as tslib_1 from "tslib";
import { Component, ComponentFactoryResolver, ElementRef, Inject, Type, ViewContainerRef, ViewChild, Renderer2, ComponentRef, NgZone } from '@angular/core';
import { of } from 'rxjs';
import { DefaultSimpleModalOptionConfig } from './simple-modal-options';
import { SimpleModalWrapperComponent } from './simple-modal-wrapper.component';
import { DraggableDirective } from './simple-modal-draggable.directive';
/**
* View container manager which manages a list of modals currently active
* inside the viewvontainer
*/
var SimpleModalHolderComponent = /** @class */ (function () {
/**
* Constructor
* @param {ComponentFactoryResolver} resolver
* @param renderer
* @param ngZone
* @param defaultSimpleModalOptions
*/
function SimpleModalHolderComponent(resolver, renderer, ngZone, defaultSimpleModalOptions) {
this.resolver = resolver;
this.renderer = renderer;
this.ngZone = ngZone;
this.defaultSimpleModalOptions = defaultSimpleModalOptions;
/**
* modal collection, maintained by addModal and removeModal
* @type {Array<SimpleModalComponent> }
*/
this.modals = [];
/**
* if auto focus is on and no element focused, store it here to be restored back after close
*/
this.previousActiveElement = null;
}
/**
* Configures then adds modal to the modals array, and populates with data passed in
* @param {Type<SimpleModalComponent>} component
* @param {object?} data
* @param {SimpleModalOptionsOverrides?} options
* @return {Observable<*>}
*/
SimpleModalHolderComponent.prototype.addModal = function (component, data, options) {
var _this = this;
// create component
if (!this.viewContainer) {
return of(null);
}
var factory = this.resolver.resolveComponentFactory(SimpleModalWrapperComponent);
var componentRef = this.viewContainer.createComponent(factory);
var modalWrapper = (componentRef.instance);
var _a = modalWrapper.addComponent(component), _componentRef = _a.ref, _component = _a.component;
// assign options refs
_component.options = options = Object.assign({}, this.defaultSimpleModalOptions, options);
// set base classes for wrapper
modalWrapper.modalClasses = options.wrapperDefaultClasses;
// add to stack
this.modals.push(_component);
// wait a tick then setup the following while adding a modal
this.wait().then(function () {
_this.toggleWrapperClass(modalWrapper.wrapper, options.wrapperClass);
_this.toggleBodyClass(options.bodyClass);
if (options.draggable) {
_this.setDraggable(_componentRef, options);
}
_this.wait(options.animationDuration).then(function () {
_this.autoFocusFirstElement(_component.wrapper, options.autoFocus);
_component.markAsReady();
});
});
// when closing modal remove it
_component.onClosing(function (modal) { return _this.removeModal(modal); });
// if clicking on background closes modal
this.configureCloseOnClickOutside(modalWrapper);
// map and return observable
_component.mapDataObject(data);
return _component.setupObserver();
};
/**
* triggers components close function
* to take effect
* @returns {Promise<void>}
* @param closingModal
*/
SimpleModalHolderComponent.prototype.removeModal = function (closingModal) {
var _this = this;
var options = closingModal.options;
this.toggleWrapperClass(closingModal.wrapper, options.wrapperClass);
return this.wait(options.animationDuration).then(function () {
_this.removeModalFromArray(closingModal);
_this.toggleBodyClass(options.bodyClass);
_this.restorePreviousFocus();
});
};
/**
* Instructs all open modals to
*/
SimpleModalHolderComponent.prototype.removeAllModals = function () {
var _this = this;
return Promise.all(this.modals.map(function (modal) { return _this.removeModal(modal); }));
};
/**
* Bind a body class 'modal-open' to a condition of modals in pool > 0
* @param bodyClass - string to add and remove from body in document
*/
SimpleModalHolderComponent.prototype.toggleBodyClass = function (bodyClass) {
var _a, _b;
if (!bodyClass) {
return;
}
var body = document.getElementsByTagName('body')[0];
var bodyClassItems = bodyClass.split(' ');
if (!this.modals.length) {
(_a = body.classList).remove.apply(_a, tslib_1.__spread(bodyClassItems));
}
else {
(_b = body.classList).add.apply(_b, tslib_1.__spread(bodyClassItems));
}
};
/**
* if the option to close on background click is set, then hook up a callback
* @param modalWrapper
*/
SimpleModalHolderComponent.prototype.configureCloseOnClickOutside = function (modalWrapper) {
modalWrapper.onClickOutsideModalContent(function () {
if (modalWrapper.content.options.closeOnClickOutside) {
modalWrapper.content.close();
}
});
};
/**
* Auto focus o the first element if autofocus is on
* @param componentWrapper
* @param autoFocus
*/
SimpleModalHolderComponent.prototype.autoFocusFirstElement = function (componentWrapper, autoFocus) {
if (autoFocus) {
var focusable = componentWrapper.nativeElement.querySelectorAll('button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])');
if (focusable && focusable.length) {
this.previousActiveElement = document.activeElement;
focusable[0].focus();
}
}
};
/**
* Restores the last focus is there was one
*/
SimpleModalHolderComponent.prototype.restorePreviousFocus = function () {
if (this.previousActiveElement) {
this.previousActiveElement.focus();
this.previousActiveElement = null;
}
};
/**
* Configure the adding and removal of a wrapper class - predominantly animation focused
* @param modalWrapperEl
* @param wrapperClass
*/
SimpleModalHolderComponent.prototype.toggleWrapperClass = function (modalWrapperEl, wrapperClass) {
var wrapperClassList = modalWrapperEl.nativeElement.classList;
var wrapperClassItems = wrapperClass.split(' ');
if (wrapperClassList.toString().indexOf(wrapperClass) !== -1) {
wrapperClassList.remove.apply(wrapperClassList, tslib_1.__spread(wrapperClassItems));
}
else {
wrapperClassList.add.apply(wrapperClassList, tslib_1.__spread(wrapperClassItems));
}
};
/**
* Enables the drag option on the modal if the options have it enabled
* @param component
* @param options
* @private
*/
SimpleModalHolderComponent.prototype.setDraggable = function (component, options) {
var draggableDirective = new DraggableDirective(component.location, this.ngZone, this.renderer);
draggableDirective.dragTarget = component.location.nativeElement;
draggableDirective.dragHandle = component.instance.handle ? component.instance.handle.nativeElement : undefined;
draggableDirective.ngAfterViewInit();
component.location.nativeElement.classList.add(options.draggableClass);
};
/**
* Helper function for a more readable timeout
* @param ms
*/
SimpleModalHolderComponent.prototype.wait = function (ms) {
if (ms === void 0) { ms = 0; }
return new Promise(function (resolve, reject) {
setTimeout(function () { return resolve(); }, ms);
});
};
/**
* Instructs the holder to remove the modal and
* removes this component from the collection
* @param {SimpleModalComponent} component
*/
SimpleModalHolderComponent.prototype.removeModalFromArray = function (component) {
var index = this.modals.indexOf(component);
if (index > -1) {
this.viewContainer.remove(index);
this.modals.splice(index, 1);
}
};
SimpleModalHolderComponent.ctorParameters = function () { return [
{ type: ComponentFactoryResolver },
{ type: Renderer2 },
{ type: NgZone },
{ type: undefined, decorators: [{ type: Inject, args: [DefaultSimpleModalOptionConfig,] }] }
]; };
tslib_1.__decorate([
ViewChild('viewContainer', { read: ViewContainerRef, static: true })
], SimpleModalHolderComponent.prototype, "viewContainer", void 0);
SimpleModalHolderComponent = tslib_1.__decorate([
Component({
selector: 'simple-modal-holder',
template: '<ng-template #viewContainer></ng-template>'
}),
tslib_1.__param(3, Inject(DefaultSimpleModalOptionConfig))
], SimpleModalHolderComponent);
return SimpleModalHolderComponent;
}());
export { SimpleModalHolderComponent };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2ltcGxlLW1vZGFsLWhvbGRlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtc2ltcGxlLW1vZGFsLyIsInNvdXJjZXMiOlsic2ltcGxlLW1vZGFsL3NpbXBsZS1tb2RhbC1ob2xkZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLHdCQUF3QixFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1SixPQUFPLEVBQWMsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3RDLE9BQU8sRUFBRSw4QkFBOEIsRUFBbUQsTUFBTSx3QkFBd0IsQ0FBQztBQUN6SCxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUUvRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUV4RTs7O0dBR0c7QUFLSDtJQWlCRTs7Ozs7O09BTUc7SUFDSCxvQ0FDVSxRQUFrQyxFQUNsQyxRQUFtQixFQUNuQixNQUFjLEVBQzBCLHlCQUE2QztRQUhyRixhQUFRLEdBQVIsUUFBUSxDQUEwQjtRQUNsQyxhQUFRLEdBQVIsUUFBUSxDQUFXO1FBQ25CLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDMEIsOEJBQXlCLEdBQXpCLHlCQUF5QixDQUFvQjtRQXRCL0Y7OztXQUdHO1FBQ0gsV0FBTSxHQUEwQyxFQUFFLENBQUM7UUFFbkQ7O1dBRUc7UUFDSCwwQkFBcUIsR0FBRyxJQUFJLENBQUM7SUFlN0IsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILDZDQUFRLEdBQVIsVUFDRSxTQUE0QyxFQUM1QyxJQUFRLEVBQ1IsT0FBcUM7UUFIdkMsaUJBZ0RDO1FBM0NDLG1CQUFtQjtRQUNuQixJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFB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Q0FBQyxDQUFBO09BNUI5QiwwQkFBMEIsQ0EyTnRDO0lBQUQsaUNBQUM7Q0FBQSxBQTNORCxJQTJOQztTQTNOWSwwQkFBMEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIENvbXBvbmVudEZhY3RvcnlSZXNvbHZlciwgRWxlbWVudFJlZiwgSW5qZWN0LCBUeXBlLCBWaWV3Q29udGFpbmVyUmVmLCBWaWV3Q2hpbGQsIFJlbmRlcmVyMiwgQ29tcG9uZW50UmVmLCBOZ1pvbmUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUsIG9mIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBEZWZhdWx0U2ltcGxlTW9kYWxPcHRpb25Db25maWcsIFNpbXBsZU1vZGFsT3B0aW9ucywgU2ltcGxlTW9kYWxPcHRpb25zT3ZlcnJpZGVzIH0gZnJvbSAnLi9zaW1wbGUtbW9kYWwtb3B0aW9ucyc7XG5pbXBvcnQgeyBTaW1wbGVNb2RhbFdyYXBwZXJDb21wb25lbnQgfSBmcm9tICcuL3NpbXBsZS1tb2RhbC13cmFwcGVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTaW1wbGVNb2RhbENvbXBvbmVudCB9IGZyb20gJy4vc2ltcGxlLW1vZGFsLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBEcmFnZ2FibGVEaXJlY3RpdmUgfSBmcm9tICcuL3NpbXBsZS1tb2RhbC1kcmFnZ2FibGUuZGlyZWN0aXZlJztcblxuLyoqXG4gKiBWaWV3IGNvbnRhaW5lciBtYW5hZ2VyIHdoaWNoIG1hbmFnZXMgYSBsaXN0IG9mIG1vZGFscyBjdXJyZW50bHkgYWN0aXZlXG4gKiBpbnNpZGUgdGhlIHZpZXd2b250YWluZXJcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc2ltcGxlLW1vZGFsLWhvbGRlcicsXG4gIHRlbXBsYXRlOiAnPG5nLXRlbXBsYXRlICN2aWV3Q29udGFpbmVyPjwvbmctdGVtcGxhdGU+Jyxcbn0pXG5leHBvcnQgY2xhc3MgU2ltcGxlTW9kYWxIb2xkZXJDb21wb25lbnQge1xuICAvKipcbiAgICogVGFyZ2V0IHZpZXdDb250YWluZXIgdG8gaW5zZXJ0IG1vZGFsc1xuICAgKi9cbiAgQFZpZXdDaGlsZCgndmlld0NvbnRhaW5lcicsIHsgcmVhZDogVmlld0NvbnRhaW5lclJlZiwgc3RhdGljOiB0cnVlIH0pIHZpZXdDb250YWluZXI7XG5cbiAgLyoqXG4gICAqIG1vZGFsIGNvbGxlY3Rpb24sIG1haW50YWluZWQgYnkgYWRkTW9kYWwgYW5kIHJlbW92ZU1vZGFsXG4gICAqIEB0eXBlIHtBcnJheTxTaW1wbGVNb2RhbENvbXBvbmVudD4gfVxuICAgKi9cbiAgbW9kYWxzOiBBcnJheTxTaW1wbGVNb2RhbENvbXBvbmVudDxhbnksIGFueT4+ID0gW107XG5cbiAgLyoqXG4gICAqIGlmIGF1dG8gZm9jdXMgaXMgb24gYW5kIG5vIGVsZW1lbnQgZm9jdXNlZCwgc3RvcmUgaXQgaGVyZSB0byBiZSByZXN0b3JlZCBiYWNrIGFmdGVyIGNsb3NlXG4gICAqL1xuICBwcmV2aW91c0FjdGl2ZUVsZW1lbnQgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0ge0NvbXBvbmVudEZhY3RvcnlSZXNvbHZlcn0gcmVzb2x2ZXJcbiAgICogQHBhcmFtIHJlbmRlcmVyXG4gICAqIEBwYXJhbSBuZ1pvbmVcbiAgICogQHBhcmFtIGRlZmF1bHRTaW1wbGVNb2RhbE9wdGlvbnNcbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVzb2x2ZXI6IENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgcHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZSxcbiAgICBASW5qZWN0KERlZmF1bHRTaW1wbGVNb2RhbE9wdGlvbkNvbmZpZykgcHJpdmF0ZSBkZWZhdWx0U2ltcGxlTW9kYWxPcHRpb25zOiBTaW1wbGVNb2RhbE9wdGlvbnMsXG4gICkge1xuICB9XG5cbiAgLyoqXG4gICAqIENvbmZpZ3VyZXMgdGhlbiBhZGRzIG1vZGFsIHRvIHRoZSBtb2RhbHMgYXJyYXksIGFuZCBwb3B1bGF0ZXMgd2l0aCBkYXRhIHBhc3NlZCBpblxuICAgKiBAcGFyYW0ge1R5cGU8U2ltcGxlTW9kYWxDb21wb25lbnQ+fSBjb21wb25lbnRcbiAgICogQHBhcmFtIHtvYmplY3Q/fSBkYXRhXG4gICAqIEBwYXJhbSB7U2ltcGxlTW9kYWxPcHRpb25zT3ZlcnJpZGVzP30gb3B0aW9uc1xuICAgKiBAcmV0dXJuIHtPYnNlcnZhYmxlPCo+fVxuICAgKi9cbiAgYWRkTW9kYWw8VCwgVDE+KFxuICAgIGNvbXBvbmVudDogVHlwZTxTaW1wbGVNb2RhbENvbXBvbmVudDxULCBUMT4+LFxuICAgIGRhdGE/OiBULFxuICAgIG9wdGlvbnM/OiBTaW1wbGVNb2RhbE9wdGlvbnNPdmVycmlkZXMsXG4gICk6IE9ic2VydmFibGU8VDE+IHtcbiAgICAvLyBjcmVhdGUgY29tcG9uZW50XG4gICAgaWYgKCF0aGlzLnZpZXdDb250YWluZXIpIHtcbiAgICAgIHJldHVybiBvZihudWxsKTtcbiAgICB9XG4gICAgY29uc3QgZmFjdG9yeSA9IHRoaXMucmVzb2x2ZXIucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoU2ltcGxlTW9kYWxXcmFwcGVyQ29tcG9uZW50KTtcbiAgICBjb25zdCBjb21wb25lbnRSZWYgPSB0aGlzLnZpZXdDb250YWluZXIuY3JlYXRlQ29tcG9uZW50KGZhY3RvcnkpO1xuICAgIGNvbnN0IG1vZGFsV3JhcHBlcjogU2ltcGxlTW9kYWxXcmFwcGVyQ29tcG9uZW50ID0gPFNpbXBsZU1vZGFsV3JhcHBlckNvbXBvbmVudD4oXG4gICAgICBjb21wb25lbnRSZWYuaW5zdGFuY2VcbiAgICApO1xuICAgIGNvbnN0IHsgcmVmOiBfY29tcG9uZW50UmVmLCBjb21wb25lbnQ6IF9jb21wb25lbnQgfSA9IG1vZGFsV3JhcHBlci5hZGRDb21wb25lbnQoY29tcG9uZW50KTtcblxuICAgIC8vIGFzc2lnbiBvcHRpb25zIHJlZnNcbiAgICBfY29tcG9uZW50Lm9wdGlvbnMgPSBvcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5kZWZhdWx0U2ltcGxlTW9kYWxPcHRpb25zLCBvcHRpb25zKSBhcyBTaW1wbGVNb2RhbE9wdGlvbnM7XG5cbiAgICAvLyBzZXQgYmFzZSBjbGFzc2VzIGZvciB3cmFwcGVyXG4gICAgbW9kYWxXcmFwcGVyLm1vZGFsQ2xhc3NlcyA9IG9wdGlvbnMud3JhcHBlckRlZmF1bHRDbGFzc2VzO1xuXG4gICAgLy8gYWRkIHRvIHN0YWNrXG4gICAgdGhpcy5tb2RhbHMucHVzaChfY29tcG9uZW50KTtcblxuICAgIC8vIHdhaXQgYSB0aWNrIHRoZW4gc2V0dXAgdGhlIGZvbGxvd2luZyB3aGlsZSBhZGRpbmcgYSBtb2RhbFxuICAgIHRoaXMud2FpdCgpLnRoZW4oKCkgPT4ge1xuICAgICAgdGhpcy50b2dnbGVXcmFwcGVyQ2xhc3MobW9kYWxXcmFwcGVyLndyYXBwZXIsIG9wdGlvbnMud3JhcHBlckNsYXNzKTtcbiAgICAgIHRoaXMudG9nZ2xlQm9keUNsYXNzKG9wdGlvbnMuYm9keUNsYXNzKTtcbiAgICAgIGlmIChvcHRpb25zLmRyYWdnYWJsZSkge1xuICAgICAgICB0aGlzLnNldERyYWdnYWJsZShfY29tcG9uZW50UmVmLCBvcHRpb25zKTtcbiAgICAgIH1cbiAgICAgIHRoaXMud2FpdChvcHRpb25zLmFuaW1hdGlvbkR1cmF0aW9uKS50aGVuKCgpID0+IHtcbiAgICAgICAgdGhpcy5hdXRvRm9jdXNGaXJzdEVsZW1lbnQoX2NvbXBvbmVudC53cmFwcGVyLCBvcHRpb25zLmF1dG9Gb2N1cyk7XG4gICAgICAgIF9jb21wb25lbnQubWFya0FzUmVhZHkoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgLy8gd2hlbiBjbG9zaW5nIG1vZGFsIHJlbW92ZSBpdFxuICAgIF9jb21wb25lbnQub25DbG9zaW5nKG1vZGFsID0+IHRoaXMucmVtb3ZlTW9kYWwobW9kYWwpKTtcblxuICAgIC8vIGlmIGNsaWNraW5nIG9uIGJhY2tncm91bmQgY2xvc2VzIG1vZGFsXG4gICAgdGhpcy5jb25maWd1cmVDbG9zZU9uQ2xpY2tPdXRzaWRlKG1vZGFsV3JhcHBlcik7XG5cbiAgICAvLyBtYXAgYW5kIHJldHVybiBvYnNlcnZhYmxlXG4gICAgX2NvbXBvbmVudC5tYXBEYXRhT2JqZWN0KGRhdGEpO1xuXG4gICAgcmV0dXJuIF9jb21wb25lbnQuc2V0dXBPYnNlcnZlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIHRyaWdnZXJzIGNvbXBvbmVudHMgY2xvc2UgZnVuY3Rpb25cbiAgICogdG8gdGFrZSBlZmZlY3RcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqIEBwYXJhbSBjbG9zaW5nTW9kYWxcbiAgICovXG4gIHJlbW92ZU1vZGFsKGNsb3NpbmdNb2RhbDogU2ltcGxlTW9kYWxDb21wb25lbnQ8YW55LCBhbnk+KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBvcHRpb25zID0gY2xvc2luZ01vZGFsLm9wdGlvbnM7XG4gICAgdGhpcy50b2dnbGVXcmFwcGVyQ2xhc3MoY2xvc2luZ01vZGFsLndyYXBwZXIsIG9wdGlvbnMud3JhcHBlckNsYXNzKTtcbiAgICByZXR1cm4gdGhpcy53YWl0KG9wdGlvbnMuYW5pbWF0aW9uRHVyYXRpb24pLnRoZW4oKCkgPT4ge1xuICAgICAgdGhpcy5yZW1vdmVNb2RhbEZyb21BcnJheShjbG9zaW5nTW9kYWwpO1xuICAgICAgdGhpcy50b2dnbGVCb2R5Q2xhc3Mob3B0aW9ucy5ib2R5Q2xhc3MpO1xuICAgICAgdGhpcy5yZXN0b3JlUHJldmlvdXNGb2N1cygpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEluc3RydWN0cyBhbGwgb3BlbiBtb2RhbHMgdG9cbiAgICovXG4gIHJlbW92ZUFsbE1vZGFscygpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiBQcm9taXNlLmFsbCh0aGlzLm1vZGFscy5tYXAobW9kYWwgPT4gdGhpcy5yZW1vdmVNb2RhbChtb2RhbCkpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCaW5kIGEgYm9keSBjbGFzcyAnbW9kYWwtb3BlbicgdG8gYSBjb25kaXRpb24gb2YgbW9kYWxzIGluIHBvb2wgPiAwXG4gICAqIEBwYXJhbSBib2R5Q2xhc3MgLSBzdHJpbmcgdG8gYWRkIGFuZCByZW1vdmUgZnJvbSBib2R5IGluIGRvY3VtZW50XG4gICAqL1xuICBwcml2YXRlIHRvZ2dsZUJvZHlDbGFzcyhib2R5Q2xhc3M6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghYm9keUNsYXNzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnYm9keScpWzBdO1xuICAgIGNvbnN0IGJvZHlDbGFzc0l0ZW1zID0gYm9keUNsYXNzLnNwbGl0KCcgJyk7XG4gICAgaWYgKCF0aGlzLm1vZGFscy5sZW5ndGgpIHtcbiAgICAgIGJvZHkuY2xhc3NMaXN0LnJlbW92ZSguLi5ib2R5Q2xhc3NJdGVtcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJvZHkuY2xhc3NMaXN0LmFkZCguLi5ib2R5Q2xhc3NJdGVtcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGlmIHRoZSBvcHRpb24gdG8gY2xvc2Ugb24gYmFja2dyb3VuZCBjbGljayBpcyBzZXQsIHRoZW4gaG9vayB1cCBhIGNhbGxiYWNrXG4gICAqIEBwYXJhbSBtb2RhbFdyYXBwZXJcbiAgICovXG4gIHByaXZhdGUgY29uZmlndXJlQ2xvc2VPbkNsaWNrT3V0c2lkZShtb2RhbFdyYXBwZXI6IFNpbXBsZU1vZGFsV3JhcHBlckNvbXBvbmVudCkge1xuICAgIG1vZGFsV3JhcHBlci5vbkNsaWNrT3V0c2lkZU1vZGFsQ29udGVudCgoKSA9PiB7XG4gICAgICBpZiAobW9kYWxXcmFwcGVyLmNvbnRlbnQub3B0aW9ucy5jbG9zZU9uQ2xpY2tPdXRzaWRlKSB7XG4gICAgICAgIG1vZGFsV3JhcHBlci5jb250ZW50LmNsb3NlKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQXV0byBmb2N1cyBvIHRoZSBmaXJzdCBlbGVtZW50IGlmIGF1dG9mb2N1cyBpcyBvblxuICAgKiBAcGFyYW0gY29tcG9uZW50V3JhcHBlclxuICAgKiBAcGFyYW0gYXV0b0ZvY3VzXG4gICAqL1xuICBwcml2YXRlIGF1dG9Gb2N1c0ZpcnN0RWxlbWVudChjb21wb25lbnRXcmFwcGVyOiBFbGVtZW50UmVmLCBhdXRvRm9jdXM6IGJvb2xlYW4pIHtcbiAgICBpZiAoYXV0b0ZvY3VzKSB7XG4gICAgICBjb25zdCBmb2N1c2FibGUgPSBjb21wb25lbnRXcmFwcGVyLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvckFsbChcbiAgICAgICAgJ2J1dHRvbiwgW2hyZWZdLCBpbnB1dCwgc2VsZWN0LCB0ZXh0YXJlYSwgW3RhYmluZGV4XTpub3QoW3RhYmluZGV4PVwiLTFcIl0pJyxcbiAgICAgICk7XG4gICAgICBpZiAoZm9jdXNhYmxlICYmIGZvY3VzYWJsZS5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5wcmV2aW91c0FjdGl2ZUVsZW1lbnQgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICAgICAgICBmb2N1c2FibGVbMF0uZm9jdXMoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVzdG9yZXMgdGhlIGxhc3QgZm9jdXMgaXMgdGhlcmUgd2FzIG9uZVxuICAgKi9cbiAgcHJpdmF0ZSByZXN0b3JlUHJldmlvdXNGb2N1cygpIHtcbiAgICBpZiAodGhpcy5wcmV2aW91c0FjdGl2ZUVsZW1lbnQpIHtcbiAgICAgIHRoaXMucHJldmlvdXNBY3RpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICB0aGlzLnByZXZpb3VzQWN0aXZlRWxlbWVudCA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbmZpZ3VyZSB0aGUgYWRkaW5nIGFuZCByZW1vdmFsIG9mIGEgd3JhcHBlciBjbGFzcyAtIHByZWRvbWluYW50bHkgYW5pbWF0aW9uIGZvY3VzZWRcbiAgICogQHBhcmFtIG1vZGFsV3JhcHBlckVsXG4gICAqIEBwYXJhbSB3cmFwcGVyQ2xhc3NcbiAgICovXG4gIHByaXZhdGUgdG9nZ2xlV3JhcHBlckNsYXNzKG1vZGFsV3JhcHBlckVsOiBFbGVtZW50UmVmLCB3cmFwcGVyQ2xhc3M6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHdyYXBwZXJDbGFzc0xpc3QgPSBtb2RhbFdyYXBwZXJFbC5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdDtcbiAgICBjb25zdCB3cmFwcGVyQ2xhc3NJdGVtcyA9IHdyYXBwZXJDbGFzcy5zcGxpdCgnICcpO1xuICAgIGlmICh3cmFwcGVyQ2xhc3NMaXN0LnRvU3RyaW5nKCkuaW5kZXhPZih3cmFwcGVyQ2xhc3MpICE9PSAtMSkge1xuICAgICAgd3JhcHBlckNsYXNzTGlzdC5yZW1vdmUoLi4ud3JhcHBlckNsYXNzSXRlbXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB3cmFwcGVyQ2xhc3NMaXN0LmFkZCguLi53cmFwcGVyQ2xhc3NJdGVtcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEVuYWJsZXMgdGhlIGRyYWcgb3B0aW9uIG9uIHRoZSBtb2RhbCBpZiB0aGUgb3B0aW9ucyBoYXZlIGl0IGVuYWJsZWRcbiAgICogQHBhcmFtIGNvbXBvbmVudFxuICAgKiBAcGFyYW0gb3B0aW9uc1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBzZXREcmFnZ2FibGUoY29tcG9uZW50OiBDb21wb25lbnRSZWY8U2ltcGxlTW9kYWxDb21wb25lbnQ8YW55LCBhbnk+Piwgb3B0aW9uczogU2ltcGxlTW9kYWxPcHRpb25zT3ZlcnJpZGVzKTogdm9pZCB7XG4gICAgY29uc3QgZHJhZ2dhYmxlRGlyZWN0aXZlID0gbmV3IERyYWdnYWJsZURpcmVjdGl2ZShjb21wb25lbnQubG9jYXRpb24sIHRoaXMubmdab25lLCB0aGlzLnJlbmRlcmVyKTtcbiAgICBkcmFnZ2FibGVEaXJlY3RpdmUuZHJhZ1RhcmdldCA9IGNvbXBvbmVudC5sb2NhdGlvbi5uYXRpdmVFbGVtZW50O1xuICAgIGRyYWdnYWJsZURpcmVjdGl2ZS5kcmFnSGFuZGxlID0gY29tcG9uZW50Lmluc3RhbmNlLmhhbmRsZSA/IGNvbXBvbmVudC5pbnN0YW5jZS5oYW5kbGUubmF0aXZlRWxlbWVudCA6IHVuZGVmaW5lZDtcbiAgICBkcmFnZ2FibGVEaXJlY3RpdmUubmdBZnRlclZpZXdJbml0KCk7XG4gICAgY29tcG9uZW50LmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LmFkZChvcHRpb25zLmRyYWdnYWJsZUNsYXNzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIZWxwZXIgZnVuY3Rpb24gZm9yIGEgbW9yZSByZWFkYWJsZSB0aW1lb3V0XG4gICAqIEBwYXJhbSBtc1xuICAgKi9cbiAgcHJpdmF0ZSB3YWl0KG1zOiBudW1iZXIgPSAwKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gcmVzb2x2ZSgpLCBtcyk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSW5zdHJ1Y3RzIHRoZSBob2xkZXIgdG8gcmVtb3ZlIHRoZSBtb2RhbCBhbmRcbiAgICogcmVtb3ZlcyB0aGlzIGNvbXBvbmVudCBmcm9tIHRoZSBjb2xsZWN0aW9uXG4gICAqIEBwYXJhbSB7U2ltcGxlTW9kYWxDb21wb25lbnR9IGNvbXBvbmVudFxuICAgKi9cbiAgcHJpdmF0ZSByZW1vdmVNb2RhbEZyb21BcnJheShjb21wb25lbnQpOiB2b2lkIHtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMubW9kYWxzLmluZGV4T2YoY29tcG9uZW50KTtcbiAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgdGhpcy52aWV3Q29udGFpbmVyLnJlbW92ZShpbmRleCk7XG4gICAgICB0aGlzLm1vZGFscy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH1cbiAgfVxufVxuIl19