UNPKG

@alauda-fe/common

Version:

Alauda frontend team common codes.

146 lines 20.7 kB
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, EventEmitter, Input, Output, ViewChild, } from '@angular/core'; import { curveMonotoneX, line, } from 'd3'; import { Subject } from 'rxjs'; import { ContextChartService } from '../../chart.service'; import { defined } from '../../utils'; import * as i0 from "@angular/core"; import * as i1 from "../../chart.service"; import * as i2 from "@angular/common"; import * as i3 from "../../../effect-directive/e2e-attribute-binding.directive"; const _c0 = ["rect"]; const _c1 = ["aclRangeArea", ""]; function RangeAreaComponent__svg_path_4_Template(rf, ctx) { if (rf & 1) { const _r2 = i0.ɵɵgetCurrentView(); i0.ɵɵnamespaceSVG(); i0.ɵɵelementStart(0, "path", 4); i0.ɵɵlistener("mousedown", function RangeAreaComponent__svg_path_4_Template_path_mousedown_0_listener($event) { i0.ɵɵrestoreView(_r2); const ctx_r2 = i0.ɵɵnextContext(); const rect_r4 = i0.ɵɵreference(2); return i0.ɵɵresetView(ctx_r2.mouseDown($event, rect_r4)); })("mouseup", function RangeAreaComponent__svg_path_4_Template_path_mouseup_0_listener($event) { i0.ɵɵrestoreView(_r2); const ctx_r2 = i0.ɵɵnextContext(); const rect_r4 = i0.ɵɵreference(2); return i0.ɵɵresetView(ctx_r2.mouseUp($event, rect_r4)); })("mousemove", function RangeAreaComponent__svg_path_4_Template_path_mousemove_0_listener($event) { const item_r5 = i0.ɵɵrestoreView(_r2).$implicit; const ctx_r2 = i0.ɵɵnextContext(); const rect_r4 = i0.ɵɵreference(2); !ctx_r2.context.noData && ctx_r2.mouseMove($event, rect_r4); return i0.ɵɵresetView(ctx_r2.lineOnMouseMove(item_r5)); })("mouseleave", function RangeAreaComponent__svg_path_4_Template_path_mouseleave_0_listener($event) { i0.ɵɵrestoreView(_r2); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.lineOnMouseLeave($event)); })("click", function RangeAreaComponent__svg_path_4_Template_path_click_0_listener($event) { i0.ɵɵrestoreView(_r2); const ctx_r2 = i0.ɵɵnextContext(); const rect_r4 = i0.ɵɵreference(2); return i0.ɵɵresetView(ctx_r2.areaClickEvent($event, rect_r4)); }); i0.ɵɵelementEnd(); } if (rf & 2) { const item_r5 = ctx.$implicit; i0.ɵɵstyleProp("opacity", 0); i0.ɵɵattribute("d", item_r5.path)("stroke-width", 10)("visibility", item_r5.visibility); } } export class RangeAreaComponent { constructor(context, cdr) { this.context = context; this.cdr = cdr; this.mouseMoveEvent = new EventEmitter(); this.mouseLeaveEvent = new EventEmitter(); this.mouseDownEvent = new EventEmitter(); this.mouseUpEvent = new EventEmitter(); this.clickEvent = new EventEmitter(); this.destroy$$ = new Subject(); this.view = { width: 0, height: 0, }; } ngOnInit() { this.context.update$$.subscribe(() => { this.view = this.context.chartView; this.cdr.detectChanges(); }); } mouseDown(e, rectDom) { this.mouseDownEvent.next({ e, rectDom, }); } mouseUp(e, rectDom) { this.mouseUpEvent.next({ e, rectDom, }); } mouseMove(e, rectDom) { this.mouseMoveEvent.next({ e, rectDom, }); } mouseLeave(e) { if (this.allowLeave(e)) { this.mouseLeaveEvent.next(e); this.context.legendActivate$$.next(''); } } lineOnMouseMove(line) { this.context.legendActivate$$.next(line.name); } lineOnMouseLeave(e) { if (this.allowLeave(e)) { this.mouseLeaveEvent.next(e); } this.context.legendActivate$$.next(''); } areaClickEvent(e, rectDom) { this.clickEvent.next({ e, rectDom, }); } allowLeave(e) { const svgE = this.rectEl.nativeElement; const { left, top } = e.target.getBoundingClientRect(); const { width, height } = svgE.getBoundingClientRect(); const x = e.pageX - left; const y = e.y - top; // 判断触发 leave 是移入 line 触发还是 移出 area (只有移出 area 再触发 leave) return x < 0 || x > width || y > height || y < 0; } 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); } ngOnDestroy() { this.destroy$$.next(); } static { this.ɵfac = function RangeAreaComponent_Factory(t) { return new (t || RangeAreaComponent)(i0.ɵɵdirectiveInject(i1.ContextChartService), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); }; } static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: RangeAreaComponent, selectors: [["g", "aclRangeArea", ""]], viewQuery: function RangeAreaComponent_Query(rf, ctx) { if (rf & 1) { i0.ɵɵviewQuery(_c0, 5); } if (rf & 2) { let _t; i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.rectEl = _t.first); } }, inputs: { curveType: "curveType" }, outputs: { mouseMoveEvent: "mouseMoveEvent", mouseLeaveEvent: "mouseLeaveEvent", mouseDownEvent: "mouseDownEvent", mouseUpEvent: "mouseUpEvent", clickEvent: "clickEvent" }, attrs: _c1, decls: 6, vars: 6, consts: [["rect", ""], ["y", "0", 1, "zoom-area", 2, "opacity", "0", "cursor", "'auto'", 3, "mousedown", "mouseup", "mousemove", "mouseleave", "click"], [1, "acl-series"], ["class", "line", "stroke", "#999", "fill", "none", 3, "opacity", "mousedown", "mouseup", "mousemove", "mouseleave", "click", 4, "ngFor", "ngForOf"], ["stroke", "#999", "fill", "none", 1, "line", 3, "mousedown", "mouseup", "mousemove", "mouseleave", "click"]], template: function RangeAreaComponent_Template(rf, ctx) { if (rf & 1) { const _r1 = i0.ɵɵgetCurrentView(); i0.ɵɵnamespaceSVG(); i0.ɵɵelementStart(0, "g")(1, "rect", 1, 0); i0.ɵɵlistener("mousedown", function RangeAreaComponent_Template_rect_mousedown_1_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.mouseDown($event)); })("mouseup", function RangeAreaComponent_Template_rect_mouseup_1_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.mouseUp($event)); })("mousemove", function RangeAreaComponent_Template_rect_mousemove_1_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(!ctx.context.noData && ctx.mouseMove($event)); })("mouseleave", function RangeAreaComponent_Template_rect_mouseleave_1_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.mouseLeave($event)); })("click", function RangeAreaComponent_Template_rect_click_1_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.areaClickEvent($event)); }); i0.ɵɵelementEnd(); i0.ɵɵelementStart(3, "g", 2); i0.ɵɵtemplate(4, RangeAreaComponent__svg_path_4_Template, 1, 5, "path", 3); i0.ɵɵpipe(5, "async"); i0.ɵɵelementEnd()(); } if (rf & 2) { i0.ɵɵadvance(); i0.ɵɵattribute("x", 0)("width", ctx.view == null ? null : ctx.view.width)("height", ctx.view == null ? null : ctx.view.height); i0.ɵɵadvance(3); i0.ɵɵproperty("ngForOf", i0.ɵɵpipeBind1(5, 4, ctx.context.seriesData$)); } }, dependencies: [i2.NgForOf, i3.E2eAttributeBindingDirective, i2.AsyncPipe], encapsulation: 2, changeDetection: 0 }); } } (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(RangeAreaComponent, [{ type: Component, args: [{ selector: 'g[aclRangeArea]', changeDetection: ChangeDetectionStrategy.OnPush, template: "<svg:g>\n <svg:rect\n #rect\n class=\"zoom-area\"\n [attr.x]=\"0\"\n y=\"0\"\n [attr.width]=\"view?.width\"\n [attr.height]=\"view?.height\"\n style=\"opacity: 0; cursor: 'auto'\"\n (mousedown)=\"mouseDown($event)\"\n (mouseup)=\"mouseUp($event)\"\n (mousemove)=\"!context.noData && mouseMove($event)\"\n (mouseleave)=\"mouseLeave($event)\"\n (click)=\"areaClickEvent($event)\"\n />\n <svg:g class=\"acl-series\">\n <svg:path\n class=\"line\"\n *ngFor=\"let item of context.seriesData$ | async\"\n [attr.d]=\"item.path\"\n stroke=\"#999\"\n fill=\"none\"\n [style.opacity]=\"0\"\n [attr.stroke-width]=\"10\"\n [attr.visibility]=\"item.visibility\"\n (mousedown)=\"mouseDown($event, rect)\"\n (mouseup)=\"mouseUp($event, rect)\"\n (mousemove)=\"\n !context.noData && mouseMove($event, rect); lineOnMouseMove(item)\n \"\n (mouseleave)=\"lineOnMouseLeave($event)\"\n (click)=\"areaClickEvent($event, rect)\"\n ></svg:path>\n </svg:g>\n</svg:g>\n" }] }], () => [{ type: i1.ContextChartService }, { type: i0.ChangeDetectorRef }], { rectEl: [{ type: ViewChild, args: ['rect'] }], curveType: [{ type: Input }], mouseMoveEvent: [{ type: Output }], mouseLeaveEvent: [{ type: Output }], mouseDownEvent: [{ type: Output }], mouseUpEvent: [{ type: Output }], clickEvent: [{ type: Output }] }); })(); (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(RangeAreaComponent, { className: "RangeAreaComponent" }); })(); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFuZ2UtYXJlYS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbW1vbi9zcmMvY2hhcnQvY29tbW9uL3JhbmdlLWFyZWEvcmFuZ2UtYXJlYS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbW1vbi9zcmMvY2hhcnQvY29tbW9uL3JhbmdlLWFyZWEvcmFuZ2UtYXJlYS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxFQUNOLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBSUwsY0FBYyxFQUNkLElBQUksR0FDTCxNQUFNLElBQUksQ0FBQztBQUNaLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFHL0IsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFMUQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGFBQWEsQ0FBQzs7Ozs7Ozs7OztJQ1JsQywrQkFnQkM7SUFEQyxBQURBLEFBSEEsQUFEQSxBQURBLG1PQUFhLGlDQUF1QixLQUFDLGtOQUMxQiwrQkFBcUIsS0FBQyxvUEFFSCxpQ0FBdUIsd0JBQUUsK0JBRTdELEtBRE8scUxBQ2EsK0JBQXdCLEtBQUMsOE1BQzlCLHNDQUE0QixLQUFDO0lBQ3ZDLGlCQUFXOzs7SUFWViw0QkFBbUI7OztBRHFCekIsTUFBTSxPQUFPLGtCQUFrQjtJQXNCN0IsWUFDa0IsT0FBNEIsRUFDM0IsR0FBc0I7UUFEdkIsWUFBTyxHQUFQLE9BQU8sQ0FBcUI7UUFDM0IsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFuQi9CLG1CQUFjLEdBQUcsSUFBSSxZQUFZLEVBQWtCLENBQUM7UUFFcEQs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QkFBdkIsTUFBTTtZQUVHLFlBQVk7a0JBQXJCLE1BQU07WUFFRyxVQUFVO2tCQUFuQixNQUFNOztrRkFiSSxrQkFBa0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEN1cnZlRmFjdG9yeSxcbiAgQ3VydmVGYWN0b3J5TGluZU9ubHksXG4gIFNjYWxlVGltZSxcbiAgY3VydmVNb25vdG9uZVgsXG4gIGxpbmUsXG59IGZyb20gJ2QzJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgQ2hhcnREYXRhLCBDaGFydERhdGFJdGVtIH0gZnJvbSAnLi4vLi4vLi4vdmlldy1jaGFydC90eXBlcyc7XG5pbXBvcnQgeyBDb250ZXh0Q2hhcnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY2hhcnQuc2VydmljZSc7XG5pbXBvcnQgeyBTZXJpZXNEYXRhIH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHsgZGVmaW5lZCB9IGZyb20gJy4uLy4uL3V0aWxzJztcblxuaW50ZXJmYWNlIExpbmVEYXRhIGV4dGVuZHMgQ2hhcnREYXRhIHtcbiAgd2lkdGg6IDM7XG4gIHBhdGg6IHN0cmluZztcbiAgdmlzaWJpbGl0eTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFyZWFNb3VzZUV2ZW50IHtcbiAgZTogTW91c2VFdmVudDtcbiAgcmVjdERvbT86IEhUTUxFbGVtZW50O1xufVxuXG5AQ29tcG9uZW50KHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9jb21wb25lbnQtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICdnW2FjbFJhbmdlQXJlYV0nLFxuICB0ZW1wbGF0ZVVybDogJy4vcmFuZ2UtYXJlYS5jb21wb25lbnQuaHRtbCcsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBSYW5nZUFyZWFDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIEBWaWV3Q2hpbGQoJ3JlY3QnKSByZWN0RWw6IEVsZW1lbnRSZWY7XG5cbiAgQElucHV0KCkgY3VydmVUeXBlOiBDdXJ2ZUZhY3RvcnkgfCBDdXJ2ZUZhY3RvcnlMaW5lT25seTtcblxuICBAT3V0cHV0KCkgbW91c2VNb3ZlRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPEFyZWFNb3VzZUV2ZW50PigpO1xuXG4gIEBPdXRwdXQoKSBtb3VzZUxlYXZlRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPE1vdXNlRXZlbnQ+KCk7XG5cbiAgQE91dHB1dCgpIG1vdXNlRG93bkV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxBcmVhTW91c2VFdmVudD4oKTtcblxuICBAT3V0cHV0KCkgbW91c2VVcEV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxBcmVhTW91c2VFdmVudD4oKTtcblxuICBAT3V0cHV0KCkgY2xpY2tFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8QXJlYU1vdXNlRXZlbnQ+KCk7XG5cbiAgZGVzdHJveSQkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICB2aWV3ID0ge1xuICAgIHdpZHRoOiAwLFxuICAgIGhlaWdodDogMCxcbiAgfTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhZG9ubHkgY29udGV4dDogQ29udGV4dENoYXJ0U2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICkge31cblxuICBsaW5lRGF0YTogTGluZURhdGFbXTtcblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmNvbnRleHQudXBkYXRlJCQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMudmlldyA9IHRoaXMuY29udGV4dC5jaGFydFZpZXc7XG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfSk7XG4gIH1cblxuICBtb3VzZURvd24oZTogTW91c2VFdmVudCwgcmVjdERvbT86IEhUTUxFbGVtZW50KSB7XG4gICAgdGhpcy5tb3VzZURvd25FdmVudC5uZXh0KHtcbiAgICAgIGUsXG4gICAgICByZWN0RG9tLFxuICAgIH0pO1xuICB9XG5cbiAgbW91c2VVcChlOiBNb3VzZUV2ZW50LCByZWN0RG9tPzogSFRNTEVsZW1lbnQpIHtcbiAgICB0aGlzLm1vdXNlVXBFdmVudC5uZXh0KHtcbiAgICAgIGUsXG4gICAgICByZWN0RG9tLFxuICAgIH0pO1xuICB9XG5cbiAgbW91c2VNb3ZlKGU6IE1vdXNlRXZlbnQsIHJlY3REb20/OiBIVE1MRWxlbWVudCkge1xuICAgIHRoaXMubW91c2VNb3ZlRXZlbnQubmV4dCh7XG4gICAgICBlLFxuICAgICAgcmVjdERvbSxcbiAgICB9KTtcbiAgfVxuXG4gIG1vdXNlTGVhdmUoZTogTW91c2VFdmVudCkge1xuICAgIGlmICh0aGlzLmFsbG93TGVhdmUoZSkpIHtcbiAgICAgIHRoaXMubW91c2VMZWF2ZUV2ZW50Lm5leHQoZSk7XG4gICAgICB0aGlzLmNvbnRleHQubGVnZW5kQWN0aXZhdGUkJC5uZXh0KCcnKTtcbiAgICB9XG4gIH1cblxuICBsaW5lT25Nb3VzZU1vdmUobGluZTogU2VyaWVzRGF0YSkge1xuICAgIHRoaXMuY29udGV4dC5sZWdlbmRBY3RpdmF0ZSQkLm5leHQobGluZS5uYW1lKTtcbiAgfVxuXG4gIGxpbmVPbk1vdXNlTGVhdmUoZTogTW91c2VFdmVudCkge1xuICAgIGlmICh0aGlzLmFsbG93TGVhdmUoZSkpIHtcbiAgICAgIHRoaXMubW91c2VMZWF2ZUV2ZW50Lm5leHQoZSk7XG4gICAgfVxuICAgIHRoaXMuY29udGV4dC5sZWdlbmRBY3RpdmF0ZSQkLm5leHQoJycpO1xuICB9XG5cbiAgYXJlYUNsaWNrRXZlbnQoZTogTW91c2VFdmVudCwgcmVjdERvbT86IEhUTUxFbGVtZW50KSB7XG4gICAgdGhpcy5jbGlja0V2ZW50Lm5leHQoe1xuICAgICAgZSxcbiAgICAgIHJlY3REb20sXG4gICAgfSk7XG4gIH1cblxuICBhbGxvd0xlYXZlKGU6IE1vdXNlRXZlbnQpIHtcbiAgICBjb25zdCBzdmdFID0gdGhpcy5yZWN0RWwubmF0aXZlRWxlbWVudCBhcyBTVkdSZWN0RWxlbWVudDtcbiAgICBjb25zdCB7IGxlZnQsIHRvcCB9ID0gKGUudGFyZ2V0IGFzIFNWR1JlY3RFbGVtZW50KS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IHN2Z0UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgeCA9IGUucGFnZVggLSBsZWZ0O1xuICAgIGNvbnN0IHkgPSBlLnkgLSB0b3A7XG4gICAgLy8g5Yik5pat6Kem5Y+RIGxlYXZlIOaYr+enu+WFpSBsaW5lIOinpuWPkei/mOaYryDnp7vlh7ogYXJlYSAo5Y+q5pyJ56e75Ye6IGFyZWEg5YaN6Kem5Y+RIGxlYXZlKVxuICAgIHJldHVybiB4IDwgMCB8fCB4ID4gd2lkdGggfHwgeSA+IGhlaWdodCB8fCB5IDwgMDtcbiAgfVxuXG4gIGdldExpbmVHZW5lcmF0b3IoKSB7XG4gICAgY29uc3QgeyB4LCB5IH0gPSB0aGlzLmNvbnRleHQ7XG4gICAgcmV0dXJuIGxpbmU8Q2hhcnREYXRhSXRlbT4oKVxuICAgICAgLmRlZmluZWQoZGVmaW5lZClcbiAgICAgIC5jdXJ2ZSh0aGlzLmN1cnZlVHlwZSB8fCBjdXJ2ZU1vbm90b25lWClcbiAgICAgIC54KGQgPT4gKDxTY2FsZVRpbWU8bnVtYmVyLCBudW1iZXI+PngpKGQueCBhcyBudW1iZXIpKVxuICAgICAgLnkoZCA9PiB5KGQueSkgfHwgMCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRlc3Ryb3kkJC5uZXh0KCk7XG4gIH1cbn1cbiIsIjxzdmc6Zz5cbiAgPHN2ZzpyZWN0XG4gICAgI3JlY3RcbiAgICBjbGFzcz1cInpvb20tYXJlYVwiXG4gICAgW2F0dHIueF09XCIwXCJcbiAgICB5PVwiMFwiXG4gICAgW2F0dHIud2lkdGhdPVwidmlldz8ud2lkdGhcIlxuICAgIFthdHRyLmhlaWdodF09XCJ2aWV3Py5oZWlnaHRcIlxuICAgIHN0eWxlPVwib3BhY2l0eTogMDsgY3Vyc29yOiAnYXV0bydcIlxuICAgIChtb3VzZWRvd24pPVwibW91c2VEb3duKCRldmVudClcIlxuICAgIChtb3VzZXVwKT1cIm1vdXNlVXAoJGV2ZW50KVwiXG4gICAgKG1vdXNlbW92ZSk9XCIhY29udGV4dC5ub0RhdGEgJiYgbW91c2VNb3ZlKCRldmVudClcIlxuICAgIChtb3VzZWxlYXZlKT1cIm1vdXNlTGVhdmUoJGV2ZW50KVwiXG4gICAgKGNsaWNrKT1cImFyZWFDbGlja0V2ZW50KCRldmVudClcIlxuICAvPlxuICA8c3ZnOmcgY2xhc3M9XCJhY2wtc2VyaWVzXCI+XG4gICAgPHN2ZzpwYXRoXG4gICAgICBjbGFzcz1cImxpbmVcIlxuICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgY29udGV4dC5zZXJpZXNEYXRhJCB8IGFzeW5jXCJcbiAgICAgIFthdHRyLmRdPVwiaXRlbS5wYXRoXCJcbiAgICAgIHN0cm9rZT1cIiM5OTlcIlxuICAgICAgZmlsbD1cIm5vbmVcIlxuICAgICAgW3N0eWxlLm9wYWNpdHldPVwiMFwiXG4gICAgICBbYXR0ci5zdHJva2Utd2lkdGhdPVwiMTBcIlxuICAgICAgW2F0dHIudmlzaWJpbGl0eV09XCJpdGVtLnZpc2liaWxpdHlcIlxuICAgICAgKG1vdXNlZG93bik9XCJtb3VzZURvd24oJGV2ZW50LCByZWN0KVwiXG4gICAgICAobW91c2V1cCk9XCJtb3VzZVVwKCRldmVudCwgcmVjdClcIlxuICAgICAgKG1vdXNlbW92ZSk9XCJcbiAgICAgICAgIWNvbnRleHQubm9EYXRhICYmIG1vdXNlTW92ZSgkZXZlbnQsIHJlY3QpOyBsaW5lT25Nb3VzZU1vdmUoaXRlbSlcbiAgICAgIFwiXG4gICAgICAobW91c2VsZWF2ZSk9XCJsaW5lT25Nb3VzZUxlYXZlKCRldmVudClcIlxuICAgICAgKGNsaWNrKT1cImFyZWFDbGlja0V2ZW50KCRldmVudCwgcmVjdClcIlxuICAgID48L3N2ZzpwYXRoPlxuICA8L3N2ZzpnPlxuPC9zdmc6Zz5cbiJdfQ==