@firestitch/report 18.9.0 → 18.10.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 (190) hide show
  1. package/app/reports/anchor-at-point.d.ts +14 -0
  2. package/app/reports/canvas-landing-page.d.ts +2 -0
  3. package/app/reports/components/component-chart/component-chart.component.d.ts +18 -2
  4. package/app/reports/components/component-kpi/component-kpi.component.d.ts +4 -1
  5. package/app/reports/components/report-canvas/report-canvas.component.d.ts +3 -0
  6. package/app/reports/components/report-component/report-component.component.d.ts +35 -1
  7. package/app/reports/components/report-view-picker/report-view-picker.component.d.ts +21 -0
  8. package/app/reports/data/report.data.d.ts +17 -2
  9. package/app/reports/dialogs/component-settings/component-settings.component.d.ts +18 -3
  10. package/app/reports/dialogs/report-settings/report-settings.component.d.ts +15 -6
  11. package/app/reports/dialogs/report-view/report-view-dialog.component.d.ts +13 -0
  12. package/app/reports/drill-crumbs.d.ts +12 -0
  13. package/app/reports/export/report-export-collector.service.d.ts +13 -4
  14. package/app/reports/export/report-filter-lines.d.ts +18 -0
  15. package/app/reports/filter-settings-rules.d.ts +33 -0
  16. package/app/reports/format.d.ts +0 -1
  17. package/app/reports/interfaces/canvas-landing-input.interface.d.ts +8 -0
  18. package/app/reports/interfaces/component-data-applied.interface.d.ts +13 -0
  19. package/app/reports/interfaces/component-data-drill.interface.d.ts +22 -0
  20. package/app/reports/interfaces/filter-bar-placement.type.d.ts +1 -0
  21. package/app/reports/interfaces/filter-component-toggle-state.interface.d.ts +4 -0
  22. package/app/reports/interfaces/filter-settings-option.interface.d.ts +4 -0
  23. package/app/reports/interfaces/filter-type-select-state.interface.d.ts +5 -0
  24. package/app/reports/interfaces/report-chart-hit.interface.d.ts +5 -0
  25. package/app/reports/interfaces/report-chat-viewer-cross-filter-field.interface.d.ts +4 -0
  26. package/app/reports/interfaces/report-chat-viewer-cross-filter.interface.d.ts +7 -0
  27. package/app/reports/interfaces/report-chat-viewer-detail.interface.d.ts +4 -0
  28. package/app/reports/interfaces/report-chat-viewer-drill-step.interface.d.ts +5 -0
  29. package/app/reports/interfaces/report-chat-viewer-drill.interface.d.ts +5 -0
  30. package/app/reports/interfaces/report-chat-viewer-filter.interface.d.ts +3 -0
  31. package/app/reports/interfaces/report-chat-viewer-selection.interface.d.ts +5 -0
  32. package/app/reports/interfaces/report-chat-viewer-state.interface.d.ts +12 -0
  33. package/app/reports/interfaces/report-drill-crumb.interface.d.ts +6 -0
  34. package/app/reports/interfaces/report-drill-refusal.type.d.ts +1 -0
  35. package/app/reports/interfaces/report-drill-step.interface.d.ts +5 -0
  36. package/app/reports/interfaces/report-export-line-kind.type.d.ts +1 -0
  37. package/app/reports/interfaces/report-export-line.interface.d.ts +8 -0
  38. package/app/reports/interfaces/report-export-lines-input.interface.d.ts +9 -0
  39. package/app/reports/interfaces/report-export-snapshot.interface.d.ts +15 -0
  40. package/app/reports/interfaces/report-filter-line-context.interface.d.ts +8 -0
  41. package/app/reports/interfaces/report-filter-line-form.type.d.ts +1 -0
  42. package/app/reports/interfaces/report-filter-match.type.d.ts +1 -0
  43. package/app/reports/interfaces/report-filter-option-pair.interface.d.ts +4 -0
  44. package/app/reports/interfaces/report-filter-options-ask.interface.d.ts +6 -0
  45. package/app/reports/interfaces/report-filter-options-list.interface.d.ts +7 -0
  46. package/app/reports/interfaces/report-filter-options-request.interface.d.ts +6 -0
  47. package/app/reports/interfaces/report-filter-options-stream.interface.d.ts +11 -0
  48. package/app/reports/interfaces/report-filter-options.interface.d.ts +7 -0
  49. package/app/reports/interfaces/report-filter-skip.type.d.ts +1 -0
  50. package/app/reports/interfaces/report-mark-action.type.d.ts +1 -0
  51. package/app/reports/interfaces/report-mark-click.interface.d.ts +13 -0
  52. package/app/reports/interfaces/report-mark-context.interface.d.ts +6 -0
  53. package/app/reports/interfaces/report-mark-decision.interface.d.ts +6 -0
  54. package/app/reports/interfaces/report-mark-event.interface.d.ts +11 -0
  55. package/app/reports/interfaces/report-mark-point.interface.d.ts +8 -0
  56. package/app/reports/interfaces/report-temporary-state.interface.d.ts +4 -0
  57. package/app/reports/interfaces/report-tile-state.interface.d.ts +8 -0
  58. package/app/reports/interfaces/report-url-link.interface.d.ts +4 -0
  59. package/app/reports/interfaces/report-url-value-name.type.d.ts +1 -0
  60. package/app/reports/interfaces/report-url-write.interface.d.ts +4 -0
  61. package/app/reports/interfaces/report-view-config.interface.d.ts +11 -0
  62. package/app/reports/interfaces/report-view-create.interface.d.ts +7 -0
  63. package/app/reports/interfaces/report-view-deleted.interface.d.ts +4 -0
  64. package/app/reports/interfaces/report-view-dialog-data.interface.d.ts +7 -0
  65. package/app/reports/interfaces/report-view-dropped.interface.d.ts +5 -0
  66. package/app/reports/interfaces/report-view-menu-item.interface.d.ts +10 -0
  67. package/app/reports/interfaces/report-view-summary.interface.d.ts +11 -0
  68. package/app/reports/interfaces/report-view.interface.d.ts +7 -0
  69. package/app/reports/interfaces/report-viewer-feature.type.d.ts +1 -0
  70. package/app/reports/interfaces/report-views.interface.d.ts +7 -0
  71. package/app/reports/interfaces/report.interface.d.ts +27 -3
  72. package/app/reports/interfaces/tile-load-result.interface.d.ts +4 -0
  73. package/app/reports/mark-click.d.ts +20 -0
  74. package/app/reports/option-builder.d.ts +12 -1
  75. package/app/reports/report-chat-viewer-state.d.ts +8 -0
  76. package/app/reports/report-date-presets.d.ts +2 -0
  77. package/app/reports/report-filter-items.d.ts +27 -22
  78. package/app/reports/report-tile.d.ts +2 -0
  79. package/app/reports/report-url-state.d.ts +27 -10
  80. package/app/reports/report-view-config.d.ts +36 -0
  81. package/app/reports/report-view-menu.d.ts +15 -0
  82. package/app/reports/report-viewer-features.d.ts +5 -0
  83. package/app/reports/services/report-filter-options.service.d.ts +26 -0
  84. package/app/reports/services/report-filter-state.service.d.ts +64 -1
  85. package/app/reports/services/report-view.service.d.ts +51 -0
  86. package/app/reports/tile-data-state.d.ts +7 -0
  87. package/app/reports/tile-loads.d.ts +4 -0
  88. package/app/reports/views/report/fs-ai-report.component.d.ts +9 -1
  89. package/app/reports/views/report/report.component.d.ts +6 -0
  90. package/esm2022/app/reports/anchor-at-point.mjs +49 -0
  91. package/esm2022/app/reports/canvas-landing-page.mjs +25 -0
  92. package/esm2022/app/reports/components/component-chart/component-chart.component.mjs +97 -5
  93. package/esm2022/app/reports/components/component-kpi/component-kpi.component.mjs +11 -4
  94. package/esm2022/app/reports/components/component-list/component-list.component.mjs +7 -1
  95. package/esm2022/app/reports/components/report-canvas/report-canvas.component.mjs +47 -32
  96. package/esm2022/app/reports/components/report-component/report-component.component.mjs +257 -61
  97. package/esm2022/app/reports/components/report-view-picker/report-view-picker.component.mjs +115 -0
  98. package/esm2022/app/reports/data/report.data.mjs +87 -10
  99. package/esm2022/app/reports/dialogs/component-settings/component-settings.component.mjs +106 -51
  100. package/esm2022/app/reports/dialogs/report-settings/report-settings.component.mjs +86 -90
  101. package/esm2022/app/reports/dialogs/report-view/report-view-dialog.component.mjs +52 -0
  102. package/esm2022/app/reports/drill-crumbs.mjs +73 -0
  103. package/esm2022/app/reports/export/report-export-collector.service.mjs +187 -117
  104. package/esm2022/app/reports/export/report-filter-lines.mjs +235 -0
  105. package/esm2022/app/reports/export/report-pdf.service.mjs +12 -7
  106. package/esm2022/app/reports/export/report-pptx.service.mjs +18 -14
  107. package/esm2022/app/reports/filter-settings-rules.mjs +283 -0
  108. package/esm2022/app/reports/format.mjs +2 -22
  109. package/esm2022/app/reports/interfaces/canvas-landing-input.interface.mjs +2 -0
  110. package/esm2022/app/reports/interfaces/component-data-applied.interface.mjs +2 -0
  111. package/esm2022/app/reports/interfaces/component-data-drill.interface.mjs +2 -0
  112. package/esm2022/app/reports/interfaces/filter-bar-placement.type.mjs +2 -0
  113. package/esm2022/app/reports/interfaces/filter-component-toggle-state.interface.mjs +2 -0
  114. package/esm2022/app/reports/interfaces/filter-settings-option.interface.mjs +2 -0
  115. package/esm2022/app/reports/interfaces/filter-type-select-state.interface.mjs +2 -0
  116. package/esm2022/app/reports/interfaces/report-chart-hit.interface.mjs +2 -0
  117. package/esm2022/app/reports/interfaces/report-chat-viewer-cross-filter-field.interface.mjs +2 -0
  118. package/esm2022/app/reports/interfaces/report-chat-viewer-cross-filter.interface.mjs +2 -0
  119. package/esm2022/app/reports/interfaces/report-chat-viewer-detail.interface.mjs +2 -0
  120. package/esm2022/app/reports/interfaces/report-chat-viewer-drill-step.interface.mjs +2 -0
  121. package/esm2022/app/reports/interfaces/report-chat-viewer-drill.interface.mjs +2 -0
  122. package/esm2022/app/reports/interfaces/report-chat-viewer-filter.interface.mjs +1 -1
  123. package/esm2022/app/reports/interfaces/report-chat-viewer-selection.interface.mjs +2 -0
  124. package/esm2022/app/reports/interfaces/report-chat-viewer-state.interface.mjs +1 -1
  125. package/esm2022/app/reports/interfaces/report-drill-crumb.interface.mjs +2 -0
  126. package/esm2022/app/reports/interfaces/report-drill-refusal.type.mjs +2 -0
  127. package/esm2022/app/reports/interfaces/report-drill-step.interface.mjs +2 -0
  128. package/esm2022/app/reports/interfaces/report-export-line-kind.type.mjs +2 -0
  129. package/esm2022/app/reports/interfaces/report-export-line.interface.mjs +2 -0
  130. package/esm2022/app/reports/interfaces/report-export-lines-input.interface.mjs +2 -0
  131. package/esm2022/app/reports/interfaces/report-export-snapshot.interface.mjs +2 -0
  132. package/esm2022/app/reports/interfaces/report-filter-line-context.interface.mjs +2 -0
  133. package/esm2022/app/reports/interfaces/report-filter-line-form.type.mjs +2 -0
  134. package/esm2022/app/reports/interfaces/report-filter-match.type.mjs +2 -0
  135. package/esm2022/app/reports/interfaces/report-filter-option-pair.interface.mjs +2 -0
  136. package/esm2022/app/reports/interfaces/report-filter-options-ask.interface.mjs +2 -0
  137. package/esm2022/app/reports/interfaces/report-filter-options-list.interface.mjs +2 -0
  138. package/esm2022/app/reports/interfaces/report-filter-options-request.interface.mjs +2 -0
  139. package/esm2022/app/reports/interfaces/report-filter-options-stream.interface.mjs +2 -0
  140. package/esm2022/app/reports/interfaces/report-filter-options.interface.mjs +2 -0
  141. package/esm2022/app/reports/interfaces/report-filter-skip.type.mjs +2 -0
  142. package/esm2022/app/reports/interfaces/report-mark-action.type.mjs +2 -0
  143. package/esm2022/app/reports/interfaces/report-mark-click.interface.mjs +2 -0
  144. package/esm2022/app/reports/interfaces/report-mark-context.interface.mjs +2 -0
  145. package/esm2022/app/reports/interfaces/report-mark-decision.interface.mjs +2 -0
  146. package/esm2022/app/reports/interfaces/report-mark-event.interface.mjs +2 -0
  147. package/esm2022/app/reports/interfaces/report-mark-point.interface.mjs +2 -0
  148. package/esm2022/app/reports/interfaces/report-temporary-state.interface.mjs +2 -0
  149. package/esm2022/app/reports/interfaces/report-tile-state.interface.mjs +2 -0
  150. package/esm2022/app/reports/interfaces/report-url-link.interface.mjs +2 -0
  151. package/esm2022/app/reports/interfaces/report-url-value-name.type.mjs +2 -0
  152. package/esm2022/app/reports/interfaces/report-url-write.interface.mjs +2 -0
  153. package/esm2022/app/reports/interfaces/report-view-config.interface.mjs +2 -0
  154. package/esm2022/app/reports/interfaces/report-view-create.interface.mjs +2 -0
  155. package/esm2022/app/reports/interfaces/report-view-deleted.interface.mjs +2 -0
  156. package/esm2022/app/reports/interfaces/report-view-dialog-data.interface.mjs +2 -0
  157. package/esm2022/app/reports/interfaces/report-view-dropped.interface.mjs +2 -0
  158. package/esm2022/app/reports/interfaces/report-view-menu-item.interface.mjs +2 -0
  159. package/esm2022/app/reports/interfaces/report-view-summary.interface.mjs +2 -0
  160. package/esm2022/app/reports/interfaces/report-view.interface.mjs +2 -0
  161. package/esm2022/app/reports/interfaces/report-viewer-feature.type.mjs +2 -0
  162. package/esm2022/app/reports/interfaces/report-views.interface.mjs +2 -0
  163. package/esm2022/app/reports/interfaces/report.interface.mjs +1 -1
  164. package/esm2022/app/reports/interfaces/tile-load-result.interface.mjs +2 -0
  165. package/esm2022/app/reports/mark-click.mjs +193 -0
  166. package/esm2022/app/reports/option-builder.mjs +159 -15
  167. package/esm2022/app/reports/report-chat-viewer-state.mjs +34 -0
  168. package/esm2022/app/reports/report-date-presets.mjs +18 -0
  169. package/esm2022/app/reports/report-filter-items.mjs +343 -72
  170. package/esm2022/app/reports/report-tile.mjs +12 -0
  171. package/esm2022/app/reports/report-url-state.mjs +596 -108
  172. package/esm2022/app/reports/report-view-config.mjs +697 -0
  173. package/esm2022/app/reports/report-view-menu.mjs +119 -0
  174. package/esm2022/app/reports/report-viewer-features.mjs +42 -0
  175. package/esm2022/app/reports/services/report-filter-options.service.mjs +238 -0
  176. package/esm2022/app/reports/services/report-filter-state.service.mjs +697 -62
  177. package/esm2022/app/reports/services/report-view.service.mjs +358 -0
  178. package/esm2022/app/reports/tile-data-state.mjs +127 -0
  179. package/esm2022/app/reports/tile-loads.mjs +38 -0
  180. package/esm2022/app/reports/views/report/fs-ai-report.component.mjs +177 -46
  181. package/esm2022/app/reports/views/report/report.component.mjs +103 -23
  182. package/esm2022/public_api.mjs +23 -1
  183. package/fesm2022/{firestitch-report-echarts-DBMOHmBF.mjs → firestitch-report-echarts-UBg8Wlhd.mjs} +2 -2
  184. package/fesm2022/{firestitch-report-echarts-DBMOHmBF.mjs.map → firestitch-report-echarts-UBg8Wlhd.mjs.map} +1 -1
  185. package/fesm2022/{firestitch-report-firestitch-report-CqbXT1gh.mjs → firestitch-report-firestitch-report-B1keNrcK.mjs} +9063 -4272
  186. package/fesm2022/firestitch-report-firestitch-report-B1keNrcK.mjs.map +1 -0
  187. package/fesm2022/firestitch-report.mjs +1 -1
  188. package/package.json +1 -1
  189. package/public_api.d.ts +22 -0
  190. package/fesm2022/firestitch-report-firestitch-report-CqbXT1gh.mjs.map +0 -1
@@ -1,5 +1,6 @@
1
- import { ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core';
1
+ import { ChangeDetectionStrategy, Component, NgZone, computed, inject, input, model, output, untracked, } from '@angular/core';
2
2
  import { NgxEchartsDirective } from 'ngx-echarts';
3
+ import { chartMarkClick } from '../../mark-click';
3
4
  import { buildChartOption } from '../../option-builder';
4
5
  import { ReportFilterStateService } from '../../services/report-filter-state.service';
5
6
  import { ComponentNoteComponent } from '../component-note/component-note.component';
@@ -11,19 +12,69 @@ import * as i0 from "@angular/core";
11
12
  // theme/echarts.ts). The shared note under the plot names the days a
12
13
  // comparison compares and why windowed series read as they do; the series'
13
14
  // tooltips describe the windows themselves.
15
+ //
16
+ // A click on a mark (a bar, a point or the line, a slice, a step, or a
17
+ // category's empty band) is reported as a ReportMarkClick (markClick); the
18
+ // tile decides what it does. The tile's actions only shape the option: the
19
+ // hand pointer and the tooltip's hint.
14
20
  export class ComponentChartComponent {
15
21
  component = input.required();
16
22
  data = input(null);
23
+ // Which legend entries are on, by series name. The tile holds it (two-way),
24
+ // so it outlives this chart and every option: each new option carries it
25
+ // (legend.selected), because ngx-echarts sets an option with notMerge. A
26
+ // click on the legend only records it: the chart has already toggled the
27
+ // series, so the option is not built again for it (untracked).
28
+ legendSelected = model({});
29
+ // What a click on the chart's marks does, from the tile (tileMarkActions).
30
+ actions = input([]);
31
+ markClick = output();
32
+ // A click or a tap on the chart that no mark answered (an empty band by
33
+ // touch, outside the plot, a waterfall's Total): the tile forgets a tap
34
+ // it was holding, so the next tap on a mark shows its tooltip first.
35
+ markMiss = output();
17
36
  options = computed(() => {
18
37
  const data = this.data();
19
38
  return data
20
- ? buildChartOption(this.component(), data, this._filterState.formatContext())
39
+ ? buildChartOption(this.component(), data, this._filterState.formatContext(), untracked(this.legendSelected), this.actions())
21
40
  : null;
22
41
  });
23
42
  _chart = null;
43
+ // The browser event of the last click a mark answered, so the empty-band
44
+ // handler skips that event.
45
+ _markEvent = null;
24
46
  _filterState = inject(ReportFilterStateService);
47
+ _zone = inject(NgZone);
25
48
  onChartInit(chart) {
26
49
  this._chart = chart;
50
+ // A click in a category's empty band is no element's click: the chart's
51
+ // drawing surface reports it. ECharts runs it outside Angular, and
52
+ // before the chart's own click on a mark (ECharts calls its element
53
+ // handler last), so it waits a microtask: by then a mark has answered
54
+ // the same click.
55
+ chart.getZr().on('click', (event) => {
56
+ queueMicrotask(() => this._zone.run(() => this._onBandClick(event)));
57
+ });
58
+ }
59
+ // ECharts reports every entry of the legend after a click.
60
+ onLegendSelectChanged(event) {
61
+ this.legendSelected.set({ ...(event?.selected ?? {}) });
62
+ }
63
+ // A click on a series element. A click on a line or an area's line itself
64
+ // carries no category, so it takes the category whose band it fell in, and
65
+ // no series id, so it takes the id the option gave that series (a partial
66
+ // segment's id names the series it continues).
67
+ onChartClick(params) {
68
+ this._markEvent = params.event?.event ?? null;
69
+ if (params.componentType !== 'series') {
70
+ this.markMiss.emit();
71
+ return;
72
+ }
73
+ const seriesIndex = params.seriesIndex ?? null;
74
+ const dataIndex = typeof params.dataIndex === 'number'
75
+ ? params.dataIndex
76
+ : this._bandIndex(params.event?.offsetX, params.event?.offsetY);
77
+ this._emit({ seriesIndex, seriesId: params.seriesId ?? this._seriesId(seriesIndex), dataIndex: dataIndex ?? -1 }, params.event?.event);
27
78
  }
28
79
  // Called by the canvas when the box is resized in edit mode.
29
80
  resize() {
@@ -37,14 +88,55 @@ export class ComponentChartComponent {
37
88
  backgroundColor: '#ffffff',
38
89
  }) ?? null;
39
90
  }
91
+ // A click on the chart that no element answered: the category whose band
92
+ // it fell in. Outside the plot it is a miss.
93
+ _onBandClick(event) {
94
+ if (event.event === this._markEvent) {
95
+ return;
96
+ }
97
+ this._emit({ seriesIndex: null, seriesId: null, dataIndex: this._bandIndex(event.offsetX, event.offsetY) ?? -1 }, event.event);
98
+ }
99
+ // The category index under a point of the chart, read off the category
100
+ // axis (the y axis of a horizontal chart); null outside the plot or on a
101
+ // chart without one. An axis finder takes the one coordinate along its
102
+ // axis, not the point.
103
+ _bandIndex(x, y) {
104
+ const chart = this._chart;
105
+ if (!chart || typeof x !== 'number' || typeof y !== 'number' || !chart.containPixel('grid', [x, y])) {
106
+ return null;
107
+ }
108
+ const horizontal = this.component().config?.orientation === 'horizontal';
109
+ const index = Number(horizontal
110
+ ? chart.convertFromPixel({ yAxisIndex: 0 }, y)
111
+ : chart.convertFromPixel({ xAxisIndex: 0 }, x));
112
+ return Number.isFinite(index) ? Math.round(index) : null;
113
+ }
114
+ // The id the option gave a drawn series, by its index.
115
+ _seriesId(seriesIndex) {
116
+ const series = this.options()?.series;
117
+ const id = Array.isArray(series) && seriesIndex !== null ? series[seriesIndex]?.id : null;
118
+ return id === null || id === undefined ? null : String(id);
119
+ }
120
+ _emit(hit, event) {
121
+ const data = this.data();
122
+ const click = data
123
+ ? chartMarkClick(this.component(), data, this._filterState.formatContext(), hit, event)
124
+ : null;
125
+ if (click) {
126
+ this.markClick.emit(click);
127
+ }
128
+ else {
129
+ this.markMiss.emit();
130
+ }
131
+ }
40
132
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ComponentChartComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
41
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.14", type: ComponentChartComponent, isStandalone: true, selector: "app-report-component-chart", inputs: { component: { classPropertyName: "component", publicName: "component", isSignal: true, isRequired: true, transformFunction: null }, data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<div\n class=\"chart-host\"\n echarts\n [options]=\"options() ?? {}\"\n [theme]=\"'report'\"\n [autoResize]=\"true\"\n (chartInit)=\"onChartInit($event)\">\n</div>\n<app-report-component-note [data]=\"data()\"></app-report-component-note>\n", styles: [":host{display:flex;flex-direction:column;width:100%;height:100%}.chart-host{flex:1 1 0;width:100%;min-height:0}\n"], dependencies: [{ kind: "component", type: ComponentNoteComponent, selector: "app-report-component-note", inputs: ["data", "windows", "windowDescriptions", "windowNotes"] }, { kind: "directive", type: NgxEchartsDirective, selector: "echarts, [echarts]", inputs: ["options", "theme", "initOpts", "merge", "autoResize", "loading", "loadingType", "loadingOpts"], outputs: ["chartInit", "optionsError", "chartClick", "chartDblClick", "chartMouseDown", "chartMouseMove", "chartMouseUp", "chartMouseOver", "chartMouseOut", "chartGlobalOut", "chartContextMenu", "chartHighlight", "chartDownplay", "chartSelectChanged", "chartLegendSelectChanged", "chartLegendSelected", "chartLegendUnselected", "chartLegendLegendSelectAll", "chartLegendLegendInverseSelect", "chartLegendScroll", "chartDataZoom", "chartDataRangeSelected", "chartGraphRoam", "chartGeoRoam", "chartTreeRoam", "chartTimelineChanged", "chartTimelinePlayChanged", "chartRestore", "chartDataViewChanged", "chartMagicTypeChanged", "chartGeoSelectChanged", "chartGeoSelected", "chartGeoUnselected", "chartAxisAreaSelected", "chartBrush", "chartBrushEnd", "chartBrushSelected", "chartGlobalCursorTaken", "chartRendered", "chartFinished"], exportAs: ["echarts"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
133
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.14", type: ComponentChartComponent, isStandalone: true, selector: "app-report-component-chart", inputs: { component: { classPropertyName: "component", publicName: "component", isSignal: true, isRequired: true, transformFunction: null }, data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: false, transformFunction: null }, legendSelected: { classPropertyName: "legendSelected", publicName: "legendSelected", isSignal: true, isRequired: false, transformFunction: null }, actions: { classPropertyName: "actions", publicName: "actions", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { legendSelected: "legendSelectedChange", markClick: "markClick", markMiss: "markMiss" }, ngImport: i0, template: "<div\n class=\"chart-host\"\n echarts\n [options]=\"options() ?? {}\"\n [theme]=\"'report'\"\n [autoResize]=\"true\"\n (chartInit)=\"onChartInit($event)\"\n (chartClick)=\"onChartClick($event)\"\n (chartLegendSelectChanged)=\"onLegendSelectChanged($event)\">\n</div>\n<app-report-component-note [data]=\"data()\"></app-report-component-note>\n", styles: [":host{display:flex;flex-direction:column;width:100%;height:100%}.chart-host{flex:1 1 0;width:100%;min-height:0}\n"], dependencies: [{ kind: "component", type: ComponentNoteComponent, selector: "app-report-component-note", inputs: ["data", "windows", "windowDescriptions", "windowNotes"] }, { kind: "directive", type: NgxEchartsDirective, selector: "echarts, [echarts]", inputs: ["options", "theme", "initOpts", "merge", "autoResize", "loading", "loadingType", "loadingOpts"], outputs: ["chartInit", "optionsError", "chartClick", "chartDblClick", "chartMouseDown", "chartMouseMove", "chartMouseUp", "chartMouseOver", "chartMouseOut", "chartGlobalOut", "chartContextMenu", "chartHighlight", "chartDownplay", "chartSelectChanged", "chartLegendSelectChanged", "chartLegendSelected", "chartLegendUnselected", "chartLegendLegendSelectAll", "chartLegendLegendInverseSelect", "chartLegendScroll", "chartDataZoom", "chartDataRangeSelected", "chartGraphRoam", "chartGeoRoam", "chartTreeRoam", "chartTimelineChanged", "chartTimelinePlayChanged", "chartRestore", "chartDataViewChanged", "chartMagicTypeChanged", "chartGeoSelectChanged", "chartGeoSelected", "chartGeoUnselected", "chartAxisAreaSelected", "chartBrush", "chartBrushEnd", "chartBrushSelected", "chartGlobalCursorTaken", "chartRendered", "chartFinished"], exportAs: ["echarts"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
42
134
  }
43
135
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ComponentChartComponent, decorators: [{
44
136
  type: Component,
45
137
  args: [{ selector: 'app-report-component-chart', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
46
138
  ComponentNoteComponent,
47
139
  NgxEchartsDirective,
48
- ], template: "<div\n class=\"chart-host\"\n echarts\n [options]=\"options() ?? {}\"\n [theme]=\"'report'\"\n [autoResize]=\"true\"\n (chartInit)=\"onChartInit($event)\">\n</div>\n<app-report-component-note [data]=\"data()\"></app-report-component-note>\n", styles: [":host{display:flex;flex-direction:column;width:100%;height:100%}.chart-host{flex:1 1 0;width:100%;min-height:0}\n"] }]
140
+ ], template: "<div\n class=\"chart-host\"\n echarts\n [options]=\"options() ?? {}\"\n [theme]=\"'report'\"\n [autoResize]=\"true\"\n (chartInit)=\"onChartInit($event)\"\n (chartClick)=\"onChartClick($event)\"\n (chartLegendSelectChanged)=\"onLegendSelectChanged($event)\">\n</div>\n<app-report-component-note [data]=\"data()\"></app-report-component-note>\n", styles: [":host{display:flex;flex-direction:column;width:100%;height:100%}.chart-host{flex:1 1 0;width:100%;min-height:0}\n"] }]
49
141
  }] });
