UNPKG

@alauda-fe/common

Version:

Alauda frontend team common codes.

166 lines 22.4 kB
import { ChangeDetectorRef, Directive, Injector, Input, } from '@angular/core'; import { area, curveMonotoneX, line, } from 'd3'; import { cloneDeep } from 'lodash-es'; import { Subject, skip, takeUntil } from 'rxjs'; import { ContextChartService } from '../../chart.service'; import { defined, generateUID } from '../../utils'; import * as i0 from "@angular/core"; export class ChartSeriesComponent { get disabledLegend() { return this.context.disabledLegend; } get hasBar() { return this.seriesType === 'bar'; } constructor(injector) { this.injector = injector; this.x = (d) => d.x; this.y = (d) => d.y; this.type = 'standard'; this.lineWidth = 1.5; this.cdr = this.injector.get(ChangeDetectorRef); this.context = this.injector.get(ContextChartService); this.destroy$$ = new Subject(); this.handleOpacity = (name, activateLegend) => activateLegend ? (activateLegend === name ? 1 : 0.2) : 1; this.handleStrokeWidth = (name, activateLegend, width = 1.5) => activateLegend ? (activateLegend === name ? width + 0.5 : width) : width; } ngOnInit() { this.initSeries(); } initSeries() { this.context.chartData$ .pipe(takeUntil(this.destroy$$)) .subscribe(chartData => { this.context.chartData = chartData; }); this.context.triggerInitData$ .pipe(takeUntil(this.destroy$$)) .subscribe(chartData => { this.context.initContext(); this.handleChatData(chartData); setTimeout(() => { this.handleSeriesData(); }, 300); }); this.context.update$$ .pipe(takeUntil(this.destroy$$)) .pipe(skip(1)) .subscribe(() => { this.handleSeriesData(); }); this.legendActivate(); } legendActivate() { this.context.legendActivate$$ .pipe(takeUntil(this.destroy$$)) .subscribe(legend => { this.activateLegend = legend; this.cdr.detectChanges(); }); } handleChatData(data) { const chartData = data.map((d, index) => { if (this.hasBar) { this.context.xSeriesValue = [ ...new Set([...this.context.xSeriesValue, d.name]), ]; } this.type === 'stacked' && this.context.ySeriesValue.push(d.values.reduce((acc, curr) => { const y = this.y(curr); return y + acc; }, 0)); return { ...d, color: d.color || this.context.getChartDefaultColor(index), values: d.values.map(v => { const x = this.x(v); const y = this.y(v); if (!this.hasBar) { this.context.xSeriesValue = [ ...new Set([...this.context.xSeriesValue, x]), ]; } if (this.type !== 'stacked') { this.context.ySeriesValue.push(y); } return { ...v, x, y }; }), }; }); this.context.setChartData(chartData); } // eslint-disable-next-line sonarjs/cognitive-complexity handleSeriesData() { const seriesData = cloneDeep(this.context.chartData); const sliceValue = 30; const sliceTotal = Math.ceil(seriesData.length / sliceValue); const lineG = ['area', 'line'].includes(this.seriesType) && this.getLineGenerator(); const areaG = this.seriesType === 'area' && this.getAraGenerator(); for (let index = 0; index < sliceTotal; index++) { requestAnimationFrame(() => { [...seriesData].splice(0, sliceValue).forEach((_, i) => { const tIndex = index * sliceValue + i; const d = seriesData[tIndex]; if (d) { d.visibility = this.disabledLegend.has(d.name) ? 'hidden' : ''; if (this.seriesType === 'area') { d.areaPath = areaG(d.values); d.gradientFillId = generateUID(); } if (['area', 'line'].includes(this.seriesType)) { d.path = lineG(d.values); } if (tIndex === seriesData.length - 1) { this.seriesData = seriesData; this.context.seriesData$.next(seriesData); this.cdr.detectChanges(); } } }); }); } } getLineGenerator() { const { x, y } = this.context; return line() .defined(defined) .curve(this.curveType || curveMonotoneX) .x(d => x(d.x)) .y(d => y(d.y) || 0); } getAraGenerator() { const { x, y } = this.context; return area() .defined(defined) .curve((this.curveType || curveMonotoneX)) .x(d => x(d.x)) .y0(y.range()[0]) .y1(d => y(d.y) || 0); } ngOnDestroy() { this.destroy$$.next(); } static { this.ɵfac = function ChartSeriesComponent_Factory(t) { return new (t || ChartSeriesComponent)(i0.ɵɵdirectiveInject(i0.Injector)); }; } static { this.ɵdir = /*@__PURE__*/ i0.ɵɵdefineDirective({ type: ChartSeriesComponent, inputs: { x: "x", y: "y", categories: "categories", unit: "unit", curveType: "curveType", type: "type", lineWidth: "lineWidth", seriesType: "seriesType" } }); } } (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ChartSeriesComponent, [{ type: Directive }], () => [{ type: i0.Injector }], { x: [{ type: Input }], y: [{ type: Input }], categories: [{ type: Input }], unit: [{ type: Input }], curveType: [{ type: Input }], type: [{ type: Input }], lineWidth: [{ type: Input }], seriesType: [{ type: Input }] }); })(); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VyaWVzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29tbW9uL3NyYy9jaGFydC9jb21tb24vc2VyaWVzL3Nlcmllcy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsUUFBUSxFQUNSLEtBQUssR0FHTixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBSUwsSUFBSSxFQUNKLGNBQWMsRUFDZCxJQUFJLEdBQ0wsTUFBTSxJQUFJLENBQUM7QUFDWixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUdoRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUUxRCxPQUFPLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGFBQWEsQ0FBQzs7QUFHbkQsTUFBTSxPQUFnQixvQkFBb0I7SUE4QnhDLElBQUksY0FBYztRQUNoQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDO0lBQ3JDLENBQUM7SUFFRCxJQUFJLE1BQU07UUFDUixPQUFPLElBQUksQ0FBQyxVQUFVLEtBQUssS0FBSyxDQUFDO0lBQ25DLENBQUM7SUFFRCxZQUFzQixRQUFrQjtRQUFsQixhQUFRLEdBQVIsUUFBUSxDQUFVO1FBckMvQixNQUFDLEdBQTJDLENBQUMsQ0FBZ0IsRUFBRSxFQUFFLENBQ3hFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFRyxNQUFDLEdBQTRCLENBQUMsQ0FBZ0IsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQVF2RCxTQUFJLEdBQTJCLFVBQVUsQ0FBQztRQUUxQyxjQUFTLEdBQUcsR0FBRyxDQUFDO1FBSXpCLFFBQUcsR0FB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QVcsQ0FBQyxDQUFDO2FBQ3JELENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDekIsQ0FBQztJQUVELGVBQWU7UUFDYixNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDOUIsT0FBTyxJQUFJLEVBQWlCO2FBQ3pCLE9BQU8sQ0FBQyxPQUFPLENBQUM7YUFDaEIsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxjQUFjLENBQWlCLENBQUM7YUFDekQsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQTZCLENBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBVyxDQUFDLENBQUM7YUFDckQsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNoQixFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQzFCLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN4QixDQUFDO3FGQTVLbUIsb0JBQW9CO29FQUFwQixvQkFBb0I7O2lGQUFwQixvQkFBb0I7Y0FEekMsU0FBUzt5Q0FFQyxDQUFDO2tCQUFULEtBQUs7WUFHRyxDQUFDO2tCQUFULEtBQUs7WUFFRyxVQUFVO2tCQUFsQixLQUFLO1lBRUcsSUFBSTtrQkFBWixLQUFLO1lBRUcsU0FBUztrQkFBakIsS0FBSztZQUVHLElBQUk7a0JBQVosS0FBSztZQUVHLFNBQVM7a0JBQWpCLEtBQUs7WUFFRyxVQUFVO2tCQUFsQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIERpcmVjdGl2ZSxcbiAgSW5qZWN0b3IsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBDdXJ2ZUZhY3RvcnksXG4gIEN1cnZlRmFjdG9yeUxpbmVPbmx5LFxuICBTY2FsZVRpbWUsXG4gIGFyZWEsXG4gIGN1cnZlTW9ub3RvbmVYLFxuICBsaW5lLFxufSBmcm9tICdkMyc7XG5pbXBvcnQgeyBjbG9uZURlZXAgfSBmcm9tICdsb2Rhc2gtZXMnO1xuaW1wb3J0IHsgU3ViamVjdCwgc2tpcCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IENoYXJ0RGF0YSwgQ2hhcnREYXRhSXRlbSB9IGZyb20gJy4uLy4uLy4uL3ZpZXctY2hhcnQvdHlwZXMnO1xuaW1wb3J0IHsgQ29udGV4dENoYXJ0U2VydmljZSB9IGZyb20gJy4uLy4uL2NoYXJ0LnNlcnZpY2UnO1xuaW1wb3J0IHsgU2VyaWVzRGF0YSB9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IGRlZmluZWQsIGdlbmVyYXRlVUlEIH0gZnJvbSAnLi4vLi4vdXRpbHMnO1xuXG5ARGlyZWN0aXZlKClcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBDaGFydFNlcmllc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgQElucHV0KCkgeDogKGQ6IHVua25vd24pID0+IG51bWJlciB8IERhdGUgfCBzdHJpbmcgPSAoZDogQ2hhcnREYXRhSXRlbSkgPT5cbiAgICBkLng7XG5cbiAgQElucHV0KCkgeT86IChkOiB1bmtub3duKSA9PiBudW1iZXIgPSAoZDogQ2hhcnREYXRhSXRlbSkgPT4gZC55O1xuXG4gIEBJbnB1dCgpIGNhdGVnb3JpZXM6IHN0cmluZztcblxuICBASW5wdXQoKSB1bml0OiBzdHJpbmc7XG5cbiAgQElucHV0KCkgY3VydmVUeXBlOiBDdXJ2ZUZhY3RvcnkgfCBDdXJ2ZUZhY3RvcnlMaW5lT25seTtcblxuICBASW5wdXQoKSB0eXBlOiAnc3RhbmRhcmQnIHwgJ3N0YWNrZWQnID0gJ3N0YW5kYXJkJztcblxuICBASW5wdXQoKSBsaW5lV2lkdGggPSAxLjU7XG5cbiAgQElucHV0KCkgc2VyaWVzVHlwZTogJ2xpbmUnIHwgJ2FyZWEnIHwgJ2Jhcic7XG5cbiAgY2RyID0gdGhpcy5pbmplY3Rvci5nZXQoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuXG4gIGNvbnRleHQgPSB0aGlzLmluamVjdG9yLmdldChDb250ZXh0Q2hhcnRTZXJ2aWNlKTtcblxuICByZXN1bHRzOiBDaGFydERhdGE7XG5cbiAgYWN0aXZhdGVMZWdlbmQ6IHN0cmluZztcblxuICBzZXJpZXNEYXRhOiBTZXJpZXNEYXRhW107XG5cbiAgZGVzdHJveSQkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICBnZXQgZGlzYWJsZWRMZWdlbmQoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29udGV4dC5kaXNhYmxlZExlZ2VuZDtcbiAgfVxuXG4gIGdldCBoYXNCYXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2VyaWVzVHlwZSA9PT0gJ2Jhcic7XG4gIH1cblxuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgaW5qZWN0b3I6IEluamVjdG9yKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuaW5pdFNlcmllcygpO1xuICB9XG5cbiAgaW5pdFNlcmllcygpIHtcbiAgICB0aGlzLmNvbnRleHQuY2hhcnREYXRhJFxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQkKSlcbiAgICAgIC5zdWJzY3JpYmUoY2hhcnREYXRhID0+IHtcbiAgICAgICAgdGhpcy5jb250ZXh0LmNoYXJ0RGF0YSA9IGNoYXJ0RGF0YTtcbiAgICAgIH0pO1xuICAgIHRoaXMuY29udGV4dC50cmlnZ2VySW5pdERhdGEkXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCQpKVxuICAgICAgLnN1YnNjcmliZShjaGFydERhdGEgPT4ge1xuICAgICAgICB0aGlzLmNvbnRleHQuaW5pdENvbnRleHQoKTtcbiAgICAgICAgdGhpcy5oYW5kbGVDaGF0RGF0YShjaGFydERhdGEpO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLmhhbmRsZVNlcmllc0RhdGEoKTtcbiAgICAgICAgfSwgMzAwKTtcbiAgICAgIH0pO1xuICAgIHRoaXMuY29udGV4dC51cGRhdGUkJFxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQkKSlcbiAgICAgIC5waXBlKHNraXAoMSkpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5oYW5kbGVTZXJpZXNEYXRhKCk7XG4gICAgICB9KTtcbiAgICB0aGlzLmxlZ2VuZEFjdGl2YXRlKCk7XG4gIH1cblxuICBsZWdlbmRBY3RpdmF0ZSgpIHtcbiAgICB0aGlzLmNvbnRleHQubGVnZW5kQWN0aXZhdGUkJFxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQkKSlcbiAgICAgIC5zdWJzY3JpYmUobGVnZW5kID0+IHtcbiAgICAgICAgdGhpcy5hY3RpdmF0ZUxlZ2VuZCA9IGxlZ2VuZDtcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfSk7XG4gIH1cblxuICBoYW5kbGVPcGFjaXR5ID0gKG5hbWU6IHN0cmluZywgYWN0aXZhdGVMZWdlbmQ6IHN0cmluZykgPT5cbiAgICBhY3RpdmF0ZUxlZ2VuZCA/IChhY3RpdmF0ZUxlZ2VuZCA9PT0gbmFtZSA/IDEgOiAwLjIpIDogMTtcblxuICBoYW5kbGVTdHJva2VXaWR0aCA9IChuYW1lOiBzdHJpbmcsIGFjdGl2YXRlTGVnZW5kOiBzdHJpbmcsIHdpZHRoID0gMS41KSA9PlxuICAgIGFjdGl2YXRlTGVnZW5kID8gKGFjdGl2YXRlTGVnZW5kID09PSBuYW1lID8gd2lkdGggKyAwLjUgOiB3aWR0aCkgOiB3aWR0aDtcblxuICBoYW5kbGVDaGF0RGF0YShkYXRhOiBDaGFydERhdGFbXSkge1xuICAgIGNvbnN0IGNoYXJ0RGF0YSA9IGRhdGEubWFwKChkLCBpbmRleCkgPT4ge1xuICAgICAgaWYgKHRoaXMuaGFzQmFyKSB7XG4gICAgICAgIHRoaXMuY29udGV4dC54U2VyaWVzVmFsdWUgPSBbXG4gICAgICAgICAgLi4ubmV3IFNldChbLi4udGhpcy5jb250ZXh0LnhTZXJpZXNWYWx1ZSwgZC5uYW1lXSksXG4gICAgICAgIF07XG4gICAgICB9XG4gICAgICB0aGlzLnR5cGUgPT09ICdzdGFja2VkJyAmJlxuICAgICAgICB0aGlzLmNvbnRleHQueVNlcmllc1ZhbHVlLnB1c2goXG4gICAgICAgICAgZC52YWx1ZXMucmVkdWNlKChhY2M6IG51bWJlciwgY3VycikgPT4ge1xuICAgICAgICAgICAgY29uc3QgeTogbnVtYmVyID0gdGhpcy55KGN1cnIpO1xuICAgICAgICAgICAgcmV0dXJuIHkgKyBhY2M7XG4gICAgICAgICAgfSwgMCksXG4gICAgICAgICk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5kLFxuICAgICAgICBjb2xvcjogZC5jb2xvciB8fCB0aGlzLmNvbnRleHQuZ2V0Q2hhcnREZWZhdWx0Q29sb3IoaW5kZXgpLFxuICAgICAgICB2YWx1ZXM6IGQudmFsdWVzLm1hcCh2ID0+IHtcbiAgICAgICAgICBjb25zdCB4ID0gdGhpcy54KHYpO1xuICAgICAgICAgIGNvbnN0IHkgPSB0aGlzLnkodik7XG4gICAgICAgICAgaWYgKCF0aGlzLmhhc0Jhcikge1xuICAgICAgICAgICAgdGhpcy5jb250ZXh0LnhTZXJpZXNWYWx1ZSA9IFtcbiAgICAgICAgICAgICAgLi4ubmV3IFNldChbLi4udGhpcy5jb250ZXh0LnhTZXJpZXNWYWx1ZSwgeF0pLFxuICAgICAgICAgICAgXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRoaXMudHlwZSAhPT0gJ3N0YWNrZWQnKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHQueVNlcmllc1ZhbHVlLnB1c2goeSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB7IC4uLnYsIHgsIHkgfTtcbiAgICAgICAgfSksXG4gICAgICB9O1xuICAgIH0pO1xuICAgIHRoaXMuY29udGV4dC5zZXRDaGFydERhdGEoY2hhcnREYXRhKTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBzb25hcmpzL2NvZ25pdGl2ZS1jb21wbGV4aXR5XG4gIGhhbmRsZVNlcmllc0RhdGEoKSB7XG4gICAgY29uc3Qgc2VyaWVzRGF0YTogU2VyaWVzRGF0YVtdID0gY2xvbmVEZWVwKHRoaXMuY29udGV4dC5jaGFydERhdGEpO1xuICAgIGNvbnN0IHNsaWNlVmFsdWUgPSAzMDtcbiAgICBjb25zdCBzbGljZVRvdGFsID0gTWF0aC5jZWlsKHNlcmllc0RhdGEubGVuZ3RoIC8gc2xpY2VWYWx1ZSk7XG4gICAgY29uc3QgbGluZUcgPVxuICAgICAgWydhcmVhJywgJ2xpbmUnXS5pbmNsdWRlcyh0aGlzLnNlcmllc1R5cGUpICYmIHRoaXMuZ2V0TGluZUdlbmVyYXRvcigpO1xuICAgIGNvbnN0IGFyZWFHID0gdGhpcy5zZXJpZXNUeXBlID09PSAnYXJlYScgJiYgdGhpcy5nZXRBcmFHZW5lcmF0b3IoKTtcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgc2xpY2VUb3RhbDsgaW5kZXgrKykge1xuICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgWy4uLnNlcmllc0RhdGFdLnNwbGljZSgwLCBzbGljZVZhbHVlKS5mb3JFYWNoKChfLCBpKSA9PiB7XG4gICAgICAgICAgY29uc3QgdEluZGV4ID0gaW5kZXggKiBzbGljZVZhbHVlICsgaTtcbiAgICAgICAgICBjb25zdCBkID0gc2VyaWVzRGF0YVt0SW5kZXhdO1xuICAgICAgICAgIGlmIChkKSB7XG4gICAgICAgICAgICBkLnZpc2liaWxpdHkgPSB0aGlzLmRpc2FibGVkTGVnZW5kLmhhcyhkLm5hbWUpID8gJ2hpZGRlbicgOiAnJztcbiAgICAgICAgICAgIGlmICh0aGlzLnNlcmllc1R5cGUgPT09ICdhcmVhJykge1xuICAgICAgICAgICAgICBkLmFyZWFQYXRoID0gYXJlYUcoZC52YWx1ZXMpO1xuICAgICAgICAgICAgICBkLmdyYWRpZW50RmlsbElkID0gZ2VuZXJhdGVVSUQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChbJ2FyZWEnLCAnbGluZSddLmluY2x1ZGVzKHRoaXMuc2VyaWVzVHlwZSkpIHtcbiAgICAgICAgICAgICAgZC5wYXRoID0gbGluZUcoZC52YWx1ZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRJbmRleCA9PT0gc2VyaWVzRGF0YS5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgIHRoaXMuc2VyaWVzRGF0YSA9IHNlcmllc0RhdGE7XG4gICAgICAgICAgICAgIHRoaXMuY29udGV4dC5zZXJpZXNEYXRhJC5uZXh0KHNlcmllc0RhdGEpO1xuICAgICAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGdldExpbmVHZW5lcmF0b3IoKSB7XG4gICAgY29uc3QgeyB4LCB5IH0gPSB0aGlzLmNvbnRleHQ7XG4gICAgcmV0dXJuIGxpbmU8Q2hhcnREYXRhSXRlbT4oKVxuICAgICAgLmRlZmluZWQoZGVmaW5lZClcbiAgICAgIC5jdXJ2ZSh0aGlzLmN1cnZlVHlwZSB8fCBjdXJ2ZU1vbm90b25lWClcbiAgICAgIC54KGQgPT4gKDxTY2FsZVRpbWU8bnVtYmVyLCBudW1iZXI+PngpKGQueCBhcyBudW1iZXIpKVxuICAgICAgLnkoZCA9PiB5KGQueSkgfHwgMCk7XG4gIH1cblxuICBnZXRBcmFHZW5lcmF0b3IoKSB7XG4gICAgY29uc3QgeyB4LCB5IH0gPSB0aGlzLmNvbnRleHQ7XG4gICAgcmV0dXJuIGFyZWE8Q2hhcnREYXRhSXRlbT4oKVxuICAgICAgLmRlZmluZWQoZGVmaW5lZClcbiAgICAgIC5jdXJ2ZSgodGhpcy5jdXJ2ZVR5cGUgfHwgY3VydmVNb25vdG9uZVgpIGFzIEN1cnZlRmFjdG9yeSlcbiAgICAgIC54KGQgPT4gKDxTY2FsZVRpbWU8bnVtYmVyLCBudW1iZXI+PngpKGQueCBhcyBudW1iZXIpKVxuICAgICAgLnkwKHkucmFuZ2UoKVswXSlcbiAgICAgIC55MShkID0+IHkoZC55KSB8fCAwKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuZGVzdHJveSQkLm5leHQoKTtcbiAgfVxufVxuIl19