@firestitch/report 18.12.0 → 18.13.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.
Files changed (40) hide show
  1. package/app/reports/components/component-grid/component-grid.component.d.ts +5 -1
  2. package/app/reports/components/component-grid/report-grid-cell.pipe.d.ts +11 -0
  3. package/app/reports/components/report-component/report-component.component.d.ts +0 -1
  4. package/app/reports/export/report-export-collector.service.d.ts +8 -1
  5. package/app/reports/export/report-filter-lines.d.ts +2 -0
  6. package/app/reports/export/report-grid-export.d.ts +20 -0
  7. package/app/reports/export/report-pdf.service.d.ts +2 -0
  8. package/app/reports/export/report-pptx.service.d.ts +1 -0
  9. package/app/reports/group-by.d.ts +3 -0
  10. package/app/reports/interfaces/report-export-snapshot.interface.d.ts +2 -0
  11. package/app/reports/interfaces/report.interface.d.ts +7 -0
  12. package/app/reports/report-filter-items.d.ts +1 -1
  13. package/app/reports/report-grid-layout.d.ts +8 -2
  14. package/app/reports/services/report-filter-state.service.d.ts +8 -1
  15. package/app/reports/tile-data-state.d.ts +2 -2
  16. package/esm2022/app/reports/components/component-grid/component-grid.component.mjs +34 -7
  17. package/esm2022/app/reports/components/component-grid/report-grid-cell.pipe.mjs +41 -0
  18. package/esm2022/app/reports/components/report-component/report-component.component.mjs +15 -19
  19. package/esm2022/app/reports/data/report.data.mjs +3 -3
  20. package/esm2022/app/reports/export/report-export-collector.service.mjs +72 -7
  21. package/esm2022/app/reports/export/report-filter-lines.mjs +68 -1
  22. package/esm2022/app/reports/export/report-grid-export.mjs +48 -0
  23. package/esm2022/app/reports/export/report-pdf.service.mjs +47 -17
  24. package/esm2022/app/reports/export/report-pptx.service.mjs +48 -4
  25. package/esm2022/app/reports/group-by.mjs +13 -0
  26. package/esm2022/app/reports/interfaces/report-export-snapshot.interface.mjs +1 -1
  27. package/esm2022/app/reports/interfaces/report.interface.mjs +1 -1
  28. package/esm2022/app/reports/report-filter-items.mjs +9 -7
  29. package/esm2022/app/reports/report-grid-layout.mjs +57 -4
  30. package/esm2022/app/reports/services/report-filter-state.service.mjs +124 -38
  31. package/esm2022/app/reports/tile-data-state.mjs +12 -17
  32. package/esm2022/app/reports/views/report/fs-ai-report.component.mjs +2 -2
  33. package/esm2022/app/reports/views/report/report.component.mjs +2 -2
  34. package/fesm2022/{firestitch-report-echarts-CoaGXKET.mjs → firestitch-report-echarts-EecIloKo.mjs} +2 -2
  35. package/fesm2022/{firestitch-report-echarts-CoaGXKET.mjs.map → firestitch-report-echarts-EecIloKo.mjs.map} +1 -1
  36. package/fesm2022/{firestitch-report-firestitch-report-CHPA7sla.mjs → firestitch-report-firestitch-report-DbdLxQSE.mjs} +566 -116
  37. package/fesm2022/firestitch-report-firestitch-report-DbdLxQSE.mjs.map +1 -0
  38. package/fesm2022/firestitch-report.mjs +1 -1
  39. package/package.json +2 -2
  40. package/fesm2022/firestitch-report-firestitch-report-CHPA7sla.mjs.map +0 -1
@@ -1,5 +1,5 @@
1
1
  import { OnInit } from '@angular/core';
2
- import { GridLayout } from '@firestitch/grid';
2
+ import { GridExpansion, GridLayout } from '@firestitch/grid';
3
3
  import { ReportGridSource } from '../../data/report-grid-source';
4
4
  import { ReportGridParams } from '../../interfaces/report-grid-params.interface';
5
5
  import { ReportComponent } from '../../interfaces/report.interface';
