UNPKG

angular-slickgrid

Version:

Slickgrid components made available in Angular

88 lines 14.5 kB
import { Injectable, ViewContainerRef } from '@angular/core'; import * as i0 from "@angular/core"; export class AngularUtilService { vcr; constructor(vcr) { this.vcr = vcr; } createInteractiveAngularComponent(component, targetElement, data, createCompOptions) { // Create a component reference from the component const componentRef = this.vcr.createComponent(component, createCompOptions); // user could provide data to assign to the component instance if (componentRef?.instance && data) { Object.assign(componentRef.instance, data); } // Get DOM element from component let domElem = null; const viewRef = componentRef.hostView; if (viewRef && Array.isArray(viewRef.rootNodes) && viewRef.rootNodes[0]) { domElem = viewRef.rootNodes[0]; // when user provides the DOM element target, we will move the dynamic component into that target (aka portal-ing it) if (targetElement && domElem) { targetElement.replaceChildren(componentRef.location.nativeElement); } } return { componentRef, domElement: domElem }; } /** * Dynamically create an Angular component, user could also provide optional arguments for target, data & createComponent options * @param {Component} component * @param {HTMLElement} [targetElement] * @param {*} [data] * @param {CreateComponentOption} [createCompOptions] * @returns */ createAngularComponent(component, targetElement, data, createCompOptions) { // Create a component reference from the component const componentRef = this.vcr.createComponent(component, createCompOptions); // user could provide data to assign to the component instance if (componentRef?.instance && data) { Object.assign(componentRef.instance, data); // NOTE: detectChanges() MUST be done BEFORE returning the DOM element in the next step, // because if we do it only after returning the rootNodes (domElement) then it won't have the instance data yet // and we would have to wait an extra cycle to see the result, this basically helps with Example22 componentRef.changeDetectorRef.detectChanges(); } // Get DOM element from component let domElem = null; const viewRef = componentRef.hostView; // get DOM element from the new dynamic Component, make sure this is read after any data and detectChanges() if (viewRef && Array.isArray(viewRef.rootNodes) && viewRef.rootNodes[0]) { domElem = viewRef.rootNodes[0]; // when user provides the DOM element target, we will read the new Component html and use it to replace the target html if (targetElement && domElem) { targetElement.innerHTML = typeof createCompOptions?.sanitizer === 'function' ? createCompOptions.sanitizer(domElem.innerHTML || '') : domElem.innerHTML; } } return { componentRef, domElement: domElem }; } /** * Dynamically create an Angular component and append it to the DOM unless a target element is provided, * user could also provide other optional arguments for data & createComponent options. * @param {Component} component * @param {HTMLElement} [targetElement] * @param {*} [data] * @param {CreateComponentOption} [createCompOptions] * @returns */ createAngularComponentAppendToDom(component, targetElement, data, createCompOptions) { const componentOutput = this.createAngularComponent(component, targetElement, data, createCompOptions); // Append DOM element to the HTML element specified if (targetElement?.replaceChildren) { targetElement.replaceChildren(componentOutput.domElement); } else { document.body.appendChild(componentOutput.domElement); // when no target provided, we'll simply add it to the HTML Body } return componentOutput; } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AngularUtilService, deps: [{ token: i0.ViewContainerRef }], target: i0.ɵɵFactoryTarget.Injectable }); static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AngularUtilService }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AngularUtilService, decorators: [{ type: Injectable }], ctorParameters: () => [{ type: i0.ViewContainerRef }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhclV0aWwuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvbW9kdWxlcy9hbmd1bGFyLXNsaWNrZ3JpZC9zZXJ2aWNlcy9hbmd1bGFyVXRpbC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBZTdELE1BQU0sT0FBTyxrQkFBa0I7SUFDVDtJQUFwQixZQUFvQixHQUFxQjtRQUFyQixRQUFHLEdBQUgsR0FBRyxDQUFrQjtJQUFHLENBQUM7SUFFN0MsaUNBQWlDLENBQy9CLFNBQWtCLEVBQ2xCLGFBQXNCLEVBQ3RCLElBQVUsRUFDVixpQkFBeUM7UUFFekMsa0RBQWtEO1FBQ2xELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLFNBQVMsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1FBRTVFLDhEQUE4RDtRQUM5RCxJQUFJLFlBQVksRUFBRSxRQUFRLElBQUksSUFBSSxFQUFFLENBQUM7WUFDbkMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsUUFBZSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3BELENBQUM7UUFFRCxpQ0FBaUM7UUFDakMsSUFBSSxPQUFPLEdBQXVCLElBQUksQ0FBQztRQUN2QyxNQUFNLE9BQU8sR0FBRyxZQUFZLENBQUMsUUFBZ0MsQ0FBQztRQUU5RCxJQUFJLE9BQU8sSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDeEUsT0FBTyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFnQixDQUFDO1lBRTlDLHFIQUFxSDtZQUNySCxJQUFJLGFBQWEsSUFBSSxPQUFPLEVBQUUsQ0FBQztnQkFDN0IsYUFBYSxDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ3JFLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsT0FBc0IsRUFBRSxDQUFDO0lBQzlELENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsc0JBQXNCLENBQ3BCLFNBQWtCLEVBQ2xCLGFBQXVCLEVBQ3ZCLElBQVUsRUFDVixpQkFBeUM7UUFFekMsa0RBQWtEO1FBQ2xELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLFNBQVMsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1FBRTVFLDhEQUE4RDtRQUM5RCxJQUFJLFlBQVksRUFBRSxRQUFRLElBQUksSUFBSSxFQUFFLENBQUM7WUFDbkMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsUUFBZSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBRWxELHdGQUF3RjtZQUN4RiwrR0FBK0c7WUFDL0csa0dBQWtHO1lBQ2xHLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNqRCxDQUFDO1FBRUQsaUNBQWlDO1FBQ2pDLElBQUksT0FBTyxHQUF1QixJQUFJLENBQUM7UUFDdkMsTUFBTSxPQUFPLEdBQUcsWUFBWSxDQUFDLFFBQWdDLENBQUM7UUFFOUQsNEdBQTRHO1FBQzVHLElBQUksT0FBTyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUN4RSxPQUFPLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQWdCLENBQUM7WUFFOUMsdUhBQXVIO1lBQ3ZILElBQUksYUFBYSxJQUFJLE9BQU8sRUFBRSxDQUFDO2dCQUM3QixhQUFhLENBQUMsU0FBUztvQkFDckIsT0FBTyxpQkFBaUIsRUFBRSxTQUFTLEtBQUssVUFBVTt3QkFDaEQsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsU0FBUyxJQUFJLEVBQUUsQ0FBQzt3QkFDdEQsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUM7WUFDMUIsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxPQUFzQixFQUFFLENBQUM7SUFDOUQsQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ0gsaUNBQWlDLENBQy9CLFNBQWtCLEVBQ2xCLGFBQXVCLEVBQ3ZCLElBQVUsRUFDVixpQkFBeUM7UUFFekMsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFNBQVMsRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFLGlCQUFpQixDQUFDLENBQUM7UUFFdkcsbURBQW1EO1FBQ25ELElBQUksYUFBYSxFQUFFLGVBQWUsRUFBRSxDQUFDO1lBQ25DLGFBQWEsQ0FBQyxlQUFlLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzVELENBQUM7YUFBTSxDQUFDO1lBQ04sUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsZ0VBQWdFO1FBQ3pILENBQUM7UUFFRCxPQUFPLGVBQWUsQ0FBQztJQUN6QixDQUFDO3dHQXpHVSxrQkFBa0I7NEdBQWxCLGtCQUFrQjs7NEZBQWxCLGtCQUFrQjtrQkFEOUIsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIFZpZXdDb250YWluZXJSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB0eXBlIHsgRW1iZWRkZWRWaWV3UmVmLCBFbnZpcm9ubWVudEluamVjdG9yLCBJbmplY3RvciwgTmdNb2R1bGVSZWYsIFR5cGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHR5cGUgeyBBbmd1bGFyQ29tcG9uZW50T3V0cHV0IH0gZnJvbSAnLi4vbW9kZWxzL2FuZ3VsYXJDb21wb25lbnRPdXRwdXQuaW50ZXJmYWNlJztcblxuaW50ZXJmYWNlIENyZWF0ZUNvbXBvbmVudE9wdGlvbiB7XG4gIGluZGV4PzogbnVtYmVyO1xuICBpbmplY3Rvcj86IEluamVjdG9yO1xuICBuZ01vZHVsZVJlZj86IE5nTW9kdWxlUmVmPHVua25vd24+O1xuICBlbnZpcm9ubWVudEluamVjdG9yPzogRW52aXJvbm1lbnRJbmplY3RvciB8IE5nTW9kdWxlUmVmPHVua25vd24+O1xuICBwcm9qZWN0YWJsZU5vZGVzPzogTm9kZVtdW107XG4gIHNhbml0aXplcj86IChkaXJ0eUh0bWw6IHN0cmluZykgPT4gc3RyaW5nO1xufVxuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQW5ndWxhclV0aWxTZXJ2aWNlIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSB2Y3I6IFZpZXdDb250YWluZXJSZWYpIHt9XG5cbiAgY3JlYXRlSW50ZXJhY3RpdmVBbmd1bGFyQ29tcG9uZW50PEM+KFxuICAgIGNvbXBvbmVudDogVHlwZTxDPixcbiAgICB0YXJnZXRFbGVtZW50OiBFbGVtZW50LFxuICAgIGRhdGE/OiBhbnksXG4gICAgY3JlYXRlQ29tcE9wdGlvbnM/OiBDcmVhdGVDb21wb25lbnRPcHRpb25cbiAgKTogQW5ndWxhckNvbXBvbmVudE91dHB1dCB7XG4gICAgLy8gQ3JlYXRlIGEgY29tcG9uZW50IHJlZmVyZW5jZSBmcm9tIHRoZSBjb21wb25lbnRcbiAgICBjb25zdCBjb21wb25lbnRSZWYgPSB0aGlzLnZjci5jcmVhdGVDb21wb25lbnQoY29tcG9uZW50LCBjcmVhdGVDb21wT3B0aW9ucyk7XG5cbiAgICAvLyB1c2VyIGNvdWxkIHByb3ZpZGUgZGF0YSB0byBhc3NpZ24gdG8gdGhlIGNvbXBvbmVudCBpbnN0YW5jZVxuICAgIGlmIChjb21wb25lbnRSZWY/Lmluc3RhbmNlICYmIGRhdGEpIHtcbiAgICAgIE9iamVjdC5hc3NpZ24oY29tcG9uZW50UmVmLmluc3RhbmNlIGFzIGFueSwgZGF0YSk7XG4gICAgfVxuXG4gICAgLy8gR2V0IERPTSBlbGVtZW50IGZyb20gY29tcG9uZW50XG4gICAgbGV0IGRvbUVsZW06IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gICAgY29uc3Qgdmlld1JlZiA9IGNvbXBvbmVudFJlZi5ob3N0VmlldyBhcyBFbWJlZGRlZFZpZXdSZWY8YW55PjtcblxuICAgIGlmICh2aWV3UmVmICYmIEFycmF5LmlzQXJyYXkodmlld1JlZi5yb290Tm9kZXMpICYmIHZpZXdSZWYucm9vdE5vZGVzWzBdKSB7XG4gICAgICBkb21FbGVtID0gdmlld1JlZi5yb290Tm9kZXNbMF0gYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICAgIC8vIHdoZW4gdXNlciBwcm92aWRlcyB0aGUgRE9NIGVsZW1lbnQgdGFyZ2V0LCB3ZSB3aWxsIG1vdmUgdGhlIGR5bmFtaWMgY29tcG9uZW50IGludG8gdGhhdCB0YXJnZXQgKGFrYSBwb3J0YWwtaW5nIGl0KVxuICAgICAgaWYgKHRhcmdldEVsZW1lbnQgJiYgZG9tRWxlbSkge1xuICAgICAgICB0YXJnZXRFbGVtZW50LnJlcGxhY2VDaGlsZHJlbihjb21wb25lbnRSZWYubG9jYXRpb24ubmF0aXZlRWxlbWVudCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY29tcG9uZW50UmVmLCBkb21FbGVtZW50OiBkb21FbGVtIGFzIEhUTUxFbGVtZW50IH07XG4gIH1cblxuICAvKipcbiAgICogRHluYW1pY2FsbHkgY3JlYXRlIGFuIEFuZ3VsYXIgY29tcG9uZW50LCB1c2VyIGNvdWxkIGFsc28gcHJvdmlkZSBvcHRpb25hbCBhcmd1bWVudHMgZm9yIHRhcmdldCwgZGF0YSAmIGNyZWF0ZUNvbXBvbmVudCBvcHRpb25zXG4gICAqIEBwYXJhbSB7Q29tcG9uZW50fSBjb21wb25lbnRcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gW3RhcmdldEVsZW1lbnRdXG4gICAqIEBwYXJhbSB7Kn0gW2RhdGFdXG4gICAqIEBwYXJhbSB7Q3JlYXRlQ29tcG9uZW50T3B0aW9ufSBbY3JlYXRlQ29tcE9wdGlvbnNdXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBjcmVhdGVBbmd1bGFyQ29tcG9uZW50PEM+KFxuICAgIGNvbXBvbmVudDogVHlwZTxDPixcbiAgICB0YXJnZXRFbGVtZW50PzogRWxlbWVudCxcbiAgICBkYXRhPzogYW55LFxuICAgIGNyZWF0ZUNvbXBPcHRpb25zPzogQ3JlYXRlQ29tcG9uZW50T3B0aW9uXG4gICk6IEFuZ3VsYXJDb21wb25lbnRPdXRwdXQge1xuICAgIC8vIENyZWF0ZSBhIGNvbXBvbmVudCByZWZlcmVuY2UgZnJvbSB0aGUgY29tcG9uZW50XG4gICAgY29uc3QgY29tcG9uZW50UmVmID0gdGhpcy52Y3IuY3JlYXRlQ29tcG9uZW50KGNvbXBvbmVudCwgY3JlYXRlQ29tcE9wdGlvbnMpO1xuXG4gICAgLy8gdXNlciBjb3VsZCBwcm92aWRlIGRhdGEgdG8gYXNzaWduIHRvIHRoZSBjb21wb25lbnQgaW5zdGFuY2VcbiAgICBpZiAoY29tcG9uZW50UmVmPy5pbnN0YW5jZSAmJiBkYXRhKSB7XG4gICAgICBPYmplY3QuYXNzaWduKGNvbXBvbmVudFJlZi5pbnN0YW5jZSBhcyBhbnksIGRhdGEpO1xuXG4gICAgICAvLyBOT1RFOiBkZXRlY3RDaGFuZ2VzKCkgTVVTVCBiZSBkb25lIEJFRk9SRSByZXR1cm5pbmcgdGhlIERPTSBlbGVtZW50IGluIHRoZSBuZXh0IHN0ZXAsXG4gICAgICAvLyBiZWNhdXNlIGlmIHdlIGRvIGl0IG9ubHkgYWZ0ZXIgcmV0dXJuaW5nIHRoZSByb290Tm9kZXMgKGRvbUVsZW1lbnQpIHRoZW4gaXQgd29uJ3QgaGF2ZSB0aGUgaW5zdGFuY2UgZGF0YSB5ZXRcbiAgICAgIC8vIGFuZCB3ZSB3b3VsZCBoYXZlIHRvIHdhaXQgYW4gZXh0cmEgY3ljbGUgdG8gc2VlIHRoZSByZXN1bHQsIHRoaXMgYmFzaWNhbGx5IGhlbHBzIHdpdGggRXhhbXBsZTIyXG4gICAgICBjb21wb25lbnRSZWYuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cblxuICAgIC8vIEdldCBET00gZWxlbWVudCBmcm9tIGNvbXBvbmVudFxuICAgIGxldCBkb21FbGVtOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICAgIGNvbnN0IHZpZXdSZWYgPSBjb21wb25lbnRSZWYuaG9zdFZpZXcgYXMgRW1iZWRkZWRWaWV3UmVmPGFueT47XG5cbiAgICAvLyBnZXQgRE9NIGVsZW1lbnQgZnJvbSB0aGUgbmV3IGR5bmFtaWMgQ29tcG9uZW50LCBtYWtlIHN1cmUgdGhpcyBpcyByZWFkIGFmdGVyIGFueSBkYXRhIGFuZCBkZXRlY3RDaGFuZ2VzKClcbiAgICBpZiAodmlld1JlZiAmJiBBcnJheS5pc0FycmF5KHZpZXdSZWYucm9vdE5vZGVzKSAmJiB2aWV3UmVmLnJvb3ROb2Rlc1swXSkge1xuICAgICAgZG9tRWxlbSA9IHZpZXdSZWYucm9vdE5vZGVzWzBdIGFzIEhUTUxFbGVtZW50O1xuXG4gICAgICAvLyB3aGVuIHVzZXIgcHJvdmlkZXMgdGhlIERPTSBlbGVtZW50IHRhcmdldCwgd2Ugd2lsbCByZWFkIHRoZSBuZXcgQ29tcG9uZW50IGh0bWwgYW5kIHVzZSBpdCB0byByZXBsYWNlIHRoZSB0YXJnZXQgaHRtbFxuICAgICAgaWYgKHRhcmdldEVsZW1lbnQgJiYgZG9tRWxlbSkge1xuICAgICAgICB0YXJnZXRFbGVtZW50LmlubmVySFRNTCA9XG4gICAgICAgICAgdHlwZW9mIGNyZWF0ZUNvbXBPcHRpb25zPy5zYW5pdGl6ZXIgPT09ICdmdW5jdGlvbidcbiAgICAgICAgICAgID8gY3JlYXRlQ29tcE9wdGlvbnMuc2FuaXRpemVyKGRvbUVsZW0uaW5uZXJIVE1MIHx8ICcnKVxuICAgICAgICAgICAgOiBkb21FbGVtLmlubmVySFRNTDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4geyBjb21wb25lbnRSZWYsIGRvbUVsZW1lbnQ6IGRvbUVsZW0gYXMgSFRNTEVsZW1lbnQgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEeW5hbWljYWxseSBjcmVhdGUgYW4gQW5ndWxhciBjb21wb25lbnQgYW5kIGFwcGVuZCBpdCB0byB0aGUgRE9NIHVubGVzcyBhIHRhcmdldCBlbGVtZW50IGlzIHByb3ZpZGVkLFxuICAgKiB1c2VyIGNvdWxkIGFsc28gcHJvdmlkZSBvdGhlciBvcHRpb25hbCBhcmd1bWVudHMgZm9yIGRhdGEgJiBjcmVhdGVDb21wb25lbnQgb3B0aW9ucy5cbiAgICogQHBhcmFtIHtDb21wb25lbnR9IGNvbXBvbmVudFxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBbdGFyZ2V0RWxlbWVudF1cbiAgICogQHBhcmFtIHsqfSBbZGF0YV1cbiAgICogQHBhcmFtIHtDcmVhdGVDb21wb25lbnRPcHRpb259IFtjcmVhdGVDb21wT3B0aW9uc11cbiAgICogQHJldHVybnNcbiAgICovXG4gIGNyZWF0ZUFuZ3VsYXJDb21wb25lbnRBcHBlbmRUb0RvbTxDPihcbiAgICBjb21wb25lbnQ6IFR5cGU8Qz4sXG4gICAgdGFyZ2V0RWxlbWVudD86IEVsZW1lbnQsXG4gICAgZGF0YT86IGFueSxcbiAgICBjcmVhdGVDb21wT3B0aW9ucz86IENyZWF0ZUNvbXBvbmVudE9wdGlvblxuICApOiBBbmd1bGFyQ29tcG9uZW50T3V0cHV0IHtcbiAgICBjb25zdCBjb21wb25lbnRPdXRwdXQgPSB0aGlzLmNyZWF0ZUFuZ3VsYXJDb21wb25lbnQoY29tcG9uZW50LCB0YXJnZXRFbGVtZW50LCBkYXRhLCBjcmVhdGVDb21wT3B0aW9ucyk7XG5cbiAgICAvLyBBcHBlbmQgRE9NIGVsZW1lbnQgdG8gdGhlIEhUTUwgZWxlbWVudCBzcGVjaWZpZWRcbiAgICBpZiAodGFyZ2V0RWxlbWVudD8ucmVwbGFjZUNoaWxkcmVuKSB7XG4gICAgICB0YXJnZXRFbGVtZW50LnJlcGxhY2VDaGlsZHJlbihjb21wb25lbnRPdXRwdXQuZG9tRWxlbWVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoY29tcG9uZW50T3V0cHV0LmRvbUVsZW1lbnQpOyAvLyB3aGVuIG5vIHRhcmdldCBwcm92aWRlZCwgd2UnbGwgc2ltcGx5IGFkZCBpdCB0byB0aGUgSFRNTCBCb2R5XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbXBvbmVudE91dHB1dDtcbiAgfVxufVxuIl19