@alauda-fe/common
Version:
Alauda frontend team common codes.
237 lines • 32.6 kB
JavaScript
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==