ngx-modal-dialog
Version:
Dynamic modal dialog for Angular
266 lines (265 loc) • 29.2 kB
JavaScript
import { Component, ComponentFactoryResolver, ElementRef, HostListener, ViewChild, ViewContainerRef } from '@angular/core';
import { from, Subject } from 'rxjs';
/**
* Modal dialog component
*/
export class ModalDialogComponent {
/**
* CTOR
* @param _element
* @param componentFactoryResolver
*/
constructor(_element, componentFactoryResolver) {
this._element = _element;
this.componentFactoryResolver = componentFactoryResolver;
/** Modal dialog style settings */
this.settings = {
overlayClass: 'modal-backdrop fade',
overlayAnimationTriggerClass: 'show',
modalClass: 'modal ngx-modal fade',
modalAnimationTriggerClass: 'show',
modalDialogClass: 'modal-dialog modal-dialog-centered',
contentClass: 'modal-content',
headerClass: 'modal-header',
headerTitleClass: 'modal-title',
closeButtonClass: 'close glyphicon glyphicon-remove',
closeButtonTitle: 'CLOSE',
bodyClass: 'modal-body',
footerClass: 'modal-footer',
alertClass: 'ngx-modal-shake',
alertDuration: 250,
notifyWithAlert: true,
buttonClass: 'btn btn-primary'
};
this.showAlert = false;
this.animateOverlayClass = '';
this.animateModalClass = '';
this.showOverlay = false;
this._inProgress = false;
}
onClick(event) {
if (event.target !== this.dialogElement.nativeElement) {
return;
}
this.close();
}
/**
* Initialize dialog with reference to instance and options
* @param reference
* @param options
*/
dialogInit(reference, options = {}) {
this.reference = reference;
// inject component
if (options.childComponent) {
let factory = this.componentFactoryResolver.resolveComponentFactory(options.childComponent);
let componentRef = this.dynamicComponentTarget.createComponent(factory);
this._childInstance = componentRef.instance;
this._closeDialog$ = new Subject();
this._closeDialog$.subscribe(() => {
this._finalizeAndDestroy();
});
options.closeDialogSubject = this._closeDialog$;
this._childInstance['dialogInit'](componentRef, options);
document.activeElement != null ?
document.activeElement.blur() :
document.body.blur();
}
// set options
this._setOptions(options);
}
ngOnInit() {
// a trick to defer css animations
setTimeout(() => {
this.animateOverlayClass = this.settings.overlayAnimationTriggerClass;
this.animateModalClass = this.settings.modalAnimationTriggerClass;
}, 0);
}
/**
* Cleanup on destroy
*/
ngOnDestroy() {
// run animations
this.animateOverlayClass = '';
this.animateModalClass = '';
// cleanup listeners
if (this._alertTimeout) {
clearTimeout(this._alertTimeout);
this._alertTimeout = null;
}
if (this._closeDialog$) {
this._closeDialog$.unsubscribe();
}
}
/**
* Run action defined on action button
* @param action
*/
doAction(action) {
// disable multi clicks
if (this._inProgress) {
return;
}
this._inProgress = true;
this._closeIfSuccessful(action);
}
/**
* Method to run on close
* if action buttons are defined, it will not close
*/
close() {
if (this._inProgress) {
return;
}
if (this.actionButtons && this.actionButtons.length) {
return;
}
this._inProgress = true;
if (this.onClose) {
this._closeIfSuccessful(this.onClose);
return;
}
this._finalizeAndDestroy();
}
/**
* Pass options from dialog setup to component
* @param {IModalDialogOptions} options?
*/
_setOptions(options) {
if (options.onClose && options.actionButtons && options.actionButtons.length) {
throw new Error(`OnClose callback and ActionButtons are not allowed to be defined on the same dialog.`);
}
// set references
this.title = (options && options.title) || '';
this.onClose = (options && options.onClose) || null;
this.actionButtons = (this._childInstance && this._childInstance['actionButtons']) ||
(options && options.actionButtons) || null;
if (options && options.settings) {
Object.assign(this.settings, options.settings);
}
}
/**
* Close if successful
* @param callback
*/
_closeIfSuccessful(callback) {
if (!callback) {
return this._finalizeAndDestroy();
}
let response = callback();
if (typeof response === 'boolean') {
if (response) {
return this._finalizeAndDestroy();
}
return this._triggerAlert();
}
if (this.isPromise(response)) {
response = from(response);
}
if (this.isObservable(response)) {
response.subscribe(() => {
this._finalizeAndDestroy();
}, () => {
this._triggerAlert();
});
}
else {
this._inProgress = false;
}
}
_finalizeAndDestroy() {
this._inProgress = false;
this.reference.destroy();
}
_triggerAlert() {
if (this.settings.notifyWithAlert) {
this.showAlert = true;
this._alertTimeout = window.setTimeout(() => {
this.showAlert = false;
this._inProgress = false;
clearTimeout(this._alertTimeout);
this._alertTimeout = null;
}, this.settings.alertDuration);
}
}
isPromise(value) {
return value && typeof value.subscribe !== 'function' && typeof value.then === 'function';
}
isObservable(value) {
return value && typeof value.subscribe === 'function';
}
}
ModalDialogComponent.decorators = [
{ type: Component, args: [{
selector: 'modal-dialog',
template: `
<div *ngIf="settings.overlayClass && showOverlay" [ngClass]="[settings.overlayClass, animateOverlayClass]"></div>
<div [ngClass]="[settings.modalClass, animateModalClass]" #dialog>
<div [ngClass]="settings.modalDialogClass">
<div [ngClass]="[ showAlert ? settings.alertClass : '', settings.contentClass]">
<div [ngClass]="settings.headerClass">
<h4 [ngClass]="settings.headerTitleClass">{{title}}</h4>
<button (click)="close()" *ngIf="!actionButtons || !actionButtons.length" type="button"
[title]="settings.closeButtonTitle"
[ngClass]="settings.closeButtonClass">
</button>
</div>
<div [ngClass]="settings.bodyClass">
<i #modalDialogBody></i>
</div>
<div [ngClass]="settings.footerClass" *ngIf="actionButtons && actionButtons.length">
<button *ngFor="let button of actionButtons" (click)="doAction(button.onAction)"
[ngClass]="button.buttonClass || settings.buttonClass">{{button.text}}
</button>
</div>
</div>
</div>
</div>
`,
styles: [`
@-moz-keyframes shake {
from, to { transform: translate3d(0, 0, 0); }
10%, 30%, 50%, 70%, 90% { transform: translate3d(-2rem, 0, 0); }
20%, 40%, 60%, 80% { transform: translate3d(2rem, 0, 0); }
}
@-webkit-keyframes shake {
from, to { transform: translate3d(0, 0, 0); }
10%, 30%, 50%, 70%, 90% { transform: translate3d(-2rem, 0, 0); }
20%, 40%, 60%, 80% { transform: translate3d(2rem, 0, 0); }
}
shake {
from, to { transform: translate3d(0, 0, 0); }
10%, 30%, 50%, 70%, 90% { transform: translate3d(-2rem, 0, 0); }
20%, 40%, 60%, 80% { transform: translate3d(2rem, 0, 0); }
}
.ngx-modal {
display: flex;
}
.ngx-modal-shake {
backface-visibility: hidden;
-webkit-animation-duration: 0.5s;
-moz-animation-duration: 0.5s;
animation-duration: 0.5s;
-webkit-animation-fill-mode: both;
-moz-animation-fill-mode: both;
animation-fill-mode: both;
-webkit-animation-iteration-count: infinite;
-moz-animation-iteration-count: infinite;
animation-iteration-count: infinite;
-webkit-animation-name: shake;
-moz-animation-name: shake;
animation-name: shake;
}
`]
},] }
];
ModalDialogComponent.ctorParameters = () => [
{ type: ElementRef },
{ type: ComponentFactoryResolver }
];
ModalDialogComponent.propDecorators = {
dynamicComponentTarget: [{ type: ViewChild, args: ['modalDialogBody', { read: ViewContainerRef, static: true },] }],
dialogElement: [{ type: ViewChild, args: ['dialog',] }],
onClick: [{ type: HostListener, args: ['click', ['$event'],] }]
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kYWwtZGlhbG9nLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tb2RhbC1kaWFsb2cuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1Qsd0JBQXdCLEVBRXhCLFVBQVUsRUFDVixZQUFZLEVBR1osU0FBUyxFQUNULGdCQUFnQixFQUNqQixNQUFNLGVBQWUsQ0FBQztBQVF2QixPQUFPLEVBQUUsSUFBSSxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUVqRDs7R0FFRztBQWdFSCxNQUFNLE9BQU8sb0JBQW9CO0lBdUMvQjs7OztPQUlHO0lBQ0gsWUFBc0IsUUFBb0IsRUFDdEIsd0JBQWtEO1FBRGhELGFBQVEsR0FBUixRQUFRLENBQVk7UUFDdEIsNkJBQXdCLEdBQXhCLHdCQUF3QixDQUEwQjtRQXhDdEUsa0NBQWtDO1FBQzNCLGFBQVEsR0FBeUI7WUFDdEMsWUFBWSxFQUFFLHFCQUFxQjtZQUNuQyw0QkFBNEIsRUFBRSxNQUFNO1lBQ3BDLFVBQVUsRUFBRSxzQkFBc0I7WUFDbEMsMEJBQTBCLEVBQUUsTUFBTTtZQUNsQyxnQkFBZ0IsRUFBRSxvQ0FBb0M7WUFDdEQsWUFBWSxFQUFFLGVBQWU7WUFDN0IsV0FBVyxFQUFFLGNBQWM7WUFDM0IsZ0JBQWdCLEVBQUUsYUFBYTtZQUMvQixnQkFBZ0IsRUFBRSxrQ0FBa0M7WUFDcEQsZ0JBQWdCLEVBQUUsT0FBTztZQUN6QixTQUFTLEVBQUUsWUFBWTtZQUN2QixXQUFXLEVBQUUsY0FBYztZQUMzQixVQUFVLEVBQUUsaUJBQWlCO1lBQzdCLGFBQWEsRUFBRSxHQUFHO1lBQ2xCLGVBQWUsRUFBRSxJQUFJO1lBQ3JCLFdBQVcsRUFBRSxpQkFBaUI7U0FDL0IsQ0FBQztRQUtLLGNBQVMsR0FBWSxLQUFLLENBQUM7UUFDM0Isd0JBQW1CLEdBQUcsRUFBRSxDQUFDO1FBQ3pCLHNCQUFpQixHQUFHLEVBQUUs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Q0FBQyxDQUFDO2dCQUNqQyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztZQUM1QixDQUFDLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsQ0FBQztTQUNqQztJQUNILENBQUM7SUFFTyxTQUFTLENBQUksS0FBdUI7UUFDMUMsT0FBTyxLQUFLLElBQUksT0FBYSxLQUFNLENBQUMsU0FBUyxLQUFLLFVBQVUsSUFBSSxPQUFRLEtBQWEsQ0FBQyxJQUFJLEtBQUssVUFBVSxDQUFDO0lBQzVHLENBQUM7SUFFTyxZQUFZLENBQUksS0FBMEI7UUFDaEQsT0FBTyxLQUFLLElBQUksT0FBYSxLQUFNLENBQUMsU0FBUyxLQUFLLFVBQVUsQ0FBQztJQUMvRCxDQUFDOzs7WUF6UkYsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSxjQUFjO2dCQXFDeEIsUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXVCVDt5QkEzRFE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUNSO2FBeUJGOzs7WUFqRkMsVUFBVTtZQUZWLHdCQUF3Qjs7O3FDQXFGdkIsU0FBUyxTQUFDLGlCQUFpQixFQUFFLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7NEJBQ3JFLFNBQVMsU0FBQyxRQUFRO3NCQThDbEIsWUFBWSxTQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxuICBDb21wb25lbnRSZWYsXG4gIEVsZW1lbnRSZWYsXG4gIEhvc3RMaXN0ZW5lcixcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0NvbnRhaW5lclJlZlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIElNb2RhbERpYWxvZyxcbiAgSU1vZGFsRGlhbG9nQnV0dG9uLFxuICBJTW9kYWxEaWFsb2dPcHRpb25zLFxuICBJTW9kYWxEaWFsb2dTZXR0aW5ncyxcbiAgTW9kYWxEaWFsb2dPbkFjdGlvblxufSBmcm9tICcuL21vZGFsLWRpYWxvZy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgZnJvbSwgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuXG4vKipcbiAqIE1vZGFsIGRpYWxvZyBjb21wb25lbnRcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbW9kYWwtZGlhbG9nJyxcbiAgc3R5bGVzOiBbYFxuICAgICAgQC1tb3ota2V5ZnJhbWVzIHNoYWtlIHtcbiAgICAgICAgZnJvbSwgdG8gICAgICAgICAgICAgICAgeyB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIDAsIDApOyB9XG4gICAgICAgIDEwJSwgMzAlLCA1MCUsIDcwJSwgOTAlIHsgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgtMnJlbSwgMCwgMCk7IH1cbiAgICAgICAgMjAlLCA0MCUsIDYwJSwgODAlICAgICAgeyB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDJyZW0sIDAsIDApOyB9XG4gICAgICB9XG4gICAgICBALXdlYmtpdC1rZXlmcmFtZXMgc2hha2Uge1xuICAgICAgICBmcm9tLCB0byAgICAgICAgICAgICAgICB7IHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgMCwgMCk7IH1cbiAgICAgICAgMTAlLCAzMCUsIDUwJSwgNzAlLCA5MCUgeyB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKC0ycmVtLCAwLCAwKTsgfVxuICAgICAgICAyMCUsIDQwJSwgNjAlLCA4MCUgICAgICB7IHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMnJlbSwgMCwgMCk7IH1cbiAgICAgIH1cbiAgICAgIEBrZXlmcmFtZXMgc2hha2Uge1xuICAgICAgICBmcm9tLCB0byAgICAgICAgICAgICAgICB7IHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgMCwgMCk7IH1cbiAgICAgICAgMTAlLCAzMCUsIDUwJSwgNzAlLCA5MCUgeyB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKC0ycmVtLCAwLCAwKTsgfVxuICAgICAgICAyMCUsIDQwJSwgNjAlLCA4MCUgICAgICB7IHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMnJlbSwgMCwgMCk7IH1cbiAgICAgIH1cblxuICAgICAgLm5neC1tb2RhbCB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICB9XG4gICAgICAubmd4LW1vZGFsLXNoYWtlIHtcbiAgICAgICAgYmFja2ZhY2UtdmlzaWJpbGl0eTogaGlkZGVuO1xuICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi1kdXJhdGlvbjogMC41cztcbiAgICAgICAgLW1vei1hbmltYXRpb24tZHVyYXRpb246IDAuNXM7XG4gICAgICAgIGFuaW1hdGlvbi1kdXJhdGlvbjogMC41cztcbiAgICAgICAgLXdlYmtpdC1hbmltYXRpb24tZmlsbC1tb2RlOiBib3RoO1xuICAgICAgICAtbW96LWFuaW1hdGlvbi1maWxsLW1vZGU6IGJvdGg7XG4gICAgICAgIGFuaW1hdGlvbi1maWxsLW1vZGU6IGJvdGg7XG4gICAgICAgIC13ZWJraXQtYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogaW5maW5pdGU7XG4gICAgICAgIC1tb3otYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogaW5maW5pdGU7XG4gICAgICAgIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IGluZmluaXRlO1xuICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi1uYW1lOiBzaGFrZTtcbiAgICAgICAgLW1vei1hbmltYXRpb24tbmFtZTogc2hha2U7XG4gICAgICAgIGFuaW1hdGlvbi1uYW1lOiBzaGFrZTtcbiAgICAgIH1cbiAgYF0sXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiAqbmdJZj1cInNldHRpbmdzLm92ZXJsYXlDbGFzcyAmJiBzaG93T3ZlcmxheVwiIFtuZ0NsYXNzXT1cIltzZXR0aW5ncy5vdmVybGF5Q2xhc3MsIGFuaW1hdGVPdmVybGF5Q2xhc3NdXCI+PC9kaXY+IFxuICAgIDxkaXYgW25nQ2xhc3NdPVwiW3NldHRpbmdzLm1vZGFsQ2xhc3MsIGFuaW1hdGVNb2RhbENsYXNzXVwiICNkaWFsb2c+XG4gICAgICA8ZGl2IFtuZ0NsYXNzXT1cInNldHRpbmdzLm1vZGFsRGlhbG9nQ2xhc3NcIj5cbiAgICAgICAgPGRpdiBbbmdDbGFzc109XCJbIHNob3dBbGVydCA/IHNldHRpbmdzLmFsZXJ0Q2xhc3MgOiAnJywgc2V0dGluZ3MuY29udGVudENsYXNzXVwiPlxuICAgICAgICAgIDxkaXYgW25nQ2xhc3NdPVwic2V0dGluZ3MuaGVhZGVyQ2xhc3NcIj5cbiAgICAgICAgICAgIDxoNCBbbmdDbGFzc109XCJzZXR0aW5ncy5oZWFkZXJUaXRsZUNsYXNzXCI+e3t0aXRsZX19PC9oND5cbiAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cImNsb3NlKClcIiAqbmdJZj1cIiFhY3Rpb25CdXR0b25zIHx8ICFhY3Rpb25CdXR0b25zLmxlbmd0aFwiIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICBbdGl0bGVdPVwic2V0dGluZ3MuY2xvc2VCdXR0b25UaXRsZVwiXG4gICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInNldHRpbmdzLmNsb3NlQnV0dG9uQ2xhc3NcIj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgW25nQ2xhc3NdPVwic2V0dGluZ3MuYm9keUNsYXNzXCI+XG4gICAgICAgICAgICA8aSAjbW9kYWxEaWFsb2dCb2R5PjwvaT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IFtuZ0NsYXNzXT1cInNldHRpbmdzLmZvb3RlckNsYXNzXCIgKm5nSWY9XCJhY3Rpb25CdXR0b25zICYmIGFjdGlvbkJ1dHRvbnMubGVuZ3RoXCI+XG4gICAgICAgICAgICA8YnV0dG9uICpuZ0Zvcj1cImxldCBidXR0b24gb2YgYWN0aW9uQnV0dG9uc1wiIChjbGljayk9XCJkb0FjdGlvbihidXR0b24ub25BY3Rpb24pXCJcbiAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiYnV0dG9uLmJ1dHRvbkNsYXNzIHx8IHNldHRpbmdzLmJ1dHRvbkNsYXNzXCI+e3tidXR0b24udGV4dH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgYFxufSlcbmV4cG9ydCBjbGFzcyBNb2RhbERpYWxvZ0NvbXBvbmVudCBpbXBsZW1lbnRzIElNb2RhbERpYWxvZywgT25EZXN0cm95LCBPbkluaXQge1xuICBAVmlld0NoaWxkKCdtb2RhbERpYWxvZ0JvZHknLCB7IHJlYWQ6IFZpZXdDb250YWluZXJSZWYsIHN0YXRpYzogdHJ1ZSB9KSBwdWJsaWMgZHluYW1pY0NvbXBvbmVudFRhcmdldDogVmlld0NvbnRhaW5lclJlZjtcbiAgQFZpZXdDaGlsZCgnZGlhbG9nJykgcHJpdmF0ZSBkaWFsb2dFbGVtZW50OiBFbGVtZW50UmVmO1xuICBwdWJsaWMgcmVmZXJlbmNlOiBDb21wb25lbnRSZWY8SU1vZGFsRGlhbG9nPjtcblxuICAvKiogTW9kYWwgZGlhbG9nIHN0eWxlIHNldHRpbmdzICovXG4gIHB1YmxpYyBzZXR0aW5nczogSU1vZGFsRGlhbG9nU2V0dGluZ3MgPSB7XG4gICAgb3ZlcmxheUNsYXNzOiAnbW9kYWwtYmFja2Ryb3AgZmFkZScsXG4gICAgb3ZlcmxheUFuaW1hdGlvblRyaWdnZXJDbGFzczogJ3Nob3cnLFxuICAgIG1vZGFsQ2xhc3M6ICdtb2RhbCBuZ3gtbW9kYWwgZmFkZScsXG4gICAgbW9kYWxBbmltYXRpb25UcmlnZ2VyQ2xhc3M6ICdzaG93JyxcbiAgICBtb2RhbERpYWxvZ0NsYXNzOiAnbW9kYWwtZGlhbG9nIG1vZGFsLWRpYWxvZy1jZW50ZXJlZCcsXG4gICAgY29udGVudENsYXNzOiAnbW9kYWwtY29udGVudCcsXG4gICAgaGVhZGVyQ2xhc3M6ICdtb2RhbC1oZWFkZXInLFxuICAgIGhlYWRlclRpdGxlQ2xhc3M6ICdtb2RhbC10aXRsZScsXG4gICAgY2xvc2VCdXR0b25DbGFzczogJ2Nsb3NlIGdseXBoaWNvbiBnbHlwaGljb24tcmVtb3ZlJyxcbiAgICBjbG9zZUJ1dHRvblRpdGxlOiAnQ0xPU0UnLFxuICAgIGJvZHlDbGFzczogJ21vZGFsLWJvZHknLFxuICAgIGZvb3RlckNsYXNzOiAnbW9kYWwtZm9vdGVyJyxcbiAgICBhbGVydENsYXNzOiAnbmd4LW1vZGFsLXNoYWtlJyxcbiAgICBhbGVydER1cmF0aW9uOiAyNTAsXG4gICAgbm90aWZ5V2l0aEFsZXJ0OiB0cnVlLFxuICAgIGJ1dHRvbkNsYXNzOiAnYnRuIGJ0bi1wcmltYXJ5J1xuICB9O1xuICBwdWJsaWMgYWN0aW9uQnV0dG9uczogSU1vZGFsRGlhbG9nQnV0dG9uW107XG4gIHB1YmxpYyB0aXRsZTogc3RyaW5nO1xuICBwdWJsaWMgb25DbG9zZTogKCkgPT4gUHJvbWlzZTxhbnk+IHwgT2JzZXJ2YWJsZTxhbnk+IHwgYm9vbGVhbjtcblxuICBwdWJsaWMgc2hvd0FsZXJ0OiBib29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyBhbmltYXRlT3ZlcmxheUNsYXNzID0gJyc7XG4gIHB1YmxpYyBhbmltYXRlTW9kYWxDbGFzcyA9ICcnO1xuXG4gIHB1YmxpYyBzaG93T3ZlcmxheSA9IGZhbHNlO1xuXG4gIHByaXZhdGUgX2luUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfYWxlcnRUaW1lb3V0OiBudW1iZXI7XG4gIHByaXZhdGUgX2NoaWxkSW5zdGFuY2U6IGFueTtcbiAgcHJpdmF0ZSBfY2xvc2VEaWFsb2ckOiBTdWJqZWN0PHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBDVE9SXG4gICAqIEBwYXJhbSBfZWxlbWVudFxuICAgKiBAcGFyYW0gY29tcG9uZW50RmFjdG9yeVJlc29sdmVyXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgX2VsZW1lbnQ6IEVsZW1lbnRSZWYsXG4gICAgICAgICAgICAgIHByaXZhdGUgY29tcG9uZW50RmFjdG9yeVJlc29sdmVyOiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIpIHtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2NsaWNrJywgWyckZXZlbnQnXSlcbiAgb25DbGljayhldmVudDogYW55KTogdm9pZCB7XG4gICAgaWYgKGV2ZW50LnRhcmdldCAhPT0gdGhpcy5kaWFsb2dFbGVtZW50Lm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5jbG9zZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgZGlhbG9nIHdpdGggcmVmZXJlbmNlIHRvIGluc3RhbmNlIGFuZCBvcHRpb25zXG4gICAqIEBwYXJhbSByZWZlcmVuY2VcbiAgICogQHBhcmFtIG9wdGlvbnNcbiAgICovXG4gIGRpYWxvZ0luaXQocmVmZXJlbmNlOiBDb21wb25lbnRSZWY8SU1vZGFsRGlhbG9nPiwgb3B0aW9uczogUGFydGlhbDxJTW9kYWxEaWFsb2dPcHRpb25zPGFueT4+ID0ge30pIHtcbiAgICB0aGlzLnJlZmVyZW5jZSA9IHJlZmVyZW5jZTtcblxuICAgIC8vIGluamVjdCBjb21wb25lbnRcbiAgICBpZiAob3B0aW9ucy5jaGlsZENvbXBvbmVudCkge1xuICAgICAgbGV0IGZhY3RvcnkgPSB0aGlzLmNvbXBvbmVudEZhY3RvcnlSZXNvbHZlci5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShvcHRpb25zLmNoaWxkQ29tcG9uZW50KTtcbiAgICAgIGxldCBjb21wb25lbnRSZWYgPSB0aGlzLmR5bmFtaWNDb21wb25lbnRUYXJnZXQuY3JlYXRlQ29tcG9uZW50KGZhY3RvcnkpIGFzIENvbXBvbmVudFJlZjxJTW9kYWxEaWFsb2c+O1xuICAgICAgdGhpcy5fY2hpbGRJbnN0YW5jZSA9IGNvbXBvbmVudFJlZi5pbnN0YW5jZSBhcyBJTW9kYWxEaWFsb2c7XG5cbiAgICAgIHRoaXMuX2Nsb3NlRGlhbG9nJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gICAgICB0aGlzLl9jbG9zZURpYWxvZyQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5fZmluYWxpemVBbmREZXN0cm95KCk7XG4gICAgICB9KTtcblxuICAgICAgb3B0aW9ucy5jbG9zZURpYWxvZ1N1YmplY3QgPSB0aGlzLl9jbG9zZURpYWxvZyQ7XG5cbiAgICAgIHRoaXMuX2NoaWxkSW5zdGFuY2VbJ2RpYWxvZ0luaXQnXShjb21wb25lbnRSZWYsIG9wdGlvbnMpO1xuICAgICAgZG9jdW1lbnQuYWN0aXZlRWxlbWVudCAhPSBudWxsID9cbiAgICAgICAgKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQpLmJsdXIoKSA6XG4gICAgICAgIChkb2N1bWVudC5ib2R5IGFzIEhUTUxFbGVtZW50KS5ibHVyKCk7XG4gICAgfVxuICAgIC8vIHNldCBvcHRpb25zXG4gICAgdGhpcy5fc2V0T3B0aW9ucyhvcHRpb25zKTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIC8vIGEgdHJpY2sgdG8gZGVmZXIgY3NzIGFuaW1hdGlvbnNcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuYW5pbWF0ZU92ZXJsYXlDbGFzcyA9IHRoaXMuc2V0dGluZ3Mub3ZlcmxheUFuaW1hdGlvblRyaWdnZXJDbGFzcztcbiAgICAgIHRoaXMuYW5pbWF0ZU1vZGFsQ2xhc3MgPSB0aGlzLnNldHRpbmdzLm1vZGFsQW5pbWF0aW9uVHJpZ2dlckNsYXNzO1xuICAgIH0sIDApO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFudXAgb24gZGVzdHJveVxuICAgKi9cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgLy8gcnVuIGFuaW1hdGlvbnNcbiAgICB0aGlzLmFuaW1hdGVPdmVybGF5Q2xhc3MgPSAnJztcbiAgICB0aGlzLmFuaW1hdGVNb2RhbENsYXNzID0gJyc7XG5cbiAgICAvLyBjbGVhbnVwIGxpc3RlbmVyc1xuICAgIGlmICh0aGlzLl9hbGVydFRpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9hbGVydFRpbWVvdXQpO1xuICAgICAgdGhpcy5fYWxlcnRUaW1lb3V0ID0gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fY2xvc2VEaWFsb2ckKSB7XG4gICAgICB0aGlzLl9jbG9zZURpYWxvZyQudW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVuIGFjdGlvbiBkZWZpbmVkIG9uIGFjdGlvbiBidXR0b25cbiAgICogQHBhcmFtIGFjdGlvblxuICAgKi9cbiAgZG9BY3Rpb24oYWN0aW9uPzogTW9kYWxEaWFsb2dPbkFjdGlvbikge1xuICAgIC8vIGRpc2FibGUgbXVsdGkgY2xpY2tzXG4gICAgaWYgKHRoaXMuX2luUHJvZ3Jlc3MpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5faW5Qcm9ncmVzcyA9IHRydWU7XG4gICAgdGhpcy5fY2xvc2VJZlN1Y2Nlc3NmdWwoYWN0aW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gcnVuIG9uIGNsb3NlXG4gICAqIGlmIGFjdGlvbiBidXR0b25zIGFyZSBkZWZpbmVkLCBpdCB3aWxsIG5vdCBjbG9zZVxuICAgKi9cbiAgY2xvc2UoKSB7XG4gICAgaWYgKHRoaXMuX2luUHJvZ3Jlc3MpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuYWN0aW9uQnV0dG9ucyAmJiB0aGlzLmFjdGlvbkJ1dHRvbnMubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2luUHJvZ3Jlc3MgPSB0cnVlO1xuXG4gICAgaWYgKHRoaXMub25DbG9zZSkge1xuICAgICAgdGhpcy5fY2xvc2VJZlN1Y2Nlc3NmdWwodGhpcy5vbkNsb3NlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fZmluYWxpemVBbmREZXN0cm95KCk7XG4gIH1cblxuICAvKipcbiAgICogUGFzcyBvcHRpb25zIGZyb20gZGlhbG9nIHNldHVwIHRvIGNvbXBvbmVudFxuICAgKiBAcGFyYW0gIHtJTW9kYWxEaWFsb2dPcHRpb25zfSBvcHRpb25zP1xuICAgKi9cbiAgcHJpdmF0ZSBfc2V0T3B0aW9ucyhvcHRpb25zOiBQYXJ0aWFsPElNb2RhbERpYWxvZ09wdGlvbnM8YW55Pj4pIHtcblxuICAgIGlmIChvcHRpb25zLm9uQ2xvc2UgJiYgb3B0aW9ucy5hY3Rpb25CdXR0b25zICYmIG9wdGlvbnMuYWN0aW9uQnV0dG9ucy5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgT25DbG9zZSBjYWxsYmFjayBhbmQgQWN0aW9uQnV0dG9ucyBhcmUgbm90IGFsbG93ZWQgdG8gYmUgZGVmaW5lZCBvbiB0aGUgc2FtZSBkaWFsb2cuYCk7XG4gICAgfVxuICAgIC8vIHNldCByZWZlcmVuY2VzXG4gICAgdGhpcy50aXRsZSA9IChvcHRpb25zICYmIG9wdGlvbnMudGl0bGUpIHx8ICcnO1xuICAgIHRoaXMub25DbG9zZSA9IChvcHRpb25zICYmIG9wdGlvbnMub25DbG9zZSkgfHwgbnVsbDtcbiAgICB0aGlzLmFjdGlvbkJ1dHRvbnMgPSAodGhpcy5fY2hpbGRJbnN0YW5jZSAmJiB0aGlzLl9jaGlsZEluc3RhbmNlWydhY3Rpb25CdXR0b25zJ10pIHx8XG4gICAgICAob3B0aW9ucyAmJiBvcHRpb25zLmFjdGlvbkJ1dHRvbnMpIHx8IG51bGw7XG4gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5zZXR0aW5ncykge1xuICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLnNldHRpbmdzLCBvcHRpb25zLnNldHRpbmdzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2UgaWYgc3VjY2Vzc2Z1bFxuICAgKiBAcGFyYW0gY2FsbGJhY2tcbiAgICovXG4gIHByaXZhdGUgX2Nsb3NlSWZTdWNjZXNzZnVsKGNhbGxiYWNrOiBNb2RhbERpYWxvZ09uQWN0aW9uKSB7XG4gICAgaWYgKCFjYWxsYmFjaykge1xuICAgICAgcmV0dXJuIHRoaXMuX2ZpbmFsaXplQW5kRGVzdHJveSgpO1xuICAgIH1cblxuICAgIGxldCByZXNwb25zZSA9IGNhbGxiYWNrKCk7XG4gICAgaWYgKHR5cGVvZiByZXNwb25zZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICBpZiAocmVzcG9uc2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbmFsaXplQW5kRGVzdHJveSgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuX3RyaWdnZXJBbGVydCgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc1Byb21pc2UocmVzcG9uc2UpKSB7XG4gICAgICByZXNwb25zZSA9IGZyb20ocmVzcG9uc2UpO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc09ic2VydmFibGUocmVzcG9uc2UpKSB7XG4gICAgICByZXNwb25zZS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLl9maW5hbGl6ZUFuZERlc3Ryb3koKTtcbiAgICAgIH0sICgpID0+IHtcbiAgICAgICAgdGhpcy5fdHJpZ2dlckFsZXJ0KCk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5faW5Qcm9ncmVzcyA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2ZpbmFsaXplQW5kRGVzdHJveSgpIHtcbiAgICB0aGlzLl9pblByb2dyZXNzID0gZmFsc2U7XG4gICAgdGhpcy5yZWZlcmVuY2UuZGVzdHJveSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfdHJpZ2dlckFsZXJ0KCkge1xuICAgIGlmICh0aGlzLnNldHRpbmdzLm5vdGlmeVdpdGhBbGVydCkge1xuICAgICAgdGhpcy5zaG93QWxlcnQgPSB0cnVlO1xuICAgICAgdGhpcy5fYWxlcnRUaW1lb3V0ID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLnNob3dBbGVydCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9pblByb2dyZXNzID0gZmFsc2U7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9hbGVydFRpbWVvdXQpO1xuICAgICAgICB0aGlzLl9hbGVydFRpbWVvdXQgPSBudWxsO1xuICAgICAgfSwgdGhpcy5zZXR0aW5ncy5hbGVydER1cmF0aW9uKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGlzUHJvbWlzZTxUPih2YWx1ZTogYW55IHwgUHJvbWlzZTxUPik6IHZhbHVlIGlzIFByb21pc2U8VD4ge1xuICAgIHJldHVybiB2YWx1ZSAmJiB0eXBlb2YgKDxhbnk+dmFsdWUpLnN1YnNjcmliZSAhPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgKHZhbHVlIGFzIGFueSkudGhlbiA9PT0gJ2Z1bmN0aW9uJztcbiAgfVxuXG4gIHByaXZhdGUgaXNPYnNlcnZhYmxlPFQ+KHZhbHVlOiBhbnkgfCBPYnNlcnZhYmxlPFQ+KTogdmFsdWUgaXMgT2JzZXJ2YWJsZTxUPiB7XG4gICAgcmV0dXJuIHZhbHVlICYmIHR5cGVvZiAoPGFueT52YWx1ZSkuc3Vic2NyaWJlID09PSAnZnVuY3Rpb24nO1xuICB9XG59XG4iXX0=