50
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LWNoYXJ0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy9jb21wb25lbnRzL2NvbXBvbmVudC1jaGFydC9jb21wb25lbnQtY2hhcnQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2NvbXBvbmVudHMvY29tcG9uZW50LWNoYXJ0L2NvbXBvbmVudC1jaGFydC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRzVGLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUdsRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUN0RixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQzs7QUFHcEYsMEVBQTBFO0FBQzFFLDBFQUEwRTtBQUMxRSwyRUFBMkU7QUFDM0Usb0VBQW9FO0FBQ3BFLHFFQUFxRTtBQUNyRSwyRUFBMkU7QUFDM0UsNENBQTRDO0FBWTVDLE1BQU0sT0FBTyx1QkFBdUI7SUFFbEIsU0FBUyxHQUFHLEtBQUssQ0FBQyxRQUFRLEVBQW1CLENBQUM7SUFDOUMsSUFBSSxHQUFHLEtBQUssQ0FBdUIsSUFBSSxDQUFDLENBQUM7SUFFekMsT0FBTyxHQUFHLFFBQVEsQ0FBdUIsR0FBRyxFQUFFO1FBQzVELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUV6QixPQUFPLElBQUk7WUFDVCxDQUFDLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQzdFLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDWCxDQUFDLENBQUMsQ0FBQztJQUVLLE1BQU0sR0FBbUIsSUFBSSxDQUFDO0lBQ3JCLFlBQVksR0FBRyxNQUFNLENBQUMsd0JBQXdCLENBQUMsQ0FBQztJQUUxRCxXQUFXLENBQUMsS0FBYztRQUMvQixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztJQUN0QixDQUFDO0lBRUQsNkRBQTZEO0lBQ3RELE1BQU07UUFDWCxJQUFJLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFFRCx3REFBd0Q7SUFDakQsVUFBVSxDQUFDLFVBQVUsR0FBRyxDQUFDO1FBQzlCLE9BQU8sSUFBSSxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUM7WUFDN0IsSUFBSSxFQUFFLEtBQUs7WUFDWCxVQUFVO1lBQ1YsZUFBZSxFQUFFLFNBQVM7U0FDM0IsQ0FBQyxJQUFJLElBQUksQ0FBQztJQUNiLENBQUM7d0dBaENVLHVCQUF1Qjs0RkFBdkIsdUJBQXVCLDBWQzdCcEMsd1BBU0EsMktEZ0JJLHNCQUFzQix3SUFDdEIsbUJBQW1COzs0RkFHVix1QkFBdUI7a0JBWG5DLFNBQVM7K0JBQ0UsNEJBQTRCLG1CQUdyQix1QkFBdUIsQ0FBQyxNQUFNLGNBQ25DLElBQUksV0FDUDt3QkFDUCxzQkFBc0I7d0JBQ3RCLG1CQUFtQjtxQkFDcEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBjb21wdXRlZCwgaW5qZWN0LCBpbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgdHlwZSB7IEVDaGFydHNPcHRpb24sIEVDaGFydHMgfSBmcm9tICdlY2hhcnRzJztcbmltcG9ydCB7IE5neEVjaGFydHNEaXJlY3RpdmUgfSBmcm9tICduZ3gtZWNoYXJ0cyc7XG5cbmltcG9ydCB7IENvbXBvbmVudERhdGEsIFJlcG9ydENvbXBvbmVudCB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvcmVwb3J0LmludGVyZmFjZSc7XG5pbXBvcnQgeyBidWlsZENoYXJ0T3B0aW9uIH0gZnJvbSAnLi4vLi4vb3B0aW9uLWJ1aWxkZXInO1xuaW1wb3J0IHsgUmVwb3J0RmlsdGVyU3RhdGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcmVwb3J0LWZpbHRlci1zdGF0ZS5zZXJ2aWNlJztcbmltcG9ydCB7IENvbXBvbmVudE5vdGVDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnQtbm90ZS9jb21wb25lbnQtbm90ZS5jb21wb25lbnQnO1xuXG5cbi8vIEVDaGFydHMgaG9zdCBmb3IgYSBjaGFydCBjb21wb25lbnQuIFB1cmUgcmVuZGVyaW5nOiB0aGUgcGFyZW50IG93bnMgdGhlXG4vLyBkYXRhIGZldGNoOyB0aGlzIG1hcHMgKGNvbXBvbmVudCBjb25maWcsIHJvd3MsIHRoZSBvcGVuIHJlcG9ydCdzIGZvcm1hdFxuLy8gY29udGV4dCkg4oaSIG9wdGlvbiBhbmQgZXhwb3NlcyB0aGUgY2hhcnQgaW5zdGFuY2UgZm9yIHJlc2l6ZSArIHRoZSBmdXR1cmVcbi8vIGltYWdlIGV4cG9ydHMgKGdldERhdGFVUkwgbmVlZHMgdGhlIGNhbnZhcyByZW5kZXJlciByZWdpc3RlcmVkIGluXG4vLyB0aGVtZS9lY2hhcnRzLnRzKS4gVGhlIHNoYXJlZCBub3RlIHVuZGVyIHRoZSBwbG90IG5hbWVzIHRoZSBkYXlzIGFcbi8vIGNvbXBhcmlzb24gY29tcGFyZXMgYW5kIHdoeSB3aW5kb3dlZCBzZXJpZXMgcmVhZCBhcyB0aGV5IGRvOyB0aGUgc2VyaWVzJ1xuLy8gdG9vbHRpcHMgZGVzY3JpYmUgdGhlIHdpbmRvd3MgdGhlbXNlbHZlcy5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1yZXBvcnQtY29tcG9uZW50LWNoYXJ0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NvbXBvbmVudC1jaGFydC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2NvbXBvbmVudC1jaGFydC5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENvbXBvbmVudE5vdGVDb21wb25lbnQsXG4gICAgTmd4RWNoYXJ0c0RpcmVjdGl2ZSxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgQ29tcG9uZW50Q2hhcnRDb21wb25lbnQge1xuXG4gIHB1YmxpYyByZWFkb25seSBjb21wb25lbnQgPSBpbnB1dC5yZXF1aXJlZDxSZXBvcnRDb21wb25lbnQ+KCk7XG4gIHB1YmxpYyByZWFkb25seSBkYXRhID0gaW5wdXQ8Q29tcG9uZW50RGF0YSB8IG51bGw+KG51bGwpO1xuXG4gIHB1YmxpYyByZWFkb25seSBvcHRpb25zID0gY29tcHV0ZWQ8RUNoYXJ0c09wdGlvbiB8IG51bGw+KCgpID0+IHtcbiAgICBjb25zdCBkYXRhID0gdGhpcy5kYXRhKCk7XG5cbiAgICByZXR1cm4gZGF0YVxuICAgICAgPyBidWlsZENoYXJ0T3B0aW9uKHRoaXMuY29tcG9uZW50KCksIGRhdGEsIHRoaXMuX2ZpbHRlclN0YXRlLmZvcm1hdENvbnRleHQoKSlcbiAgICAgIDogbnVsbDtcbiAgfSk7XG5cbiAgcHJpdmF0ZSBfY2hhcnQ6IEVDaGFydHMgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBfZmlsdGVyU3RhdGUgPSBpbmplY3QoUmVwb3J0RmlsdGVyU3RhdGVTZXJ2aWNlKTtcblxuICBwdWJsaWMgb25DaGFydEluaXQoY2hhcnQ6IEVDaGFydHMpOiB2b2lkIHtcbiAgICB0aGlzLl9jaGFydCA9IGNoYXJ0O1xuICB9XG5cbiAgLy8gQ2FsbGVkIGJ5IHRoZSBjYW52YXMgd2hlbiB0aGUgYm94IGlzIHJlc2l6ZWQgaW4gZWRpdCBtb2RlLlxuICBwdWJsaWMgcmVzaXplKCk6IHZvaWQge1xuICAgIHRoaXMuX2NoYXJ0Py5yZXNpemUoKTtcbiAgfVxuXG4gIC8vIEhpZ2gtcmVzIGltYWdlIGZvciB0aGUgKGxhdGVyLXBoYXNlKSBQUFQvUERGIGV4cG9ydHMuXG4gIHB1YmxpYyBnZXREYXRhVVJMKHBpeGVsUmF0aW8gPSAzKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX2NoYXJ0Py5nZXREYXRhVVJMKHtcbiAgICAgIHR5cGU6ICdwbmcnLFxuICAgICAgcGl4ZWxSYXRpbyxcbiAgICAgIGJhY2tncm91bmRDb2xvcjogJyNmZmZmZmYnLFxuICAgIH0pID8/IG51bGw7XG4gIH1cbn1cbiIsIjxkaXZcbiAgY2xhc3M9XCJjaGFydC1ob3N0XCJcbiAgZWNoYXJ0c1xuICBbb3B0aW9uc109XCJvcHRpb25zKCkgPz8ge31cIlxuICBbdGhlbWVdPVwiJ3JlcG9ydCdcIlxuICBbYXV0b1Jlc2l6ZV09XCJ0cnVlXCJcbiAgKGNoYXJ0SW5pdCk9XCJvbkNoYXJ0SW5pdCgkZXZlbnQpXCI+XG48L2Rpdj5cbjxhcHAtcmVwb3J0LWNvbXBvbmVudC1ub3RlIFtkYXRhXT1cImRhdGEoKVwiPjwvYXBwLXJlcG9ydC1jb21wb25lbnQtbm90ZT5cbiJdfQ==
142
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LWNoYXJ0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy9jb21wb25lbnRzL2NvbXBvbmVudC1jaGFydC9jb21wb25lbnQtY2hhcnQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2NvbXBvbmVudHMvY29tcG9uZW50LWNoYXJ0L2NvbXBvbmVudC1jaGFydC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFNBQVMsR0FDOUYsTUFBTSxlQUFlLENBQUM7QUFHdkIsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBT2xELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUN0RixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQzs7QUFHcEYsMEVBQTBFO0FBQzFFLDBFQUEwRTtBQUMxRSwyRUFBMkU7QUFDM0Usb0VBQW9FO0FBQ3BFLHFFQUFxRTtBQUNyRSwyRUFBMkU7QUFDM0UsNENBQTRDO0FBQzVDLEVBQUU7QUFDRix1RUFBdUU7QUFDdkUsMkVBQTJFO0FBQzNFLDJFQUEyRTtBQUMzRSx1Q0FBdUM7QUFZdkMsTUFBTSxPQUFPLHVCQUF1QjtJQUVsQixTQUFTLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBbUIsQ0FBQztJQUM5QyxJQUFJLEdBQUcsS0FBSyxDQUF1QixJQUFJLENBQUMsQ0FBQztJQUN6RCw0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QUssR0FBRyxJQUFJO1lBQ2hCLENBQUMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsRUFBRSxFQUFFLEdBQUcsRUFBRSxLQUF3QixDQUFDO1lBQzFHLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFFVCxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ1YsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDN0IsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3ZCLENBQUM7SUFDSCxDQUFDO3dHQWxKVSx1QkFBdUI7NEZBQXZCLHVCQUF1Qiw4c0JDekNwQyxpV0FXQSwyS0QwQkksc0JBQXNCLHdJQUN0QixtQkFBbUI7OzRGQUdWLHVCQUF1QjtrQkFYbkMsU0FBUzsrQkFDRSw0QkFBNEIsbUJBR3JCLHVCQUF1QixDQUFDLE1BQU0sY0FDbkMsSUFBSSxXQUNQO3dCQUNQLHNCQUFzQjt3QkFDdEIsbUJBQW1CO3FCQUNwQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIE5nWm9uZSwgY29tcHV0ZWQsIGluamVjdCwgaW5wdXQsIG1vZGVsLCBvdXRwdXQsIHVudHJhY2tlZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB0eXBlIHsgRUNFbGVtZW50RXZlbnQsIEVDaGFydHNPcHRpb24sIEVDaGFydHMsIEVsZW1lbnRFdmVudCB9IGZyb20gJ2VjaGFydHMnO1xuaW1wb3J0IHsgTmd4RWNoYXJ0c0RpcmVjdGl2ZSB9IGZyb20gJ25neC1lY2hhcnRzJztcblxuaW1wb3J0IHsgQ2hhcnRDb25maWcsIENvbXBvbmVudERhdGEsIFJlcG9ydENvbXBvbmVudCB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvcmVwb3J0LmludGVyZmFjZSc7XG5pbXBvcnQgeyBSZXBvcnRDaGFydEhpdCB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvcmVwb3J0LWNoYXJ0LWhpdC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUmVwb3J0TWFya0FjdGlvbiB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvcmVwb3J0LW1hcmstYWN0aW9uLnR5cGUnO1xuaW1wb3J0IHsgUmVwb3J0TWFya0NsaWNrIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9yZXBvcnQtbWFyay1jbGljay5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUmVwb3J0TWFya0V2ZW50IH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9yZXBvcnQtbWFyay1ldmVudC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgY2hhcnRNYXJrQ2xpY2sgfSBmcm9tICcuLi8uLi9tYXJrLWNsaWNrJztcbmltcG9ydCB7IGJ1aWxkQ2hhcnRPcHRpb24gfSBmcm9tICcuLi8uLi9vcHRpb24tYnVpbGRlcic7XG5pbXBvcnQgeyBSZXBvcnRGaWx0ZXJTdGF0ZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9yZXBvcnQtZmlsdGVyLXN0YXRlLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ29tcG9uZW50Tm90ZUNvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudC1ub3RlL2NvbXBvbmVudC1ub3RlLmNvbXBvbmVudCc7XG5cblxuLy8gRUNoYXJ0cyBob3N0IGZvciBhIGNoYXJ0IGNvbXBvbmVudC4gUHVyZSByZW5kZXJpbmc6IHRoZSBwYXJlbnQgb3ducyB0aGVcbi8vIGRhdGEgZmV0Y2g7IHRoaXMgbWFwcyAoY29tcG9uZW50IGNvbmZpZywgcm93cywgdGhlIG9wZW4gcmVwb3J0J3MgZm9ybWF0XG4vLyBjb250ZXh0KSDihpIgb3B0aW9uIGFuZCBleHBvc2VzIHRoZSBjaGFydCBpbnN0YW5jZSBmb3IgcmVzaXplICsgdGhlIGZ1dHVyZVxuLy8gaW1hZ2UgZXhwb3J0cyAoZ2V0RGF0YVVSTCBuZWVkcyB0aGUgY2FudmFzIHJlbmRlcmVyIHJlZ2lzdGVyZWQgaW5cbi8vIHRoZW1lL2VjaGFydHMudHMpLiBUaGUgc2hhcmVkIG5vdGUgdW5kZXIgdGhlIHBsb3QgbmFtZXMgdGhlIGRheXMgYVxuLy8gY29tcGFyaXNvbiBjb21wYXJlcyBhbmQgd2h5IHdpbmRvd2VkIHNlcmllcyByZWFkIGFzIHRoZXkgZG87IHRoZSBzZXJpZXMnXG4vLyB0b29sdGlwcyBkZXNjcmliZSB0aGUgd2luZG93cyB0aGVtc2VsdmVzLlxuLy9cbi8vIEEgY2xpY2sgb24gYSBtYXJrIChhIGJhciwgYSBwb2ludCBvciB0aGUgbGluZSwgYSBzbGljZSwgYSBzdGVwLCBvciBhXG4vLyBjYXRlZ29yeSdzIGVtcHR5IGJhbmQpIGlzIHJlcG9ydGVkIGFzIGEgUmVwb3J0TWFya0NsaWNrIChtYXJrQ2xpY2spOyB0aGVcbi8vIHRpbGUgZGVjaWRlcyB3aGF0IGl0IGRvZXMuIFRoZSB0aWxlJ3MgYWN0aW9ucyBvbmx5IHNoYXBlIHRoZSBvcHRpb246IHRoZVxuLy8gaGFuZCBwb2ludGVyIGFuZCB0aGUgdG9vbHRpcCdzIGhpbnQuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtcmVwb3J0LWNvbXBvbmVudC1jaGFydCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9jb21wb25lbnQtY2hhcnQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9jb21wb25lbnQtY2hhcnQuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBDb21wb25lbnROb3RlQ29tcG9uZW50LFxuICAgIE5neEVjaGFydHNEaXJlY3RpdmUsXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIENvbXBvbmVudENoYXJ0Q29tcG9uZW50IHtcblxuICBwdWJsaWMgcmVhZG9ubHkgY29tcG9uZW50ID0gaW5wdXQucmVxdWlyZWQ8UmVwb3J0Q29tcG9uZW50PigpO1xuICBwdWJsaWMgcmVhZG9ubHkgZGF0YSA9IGlucHV0PENvbXBvbmVudERhdGEgfCBudWxsPihudWxsKTtcbiAgLy8gV2hpY2ggbGVnZW5kIGVudHJpZXMgYXJlIG9uLCBieSBzZXJpZXMgbmFtZS4gVGhlIHRpbGUgaG9sZHMgaXQgKHR3by13YXkpLFxuICAvLyBzbyBpdCBvdXRsaXZlcyB0aGlzIGNoYXJ0IGFuZCBldmVyeSBvcHRpb246IGVhY2ggbmV3IG9wdGlvbiBjYXJyaWVzIGl0XG4gIC8vIChsZWdlbmQuc2VsZWN0ZWQpLCBiZWNhdXNlIG5neC1lY2hhcnRzIHNldHMgYW4gb3B0aW9uIHdpdGggbm90TWVyZ2UuIEFcbiAgLy8gY2xpY2sgb24gdGhlIGxlZ2VuZCBvbmx5IHJlY29yZHMgaXQ6IHRoZSBjaGFydCBoYXMgYWxyZWFkeSB0b2dnbGVkIHRoZVxuICAvLyBzZXJpZXMsIHNvIHRoZSBvcHRpb24gaXMgbm90IGJ1aWx0IGFnYWluIGZvciBpdCAodW50cmFja2VkKS5cbiAgcHVibGljIHJlYWRvbmx5IGxlZ2VuZFNlbGVjdGVkID0gbW9kZWw8UmVhZG9ubHk8UmVjb3JkPHN0cmluZywgYm9vbGVhbj4+Pih7fSk7XG4gIC8vIFdoYXQgYSBjbGljayBvbiB0aGUgY2hhcnQncyBtYXJrcyBkb2VzLCBmcm9tIHRoZSB0aWxlICh0aWxlTWFya0FjdGlvbnMpLlxuICBwdWJsaWMgcmVhZG9ubHkgYWN0aW9ucyA9IGlucHV0PHJlYWRvbmx5IFJlcG9ydE1hcmtBY3Rpb25bXT4oW10pO1xuXG4gIHB1YmxpYyByZWFkb25seSBtYXJrQ2xpY2sgPSBvdXRwdXQ8UmVwb3J0TWFya0NsaWNrPigpO1xuICAvLyBBIGNsaWNrIG9yIGEgdGFwIG9uIHRoZSBjaGFydCB0aGF0IG5vIG1hcmsgYW5zd2VyZWQgKGFuIGVtcHR5IGJhbmQgYnlcbiAgLy8gdG91Y2gsIG91dHNpZGUgdGhlIHBsb3QsIGEgd2F0ZXJmYWxsJ3MgVG90YWwpOiB0aGUgdGlsZSBmb3JnZXRzIGEgdGFwXG4gIC8vIGl0IHdhcyBob2xkaW5nLCBzbyB0aGUgbmV4dCB0YXAgb24gYSBtYXJrIHNob3dzIGl0cyB0b29sdGlwIGZpcnN0LlxuICBwdWJsaWMgcmVhZG9ubHkgbWFya01pc3MgPSBvdXRwdXQ8dm9pZD4oKTtcblxuICBwdWJsaWMgcmVhZG9ubHkgb3B0aW9ucyA9IGNvbXB1dGVkPEVDaGFydHNPcHRpb24gfCBudWxsPigoKSA9PiB7XG4gICAgY29uc3QgZGF0YSA9IHRoaXMuZGF0YSgpO1xuXG4gICAgcmV0dXJuIGRhdGFcbiAgICAgID8gYnVpbGRDaGFydE9wdGlvbihcbiAgICAgICAgdGhpcy5jb21wb25lbnQoKSxcbiAgICAgICAgZGF0YSxcbiAgICAgICAgdGhpcy5fZmlsdGVyU3RhdGUuZm9ybWF0Q29udGV4dCgpLFxuICAgICAgICB1bnRyYWNrZWQodGhpcy5sZWdlbmRTZWxlY3RlZCksXG4gICAgICAgIHRoaXMuYWN0aW9ucygpLFxuICAgICAgKVxuICAgICAgOiBudWxsO1xuICB9KTtcblxuICBwcml2YXRlIF9jaGFydDogRUNoYXJ0cyB8IG51bGwgPSBudWxsO1xuICAvLyBUaGUgYnJvd3NlciBldmVudCBvZiB0aGUgbGFzdCBjbGljayBhIG1hcmsgYW5zd2VyZWQsIHNvIHRoZSBlbXB0eS1iYW5kXG4gIC8vIGhhbmRsZXIgc2tpcHMgdGhhdCBldmVudC5cbiAgcHJpdmF0ZSBfbWFya0V2ZW50OiB1bmtub3duID0gbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBfZmlsdGVyU3RhdGUgPSBpbmplY3QoUmVwb3J0RmlsdGVyU3RhdGVTZXJ2aWNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfem9uZSA9IGluamVjdChOZ1pvbmUpO1xuXG4gIHB1YmxpYyBvbkNoYXJ0SW5pdChjaGFydDogRUNoYXJ0cyk6IHZvaWQge1xuICAgIHRoaXMuX2NoYXJ0ID0gY2hhcnQ7XG4gICAgLy8gQSBjbGljayBpbiBhIGNhdGVnb3J5J3MgZW1wdHkgYmFuZCBpcyBubyBlbGVtZW50J3MgY2xpY2s6IHRoZSBjaGFydCdzXG4gICAgLy8gZHJhd2luZyBzdXJmYWNlIHJlcG9ydHMgaXQuIEVDaGFydHMgcnVucyBpdCBvdXRzaWRlIEFuZ3VsYXIsIGFuZFxuICAgIC8vIGJlZm9yZSB0aGUgY2hhcnQncyBvd24gY2xpY2sgb24gYSBtYXJrIChFQ2hhcnRzIGNhbGxzIGl0cyBlbGVtZW50XG4gICAgLy8gaGFuZGxlciBsYXN0KSwgc28gaXQgd2FpdHMgYSBtaWNyb3Rhc2s6IGJ5IHRoZW4gYSBtYXJrIGhhcyBhbnN3ZXJlZFxuICAgIC8vIHRoZSBzYW1lIGNsaWNrLlxuICAgIGNoYXJ0LmdldFpyKCkub24oJ2NsaWNrJywgKGV2ZW50OiBFbGVtZW50RXZlbnQpID0+IHtcbiAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHRoaXMuX3pvbmUucnVuKCgpID0+IHRoaXMuX29uQmFuZENsaWNrKGV2ZW50KSkpO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gRUNoYXJ0cyByZXBvcnRzIGV2ZXJ5IGVudHJ5IG9mIHRoZSBsZWdlbmQgYWZ0ZXIgYSBjbGljay5cbiAgcHVibGljIG9uTGVnZW5kU2VsZWN0Q2hhbmdlZChldmVudDogeyBzZWxlY3RlZD86IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+IH0gfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5sZWdlbmRTZWxlY3RlZC5zZXQoeyAuLi4oZXZlbnQ/LnNlbGVjdGVkID8/IHt9KSB9KTtcbiAgfVxuXG4gIC8vIEEgY2xpY2sgb24gYSBzZXJpZXMgZWxlbWVudC4gQSBjbGljayBvbiBhIGxpbmUgb3IgYW4gYXJlYSdzIGxpbmUgaXRzZWxmXG4gIC8vIGNhcnJpZXMgbm8gY2F0ZWdvcnksIHNvIGl0IHRha2VzIHRoZSBjYXRlZ29yeSB3aG9zZSBiYW5kIGl0IGZlbGwgaW4sIGFuZFxuICAvLyBubyBzZXJpZXMgaWQsIHNvIGl0IHRha2VzIHRoZSBpZCB0aGUgb3B0aW9uIGdhdmUgdGhhdCBzZXJpZXMgKGEgcGFydGlhbFxuICAvLyBzZWdtZW50J3MgaWQgbmFtZXMgdGhlIHNlcmllcyBpdCBjb250aW51ZXMpLlxuICBwdWJsaWMgb25DaGFydENsaWNrKHBhcmFtczogRUNFbGVtZW50RXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLl9tYXJrRXZlbnQgPSBwYXJhbXMuZXZlbnQ/LmV2ZW50ID8/IG51bGw7XG5cbiAgICBpZiAocGFyYW1zLmNvbXBvbmVudFR5cGUgIT09ICdzZXJpZXMnKSB7XG4gICAgICB0aGlzLm1hcmtNaXNzLmVtaXQoKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHNlcmllc0luZGV4ID0gcGFyYW1zLnNlcmllc0luZGV4ID8/IG51bGw7XG4gICAgY29uc3QgZGF0YUluZGV4ID0gdHlwZW9mIHBhcmFtcy5kYXRhSW5kZXggPT09ICdudW1iZXInXG4gICAgICA/IHBhcmFtcy5kYXRhSW5kZXhcbiAgICAgIDogdGhpcy5fYmFuZEluZGV4KHBhcmFtcy5ldmVudD8ub2Zmc2V0WCwgcGFyYW1zLmV2ZW50Py5vZmZzZXRZKTtcblxuICAgIHRoaXMuX2VtaXQoXG4gICAgICB7IHNlcmllc0luZGV4LCBzZXJpZXNJZDogcGFyYW1zLnNlcmllc0lkID8/IHRoaXMuX3Nlcmllc0lkKHNlcmllc0luZGV4KSwgZGF0YUluZGV4OiBkYXRhSW5kZXggPz8gLTEgfSxcbiAgICAgIHBhcmFtcy5ldmVudD8uZXZlbnQsXG4gICAgKTtcbiAgfVxuXG4gIC8vIENhbGxlZCBieSB0aGUgY2FudmFzIHdoZW4gdGhlIGJveCBpcyByZXNpemVkIGluIGVkaXQgbW9kZS5cbiAgcHVibGljIHJlc2l6ZSgpOiB2b2lkIHtcbiAgICB0aGlzLl9jaGFydD8ucmVzaXplKCk7XG4gIH1cblxuICAvLyBIaWdoLXJlcyBpbWFnZSBmb3IgdGhlIChsYXRlci1waGFzZSkgUFBUL1BERiBleHBvcnRzLlxuICBwdWJsaWMgZ2V0RGF0YVVSTChwaXhlbFJhdGlvID0gMyk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9jaGFydD8uZ2V0RGF0YVVSTCh7XG4gICAgICB0eXBlOiAncG5nJyxcbiAgICAgIHBpeGVsUmF0aW8sXG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6ICcjZmZmZmZmJyxcbiAgICB9KSA/PyBudWxsO1xuICB9XG5cbiAgLy8gQSBjbGljayBvbiB0aGUgY2hhcnQgdGhhdCBubyBlbGVtZW50IGFuc3dlcmVkOiB0aGUgY2F0ZWdvcnkgd2hvc2UgYmFuZFxuICAvLyBpdCBmZWxsIGluLiBPdXRzaWRlIHRoZSBwbG90IGl0IGlzIGEgbWlzcy5cbiAgcHJpdmF0ZSBfb25CYW5kQ2xpY2soZXZlbnQ6IEVsZW1lbnRFdmVudCk6IHZvaWQge1xuICAgIGlmIChldmVudC5ldmVudCA9PT0gdGhpcy5fbWFya0V2ZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fZW1pdChcbiAgICAgIHsgc2VyaWVzSW5kZXg6IG51bGwsIHNlcmllc0lkOiBudWxsLCBkYXRhSW5kZXg6IHRoaXMuX2JhbmRJbmRleChldmVudC5vZmZzZXRYLCBldmVudC5vZmZzZXRZKSA/PyAtMSB9LFxuICAgICAgZXZlbnQuZXZlbnQsXG4gICAgKTtcbiAgfVxuXG4gIC8vIFRoZSBjYXRlZ29yeSBpbmRleCB1bmRlciBhIHBvaW50IG9mIHRoZSBjaGFydCwgcmVhZCBvZmYgdGhlIGNhdGVnb3J5XG4gIC8vIGF4aXMgKHRoZSB5IGF4aXMgb2YgYSBob3Jpem9udGFsIGNoYXJ0KTsgbnVsbCBvdXRzaWRlIHRoZSBwbG90IG9yIG9uIGFcbiAgLy8gY2hhcnQgd2l0aG91dCBvbmUuIEFuIGF4aXMgZmluZGVyIHRha2VzIHRoZSBvbmUgY29vcmRpbmF0ZSBhbG9uZyBpdHNcbiAgLy8gYXhpcywgbm90IHRoZSBwb2ludC5cbiAgcHJpdmF0ZSBfYmFuZEluZGV4KHg6IG51bWJlciB8IHVuZGVmaW5lZCwgeTogbnVtYmVyIHwgdW5kZWZpbmVkKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgY29uc3QgY2hhcnQgPSB0aGlzLl9jaGFydDtcblxuICAgIGlmICghY2hhcnQgfHwgdHlwZW9mIHggIT09ICdudW1iZXInIHx8IHR5cGVvZiB5ICE9PSAnbnVtYmVyJyB8fCAhY2hhcnQuY29udGFpblBpeGVsKCdncmlkJywgW3gsIHldKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgaG9yaXpvbnRhbCA9ICh0aGlzLmNvbXBvbmVudCgpLmNvbmZpZyBhcyBDaGFydENvbmZpZyk/Lm9yaWVudGF0aW9uID09PSAnaG9yaXpvbnRhbCc7XG4gICAgY29uc3QgaW5kZXggPSBOdW1iZXIoaG9yaXpvbnRhbFxuICAgICAgPyBjaGFydC5jb252ZXJ0RnJvbVBpeGVsKHsgeUF4aXNJbmRleDogMCB9LCB5KVxuICAgICAgOiBjaGFydC5jb252ZXJ0RnJvbVBpeGVsKHsgeEF4aXNJbmRleDogMCB9LCB4KSk7XG5cbiAgICByZXR1cm4gTnVtYmVyLmlzRmluaXRlKGluZGV4KSA/IE1hdGgucm91bmQoaW5kZXgpIDogbnVsbDtcbiAgfVxuXG4gIC8vIFRoZSBpZCB0aGUgb3B0aW9uIGdhdmUgYSBkcmF3biBzZXJpZXMsIGJ5IGl0cyBpbmRleC5cbiAgcHJpdmF0ZSBfc2VyaWVzSWQoc2VyaWVzSW5kZXg6IG51bWJlciB8IG51bGwpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBjb25zdCBzZXJpZXMgPSB0aGlzLm9wdGlvbnMoKT8uc2VyaWVzO1xuICAgIGNvbnN0IGlkID0gQXJyYXkuaXNBcnJheShzZXJpZXMpICYmIHNlcmllc0luZGV4ICE9PSBudWxsID8gc2VyaWVzW3Nlcmllc0luZGV4XT8uaWQgOiBudWxsO1xuXG4gICAgcmV0dXJuIGlkID09PSBudWxsIHx8IGlkID09PSB1bmRlZmluZWQgPyBudWxsIDogU3RyaW5nKGlkKTtcbiAgfVxuXG4gIHByaXZhdGUgX2VtaXQoaGl0OiBSZXBvcnRDaGFydEhpdCwgZXZlbnQ6IHVua25vd24pOiB2b2lkIHtcbiAgICBjb25zdCBkYXRhID0gdGhpcy5kYXRhKCk7XG4gICAgY29uc3QgY2xpY2sgPSBkYXRhXG4gICAgICA/IGNoYXJ0TWFya0NsaWNrKHRoaXMuY29tcG9uZW50KCksIGRhdGEsIHRoaXMuX2ZpbHRlclN0YXRlLmZvcm1hdENvbnRleHQoKSwgaGl0LCBldmVudCBhcyBSZXBvcnRNYXJrRXZlbnQpXG4gICAgICA6IG51bGw7XG5cbiAgICBpZiAoY2xpY2spIHtcbiAgICAgIHRoaXMubWFya0NsaWNrLmVtaXQoY2xpY2spO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm1hcmtNaXNzLmVtaXQoKTtcbiAgICB9XG4gIH1cbn1cbiIsIjxkaXZcbiAgY2xhc3M9XCJjaGFydC1ob3N0XCJcbiAgZWNoYXJ0c1xuICBbb3B0aW9uc109XCJvcHRpb25zKCkgPz8ge31cIlxuICBbdGhlbWVdPVwiJ3JlcG9ydCdcIlxuICBbYXV0b1Jlc2l6ZV09XCJ0cnVlXCJcbiAgKGNoYXJ0SW5pdCk9XCJvbkNoYXJ0SW5pdCgkZXZlbnQpXCJcbiAgKGNoYXJ0Q2xpY2spPVwib25DaGFydENsaWNrKCRldmVudClcIlxuICAoY2hhcnRMZWdlbmRTZWxlY3RDaGFuZ2VkKT1cIm9uTGVnZW5kU2VsZWN0Q2hhbmdlZCgkZXZlbnQpXCI+XG48L2Rpdj5cbjxhcHAtcmVwb3J0LWNvbXBvbmVudC1ub3RlIFtkYXRhXT1cImRhdGEoKVwiPjwvYXBwLXJlcG9ydC1jb21wb25lbnQtbm90ZT5cbiJdfQ==
@@ -1,7 +1,8 @@
1
- import { ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core';
1
+ import { ChangeDetectionStrategy, Component, computed, inject, input, output } from '@angular/core';
2
2
  import { ReportChangePolarity } from '../../enums/report-change-polarity.enum';
3
3
  import { ReportKpiTrend } from '../../enums/report-kpi-trend.enum';
4
4
  import { kpiCardView } from '../../kpi-card';
5
+ import { kpiMarkClick } from '../../mark-click';
5
6
  import { componentNoteLines } from '../../output-notes';
6
7
  import { ReportFilterStateService } from '../../services/report-filter-state.service';
7
8
  import { REPORT_KPI_CHANGE_COLORS, REPORT_KPI_SPARKLINE_COLOR } from '../../theme/palette';
@@ -26,6 +27,9 @@ import * as i0 from "@angular/core";
26
27
  export class ComponentKpiComponent {
27
28
  component = input.required();
28
29
  data = input(null);
30
+ // A click on the value, as a mark with no points (kpiMarkClick); the tile
31
+ // decides what it does.
32
+ markClick = output();
29
33
  ReportKpiTrend = ReportKpiTrend;
30
34
  tokens = {
31
35
  valueSize: `${REPORT_KPI_VALUE_FONT_SIZE}px`,
@@ -43,8 +47,11 @@ export class ComponentKpiComponent {
43
47
  // empty one takes no room.
44
48
  hasNote = computed(() => componentNoteLines(this.data(), { locale: this._filterState.formatContext().locale, timezone: this._filterState.timezone() }, { windows: false, windowDescriptions: true }).length > 0);
45
49
  _filterState = inject(ReportFilterStateService);
50
+ onValueClick(event) {
51
+ this.markClick.emit(kpiMarkClick(this.component(), this.data(), event));
52
+ }
46
53
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ComponentKpiComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
47
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ComponentKpiComponent, isStandalone: true, selector: "app-report-component-kpi", inputs: { component: { classPropertyName: "component", publicName: "component", isSignal: true, isRequired: true, transformFunction: null }, data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "style.--report-kpi-value-size": "tokens.valueSize", "style.--report-kpi-text-default": "tokens.text", "style.--report-kpi-good-default": "tokens.good", "style.--report-kpi-bad-default": "tokens.bad", "style.--report-kpi-neutral-default": "tokens.neutral", "style.--report-kpi-sparkline-default": "tokens.sparkline" } }, ngImport: i0, template: "@let card = view();\n<div class=\"kpi fs-column.gap-xs.align-center.justify-center\">\n <div class=\"kpi-value\">{{ card.value }}</div>\n @if (card.label) {\n <div class=\"kpi-label small\">{{ card.label }}</div>\n }\n @if (card.delta; as delta) {\n <div class=\"kpi-delta fs-row.gap-xs.align-baseline.justify-center.wrap\">\n <span\n class=\"kpi-change\"\n [attr.data-tone]=\"delta.tone\">\n @if (delta.trend !== ReportKpiTrend.Flat) {\n <svg\n class=\"kpi-arrow\"\n [class.down]=\"delta.trend === ReportKpiTrend.Down\"\n viewBox=\"0 0 10 10\">\n <polygon points=\"5,1 9.5,9 0.5,9\"></polygon>\n </svg>\n }\n {{ delta.text }}\n </span>\n @if (delta.compared) {\n <span class=\"small\">{{ delta.compared }}</span>\n }\n </div>\n }\n @if (card.window) {\n <div class=\"kpi-line small\">{{ card.window }}</div>\n }\n @if (card.target; as target) {\n <div class=\"kpi-target fs-column.gap-xs.align-center\">\n <div class=\"kpi-line small\">\n {{ target.text }}\n @if (target.progress) {\n \u00B7 {{ target.progress }}\n }\n </div>\n @if (target.fill !== null) {\n <div\n class=\"kpi-progress\"\n [attr.data-tone]=\"target.tone\">\n <div\n class=\"kpi-progress-fill\"\n [style.width.%]=\"target.fill * 100\">\n </div>\n </div>\n }\n </div>\n }\n @if (card.sparkline; as sparkline) {\n <app-component-kpi-sparkline\n class=\"kpi-sparkline\"\n [values]=\"sparkline.values\"\n [partial]=\"sparkline.partial\">\n </app-component-kpi-sparkline>\n }\n <!-- The card prints its own days, so the note leaves them out. A KPI has no\n tooltip, so its note also says what a windowed value is. -->\n @if (hasNote()) {\n <app-report-component-note\n [data]=\"data()\"\n [windows]=\"false\"\n [windowDescriptions]=\"true\">\n </app-report-component-note>\n }\n</div>\n", styles: [":host{display:block;width:100%;height:100%;--report-kpi-good: var(--report-kpi-good-color, var(--report-kpi-good-default));--report-kpi-bad: var(--report-kpi-bad-color, var(--report-kpi-bad-default));--report-kpi-neutral: var(--report-kpi-neutral-color, var(--report-kpi-neutral-default));--report-kpi-sparkline: var(--report-kpi-sparkline-color, var(--report-kpi-sparkline-default))}.kpi{width:100%;height:100%;overflow:hidden;text-align:center}.kpi .kpi-value{font-size:var(--report-kpi-value-size);font-weight:600;color:var(--report-kpi-text-default);line-height:1}.kpi .kpi-line{max-width:100%;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.kpi-change{font-weight:600;white-space:nowrap}.kpi-change[data-tone=good]{color:var(--report-kpi-good)}.kpi-change[data-tone=bad]{color:var(--report-kpi-bad)}.kpi-change[data-tone=neutral]{color:var(--report-kpi-neutral)}.kpi-arrow{width:.7em;height:.7em;fill:currentColor}.kpi-arrow.down{transform:rotate(180deg)}.kpi-delta,.kpi-target{max-width:100%}.kpi-progress{position:relative;width:120px;max-width:100%;height:4px;border-radius:2px;overflow:hidden;color:var(--report-kpi-neutral)}.kpi-progress[data-tone=good]{color:var(--report-kpi-good)}.kpi-progress:before{content:\"\";position:absolute;inset:0;background:currentColor;opacity:.2}.kpi-progress .kpi-progress-fill{position:relative;height:100%;background:currentColor}.kpi-sparkline{max-width:240px;flex:0 0 auto}\n"], dependencies: [{ kind: "component", type: ComponentNoteComponent, selector: "app-report-component-note", inputs: ["data", "windows", "windowDescriptions", "windowNotes"] }, { kind: "component", type: SparklineComponent, selector: "app-component-kpi-sparkline", inputs: ["values", "partial"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
54
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ComponentKpiComponent, isStandalone: true, selector: "app-report-component-kpi", inputs: { component: { classPropertyName: "component", publicName: "component", isSignal: true, isRequired: true, transformFunction: null }, data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { markClick: "markClick" }, host: { properties: { "style.--report-kpi-value-size": "tokens.valueSize", "style.--report-kpi-text-default": "tokens.text", "style.--report-kpi-good-default": "tokens.good", "style.--report-kpi-bad-default": "tokens.bad", "style.--report-kpi-neutral-default": "tokens.neutral", "style.--report-kpi-sparkline-default": "tokens.sparkline" } }, ngImport: i0, template: "@let card = view();\n<div class=\"kpi fs-column.gap-xs.align-center.justify-center\">\n <div\n class=\"kpi-value\"\n (click)=\"onValueClick($event)\">{{ card.value }}</div>\n @if (card.label) {\n <div class=\"kpi-label small\">{{ card.label }}</div>\n }\n @if (card.delta; as delta) {\n <div class=\"kpi-delta fs-row.gap-xs.align-baseline.justify-center.wrap\">\n <span\n class=\"kpi-change\"\n [attr.data-tone]=\"delta.tone\">\n @if (delta.trend !== ReportKpiTrend.Flat) {\n <svg\n class=\"kpi-arrow\"\n [class.down]=\"delta.trend === ReportKpiTrend.Down\"\n viewBox=\"0 0 10 10\">\n <polygon points=\"5,1 9.5,9 0.5,9\"></polygon>\n </svg>\n }\n {{ delta.text }}\n </span>\n @if (delta.compared) {\n <span class=\"small\">{{ delta.compared }}</span>\n }\n </div>\n }\n @if (card.window) {\n <div class=\"kpi-line small\">{{ card.window }}</div>\n }\n @if (card.target; as target) {\n <div class=\"kpi-target fs-column.gap-xs.align-center\">\n <div class=\"kpi-line small\">\n {{ target.text }}\n @if (target.progress) {\n \u00B7 {{ target.progress }}\n }\n </div>\n @if (target.fill !== null) {\n <div\n class=\"kpi-progress\"\n [attr.data-tone]=\"target.tone\">\n <div\n class=\"kpi-progress-fill\"\n [style.width.%]=\"target.fill * 100\">\n </div>\n </div>\n }\n </div>\n }\n @if (card.sparkline; as sparkline) {\n <app-component-kpi-sparkline\n class=\"kpi-sparkline\"\n [values]=\"sparkline.values\"\n [partial]=\"sparkline.partial\">\n </app-component-kpi-sparkline>\n }\n <!-- The card prints its own days, so the note leaves them out. A KPI has no\n tooltip, so its note also says what a windowed value is. -->\n @if (hasNote()) {\n <app-report-component-note\n [data]=\"data()\"\n [windows]=\"false\"\n [windowDescriptions]=\"true\">\n </app-report-component-note>\n }\n</div>\n", styles: [":host{display:block;width:100%;height:100%;--report-kpi-good: var(--report-kpi-good-color, var(--report-kpi-good-default));--report-kpi-bad: var(--report-kpi-bad-color, var(--report-kpi-bad-default));--report-kpi-neutral: var(--report-kpi-neutral-color, var(--report-kpi-neutral-default));--report-kpi-sparkline: var(--report-kpi-sparkline-color, var(--report-kpi-sparkline-default))}.kpi{width:100%;height:100%;overflow:hidden;text-align:center}.kpi .kpi-value{font-size:var(--report-kpi-value-size);font-weight:600;color:var(--report-kpi-text-default);line-height:1}.kpi .kpi-line{max-width:100%;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.kpi-change{font-weight:600;white-space:nowrap}.kpi-change[data-tone=good]{color:var(--report-kpi-good)}.kpi-change[data-tone=bad]{color:var(--report-kpi-bad)}.kpi-change[data-tone=neutral]{color:var(--report-kpi-neutral)}.kpi-arrow{width:.7em;height:.7em;fill:currentColor}.kpi-arrow.down{transform:rotate(180deg)}.kpi-delta,.kpi-target{max-width:100%}.kpi-progress{position:relative;width:120px;max-width:100%;height:4px;border-radius:2px;overflow:hidden;color:var(--report-kpi-neutral)}.kpi-progress[data-tone=good]{color:var(--report-kpi-good)}.kpi-progress:before{content:\"\";position:absolute;inset:0;background:currentColor;opacity:.2}.kpi-progress .kpi-progress-fill{position:relative;height:100%;background:currentColor}.kpi-sparkline{max-width:240px;flex:0 0 auto}\n"], dependencies: [{ kind: "component", type: ComponentNoteComponent, selector: "app-report-component-note", inputs: ["data", "windows", "windowDescriptions", "windowNotes"] }, { kind: "component", type: SparklineComponent, selector: "app-component-kpi-sparkline", inputs: ["values", "partial"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
48
55
  }
49
56
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ComponentKpiComponent, decorators: [{
50
57
  type: Component,
@@ -58,6 +65,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
58
65
  '[style.--report-kpi-bad-default]': 'tokens.bad',
59
66
  '[style.--report-kpi-neutral-default]': 'tokens.neutral',
60
67
  '[style.--report-kpi-sparkline-default]': 'tokens.sparkline',
61
- }, template: "@let card = view();\n<div class=\"kpi fs-column.gap-xs.align-center.justify-center\">\n <div class=\"kpi-value\">{{ card.value }}</div>\n @if (card.label) {\n <div class=\"kpi-label small\">{{ card.label }}</div>\n }\n @if (card.delta; as delta) {\n <div class=\"kpi-delta fs-row.gap-xs.align-baseline.justify-center.wrap\">\n <span\n class=\"kpi-change\"\n [attr.data-tone]=\"delta.tone\">\n @if (delta.trend !== ReportKpiTrend.Flat) {\n <svg\n class=\"kpi-arrow\"\n [class.down]=\"delta.trend === ReportKpiTrend.Down\"\n viewBox=\"0 0 10 10\">\n <polygon points=\"5,1 9.5,9 0.5,9\"></polygon>\n </svg>\n }\n {{ delta.text }}\n </span>\n @if (delta.compared) {\n <span class=\"small\">{{ delta.compared }}</span>\n }\n </div>\n }\n @if (card.window) {\n <div class=\"kpi-line small\">{{ card.window }}</div>\n }\n @if (card.target; as target) {\n <div class=\"kpi-target fs-column.gap-xs.align-center\">\n <div class=\"kpi-line small\">\n {{ target.text }}\n @if (target.progress) {\n \u00B7 {{ target.progress }}\n }\n </div>\n @if (target.fill !== null) {\n <div\n class=\"kpi-progress\"\n [attr.data-tone]=\"target.tone\">\n <div\n class=\"kpi-progress-fill\"\n [style.width.%]=\"target.fill * 100\">\n </div>\n </div>\n }\n </div>\n }\n @if (card.sparkline; as sparkline) {\n <app-component-kpi-sparkline\n class=\"kpi-sparkline\"\n [values]=\"sparkline.values\"\n [partial]=\"sparkline.partial\">\n </app-component-kpi-sparkline>\n }\n <!-- The card prints its own days, so the note leaves them out. A KPI has no\n tooltip, so its note also says what a windowed value is. -->\n @if (hasNote()) {\n <app-report-component-note\n [data]=\"data()\"\n [windows]=\"false\"\n [windowDescriptions]=\"true\">\n </app-report-component-note>\n }\n</div>\n", styles: [":host{display:block;width:100%;height:100%;--report-kpi-good: var(--report-kpi-good-color, var(--report-kpi-good-default));--report-kpi-bad: var(--report-kpi-bad-color, var(--report-kpi-bad-default));--report-kpi-neutral: var(--report-kpi-neutral-color, var(--report-kpi-neutral-default));--report-kpi-sparkline: var(--report-kpi-sparkline-color, var(--report-kpi-sparkline-default))}.kpi{width:100%;height:100%;overflow:hidden;text-align:center}.kpi .kpi-value{font-size:var(--report-kpi-value-size);font-weight:600;color:var(--report-kpi-text-default);line-height:1}.kpi .kpi-line{max-width:100%;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.kpi-change{font-weight:600;white-space:nowrap}.kpi-change[data-tone=good]{color:var(--report-kpi-good)}.kpi-change[data-tone=bad]{color:var(--report-kpi-bad)}.kpi-change[data-tone=neutral]{color:var(--report-kpi-neutral)}.kpi-arrow{width:.7em;height:.7em;fill:currentColor}.kpi-arrow.down{transform:rotate(180deg)}.kpi-delta,.kpi-target{max-width:100%}.kpi-progress{position:relative;width:120px;max-width:100%;height:4px;border-radius:2px;overflow:hidden;color:var(--report-kpi-neutral)}.kpi-progress[data-tone=good]{color:var(--report-kpi-good)}.kpi-progress:before{content:\"\";position:absolute;inset:0;background:currentColor;opacity:.2}.kpi-progress .kpi-progress-fill{position:relative;height:100%;background:currentColor}.kpi-sparkline{max-width:240px;flex:0 0 auto}\n"] }]
68
+ }, template: "@let card = view();\n<div class=\"kpi fs-column.gap-xs.align-center.justify-center\">\n <div\n class=\"kpi-value\"\n (click)=\"onValueClick($event)\">{{ card.value }}</div>\n @if (card.label) {\n <div class=\"kpi-label small\">{{ card.label }}</div>\n }\n @if (card.delta; as delta) {\n <div class=\"kpi-delta fs-row.gap-xs.align-baseline.justify-center.wrap\">\n <span\n class=\"kpi-change\"\n [attr.data-tone]=\"delta.tone\">\n @if (delta.trend !== ReportKpiTrend.Flat) {\n <svg\n class=\"kpi-arrow\"\n [class.down]=\"delta.trend === ReportKpiTrend.Down\"\n viewBox=\"0 0 10 10\">\n <polygon points=\"5,1 9.5,9 0.5,9\"></polygon>\n </svg>\n }\n {{ delta.text }}\n </span>\n @if (delta.compared) {\n <span class=\"small\">{{ delta.compared }}</span>\n }\n </div>\n }\n @if (card.window) {\n <div class=\"kpi-line small\">{{ card.window }}</div>\n }\n @if (card.target; as target) {\n <div class=\"kpi-target fs-column.gap-xs.align-center\">\n <div class=\"kpi-line small\">\n {{ target.text }}\n @if (target.progress) {\n \u00B7 {{ target.progress }}\n }\n </div>\n @if (target.fill !== null) {\n <div\n class=\"kpi-progress\"\n [attr.data-tone]=\"target.tone\">\n <div\n class=\"kpi-progress-fill\"\n [style.width.%]=\"target.fill * 100\">\n </div>\n </div>\n }\n </div>\n }\n @if (card.sparkline; as sparkline) {\n <app-component-kpi-sparkline\n class=\"kpi-sparkline\"\n [values]=\"sparkline.values\"\n [partial]=\"sparkline.partial\">\n </app-component-kpi-sparkline>\n }\n <!-- The card prints its own days, so the note leaves them out. A KPI has no\n tooltip, so its note also says what a windowed value is. -->\n @if (hasNote()) {\n <app-report-component-note\n [data]=\"data()\"\n [windows]=\"false\"\n [windowDescriptions]=\"true\">\n </app-report-component-note>\n }\n</div>\n", styles: [":host{display:block;width:100%;height:100%;--report-kpi-good: var(--report-kpi-good-color, var(--report-kpi-good-default));--report-kpi-bad: var(--report-kpi-bad-color, var(--report-kpi-bad-default));--report-kpi-neutral: var(--report-kpi-neutral-color, var(--report-kpi-neutral-default));--report-kpi-sparkline: var(--report-kpi-sparkline-color, var(--report-kpi-sparkline-default))}.kpi{width:100%;height:100%;overflow:hidden;text-align:center}.kpi .kpi-value{font-size:var(--report-kpi-value-size);font-weight:600;color:var(--report-kpi-text-default);line-height:1}.kpi .kpi-line{max-width:100%;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.kpi-change{font-weight:600;white-space:nowrap}.kpi-change[data-tone=good]{color:var(--report-kpi-good)}.kpi-change[data-tone=bad]{color:var(--report-kpi-bad)}.kpi-change[data-tone=neutral]{color:var(--report-kpi-neutral)}.kpi-arrow{width:.7em;height:.7em;fill:currentColor}.kpi-arrow.down{transform:rotate(180deg)}.kpi-delta,.kpi-target{max-width:100%}.kpi-progress{position:relative;width:120px;max-width:100%;height:4px;border-radius:2px;overflow:hidden;color:var(--report-kpi-neutral)}.kpi-progress[data-tone=good]{color:var(--report-kpi-good)}.kpi-progress:before{content:\"\";position:absolute;inset:0;background:currentColor;opacity:.2}.kpi-progress .kpi-progress-fill{position:relative;height:100%;background:currentColor}.kpi-sparkline{max-width:240px;flex:0 0 auto}\n"] }]
62
69
  }] });
63
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LWtwaS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3JlcG9ydHMvY29tcG9uZW50cy9jb21wb25lbnQta3BpL2NvbXBvbmVudC1rcGkuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2NvbXBvbmVudHMvY29tcG9uZW50LWtwaS9jb21wb25lbnQta3BpLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFNUYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDL0UsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBRW5FLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUN0RixPQUFPLEVBQUUsd0JBQXdCLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUMzRixPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNwRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDaEQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFFcEYsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNENBQTRDLENBQUM7O0FBR2hGLDhFQUE4RTtBQUM5RSx5RUFBeUU7QUFDekUsMkVBQTJFO0FBQzNFLCtFQUErRTtBQUMvRSwrRUFBK0U7QUFDL0UsMEVBQTBFO0FBQzFFLCtFQUErRTtBQUMvRSxRQUFRO0FBQ1IsRUFBRTtBQUNGLDZFQUE2RTtBQUM3RSw2RUFBNkU7QUFDN0UsMkRBQTJEO0FBQzNELGdGQUFnRjtBQW9CaEYsTUFBTSxPQUFPLHFCQUFxQjtJQUVoQixTQUFTLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBbUIsQ0FBQztJQUM5QyxJQUFJLEdBQUcsS0FBSyxDQUF1QixJQUFJLENBQUMsQ0FBQztJQUV6QyxjQUFjLEdBQUcsY0FBYyxDQUFDO0lBRWhDLE1BQU0sR0FBRztRQUN2QixTQUFTLEVBQUUsR0FBRywwQkFBMEIsSUFBSTtRQUM1QyxJQUFJLEVBQUUsa0JBQWtCO1FBQ3hCLElBQUksRUFBRSxJQUFJLHdCQUF3QixDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxFQUFFO1FBQy9ELEdBQUcsRUFBRSxJQUFJLHdCQUF3QixDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxFQUFFO1FBQzdELE9BQU8sRUFBRSxJQUFJLHdCQUF3QixDQUFDLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxFQUFFO1FBQ3JFLFNBQVMsRUFBRSxJQUFJLDBCQUEwQixFQUFFO0tBQzVDLENBQUM7SUFFRiw0RUFBNEU7SUFDNUUsMEVBQTBFO0lBQzFFLG1DQUFtQztJQUNuQixJQUFJLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLFdBQVcsQ0FDL0MsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBYyxFQUM1QyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQ1gsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUN0RixDQUFDLENBQUM7SUFFSCx3RUFBd0U7SUFDeEUsMkJBQTJCO0lBQ1gsT0FBTyxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxrQkFBa0IsQ0FDekQsSUFBSSxDQUFDLElBQUksRUFBRSxFQUNYLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxFQUFFLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxFQUFFLEVBQzVGLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxrQkFBa0IsRUFBRSxJQUFJLEVBQUUsQ0FDN0MsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFFRyxZQUFZLEdBQUcsTUFBTSxDQUFDLHdCQUF3QixDQUFDLENBQUM7d0dBakN0RCxxQkFBcUI7NEZBQXJCLHFCQUFxQiwrcUJDaERsQyw0aUVBa0VBLG05Q0Q5Qkksc0JBQXNCLHdJQUN0QixrQkFBa0I7OzRGQVdULHFCQUFxQjtrQkFuQmpDLFNBQVM7K0JBQ0UsMEJBQTBCLG1CQUduQix1QkFBdUIsQ0FBQyxNQUFNLGNBQ25DLElBQUksV0FDUDt3QkFDUCxzQkFBc0I7d0JBQ3RCLGtCQUFrQjtxQkFDbkIsUUFDSzt3QkFDSixpQ0FBaUMsRUFBRSxrQkFBa0I7d0JBQ3JELG1DQUFtQyxFQUFFLGFBQWE7d0JBQ2xELG1DQUFtQyxFQUFFLGFBQWE7d0JBQ2xELGtDQUFrQyxFQUFFLFlBQVk7d0JBQ2hELHNDQUFzQyxFQUFFLGdCQUFnQjt3QkFDeEQsd0NBQXdDLEVBQUUsa0JBQWtCO3FCQUM3RCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIGNvbXB1dGVkLCBpbmplY3QsIGlucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IFJlcG9ydENoYW5nZVBvbGFyaXR5IH0gZnJvbSAnLi4vLi4vZW51bXMvcmVwb3J0LWNoYW5nZS1wb2xhcml0eS5lbnVtJztcbmltcG9ydCB7IFJlcG9ydEtwaVRyZW5kIH0gZnJvbSAnLi4vLi4vZW51bXMvcmVwb3J0LWtwaS10cmVuZC5lbnVtJztcbmltcG9ydCB7IENvbXBvbmVudERhdGEsIEtwaUNvbmZpZywgUmVwb3J0Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9yZXBvcnQuaW50ZXJmYWNlJztcbmltcG9ydCB7IGtwaUNhcmRWaWV3IH0gZnJvbSAnLi4vLi4va3BpLWNhcmQnO1xuaW1wb3J0IHsgY29tcG9uZW50Tm90ZUxpbmVzIH0gZnJvbSAnLi4vLi4vb3V0cHV0LW5vdGVzJztcbmltcG9ydCB7IFJlcG9ydEZpbHRlclN0YXRlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3JlcG9ydC1maWx0ZXItc3RhdGUuc2VydmljZSc7XG5pbXBvcnQgeyBSRVBPUlRfS1BJX0NIQU5HRV9DT0xPUlMsIFJFUE9SVF9LUElfU1BBUktMSU5FX0NPTE9SIH0gZnJvbSAnLi4vLi4vdGhlbWUvcGFsZXR0ZSc7XG5pbXBvcnQgeyBSRVBPUlRfS1BJX1ZBTFVFX0ZPTlRfU0laRSB9IGZyb20gJy4uLy4uL3RoZW1lL3R5cG9ncmFwaHknO1xuaW1wb3J0IHsgREVGQVVMVF9URVhUX0NPTE9SIH0gZnJvbSAnLi4vLi4vdGV4dCc7XG5pbXBvcnQgeyBDb21wb25lbnROb3RlQ29tcG9uZW50IH0gZnJvbSAnLi4vY29tcG9uZW50LW5vdGUvY29tcG9uZW50LW5vdGUuY29tcG9uZW50JztcblxuaW1wb3J0IHsgU3BhcmtsaW5lQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL3NwYXJrbGluZS9zcGFya2xpbmUuY29tcG9uZW50JztcblxuXG4vLyBBIHNpbmdsZSBiaWcgbnVtYmVyOiB0aGUgY29tcG9uZW50J3MgbWVhc3VyZSBhZ2dyZWdhdGVkIG92ZXIgYWxsIChmaWx0ZXJlZClcbi8vIHJvd3Mgc2VydmVyLXNpZGUsIGluIHRoZSBvcGVuIHJlcG9ydCdzIGZvcm1hdCBjb250ZXh0IChpdHMgbG9jYWxlLCBpdHNcbi8vIGN1cnJlbmN5LCBhbmQgd2hldGhlciBhIHBlcmNlbnQgYXJyaXZlcyBhcyBhIDAtMSByYXRpbyBvciwgZnJvbSBhbiBvbGRlclxuLy8gc2VydmVyLCBhbHJlYWR5IHgxMDApLiBXaXRoIGEgY29tcGFyaXNvbiwgYSB0YXJnZXQgb3IgYSBzcGFya2xpbmUgdGhlIHNlcnZlclxuLy8gc2VuZHMgZXZlcnkgb3RoZXIgbnVtYmVyIHRoZSBjYXJkIHNob3dzIHRvbyAoQ29tcG9uZW50RGF0YS5rcGkpOyBrcGktY2FyZC50c1xuLy8gZGVjaWRlcyB3aGF0IGVhY2ggbGluZSBzYXlzLCBhbmQgdGhpcyBvbmx5IGxheXMgdGhlbSBvdXQsIGluIG9yZGVyOiB0aGVcbi8vIHZhbHVlIGFuZCBpdHMgbGFiZWwsIHRoZSBkZWx0YSwgdGhlIGRheXMsIHRoZSB0YXJnZXQgYW5kIHRoZSB0cmVuZCwgdGhlbiB0aGVcbi8vIG5vdGUuXG4vL1xuLy8gVGhlIHBhbGV0dGUncyBjb2xvcnMgYW5kIHRoZSB2YWx1ZSdzIHNpemUgYXJyaXZlIGFzIGN1c3RvbSBwcm9wZXJ0aWVzIGZyb21cbi8vIHRoZSBzYW1lIGNvbnN0YW50cyB0aGUgZXhwb3J0cyBkcmF3IHdpdGguIEEgaG9zdCBwYWdlIG92ZXJyaWRlcyBhIGNvbG9yIGJ5XG4vLyBzZXR0aW5nIC0tcmVwb3J0LWtwaS1nb29kLWNvbG9yLCAtLXJlcG9ydC1rcGktYmFkLWNvbG9yLFxuLy8gLS1yZXBvcnQta3BpLW5ldXRyYWwtY29sb3Igb3IgLS1yZXBvcnQta3BpLXNwYXJrbGluZS1jb2xvciBhcm91bmQgdGhlIHJlcG9ydC5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1yZXBvcnQtY29tcG9uZW50LWtwaScsXG4gIHRlbXBsYXRlVXJsOiAnLi9jb21wb25lbnQta3BpLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vY29tcG9uZW50LWtwaS5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENvbXBvbmVudE5vdGVDb21wb25lbnQsXG4gICAgU3BhcmtsaW5lQ29tcG9uZW50LFxuICBdLFxuICBob3N0OiB7XG4gICAgJ1tzdHlsZS4tLXJlcG9ydC1rcGktdmFsdWUtc2l6ZV0nOiAndG9rZW5zLnZhbHVlU2l6ZScsXG4gICAgJ1tzdHlsZS4tLXJlcG9ydC1rcGktdGV4dC1kZWZhdWx0XSc6ICd0b2tlbnMudGV4dCcsXG4gICAgJ1tzdHlsZS4tLXJlcG9ydC1rcGktZ29vZC1kZWZhdWx0XSc6ICd0b2tlbnMuZ29vZCcsXG4gICAgJ1tzdHlsZS4tLXJlcG9ydC1rcGktYmFkLWRlZmF1bHRdJzogJ3Rva2Vucy5iYWQnLFxuICAgICdbc3R5bGUuLS1yZXBvcnQta3BpLW5ldXRyYWwtZGVmYXVsdF0nOiAndG9rZW5zLm5ldXRyYWwnLFxuICAgICdbc3R5bGUuLS1yZXBvcnQta3BpLXNwYXJrbGluZS1kZWZhdWx0XSc6ICd0b2tlbnMuc3BhcmtsaW5lJyxcbiAgfSxcbn0pXG5leHBvcnQgY2xhc3MgQ29tcG9uZW50S3BpQ29tcG9uZW50IHtcblxuICBwdWJsaWMgcmVhZG9ubHkgY29tcG9uZW50ID0gaW5wdXQucmVxdWlyZWQ8UmVwb3J0Q29tcG9uZW50PigpO1xuICBwdWJsaWMgcmVhZG9ubHkgZGF0YSA9IGlucHV0PENvbXBvbmVudERhdGEgfCBudWxsPihudWxsKTtcblxuICBwdWJsaWMgcmVhZG9ubHkgUmVwb3J0S3BpVHJlbmQgPSBSZXBvcnRLcGlUcmVuZDtcblxuICBwdWJsaWMgcmVhZG9ubHkgdG9rZW5zID0ge1xuICAgIHZhbHVlU2l6ZTogYCR7UkVQT1JUX0tQSV9WQUxVRV9GT05UX1NJWkV9cHhgLFxuICAgIHRleHQ6IERFRkFVTFRfVEVYVF9DT0xPUixcbiAgICBnb29kOiBgIyR7UkVQT1JUX0tQSV9DSEFOR0VfQ09MT1JTW1JlcG9ydENoYW5nZVBvbGFyaXR5Lkdvb2RdfWAsXG4gICAgYmFkOiBgIyR7UkVQT1JUX0tQSV9DSEFOR0VfQ09MT1JTW1JlcG9ydENoYW5nZVBvbGFyaXR5LkJhZF19YCxcbiAgICBuZXV0cmFsOiBgIyR7UkVQT1JUX0tQSV9DSEFOR0VfQ09MT1JTW1JlcG9ydENoYW5nZVBvbGFyaXR5Lk5ldXRyYWxdfWAsXG4gICAgc3BhcmtsaW5lOiBgIyR7UkVQT1JUX0tQSV9TUEFSS0xJTkVfQ09MT1J9YCxcbiAgfTtcblxuICAvLyBSZWFkIG9mZiB0aGUgY29tcG9uZW50IG9uIGV2ZXJ5IGRhdGEgY2hhbmdlIHJhdGhlciB0aGFuIHRocm91Z2ggYSBtZW1vIG9mXG4gIC8vIHRoZSBjb25maWc6IGEgc2V0dGluZ3Mgc2F2ZSByZXBhaW50cyB0aGUgc2FtZSBjb21wb25lbnQgb2JqZWN0IHdpdGggbmV3XG4gIC8vIEtQSSBrZXlzLCB0aGVuIHJlbG9hZHMgaXRzIGRhdGEuXG4gIHB1YmxpYyByZWFkb25seSB2aWV3ID0gY29tcHV0ZWQoKCkgPT4ga3BpQ2FyZFZpZXcoXG4gICAgKHRoaXMuY29tcG9uZW50KCkuY29uZmlnID8/IHt9KSBhcyBLcGlDb25maWcsXG4gICAgdGhpcy5kYXRhKCksXG4gICAgeyBmb3JtYXQ6IHRoaXMuX2ZpbHRlclN0YXRlLmZvcm1hdENvbnRleHQoKSwgdGltZXpvbmU6IHRoaXMuX2ZpbHRlclN0YXRlLnRpbWV6b25lKCkgfSxcbiAgKSk7XG5cbiAgLy8gVGhlIG5vdGUgc2l0cyB1bmRlciB0aGUgY2FyZCBvbmx5IHdoZW4gaXQgaGFzIHNvbWV0aGluZyB0byBzYXksIHNvIGFuXG4gIC8vIGVtcHR5IG9uZSB0YWtlcyBubyByb29tLlxuICBwdWJsaWMgcmVhZG9ubHkgaGFzTm90ZSA9IGNvbXB1dGVkKCgpID0+IGNvbXBvbmVudE5vdGVMaW5lcyhcbiAgICB0aGlzLmRhdGEoKSxcbiAgICB7IGxvY2FsZTogdGhpcy5fZmlsdGVyU3RhdGUuZm9ybWF0Q29udGV4dCgpLmxvY2FsZSwgdGltZXpvbmU6IHRoaXMuX2ZpbHRlclN0YXRlLnRpbWV6b25lKCkgfSxcbiAgICB7IHdpbmRvd3M6IGZhbHNlLCB3aW5kb3dEZXNjcmlwdGlvbnM6IHRydWUgfSxcbiAgKS5sZW5ndGggPiAwKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9maWx0ZXJTdGF0ZSA9IGluamVjdChSZXBvcnRGaWx0ZXJTdGF0ZVNlcnZpY2UpO1xufVxuIiwiQGxldCBjYXJkID0gdmlldygpO1xuPGRpdiBjbGFzcz1cImtwaSBmcy1jb2x1bW4uZ2FwLXhzLmFsaWduLWNlbnRlci5qdXN0aWZ5LWNlbnRlclwiPlxuICA8ZGl2IGNsYXNzPVwia3BpLXZhbHVlXCI+e3sgY2FyZC52YWx1ZSB9fTwvZGl2PlxuICBAaWYgKGNhcmQubGFiZWwpIHtcbiAgICA8ZGl2IGNsYXNzPVwia3BpLWxhYmVsIHNtYWxsXCI+e3sgY2FyZC5sYWJlbCB9fTwvZGl2PlxuICB9XG4gIEBpZiAoY2FyZC5kZWx0YTsgYXMgZGVsdGEpIHtcbiAgICA8ZGl2IGNsYXNzPVwia3BpLWRlbHRhIGZzLXJvdy5nYXAteHMuYWxpZ24tYmFzZWxpbmUuanVzdGlmeS1jZW50ZXIud3JhcFwiPlxuICAgICAgPHNwYW5cbiAgICAgICAgICBjbGFzcz1cImtwaS1jaGFuZ2VcIlxuICAgICAgICAgIFthdHRyLmRhdGEtdG9uZV09XCJkZWx0YS50b25lXCI+XG4gICAgICAgIEBpZiAoZGVsdGEudHJlbmQgIT09IFJlcG9ydEtwaVRyZW5kLkZsYXQpIHtcbiAgICAgICAgICA8c3ZnXG4gICAgICAgICAgICAgIGNsYXNzPVwia3BpLWFycm93XCJcbiAgICAgICAgICAgICAgW2NsYXNzLmRvd25dPVwiZGVsdGEudHJlbmQgPT09IFJlcG9ydEtwaVRyZW5kLkRvd25cIlxuICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDEwIDEwXCI+XG4gICAgICAgICAgICA8cG9seWdvbiBwb2ludHM9XCI1LDEgOS41LDkgMC41LDlcIj48L3BvbHlnb24+XG4gICAgICAgICAgPC9zdmc+XG4gICAgICAgIH1cbiAgICAgICAge3sgZGVsdGEudGV4dCB9fVxuICAgICAgPC9zcGFuPlxuICAgICAgQGlmIChkZWx0YS5jb21wYXJlZCkge1xuICAgICAgICA8c3BhbiBjbGFzcz1cInNtYWxsXCI+e3sgZGVsdGEuY29tcGFyZWQgfX08L3NwYW4+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gIH1cbiAgQGlmIChjYXJkLndpbmRvdykge1xuICAgIDxkaXYgY2xhc3M9XCJrcGktbGluZSBzbWFsbFwiPnt7IGNhcmQud2luZG93IH19PC9kaXY+XG4gIH1cbiAgQGlmIChjYXJkLnRhcmdldDsgYXMgdGFyZ2V0KSB7XG4gICAgPGRpdiBjbGFzcz1cImtwaS10YXJnZXQgZnMtY29sdW1uLmdhcC14cy5hbGlnbi1jZW50ZXJcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJrcGktbGluZSBzbWFsbFwiPlxuICAgICAgICB7eyB0YXJnZXQudGV4dCB9fVxuICAgICAgICBAaWYgKHRhcmdldC5wcm9ncmVzcykge1xuICAgICAgICAgIMK3IHt7IHRhcmdldC5wcm9ncmVzcyB9fVxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICAgIEBpZiAodGFyZ2V0LmZpbGwgIT09IG51bGwpIHtcbiAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJrcGktcHJvZ3Jlc3NcIlxuICAgICAgICAgICAgW2F0dHIuZGF0YS10b25lXT1cInRhcmdldC50b25lXCI+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJrcGktcHJvZ3Jlc3MtZmlsbFwiXG4gICAgICAgICAgICBbc3R5bGUud2lkdGguJV09XCJ0YXJnZXQuZmlsbCAqIDEwMFwiPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgfVxuICBAaWYgKGNhcmQuc3BhcmtsaW5lOyBhcyBzcGFya2xpbmUpIHtcbiAgICA8YXBwLWNvbXBvbmVudC1rcGktc3BhcmtsaW5lXG4gICAgICBjbGFzcz1cImtwaS1zcGFya2xpbmVcIlxuICAgICAgW3ZhbHVlc109XCJzcGFya2xpbmUudmFsdWVzXCJcbiAgICAgIFtwYXJ0aWFsXT1cInNwYXJrbGluZS5wYXJ0aWFsXCI+XG4gICAgPC9hcHAtY29tcG9uZW50LWtwaS1zcGFya2xpbmU+XG4gIH1cbiAgPCEtLSBUaGUgY2FyZCBwcmludHMgaXRzIG93biBkYXlzLCBzbyB0aGUgbm90ZSBsZWF2ZXMgdGhlbSBvdXQuIEEgS1BJIGhhcyBub1xuICAgICAgIHRvb2x0aXAsIHNvIGl0cyBub3RlIGFsc28gc2F5cyB3aGF0IGEgd2luZG93ZWQgdmFsdWUgaXMuIC0tPlxuICBAaWYgKGhhc05vdGUoKSkge1xuICAgIDxhcHAtcmVwb3J0LWNvbXBvbmVudC1ub3RlXG4gICAgICBbZGF0YV09XCJkYXRhKClcIlxuICAgICAgW3dpbmRvd3NdPVwiZmFsc2VcIlxuICAgICAgW3dpbmRvd0Rlc2NyaXB0aW9uc109XCJ0cnVlXCI+XG4gICAgPC9hcHAtcmVwb3J0LWNvbXBvbmVudC1ub3RlPlxuICB9XG48L2Rpdj5cbiJdfQ==
70
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LWtwaS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3JlcG9ydHMvY29tcG9uZW50cy9jb21wb25lbnQta3BpL2NvbXBvbmVudC1rcGkuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2NvbXBvbmVudHMvY29tcG9uZW50LWtwaS9jb21wb25lbnQta3BpLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXBHLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQy9FLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUduRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3hELE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQ3RGLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSwwQkFBMEIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzNGLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNoRCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUVwRixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQzs7QUFHaEYsOEVBQThFO0FBQzlFLHlFQUF5RTtBQUN6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bnQsIGNvbXB1dGVkLCBpbmplY3QsIGlucHV0LCBvdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgUmVwb3J0Q2hhbmdlUG9sYXJpdHkgfSBmcm9tICcuLi8uLi9lbnVtcy9yZXBvcnQtY2hhbmdlLXBvbGFyaXR5LmVudW0nO1xuaW1wb3J0IHsgUmVwb3J0S3BpVHJlbmQgfSBmcm9tICcuLi8uLi9lbnVtcy9yZXBvcnQta3BpLXRyZW5kLmVudW0nO1xuaW1wb3J0IHsgQ29tcG9uZW50RGF0YSwgS3BpQ29uZmlnLCBSZXBvcnRDb21wb25lbnQgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3JlcG9ydC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUmVwb3J0TWFya0NsaWNrIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9yZXBvcnQtbWFyay1jbGljay5pbnRlcmZhY2UnO1xuaW1wb3J0IHsga3BpQ2FyZFZpZXcgfSBmcm9tICcuLi8uLi9rcGktY2FyZCc7XG5pbXBvcnQgeyBrcGlNYXJrQ2xpY2sgfSBmcm9tICcuLi8uLi9tYXJrLWNsaWNrJztcbmltcG9ydCB7IGNvbXBvbmVudE5vdGVMaW5lcyB9IGZyb20gJy4uLy4uL291dHB1dC1ub3Rlcyc7XG5pbXBvcnQgeyBSZXBvcnRGaWx0ZXJTdGF0ZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9yZXBvcnQtZmlsdGVyLXN0YXRlLnNlcnZpY2UnO1xuaW1wb3J0IHsgUkVQT1JUX0tQSV9DSEFOR0VfQ09MT1JTLCBSRVBPUlRfS1BJX1NQQVJLTElORV9DT0xPUiB9IGZyb20gJy4uLy4uL3RoZW1lL3BhbGV0dGUnO1xuaW1wb3J0IHsgUkVQT1JUX0tQSV9WQUxVRV9GT05UX1NJWkUgfSBmcm9tICcuLi8uLi90aGVtZS90eXBvZ3JhcGh5JztcbmltcG9ydCB7IERFRkFVTFRfVEVYVF9DT0xPUiB9IGZyb20gJy4uLy4uL3RleHQnO1xuaW1wb3J0IHsgQ29tcG9uZW50Tm90ZUNvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudC1ub3RlL2NvbXBvbmVudC1ub3RlLmNvbXBvbmVudCc7XG5cbmltcG9ydCB7IFNwYXJrbGluZUNvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9zcGFya2xpbmUvc3BhcmtsaW5lLmNvbXBvbmVudCc7XG5cblxuLy8gQSBzaW5nbGUgYmlnIG51bWJlcjogdGhlIGNvbXBvbmVudCdzIG1lYXN1cmUgYWdncmVnYXRlZCBvdmVyIGFsbCAoZmlsdGVyZWQpXG4vLyByb3dzIHNlcnZlci1zaWRlLCBpbiB0aGUgb3BlbiByZXBvcnQncyBmb3JtYXQgY29udGV4dCAoaXRzIGxvY2FsZSwgaXRzXG4vLyBjdXJyZW5jeSwgYW5kIHdoZXRoZXIgYSBwZXJjZW50IGFycml2ZXMgYXMgYSAwLTEgcmF0aW8gb3IsIGZyb20gYW4gb2xkZXJcbi8vIHNlcnZlciwgYWxyZWFkeSB4MTAwKS4gV2l0aCBhIGNvbXBhcmlzb24sIGEgdGFyZ2V0IG9yIGEgc3BhcmtsaW5lIHRoZSBzZXJ2ZXJcbi8vIHNlbmRzIGV2ZXJ5IG90aGVyIG51bWJlciB0aGUgY2FyZCBzaG93cyB0b28gKENvbXBvbmVudERhdGEua3BpKTsga3BpLWNhcmQudHNcbi8vIGRlY2lkZXMgd2hhdCBlYWNoIGxpbmUgc2F5cywgYW5kIHRoaXMgb25seSBsYXlzIHRoZW0gb3V0LCBpbiBvcmRlcjogdGhlXG4vLyB2YWx1ZSBhbmQgaXRzIGxhYmVsLCB0aGUgZGVsdGEsIHRoZSBkYXlzLCB0aGUgdGFyZ2V0IGFuZCB0aGUgdHJlbmQsIHRoZW4gdGhlXG4vLyBub3RlLlxuLy9cbi8vIFRoZSBwYWxldHRlJ3MgY29sb3JzIGFuZCB0aGUgdmFsdWUncyBzaXplIGFycml2ZSBhcyBjdXN0b20gcHJvcGVydGllcyBmcm9tXG4vLyB0aGUgc2FtZSBjb25zdGFudHMgdGhlIGV4cG9ydHMgZHJhdyB3aXRoLiBBIGhvc3QgcGFnZSBvdmVycmlkZXMgYSBjb2xvciBieVxuLy8gc2V0dGluZyAtLXJlcG9ydC1rcGktZ29vZC1jb2xvciwgLS1yZXBvcnQta3BpLWJhZC1jb2xvcixcbi8vIC0tcmVwb3J0LWtwaS1uZXV0cmFsLWNvbG9yIG9yIC0tcmVwb3J0LWtwaS1zcGFya2xpbmUtY29sb3IgYXJvdW5kIHRoZSByZXBvcnQuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtcmVwb3J0LWNvbXBvbmVudC1rcGknLFxuICB0ZW1wbGF0ZVVybDogJy4vY29tcG9uZW50LWtwaS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2NvbXBvbmVudC1rcGkuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBDb21wb25lbnROb3RlQ29tcG9uZW50LFxuICAgIFNwYXJrbGluZUNvbXBvbmVudCxcbiAgXSxcbiAgaG9zdDoge1xuICAgICdbc3R5bGUuLS1yZXBvcnQta3BpLXZhbHVlLXNpemVdJzogJ3Rva2Vucy52YWx1ZVNpemUnLFxuICAgICdbc3R5bGUuLS1yZXBvcnQta3BpLXRleHQtZGVmYXVsdF0nOiAndG9rZW5zLnRleHQnLFxuICAgICdbc3R5bGUuLS1yZXBvcnQta3BpLWdvb2QtZGVmYXVsdF0nOiAndG9rZW5zLmdvb2QnLFxuICAgICdbc3R5bGUuLS1yZXBvcnQta3BpLWJhZC1kZWZhdWx0XSc6ICd0b2tlbnMuYmFkJyxcbiAgICAnW3N0eWxlLi0tcmVwb3J0LWtwaS1uZXV0cmFsLWRlZmF1bHRdJzogJ3Rva2Vucy5uZXV0cmFsJyxcbiAgICAnW3N0eWxlLi0tcmVwb3J0LWtwaS1zcGFya2xpbmUtZGVmYXVsdF0nOiAndG9rZW5zLnNwYXJrbGluZScsXG4gIH0sXG59KVxuZXhwb3J0IGNsYXNzIENvbXBvbmVudEtwaUNvbXBvbmVudCB7XG5cbiAgcHVibGljIHJlYWRvbmx5IGNvbXBvbmVudCA9IGlucHV0LnJlcXVpcmVkPFJlcG9ydENvbXBvbmVudD4oKTtcbiAgcHVibGljIHJlYWRvbmx5IGRhdGEgPSBpbnB1dDxDb21wb25lbnREYXRhIHwgbnVsbD4obnVsbCk7XG5cbiAgLy8gQSBjbGljayBvbiB0aGUgdmFsdWUsIGFzIGEgbWFyayB3aXRoIG5vIHBvaW50cyAoa3BpTWFya0NsaWNrKTsgdGhlIHRpbGVcbiAgLy8gZGVjaWRlcyB3aGF0IGl0IGRvZXMuXG4gIHB1YmxpYyByZWFkb25seSBtYXJrQ2xpY2sgPSBvdXRwdXQ8UmVwb3J0TWFya0NsaWNrPigpO1xuXG4gIHB1YmxpYyByZWFkb25seSBSZXBvcnRLcGlUcmVuZCA9IFJlcG9ydEtwaVRyZW5kO1xuXG4gIHB1YmxpYyByZWFkb25seSB0b2tlbnMgPSB7XG4gICAgdmFsdWVTaXplOiBgJHtSRVBPUlRfS1BJX1ZBTFVFX0ZPTlRfU0laRX1weGAsXG4gICAgdGV4dDogREVGQVVMVF9URVhUX0NPTE9SLFxuICAgIGdvb2Q6IGAjJHtSRVBPUlRfS1BJX0NIQU5HRV9DT0xPUlNbUmVwb3J0Q2hhbmdlUG9sYXJpdHkuR29vZF19YCxcbiAgICBiYWQ6IGAjJHtSRVBPUlRfS1BJX0NIQU5HRV9DT0xPUlNbUmVwb3J0Q2hhbmdlUG9sYXJpdHkuQmFkXX1gLFxuICAgIG5ldXRyYWw6IGAjJHtSRVBPUlRfS1BJX0NIQU5HRV9DT0xPUlNbUmVwb3J0Q2hhbmdlUG9sYXJpdHkuTmV1dHJhbF19YCxcbiAgICBzcGFya2xpbmU6IGAjJHtSRVBPUlRfS1BJX1NQQVJLTElORV9DT0xPUn1gLFxuICB9O1xuXG4gIC8vIFJlYWQgb2ZmIHRoZSBjb21wb25lbnQgb24gZXZlcnkgZGF0YSBjaGFuZ2UgcmF0aGVyIHRoYW4gdGhyb3VnaCBhIG1lbW8gb2ZcbiAgLy8gdGhlIGNvbmZpZzogYSBzZXR0aW5ncyBzYXZlIHJlcGFpbnRzIHRoZSBzYW1lIGNvbXBvbmVudCBvYmplY3Qgd2l0aCBuZXdcbiAgLy8gS1BJIGtleXMsIHRoZW4gcmVsb2FkcyBpdHMgZGF0YS5cbiAgcHVibGljIHJlYWRvbmx5IHZpZXcgPSBjb21wdXRlZCgoKSA9PiBrcGlDYXJkVmlldyhcbiAgICAodGhpcy5jb21wb25lbnQoKS5jb25maWcgPz8ge30pIGFzIEtwaUNvbmZpZyxcbiAgICB0aGlzLmRhdGEoKSxcbiAgICB7IGZvcm1hdDogdGhpcy5fZmlsdGVyU3RhdGUuZm9ybWF0Q29udGV4dCgpLCB0aW1lem9uZTogdGhpcy5fZmlsdGVyU3RhdGUudGltZXpvbmUoKSB9LFxuICApKTtcblxuICAvLyBUaGUgbm90ZSBzaXRzIHVuZGVyIHRoZSBjYXJkIG9ubHkgd2hlbiBpdCBoYXMgc29tZXRoaW5nIHRvIHNheSwgc28gYW5cbiAgLy8gZW1wdHkgb25lIHRha2VzIG5vIHJvb20uXG4gIHB1YmxpYyByZWFkb25seSBoYXNOb3RlID0gY29tcHV0ZWQoKCkgPT4gY29tcG9uZW50Tm90ZUxpbmVzKFxuICAgIHRoaXMuZGF0YSgpLFxuICAgIHsgbG9jYWxlOiB0aGlzLl9maWx0ZXJTdGF0ZS5mb3JtYXRDb250ZXh0KCkubG9jYWxlLCB0aW1lem9uZTogdGhpcy5fZmlsdGVyU3RhdGUudGltZXpvbmUoKSB9LFxuICAgIHsgd2luZG93czogZmFsc2UsIHdpbmRvd0Rlc2NyaXB0aW9uczogdHJ1ZSB9LFxuICApLmxlbmd0aCA+IDApO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2ZpbHRlclN0YXRlID0gaW5qZWN0KFJlcG9ydEZpbHRlclN0YXRlU2VydmljZSk7XG5cbiAgcHVibGljIG9uVmFsdWVDbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIHRoaXMubWFya0NsaWNrLmVtaXQoa3BpTWFya0NsaWNrKHRoaXMuY29tcG9uZW50KCksIHRoaXMuZGF0YSgpLCBldmVudCkpO1xuICB9XG59XG4iLCJAbGV0IGNhcmQgPSB2aWV3KCk7XG48ZGl2IGNsYXNzPVwia3BpIGZzLWNvbHVtbi5nYXAteHMuYWxpZ24tY2VudGVyLmp1c3RpZnktY2VudGVyXCI+XG4gIDxkaXZcbiAgICAgIGNsYXNzPVwia3BpLXZhbHVlXCJcbiAgICAgIChjbGljayk9XCJvblZhbHVlQ2xpY2soJGV2ZW50KVwiPnt7IGNhcmQudmFsdWUgfX08L2Rpdj5cbiAgQGlmIChjYXJkLmxhYmVsKSB7XG4gICAgPGRpdiBjbGFzcz1cImtwaS1sYWJlbCBzbWFsbFwiPnt7IGNhcmQubGFiZWwgfX08L2Rpdj5cbiAgfVxuICBAaWYgKGNhcmQuZGVsdGE7IGFzIGRlbHRhKSB7XG4gICAgPGRpdiBjbGFzcz1cImtwaS1kZWx0YSBmcy1yb3cuZ2FwLXhzLmFsaWduLWJhc2VsaW5lLmp1c3RpZnktY2VudGVyLndyYXBcIj5cbiAgICAgIDxzcGFuXG4gICAgICAgICAgY2xhc3M9XCJrcGktY2hhbmdlXCJcbiAgICAgICAgICBbYXR0ci5kYXRhLXRvbmVdPVwiZGVsdGEudG9uZVwiPlxuICAgICAgICBAaWYgKGRlbHRhLnRyZW5kICE9PSBSZXBvcnRLcGlUcmVuZC5GbGF0KSB7XG4gICAgICAgICAgPHN2Z1xuICAgICAgICAgICAgICBjbGFzcz1cImtwaS1hcnJvd1wiXG4gICAgICAgICAgICAgIFtjbGFzcy5kb3duXT1cImRlbHRhLnRyZW5kID09PSBSZXBvcnRLcGlUcmVuZC5Eb3duXCJcbiAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAxMCAxMFwiPlxuICAgICAgICAgICAgPHBvbHlnb24gcG9pbnRzPVwiNSwxIDkuNSw5IDAuNSw5XCI+PC9wb2x5Z29uPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICB9XG4gICAgICAgIHt7IGRlbHRhLnRleHQgfX1cbiAgICAgIDwvc3Bhbj5cbiAgICAgIEBpZiAoZGVsdGEuY29tcGFyZWQpIHtcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJzbWFsbFwiPnt7IGRlbHRhLmNvbXBhcmVkIH19PC9zcGFuPlxuICAgICAgfVxuICAgIDwvZGl2PlxuICB9XG4gIEBpZiAoY2FyZC53aW5kb3cpIHtcbiAgICA8ZGl2IGNsYXNzPVwia3BpLWxpbmUgc21hbGxcIj57eyBjYXJkLndpbmRvdyB9fTwvZGl2PlxuICB9XG4gIEBpZiAoY2FyZC50YXJnZXQ7IGFzIHRhcmdldCkge1xuICAgIDxkaXYgY2xhc3M9XCJrcGktdGFyZ2V0IGZzLWNvbHVtbi5nYXAteHMuYWxpZ24tY2VudGVyXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwia3BpLWxpbmUgc21hbGxcIj5cbiAgICAgICAge3sgdGFyZ2V0LnRleHQgfX1cbiAgICAgICAgQGlmICh0YXJnZXQucHJvZ3Jlc3MpIHtcbiAgICAgICAgICDCtyB7eyB0YXJnZXQucHJvZ3Jlc3MgfX1cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgICBAaWYgKHRhcmdldC5maWxsICE9PSBudWxsKSB7XG4gICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwia3BpLXByb2dyZXNzXCJcbiAgICAgICAgICAgIFthdHRyLmRhdGEtdG9uZV09XCJ0YXJnZXQudG9uZVwiPlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwia3BpLXByb2dyZXNzLWZpbGxcIlxuICAgICAgICAgICAgW3N0eWxlLndpZHRoLiVdPVwidGFyZ2V0LmZpbGwgKiAxMDBcIj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gIH1cbiAgQGlmIChjYXJkLnNwYXJrbGluZTsgYXMgc3BhcmtsaW5lKSB7XG4gICAgPGFwcC1jb21wb25lbnQta3BpLXNwYXJrbGluZVxuICAgICAgY2xhc3M9XCJrcGktc3BhcmtsaW5lXCJcbiAgICAgIFt2YWx1ZXNdPVwic3BhcmtsaW5lLnZhbHVlc1wiXG4gICAgICBbcGFydGlhbF09XCJzcGFya2xpbmUucGFydGlhbFwiPlxuICAgIDwvYXBwLWNvbXBvbmVudC1rcGktc3BhcmtsaW5lPlxuICB9XG4gIDwhLS0gVGhlIGNhcmQgcHJpbnRzIGl0cyBvd24gZGF5cywgc28gdGhlIG5vdGUgbGVhdmVzIHRoZW0gb3V0LiBBIEtQSSBoYXMgbm9cbiAgICAgICB0b29sdGlwLCBzbyBpdHMgbm90ZSBhbHNvIHNheXMgd2hhdCBhIHdpbmRvd2VkIHZhbHVlIGlzLiAtLT5cbiAgQGlmIChoYXNOb3RlKCkpIHtcbiAgICA8YXBwLXJlcG9ydC1jb21wb25lbnQtbm90ZVxuICAgICAgW2RhdGFdPVwiZGF0YSgpXCJcbiAgICAgIFt3aW5kb3dzXT1cImZhbHNlXCJcbiAgICAgIFt3aW5kb3dEZXNjcmlwdGlvbnNdPVwidHJ1ZVwiPlxuICAgIDwvYXBwLXJlcG9ydC1jb21wb25lbnQtbm90ZT5cbiAgfVxuPC9kaXY+XG4iXX0=
@@ -208,6 +208,12 @@ export class ComponentListComponent {
208
208
  if (search) {
209
209
  state.search = search;
210
210
  }
211
+ // The groups that match 'any', as every other read of this tile sends
212
+ // them (tileDataState). The sort and paging above are FsList's own.
213
+ const { matchAnyGroupIds } = this._filterState.tileState(component);
214
+ if (matchAnyGroupIds) {
215
+ state.matchAnyGroupIds = matchAnyGroupIds;
216
+ }
211
217
  // One source for filter values, the same one charts, KPIs and the exports
212
218
  // read, so the list is filtered exactly as its header strip shows.
213
219
  const filters = this._filterState.resolveForComponent(component);
@@ -342,4 +348,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
342
348
  ReportOutputPipe,
343
349
  ], template: "@if (truncated()) {\n <div class=\"pivot-truncated\">\n This grid was built from a partial result, so some columns or values may be missing. Narrow it with a filter.\n </div>\n}\n\n<!-- The windows a comparison compares, and why it reads as it does. A\n windowed column's own notes are in its header's tooltip. -->\n<app-report-component-note\n [data]=\"noteData()\"\n [windowNotes]=\"false\">\n</app-report-component-note>\n\n<!-- fs-list reads a column's footer template once, as a direct child of\n fs-list-column, so a list with totals renders its columns in a branch of\n their own rather than wrapping the footer in an @if. Its header template too,\n which every column carries: an output column's tooltip says what it holds.\n Columns are tracked by alignment as well as name, since fs-list reads a\n column's alignment only when it builds the column. -->\n<fs-list\n [config]=\"listConfig\"\n [class.report-totals-empty]=\"!totals()\">\n @if (showTotals()) {\n @for (column of columns(); track column.column + ':' + column.numeric) {\n <fs-list-column\n [name]=\"column.column\"\n [title]=\"column.label || column.column\"\n [show]=\"!hidden().has(column.column)\"\n [sortable]=\"!pivoted() || $first\"\n [align]=\"column.numeric ? 'right' : 'left'\"\n [class]=\"columnClasses(column, $index, pinned())\">\n <ng-template fs-list-header>\n <ng-container\n [ngTemplateOutlet]=\"headerTpl\"\n [ngTemplateOutletContext]=\"{ column: column }\">\n </ng-container>\n </ng-template>\n <ng-template\n fs-list-cell\n let-row=\"row\">\n <ng-container\n [ngTemplateOutlet]=\"cellTpl\"\n [ngTemplateOutletContext]=\"{ $implicit: row[column.column], row: row, column: column }\">\n </ng-container>\n </ng-template>\n <ng-template fs-list-footer>\n @if (totals()?.[column.column] !== undefined) {\n <ng-container\n [ngTemplateOutlet]=\"cellTpl\"\n [ngTemplateOutletContext]=\"{ $implicit: totals()?.[column.column], row: totals(), column: column }\">\n </ng-container>\n } @else if (column.column === totalsLabelColumn()) {\n {{ totalLabel }}\n }\n </ng-template>\n </fs-list-column>\n }\n } @else {\n @for (column of columns(); track column.column + ':' + column.numeric) {\n <fs-list-column\n [name]=\"column.column\"\n [title]=\"column.label || column.column\"\n [show]=\"!hidden().has(column.column)\"\n [sortable]=\"!pivoted() || $first\"\n [align]=\"column.numeric ? 'right' : 'left'\"\n [class]=\"columnClasses(column, $index, pinned())\">\n <ng-template fs-list-header>\n <ng-container\n [ngTemplateOutlet]=\"headerTpl\"\n [ngTemplateOutletContext]=\"{ column: column }\">\n </ng-container>\n </ng-template>\n <ng-template\n fs-list-cell\n let-row=\"row\">\n <ng-container\n [ngTemplateOutlet]=\"cellTpl\"\n [ngTemplateOutletContext]=\"{ $implicit: row[column.column], row: row, column: column }\">\n </ng-container>\n </ng-template>\n </fs-list-column>\n }\n }\n</fs-list>\n\n@if (caption()) {\n <div class=\"list-caption small\">\n {{ caption() }}\n </div>\n}\n\n<!-- A column's heading, with what an output column holds as its tooltip (an\n empty one never shows). -->\n<ng-template\n #headerTpl\n let-column=\"column\">\n <span [matTooltip]=\"columnNotes()[column.column] ?? ''\">{{ column.label || column.column }}</span>\n</ng-template>\n\n<!-- One cell, in the body and the totals row alike: an output column by what\n it holds (its row gives a change its prior), a date column as a day in the\n report's zone and locale, any other through its number format. -->\n<ng-template\n #cellTpl\n let-value\n let-row=\"row\"\n let-column=\"column\">\n @if (outputColumns()[column.column]; as output) {\n @if (row | fsReportOutput: column : output : formatContext(); as cell) {\n <span [attr.title]=\"cell.title\">{{ cell.text }}</span>\n }\n } @else if (column.format === ReportListColumnFormat.Date) {\n {{ value | fsReportDate: timezone() : formatContext().locale }}\n } @else {\n {{ value | fsReportNumber: column : formatContext() }}\n }\n</ng-template>\n", styles: [":host{display:flex;flex-direction:column;width:100%;height:100%;min-height:0}:host ::ng-deep fs-list{display:flex;flex-direction:column;flex:1 1 auto;height:auto;min-height:0}:host ::ng-deep fs-list .fs-list-container{display:flex;flex-direction:column;flex:1 1 auto;min-height:0;height:100%}:host ::ng-deep fs-list .fs-list-header-container{flex:0 0 auto}:host ::ng-deep fs-list .fs-list-container .fs-list-table-container{flex:1 1 auto;min-height:0;overflow-y:auto!important}:host ::ng-deep fs-list .fs-list-table thead th{position:sticky;top:0;z-index:1;background-color:#fff}:host ::ng-deep fs-list .fs-list-table tfoot td{position:sticky;bottom:0;z-index:1;background-color:#fff;font-weight:500;box-shadow:inset 0 1px #0000001f}:host ::ng-deep fs-list.report-totals-empty tfoot{display:none}:host ::ng-deep fs-list .report-pinned{position:sticky;left:var(--report-pin-left, 0px);z-index:1;background-color:#fff}:host ::ng-deep fs-list .report-pin-0{--report-pin-left: var(--report-pin-left-0, 0px)}:host ::ng-deep fs-list .report-pin-1{--report-pin-left: var(--report-pin-left-1, 0px)}:host ::ng-deep fs-list .report-pin-2{--report-pin-left: var(--report-pin-left-2, 0px)}:host ::ng-deep fs-list .report-pin-last{box-shadow:inset -1px 0 #0000001f}:host ::ng-deep fs-list .fs-list-table thead th.report-pinned{z-index:3}:host ::ng-deep fs-list .fs-list-table tfoot td.report-pinned{z-index:2}:host ::ng-deep fs-list .fs-list-table tfoot td.report-pin-last{box-shadow:inset -1px 0 #0000001f,inset 0 1px #0000001f}:host ::ng-deep fs-list th.report-nowrap,:host ::ng-deep fs-list td.report-nowrap{white-space:nowrap}:host ::ng-deep fs-list fs-list-pagination{flex:0 0 auto}:host ::ng-deep fs-list .fs-list-load-more{position:sticky;bottom:0;background-color:#fff}:host ::ng-deep fs-list .fs-list-load-more button{margin-top:0}.list-caption{flex:0 0 auto;padding-top:4px}.pivot-truncated{flex:0 0 auto;padding:8px 12px;margin-bottom:8px;border-radius:4px;background-color:#fff4e5;color:#663c00}\n"] }]
