@firestitch/report 18.16.0 → 18.17.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.
@@ -14,7 +14,7 @@ export declare class FsAiReportComponent {
14
14
  readonly editMode: import("@angular/core").WritableSignal<boolean>;
15
15
  readonly pageId: import("@angular/core").WritableSignal<number>;
16
16
  readonly chatPageId: import("@angular/core").WritableSignal<number>;
17
- readonly chatRequestData: import("@angular/core").Signal<Record<string, unknown>>;
17
+ readonly chatBasePath: import("@angular/core").Signal<string>;
18
18
  readonly reportFilterConfig: import("@angular/core").WritableSignal<FilterConfig>;
19
19
  readonly reportHasFilters: import("@angular/core").Signal<boolean>;
20
20
  readonly reportFilterKey: import("@angular/core").Signal<string>;
@@ -1,7 +1,10 @@
1
1
  import { GridFieldType, GridFormat, GridUnits, } from '@firestitch/grid';
2
+ import { ReportChartDateLabel } from '../../enums/report-chart-date-label.enum';
2
3
  import { ReportNumberUnits } from '../../enums/report-number-units.enum';
3
4
  import { ReportValueFormat } from '../../enums/report-value-format.enum';
4
5
  import { formatNumber, formatOutputValue, formatReportDate, numberFormat } from '../../format';
6
+ import { formatPeriodLabel } from '../../option-builder';
7
+ import { GRID_GRANULARITIES } from '../../report-grid-layout';
5
8
  const VALUE_FORMATS = {
6
9
  [GridFormat.Number]: ReportValueFormat.Number,
7
10
  [GridFormat.Percent]: ReportValueFormat.Percent,
@@ -20,9 +23,10 @@ const NO = 'No';
20
23
  // A grid tile's formatter: every value written as the report writes it on
21
24
  // a list today. An output number reads through formatOutputValue with what
22
25
  // the report line says the output holds (a change is signed, a missing prior
23
- // reads as the list's dash); a plain number through formatNumber; a date in
24
- // the report's locale, an instant in its zone. The placement's format,
25
- // precision and units win over the field's.
26
+ // reads as the list's dash); a plain number through formatNumber; a key's
27
+ // digits as they are; a date at its grain in the report's locale, an instant
28
+ // in its zone. The placement's format, precision and units win over the
29
+ // field's.
26
30
  export function reportGridFormatter(context) {
27
31
  return {
28
32
  format: (value, field, placement) => formatGridValue(context, value, field, placement),
@@ -37,6 +41,7 @@ function formatGridValue(context, value, field, placement) {
37
41
  case GridFieldType.Number:
38
42
  return formatGridNumber(context, value, field, placement);
39
43
  case GridFieldType.Date:
44
+ return formatGridDate(context, value, field, placement);
40
45
  case GridFieldType.Datetime:
41
46
  return formatReportDate(value, context.timezone, context.format.locale);
42
47
  case GridFieldType.Boolean:
@@ -46,12 +51,29 @@ function formatGridValue(context, value, field, placement) {
46
51
  }
47
52
  }
48
53
  function formatGridNumber(context, value, field, placement) {
54
+ // A key, such as a client's id, is a name: its digits print as they are, never grouped
55
+ if (field.identifier && !isAggregate(placement)) {
56
+ return String(value);
57
+ }
49
58
  const spec = numberSpec(field, placement);
50
59
  const output = isAggregate(placement) ? null : context.report?.outputs?.[field.name];
51
60
  return output
52
61
  ? formatOutputValue(value, output, spec, context.format).text
53
62
  : formatNumber(value, spec, context.format);
54
63
  }
64
+ // A calendar date at the grain it prints at: the placement's, else the
65
+ // field's own, which on a time axis is the report's group-by. A quarter reads
66
+ // "Q3 2023", a month "Jul 2023" and a year "2023", as the report's charts
67
+ // label them, rather than as their first day; a week, like a chart's, reads as
68
+ // the day it starts. A day reads as the report writes a date.
69
+ function formatGridDate(context, value, field, placement) {
70
+ const granularity = placement?.granularity ?? field.granularities?.[0];
71
+ const chartGranularity = Object.keys(GRID_GRANULARITIES)
72
+ .find((name) => GRID_GRANULARITIES[name] === granularity);
73
+ return chartGranularity && chartGranularity !== 'day' && typeof value === 'string'
74
+ ? formatPeriodLabel(value.slice(0, 10), chartGranularity, false, context.format.locale, ReportChartDateLabel.Long)
75
+ : formatReportDate(value, context.timezone, context.format.locale);
76
+ }
55
77
  // The format, precision and units a number is written with: the placement's,
56
78
  // else the field's.
57
79
  function numberSpec(field, placement) {
@@ -91,4 +113,4 @@ function readGridNumber(context, text, field, placement) {
91
113
  function decimalMark(locale) {
92
114
  return numberFormat(locale, {}).formatToParts(1.5).find((part) => part.type === 'decimal')?.value ?? '.';
93
115
  }
94
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LWdyaWQtZm9ybWF0dGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2NvbXBvbmVudHMvY29tcG9uZW50LWdyaWQvcmVwb3J0LWdyaWQtZm9ybWF0dGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDa0IsYUFBYSxFQUFFLFVBQVUsRUFBNEIsU0FBUyxHQUN0RixNQUFNLGtCQUFrQixDQUFDO0FBRTFCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxZQUFZLEVBQUUsaUJBQWlCLEVBQUUsZ0JBQWdCLEVBQUUsWUFBWSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBZ0IvRixNQUFNLGFBQWEsR0FBb0Q7SUFDckUsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEVBQUUsaUJBQWlCLENBQUMsTUFBTTtJQUM3QyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsRUFBRSxpQkFBaUIsQ0FBQyxPQUFPO0lBQy9DLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxFQUFFLGlCQUFpQixDQUFDLFFBQVE7Q0FDbEQsQ0FBQztBQUVGLE1BQU0sWUFBWSxHQUFtRDtJQUNuRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxpQkFBaUIsQ0FBQyxJQUFJO0lBQ3hDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxFQUFFLGlCQUFpQixDQUFDLFNBQVM7SUFDbEQsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEVBQUUsaUJBQWlCLENBQUMsUUFBUTtJQUNoRCxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxpQkFBaUIsQ0FBQyxJQUFJO0NBQ3pDLENBQUM7QUFFRixpRkFBaUY7QUFDakYsTUFBTSxhQUFhLEdBQXFDLEVBQUUsQ0FBQyxFQUFF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QUFDO0lBQ3pELE1BQU0sTUFBTSxHQUFHLE9BQU87U0FDbkIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDeEUsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLElBQUksTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO0lBRTlGLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDN0IsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsTUFBTSxTQUFTLEdBQUcsQ0FBQyxTQUFTLEVBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxVQUFVLENBQUMsT0FBTyxDQUFDO0lBRTdFLE9BQU8sU0FBUyxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7QUFDMUUsQ0FBQztBQUVELFNBQVMsV0FBVyxDQUFDLE1BQWM7SUFDakMsT0FBTyxZQUFZLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssU0FBUyxDQUFDLEVBQUUsS0FBSyxJQUFJLEdBQUcsQ0FBQztBQUMzRyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgR3JpZERldGFpbCwgR3JpZEZpZWxkLCBHcmlkRmllbGRUeXBlLCBHcmlkRm9ybWF0LCBHcmlkRm9ybWF0dGVyLCBHcmlkTGV2ZWwsIEdyaWRVbml0cywgR3JpZFZhbHVlLFxufSBmcm9tICdAZmlyZXN0aXRjaC9ncmlkJztcblxuaW1wb3J0IHsgUmVwb3J0TnVtYmVyVW5pdHMgfSBmcm9tICcuLi8uLi9lbnVtcy9yZXBvcnQtbnVtYmVyLXVuaXRzLmVudW0nO1xuaW1wb3J0IHsgUmVwb3J0VmFsdWVGb3JtYXQgfSBmcm9tICcuLi8uLi9lbnVtcy9yZXBvcnQtdmFsdWUtZm9ybWF0LmVudW0nO1xuaW1wb3J0IHsgZm9ybWF0TnVtYmVyLCBmb3JtYXRPdXRwdXRWYWx1ZSwgZm9ybWF0UmVwb3J0RGF0ZSwgbnVtYmVyRm9ybWF0IH0gZnJvbSAnLi4vLi4vZm9ybWF0JztcbmltcG9ydCB7IFJlcG9ydEdyaWRSZXBvcnQgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3JlcG9ydC1ncmlkLXJlcG9ydC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgTnVtYmVyRm9ybWF0U3BlYywgUmVwb3J0Rm9ybWF0Q29udGV4dCB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvcmVwb3J0LmludGVyZmFjZSc7XG5cblxudHlwZSBHcmlkUGxhY2VtZW50ID0gR3JpZFZhbHVlIHwgR3JpZERldGFpbCB8IEdyaWRMZXZlbDtcblxuLy8gV2hhdCBhIGdyaWQgdGlsZSBpcyB3cml0dGVuIHdpdGg6IHRoZSByZXBvcnQncyBsb2NhbGUsIGN1cnJlbmN5IGFuZFxuLy8gcGVyY2VudCBmb3JtLCB0aGUgem9uZSBpdHMgaW5zdGFudHMgcmVhZCBpbiwgYW5kIHRoZSByZXBvcnQgbGluZSBvZiBpdHNcbi8vIGxhdGVzdCByZWFkICh3aGF0IGVhY2ggb3V0cHV0IGZpZWxkIGhvbGRzKS5cbmV4cG9ydCBpbnRlcmZhY2UgUmVwb3J0R3JpZEZvcm1hdENvbnRleHQge1xuICBmb3JtYXQ6IFJlcG9ydEZvcm1hdENvbnRleHQ7XG4gIHRpbWV6b25lOiBzdHJpbmc7XG4gIHJlcG9ydDogUmVwb3J0R3JpZFJlcG9ydCB8IG51bGw7XG59XG5cbmNvbnN0IFZBTFVFX0ZPUk1BVFM6IFJlYWRvbmx5PFJlY29yZDxHcmlkRm9ybWF0LCBSZXBvcnRWYWx1ZUZvcm1hdD4+ID0ge1xuICBbR3JpZEZvcm1hdC5OdW1iZXJdOiBSZXBvcnRWYWx1ZUZvcm1hdC5OdW1iZXIsXG4gIFtHcmlkRm9ybWF0LlBlcmNlbnRdOiBSZXBvcnRWYWx1ZUZvcm1hdC5QZXJjZW50LFxuICBbR3JpZEZvcm1hdC5DdXJyZW5jeV06IFJlcG9ydFZhbHVlRm9ybWF0LkN1cnJlbmN5LFxufTtcblxuY29uc3QgTlVNQkVSX1VOSVRTOiBSZWFkb25seTxSZWNvcmQ8R3JpZFVuaXRzLCBSZXBvcnROdW1iZXJVbml0cz4+ID0ge1xuICBbR3JpZFVuaXRzLk5vbmVdOiBSZXBvcnROdW1iZXJVbml0cy5Ob25lLFxuICBbR3JpZFVuaXRzLlRob3VzYW5kc106IFJlcG9ydE51bWJlclVuaXRzLlRob3VzYW5kcyxcbiAgW0dyaWRVbml0cy5NaWxsaW9uc106IFJlcG9ydE51bWJlclVuaXRzLk1pbGxpb25zLFxuICBbR3JpZFVuaXRzLkF1dG9dOiBSZXBvcnROdW1iZXJVbml0cy5BdXRvLFxufTtcblxuLy8gV2hhdCBhbiBhYmJyZXZpYXRlZCBudW1iZXIncyBzdWZmaXggbXVsdGlwbGllcyBpdCBieSwgd2hlbiBhIHZpZXdlciB0eXBlcyBvbmUuXG5jb25zdCBVTklUX1NVRkZJWEVTOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBudW1iZXI+PiA9IHsgazogMWUzLCBtOiAxZTYgfTtcblxuY29uc3QgWUVTID0gJ1llcyc7XG5jb25zdCBOTyA9ICdObyc7XG5cbi8vIEEgZ3JpZCB0aWxlJ3MgZm9ybWF0dGVyOiBldmVyeSB2YWx1ZSB3cml0dGVuIGFzIHRoZSByZXBvcnQgd3JpdGVzIGl0IG9uXG4vLyBhIGxpc3QgdG9kYXkuIEFuIG91dHB1dCBudW1iZXIgcmVhZHMgdGhyb3VnaCBmb3JtYXRPdXRwdXRWYWx1ZSB3aXRoIHdoYXRcbi8vIHRoZSByZXBvcnQgbGluZSBzYXlzIHRoZSBvdXRwdXQgaG9sZHMgKGEgY2hhbmdlIGlzIHNpZ25lZCwgYSBtaXNzaW5nIHByaW9yXG4vLyByZWFkcyBhcyB0aGUgbGlzdCdzIGRhc2gpOyBhIHBsYWluIG51bWJlciB0aHJvdWdoIGZvcm1hdE51bWJlcjsgYSBkYXRlIGluXG4vLyB0aGUgcmVwb3J0J3MgbG9jYWxlLCBhbiBpbnN0YW50IGluIGl0cyB6b25lLiBUaGUgcGxhY2VtZW50J3MgZm9ybWF0LFxuLy8gcHJlY2lzaW9uIGFuZCB1bml0cyB3aW4gb3ZlciB0aGUgZmllbGQncy5cbmV4cG9ydCBmdW5jdGlvbiByZXBvcnRHcmlkRm9ybWF0dGVyKGNvbnRleHQ6IFJlcG9ydEdyaWRGb3JtYXRDb250ZXh0KTogR3JpZEZvcm1hdHRlciB7XG4gIHJldHVybiB7XG4gICAgZm9ybWF0OiAodmFsdWUsIGZpZWxkLCBwbGFjZW1lbnQpID0+IGZvcm1hdEdyaWRWYWx1ZShjb250ZXh0LCB2YWx1ZSwgZmllbGQsIHBsYWNlbWVudCksXG4gICAgdG9OdW1iZXI6ICh0ZXh0LCBmaWVsZCwgcGxhY2VtZW50KSA9PiByZWFkR3JpZE51bWJlcihjb250ZXh0LCB0ZXh0LCBmaWVsZCwgcGxhY2VtZW50KSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0R3JpZFZhbHVlKFxuICBjb250ZXh0OiBSZXBvcnRHcmlkRm9ybWF0Q29udGV4dCxcbiAgdmFsdWU6IHVua25vd24sXG4gIGZpZWxkOiBHcmlkRmllbGQsXG4gIHBsYWNlbWVudD86IEdyaWRQbGFjZW1lbnQsXG4pOiBzdHJpbmcge1xuICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gJycpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBzd2l0Y2ggKGZpZWxkLnR5cGUpIHtcbiAgICBjYXNlIEdyaWRGaWVsZFR5cGUuTnVtYmVyOlxuICAgICAgcmV0dXJuIGZvcm1hdEdyaWROdW1iZXIoY29udGV4dCwgdmFsdWUsIGZpZWxkLCBwbGFjZW1lbnQpO1xuICAgIGNhc2UgR3JpZEZpZWxkVHlwZS5EYXRlOlxuICAgIGNhc2UgR3JpZEZpZWxkVHlwZS5EYXRldGltZTpcbiAgICAgIHJldHVybiBmb3JtYXRSZXBvcnREYXRlKHZhbHVlLCBjb250ZXh0LnRpbWV6b25lLCBjb250ZXh0LmZvcm1hdC5sb2NhbGUpO1xuICAgIGNhc2UgR3JpZEZpZWxkVHlwZS5Cb29sZWFuOlxuICAgICAgcmV0dXJuIHZhbHVlID8gWUVTIDogTk87XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBvcHRpb25MYWJlbCh2YWx1ZSwgZmllbGQpID8/IFN0cmluZyh2YWx1ZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZm9ybWF0R3JpZE51bWJlcihcbiAgY29udGV4dDogUmVwb3J0R3JpZEZvcm1hdENvbnRleHQsXG4gIHZhbHVlOiB1bmtub3duLFxuICBmaWVsZDogR3JpZEZpZWxkLFxuICBwbGFjZW1lbnQ/OiBHcmlkUGxhY2VtZW50LFxuKTogc3RyaW5nIHtcbiAgY29uc3Qgc3BlYyA9IG51bWJlclNwZWMoZmllbGQsIHBsYWNlbWVudCk7XG4gIGNvbnN0IG91dHB1dCA9IGlzQWdncmVnYXRlKHBsYWNlbWVudCkgPyBudWxsIDogY29udGV4dC5yZXBvcnQ/Lm91dHB1dHM/LltmaWVsZC5uYW1lXTtcblxuICByZXR1cm4gb3V0cHV0XG4gICAgPyBmb3JtYXRPdXRwdXRWYWx1ZSh2YWx1ZSwgb3V0cHV0LCBzcGVjLCBjb250ZXh0LmZvcm1hdCkudGV4dFxuICAgIDogZm9ybWF0TnVtYmVyKHZhbHVlLCBzcGVjLCBjb250ZXh0LmZvcm1hdCk7XG59XG5cbi8vIFRoZSBmb3JtYXQsIHByZWNpc2lvbiBhbmQgdW5pdHMgYSBudW1iZXIgaXMgd3JpdHRlbiB3aXRoOiB0aGUgcGxhY2VtZW50J3MsXG4vLyBlbHNlIHRoZSBmaWVsZCdzLlxuZnVuY3Rpb24gbnVtYmVyU3BlYyhmaWVsZDogR3JpZEZpZWxkLCBwbGFjZW1lbnQ/OiBHcmlkUGxhY2VtZW50KTogTnVtYmVyRm9ybWF0U3BlYyB7XG4gIGNvbnN0IHBsYWNlZCA9IHBsYWNlbWVudCBhcyBHcmlkVmFsdWUgfCBHcmlkRGV0YWlsIHwgdW5kZWZpbmVkO1xuICBjb25zdCBmb3JtYXQgPSBwbGFjZWQ/LmZvcm1hdCA/PyBmaWVsZC5mb3JtYXQ7XG4gIGNvbnN0IHByZWNpc2lvbiA9IHBsYWNlZD8ucHJlY2lzaW9uID8/IGZpZWxkLnByZWNpc2lvbjtcbiAgY29uc3QgdW5pdHMgPSBwbGFjZWQ/LnVuaXRzID8/IGZpZWxkLnVuaXRzO1xuXG4gIHJldHVybiB7XG4gICAgLi4uKGZvcm1hdCA/IHsgZm9ybWF0OiBWQUxVRV9GT1JNQVRTW2Zvcm1hdF0gfSA6IHt9KSxcbiAgICAuLi4odHlwZW9mIHByZWNpc2lvbiA9PT0gJ251bWJlcicgPyB7IHByZWNpc2lvbiB9IDoge30pLFxuICAgIC4uLih1bml0cyA/IHsgdW5pdHM6IE5VTUJFUl9VTklUU1t1bml0c10gfSA6IHt9KSxcbiAgfTtcbn1cblxuLy8gQSB2YWx1ZSBwbGFjZW1lbnQgaXMgYW4gYWdncmVnYXRlIG9mIHRoZSBmaWVsZCwgbm90IHRoZSBvdXRwdXQgaXRzZWxmLlxuZnVuY3Rpb24gaXNBZ2dyZWdhdGUocGxhY2VtZW50PzogR3JpZFBsYWNlbWVudCk6IGJvb2xlYW4ge1xuICByZXR1cm4gISEocGxhY2VtZW50IGFzIEdyaWRWYWx1ZSB8IHVuZGVmaW5lZCk/LmFnZ3JlZ2F0aW9uO1xufVxuXG5mdW5jdGlvbiBvcHRpb25MYWJlbCh2YWx1ZTogdW5rbm93biwgZmllbGQ6IEdyaWRGaWVsZCk6IHN0cmluZyB8IG51bGwge1xuICByZXR1cm4gZmllbGQub3B0aW9ucz8uZmluZCgob3B0aW9uKSA9PiBvcHRpb24ua2V5ID09PSB2YWx1ZSk/LmxhYmVsID8/IG51bGw7XG59XG5cbi8vIEEgbnVtYmVyIGEgdmlld2VyIHR5cGVkLCByZWFkIGluIHRoZSByZXBvcnQncyBsb2NhbGU6IGl0cyBncm91cGluZyBkcm9wcGVkLFxuLy8gaXRzIGRlY2ltYWwgbWFyayByZWFkLCBhIEsgb3IgTSBzdWZmaXggbXVsdGlwbGllZCBvdXQsIGFuZCBhIHBlcmNlbnQgb2YgYVxuLy8gcmF0aW8tcGVyY2VudCByZXBvcnQgcmVhZCBiYWNrIHRvIGl0cyByYXRpby4gbnVsbCB3aGVuIGl0IGlzIG5vIG51bWJlci5cbmZ1bmN0aW9uIHJlYWRHcmlkTnVtYmVyKFxuICBjb250ZXh0OiBSZXBvcnRHcmlkRm9ybWF0Q29udGV4dCxcbiAgdGV4dDogc3RyaW5nLFxuICBmaWVsZDogR3JpZEZpZWxkLFxuICBwbGFjZW1lbnQ/OiBHcmlkVmFsdWUgfCBHcmlkRGV0YWlsLFxuKTogbnVtYmVyIHwgbnVsbCB7XG4gIGNvbnN0IGRlY2ltYWwgPSBkZWNpbWFsTWFyayhjb250ZXh0LmZvcm1hdC5sb2NhbGUpO1xuICBjb25zdCB0cmltbWVkID0gdGV4dC50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgY29uc3QgbXVsdGlwbGllciA9IFVOSVRfU1VGRklYRVNbdHJpbW1lZC5zbGljZSgtMSldID8/IDE7XG4gIGNvbnN0IGRpZ2l0cyA9IHRyaW1tZWRcbiAgICAuc3BsaXQoZGVjaW1hbCkubWFwKChwYXJ0KSA9PiBwYXJ0LnJlcGxhY2UoL1teMC05LV0vZywgJycpKS5qb2luKCcuJyk7XG4gIGNvbnN0IG51bWJlciA9IGRpZ2l0cyAmJiBkaWdpdHMgIT09ICctJyAmJiBkaWdpdHMgIT09ICcuJyA/IE51bWJlcihkaWdpdHMpICogbXVsdGlwbGllciA6IE5hTjtcblxuICBpZiAoIU51bWJlci5pc0Zpbml0ZShudW1iZXIpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBpc1BlcmNlbnQgPSAocGxhY2VtZW50Py5mb3JtYXQgPz8gZmllbGQuZm9ybWF0KSA9PT0gR3JpZEZvcm1hdC5QZXJjZW50O1xuXG4gIHJldHVybiBpc1BlcmNlbnQgJiYgY29udGV4dC5mb3JtYXQucmF0aW9QZXJjZW50ID8gbnVtYmVyIC8gMTAwIDogbnVtYmVyO1xufVxuXG5mdW5jdGlvbiBkZWNpbWFsTWFyayhsb2NhbGU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBudW1iZXJGb3JtYXQobG9jYWxlLCB7fSkuZm9ybWF0VG9QYXJ0cygxLjUpLmZpbmQoKHBhcnQpID0+IHBhcnQudHlwZSA9PT0gJ2RlY2ltYWwnKT8udmFsdWUgPz8gJy4nO1xufVxuIl19
116
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LWdyaWQtZm9ybWF0dGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2NvbXBvbmVudHMvY29tcG9uZW50LWdyaWQvcmVwb3J0LWdyaWQtZm9ybWF0dGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDa0IsYUFBYSxFQUFFLFVBQVUsRUFBNEIsU0FBUyxHQUN0RixNQUFNLGtCQUFrQixDQUFDO0FBRTFCLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxZQUFZLEVBQUUsaUJBQWlCLEVBQUUsZ0JBQWdCLEVBQUUsWUFBWSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRy9GLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBYzlELE1BQU0sYUFBYSxHQUFvRDtJQUNyRSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsRUFBRSxpQkFBaUIsQ0FBQyxNQUFNO0lBQzdDLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFLGlCQUFpQixDQUFDLE9BQU87SUFDL0MsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEVBQUUsaUJBQWlCLENBQUMsUUFBUTtDQUNsRCxDQUFDO0FBRUYsTUFBTSxZQUFZLEdBQW1EO0lBQ25FLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLGlCQUFpQixDQUFDLElBQUk7SUFDeEMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLEVBQUUsaUJBQWlCLENBQUMsU0FBUztJQUNsRCxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMs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bnQiOlsiaW1wb3J0IHtcbiAgR3JpZERldGFpbCwgR3JpZEZpZWxkLCBHcmlkRmllbGRUeXBlLCBHcmlkRm9ybWF0LCBHcmlkRm9ybWF0dGVyLCBHcmlkTGV2ZWwsIEdyaWRVbml0cywgR3JpZFZhbHVlLFxufSBmcm9tICdAZmlyZXN0aXRjaC9ncmlkJztcblxuaW1wb3J0IHsgUmVwb3J0Q2hhcnREYXRlTGFiZWwgfSBmcm9tICcuLi8uLi9lbnVtcy9yZXBvcnQtY2hhcnQtZGF0ZS1sYWJlbC5lbnVtJztcbmltcG9ydCB7IFJlcG9ydE51bWJlclVuaXRzIH0gZnJvbSAnLi4vLi4vZW51bXMvcmVwb3J0LW51bWJlci11bml0cy5lbnVtJztcbmltcG9ydCB7IFJlcG9ydFZhbHVlRm9ybWF0IH0gZnJvbSAnLi4vLi4vZW51bXMvcmVwb3J0LXZhbHVlLWZvcm1hdC5lbnVtJztcbmltcG9ydCB7IGZvcm1hdE51bWJlciwgZm9ybWF0T3V0cHV0VmFsdWUsIGZvcm1hdFJlcG9ydERhdGUsIG51bWJlckZvcm1hdCB9IGZyb20gJy4uLy4uL2Zvcm1hdCc7XG5pbXBvcnQgeyBSZXBvcnRHcmlkUmVwb3J0IH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9yZXBvcnQtZ3JpZC1yZXBvcnQuaW50ZXJmYWNlJztcbmltcG9ydCB7IENoYXJ0R3JhbnVsYXJpdHksIE51bWJlckZvcm1hdFNwZWMsIFJlcG9ydEZvcm1hdENvbnRleHQgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3JlcG9ydC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgZm9ybWF0UGVyaW9kTGFiZWwgfSBmcm9tICcuLi8uLi9vcHRpb24tYnVpbGRlcic7XG5pbXBvcnQgeyBHUklEX0dSQU5VTEFSSVRJRVMgfSBmcm9tICcuLi8uLi9yZXBvcnQtZ3JpZC1sYXlvdXQnO1xuXG5cbnR5cGUgR3JpZFBsYWNlbWVudCA9IEdyaWRWYWx1ZSB8IEdyaWREZXRhaWwgfCBHcmlkTGV2ZWw7XG5cbi8vIFdoYXQgYSBncmlkIHRpbGUgaXMgd3JpdHRlbiB3aXRoOiB0aGUgcmVwb3J0J3MgbG9jYWxlLCBjdXJyZW5jeSBhbmRcbi8vIHBlcmNlbnQgZm9ybSwgdGhlIHpvbmUgaXRzIGluc3RhbnRzIHJlYWQgaW4sIGFuZCB0aGUgcmVwb3J0IGxpbmUgb2YgaXRzXG4vLyBsYXRlc3QgcmVhZCAod2hhdCBlYWNoIG91dHB1dCBmaWVsZCBob2xkcykuXG5leHBvcnQgaW50ZXJmYWNlIFJlcG9ydEdyaWRGb3JtYXRDb250ZXh0IHtcbiAgZm9ybWF0OiBSZXBvcnRGb3JtYXRDb250ZXh0O1xuICB0aW1lem9uZTogc3RyaW5nO1xuICByZXBvcnQ6IFJlcG9ydEdyaWRSZXBvcnQgfCBudWxsO1xufVxuXG5jb25zdCBWQUxVRV9GT1JNQVRTOiBSZWFkb25seTxSZWNvcmQ8R3JpZEZvcm1hdCwgUmVwb3J0VmFsdWVGb3JtYXQ+PiA9IHtcbiAgW0dyaWRGb3JtYXQuTnVtYmVyXTogUmVwb3J0VmFsdWVGb3JtYXQuTnVtYmVyLFxuICBbR3JpZEZvcm1hdC5QZXJjZW50XTogUmVwb3J0VmFsdWVGb3JtYXQuUGVyY2VudCxcbiAgW0dyaWRGb3JtYXQuQ3VycmVuY3ldOiBSZXBvcnRWYWx1ZUZvcm1hdC5DdXJyZW5jeSxcbn07XG5cbmNvbnN0IE5VTUJFUl9VTklUUzogUmVhZG9ubHk8UmVjb3JkPEdyaWRVbml0cywgUmVwb3J0TnVtYmVyVW5pdHM+PiA9IHtcbiAgW0dyaWRVbml0cy5Ob25lXTogUmVwb3J0TnVtYmVyVW5pdHMuTm9uZSxcbiAgW0dyaWRVbml0cy5UaG91c2FuZHNdOiBSZXBvcnROdW1iZXJVbml0cy5UaG91c2FuZHMsXG4gIFtHcmlkVW5pdHMuTWlsbGlvbnNdOiBSZXBvcnROdW1iZXJVbml0cy5NaWxsaW9ucyxcbiAgW0dyaWRVbml0cy5BdXRvXTogUmVwb3J0TnVtYmVyVW5pdHMuQXV0byxcbn07XG5cbi8vIFdoYXQgYW4gYWJicmV2aWF0ZWQgbnVtYmVyJ3Mgc3VmZml4IG11bHRpcGxpZXMgaXQgYnksIHdoZW4gYSB2aWV3ZXIgdHlwZXMgb25lLlxuY29uc3QgVU5JVF9TVUZGSVhFUzogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgbnVtYmVyPj4gPSB7IGs6IDFlMywgbTogMWU2IH07XG5cbmNvbnN0IFlFUyA9ICdZZXMnO1xuY29uc3QgTk8gPSAnTm8nO1xuXG4vLyBBIGdyaWQgdGlsZSdzIGZvcm1hdHRlcjogZXZlcnkgdmFsdWUgd3JpdHRlbiBhcyB0aGUgcmVwb3J0IHdyaXRlcyBpdCBvblxuLy8gYSBsaXN0IHRvZGF5LiBBbiBvdXRwdXQgbnVtYmVyIHJlYWRzIHRocm91Z2ggZm9ybWF0T3V0cHV0VmFsdWUgd2l0aCB3aGF0XG4vLyB0aGUgcmVwb3J0IGxpbmUgc2F5cyB0aGUgb3V0cHV0IGhvbGRzIChhIGNoYW5nZSBpcyBzaWduZWQsIGEgbWlzc2luZyBwcmlvclxuLy8gcmVhZHMgYXMgdGhlIGxpc3QncyBkYXNoKTsgYSBwbGFpbiBudW1iZXIgdGhyb3VnaCBmb3JtYXROdW1iZXI7IGEga2V5J3Ncbi8vIGRpZ2l0cyBhcyB0aGV5IGFyZTsgYSBkYXRlIGF0IGl0cyBncmFpbiBpbiB0aGUgcmVwb3J0J3MgbG9jYWxlLCBhbiBpbnN0YW50XG4vLyBpbiBpdHMgem9uZS4gVGhlIHBsYWNlbWVudCdzIGZvcm1hdCwgcHJlY2lzaW9uIGFuZCB1bml0cyB3aW4gb3ZlciB0aGVcbi8vIGZpZWxkJ3MuXG5leHBvcnQgZnVuY3Rpb24gcmVwb3J0R3JpZEZvcm1hdHRlcihjb250ZXh0OiBSZXBvcnRHcmlkRm9ybWF0Q29udGV4dCk6IEdyaWRGb3JtYXR0ZXIge1xuICByZXR1cm4ge1xuICAgIGZvcm1hdDogKHZhbHVlLCBmaWVsZCwgcGxhY2VtZW50KSA9PiBmb3JtYXRHcmlkVmFsdWUoY29udGV4dCwgdmFsdWUsIGZpZWxkLCBwbGFjZW1lbnQpLFxuICAgIHRvTnVtYmVyOiAodGV4dCwgZmllbGQsIHBsYWNlbWVudCkgPT4gcmVhZEdyaWROdW1iZXIoY29udGV4dCwgdGV4dCwgZmllbGQsIHBsYWNlbWVudCksXG4gIH07XG59XG5cbmZ1bmN0aW9uIGZvcm1hdEdyaWRWYWx1ZShcbiAgY29udGV4dDogUmVwb3J0R3JpZEZvcm1hdENvbnRleHQsXG4gIHZhbHVlOiB1bmtub3duLFxuICBmaWVsZDogR3JpZEZpZWxkLFxuICBwbGFjZW1lbnQ/OiBHcmlkUGxhY2VtZW50LFxuKTogc3RyaW5nIHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09ICcnKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgc3dpdGNoIChmaWVsZC50eXBlKSB7XG4gICAgY2FzZSBHcmlkRmllbGRUeXBlLk51bWJlcjpcbiAgICAgIHJldHVybiBmb3JtYXRHcmlkTnVtYmVyKGNvbnRleHQsIHZhbHVlLCBmaWVsZCwgcGxhY2VtZW50KTtcbiAgICBjYXNlIEdyaWRGaWVsZFR5cGUuRGF0ZTpcbiAgICAgIHJldHVybiBmb3JtYXRHcmlkRGF0ZShjb250ZXh0LCB2YWx1ZSwgZmllbGQsIHBsYWNlbWVudCk7XG4gICAgY2FzZSBHcmlkRmllbGRUeXBlLkRhdGV0aW1lOlxuICAgICAgcmV0dXJuIGZvcm1hdFJlcG9ydERhdGUodmFsdWUsIGNvbnRleHQudGltZXpvbmUsIGNvbnRleHQuZm9ybWF0LmxvY2FsZSk7XG4gICAgY2FzZSBHcmlkRmllbGRUeXBlLkJvb2xlYW46XG4gICAgICByZXR1cm4gdmFsdWUgPyBZRVMgOiBOTztcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIG9wdGlvbkxhYmVsKHZhbHVlLCBmaWVsZCkgPz8gU3RyaW5nKHZhbHVlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmb3JtYXRHcmlkTnVtYmVyKFxuICBjb250ZXh0OiBSZXBvcnRHcmlkRm9ybWF0Q29udGV4dCxcbiAgdmFsdWU6IHVua25vd24sXG4gIGZpZWxkOiBHcmlkRmllbGQsXG4gIHBsYWNlbWVudD86IEdyaWRQbGFjZW1lbnQsXG4pOiBzdHJpbmcge1xuICAvLyBBIGtleSwgc3VjaCBhcyBhIGNsaWVudCdzIGlkLCBpcyBhIG5hbWU6IGl0cyBkaWdpdHMgcHJpbnQgYXMgdGhleSBhcmUsIG5ldmVyIGdyb3VwZWRcbiAgaWYgKGZpZWxkLmlkZW50aWZpZXIgJiYgIWlzQWdncmVnYXRlKHBsYWNlbWVudCkpIHtcbiAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbiAgfVxuXG4gIGNvbnN0IHNwZWMgPSBudW1iZXJTcGVjKGZpZWxkLCBwbGFjZW1lbnQpO1xuICBjb25zdCBvdXRwdXQgPSBpc0FnZ3JlZ2F0ZShwbGFjZW1lbnQpID8gbnVsbCA6IGNvbnRleHQucmVwb3J0Py5vdXRwdXRzPy5bZmllbGQubmFtZV07XG5cbiAgcmV0dXJuIG91dHB1dFxuICAgID8gZm9ybWF0T3V0cHV0VmFsdWUodmFsdWUsIG91dHB1dCwgc3BlYywgY29udGV4dC5mb3JtYXQpLnRleHRcbiAgICA6IGZvcm1hdE51bWJlcih2YWx1ZSwgc3BlYywgY29udGV4dC5mb3JtYXQpO1xufVxuXG4vLyBBIGNhbGVuZGFyIGRhdGUgYXQgdGhlIGdyYWluIGl0IHByaW50cyBhdDogdGhlIHBsYWNlbWVudCdzLCBlbHNlIHRoZVxuLy8gZmllbGQncyBvd24sIHdoaWNoIG9uIGEgdGltZSBheGlzIGlzIHRoZSByZXBvcnQncyBncm91cC1ieS4gQSBxdWFydGVyIHJlYWRzXG4vLyBcIlEzIDIwMjNcIiwgYSBtb250aCBcIkp1bCAyMDIzXCIgYW5kIGEgeWVhciBcIjIwMjNcIiwgYXMgdGhlIHJlcG9ydCdzIGNoYXJ0c1xuLy8gbGFiZWwgdGhlbSwgcmF0aGVyIHRoYW4gYXMgdGhlaXIgZmlyc3QgZGF5OyBhIHdlZWssIGxpa2UgYSBjaGFydCdzLCByZWFkcyBhc1xuLy8gdGhlIGRheSBpdCBzdGFydHMuIEEgZGF5IHJlYWRzIGFzIHRoZSByZXBvcnQgd3JpdGVzIGEgZGF0ZS5cbmZ1bmN0aW9uIGZvcm1hdEdyaWREYXRlKFxuICBjb250ZXh0OiBSZXBvcnRHcmlkRm9ybWF0Q29udGV4dCxcbiAgdmFsdWU6IHVua25vd24sXG4gIGZpZWxkOiBHcmlkRmllbGQsXG4gIHBsYWNlbWVudD86IEdyaWRQbGFjZW1lbnQsXG4pOiBzdHJpbmcge1xuICBjb25zdCBncmFudWxhcml0eSA9IChwbGFjZW1lbnQgYXMgR3JpZERldGFpbCB8IEdyaWRMZXZlbCB8IHVuZGVmaW5lZCk/LmdyYW51bGFyaXR5ID8/IGZpZWxkLmdyYW51bGFyaXRpZXM/LlswXTtcbiAgY29uc3QgY2hhcnRHcmFudWxhcml0eSA9IChPYmplY3Qua2V5cyhHUklEX0dSQU5VTEFSSVRJRVMpIGFzIENoYXJ0R3JhbnVsYXJpdHlbXSlcbiAgICAuZmluZCgobmFtZSkgPT4gR1JJRF9HUkFOVUxBUklUSUVTW25hbWVdID09PSBncmFudWxhcml0eSk7XG5cbiAgcmV0dXJuIGNoYXJ0R3JhbnVsYXJpdHkgJiYgY2hhcnRHcmFudWxhcml0eSAhPT0gJ2RheScgJiYgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJ1xuICAgID8gZm9ybWF0UGVyaW9kTGFiZWwodmFsdWUuc2xpY2UoMCwgMTApLCBjaGFydEdyYW51bGFyaXR5LCBmYWxzZSwgY29udGV4dC5mb3JtYXQubG9jYWxlLCBSZXBvcnRDaGFydERhdGVMYWJlbC5Mb25nKVxuICAgIDogZm9ybWF0UmVwb3J0RGF0ZSh2YWx1ZSwgY29udGV4dC50aW1lem9uZSwgY29udGV4dC5mb3JtYXQubG9jYWxlKTtcbn1cblxuLy8gVGhlIGZvcm1hdCwgcHJlY2lzaW9uIGFuZCB1bml0cyBhIG51bWJlciBpcyB3cml0dGVuIHdpdGg6IHRoZSBwbGFjZW1lbnQncyxcbi8vIGVsc2UgdGhlIGZpZWxkJ3MuXG5mdW5jdGlvbiBudW1iZXJTcGVjKGZpZWxkOiBHcmlkRmllbGQsIHBsYWNlbWVudD86IEdyaWRQbGFjZW1lbnQpOiBOdW1iZXJGb3JtYXRTcGVjIHtcbiAgY29uc3QgcGxhY2VkID0gcGxhY2VtZW50IGFzIEdyaWRWYWx1ZSB8IEdyaWREZXRhaWwgfCB1bmRlZmluZWQ7XG4gIGNvbnN0IGZvcm1hdCA9IHBsYWNlZD8uZm9ybWF0ID8/IGZpZWxkLmZvcm1hdDtcbiAgY29uc3QgcHJlY2lzaW9uID0gcGxhY2VkPy5wcmVjaXNpb24gPz8gZmllbGQucHJlY2lzaW9uO1xuICBjb25zdCB1bml0cyA9IHBsYWNlZD8udW5pdHMgPz8gZmllbGQudW5pdHM7XG5cbiAgcmV0dXJuIHtcbiAgICAuLi4oZm9ybWF0ID8geyBmb3JtYXQ6IFZBTFVFX0ZPUk1BVFNbZm9ybWF0XSB9IDoge30pLFxuICAgIC4uLih0eXBlb2YgcHJlY2lzaW9uID09PSAnbnVtYmVyJyA/IHsgcHJlY2lzaW9uIH0gOiB7fSksXG4gICAgLi4uKHVuaXRzID8geyB1bml0czogTlVNQkVSX1VOSVRTW3VuaXRzXSB9IDoge30pLFxuICB9O1xufVxuXG4vLyBBIHZhbHVlIHBsYWNlbWVudCBpcyBhbiBhZ2dyZWdhdGUgb2YgdGhlIGZpZWxkLCBub3QgdGhlIG91dHB1dCBpdHNlbGYuXG5mdW5jdGlvbiBpc0FnZ3JlZ2F0ZShwbGFjZW1lbnQ/OiBHcmlkUGxhY2VtZW50KTogYm9vbGVhbiB7XG4gIHJldHVybiAhIShwbGFjZW1lbnQgYXMgR3JpZFZhbHVlIHwgdW5kZWZpbmVkKT8uYWdncmVnYXRpb247XG59XG5cbmZ1bmN0aW9uIG9wdGlvbkxhYmVsKHZhbHVlOiB1bmtub3duLCBmaWVsZDogR3JpZEZpZWxkKTogc3RyaW5nIHwgbnVsbCB7XG4gIHJldHVybiBmaWVsZC5vcHRpb25zPy5maW5kKChvcHRpb24pID0+IG9wdGlvbi5rZXkgPT09IHZhbHVlKT8ubGFiZWwgPz8gbnVsbDtcbn1cblxuLy8gQSBudW1iZXIgYSB2aWV3ZXIgdHlwZWQsIHJlYWQgaW4gdGhlIHJlcG9ydCdzIGxvY2FsZTogaXRzIGdyb3VwaW5nIGRyb3BwZWQsXG4vLyBpdHMgZGVjaW1hbCBtYXJrIHJlYWQsIGEgSyBvciBNIHN1ZmZpeCBtdWx0aXBsaWVkIG91dCwgYW5kIGEgcGVyY2VudCBvZiBhXG4vLyByYXRpby1wZXJjZW50IHJlcG9ydCByZWFkIGJhY2sgdG8gaXRzIHJhdGlvLiBudWxsIHdoZW4gaXQgaXMgbm8gbnVtYmVyLlxuZnVuY3Rpb24gcmVhZEdyaWROdW1iZXIoXG4gIGNvbnRleHQ6IFJlcG9ydEdyaWRGb3JtYXRDb250ZXh0LFxuICB0ZXh0OiBzdHJpbmcsXG4gIGZpZWxkOiBHcmlkRmllbGQsXG4gIHBsYWNlbWVudD86IEdyaWRWYWx1ZSB8IEdyaWREZXRhaWwsXG4pOiBudW1iZXIgfCBudWxsIHtcbiAgY29uc3QgZGVjaW1hbCA9IGRlY2ltYWxNYXJrKGNvbnRleHQuZm9ybWF0LmxvY2FsZSk7XG4gIGNvbnN0IHRyaW1tZWQgPSB0ZXh0LnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBtdWx0aXBsaWVyID0gVU5JVF9TVUZGSVhFU1t0cmltbWVkLnNsaWNlKC0xKV0gPz8gMTtcbiAgY29uc3QgZGlnaXRzID0gdHJpbW1lZFxuICAgIC5zcGxpdChkZWNpbWFsKS5tYXAoKHBhcnQpID0+IHBhcnQucmVwbGFjZSgvW14wLTktXS9nLCAnJykpLmpvaW4oJy4nKTtcbiAgY29uc3QgbnVtYmVyID0gZGlnaXRzICYmIGRpZ2l0cyAhPT0gJy0nICYmIGRpZ2l0cyAhPT0gJy4nID8gTnVtYmVyKGRpZ2l0cykgKiBtdWx0aXBsaWVyIDogTmFOO1xuXG4gIGlmICghTnVtYmVyLmlzRmluaXRlKG51bWJlcikpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IGlzUGVyY2VudCA9IChwbGFjZW1lbnQ/LmZvcm1hdCA/PyBmaWVsZC5mb3JtYXQpID09PSBHcmlkRm9ybWF0LlBlcmNlbnQ7XG5cbiAgcmV0dXJuIGlzUGVyY2VudCAmJiBjb250ZXh0LmZvcm1hdC5yYXRpb1BlcmNlbnQgPyBudW1iZXIgLyAxMDAgOiBudW1iZXI7XG59XG5cbmZ1bmN0aW9uIGRlY2ltYWxNYXJrKGxvY2FsZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIG51bWJlckZvcm1hdChsb2NhbGUsIHt9KS5mb3JtYXRUb1BhcnRzKDEuNSkuZmluZCgocGFydCkgPT4gcGFydC50eXBlID09PSAnZGVjaW1hbCcpPy52YWx1ZSA/PyAnLic7XG59XG4iXX0=
@@ -2,7 +2,7 @@
2
2
  // readGridTable() reads (GridTable) as heading rows, body rows and a total
3
3
  // row of plain cells, and the lines its notes add. Pure, so both renderers
4
4
  // draw one table one way.
5
- import { GridRowKind } from '@firestitch/grid';
5
+ import { GridRowKind, headingLabel } from '@firestitch/grid';
6
6
  import { gridFilterLineText } from './report-filter-lines';
7
7
  // The most pivot columns a file draws, from the first.
8
8
  export const GRID_EXPORT_COLUMNS = 60;
@@ -27,11 +27,12 @@ export function gridExportTable(table) {
27
27
  };
28
28
  }
29
29
  // The lines a table adds under its box: the screen's notes, the pivot
30
- // columns it leaves out, and each column filter of the layout it was read in.
30
+ // columns it leaves out, and each column filter of the layout it was read in,
31
+ // its field named as its column is headed.
31
32
  export function gridExportNotes(table, layout, locale) {
32
33
  const fields = new Map(table.fields.map((field) => [field.name, field]));
33
34
  const filters = (layout.filters ?? [])
34
- .map((filter) => gridFilterLineText(fields.get(filter.field)?.label ?? filter.field, filter, fields.get(filter.field), locale))
35
+ .map((filter) => gridFilterLineText(headingLabel(table.fields, layout, filter.field), filter, fields.get(filter.field), locale))
35
36
  .filter((text) => !!text);
36
37
  return [
37
38
  ...table.notes,
@@ -45,4 +46,4 @@ function headingText(heading) {
45
46
  function exportCell(text, bold, indent, numeric, colSpan = 1, rowSpan = 1) {
46
47
  return { text, colSpan, rowSpan, bold, indent, numeric };
47
48
  }
48
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LWdyaWQtZXhwb3J0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2V4cG9ydC9yZXBvcnQtZ3JpZC1leHBvcnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsa0VBQWtFO0FBQ2xFLDJFQUEyRTtBQUMzRSwyRUFBMkU7QUFDM0UsMEJBQTBCO0FBQzFCLE9BQU8sRUFBYyxXQUFXLEVBQStCLE1BQU0sa0JBQWtCLENBQUM7QUFJeEYsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFHM0QsdURBQXVEO0FBQ3ZELE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLEVBQUUsQ0FBQztBQXlCdEMsNEVBQTRFO0FBQzVFLG1EQUFtRDtBQUNuRCxNQUFNLFVBQVUsZUFBZSxDQUFDLEtBQWdCO0lBQzlDLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDOUQsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsV0FBVyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxRQUFRO1NBQzNGLE1BQU0sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsS0FBSyxHQUFHLENBQUM7U0FDeEMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDO1NBQ25DLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FB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LFVBQVUsQ0FBQyxJQUFZLEVBQUUsSUFBYSxFQUFFLE1BQWMsRUFBRSxPQUFnQixFQUFFLE9BQU8sR0FBRyxDQUFDLEVBQUUsT0FBTyxHQUFHLENBQUM7SUFDekcsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLENBQUM7QUFDM0QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEEgdGFibGUgdGlsZSBhcyB0aGUgUERGIGFuZCB0aGUgZGVjayBkcmF3IGl0OiB0aGUgcHJpbnRlZCB0YWJsZVxuLy8gcmVhZEdyaWRUYWJsZSgpIHJlYWRzIChHcmlkVGFibGUpIGFzIGhlYWRpbmcgcm93cywgYm9keSByb3dzIGFuZCBhIHRvdGFsXG4vLyByb3cgb2YgcGxhaW4gY2VsbHMsIGFuZCB0aGUgbGluZXMgaXRzIG5vdGVzIGFkZC4gUHVyZSwgc28gYm90aCByZW5kZXJlcnNcbi8vIGRyYXcgb25lIHRhYmxlIG9uZSB3YXkuXG5pbXBvcnQgeyBHcmlkTGF5b3V0LCBHcmlkUm93S2luZCwgR3JpZFRhYmxlLCBHcmlkVGFibGVIZWFkaW5nIH0gZnJvbSAnQGZpcmVzdGl0Y2gvZ3JpZCc7XG5cbmltcG9ydCB7IFJlcG9ydEZvcm1hdENvbnRleHQgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3JlcG9ydC5pbnRlcmZhY2UnO1xuXG5pbXBvcnQgeyBncmlkRmlsdGVyTGluZVRleHQgfSBmcm9tICcuL3JlcG9ydC1maWx0ZXItbGluZXMnO1xuXG5cbi8vIFRoZSBtb3N0IHBpdm90IGNvbHVtbnMgYSBmaWxlIGRyYXdzLCBmcm9tIHRoZSBmaXJzdC5cbmV4cG9ydCBjb25zdCBHUklEX0VYUE9SVF9DT0xVTU5TID0gNjA7XG5cbi8vIE9uZSBjZWxsIG9mIGFuIGV4cG9ydGVkIHRhYmxlLiBBIGhlYWRpbmcgY2VsbCBzcGFucyB3aGF0IHRoZSBzY3JlZW4nc1xuLy8gaGVhZGVyIHNwYW5zOyBhIGdyb3VwLCB0b3RhbCBvciBlbXBoYXNpemVkIChzdWJ0b3RhbCwgdG90YWwpIGNlbGwgaXMgYm9sZDtcbi8vIGEgZ3JvdXAncyBsYWJlbCBzdGVwcyBpbiBieSBpdHMgZGVwdGguXG5leHBvcnQgaW50ZXJmYWNlIEdyaWRFeHBvcnRDZWxsIHtcbiAgdGV4dDogc3RyaW5nO1xuICBjb2xTcGFuOiBudW1iZXI7XG4gIHJvd1NwYW46IG51bWJlcjtcbiAgYm9sZDogYm9vbGVhbjtcbiAgaW5kZW50OiBudW1iZXI7XG4gIG51bWVyaWM6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR3JpZEV4cG9ydFRhYmxlIHtcbiAgLy8gSGVhZGluZyByb3dzIHRvcCBmaXJzdCwgZWFjaCBob2xkaW5nIG9ubHkgdGhlIGNlbGxzIHRoYXQgc3RhcnQgb24gaXRcbiAgaGVhZDogR3JpZEV4cG9ydENlbGxbXVtdO1xuICBib2R5OiBHcmlkRXhwb3J0Q2VsbFtdW107XG4gIGZvb3Q6IEdyaWRFeHBvcnRDZWxsW10gfCBudWxsO1xuICAvLyBPbmUgcGVyIHRhYmxlIGNvbHVtbjogaXQgaG9sZHMgZm9ybWF0dGVkIG51bWJlcnMsIHJpZ2h0LWFsaWduZWRcbiAgbnVtZXJpYzogYm9vbGVhbltdO1xuICAvLyBMaW5lcyBwYXN0IHRoZSByb3cgY2FwLCB3aGljaCB0aGUgbW9yZVJvd3NOb3RpY2Ugcm93IGNvdW50c1xuICBtb3JlUm93czogbnVtYmVyO1xufVxuXG4vLyBUaGUgdGFibGUncyBoZWFkaW5nLCBib2R5IGFuZCB0b3RhbCByb3cgYXMgY2VsbHMuIEEgZ3JvdXAncyBsYWJlbCBjYXJyaWVzXG4vLyBpdHMgcm93IGNvdW50IGFmdGVyIGl0LCBhcyB0aGUgc2NyZWVuIHdyaXRlcyBpdC5cbmV4cG9ydCBmdW5jdGlvbiBncmlkRXhwb3J0VGFibGUodGFibGU6IEdyaWRUYWJsZSk6IEdyaWRFeHBvcnRUYWJsZSB7XG4gIGNvbnN0IG51bWVyaWMgPSB0YWJsZS5jb2x1bW5zLm1hcCgoY29sdW1uKSA9PiBjb2x1bW4ubnVtZXJpYyk7XG4gIGNvbnN0IGhlYWQgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiBNYXRoLm1heCgxLCB0YWJsZS5oZWFkaW5nUm93cykgfSwgKF8sIHJvdykgPT4gdGFibGUuaGVhZGluZ3NcbiAgICAuZmlsdGVyKChoZWFkaW5nKSA9PiBoZWFkaW5nLnJvdyA9PT0gcm93KVxuICAgIC5zb3J0KChhLCBiKSA9PiBhLmNvbHVtbiAtIGIuY29sdW1uKVxuICAgIC5tYXAoKGhlYWRpbmcpID0+IGV4cG9ydENlbGwoaGVhZGluZ1RleHQoaGVhZGluZyksIHRydWUsIDAsIGhlYWRpbmcubnVtZXJpYywgaGVhZGluZy5jb2x1bW5TcGFuLCBoZWFkaW5nLnJvd1NwYW4pKSk7XG4gIGNvbnN0IGxpbmUgPSAocm93OiBHcmlkVGFibGVbJ3Jvd3MnXVtudW1iZXJdKSA9PiByb3cuY2VsbHMubWFwKChjZWxsLCBpbmRleCkgPT4ge1xuICAgIGNvbnN0IGlzTGFiZWwgPSBpbmRleCA9PT0gMCAmJiB0YWJsZS5ncm91cENvbHVtbjtcblxuICAgIHJldHVybiBleHBvcnRDZWxsKFxuICAgICAgaXNMYWJlbCAmJiByb3cuY291bnQgPyBgJHtjZWxsLnRleHR9ICgke3Jvdy5jb3VudH0pYCA6IGNlbGwudGV4dCxcbiAgICAgIHJvdy5raW5kICE9PSBHcmlkUm93S2luZC5EZXRhaWwgfHwgISF0YWJsZS5jb2x1bW5zW2luZGV4XT8uZW1waGFzaXMsXG4gICAgICBpc0xhYmVsID8gcm93LmRlcHRoIDogMCxcbiAgICAgIG51bWVyaWNbaW5kZXhdID8/IGZhbHNlLFxuICAgICk7XG4gIH0pO1xuXG4gIHJldHVybiB7XG4gICAgaGVhZCxcbiAgICBib2R5OiB0YWJsZS5yb3dzLm1hcChsaW5lKSxcbiAgICBmb290OiB0YWJsZS50b3RhbFJvdyA/IGxpbmUodGFibGUudG90YWxSb3cpIDogbnVsbCxcbiAgICBudW1lcmljLFxuICAgIG1vcmVSb3dzOiB0YWJsZS5tb3JlUm93cyxcbiAgfTtcbn1cblxuLy8gVGhlIGxpbmVzIGEgdGFibGUgYWRkcyB1bmRlciBpdHMgYm94OiB0aGUgc2NyZWVuJ3Mgbm90ZXMsIHRoZSBwaXZvdFxuLy8gY29sdW1ucyBpdCBsZWF2ZXMgb3V0LCBhbmQgZWFjaCBjb2x1bW4gZmlsdGVyIG9mIHRoZSBsYXlvdXQgaXQgd2FzIHJlYWQgaW4uXG5leHBvcnQgZnVuY3Rpb24gZ3JpZEV4cG9ydE5vdGVzKHRhYmxlOiBHcmlkVGFibGUsIGxheW91dDogR3JpZExheW91dCwgbG9jYWxlOiBSZXBvcnRGb3JtYXRDb250ZXh0Wydsb2NhbGUnXSk6IHN0cmluZ1tdIHtcbiAgY29uc3QgZmllbGRzID0gbmV3IE1hcCh0YWJsZS5maWVsZHMubWFwKChmaWVsZCkgPT4gW2ZpZWxkLm5hbWUsIGZpZWxkXSkpO1xuICBjb25zdCBmaWx0ZXJzID0gKGxheW91dC5maWx0ZXJzID8/IFtdKVxuICAgIC5tYXAoKGZpbHRlcikgPT4gZ3JpZEZpbHRlckxpbmVUZXh0KGZpZWxkcy5nZXQoZmlsdGVyLmZpZWxkKT8ubGFiZWwgPz8gZmlsdGVyLmZpZWxkLCBmaWx0ZXIsIGZpZWxkcy5nZXQoZmlsdGVyLmZpZWxkKSwgbG9jYWxlKSlcbiAgICAuZmlsdGVyKCh0ZXh0KTogdGV4dCBpcyBzdHJpbmcgPT4gISF0ZXh0KTtcblxuICByZXR1cm4gW1xuICAgIC4uLnRhYmxlLm5vdGVzLFxuICAgIC4uLih0YWJsZS5zaG93bkNvbHVtbnMgPCB0YWJsZS5jb2x1bW5Db3VudCA/IFtgU2hvd2luZyB0aGUgZmlyc3QgJHt0YWJsZS5zaG93bkNvbHVtbnN9IG9mICR7dGFibGUuY29sdW1uQ291bnR9IGNvbHVtbnNgXSA6IFtdKSxcbiAgICAuLi5maWx0ZXJzLFxuICBdO1xufVxuXG5mdW5jdGlvbiBoZWFkaW5nVGV4dChoZWFkaW5nOiBHcmlkVGFibGVIZWFkaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGhlYWRpbmcuaGludCA/IGAke2hlYWRpbmcubGFiZWx9ICgke2hlYWRpbmcuaGludH0pYCA6IGhlYWRpbmcubGFiZWw7XG59XG5cbmZ1bmN0aW9uIGV4cG9ydENlbGwodGV4dDogc3RyaW5nLCBib2xkOiBib29sZWFuLCBpbmRlbnQ6IG51bWJlciwgbnVtZXJpYzogYm9vbGVhbiwgY29sU3BhbiA9IDEsIHJvd1NwYW4gPSAxKTogR3JpZEV4cG9ydENlbGwge1xuICByZXR1cm4geyB0ZXh0LCBjb2xTcGFuLCByb3dTcGFuLCBib2xkLCBpbmRlbnQsIG51bWVyaWMgfTtcbn1cbiJdfQ==
49
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LWdyaWQtZXhwb3J0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2V4cG9ydC9yZXBvcnQtZ3JpZC1leHBvcnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsa0VBQWtFO0FBQ2xFLDJFQUEyRTtBQUMzRSwyRUFBMkU7QUFDM0UsMEJBQTBCO0FBQzFCLE9BQU8sRUFBYyxXQUFXLEVBQStCLFlBQVksRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBSXRHLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRzNELHVEQUF1RDtBQUN2RCxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxFQUFFLENBQUM7QUF5QnRDLDRFQUE0RTtBQUM1RSxtREFBbUQ7QUFDbkQsTUFBTSxVQUFVLGVBQWUsQ0FBQyxLQUFnQjtJQUM5QyxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzlELE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLFdBQVcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsUUFBUTtTQUMzRixNQUFNLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEtBQUssR0FBRyxDQUFDO1NBQ3hDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztTQUNuQyxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FB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QUFDO0FBRUQsU0FBUyxVQUFVLENBQUMsSUFBWSxFQUFFLElBQWEsRUFBRSxNQUFjLEVBQUUsT0FBZ0IsRUFBRSxPQUFPLEdBQUcsQ0FBQyxFQUFFLE9BQU8sR0FBRyxDQUFDO0lBQ3pHLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxDQUFDO0FBQzNELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBBIHRhYmxlIHRpbGUgYXMgdGhlIFBERiBhbmQgdGhlIGRlY2sgZHJhdyBpdDogdGhlIHByaW50ZWQgdGFibGVcbi8vIHJlYWRHcmlkVGFibGUoKSByZWFkcyAoR3JpZFRhYmxlKSBhcyBoZWFkaW5nIHJvd3MsIGJvZHkgcm93cyBhbmQgYSB0b3RhbFxuLy8gcm93IG9mIHBsYWluIGNlbGxzLCBhbmQgdGhlIGxpbmVzIGl0cyBub3RlcyBhZGQuIFB1cmUsIHNvIGJvdGggcmVuZGVyZXJzXG4vLyBkcmF3IG9uZSB0YWJsZSBvbmUgd2F5LlxuaW1wb3J0IHsgR3JpZExheW91dCwgR3JpZFJvd0tpbmQsIEdyaWRUYWJsZSwgR3JpZFRhYmxlSGVhZGluZywgaGVhZGluZ0xhYmVsIH0gZnJvbSAnQGZpcmVzdGl0Y2gvZ3JpZCc7XG5cbmltcG9ydCB7IFJlcG9ydEZvcm1hdENvbnRleHQgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3JlcG9ydC5pbnRlcmZhY2UnO1xuXG5pbXBvcnQgeyBncmlkRmlsdGVyTGluZVRleHQgfSBmcm9tICcuL3JlcG9ydC1maWx0ZXItbGluZXMnO1xuXG5cbi8vIFRoZSBtb3N0IHBpdm90IGNvbHVtbnMgYSBmaWxlIGRyYXdzLCBmcm9tIHRoZSBmaXJzdC5cbmV4cG9ydCBjb25zdCBHUklEX0VYUE9SVF9DT0xVTU5TID0gNjA7XG5cbi8vIE9uZSBjZWxsIG9mIGFuIGV4cG9ydGVkIHRhYmxlLiBBIGhlYWRpbmcgY2VsbCBzcGFucyB3aGF0IHRoZSBzY3JlZW4nc1xuLy8gaGVhZGVyIHNwYW5zOyBhIGdyb3VwLCB0b3RhbCBvciBlbXBoYXNpemVkIChzdWJ0b3RhbCwgdG90YWwpIGNlbGwgaXMgYm9sZDtcbi8vIGEgZ3JvdXAncyBsYWJlbCBzdGVwcyBpbiBieSBpdHMgZGVwdGguXG5leHBvcnQgaW50ZXJmYWNlIEdyaWRFeHBvcnRDZWxsIHtcbiAgdGV4dDogc3RyaW5nO1xuICBjb2xTcGFuOiBudW1iZXI7XG4gIHJvd1NwYW46IG51bWJlcjtcbiAgYm9sZDogYm9vbGVhbjtcbiAgaW5kZW50OiBudW1iZXI7XG4gIG51bWVyaWM6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR3JpZEV4cG9ydFRhYmxlIHtcbiAgLy8gSGVhZGluZyByb3dzIHRvcCBmaXJzdCwgZWFjaCBob2xkaW5nIG9ubHkgdGhlIGNlbGxzIHRoYXQgc3RhcnQgb24gaXRcbiAgaGVhZDogR3JpZEV4cG9ydENlbGxbXVtdO1xuICBib2R5OiBHcmlkRXhwb3J0Q2VsbFtdW107XG4gIGZvb3Q6IEdyaWRFeHBvcnRDZWxsW10gfCBudWxsO1xuICAvLyBPbmUgcGVyIHRhYmxlIGNvbHVtbjogaXQgaG9sZHMgZm9ybWF0dGVkIG51bWJlcnMsIHJpZ2h0LWFsaWduZWRcbiAgbnVtZXJpYzogYm9vbGVhbltdO1xuICAvLyBMaW5lcyBwYXN0IHRoZSByb3cgY2FwLCB3aGljaCB0aGUgbW9yZVJvd3NOb3RpY2Ugcm93IGNvdW50c1xuICBtb3JlUm93czogbnVtYmVyO1xufVxuXG4vLyBUaGUgdGFibGUncyBoZWFkaW5nLCBib2R5IGFuZCB0b3RhbCByb3cgYXMgY2VsbHMuIEEgZ3JvdXAncyBsYWJlbCBjYXJyaWVzXG4vLyBpdHMgcm93IGNvdW50IGFmdGVyIGl0LCBhcyB0aGUgc2NyZWVuIHdyaXRlcyBpdC5cbmV4cG9ydCBmdW5jdGlvbiBncmlkRXhwb3J0VGFibGUodGFibGU6IEdyaWRUYWJsZSk6IEdyaWRFeHBvcnRUYWJsZSB7XG4gIGNvbnN0IG51bWVyaWMgPSB0YWJsZS5jb2x1bW5zLm1hcCgoY29sdW1uKSA9PiBjb2x1bW4ubnVtZXJpYyk7XG4gIGNvbnN0IGhlYWQgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiBNYXRoLm1heCgxLCB0YWJsZS5oZWFkaW5nUm93cykgfSwgKF8sIHJvdykgPT4gdGFibGUuaGVhZGluZ3NcbiAgICAuZmlsdGVyKChoZWFkaW5nKSA9PiBoZWFkaW5nLnJvdyA9PT0gcm93KVxuICAgIC5zb3J0KChhLCBiKSA9PiBhLmNvbHVtbiAtIGIuY29sdW1uKVxuICAgIC5tYXAoKGhlYWRpbmcpID0+IGV4cG9ydENlbGwoaGVhZGluZ1RleHQoaGVhZGluZyksIHRydWUsIDAsIGhlYWRpbmcubnVtZXJpYywgaGVhZGluZy5jb2x1bW5TcGFuLCBoZWFkaW5nLnJvd1NwYW4pKSk7XG4gIGNvbnN0IGxpbmUgPSAocm93OiBHcmlkVGFibGVbJ3Jvd3MnXVtudW1iZXJdKSA9PiByb3cuY2VsbHMubWFwKChjZWxsLCBpbmRleCkgPT4ge1xuICAgIGNvbnN0IGlzTGFiZWwgPSBpbmRleCA9PT0gMCAmJiB0YWJsZS5ncm91cENvbHVtbjtcblxuICAgIHJldHVybiBleHBvcnRDZWxsKFxuICAgICAgaXNMYWJlbCAmJiByb3cuY291bnQgPyBgJHtjZWxsLnRleHR9ICgke3Jvdy5jb3VudH0pYCA6IGNlbGwudGV4dCxcbiAgICAgIHJvdy5raW5kICE9PSBHcmlkUm93S2luZC5EZXRhaWwgfHwgISF0YWJsZS5jb2x1bW5zW2luZGV4XT8uZW1waGFzaXMsXG4gICAgICBpc0xhYmVsID8gcm93LmRlcHRoIDogMCxcbiAgICAgIG51bWVyaWNbaW5kZXhdID8/IGZhbHNlLFxuICAgICk7XG4gIH0pO1xuXG4gIHJldHVybiB7XG4gICAgaGVhZCxcbiAgICBib2R5OiB0YWJsZS5yb3dzLm1hcChsaW5lKSxcbiAgICBmb290OiB0YWJsZS50b3RhbFJvdyA/IGxpbmUodGFibGUudG90YWxSb3cpIDogbnVsbCxcbiAgICBudW1lcmljLFxuICAgIG1vcmVSb3dzOiB0YWJsZS5tb3JlUm93cyxcbiAgfTtcbn1cblxuLy8gVGhlIGxpbmVzIGEgdGFibGUgYWRkcyB1bmRlciBpdHMgYm94OiB0aGUgc2NyZWVuJ3Mgbm90ZXMsIHRoZSBwaXZvdFxuLy8gY29sdW1ucyBpdCBsZWF2ZXMgb3V0LCBhbmQgZWFjaCBjb2x1bW4gZmlsdGVyIG9mIHRoZSBsYXlvdXQgaXQgd2FzIHJlYWQgaW4sXG4vLyBpdHMgZmllbGQgbmFtZWQgYXMgaXRzIGNvbHVtbiBpcyBoZWFkZWQuXG5leHBvcnQgZnVuY3Rpb24gZ3JpZEV4cG9ydE5vdGVzKHRhYmxlOiBHcmlkVGFibGUsIGxheW91dDogR3JpZExheW91dCwgbG9jYWxlOiBSZXBvcnRGb3JtYXRDb250ZXh0Wydsb2NhbGUnXSk6IHN0cmluZ1tdIHtcbiAgY29uc3QgZmllbGRzID0gbmV3IE1hcCh0YWJsZS5maWVsZHMubWFwKChmaWVsZCkgPT4gW2ZpZWxkLm5hbWUsIGZpZWxkXSkpO1xuICBjb25zdCBmaWx0ZXJzID0gKGxheW91dC5maWx0ZXJzID8/IFtdKVxuICAgIC5tYXAoKGZpbHRlcikgPT4gZ3JpZEZpbHRlckxpbmVUZXh0KGhlYWRpbmdMYWJlbCh0YWJsZS5maWVsZHMsIGxheW91dCwgZmlsdGVyLmZpZWxkKSwgZmlsdGVyLCBmaWVsZHMuZ2V0KGZpbHRlci5maWVsZCksIGxvY2FsZSkpXG4gICAgLmZpbHRlcigodGV4dCk6IHRleHQgaXMgc3RyaW5nID0+ICEhdGV4dCk7XG5cbiAgcmV0dXJuIFtcbiAgICAuLi50YWJsZS5ub3RlcyxcbiAgICAuLi4odGFibGUuc2hvd25Db2x1bW5zIDwgdGFibGUuY29sdW1uQ291bnQgPyBbYFNob3dpbmcgdGhlIGZpcnN0ICR7dGFibGUuc2hvd25Db2x1bW5zfSBvZiAke3RhYmxlLmNvbHVtbkNvdW50fSBjb2x1bW5zYF0gOiBbXSksXG4gICAgLi4uZmlsdGVycyxcbiAgXTtcbn1cblxuZnVuY3Rpb24gaGVhZGluZ1RleHQoaGVhZGluZzogR3JpZFRhYmxlSGVhZGluZyk6IHN0cmluZyB7XG4gIHJldHVybiBoZWFkaW5nLmhpbnQgPyBgJHtoZWFkaW5nLmxhYmVsfSAoJHtoZWFkaW5nLmhpbnR9KWAgOiBoZWFkaW5nLmxhYmVsO1xufVxuXG5mdW5jdGlvbiBleHBvcnRDZWxsKHRleHQ6IHN0cmluZywgYm9sZDogYm9vbGVhbiwgaW5kZW50OiBudW1iZXIsIG51bWVyaWM6IGJvb2xlYW4sIGNvbFNwYW4gPSAxLCByb3dTcGFuID0gMSk6IEdyaWRFeHBvcnRDZWxsIHtcbiAgcmV0dXJuIHsgdGV4dCwgY29sU3Bhbiwgcm93U3BhbiwgYm9sZCwgaW5kZW50LCBudW1lcmljIH07XG59XG4iXX0=