UNPKG

@tanstack/angular-table

Version:

Headless UI for building powerful tables & datagrids for Angular.

173 lines 22.6 kB
import { ChangeDetectorRef, inject, Injectable, KeyValueDiffers, OutputEmitterRef, ViewContainerRef, } from '@angular/core'; import * as i0 from "@angular/core"; export class FlexRenderComponentFactory { #viewContainerRef = inject(ViewContainerRef); createComponent(flexRenderComponent, componentInjector) { const componentRef = this.#viewContainerRef.createComponent(flexRenderComponent.component, { injector: componentInjector, }); const view = new FlexRenderComponentRef(componentRef, flexRenderComponent, componentInjector); const { inputs, outputs } = flexRenderComponent; if (inputs) view.setInputs(inputs); if (outputs) view.setOutputs(outputs); return view; } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: FlexRenderComponentFactory, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: FlexRenderComponentFactory }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: FlexRenderComponentFactory, decorators: [{ type: Injectable }] }); export class FlexRenderComponentRef { componentRef; componentInjector; #keyValueDiffersFactory; #componentData; #inputValueDiffer; #outputRegistry; constructor(componentRef, componentData, componentInjector) { this.componentRef = componentRef; this.componentInjector = componentInjector; this.#componentData = componentData; this.#keyValueDiffersFactory = componentInjector.get(KeyValueDiffers); this.#outputRegistry = new FlexRenderComponentOutputManager(this.#keyValueDiffersFactory, this.outputs); this.#inputValueDiffer = this.#keyValueDiffersFactory .find(this.inputs) .create(); this.#inputValueDiffer.diff(this.inputs); this.componentRef.onDestroy(() => this.#outputRegistry.unsubscribeAll()); } get component() { return this.#componentData.component; } get inputs() { return this.#componentData.inputs ?? {}; } get outputs() { return this.#componentData.outputs ?? {}; } /** * Get component input and output diff by the given item */ diff(item) { return { inputDiff: this.#inputValueDiffer.diff(item.inputs ?? {}), outputDiff: this.#outputRegistry.diff(item.outputs ?? {}), }; } /** * * @param compare Whether the current ref component instance is the same as the given one */ eqType(compare) { return compare.component === this.component; } /** * Tries to update current component refs input by the new given content component. */ update(content) { const eq = this.eqType(content); if (!eq) return; const { inputDiff, outputDiff } = this.diff(content); if (inputDiff) { inputDiff.forEachAddedItem(item => this.setInput(item.key, item.currentValue)); inputDiff.forEachChangedItem(item => this.setInput(item.key, item.currentValue)); inputDiff.forEachRemovedItem(item => this.setInput(item.key, undefined)); } if (outputDiff) { outputDiff.forEachAddedItem(item => { this.setOutput(item.key, item.currentValue); }); outputDiff.forEachChangedItem(item => { if (item.currentValue) { this.#outputRegistry.setListener(item.key, item.currentValue); } else { this.#outputRegistry.unsubscribe(item.key); } }); outputDiff.forEachRemovedItem(item => { this.#outputRegistry.unsubscribe(item.key); }); } this.#componentData = content; } markAsDirty() { this.componentRef.injector.get(ChangeDetectorRef).markForCheck(); } setInputs(inputs) { for (const prop in inputs) { this.setInput(prop, inputs[prop]); } } setInput(key, value) { if (this.#componentData.allowedInputNames.includes(key)) { this.componentRef.setInput(key, value); } } setOutputs(outputs) { this.#outputRegistry.unsubscribeAll(); for (const prop in outputs) { this.setOutput(prop, outputs[prop]); } } setOutput(outputName, emit) { if (!this.#componentData.allowedOutputNames.includes(outputName)) return; if (!emit) { this.#outputRegistry.unsubscribe(outputName); return; } const hasListener = this.#outputRegistry.hasListener(outputName); this.#outputRegistry.setListener(outputName, emit); if (hasListener) { return; } const instance = this.componentRef.instance; const output = instance[outputName]; if (output && output instanceof OutputEmitterRef) { output.subscribe(value => { this.#outputRegistry.getListener(outputName)?.(value); }); } } } class FlexRenderComponentOutputManager { #outputSubscribers = {}; #outputListeners = {}; #valueDiffer; constructor(keyValueDiffers, initialOutputs) { this.#valueDiffer = keyValueDiffers.find(initialOutputs).create(); if (initialOutputs) { this.#valueDiffer.diff(initialOutputs); } } hasListener(outputName) { return outputName in this.#outputListeners; } setListener(outputName, callback) { this.#outputListeners[outputName] = callback; } getListener(outputName) { return this.#outputListeners[outputName]; } unsubscribeAll() { for (const prop in this.#outputSubscribers) { this.unsubscribe(prop); } } unsubscribe(outputName) { if (outputName in this.#outputSubscribers) { this.#outputSubscribers[outputName]?.unsubscribe(); delete this.#outputSubscribers[outputName]; delete this.#outputListeners[outputName]; } } diff(outputs) { return this.#valueDiffer.diff(outputs ?? {}); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmxleC1yZW5kZXItY29tcG9uZW50LXJlZi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9mbGV4LXJlbmRlci9mbGV4LXJlbmRlci1jb21wb25lbnQtcmVmLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxpQkFBaUIsRUFFakIsTUFBTSxFQUNOLFVBQVUsRUFHVixlQUFlLEVBQ2YsZ0JBQWdCLEVBRWhCLGdCQUFnQixHQUNqQixNQUFNLGVBQWUsQ0FBQTs7QUFJdEIsTUFBTSxPQUFPLDBCQUEwQjtJQUNyQyxpQkFBaUIsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQTtJQUU1QyxlQUFlLENBQ2IsbUJBQTJDLEVBQzNDLGlCQUEyQjtRQUUzQixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsZUFBZSxDQUN6RCxtQkFBbUIsQ0FBQyxTQUFTLEVBQzdCO1lBQ0UsUUFBUSxFQUFFLGlCQUFpQjtTQUM1QixDQUNGLENBQUE7UUFDRCxNQUFNLElBQUksR0FBRyxJQUFJLHNCQUFzQixDQUNyQyxZQUFZLEVBQ1osbUJBQW1CLEVBQ25CLGlCQUFpQixDQUNsQixDQUFBO1FBRUQsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxtQkFBbUIsQ0FBQTtRQUUvQyxJQUFJLE1BQU07WUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBQ2xDLElBQUksT0FBTztZQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUE7UUFFckMsT0FBTyxJQUFJLENBQUE7SUFDYixDQUFDO3dHQXpCVSwwQkFBMEI7NEdBQTFCLDBCQUEwQjs7NEZBQTFCLDBCQUEwQjtrQkFEdEMsVUFBVTs7QUE2QlgsTUFBTSxPQUFPLHNCQUFzQjtJQVF0QjtJQUVBO0lBVEYsdUJBQXVCLENBQWlCO0lBQ2pELGNBQWMsQ0FBd0I7SUFDdEMsaUJBQWlCLENBQWlDO0lBRXpDLGVBQWUsQ0FBa0M7SUFFMUQsWUFDVyxZQUE2QixFQUN0QyxhQUFxQyxFQUM1QixpQkFBMkI7UUFGM0IsaUJBQVksR0FBWixZQUFZLENBQWlCO1FBRTdCLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBVTtRQUVwQyxJQUFJLENBQUMsY0FBYyxHQUFHLGFBQWEsQ0FBQTtRQUNuQyxJQUFJLENBQUMsdUJBQXVCLEdBQUcsaUJBQWlCLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFBO1FBRXJFLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxnQ0FBZ0MsQ0FDekQsSUFBSSxDQUFDLHVCQUF1QixFQUM1QixJQUFJLENBQUMsT0FBTyxDQUNiLENBQUE7UUFFRCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLHVCQUF1QjthQUNsRCxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQzthQUNqQixNQUFNLEVBQUUsQ0FBQTtRQUNYLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBRXhDLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQTtJQUMxRSxDQUFDO0lBRUQsSUFBSSxTQUFTO1FBQ1gsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQTtJQUN0QyxDQUFDO0lBRUQsSUFBSSxNQUFNO1FBQ1IsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sSUFBSSxFQUFFLENBQUE7SUFDekMsQ0FBQztJQUVELElBQUksT0FBTztRQUNULE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFBO0lBQzFDLENBQUM7SUFFRDs7T0FFRztJQUNILElBQUksQ0FBQyxJQUE0QjtRQUMvQixPQUFPO1lBQ0wsU0FBUyxFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxFQUFFLENBQUM7WUFDekQsVUFBVSxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDO1NBQzFELENBQUE7SUFDSCxDQUFDO0lBQ0Q7OztPQUdHO0lBQ0gsTUFBTSxDQUFDLE9BQStCO1FBQ3BDLE9BQU8sT0FBTyxDQUFDLFNBQVMsS0FBSyxJQUFJLENBQUMsU0FBUyxDQUFBO0lBQzdDLENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU0sQ0FBQyxPQUErQjtRQUNwQyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQy9CLElBQUksQ0FBQyxFQUFFO1lBQUUsT0FBTTtRQUNmLE1BQU0sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUNwRCxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQ2QsU0FBUyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxFQUFFLENBQ2hDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQzNDLENBQUE7WUFDRCxTQUFTLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FDbEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FDM0MsQ0FBQTtZQUNELFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFBO1FBQzFFLENBQUM7UUFDRCxJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQ2YsVUFBVSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUNqQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFBO1lBQzdDLENBQUMsQ0FBQyxDQUFBO1lBQ0YsVUFBVSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUNuQyxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztvQkFDdEIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUE7Z0JBQy9ELENBQUM7cUJBQU0sQ0FBQztvQkFDTixJQUFJLENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUE7Z0JBQzVDLENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQTtZQUNGLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDbkMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBQzVDLENBQUMsQ0FBQyxDQUFBO1FBQ0osQ0FBQztRQUVELElBQUksQ0FBQyxjQUFjLEdBQUcsT0FBTyxDQUFBO0lBQy9CLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLENBQUMsWUFBWSxFQUFFLENBQUE7SUFDbEUsQ0FBQztJQUVELFNBQVMsQ0FBQyxNQUErQjtRQUN2QyxLQUFLLE1BQU0sSUFBSSxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQzFCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBO1FBQ25DLENBQUM7SUFDSCxDQUFDO0lBRUQsUUFBUSxDQUFDLEdBQVcsRUFBRSxLQUFjO1FBQ2xDLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN4RCxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUE7UUFDeEMsQ0FBQztJQUNILENBQUM7SUFFRCxVQUFVLENBQ1IsT0FHQztRQUVELElBQUksQ0FBQyxlQUFlLENBQUMsY0FBYyxFQUFFLENBQUE7UUFDckMsS0FBSyxNQUFNLElBQUksSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUMzQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtRQUNyQyxDQUFDO0lBQ0gsQ0FBQztJQUVELFNBQVMsQ0FDUCxVQUFrQixFQUNsQixJQUEwRDtRQUUxRCxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDO1lBQUUsT0FBTTtRQUN4RSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDVixJQUFJLENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQTtZQUM1QyxPQUFNO1FBQ1IsQ0FBQztRQUVELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFBO1FBQ2hFLElBQUksQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQTtRQUVsRCxJQUFJLFdBQVcsRUFBRSxDQUFDO1lBQ2hCLE9BQU07UUFDUixDQUFDO1FBRUQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUE7UUFDM0MsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLFVBQW1DLENBQUMsQ0FBQTtRQUM1RCxJQUFJLE1BQU0sSUFBSSxNQUFNLFlBQVksZ0JBQWdCLEVBQUUsQ0FBQztZQUNqRCxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUN2QixJQUFJLENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFBO1lBQ3ZELENBQUMsQ0FBQyxDQUFBO1FBQ0osQ0FBQztJQUNILENBQUM7Q0FDRjtBQUVELE1BQU0sZ0NBQWdDO0lBQzNCLGtCQUFrQixHQUEwQyxFQUFFLENBQUE7SUFDOUQsZ0JBQWdCLEdBQTZDLEVBQUUsQ0FBQTtJQUUvRCxZQUFZLENBR3BCO0lBRUQsWUFBWSxlQUFnQyxFQUFFLGNBQW1CO1FBQy9ELElBQUksQ0FBQyxZQUFZLEdBQUcsZUFBZSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQTtRQUNqRSxJQUFJLGNBQWMsRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFBO1FBQ3hDLENBQUM7SUFDSCxDQUFDO0lBRUQsV0FBVyxDQUFDLFVBQWtCO1FBQzVCLE9BQU8sVUFBVSxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQTtJQUM1QyxDQUFDO0lBRUQsV0FBVyxDQUFDLFVBQWtCLEVBQUUsUUFBa0M7UUFDaEUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxHQUFHLFFBQVEsQ0FBQTtJQUM5QyxDQUFDO0lBRUQsV0FBVyxDQUFDLFVBQWtCO1FBQzVCLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxDQUFBO0lBQzFDLENBQUM7SUFFRCxjQUFjO1FBQ1osS0FBSyxNQUFNLElBQUksSUFBSSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUMzQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQ3hCLENBQUM7SUFDSCxDQUFDO0lBRUQsV0FBVyxDQUFDLFVBQWtCO1FBQzVCLElBQUksVUFBVSxJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQzFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQTtZQUNsRCxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsQ0FBQTtZQUMxQyxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsQ0FBQTtRQUMxQyxDQUFDO0lBQ0gsQ0FBQztJQUVELElBQUksQ0FBQyxPQUFzRTtRQUN6RSxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUMsQ0FBQTtJQUM5QyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50UmVmLFxuICBpbmplY3QsXG4gIEluamVjdGFibGUsXG4gIEluamVjdG9yLFxuICBLZXlWYWx1ZURpZmZlcixcbiAgS2V5VmFsdWVEaWZmZXJzLFxuICBPdXRwdXRFbWl0dGVyUmVmLFxuICBPdXRwdXRSZWZTdWJzY3JpcHRpb24sXG4gIFZpZXdDb250YWluZXJSZWYsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXG5pbXBvcnQgeyBGbGV4UmVuZGVyQ29tcG9uZW50IH0gZnJvbSAnLi9mbGV4LXJlbmRlci1jb21wb25lbnQnXG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBGbGV4UmVuZGVyQ29tcG9uZW50RmFjdG9yeSB7XG4gICN2aWV3Q29udGFpbmVyUmVmID0gaW5qZWN0KFZpZXdDb250YWluZXJSZWYpXG5cbiAgY3JlYXRlQ29tcG9uZW50PFQ+KFxuICAgIGZsZXhSZW5kZXJDb21wb25lbnQ6IEZsZXhSZW5kZXJDb21wb25lbnQ8VD4sXG4gICAgY29tcG9uZW50SW5qZWN0b3I6IEluamVjdG9yXG4gICk6IEZsZXhSZW5kZXJDb21wb25lbnRSZWY8VD4ge1xuICAgIGNvbnN0IGNvbXBvbmVudFJlZiA9IHRoaXMuI3ZpZXdDb250YWluZXJSZWYuY3JlYXRlQ29tcG9uZW50KFxuICAgICAgZmxleFJlbmRlckNvbXBvbmVudC5jb21wb25lbnQsXG4gICAgICB7XG4gICAgICAgIGluamVjdG9yOiBjb21wb25lbnRJbmplY3RvcixcbiAgICAgIH1cbiAgICApXG4gICAgY29uc3QgdmlldyA9IG5ldyBGbGV4UmVuZGVyQ29tcG9uZW50UmVmKFxuICAgICAgY29tcG9uZW50UmVmLFxuICAgICAgZmxleFJlbmRlckNvbXBvbmVudCxcbiAgICAgIGNvbXBvbmVudEluamVjdG9yXG4gICAgKVxuXG4gICAgY29uc3QgeyBpbnB1dHMsIG91dHB1dHMgfSA9IGZsZXhSZW5kZXJDb21wb25lbnRcblxuICAgIGlmIChpbnB1dHMpIHZpZXcuc2V0SW5wdXRzKGlucHV0cylcbiAgICBpZiAob3V0cHV0cykgdmlldy5zZXRPdXRwdXRzKG91dHB1dHMpXG5cbiAgICByZXR1cm4gdmlld1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBGbGV4UmVuZGVyQ29tcG9uZW50UmVmPFQ+IHtcbiAgcmVhZG9ubHkgI2tleVZhbHVlRGlmZmVyc0ZhY3Rvcnk6IEtleVZhbHVlRGlmZmVyc1xuICAjY29tcG9uZW50RGF0YTogRmxleFJlbmRlckNvbXBvbmVudDxUPlxuICAjaW5wdXRWYWx1ZURpZmZlcjogS2V5VmFsdWVEaWZmZXI8c3RyaW5nLCB1bmtub3duPlxuXG4gIHJlYWRvbmx5ICNvdXRwdXRSZWdpc3RyeTogRmxleFJlbmRlckNvbXBvbmVudE91dHB1dE1hbmFnZXJcblxuICBjb25zdHJ1Y3RvcihcbiAgICByZWFkb25seSBjb21wb25lbnRSZWY6IENvbXBvbmVudFJlZjxUPixcbiAgICBjb21wb25lbnREYXRhOiBGbGV4UmVuZGVyQ29tcG9uZW50PFQ+LFxuICAgIHJlYWRvbmx5IGNvbXBvbmVudEluamVjdG9yOiBJbmplY3RvclxuICApIHtcbiAgICB0aGlzLiNjb21wb25lbnREYXRhID0gY29tcG9uZW50RGF0YVxuICAgIHRoaXMuI2tleVZhbHVlRGlmZmVyc0ZhY3RvcnkgPSBjb21wb25lbnRJbmplY3Rvci5nZXQoS2V5VmFsdWVEaWZmZXJzKVxuXG4gICAgdGhpcy4jb3V0cHV0UmVnaXN0cnkgPSBuZXcgRmxleFJlbmRlckNvbXBvbmVudE91dHB1dE1hbmFnZXIoXG4gICAgICB0aGlzLiNrZXlWYWx1ZURpZmZlcnNGYWN0b3J5LFxuICAgICAgdGhpcy5vdXRwdXRzXG4gICAgKVxuXG4gICAgdGhpcy4jaW5wdXRWYWx1ZURpZmZlciA9IHRoaXMuI2tleVZhbHVlRGlmZmVyc0ZhY3RvcnlcbiAgICAgIC5maW5kKHRoaXMuaW5wdXRzKVxuICAgICAgLmNyZWF0ZSgpXG4gICAgdGhpcy4jaW5wdXRWYWx1ZURpZmZlci5kaWZmKHRoaXMuaW5wdXRzKVxuXG4gICAgdGhpcy5jb21wb25lbnRSZWYub25EZXN0cm95KCgpID0+IHRoaXMuI291dHB1dFJlZ2lzdHJ5LnVuc3Vic2NyaWJlQWxsKCkpXG4gIH1cblxuICBnZXQgY29tcG9uZW50KCkge1xuICAgIHJldHVybiB0aGlzLiNjb21wb25lbnREYXRhLmNvbXBvbmVudFxuICB9XG5cbiAgZ2V0IGlucHV0cygpIHtcbiAgICByZXR1cm4gdGhpcy4jY29tcG9uZW50RGF0YS5pbnB1dHMgPz8ge31cbiAgfVxuXG4gIGdldCBvdXRwdXRzKCkge1xuICAgIHJldHVybiB0aGlzLiNjb21wb25lbnREYXRhLm91dHB1dHMgPz8ge31cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY29tcG9uZW50IGlucHV0IGFuZCBvdXRwdXQgZGlmZiBieSB0aGUgZ2l2ZW4gaXRlbVxuICAgKi9cbiAgZGlmZihpdGVtOiBGbGV4UmVuZGVyQ29tcG9uZW50PFQ+KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlucHV0RGlmZjogdGhpcy4jaW5wdXRWYWx1ZURpZmZlci5kaWZmKGl0ZW0uaW5wdXRzID8/IHt9KSxcbiAgICAgIG91dHB1dERpZmY6IHRoaXMuI291dHB1dFJlZ2lzdHJ5LmRpZmYoaXRlbS5vdXRwdXRzID8/IHt9KSxcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBjb21wYXJlIFdoZXRoZXIgdGhlIGN1cnJlbnQgcmVmIGNvbXBvbmVudCBpbnN0YW5jZSBpcyB0aGUgc2FtZSBhcyB0aGUgZ2l2ZW4gb25lXG4gICAqL1xuICBlcVR5cGUoY29tcGFyZTogRmxleFJlbmRlckNvbXBvbmVudDxUPik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBjb21wYXJlLmNvbXBvbmVudCA9PT0gdGhpcy5jb21wb25lbnRcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmllcyB0byB1cGRhdGUgY3VycmVudCBjb21wb25lbnQgcmVmcyBpbnB1dCBieSB0aGUgbmV3IGdpdmVuIGNvbnRlbnQgY29tcG9uZW50LlxuICAgKi9cbiAgdXBkYXRlKGNvbnRlbnQ6IEZsZXhSZW5kZXJDb21wb25lbnQ8VD4pIHtcbiAgICBjb25zdCBlcSA9IHRoaXMuZXFUeXBlKGNvbnRlbnQpXG4gICAgaWYgKCFlcSkgcmV0dXJuXG4gICAgY29uc3QgeyBpbnB1dERpZmYsIG91dHB1dERpZmYgfSA9IHRoaXMuZGlmZihjb250ZW50KVxuICAgIGlmIChpbnB1dERpZmYpIHtcbiAgICAgIGlucHV0RGlmZi5mb3JFYWNoQWRkZWRJdGVtKGl0ZW0gPT5cbiAgICAgICAgdGhpcy5zZXRJbnB1dChpdGVtLmtleSwgaXRlbS5jdXJyZW50VmFsdWUpXG4gICAgICApXG4gICAgICBpbnB1dERpZmYuZm9yRWFjaENoYW5nZWRJdGVtKGl0ZW0gPT5cbiAgICAgICAgdGhpcy5zZXRJbnB1dChpdGVtLmtleSwgaXRlbS5jdXJyZW50VmFsdWUpXG4gICAgICApXG4gICAgICBpbnB1dERpZmYuZm9yRWFjaFJlbW92ZWRJdGVtKGl0ZW0gPT4gdGhpcy5zZXRJbnB1dChpdGVtLmtleSwgdW5kZWZpbmVkKSlcbiAgICB9XG4gICAgaWYgKG91dHB1dERpZmYpIHtcbiAgICAgIG91dHB1dERpZmYuZm9yRWFjaEFkZGVkSXRlbShpdGVtID0+IHtcbiAgICAgICAgdGhpcy5zZXRPdXRwdXQoaXRlbS5rZXksIGl0ZW0uY3VycmVudFZhbHVlKVxuICAgICAgfSlcbiAgICAgIG91dHB1dERpZmYuZm9yRWFjaENoYW5nZWRJdGVtKGl0ZW0gPT4ge1xuICAgICAgICBpZiAoaXRlbS5jdXJyZW50VmFsdWUpIHtcbiAgICAgICAgICB0aGlzLiNvdXRwdXRSZWdpc3RyeS5zZXRMaXN0ZW5lcihpdGVtLmtleSwgaXRlbS5jdXJyZW50VmFsdWUpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy4jb3V0cHV0UmVnaXN0cnkudW5zdWJzY3JpYmUoaXRlbS5rZXkpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICBvdXRwdXREaWZmLmZvckVhY2hSZW1vdmVkSXRlbShpdGVtID0+IHtcbiAgICAgICAgdGhpcy4jb3V0cHV0UmVnaXN0cnkudW5zdWJzY3JpYmUoaXRlbS5rZXkpXG4gICAgICB9KVxuICAgIH1cblxuICAgIHRoaXMuI2NvbXBvbmVudERhdGEgPSBjb250ZW50XG4gIH1cblxuICBtYXJrQXNEaXJ0eSgpOiB2b2lkIHtcbiAgICB0aGlzLmNvbXBvbmVudFJlZi5pbmplY3Rvci5nZXQoQ2hhbmdlRGV0ZWN0b3JSZWYpLm1hcmtGb3JDaGVjaygpXG4gIH1cblxuICBzZXRJbnB1dHMoaW5wdXRzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikge1xuICAgIGZvciAoY29uc3QgcHJvcCBpbiBpbnB1dHMpIHtcbiAgICAgIHRoaXMuc2V0SW5wdXQocHJvcCwgaW5wdXRzW3Byb3BdKVxuICAgIH1cbiAgfVxuXG4gIHNldElucHV0KGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikge1xuICAgIGlmICh0aGlzLiNjb21wb25lbnREYXRhLmFsbG93ZWRJbnB1dE5hbWVzLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgIHRoaXMuY29tcG9uZW50UmVmLnNldElucHV0KGtleSwgdmFsdWUpXG4gICAgfVxuICB9XG5cbiAgc2V0T3V0cHV0cyhcbiAgICBvdXRwdXRzOiBSZWNvcmQ8XG4gICAgICBzdHJpbmcsXG4gICAgICBPdXRwdXRFbWl0dGVyUmVmPHVua25vd24+WydlbWl0J10gfCBudWxsIHwgdW5kZWZpbmVkXG4gICAgPlxuICApIHtcbiAgICB0aGlzLiNvdXRwdXRSZWdpc3RyeS51bnN1YnNjcmliZUFsbCgpXG4gICAgZm9yIChjb25zdCBwcm9wIGluIG91dHB1dHMpIHtcbiAgICAgIHRoaXMuc2V0T3V0cHV0KHByb3AsIG91dHB1dHNbcHJvcF0pXG4gICAgfVxuICB9XG5cbiAgc2V0T3V0cHV0KFxuICAgIG91dHB1dE5hbWU6IHN0cmluZyxcbiAgICBlbWl0OiBPdXRwdXRFbWl0dGVyUmVmPHVua25vd24+WydlbWl0J10gfCB1bmRlZmluZWQgfCBudWxsXG4gICk6IHZvaWQge1xuICAgIGlmICghdGhpcy4jY29tcG9uZW50RGF0YS5hbGxvd2VkT3V0cHV0TmFtZXMuaW5jbHVkZXMob3V0cHV0TmFtZSkpIHJldHVyblxuICAgIGlmICghZW1pdCkge1xuICAgICAgdGhpcy4jb3V0cHV0UmVnaXN0cnkudW5zdWJzY3JpYmUob3V0cHV0TmFtZSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGhhc0xpc3RlbmVyID0gdGhpcy4jb3V0cHV0UmVnaXN0cnkuaGFzTGlzdGVuZXIob3V0cHV0TmFtZSlcbiAgICB0aGlzLiNvdXRwdXRSZWdpc3RyeS5zZXRMaXN0ZW5lcihvdXRwdXROYW1lLCBlbWl0KVxuXG4gICAgaWYgKGhhc0xpc3RlbmVyKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBpbnN0YW5jZSA9IHRoaXMuY29tcG9uZW50UmVmLmluc3RhbmNlXG4gICAgY29uc3Qgb3V0cHV0ID0gaW5zdGFuY2Vbb3V0cHV0TmFtZSBhcyBrZXlvZiB0eXBlb2YgaW5zdGFuY2VdXG4gICAgaWYgKG91dHB1dCAmJiBvdXRwdXQgaW5zdGFuY2VvZiBPdXRwdXRFbWl0dGVyUmVmKSB7XG4gICAgICBvdXRwdXQuc3Vic2NyaWJlKHZhbHVlID0+IHtcbiAgICAgICAgdGhpcy4jb3V0cHV0UmVnaXN0cnkuZ2V0TGlzdGVuZXIob3V0cHV0TmFtZSk/Lih2YWx1ZSlcbiAgICAgIH0pXG4gICAgfVxuICB9XG59XG5cbmNsYXNzIEZsZXhSZW5kZXJDb21wb25lbnRPdXRwdXRNYW5hZ2VyIHtcbiAgcmVhZG9ubHkgI291dHB1dFN1YnNjcmliZXJzOiBSZWNvcmQ8c3RyaW5nLCBPdXRwdXRSZWZTdWJzY3JpcHRpb24+ID0ge31cbiAgcmVhZG9ubHkgI291dHB1dExpc3RlbmVyczogUmVjb3JkPHN0cmluZywgKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkPiA9IHt9XG5cbiAgcmVhZG9ubHkgI3ZhbHVlRGlmZmVyOiBLZXlWYWx1ZURpZmZlcjxcbiAgICBzdHJpbmcsXG4gICAgdW5kZWZpbmVkIHwgbnVsbCB8IE91dHB1dEVtaXR0ZXJSZWY8dW5rbm93bj5bJ2VtaXQnXVxuICA+XG5cbiAgY29uc3RydWN0b3Ioa2V5VmFsdWVEaWZmZXJzOiBLZXlWYWx1ZURpZmZlcnMsIGluaXRpYWxPdXRwdXRzOiBhbnkpIHtcbiAgICB0aGlzLiN2YWx1ZURpZmZlciA9IGtleVZhbHVlRGlmZmVycy5maW5kKGluaXRpYWxPdXRwdXRzKS5jcmVhdGUoKVxuICAgIGlmIChpbml0aWFsT3V0cHV0cykge1xuICAgICAgdGhpcy4jdmFsdWVEaWZmZXIuZGlmZihpbml0aWFsT3V0cHV0cylcbiAgICB9XG4gIH1cblxuICBoYXNMaXN0ZW5lcihvdXRwdXROYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gb3V0cHV0TmFtZSBpbiB0aGlzLiNvdXRwdXRMaXN0ZW5lcnNcbiAgfVxuXG4gIHNldExpc3RlbmVyKG91dHB1dE5hbWU6IHN0cmluZywgY2FsbGJhY2s6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZCkge1xuICAgIHRoaXMuI291dHB1dExpc3RlbmVyc1tvdXRwdXROYW1lXSA9IGNhbGxiYWNrXG4gIH1cblxuICBnZXRMaXN0ZW5lcihvdXRwdXROYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy4jb3V0cHV0TGlzdGVuZXJzW291dHB1dE5hbWVdXG4gIH1cblxuICB1bnN1YnNjcmliZUFsbCgpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IHByb3AgaW4gdGhpcy4jb3V0cHV0U3Vic2NyaWJlcnMpIHtcbiAgICAgIHRoaXMudW5zdWJzY3JpYmUocHJvcClcbiAgICB9XG4gIH1cblxuICB1bnN1YnNjcmliZShvdXRwdXROYW1lOiBzdHJpbmcpIHtcbiAgICBpZiAob3V0cHV0TmFtZSBpbiB0aGlzLiNvdXRwdXRTdWJzY3JpYmVycykge1xuICAgICAgdGhpcy4jb3V0cHV0U3Vic2NyaWJlcnNbb3V0cHV0TmFtZV0/LnVuc3Vic2NyaWJlKClcbiAgICAgIGRlbGV0ZSB0aGlzLiNvdXRwdXRTdWJzY3JpYmVyc1tvdXRwdXROYW1lXVxuICAgICAgZGVsZXRlIHRoaXMuI291dHB1dExpc3RlbmVyc1tvdXRwdXROYW1lXVxuICAgIH1cbiAgfVxuXG4gIGRpZmYob3V0cHV0czogUmVjb3JkPHN0cmluZywgT3V0cHV0RW1pdHRlclJlZjx1bmtub3duPlsnZW1pdCddIHwgdW5kZWZpbmVkPikge1xuICAgIHJldHVybiB0aGlzLiN2YWx1ZURpZmZlci5kaWZmKG91dHB1dHMgPz8ge30pXG4gIH1cbn1cbiJdfQ==