UNPKG

com.phloxui

Version:

PhloxUI Ng2+ Framework

201 lines (200 loc) 25.2 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ import { EventEmitter } from '@angular/core'; import { Subscription } from 'rxjs'; export class EventUtils { /** * @param {?} type * @param {?} ngComponent * @param {?} data * @param {?} $browserEvent * @return {?} */ static newCustomEvent(type, ngComponent, data, $browserEvent) { let /** @type {?} */ option = {}; option['type'] = type; option.detail = {}; option.detail['time'] = new Date(); option.detail['target'] = ngComponent; option.detail['event'] = $browserEvent; option.detail['data'] = data; option.detail['eventTarget'] = ($browserEvent === null || typeof $browserEvent === 'undefined') ? undefined : $browserEvent.target; option['bubbles'] = true; option['cancelable'] = true; return this.newCustomEventWithOption(option); } /** * @param {?} option * @return {?} */ static newCustomEventWithOption(option) { let /** @type {?} */ ev = new CustomEvent(option.type, { detail: { time: option.detail.time, target: option.detail.target, event: option.detail.event, data: option.detail.data, eventTarget: option.detail.eventTarget }, bubbles: option.bubbles, cancelable: option.cancelable }); return ev; } /** * @param {?} component * @param {?} beforeEventVarName * @param {?=} $browserEvent * @param {?=} fireEvent * @param {?=} doEvent * @param {?=} emitBeforeEvent * @param {?=} emitAfterEvent * @param {?=} doPrevented * @param {?=} subscrSuffix * @return {?} */ static handleBrowserEvent(component, beforeEventVarName, $browserEvent, fireEvent, doEvent, emitBeforeEvent, emitAfterEvent, doPrevented, subscrSuffix) { if (fireEvent === null || fireEvent === undefined) { fireEvent = true; } if (!component) { throw 'The parameter "component" must be specified.'; } if (!beforeEventVarName) { throw 'The parameter "beforeEventVarName" must be specified.'; } let /** @type {?} */ beforeEvent = component[beforeEventVarName]; if (!beforeEvent) { throw 'Could not find property "' + beforeEventVarName + '" in the given component.'; } if (!(beforeEvent instanceof EventEmitter)) { throw 'The property "' + beforeEventVarName + '" is not an EventEmitter.'; } let /** @type {?} */ subscrName = '__' + beforeEventVarName + (subscrSuffix ? '_' + subscrSuffix : '') + '_subscr' + '__'; // Copy & Paste code below let /** @type {?} */ subscr = component[subscrName]; if (subscr !== null && subscr !== undefined && !(subscr instanceof Subscription)) { throw 'The property collision detected: "' + subscrName + '".'; } if (emitBeforeEvent && typeof emitBeforeEvent !== 'function') { throw 'The parameter "emitBeforeEvent" must be a function.'; } if (emitAfterEvent && typeof emitAfterEvent !== 'function') { throw 'The parameter "emitAfterEvent" must be a function.'; } if (doEvent && typeof doEvent !== 'function') { throw 'The parameter "doEvent" must be a function.'; } if (doPrevented && typeof doPrevented !== 'function') { throw 'The parameter "doPrevented" must be a function.'; } return new Promise((resolve, reject) => { let /** @type {?} */ doInit = () => { component[subscrName] = beforeEvent.subscribe(($event) => { let /** @type {?} */ browserEvent = $event; try { browserEvent = $event.detail.event; } catch (/** @type {?} */ e) { } let /** @type {?} */ prom = undefined; if (!$event.defaultPrevented) { if (doEvent) { prom = doEvent(browserEvent); } } else { if (doPrevented) { prom = doPrevented(browserEvent); } } if (prom === null || prom === undefined) { prom = Promise.resolve(null); } else if (!(prom instanceof Promise)) { prom = Promise.resolve(prom); } if (emitAfterEvent) { prom.then((result) => { if (!$event.defaultPrevented) { // Emit after event in Promise in case of doEvent() // returns a promise. emitAfterEvent.call(component, browserEvent, result); } // Delegate result to the next then(). return result; }); } prom.then((result) => { resolve(result); }).catch((error) => { reject(error); }); }); }; let /** @type {?} */ undoInit = () => { if (subscr) { subscr.unsubscribe(); } component[subscrName] = undefined; }; if (fireEvent) { // Always unsubscribe old before event handler to // refresh a new doEvent() & doPrevent() function. undoInit(); if (beforeEvent.observers.length > 0 && emitBeforeEvent) { // Auto subscribe before event with a new doEvent() // & doPrevent() function at the end of stream. doInit(); // Before event subscribers found, only emit before event. emitBeforeEvent.call(component, $browserEvent); } else { // No before event subscribers found. let /** @type {?} */ prom = undefined; if (doEvent) { prom = doEvent($browserEvent); } if (emitAfterEvent) { if (prom === null || prom === undefined) { prom = Promise.resolve(null); } else if (!(prom instanceof Promise)) { prom = Promise.resolve(prom); } prom.then((result) => { // Emit after event in Promise in case of doEvent() // returns a promise. emitAfterEvent.call(component, $browserEvent, result); resolve(result); }).catch((error) => { reject(error); }); } } } else if (doEvent) { let /** @type {?} */ prom = undefined; if (doEvent) { prom = doEvent($browserEvent); } if (prom === null || prom === undefined) { prom = Promise.resolve(null); } else if (!(prom instanceof Promise)) { prom = Promise.resolve(prom); } // We've to wrap doEvent() result into prom // in case of it returns a promise. prom.then((result) => { resolve(result); }).catch((error) => { reject(error); }); } }); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRXZlbnRVdGlscy5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2NvbS5waGxveHVpLyIsInNvdXJjZXMiOlsibGliL3NoYXJlL3V0aWxzL0V2ZW50VXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0MsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUVwQyxNQUFNOzs7Ozs7OztJQUVHLE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBUyxFQUFFLFdBQWdCLEVBQUUsSUFBUyxFQUFFLGFBQWtCO1FBQ3JGLHFCQUFJLE1BQU0sR0FBUSxFQUFFLENBQUM7UUFFckIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQztRQUV0QixNQUFNLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQztRQUNuQixNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7UUFDbkMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxXQUFXLENBQUM7UUFDdEMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxhQUFhLENBQUM7UUFDdkMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUM7UUFDN0IsTUFBTSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLGFBQWEsS0FBSyxJQUFJLElBQUksT0FBTyxhQUFhLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQztRQUVuSSxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQ3pCLE1BQU0sQ0FBQyxZQUFZLENBQUMsR0FBRyxJQUFJLENBQUM7UUFFNUIsTUFBTSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLENBQUMs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R0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUM5QjtnQkFBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksWUFBWSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ3RDLElBQUksR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUM5Qjs7O2dCQUlELElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtvQkFDbkIsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2lCQUNqQixDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7b0JBQ2pCLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztpQkFDZixDQUFDLENBQUM7YUFDSjtTQUNGLENBQUMsQ0FBQzs7Q0FFTiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuXHJcbmV4cG9ydCBjbGFzcyBFdmVudFV0aWxzIHtcclxuXHJcbiAgcHVibGljIHN0YXRpYyBuZXdDdXN0b21FdmVudCh0eXBlOiBhbnksIG5nQ29tcG9uZW50OiBhbnksIGRhdGE6IGFueSwgJGJyb3dzZXJFdmVudDogYW55KTogQ3VzdG9tRXZlbnQge1xyXG4gICAgbGV0IG9wdGlvbjogYW55ID0ge307XHJcblxyXG4gICAgb3B0aW9uWyd0eXBlJ10gPSB0eXBlO1xyXG5cclxuICAgIG9wdGlvbi5kZXRhaWwgPSB7fTtcclxuICAgIG9wdGlvbi5kZXRhaWxbJ3RpbWUnXSA9IG5ldyBEYXRlKCk7XHJcbiAgICBvcHRpb24uZGV0YWlsWyd0YXJnZXQnXSA9IG5nQ29tcG9uZW50O1xyXG4gICAgb3B0aW9uLmRldGFpbFsnZXZlbnQnXSA9ICRicm93c2VyRXZlbnQ7XHJcbiAgICBvcHRpb24uZGV0YWlsWydkYXRhJ10gPSBkYXRhO1xyXG4gICAgb3B0aW9uLmRldGFpbFsnZXZlbnRUYXJnZXQnXSA9ICgkYnJvd3NlckV2ZW50ID09PSBudWxsIHx8IHR5cGVvZiAkYnJvd3NlckV2ZW50ID09PSAndW5kZWZpbmVkJykgPyB1bmRlZmluZWQgOiAkYnJvd3NlckV2ZW50LnRhcmdldDtcclxuXHJcbiAgICBvcHRpb25bJ2J1YmJsZXMnXSA9IHRydWU7XHJcbiAgICBvcHRpb25bJ2NhbmNlbGFibGUnXSA9IHRydWU7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMubmV3Q3VzdG9tRXZlbnRXaXRoT3B0aW9uKG9wdGlvbik7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIG5ld0N1c3RvbUV2ZW50V2l0aE9wdGlvbihvcHRpb246IGFueSk6IEN1c3RvbUV2ZW50IHtcclxuICAgIGxldCBldiA9IG5ldyBDdXN0b21FdmVudChcclxuICAgICAgb3B0aW9uLnR5cGUsXHJcbiAgICAgIHtcclxuICAgICAgICBkZXRhaWw6IHtcclxuICAgICAgICAgIHRpbWU6IG9wdGlvbi5kZXRhaWwudGltZSxcclxuICAgICAgICAgIHRhcmdldDogb3B0aW9uLmRldGFpbC50YXJnZXQsXHJcbiAgICAgICAgICBldmVudDogb3B0aW9uLmRldGFpbC5ldmVudCxcclxuICAgICAgICAgIGRhdGE6IG9wdGlvbi5kZXRhaWwuZGF0YSxcclxuICAgICAgICAgIGV2ZW50VGFyZ2V0OiBvcHRpb24uZGV0YWlsLmV2ZW50VGFyZ2V0XHJcbiAgICAgICAgfSxcclxuICAgICAgICBidWJibGVzOiBvcHRpb24uYnViYmxlcyxcclxuICAgICAgICBjYW5jZWxhYmxlOiBvcHRpb24uY2FuY2VsYWJsZVxyXG4gICAgICB9XHJcbiAgICApO1xyXG5cclxuICAgIHJldHVybiBldjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgaGFuZGxlQnJvd3NlckV2ZW50KGNvbXBvbmVudDogYW55LCBiZWZvcmVFdmVudFZhck5hbWU6IHN0cmluZywgJGJyb3dzZXJFdmVudD86IEV2ZW50LCBmaXJlRXZlbnQ/OiBib29sZWFuLCBkb0V2ZW50PzogRnVuY3Rpb24sIGVtaXRCZWZvcmVFdmVudD86IEZ1bmN0aW9uLCBlbWl0QWZ0ZXJFdmVudD86IEZ1bmN0aW9uLCBkb1ByZXZlbnRlZD86IEZ1bmN0aW9uLCBzdWJzY3JTdWZmaXg/OiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgaWYgKGZpcmVFdmVudCA9PT0gbnVsbCB8fCBmaXJlRXZlbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBmaXJlRXZlbnQgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghY29tcG9uZW50KSB7XHJcbiAgICAgIHRocm93ICdUaGUgcGFyYW1ldGVyIFwiY29tcG9uZW50XCIgbXVzdCBiZSBzcGVjaWZpZWQuJztcclxuICAgIH1cclxuICAgIGlmICghYmVmb3JlRXZlbnRWYXJOYW1lKSB7XHJcbiAgICAgIHRocm93ICdUaGUgcGFyYW1ldGVyIFwiYmVmb3JlRXZlbnRWYXJOYW1lXCIgbXVzdCBiZSBzcGVjaWZpZWQuJztcclxuICAgIH1cclxuXHJcbiAgICBsZXQgYmVmb3JlRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gY29tcG9uZW50W2JlZm9yZUV2ZW50VmFyTmFtZV07XHJcblxyXG4gICAgaWYgKCFiZWZvcmVFdmVudCkge1xyXG4gICAgICB0aHJvdyAnQ291bGQgbm90IGZpbmQgcHJvcGVydHkgXCInICsgYmVmb3JlRXZlbnRWYXJOYW1lICsgJ1wiIGluIHRoZSBnaXZlbiBjb21wb25lbnQuJztcclxuICAgIH1cclxuICAgIGlmICghKGJlZm9yZUV2ZW50IGluc3RhbmNlb2YgRXZlbnRFbWl0dGVyKSkge1xyXG4gICAgICB0aHJvdyAnVGhlIHByb3BlcnR5IFwiJyArIGJlZm9yZUV2ZW50VmFyTmFtZSArICdcIiBpcyBub3QgYW4gRXZlbnRFbWl0dGVyLic7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHN1YnNjck5hbWU6IHN0cmluZyA9ICdfXycgKyBiZWZvcmVFdmVudFZhck5hbWUgKyAoc3Vic2NyU3VmZml4ID8gJ18nICsgc3Vic2NyU3VmZml4IDogJycpICsgJ19zdWJzY3InICsgJ19fJztcclxuXHJcbiAgICAvLyBDb3B5ICYgUGFzdGUgY29kZSBiZWxvd1xyXG4gICAgbGV0IHN1YnNjcjogU3Vic2NyaXB0aW9uID0gY29tcG9uZW50W3N1YnNjck5hbWVdO1xyXG5cclxuICAgIGlmIChzdWJzY3IgIT09IG51bGwgJiYgc3Vic2NyICE9PSB1bmRlZmluZWQgJiYgIShzdWJzY3IgaW5zdGFuY2VvZiBTdWJzY3JpcHRpb24pKSB7XHJcbiAgICAgIHRocm93ICdUaGUgcHJvcGVydHkgY29sbGlzaW9uIGRldGVjdGVkOiBcIicgKyBzdWJzY3JOYW1lICsgJ1wiLic7XHJcbiAgICB9XHJcbiAgICBpZiAoZW1pdEJlZm9yZUV2ZW50ICYmIHR5cGVvZiBlbWl0QmVmb3JlRXZlbnQgIT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgdGhyb3cgJ1RoZSBwYXJhbWV0ZXIgXCJlbWl0QmVmb3JlRXZlbnRcIiBtdXN0IGJlIGEgZnVuY3Rpb24uJztcclxuICAgIH1cclxuICAgIGlmIChlbWl0QWZ0ZXJFdmVudCAmJiB0eXBlb2YgZW1pdEFmdGVyRXZlbnQgIT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgdGhyb3cgJ1RoZSBwYXJhbWV0ZXIgXCJlbWl0QWZ0ZXJFdmVudFwiIG11c3QgYmUgYSBmdW5jdGlvbi4nO1xyXG4gICAgfVxyXG4gICAgaWYgKGRvRXZlbnQgJiYgdHlwZW9mIGRvRXZlbnQgIT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgdGhyb3cgJ1RoZSBwYXJhbWV0ZXIgXCJkb0V2ZW50XCIgbXVzdCBiZSBhIGZ1bmN0aW9uLic7XHJcbiAgICB9XHJcbiAgICBpZiAoZG9QcmV2ZW50ZWQgJiYgdHlwZW9mIGRvUHJldmVudGVkICE9PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgIHRocm93ICdUaGUgcGFyYW1ldGVyIFwiZG9QcmV2ZW50ZWRcIiBtdXN0IGJlIGEgZnVuY3Rpb24uJztcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2U8YW55PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIGxldCBkb0luaXQgPSAoKTogdm9pZCA9PiB7XHJcbiAgICAgICAgY29tcG9uZW50W3N1YnNjck5hbWVdID0gYmVmb3JlRXZlbnQuc3Vic2NyaWJlKCgkZXZlbnQ6IEN1c3RvbUV2ZW50KSA9PiB7XHJcbiAgICAgICAgICBsZXQgYnJvd3NlckV2ZW50OiBFdmVudCA9ICRldmVudDtcclxuICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGJyb3dzZXJFdmVudCA9ICRldmVudC5kZXRhaWwuZXZlbnQ7XHJcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgbGV0IHByb206IGFueSA9IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgICAgICBpZiAoISRldmVudC5kZWZhdWx0UHJldmVudGVkKSB7XHJcbiAgICAgICAgICAgIGlmIChkb0V2ZW50KSB7XHJcbiAgICAgICAgICAgICAgcHJvbSA9IGRvRXZlbnQoYnJvd3NlckV2ZW50KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKGRvUHJldmVudGVkKSB7XHJcbiAgICAgICAgICAgICAgcHJvbSA9IGRvUHJldmVudGVkKGJyb3dzZXJFdmVudCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAocHJvbSA9PT0gbnVsbCB8fCBwcm9tID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgcHJvbSA9IFByb21pc2UucmVzb2x2ZShudWxsKTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoIShwcm9tIGluc3RhbmNlb2YgUHJvbWlzZSkpIHtcclxuICAgICAgICAgICAgcHJvbSA9IFByb21pc2UucmVzb2x2ZShwcm9tKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAoZW1pdEFmdGVyRXZlbnQpIHtcclxuICAgICAgICAgICAgcHJvbS50aGVuKChyZXN1bHQpID0+IHtcclxuICAgICAgICAgICAgICBpZiAoISRldmVudC5kZWZhdWx0UHJldmVudGVkKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBFbWl0IGFmdGVyIGV2ZW50IGluIFByb21pc2UgaW4gY2FzZSBvZiBkb0V2ZW50KClcclxuICAgICAgICAgICAgICAgIC8vIHJldHVybnMgYSBwcm9taXNlLlxyXG4gICAgICAgICAgICAgICAgZW1pdEFmdGVyRXZlbnQuY2FsbChjb21wb25lbnQsIGJyb3dzZXJFdmVudCwgcmVzdWx0KTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgLy8gRGVsZWdhdGUgcmVzdWx0IHRvIHRoZSBuZXh0IHRoZW4oKS5cclxuICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBwcm9tLnRoZW4oKHJlc3VsdCkgPT4ge1xyXG4gICAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7XHJcbiAgICAgICAgICB9KS5jYXRjaCgoZXJyb3IpID0+IHtcclxuICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9O1xyXG4gICAgICBsZXQgdW5kb0luaXQgPSAoKTogdm9pZCA9PiB7XHJcbiAgICAgICAgaWYgKHN1YnNjcikge1xyXG4gICAgICAgICAgc3Vic2NyLnVuc3Vic2NyaWJlKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb21wb25lbnRbc3Vic2NyTmFtZV0gPSB1bmRlZmluZWQ7XHJcbiAgICAgIH07XHJcblxyXG4gICAgICBpZiAoZmlyZUV2ZW50KSB7XHJcbiAgICAgICAgLy8gQWx3YXlzIHVuc3Vic2NyaWJlIG9sZCBiZWZvcmUgZXZlbnQgaGFuZGxlciB0b1xyXG4gICAgICAgIC8vIHJlZnJlc2ggYSBuZXcgZG9FdmVudCgpICYgZG9QcmV2ZW50KCkgZnVuY3Rpb24uXHJcbiAgICAgICAgdW5kb0luaXQoKTtcclxuXHJcbiAgICAgICAgaWYgKGJlZm9yZUV2ZW50Lm9ic2VydmVycy5sZW5ndGggPiAwICYmIGVtaXRCZWZvcmVFdmVudCkge1xyXG4gICAgICAgICAgLy8gQXV0byBzdWJzY3JpYmUgYmVmb3JlIGV2ZW50IHdpdGggYSBuZXcgZG9FdmVudCgpXHJcbiAgICAgICAgICAvLyAmIGRvUHJldmVudCgpIGZ1bmN0aW9uIGF0IHRoZSBlbmQgb2Ygc3RyZWFtLlxyXG4gICAgICAgICAgZG9Jbml0KCk7XHJcblxyXG4gICAgICAgICAgLy8gQmVmb3JlIGV2ZW50IHN1YnNjcmliZXJzIGZvdW5kLCBvbmx5IGVtaXQgYmVmb3JlIGV2ZW50LlxyXG4gICAgICAgICAgZW1pdEJlZm9yZUV2ZW50LmNhbGwoY29tcG9uZW50LCAkYnJvd3NlckV2ZW50KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgLy8gTm8gYmVmb3JlIGV2ZW50IHN1YnNjcmliZXJzIGZvdW5kLlxyXG4gICAgICAgICAgbGV0IHByb206IGFueSA9IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgICAgICBpZiAoZG9FdmVudCkge1xyXG4gICAgICAgICAgICBwcm9tID0gZG9FdmVudCgkYnJvd3NlckV2ZW50KTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAoZW1pdEFmdGVyRXZlbnQpIHtcclxuICAgICAgICAgICAgaWYgKHByb20gPT09IG51bGwgfHwgcHJvbSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgcHJvbSA9IFByb21pc2UucmVzb2x2ZShudWxsKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICghKHByb20gaW5zdGFuY2VvZiBQcm9taXNlKSkge1xyXG4gICAgICAgICAgICAgIHByb20gPSBQcm9taXNlLnJlc29sdmUocHJvbSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHByb20udGhlbigocmVzdWx0KSA9PiB7XHJcbiAgICAgICAgICAgICAgLy8gRW1pdCBhZnRlciBldmVudCBpbiBQcm9taXNlIGluIGNhc2Ugb2YgZG9FdmVudCgpXHJcbiAgICAgICAgICAgICAgLy8gcmV0dXJucyBhIHByb21pc2UuXHJcbiAgICAgICAgICAgICAgZW1pdEFmdGVyRXZlbnQuY2FsbChjb21wb25lbnQsICRicm93c2VyRXZlbnQsIHJlc3VsdCk7XHJcblxyXG4gICAgICAgICAgICAgIHJlc29sdmUocmVzdWx0KTtcclxuICAgICAgICAgICAgfSkuY2F0Y2goKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2UgaWYgKGRvRXZlbnQpIHtcclxuICAgICAgICBsZXQgcHJvbTogYW55ID0gdW5kZWZpbmVkO1xyXG5cclxuICAgICAgICBpZiAoZG9FdmVudCkge1xyXG4gICAgICAgICAgcHJvbSA9IGRvRXZlbnQoJGJyb3dzZXJFdmVudCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAocHJvbSA9PT0gbnVsbCB8fCBwcm9tID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgIHByb20gPSBQcm9taXNlLnJlc29sdmUobnVsbCk7XHJcbiAgICAgICAgfSBlbHNlIGlmICghKHByb20gaW5zdGFuY2VvZiBQcm9taXNlKSkge1xyXG4gICAgICAgICAgcHJvbSA9IFByb21pc2UucmVzb2x2ZShwcm9tKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIFdlJ3ZlIHRvIHdyYXAgZG9FdmVudCgpIHJlc3VsdCBpbnRvIHByb21cclxuICAgICAgICAvLyBpbiBjYXNlIG9mIGl0IHJldHVybnMgYSBwcm9taXNlLlxyXG4gICAgICAgIHByb20udGhlbigocmVzdWx0KSA9PiB7XHJcbiAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7XHJcbiAgICAgICAgfSkuY2F0Y2goKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICByZWplY3QoZXJyb3IpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuIl19