ag-grid-angular
Version:
AG Grid Angular Component
114 lines • 17.9 kB
JavaScript
import { Component, Injectable, ViewContainerRef, inject } from '@angular/core';
import { BaseComponentWrapper, _removeFromParent } from 'ag-grid-community';
import * as i0 from "@angular/core";
// To speed up the removal of custom components we create a number of shards to contain them.
// Removing a single component calls a function within Angular called removeFromArray.
// This is a lot faster if the array is smaller.
export class AgComponentContainer {
constructor() {
this.vcr = inject(ViewContainerRef);
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AgComponentContainer, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: AgComponentContainer, selector: "ag-component-container", ngImport: i0, template: '', isInline: true }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AgComponentContainer, decorators: [{
type: Component,
args: [{
selector: 'ag-component-container',
template: '',
}]
}] });
const NUM_SHARDS = 16;
let shardIdx = 0;
function createComponentContainers(vcr) {
const containerMap = new Map();
for (let i = 0; i < NUM_SHARDS; i++) {
const container = vcr.createComponent(AgComponentContainer);
containerMap.set(i, container);
_removeFromParent(container.location.nativeElement);
}
return containerMap;
}
/**
* These methods are called on a hot path for every row so we do not want to enter / exit NgZone each time.
* Also these methods should not be used to update the UI, so we don't need to run them inside Angular.
*/
const runOutsideMethods = new Set(['doesFilterPass', 'isFilterActive']);
export class AngularFrameworkComponentWrapper extends BaseComponentWrapper {
setViewContainerRef(viewContainerRef, angularFrameworkOverrides) {
this.viewContainerRef = viewContainerRef;
this.angularFrameworkOverrides = angularFrameworkOverrides;
}
createWrapper(OriginalConstructor) {
const angularFrameworkOverrides = this.angularFrameworkOverrides;
const that = this;
that.compShards ??= createComponentContainers(this.viewContainerRef);
class DynamicAgNg2Component extends BaseGuiComponent {
init(params) {
angularFrameworkOverrides.runInsideAngular(() => {
super.init(params);
this._componentRef.changeDetectorRef.detectChanges();
});
}
createComponent() {
return that.createComponent(OriginalConstructor);
}
hasMethod(name) {
return wrapper.getFrameworkComponentInstance()[name] != null;
}
callMethod(name, args) {
const componentRef = this.getFrameworkComponentInstance();
const methodCall = componentRef[name];
if (runOutsideMethods.has(name)) {
return methodCall.apply(componentRef, args);
}
return angularFrameworkOverrides.runInsideAngular(() => methodCall.apply(componentRef, args));
}
addMethod(name, callback) {
wrapper[name] = callback;
}
}
const wrapper = new DynamicAgNg2Component();
return wrapper;
}
createComponent(componentType) {
shardIdx = (shardIdx + 1) % NUM_SHARDS;
const container = this.compShards.get(shardIdx);
return container.instance.vcr.createComponent(componentType);
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AngularFrameworkComponentWrapper, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AngularFrameworkComponentWrapper }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AngularFrameworkComponentWrapper, decorators: [{
type: Injectable
}] });
class BaseGuiComponent {
init(params) {
this._params = params;
this._componentRef = this.createComponent();
this._agAwareComponent = this._componentRef.instance;
this._frameworkComponentInstance = this._componentRef.instance;
this._eGui = this._componentRef.location.nativeElement;
// Angular appends the component to the DOM, so remove it
_removeFromParent(this._eGui);
this._agAwareComponent.agInit(this._params);
}
getGui() {
return this._eGui;
}
/** `getGui()` returns the `ng-component` element. This returns the actual root element. */
getRootElement() {
const firstChild = this._eGui.firstChild;
return firstChild;
}
destroy() {
if (this._frameworkComponentInstance && typeof this._frameworkComponentInstance.destroy === 'function') {
this._frameworkComponentInstance.destroy();
}
this._componentRef?.destroy();
}
getFrameworkComponentInstance() {
return this._frameworkComponentInstance;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhckZyYW1ld29ya0NvbXBvbmVudFdyYXBwZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9hZy1ncmlkLWFuZ3VsYXIvc3JjL2xpYi9hbmd1bGFyRnJhbWV3b3JrQ29tcG9uZW50V3JhcHBlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHaEYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLGlCQUFpQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7O0FBSzVFLDZGQUE2RjtBQUM3RixzRkFBc0Y7QUFDdEYsZ0RBQWdEO0FBS2hELE1BQU0sT0FBTyxvQkFBb0I7SUFKakM7UUFLVyxRQUFHLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7S0FDekM7K0dBRlksb0JBQW9CO21HQUFwQixvQkFBb0IsOERBRm5CLEVBQUU7OzRGQUVILG9CQUFvQjtrQkFKaEMsU0FBUzttQkFBQztvQkFDUCxRQUFRLEVBQUUsd0JBQXdCO29CQUNsQyxRQUFRLEVBQUUsRUFBRTtpQkFDZjs7QUFJRCxNQUFNLFVBQVUsR0FBRyxFQUFFLENBQUM7QUFDdEIsSUFBSSxRQUFRLEdBQUcsQ0FBQyxDQUFDO0FBRWpCLFNBQVMseUJBQXlCLENBQUMsR0FBcUI7SUFDcEQsTUFBTSxZQUFZLEdBQUcsSUFBSSxHQUFHLEVBQThDLENBQUM7SUFDM0UsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFVBQVUsRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUNqQyxNQUFNLFNBQVMsR0FBRyxHQUFHLENBQUMsZUFBZSxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDNUQsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDL0IsaUJBQWlCLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsQ0FBQztLQUN2RDtJQUNELE9BQU8sWUFBWSxDQUFDO0FBQ3hCLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLGlCQUFpQixHQUFHLElBQUksR0FBRyxDQUFnQixDQUFDLGdCQUFnQixFQUFFLGdCQUFnQixDQUFDLENBQUMsQ0FBQztBQUd2RixNQUFNLE9BQU8sZ0NBQ1QsU0FBUSxvQkFBd0M7SUFPekMsbUJBQW1CLENBQ3RCLGdCQUFrQyxFQUNsQyx5QkFBb0Q7UUFFcEQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLGdCQUFnQixDQUFDO1FBQ3pDLElBQUksQ0FBQyx5QkFBeUIsR0FBRyx5QkFBeUIsQ0FBQztJQUMvRCxDQUFDO0lBRVMsYUFBYSxDQUFDLG1CQUFvQztRQUN4RCxNQUFNLHlCQUF5QixHQUFHLElBQUksQ0FBQyx5QkFBeUIsQ0FBQztRQUNqRSxNQUFNLElBQUksR0FBRyxJQUFJLENBQUM7UUFDbEIsSUFBSSxDQUFDLFVBQVUsS0FBSyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUVyRSxNQUFNLHFCQUNGLFNBQVEsZ0JBQWdEO1lBRy9DLElBQUksQ0FBQyxNQUFXO2dCQUNyQix5QkFBeUIsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUU7b0JBQzVDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7b0JBQ25CLElBQUksQ0FBQyxhQUFhLENBQUMsaUJBQWlCLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBQ3pELENBQUMsQ0FBQyxDQUFDO1lBQ1AsQ0FBQztZQUVTLGVBQWU7Z0JBQ3JCLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1lBQ3JELENBQUM7WUFFRCxTQUFTLENBQUMsSUFBWTtnQkFDbEIsT0FBTyxPQUFPLENBQUMsNkJBQTZCLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUM7WUFDakUsQ0FBQztZQUVELFVBQVUsQ0FBQyxJQUFZLEVBQUUsSUFBZ0I7Z0JBQ3JDLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyw2QkFBNkIsRUFBRSxDQUFDO2dCQUMxRCxNQUFNLFVBQVUsR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBRXRDLElBQUksaUJBQWlCLENBQUMsR0FBRyxDQUFDLElBQVcsQ0FBQyxFQUFFO29CQUNwQyxPQUFPLFVBQVUsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxDQUFDO2lCQUMvQztnQkFDRCxPQUFPLHlCQUF5QixDQUFDLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDbEcsQ0FBQztZQUVELFNBQVMsQ0FBQyxJQUFZLEVBQUUsUUFBaUM7Z0JBQ3BELE9BQWUsQ0FBQyxJQUFJLENBQUMsR0FBRyxRQUFRLENBQUM7WUFDdEMsQ0FBQztTQUNKO1FBQ0QsTUFBTSxPQUFPLEdBQUcsSUFBSSxxQkFBcUIsRUFBRSxDQUFDO1FBQzVDLE9BQU8sT0FBTyxDQUFDO0lBQ25CLENBQUM7SUFFTSxlQUFlLENBQUksYUFBMEM7UUFDaEUsUUFBUSxHQUFHLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQztRQUN2QyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUUsQ0FBQztRQUNqRCxPQUFPLFNBQVMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUNqRSxDQUFDOytHQTlEUSxnQ0FBZ0M7bUhBQWhDLGdDQUFnQzs7NEZBQWhDLGdDQUFnQztrQkFENUMsVUFBVTs7QUFrRVgsTUFBZSxnQkFBZ0I7SUFPakIsSUFBSSxDQUFDLE1BQVM7UUFDcEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7UUFFdEIsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDNUMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDO1FBQ3JELElBQUksQ0FBQywyQkFBMkIsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQztRQUMvRCxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQztRQUN2RCx5REFBeUQ7UUFDekQsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRTlCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFFTSxNQUFNO1FBQ1QsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3RCLENBQUM7SUFFRCwyRkFBMkY7SUFDcEYsY0FBYztRQUNqQixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQztRQUN6QyxPQUFPLFVBQXlCLENBQUM7SUFDckMsQ0FBQztJQUVNLE9BQU87UUFDVixJQUFJLElBQUksQ0FBQywyQkFBMkIsSUFBSSxPQUFPLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxPQUFPLEtBQUssVUFBVSxFQUFFO1lBQ3BHLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxPQUFPLEVBQUUsQ0FBQztTQUM5QztRQUNELElBQUksQ0FBQyxhQUFhLEVBQUUsT0FBTyxFQUFFLENBQUM7SUFDbEMsQ0FBQztJQUVNLDZCQUE2QjtRQUNoQyxPQUFPLElBQUksQ0FBQywyQkFBMkIsQ0FBQztJQUM1QyxDQUFDO0NBR0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IENvbXBvbmVudFJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBJbmplY3RhYmxlLCBWaWV3Q29udGFpbmVyUmVmLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHR5cGUgeyBGcmFtZXdvcmtDb21wb25lbnRXcmFwcGVyLCBJRmlsdGVyLCBXcmFwcGFibGVJbnRlcmZhY2UgfSBmcm9tICdhZy1ncmlkLWNvbW11bml0eSc7XG5pbXBvcnQgeyBCYXNlQ29tcG9uZW50V3JhcHBlciwgX3JlbW92ZUZyb21QYXJlbnQgfSBmcm9tICdhZy1ncmlkLWNvbW11bml0eSc7XG5cbmltcG9ydCB0eXBlIHsgQW5ndWxhckZyYW1ld29ya092ZXJyaWRlcyB9IGZyb20gJy4vYW5ndWxhckZyYW1ld29ya092ZXJyaWRlcyc7XG5pbXBvcnQgdHlwZSB7IEFnRnJhbWV3b3JrQ29tcG9uZW50IH0gZnJvbSAnLi9pbnRlcmZhY2VzJztcblxuLy8gVG8gc3BlZWQgdXAgdGhlIHJlbW92YWwgb2YgY3VzdG9tIGNvbXBvbmVudHMgd2UgY3JlYXRlIGEgbnVtYmVyIG9mIHNoYXJkcyB0byBjb250YWluIHRoZW0uXG4vLyBSZW1vdmluZyBhIHNpbmdsZSBjb21wb25lbnQgY2FsbHMgYSBmdW5jdGlvbiB3aXRoaW4gQW5ndWxhciBjYWxsZWQgcmVtb3ZlRnJvbUFycmF5LlxuLy8gVGhpcyBpcyBhIGxvdCBmYXN0ZXIgaWYgdGhlIGFycmF5IGlzIHNtYWxsZXIuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2FnLWNvbXBvbmVudC1jb250YWluZXInLFxuICAgIHRlbXBsYXRlOiAnJyxcbn0pXG5leHBvcnQgY2xhc3MgQWdDb21wb25lbnRDb250YWluZXIge1xuICAgIHB1YmxpYyB2Y3IgPSBpbmplY3QoVmlld0NvbnRhaW5lclJlZik7XG59XG5jb25zdCBOVU1fU0hBUkRTID0gMTY7XG5sZXQgc2hhcmRJZHggPSAwO1xuXG5mdW5jdGlvbiBjcmVhdGVDb21wb25lbnRDb250YWluZXJzKHZjcjogVmlld0NvbnRhaW5lclJlZik6IE1hcDxudW1iZXIsIENvbXBvbmVudFJlZjxBZ0NvbXBvbmVudENvbnRhaW5lcj4+IHtcbiAgICBjb25zdCBjb250YWluZXJNYXAgPSBuZXcgTWFwPG51bWJlciwgQ29tcG9uZW50UmVmPEFnQ29tcG9uZW50Q29udGFpbmVyPj4oKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IE5VTV9TSEFSRFM7IGkrKykge1xuICAgICAgICBjb25zdCBjb250YWluZXIgPSB2Y3IuY3JlYXRlQ29tcG9uZW50KEFnQ29tcG9uZW50Q29udGFpbmVyKTtcbiAgICAgICAgY29udGFpbmVyTWFwLnNldChpLCBjb250YWluZXIpO1xuICAgICAgICBfcmVtb3ZlRnJvbVBhcmVudChjb250YWluZXIubG9jYXRpb24ubmF0aXZlRWxlbWVudCk7XG4gICAgfVxuICAgIHJldHVybiBjb250YWluZXJNYXA7XG59XG5cbi8qKlxuICogVGhlc2UgbWV0aG9kcyBhcmUgY2FsbGVkIG9uIGEgaG90IHBhdGggZm9yIGV2ZXJ5IHJvdyBzbyB3ZSBkbyBub3Qgd2FudCB0byBlbnRlciAvIGV4aXQgTmdab25lIGVhY2ggdGltZS5cbiAqIEFsc28gdGhlc2UgbWV0aG9kcyBzaG91bGQgbm90IGJlIHVzZWQgdG8gdXBkYXRlIHRoZSBVSSwgc28gd2UgZG9uJ3QgbmVlZCB0byBydW4gdGhlbSBpbnNpZGUgQW5ndWxhci5cbiAqL1xuY29uc3QgcnVuT3V0c2lkZU1ldGhvZHMgPSBuZXcgU2V0PGtleW9mIElGaWx0ZXI+KFsnZG9lc0ZpbHRlclBhc3MnLCAnaXNGaWx0ZXJBY3RpdmUnXSk7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBBbmd1bGFyRnJhbWV3b3JrQ29tcG9uZW50V3JhcHBlclxuICAgIGV4dGVuZHMgQmFzZUNvbXBvbmVudFdyYXBwZXI8V3JhcHBhYmxlSW50ZXJmYWNlPlxuICAgIGltcGxlbWVudHMgRnJhbWV3b3JrQ29tcG9uZW50V3JhcHBlclxue1xuICAgIHByaXZhdGUgdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZjtcbiAgICBwcml2YXRlIGFuZ3VsYXJGcmFtZXdvcmtPdmVycmlkZXM6IEFuZ3VsYXJGcmFtZXdvcmtPdmVycmlkZXM7XG4gICAgcHJpdmF0ZSBjb21wU2hhcmRzOiBNYXA8bnVtYmVyLCBDb21wb25lbnRSZWY8QWdDb21wb25lbnRDb250YWluZXI+PjtcblxuICAgIHB1YmxpYyBzZXRWaWV3Q29udGFpbmVyUmVmKFxuICAgICAgICB2aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmLFxuICAgICAgICBhbmd1bGFyRnJhbWV3b3JrT3ZlcnJpZGVzOiBBbmd1bGFyRnJhbWV3b3JrT3ZlcnJpZGVzXG4gICAgKSB7XG4gICAgICAgIHRoaXMudmlld0NvbnRhaW5lclJlZiA9IHZpZXdDb250YWluZXJSZWY7XG4gICAgICAgIHRoaXMuYW5ndWxhckZyYW1ld29ya092ZXJyaWRlcyA9IGFuZ3VsYXJGcmFtZXdvcmtPdmVycmlkZXM7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGNyZWF0ZVdyYXBwZXIoT3JpZ2luYWxDb25zdHJ1Y3RvcjogeyBuZXcgKCk6IGFueSB9KTogV3JhcHBhYmxlSW50ZXJmYWNlIHtcbiAgICAgICAgY29uc3QgYW5ndWxhckZyYW1ld29ya092ZXJyaWRlcyA9IHRoaXMuYW5ndWxhckZyYW1ld29ya092ZXJyaWRlcztcbiAgICAgICAgY29uc3QgdGhhdCA9IHRoaXM7XG4gICAgICAgIHRoYXQuY29tcFNoYXJkcyA/Pz0gY3JlYXRlQ29tcG9uZW50Q29udGFpbmVycyh0aGlzLnZpZXdDb250YWluZXJSZWYpO1xuXG4gICAgICAgIGNsYXNzIER5bmFtaWNBZ05nMkNvbXBvbmVudFxuICAgICAgICAgICAgZXh0ZW5kcyBCYXNlR3VpQ29tcG9uZW50PGFueSwgQWdGcmFtZXdvcmtDb21wb25lbnQ8YW55Pj5cbiAgICAgICAgICAgIGltcGxlbWVudHMgV3JhcHBhYmxlSW50ZXJmYWNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIG92ZXJyaWRlIGluaXQocGFyYW1zOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgICAgICAgICBhbmd1bGFyRnJhbWV3b3JrT3ZlcnJpZGVzLnJ1bkluc2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBzdXBlci5pbml0KHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NvbXBvbmVudFJlZi5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHByb3RlY3RlZCBjcmVhdGVDb21wb25lbnQoKTogQ29tcG9uZW50UmVmPEFnRnJhbWV3b3JrQ29tcG9uZW50PGFueT4+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhhdC5jcmVhdGVDb21wb25lbnQoT3JpZ2luYWxDb25zdHJ1Y3Rvcik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGhhc01ldGhvZChuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gd3JhcHBlci5nZXRGcmFtZXdvcmtDb21wb25lbnRJbnN0YW5jZSgpW25hbWVdICE9IG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNhbGxNZXRob2QobmFtZTogc3RyaW5nLCBhcmdzOiBJQXJndW1lbnRzKTogdm9pZCB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29tcG9uZW50UmVmID0gdGhpcy5nZXRGcmFtZXdvcmtDb21wb25lbnRJbnN0YW5jZSgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG1ldGhvZENhbGwgPSBjb21wb25lbnRSZWZbbmFtZV07XG5cbiAgICAgICAgICAgICAgICBpZiAocnVuT3V0c2lkZU1ldGhvZHMuaGFzKG5hbWUgYXMgYW55KSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWV0aG9kQ2FsbC5hcHBseShjb21wb25lbnRSZWYsIGFyZ3MpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gYW5ndWxhckZyYW1ld29ya092ZXJyaWRlcy5ydW5JbnNpZGVBbmd1bGFyKCgpID0+IG1ldGhvZENhbGwuYXBwbHkoY29tcG9uZW50UmVmLCBhcmdzKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGFkZE1ldGhvZChuYW1lOiBzdHJpbmcsIGNhbGxiYWNrOiAoLi4uYXJnczogYW55W10pID0+IGFueSk6IHZvaWQge1xuICAgICAgICAgICAgICAgICh3cmFwcGVyIGFzIGFueSlbbmFtZV0gPSBjYWxsYmFjaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCB3cmFwcGVyID0gbmV3IER5bmFtaWNBZ05nMkNvbXBvbmVudCgpO1xuICAgICAgICByZXR1cm4gd3JhcHBlcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgY3JlYXRlQ29tcG9uZW50PFQ+KGNvbXBvbmVudFR5cGU6IHsgbmV3ICguLi5hcmdzOiBhbnlbXSk6IFQgfSk6IENvbXBvbmVudFJlZjxUPiB7XG4gICAgICAgIHNoYXJkSWR4ID0gKHNoYXJkSWR4ICsgMSkgJSBOVU1fU0hBUkRTO1xuICAgICAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLmNvbXBTaGFyZHMuZ2V0KHNoYXJkSWR4KSE7XG4gICAgICAgIHJldHVybiBjb250YWluZXIuaW5zdGFuY2UudmNyLmNyZWF0ZUNvbXBvbmVudChjb21wb25lbnRUeXBlKTtcbiAgICB9XG59XG5cbmFic3RyYWN0IGNsYXNzIEJhc2VHdWlDb21wb25lbnQ8UCwgVCBleHRlbmRzIEFnRnJhbWV3b3JrQ29tcG9uZW50PFA+PiB7XG4gICAgcHJvdGVjdGVkIF9wYXJhbXM6IFA7XG4gICAgcHJvdGVjdGVkIF9lR3VpOiBIVE1MRWxlbWVudDtcbiAgICBwcm90ZWN0ZWQgX2NvbXBvbmVudFJlZjogQ29tcG9uZW50UmVmPFQ+O1xuICAgIHByb3RlY3RlZCBfYWdBd2FyZUNvbXBvbmVudDogVDtcbiAgICBwcm90ZWN0ZWQgX2ZyYW1ld29ya0NvbXBvbmVudEluc3RhbmNlOiBhbnk7IC8vIHRoZSB1c2VycyBjb21wb25lbnQgLSBmb3IgYWNjZXNzaW5nIG1ldGhvZHMgdGhleSBjcmVhdGVcblxuICAgIHByb3RlY3RlZCBpbml0KHBhcmFtczogUCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9wYXJhbXMgPSBwYXJhbXM7XG5cbiAgICAgICAgdGhpcy5fY29tcG9uZW50UmVmID0gdGhpcy5jcmVhdGVDb21wb25lbnQoKTtcbiAgICAgICAgdGhpcy5fYWdBd2FyZUNvbXBvbmVudCA9IHRoaXMuX2NvbXBvbmVudFJlZi5pbnN0YW5jZTtcbiAgICAgICAgdGhpcy5fZnJhbWV3b3JrQ29tcG9uZW50SW5zdGFuY2UgPSB0aGlzLl9jb21wb25lbnRSZWYuaW5zdGFuY2U7XG4gICAgICAgIHRoaXMuX2VHdWkgPSB0aGlzLl9jb21wb25lbnRSZWYubG9jYXRpb24ubmF0aXZlRWxlbWVudDtcbiAgICAgICAgLy8gQW5ndWxhciBhcHBlbmRzIHRoZSBjb21wb25lbnQgdG8gdGhlIERPTSwgc28gcmVtb3ZlIGl0XG4gICAgICAgIF9yZW1vdmVGcm9tUGFyZW50KHRoaXMuX2VHdWkpO1xuXG4gICAgICAgIHRoaXMuX2FnQXdhcmVDb21wb25lbnQuYWdJbml0KHRoaXMuX3BhcmFtcyk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEd1aSgpOiBIVE1MRWxlbWVudCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9lR3VpO1xuICAgIH1cblxuICAgIC8qKiBgZ2V0R3VpKClgIHJldHVybnMgdGhlIGBuZy1jb21wb25lbnRgIGVsZW1lbnQuIFRoaXMgcmV0dXJucyB0aGUgYWN0dWFsIHJvb3QgZWxlbWVudC4gKi9cbiAgICBwdWJsaWMgZ2V0Um9vdEVsZW1lbnQoKTogSFRNTEVsZW1lbnQge1xuICAgICAgICBjb25zdCBmaXJzdENoaWxkID0gdGhpcy5fZUd1aS5maXJzdENoaWxkO1xuICAgICAgICByZXR1cm4gZmlyc3RDaGlsZCBhcyBIVE1MRWxlbWVudDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuX2ZyYW1ld29ya0NvbXBvbmVudEluc3RhbmNlICYmIHR5cGVvZiB0aGlzLl9mcmFtZXdvcmtDb21wb25lbnRJbnN0YW5jZS5kZXN0cm95ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aGlzLl9mcmFtZXdvcmtDb21wb25lbnRJbnN0YW5jZS5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fY29tcG9uZW50UmVmPy5kZXN0cm95KCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEZyYW1ld29ya0NvbXBvbmVudEluc3RhbmNlKCk6IGFueSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9mcmFtZXdvcmtDb21wb25lbnRJbnN0YW5jZTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgY3JlYXRlQ29tcG9uZW50KCk6IENvbXBvbmVudFJlZjxUPjtcbn1cbiJdfQ==