UNPKG

ag-grid-angular

Version:
88 lines 14.6 kB
import { Injectable, NgZone } from '@angular/core'; import { VanillaFrameworkOverrides } from 'ag-grid-community'; import { AngularFrameworkEventListenerService } from './angularFrameworkEventListenerService'; import * as i0 from "@angular/core"; export class AngularFrameworkOverrides extends VanillaFrameworkOverrides { constructor(_ngZone) { super('angular'); this._ngZone = _ngZone; this.batchFrameworkComps = true; // Flag used to control Zone behaviour when running tests as many test features rely on Zone. this.isRunningWithinTestZone = false; // Make all events run outside Angular as they often trigger the setup of event listeners // By having the event listeners outside Angular we can avoid triggering change detection // This also means that if a user calls an AG Grid API method from within their component // the internal side effects will not trigger change detection. Without this the events would // run inside Angular and trigger change detection as the source of the event was within the angular zone. this.wrapIncoming = (callback, source) => this.runOutside(callback, source); /** * Make sure that any code that is executed outside of AG Grid is running within the Angular zone. * This means users can update templates and use binding without having to do anything extra. */ this.wrapOutgoing = (callback) => this.runInsideAngular(callback); this.isRunningWithinTestZone = window?.AG_GRID_UNDER_TEST ?? !!window?.Zone?.AsyncTestZoneSpec; if (!this._ngZone) { this.runOutside = (callback) => callback(); } else if (this.isRunningWithinTestZone) { this.runOutside = (callback, source) => { if (source === 'resize-observer' || source === 'popupPositioning') { // ensure resize observer callbacks are run outside of Angular even under test due to Jest not supporting ResizeObserver // which means it just loops continuously with a setTimeout with no way to flush the queue or have fixture.whenStable() resolve. return this._ngZone.runOutsideAngular(callback); } // When under test run inside Angular so that tests can use fixture.whenStable() to wait for async operations to complete. return callback(); }; } else { this.runOutside = (callback) => this._ngZone.runOutsideAngular(callback); } } /** * The shouldWrapOutgoing property is used to determine if events should be run outside of Angular or not. * If an event handler is registered outside of Angular then we should not wrap the event handler * with runInsideAngular() as the user may not have wanted this. * This is also used to not wrap internal event listeners that are registered with RowNodes and Columns. */ get shouldWrapOutgoing() { return this._ngZone && NgZone.isInAngularZone(); } createLocalEventListenerWrapper(existingFrameworkEventListenerService, localEventService) { if (this.shouldWrapOutgoing) { return (existingFrameworkEventListenerService ?? (() => { localEventService.setFrameworkOverrides(this); return new AngularFrameworkEventListenerService(this); })()); } return undefined; } createGlobalEventListenerWrapper() { return new AngularFrameworkEventListenerService(this); } isFrameworkComponent(comp) { if (!comp) { return false; } const prototype = comp.prototype; return prototype && 'agInit' in prototype; } runInsideAngular(callback) { if (!this._ngZone || NgZone.isInAngularZone()) { return callback(); } // Check for _ngZone existence as it is not present when Zoneless return this._ngZone.run(callback); } runOutsideAngular(callback, source) { return this.runOutside(callback, source); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AngularFrameworkOverrides, deps: [{ token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AngularFrameworkOverrides }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AngularFrameworkOverrides, decorators: [{ type: Injectable }], ctorParameters: () => [{ type: i0.NgZone }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhckZyYW1ld29ya092ZXJyaWRlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2FnLWdyaWQtYW5ndWxhci9zcmMvbGliL2FuZ3VsYXJGcmFtZXdvcmtPdmVycmlkZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFPbkQsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFOUQsT0FBTyxFQUFFLG9DQUFvQyxFQUFFLE1BQU0sd0NBQXdDLENBQUM7O0FBRzlGLE1BQU0sT0FBTyx5QkFBMEIsU0FBUSx5QkFBeUI7SUFRcEUsWUFBb0IsT0FBZTtRQUMvQixLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7UUFERCxZQUFPLEdBQVAsT0FBTyxDQUFRO1FBUFYsd0JBQW1CLEdBQVksSUFBSSxDQUFDO1FBRTdELDZGQUE2RjtRQUNyRiw0QkFBdUIsR0FBWSxLQUFLLENBQUM7UUEyQmpELHlGQUF5RjtRQUN6Rix5RkFBeUY7UUFDekYseUZBQXlGO1FBQ3pGLDZGQUE2RjtRQUM3RiwwR0FBMEc7UUFDakcsaUJBQVksR0FBMkUsQ0FDNUYsUUFBUSxFQUNSLE1BQU0sRUFDUixFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFZdkM7OztXQUdHO1FBQ00saUJBQVksR0FBZ0MsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQTVDL0YsSUFBSSxDQUFDLHVCQUF1QjtZQUN2QixNQUFjLEVBQUUsa0JBQWtCLElBQUksQ0FBQyxDQUFFLE1BQWMsRUFBRSxJQUFJLEVBQUUsaUJBQWlCLENBQUM7UUFFdEYsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNoQixJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUMvQyxDQUFDO2FBQU0sSUFBSSxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztZQUN0QyxJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxFQUFFO2dCQUNuQyxJQUFJLE1BQU0sS0FBSyxpQkFBaUIsSUFBSSxNQUFNLEtBQUssa0JBQWtCLEVBQUUsQ0FBQztvQkFDaEUsd0hBQXdIO29CQUN4SCxnSUFBZ0k7b0JBQ2hJLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDcEQsQ0FBQztnQkFDRCwwSEFBMEg7Z0JBQzFILE9BQU8sUUFBUSxFQUFFLENBQUM7WUFDdEIsQ0FBQyxDQUFDO1FBQ04sQ0FBQzthQUFNLENBQUM7WUFDSixJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzdFLENBQUM7SUFDTCxDQUFDO0lBWUQ7Ozs7O09BS0c7SUFDSCxJQUFXLGtCQUFrQjtRQUN6QixPQUFPLElBQUksQ0FBQyxPQUFPLElBQUksTUFBTSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3BELENBQUM7SUFRTSwrQkFBK0IsQ0FDbEMscUNBQTJGLEVBQzNGLGlCQUF5QztRQUV6QyxJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQzFCLE9BQU8sQ0FDSCxxQ0FBcUM7Z0JBQ3JDLENBQUMsR0FBRyxFQUFFO29CQUNGLGlCQUFpQixDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxDQUFDO29CQUM5QyxPQUFPLElBQUksb0NBQW9DLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzFELENBQUMsQ0FBQyxFQUFFLENBQ1AsQ0FBQztRQUNOLENBQUM7UUFFRCxPQUFPLFNBQVMsQ0FBQztJQUNyQixDQUFDO0lBRU0sZ0NBQWdDO1FBQ25DLE9BQU8sSUFBSSxvQ0FBb0MsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBRVEsb0JBQW9CLENBQUMsSUFBUztRQUNuQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDUixPQUFPLEtBQUssQ0FBQztRQUNqQixDQUFDO1FBQ0QsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUNqQyxPQUFPLFNBQVMsSUFBSSxRQUFRLElBQUksU0FBUyxDQUFDO0lBQzlDLENBQUM7SUFFRCxnQkFBZ0IsQ0FBSSxRQUFpQjtRQUNqQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxNQUFNLENBQUMsZUFBZSxFQUFFLEVBQUUsQ0FBQztZQUM1QyxPQUFPLFFBQVEsRUFBRSxDQUFDO1FBQ3RCLENBQUM7UUFFRCxpRUFBaUU7UUFDakUsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQsaUJBQWlCLENBQUksUUFBaUIsRUFBRSxNQUF5QztRQUM3RSxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzdDLENBQUM7K0dBakdRLHlCQUF5QjttSEFBekIseUJBQXlCOzs0RkFBekIseUJBQXlCO2tCQURyQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgTmdab25lIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB0eXBlIHtcbiAgICBGcmFtZXdvcmtPdmVycmlkZXNJbmNvbWluZ1NvdXJjZSxcbiAgICBJRnJhbWV3b3JrRXZlbnRMaXN0ZW5lclNlcnZpY2UsXG4gICAgTG9jYWxFdmVudFNlcnZpY2UsXG59IGZyb20gJ2FnLWdyaWQtY29tbXVuaXR5JztcbmltcG9ydCB7IFZhbmlsbGFGcmFtZXdvcmtPdmVycmlkZXMgfSBmcm9tICdhZy1ncmlkLWNvbW11bml0eSc7XG5cbmltcG9ydCB7IEFuZ3VsYXJGcmFtZXdvcmtFdmVudExpc3RlbmVyU2VydmljZSB9IGZyb20gJy4vYW5ndWxhckZyYW1ld29ya0V2ZW50TGlzdGVuZXJTZXJ2aWNlJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEFuZ3VsYXJGcmFtZXdvcmtPdmVycmlkZXMgZXh0ZW5kcyBWYW5pbGxhRnJhbWV3b3JrT3ZlcnJpZGVzIHtcbiAgICBwdWJsaWMgb3ZlcnJpZGUgcmVhZG9ubHkgYmF0Y2hGcmFtZXdvcmtDb21wczogYm9vbGVhbiA9IHRydWU7XG5cbiAgICAvLyBGbGFnIHVzZWQgdG8gY29udHJvbCBab25lIGJlaGF2aW91ciB3aGVuIHJ1bm5pbmcgdGVzdHMgYXMgbWFueSB0ZXN0IGZlYXR1cmVzIHJlbHkgb24gWm9uZS5cbiAgICBwcml2YXRlIGlzUnVubmluZ1dpdGhpblRlc3Rab25lOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBwcml2YXRlIHJ1bk91dHNpZGU6IDxUPihjYWxsYmFjazogKCkgPT4gVCwgc291cmNlPzogRnJhbWV3b3JrT3ZlcnJpZGVzSW5jb21pbmdTb3VyY2UpID0+IFQ7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9uZ1pvbmU6IE5nWm9uZSkge1xuICAgICAgICBzdXBlcignYW5ndWxhcicpO1xuXG4gICAgICAgIHRoaXMuaXNSdW5uaW5nV2l0aGluVGVzdFpvbmUgPVxuICAgICAgICAgICAgKHdpbmRvdyBhcyBhbnkpPy5BR19HUklEX1VOREVSX1RFU1QgPz8gISEod2luZG93IGFzIGFueSk/LlpvbmU/LkFzeW5jVGVzdFpvbmVTcGVjO1xuXG4gICAgICAgIGlmICghdGhpcy5fbmdab25lKSB7XG4gICAgICAgICAgICB0aGlzLnJ1bk91dHNpZGUgPSAoY2FsbGJhY2spID0+IGNhbGxiYWNrKCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc1J1bm5pbmdXaXRoaW5UZXN0Wm9uZSkge1xuICAgICAgICAgICAgdGhpcy5ydW5PdXRzaWRlID0gKGNhbGxiYWNrLCBzb3VyY2UpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoc291cmNlID09PSAncmVzaXplLW9ic2VydmVyJyB8fCBzb3VyY2UgPT09ICdwb3B1cFBvc2l0aW9uaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAvLyBlbnN1cmUgcmVzaXplIG9ic2VydmVyIGNhbGxiYWNrcyBhcmUgcnVuIG91dHNpZGUgb2YgQW5ndWxhciBldmVuIHVuZGVyIHRlc3QgZHVlIHRvIEplc3Qgbm90IHN1cHBvcnRpbmcgUmVzaXplT2JzZXJ2ZXJcbiAgICAgICAgICAgICAgICAgICAgLy8gd2hpY2ggbWVhbnMgaXQganVzdCBsb29wcyBjb250aW51b3VzbHkgd2l0aCBhIHNldFRpbWVvdXQgd2l0aCBubyB3YXkgdG8gZmx1c2ggdGhlIHF1ZXVlIG9yIGhhdmUgZml4dHVyZS53aGVuU3RhYmxlKCkgcmVzb2x2ZS5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcihjYWxsYmFjayk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIFdoZW4gdW5kZXIgdGVzdCBydW4gaW5zaWRlIEFuZ3VsYXIgc28gdGhhdCB0ZXN0cyBjYW4gdXNlIGZpeHR1cmUud2hlblN0YWJsZSgpIHRvIHdhaXQgZm9yIGFzeW5jIG9wZXJhdGlvbnMgdG8gY29tcGxldGUuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5ydW5PdXRzaWRlID0gKGNhbGxiYWNrKSA9PiB0aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoY2FsbGJhY2spO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gTWFrZSBhbGwgZXZlbnRzIHJ1biBvdXRzaWRlIEFuZ3VsYXIgYXMgdGhleSBvZnRlbiB0cmlnZ2VyIHRoZSBzZXR1cCBvZiBldmVudCBsaXN0ZW5lcnNcbiAgICAvLyBCeSBoYXZpbmcgdGhlIGV2ZW50IGxpc3RlbmVycyBvdXRzaWRlIEFuZ3VsYXIgd2UgY2FuIGF2b2lkIHRyaWdnZXJpbmcgY2hhbmdlIGRldGVjdGlvblxuICAgIC8vIFRoaXMgYWxzbyBtZWFucyB0aGF0IGlmIGEgdXNlciBjYWxscyBhbiBBRyBHcmlkIEFQSSBtZXRob2QgZnJvbSB3aXRoaW4gdGhlaXIgY29tcG9uZW50XG4gICAgLy8gdGhlIGludGVybmFsIHNpZGUgZWZmZWN0cyB3aWxsIG5vdCB0cmlnZ2VyIGNoYW5nZSBkZXRlY3Rpb24uIFdpdGhvdXQgdGhpcyB0aGUgZXZlbnRzIHdvdWxkXG4gICAgLy8gcnVuIGluc2lkZSBBbmd1bGFyIGFuZCB0cmlnZ2VyIGNoYW5nZSBkZXRlY3Rpb24gYXMgdGhlIHNvdXJjZSBvZiB0aGUgZXZlbnQgd2FzIHdpdGhpbiB0aGUgYW5ndWxhciB6b25lLlxuICAgIG92ZXJyaWRlIHdyYXBJbmNvbWluZzogPFQ+KGNhbGxiYWNrOiAoKSA9PiBULCBzb3VyY2U/OiBGcmFtZXdvcmtPdmVycmlkZXNJbmNvbWluZ1NvdXJjZSkgPT4gVCA9IChcbiAgICAgICAgY2FsbGJhY2ssXG4gICAgICAgIHNvdXJjZVxuICAgICkgPT4gdGhpcy5ydW5PdXRzaWRlKGNhbGxiYWNrLCBzb3VyY2UpO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHNob3VsZFdyYXBPdXRnb2luZyBwcm9wZXJ0eSBpcyB1c2VkIHRvIGRldGVybWluZSBpZiBldmVudHMgc2hvdWxkIGJlIHJ1biBvdXRzaWRlIG9mIEFuZ3VsYXIgb3Igbm90LlxuICAgICAqIElmIGFuIGV2ZW50IGhhbmRsZXIgaXMgcmVnaXN0ZXJlZCBvdXRzaWRlIG9mIEFuZ3VsYXIgdGhlbiB3ZSBzaG91bGQgbm90IHdyYXAgdGhlIGV2ZW50IGhhbmRsZXJcbiAgICAgKiB3aXRoIHJ1bkluc2lkZUFuZ3VsYXIoKSBhcyB0aGUgdXNlciBtYXkgbm90IGhhdmUgd2FudGVkIHRoaXMuXG4gICAgICogVGhpcyBpcyBhbHNvIHVzZWQgdG8gbm90IHdyYXAgaW50ZXJuYWwgZXZlbnQgbGlzdGVuZXJzIHRoYXQgYXJlIHJlZ2lzdGVyZWQgd2l0aCBSb3dOb2RlcyBhbmQgQ29sdW1ucy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHNob3VsZFdyYXBPdXRnb2luZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX25nWm9uZSAmJiBOZ1pvbmUuaXNJbkFuZ3VsYXJab25lKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWFrZSBzdXJlIHRoYXQgYW55IGNvZGUgdGhhdCBpcyBleGVjdXRlZCBvdXRzaWRlIG9mIEFHIEdyaWQgaXMgcnVubmluZyB3aXRoaW4gdGhlIEFuZ3VsYXIgem9uZS5cbiAgICAgKiBUaGlzIG1lYW5zIHVzZXJzIGNhbiB1cGRhdGUgdGVtcGxhdGVzIGFuZCB1c2UgYmluZGluZyB3aXRob3V0IGhhdmluZyB0byBkbyBhbnl0aGluZyBleHRyYS5cbiAgICAgKi9cbiAgICBvdmVycmlkZSB3cmFwT3V0Z29pbmc6IDxUPihjYWxsYmFjazogKCkgPT4gVCkgPT4gVCA9IChjYWxsYmFjaykgPT4gdGhpcy5ydW5JbnNpZGVBbmd1bGFyKGNhbGxiYWNrKTtcblxuICAgIHB1YmxpYyBjcmVhdGVMb2NhbEV2ZW50TGlzdGVuZXJXcmFwcGVyKFxuICAgICAgICBleGlzdGluZ0ZyYW1ld29ya0V2ZW50TGlzdGVuZXJTZXJ2aWNlOiBJRnJhbWV3b3JrRXZlbnRMaXN0ZW5lclNlcnZpY2U8YW55LCBhbnk+IHwgdW5kZWZpbmVkLFxuICAgICAgICBsb2NhbEV2ZW50U2VydmljZTogTG9jYWxFdmVudFNlcnZpY2U8YW55PlxuICAgICk6IElGcmFtZXdvcmtFdmVudExpc3RlbmVyU2VydmljZTxhbnksIGFueT4gfCB1bmRlZmluZWQge1xuICAgICAgICBpZiAodGhpcy5zaG91bGRXcmFwT3V0Z29pbmcpIHtcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgZXhpc3RpbmdGcmFtZXdvcmtFdmVudExpc3RlbmVyU2VydmljZSA/P1xuICAgICAgICAgICAgICAgICgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxvY2FsRXZlbnRTZXJ2aWNlLnNldEZyYW1ld29ya092ZXJyaWRlcyh0aGlzKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBbmd1bGFyRnJhbWV3b3JrRXZlbnRMaXN0ZW5lclNlcnZpY2UodGhpcyk7XG4gICAgICAgICAgICAgICAgfSkoKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcHVibGljIGNyZWF0ZUdsb2JhbEV2ZW50TGlzdGVuZXJXcmFwcGVyKCk6IElGcmFtZXdvcmtFdmVudExpc3RlbmVyU2VydmljZTxhbnksIGFueT4ge1xuICAgICAgICByZXR1cm4gbmV3IEFuZ3VsYXJGcmFtZXdvcmtFdmVudExpc3RlbmVyU2VydmljZSh0aGlzKTtcbiAgICB9XG5cbiAgICBvdmVycmlkZSBpc0ZyYW1ld29ya0NvbXBvbmVudChjb21wOiBhbnkpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKCFjb21wKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcHJvdG90eXBlID0gY29tcC5wcm90b3R5cGU7XG4gICAgICAgIHJldHVybiBwcm90b3R5cGUgJiYgJ2FnSW5pdCcgaW4gcHJvdG90eXBlO1xuICAgIH1cblxuICAgIHJ1bkluc2lkZUFuZ3VsYXI8VD4oY2FsbGJhY2s6ICgpID0+IFQpOiBUIHtcbiAgICAgICAgaWYgKCF0aGlzLl9uZ1pvbmUgfHwgTmdab25lLmlzSW5Bbmd1bGFyWm9uZSgpKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIGZvciBfbmdab25lIGV4aXN0ZW5jZSBhcyBpdCBpcyBub3QgcHJlc2VudCB3aGVuIFpvbmVsZXNzXG4gICAgICAgIHJldHVybiB0aGlzLl9uZ1pvbmUucnVuKGNhbGxiYWNrKTtcbiAgICB9XG5cbiAgICBydW5PdXRzaWRlQW5ndWxhcjxUPihjYWxsYmFjazogKCkgPT4gVCwgc291cmNlPzogRnJhbWV3b3JrT3ZlcnJpZGVzSW5jb21pbmdTb3VyY2UpOiBUIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucnVuT3V0c2lkZShjYWxsYmFjaywgc291cmNlKTtcbiAgICB9XG59XG4iXX0=