@jax-data-science/sci-image-visualizer 0.17.0 → 0.18.1
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/contracts/display-types.mjs +3 -2
- package/esm2022/lib/contracts/image.contract.mjs +1 -1
- package/esm2022/lib/contracts/ports/spatial-data.port.mjs +1 -1
- package/esm2022/lib/contracts/region-editor-api.contract.mjs +1 -1
- package/esm2022/lib/contracts/region-store.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/geometry/cell-meshes.mjs +37 -0
- package/esm2022/lib/geometry/place.mjs +47 -0
- package/esm2022/lib/implementations/napari-js/napari-camera-depth.mjs +93 -0
- package/esm2022/lib/implementations/napari-js/napari-loading-state.mjs +1 -1
- package/esm2022/lib/implementations/napari-js/napari-region-overlay.mjs +2 -2
- package/esm2022/lib/implementations/napari-js/napari-scene.mjs +1 -1
- package/esm2022/lib/implementations/napari-js/napari-spatial-2d-scene.mjs +81 -15
- package/esm2022/lib/implementations/napari-js/napari-spatial-3d-cells.mjs +746 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-3d-scene.mjs +325 -18
- package/esm2022/lib/implementations/napari-js/napari-spatial-3d-transcripts.mjs +182 -24
- package/esm2022/lib/implementations/napari-js/napari-spatial-hover.mjs +95 -5
- package/esm2022/lib/implementations/napari-js/napari-spatial-scene.mjs +15 -1
- package/esm2022/lib/implementations/napari-js/napari-spatial-tiles.mjs +30 -2
- package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +40 -1
- package/esm2022/lib/implementations/napari-js/napari-volume-region-meshes.mjs +111 -28
- package/esm2022/lib/implementations/napari-js/napari-volume-scene.mjs +14 -2
- package/esm2022/lib/implementations/napari-js/spatial-tiles/cell-layers.mjs +180 -48
- package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-layers.mjs +28 -8
- package/esm2022/lib/implementations/osd/osd-region-overlay.mjs +2 -2
- package/esm2022/lib/implementations/spatial-data-http/spatial-data-http.service.mjs +10 -1
- package/esm2022/lib/region-editor/class-tree/class-tree.component.mjs +30 -3
- package/esm2022/lib/region-editor/classes-panel/classes-panel.component.mjs +15 -3
- package/esm2022/lib/region-editor/region-editor.component.mjs +24 -4
- package/esm2022/lib/region-source/region-source-ops.mjs +7 -1
- package/esm2022/lib/region-source/region-tiles.mjs +1 -1
- package/esm2022/lib/region-source/worker-region-source.mjs +24 -1
- package/esm2022/lib/routing-visualizer.service.mjs +404 -7
- package/esm2022/lib/spatial/observations-in-selection.mjs +83 -0
- package/esm2022/lib/spatial/plane-cells.mjs +119 -0
- package/esm2022/lib/spatial/spatial-controls.facade.mjs +298 -5
- package/esm2022/lib/spatial/spatial-encoding.mjs +35 -3
- package/esm2022/lib/spatial/spatial-hover.mjs +34 -1
- package/esm2022/lib/spatial/spatial-planes.mjs +49 -0
- package/esm2022/lib/spatial/spatial-selection.mjs +2 -2
- package/esm2022/lib/spatial/spatial-tile-merge.mjs +38 -1
- package/esm2022/lib/spatial/transcripts-in-selection.mjs +208 -0
- package/esm2022/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.mjs +42 -65
- package/esm2022/lib/spatial-controls/spatial-color-by/spatial-color-by.component.mjs +187 -0
- package/esm2022/lib/spatial-controls/spatial-controls.component.mjs +47 -12
- package/esm2022/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.mjs +3 -3
- package/esm2022/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.mjs +38 -10
- 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 +79 -57
- package/esm2022/lib/spatial-controls/spatial-selection-observations/spatial-selection-observations.component.mjs +101 -0
- package/esm2022/lib/spatial-controls/spatial-selection-transcripts/spatial-selection-transcripts.component.mjs +94 -0
- package/esm2022/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.mjs +9 -3
- package/esm2022/lib/store/region-source-scope.mjs +10 -1
- package/esm2022/lib/store/region-store.service.mjs +33 -2
- package/esm2022/lib/toolbar/toolbar.component.mjs +10 -3
- package/esm2022/lib/visualizer/spatial-region-set.mjs +95 -0
- package/esm2022/lib/visualizer.component.mjs +40 -4
- package/fesm2022/{jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-DHrHO2ay.mjs → jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-YrNqv8wH.mjs} +4521 -759
- package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-YrNqv8wH.mjs.map +1 -0
- package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-CKEUwNta.mjs → jax-data-science-sci-image-visualizer-onnx-sam-session-Dph35S7m.mjs} +2 -2
- package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-CKEUwNta.mjs.map → jax-data-science-sci-image-visualizer-onnx-sam-session-Dph35S7m.mjs.map} +1 -1
- package/fesm2022/jax-data-science-sci-image-visualizer.mjs +1 -1
- package/fesm2022/region-source.worker.js +84 -2
- package/lib/contracts/display-types.d.ts +90 -4
- package/lib/contracts/image.contract.d.ts +6 -0
- package/lib/contracts/ports/spatial-data.port.d.ts +7 -0
- package/lib/contracts/region-editor-api.contract.d.ts +9 -0
- package/lib/contracts/region-store.contract.d.ts +6 -0
- package/lib/contracts/spatial-dataset.contract.d.ts +7 -1
- package/lib/contracts/visualizer.contract.d.ts +43 -1
- package/lib/geometry/cell-meshes.d.ts +27 -0
- package/lib/geometry/place.d.ts +45 -0
- package/lib/implementations/napari-js/napari-camera-depth.d.ts +23 -0
- package/lib/implementations/napari-js/napari-loading-state.d.ts +1 -1
- package/lib/implementations/napari-js/napari-scene.d.ts +12 -0
- package/lib/implementations/napari-js/napari-spatial-2d-scene.d.ts +19 -3
- package/lib/implementations/napari-js/napari-spatial-3d-cells.d.ts +141 -0
- package/lib/implementations/napari-js/napari-spatial-3d-scene.d.ts +87 -0
- package/lib/implementations/napari-js/napari-spatial-3d-transcripts.d.ts +49 -8
- package/lib/implementations/napari-js/napari-spatial-hover.d.ts +22 -0
- package/lib/implementations/napari-js/napari-spatial-scene.d.ts +12 -0
- package/lib/implementations/napari-js/napari-spatial-tiles.d.ts +15 -0
- package/lib/implementations/napari-js/napari-visualizer.service.d.ts +27 -1
- package/lib/implementations/napari-js/napari-volume-region-meshes.d.ts +38 -19
- package/lib/implementations/napari-js/napari-volume-scene.d.ts +2 -0
- package/lib/implementations/napari-js/spatial-tiles/cell-layers.d.ts +53 -0
- package/lib/implementations/napari-js/spatial-tiles/transcript-layers.d.ts +11 -2
- package/lib/implementations/spatial-data-http/spatial-data-http.service.d.ts +7 -0
- package/lib/region-editor/class-tree/class-tree.component.d.ts +16 -1
- package/lib/region-editor/classes-panel/classes-panel.component.d.ts +10 -1
- package/lib/region-editor/region-editor.component.d.ts +4 -0
- package/lib/region-source/region-source-ops.d.ts +12 -0
- package/lib/region-source/region-tiles.d.ts +8 -0
- package/lib/region-source/worker-region-source.d.ts +18 -0
- package/lib/routing-visualizer.service.d.ts +140 -1
- package/lib/spatial/observations-in-selection.d.ts +43 -0
- package/lib/spatial/plane-cells.d.ts +37 -0
- package/lib/spatial/spatial-controls.facade.d.ts +59 -0
- package/lib/spatial/spatial-encoding.d.ts +14 -1
- package/lib/spatial/spatial-hover.d.ts +23 -0
- package/lib/spatial/spatial-planes.d.ts +22 -0
- package/lib/spatial/spatial-selection.d.ts +2 -1
- package/lib/spatial/spatial-tile-merge.d.ts +9 -0
- package/lib/spatial/transcripts-in-selection.d.ts +95 -0
- package/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.d.ts +19 -28
- package/lib/spatial-controls/spatial-color-by/spatial-color-by.component.d.ts +64 -0
- package/lib/spatial-controls/spatial-controls.component.d.ts +17 -2
- package/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.d.ts +16 -6
- package/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.d.ts +26 -23
- package/lib/spatial-controls/spatial-selection-observations/spatial-selection-observations.component.d.ts +48 -0
- package/lib/spatial-controls/spatial-selection-transcripts/spatial-selection-transcripts.component.d.ts +43 -0
- package/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.d.ts +3 -1
- package/lib/store/region-source-scope.d.ts +4 -0
- package/lib/store/region-store.service.d.ts +21 -0
- package/lib/toolbar/toolbar.component.d.ts +6 -1
- package/lib/visualizer/spatial-region-set.d.ts +55 -0
- package/lib/visualizer.component.d.ts +14 -0
- package/package.json +1 -1
- package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-DHrHO2ay.mjs.map +0 -1
|
@@ -45,6 +45,12 @@ export class ClassesPanelComponent {
|
|
|
45
45
|
this.volume = false;
|
|
46
46
|
/** The classes shown in 3D. */
|
|
47
47
|
this.shown3d = new Set();
|
|
48
|
+
/** Classes that can be drawn as individual cells here (a 3D segmentation's, in spatial 3D). */
|
|
49
|
+
this.cellable = new Set();
|
|
50
|
+
/** Those drawn as individual cells now. */
|
|
51
|
+
this.individual = new Set();
|
|
52
|
+
/** Draw a class (its subclasses with it) as individual cells, or merged again. */
|
|
53
|
+
this.toggleCells = new EventEmitter();
|
|
48
54
|
/** The classes hidden from view. */
|
|
49
55
|
this.hidden = new Set();
|
|
50
56
|
/** A class's eye (its name): hide it, or show it again. */
|
|
@@ -116,11 +122,11 @@ export class ClassesPanelComponent {
|
|
|
116
122
|
return inUse ? `Remove class — its regions revert to ${this.defaultClassName}` : 'Remove class';
|
|
117
123
|
}
|
|
118
124
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: ClassesPanelComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
119
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.9", type: ClassesPanelComponent, isStandalone: true, selector: "region-classes-panel", inputs: { classes: "classes", counts: "counts", matchMode: "matchMode", activeClass: "activeClass", picked: "picked", marked: "marked", selectedCount: "selectedCount", defaultClassName: "defaultClassName", volume: "volume", shown3d: "shown3d", hidden: "hidden", treeView: "treeView" }, outputs: { toggleHidden: "toggleHidden", toggle3d: "toggle3d", treeViewChange: "treeViewChange", pick: "pick", recolor: "recolor", remove: "remove", manage: "manage" }, usesOnChanges: true, ngImport: i0, template: "<!-- Docked \"Classes\" panel (jit-ui#70): the always-visible list of annotation\n classes above the regions table. Click a row to make it the active class\n (new regions inherit it; with rows selected it re-classifies them); recolour\n via the swatch; the badge shows how many regions use the class. \"Manage\"\n opens the full editor (fallback palette, auto-add, matching, import/export).\n A region set with a class hierarchy (an atlas ontology) can show its classes\n as a tree instead (projected in by the editor); the header switches views. -->\n<div class=\"classes-panel\">\n <div class=\"classes-panel-header\">\n <span class=\"classes-panel-title\">Classes</span>\n <button\n *ngIf=\"treeView !== null\"\n pButton\n type=\"button\"\n [icon]=\"treeView ? 'pi pi-list' : 'pi pi-sitemap'\"\n class=\"p-button-sm p-button-text\"\n [pTooltip]=\"treeView ? 'Show the classes as a list' : 'Show the classes as a tree'\"\n tooltipPosition=\"bottom\"\n [attr.aria-label]=\"treeView ? 'Show the classes as a list' : 'Show the classes as a tree'\"\n (click)=\"treeViewChange.emit(!treeView)\"\n ></button>\n <button\n pButton\n type=\"button\"\n icon=\"pi pi-cog\"\n label=\"Manage\"\n class=\"p-button-sm p-button-text\"\n pTooltip=\"Manage classes \u2014 add / remove, palette, matching, import/export\"\n tooltipPosition=\"bottom\"\n (click)=\"manage.emit()\"\n ></button>\n </div>\n <ng-container *ngIf=\"treeView; else list\"><ng-content></ng-content></ng-container>\n <ng-template #list>\n <input\n *ngIf=\"classes.length\"\n type=\"text\"\n pInputText\n class=\"p-inputtext-sm classes-search\"\n placeholder=\"Search by name\"\n aria-label=\"Search the classes\"\n [ngModel]=\"query\"\n (ngModelChange)=\"onQuery($event)\"\n (keydown.enter)=\"pickFirstMatch()\"\n />\n <div class=\"classes-panel-body\">\n <div\n *ngFor=\"let c of shownRows; trackBy: trackByName\"\n class=\"class-row\"\n [class.active]=\"activeClass === c.name\"\n [class.picked]=\"picked === c.name\"\n [class.marked]=\"marked.has(c.name)\"\n [class.hidden-class]=\"hidden.has(c.name)\"\n (click)=\"pick.emit(c.name)\"\n [pTooltip]=\"c.rowTooltip\"\n tooltipPosition=\"bottom\"\n >\n <i\n class=\"pi row-eye\"\n [ngClass]=\"hidden.has(c.name) ? 'pi-eye-slash' : 'pi-eye'\"\n role=\"button\"\n [attr.aria-pressed]=\"!hidden.has(c.name)\"\n [attr.aria-label]=\"(hidden.has(c.name) ? 'Show ' : 'Hide ') + c.name\"\n [pTooltip]=\"hidden.has(c.name) ? 'Show this class' : 'Hide this class'\"\n tooltipPosition=\"bottom\"\n (click)=\"$event.stopPropagation(); toggleHidden.emit(c.name)\"\n ></i>\n <span class=\"row-swatch\" (click)=\"$event.stopPropagation()\">\n <hex-color-picker [color]=\"c.color\" (colorChange)=\"recolor.emit({ name: c.name, color: $event })\">\n </hex-color-picker>\n </span>\n <span class=\"row-name\">{{ c.name }}</span>\n <span class=\"row-count\" [class.zero]=\"c.count === 0\">{{ c.count }}</span>\n <i\n *ngIf=\"volume\"\n class=\"pi pi-box row-3d\"\n [class.on]=\"shown3d.has(c.name)\"\n role=\"button\"\n [attr.aria-pressed]=\"shown3d.has(c.name)\"\n [attr.aria-label]=\"'Show ' + c.name + ' in 3D'\"\n pTooltip=\"Show in the volume, in 3D\"\n tooltipPosition=\"bottom\"\n (click)=\"$event.stopPropagation(); toggle3d.emit(c.name)\"\n ></i>\n <button\n pButton\n type=\"button\"\n icon=\"pi pi-trash\"\n class=\"p-button-sm p-button-text p-button-warning row-del\"\n [disabled]=\"!c.canRemove\"\n [pTooltip]=\"c.removeTooltip\"\n tooltipPosition=\"bottom\"\n [attr.aria-label]=\"'Remove class ' + c.name\"\n (click)=\"$event.stopPropagation(); remove.emit(c.name)\"\n ></button>\n </div>\n <div *ngIf=\"!classes.length\" class=\"classes-empty\">No classes yet \u2014 add one from Manage.</div>\n <div *ngIf=\"classes.length && !shownRows.length\" class=\"classes-empty\">No class matches.</div>\n </div>\n </ng-template>\n</div>\n", styles: ["@charset \"UTF-8\";:host{display:block;flex:0 0 auto}.classes-panel{display:flex;flex-direction:column;flex:0 0 auto;border-bottom:1px solid var(--surface-border)}.classes-panel-header{display:flex;align-items:center;gap:.35rem;padding:.35rem .5rem;border-bottom:1px solid var(--surface-border)}.classes-panel-title{font-size:.75rem;font-weight:600;letter-spacing:.03em;text-transform:uppercase;color:var(--text-color-secondary);margin-right:auto}.classes-search{margin:.25rem .5rem}.classes-panel-body{height:7rem;min-height:2.5rem;max-height:60vh;overflow-x:hidden;overflow-y:auto;resize:vertical}::ng-deep region-classes-panel .classes-panel-body .hex-picker-swatch{width:1.25rem;height:1.25rem;border-width:1px}.class-row{display:flex;align-items:center;gap:.5rem;padding:.1rem .5rem;cursor:pointer;border-left:3px solid transparent}.class-row:hover{background:var(--surface-hover, rgba(0, 0, 0, .04))}.class-row.picked{background:var(--highlight-bg, rgba(51, 153, 255, .12))}.class-row.marked{box-shadow:inset 3px 0 0 var(--primary-color)}.class-row.active{background:var(--highlight-bg, rgba(51, 153, 255, .12));border-left-color:var(--primary-color)}.class-row .row-swatch{flex:0 0 auto;display:inline-flex}.class-row .row-name{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:.85rem}.class-row.active .row-name{color:var(--primary-color);font-weight:600}.class-row .row-count{flex:0 0 auto;min-width:1.5rem;text-align:center;font-size:.72rem;font-variant-numeric:tabular-nums;color:var(--text-color-secondary);background:var(--surface-200, rgba(0, 0, 0, .06));border-radius:10px;padding:0 .4rem}.class-row .row-count.zero{opacity:.5}.class-row .row-del{flex:0 0 auto}.classes-empty{font-size:.8rem;color:var(--text-color-secondary);padding:.5rem}::ng-deep region-classes-panel .classes-panel-body .class-row .p-button.p-button-icon-only{width:1.75rem;height:1.75rem;padding:0}.class-row .row-3d{flex:0 0 auto;font-size:.8rem;opacity:.35;cursor:pointer}.class-row .row-3d:hover{opacity:.8}.class-row .row-3d.on{opacity:1;color:var(--primary-color)}.class-row .row-eye{flex:0 0 auto;font-size:.8rem;opacity:.4;cursor:pointer}.class-row .row-eye:hover{opacity:.9}.class-row.hidden-class .row-eye{opacity:1}.class-row.hidden-class .row-swatch,.class-row.hidden-class .row-name,.class-row.hidden-class .row-count{opacity:.45}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { 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: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { 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: ButtonModule }, { kind: "directive", type: i3.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading", "severity", "raised", "rounded", "text", "outlined", "size", "plain"] }, { kind: "ngmodule", type: InputTextModule }, { kind: "directive", type: i4.InputText, selector: "[pInputText]", inputs: ["variant"] }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i5.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "component", type: HexColorPickerComponent, selector: "hex-color-picker", inputs: ["color"], outputs: ["colorChange", "colorInput"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
125
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.9", type: ClassesPanelComponent, isStandalone: true, selector: "region-classes-panel", inputs: { classes: "classes", counts: "counts", matchMode: "matchMode", activeClass: "activeClass", picked: "picked", marked: "marked", selectedCount: "selectedCount", defaultClassName: "defaultClassName", volume: "volume", shown3d: "shown3d", cellable: "cellable", individual: "individual", hidden: "hidden", treeView: "treeView" }, outputs: { toggleCells: "toggleCells", toggleHidden: "toggleHidden", toggle3d: "toggle3d", treeViewChange: "treeViewChange", pick: "pick", recolor: "recolor", remove: "remove", manage: "manage" }, usesOnChanges: true, ngImport: i0, template: "<!-- Docked \"Classes\" panel (jit-ui#70): the always-visible list of annotation\n classes above the regions table. Click a row to make it the active class\n (new regions inherit it; with rows selected it re-classifies them); recolour\n via the swatch; the badge shows how many regions use the class. \"Manage\"\n opens the full editor (fallback palette, auto-add, matching, import/export).\n A region set with a class hierarchy (an atlas ontology) can show its classes\n as a tree instead (projected in by the editor); the header switches views. -->\n<div class=\"classes-panel\">\n <div class=\"classes-panel-header\">\n <span class=\"classes-panel-title\">Classes</span>\n <button\n *ngIf=\"treeView !== null\"\n pButton\n type=\"button\"\n [icon]=\"treeView ? 'pi pi-list' : 'pi pi-sitemap'\"\n class=\"p-button-sm p-button-text\"\n [pTooltip]=\"treeView ? 'Show the classes as a list' : 'Show the classes as a tree'\"\n tooltipPosition=\"bottom\"\n [attr.aria-label]=\"treeView ? 'Show the classes as a list' : 'Show the classes as a tree'\"\n (click)=\"treeViewChange.emit(!treeView)\"\n ></button>\n <button\n pButton\n type=\"button\"\n icon=\"pi pi-cog\"\n label=\"Manage\"\n class=\"p-button-sm p-button-text\"\n pTooltip=\"Manage classes \u2014 add / remove, palette, matching, import/export\"\n tooltipPosition=\"bottom\"\n (click)=\"manage.emit()\"\n ></button>\n </div>\n <ng-container *ngIf=\"treeView; else list\"><ng-content></ng-content></ng-container>\n <ng-template #list>\n <input\n *ngIf=\"classes.length\"\n type=\"text\"\n pInputText\n class=\"p-inputtext-sm classes-search\"\n placeholder=\"Search by name\"\n aria-label=\"Search the classes\"\n [ngModel]=\"query\"\n (ngModelChange)=\"onQuery($event)\"\n (keydown.enter)=\"pickFirstMatch()\"\n />\n <div class=\"classes-panel-body\">\n <div\n *ngFor=\"let c of shownRows; trackBy: trackByName\"\n class=\"class-row\"\n [class.active]=\"activeClass === c.name\"\n [class.picked]=\"picked === c.name\"\n [class.marked]=\"marked.has(c.name)\"\n [class.hidden-class]=\"hidden.has(c.name)\"\n (click)=\"pick.emit(c.name)\"\n [pTooltip]=\"c.rowTooltip\"\n tooltipPosition=\"bottom\"\n >\n <i\n class=\"pi row-eye\"\n [ngClass]=\"hidden.has(c.name) ? 'pi-eye-slash' : 'pi-eye'\"\n role=\"button\"\n [attr.aria-pressed]=\"!hidden.has(c.name)\"\n [attr.aria-label]=\"(hidden.has(c.name) ? 'Show ' : 'Hide ') + c.name\"\n [pTooltip]=\"hidden.has(c.name) ? 'Show this class' : 'Hide this class'\"\n tooltipPosition=\"bottom\"\n (click)=\"$event.stopPropagation(); toggleHidden.emit(c.name)\"\n ></i>\n <span class=\"row-swatch\" (click)=\"$event.stopPropagation()\">\n <hex-color-picker [color]=\"c.color\" (colorChange)=\"recolor.emit({ name: c.name, color: $event })\">\n </hex-color-picker>\n </span>\n <span class=\"row-name\">{{ c.name }}</span>\n <span class=\"row-count\" [class.zero]=\"c.count === 0\">{{ c.count }}</span>\n <i\n *ngIf=\"volume\"\n class=\"pi pi-box row-3d\"\n [class.on]=\"shown3d.has(c.name)\"\n role=\"button\"\n [attr.aria-pressed]=\"shown3d.has(c.name)\"\n [attr.aria-label]=\"'Show ' + c.name + ' in 3D'\"\n pTooltip=\"Show in the volume, in 3D\"\n tooltipPosition=\"bottom\"\n (click)=\"$event.stopPropagation(); toggle3d.emit(c.name)\"\n ></i>\n <i\n *ngIf=\"volume && cellable.has(c.name)\"\n class=\"pi pi-th-large row-3d row-cells\"\n [class.on]=\"individual.has(c.name)\"\n role=\"button\"\n [attr.aria-pressed]=\"individual.has(c.name)\"\n [attr.aria-label]=\"'Show ' + c.name + ' as individual cells'\"\n [pTooltip]=\"individual.has(c.name) ? 'Show as one surface' : 'Show each cell by itself'\"\n tooltipPosition=\"bottom\"\n (click)=\"\n $event.stopPropagation(); toggleCells.emit({ classes: [c.name], individual: !individual.has(c.name) })\n \"\n ></i>\n <button\n pButton\n type=\"button\"\n icon=\"pi pi-trash\"\n class=\"p-button-sm p-button-text p-button-warning row-del\"\n [disabled]=\"!c.canRemove\"\n [pTooltip]=\"c.removeTooltip\"\n tooltipPosition=\"bottom\"\n [attr.aria-label]=\"'Remove class ' + c.name\"\n (click)=\"$event.stopPropagation(); remove.emit(c.name)\"\n ></button>\n </div>\n <div *ngIf=\"!classes.length\" class=\"classes-empty\">No classes yet \u2014 add one from Manage.</div>\n <div *ngIf=\"classes.length && !shownRows.length\" class=\"classes-empty\">No class matches.</div>\n </div>\n </ng-template>\n</div>\n", styles: ["@charset \"UTF-8\";:host{display:block;flex:0 0 auto}.classes-panel{display:flex;flex-direction:column;flex:0 0 auto;border-bottom:1px solid var(--surface-border)}.classes-panel-header{display:flex;align-items:center;gap:.35rem;padding:.35rem .5rem;border-bottom:1px solid var(--surface-border)}.classes-panel-title{font-size:.75rem;font-weight:600;letter-spacing:.03em;text-transform:uppercase;color:var(--text-color-secondary);margin-right:auto}.classes-search{margin:.25rem .5rem}.classes-panel-body{height:7rem;min-height:2.5rem;max-height:60vh;overflow-x:hidden;overflow-y:auto;resize:vertical}::ng-deep region-classes-panel .classes-panel-body .hex-picker-swatch{width:1.25rem;height:1.25rem;border-width:1px}.class-row{display:flex;align-items:center;gap:.5rem;padding:.1rem .5rem;cursor:pointer;border-left:3px solid transparent}.class-row:hover{background:var(--surface-hover, rgba(0, 0, 0, .04))}.class-row.picked{background:var(--highlight-bg, rgba(51, 153, 255, .12))}.class-row.marked{box-shadow:inset 3px 0 0 var(--primary-color)}.class-row.active{background:var(--highlight-bg, rgba(51, 153, 255, .12));border-left-color:var(--primary-color)}.class-row .row-swatch{flex:0 0 auto;display:inline-flex}.class-row .row-name{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:.85rem}.class-row.active .row-name{color:var(--primary-color);font-weight:600}.class-row .row-count{flex:0 0 auto;min-width:1.5rem;text-align:center;font-size:.72rem;font-variant-numeric:tabular-nums;color:var(--text-color-secondary);background:var(--surface-200, rgba(0, 0, 0, .06));border-radius:10px;padding:0 .4rem}.class-row .row-count.zero{opacity:.5}.class-row .row-del{flex:0 0 auto}.classes-empty{font-size:.8rem;color:var(--text-color-secondary);padding:.5rem}::ng-deep region-classes-panel .classes-panel-body .class-row .p-button.p-button-icon-only{width:1.75rem;height:1.75rem;padding:0}.class-row .row-3d{flex:0 0 auto;font-size:.8rem;opacity:.35;cursor:pointer}.class-row .row-3d:hover{opacity:.8}.class-row .row-3d.on{opacity:1;color:var(--primary-color)}.class-row .row-eye{flex:0 0 auto;font-size:.8rem;opacity:.4;cursor:pointer}.class-row .row-eye:hover{opacity:.9}.class-row.hidden-class .row-eye{opacity:1}.class-row.hidden-class .row-swatch,.class-row.hidden-class .row-name,.class-row.hidden-class .row-count{opacity:.45}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { 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: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { 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: ButtonModule }, { kind: "directive", type: i3.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading", "severity", "raised", "rounded", "text", "outlined", "size", "plain"] }, { kind: "ngmodule", type: InputTextModule }, { kind: "directive", type: i4.InputText, selector: "[pInputText]", inputs: ["variant"] }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i5.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "component", type: HexColorPickerComponent, selector: "hex-color-picker", inputs: ["color"], outputs: ["colorChange", "colorInput"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
120
126
|
}
|
|
121
127
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: ClassesPanelComponent, decorators: [{
|
|
122
128
|
type: Component,
|
|
123
|
-
args: [{ selector: 'region-classes-panel', standalone: true, imports: [CommonModule, FormsModule, ButtonModule, InputTextModule, TooltipModule, HexColorPickerComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "<!-- Docked \"Classes\" panel (jit-ui#70): the always-visible list of annotation\n classes above the regions table. Click a row to make it the active class\n (new regions inherit it; with rows selected it re-classifies them); recolour\n via the swatch; the badge shows how many regions use the class. \"Manage\"\n opens the full editor (fallback palette, auto-add, matching, import/export).\n A region set with a class hierarchy (an atlas ontology) can show its classes\n as a tree instead (projected in by the editor); the header switches views. -->\n<div class=\"classes-panel\">\n <div class=\"classes-panel-header\">\n <span class=\"classes-panel-title\">Classes</span>\n <button\n *ngIf=\"treeView !== null\"\n pButton\n type=\"button\"\n [icon]=\"treeView ? 'pi pi-list' : 'pi pi-sitemap'\"\n class=\"p-button-sm p-button-text\"\n [pTooltip]=\"treeView ? 'Show the classes as a list' : 'Show the classes as a tree'\"\n tooltipPosition=\"bottom\"\n [attr.aria-label]=\"treeView ? 'Show the classes as a list' : 'Show the classes as a tree'\"\n (click)=\"treeViewChange.emit(!treeView)\"\n ></button>\n <button\n pButton\n type=\"button\"\n icon=\"pi pi-cog\"\n label=\"Manage\"\n class=\"p-button-sm p-button-text\"\n pTooltip=\"Manage classes \u2014 add / remove, palette, matching, import/export\"\n tooltipPosition=\"bottom\"\n (click)=\"manage.emit()\"\n ></button>\n </div>\n <ng-container *ngIf=\"treeView; else list\"><ng-content></ng-content></ng-container>\n <ng-template #list>\n <input\n *ngIf=\"classes.length\"\n type=\"text\"\n pInputText\n class=\"p-inputtext-sm classes-search\"\n placeholder=\"Search by name\"\n aria-label=\"Search the classes\"\n [ngModel]=\"query\"\n (ngModelChange)=\"onQuery($event)\"\n (keydown.enter)=\"pickFirstMatch()\"\n />\n <div class=\"classes-panel-body\">\n <div\n *ngFor=\"let c of shownRows; trackBy: trackByName\"\n class=\"class-row\"\n [class.active]=\"activeClass === c.name\"\n [class.picked]=\"picked === c.name\"\n [class.marked]=\"marked.has(c.name)\"\n [class.hidden-class]=\"hidden.has(c.name)\"\n (click)=\"pick.emit(c.name)\"\n [pTooltip]=\"c.rowTooltip\"\n tooltipPosition=\"bottom\"\n >\n <i\n class=\"pi row-eye\"\n [ngClass]=\"hidden.has(c.name) ? 'pi-eye-slash' : 'pi-eye'\"\n role=\"button\"\n [attr.aria-pressed]=\"!hidden.has(c.name)\"\n [attr.aria-label]=\"(hidden.has(c.name) ? 'Show ' : 'Hide ') + c.name\"\n [pTooltip]=\"hidden.has(c.name) ? 'Show this class' : 'Hide this class'\"\n tooltipPosition=\"bottom\"\n (click)=\"$event.stopPropagation(); toggleHidden.emit(c.name)\"\n ></i>\n <span class=\"row-swatch\" (click)=\"$event.stopPropagation()\">\n <hex-color-picker [color]=\"c.color\" (colorChange)=\"recolor.emit({ name: c.name, color: $event })\">\n </hex-color-picker>\n </span>\n <span class=\"row-name\">{{ c.name }}</span>\n <span class=\"row-count\" [class.zero]=\"c.count === 0\">{{ c.count }}</span>\n <i\n *ngIf=\"volume\"\n class=\"pi pi-box row-3d\"\n [class.on]=\"shown3d.has(c.name)\"\n role=\"button\"\n [attr.aria-pressed]=\"shown3d.has(c.name)\"\n [attr.aria-label]=\"'Show ' + c.name + ' in 3D'\"\n pTooltip=\"Show in the volume, in 3D\"\n tooltipPosition=\"bottom\"\n (click)=\"$event.stopPropagation(); toggle3d.emit(c.name)\"\n ></i>\n <button\n pButton\n type=\"button\"\n icon=\"pi pi-trash\"\n class=\"p-button-sm p-button-text p-button-warning row-del\"\n [disabled]=\"!c.canRemove\"\n [pTooltip]=\"c.removeTooltip\"\n tooltipPosition=\"bottom\"\n [attr.aria-label]=\"'Remove class ' + c.name\"\n (click)=\"$event.stopPropagation(); remove.emit(c.name)\"\n ></button>\n </div>\n <div *ngIf=\"!classes.length\" class=\"classes-empty\">No classes yet \u2014 add one from Manage.</div>\n <div *ngIf=\"classes.length && !shownRows.length\" class=\"classes-empty\">No class matches.</div>\n </div>\n </ng-template>\n</div>\n", styles: ["@charset \"UTF-8\";:host{display:block;flex:0 0 auto}.classes-panel{display:flex;flex-direction:column;flex:0 0 auto;border-bottom:1px solid var(--surface-border)}.classes-panel-header{display:flex;align-items:center;gap:.35rem;padding:.35rem .5rem;border-bottom:1px solid var(--surface-border)}.classes-panel-title{font-size:.75rem;font-weight:600;letter-spacing:.03em;text-transform:uppercase;color:var(--text-color-secondary);margin-right:auto}.classes-search{margin:.25rem .5rem}.classes-panel-body{height:7rem;min-height:2.5rem;max-height:60vh;overflow-x:hidden;overflow-y:auto;resize:vertical}::ng-deep region-classes-panel .classes-panel-body .hex-picker-swatch{width:1.25rem;height:1.25rem;border-width:1px}.class-row{display:flex;align-items:center;gap:.5rem;padding:.1rem .5rem;cursor:pointer;border-left:3px solid transparent}.class-row:hover{background:var(--surface-hover, rgba(0, 0, 0, .04))}.class-row.picked{background:var(--highlight-bg, rgba(51, 153, 255, .12))}.class-row.marked{box-shadow:inset 3px 0 0 var(--primary-color)}.class-row.active{background:var(--highlight-bg, rgba(51, 153, 255, .12));border-left-color:var(--primary-color)}.class-row .row-swatch{flex:0 0 auto;display:inline-flex}.class-row .row-name{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:.85rem}.class-row.active .row-name{color:var(--primary-color);font-weight:600}.class-row .row-count{flex:0 0 auto;min-width:1.5rem;text-align:center;font-size:.72rem;font-variant-numeric:tabular-nums;color:var(--text-color-secondary);background:var(--surface-200, rgba(0, 0, 0, .06));border-radius:10px;padding:0 .4rem}.class-row .row-count.zero{opacity:.5}.class-row .row-del{flex:0 0 auto}.classes-empty{font-size:.8rem;color:var(--text-color-secondary);padding:.5rem}::ng-deep region-classes-panel .classes-panel-body .class-row .p-button.p-button-icon-only{width:1.75rem;height:1.75rem;padding:0}.class-row .row-3d{flex:0 0 auto;font-size:.8rem;opacity:.35;cursor:pointer}.class-row .row-3d:hover{opacity:.8}.class-row .row-3d.on{opacity:1;color:var(--primary-color)}.class-row .row-eye{flex:0 0 auto;font-size:.8rem;opacity:.4;cursor:pointer}.class-row .row-eye:hover{opacity:.9}.class-row.hidden-class .row-eye{opacity:1}.class-row.hidden-class .row-swatch,.class-row.hidden-class .row-name,.class-row.hidden-class .row-count{opacity:.45}\n"] }]
|
|
129
|
+
args: [{ selector: 'region-classes-panel', standalone: true, imports: [CommonModule, FormsModule, ButtonModule, InputTextModule, TooltipModule, HexColorPickerComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "<!-- Docked \"Classes\" panel (jit-ui#70): the always-visible list of annotation\n classes above the regions table. Click a row to make it the active class\n (new regions inherit it; with rows selected it re-classifies them); recolour\n via the swatch; the badge shows how many regions use the class. \"Manage\"\n opens the full editor (fallback palette, auto-add, matching, import/export).\n A region set with a class hierarchy (an atlas ontology) can show its classes\n as a tree instead (projected in by the editor); the header switches views. -->\n<div class=\"classes-panel\">\n <div class=\"classes-panel-header\">\n <span class=\"classes-panel-title\">Classes</span>\n <button\n *ngIf=\"treeView !== null\"\n pButton\n type=\"button\"\n [icon]=\"treeView ? 'pi pi-list' : 'pi pi-sitemap'\"\n class=\"p-button-sm p-button-text\"\n [pTooltip]=\"treeView ? 'Show the classes as a list' : 'Show the classes as a tree'\"\n tooltipPosition=\"bottom\"\n [attr.aria-label]=\"treeView ? 'Show the classes as a list' : 'Show the classes as a tree'\"\n (click)=\"treeViewChange.emit(!treeView)\"\n ></button>\n <button\n pButton\n type=\"button\"\n icon=\"pi pi-cog\"\n label=\"Manage\"\n class=\"p-button-sm p-button-text\"\n pTooltip=\"Manage classes \u2014 add / remove, palette, matching, import/export\"\n tooltipPosition=\"bottom\"\n (click)=\"manage.emit()\"\n ></button>\n </div>\n <ng-container *ngIf=\"treeView; else list\"><ng-content></ng-content></ng-container>\n <ng-template #list>\n <input\n *ngIf=\"classes.length\"\n type=\"text\"\n pInputText\n class=\"p-inputtext-sm classes-search\"\n placeholder=\"Search by name\"\n aria-label=\"Search the classes\"\n [ngModel]=\"query\"\n (ngModelChange)=\"onQuery($event)\"\n (keydown.enter)=\"pickFirstMatch()\"\n />\n <div class=\"classes-panel-body\">\n <div\n *ngFor=\"let c of shownRows; trackBy: trackByName\"\n class=\"class-row\"\n [class.active]=\"activeClass === c.name\"\n [class.picked]=\"picked === c.name\"\n [class.marked]=\"marked.has(c.name)\"\n [class.hidden-class]=\"hidden.has(c.name)\"\n (click)=\"pick.emit(c.name)\"\n [pTooltip]=\"c.rowTooltip\"\n tooltipPosition=\"bottom\"\n >\n <i\n class=\"pi row-eye\"\n [ngClass]=\"hidden.has(c.name) ? 'pi-eye-slash' : 'pi-eye'\"\n role=\"button\"\n [attr.aria-pressed]=\"!hidden.has(c.name)\"\n [attr.aria-label]=\"(hidden.has(c.name) ? 'Show ' : 'Hide ') + c.name\"\n [pTooltip]=\"hidden.has(c.name) ? 'Show this class' : 'Hide this class'\"\n tooltipPosition=\"bottom\"\n (click)=\"$event.stopPropagation(); toggleHidden.emit(c.name)\"\n ></i>\n <span class=\"row-swatch\" (click)=\"$event.stopPropagation()\">\n <hex-color-picker [color]=\"c.color\" (colorChange)=\"recolor.emit({ name: c.name, color: $event })\">\n </hex-color-picker>\n </span>\n <span class=\"row-name\">{{ c.name }}</span>\n <span class=\"row-count\" [class.zero]=\"c.count === 0\">{{ c.count }}</span>\n <i\n *ngIf=\"volume\"\n class=\"pi pi-box row-3d\"\n [class.on]=\"shown3d.has(c.name)\"\n role=\"button\"\n [attr.aria-pressed]=\"shown3d.has(c.name)\"\n [attr.aria-label]=\"'Show ' + c.name + ' in 3D'\"\n pTooltip=\"Show in the volume, in 3D\"\n tooltipPosition=\"bottom\"\n (click)=\"$event.stopPropagation(); toggle3d.emit(c.name)\"\n ></i>\n <i\n *ngIf=\"volume && cellable.has(c.name)\"\n class=\"pi pi-th-large row-3d row-cells\"\n [class.on]=\"individual.has(c.name)\"\n role=\"button\"\n [attr.aria-pressed]=\"individual.has(c.name)\"\n [attr.aria-label]=\"'Show ' + c.name + ' as individual cells'\"\n [pTooltip]=\"individual.has(c.name) ? 'Show as one surface' : 'Show each cell by itself'\"\n tooltipPosition=\"bottom\"\n (click)=\"\n $event.stopPropagation(); toggleCells.emit({ classes: [c.name], individual: !individual.has(c.name) })\n \"\n ></i>\n <button\n pButton\n type=\"button\"\n icon=\"pi pi-trash\"\n class=\"p-button-sm p-button-text p-button-warning row-del\"\n [disabled]=\"!c.canRemove\"\n [pTooltip]=\"c.removeTooltip\"\n tooltipPosition=\"bottom\"\n [attr.aria-label]=\"'Remove class ' + c.name\"\n (click)=\"$event.stopPropagation(); remove.emit(c.name)\"\n ></button>\n </div>\n <div *ngIf=\"!classes.length\" class=\"classes-empty\">No classes yet \u2014 add one from Manage.</div>\n <div *ngIf=\"classes.length && !shownRows.length\" class=\"classes-empty\">No class matches.</div>\n </div>\n </ng-template>\n</div>\n", styles: ["@charset \"UTF-8\";:host{display:block;flex:0 0 auto}.classes-panel{display:flex;flex-direction:column;flex:0 0 auto;border-bottom:1px solid var(--surface-border)}.classes-panel-header{display:flex;align-items:center;gap:.35rem;padding:.35rem .5rem;border-bottom:1px solid var(--surface-border)}.classes-panel-title{font-size:.75rem;font-weight:600;letter-spacing:.03em;text-transform:uppercase;color:var(--text-color-secondary);margin-right:auto}.classes-search{margin:.25rem .5rem}.classes-panel-body{height:7rem;min-height:2.5rem;max-height:60vh;overflow-x:hidden;overflow-y:auto;resize:vertical}::ng-deep region-classes-panel .classes-panel-body .hex-picker-swatch{width:1.25rem;height:1.25rem;border-width:1px}.class-row{display:flex;align-items:center;gap:.5rem;padding:.1rem .5rem;cursor:pointer;border-left:3px solid transparent}.class-row:hover{background:var(--surface-hover, rgba(0, 0, 0, .04))}.class-row.picked{background:var(--highlight-bg, rgba(51, 153, 255, .12))}.class-row.marked{box-shadow:inset 3px 0 0 var(--primary-color)}.class-row.active{background:var(--highlight-bg, rgba(51, 153, 255, .12));border-left-color:var(--primary-color)}.class-row .row-swatch{flex:0 0 auto;display:inline-flex}.class-row .row-name{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:.85rem}.class-row.active .row-name{color:var(--primary-color);font-weight:600}.class-row .row-count{flex:0 0 auto;min-width:1.5rem;text-align:center;font-size:.72rem;font-variant-numeric:tabular-nums;color:var(--text-color-secondary);background:var(--surface-200, rgba(0, 0, 0, .06));border-radius:10px;padding:0 .4rem}.class-row .row-count.zero{opacity:.5}.class-row .row-del{flex:0 0 auto}.classes-empty{font-size:.8rem;color:var(--text-color-secondary);padding:.5rem}::ng-deep region-classes-panel .classes-panel-body .class-row .p-button.p-button-icon-only{width:1.75rem;height:1.75rem;padding:0}.class-row .row-3d{flex:0 0 auto;font-size:.8rem;opacity:.35;cursor:pointer}.class-row .row-3d:hover{opacity:.8}.class-row .row-3d.on{opacity:1;color:var(--primary-color)}.class-row .row-eye{flex:0 0 auto;font-size:.8rem;opacity:.4;cursor:pointer}.class-row .row-eye:hover{opacity:.9}.class-row.hidden-class .row-eye{opacity:1}.class-row.hidden-class .row-swatch,.class-row.hidden-class .row-name,.class-row.hidden-class .row-count{opacity:.45}\n"] }]
|
|
124
130
|
}], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { classes: [{
|
|
125
131
|
type: Input
|
|
126
132
|
}], counts: [{
|
|
@@ -141,6 +147,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImpor
|
|
|
141
147
|
type: Input
|
|
142
148
|
}], shown3d: [{
|
|
143
149
|
type: Input
|
|
150
|
+
}], cellable: [{
|
|
151
|
+
type: Input
|
|
152
|
+
}], individual: [{
|
|
153
|
+
type: Input
|
|
154
|
+
}], toggleCells: [{
|
|
155
|
+
type: Output
|
|
144
156
|
}], hidden: [{
|
|
145
157
|
type: Input
|
|
146
158
|
}], toggleHidden: [{
|
|
@@ -160,4 +172,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImpor
|
|
|
160
172
|
}], manage: [{
|
|
161
173
|
type: Output
|
|
162
174
|
}] } });
|
|
163
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy1wYW5lbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL3JlZ2lvbi1lZGl0b3IvY2xhc3Nlcy1wYW5lbC9jbGFzc2VzLXBhbmVsLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvcmVnaW9uLWVkaXRvci9jbGFzc2VzLXBhbmVsL2NsYXNzZXMtcGFuZWwuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxHQUVQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFHaEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3pELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLG1EQUFtRCxDQUFDO0FBQzVGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQzs7Ozs7OztBQVlwRTs7Ozs7Ozs7R0FRRztBQVNILE1BQU0sT0FBTyxxQkFBcUI7SUFtRGhDLFlBQTZCLEVBQTJCO1FBQTNCLE9BQUUsR0FBRixFQUFFLENBQXlCO1FBbER4RCxvQ0FBb0M7UUFDM0IsWUFBTyxHQUFrQixFQUFFLENBQUM7UUFDckMsNEVBQTRFO1FBQ25FLFdBQU0sR0FBRyxJQUFJLEdBQUcsRUFBa0IsQ0FBQztRQUM1QywrREFBK0Q7UUFD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RSxPQUFPLGtEQUFrRCxDQUFDO1FBQ3ZHLE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyx3Q0FBd0MsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQztJQUNsRyxDQUFDOzhHQXBHVSxxQkFBcUI7a0dBQXJCLHFCQUFxQiw0aUJDaERsQyw2MElBcUdBLGc0RUQxRFksWUFBWSw2VkFBRSxXQUFXLDhtQkFBRSxZQUFZLDRPQUFFLGVBQWUsd0hBQUUsYUFBYSxzWEFBRSx1QkFBdUI7OzJGQUsvRixxQkFBcUI7a0JBUmpDLFNBQVM7K0JBQ0Usc0JBQXNCLGNBQ3BCLElBQUksV0FDUCxDQUFDLFlBQVksRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUUsdUJBQXVCLENBQUMsbUJBRzFGLHVCQUF1QixDQUFDLE1BQU07K0VBSXRDLE9BQU87c0JBQWYsS0FBSztnQkFFRyxNQUFNO3NCQUFkLEtBQUs7Z0JBRUcsU0FBUztzQkFBakIsS0FBSztnQkFFRyxXQUFXO3NCQUFuQixLQUFLO2dCQUVHLE1BQU07c0JBQWQsS0FBSztnQkFFRyxNQUFNO3NCQUFkLEtBQUs7Z0JBRUcsYUFBYTtzQkFBckIsS0FBSztnQkFFRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBRUcsTUFBTTtzQkFBZCxLQUFLO2dCQUVHLE9BQU87c0JBQWYsS0FBSztnQkFFRyxNQUFNO3NCQUFkLEtBQUs7Z0JBRUksWUFBWTtzQkFBckIsTUFBTTtnQkFFRyxRQUFRO3NCQUFqQixNQUFNO2dCQUVFLFFBQVE7c0JBQWhCLEtBQUs7Z0JBRUksY0FBYztzQkFBdkIsTUFBTTtnQkFHRyxJQUFJO3NCQUFiLE1BQU07Z0JBRUcsT0FBTztzQkFBaEIsTUFBTTtnQkFFRyxNQUFNO3NCQUFmLE1BQU07Z0JBRUcsTUFBTTtzQkFBZixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZXMsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgSW5wdXRUZXh0TW9kdWxlIH0gZnJvbSAncHJpbWVuZy9pbnB1dHRleHQnO1xuaW1wb3J0IHsgQnV0dG9uTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9idXR0b24nO1xuaW1wb3J0IHsgVG9vbHRpcE1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvdG9vbHRpcCc7XG5cbmltcG9ydCB7IENsYXNzUHJlc2V0LCBNYXRjaE1vZGUgfSBmcm9tICcuLi8uLi9tb2RlbHMvY2xhc3MtcHJlc2V0JztcbmltcG9ydCB7IHByZXNldEtleSB9IGZyb20gJy4uLy4uL3N0b3JlL2NsYXNzLWNvbG9yLnV0aWwnO1xuaW1wb3J0IHsgSGV4Q29sb3JQaWNrZXJDb21wb25lbnQgfSBmcm9tICcuLi8uLi9oZXgtY29sb3ItcGlja2VyL2hleC1jb2xvci1waWNrZXIuY29tcG9uZW50JztcbmltcG9ydCB7IHNjcm9sbFRvUGlja2VkIH0gZnJvbSAnLi4vY2xhc3MtdHJlZS9jbGFzcy10cmVlLmNvbXBvbmVudCc7XG5cbi8qKiBPbmUgY2xhc3Mgcm93IGFzIHRoZSB0ZW1wbGF0ZSBkcmF3cyBpdCwgZGVyaXZlZCBvbmNlIHBlciBpbnB1dCBjaGFuZ2UuICovXG5pbnRlcmZhY2UgQ2xhc3NSb3cge1xuICBuYW1lOiBzdHJpbmc7XG4gIGNvbG9yOiBzdHJpbmc7XG4gIGNvdW50OiBudW1iZXI7XG4gIGNhblJlbW92ZTogYm9vbGVhbjtcbiAgcm93VG9vbHRpcDogc3RyaW5nO1xuICByZW1vdmVUb29sdGlwOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIFJlZ2lvbiBFZGl0b3IncyBkb2NrZWQgXCJDbGFzc2VzXCIgcGFuZWwgKGppdC11aSM3MCk6IGV2ZXJ5IGFubm90YXRpb25cbiAqIGNsYXNzIHdpdGggaXRzIGNvbG91ciBzd2F0Y2ggYW5kIHJlZ2lvbiBjb3VudC4gQSByb3cgY2xpY2sgcGlja3MgdGhlIGFjdGl2ZVxuICogY2xhc3MgKGFuZCByZS1jbGFzc2lmaWVzIGEgc2VsZWN0aW9uKSwgdGhlIHN3YXRjaCByZWNvbG91cnMgdGhlIGNsYXNzLCB0aGVcbiAqIHRyYXNoIHJlbW92ZXMgaXQsIE1hbmFnZSBvcGVucyB0aGUgZnVsbCBlZGl0b3I7IHRoZSBzZWFyY2ggYm94IGZpbHRlcnMgdGhlXG4gKiByb3dzIGJ5IG5hbWU7IHRoZSBleWUgaGlkZXMgYSBjbGFzcydzIHJlZ2lvbnMuIEZvciBhIGNsYXNzIGhpZXJhcmNoeSB0aGUgZWRpdG9yIHByb2plY3RzIGEgY2xhc3MgdHJlZSBpbixcbiAqIHNob3duIGluIHBsYWNlIG9mIHRoZSBsaXN0IHdoaWxlIHtAbGluayB0cmVlVmlld30gaXMgb24uIFByZXNlbnRhdGlvbmFsOiB0aGVcbiAqIGVkaXRvciBhcHBsaWVzIGV2ZXJ5IGFjdGlvbi5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAncmVnaW9uLWNsYXNzZXMtcGFuZWwnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBGb3Jtc01vZHVsZSwgQnV0dG9uTW9kdWxlLCBJbnB1dFRleHRNb2R1bGUsIFRvb2x0aXBNb2R1bGUsIEhleENvbG9yUGlja2VyQ29tcG9uZW50XSxcbiAgdGVtcGxhdGVVcmw6ICcuL2NsYXNzZXMtcGFuZWwuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9jbGFzc2VzLXBhbmVsLmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBDbGFzc2VzUGFuZWxDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuICAvKiogVGhlIGNsYXNzZXMgaW4gZGlzcGxheSBvcmRlci4gKi9cbiAgQElucHV0KCkgY2xhc3NlczogQ2xhc3NQcmVzZXRbXSA9IFtdO1xuICAvKiogUmVnaW9uIGNvdW50IHBlciBjbGFzcywga2V5ZWQgYnkge0BsaW5rIHByZXNldEtleX0gdW5kZXIgYG1hdGNoTW9kZWAuICovXG4gIEBJbnB1dCgpIGNvdW50cyA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gIC8qKiBIb3cgbGFiZWxzIGFyZSBtYXRjaGVkIHRvIGNsYXNzZXMgKGtleXMge0BsaW5rIGNvdW50c30pLiAqL1xuICBASW5wdXQoKSBtYXRjaE1vZGU6IE1hdGNoTW9kZSA9ICdleGFjdCc7XG4gIC8qKiBUaGUgYWN0aXZlIGNsYXNzIChoaWdobGlnaHRlZCksIG9yIG51bGwuICovXG4gIEBJbnB1dCgpIGFjdGl2ZUNsYXNzOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgLyoqIFRoZSBjbGFzcyBwaWNrZWQgbGFzdCAoaW4gdGhlIGNsYXNzIHRyZWUsIG9yIGEgc3VyZmFjZSBpbiAzRCk6IGhpZ2hsaWdodGVkLCBzY3JvbGxlZCBpbnRvIHZpZXcuICovXG4gIEBJbnB1dCgpIHBpY2tlZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBDbGFzc2VzIHdpdGggYSBzZWxlY3RlZCByZWdpb24gKG1hcmtlZCkuICovXG4gIEBJbnB1dCgpIG1hcmtlZDogUmVhZG9ubHlTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKTtcbiAgLyoqIE51bWJlciBvZiBzZWxlY3RlZCByZWdpb25zIChjaGFuZ2VzIHdoYXQgYSByb3cgY2xpY2sgZG9lcykuICovXG4gIEBJbnB1dCgpIHNlbGVjdGVkQ291bnQgPSAwO1xuICAvKiogVGhlIGNsYXNzIHJlZ2lvbnMgcmV2ZXJ0IHRvOyBpdCBjYW4ndCBiZSByZW1vdmVkIHdoaWxlIGluIHVzZS4gKi9cbiAgQElucHV0KCkgZGVmYXVsdENsYXNzTmFtZSA9ICdSZWdpb24nO1xuICAvKiogV2hldGhlciBhIHZvbHVtZSB2aWV3IGlzIG9uIHNjcmVlbjogZWFjaCBjbGFzcyBjYW4gdGhlbiBiZSBzaG93biBpbiAzRC4gKi9cbiAgQElucHV0KCkgdm9sdW1lID0gZmFsc2U7XG4gIC8qKiBUaGUgY2xhc3NlcyBzaG93biBpbiAzRC4gKi9cbiAgQElucHV0KCkgc2hvd24zZDogUmVhZG9ubHlTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKTtcbiAgLyoqIFRoZSBjbGFzc2VzIGhpZGRlbiBmcm9tIHZpZXcuICovXG4gIEBJbnB1dCgpIGhpZGRlbjogUmVhZG9ubHlTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKTtcbiAgLyoqIEEgY2xhc3MncyBleWUgKGl0cyBuYW1lKTogaGlkZSBpdCwgb3Igc2hvdyBpdCBhZ2Fpbi4gKi9cbiAgQE91dHB1dCgpIHRvZ2dsZUhpZGRlbiA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICAvKiogQSBjbGFzcydzIDNEIHRvZ2dsZSAoaXRzIG5hbWUpLiAqL1xuICBAT3V0cHV0KCkgdG9nZ2xlM2QgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgLyoqIFdoZXRoZXIgdGhlIHByb2plY3RlZCBjbGFzcyB0cmVlIGlzIHNob3duIGluc3RlYWQgb2YgdGhlIGxpc3Q7IG51bGw6IHRoZXJlIGlzIG5vIHRyZWUuICovXG4gIEBJbnB1dCgpIHRyZWVWaWV3OiBib29sZWFuIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBUaGUgbGlzdCAvIHRyZWUgc3dpdGNoLiAqL1xuICBAT3V0cHV0KCkgdHJlZVZpZXdDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgLyoqIEEgcm93IHdhcyBjbGlja2VkOiBtYWtlIHRoZSBjbGFzcyBhY3RpdmUgLyBhcHBseSBpdCB0byB0aGUgc2VsZWN0aW9uLiAqL1xuICBAT3V0cHV0KCkgcGljayA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICAvKiogQSBjbGFzcydzIHN3YXRjaCBwaWNrZWQgYSBuZXcgY29sb3VyLiAqL1xuICBAT3V0cHV0KCkgcmVjb2xvciA9IG5ldyBFdmVudEVtaXR0ZXI8eyBuYW1lOiBzdHJpbmc7IGNvbG9yOiBzdHJpbmcgfT4oKTtcbiAgLyoqIEEgY2xhc3MncyB0cmFzaCBidXR0b24gKGl0cyBuYW1lKS4gKi9cbiAgQE91dHB1dCgpIHJlbW92ZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICAvKiogTWFuYWdlIGNsaWNrZWQuICovXG4gIEBPdXRwdXQoKSBtYW5hZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgLyoqIHRyYWNrQnkgZm9yIHRoZSBjbGFzcyByb3dzIHNvIHJlLXNvcnRpbmcgZG9lc24ndCByZS1jcmVhdGUgdGhlIHBpY2tlcnMuICovXG4gIHByb3RlY3RlZCByZWFkb25seSB0cmFja0J5TmFtZSA9IChfOiBudW1iZXIsIGM6IENsYXNzUm93KTogc3RyaW5nID0+IGMubmFtZTtcblxuICAvKiogRXZlcnkgY2xhc3MncyByb3csIHJlYnVpbHQgd2hlbiBhbiBpbnB1dCBjaGFuZ2VzIHJhdGhlciB0aGFuIHBlciBjaGVjay4gKi9cbiAgcHJvdGVjdGVkIHJvd3M6IENsYXNzUm93W10gPSBbXTtcbiAgLyoqIFRoZSByb3dzIG1hdGNoaW5nIHtAbGluayBxdWVyeX0uICovXG4gIHByb3RlY3RlZCBzaG93blJvd3M6IENsYXNzUm93W10gPSBbXTtcbiAgLyoqIFRoZSBzZWFyY2ggYm94J3MgdGV4dC4gKi9cbiAgcHJvdGVjdGVkIHF1ZXJ5ID0gJyc7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBlbDogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4pIHt9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyA9IHt9KTogdm9pZCB7XG4gICAgdGhpcy5yb3dzID0gdGhpcy5jbGFzc2VzLm1hcCgoYykgPT4gKHtcbiAgICAgIG5hbWU6IGMubmFtZSxcbiAgICAgIGNvbG9yOiBjLmNvbG9yLFxuICAgICAgY291bnQ6IHRoaXMuY291bnQoYy5uYW1lKSxcbiAgICAgIGNhblJlbW92ZTogdGhpcy5jYW5SZW1vdmUoYy5uYW1lKSxcbiAgICAgIHJvd1Rvb2x0aXA6IHRoaXMucm93VG9vbHRpcChjLm5hbWUpLFxuICAgICAgcmVtb3ZlVG9vbHRpcDogdGhpcy5yZW1vdmVUb29sdGlwKGMubmFtZSksXG4gICAgfSkpO1xuICAgIHRoaXMuZmlsdGVyKCk7XG4gICAgaWYgKGNoYW5nZXNbJ3BpY2tlZCddICYmIHRoaXMucGlja2VkKVxuICAgICAgc2V0VGltZW91dCgoKSA9PiBzY3JvbGxUb1BpY2tlZCh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsICcuY2xhc3Mtcm93LnBpY2tlZCcpKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvblF1ZXJ5KHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnF1ZXJ5ID0gdmFsdWU7XG4gICAgdGhpcy5maWx0ZXIoKTtcbiAgfVxuXG4gIC8qKiBFbnRlciBpbiB0aGUgc2VhcmNoIGJveCBwaWNrcyB0aGUgZmlyc3QgbWF0Y2guICovXG4gIHByb3RlY3RlZCBwaWNrRmlyc3RNYXRjaCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5xdWVyeS50cmltKCkgJiYgdGhpcy5zaG93blJvd3MubGVuZ3RoKSB0aGlzLnBpY2suZW1pdCh0aGlzLnNob3duUm93c1swXS5uYW1lKTtcbiAgfVxuXG4gIHByaXZhdGUgZmlsdGVyKCk6IHZvaWQge1xuICAgIGNvbnN0IHEgPSB0aGlzLnF1ZXJ5LnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgIHRoaXMuc2hvd25Sb3dzID0gcSA/IHRoaXMucm93cy5maWx0ZXIoKHIpID0+IHIubmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHEpKSA6IHRoaXMucm93cztcbiAgfVxuXG4gIHByaXZhdGUgY291bnQobmFtZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5jb3VudHMuZ2V0KHByZXNldEtleSh7IG1hdGNoTW9kZTogdGhpcy5tYXRjaE1vZGUgfSwgbmFtZSkpID8/IDA7XG4gIH1cblxuICBwcml2YXRlIGNhblJlbW92ZShuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIShuYW1lID09PSB0aGlzLmRlZmF1bHRDbGFzc05hbWUgJiYgdGhpcy5jb3VudChuYW1lKSA+IDApO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJvd1Rvb2x0aXAobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZENvdW50XG4gICAgICA/IGBBcHBseSDigJwke25hbWV94oCdIHRvIHRoZSBzZWxlY3RlZCByZWdpb24ocylgXG4gICAgICA6IGBTZXQg4oCcJHtuYW1lfeKAnSBhY3RpdmUg4oCUIG5ldyByZWdpb25zIHVzZSBpdGA7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVtb3ZlVG9vbHRpcChuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGluVXNlID0gdGhpcy5jb3VudChuYW1lKSA+IDA7XG4gICAgaWYgKG5hbWUgPT09IHRoaXMuZGVmYXVsdENsYXNzTmFtZSAmJiBpblVzZSkgcmV0dXJuICdUaGUgZGVmYXVsdCBjbGFzcyBjYW5ub3QgYmUgcmVtb3ZlZCB3aGlsZSBpbiB1c2UnO1xuICAgIHJldHVybiBpblVzZSA/IGBSZW1vdmUgY2xhc3Mg4oCUIGl0cyByZWdpb25zIHJldmVydCB0byAke3RoaXMuZGVmYXVsdENsYXNzTmFtZX1gIDogJ1JlbW92ZSBjbGFzcyc7XG4gIH1cbn1cbiIsIjwhLS0gRG9ja2VkIFwiQ2xhc3Nlc1wiIHBhbmVsIChqaXQtdWkjNzApOiB0aGUgYWx3YXlzLXZpc2libGUgbGlzdCBvZiBhbm5vdGF0aW9uXG4gICAgIGNsYXNzZXMgYWJvdmUgdGhlIHJlZ2lvbnMgdGFibGUuIENsaWNrIGEgcm93IHRvIG1ha2UgaXQgdGhlIGFjdGl2ZSBjbGFzc1xuICAgICAobmV3IHJlZ2lvbnMgaW5oZXJpdCBpdDsgd2l0aCByb3dzIHNlbGVjdGVkIGl0IHJlLWNsYXNzaWZpZXMgdGhlbSk7IHJlY29sb3VyXG4gICAgIHZpYSB0aGUgc3dhdGNoOyB0aGUgYmFkZ2Ugc2hvd3MgaG93IG1hbnkgcmVnaW9ucyB1c2UgdGhlIGNsYXNzLiBcIk1hbmFnZVwiXG4gICAgIG9wZW5zIHRoZSBmdWxsIGVkaXRvciAoZmFsbGJhY2sgcGFsZXR0ZSwgYXV0by1hZGQsIG1hdGNoaW5nLCBpbXBvcnQvZXhwb3J0KS5cbiAgICAgQSByZWdpb24gc2V0IHdpdGggYSBjbGFzcyBoaWVyYXJjaHkgKGFuIGF0bGFzIG9udG9sb2d5KSBjYW4gc2hvdyBpdHMgY2xhc3Nlc1xuICAgICBhcyBhIHRyZWUgaW5zdGVhZCAocHJvamVjdGVkIGluIGJ5IHRoZSBlZGl0b3IpOyB0aGUgaGVhZGVyIHN3aXRjaGVzIHZpZXdzLiAtLT5cbjxkaXYgY2xhc3M9XCJjbGFzc2VzLXBhbmVsXCI+XG4gIDxkaXYgY2xhc3M9XCJjbGFzc2VzLXBhbmVsLWhlYWRlclwiPlxuICAgIDxzcGFuIGNsYXNzPVwiY2xhc3Nlcy1wYW5lbC10aXRsZVwiPkNsYXNzZXM8L3NwYW4+XG4gICAgPGJ1dHRvblxuICAgICAgKm5nSWY9XCJ0cmVlVmlldyAhPT0gbnVsbFwiXG4gICAgICBwQnV0dG9uXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIFtpY29uXT1cInRyZWVWaWV3ID8gJ3BpIHBpLWxpc3QnIDogJ3BpIHBpLXNpdGVtYXAnXCJcbiAgICAgIGNsYXNzPVwicC1idXR0b24tc20gcC1idXR0b24tdGV4dFwiXG4gICAgICBbcFRvb2x0aXBdPVwidHJlZVZpZXcgPyAnU2hvdyB0aGUgY2xhc3NlcyBhcyBhIGxpc3QnIDogJ1Nob3cgdGhlIGNsYXNzZXMgYXMgYSB0cmVlJ1wiXG4gICAgICB0b29sdGlwUG9zaXRpb249XCJib3R0b21cIlxuICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJ0cmVlVmlldyA/ICdTaG93IHRoZSBjbGFzc2VzIGFzIGEgbGlzdCcgOiAnU2hvdyB0aGUgY2xhc3NlcyBhcyBhIHRyZWUnXCJcbiAgICAgIChjbGljayk9XCJ0cmVlVmlld0NoYW5nZS5lbWl0KCF0cmVlVmlldylcIlxuICAgID48L2J1dHRvbj5cbiAgICA8YnV0dG9uXG4gICAgICBwQnV0dG9uXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIGljb249XCJwaSBwaS1jb2dcIlxuICAgICAgbGFiZWw9XCJNYW5hZ2VcIlxuICAgICAgY2xhc3M9XCJwLWJ1dHRvbi1zbSBwLWJ1dHRvbi10ZXh0XCJcbiAgICAgIHBUb29sdGlwPVwiTWFuYWdlIGNsYXNzZXMg4oCUIGFkZCAvIHJlbW92ZSwgcGFsZXR0ZSwgbWF0Y2hpbmcsIGltcG9ydC9leHBvcnRcIlxuICAgICAgdG9vbHRpcFBvc2l0aW9uPVwiYm90dG9tXCJcbiAgICAgIChjbGljayk9XCJtYW5hZ2UuZW1pdCgpXCJcbiAgICA+PC9idXR0b24+XG4gIDwvZGl2PlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwidHJlZVZpZXc7IGVsc2UgbGlzdFwiPjxuZy1jb250ZW50PjwvbmctY29udGVudD48L25nLWNvbnRhaW5lcj5cbiAgPG5nLXRlbXBsYXRlICNsaXN0PlxuICAgIDxpbnB1dFxuICAgICAgKm5nSWY9XCJjbGFzc2VzLmxlbmd0aFwiXG4gICAgICB0eXBlPVwidGV4dFwiXG4gICAgICBwSW5wdXRUZXh0XG4gICAgICBjbGFzcz1cInAtaW5wdXR0ZXh0LXNtIGNsYXNzZXMtc2VhcmNoXCJcbiAgICAgIHBsYWNlaG9sZGVyPVwiU2VhcmNoIGJ5IG5hbWVcIlxuICAgICAgYXJpYS1sYWJlbD1cIlNlYXJjaCB0aGUgY2xhc3Nlc1wiXG4gICAgICBbbmdNb2RlbF09XCJxdWVyeVwiXG4gICAgICAobmdNb2RlbENoYW5nZSk9XCJvblF1ZXJ5KCRldmVudClcIlxuICAgICAgKGtleWRvd24uZW50ZXIpPVwicGlja0ZpcnN0TWF0Y2goKVwiXG4gICAgLz5cbiAgICA8ZGl2IGNsYXNzPVwiY2xhc3Nlcy1wYW5lbC1ib2R5XCI+XG4gICAgICA8ZGl2XG4gICAgICAgICpuZ0Zvcj1cImxldCBjIG9mIHNob3duUm93czsgdHJhY2tCeTogdHJhY2tCeU5hbWVcIlxuICAgICAgICBjbGFzcz1cImNsYXNzLXJvd1wiXG4gICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiYWN0aXZlQ2xhc3MgPT09IGMubmFtZVwiXG4gICAgICAgIFtjbGFzcy5waWNrZWRdPVwicGlja2VkID09PSBjLm5hbWVcIlxuICAgICAgICBbY2xhc3MubWFya2VkXT1cIm1hcmtlZC5oYXMoYy5uYW1lKVwiXG4gICAgICAgIFtjbGFzcy5oaWRkZW4tY2xhc3NdPVwiaGlkZGVuLmhhcyhjLm5hbWUpXCJcbiAgICAgICAgKGNsaWNrKT1cInBpY2suZW1pdChjLm5hbWUpXCJcbiAgICAgICAgW3BUb29sdGlwXT1cImMucm93VG9vbHRpcFwiXG4gICAgICAgIHRvb2x0aXBQb3NpdGlvbj1cImJvdHRvbVwiXG4gICAgICA+XG4gICAgICAgIDxpXG4gICAgICAgICAgY2xhc3M9XCJwaSByb3ctZXllXCJcbiAgICAgICAgICBbbmdDbGFzc109XCJoaWRkZW4uaGFzKGMubmFtZSkgPyAncGktZXllLXNsYXNoJyA6ICdwaS1leWUnXCJcbiAgICAgICAgICByb2xlPVwiYnV0dG9uXCJcbiAgICAgICAgICBbYXR0ci5hcmlhLXByZXNzZWRdPVwiIWhpZGRlbi5oYXMoYy5uYW1lKVwiXG4gICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIoaGlkZGVuLmhhcyhjLm5hbWUpID8gJ1Nob3cgJyA6ICdIaWRlICcpICsgYy5uYW1lXCJcbiAgICAgICAgICBbcFRvb2x0aXBdPVwiaGlkZGVuLmhhcyhjLm5hbWUpID8gJ1Nob3cgdGhpcyBjbGFzcycgOiAnSGlkZSB0aGlzIGNsYXNzJ1wiXG4gICAgICAgICAgdG9vbHRpcFBvc2l0aW9uPVwiYm90dG9tXCJcbiAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyB0b2dnbGVIaWRkZW4uZW1pdChjLm5hbWUpXCJcbiAgICAgICAgPjwvaT5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJyb3ctc3dhdGNoXCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxuICAgICAgICAgIDxoZXgtY29sb3ItcGlja2VyIFtjb2xvcl09XCJjLmNvbG9yXCIgKGNvbG9yQ2hhbmdlKT1cInJlY29sb3IuZW1pdCh7IG5hbWU6IGMubmFtZSwgY29sb3I6ICRldmVudCB9KVwiPlxuICAgICAgICAgIDwvaGV4LWNvbG9yLXBpY2tlcj5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInJvdy1uYW1lXCI+e3sgYy5uYW1lIH19PC9zcGFuPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInJvdy1jb3VudFwiIFtjbGFzcy56ZXJvXT1cImMuY291bnQgPT09IDBcIj57eyBjLmNvdW50IH19PC9zcGFuPlxuICAgICAgICA8aVxuICAgICAgICAgICpuZ0lmPVwidm9sdW1lXCJcbiAgICAgICAgICBjbGFzcz1cInBpIHBpLWJveCByb3ctM2RcIlxuICAgICAgICAgIFtjbGFzcy5vbl09XCJzaG93bjNkLmhhcyhjLm5hbWUpXCJcbiAgICAgICAgICByb2xlPVwiYnV0dG9uXCJcbiAgICAgICAgICBbYXR0ci5hcmlhLXByZXNzZWRdPVwic2hvd24zZC5oYXMoYy5uYW1lKVwiXG4gICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInU2hvdyAnICsgYy5uYW1lICsgJyBpbiAzRCdcIlxuICAgICAgICAgIHBUb29sdGlwPVwiU2hvdyBpbiB0aGUgdm9sdW1lLCBpbiAzRFwiXG4gICAgICAgICAgdG9vbHRpcFBvc2l0aW9uPVwiYm90dG9tXCJcbiAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyB0b2dnbGUzZC5lbWl0KGMubmFtZSlcIlxuICAgICAgICA+PC9pPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgcEJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIGljb249XCJwaSBwaS10cmFzaFwiXG4gICAgICAgICAgY2xhc3M9XCJwLWJ1dHRvbi1zbSBwLWJ1dHRvbi10ZXh0IHAtYnV0dG9uLXdhcm5pbmcgcm93LWRlbFwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cIiFjLmNhblJlbW92ZVwiXG4gICAgICAgICAgW3BUb29sdGlwXT1cImMucmVtb3ZlVG9vbHRpcFwiXG4gICAgICAgICAgdG9vbHRpcFBvc2l0aW9uPVwiYm90dG9tXCJcbiAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidSZW1vdmUgY2xhc3MgJyArIGMubmFtZVwiXG4gICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgcmVtb3ZlLmVtaXQoYy5uYW1lKVwiXG4gICAgICAgID48L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiAqbmdJZj1cIiFjbGFzc2VzLmxlbmd0aFwiIGNsYXNzPVwiY2xhc3Nlcy1lbXB0eVwiPk5vIGNsYXNzZXMgeWV0IOKAlCBhZGQgb25lIGZyb20gTWFuYWdlLjwvZGl2PlxuICAgICAgPGRpdiAqbmdJZj1cImNsYXNzZXMubGVuZ3RoICYmICFzaG93blJvd3MubGVuZ3RoXCIgY2xhc3M9XCJjbGFzc2VzLWVtcHR5XCI+Tm8gY2xhc3MgbWF0Y2hlcy48L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9uZy10ZW1wbGF0ZT5cbjwvZGl2PlxuIl19
|
|
175
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy1wYW5lbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL3JlZ2lvbi1lZGl0b3IvY2xhc3Nlcy1wYW5lbC9jbGFzc2VzLXBhbmVsLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvcmVnaW9uLWVkaXRvci9jbGFzc2VzLXBhbmVsL2NsYXNzZXMtcGFuZWwuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxHQUVQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFHaEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3pELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLG1EQUFtRCxDQUFDO0FBQzVGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQzs7Ozs7OztBQVlwRTs7Ozs7Ozs7R0FRRztBQVNILE1BQU0sT0FBTyxxQkFBcUI7SUEwRGhDLFlBQTZCLEVBQTJCO1FBQTNCLE9BQUUsR0FBRixFQUFFLENBQXlCO1FBekR4RCxvQ0FBb0M7UUFDM0IsWUFBTyxHQUFrQixFQUFFLENBQUM7UUFDckMsNEVBQTRFO1FBQ25FLFdBQU0sR0FBRyxJQUFJLEdBQUcsRUFBa0IsQ0FBQztRQUM1QywrREFBK0Q7UUFDdEQsY0FBUyxHQUFjLE9BQU8sQ0FBQztRQUN4QywrQ0FBK0M7UUFDdEMsZ0JBQVcsR0FBa0IsSUFBSSxDQUFDO1FBQzNDLHNHQUFzRztRQUM3RixXQUFNLEdBQWtCLElBQUksQ0FBQztRQUN0QywrQ0FBK0M7UUFDdEMsV0FBTSxHQUF3QixJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ2pELGtFQUFrRTtRQUN6RCxrQkFBYSxHQUFHLENBQUMsQ0FBQztRQUMzQixxRUFBcUU7UUFDNUQscUJBQWdCLEdBQUcsUUFBUSxDQUFDO1FBQ3JDLDhFQUE4RTtRQUNyRSxXQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ3hCLCtCQUErQjtRQUN0QixZQUFPLEdBQXdCLElBQUksR0FBRyxFQUFFLENBQUM7UUFDbEQsK0ZBQStGO1FBQ3RGLGFBQVEsR0FBd0IsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUNuRCwyQ0FBMkM7UUFDbEMsZUFBVSxHQUF3QixJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ3JELGtGQUFrRjtRQUN4RSxnQkFBVyxHQUFHLElBQUksWUFBWSxFQUE4QyxDQUFDO1FBRXZGLG9DQUFvQztRQUMzQixXQUFNLEdBQXdCLElBQUksR0FBRyxFQUFFLENBQUM7UUFDakQsMkRBQTJEO1FBQ2pELGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUNwRCxzQ0FBc0M7UUFDNUIsYUFBUSxHQUFHLElBQUksWUFBWSxFQUFVLENBQUM7UUFDaEQsNkZBQTZGO1FBQ3BGLGFBQVEsR0FBbUIsSUFBSSxDQUFDO1FBQ3pDLDhCQUE4QjtRQUNwQixtQkFBYyxHQUFHLElBQUksWUFBWSxFQUFXLENBQUM7UUFFdkQsNEVBQTRFO1FBQ2xFLFNBQUksR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO1FBQzVDLDRDQUE0QztRQUNsQyxZQUFPLEdBQUcsSUFBSSxZQUFZLEVBQW1DLENBQUM7UUFDeEUseUNBQXlDO1FBQy9CLFdBQU0sR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO1FBQzlDLHNCQUFzQjtRQUNaLFdBQU0sR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBRTVDLDhFQUE4RTtRQUMzRCxnQkFBVyxHQUFHLENBQUMsQ0FBUyxFQUFFLENBQVcsRUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUU1RSw4RUFBOEU7UUFDcEUsU0FBSSxHQUFlLEVBQUUsQ0FBQztRQUNoQyx1Q0FBdUM7UUFDN0IsY0FBUyxHQUFlLEVBQUUsQ0FBQztRQUNyQyw2QkFBNkI7UUFDbkIsVUFBSyxHQUFHLEVBQUUsQ0FBQztJQUVzQyxDQUFDO0lBRTVELFdBQVcsQ0FBQyxVQUF5QixFQUFFO1FBQ3JDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDbkMsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJO1lBQ1osS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLO1lBQ2QsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUN6QixTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQ2pDLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDbkMsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztTQUMxQyxDQUFDLENBQUMsQ0FBQztRQUNKLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNkLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNO1lBQ2xDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLEVBQUUsbUJBQW1CLENBQUMsQ0FBQyxDQUFDO0lBQ2pGLENBQUM7SUFFUyxPQUFPLENBQUMsS0FBYTtRQUM3QixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDaEIsQ0FBQztJQUVELHFEQUFxRDtJQUMzQyxjQUFjO1FBQ3RCLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU07WUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3pGLENBQUM7SUFFTyxNQUFNO1FBQ1osTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUMxQyxJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDN0YsQ0FBQztJQUVPLEtBQUssQ0FBQyxJQUFZO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM5RSxDQUFDO0lBRU8sU0FBUyxDQUFDLElBQVk7UUFDNUIsT0FBTyxDQUFDLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ25FLENBQUM7SUFFUyxVQUFVLENBQUMsSUFBWTtRQUMvQixPQUFPLElBQUksQ0FBQyxhQUFhO1lBQ3ZCLENBQUMsQ0FBQyxVQUFVLElBQUksNkJBQTZCO1lBQzdDLENBQUMsQ0FBQyxRQUFRLElBQUksK0JBQStCLENBQUM7SUFDbEQsQ0FBQztJQUVTLGFBQWEsQ0FBQyxJQUFZO1FBQ2xDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ25DLElBQUksSUFBSSxLQUFLLElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxLQUFLO1lBQUUsT0FBTyxrREFBa0QsQ0FBQztRQUN2RyxPQUFPLEtBQUssQ0FBQyxDQUFDLENBQUMsd0NBQXdDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUM7SUFDbEcsQ0FBQzs4R0EzR1UscUJBQXFCO2tHQUFyQixxQkFBcUIsd25CQ2hEbEMsczhKQWtIQSxnNEVEdkVZLFlBQVksNlZBQUUsV0FBVyw4bUJBQUUsWUFBWSw0T0FBRSxlQUFlLHdIQUFFLGFBQWEsc1hBQUUsdUJBQXVCOzsyRkFLL0YscUJBQXFCO2tCQVJqQyxTQUFTOytCQUNFLHNCQUFzQixjQUNwQixJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFFLHVCQUF1QixDQUFDLG1CQUcxRix1QkFBdUIsQ0FBQyxNQUFNOytFQUl0QyxPQUFPO3NCQUFmLEtBQUs7Z0JBRUcsTUFBTTtzQkFBZCxLQUFLO2dCQUVHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBRUcsV0FBVztzQkFBbkIsS0FBSztnQkFFRyxNQUFNO3NCQUFkLEtBQUs7Z0JBRUcsTUFBTTtzQkFBZCxLQUFLO2dCQUVHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBRUcsZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUVHLE1BQU07c0JBQWQsS0FBSztnQkFFRyxPQUFPO3NCQUFmLEtBQUs7Z0JBRUcsUUFBUTtzQkFBaEIsS0FBSztnQkFFRyxVQUFVO3NCQUFsQixLQUFLO2dCQUVJLFdBQVc7c0JBQXBCLE1BQU07Z0JBR0UsTUFBTTtzQkFBZCxLQUFLO2dCQUVJLFlBQVk7c0JBQXJCLE1BQU07Z0JBRUcsUUFBUTtzQkFBakIsTUFBTTtnQkFFRSxRQUFRO3NCQUFoQixLQUFLO2dCQUVJLGNBQWM7c0JBQXZCLE1BQU07Z0JBR0csSUFBSTtzQkFBYixNQUFNO2dCQUVHLE9BQU87c0JBQWhCLE1BQU07Z0JBRUcsTUFBTTtzQkFBZixNQUFNO2dCQUVHLE1BQU07c0JBQWYsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT3V0cHV0LFxuICBTaW1wbGVDaGFuZ2VzLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IElucHV0VGV4dE1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvaW5wdXR0ZXh0JztcbmltcG9ydCB7IEJ1dHRvbk1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvYnV0dG9uJztcbmltcG9ydCB7IFRvb2x0aXBNb2R1bGUgfSBmcm9tICdwcmltZW5nL3Rvb2x0aXAnO1xuXG5pbXBvcnQgeyBDbGFzc1ByZXNldCwgTWF0Y2hNb2RlIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2NsYXNzLXByZXNldCc7XG5pbXBvcnQgeyBwcmVzZXRLZXkgfSBmcm9tICcuLi8uLi9zdG9yZS9jbGFzcy1jb2xvci51dGlsJztcbmltcG9ydCB7IEhleENvbG9yUGlja2VyQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vaGV4LWNvbG9yLXBpY2tlci9oZXgtY29sb3ItcGlja2VyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBzY3JvbGxUb1BpY2tlZCB9IGZyb20gJy4uL2NsYXNzLXRyZWUvY2xhc3MtdHJlZS5jb21wb25lbnQnO1xuXG4vKiogT25lIGNsYXNzIHJvdyBhcyB0aGUgdGVtcGxhdGUgZHJhd3MgaXQsIGRlcml2ZWQgb25jZSBwZXIgaW5wdXQgY2hhbmdlLiAqL1xuaW50ZXJmYWNlIENsYXNzUm93IHtcbiAgbmFtZTogc3RyaW5nO1xuICBjb2xvcjogc3RyaW5nO1xuICBjb3VudDogbnVtYmVyO1xuICBjYW5SZW1vdmU6IGJvb2xlYW47XG4gIHJvd1Rvb2x0aXA6IHN0cmluZztcbiAgcmVtb3ZlVG9vbHRpcDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBSZWdpb24gRWRpdG9yJ3MgZG9ja2VkIFwiQ2xhc3Nlc1wiIHBhbmVsIChqaXQtdWkjNzApOiBldmVyeSBhbm5vdGF0aW9uXG4gKiBjbGFzcyB3aXRoIGl0cyBjb2xvdXIgc3dhdGNoIGFuZCByZWdpb24gY291bnQuIEEgcm93IGNsaWNrIHBpY2tzIHRoZSBhY3RpdmVcbiAqIGNsYXNzIChhbmQgcmUtY2xhc3NpZmllcyBhIHNlbGVjdGlvbiksIHRoZSBzd2F0Y2ggcmVjb2xvdXJzIHRoZSBjbGFzcywgdGhlXG4gKiB0cmFzaCByZW1vdmVzIGl0LCBNYW5hZ2Ugb3BlbnMgdGhlIGZ1bGwgZWRpdG9yOyB0aGUgc2VhcmNoIGJveCBmaWx0ZXJzIHRoZVxuICogcm93cyBieSBuYW1lOyB0aGUgZXllIGhpZGVzIGEgY2xhc3MncyByZWdpb25zLiBGb3IgYSBjbGFzcyBoaWVyYXJjaHkgdGhlIGVkaXRvciBwcm9qZWN0cyBhIGNsYXNzIHRyZWUgaW4sXG4gKiBzaG93biBpbiBwbGFjZSBvZiB0aGUgbGlzdCB3aGlsZSB7QGxpbmsgdHJlZVZpZXd9IGlzIG9uLiBQcmVzZW50YXRpb25hbDogdGhlXG4gKiBlZGl0b3IgYXBwbGllcyBldmVyeSBhY3Rpb24uXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3JlZ2lvbi1jbGFzc2VzLXBhbmVsJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgRm9ybXNNb2R1bGUsIEJ1dHRvbk1vZHVsZSwgSW5wdXRUZXh0TW9kdWxlLCBUb29sdGlwTW9kdWxlLCBIZXhDb2xvclBpY2tlckNvbXBvbmVudF0sXG4gIHRlbXBsYXRlVXJsOiAnLi9jbGFzc2VzLXBhbmVsLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vY2xhc3Nlcy1wYW5lbC5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgQ2xhc3Nlc1BhbmVsQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzIHtcbiAgLyoqIFRoZSBjbGFzc2VzIGluIGRpc3BsYXkgb3JkZXIuICovXG4gIEBJbnB1dCgpIGNsYXNzZXM6IENsYXNzUHJlc2V0W10gPSBbXTtcbiAgLyoqIFJlZ2lvbiBjb3VudCBwZXIgY2xhc3MsIGtleWVkIGJ5IHtAbGluayBwcmVzZXRLZXl9IHVuZGVyIGBtYXRjaE1vZGVgLiAqL1xuICBASW5wdXQoKSBjb3VudHMgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICAvKiogSG93IGxhYmVscyBhcmUgbWF0Y2hlZCB0byBjbGFzc2VzIChrZXlzIHtAbGluayBjb3VudHN9KS4gKi9cbiAgQElucHV0KCkgbWF0Y2hNb2RlOiBNYXRjaE1vZGUgPSAnZXhhY3QnO1xuICAvKiogVGhlIGFjdGl2ZSBjbGFzcyAoaGlnaGxpZ2h0ZWQpLCBvciBudWxsLiAqL1xuICBASW5wdXQoKSBhY3RpdmVDbGFzczogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBUaGUgY2xhc3MgcGlja2VkIGxhc3QgKGluIHRoZSBjbGFzcyB0cmVlLCBvciBhIHN1cmZhY2UgaW4gM0QpOiBoaWdobGlnaHRlZCwgc2Nyb2xsZWQgaW50byB2aWV3LiAqL1xuICBASW5wdXQoKSBwaWNrZWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAvKiogQ2xhc3NlcyB3aXRoIGEgc2VsZWN0ZWQgcmVnaW9uIChtYXJrZWQpLiAqL1xuICBASW5wdXQoKSBtYXJrZWQ6IFJlYWRvbmx5U2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XG4gIC8qKiBOdW1iZXIgb2Ygc2VsZWN0ZWQgcmVnaW9ucyAoY2hhbmdlcyB3aGF0IGEgcm93IGNsaWNrIGRvZXMpLiAqL1xuICBASW5wdXQoKSBzZWxlY3RlZENvdW50ID0gMDtcbiAgLyoqIFRoZSBjbGFzcyByZWdpb25zIHJldmVydCB0bzsgaXQgY2FuJ3QgYmUgcmVtb3ZlZCB3aGlsZSBpbiB1c2UuICovXG4gIEBJbnB1dCgpIGRlZmF1bHRDbGFzc05hbWUgPSAnUmVnaW9uJztcbiAgLyoqIFdoZXRoZXIgYSB2b2x1bWUgdmlldyBpcyBvbiBzY3JlZW46IGVhY2ggY2xhc3MgY2FuIHRoZW4gYmUgc2hvd24gaW4gM0QuICovXG4gIEBJbnB1dCgpIHZvbHVtZSA9IGZhbHNlO1xuICAvKiogVGhlIGNsYXNzZXMgc2hvd24gaW4gM0QuICovXG4gIEBJbnB1dCgpIHNob3duM2Q6IFJlYWRvbmx5U2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XG4gIC8qKiBDbGFzc2VzIHRoYXQgY2FuIGJlIGRyYXduIGFzIGluZGl2aWR1YWwgY2VsbHMgaGVyZSAoYSAzRCBzZWdtZW50YXRpb24ncywgaW4gc3BhdGlhbCAzRCkuICovXG4gIEBJbnB1dCgpIGNlbGxhYmxlOiBSZWFkb25seVNldDxzdHJpbmc+ID0gbmV3IFNldCgpO1xuICAvKiogVGhvc2UgZHJhd24gYXMgaW5kaXZpZHVhbCBjZWxscyBub3cuICovXG4gIEBJbnB1dCgpIGluZGl2aWR1YWw6IFJlYWRvbmx5U2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XG4gIC8qKiBEcmF3IGEgY2xhc3MgKGl0cyBzdWJjbGFzc2VzIHdpdGggaXQpIGFzIGluZGl2aWR1YWwgY2VsbHMsIG9yIG1lcmdlZCBhZ2Fpbi4gKi9cbiAgQE91dHB1dCgpIHRvZ2dsZUNlbGxzID0gbmV3IEV2ZW50RW1pdHRlcjx7IGNsYXNzZXM6IHN0cmluZ1tdOyBpbmRpdmlkdWFsOiBib29sZWFuIH0+KCk7XG5cbiAgLyoqIFRoZSBjbGFzc2VzIGhpZGRlbiBmcm9tIHZpZXcuICovXG4gIEBJbnB1dCgpIGhpZGRlbjogUmVhZG9ubHlTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKTtcbiAgLyoqIEEgY2xhc3MncyBleWUgKGl0cyBuYW1lKTogaGlkZSBpdCwgb3Igc2hvdyBpdCBhZ2Fpbi4gKi9cbiAgQE91dHB1dCgpIHRvZ2dsZUhpZGRlbiA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICAvKiogQSBjbGFzcydzIDNEIHRvZ2dsZSAoaXRzIG5hbWUpLiAqL1xuICBAT3V0cHV0KCkgdG9nZ2xlM2QgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgLyoqIFdoZXRoZXIgdGhlIHByb2plY3RlZCBjbGFzcyB0cmVlIGlzIHNob3duIGluc3RlYWQgb2YgdGhlIGxpc3Q7IG51bGw6IHRoZXJlIGlzIG5vIHRyZWUuICovXG4gIEBJbnB1dCgpIHRyZWVWaWV3OiBib29sZWFuIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBUaGUgbGlzdCAvIHRyZWUgc3dpdGNoLiAqL1xuICBAT3V0cHV0KCkgdHJlZVZpZXdDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgLyoqIEEgcm93IHdhcyBjbGlja2VkOiBtYWtlIHRoZSBjbGFzcyBhY3RpdmUgLyBhcHBseSBpdCB0byB0aGUgc2VsZWN0aW9uLiAqL1xuICBAT3V0cHV0KCkgcGljayA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICAvKiogQSBjbGFzcydzIHN3YXRjaCBwaWNrZWQgYSBuZXcgY29sb3VyLiAqL1xuICBAT3V0cHV0KCkgcmVjb2xvciA9IG5ldyBFdmVudEVtaXR0ZXI8eyBuYW1lOiBzdHJpbmc7IGNvbG9yOiBzdHJpbmcgfT4oKTtcbiAgLyoqIEEgY2xhc3MncyB0cmFzaCBidXR0b24gKGl0cyBuYW1lKS4gKi9cbiAgQE91dHB1dCgpIHJlbW92ZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuICAvKiogTWFuYWdlIGNsaWNrZWQuICovXG4gIEBPdXRwdXQoKSBtYW5hZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgLyoqIHRyYWNrQnkgZm9yIHRoZSBjbGFzcyByb3dzIHNvIHJlLXNvcnRpbmcgZG9lc24ndCByZS1jcmVhdGUgdGhlIHBpY2tlcnMuICovXG4gIHByb3RlY3RlZCByZWFkb25seSB0cmFja0J5TmFtZSA9IChfOiBudW1iZXIsIGM6IENsYXNzUm93KTogc3RyaW5nID0+IGMubmFtZTtcblxuICAvKiogRXZlcnkgY2xhc3MncyByb3csIHJlYnVpbHQgd2hlbiBhbiBpbnB1dCBjaGFuZ2VzIHJhdGhlciB0aGFuIHBlciBjaGVjay4gKi9cbiAgcHJvdGVjdGVkIHJvd3M6IENsYXNzUm93W10gPSBbXTtcbiAgLyoqIFRoZSByb3dzIG1hdGNoaW5nIHtAbGluayBxdWVyeX0uICovXG4gIHByb3RlY3RlZCBzaG93blJvd3M6IENsYXNzUm93W10gPSBbXTtcbiAgLyoqIFRoZSBzZWFyY2ggYm94J3MgdGV4dC4gKi9cbiAgcHJvdGVjdGVkIHF1ZXJ5ID0gJyc7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBlbDogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4pIHt9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyA9IHt9KTogdm9pZCB7XG4gICAgdGhpcy5yb3dzID0gdGhpcy5jbGFzc2VzLm1hcCgoYykgPT4gKHtcbiAgICAgIG5hbWU6IGMubmFtZSxcbiAgICAgIGNvbG9yOiBjLmNvbG9yLFxuICAgICAgY291bnQ6IHRoaXMuY291bnQoYy5uYW1lKSxcbiAgICAgIGNhblJlbW92ZTogdGhpcy5jYW5SZW1vdmUoYy5uYW1lKSxcbiAgICAgIHJvd1Rvb2x0aXA6IHRoaXMucm93VG9vbHRpcChjLm5hbWUpLFxuICAgICAgcmVtb3ZlVG9vbHRpcDogdGhpcy5yZW1vdmVUb29sdGlwKGMubmFtZSksXG4gICAgfSkpO1xuICAgIHRoaXMuZmlsdGVyKCk7XG4gICAgaWYgKGNoYW5nZXNbJ3BpY2tlZCddICYmIHRoaXMucGlja2VkKVxuICAgICAgc2V0VGltZW91dCgoKSA9PiBzY3JvbGxUb1BpY2tlZCh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsICcuY2xhc3Mtcm93LnBpY2tlZCcpKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvblF1ZXJ5KHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnF1ZXJ5ID0gdmFsdWU7XG4gICAgdGhpcy5maWx0ZXIoKTtcbiAgfVxuXG4gIC8qKiBFbnRlciBpbiB0aGUgc2VhcmNoIGJveCBwaWNrcyB0aGUgZmlyc3QgbWF0Y2guICovXG4gIHByb3RlY3RlZCBwaWNrRmlyc3RNYXRjaCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5xdWVyeS50cmltKCkgJiYgdGhpcy5zaG93blJvd3MubGVuZ3RoKSB0aGlzLnBpY2suZW1pdCh0aGlzLnNob3duUm93c1swXS5uYW1lKTtcbiAgfVxuXG4gIHByaXZhdGUgZmlsdGVyKCk6IHZvaWQge1xuICAgIGNvbnN0IHEgPSB0aGlzLnF1ZXJ5LnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgIHRoaXMuc2hvd25Sb3dzID0gcSA/IHRoaXMucm93cy5maWx0ZXIoKHIpID0+IHIubmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHEpKSA6IHRoaXMucm93cztcbiAgfVxuXG4gIHByaXZhdGUgY291bnQobmFtZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5jb3VudHMuZ2V0KHByZXNldEtleSh7IG1hdGNoTW9kZTogdGhpcy5tYXRjaE1vZGUgfSwgbmFtZSkpID8/IDA7XG4gIH1cblxuICBwcml2YXRlIGNhblJlbW92ZShuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIShuYW1lID09PSB0aGlzLmRlZmF1bHRDbGFzc05hbWUgJiYgdGhpcy5jb3VudChuYW1lKSA+IDApO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJvd1Rvb2x0aXAobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZENvdW50XG4gICAgICA/IGBBcHBseSDigJwke25hbWV94oCdIHRvIHRoZSBzZWxlY3RlZCByZWdpb24ocylgXG4gICAgICA6IGBTZXQg4oCcJHtuYW1lfeKAnSBhY3RpdmUg4oCUIG5ldyByZWdpb25zIHVzZSBpdGA7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVtb3ZlVG9vbHRpcChuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGluVXNlID0gdGhpcy5jb3VudChuYW1lKSA+IDA7XG4gICAgaWYgKG5hbWUgPT09IHRoaXMuZGVmYXVsdENsYXNzTmFtZSAmJiBpblVzZSkgcmV0dXJuICdUaGUgZGVmYXVsdCBjbGFzcyBjYW5ub3QgYmUgcmVtb3ZlZCB3aGlsZSBpbiB1c2UnO1xuICAgIHJldHVybiBpblVzZSA/IGBSZW1vdmUgY2xhc3Mg4oCUIGl0cyByZWdpb25zIHJldmVydCB0byAke3RoaXMuZGVmYXVsdENsYXNzTmFtZX1gIDogJ1JlbW92ZSBjbGFzcyc7XG4gIH1cbn1cbiIsIjwhLS0gRG9ja2VkIFwiQ2xhc3Nlc1wiIHBhbmVsIChqaXQtdWkjNzApOiB0aGUgYWx3YXlzLXZpc2libGUgbGlzdCBvZiBhbm5vdGF0aW9uXG4gICAgIGNsYXNzZXMgYWJvdmUgdGhlIHJlZ2lvbnMgdGFibGUuIENsaWNrIGEgcm93IHRvIG1ha2UgaXQgdGhlIGFjdGl2ZSBjbGFzc1xuICAgICAobmV3IHJlZ2lvbnMgaW5oZXJpdCBpdDsgd2l0aCByb3dzIHNlbGVjdGVkIGl0IHJlLWNsYXNzaWZpZXMgdGhlbSk7IHJlY29sb3VyXG4gICAgIHZpYSB0aGUgc3dhdGNoOyB0aGUgYmFkZ2Ugc2hvd3MgaG93IG1hbnkgcmVnaW9ucyB1c2UgdGhlIGNsYXNzLiBcIk1hbmFnZVwiXG4gICAgIG9wZW5zIHRoZSBmdWxsIGVkaXRvciAoZmFsbGJhY2sgcGFsZXR0ZSwgYXV0by1hZGQsIG1hdGNoaW5nLCBpbXBvcnQvZXhwb3J0KS5cbiAgICAgQSByZWdpb24gc2V0IHdpdGggYSBjbGFzcyBoaWVyYXJjaHkgKGFuIGF0bGFzIG9udG9sb2d5KSBjYW4gc2hvdyBpdHMgY2xhc3Nlc1xuICAgICBhcyBhIHRyZWUgaW5zdGVhZCAocHJvamVjdGVkIGluIGJ5IHRoZSBlZGl0b3IpOyB0aGUgaGVhZGVyIHN3aXRjaGVzIHZpZXdzLiAtLT5cbjxkaXYgY2xhc3M9XCJjbGFzc2VzLXBhbmVsXCI+XG4gIDxkaXYgY2xhc3M9XCJjbGFzc2VzLXBhbmVsLWhlYWRlclwiPlxuICAgIDxzcGFuIGNsYXNzPVwiY2xhc3Nlcy1wYW5lbC10aXRsZVwiPkNsYXNzZXM8L3NwYW4+XG4gICAgPGJ1dHRvblxuICAgICAgKm5nSWY9XCJ0cmVlVmlldyAhPT0gbnVsbFwiXG4gICAgICBwQnV0dG9uXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIFtpY29uXT1cInRyZWVWaWV3ID8gJ3BpIHBpLWxpc3QnIDogJ3BpIHBpLXNpdGVtYXAnXCJcbiAgICAgIGNsYXNzPVwicC1idXR0b24tc20gcC1idXR0b24tdGV4dFwiXG4gICAgICBbcFRvb2x0aXBdPVwidHJlZVZpZXcgPyAnU2hvdyB0aGUgY2xhc3NlcyBhcyBhIGxpc3QnIDogJ1Nob3cgdGhlIGNsYXNzZXMgYXMgYSB0cmVlJ1wiXG4gICAgICB0b29sdGlwUG9zaXRpb249XCJib3R0b21cIlxuICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJ0cmVlVmlldyA/ICdTaG93IHRoZSBjbGFzc2VzIGFzIGEgbGlzdCcgOiAnU2hvdyB0aGUgY2xhc3NlcyBhcyBhIHRyZWUnXCJcbiAgICAgIChjbGljayk9XCJ0cmVlVmlld0NoYW5nZS5lbWl0KCF0cmVlVmlldylcIlxuICAgID48L2J1dHRvbj5cbiAgICA8YnV0dG9uXG4gICAgICBwQnV0dG9uXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIGljb249XCJwaSBwaS1jb2dcIlxuICAgICAgbGFiZWw9XCJNYW5hZ2VcIlxuICAgICAgY2xhc3M9XCJwLWJ1dHRvbi1zbSBwLWJ1dHRvbi10ZXh0XCJcbiAgICAgIHBUb29sdGlwPVwiTWFuYWdlIGNsYXNzZXMg4oCUIGFkZCAvIHJlbW92ZSwgcGFsZXR0ZSwgbWF0Y2hpbmcsIGltcG9ydC9leHBvcnRcIlxuICAgICAgdG9vbHRpcFBvc2l0aW9uPVwiYm90dG9tXCJcbiAgICAgIChjbGljayk9XCJtYW5hZ2UuZW1pdCgpXCJcbiAgICA+PC9idXR0b24+XG4gIDwvZGl2PlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwidHJlZVZpZXc7IGVsc2UgbGlzdFwiPjxuZy1jb250ZW50PjwvbmctY29udGVudD48L25nLWNvbnRhaW5lcj5cbiAgPG5nLXRlbXBsYXRlICNsaXN0PlxuICAgIDxpbnB1dFxuICAgICAgKm5nSWY9XCJjbGFzc2VzLmxlbmd0aFwiXG4gICAgICB0eXBlPVwidGV4dFwiXG4gICAgICBwSW5wdXRUZXh0XG4gICAgICBjbGFzcz1cInAtaW5wdXR0ZXh0LXNtIGNsYXNzZXMtc2VhcmNoXCJcbiAgICAgIHBsYWNlaG9sZGVyPVwiU2VhcmNoIGJ5IG5hbWVcIlxuICAgICAgYXJpYS1sYWJlbD1cIlNlYXJjaCB0aGUgY2xhc3Nlc1wiXG4gICAgICBbbmdNb2RlbF09XCJxdWVyeVwiXG4gICAgICAobmdNb2RlbENoYW5nZSk9XCJvblF1ZXJ5KCRldmVudClcIlxuICAgICAgKGtleWRvd24uZW50ZXIpPVwicGlja0ZpcnN0TWF0Y2goKVwiXG4gICAgLz5cbiAgICA8ZGl2IGNsYXNzPVwiY2xhc3Nlcy1wYW5lbC1ib2R5XCI+XG4gICAgICA8ZGl2XG4gICAgICAgICpuZ0Zvcj1cImxldCBjIG9mIHNob3duUm93czsgdHJhY2tCeTogdHJhY2tCeU5hbWVcIlxuICAgICAgICBjbGFzcz1cImNsYXNzLXJvd1wiXG4gICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiYWN0aXZlQ2xhc3MgPT09IGMubmFtZVwiXG4gICAgICAgIFtjbGFzcy5waWNrZWRdPVwicGlja2VkID09PSBjLm5hbWVcIlxuICAgICAgICBbY2xhc3MubWFya2VkXT1cIm1hcmtlZC5oYXMoYy5uYW1lKVwiXG4gICAgICAgIFtjbGFzcy5oaWRkZW4tY2xhc3NdPVwiaGlkZGVuLmhhcyhjLm5hbWUpXCJcbiAgICAgICAgKGNsaWNrKT1cInBpY2suZW1pdChjLm5hbWUpXCJcbiAgICAgICAgW3BUb29sdGlwXT1cImMucm93VG9vbHRpcFwiXG4gICAgICAgIHRvb2x0aXBQb3NpdGlvbj1cImJvdHRvbVwiXG4gICAgICA+XG4gICAgICAgIDxpXG4gICAgICAgICAgY2xhc3M9XCJwaSByb3ctZXllXCJcbiAgICAgICAgICBbbmdDbGFzc109XCJoaWRkZW4uaGFzKGMubmFtZSkgPyAncGktZXllLXNsYXNoJyA6ICdwaS1leWUnXCJcbiAgICAgICAgICByb2xlPVwiYnV0dG9uXCJcbiAgICAgICAgICBbYXR0ci5hcmlhLXByZXNzZWRdPVwiIWhpZGRlbi5oYXMoYy5uYW1lKVwiXG4gICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIoaGlkZGVuLmhhcyhjLm5hbWUpID8gJ1Nob3cgJyA6ICdIaWRlICcpICsgYy5uYW1lXCJcbiAgICAgICAgICBbcFRvb2x0aXBdPVwiaGlkZGVuLmhhcyhjLm5hbWUpID8gJ1Nob3cgdGhpcyBjbGFzcycgOiAnSGlkZSB0aGlzIGNsYXNzJ1wiXG4gICAgICAgICAgdG9vbHRpcFBvc2l0aW9uPVwiYm90dG9tXCJcbiAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyB0b2dnbGVIaWRkZW4uZW1pdChjLm5hbWUpXCJcbiAgICAgICAgPjwvaT5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJyb3ctc3dhdGNoXCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxuICAgICAgICAgIDxoZXgtY29sb3ItcGlja2VyIFtjb2xvcl09XCJjLmNvbG9yXCIgKGNvbG9yQ2hhbmdlKT1cInJlY29sb3IuZW1pdCh7IG5hbWU6IGMubmFtZSwgY29sb3I6ICRldmVudCB9KVwiPlxuICAgICAgICAgIDwvaGV4LWNvbG9yLXBpY2tlcj5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInJvdy1uYW1lXCI+e3sgYy5uYW1lIH19PC9zcGFuPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInJvdy1jb3VudFwiIFtjbGFzcy56ZXJvXT1cImMuY291bnQgPT09IDBcIj57eyBjLmNvdW50IH19PC9zcGFuPlxuICAgICAgICA8aVxuICAgICAgICAgICpuZ0lmPVwidm9sdW1lXCJcbiAgICAgICAgICBjbGFzcz1cInBpIHBpLWJveCByb3ctM2RcIlxuICAgICAgICAgIFtjbGFzcy5vbl09XCJzaG93bjNkLmhhcyhjLm5hbWUpXCJcbiAgICAgICAgICByb2xlPVwiYnV0dG9uXCJcbiAgICAgICAgICBbYXR0ci5hcmlhLXByZXNzZWRdPVwic2hvd24zZC5oYXMoYy5uYW1lKVwiXG4gICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInU2hvdyAnICsgYy5uYW1lICsgJyBpbiAzRCdcIlxuICAgICAgICAgIHBUb29sdGlwPVwiU2hvdyBpbiB0aGUgdm9sdW1lLCBpbiAzRFwiXG4gICAgICAgICAgdG9vbHRpcFBvc2l0aW9uPVwiYm90dG9tXCJcbiAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyB0b2dnbGUzZC5lbWl0KGMubmFtZSlcIlxuICAgICAgICA+PC9pPlxuICAgICAgICA8aVxuICAgICAgICAgICpuZ0lmPVwidm9sdW1lICYmIGNlbGxhYmxlLmhhcyhjLm5hbWUpXCJcbiAgICAgICAgICBjbGFzcz1cInBpIHBpLXRoLWxhcmdlIHJvdy0zZCByb3ctY2VsbHNcIlxuICAgICAgICAgIFtjbGFzcy5vbl09XCJpbmRpdmlkdWFsLmhhcyhjLm5hbWUpXCJcbiAgICAgICAgICByb2xlPVwiYnV0dG9uXCJcbiAgICAgICAgICBbYXR0ci5hcmlhLXByZXNzZWRdPVwiaW5kaXZpZHVhbC5oYXMoYy5uYW1lKVwiXG4gICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInU2hvdyAnICsgYy5uYW1lICsgJyBhcyBpbmRpdmlkdWFsIGNlbGxzJ1wiXG4gICAgICAgICAgW3BUb29sdGlwXT1cImluZGl2aWR1YWwuaGFzKGMubmFtZSkgPyAnU2hvdyBhcyBvbmUgc3VyZmFjZScgOiAnU2hvdyBlYWNoIGNlbGwgYnkgaXRzZWxmJ1wiXG4gICAgICAgICAgdG9vbHRpcFBvc2l0aW9uPVwiYm90dG9tXCJcbiAgICAgICAgICAoY2xpY2spPVwiXG4gICAgICAgICAgICAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IHRvZ2dsZUNlbGxzLmVtaXQoeyBjbGFzc2VzOiBbYy5uYW1lXSwgaW5kaXZpZHVhbDogIWluZGl2aWR1YWwuaGFzKGMubmFtZSkgfSlcbiAgICAgICAgICBcIlxuICAgICAgICA+PC9pPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgcEJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIGljb249XCJwaSBwaS10cmFzaFwiXG4gICAgICAgICAgY2xhc3M9XCJwLWJ1dHRvbi1zbSBwLWJ1dHRvbi10ZXh0IHAtYnV0dG9uLXdhcm5pbmcgcm93LWRlbFwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cIiFjLmNhblJlbW92ZVwiXG4gICAgICAgICAgW3BUb29sdGlwXT1cImMucmVtb3ZlVG9vbHRpcFwiXG4gICAgICAgICAgdG9vbHRpcFBvc2l0aW9uPVwiYm90dG9tXCJcbiAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidSZW1vdmUgY2xhc3MgJyArIGMubmFtZVwiXG4gICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgcmVtb3ZlLmVtaXQoYy5uYW1lKVwiXG4gICAgICAgID48L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiAqbmdJZj1cIiFjbGFzc2VzLmxlbmd0aFwiIGNsYXNzPVwiY2xhc3Nlcy1lbXB0eVwiPk5vIGNsYXNzZXMgeWV0IOKAlCBhZGQgb25lIGZyb20gTWFuYWdlLjwvZGl2PlxuICAgICAgPGRpdiAqbmdJZj1cImNsYXNzZXMubGVuZ3RoICYmICFzaG93blJvd3MubGVuZ3RoXCIgY2xhc3M9XCJjbGFzc2VzLWVtcHR5XCI+Tm8gY2xhc3MgbWF0Y2hlcy48L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9uZy10ZW1wbGF0ZT5cbjwvZGl2PlxuIl19
|