@rivet-health/design-system 40.4.0 → 40.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2020/lib/navigation/views/edit-view/edit-view.component.mjs +44 -85
- package/esm2020/lib/navigation/views/permission-picker/permission-picker.component.mjs +151 -0
- package/esm2020/lib/navigation/views/state.mjs +2 -2
- package/esm2020/lib/riv.module.mjs +6 -1
- package/esm2020/lib/visualization/chart/chart.component.mjs +3 -3
- package/esm2020/lib/visualization/chart/chart.mjs +110 -1
- package/esm2020/public-api.mjs +2 -1
- package/fesm2015/rivet-health-design-system.mjs +259 -48
- package/fesm2015/rivet-health-design-system.mjs.map +1 -1
- package/fesm2020/rivet-health-design-system.mjs +265 -48
- package/fesm2020/rivet-health-design-system.mjs.map +1 -1
- package/lib/navigation/views/edit-view/edit-view.component.d.ts +8 -21
- package/lib/navigation/views/permission-picker/permission-picker.component.d.ts +37 -0
- package/lib/navigation/views/state.d.ts +1 -1
- package/lib/riv.module.d.ts +48 -47
- package/lib/visualization/chart/chart.d.ts +3 -1
- package/package.json +1 -1
- package/public-api.d.ts +1 -0
|
@@ -575,10 +575,10 @@ export class ChartComponent {
|
|
|
575
575
|
}
|
|
576
576
|
}
|
|
577
577
|
ChartComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ChartComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
578
|
-
ChartComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: ChartComponent, selector: "riv-chart", inputs: { height: "height", width: "width", overrideHeight: "overrideHeight", overrideWidth: "overrideWidth", config: "config", data: "data" }, outputs: { chartClicked: "chartClicked" }, queries: [{ propertyName: "tooltipTemplate", first: true, predicate: ["tooltip"], descendants: true }], viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true }, { propertyName: "moreTextContainer", first: true, predicate: ["moreTextContainer"], descendants: true }], ngImport: i0, template: "<div\n class=\"container\"\n (rivClientSize)=\"width = $event.width\"\n *ngIf=\"{ d: drawData$ | async } as vm\"\n [style.--override-font-size]=\"getFontSize(vm.d)\"\n>\n <ng-container\n *ngIf=\"\n !checkForNonDisplayState(vm.d) && (drawData$ | async);\n let d;\n else: nonDisplayState\n \"\n >\n <div\n (mousemove)=\"mousemove($event, d.hover)\"\n (mouseleave)=\"mouseleave($event)\"\n (click)=\"click()\"\n #container\n class=\"sub-container\"\n [class.clickable]=\"isHoverClickable\"\n tabIndex=\"0\"\n [ngClass]=\"{ 'donut-container': config.type === 'donut' }\"\n [ngStyle]=\"{\n height: getSubcontainerHeight(d),\n width: getSubcontainerWidth(d)\n }\"\n >\n <svg:svg\n xmlns=\"http://www.w3.org/2000/svg\"\n [attr.viewBox]=\"d.viewBox\"\n [attr.height]=\"d.chartHeight\"\n [attr.width]=\"d.chartWidth\"\n >\n <defs>\n <!-- Stripe pattern -->\n <pattern\n id=\"stripes\"\n x=\"0\"\n y=\"0\"\n [attr.width]=\"10\"\n [attr.height]=\"10\"\n patternUnits=\"userSpaceOnUse\"\n >\n <line\n [attr.x1]=\"0\"\n [attr.y1]=\"10\"\n [attr.x2]=\"10\"\n [attr.y2]=\"0\"\n stroke=\"var(--white-100)\"\n stroke-width=\"1\"\n ></line>\n </pattern>\n </defs>\n <ng-container *ngIf=\"!(config.type === 'horizontal-bar')\">\n <g *ngFor=\"let tick of d.xTicks\" text-anchor=\"middle\">\n <text\n class=\"tick-label\"\n [attr.x]=\"tick.x\"\n [attr.y]=\"getBottomLabelY(d)\"\n >\n {{ tick.label }}\n </text>\n </g>\n </ng-container>\n <ng-container *ngIf=\"config.type === 'horizontal-bar'\">\n <g *ngFor=\"let tick of d.xTicks\" text-anchor=\"left\">\n <text\n class=\"tick-label\"\n [attr.x]=\"tick.x\"\n [attr.y]=\"d.chartSizingValues.fontSize\"\n >\n {{ tick.label }}\n </text>\n <line\n class=\"tick-line\"\n [attr.x1]=\"tick.x\"\n [attr.x2]=\"tick.x\"\n y1=\"0\"\n [attr.y2]=\"d.chartHeight\"\n ></line>\n <text\n *ngIf=\"tick.secondaryLabel\"\n class=\"tick-label\"\n [attr.x]=\"tick.x\"\n [attr.y]=\"getBottomLabelY(d)\"\n >\n {{ tick.secondaryLabel }}\n </text>\n </g>\n </ng-container>\n <g *ngFor=\"let tick of d.yTicks\">\n <line\n *ngIf=\"!(config.type === 'horizontal-bar')\"\n class=\"tick-line\"\n [attr.y1]=\"tick.y\"\n [attr.y2]=\"tick.y\"\n x1=\"0\"\n [attr.x2]=\"d.chartWidth\"\n ></line>\n <text\n rivSVGTextTruncate\n [text]=\"tick.label\"\n [width]=\"\n config.type === 'horizontal-bar'\n ? d.chartSizingValues.leftBucketLabel\n : d.chartSizingValues.leftPadding\n \"\n class=\"tick-label\"\n [attr.y]=\"tick.y\"\n [attr.x]=\"0\"\n >\n {{ tick.label }}\n </text>\n <text\n *ngIf=\"tick.secondaryLabel\"\n rivSVGTextTruncate\n [text]=\"tick.secondaryLabel\"\n [width]=\"d.chartSizingValues.rightPadding\"\n class=\"tick-label\"\n [attr.y]=\"tick.y\"\n [attr.x]=\"d.chartWidth\"\n text-anchor=\"end\"\n >\n {{ tick.secondaryLabel }}\n </text>\n </g>\n <ng-container *ngIf=\"standardHoverDataGuard(hover) as hoverData\">\n <g *ngIf=\"config.type !== 'horizontal-bar'\">\n <line\n class=\"tick-line\"\n [attr.x1]=\"hoverData?.x\"\n [attr.x2]=\"hoverData?.x\"\n y1=\"0\"\n [attr.y2]=\"d.chartHeight\"\n stroke-width=\"2\"\n stroke-dasharray=\"4\"\n />\n </g>\n </ng-container>\n <g *ngFor=\"let bar of d.bars; let i = index\">\n <ng-container *ngFor=\"let rect of bar; let j = index\">\n <defs *ngIf=\"rect.pattern === 'dots'\">\n <pattern\n [attr.id]=\"'dots-' + i + '-' + j\"\n patternUnits=\"userSpaceOnUse\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n width=\"4\"\n height=\"4\"\n >\n <circle\n cx=\"2\"\n cy=\"2\"\n r=\"1.5\"\n [attr.fill]=\"varColor(d.colors, i)\"\n ></circle>\n </pattern>\n </defs>\n\n <rect\n *ngIf=\"rect.nonDisplay !== true\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n [attr.fill]=\"\n rect.pattern === 'dots'\n ? 'url(#dots-' + i + '-' + j + ')'\n : getBarColor(rect, d.colors, i, hover)\n \"\n [attr.stroke]=\"\n showBarBorders(rect, hover) ? varWrap('--black-100') : undefined\n \"\n [attr.stroke-width]=\"showBarBorders(rect, hover) ? 1 : undefined\"\n ></rect>\n <rect\n *ngIf=\"showNonDisplayRect(rect, hover)\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n fill=\"transparent\"\n [attr.stroke]=\"varWrap('--black-100')\"\n [attr.stroke-width]=\"1\"\n ></rect>\n <rect\n *ngIf=\"rect.pattern === 'striped'\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n fill=\"url(#stripes)\"\n ></rect>\n </ng-container>\n </g>\n <g *ngFor=\"let bar of d.horizontalBars; let i = index\">\n <ng-container *ngFor=\"let indBar of bar; let j = index\">\n <defs *ngIf=\"indBar.pattern === 'dots'\">\n <pattern\n [attr.id]=\"'dots-' + i + '-' + j\"\n patternUnits=\"userSpaceOnUse\"\n [attr.x]=\"indBar.x\"\n [attr.y]=\"indBar.y\"\n width=\"4\"\n height=\"4\"\n >\n <circle\n cx=\"2\"\n cy=\"2\"\n r=\"1.5\"\n [attr.fill]=\"varColor(d.colors, i)\"\n ></circle>\n </pattern>\n </defs>\n <path\n [attr.d]=\"indBar.horizontalBar\"\n [attr.fill]=\"\n indBar.pattern === 'dots'\n ? 'url(#dots-' + i + '-' + j + ')'\n : varColor(d.colors, i)\n \"\n [attr.stroke]=\"\n indBar.pattern === 'dots' ? 'none' : varColor(d.colors, i)\n \"\n [attr.stroke-width]=\"indBar.pattern === 'dots' ? 0 : 2\"\n />\n <path\n *ngIf=\"indBar.pattern === 'striped'\"\n [attr.d]=\"indBar.horizontalBar\"\n [attr.stroke]=\"varColor(d.colors, i)\"\n fill=\"url(#stripes)\"\n stroke-width=\"0\"\n />\n </ng-container>\n </g>\n <g *ngFor=\"let gradient of d.gradients; let i = index\">\n <ng-container *ngFor=\"let rect of gradient; let j = index\">\n <defs>\n <linearGradient\n [attr.id]=\"'grad-' + i + '-' + j\"\n x1=\"0\"\n y1=\"0\"\n x2=\"0\"\n y2=\"1\"\n >\n <stop offset=\"0%\" [attr.stop-color]=\"varColor(d.colors, i)\" />\n <stop offset=\"100%\" stop-color=\"white\" />\n </linearGradient>\n </defs>\n <rect\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n [attr.fill]=\"'url(#grad-' + i + '-' + j + ')'\"\n opacity=\"0.4\"\n ></rect>\n </ng-container>\n </g>\n <g *ngFor=\"let line of d.lines; let i = index\">\n <path\n [attr.d]=\"line.line\"\n [attr.stroke]=\"varColor(d.colors, i)\"\n fill=\"none\"\n stroke-width=\"2\"\n [attr.stroke-linecap]=\"\n line.pattern === 'dots' ? 'round' : undefined\n \"\n [attr.stroke-linejoin]=\"\n line.pattern === 'dots' ? 'round' : undefined\n \"\n [attr.stroke-dasharray]=\"\n line.pattern === 'striped'\n ? '10 10'\n : line.pattern === 'dots'\n ? '0.25 7'\n : undefined\n \"\n ></path>\n </g>\n <g *ngFor=\"let lineSinglePointFallback of d.circles; let i = index\">\n <circle\n class=\"marker\"\n [attr.cx]=\"lineSinglePointFallback.cx\"\n [attr.cy]=\"lineSinglePointFallback.cy\"\n r=\"3.5\"\n stroke-width=\"2\"\n [attr.stroke]=\"varColor(d.colors, i)\"\n ></circle>\n </g>\n <g *ngFor=\"let line of d.lines; let i = index\">\n <ng-container *ngIf=\"standardHoverDataGuard(hover) as hoverData\">\n <circle\n class=\"marker\"\n *ngIf=\"config.groupedTooltip || i === hoverData?.visibleYIndex\"\n [attr.cx]=\"hoverData?.x\"\n [attr.cy]=\"hoverData?.ys?.[i]\"\n r=\"3.5\"\n stroke-width=\"2\"\n [attr.stroke]=\"varColor(d.colors, i)\"\n ></circle>\n </ng-container>\n </g>\n <g *ngFor=\"let area of d.areas; let i = index\">\n <path [attr.d]=\"area.area\" [attr.fill]=\"varColor(d.colors, i)\"></path>\n <path\n *ngIf=\"area.pattern === 'striped'\"\n [attr.d]=\"area.area\"\n fill=\"url(#stripes)\"\n ></path>\n </g>\n <g *ngFor=\"let area of d.areas; let i = index\">\n <ng-container *ngIf=\"standardHoverDataGuard(hover) as hoverData\">\n <circle\n class=\"marker\"\n *ngIf=\"config.groupedTooltip || i === hoverData?.visibleYIndex\"\n [attr.cx]=\"hoverData?.x\"\n [attr.cy]=\"hoverData?.ys?.[i]\"\n r=\"3.5\"\n stroke-width=\"2\"\n [attr.stroke]=\"varColor(d.colors, i)\"\n ></circle>\n </ng-container>\n </g>\n <g *ngFor=\"let wLine of d.waterfallLines\">\n <line\n class=\"waterfall-line\"\n [attr.x1]=\"wLine.x1\"\n [attr.x2]=\"wLine.x2\"\n [attr.y1]=\"wLine.y1\"\n [attr.y2]=\"wLine.y2\"\n stroke-width=\"1\"\n stroke-dasharray=\"6\"\n />\n </g>\n <path\n *ngFor=\"let path of d.arcs; let i = index\"\n [attr.d]=\"path\"\n [attr.fill]=\"varColor(d.colors, i)\"\n ></path>\n <g *ngFor=\"let dataLabel of d.dataLabels; let i = index\">\n <text\n *ngIf=\"config.showDataLabels && dataLabel.label\"\n [ngClass]=\"getDataLabelClass(dataLabel, config, hover)\"\n [attr.y]=\"dataLabel.yPos\"\n [attr.x]=\"dataLabel.xPos\"\n [attr.text-anchor]=\"dataLabel.anchor\"\n [attr.font-weight]=\"\n dataLabel.bold\n ? 'var(--font-weight-heavy)'\n : 'var(--font-weight-normal)'\n \"\n [attr.opacity]=\"getDataLabelOpacity(dataLabel, config, hover)\"\n >\n {{ dataLabel.label }}\n </text>\n <line\n *ngIf=\"dataLabel.line && config.showDataLabels\"\n [attr.y1]=\"dataLabel.line.y1\"\n [attr.y2]=\"dataLabel.line.y2\"\n [attr.x1]=\"dataLabel.line.x1\"\n [attr.x2]=\"dataLabel.line.x2\"\n stroke-width=\"2\"\n [attr.stroke]=\"varColor(d.colors, i)\"\n ></line>\n </g>\n <g *ngFor=\"let connection of d.flowConnections\">\n <path\n [attr.d]=\"connection.path\"\n [attr.fill]=\"getConnectionColor()\"\n [attr.opacity]=\"getConnectionOpacity(connection, hover)\"\n />\n </g>\n </svg:svg>\n <div *ngIf=\"config.type === 'donut'\" class=\"donut-display\">\n <div class=\"donut-value\" [ngClass]=\"config.donutDisplayInfo.size\">\n {{ config.donutDisplayInfo.displayValue }}\n </div>\n <div class=\"donut-label\">\n {{ config.donutDisplayInfo.displayLabel }}\n </div>\n </div>\n <ng-container *ngIf=\"standardHoverDataGuard(hover) as hoverData\">\n <riv-callout\n *riv-overlay\n [anchor]=\"\n hoverData?.tooltip?.anchor ? hoverData.tooltip.anchor : null\n \"\n [isModal]=\"false\"\n [preferredPosition]=\"'center-right'\"\n [theme]=\"'light'\"\n >\n <ng-container *ngIf=\"tooltipTemplate; else defaultTooltip\">\n <ng-container\n [ngTemplateOutlet]=\"tooltipTemplate\"\n [ngTemplateOutletContext]=\"{\n xIndex: hoverData?.xIndex,\n yIndex: hoverData?.yIndex,\n isSuppValue: hoverData?.isSuppValue,\n suppYIndex: hoverData?.suppYIndex\n }\"\n ></ng-container>\n </ng-container>\n <ng-template #defaultTooltip>\n <div class=\"callout-content\">\n <div *ngIf=\"hoverData?.tooltip?.date\" class=\"callout-row\">\n {{ hoverData?.tooltip?.date }}\n </div>\n <div\n class=\"callout-row\"\n *ngFor=\"let metric of hoverData?.tooltip?.metrics\"\n >\n <span class=\"series-label\">\n <riv-legend-item\n [colorToken]=\"metric.color\"\n [style]=\"metric.pattern || 'solid'\"\n ></riv-legend-item>\n <span>{{ metric.label }}</span>\n </span>\n <span>{{ metric.value }}</span>\n </div>\n </div>\n </ng-template>\n </riv-callout>\n </ng-container>\n <ng-container *ngIf=\"flowHoverDataGuard(hover) as hoverData\">\n <riv-callout\n *riv-overlay\n [anchor]=\"\n hoverData?.tooltip?.anchor ? hoverData.tooltip.anchor : null\n \"\n [isModal]=\"false\"\n [preferredPosition]=\"'top-center'\"\n [theme]=\"'light'\"\n >\n <div class=\"callout-content\">\n <div class=\"callout-row\">\n <ng-container *ngIf=\"hoverData?.hoverTarget === 'connection'\">\n <ng-container\n *ngIf=\"\n getBucketConfigInfo(hoverData, 'startId') as startConfig\n \"\n >\n <riv-issue\n [label]=\"startConfig.title\"\n [colorToken]=\"startConfig.color\"\n ></riv-issue>\n </ng-container>\n ->\n <ng-container\n *ngIf=\"getBucketConfigInfo(hoverData, 'endId') as endConfig\"\n >\n <riv-issue\n [label]=\"endConfig.title\"\n [colorToken]=\"endConfig.color\"\n ></riv-issue>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"hoverData?.hoverTarget !== 'connection'\">\n <ng-container\n *ngIf=\"getBucketConfigInfo(hoverData, 'barId') as barConfig\"\n >\n <riv-issue\n [label]=\"barConfig.title\"\n [colorToken]=\"barConfig.color\"\n ></riv-issue>\n </ng-container>\n </ng-container>\n </div>\n <div\n *ngIf=\"hoverData?.tooltip?.subtitle\"\n class=\"callout-row flow-subtitle\"\n >\n {{ hoverData?.tooltip?.subtitle }}\n </div>\n </div>\n </riv-callout>\n </ng-container>\n </div>\n <legend *ngIf=\"d.data.type !== 'flow'\">\n <ng-container *ngIf=\"firstHiddenLegendItemIndex$ | async; let fi\">\n <ng-container *ngFor=\"let item of d.data.ys; let i = index\">\n <riv-legend-item\n *ngIf=\"i < fi.dataIndex && item.showLegendItem !== false\"\n [label]=\"item.label\"\n [style]=\"item.pattern || 'solid'\"\n [visibility]=\"item.hidden ? 'hidden' : 'visible'\"\n [clickable]=\"config.allowLegendToggle\"\n [showCheckWhenClickable]=\"item.pattern !== 'dots'\"\n [colorToken]=\"getItemColor(item, i)\"\n (itemClick)=\"toggleLegend(item, i)\"\n ></riv-legend-item>\n </ng-container>\n <ng-container\n *ngFor=\"let item of d.data.supplementaryYs; let i = index\"\n >\n <riv-legend-item\n *ngIf=\"i < fi.suppIndex && item.showLegendItem !== false\"\n [label]=\"item.label\"\n [style]=\"item.pattern || 'solid'\"\n [visibility]=\"item.hidden ? 'hidden' : 'visible'\"\n [clickable]=\"config.allowLegendToggle\"\n [showCheckWhenClickable]=\"item.pattern !== 'dots'\"\n [colorToken]=\"getItemColor(item, i)\"\n (itemClick)=\"toggleLegend(item, i)\"\n ></riv-legend-item>\n </ng-container>\n <div\n #moreTextContainer\n class=\"more-text-container\"\n (mouseover)=\"mouseoverLegend()\"\n (mouseleave)=\"mouseleaveLegend()\"\n (click)=\"moreClick()\"\n *ngIf=\"fi.hiddenCount\"\n >\n <span rivLink class=\"more-text\">\n +\n {{ fi.hiddenCount }} more\n </span>\n </div>\n <ng-container *ngIf=\"showMoreTooltip || lockShowMoreTooltip\">\n <riv-callout\n *riv-overlay\n [anchor]=\"moreTextContainer?.nativeElement\"\n [isModal]=\"lockShowMoreTooltip\"\n (close)=\"closeHandler()\"\n [preferredPosition]=\"'bottom-right'\"\n [theme]=\"'light'\"\n [showCaret]=\"false\"\n >\n <div class=\"legend-tooltip\">\n <ng-container *ngFor=\"let item of d.data.ys; let i = index\">\n <riv-legend-item\n *ngIf=\"i >= fi.dataIndex && item.showLegendItem !== false\"\n [label]=\"item.label\"\n [style]=\"item.pattern || 'solid'\"\n [visibility]=\"item.hidden ? 'hidden' : 'visible'\"\n [clickable]=\"config.allowLegendToggle\"\n [showCheckWhenClickable]=\"item.pattern !== 'dots'\"\n [colorToken]=\"getItemColor(item, i)\"\n (itemClick)=\"toggleLegend(item, i)\"\n ></riv-legend-item>\n </ng-container>\n <ng-container\n *ngFor=\"let item of d.data.supplementaryYs; let i = index\"\n >\n <riv-legend-item\n *ngIf=\"i >= fi.suppIndex && item.showLegendItem !== false\"\n [label]=\"item.label\"\n [style]=\"item.pattern || 'solid'\"\n [visibility]=\"item.hidden ? 'hidden' : 'visible'\"\n [colorToken]=\"getItemColor(item, i)\"\n [clickable]=\"config.allowLegendToggle\"\n [showCheckWhenClickable]=\"item.pattern !== 'dots'\"\n (itemClick)=\"toggleLegend(item, i)\"\n ></riv-legend-item>\n </ng-container>\n </div>\n </riv-callout>\n </ng-container>\n </ng-container>\n </legend>\n </ng-container>\n</div>\n\n<ng-template #nonDisplayState>\n <ng-container *ngIf=\"checkForNonDisplayState(drawData$ | async); let type\">\n <riv-zero-state\n *ngIf=\"type === 'zeroState'\"\n [message]=\"config.zeroStateMessage\"\n ></riv-zero-state>\n <riv-zero-state\n *ngIf=\"type === 'sizingErrorState'\"\n [message]=\"config.sizingErrorStateMessage\"\n ></riv-zero-state>\n </ng-container>\n</ng-template>\n", styles: [".container{-webkit-user-select:none;user-select:none;position:relative;display:flex;flex-direction:column;gap:var(--size-small)}.tick-line{stroke:var(--gray-20)}.tick-label{font-size:var(--override-font-size);line-height:var(--type-1-line-height-0);fill:var(--type-light-low-contrast)}.marker{fill:var(--surface-light-0)}.callout-content{pointer-events:none;padding:var(--size-medium) var(--size-xlarge);display:flex;flex-direction:column}.callout-row{white-space:nowrap;display:flex;padding:var(--size-medium) 0;gap:var(--size-medium);align-items:center;font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-0)}.callout-row:not(:last-child){border-bottom:var(--border-width) solid var(--border-light)}.series-label{flex-grow:1;font-weight:var(--font-weight-heavy);display:flex;align-items:center;gap:var(--size-small)}legend{display:flex;flex-wrap:wrap;gap:var(--size-large);justify-content:flex-start;align-items:baseline;width:100%}.more-text-container{width:calc(var(--base-grid-size) * 15);height:var(--size-large)}.more-text{font-size:var(--type-1-font-size);top:calc(var(--base-grid-size) * -1);position:relative}.legend-tooltip{padding:var(--size-medium) var(--size-xlarge);display:flex;flex-direction:column;overflow-y:scroll;max-height:clamp(0px,60vh,600px)}.legend-tooltip>riv-legend-item{white-space:nowrap;display:flex;padding:var(--size-medium) 0;gap:var(--size-medium);align-items:center;line-height:var(--type-1-line-height-0)}.sub-container.clickable{cursor:pointer}.sub-container{display:grid;grid-template-rows:1fr;grid-template-columns:1fr;overflow:auto}.sub-container:not(.donut-container){justify-items:start;align-items:start}.sub-container.donut-container{justify-items:center;align-items:center}svg{grid-row:1 / 1;grid-column:1 / 1}.donut-display{grid-row:1 / 1;grid-column:1 / 1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--size-small)}.donut-label{font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-0);color:var(--type-light-low-contrast)}.donut-value,.donut-label{text-shadow:0 0 var(--size-small) var(--surface-light-0),0 0 var(--size-xsmall) var(--surface-light-0)}.donut-value.xsmall{font:var(--stat-xsmall)}.donut-value.small{font:var(--stat-small)}.donut-value.medium{font:var(--stat-medium)}.donut-value.large{font:var(--stat-large)}.data-label{fill:var(--type-light-high-contrast);font-size:var(--override-font-size)}.flow-data-label{text-decoration:underline;font-size:var(--override-font-size);cursor:pointer;fill:var(--type-light-link-hover)}.waterfall-line{stroke:var(--gray-60)}.flow-subtitle{font-weight:var(--font-weight-heavy)}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i2.CalloutComponent, selector: "riv-callout", inputs: ["anchor", "isModal", "preferredPosition", "allowedPositions", "fallbackDirection", "showCaret", "theme"], outputs: ["close"] }, { kind: "component", type: i3.IssueComponent, selector: "riv-issue", inputs: ["label", "colorToken", "textColorOverride"] }, { kind: "component", type: i4.LegendItemComponent, selector: "riv-legend-item", inputs: ["label", "colorToken", "style", "visibility", "iconTooltip", "clickable", "showCheckWhenClickable"], outputs: ["itemClick"] }, { kind: "component", type: i5.LinkComponent, selector: "[rivLink]", inputs: ["disabled", "locked", "theme", "variant"] }, { kind: "directive", type: i6.OverlayDirective, selector: "[riv-overlay]" }, { kind: "directive", type: i7.SizeDirective, selector: "[rivClientSize]", outputs: ["rivClientSize"] }, { kind: "directive", type: i8.SVGTextTruncateDirective, selector: "svg text[rivSVGTextTruncate]", inputs: ["text", "width"] }, { kind: "component", type: i9.ZeroStateComponent, selector: "riv-zero-state", inputs: ["message", "title", "icon"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
578
|
+
ChartComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: ChartComponent, selector: "riv-chart", inputs: { height: "height", width: "width", overrideHeight: "overrideHeight", overrideWidth: "overrideWidth", config: "config", data: "data" }, outputs: { chartClicked: "chartClicked" }, queries: [{ propertyName: "tooltipTemplate", first: true, predicate: ["tooltip"], descendants: true }], viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true }, { propertyName: "moreTextContainer", first: true, predicate: ["moreTextContainer"], descendants: true }], ngImport: i0, template: "<div\n class=\"container\"\n (rivClientSize)=\"width = $event.width\"\n *ngIf=\"{ d: drawData$ | async } as vm\"\n [style.--override-font-size]=\"getFontSize(vm.d)\"\n>\n <ng-container\n *ngIf=\"\n !checkForNonDisplayState(vm.d) && (drawData$ | async);\n let d;\n else: nonDisplayState\n \"\n >\n <div\n (mousemove)=\"mousemove($event, d.hover)\"\n (mouseleave)=\"mouseleave($event)\"\n (click)=\"click()\"\n #container\n class=\"sub-container\"\n [class.clickable]=\"isHoverClickable\"\n tabIndex=\"0\"\n [ngClass]=\"{ 'donut-container': config.type === 'donut' }\"\n [ngStyle]=\"{\n height: getSubcontainerHeight(d),\n width: getSubcontainerWidth(d)\n }\"\n >\n <svg:svg\n xmlns=\"http://www.w3.org/2000/svg\"\n [attr.viewBox]=\"d.viewBox\"\n [attr.height]=\"d.chartHeight\"\n [attr.width]=\"d.chartWidth\"\n >\n <defs>\n <!-- Stripe pattern -->\n <pattern\n id=\"stripes\"\n x=\"0\"\n y=\"0\"\n [attr.width]=\"10\"\n [attr.height]=\"10\"\n patternUnits=\"userSpaceOnUse\"\n >\n <line\n [attr.x1]=\"0\"\n [attr.y1]=\"10\"\n [attr.x2]=\"10\"\n [attr.y2]=\"0\"\n stroke=\"var(--white-100)\"\n stroke-width=\"1\"\n ></line>\n </pattern>\n </defs>\n <ng-container *ngIf=\"!(config.type === 'horizontal-bar')\">\n <g *ngFor=\"let tick of d.xTicks\" text-anchor=\"middle\">\n <text\n class=\"tick-label\"\n [attr.x]=\"tick.x\"\n [attr.y]=\"getBottomLabelY(d)\"\n >\n {{ tick.label }}\n </text>\n </g>\n </ng-container>\n <ng-container *ngIf=\"config.type === 'horizontal-bar'\">\n <g *ngFor=\"let tick of d.xTicks\" text-anchor=\"left\">\n <text\n class=\"tick-label\"\n [attr.x]=\"tick.x\"\n [attr.y]=\"d.chartSizingValues.fontSize\"\n >\n {{ tick.label }}\n </text>\n <line\n class=\"tick-line\"\n [attr.x1]=\"tick.x\"\n [attr.x2]=\"tick.x\"\n y1=\"0\"\n [attr.y2]=\"d.chartHeight\"\n ></line>\n <text\n *ngIf=\"tick.secondaryLabel\"\n class=\"tick-label\"\n [attr.x]=\"tick.x\"\n [attr.y]=\"getBottomLabelY(d)\"\n >\n {{ tick.secondaryLabel }}\n </text>\n </g>\n </ng-container>\n <g *ngFor=\"let tick of d.yTicks\">\n <line\n *ngIf=\"!(config.type === 'horizontal-bar')\"\n class=\"tick-line\"\n [attr.y1]=\"tick.y\"\n [attr.y2]=\"tick.y\"\n x1=\"0\"\n [attr.x2]=\"d.chartWidth\"\n ></line>\n <text\n rivSVGTextTruncate\n [text]=\"tick.label\"\n [width]=\"\n config.type === 'horizontal-bar'\n ? d.chartSizingValues.leftBucketLabel\n : d.chartSizingValues.leftPadding\n \"\n class=\"tick-label\"\n [attr.y]=\"tick.y\"\n [attr.x]=\"0\"\n >\n {{ tick.label }}\n </text>\n <text\n *ngIf=\"tick.secondaryLabel\"\n rivSVGTextTruncate\n [text]=\"tick.secondaryLabel\"\n [width]=\"d.chartSizingValues.rightPadding\"\n class=\"tick-label\"\n [attr.y]=\"tick.y\"\n [attr.x]=\"d.chartWidth\"\n text-anchor=\"end\"\n >\n {{ tick.secondaryLabel }}\n </text>\n </g>\n <ng-container *ngIf=\"standardHoverDataGuard(hover) as hoverData\">\n <g\n *ngIf=\"config.type !== 'horizontal-bar' && config.type !== 'donut'\"\n >\n <line\n class=\"tick-line\"\n [attr.x1]=\"hoverData?.x\"\n [attr.x2]=\"hoverData?.x\"\n y1=\"0\"\n [attr.y2]=\"d.chartHeight\"\n stroke-width=\"2\"\n stroke-dasharray=\"4\"\n />\n </g>\n </ng-container>\n <g *ngFor=\"let bar of d.bars; let i = index\">\n <ng-container *ngFor=\"let rect of bar; let j = index\">\n <defs *ngIf=\"rect.pattern === 'dots'\">\n <pattern\n [attr.id]=\"'dots-' + i + '-' + j\"\n patternUnits=\"userSpaceOnUse\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n width=\"4\"\n height=\"4\"\n >\n <circle\n cx=\"2\"\n cy=\"2\"\n r=\"1.5\"\n [attr.fill]=\"varColor(d.colors, i)\"\n ></circle>\n </pattern>\n </defs>\n\n <rect\n *ngIf=\"rect.nonDisplay !== true\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n [attr.fill]=\"\n rect.pattern === 'dots'\n ? 'url(#dots-' + i + '-' + j + ')'\n : getBarColor(rect, d.colors, i, hover)\n \"\n [attr.stroke]=\"\n showBarBorders(rect, hover) ? varWrap('--black-100') : undefined\n \"\n [attr.stroke-width]=\"showBarBorders(rect, hover) ? 1 : undefined\"\n ></rect>\n <rect\n *ngIf=\"showNonDisplayRect(rect, hover)\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n fill=\"transparent\"\n [attr.stroke]=\"varWrap('--black-100')\"\n [attr.stroke-width]=\"1\"\n ></rect>\n <rect\n *ngIf=\"rect.pattern === 'striped'\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n fill=\"url(#stripes)\"\n ></rect>\n </ng-container>\n </g>\n <g *ngFor=\"let bar of d.horizontalBars; let i = index\">\n <ng-container *ngFor=\"let indBar of bar; let j = index\">\n <defs *ngIf=\"indBar.pattern === 'dots'\">\n <pattern\n [attr.id]=\"'dots-' + i + '-' + j\"\n patternUnits=\"userSpaceOnUse\"\n [attr.x]=\"indBar.x\"\n [attr.y]=\"indBar.y\"\n width=\"4\"\n height=\"4\"\n >\n <circle\n cx=\"2\"\n cy=\"2\"\n r=\"1.5\"\n [attr.fill]=\"varColor(d.colors, i)\"\n ></circle>\n </pattern>\n </defs>\n <path\n [attr.d]=\"indBar.horizontalBar\"\n [attr.fill]=\"\n indBar.pattern === 'dots'\n ? 'url(#dots-' + i + '-' + j + ')'\n : varColor(d.colors, i)\n \"\n [attr.stroke]=\"\n indBar.pattern === 'dots' ? 'none' : varColor(d.colors, i)\n \"\n [attr.stroke-width]=\"indBar.pattern === 'dots' ? 0 : 2\"\n />\n <path\n *ngIf=\"indBar.pattern === 'striped'\"\n [attr.d]=\"indBar.horizontalBar\"\n [attr.stroke]=\"varColor(d.colors, i)\"\n fill=\"url(#stripes)\"\n stroke-width=\"0\"\n />\n </ng-container>\n </g>\n <g *ngFor=\"let gradient of d.gradients; let i = index\">\n <ng-container *ngFor=\"let rect of gradient; let j = index\">\n <defs>\n <linearGradient\n [attr.id]=\"'grad-' + i + '-' + j\"\n x1=\"0\"\n y1=\"0\"\n x2=\"0\"\n y2=\"1\"\n >\n <stop offset=\"0%\" [attr.stop-color]=\"varColor(d.colors, i)\" />\n <stop offset=\"100%\" stop-color=\"white\" />\n </linearGradient>\n </defs>\n <rect\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n [attr.fill]=\"'url(#grad-' + i + '-' + j + ')'\"\n opacity=\"0.4\"\n ></rect>\n </ng-container>\n </g>\n <g *ngFor=\"let line of d.lines; let i = index\">\n <path\n [attr.d]=\"line.line\"\n [attr.stroke]=\"varColor(d.colors, i)\"\n fill=\"none\"\n stroke-width=\"2\"\n [attr.stroke-linecap]=\"\n line.pattern === 'dots' ? 'round' : undefined\n \"\n [attr.stroke-linejoin]=\"\n line.pattern === 'dots' ? 'round' : undefined\n \"\n [attr.stroke-dasharray]=\"\n line.pattern === 'striped'\n ? '10 10'\n : line.pattern === 'dots'\n ? '0.25 7'\n : undefined\n \"\n ></path>\n </g>\n <g *ngFor=\"let lineSinglePointFallback of d.circles; let i = index\">\n <circle\n class=\"marker\"\n [attr.cx]=\"lineSinglePointFallback.cx\"\n [attr.cy]=\"lineSinglePointFallback.cy\"\n r=\"3.5\"\n stroke-width=\"2\"\n [attr.stroke]=\"varColor(d.colors, i)\"\n ></circle>\n </g>\n <g *ngFor=\"let line of d.lines; let i = index\">\n <ng-container *ngIf=\"standardHoverDataGuard(hover) as hoverData\">\n <circle\n class=\"marker\"\n *ngIf=\"config.groupedTooltip || i === hoverData?.visibleYIndex\"\n [attr.cx]=\"hoverData?.x\"\n [attr.cy]=\"hoverData?.ys?.[i]\"\n r=\"3.5\"\n stroke-width=\"2\"\n [attr.stroke]=\"varColor(d.colors, i)\"\n ></circle>\n </ng-container>\n </g>\n <g *ngFor=\"let area of d.areas; let i = index\">\n <path [attr.d]=\"area.area\" [attr.fill]=\"varColor(d.colors, i)\"></path>\n <path\n *ngIf=\"area.pattern === 'striped'\"\n [attr.d]=\"area.area\"\n fill=\"url(#stripes)\"\n ></path>\n </g>\n <g *ngFor=\"let area of d.areas; let i = index\">\n <ng-container *ngIf=\"standardHoverDataGuard(hover) as hoverData\">\n <circle\n class=\"marker\"\n *ngIf=\"config.groupedTooltip || i === hoverData?.visibleYIndex\"\n [attr.cx]=\"hoverData?.x\"\n [attr.cy]=\"hoverData?.ys?.[i]\"\n r=\"3.5\"\n stroke-width=\"2\"\n [attr.stroke]=\"varColor(d.colors, i)\"\n ></circle>\n </ng-container>\n </g>\n <g *ngFor=\"let wLine of d.waterfallLines\">\n <line\n class=\"waterfall-line\"\n [attr.x1]=\"wLine.x1\"\n [attr.x2]=\"wLine.x2\"\n [attr.y1]=\"wLine.y1\"\n [attr.y2]=\"wLine.y2\"\n stroke-width=\"1\"\n stroke-dasharray=\"6\"\n />\n </g>\n <path\n *ngFor=\"let path of d.arcs; let i = index\"\n [attr.d]=\"path\"\n [attr.fill]=\"varColor(d.colors, i)\"\n ></path>\n <g *ngFor=\"let dataLabel of d.dataLabels; let i = index\">\n <text\n *ngIf=\"config.showDataLabels && dataLabel.label\"\n [ngClass]=\"getDataLabelClass(dataLabel, config, hover)\"\n [attr.y]=\"dataLabel.yPos\"\n [attr.x]=\"dataLabel.xPos\"\n [attr.text-anchor]=\"dataLabel.anchor\"\n [attr.font-weight]=\"\n dataLabel.bold\n ? 'var(--font-weight-heavy)'\n : 'var(--font-weight-normal)'\n \"\n [attr.opacity]=\"getDataLabelOpacity(dataLabel, config, hover)\"\n >\n {{ dataLabel.label }}\n </text>\n <line\n *ngIf=\"dataLabel.line && config.showDataLabels\"\n [attr.y1]=\"dataLabel.line.y1\"\n [attr.y2]=\"dataLabel.line.y2\"\n [attr.x1]=\"dataLabel.line.x1\"\n [attr.x2]=\"dataLabel.line.x2\"\n stroke-width=\"2\"\n [attr.stroke]=\"varColor(d.colors, i)\"\n ></line>\n </g>\n <g *ngFor=\"let connection of d.flowConnections\">\n <path\n [attr.d]=\"connection.path\"\n [attr.fill]=\"getConnectionColor()\"\n [attr.opacity]=\"getConnectionOpacity(connection, hover)\"\n />\n </g>\n </svg:svg>\n <div *ngIf=\"config.type === 'donut'\" class=\"donut-display\">\n <div class=\"donut-value\" [ngClass]=\"config.donutDisplayInfo.size\">\n {{ config.donutDisplayInfo.displayValue }}\n </div>\n <div class=\"donut-label\">\n {{ config.donutDisplayInfo.displayLabel }}\n </div>\n </div>\n <ng-container *ngIf=\"standardHoverDataGuard(hover) as hoverData\">\n <riv-callout\n *riv-overlay\n [anchor]=\"\n hoverData?.tooltip?.anchor ? hoverData.tooltip.anchor : null\n \"\n [isModal]=\"false\"\n [preferredPosition]=\"\n hoverData?.tooltip?.preferredPosition ?? 'center-right'\n \"\n [theme]=\"'light'\"\n >\n <ng-container *ngIf=\"tooltipTemplate; else defaultTooltip\">\n <ng-container\n [ngTemplateOutlet]=\"tooltipTemplate\"\n [ngTemplateOutletContext]=\"{\n xIndex: hoverData?.xIndex,\n yIndex: hoverData?.yIndex,\n isSuppValue: hoverData?.isSuppValue,\n suppYIndex: hoverData?.suppYIndex\n }\"\n ></ng-container>\n </ng-container>\n <ng-template #defaultTooltip>\n <div class=\"callout-content\">\n <div *ngIf=\"hoverData?.tooltip?.date\" class=\"callout-row\">\n {{ hoverData?.tooltip?.date }}\n </div>\n <div\n class=\"callout-row\"\n *ngFor=\"let metric of hoverData?.tooltip?.metrics\"\n >\n <span class=\"series-label\">\n <riv-legend-item\n [colorToken]=\"metric.color\"\n [style]=\"metric.pattern || 'solid'\"\n ></riv-legend-item>\n <span>{{ metric.label }}</span>\n </span>\n <span>{{ metric.value }}</span>\n </div>\n </div>\n </ng-template>\n </riv-callout>\n </ng-container>\n <ng-container *ngIf=\"flowHoverDataGuard(hover) as hoverData\">\n <riv-callout\n *riv-overlay\n [anchor]=\"\n hoverData?.tooltip?.anchor ? hoverData.tooltip.anchor : null\n \"\n [isModal]=\"false\"\n [preferredPosition]=\"'top-center'\"\n [theme]=\"'light'\"\n >\n <div class=\"callout-content\">\n <div class=\"callout-row\">\n <ng-container *ngIf=\"hoverData?.hoverTarget === 'connection'\">\n <ng-container\n *ngIf=\"\n getBucketConfigInfo(hoverData, 'startId') as startConfig\n \"\n >\n <riv-issue\n [label]=\"startConfig.title\"\n [colorToken]=\"startConfig.color\"\n ></riv-issue>\n </ng-container>\n ->\n <ng-container\n *ngIf=\"getBucketConfigInfo(hoverData, 'endId') as endConfig\"\n >\n <riv-issue\n [label]=\"endConfig.title\"\n [colorToken]=\"endConfig.color\"\n ></riv-issue>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"hoverData?.hoverTarget !== 'connection'\">\n <ng-container\n *ngIf=\"getBucketConfigInfo(hoverData, 'barId') as barConfig\"\n >\n <riv-issue\n [label]=\"barConfig.title\"\n [colorToken]=\"barConfig.color\"\n ></riv-issue>\n </ng-container>\n </ng-container>\n </div>\n <div\n *ngIf=\"hoverData?.tooltip?.subtitle\"\n class=\"callout-row flow-subtitle\"\n >\n {{ hoverData?.tooltip?.subtitle }}\n </div>\n </div>\n </riv-callout>\n </ng-container>\n </div>\n <legend *ngIf=\"d.data.type !== 'flow'\">\n <ng-container *ngIf=\"firstHiddenLegendItemIndex$ | async; let fi\">\n <ng-container *ngFor=\"let item of d.data.ys; let i = index\">\n <riv-legend-item\n *ngIf=\"i < fi.dataIndex && item.showLegendItem !== false\"\n [label]=\"item.label\"\n [style]=\"item.pattern || 'solid'\"\n [visibility]=\"item.hidden ? 'hidden' : 'visible'\"\n [clickable]=\"config.allowLegendToggle\"\n [showCheckWhenClickable]=\"item.pattern !== 'dots'\"\n [colorToken]=\"getItemColor(item, i)\"\n (itemClick)=\"toggleLegend(item, i)\"\n ></riv-legend-item>\n </ng-container>\n <ng-container\n *ngFor=\"let item of d.data.supplementaryYs; let i = index\"\n >\n <riv-legend-item\n *ngIf=\"i < fi.suppIndex && item.showLegendItem !== false\"\n [label]=\"item.label\"\n [style]=\"item.pattern || 'solid'\"\n [visibility]=\"item.hidden ? 'hidden' : 'visible'\"\n [clickable]=\"config.allowLegendToggle\"\n [showCheckWhenClickable]=\"item.pattern !== 'dots'\"\n [colorToken]=\"getItemColor(item, i)\"\n (itemClick)=\"toggleLegend(item, i)\"\n ></riv-legend-item>\n </ng-container>\n <div\n #moreTextContainer\n class=\"more-text-container\"\n (mouseover)=\"mouseoverLegend()\"\n (mouseleave)=\"mouseleaveLegend()\"\n (click)=\"moreClick()\"\n *ngIf=\"fi.hiddenCount\"\n >\n <span rivLink class=\"more-text\">\n +\n {{ fi.hiddenCount }} more\n </span>\n </div>\n <ng-container *ngIf=\"showMoreTooltip || lockShowMoreTooltip\">\n <riv-callout\n *riv-overlay\n [anchor]=\"moreTextContainer?.nativeElement\"\n [isModal]=\"lockShowMoreTooltip\"\n (close)=\"closeHandler()\"\n [preferredPosition]=\"'bottom-right'\"\n [theme]=\"'light'\"\n [showCaret]=\"false\"\n >\n <div class=\"legend-tooltip\">\n <ng-container *ngFor=\"let item of d.data.ys; let i = index\">\n <riv-legend-item\n *ngIf=\"i >= fi.dataIndex && item.showLegendItem !== false\"\n [label]=\"item.label\"\n [style]=\"item.pattern || 'solid'\"\n [visibility]=\"item.hidden ? 'hidden' : 'visible'\"\n [clickable]=\"config.allowLegendToggle\"\n [showCheckWhenClickable]=\"item.pattern !== 'dots'\"\n [colorToken]=\"getItemColor(item, i)\"\n (itemClick)=\"toggleLegend(item, i)\"\n ></riv-legend-item>\n </ng-container>\n <ng-container\n *ngFor=\"let item of d.data.supplementaryYs; let i = index\"\n >\n <riv-legend-item\n *ngIf=\"i >= fi.suppIndex && item.showLegendItem !== false\"\n [label]=\"item.label\"\n [style]=\"item.pattern || 'solid'\"\n [visibility]=\"item.hidden ? 'hidden' : 'visible'\"\n [colorToken]=\"getItemColor(item, i)\"\n [clickable]=\"config.allowLegendToggle\"\n [showCheckWhenClickable]=\"item.pattern !== 'dots'\"\n (itemClick)=\"toggleLegend(item, i)\"\n ></riv-legend-item>\n </ng-container>\n </div>\n </riv-callout>\n </ng-container>\n </ng-container>\n </legend>\n </ng-container>\n</div>\n\n<ng-template #nonDisplayState>\n <ng-container *ngIf=\"checkForNonDisplayState(drawData$ | async); let type\">\n <riv-zero-state\n *ngIf=\"type === 'zeroState'\"\n [message]=\"config.zeroStateMessage\"\n ></riv-zero-state>\n <riv-zero-state\n *ngIf=\"type === 'sizingErrorState'\"\n [message]=\"config.sizingErrorStateMessage\"\n ></riv-zero-state>\n </ng-container>\n</ng-template>\n", styles: [".container{-webkit-user-select:none;user-select:none;position:relative;display:flex;flex-direction:column;gap:var(--size-small)}.tick-line{stroke:var(--gray-20)}.tick-label{font-size:var(--override-font-size);line-height:var(--type-1-line-height-0);fill:var(--type-light-low-contrast)}.marker{fill:var(--surface-light-0)}.callout-content{pointer-events:none;padding:var(--size-medium) var(--size-xlarge);display:flex;flex-direction:column}.callout-row{white-space:nowrap;display:flex;padding:var(--size-medium) 0;gap:var(--size-medium);align-items:center;font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-0)}.callout-row:not(:last-child){border-bottom:var(--border-width) solid var(--border-light)}.series-label{flex-grow:1;font-weight:var(--font-weight-heavy);display:flex;align-items:center;gap:var(--size-small)}legend{display:flex;flex-wrap:wrap;gap:var(--size-large);justify-content:flex-start;align-items:baseline;width:100%}.more-text-container{width:calc(var(--base-grid-size) * 15);height:var(--size-large)}.more-text{font-size:var(--type-1-font-size);top:calc(var(--base-grid-size) * -1);position:relative}.legend-tooltip{padding:var(--size-medium) var(--size-xlarge);display:flex;flex-direction:column;overflow-y:scroll;max-height:clamp(0px,60vh,600px)}.legend-tooltip>riv-legend-item{white-space:nowrap;display:flex;padding:var(--size-medium) 0;gap:var(--size-medium);align-items:center;line-height:var(--type-1-line-height-0)}.sub-container.clickable{cursor:pointer}.sub-container{display:grid;grid-template-rows:1fr;grid-template-columns:1fr;overflow:auto}.sub-container:not(.donut-container){justify-items:start;align-items:start}.sub-container.donut-container{justify-items:center;align-items:center}svg{grid-row:1 / 1;grid-column:1 / 1}.donut-display{grid-row:1 / 1;grid-column:1 / 1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--size-small)}.donut-label{font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-0);color:var(--type-light-low-contrast)}.donut-value,.donut-label{text-shadow:0 0 var(--size-small) var(--surface-light-0),0 0 var(--size-xsmall) var(--surface-light-0)}.donut-value.xsmall{font:var(--stat-xsmall)}.donut-value.small{font:var(--stat-small)}.donut-value.medium{font:var(--stat-medium)}.donut-value.large{font:var(--stat-large)}.data-label{fill:var(--type-light-high-contrast);font-size:var(--override-font-size)}.flow-data-label{text-decoration:underline;font-size:var(--override-font-size);cursor:pointer;fill:var(--type-light-link-hover)}.waterfall-line{stroke:var(--gray-60)}.flow-subtitle{font-weight:var(--font-weight-heavy)}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i2.CalloutComponent, selector: "riv-callout", inputs: ["anchor", "isModal", "preferredPosition", "allowedPositions", "fallbackDirection", "showCaret", "theme"], outputs: ["close"] }, { kind: "component", type: i3.IssueComponent, selector: "riv-issue", inputs: ["label", "colorToken", "textColorOverride"] }, { kind: "component", type: i4.LegendItemComponent, selector: "riv-legend-item", inputs: ["label", "colorToken", "style", "visibility", "iconTooltip", "clickable", "showCheckWhenClickable"], outputs: ["itemClick"] }, { kind: "component", type: i5.LinkComponent, selector: "[rivLink]", inputs: ["disabled", "locked", "theme", "variant"] }, { kind: "directive", type: i6.OverlayDirective, selector: "[riv-overlay]" }, { kind: "directive", type: i7.SizeDirective, selector: "[rivClientSize]", outputs: ["rivClientSize"] }, { kind: "directive", type: i8.SVGTextTruncateDirective, selector: "svg text[rivSVGTextTruncate]", inputs: ["text", "width"] }, { kind: "component", type: i9.ZeroStateComponent, selector: "riv-zero-state", inputs: ["message", "title", "icon"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
579
579
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ChartComponent, decorators: [{
|
|
580
580
|
type: Component,
|
|
581
|
-
args: [{ selector: 'riv-chart', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n class=\"container\"\n (rivClientSize)=\"width = $event.width\"\n *ngIf=\"{ d: drawData$ | async } as vm\"\n [style.--override-font-size]=\"getFontSize(vm.d)\"\n>\n <ng-container\n *ngIf=\"\n !checkForNonDisplayState(vm.d) && (drawData$ | async);\n let d;\n else: nonDisplayState\n \"\n >\n <div\n (mousemove)=\"mousemove($event, d.hover)\"\n (mouseleave)=\"mouseleave($event)\"\n (click)=\"click()\"\n #container\n class=\"sub-container\"\n [class.clickable]=\"isHoverClickable\"\n tabIndex=\"0\"\n [ngClass]=\"{ 'donut-container': config.type === 'donut' }\"\n [ngStyle]=\"{\n height: getSubcontainerHeight(d),\n width: getSubcontainerWidth(d)\n }\"\n >\n <svg:svg\n xmlns=\"http://www.w3.org/2000/svg\"\n [attr.viewBox]=\"d.viewBox\"\n [attr.height]=\"d.chartHeight\"\n [attr.width]=\"d.chartWidth\"\n >\n <defs>\n <!-- Stripe pattern -->\n <pattern\n id=\"stripes\"\n x=\"0\"\n y=\"0\"\n [attr.width]=\"10\"\n [attr.height]=\"10\"\n patternUnits=\"userSpaceOnUse\"\n >\n <line\n [attr.x1]=\"0\"\n [attr.y1]=\"10\"\n [attr.x2]=\"10\"\n [attr.y2]=\"0\"\n stroke=\"var(--white-100)\"\n stroke-width=\"1\"\n ></line>\n </pattern>\n </defs>\n <ng-container *ngIf=\"!(config.type === 'horizontal-bar')\">\n <g *ngFor=\"let tick of d.xTicks\" text-anchor=\"middle\">\n <text\n class=\"tick-label\"\n [attr.x]=\"tick.x\"\n [attr.y]=\"getBottomLabelY(d)\"\n >\n {{ tick.label }}\n </text>\n </g>\n </ng-container>\n <ng-container *ngIf=\"config.type === 'horizontal-bar'\">\n <g *ngFor=\"let tick of d.xTicks\" text-anchor=\"left\">\n <text\n class=\"tick-label\"\n [attr.x]=\"tick.x\"\n [attr.y]=\"d.chartSizingValues.fontSize\"\n >\n {{ tick.label }}\n </text>\n <line\n class=\"tick-line\"\n [attr.x1]=\"tick.x\"\n [attr.x2]=\"tick.x\"\n y1=\"0\"\n [attr.y2]=\"d.chartHeight\"\n ></line>\n <text\n *ngIf=\"tick.secondaryLabel\"\n class=\"tick-label\"\n [attr.x]=\"tick.x\"\n [attr.y]=\"getBottomLabelY(d)\"\n >\n {{ tick.secondaryLabel }}\n </text>\n </g>\n </ng-container>\n <g *ngFor=\"let tick of d.yTicks\">\n <line\n *ngIf=\"!(config.type === 'horizontal-bar')\"\n class=\"tick-line\"\n [attr.y1]=\"tick.y\"\n [attr.y2]=\"tick.y\"\n x1=\"0\"\n [attr.x2]=\"d.chartWidth\"\n ></line>\n <text\n rivSVGTextTruncate\n [text]=\"tick.label\"\n [width]=\"\n config.type === 'horizontal-bar'\n ? d.chartSizingValues.leftBucketLabel\n : d.chartSizingValues.leftPadding\n \"\n class=\"tick-label\"\n [attr.y]=\"tick.y\"\n [attr.x]=\"0\"\n >\n {{ tick.label }}\n </text>\n <text\n *ngIf=\"tick.secondaryLabel\"\n rivSVGTextTruncate\n [text]=\"tick.secondaryLabel\"\n [width]=\"d.chartSizingValues.rightPadding\"\n class=\"tick-label\"\n [attr.y]=\"tick.y\"\n [attr.x]=\"d.chartWidth\"\n text-anchor=\"end\"\n >\n {{ tick.secondaryLabel }}\n </text>\n </g>\n <ng-container *ngIf=\"standardHoverDataGuard(hover) as hoverData\">\n <g *ngIf=\"config.type !== 'horizontal-bar'\">\n <line\n class=\"tick-line\"\n [attr.x1]=\"hoverData?.x\"\n [attr.x2]=\"hoverData?.x\"\n y1=\"0\"\n [attr.y2]=\"d.chartHeight\"\n stroke-width=\"2\"\n stroke-dasharray=\"4\"\n />\n </g>\n </ng-container>\n <g *ngFor=\"let bar of d.bars; let i = index\">\n <ng-container *ngFor=\"let rect of bar; let j = index\">\n <defs *ngIf=\"rect.pattern === 'dots'\">\n <pattern\n [attr.id]=\"'dots-' + i + '-' + j\"\n patternUnits=\"userSpaceOnUse\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n width=\"4\"\n height=\"4\"\n >\n <circle\n cx=\"2\"\n cy=\"2\"\n r=\"1.5\"\n [attr.fill]=\"varColor(d.colors, i)\"\n ></circle>\n </pattern>\n </defs>\n\n <rect\n *ngIf=\"rect.nonDisplay !== true\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n [attr.fill]=\"\n rect.pattern === 'dots'\n ? 'url(#dots-' + i + '-' + j + ')'\n : getBarColor(rect, d.colors, i, hover)\n \"\n [attr.stroke]=\"\n showBarBorders(rect, hover) ? varWrap('--black-100') : undefined\n \"\n [attr.stroke-width]=\"showBarBorders(rect, hover) ? 1 : undefined\"\n ></rect>\n <rect\n *ngIf=\"showNonDisplayRect(rect, hover)\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n fill=\"transparent\"\n [attr.stroke]=\"varWrap('--black-100')\"\n [attr.stroke-width]=\"1\"\n ></rect>\n <rect\n *ngIf=\"rect.pattern === 'striped'\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n fill=\"url(#stripes)\"\n ></rect>\n </ng-container>\n </g>\n <g *ngFor=\"let bar of d.horizontalBars; let i = index\">\n <ng-container *ngFor=\"let indBar of bar; let j = index\">\n <defs *ngIf=\"indBar.pattern === 'dots'\">\n <pattern\n [attr.id]=\"'dots-' + i + '-' + j\"\n patternUnits=\"userSpaceOnUse\"\n [attr.x]=\"indBar.x\"\n [attr.y]=\"indBar.y\"\n width=\"4\"\n height=\"4\"\n >\n <circle\n cx=\"2\"\n cy=\"2\"\n r=\"1.5\"\n [attr.fill]=\"varColor(d.colors, i)\"\n ></circle>\n </pattern>\n </defs>\n <path\n [attr.d]=\"indBar.horizontalBar\"\n [attr.fill]=\"\n indBar.pattern === 'dots'\n ? 'url(#dots-' + i + '-' + j + ')'\n : varColor(d.colors, i)\n \"\n [attr.stroke]=\"\n indBar.pattern === 'dots' ? 'none' : varColor(d.colors, i)\n \"\n [attr.stroke-width]=\"indBar.pattern === 'dots' ? 0 : 2\"\n />\n <path\n *ngIf=\"indBar.pattern === 'striped'\"\n [attr.d]=\"indBar.horizontalBar\"\n [attr.stroke]=\"varColor(d.colors, i)\"\n fill=\"url(#stripes)\"\n stroke-width=\"0\"\n />\n </ng-container>\n </g>\n <g *ngFor=\"let gradient of d.gradients; let i = index\">\n <ng-container *ngFor=\"let rect of gradient; let j = index\">\n <defs>\n <linearGradient\n [attr.id]=\"'grad-' + i + '-' + j\"\n x1=\"0\"\n y1=\"0\"\n x2=\"0\"\n y2=\"1\"\n >\n <stop offset=\"0%\" [attr.stop-color]=\"varColor(d.colors, i)\" />\n <stop offset=\"100%\" stop-color=\"white\" />\n </linearGradient>\n </defs>\n <rect\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n [attr.fill]=\"'url(#grad-' + i + '-' + j + ')'\"\n opacity=\"0.4\"\n ></rect>\n </ng-container>\n </g>\n <g *ngFor=\"let line of d.lines; let i = index\">\n <path\n [attr.d]=\"line.line\"\n [attr.stroke]=\"varColor(d.colors, i)\"\n fill=\"none\"\n stroke-width=\"2\"\n [attr.stroke-linecap]=\"\n line.pattern === 'dots' ? 'round' : undefined\n \"\n [attr.stroke-linejoin]=\"\n line.pattern === 'dots' ? 'round' : undefined\n \"\n [attr.stroke-dasharray]=\"\n line.pattern === 'striped'\n ? '10 10'\n : line.pattern === 'dots'\n ? '0.25 7'\n : undefined\n \"\n ></path>\n </g>\n <g *ngFor=\"let lineSinglePointFallback of d.circles; let i = index\">\n <circle\n class=\"marker\"\n [attr.cx]=\"lineSinglePointFallback.cx\"\n [attr.cy]=\"lineSinglePointFallback.cy\"\n r=\"3.5\"\n stroke-width=\"2\"\n [attr.stroke]=\"varColor(d.colors, i)\"\n ></circle>\n </g>\n <g *ngFor=\"let line of d.lines; let i = index\">\n <ng-container *ngIf=\"standardHoverDataGuard(hover) as hoverData\">\n <circle\n class=\"marker\"\n *ngIf=\"config.groupedTooltip || i === hoverData?.visibleYIndex\"\n [attr.cx]=\"hoverData?.x\"\n [attr.cy]=\"hoverData?.ys?.[i]\"\n r=\"3.5\"\n stroke-width=\"2\"\n [attr.stroke]=\"varColor(d.colors, i)\"\n ></circle>\n </ng-container>\n </g>\n <g *ngFor=\"let area of d.areas; let i = index\">\n <path [attr.d]=\"area.area\" [attr.fill]=\"varColor(d.colors, i)\"></path>\n <path\n *ngIf=\"area.pattern === 'striped'\"\n [attr.d]=\"area.area\"\n fill=\"url(#stripes)\"\n ></path>\n </g>\n <g *ngFor=\"let area of d.areas; let i = index\">\n <ng-container *ngIf=\"standardHoverDataGuard(hover) as hoverData\">\n <circle\n class=\"marker\"\n *ngIf=\"config.groupedTooltip || i === hoverData?.visibleYIndex\"\n [attr.cx]=\"hoverData?.x\"\n [attr.cy]=\"hoverData?.ys?.[i]\"\n r=\"3.5\"\n stroke-width=\"2\"\n [attr.stroke]=\"varColor(d.colors, i)\"\n ></circle>\n </ng-container>\n </g>\n <g *ngFor=\"let wLine of d.waterfallLines\">\n <line\n class=\"waterfall-line\"\n [attr.x1]=\"wLine.x1\"\n [attr.x2]=\"wLine.x2\"\n [attr.y1]=\"wLine.y1\"\n [attr.y2]=\"wLine.y2\"\n stroke-width=\"1\"\n stroke-dasharray=\"6\"\n />\n </g>\n <path\n *ngFor=\"let path of d.arcs; let i = index\"\n [attr.d]=\"path\"\n [attr.fill]=\"varColor(d.colors, i)\"\n ></path>\n <g *ngFor=\"let dataLabel of d.dataLabels; let i = index\">\n <text\n *ngIf=\"config.showDataLabels && dataLabel.label\"\n [ngClass]=\"getDataLabelClass(dataLabel, config, hover)\"\n [attr.y]=\"dataLabel.yPos\"\n [attr.x]=\"dataLabel.xPos\"\n [attr.text-anchor]=\"dataLabel.anchor\"\n [attr.font-weight]=\"\n dataLabel.bold\n ? 'var(--font-weight-heavy)'\n : 'var(--font-weight-normal)'\n \"\n [attr.opacity]=\"getDataLabelOpacity(dataLabel, config, hover)\"\n >\n {{ dataLabel.label }}\n </text>\n <line\n *ngIf=\"dataLabel.line && config.showDataLabels\"\n [attr.y1]=\"dataLabel.line.y1\"\n [attr.y2]=\"dataLabel.line.y2\"\n [attr.x1]=\"dataLabel.line.x1\"\n [attr.x2]=\"dataLabel.line.x2\"\n stroke-width=\"2\"\n [attr.stroke]=\"varColor(d.colors, i)\"\n ></line>\n </g>\n <g *ngFor=\"let connection of d.flowConnections\">\n <path\n [attr.d]=\"connection.path\"\n [attr.fill]=\"getConnectionColor()\"\n [attr.opacity]=\"getConnectionOpacity(connection, hover)\"\n />\n </g>\n </svg:svg>\n <div *ngIf=\"config.type === 'donut'\" class=\"donut-display\">\n <div class=\"donut-value\" [ngClass]=\"config.donutDisplayInfo.size\">\n {{ config.donutDisplayInfo.displayValue }}\n </div>\n <div class=\"donut-label\">\n {{ config.donutDisplayInfo.displayLabel }}\n </div>\n </div>\n <ng-container *ngIf=\"standardHoverDataGuard(hover) as hoverData\">\n <riv-callout\n *riv-overlay\n [anchor]=\"\n hoverData?.tooltip?.anchor ? hoverData.tooltip.anchor : null\n \"\n [isModal]=\"false\"\n [preferredPosition]=\"'center-right'\"\n [theme]=\"'light'\"\n >\n <ng-container *ngIf=\"tooltipTemplate; else defaultTooltip\">\n <ng-container\n [ngTemplateOutlet]=\"tooltipTemplate\"\n [ngTemplateOutletContext]=\"{\n xIndex: hoverData?.xIndex,\n yIndex: hoverData?.yIndex,\n isSuppValue: hoverData?.isSuppValue,\n suppYIndex: hoverData?.suppYIndex\n }\"\n ></ng-container>\n </ng-container>\n <ng-template #defaultTooltip>\n <div class=\"callout-content\">\n <div *ngIf=\"hoverData?.tooltip?.date\" class=\"callout-row\">\n {{ hoverData?.tooltip?.date }}\n </div>\n <div\n class=\"callout-row\"\n *ngFor=\"let metric of hoverData?.tooltip?.metrics\"\n >\n <span class=\"series-label\">\n <riv-legend-item\n [colorToken]=\"metric.color\"\n [style]=\"metric.pattern || 'solid'\"\n ></riv-legend-item>\n <span>{{ metric.label }}</span>\n </span>\n <span>{{ metric.value }}</span>\n </div>\n </div>\n </ng-template>\n </riv-callout>\n </ng-container>\n <ng-container *ngIf=\"flowHoverDataGuard(hover) as hoverData\">\n <riv-callout\n *riv-overlay\n [anchor]=\"\n hoverData?.tooltip?.anchor ? hoverData.tooltip.anchor : null\n \"\n [isModal]=\"false\"\n [preferredPosition]=\"'top-center'\"\n [theme]=\"'light'\"\n >\n <div class=\"callout-content\">\n <div class=\"callout-row\">\n <ng-container *ngIf=\"hoverData?.hoverTarget === 'connection'\">\n <ng-container\n *ngIf=\"\n getBucketConfigInfo(hoverData, 'startId') as startConfig\n \"\n >\n <riv-issue\n [label]=\"startConfig.title\"\n [colorToken]=\"startConfig.color\"\n ></riv-issue>\n </ng-container>\n ->\n <ng-container\n *ngIf=\"getBucketConfigInfo(hoverData, 'endId') as endConfig\"\n >\n <riv-issue\n [label]=\"endConfig.title\"\n [colorToken]=\"endConfig.color\"\n ></riv-issue>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"hoverData?.hoverTarget !== 'connection'\">\n <ng-container\n *ngIf=\"getBucketConfigInfo(hoverData, 'barId') as barConfig\"\n >\n <riv-issue\n [label]=\"barConfig.title\"\n [colorToken]=\"barConfig.color\"\n ></riv-issue>\n </ng-container>\n </ng-container>\n </div>\n <div\n *ngIf=\"hoverData?.tooltip?.subtitle\"\n class=\"callout-row flow-subtitle\"\n >\n {{ hoverData?.tooltip?.subtitle }}\n </div>\n </div>\n </riv-callout>\n </ng-container>\n </div>\n <legend *ngIf=\"d.data.type !== 'flow'\">\n <ng-container *ngIf=\"firstHiddenLegendItemIndex$ | async; let fi\">\n <ng-container *ngFor=\"let item of d.data.ys; let i = index\">\n <riv-legend-item\n *ngIf=\"i < fi.dataIndex && item.showLegendItem !== false\"\n [label]=\"item.label\"\n [style]=\"item.pattern || 'solid'\"\n [visibility]=\"item.hidden ? 'hidden' : 'visible'\"\n [clickable]=\"config.allowLegendToggle\"\n [showCheckWhenClickable]=\"item.pattern !== 'dots'\"\n [colorToken]=\"getItemColor(item, i)\"\n (itemClick)=\"toggleLegend(item, i)\"\n ></riv-legend-item>\n </ng-container>\n <ng-container\n *ngFor=\"let item of d.data.supplementaryYs; let i = index\"\n >\n <riv-legend-item\n *ngIf=\"i < fi.suppIndex && item.showLegendItem !== false\"\n [label]=\"item.label\"\n [style]=\"item.pattern || 'solid'\"\n [visibility]=\"item.hidden ? 'hidden' : 'visible'\"\n [clickable]=\"config.allowLegendToggle\"\n [showCheckWhenClickable]=\"item.pattern !== 'dots'\"\n [colorToken]=\"getItemColor(item, i)\"\n (itemClick)=\"toggleLegend(item, i)\"\n ></riv-legend-item>\n </ng-container>\n <div\n #moreTextContainer\n class=\"more-text-container\"\n (mouseover)=\"mouseoverLegend()\"\n (mouseleave)=\"mouseleaveLegend()\"\n (click)=\"moreClick()\"\n *ngIf=\"fi.hiddenCount\"\n >\n <span rivLink class=\"more-text\">\n +\n {{ fi.hiddenCount }} more\n </span>\n </div>\n <ng-container *ngIf=\"showMoreTooltip || lockShowMoreTooltip\">\n <riv-callout\n *riv-overlay\n [anchor]=\"moreTextContainer?.nativeElement\"\n [isModal]=\"lockShowMoreTooltip\"\n (close)=\"closeHandler()\"\n [preferredPosition]=\"'bottom-right'\"\n [theme]=\"'light'\"\n [showCaret]=\"false\"\n >\n <div class=\"legend-tooltip\">\n <ng-container *ngFor=\"let item of d.data.ys; let i = index\">\n <riv-legend-item\n *ngIf=\"i >= fi.dataIndex && item.showLegendItem !== false\"\n [label]=\"item.label\"\n [style]=\"item.pattern || 'solid'\"\n [visibility]=\"item.hidden ? 'hidden' : 'visible'\"\n [clickable]=\"config.allowLegendToggle\"\n [showCheckWhenClickable]=\"item.pattern !== 'dots'\"\n [colorToken]=\"getItemColor(item, i)\"\n (itemClick)=\"toggleLegend(item, i)\"\n ></riv-legend-item>\n </ng-container>\n <ng-container\n *ngFor=\"let item of d.data.supplementaryYs; let i = index\"\n >\n <riv-legend-item\n *ngIf=\"i >= fi.suppIndex && item.showLegendItem !== false\"\n [label]=\"item.label\"\n [style]=\"item.pattern || 'solid'\"\n [visibility]=\"item.hidden ? 'hidden' : 'visible'\"\n [colorToken]=\"getItemColor(item, i)\"\n [clickable]=\"config.allowLegendToggle\"\n [showCheckWhenClickable]=\"item.pattern !== 'dots'\"\n (itemClick)=\"toggleLegend(item, i)\"\n ></riv-legend-item>\n </ng-container>\n </div>\n </riv-callout>\n </ng-container>\n </ng-container>\n </legend>\n </ng-container>\n</div>\n\n<ng-template #nonDisplayState>\n <ng-container *ngIf=\"checkForNonDisplayState(drawData$ | async); let type\">\n <riv-zero-state\n *ngIf=\"type === 'zeroState'\"\n [message]=\"config.zeroStateMessage\"\n ></riv-zero-state>\n <riv-zero-state\n *ngIf=\"type === 'sizingErrorState'\"\n [message]=\"config.sizingErrorStateMessage\"\n ></riv-zero-state>\n </ng-container>\n</ng-template>\n", styles: [".container{-webkit-user-select:none;user-select:none;position:relative;display:flex;flex-direction:column;gap:var(--size-small)}.tick-line{stroke:var(--gray-20)}.tick-label{font-size:var(--override-font-size);line-height:var(--type-1-line-height-0);fill:var(--type-light-low-contrast)}.marker{fill:var(--surface-light-0)}.callout-content{pointer-events:none;padding:var(--size-medium) var(--size-xlarge);display:flex;flex-direction:column}.callout-row{white-space:nowrap;display:flex;padding:var(--size-medium) 0;gap:var(--size-medium);align-items:center;font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-0)}.callout-row:not(:last-child){border-bottom:var(--border-width) solid var(--border-light)}.series-label{flex-grow:1;font-weight:var(--font-weight-heavy);display:flex;align-items:center;gap:var(--size-small)}legend{display:flex;flex-wrap:wrap;gap:var(--size-large);justify-content:flex-start;align-items:baseline;width:100%}.more-text-container{width:calc(var(--base-grid-size) * 15);height:var(--size-large)}.more-text{font-size:var(--type-1-font-size);top:calc(var(--base-grid-size) * -1);position:relative}.legend-tooltip{padding:var(--size-medium) var(--size-xlarge);display:flex;flex-direction:column;overflow-y:scroll;max-height:clamp(0px,60vh,600px)}.legend-tooltip>riv-legend-item{white-space:nowrap;display:flex;padding:var(--size-medium) 0;gap:var(--size-medium);align-items:center;line-height:var(--type-1-line-height-0)}.sub-container.clickable{cursor:pointer}.sub-container{display:grid;grid-template-rows:1fr;grid-template-columns:1fr;overflow:auto}.sub-container:not(.donut-container){justify-items:start;align-items:start}.sub-container.donut-container{justify-items:center;align-items:center}svg{grid-row:1 / 1;grid-column:1 / 1}.donut-display{grid-row:1 / 1;grid-column:1 / 1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--size-small)}.donut-label{font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-0);color:var(--type-light-low-contrast)}.donut-value,.donut-label{text-shadow:0 0 var(--size-small) var(--surface-light-0),0 0 var(--size-xsmall) var(--surface-light-0)}.donut-value.xsmall{font:var(--stat-xsmall)}.donut-value.small{font:var(--stat-small)}.donut-value.medium{font:var(--stat-medium)}.donut-value.large{font:var(--stat-large)}.data-label{fill:var(--type-light-high-contrast);font-size:var(--override-font-size)}.flow-data-label{text-decoration:underline;font-size:var(--override-font-size);cursor:pointer;fill:var(--type-light-link-hover)}.waterfall-line{stroke:var(--gray-60)}.flow-subtitle{font-weight:var(--font-weight-heavy)}\n"] }]
|
|
581
|
+
args: [{ selector: 'riv-chart', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n class=\"container\"\n (rivClientSize)=\"width = $event.width\"\n *ngIf=\"{ d: drawData$ | async } as vm\"\n [style.--override-font-size]=\"getFontSize(vm.d)\"\n>\n <ng-container\n *ngIf=\"\n !checkForNonDisplayState(vm.d) && (drawData$ | async);\n let d;\n else: nonDisplayState\n \"\n >\n <div\n (mousemove)=\"mousemove($event, d.hover)\"\n (mouseleave)=\"mouseleave($event)\"\n (click)=\"click()\"\n #container\n class=\"sub-container\"\n [class.clickable]=\"isHoverClickable\"\n tabIndex=\"0\"\n [ngClass]=\"{ 'donut-container': config.type === 'donut' }\"\n [ngStyle]=\"{\n height: getSubcontainerHeight(d),\n width: getSubcontainerWidth(d)\n }\"\n >\n <svg:svg\n xmlns=\"http://www.w3.org/2000/svg\"\n [attr.viewBox]=\"d.viewBox\"\n [attr.height]=\"d.chartHeight\"\n [attr.width]=\"d.chartWidth\"\n >\n <defs>\n <!-- Stripe pattern -->\n <pattern\n id=\"stripes\"\n x=\"0\"\n y=\"0\"\n [attr.width]=\"10\"\n [attr.height]=\"10\"\n patternUnits=\"userSpaceOnUse\"\n >\n <line\n [attr.x1]=\"0\"\n [attr.y1]=\"10\"\n [attr.x2]=\"10\"\n [attr.y2]=\"0\"\n stroke=\"var(--white-100)\"\n stroke-width=\"1\"\n ></line>\n </pattern>\n </defs>\n <ng-container *ngIf=\"!(config.type === 'horizontal-bar')\">\n <g *ngFor=\"let tick of d.xTicks\" text-anchor=\"middle\">\n <text\n class=\"tick-label\"\n [attr.x]=\"tick.x\"\n [attr.y]=\"getBottomLabelY(d)\"\n >\n {{ tick.label }}\n </text>\n </g>\n </ng-container>\n <ng-container *ngIf=\"config.type === 'horizontal-bar'\">\n <g *ngFor=\"let tick of d.xTicks\" text-anchor=\"left\">\n <text\n class=\"tick-label\"\n [attr.x]=\"tick.x\"\n [attr.y]=\"d.chartSizingValues.fontSize\"\n >\n {{ tick.label }}\n </text>\n <line\n class=\"tick-line\"\n [attr.x1]=\"tick.x\"\n [attr.x2]=\"tick.x\"\n y1=\"0\"\n [attr.y2]=\"d.chartHeight\"\n ></line>\n <text\n *ngIf=\"tick.secondaryLabel\"\n class=\"tick-label\"\n [attr.x]=\"tick.x\"\n [attr.y]=\"getBottomLabelY(d)\"\n >\n {{ tick.secondaryLabel }}\n </text>\n </g>\n </ng-container>\n <g *ngFor=\"let tick of d.yTicks\">\n <line\n *ngIf=\"!(config.type === 'horizontal-bar')\"\n class=\"tick-line\"\n [attr.y1]=\"tick.y\"\n [attr.y2]=\"tick.y\"\n x1=\"0\"\n [attr.x2]=\"d.chartWidth\"\n ></line>\n <text\n rivSVGTextTruncate\n [text]=\"tick.label\"\n [width]=\"\n config.type === 'horizontal-bar'\n ? d.chartSizingValues.leftBucketLabel\n : d.chartSizingValues.leftPadding\n \"\n class=\"tick-label\"\n [attr.y]=\"tick.y\"\n [attr.x]=\"0\"\n >\n {{ tick.label }}\n </text>\n <text\n *ngIf=\"tick.secondaryLabel\"\n rivSVGTextTruncate\n [text]=\"tick.secondaryLabel\"\n [width]=\"d.chartSizingValues.rightPadding\"\n class=\"tick-label\"\n [attr.y]=\"tick.y\"\n [attr.x]=\"d.chartWidth\"\n text-anchor=\"end\"\n >\n {{ tick.secondaryLabel }}\n </text>\n </g>\n <ng-container *ngIf=\"standardHoverDataGuard(hover) as hoverData\">\n <g\n *ngIf=\"config.type !== 'horizontal-bar' && config.type !== 'donut'\"\n >\n <line\n class=\"tick-line\"\n [attr.x1]=\"hoverData?.x\"\n [attr.x2]=\"hoverData?.x\"\n y1=\"0\"\n [attr.y2]=\"d.chartHeight\"\n stroke-width=\"2\"\n stroke-dasharray=\"4\"\n />\n </g>\n </ng-container>\n <g *ngFor=\"let bar of d.bars; let i = index\">\n <ng-container *ngFor=\"let rect of bar; let j = index\">\n <defs *ngIf=\"rect.pattern === 'dots'\">\n <pattern\n [attr.id]=\"'dots-' + i + '-' + j\"\n patternUnits=\"userSpaceOnUse\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n width=\"4\"\n height=\"4\"\n >\n <circle\n cx=\"2\"\n cy=\"2\"\n r=\"1.5\"\n [attr.fill]=\"varColor(d.colors, i)\"\n ></circle>\n </pattern>\n </defs>\n\n <rect\n *ngIf=\"rect.nonDisplay !== true\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n [attr.fill]=\"\n rect.pattern === 'dots'\n ? 'url(#dots-' + i + '-' + j + ')'\n : getBarColor(rect, d.colors, i, hover)\n \"\n [attr.stroke]=\"\n showBarBorders(rect, hover) ? varWrap('--black-100') : undefined\n \"\n [attr.stroke-width]=\"showBarBorders(rect, hover) ? 1 : undefined\"\n ></rect>\n <rect\n *ngIf=\"showNonDisplayRect(rect, hover)\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n fill=\"transparent\"\n [attr.stroke]=\"varWrap('--black-100')\"\n [attr.stroke-width]=\"1\"\n ></rect>\n <rect\n *ngIf=\"rect.pattern === 'striped'\"\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n fill=\"url(#stripes)\"\n ></rect>\n </ng-container>\n </g>\n <g *ngFor=\"let bar of d.horizontalBars; let i = index\">\n <ng-container *ngFor=\"let indBar of bar; let j = index\">\n <defs *ngIf=\"indBar.pattern === 'dots'\">\n <pattern\n [attr.id]=\"'dots-' + i + '-' + j\"\n patternUnits=\"userSpaceOnUse\"\n [attr.x]=\"indBar.x\"\n [attr.y]=\"indBar.y\"\n width=\"4\"\n height=\"4\"\n >\n <circle\n cx=\"2\"\n cy=\"2\"\n r=\"1.5\"\n [attr.fill]=\"varColor(d.colors, i)\"\n ></circle>\n </pattern>\n </defs>\n <path\n [attr.d]=\"indBar.horizontalBar\"\n [attr.fill]=\"\n indBar.pattern === 'dots'\n ? 'url(#dots-' + i + '-' + j + ')'\n : varColor(d.colors, i)\n \"\n [attr.stroke]=\"\n indBar.pattern === 'dots' ? 'none' : varColor(d.colors, i)\n \"\n [attr.stroke-width]=\"indBar.pattern === 'dots' ? 0 : 2\"\n />\n <path\n *ngIf=\"indBar.pattern === 'striped'\"\n [attr.d]=\"indBar.horizontalBar\"\n [attr.stroke]=\"varColor(d.colors, i)\"\n fill=\"url(#stripes)\"\n stroke-width=\"0\"\n />\n </ng-container>\n </g>\n <g *ngFor=\"let gradient of d.gradients; let i = index\">\n <ng-container *ngFor=\"let rect of gradient; let j = index\">\n <defs>\n <linearGradient\n [attr.id]=\"'grad-' + i + '-' + j\"\n x1=\"0\"\n y1=\"0\"\n x2=\"0\"\n y2=\"1\"\n >\n <stop offset=\"0%\" [attr.stop-color]=\"varColor(d.colors, i)\" />\n <stop offset=\"100%\" stop-color=\"white\" />\n </linearGradient>\n </defs>\n <rect\n [attr.x]=\"rect.x\"\n [attr.y]=\"rect.y\"\n [attr.width]=\"rect.width\"\n [attr.height]=\"rect.height\"\n [attr.fill]=\"'url(#grad-' + i + '-' + j + ')'\"\n opacity=\"0.4\"\n ></rect>\n </ng-container>\n </g>\n <g *ngFor=\"let line of d.lines; let i = index\">\n <path\n [attr.d]=\"line.line\"\n [attr.stroke]=\"varColor(d.colors, i)\"\n fill=\"none\"\n stroke-width=\"2\"\n [attr.stroke-linecap]=\"\n line.pattern === 'dots' ? 'round' : undefined\n \"\n [attr.stroke-linejoin]=\"\n line.pattern === 'dots' ? 'round' : undefined\n \"\n [attr.stroke-dasharray]=\"\n line.pattern === 'striped'\n ? '10 10'\n : line.pattern === 'dots'\n ? '0.25 7'\n : undefined\n \"\n ></path>\n </g>\n <g *ngFor=\"let lineSinglePointFallback of d.circles; let i = index\">\n <circle\n class=\"marker\"\n [attr.cx]=\"lineSinglePointFallback.cx\"\n [attr.cy]=\"lineSinglePointFallback.cy\"\n r=\"3.5\"\n stroke-width=\"2\"\n [attr.stroke]=\"varColor(d.colors, i)\"\n ></circle>\n </g>\n <g *ngFor=\"let line of d.lines; let i = index\">\n <ng-container *ngIf=\"standardHoverDataGuard(hover) as hoverData\">\n <circle\n class=\"marker\"\n *ngIf=\"config.groupedTooltip || i === hoverData?.visibleYIndex\"\n [attr.cx]=\"hoverData?.x\"\n [attr.cy]=\"hoverData?.ys?.[i]\"\n r=\"3.5\"\n stroke-width=\"2\"\n [attr.stroke]=\"varColor(d.colors, i)\"\n ></circle>\n </ng-container>\n </g>\n <g *ngFor=\"let area of d.areas; let i = index\">\n <path [attr.d]=\"area.area\" [attr.fill]=\"varColor(d.colors, i)\"></path>\n <path\n *ngIf=\"area.pattern === 'striped'\"\n [attr.d]=\"area.area\"\n fill=\"url(#stripes)\"\n ></path>\n </g>\n <g *ngFor=\"let area of d.areas; let i = index\">\n <ng-container *ngIf=\"standardHoverDataGuard(hover) as hoverData\">\n <circle\n class=\"marker\"\n *ngIf=\"config.groupedTooltip || i === hoverData?.visibleYIndex\"\n [attr.cx]=\"hoverData?.x\"\n [attr.cy]=\"hoverData?.ys?.[i]\"\n r=\"3.5\"\n stroke-width=\"2\"\n [attr.stroke]=\"varColor(d.colors, i)\"\n ></circle>\n </ng-container>\n </g>\n <g *ngFor=\"let wLine of d.waterfallLines\">\n <line\n class=\"waterfall-line\"\n [attr.x1]=\"wLine.x1\"\n [attr.x2]=\"wLine.x2\"\n [attr.y1]=\"wLine.y1\"\n [attr.y2]=\"wLine.y2\"\n stroke-width=\"1\"\n stroke-dasharray=\"6\"\n />\n </g>\n <path\n *ngFor=\"let path of d.arcs; let i = index\"\n [attr.d]=\"path\"\n [attr.fill]=\"varColor(d.colors, i)\"\n ></path>\n <g *ngFor=\"let dataLabel of d.dataLabels; let i = index\">\n <text\n *ngIf=\"config.showDataLabels && dataLabel.label\"\n [ngClass]=\"getDataLabelClass(dataLabel, config, hover)\"\n [attr.y]=\"dataLabel.yPos\"\n [attr.x]=\"dataLabel.xPos\"\n [attr.text-anchor]=\"dataLabel.anchor\"\n [attr.font-weight]=\"\n dataLabel.bold\n ? 'var(--font-weight-heavy)'\n : 'var(--font-weight-normal)'\n \"\n [attr.opacity]=\"getDataLabelOpacity(dataLabel, config, hover)\"\n >\n {{ dataLabel.label }}\n </text>\n <line\n *ngIf=\"dataLabel.line && config.showDataLabels\"\n [attr.y1]=\"dataLabel.line.y1\"\n [attr.y2]=\"dataLabel.line.y2\"\n [attr.x1]=\"dataLabel.line.x1\"\n [attr.x2]=\"dataLabel.line.x2\"\n stroke-width=\"2\"\n [attr.stroke]=\"varColor(d.colors, i)\"\n ></line>\n </g>\n <g *ngFor=\"let connection of d.flowConnections\">\n <path\n [attr.d]=\"connection.path\"\n [attr.fill]=\"getConnectionColor()\"\n [attr.opacity]=\"getConnectionOpacity(connection, hover)\"\n />\n </g>\n </svg:svg>\n <div *ngIf=\"config.type === 'donut'\" class=\"donut-display\">\n <div class=\"donut-value\" [ngClass]=\"config.donutDisplayInfo.size\">\n {{ config.donutDisplayInfo.displayValue }}\n </div>\n <div class=\"donut-label\">\n {{ config.donutDisplayInfo.displayLabel }}\n </div>\n </div>\n <ng-container *ngIf=\"standardHoverDataGuard(hover) as hoverData\">\n <riv-callout\n *riv-overlay\n [anchor]=\"\n hoverData?.tooltip?.anchor ? hoverData.tooltip.anchor : null\n \"\n [isModal]=\"false\"\n [preferredPosition]=\"\n hoverData?.tooltip?.preferredPosition ?? 'center-right'\n \"\n [theme]=\"'light'\"\n >\n <ng-container *ngIf=\"tooltipTemplate; else defaultTooltip\">\n <ng-container\n [ngTemplateOutlet]=\"tooltipTemplate\"\n [ngTemplateOutletContext]=\"{\n xIndex: hoverData?.xIndex,\n yIndex: hoverData?.yIndex,\n isSuppValue: hoverData?.isSuppValue,\n suppYIndex: hoverData?.suppYIndex\n }\"\n ></ng-container>\n </ng-container>\n <ng-template #defaultTooltip>\n <div class=\"callout-content\">\n <div *ngIf=\"hoverData?.tooltip?.date\" class=\"callout-row\">\n {{ hoverData?.tooltip?.date }}\n </div>\n <div\n class=\"callout-row\"\n *ngFor=\"let metric of hoverData?.tooltip?.metrics\"\n >\n <span class=\"series-label\">\n <riv-legend-item\n [colorToken]=\"metric.color\"\n [style]=\"metric.pattern || 'solid'\"\n ></riv-legend-item>\n <span>{{ metric.label }}</span>\n </span>\n <span>{{ metric.value }}</span>\n </div>\n </div>\n </ng-template>\n </riv-callout>\n </ng-container>\n <ng-container *ngIf=\"flowHoverDataGuard(hover) as hoverData\">\n <riv-callout\n *riv-overlay\n [anchor]=\"\n hoverData?.tooltip?.anchor ? hoverData.tooltip.anchor : null\n \"\n [isModal]=\"false\"\n [preferredPosition]=\"'top-center'\"\n [theme]=\"'light'\"\n >\n <div class=\"callout-content\">\n <div class=\"callout-row\">\n <ng-container *ngIf=\"hoverData?.hoverTarget === 'connection'\">\n <ng-container\n *ngIf=\"\n getBucketConfigInfo(hoverData, 'startId') as startConfig\n \"\n >\n <riv-issue\n [label]=\"startConfig.title\"\n [colorToken]=\"startConfig.color\"\n ></riv-issue>\n </ng-container>\n ->\n <ng-container\n *ngIf=\"getBucketConfigInfo(hoverData, 'endId') as endConfig\"\n >\n <riv-issue\n [label]=\"endConfig.title\"\n [colorToken]=\"endConfig.color\"\n ></riv-issue>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"hoverData?.hoverTarget !== 'connection'\">\n <ng-container\n *ngIf=\"getBucketConfigInfo(hoverData, 'barId') as barConfig\"\n >\n <riv-issue\n [label]=\"barConfig.title\"\n [colorToken]=\"barConfig.color\"\n ></riv-issue>\n </ng-container>\n </ng-container>\n </div>\n <div\n *ngIf=\"hoverData?.tooltip?.subtitle\"\n class=\"callout-row flow-subtitle\"\n >\n {{ hoverData?.tooltip?.subtitle }}\n </div>\n </div>\n </riv-callout>\n </ng-container>\n </div>\n <legend *ngIf=\"d.data.type !== 'flow'\">\n <ng-container *ngIf=\"firstHiddenLegendItemIndex$ | async; let fi\">\n <ng-container *ngFor=\"let item of d.data.ys; let i = index\">\n <riv-legend-item\n *ngIf=\"i < fi.dataIndex && item.showLegendItem !== false\"\n [label]=\"item.label\"\n [style]=\"item.pattern || 'solid'\"\n [visibility]=\"item.hidden ? 'hidden' : 'visible'\"\n [clickable]=\"config.allowLegendToggle\"\n [showCheckWhenClickable]=\"item.pattern !== 'dots'\"\n [colorToken]=\"getItemColor(item, i)\"\n (itemClick)=\"toggleLegend(item, i)\"\n ></riv-legend-item>\n </ng-container>\n <ng-container\n *ngFor=\"let item of d.data.supplementaryYs; let i = index\"\n >\n <riv-legend-item\n *ngIf=\"i < fi.suppIndex && item.showLegendItem !== false\"\n [label]=\"item.label\"\n [style]=\"item.pattern || 'solid'\"\n [visibility]=\"item.hidden ? 'hidden' : 'visible'\"\n [clickable]=\"config.allowLegendToggle\"\n [showCheckWhenClickable]=\"item.pattern !== 'dots'\"\n [colorToken]=\"getItemColor(item, i)\"\n (itemClick)=\"toggleLegend(item, i)\"\n ></riv-legend-item>\n </ng-container>\n <div\n #moreTextContainer\n class=\"more-text-container\"\n (mouseover)=\"mouseoverLegend()\"\n (mouseleave)=\"mouseleaveLegend()\"\n (click)=\"moreClick()\"\n *ngIf=\"fi.hiddenCount\"\n >\n <span rivLink class=\"more-text\">\n +\n {{ fi.hiddenCount }} more\n </span>\n </div>\n <ng-container *ngIf=\"showMoreTooltip || lockShowMoreTooltip\">\n <riv-callout\n *riv-overlay\n [anchor]=\"moreTextContainer?.nativeElement\"\n [isModal]=\"lockShowMoreTooltip\"\n (close)=\"closeHandler()\"\n [preferredPosition]=\"'bottom-right'\"\n [theme]=\"'light'\"\n [showCaret]=\"false\"\n >\n <div class=\"legend-tooltip\">\n <ng-container *ngFor=\"let item of d.data.ys; let i = index\">\n <riv-legend-item\n *ngIf=\"i >= fi.dataIndex && item.showLegendItem !== false\"\n [label]=\"item.label\"\n [style]=\"item.pattern || 'solid'\"\n [visibility]=\"item.hidden ? 'hidden' : 'visible'\"\n [clickable]=\"config.allowLegendToggle\"\n [showCheckWhenClickable]=\"item.pattern !== 'dots'\"\n [colorToken]=\"getItemColor(item, i)\"\n (itemClick)=\"toggleLegend(item, i)\"\n ></riv-legend-item>\n </ng-container>\n <ng-container\n *ngFor=\"let item of d.data.supplementaryYs; let i = index\"\n >\n <riv-legend-item\n *ngIf=\"i >= fi.suppIndex && item.showLegendItem !== false\"\n [label]=\"item.label\"\n [style]=\"item.pattern || 'solid'\"\n [visibility]=\"item.hidden ? 'hidden' : 'visible'\"\n [colorToken]=\"getItemColor(item, i)\"\n [clickable]=\"config.allowLegendToggle\"\n [showCheckWhenClickable]=\"item.pattern !== 'dots'\"\n (itemClick)=\"toggleLegend(item, i)\"\n ></riv-legend-item>\n </ng-container>\n </div>\n </riv-callout>\n </ng-container>\n </ng-container>\n </legend>\n </ng-container>\n</div>\n\n<ng-template #nonDisplayState>\n <ng-container *ngIf=\"checkForNonDisplayState(drawData$ | async); let type\">\n <riv-zero-state\n *ngIf=\"type === 'zeroState'\"\n [message]=\"config.zeroStateMessage\"\n ></riv-zero-state>\n <riv-zero-state\n *ngIf=\"type === 'sizingErrorState'\"\n [message]=\"config.sizingErrorStateMessage\"\n ></riv-zero-state>\n </ng-container>\n</ng-template>\n", styles: [".container{-webkit-user-select:none;user-select:none;position:relative;display:flex;flex-direction:column;gap:var(--size-small)}.tick-line{stroke:var(--gray-20)}.tick-label{font-size:var(--override-font-size);line-height:var(--type-1-line-height-0);fill:var(--type-light-low-contrast)}.marker{fill:var(--surface-light-0)}.callout-content{pointer-events:none;padding:var(--size-medium) var(--size-xlarge);display:flex;flex-direction:column}.callout-row{white-space:nowrap;display:flex;padding:var(--size-medium) 0;gap:var(--size-medium);align-items:center;font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-0)}.callout-row:not(:last-child){border-bottom:var(--border-width) solid var(--border-light)}.series-label{flex-grow:1;font-weight:var(--font-weight-heavy);display:flex;align-items:center;gap:var(--size-small)}legend{display:flex;flex-wrap:wrap;gap:var(--size-large);justify-content:flex-start;align-items:baseline;width:100%}.more-text-container{width:calc(var(--base-grid-size) * 15);height:var(--size-large)}.more-text{font-size:var(--type-1-font-size);top:calc(var(--base-grid-size) * -1);position:relative}.legend-tooltip{padding:var(--size-medium) var(--size-xlarge);display:flex;flex-direction:column;overflow-y:scroll;max-height:clamp(0px,60vh,600px)}.legend-tooltip>riv-legend-item{white-space:nowrap;display:flex;padding:var(--size-medium) 0;gap:var(--size-medium);align-items:center;line-height:var(--type-1-line-height-0)}.sub-container.clickable{cursor:pointer}.sub-container{display:grid;grid-template-rows:1fr;grid-template-columns:1fr;overflow:auto}.sub-container:not(.donut-container){justify-items:start;align-items:start}.sub-container.donut-container{justify-items:center;align-items:center}svg{grid-row:1 / 1;grid-column:1 / 1}.donut-display{grid-row:1 / 1;grid-column:1 / 1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--size-small)}.donut-label{font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-0);color:var(--type-light-low-contrast)}.donut-value,.donut-label{text-shadow:0 0 var(--size-small) var(--surface-light-0),0 0 var(--size-xsmall) var(--surface-light-0)}.donut-value.xsmall{font:var(--stat-xsmall)}.donut-value.small{font:var(--stat-small)}.donut-value.medium{font:var(--stat-medium)}.donut-value.large{font:var(--stat-large)}.data-label{fill:var(--type-light-high-contrast);font-size:var(--override-font-size)}.flow-data-label{text-decoration:underline;font-size:var(--override-font-size);cursor:pointer;fill:var(--type-light-link-hover)}.waterfall-line{stroke:var(--gray-60)}.flow-subtitle{font-weight:var(--font-weight-heavy)}\n"] }]
|
|
582
582
|
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { container: [{
|
|
583
583
|
type: ViewChild,
|
|
584
584
|
args: ['container']
|
|
@@ -603,4 +603,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
|
|
|
603
603
|
}], chartClicked: [{
|
|
604
604
|
type: Output
|
|
605
605
|
}] } });
|
|
606
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcml2L3NyYy9saWIvdmlzdWFsaXphdGlvbi9jaGFydC9jaGFydC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yaXYvc3JjL2xpYi92aXN1YWxpemF0aW9uL2NoYXJ0L2NoYXJ0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFFdkIsU0FBUyxFQUNULFlBQVksRUFFWixZQUFZLEVBQ1osS0FBSyxFQUNMLE1BQU0sRUFFTixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUNqQyxPQUFPLEVBQ0wsZUFBZSxFQUNmLGFBQWEsRUFDYixvQkFBb0IsRUFDcEIsR0FBRyxFQUNILElBQUksRUFDSixTQUFTLEVBQ1QsT0FBTyxHQUNSLE1BQU0sTUFBTSxDQUFDO0FBQ2QsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFNBQVMsQ0FBQzs7Ozs7Ozs7Ozs7QUFZaEMsTUFBTSxPQUFPLGNBQWM7SUFDekIsWUFBNkIsR0FBc0I7UUFBdEIsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFhMUMsdUJBQWtCLEdBQUcsR0FBRyxDQUFDO1FBQ3pCLHNCQUFpQixHQUFHLENBQUMsQ0FBQyxDQUFDLHdGQUF3RjtRQUV4SCxZQUFPLEdBQUcsSUFBSSxlQUFlLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFXdkQsV0FBTSxHQUFHLElBQUksZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBV2hDLG1LQUFtSztRQUNuSyxjQUFTLEdBQWtCLElBQUksQ0FBQztRQUNoQyxvQkFBZSxHQUFHLElBQUksZUFBZSxDQUFnQixJQUFJLENBQUMsQ0FBQztRQW1CM0QsYUFBUSxHQUFrQixJQUFJ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dUIsQ0FBQyxNQUFNO3dHQUt2QixTQUFTO3NCQUFoQyxTQUFTO3VCQUFDLFdBQVc7Z0JBQ1UsaUJBQWlCO3NCQUFoRCxTQUFTO3VCQUFDLG1CQUFtQjtnQkFHOUIsZUFBZTtzQkFEZCxZQUFZO3VCQUFDLFNBQVM7Z0JBYW5CLE1BQU07c0JBRFQsS0FBSztnQkFZRixLQUFLO3NCQURSLEtBQUs7Z0JBY0YsY0FBYztzQkFEakIsS0FBSztnQkFxQkYsYUFBYTtzQkFEaEIsS0FBSztnQkFvQkYsTUFBTTtzQkFEVCxLQUFLO2dCQW9CRixJQUFJO3NCQURQLEtBQUs7Z0JBd0hOLFlBQVk7c0JBRFgsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgVGVtcGxhdGVSZWYsXG4gIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBpc0VxdWFsIH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7XG4gIEJlaGF2aW9yU3ViamVjdCxcbiAgY29tYmluZUxhdGVzdCxcbiAgZGlzdGluY3RVbnRpbENoYW5nZWQsXG4gIG1hcCxcbiAgc2NhbixcbiAgc3RhcnRXaXRoLFxuICBTdWJqZWN0LFxufSBmcm9tICdyeGpzJztcbmltcG9ydCB7IENoYXJ0IH0gZnJvbSAnLi9jaGFydCc7XG5cbnR5cGUgRHJhd0RhdGEgPSB7XG4gIGRhdGE6IENoYXJ0LklucHV0RGF0YTtcbiAgdmlld0JveDogc3RyaW5nO1xufSAmIENoYXJ0LlJlbmRlcmVkQ2hhcnQ7XG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdyaXYtY2hhcnQnLFxuICB0ZW1wbGF0ZVVybDogJy4vY2hhcnQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9jaGFydC5jb21wb25lbnQuY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBDaGFydENvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZikge31cblxuICBAVmlld0NoaWxkKCdjb250YWluZXInKSBjb250YWluZXI/OiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCdtb3JlVGV4dENvbnRhaW5lcicpIG1vcmVUZXh0Q29udGFpbmVyPzogRWxlbWVudFJlZjtcblxuICBAQ29udGVudENoaWxkKCd0b29sdGlwJylcbiAgdG9vbHRpcFRlbXBsYXRlPzogVGVtcGxhdGVSZWY8e1xuICAgIHhJbmRleDogbnVtYmVyO1xuICAgIHlJbmRleDogbnVtYmVyO1xuICAgIGlzU3VwcFZhbHVlPzogYm9vbGVhbjtcbiAgICBzdXBwWUluZGV4PzogbnVtYmVyO1xuICB9PjtcblxuICByZWFkb25seSBERUZBVUxUX0hFSUdIVF9WQUwgPSAzMDA7XG4gIHJlYWRvbmx5IERFRkFVTFRfV0lEVEhfVkFMID0gMDsgLy9UaGVyZSdzIGFuIGF1dG9tYXRpYyByZXNpemVyIGluIHRoZSBodG1sIHRoYXQgaGFuZGxlcyBtYXRjaGluZyB3aWR0aCB0byBjb250YWluZXIgc2l6ZVxuXG4gIGhlaWdodCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KHRoaXMuREVGQVVMVF9IRUlHSFRfVkFMKTtcbiAgQElucHV0KClcbiAgc2V0IGhlaWdodCh3OiBudW1iZXIpIHtcbiAgICBpZiAodGhpcy5vdmVycmlkZUhlaWdodCA9PT0gbnVsbCkge1xuICAgICAgdGhpcy5oZWlnaHQkLm5leHQodyk7XG4gICAgfVxuICB9XG4gIGdldCBoZWlnaHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuaGVpZ2h0JC52YWx1ZTtcbiAgfVxuXG4gIHdpZHRoJCA9IG5ldyBCZWhhdmlvclN1YmplY3QoMCk7XG4gIEBJbnB1dCgpXG4gIHNldCB3aWR0aCh3OiBudW1iZXIpIHtcbiAgICBpZiAodGhpcy5vdmVycmlkZVdpZHRoID09PSBudWxsKSB7XG4gICAgICB0aGlzLndpZHRoJC5uZXh0KHcpO1xuICAgIH1cbiAgfVxuICBnZXQgd2lkdGgoKSB7XG4gICAgcmV0dXJuIHRoaXMud2lkdGgkLnZhbHVlO1xuICB9XG5cbiAgLy9UaGVzZSBvdmVycmlkZXMgaGFuZGxlIHNpdHVhdGlvbnMgd2hlcmUgdGhlIGNoYXJ0IG5lZWRzIHRvIGJlIHNldCB0byBhIHBhcnRpY3VsYXIgc2l6ZSB0aGF0IGRvZXNuJ3QgbWF0Y2ggd2hhdCBpdCB3b3VsZCBhdXRvbWF0aWNhbGx5IHNjYWxlIHRvIGJhc2VkIG9uIGNvbnRhaW5lclxuICBvbGRIZWlnaHQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICBvdmVycmlkZUhlaWdodCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlciB8IG51bGw+KG51bGwpO1xuICBASW5wdXQoKVxuICBzZXQgb3ZlcnJpZGVIZWlnaHQodzogbnVtYmVyIHwgbnVsbCkge1xuICAgIGlmICh3ICE9PSBudWxsKSB7XG4gICAgICB0aGlzLm9sZEhlaWdodCA9IHRoaXMuaGVpZ2h0O1xuICAgICAgdGhpcy5oZWlnaHQkLm5leHQodyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLm9sZEhlaWdodCkge1xuICAgICAgICB0aGlzLmhlaWdodCQubmV4dCh0aGlzLm9sZEhlaWdodCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmhlaWdodCQubmV4dCh0aGlzLkRFRkFVTFRfSEVJR0hUX1ZBTCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMub3ZlcnJpZGVIZWlnaHQkLm5leHQodyk7XG4gIH1cbiAgZ2V0IG92ZXJyaWRlSGVpZ2h0KCk6IG51bWJlciB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLm92ZXJyaWRlSGVpZ2h0JC52YWx1ZTtcbiAgfVxuXG4gIG9sZFdpZHRoOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgb3ZlcnJpZGVXaWR0aCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlciB8IG51bGw+KG51bGwpO1xuICBASW5wdXQoKVxuICBzZXQgb3ZlcnJpZGVXaWR0aCh3OiBudW1iZXIgfCBudWxsKSB7XG4gICAgaWYgKHcgIT09IG51bGwpIHtcbiAgICAgIHRoaXMub2xkV2lkdGggPSB0aGlzLndpZHRoO1xuICAgICAgdGhpcy53aWR0aCQubmV4dCh3KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMub2xkV2lkdGgpIHtcbiAgICAgICAgdGhpcy53aWR0aCQubmV4dCh0aGlzLm9sZFdpZHRoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMud2lkdGgkLm5leHQodGhpcy5ERUZBVUxUX1dJRFRIX1ZBTCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMub3ZlcnJpZGVXaWR0aCQubmV4dCh3KTtcbiAgfVxuICBnZXQgb3ZlcnJpZGVXaWR0aCgpOiBudW1iZXIgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5vdmVycmlkZVdpZHRoJC52YWx1ZTtcbiAgfVxuXG4gIGNvbmZpZyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PENoYXJ0LkNvbmZpZz4oQ2hhcnQuZGVmYXVsdENvbmZpZyk7XG4gIEBJbnB1dCgpXG4gIHNldCBjb25maWcoYzogQ2hhcnQuQ29uZmlnKSB7XG4gICAgdGhpcy5jb25maWckLm5leHQoYyk7XG4gIH1cbiAgZ2V0IGNvbmZpZygpIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWckLnZhbHVlO1xuICB9XG5cbiAgZGF0YSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PENoYXJ0LklucHV0RGF0YT4oe1xuICAgIHR5cGU6ICd0aW1lc2VyaWVzJyxcbiAgICB4OiBbXSxcbiAgICB5czogW10sXG4gIH0pO1xuXG4gIHByaXZhdGUgY29sb3JJbmRpY2VzID0gbmV3IE1hcDxcbiAgICBDaGFydC5EYXRhWSB8IENoYXJ0LlN1cHBsZW1lbnRhcnlEYXRhWSxcbiAgICBudW1iZXJcbiAgPigpO1xuXG4gIEBJbnB1dCgpXG4gIHNldCBkYXRhKGQ6IENoYXJ0LklucHV0RGF0YSkge1xuICAgIHRoaXMuZGF0YSQubmV4dChkKTtcbiAgICBpZiAoZC50eXBlICE9PSAnZmxvdycpIHtcbiAgICAgIHRoaXMuY29sb3JJbmRpY2VzID0gQ2hhcnQuY2FsY3VsYXRlQ29sb3JJbmRpY2VzKGQpO1xuICAgIH1cbiAgfVxuICBnZXQgZGF0YSgpIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhJC52YWx1ZTtcbiAgfVxuXG4gIGdldEl0ZW1LZXkoXG4gICAgaXRlbTogQ2hhcnQuRGF0YVkgfCBDaGFydC5TdXBwbGVtZW50YXJ5RGF0YVksXG4gICAgaW5kZXg6IG51bWJlcixcbiAgKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJ3N1cHBsZW1lbnRhbEluZGV4JyBpbiBpdGVtID8gYHN1cHAtJHtpbmRleH1gIDogYHktJHtpbmRleH1gO1xuICB9XG5cbiAgdG9nZ2xlTGVnZW5kKGl0ZW06IENoYXJ0LkRhdGFZIHwgQ2hhcnQuU3VwcGxlbWVudGFyeURhdGFZLCBpbmRleDogbnVtYmVyKSB7XG4gICAgdGhpcy50b2dnbGVMZWdlbmQkLm5leHQodGhpcy5nZXRJdGVtS2V5KGl0ZW0sIGluZGV4KSk7XG4gIH1cblxuICB0b2dnbGVMZWdlbmQkID0gbmV3IFN1YmplY3Q8c3RyaW5nPigpO1xuXG4gIC8vIHRvZ2dsZWRMZWdlbmQkIGlzIGp1c3QgYSBzZXQgb2YgYm9vbGVhblxuICAvLyB2YWx1ZXMgZm9yIHdoaWNoIGxlZ2VuZHMgaGF2ZSBiZWVuIHRvZ2dsZWQuXG4gIC8vIFdlIGRvbid0IGtub3cgaWYgdGhvc2UgbGVnZW5kcyB3aGVyZSBhbHJlYWR5XG4gIC8vIGhpZGRlbiBvciBub3QsIHdlIGp1c3Qga25vdyB3aGV0aGVyIHRoZXkgaGF2ZVxuICAvLyBiZWVuIHRvZ2dsZWQuXG4gIHRvZ2dsZWRMZWdlbmRzJCA9IHRoaXMudG9nZ2xlTGVnZW5kJC5waXBlKFxuICAgIHNjYW48c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPj4oXG4gICAgICAoYWNjLCB2YWx1ZSkgPT4gKHsgLi4uYWNjLCBbdmFsdWVdOiAhYWNjW3ZhbHVlXSB9KSxcbiAgICAgIHt9LFxuICAgICksXG4gICAgc3RhcnRXaXRoPFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+Pih7fSksXG4gICk7XG5cbiAgZHJhd0RhdGEkID0gY29tYmluZUxhdGVzdChbXG4gICAgdGhpcy53aWR0aCQsXG4gICAgdGhpcy5oZWlnaHQkLFxuICAgIHRoaXMuY29uZmlnJCxcbiAgICB0aGlzLmRhdGEkLFxuICAgIHRoaXMudG9nZ2xlZExlZ2VuZHMkLFxuICBdKS5waXBlKFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKChwcmV2LCBjdXJyZW50KSA9PiBpc0VxdWFsKHByZXYsIGN1cnJlbnQpKSxcbiAgICBtYXAoKFt3aWR0aCwgaGVpZ2h0LCBjb25maWcsIGRhdGEsIHRvZ2dsZWRMZWdlbmRzXSkgPT4ge1xuICAgICAgaWYgKHdpZHRoID09PSAwIHx8IGhlaWdodCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGhpZGRlbkRhdGEgPVxuICAgICAgICBkYXRhLnR5cGUgIT09ICdmbG93J1xuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAuLi5kYXRhLFxuICAgICAgICAgICAgICB5czogZGF0YS55cy5tYXAoKHksIGluZGV4KSA9PiAoe1xuICAgICAgICAgICAgICAgIC4uLnksXG4gICAgICAgICAgICAgICAgLy8gaWYgdG9nZ2xlZCwgZmxpcCB0aGUgaGlkZGVuIGJvb2xlYW5cbiAgICAgICAgICAgICAgICBoaWRkZW46IHRvZ2dsZWRMZWdlbmRzW2B5LSR7aW5kZXh9YF0gPyAheS5oaWRkZW4gOiB5LmhpZGRlbixcbiAgICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgICBzdXBwbGVtZW50YXJ5WXM6IGRhdGEuc3VwcGxlbWVudGFyeVlzPy5tYXAoKHksIGluZGV4KSA9PiAoe1xuICAgICAgICAgICAgICAgIC4uLnksXG4gICAgICAgICAgICAgICAgaGlkZGVuOiB0b2dnbGVkTGVnZW5kc1tgc3VwcC0ke2luZGV4fWBdID8gIXkuaGlkZGVuIDogeS5oaWRkZW4sXG4gICAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICA6IGRhdGE7XG5cbiAgICAgIGxldCBjaGFydERhdGEgPSBDaGFydC5jaGFydChjb25maWcsIGhpZGRlbkRhdGEsIHtcbiAgICAgICAgd2lkdGg6IHdpZHRoLFxuICAgICAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBob3Jpem9udGFsU2Nyb2xsRGV0ZWN0ZWQgPSBjaGFydERhdGEuY2hhcnRXaWR0aCA+IHdpZHRoO1xuICAgICAgY29uc3QgdmVydGljYWxTY3JvbGxEZXRlY3RlZCA9IGNoYXJ0RGF0YS5jaGFydEhlaWdodCA+IGhlaWdodDtcbiAgICAgIGlmIChob3Jpem9udGFsU2Nyb2xsRGV0ZWN0ZWQgfHwgdmVydGljYWxTY3JvbGxEZXRlY3RlZCkge1xuICAgICAgICBjb25zdCBzY3JvbGxiYXIgPSB0aGlzLm1lYXN1cmVTY3JvbGxiYXJUaGlja25lc3MoKTtcbiAgICAgICAgY2hhcnREYXRhID0gQ2hhcnQuY2hhcnQoY29uZmlnLCBoaWRkZW5EYXRhLCB7XG4gICAgICAgICAgd2lkdGg6IHdpZHRoIC0gKHZlcnRpY2FsU2Nyb2xsRGV0ZWN0ZWQgPyBzY3JvbGxiYXIudmVydGljYWwgOiAwKSxcbiAgICAgICAgICBoZWlnaHQ6XG4gICAgICAgICAgICBoZWlnaHQgLSAoaG9yaXpvbnRhbFNjcm9sbERldGVjdGVkID8gc2Nyb2xsYmFyLmhvcml6b250YWwgOiAwKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHZpZXdCb3ggPVxuICAgICAgICBjb25maWcudHlwZSA9PT0gJ2RvbnV0J1xuICAgICAgICAgID8gYCR7LWNoYXJ0RGF0YS5jaGFydFdpZHRoIC8gMn0gJHstY2hhcnREYXRhLmNoYXJ0SGVpZ2h0IC8gMn1cbiAgICAgICAgICAgICAgJHtjaGFydERhdGEuY2hhcnRXaWR0aH0gJHtjaGFydERhdGEuY2hhcnRIZWlnaHR9YFxuICAgICAgICAgIDogYDAgMCAke2NoYXJ0RGF0YS5jaGFydFdpZHRofSAke2NoYXJ0RGF0YS5jaGFydEhlaWdodH1gO1xuICAgICAgY29uc3QgcmV0dXJuT2JqOiBEcmF3RGF0YSA9IHtcbiAgICAgICAgdmlld0JveCxcbiAgICAgICAgZGF0YTogaGlkZGVuRGF0YSxcbiAgICAgICAgLi4uY2hhcnREYXRhLFxuICAgICAgfTtcbiAgICAgIHJldHVybiByZXR1cm5PYmo7XG4gICAgfSksXG4gICk7XG5cbiAgaG92ZXI6IFJldHVyblR5cGU8Q2hhcnQuSG92ZXI+ID0gbnVsbDtcblxuICBtb3VzZW1vdmUoJGV2ZW50OiBNb3VzZUV2ZW50LCBob3Zlcj86IENoYXJ0LkhvdmVyKSB7XG4gICAgaWYgKCFob3Zlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjb250YWluZXJFbCA9IHRoaXMuY29udGFpbmVyPy5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xuICAgIGlmIChjb250YWluZXJFbCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCByZWN0ID0gY29udGFpbmVyRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgdGhpcy5ob3ZlciA9IGhvdmVyKHtcbiAgICAgIHJlY3QsXG4gICAgICB4OiAkZXZlbnQuY2xpZW50WCAtIHJlY3QubGVmdCxcbiAgICAgIHk6ICRldmVudC5jbGllbnRZIC0gcmVjdC50b3AsXG4gICAgICBjb250YWluZXJTY3JvbGxYOiBjb250YWluZXJFbC5zY3JvbGxMZWZ0LFxuICAgICAgY29udGFpbmVyU2Nyb2xsWTogY29udGFpbmVyRWwuc2Nyb2xsVG9wLFxuICAgIH0pO1xuICB9XG5cbiAgbW91c2VsZWF2ZSgkZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICB0aGlzLmhvdmVyID0gbnVsbDtcbiAgfVxuXG4gIEBPdXRwdXQoKVxuICBjaGFydENsaWNrZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHtcbiAgICB4SW5kZXg6IG51bWJlcjtcbiAgICB5SW5kZXg6IG51bWJlcjtcbiAgICBzdXBwWUluZGV4PzogbnVtYmVyO1xuICB9PigpO1xuXG4gIGNsaWNrKCkge1xuICAgIGlmIChcbiAgICAgIHRoaXMuaG92ZXIgJiZcbiAgICAgIHRoaXMuaXNIb3ZlckNsaWNrYWJsZSAmJlxuICAgICAgdGhpcy5ob3Zlci5ob3ZlclR5cGUgPT09ICdzdGFuZGFyZCdcbiAgICApIHtcbiAgICAgIHRoaXMuY2hhcnRDbGlja2VkLmVtaXQoe1xuICAgICAgICB4SW5kZXg6IHRoaXMuaG92ZXIueEluZGV4LFxuICAgICAgICB5SW5kZXg6IHRoaXMuaG92ZXIueUluZGV4LFxuICAgICAgICAuLi4odGhpcy5ob3Zlci5pc1N1cHBWYWx1ZSAmJlxuICAgICAgICB0aGlzLmhvdmVyLnN1cHBZSW5kZXggIT0gdW5kZWZpbmVkICYmXG4gICAgICAgIHRoaXMuaG92ZXIuc3VwcFlJbmRleCA+PSAwXG4gICAgICAgICAgPyB7IHN1cHBZSW5kZXg6IHRoaXMuaG92ZXIuc3VwcFlJbmRleCB9XG4gICAgICAgICAgOiB7fSksXG4gICAgICB9KTtcbiAgICAgIHRoaXMuaG92ZXIgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGdldCBpc0hvdmVyQ2xpY2thYmxlKCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5ob3ZlciB8fCB0aGlzLmhvdmVyLmhvdmVyVHlwZSAhPT0gJ3N0YW5kYXJkJykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIElmIGhvdmVyaW5nIGEgc3VwcGxlbWVudGFyeSB2YWx1ZSBzcGVjaWZpY2FsbHksIGNoZWNrIGlmIGl0J3MgY2xpY2thYmxlXG4gICAgaWYgKFxuICAgICAgdGhpcy5ob3Zlci5pc1N1cHBWYWx1ZSAmJlxuICAgICAgdGhpcy5ob3Zlci5zdXBwWUluZGV4ICE9IG51bGwgJiZcbiAgICAgIHRoaXMuZGF0YS50eXBlICE9PSAnZmxvdydcbiAgICApIHtcbiAgICAgIGNvbnN0IHN1cHBZSW5kZXggPSB0aGlzLmhvdmVyLnN1cHBZSW5kZXg7XG4gICAgICBjb25zdCBzdXBwbGVtZW50YXJ5WXMgPSB0aGlzLmRhdGEuc3VwcGxlbWVudGFyeVlzO1xuICAgICAgaWYgKFxuICAgICAgICAhc3VwcGxlbWVudGFyeVlzIHx8XG4gICAgICAgIHN1cHBZSW5kZXggPCAwIHx8XG4gICAgICAgIHN1cHBZSW5kZXggPj0gc3VwcGxlbWVudGFyeVlzLmxlbmd0aFxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzdXBwbGVtZW50YXJ5WXNbc3VwcFlJbmRleF0/LmNsaWNrYWJsZSA9PT0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBGb3IgZ3JvdXBlZCB0b29sdGlwcywgY2hlY2sgaWYgYW55IHZpc2libGUgaXRlbSBpcyBjbGlja2FibGVcbiAgICBjb25zdCB5SW5kZXggPSB0aGlzLmhvdmVyLnlJbmRleDtcbiAgICBpZiAodGhpcy5jb25maWcuZ3JvdXBlZFRvb2x0aXApIHtcbiAgICAgIC8vIENoZWNrIGlmIHRoZSBtYWluIFkgdmFsdWUgaXMgY2xpY2thYmxlXG4gICAgICBpZiAodGhpcy5kYXRhLnlzW3lJbmRleF0/LmNsaWNrYWJsZSA9PT0gdHJ1ZSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTaW5nbGUgaXRlbSB0b29sdGlwOiBjaGVjayBpZiB0aGUgaG92ZXJlZCBZIHZhbHVlIGlzIGNsaWNrYWJsZVxuICAgIHJldHVybiB0aGlzLmRhdGEueXNbeUluZGV4XT8uY2xpY2thYmxlID09PSB0cnVlO1xuICB9XG5cbiAgdmFyV3JhcChpbnB1dDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGB2YXIoJHtpbnB1dH0pYDtcbiAgfVxuXG4gIHZhckNvbG9yKGNvbG9yczogc3RyaW5nW10sIGluZGV4OiBudW1iZXIpIHtcbiAgICByZXR1cm4gdGhpcy52YXJXcmFwKGNvbG9yc1tpbmRleCAlIGNvbG9ycy5sZW5ndGhdKTtcbiAgfVxuXG4gIGRhcmtlbkNvbG9yKGNvbG9yOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYGNvbG9yLW1peChpbiBva2xhYiwgJHtjb2xvcn0gODAlLCBibGFjaylgO1xuICB9XG5cbiAgZGVFbXBoYXNpemVDb2xvcihjb2xvcjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGBjb2xvci1taXgoaW4gc3JnYiwgdHJhbnNwYXJlbnQgODUlLCAke2NvbG9yfSlgO1xuICB9XG5cbiAgLy9IZWxwZXIgbWV0aG9kcyBmb3IgZmxvd3NcblxuICBjaGVja1RoYXRIb3ZlckRhdGFJc0Zsb3coXG4gICAgaG92ZXJEYXRhOiBDaGFydC5Ib3ZlclJldHVybixcbiAgKTogaG92ZXJEYXRhIGlzIENoYXJ0LkZsb3dIb3ZlclJldHVybiB7XG4gICAgaWYgKGhvdmVyRGF0YSAhPT0gbnVsbCAmJiBob3ZlckRhdGEuaG92ZXJUeXBlID09PSAnZmxvdycpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjaGVja0ZvckZsb3dNYXRjaChcbiAgICBob3ZlcjogQ2hhcnQuRmxvd0hvdmVyVGFyZ2V0LFxuICAgIGVsZW1lbnQ6IENoYXJ0LlJlY3QgfCBDaGFydC5EYXRhTGFiZWwgfCBDaGFydC5GbG93Q29ubmVjdGlvblJlbmRlcixcbiAgICBtYXRjaFRpdGxlVG9SZWN0OiBib29sZWFuID0gZmFsc2UsXG4gICk6IGJvb2xlYW4ge1xuICAgIGlmIChcbiAgICAgIGhvdmVyLmhvdmVyVGFyZ2V0ID09PSAnYmFyJyAmJlxuICAgICAgZWxlbWVudC5lbGVtZW50VHlwZSA9PT0gJ3JlY3QnICYmXG4gICAgICBlbGVtZW50LnJlY3RUeXBlID09PSAnZmxvdydcbiAgICApIHtcbiAgICAgIGlmIChcbiAgICAgICAgaG92ZXIuYmFySWQgPT09IGVsZW1lbnQuaWQgJiZcbiAgICAgICAgaG92ZXIuYnVja2V0SW5kZXggPT09IGVsZW1lbnQuYnVja2V0SW5kZXggJiZcbiAgICAgICAgaG92ZXIuZm9yRGFya2VuID09PSBlbGVtZW50LmRhcmtlblxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBob3Zlci5ob3ZlclRhcmdldCA9PT0gJ2JhclRpdGxlJyAmJlxuICAgICAgZWxlbWVudC5lbGVtZW50VHlwZSA9PT0gJ2RhdGFMYWJlbCcgJiZcbiAgICAgIGVsZW1lbnQuZGF0YUxhYmVsVHlwZSA9PT0gJ2Zsb3cnXG4gICAgKSB7XG4gICAgICBpZiAoXG4gICAgICAgIGhvdmVyLmJhcklkID09PSBlbGVtZW50LmJhcklkICYmXG4gICAgICAgIGhvdmVyLmJ1Y2tldEluZGV4ID09PSBlbGVtZW50LmJ1Y2tldEluZGV4XG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIGhvdmVyLmhvdmVyVGFyZ2V0ID09PSAnYmFyVGl0bGUnICYmXG4gICAgICBlbGVtZW50LmVsZW1lbnRUeXBlID09PSAncmVjdCcgJiZcbiAgICAgIGVsZW1lbnQucmVjdFR5cGUgPT09ICdmbG93JyAmJlxuICAgICAgbWF0Y2hUaXRsZVRvUmVjdFxuICAgICkge1xuICAgICAgaWYgKFxuICAgICAgICBob3Zlci5iYXJJZCA9PT0gZWxlbWVudC5pZCAmJlxuICAgICAgICBob3Zlci5idWNrZXRJbmRleCA9PT0gZWxlbWVudC5idWNrZXRJbmRleFxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBob3Zlci5ob3ZlclRhcmdldCA9PT0gJ2Nvbm5lY3Rpb24nICYmXG4gICAgICBlbGVtZW50LmVsZW1lbnRUeXBlID09PSAnY29ubmVjdGlvbidcbiAgICApIHtcbiAgICAgIGlmIChcbiAgICAgICAgaG92ZXIuc3RhcnRCdWNrZXRJbmRleCA9PT0gZWxlbWVudC5zdGVwICYmXG4gICAgICAgIGhvdmVyLnN0YXJ0SWQgPT09IGVsZW1lbnQuc3RhcnQgJiZcbiAgICAgICAgaG92ZXIuZW5kSWQgPT09IGVsZW1lbnQuZW5kXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGdldEJhckNvbG9yKFxuICAgIHJlY3Q6IENoYXJ0LlJlY3QsXG4gICAgY29sb3JzOiBzdHJpbmdbXSxcbiAgICBpbmRleDogbnVtYmVyLFxuICAgIGhvdmVyRGF0YTogQ2hhcnQuSG92ZXJSZXR1cm4sXG4gICkge1xuICAgIGlmIChyZWN0LnJlY3RUeXBlID09PSAnZmxvdycgJiYgcmVjdC5jb2xvck92ZXJyaWRlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGJhc2VDb2xvciA9IHRoaXMudmFyV3JhcChyZWN0LmNvbG9yT3ZlcnJpZGUpO1xuICAgICAgY29uc3QgcG9zc2libHlEYXJrZW5lZENvbG9yID1cbiAgICAgICAgcmVjdC5kYXJrZW4gPT09IHRydWUgPyB0aGlzLmRhcmtlbkNvbG9yKGJhc2VDb2xvcikgOiBiYXNlQ29sb3I7XG4gICAgICBpZiAoXG4gICAgICAgIHJlY3QuZGVFbXBoYXNpemUgPT09IHRydWUgfHxcbiAgICAgICAgKHRoaXMuY2hlY2tUaGF0SG92ZXJEYXRhSXNGbG93KGhvdmVyRGF0YSkgJiZcbiAgICAgICAgICAhdGhpcy5jaGVja0ZvckZsb3dNYXRjaChob3ZlckRhdGEsIHJlY3QsIHRydWUpKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRlRW1waGFzaXplQ29sb3IocG9zc2libHlEYXJrZW5lZENvbG9yKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwb3NzaWJseURhcmtlbmVkQ29sb3I7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnZhckNvbG9yKGNvbG9ycywgaW5kZXgpO1xuICB9XG5cbiAgcmVhZG9ubHkgREVGQVVMVF9DT05ORUNUSU9OX0NPTE9SID0gJy0tcHVycC02MCc7XG5cbiAgZ2V0Q29ubmVjdGlvbkNvbG9yKCkge1xuICAgIGlmIChcbiAgICAgIHRoaXMuY29uZmlnLnR5cGUgPT09ICdmbG93JyAmJlxuICAgICAgdGhpcy5jb25maWcuZmxvd0NvbmZpZy5jb25uZWN0aW9uQ29sb3IgIT09IHVuZGVmaW5lZFxuICAgICkge1xuICAgICAgcmV0dXJuIHRoaXMudmFyV3JhcCh0aGlzLmNvbmZpZy5mbG93Q29uZmlnLmNvbm5lY3Rpb25Db2xvcik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnZhcldyYXAodGhpcy5ERUZBVUxUX0NPTk5FQ1RJT05fQ09MT1IpO1xuICB9XG5cbiAgcmVhZG9ubHkgU1RBTkRBUkRfQ09OTkVDVElPTl9PUEFDSVRZID0gMC4wNjI1O1xuICByZWFkb25seSBFTVBIQVNJWkVEX0NPTk5FQ1RJT05fT1BBQ0lUWSA9IDAuNTtcblxuICBnZXRDb25uZWN0aW9uT3BhY2l0eShcbiAgICBjb25uZWN0aW9uOiBDaGFydC5GbG93Q29ubmVjdGlvblJlbmRlcixcbiAgICBob3ZlckRhdGE6IENoYXJ0LkhvdmVyUmV0dXJuLFxuICApOiBudW1iZXIge1xuICAgIGlmIChcbiAgICAgICF0aGlzLmNoZWNrVGhhdEhvdmVyRGF0YUlzRmxvdyhob3ZlckRhdGEpIHx8XG4gICAgICBob3ZlckRhdGEuaG92ZXJUYXJnZXQgIT09ICdjb25uZWN0aW9uJ1xuICAgICkge1xuICAgICAgcmV0dXJuIHRoaXMuU1RBTkRBUkRfQ09OTkVDVElPTl9PUEFDSVRZO1xuICAgIH1cbiAgICBpZiAodGhpcy5jaGVja0ZvckZsb3dNYXRjaChob3ZlckRhdGEsIGNvbm5lY3Rpb24pKSB7XG4gICAgICByZXR1cm4gdGhpcy5FTVBIQVNJWkVEX0NPTk5FQ1RJT05fT1BBQ0lUWTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuU1RBTkRBUkRfQ09OTkVDVElPTl9PUEFDSVRZO1xuICB9XG5cbiAgZ2V0RGF0YUxhYmVsQ2xhc3MoXG4gICAgZGF0YUxhYmVsOiBDaGFydC5EYXRhTGFiZWwsXG4gICAgY29uZmlnOiBDaGFydC5Db25maWcsXG4gICAgaG92ZXJEYXRhOiBDaGFydC5Ib3ZlclJldHVybixcbiAgKTogJ2RhdGEtbGFiZWwnIHwgJ2Zsb3ctZGF0YS1sYWJlbCcge1xuICAgIGlmIChcbiAgICAgIGNvbmZpZy50eXBlID09PSAnZmxvdycgJiZcbiAgICAgIHRoaXMuY2hlY2tUaGF0SG92ZXJEYXRhSXNGbG93KGhvdmVyRGF0YSkgJiZcbiAgICAgIHRoaXMuY2hlY2tGb3JGbG93TWF0Y2goaG92ZXJEYXRhLCBkYXRhTGFiZWwpXG4gICAgKSB7XG4gICAgICByZXR1cm4gJ2Zsb3ctZGF0YS1sYWJlbCc7XG4gICAgfVxuICAgIHJldHVybiAnZGF0YS1sYWJlbCc7XG4gIH1cblxuICBnZXREYXRhTGFiZWxPcGFjaXR5KFxuICAgIGRhdGFMYWJlbDogQ2hhcnQuRGF0YUxhYmVsLFxuICAgIGNvbmZpZzogQ2hhcnQuQ29uZmlnLFxuICAgIGhvdmVyRGF0YTogQ2hhcnQuSG92ZXJSZXR1cm4sXG4gICk6IG51bWJlciB7XG4gICAgaWYgKFxuICAgICAgY29uZmlnLnR5cGUgPT09ICdmbG93JyAmJlxuICAgICAgdGhpcy5jaGVja1RoYXRIb3ZlckRhdGFJc0Zsb3coaG92ZXJEYXRhKSAmJlxuICAgICAgIXRoaXMuY2hlY2tGb3JGbG93TWF0Y2goaG92ZXJEYXRhLCBkYXRhTGFiZWwpXG4gICAgKSB7XG4gICAgICByZXR1cm4gMC4xNTtcbiAgICB9XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICBzaG93QmFyQm9yZGVycyhyZWN0OiBDaGFydC5SZWN0LCBob3ZlckRhdGE6IENoYXJ0LkhvdmVyUmV0dXJuKTogYm9vbGVhbiB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5jaGVja1RoYXRIb3ZlckRhdGFJc0Zsb3coaG92ZXJEYXRhKSAmJlxuICAgICAgdGhpcy5jaGVja0ZvckZsb3dNYXRjaChob3ZlckRhdGEsIHJlY3QpXG4gICAgKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgc2hvd05vbkRpc3BsYXlSZWN0KHJlY3Q6IENoYXJ0LlJlY3QsIGhvdmVyRGF0YTogQ2hhcnQuSG92ZXJSZXR1cm4pOiBib29sZWFuIHtcbiAgICBpZiAoXG4gICAgICByZWN0Lm5vbkRpc3BsYXkgJiZcbiAgICAgIHRoaXMuY2hlY2tUaGF0SG92ZXJEYXRhSXNGbG93KGhvdmVyRGF0YSkgJiZcbiAgICAgIHRoaXMuY2hlY2tGb3JGbG93TWF0Y2goaG92ZXJEYXRhLCByZWN0LCB0cnVlKVxuICAgICkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGdldEJ1Y2tldENvbmZpZ0luZm8oXG4gICAgaG92ZXJEYXRhOiBDaGFydC5GbG93SG92ZXJSZXR1cm4gfCBudWxsLFxuICAgIGlkZW50aWZpZXI6ICdzdGFydElkJyB8ICdlbmRJZCcgfCAnYmFySWQnLFxuICApOiB7XG4gICAgdGl0bGU6IHN0cmluZztcbiAgICBjb2xvcjogc3RyaW5nO1xuICB9IHtcbiAgICBpZiAoaG92ZXJEYXRhID09PSBudWxsIHx8IHRoaXMuY29uZmlnLnR5cGUgIT09ICdmbG93Jykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdGl0bGU6ICcnLFxuICAgICAgICBjb2xvcjogJycsXG4gICAgICB9O1xuICAgIH1cbiAgICAvL1RoZSBodG1sIGFscmVhZHkgZW5zdXJlcyB0aGUgaG92ZXJUYXJnZXQgYW5kIGlkZW50aWZpZXIgbWF0Y2gsIGJ1dCB0aGUgYnVpbGQgaXNuJ3QgcmVjb2duaXppbmcgdGhhdFxuICAgIGxldCBpZDogc3RyaW5nID0gJyc7XG4gICAgaWYgKGhvdmVyRGF0YS5ob3ZlclRhcmdldCA9PT0gJ2Nvbm5lY3Rpb24nKSB7XG4gICAgICBpZiAoaWRlbnRpZmllciA9PT0gJ2JhcklkJykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHRpdGxlOiAnJyxcbiAgICAgICAgICBjb2xvcjogJycsXG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZCA9IGhvdmVyRGF0YVtpZGVudGlmaWVyXTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGlkZW50aWZpZXIgIT09ICdiYXJJZCcpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0aXRsZTogJycsXG4gICAgICAgICAgY29sb3I6ICcnLFxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWQgPSBob3ZlckRhdGFbaWRlbnRpZmllcl07XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGZvdW5kSW5mbyA9IHRoaXMuY29uZmlnLmZsb3dDb25maWcuc3ViQnVja2V0c0NvbmZpZy5maW5kKFxuICAgICAgc2JjID0+IHNiYy5idWNrZXRJZCA9PT0gaWQsXG4gICAgKTtcbiAgICBpZiAoIWZvdW5kSW5mbykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdGl0bGU6ICcnLFxuICAgICAgICBjb2xvcjogJycsXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgdGl0bGU6IGZvdW5kSW5mby5idWNrZXROYW1lLFxuICAgICAgY29sb3I6IGZvdW5kSW5mby5jb2xvcixcbiAgICB9O1xuICB9XG5cbiAgZ2V0SXRlbUNvbG9yKFxuICAgIGl0ZW06IENoYXJ0LkRhdGFZIHwgQ2hhcnQuU3VwcGxlbWVudGFyeURhdGFZLFxuICAgIGl0ZW1JbmRleDogbnVtYmVyLFxuICApOiBzdHJpbmcge1xuICAgIC8vRmxvd3MgZ2V0IHRoZWlyIGNvbG9yIHZpYSBhIGRpZmZlcmVudCBtZXRob2RcbiAgICBpZiAodGhpcy5kYXRhLnR5cGUgPT09ICdmbG93Jykge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIC8vIFVzZSBpbmRleCB0byBnZXQgdGhlIG9yaWdpbmFsIGl0ZW0gKGRyYXdEYXRhJCBtYWludGFpbnMgc2FtZSBpbmRpY2VzIGFzIHRoaXMuZGF0YSlcbiAgICBjb25zdCBvcmlnaW5hbEl0ZW0gPVxuICAgICAgJ3N1cHBsZW1lbnRhbEluZGV4JyBpbiBpdGVtXG4gICAgICAgID8gdGhpcy5kYXRhLnN1cHBsZW1lbnRhcnlZcyFbaXRlbUluZGV4XVxuICAgICAgICA6IHRoaXMuZGF0YS55c1tpdGVtSW5kZXhdO1xuXG4gICAgcmV0dXJuIENoYXJ0LmdldENvbG9yKG9yaWdpbmFsSXRlbSwgdGhpcy5jb2xvckluZGljZXMsIHRoaXMuY29uZmlnLmNvbG9ycyk7XG4gIH1cblxuICBzaG93TW9yZVRvb2x0aXAgPSBmYWxzZTtcbiAgbG9ja1Nob3dNb3JlVG9vbHRpcCA9IGZhbHNlO1xuXG4gIG1vcmVUZXh0V2lkdGggPSA1MDtcbiAgYmFzZUxlZ2VuZEl0ZW1XaWR0aCA9IDQwO1xuXG4gIGZpcnN0SGlkZGVuTGVnZW5kSXRlbUluZGV4JCA9IGNvbWJpbmVMYXRlc3QoW1xuICAgIHRoaXMud2lkdGgkLFxuICAgIHRoaXMuY29uZmlnJCxcbiAgICB0aGlzLmRhdGEkLFxuICBdKS5waXBlKFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKChwcmV2LCBjdXJyZW50KSA9PiBpc0VxdWFsKHByZXYsIGN1cnJlbnQpKSxcbiAgICBtYXAoKFt3aWR0aCwgY29uZmlnLCBkYXRhXSkgPT4ge1xuICAgICAgaWYgKGRhdGEudHlwZSA9PT0gJ2Zsb3cnKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZGF0YUluZGV4OiAwLFxuICAgICAgICAgIHN1cHBJbmRleDogMCxcbiAgICAgICAgICBoaWRkZW5Db3VudDogdW5kZWZpbmVkLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKCFjb25maWcudHJ1bmNhdGVMZWdlbmQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBkYXRhSW5kZXg6IGRhdGEueXMubGVuZ3RoLFxuICAgICAgICAgIHN1cHBJbmRleDogZGF0YS5zdXBwbGVtZW50YXJ5WXM/Lmxlbmd0aCA/PyAwLFxuICAgICAgICAgIGhpZGRlbkNvdW50OiB1bmRlZmluZWQsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBsZXQgd2lkdGhSdW5uaW5nVG90YWwgPSAwO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLnlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChkYXRhLnlzW2ldLnNob3dMZWdlbmRJdGVtID09PSBmYWxzZSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGluZEl0ZW1XaWR0aCA9XG4gICAgICAgICAgdGhpcy5iYXNlTGVnZW5kSXRlbVdpZHRoICtcbiAgICAgICAgICBkYXRhLnlzW2ldLmxhYmVsLmxlbmd0aCAqIENoYXJ0LldJRFRIX1BFUl9MRVRURVI7XG4gICAgICAgIGlmICh3aWR0aFJ1bm5pbmdUb3RhbCArIGluZEl0ZW1XaWR0aCA+PSB3aWR0aCAtIHRoaXMubW9yZVRleHRXaWR0aCkge1xuICAgICAgICAgIGNvbnN0IHJlbWFpbmluZ1lzQ291bnQgPSBkYXRhLnlzXG4gICAgICAgICAgICAuc2xpY2UoaSlcbiAgICAgICAgICAgIC5maWx0ZXIoeSA9PiB5LnNob3dMZWdlbmRJdGVtICE9PSBmYWxzZSkubGVuZ3RoO1xuICAgICAgICAgIGNvbnN0IHN1cHBZc0NvdW50ID1cbiAgICAgICAgICAgIGRhdGEuc3VwcGxlbWVudGFyeVlzPy5maWx0ZXIoeSA9PiB5LnNob3dMZWdlbmRJdGVtICE9PSBmYWxzZSlcbiAgICAgICAgICAgICAgLmxlbmd0aCA/PyAwO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkYXRhSW5kZXg6IGksXG4gICAgICAgICAgICBzdXBwSW5kZXg6IDAsXG4gICAgICAgICAgICBoaWRkZW5Db3VudDogcmVtYWluaW5nWXNDb3VudCArIHN1cHBZc0NvdW50LFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgd2lkdGhSdW5uaW5nVG90YWwgKz0gaW5kSXRlbVdpZHRoO1xuICAgICAgfVxuICAgICAgaWYgKGRhdGEuc3VwcGxlbWVudGFyeVlzKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5zdXBwbGVtZW50YXJ5WXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAoZGF0YS5zdXBwbGVtZW50YXJ5WXNbaV0uc2hvd0xlZ2VuZEl0ZW0gPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgaW5kSXRlbVdpZHRoID1cbiAgICAgICAgICAgIHRoaXMuYmFzZUxlZ2VuZEl0ZW1XaWR0aCArXG4gICAgICAgICAgICBkYXRhLnN1cHBsZW1lbnRhcnlZc1tpXS5sYWJlbC5sZW5ndGggKiBDaGFydC5XSURUSF9QRVJfTEVUVEVSO1xuICAgICAgICAgIGlmICh3aWR0aFJ1bm5pbmdUb3RhbCArIGluZEl0ZW1XaWR0aCA+PSB3aWR0aCAtIHRoaXMubW9yZVRleHRXaWR0aCkge1xuICAgICAgICAgICAgY29uc3QgcmVtYWluaW5nU3VwcFlzQ291bnQgPSBkYXRhLnN1cHBsZW1lbnRhcnlZc1xuICAgICAgICAgICAgICAuc2xpY2UoaSlcbiAgICAgICAgICAgICAgLmZpbHRlcih5ID0+IHkuc2hvd0xlZ2VuZEl0ZW0gIT09IGZhbHNlKS5sZW5ndGg7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBkYXRhSW5kZXg6IGRhdGEueXMubGVuZ3RoLFxuICAgICAgICAgICAgICBzdXBwSW5kZXg6IGksXG4gICAgICAgICAgICAgIGhpZGRlbkNvdW50OiByZW1haW5pbmdTdXBwWXNDb3VudCxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIHdpZHRoUnVubmluZ1RvdGFsICs9IGluZEl0ZW1XaWR0aDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGF0YUluZGV4OiBkYXRhLnlzLmxlbmd0aCxcbiAgICAgICAgc3VwcEluZGV4OiBkYXRhLnN1cHBsZW1lbnRhcnlZcz8ubGVuZ3RoID8/IDAsXG4gICAgICAgIGhpZGRlbkNvdW50OiB1bmRlZmluZWQsXG4gICAgICB9O1xuICAgIH0pLFxuICApO1xuXG4gIG1vcmVDbGljaygpIHtcbiAgICB0aGlzLmxvY2tTaG93TW9yZVRvb2x0aXAgPSAhdGhpcy5sb2NrU2hvd01vcmVUb29sdGlwO1xuICB9XG5cbiAgY2xvc2VIYW5kbGVyKCkge1xuICAgIHRoaXMubG9ja1Nob3dNb3JlVG9vbHRpcCA9IGZhbHNlO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgbW91c2VvdmVyTGVnZW5kKCkge1xuICAgIHRoaXMuc2hvd01vcmVUb29sdGlwID0gdHJ1ZTtcbiAgfVxuXG4gIG1vdXNlbGVhdmVMZWdlbmQoKSB7XG4gICAgdGhpcy5zaG93TW9yZVRvb2x0aXAgPSBmYWxzZTtcbiAgfVxuXG4gIC8vU2luY2Ugc2Nyb2xsYmFyIHNpemUgZGVwZW5lZHMgb24gYnJvd3Nlciwgd2UgaGF2ZSB0byB1c2UgYSBtZXRob2QgbGlrZSB0aGlzIHRvIGZpZ3VyZSBvdXQgdGhlIGNvcnJlY3Qgc2Nyb2xsYmFyIHRoaWNrbmVzc1xuICBtZWFzdXJlU2Nyb2xsYmFyVGhpY2tuZXNzKCkge1xuICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG4gICAgZGl2LnN0eWxlLndpZHRoID0gJzEwMHB4JztcbiAgICBkaXYuc3R5bGUuaGVpZ2h0ID0gJzEwMHB4JztcbiAgICBkaXYuc3R5bGUub3ZlcmZsb3cgPSAnc2Nyb2xsJztcbiAgICBkaXYuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgIGRpdi5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG5cbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGRpdik7XG5cbiAgICBjb25zdCB0aGlja25lc3MgPSB7XG4gICAgICB2ZXJ0aWNhbDogZGl2Lm9mZnNldFdpZHRoIC0gZGl2LmNsaWVudFdpZHRoLFxuICAgICAgaG9yaXpvbnRhbDogZGl2Lm9mZnNldEhlaWdodCAtIGRpdi5jbGllbnRIZWlnaHQsXG4gICAgfTtcblxuICAgIGRpdi5yZW1vdmUoKTtcbiAgICByZXR1cm4gdGhpY2tuZXNzO1xuICB9XG5cbiAgZ2V0U3ViY29udGFpbmVySGVpZ2h0KGRhdGE6IERyYXdEYXRhIHwgbnVsbCk6IHN0cmluZyB7XG4gICAgaWYgKGRhdGEgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBgJHt0aGlzLmhlaWdodH1weGA7XG4gICAgfVxuICAgIGxldCBoZWlnaHQgPSB0aGlzLmhlaWdodDtcbiAgICBpZiAoXG4gICAgICBkYXRhLmNoYXJ0SGVpZ2h0IDwgdGhpcy5oZWlnaHQgJiZcbiAgICAgIGRhdGEudmVydGljYWxDb250YWluZXJTY2FsZSA9PT0gJ3NocmluaydcbiAgICApIHtcbiAgICAgIC8vU2hyaW5raW5nIHRvIGZpdCBjb250ZW50LCBidXQgYWNjb3VudGluZyBmb3IgcG90ZW50aWFsIHNjcm9sbGJhcnNcbiAgICAgIGNvbnN0IGhvcml6b250YWxTY3JvbGxEZXRlY3RlZCA9IGRhdGEuY2hhcnRXaWR0aCA+IHRoaXMud2lkdGg7XG4gICAgICBjb25zdCBzY3JvbGxiYXIgPSB0aGlzLm1lYXN1cmVTY3JvbGxiYXJUaGlja25lc3MoKTtcbiAgICAgIGhlaWdodCA9IE1hdGgubWluKFxuICAgICAgICBoZWlnaHQsXG4gICAgICAgIGRhdGEuY2hhcnRIZWlnaHQgK1xuICAgICAgICAgIChob3Jpem9udGFsU2Nyb2xsRGV0ZWN0ZWQgPyBzY3JvbGxiYXIuaG9yaXpvbnRhbCA6IDApLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGAke2hlaWdodH1weGA7XG4gIH1cblxuICBnZXRTdWJjb250YWluZXJXaWR0aChkYXRhOiBEcmF3RGF0YSB8IG51bGwpOiBzdHJpbmcge1xuICAgIGlmIChkYXRhID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gYCR7dGhpcy53aWR0aH1weGA7XG4gICAgfVxuICAgIGxldCB3aWR0aCA9IHRoaXMud2lkdGg7XG4gICAgaWYgKFxuICAgICAgZGF0YS5jaGFydFdpZHRoIDwgdGhpcy53aWR0aCAmJlxuICAgICAgZGF0YS5ob3Jpem9udGFsQ29udGFpbmVyU2NhbGUgPT09ICdzaHJpbmsnXG4gICAgKSB7XG4gICAgICAvL1Nocmlua2luZyB0byBmaXQgY29udGVudCwgYnV0IGFjY291bnRpbmcgZm9yIHBvdGVudGlhbCBzY3JvbGxiYXJzXG4gICAgICBjb25zdCB2ZXJ0aWNhbFNjcm9sbERldGVjdGVkID0gZGF0YS5jaGFydEhlaWdodCA+IHRoaXMuaGVpZ2h0O1xuICAgICAgY29uc3Qgc2Nyb2xsYmFyID0gdGhpcy5tZWFzdXJlU2Nyb2xsYmFyVGhpY2tuZXNzKCk7XG4gICAgICB3aWR0aCA9IE1hdGgubWluKFxuICAgICAgICB3aWR0aCxcbiAgICAgICAgZGF0YS5jaGFydFdpZHRoICsgKHZlcnRpY2FsU2Nyb2xsRGV0ZWN0ZWQgPyBzY3JvbGxiYXIudmVydGljYWwgOiAwKSxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBgJHt3aWR0aH1weGA7XG4gIH1cblxuICBnZXRCb3R0b21MYWJlbFkoZGF0YTogQ2hhcnQuUmVuZGVyZWRDaGFydCk6IG51bWJlciB7XG4gICAgcmV0dXJuIChcbiAgICAgIGRhdGEuY2hhcnRIZWlnaHQgLVxuICAgICAgKGRhdGEuY2hhcnRTaXppbmdWYWx1ZXMuYm90dG9tUGFkZGluZyAtIGRhdGEuY2hhcnRTaXppbmdWYWx1ZXMuZm9udFNpemUpIC9cbiAgICAgICAgMlxuICAgICk7XG4gIH1cblxuICBnZXRGb250U2l6ZShkYXRhOiBDaGFydC5SZW5kZXJlZENoYXJ0IHwgbnVsbCk6IHN0cmluZyB7XG4gICAgY29uc3QgY2hhcnRTaXppbmdGb250U2l6ZSA9IGRhdGE/LmNoYXJ0U2l6aW5nVmFsdWVzLmZvbnRTaXplO1xuICAgIGlmIChjaGFydFNpemluZ0ZvbnRTaXplICYmIGNoYXJ0U2l6aW5nRm9udFNpemUgPiAwKSB7XG4gICAgICByZXR1cm4gY2hhcnRTaXppbmdGb250U2l6ZS50b1N0cmluZygpLmNvbmNhdCgncHgnKTtcbiAgICB9XG4gICAgcmV0dXJuIENoYXJ0LkRFRkFVTFRfRk9OVF9TSVpFLnRvU3RyaW5nKCkuY29uY2F0KCdweCcpO1xuICB9XG5cbiAgY2hlY2tGb3JOb25EaXNwbGF5U3RhdGUoZGF0YTogRHJhd0RhdGEgfCBudWxsKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgbGV0IGVtcHR5ID0gZmFsc2U7XG4gICAgaWYgKGRhdGEgPT09IG51bGwpIHtcbiAgICAgIGVtcHR5ID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKGRhdGEuZGF0YS50eXBlID09PSAnZmxvdycpIHtcbiAgICAgIGVtcHR5ID0gZGF0YS5kYXRhLnlzLmxlbmd0aCA9PT0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgZW1wdHkgPVxuICAgICAgICAoZGF0YS5kYXRhLngubGVuZ3RoID09PSAwICYmIHRoaXMuY29uZmlnLnR5cGUgIT09ICdkb251dCcpIHx8XG4gICAgICAgIGRhdGEuZGF0YS55cy5sZW5ndGggPT09IDA7XG4gICAgfVxuICAgIGlmIChlbXB0eSkge1xuICAgICAgcmV0dXJuICd6ZXJvU3RhdGUnO1xuICAgIH1cbiAgICBpZiAoZGF0YSAmJiBkYXRhLmNoYXJ0RXJyb3IgPT09ICdzaXppbmcnKSB7XG4gICAgICByZXR1cm4gJ3NpemluZ0Vycm9yU3RhdGUnO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHN0YW5kYXJkSG92ZXJEYXRhR3VhcmQoXG4gICAgaG92ZXJEYXRhOiBDaGFydC5Ib3ZlclJldHVybixcbiAgKTogRXh0cmFjdDxDaGFydC5Ib3ZlclJldHVybiwgeyBob3ZlclR5cGU6ICdzdGFuZGFyZCcgfT4gfCBudWxsIHtcbiAgICBpZiAoaG92ZXJEYXRhID09PSBudWxsIHx8IGhvdmVyRGF0YS5ob3ZlclR5cGUgPT09ICdmbG93Jykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBob3ZlckRhdGE7XG4gIH1cblxuICBmbG93SG92ZXJEYXRhR3VhcmQoXG4gICAgaG92ZXJEYXRhOiBDaGFydC5Ib3ZlclJldHVybixcbiAgKTogQ2hhcnQuRmxvd0hvdmVyUmV0dXJuIHwgbnVsbCB7XG4gICAgaWYgKGhvdmVyRGF0YSA9PT0gbnVsbCB8fCBob3ZlckRhdGEuaG92ZXJUeXBlID09PSAnc3RhbmRhcmQnKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGhvdmVyRGF0YTtcbiAgfVxufVxuIiwiPGRpdlxuICBjbGFzcz1cImNvbnRhaW5lclwiXG4gIChyaXZDbGllbnRTaXplKT1cIndpZHRoID0gJGV2ZW50LndpZHRoXCJcbiAgKm5nSWY9XCJ7IGQ6IGRyYXdEYXRhJCB8IGFzeW5jIH0gYXMgdm1cIlxuICBbc3R5bGUuLS1vdmVycmlkZS1mb250LXNpemVdPVwiZ2V0Rm9udFNpemUodm0uZClcIlxuPlxuICA8bmctY29udGFpbmVyXG4gICAgKm5nSWY9XCJcbiAgICAgICFjaGVja0Zvck5vbkRpc3BsYXlTdGF0ZSh2bS5kKSAmJiAoZHJhd0RhdGEkIHwgYXN5bmMpO1xuICAgICAgbGV0IGQ7XG4gICAgICBlbHNlOiBub25EaXNwbGF5U3RhdGVcbiAgICBcIlxuICA+XG4gICAgPGRpdlxuICAgICAgKG1vdXNlbW92ZSk9XCJtb3VzZW1vdmUoJGV2ZW50LCBkLmhvdmVyKVwiXG4gICAgICAobW91c2VsZWF2ZSk9XCJtb3VzZWxlYXZlKCRldmVudClcIlxuICAgICAgKGNsaWNrKT1cImNsaWNrKClcIlxuICAgICAgI2NvbnRhaW5lclxuICAgICAgY2xhc3M9XCJzdWItY29udGFpbmVyXCJcbiAgICAgIFtjbGFzcy5jbGlja2FibGVdPVwiaXNIb3ZlckNsaWNrYWJsZVwiXG4gICAgICB0YWJJbmRleD1cIjBcIlxuICAgICAgW25nQ2xhc3NdPVwieyAnZG9udXQtY29udGFpbmVyJzogY29uZmlnLnR5cGUgPT09ICdkb251dCcgfVwiXG4gICAgICBbbmdTdHlsZV09XCJ7XG4gICAgICAgIGhlaWdodDogZ2V0U3ViY29udGFpbmVySGVpZ2h0KGQpLFxuICAgICAgICB3aWR0aDogZ2V0U3ViY29udGFpbmVyV2lkdGgoZClcbiAgICAgIH1cIlxuICAgID5cbiAgICAgIDxzdmc6c3ZnXG4gICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxuICAgICAgICBbYXR0ci52aWV3Qm94XT1cImQudmlld0JveFwiXG4gICAgICAgIFthdHRyLmhlaWdodF09XCJkLmNoYXJ0SGVpZ2h0XCJcbiAgICAgICAgW2F0dHIud2lkdGhdPVwiZC5jaGFydFdpZHRoXCJcbiAgICAgID5cbiAgICAgICAgPGRlZnM+XG4gICAgICAgICAgPCEtLSBTdHJpcGUgcGF0dGVybiAtLT5cbiAgICAgICAgICA8cGF0dGVyblxuICAgICAgICAgICAgaWQ9XCJzdHJpcGVzXCJcbiAgICAgICAgICAgIHg9XCIwXCJcbiAgICAgICAgICAgIHk9XCIwXCJcbiAgICAgICAgICAgIFthdHRyLndpZHRoXT1cIjEwXCJcbiAgICAgICAgICAgIFthdHRyLmhlaWdodF09XCIxMFwiXG4gICAgICAgICAgICBwYXR0ZXJuVW5pdHM9XCJ1c2VyU3BhY2VPblVzZVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGxpbmVcbiAgICAgICAgICAgICAgW2F0dHIueDFdPVwiMFwiXG4gICAgICAgICAgICAgIFthdHRyLnkxXT1cIjEwXCJcbiAgICAgICAgICAgICAgW2F0dHIueDJdPVwiMTBcIlxuICAgICAgICAgICAgICBbYXR0ci55Ml09XCIwXCJcbiAgICAgICAgICAgICAgc3Ryb2tlPVwidmFyKC0td2hpdGUtMTAwKVwiXG4gICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjFcIlxuICAgICAgICAgICAgPjwvbGluZT5cbiAgICAgICAgICA8L3BhdHRlcm4+XG4gICAgICAgIDwvZGVmcz5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiEoY29uZmlnLnR5cGUgPT09ICdob3Jpem9udGFsLWJhcicpXCI+XG4gICAgICAgICAgPGcgKm5nRm9yPVwibGV0IHRpY2sgb2YgZC54VGlja3NcIiB0ZXh0LWFuY2hvcj1cIm1pZGRsZVwiPlxuICAgICAgICAgICAgPHRleHRcbiAgICAgICAgICAgICAgY2xhc3M9XCJ0aWNrLWxhYmVsXCJcbiAgICAgICAgICAgICAgW2F0dHIueF09XCJ0aWNrLnhcIlxuICAgICAgICAgICAgICBbYXR0ci55XT1cImdldEJvdHRvbUxhYmVsWShkKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHt7IHRpY2subGFiZWwgfX1cbiAgICAgICAgICAgIDwvdGV4dD5cbiAgICAgICAgICA8L2c+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29uZmlnLnR5cGUgPT09ICdob3Jpem9udGFsLWJhcidcIj5cbiAgICAgICAgICA8ZyAqbmdGb3I9XCJsZXQgdGljayBvZiBkLnhUaWNrc1wiIHRleHQtYW5jaG9yPVwibGVmdFwiPlxuICAgICAgICAgICAgPHRleHRcbiAgICAgICAgICAgICAgY2xhc3M9XCJ0aWNrLWxhYmVsXCJcbiAgICAgICAgICAgICAgW2F0dHIueF09XCJ0aWNrLnhcIlxuICAgICAgICAgICAgICBbYXR0ci55XT1cImQuY2hhcnRTaXppbmdWYWx1ZXMuZm9udFNpemVcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7eyB0aWNrLmxhYmVsIH19XG4gICAgICAgICAgICA8L3RleHQ+XG4gICAgICAgICAgICA8bGluZVxuICAgICAgICAgICAgICBjbGFzcz1cInRpY2stbGluZVwiXG4gICAgICAgICAgICAgIFthdHRyLngxXT1cInRpY2sueFwiXG4gICAgICAgICAgICAgIFthdHRyLngyXT1cInRpY2sueFwiXG4gICAgICAgICAgICAgIHkxPVwiMFwiXG4gICAgICAgICAgICAgIFthdHRyLnkyXT1cImQuY2hhcnRIZWlnaHRcIlxuICAgICAgICAgICAgPjwvbGluZT5cbiAgICAgICAgICAgIDx0ZXh0XG4gICAgICAgICAgICAgICpuZ0lmPVwidGljay5zZWNvbmRhcnlMYWJlbFwiXG4gICAgICAgICAgICAgIGNsYXNzPVwidGljay1sYWJlbFwiXG4gICAgICAgICAgICAgIFthdHRyLnhdPVwidGljay54XCJcbiAgICAgICAgICAgICAgW2F0dHIueV09XCJnZXRCb3R0b21MYWJlbFkoZClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7eyB0aWNrLnNlY29uZGFyeUxhYmVsIH19XG4gICAgICAgICAgICA8L3RleHQ+XG4gICAgICAgICAgPC9nPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPGcgKm5nRm9yPVwibGV0IHRpY2sgb2YgZC55VGlja3NcIj5cbiAgICAgICAgICA8bGluZVxuICAgICAgICAgICAgKm5nSWY9XCIhKGNvbmZpZy50eXBlID09PSAnaG9yaXpvbnRhbC1iYXInKVwiXG4gICAgICAgICAgICBjbGFzcz1cInRpY2stbGluZVwiXG4gICAgICAgICAgICBbYXR0ci55MV09XCJ0aWNrLnlcIlxuICAgICAgICAgICAgW2F0dHIueTJdPVwidGljay55XCJcbiAgICAgICAgICAgIHgxPVwiMFwiXG4gICAgICAgICAgICBbYXR0ci54Ml09XCJkLmNoYXJ0V2lkdGhcIlxuICAgICAgICAgID48L2xpbmU+XG4gICAgICAgICAgPHRleHRcbiAgICAgICAgICAgIHJpdlNWR1RleHRUcnVuY2F0ZVxuICAgICAgICAgICAgW3RleHRdPVwidGljay5sYWJlbFwiXG4gICAgICAgICAgICBbd2lkdGhdPVwiXG4gICAgICAgICAgICAgIGNvbmZpZy50eXBlID09PSAnaG9yaXpvbnRhbC1iYXInXG4gICAgICAgICAgICAgICAgPyBkLmNoYXJ0U2l6aW5nVmFsdWVzLmxlZnRCdWNrZXRMYWJlbFxuICAgICAgICAgICAgICAgIDogZC5jaGFydFNpemluZ1ZhbHVlcy5sZWZ0UGFkZGluZ1xuICAgICAgICAgICAgXCJcbiAgICAgICAgICAgIGNsYXNzPVwidGljay1sYWJlbFwiXG4gICAgICAgICAgICBbYXR0ci55XT1cInRpY2sueVwiXG4gICAgICAgICAgICBbYXR0ci54XT1cIjBcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7IHRpY2subGFiZWwgfX1cbiAgICAgICAgICA8L3RleHQ+XG4gICAgICAgICAgPHRleHRcbiAgICAgICAgICAgICpuZ0lmPVwidGljay5zZWNvbmRhcnlMYWJlbFwiXG4gICAgICAgICAgICByaXZTVkdUZXh0VHJ1bmNhdGVcbiAgICAgICAgICAgIFt0ZXh0XT1cInRpY2suc2Vjb25kYXJ5TGFiZWxcIlxuICAgICAgICAgICAgW3dpZHRoXT1cImQuY2hhcnRTaXppbmdWYWx1ZXMucmlnaHRQYWRkaW5nXCJcbiAgICAgICAgICAgIGNsYXNzPVwidGljay1sYWJlbFwiXG4gICAgICAgICAgICBbYXR0ci55XT1cInRpY2sueVwiXG4gICAgICAgICAgICBbYXR0ci54XT1cImQuY2hhcnRXaWR0aFwiXG4gICAgICAgICAgICB0ZXh0LWFuY2hvcj1cImVuZFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAge3sgdGljay5zZWNvbmRhcnlMYWJlbCB9fVxuICAgICAgICAgIDwvdGV4dD5cbiAgICAgICAgPC9nPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic3RhbmRhcmRIb3ZlckRhdGFHdWFyZChob3ZlcikgYXMgaG92ZXJEYXRhXCI+XG4gICAgICAgICAgPGcgKm5nSWY9XCJjb25maWcudHlwZSAhPT0gJ2hvcml6b250YWwtYmFyJ1wiPlxuICAgICAgICAgICAgPGxpbmVcbiAgICAgICAgICAgICAgY2xhc3M9XCJ0aWNrLWxpbmVcIlxuICAgICAgICAgICAgICBbYXR0ci54MV09XCJob3ZlckRhdGE/LnhcIlxuICAgICAgICAgICAgICBbYXR0ci54Ml09XCJob3ZlckRhdGE/LnhcIlxuICAgICAgICAgICAgICB5MT1cIjBcIlxuICAgICAgICAgICAgICBbYXR0ci55Ml09XCJkLmNoYXJ0SGVpZ2h0XCJcbiAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMlwiXG4gICAgICAgICAgICAgIHN0cm9rZS1kYXNoYXJyYXk9XCI0XCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9nPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPGcgKm5nRm9yPVwibGV0IGJhciBvZiBkLmJhcnM7IGxldCBpID0gaW5kZXhcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCByZWN0IG9mIGJhcjsgbGV0IGogPSBpbmRleFwiPlxuICAgICAgICAgICAgPGRlZnMgKm5nSWY9XCJyZWN0LnBhdHRlcm4gPT09ICdkb3RzJ1wiPlxuICAgICAgICAgICAgICA8cGF0dGVyblxuICAgICAgICAgICAgICAgIFthdHRyLmlkXT1cIidkb3RzLScgKyBpICsgJy0nICsgalwiXG4gICAgICAgICAgICAgICAgcGF0dGVyblVuaXRzPVwidXNlclNwYWNlT25Vc2VcIlxuICAgICAgICAgICAgICAgIFthdHRyLnhdPVwicmVjdC54XCJcbiAgICAgICAgICAgICAgICBbYXR0ci55XT1cInJlY3QueVwiXG4gICAgICAgICAgICAgICAgd2lkdGg9XCI0XCJcbiAgICAgICAgICAgICAgICBoZWlnaHQ9XCI0XCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxjaXJjbGVcbiAgICAgICAgICAgICAgICAgIGN4PVwiMlwiXG4gICAgICAgICAgICAgICAgICBjeT1cIjJcIlxuICAgICAgICAgICAgICAgICAgcj1cIjEuNVwiXG4gICAgICAgICAgICAgICAgICBbYXR0ci5maWxsXT1cInZhckNvbG9yKGQuY29sb3JzLCBpKVwiXG4gICAgICAgICAgICAgICAgPjwvY2lyY2xlPlxuICAgICAgICAgICAgICA8L3BhdHRlcm4+XG4gICAgICAgICAgICA8L2RlZnM+XG5cbiAgICAgICAgICAgIDxyZWN0XG4gICAgICAgICAgICAgICpuZ0lmPVwicmVjdC5ub25EaXNwbGF5ICE9PSB0cnVlXCJcbiAgICAgICAgICAgICAgW2F0dHIueF09XCJyZWN0LnhcIlxuICAgICAgICAgICAgICBbYXR0ci55XT1cInJlY3QueVwiXG4gICAgICAgICAgICAgIFthdHRyLndpZHRoXT1cInJlY3Qud2lkdGhcIlxuICAgICAgICAgICAgICBbYXR0ci5oZWlnaHRdPVwicmVjdC5oZWlnaHRcIlxuICAgICAgICAgICAgICBbYXR0ci5maWxsXT1cIlxuICAgICAgICAgICAgICAgIHJlY3QucGF0dGVybiA9PT0gJ2RvdHMnXG4gICAgICAgICAgICAgICAgICA/ICd1cmwoI2RvdHMtJyArIGkgKyAnLScgKyBqICsgJyknXG4gICAgICAgICAgICAgICAgICA6IGdldEJhckNvbG9yKHJlY3QsIGQuY29sb3JzLCBpLCBob3ZlcilcbiAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgW2F0dHIuc3Ryb2tlXT1cIlxuICAgICAgICAgICAgICAgIHNob3dCYXJCb3JkZXJzKHJlY3QsIGhvdmVyKSA/IHZhcldyYXAoJy0tYmxhY2stMTAwJykgOiB1bmRlZmluZWRcbiAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgW2F0dHIuc3Ryb2tlLXdpZHRoXT1cInNob3dCYXJCb3JkZXJzKHJlY3QsIGhvdmVyKSA/IDEgOiB1bmRlZmluZWRcIlxuICAgICAgICAgICAgPjwvcmVjdD5cbiAgICAgICAgICAgIDxyZWN0XG4gICAgICAgICAgICAgICpuZ0lmPVwic2hvd05vbkRpc3BsYXlSZWN0KHJlY3QsIGhvdmVyKVwiXG4gICAgICAgICAgICAgIFthdHRyLnhdPVwicmVjdC54XCJcbiAgICAgICAgICAgICAgW2F0dHIueV09XCJyZWN0LnlcIlxuICAgICAgICAgICAgICBbYXR0ci53aWR0aF09XCJyZWN0LndpZHRoXCJcbiAgICAgICAgICAgICAgW2F0dHIuaGVpZ2h0XT1cInJlY3QuaGVpZ2h0XCJcbiAgICAgICAgICAgICAgZmlsbD1cInRyYW5zcGFyZW50XCJcbiAgICAgICAgICAgICAgW2F0dHIuc3Ryb2tlXT1cInZhcldyYXAoJy0tYmxhY2stMTAwJylcIlxuICAgICAgICAgICAgICBbYXR0ci5zdHJva2Utd2lkdGhdPVwiMVwiXG4gICAgICAgICAgICA+PC9yZWN0PlxuICAgICAgICAgICAgPHJlY3RcbiAgICAgICAgICAgICAgKm5nSWY9XCJyZWN0LnBhdHRlcm4gPT09ICdzdHJpcGVkJ1wiXG4gICAgICAgICAgICAgIFthdHRyLnhdPVwicmVjdC54XCJcbiAgICAgICAgICAgICAgW2F0dHIueV09XCJyZWN0LnlcIlxuICAgICAgICAgICAgICBbYXR0ci53aWR0aF09XCJyZWN0LndpZHRoXCJcbiAgICAgICAgICAgICAgW2F0dHIuaGVpZ2h0XT1cInJlY3QuaGVpZ2h0XCJcbiAgICAgICAgICAgICAgZmlsbD1cInVybCgjc3RyaXBlcylcIlxuICAgICAgICAgICAgPjwvcmVjdD5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9nPlxuICAgICAgICA8ZyAqbmdGb3I9XCJsZXQgYmFyIG9mIGQuaG9yaXpvbnRhbEJhcnM7IGxldCBpID0gaW5kZXhcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpbmRCYXIgb2YgYmFyOyBsZXQgaiA9IGluZGV4XCI+XG4gICAgICAgICAgICA8ZGVmcyAqbmdJZj1cImluZEJhci5wYXR0ZXJuID09PSAnZG90cydcIj5cbiAgICAgICAgICAgICAgPHBhdHRlcm5cbiAgICAgICAgICAgICAgICBbYXR0ci5pZF09XCInZG90cy0nICsgaSArICctJyArIGpcIlxuICAgICAgICAgICAgICAgIHBhdHRlcm5Vbml0cz1cInVzZXJTcGFjZU9uVXNlXCJcbiAgICAgICAgICAgICAgICBbYXR0ci54XT1cImluZEJhci54XCJcbiAgICAgICAgICAgICAgICBbYXR0ci55XT1cImluZEJhci55XCJcbiAgICAgICAgICAgICAgICB3aWR0aD1cIjRcIlxuICAgICAgICAgICAgICAgIGhlaWdodD1cIjRcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGNpcmNsZVxuICAgICAgICAgICAgICAgICAgY3g9XCIyXCJcbiAgICAgICAgICAgICAgICAgIGN5PVwiMlwiXG4gICAgICAgICAgICAgICAgICByPVwiMS41XCJcbiAgICAgICAgICAgICAgICAgIFthdHRyLmZpbGxdPVwidmFyQ29sb3IoZC5jb2xvcnMsIGkpXCJcbiAgICAgICAgICAgICAgICA+PC9jaXJjbGU+XG4gICAgICAgICAgICAgIDwvcGF0dGVybj5cbiAgICAgICAgICAgIDwvZGVmcz5cbiAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgIFthdHRyLmRdPVwiaW5kQmFyLmhvcml6b250YWxCYXJcIlxuICAgICAgICAgICAgICBbYXR0ci5maWxsXT1cIlxuICAgICAgICAgICAgICAgIGluZEJhci5wYXR0ZXJuID09PSAnZG90cydcbiAgICAgICAgICAgICAgICAgID8gJ3VybCgjZG90cy0nICsgaSArICctJyArIGogKyAnKSdcbiAgICAgICAgICAgICAgICAgIDogdmFyQ29sb3IoZC5jb2xvcnMsIGkpXG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgIFthdHRyLnN0cm9rZV09XCJcbiAgICAgICAgICAgICAgICBpbmRCYXIucGF0dGVybiA9PT0gJ2RvdHMnID8gJ25vbmUnIDogdmFyQ29sb3IoZC5jb2xvcnMsIGkpXG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgIFthdHRyLnN0cm9rZS13aWR0aF09XCJpbmRCYXIucGF0dGVybiA9PT0gJ2RvdHMnID8gMCA6IDJcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICpuZ0lmPVwiaW5kQmFyLnBhdHRlcm4gPT09ICdzdHJpcGVkJ1wiXG4gICAgICAgICAgICAgIFthdHRyLmRdPVwiaW5kQmFyLmhvcml6b250YWxCYXJcIlxuICAgICAgICAgICAgICBbYXR0ci5zdHJva2VdPVwidmFyQ29sb3IoZC5jb2xvcnMsIGkpXCJcbiAgICAgICAgICAgICAgZmlsbD1cInVybCgjc3RyaXBlcylcIlxuICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIwXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZz5cbiAgICAgICAgPGcgKm5nRm9yPVwibGV0IGdyYWRpZW50IG9mIGQuZ3JhZGllbnRzOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgcmVjdCBvZiBncmFkaWVudDsgbGV0IGogPSBpbmRleFwiPlxuICAgICAgICAgICAgPGRlZnM+XG4gICAgICAgICAgICAgIDxsaW5lYXJHcmFkaWVudFxuICAgICAgICAgICAgICAgIFthdHRyLmlkXT1cIidncmFkLScgKyBpICsgJy0nICsgalwiXG4gICAgICAgICAgICAgICAgeDE9XCIwXCJcbiAgICAgICAgICAgICAgICB5MT1cIjBcIlxuICAgICAgICAgICAgICAgIHgyPVwiMFwiXG4gICAgICAgICAgICAgICAgeTI9XCIxXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxzdG9wIG9mZnNldD1cIjAlXCIgW2F0dHIuc3RvcC1jb2xvcl09XCJ2YXJDb2xvcihkLmNvbG9ycywgaSlcIiAvPlxuICAgICAgICAgICAgICAgIDxzdG9wIG9mZnNldD1cIjEwMCVcIiBzdG9wLWNvbG9yPVwid2hpdGVcIiAvPlxuICAgICAgICAgICAgICA8L2xpbmVhckdyYWRpZW50PlxuICAgICAgICAgICAgPC9kZWZzPlxuICAgICAgICAgICAgPHJlY3RcbiAgICAgICAgICAgICAgW2F0dHIueF09XCJyZWN0LnhcIlxuICAgICAgICAgICAgICBbYXR0ci55XT1cInJlY3QueVwiXG4gICAgICAgICAgICAgIFthdHRyLndpZHRoXT1cInJlY3Qud2lkdGhcIlxuICAgICAgICAgICAgICBbYXR0ci5oZWlnaHRdPVwicmVjdC5oZWlnaHRcIlxuICAgICAgICAgICAgICBbYXR0ci5maWxsXT1cIid1cmwoI2dyYWQtJyArIGkgKyAnLScgKyBqICsgJyknXCJcbiAgICAgICAgICAgICAgb3BhY2l0eT1cIjAuNFwiXG4gICAgICAgICAgICA+PC9yZWN0PlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2c+XG4gICAgICAgIDxnICpuZ0Zvcj1cImxldCBsaW5lIG9mIGQubGluZXM7IGxldCBpID0gaW5kZXhcIj5cbiAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgW2F0dHIuZF09XCJsaW5lLmxpbmVcIlxuICAgICAgICAgICAgW2F0dHIuc3Ryb2tlXT1cInZhckNvbG9yKGQuY29sb3JzLCBpKVwiXG4gICAgICAgICAgICBmaWxsPVwibm9uZVwiXG4gICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIyXCJcbiAgICAgICAgICAgIFthdHRyLnN0cm9rZS1saW5lY2FwXT1cIlxuICAgICAgICAgICAgICBsaW5lLnBhdHRlcm4gPT09ICdkb3RzJyA/ICdyb3VuZCcgOiB1bmRlZmluZWRcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgICBbYXR0ci5zdHJva2UtbGluZWpvaW5dPVwiXG4gICAgICAgICAgICAgIGxpbmUucGF0dGVybiA9PT0gJ2RvdHMnID8gJ3JvdW5kJyA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgXCJcbiAgICAgICAgICAgIFthdHRyLnN0cm9rZS1kYXNoYXJyYXldPVwiXG4gICAgICAgICAgICAgIGxpbmUucGF0dGVybiA9PT0gJ3N0cmlwZWQnXG4gICAgICAgICAgICAgICAgPyAnMTAgMTAnXG4gICAgICAgICAgICAgICAgOiBsaW5lLnBhdHRlcm4gPT09ICdkb3RzJ1xuICAgICAgICAgICAgICAgID8gJzAuMjUgNydcbiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgXCJcbiAgICAgICAgICA+PC9wYXRoPlxuICAgICAgICA8L2c+XG4gICAgICAgIDxnICpuZ0Zvcj1cImxldCBsaW5lU2luZ2xlUG9pbnRGYWxsYmFjayBvZiBkLmNpcmNsZXM7IGxldCBpID0gaW5kZXhcIj5cbiAgICAgICAgICA8Y2lyY2xlXG4gICAgICAgICAgICBjbGFzcz1cIm1hcmtlclwiXG4gICAgICAgICAgICBbYXR0ci5jeF09XCJsaW5lU2luZ2xlUG9pbnRGYWxsYmFjay5jeFwiXG4gICAgICAgICAgICBbYXR0ci5jeV09XCJsaW5lU2luZ2xlUG9pbnRGYWxsYmFjay5jeVwiXG4gICAgICAgICAgICByPVwiMy41XCJcbiAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjJcIlxuICAgICAgICAgICAgW2F0dHIuc3Ryb2tlXT1cInZhckNvbG9yKGQuY29sb3JzLCBpKVwiXG4gICAgICAgICAgPjwvY2lyY2xlPlxuICAgICAgICA8L2c+XG4gICAgICAgIDxnICpuZ0Zvcj1cImxldCBsaW5lIG9mIGQubGluZXM7IGxldCBpID0gaW5kZXhcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic3RhbmRhcmRIb3ZlckRhdGFHdWFyZChob3ZlcikgYXMgaG92ZXJEYXRhXCI+XG4gICAgICAgICAgICA8Y2lyY2xlXG4gICAgICAgICAgICAgIGNsYXNzPVwibWFya2VyXCJcbiAgICAgICAgICAgICAgKm5nSWY9XCJjb25maWcuZ3JvdXBlZFRvb2x0aXAgfHwgaSA9PT0gaG92ZXJEYXRhPy52aXNpYmxlWUluZGV4XCJcbiAgICAgICAgICAgICAgW2F0dHIuY3hdPVwiaG92ZXJEYXRhPy54XCJcbiAgICAgICAgICAgICAgW2F0dHIuY3ldPVwiaG92ZXJEYXRhPy55cz8uW2ldXCJcbiAgICAgICAgICAgICAgcj1cIjMuNVwiXG4gICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjJcIlxuICAgICAgICAgICAgICBbYXR0ci5zdHJva2VdPVwidmFyQ29sb3IoZC5jb2xvcnMsIGkpXCJcbiAgICAgICAgICAgID48L2NpcmNsZT5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9nPlxuICAgICAgICA8ZyAqbmdGb3I9XCJsZXQgYXJlYSBvZiBkLmFyZWFzOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICAgICAgPHBhdGggW2F0dHIuZF09XCJhcmVhLmFyZWFcIiBbYXR0ci5maWxsXT1cInZhckNvbG9yKGQuY29sb3JzLCBpKVwiPjwvcGF0aD5cbiAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgKm5nSWY9XCJhcmVhLnBhdHRlcm4gPT09ICdzdHJpcGVkJ1wiXG4gICAgICAgICAgICBbYXR0ci5kXT1cImFyZWEuYXJlYVwiXG4gICAgICAgICAgICBmaWxsPVwidXJsKCNzdHJpcGVzKVwiXG4gICAgICAgICAgPjwvcGF0aD5cbiAgICAgICAgPC9nPlxuICAgICAgICA8ZyAqbmdGb3I9XCJsZXQgYXJlYSBvZiBkLmFyZWFzOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInN0YW5kYXJkSG92ZXJEYXRhR3VhcmQoaG92ZXIpIGFzIGhvdmVyRGF0YVwiPlxuICAgICAgICAgICAgPGNpcmNsZVxuICAgICAgICAgICAgICBjbGFzcz1cIm1hcmtlclwiXG4gICAgICAgICAgICAgICpuZ0lmPVwiY29uZmlnLmdyb3VwZWRUb29sdGlwIHx8IGkgPT09IGhvdmVyRGF0YT8udmlzaWJsZVlJbmRleFwiXG4gICAgICAgICAgICAgIFthdHRyLmN4XT1cImhvdmVyRGF0YT8ueFwiXG4gICAgICAgICAgICAgIFthdHRyLmN5XT1cImhvdmVyRGF0YT8ueXM/LltpXVwiXG4gICAgICAgICAgICAgIHI9XCIzLjVcIlxuICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIyXCJcbiAgICAgICAgICAgICAgW2F0dHIuc3Ryb2tlXT1cInZhckNvbG9yKGQuY29sb3JzLCBpKVwiXG4gICAgICAgICAgICA+PC9jaXJjbGU+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZz5cbiAgICAgICAgPGcgKm5nRm9yPVwibGV0IHdMaW5lIG9mIGQud2F0ZXJmYWxsTGluZXNcIj5cbiAgICAgICAgICA8bGluZVxuICAgICAgICAgICAgY2xhc3M9XCJ3YXRlcmZhbGwtbGluZVwiXG4gICAgICAgICAgICBbYXR0ci54MV09XCJ3TGluZS54MVwiXG4gICAgICAgICAgICBbYXR0ci54Ml09XCJ3TGluZS54MlwiXG4gICAgICAgICAgICBbYXR0ci55MV09XCJ3TGluZS55MVwiXG4gICAgICAgICAgICBbYXR0ci55Ml09XCJ3TGluZS55MlwiXG4gICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIxXCJcbiAgICAgICAgICAgIHN0cm9rZS1kYXNoYXJyYXk9XCI2XCJcbiAgICAgICAgICAvPlxuICAgICAgICA8L2c+XG4gICAgICAgIDxwYXRoXG4gICAgICAgICAgKm5nRm9yPVwibGV0IHBhdGggb2YgZC5hcmNzOyBsZXQgaSA9IGluZGV4XCJcbiAgICAgICAgICBbYXR0ci5kXT1cInBhdGhcIlxuICAgICAgICAgIFthdHRyLmZpbGxdPVwidmFyQ29sb3IoZC5jb2xvcnMsIGkpXCJcbiAgICAgICAgPjwvcGF0aD5cbiAgICAgICAgPGcgKm5nRm9yPVwibGV0IGRhdGFMYWJlbCBvZiBkLmRhdGFMYWJlbHM7IGxldCBpID0gaW5kZXhcIj5cbiAgICAgICAgICA8dGV4dFxuICAgICAgICAgICAgKm5nSWY9XCJjb25maWcuc2hvd0RhdGFMYWJlbHMgJiYgZGF0YUxhYmVsLmxhYmVsXCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cImdldERhdGFMYWJlbENsYXNzKGRhdGFMYWJlbCwgY29uZmlnLCBob3ZlcilcIlxuICAgICAgICAgICAgW2F0dHIueV09XCJkYXRhTGFiZWwueVBvc1wiXG4gICAgICAgICAgICBbYXR0ci54XT1cImRhdGFMYWJlbC54UG9zXCJcbiAgICAgICAgICAgIFthdHRyLnRleHQtYW5jaG9yXT1cImRhdGFMYWJlbC5hbmNob3JcIlxuICAgICAgICAgICAgW2F0dHIuZm9udC13ZWlnaHRdPVwiXG4gICAgICAgICAgICAgIGRhdGFMYWJlbC5ib2xkXG4gICAgICAgICAgICAgICAgPyAndmFyKC0tZm9udC13ZWlnaHQtaGVhdnkpJ1xuICAgICAgICAgICAgICAgIDogJ3ZhcigtLWZvbnQtd2VpZ2h0LW5vcm1hbCknXG4gICAgICAgICAgICBcIlxuICAgICAgICAgICAgW2F0dHIub3BhY2l0eV09XCJnZXREYXRhTGFiZWxPcGFjaXR5KGRhdGFMYWJlbCwgY29uZmlnLCBob3ZlcilcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7IGRhdGFMYWJlbC5sYWJlbCB9fVxuICAgICAgICAgIDwvdGV4dD5cbiAgICAgICAgICA8bGluZVxuICAgICAgICAgICAgKm5nSWY9XCJkYXRhTGFiZWwubGluZSAmJiBjb25maWcuc2hvd0RhdGFMYWJlbHNcIlxuICAgICAgICAgICAgW2F0dHIueTFdPVwiZGF0YUxhYmVsLmxpbmUueTFcIlxuICAgICAgICAgICAgW2F0dHIueTJdPVwiZGF0YUxhYmVsLmxpbmUueTJcIlxuICAgICAgICAgICAgW2F0dHIueDFdPVwiZGF0YUxhYmVsLmxpbmUueDFcIlxuICAgICAgICAgICAgW2F0dHIueDJdPVwiZGF0YUxhYmVsLmxpbmUueDJcIlxuICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMlwiXG4gICAgICAgICAgICBbYXR0ci5zdHJva2VdPVwidmFyQ29sb3IoZC5jb2xvcnMsIGkpXCJcbiAgICAgICAgICA+PC9saW5lPlxuICAgICAgICA8L2c+XG4gICAgICAgIDxnICpuZ0Zvcj1cImxldCBjb25uZWN0aW9uIG9mIGQuZmxvd0Nvbm5lY3Rpb25zXCI+XG4gICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgIFthdHRyLmRdPVwiY29ubmVjdGlvbi5wYXRoXCJcbiAgICAgICAgICAgIFthdHRyLmZpbGxdPVwiZ2V0Q29ubmVjdGlvbkNvbG9yKClcIlxuICAgICAgICAgICAgW2F0dHIub3BhY2l0eV09XCJnZXRDb25uZWN0aW9uT3BhY2l0eShjb25uZWN0aW9uLCBob3ZlcilcIlxuICAgICAgICAgIC8+XG4gICAgICAgIDwvZz5cbiAgICAgIDwvc3ZnOnN2Zz5cbiAgICAgIDxkaXYgKm5nSWY9XCJjb25maWcudHlwZSA9PT0gJ2RvbnV0J1wiIGNsYXNzPVwiZG9udXQtZGlzcGxheVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZG9udXQtdmFsdWVcIiBbbmdDbGFzc109XCJjb25maWcuZG9udXREaXNwbGF5SW5mby5zaXplXCI+XG4gICAgICAgICAge3sgY29uZmlnLmRvbnV0RGlzcGxheUluZm8uZGlzcGxheVZhbHVlIH19XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZG9udXQtbGFiZWxcIj5cbiAgICAgICAgICB7eyBjb25maWcuZG9udXREaXNwbGF5SW5mby5kaXNwbGF5TGFiZWwgfX1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzdGFuZGFyZEhvdmVyRGF0YUd1YXJkKGhvdmVyKSBhcyBob3ZlckRhdGFcIj5cbiAgICAgICAgPHJpdi1jYWxsb3V0XG4gICAgICAgICAgKnJpdi1vdmVybGF5XG4gICAgICAgICAgW2FuY2hvcl09XCJcbiAgICAgICAgICAgIGhvdmVyRGF0YT8udG9vbHRpcD8uYW5jaG9yID8gaG92ZXJEYXRhLnRvb2x0aXAuYW5jaG9yIDogbnVsbFxuICAgICAgICAgIFwiXG4gICAgICAgICAgW2lzTW9kYWxdPVwiZmFsc2VcIlxuICAgICAgICAgIFtwcmVmZXJyZWRQb3NpdGlvbl09XCInY2VudGVyLXJpZ2h0J1wiXG4gICAgICAgICAgW3RoZW1lXT1cIidsaWdodCdcIlxuICAgICAgICA+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInRvb2x0aXBUZW1wbGF0ZTsgZWxzZSBkZWZhdWx0VG9vbHRpcFwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJ0b29sdGlwVGVtcGxhdGVcIlxuICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie1xuICAgICAgICAgICAgICAgIHhJbmRleDogaG92ZXJEYXRhPy54SW5kZXgsXG4gICAgICAgICAgICAgICAgeUluZGV4OiBob3ZlckRhdGE/LnlJbmRleCxcbiAgICAgICAgICAgICAgICBpc1N1cHBWYWx1ZTogaG92ZXJEYXRhPy5pc1N1cHBWYWx1ZSxcbiAgICAgICAgICAgICAgICBzdXBwWUluZGV4OiBob3ZlckRhdGE/LnN1cHBZSW5kZXhcbiAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0VG9vbHRpcD5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYWxsb3V0LWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImhvdmVyRGF0YT8udG9vbHRpcD8uZGF0ZVwiIGNsYXNzPVwiY2FsbG91dC1yb3dcIj5cbiAgICAgICAgICAgICAgICB7eyBob3ZlckRhdGE/LnRvb2x0aXA/LmRhdGUgfX1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBjbGFzcz1cImNhbGxvdXQtcm93XCJcbiAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgbWV0cmljIG9mIGhvdmVyRGF0YT8udG9vbHRpcD8ubWV0cmljc1wiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNlcmllcy1sYWJlbFwiPlxuICAgICAgICAgICAgICAgICAgPHJpdi1sZWdlbmQtaXRlbVxuICAgICAgICAgICAgICAgICAgICBbY29sb3JUb2tlbl09XCJtZXRyaWMuY29sb3JcIlxuICAgICAgICAgICAgICAgICAgICBbc3R5bGVdPVwibWV0cmljLnBhdHRlcm4gfHwgJ3NvbGlkJ1wiXG4gICAgICAgICAgICAgICAgICA+PC9yaXYtbGVnZW5kLWl0ZW0+XG4gICAgICAgICAgICAgICAgICA8c3Bhbj57eyBtZXRyaWMubGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuPnt7IG1ldHJpYy52YWx1ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L3Jpdi1jYWxsb3V0PlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZmxvd0hvdmVyRGF0YUd1YXJkKGhvdmVyKSBhcyBob3ZlckRhdGFcIj5cbiAgICAgICAgPHJpdi1jYWxsb3V0XG4gICAgICAgICAgKnJpdi1vdmVybGF5XG4gICAgICAgICAgW2FuY2hvcl09XCJcbiAgICAgICAgICAgIGhvdmVyRGF0YT8udG9vbHRpcD8uYW5jaG9yID8gaG92ZXJEYXRhLnRvb2x0aXAuYW5jaG9yIDogbnVsbFxuICAgICAgICAgIFwiXG4gICAgICAgICAgW2lzTW9kYWxdPVwiZmFsc2VcIlxuICAgICAgICAgIFtwcmVmZXJyZWRQb3NpdGlvbl09XCIndG9wLWNlbnRlcidcIlxuICAgICAgICAgIFt0aGVtZV09XCInbGlnaHQnXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYWxsb3V0LWNvbnRlbnRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYWxsb3V0LXJvd1wiPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaG92ZXJEYXRhPy5ob3ZlclRhcmdldCA9PT0gJ2Nvbm5lY3Rpb24nXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgZ2V0QnVja2V0Q29uZmlnSW5mbyhob3ZlckRhdGEsICdzdGFydElkJykgYXMgc3RhcnRDb25maWdcbiAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPHJpdi1pc3N1ZVxuICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwic3RhcnRDb25maWcudGl0bGVcIlxuICAgICAgICAgICAgICAgICAgICBbY29sb3JUb2tlbl09XCJzdGFydENvbmZpZy5jb2xvclwiXG4gICAgICAgICAgICAgICAgICA+PC9yaXYtaXNzdWU+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgLT5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAqbmdJZj1cImdldEJ1Y2tldENvbmZpZ0luZm8oaG92ZXJEYXRhLCAnZW5kSWQnKSBhcyBlbmRDb25maWdcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxyaXYtaXNzdWVcbiAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cImVuZENvbmZpZy50aXRsZVwiXG4gICAgICAgICAgICAgICAgICAgIFtjb2xvclRva2VuXT1cImVuZENvbmZpZy5jb2xvclwiXG4gICAgICAgICAgICAgICAgICA+PC9yaXYtaXNzdWU+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaG92ZXJEYXRhPy5ob3ZlclRhcmdldCAhPT0gJ2Nvbm5lY3Rpb24nXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCJnZXRCdWNrZXRDb25maWdJbmZvKGhvdmVyRGF0YSwgJ2JhcklkJykgYXMgYmFyQ29uZmlnXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8cml2LWlzc3VlXG4gICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJiYXJDb25maWcudGl0bGVcIlxuICAgICAgICAgICAgICAgICAgICBbY29sb3JUb2tlbl09XCJiYXJDb25maWcuY29sb3JcIlxuICAgICAgICAgICAgICAgICAgPjwvcml2LWlzc3VlPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAqbmdJZj1cImhvdmVyRGF0YT8udG9vbHRpcD8uc3VidGl0bGVcIlxuICAgICAgICAgICAgICBjbGFzcz1cImNhbGxvdXQtcm93IGZsb3ctc3VidGl0bGVcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7eyBob3ZlckRhdGE/LnRvb2x0aXA/LnN1YnRpdGxlIH19XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9yaXYtY2FsbG91dD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuICAgIDxsZWdlbmQgKm5nSWY9XCJkLmRhdGEudHlwZSAhPT0gJ2Zsb3cnXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZmlyc3RIaWRkZW5MZWdlbmRJdGVtSW5kZXgkIHwgYXN5bmM7IGxldCBmaVwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIGQuZGF0YS55czsgbGV0IGkgPSBpbmRleFwiPlxuICAgICAgICAgIDxyaXYtbGVnZW5kLWl0ZW1cbiAgICAgICAgICAgICpuZ0lmPVwiaSA8IGZpLmRhdGFJbmRleCAmJiBpdGVtLnNob3dMZWdlbmRJdGVtICE9PSBmYWxzZVwiXG4gICAgICAgICAgICBbbGFiZWxdPVwiaXRlbS5sYWJlbFwiXG4gICAgICAgICAgICBbc3R5bGVdPVwiaXRlbS5wYXR0ZXJuIHx8ICdzb2xpZCdcIlxuICAgICAgICAgICAgW3Zpc2liaWxpdHldPVwiaXRlbS5oaWRkZW4gPyAnaGlkZGVuJyA6ICd2aXNpYmxlJ1wiXG4gICAgICAgICAgICBbY2xpY2thYmxlXT1cImNvbmZpZy5hbGxvd0xlZ2VuZFRvZ2dsZVwiXG4gICAgICAgICAgICBbc2hvd0NoZWNrV2hlbkNsaWNrYWJsZV09XCJpdGVtLnBhdHRlcm4gIT09ICdkb3RzJ1wiXG4gICAgICAgICAgICBbY29sb3JUb2tlbl09XCJnZXRJdGVtQ29sb3IoaXRlbSwgaSlcIlxuICAgICAgICAgICAgKGl0ZW1DbGljayk9XCJ0b2dnbGVMZWdlbmQoaXRlbSwgaSlcIlxuICAgICAgICAgID48L3Jpdi1sZWdlbmQtaXRlbT5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiBkLmRhdGEuc3VwcGxlbWVudGFyeVlzOyBsZXQgaSA9IGluZGV4XCJcbiAgICAgICAgPlxuICAgICAgICAgIDxyaXYtbGVnZW5kLWl0ZW1cbiAgICAgICAgICAgICpuZ0lmPVwiaSA8IGZpLnN1cHBJbmRleCAmJiBpdGVtLnNob3dMZWdlbmRJdGVtICE9PSBmYWxzZVwiXG4gICAgICAgICAgICBbbGFiZWxdPVwiaXRlbS5sYWJlbFwiXG4gICAgICAgICAgICBbc3R5bGVdPVwiaXRlbS5wYXR0ZXJuIHx8ICdzb2xpZCdcIlxuICAgICAgICAgICAgW3Zpc2liaWxpdHldPVwiaXRlbS5oaWRkZW4gPyAnaGlkZGVuJyA6ICd2aXNpYmxlJ1wiXG4gICAgICAgICAgICBbY2xpY2thYmxlXT1cImNvbmZpZy5hbGxvd0xlZ2VuZFRvZ2dsZVwiXG4gICAgICAgICAgICBbc2hvd0NoZWNrV2hlbkNsaWNrYWJsZV09XCJpdGVtLnBhdHRlcm4gIT09ICdkb3RzJ1wiXG4gICAgICAgICAgICBbY29sb3JUb2tlbl09XCJnZXRJdGVtQ29sb3IoaXRlbSwgaSlcIlxuICAgICAgICAgICAgKGl0ZW1DbGljayk9XCJ0b2dnbGVMZWdlbmQoaXRlbSwgaSlcIlxuICAgICAgICAgID48L3Jpdi1sZWdlbmQtaXRlbT5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICAjbW9yZVRleHRDb250YWluZXJcbiAgICAgICAgICBjbGFzcz1cIm1vcmUtdGV4dC1jb250YWluZXJcIlxuICAgICAgICAgIChtb3VzZW92ZXIpPVwibW91c2VvdmVyTGVnZW5kKClcIlxuICAgICAgICAgIChtb3VzZWxlYXZlKT1cIm1vdXNlbGVhdmVMZWdlbmQoKVwiXG4gICAgICAgICAgKGNsaWNrKT1cIm1vcmVDbGljaygpXCJcbiAgICAgICAgICAqbmdJZj1cImZpLmhpZGRlbkNvdW50XCJcbiAgICAgICAgPlxuICAgICAgICAgIDxzcGFuIHJpdkxpbmsgY2xhc3M9XCJtb3JlLXRleHRcIj5cbiAgICAgICAgICAgICtcbiAgICAgICAgICAgIHt7IGZpLmhpZGRlbkNvdW50IH19IG1vcmVcbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2hvd01vcmVUb29sdGlwIHx8IGxvY2tTaG93TW9yZVRvb2x0aXBcIj5cbiAgICAgICAgICA8cml2LWNhbGxvdXRcbiAgICAgICAgICAgICpyaXYtb3ZlcmxheVxuICAgICAgICAgICAgW2FuY2hvcl09XCJtb3JlVGV4dENvbnRhaW5lcj8ubmF0aXZlRWxlbWVudFwiXG4gICAgICAgICAgICBbaXNNb2RhbF09XCJsb2NrU2hvd01vcmVUb29sdGlwXCJcbiAgICAgICAgICAgIChjbG9zZSk9XCJjbG9zZUhhbmRsZXIoKVwiXG4gICAgICAgICAgICBbcHJlZmVycmVkUG9zaXRpb25dPVwiJ2JvdHRvbS1yaWdodCdcIlxuICAgICAgICAgICAgW3RoZW1lXT1cIidsaWdodCdcIlxuICAgICAgICAgICAgW3Nob3dDYXJldF09XCJmYWxzZVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxlZ2VuZC10b29sdGlwXCI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZC5kYXRhLnlzOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICAgICAgICAgICAgPHJpdi1sZWdlbmQtaXRlbVxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCJpID49IGZpLmRhdGFJbmRleCAmJiBpdGVtLnNob3dMZWdlbmRJdGVtICE9PSBmYWxzZVwiXG4gICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiaXRlbS5sYWJlbFwiXG4gICAgICAgICAgICAgICAgICBbc3R5bGVdPVwiaXRlbS5wYXR0ZXJuIHx8ICdzb2xpZCdcIlxuICAgICAgICAgICAgICAgICAgW3Zpc2liaWxpdHldPVwiaXRlbS5oaWRkZW4gPyAnaGlkZGVuJyA6ICd2aXNpYmxlJ1wiXG4gICAgICAgICAgICAgICAgICBbY2xpY2thYmxlXT1cImNvbmZpZy5hbGxvd0xlZ2VuZFRvZ2dsZVwiXG4gICAgICAgICAgICAgICAgICBbc2hvd0NoZWNrV2hlbkNsaWNrYWJsZV09XCJpdGVtLnBhdHRlcm4gIT09ICdkb3RzJ1wiXG4gICAgICAgICAgICAgICAgICBbY29sb3JUb2tlbl09XCJnZXRJdGVtQ29sb3IoaXRlbSwgaSlcIlxuICAgICAgICAgICAgICAgICAgKGl0ZW1DbGljayk9XCJ0b2dnbGVMZWdlbmQoaXRlbSwgaSlcIlxuICAgICAgICAgICAgICAgID48L3Jpdi1sZWdlbmQtaXRlbT5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiBkLmRhdGEuc3VwcGxlbWVudGFyeVlzOyBsZXQgaSA9IGluZGV4XCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxyaXYtbGVnZW5kLWl0ZW1cbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwiaSA+PSBmaS5zdXBwSW5kZXggJiYgaXRlbS5zaG93TGVnZW5kSXRlbSAhPT0gZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIml0ZW0ubGFiZWxcIlxuICAgICAgICAgICAgICAgICAgW3N0eWxlXT1cIml0ZW0ucGF0dGVybiB8fCAnc29saWQnXCJcbiAgICAgICAgICAgICAgICAgIFt2aXNpYmlsaXR5XT1cIml0ZW0uaGlkZGVuID8gJ2hpZGRlbicgOiAndmlzaWJsZSdcIlxuICAgICAgICAgICAgICAgICAgW2NvbG9yVG9rZW5dPVwiZ2V0SXRlbUNvbG9yKGl0ZW0sIGkpXCJcbiAgICAgICAgICAgICAgICAgIFtjbGlja2FibGVdPVwiY29uZmlnLmFsbG93TGVnZW5kVG9nZ2xlXCJcbiAgICAgICAgICAgICAgICAgIFtzaG93Q2hlY2tXaGVuQ2xpY2thYmxlXT1cIml0ZW0ucGF0dGVybiAhPT0gJ2RvdHMnXCJcbiAgICAgICAgICAgICAgICAgIChpdGVtQ2xpY2spPVwidG9nZ2xlTGVnZW5kKGl0ZW0sIGkpXCJcbiAgICAgICAgICAgICAgICA+PC9yaXYtbGVnZW5kLWl0ZW0+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9yaXYtY2FsbG91dD5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2xlZ2VuZD5cbiAgPC9uZy1jb250YWluZXI+XG48L2Rpdj5cblxuPG5nLXRlbXBsYXRlICNub25EaXNwbGF5U3RhdGU+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJjaGVja0Zvck5vbkRpc3BsYXlTdGF0ZShkcmF3RGF0YSQgfCBhc3luYyk7IGxldCB0eXBlXCI+XG4gICAgPHJpdi16ZXJvLXN0YXRlXG4gICAgICAqbmdJZj1cInR5cGUgPT09ICd6ZXJvU3RhdGUnXCJcbiAgICAgIFttZXNzYWdlXT1cImNvbmZpZy56ZXJvU3RhdGVNZXNzYWdlXCJcbiAgICA+PC9yaXYtemVyby1zdGF0ZT5cbiAgICA8cml2LXplcm8tc3RhdGVcbiAgICAgICpuZ0lmPVwidHlwZSA9PT0gJ3NpemluZ0Vycm9yU3RhdGUnXCJcbiAgICAgIFttZXNzYWdlXT1cImNvbmZpZy5zaXppbmdFcnJvclN0YXRlTWVzc2FnZVwiXG4gICAgPjwvcml2LXplcm8tc3RhdGU+XG4gIDwvbmctY29udGFpbmVyPlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
|
|
606
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcml2L3NyYy9saWIvdmlzdWFsaXphdGlvbi9jaGFydC9jaGFydC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yaXYvc3JjL2xpYi92aXN1YWxpemF0aW9uL2NoYXJ0L2NoYXJ0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFFdkIsU0FBUyxFQUNULFlBQVksRUFFWixZQUFZLEVBQ1osS0FBSyxFQUNMLE1BQU0sRUFFTixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUNqQyxPQUFPLEVBQ0wsZUFBZSxFQUNmLGFBQWEsRUFDYixvQkFBb0IsRUFDcEIsR0FBRyxFQUNILElBQUksRUFDSixTQUFTLEVBQ1QsT0FBTyxHQUNSLE1BQU0sTUFBTSxDQUFDO0FBQ2QsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFNBQVMsQ0FBQzs7Ozs7Ozs7Ozs7QUFZaEMsTUFBTSxPQUFPLGNBQWM7SUFDekIsWUFBNkIsR0FBc0I7UUFBdEIsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFhMUMsdUJBQWtCLEdBQUcsR0FBRyxDQUFDO1FBQ3pCLHNCQUFpQixHQUFHLENBQUMsQ0FBQyxDQUFDLHdGQUF3RjtRQUV4SCxZQUFPLEdBQUcsSUFBSSxlQUFlLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFXdkQsV0FBTSxHQUFHLElBQUksZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBV2hDLG1LQUFtSztRQUNuSyxjQUFTLEdBQWtCLElBQUksQ0FBQztRQUNoQyxvQkFBZSxHQUFHLElBQUksZUFBZSxDQUFnQixJQUFJLENBQUMsQ0FBQztRQW1CM0QsYUFBUSxHQUFrQixJQUFJ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dUIsQ0FBQyxNQUFNO3dHQUt2QixTQUFTO3NCQUFoQyxTQUFTO3VCQUFDLFdBQVc7Z0JBQ1UsaUJBQWlCO3NCQUFoRCxTQUFTO3VCQUFDLG1CQUFtQjtnQkFHOUIsZUFBZTtzQkFEZCxZQUFZO3VCQUFDLFNBQVM7Z0JBYW5CLE1BQU07c0JBRFQsS0FBSztnQkFZRixLQUFLO3NCQURSLEtBQUs7Z0JBY0YsY0FBYztzQkFEakIsS0FBSztnQkFxQkYsYUFBYTtzQkFEaEIsS0FBSztnQkFvQkYsTUFBTTtzQkFEVCxLQUFLO2dCQW9CRixJQUFJO3NCQURQLEtBQUs7Z0JBd0hOLFlBQVk7c0JBRFgsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgVGVtcGxhdGVSZWYsXG4gIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBpc0VxdWFsIH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7XG4gIEJlaGF2aW9yU3ViamVjdCxcbiAgY29tYmluZUxhdGVzdCxcbiAgZGlzdGluY3RVbnRpbENoYW5nZWQsXG4gIG1hcCxcbiAgc2NhbixcbiAgc3RhcnRXaXRoLFxuICBTdWJqZWN0LFxufSBmcm9tICdyeGpzJztcbmltcG9ydCB7IENoYXJ0IH0gZnJvbSAnLi9jaGFydCc7XG5cbnR5cGUgRHJhd0RhdGEgPSB7XG4gIGRhdGE6IENoYXJ0LklucHV0RGF0YTtcbiAgdmlld0JveDogc3RyaW5nO1xufSAmIENoYXJ0LlJlbmRlcmVkQ2hhcnQ7XG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdyaXYtY2hhcnQnLFxuICB0ZW1wbGF0ZVVybDogJy4vY2hhcnQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9jaGFydC5jb21wb25lbnQuY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBDaGFydENvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZikge31cblxuICBAVmlld0NoaWxkKCdjb250YWluZXInKSBjb250YWluZXI/OiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCdtb3JlVGV4dENvbnRhaW5lcicpIG1vcmVUZXh0Q29udGFpbmVyPzogRWxlbWVudFJlZjtcblxuICBAQ29udGVudENoaWxkKCd0b29sdGlwJylcbiAgdG9vbHRpcFRlbXBsYXRlPzogVGVtcGxhdGVSZWY8e1xuICAgIHhJbmRleDogbnVtYmVyO1xuICAgIHlJbmRleDogbnVtYmVyO1xuICAgIGlzU3VwcFZhbHVlPzogYm9vbGVhbjtcbiAgICBzdXBwWUluZGV4PzogbnVtYmVyO1xuICB9PjtcblxuICByZWFkb25seSBERUZBVUxUX0hFSUdIVF9WQUwgPSAzMDA7XG4gIHJlYWRvbmx5IERFRkFVTFRfV0lEVEhfVkFMID0gMDsgLy9UaGVyZSdzIGFuIGF1dG9tYXRpYyByZXNpemVyIGluIHRoZSBodG1sIHRoYXQgaGFuZGxlcyBtYXRjaGluZyB3aWR0aCB0byBjb250YWluZXIgc2l6ZVxuXG4gIGhlaWdodCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KHRoaXMuREVGQVVMVF9IRUlHSFRfVkFMKTtcbiAgQElucHV0KClcbiAgc2V0IGhlaWdodCh3OiBudW1iZXIpIHtcbiAgICBpZiAodGhpcy5vdmVycmlkZUhlaWdodCA9PT0gbnVsbCkge1xuICAgICAgdGhpcy5oZWlnaHQkLm5leHQodyk7XG4gICAgfVxuICB9XG4gIGdldCBoZWlnaHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuaGVpZ2h0JC52YWx1ZTtcbiAgfVxuXG4gIHdpZHRoJCA9IG5ldyBCZWhhdmlvclN1YmplY3QoMCk7XG4gIEBJbnB1dCgpXG4gIHNldCB3aWR0aCh3OiBudW1iZXIpIHtcbiAgICBpZiAodGhpcy5vdmVycmlkZVdpZHRoID09PSBudWxsKSB7XG4gICAgICB0aGlzLndpZHRoJC5uZXh0KHcpO1xuICAgIH1cbiAgfVxuICBnZXQgd2lkdGgoKSB7XG4gICAgcmV0dXJuIHRoaXMud2lkdGgkLnZhbHVlO1xuICB9XG5cbiAgLy9UaGVzZSBvdmVycmlkZXMgaGFuZGxlIHNpdHVhdGlvbnMgd2hlcmUgdGhlIGNoYXJ0IG5lZWRzIHRvIGJlIHNldCB0byBhIHBhcnRpY3VsYXIgc2l6ZSB0aGF0IGRvZXNuJ3QgbWF0Y2ggd2hhdCBpdCB3b3VsZCBhdXRvbWF0aWNhbGx5IHNjYWxlIHRvIGJhc2VkIG9uIGNvbnRhaW5lclxuICBvbGRIZWlnaHQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICBvdmVycmlkZUhlaWdodCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlciB8IG51bGw+KG51bGwpO1xuICBASW5wdXQoKVxuICBzZXQgb3ZlcnJpZGVIZWlnaHQodzogbnVtYmVyIHwgbnVsbCkge1xuICAgIGlmICh3ICE9PSBudWxsKSB7XG4gICAgICB0aGlzLm9sZEhlaWdodCA9IHRoaXMuaGVpZ2h0O1xuICAgICAgdGhpcy5oZWlnaHQkLm5leHQodyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLm9sZEhlaWdodCkge1xuICAgICAgICB0aGlzLmhlaWdodCQubmV4dCh0aGlzLm9sZEhlaWdodCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmhlaWdodCQubmV4dCh0aGlzLkRFRkFVTFRfSEVJR0hUX1ZBTCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMub3ZlcnJpZGVIZWlnaHQkLm5leHQodyk7XG4gIH1cbiAgZ2V0IG92ZXJyaWRlSGVpZ2h0KCk6IG51bWJlciB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLm92ZXJyaWRlSGVpZ2h0JC52YWx1ZTtcbiAgfVxuXG4gIG9sZFdpZHRoOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgb3ZlcnJpZGVXaWR0aCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlciB8IG51bGw+KG51bGwpO1xuICBASW5wdXQoKVxuICBzZXQgb3ZlcnJpZGVXaWR0aCh3OiBudW1iZXIgfCBudWxsKSB7XG4gICAgaWYgKHcgIT09IG51bGwpIHtcbiAgICAgIHRoaXMub2xkV2lkdGggPSB0aGlzLndpZHRoO1xuICAgICAgdGhpcy53aWR0aCQubmV4dCh3KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMub2xkV2lkdGgpIHtcbiAgICAgICAgdGhpcy53aWR0aCQubmV4dCh0aGlzLm9sZFdpZHRoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMud2lkdGgkLm5leHQodGhpcy5ERUZBVUxUX1dJRFRIX1ZBTCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMub3ZlcnJpZGVXaWR0aCQubmV4dCh3KTtcbiAgfVxuICBnZXQgb3ZlcnJpZGVXaWR0aCgpOiBudW1iZXIgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5vdmVycmlkZVdpZHRoJC52YWx1ZTtcbiAgfVxuXG4gIGNvbmZpZyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PENoYXJ0LkNvbmZpZz4oQ2hhcnQuZGVmYXVsdENvbmZpZyk7XG4gIEBJbnB1dCgpXG4gIHNldCBjb25maWcoYzogQ2hhcnQuQ29uZmlnKSB7XG4gICAgdGhpcy5jb25maWckLm5leHQoYyk7XG4gIH1cbiAgZ2V0IGNvbmZpZygpIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWckLnZhbHVlO1xuICB9XG5cbiAgZGF0YSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PENoYXJ0LklucHV0RGF0YT4oe1xuICAgIHR5cGU6ICd0aW1lc2VyaWVzJyxcbiAgICB4OiBbXSxcbiAgICB5czogW10sXG4gIH0pO1xuXG4gIHByaXZhdGUgY29sb3JJbmRpY2VzID0gbmV3IE1hcDxcbiAgICBDaGFydC5EYXRhWSB8IENoYXJ0LlN1cHBsZW1lbnRhcnlEYXRhWSxcbiAgICBudW1iZXJcbiAgPigpO1xuXG4gIEBJbnB1dCgpXG4gIHNldCBkYXRhKGQ6IENoYXJ0LklucHV0RGF0YSkge1xuICAgIHRoaXMuZGF0YSQubmV4dChkKTtcbiAgICBpZiAoZC50eXBlICE9PSAnZmxvdycpIHtcbiAgICAgIHRoaXMuY29sb3JJbmRpY2VzID0gQ2hhcnQuY2FsY3VsYXRlQ29sb3JJbmRpY2VzKGQpO1xuICAgIH1cbiAgfVxuICBnZXQgZGF0YSgpIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhJC52YWx1ZTtcbiAgfVxuXG4gIGdldEl0ZW1LZXkoXG4gICAgaXRlbTogQ2hhcnQuRGF0YVkgfCBDaGFydC5TdXBwbGVtZW50YXJ5RGF0YVksXG4gICAgaW5kZXg6IG51bWJlcixcbiAgKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJ3N1cHBsZW1lbnRhbEluZGV4JyBpbiBpdGVtID8gYHN1cHAtJHtpbmRleH1gIDogYHktJHtpbmRleH1gO1xuICB9XG5cbiAgdG9nZ2xlTGVnZW5kKGl0ZW06IENoYXJ0LkRhdGFZIHwgQ2hhcnQuU3VwcGxlbWVudGFyeURhdGFZLCBpbmRleDogbnVtYmVyKSB7XG4gICAgdGhpcy50b2dnbGVMZWdlbmQkLm5leHQodGhpcy5nZXRJdGVtS2V5KGl0ZW0sIGluZGV4KSk7XG4gIH1cblxuICB0b2dnbGVMZWdlbmQkID0gbmV3IFN1YmplY3Q8c3RyaW5nPigpO1xuXG4gIC8vIHRvZ2dsZWRMZWdlbmQkIGlzIGp1c3QgYSBzZXQgb2YgYm9vbGVhblxuICAvLyB2YWx1ZXMgZm9yIHdoaWNoIGxlZ2VuZHMgaGF2ZSBiZWVuIHRvZ2dsZWQuXG4gIC8vIFdlIGRvbid0IGtub3cgaWYgdGhvc2UgbGVnZW5kcyB3aGVyZSBhbHJlYWR5XG4gIC8vIGhpZGRlbiBvciBub3QsIHdlIGp1c3Qga25vdyB3aGV0aGVyIHRoZXkgaGF2ZVxuICAvLyBiZWVuIHRvZ2dsZWQuXG4gIHRvZ2dsZWRMZWdlbmRzJCA9IHRoaXMudG9nZ2xlTGVnZW5kJC5waXBlKFxuICAgIHNjYW48c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPj4oXG4gICAgICAoYWNjLCB2YWx1ZSkgPT4gKHsgLi4uYWNjLCBbdmFsdWVdOiAhYWNjW3ZhbHVlXSB9KSxcbiAgICAgIHt9LFxuICAgICksXG4gICAgc3RhcnRXaXRoPFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+Pih7fSksXG4gICk7XG5cbiAgZHJhd0RhdGEkID0gY29tYmluZUxhdGVzdChbXG4gICAgdGhpcy53aWR0aCQsXG4gICAgdGhpcy5oZWlnaHQkLFxuICAgIHRoaXMuY29uZmlnJCxcbiAgICB0aGlzLmRhdGEkLFxuICAgIHRoaXMudG9nZ2xlZExlZ2VuZHMkLFxuICBdKS5waXBlKFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKChwcmV2LCBjdXJyZW50KSA9PiBpc0VxdWFsKHByZXYsIGN1cnJlbnQpKSxcbiAgICBtYXAoKFt3aWR0aCwgaGVpZ2h0LCBjb25maWcsIGRhdGEsIHRvZ2dsZWRMZWdlbmRzXSkgPT4ge1xuICAgICAgaWYgKHdpZHRoID09PSAwIHx8IGhlaWdodCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGhpZGRlbkRhdGEgPVxuICAgICAgICBkYXRhLnR5cGUgIT09ICdmbG93J1xuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAuLi5kYXRhLFxuICAgICAgICAgICAgICB5czogZGF0YS55cy5tYXAoKHksIGluZGV4KSA9PiAoe1xuICAgICAgICAgICAgICAgIC4uLnksXG4gICAgICAgICAgICAgICAgLy8gaWYgdG9nZ2xlZCwgZmxpcCB0aGUgaGlkZGVuIGJvb2xlYW5cbiAgICAgICAgICAgICAgICBoaWRkZW46IHRvZ2dsZWRMZWdlbmRzW2B5LSR7aW5kZXh9YF0gPyAheS5oaWRkZW4gOiB5LmhpZGRlbixcbiAgICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgICBzdXBwbGVtZW50YXJ5WXM6IGRhdGEuc3VwcGxlbWVudGFyeVlzPy5tYXAoKHksIGluZGV4KSA9PiAoe1xuICAgICAgICAgICAgICAgIC4uLnksXG4gICAgICAgICAgICAgICAgaGlkZGVuOiB0b2dnbGVkTGVnZW5kc1tgc3VwcC0ke2luZGV4fWBdID8gIXkuaGlkZGVuIDogeS5oaWRkZW4sXG4gICAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICA6IGRhdGE7XG5cbiAgICAgIGxldCBjaGFydERhdGEgPSBDaGFydC5jaGFydChjb25maWcsIGhpZGRlbkRhdGEsIHtcbiAgICAgICAgd2lkdGg6IHdpZHRoLFxuICAgICAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBob3Jpem9udGFsU2Nyb2xsRGV0ZWN0ZWQgPSBjaGFydERhdGEuY2hhcnRXaWR0aCA+IHdpZHRoO1xuICAgICAgY29uc3QgdmVydGljYWxTY3JvbGxEZXRlY3RlZCA9IGNoYXJ0RGF0YS5jaGFydEhlaWdodCA+IGhlaWdodDtcbiAgICAgIGlmIChob3Jpem9udGFsU2Nyb2xsRGV0ZWN0ZWQgfHwgdmVydGljYWxTY3JvbGxEZXRlY3RlZCkge1xuICAgICAgICBjb25zdCBzY3JvbGxiYXIgPSB0aGlzLm1lYXN1cmVTY3JvbGxiYXJUaGlja25lc3MoKTtcbiAgICAgICAgY2hhcnREYXRhID0gQ2hhcnQuY2hhcnQoY29uZmlnLCBoaWRkZW5EYXRhLCB7XG4gICAgICAgICAgd2lkdGg6IHdpZHRoIC0gKHZlcnRpY2FsU2Nyb2xsRGV0ZWN0ZWQgPyBzY3JvbGxiYXIudmVydGljYWwgOiAwKSxcbiAgICAgICAgICBoZWlnaHQ6XG4gICAgICAgICAgICBoZWlnaHQgLSAoaG9yaXpvbnRhbFNjcm9sbERldGVjdGVkID8gc2Nyb2xsYmFyLmhvcml6b250YWwgOiAwKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHZpZXdCb3ggPVxuICAgICAgICBjb25maWcudHlwZSA9PT0gJ2RvbnV0J1xuICAgICAgICAgID8gYCR7LWNoYXJ0RGF0YS5jaGFydFdpZHRoIC8gMn0gJHstY2hhcnREYXRhLmNoYXJ0SGVpZ2h0IC8gMn1cbiAgICAgICAgICAgICAgJHtjaGFydERhdGEuY2hhcnRXaWR0aH0gJHtjaGFydERhdGEuY2hhcnRIZWlnaHR9YFxuICAgICAgICAgIDogYDAgMCAke2NoYXJ0RGF0YS5jaGFydFdpZHRofSAke2NoYXJ0RGF0YS5jaGFydEhlaWdodH1gO1xuICAgICAgY29uc3QgcmV0dXJuT2JqOiBEcmF3RGF0YSA9IHtcbiAgICAgICAgdmlld0JveCxcbiAgICAgICAgZGF0YTogaGlkZGVuRGF0YSxcbiAgICAgICAgLi4uY2hhcnREYXRhLFxuICAgICAgfTtcbiAgICAgIHJldHVybiByZXR1cm5PYmo7XG4gICAgfSksXG4gICk7XG5cbiAgaG92ZXI6IFJldHVyblR5cGU8Q2hhcnQuSG92ZXI+ID0gbnVsbDtcblxuICBtb3VzZW1vdmUoJGV2ZW50OiBNb3VzZUV2ZW50LCBob3Zlcj86IENoYXJ0LkhvdmVyKSB7XG4gICAgaWYgKCFob3Zlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjb250YWluZXJFbCA9IHRoaXMuY29udGFpbmVyPy5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xuICAgIGlmIChjb250YWluZXJFbCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCByZWN0ID0gY29udGFpbmVyRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgdGhpcy5ob3ZlciA9IGhvdmVyKHtcbiAgICAgIHJlY3QsXG4gICAgICB4OiAkZXZlbnQuY2xpZW50WCAtIHJlY3QubGVmdCxcbiAgICAgIHk6ICRldmVudC5jbGllbnRZIC0gcmVjdC50b3AsXG4gICAgICBjb250YWluZXJTY3JvbGxYOiBjb250YWluZXJFbC5zY3JvbGxMZWZ0LFxuICAgICAgY29udGFpbmVyU2Nyb2xsWTogY29udGFpbmVyRWwuc2Nyb2xsVG9wLFxuICAgIH0pO1xuICB9XG5cbiAgbW91c2VsZWF2ZSgkZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICB0aGlzLmhvdmVyID0gbnVsbDtcbiAgfVxuXG4gIEBPdXRwdXQoKVxuICBjaGFydENsaWNrZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHtcbiAgICB4SW5kZXg6IG51bWJlcjtcbiAgICB5SW5kZXg6IG51bWJlcjtcbiAgICBzdXBwWUluZGV4PzogbnVtYmVyO1xuICB9PigpO1xuXG4gIGNsaWNrKCkge1xuICAgIGlmIChcbiAgICAgIHRoaXMuaG92ZXIgJiZcbiAgICAgIHRoaXMuaXNIb3ZlckNsaWNrYWJsZSAmJlxuICAgICAgdGhpcy5ob3Zlci5ob3ZlclR5cGUgPT09ICdzdGFuZGFyZCdcbiAgICApIHtcbiAgICAgIHRoaXMuY2hhcnRDbGlja2VkLmVtaXQoe1xuICAgICAgICB4SW5kZXg6IHRoaXMuaG92ZXIueEluZGV4LFxuICAgICAgICB5SW5kZXg6IHRoaXMuaG92ZXIueUluZGV4LFxuICAgICAgICAuLi4odGhpcy5ob3Zlci5pc1N1cHBWYWx1ZSAmJlxuICAgICAgICB0aGlzLmhvdmVyLnN1cHBZSW5kZXggIT0gdW5kZWZpbmVkICYmXG4gICAgICAgIHRoaXMuaG92ZXIuc3VwcFlJbmRleCA+PSAwXG4gICAgICAgICAgPyB7IHN1cHBZSW5kZXg6IHRoaXMuaG92ZXIuc3VwcFlJbmRleCB9XG4gICAgICAgICAgOiB7fSksXG4gICAgICB9KTtcbiAgICAgIHRoaXMuaG92ZXIgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGdldCBpc0hvdmVyQ2xpY2thYmxlKCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5ob3ZlciB8fCB0aGlzLmhvdmVyLmhvdmVyVHlwZSAhPT0gJ3N0YW5kYXJkJykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIElmIGhvdmVyaW5nIGEgc3VwcGxlbWVudGFyeSB2YWx1ZSBzcGVjaWZpY2FsbHksIGNoZWNrIGlmIGl0J3MgY2xpY2thYmxlXG4gICAgaWYgKFxuICAgICAgdGhpcy5ob3Zlci5pc1N1cHBWYWx1ZSAmJlxuICAgICAgdGhpcy5ob3Zlci5zdXBwWUluZGV4ICE9IG51bGwgJiZcbiAgICAgIHRoaXMuZGF0YS50eXBlICE9PSAnZmxvdydcbiAgICApIHtcbiAgICAgIGNvbnN0IHN1cHBZSW5kZXggPSB0aGlzLmhvdmVyLnN1cHBZSW5kZXg7XG4gICAgICBjb25zdCBzdXBwbGVtZW50YXJ5WXMgPSB0aGlzLmRhdGEuc3VwcGxlbWVudGFyeVlzO1xuICAgICAgaWYgKFxuICAgICAgICAhc3VwcGxlbWVudGFyeVlzIHx8XG4gICAgICAgIHN1cHBZSW5kZXggPCAwIHx8XG4gICAgICAgIHN1cHBZSW5kZXggPj0gc3VwcGxlbWVudGFyeVlzLmxlbmd0aFxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzdXBwbGVtZW50YXJ5WXNbc3VwcFlJbmRleF0/LmNsaWNrYWJsZSA9PT0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBGb3IgZ3JvdXBlZCB0b29sdGlwcywgY2hlY2sgaWYgYW55IHZpc2libGUgaXRlbSBpcyBjbGlja2FibGVcbiAgICBjb25zdCB5SW5kZXggPSB0aGlzLmhvdmVyLnlJbmRleDtcbiAgICBpZiAodGhpcy5jb25maWcuZ3JvdXBlZFRvb2x0aXApIHtcbiAgICAgIC8vIENoZWNrIGlmIHRoZSBtYWluIFkgdmFsdWUgaXMgY2xpY2thYmxlXG4gICAgICBpZiAodGhpcy5kYXRhLnlzW3lJbmRleF0/LmNsaWNrYWJsZSA9PT0gdHJ1ZSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTaW5nbGUgaXRlbSB0b29sdGlwOiBjaGVjayBpZiB0aGUgaG92ZXJlZCBZIHZhbHVlIGlzIGNsaWNrYWJsZVxuICAgIHJldHVybiB0aGlzLmRhdGEueXNbeUluZGV4XT8uY2xpY2thYmxlID09PSB0cnVlO1xuICB9XG5cbiAgdmFyV3JhcChpbnB1dDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGB2YXIoJHtpbnB1dH0pYDtcbiAgfVxuXG4gIHZhckNvbG9yKGNvbG9yczogc3RyaW5nW10sIGluZGV4OiBudW1iZXIpIHtcbiAgICByZXR1cm4gdGhpcy52YXJXcmFwKGNvbG9yc1tpbmRleCAlIGNvbG9ycy5sZW5ndGhdKTtcbiAgfVxuXG4gIGRhcmtlbkNvbG9yKGNvbG9yOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYGNvbG9yLW1peChpbiBva2xhYiwgJHtjb2xvcn0gODAlLCBibGFjaylgO1xuICB9XG5cbiAgZGVFbXBoYXNpemVDb2xvcihjb2xvcjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGBjb2xvci1taXgoaW4gc3JnYiwgdHJhbnNwYXJlbnQgODUlLCAke2NvbG9yfSlgO1xuICB9XG5cbiAgLy9IZWxwZXIgbWV0aG9kcyBmb3IgZmxvd3NcblxuICBjaGVja1RoYXRIb3ZlckRhdGFJc0Zsb3coXG4gICAgaG92ZXJEYXRhOiBDaGFydC5Ib3ZlclJldHVybixcbiAgKTogaG92ZXJEYXRhIGlzIENoYXJ0LkZsb3dIb3ZlclJldHVybiB7XG4gICAgaWYgKGhvdmVyRGF0YSAhPT0gbnVsbCAmJiBob3ZlckRhdGEuaG92ZXJUeXBlID09PSAnZmxvdycpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjaGVja0ZvckZsb3dNYXRjaChcbiAgICBob3ZlcjogQ2hhcnQuRmxvd0hvdmVyVGFyZ2V0LFxuICAgIGVsZW1lbnQ6IENoYXJ0LlJlY3QgfCBDaGFydC5EYXRhTGFiZWwgfCBDaGFydC5GbG93Q29ubmVjdGlvblJlbmRlcixcbiAgICBtYXRjaFRpdGxlVG9SZWN0OiBib29sZWFuID0gZmFsc2UsXG4gICk6IGJvb2xlYW4ge1xuICAgIGlmIChcbiAgICAgIGhvdmVyLmhvdmVyVGFyZ2V0ID09PSAnYmFyJyAmJlxuICAgICAgZWxlbWVudC5lbGVtZW50VHlwZSA9PT0gJ3JlY3QnICYmXG4gICAgICBlbGVtZW50LnJlY3RUeXBlID09PSAnZmxvdydcbiAgICApIHtcbiAgICAgIGlmIChcbiAgICAgICAgaG92ZXIuYmFySWQgPT09IGVsZW1lbnQuaWQgJiZcbiAgICAgICAgaG92ZXIuYnVja2V0SW5kZXggPT09IGVsZW1lbnQuYnVja2V0SW5kZXggJiZcbiAgICAgICAgaG92ZXIuZm9yRGFya2VuID09PSBlbGVtZW50LmRhcmtlblxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBob3Zlci5ob3ZlclRhcmdldCA9PT0gJ2JhclRpdGxlJyAmJlxuICAgICAgZWxlbWVudC5lbGVtZW50VHlwZSA9PT0gJ2RhdGFMYWJlbCcgJiZcbiAgICAgIGVsZW1lbnQuZGF0YUxhYmVsVHlwZSA9PT0gJ2Zsb3cnXG4gICAgKSB7XG4gICAgICBpZiAoXG4gICAgICAgIGhvdmVyLmJhcklkID09PSBlbGVtZW50LmJhcklkICYmXG4gICAgICAgIGhvdmVyLmJ1Y2tldEluZGV4ID09PSBlbGVtZW50LmJ1Y2tldEluZGV4XG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIGhvdmVyLmhvdmVyVGFyZ2V0ID09PSAnYmFyVGl0bGUnICYmXG4gICAgICBlbGVtZW50LmVsZW1lbnRUeXBlID09PSAncmVjdCcgJiZcbiAgICAgIGVsZW1lbnQucmVjdFR5cGUgPT09ICdmbG93JyAmJlxuICAgICAgbWF0Y2hUaXRsZVRvUmVjdFxuICAgICkge1xuICAgICAgaWYgKFxuICAgICAgICBob3Zlci5iYXJJZCA9PT0gZWxlbWVudC5pZCAmJlxuICAgICAgICBob3Zlci5idWNrZXRJbmRleCA9PT0gZWxlbWVudC5idWNrZXRJbmRleFxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoXG4gICAgICBob3Zlci5ob3ZlclRhcmdldCA9PT0gJ2Nvbm5lY3Rpb24nICYmXG4gICAgICBlbGVtZW50LmVsZW1lbnRUeXBlID09PSAnY29ubmVjdGlvbidcbiAgICApIHtcbiAgICAgIGlmIChcbiAgICAgICAgaG92ZXIuc3RhcnRCdWNrZXRJbmRleCA9PT0gZWxlbWVudC5zdGVwICYmXG4gICAgICAgIGhvdmVyLnN0YXJ0SWQgPT09IGVsZW1lbnQuc3RhcnQgJiZcbiAgICAgICAgaG92ZXIuZW5kSWQgPT09IGVsZW1lbnQuZW5kXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGdldEJhckNvbG9yKFxuICAgIHJlY3Q6IENoYXJ0LlJlY3QsXG4gICAgY29sb3JzOiBzdHJpbmdbXSxcbiAgICBpbmRleDogbnVtYmVyLFxuICAgIGhvdmVyRGF0YTogQ2hhcnQuSG92ZXJSZXR1cm4sXG4gICkge1xuICAgIGlmIChyZWN0LnJlY3RUeXBlID09PSAnZmxvdycgJiYgcmVjdC5jb2xvck92ZXJyaWRlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGJhc2VDb2xvciA9IHRoaXMudmFyV3JhcChyZWN0LmNvbG9yT3ZlcnJpZGUpO1xuICAgICAgY29uc3QgcG9zc2libHlEYXJrZW5lZENvbG9yID1cbiAgICAgICAgcmVjdC5kYXJrZW4gPT09IHRydWUgPyB0aGlzLmRhcmtlbkNvbG9yKGJhc2VDb2xvcikgOiBiYXNlQ29sb3I7XG4gICAgICBpZiAoXG4gICAgICAgIHJlY3QuZGVFbXBoYXNpemUgPT09IHRydWUgfHxcbiAgICAgICAgKHRoaXMuY2hlY2tUaGF0SG92ZXJEYXRhSXNGbG93KGhvdmVyRGF0YSkgJiZcbiAgICAgICAgICAhdGhpcy5jaGVja0ZvckZsb3dNYXRjaChob3ZlckRhdGEsIHJlY3QsIHRydWUpKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRlRW1waGFzaXplQ29sb3IocG9zc2libHlEYXJrZW5lZENvbG9yKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwb3NzaWJseURhcmtlbmVkQ29sb3I7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnZhckNvbG9yKGNvbG9ycywgaW5kZXgpO1xuICB9XG5cbiAgcmVhZG9ubHkgREVGQVVMVF9DT05ORUNUSU9OX0NPTE9SID0gJy0tcHVycC02MCc7XG5cbiAgZ2V0Q29ubmVjdGlvbkNvbG9yKCkge1xuICAgIGlmIChcbiAgICAgIHRoaXMuY29uZmlnLnR5cGUgPT09ICdmbG93JyAmJlxuICAgICAgdGhpcy5jb25maWcuZmxvd0NvbmZpZy5jb25uZWN0aW9uQ29sb3IgIT09IHVuZGVmaW5lZFxuICAgICkge1xuICAgICAgcmV0dXJuIHRoaXMudmFyV3JhcCh0aGlzLmNvbmZpZy5mbG93Q29uZmlnLmNvbm5lY3Rpb25Db2xvcik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnZhcldyYXAodGhpcy5ERUZBVUxUX0NPTk5FQ1RJT05fQ09MT1IpO1xuICB9XG5cbiAgcmVhZG9ubHkgU1RBTkRBUkRfQ09OTkVDVElPTl9PUEFDSVRZID0gMC4wNjI1O1xuICByZWFkb25seSBFTVBIQVNJWkVEX0NPTk5FQ1RJT05fT1BBQ0lUWSA9IDAuNTtcblxuICBnZXRDb25uZWN0aW9uT3BhY2l0eShcbiAgICBjb25uZWN0aW9uOiBDaGFydC5GbG93Q29ubmVjdGlvblJlbmRlcixcbiAgICBob3ZlckRhdGE6IENoYXJ0LkhvdmVyUmV0dXJuLFxuICApOiBudW1iZXIge1xuICAgIGlmIChcbiAgICAgICF0aGlzLmNoZWNrVGhhdEhvdmVyRGF0YUlzRmxvdyhob3ZlckRhdGEpIHx8XG4gICAgICBob3ZlckRhdGEuaG92ZXJUYXJnZXQgIT09ICdjb25uZWN0aW9uJ1xuICAgICkge1xuICAgICAgcmV0dXJuIHRoaXMuU1RBTkRBUkRfQ09OTkVDVElPTl9PUEFDSVRZO1xuICAgIH1cbiAgICBpZiAodGhpcy5jaGVja0ZvckZsb3dNYXRjaChob3ZlckRhdGEsIGNvbm5lY3Rpb24pKSB7XG4gICAgICByZXR1cm4gdGhpcy5FTVBIQVNJWkVEX0NPTk5FQ1RJT05fT1BBQ0lUWTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuU1RBTkRBUkRfQ09OTkVDVElPTl9PUEFDSVRZO1xuICB9XG5cbiAgZ2V0RGF0YUxhYmVsQ2xhc3MoXG4gICAgZGF0YUxhYmVsOiBDaGFydC5EYXRhTGFiZWwsXG4gICAgY29uZmlnOiBDaGFydC5Db25maWcsXG4gICAgaG92ZXJEYXRhOiBDaGFydC5Ib3ZlclJldHVybixcbiAgKTogJ2RhdGEtbGFiZWwnIHwgJ2Zsb3ctZGF0YS1sYWJlbCcge1xuICAgIGlmIChcbiAgICAgIGNvbmZpZy50eXBlID09PSAnZmxvdycgJiZcbiAgICAgIHRoaXMuY2hlY2tUaGF0SG92ZXJEYXRhSXNGbG93KGhvdmVyRGF0YSkgJiZcbiAgICAgIHRoaXMuY2hlY2tGb3JGbG93TWF0Y2goaG92ZXJEYXRhLCBkYXRhTGFiZWwpXG4gICAgKSB7XG4gICAgICByZXR1cm4gJ2Zsb3ctZGF0YS1sYWJlbCc7XG4gICAgfVxuICAgIHJldHVybiAnZGF0YS1sYWJlbCc7XG4gIH1cblxuICBnZXREYXRhTGFiZWxPcGFjaXR5KFxuICAgIGRhdGFMYWJlbDogQ2hhcnQuRGF0YUxhYmVsLFxuICAgIGNvbmZpZzogQ2hhcnQuQ29uZmlnLFxuICAgIGhvdmVyRGF0YTogQ2hhcnQuSG92ZXJSZXR1cm4sXG4gICk6IG51bWJlciB7XG4gICAgaWYgKFxuICAgICAgY29uZmlnLnR5cGUgPT09ICdmbG93JyAmJlxuICAgICAgdGhpcy5jaGVja1RoYXRIb3ZlckRhdGFJc0Zsb3coaG92ZXJEYXRhKSAmJlxuICAgICAgIXRoaXMuY2hlY2tGb3JGbG93TWF0Y2goaG92ZXJEYXRhLCBkYXRhTGFiZWwpXG4gICAgKSB7XG4gICAgICByZXR1cm4gMC4xNTtcbiAgICB9XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICBzaG93QmFyQm9yZGVycyhyZWN0OiBDaGFydC5SZWN0LCBob3ZlckRhdGE6IENoYXJ0LkhvdmVyUmV0dXJuKTogYm9vbGVhbiB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5jaGVja1RoYXRIb3ZlckRhdGFJc0Zsb3coaG92ZXJEYXRhKSAmJlxuICAgICAgdGhpcy5jaGVja0ZvckZsb3dNYXRjaChob3ZlckRhdGEsIHJlY3QpXG4gICAgKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgc2hvd05vbkRpc3BsYXlSZWN0KHJlY3Q6IENoYXJ0LlJlY3QsIGhvdmVyRGF0YTogQ2hhcnQuSG92ZXJSZXR1cm4pOiBib29sZWFuIHtcbiAgICBpZiAoXG4gICAgICByZWN0Lm5vbkRpc3BsYXkgJiZcbiAgICAgIHRoaXMuY2hlY2tUaGF0SG92ZXJEYXRhSXNGbG93KGhvdmVyRGF0YSkgJiZcbiAgICAgIHRoaXMuY2hlY2tGb3JGbG93TWF0Y2goaG92ZXJEYXRhLCByZWN0LCB0cnVlKVxuICAgICkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGdldEJ1Y2tldENvbmZpZ0luZm8oXG4gICAgaG92ZXJEYXRhOiBDaGFydC5GbG93SG92ZXJSZXR1cm4gfCBudWxsLFxuICAgIGlkZW50aWZpZXI6ICdzdGFydElkJyB8ICdlbmRJZCcgfCAnYmFySWQnLFxuICApOiB7XG4gICAgdGl0bGU6IHN0cmluZztcbiAgICBjb2xvcjogc3RyaW5nO1xuICB9IHtcbiAgICBpZiAoaG92ZXJEYXRhID09PSBudWxsIHx8IHRoaXMuY29uZmlnLnR5cGUgIT09ICdmbG93Jykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdGl0bGU6ICcnLFxuICAgICAgICBjb2xvcjogJycsXG4gICAgICB9O1xuICAgIH1cbiAgICAvL1RoZSBodG1sIGFscmVhZHkgZW5zdXJlcyB0aGUgaG92ZXJUYXJnZXQgYW5kIGlkZW50aWZpZXIgbWF0Y2gsIGJ1dCB0aGUgYnVpbGQgaXNuJ3QgcmVjb2duaXppbmcgdGhhdFxuICAgIGxldCBpZDogc3RyaW5nID0gJyc7XG4gICAgaWYgKGhvdmVyRGF0YS5ob3ZlclRhcmdldCA9PT0gJ2Nvbm5lY3Rpb24nKSB7XG4gICAgICBpZiAoaWRlbnRpZmllciA9PT0gJ2JhcklkJykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHRpdGxlOiAnJyxcbiAgICAgICAgICBjb2xvcjogJycsXG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZCA9IGhvdmVyRGF0YVtpZGVudGlmaWVyXTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGlkZW50aWZpZXIgIT09ICdiYXJJZCcpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0aXRsZTogJycsXG4gICAgICAgICAgY29sb3I6ICcnLFxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWQgPSBob3ZlckRhdGFbaWRlbnRpZmllcl07XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGZvdW5kSW5mbyA9IHRoaXMuY29uZmlnLmZsb3dDb25maWcuc3ViQnVja2V0c0NvbmZpZy5maW5kKFxuICAgICAgc2JjID0+IHNiYy5idWNrZXRJZCA9PT0gaWQsXG4gICAgKTtcbiAgICBpZiAoIWZvdW5kSW5mbykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdGl0bGU6ICcnLFxuICAgICAgICBjb2xvcjogJycsXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgdGl0bGU6IGZvdW5kSW5mby5idWNrZXROYW1lLFxuICAgICAgY29sb3I6IGZvdW5kSW5mby5jb2xvcixcbiAgICB9O1xuICB9XG5cbiAgZ2V0SXRlbUNvbG9yKFxuICAgIGl0ZW06IENoYXJ0LkRhdGFZIHwgQ2hhcnQuU3VwcGxlbWVudGFyeURhdGFZLFxuICAgIGl0ZW1JbmRleDogbnVtYmVyLFxuICApOiBzdHJpbmcge1xuICAgIC8vRmxvd3MgZ2V0IHRoZWlyIGNvbG9yIHZpYSBhIGRpZmZlcmVudCBtZXRob2RcbiAgICBpZiAodGhpcy5kYXRhLnR5cGUgPT09ICdmbG93Jykge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIC8vIFVzZSBpbmRleCB0byBnZXQgdGhlIG9yaWdpbmFsIGl0ZW0gKGRyYXdEYXRhJCBtYWludGFpbnMgc2FtZSBpbmRpY2VzIGFzIHRoaXMuZGF0YSlcbiAgICBjb25zdCBvcmlnaW5hbEl0ZW0gPVxuICAgICAgJ3N1cHBsZW1lbnRhbEluZGV4JyBpbiBpdGVtXG4gICAgICAgID8gdGhpcy5kYXRhLnN1cHBsZW1lbnRhcnlZcyFbaXRlbUluZGV4XVxuICAgICAgICA6IHRoaXMuZGF0YS55c1tpdGVtSW5kZXhdO1xuXG4gICAgcmV0dXJuIENoYXJ0LmdldENvbG9yKG9yaWdpbmFsSXRlbSwgdGhpcy5jb2xvckluZGljZXMsIHRoaXMuY29uZmlnLmNvbG9ycyk7XG4gIH1cblxuICBzaG93TW9yZVRvb2x0aXAgPSBmYWxzZTtcbiAgbG9ja1Nob3dNb3JlVG9vbHRpcCA9IGZhbHNlO1xuXG4gIG1vcmVUZXh0V2lkdGggPSA1MDtcbiAgYmFzZUxlZ2VuZEl0ZW1XaWR0aCA9IDQwO1xuXG4gIGZpcnN0SGlkZGVuTGVnZW5kSXRlbUluZGV4JCA9IGNvbWJpbmVMYXRlc3QoW1xuICAgIHRoaXMud2lkdGgkLFxuICAgIHRoaXMuY29uZmlnJCxcbiAgICB0aGlzLmRhdGEkLFxuICBdKS5waXBlKFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKChwcmV2LCBjdXJyZW50KSA9PiBpc0VxdWFsKHByZXYsIGN1cnJlbnQpKSxcbiAgICBtYXAoKFt3aWR0aCwgY29uZmlnLCBkYXRhXSkgPT4ge1xuICAgICAgaWYgKGRhdGEudHlwZSA9PT0gJ2Zsb3cnKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZGF0YUluZGV4OiAwLFxuICAgICAgICAgIHN1cHBJbmRleDogMCxcbiAgICAgICAgICBoaWRkZW5Db3VudDogdW5kZWZpbmVkLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKCFjb25maWcudHJ1bmNhdGVMZWdlbmQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBkYXRhSW5kZXg6IGRhdGEueXMubGVuZ3RoLFxuICAgICAgICAgIHN1cHBJbmRleDogZGF0YS5zdXBwbGVtZW50YXJ5WXM/Lmxlbmd0aCA/PyAwLFxuICAgICAgICAgIGhpZGRlbkNvdW50OiB1bmRlZmluZWQsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBsZXQgd2lkdGhSdW5uaW5nVG90YWwgPSAwO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLnlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChkYXRhLnlzW2ldLnNob3dMZWdlbmRJdGVtID09PSBmYWxzZSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGluZEl0ZW1XaWR0aCA9XG4gICAgICAgICAgdGhpcy5iYXNlTGVnZW5kSXRlbVdpZHRoICtcbiAgICAgICAgICBkYXRhLnlzW2ldLmxhYmVsLmxlbmd0aCAqIENoYXJ0LldJRFRIX1BFUl9MRVRURVI7XG4gICAgICAgIGlmICh3aWR0aFJ1bm5pbmdUb3RhbCArIGluZEl0ZW1XaWR0aCA+PSB3aWR0aCAtIHRoaXMubW9yZVRleHRXaWR0aCkge1xuICAgICAgICAgIGNvbnN0IHJlbWFpbmluZ1lzQ291bnQgPSBkYXRhLnlzXG4gICAgICAgICAgICAuc2xpY2UoaSlcbiAgICAgICAgICAgIC5maWx0ZXIoeSA9PiB5LnNob3dMZWdlbmRJdGVtICE9PSBmYWxzZSkubGVuZ3RoO1xuICAgICAgICAgIGNvbnN0IHN1cHBZc0NvdW50ID1cbiAgICAgICAgICAgIGRhdGEuc3VwcGxlbWVudGFyeVlzPy5maWx0ZXIoeSA9PiB5LnNob3dMZWdlbmRJdGVtICE9PSBmYWxzZSlcbiAgICAgICAgICAgICAgLmxlbmd0aCA/PyAwO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkYXRhSW5kZXg6IGksXG4gICAgICAgICAgICBzdXBwSW5kZXg6IDAsXG4gICAgICAgICAgICBoaWRkZW5Db3VudDogcmVtYWluaW5nWXNDb3VudCArIHN1cHBZc0NvdW50LFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgd2lkdGhSdW5uaW5nVG90YWwgKz0gaW5kSXRlbVdpZHRoO1xuICAgICAgfVxuICAgICAgaWYgKGRhdGEuc3VwcGxlbWVudGFyeVlzKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5zdXBwbGVtZW50YXJ5WXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAoZGF0YS5zdXBwbGVtZW50YXJ5WXNbaV0uc2hvd0xlZ2VuZEl0ZW0gPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgaW5kSXRlbVdpZHRoID1cbiAgICAgICAgICAgIHRoaXMuYmFzZUxlZ2VuZEl0ZW1XaWR0aCArXG4gICAgICAgICAgICBkYXRhLnN1cHBsZW1lbnRhcnlZc1tpXS5sYWJlbC5sZW5ndGggKiBDaGFydC5XSURUSF9QRVJfTEVUVEVSO1xuICAgICAgICAgIGlmICh3aWR0aFJ1bm5pbmdUb3RhbCArIGluZEl0ZW1XaWR0aCA+PSB3aWR0aCAtIHRoaXMubW9yZVRleHRXaWR0aCkge1xuICAgICAgICAgICAgY29uc3QgcmVtYWluaW5nU3VwcFlzQ291bnQgPSBkYXRhLnN1cHBsZW1lbnRhcnlZc1xuICAgICAgICAgICAgICAuc2xpY2UoaSlcbiAgICAgICAgICAgICAgLmZpbHRlcih5ID0+IHkuc2hvd0xlZ2VuZEl0ZW0gIT09IGZhbHNlKS5sZW5ndGg7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBkYXRhSW5kZXg6IGRhdGEueXMubGVuZ3RoLFxuICAgICAgICAgICAgICBzdXBwSW5kZXg6IGksXG4gICAgICAgICAgICAgIGhpZGRlbkNvdW50OiByZW1haW5pbmdTdXBwWXNDb3VudCxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIHdpZHRoUnVubmluZ1RvdGFsICs9IGluZEl0ZW1XaWR0aDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGF0YUluZGV4OiBkYXRhLnlzLmxlbmd0aCxcbiAgICAgICAgc3VwcEluZGV4OiBkYXRhLnN1cHBsZW1lbnRhcnlZcz8ubGVuZ3RoID8/IDAsXG4gICAgICAgIGhpZGRlbkNvdW50OiB1bmRlZmluZWQsXG4gICAgICB9O1xuICAgIH0pLFxuICApO1xuXG4gIG1vcmVDbGljaygpIHtcbiAgICB0aGlzLmxvY2tTaG93TW9yZVRvb2x0aXAgPSAhdGhpcy5sb2NrU2hvd01vcmVUb29sdGlwO1xuICB9XG5cbiAgY2xvc2VIYW5kbGVyKCkge1xuICAgIHRoaXMubG9ja1Nob3dNb3JlVG9vbHRpcCA9IGZhbHNlO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgbW91c2VvdmVyTGVnZW5kKCkge1xuICAgIHRoaXMuc2hvd01vcmVUb29sdGlwID0gdHJ1ZTtcbiAgfVxuXG4gIG1vdXNlbGVhdmVMZWdlbmQoKSB7XG4gICAgdGhpcy5zaG93TW9yZVRvb2x0aXAgPSBmYWxzZTtcbiAgfVxuXG4gIC8vU2luY2Ugc2Nyb2xsYmFyIHNpemUgZGVwZW5lZHMgb24gYnJvd3Nlciwgd2UgaGF2ZSB0byB1c2UgYSBtZXRob2QgbGlrZSB0aGlzIHRvIGZpZ3VyZSBvdXQgdGhlIGNvcnJlY3Qgc2Nyb2xsYmFyIHRoaWNrbmVzc1xuICBtZWFzdXJlU2Nyb2xsYmFyVGhpY2tuZXNzKCkge1xuICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG4gICAgZGl2LnN0eWxlLndpZHRoID0gJzEwMHB4JztcbiAgICBkaXYuc3R5bGUuaGVpZ2h0ID0gJzEwMHB4JztcbiAgICBkaXYuc3R5bGUub3ZlcmZsb3cgPSAnc2Nyb2xsJztcbiAgICBkaXYuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgIGRpdi5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG5cbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGRpdik7XG5cbiAgICBjb25zdCB0aGlja25lc3MgPSB7XG4gICAgICB2ZXJ0aWNhbDogZGl2Lm9mZnNldFdpZHRoIC0gZGl2LmNsaWVudFdpZHRoLFxuICAgICAgaG9yaXpvbnRhbDogZGl2Lm9mZnNldEhlaWdodCAtIGRpdi5jbGllbnRIZWlnaHQsXG4gICAgfTtcblxuICAgIGRpdi5yZW1vdmUoKTtcbiAgICByZXR1cm4gdGhpY2tuZXNzO1xuICB9XG5cbiAgZ2V0U3ViY29udGFpbmVySGVpZ2h0KGRhdGE6IERyYXdEYXRhIHwgbnVsbCk6IHN0cmluZyB7XG4gICAgaWYgKGRhdGEgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBgJHt0aGlzLmhlaWdodH1weGA7XG4gICAgfVxuICAgIGxldCBoZWlnaHQgPSB0aGlzLmhlaWdodDtcbiAgICBpZiAoXG4gICAgICBkYXRhLmNoYXJ0SGVpZ2h0IDwgdGhpcy5oZWlnaHQgJiZcbiAgICAgIGRhdGEudmVydGljYWxDb250YWluZXJTY2FsZSA9PT0gJ3NocmluaydcbiAgICApIHtcbiAgICAgIC8vU2hyaW5raW5nIHRvIGZpdCBjb250ZW50LCBidXQgYWNjb3VudGluZyBmb3IgcG90ZW50aWFsIHNjcm9sbGJhcnNcbiAgICAgIGNvbnN0IGhvcml6b250YWxTY3JvbGxEZXRlY3RlZCA9IGRhdGEuY2hhcnRXaWR0aCA+IHRoaXMud2lkdGg7XG4gICAgICBjb25zdCBzY3JvbGxiYXIgPSB0aGlzLm1lYXN1cmVTY3JvbGxiYXJUaGlja25lc3MoKTtcbiAgICAgIGhlaWdodCA9IE1hdGgubWluKFxuICAgICAgICBoZWlnaHQsXG4gICAgICAgIGRhdGEuY2hhcnRIZWlnaHQgK1xuICAgICAgICAgIChob3Jpem9udGFsU2Nyb2xsRGV0ZWN0ZWQgPyBzY3JvbGxiYXIuaG9yaXpvbnRhbCA6IDApLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGAke2hlaWdodH1weGA7XG4gIH1cblxuICBnZXRTdWJjb250YWluZXJXaWR0aChkYXRhOiBEcmF3RGF0YSB8IG51bGwpOiBzdHJpbmcge1xuICAgIGlmIChkYXRhID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gYCR7dGhpcy53aWR0aH1weGA7XG4gICAgfVxuICAgIGxldCB3aWR0aCA9IHRoaXMud2lkdGg7XG4gICAgaWYgKFxuICAgICAgZGF0YS5jaGFydFdpZHRoIDwgdGhpcy53aWR0aCAmJlxuICAgICAgZGF0YS5ob3Jpem9udGFsQ29udGFpbmVyU2NhbGUgPT09ICdzaHJpbmsnXG4gICAgKSB7XG4gICAgICAvL1Nocmlua2luZyB0byBmaXQgY29udGVudCwgYnV0IGFjY291bnRpbmcgZm9yIHBvdGVudGlhbCBzY3JvbGxiYXJzXG4gICAgICBjb25zdCB2ZXJ0aWNhbFNjcm9sbERldGVjdGVkID0gZGF0YS5jaGFydEhlaWdodCA+IHRoaXMuaGVpZ2h0O1xuICAgICAgY29uc3Qgc2Nyb2xsYmFyID0gdGhpcy5tZWFzdXJlU2Nyb2xsYmFyVGhpY2tuZXNzKCk7XG4gICAgICB3aWR0aCA9IE1hdGgubWluKFxuICAgICAgICB3aWR0aCxcbiAgICAgICAgZGF0YS5jaGFydFdpZHRoICsgKHZlcnRpY2FsU2Nyb2xsRGV0ZWN0ZWQgPyBzY3JvbGxiYXIudmVydGljYWwgOiAwKSxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBgJHt3aWR0aH1weGA7XG4gIH1cblxuICBnZXRCb3R0b21MYWJlbFkoZGF0YTogQ2hhcnQuUmVuZGVyZWRDaGFydCk6IG51bWJlciB7XG4gICAgcmV0dXJuIChcbiAgICAgIGRhdGEuY2hhcnRIZWlnaHQgLVxuICAgICAgKGRhdGEuY2hhcnRTaXppbmdWYWx1ZXMuYm90dG9tUGFkZGluZyAtIGRhdGEuY2hhcnRTaXppbmdWYWx1ZXMuZm9udFNpemUpIC9cbiAgICAgICAgMlxuICAgICk7XG4gIH1cblxuICBnZXRGb250U2l6ZShkYXRhOiBDaGFydC5SZW5kZXJlZENoYXJ0IHwgbnVsbCk6IHN0cmluZyB7XG4gICAgY29uc3QgY2hhcnRTaXppbmdGb250U2l6ZSA9IGRhdGE/LmNoYXJ0U2l6aW5nVmFsdWVzLmZvbnRTaXplO1xuICAgIGlmIChjaGFydFNpemluZ0ZvbnRTaXplICYmIGNoYXJ0U2l6aW5nRm9udFNpemUgPiAwKSB7XG4gICAgICByZXR1cm4gY2hhcnRTaXppbmdGb250U2l6ZS50b1N0cmluZygpLmNvbmNhdCgncHgnKTtcbiAgICB9XG4gICAgcmV0dXJuIENoYXJ0LkRFRkFVTFRfRk9OVF9TSVpFLnRvU3RyaW5nKCkuY29uY2F0KCdweCcpO1xuICB9XG5cbiAgY2hlY2tGb3JOb25EaXNwbGF5U3RhdGUoZGF0YTogRHJhd0RhdGEgfCBudWxsKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgbGV0IGVtcHR5ID0gZmFsc2U7XG4gICAgaWYgKGRhdGEgPT09IG51bGwpIHtcbiAgICAgIGVtcHR5ID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKGRhdGEuZGF0YS50eXBlID09PSAnZmxvdycpIHtcbiAgICAgIGVtcHR5ID0gZGF0YS5kYXRhLnlzLmxlbmd0aCA9PT0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgZW1wdHkgPVxuICAgICAgICAoZGF0YS5kYXRhLngubGVuZ3RoID09PSAwICYmIHRoaXMuY29uZmlnLnR5cGUgIT09ICdkb251dCcpIHx8XG4gICAgICAgIGRhdGEuZGF0YS55cy5sZW5ndGggPT09IDA7XG4gICAgfVxuICAgIGlmIChlbXB0eSkge1xuICAgICAgcmV0dXJuICd6ZXJvU3RhdGUnO1xuICAgIH1cbiAgICBpZiAoZGF0YSAmJiBkYXRhLmNoYXJ0RXJyb3IgPT09ICdzaXppbmcnKSB7XG4gICAgICByZXR1cm4gJ3NpemluZ0Vycm9yU3RhdGUnO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHN0YW5kYXJkSG92ZXJEYXRhR3VhcmQoXG4gICAgaG92ZXJEYXRhOiBDaGFydC5Ib3ZlclJldHVybixcbiAgKTogRXh0cmFjdDxDaGFydC5Ib3ZlclJldHVybiwgeyBob3ZlclR5cGU6ICdzdGFuZGFyZCcgfT4gfCBudWxsIHtcbiAgICBpZiAoaG92ZXJEYXRhID09PSBudWxsIHx8IGhvdmVyRGF0YS5ob3ZlclR5cGUgPT09ICdmbG93Jykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBob3ZlckRhdGE7XG4gIH1cblxuICBmbG93SG92ZXJEYXRhR3VhcmQoXG4gICAgaG92ZXJEYXRhOiBDaGFydC5Ib3ZlclJldHVybixcbiAgKTogQ2hhcnQuRmxvd0hvdmVyUmV0dXJuIHwgbnVsbCB7XG4gICAgaWYgKGhvdmVyRGF0YSA9PT0gbnVsbCB8fCBob3ZlckRhdGEuaG92ZXJUeXBlID09PSAnc3RhbmRhcmQnKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGhvdmVyRGF0YTtcbiAgfVxufVxuIiwiPGRpdlxuICBjbGFzcz1cImNvbnRhaW5lclwiXG4gIChyaXZDbGllbnRTaXplKT1cIndpZHRoID0gJGV2ZW50LndpZHRoXCJcbiAgKm5nSWY9XCJ7IGQ6IGRyYXdEYXRhJCB8IGFzeW5jIH0gYXMgdm1cIlxuICBbc3R5bGUuLS1vdmVycmlkZS1mb250LXNpemVdPVwiZ2V0Rm9udFNpemUodm0uZClcIlxuPlxuICA8bmctY29udGFpbmVyXG4gICAgKm5nSWY9XCJcbiAgICAgICFjaGVja0Zvck5vbkRpc3BsYXlTdGF0ZSh2bS5kKSAmJiAoZHJhd0RhdGEkIHwgYXN5bmMpO1xuICAgICAgbGV0IGQ7XG4gICAgICBlbHNlOiBub25EaXNwbGF5U3RhdGVcbiAgICBcIlxuICA+XG4gICAgPGRpdlxuICAgICAgKG1vdXNlbW92ZSk9XCJtb3VzZW1vdmUoJGV2ZW50LCBkLmhvdmVyKVwiXG4gICAgICAobW91c2VsZWF2ZSk9XCJtb3VzZWxlYXZlKCRldmVudClcIlxuICAgICAgKGNsaWNrKT1cImNsaWNrKClcIlxuICAgICAgI2NvbnRhaW5lclxuICAgICAgY2xhc3M9XCJzdWItY29udGFpbmVyXCJcbiAgICAgIFtjbGFzcy5jbGlja2FibGVdPVwiaXNIb3ZlckNsaWNrYWJsZVwiXG4gICAgICB0YWJJbmRleD1cIjBcIlxuICAgICAgW25nQ2xhc3NdPVwieyAnZG9udXQtY29udGFpbmVyJzogY29uZmlnLnR5cGUgPT09ICdkb251dCcgfVwiXG4gICAgICBbbmdTdHlsZV09XCJ7XG4gICAgICAgIGhlaWdodDogZ2V0U3ViY29udGFpbmVySGVpZ2h0KGQpLFxuICAgICAgICB3aWR0aDogZ2V0U3ViY29udGFpbmVyV2lkdGgoZClcbiAgICAgIH1cIlxuICAgID5cbiAgICAgIDxzdmc6c3ZnXG4gICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxuICAgICAgICBbYXR0ci52aWV3Qm94XT1cImQudmlld0JveFwiXG4gICAgICAgIFthdHRyLmhlaWdodF09XCJkLmNoYXJ0SGVpZ2h0XCJcbiAgICAgICAgW2F0dHIud2lkdGhdPVwiZC5jaGFydFdpZHRoXCJcbiAgICAgID5cbiAgICAgICAgPGRlZnM+XG4gICAgICAgICAgPCEtLSBTdHJpcGUgcGF0dGVybiAtLT5cbiAgICAgICAgICA8cGF0dGVyblxuICAgICAgICAgICAgaWQ9XCJzdHJpcGVzXCJcbiAgICAgICAgICAgIHg9XCIwXCJcbiAgICAgICAgICAgIHk9XCIwXCJcbiAgICAgICAgICAgIFthdHRyLndpZHRoXT1cIjEwXCJcbiAgICAgICAgICAgIFthdHRyLmhlaWdodF09XCIxMFwiXG4gICAgICAgICAgICBwYXR0ZXJuVW5pdHM9XCJ1c2VyU3BhY2VPblVzZVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGxpbmVcbiAgICAgICAgICAgICAgW2F0dHIueDFdPVwiMFwiXG4gICAgICAgICAgICAgIFthdHRyLnkxXT1cIjEwXCJcbiAgICAgICAgICAgICAgW2F0dHIueDJdPVwiMTBcIlxuICAgICAgICAgICAgICBbYXR0ci55Ml09XCIwXCJcbiAgICAgICAgICAgICAgc3Ryb2tlPVwidmFyKC0td2hpdGUtMTAwKVwiXG4gICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjFcIlxuICAgICAgICAgICAgPjwvbGluZT5cbiAgICAgICAgICA8L3BhdHRlcm4+XG4gICAgICAgIDwvZGVmcz5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiEoY29uZmlnLnR5cGUgPT09ICdob3Jpem9udGFsLWJhcicpXCI+XG4gICAgICAgICAgPGcgKm5nRm9yPVwibGV0IHRpY2sgb2YgZC54VGlja3NcIiB0ZXh0LWFuY2hvcj1cIm1pZGRsZVwiPlxuICAgICAgICAgICAgPHRleHRcbiAgICAgICAgICAgICAgY2xhc3M9XCJ0aWNrLWxhYmVsXCJcbiAgICAgICAgICAgICAgW2F0dHIueF09XCJ0aWNrLnhcIlxuICAgICAgICAgICAgICBbYXR0ci55XT1cImdldEJvdHRvbUxhYmVsWShkKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHt7IHRpY2subGFiZWwgfX1cbiAgICAgICAgICAgIDwvdGV4dD5cbiAgICAgICAgICA8L2c+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29uZmlnLnR5cGUgPT09ICdob3Jpem9udGFsLWJhcidcIj5cbiAgICAgICAgICA8ZyAqbmdGb3I9XCJsZXQgdGljayBvZiBkLnhUaWNrc1wiIHRleHQtYW5jaG9yPVwibGVmdFwiPlxuICAgICAgICAgICAgPHRleHRcbiAgICAgICAgICAgICAgY2xhc3M9XCJ0aWNrLWxhYmVsXCJcbiAgICAgICAgICAgICAgW2F0dHIueF09XCJ0aWNrLnhcIlxuICAgICAgICAgICAgICBbYXR0ci55XT1cImQuY2hhcnRTaXppbmdWYWx1ZXMuZm9udFNpemVcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7eyB0aWNrLmxhYmVsIH19XG4gICAgICAgICAgICA8L3RleHQ+XG4gICAgICAgICAgICA8bGluZVxuICAgICAgICAgICAgICBjbGFzcz1cInRpY2stbGluZVwiXG4gICAgICAgICAgICAgIFthdHRyLngxXT1cInRpY2sueFwiXG4gICAgICAgICAgICAgIFthdHRyLngyXT1cInRpY2sueFwiXG4gICAgICAgICAgICAgIHkxPVwiMFwiXG4gICAgICAgICAgICAgIFthdHRyLnkyXT1cImQuY2hhcnRIZWlnaHRcIlxuICAgICAgICAgICAgPjwvbGluZT5cbiAgICAgICAgICAgIDx0ZXh0XG4gICAgICAgICAgICAgICpuZ0lmPVwidGljay5zZWNvbmRhcnlMYWJlbFwiXG4gICAgICAgICAgICAgIGNsYXNzPVwidGljay1sYWJlbFwiXG4gICAgICAgICAgICAgIFthdHRyLnhdPVwidGljay54XCJcbiAgICAgICAgICAgICAgW2F0dHIueV09XCJnZXRCb3R0b21MYWJlbFkoZClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7eyB0aWNrLnNlY29uZGFyeUxhYmVsIH19XG4gICAgICAgICAgICA8L3RleHQ+XG4gICAgICAgICAgPC9nPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPGcgKm5nRm9yPVwibGV0IHRpY2sgb2YgZC55VGlja3NcIj5cbiAgICAgICAgICA8bGluZVxuICAgICAgICAgICAgKm5nSWY9XCIhKGNvbmZpZy50eXBlID09PSAnaG9yaXpvbnRhbC1iYXInKVwiXG4gICAgICAgICAgICBjbGFzcz1cInRpY2stbGluZVwiXG4gICAgICAgICAgICBbYXR0ci55MV09XCJ0aWNrLnlcIlxuICAgICAgICAgICAgW2F0dHIueTJdPVwidGljay55XCJcbiAgICAgICAgICAgIHgxPVwiMFwiXG4gICAgICAgICAgICBbYXR0ci54Ml09XCJkLmNoYXJ0V2lkdGhcIlxuICAgICAgICAgID48L2xpbmU+XG4gICAgICAgICAgPHRleHRcbiAgICAgICAgICAgIHJpdlNWR1RleHRUcnVuY2F0ZVxuICAgICAgICAgICAgW3RleHRdPVwidGljay5sYWJlbFwiXG4gICAgICAgICAgICBbd2lkdGhdPVwiXG4gICAgICAgICAgICAgIGNvbmZpZy50eXBlID09PSAnaG9yaXpvbnRhbC1iYXInXG4gICAgICAgICAgICAgICAgPyBkLmNoYXJ0U2l6aW5nVmFsdWVzLmxlZnRCdWNrZXRMYWJlbFxuICAgICAgICAgICAgICAgIDogZC5jaGFydFNpemluZ1ZhbHVlcy5sZWZ0UGFkZGluZ1xuICAgICAgICAgICAgXCJcbiAgICAgICAgICAgIGNsYXNzPVwidGljay1sYWJlbFwiXG4gICAgICAgICAgICBbYXR0ci55XT1cInRpY2sueVwiXG4gICAgICAgICAgICBbYXR0ci54XT1cIjBcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7IHRpY2subGFiZWwgfX1cbiAgICAgICAgICA8L3RleHQ+XG4gICAgICAgICAgPHRleHRcbiAgICAgICAgICAgICpuZ0lmPVwidGljay5zZWNvbmRhcnlMYWJlbFwiXG4gICAgICAgICAgICByaXZTVkdUZXh0VHJ1bmNhdGVcbiAgICAgICAgICAgIFt0ZXh0XT1cInRpY2suc2Vjb25kYXJ5TGFiZWxcIlxuICAgICAgICAgICAgW3dpZHRoXT1cImQuY2hhcnRTaXppbmdWYWx1ZXMucmlnaHRQYWRkaW5nXCJcbiAgICAgICAgICAgIGNsYXNzPVwidGljay1sYWJlbFwiXG4gICAgICAgICAgICBbYXR0ci55XT1cInRpY2sueVwiXG4gICAgICAgICAgICBbYXR0ci54XT1cImQuY2hhcnRXaWR0aFwiXG4gICAgICAgICAgICB0ZXh0LWFuY2hvcj1cImVuZFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAge3sgdGljay5zZWNvbmRhcnlMYWJlbCB9fVxuICAgICAgICAgIDwvdGV4dD5cbiAgICAgICAgPC9nPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic3RhbmRhcmRIb3ZlckRhdGFHdWFyZChob3ZlcikgYXMgaG92ZXJEYXRhXCI+XG4gICAgICAgICAgPGdcbiAgICAgICAgICAgICpuZ0lmPVwiY29uZmlnLnR5cGUgIT09ICdob3Jpem9udGFsLWJhcicgJiYgY29uZmlnLnR5cGUgIT09ICdkb251dCdcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxsaW5lXG4gICAgICAgICAgICAgIGNsYXNzPVwidGljay1saW5lXCJcbiAgICAgICAgICAgICAgW2F0dHIueDFdPVwiaG92ZXJEYXRhPy54XCJcbiAgICAgICAgICAgICAgW2F0dHIueDJdPVwiaG92ZXJEYXRhPy54XCJcbiAgICAgICAgICAgICAgeTE9XCIwXCJcbiAgICAgICAgICAgICAgW2F0dHIueTJdPVwiZC5jaGFydEhlaWdodFwiXG4gICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjJcIlxuICAgICAgICAgICAgICBzdHJva2UtZGFzaGFycmF5PVwiNFwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvZz5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxnICpuZ0Zvcj1cImxldCBiYXIgb2YgZC5iYXJzOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgcmVjdCBvZiBiYXI7IGxldCBqID0gaW5kZXhcIj5cbiAgICAgICAgICAgIDxkZWZzICpuZ0lmPVwicmVjdC5wYXR0ZXJuID09PSAnZG90cydcIj5cbiAgICAgICAgICAgICAgPHBhdHRlcm5cbiAgICAgICAgICAgICAgICBbYXR0ci5pZF09XCInZG90cy0nICsgaSArICctJyArIGpcIlxuICAgICAgICAgICAgICAgIHBhdHRlcm5Vbml0cz1cInVzZXJTcGFjZU9uVXNlXCJcbiAgICAgICAgICAgICAgICBbYXR0ci54XT1cInJlY3QueFwiXG4gICAgICAgICAgICAgICAgW2F0dHIueV09XCJyZWN0LnlcIlxuICAgICAgICAgICAgICAgIHdpZHRoPVwiNFwiXG4gICAgICAgICAgICAgICAgaGVpZ2h0PVwiNFwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8Y2lyY2xlXG4gICAgICAgICAgICAgICAgICBjeD1cIjJcIlxuICAgICAgICAgICAgICAgICAgY3k9XCIyXCJcbiAgICAgICAgICAgICAgICAgIHI9XCIxLjVcIlxuICAgICAgICAgICAgICAgICAgW2F0dHIuZmlsbF09XCJ2YXJDb2xvcihkLmNvbG9ycywgaSlcIlxuICAgICAgICAgICAgICAgID48L2NpcmNsZT5cbiAgICAgICAgICAgICAgPC9wYXR0ZXJuPlxuICAgICAgICAgICAgPC9kZWZzPlxuXG4gICAgICAgICAgICA8cmVjdFxuICAgICAgICAgICAgICAqbmdJZj1cInJlY3Qubm9uRGlzcGxheSAhPT0gdHJ1ZVwiXG4gICAgICAgICAgICAgIFthdHRyLnhdPVwicmVjdC54XCJcbiAgICAgICAgICAgICAgW2F0dHIueV09XCJyZWN0LnlcIlxuICAgICAgICAgICAgICBbYXR0ci53aWR0aF09XCJyZWN0LndpZHRoXCJcbiAgICAgICAgICAgICAgW2F0dHIuaGVpZ2h0XT1cInJlY3QuaGVpZ2h0XCJcbiAgICAgICAgICAgICAgW2F0dHIuZmlsbF09XCJcbiAgICAgICAgICAgICAgICByZWN0LnBhdHRlcm4gPT09ICdkb3RzJ1xuICAgICAgICAgICAgICAgICAgPyAndXJsKCNkb3RzLScgKyBpICsgJy0nICsgaiArICcpJ1xuICAgICAgICAgICAgICAgICAgOiBnZXRCYXJDb2xvcihyZWN0LCBkLmNvbG9ycywgaSwgaG92ZXIpXG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgIFthdHRyLnN0cm9rZV09XCJcbiAgICAgICAgICAgICAgICBzaG93QmFyQm9yZGVycyhyZWN0LCBob3ZlcikgPyB2YXJXcmFwKCctLWJsYWNrLTEwMCcpIDogdW5kZWZpbmVkXG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgIFthdHRyLnN0cm9rZS13aWR0aF09XCJzaG93QmFyQm9yZGVycyhyZWN0LCBob3ZlcikgPyAxIDogdW5kZWZpbmVkXCJcbiAgICAgICAgICAgID48L3JlY3Q+XG4gICAgICAgICAgICA8cmVjdFxuICAgICAgICAgICAgICAqbmdJZj1cInNob3dOb25EaXNwbGF5UmVjdChyZWN0LCBob3ZlcilcIlxuICAgICAgICAgICAgICBbYXR0ci54XT1cInJlY3QueFwiXG4gICAgICAgICAgICAgIFthdHRyLnldPVwicmVjdC55XCJcbiAgICAgICAgICAgICAgW2F0dHIud2lkdGhdPVwicmVjdC53aWR0aFwiXG4gICAgICAgICAgICAgIFthdHRyLmhlaWdodF09XCJyZWN0LmhlaWdodFwiXG4gICAgICAgICAgICAgIGZpbGw9XCJ0cmFuc3BhcmVudFwiXG4gICAgICAgICAgICAgIFthdHRyLnN0cm9rZV09XCJ2YXJXcmFwKCctLWJsYWNrLTEwMCcpXCJcbiAgICAgICAgICAgICAgW2F0dHIuc3Ryb2tlLXdpZHRoXT1cIjFcIlxuICAgICAgICAgICAgPjwvcmVjdD5cbiAgICAgICAgICAgIDxyZWN0XG4gICAgICAgICAgICAgICpuZ0lmPVwicmVjdC5wYXR0ZXJuID09PSAnc3RyaXBlZCdcIlxuICAgICAgICAgICAgICBbYXR0ci54XT1cInJlY3QueFwiXG4gICAgICAgICAgICAgIFthdHRyLnldPVwicmVjdC55XCJcbiAgICAgICAgICAgICAgW2F0dHIud2lkdGhdPVwicmVjdC53aWR0aFwiXG4gICAgICAgICAgICAgIFthdHRyLmhlaWdodF09XCJyZWN0LmhlaWdodFwiXG4gICAgICAgICAgICAgIGZpbGw9XCJ1cmwoI3N0cmlwZXMpXCJcbiAgICAgICAgICAgID48L3JlY3Q+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZz5cbiAgICAgICAgPGcgKm5nRm9yPVwibGV0IGJhciBvZiBkLmhvcml6b250YWxCYXJzOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaW5kQmFyIG9mIGJhcjsgbGV0IGogPSBpbmRleFwiPlxuICAgICAgICAgICAgPGRlZnMgKm5nSWY9XCJpbmRCYXIucGF0dGVybiA9PT0gJ2RvdHMnXCI+XG4gICAgICAgICAgICAgIDxwYXR0ZXJuXG4gICAgICAgICAgICAgICAgW2F0dHIuaWRdPVwiJ2RvdHMtJyArIGkgKyAnLScgKyBqXCJcbiAgICAgICAgICAgICAgICBwYXR0ZXJuVW5pdHM9XCJ1c2VyU3BhY2VPblVzZVwiXG4gICAgICAgICAgICAgICAgW2F0dHIueF09XCJpbmRCYXIueFwiXG4gICAgICAgICAgICAgICAgW2F0dHIueV09XCJpbmRCYXIueVwiXG4gICAgICAgICAgICAgICAgd2lkdGg9XCI0XCJcbiAgICAgICAgICAgICAgICBoZWlnaHQ9XCI0XCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxjaXJjbGVcbiAgICAgICAgICAgICAgICAgIGN4PVwiMlwiXG4gICAgICAgICAgICAgICAgICBjeT1cIjJcIlxuICAgICAgICAgICAgICAgICAgcj1cIjEuNVwiXG4gICAgICAgICAgICAgICAgICBbYXR0ci5maWxsXT1cInZhckNvbG9yKGQuY29sb3JzLCBpKVwiXG4gICAgICAgICAgICAgICAgPjwvY2lyY2xlPlxuICAgICAgICAgICAgICA8L3BhdHRlcm4+XG4gICAgICAgICAgICA8L2RlZnM+XG4gICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICBbYXR0ci5kXT1cImluZEJhci5ob3Jpem9udGFsQmFyXCJcbiAgICAgICAgICAgICAgW2F0dHIuZmlsbF09XCJcbiAgICAgICAgICAgICAgICBpbmRCYXIucGF0dGVybiA9PT0gJ2RvdHMnXG4gICAgICAgICAgICAgICAgICA/ICd1cmwoI2RvdHMtJyArIGkgKyAnLScgKyBqICsgJyknXG4gICAgICAgICAgICAgICAgICA6IHZhckNvbG9yKGQuY29sb3JzLCBpKVxuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICBbYXR0ci5zdHJva2VdPVwiXG4gICAgICAgICAgICAgICAgaW5kQmFyLnBhdHRlcm4gPT09ICdkb3RzJyA/ICdub25lJyA6IHZhckNvbG9yKGQuY29sb3JzLCBpKVxuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICBbYXR0ci5zdHJva2Utd2lkdGhdPVwiaW5kQmFyLnBhdHRlcm4gPT09ICdkb3RzJyA/IDAgOiAyXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAqbmdJZj1cImluZEJhci5wYXR0ZXJuID09PSAnc3RyaXBlZCdcIlxuICAgICAgICAgICAgICBbYXR0ci5kXT1cImluZEJhci5ob3Jpem9udGFsQmFyXCJcbiAgICAgICAgICAgICAgW2F0dHIuc3Ryb2tlXT1cInZhckNvbG9yKGQuY29sb3JzLCBpKVwiXG4gICAgICAgICAgICAgIGZpbGw9XCJ1cmwoI3N0cmlwZXMpXCJcbiAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMFwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2c+XG4gICAgICAgIDxnICpuZ0Zvcj1cImxldCBncmFkaWVudCBvZiBkLmdyYWRpZW50czsgbGV0IGkgPSBpbmRleFwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHJlY3Qgb2YgZ3JhZGllbnQ7IGxldCBqID0gaW5kZXhcIj5cbiAgICAgICAgICAgIDxkZWZzPlxuICAgICAgICAgICAgICA8bGluZWFyR3JhZGllbnRcbiAgICAgICAgICAgICAgICBbYXR0ci5pZF09XCInZ3JhZC0nICsgaSArICctJyArIGpcIlxuICAgICAgICAgICAgICAgIHgxPVwiMFwiXG4gICAgICAgICAgICAgICAgeTE9XCIwXCJcbiAgICAgICAgICAgICAgICB4Mj1cIjBcIlxuICAgICAgICAgICAgICAgIHkyPVwiMVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8c3RvcCBvZmZzZXQ9XCIwJVwiIFthdHRyLnN0b3AtY29sb3JdPVwidmFyQ29sb3IoZC5jb2xvcnMsIGkpXCIgLz5cbiAgICAgICAgICAgICAgICA8c3RvcCBvZmZzZXQ9XCIxMDAlXCIgc3RvcC1jb2xvcj1cIndoaXRlXCIgLz5cbiAgICAgICAgICAgICAgPC9saW5lYXJHcmFkaWVudD5cbiAgICAgICAgICAgIDwvZGVmcz5cbiAgICAgICAgICAgIDxyZWN0XG4gICAgICAgICAgICAgIFthdHRyLnhdPVwicmVjdC54XCJcbiAgICAgICAgICAgICAgW2F0dHIueV09XCJyZWN0LnlcIlxuICAgICAgICAgICAgICBbYXR0ci53aWR0aF09XCJyZWN0LndpZHRoXCJcbiAgICAgICAgICAgICAgW2F0dHIuaGVpZ2h0XT1cInJlY3QuaGVpZ2h0XCJcbiAgICAgICAgICAgICAgW2F0dHIuZmlsbF09XCIndXJsKCNncmFkLScgKyBpICsgJy0nICsgaiArICcpJ1wiXG4gICAgICAgICAgICAgIG9wYWNpdHk9XCIwLjRcIlxuICAgICAgICAgICAgPjwvcmVjdD5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9nPlxuICAgICAgICA8ZyAqbmdGb3I9XCJsZXQgbGluZSBvZiBkLmxpbmVzOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgIFthdHRyLmRdPVwibGluZS5saW5lXCJcbiAgICAgICAgICAgIFthdHRyLnN0cm9rZV09XCJ2YXJDb2xvcihkLmNvbG9ycywgaSlcIlxuICAgICAgICAgICAgZmlsbD1cIm5vbmVcIlxuICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMlwiXG4gICAgICAgICAgICBbYXR0ci5zdHJva2UtbGluZWNhcF09XCJcbiAgICAgICAgICAgICAgbGluZS5wYXR0ZXJuID09PSAnZG90cycgPyAncm91bmQnIDogdW5kZWZpbmVkXG4gICAgICAgICAgICBcIlxuICAgICAgICAgICAgW2F0dHIuc3Ryb2tlLWxpbmVqb2luXT1cIlxuICAgICAgICAgICAgICBsaW5lLnBhdHRlcm4gPT09ICdkb3RzJyA/ICdyb3VuZCcgOiB1bmRlZmluZWRcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgICBbYXR0ci5zdHJva2UtZGFzaGFycmF5XT1cIlxuICAgICAgICAgICAgICBsaW5lLnBhdHRlcm4gPT09ICdzdHJpcGVkJ1xuICAgICAgICAgICAgICAgID8gJzEwIDEwJ1xuICAgICAgICAgICAgICAgIDogbGluZS5wYXR0ZXJuID09PSAnZG90cydcbiAgICAgICAgICAgICAgICA/ICcwLjI1IDcnXG4gICAgICAgICAgICAgICAgOiB1bmRlZmluZWRcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgPjwvcGF0aD5cbiAgICAgICAgPC9nPlxuICAgICAgICA8ZyAqbmdGb3I9XCJsZXQgbGluZVNpbmdsZVBvaW50RmFsbGJhY2sgb2YgZC5jaXJjbGVzOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICAgICAgPGNpcmNsZVxuICAgICAgICAgICAgY2xhc3M9XCJtYXJrZXJcIlxuICAgICAgICAgICAgW2F0dHIuY3hdPVwibGluZVNpbmdsZVBvaW50RmFsbGJhY2suY3hcIlxuICAgICAgICAgICAgW2F0dHIuY3ldPVwibGluZVNpbmdsZVBvaW50RmFsbGJhY2suY3lcIlxuICAgICAgICAgICAgcj1cIjMuNVwiXG4gICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIyXCJcbiAgICAgICAgICAgIFthdHRyLnN0cm9rZV09XCJ2YXJDb2xvcihkLmNvbG9ycywgaSlcIlxuICAgICAgICAgID48L2NpcmNsZT5cbiAgICAgICAgPC9nPlxuICAgICAgICA8ZyAqbmdGb3I9XCJsZXQgbGluZSBvZiBkLmxpbmVzOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInN0YW5kYXJkSG92ZXJEYXRhR3VhcmQoaG92ZXIpIGFzIGhvdmVyRGF0YVwiPlxuICAgICAgICAgICAgPGNpcmNsZVxuICAgICAgICAgICAgICBjbGFzcz1cIm1hcmtlclwiXG4gICAgICAgICAgICAgICpuZ0lmPVwiY29uZmlnLmdyb3VwZWRUb29sdGlwIHx8IGkgPT09IGhvdmVyRGF0YT8udmlzaWJsZVlJbmRleFwiXG4gICAgICAgICAgICAgIFthdHRyLmN4XT1cImhvdmVyRGF0YT8ueFwiXG4gICAgICAgICAgICAgIFthdHRyLmN5XT1cImhvdmVyRGF0YT8ueXM/LltpXVwiXG4gICAgICAgICAgICAgIHI9XCIzLjVcIlxuICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIyXCJcbiAgICAgICAgICAgICAgW2F0dHIuc3Ryb2tlXT1cInZhckNvbG9yKGQuY29sb3JzLCBpKVwiXG4gICAgICAgICAgICA+PC9jaXJjbGU+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZz5cbiAgICAgICAgPGcgKm5nRm9yPVwibGV0IGFyZWEgb2YgZC5hcmVhczsgbGV0IGkgPSBpbmRleFwiPlxuICAgICAgICAgIDxwYXRoIFthdHRyLmRdPVwiYXJlYS5hcmVhXCIgW2F0dHIuZmlsbF09XCJ2YXJDb2xvcihkLmNvbG9ycywgaSlcIj48L3BhdGg+XG4gICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICpuZ0lmPVwiYXJlYS5wYXR0ZXJuID09PSAnc3RyaXBlZCdcIlxuICAgICAgICAgICAgW2F0dHIuZF09XCJhcmVhLmFyZWFcIlxuICAgICAgICAgICAgZmlsbD1cInVybCgjc3RyaXBlcylcIlxuICAgICAgICAgID48L3BhdGg+XG4gICAgICAgIDwvZz5cbiAgICAgICAgPGcgKm5nRm9yPVwibGV0IGFyZWEgb2YgZC5hcmVhczsgbGV0IGkgPSBpbmRleFwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzdGFuZGFyZEhvdmVyRGF0YUd1YXJkKGhvdmVyKSBhcyBob3ZlckRhdGFcIj5cbiAgICAgICAgICAgIDxjaXJjbGVcbiAgICAgICAgICAgICAgY2xhc3M9XCJtYXJrZXJcIlxuICAgICAgICAgICAgICAqbmdJZj1cImNvbmZpZy5ncm91cGVkVG9vbHRpcCB8fCBpID09PSBob3ZlckRhdGE/LnZpc2libGVZSW5kZXhcIlxuICAgICAgICAgICAgICBbYXR0ci5jeF09XCJob3ZlckRhdGE/LnhcIlxuICAgICAgICAgICAgICBbYXR0ci5jeV09XCJob3ZlckRhdGE/LnlzPy5baV1cIlxuICAgICAgICAgICAgICByPVwiMy41XCJcbiAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMlwiXG4gICAgICAgICAgICAgIFthdHRyLnN0cm9rZV09XCJ2YXJDb2xvcihkLmNvbG9ycywgaSlcIlxuICAgICAgICAgICAgPjwvY2lyY2xlPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2c+XG4gICAgICAgIDxnICpuZ0Zvcj1cImxldCB3TGluZSBvZiBkLndhdGVyZmFsbExpbmVzXCI+XG4gICAgICAgICAgPGxpbmVcbiAgICAgICAgICAgIGNsYXNzPVwid2F0ZXJmYWxsLWxpbmVcIlxuICAgICAgICAgICAgW2F0dHIueDFdPVwid0xpbmUueDFcIlxuICAgICAgICAgICAgW2F0dHIueDJdPVwid0xpbmUueDJcIlxuICAgICAgICAgICAgW2F0dHIueTFdPVwid0xpbmUueTFcIlxuICAgICAgICAgICAgW2F0dHIueTJdPVwid0xpbmUueTJcIlxuICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMVwiXG4gICAgICAgICAgICBzdHJva2UtZGFzaGFycmF5PVwiNlwiXG4gICAgICAgICAgLz5cbiAgICAgICAgPC9nPlxuICAgICAgICA8cGF0aFxuICAgICAgICAgICpuZ0Zvcj1cImxldCBwYXRoIG9mIGQuYXJjczsgbGV0IGkgPSBpbmRleFwiXG4gICAgICAgICAgW2F0dHIuZF09XCJwYXRoXCJcbiAgICAgICAgICBbYXR0ci5maWxsXT1cInZhckNvbG9yKGQuY29sb3JzLCBpKVwiXG4gICAgICAgID48L3BhdGg+XG4gICAgICAgIDxnICpuZ0Zvcj1cImxldCBkYXRhTGFiZWwgb2YgZC5kYXRhTGFiZWxzOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICAgICAgPHRleHRcbiAgICAgICAgICAgICpuZ0lmPVwiY29uZmlnLnNob3dEYXRhTGFiZWxzICYmIGRhdGFMYWJlbC5sYWJlbFwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJnZXREYXRhTGFiZWxDbGFzcyhkYXRhTGFiZWwsIGNvbmZpZywgaG92ZXIpXCJcbiAgICAgICAgICAgIFthdHRyLnldPVwiZGF0YUxhYmVsLnlQb3NcIlxuICAgICAgICAgICAgW2F0dHIueF09XCJkYXRhTGFiZWwueFBvc1wiXG4gICAgICAgICAgICBbYXR0ci50ZXh0LWFuY2hvcl09XCJkYXRhTGFiZWwuYW5jaG9yXCJcbiAgICAgICAgICAgIFthdHRyLmZvbnQtd2VpZ2h0XT1cIlxuICAgICAgICAgICAgICBkYXRhTGFiZWwuYm9sZFxuICAgICAgICAgICAgICAgID8gJ3ZhcigtLWZvbnQtd2VpZ2h0LWhlYXZ5KSdcbiAgICAgICAgICAgICAgICA6ICd2YXIoLS1mb250LXdlaWdodC1ub3JtYWwpJ1xuICAgICAgICAgICAgXCJcbiAgICAgICAgICAgIFthdHRyLm9wYWNpdHldPVwiZ2V0RGF0YUxhYmVsT3BhY2l0eShkYXRhTGFiZWwsIGNvbmZpZywgaG92ZXIpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICB7eyBkYXRhTGFiZWwubGFiZWwgfX1cbiAgICAgICAgICA8L3RleHQ+XG4gICAgICAgICAgPGxpbmVcbiAgICAgICAgICAgICpuZ0lmPVwiZGF0YUxhYmVsLmxpbmUgJiYgY29uZmlnLnNob3dEYXRhTGFiZWxzXCJcbiAgICAgICAgICAgIFthdHRyLnkxXT1cImRhdGFMYWJlbC5saW5lLnkxXCJcbiAgICAgICAgICAgIFthdHRyLnkyXT1cImRhdGFMYWJlbC5saW5lLnkyXCJcbiAgICAgICAgICAgIFthdHRyLngxXT1cImRhdGFMYWJlbC5saW5lLngxXCJcbiAgICAgICAgICAgIFthdHRyLngyXT1cImRhdGFMYWJlbC5saW5lLngyXCJcbiAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjJcIlxuICAgICAgICAgICAgW2F0dHIuc3Ryb2tlXT1cInZhckNvbG9yKGQuY29sb3JzLCBpKVwiXG4gICAgICAgICAgPjwvbGluZT5cbiAgICAgICAgPC9nPlxuICAgICAgICA8ZyAqbmdGb3I9XCJsZXQgY29ubmVjdGlvbiBvZiBkLmZsb3dDb25uZWN0aW9uc1wiPlxuICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICBbYXR0ci5kXT1cImNvbm5lY3Rpb24ucGF0aFwiXG4gICAgICAgICAgICBbYXR0ci5maWxsXT1cImdldENvbm5lY3Rpb25Db2xvcigpXCJcbiAgICAgICAgICAgIFthdHRyLm9wYWNpdHldPVwiZ2V0Q29ubmVjdGlvbk9wYWNpdHkoY29ubmVjdGlvbiwgaG92ZXIpXCJcbiAgICAgICAgICAvPlxuICAgICAgICA8L2c+XG4gICAgICA8L3N2Zzpzdmc+XG4gICAgICA8ZGl2ICpuZ0lmPVwiY29uZmlnLnR5cGUgPT09ICdkb251dCdcIiBjbGFzcz1cImRvbnV0LWRpc3BsYXlcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImRvbnV0LXZhbHVlXCIgW25nQ2xhc3NdPVwiY29uZmlnLmRvbnV0RGlzcGxheUluZm8uc2l6ZVwiPlxuICAgICAgICAgIHt7IGNvbmZpZy5kb251dERpc3BsYXlJbmZvLmRpc3BsYXlWYWx1ZSB9fVxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImRvbnV0LWxhYmVsXCI+XG4gICAgICAgICAge3sgY29uZmlnLmRvbnV0RGlzcGxheUluZm8uZGlzcGxheUxhYmVsIH19XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic3RhbmRhcmRIb3ZlckRhdGFHdWFyZChob3ZlcikgYXMgaG92ZXJEYXRhXCI+XG4gICAgICAgIDxyaXYtY2FsbG91dFxuICAgICAgICAgICpyaXYtb3ZlcmxheVxuICAgICAgICAgIFthbmNob3JdPVwiXG4gICAgICAgICAgICBob3ZlckRhdGE/LnRvb2x0aXA/LmFuY2hvciA/IGhvdmVyRGF0YS50b29sdGlwLmFuY2hvciA6IG51bGxcbiAgICAgICAgICBcIlxuICAgICAgICAgIFtpc01vZGFsXT1cImZhbHNlXCJcbiAgICAgICAgICBbcHJlZmVycmVkUG9zaXRpb25dPVwiXG4gICAgICAgICAgICBob3ZlckRhdGE/LnRvb2x0aXA/LnByZWZlcnJlZFBvc2l0aW9uID8/ICdjZW50ZXItcmlnaHQnXG4gICAgICAgICAgXCJcbiAgICAgICAgICBbdGhlbWVdPVwiJ2xpZ2h0J1wiXG4gICAgICAgID5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidG9vbHRpcFRlbXBsYXRlOyBlbHNlIGRlZmF1bHRUb29sdGlwXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInRvb2x0aXBUZW1wbGF0ZVwiXG4gICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7XG4gICAgICAgICAgICAgICAgeEluZGV4OiBob3ZlckRhdGE/LnhJbmRleCxcbiAgICAgICAgICAgICAgICB5SW5kZXg6IGhvdmVyRGF0YT8ueUluZGV4LFxuICAgICAgICAgICAgICAgIGlzU3VwcFZhbHVlOiBob3ZlckRhdGE/LmlzU3VwcFZhbHVlLFxuICAgICAgICAgICAgICAgIHN1cHBZSW5kZXg6IGhvdmVyRGF0YT8uc3VwcFlJbmRleFxuICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRUb29sdGlwPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhbGxvdXQtY29udGVudFwiPlxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaG92ZXJEYXRhPy50b29sdGlwPy5kYXRlXCIgY2xhc3M9XCJjYWxsb3V0LXJvd1wiPlxuICAgICAgICAgICAgICAgIHt7IGhvdmVyRGF0YT8udG9vbHRpcD8uZGF0ZSB9fVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiY2FsbG91dC1yb3dcIlxuICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBtZXRyaWMgb2YgaG92ZXJEYXRhPy50b29sdGlwPy5tZXRyaWNzXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2VyaWVzLWxhYmVsXCI+XG4gICAgICAgICAgICAgICAgICA8cml2LWxlZ2VuZC1pdGVtXG4gICAgICAgICAgICAgICAgICAgIFtjb2xvclRva2VuXT1cIm1ldHJpYy5jb2xvclwiXG4gICAgICAgICAgICAgICAgICAgIFtzdHlsZV09XCJtZXRyaWMucGF0dGVybiB8fCAnc29saWQnXCJcbiAgICAgICAgICAgICAgICAgID48L3Jpdi1sZWdlbmQtaXRlbT5cbiAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IG1ldHJpYy5sYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4+e3sgbWV0cmljLnZhbHVlIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvcml2LWNhbGxvdXQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJmbG93SG92ZXJEYXRhR3VhcmQoaG92ZXIpIGFzIGhvdmVyRGF0YVwiPlxuICAgICAgICA8cml2LWNhbGxvdXRcbiAgICAgICAgICAqcml2LW92ZXJsYXlcbiAgICAgICAgICBbYW5jaG9yXT1cIlxuICAgICAgICAgICAgaG92ZXJEYXRhPy50b29sdGlwPy5hbmNob3IgPyBob3ZlckRhdGEudG9vbHRpcC5hbmNob3IgOiBudWxsXG4gICAgICAgICAgXCJcbiAgICAgICAgICBbaXNNb2RhbF09XCJmYWxzZVwiXG4gICAgICAgICAgW3ByZWZlcnJlZFBvc2l0aW9uXT1cIid0b3AtY2VudGVyJ1wiXG4gICAgICAgICAgW3RoZW1lXT1cIidsaWdodCdcIlxuICAgICAgICA+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNhbGxvdXQtY29udGVudFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhbGxvdXQtcm93XCI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJob3ZlckRhdGE/LmhvdmVyVGFyZ2V0ID09PSAnY29ubmVjdGlvbidcIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICBnZXRCdWNrZXRDb25maWdJbmZvKGhvdmVyRGF0YSwgJ3N0YXJ0SWQnKSBhcyBzdGFydENvbmZpZ1xuICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8cml2LWlzc3VlXG4gICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJzdGFydENvbmZpZy50aXRsZVwiXG4gICAgICAgICAgICAgICAgICAgIFtjb2xvclRva2VuXT1cInN0YXJ0Q29uZmlnLmNvbG9yXCJcbiAgICAgICAgICAgICAgICAgID48L3Jpdi1pc3N1ZT5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAtPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZ2V0QnVja2V0Q29uZmlnSW5mbyhob3ZlckRhdGEsICdlbmRJZCcpIGFzIGVuZENvbmZpZ1wiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPHJpdi1pc3N1ZVxuICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiZW5kQ29uZmlnLnRpdGxlXCJcbiAgICAgICAgICAgICAgICAgICAgW2NvbG9yVG9rZW5dPVwiZW5kQ29uZmlnLmNvbG9yXCJcbiAgICAgICAgICAgICAgICAgID48L3Jpdi1pc3N1ZT5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJob3ZlckRhdGE/LmhvdmVyVGFyZ2V0ICE9PSAnY29ubmVjdGlvbidcIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAqbmdJZj1cImdldEJ1Y2tldENvbmZpZ0luZm8oaG92ZXJEYXRhLCAnYmFySWQnKSBhcyBiYXJDb25maWdcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxyaXYtaXNzdWVcbiAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cImJhckNvbmZpZy50aXRsZVwiXG4gICAgICAgICAgICAgICAgICAgIFtjb2xvclRva2VuXT1cImJhckNvbmZpZy5jb2xvclwiXG4gICAgICAgICAgICAgICAgICA+PC9yaXYtaXNzdWU+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICpuZ0lmPVwiaG92ZXJEYXRhPy50b29sdGlwPy5zdWJ0aXRsZVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiY2FsbG91dC1yb3cgZmxvdy1zdWJ0aXRsZVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHt7IGhvdmVyRGF0YT8udG9vbHRpcD8uc3VidGl0bGUgfX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L3Jpdi1jYWxsb3V0PlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG4gICAgPGxlZ2VuZCAqbmdJZj1cImQuZGF0YS50eXBlICE9PSAnZmxvdydcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJmaXJzdEhpZGRlbkxlZ2VuZEl0ZW1JbmRleCQgfCBhc3luYzsgbGV0IGZpXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZC5kYXRhLnlzOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICAgICAgPHJpdi1sZWdlbmQtaXRlbVxuICAgICAgICAgICAgKm5nSWY9XCJpIDwgZmkuZGF0YUluZGV4ICYmIGl0ZW0uc2hvd0xlZ2VuZEl0ZW0gIT09IGZhbHNlXCJcbiAgICAgICAgICAgIFtsYWJlbF09XCJpdGVtLmxhYmVsXCJcbiAgICAgICAgICAgIFtzdHlsZV09XCJpdGVtLnBhdHRlcm4gfHwgJ3NvbGlkJ1wiXG4gICAgICAgICAgICBbdmlzaWJpbGl0eV09XCJpdGVtLmhpZGRlbiA/ICdoaWRkZW4nIDogJ3Zpc2libGUnXCJcbiAgICAgICAgICAgIFtjbGlja2FibGVdPVwiY29uZmlnLmFsbG93TGVnZW5kVG9nZ2xlXCJcbiAgICAgICAgICAgIFtzaG93Q2hlY2tXaGVuQ2xpY2thYmxlXT1cIml0ZW0ucGF0dGVybiAhPT0gJ2RvdHMnXCJcbiAgICAgICAgICAgIFtjb2xvclRva2VuXT1cImdldEl0ZW1Db2xvcihpdGVtLCBpKVwiXG4gICAgICAgICAgICAoaXRlbUNsaWNrKT1cInRvZ2dsZUxlZ2VuZChpdGVtLCBpKVwiXG4gICAgICAgICAgPjwvcml2LWxlZ2VuZC1pdGVtPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mIGQuZGF0YS5zdXBwbGVtZW50YXJ5WXM7IGxldCBpID0gaW5kZXhcIlxuICAgICAgICA+XG4gICAgICAgICAgPHJpdi1sZWdlbmQtaXRlbVxuICAgICAgICAgICAgKm5nSWY9XCJpIDwgZmkuc3VwcEluZGV4ICYmIGl0ZW0uc2hvd0xlZ2VuZEl0ZW0gIT09IGZhbHNlXCJcbiAgICAgICAgICAgIFtsYWJlbF09XCJpdGVtLmxhYmVsXCJcbiAgICAgICAgICAgIFtzdHlsZV09XCJpdGVtLnBhdHRlcm4gfHwgJ3NvbGlkJ1wiXG4gICAgICAgICAgICBbdmlzaWJpbGl0eV09XCJpdGVtLmhpZGRlbiA/ICdoaWRkZW4nIDogJ3Zpc2libGUnXCJcbiAgICAgICAgICAgIFtjbGlja2FibGVdPVwiY29uZmlnLmFsbG93TGVnZW5kVG9nZ2xlXCJcbiAgICAgICAgICAgIFtzaG93Q2hlY2tXaGVuQ2xpY2thYmxlXT1cIml0ZW0ucGF0dGVybiAhPT0gJ2RvdHMnXCJcbiAgICAgICAgICAgIFtjb2xvclRva2VuXT1cImdldEl0ZW1Db2xvcihpdGVtLCBpKVwiXG4gICAgICAgICAgICAoaXRlbUNsaWNrKT1cInRvZ2dsZUxlZ2VuZChpdGVtLCBpKVwiXG4gICAgICAgICAgPjwvcml2LWxlZ2VuZC1pdGVtPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgICNtb3JlVGV4dENvbnRhaW5lclxuICAgICAgICAgIGNsYXNzPVwibW9yZS10ZXh0LWNvbnRhaW5lclwiXG4gICAgICAgICAgKG1vdXNlb3Zlcik9XCJtb3VzZW92ZXJMZWdlbmQoKVwiXG4gICAgICAgICAgKG1vdXNlbGVhdmUpPVwibW91c2VsZWF2ZUxlZ2VuZCgpXCJcbiAgICAgICAgICAoY2xpY2spPVwibW9yZUNsaWNrKClcIlxuICAgICAgICAgICpuZ0lmPVwiZmkuaGlkZGVuQ291bnRcIlxuICAgICAgICA+XG4gICAgICAgICAgPHNwYW4gcml2TGluayBjbGFzcz1cIm1vcmUtdGV4dFwiPlxuICAgICAgICAgICAgK1xuICAgICAgICAgICAge3sgZmkuaGlkZGVuQ291bnQgfX0gbW9yZVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG93TW9yZVRvb2x0aXAgfHwgbG9ja1Nob3dNb3JlVG9vbHRpcFwiPlxuICAgICAgICAgIDxyaXYtY2FsbG91dFxuICAgICAgICAgICAgKnJpdi1vdmVybGF5XG4gICAgICAgICAgICBbYW5jaG9yXT1cIm1vcmVUZXh0Q29udGFpbmVyPy5uYXRpdmVFbGVtZW50XCJcbiAgICAgICAgICAgIFtpc01vZGFsXT1cImxvY2tTaG93TW9yZVRvb2x0aXBcIlxuICAgICAgICAgICAgKGNsb3NlKT1cImNsb3NlSGFuZGxlcigpXCJcbiAgICAgICAgICAgIFtwcmVmZXJyZWRQb3NpdGlvbl09XCInYm90dG9tLXJpZ2h0J1wiXG4gICAgICAgICAgICBbdGhlbWVdPVwiJ2xpZ2h0J1wiXG4gICAgICAgICAgICBbc2hvd0NhcmV0XT1cImZhbHNlXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGVnZW5kLXRvb2x0aXBcIj5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBkLmRhdGEueXM7IGxldCBpID0gaW5kZXhcIj5cbiAgICAgICAgICAgICAgICA8cml2LWxlZ2VuZC1pdGVtXG4gICAgICAgICAgICAgICAgICAqbmdJZj1cImkgPj0gZmkuZGF0YUluZGV4ICYmIGl0ZW0uc2hvd0xlZ2VuZEl0ZW0gIT09IGZhbHNlXCJcbiAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJpdGVtLmxhYmVsXCJcbiAgICAgICAgICAgICAgICAgIFtzdHlsZV09XCJpdGVtLnBhdHRlcm4gfHwgJ3NvbGlkJ1wiXG4gICAgICAgICAgICAgICAgICBbdmlzaWJpbGl0eV09XCJpdGVtLmhpZGRlbiA/ICdoaWRkZW4nIDogJ3Zpc2libGUnXCJcbiAgICAgICAgICAgICAgICAgIFtjbGlja2FibGVdPVwiY29uZmlnLmFsbG93TGVnZW5kVG9nZ2xlXCJcbiAgICAgICAgICAgICAgICAgIFtzaG93Q2hlY2tXaGVuQ2xpY2thYmxlXT1cIml0ZW0ucGF0dGVybiAhPT0gJ2RvdHMnXCJcbiAgICAgICAgICAgICAgICAgIFtjb2xvclRva2VuXT1cImdldEl0ZW1Db2xvcihpdGVtLCBpKVwiXG4gICAgICAgICAgICAgICAgICAoaXRlbUNsaWNrKT1cInRvZ2dsZUxlZ2VuZChpdGVtLCBpKVwiXG4gICAgICAgICAgICAgICAgPjwvcml2LWxlZ2VuZC1pdGVtPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mIGQuZGF0YS5zdXBwbGVtZW50YXJ5WXM7IGxldCBpID0gaW5kZXhcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPHJpdi1sZWdlbmQtaXRlbVxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCJpID49IGZpLnN1cHBJbmRleCAmJiBpdGVtLnNob3dMZWdlbmRJdGVtICE9PSBmYWxzZVwiXG4gICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiaXRlbS5sYWJlbFwiXG4gICAgICAgICAgICAgICAgICBbc3R5bGVdPVwiaXRlbS5wYXR0ZXJuIHx8ICdzb2xpZCdcIlxuICAgICAgICAgICAgICAgICAgW3Zpc2liaWxpdHldPVwiaXRlbS5oaWRkZW4gPyAnaGlkZGVuJyA6ICd2aXNpYmxlJ1wiXG4gICAgICAgICAgICAgICAgICBbY29sb3JUb2tlbl09XCJnZXRJdGVtQ29sb3IoaXRlbSwgaSlcIlxuICAgICAgICAgICAgICAgICAgW2NsaWNrYWJsZV09XCJjb25maWcuYWxsb3dMZWdlbmRUb2dnbGVcIlxuICAgICAgICAgICAgICAgICAgW3Nob3dDaGVja1doZW5DbGlja2FibGVdPVwiaXRlbS5wYXR0ZXJuICE9PSAnZG90cydcIlxuICAgICAgICAgICAgICAgICAgKGl0ZW1DbGljayk9XCJ0b2dnbGVMZWdlbmQoaXRlbSwgaSlcIlxuICAgICAgICAgICAgICAgID48L3Jpdi1sZWdlbmQtaXRlbT5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L3Jpdi1jYWxsb3V0PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvbGVnZW5kPlxuICA8L25nLWNvbnRhaW5lcj5cbjwvZGl2PlxuXG48bmctdGVtcGxhdGUgI25vbkRpc3BsYXlTdGF0ZT5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNoZWNrRm9yTm9uRGlzcGxheVN0YXRlKGRyYXdEYXRhJCB8IGFzeW5jKTsgbGV0IHR5cGVcIj5cbiAgICA8cml2LXplcm8tc3RhdGVcbiAgICAgICpuZ0lmPVwidHlwZSA9PT0gJ3plcm9TdGF0ZSdcIlxuICAgICAgW21lc3NhZ2VdPVwiY29uZmlnLnplcm9TdGF0ZU1lc3NhZ2VcIlxuICAgID48L3Jpdi16ZXJvLXN0YXRlPlxuICAgIDxyaXYtemVyby1zdGF0ZVxuICAgICAgKm5nSWY9XCJ0eXBlID09PSAnc2l6aW5nRXJyb3JTdGF0ZSdcIlxuICAgICAgW21lc3NhZ2VdPVwiY29uZmlnLnNpemluZ0Vycm9yU3RhdGVNZXNzYWdlXCJcbiAgICA+PC9yaXYtemVyby1zdGF0ZT5cbiAgPC9uZy1jb250YWluZXI+XG48L25nLXRlbXBsYXRlPlxuIl19
|