@jax-data-science/sci-image-visualizer 0.13.0 → 0.15.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/esm2022/lib/channel-histogram/channel-histogram.component.mjs +39 -3
- package/esm2022/lib/channel-histogram/channel-tree.mjs +65 -0
- package/esm2022/lib/contracts/channel-histogram-api.contract.mjs +19 -1
- package/esm2022/lib/contracts/display-types.mjs +7 -1
- package/esm2022/lib/contracts/image.contract.mjs +1 -1
- package/esm2022/lib/contracts/spatial-dataset.contract.mjs +1 -1
- package/esm2022/lib/contracts/visualizer.contract.mjs +1 -1
- package/esm2022/lib/implementations/napari-js/napari-image-2d-scene.mjs +17 -2
- package/esm2022/lib/implementations/napari-js/napari-spatial-2d-scene.mjs +88 -10
- package/esm2022/lib/implementations/napari-js/napari-spatial-3d-scene.mjs +62 -13
- package/esm2022/lib/implementations/napari-js/napari-spatial-encoding.mjs +21 -1
- package/esm2022/lib/implementations/napari-js/napari-spatial-scene.mjs +5 -1
- package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +4 -1
- package/esm2022/lib/implementations/napari-js/spatial-tiles/categorical-lookup.mjs +26 -3
- package/esm2022/lib/implementations/napari-js/spatial-tiles/cell-layers.mjs +7 -9
- package/esm2022/lib/implementations/napari-js/spatial-tiles/density-layer.mjs +20 -4
- package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-hover.mjs +4 -2
- package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-jobs.mjs +4 -2
- package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-layers.mjs +42 -15
- package/esm2022/lib/implementations/osd/openseadragon-visualizer.service.mjs +3 -1
- package/esm2022/lib/spatial/lod.mjs +24 -3
- package/esm2022/lib/spatial/spatial-controls.facade.mjs +8 -3
- package/esm2022/lib/spatial/spatial-gene-filter.mjs +138 -0
- package/esm2022/lib/spatial/spatial-tile-merge.mjs +42 -1
- package/esm2022/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.mjs +47 -10
- package/esm2022/lib/spatial-controls/spatial-controls.component.mjs +4 -3
- package/esm2022/lib/spatial-controls/spatial-gene-style/spatial-gene-style.component.mjs +66 -0
- package/esm2022/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.mjs +106 -26
- package/esm2022/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.mjs +3 -3
- package/esm2022/lib/spatial-controls/spatial-key/spatial-key.component.mjs +3 -3
- package/esm2022/lib/spatial-controls/spatial-marker-genes-form/spatial-marker-genes-form.component.mjs +3 -3
- package/esm2022/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.mjs +110 -8
- package/esm2022/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.mjs +41 -9
- package/esm2022/lib/store/visualizer-store.service.mjs +67 -1
- package/fesm2022/{jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-DURPqs5a.mjs → jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-qUeMuBb0.mjs} +1250 -335
- package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-qUeMuBb0.mjs.map +1 -0
- package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-D0IQ6PjZ.mjs → jax-data-science-sci-image-visualizer-onnx-sam-session-U1ODcfYD.mjs} +3 -2
- package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-D0IQ6PjZ.mjs.map → jax-data-science-sci-image-visualizer-onnx-sam-session-U1ODcfYD.mjs.map} +1 -1
- package/fesm2022/jax-data-science-sci-image-visualizer.mjs +2 -1
- package/fesm2022/jax-data-science-sci-image-visualizer.mjs.map +1 -1
- package/lib/channel-histogram/channel-histogram.component.d.ts +14 -0
- package/lib/channel-histogram/channel-tree.d.ts +30 -0
- package/lib/contracts/channel-histogram-api.contract.d.ts +16 -0
- package/lib/contracts/display-types.d.ts +27 -0
- package/lib/contracts/image.contract.d.ts +8 -0
- package/lib/contracts/spatial-dataset.contract.d.ts +7 -0
- package/lib/contracts/visualizer.contract.d.ts +3 -0
- package/lib/implementations/napari-js/napari-image-2d-scene.d.ts +7 -0
- package/lib/implementations/napari-js/napari-spatial-2d-scene.d.ts +13 -2
- package/lib/implementations/napari-js/napari-spatial-encoding.d.ts +5 -0
- package/lib/implementations/napari-js/napari-spatial-scene.d.ts +4 -0
- package/lib/implementations/napari-js/napari-visualizer.service.d.ts +2 -0
- package/lib/implementations/napari-js/spatial-tiles/categorical-lookup.d.ts +6 -1
- package/lib/implementations/napari-js/spatial-tiles/transcript-hover.d.ts +4 -0
- package/lib/implementations/napari-js/spatial-tiles/transcript-layers.d.ts +3 -1
- package/lib/spatial/lod.d.ts +14 -2
- package/lib/spatial/spatial-controls.facade.d.ts +3 -0
- package/lib/spatial/spatial-gene-filter.d.ts +44 -0
- package/lib/spatial/spatial-tile-merge.d.ts +17 -0
- package/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.d.ts +18 -1
- package/lib/spatial-controls/spatial-gene-style/spatial-gene-style.component.d.ts +30 -0
- package/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.d.ts +39 -7
- package/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.d.ts +33 -1
- package/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.d.ts +13 -1
- package/lib/store/visualizer-store.service.d.ts +19 -0
- package/package.json +1 -1
- package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-DURPqs5a.mjs.map +0 -1
|
@@ -2,12 +2,13 @@ import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, } from
|
|
|
2
2
|
import { CommonModule } from '@angular/common';
|
|
3
3
|
import { FormsModule } from '@angular/forms';
|
|
4
4
|
import { CheckboxModule } from 'primeng/checkbox';
|
|
5
|
+
import { InputSwitchModule } from 'primeng/inputswitch';
|
|
5
6
|
import { DropdownModule } from 'primeng/dropdown';
|
|
6
7
|
import { InputNumberModule } from 'primeng/inputnumber';
|
|
7
8
|
import { SelectButtonModule } from 'primeng/selectbutton';
|
|
8
9
|
import { SliderModule } from 'primeng/slider';
|
|
9
10
|
import { DEFAULT_SPATIAL_VIEW } from '../../contracts/display-types';
|
|
10
|
-
import { cellsShown } from '../../spatial/
|
|
11
|
+
import { cellsShown, drawnCellSets } from '../../spatial/lod';
|
|
11
12
|
import { densityColorBarCss, tileOptions } from '../../spatial/spatial-panel-model';
|
|
12
13
|
import { SpatialGroupsPanelComponent } from '../spatial-groups-panel/spatial-groups-panel.component';
|
|
13
14
|
import * as i0 from "@angular/core";
|
|
@@ -15,9 +16,10 @@ import * as i1 from "@angular/common";
|
|
|
15
16
|
import * as i2 from "@angular/forms";
|
|
16
17
|
import * as i3 from "primeng/checkbox";
|
|
17
18
|
import * as i4 from "primeng/dropdown";
|
|
18
|
-
import * as i5 from "primeng/
|
|
19
|
-
import * as i6 from "primeng/
|
|
20
|
-
import * as i7 from "primeng/
|
|
19
|
+
import * as i5 from "primeng/inputswitch";
|
|
20
|
+
import * as i6 from "primeng/inputnumber";
|
|
21
|
+
import * as i7 from "primeng/selectbutton";
|
|
22
|
+
import * as i8 from "primeng/slider";
|
|
21
23
|
/**
|
|
22
24
|
* The Cells section, as Xenium Explorer's: the outlines' on/off switch, which boundary set
|
|
23
25
|
* is drawn, how cells are coloured (with the gene, the colour, or the colour bar that
|
|
@@ -57,6 +59,12 @@ export class SpatialCellsPanelComponent {
|
|
|
57
59
|
* its buttons whenever the array identity changes — which made them impossible to click.
|
|
58
60
|
*/
|
|
59
61
|
this.cellSetOptions = [];
|
|
62
|
+
/**
|
|
63
|
+
* The boundary sets, the cells' first, each with a switch when there are at most two (as
|
|
64
|
+
* CytoCanvas's "Cell Boundaries" and "Nuclear Boundaries"): either, both or neither drawn.
|
|
65
|
+
* More sets keep the one-of choice.
|
|
66
|
+
*/
|
|
67
|
+
this.boundarySets = [];
|
|
60
68
|
/** Cell colour modes on offer (Xenium Explorer's "Cell Color"). */
|
|
61
69
|
this.cellColorOptions = [];
|
|
62
70
|
/** The density colour bar, rebuilt only when its colormap changes (a 256-entry LUT). */
|
|
@@ -67,6 +75,9 @@ export class SpatialCellsPanelComponent {
|
|
|
67
75
|
if (changes['dataset']) {
|
|
68
76
|
const options = tileOptions(this.dataset);
|
|
69
77
|
this.cellSetOptions = options.cellSetOptions;
|
|
78
|
+
this.boundarySets = [...(this.dataset?.polygonTiles?.sets ?? [])]
|
|
79
|
+
.sort((a, b) => (a.name === 'cell' ? -1 : b.name === 'cell' ? 1 : 0))
|
|
80
|
+
.map((set) => ({ name: set.name, label: set.label }));
|
|
70
81
|
this.cellColorOptions = options.cellColorOptions;
|
|
71
82
|
}
|
|
72
83
|
if (this.densityBarFor !== this.view.densityColormap || !this.densityColorBarCss) {
|
|
@@ -78,10 +89,11 @@ export class SpatialCellsPanelComponent {
|
|
|
78
89
|
get cellsOn() {
|
|
79
90
|
return cellsShown(this.dataset, this.view);
|
|
80
91
|
}
|
|
81
|
-
/** The boundary set drawn
|
|
92
|
+
/** The boundary set drawn, or "both", as the renderer resolves the view's choice: a set this
|
|
93
|
+
* dataset has, else its default, else its first. */
|
|
82
94
|
get activeCellSet() {
|
|
83
|
-
const
|
|
84
|
-
return
|
|
95
|
+
const drawn = drawnCellSets(this.dataset?.polygonTiles, this.view.cellSet);
|
|
96
|
+
return drawn?.nucleusSet ? 'both' : (drawn?.set ?? null);
|
|
85
97
|
}
|
|
86
98
|
/** Fill opacity as a 0–100 number, for the box beside the slider. */
|
|
87
99
|
get cellOpacityPercent() {
|
|
@@ -93,6 +105,30 @@ export class SpatialCellsPanelComponent {
|
|
|
93
105
|
onCellSet(set) {
|
|
94
106
|
this.controls?.setViewState({ cellSet: set });
|
|
95
107
|
}
|
|
108
|
+
/** Whether boundary set `name` is drawn: outlines on, and that set or both. */
|
|
109
|
+
boundaryOn(name) {
|
|
110
|
+
if (!this.cellsOn)
|
|
111
|
+
return false;
|
|
112
|
+
const drawn = drawnCellSets(this.dataset?.polygonTiles, this.view.cellSet);
|
|
113
|
+
return drawn?.set === name || drawn?.nucleusSet === name;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* A set's switch: on draws it with the other when that one is drawn ("both"), else alone;
|
|
117
|
+
* off leaves the other drawn, or no outlines at all.
|
|
118
|
+
*/
|
|
119
|
+
onBoundary(name, on) {
|
|
120
|
+
const other = this.boundarySets.find((s) => s.name !== name)?.name;
|
|
121
|
+
const otherOn = !!other && this.boundaryOn(other);
|
|
122
|
+
if (on) {
|
|
123
|
+
this.controls?.setViewState({ showCells: true, cellSet: otherOn ? 'both' : name });
|
|
124
|
+
}
|
|
125
|
+
else if (otherOn) {
|
|
126
|
+
this.controls?.setViewState({ cellSet: other });
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
this.controls?.setViewState({ showCells: false });
|
|
130
|
+
}
|
|
131
|
+
}
|
|
96
132
|
onCellDraw(draw) {
|
|
97
133
|
this.controls?.setViewState({ cellDraw: draw });
|
|
98
134
|
}
|
|
@@ -118,7 +154,7 @@ export class SpatialCellsPanelComponent {
|
|
|
118
154
|
this.controls?.setViewState({ cellSingleColor: hex });
|
|
119
155
|
}
|
|
120
156
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: SpatialCellsPanelComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
121
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.9", type: SpatialCellsPanelComponent, isStandalone: true, selector: "spatial-cells-panel", inputs: { controls: "controls", dataset: "dataset", view: "view", genes: "genes", colorBarCss: "colorBarCss", open: "open" }, outputs: { openChange: "openChange" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"sc-panel\" [class.open]=\"open\">\n <div class=\"sc-panel-head\" (click)=\"openChange.emit(!open)\">\n <p-checkbox\n [binary]=\"true\"\n [ngModel]=\"cellsOn\"\n (click)=\"$event.stopPropagation()\"\n (onChange)=\"onShowCells($event.checked)\"\n ></p-checkbox>\n <span class=\"sc-panel-title\">Cells</span>\n <i class=\"pi\" [class.pi-chevron-down]=\"open\" [class.pi-chevron-right]=\"!open\"></i>\n </div>\n <div class=\"sc-panel-body\" *ngIf=\"open\">\n <ng-container *ngIf=\"cellSetOptions.length > 1\">\n <div class=\"sc-subhead\">Boundaries</div>\n <p-selectButton\n [options]=\"cellSetOptions\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [ngModel]=\"activeCellSet\"\n (ngModelChange)=\"onCellSet($event)\"\n [allowEmpty]=\"false\"\n styleClass=\"sc-buttons\"\n ></p-selectButton>\n </ng-container>\n\n <div class=\"sc-subhead\">Coloring</div>\n <div class=\"sc-row\">\n <span class=\"sc-lbl\">Cell Color</span>\n <p-dropdown\n [options]=\"cellColorOptions\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [ngModel]=\"view.cellColorMode\"\n (ngModelChange)=\"onCellColorMode($event)\"\n appendTo=\"body\"\n ></p-dropdown>\n </div>\n <small class=\"sc-hint\" *ngIf=\"view.cellColorMode === 'group'\">\n Adjust cell color in the groups section below.\n </small>\n <ng-container *ngIf=\"genes?.state$ | async as gene\">\n <div class=\"sc-row\" *ngIf=\"view.cellColorMode === 'gene' && dataset?.features\">\n <span class=\"sc-lbl\">Gene</span>\n <p-dropdown\n [options]=\"gene.options\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [ngModel]=\"view.cellColorGene\"\n (ngModelChange)=\"onCellColorGene($event)\"\n [filter]=\"true\"\n filterBy=\"label\"\n [resetFilterOnHide]=\"true\"\n (onFilter)=\"genes?.onFilter($event.filter)\"\n (onShow)=\"genes?.ensureList()\"\n [virtualScroll]=\"gene.options.length > geneVirtualScrollFrom\"\n [virtualScrollItemSize]=\"30\"\n appendTo=\"body\"\n placeholder=\"Search genes\u2026\"\n ></p-dropdown>\n </div>\n </ng-container>\n <div class=\"sc-row\" *ngIf=\"view.cellColorMode === 'single'\">\n <span class=\"sc-lbl\">Color</span>\n <input\n type=\"color\"\n class=\"sc-color-input\"\n [value]=\"view.cellSingleColor\"\n (change)=\"onCellSingleColor($any($event.target).value)\"\n />\n </div>\n <div *ngIf=\"view.cellColorMode === 'gene' || view.cellColorMode === 'transcriptDensity'\">\n <div class=\"sc-colorbar\" [style.background]=\"colorBarCss || densityColorBarCss\"></div>\n </div>\n\n <spatial-groups-panel [controls]=\"controls\" [dataset]=\"dataset\" [view]=\"view\"></spatial-groups-panel>\n\n <div class=\"sc-subhead\">Visibility</div>\n <span class=\"sc-lbl\">View cells as</span>\n <p-selectButton\n [options]=\"cellDrawOptions\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [ngModel]=\"view.cellDraw\"\n (ngModelChange)=\"onCellDraw($event)\"\n [allowEmpty]=\"false\"\n styleClass=\"sc-buttons\"\n ></p-selectButton>\n <ng-container *ngIf=\"view.cellDraw !== 'outline'\">\n <span class=\"sc-lbl\">Cell fill opacity</span>\n <div class=\"sc-row sc-row-number\">\n <p-slider\n [ngModel]=\"view.cellOpacity\"\n [min]=\"0.05\"\n [max]=\"1\"\n [step]=\"0.05\"\n (onChange)=\"onCellOpacity($event.value)\"\n ></p-slider>\n <p-inputNumber\n [ngModel]=\"cellOpacityPercent\"\n (ngModelChange)=\"onCellOpacityPercent($event)\"\n [min]=\"5\"\n [max]=\"100\"\n [showButtons]=\"false\"\n inputStyleClass=\"sc-num\"\n ></p-inputNumber>\n </div>\n </ng-container>\n </div>\n</div>\n", styles: [".sc-hint{font-size:.75rem;color:var(--text-color-secondary, #6c757d)}.sc-error{color:var(--red-600, #c62828)}.sc-section{display:flex;flex-direction:column;gap:.35rem}.sc-lbl{font-size:.78rem;color:var(--text-color-secondary, #6c757d);white-space:nowrap}.sc-row{display:flex;align-items:center;gap:.6rem}.sc-row p-slider,.sc-row p-dropdown,.sc-row p-treeSelect{flex:1 1 0;min-width:0}:host ::ng-deep .sc-row p-slider .p-slider{width:100%}:host ::ng-deep .sc-row p-dropdown .p-dropdown,:host ::ng-deep .sc-row p-treeSelect .p-treeselect{width:100%}.sc-row .sc-lbl{flex:0 0 calc(50% - .6rem);min-width:0;overflow:hidden;text-overflow:ellipsis}.sc-cmap-option{display:inline-flex;align-items:center;gap:.4rem}.sc-cmap-swatch{width:3.5rem;height:.7rem;border-radius:2px;display:block}.sc-val{flex:0 0 4rem;text-align:right;font-size:.78rem;font-variant-numeric:tabular-nums;white-space:nowrap}:host ::ng-deep .sc-full,:host ::ng-deep .sc-full .p-dropdown,:host ::ng-deep .sc-full .p-autocomplete,:host ::ng-deep .sc-full input{width:100%}.sc-colorbar{height:.75rem;border-radius:2px;border:1px solid rgba(0,0,0,.2)}.sc-colorbar-ends{display:flex;justify-content:space-between;font-size:.7rem;color:var(--text-color-secondary, #6c757d);margin-top:.2rem}.sc-panel{border:1px solid var(--surface-border, #dee2e6);border-radius:6px;margin-bottom:.5rem;overflow:hidden}.sc-panel-head{display:flex;align-items:center;gap:.6rem;padding:.5rem .7rem;cursor:pointer;-webkit-user-select:none;user-select:none;background:var(--surface-100, #f5f6f7)}.sc-panel-head .sc-panel-title{flex:1;font-weight:600}.sc-panel.open>.sc-panel-head{background:var(--primary-color, #2196f3);color:var(--primary-color-text, #fff)}.sc-panel-body{display:flex;flex-direction:column;gap:.45rem;padding:.6rem .75rem .75rem}.sc-subhead{display:flex;align-items:center;gap:.5rem;margin-top:.4rem;font-size:.72rem;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--text-color-secondary, #6c757d)}.sc-subhead:after{content:\"\";flex:1;border-top:1px solid var(--surface-border, #dee2e6)}:host ::ng-deep .sc-buttons .p-button{padding:.35rem .75rem;font-size:.85rem}.sc-row-picker p-dropdown,.sc-row-picker p-multiSelect,.sc-row-picker p-treeSelect{flex:1 1 0;min-width:0}:host ::ng-deep .sc-row-picker .sc-variant{width:6.5rem}:host ::ng-deep .sc-row-picker p-multiselect .p-multiselect{width:100%}:host ::ng-deep .sc-row-picker p-dropdown:has(.sc-variant){flex:0 0 6.5rem}:host ::ng-deep .sc-row-picker p-treeselect:has(.sc-palette){flex:0 0 3rem}:host ::ng-deep .sc-palette .p-treeselect-label{width:0;padding:0}.sc-icon-btn{flex:0 0 auto;border:0;background:transparent;cursor:pointer;padding:.25rem .35rem;font:inherit;font-size:1.05rem;color:var(--text-color, #333);border-radius:4px}.sc-icon-btn:hover{background:var(--surface-200, #e9ecef)}.sc-icon-btn.active{color:var(--primary-color, #2196f3);font-weight:700}.sc-icon-btn:disabled{opacity:.5;cursor:default}.sc-small-btn{margin-left:auto;border:1px solid var(--surface-border, #ced4da);background:var(--surface-0, #fff);border-radius:4px;padding:.2rem .6rem;font:inherit;font-size:.8rem;cursor:pointer}:host ::ng-deep .sc-group-heading{font-size:.7rem;font-weight:700;letter-spacing:.05em;text-transform:uppercase;opacity:.7}.sc-group-list,.sc-gene-tree{max-height:16rem;overflow-y:auto;border:1px solid var(--surface-border, #dee2e6);border-radius:4px;padding:.25rem .4rem}.sc-group-row,.sc-gene-row{display:flex;align-items:center;gap:.45rem;padding:.15rem 0;font-size:.88rem}.sc-group-row .sc-group-label,.sc-gene-row .sc-group-label{flex:0 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sc-group-all,.sc-gene-root,.sc-gene-group{font-weight:600}.sc-group-all .sc-icon-btn,.sc-gene-root .sc-icon-btn,.sc-gene-group .sc-icon-btn{margin-left:auto;font-size:.85rem}.sc-count{flex:0 0 auto;font-size:.78rem;color:var(--text-color-secondary, #6c757d)}.sc-glyph-option{display:inline-flex;align-items:center;gap:.4rem}.sc-glyph-svg{width:1rem;height:1rem;fill:currentColor}:host ::ng-deep .sc-glyph-pick .p-dropdown-label{padding:.2rem .4rem}.sc-color-input{width:2.5rem;height:1.8rem;border:1px solid var(--surface-border, #ced4da);border-radius:4px;padding:0;background:none}.sc-row-number p-slider,.sc-row-range p-slider{flex:1 1 0;min-width:0}:host ::ng-deep .sc-num{width:4.5rem;padding:.3rem .4rem;text-align:center}:host ::ng-deep .sc-row-number p-inputnumber,:host ::ng-deep .sc-row-range p-inputnumber{flex:0 0 auto}:host{display:contents}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: CheckboxModule }, { kind: "component", type: i3.Checkbox, selector: "p-checkbox", inputs: ["value", "name", "disabled", "binary", "label", "ariaLabelledBy", "ariaLabel", "tabindex", "inputId", "style", "styleClass", "labelStyleClass", "formControl", "checkboxIcon", "readonly", "required", "autofocus", "trueValue", "falseValue", "variant"], outputs: ["onChange", "onFocus", "onBlur"] }, { kind: "ngmodule", type: DropdownModule }, { kind: "component", type: i4.Dropdown, selector: "p-dropdown", inputs: ["id", "scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "loadingIcon", "filterPlaceholder", "filterLocale", "variant", "inputId", "dataKey", "filterBy", "filterFields", "autofocus", "resetFilterOnHide", "checkmark", "dropdownIcon", "loading", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "focusOnHover", "selectOnFocus", "autoOptionFocus", "autofocusFilter", "autoShowPanelOnPrintableCharacterKeyDown", "disabled", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "filterValue", "options"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "ngmodule", type: InputNumberModule }, { kind: "component", type: i5.InputNumber, selector: "p-inputNumber", inputs: ["showButtons", "format", "buttonLayout", "inputId", "styleClass", "style", "placeholder", "size", "maxlength", "tabindex", "title", "ariaLabelledBy", "ariaLabel", "ariaRequired", "name", "required", "autocomplete", "min", "max", "incrementButtonClass", "decrementButtonClass", "incrementButtonIcon", "decrementButtonIcon", "readonly", "step", "allowEmpty", "locale", "localeMatcher", "mode", "currency", "currencyDisplay", "useGrouping", "variant", "minFractionDigits", "maxFractionDigits", "prefix", "suffix", "inputStyle", "inputStyleClass", "showClear", "autofocus", "disabled"], outputs: ["onInput", "onFocus", "onBlur", "onKeyDown", "onClear"] }, { kind: "ngmodule", type: SelectButtonModule }, { kind: "component", type: i6.SelectButton, selector: "p-selectButton", inputs: ["options", "optionLabel", "optionValue", "optionDisabled", "unselectable", "tabindex", "multiple", "allowEmpty", "style", "styleClass", "ariaLabelledBy", "disabled", "dataKey", "autofocus"], outputs: ["onOptionClick", "onChange"] }, { kind: "ngmodule", type: SliderModule }, { kind: "component", type: i7.Slider, selector: "p-slider", inputs: ["animate", "disabled", "min", "max", "orientation", "step", "range", "style", "styleClass", "ariaLabel", "ariaLabelledBy", "tabindex", "autofocus"], outputs: ["onChange", "onSlideEnd"] }, { kind: "component", type: SpatialGroupsPanelComponent, selector: "spatial-groups-panel", inputs: ["controls", "dataset", "view"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
157
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.9", type: SpatialCellsPanelComponent, isStandalone: true, selector: "spatial-cells-panel", inputs: { controls: "controls", dataset: "dataset", view: "view", genes: "genes", colorBarCss: "colorBarCss", open: "open" }, outputs: { openChange: "openChange" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"sc-panel\" [class.open]=\"open\">\n <div class=\"sc-panel-head\" (click)=\"openChange.emit(!open)\">\n <p-checkbox\n [binary]=\"true\"\n [ngModel]=\"cellsOn\"\n (click)=\"$event.stopPropagation()\"\n (onChange)=\"onShowCells($event.checked)\"\n ></p-checkbox>\n <span class=\"sc-panel-title\">Cells</span>\n <i class=\"pi\" [class.pi-chevron-down]=\"open\" [class.pi-chevron-right]=\"!open\"></i>\n </div>\n <div class=\"sc-panel-body\" *ngIf=\"open\">\n <ng-container *ngIf=\"boundarySets.length && boundarySets.length <= 2\">\n <div class=\"sc-subhead\">Boundaries</div>\n <div class=\"sc-row\" *ngFor=\"let set of boundarySets\">\n <span class=\"sc-lbl\">{{ set.label }}</span>\n <p-inputSwitch\n [ngModel]=\"boundaryOn(set.name)\"\n (onChange)=\"onBoundary(set.name, $event.checked)\"\n [attr.aria-label]=\"set.label\"\n ></p-inputSwitch>\n </div>\n </ng-container>\n <ng-container *ngIf=\"boundarySets.length > 2\">\n <div class=\"sc-subhead\">Boundaries</div>\n <p-selectButton\n [options]=\"cellSetOptions\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [ngModel]=\"activeCellSet\"\n (ngModelChange)=\"onCellSet($event)\"\n [allowEmpty]=\"false\"\n styleClass=\"sc-buttons\"\n ></p-selectButton>\n </ng-container>\n\n <div class=\"sc-subhead\">Coloring</div>\n <div class=\"sc-row\">\n <span class=\"sc-lbl\">Cell Color</span>\n <p-dropdown\n [options]=\"cellColorOptions\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [ngModel]=\"view.cellColorMode\"\n (ngModelChange)=\"onCellColorMode($event)\"\n appendTo=\"body\"\n ></p-dropdown>\n </div>\n <small class=\"sc-hint\" *ngIf=\"view.cellColorMode === 'group'\">\n Adjust cell color in the groups section below.\n </small>\n <ng-container *ngIf=\"genes?.state$ | async as gene\">\n <div class=\"sc-row\" *ngIf=\"view.cellColorMode === 'gene' && dataset?.features\">\n <span class=\"sc-lbl\">Gene</span>\n <p-dropdown\n [options]=\"gene.options\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [ngModel]=\"view.cellColorGene\"\n (ngModelChange)=\"onCellColorGene($event)\"\n [filter]=\"true\"\n filterBy=\"label\"\n [resetFilterOnHide]=\"true\"\n (onFilter)=\"genes?.onFilter($event.filter)\"\n (onShow)=\"genes?.ensureList()\"\n [virtualScroll]=\"gene.options.length > geneVirtualScrollFrom\"\n [virtualScrollItemSize]=\"30\"\n appendTo=\"body\"\n placeholder=\"Search genes\u2026\"\n ></p-dropdown>\n </div>\n </ng-container>\n <div class=\"sc-row\" *ngIf=\"view.cellColorMode === 'single'\">\n <span class=\"sc-lbl\">Color</span>\n <input\n type=\"color\"\n class=\"sc-color-input\"\n [value]=\"view.cellSingleColor\"\n (change)=\"onCellSingleColor($any($event.target).value)\"\n />\n </div>\n <div *ngIf=\"view.cellColorMode === 'gene' || view.cellColorMode === 'transcriptDensity'\">\n <div class=\"sc-colorbar\" [style.background]=\"colorBarCss || densityColorBarCss\"></div>\n </div>\n\n <spatial-groups-panel [controls]=\"controls\" [dataset]=\"dataset\" [view]=\"view\"></spatial-groups-panel>\n\n <div class=\"sc-subhead\">Visibility</div>\n <span class=\"sc-lbl\">View cells as</span>\n <p-selectButton\n [options]=\"cellDrawOptions\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [ngModel]=\"view.cellDraw\"\n (ngModelChange)=\"onCellDraw($event)\"\n [allowEmpty]=\"false\"\n styleClass=\"sc-buttons\"\n ></p-selectButton>\n <ng-container *ngIf=\"view.cellDraw !== 'outline'\">\n <span class=\"sc-lbl\">Cell fill opacity</span>\n <div class=\"sc-row sc-row-number\">\n <p-slider\n [ngModel]=\"view.cellOpacity\"\n [min]=\"0.05\"\n [max]=\"1\"\n [step]=\"0.05\"\n (onChange)=\"onCellOpacity($event.value)\"\n ></p-slider>\n <p-inputNumber\n [ngModel]=\"cellOpacityPercent\"\n (ngModelChange)=\"onCellOpacityPercent($event)\"\n [min]=\"5\"\n [max]=\"100\"\n [showButtons]=\"false\"\n inputStyleClass=\"sc-num\"\n ></p-inputNumber>\n </div>\n </ng-container>\n </div>\n</div>\n", styles: [".sc-hint{font-size:.75rem;color:var(--text-color-secondary, #6c757d)}.sc-error{color:var(--red-600, #c62828)}.sc-section{display:flex;flex-direction:column;gap:.35rem}.sc-lbl{font-size:.78rem;color:var(--text-color-secondary, #6c757d);white-space:nowrap}.sc-row{display:flex;align-items:center;gap:.6rem}.sc-row p-slider,.sc-row p-dropdown,.sc-row p-treeSelect{flex:1 1 0;min-width:0}:host ::ng-deep .sc-row p-slider .p-slider{width:100%}:host ::ng-deep .sc-row p-dropdown .p-dropdown,:host ::ng-deep .sc-row p-treeSelect .p-treeselect{width:100%}.sc-row .sc-lbl{flex:0 0 calc(50% - .6rem);min-width:0;overflow:hidden;text-overflow:ellipsis}.sc-cmap-option{display:inline-flex;align-items:center;gap:.4rem}.sc-cmap-swatch{width:3.5rem;height:.7rem;border-radius:2px;display:block}.sc-val{flex:0 0 4rem;text-align:right;font-size:.78rem;font-variant-numeric:tabular-nums;white-space:nowrap}:host ::ng-deep .sc-full,:host ::ng-deep .sc-full .p-dropdown,:host ::ng-deep .sc-full .p-autocomplete,:host ::ng-deep .sc-full input{width:100%}.sc-colorbar{height:.75rem;border-radius:2px;border:1px solid rgba(0,0,0,.2)}.sc-colorbar-ends{display:flex;justify-content:space-between;font-size:.7rem;color:var(--text-color-secondary, #6c757d);margin-top:.2rem}.sc-panel{border:1px solid var(--surface-border, #dee2e6);border-radius:6px;margin-bottom:.5rem;overflow:hidden}.sc-panel-head{display:flex;align-items:center;gap:.6rem;padding:.5rem .7rem;cursor:pointer;-webkit-user-select:none;user-select:none;background:var(--surface-100, #f5f6f7)}.sc-panel-head .sc-panel-title{flex:1;font-weight:600}.sc-panel.open>.sc-panel-head{background:var(--primary-color, #2196f3);color:var(--primary-color-text, #fff)}.sc-panel-body{display:flex;flex-direction:column;gap:.45rem;padding:.6rem .75rem .75rem}.sc-subhead{display:flex;align-items:center;gap:.5rem;margin-top:.4rem;font-size:.72rem;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--text-color-secondary, #6c757d)}.sc-subhead:after{content:\"\";flex:1;border-top:1px solid var(--surface-border, #dee2e6)}:host ::ng-deep .sc-buttons .p-button{padding:.35rem .75rem;font-size:.85rem}.sc-row-picker p-dropdown,.sc-row-picker p-multiSelect,.sc-row-picker p-treeSelect{flex:1 1 0;min-width:0}:host ::ng-deep .sc-row-picker .sc-variant{width:6.5rem}:host ::ng-deep .sc-row-picker p-multiselect .p-multiselect{width:100%}:host ::ng-deep .sc-row-picker p-dropdown:has(.sc-variant){flex:0 0 6.5rem}:host ::ng-deep .sc-row-picker p-treeselect:has(.sc-palette){flex:0 0 3rem}:host ::ng-deep .sc-palette .p-treeselect-label{width:0;padding:0}.sc-icon-btn{flex:0 0 auto;border:0;background:transparent;cursor:pointer;padding:.25rem .35rem;font:inherit;font-size:1.05rem;color:var(--text-color, #333);border-radius:4px}.sc-icon-btn:hover{background:var(--surface-200, #e9ecef)}.sc-icon-btn.active{color:var(--primary-color, #2196f3);font-weight:700}.sc-icon-btn:disabled{opacity:.5;cursor:default}.sc-small-btn{margin-left:auto;border:1px solid var(--surface-border, #ced4da);background:var(--surface-0, #fff);border-radius:4px;padding:.2rem .6rem;font:inherit;font-size:.8rem;cursor:pointer}:host ::ng-deep .sc-group-heading{font-size:.7rem;font-weight:700;letter-spacing:.05em;text-transform:uppercase;opacity:.7}.sc-group-list,.sc-gene-tree{max-height:16rem;overflow-y:auto;border:1px solid var(--surface-border, #dee2e6);border-radius:4px;padding:.25rem .4rem}.sc-group-row,.sc-gene-row{display:flex;align-items:center;gap:.45rem;padding:.15rem 0;font-size:.88rem}.sc-group-row .sc-group-label,.sc-gene-row .sc-group-label{flex:0 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sc-group-all,.sc-gene-root,.sc-gene-group{font-weight:600}.sc-group-all .sc-icon-btn,.sc-gene-root .sc-icon-btn,.sc-gene-group .sc-icon-btn{margin-left:auto;font-size:.85rem}.sc-count{flex:0 0 auto;font-size:.78rem;color:var(--text-color-secondary, #6c757d)}.sc-glyph-option{display:inline-flex;align-items:center;gap:.4rem}.sc-glyph-svg{width:1rem;height:1rem;fill:currentColor}:host ::ng-deep .sc-glyph-pick .p-dropdown-label{padding:.2rem .4rem}.sc-color-input{width:2.5rem;height:1.8rem;border:1px solid var(--surface-border, #ced4da);border-radius:4px;padding:0;background:none}.sc-row-number p-slider,.sc-row-range p-slider{flex:1 1 0;min-width:0}:host ::ng-deep .sc-num{width:4.5rem;padding:.3rem .4rem;text-align:center}:host ::ng-deep .sc-row-number p-inputnumber,:host ::ng-deep .sc-row-range p-inputnumber{flex:0 0 auto}.sc-gene-icon{flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;width:1.4rem;height:1.4rem;padding:0;border:1px solid transparent;border-radius:4px;background:transparent;cursor:pointer}.sc-gene-icon:hover,.sc-gene-icon:focus-visible{border-color:var(--surface-border, rgba(0, 0, 0, .2))}:host{display:contents}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: CheckboxModule }, { kind: "component", type: i3.Checkbox, selector: "p-checkbox", inputs: ["value", "name", "disabled", "binary", "label", "ariaLabelledBy", "ariaLabel", "tabindex", "inputId", "style", "styleClass", "labelStyleClass", "formControl", "checkboxIcon", "readonly", "required", "autofocus", "trueValue", "falseValue", "variant"], outputs: ["onChange", "onFocus", "onBlur"] }, { kind: "ngmodule", type: DropdownModule }, { kind: "component", type: i4.Dropdown, selector: "p-dropdown", inputs: ["id", "scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "loadingIcon", "filterPlaceholder", "filterLocale", "variant", "inputId", "dataKey", "filterBy", "filterFields", "autofocus", "resetFilterOnHide", "checkmark", "dropdownIcon", "loading", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "focusOnHover", "selectOnFocus", "autoOptionFocus", "autofocusFilter", "autoShowPanelOnPrintableCharacterKeyDown", "disabled", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "filterValue", "options"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "ngmodule", type: InputSwitchModule }, { kind: "component", type: i5.InputSwitch, selector: "p-inputSwitch", inputs: ["style", "styleClass", "tabindex", "inputId", "name", "disabled", "readonly", "trueValue", "falseValue", "ariaLabel", "ariaLabelledBy", "autofocus"], outputs: ["onChange"] }, { kind: "ngmodule", type: InputNumberModule }, { kind: "component", type: i6.InputNumber, selector: "p-inputNumber", inputs: ["showButtons", "format", "buttonLayout", "inputId", "styleClass", "style", "placeholder", "size", "maxlength", "tabindex", "title", "ariaLabelledBy", "ariaLabel", "ariaRequired", "name", "required", "autocomplete", "min", "max", "incrementButtonClass", "decrementButtonClass", "incrementButtonIcon", "decrementButtonIcon", "readonly", "step", "allowEmpty", "locale", "localeMatcher", "mode", "currency", "currencyDisplay", "useGrouping", "variant", "minFractionDigits", "maxFractionDigits", "prefix", "suffix", "inputStyle", "inputStyleClass", "showClear", "autofocus", "disabled"], outputs: ["onInput", "onFocus", "onBlur", "onKeyDown", "onClear"] }, { kind: "ngmodule", type: SelectButtonModule }, { kind: "component", type: i7.SelectButton, selector: "p-selectButton", inputs: ["options", "optionLabel", "optionValue", "optionDisabled", "unselectable", "tabindex", "multiple", "allowEmpty", "style", "styleClass", "ariaLabelledBy", "disabled", "dataKey", "autofocus"], outputs: ["onOptionClick", "onChange"] }, { kind: "ngmodule", type: SliderModule }, { kind: "component", type: i8.Slider, selector: "p-slider", inputs: ["animate", "disabled", "min", "max", "orientation", "step", "range", "style", "styleClass", "ariaLabel", "ariaLabelledBy", "tabindex", "autofocus"], outputs: ["onChange", "onSlideEnd"] }, { kind: "component", type: SpatialGroupsPanelComponent, selector: "spatial-groups-panel", inputs: ["controls", "dataset", "view"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
122
158
|
}
|
|
123
159
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: SpatialCellsPanelComponent, decorators: [{
|
|
124
160
|
type: Component,
|
|
@@ -127,11 +163,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImpor
|
|
|
127
163
|
FormsModule,
|
|
128
164
|
CheckboxModule,
|
|
129
165
|
DropdownModule,
|
|
166
|
+
InputSwitchModule,
|
|
130
167
|
InputNumberModule,
|
|
131
168
|
SelectButtonModule,
|
|
132
169
|
SliderModule,
|
|
133
170
|
SpatialGroupsPanelComponent,
|
|
134
|
-
], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"sc-panel\" [class.open]=\"open\">\n <div class=\"sc-panel-head\" (click)=\"openChange.emit(!open)\">\n <p-checkbox\n [binary]=\"true\"\n [ngModel]=\"cellsOn\"\n (click)=\"$event.stopPropagation()\"\n (onChange)=\"onShowCells($event.checked)\"\n ></p-checkbox>\n <span class=\"sc-panel-title\">Cells</span>\n <i class=\"pi\" [class.pi-chevron-down]=\"open\" [class.pi-chevron-right]=\"!open\"></i>\n </div>\n <div class=\"sc-panel-body\" *ngIf=\"open\">\n <ng-container *ngIf=\"
|
|
171
|
+
], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"sc-panel\" [class.open]=\"open\">\n <div class=\"sc-panel-head\" (click)=\"openChange.emit(!open)\">\n <p-checkbox\n [binary]=\"true\"\n [ngModel]=\"cellsOn\"\n (click)=\"$event.stopPropagation()\"\n (onChange)=\"onShowCells($event.checked)\"\n ></p-checkbox>\n <span class=\"sc-panel-title\">Cells</span>\n <i class=\"pi\" [class.pi-chevron-down]=\"open\" [class.pi-chevron-right]=\"!open\"></i>\n </div>\n <div class=\"sc-panel-body\" *ngIf=\"open\">\n <ng-container *ngIf=\"boundarySets.length && boundarySets.length <= 2\">\n <div class=\"sc-subhead\">Boundaries</div>\n <div class=\"sc-row\" *ngFor=\"let set of boundarySets\">\n <span class=\"sc-lbl\">{{ set.label }}</span>\n <p-inputSwitch\n [ngModel]=\"boundaryOn(set.name)\"\n (onChange)=\"onBoundary(set.name, $event.checked)\"\n [attr.aria-label]=\"set.label\"\n ></p-inputSwitch>\n </div>\n </ng-container>\n <ng-container *ngIf=\"boundarySets.length > 2\">\n <div class=\"sc-subhead\">Boundaries</div>\n <p-selectButton\n [options]=\"cellSetOptions\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [ngModel]=\"activeCellSet\"\n (ngModelChange)=\"onCellSet($event)\"\n [allowEmpty]=\"false\"\n styleClass=\"sc-buttons\"\n ></p-selectButton>\n </ng-container>\n\n <div class=\"sc-subhead\">Coloring</div>\n <div class=\"sc-row\">\n <span class=\"sc-lbl\">Cell Color</span>\n <p-dropdown\n [options]=\"cellColorOptions\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [ngModel]=\"view.cellColorMode\"\n (ngModelChange)=\"onCellColorMode($event)\"\n appendTo=\"body\"\n ></p-dropdown>\n </div>\n <small class=\"sc-hint\" *ngIf=\"view.cellColorMode === 'group'\">\n Adjust cell color in the groups section below.\n </small>\n <ng-container *ngIf=\"genes?.state$ | async as gene\">\n <div class=\"sc-row\" *ngIf=\"view.cellColorMode === 'gene' && dataset?.features\">\n <span class=\"sc-lbl\">Gene</span>\n <p-dropdown\n [options]=\"gene.options\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [ngModel]=\"view.cellColorGene\"\n (ngModelChange)=\"onCellColorGene($event)\"\n [filter]=\"true\"\n filterBy=\"label\"\n [resetFilterOnHide]=\"true\"\n (onFilter)=\"genes?.onFilter($event.filter)\"\n (onShow)=\"genes?.ensureList()\"\n [virtualScroll]=\"gene.options.length > geneVirtualScrollFrom\"\n [virtualScrollItemSize]=\"30\"\n appendTo=\"body\"\n placeholder=\"Search genes\u2026\"\n ></p-dropdown>\n </div>\n </ng-container>\n <div class=\"sc-row\" *ngIf=\"view.cellColorMode === 'single'\">\n <span class=\"sc-lbl\">Color</span>\n <input\n type=\"color\"\n class=\"sc-color-input\"\n [value]=\"view.cellSingleColor\"\n (change)=\"onCellSingleColor($any($event.target).value)\"\n />\n </div>\n <div *ngIf=\"view.cellColorMode === 'gene' || view.cellColorMode === 'transcriptDensity'\">\n <div class=\"sc-colorbar\" [style.background]=\"colorBarCss || densityColorBarCss\"></div>\n </div>\n\n <spatial-groups-panel [controls]=\"controls\" [dataset]=\"dataset\" [view]=\"view\"></spatial-groups-panel>\n\n <div class=\"sc-subhead\">Visibility</div>\n <span class=\"sc-lbl\">View cells as</span>\n <p-selectButton\n [options]=\"cellDrawOptions\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [ngModel]=\"view.cellDraw\"\n (ngModelChange)=\"onCellDraw($event)\"\n [allowEmpty]=\"false\"\n styleClass=\"sc-buttons\"\n ></p-selectButton>\n <ng-container *ngIf=\"view.cellDraw !== 'outline'\">\n <span class=\"sc-lbl\">Cell fill opacity</span>\n <div class=\"sc-row sc-row-number\">\n <p-slider\n [ngModel]=\"view.cellOpacity\"\n [min]=\"0.05\"\n [max]=\"1\"\n [step]=\"0.05\"\n (onChange)=\"onCellOpacity($event.value)\"\n ></p-slider>\n <p-inputNumber\n [ngModel]=\"cellOpacityPercent\"\n (ngModelChange)=\"onCellOpacityPercent($event)\"\n [min]=\"5\"\n [max]=\"100\"\n [showButtons]=\"false\"\n inputStyleClass=\"sc-num\"\n ></p-inputNumber>\n </div>\n </ng-container>\n </div>\n</div>\n", styles: [".sc-hint{font-size:.75rem;color:var(--text-color-secondary, #6c757d)}.sc-error{color:var(--red-600, #c62828)}.sc-section{display:flex;flex-direction:column;gap:.35rem}.sc-lbl{font-size:.78rem;color:var(--text-color-secondary, #6c757d);white-space:nowrap}.sc-row{display:flex;align-items:center;gap:.6rem}.sc-row p-slider,.sc-row p-dropdown,.sc-row p-treeSelect{flex:1 1 0;min-width:0}:host ::ng-deep .sc-row p-slider .p-slider{width:100%}:host ::ng-deep .sc-row p-dropdown .p-dropdown,:host ::ng-deep .sc-row p-treeSelect .p-treeselect{width:100%}.sc-row .sc-lbl{flex:0 0 calc(50% - .6rem);min-width:0;overflow:hidden;text-overflow:ellipsis}.sc-cmap-option{display:inline-flex;align-items:center;gap:.4rem}.sc-cmap-swatch{width:3.5rem;height:.7rem;border-radius:2px;display:block}.sc-val{flex:0 0 4rem;text-align:right;font-size:.78rem;font-variant-numeric:tabular-nums;white-space:nowrap}:host ::ng-deep .sc-full,:host ::ng-deep .sc-full .p-dropdown,:host ::ng-deep .sc-full .p-autocomplete,:host ::ng-deep .sc-full input{width:100%}.sc-colorbar{height:.75rem;border-radius:2px;border:1px solid rgba(0,0,0,.2)}.sc-colorbar-ends{display:flex;justify-content:space-between;font-size:.7rem;color:var(--text-color-secondary, #6c757d);margin-top:.2rem}.sc-panel{border:1px solid var(--surface-border, #dee2e6);border-radius:6px;margin-bottom:.5rem;overflow:hidden}.sc-panel-head{display:flex;align-items:center;gap:.6rem;padding:.5rem .7rem;cursor:pointer;-webkit-user-select:none;user-select:none;background:var(--surface-100, #f5f6f7)}.sc-panel-head .sc-panel-title{flex:1;font-weight:600}.sc-panel.open>.sc-panel-head{background:var(--primary-color, #2196f3);color:var(--primary-color-text, #fff)}.sc-panel-body{display:flex;flex-direction:column;gap:.45rem;padding:.6rem .75rem .75rem}.sc-subhead{display:flex;align-items:center;gap:.5rem;margin-top:.4rem;font-size:.72rem;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--text-color-secondary, #6c757d)}.sc-subhead:after{content:\"\";flex:1;border-top:1px solid var(--surface-border, #dee2e6)}:host ::ng-deep .sc-buttons .p-button{padding:.35rem .75rem;font-size:.85rem}.sc-row-picker p-dropdown,.sc-row-picker p-multiSelect,.sc-row-picker p-treeSelect{flex:1 1 0;min-width:0}:host ::ng-deep .sc-row-picker .sc-variant{width:6.5rem}:host ::ng-deep .sc-row-picker p-multiselect .p-multiselect{width:100%}:host ::ng-deep .sc-row-picker p-dropdown:has(.sc-variant){flex:0 0 6.5rem}:host ::ng-deep .sc-row-picker p-treeselect:has(.sc-palette){flex:0 0 3rem}:host ::ng-deep .sc-palette .p-treeselect-label{width:0;padding:0}.sc-icon-btn{flex:0 0 auto;border:0;background:transparent;cursor:pointer;padding:.25rem .35rem;font:inherit;font-size:1.05rem;color:var(--text-color, #333);border-radius:4px}.sc-icon-btn:hover{background:var(--surface-200, #e9ecef)}.sc-icon-btn.active{color:var(--primary-color, #2196f3);font-weight:700}.sc-icon-btn:disabled{opacity:.5;cursor:default}.sc-small-btn{margin-left:auto;border:1px solid var(--surface-border, #ced4da);background:var(--surface-0, #fff);border-radius:4px;padding:.2rem .6rem;font:inherit;font-size:.8rem;cursor:pointer}:host ::ng-deep .sc-group-heading{font-size:.7rem;font-weight:700;letter-spacing:.05em;text-transform:uppercase;opacity:.7}.sc-group-list,.sc-gene-tree{max-height:16rem;overflow-y:auto;border:1px solid var(--surface-border, #dee2e6);border-radius:4px;padding:.25rem .4rem}.sc-group-row,.sc-gene-row{display:flex;align-items:center;gap:.45rem;padding:.15rem 0;font-size:.88rem}.sc-group-row .sc-group-label,.sc-gene-row .sc-group-label{flex:0 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sc-group-all,.sc-gene-root,.sc-gene-group{font-weight:600}.sc-group-all .sc-icon-btn,.sc-gene-root .sc-icon-btn,.sc-gene-group .sc-icon-btn{margin-left:auto;font-size:.85rem}.sc-count{flex:0 0 auto;font-size:.78rem;color:var(--text-color-secondary, #6c757d)}.sc-glyph-option{display:inline-flex;align-items:center;gap:.4rem}.sc-glyph-svg{width:1rem;height:1rem;fill:currentColor}:host ::ng-deep .sc-glyph-pick .p-dropdown-label{padding:.2rem .4rem}.sc-color-input{width:2.5rem;height:1.8rem;border:1px solid var(--surface-border, #ced4da);border-radius:4px;padding:0;background:none}.sc-row-number p-slider,.sc-row-range p-slider{flex:1 1 0;min-width:0}:host ::ng-deep .sc-num{width:4.5rem;padding:.3rem .4rem;text-align:center}:host ::ng-deep .sc-row-number p-inputnumber,:host ::ng-deep .sc-row-range p-inputnumber{flex:0 0 auto}.sc-gene-icon{flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;width:1.4rem;height:1.4rem;padding:0;border:1px solid transparent;border-radius:4px;background:transparent;cursor:pointer}.sc-gene-icon:hover,.sc-gene-icon:focus-visible{border-color:var(--surface-border, rgba(0, 0, 0, .2))}:host{display:contents}\n"] }]
|
|
135
172
|
}], propDecorators: { controls: [{
|
|
136
173
|
type: Input
|
|
137
174
|
}], dataset: [{
|
|
@@ -147,4 +184,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImpor
|
|
|
147
184
|
}], openChange: [{
|
|
148
185
|
type: Output
|
|
149
186
|
}] } });
|
|
150
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhdGlhbC1jZWxscy1wYW5lbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL3NwYXRpYWwtY29udHJvbHMvc3BhdGlhbC1jZWxscy1wYW5lbC9zcGF0aWFsLWNlbGxzLXBhbmVsLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvc3BhdGlhbC1jb250cm9scy9zcGF0aWFsLWNlbGxzLXBhbmVsL3NwYXRpYWwtY2VsbHMtcGFuZWwuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFFTCxNQUFNLEdBRVAsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDbEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzFELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUk5QyxPQUFPLEVBQUUsb0JBQW9CLEVBQW9CLE1BQU0sK0JBQStCLENBQUM7QUFDdkYsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3pELE9BQU8sRUFBZSxrQkFBa0IsRUFBRSxXQUFXLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUVqRyxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSx3REFBd0QsQ0FBQzs7Ozs7Ozs7O0FBRXJHOzs7Ozs7R0FNRztB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TEFDWixXQUFXLDhWQUNYLGNBQWMsZ1pBQ2QsY0FBYyx1dENBQ2QsaUJBQWlCLHl2QkFDakIsa0JBQWtCLHdWQUNsQixZQUFZLGdTQUNaLDJCQUEyQjs7MkZBTWxCLDBCQUEwQjtrQkFqQnRDLFNBQVM7K0JBQ0UscUJBQXFCLGNBQ25CLElBQUksV0FDUDt3QkFDUCxZQUFZO3dCQUNaLFdBQVc7d0JBQ1gsY0FBYzt3QkFDZCxjQUFjO3dCQUNkLGlCQUFpQjt3QkFDakIsa0JBQWtCO3dCQUNsQixZQUFZO3dCQUNaLDJCQUEyQjtxQkFDNUIsbUJBR2dCLHVCQUF1QixDQUFDLE1BQU07OEJBSXRDLFFBQVE7c0JBQWhCLEtBQUs7Z0JBRUcsT0FBTztzQkFBZixLQUFLO2dCQUVHLElBQUk7c0JBQVosS0FBSztnQkFHRyxLQUFLO3NCQUFiLEtBQUs7Z0JBRUcsV0FBVztzQkFBbkIsS0FBSztnQkFFRyxJQUFJO3NCQUFaLEtBQUs7Z0JBRWEsVUFBVTtzQkFBNUIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT3V0cHV0LFxuICBTaW1wbGVDaGFuZ2VzLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IENoZWNrYm94TW9kdWxlIH0gZnJvbSAncHJpbWVuZy9jaGVja2JveCc7XG5pbXBvcnQgeyBEcm9wZG93bk1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvZHJvcGRvd24nO1xuaW1wb3J0IHsgSW5wdXROdW1iZXJNb2R1bGUgfSBmcm9tICdwcmltZW5nL2lucHV0bnVtYmVyJztcbmltcG9ydCB7IFNlbGVjdEJ1dHRvbk1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvc2VsZWN0YnV0dG9uJztcbmltcG9ydCB7IFNsaWRlck1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvc2xpZGVyJztcblxuaW1wb3J0IHR5cGUgeyBJU3BhdGlhbENvbnRyb2xzIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3Zpc3VhbGl6ZXIuY29udHJhY3QnO1xuaW1wb3J0IHR5cGUgeyBTcGF0aWFsRGF0YXNldCB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9zcGF0aWFsLWRhdGFzZXQuY29udHJhY3QnO1xuaW1wb3J0IHsgREVGQVVMVF9TUEFUSUFMX1ZJRVcsIFNwYXRpYWxWaWV3U3RhdGUgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvZGlzcGxheS10eXBlcyc7XG5pbXBvcnQgeyBjZWxsc1Nob3duIH0gZnJvbSAnLi4vLi4vc3BhdGlhbC9zcGF0aWFsLXRpbGVzJztcbmltcG9ydCB7IFBhbmVsT3B0aW9uLCBkZW5zaXR5Q29sb3JCYXJDc3MsIHRpbGVPcHRpb25zIH0gZnJvbSAnLi4vLi4vc3BhdGlhbC9zcGF0aWFsLXBhbmVsLW1vZGVsJztcbmltcG9ydCB0eXBlIHsgR2VuZVBpY2tlck1vZGVsIH0gZnJvbSAnLi4vc3BhdGlhbC1nZW5lLXBpY2tlcic7XG5pbXBvcnQgeyBTcGF0aWFsR3JvdXBzUGFuZWxDb21wb25lbnQgfSBmcm9tICcuLi9zcGF0aWFsLWdyb3Vwcy1wYW5lbC9zcGF0aWFsLWdyb3Vwcy1wYW5lbC5jb21wb25lbnQnO1xuXG4vKipcbiAqIFRoZSBDZWxscyBzZWN0aW9uLCBhcyBYZW5pdW0gRXhwbG9yZXInczogdGhlIG91dGxpbmVzJyBvbi9vZmYgc3dpdGNoLCB3aGljaCBib3VuZGFyeSBzZXRcbiAqIGlzIGRyYXduLCBob3cgY2VsbHMgYXJlIGNvbG91cmVkICh3aXRoIHRoZSBnZW5lLCB0aGUgY29sb3VyLCBvciB0aGUgY29sb3VyIGJhciB0aGF0XG4gKiBnb2VzIHdpdGggaXQpLCB0aGUge0BsaW5rIFNwYXRpYWxHcm91cHNQYW5lbENvbXBvbmVudCBncm91cHN9LCBhbmQgaG93IGNlbGxzIGFyZSBkcmF3bi5cbiAqXG4gKiBXcml0ZXMgb25seSB0aHJvdWdoIGBjb250cm9scy5zZXRWaWV3U3RhdGVgLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzcGF0aWFsLWNlbGxzLXBhbmVsJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBDaGVja2JveE1vZHVsZSxcbiAgICBEcm9wZG93bk1vZHVsZSxcbiAgICBJbnB1dE51bWJlck1vZHVsZSxcbiAgICBTZWxlY3RCdXR0b25Nb2R1bGUsXG4gICAgU2xpZGVyTW9kdWxlLFxuICAgIFNwYXRpYWxHcm91cHNQYW5lbENvbXBvbmVudCxcbiAgXSxcbiAgdGVtcGxhdGVVcmw6ICcuL3NwYXRpYWwtY2VsbHMtcGFuZWwuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9zcGF0aWFsLWNlbGxzLXBhbmVsLmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBTcGF0aWFsQ2VsbHNQYW5lbENvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XG4gIC8qKiBUaGUgc3BhdGlhbCBjb250cm9scyB0aGlzIHBhbmVsIHJlYWRzIGFuZCB3cml0ZXMgdGhyb3VnaDsgbnVsbCB3aXRob3V0IGEgYFNQQVRJQUxfREFUQV9QT1JUYC4gKi9cbiAgQElucHV0KCkgY29udHJvbHM6IElTcGF0aWFsQ29udHJvbHMgfCBudWxsID0gbnVsbDtcbiAgLyoqIFRoZSBkYXRhc2V0IG9uIG9mZmVyLCBvciBudWxsLiAqL1xuICBASW5wdXQoKSBkYXRhc2V0OiBTcGF0aWFsRGF0YXNldCB8IG51bGwgPSBudWxsO1xuICAvKiogVGhlIGN1cnJlbnQgc3BhdGlhbCB2aWV3IHN0YXRlOiB3aGF0IGlzIGRyYXduLCBhbmQgaG93LiAqL1xuICBASW5wdXQoKSB2aWV3OiBTcGF0aWFsVmlld1N0YXRlID0gREVGQVVMVF9TUEFUSUFMX1ZJRVc7XG4gIC8qKiBUaGUgZ2VuZSBsaXN0IHRoZSBcIkdlbmUgRXhwcmVzc2lvblwiIGNvbG91cmluZyBwaWNrcyBmcm9tLCBzaGFyZWQgd2l0aCB0aGUgb3RoZXJcbiAgICogIGdlbmUgZHJvcGRvd25zLiAqL1xuICBASW5wdXQoKSBnZW5lczogR2VuZVBpY2tlck1vZGVsIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBUaGUgb2JzZXJ2YXRpb25zJyBjb250aW51b3VzIGNvbG91ciBiYXIsIHNob3duIGZvciB0aGUgZ2VuZSBjb2xvdXJpbmcgd2hpbGUgaXQgaGFzIG9uZS4gKi9cbiAgQElucHV0KCkgY29sb3JCYXJDc3M6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAvKiogV2hldGhlciB0aGUgc2VjdGlvbiBpcyBleHBhbmRlZC4gKi9cbiAgQElucHV0KCkgb3BlbiA9IHRydWU7XG4gIC8qKiBBc2tzIHRvIG9wZW4gb3IgY2xvc2UgaXQ7IHR3by13YXkgd2l0aCBgb3BlbmAuICovXG4gIEBPdXRwdXQoKSByZWFkb25seSBvcGVuQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gIC8qKiBWaXJ0dWFsLXNjcm9sbGVkIG9ubHkgcGFzdCB0aGlzIG1hbnkgb3B0aW9uczogdGhlIHNjcm9sbGVyIGVhcm5zIGl0cyBjb21wbGV4aXR5IGZvclxuICAgKiAgYSBmZXcgdGhvdXNhbmQgbmFtZXMsIGFuZCBmb3IgZWlnaHQgaXQgYWRkcyBvbmx5IG92ZXJoZWFkIOKAlCBhIHZpcnR1YWwgdmlld3BvcnQgdGhhdFxuICAgKiAgc2hvcnQgc3dhbGxvd3MgdGhlIGNsaWNrcyBpdCBpcyBtZWFudCB0byBmb3J3YXJkLiAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZ2VuZVZpcnR1YWxTY3JvbGxGcm9tID0gMjAwO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBjZWxsRHJhd09wdGlvbnM6IFBhbmVsT3B0aW9uPFNwYXRpYWxWaWV3U3RhdGVbJ2NlbGxEcmF3J10+W10gPSBbXG4gICAgeyBsYWJlbDogJ0ZpbGwnLCB2YWx1ZTogJ2ZpbGwnIH0sXG4gICAgeyBsYWJlbDogJ091dGxpbmUnLCB2YWx1ZTogJ291dGxpbmUnIH0sXG4gICAgeyBsYWJlbDogJ0JvdGgnLCB2YWx1ZTogJ2JvdGgnIH0sXG4gIF07XG5cbiAgLyoqXG4gICAqIE9wdGlvbiBsaXN0cyBmb3IgdGhlIGNlbGwgY29udHJvbHMuIEJ1aWx0IG9uY2UgcGVyIGRhdGFzZXQgcmF0aGVyIHRoYW4gaW4gZ2V0dGVyczogYVxuICAgKiBnZXR0ZXIgcmV0dXJucyBhIGZyZXNoIGFycmF5IG9uIGV2ZXJ5IGNoYW5nZS1kZXRlY3Rpb24gcGFzcywgYW5kIFByaW1lTkcgcmUtcmVuZGVyc1xuICAgKiBpdHMgYnV0dG9ucyB3aGVuZXZlciB0aGUgYXJyYXkgaWRlbnRpdHkgY2hhbmdlcyDigJQgd2hpY2ggbWFkZSB0aGVtIGltcG9zc2libGUgdG8gY2xpY2suXG4gICAqL1xuICBwcm90ZWN0ZWQgY2VsbFNldE9wdGlvbnM6IFBhbmVsT3B0aW9uPHN0cmluZz5bXSA9IFtdO1xuICAvKiogQ2VsbCBjb2xvdXIgbW9kZXMgb24gb2ZmZXIgKFhlbml1bSBFeHBsb3JlcidzIFwiQ2VsbCBDb2xvclwiKS4gKi9cbiAgcHJvdGVjdGVkIGNlbGxDb2xvck9wdGlvbnM6IFBhbmVsT3B0aW9uPFNwYXRpYWxWaWV3U3RhdGVbJ2NlbGxDb2xvck1vZGUnXT5bXSA9IFtdO1xuICAvKiogVGhlIGRlbnNpdHkgY29sb3VyIGJhciwgcmVidWlsdCBvbmx5IHdoZW4gaXRzIGNvbG9ybWFwIGNoYW5nZXMgKGEgMjU2LWVudHJ5IExVVCkuICovXG4gIHByb3RlY3RlZCBkZW5zaXR5Q29sb3JCYXJDc3MgPSAnJztcbiAgcHJpdmF0ZSBkZW5zaXR5QmFyRm9yOiBTcGF0aWFsVmlld1N0YXRlWydkZW5zaXR5Q29sb3JtYXAnXSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ2RhdGFzZXQnXSkge1xuICAgICAgY29uc3Qgb3B0aW9ucyA9IHRpbGVPcHRpb25zKHRoaXMuZGF0YXNldCk7XG4gICAgICB0aGlzLmNlbGxTZXRPcHRpb25zID0gb3B0aW9ucy5jZWxsU2V0T3B0aW9ucztcbiAgICAgIHRoaXMuY2VsbENvbG9yT3B0aW9ucyA9IG9wdGlvbnMuY2VsbENvbG9yT3B0aW9ucztcbiAgICB9XG4gICAgaWYgKHRoaXMuZGVuc2l0eUJhckZvciAhPT0gdGhpcy52aWV3LmRlbnNpdHlDb2xvcm1hcCB8fCAhdGhpcy5kZW5zaXR5Q29sb3JCYXJDc3MpIHtcbiAgICAgIHRoaXMuZGVuc2l0eUJhckZvciA9IHRoaXMudmlldy5kZW5zaXR5Q29sb3JtYXA7XG4gICAgICB0aGlzLmRlbnNpdHlDb2xvckJhckNzcyA9IGRlbnNpdHlDb2xvckJhckNzcyh0aGlzLnZpZXcuZGVuc2l0eUNvbG9ybWFwKTtcbiAgICB9XG4gIH1cblxuICAvKiogV2hldGhlciBvdXRsaW5lcyBhcmUgb24g4oCUIHRoZSBleHBsaWNpdCBjaG9pY2UsIG9yIGF1dG9tYXRpY2FsbHkgZm9yIGRhdGEgdGhhdCBoYXMgdGhlbS4gKi9cbiAgcHJvdGVjdGVkIGdldCBjZWxsc09uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBjZWxsc1Nob3duKHRoaXMuZGF0YXNldCwgdGhpcy52aWV3KTtcbiAgfVxuXG4gIC8qKiBUaGUgYm91bmRhcnkgc2V0IGRyYXduOiB0aGUgdmlldydzIGNob2ljZSwgZWxzZSB0aGUgZGF0YXNldCdzIGRlZmF1bHQsIGVsc2UgaXRzIGZpcnN0LiAqL1xuICBwcm90ZWN0ZWQgZ2V0IGFjdGl2ZUNlbGxTZXQoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgY29uc3QgdGlsZXMgPSB0aGlzLmRhdGFzZXQ/LnBvbHlnb25UaWxlcztcbiAgICByZXR1cm4gdGhpcy52aWV3LmNlbGxTZXQgPz8gdGlsZXM/LmRlZmF1bHRTZXQgPz8gdGlsZXM/LnNldHNbMF0/Lm5hbWUgPz8gbnVsbDtcbiAgfVxuXG4gIC8qKiBGaWxsIG9wYWNpdHkgYXMgYSAw4oCTMTAwIG51bWJlciwgZm9yIHRoZSBib3ggYmVzaWRlIHRoZSBzbGlkZXIuICovXG4gIHByb3RlY3RlZCBnZXQgY2VsbE9wYWNpdHlQZXJjZW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQodGhpcy52aWV3LmNlbGxPcGFjaXR5ICogMTAwKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvblNob3dDZWxscyhvbjogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuY29udHJvbHM/LnNldFZpZXdTdGF0ZSh7IHNob3dDZWxsczogb24gfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25DZWxsU2V0KHNldDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5jb250cm9scz8uc2V0Vmlld1N0YXRlKHsgY2VsbFNldDogc2V0IH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uQ2VsbERyYXcoZHJhdzogU3BhdGlhbFZpZXdTdGF0ZVsnY2VsbERyYXcnXSk6IHZvaWQge1xuICAgIHRoaXMuY29udHJvbHM/LnNldFZpZXdTdGF0ZSh7IGNlbGxEcmF3OiBkcmF3IH0pO1xuICB9XG5cbiAgLy8gUHJpbWVORydzIHNsaWRlciByZXBvcnRzIGBudW1iZXIgfCB1bmRlZmluZWRgOyBpZ25vcmUgdGhlIGVtcHR5IGNhc2UgcmF0aGVyIHRoYW5cbiAgLy8gd3JpdGluZyBgdW5kZWZpbmVkYCBpbnRvIHRoZSBzdG9yZS5cbiAgcHJvdGVjdGVkIG9uQ2VsbE9wYWNpdHkodmFsdWU6IG51bWJlciB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgdGhpcy5jb250cm9scz8uc2V0Vmlld1N0YXRlKHsgY2VsbE9wYWNpdHk6IHZhbHVlIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uQ2VsbE9wYWNpdHlQZXJjZW50KHY6IG51bWJlciB8IG51bGwpOiB2b2lkIHtcbiAgICBpZiAodiA9PT0gbnVsbCB8fCAhTnVtYmVyLmlzRmluaXRlKHYpKSByZXR1cm47XG4gICAgdGhpcy5jb250cm9scz8uc2V0Vmlld1N0YXRlKHsgY2VsbE9wYWNpdHk6IE1hdGgubWluKDEsIE1hdGgubWF4KDAuMDUsIHYgLyAxMDApKSB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkNlbGxDb2xvck1vZGUobW9kZTogU3BhdGlhbFZpZXdTdGF0ZVsnY2VsbENvbG9yTW9kZSddKTogdm9pZCB7XG4gICAgdGhpcy5jb250cm9scz8uc2V0Vmlld1N0YXRlKHsgY2VsbENvbG9yTW9kZTogbW9kZSB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkNlbGxDb2xvckdlbmUoZ2VuZTogc3RyaW5nIHwgbnVsbCk6IHZvaWQge1xuICAgIHRoaXMuY29udHJvbHM/LnNldFZpZXdTdGF0ZSh7IGNlbGxDb2xvckdlbmU6IGdlbmUgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25DZWxsU2luZ2xlQ29sb3IoaGV4OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmNvbnRyb2xzPy5zZXRWaWV3U3RhdGUoeyBjZWxsU2luZ2xlQ29sb3I6IGhleCB9KTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cInNjLXBhbmVsXCIgW2NsYXNzLm9wZW5dPVwib3BlblwiPlxuICA8ZGl2IGNsYXNzPVwic2MtcGFuZWwtaGVhZFwiIChjbGljayk9XCJvcGVuQ2hhbmdlLmVtaXQoIW9wZW4pXCI+XG4gICAgPHAtY2hlY2tib3hcbiAgICAgIFtiaW5hcnldPVwidHJ1ZVwiXG4gICAgICBbbmdNb2RlbF09XCJjZWxsc09uXCJcbiAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgKG9uQ2hhbmdlKT1cIm9uU2hvd0NlbGxzKCRldmVudC5jaGVja2VkKVwiXG4gICAgPjwvcC1jaGVja2JveD5cbiAgICA8c3BhbiBjbGFzcz1cInNjLXBhbmVsLXRpdGxlXCI+Q2VsbHM8L3NwYW4+XG4gICAgPGkgY2xhc3M9XCJwaVwiIFtjbGFzcy5waS1jaGV2cm9uLWRvd25dPVwib3BlblwiIFtjbGFzcy5waS1jaGV2cm9uLXJpZ2h0XT1cIiFvcGVuXCI+PC9pPlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cInNjLXBhbmVsLWJvZHlcIiAqbmdJZj1cIm9wZW5cIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY2VsbFNldE9wdGlvbnMubGVuZ3RoID4gMVwiPlxuICAgICAgPGRpdiBjbGFzcz1cInNjLXN1YmhlYWRcIj5Cb3VuZGFyaWVzPC9kaXY+XG4gICAgICA8cC1zZWxlY3RCdXR0b25cbiAgICAgICAgW29wdGlvbnNdPVwiY2VsbFNldE9wdGlvbnNcIlxuICAgICAgICBvcHRpb25MYWJlbD1cImxhYmVsXCJcbiAgICAgICAgb3B0aW9uVmFsdWU9XCJ2YWx1ZVwiXG4gICAgICAgIFtuZ01vZGVsXT1cImFjdGl2ZUNlbGxTZXRcIlxuICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvbkNlbGxTZXQoJGV2ZW50KVwiXG4gICAgICAgIFthbGxvd0VtcHR5XT1cImZhbHNlXCJcbiAgICAgICAgc3R5bGVDbGFzcz1cInNjLWJ1dHRvbnNcIlxuICAgICAgPjwvcC1zZWxlY3RCdXR0b24+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8ZGl2IGNsYXNzPVwic2Mtc3ViaGVhZFwiPkNvbG9yaW5nPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cInNjLXJvd1wiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJzYy1sYmxcIj5DZWxsIENvbG9yPC9zcGFuPlxuICAgICAgPHAtZHJvcGRvd25cbiAgICAgICAgW29wdGlvbnNdPVwiY2VsbENvbG9yT3B0aW9uc1wiXG4gICAgICAgIG9wdGlvbkxhYmVsPVwibGFiZWxcIlxuICAgICAgICBvcHRpb25WYWx1ZT1cInZhbHVlXCJcbiAgICAgICAgW25nTW9kZWxdPVwidmlldy5jZWxsQ29sb3JNb2RlXCJcbiAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25DZWxsQ29sb3JNb2RlKCRldmVudClcIlxuICAgICAgICBhcHBlbmRUbz1cImJvZHlcIlxuICAgICAgPjwvcC1kcm9wZG93bj5cbiAgICA8L2Rpdj5cbiAgICA8c21hbGwgY2xhc3M9XCJzYy1oaW50XCIgKm5nSWY9XCJ2aWV3LmNlbGxDb2xvck1vZGUgPT09ICdncm91cCdcIj5cbiAgICAgIEFkanVzdCBjZWxsIGNvbG9yIGluIHRoZSBncm91cHMgc2VjdGlvbiBiZWxvdy5cbiAgICA8L3NtYWxsPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJnZW5lcz8uc3RhdGUkIHwgYXN5bmMgYXMgZ2VuZVwiPlxuICAgICAgPGRpdiBjbGFzcz1cInNjLXJvd1wiICpuZ0lmPVwidmlldy5jZWxsQ29sb3JNb2RlID09PSAnZ2VuZScgJiYgZGF0YXNldD8uZmVhdHVyZXNcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJzYy1sYmxcIj5HZW5lPC9zcGFuPlxuICAgICAgICA8cC1kcm9wZG93blxuICAgICAgICAgIFtvcHRpb25zXT1cImdlbmUub3B0aW9uc1wiXG4gICAgICAgICAgb3B0aW9uTGFiZWw9XCJsYWJlbFwiXG4gICAgICAgICAgb3B0aW9uVmFsdWU9XCJ2YWx1ZVwiXG4gICAgICAgICAgW25nTW9kZWxdPVwidmlldy5jZWxsQ29sb3JHZW5lXCJcbiAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvbkNlbGxDb2xvckdlbmUoJGV2ZW50KVwiXG4gICAgICAgICAgW2ZpbHRlcl09XCJ0cnVlXCJcbiAgICAgICAgICBmaWx0ZXJCeT1cImxhYmVsXCJcbiAgICAgICAgICBbcmVzZXRGaWx0ZXJPbkhpZGVdPVwidHJ1ZVwiXG4gICAgICAgICAgKG9uRmlsdGVyKT1cImdlbmVzPy5vbkZpbHRlcigkZXZlbnQuZmlsdGVyKVwiXG4gICAgICAgICAgKG9uU2hvdyk9XCJnZW5lcz8uZW5zdXJlTGlzdCgpXCJcbiAgICAgICAgICBbdmlydHVhbFNjcm9sbF09XCJnZW5lLm9wdGlvbnMubGVuZ3RoID4gZ2VuZVZpcnR1YWxTY3JvbGxGcm9tXCJcbiAgICAgICAgICBbdmlydHVhbFNjcm9sbEl0ZW1TaXplXT1cIjMwXCJcbiAgICAgICAgICBhcHBlbmRUbz1cImJvZHlcIlxuICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VhcmNoIGdlbmVz4oCmXCJcbiAgICAgICAgPjwvcC1kcm9wZG93bj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxkaXYgY2xhc3M9XCJzYy1yb3dcIiAqbmdJZj1cInZpZXcuY2VsbENvbG9yTW9kZSA9PT0gJ3NpbmdsZSdcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwic2MtbGJsXCI+Q29sb3I8L3NwYW4+XG4gICAgICA8aW5wdXRcbiAgICAgICAgdHlwZT1cImNvbG9yXCJcbiAgICAgICAgY2xhc3M9XCJzYy1jb2xvci1pbnB1dFwiXG4gICAgICAgIFt2YWx1ZV09XCJ2aWV3LmNlbGxTaW5nbGVDb2xvclwiXG4gICAgICAgIChjaGFuZ2UpPVwib25DZWxsU2luZ2xlQ29sb3IoJGFueSgkZXZlbnQudGFyZ2V0KS52YWx1ZSlcIlxuICAgICAgLz5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2ICpuZ0lmPVwidmlldy5jZWxsQ29sb3JNb2RlID09PSAnZ2VuZScgfHwgdmlldy5jZWxsQ29sb3JNb2RlID09PSAndHJhbnNjcmlwdERlbnNpdHknXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwic2MtY29sb3JiYXJcIiBbc3R5bGUuYmFja2dyb3VuZF09XCJjb2xvckJhckNzcyB8fCBkZW5zaXR5Q29sb3JCYXJDc3NcIj48L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxzcGF0aWFsLWdyb3Vwcy1wYW5lbCBbY29udHJvbHNdPVwiY29udHJvbHNcIiBbZGF0YXNldF09XCJkYXRhc2V0XCIgW3ZpZXddPVwidmlld1wiPjwvc3BhdGlhbC1ncm91cHMtcGFuZWw+XG5cbiAgICA8ZGl2IGNsYXNzPVwic2Mtc3ViaGVhZFwiPlZpc2liaWxpdHk8L2Rpdj5cbiAgICA8c3BhbiBjbGFzcz1cInNjLWxibFwiPlZpZXcgY2VsbHMgYXM8L3NwYW4+XG4gICAgPHAtc2VsZWN0QnV0dG9uXG4gICAgICBbb3B0aW9uc109XCJjZWxsRHJhd09wdGlvbnNcIlxuICAgICAgb3B0aW9uTGFiZWw9XCJsYWJlbFwiXG4gICAgICBvcHRpb25WYWx1ZT1cInZhbHVlXCJcbiAgICAgIFtuZ01vZGVsXT1cInZpZXcuY2VsbERyYXdcIlxuICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25DZWxsRHJhdygkZXZlbnQpXCJcbiAgICAgIFthbGxvd0VtcHR5XT1cImZhbHNlXCJcbiAgICAgIHN0eWxlQ2xhc3M9XCJzYy1idXR0b25zXCJcbiAgICA+PC9wLXNlbGVjdEJ1dHRvbj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidmlldy5jZWxsRHJhdyAhPT0gJ291dGxpbmUnXCI+XG4gICAgICA8c3BhbiBjbGFzcz1cInNjLWxibFwiPkNlbGwgZmlsbCBvcGFjaXR5PC9zcGFuPlxuICAgICAgPGRpdiBjbGFzcz1cInNjLXJvdyBzYy1yb3ctbnVtYmVyXCI+XG4gICAgICAgIDxwLXNsaWRlclxuICAgICAgICAgIFtuZ01vZGVsXT1cInZpZXcuY2VsbE9wYWNpdHlcIlxuICAgICAgICAgIFttaW5dPVwiMC4wNVwiXG4gICAgICAgICAgW21heF09XCIxXCJcbiAgICAgICAgICBbc3RlcF09XCIwLjA1XCJcbiAgICAgICAgICAob25DaGFuZ2UpPVwib25DZWxsT3BhY2l0eSgkZXZlbnQudmFsdWUpXCJcbiAgICAgICAgPjwvcC1zbGlkZXI+XG4gICAgICAgIDxwLWlucHV0TnVtYmVyXG4gICAgICAgICAgW25nTW9kZWxdPVwiY2VsbE9wYWNpdHlQZXJjZW50XCJcbiAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvbkNlbGxPcGFjaXR5UGVyY2VudCgkZXZlbnQpXCJcbiAgICAgICAgICBbbWluXT1cIjVcIlxuICAgICAgICAgIFttYXhdPVwiMTAwXCJcbiAgICAgICAgICBbc2hvd0J1dHRvbnNdPVwiZmFsc2VcIlxuICAgICAgICAgIGlucHV0U3R5bGVDbGFzcz1cInNjLW51bVwiXG4gICAgICAgID48L3AtaW5wdXROdW1iZXI+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
|
|
187
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhdGlhbC1jZWxscy1wYW5lbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL3NwYXRpYWwtY29udHJvbHMvc3BhdGlhbC1jZWxscy1wYW5lbC9zcGF0aWFsLWNlbGxzLXBhbmVsLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvc3BhdGlhbC1jb250cm9scy9zcGF0aWFsLWNlbGxzLXBhbmVsL3NwYXRpYWwtY2VsbHMtcGFuZWwuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFFTCxNQUFNLEdBRVAsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDbEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDeEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzFELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUk5QyxPQUFPLEVBQUUsb0JBQW9CLEVBQW9CLE1BQU0sK0JBQStCLENBQUM7QUFDdkYsT0FBTyxFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUM5RCxPQUFPLEVBQWUsa0JBQWtCLEVBQUUsV0FBVyxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFFakcsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sd0RBQXdELENBQUM7Ozs7Ozs7Ozs7QUFFckc7Ozs7OztHQU1HO0FBbUJILE1BQU0sT0FBTywwQkFBMEI7SUFsQnZDO1FBbUJFLG9HQUFvRztRQUMzRixhQUFRLEdBQTRCLElBQUksQ0FBQztRQUNsRCxxQ0FBcUM7UUFDNUIsWUFBTyxHQUEwQixJQUFJLENBQUM7UUFDL0MsOERBQThEO1FBQ3JELFNBQUksR0FBcUIsb0JBQW9CLENBQUM7UUFDdkQ7OEJBQ3NCO1FBQ2IsVUFBSyxHQUEyQixJQUFJLENBQUM7UUFDOUMsOEZBQThGO1FBQ3JGLGdCQUFXLEdBQWtCLElBQUksQ0FBQztRQUMzQyx1Q0FBdUM7UUFDOUIsU0FBSSxHQUFHLElBQUksQ0FBQztRQUNyQixxREFBcUQ7UUFDbEMsZUFBVSxHQUFHLElBQUksWUFBWSxFQUFXLENBQUM7UUFFNUQ7O2dFQUV3RDtRQUNyQywwQkFBcUIsR0FBRyxHQUFHLENBQUM7UUFFNUIsb0JBQWUsR0FBZ0Q7WUFDaEYsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUU7WUFDaEMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUU7WUFDdEMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUU7U0FDakMsQ0FBQztRQUVGOzs7O1dBSUc7UUFDTyxtQkFBYyxHQUEwQixFQUFFLENBQUM7UUFDckQ7Ozs7V0FJRztRQUNPLGlCQUFZLEdBQXNDLEVBQUUsQ0FBQztRQUMvRCxtRUFBbUU7UUFDekQscUJBQWdCLEdBQXFELEVBQUUsQ0FBQztRQUNsRix3RkFBd0Y7UUFDOUUsdUJBQWtCLEdBQUcsRUFBRSxDQUFDO1FBQzFCLGtCQUFhLEdBQW9ELFNBQVMsQ0FBQztLQTRGcEY7SUExRkMsV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLElBQUksT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7WUFDdkIsTUFBTSxPQUFPLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUMxQyxJQUFJLENBQUMsY0FBYyxHQUFHLE9BQU8sQ0FBQyxjQUFjLENBQUM7WUFDN0MsSUFBSSxDQUFDLFlBQVksR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLFlBQVksRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLENBQUM7aUJBQzlELElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDcEUsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDeEQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQztRQUNuRCxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsYUFBYSxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDakYsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQztZQUMvQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsa0JBQWtCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUMxRSxDQUFDO0lBQ0gsQ0FBQztJQUVELDhGQUE4RjtJQUM5RixJQUFjLE9BQU87UUFDbkIsT0FBTyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVEO3lEQUNxRDtJQUNyRCxJQUFjLGFBQWE7UUFDekIsTUFBTSxLQUFLLEdBQUcsYUFBYSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsWUFBWSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDM0UsT0FBTyxLQUFLLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRUQscUVBQXFFO0lBQ3JFLElBQWMsa0JBQWtCO1FBQzlCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxHQUFHLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRVMsV0FBVyxDQUFDLEVBQVc7UUFDL0IsSUFBSSxDQUFDLFFBQVEsRUFBRSxZQUFZLENBQUMsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRVMsU0FBUyxDQUFDLEdBQVc7UUFDN0IsSUFBSSxDQUFDLFFBQVEsRUFBRSxZQUFZLENBQUMsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRUQsK0VBQStFO0lBQ3JFLFVBQVUsQ0FBQyxJQUFZO1FBQy9CLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQ2hDLE1BQU0sS0FBSyxHQUFHLGFBQWEsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLFlBQVksRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzNFLE9BQU8sS0FBSyxFQUFFLEdBQUcsS0FBSyxJQUFJLElBQUksS0FBSyxFQUFFLFVBQVUsS0FBSyxJQUFJLENBQUM7SUFDM0QsQ0FBQztJQUVEOzs7T0FHRztJQUNPLFVBQVUsQ0FBQyxJQUFZLEVBQUUsRUFBVztRQUM1QyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsRUFBRSxJQUFJLENBQUM7UUFDbkUsTUFBTSxPQUFPLEdBQUcsQ0FBQyxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2xELElBQUksRUFBRSxFQUFFLENBQUM7WUFDUCxJQUFJLENBQUMsUUFBUSxFQUFFLFlBQVksQ0FBQyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3JGLENBQUM7YUFBTSxJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxRQUFRLEVBQUUsWUFBWSxDQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDbEQsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsUUFBUSxFQUFFLFlBQVksQ0FBQyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ3BELENBQUM7SUFDSCxDQUFDO0lBRVMsVUFBVSxDQUFDLElBQWtDO1FBQ3JELElBQUksQ0FBQyxRQUFRLEVBQUUsWUFBWSxDQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVELG1GQUFtRjtJQUNuRixzQ0FBc0M7SUFDNUIsYUFBYSxDQUFDLEtBQXlCO1FBQy9DLElBQUksS0FBSyxLQUFLLFNBQVM7WUFBRSxPQUFPO1FBQ2hDLElBQUksQ0FBQyxRQUFRLEVBQUUsWUFBWSxDQUFDLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUVTLG9CQUFvQixDQUFDLENBQWdCO1FBQzdDLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBQUUsT0FBTztRQUM5QyxJQUFJLENBQUMsUUFBUSxFQUFFLFlBQVksQ0FBQyxFQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDckYsQ0FBQztJQUVTLGVBQWUsQ0FBQyxJQUF1QztRQUMvRCxJQUFJLENBQUMsUUFBUSxFQUFFLFlBQVksQ0FBQyxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFUyxlQUFlLENBQUMsSUFBbUI7UUFDM0MsSUFBSSxDQUFDLFFBQVEsRUFBRSxZQUFZLENBQUMsRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRVMsaUJBQWlCLENBQUMsR0FBVztRQUNyQyxJQUFJLENBQUMsUUFBUSxFQUFFLFlBQVksQ0FBQyxFQUFFLGVBQWUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQ3hELENBQUM7OEdBdklVLDBCQUEwQjtrR0FBMUIsMEJBQTBCLHlRQ25EdkMsazhJQXdIQSx5eEpEbkZJLFlBQVksb1RBQ1osV0FBVyw4VkFDWCxjQUFjLGdaQUNkLGNBQWMsdXRDQUNkLGlCQUFpQiw0UkFDakIsaUJBQWlCLHl2QkFDakIsa0JBQWtCLHdWQUNsQixZQUFZLGdTQUNaLDJCQUEyQjs7MkZBTWxCLDBCQUEwQjtrQkFsQnRDLFNBQVM7K0JBQ0UscUJBQXFCLGNBQ25CLElBQUksV0FDUDt3QkFDUCxZQUFZO3dCQUNaLFdBQVc7d0JBQ1gsY0FBYzt3QkFDZCxjQUFjO3dCQUNkLGlCQUFpQjt3QkFDakIsaUJBQWlCO3dCQUNqQixrQkFBa0I7d0JBQ2xCLFlBQVk7d0JBQ1osMkJBQTJCO3FCQUM1QixtQkFHZ0IsdUJBQXVCLENBQUMsTUFBTTs4QkFJdEMsUUFBUTtzQkFBaEIsS0FBSztnQkFFRyxPQUFPO3NCQUFmLEtBQUs7Z0JBRUcsSUFBSTtzQkFBWixLQUFLO2dCQUdHLEtBQUs7c0JBQWIsS0FBSztnQkFFRyxXQUFXO3NCQUFuQixLQUFLO2dCQUVHLElBQUk7c0JBQVosS0FBSztnQkFFYSxVQUFVO3NCQUE1QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZXMsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgQ2hlY2tib3hNb2R1bGUgfSBmcm9tICdwcmltZW5nL2NoZWNrYm94JztcbmltcG9ydCB7IElucHV0U3dpdGNoTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9pbnB1dHN3aXRjaCc7XG5pbXBvcnQgeyBEcm9wZG93bk1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvZHJvcGRvd24nO1xuaW1wb3J0IHsgSW5wdXROdW1iZXJNb2R1bGUgfSBmcm9tICdwcmltZW5nL2lucHV0bnVtYmVyJztcbmltcG9ydCB7IFNlbGVjdEJ1dHRvbk1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvc2VsZWN0YnV0dG9uJztcbmltcG9ydCB7IFNsaWRlck1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvc2xpZGVyJztcblxuaW1wb3J0IHR5cGUgeyBJU3BhdGlhbENvbnRyb2xzIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3Zpc3VhbGl6ZXIuY29udHJhY3QnO1xuaW1wb3J0IHR5cGUgeyBTcGF0aWFsRGF0YXNldCB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9zcGF0aWFsLWRhdGFzZXQuY29udHJhY3QnO1xuaW1wb3J0IHsgREVGQVVMVF9TUEFUSUFMX1ZJRVcsIFNwYXRpYWxWaWV3U3RhdGUgfSBmcm9tICcuLi8uLi9jb250cmFjdHMvZGlzcGxheS10eXBlcyc7XG5pbXBvcnQgeyBjZWxsc1Nob3duLCBkcmF3bkNlbGxTZXRzIH0gZnJvbSAnLi4vLi4vc3BhdGlhbC9sb2QnO1xuaW1wb3J0IHsgUGFuZWxPcHRpb24sIGRlbnNpdHlDb2xvckJhckNzcywgdGlsZU9wdGlvbnMgfSBmcm9tICcuLi8uLi9zcGF0aWFsL3NwYXRpYWwtcGFuZWwtbW9kZWwnO1xuaW1wb3J0IHR5cGUgeyBHZW5lUGlja2VyTW9kZWwgfSBmcm9tICcuLi9zcGF0aWFsLWdlbmUtcGlja2VyJztcbmltcG9ydCB7IFNwYXRpYWxHcm91cHNQYW5lbENvbXBvbmVudCB9IGZyb20gJy4uL3NwYXRpYWwtZ3JvdXBzLXBhbmVsL3NwYXRpYWwtZ3JvdXBzLXBhbmVsLmNvbXBvbmVudCc7XG5cbi8qKlxuICogVGhlIENlbGxzIHNlY3Rpb24sIGFzIFhlbml1bSBFeHBsb3JlcidzOiB0aGUgb3V0bGluZXMnIG9uL29mZiBzd2l0Y2gsIHdoaWNoIGJvdW5kYXJ5IHNldFxuICogaXMgZHJhd24sIGhvdyBjZWxscyBhcmUgY29sb3VyZWQgKHdpdGggdGhlIGdlbmUsIHRoZSBjb2xvdXIsIG9yIHRoZSBjb2xvdXIgYmFyIHRoYXRcbiAqIGdvZXMgd2l0aCBpdCksIHRoZSB7QGxpbmsgU3BhdGlhbEdyb3Vwc1BhbmVsQ29tcG9uZW50IGdyb3Vwc30sIGFuZCBob3cgY2VsbHMgYXJlIGRyYXduLlxuICpcbiAqIFdyaXRlcyBvbmx5IHRocm91Z2ggYGNvbnRyb2xzLnNldFZpZXdTdGF0ZWAuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3NwYXRpYWwtY2VsbHMtcGFuZWwnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIEZvcm1zTW9kdWxlLFxuICAgIENoZWNrYm94TW9kdWxlLFxuICAgIERyb3Bkb3duTW9kdWxlLFxuICAgIElucHV0U3dpdGNoTW9kdWxlLFxuICAgIElucHV0TnVtYmVyTW9kdWxlLFxuICAgIFNlbGVjdEJ1dHRvbk1vZHVsZSxcbiAgICBTbGlkZXJNb2R1bGUsXG4gICAgU3BhdGlhbEdyb3Vwc1BhbmVsQ29tcG9uZW50LFxuICBdLFxuICB0ZW1wbGF0ZVVybDogJy4vc3BhdGlhbC1jZWxscy1wYW5lbC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3NwYXRpYWwtY2VsbHMtcGFuZWwuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIFNwYXRpYWxDZWxsc1BhbmVsQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzIHtcbiAgLyoqIFRoZSBzcGF0aWFsIGNvbnRyb2xzIHRoaXMgcGFuZWwgcmVhZHMgYW5kIHdyaXRlcyB0aHJvdWdoOyBudWxsIHdpdGhvdXQgYSBgU1BBVElBTF9EQVRBX1BPUlRgLiAqL1xuICBASW5wdXQoKSBjb250cm9sczogSVNwYXRpYWxDb250cm9scyB8IG51bGwgPSBudWxsO1xuICAvKiogVGhlIGRhdGFzZXQgb24gb2ZmZXIsIG9yIG51bGwuICovXG4gIEBJbnB1dCgpIGRhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0IHwgbnVsbCA9IG51bGw7XG4gIC8qKiBUaGUgY3VycmVudCBzcGF0aWFsIHZpZXcgc3RhdGU6IHdoYXQgaXMgZHJhd24sIGFuZCBob3cuICovXG4gIEBJbnB1dCgpIHZpZXc6IFNwYXRpYWxWaWV3U3RhdGUgPSBERUZBVUxUX1NQQVRJQUxfVklFVztcbiAgLyoqIFRoZSBnZW5lIGxpc3QgdGhlIFwiR2VuZSBFeHByZXNzaW9uXCIgY29sb3VyaW5nIHBpY2tzIGZyb20sIHNoYXJlZCB3aXRoIHRoZSBvdGhlclxuICAgKiAgZ2VuZSBkcm9wZG93bnMuICovXG4gIEBJbnB1dCgpIGdlbmVzOiBHZW5lUGlja2VyTW9kZWwgfCBudWxsID0gbnVsbDtcbiAgLyoqIFRoZSBvYnNlcnZhdGlvbnMnIGNvbnRpbnVvdXMgY29sb3VyIGJhciwgc2hvd24gZm9yIHRoZSBnZW5lIGNvbG91cmluZyB3aGlsZSBpdCBoYXMgb25lLiAqL1xuICBASW5wdXQoKSBjb2xvckJhckNzczogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBXaGV0aGVyIHRoZSBzZWN0aW9uIGlzIGV4cGFuZGVkLiAqL1xuICBASW5wdXQoKSBvcGVuID0gdHJ1ZTtcbiAgLyoqIEFza3MgdG8gb3BlbiBvciBjbG9zZSBpdDsgdHdvLXdheSB3aXRoIGBvcGVuYC4gKi9cbiAgQE91dHB1dCgpIHJlYWRvbmx5IG9wZW5DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgLyoqIFZpcnR1YWwtc2Nyb2xsZWQgb25seSBwYXN0IHRoaXMgbWFueSBvcHRpb25zOiB0aGUgc2Nyb2xsZXIgZWFybnMgaXRzIGNvbXBsZXhpdHkgZm9yXG4gICAqICBhIGZldyB0aG91c2FuZCBuYW1lcywgYW5kIGZvciBlaWdodCBpdCBhZGRzIG9ubHkgb3ZlcmhlYWQg4oCUIGEgdmlydHVhbCB2aWV3cG9ydCB0aGF0XG4gICAqICBzaG9ydCBzd2FsbG93cyB0aGUgY2xpY2tzIGl0IGlzIG1lYW50IHRvIGZvcndhcmQuICovXG4gIHByb3RlY3RlZCByZWFkb25seSBnZW5lVmlydHVhbFNjcm9sbEZyb20gPSAyMDA7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGNlbGxEcmF3T3B0aW9uczogUGFuZWxPcHRpb248U3BhdGlhbFZpZXdTdGF0ZVsnY2VsbERyYXcnXT5bXSA9IFtcbiAgICB7IGxhYmVsOiAnRmlsbCcsIHZhbHVlOiAnZmlsbCcgfSxcbiAgICB7IGxhYmVsOiAnT3V0bGluZScsIHZhbHVlOiAnb3V0bGluZScgfSxcbiAgICB7IGxhYmVsOiAnQm90aCcsIHZhbHVlOiAnYm90aCcgfSxcbiAgXTtcblxuICAvKipcbiAgICogT3B0aW9uIGxpc3RzIGZvciB0aGUgY2VsbCBjb250cm9scy4gQnVpbHQgb25jZSBwZXIgZGF0YXNldCByYXRoZXIgdGhhbiBpbiBnZXR0ZXJzOiBhXG4gICAqIGdldHRlciByZXR1cm5zIGEgZnJlc2ggYXJyYXkgb24gZXZlcnkgY2hhbmdlLWRldGVjdGlvbiBwYXNzLCBhbmQgUHJpbWVORyByZS1yZW5kZXJzXG4gICAqIGl0cyBidXR0b25zIHdoZW5ldmVyIHRoZSBhcnJheSBpZGVudGl0eSBjaGFuZ2VzIOKAlCB3aGljaCBtYWRlIHRoZW0gaW1wb3NzaWJsZSB0byBjbGljay5cbiAgICovXG4gIHByb3RlY3RlZCBjZWxsU2V0T3B0aW9uczogUGFuZWxPcHRpb248c3RyaW5nPltdID0gW107XG4gIC8qKlxuICAgKiBUaGUgYm91bmRhcnkgc2V0cywgdGhlIGNlbGxzJyBmaXJzdCwgZWFjaCB3aXRoIGEgc3dpdGNoIHdoZW4gdGhlcmUgYXJlIGF0IG1vc3QgdHdvIChhc1xuICAgKiBDeXRvQ2FudmFzJ3MgXCJDZWxsIEJvdW5kYXJpZXNcIiBhbmQgXCJOdWNsZWFyIEJvdW5kYXJpZXNcIik6IGVpdGhlciwgYm90aCBvciBuZWl0aGVyIGRyYXduLlxuICAgKiBNb3JlIHNldHMga2VlcCB0aGUgb25lLW9mIGNob2ljZS5cbiAgICovXG4gIHByb3RlY3RlZCBib3VuZGFyeVNldHM6IHsgbmFtZTogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH1bXSA9IFtdO1xuICAvKiogQ2VsbCBjb2xvdXIgbW9kZXMgb24gb2ZmZXIgKFhlbml1bSBFeHBsb3JlcidzIFwiQ2VsbCBDb2xvclwiKS4gKi9cbiAgcHJvdGVjdGVkIGNlbGxDb2xvck9wdGlvbnM6IFBhbmVsT3B0aW9uPFNwYXRpYWxWaWV3U3RhdGVbJ2NlbGxDb2xvck1vZGUnXT5bXSA9IFtdO1xuICAvKiogVGhlIGRlbnNpdHkgY29sb3VyIGJhciwgcmVidWlsdCBvbmx5IHdoZW4gaXRzIGNvbG9ybWFwIGNoYW5nZXMgKGEgMjU2LWVudHJ5IExVVCkuICovXG4gIHByb3RlY3RlZCBkZW5zaXR5Q29sb3JCYXJDc3MgPSAnJztcbiAgcHJpdmF0ZSBkZW5zaXR5QmFyRm9yOiBTcGF0aWFsVmlld1N0YXRlWydkZW5zaXR5Q29sb3JtYXAnXSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ2RhdGFzZXQnXSkge1xuICAgICAgY29uc3Qgb3B0aW9ucyA9IHRpbGVPcHRpb25zKHRoaXMuZGF0YXNldCk7XG4gICAgICB0aGlzLmNlbGxTZXRPcHRpb25zID0gb3B0aW9ucy5jZWxsU2V0T3B0aW9ucztcbiAgICAgIHRoaXMuYm91bmRhcnlTZXRzID0gWy4uLih0aGlzLmRhdGFzZXQ/LnBvbHlnb25UaWxlcz8uc2V0cyA/PyBbXSldXG4gICAgICAgIC5zb3J0KChhLCBiKSA9PiAoYS5uYW1lID09PSAnY2VsbCcgPyAtMSA6IGIubmFtZSA9PT0gJ2NlbGwnID8gMSA6IDApKVxuICAgICAgICAubWFwKChzZXQpID0+ICh7IG5hbWU6IHNldC5uYW1lLCBsYWJlbDogc2V0LmxhYmVsIH0pKTtcbiAgICAgIHRoaXMuY2VsbENvbG9yT3B0aW9ucyA9IG9wdGlvbnMuY2VsbENvbG9yT3B0aW9ucztcbiAgICB9XG4gICAgaWYgKHRoaXMuZGVuc2l0eUJhckZvciAhPT0gdGhpcy52aWV3LmRlbnNpdHlDb2xvcm1hcCB8fCAhdGhpcy5kZW5zaXR5Q29sb3JCYXJDc3MpIHtcbiAgICAgIHRoaXMuZGVuc2l0eUJhckZvciA9IHRoaXMudmlldy5kZW5zaXR5Q29sb3JtYXA7XG4gICAgICB0aGlzLmRlbnNpdHlDb2xvckJhckNzcyA9IGRlbnNpdHlDb2xvckJhckNzcyh0aGlzLnZpZXcuZGVuc2l0eUNvbG9ybWFwKTtcbiAgICB9XG4gIH1cblxuICAvKiogV2hldGhlciBvdXRsaW5lcyBhcmUgb24g4oCUIHRoZSBleHBsaWNpdCBjaG9pY2UsIG9yIGF1dG9tYXRpY2FsbHkgZm9yIGRhdGEgdGhhdCBoYXMgdGhlbS4gKi9cbiAgcHJvdGVjdGVkIGdldCBjZWxsc09uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBjZWxsc1Nob3duKHRoaXMuZGF0YXNldCwgdGhpcy52aWV3KTtcbiAgfVxuXG4gIC8qKiBUaGUgYm91bmRhcnkgc2V0IGRyYXduLCBvciBcImJvdGhcIiwgYXMgdGhlIHJlbmRlcmVyIHJlc29sdmVzIHRoZSB2aWV3J3MgY2hvaWNlOiBhIHNldCB0aGlzXG4gICAqICBkYXRhc2V0IGhhcywgZWxzZSBpdHMgZGVmYXVsdCwgZWxzZSBpdHMgZmlyc3QuICovXG4gIHByb3RlY3RlZCBnZXQgYWN0aXZlQ2VsbFNldCgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBjb25zdCBkcmF3biA9IGRyYXduQ2VsbFNldHModGhpcy5kYXRhc2V0Py5wb2x5Z29uVGlsZXMsIHRoaXMudmlldy5jZWxsU2V0KTtcbiAgICByZXR1cm4gZHJhd24/Lm51Y2xldXNTZXQgPyAnYm90aCcgOiAoZHJhd24/LnNldCA/PyBudWxsKTtcbiAgfVxuXG4gIC8qKiBGaWxsIG9wYWNpdHkgYXMgYSAw4oCTMTAwIG51bWJlciwgZm9yIHRoZSBib3ggYmVzaWRlIHRoZSBzbGlkZXIuICovXG4gIHByb3RlY3RlZCBnZXQgY2VsbE9wYWNpdHlQZXJjZW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQodGhpcy52aWV3LmNlbGxPcGFjaXR5ICogMTAwKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvblNob3dDZWxscyhvbjogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuY29udHJvbHM/LnNldFZpZXdTdGF0ZSh7IHNob3dDZWxsczogb24gfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25DZWxsU2V0KHNldDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5jb250cm9scz8uc2V0Vmlld1N0YXRlKHsgY2VsbFNldDogc2V0IH0pO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgYm91bmRhcnkgc2V0IGBuYW1lYCBpcyBkcmF3bjogb3V0bGluZXMgb24sIGFuZCB0aGF0IHNldCBvciBib3RoLiAqL1xuICBwcm90ZWN0ZWQgYm91bmRhcnlPbihuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuY2VsbHNPbikgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IGRyYXduID0gZHJhd25DZWxsU2V0cyh0aGlzLmRhdGFzZXQ/LnBvbHlnb25UaWxlcywgdGhpcy52aWV3LmNlbGxTZXQpO1xuICAgIHJldHVybiBkcmF3bj8uc2V0ID09PSBuYW1lIHx8IGRyYXduPy5udWNsZXVzU2V0ID09PSBuYW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc2V0J3Mgc3dpdGNoOiBvbiBkcmF3cyBpdCB3aXRoIHRoZSBvdGhlciB3aGVuIHRoYXQgb25lIGlzIGRyYXduIChcImJvdGhcIiksIGVsc2UgYWxvbmU7XG4gICAqIG9mZiBsZWF2ZXMgdGhlIG90aGVyIGRyYXduLCBvciBubyBvdXRsaW5lcyBhdCBhbGwuXG4gICAqL1xuICBwcm90ZWN0ZWQgb25Cb3VuZGFyeShuYW1lOiBzdHJpbmcsIG9uOiBib29sZWFuKTogdm9pZCB7XG4gICAgY29uc3Qgb3RoZXIgPSB0aGlzLmJvdW5kYXJ5U2V0cy5maW5kKChzKSA9PiBzLm5hbWUgIT09IG5hbWUpPy5uYW1lO1xuICAgIGNvbnN0IG90aGVyT24gPSAhIW90aGVyICYmIHRoaXMuYm91bmRhcnlPbihvdGhlcik7XG4gICAgaWYgKG9uKSB7XG4gICAgICB0aGlzLmNvbnRyb2xzPy5zZXRWaWV3U3RhdGUoeyBzaG93Q2VsbHM6IHRydWUsIGNlbGxTZXQ6IG90aGVyT24gPyAnYm90aCcgOiBuYW1lIH0pO1xuICAgIH0gZWxzZSBpZiAob3RoZXJPbikge1xuICAgICAgdGhpcy5jb250cm9scz8uc2V0Vmlld1N0YXRlKHsgY2VsbFNldDogb3RoZXIgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29udHJvbHM/LnNldFZpZXdTdGF0ZSh7IHNob3dDZWxsczogZmFsc2UgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIG9uQ2VsbERyYXcoZHJhdzogU3BhdGlhbFZpZXdTdGF0ZVsnY2VsbERyYXcnXSk6IHZvaWQge1xuICAgIHRoaXMuY29udHJvbHM/LnNldFZpZXdTdGF0ZSh7IGNlbGxEcmF3OiBkcmF3IH0pO1xuICB9XG5cbiAgLy8gUHJpbWVORydzIHNsaWRlciByZXBvcnRzIGBudW1iZXIgfCB1bmRlZmluZWRgOyBpZ25vcmUgdGhlIGVtcHR5IGNhc2UgcmF0aGVyIHRoYW5cbiAgLy8gd3JpdGluZyBgdW5kZWZpbmVkYCBpbnRvIHRoZSBzdG9yZS5cbiAgcHJvdGVjdGVkIG9uQ2VsbE9wYWNpdHkodmFsdWU6IG51bWJlciB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgdGhpcy5jb250cm9scz8uc2V0Vmlld1N0YXRlKHsgY2VsbE9wYWNpdHk6IHZhbHVlIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uQ2VsbE9wYWNpdHlQZXJjZW50KHY6IG51bWJlciB8IG51bGwpOiB2b2lkIHtcbiAgICBpZiAodiA9PT0gbnVsbCB8fCAhTnVtYmVyLmlzRmluaXRlKHYpKSByZXR1cm47XG4gICAgdGhpcy5jb250cm9scz8uc2V0Vmlld1N0YXRlKHsgY2VsbE9wYWNpdHk6IE1hdGgubWluKDEsIE1hdGgubWF4KDAuMDUsIHYgLyAxMDApKSB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkNlbGxDb2xvck1vZGUobW9kZTogU3BhdGlhbFZpZXdTdGF0ZVsnY2VsbENvbG9yTW9kZSddKTogdm9pZCB7XG4gICAgdGhpcy5jb250cm9scz8uc2V0Vmlld1N0YXRlKHsgY2VsbENvbG9yTW9kZTogbW9kZSB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkNlbGxDb2xvckdlbmUoZ2VuZTogc3RyaW5nIHwgbnVsbCk6IHZvaWQge1xuICAgIHRoaXMuY29udHJvbHM/LnNldFZpZXdTdGF0ZSh7IGNlbGxDb2xvckdlbmU6IGdlbmUgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25DZWxsU2luZ2xlQ29sb3IoaGV4OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmNvbnRyb2xzPy5zZXRWaWV3U3RhdGUoeyBjZWxsU2luZ2xlQ29sb3I6IGhleCB9KTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cInNjLXBhbmVsXCIgW2NsYXNzLm9wZW5dPVwib3BlblwiPlxuICA8ZGl2IGNsYXNzPVwic2MtcGFuZWwtaGVhZFwiIChjbGljayk9XCJvcGVuQ2hhbmdlLmVtaXQoIW9wZW4pXCI+XG4gICAgPHAtY2hlY2tib3hcbiAgICAgIFtiaW5hcnldPVwidHJ1ZVwiXG4gICAgICBbbmdNb2RlbF09XCJjZWxsc09uXCJcbiAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgKG9uQ2hhbmdlKT1cIm9uU2hvd0NlbGxzKCRldmVudC5jaGVja2VkKVwiXG4gICAgPjwvcC1jaGVja2JveD5cbiAgICA8c3BhbiBjbGFzcz1cInNjLXBhbmVsLXRpdGxlXCI+Q2VsbHM8L3NwYW4+XG4gICAgPGkgY2xhc3M9XCJwaVwiIFtjbGFzcy5waS1jaGV2cm9uLWRvd25dPVwib3BlblwiIFtjbGFzcy5waS1jaGV2cm9uLXJpZ2h0XT1cIiFvcGVuXCI+PC9pPlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cInNjLXBhbmVsLWJvZHlcIiAqbmdJZj1cIm9wZW5cIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYm91bmRhcnlTZXRzLmxlbmd0aCAmJiBib3VuZGFyeVNldHMubGVuZ3RoIDw9IDJcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJzYy1zdWJoZWFkXCI+Qm91bmRhcmllczwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInNjLXJvd1wiICpuZ0Zvcj1cImxldCBzZXQgb2YgYm91bmRhcnlTZXRzXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwic2MtbGJsXCI+e3sgc2V0LmxhYmVsIH19PC9zcGFuPlxuICAgICAgICA8cC1pbnB1dFN3aXRjaFxuICAgICAgICAgIFtuZ01vZGVsXT1cImJvdW5kYXJ5T24oc2V0Lm5hbWUpXCJcbiAgICAgICAgICAob25DaGFuZ2UpPVwib25Cb3VuZGFyeShzZXQubmFtZSwgJGV2ZW50LmNoZWNrZWQpXCJcbiAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInNldC5sYWJlbFwiXG4gICAgICAgID48L3AtaW5wdXRTd2l0Y2g+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYm91bmRhcnlTZXRzLmxlbmd0aCA+IDJcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJzYy1zdWJoZWFkXCI+Qm91bmRhcmllczwvZGl2PlxuICAgICAgPHAtc2VsZWN0QnV0dG9uXG4gICAgICAgIFtvcHRpb25zXT1cImNlbGxTZXRPcHRpb25zXCJcbiAgICAgICAgb3B0aW9uTGFiZWw9XCJsYWJlbFwiXG4gICAgICAgIG9wdGlvblZhbHVlPVwidmFsdWVcIlxuICAgICAgICBbbmdNb2RlbF09XCJhY3RpdmVDZWxsU2V0XCJcbiAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25DZWxsU2V0KCRldmVudClcIlxuICAgICAgICBbYWxsb3dFbXB0eV09XCJmYWxzZVwiXG4gICAgICAgIHN0eWxlQ2xhc3M9XCJzYy1idXR0b25zXCJcbiAgICAgID48L3Atc2VsZWN0QnV0dG9uPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPGRpdiBjbGFzcz1cInNjLXN1YmhlYWRcIj5Db2xvcmluZzwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJzYy1yb3dcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwic2MtbGJsXCI+Q2VsbCBDb2xvcjwvc3Bhbj5cbiAgICAgIDxwLWRyb3Bkb3duXG4gICAgICAgIFtvcHRpb25zXT1cImNlbGxDb2xvck9wdGlvbnNcIlxuICAgICAgICBvcHRpb25MYWJlbD1cImxhYmVsXCJcbiAgICAgICAgb3B0aW9uVmFsdWU9XCJ2YWx1ZVwiXG4gICAgICAgIFtuZ01vZGVsXT1cInZpZXcuY2VsbENvbG9yTW9kZVwiXG4gICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uQ2VsbENvbG9yTW9kZSgkZXZlbnQpXCJcbiAgICAgICAgYXBwZW5kVG89XCJib2R5XCJcbiAgICAgID48L3AtZHJvcGRvd24+XG4gICAgPC9kaXY+XG4gICAgPHNtYWxsIGNsYXNzPVwic2MtaGludFwiICpuZ0lmPVwidmlldy5jZWxsQ29sb3JNb2RlID09PSAnZ3JvdXAnXCI+XG4gICAgICBBZGp1c3QgY2VsbCBjb2xvciBpbiB0aGUgZ3JvdXBzIHNlY3Rpb24gYmVsb3cuXG4gICAgPC9zbWFsbD5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ2VuZXM/LnN0YXRlJCB8IGFzeW5jIGFzIGdlbmVcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJzYy1yb3dcIiAqbmdJZj1cInZpZXcuY2VsbENvbG9yTW9kZSA9PT0gJ2dlbmUnICYmIGRhdGFzZXQ/LmZlYXR1cmVzXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwic2MtbGJsXCI+R2VuZTwvc3Bhbj5cbiAgICAgICAgPHAtZHJvcGRvd25cbiAgICAgICAgICBbb3B0aW9uc109XCJnZW5lLm9wdGlvbnNcIlxuICAgICAgICAgIG9wdGlvbkxhYmVsPVwibGFiZWxcIlxuICAgICAgICAgIG9wdGlvblZhbHVlPVwidmFsdWVcIlxuICAgICAgICAgIFtuZ01vZGVsXT1cInZpZXcuY2VsbENvbG9yR2VuZVwiXG4gICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25DZWxsQ29sb3JHZW5lKCRldmVudClcIlxuICAgICAgICAgIFtmaWx0ZXJdPVwidHJ1ZVwiXG4gICAgICAgICAgZmlsdGVyQnk9XCJsYWJlbFwiXG4gICAgICAgICAgW3Jlc2V0RmlsdGVyT25IaWRlXT1cInRydWVcIlxuICAgICAgICAgIChvbkZpbHRlcik9XCJnZW5lcz8ub25GaWx0ZXIoJGV2ZW50LmZpbHRlcilcIlxuICAgICAgICAgIChvblNob3cpPVwiZ2VuZXM/LmVuc3VyZUxpc3QoKVwiXG4gICAgICAgICAgW3ZpcnR1YWxTY3JvbGxdPVwiZ2VuZS5vcHRpb25zLmxlbmd0aCA+IGdlbmVWaXJ0dWFsU2Nyb2xsRnJvbVwiXG4gICAgICAgICAgW3ZpcnR1YWxTY3JvbGxJdGVtU2l6ZV09XCIzMFwiXG4gICAgICAgICAgYXBwZW5kVG89XCJib2R5XCJcbiAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlYXJjaCBnZW5lc+KAplwiXG4gICAgICAgID48L3AtZHJvcGRvd24+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8ZGl2IGNsYXNzPVwic2Mtcm93XCIgKm5nSWY9XCJ2aWV3LmNlbGxDb2xvck1vZGUgPT09ICdzaW5nbGUnXCI+XG4gICAgICA8c3BhbiBjbGFzcz1cInNjLWxibFwiPkNvbG9yPC9zcGFuPlxuICAgICAgPGlucHV0XG4gICAgICAgIHR5cGU9XCJjb2xvclwiXG4gICAgICAgIGNsYXNzPVwic2MtY29sb3ItaW5wdXRcIlxuICAgICAgICBbdmFsdWVdPVwidmlldy5jZWxsU2luZ2xlQ29sb3JcIlxuICAgICAgICAoY2hhbmdlKT1cIm9uQ2VsbFNpbmdsZUNvbG9yKCRhbnkoJGV2ZW50LnRhcmdldCkudmFsdWUpXCJcbiAgICAgIC8+XG4gICAgPC9kaXY+XG4gICAgPGRpdiAqbmdJZj1cInZpZXcuY2VsbENvbG9yTW9kZSA9PT0gJ2dlbmUnIHx8IHZpZXcuY2VsbENvbG9yTW9kZSA9PT0gJ3RyYW5zY3JpcHREZW5zaXR5J1wiPlxuICAgICAgPGRpdiBjbGFzcz1cInNjLWNvbG9yYmFyXCIgW3N0eWxlLmJhY2tncm91bmRdPVwiY29sb3JCYXJDc3MgfHwgZGVuc2l0eUNvbG9yQmFyQ3NzXCI+PC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8c3BhdGlhbC1ncm91cHMtcGFuZWwgW2NvbnRyb2xzXT1cImNvbnRyb2xzXCIgW2RhdGFzZXRdPVwiZGF0YXNldFwiIFt2aWV3XT1cInZpZXdcIj48L3NwYXRpYWwtZ3JvdXBzLXBhbmVsPlxuXG4gICAgPGRpdiBjbGFzcz1cInNjLXN1YmhlYWRcIj5WaXNpYmlsaXR5PC9kaXY+XG4gICAgPHNwYW4gY2xhc3M9XCJzYy1sYmxcIj5WaWV3IGNlbGxzIGFzPC9zcGFuPlxuICAgIDxwLXNlbGVjdEJ1dHRvblxuICAgICAgW29wdGlvbnNdPVwiY2VsbERyYXdPcHRpb25zXCJcbiAgICAgIG9wdGlvbkxhYmVsPVwibGFiZWxcIlxuICAgICAgb3B0aW9uVmFsdWU9XCJ2YWx1ZVwiXG4gICAgICBbbmdNb2RlbF09XCJ2aWV3LmNlbGxEcmF3XCJcbiAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uQ2VsbERyYXcoJGV2ZW50KVwiXG4gICAgICBbYWxsb3dFbXB0eV09XCJmYWxzZVwiXG4gICAgICBzdHlsZUNsYXNzPVwic2MtYnV0dG9uc1wiXG4gICAgPjwvcC1zZWxlY3RCdXR0b24+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInZpZXcuY2VsbERyYXcgIT09ICdvdXRsaW5lJ1wiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJzYy1sYmxcIj5DZWxsIGZpbGwgb3BhY2l0eTwvc3Bhbj5cbiAgICAgIDxkaXYgY2xhc3M9XCJzYy1yb3cgc2Mtcm93LW51bWJlclwiPlxuICAgICAgICA8cC1zbGlkZXJcbiAgICAgICAgICBbbmdNb2RlbF09XCJ2aWV3LmNlbGxPcGFjaXR5XCJcbiAgICAgICAgICBbbWluXT1cIjAuMDVcIlxuICAgICAgICAgIFttYXhdPVwiMVwiXG4gICAgICAgICAgW3N0ZXBdPVwiMC4wNVwiXG4gICAgICAgICAgKG9uQ2hhbmdlKT1cIm9uQ2VsbE9wYWNpdHkoJGV2ZW50LnZhbHVlKVwiXG4gICAgICAgID48L3Atc2xpZGVyPlxuICAgICAgICA8cC1pbnB1dE51bWJlclxuICAgICAgICAgIFtuZ01vZGVsXT1cImNlbGxPcGFjaXR5UGVyY2VudFwiXG4gICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25DZWxsT3BhY2l0eVBlcmNlbnQoJGV2ZW50KVwiXG4gICAgICAgICAgW21pbl09XCI1XCJcbiAgICAgICAgICBbbWF4XT1cIjEwMFwiXG4gICAgICAgICAgW3Nob3dCdXR0b25zXT1cImZhbHNlXCJcbiAgICAgICAgICBpbnB1dFN0eWxlQ2xhc3M9XCJzYy1udW1cIlxuICAgICAgICA+PC9wLWlucHV0TnVtYmVyPlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=
|