@@ -11,7 +11,10 @@ export declare class ComponentGridComponent implements OnInit {
11
11
  readonly controls: import("@angular/core").Signal<import("@firestitch/grid").GridControls>;
12
12
  readonly source: import("@angular/core").Signal<ReportGridSource>;
13
13
  readonly layout: import("@angular/core").Signal<GridLayout>;
14
+ readonly clearedFilter: import("@angular/core").Signal<import("@firestitch/grid").GridClearedFilter>;
15
+ readonly expansion: import("@angular/core").WritableSignal<GridExpansion>;
14
16
  readonly noteData: import("@angular/core").Signal<import("../../interfaces/report-grid-report.interface").ReportGridReport>;
17
+ readonly formatContext: import("@angular/core").Signal<import("../../interfaces/report.interface").ReportFormatContext>;
15
18
  readonly formatter: import("@angular/core").Signal<import("@firestitch/grid").GridFormatter>;
16
19
  private readonly _componentId;
17
20
  private _reportData;
@@ -20,6 +23,7 @@ export declare class ComponentGridComponent implements OnInit {
20
23
  private _paramsVersion;
21
24
  ngOnInit(): void;
22
25
  setLayout(layout: GridLayout): void;
26
+ setExpansion(expansion: GridExpansion | undefined): void;
23
27
  private _init;
24
28
  private _settled$;
25
29
  private _applyParams;
@@ -0,0 +1,11 @@
1
+ import { PipeTransform } from '@angular/core';
2
+ import { GridField } from '@firestitch/grid';
3
+ import { FormattedOutputValue } from '../../format';
4
+ import { ReportGridReport } from '../../interfaces/report-grid-report.interface';
5
+ import { ReportFormatContext } from '../../interfaces/report.interface';
6
+ import * as i0 from "@angular/core";
7
+ export declare class ReportGridCellPipe implements PipeTransform {
8
+ transform(value: unknown, field: GridField | null, record: Record<string, unknown> | undefined, text: string, report: ReportGridReport | null, format: ReportFormatContext): FormattedOutputValue;
9
+ static ɵfac: i0.ɵɵFactoryDeclaration<ReportGridCellPipe, never>;
10
+ static ɵpipe: i0.ɵɵPipeDeclaration<ReportGridCellPipe, "fsReportGridCell", true>;
11
+ }
@@ -102,7 +102,6 @@ export declare class ReportComponentComponent implements OnInit, OnChanges {
102
102
  private _origin;
103
103
  private _track;
104
104
  private _emitGeometry;
105
- private get _isTimeSeries();
106
105
  private get _heightAuto();
107
106
  get heightAuto(): boolean;
108
107
  private _inches;
@@ -1,3 +1,4 @@
1
+ import { GridTable } from '@firestitch/grid';
1
2
  import { Observable } from 'rxjs';
2
3
  import { ReportExportLine } from '../interfaces/report-export-line.interface';
3
4
  import { ReportExportSnapshot } from '../interfaces/report-export-snapshot.interface';
@@ -12,6 +13,9 @@ export interface CollectedComponent {
12
13
  search?: string;
13
14
  hiddenColumns: string[];
14
15
  crumbs?: string[];
16
+ table?: GridTable;
17
+ tableNotes?: string[];
18
+ filtered?: boolean;
15
19
  }
16
20
  export interface CollectedPage {
17
21
  page: ReportPage;
@@ -67,7 +71,7 @@ export interface KpiExportParts {
67
71
  }
68
72
  export declare const HEADER_FOOTER_NAME = "Header & footer";
69
73
  export declare function emptyLabel(item: CollectedComponent): string;
70
- export declare function exportTitle(component: ReportComponent, tokens: TextTokenContext, search?: string | null, crumbs?: readonly string[] | null): string;
74
+ export declare function exportTitle(component: ReportComponent, tokens: TextTokenContext, search?: string | null, crumbs?: readonly string[] | null, filtered?: boolean): string;
71
75
  export declare function isFailed(item: CollectedComponent): boolean;
72
76
  export declare function textOverflow(component: ReportComponent, page: string, tokens: TextTokenContext): TextOverflow;
73
77
  export declare function coverLines(collected: CollectedReport): string[];
@@ -79,6 +83,7 @@ export declare function listHeadings(component: ReportComponent, data: Component
79
83
  export declare function listTotalsRow(data: ComponentData, columns: readonly ExportListColumn[], timezone: string, context: ReportFormatContext): string[] | null;
80
84
  export declare function exportWindowsLine(item: CollectedComponent, timezone: string, locale: ReportLocaleTag): string;
81
85
  export declare function exportNoteLines(item: CollectedComponent, timezone: string, locale: ReportLocaleTag): string[];
86
+ export declare function isEmptyTile(item: CollectedComponent): boolean;
82
87
  export declare function kpiCardHasExtras(view: KpiCardView, notes: readonly string[]): boolean;
83
88
  export declare function kpiExportParts(view: KpiCardView, notes: readonly string[], available: number, heights: KpiExportHeights): KpiExportParts;
84
89
  export declare function scaledKpiHeights(heights: KpiExportHeights, scale: number): KpiExportHeights;
@@ -99,6 +104,8 @@ export declare class ReportExportCollectorService {
99
104
  private _valuesJobs;
100
105
  private _runJob;
101
106
  private _componentData;
107
+ private _tileState;
108
+ private _gridTable;
102
109
  private _collected;
103
110
  private _groupValues;
104
111
  private _pageValues;
@@ -1,3 +1,4 @@
1
+ import { GridField, GridFilter } from '@firestitch/grid';
1
2
  import { Observable } from 'rxjs';
2
3
  import { ReportDrillStep } from '../interfaces/report-drill-step.interface';
3
4
  import { ReportExportLine } from '../interfaces/report-export-line.interface';
@@ -17,3 +18,4 @@ export declare function matchLineText(match: ReportFilterMatch | null | undefine
17
18
  export declare function drillLineText(component: Pick<ReportComponent, 'title'>, path: readonly ReportDrillStep[], formatContext: Pick<ReportFormatContext, 'locale'>): string;
18
19
  export declare function exportLines(input: ReportExportLinesInput): Observable<ReportExportLine[]>;
19
20
  export declare function exportGroups(report: Report, pageId: number | null): ReportFilterGroup[];
21
+ export declare function gridFilterLineText(label: string, filter: GridFilter, field: GridField | undefined, locale: ReportFormatContext['locale']): string | null;
@@ -0,0 +1,20 @@
1
+ import { GridLayout, GridTable } from '@firestitch/grid';
2
+ import { ReportFormatContext } from '../interfaces/report.interface';
3
+ export declare const GRID_EXPORT_COLUMNS = 60;
4
+ export interface GridExportCell {
5
+ text: string;
6
+ colSpan: number;
7
+ rowSpan: number;
8
+ bold: boolean;
9
+ indent: number;
10
+ numeric: boolean;
11
+ }
12
+ export interface GridExportTable {
13
+ head: GridExportCell[][];
14
+ body: GridExportCell[][];
15
+ foot: GridExportCell[] | null;
16
+ numeric: boolean[];
17
+ moreRows: number;
18
+ }
19
+ export declare function gridExportTable(table: GridTable): GridExportTable;
20
+ export declare function gridExportNotes(table: GridTable, layout: GridLayout, locale: ReportFormatContext['locale']): string[];
@@ -33,6 +33,8 @@ export declare class ReportPdfService {
33
33
  private _componentTitle;
34
34
  private _boxNote;
35
35
  private _renderTable;
36
+ private _listCells;
37
+ private _gridCells;
36
38
  private _tableCells;
37
39
  private _tableOptions;
38
40
  private _noticeRow;
@@ -47,6 +47,7 @@ export declare class ReportPptxService {
47
47
  private _categoryTitleOptions;
48
48
  private _valueAxisRangeOptions;
49
49
  private _renderTable;
50
+ private _renderGridTable;
50
51
  private _renderKpi;
51
52
  private _kpiDelta;
52
53
  private _estimatedWidth;
@@ -0,0 +1,3 @@
1
+ import { ReportComponent } from './interfaces/report.interface';
2
+ export declare function isTimeSeriesChart(component: ReportComponent): boolean;
3
+ export declare function followsGroupBy(component: ReportComponent): boolean;
@@ -1,3 +1,4 @@
1
+ import { GridExpansion } from '@firestitch/grid';
1
2
  import { ReportStateSnapshot } from './report-state-snapshot.interface';
2
3
  import { ReportViewerFeature } from './report-viewer-feature.type';
3
4
  import { ChartGranularity, ComponentDataState, FilterGroupValue, ReportFormatContext, ReportRelativeRange, ResolvedFilterValue } from './report.interface';
@@ -8,6 +9,7 @@ export interface ReportExportSnapshot {
8
9
  filters: Record<number, ResolvedFilterValue[]>;
9
10
  valueFilters: Record<number, ResolvedFilterValue[]>;
10
11
  states: Record<number, ComponentDataState>;
12
+ gridExpansions?: Record<number, GridExpansion>;
11
13
  frequency: ChartGranularity | null;
12
14
  features: ReportViewerFeature[];
13
15
  formatContext: ReportFormatContext;
@@ -1,3 +1,4 @@
1
+ import { GridLayout } from '@firestitch/grid';
1
2
  import { ReportChangePolarity } from '../enums/report-change-polarity.enum';
2
3
  import { ReportChartColor } from '../enums/report-chart-color.enum';
3
4
  import { ReportChartDataLabels } from '../enums/report-chart-data-labels.enum';
@@ -98,6 +99,11 @@ export interface ReportComponent {
98
99
  sql: string | null;
99
100
  config: ChartConfig & ListConfig & GridConfig & KpiConfig & TextConfig & ValueConfig & ComponentLayoutConfig & Record<string, unknown>;
100
101
  filters: ReportFilter[];
102
+ followsGroupBy?: ReportGroupByField | null;
103
+ }
104
+ export interface ReportGroupByField {
105
+ field: string;
106
+ granularity: ChartGranularity | null;
101
107
  }
102
108
  export interface ReportComponentSql {
103
109
  sql: string | null;
@@ -324,6 +330,7 @@ export interface ComponentDataState {
324
330
  hiddenColumns?: string[];
325
331
  drill?: ReportDrillStep[];
326
332
  matchAnyGroupIds?: number[];
333
+ layout?: GridLayout;
327
334
  unchangedIfUnreached?: true;
328
335
  }
329
336
  export interface ComponentData {
@@ -39,7 +39,7 @@ export declare function matchFromQuery(query: Record<string, unknown>): ReportFi
39
39
  export declare const LIST_SEARCH_ITEM = "listSearch";
40
40
  export declare const LIST_SEARCH_MAX_LENGTH = 100;
41
41
  export declare function listSearchItem(value: string | null): IFilterConfigItem;
42
- export declare function hasTimeSeriesChart(report: Report | null): boolean;
42
+ export declare function hasGroupByTile(report: Report | null): boolean;
43
43
  export declare function isGranularityOffered(report: Report, granularity: ChartGranularity | null): boolean;
44
44
  export declare function groupByFilterItem(report: Report, initial?: ChartGranularity | null): IFilterConfigItem | null;
45
45
  export declare function groupBySignature(report: Report | null): string;
@@ -1,4 +1,10 @@
1
- import { GridLayout } from '@firestitch/grid';
2
- import { ReportComponent } from './interfaces/report.interface';
1
+ import { GridClearedFilter, GridGranularity, GridLayout } from '@firestitch/grid';
2
+ import { ChartGranularity, ReportComponent } from './interfaces/report.interface';
3
+ export declare const GRID_GRANULARITIES: Record<ChartGranularity, GridGranularity>;
3
4
  export declare function authoredGridLayout(component: ReportComponent): GridLayout;
4
5
  export declare function gridLayoutKey(layout: GridLayout): string;
6
+ export declare function rebasedGridLayout(session: GridLayout, base: string, authored: GridLayout): GridLayout;
7
+ export declare function grainedGridLayout(layout: GridLayout, field: string, granularity: ChartGranularity): {
8
+ layout: GridLayout;
9
+ cleared: GridClearedFilter | null;
10
+ };
@@ -1,4 +1,4 @@
1
- import { GridLayout } from '@firestitch/grid';
1
+ import { GridClearedFilter, GridExpansion, GridLayout } from '@firestitch/grid';
2
2
  import { Observable } from 'rxjs';
3
3
  import { ReportChatViewerFilter } from '../interfaces/report-chat-viewer-filter.interface';
4
4
  import { ReportDrillStep } from '../interfaces/report-drill-step.interface';
@@ -51,6 +51,8 @@ export declare class ReportFilterStateService {
51
51
  private _drills;
52
52
  private _drillChanged$;
53
53
  private _gridLayouts;
54
+ private _gridExpansions;
55
+ private _gridClearedFilters;
54
56
  private _temporary;
55
57
  init(report: Report): void;
56
58
  value(groupId: number): FilterGroupValue | undefined;
@@ -87,6 +89,9 @@ export declare class ReportFilterStateService {
87
89
  gridLayout(component: ReportComponent): GridLayout;
88
90
  gridSessionLayout(component: ReportComponent): GridLayout | null;
89
91
  setGridLayout(component: ReportComponent, layout: GridLayout): void;
92
+ gridClearedFilter(component: ReportComponent): GridClearedFilter | null;
93
+ gridExpansion(component: ReportComponent): GridExpansion | undefined;
94
+ setGridExpansion(component: ReportComponent, expansion: GridExpansion | undefined): void;
90
95
  snapshot(): ReportStateSnapshot;
91
96
  authoredConfig(): ReportStateSnapshot;
92
97
  resetToDefaults(): void;
@@ -108,6 +113,8 @@ export declare class ReportFilterStateService {
108
113
  private _snapshotTiles;
109
114
  private _seedAuthored;
110
115
  private _clearTiles;
116
+ private _putGridLayout;
117
+ private _grainGridLayouts;
111
118
  private _setDrillPath;
112
119
  private _notifyReset;
113
120
  private _tiles;
@@ -1,7 +1,7 @@
1
+ import { GridLayout } from '@firestitch/grid';
1
2
  import { ReportStateSnapshot } from './interfaces/report-state-snapshot.interface';
2
3
  import { ComponentDataState, Report, ReportComponent } from './interfaces/report.interface';
3
- export declare function isTimeSeriesChart(component: ReportComponent): boolean;
4
4
  export declare function tileDataState(report: Report | null, component: ReportComponent, snapshot: ReportStateSnapshot): ComponentDataState;
5
- export declare function zipExportStates(report: Report, snapshot: ReportStateSnapshot, pageId?: number | null): Record<number, ComponentDataState>;
5
+ export declare function zipExportStates(report: Report, snapshot: ReportStateSnapshot, pageId?: number | null, gridLayout?: (component: ReportComponent) => GridLayout | null): Record<number, ComponentDataState>;
6
6
  export declare function valuesMatchAnyGroupIds(report: Report | null, layerId: number | null, snapshot: ReportStateSnapshot): number[];
7
7
  export declare function tilePageId(report: Report, component: ReportComponent, snapshot: ReportStateSnapshot): number | null;
@@ -1,12 +1,14 @@
1
1
  import { ChangeDetectionStrategy, Component, DestroyRef, computed, inject, input, signal, } from '@angular/core';
2
2
  import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
3
- import { FsGridComponent } from '@firestitch/grid';
3
+ import { FsGridCellDirective, FsGridComponent } from '@firestitch/grid';
4
4
  import { filter, map, of, switchMap, tap, timer } from 'rxjs';
5
5
  import { ReportData } from '../../data/report.data';
6
6
  import { ReportGridSource } from '../../data/report-grid-source';
7
+ import { followsGroupBy } from '../../group-by';
7
8
  import { ReportFilterStateService } from '../../services/report-filter-state.service';
8
9
  import { TILE_REFRESH_DEBOUNCE_MS } from '../../tile-loads';
9
10
  import { ComponentNoteComponent } from '../component-note/component-note.component';
11
+ import { ReportGridCellPipe } from './report-grid-cell.pipe';
10
12
  import { reportGridFormatter } from './report-grid-formatter';
11
13
  import * as i0 from "@angular/core";
12
14
  // A grid tile: fs-grid over the tile's rows, read through ReportGridSource.
@@ -18,12 +20,20 @@ import * as i0 from "@angular/core";
18
20
  // under an older state version is dropped.
19
21
  // - The layout on screen is the state service's (gridLayout): the viewer's
20
22
  // own while they changed it from the layout authored now, else the
21
- // authored one. It outlives a page switch, and the chat reads it.
23
+ // authored one. It outlives a page switch, and the chat reads it. So do
24
+ // the groups the viewer left open (gridExpansion), which a Clear leaves.
22
25
  // - A state version move (Clear filters, a saved filter) skips the wait; the
23
26
  // reset has put the authored layout back in the same tick, so it costs one
24
27
  // read.
28
+ // - A table that follows the report's group-by (followsGroupBy) sends its
29
+ // grain, and reads again at once when it changes. The state service has
30
+ // moved its filter on the group-by's field to the new grain by then, or
31
+ // taken it out (clearedFilter, which the status line names), so one read
32
+ // goes out and nothing paints unfiltered.
25
33
  // - fs-grid compares the layout and params by value: a cloned value never
26
34
  // reads again.
35
+ // - An output's detail cell is drawn by fsReportGridCell, so a change tells
36
+ // a missing prior from a zero one and says why on hover, as a list does.
27
37
  export class ComponentGridComponent {
28
38
  reportId = input.required();
29
39
  component = input.required();
@@ -33,7 +43,11 @@ export class ComponentGridComponent {
33
43
  locale: () => this._filterState.formatContext().locale,
34
44
  }));
35
45
  layout = computed(() => this._filterState.gridLayout(this.component()));
46
+ clearedFilter = computed(() => this._filterState.gridClearedFilter(this.component()));
47
+ // Read once: fs-grid owns the open groups from then on and writes them out.
48
+ expansion = signal(undefined);
36
49
  noteData = computed(() => this.source().report());
50
+ formatContext = computed(() => this._filterState.formatContext());
37
51
  formatter = computed(() => reportGridFormatter({
38
52
  format: this._filterState.formatContext(),
39
53
  timezone: this._filterState.timezone(),
@@ -46,17 +60,26 @@ export class ComponentGridComponent {
46
60
  // The state version the params on screen were read under.
47
61
  _paramsVersion = 0;
48
62
  ngOnInit() {
63
+ this.expansion.set(this._filterState.gridExpansion(this.component()));
49
64
  this._init();
50
65
  }
51
66
  setLayout(layout) {
52
67
  this._filterState.setGridLayout(this.component(), layout);
53
68
  }
69
+ setExpansion(expansion) {
70
+ this._filterState.setGridExpansion(this.component(), expansion);
71
+ }
54
72
  _init() {
55
73
  this._paramsVersion = this._filterState.stateVersion();
56
74
  this.params.set(this._readParams());
57
75
  this._filterState.changesFor(this.component())
58
76
  .pipe(switchMap(() => this._settled$()), tap(() => this._applyParams()), takeUntilDestroyed(this._destroyRef))
59
77
  .subscribe();
78
+ if (followsGroupBy(this.component())) {
79
+ this._filterState.frequencyChanges()
80
+ .pipe(takeUntilDestroyed(this._destroyRef))
81
+ .subscribe(() => this._applyParams());
82
+ }
60
83
  }
61
84
  // A change, once it has settled: at once when the state version moved,
62
85
  // else after the debounce; dropped when the version moves while it waits,
@@ -71,23 +94,27 @@ export class ComponentGridComponent {
71
94
  this._paramsVersion = this._filterState.stateVersion();
72
95
  this.params.set(this._readParams());
73
96
  }
74
- // The tile's report filters and 'any' groups as they stand.
97
+ // The tile's report filters, 'any' groups and group-by grain as they stand
98
+ // (tileState()).
75
99
  _readParams() {
76
100
  const component = this.component();
77
- const matchAnyGroupIds = this._filterState.tileState(component).matchAnyGroupIds;
101
+ const { matchAnyGroupIds, frequency } = this._filterState.tileState(component);
78
102
  return {
79
103
  filters: this._filterState.resolveForComponent(component),
80
104
  ...(matchAnyGroupIds?.length ? { matchAnyGroupIds } : {}),
105
+ ...(frequency ? { frequency } : {}),
81
106
  };
82
107
  }
83
108
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ComponentGridComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
84
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ComponentGridComponent, isStandalone: true, selector: "app-report-component-grid", inputs: { reportId: { classPropertyName: "reportId", publicName: "reportId", isSignal: true, isRequired: true, transformFunction: null }, component: { classPropertyName: "component", publicName: "component", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: "<!-- The comparison and window note strip above the table, from the report\n line of the latest read; the windows' descriptions and notes go in each\n column's \"About this column\" instead. -->\n<div class=\"fs-column grid-pane\">\n <app-report-component-note\n [data]=\"noteData()\"\n [windowNotes]=\"false\">\n </app-report-component-note>\n <!-- The params are seeded before the first render, so the grid's first read\n carries the tile's report filters. -->\n @if (params(); as params) {\n <fs-grid\n class=\"fs-flex\"\n [source]=\"source()\"\n [layout]=\"layout()\"\n [params]=\"params\"\n [controls]=\"controls()\"\n [formatter]=\"formatter()\"\n (layoutChange)=\"setLayout($event)\">\n </fs-grid>\n }\n</div>\n", styles: [":host{display:block;height:100%}.grid-pane{height:100%;min-height:0}fs-grid{min-height:0}\n"], dependencies: [{ kind: "component", type: FsGridComponent, selector: "fs-grid", inputs: ["source", "layout", "controls", "params", "expansion", "panel", "editorOpen", "formatter", "clearedFilter"], outputs: ["layoutChange", "expansionChange", "panelChange", "editorOpenChange"] }, { kind: "component", type: ComponentNoteComponent, selector: "app-report-component-note", inputs: ["data", "windows", "windowDescriptions", "windowNotes"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
109
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ComponentGridComponent, isStandalone: true, selector: "app-report-component-grid", inputs: { reportId: { classPropertyName: "reportId", publicName: "reportId", isSignal: true, isRequired: true, transformFunction: null }, component: { classPropertyName: "component", publicName: "component", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: "<!-- The comparison and window note strip above the table, from the report\n line of the latest read; the windows' descriptions and notes go in each\n column's \"About this column\" instead. -->\n<div class=\"fs-column grid-pane\">\n <app-report-component-note\n [data]=\"noteData()\"\n [windowNotes]=\"false\">\n </app-report-component-note>\n <!-- The params are seeded before the first render, so the grid's first read\n carries the tile's report filters. -->\n @if (params(); as params) {\n <fs-grid\n class=\"fs-flex\"\n [source]=\"source()\"\n [layout]=\"layout()\"\n [expansion]=\"expansion()\"\n [clearedFilter]=\"clearedFilter()\"\n (expansionChange)=\"setExpansion($event)\"\n [params]=\"params\"\n [controls]=\"controls()\"\n [formatter]=\"formatter()\"\n (layoutChange)=\"setLayout($event)\">\n <ng-template fsGridCell let-value let-field=\"field\" let-record=\"record\" let-text=\"text\">\n @if (value | fsReportGridCell: field : record : text : noteData() : formatContext(); as shown) {\n <span [attr.title]=\"shown.title\">{{ shown.text }}</span>\n }\n </ng-template>\n </fs-grid>\n }\n</div>\n", styles: [":host{display:block;height:100%}.grid-pane{height:100%;min-height:0}fs-grid{min-height:0}\n"], dependencies: [{ kind: "component", type: FsGridComponent, selector: "fs-grid", inputs: ["source", "layout", "controls", "params", "expansion", "panel", "editorOpen", "formatter", "clearedFilter"], outputs: ["layoutChange", "expansionChange", "panelChange", "editorOpenChange"] }, { kind: "directive", type: FsGridCellDirective, selector: "[fsGridCell]" }, { kind: "component", type: ComponentNoteComponent, selector: "app-report-component-note", inputs: ["data", "windows", "windowDescriptions", "windowNotes"] }, { kind: "pipe", type: ReportGridCellPipe, name: "fsReportGridCell" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
85
110
  }
86
111
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ComponentGridComponent, decorators: [{
87
112
  type: Component,
88
113
  args: [{ selector: 'app-report-component-grid', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
89
114
  FsGridComponent,
115
+ FsGridCellDirective,
90
116
  ComponentNoteComponent,
91
- ], template: "<!-- The comparison and window note strip above the table, from the report\n line of the latest read; the windows' descriptions and notes go in each\n column's \"About this column\" instead. -->\n<div class=\"fs-column grid-pane\">\n <app-report-component-note\n [data]=\"noteData()\"\n [windowNotes]=\"false\">\n </app-report-component-note>\n <!-- The params are seeded before the first render, so the grid's first read\n carries the tile's report filters. -->\n @if (params(); as params) {\n <fs-grid\n class=\"fs-flex\"\n [source]=\"source()\"\n [layout]=\"layout()\"\n [params]=\"params\"\n [controls]=\"controls()\"\n [formatter]=\"formatter()\"\n (layoutChange)=\"setLayout($event)\">\n </fs-grid>\n }\n</div>\n", styles: [":host{display:block;height:100%}.grid-pane{height:100%;min-height:0}fs-grid{min-height:0}\n"] }]
117
+ ReportGridCellPipe,
118
+ ], template: "<!-- The comparison and window note strip above the table, from the report\n line of the latest read; the windows' descriptions and notes go in each\n column's \"About this column\" instead. -->\n<div class=\"fs-column grid-pane\">\n <app-report-component-note\n [data]=\"noteData()\"\n [windowNotes]=\"false\">\n </app-report-component-note>\n <!-- The params are seeded before the first render, so the grid's first read\n carries the tile's report filters. -->\n @if (params(); as params) {\n <fs-grid\n class=\"fs-flex\"\n [source]=\"source()\"\n [layout]=\"layout()\"\n [expansion]=\"expansion()\"\n [clearedFilter]=\"clearedFilter()\"\n (expansionChange)=\"setExpansion($event)\"\n [params]=\"params\"\n [controls]=\"controls()\"\n [formatter]=\"formatter()\"\n (layoutChange)=\"setLayout($event)\">\n <ng-template fsGridCell let-value let-field=\"field\" let-record=\"record\" let-text=\"text\">\n @if (value | fsReportGridCell: field : record : text : noteData() : formatContext(); as shown) {\n <span [attr.title]=\"shown.title\">{{ shown.text }}</span>\n }\n </ng-template>\n </fs-grid>\n }\n</div>\n", styles: [":host{display:block;height:100%}.grid-pane{height:100%;min-height:0}fs-grid{min-height:0}\n"] }]
92
119
  }] });
93
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LWdyaWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2NvbXBvbmVudHMvY29tcG9uZW50LWdyaWQvY29tcG9uZW50LWdyaWQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2NvbXBvbmVudHMvY29tcG9uZW50LWdyaWQvY29tcG9uZW50LWdyaWQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQVUsUUFBUSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxHQUN4RixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUVoRSxPQUFPLEVBQUUsZUFBZSxFQUFjLE1BQU0sa0JBQWtCLENBQUM7QUFFL0QsT0FBTyxFQUFjLE1BQU0sRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRTFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUdqRSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUN0RixPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM1RCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUVwRixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQzs7QUFHOUQsNEVBQTRFO0FBQzVFLEVBQUU7QUFDRixzRUFBc0U7QUFDdEUsNEVBQTRFO0FBQzVFLDZFQUE2RTtBQUM3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QixvV0M5Q25DLGt4QkFzQkEscUpEb0JJLGVBQWUsMlBBQ2Ysc0JBQXNCOzs0RkFHYixzQkFBc0I7a0JBWGxDLFNBQVM7K0JBQ0UsMkJBQTJCLG1CQUdwQix1QkFBdUIsQ0FBQyxNQUFNLGNBQ25DLElBQUksV0FDUDt3QkFDUCxlQUFlO3dCQUNmLHNCQUFzQjtxQkFDdkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBEZXN0cm95UmVmLCBPbkluaXQsIGNvbXB1dGVkLCBpbmplY3QsIGlucHV0LCBzaWduYWwsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuXG5pbXBvcnQgeyBGc0dyaWRDb21wb25lbnQsIEdyaWRMYXlvdXQgfSBmcm9tICdAZmlyZXN0aXRjaC9ncmlkJztcblxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgZmlsdGVyLCBtYXAsIG9mLCBzd2l0Y2hNYXAsIHRhcCwgdGltZXIgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgUmVwb3J0RGF0YSB9IGZyb20gJy4uLy4uL2RhdGEvcmVwb3J0LmRhdGEnO1xuaW1wb3J0IHsgUmVwb3J0R3JpZFNvdXJjZSB9IGZyb20gJy4uLy4uL2RhdGEvcmVwb3J0LWdyaWQtc291cmNlJztcbmltcG9ydCB7IFJlcG9ydEdyaWRQYXJhbXMgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3JlcG9ydC1ncmlkLXBhcmFtcy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUmVwb3J0Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9yZXBvcnQuaW50ZXJmYWNlJztcbmltcG9ydCB7IFJlcG9ydEZpbHRlclN0YXRlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3JlcG9ydC1maWx0ZXItc3RhdGUuc2VydmljZSc7XG5pbXBvcnQgeyBUSUxFX1JFRlJFU0hfREVCT1VOQ0VfTVMgfSBmcm9tICcuLi8uLi90aWxlLWxvYWRzJztcbmltcG9ydCB7IENvbXBvbmVudE5vdGVDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnQtbm90ZS9jb21wb25lbnQtbm90ZS5jb21wb25lbnQnO1xuXG5pbXBvcnQgeyByZXBvcnRHcmlkRm9ybWF0dGVyIH0gZnJvbSAnLi9yZXBvcnQtZ3JpZC1mb3JtYXR0ZXInO1xuXG5cbi8vIEEgZ3JpZCB0aWxlOiBmcy1ncmlkIG92ZXIgdGhlIHRpbGUncyByb3dzLCByZWFkIHRocm91Z2ggUmVwb3J0R3JpZFNvdXJjZS5cbi8vXG4vLyAtIFRoZSBwYXJhbXMgKHRoZSByZXBvcnQgZmlsdGVycyB0aGUgdGlsZSByZXNvbHZlcyB0byBhbmQgdGhlICdhbnknXG4vLyAgIGdyb3VwcykgYXJlIHNlZWRlZCBiZWZvcmUgdGhlIGZpcnN0IHJlbmRlciwgc28gbm8gcmVhZCBnb2VzIG91dCB3aXRob3V0XG4vLyAgIHRoZW0uIEFmdGVyIHRoYXQgYSBjaGFuZ2UgdG8gb25lIG9mIHRoZSB0aWxlJ3MgZmlsdGVyIGdyb3VwcyBzZXR0bGVzIGZvclxuLy8gICBUSUxFX1JFRlJFU0hfREVCT1VOQ0VfTVMsIHNvIGEgc3dlZXAgb2YgY2hhbmdlcyBjb3N0cyBvbmUgcmVhZDsgb25lIHNlbnRcbi8vICAgdW5kZXIgYW4gb2xkZXIgc3RhdGUgdmVyc2lvbiBpcyBkcm9wcGVkLlxuLy8gLSBUaGUgbGF5b3V0IG9uIHNjcmVlbiBpcyB0aGUgc3RhdGUgc2VydmljZSdzIChncmlkTGF5b3V0KTogdGhlIHZpZXdlcidzXG4vLyAgIG93biB3aGlsZSB0aGV5IGNoYW5nZWQgaXQgZnJvbSB0aGUgbGF5b3V0IGF1dGhvcmVkIG5vdywgZWxzZSB0aGVcbi8vICAgYXV0aG9yZWQgb25lLiBJdCBvdXRsaXZlcyBhIHBhZ2Ugc3dpdGNoLCBhbmQgdGhlIGNoYXQgcmVhZHMgaXQuXG4vLyAtIEEgc3RhdGUgdmVyc2lvbiBtb3ZlIChDbGVhciBmaWx0ZXJzLCBhIHNhdmVkIGZpbHRlcikgc2tpcHMgdGhlIHdhaXQ7IHRoZVxuLy8gICByZXNldCBoYXMgcHV0IHRoZSBhdXRob3JlZCBsYXlvdXQgYmFjayBpbiB0aGUgc2FtZSB0aWNrLCBzbyBpdCBjb3N0cyBvbmVcbi8vICAgcmVhZC5cbi8vIC0gZnMtZ3JpZCBjb21wYXJlcyB0aGUgbGF5b3V0IGFuZCBwYXJhbXMgYnkgdmFsdWU6IGEgY2xvbmVkIHZhbHVlIG5ldmVyXG4vLyAgIHJlYWRzIGFnYWluLlxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLXJlcG9ydC1jb21wb25lbnQtZ3JpZCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9jb21wb25lbnQtZ3JpZC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2NvbXBvbmVudC1ncmlkLmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgRnNHcmlkQ29tcG9uZW50LFxuICAgIENvbXBvbmVudE5vdGVDb21wb25lbnQsXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIENvbXBvbmVudEdyaWRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gIHB1YmxpYyByZWFkb25seSByZXBvcnRJZCA9IGlucHV0LnJlcXVpcmVkPG51bWJlcj4oKTtcbiAgcHVibGljIHJlYWRvbmx5IGNvbXBvbmVudCA9IGlucHV0LnJlcXVpcmVkPFJlcG9ydENvbXBvbmVudD4oKTtcblxuICBwdWJsaWMgcmVhZG9ubHkgcGFyYW1zID0gc2lnbmFsPFJlcG9ydEdyaWRQYXJhbXMgfCBudWxsPihudWxsKTtcbiAgcHVibGljIHJlYWRvbmx5IGNvbnRyb2xzID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5jb21wb25lbnQoKS5jb25maWc/LmNvbnRyb2xzID8/IHt9KTtcbiAgcHVibGljIHJlYWRvbmx5IHNvdXJjZSA9IGNvbXB1dGVkKCgpID0+IG5ldyBSZXBvcnRHcmlkU291cmNlKHRoaXMuX3JlcG9ydERhdGEsIHRoaXMucmVwb3J0SWQoKSwgdGhpcy5fY29tcG9uZW50SWQoKSwge1xuICAgIGxvY2FsZTogKCkgPT4gdGhpcy5fZmlsdGVyU3RhdGUuZm9ybWF0Q29udGV4dCgpLmxvY2FsZSxcbiAgfSkpO1xuXG4gIHB1YmxpYyByZWFkb25seSBsYXlvdXQgPSBjb21wdXRlZCgoKSA9PiB0aGlzLl9maWx0ZXJTdGF0ZS5ncmlkTGF5b3V0KHRoaXMuY29tcG9uZW50KCkpKTtcblxuICBwdWJsaWMgcmVhZG9ubHkgbm90ZURhdGEgPSBjb21wdXRlZCgoKSA9PiB0aGlzLnNvdXJjZSgpLnJlcG9ydCgpKTtcbiAgcHVibGljIHJlYWRvbmx5IGZvcm1hdHRlciA9IGNvbXB1dGVkKCgpID0+IHJlcG9ydEdyaWRGb3JtYXR0ZXIoe1xuICAgIGZvcm1hdDogdGhpcy5fZmlsdGVyU3RhdGUuZm9ybWF0Q29udGV4dCgpLFxuICAgIHRpbWV6b25lOiB0aGlzLl9maWx0ZXJTdGF0ZS50aW1lem9uZSgpLFxuICAgIHJlcG9ydDogdGhpcy5zb3VyY2UoKS5yZXBvcnQoKSxcbiAgfSkpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2NvbXBvbmVudElkID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5jb21wb25lbnQoKS5pZCk7XG4gIHByaXZhdGUgX3JlcG9ydERhdGEgPSBpbmplY3QoUmVwb3J0RGF0YSk7XG4gIHByaXZhdGUgX2ZpbHRlclN0YXRlID0gaW5qZWN0KFJlcG9ydEZpbHRlclN0YXRlU2VydmljZSk7XG4gIHByaXZhdGUgX2Rlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG4gIC8vIFRoZSBzdGF0ZSB2ZXJzaW9uIHRoZSBwYXJhbXMgb24gc2NyZWVuIHdlcmUgcmVhZCB1bmRlci5cbiAgcHJpdmF0ZSBfcGFyYW1zVmVyc2lvbiA9IDA7XG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuX2luaXQoKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRMYXlvdXQobGF5b3V0OiBHcmlkTGF5b3V0KTogdm9pZCB7XG4gICAgdGhpcy5fZmlsdGVyU3RhdGUuc2V0R3JpZExheW91dCh0aGlzLmNvbXBvbmVudCgpLCBsYXlvdXQpO1xuICB9XG5cbiAgcHJpdmF0ZSBfaW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLl9wYXJhbXNWZXJzaW9uID0gdGhpcy5fZmlsdGVyU3RhdGUuc3RhdGVWZXJzaW9uKCk7XG4gICAgdGhpcy5wYXJhbXMuc2V0KHRoaXMuX3JlYWRQYXJhbXMoKSk7XG5cbiAgICB0aGlzLl9maWx0ZXJTdGF0ZS5jaGFuZ2VzRm9yKHRoaXMuY29tcG9uZW50KCkpXG4gICAgICAucGlwZShcbiAgICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMuX3NldHRsZWQkKCkpLFxuICAgICAgICB0YXAoKCkgPT4gdGhpcy5fYXBwbHlQYXJhbXMoKSksXG4gICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLl9kZXN0cm95UmVmKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIC8vIEEgY2hhbmdlLCBvbmNlIGl0IGhhcyBzZXR0bGVkOiBhdCBvbmNlIHdoZW4gdGhlIHN0YXRlIHZlcnNpb24gbW92ZWQsXG4gIC8vIGVsc2UgYWZ0ZXIgdGhlIGRlYm91bmNlOyBkcm9wcGVkIHdoZW4gdGhlIHZlcnNpb24gbW92ZXMgd2hpbGUgaXQgd2FpdHMsXG4gIC8vIHNpbmNlIHRoYXQgbW92ZSBicmluZ3MgaXRzIG93biBjaGFuZ2UuXG4gIHByaXZhdGUgX3NldHRsZWQkKCk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgIGNvbnN0IHZlcnNpb24gPSB0aGlzLl9maWx0ZXJTdGF0ZS5zdGF0ZVZlcnNpb24oKTtcbiAgICBjb25zdCBtb3ZlZCA9IHZlcnNpb24gIT09IHRoaXMuX3BhcmFtc1ZlcnNpb247XG5cbiAgICByZXR1cm4gKG1vdmVkID8gb2YoMCkgOiB0aW1lcihUSUxFX1JFRlJFU0hfREVCT1VOQ0VfTVMpKVxuICAgICAgLnBpcGUoXG4gICAgICAgIGZpbHRlcigoKSA9PiB0aGlzLl9maWx0ZXJTdGF0ZS5zdGF0ZVZlcnNpb24oKSA9PT0gdmVyc2lvbiksXG4gICAgICAgIG1hcCgoKSA9PiB1bmRlZmluZWQpLFxuICAgICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgX2FwcGx5UGFyYW1zKCk6IHZvaWQge1xuICAgIHRoaXMuX3BhcmFtc1ZlcnNpb24gPSB0aGlzLl9maWx0ZXJTdGF0ZS5zdGF0ZVZlcnNpb24oKTtcbiAgICB0aGlzLnBhcmFtcy5zZXQodGhpcy5fcmVhZFBhcmFtcygpKTtcbiAgfVxuXG4gIC8vIFRoZSB0aWxlJ3MgcmVwb3J0IGZpbHRlcnMgYW5kICdhbnknIGdyb3VwcyBhcyB0aGV5IHN0YW5kLlxuICBwcml2YXRlIF9yZWFkUGFyYW1zKCk6IFJlcG9ydEdyaWRQYXJhbXMge1xuICAgIGNvbnN0IGNvbXBvbmVudCA9IHRoaXMuY29tcG9uZW50KCk7XG4gICAgY29uc3QgbWF0Y2hBbnlHcm91cElkcyA9IHRoaXMuX2ZpbHRlclN0YXRlLnRpbGVTdGF0ZShjb21wb25lbnQpLm1hdGNoQW55R3JvdXBJZHM7XG5cbiAgICByZXR1cm4ge1xuICAgICAgZmlsdGVyczogdGhpcy5fZmlsdGVyU3RhdGUucmVzb2x2ZUZvckNvbXBvbmVudChjb21wb25lbnQpLFxuICAgICAgLi4uKG1hdGNoQW55R3JvdXBJZHM/Lmxlbmd0aCA/IHsgbWF0Y2hBbnlHcm91cElkcyB9IDoge30pLFxuICAgIH07XG4gIH1cblxufVxuIiwiPCEtLSBUaGUgY29tcGFyaXNvbiBhbmQgd2luZG93IG5vdGUgc3RyaXAgYWJvdmUgdGhlIHRhYmxlLCBmcm9tIHRoZSByZXBvcnRcbiAgICAgbGluZSBvZiB0aGUgbGF0ZXN0IHJlYWQ7IHRoZSB3aW5kb3dzJyBkZXNjcmlwdGlvbnMgYW5kIG5vdGVzIGdvIGluIGVhY2hcbiAgICAgY29sdW1uJ3MgXCJBYm91dCB0aGlzIGNvbHVtblwiIGluc3RlYWQuIC0tPlxuPGRpdiBjbGFzcz1cImZzLWNvbHVtbiBncmlkLXBhbmVcIj5cbiAgPGFwcC1yZXBvcnQtY29tcG9uZW50LW5vdGVcbiAgICBbZGF0YV09XCJub3RlRGF0YSgpXCJcbiAgICBbd2luZG93Tm90ZXNdPVwiZmFsc2VcIj5cbiAgPC9hcHAtcmVwb3J0LWNvbXBvbmVudC1ub3RlPlxuICA8IS0tIFRoZSBwYXJhbXMgYXJlIHNlZWRlZCBiZWZvcmUgdGhlIGZpcnN0IHJlbmRlciwgc28gdGhlIGdyaWQncyBmaXJzdCByZWFkXG4gICAgICAgY2FycmllcyB0aGUgdGlsZSdzIHJlcG9ydCBmaWx0ZXJzLiAtLT5cbiAgQGlmIChwYXJhbXMoKTsgYXMgcGFyYW1zKSB7XG4gICAgPGZzLWdyaWRcbiAgICAgIGNsYXNzPVwiZnMtZmxleFwiXG4gICAgICBbc291cmNlXT1cInNvdXJjZSgpXCJcbiAgICAgIFtsYXlvdXRdPVwibGF5b3V0KClcIlxuICAgICAgW3BhcmFtc109XCJwYXJhbXNcIlxuICAgICAgW2NvbnRyb2xzXT1cImNvbnRyb2xzKClcIlxuICAgICAgW2Zvcm1hdHRlcl09XCJmb3JtYXR0ZXIoKVwiXG4gICAgICAobGF5b3V0Q2hhbmdlKT1cInNldExheW91dCgkZXZlbnQpXCI+XG4gICAgPC9mcy1ncmlkPlxuICB9XG48L2Rpdj5cbiJdfQ==
120
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LWdyaWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2NvbXBvbmVudHMvY29tcG9uZW50LWdyaWQvY29tcG9uZW50LWdyaWQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2NvbXBvbmVudHMvY29tcG9uZW50LWdyaWQvY29tcG9uZW50LWdyaWQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQVUsUUFBUSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxHQUN4RixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUVoRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsZUFBZSxFQUE2QixNQUFNLGtCQUFrQixDQUFDO0FBRW5HLE9BQU8sRUFBYyxNQUFNLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUUxRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDcEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDakUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBR2hELE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQ3RGLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzVELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBRXBGLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQzdELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDOztBQUc5RCw0RUFBNEU7QUFDNUUsRUFBRTtBQUNGLHNFQUFzRTtBQUN0RSw0RUFBNEU7QUFDNUUsNkVBQTZFO0FBQzdFLDZFQUE2RTtBQUM3RSw2Q0FBNkM7QUFDN0MsMkVBQTJFO0FBQzNFLHFFQUFxRTtBQUNyRSwwRUFBMEU7QUFDMUUsMkVBQTJFO0FBQzNFLDZFQUE2RTtBQUM3RSw2RUFBNkU7QUFDN0UsVUFBVTtBQUNWLDBFQUEwRTtBQUMxRSwwRUFBMEU7QUFDMUUsMEVBQTBFO0FBQzFFLDJFQUEyRTtBQUMzRSw0Q0FBNEM7QUFDNUMsMEVBQTBFO0FBQzFFLGlCQUFpQjtBQUNqQiw0RUFBNEU7QUFDNUUsMkVBQTJFO0FBYzNFLE1BQU0sT0FBTyxzQkFBc0I7SUFFakIsUUFBUSxHQUFHLEtBQUssQ0FBQyxRQUFRLEVBQVUsQ0FBQztJQUNwQyxTQUFTLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBbUIsQ0FBQztJQUU5QyxNQUFNLEdBQUcsTUFBTSxDQUEwQixJQUFJLENBQUMsQ0FBQztJQUMvQyxRQUFRLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxNQUFNLEVBQUUsUUFBUSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ25FLE1BQU0sR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLEVBQUU7UUFDbkgsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxFQUFFLENBQUMsTUFBTTtLQUN2RCxDQUFDLENBQUMsQ0FBQztJQUVZLE1BQU0sR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN4RSxhQUFhLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN0Ryw0RUFBNEU7SUFDNUQsU0FBUyxHQUFHLE1BQU0sQ0FBNEIsU0FBUyxDQUFDLENBQUM7SUFFekQsUUFBUSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUNsRCxhQUFhLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQztJQUNsRSxTQUFTLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLG1CQUFtQixDQUFDO1FBQzdELE1BQU0sRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsRUFBRTtRQUN6QyxRQUFRLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUU7UUFDdEMsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxNQUFNLEVBQUU7S0FDL0IsQ0FBQyxDQUFDLENBQUM7SUFFYSxZQUFZLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM1RCxXQUFXLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ2pDLFlBQVksR0FBRyxNQUFNLENBQUMsd0JBQXdCLENBQUMsQ0FBQztJQUNoRCxXQUFXLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3pDLDBEQUEwRDtJQUNsRCxjQUFjLEdBQUcsQ0FBQyxDQUFDO0lBRXBCLFFBQVE7UUFDYixJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3RFLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNmLENBQUM7SUFFTSxTQUFTLENBQUMsTUFBa0I7UUFDakMsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFFTSxZQUFZLENBQUMsU0FBb0M7UUFDdEQsSUFBSSxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUVPLEtBQUs7UUFDWCxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDdkQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7UUFFcEMsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO2FBQzNDLElBQUksQ0FDSCxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLEVBQ2pDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsRUFDOUIsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUNyQzthQUNBLFNBQVMsRUFBRSxDQUFDO1FBRWYsSUFBSSxjQUFjLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUNyQyxJQUFJLENBQUMsWUFBWSxDQUFDLGdCQUFnQixFQUFFO2lCQUNqQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2lCQUMxQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUM7UUFDMUMsQ0FBQztJQUNILENBQUM7SUFFRCx1RUFBdUU7SUFDdkUsMEVBQTBFO0lBQzFFLHlDQUF5QztJQUNqQyxTQUFTO1FBQ2YsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNqRCxNQUFNLEtBQUssR0FBRyxPQUFPLEtBQUssSUFBSSxDQUFDLGNBQWMsQ0FBQztRQUU5QyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO2FBQ3JELElBQUksQ0FDSCxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLEVBQUUsS0FBSyxPQUFPLENBQUMsRUFDMUQsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUNyQixDQUFDO0lBQ04sQ0FBQztJQUVPLFlBQVk7UUFDbEIsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3ZELElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRCwyRUFBMkU7SUFDM0UsaUJBQWlCO0lBQ1QsV0FBVztRQUNqQixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDbkMsTUFBTSxFQUFFLGdCQUFnQixFQUFFLFNBQVMsRUFBRSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRS9FLE9BQU87WUFDTCxPQUFPLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUM7WUFDekQsR0FBRyxDQUFDLGdCQUFnQixFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxnQkFBZ0IsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDekQsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1NBQ3BDLENBQUM7SUFDSixDQUFDO3dHQTdGVSxzQkFBc0I7NEZBQXRCLHNCQUFzQixvV0MxRG5DLHlzQ0E4QkEscUpEc0JJLGVBQWUsMlBBQ2YsbUJBQW1CLHlEQUNuQixzQkFBc0IsbUlBQ3RCLGtCQUFrQjs7NEZBR1Qsc0JBQXNCO2tCQWJsQyxTQUFTOytCQUNFLDJCQUEyQixtQkFHcEIsdUJBQXVCLENBQUMsTUFBTSxjQUNuQyxJQUFJLFdBQ1A7d0JBQ1AsZUFBZTt3QkFDZixtQkFBbUI7d0JBQ25CLHNCQUFzQjt3QkFDdEIsa0JBQWtCO3FCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIERlc3Ryb3lSZWYsIE9uSW5pdCwgY29tcHV0ZWQsIGluamVjdCwgaW5wdXQsIHNpZ25hbCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5cbmltcG9ydCB7IEZzR3JpZENlbGxEaXJlY3RpdmUsIEZzR3JpZENvbXBvbmVudCwgR3JpZEV4cGFuc2lvbiwgR3JpZExheW91dCB9IGZyb20gJ0BmaXJlc3RpdGNoL2dyaWQnO1xuXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBmaWx0ZXIsIG1hcCwgb2YsIHN3aXRjaE1hcCwgdGFwLCB0aW1lciB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBSZXBvcnREYXRhIH0gZnJvbSAnLi4vLi4vZGF0YS9yZXBvcnQuZGF0YSc7XG5pbXBvcnQgeyBSZXBvcnRHcmlkU291cmNlIH0gZnJvbSAnLi4vLi4vZGF0YS9yZXBvcnQtZ3JpZC1zb3VyY2UnO1xuaW1wb3J0IHsgZm9sbG93c0dyb3VwQnkgfSBmcm9tICcuLi8uLi9ncm91cC1ieSc7XG5pbXBvcnQgeyBSZXBvcnRHcmlkUGFyYW1zIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9yZXBvcnQtZ3JpZC1wYXJhbXMuaW50ZXJmYWNlJztcbmltcG9ydCB7IFJlcG9ydENvbXBvbmVudCB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvcmVwb3J0LmludGVyZmFjZSc7XG5pbXBvcnQgeyBSZXBvcnRGaWx0ZXJTdGF0ZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9yZXBvcnQtZmlsdGVyLXN0YXRlLnNlcnZpY2UnO1xuaW1wb3J0IHsgVElMRV9SRUZSRVNIX0RFQk9VTkNFX01TIH0gZnJvbSAnLi4vLi4vdGlsZS1sb2Fkcyc7XG5pbXBvcnQgeyBDb21wb25lbnROb3RlQ29tcG9uZW50IH0gZnJvbSAnLi4vY29tcG9uZW50LW5vdGUvY29tcG9uZW50LW5vdGUuY29tcG9uZW50JztcblxuaW1wb3J0IHsgUmVwb3J0R3JpZENlbGxQaXBlIH0gZnJvbSAnLi9yZXBvcnQtZ3JpZC1jZWxsLnBpcGUnO1xuaW1wb3J0IHsgcmVwb3J0R3JpZEZvcm1hdHRlciB9IGZyb20gJy4vcmVwb3J0LWdyaWQtZm9ybWF0dGVyJztcblxuXG4vLyBBIGdyaWQgdGlsZTogZnMtZ3JpZCBvdmVyIHRoZSB0aWxlJ3Mgcm93cywgcmVhZCB0aHJvdWdoIFJlcG9ydEdyaWRTb3VyY2UuXG4vL1xuLy8gLSBUaGUgcGFyYW1zICh0aGUgcmVwb3J0IGZpbHRlcnMgdGhlIHRpbGUgcmVzb2x2ZXMgdG8gYW5kIHRoZSAnYW55J1xuLy8gICBncm91cHMpIGFyZSBzZWVkZWQgYmVmb3JlIHRoZSBmaXJzdCByZW5kZXIsIHNvIG5vIHJlYWQgZ29lcyBvdXQgd2l0aG91dFxuLy8gICB0aGVtLiBBZnRlciB0aGF0IGEgY2hhbmdlIHRvIG9uZSBvZiB0aGUgdGlsZSdzIGZpbHRlciBncm91cHMgc2V0dGxlcyBmb3Jcbi8vICAgVElMRV9SRUZSRVNIX0RFQk9VTkNFX01TLCBzbyBhIHN3ZWVwIG9mIGNoYW5nZXMgY29zdHMgb25lIHJlYWQ7IG9uZSBzZW50XG4vLyAgIHVuZGVyIGFuIG9sZGVyIHN0YXRlIHZlcnNpb24gaXMgZHJvcHBlZC5cbi8vIC0gVGhlIGxheW91dCBvbiBzY3JlZW4gaXMgdGhlIHN0YXRlIHNlcnZpY2UncyAoZ3JpZExheW91dCk6IHRoZSB2aWV3ZXInc1xuLy8gICBvd24gd2hpbGUgdGhleSBjaGFuZ2VkIGl0IGZyb20gdGhlIGxheW91dCBhdXRob3JlZCBub3csIGVsc2UgdGhlXG4vLyAgIGF1dGhvcmVkIG9uZS4gSXQgb3V0bGl2ZXMgYSBwYWdlIHN3aXRjaCwgYW5kIHRoZSBjaGF0IHJlYWRzIGl0LiBTbyBkb1xuLy8gICB0aGUgZ3JvdXBzIHRoZSB2aWV3ZXIgbGVmdCBvcGVuIChncmlkRXhwYW5zaW9uKSwgd2hpY2ggYSBDbGVhciBsZWF2ZXMuXG4vLyAtIEEgc3RhdGUgdmVyc2lvbiBtb3ZlIChDbGVhciBmaWx0ZXJzLCBhIHNhdmVkIGZpbHRlcikgc2tpcHMgdGhlIHdhaXQ7IHRoZVxuLy8gICByZXNldCBoYXMgcHV0IHRoZSBhdXRob3JlZCBsYXlvdXQgYmFjayBpbiB0aGUgc2FtZSB0aWNrLCBzbyBpdCBjb3N0cyBvbmVcbi8vICAgcmVhZC5cbi8vIC0gQSB0YWJsZSB0aGF0IGZvbGxvd3MgdGhlIHJlcG9ydCdzIGdyb3VwLWJ5IChmb2xsb3dzR3JvdXBCeSkgc2VuZHMgaXRzXG4vLyAgIGdyYWluLCBhbmQgcmVhZHMgYWdhaW4gYXQgb25jZSB3aGVuIGl0IGNoYW5nZXMuIFRoZSBzdGF0ZSBzZXJ2aWNlIGhhc1xuLy8gICBtb3ZlZCBpdHMgZmlsdGVyIG9uIHRoZSBncm91cC1ieSdzIGZpZWxkIHRvIHRoZSBuZXcgZ3JhaW4gYnkgdGhlbiwgb3Jcbi8vICAgdGFrZW4gaXQgb3V0IChjbGVhcmVkRmlsdGVyLCB3aGljaCB0aGUgc3RhdHVzIGxpbmUgbmFtZXMpLCBzbyBvbmUgcmVhZFxuLy8gICBnb2VzIG91dCBhbmQgbm90aGluZyBwYWludHMgdW5maWx0ZXJlZC5cbi8vIC0gZnMtZ3JpZCBjb21wYXJlcyB0aGUgbGF5b3V0IGFuZCBwYXJhbXMgYnkgdmFsdWU6IGEgY2xvbmVkIHZhbHVlIG5ldmVyXG4vLyAgIHJlYWRzIGFnYWluLlxuLy8gLSBBbiBvdXRwdXQncyBkZXRhaWwgY2VsbCBpcyBkcmF3biBieSBmc1JlcG9ydEdyaWRDZWxsLCBzbyBhIGNoYW5nZSB0ZWxsc1xuLy8gICBhIG1pc3NpbmcgcHJpb3IgZnJvbSBhIHplcm8gb25lIGFuZCBzYXlzIHdoeSBvbiBob3ZlciwgYXMgYSBsaXN0IGRvZXMuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtcmVwb3J0LWNvbXBvbmVudC1ncmlkJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NvbXBvbmVudC1ncmlkLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vY29tcG9uZW50LWdyaWQuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBGc0dyaWRDb21wb25lbnQsXG4gICAgRnNHcmlkQ2VsbERpcmVjdGl2ZSxcbiAgICBDb21wb25lbnROb3RlQ29tcG9uZW50LFxuICAgIFJlcG9ydEdyaWRDZWxsUGlwZSxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgQ29tcG9uZW50R3JpZENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgcHVibGljIHJlYWRvbmx5IHJlcG9ydElkID0gaW5wdXQucmVxdWlyZWQ8bnVtYmVyPigpO1xuICBwdWJsaWMgcmVhZG9ubHkgY29tcG9uZW50ID0gaW5wdXQucmVxdWlyZWQ8UmVwb3J0Q29tcG9uZW50PigpO1xuXG4gIHB1YmxpYyByZWFkb25seSBwYXJhbXMgPSBzaWduYWw8UmVwb3J0R3JpZFBhcmFtcyB8IG51bGw+KG51bGwpO1xuICBwdWJsaWMgcmVhZG9ubHkgY29udHJvbHMgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmNvbXBvbmVudCgpLmNvbmZpZz8uY29udHJvbHMgPz8ge30pO1xuICBwdWJsaWMgcmVhZG9ubHkgc291cmNlID0gY29tcHV0ZWQoKCkgPT4gbmV3IFJlcG9ydEdyaWRTb3VyY2UodGhpcy5fcmVwb3J0RGF0YSwgdGhpcy5yZXBvcnRJZCgpLCB0aGlzLl9jb21wb25lbnRJZCgpLCB7XG4gICAgbG9jYWxlOiAoKSA9PiB0aGlzLl9maWx0ZXJTdGF0ZS5mb3JtYXRDb250ZXh0KCkubG9jYWxlLFxuICB9KSk7XG5cbiAgcHVibGljIHJlYWRvbmx5IGxheW91dCA9IGNvbXB1dGVkKCgpID0+IHRoaXMuX2ZpbHRlclN0YXRlLmdyaWRMYXlvdXQodGhpcy5jb21wb25lbnQoKSkpO1xuICBwdWJsaWMgcmVhZG9ubHkgY2xlYXJlZEZpbHRlciA9IGNvbXB1dGVkKCgpID0+IHRoaXMuX2ZpbHRlclN0YXRlLmdyaWRDbGVhcmVkRmlsdGVyKHRoaXMuY29tcG9uZW50KCkpKTtcbiAgLy8gUmVhZCBvbmNlOiBmcy1ncmlkIG93bnMgdGhlIG9wZW4gZ3JvdXBzIGZyb20gdGhlbiBvbiBhbmQgd3JpdGVzIHRoZW0gb3V0LlxuICBwdWJsaWMgcmVhZG9ubHkgZXhwYW5zaW9uID0gc2lnbmFsPEdyaWRFeHBhbnNpb24gfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG5cbiAgcHVibGljIHJlYWRvbmx5IG5vdGVEYXRhID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5zb3VyY2UoKS5yZXBvcnQoKSk7XG4gIHB1YmxpYyByZWFkb25seSBmb3JtYXRDb250ZXh0ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5fZmlsdGVyU3RhdGUuZm9ybWF0Q29udGV4dCgpKTtcbiAgcHVibGljIHJlYWRvbmx5IGZvcm1hdHRlciA9IGNvbXB1dGVkKCgpID0+IHJlcG9ydEdyaWRGb3JtYXR0ZXIoe1xuICAgIGZvcm1hdDogdGhpcy5fZmlsdGVyU3RhdGUuZm9ybWF0Q29udGV4dCgpLFxuICAgIHRpbWV6b25lOiB0aGlzLl9maWx0ZXJTdGF0ZS50aW1lem9uZSgpLFxuICAgIHJlcG9ydDogdGhpcy5zb3VyY2UoKS5yZXBvcnQoKSxcbiAgfSkpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2NvbXBvbmVudElkID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5jb21wb25lbnQoKS5pZCk7XG4gIHByaXZhdGUgX3JlcG9ydERhdGEgPSBpbmplY3QoUmVwb3J0RGF0YSk7XG4gIHByaXZhdGUgX2ZpbHRlclN0YXRlID0gaW5qZWN0KFJlcG9ydEZpbHRlclN0YXRlU2VydmljZSk7XG4gIHByaXZhdGUgX2Rlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG4gIC8vIFRoZSBzdGF0ZSB2ZXJzaW9uIHRoZSBwYXJhbXMgb24gc2NyZWVuIHdlcmUgcmVhZCB1bmRlci5cbiAgcHJpdmF0ZSBfcGFyYW1zVmVyc2lvbiA9IDA7XG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZXhwYW5zaW9uLnNldCh0aGlzLl9maWx0ZXJTdGF0ZS5ncmlkRXhwYW5zaW9uKHRoaXMuY29tcG9uZW50KCkpKTtcbiAgICB0aGlzLl9pbml0KCk7XG4gIH1cblxuICBwdWJsaWMgc2V0TGF5b3V0KGxheW91dDogR3JpZExheW91dCk6IHZvaWQge1xuICAgIHRoaXMuX2ZpbHRlclN0YXRlLnNldEdyaWRMYXlvdXQodGhpcy5jb21wb25lbnQoKSwgbGF5b3V0KTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRFeHBhbnNpb24oZXhwYW5zaW9uOiBHcmlkRXhwYW5zaW9uIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgdGhpcy5fZmlsdGVyU3RhdGUuc2V0R3JpZEV4cGFuc2lvbih0aGlzLmNvbXBvbmVudCgpLCBleHBhbnNpb24pO1xuICB9XG5cbiAgcHJpdmF0ZSBfaW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLl9wYXJhbXNWZXJzaW9uID0gdGhpcy5fZmlsdGVyU3RhdGUuc3RhdGVWZXJzaW9uKCk7XG4gICAgdGhpcy5wYXJhbXMuc2V0KHRoaXMuX3JlYWRQYXJhbXMoKSk7XG5cbiAgICB0aGlzLl9maWx0ZXJTdGF0ZS5jaGFuZ2VzRm9yKHRoaXMuY29tcG9uZW50KCkpXG4gICAgICAucGlwZShcbiAgICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMuX3NldHRsZWQkKCkpLFxuICAgICAgICB0YXAoKCkgPT4gdGhpcy5fYXBwbHlQYXJhbXMoKSksXG4gICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLl9kZXN0cm95UmVmKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcblxuICAgIGlmIChmb2xsb3dzR3JvdXBCeSh0aGlzLmNvbXBvbmVudCgpKSkge1xuICAgICAgdGhpcy5fZmlsdGVyU3RhdGUuZnJlcXVlbmN5Q2hhbmdlcygpXG4gICAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLl9kZXN0cm95UmVmKSlcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLl9hcHBseVBhcmFtcygpKTtcbiAgICB9XG4gIH1cblxuICAvLyBBIGNoYW5nZSwgb25jZSBpdCBoYXMgc2V0dGxlZDogYXQgb25jZSB3aGVuIHRoZSBzdGF0ZSB2ZXJzaW9uIG1vdmVkLFxuICAvLyBlbHNlIGFmdGVyIHRoZSBkZWJvdW5jZTsgZHJvcHBlZCB3aGVuIHRoZSB2ZXJzaW9uIG1vdmVzIHdoaWxlIGl0IHdhaXRzLFxuICAvLyBzaW5jZSB0aGF0IG1vdmUgYnJpbmdzIGl0cyBvd24gY2hhbmdlLlxuICBwcml2YXRlIF9zZXR0bGVkJCgpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICBjb25zdCB2ZXJzaW9uID0gdGhpcy5fZmlsdGVyU3RhdGUuc3RhdGVWZXJzaW9uKCk7XG4gICAgY29uc3QgbW92ZWQgPSB2ZXJzaW9uICE9PSB0aGlzLl9wYXJhbXNWZXJzaW9uO1xuXG4gICAgcmV0dXJuIChtb3ZlZCA/IG9mKDApIDogdGltZXIoVElMRV9SRUZSRVNIX0RFQk9VTkNFX01TKSlcbiAgICAgIC5waXBlKFxuICAgICAgICBmaWx0ZXIoKCkgPT4gdGhpcy5fZmlsdGVyU3RhdGUuc3RhdGVWZXJzaW9uKCkgPT09IHZlcnNpb24pLFxuICAgICAgICBtYXAoKCkgPT4gdW5kZWZpbmVkKSxcbiAgICAgICk7XG4gIH1cblxuICBwcml2YXRlIF9hcHBseVBhcmFtcygpOiB2b2lkIHtcbiAgICB0aGlzLl9wYXJhbXNWZXJzaW9uID0gdGhpcy5fZmlsdGVyU3RhdGUuc3RhdGVWZXJzaW9uKCk7XG4gICAgdGhpcy5wYXJhbXMuc2V0KHRoaXMuX3JlYWRQYXJhbXMoKSk7XG4gIH1cblxuICAvLyBUaGUgdGlsZSdzIHJlcG9ydCBmaWx0ZXJzLCAnYW55JyBncm91cHMgYW5kIGdyb3VwLWJ5IGdyYWluIGFzIHRoZXkgc3RhbmRcbiAgLy8gKHRpbGVTdGF0ZSgpKS5cbiAgcHJpdmF0ZSBfcmVhZFBhcmFtcygpOiBSZXBvcnRHcmlkUGFyYW1zIHtcbiAgICBjb25zdCBjb21wb25lbnQgPSB0aGlzLmNvbXBvbmVudCgpO1xuICAgIGNvbnN0IHsgbWF0Y2hBbnlHcm91cElkcywgZnJlcXVlbmN5IH0gPSB0aGlzLl9maWx0ZXJTdGF0ZS50aWxlU3RhdGUoY29tcG9uZW50KTtcblxuICAgIHJldHVybiB7XG4gICAgICBmaWx0ZXJzOiB0aGlzLl9maWx0ZXJTdGF0ZS5yZXNvbHZlRm9yQ29tcG9uZW50KGNvbXBvbmVudCksXG4gICAgICAuLi4obWF0Y2hBbnlHcm91cElkcz8ubGVuZ3RoID8geyBtYXRjaEFueUdyb3VwSWRzIH0gOiB7fSksXG4gICAgICAuLi4oZnJlcXVlbmN5ID8geyBmcmVxdWVuY3kgfSA6IHt9KSxcbiAgICB9O1xuICB9XG5cbn1cbiIsIjwhLS0gVGhlIGNvbXBhcmlzb24gYW5kIHdpbmRvdyBub3RlIHN0cmlwIGFib3ZlIHRoZSB0YWJsZSwgZnJvbSB0aGUgcmVwb3J0XG4gICAgIGxpbmUgb2YgdGhlIGxhdGVzdCByZWFkOyB0aGUgd2luZG93cycgZGVzY3JpcHRpb25zIGFuZCBub3RlcyBnbyBpbiBlYWNoXG4gICAgIGNvbHVtbidzIFwiQWJvdXQgdGhpcyBjb2x1bW5cIiBpbnN0ZWFkLiAtLT5cbjxkaXYgY2xhc3M9XCJmcy1jb2x1bW4gZ3JpZC1wYW5lXCI+XG4gIDxhcHAtcmVwb3J0LWNvbXBvbmVudC1ub3RlXG4gICAgW2RhdGFdPVwibm90ZURhdGEoKVwiXG4gICAgW3dpbmRvd05vdGVzXT1cImZhbHNlXCI+XG4gIDwvYXBwLXJlcG9ydC1jb21wb25lbnQtbm90ZT5cbiAgPCEtLSBUaGUgcGFyYW1zIGFyZSBzZWVkZWQgYmVmb3JlIHRoZSBmaXJzdCByZW5kZXIsIHNvIHRoZSBncmlkJ3MgZmlyc3QgcmVhZFxuICAgICAgIGNhcnJpZXMgdGhlIHRpbGUncyByZXBvcnQgZmlsdGVycy4gLS0+XG4gIEBpZiAocGFyYW1zKCk7IGFzIHBhcmFtcykge1xuICAgIDxmcy1ncmlkXG4gICAgICBjbGFzcz1cImZzLWZsZXhcIlxuICAgICAgW3NvdXJjZV09XCJzb3VyY2UoKVwiXG4gICAgICBbbGF5b3V0XT1cImxheW91dCgpXCJcbiAgICAgIFtleHBhbnNpb25dPVwiZXhwYW5zaW9uKClcIlxuICAgICAgW2NsZWFyZWRGaWx0ZXJdPVwiY2xlYXJlZEZpbHRlcigpXCJcbiAgICAgIChleHBhbnNpb25DaGFuZ2UpPVwic2V0RXhwYW5zaW9uKCRldmVudClcIlxuICAgICAgW3BhcmFtc109XCJwYXJhbXNcIlxuICAgICAgW2NvbnRyb2xzXT1cImNvbnRyb2xzKClcIlxuICAgICAgW2Zvcm1hdHRlcl09XCJmb3JtYXR0ZXIoKVwiXG4gICAgICAobGF5b3V0Q2hhbmdlKT1cInNldExheW91dCgkZXZlbnQpXCI+XG4gICAgICA8bmctdGVtcGxhdGUgZnNHcmlkQ2VsbCBsZXQtdmFsdWUgbGV0LWZpZWxkPVwiZmllbGRcIiBsZXQtcmVjb3JkPVwicmVjb3JkXCIgbGV0LXRleHQ9XCJ0ZXh0XCI+XG4gICAgICAgIEBpZiAodmFsdWUgfCBmc1JlcG9ydEdyaWRDZWxsOiBmaWVsZCA6IHJlY29yZCA6IHRleHQgOiBub3RlRGF0YSgpIDogZm9ybWF0Q29udGV4dCgpOyBhcyBzaG93bikge1xuICAgICAgICAgIDxzcGFuIFthdHRyLnRpdGxlXT1cInNob3duLnRpdGxlXCI+e3sgc2hvd24udGV4dCB9fTwvc3Bhbj5cbiAgICAgICAgfVxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L2ZzLWdyaWQ+XG4gIH1cbjwvZGl2PlxuIl19
@@ -0,0 +1,41 @@
1
+ import { Pipe } from '@angular/core';
2
+ import { formatOutputValue, laneOutputAlias } from '../../format';
3
+ import * as i0 from "@angular/core";
4
+ // A detail cell of an output field (a prior, a change, a % change, a rank)
5
+ // as a list writes it: a change reads its prior beside it on the line, so a
6
+ // missing baseline reads '—' and a zero one 'n/a', and the cell's title says
7
+ // why, as the list's hover does. A value it holds keeps the grid's own text
8
+ // (its placement's format); a rank change is written whole, since a new rank
9
+ // reads apart from an unranked line. Every other cell is the grid's text,
10
+ // with no title.
11
+ export class ReportGridCellPipe {
12
+ // The cell's raw value, its field, its line's record (absent on a group or
13
+ // total row) and the grid's own text, from the fsGridCell context.
14
+ transform(value, field, record, text, report, format) {
15
+ const name = field?.name ?? '';
16
+ const output = record ? report?.outputs?.[name] : null;
17
+ if (!output || !record) {
18
+ return { text, title: null };
19
+ }
20
+ const priorAlias = output.role === 'change' || output.role === 'percent_change'
21
+ ? laneOutputAlias(report?.outputs, name, 'prior')
22
+ : null;
23
+ const formatted = formatOutputValue(value, output, null, format, {
24
+ ...(priorAlias ? { prior: record[priorAlias] } : {}),
25
+ floor: report?.comparison?.floor ?? null,
26
+ empty: '',
27
+ });
28
+ const isMissing = value === null || value === undefined || value === '';
29
+ return { text: isMissing || output.kind === 'rank' ? formatted.text : text, title: formatted.title };
30
+ }
31
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportGridCellPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
32
+ static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "18.2.14", ngImport: i0, type: ReportGridCellPipe, isStandalone: true, name: "fsReportGridCell" });
33
+ }
34
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportGridCellPipe, decorators: [{
35
+ type: Pipe,
36
+ args: [{
37
+ name: 'fsReportGridCell',
38
+ standalone: true,
39
+ }]
40
+ }] });
41
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LWdyaWQtY2VsbC5waXBlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2NvbXBvbmVudHMvY29tcG9uZW50LWdyaWQvcmVwb3J0LWdyaWQtY2VsbC5waXBlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQWlCLE1BQU0sZUFBZSxDQUFDO0FBSXBELE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsZUFBZSxFQUFFLE1BQU0sY0FBYyxDQUFDOztBQUt4RiwyRUFBMkU7QUFDM0UsNEVBQTRFO0FBQzVFLDZFQUE2RTtBQUM3RSw0RUFBNEU7QUFDNUUsNkVBQTZFO0FBQzdFLDBFQUEwRTtBQUMxRSxpQkFBaUI7QUFLakIsTUFBTSxPQUFPLGtCQUFrQjtJQUU3QiwyRUFBMkU7SUFDM0UsbUVBQW1FO0lBQzVELFNBQVMsQ0FDZCxLQUFjLEVBQ2QsS0FBdUIsRUFDdkIsTUFBMkMsRUFDM0MsSUFBWSxFQUNaLE1BQStCLEVBQy9CLE1BQTJCO1FBRTNCLE1BQU0sSUFBSSxHQUFHLEtBQUssRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDO1FBQy9CLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDdkQsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3ZCLE9BQU8sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDO1FBQy9CLENBQUM7UUFFRCxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsSUFBSSxLQUFLLFFBQVEsSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLGdCQUFnQjtZQUM3RSxDQUFDLENBQUMsZUFBZSxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQztZQUNqRCxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ1QsTUFBTSxTQUFTLEdBQUcsaUJBQWlCLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFO1lBQy9ELEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDcEQsS0FBSyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsS0FBSyxJQUFJLElBQUk7WUFDeEMsS0FBSyxFQUFFLEVBQUU7U0FDVixDQUFDLENBQUM7UUFDSCxNQUFNLFNBQVMsR0FBRyxLQUFLLEtBQUssSUFBSSxJQUFJLEtBQUssS0FBSyxTQUFTLElBQUksS0FBSyxLQUFLLEVBQUUsQ0FBQztRQUV4RSxPQUFPLEVBQUUsSUFBSSxFQUFFLFNBQVMsSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDdkcsQ0FBQzt3R0E3QlUsa0JBQWtCO3NHQUFsQixrQkFBa0I7OzRGQUFsQixrQkFBa0I7a0JBSjlCLElBQUk7bUJBQUM7b0JBQ0osSUFBSSxFQUFFLGtCQUFrQjtvQkFDeEIsVUFBVSxFQUFFLElBQUk7aUJBQ2pCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUGlwZSwgUGlwZVRyYW5zZm9ybSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBHcmlkRmllbGQgfSBmcm9tICdAZmlyZXN0aXRjaC9ncmlkJztcblxuaW1wb3J0IHsgRm9ybWF0dGVkT3V0cHV0VmFsdWUsIGZvcm1hdE91dHB1dFZhbHVlLCBsYW5lT3V0cHV0QWxpYXMgfSBmcm9tICcuLi8uLi9mb3JtYXQnO1xuaW1wb3J0IHsgUmVwb3J0R3JpZFJlcG9ydCB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvcmVwb3J0LWdyaWQtcmVwb3J0LmludGVyZmFjZSc7XG5pbXBvcnQgeyBSZXBvcnRGb3JtYXRDb250ZXh0IH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9yZXBvcnQuaW50ZXJmYWNlJztcblxuXG4vLyBBIGRldGFpbCBjZWxsIG9mIGFuIG91dHB1dCBmaWVsZCAoYSBwcmlvciwgYSBjaGFuZ2UsIGEgJSBjaGFuZ2UsIGEgcmFuaylcbi8vIGFzIGEgbGlzdCB3cml0ZXMgaXQ6IGEgY2hhbmdlIHJlYWRzIGl0cyBwcmlvciBiZXNpZGUgaXQgb24gdGhlIGxpbmUsIHNvIGFcbi8vIG1pc3NpbmcgYmFzZWxpbmUgcmVhZHMgJ+KAlCcgYW5kIGEgemVybyBvbmUgJ24vYScsIGFuZCB0aGUgY2VsbCdzIHRpdGxlIHNheXNcbi8vIHdoeSwgYXMgdGhlIGxpc3QncyBob3ZlciBkb2VzLiBBIHZhbHVlIGl0IGhvbGRzIGtlZXBzIHRoZSBncmlkJ3Mgb3duIHRleHRcbi8vIChpdHMgcGxhY2VtZW50J3MgZm9ybWF0KTsgYSByYW5rIGNoYW5nZSBpcyB3cml0dGVuIHdob2xlLCBzaW5jZSBhIG5ldyByYW5rXG4vLyByZWFkcyBhcGFydCBmcm9tIGFuIHVucmFua2VkIGxpbmUuIEV2ZXJ5IG90aGVyIGNlbGwgaXMgdGhlIGdyaWQncyB0ZXh0LFxuLy8gd2l0aCBubyB0aXRsZS5cbkBQaXBlKHtcbiAgbmFtZTogJ2ZzUmVwb3J0R3JpZENlbGwnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxufSlcbmV4cG9ydCBjbGFzcyBSZXBvcnRHcmlkQ2VsbFBpcGUgaW1wbGVtZW50cyBQaXBlVHJhbnNmb3JtIHtcblxuICAvLyBUaGUgY2VsbCdzIHJhdyB2YWx1ZSwgaXRzIGZpZWxkLCBpdHMgbGluZSdzIHJlY29yZCAoYWJzZW50IG9uIGEgZ3JvdXAgb3JcbiAgLy8gdG90YWwgcm93KSBhbmQgdGhlIGdyaWQncyBvd24gdGV4dCwgZnJvbSB0aGUgZnNHcmlkQ2VsbCBjb250ZXh0LlxuICBwdWJsaWMgdHJhbnNmb3JtKFxuICAgIHZhbHVlOiB1bmtub3duLFxuICAgIGZpZWxkOiBHcmlkRmllbGQgfCBudWxsLFxuICAgIHJlY29yZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQsXG4gICAgdGV4dDogc3RyaW5nLFxuICAgIHJlcG9ydDogUmVwb3J0R3JpZFJlcG9ydCB8IG51bGwsXG4gICAgZm9ybWF0OiBSZXBvcnRGb3JtYXRDb250ZXh0LFxuICApOiBGb3JtYXR0ZWRPdXRwdXRWYWx1ZSB7XG4gICAgY29uc3QgbmFtZSA9IGZpZWxkPy5uYW1lID8/ICcnO1xuICAgIGNvbnN0IG91dHB1dCA9IHJlY29yZCA/IHJlcG9ydD8ub3V0cHV0cz8uW25hbWVdIDogbnVsbDtcbiAgICBpZiAoIW91dHB1dCB8fCAhcmVjb3JkKSB7XG4gICAgICByZXR1cm4geyB0ZXh0LCB0aXRsZTogbnVsbCB9O1xuICAgIH1cblxuICAgIGNvbnN0IHByaW9yQWxpYXMgPSBvdXRwdXQucm9sZSA9PT0gJ2NoYW5nZScgfHwgb3V0cHV0LnJvbGUgPT09ICdwZXJjZW50X2NoYW5nZSdcbiAgICAgID8gbGFuZU91dHB1dEFsaWFzKHJlcG9ydD8ub3V0cHV0cywgbmFtZSwgJ3ByaW9yJylcbiAgICAgIDogbnVsbDtcbiAgICBjb25zdCBmb3JtYXR0ZWQgPSBmb3JtYXRPdXRwdXRWYWx1ZSh2YWx1ZSwgb3V0cHV0LCBudWxsLCBmb3JtYXQsIHtcbiAgICAgIC4uLihwcmlvckFsaWFzID8geyBwcmlvcjogcmVjb3JkW3ByaW9yQWxpYXNdIH0gOiB7fSksXG4gICAgICBmbG9vcjogcmVwb3J0Py5jb21wYXJpc29uPy5mbG9vciA/PyBudWxsLFxuICAgICAgZW1wdHk6ICcnLFxuICAgIH0pO1xuICAgIGNvbnN0IGlzTWlzc2luZyA9IHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09ICcnO1xuXG4gICAgcmV0dXJuIHsgdGV4dDogaXNNaXNzaW5nIHx8IG91dHB1dC5raW5kID09PSAncmFuaycgPyBmb3JtYXR0ZWQudGV4dCA6IHRleHQsIHRpdGxlOiBmb3JtYXR0ZWQudGl0bGUgfTtcbiAgfVxuXG59XG4iXX0=