344
350
  }], ctorParameters: () => [] });
345
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LWxpc3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2NvbXBvbmVudHMvY29tcG9uZW50LWxpc3QvY29tcG9uZW50LWxpc3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2NvbXBvbmVudHMvY29tcG9uZW50LWxpc3QvY29tcG9uZW50LWxpc3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbkQsT0FBTyxFQUVMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsVUFBVSxFQUNWLFVBQVUsRUFDVixRQUFRLEVBRVIsZUFBZSxFQUNmLFFBQVEsRUFDUixNQUFNLEVBQ04sTUFBTSxFQUNOLEtBQUssRUFDTCxNQUFNLEVBQ04sU0FBUyxFQUNULFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFdkQsT0FBTyxFQUFFLGVBQWUsRUFBZ0IsWUFBWSxFQUFFLGtCQUFrQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFbkcsT0FBTyxFQUFjLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRW5ELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUNwRixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsZUFBZSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBU2xFLE9BQU8sRUFDTCxnQkFBZ0IsRUFFaEIsYUFBYSxFQUNiLGlCQUFpQixFQUNqQixp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QUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEtBQUssS0FBSyxFQUFFLENBQUM7Z0JBQ2hELElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztZQUN0QyxDQUFDO1lBRUQsSUFBSSxJQUFJLE1BQU0sQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLEtBQUssQ0FBQztRQUMvQyxDQUFDO0lBQ0gsQ0FBQzt3R0F0WFUsc0JBQXNCOzRGQUF0QixzQkFBc0IsbVpBS1MsZUFBZSxnRUN0RjNELCs1SUFxSEEsc2dFRDdDSSxzQkFBc0IsdUlBQ3RCLFlBQVksK3lCQUNaLFVBQVUsaVJBQ1YsZ0JBQWdCLCtJQUNoQixjQUFjLGdEQUNkLGdCQUFnQixrREFDaEIsZ0JBQWdCOzs0RkFHUCxzQkFBc0I7a0JBaEJsQyxTQUFTOytCQUNFLDJCQUEyQixtQkFHcEIsdUJBQXVCLENBQUMsTUFBTSxjQUNuQyxJQUFJLFdBQ1A7d0JBQ1Asc0JBQXNCO3dCQUN0QixZQUFZO3dCQUNaLFVBQVU7d0JBQ1YsZ0JBQWdCO3dCQUNoQixjQUFjO3dCQUNkLGdCQUFnQjt3QkFDaEIsZ0JBQWdCO3FCQUNqQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nVGVtcGxhdGVPdXRsZXQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQWZ0ZXJSZW5kZXJSZWYsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIERlc3Ryb3lSZWYsXG4gIEVsZW1lbnRSZWYsXG4gIEluamVjdG9yLFxuICBPbkluaXQsXG4gIGFmdGVyTmV4dFJlbmRlcixcbiAgY29tcHV0ZWQsXG4gIGVmZmVjdCxcbiAgaW5qZWN0LFxuICBpbnB1dCxcbiAgc2lnbmFsLFxuICB1bnRyYWNrZWQsXG4gIHZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBNYXRUb29sdGlwIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdG9vbHRpcCc7XG5cbmltcG9ydCB7IEZzTGlzdENvbXBvbmVudCwgRnNMaXN0Q29uZmlnLCBGc0xpc3RNb2R1bGUsIFBhZ2luYXRpb25TdHJhdGVneSB9IGZyb20gJ0BmaXJlc3RpdGNoL2xpc3QnO1xuXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBtYXAsIG1lcmdlLCB0YXAgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgUmVwb3J0RGF0YSB9IGZyb20gJy4uLy4uL2RhdGEvcmVwb3J0LmRhdGEnO1xuaW1wb3J0IHsgUmVwb3J0TGlzdENvbHVtbkZvcm1hdCB9IGZyb20gJy4uLy4uL2VudW1zL3JlcG9ydC1saXN0LWNvbHVtbi1mb3JtYXQuZW51bSc7XG5pbXBvcnQgeyBmb3JtYXRQbGFpbk51bWJlciwgaGFzTnVtYmVyRm9ybWF0IH0gZnJvbSAnLi4vLi4vZm9ybWF0JztcbmltcG9ydCB7XG4gIENvbXBvbmVudERhdGEsXG4gIENvbXBvbmVudERhdGFTdGF0ZSxcbiAgTGlzdENvbHVtbixcbiAgTGlzdENvbmZpZyxcbiAgUmVwb3J0Q29tcG9uZW50LFxuICBSZXBvcnRTb3J0LFxufSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3JlcG9ydC5pbnRlcmZhY2UnO1xuaW1wb3J0IHtcbiAgTElTVF9UT1RBTF9MQUJFTCxcbiAgTGlzdE91dHB1dENvbHVtbixcbiAgY29sdW1uQ2xhc3NlcyxcbiAgbGlzdE91dHB1dENvbHVtbnMsXG4gIGxpc3RQaW5uZWRDb2x1bW5zLFxuICBsaXN0U29ydFRlcm1zLFxuICBsaXN0VG90YWxzTGFiZWxDb2x1bW4sXG59IGZyb20gJy4uLy4uL2xpc3QtY29uZmlnJztcbmltcG9ydCB7IHBpdm90Q29sdW1uU3BlY3MgfSBmcm9tICcuLi8uLi9vcHRpb24tYnVpbGRlcic7XG5pbXBvcnQgeyBDb21wb25lbnROb3RlRGF0YSwgb3V0cHV0Q29sdW1uTm90ZSB9IGZyb20gJy4uLy4uL291dHB1dC1ub3Rlcyc7XG5pbXBvcnQgeyBSZXBvcnREYXRlUGlwZSB9IGZyb20gJy4uLy4uL3BpcGVzL3JlcG9ydC1kYXRlLnBpcGUnO1xuaW1wb3J0IHsgUmVwb3J0TnVtYmVyUGlwZSB9IGZyb20gJy4uLy4uL3BpcGVzL3JlcG9ydC1udW1iZXIucGlwZSc7XG5pbXBvcnQgeyBSZXBvcnRPdXRwdXRQaXBlIH0gZnJvbSAnLi4vLi4vcGlwZXMvcmVwb3J0LW91dHB1dC5waXBlJztcbmltcG9ydCB7IFJlcG9ydEZpbHRlclN0YXRlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3JlcG9ydC1maWx0ZXItc3RhdGUuc2VydmljZSc7XG5pbXBvcnQgeyBDb21wb25lbnROb3RlQ29tcG9uZW50IH0gZnJvbSAnLi4vY29tcG9uZW50LW5vdGUvY29tcG9uZW50LW5vdGUuY29tcG9uZW50JztcblxuXG4vLyBBIGxpc3QgY29tcG9uZW50OiBhbiBGc0xpc3QgcmVuZGVyZWQgZnJvbSB0aGUgY29tcG9uZW50J3MgY29uZmlnLiBJdCBoYXMgbm9cbi8vIGZpbHRlciBiYXIgb2YgaXRzIG93bjogaXRzIGZpbHRlcnMgYXJlIGdyb3VwLWtleWVkIGxpa2UgZXZlcnkgb3RoZXJcbi8vIGNvbXBvbmVudCdzLCBzbyBjb21wb25lbnQtbGV2ZWwgZ3JvdXBzIHJlbmRlciBpbiB0aGUgY29tcG9uZW50IGhlYWRlciBzdHJpcFxuLy8gKFJlcG9ydENvbXBvbmVudENvbXBvbmVudCkgYW5kIHJlcG9ydC1sZXZlbCBncm91cHMgaW4gdGhlIHJlcG9ydCBiYXIsIGFuZFxuLy8gZXZlcnkgcmVxdWVzdCB0YWtlcyBpdHMgdmFsdWVzIGZyb20gdGhlIHNoYXJlZCBmaWx0ZXItc3RhdGUgc2VydmljZS5cbi8vIFBhZ2luZyBhbmQgc29ydGluZyBhcmUgcHVzaGVkIGludG8gdGhlIFNRTCB3cmFwIHNlcnZlci1zaWRlLlxuLy9cbi8vIEEgbGlzdCB3aG9zZSBxdWVyeSBjb21wYXJlcywgd2luZG93cywgcmFua3Mgb3Igc2hhcmVzIHNheXMgc286IHRoZSBzaGFyZWRcbi8vIG5vdGUgYWJvdmUgaXQgbmFtZXMgdGhlIHdpbmRvd3MgYSBjb21wYXJpc29uIGNvbXBhcmVzLCBlYWNoIHN1Y2ggY29sdW1uJ3Ncbi8vIGhlYWRlciB0b29sdGlwIHNheXMgd2hhdCBpdCBob2xkcywgYW5kIGl0cyBjZWxscyAodG90YWxzIGluY2x1ZGVkLCB3aGljaCB0aGVcbi8vIHNlcnZlciBjb21wdXRlcykgYXJlIHdyaXR0ZW4gYnkgd2hhdCB0aGV5IGhvbGQuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtcmVwb3J0LWNvbXBvbmVudC1saXN0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NvbXBvbmVudC1saXN0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vY29tcG9uZW50LWxpc3QuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBDb21wb25lbnROb3RlQ29tcG9uZW50LFxuICAgIEZzTGlzdE1vZHVsZSxcbiAgICBNYXRUb29sdGlwLFxuICAgIE5nVGVtcGxhdGVPdXRsZXQsXG4gICAgUmVwb3J0RGF0ZVBpcGUsXG4gICAgUmVwb3J0TnVtYmVyUGlwZSxcbiAgICBSZXBvcnRPdXRwdXRQaXBlLFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBDb21wb25lbnRMaXN0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcblxuICBwdWJsaWMgcmVhZG9ubHkgcmVwb3J0SWQgPSBpbnB1dC5yZXF1aXJlZDxudW1iZXI+KCk7XG4gIHB1YmxpYyByZWFkb25seSBjb21wb25lbnQgPSBpbnB1dC5yZXF1aXJlZDxSZXBvcnRDb21wb25lbnQ+KCk7XG5cbiAgcHVibGljIHJlYWRvbmx5IGxpc3RDb21wb25lbnQgPSB2aWV3Q2hpbGQoRnNMaXN0Q29tcG9uZW50KTtcblxuICBwdWJsaWMgbGlzdENvbmZpZzogRnNMaXN0Q29uZmlnO1xuXG4gIC8vIEEgcGxhaW4gbGlzdCdzIGNvbHVtbnMgYXJlIGF1dGhvcmVkIGFuZCBmaXhlZCBhdCBpbml0LiBBIGNyb3NzLXRhYidzIGFyZVxuICAvLyB0aGUgcGl2b3QgZGltZW5zaW9uJ3MgVkFMVUVTLCBzbyB0aGV5IGFycml2ZSB3aXRoIHRoZSByb3dzIGFuZCBjaGFuZ2VcbiAgLy8gd2hlbmV2ZXIgdGhlIGZpbHRlcnMgZG8g4oCUIHdoaWNoIGlzIHdoeSB0aGlzIGlzIGEgc2lnbmFsIHJhdGhlciB0aGFuIHRoZVxuICAvLyBvbmUtc2hvdCByZWFkIGl0IHVzZWQgdG8gYmUuIGBudW1lcmljYCBtYXJrcyBhIGNvbHVtbiB3aG9zZSBjZWxscyBhcmVcbiAgLy8gZm9ybWF0dGVkIG51bWJlcnMsIGRlY2lkZWQgb25jZSBoZXJlIHJhdGhlciB0aGFuIHBlciBjZWxsLCBzbyB0aGUgY29sdW1uXG4gIC8vIGFuZCBpdHMgaGVhZGVyIGFyZSByaWdodC1hbGlnbmVkLlxuICBwdWJsaWMgY29sdW1ucyA9IHNpZ25hbDwoTGlzdENvbHVtbiAmIHsgbnVtZXJpYzogYm9vbGVhbiB9KVtdPihbXSk7XG5cbiAgLy8gQSBjcm9zcy10YWIgc29ydHMgb25seSBieSBpdHMgcm93LWtleSBjb2x1bW46IGV2ZXJ5IG90aGVyIGhlYWRlciBpcyBhXG4gIC8vIHBpdm90IHZhbHVlLCBhbmQgdGhlIHNlcnZlciBvcmRlcnMgdGhlIGxvbmcgcm93cyBiZWZvcmUgcGl2b3RpbmcsIHNvIGFcbiAgLy8gY2xpY2sgb24gXCJNYXIgMjAyNlwiIGhhcyBub3RoaW5nIHRvIG9yZGVyIGJ5LlxuICBwdWJsaWMgcGl2b3RlZCA9IHNpZ25hbChmYWxzZSk7XG5cbiAgLy8gQSBjdXQgcmVzdWx0IGlzIHdvcnNlIGZvciBhIGdyaWQgdGhhbiBmb3IgYSBsaXN0OiB0aGUgY3V0IGxhbmRzIG9uIHRoZSBMT05HXG4gIC8vIHJvd3MgYmVmb3JlIHRoZSByZXNoYXBlLCBzbyBhIHBpdm90IHZhbHVlIGxpdmluZyBvbmx5IGluIHRoZSB0YWlsIHZhbmlzaGVzXG4gIC8vIGFzIGEgd2hvbGUgQ09MVU1OIGFuZCBzdHJhZGRsZWQgY2VsbHMgY29tZSBiYWNrIGJsYW5rLCBpbmRpc3Rpbmd1aXNoYWJsZVxuICAvLyBmcm9tIGEgcmVhbCB6ZXJvLiBUaGUgcGFyZW50J3MgdHJ1bmNhdGlvbiBiYW5uZXIgbmV2ZXIgZmlyZXMgZm9yIGEgbGlzdFxuICAvLyAoaXQgb25seSByZW5kZXJzIHdoYXQgX2xvYWQoKSBmZXRjaGVkLCB3aGljaCBsaXN0cyBza2lwKSwgc28gdGhlIHdhcm5pbmdcbiAgLy8gYmVsb25ncyBoZXJlLlxuICBwdWJsaWMgdHJ1bmNhdGVkID0gc2lnbmFsKGZhbHNlKTtcblxuICAvLyBXaHkgdGhlIHNlYXJjaCBib3ggZGlkIG5vdCBuYXJyb3cgdGhlIHJvd3MgKHRoZSBsaXN0IGhhcyBubyB0ZXh0IGNvbHVtbiB0b1xuICAvLyBzZWFyY2gpLCBmcm9tIHRoZSBsYXRlc3QgcGFnZSAxOyBudWxsIHdoZW4gdGhlIHNlYXJjaCBhcHBsaWVkIG9yIG5vbmUgd2FzXG4gIC8vIG1hZGUuXG4gIHB1YmxpYyByZWFkb25seSBzZWFyY2hOb3RlID0gc2lnbmFsPHN0cmluZyB8IG51bGw+KG51bGwpO1xuXG4gIC8vIGNvbmZpZy50b3RhbHMsIHJlYWQgb25jZSBhdCBpbml0OiBhIGxpc3Qgd2l0aCB0b3RhbHMgcmVuZGVycyBpdHMgY29sdW1uc1xuICAvLyB3aXRoIGEgZm9vdGVyIHRlbXBsYXRlLCB3aGljaCBmcy1saXN0IHJlYWRzIG9ubHkgd2hlbiBpdCBidWlsZHMgdGhlbS5cbiAgcHVibGljIHJlYWRvbmx5IHNob3dUb3RhbHMgPSBzaWduYWwoZmFsc2UpO1xuXG4gIC8vIFRoZSB0b3RhbHMgcm93IGZyb20gdGhlIGxhdGVzdCBwYWdlIDEsIHJhdyB2YWx1ZXMga2V5ZWQgbGlrZSB0aGUgY29sdW1ucztcbiAgLy8gbnVsbCB3aGVuIHRoZSBsaXN0IGhhcyBub25lLCBvciB0aGUgc2VydmVyIHNheXMgd2h5IGluIHRvdGFsc05vdGUuXG4gIHB1YmxpYyByZWFkb25seSB0b3RhbHMgPSBzaWduYWw8UmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCBudWxsPihudWxsKTtcblxuICBwdWJsaWMgcmVhZG9ubHkgdG90YWxzTm90ZSA9IHNpZ25hbDxzdHJpbmcgfCBudWxsPihudWxsKTtcblxuICAvLyBUaGUgbGF0ZXN0IHBhZ2UgMSdzIGNvbXBhcmlzb24gd2luZG93cywgdGltZWZyYW1lIGFuZCBvdXRwdXQgbWV0YWRhdGEsIGZvclxuICAvLyB0aGUgbm90ZSBhYm92ZSB0aGUgbGlzdCwgdGhlIGhlYWRlciB0b29sdGlwcyBhbmQgdGhlIG91dHB1dCBjZWxsczsgbnVsbFxuICAvLyB1bnRpbCBpdCBhcnJpdmVzLCBhbmQgZW1wdHkgb2YgZXZlcnkga2V5IGZvciBhIGxpc3QgdGhhdCBoYXMgbm9uZS5cbiAgcHVibGljIHJlYWRvbmx5IG5vdGVEYXRhID0gc2lnbmFsPENvbXBvbmVudE5vdGVEYXRhIHwgbnVsbD4obnVsbCk7XG5cbiAgLy8gSG93IG1hbnkgcm93cyB0aGUgbGlzdCBzaG93cyAobG9hZCBtb3JlIGFwcGVuZHMpIG91dCBvZiBob3cgbWFueSBpdHNcbiAgLy8gZmlsdGVycyBrZWVwLiBBIGNyb3NzLXRhYiBjb3VudHMgZ3JpZCByb3dzLlxuICBwdWJsaWMgcmVhZG9ubHkgcm93Q291bnQgPSBzaWduYWw8eyBzaG93bjogbnVtYmVyOyB0b3RhbDogbnVtYmVyIH0gfCBudWxsPihudWxsKTtcblxuICAvLyBUaGUgcmVwb3J0J3MgZWZmZWN0aXZlIHpvbmUsIHdoaWNoIGRhdGUgY2VsbHMgcmVuZGVyIGluLiBJbmplY3RlZCByaWdodFxuICAvLyBoZXJlIHJhdGhlciB0aGFuIHJlYWQgb2ZmIF9maWx0ZXJTdGF0ZSwgd2hpY2ggaXMgZGVjbGFyZWQgZnVydGhlciBkb3duIGFuZFxuICAvLyBpcyBzdGlsbCB1bmRlZmluZWQgd2hpbGUgdGhpcyBpbml0aWFsaXplciBydW5zLlxuICBwdWJsaWMgcmVhZG9ubHkgdGltZXpvbmUgPSBpbmplY3QoUmVwb3J0RmlsdGVyU3RhdGVTZXJ2aWNlKS50aW1lem9uZTtcblxuICAvLyBUaGUgb3BlbiByZXBvcnQncyBmb3JtYXQgY29udGV4dDogZGF0ZSBjZWxscywgbnVtYmVyIGNlbGxzIGFuZCBhXG4gIC8vIGNyb3NzLXRhYidzIHBlcmlvZCBoZWFkaW5ncyBhcmUgd3JpdHRlbiBpbiBpdHMgbG9jYWxlIChhbmQgbW9uZXkgaW4gaXRzXG4gIC8vIGN1cnJlbmN5KS4gSW5qZWN0ZWQgaGVyZSBmb3IgdGhlIHNhbWUgcmVhc29uLlxuICBwdWJsaWMgcmVhZG9ubHkgZm9ybWF0Q29udGV4dCA9IGluamVjdChSZXBvcnRGaWx0ZXJTdGF0ZVNlcnZpY2UpLmZvcm1hdENvbnRleHQ7XG5cbiAgcHVibGljIHJlYWRvbmx5IFJlcG9ydExpc3RDb2x1bW5Gb3JtYXQgPSBSZXBvcnRMaXN0Q29sdW1uRm9ybWF0O1xuXG4gIC8vIEhvdyBtYW55IGxlYWRpbmcgY29sdW1ucyBzdGF5IGluIHZpZXcgd2hpbGUgdGhlIGxpc3Qgc2Nyb2xscyBzaWRld2F5cy5cbiAgcHVibGljIHJlYWRvbmx5IHBpbm5lZCA9IGNvbXB1dGVkKCgpID0+IGxpc3RQaW5uZWRDb2x1bW5zKHRoaXMuY29tcG9uZW50KCkuY29uZmlnKSk7XG5cbiAgcHVibGljIHJlYWRvbmx5IGNvbHVtbkNsYXNzZXMgPSBjb2x1bW5DbGFzc2VzO1xuXG4gIC8vIFRoZSBjb25maWcgY29sdW1ucyB0aGUgdmlld2VyIGhpZCBvbiB0aGlzIGxpc3QgKHRoZSBDb2x1bW5zIGRpYWxvZywgb3IgdGhlXG4gIC8vIFVSTCkuIGZzLWxpc3QgaGlkZXMgYW5kIHNob3dzIHRoZW0gaW4gcGxhY2UgdGhyb3VnaCBbc2hvd10sIHNvIHRoZSByb3dzXG4gIC8vIGFscmVhZHkgZmV0Y2hlZCBzdGFuZC5cbiAgcHVibGljIHJlYWRvbmx5IGhpZGRlbiA9IGNvbXB1dGVkKCgpID0+IG5ldyBTZXQodGhpcy5fZmlsdGVyU3RhdGUuaGlkZGVuQ29sdW1ucyh0aGlzLmNvbXBvbmVudCgpLmlkKSkpO1xuXG4gIHB1YmxpYyByZWFkb25seSB0b3RhbExhYmVsID0gTElTVF9UT1RBTF9MQUJFTDtcblxuICAvLyBUaGUgY29sdW1ucyB0aGF0IGhvbGQgYSBjb21wYXJlZCwgd2luZG93ZWQsIHJhbmtlZCBvciBzaGFyZWQgb3V0cHV0LCBieVxuICAvLyBuYW1lOyB0aGUgcmVzdCBhcmUgd3JpdHRlbiBhcyBiZWZvcmUuXG4gIHB1YmxpYyByZWFkb25seSBvdXRwdXRDb2x1bW5zID0gY29tcHV0ZWQ8UmVjb3JkPHN0cmluZywgTGlzdE91dHB1dENvbHVtbj4+KCgpID0+IGxpc3RPdXRwdXRDb2x1bW5zKFxuICAgIHRoaXMuY29sdW1ucygpLFxuICAgIHRoaXMubm90ZURhdGEoKSxcbiAgICAoKHRoaXMuY29tcG9uZW50KCkuY29uZmlnID8/IHt9KSBhcyBMaXN0Q29uZmlnKS5jb2x1bW5zID8/IFtdLFxuICApKTtcblxuICAvLyBFYWNoIGNvbHVtbidzIGhlYWRlciB0b29sdGlwOiB3aGF0IGFuIG91dHB1dCBjb2x1bW4gaG9sZHMgKCcnIGZvciBhbnlcbiAgLy8gb3RoZXIpLlxuICBwdWJsaWMgcmVhZG9ubHkgY29sdW1uTm90ZXMgPSBjb21wdXRlZDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PigoKSA9PiB7XG4gICAgY29uc3QgbG9jYWxlID0gdGhpcy5mb3JtYXRDb250ZXh0KCkubG9jYWxlO1xuXG4gICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyh0aGlzLmNvbHVtbnMoKVxuICAgICAgLm1hcCgoY29sdW1uKSA9PiBbY29sdW1uLmNvbHVtbiwgb3V0cHV0Q29sdW1uTm90ZShjb2x1bW4uY29sdW1uLCB0aGlzLm5vdGVEYXRhKCksIGxvY2FsZSldKSk7XG4gIH0pO1xuXG4gIC8vIFRoZSBjb2x1bW4gd2hvc2UgZm9vdGVyIGNlbGwgcmVhZHMgJ1RvdGFsJzogdGhlIGZpcnN0IG9uZSBzaG93biwgdW5sZXNzXG4gIC8vIGl0IGhvbGRzIGEgdG90YWwgaXRzZWxmLlxuICBwdWJsaWMgcmVhZG9ubHkgdG90YWxzTGFiZWxDb2x1bW4gPSBjb21wdXRlZCgoKSA9PiBsaXN0VG90YWxzTGFiZWxDb2x1bW4oXG4gICAgdGhpcy5jb2x1bW5zKCkuZmlsdGVyKChjb2x1bW4pID0+ICF0aGlzLmhpZGRlbigpLmhhcyhjb2x1bW4uY29sdW1uKSksXG4gICAgdGhpcy50b3RhbHMoKSxcbiAgKSk7XG5cbiAgLy8gVGhlIGxpbmUgdW5kZXIgdGhlIGxpc3Q6IGl0cyByb3cgY291bnQsIHRoZW4gd2h5IGl0IGhhcyBubyB0b3RhbHMgYW5kIHdoeVxuICAvLyBpdHMgc2VhcmNoIG5hcnJvd2VkIG5vdGhpbmcuIFRoZSBkaWdpdHMgYXJlIHdyaXR0ZW4gaW4gdGhlIHJlcG9ydCdzXG4gIC8vIGxvY2FsZSwgbmV2ZXIgdGhlIGFwcCdzLlxuICBwdWJsaWMgcmVhZG9ubHkgY2FwdGlvbiA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBjb3VudCA9IHRoaXMucm93Q291bnQoKTtcbiAgICBjb25zdCBsb2NhbGUgPSB0aGlzLmZvcm1hdENvbnRleHQoKS5sb2NhbGU7XG4gICAgY29uc3QgcGFydHM6IHN0cmluZ1tdID0gW107XG5cbiAgICBpZiAoY291bnQpIHtcbiAgICAgIGNvbnN0IHRvdGFsID0gZm9ybWF0UGxhaW5OdW1iZXIoY291bnQudG90YWwsIGxvY2FsZSk7XG4gICAgICBwYXJ0cy5wdXNoKGNvdW50LnNob3duIDwgY291bnQudG90YWxcbiAgICAgICAgPyBgU2hvd2luZyAke2Zvcm1hdFBsYWluTnVtYmVyKGNvdW50LnNob3duLCBsb2NhbGUpfSBvZiAke3RvdGFsfWBcbiAgICAgICAgOiBgJHt0b3RhbH0gcm93KHMpYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFsuLi5wYXJ0cywgdGhpcy50b3RhbHNOb3RlKCksIHRoaXMuc2VhcmNoTm90ZSgpXVxuICAgICAgLmZpbHRlcigocGFydCk6IHBhcnQgaXMgc3RyaW5nID0+ICEhcGFydClcbiAgICAgIC5qb2luKCcgwrcgJyk7XG4gIH0pO1xuXG4gIHByaXZhdGUgX3JlcG9ydERhdGEgPSBpbmplY3QoUmVwb3J0RGF0YSk7XG4gIHByaXZhdGUgX2ZpbHRlclN0YXRlID0gaW5qZWN0KFJlcG9ydEZpbHRlclN0YXRlU2VydmljZSk7XG4gIHByaXZhdGUgX2Rlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG4gIHByaXZhdGUgX2VsZW1lbnRSZWYgPSBpbmplY3Q8RWxlbWVudFJlZjxIVE1MRWxlbWVudD4+KEVsZW1lbnRSZWYpO1xuICBwcml2YXRlIF9pbmplY3RvciA9IGluamVjdChJbmplY3Rvcik7XG4gIHByaXZhdGUgX3Bpbk9mZnNldHNSZWY6IEFmdGVyUmVuZGVyUmVmIHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgLy8gSGlkaW5nIG9yIHNob3dpbmcgYSBjb2x1bW4gbW92ZXMgdGhlIHBpbm5lZCBjb2x1bW5zIGFmdGVyIGl0LlxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICB0aGlzLmhpZGRlbigpO1xuICAgICAgdW50cmFja2VkKCgpID0+IHRoaXMuX3NjaGVkdWxlUGluT2Zmc2V0cygpKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBjb25zdCBjb21wb25lbnQgPSB0aGlzLmNvbXBvbmVudCgpO1xuICAgIGNvbnN0IGNvbmZpZyA9IChjb21wb25lbnQuY29uZmlnID8/IHt9KSBhcyBMaXN0Q29uZmlnO1xuICAgIHRoaXMucGl2b3RlZC5zZXQoISFjb25maWcucGl2b3RCeT8uY29sdW1uKTtcbiAgICB0aGlzLnNob3dUb3RhbHMuc2V0KGNvbmZpZy50b3RhbHMgPT09IHRydWUpO1xuICAgIHRoaXMuY29sdW1ucy5zZXQoKGNvbmZpZy5jb2x1bW5zID8/IFtdKS5tYXAoKGNvbHVtbikgPT4gKHsgLi4uY29sdW1uLCBudW1lcmljOiBoYXNOdW1iZXJGb3JtYXQoY29sdW1uKSB9KSkpO1xuXG4gICAgdGhpcy5faW5pdExpc3RDb25maWcoY29uZmlnKTtcbiAgICB0aGlzLl9vYnNlcnZlUGluT2Zmc2V0cygpO1xuXG4gICAgLy8gQSBjaGFuZ2UgdG8gYW55IGdyb3VwIHRoaXMgbGlzdCdzIGZpbHRlcnMgYmVsb25nIHRvIChmcm9tIHRoZSByZXBvcnQgYmFyXG4gICAgLy8gb3IgdGhlIGNvbXBvbmVudCBoZWFkZXIgc3RyaXApIHJlLXJ1bnMgdGhlIGxpc3QuXG4gICAgLy8gU28gZG9lcyBhIGNoYW5nZSBvZiB0aGUgdGV4dCBpbiBpdHMgc2VhcmNoIGJveCAoaW4gdGhlIGNvbXBvbmVudCBoZWFkZXIpLlxuICAgIG1lcmdlKHRoaXMuX2ZpbHRlclN0YXRlLmNoYW5nZXNGb3IoY29tcG9uZW50KSwgdGhpcy5fZmlsdGVyU3RhdGUubGlzdFNlYXJjaENoYW5nZXMoY29tcG9uZW50LmlkKSlcbiAgICAgIC5waXBlKFxuICAgICAgICB0YXAoKCkgPT4gdGhpcy5saXN0Q29tcG9uZW50KCk/LnJlbG9hZCgpKSxcbiAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfaW5pdExpc3RDb25maWcoY29uZmlnOiBMaXN0Q29uZmlnKTogdm9pZCB7XG4gICAgLy8gVGhlIHZpZXdlcidzIGxhc3Qgc29ydCB3aW5zIG92ZXIgdGhlIGF1dGhvcmVkIG9uZSwgc28gYSBsaXN0IHJlY3JlYXRlZFxuICAgIC8vIGluIHRoZSBzYW1lIHNlc3Npb24gKHBhZ2Ugc3dpdGNoLCByZWxvYWQgYWZ0ZXIgYW4gZWRpdCkga2VlcHMgaXQuXG4gICAgLy8gZnMtbGlzdCBob2xkcyBvbmUgc29ydGluZyBjb2x1bW4sIHNvIGl0IHNob3dzIHRoZSBhdXRob3JlZCBzb3J0J3MgZmlyc3RcbiAgICAvLyB0ZXJtOyB0aGUgcmVxdWVzdCBzZW5kcyBvbmx5IHRoYXQgdGVybSBhbmQgdGhlIHNlcnZlciBhcHBlbmRzIHRoZSByZXN0LlxuICAgIGNvbnN0IHNvcnQ6IFJlcG9ydFNvcnQgfCB1bmRlZmluZWQgPSB0aGlzLl9maWx0ZXJTdGF0ZS5saXN0U29ydCh0aGlzLmNvbXBvbmVudCgpLmlkKVxuICAgICAgPz8gbGlzdFNvcnRUZXJtcyhjb25maWcpWzBdO1xuXG4gICAgdGhpcy5saXN0Q29uZmlnID0ge1xuICAgICAgLy8gSW5zaWRlIGEgcmVwb3J0IGNvbXBvbmVudCB0aGUgbGlzdCBpcyBhIGNsZWFuIGRhdGEgcGFuZSDigJQgbm8gc3RhdHVzXG4gICAgICAvLyBiYXIsIG5vIHJlbG9hZCBidXR0b24gKGZpbHRlciBjaGFuZ2VzIGFscmVhZHkgcmVmZXRjaCkuXG4gICAgICBzdGF0dXM6IGZhbHNlLFxuICAgICAgcmVsb2FkOiBmYWxzZSxcbiAgICAgIC8vIEZzTGlzdCBuZXZlciB0b3VjaGVzIHRoZSBVUkwgb3IgcGVyc2lzdHMgc29ydC9wYWdpbmcgc3RhdGUuIFRoZSBzb3J0XG4gICAgICAvLyByZWFjaGVzIHRoZSBVUkwgdGhyb3VnaCBSZXBvcnRGaWx0ZXJTdGF0ZVNlcnZpY2UgKHNldExpc3RTb3J0KSwgYW5kXG4gICAgICAvLyBwYWdpbmcgc3RheXMgb3V0IG9mIGl0LlxuICAgICAgcXVlcnlQYXJhbTogZmFsc2UsXG4gICAgICBwZXJzaXN0OiBmYWxzZSxcbiAgICAgIHNvcnQ6IHNvcnRcbiAgICAgICAgPyB7IHZhbHVlOiBzb3J0LmNvbHVtbiwgZGlyZWN0aW9uOiBzb3J0LmRpcmVjdGlvbiA/PyAnYXNjJyB9XG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgLy8gTG9hZC1tb3JlOiB0aGUgbGlzdCBrZWVwcyBhIGZpeGVkLCBzY3JvbGxhYmxlIGhlaWdodCBhbmQgYXBwZW5kcyB0aGVcbiAgICAgIC8vIG5leHQgcGFnZSBpbiBwbGFjZSBpbnN0ZWFkIG9mIHN3YXBwaW5nIHBhZ2VzLiBUaGUgYnV0dG9uIGlzIHBpbm5lZCB0b1xuICAgICAgLy8gdGhlIGJvdHRvbSBvZiB0aGUgc2Nyb2xsIHBhbmUgKHNlZSBjb21wb25lbnQgU0NTUykuXG4gICAgICAvL1xuICAgICAgLy8gVXNlcyB0aGUgT2Zmc2V0IHN0cmF0ZWd5IChvZmZzZXQgKyBsaW1pdCkgcmF0aGVyIHRoYW4gTWFueTogaW5cbiAgICAgIC8vIEBmaXJlc3RpdGNoL2xpc3QgdGhlIHBhZ2luYXRpb24gdGVtcGxhdGUgcmVzb2x2ZXMgYGhhc01hbnlTdHJhdGVneWBcbiAgICAgIC8vIEJFRk9SRSBgbG9hZE1vcmVFbmFibGVkYCwgYW5kIE1hbnkgcmVuZGVycyBhIGZvcndhcmQtb25seSBwYWdlIHBhZ2VyIOKAlFxuICAgICAgLy8gc28gTWFueSB3b3VsZCBzdXBwcmVzcyB0aGUgbG9hZC1tb3JlIGJ1dHRvbiBlbnRpcmVseS4gT2Zmc2V0ICsgbG9hZE1vcmVcbiAgICAgIC8vIGlzIHRoZSBjb21iaW5hdGlvbiB0aGF0IGFjdHVhbGx5IHJlbmRlcnMgYW5kIGFwcGVuZHMuIGBfZmV0Y2hgIGFscmVhZHlcbiAgICAgIC8vIGRlcml2ZXMgYHBhZ2VgIGZyb20gYG9mZnNldGAsIHNvIHRoZSBzZXJ2ZXItc2lkZSB3cmFwIGlzIHVuYWZmZWN0ZWQuXG4gICAgICBwYWdpbmc6IHtcbiAgICAgICAgbGltaXQ6IGNvbmZpZy5wYWdlU2l6ZSA/PyAyNSxcbiAgICAgICAgc3RyYXRlZ3k6IFBhZ2luYXRpb25TdHJhdGVneS5PZmZzZXQsXG4gICAgICB9LFxuICAgICAgbG9hZE1vcmU6IHtcbiAgICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgbGFiZWw6ICdMb2FkIG1vcmUnLFxuICAgICAgICBidXR0b25UeXBlOiAnc3Ryb2tlZCcsXG4gICAgICB9LFxuICAgICAgZmV0Y2g6IChxdWVyeTogYW55KSA9PiB0aGlzLl9mZXRjaChxdWVyeSksXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgX2ZldGNoKHF1ZXJ5OiBhbnkpOiBPYnNlcnZhYmxlPHsgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXTsgcGFnaW5nOiBhbnkgfT4ge1xuICAgIC8vIE1hbnkvbG9hZC1tb3JlIHNlbmRzIGBvZmZzZXRgICsgYGxpbWl0YCAobm90IGBwYWdlYCk7IGRlcml2ZSB0aGUgcGFnZSBzb1xuICAgIC8vIHRoZSBzZXJ2ZXItc2lkZSB3cmFwIGtlZXBzIHdvcmtpbmcgdW5jaGFuZ2VkLiBQYWdlIHN0cmF0ZWd5IHN0aWxsIHNlbmRzXG4gICAgLy8gYHBhZ2VgIGRpcmVjdGx5LlxuICAgIGNvbnN0IHBhZ2VTaXplID0gcXVlcnkubGltaXQgPz8gMjU7XG4gICAgY29uc3QgcGFnZSA9IHF1ZXJ5LnBhZ2VcbiAgICAgID8/IChxdWVyeS5vZmZzZXQgIT0gbnVsbCA/IE1hdGguZmxvb3IocXVlcnkub2Zmc2V0IC8gcGFnZVNpemUpICsgMSA6IDEpO1xuXG4gICAgY29uc3Qgc3RhdGU6IENvbXBvbmVudERhdGFTdGF0ZSA9IHtcbiAgICAgIHBhZ2UsXG4gICAgICBwYWdlU2l6ZSxcbiAgICB9O1xuXG4gICAgY29uc3Qgb3JkZXIgPSBTdHJpbmcocXVlcnkub3JkZXIgPz8gJycpO1xuICAgIGlmIChvcmRlcikge1xuICAgICAgY29uc3QgW2NvbHVtbiwgZGlyZWN0aW9uXSA9IG9yZGVyLnNwbGl0KCcsJyk7XG4gICAgICBzdGF0ZS5zb3J0ID0geyBjb2x1bW4sIGRpcmVjdGlvbjogZGlyZWN0aW9uID09PSAnZGVzYycgPyAnZGVzYycgOiAnYXNjJyB9O1xuICAgIH1cblxuICAgIGNvbnN0IGNvbXBvbmVudCA9IHRoaXMuY29tcG9uZW50KCk7XG4gICAgdGhpcy5fZmlsdGVyU3RhdGUuc2V0TGlzdFNvcnQoY29tcG9uZW50LCBzdGF0ZS5zb3J0ID8/IG51bGwpO1xuXG4gICAgY29uc3Qgc2VhcmNoID0gdGhpcy5fZmlsdGVyU3RhdGUubGlzdFNlYXJjaChjb21wb25lbnQuaWQpO1xuICAgIGlmIChzZWFyY2gpIHtcbiAgICAgIHN0YXRlLnNlYXJjaCA9IHNlYXJjaDtcbiAgICB9XG5cbiAgICAvLyBPbmUgc291cmNlIGZvciBmaWx0ZXIgdmFsdWVzLCB0aGUgc2FtZSBvbmUgY2hhcnRzLCBLUElzIGFuZCB0aGUgZXhwb3J0c1xuICAgIC8vIHJlYWQsIHNvIHRoZSBsaXN0IGlzIGZpbHRlcmVkIGV4YWN0bHkgYXMgaXRzIGhlYWRlciBzdHJpcCBzaG93cy5cbiAgICBjb25zdCBmaWx0ZXJzID0gdGhpcy5fZmlsdGVyU3RhdGUucmVzb2x2ZUZvckNvbXBvbmVudChjb21wb25lbnQpO1xuXG4gICAgcmV0dXJuIHRoaXMuX3JlcG9ydERhdGFcbiAgICAgIC5jb21wb25lbnREYXRhKHRoaXMucmVwb3J0SWQoKSwgY29tcG9uZW50LmlkLCBmaWx0ZXJzLCBzdGF0ZSlcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKGRhdGE6IENvbXBvbmVudERhdGEpID0+IHtcbiAgICAgICAgICAvLyBBIGNyb3NzLXRhYidzIGhlYWRlcnMgY29tZSBiYWNrIHdpdGggdGhlIHJvd3M6IHRoZSByb3cta2V5IGNvbHVtblxuICAgICAgICAgIC8vIGZpcnN0LCB0aGVuIG9uZSBwZXIgcGl2b3QgdmFsdWUuIFJlLXJlYWQgdGhlbSBvbiBldmVyeSBmZXRjaCwgc2luY2VcbiAgICAgICAgICAvLyBhIGZpbHRlciBjaGFuZ2UgY2FuIGFkZCBvciByZW1vdmUgYSBjb2x1bW4uXG4gICAgICAgICAgaWYgKHRoaXMucGl2b3RlZCgpKSB7XG4gICAgICAgICAgICB0aGlzLmNvbHVtbnMuc2V0KHRoaXMuX3Bpdm90Q29sdW1ucyhkYXRhKSk7XG4gICAgICAgICAgICB0aGlzLnRydW5jYXRlZC5zZXQoISFkYXRhLnRydW5jYXRlZCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gT25seSBwYWdlIDEgY2FycmllcyB0aGUgbm90ZXMgYW5kIHRoZSB0b3RhbHM7IGEgbG9hZC1tb3JlIHBhZ2VcbiAgICAgICAgICAvLyBsZWF2ZXMgdGhlbSBhcyB0aGV5IGFyZS5cbiAgICAgICAgICBpZiAoc3RhdGUucGFnZSA9PT0gMSkge1xuICAgICAgICAgICAgdGhpcy5zZWFyY2hOb3RlLnNldChkYXRhLnNlYXJjaE5vdGUgPz8gbnVsbCk7XG4gICAgICAgICAgICB0aGlzLnRvdGFscy5zZXQoZGF0YS50b3RhbHMgPz8gbnVsbCk7XG4gICAgICAgICAgICB0aGlzLnRvdGFsc05vdGUuc2V0KGRhdGEudG90YWxzTm90ZSA/PyBudWxsKTtcbiAgICAgICAgICAgIHRoaXMubm90ZURhdGEuc2V0KHRoaXMuX25vdGVEYXRhKGRhdGEpKTtcbiAgICAgICAgICAgIHRoaXMuX2FsaWduT3V0cHV0Q29sdW1ucyhkYXRhKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBUaGUgc2VydmVyJ3MgcGFnZSBzaXplIHdoZW4gaXQgc2VuZHMgb25lIChpdCBjbGFtcHMgdGhlIHJlcXVlc3QpLFxuICAgICAgICAgIC8vIHRoZSBzaXplIHRoZSBwYWdpbmcgYmVsb3cgaGFuZHMgZnMtbGlzdCB0b28uXG4gICAgICAgICAgY29uc3Qgc2l6ZSA9IGRhdGEucGFnaW5nPy5wYWdlU2l6ZSA/PyBzdGF0ZS5wYWdlU2l6ZTtcbiAgICAgICAgICBjb25zdCBzaG93biA9IChzdGF0ZS5wYWdlIC0gMSkgKiBzaXplICsgKGRhdGEucm93cz8ubGVuZ3RoID8/IDApO1xuICAgICAgICAgIHRoaXMucm93Q291bnQuc2V0KHsgc2hvd24sIHRvdGFsOiBkYXRhLnBhZ2luZz8udG90YWwgPz8gc2hvd24gfSk7XG5cbiAgICAgICAgICAvLyBOZXcgcm93cyBjYW4gd2lkZW4gYSBwaW5uZWQgY29sdW1uLCB3aGljaCBtb3ZlcyB0aGUgb25lcyBhZnRlciBpdC5cbiAgICAgICAgICB0aGlzLl9zY2hlZHVsZVBpbk9mZnNldHMoKTtcblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkYXRhOiBkYXRhLnJvd3MgPz8gW10sXG4gICAgICAgICAgICBwYWdpbmc6IHtcbiAgICAgICAgICAgICAgbGltaXQ6IGRhdGEucGFnaW5nPy5wYWdlU2l6ZSA/PyBzdGF0ZS5wYWdlU2l6ZSxcbiAgICAgICAgICAgICAgcmVjb3JkczogZGF0YS5wYWdpbmc/LnRvdGFsID8/IChkYXRhLnJvd3M/Lmxlbmd0aCA/PyAwKSxcbiAgICAgICAgICAgICAgcGFnZTogZGF0YS5wYWdpbmc/LnBhZ2UgPz8gc3RhdGUucGFnZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfTtcbiAgICAgICAgfSksXG4gICAgICApO1xuICB9XG5cbiAgLy8gQSBjcm9zcy10YWIncyBjb2x1bW5zLCBidWlsdCBmcm9tIHRoZSB3aXJlIGJ5IHBpdm90Q29sdW1uU3BlY3MoKTogdGhlIHNhbWVcbiAgLy8gaGVhZGluZ3MgYW5kIGNlbGwgZm9ybWF0IHRoZSBQREYgYW5kIFBvd2VyUG9pbnQgZXhwb3J0cyB1c2UuIEEgY2VsbCBjb2x1bW5cbiAgLy8gd2hvc2UgbWVhc3VyZSBpcyBhIHJhbmsgb3IgYSBzaGFyZSAoY2VsbE1lYXN1cmVzIG5hbWVzIGl0KSBob2xkcyBudW1iZXJzXG4gIC8vIHdoZXRoZXIgb3Igbm90IHRoZSBncmlkIG5hbWVzIGEgY2VsbCBmb3JtYXQuXG4gIHByaXZhdGUgX3Bpdm90Q29sdW1ucyhkYXRhOiBDb21wb25lbnREYXRhKTogKExpc3RDb2x1bW4gJiB7IG51bWVyaWM6IGJvb2xlYW4gfSlbXSB7XG4gICAgY29uc3QgY29uZmlnID0gKHRoaXMuY29tcG9uZW50KCkuY29uZmlnID8/IHt9KSBhcyBMaXN0Q29uZmlnO1xuICAgIGNvbnN0IG91dHB1dENlbGxzID0gT2JqZWN0LmtleXMobGlzdE91dHB1dENvbHVtbnMoXG4gICAgICAoZGF0YS5jb2x1bW5zID8/IFtdKS5zbGljZSgxKS5tYXAoKGNvbHVtbikgPT4gKHsgY29sdW1uIH0pKSxcbiAgICAgIGRhdGEsXG4gICAgICBbXSxcbiAgICApKTtcblxuICAgIHJldHVybiBwaXZvdENvbHVtblNwZWNzKGNvbmZpZywgZGF0YSwgdGhpcy5mb3JtYXRDb250ZXh0KCkubG9jYWxlKVxuICAgICAgLm1hcCgoY29sdW1uKSA9PiAoeyAuLi5jb2x1bW4sIG51bWVyaWM6IGNvbHVtbi5udW1lcmljIHx8IG91dHB1dENlbGxzLmluY2x1ZGVzKGNvbHVtbi5jb2x1bW4pIH0pKTtcbiAgfVxuXG4gIHByaXZhdGUgX25vdGVEYXRhKGRhdGE6IENvbXBvbmVudERhdGEpOiBDb21wb25lbnROb3RlRGF0YSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbXBhcmlzb246IGRhdGEuY29tcGFyaXNvbixcbiAgICAgIHRpbWVmcmFtZTogZGF0YS50aW1lZnJhbWUsXG4gICAgICBvdXRwdXRzOiBkYXRhLm91dHB1dHMsXG4gICAgICBjZWxsTWVhc3VyZXM6IGRhdGEuY2VsbE1lYXN1cmVzLFxuICAgICAgd2luZG93czogZGF0YS53aW5kb3dzLFxuICAgICAgZ3JhbnVsYXJpdHk6IGRhdGEuZ3JhbnVsYXJpdHksXG4gICAgfTtcbiAgfVxuXG4gIC8vIEEgcGxhaW4gbGlzdCdzIGNvbHVtbnMgYXJlIGJ1aWx0IGJlZm9yZSBhbnkgZGF0YSBhcnJpdmVzLCBzbyBhbiBvdXRwdXRcbiAgLy8gY29sdW1uIHRoYXQgbmFtZXMgbm8gZm9ybWF0IG9mIGl0cyBvd24gKGEgcmFuaywgYSBzaGFyZSwgYSBwcmlvciB0aGF0IHRha2VzXG4gIC8vIGl0cyBtZWFzdXJlJ3MgZm9ybWF0KSBsZWFybnMgaXQgaG9sZHMgbnVtYmVycyBmcm9tIHBhZ2UgMS4gZnMtbGlzdCByZWFkcyBhXG4gIC8vIGNvbHVtbidzIGFsaWdubWVudCBvbmx5IHdoZW4gaXQgYnVpbGRzIHRoZSBjb2x1bW4sIHNvIGEgY29sdW1uIHdob3NlXG4gIC8vIGFsaWdubWVudCBjaGFuZ2VzIGlzIHJlYnVpbHQgKHRoZSB0ZW1wbGF0ZSB0cmFja3MgY29sdW1ucyBieSBib3RoKS5cbiAgcHJpdmF0ZSBfYWxpZ25PdXRwdXRDb2x1bW5zKGRhdGE6IENvbXBvbmVudERhdGEpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5waXZvdGVkKCkgfHwgIWRhdGEub3V0cHV0cykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbHVtbnMgPSB0aGlzLmNvbHVtbnMoKTtcbiAgICBjb25zdCBhbGlnbmVkID0gY29sdW1ucy5tYXAoKGNvbHVtbikgPT4gKHtcbiAgICAgIC4uLmNvbHVtbixcbiAgICAgIG51bWVyaWM6IGhhc051bWJlckZvcm1hdChjb2x1bW4pIHx8ICEhZGF0YS5vdXRwdXRzW2NvbHVtbi5jb2x1bW5dLFxuICAgIH0pKTtcblxuICAgIGlmIChhbGlnbmVkLnNvbWUoKGNvbHVtbiwgaW5kZXgpID0+IGNvbHVtbi5udW1lcmljICE9PSBjb2x1bW5zW2luZGV4XS5udW1lcmljKSkge1xuICAgICAgdGhpcy5jb2x1bW5zLnNldChhbGlnbmVkKTtcbiAgICB9XG4gIH1cblxuICAvLyBBIHRpbGUgcmVzaXplIHJlZmxvd3MgdGhlIHRhYmxlJ3MgYXV0byBsYXlvdXQsIHNvIHRoZSBwaW5uZWQgY29sdW1ucydcbiAgLy8gd2lkdGhzLCBhbmQgd2l0aCB0aGVtIHRoZWlyIG9mZnNldHMsIGNoYW5nZS5cbiAgcHJpdmF0ZSBfb2JzZXJ2ZVBpbk9mZnNldHMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucGlubmVkKCkgPCAyIHx8IHR5cGVvZiBSZXNpemVPYnNlcnZlciA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoKSA9PiB0aGlzLl9zY2hlZHVsZVBpbk9mZnNldHMoKSk7XG4gICAgb2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpO1xuICAgIHRoaXMuX2Rlc3Ryb3lSZWYub25EZXN0cm95KCgpID0+IG9ic2VydmVyLmRpc2Nvbm5lY3QoKSk7XG4gIH1cblxuICAvLyBNZWFzdXJlcyB0aGUgcGlubmVkIG9mZnNldHMgb25jZSB0aGUgbmV4dCByZW5kZXIgaGFzIGxhaWQgdGhlIHRhYmxlIG91dC5cbiAgLy8gT25lIHBlbmRpbmcgbWVhc3VyZW1lbnQgY292ZXJzIGV2ZXJ5IHJlcXVlc3QgbWFkZSBiZWZvcmUgaXQgcnVucy4gT25seVxuICAvLyBhZnRlck5leHRSZW5kZXIgZXhpc3RzIGluIGV2ZXJ5IEFuZ3VsYXIgdmVyc2lvbiB0aGlzIGxpYnJhcnkgcnVucyBvbi5cbiAgcHJpdmF0ZSBfc2NoZWR1bGVQaW5PZmZzZXRzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnBpbm5lZCgpIDwgMiB8fCB0aGlzLl9waW5PZmZzZXRzUmVmKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fcGluT2Zmc2V0c1JlZiA9IGFmdGVyTmV4dFJlbmRlcigoKSA9PiB7XG4gICAgICB0aGlzLl9waW5PZmZzZXRzUmVmID0gbnVsbDtcbiAgICAgIHRoaXMuX3VwZGF0ZVBpbk9mZnNldHMoKTtcbiAgICB9LCB7IGluamVjdG9yOiB0aGlzLl9pbmplY3RvciB9KTtcbiAgfVxuXG4gIC8vIEVhY2ggcGlubmVkIGNvbHVtbiBzdGlja3MgYXQgdGhlIHN1bW1lZCB3aWR0aCBvZiB0aGUgdmlzaWJsZSBwaW5uZWRcbiAgLy8gY29sdW1ucyBiZWZvcmUgaXQuIEEgaGlkZGVuIGNvbHVtbiByZW5kZXJzIG5vIGhlYWRlciwgc28gdGhlIG5leHQgcGlubmVkXG4gIC8vIG9uZSB0YWtlcyBpdHMgcGxhY2UuIEEgdmFyaWFibGUgaXMgd3JpdHRlbiBvbmx5IHdoZW4gaXRzIHZhbHVlIGNoYW5nZWQsXG4gIC8vIHdoaWNoIGtlZXBzIGEgcmVzaXplIGZyb20gcmVzdHlsaW5nIHRoZSB0YWJsZSBmb3Igbm90aGluZy5cbiAgcHJpdmF0ZSBfdXBkYXRlUGluT2Zmc2V0cygpOiB2b2lkIHtcbiAgICBjb25zdCBob3N0ID0gdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgIGxldCBsZWZ0ID0gMDtcblxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLnBpbm5lZCgpOyBpbmRleCsrKSB7XG4gICAgICBjb25zdCBoZWFkZXIgPSBob3N0LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KGB0aGVhZCB0aC5yZXBvcnQtcGluLSR7aW5kZXh9YCk7XG5cbiAgICAgIGlmICghaGVhZGVyKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBuYW1lID0gYC0tcmVwb3J0LXBpbi1sZWZ0LSR7aW5kZXh9YDtcbiAgICAgIGNvbnN0IHZhbHVlID0gYCR7TWF0aC5yb3VuZChsZWZ0ICogMTAwKSAvIDEwMH1weGA7XG5cbiAgICAgIGlmIChob3N0LnN0eWxlLmdldFByb3BlcnR5VmFsdWUobmFtZSkgIT09IHZhbHVlKSB7XG4gICAgICAgIGhvc3Quc3R5bGUuc2V0UHJvcGVydHkobmFtZSwgdmFsdWUpO1xuICAgICAgfVxuXG4gICAgICBsZWZ0ICs9IGhlYWRlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcbiAgICB9XG4gIH1cbn1cbiIsIkBpZiAodHJ1bmNhdGVkKCkpIHtcbiAgPGRpdiBjbGFzcz1cInBpdm90LXRydW5jYXRlZFwiPlxuICAgIFRoaXMgZ3JpZCB3YXMgYnVpbHQgZnJvbSBhIHBhcnRpYWwgcmVzdWx0LCBzbyBzb21lIGNvbHVtbnMgb3IgdmFsdWVzIG1heSBiZSBtaXNzaW5nLiBOYXJyb3cgaXQgd2l0aCBhIGZpbHRlci5cbiAgPC9kaXY+XG59XG5cbjwhLS0gVGhlIHdpbmRvd3MgYSBjb21wYXJpc29uIGNvbXBhcmVzLCBhbmQgd2h5IGl0IHJlYWRzIGFzIGl0IGRvZXMuIEFcbiAgICAgd2luZG93ZWQgY29sdW1uJ3Mgb3duIG5vdGVzIGFyZSBpbiBpdHMgaGVhZGVyJ3MgdG9vbHRpcC4gLS0+XG48YXBwLXJlcG9ydC1jb21wb25lbnQtbm90ZVxuICBbZGF0YV09XCJub3RlRGF0YSgpXCJcbiAgW3dpbmRvd05vdGVzXT1cImZhbHNlXCI+XG48L2FwcC1yZXBvcnQtY29tcG9uZW50LW5vdGU+XG5cbjwhLS0gZnMtbGlzdCByZWFkcyBhIGNvbHVtbidzIGZvb3RlciB0ZW1wbGF0ZSBvbmNlLCBhcyBhIGRpcmVjdCBjaGlsZCBvZlxuICAgICBmcy1saXN0LWNvbHVtbiwgc28gYSBsaXN0IHdpdGggdG90YWxzIHJlbmRlcnMgaXRzIGNvbHVtbnMgaW4gYSBicmFuY2ggb2ZcbiAgICAgdGhlaXIgb3duIHJhdGhlciB0aGFuIHdyYXBwaW5nIHRoZSBmb290ZXIgaW4gYW4gQGlmLiBJdHMgaGVhZGVyIHRlbXBsYXRlIHRvbyxcbiAgICAgd2hpY2ggZXZlcnkgY29sdW1uIGNhcnJpZXM6IGFuIG91dHB1dCBjb2x1bW4ncyB0b29sdGlwIHNheXMgd2hhdCBpdCBob2xkcy5cbiAgICAgQ29sdW1ucyBhcmUgdHJhY2tlZCBieSBhbGlnbm1lbnQgYXMgd2VsbCBhcyBuYW1lLCBzaW5jZSBmcy1saXN0IHJlYWRzIGFcbiAgICAgY29sdW1uJ3MgYWxpZ25tZW50IG9ubHkgd2hlbiBpdCBidWlsZHMgdGhlIGNvbHVtbi4gLS0+XG48ZnMtbGlzdFxuICBbY29uZmlnXT1cImxpc3RDb25maWdcIlxuICBbY2xhc3MucmVwb3J0LXRvdGFscy1lbXB0eV09XCIhdG90YWxzKClcIj5cbiAgQGlmIChzaG93VG90YWxzKCkpIHtcbiAgICBAZm9yIChjb2x1bW4gb2YgY29sdW1ucygpOyB0cmFjayBjb2x1bW4uY29sdW1uICsgJzonICsgY29sdW1uLm51bWVyaWMpIHtcbiAgICAgIDxmcy1saXN0LWNvbHVtblxuICAgICAgICBbbmFtZV09XCJjb2x1bW4uY29sdW1uXCJcbiAgICAgICAgW3RpdGxlXT1cImNvbHVtbi5sYWJlbCB8fCBjb2x1bW4uY29sdW1uXCJcbiAgICAgICAgW3Nob3ddPVwiIWhpZGRlbigpLmhhcyhjb2x1bW4uY29sdW1uKVwiXG4gICAgICAgIFtzb3J0YWJsZV09XCIhcGl2b3RlZCgpIHx8ICRmaXJzdFwiXG4gICAgICAgIFthbGlnbl09XCJjb2x1bW4ubnVtZXJpYyA/ICdyaWdodCcgOiAnbGVmdCdcIlxuICAgICAgICBbY2xhc3NdPVwiY29sdW1uQ2xhc3Nlcyhjb2x1bW4sICRpbmRleCwgcGlubmVkKCkpXCI+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSBmcy1saXN0LWhlYWRlcj5cbiAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJoZWFkZXJUcGxcIlxuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgY29sdW1uOiBjb2x1bW4gfVwiPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICBmcy1saXN0LWNlbGxcbiAgICAgICAgICBsZXQtcm93PVwicm93XCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiY2VsbFRwbFwiXG4gICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IHJvd1tjb2x1bW4uY29sdW1uXSwgcm93OiByb3csIGNvbHVtbjogY29sdW1uIH1cIj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPG5nLXRlbXBsYXRlIGZzLWxpc3QtZm9vdGVyPlxuICAgICAgICAgIEBpZiAodG90YWxzKCk/Lltjb2x1bW4uY29sdW1uXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNlbGxUcGxcIlxuICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IHRvdGFscygpPy5bY29sdW1uLmNvbHVtbl0sIHJvdzogdG90YWxzKCksIGNvbHVtbjogY29sdW1uIH1cIj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIH0gQGVsc2UgaWYgKGNvbHVtbi5jb2x1bW4gPT09IHRvdGFsc0xhYmVsQ29sdW1uKCkpIHtcbiAgICAgICAgICAgIHt7IHRvdGFsTGFiZWwgfX1cbiAgICAgICAgICB9XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8L2ZzLWxpc3QtY29sdW1uPlxuICAgIH1cbiAgfSBAZWxzZSB7XG4gICAgQGZvciAoY29sdW1uIG9mIGNvbHVtbnMoKTsgdHJhY2sgY29sdW1uLmNvbHVtbiArICc6JyArIGNvbHVtbi5udW1lcmljKSB7XG4gICAgICA8ZnMtbGlzdC1jb2x1bW5cbiAgICAgICAgW25hbWVdPVwiY29sdW1uLmNvbHVtblwiXG4gICAgICAgIFt0aXRsZV09XCJjb2x1bW4ubGFiZWwgfHwgY29sdW1uLmNvbHVtblwiXG4gICAgICAgIFtzaG93XT1cIiFoaWRkZW4oKS5oYXMoY29sdW1uLmNvbHVtbilcIlxuICAgICAgICBbc29ydGFibGVdPVwiIXBpdm90ZWQoKSB8fCAkZmlyc3RcIlxuICAgICAgICBbYWxpZ25dPVwiY29sdW1uLm51bWVyaWMgPyAncmlnaHQnIDogJ2xlZnQnXCJcbiAgICAgICAgW2NsYXNzXT1cImNvbHVtbkNsYXNzZXMoY29sdW1uLCAkaW5kZXgsIHBpbm5lZCgpKVwiPlxuICAgICAgICA8bmctdGVtcGxhdGUgZnMtbGlzdC1oZWFkZXI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiaGVhZGVyVHBsXCJcbiAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IGNvbHVtbjogY29sdW1uIH1cIj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgZnMtbGlzdC1jZWxsXG4gICAgICAgICAgbGV0LXJvdz1cInJvd1wiPlxuICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNlbGxUcGxcIlxuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiByb3dbY29sdW1uLmNvbHVtbl0sIHJvdzogcm93LCBjb2x1bW46IGNvbHVtbiB9XCI+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8L2ZzLWxpc3QtY29sdW1uPlxuICAgIH1cbiAgfVxuPC9mcy1saXN0PlxuXG5AaWYgKGNhcHRpb24oKSkge1xuICA8ZGl2IGNsYXNzPVwibGlzdC1jYXB0aW9uIHNtYWxsXCI+XG4gICAge3sgY2FwdGlvbigpIH19XG4gIDwvZGl2PlxufVxuXG48IS0tIEEgY29sdW1uJ3MgaGVhZGluZywgd2l0aCB3aGF0IGFuIG91dHB1dCBjb2x1bW4gaG9sZHMgYXMgaXRzIHRvb2x0aXAgKGFuXG4gICAgIGVtcHR5IG9uZSBuZXZlciBzaG93cykuIC0tPlxuPG5nLXRlbXBsYXRlXG4gICNoZWFkZXJUcGxcbiAgbGV0LWNvbHVtbj1cImNvbHVtblwiPlxuICA8c3BhbiBbbWF0VG9vbHRpcF09XCJjb2x1bW5Ob3RlcygpW2NvbHVtbi5jb2x1bW5dID8/ICcnXCI+e3sgY29sdW1uLmxhYmVsIHx8IGNvbHVtbi5jb2x1bW4gfX08L3NwYW4+XG48L25nLXRlbXBsYXRlPlxuXG48IS0tIE9uZSBjZWxsLCBpbiB0aGUgYm9keSBhbmQgdGhlIHRvdGFscyByb3cgYWxpa2U6IGFuIG91dHB1dCBjb2x1bW4gYnkgd2hhdFxuICAgICBpdCBob2xkcyAoaXRzIHJvdyBnaXZlcyBhIGNoYW5nZSBpdHMgcHJpb3IpLCBhIGRhdGUgY29sdW1uIGFzIGEgZGF5IGluIHRoZVxuICAgICByZXBvcnQncyB6b25lIGFuZCBsb2NhbGUsIGFueSBvdGhlciB0aHJvdWdoIGl0cyBudW1iZXIgZm9ybWF0LiAtLT5cbjxuZy10ZW1wbGF0ZVxuICAjY2VsbFRwbFxuICBsZXQtdmFsdWVcbiAgbGV0LXJvdz1cInJvd1wiXG4gIGxldC1jb2x1bW49XCJjb2x1bW5cIj5cbiAgQGlmIChvdXRwdXRDb2x1bW5zKClbY29sdW1uLmNvbHVtbl07IGFzIG91dHB1dCkge1xuICAgIEBpZiAocm93IHwgZnNSZXBvcnRPdXRwdXQ6IGNvbHVtbiA6IG91dHB1dCA6IGZvcm1hdENvbnRleHQoKTsgYXMgY2VsbCkge1xuICAgICAgPHNwYW4gW2F0dHIudGl0bGVdPVwiY2VsbC50aXRsZVwiPnt7IGNlbGwudGV4dCB9fTwvc3Bhbj5cbiAgICB9XG4gIH0gQGVsc2UgaWYgKGNvbHVtbi5mb3JtYXQgPT09IFJlcG9ydExpc3RDb2x1bW5Gb3JtYXQuRGF0ZSkge1xuICAgIHt7IHZhbHVlIHwgZnNSZXBvcnREYXRlOiB0aW1lem9uZSgpIDogZm9ybWF0Q29udGV4dCgpLmxvY2FsZSB9fVxuICB9IEBlbHNlIHtcbiAgICB7eyB2YWx1ZSB8IGZzUmVwb3J0TnVtYmVyOiBjb2x1bW4gOiBmb3JtYXRDb250ZXh0KCkgfX1cbiAgfVxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
351
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LWxpc3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2NvbXBvbmVudHMvY29tcG9uZW50LWxpc3QvY29tcG9uZW50LWxpc3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2NvbXBvbmVudHMvY29tcG9uZW50LWxpc3QvY29tcG9uZW50LWxpc3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbkQsT0FBTyxFQUVMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsVUFBVSxFQUNWLFVBQVUsRUFDVixRQUFRLEVBRVIsZUFBZSxFQUNmLFFBQVEsRUFDUixNQUFNLEVBQ04sTUFBTSxFQUNOLEtBQUssRUFDTCxNQUFNLEVBQ04sU0FBUyxFQUNULFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFdkQsT0FBTyxFQUFFLGVBQWUsRUFBZ0IsWUFBWSxFQUFFLGtCQUFrQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFbkcsT0FBTyxFQUFjLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRW5ELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUNwRixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsZUFBZSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBU2xFLE9BQU8sRUFDTCxnQkFBZ0IsRUFFaEIsYUFBYSxFQUNiLGlCQUFpQixFQUNqQixp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Q0FBQztnQkFDWixTQUFTO1lBQ1gsQ0FBQztZQUVELE1BQU0sSUFBSSxHQUFHLHFCQUFxQixLQUFLLEVBQUUsQ0FBQztZQUMxQyxNQUFNLEtBQUssR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDO1lBRWxELElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxLQUFLLEVBQUUsQ0FBQztnQkFDaEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3RDLENBQUM7WUFFRCxJQUFJLElBQUksTUFBTSxDQUFDLHFCQUFxQixFQUFFLENBQUMsS0FBSyxDQUFDO1FBQy9DLENBQUM7SUFDSCxDQUFDO3dHQTdYVSxzQkFBc0I7NEZBQXRCLHNCQUFzQixtWkFLUyxlQUFlLGdFQ3RGM0QsKzVJQXFIQSxzZ0VEN0NJLHNCQUFzQix1SUFDdEIsWUFBWSwreUJBQ1osVUFBVSxpUkFDVixnQkFBZ0IsK0lBQ2hCLGNBQWMsZ0RBQ2QsZ0JBQWdCLGtEQUNoQixnQkFBZ0I7OzRGQUdQLHNCQUFzQjtrQkFoQmxDLFNBQVM7K0JBQ0UsMkJBQTJCLG1CQUdwQix1QkFBdUIsQ0FBQyxNQUFNLGNBQ25DLElBQUksV0FDUDt3QkFDUCxzQkFBc0I7d0JBQ3RCLFlBQVk7d0JBQ1osVUFBVTt3QkFDVixnQkFBZ0I7d0JBQ2hCLGNBQWM7d0JBQ2QsZ0JBQWdCO3dCQUNoQixnQkFBZ0I7cUJBQ2pCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdUZW1wbGF0ZU91dGxldCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBBZnRlclJlbmRlclJlZixcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRGVzdHJveVJlZixcbiAgRWxlbWVudFJlZixcbiAgSW5qZWN0b3IsXG4gIE9uSW5pdCxcbiAgYWZ0ZXJOZXh0UmVuZGVyLFxuICBjb21wdXRlZCxcbiAgZWZmZWN0LFxuICBpbmplY3QsXG4gIGlucHV0LFxuICBzaWduYWwsXG4gIHVudHJhY2tlZCxcbiAgdmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IE1hdFRvb2x0aXAgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90b29sdGlwJztcblxuaW1wb3J0IHsgRnNMaXN0Q29tcG9uZW50LCBGc0xpc3RDb25maWcsIEZzTGlzdE1vZHVsZSwgUGFnaW5hdGlvblN0cmF0ZWd5IH0gZnJvbSAnQGZpcmVzdGl0Y2gvbGlzdCc7XG5cbmltcG9ydCB7IE9ic2VydmFibGUsIG1hcCwgbWVyZ2UsIHRhcCB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBSZXBvcnREYXRhIH0gZnJvbSAnLi4vLi4vZGF0YS9yZXBvcnQuZGF0YSc7XG5pbXBvcnQgeyBSZXBvcnRMaXN0Q29sdW1uRm9ybWF0IH0gZnJvbSAnLi4vLi4vZW51bXMvcmVwb3J0LWxpc3QtY29sdW1uLWZvcm1hdC5lbnVtJztcbmltcG9ydCB7IGZvcm1hdFBsYWluTnVtYmVyLCBoYXNOdW1iZXJGb3JtYXQgfSBmcm9tICcuLi8uLi9mb3JtYXQnO1xuaW1wb3J0IHtcbiAgQ29tcG9uZW50RGF0YSxcbiAgQ29tcG9uZW50RGF0YVN0YXRlLFxuICBMaXN0Q29sdW1uLFxuICBMaXN0Q29uZmlnLFxuICBSZXBvcnRDb21wb25lbnQsXG4gIFJlcG9ydFNvcnQsXG59IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvcmVwb3J0LmludGVyZmFjZSc7XG5pbXBvcnQge1xuICBMSVNUX1RPVEFMX0xBQkVMLFxuICBMaXN0T3V0cHV0Q29sdW1uLFxuICBjb2x1bW5DbGFzc2VzLFxuICBsaXN0T3V0cHV0Q29sdW1ucyxcbiAgbGlzdFBpbm5lZENvbHVtbnMsXG4gIGxpc3RTb3J0VGVybXMsXG4gIGxpc3RUb3RhbHNMYWJlbENvbHVtbixcbn0gZnJvbSAnLi4vLi4vbGlzdC1jb25maWcnO1xuaW1wb3J0IHsgcGl2b3RDb2x1bW5TcGVjcyB9IGZyb20gJy4uLy4uL29wdGlvbi1idWlsZGVyJztcbmltcG9ydCB7IENvbXBvbmVudE5vdGVEYXRhLCBvdXRwdXRDb2x1bW5Ob3RlIH0gZnJvbSAnLi4vLi4vb3V0cHV0LW5vdGVzJztcbmltcG9ydCB7IFJlcG9ydERhdGVQaXBlIH0gZnJvbSAnLi4vLi4vcGlwZXMvcmVwb3J0LWRhdGUucGlwZSc7XG5pbXBvcnQgeyBSZXBvcnROdW1iZXJQaXBlIH0gZnJvbSAnLi4vLi4vcGlwZXMvcmVwb3J0LW51bWJlci5waXBlJztcbmltcG9ydCB7IFJlcG9ydE91dHB1dFBpcGUgfSBmcm9tICcuLi8uLi9waXBlcy9yZXBvcnQtb3V0cHV0LnBpcGUnO1xuaW1wb3J0IHsgUmVwb3J0RmlsdGVyU3RhdGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcmVwb3J0LWZpbHRlci1zdGF0ZS5zZXJ2aWNlJztcbmltcG9ydCB7IENvbXBvbmVudE5vdGVDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnQtbm90ZS9jb21wb25lbnQtbm90ZS5jb21wb25lbnQnO1xuXG5cbi8vIEEgbGlzdCBjb21wb25lbnQ6IGFuIEZzTGlzdCByZW5kZXJlZCBmcm9tIHRoZSBjb21wb25lbnQncyBjb25maWcuIEl0IGhhcyBub1xuLy8gZmlsdGVyIGJhciBvZiBpdHMgb3duOiBpdHMgZmlsdGVycyBhcmUgZ3JvdXAta2V5ZWQgbGlrZSBldmVyeSBvdGhlclxuLy8gY29tcG9uZW50J3MsIHNvIGNvbXBvbmVudC1sZXZlbCBncm91cHMgcmVuZGVyIGluIHRoZSBjb21wb25lbnQgaGVhZGVyIHN0cmlwXG4vLyAoUmVwb3J0Q29tcG9uZW50Q29tcG9uZW50KSBhbmQgcmVwb3J0LWxldmVsIGdyb3VwcyBpbiB0aGUgcmVwb3J0IGJhciwgYW5kXG4vLyBldmVyeSByZXF1ZXN0IHRha2VzIGl0cyB2YWx1ZXMgZnJvbSB0aGUgc2hhcmVkIGZpbHRlci1zdGF0ZSBzZXJ2aWNlLlxuLy8gUGFnaW5nIGFuZCBzb3J0aW5nIGFyZSBwdXNoZWQgaW50byB0aGUgU1FMIHdyYXAgc2VydmVyLXNpZGUuXG4vL1xuLy8gQSBsaXN0IHdob3NlIHF1ZXJ5IGNvbXBhcmVzLCB3aW5kb3dzLCByYW5rcyBvciBzaGFyZXMgc2F5cyBzbzogdGhlIHNoYXJlZFxuLy8gbm90ZSBhYm92ZSBpdCBuYW1lcyB0aGUgd2luZG93cyBhIGNvbXBhcmlzb24gY29tcGFyZXMsIGVhY2ggc3VjaCBjb2x1bW4nc1xuLy8gaGVhZGVyIHRvb2x0aXAgc2F5cyB3aGF0IGl0IGhvbGRzLCBhbmQgaXRzIGNlbGxzICh0b3RhbHMgaW5jbHVkZWQsIHdoaWNoIHRoZVxuLy8gc2VydmVyIGNvbXB1dGVzKSBhcmUgd3JpdHRlbiBieSB3aGF0IHRoZXkgaG9sZC5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1yZXBvcnQtY29tcG9uZW50LWxpc3QnLFxuICB0ZW1wbGF0ZVVybDogJy4vY29tcG9uZW50LWxpc3QuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9jb21wb25lbnQtbGlzdC5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENvbXBvbmVudE5vdGVDb21wb25lbnQsXG4gICAgRnNMaXN0TW9kdWxlLFxuICAgIE1hdFRvb2x0aXAsXG4gICAgTmdUZW1wbGF0ZU91dGxldCxcbiAgICBSZXBvcnREYXRlUGlwZSxcbiAgICBSZXBvcnROdW1iZXJQaXBlLFxuICAgIFJlcG9ydE91dHB1dFBpcGUsXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIENvbXBvbmVudExpc3RDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gIHB1YmxpYyByZWFkb25seSByZXBvcnRJZCA9IGlucHV0LnJlcXVpcmVkPG51bWJlcj4oKTtcbiAgcHVibGljIHJlYWRvbmx5IGNvbXBvbmVudCA9IGlucHV0LnJlcXVpcmVkPFJlcG9ydENvbXBvbmVudD4oKTtcblxuICBwdWJsaWMgcmVhZG9ubHkgbGlzdENvbXBvbmVudCA9IHZpZXdDaGlsZChGc0xpc3RDb21wb25lbnQpO1xuXG4gIHB1YmxpYyBsaXN0Q29uZmlnOiBGc0xpc3RDb25maWc7XG5cbiAgLy8gQSBwbGFpbiBsaXN0J3MgY29sdW1ucyBhcmUgYXV0aG9yZWQgYW5kIGZpeGVkIGF0IGluaXQuIEEgY3Jvc3MtdGFiJ3MgYXJlXG4gIC8vIHRoZSBwaXZvdCBkaW1lbnNpb24ncyBWQUxVRVMsIHNvIHRoZXkgYXJyaXZlIHdpdGggdGhlIHJvd3MgYW5kIGNoYW5nZVxuICAvLyB3aGVuZXZlciB0aGUgZmlsdGVycyBkbyDigJQgd2hpY2ggaXMgd2h5IHRoaXMgaXMgYSBzaWduYWwgcmF0aGVyIHRoYW4gdGhlXG4gIC8vIG9uZS1zaG90IHJlYWQgaXQgdXNlZCB0byBiZS4gYG51bWVyaWNgIG1hcmtzIGEgY29sdW1uIHdob3NlIGNlbGxzIGFyZVxuICAvLyBmb3JtYXR0ZWQgbnVtYmVycywgZGVjaWRlZCBvbmNlIGhlcmUgcmF0aGVyIHRoYW4gcGVyIGNlbGwsIHNvIHRoZSBjb2x1bW5cbiAgLy8gYW5kIGl0cyBoZWFkZXIgYXJlIHJpZ2h0LWFsaWduZWQuXG4gIHB1YmxpYyBjb2x1bW5zID0gc2lnbmFsPChMaXN0Q29sdW1uICYgeyBudW1lcmljOiBib29sZWFuIH0pW10+KFtdKTtcblxuICAvLyBBIGNyb3NzLXRhYiBzb3J0cyBvbmx5IGJ5IGl0cyByb3cta2V5IGNvbHVtbjogZXZlcnkgb3RoZXIgaGVhZGVyIGlzIGFcbiAgLy8gcGl2b3QgdmFsdWUsIGFuZCB0aGUgc2VydmVyIG9yZGVycyB0aGUgbG9uZyByb3dzIGJlZm9yZSBwaXZvdGluZywgc28gYVxuICAvLyBjbGljayBvbiBcIk1hciAyMDI2XCIgaGFzIG5vdGhpbmcgdG8gb3JkZXIgYnkuXG4gIHB1YmxpYyBwaXZvdGVkID0gc2lnbmFsKGZhbHNlKTtcblxuICAvLyBBIGN1dCByZXN1bHQgaXMgd29yc2UgZm9yIGEgZ3JpZCB0aGFuIGZvciBhIGxpc3Q6IHRoZSBjdXQgbGFuZHMgb24gdGhlIExPTkdcbiAgLy8gcm93cyBiZWZvcmUgdGhlIHJlc2hhcGUsIHNvIGEgcGl2b3QgdmFsdWUgbGl2aW5nIG9ubHkgaW4gdGhlIHRhaWwgdmFuaXNoZXNcbiAgLy8gYXMgYSB3aG9sZSBDT0xVTU4gYW5kIHN0cmFkZGxlZCBjZWxscyBjb21lIGJhY2sgYmxhbmssIGluZGlzdGluZ3Vpc2hhYmxlXG4gIC8vIGZyb20gYSByZWFsIHplcm8uIFRoZSBwYXJlbnQncyB0cnVuY2F0aW9uIGJhbm5lciBuZXZlciBmaXJlcyBmb3IgYSBsaXN0XG4gIC8vIChpdCBvbmx5IHJlbmRlcnMgd2hhdCBfbG9hZCgpIGZldGNoZWQsIHdoaWNoIGxpc3RzIHNraXApLCBzbyB0aGUgd2FybmluZ1xuICAvLyBiZWxvbmdzIGhlcmUuXG4gIHB1YmxpYyB0cnVuY2F0ZWQgPSBzaWduYWwoZmFsc2UpO1xuXG4gIC8vIFdoeSB0aGUgc2VhcmNoIGJveCBkaWQgbm90IG5hcnJvdyB0aGUgcm93cyAodGhlIGxpc3QgaGFzIG5vIHRleHQgY29sdW1uIHRvXG4gIC8vIHNlYXJjaCksIGZyb20gdGhlIGxhdGVzdCBwYWdlIDE7IG51bGwgd2hlbiB0aGUgc2VhcmNoIGFwcGxpZWQgb3Igbm9uZSB3YXNcbiAgLy8gbWFkZS5cbiAgcHVibGljIHJlYWRvbmx5IHNlYXJjaE5vdGUgPSBzaWduYWw8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG5cbiAgLy8gY29uZmlnLnRvdGFscywgcmVhZCBvbmNlIGF0IGluaXQ6IGEgbGlzdCB3aXRoIHRvdGFscyByZW5kZXJzIGl0cyBjb2x1bW5zXG4gIC8vIHdpdGggYSBmb290ZXIgdGVtcGxhdGUsIHdoaWNoIGZzLWxpc3QgcmVhZHMgb25seSB3aGVuIGl0IGJ1aWxkcyB0aGVtLlxuICBwdWJsaWMgcmVhZG9ubHkgc2hvd1RvdGFscyA9IHNpZ25hbChmYWxzZSk7XG5cbiAgLy8gVGhlIHRvdGFscyByb3cgZnJvbSB0aGUgbGF0ZXN0IHBhZ2UgMSwgcmF3IHZhbHVlcyBrZXllZCBsaWtlIHRoZSBjb2x1bW5zO1xuICAvLyBudWxsIHdoZW4gdGhlIGxpc3QgaGFzIG5vbmUsIG9yIHRoZSBzZXJ2ZXIgc2F5cyB3aHkgaW4gdG90YWxzTm90ZS5cbiAgcHVibGljIHJlYWRvbmx5IHRvdGFscyA9IHNpZ25hbDxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IG51bGw+KG51bGwpO1xuXG4gIHB1YmxpYyByZWFkb25seSB0b3RhbHNOb3RlID0gc2lnbmFsPHN0cmluZyB8IG51bGw+KG51bGwpO1xuXG4gIC8vIFRoZSBsYXRlc3QgcGFnZSAxJ3MgY29tcGFyaXNvbiB3aW5kb3dzLCB0aW1lZnJhbWUgYW5kIG91dHB1dCBtZXRhZGF0YSwgZm9yXG4gIC8vIHRoZSBub3RlIGFib3ZlIHRoZSBsaXN0LCB0aGUgaGVhZGVyIHRvb2x0aXBzIGFuZCB0aGUgb3V0cHV0IGNlbGxzOyBudWxsXG4gIC8vIHVudGlsIGl0IGFycml2ZXMsIGFuZCBlbXB0eSBvZiBldmVyeSBrZXkgZm9yIGEgbGlzdCB0aGF0IGhhcyBub25lLlxuICBwdWJsaWMgcmVhZG9ubHkgbm90ZURhdGEgPSBzaWduYWw8Q29tcG9uZW50Tm90ZURhdGEgfCBudWxsPihudWxsKTtcblxuICAvLyBIb3cgbWFueSByb3dzIHRoZSBsaXN0IHNob3dzIChsb2FkIG1vcmUgYXBwZW5kcykgb3V0IG9mIGhvdyBtYW55IGl0c1xuICAvLyBmaWx0ZXJzIGtlZXAuIEEgY3Jvc3MtdGFiIGNvdW50cyBncmlkIHJvd3MuXG4gIHB1YmxpYyByZWFkb25seSByb3dDb3VudCA9IHNpZ25hbDx7IHNob3duOiBudW1iZXI7IHRvdGFsOiBudW1iZXIgfSB8IG51bGw+KG51bGwpO1xuXG4gIC8vIFRoZSByZXBvcnQncyBlZmZlY3RpdmUgem9uZSwgd2hpY2ggZGF0ZSBjZWxscyByZW5kZXIgaW4uIEluamVjdGVkIHJpZ2h0XG4gIC8vIGhlcmUgcmF0aGVyIHRoYW4gcmVhZCBvZmYgX2ZpbHRlclN0YXRlLCB3aGljaCBpcyBkZWNsYXJlZCBmdXJ0aGVyIGRvd24gYW5kXG4gIC8vIGlzIHN0aWxsIHVuZGVmaW5lZCB3aGlsZSB0aGlzIGluaXRpYWxpemVyIHJ1bnMuXG4gIHB1YmxpYyByZWFkb25seSB0aW1lem9uZSA9IGluamVjdChSZXBvcnRGaWx0ZXJTdGF0ZVNlcnZpY2UpLnRpbWV6b25lO1xuXG4gIC8vIFRoZSBvcGVuIHJlcG9ydCdzIGZvcm1hdCBjb250ZXh0OiBkYXRlIGNlbGxzLCBudW1iZXIgY2VsbHMgYW5kIGFcbiAgLy8gY3Jvc3MtdGFiJ3MgcGVyaW9kIGhlYWRpbmdzIGFyZSB3cml0dGVuIGluIGl0cyBsb2NhbGUgKGFuZCBtb25leSBpbiBpdHNcbiAgLy8gY3VycmVuY3kpLiBJbmplY3RlZCBoZXJlIGZvciB0aGUgc2FtZSByZWFzb24uXG4gIHB1YmxpYyByZWFkb25seSBmb3JtYXRDb250ZXh0ID0gaW5qZWN0KFJlcG9ydEZpbHRlclN0YXRlU2VydmljZSkuZm9ybWF0Q29udGV4dDtcblxuICBwdWJsaWMgcmVhZG9ubHkgUmVwb3J0TGlzdENvbHVtbkZvcm1hdCA9IFJlcG9ydExpc3RDb2x1bW5Gb3JtYXQ7XG5cbiAgLy8gSG93IG1hbnkgbGVhZGluZyBjb2x1bW5zIHN0YXkgaW4gdmlldyB3aGlsZSB0aGUgbGlzdCBzY3JvbGxzIHNpZGV3YXlzLlxuICBwdWJsaWMgcmVhZG9ubHkgcGlubmVkID0gY29tcHV0ZWQoKCkgPT4gbGlzdFBpbm5lZENvbHVtbnModGhpcy5jb21wb25lbnQoKS5jb25maWcpKTtcblxuICBwdWJsaWMgcmVhZG9ubHkgY29sdW1uQ2xhc3NlcyA9IGNvbHVtbkNsYXNzZXM7XG5cbiAgLy8gVGhlIGNvbmZpZyBjb2x1bW5zIHRoZSB2aWV3ZXIgaGlkIG9uIHRoaXMgbGlzdCAodGhlIENvbHVtbnMgZGlhbG9nLCBvciB0aGVcbiAgLy8gVVJMKS4gZnMtbGlzdCBoaWRlcyBhbmQgc2hvd3MgdGhlbSBpbiBwbGFjZSB0aHJvdWdoIFtzaG93XSwgc28gdGhlIHJvd3NcbiAgLy8gYWxyZWFkeSBmZXRjaGVkIHN0YW5kLlxuICBwdWJsaWMgcmVhZG9ubHkgaGlkZGVuID0gY29tcHV0ZWQoKCkgPT4gbmV3IFNldCh0aGlzLl9maWx0ZXJTdGF0ZS5oaWRkZW5Db2x1bW5zKHRoaXMuY29tcG9uZW50KCkuaWQpKSk7XG5cbiAgcHVibGljIHJlYWRvbmx5IHRvdGFsTGFiZWwgPSBMSVNUX1RPVEFMX0xBQkVMO1xuXG4gIC8vIFRoZSBjb2x1bW5zIHRoYXQgaG9sZCBhIGNvbXBhcmVkLCB3aW5kb3dlZCwgcmFua2VkIG9yIHNoYXJlZCBvdXRwdXQsIGJ5XG4gIC8vIG5hbWU7IHRoZSByZXN0IGFyZSB3cml0dGVuIGFzIGJlZm9yZS5cbiAgcHVibGljIHJlYWRvbmx5IG91dHB1dENvbHVtbnMgPSBjb21wdXRlZDxSZWNvcmQ8c3RyaW5nLCBMaXN0T3V0cHV0Q29sdW1uPj4oKCkgPT4gbGlzdE91dHB1dENvbHVtbnMoXG4gICAgdGhpcy5jb2x1bW5zKCksXG4gICAgdGhpcy5ub3RlRGF0YSgpLFxuICAgICgodGhpcy5jb21wb25lbnQoKS5jb25maWcgPz8ge30pIGFzIExpc3RDb25maWcpLmNvbHVtbnMgPz8gW10sXG4gICkpO1xuXG4gIC8vIEVhY2ggY29sdW1uJ3MgaGVhZGVyIHRvb2x0aXA6IHdoYXQgYW4gb3V0cHV0IGNvbHVtbiBob2xkcyAoJycgZm9yIGFueVxuICAvLyBvdGhlcikuXG4gIHB1YmxpYyByZWFkb25seSBjb2x1bW5Ob3RlcyA9IGNvbXB1dGVkPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+KCgpID0+IHtcbiAgICBjb25zdCBsb2NhbGUgPSB0aGlzLmZvcm1hdENvbnRleHQoKS5sb2NhbGU7XG5cbiAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKHRoaXMuY29sdW1ucygpXG4gICAgICAubWFwKChjb2x1bW4pID0+IFtjb2x1bW4uY29sdW1uLCBvdXRwdXRDb2x1bW5Ob3RlKGNvbHVtbi5jb2x1bW4sIHRoaXMubm90ZURhdGEoKSwgbG9jYWxlKV0pKTtcbiAgfSk7XG5cbiAgLy8gVGhlIGNvbHVtbiB3aG9zZSBmb290ZXIgY2VsbCByZWFkcyAnVG90YWwnOiB0aGUgZmlyc3Qgb25lIHNob3duLCB1bmxlc3NcbiAgLy8gaXQgaG9sZHMgYSB0b3RhbCBpdHNlbGYuXG4gIHB1YmxpYyByZWFkb25seSB0b3RhbHNMYWJlbENvbHVtbiA9IGNvbXB1dGVkKCgpID0+IGxpc3RUb3RhbHNMYWJlbENvbHVtbihcbiAgICB0aGlzLmNvbHVtbnMoKS5maWx0ZXIoKGNvbHVtbikgPT4gIXRoaXMuaGlkZGVuKCkuaGFzKGNvbHVtbi5jb2x1bW4pKSxcbiAgICB0aGlzLnRvdGFscygpLFxuICApKTtcblxuICAvLyBUaGUgbGluZSB1bmRlciB0aGUgbGlzdDogaXRzIHJvdyBjb3VudCwgdGhlbiB3aHkgaXQgaGFzIG5vIHRvdGFscyBhbmQgd2h5XG4gIC8vIGl0cyBzZWFyY2ggbmFycm93ZWQgbm90aGluZy4gVGhlIGRpZ2l0cyBhcmUgd3JpdHRlbiBpbiB0aGUgcmVwb3J0J3NcbiAgLy8gbG9jYWxlLCBuZXZlciB0aGUgYXBwJ3MuXG4gIHB1YmxpYyByZWFkb25seSBjYXB0aW9uID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IGNvdW50ID0gdGhpcy5yb3dDb3VudCgpO1xuICAgIGNvbnN0IGxvY2FsZSA9IHRoaXMuZm9ybWF0Q29udGV4dCgpLmxvY2FsZTtcbiAgICBjb25zdCBwYXJ0czogc3RyaW5nW10gPSBbXTtcblxuICAgIGlmIChjb3VudCkge1xuICAgICAgY29uc3QgdG90YWwgPSBmb3JtYXRQbGFpbk51bWJlcihjb3VudC50b3RhbCwgbG9jYWxlKTtcbiAgICAgIHBhcnRzLnB1c2goY291bnQuc2hvd24gPCBjb3VudC50b3RhbFxuICAgICAgICA/IGBTaG93aW5nICR7Zm9ybWF0UGxhaW5OdW1iZXIoY291bnQuc2hvd24sIGxvY2FsZSl9IG9mICR7dG90YWx9YFxuICAgICAgICA6IGAke3RvdGFsfSByb3cocylgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gWy4uLnBhcnRzLCB0aGlzLnRvdGFsc05vdGUoKSwgdGhpcy5zZWFyY2hOb3RlKCldXG4gICAgICAuZmlsdGVyKChwYXJ0KTogcGFydCBpcyBzdHJpbmcgPT4gISFwYXJ0KVxuICAgICAgLmpvaW4oJyDCtyAnKTtcbiAgfSk7XG5cbiAgcHJpdmF0ZSBfcmVwb3J0RGF0YSA9IGluamVjdChSZXBvcnREYXRhKTtcbiAgcHJpdmF0ZSBfZmlsdGVyU3RhdGUgPSBpbmplY3QoUmVwb3J0RmlsdGVyU3RhdGVTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBfZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcbiAgcHJpdmF0ZSBfZWxlbWVudFJlZiA9IGluamVjdDxFbGVtZW50UmVmPEhUTUxFbGVtZW50Pj4oRWxlbWVudFJlZik7XG4gIHByaXZhdGUgX2luamVjdG9yID0gaW5qZWN0KEluamVjdG9yKTtcbiAgcHJpdmF0ZSBfcGluT2Zmc2V0c1JlZjogQWZ0ZXJSZW5kZXJSZWYgfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICAvLyBIaWRpbmcgb3Igc2hvd2luZyBhIGNvbHVtbiBtb3ZlcyB0aGUgcGlubmVkIGNvbHVtbnMgYWZ0ZXIgaXQuXG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIHRoaXMuaGlkZGVuKCk7XG4gICAgICB1bnRyYWNrZWQoKCkgPT4gdGhpcy5fc2NoZWR1bGVQaW5PZmZzZXRzKCkpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGNvbnN0IGNvbXBvbmVudCA9IHRoaXMuY29tcG9uZW50KCk7XG4gICAgY29uc3QgY29uZmlnID0gKGNvbXBvbmVudC5jb25maWcgPz8ge30pIGFzIExpc3RDb25maWc7XG4gICAgdGhpcy5waXZvdGVkLnNldCghIWNvbmZpZy5waXZvdEJ5Py5jb2x1bW4pO1xuICAgIHRoaXMuc2hvd1RvdGFscy5zZXQoY29uZmlnLnRvdGFscyA9PT0gdHJ1ZSk7XG4gICAgdGhpcy5jb2x1bW5zLnNldCgoY29uZmlnLmNvbHVtbnMgPz8gW10pLm1hcCgoY29sdW1uKSA9PiAoeyAuLi5jb2x1bW4sIG51bWVyaWM6IGhhc051bWJlckZvcm1hdChjb2x1bW4pIH0pKSk7XG5cbiAgICB0aGlzLl9pbml0TGlzdENvbmZpZyhjb25maWcpO1xuICAgIHRoaXMuX29ic2VydmVQaW5PZmZzZXRzKCk7XG5cbiAgICAvLyBBIGNoYW5nZSB0byBhbnkgZ3JvdXAgdGhpcyBsaXN0J3MgZmlsdGVycyBiZWxvbmcgdG8gKGZyb20gdGhlIHJlcG9ydCBiYXJcbiAgICAvLyBvciB0aGUgY29tcG9uZW50IGhlYWRlciBzdHJpcCkgcmUtcnVucyB0aGUgbGlzdC5cbiAgICAvLyBTbyBkb2VzIGEgY2hhbmdlIG9mIHRoZSB0ZXh0IGluIGl0cyBzZWFyY2ggYm94IChpbiB0aGUgY29tcG9uZW50IGhlYWRlcikuXG4gICAgbWVyZ2UodGhpcy5fZmlsdGVyU3RhdGUuY2hhbmdlc0Zvcihjb21wb25lbnQpLCB0aGlzLl9maWx0ZXJTdGF0ZS5saXN0U2VhcmNoQ2hhbmdlcyhjb21wb25lbnQuaWQpKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRhcCgoKSA9PiB0aGlzLmxpc3RDb21wb25lbnQoKT8ucmVsb2FkKCkpLFxuICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZiksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBwcml2YXRlIF9pbml0TGlzdENvbmZpZyhjb25maWc6IExpc3RDb25maWcpOiB2b2lkIHtcbiAgICAvLyBUaGUgdmlld2VyJ3MgbGFzdCBzb3J0IHdpbnMgb3ZlciB0aGUgYXV0aG9yZWQgb25lLCBzbyBhIGxpc3QgcmVjcmVhdGVkXG4gICAgLy8gaW4gdGhlIHNhbWUgc2Vzc2lvbiAocGFnZSBzd2l0Y2gsIHJlbG9hZCBhZnRlciBhbiBlZGl0KSBrZWVwcyBpdC5cbiAgICAvLyBmcy1saXN0IGhvbGRzIG9uZSBzb3J0aW5nIGNvbHVtbiwgc28gaXQgc2hvd3MgdGhlIGF1dGhvcmVkIHNvcnQncyBmaXJzdFxuICAgIC8vIHRlcm07IHRoZSByZXF1ZXN0IHNlbmRzIG9ubHkgdGhhdCB0ZXJtIGFuZCB0aGUgc2VydmVyIGFwcGVuZHMgdGhlIHJlc3QuXG4gICAgY29uc3Qgc29ydDogUmVwb3J0U29ydCB8IHVuZGVmaW5lZCA9IHRoaXMuX2ZpbHRlclN0YXRlLmxpc3RTb3J0KHRoaXMuY29tcG9uZW50KCkuaWQpXG4gICAgICA/PyBsaXN0U29ydFRlcm1zKGNvbmZpZylbMF07XG5cbiAgICB0aGlzLmxpc3RDb25maWcgPSB7XG4gICAgICAvLyBJbnNpZGUgYSByZXBvcnQgY29tcG9uZW50IHRoZSBsaXN0IGlzIGEgY2xlYW4gZGF0YSBwYW5lIOKAlCBubyBzdGF0dXNcbiAgICAgIC8vIGJhciwgbm8gcmVsb2FkIGJ1dHRvbiAoZmlsdGVyIGNoYW5nZXMgYWxyZWFkeSByZWZldGNoKS5cbiAgICAgIHN0YXR1czogZmFsc2UsXG4gICAgICByZWxvYWQ6IGZhbHNlLFxuICAgICAgLy8gRnNMaXN0IG5ldmVyIHRvdWNoZXMgdGhlIFVSTCBvciBwZXJzaXN0cyBzb3J0L3BhZ2luZyBzdGF0ZS4gVGhlIHNvcnRcbiAgICAgIC8vIHJlYWNoZXMgdGhlIFVSTCB0aHJvdWdoIFJlcG9ydEZpbHRlclN0YXRlU2VydmljZSAoc2V0TGlzdFNvcnQpLCBhbmRcbiAgICAgIC8vIHBhZ2luZyBzdGF5cyBvdXQgb2YgaXQuXG4gICAgICBxdWVyeVBhcmFtOiBmYWxzZSxcbiAgICAgIHBlcnNpc3Q6IGZhbHNlLFxuICAgICAgc29ydDogc29ydFxuICAgICAgICA/IHsgdmFsdWU6IHNvcnQuY29sdW1uLCBkaXJlY3Rpb246IHNvcnQuZGlyZWN0aW9uID8/ICdhc2MnIH1cbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAvLyBMb2FkLW1vcmU6IHRoZSBsaXN0IGtlZXBzIGEgZml4ZWQsIHNjcm9sbGFibGUgaGVpZ2h0IGFuZCBhcHBlbmRzIHRoZVxuICAgICAgLy8gbmV4dCBwYWdlIGluIHBsYWNlIGluc3RlYWQgb2Ygc3dhcHBpbmcgcGFnZXMuIFRoZSBidXR0b24gaXMgcGlubmVkIHRvXG4gICAgICAvLyB0aGUgYm90dG9tIG9mIHRoZSBzY3JvbGwgcGFuZSAoc2VlIGNvbXBvbmVudCBTQ1NTKS5cbiAgICAgIC8vXG4gICAgICAvLyBVc2VzIHRoZSBPZmZzZXQgc3RyYXRlZ3kgKG9mZnNldCArIGxpbWl0KSByYXRoZXIgdGhhbiBNYW55OiBpblxuICAgICAgLy8gQGZpcmVzdGl0Y2gvbGlzdCB0aGUgcGFnaW5hdGlvbiB0ZW1wbGF0ZSByZXNvbHZlcyBgaGFzTWFueVN0cmF0ZWd5YFxuICAgICAgLy8gQkVGT1JFIGBsb2FkTW9yZUVuYWJsZWRgLCBhbmQgTWFueSByZW5kZXJzIGEgZm9yd2FyZC1vbmx5IHBhZ2UgcGFnZXIg4oCUXG4gICAgICAvLyBzbyBNYW55IHdvdWxkIHN1cHByZXNzIHRoZSBsb2FkLW1vcmUgYnV0dG9uIGVudGlyZWx5LiBPZmZzZXQgKyBsb2FkTW9yZVxuICAgICAgLy8gaXMgdGhlIGNvbWJpbmF0aW9uIHRoYXQgYWN0dWFsbHkgcmVuZGVycyBhbmQgYXBwZW5kcy4gYF9mZXRjaGAgYWxyZWFkeVxuICAgICAgLy8gZGVyaXZlcyBgcGFnZWAgZnJvbSBgb2Zmc2V0YCwgc28gdGhlIHNlcnZlci1zaWRlIHdyYXAgaXMgdW5hZmZlY3RlZC5cbiAgICAgIHBhZ2luZzoge1xuICAgICAgICBsaW1pdDogY29uZmlnLnBhZ2VTaXplID8/IDI1LFxuICAgICAgICBzdHJhdGVneTogUGFnaW5hdGlvblN0cmF0ZWd5Lk9mZnNldCxcbiAgICAgIH0sXG4gICAgICBsb2FkTW9yZToge1xuICAgICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgICBsYWJlbDogJ0xvYWQgbW9yZScsXG4gICAgICAgIGJ1dHRvblR5cGU6ICdzdHJva2VkJyxcbiAgICAgIH0sXG4gICAgICBmZXRjaDogKHF1ZXJ5OiBhbnkpID0+IHRoaXMuX2ZldGNoKHF1ZXJ5KSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBfZmV0Y2gocXVlcnk6IGFueSk6IE9ic2VydmFibGU8eyBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdOyBwYWdpbmc6IGFueSB9PiB7XG4gICAgLy8gTWFueS9sb2FkLW1vcmUgc2VuZHMgYG9mZnNldGAgKyBgbGltaXRgIChub3QgYHBhZ2VgKTsgZGVyaXZlIHRoZSBwYWdlIHNvXG4gICAgLy8gdGhlIHNlcnZlci1zaWRlIHdyYXAga2VlcHMgd29ya2luZyB1bmNoYW5nZWQuIFBhZ2Ugc3RyYXRlZ3kgc3RpbGwgc2VuZHNcbiAgICAvLyBgcGFnZWAgZGlyZWN0bHkuXG4gICAgY29uc3QgcGFnZVNpemUgPSBxdWVyeS5saW1pdCA/PyAyNTtcbiAgICBjb25zdCBwYWdlID0gcXVlcnkucGFnZVxuICAgICAgPz8gKHF1ZXJ5Lm9mZnNldCAhPSBudWxsID8gTWF0aC5mbG9vcihxdWVyeS5vZmZzZXQgLyBwYWdlU2l6ZSkgKyAxIDogMSk7XG5cbiAgICBjb25zdCBzdGF0ZTogQ29tcG9uZW50RGF0YVN0YXRlID0ge1xuICAgICAgcGFnZSxcbiAgICAgIHBhZ2VTaXplLFxuICAgIH07XG5cbiAgICBjb25zdCBvcmRlciA9IFN0cmluZyhxdWVyeS5vcmRlciA/PyAnJyk7XG4gICAgaWYgKG9yZGVyKSB7XG4gICAgICBjb25zdCBbY29sdW1uLCBkaXJlY3Rpb25dID0gb3JkZXIuc3BsaXQoJywnKTtcbiAgICAgIHN0YXRlLnNvcnQgPSB7IGNvbHVtbiwgZGlyZWN0aW9uOiBkaXJlY3Rpb24gPT09ICdkZXNjJyA/ICdkZXNjJyA6ICdhc2MnIH07XG4gICAgfVxuXG4gICAgY29uc3QgY29tcG9uZW50ID0gdGhpcy5jb21wb25lbnQoKTtcbiAgICB0aGlzLl9maWx0ZXJTdGF0ZS5zZXRMaXN0U29ydChjb21wb25lbnQsIHN0YXRlLnNvcnQgPz8gbnVsbCk7XG5cbiAgICBjb25zdCBzZWFyY2ggPSB0aGlzLl9maWx0ZXJTdGF0ZS5saXN0U2VhcmNoKGNvbXBvbmVudC5pZCk7XG4gICAgaWYgKHNlYXJjaCkge1xuICAgICAgc3RhdGUuc2VhcmNoID0gc2VhcmNoO1xuICAgIH1cblxuICAgIC8vIFRoZSBncm91cHMgdGhhdCBtYXRjaCAnYW55JywgYXMgZXZlcnkgb3RoZXIgcmVhZCBvZiB0aGlzIHRpbGUgc2VuZHNcbiAgICAvLyB0aGVtICh0aWxlRGF0YVN0YXRlKS4gVGhlIHNvcnQgYW5kIHBhZ2luZyBhYm92ZSBhcmUgRnNMaXN0J3Mgb3duLlxuICAgIGNvbnN0IHsgbWF0Y2hBbnlHcm91cElkcyB9ID0gdGhpcy5fZmlsdGVyU3RhdGUudGlsZVN0YXRlKGNvbXBvbmVudCk7XG4gICAgaWYgKG1hdGNoQW55R3JvdXBJZHMpIHtcbiAgICAgIHN0YXRlLm1hdGNoQW55R3JvdXBJZHMgPSBtYXRjaEFueUdyb3VwSWRzO1xuICAgIH1cblxuICAgIC8vIE9uZSBzb3VyY2UgZm9yIGZpbHRlciB2YWx1ZXMsIHRoZSBzYW1lIG9uZSBjaGFydHMsIEtQSXMgYW5kIHRoZSBleHBvcnRzXG4gICAgLy8gcmVhZCwgc28gdGhlIGxpc3QgaXMgZmlsdGVyZWQgZXhhY3RseSBhcyBpdHMgaGVhZGVyIHN0cmlwIHNob3dzLlxuICAgIGNvbnN0IGZpbHRlcnMgPSB0aGlzLl9maWx0ZXJTdGF0ZS5yZXNvbHZlRm9yQ29tcG9uZW50KGNvbXBvbmVudCk7XG5cbiAgICByZXR1cm4gdGhpcy5fcmVwb3J0RGF0YVxuICAgICAgLmNvbXBvbmVudERhdGEodGhpcy5yZXBvcnRJZCgpLCBjb21wb25lbnQuaWQsIGZpbHRlcnMsIHN0YXRlKVxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcCgoZGF0YTogQ29tcG9uZW50RGF0YSkgPT4ge1xuICAgICAgICAgIC8vIEEgY3Jvc3MtdGFiJ3MgaGVhZGVycyBjb21lIGJhY2sgd2l0aCB0aGUgcm93czogdGhlIHJvdy1rZXkgY29sdW1uXG4gICAgICAgICAgLy8gZmlyc3QsIHRoZW4gb25lIHBlciBwaXZvdCB2YWx1ZS4gUmUtcmVhZCB0aGVtIG9uIGV2ZXJ5IGZldGNoLCBzaW5jZVxuICAgICAgICAgIC8vIGEgZmlsdGVyIGNoYW5nZSBjYW4gYWRkIG9yIHJlbW92ZSBhIGNvbHVtbi5cbiAgICAgICAgICBpZiAodGhpcy5waXZvdGVkKCkpIHtcbiAgICAgICAgICAgIHRoaXMuY29sdW1ucy5zZXQodGhpcy5fcGl2b3RDb2x1bW5zKGRhdGEpKTtcbiAgICAgICAgICAgIHRoaXMudHJ1bmNhdGVkLnNldCghIWRhdGEudHJ1bmNhdGVkKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBPbmx5IHBhZ2UgMSBjYXJyaWVzIHRoZSBub3RlcyBhbmQgdGhlIHRvdGFsczsgYSBsb2FkLW1vcmUgcGFnZVxuICAgICAgICAgIC8vIGxlYXZlcyB0aGVtIGFzIHRoZXkgYXJlLlxuICAgICAgICAgIGlmIChzdGF0ZS5wYWdlID09PSAxKSB7XG4gICAgICAgICAgICB0aGlzLnNlYXJjaE5vdGUuc2V0KGRhdGEuc2VhcmNoTm90ZSA/PyBudWxsKTtcbiAgICAgICAgICAgIHRoaXMudG90YWxzLnNldChkYXRhLnRvdGFscyA/PyBudWxsKTtcbiAgICAgICAgICAgIHRoaXMudG90YWxzTm90ZS5zZXQoZGF0YS50b3RhbHNOb3RlID8/IG51bGwpO1xuICAgICAgICAgICAgdGhpcy5ub3RlRGF0YS5zZXQodGhpcy5fbm90ZURhdGEoZGF0YSkpO1xuICAgICAgICAgICAgdGhpcy5fYWxpZ25PdXRwdXRDb2x1bW5zKGRhdGEpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFRoZSBzZXJ2ZXIncyBwYWdlIHNpemUgd2hlbiBpdCBzZW5kcyBvbmUgKGl0IGNsYW1wcyB0aGUgcmVxdWVzdCksXG4gICAgICAgICAgLy8gdGhlIHNpemUgdGhlIHBhZ2luZyBiZWxvdyBoYW5kcyBmcy1saXN0IHRvby5cbiAgICAgICAgICBjb25zdCBzaXplID0gZGF0YS5wYWdpbmc/LnBhZ2VTaXplID8/IHN0YXRlLnBhZ2VTaXplO1xuICAgICAgICAgIGNvbnN0IHNob3duID0gKHN0YXRlLnBhZ2UgLSAxKSAqIHNpemUgKyAoZGF0YS5yb3dzPy5sZW5ndGggPz8gMCk7XG4gICAgICAgICAgdGhpcy5yb3dDb3VudC5zZXQoeyBzaG93biwgdG90YWw6IGRhdGEucGFnaW5nPy50b3RhbCA/PyBzaG93biB9KTtcblxuICAgICAgICAgIC8vIE5ldyByb3dzIGNhbiB3aWRlbiBhIHBpbm5lZCBjb2x1bW4sIHdoaWNoIG1vdmVzIHRoZSBvbmVzIGFmdGVyIGl0LlxuICAgICAgICAgIHRoaXMuX3NjaGVkdWxlUGluT2Zmc2V0cygpO1xuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRhdGE6IGRhdGEucm93cyA/PyBbXSxcbiAgICAgICAgICAgIHBhZ2luZzoge1xuICAgICAgICAgICAgICBsaW1pdDogZGF0YS5wYWdpbmc/LnBhZ2VTaXplID8/IHN0YXRlLnBhZ2VTaXplLFxuICAgICAgICAgICAgICByZWNvcmRzOiBkYXRhLnBhZ2luZz8udG90YWwgPz8gKGRhdGEucm93cz8ubGVuZ3RoID8/IDApLFxuICAgICAgICAgICAgICBwYWdlOiBkYXRhLnBhZ2luZz8ucGFnZSA/PyBzdGF0ZS5wYWdlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9O1xuICAgICAgICB9KSxcbiAgICAgICk7XG4gIH1cblxuICAvLyBBIGNyb3NzLXRhYidzIGNvbHVtbnMsIGJ1aWx0IGZyb20gdGhlIHdpcmUgYnkgcGl2b3RDb2x1bW5TcGVjcygpOiB0aGUgc2FtZVxuICAvLyBoZWFkaW5ncyBhbmQgY2VsbCBmb3JtYXQgdGhlIFBERiBhbmQgUG93ZXJQb2ludCBleHBvcnRzIHVzZS4gQSBjZWxsIGNvbHVtblxuICAvLyB3aG9zZSBtZWFzdXJlIGlzIGEgcmFuayBvciBhIHNoYXJlIChjZWxsTWVhc3VyZXMgbmFtZXMgaXQpIGhvbGRzIG51bWJlcnNcbiAgLy8gd2hldGhlciBvciBub3QgdGhlIGdyaWQgbmFtZXMgYSBjZWxsIGZvcm1hdC5cbiAgcHJpdmF0ZSBfcGl2b3RDb2x1bW5zKGRhdGE6IENvbXBvbmVudERhdGEpOiAoTGlzdENvbHVtbiAmIHsgbnVtZXJpYzogYm9vbGVhbiB9KVtdIHtcbiAgICBjb25zdCBjb25maWcgPSAodGhpcy5jb21wb25lbnQoKS5jb25maWcgPz8ge30pIGFzIExpc3RDb25maWc7XG4gICAgY29uc3Qgb3V0cHV0Q2VsbHMgPSBPYmplY3Qua2V5cyhsaXN0T3V0cHV0Q29sdW1ucyhcbiAgICAgIChkYXRhLmNvbHVtbnMgPz8gW10pLnNsaWNlKDEpLm1hcCgoY29sdW1uKSA9PiAoeyBjb2x1bW4gfSkpLFxuICAgICAgZGF0YSxcbiAgICAgIFtdLFxuICAgICkpO1xuXG4gICAgcmV0dXJuIHBpdm90Q29sdW1uU3BlY3MoY29uZmlnLCBkYXRhLCB0aGlzLmZvcm1hdENvbnRleHQoKS5sb2NhbGUpXG4gICAgICAubWFwKChjb2x1bW4pID0+ICh7IC4uLmNvbHVtbiwgbnVtZXJpYzogY29sdW1uLm51bWVyaWMgfHwgb3V0cHV0Q2VsbHMuaW5jbHVkZXMoY29sdW1uLmNvbHVtbikgfSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBfbm90ZURhdGEoZGF0YTogQ29tcG9uZW50RGF0YSk6IENvbXBvbmVudE5vdGVEYXRhIHtcbiAgICByZXR1cm4ge1xuICAgICAgY29tcGFyaXNvbjogZGF0YS5jb21wYXJpc29uLFxuICAgICAgdGltZWZyYW1lOiBkYXRhLnRpbWVmcmFtZSxcbiAgICAgIG91dHB1dHM6IGRhdGEub3V0cHV0cyxcbiAgICAgIGNlbGxNZWFzdXJlczogZGF0YS5jZWxsTWVhc3VyZXMsXG4gICAgICB3aW5kb3dzOiBkYXRhLndpbmRvd3MsXG4gICAgICBncmFudWxhcml0eTogZGF0YS5ncmFudWxhcml0eSxcbiAgICB9O1xuICB9XG5cbiAgLy8gQSBwbGFpbiBsaXN0J3MgY29sdW1ucyBhcmUgYnVpbHQgYmVmb3JlIGFueSBkYXRhIGFycml2ZXMsIHNvIGFuIG91dHB1dFxuICAvLyBjb2x1bW4gdGhhdCBuYW1lcyBubyBmb3JtYXQgb2YgaXRzIG93biAoYSByYW5rLCBhIHNoYXJlLCBhIHByaW9yIHRoYXQgdGFrZXNcbiAgLy8gaXRzIG1lYXN1cmUncyBmb3JtYXQpIGxlYXJucyBpdCBob2xkcyBudW1iZXJzIGZyb20gcGFnZSAxLiBmcy1saXN0IHJlYWRzIGFcbiAgLy8gY29sdW1uJ3MgYWxpZ25tZW50IG9ubHkgd2hlbiBpdCBidWlsZHMgdGhlIGNvbHVtbiwgc28gYSBjb2x1bW4gd2hvc2VcbiAgLy8gYWxpZ25tZW50IGNoYW5nZXMgaXMgcmVidWlsdCAodGhlIHRlbXBsYXRlIHRyYWNrcyBjb2x1bW5zIGJ5IGJvdGgpLlxuICBwcml2YXRlIF9hbGlnbk91dHB1dENvbHVtbnMoZGF0YTogQ29tcG9uZW50RGF0YSk6IHZvaWQge1xuICAgIGlmICh0aGlzLnBpdm90ZWQoKSB8fCAhZGF0YS5vdXRwdXRzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY29sdW1ucyA9IHRoaXMuY29sdW1ucygpO1xuICAgIGNvbnN0IGFsaWduZWQgPSBjb2x1bW5zLm1hcCgoY29sdW1uKSA9PiAoe1xuICAgICAgLi4uY29sdW1uLFxuICAgICAgbnVtZXJpYzogaGFzTnVtYmVyRm9ybWF0KGNvbHVtbikgfHwgISFkYXRhLm91dHB1dHNbY29sdW1uLmNvbHVtbl0sXG4gICAgfSkpO1xuXG4gICAgaWYgKGFsaWduZWQuc29tZSgoY29sdW1uLCBpbmRleCkgPT4gY29sdW1uLm51bWVyaWMgIT09IGNvbHVtbnNbaW5kZXhdLm51bWVyaWMpKSB7XG4gICAgICB0aGlzLmNvbHVtbnMuc2V0KGFsaWduZWQpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEEgdGlsZSByZXNpemUgcmVmbG93cyB0aGUgdGFibGUncyBhdXRvIGxheW91dCwgc28gdGhlIHBpbm5lZCBjb2x1bW5zJ1xuICAvLyB3aWR0aHMsIGFuZCB3aXRoIHRoZW0gdGhlaXIgb2Zmc2V0cywgY2hhbmdlLlxuICBwcml2YXRlIF9vYnNlcnZlUGluT2Zmc2V0cygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5waW5uZWQoKSA8IDIgfHwgdHlwZW9mIFJlc2l6ZU9ic2VydmVyID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKCgpID0+IHRoaXMuX3NjaGVkdWxlUGluT2Zmc2V0cygpKTtcbiAgICBvYnNlcnZlci5vYnNlcnZlKHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCk7XG4gICAgdGhpcy5fZGVzdHJveVJlZi5vbkRlc3Ryb3koKCkgPT4gb2JzZXJ2ZXIuZGlzY29ubmVjdCgpKTtcbiAgfVxuXG4gIC8vIE1lYXN1cmVzIHRoZSBwaW5uZWQgb2Zmc2V0cyBvbmNlIHRoZSBuZXh0IHJlbmRlciBoYXMgbGFpZCB0aGUgdGFibGUgb3V0LlxuICAvLyBPbmUgcGVuZGluZyBtZWFzdXJlbWVudCBjb3ZlcnMgZXZlcnkgcmVxdWVzdCBtYWRlIGJlZm9yZSBpdCBydW5zLiBPbmx5XG4gIC8vIGFmdGVyTmV4dFJlbmRlciBleGlzdHMgaW4gZXZlcnkgQW5ndWxhciB2ZXJzaW9uIHRoaXMgbGlicmFyeSBydW5zIG9uLlxuICBwcml2YXRlIF9zY2hlZHVsZVBpbk9mZnNldHMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucGlubmVkKCkgPCAyIHx8IHRoaXMuX3Bpbk9mZnNldHNSZWYpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9waW5PZmZzZXRzUmVmID0gYWZ0ZXJOZXh0UmVuZGVyKCgpID0+IHtcbiAgICAgIHRoaXMuX3Bpbk9mZnNldHNSZWYgPSBudWxsO1xuICAgICAgdGhpcy5fdXBkYXRlUGluT2Zmc2V0cygpO1xuICAgIH0sIHsgaW5qZWN0b3I6IHRoaXMuX2luamVjdG9yIH0pO1xuICB9XG5cbiAgLy8gRWFjaCBwaW5uZWQgY29sdW1uIHN0aWNrcyBhdCB0aGUgc3VtbWVkIHdpZHRoIG9mIHRoZSB2aXNpYmxlIHBpbm5lZFxuICAvLyBjb2x1bW5zIGJlZm9yZSBpdC4gQSBoaWRkZW4gY29sdW1uIHJlbmRlcnMgbm8gaGVhZGVyLCBzbyB0aGUgbmV4dCBwaW5uZWRcbiAgLy8gb25lIHRha2VzIGl0cyBwbGFjZS4gQSB2YXJpYWJsZSBpcyB3cml0dGVuIG9ubHkgd2hlbiBpdHMgdmFsdWUgY2hhbmdlZCxcbiAgLy8gd2hpY2gga2VlcHMgYSByZXNpemUgZnJvbSByZXN0eWxpbmcgdGhlIHRhYmxlIGZvciBub3RoaW5nLlxuICBwcml2YXRlIF91cGRhdGVQaW5PZmZzZXRzKCk6IHZvaWQge1xuICAgIGNvbnN0IGhvc3QgPSB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgbGV0IGxlZnQgPSAwO1xuXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRoaXMucGlubmVkKCk7IGluZGV4KyspIHtcbiAgICAgIGNvbnN0IGhlYWRlciA9IGhvc3QucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oYHRoZWFkIHRoLnJlcG9ydC1waW4tJHtpbmRleH1gKTtcblxuICAgICAgaWYgKCFoZWFkZXIpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5hbWUgPSBgLS1yZXBvcnQtcGluLWxlZnQtJHtpbmRleH1gO1xuICAgICAgY29uc3QgdmFsdWUgPSBgJHtNYXRoLnJvdW5kKGxlZnQgKiAxMDApIC8gMTAwfXB4YDtcblxuICAgICAgaWYgKGhvc3Quc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShuYW1lKSAhPT0gdmFsdWUpIHtcbiAgICAgICAgaG9zdC5zdHlsZS5zZXRQcm9wZXJ0eShuYW1lLCB2YWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIGxlZnQgKz0gaGVhZGVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO1xuICAgIH1cbiAgfVxufVxuIiwiQGlmICh0cnVuY2F0ZWQoKSkge1xuICA8ZGl2IGNsYXNzPVwicGl2b3QtdHJ1bmNhdGVkXCI+XG4gICAgVGhpcyBncmlkIHdhcyBidWlsdCBmcm9tIGEgcGFydGlhbCByZXN1bHQsIHNvIHNvbWUgY29sdW1ucyBvciB2YWx1ZXMgbWF5IGJlIG1pc3NpbmcuIE5hcnJvdyBpdCB3aXRoIGEgZmlsdGVyLlxuICA8L2Rpdj5cbn1cblxuPCEtLSBUaGUgd2luZG93cyBhIGNvbXBhcmlzb24gY29tcGFyZXMsIGFuZCB3aHkgaXQgcmVhZHMgYXMgaXQgZG9lcy4gQVxuICAgICB3aW5kb3dlZCBjb2x1bW4ncyBvd24gbm90ZXMgYXJlIGluIGl0cyBoZWFkZXIncyB0b29sdGlwLiAtLT5cbjxhcHAtcmVwb3J0LWNvbXBvbmVudC1ub3RlXG4gIFtkYXRhXT1cIm5vdGVEYXRhKClcIlxuICBbd2luZG93Tm90ZXNdPVwiZmFsc2VcIj5cbjwvYXBwLXJlcG9ydC1jb21wb25lbnQtbm90ZT5cblxuPCEtLSBmcy1saXN0IHJlYWRzIGEgY29sdW1uJ3MgZm9vdGVyIHRlbXBsYXRlIG9uY2UsIGFzIGEgZGlyZWN0IGNoaWxkIG9mXG4gICAgIGZzLWxpc3QtY29sdW1uLCBzbyBhIGxpc3Qgd2l0aCB0b3RhbHMgcmVuZGVycyBpdHMgY29sdW1ucyBpbiBhIGJyYW5jaCBvZlxuICAgICB0aGVpciBvd24gcmF0aGVyIHRoYW4gd3JhcHBpbmcgdGhlIGZvb3RlciBpbiBhbiBAaWYuIEl0cyBoZWFkZXIgdGVtcGxhdGUgdG9vLFxuICAgICB3aGljaCBldmVyeSBjb2x1bW4gY2FycmllczogYW4gb3V0cHV0IGNvbHVtbidzIHRvb2x0aXAgc2F5cyB3aGF0IGl0IGhvbGRzLlxuICAgICBDb2x1bW5zIGFyZSB0cmFja2VkIGJ5IGFsaWdubWVudCBhcyB3ZWxsIGFzIG5hbWUsIHNpbmNlIGZzLWxpc3QgcmVhZHMgYVxuICAgICBjb2x1bW4ncyBhbGlnbm1lbnQgb25seSB3aGVuIGl0IGJ1aWxkcyB0aGUgY29sdW1uLiAtLT5cbjxmcy1saXN0XG4gIFtjb25maWddPVwibGlzdENvbmZpZ1wiXG4gIFtjbGFzcy5yZXBvcnQtdG90YWxzLWVtcHR5XT1cIiF0b3RhbHMoKVwiPlxuICBAaWYgKHNob3dUb3RhbHMoKSkge1xuICAgIEBmb3IgKGNvbHVtbiBvZiBjb2x1bW5zKCk7IHRyYWNrIGNvbHVtbi5jb2x1bW4gKyAnOicgKyBjb2x1bW4ubnVtZXJpYykge1xuICAgICAgPGZzLWxpc3QtY29sdW1uXG4gICAgICAgIFtuYW1lXT1cImNvbHVtbi5jb2x1bW5cIlxuICAgICAgICBbdGl0bGVdPVwiY29sdW1uLmxhYmVsIHx8IGNvbHVtbi5jb2x1bW5cIlxuICAgICAgICBbc2hvd109XCIhaGlkZGVuKCkuaGFzKGNvbHVtbi5jb2x1bW4pXCJcbiAgICAgICAgW3NvcnRhYmxlXT1cIiFwaXZvdGVkKCkgfHwgJGZpcnN0XCJcbiAgICAgICAgW2FsaWduXT1cImNvbHVtbi5udW1lcmljID8gJ3JpZ2h0JyA6ICdsZWZ0J1wiXG4gICAgICAgIFtjbGFzc109XCJjb2x1bW5DbGFzc2VzKGNvbHVtbiwgJGluZGV4LCBwaW5uZWQoKSlcIj5cbiAgICAgICAgPG5nLXRlbXBsYXRlIGZzLWxpc3QtaGVhZGVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImhlYWRlclRwbFwiXG4gICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBjb2x1bW46IGNvbHVtbiB9XCI+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgIGZzLWxpc3QtY2VsbFxuICAgICAgICAgIGxldC1yb3c9XCJyb3dcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJjZWxsVHBsXCJcbiAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7ICRpbXBsaWNpdDogcm93W2NvbHVtbi5jb2x1bW5dLCByb3c6IHJvdywgY29sdW1uOiBjb2x1bW4gfVwiPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8bmctdGVtcGxhdGUgZnMtbGlzdC1mb290ZXI+XG4gICAgICAgICAgQGlmICh0b3RhbHMoKT8uW2NvbHVtbi5jb2x1bW5dICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiY2VsbFRwbFwiXG4gICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7ICRpbXBsaWNpdDogdG90YWxzKCk/Lltjb2x1bW4uY29sdW1uXSwgcm93OiB0b3RhbHMoKSwgY29sdW1uOiBjb2x1bW4gfVwiPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgfSBAZWxzZSBpZiAoY29sdW1uLmNvbHVtbiA9PT0gdG90YWxzTGFiZWxDb2x1bW4oKSkge1xuICAgICAgICAgICAge3sgdG90YWxMYWJlbCB9fVxuICAgICAgICAgIH1cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgIDwvZnMtbGlzdC1jb2x1bW4+XG4gICAgfVxuICB9IEBlbHNlIHtcbiAgICBAZm9yIChjb2x1bW4gb2YgY29sdW1ucygpOyB0cmFjayBjb2x1bW4uY29sdW1uICsgJzonICsgY29sdW1uLm51bWVyaWMpIHtcbiAgICAgIDxmcy1saXN0LWNvbHVtblxuICAgICAgICBbbmFtZV09XCJjb2x1bW4uY29sdW1uXCJcbiAgICAgICAgW3RpdGxlXT1cImNvbHVtbi5sYWJlbCB8fCBjb2x1bW4uY29sdW1uXCJcbiAgICAgICAgW3Nob3ddPVwiIWhpZGRlbigpLmhhcyhjb2x1bW4uY29sdW1uKVwiXG4gICAgICAgIFtzb3J0YWJsZV09XCIhcGl2b3RlZCgpIHx8ICRmaXJzdFwiXG4gICAgICAgIFthbGlnbl09XCJjb2x1bW4ubnVtZXJpYyA/ICdyaWdodCcgOiAnbGVmdCdcIlxuICAgICAgICBbY2xhc3NdPVwiY29sdW1uQ2xhc3Nlcyhjb2x1bW4sICRpbmRleCwgcGlubmVkKCkpXCI+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSBmcy1saXN0LWhlYWRlcj5cbiAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJoZWFkZXJUcGxcIlxuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgY29sdW1uOiBjb2x1bW4gfVwiPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICBmcy1saXN0LWNlbGxcbiAgICAgICAgICBsZXQtcm93PVwicm93XCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiY2VsbFRwbFwiXG4gICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IHJvd1tjb2x1bW4uY29sdW1uXSwgcm93OiByb3csIGNvbHVtbjogY29sdW1uIH1cIj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgIDwvZnMtbGlzdC1jb2x1bW4+XG4gICAgfVxuICB9XG48L2ZzLWxpc3Q+XG5cbkBpZiAoY2FwdGlvbigpKSB7XG4gIDxkaXYgY2xhc3M9XCJsaXN0LWNhcHRpb24gc21hbGxcIj5cbiAgICB7eyBjYXB0aW9uKCkgfX1cbiAgPC9kaXY+XG59XG5cbjwhLS0gQSBjb2x1bW4ncyBoZWFkaW5nLCB3aXRoIHdoYXQgYW4gb3V0cHV0IGNvbHVtbiBob2xkcyBhcyBpdHMgdG9vbHRpcCAoYW5cbiAgICAgZW1wdHkgb25lIG5ldmVyIHNob3dzKS4gLS0+XG48bmctdGVtcGxhdGVcbiAgI2hlYWRlclRwbFxuICBsZXQtY29sdW1uPVwiY29sdW1uXCI+XG4gIDxzcGFuIFttYXRUb29sdGlwXT1cImNvbHVtbk5vdGVzKClbY29sdW1uLmNvbHVtbl0gPz8gJydcIj57eyBjb2x1bW4ubGFiZWwgfHwgY29sdW1uLmNvbHVtbiB9fTwvc3Bhbj5cbjwvbmctdGVtcGxhdGU+XG5cbjwhLS0gT25lIGNlbGwsIGluIHRoZSBib2R5IGFuZCB0aGUgdG90YWxzIHJvdyBhbGlrZTogYW4gb3V0cHV0IGNvbHVtbiBieSB3aGF0XG4gICAgIGl0IGhvbGRzIChpdHMgcm93IGdpdmVzIGEgY2hhbmdlIGl0cyBwcmlvciksIGEgZGF0ZSBjb2x1bW4gYXMgYSBkYXkgaW4gdGhlXG4gICAgIHJlcG9ydCdzIHpvbmUgYW5kIGxvY2FsZSwgYW55IG90aGVyIHRocm91Z2ggaXRzIG51bWJlciBmb3JtYXQuIC0tPlxuPG5nLXRlbXBsYXRlXG4gICNjZWxsVHBsXG4gIGxldC12YWx1ZVxuICBsZXQtcm93PVwicm93XCJcbiAgbGV0LWNvbHVtbj1cImNvbHVtblwiPlxuICBAaWYgKG91dHB1dENvbHVtbnMoKVtjb2x1bW4uY29sdW1uXTsgYXMgb3V0cHV0KSB7XG4gICAgQGlmIChyb3cgfCBmc1JlcG9ydE91dHB1dDogY29sdW1uIDogb3V0cHV0IDogZm9ybWF0Q29udGV4dCgpOyBhcyBjZWxsKSB7XG4gICAgICA8c3BhbiBbYXR0ci50aXRsZV09XCJjZWxsLnRpdGxlXCI+e3sgY2VsbC50ZXh0IH19PC9zcGFuPlxuICAgIH1cbiAgfSBAZWxzZSBpZiAoY29sdW1uLmZvcm1hdCA9PT0gUmVwb3J0TGlzdENvbHVtbkZvcm1hdC5EYXRlKSB7XG4gICAge3sgdmFsdWUgfCBmc1JlcG9ydERhdGU6IHRpbWV6b25lKCkgOiBmb3JtYXRDb250ZXh0KCkubG9jYWxlIH19XG4gIH0gQGVsc2Uge1xuICAgIHt7IHZhbHVlIHwgZnNSZXBvcnROdW1iZXI6IGNvbHVtbiA6IGZvcm1hdENvbnRleHQoKSB9fVxuICB9XG48L25nLXRlbXBsYXRlPlxuIl19