UNPKG

angular-google-charts

Version:

A wrapper for the Google Charts library written with Angular

108 lines 16.8 kB
import { ChangeDetectionStrategy, Component, ElementRef, EventEmitter, Input, Output } from '@angular/core'; import { ReplaySubject } from 'rxjs'; import { ScriptLoaderService } from '../../services/script-loader.service'; import * as i0 from "@angular/core"; import * as i1 from "../../services/script-loader.service"; export class ChartWrapperComponent { constructor(element, scriptLoaderService) { this.element = element; this.scriptLoaderService = scriptLoaderService; this.error = new EventEmitter(); this.ready = new EventEmitter(); this.select = new EventEmitter(); this.wrapperReadySubject = new ReplaySubject(1); this.initialized = false; } get chart() { return this.chartWrapper.getChart(); } get wrapperReady$() { return this.wrapperReadySubject.asObservable(); } get chartWrapper() { if (!this.wrapper) { throw new Error('Cannot access the chart wrapper before initialization.'); } return this.wrapper; } set chartWrapper(wrapper) { this.wrapper = wrapper; this.drawChart(); } ngOnInit() { // We don't need to load any chart packages, the chart wrapper will handle this else for us this.scriptLoaderService.loadChartPackages().subscribe(() => { if (!this.specs) { this.specs = {}; } const { containerId, container, ...specs } = this.specs; // Only ever create the wrapper once to allow animations to happen if something changes. this.wrapper = new google.visualization.ChartWrapper({ ...specs, container: this.element.nativeElement }); this.registerChartEvents(); this.wrapperReadySubject.next(this.wrapper); this.drawChart(); this.initialized = true; }); } ngOnChanges(changes) { if (!this.initialized) { return; } if (changes.specs) { this.updateChart(); this.drawChart(); } } updateChart() { if (!this.specs) { // When creating the wrapper with empty specs, the google charts library will show an error // If we don't do this, a javascript error will be thrown, which is not as visible to the user this.specs = {}; } // The typing here are not correct. These methods accept `undefined` as well. // That's why we have to cast to `any` this.wrapper.setChartType(this.specs.chartType); this.wrapper.setDataTable(this.specs.dataTable); this.wrapper.setDataSourceUrl(this.specs.dataSourceUrl); this.wrapper.setDataSourceUrl(this.specs.dataSourceUrl); this.wrapper.setQuery(this.specs.query); this.wrapper.setOptions(this.specs.options); this.wrapper.setRefreshInterval(this.specs.refreshInterval); this.wrapper.setView(this.specs.view); } drawChart() { if (this.wrapper) { this.wrapper.draw(); } } registerChartEvents() { google.visualization.events.removeAllListeners(this.wrapper); const registerChartEvent = (object, eventName, callback) => { google.visualization.events.addListener(object, eventName, callback); }; registerChartEvent(this.wrapper, 'ready', () => this.ready.emit({ chart: this.chart })); registerChartEvent(this.wrapper, 'error', (error) => this.error.emit(error)); registerChartEvent(this.wrapper, 'select', () => { const selection = this.chart.getSelection(); this.select.emit({ selection }); }); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ChartWrapperComponent, deps: [{ token: i0.ElementRef }, { token: i1.ScriptLoaderService }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: ChartWrapperComponent, selector: "chart-wrapper", inputs: { specs: "specs" }, outputs: { error: "error", ready: "ready", select: "select" }, host: { classAttribute: "chart-wrapper" }, exportAs: ["chartWrapper"], usesOnChanges: true, ngImport: i0, template: '', isInline: true, styles: [":host{width:-moz-fit-content;width:fit-content;display:block}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ChartWrapperComponent, decorators: [{ type: Component, args: [{ selector: 'chart-wrapper', template: '', host: { class: 'chart-wrapper' }, exportAs: 'chartWrapper', changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{width:-moz-fit-content;width:fit-content;display:block}\n"] }] }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1.ScriptLoaderService }]; }, propDecorators: { specs: [{ type: Input }], error: [{ type: Output }], ready: [{ type: Output }], select: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcnQtd3JhcHBlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWdvb2dsZS1jaGFydHMvc3JjL2xpYi9jb21wb25lbnRzL2NoYXJ0LXdyYXBwZXIvY2hhcnQtd3JhcHBlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxFQUVQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFckMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7OztBQVkzRSxNQUFNLE9BQU8scUJBQXFCO0lBeUJoQyxZQUFvQixPQUFtQixFQUFVLG1CQUF3QztRQUFyRSxZQUFPLEdBQVAsT0FBTyxDQUFZO1FBQVUsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFxQjtRQVpsRixVQUFLLEdBQUcsSUFBSSxZQUFZLEVBQW1CLENBQUM7UUFHNUMsVUFBSyxHQUFHLElBQUksWUFBWSxFQUFtQixDQUFDO1FBRzVDLFdBQU0sR0FBRyxJQUFJLFlBQVksRUFBOEIsQ0FBQztRQUd2RCx3QkFBbUIsR0FBRyxJQUFJLGFBQWEsQ0FBb0MsQ0FBQyxDQUFDLENBQUM7UUFDOUUsZ0JBQVcsR0FBRyxLQUFLLENBQUM7SUFFZ0UsQ0FBQztJQUU3RixJQUFXLEtBQUs7UUFDZCxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDdEMsQ0FBQztJQUVELElBQVcsYUFBYTtRQUN0QixPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUNqRCxDQUFDO0lBRUQsSUFBVyxZQUFZO1FBQ3JCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsd0RBQXdELENBQUMsQ0FBQztTQUMzRTtRQUVELE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN0QixDQUFDO0lBRUQsSUFBVyxZQUFZLENBQUMsT0FBMEM7UUFDaEUsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDdkIsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ25CLENBQUM7SUFFTSxRQUFRO1FBQ2IsMkZBQTJGO1FBQzNGLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDMUQsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUU7Z0JBQ2YsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFxQyxDQUFDO2FBQ3BEO1lBRUQsTUFBTSxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsR0FBRyxLQUFLLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1lBRXhELHdGQUF3RjtZQUN4RixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksTUFBTSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUM7Z0JBQ25ELEdBQUcsS0FBSztnQkFDUixTQUFTLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhO2FBQ3RDLENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBRTNCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBRTVDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNqQixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztRQUMxQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTSxXQUFXLENBQUMsT0FBc0I7UUFDdkMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDckIsT0FBTztTQUNSO1FBRUQsSUFBSSxPQUFPLENBQUMsS0FBSyxFQUFFO1lBQ2pCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNuQixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7U0FDbEI7SUFDSCxDQUFDO0lBRU8sV0FBVztRQUNqQixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNmLDJGQUEyRjtZQUMzRiw4RkFBOEY7WUFDOUYsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFxQyxDQUFDO1NBQ3BEO1FBRUQsNkVBQTZFO1FBQzdFLHNDQUFzQztRQUV0QyxJQUFJLENBQUMsT0FBUSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2pELElBQUksQ0FBQyxPQUFRLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBZ0IsQ0FBQyxDQUFDO1FBQ3hELElBQUksQ0FBQyxPQUFRLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFvQixDQUFDLENBQUM7UUFDaEUsSUFBSSxDQUFDLE9BQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQW9CLENBQUMsQ0FBQztRQUNoRSxJQUFJLENBQUMsT0FBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQVksQ0FBQyxDQUFDO1FBQ2hELElBQUksQ0FBQyxPQUFRLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBYyxDQUFDLENBQUM7UUFDcEQsSUFBSSxDQUFDLE9BQVEsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQXNCLENBQUMsQ0FBQztRQUNwRSxJQUFJLENBQUMsT0FBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFTyxTQUFTO1FBQ2YsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ2hCLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7U0FDckI7SUFDSCxDQUFDO0lBRU8sbUJBQW1CO1FBQ3pCLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUU3RCxNQUFNLGtCQUFrQixHQUFHLENBQUMsTUFBVyxFQUFFLFNBQWlCLEVBQUUsUUFBa0IsRUFBRSxFQUFFO1lBQ2hGLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3ZFLENBQUMsQ0FBQztRQUVGLGtCQUFrQixDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDekYsa0JBQWtCLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsQ0FBQyxLQUFzQixFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQzlGLGtCQUFrQixDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRTtZQUM5QyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBTSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQzdDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztRQUNsQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7K0dBekhVLHFCQUFxQjttR0FBckIscUJBQXFCLDRPQU50QixFQUFFOzs0RkFNRCxxQkFBcUI7a0JBUmpDLFNBQVM7K0JBQ0UsZUFBZSxZQUNmLEVBQUUsUUFFTixFQUFFLEtBQUssRUFBRSxlQUFlLEVBQUUsWUFDdEIsY0FBYyxtQkFDUCx1QkFBdUIsQ0FBQyxNQUFNO21JQVl4QyxLQUFLO3NCQURYLEtBQUs7Z0JBSUMsS0FBSztzQkFEWCxNQUFNO2dCQUlBLEtBQUs7c0JBRFgsTUFBTTtnQkFJQSxNQUFNO3NCQURaLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBTaW1wbGVDaGFuZ2VzXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUmVwbGF5U3ViamVjdCB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBTY3JpcHRMb2FkZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvc2NyaXB0LWxvYWRlci5zZXJ2aWNlJztcbmltcG9ydCB7IENoYXJ0RXJyb3JFdmVudCwgQ2hhcnRSZWFkeUV2ZW50LCBDaGFydFNlbGVjdGlvbkNoYW5nZWRFdmVudCB9IGZyb20gJy4uLy4uL3R5cGVzL2V2ZW50cyc7XG5pbXBvcnQgeyBDaGFydEJhc2UgfSBmcm9tICcuLi9jaGFydC1iYXNlL2NoYXJ0LWJhc2UuY29tcG9uZW50JztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY2hhcnQtd3JhcHBlcicsXG4gIHRlbXBsYXRlOiAnJyxcbiAgc3R5bGVzOiBbJzpob3N0IHsgd2lkdGg6IGZpdC1jb250ZW50OyBkaXNwbGF5OiBibG9jazsgfSddLFxuICBob3N0OiB7IGNsYXNzOiAnY2hhcnQtd3JhcHBlcicgfSxcbiAgZXhwb3J0QXM6ICdjaGFydFdyYXBwZXInLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBDaGFydFdyYXBwZXJDb21wb25lbnQgaW1wbGVtZW50cyBDaGFydEJhc2UsIE9uQ2hhbmdlcywgT25Jbml0IHtcbiAgLyoqXG4gICAqIEVpdGhlciBhIEpTT04gb2JqZWN0IGRlZmluaW5nIHRoZSBjaGFydCwgb3IgYSBzZXJpYWxpemVkIHN0cmluZyB2ZXJzaW9uIG9mIHRoYXQgb2JqZWN0LlxuICAgKiBUaGUgZm9ybWF0IG9mIHRoaXMgb2JqZWN0IGlzIHNob3duIGluIHRoZVxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vY2hhcnQvaW50ZXJhY3RpdmUvZG9jcy9yZWZlcmVuY2UjZ29vZ2xlLnZpc3VhbGl6YXRpb24uZHJhd2NoYXJ0IGBkcmF3Q2hhcnQoKWB9IGRvY3VtZW50YXRpb24uXG4gICAqXG4gICAqIFRoZSBgY29udGFpbmVyYCBhbmQgYGNvbnRhaW5lcklkYCB3aWxsIGJlIG92ZXJ3cml0dGVuIGJ5IHRoaXMgY29tcG9uZW50IHRvIGFsbG93XG4gICAqIHJlbmRlcmluZyB0aGUgY2hhcnQgaW50byB0aGUgY29tcG9uZW50cycgdGVtcGxhdGUuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc3BlY3M/OiBnb29nbGUudmlzdWFsaXphdGlvbi5DaGFydFNwZWNzO1xuXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgZXJyb3IgPSBuZXcgRXZlbnRFbWl0dGVyPENoYXJ0RXJyb3JFdmVudD4oKTtcblxuICBAT3V0cHV0KClcbiAgcHVibGljIHJlYWR5ID0gbmV3IEV2ZW50RW1pdHRlcjxDaGFydFJlYWR5RXZlbnQ+KCk7XG5cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBzZWxlY3QgPSBuZXcgRXZlbnRFbWl0dGVyPENoYXJ0U2VsZWN0aW9uQ2hhbmdlZEV2ZW50PigpO1xuXG4gIHByaXZhdGUgd3JhcHBlcjogZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ2hhcnRXcmFwcGVyIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHdyYXBwZXJSZWFkeVN1YmplY3QgPSBuZXcgUmVwbGF5U3ViamVjdDxnb29nbGUudmlzdWFsaXphdGlvbi5DaGFydFdyYXBwZXI+KDEpO1xuICBwcml2YXRlIGluaXRpYWxpemVkID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBlbGVtZW50OiBFbGVtZW50UmVmLCBwcml2YXRlIHNjcmlwdExvYWRlclNlcnZpY2U6IFNjcmlwdExvYWRlclNlcnZpY2UpIHt9XG5cbiAgcHVibGljIGdldCBjaGFydCgpOiBnb29nbGUudmlzdWFsaXphdGlvbi5DaGFydEJhc2UgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5jaGFydFdyYXBwZXIuZ2V0Q2hhcnQoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgd3JhcHBlclJlYWR5JCgpIHtcbiAgICByZXR1cm4gdGhpcy53cmFwcGVyUmVhZHlTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgcHVibGljIGdldCBjaGFydFdyYXBwZXIoKTogZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ2hhcnRXcmFwcGVyIHtcbiAgICBpZiAoIXRoaXMud3JhcHBlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgYWNjZXNzIHRoZSBjaGFydCB3cmFwcGVyIGJlZm9yZSBpbml0aWFsaXphdGlvbi4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy53cmFwcGVyO1xuICB9XG5cbiAgcHVibGljIHNldCBjaGFydFdyYXBwZXIod3JhcHBlcjogZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ2hhcnRXcmFwcGVyKSB7XG4gICAgdGhpcy53cmFwcGVyID0gd3JhcHBlcjtcbiAgICB0aGlzLmRyYXdDaGFydCgpO1xuICB9XG5cbiAgcHVibGljIG5nT25Jbml0KCkge1xuICAgIC8vIFdlIGRvbid0IG5lZWQgdG8gbG9hZCBhbnkgY2hhcnQgcGFja2FnZXMsIHRoZSBjaGFydCB3cmFwcGVyIHdpbGwgaGFuZGxlIHRoaXMgZWxzZSBmb3IgdXNcbiAgICB0aGlzLnNjcmlwdExvYWRlclNlcnZpY2UubG9hZENoYXJ0UGFja2FnZXMoKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLnNwZWNzKSB7XG4gICAgICAgIHRoaXMuc3BlY3MgPSB7fSBhcyBnb29nbGUudmlzdWFsaXphdGlvbi5DaGFydFNwZWNzO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB7IGNvbnRhaW5lcklkLCBjb250YWluZXIsIC4uLnNwZWNzIH0gPSB0aGlzLnNwZWNzO1xuXG4gICAgICAvLyBPbmx5IGV2ZXIgY3JlYXRlIHRoZSB3cmFwcGVyIG9uY2UgdG8gYWxsb3cgYW5pbWF0aW9ucyB0byBoYXBwZW4gaWYgc29tZXRoaW5nIGNoYW5nZXMuXG4gICAgICB0aGlzLndyYXBwZXIgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ2hhcnRXcmFwcGVyKHtcbiAgICAgICAgLi4uc3BlY3MsXG4gICAgICAgIGNvbnRhaW5lcjogdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnRcbiAgICAgIH0pO1xuICAgICAgdGhpcy5yZWdpc3RlckNoYXJ0RXZlbnRzKCk7XG5cbiAgICAgIHRoaXMud3JhcHBlclJlYWR5U3ViamVjdC5uZXh0KHRoaXMud3JhcHBlcik7XG5cbiAgICAgIHRoaXMuZHJhd0NoYXJ0KCk7XG4gICAgICB0aGlzLmluaXRpYWxpemVkID0gdHJ1ZTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgaWYgKCF0aGlzLmluaXRpYWxpemVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZXMuc3BlY3MpIHtcbiAgICAgIHRoaXMudXBkYXRlQ2hhcnQoKTtcbiAgICAgIHRoaXMuZHJhd0NoYXJ0KCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVDaGFydCgpIHtcbiAgICBpZiAoIXRoaXMuc3BlY3MpIHtcbiAgICAgIC8vIFdoZW4gY3JlYXRpbmcgdGhlIHdyYXBwZXIgd2l0aCBlbXB0eSBzcGVjcywgdGhlIGdvb2dsZSBjaGFydHMgbGlicmFyeSB3aWxsIHNob3cgYW4gZXJyb3JcbiAgICAgIC8vIElmIHdlIGRvbid0IGRvIHRoaXMsIGEgamF2YXNjcmlwdCBlcnJvciB3aWxsIGJlIHRocm93biwgd2hpY2ggaXMgbm90IGFzIHZpc2libGUgdG8gdGhlIHVzZXJcbiAgICAgIHRoaXMuc3BlY3MgPSB7fSBhcyBnb29nbGUudmlzdWFsaXphdGlvbi5DaGFydFNwZWNzO1xuICAgIH1cblxuICAgIC8vIFRoZSB0eXBpbmcgaGVyZSBhcmUgbm90IGNvcnJlY3QuIFRoZXNlIG1ldGhvZHMgYWNjZXB0IGB1bmRlZmluZWRgIGFzIHdlbGwuXG4gICAgLy8gVGhhdCdzIHdoeSB3ZSBoYXZlIHRvIGNhc3QgdG8gYGFueWBcblxuICAgIHRoaXMud3JhcHBlciEuc2V0Q2hhcnRUeXBlKHRoaXMuc3BlY3MuY2hhcnRUeXBlKTtcbiAgICB0aGlzLndyYXBwZXIhLnNldERhdGFUYWJsZSh0aGlzLnNwZWNzLmRhdGFUYWJsZSBhcyBhbnkpO1xuICAgIHRoaXMud3JhcHBlciEuc2V0RGF0YVNvdXJjZVVybCh0aGlzLnNwZWNzLmRhdGFTb3VyY2VVcmwgYXMgYW55KTtcbiAgICB0aGlzLndyYXBwZXIhLnNldERhdGFTb3VyY2VVcmwodGhpcy5zcGVjcy5kYXRhU291cmNlVXJsIGFzIGFueSk7XG4gICAgdGhpcy53cmFwcGVyIS5zZXRRdWVyeSh0aGlzLnNwZWNzLnF1ZXJ5IGFzIGFueSk7XG4gICAgdGhpcy53cmFwcGVyIS5zZXRPcHRpb25zKHRoaXMuc3BlY3Mub3B0aW9ucyBhcyBhbnkpO1xuICAgIHRoaXMud3JhcHBlciEuc2V0UmVmcmVzaEludGVydmFsKHRoaXMuc3BlY3MucmVmcmVzaEludGVydmFsIGFzIGFueSk7XG4gICAgdGhpcy53cmFwcGVyIS5zZXRWaWV3KHRoaXMuc3BlY3Mudmlldyk7XG4gIH1cblxuICBwcml2YXRlIGRyYXdDaGFydCgpIHtcbiAgICBpZiAodGhpcy53cmFwcGVyKSB7XG4gICAgICB0aGlzLndyYXBwZXIuZHJhdygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVnaXN0ZXJDaGFydEV2ZW50cygpIHtcbiAgICBnb29nbGUudmlzdWFsaXphdGlvbi5ldmVudHMucmVtb3ZlQWxsTGlzdGVuZXJzKHRoaXMud3JhcHBlcik7XG5cbiAgICBjb25zdCByZWdpc3RlckNoYXJ0RXZlbnQgPSAob2JqZWN0OiBhbnksIGV2ZW50TmFtZTogc3RyaW5nLCBjYWxsYmFjazogRnVuY3Rpb24pID0+IHtcbiAgICAgIGdvb2dsZS52aXN1YWxpemF0aW9uLmV2ZW50cy5hZGRMaXN0ZW5lcihvYmplY3QsIGV2ZW50TmFtZSwgY2FsbGJhY2spO1xuICAgIH07XG5cbiAgICByZWdpc3RlckNoYXJ0RXZlbnQodGhpcy53cmFwcGVyLCAncmVhZHknLCAoKSA9PiB0aGlzLnJlYWR5LmVtaXQoeyBjaGFydDogdGhpcy5jaGFydCEgfSkpO1xuICAgIHJlZ2lzdGVyQ2hhcnRFdmVudCh0aGlzLndyYXBwZXIsICdlcnJvcicsIChlcnJvcjogQ2hhcnRFcnJvckV2ZW50KSA9PiB0aGlzLmVycm9yLmVtaXQoZXJyb3IpKTtcbiAgICByZWdpc3RlckNoYXJ0RXZlbnQodGhpcy53cmFwcGVyLCAnc2VsZWN0JywgKCkgPT4ge1xuICAgICAgY29uc3Qgc2VsZWN0aW9uID0gdGhpcy5jaGFydCEuZ2V0U2VsZWN0aW9uKCk7XG4gICAgICB0aGlzLnNlbGVjdC5lbWl0KHsgc2VsZWN0aW9uIH0pO1xuICAgIH0pO1xuICB9XG59XG4iXX0=