@alauda-fe/common
Version:
Alauda frontend team common codes.
212 lines (211 loc) • 18.2 kB
JavaScript
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, } from '@angular/core';
import dayjs from 'dayjs';
import { map } from 'rxjs';
import { ContextChartService } from '../../chart.service';
import { Orientation } from '../../types';
import { ScaleType, reduceTicks } from '../../utils';
import * as i0 from "@angular/core";
import * as i1 from "../../chart.service";
const _c0 = ["aclXAxisTicks", ""];
function XAxisTicksComponent_ng_container_0__svg_g_1_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵnamespaceSVG();
i0.ɵɵelementStart(0, "g")(1, "text", 4);
i0.ɵɵtext(2);
i0.ɵɵpipe(3, "translate");
i0.ɵɵelementEnd();
i0.ɵɵelement(4, "line", 5);
i0.ɵɵelementEnd();
} if (rf & 2) {
const tick_r1 = ctx.$implicit;
const i_r2 = ctx.index;
const ctx_r2 = i0.ɵɵnextContext(2);
i0.ɵɵadvance();
i0.ɵɵattribute("x", i_r2 === ctx_r2.ticks.length - 1 && tick_r1.x >= (ctx_r2.context.chartView == null ? null : ctx_r2.context.chartView.height) ? tick_r1.x - 5 : tick_r1.x)("y", tick_r1.y + 16)("text-anchor", ctx_r2.textAnchor);
i0.ɵɵadvance();
i0.ɵɵtextInterpolate1(" ", ctx_r2.translation ? i0.ɵɵpipeBind1(3, 8, tick_r1.value) : tick_r1.value, " ");
i0.ɵɵadvance(2);
i0.ɵɵattribute("x1", tick_r1.x)("x2", tick_r1.x)("y1", tick_r1.y)("y2", tick_r1.y + 6);
} }
function XAxisTicksComponent_ng_container_0_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementContainerStart(0);
i0.ɵɵtemplate(1, XAxisTicksComponent_ng_container_0__svg_g_1_Template, 5, 10, "g", 2);
i0.ɵɵnamespaceSVG();
i0.ɵɵelementStart(2, "g");
i0.ɵɵelement(3, "path", 3);
i0.ɵɵelementEnd();
i0.ɵɵelementContainerEnd();
} if (rf & 2) {
const ctx_r2 = i0.ɵɵnextContext();
i0.ɵɵadvance();
i0.ɵɵproperty("ngForOf", ctx_r2.ticks);
i0.ɵɵadvance(2);
i0.ɵɵattribute("d", ctx_r2.xAxisLine);
} }
function XAxisTicksComponent_ng_template_1__svg_g_0_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵnamespaceSVG();
i0.ɵɵelementStart(0, "g")(1, "text", 6);
i0.ɵɵtext(2);
i0.ɵɵpipe(3, "translate");
i0.ɵɵpipe(4, "translate");
i0.ɵɵelementEnd()();
} if (rf & 2) {
const tick_r4 = ctx.$implicit;
const ctx_r2 = i0.ɵɵnextContext(2);
i0.ɵɵadvance();
i0.ɵɵattribute("y", tick_r4.x);
i0.ɵɵadvance();
i0.ɵɵtextInterpolate1(" ", ctx_r2.translation ? i0.ɵɵpipeBind1(4, 4, i0.ɵɵpipeBind1(3, 2, tick_r4.value)) : tick_r4.value, " ");
} }
function XAxisTicksComponent_ng_template_1_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵtemplate(0, XAxisTicksComponent_ng_template_1__svg_g_0_Template, 5, 6, "g", 2);
i0.ɵɵnamespaceSVG();
i0.ɵɵelementStart(1, "g");
i0.ɵɵelement(2, "path", 3);
i0.ɵɵelementEnd();
} if (rf & 2) {
const ctx_r2 = i0.ɵɵnextContext();
i0.ɵɵproperty("ngForOf", ctx_r2.ticks);
i0.ɵɵadvance(2);
i0.ɵɵattribute("d", ctx_r2.yAxisLine);
} }
export class XAxisTicksComponent {
get context() {
return this.contextService;
}
get yAxisLine() {
return `M${0} ${0}L${0} ${this.context.chartView.height}Z`;
}
get xAxisLine() {
const { width } = this.contextService.chartView;
return `M0 0L${width} 0Z`;
}
getTicks() {
let ticks;
if (this.context.scaleType === ScaleType.ORDINAL) {
const maxTicks = this.getMaxTicks(20);
ticks = reduceTicks(this.context.x.domain(), maxTicks).map(this.handleTicksData);
}
else {
ticks = this.context.x
.ticks(this.getMaxTicks(100))
.map(this.handleTicksData);
}
return ticks;
}
getMaxTicks(tickWidth) {
const width = this.context.horizontal
? this.context.chartView.height
: this.context.chartView.width;
return Math.floor(width / tickWidth);
}
constructor(contextService, cdr) {
this.contextService = contextService;
this.cdr = cdr;
this.textAnchor = 'middle';
this.orientation = Orientation;
this.handleTicksData = (value) => {
const bandwidth = this.context.barOptions.isBand
? this.context.x.bandwidth() * 0.5
: 0;
return {
value: this.format(value),
x: this.context.x(value) + bandwidth,
y: 0,
};
};
}
ngOnInit() {
this.contextService.seriesData$
.pipe(map(() => this.getTicks()))
.subscribe(res => {
this.ticks = res;
this.cdr.detectChanges();
});
}
format(value) {
return this.contextService.scaleType === ScaleType.TIME
? dayjs(value).format(this.dateFormat)
: value;
}
static { this.ɵfac = function XAxisTicksComponent_Factory(t) { return new (t || XAxisTicksComponent)(i0.ɵɵdirectiveInject(i1.ContextChartService), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); }; }
static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: XAxisTicksComponent, selectors: [["g", "aclXAxisTicks", ""]], inputs: { dateFormat: "dateFormat", translation: "translation" }, attrs: _c0, decls: 3, vars: 2, consts: [["elseTemplate", ""], [4, "ngIf", "ngIfElse"], [4, "ngFor", "ngForOf"], ["stroke", "#ccd6eb", "fill", "none"], ["fill", "#666", "font-size", "11"], ["stroke-width", "1", "stroke", "#ccd6eb"], ["x", "-8", "fill", "#666", "text-anchor", "end", "font-size", "11", "alignment-baseline", "middle"]], template: function XAxisTicksComponent_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵtemplate(0, XAxisTicksComponent_ng_container_0_Template, 4, 2, "ng-container", 1)(1, XAxisTicksComponent_ng_template_1_Template, 3, 2, "ng-template", null, 0, i0.ɵɵtemplateRefExtractor);
} if (rf & 2) {
const elseTemplate_r5 = i0.ɵɵreference(2);
i0.ɵɵproperty("ngIf", ctx.context.barOptions.orientation === ctx.orientation.VERTICAL)("ngIfElse", elseTemplate_r5);
} }, encapsulation: 2, changeDetection: 0 }); }
}
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(XAxisTicksComponent, [{
type: Component,
args: [{
// eslint-disable-next-line @angular-eslint/component-selector
selector: 'g[aclXAxisTicks]',
template: `
<ng-container
*ngIf="
context.barOptions.orientation === orientation.VERTICAL;
else elseTemplate
"
>
<svg:g *ngFor="let tick of ticks; let i = index">
<text
[attr.x]="
i === ticks.length - 1 && tick.x >= context.chartView?.height
? tick.x - 5
: tick.x
"
[attr.y]="tick.y + 16"
fill="#666"
[attr.text-anchor]="textAnchor"
font-size="11"
>
{{ translation ? (tick.value | translate) : tick.value }}
</text>
<line
[attr.x1]="tick.x"
[attr.x2]="tick.x"
[attr.y1]="tick.y"
[attr.y2]="tick.y + 6"
stroke-width="1"
stroke="#ccd6eb"
></line>
</svg:g>
<svg:g>
<path
[attr.d]="xAxisLine"
stroke="#ccd6eb"
fill="none"
/>
</svg:g>
</ng-container>
<ng-template #elseTemplate>
<svg:g *ngFor="let tick of ticks; let i = index">
<text
x="-8"
[attr.y]="tick.x"
fill="#666"
text-anchor="end"
font-size="11"
alignment-baseline="middle"
>
{{ translation ? (tick.value | translate | translate) : tick.value }}
</text>
</svg:g>
<svg:g>
<path
[attr.d]="yAxisLine"
stroke="#ccd6eb"
fill="none"
/>
</svg:g>
</ng-template>
`,
changeDetection: ChangeDetectionStrategy.OnPush,
}]
}], () => [{ type: i1.ContextChartService }, { type: i0.ChangeDetectorRef }], { dateFormat: [{
type: Input
}], translation: [{
type: Input
}] }); })();
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(XAxisTicksComponent, { className: "XAxisTicksComponent" }); })();
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieC1heGlzLXRpY2tzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29tbW9uL3NyYy9jaGFydC9jb21tb24vYXhpcy94LWF4aXMtdGlja3MuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxLQUFLLEdBRU4sTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFM0IsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDMUQsT0FBTyxFQUFFLFdBQVcsRUFBbUIsTUFBTSxhQUFhLENBQUM7QUFDM0QsT0FBTyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsTUFBTSxhQUFhLENBQUM7Ozs7OztJQWE3QyxBQURGLHlCQUFpRCxjQVc5QztJQUNDLFlBQ0Y7O0lBQUEsaUJBQU87SUFDUCwwQkFPUTtJQUNWLGlCQUFROzs7OztJQXBCSixjQUlDOztJQU1ELGNBQ0Y7SUFERSx5R0FDRjtJQUVFLGVBQWtCOzs7O0lBckJ4Qiw2QkFLQztJQUNDLHFGQUFpRDs7SUF1QmpELHlCQUFPO0lBQ0wsMEJBSUU7SUFDSixpQkFBUTs7OztJQTdCZ0IsY0FBVTtJQUFWLHNDQUFVO0lBeUI5QixlQUFvQjs7Ozs7SUFTdEIsQUFERix5QkFBaUQsY0FROUM7SUFDQyxZQUNGOzs7SUFDRixBQURFLGlCQUFPLEVBQ0Q7Ozs7SUFSSixjQUFpQjs7SUFNakIsY0FDRjtJQURFLCtIQUNGOzs7SUFWRixtRkFBaUQ7O0lBWWpELHlCQUFPO0lBQ0wsMEJBSUU7SUFDSixpQkFBUTs7O0lBbEJnQixzQ0FBVTtJQWM5QixlQUFvQjs7O0FBUzlCLE1BQU0sT0FBTyxtQkFBbUI7SUFPOUIsSUFB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QyxTQUFTLEtBQUssU0FBUyxDQUFDLElBQUk7WUFDckQsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztZQUN0QyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQ1osQ0FBQztvRkF4RVUsbUJBQW1CO29FQUFuQixtQkFBbUI7WUF4QjVCLEFBdENBLHNGQUtDLHdHQWlDMEI7OztZQW5DZCxBQUZWLHNGQUVVLDZCQUVqQjs7O2lGQXlEYSxtQkFBbUI7Y0FsRS9CLFNBQVM7ZUFBQztnQkFDVCw4REFBOEQ7Z0JBQzlELFFBQVEsRUFBRSxrQkFBa0I7Z0JBQzVCLFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNERUO2dCQUNELGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO2FBQ2hEO29GQUVVLFVBQVU7a0JBQWxCLEtBQUs7WUFFRyxXQUFXO2tCQUFuQixLQUFLOztrRkFISyxtQkFBbUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgSW5wdXQsXG4gIE9uSW5pdCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTY2FsZVBvaW50LCBTY2FsZVRpbWUgfSBmcm9tICdkMyc7XG5pbXBvcnQgZGF5anMgZnJvbSAnZGF5anMnO1xuaW1wb3J0IHsgbWFwIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IENvbnRleHRDaGFydFNlcnZpY2UgfSBmcm9tICcuLi8uLi9jaGFydC5zZXJ2aWNlJztcbmltcG9ydCB7IE9yaWVudGF0aW9uLCBUaWNrLCBUaWNrVmFsdWUgfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgeyBTY2FsZVR5cGUsIHJlZHVjZVRpY2tzIH0gZnJvbSAnLi4vLi4vdXRpbHMnO1xuXG5AQ29tcG9uZW50KHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9jb21wb25lbnQtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICdnW2FjbFhBeGlzVGlja3NdJyxcbiAgdGVtcGxhdGU6IGBcbiAgICA8bmctY29udGFpbmVyXG4gICAgICAqbmdJZj1cIlxuICAgICAgICBjb250ZXh0LmJhck9wdGlvbnMub3JpZW50YXRpb24gPT09IG9yaWVudGF0aW9uLlZFUlRJQ0FMO1xuICAgICAgICBlbHNlIGVsc2VUZW1wbGF0ZVxuICAgICAgXCJcbiAgICA+XG4gICAgICA8c3ZnOmcgKm5nRm9yPVwibGV0IHRpY2sgb2YgdGlja3M7IGxldCBpID0gaW5kZXhcIj5cbiAgICAgICAgPHRleHRcbiAgICAgICAgICBbYXR0ci54XT1cIlxuICAgICAgICAgICAgaSA9PT0gdGlja3MubGVuZ3RoIC0gMSAmJiB0aWNrLnggPj0gY29udGV4dC5jaGFydFZpZXc/LmhlaWdodFxuICAgICAgICAgICAgICA/IHRpY2sueCAtIDVcbiAgICAgICAgICAgICAgOiB0aWNrLnhcbiAgICAgICAgICBcIlxuICAgICAgICAgIFthdHRyLnldPVwidGljay55ICsgMTZcIlxuICAgICAgICAgIGZpbGw9XCIjNjY2XCJcbiAgICAgICAgICBbYXR0ci50ZXh0LWFuY2hvcl09XCJ0ZXh0QW5jaG9yXCJcbiAgICAgICAgICBmb250LXNpemU9XCIxMVwiXG4gICAgICAgID5cbiAgICAgICAgICB7eyB0cmFuc2xhdGlvbiA/ICh0aWNrLnZhbHVlIHwgdHJhbnNsYXRlKSA6IHRpY2sudmFsdWUgfX1cbiAgICAgICAgPC90ZXh0PlxuICAgICAgICA8bGluZVxuICAgICAgICAgIFthdHRyLngxXT1cInRpY2sueFwiXG4gICAgICAgICAgW2F0dHIueDJdPVwidGljay54XCJcbiAgICAgICAgICBbYXR0ci55MV09XCJ0aWNrLnlcIlxuICAgICAgICAgIFthdHRyLnkyXT1cInRpY2sueSArIDZcIlxuICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjFcIlxuICAgICAgICAgIHN0cm9rZT1cIiNjY2Q2ZWJcIlxuICAgICAgICA+PC9saW5lPlxuICAgICAgPC9zdmc6Zz5cbiAgICAgIDxzdmc6Zz5cbiAgICAgICAgPHBhdGhcbiAgICAgICAgICBbYXR0ci5kXT1cInhBeGlzTGluZVwiXG4gICAgICAgICAgc3Ryb2tlPVwiI2NjZDZlYlwiXG4gICAgICAgICAgZmlsbD1cIm5vbmVcIlxuICAgICAgICAvPlxuICAgICAgPC9zdmc6Zz5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxuZy10ZW1wbGF0ZSAjZWxzZVRlbXBsYXRlPlxuICAgICAgPHN2ZzpnICpuZ0Zvcj1cImxldCB0aWNrIG9mIHRpY2tzOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICAgIDx0ZXh0XG4gICAgICAgICAgeD1cIi04XCJcbiAgICAgICAgICBbYXR0ci55XT1cInRpY2sueFwiXG4gICAgICAgICAgZmlsbD1cIiM2NjZcIlxuICAgICAgICAgIHRleHQtYW5jaG9yPVwiZW5kXCJcbiAgICAgICAgICBmb250LXNpemU9XCIxMVwiXG4gICAgICAgICAgYWxpZ25tZW50LWJhc2VsaW5lPVwibWlkZGxlXCJcbiAgICAgICAgPlxuICAgICAgICAgIHt7IHRyYW5zbGF0aW9uID8gKHRpY2sudmFsdWUgfCB0cmFuc2xhdGUgfCB0cmFuc2xhdGUpIDogdGljay52YWx1ZSB9fVxuICAgICAgICA8L3RleHQ+XG4gICAgICA8L3N2ZzpnPlxuICAgICAgPHN2ZzpnPlxuICAgICAgICA8cGF0aFxuICAgICAgICAgIFthdHRyLmRdPVwieUF4aXNMaW5lXCJcbiAgICAgICAgICBzdHJva2U9XCIjY2NkNmViXCJcbiAgICAgICAgICBmaWxsPVwibm9uZVwiXG4gICAgICAgIC8+XG4gICAgICA8L3N2ZzpnPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIGAsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBYQXhpc1RpY2tzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KCkgZGF0ZUZvcm1hdDogc3RyaW5nO1xuXG4gIEBJbnB1dCgpIHRyYW5zbGF0aW9uOiBib29sZWFuO1xuXG4gIHRleHRBbmNob3IgPSAnbWlkZGxlJztcbiAgb3JpZW50YXRpb24gPSBPcmllbnRhdGlvbjtcbiAgZ2V0IGNvbnRleHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29udGV4dFNlcnZpY2U7XG4gIH1cblxuICB0aWNrczogVGlja1tdO1xuICBnZXQgeUF4aXNMaW5lKCkge1xuICAgIHJldHVybiBgTSR7MH0gJHswfUwkezB9ICR7dGhpcy5jb250ZXh0LmNoYXJ0Vmlldy5oZWlnaHR9WmA7XG4gIH1cblxuICBnZXQgeEF4aXNMaW5lKCkge1xuICAgIGNvbnN0IHsgd2lkdGggfSA9IHRoaXMuY29udGV4dFNlcnZpY2UuY2hhcnRWaWV3O1xuICAgIHJldHVybiBgTTAgMEwke3dpZHRofSAwWmA7XG4gIH1cblxuICBnZXRUaWNrcygpIHtcbiAgICBsZXQgdGlja3M6IFRpY2tbXTtcbiAgICBpZiAodGhpcy5jb250ZXh0LnNjYWxlVHlwZSA9PT0gU2NhbGVUeXBlLk9SRElOQUwpIHtcbiAgICAgIGNvbnN0IG1heFRpY2tzID0gdGhpcy5nZXRNYXhUaWNrcygyMCk7XG4gICAgICB0aWNrcyA9IHJlZHVjZVRpY2tzKHRoaXMuY29udGV4dC54LmRvbWFpbigpLCBtYXhUaWNrcykubWFwKFxuICAgICAgICB0aGlzLmhhbmRsZVRpY2tzRGF0YSxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRpY2tzID0gKHRoaXMuY29udGV4dC54IGFzIFNjYWxlVGltZTxudW1iZXIsIG51bWJlcj4pXG4gICAgICAgIC50aWNrcyh0aGlzLmdldE1heFRpY2tzKDEwMCkpXG4gICAgICAgIC5tYXAodGhpcy5oYW5kbGVUaWNrc0RhdGEpO1xuICAgIH1cbiAgICByZXR1cm4gdGlja3M7XG4gIH1cblxuICBoYW5kbGVUaWNrc0RhdGEgPSAodmFsdWU6IFRpY2tWYWx1ZSk6IFRpY2sgPT4ge1xuICAgIGNvbnN0IGJhbmR3aWR0aCA9IHRoaXMuY29udGV4dC5iYXJPcHRpb25zLmlzQmFuZFxuICAgICAgPyAodGhpcy5jb250ZXh0LnggYXMgU2NhbGVQb2ludDxzdHJpbmc+KS5iYW5kd2lkdGgoKSAqIDAuNVxuICAgICAgOiAwO1xuICAgIHJldHVybiB7XG4gICAgICB2YWx1ZTogdGhpcy5mb3JtYXQodmFsdWUpLFxuICAgICAgeDogdGhpcy5jb250ZXh0LngodmFsdWUpICsgYmFuZHdpZHRoLFxuICAgICAgeTogMCxcbiAgICB9IGFzIFRpY2s7XG4gIH07XG5cbiAgZ2V0TWF4VGlja3ModGlja1dpZHRoOiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IHdpZHRoID0gdGhpcy5jb250ZXh0Lmhvcml6b250YWxcbiAgICAgID8gdGhpcy5jb250ZXh0LmNoYXJ0Vmlldy5oZWlnaHRcbiAgICAgIDogdGhpcy5jb250ZXh0LmNoYXJ0Vmlldy53aWR0aDtcbiAgICByZXR1cm4gTWF0aC5mbG9vcih3aWR0aCAvIHRpY2tXaWR0aCk7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbnRleHRTZXJ2aWNlOiBDb250ZXh0Q2hhcnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuY29udGV4dFNlcnZpY2Uuc2VyaWVzRGF0YSRcbiAgICAgIC5waXBlKG1hcCgoKSA9PiB0aGlzLmdldFRpY2tzKCkpKVxuICAgICAgLnN1YnNjcmliZShyZXMgPT4ge1xuICAgICAgICB0aGlzLnRpY2tzID0gcmVzO1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIGZvcm1hdCh2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZSkge1xuICAgIHJldHVybiB0aGlzLmNvbnRleHRTZXJ2aWNlLnNjYWxlVHlwZSA9PT0gU2NhbGVUeXBlLlRJTUVcbiAgICAgID8gZGF5anModmFsdWUpLmZvcm1hdCh0aGlzLmRhdGVGb3JtYXQpXG4gICAgICA6IHZhbHVlO1xuICB9XG59XG4iXX0=