UNPKG

biplab-notifier

Version:

This is a notification npm package, it can be use as simple notification or modal dialog, a lot of customization option are available as well, checkout the github repo and examples

528 lines 39.7 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { BehaviorSubject, Subject } from 'rxjs'; import { take } from 'rxjs/operators'; import { Message } from './message/notifer'; import { NotifcationLayout, SingleNotifier, MultiNotifier } from './layout/notifier'; /** * @record */ export function Timer() { } if (false) { /** @type {?} */ Timer.prototype.duration; } export class Notification extends NotifcationLayout { /** * @param {?=} layoutType * @param {?=} displayAs * @param {?=} status * @param {?=} data * @param {?=} css * @param {?=} actionButtons */ constructor(layoutType, displayAs = 'notification', status, data, css = { shadow: true, position: 'default', background: undefined, color: undefined, width: undefined, height: undefined }, actionButtons = []) { super(); this.status = status; this.data = data; this.css = css; this.actionButtons = actionButtons; this._afterOpened = new Subject(); this._afterClosed = new Subject(); this._event = new BehaviorSubject(false); this.status = 'deactivate'; if (layoutType) { this.layoutType = layoutType; } if (this.actionButtons) { this.defaultButtons(); } if (displayAs === 'notification') { this.isNotification = true; } else if (displayAs === 'dialog') { this.isDialog = true; } else if (displayAs === 'snack-bar') { this.isSnack = true; } } /** * @param {?} msg * @return {?} */ set message(msg) { if (this.layoutType === 'single') { this.data = new Message(msg); } } /** * @param {?=} actionButtons * @return {?} */ defaultButtons(actionButtons) { this.actionButtons = actionButtons || [ { text: 'Yes', disabled: false, type: 'button', emitValue: true, css: { color: '#3f51b5', background: 'transparent', shadow: true } }, { text: 'Cancel', disabled: false, type: 'button', emitValue: false, css: { color: '#f44336', background: 'transparent', shadow: true } } ]; } /** * @return {?} */ applyThemeColorInTrueButtons() { this.actionButtons.forEach((/** * @param {?} button * @return {?} */ (button) => { if (typeof (button.emitValue) === 'boolean' && button.emitValue) { button.css.color = this.css.color; button.css.background = this.css.background; } })); } /** * @param {?} status * @return {?} */ set trueActionButtonStatus(status) { this.actionButtons.forEach((/** * @param {?} button * @return {?} */ (button) => { if (typeof (button.emitValue) === 'boolean' && button.emitValue) { button.disabled = status === 'disable' ? true : false; } })); } /** * @return {?} */ get currentStatus() { return this.status === 'activate' ? 'show' : 'hide'; } /** * @return {?} */ get trueActionButton() { return this.actionButtons.filter((/** * @param {?} button * @return {?} */ (button) => typeof (button.emitValue) === 'boolean' && button.emitValue))[0] || undefined; } /** * @param {?} label * @param {?} callBackFunctions * @param {?=} disabled * @param {?=} type * @param {?=} emitValue * @param {?=} css * @return {?} */ addNewButton(label, callBackFunctions, disabled = false, type = 'button', emitValue, css = { color: 'black', background: 'transparent', shadow: true }) { /** @type {?} */ const button = { text: label, disabled: disabled, type: type, emitValue: emitValue, css: css || { color: '#3f51b5', background: 'transparent', shadow: true }, callBackFunctions: callBackFunctions || undefined }; if (this.actionButtons.length > 0) { /** @type {?} */ const findIndex = this.actionButtons .find((/** * @param {?} btn * @return {?} */ (btn) => (btn.type === type) && (typeof (emitValue) === 'boolean') && (typeof (emitValue) === typeof (btn.emitValue)) && (emitValue === btn.emitValue))); if (!findIndex) { this.actionButtons.splice(1, 0, button); } } else { this.actionButtons.push(button); } } /** * @return {?} */ buttonColorReverse() { this.actionButtons.forEach((/** * @param {?} button * @return {?} */ (button) => { /** @type {?} */ const background = button.css.color; /** @type {?} */ const color = this._handleTransparentColor(button.css.background); button.css.color = color; button.css.background = background; })); } /** * @private * @param {?} original * @return {?} */ _handleTransparentColor(original) { return original === 'transparent' ? 'white' : original === 'white' ? 'transparent' : original; } /** * @param {?} status * @return {?} */ buttonShadow(status) { this.actionButtons.forEach((/** * @param {?} button * @return {?} */ (button) => { button.css.shadow = status === 'show' ? true : false; })); } /** * @param {?} msgs * @return {?} */ set messages(msgs) { if (this.layoutType === 'multi') { this.data = msgs.map((/** * @param {?} msg * @return {?} */ (msg) => new Message(msg))); } } /** * @param {?} type * @return {?} */ set layoutType(type) { if (type === 'multi') { this.layout = new MultiNotifier(); } else { this.layout = new SingleNotifier(); } } /** * @return {?} */ get layoutType() { if (this.layout instanceof MultiNotifier) { return 'multi'; } else if (this.layout instanceof SingleNotifier) { return 'single'; } } /** * @return {?} */ get timer() { return this._timer; } /** * @return {?} */ show() { this._event.next(true); if (this.timer) { this.cancelTimer = setTimeout((/** * @return {?} */ () => this.hide(false)), this.timer.duration); } } /** * @param {?=} why * @return {?} */ hide(why) { this._event.next(why); } /** * @param {?} title * @return {?} */ set titleText(title) { if (this.layoutType === 'multi') { /** @type {?} */ const layout = (/** @type {?} */ (this.layout)); layout.titleText = title; } } /** * @return {?} */ get action() { return this._event; } /** * @param {?} msg * @return {?} */ set header(msg) { if (this.layoutType === 'multi') { /** @type {?} */ const layout = (/** @type {?} */ (this.layout)); layout.head = msg; } } /** * @param {?} status * @return {?} */ set isDialog(status) { if (status) { this.layout.displayAs = 'dialog'; this.css.position = 'center'; } } /** * @param {?} status * @return {?} */ set isSnack(status) { if (status) { this.layout.displayAs = 'snack-bar'; this.css.position = 'bottom'; } } /** * @param {?} status * @return {?} */ set isNotification(status) { if (status) { this.layout.displayAs = 'notification'; this.css.position = 'default'; } } /** * @param {?} status * @return {?} */ set disableOutsideClick(status) { if (this.layoutType === 'multi') { /** @type {?} */ const layout = (/** @type {?} */ (this.layout)); layout.disableOutsideClick = status; } } /** * @param {?} status * @return {?} */ set body(status) { if (this.layoutType === 'multi') { /** @type {?} */ const layout = (/** @type {?} */ (this.layout)); layout.body.status = status; } } /** * @param {?} status * @return {?} */ set actionRow(status) { if (this.layoutType === 'multi') { /** @type {?} */ const layout = (/** @type {?} */ (this.layout)); layout.actionRow.status = status; } } /** * @param {?} status * @return {?} */ set closeButton(status) { this.layout.closeButton.status = status; } /** * @param {?} status * @return {?} */ set title(status) { this.layout.title.status = status; } /** * @param {?} text * @return {?} */ set trueButton(text) { if (!!this.actionButtons && this.actionButtons.length > 0) { this.actionButtons.forEach((/** * @param {?} button * @return {?} */ (button) => { if (typeof (button.emitValue) === 'boolean' && button.emitValue === true) { button.text = text; return; } })); } } /** * @param {?} text * @return {?} */ set falseButton(text) { if (!!this.actionButtons && this.actionButtons.length > 0) { this.actionButtons.forEach((/** * @param {?} button * @return {?} */ (button) => { if (typeof (button.emitValue) === 'boolean' && button.emitValue === false) { button.text = text; return; } })); } } /** * @return {?} */ get type() { return this.notificationType; } /** * @param {?} _type * @return {?} */ set type(_type) { this.notificationType = _type; /** default css setup */ if (_type === 'success') { this.css.background = '#4CAF50'; this.css.color = 'white'; } else if (_type === 'error') { this.css.background = '#cc0000'; this.css.color = 'white'; } else if (_type === 'warn') { this.css.background = '#ff9800'; this.css.color = 'white'; } else if (_type === 'note') { this.css.background = '#2196F3'; this.css.color = 'white'; } else if (_type === 'help') { this.css.background = 'rgb(2, 64, 114)'; this.css.color = 'white'; } else if (_type === 'other') { this.css.background = '#3f51b5'; this.css.color = 'white'; } } /** * @param {?} _timer * @return {?} */ set timer(_timer) { clearTimeout(this.cancelTimer); this._timer = _timer; } /** * @return {?} */ get afterOpened() { return this._afterOpened.asObservable() .pipe(take(1)); } /** * @return {?} */ get afterClosed() { return this._afterClosed.asObservable() .pipe(take(1)); } /** * @param {?} status * @return {?} */ set close(status) { this._afterClosed.next(status); } /** * @return {?} */ opened() { this._afterOpened.next(); } } if (false) { /** * @type {?} * @protected */ Notification.prototype._afterOpened; /** * @type {?} * @protected */ Notification.prototype._afterClosed; /** * @type {?} * @private */ Notification.prototype._event; /** * @type {?} * @private */ Notification.prototype.notificationType; /** * @type {?} * @private */ Notification.prototype._timer; /** * @type {?} * @private */ Notification.prototype.cancelTimer; /** @type {?} */ Notification.prototype.status; /** @type {?} */ Notification.prototype.data; /** @type {?} */ Notification.prototype.css; /** @type {?} */ Notification.prototype.actionButtons; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90aWZpY2F0aW9uLmpzIiwic291cmNlUm9vdCI6Im5nOi8vYmlwbGFiLW5vdGlmaWVyLyIsInNvdXJjZXMiOlsibGliL25vdGlmaWNhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLGVBQWUsRUFBYyxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDNUQsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3RDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUM1QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsY0FBYyxFQUFFLGFBQWEsRUFBMkIsTUFBTSxtQkFBbUIsQ0FBQzs7OztBQUU5RywyQkFFQzs7O0lBREcseUJBQWlCOztBQUdyQixNQUFNLE9BQU8sWUFBYSxTQUFRLGlCQUFpQjs7Ozs7Ozs7O0lBUS9DLFlBQ0ksVUFBK0IsRUFDL0IsWUFBcUQsY0FBYyxFQUM1RCxNQUFtQyxFQUNuQyxJQUEwQixFQUMxQixNQUFXO1FBQ2QsTUFBTSxFQUFFLElBQUk7UUFDWixRQUFRLEVBQUUsU0FBUztRQUNuQixVQUFVLEVBQUUsU0FBUztRQUNyQixLQUFLLEVBQUUsU0FBUztRQUNoQixLQUFLLEVBQUUsU0FBUztRQUNoQixNQUFNLEVBQUUsU0FBUztLQUFFLEVBQ2hCLGdCQUFzQyxFQUFFO1FBQy9DLEtBQUssRUFBRSxDQUFDO1FBVkQsV0FBTSxHQUFOLE1BQU0sQ0FBNkI7UUFDbkMsU0FBSSxHQUFKLElBQUksQ0FBc0I7UUFDMUIsUUFBRyxHQUFILEdBQUcsQ0FNYTtRQUNoQixrQkFBYSxHQUFiLGFBQWEsQ0FBMkI7UUFuQmhDLGlCQUFZLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztRQUNuQyxpQkFBWSxHQUFHLElBQUksT0FBTyxFQUFpQixDQUFDO1FBQzlDLFdBQU0sR0FBSSxJQUFJLGVBQWUsQ0FBVSxLQUFLLENBQUMsQ0FBQztRQW1CM0QsSUFBSSxDQUFDLE1BQU0sR0FB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K0Q7Ozs7O0lBQy9ELDhCQUErRDs7Ozs7SUFDL0Qsd0NBQW1GOzs7OztJQUNuRiw4QkFBdUI7Ozs7O0lBQ3ZCLG1DQUF5Qjs7SUFLckIsOEJBQTBDOztJQUMxQyw0QkFBaUM7O0lBQ2pDLDJCQU11Qjs7SUFDdkIscUNBQStDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgTWVzc2FnZSB9IGZyb20gJy4vbWVzc2FnZS9ub3RpZmVyJztcbmltcG9ydCB7IE5vdGlmY2F0aW9uTGF5b3V0LCBTaW5nbGVOb3RpZmllciwgTXVsdGlOb3RpZmllciwgQ3NzLCBOb3RpZmljYXRpb25CdXR0b24gfSBmcm9tICcuL2xheW91dC9ub3RpZmllcic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGltZXIge1xuICAgIGR1cmF0aW9uOiBudW1iZXI7XG59XG5cbmV4cG9ydCBjbGFzcyBOb3RpZmljYXRpb24gZXh0ZW5kcyBOb3RpZmNhdGlvbkxheW91dCAge1xuICAgIHByb3RlY3RlZCByZWFkb25seSBfYWZ0ZXJPcGVuZWQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBfYWZ0ZXJDbG9zZWQgPSBuZXcgU3ViamVjdDxib29sZWFuIHwgYW55PigpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX2V2ZW50ID0gIG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICAgIHByaXZhdGUgbm90aWZpY2F0aW9uVHlwZTogJ3dhcm4nIHwgJ2Vycm9yJyB8ICdub3RlJyB8ICdzdWNjZXNzJyB8ICdoZWxwJyB8ICdvdGhlcic7XG4gICAgcHJpdmF0ZSBfdGltZXI/OiBUaW1lcjtcbiAgICBwcml2YXRlIGNhbmNlbFRpbWVyOiBhbnk7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgbGF5b3V0VHlwZT86ICdzaW5nbGUnIHwgJ211bHRpJyxcbiAgICAgICAgZGlzcGxheUFzOiAnZGlhbG9nJyB8ICdzbmFjay1iYXInIHwgJ25vdGlmaWNhdGlvbicgPSAnbm90aWZpY2F0aW9uJyxcbiAgICAgICAgcHVibGljIHN0YXR1cz86ICAnYWN0aXZhdGUnIHwgJ2RlYWN0aXZhdGUnLFxuICAgICAgICBwdWJsaWMgZGF0YT86IE1lc3NhZ2UgfCBNZXNzYWdlW10sXG4gICAgICAgIHB1YmxpYyBjc3M6IENzcyA9IHtcbiAgICAgICAgICAgIHNoYWRvdzogdHJ1ZSxcbiAgICAgICAgICAgIHBvc2l0aW9uOiAnZGVmYXVsdCcsXG4gICAgICAgICAgICBiYWNrZ3JvdW5kOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBjb2xvcjogdW5kZWZpbmVkLFxuICAgICAgICAgICAgd2lkdGg6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGhlaWdodDogdW5kZWZpbmVkIH0sXG4gICAgICAgIHB1YmxpYyBhY3Rpb25CdXR0b25zOiBOb3RpZmljYXRpb25CdXR0b25bXSA9IFtdKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuc3RhdHVzID0gJ2RlYWN0aXZhdGUnO1xuICAgICAgICBpZiAobGF5b3V0VHlwZSkge1xuICAgICAgICAgICAgdGhpcy5sYXlvdXRUeXBlID0gbGF5b3V0VHlwZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5hY3Rpb25CdXR0b25zKSB7XG4gICAgICAgICAgICB0aGlzLmRlZmF1bHRCdXR0b25zKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGlzcGxheUFzID09PSAnbm90aWZpY2F0aW9uJykge1xuICAgICAgICAgICAgdGhpcy5pc05vdGlmaWNhdGlvbiA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAoZGlzcGxheUFzID09PSAnZGlhbG9nJykge1xuICAgICAgICAgICAgdGhpcy5pc0RpYWxvZyA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAoZGlzcGxheUFzID09PSAnc25hY2stYmFyJykge1xuICAgICAgICAgICAgdGhpcy5pc1NuYWNrID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNldCBtZXNzYWdlKG1zZzogc3RyaW5nKSB7XG4gICAgICAgIGlmICh0aGlzLmxheW91dFR5cGUgPT09ICdzaW5nbGUnKSB7XG4gICAgICAgICAgICB0aGlzLmRhdGEgPSBuZXcgTWVzc2FnZShtc2cpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZGVmYXVsdEJ1dHRvbnMoYWN0aW9uQnV0dG9ucz86IE5vdGlmaWNhdGlvbkJ1dHRvbltdKTogIHZvaWQge1xuICAgICAgICB0aGlzLmFjdGlvbkJ1dHRvbnMgPSBhY3Rpb25CdXR0b25zIHx8IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0ZXh0OiAnWWVzJyxcbiAgICAgICAgICAgICAgICBkaXNhYmxlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgdHlwZTogJ2J1dHRvbicsXG4gICAgICAgICAgICAgICAgZW1pdFZhbHVlOiB0cnVlLFxuICAgICAgICAgICAgICAgIGNzczogeyBjb2xvcjogJyMzZjUxYjUnLCBiYWNrZ3JvdW5kOiAndHJhbnNwYXJlbnQnLCBzaGFkb3c6IHRydWUgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0ZXh0OiAnQ2FuY2VsJyxcbiAgICAgICAgICAgICAgICBkaXNhYmxlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgdHlwZTogJ2J1dHRvbicsXG4gICAgICAgICAgICAgICAgZW1pdFZhbHVlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBjc3M6IHsgY29sb3I6ICcjZjQ0MzM2JywgYmFja2dyb3VuZDogJ3RyYW5zcGFyZW50Jywgc2hhZG93OiB0cnVlIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgXTtcbiAgICB9XG5cbiAgICBhcHBseVRoZW1lQ29sb3JJblRydWVCdXR0b25zKCkge1xuICAgICAgICB0aGlzLmFjdGlvbkJ1dHRvbnMuZm9yRWFjaCgoYnV0dG9uOiBOb3RpZmljYXRpb25CdXR0b24pID0+IHtcbiAgICAgICAgICAgIGlmICggdHlwZW9mKGJ1dHRvbi5lbWl0VmFsdWUpID09PSAnYm9vbGVhbicgJiYgYnV0dG9uLmVtaXRWYWx1ZSApIHtcbiAgICAgICAgICAgICAgICBidXR0b24uY3NzLmNvbG9yID0gdGhpcy5jc3MuY29sb3I7XG4gICAgICAgICAgICAgICAgYnV0dG9uLmNzcy5iYWNrZ3JvdW5kID0gdGhpcy5jc3MuYmFja2dyb3VuZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc2V0IHRydWVBY3Rpb25CdXR0b25TdGF0dXMoc3RhdHVzOiAnZW5hYmxlJyB8ICdkaXNhYmxlJykge1xuICAgICAgICB0aGlzLmFjdGlvbkJ1dHRvbnMuZm9yRWFjaCgoYnV0dG9uOiBOb3RpZmljYXRpb25CdXR0b24pID0+IHtcbiAgICAgICAgICAgIGlmICggdHlwZW9mKGJ1dHRvbi5lbWl0VmFsdWUpID09PSAnYm9vbGVhbicgJiYgIGJ1dHRvbi5lbWl0VmFsdWUpIHtcbiAgICAgICAgICAgICAgICBidXR0b24uZGlzYWJsZWQgPSBzdGF0dXMgPT09ICdkaXNhYmxlJyA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZ2V0IGN1cnJlbnRTdGF0dXMoKTogJ2hpZGUnIHwgJ3Nob3cnIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdHVzID09PSAnYWN0aXZhdGUnID8gJ3Nob3cnIDogJ2hpZGUnO1xuICAgIH1cblxuICAgIGdldCB0cnVlQWN0aW9uQnV0dG9uKCk6IE5vdGlmaWNhdGlvbkJ1dHRvbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmFjdGlvbkJ1dHRvbnMuZmlsdGVyKChidXR0b246IE5vdGlmaWNhdGlvbkJ1dHRvbikgPT5cbiAgICAgICAgdHlwZW9mKGJ1dHRvbi5lbWl0VmFsdWUpID09PSAnYm9vbGVhbicgJiYgIGJ1dHRvbi5lbWl0VmFsdWUpWzBdIHx8IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBhZGROZXdCdXR0b24oXG4gICAgICAgIGxhYmVsOiBzdHJpbmcsXG4gICAgICAgIGNhbGxCYWNrRnVuY3Rpb25zOiB7IGZ1bmM6IEZ1bmN0aW9uLCBwYXJhbTogYW55IH1bXSxcbiAgICAgICAgZGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICAgICAgdHlwZTogJ3N1Ym1pdCd8ICdidXR0b24nID0gJ2J1dHRvbicsXG4gICAgICAgIGVtaXRWYWx1ZTogYW55LFxuICAgICAgICBjc3M6IENzcyA9IHsgY29sb3I6ICdibGFjaycsIGJhY2tncm91bmQ6ICd0cmFuc3BhcmVudCcsIHNoYWRvdzogdHJ1ZSB9LFxuICAgICAgICApIHtcbiAgICAgICAgY29uc3QgYnV0dG9uOiBOb3RpZmljYXRpb25CdXR0b24gPSB7XG4gICAgICAgICAgICB0ZXh0IDogbGFiZWwsXG4gICAgICAgICAgICBkaXNhYmxlZDogZGlzYWJsZWQsXG4gICAgICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICAgICAgZW1pdFZhbHVlOiBlbWl0VmFsdWUsXG4gICAgICAgICAgICBjc3M6IGNzcyB8fCB7IGNvbG9yOiAnIzNmNTFiNScsIGJhY2tncm91bmQ6ICd0cmFuc3BhcmVudCcsIHNoYWRvdzogdHJ1ZSB9LFxuICAgICAgICAgICAgY2FsbEJhY2tGdW5jdGlvbnM6IGNhbGxCYWNrRnVuY3Rpb25zIHx8IHVuZGVmaW5lZFxuICAgICAgICB9O1xuICAgICAgICBpZiAodGhpcy5hY3Rpb25CdXR0b25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGZpbmRJbmRleCA9IHRoaXMuYWN0aW9uQnV0dG9uc1xuICAgICAgICAgICAgLmZpbmQoKGJ0bjogTm90aWZpY2F0aW9uQnV0dG9uKSA9PlxuICAgICAgICAgICAgICAgIChidG4udHlwZSA9PT0gdHlwZSkgJiZcbiAgICAgICAgICAgICAgICAodHlwZW9mKGVtaXRWYWx1ZSkgPT09ICdib29sZWFuJykgJiZcbiAgICAgICAgICAgICAgICAodHlwZW9mKGVtaXRWYWx1ZSkgPT09IHR5cGVvZihidG4uZW1pdFZhbHVlKSkgJiZcbiAgICAgICAgICAgICAgICAoZW1pdFZhbHVlID09PSAgYnRuLmVtaXRWYWx1ZSkpO1xuICAgICAgICAgICAgaWYgKCFmaW5kSW5kZXgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFjdGlvbkJ1dHRvbnMuc3BsaWNlKDEsIDAsIGJ1dHRvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFjdGlvbkJ1dHRvbnMucHVzaChidXR0b24pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYnV0dG9uQ29sb3JSZXZlcnNlKCkge1xuICAgICAgICB0aGlzLmFjdGlvbkJ1dHRvbnMuZm9yRWFjaCgoYnV0dG9uOiBOb3RpZmljYXRpb25CdXR0b24pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGJhY2tncm91bmQgPSBidXR0b24uY3NzLmNvbG9yO1xuICAgICAgICAgICAgY29uc3QgY29sb3IgPSB0aGlzLl9oYW5kbGVUcmFuc3BhcmVudENvbG9yKGJ1dHRvbi5jc3MuYmFja2dyb3VuZCk7XG4gICAgICAgICAgICBidXR0b24uY3NzLmNvbG9yID0gY29sb3I7XG4gICAgICAgICAgICBidXR0b24uY3NzLmJhY2tncm91bmQgPSBiYWNrZ3JvdW5kO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9oYW5kbGVUcmFuc3BhcmVudENvbG9yKG9yaWdpbmFsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gb3JpZ2luYWwgPT09ICd0cmFuc3BhcmVudCcgPyAnd2hpdGUnIDogb3JpZ2luYWwgPT09ICd3aGl0ZScgPyAndHJhbnNwYXJlbnQnIDogb3JpZ2luYWw7XG4gICAgfVxuXG4gICAgYnV0dG9uU2hhZG93KHN0YXR1czogJ3Nob3cnfCdoaWRlJykge1xuICAgICAgICB0aGlzLmFjdGlvbkJ1dHRvbnMuZm9yRWFjaCgoYnV0dG9uOiBOb3RpZmljYXRpb25CdXR0b24pID0+IHtcbiAgICAgICAgICAgIGJ1dHRvbi5jc3Muc2hhZG93ID0gc3RhdHVzID09PSAnc2hvdycgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHNldCBtZXNzYWdlcyhtc2dzOiBzdHJpbmdbXSkge1xuICAgICAgICBpZiAoIHRoaXMubGF5b3V0VHlwZSA9PT0gJ211bHRpJykge1xuICAgICAgICAgICAgdGhpcy5kYXRhID0gbXNncy5tYXAoKG1zZzogc3RyaW5nKSA9PiBuZXcgTWVzc2FnZShtc2cpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNldCBsYXlvdXRUeXBlKHR5cGU6ICdzaW5nbGUnIHwgJ211bHRpJykge1xuICAgICAgICBpZiAoIHR5cGUgPT09ICdtdWx0aScgKSB7XG4gICAgICAgICAgICB0aGlzLmxheW91dCA9IG5ldyBNdWx0aU5vdGlmaWVyKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmxheW91dCA9IG5ldyBTaW5nbGVOb3RpZmllcigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0IGxheW91dFR5cGUoKTogJ3NpbmdsZScgfCAnbXVsdGknIHtcbiAgICAgICAgaWYgKCB0aGlzLmxheW91dCBpbnN0YW5jZW9mIE11bHRpTm90aWZpZXIpIHtcbiAgICAgICAgICAgIHJldHVybiAnbXVsdGknO1xuICAgICAgICB9IGVsc2UgaWYgKCB0aGlzLmxheW91dCBpbnN0YW5jZW9mIFNpbmdsZU5vdGlmaWVyICkge1xuICAgICAgICAgICAgcmV0dXJuICdzaW5nbGUnO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0IHRpbWVyKCk6IFRpbWVyIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLl90aW1lcjtcbiAgICB9XG5cbiAgICBzaG93KCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9ldmVudC5uZXh0KHRydWUpO1xuICAgICAgICBpZiAodGhpcy50aW1lcikge1xuICAgICAgICAgICAgdGhpcy5jYW5jZWxUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5oaWRlKGZhbHNlKSwgdGhpcy50aW1lci5kdXJhdGlvbik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBoaWRlKHdoeT86IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fZXZlbnQubmV4dCh3aHkpO1xuICAgIH1cblxuICAgIHNldCB0aXRsZVRleHQodGl0bGU6IHN0cmluZykge1xuICAgICAgICBpZiAoIHRoaXMubGF5b3V0VHlwZSA9PT0gJ211bHRpJykge1xuICAgICAgICAgICAgY29uc3QgbGF5b3V0ID0gdGhpcy5sYXlvdXQgYXMgTXVsdGlOb3RpZmllcjtcbiAgICAgICAgICAgIGxheW91dC50aXRsZVRleHQgPSB0aXRsZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldCBhY3Rpb24oKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9ldmVudDtcbiAgICB9XG5cbiAgICBzZXQgaGVhZGVyKG1zZzogc3RyaW5nKSB7XG4gICAgICAgIGlmICggdGhpcy5sYXlvdXRUeXBlID09PSAnbXVsdGknKSB7XG4gICAgICAgICAgICBjb25zdCBsYXlvdXQgPSB0aGlzLmxheW91dCBhcyBNdWx0aU5vdGlmaWVyO1xuICAgICAgICAgICAgbGF5b3V0LmhlYWQgPSBtc2c7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXQgaXNEaWFsb2coc3RhdHVzOiBib29sZWFuKSB7XG4gICAgICAgIGlmIChzdGF0dXMpIHtcbiAgICAgICAgICAgIHRoaXMubGF5b3V0LmRpc3BsYXlBcyA9ICdkaWFsb2cnO1xuICAgICAgICAgICAgdGhpcy5jc3MucG9zaXRpb24gPSAnY2VudGVyJztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNldCBpc1NuYWNrKHN0YXR1czogYm9vbGVhbikge1xuICAgICAgICBpZiAoc3RhdHVzKSB7XG4gICAgICAgICAgICB0aGlzLmxheW91dC5kaXNwbGF5QXMgPSAnc25hY2stYmFyJztcbiAgICAgICAgICAgIHRoaXMuY3NzLnBvc2l0aW9uID0gJ2JvdHRvbSc7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXQgaXNOb3RpZmljYXRpb24oc3RhdHVzOiBib29sZWFuKSB7XG4gICAgICAgIGlmIChzdGF0dXMpIHtcbiAgICAgICAgICAgIHRoaXMubGF5b3V0LmRpc3BsYXlBcyA9ICdub3RpZmljYXRpb24nO1xuICAgICAgICAgICAgdGhpcy5jc3MucG9zaXRpb24gPSAnZGVmYXVsdCc7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXQgZGlzYWJsZU91dHNpZGVDbGljayhzdGF0dXM6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKCB0aGlzLmxheW91dFR5cGUgPT09ICdtdWx0aScpIHtcbiAgICAgICAgICAgIGNvbnN0IGxheW91dCA9IHRoaXMubGF5b3V0IGFzIE11bHRpTm90aWZpZXI7XG4gICAgICAgICAgICBsYXlvdXQuZGlzYWJsZU91dHNpZGVDbGljayA9IHN0YXR1cztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNldCBib2R5KHN0YXR1czogICdzaG93JyB8ICdoaWRlJykge1xuICAgICAgICBpZiAoIHRoaXMubGF5b3V0VHlwZSA9PT0gJ211bHRpJykge1xuICAgICAgICAgICAgY29uc3QgbGF5b3V0ID0gdGhpcy5sYXlvdXQgYXMgTXVsdGlOb3RpZmllcjtcbiAgICAgICAgICAgIGxheW91dC5ib2R5LnN0YXR1cyA9IHN0YXR1cyA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXQgYWN0aW9uUm93KHN0YXR1czogICdzaG93JyB8ICdoaWRlJykge1xuICAgICAgICBpZiAoIHRoaXMubGF5b3V0VHlwZSA9PT0gJ211bHRpJykge1xuICAgICAgICAgICAgY29uc3QgbGF5b3V0ID0gdGhpcy5sYXlvdXQgYXMgTXVsdGlOb3RpZmllcjtcbiAgICAgICAgICAgIGxheW91dC5hY3Rpb25Sb3cuc3RhdHVzID0gc3RhdHVzO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2V0IGNsb3NlQnV0dG9uKHN0YXR1czogICdzaG93JyB8ICdoaWRlJykge1xuICAgICAgICB0aGlzLmxheW91dC5jbG9zZUJ1dHRvbi5zdGF0dXMgPSBzdGF0dXM7XG4gICAgfVxuXG4gICAgc2V0IHRpdGxlKHN0YXR1czogICdzaG93JyB8ICdoaWRlJykge1xuICAgICAgICB0aGlzLmxheW91dC50aXRsZS5zdGF0dXMgPSBzdGF0dXM7XG4gICAgfVxuXG4gICAgc2V0IHRydWVCdXR0b24odGV4dDogc3RyaW5nKSB7XG4gICAgICAgIGlmICghIXRoaXMuYWN0aW9uQnV0dG9ucyAmJiB0aGlzLmFjdGlvbkJ1dHRvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5hY3Rpb25CdXR0b25zLmZvckVhY2goKGJ1dHRvbjogTm90aWZpY2F0aW9uQnV0dG9uKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZihidXR0b24uZW1pdFZhbHVlKSA9PT0gJ2Jvb2xlYW4nICYmIGJ1dHRvbi5lbWl0VmFsdWUgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgYnV0dG9uLnRleHQgPSB0ZXh0O1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXQgZmFsc2VCdXR0b24odGV4dDogc3RyaW5nKSB7XG4gICAgICAgIGlmICghIXRoaXMuYWN0aW9uQnV0dG9ucyAmJiB0aGlzLmFjdGlvbkJ1dHRvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5hY3Rpb25CdXR0b25zLmZvckVhY2goKGJ1dHRvbjogTm90aWZpY2F0aW9uQnV0dG9uKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZihidXR0b24uZW1pdFZhbHVlKSA9PT0gJ2Jvb2xlYW4nICYmIGJ1dHRvbi5lbWl0VmFsdWUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgIGJ1dHRvbi50ZXh0ID0gdGV4dDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0IHR5cGUoKTogJ3dhcm4nIHwgJ2Vycm9yJyB8ICdub3RlJyB8ICdzdWNjZXNzJyB8ICdoZWxwJyB8ICdvdGhlcicge1xuICAgICAgICByZXR1cm4gdGhpcy5ub3RpZmljYXRpb25UeXBlO1xuICAgIH1cblxuICAgIHNldCB0eXBlKF90eXBlOiAnd2FybicgfCAnZXJyb3InIHwgJ25vdGUnIHwgJ3N1Y2Nlc3MnIHwgJ2hlbHAnIHwgJ290aGVyJykge1xuICAgICAgICB0aGlzLm5vdGlmaWNhdGlvblR5cGUgPSBfdHlwZTtcbiAgICAgICAgLyoqIGRlZmF1bHQgY3NzIHNldHVwICovXG4gICAgICAgIGlmICggX3R5cGUgPT09ICdzdWNjZXNzJyApIHtcbiAgICAgICAgICAgIHRoaXMuY3NzLmJhY2tncm91bmQgPSAnIzRDQUY1MCc7XG4gICAgICAgICAgICB0aGlzLmNzcy5jb2xvciA9ICd3aGl0ZSc7XG4gICAgICAgIH0gZWxzZSBpZiAoIF90eXBlID09PSAnZXJyb3InICkge1xuICAgICAgICAgICAgdGhpcy5jc3MuYmFja2dyb3VuZCA9ICcjY2MwMDAwJztcbiAgICAgICAgICAgIHRoaXMuY3NzLmNvbG9yID0gJ3doaXRlJztcbiAgICAgICAgfSBlbHNlIGlmICggX3R5cGUgPT09ICd3YXJuJyApIHtcbiAgICAgICAgICAgIHRoaXMuY3NzLmJhY2tncm91bmQgPSAnI2ZmOTgwMCc7XG4gICAgICAgICAgICB0aGlzLmNzcy5jb2xvciA9ICd3aGl0ZSc7XG4gICAgICAgIH0gIGVsc2UgaWYgKCBfdHlwZSA9PT0gJ25vdGUnICkge1xuICAgICAgICAgICAgdGhpcy5jc3MuYmFja2dyb3VuZCA9ICcjMjE5NkYzJztcbiAgICAgICAgICAgIHRoaXMuY3NzLmNvbG9yID0gJ3doaXRlJztcbiAgICAgICAgfSAgZWxzZSBpZiAoIF90eXBlID09PSAnaGVscCcgKSB7XG4gICAgICAgICAgICB0aGlzLmNzcy5iYWNrZ3JvdW5kID0gJ3JnYigyLCA2NCwgMTE0KSc7XG4gICAgICAgICAgICB0aGlzLmNzcy5jb2xvciA9ICd3aGl0ZSc7XG4gICAgICAgIH0gIGVsc2UgaWYgKCBfdHlwZSA9PT0gJ290aGVyJyApIHtcbiAgICAgICAgICAgIHRoaXMuY3NzLmJhY2tncm91bmQgPSAnIzNmNTFiNSc7XG4gICAgICAgICAgICB0aGlzLmNzcy5jb2xvciA9ICd3aGl0ZSc7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXQgdGltZXIoX3RpbWVyOiBUaW1lcikge1xuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5jYW5jZWxUaW1lcik7XG4gICAgICAgIHRoaXMuX3RpbWVyID0gX3RpbWVyO1xuICAgIH1cblxuICAgIGdldCBhZnRlck9wZW5lZCgpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FmdGVyT3BlbmVkLmFzT2JzZXJ2YWJsZSgpXG4gICAgICAgIC5waXBlKHRha2UoMSkpO1xuICAgIH1cblxuICAgIGdldCBhZnRlckNsb3NlZCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4gfCBhbnk+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FmdGVyQ2xvc2VkLmFzT2JzZXJ2YWJsZSgpXG4gICAgICAgIC5waXBlKHRha2UoMSkpO1xuICAgIH1cblxuICAgIHNldCBjbG9zZShzdGF0dXM6IGFueSkge1xuICAgICAgICB0aGlzLl9hZnRlckNsb3NlZC5uZXh0KHN0YXR1cyk7XG4gICAgfVxuXG4gICAgb3BlbmVkKCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9hZnRlck9wZW5lZC5uZXh0KCk7XG4gICAgfVxuXG59XG4iXX0=