UNPKG

@alauda-fe/common

Version:

Alauda frontend team common codes.

237 lines 32.6 kB
import { Inject, Injectable, InjectionToken, Optional } from '@angular/core'; import { scaleBand, scaleLinear, scalePoint, scaleTime, } from 'd3'; import { BehaviorSubject, Subject, map, tap } from 'rxjs'; import { publishRef } from '../core/utils/public-api'; import { DEFAULT_COLORS, basics } from './constants'; import { Orientation, } from './types'; import { ScaleType, calculateViewDimensions, getScaleType, getXDomain, getYDomain, } from './utils'; import * as i0 from "@angular/core"; export const CHART_COLORS_TOKEN = new InjectionToken('chart_colors'); export class ContextChartService { get scaleType() { return this._scaleType || getScaleType(this.xSeriesValue); } set scaleType(type) { this._scaleType = type; } get x() { if (this.adoptCache('x')) { return this.cacheXScale; } return (this.cacheXScale = this.getXScale(getXDomain(this.xSeriesValue, this.scaleType))); } get y() { if (this.adoptCache('y')) { return this.cacheYScale; } return (this.cacheYScale = this.calculateY()); } get innerDomain() { const domainSet = new Set(); for (const [, item] of this.chartData.entries()) { for (const [, value] of item.values.entries()) { domainSet.add(value.x); } } return [...domainSet]; } get colors() { return this.chartColors?.length ? this.chartColors : DEFAULT_COLORS; } get horizontal() { return (this.barOptions.isBand || this.barOptions.orientation === Orientation.HORIZONTAL); } constructor(chartColors) { this.chartColors = chartColors; this.chartView = { width: 0, height: 0, xOffset: 0, }; this.update$$ = new Subject(); this.legendChange$$ = new Subject(); this.legendActivate$$ = new Subject(); this.disabledLegend = new Set(); this.showXLabel = false; this.showYLabel = false; this.xSeriesValue = []; this.ySeriesValue = []; this.barOptions = { isBand: false, orientation: Orientation.VERTICAL, type: 'standard', }; this.chartData = []; this.chartData$ = new BehaviorSubject([]); this.seriesData$ = new BehaviorSubject([]); this.triggerInitData$ = new BehaviorSubject([]); this.ySeriesDomain = [0, 0]; this.xSeriesDomain = [0, 0]; this.cacheDomainParams = { yDomain: [0, 0], xDomain: [0, 0], height: 0, width: 0, }; this.noData = true; this.noData$ = this.chartData$.pipe(map(res => res.every(item => item.values.every(d => d.y === null))), tap(noData => (this.noData = noData)), publishRef()); this.barInnerScale = (barPadding = 8) => { const width = this.x.bandwidth(); const spacing = this.innerDomain.length / (width / barPadding + 1); return scaleBand() .range([0, width]) .paddingInner(spacing) .domain(this.innerDomain); }; this.calculateY = () => { const horizontal = this.barOptions.orientation === Orientation.HORIZONTAL; const height = horizontal ? this.chartView.width : this.chartView.height; this.cacheDomainParams = { ...this.cacheDomainParams, yDomain: this.ySeriesDomain, height, }; return scaleLinear().domain(this.ySeriesDomain).range([height, 0]).nice(); }; this.getChartDefaultColor = (index) => { const colorIndex = index % this.colors.length; return this.colors[colorIndex]; }; } initContext() { this.xSeriesValue = []; this.ySeriesValue = []; } setChartData(data) { this.chartData$.next(data); this.calculationYDomain(); this.xSeriesDomain = getXDomain(this.xSeriesValue, this.scaleType); } updateChartView(width, height, margin) { this.chartView = calculateViewDimensions({ width, height, margin: margin || basics.margin, showXLabel: this.showXLabel, showYLabel: this.showYLabel, }); this.cacheDomainParams.width = this.chartView.width; this.update$$.next(); } calculationYDomain() { const horizontal = this.barOptions.orientation === Orientation.HORIZONTAL; const defaultDomain = getYDomain(this.ySeriesValue); const min = Math.min(0, this.yScaleMin || 0, defaultDomain[0]); const max = Math.max(0, this.yScaleMax || 0, defaultDomain[1]); this.ySeriesDomain = horizontal ? [max, min] : [min, max]; } calculationYAxisMax() { this.ySeriesValue = this.chartData.reduce((prev, curr) => { if (!this.disabledLegend.has(curr.name)) { return [ ...prev, ...(this.barOptions.isBand ? this.getYSeriesItemDomain(curr.values) : curr.values.map(d => d.y)), ]; } return prev; }, []); this.calculationYDomain(); } getYSeriesItemDomain(values) { return this.barOptions.type === 'stacked' ? [ 0, values.reduce((prev, curr) => { if (!this.disabledLegend.has(curr.x)) { return curr.y + prev; } return prev; }, 0), ] : values.reduce((prev, curr) => { if (!this.disabledLegend.has(curr.x)) { return [...prev, curr.y]; } return prev; }, []); } getXScale(domain) { const width = this.barOptions.orientation === Orientation.HORIZONTAL ? this.chartView.height : this.chartView.width; if (this.barOptions.isBand) { return scaleBand().range([0, width]).domain(domain).padding(0.2); } switch (this.scaleType) { case ScaleType.TIME: { return scaleTime().domain(domain).range([0, width]); } case ScaleType.LINEAR: { return scaleLinear().domain(domain).range([0, width]); } case ScaleType.ORDINAL: { return scalePoint().domain(domain).range([0, width]); } default: { break; } } } adoptCache(type) { const { xDomain, width, yDomain, height } = this.cacheDomainParams; if (type === 'x') { return (xDomain[0] === this.ySeriesDomain[0] && xDomain[1] === this.ySeriesDomain[1] && width === this.chartView.width && this.chartView.width && this.ySeriesDomain[1]); } return (yDomain[0] === this.ySeriesDomain[0] && yDomain[1] === this.ySeriesDomain[1] && height === this.chartView.height && this.chartView.height); } selectedLegend(payload) { const legend = payload.legendItem; this.disabledLegend.delete(legend.name); this.legendActivate$$.next(legend.name); this.calculationYAxisMax(); this.legendChange$$.next(payload); this.legendActivate$$.next(''); this.update$$.next(); } selectedAllLegend() { this.disabledLegend.clear(); this.calculationYAxisMax(); this.legendChange$$.next(null); this.update$$.next(); } unselectAllLegend(legends) { this.disabledLegend = new Set(legends); this.calculationYAxisMax(); this.legendChange$$.next(null); this.update$$.next(); } deactivateLegend(payload) { const legend = payload.legendItem; this.disabledLegend.add(legend.name); this.calculationYAxisMax(); this.legendActivate$$.next(''); this.legendChange$$.next(payload); this.update$$.next(); } static { this.ɵfac = function ContextChartService_Factory(t) { return new (t || ContextChartService)(i0.ɵɵinject(CHART_COLORS_TOKEN, 8)); }; } static { this.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: ContextChartService, factory: ContextChartService.ɵfac }); } } (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ContextChartService, [{ type: Injectable }], () => [{ type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [CHART_COLORS_TOKEN] }] }], null); })(); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcnQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvY29tbW9uL3NyYy9jaGFydC9jaGFydC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0UsT0FBTyxFQUtMLFNBQVMsRUFDVCxXQUFXLEVBQ1gsVUFBVSxFQUNWLFNBQVMsR0FDVixNQUFNLElBQUksQ0FBQztBQUNaLE9BQU8sRUFBRSxlQUFlLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFMUQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBSXRELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3JELE9BQU8sRUFJTCxXQUFXLEdBRVosTUFBTSxTQUFTLENBQUM7QUFDakIsT0FBTyxFQUNMLFNBQVMsRUFDVCx1QkFBdUIsRUFDdkIsWUFBWSxFQUNaLFVBQVUsRUFDVixVQUFVLEdBQ1gsTUFBTSxTQUFTLENBQUM7O0FBRWpCLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLElBQUksY0FBYyxDQUFXLGNBQWMsQ0FBQyxDQUFDO0FBUS9FLE1BQU0sT0FBTyxtQkFBbUI7SUE2RTlCLElBQUksU0FBUztRQUNYLE9BQU8sSUFBSSxDQUFDLFVBQVUsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFFRCxJQUFJLFNBQVMsQ0FBQyxJQUFJO1FBQ2hCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO0lBQ3pCLENBQUM7SUFFRCxJQUFJLENBQUM7UUFDSCxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN6QixP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Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBJbmplY3Rpb25Ub2tlbiwgT3B0aW9uYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIFNjYWxlQmFuZCxcbiAgU2NhbGVMaW5lYXIsXG4gIFNjYWxlUG9pbnQsXG4gIFNjYWxlVGltZSxcbiAgc2NhbGVCYW5kLFxuICBzY2FsZUxpbmVhcixcbiAgc2NhbGVQb2ludCxcbiAgc2NhbGVUaW1lLFxufSBmcm9tICdkMyc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIFN1YmplY3QsIG1hcCwgdGFwIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IHB1Ymxpc2hSZWYgfSBmcm9tICcuLi9jb3JlL3V0aWxzL3B1YmxpYy1hcGknO1xuaW1wb3J0IHsgQ2hhcnREYXRhLCBDaGFydERhdGFJdGVtIH0gZnJvbSAnLi4vdmlldy1jaGFydC90eXBlcyc7XG5cbmltcG9ydCB7IExlZ2VuZEl0ZW0gfSBmcm9tICcuL2NvbW1vbi9sZWdlbmQvbGVnZW5kLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBERUZBVUxUX0NPTE9SUywgYmFzaWNzIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHtcbiAgQ2hhcnRNYXJnaW4sXG4gIENoYXJ0VmlldyxcbiAgRG9tYWluUGFyYW1zLFxuICBPcmllbnRhdGlvbixcbiAgU2VyaWVzRGF0YSxcbn0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQge1xuICBTY2FsZVR5cGUsXG4gIGNhbGN1bGF0ZVZpZXdEaW1lbnNpb25zLFxuICBnZXRTY2FsZVR5cGUsXG4gIGdldFhEb21haW4sXG4gIGdldFlEb21haW4sXG59IGZyb20gJy4vdXRpbHMnO1xuXG5leHBvcnQgY29uc3QgQ0hBUlRfQ09MT1JTX1RPS0VOID0gbmV3IEluamVjdGlvblRva2VuPHN0cmluZ1tdPignY2hhcnRfY29sb3JzJyk7XG5cbmludGVyZmFjZSBMZWdlbmRDaGFuZ2VQYXlsb2FkIHtcbiAgbGVnZW5kSXRlbTogTGVnZW5kSXRlbTtcbiAgbGVnZW5kczogTGVnZW5kSXRlbVtdO1xufVxuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQ29udGV4dENoYXJ0U2VydmljZSB7XG4gIG1hcmdpbjogQ2hhcnRNYXJnaW47XG5cbiAgY2hhcnRWaWV3OiBDaGFydFZpZXcgPSB7XG4gICAgd2lkdGg6IDAsXG4gICAgaGVpZ2h0OiAwLFxuICAgIHhPZmZzZXQ6IDAsXG4gIH07XG5cbiAgdXBkYXRlJCQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIGxlZ2VuZENoYW5nZSQkID0gbmV3IFN1YmplY3Q8TGVnZW5kQ2hhbmdlUGF5bG9hZD4oKTtcblxuICBsZWdlbmRBY3RpdmF0ZSQkID0gbmV3IFN1YmplY3Q8c3RyaW5nPigpO1xuXG4gIGRpc2FibGVkTGVnZW5kOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKTtcblxuICBzaG93WExhYmVsID0gZmFsc2U7XG5cbiAgc2hvd1lMYWJlbCA9IGZhbHNlO1xuXG4gIHlTY2FsZU1pbjogbnVtYmVyO1xuXG4gIHlTY2FsZU1heDogbnVtYmVyO1xuXG4gIHhTZXJpZXNWYWx1ZTogQXJyYXk8c3RyaW5nIHwgbnVtYmVyIHwgRGF0ZT4gPSBbXTtcblxuICB5U2VyaWVzVmFsdWU6IG51bWJlcltdID0gW107XG5cbiAgX3NjYWxlVHlwZTogU2NhbGVUeXBlO1xuXG4gIGJhck9wdGlvbnM6IHtcbiAgICBpc0JhbmQ6IGJvb2xlYW47XG4gICAgb3JpZW50YXRpb246IE9yaWVudGF0aW9uIHwgc3RyaW5nO1xuICAgIHR5cGU6IHN0cmluZztcbiAgfSA9IHtcbiAgICBpc0JhbmQ6IGZhbHNlLFxuICAgIG9yaWVudGF0aW9uOiBPcmllbnRhdGlvbi5WRVJUSUNBTCxcbiAgICB0eXBlOiAnc3RhbmRhcmQnLFxuICB9O1xuXG4gIGNoYXJ0RGF0YTogQ2hhcnREYXRhW10gPSBbXTtcblxuICBjaGFydERhdGEkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxDaGFydERhdGFbXT4oW10pO1xuXG4gIHNlcmllc0RhdGEkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxTZXJpZXNEYXRhW10+KFtdKTtcblxuICB0cmlnZ2VySW5pdERhdGEkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxDaGFydERhdGFbXT4oW10pO1xuXG4gIHlTZXJpZXNEb21haW4gPSBbMCwgMF07XG5cbiAgeFNlcmllc0RvbWFpbjogdW5rbm93bltdID0gWzAsIDBdO1xuXG4gIGNhY2hlRG9tYWluUGFyYW1zOiBEb21haW5QYXJhbXMgPSB7XG4gICAgeURvbWFpbjogWzAsIDBdLFxuICAgIHhEb21haW46IFswLCAwXSxcbiAgICBoZWlnaHQ6IDAsXG4gICAgd2lkdGg6IDAsXG4gIH07XG5cbiAgY2FjaGVYU2NhbGU6XG4gICAgfCBTY2FsZUxpbmVhcjxudW1iZXIsIG51bWJlcj5cbiAgICB8IFNjYWxlVGltZTxudW1iZXIsIG51bWJlcj5cbiAgICB8IFNjYWxlUG9pbnQ8c3RyaW5nPjtcblxuICBjYWNoZVlTY2FsZTogU2NhbGVMaW5lYXI8bnVtYmVyLCBudW1iZXI+O1xuXG4gIG5vRGF0YSA9IHRydWU7XG5cbiAgY2FjaGVTY2FsZTogU2NhbGVMaW5lYXI8bnVtYmVyLCBudW1iZXI+O1xuXG4gIG5vRGF0YSQgPSB0aGlzLmNoYXJ0RGF0YSQucGlwZShcbiAgICBtYXAocmVzID0+IHJlcy5ldmVyeShpdGVtID0+IGl0ZW0udmFsdWVzLmV2ZXJ5KGQgPT4gZC55ID09PSBudWxsKSkpLFxuICAgIHRhcChub0RhdGEgPT4gKHRoaXMubm9EYXRhID0gbm9EYXRhKSksXG4gICAgcHVibGlzaFJlZigpLFxuICApO1xuXG4gIGdldCBzY2FsZVR5cGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NjYWxlVHlwZSB8fCBnZXRTY2FsZVR5cGUodGhpcy54U2VyaWVzVmFsdWUpO1xuICB9XG5cbiAgc2V0IHNjYWxlVHlwZSh0eXBlKSB7XG4gICAgdGhpcy5fc2NhbGVUeXBlID0gdHlwZTtcbiAgfVxuXG4gIGdldCB4KCkge1xuICAgIGlmICh0aGlzLmFkb3B0Q2FjaGUoJ3gnKSkge1xuICAgICAgcmV0dXJuIHRoaXMuY2FjaGVYU2NhbGU7XG4gICAgfVxuICAgIHJldHVybiAodGhpcy5jYWNoZVhTY2FsZSA9IHRoaXMuZ2V0WFNjYWxlKFxuICAgICAgZ2V0WERvbWFpbih0aGlzLnhTZXJpZXNWYWx1ZSwgdGhpcy5zY2FsZVR5cGUpLFxuICAgICkpO1xuICB9XG5cbiAgZ2V0IHkoKSB7XG4gICAgaWYgKHRoaXMuYWRvcHRDYWNoZSgneScpKSB7XG4gICAgICByZXR1cm4gdGhpcy5jYWNoZVlTY2FsZTtcbiAgICB9XG4gICAgcmV0dXJuICh0aGlzLmNhY2hlWVNjYWxlID0gdGhpcy5jYWxjdWxhdGVZKCkpO1xuICB9XG5cbiAgZ2V0IGlubmVyRG9tYWluKCkge1xuICAgIGNvbnN0IGRvbWFpblNldDogU2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XG4gICAgZm9yIChjb25zdCBbLCBpdGVtXSBvZiB0aGlzLmNoYXJ0RGF0YS5lbnRyaWVzKCkpIHtcbiAgICAgIGZvciAoY29uc3QgWywgdmFsdWVdIG9mIGl0ZW0udmFsdWVzLmVudHJpZXMoKSkge1xuICAgICAgICBkb21haW5TZXQuYWRkKHZhbHVlLnggYXMgc3RyaW5nKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFsuLi5kb21haW5TZXRdO1xuICB9XG5cbiAgZ2V0IGNvbG9ycygpIHtcbiAgICByZXR1cm4gdGhpcy5jaGFydENvbG9ycz8ubGVuZ3RoID8gdGhpcy5jaGFydENvbG9ycyA6IERFRkFVTFRfQ09MT1JTO1xuICB9XG5cbiAgZ2V0IGhvcml6b250YWwoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuYmFyT3B0aW9ucy5pc0JhbmQgfHxcbiAgICAgIHRoaXMuYmFyT3B0aW9ucy5vcmllbnRhdGlvbiA9PT0gT3JpZW50YXRpb24uSE9SSVpPTlRBTFxuICAgICk7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBAT3B0aW9uYWwoKVxuICAgIEBJbmplY3QoQ0hBUlRfQ09MT1JTX1RPS0VOKVxuICAgIHByaXZhdGUgcmVhZG9ubHkgY2hhcnRDb2xvcnM6IHN0cmluZ1tdLFxuICApIHt9XG5cbiAgaW5pdENvbnRleHQoKSB7XG4gICAgdGhpcy54U2VyaWVzVmFsdWUgPSBbXTtcbiAgICB0aGlzLnlTZXJpZXNWYWx1ZSA9IFtdO1xuICB9XG5cbiAgc2V0Q2hhcnREYXRhKGRhdGE6IENoYXJ0RGF0YVtdKSB7XG4gICAgdGhpcy5jaGFydERhdGEkLm5leHQoZGF0YSk7XG4gICAgdGhpcy5jYWxjdWxhdGlvbllEb21haW4oKTtcbiAgICB0aGlzLnhTZXJpZXNEb21haW4gPSBnZXRYRG9tYWluKHRoaXMueFNlcmllc1ZhbHVlLCB0aGlzLnNjYWxlVHlwZSk7XG4gIH1cblxuICBiYXJJbm5lclNjYWxlID0gKGJhclBhZGRpbmcgPSA4KSA9PiB7XG4gICAgY29uc3Qgd2lkdGggPSAoPFNjYWxlQmFuZDxzdHJpbmc+PnRoaXMueCkuYmFuZHdpZHRoKCk7XG4gICAgY29uc3Qgc3BhY2luZyA9IHRoaXMuaW5uZXJEb21haW4ubGVuZ3RoIC8gKHdpZHRoIC8gYmFyUGFkZGluZyArIDEpO1xuICAgIHJldHVybiBzY2FsZUJhbmQoKVxuICAgICAgLnJhbmdlKFswLCB3aWR0aF0pXG4gICAgICAucGFkZGluZ0lubmVyKHNwYWNpbmcpXG4gICAgICAuZG9tYWluKHRoaXMuaW5uZXJEb21haW4pO1xuICB9O1xuXG4gIGNhbGN1bGF0ZVkgPSAoKSA9PiB7XG4gICAgY29uc3QgaG9yaXpvbnRhbCA9IHRoaXMuYmFyT3B0aW9ucy5vcmllbnRhdGlvbiA9PT0gT3JpZW50YXRpb24uSE9SSVpPTlRBTDtcbiAgICBjb25zdCBoZWlnaHQgPSBob3Jpem9udGFsID8gdGhpcy5jaGFydFZpZXcud2lkdGggOiB0aGlzLmNoYXJ0Vmlldy5oZWlnaHQ7XG4gICAgdGhpcy5jYWNoZURvbWFpblBhcmFtcyA9IHtcbiAgICAgIC4uLnRoaXMuY2FjaGVEb21haW5QYXJhbXMsXG4gICAgICB5RG9tYWluOiB0aGlzLnlTZXJpZXNEb21haW4sXG4gICAgICBoZWlnaHQsXG4gICAgfTtcbiAgICByZXR1cm4gc2NhbGVMaW5lYXIoKS5kb21haW4odGhpcy55U2VyaWVzRG9tYWluKS5yYW5nZShbaGVpZ2h0LCAwXSkubmljZSgpO1xuICB9O1xuXG4gIHVwZGF0ZUNoYXJ0Vmlldyh3aWR0aD86IG51bWJlciwgaGVpZ2h0PzogbnVtYmVyLCBtYXJnaW4/OiBDaGFydE1hcmdpbikge1xuICAgIHRoaXMuY2hhcnRWaWV3ID0gY2FsY3VsYXRlVmlld0RpbWVuc2lvbnMoe1xuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHQsXG4gICAgICBtYXJnaW46IG1hcmdpbiB8fCBiYXNpY3MubWFyZ2luLFxuICAgICAgc2hvd1hMYWJlbDogdGhpcy5zaG93WExhYmVsLFxuICAgICAgc2hvd1lMYWJlbDogdGhpcy5zaG93WUxhYmVsLFxuICAgIH0pO1xuICAgIHRoaXMuY2FjaGVEb21haW5QYXJhbXMud2lkdGggPSB0aGlzLmNoYXJ0Vmlldy53aWR0aDtcbiAgICB0aGlzLnVwZGF0ZSQkLm5leHQoKTtcbiAgfVxuXG4gIGdldENoYXJ0RGVmYXVsdENvbG9yID0gKGluZGV4OiBudW1iZXIpID0+IHtcbiAgICBjb25zdCBjb2xvckluZGV4ID0gaW5kZXggJSB0aGlzLmNvbG9ycy5sZW5ndGg7XG4gICAgcmV0dXJuIHRoaXMuY29sb3JzW2NvbG9ySW5kZXhdO1xuICB9O1xuXG4gIHByaXZhdGUgY2FsY3VsYXRpb25ZRG9tYWluKCkge1xuICAgIGNvbnN0IGhvcml6b250YWwgPSB0aGlzLmJhck9wdGlvbnMub3JpZW50YXRpb24gPT09IE9yaWVudGF0aW9uLkhPUklaT05UQUw7XG4gICAgY29uc3QgZGVmYXVsdERvbWFpbiA9IGdldFlEb21haW4odGhpcy55U2VyaWVzVmFsdWUpO1xuICAgIGNvbnN0IG1pbiA9IE1hdGgubWluKDAsIHRoaXMueVNjYWxlTWluIHx8IDAsIGRlZmF1bHREb21haW5bMF0pO1xuICAgIGNvbnN0IG1heCA9IE1hdGgubWF4KDAsIHRoaXMueVNjYWxlTWF4IHx8IDAsIGRlZmF1bHREb21haW5bMV0pO1xuICAgIHRoaXMueVNlcmllc0RvbWFpbiA9IGhvcml6b250YWwgPyBbbWF4LCBtaW5dIDogW21pbiwgbWF4XTtcbiAgfVxuXG4gIGNhbGN1bGF0aW9uWUF4aXNNYXgoKSB7XG4gICAgdGhpcy55U2VyaWVzVmFsdWUgPSB0aGlzLmNoYXJ0RGF0YS5yZWR1Y2UoKHByZXYsIGN1cnIpID0+IHtcbiAgICAgIGlmICghdGhpcy5kaXNhYmxlZExlZ2VuZC5oYXMoY3Vyci5uYW1lKSkge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgIC4uLnByZXYsXG4gICAgICAgICAgLi4uKHRoaXMuYmFyT3B0aW9ucy5pc0JhbmRcbiAgICAgICAgICAgID8gdGhpcy5nZXRZU2VyaWVzSXRlbURvbWFpbihjdXJyLnZhbHVlcylcbiAgICAgICAgICAgIDogY3Vyci52YWx1ZXMubWFwKGQgPT4gZC55KSksXG4gICAgICAgIF07XG4gICAgICB9XG4gICAgICByZXR1cm4gcHJldjtcbiAgICB9LCBbXSk7XG4gICAgdGhpcy5jYWxjdWxhdGlvbllEb21haW4oKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0WVNlcmllc0l0ZW1Eb21haW4odmFsdWVzOiBDaGFydERhdGFJdGVtW10pIHtcbiAgICByZXR1cm4gdGhpcy5iYXJPcHRpb25zLnR5cGUgPT09ICdzdGFja2VkJ1xuICAgICAgPyBbXG4gICAgICAgICAgMCxcbiAgICAgICAgICB2YWx1ZXMucmVkdWNlKChwcmV2LCBjdXJyKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuZGlzYWJsZWRMZWdlbmQuaGFzKGN1cnIueCBhcyBzdHJpbmcpKSB7XG4gICAgICAgICAgICAgIHJldHVybiBjdXJyLnkgKyBwcmV2O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHByZXY7XG4gICAgICAgICAgfSwgMCksXG4gICAgICAgIF1cbiAgICAgIDogdmFsdWVzLnJlZHVjZSgocHJldiwgY3VycikgPT4ge1xuICAgICAgICAgIGlmICghdGhpcy5kaXNhYmxlZExlZ2VuZC5oYXMoY3Vyci54IGFzIHN0cmluZykpIHtcbiAgICAgICAgICAgIHJldHVybiBbLi4ucHJldiwgY3Vyci55XTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHByZXY7XG4gICAgICAgIH0sIFtdKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0WFNjYWxlKGRvbWFpbjogQXJyYXk8RGF0ZSB8IG51bWJlciB8IGFueT4pIHtcbiAgICBjb25zdCB3aWR0aCA9XG4gICAgICB0aGlzLmJhck9wdGlvbnMub3JpZW50YXRpb24gPT09IE9yaWVudGF0aW9uLkhPUklaT05UQUxcbiAgICAgICAgPyB0aGlzLmNoYXJ0Vmlldy5oZWlnaHRcbiAgICAgICAgOiB0aGlzLmNoYXJ0Vmlldy53aWR0aDtcbiAgICBpZiAodGhpcy5iYXJPcHRpb25zLmlzQmFuZCkge1xuICAgICAgcmV0dXJuIHNjYWxlQmFuZCgpLnJhbmdlKFswLCB3aWR0aF0pLmRvbWFpbihkb21haW4pLnBhZGRpbmcoMC4yKTtcbiAgICB9XG4gICAgc3dpdGNoICh0aGlzLnNjYWxlVHlwZSkge1xuICAgICAgY2FzZSBTY2FsZVR5cGUuVElNRToge1xuICAgICAgICByZXR1cm4gc2NhbGVUaW1lKCkuZG9tYWluKGRvbWFpbikucmFuZ2UoWzAsIHdpZHRoXSk7XG4gICAgICB9XG4gICAgICBjYXNlIFNjYWxlVHlwZS5MSU5FQVI6IHtcbiAgICAgICAgcmV0dXJuIHNjYWxlTGluZWFyKCkuZG9tYWluKGRvbWFpbikucmFuZ2UoWzAsIHdpZHRoXSk7XG4gICAgICB9XG4gICAgICBjYXNlIFNjYWxlVHlwZS5PUkRJTkFMOiB7XG4gICAgICAgIHJldHVybiBzY2FsZVBvaW50KCkuZG9tYWluKGRvbWFpbikucmFuZ2UoWzAsIHdpZHRoXSk7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYWRvcHRDYWNoZSh0eXBlOiAneScgfCAneCcpIHtcbiAgICBjb25zdCB7IHhEb21haW4sIHdpZHRoLCB5RG9tYWluLCBoZWlnaHQgfSA9IHRoaXMuY2FjaGVEb21haW5QYXJhbXM7XG4gICAgaWYgKHR5cGUgPT09ICd4Jykge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgeERvbWFpblswXSA9PT0gdGhpcy55U2VyaWVzRG9tYWluWzBdICYmXG4gICAgICAgIHhEb21haW5bMV0gPT09IHRoaXMueVNlcmllc0RvbWFpblsxXSAmJlxuICAgICAgICB3aWR0aCA9PT0gdGhpcy5jaGFydFZpZXcud2lkdGggJiZcbiAgICAgICAgdGhpcy5jaGFydFZpZXcud2lkdGggJiZcbiAgICAgICAgdGhpcy55U2VyaWVzRG9tYWluWzFdXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gKFxuICAgICAgeURvbWFpblswXSA9PT0gdGhpcy55U2VyaWVzRG9tYWluWzBdICYmXG4gICAgICB5RG9tYWluWzFdID09PSB0aGlzLnlTZXJpZXNEb21haW5bMV0gJiZcbiAgICAgIGhlaWdodCA9PT0gdGhpcy5jaGFydFZpZXcuaGVpZ2h0ICYmXG4gICAgICB0aGlzLmNoYXJ0Vmlldy5oZWlnaHRcbiAgICApO1xuICB9XG5cbiAgc2VsZWN0ZWRMZWdlbmQocGF5bG9hZDogTGVnZW5kQ2hhbmdlUGF5bG9hZCkge1xuICAgIGNvbnN0IGxlZ2VuZCA9IHBheWxvYWQubGVnZW5kSXRlbTtcbiAgICB0aGlzLmRpc2FibGVkTGVnZW5kLmRlbGV0ZShsZWdlbmQubmFtZSk7XG4gICAgdGhpcy5sZWdlbmRBY3RpdmF0ZSQkLm5leHQobGVnZW5kLm5hbWUpO1xuICAgIHRoaXMuY2FsY3VsYXRpb25ZQXhpc01heCgpO1xuICAgIHRoaXMubGVnZW5kQ2hhbmdlJCQubmV4dChwYXlsb2FkKTtcbiAgICB0aGlzLmxlZ2VuZEFjdGl2YXRlJCQubmV4dCgnJyk7XG4gICAgdGhpcy51cGRhdGUkJC5uZXh0KCk7XG4gIH1cblxuICBzZWxlY3RlZEFsbExlZ2VuZCgpIHtcbiAgICB0aGlzLmRpc2FibGVkTGVnZW5kLmNsZWFyKCk7XG4gICAgdGhpcy5jYWxjdWxhdGlvbllBeGlzTWF4KCk7XG4gICAgdGhpcy5sZWdlbmRDaGFuZ2UkJC5uZXh0KG51bGwpO1xuICAgIHRoaXMudXBkYXRlJCQubmV4dCgpO1xuICB9XG5cbiAgdW5zZWxlY3RBbGxMZWdlbmQobGVnZW5kczogc3RyaW5nW10pIHtcbiAgICB0aGlzLmRpc2FibGVkTGVnZW5kID0gbmV3IFNldChsZWdlbmRzKTtcbiAgICB0aGlzLmNhbGN1bGF0aW9uWUF4aXNNYXgoKTtcbiAgICB0aGlzLmxlZ2VuZENoYW5nZSQkLm5leHQobnVsbCk7XG4gICAgdGhpcy51cGRhdGUkJC5uZXh0KCk7XG4gIH1cblxuICBkZWFjdGl2YXRlTGVnZW5kKHBheWxvYWQ6IExlZ2VuZENoYW5nZVBheWxvYWQpIHtcbiAgICBjb25zdCBsZWdlbmQgPSBwYXlsb2FkLmxlZ2VuZEl0ZW07XG4gICAgdGhpcy5kaXNhYmxlZExlZ2VuZC5hZGQobGVnZW5kLm5hbWUpO1xuICAgIHRoaXMuY2FsY3VsYXRpb25ZQXhpc01heCgpO1xuICAgIHRoaXMubGVnZW5kQWN0aXZhdGUkJC5uZXh0KCcnKTtcbiAgICB0aGlzLmxlZ2VuZENoYW5nZSQkLm5leHQocGF5bG9hZCk7XG4gICAgdGhpcy51cGRhdGUkJC5uZXh0KCk7XG4gIH1cbn1cbiJdfQ==