@one-grid-core/angular 0.2.0 → 0.4.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 (102) hide show
  1. package/README.md +55 -9
  2. package/esm2022/lib/components/one-grid/one-grid.component.mjs +244 -11
  3. package/esm2022/lib/components/one-grid-body/one-grid-body.component.mjs +446 -34
  4. package/esm2022/lib/components/one-grid-cell-currency/one-grid-cell-currency.component.mjs +6 -5
  5. package/esm2022/lib/components/one-grid-cell-group-renderer/one-grid-cell-group-renderer.component.mjs +3 -3
  6. package/esm2022/lib/components/one-grid-cell-option-menu/one-grid-cell-option-menu.component.mjs +3 -3
  7. package/esm2022/lib/components/one-grid-checkbox/one-grid-checkbox.component.mjs +7 -18
  8. package/esm2022/lib/components/one-grid-checkbox-header/one-grid-checkbox-header.component.mjs +6 -6
  9. package/esm2022/lib/components/one-grid-header/one-grid-header.component.mjs +221 -17
  10. package/esm2022/lib/components/one-grid-header-menu/one-grid-header-menu.component.mjs +137 -0
  11. package/esm2022/lib/components/one-grid-pagination/one-grid-pagination.component.mjs +6 -5
  12. package/esm2022/lib/components/one-grid-row-action/one-grid-row-action.component.mjs +4 -4
  13. package/esm2022/lib/components/one-grid-row-drag-handle/one-grid-row-drag-handle.component.mjs +5 -3
  14. package/esm2022/lib/components/one-grid-status/one-grid-status.component.mjs +4 -4
  15. package/esm2022/lib/core/directives/one-cell-input-validator.directive.mjs +3 -3
  16. package/esm2022/lib/core/directives/one-cell-renderer-component.directive.mjs +3 -3
  17. package/esm2022/lib/core/directives/one-cell-text-expand.directive.mjs +3 -3
  18. package/esm2022/lib/core/icons/one-grid-icons.mjs +38 -0
  19. package/esm2022/lib/core/instants/one-grid-api.class.mjs +296 -3
  20. package/esm2022/lib/core/models/one-column-def-types.model.mjs +1 -1
  21. package/esm2022/lib/core/models/one-event-types.model.mjs +1 -1
  22. package/esm2022/lib/core/models/one-filter.model.mjs +1 -1
  23. package/esm2022/lib/core/pipes/aria-sort.pipe.mjs +31 -0
  24. package/esm2022/lib/core/pipes/cell-action-button-enable.pipe.mjs +3 -3
  25. package/esm2022/lib/core/pipes/cell-editable.pipe.mjs +3 -3
  26. package/esm2022/lib/core/pipes/cell-invalid.pipe.mjs +3 -3
  27. package/esm2022/lib/core/pipes/cell-key.pipe.mjs +3 -3
  28. package/esm2022/lib/core/pipes/cell-level-padding.pipe.mjs +3 -3
  29. package/esm2022/lib/core/pipes/cell-selected.pipe.mjs +3 -3
  30. package/esm2022/lib/core/pipes/cell-state-renderer.pipe.mjs +3 -3
  31. package/esm2022/lib/core/pipes/column-sort-state.pipe.mjs +3 -3
  32. package/esm2022/lib/core/pipes/header-checkbox-checked.pipe.mjs +3 -3
  33. package/esm2022/lib/core/pipes/header-checkbox-disabled.pipe.mjs +3 -3
  34. package/esm2022/lib/core/pipes/header-checkbox-indeterminate.pipe.mjs +3 -3
  35. package/esm2022/lib/core/services/og-column.service.mjs +153 -30
  36. package/esm2022/lib/core/services/one-grid-cell.service.mjs +39 -15
  37. package/esm2022/lib/helpers/one-cell.helper.mjs +30 -1
  38. package/esm2022/lib/helpers/one-column-def.helper.mjs +16 -1
  39. package/esm2022/lib/helpers/one-csv.helper.mjs +58 -0
  40. package/esm2022/lib/helpers/one-filter.helper.mjs +11 -1
  41. package/esm2022/lib/helpers/one-row-grouping.helper.mjs +103 -0
  42. package/esm2022/lib/index.mjs +3 -1
  43. package/esm2022/lib/one-grid.module.mjs +24 -114
  44. package/fesm2022/one-grid-core-angular.mjs +2322 -823
  45. package/fesm2022/one-grid-core-angular.mjs.map +1 -1
  46. package/lib/components/one-grid/one-grid.component.d.ts +101 -4
  47. package/lib/components/one-grid-body/one-grid-body.component.d.ts +83 -2
  48. package/lib/components/one-grid-cell-currency/one-grid-cell-currency.component.d.ts +1 -1
  49. package/lib/components/one-grid-cell-group-renderer/one-grid-cell-group-renderer.component.d.ts +1 -1
  50. package/lib/components/one-grid-cell-option-menu/one-grid-cell-option-menu.component.d.ts +1 -1
  51. package/lib/components/one-grid-checkbox/one-grid-checkbox.component.d.ts +1 -1
  52. package/lib/components/one-grid-checkbox-header/one-grid-checkbox-header.component.d.ts +1 -1
  53. package/lib/components/one-grid-header/one-grid-header.component.d.ts +69 -4
  54. package/lib/components/one-grid-header-menu/one-grid-header-menu.component.d.ts +52 -0
  55. package/lib/components/one-grid-pagination/one-grid-pagination.component.d.ts +1 -1
  56. package/lib/components/one-grid-row-action/one-grid-row-action.component.d.ts +1 -1
  57. package/lib/components/one-grid-row-drag-handle/one-grid-row-drag-handle.component.d.ts +1 -1
  58. package/lib/components/one-grid-status/one-grid-status.component.d.ts +1 -1
  59. package/lib/core/directives/one-cell-input-validator.directive.d.ts +1 -1
  60. package/lib/core/directives/one-cell-renderer-component.directive.d.ts +1 -1
  61. package/lib/core/directives/one-cell-text-expand.directive.d.ts +1 -1
  62. package/lib/core/icons/one-grid-icons.d.ts +35 -0
  63. package/lib/core/instants/one-grid-api.class.d.ts +115 -1
  64. package/lib/core/models/one-column-def-types.model.d.ts +77 -2
  65. package/lib/core/models/one-event-types.model.d.ts +19 -0
  66. package/lib/core/models/one-filter.model.d.ts +8 -1
  67. package/lib/core/pipes/aria-sort.pipe.d.ts +15 -0
  68. package/lib/core/pipes/cell-action-button-enable.pipe.d.ts +1 -1
  69. package/lib/core/pipes/cell-editable.pipe.d.ts +1 -1
  70. package/lib/core/pipes/cell-invalid.pipe.d.ts +1 -1
  71. package/lib/core/pipes/cell-key.pipe.d.ts +1 -1
  72. package/lib/core/pipes/cell-level-padding.pipe.d.ts +1 -1
  73. package/lib/core/pipes/cell-selected.pipe.d.ts +1 -1
  74. package/lib/core/pipes/cell-state-renderer.pipe.d.ts +1 -1
  75. package/lib/core/pipes/column-sort-state.pipe.d.ts +1 -1
  76. package/lib/core/pipes/header-checkbox-checked.pipe.d.ts +1 -1
  77. package/lib/core/pipes/header-checkbox-disabled.pipe.d.ts +1 -1
  78. package/lib/core/pipes/header-checkbox-indeterminate.pipe.d.ts +1 -1
  79. package/lib/core/services/og-column.service.d.ts +46 -2
  80. package/lib/core/services/one-grid-cell.service.d.ts +16 -3
  81. package/lib/helpers/one-cell.helper.d.ts +17 -0
  82. package/lib/helpers/one-column-def.helper.d.ts +9 -0
  83. package/lib/helpers/one-csv.helper.d.ts +29 -0
  84. package/lib/helpers/one-row-grouping.helper.d.ts +35 -0
  85. package/lib/index.d.ts +2 -0
  86. package/lib/one-grid.module.d.ts +15 -37
  87. package/package.json +1 -1
  88. package/scss/_one-grid.scss +127 -0
  89. package/esm2022/lib/core/pipes/cell-action-button-visible.pipe.mjs +0 -17
  90. package/esm2022/lib/core/pipes/cell-field-value-empty.pipe.mjs +0 -26
  91. package/esm2022/lib/core/pipes/cell-field-value.pipe.mjs +0 -25
  92. package/esm2022/lib/core/pipes/cell-field.pipe.mjs +0 -20
  93. package/esm2022/lib/core/pipes/cell-number-value.pipe.mjs +0 -19
  94. package/esm2022/lib/core/pipes/cell-state-group-renderer.pipe.mjs +0 -21
  95. package/esm2022/lib/core/pipes/cell-value-getter.pipe.mjs +0 -23
  96. package/lib/core/pipes/cell-action-button-visible.pipe.d.ts +0 -9
  97. package/lib/core/pipes/cell-field-value-empty.pipe.d.ts +0 -7
  98. package/lib/core/pipes/cell-field-value.pipe.d.ts +0 -7
  99. package/lib/core/pipes/cell-field.pipe.d.ts +0 -7
  100. package/lib/core/pipes/cell-number-value.pipe.d.ts +0 -7
  101. package/lib/core/pipes/cell-state-group-renderer.pipe.d.ts +0 -9
  102. package/lib/core/pipes/cell-value-getter.pipe.d.ts +0 -9
@@ -11,6 +11,14 @@ export class OgColumnService {
11
11
  * callbacks do. Set during init; null in a bare service.
12
12
  */
13
13
  this.context = null;
14
+ /**
15
+ * Every column, hidden ones included, in display order. `columnDefs$` below
16
+ * carries only the visible subset — it is what the header and body render
17
+ * from, so hiding a column means leaving it out of the emission, and every
18
+ * consumer keeps working with no notion of visibility at all. This list is
19
+ * what remembers a hidden column's place, width and pin for when it returns.
20
+ */
21
+ this.allColumnDefs = [];
14
22
  this.columnDefs$ = new BehaviorSubject([]);
15
23
  this.groupColumnDefs$ = new BehaviorSubject([]);
16
24
  }
@@ -38,9 +46,20 @@ export class OgColumnService {
38
46
  };
39
47
  return this.resolveHeaderPresentation(column);
40
48
  });
49
+ this.commit(columns);
50
+ }
51
+ /**
52
+ * Re-band, re-measure and publish a new column list.
53
+ *
54
+ * Every mutation funnels here so the master list and the visible emission
55
+ * cannot drift apart.
56
+ */
57
+ commit(columns) {
41
58
  const ordered = this.applyPinning(columns);
42
- this.recalculateGroups(ordered);
43
- this.columnDefs$.next(ordered);
59
+ this.allColumnDefs = ordered;
60
+ const visible = ordered.filter(column => !column.hide);
61
+ this.recalculateGroups(visible);
62
+ this.columnDefs$.next(visible);
44
63
  }
45
64
  /**
46
65
  * Move pinned columns to their edge and measure how far in each one sits.
@@ -64,11 +83,14 @@ export class OgColumnService {
64
83
  return columns;
65
84
  }
66
85
  const center = columns.filter(column => column.pinned !== 'left' && column.pinned !== 'right');
86
+ // Hidden columns keep their place in the band but take up no space, so
87
+ // they are skipped when measuring offsets and never carry the divider.
67
88
  let offset = 0;
68
89
  for (const column of left) {
69
90
  column._pinnedOffset = offset;
70
91
  column._pinnedEdge = false;
71
- offset += resolveColumnWidth(column);
92
+ if (!column.hide)
93
+ offset += resolveColumnWidth(column);
72
94
  }
73
95
  // Right-pinned columns are measured from the right edge inwards, so the
74
96
  // last declared one sits flush and the earlier ones stack outside it.
@@ -76,46 +98,146 @@ export class OgColumnService {
76
98
  for (let index = right.length - 1; index >= 0; index--) {
77
99
  right[index]._pinnedOffset = offset;
78
100
  right[index]._pinnedEdge = false;
79
- offset += resolveColumnWidth(right[index]);
101
+ if (!right[index].hide)
102
+ offset += resolveColumnWidth(right[index]);
80
103
  }
81
104
  for (const column of center) {
82
105
  column._pinnedOffset = null;
83
106
  column._pinnedEdge = false;
84
107
  }
85
- // Only the innermost column of each band carries the divider, so stacked
86
- // pinned columns do not each cast a shadow onto the next.
87
- if (left.length)
88
- left[left.length - 1]._pinnedEdge = true;
89
- if (right.length)
90
- right[0]._pinnedEdge = true;
108
+ // Only the innermost visible column of each band carries the divider, so
109
+ // stacked pinned columns do not each cast a shadow onto the next.
110
+ const leftVisible = left.filter(column => !column.hide);
111
+ const rightVisible = right.filter(column => !column.hide);
112
+ if (leftVisible.length)
113
+ leftVisible[leftVisible.length - 1]._pinnedEdge = true;
114
+ if (rightVisible.length)
115
+ rightVisible[0]._pinnedEdge = true;
91
116
  return [...left, ...center, ...right];
92
117
  }
93
- /** Total width of the columns frozen against the given edge. */
118
+ /** Total width of the visible columns frozen against the given edge. */
94
119
  getPinnedWidth(side) {
95
120
  return this.columnDefs$.getValue()
96
121
  .filter(column => column.pinned === side)
97
122
  .reduce((total, column) => total + resolveColumnWidth(column), 0);
98
123
  }
99
- // Update single column
124
+ // Update single column. Works on the master list, so a hidden column can be
125
+ // patched — including `hide` itself, which is how visibility toggles.
100
126
  updateColumnDef(id, changes) {
101
- const columns = this.getColumnState().columns;
102
- const updatedColumns = columns.map(col => col.id === id ? { ...col, ...changes } : col);
103
- // Re-pinned, not just re-grouped: resizing a pinned column changes where
104
- // the ones inside it have to sit, and this is the path a column resize
105
- // takes.
106
- const ordered = this.applyPinning(updatedColumns);
107
- this.recalculateGroups(ordered);
108
- this.columnDefs$.next(ordered);
109
- }
110
- // Reorder columns
127
+ const updatedColumns = this.allColumnDefs.map(col => col.id === id ? { ...col, ...changes } : col);
128
+ // Re-pinned (inside commit), not just re-grouped: resizing a pinned column
129
+ // changes where the ones inside it have to sit, and this is the path a
130
+ // column resize takes.
131
+ this.commit(updatedColumns);
132
+ }
133
+ /**
134
+ * Reorder columns. The indexes are *visible* positions — they come from the
135
+ * header, which only renders visible columns — so they are mapped onto the
136
+ * master list before splicing. A hidden column between the two keeps its
137
+ * place relative to its neighbours.
138
+ */
111
139
  reorderColumnDefs(fromIndex, toIndex) {
112
- const columns = lodash.clone(this.getColumnState().columns);
113
- const [moved] = columns.splice(fromIndex, 1);
114
- columns.splice(toIndex, 0, moved);
115
- // Dragging can drop a column between two pinned ones; re-pinning puts the
116
- // bands back in order rather than leaving them interleaved, which would
117
- // make the computed offsets meaningless.
118
- this.columnDefs$.next(this.applyPinning(columns));
140
+ const columns = lodash.clone(this.allColumnDefs);
141
+ const visible = columns.filter(column => !column.hide);
142
+ const moved = visible[fromIndex];
143
+ if (!moved)
144
+ return;
145
+ columns.splice(columns.indexOf(moved), 1);
146
+ // Land before the visible column now at the target index — the same splice
147
+ // the visible-only list used to do after removal — or at the end when the
148
+ // target is past the last visible column.
149
+ const visibleAfter = visible.filter(column => column !== moved);
150
+ const anchor = visibleAfter[toIndex];
151
+ columns.splice(anchor ? columns.indexOf(anchor) : columns.length, 0, moved);
152
+ // Dragging can drop a column between two pinned ones; re-pinning (inside
153
+ // commit) puts the bands back in order rather than leaving them
154
+ // interleaved, which would make the computed offsets meaningless.
155
+ this.commit(columns);
156
+ }
157
+ /**
158
+ * Distribute the viewport width left over by fixed columns among the flex
159
+ * ones, in proportion to their `flex` values and clamped to their bounds.
160
+ *
161
+ * @returns Whether any width actually changed — the caller only dispatches
162
+ * (and the body only re-triggers) on a real change, which is what terminates
163
+ * the columnChanged → flex → columnChanged loop.
164
+ */
165
+ applyFlexWidths(availableWidth) {
166
+ const visible = this.columnDefs$.getValue();
167
+ const flexColumns = visible.filter(column => (column.flex ?? 0) > 0);
168
+ if (!flexColumns.length || !(availableWidth > 0))
169
+ return false;
170
+ const fixedWidth = visible
171
+ .filter(column => !((column.flex ?? 0) > 0))
172
+ .reduce((total, column) => total + resolveColumnWidth(column), 0);
173
+ let remaining = Math.max(availableWidth - fixedWidth, 0);
174
+ // Clamped columns stop flexing and release their share to the rest, so
175
+ // the pass repeats until the split is stable. Each pass settles at least
176
+ // one column; the loop is bounded by the column count.
177
+ const widths = new Map();
178
+ let unsettled = [...flexColumns];
179
+ while (unsettled.length) {
180
+ const totalFlex = unsettled.reduce((total, column) => total + (column.flex ?? 0), 0);
181
+ const share = remaining / totalFlex;
182
+ const clamped = unsettled.filter(column => {
183
+ const ideal = share * (column.flex ?? 0);
184
+ const min = Math.max(column.minWidth ?? 0, 50);
185
+ const max = column.maxWidth ?? Number.POSITIVE_INFINITY;
186
+ const width = Math.min(Math.max(ideal, min), max);
187
+ if (width === ideal)
188
+ return false;
189
+ widths.set(column.id, Math.round(width));
190
+ remaining = Math.max(remaining - width, 0);
191
+ return true;
192
+ });
193
+ unsettled = unsettled.filter(column => !clamped.includes(column));
194
+ if (!clamped.length) {
195
+ unsettled.forEach(column => widths.set(column.id, Math.floor(share * (column.flex ?? 0))));
196
+ break;
197
+ }
198
+ }
199
+ const changed = flexColumns.some(column => widths.get(column.id) !== resolveColumnWidth(column));
200
+ if (!changed)
201
+ return false;
202
+ this.commit(this.allColumnDefs.map(column => widths.has(column.id) ? { ...column, width: widths.get(column.id) } : column));
203
+ return true;
204
+ }
205
+ /**
206
+ * One JSON-safe entry per column — hidden ones included — in display order.
207
+ */
208
+ getColumnStateSnapshot() {
209
+ return this.allColumnDefs.map(column => {
210
+ const entry = { id: column.id, hide: !!column.hide, pinned: column.pinned ?? null };
211
+ if (column.width != null)
212
+ entry.width = column.width;
213
+ return entry;
214
+ });
215
+ }
216
+ /**
217
+ * Restore a saved snapshot: order, width, pin and visibility.
218
+ *
219
+ * Entries are applied in the order given and become the front of the new
220
+ * column order; columns the snapshot does not mention keep their current
221
+ * relative order behind them, and ids the grid no longer has are skipped —
222
+ * so a stale snapshot degrades to a partial restore instead of an error.
223
+ * Only the properties present on an entry are applied.
224
+ */
225
+ applyColumnState(entries) {
226
+ const byId = new Map(this.allColumnDefs.map(column => [column.id, column]));
227
+ const mentioned = (entries ?? []).filter(entry => entry && byId.has(entry.id));
228
+ const mentionedIds = new Set(mentioned.map(entry => entry.id));
229
+ const restored = mentioned.map(entry => {
230
+ const column = { ...byId.get(entry.id) };
231
+ if (entry.width != null)
232
+ column.width = entry.width;
233
+ if ('pinned' in entry)
234
+ column.pinned = entry.pinned ?? undefined;
235
+ if ('hide' in entry)
236
+ column.hide = !!entry.hide;
237
+ return column;
238
+ });
239
+ const rest = this.allColumnDefs.filter(column => !mentionedIds.has(column.id));
240
+ this.commit([...restored, ...rest]);
119
241
  }
120
242
  /**
121
243
  * Group Header Columns
@@ -161,6 +283,7 @@ export class OgColumnService {
161
283
  col._resolvedSortable = resolveOneCellRendererParams(col.sortable, params);
162
284
  col._resolvedResizable = resolveOneCellRendererParams(col.resizable, params);
163
285
  col._resolvedDragable = resolveOneCellRendererParams(col.dragable, params);
286
+ col._resolvedFilterable = resolveOneCellRendererParams(col.filterable, params);
164
287
  col._resolvedSuppressHeaderMenuButton = resolveOneCellRendererParams(col.suppressHeaderMenuButton, params);
165
288
  return col;
166
289
  }
@@ -185,4 +308,4 @@ export class OgColumnService {
185
308
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: OgColumnService, decorators: [{
186
309
  type: Injectable
187
310
  }] });
188
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2ctY29sdW1uLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vbmUtZ3JpZC9zcmMvbGliL2NvcmUvc2VydmljZXMvb2ctY29sdW1uLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXZDLE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUU1QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQzs7QUFHdkcsTUFBTSxPQUFPLGVBQWU7SUFENUI7UUFHVSxxQkFBZ0IsR0FBaUIsSUFBSSxDQUFDO1FBRTlDOzs7V0FHRztRQUNLLFlBQU8sR0FBWSxJQUFJLENBQUM7UUFDeEIsZ0JBQVcsR0FBRyxJQUFJLGVBQWUsQ0FBaUIsRUFBRSxDQUFDLENBQUM7UUFDdEQscUJBQWdCLEdBQUcsSUFBSSxlQUFlLENBQXNCLEVBQUUsQ0FBQyxDQUFDO0tBdU96RTtJQXJPQyxjQUFjLENBQUMsZ0JBQThCLEVBQUUsVUFBMEIsRUFBRSxlQUFvQyxFQUFFLFVBQW1CLElBQUk7UUFFdEksSUFBSSxDQUFDLGdCQUFnQixHQUFHLGdCQUFnQixDQUFDO1FBRXpDLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBRXZCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUV6QyxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRCxjQUFjO1FBRVosTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUU1QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLENBQUM7UUFF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Q3ZGLENBQUM7K0dBaFBVLGVBQWU7bUhBQWYsZUFBZTs7NEZBQWYsZUFBZTtrQkFEM0IsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgT25lQ2VsbFByZXNlbnRhdGlvblBhcmFtcywgT25lQ2VsbFJlbmRlcmVyUGFyYW1zLCBPbmVDb2x1bW5EZWYsIE9uZUdyb3VwQ29sdW1uRGVmLCBPbmVIZWFkZXJQcmVzZW50YXRpb25QYXJhbXMgfSBmcm9tICcuLi9tb2RlbHMvb25lLWNvbHVtbi1kZWYtdHlwZXMubW9kZWwnO1xuaW1wb3J0IGxvZGFzaCBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgQ29sdW1uQ2hhbmdlZEV2ZW50IH0gZnJvbSAnLi4vbW9kZWxzL29uZS1ldmVudC10eXBlcy5tb2RlbCc7XG5pbXBvcnQgeyByZXNvbHZlQ29sdW1uV2lkdGgsIHJlc29sdmVPbmVDZWxsUmVuZGVyZXJQYXJhbXMgfSBmcm9tICcuLi8uLi9oZWxwZXJzL29uZS1jb2x1bW4tZGVmLmhlbHBlcic7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBPZ0NvbHVtblNlcnZpY2Uge1xuXG4gIHByaXZhdGUgZGVmYXVsdENvbHVtbkRlZjogT25lQ29sdW1uRGVmID0gbnVsbDtcblxuICAvKipcbiAgICogVGhlIGdyaWQncyBgY29udGV4dGAsIHNvIGhlYWRlciBjYWxsYmFja3MgcmVjZWl2ZSB0aGUgc2FtZSBvbmUgY2VsbFxuICAgKiBjYWxsYmFja3MgZG8uIFNldCBkdXJpbmcgaW5pdDsgbnVsbCBpbiBhIGJhcmUgc2VydmljZS5cbiAgICovXG4gIHByaXZhdGUgY29udGV4dDogdW5rbm93biA9IG51bGw7XG4gIHByaXZhdGUgY29sdW1uRGVmcyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PE9uZUNvbHVtbkRlZltdPihbXSk7XG4gIHByaXZhdGUgZ3JvdXBDb2x1bW5EZWZzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8T25lR3JvdXBDb2x1bW5EZWZbXT4oW10pO1xuXG4gIGluaXRDb2x1bW5EZWZzKGRlZmF1bHRDb2x1bW5EZWY6IE9uZUNvbHVtbkRlZiwgY29sdW1uRGVmczogT25lQ29sdW1uRGVmW10sIGdyb3VwQ29sdW1uRGVmczogT25lR3JvdXBDb2x1bW5EZWZbXSwgY29udGV4dDogdW5rbm93biA9IG51bGwpOiB2b2lkIHtcblxuICAgIHRoaXMuZGVmYXVsdENvbHVtbkRlZiA9IGRlZmF1bHRDb2x1bW5EZWY7XG5cbiAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuXG4gICAgdGhpcy5zZXRHcm91cENvbHVtbkRlZnMoZ3JvdXBDb2x1bW5EZWZzKTtcbiAgICBcbiAgICB0aGlzLnNldENvbHVtbkRlZnMoY29sdW1uRGVmcyk7XG4gIH1cblxuICBnZXRDb2x1bW5TdGF0ZSgpOiBDb2x1bW5DaGFuZ2VkRXZlbnQge1xuXG4gICAgY29uc3QgY29sdW1ucyA9IHRoaXMuY29sdW1uRGVmcyQuZ2V0VmFsdWUoKTtcblxuICAgIGNvbnN0IGdyb3VwcyA9IHRoaXMuZ3JvdXBDb2x1bW5EZWZzJC5nZXRWYWx1ZSgpO1xuXG4gICAgcmV0dXJuIHsgY29sdW1ucywgZ3JvdXBzIH07XG4gIH1cblxuICBzZXRHcm91cENvbHVtbkRlZnMoZ3JvdXBDb2x1bW5EZWZzOiBPbmVHcm91cENvbHVtbkRlZltdKTogdm9pZCB7XG5cbiAgICBjb25zdCBncm91cHMgPSBncm91cENvbHVtbkRlZnMubWFwKChncm91cDogT25lR3JvdXBDb2x1bW5EZWYpID0+IHRoaXMucmVzb2x2ZUdyb3VwUHJlc2VudGF0aW9uKGdyb3VwLCB7IGNvbnRleHQ6IHRoaXMuY29udGV4dCB9KSk7XG5cbiAgICB0aGlzLmdyb3VwQ29sdW1uRGVmcyQubmV4dChncm91cHMpO1xuICB9XG5cbiAgc2V0Q29sdW1uRGVmcyhjb2x1bW5EZWZzOiBPbmVDb2x1bW5EZWZbXSk6IHZvaWQge1xuXG4gICAgY29uc3QgY29sdW1ucyA9IGNvbHVtbkRlZnMubWFwKChjb2w6IE9uZUNvbHVtbkRlZikgPT4ge1xuXG4gICAgICBjb25zdCBjb2x1bW4gPSB7XG4gICAgICAgIC4uLnRoaXMuZGVmYXVsdENvbHVtbkRlZixcbiAgICAgICAgLi4uY29sLFxuICAgICAgICBpZDogY29sPy5maWVsZCA/IGNvbC5maWVsZCA6IGxvZGFzaC51bmlxdWVJZCgnY29sXycpLFxuICAgICAgfTtcblxuICAgICAgcmV0dXJuIHRoaXMucmVzb2x2ZUhlYWRlclByZXNlbnRhdGlvbihjb2x1bW4pO1xuICAgIH0pO1xuXG4gICAgY29uc3Qgb3JkZXJlZCA9IHRoaXMuYXBwbHlQaW5uaW5nKGNvbHVtbnMpO1xuXG4gICAgdGhpcy5yZWNhbGN1bGF0ZUdyb3VwcyhvcmRlcmVkKTtcblxuICAgIHRoaXMuY29sdW1uRGVmcyQubmV4dChvcmRlcmVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb3ZlIHBpbm5lZCBjb2x1bW5zIHRvIHRoZWlyIGVkZ2UgYW5kIG1lYXN1cmUgaG93IGZhciBpbiBlYWNoIG9uZSBzaXRzLlxuICAgKlxuICAgKiBEaXNwbGF5IG9yZGVyIGJlY29tZXMgbGVmdC1waW5uZWQsIHVucGlubmVkLCByaWdodC1waW5uZWQsIHdpdGggZGVjbGFyZWRcbiAgICogb3JkZXIgcHJlc2VydmVkIGluc2lkZSBlYWNoIGJhbmQuIGBfcGlubmVkT2Zmc2V0YCBpcyB0aGUgZGlzdGFuY2UgZnJvbSB0aGF0XG4gICAqIGNvbHVtbidzIG93biBlZGdlIOKAlCB0aGUgc3VtIG9mIHRoZSB3aWR0aHMgb2YgdGhlIHBpbm5lZCBjb2x1bW5zIG91dHNpZGUgaXRcbiAgICog4oCUIHdoaWNoIGlzIHdoYXQgdGhlIHN0aWNreSBgbGVmdGAgLyBgcmlnaHRgIGJpbmRpbmcgbmVlZHMuXG4gICAqXG4gICAqIFdpdGggbm90aGluZyBwaW5uZWQgdGhpcyByZXR1cm5zIHRoZSBzYW1lIGFycmF5LCBpbiB0aGUgc2FtZSBvcmRlciwgc28gYVxuICAgKiBncmlkIHRoYXQgZG9lcyBub3QgdXNlIHRoZSBmZWF0dXJlIGlzIHVuYWZmZWN0ZWQuXG4gICAqL1xuICBwcml2YXRlIGFwcGx5UGlubmluZyhjb2x1bW5zOiBPbmVDb2x1bW5EZWZbXSk6IE9uZUNvbHVtbkRlZltdIHtcblxuICAgIGNvbnN0IGxlZnQgPSBjb2x1bW5zLmZpbHRlcihjb2x1bW4gPT4gY29sdW1uLnBpbm5lZCA9PT0gJ2xlZnQnKTtcbiAgICBjb25zdCByaWdodCA9IGNvbHVtbnMuZmlsdGVyKGNvbHVtbiA9PiBjb2x1bW4ucGlubmVkID09PSAncmlnaHQnKTtcblxuICAgIGlmICghbGVmdC5sZW5ndGggJiYgIXJpZ2h0Lmxlbmd0aCkge1xuXG4gICAgICBmb3IgKGNvbnN0IGNvbHVtbiBvZiBjb2x1bW5zKSB7XG5cbiAgICAgICAgY29sdW1uLl9waW5uZWRPZmZzZXQgPSBudWxsO1xuICAgICAgICBjb2x1bW4uX3Bpbm5lZEVkZ2UgPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNvbHVtbnM7XG4gICAgfVxuXG4gICAgY29uc3QgY2VudGVyID0gY29sdW1ucy5maWx0ZXIoY29sdW1uID0+IGNvbHVtbi5waW5uZWQgIT09ICdsZWZ0JyAmJiBjb2x1bW4ucGlubmVkICE9PSAncmlnaHQnKTtcblxuICAgIGxldCBvZmZzZXQgPSAwO1xuXG4gICAgZm9yIChjb25zdCBjb2x1bW4gb2YgbGVmdCkge1xuXG4gICAgICBjb2x1bW4uX3Bpbm5lZE9mZnNldCA9IG9mZnNldDtcbiAgICAgIGNvbHVtbi5fcGlubmVkRWRnZSA9IGZhbHNlO1xuXG4gICAgICBvZmZzZXQgKz0gcmVzb2x2ZUNvbHVtbldpZHRoKGNvbHVtbik7XG4gICAgfVxuXG4gICAgLy8gUmlnaHQtcGlubmVkIGNvbHVtbnMgYXJlIG1lYXN1cmVkIGZyb20gdGhlIHJpZ2h0IGVkZ2UgaW53YXJkcywgc28gdGhlXG4gICAgLy8gbGFzdCBkZWNsYXJlZCBvbmUgc2l0cyBmbHVzaCBhbmQgdGhlIGVhcmxpZXIgb25lcyBzdGFjayBvdXRzaWRlIGl0LlxuICAgIG9mZnNldCA9IDA7XG5cbiAgICBmb3IgKGxldCBpbmRleCA9IHJpZ2h0Lmxlbmd0aCAtIDE7IGluZGV4ID49IDA7IGluZGV4LS0pIHtcblxuICAgICAgcmlnaHRbaW5kZXhdLl9waW5uZWRPZmZzZXQgPSBvZmZzZXQ7XG4gICAgICByaWdodFtpbmRleF0uX3Bpbm5lZEVkZ2UgPSBmYWxzZTtcblxuICAgICAgb2Zmc2V0ICs9IHJlc29sdmVDb2x1bW5XaWR0aChyaWdodFtpbmRleF0pO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgY29sdW1uIG9mIGNlbnRlcikge1xuXG4gICAgICBjb2x1bW4uX3Bpbm5lZE9mZnNldCA9IG51bGw7XG4gICAgICBjb2x1bW4uX3Bpbm5lZEVkZ2UgPSBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBPbmx5IHRoZSBpbm5lcm1vc3QgY29sdW1uIG9mIGVhY2ggYmFuZCBjYXJyaWVzIHRoZSBkaXZpZGVyLCBzbyBzdGFja2VkXG4gICAgLy8gcGlubmVkIGNvbHVtbnMgZG8gbm90IGVhY2ggY2FzdCBhIHNoYWRvdyBvbnRvIHRoZSBuZXh0LlxuICAgIGlmIChsZWZ0Lmxlbmd0aCkgbGVmdFtsZWZ0Lmxlbmd0aCAtIDFdLl9waW5uZWRFZGdlID0gdHJ1ZTtcbiAgICBpZiAocmlnaHQubGVuZ3RoKSByaWdodFswXS5fcGlubmVkRWRnZSA9IHRydWU7XG5cbiAgICByZXR1cm4gWy4uLmxlZnQsIC4uLmNlbnRlciwgLi4ucmlnaHRdO1xuICB9XG5cbiAgLyoqIFRvdGFsIHdpZHRoIG9mIHRoZSBjb2x1bW5zIGZyb3plbiBhZ2FpbnN0IHRoZSBnaXZlbiBlZGdlLiAqL1xuICBwdWJsaWMgZ2V0UGlubmVkV2lkdGgoc2lkZTogJ2xlZnQnIHwgJ3JpZ2h0Jyk6IG51bWJlciB7XG5cbiAgICByZXR1cm4gdGhpcy5jb2x1bW5EZWZzJC5nZXRWYWx1ZSgpXG4gICAgICAuZmlsdGVyKGNvbHVtbiA9PiBjb2x1bW4ucGlubmVkID09PSBzaWRlKVxuICAgICAgLnJlZHVjZSgodG90YWwsIGNvbHVtbikgPT4gdG90YWwgKyByZXNvbHZlQ29sdW1uV2lkdGgoY29sdW1uKSwgMCk7XG4gIH1cblxuICAvLyBVcGRhdGUgc2luZ2xlIGNvbHVtblxuICB1cGRhdGVDb2x1bW5EZWYoaWQ6IHN0cmluZywgY2hhbmdlczogUGFydGlhbDxPbmVDb2x1bW5EZWY+KTogdm9pZCB7XG5cbiAgICBjb25zdCBjb2x1bW5zID0gdGhpcy5nZXRDb2x1bW5TdGF0ZSgpLmNvbHVtbnM7XG5cbiAgICBjb25zdCB1cGRhdGVkQ29sdW1ucyA9IGNvbHVtbnMubWFwKGNvbCA9PiBjb2wuaWQgPT09IGlkID8geyAuLi5jb2wsIC4uLmNoYW5nZXMgfSA6IGNvbCk7XG5cbiAgICAvLyBSZS1waW5uZWQsIG5vdCBqdXN0IHJlLWdyb3VwZWQ6IHJlc2l6aW5nIGEgcGlubmVkIGNvbHVtbiBjaGFuZ2VzIHdoZXJlXG4gICAgLy8gdGhlIG9uZXMgaW5zaWRlIGl0IGhhdmUgdG8gc2l0LCBhbmQgdGhpcyBpcyB0aGUgcGF0aCBhIGNvbHVtbiByZXNpemVcbiAgICAvLyB0YWtlcy5cbiAgICBjb25zdCBvcmRlcmVkID0gdGhpcy5hcHBseVBpbm5pbmcodXBkYXRlZENvbHVtbnMpO1xuXG4gICAgdGhpcy5yZWNhbGN1bGF0ZUdyb3VwcyhvcmRlcmVkKTtcblxuICAgIHRoaXMuY29sdW1uRGVmcyQubmV4dChvcmRlcmVkKTtcbiAgfVxuXG4gIC8vIFJlb3JkZXIgY29sdW1uc1xuICByZW9yZGVyQ29sdW1uRGVmcyhmcm9tSW5kZXg6IG51bWJlciwgdG9JbmRleDogbnVtYmVyKTogdm9pZCB7XG5cbiAgICBjb25zdCBjb2x1bW5zID0gbG9kYXNoLmNsb25lKHRoaXMuZ2V0Q29sdW1uU3RhdGUoKS5jb2x1bW5zKTtcblxuICAgIGNvbnN0IFttb3ZlZF0gPSBjb2x1bW5zLnNwbGljZShmcm9tSW5kZXgsIDEpO1xuXG4gICAgY29sdW1ucy5zcGxpY2UodG9JbmRleCwgMCwgbW92ZWQpO1xuXG4gICAgLy8gRHJhZ2dpbmcgY2FuIGRyb3AgYSBjb2x1bW4gYmV0d2VlbiB0d28gcGlubmVkIG9uZXM7IHJlLXBpbm5pbmcgcHV0cyB0aGVcbiAgICAvLyBiYW5kcyBiYWNrIGluIG9yZGVyIHJhdGhlciB0aGFuIGxlYXZpbmcgdGhlbSBpbnRlcmxlYXZlZCwgd2hpY2ggd291bGRcbiAgICAvLyBtYWtlIHRoZSBjb21wdXRlZCBvZmZzZXRzIG1lYW5pbmdsZXNzLlxuICAgIHRoaXMuY29sdW1uRGVmcyQubmV4dCh0aGlzLmFwcGx5UGlubmluZyhjb2x1bW5zKSk7XG4gIH1cblxuICAvKipcbiAgICogR3JvdXAgSGVhZGVyIENvbHVtbnNcbiAgICovXG4gIHByaXZhdGUgcmVjYWxjdWxhdGVHcm91cHMoY29sdW1uRGVmczogT25lQ29sdW1uRGVmW10pIHtcblxuICAgIGlmICh0aGlzLmdyb3VwQ29sdW1uRGVmcyQuZ2V0VmFsdWUoKS5sZW5ndGggPiAwKSB7XG5cbiAgICAgIGNvbnN0IGdyb3VwcyA9IHRoaXMuZ3JvdXBDb2x1bW5EZWZzJC52YWx1ZS5tYXAoZ3JvdXAgPT4gKHtcbiAgICAgICAgLi4uZ3JvdXAsXG4gICAgICAgIHdpZHRoOiBjb2x1bW5EZWZzLmZpbHRlcihjID0+IGMuZ3JvdXBJZCA9PT0gZ3JvdXAuaWQpLnJlZHVjZSgoc3VtLCBjb2wpID0+IHN1bSArIHJlc29sdmVDb2x1bW5XaWR0aChjb2wpLCAwKVxuICAgICAgfSkpO1xuXG4gICAgICB0aGlzLmdyb3VwQ29sdW1uRGVmcyQubmV4dChncm91cHMpO1xuICAgIH1cbiAgfVxuXG4gIHJlc29sdmVHcm91cFByZXNlbnRhdGlvbihjb2w6IE9uZUdyb3VwQ29sdW1uRGVmLCBwYXJhbXM/OiBPbmVDZWxsUmVuZGVyZXJQYXJhbXMpOiBPbmVHcm91cENvbHVtbkRlZiB7XG5cbiAgICBjb2wuX3Jlc29sdmVkR3JvdXBDbGFzcyA9IHR5cGVvZiBjb2wuZ3JvdXBDbGFzcyA9PT0gJ2Z1bmN0aW9uJyA/IGNvbC5ncm91cENsYXNzKHBhcmFtcykgOiBjb2wuZ3JvdXBDbGFzcztcbiAgICBjb2wuX3Jlc29sdmVkR3JvdXBTdHlsZSA9IHR5cGVvZiBjb2wuZ3JvdXBTdHlsZSA9PT0gJ2Z1bmN0aW9uJyA/IGNvbC5ncm91cFN0eWxlKHBhcmFtcykgOiBjb2wuZ3JvdXBTdHlsZTtcblxuICAgIHJldHVybiBjb2w7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSBhIGNvbHVtbidzIGhlYWRlciBwcmVzZW50YXRpb24uIE9uY2UgcGVyIGNvbHVtbiwgd2hlbiB0aGUgY29sdW1uc1xuICAgKiBhcmUgc2V0IOKAlCBhIGhlYWRlciBpcyBvbmUgY2VsbCBmb3IgdGhlIHdob2xlIGNvbHVtbiwgc28gdGhlcmUgaXMgbm8gcm93IHRvXG4gICAqIHJlc29sdmUgaXQgYWdhaW5zdCBhbmQgbm90aGluZyB0byByZWRvIHBlciByZW5kZXIuXG4gICAqXG4gICAqIFRoaXMgdXNlZCB0byByZXNvbHZlIHRoZSBjZWxsIGhvb2tzIHRvbywgZnJvbSB0aGUgc2FtZSBjYWxsLCB3aXRoIG5vIHBhcmFtc1xuICAgKiBhdCBhbGwuIFR3byBidWdzIGNhbWUgb3V0IG9mIHRoYXQ6IGFueSBjYWxsYmFjayB0b3VjaGluZyBgcGFyYW1zYCB0aHJldyBhXG4gICAqIFR5cGVFcnJvciBhdCBpbml0LCBhbmQgdGhlIGhlYWRlcidzIHJlc29sdmVkIHZhbHVlIHdhcyB0aGVuIG92ZXJ3cml0dGVuIGJ5XG4gICAqIGV2ZXJ5IGNlbGwgdGhhdCByZW5kZXJlZCwgc2luY2UgdGhlIGJvZHkgcmUtcmFuIHRoZSBzYW1lIG1ldGhvZCBwZXIgY2VsbFxuICAgKiB3aXRoIHJvdyBwYXJhbXMuIEluIGRldiBtb2RlIHRoZSBkaXNhZ3JlZW1lbnQgc3VyZmFjZWQgYXMgTkcwMTAwLlxuICAgKi9cbiAgcmVzb2x2ZUhlYWRlclByZXNlbnRhdGlvbihjb2w6IE9uZUNvbHVtbkRlZik6IE9uZUNvbHVtbkRlZiB7XG5cbiAgICBjb25zdCBwYXJhbXM6IE9uZUhlYWRlclByZXNlbnRhdGlvblBhcmFtcyA9IHtcbiAgICAgIGNvbHVtbkRlZjogY29sLFxuICAgICAgZmllbGQ6IGNvbC5maWVsZCBhcyBzdHJpbmcsXG4gICAgICBjb250ZXh0OiB0aGlzLmNvbnRleHQsXG4gICAgfTtcblxuICAgIGNvbC5fcmVzb2x2ZWRIZWFkZXJDbGFzcyA9IHR5cGVvZiBjb2wuaGVhZGVyQ2xhc3MgPT09ICdmdW5jdGlvbicgPyBjb2wuaGVhZGVyQ2xhc3MocGFyYW1zKSA6IGNvbC5oZWFkZXJDbGFzcztcbiAgICBjb2wuX3Jlc29sdmVkSGVhZGVyU3R5bGUgPSB0eXBlb2YgY29sLmhlYWRlclN0eWxlID09PSAnZnVuY3Rpb24nID8gY29sLmhlYWRlclN0eWxlKHBhcmFtcykgOiBjb2wuaGVhZGVyU3R5bGU7XG5cbiAgICAvLyBUaGUgaGVhZGVyJ3Mgb3duIHByZWRpY2F0ZXMuIERlY2xhcmVkIGFzIGBib29sZWFuIHwgKChwYXJhbXMpID0+IGJvb2xlYW4pYFxuICAgIC8vIGFuZCByZWFkIHN0cmFpZ2h0IG9mZiB0aGUgY29sdW1uIGluIHRoZSB0ZW1wbGF0ZSwgd2hlcmUgYSBmdW5jdGlvbiBpc1xuICAgIC8vIHNpbXBseSB0cnV0aHkg4oCUIHNvIGBzb3J0YWJsZTogKCkgPT4gZmFsc2VgIHJlbmRlcmVkIGEgc29ydCBidXR0b24gdGhhdCBhXG4gICAgLy8gY29uc3VtZXIgaGFkIGV4cGxpY2l0bHkgYXNrZWQgbm90IHRvIGhhdmUuIFJlc29sdmVkIGhlcmUgdG8gYSByZWFsXG4gICAgLy8gYm9vbGVhbiwgb25jZSwgYmVjYXVzZSBub25lIG9mIHRoZW0gZGVwZW5kcyBvbiBhIHJvdy5cbiAgICBjb2wuX3Jlc29sdmVkU29ydGFibGUgPSByZXNvbHZlT25lQ2VsbFJlbmRlcmVyUGFyYW1zKGNvbC5zb3J0YWJsZSwgcGFyYW1zKTtcbiAgICBjb2wuX3Jlc29sdmVkUmVzaXphYmxlID0gcmVzb2x2ZU9uZUNlbGxSZW5kZXJlclBhcmFtcyhjb2wucmVzaXphYmxlLCBwYXJhbXMpO1xuICAgIGNvbC5fcmVzb2x2ZWREcmFnYWJsZSA9IHJlc29sdmVPbmVDZWxsUmVuZGVyZXJQYXJhbXMoY29sLmRyYWdhYmxlLCBwYXJhbXMpO1xuICAgIGNvbC5fcmVzb2x2ZWRTdXBwcmVzc0hlYWRlck1lbnVCdXR0b24gPSByZXNvbHZlT25lQ2VsbFJlbmRlcmVyUGFyYW1zKGNvbC5zdXBwcmVzc0hlYWRlck1lbnVCdXR0b24sIHBhcmFtcyk7XG5cbiAgICByZXR1cm4gY29sO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgb25lIGNlbGwncyBjbGFzcywgZm9yIG9uZSByb3cuXG4gICAqXG4gICAqIFB1cmU6IHRoZSByZXN1bHQgaXMgcmV0dXJuZWQgcmF0aGVyIHRoYW4gd3JpdHRlbiBiYWNrIG9udG8gdGhlIGNvbHVtbiBkZWYsXG4gICAqIHdoaWNoIGV2ZXJ5IHJvdyBvZiB0aGF0IGNvbHVtbiBzaGFyZXMuIFdyaXRpbmcgdG8gaXQgd29ya2VkIG9ubHkgYmVjYXVzZVxuICAgKiB0aGUgdGVtcGxhdGUgcmVzb2x2ZWQgYW5kIHJlYWQgaW4gdGhlIHNhbWUgZXhwcmVzc2lvbiDigJQgb25lIHJlbmRlciBvcmRlclxuICAgKiBhd2F5IGZyb20gZXZlcnkgcm93IHNob3dpbmcgdGhlIGxhc3Qgcm93J3MgY2xhc3MuXG4gICAqL1xuICByZXNvbHZlQ2VsbENsYXNzKGNvbDogT25lQ29sdW1uRGVmLCBwYXJhbXM6IE9uZUNlbGxQcmVzZW50YXRpb25QYXJhbXMpOiBzdHJpbmcgfCBzdHJpbmdbXSB8IHVuZGVmaW5lZCB7XG5cbiAgICByZXR1cm4gdHlwZW9mIGNvbD8uY2VsbENsYXNzID09PSAnZnVuY3Rpb24nID8gY29sLmNlbGxDbGFzcyhwYXJhbXMpIDogY29sPy5jZWxsQ2xhc3M7XG4gIH1cblxuICAvKiogUmVzb2x2ZSBvbmUgY2VsbCdzIGlubGluZSBzdHlsZSwgZm9yIG9uZSByb3cuIFB1cmUsIGFzIGFib3ZlLiAqL1xuICByZXNvbHZlQ2VsbFN0eWxlKGNvbDogT25lQ29sdW1uRGVmLCBwYXJhbXM6IE9uZUNlbGxQcmVzZW50YXRpb25QYXJhbXMpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgdW5kZWZpbmVkIHtcblxuICAgIHJldHVybiB0eXBlb2YgY29sPy5jZWxsU3R5bGUgPT09ICdmdW5jdGlvbicgPyBjb2wuY2VsbFN0eWxlKHBhcmFtcykgOiBjb2w/LmNlbGxTdHlsZTtcbiAgfVxufSJdfQ==
311
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2ctY29sdW1uLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vbmUtZ3JpZC9zcmMvbGliL2NvcmUvc2VydmljZXMvb2ctY29sdW1uLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXZDLE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUU1QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQzs7QUFHdkcsTUFBTSxPQUFPLGVBQWU7SUFENUI7UUFHVSxxQkFBZ0IsR0FBaUIsSUFBSSxDQUFDO1FBRTlDOzs7V0FHRztRQUNLLFlBQU8sR0FBWSxJQUFJLENBQUM7UUFFaEM7Ozs7OztXQU1HO1FBQ0ssa0JBQWEsR0FBbUIsRUFBRSxDQUFDO1FBQ25DLGdCQUFXLEdBQUcsSUFBSSxlQUFlLENBQWlCLEVBQUUsQ0FBQyxDQUFDO1FBQ3RELHFCQUFnQixHQUFHLElBQUksZUFBZSxDQUFzQixFQUFFLENBQUMsQ0FBQztLQXlYekU7SUF2WEMsY0FBYyxDQUFDLGdCQUE4QixFQUFFLFVBQTBCLEVBQUUsZUFBb0MsRUFBRSxVQUFtQixJQUFJO1FBRXRJLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQztRQUV6QyxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUV2QixJQUFJLENBQUMsa0JBQWtCLENBQUMsZUFBZSxDQUFDLENBQUM7UUFFekMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQsY0FBYztRQUVaLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFLENBQUM7UUFFNUMsTUFBTSxNQUFNLEdB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O1FBRW5FLE9BQU8sT0FBTyxHQUFHLEVBQUUsU0FBUyxLQUFLLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLFNBQVMsQ0FBQztJQUN2RixDQUFDOytHQTNZVSxlQUFlO21IQUFmLGVBQWU7OzRGQUFmLGVBQWU7a0JBRDNCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IE9uZUNlbGxQcmVzZW50YXRpb25QYXJhbXMsIE9uZUNlbGxSZW5kZXJlclBhcmFtcywgT25lQ29sdW1uRGVmLCBPbmVDb2x1bW5TdGF0ZUVudHJ5LCBPbmVHcm91cENvbHVtbkRlZiwgT25lSGVhZGVyUHJlc2VudGF0aW9uUGFyYW1zIH0gZnJvbSAnLi4vbW9kZWxzL29uZS1jb2x1bW4tZGVmLXR5cGVzLm1vZGVsJztcbmltcG9ydCBsb2Rhc2ggZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IENvbHVtbkNoYW5nZWRFdmVudCB9IGZyb20gJy4uL21vZGVscy9vbmUtZXZlbnQtdHlwZXMubW9kZWwnO1xuaW1wb3J0IHsgcmVzb2x2ZUNvbHVtbldpZHRoLCByZXNvbHZlT25lQ2VsbFJlbmRlcmVyUGFyYW1zIH0gZnJvbSAnLi4vLi4vaGVscGVycy9vbmUtY29sdW1uLWRlZi5oZWxwZXInO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgT2dDb2x1bW5TZXJ2aWNlIHtcblxuICBwcml2YXRlIGRlZmF1bHRDb2x1bW5EZWY6IE9uZUNvbHVtbkRlZiA9IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBncmlkJ3MgYGNvbnRleHRgLCBzbyBoZWFkZXIgY2FsbGJhY2tzIHJlY2VpdmUgdGhlIHNhbWUgb25lIGNlbGxcbiAgICogY2FsbGJhY2tzIGRvLiBTZXQgZHVyaW5nIGluaXQ7IG51bGwgaW4gYSBiYXJlIHNlcnZpY2UuXG4gICAqL1xuICBwcml2YXRlIGNvbnRleHQ6IHVua25vd24gPSBudWxsO1xuXG4gIC8qKlxuICAgKiBFdmVyeSBjb2x1bW4sIGhpZGRlbiBvbmVzIGluY2x1ZGVkLCBpbiBkaXNwbGF5IG9yZGVyLiBgY29sdW1uRGVmcyRgIGJlbG93XG4gICAqIGNhcnJpZXMgb25seSB0aGUgdmlzaWJsZSBzdWJzZXQg4oCUIGl0IGlzIHdoYXQgdGhlIGhlYWRlciBhbmQgYm9keSByZW5kZXJcbiAgICogZnJvbSwgc28gaGlkaW5nIGEgY29sdW1uIG1lYW5zIGxlYXZpbmcgaXQgb3V0IG9mIHRoZSBlbWlzc2lvbiwgYW5kIGV2ZXJ5XG4gICAqIGNvbnN1bWVyIGtlZXBzIHdvcmtpbmcgd2l0aCBubyBub3Rpb24gb2YgdmlzaWJpbGl0eSBhdCBhbGwuIFRoaXMgbGlzdCBpc1xuICAgKiB3aGF0IHJlbWVtYmVycyBhIGhpZGRlbiBjb2x1bW4ncyBwbGFjZSwgd2lkdGggYW5kIHBpbiBmb3Igd2hlbiBpdCByZXR1cm5zLlxuICAgKi9cbiAgcHJpdmF0ZSBhbGxDb2x1bW5EZWZzOiBPbmVDb2x1bW5EZWZbXSA9IFtdO1xuICBwcml2YXRlIGNvbHVtbkRlZnMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxPbmVDb2x1bW5EZWZbXT4oW10pO1xuICBwcml2YXRlIGdyb3VwQ29sdW1uRGVmcyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PE9uZUdyb3VwQ29sdW1uRGVmW10+KFtdKTtcblxuICBpbml0Q29sdW1uRGVmcyhkZWZhdWx0Q29sdW1uRGVmOiBPbmVDb2x1bW5EZWYsIGNvbHVtbkRlZnM6IE9uZUNvbHVtbkRlZltdLCBncm91cENvbHVtbkRlZnM6IE9uZUdyb3VwQ29sdW1uRGVmW10sIGNvbnRleHQ6IHVua25vd24gPSBudWxsKTogdm9pZCB7XG5cbiAgICB0aGlzLmRlZmF1bHRDb2x1bW5EZWYgPSBkZWZhdWx0Q29sdW1uRGVmO1xuXG4gICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcblxuICAgIHRoaXMuc2V0R3JvdXBDb2x1bW5EZWZzKGdyb3VwQ29sdW1uRGVmcyk7XG4gICAgXG4gICAgdGhpcy5zZXRDb2x1bW5EZWZzKGNvbHVtbkRlZnMpO1xuICB9XG5cbiAgZ2V0Q29sdW1uU3RhdGUoKTogQ29sdW1uQ2hhbmdlZEV2ZW50IHtcblxuICAgIGNvbnN0IGNvbHVtbnMgPSB0aGlzLmNvbHVtbkRlZnMkLmdldFZhbHVlKCk7XG5cbiAgICBjb25zdCBncm91cHMgPSB0aGlzLmdyb3VwQ29sdW1uRGVmcyQuZ2V0VmFsdWUoKTtcblxuICAgIHJldHVybiB7IGNvbHVtbnMsIGdyb3VwcyB9O1xuICB9XG5cbiAgc2V0R3JvdXBDb2x1bW5EZWZzKGdyb3VwQ29sdW1uRGVmczogT25lR3JvdXBDb2x1bW5EZWZbXSk6IHZvaWQge1xuXG4gICAgY29uc3QgZ3JvdXBzID0gZ3JvdXBDb2x1bW5EZWZzLm1hcCgoZ3JvdXA6IE9uZUdyb3VwQ29sdW1uRGVmKSA9PiB0aGlzLnJlc29sdmVHcm91cFByZXNlbnRhdGlvbihncm91cCwgeyBjb250ZXh0OiB0aGlzLmNvbnRleHQgfSkpO1xuXG4gICAgdGhpcy5ncm91cENvbHVtbkRlZnMkLm5leHQoZ3JvdXBzKTtcbiAgfVxuXG4gIHNldENvbHVtbkRlZnMoY29sdW1uRGVmczogT25lQ29sdW1uRGVmW10pOiB2b2lkIHtcblxuICAgIGNvbnN0IGNvbHVtbnMgPSBjb2x1bW5EZWZzLm1hcCgoY29sOiBPbmVDb2x1bW5EZWYpID0+IHtcblxuICAgICAgY29uc3QgY29sdW1uID0ge1xuICAgICAgICAuLi50aGlzLmRlZmF1bHRDb2x1bW5EZWYsXG4gICAgICAgIC4uLmNvbCxcbiAgICAgICAgaWQ6IGNvbD8uZmllbGQgPyBjb2wuZmllbGQgOiBsb2Rhc2gudW5pcXVlSWQoJ2NvbF8nKSxcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiB0aGlzLnJlc29sdmVIZWFkZXJQcmVzZW50YXRpb24oY29sdW1uKTtcbiAgICB9KTtcblxuICAgIHRoaXMuY29tbWl0KGNvbHVtbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlLWJhbmQsIHJlLW1lYXN1cmUgYW5kIHB1Ymxpc2ggYSBuZXcgY29sdW1uIGxpc3QuXG4gICAqXG4gICAqIEV2ZXJ5IG11dGF0aW9uIGZ1bm5lbHMgaGVyZSBzbyB0aGUgbWFzdGVyIGxpc3QgYW5kIHRoZSB2aXNpYmxlIGVtaXNzaW9uXG4gICAqIGNhbm5vdCBkcmlmdCBhcGFydC5cbiAgICovXG4gIHByaXZhdGUgY29tbWl0KGNvbHVtbnM6IE9uZUNvbHVtbkRlZltdKTogdm9pZCB7XG5cbiAgICBjb25zdCBvcmRlcmVkID0gdGhpcy5hcHBseVBpbm5pbmcoY29sdW1ucyk7XG5cbiAgICB0aGlzLmFsbENvbHVtbkRlZnMgPSBvcmRlcmVkO1xuXG4gICAgY29uc3QgdmlzaWJsZSA9IG9yZGVyZWQuZmlsdGVyKGNvbHVtbiA9PiAhY29sdW1uLmhpZGUpO1xuXG4gICAgdGhpcy5yZWNhbGN1bGF0ZUdyb3Vwcyh2aXNpYmxlKTtcblxuICAgIHRoaXMuY29sdW1uRGVmcyQubmV4dCh2aXNpYmxlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb3ZlIHBpbm5lZCBjb2x1bW5zIHRvIHRoZWlyIGVkZ2UgYW5kIG1lYXN1cmUgaG93IGZhciBpbiBlYWNoIG9uZSBzaXRzLlxuICAgKlxuICAgKiBEaXNwbGF5IG9yZGVyIGJlY29tZXMgbGVmdC1waW5uZWQsIHVucGlubmVkLCByaWdodC1waW5uZWQsIHdpdGggZGVjbGFyZWRcbiAgICogb3JkZXIgcHJlc2VydmVkIGluc2lkZSBlYWNoIGJhbmQuIGBfcGlubmVkT2Zmc2V0YCBpcyB0aGUgZGlzdGFuY2UgZnJvbSB0aGF0XG4gICAqIGNvbHVtbidzIG93biBlZGdlIOKAlCB0aGUgc3VtIG9mIHRoZSB3aWR0aHMgb2YgdGhlIHBpbm5lZCBjb2x1bW5zIG91dHNpZGUgaXRcbiAgICog4oCUIHdoaWNoIGlzIHdoYXQgdGhlIHN0aWNreSBgbGVmdGAgLyBgcmlnaHRgIGJpbmRpbmcgbmVlZHMuXG4gICAqXG4gICAqIFdpdGggbm90aGluZyBwaW5uZWQgdGhpcyByZXR1cm5zIHRoZSBzYW1lIGFycmF5LCBpbiB0aGUgc2FtZSBvcmRlciwgc28gYVxuICAgKiBncmlkIHRoYXQgZG9lcyBub3QgdXNlIHRoZSBmZWF0dXJlIGlzIHVuYWZmZWN0ZWQuXG4gICAqL1xuICBwcml2YXRlIGFwcGx5UGlubmluZyhjb2x1bW5zOiBPbmVDb2x1bW5EZWZbXSk6IE9uZUNvbHVtbkRlZltdIHtcblxuICAgIGNvbnN0IGxlZnQgPSBjb2x1bW5zLmZpbHRlcihjb2x1bW4gPT4gY29sdW1uLnBpbm5lZCA9PT0gJ2xlZnQnKTtcbiAgICBjb25zdCByaWdodCA9IGNvbHVtbnMuZmlsdGVyKGNvbHVtbiA9PiBjb2x1bW4ucGlubmVkID09PSAncmlnaHQnKTtcblxuICAgIGlmICghbGVmdC5sZW5ndGggJiYgIXJpZ2h0Lmxlbmd0aCkge1xuXG4gICAgICBmb3IgKGNvbnN0IGNvbHVtbiBvZiBjb2x1bW5zKSB7XG5cbiAgICAgICAgY29sdW1uLl9waW5uZWRPZmZzZXQgPSBudWxsO1xuICAgICAgICBjb2x1bW4uX3Bpbm5lZEVkZ2UgPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNvbHVtbnM7XG4gICAgfVxuXG4gICAgY29uc3QgY2VudGVyID0gY29sdW1ucy5maWx0ZXIoY29sdW1uID0+IGNvbHVtbi5waW5uZWQgIT09ICdsZWZ0JyAmJiBjb2x1bW4ucGlubmVkICE9PSAncmlnaHQnKTtcblxuICAgIC8vIEhpZGRlbiBjb2x1bW5zIGtlZXAgdGhlaXIgcGxhY2UgaW4gdGhlIGJhbmQgYnV0IHRha2UgdXAgbm8gc3BhY2UsIHNvXG4gICAgLy8gdGhleSBhcmUgc2tpcHBlZCB3aGVuIG1lYXN1cmluZyBvZmZzZXRzIGFuZCBuZXZlciBjYXJyeSB0aGUgZGl2aWRlci5cbiAgICBsZXQgb2Zmc2V0ID0gMDtcblxuICAgIGZvciAoY29uc3QgY29sdW1uIG9mIGxlZnQpIHtcblxuICAgICAgY29sdW1uLl9waW5uZWRPZmZzZXQgPSBvZmZzZXQ7XG4gICAgICBjb2x1bW4uX3Bpbm5lZEVkZ2UgPSBmYWxzZTtcblxuICAgICAgaWYgKCFjb2x1bW4uaGlkZSkgb2Zmc2V0ICs9IHJlc29sdmVDb2x1bW5XaWR0aChjb2x1bW4pO1xuICAgIH1cblxuICAgIC8vIFJpZ2h0LXBpbm5lZCBjb2x1bW5zIGFyZSBtZWFzdXJlZCBmcm9tIHRoZSByaWdodCBlZGdlIGlud2FyZHMsIHNvIHRoZVxuICAgIC8vIGxhc3QgZGVjbGFyZWQgb25lIHNpdHMgZmx1c2ggYW5kIHRoZSBlYXJsaWVyIG9uZXMgc3RhY2sgb3V0c2lkZSBpdC5cbiAgICBvZmZzZXQgPSAwO1xuXG4gICAgZm9yIChsZXQgaW5kZXggPSByaWdodC5sZW5ndGggLSAxOyBpbmRleCA+PSAwOyBpbmRleC0tKSB7XG5cbiAgICAgIHJpZ2h0W2luZGV4XS5fcGlubmVkT2Zmc2V0ID0gb2Zmc2V0O1xuICAgICAgcmlnaHRbaW5kZXhdLl9waW5uZWRFZGdlID0gZmFsc2U7XG5cbiAgICAgIGlmICghcmlnaHRbaW5kZXhdLmhpZGUpIG9mZnNldCArPSByZXNvbHZlQ29sdW1uV2lkdGgocmlnaHRbaW5kZXhdKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGNvbHVtbiBvZiBjZW50ZXIpIHtcblxuICAgICAgY29sdW1uLl9waW5uZWRPZmZzZXQgPSBudWxsO1xuICAgICAgY29sdW1uLl9waW5uZWRFZGdlID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gT25seSB0aGUgaW5uZXJtb3N0IHZpc2libGUgY29sdW1uIG9mIGVhY2ggYmFuZCBjYXJyaWVzIHRoZSBkaXZpZGVyLCBzb1xuICAgIC8vIHN0YWNrZWQgcGlubmVkIGNvbHVtbnMgZG8gbm90IGVhY2ggY2FzdCBhIHNoYWRvdyBvbnRvIHRoZSBuZXh0LlxuICAgIGNvbnN0IGxlZnRWaXNpYmxlID0gbGVmdC5maWx0ZXIoY29sdW1uID0+ICFjb2x1bW4uaGlkZSk7XG4gICAgY29uc3QgcmlnaHRWaXNpYmxlID0gcmlnaHQuZmlsdGVyKGNvbHVtbiA9PiAhY29sdW1uLmhpZGUpO1xuXG4gICAgaWYgKGxlZnRWaXNpYmxlLmxlbmd0aCkgbGVmdFZpc2libGVbbGVmdFZpc2libGUubGVuZ3RoIC0gMV0uX3Bpbm5lZEVkZ2UgPSB0cnVlO1xuICAgIGlmIChyaWdodFZpc2libGUubGVuZ3RoKSByaWdodFZpc2libGVbMF0uX3Bpbm5lZEVkZ2UgPSB0cnVlO1xuXG4gICAgcmV0dXJuIFsuLi5sZWZ0LCAuLi5jZW50ZXIsIC4uLnJpZ2h0XTtcbiAgfVxuXG4gIC8qKiBUb3RhbCB3aWR0aCBvZiB0aGUgdmlzaWJsZSBjb2x1bW5zIGZyb3plbiBhZ2FpbnN0IHRoZSBnaXZlbiBlZGdlLiAqL1xuICBwdWJsaWMgZ2V0UGlubmVkV2lkdGgoc2lkZTogJ2xlZnQnIHwgJ3JpZ2h0Jyk6IG51bWJlciB7XG5cbiAgICByZXR1cm4gdGhpcy5jb2x1bW5EZWZzJC5nZXRWYWx1ZSgpXG4gICAgICAuZmlsdGVyKGNvbHVtbiA9PiBjb2x1bW4ucGlubmVkID09PSBzaWRlKVxuICAgICAgLnJlZHVjZSgodG90YWwsIGNvbHVtbikgPT4gdG90YWwgKyByZXNvbHZlQ29sdW1uV2lkdGgoY29sdW1uKSwgMCk7XG4gIH1cblxuICAvLyBVcGRhdGUgc2luZ2xlIGNvbHVtbi4gV29ya3Mgb24gdGhlIG1hc3RlciBsaXN0LCBzbyBhIGhpZGRlbiBjb2x1bW4gY2FuIGJlXG4gIC8vIHBhdGNoZWQg4oCUIGluY2x1ZGluZyBgaGlkZWAgaXRzZWxmLCB3aGljaCBpcyBob3cgdmlzaWJpbGl0eSB0b2dnbGVzLlxuICB1cGRhdGVDb2x1bW5EZWYoaWQ6IHN0cmluZywgY2hhbmdlczogUGFydGlhbDxPbmVDb2x1bW5EZWY+KTogdm9pZCB7XG5cbiAgICBjb25zdCB1cGRhdGVkQ29sdW1ucyA9IHRoaXMuYWxsQ29sdW1uRGVmcy5tYXAoY29sID0+IGNvbC5pZCA9PT0gaWQgPyB7IC4uLmNvbCwgLi4uY2hhbmdlcyB9IDogY29sKTtcblxuICAgIC8vIFJlLXBpbm5lZCAoaW5zaWRlIGNvbW1pdCksIG5vdCBqdXN0IHJlLWdyb3VwZWQ6IHJlc2l6aW5nIGEgcGlubmVkIGNvbHVtblxuICAgIC8vIGNoYW5nZXMgd2hlcmUgdGhlIG9uZXMgaW5zaWRlIGl0IGhhdmUgdG8gc2l0LCBhbmQgdGhpcyBpcyB0aGUgcGF0aCBhXG4gICAgLy8gY29sdW1uIHJlc2l6ZSB0YWtlcy5cbiAgICB0aGlzLmNvbW1pdCh1cGRhdGVkQ29sdW1ucyk7XG4gIH1cblxuICAvKipcbiAgICogUmVvcmRlciBjb2x1bW5zLiBUaGUgaW5kZXhlcyBhcmUgKnZpc2libGUqIHBvc2l0aW9ucyDigJQgdGhleSBjb21lIGZyb20gdGhlXG4gICAqIGhlYWRlciwgd2hpY2ggb25seSByZW5kZXJzIHZpc2libGUgY29sdW1ucyDigJQgc28gdGhleSBhcmUgbWFwcGVkIG9udG8gdGhlXG4gICAqIG1hc3RlciBsaXN0IGJlZm9yZSBzcGxpY2luZy4gQSBoaWRkZW4gY29sdW1uIGJldHdlZW4gdGhlIHR3byBrZWVwcyBpdHNcbiAgICogcGxhY2UgcmVsYXRpdmUgdG8gaXRzIG5laWdoYm91cnMuXG4gICAqL1xuICByZW9yZGVyQ29sdW1uRGVmcyhmcm9tSW5kZXg6IG51bWJlciwgdG9JbmRleDogbnVtYmVyKTogdm9pZCB7XG5cbiAgICBjb25zdCBjb2x1bW5zID0gbG9kYXNoLmNsb25lKHRoaXMuYWxsQ29sdW1uRGVmcyk7XG4gICAgY29uc3QgdmlzaWJsZSA9IGNvbHVtbnMuZmlsdGVyKGNvbHVtbiA9PiAhY29sdW1uLmhpZGUpO1xuXG4gICAgY29uc3QgbW92ZWQgPSB2aXNpYmxlW2Zyb21JbmRleF07XG5cbiAgICBpZiAoIW1vdmVkKSByZXR1cm47XG5cbiAgICBjb2x1bW5zLnNwbGljZShjb2x1bW5zLmluZGV4T2YobW92ZWQpLCAxKTtcblxuICAgIC8vIExhbmQgYmVmb3JlIHRoZSB2aXNpYmxlIGNvbHVtbiBub3cgYXQgdGhlIHRhcmdldCBpbmRleCDigJQgdGhlIHNhbWUgc3BsaWNlXG4gICAgLy8gdGhlIHZpc2libGUtb25seSBsaXN0IHVzZWQgdG8gZG8gYWZ0ZXIgcmVtb3ZhbCDigJQgb3IgYXQgdGhlIGVuZCB3aGVuIHRoZVxuICAgIC8vIHRhcmdldCBpcyBwYXN0IHRoZSBsYXN0IHZpc2libGUgY29sdW1uLlxuICAgIGNvbnN0IHZpc2libGVBZnRlciA9IHZpc2libGUuZmlsdGVyKGNvbHVtbiA9PiBjb2x1bW4gIT09IG1vdmVkKTtcbiAgICBjb25zdCBhbmNob3IgPSB2aXNpYmxlQWZ0ZXJbdG9JbmRleF07XG5cbiAgICBjb2x1bW5zLnNwbGljZShhbmNob3IgPyBjb2x1bW5zLmluZGV4T2YoYW5jaG9yKSA6IGNvbHVtbnMubGVuZ3RoLCAwLCBtb3ZlZCk7XG5cbiAgICAvLyBEcmFnZ2luZyBjYW4gZHJvcCBhIGNvbHVtbiBiZXR3ZWVuIHR3byBwaW5uZWQgb25lczsgcmUtcGlubmluZyAoaW5zaWRlXG4gICAgLy8gY29tbWl0KSBwdXRzIHRoZSBiYW5kcyBiYWNrIGluIG9yZGVyIHJhdGhlciB0aGFuIGxlYXZpbmcgdGhlbVxuICAgIC8vIGludGVybGVhdmVkLCB3aGljaCB3b3VsZCBtYWtlIHRoZSBjb21wdXRlZCBvZmZzZXRzIG1lYW5pbmdsZXNzLlxuICAgIHRoaXMuY29tbWl0KGNvbHVtbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3RyaWJ1dGUgdGhlIHZpZXdwb3J0IHdpZHRoIGxlZnQgb3ZlciBieSBmaXhlZCBjb2x1bW5zIGFtb25nIHRoZSBmbGV4XG4gICAqIG9uZXMsIGluIHByb3BvcnRpb24gdG8gdGhlaXIgYGZsZXhgIHZhbHVlcyBhbmQgY2xhbXBlZCB0byB0aGVpciBib3VuZHMuXG4gICAqXG4gICAqIEByZXR1cm5zIFdoZXRoZXIgYW55IHdpZHRoIGFjdHVhbGx5IGNoYW5nZWQg4oCUIHRoZSBjYWxsZXIgb25seSBkaXNwYXRjaGVzXG4gICAqIChhbmQgdGhlIGJvZHkgb25seSByZS10cmlnZ2Vycykgb24gYSByZWFsIGNoYW5nZSwgd2hpY2ggaXMgd2hhdCB0ZXJtaW5hdGVzXG4gICAqIHRoZSBjb2x1bW5DaGFuZ2VkIOKGkiBmbGV4IOKGkiBjb2x1bW5DaGFuZ2VkIGxvb3AuXG4gICAqL1xuICBhcHBseUZsZXhXaWR0aHMoYXZhaWxhYmxlV2lkdGg6IG51bWJlcik6IGJvb2xlYW4ge1xuXG4gICAgY29uc3QgdmlzaWJsZSA9IHRoaXMuY29sdW1uRGVmcyQuZ2V0VmFsdWUoKTtcbiAgICBjb25zdCBmbGV4Q29sdW1ucyA9IHZpc2libGUuZmlsdGVyKGNvbHVtbiA9PiAoY29sdW1uLmZsZXggPz8gMCkgPiAwKTtcblxuICAgIGlmICghZmxleENvbHVtbnMubGVuZ3RoIHx8ICEoYXZhaWxhYmxlV2lkdGggPiAwKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgY29uc3QgZml4ZWRXaWR0aCA9IHZpc2libGVcbiAgICAgIC5maWx0ZXIoY29sdW1uID0+ICEoKGNvbHVtbi5mbGV4ID8/IDApID4gMCkpXG4gICAgICAucmVkdWNlKCh0b3RhbCwgY29sdW1uKSA9PiB0b3RhbCArIHJlc29sdmVDb2x1bW5XaWR0aChjb2x1bW4pLCAwKTtcblxuICAgIGxldCByZW1haW5pbmcgPSBNYXRoLm1heChhdmFpbGFibGVXaWR0aCAtIGZpeGVkV2lkdGgsIDApO1xuXG4gICAgLy8gQ2xhbXBlZCBjb2x1bW5zIHN0b3AgZmxleGluZyBhbmQgcmVsZWFzZSB0aGVpciBzaGFyZSB0byB0aGUgcmVzdCwgc29cbiAgICAvLyB0aGUgcGFzcyByZXBlYXRzIHVudGlsIHRoZSBzcGxpdCBpcyBzdGFibGUuIEVhY2ggcGFzcyBzZXR0bGVzIGF0IGxlYXN0XG4gICAgLy8gb25lIGNvbHVtbjsgdGhlIGxvb3AgaXMgYm91bmRlZCBieSB0aGUgY29sdW1uIGNvdW50LlxuICAgIGNvbnN0IHdpZHRocyA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gICAgbGV0IHVuc2V0dGxlZCA9IFsuLi5mbGV4Q29sdW1uc107XG5cbiAgICB3aGlsZSAodW5zZXR0bGVkLmxlbmd0aCkge1xuXG4gICAgICBjb25zdCB0b3RhbEZsZXggPSB1bnNldHRsZWQucmVkdWNlKCh0b3RhbCwgY29sdW1uKSA9PiB0b3RhbCArIChjb2x1bW4uZmxleCA/PyAwKSwgMCk7XG4gICAgICBjb25zdCBzaGFyZSA9IHJlbWFpbmluZyAvIHRvdGFsRmxleDtcblxuICAgICAgY29uc3QgY2xhbXBlZCA9IHVuc2V0dGxlZC5maWx0ZXIoY29sdW1uID0+IHtcblxuICAgICAgICBjb25zdCBpZGVhbCA9IHNoYXJlICogKGNvbHVtbi5mbGV4ID8/IDApO1xuICAgICAgICBjb25zdCBtaW4gPSBNYXRoLm1heChjb2x1bW4ubWluV2lkdGggPz8gMCwgNTApO1xuICAgICAgICBjb25zdCBtYXggPSBjb2x1bW4ubWF4V2lkdGggPz8gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO1xuICAgICAgICBjb25zdCB3aWR0aCA9IE1hdGgubWluKE1hdGgubWF4KGlkZWFsLCBtaW4pLCBtYXgpO1xuXG4gICAgICAgIGlmICh3aWR0aCA9PT0gaWRlYWwpIHJldHVybiBmYWxzZTtcblxuICAgICAgICB3aWR0aHMuc2V0KGNvbHVtbi5pZCwgTWF0aC5yb3VuZCh3aWR0aCkpO1xuICAgICAgICByZW1haW5pbmcgPSBNYXRoLm1heChyZW1haW5pbmcgLSB3aWR0aCwgMCk7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9KTtcblxuICAgICAgdW5zZXR0bGVkID0gdW5zZXR0bGVkLmZpbHRlcihjb2x1bW4gPT4gIWNsYW1wZWQuaW5jbHVkZXMoY29sdW1uKSk7XG5cbiAgICAgIGlmICghY2xhbXBlZC5sZW5ndGgpIHtcblxuICAgICAgICB1bnNldHRsZWQuZm9yRWFjaChjb2x1bW4gPT4gd2lkdGhzLnNldChjb2x1bW4uaWQsIE1hdGguZmxvb3Ioc2hhcmUgKiAoY29sdW1uLmZsZXggPz8gMCkpKSk7XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgY2hhbmdlZCA9IGZsZXhDb2x1bW5zLnNvbWUoY29sdW1uID0+IHdpZHRocy5nZXQoY29sdW1uLmlkKSAhPT0gcmVzb2x2ZUNvbHVtbldpZHRoKGNvbHVtbikpO1xuXG4gICAgaWYgKCFjaGFuZ2VkKSByZXR1cm4gZmFsc2U7XG5cbiAgICB0aGlzLmNvbW1pdCh0aGlzLmFsbENvbHVtbkRlZnMubWFwKGNvbHVtbiA9PlxuICAgICAgd2lkdGhzLmhhcyhjb2x1bW4uaWQpID8geyAuLi5jb2x1bW4sIHdpZHRoOiB3aWR0aHMuZ2V0KGNvbHVtbi5pZCkgfSA6IGNvbHVtbikpO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogT25lIEpTT04tc2FmZSBlbnRyeSBwZXIgY29sdW1uIOKAlCBoaWRkZW4gb25lcyBpbmNsdWRlZCDigJQgaW4gZGlzcGxheSBvcmRlci5cbiAgICovXG4gIGdldENvbHVtblN0YXRlU25hcHNob3QoKTogT25lQ29sdW1uU3RhdGVFbnRyeVtdIHtcblxuICAgIHJldHVybiB0aGlzLmFsbENvbHVtbkRlZnMubWFwKGNvbHVtbiA9PiB7XG5cbiAgICAgIGNvbnN0IGVudHJ5OiBPbmVDb2x1bW5TdGF0ZUVudHJ5ID0geyBpZDogY29sdW1uLmlkLCBoaWRlOiAhIWNvbHVtbi5oaWRlLCBwaW5uZWQ6IGNvbHVtbi5waW5uZWQgPz8gbnVsbCB9O1xuXG4gICAgICBpZiAoY29sdW1uLndpZHRoICE9IG51bGwpIGVudHJ5LndpZHRoID0gY29sdW1uLndpZHRoO1xuXG4gICAgICByZXR1cm4gZW50cnk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVzdG9yZSBhIHNhdmVkIHNuYXBzaG90OiBvcmRlciwgd2lkdGgsIHBpbiBhbmQgdmlzaWJpbGl0eS5cbiAgICpcbiAgICogRW50cmllcyBhcmUgYXBwbGllZCBpbiB0aGUgb3JkZXIgZ2l2ZW4gYW5kIGJlY29tZSB0aGUgZnJvbnQgb2YgdGhlIG5ld1xuICAgKiBjb2x1bW4gb3JkZXI7IGNvbHVtbnMgdGhlIHNuYXBzaG90IGRvZXMgbm90IG1lbnRpb24ga2VlcCB0aGVpciBjdXJyZW50XG4gICAqIHJlbGF0aXZlIG9yZGVyIGJlaGluZCB0aGVtLCBhbmQgaWRzIHRoZSBncmlkIG5vIGxvbmdlciBoYXMgYXJlIHNraXBwZWQg4oCUXG4gICAqIHNvIGEgc3RhbGUgc25hcHNob3QgZGVncmFkZXMgdG8gYSBwYXJ0aWFsIHJlc3RvcmUgaW5zdGVhZCBvZiBhbiBlcnJvci5cbiAgICogT25seSB0aGUgcHJvcGVydGllcyBwcmVzZW50IG9uIGFuIGVudHJ5IGFyZSBhcHBsaWVkLlxuICAgKi9cbiAgYXBwbHlDb2x1bW5TdGF0ZShlbnRyaWVzOiBPbmVDb2x1bW5TdGF0ZUVudHJ5W10pOiB2b2lkIHtcblxuICAgIGNvbnN0IGJ5SWQgPSBuZXcgTWFwKHRoaXMuYWxsQ29sdW1uRGVmcy5tYXAoY29sdW1uID0+IFtjb2x1bW4uaWQsIGNvbHVtbl0pKTtcblxuICAgIGNvbnN0IG1lbnRpb25lZCA9IChlbnRyaWVzID8/IFtdKS5maWx0ZXIoZW50cnkgPT4gZW50cnkgJiYgYnlJZC5oYXMoZW50cnkuaWQpKTtcbiAgICBjb25zdCBtZW50aW9uZWRJZHMgPSBuZXcgU2V0KG1lbnRpb25lZC5tYXAoZW50cnkgPT4gZW50cnkuaWQpKTtcblxuICAgIGNvbnN0IHJlc3RvcmVkID0gbWVudGlvbmVkLm1hcChlbnRyeSA9PiB7XG5cbiAgICAgIGNvbnN0IGNvbHVtbiA9IHsgLi4uYnlJZC5nZXQoZW50cnkuaWQpIH07XG5cbiAgICAgIGlmIChlbnRyeS53aWR0aCAhPSBudWxsKSBjb2x1bW4ud2lkdGggPSBlbnRyeS53aWR0aDtcbiAgICAgIGlmICgncGlubmVkJyBpbiBlbnRyeSkgY29sdW1uLnBpbm5lZCA9IGVudHJ5LnBpbm5lZCA/PyB1bmRlZmluZWQ7XG4gICAgICBpZiAoJ2hpZGUnIGluIGVudHJ5KSBjb2x1bW4uaGlkZSA9ICEhZW50cnkuaGlkZTtcblxuICAgICAgcmV0dXJuIGNvbHVtbjtcbiAgICB9KTtcblxuICAgIGNvbnN0IHJlc3QgPSB0aGlzLmFsbENvbHVtbkRlZnMuZmlsdGVyKGNvbHVtbiA9PiAhbWVudGlvbmVkSWRzLmhhcyhjb2x1bW4uaWQpKTtcblxuICAgIHRoaXMuY29tbWl0KFsuLi5yZXN0b3JlZCwgLi4ucmVzdF0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyb3VwIEhlYWRlciBDb2x1bW5zXG4gICAqL1xuICBwcml2YXRlIHJlY2FsY3VsYXRlR3JvdXBzKGNvbHVtbkRlZnM6IE9uZUNvbHVtbkRlZltdKSB7XG5cbiAgICBpZiAodGhpcy5ncm91cENvbHVtbkRlZnMkLmdldFZhbHVlKCkubGVuZ3RoID4gMCkge1xuXG4gICAgICBjb25zdCBncm91cHMgPSB0aGlzLmdyb3VwQ29sdW1uRGVmcyQudmFsdWUubWFwKGdyb3VwID0+ICh7XG4gICAgICAgIC4uLmdyb3VwLFxuICAgICAgICB3aWR0aDogY29sdW1uRGVmcy5maWx0ZXIoYyA9PiBjLmdyb3VwSWQgPT09IGdyb3VwLmlkKS5yZWR1Y2UoKHN1bSwgY29sKSA9PiBzdW0gKyByZXNvbHZlQ29sdW1uV2lkdGgoY29sKSwgMClcbiAgICAgIH0pKTtcblxuICAgICAgdGhpcy5ncm91cENvbHVtbkRlZnMkLm5leHQoZ3JvdXBzKTtcbiAgICB9XG4gIH1cblxuICByZXNvbHZlR3JvdXBQcmVzZW50YXRpb24oY29sOiBPbmVHcm91cENvbHVtbkRlZiwgcGFyYW1zPzogT25lQ2VsbFJlbmRlcmVyUGFyYW1zKTogT25lR3JvdXBDb2x1bW5EZWYge1xuXG4gICAgY29sLl9yZXNvbHZlZEdyb3VwQ2xhc3MgPSB0eXBlb2YgY29sLmdyb3VwQ2xhc3MgPT09ICdmdW5jdGlvbicgPyBjb2wuZ3JvdXBDbGFzcyhwYXJhbXMpIDogY29sLmdyb3VwQ2xhc3M7XG4gICAgY29sLl9yZXNvbHZlZEdyb3VwU3R5bGUgPSB0eXBlb2YgY29sLmdyb3VwU3R5bGUgPT09ICdmdW5jdGlvbicgPyBjb2wuZ3JvdXBTdHlsZShwYXJhbXMpIDogY29sLmdyb3VwU3R5bGU7XG5cbiAgICByZXR1cm4gY29sO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgYSBjb2x1bW4ncyBoZWFkZXIgcHJlc2VudGF0aW9uLiBPbmNlIHBlciBjb2x1bW4sIHdoZW4gdGhlIGNvbHVtbnNcbiAgICogYXJlIHNldCDigJQgYSBoZWFkZXIgaXMgb25lIGNlbGwgZm9yIHRoZSB3aG9sZSBjb2x1bW4sIHNvIHRoZXJlIGlzIG5vIHJvdyB0b1xuICAgKiByZXNvbHZlIGl0IGFnYWluc3QgYW5kIG5vdGhpbmcgdG8gcmVkbyBwZXIgcmVuZGVyLlxuICAgKlxuICAgKiBUaGlzIHVzZWQgdG8gcmVzb2x2ZSB0aGUgY2VsbCBob29rcyB0b28sIGZyb20gdGhlIHNhbWUgY2FsbCwgd2l0aCBubyBwYXJhbXNcbiAgICogYXQgYWxsLiBUd28gYnVncyBjYW1lIG91dCBvZiB0aGF0OiBhbnkgY2FsbGJhY2sgdG91Y2hpbmcgYHBhcmFtc2AgdGhyZXcgYVxuICAgKiBUeXBlRXJyb3IgYXQgaW5pdCwgYW5kIHRoZSBoZWFkZXIncyByZXNvbHZlZCB2YWx1ZSB3YXMgdGhlbiBvdmVyd3JpdHRlbiBieVxuICAgKiBldmVyeSBjZWxsIHRoYXQgcmVuZGVyZWQsIHNpbmNlIHRoZSBib2R5IHJlLXJhbiB0aGUgc2FtZSBtZXRob2QgcGVyIGNlbGxcbiAgICogd2l0aCByb3cgcGFyYW1zLiBJbiBkZXYgbW9kZSB0aGUgZGlzYWdyZWVtZW50IHN1cmZhY2VkIGFzIE5HMDEwMC5cbiAgICovXG4gIHJlc29sdmVIZWFkZXJQcmVzZW50YXRpb24oY29sOiBPbmVDb2x1bW5EZWYpOiBPbmVDb2x1bW5EZWYge1xuXG4gICAgY29uc3QgcGFyYW1zOiBPbmVIZWFkZXJQcmVzZW50YXRpb25QYXJhbXMgPSB7XG4gICAgICBjb2x1bW5EZWY6IGNvbCxcbiAgICAgIGZpZWxkOiBjb2wuZmllbGQgYXMgc3RyaW5nLFxuICAgICAgY29udGV4dDogdGhpcy5jb250ZXh0LFxuICAgIH07XG5cbiAgICBjb2wuX3Jlc29sdmVkSGVhZGVyQ2xhc3MgPSB0eXBlb2YgY29sLmhlYWRlckNsYXNzID09PSAnZnVuY3Rpb24nID8gY29sLmhlYWRlckNsYXNzKHBhcmFtcykgOiBjb2wuaGVhZGVyQ2xhc3M7XG4gICAgY29sLl9yZXNvbHZlZEhlYWRlclN0eWxlID0gdHlwZW9mIGNvbC5oZWFkZXJTdHlsZSA9PT0gJ2Z1bmN0aW9uJyA/IGNvbC5oZWFkZXJTdHlsZShwYXJhbXMpIDogY29sLmhlYWRlclN0eWxlO1xuXG4gICAgLy8gVGhlIGhlYWRlcidzIG93biBwcmVkaWNhdGVzLiBEZWNsYXJlZCBhcyBgYm9vbGVhbiB8ICgocGFyYW1zKSA9PiBib29sZWFuKWBcbiAgICAvLyBhbmQgcmVhZCBzdHJhaWdodCBvZmYgdGhlIGNvbHVtbiBpbiB0aGUgdGVtcGxhdGUsIHdoZXJlIGEgZnVuY3Rpb24gaXNcbiAgICAvLyBzaW1wbHkgdHJ1dGh5IOKAlCBzbyBgc29ydGFibGU6ICgpID0+IGZhbHNlYCByZW5kZXJlZCBhIHNvcnQgYnV0dG9uIHRoYXQgYVxuICAgIC8vIGNvbnN1bWVyIGhhZCBleHBsaWNpdGx5IGFza2VkIG5vdCB0byBoYXZlLiBSZXNvbHZlZCBoZXJlIHRvIGEgcmVhbFxuICAgIC8vIGJvb2xlYW4sIG9uY2UsIGJlY2F1c2Ugbm9uZSBvZiB0aGVtIGRlcGVuZHMgb24gYSByb3cuXG4gICAgY29sLl9yZXNvbHZlZFNvcnRhYmxlID0gcmVzb2x2ZU9uZUNlbGxSZW5kZXJlclBhcmFtcyhjb2wuc29ydGFibGUsIHBhcmFtcyk7XG4gICAgY29sLl9yZXNvbHZlZFJlc2l6YWJsZSA9IHJlc29sdmVPbmVDZWxsUmVuZGVyZXJQYXJhbXMoY29sLnJlc2l6YWJsZSwgcGFyYW1zKTtcbiAgICBjb2wuX3Jlc29sdmVkRHJhZ2FibGUgPSByZXNvbHZlT25lQ2VsbFJlbmRlcmVyUGFyYW1zKGNvbC5kcmFnYWJsZSwgcGFyYW1zKTtcbiAgICBjb2wuX3Jlc29sdmVkRmlsdGVyYWJsZSA9IHJlc29sdmVPbmVDZWxsUmVuZGVyZXJQYXJhbXMoY29sLmZpbHRlcmFibGUsIHBhcmFtcyk7XG4gICAgY29sLl9yZXNvbHZlZFN1cHByZXNzSGVhZGVyTWVudUJ1dHRvbiA9IHJlc29sdmVPbmVDZWxsUmVuZGVyZXJQYXJhbXMoY29sLnN1cHByZXNzSGVhZGVyTWVudUJ1dHRvbiwgcGFyYW1zKTtcblxuICAgIHJldHVybiBjb2w7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSBvbmUgY2VsbCdzIGNsYXNzLCBmb3Igb25lIHJvdy5cbiAgICpcbiAgICogUHVyZTogdGhlIHJlc3VsdCBpcyByZXR1cm5lZCByYXRoZXIgdGhhbiB3cml0dGVuIGJhY2sgb250byB0aGUgY29sdW1uIGRlZixcbiAgICogd2hpY2ggZXZlcnkgcm93IG9mIHRoYXQgY29sdW1uIHNoYXJlcy4gV3JpdGluZyB0byBpdCB3b3JrZWQgb25seSBiZWNhdXNlXG4gICAqIHRoZSB0ZW1wbGF0ZSByZXNvbHZlZCBhbmQgcmVhZCBpbiB0aGUgc2FtZSBleHByZXNzaW9uIOKAlCBvbmUgcmVuZGVyIG9yZGVyXG4gICAqIGF3YXkgZnJvbSBldmVyeSByb3cgc2hvd2luZyB0aGUgbGFzdCByb3cncyBjbGFzcy5cbiAgICovXG4gIHJlc29sdmVDZWxsQ2xhc3MoY29sOiBPbmVDb2x1bW5EZWYsIHBhcmFtczogT25lQ2VsbFByZXNlbnRhdGlvblBhcmFtcyk6IHN0cmluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHtcblxuICAgIHJldHVybiB0eXBlb2YgY29sPy5jZWxsQ2xhc3MgPT09ICdmdW5jdGlvbicgPyBjb2wuY2VsbENsYXNzKHBhcmFtcykgOiBjb2w/LmNlbGxDbGFzcztcbiAgfVxuXG4gIC8qKiBSZXNvbHZlIG9uZSBjZWxsJ3MgaW5saW5lIHN0eWxlLCBmb3Igb25lIHJvdy4gUHVyZSwgYXMgYWJvdmUuICovXG4gIHJlc29sdmVDZWxsU3R5bGUoY29sOiBPbmVDb2x1bW5EZWYsIHBhcmFtczogT25lQ2VsbFByZXNlbnRhdGlvblBhcmFtcyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCB1bmRlZmluZWQge1xuXG4gICAgcmV0dXJuIHR5cGVvZiBjb2w/LmNlbGxTdHlsZSA9PT0gJ2Z1bmN0aW9uJyA/IGNvbC5jZWxsU3R5bGUocGFyYW1zKSA6IGNvbD8uY2VsbFN0eWxlO1xuICB9XG59Il19
@@ -1,14 +1,9 @@
1
1
  import { Injectable } from '@angular/core';
2
- import { CellFieldValueEmptyPipe } from '../pipes/cell-field-value-empty.pipe';
3
- import { resolveOneCellRendererParams, resolveOneValueGetterParams } from '../../helpers/one-column-def.helper';
4
- import { CellValueGetterPipe } from '../pipes/cell-value-getter.pipe';
5
- import { CellFieldValuePipe } from '../pipes/cell-field-value.pipe';
2
+ import { isCellEmpty, readCellValue } from '../../helpers/one-cell.helper';
3
+ import { resolveCellValueGetter, resolveOneCellRendererParams, resolveOneValueGetterParams } from '../../helpers/one-column-def.helper';
6
4
  import * as i0 from "@angular/core";
7
5
  export class OneGridCellService {
8
6
  constructor() {
9
- this._cellFieldValueEmpty = new CellFieldValueEmptyPipe();
10
- this._cellValueGetter = new CellValueGetterPipe();
11
- this._cellFieldValue = new CellFieldValuePipe();
12
7
  this._columnDefs = [];
13
8
  this._api = null;
14
9
  // ---------------------------------------------------------------------------
@@ -103,8 +98,8 @@ export class OneGridCellService {
103
98
  */
104
99
  resolveValue(node, column) {
105
100
  return column?.valueGetter
106
- ? this._cellValueGetter.transform(node.data, node, column, this._context)
107
- : this._cellFieldValue.transform(node.data, column.field);
101
+ ? resolveCellValueGetter(node.data, node, column, this._context)
102
+ : readCellValue(node.data, column.field);
108
103
  }
109
104
  /**
110
105
  * Apply the column's `valueFormatter`.
@@ -127,6 +122,28 @@ export class OneGridCellService {
127
122
  // is anything to format, and the formatter must see that same value.
128
123
  return column.valueFormatter({ ...this.cellParams(column, node), value });
129
124
  }
125
+ /**
126
+ * The placeholder for an empty cell, or `undefined` when this row's tree
127
+ * depth may not be edited.
128
+ *
129
+ * `cellRendererParams.placeholder` is a prompt, not data: it renders at half
130
+ * opacity where the value would go, which reads as "click here and fill this
131
+ * in". On the auto group column `editableLevels` decides which depths accept
132
+ * an edit at all, so a depth outside that list was advertising an edit the
133
+ * grid then refuses — the cell offers no input and the prompt never clears.
134
+ *
135
+ * The suppression is scoped to columns that actually declare `editableLevels`.
136
+ * The list is opt-in, and a column without one has no per-level rules rather
137
+ * than no editable levels, so plain grids and untouched tree columns keep
138
+ * showing their placeholder exactly as before.
139
+ */
140
+ resolvePlaceholder(node, column) {
141
+ const placeholder = column?.cellRendererParams?.placeholder;
142
+ const editableLevels = column?.editableLevels;
143
+ if (!column?.autoGroupField || !Array.isArray(editableLevels))
144
+ return placeholder;
145
+ return editableLevels.includes(node?.level) ? placeholder : undefined;
146
+ }
130
147
  /**
131
148
  * Generate New Node State Based on Column Field
132
149
  */
@@ -140,7 +157,7 @@ export class OneGridCellService {
140
157
  if (!field) {
141
158
  return { type: 'none', value: '' };
142
159
  }
143
- const isEmpty = this._cellFieldValueEmpty.transform(node.data, field);
160
+ const isEmpty = isCellEmpty(node.data, field);
144
161
  const isGroup = node.group || node.leafGroup;
145
162
  const isAutoGroup = column?.autoGroupField;
146
163
  if (column && column.cellRenderer && !isGroup) {
@@ -152,7 +169,7 @@ export class OneGridCellService {
152
169
  }
153
170
  // 1. Cell Group Placeholder
154
171
  if (isEmpty && isGroup && isAutoGroup) {
155
- return { type: 'placeholder', value: column?.cellRendererParams?.placeholder ?? this._cellValueGetter.transform(node.data, node, column, this._context) ?? '' };
172
+ return { type: 'placeholder', value: this.resolvePlaceholder(node, column) ?? resolveCellValueGetter(node.data, node, column, this._context) ?? '' };
156
173
  }
157
174
  // 2. Cell Group Text Value
158
175
  if (isGroup && isAutoGroup) {
@@ -167,11 +184,11 @@ export class OneGridCellService {
167
184
  // indented by level. Excluding it dropped every leaf through to case 5 and
168
185
  // rendered the group column blank for the whole bottom row of a tree.
169
186
  if (isEmpty && !isGroup) {
170
- const valueGetter = this._cellValueGetter.transform(node.data, node, column, this._context);
187
+ const valueGetter = resolveCellValueGetter(node.data, node, column, this._context);
171
188
  if (valueGetter) {
172
189
  return { type: 'text', value: this.formatValue(node, column, valueGetter) };
173
190
  }
174
- const placeholder = column?.cellRendererParams?.placeholder ?? '';
191
+ const placeholder = this.resolvePlaceholder(node, column) ?? '';
175
192
  return { type: 'placeholder', value: placeholder };
176
193
  }
177
194
  // 4. Cell Text Value (leaves, including the auto group column — see above)
@@ -179,7 +196,14 @@ export class OneGridCellService {
179
196
  const value = this.formatValue(node, column, this.resolveValue(node, column));
180
197
  return { type: 'text', value: value ?? '' };
181
198
  }
182
- // 5. Default
199
+ // 5. A group row outside the group column: render the value when the row
200
+ // actually carries one — aggregates land in these cells, and a tree
201
+ // parent's own data belongs on screen too. Blank stays blank.
202
+ if (!isEmpty) {
203
+ const value = this.formatValue(node, column, this.resolveValue(node, column));
204
+ return { type: 'text', value: value ?? '' };
205
+ }
206
+ // 6. Default
183
207
  return { type: 'none', value: '' };
184
208
  }
185
209
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: OneGridCellService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
@@ -188,4 +212,4 @@ export class OneGridCellService {
188
212
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: OneGridCellService, decorators: [{
189
213
  type: Injectable
190
214
  }] });
191
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib25lLWdyaWQtY2VsbC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb25lLWdyaWQvc3JjL2xpYi9jb3JlL3NlcnZpY2VzL29uZS1ncmlkLWNlbGwuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNDLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBRS9FLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSwyQkFBMkIsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ2hILE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDOztBQUlwRSxNQUFNLE9BQU8sa0JBQWtCO0lBRC9CO1FBR1UseUJBQW9CLEdBQUcsSUFBSSx1QkFBdUIsRUFBRSxDQUFDO1FBQ3JELHFCQUFnQixHQUFHLElBQUksbUJBQW1CLEVBQUUsQ0FBQztRQUM3QyxvQkFBZSxHQUFHLElBQUksa0JBQWtCLEVBQUUsQ0FBQztRQUMzQyxnQkFBVyxHQUFtQixFQUFFLENBQUM7UUFFakMsU0FBSSxHQUFzQixJQUFJLENBQUM7UUE0THZDLDhFQUE4RTtRQUM5RSwrQkFBK0I7UUFDL0IsRUFBRTtRQUNGLDZFQUE2RTtRQUM3RSw4RUFBOEU7UUFDOUUsa0VBQWtFO1FBQ2xFLDhFQUE4RTtRQUU5RSw0RUFBNEU7UUFDckUsZUFBVSxHQUFHLENBQUMsTUFBb0IsRUFBRSxJQUFnQixFQUFXLEVBQUUsQ0FDdEUsNEJBQTRCLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBRWhGOzs7Ozs7V0FNRztRQUNJLGdCQUFXLEdBQUcsQ0FBQyxNQUFvQixF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LGFBQWE7UUFDYixPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUM7SUFDckMsQ0FBQzsrR0FqTVUsa0JBQWtCO21IQUFsQixrQkFBa0I7OzRGQUFsQixrQkFBa0I7a0JBRDlCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPbmVDZWxsUHJlc2VudGF0aW9uUGFyYW1zLCBPbmVDZWxsU3RhdGUsIE9uZUNlbGxTdGF0ZXMsIE9uZUNvbHVtbkRlZiB9IGZyb20gJy4uL21vZGVscy9vbmUtY29sdW1uLWRlZi10eXBlcy5tb2RlbCc7XG5pbXBvcnQgeyBDZWxsRmllbGRWYWx1ZUVtcHR5UGlwZSB9IGZyb20gJy4uL3BpcGVzL2NlbGwtZmllbGQtdmFsdWUtZW1wdHkucGlwZSc7XG5pbXBvcnQgeyBPbmVSb3dOb2RlIH0gZnJvbSAnLi4vaW5zdGFudHMvb25lLXJvdy1ub2RlLmNsYXNzJztcbmltcG9ydCB7IHJlc29sdmVPbmVDZWxsUmVuZGVyZXJQYXJhbXMsIHJlc29sdmVPbmVWYWx1ZUdldHRlclBhcmFtcyB9IGZyb20gJy4uLy4uL2hlbHBlcnMvb25lLWNvbHVtbi1kZWYuaGVscGVyJztcbmltcG9ydCB7IENlbGxWYWx1ZUdldHRlclBpcGUgfSBmcm9tICcuLi9waXBlcy9jZWxsLXZhbHVlLWdldHRlci5waXBlJztcbmltcG9ydCB7IENlbGxGaWVsZFZhbHVlUGlwZSB9IGZyb20gJy4uL3BpcGVzL2NlbGwtZmllbGQtdmFsdWUucGlwZSc7XG5pbXBvcnQgdHlwZSB7IE9uZUdyaWRBcGkgfSBmcm9tICcuLi9pbnN0YW50cy9vbmUtZ3JpZC1hcGkuY2xhc3MnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgT25lR3JpZENlbGxTZXJ2aWNlIHtcblxuICBwcml2YXRlIF9jZWxsRmllbGRWYWx1ZUVtcHR5ID0gbmV3IENlbGxGaWVsZFZhbHVlRW1wdHlQaXBlKCk7XG4gIHByaXZhdGUgX2NlbGxWYWx1ZUdldHRlciA9IG5ldyBDZWxsVmFsdWVHZXR0ZXJQaXBlKCk7XG4gIHByaXZhdGUgX2NlbGxGaWVsZFZhbHVlID0gbmV3IENlbGxGaWVsZFZhbHVlUGlwZSgpO1xuICBwcml2YXRlIF9jb2x1bW5EZWZzOiBPbmVDb2x1bW5EZWZbXSA9IFtdO1xuICBwcml2YXRlIF9jb250ZXh0OiBhbnk7XG4gIHByaXZhdGUgX2FwaTogT25lR3JpZEFwaSB8IG51bGwgPSBudWxsO1xuXG4gIHB1YmxpYyBhcHBseUNvbHVtbkRlZnMoY29sdW1uRGVmczogT25lQ29sdW1uRGVmW10sIGNvbnRleHQ6IGFueSkge1xuXG4gICAgdGhpcy5fY29sdW1uRGVmcyA9IGNvbHVtbkRlZnM7XG4gICAgdGhpcy5fY29udGV4dCA9IGNvbnRleHQ7XG4gIH1cblxuICAvKipcbiAgICogQmFjay1yZWZlcmVuY2UgdG8gdGhlIGdyaWQgYXBpLCBzbyBwcmVkaWNhdGUgcGFyYW1zIGNhbiBjYXJyeSBpdC5cbiAgICpcbiAgICogUHVzaGVkIGluIHJhdGhlciB0aGFuIGluamVjdGVkOiBgT25lR3JpZEFwaWAgYWxyZWFkeSBkZXBlbmRzIG9uIHRoaXNcbiAgICogc2VydmljZSwgYW5kIGluamVjdGluZyBpdCBiYWNrIHdvdWxkIGNsb3NlIGEgREkgY3ljbGUuXG4gICAqL1xuICBwdWJsaWMgc2V0R3JpZEFwaShhcGk6IE9uZUdyaWRBcGkgfCBudWxsKTogdm9pZCB7XG5cbiAgICB0aGlzLl9hcGkgPSBhcGk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHBhcmFtcyBldmVyeSByb3ctc2NvcGVkIGNvbHVtbiBjYWxsYmFjayByZWNlaXZlcy5cbiAgICpcbiAgICogT25lIGJ1aWxkZXIsIGRlbGliZXJhdGVseTogYGVkaXRhYmxlYCwgYHVwZGF0YWJsZWAsIGBkaXNhYmxlYCwgYHJvd0RyYWdgLFxuICAgKiBgaGlkZUFjdGlvbkJ1dHRvbmAsIGBjZWxsQ2xhc3NgLCBgY2VsbFN0eWxlYCwgYGNlbGxSZW5kZXJlcmAgYW5kXG4gICAqIGB2YWx1ZUZvcm1hdHRlcmAgYXJlIGFsbCBcImRlY2lkZSBzb21ldGhpbmcgYWJvdXQgdGhpcyBjZWxsXCIsIGFuZCBhIGNvbnN1bWVyXG4gICAqIHNob3VsZCBub3QgaGF2ZSB0byByZW1lbWJlciB3aGljaCBvZiB0aGVtIGhhcHBlbnMgdG8gYmUgaGFuZGVkIGB2YWx1ZWAgb3JcbiAgICogYGZpZWxkYC4gRWFjaCB1c2VkIHRvIGJlIGNhbGxlZCB3aXRoIGEgc2xpZ2h0bHkgZGlmZmVyZW50IHN1YnNldC5cbiAgICovXG4gIHB1YmxpYyBjZWxsUGFyYW1zKGNvbHVtbjogT25lQ29sdW1uRGVmLCBub2RlOiBPbmVSb3dOb2RlKTogT25lQ2VsbFByZXNlbnRhdGlvblBhcmFtcyB7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLy8gQ29sdW1uIGNvbmZpZyBmaXJzdCwgc28gdGhlIGdyaWQncyBvd24gZmllbGRzIHdpbiBhIG5hbWUgY29sbGlzaW9uOiBhXG4gICAgICAvLyBzdGFsZSBgdmFsdWVgIGxlZnQgaW4gYGNlbGxSZW5kZXJlclBhcmFtc2AgbXVzdCBub3Qgc2hhZG93IHRoaXMgY2VsbCdzLlxuICAgICAgLi4uKGNvbHVtbj8uY2VsbFJlbmRlcmVyUGFyYW1zID8/IHt9KSxcbiAgICAgIHZhbHVlOiB0aGlzLnJlc29sdmVWYWx1ZShub2RlLCBjb2x1bW4pLFxuICAgICAgZGF0YTogbm9kZS5kYXRhLFxuICAgICAgbm9kZSxcbiAgICAgIHJvd0luZGV4OiBub2RlLnJvd0luZGV4LFxuICAgICAgZmllbGQ6IGNvbHVtbj8uZmllbGQgYXMgc3RyaW5nLFxuICAgICAgY29sdW1uRGVmOiBjb2x1bW4sXG4gICAgICBhcGk6IHRoaXMuX2FwaSA/PyB1bmRlZmluZWQsXG4gICAgICBjb250ZXh0OiB0aGlzLl9jb250ZXh0LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgTmV3IE5vZGUgU3RhdGVzXG4gICAqL1xuICBwdWJsaWMgZ2VuZXJhdGVDZWxsU3RhdGVzKG5vZGU6IE9uZVJvd05vZGUpOiBPbmVDZWxsU3RhdGVzIHwgbnVsbCB7XG5cbiAgICBpZiAoIW5vZGUpIHJldHVybiBudWxsO1xuXG4gICAgY29uc3QgbmV3U3RhdGVzOiBPbmVDZWxsU3RhdGVzID0ge307XG5cbiAgICBmb3IgKGNvbnN0IGNvbHVtbiBvZiB0aGlzLl9jb2x1bW5EZWZzKSB7XG5cbiAgICAgIGNvbnN0IGZpZWxkID0gY29sdW1uLmZpZWxkO1xuXG4gICAgICAvLyBDZWxsIHN0YXRlIGlzIGtleWVkIGJ5IGZpZWxkLCBzbyBhIGNvbHVtbiB3aXRob3V0IG9uZSBjb250cmlidXRlc1xuICAgICAgLy8gbm90aGluZy4gU2tpcHBpbmcgaXQga2VlcHMgYHVuZGVmaW5lZGAgb3V0IG9mIHRoZSBzdGF0ZSBvYmplY3Q7IHN1Y2ggYVxuICAgICAgLy8gY29sdW1uIHN0aWxsIHJlbmRlcnMgaXRzIGFjdGlvbiBidXR0b25zLCB3aGljaCBkbyBub3QgcmVhZCBjZWxsIHN0YXRlLlxuICAgICAgaWYgKCFmaWVsZCkgY29udGludWU7XG5cbiAgICAgIGlmIChmaWVsZCAhPT0gJ19vbmVSb3dOdW1iZXInKSB7XG5cbiAgICAgICAgbmV3U3RhdGVzW2ZpZWxkXSA9IHRoaXMuZ2VuZXJhdGVDZWxsU3RhdGUobm9kZSwgY29sdW1uKSA/PyBub2RlLmNlbGxTdGF0ZXNbZmllbGRdID8/IHsgdHlwZTogJ25vbmUnLCB2YWx1ZTogJycgfTtcblxuICAgICAgfSBlbHNlIHtcblxuICAgICAgICBuZXdTdGF0ZXNbZmllbGRdID0gbm9kZS5jZWxsU3RhdGVzW2ZpZWxkXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbmV3U3RhdGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBjZWxsJ3MgdmFsdWU6IHRoZSBgdmFsdWVHZXR0ZXJgJ3Mgb3V0cHV0IHdoZXJlIHRoZSBjb2x1bW4gZGVjbGFyZXMgb25lLFxuICAgKiB0aGUgcmF3IGZpZWxkIG90aGVyd2lzZS4gVGhpcyBpcyB0aGUgdmFsdWUsIG5vdCB0aGUgZGlzcGxheSB0ZXh0IOKAlCBzZWVcbiAgICoge0BsaW5rIGZvcm1hdFZhbHVlfS5cbiAgICovXG4gIHByaXZhdGUgcmVzb2x2ZVZhbHVlKG5vZGU6IE9uZVJvd05vZGUsIGNvbHVtbjogT25lQ29sdW1uRGVmKTogYW55IHtcblxuICAgIHJldHVybiBjb2x1bW4/LnZhbHVlR2V0dGVyXG4gICAgICA/IHRoaXMuX2NlbGxWYWx1ZUdldHRlci50cmFuc2Zvcm0obm9kZS5kYXRhLCBub2RlLCBjb2x1bW4sIHRoaXMuX2NvbnRleHQpXG4gICAgICA6IHRoaXMuX2NlbGxGaWVsZFZhbHVlLnRyYW5zZm9ybShub2RlLmRhdGEsIGNvbHVtbi5maWVsZCk7XG4gIH1cblxuICAvKipcbiAgICogQXBwbHkgdGhlIGNvbHVtbidzIGB2YWx1ZUZvcm1hdHRlcmAuXG4gICAqXG4gICAqIGB2YWx1ZUZvcm1hdHRlcmAgd2FzIGRlY2xhcmVkIG9uIHRoZSBjb2x1bW4gZGVmaW5pdGlvbiBhbmQgY2FsbGVkIGZyb21cbiAgICogbm93aGVyZSDigJQgYSBjb25zdW1lciBjb3VsZCB3cml0ZSBvbmUsIGdldCBubyBlcnJvciwgYW5kIHNlZSBub3RoaW5nIGhhcHBlbi5cbiAgICogSXQgcnVucyBvbiBkaXNwbGF5ZWQgdGV4dCBvbmx5LCBhZnRlciB0aGUgYHZhbHVlR2V0dGVyYCwgYW5kIGlzIGRlbGliZXJhdGVseVxuICAgKiBza2lwcGVkIGZvciBwbGFjZWhvbGRlcnM6IGFuIGVtcHR5IGNlbGwgYWxyZWFkeSBoYXMgaXRzIG93biBtZWNoYW5pc20gaW5cbiAgICogYGNlbGxSZW5kZXJlclBhcmFtcy5wbGFjZWhvbGRlcmAsIGFuZCB0d28gZmVhdHVyZXMgY29tcGV0aW5nIHRvIGZpbGwgdGhlXG4gICAqIHNhbWUgZ2FwIGlzIHdvcnNlIHRoYW4gb25lLlxuICAgKlxuICAgKiBOb3RlIHRoYXQgc29ydGluZyBhbmQgZmlsdGVyaW5nIHJlYWQgdGhlIHVuZGVybHlpbmcgcm93IGRhdGEsIG5vdCB0aGlzIOKAlFxuICAgKiB3aGljaCBpcyBleGFjdGx5IHdoeSBmb3JtYXR0aW5nIGJlbG9uZ3MgaGVyZSByYXRoZXIgdGhhbiBpbiB0aGUgZ2V0dGVyLlxuICAgKi9cbiAgcHJpdmF0ZSBmb3JtYXRWYWx1ZShub2RlOiBPbmVSb3dOb2RlLCBjb2x1bW46IE9uZUNvbHVtbkRlZiwgdmFsdWU6IGFueSk6IGFueSB7XG5cbiAgICBpZiAodHlwZW9mIGNvbHVtbj8udmFsdWVGb3JtYXR0ZXIgIT09ICdmdW5jdGlvbicpIHJldHVybiB2YWx1ZTtcblxuICAgIC8vIGB2YWx1ZWAgaXMgcGFzc2VkIGV4cGxpY2l0bHkgcmF0aGVyIHRoYW4gbGVmdCB0byBgY2VsbFBhcmFtc2A6IHRoZSBlbXB0eVxuICAgIC8vIC1jZWxsIGJyYW5jaCByZXNvbHZlcyBpdCB0aHJvdWdoIHRoZSBnZXR0ZXIgYmVmb3JlIGRlY2lkaW5nIHdoZXRoZXIgdGhlcmVcbiAgICAvLyBpcyBhbnl0aGluZyB0byBmb3JtYXQsIGFuZCB0aGUgZm9ybWF0dGVyIG11c3Qgc2VlIHRoYXQgc2FtZSB2YWx1ZS5cbiAgICByZXR1cm4gY29sdW1uLnZhbHVlRm9ybWF0dGVyKHsgLi4udGhpcy5jZWxsUGFyYW1zKGNvbHVtbiwgbm9kZSksIHZhbHVlIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIE5ldyBOb2RlIFN0YXRlIEJhc2VkIG9uIENvbHVtbiBGaWVsZFxuICAgKi9cbiAgcHVibGljIGdlbmVyYXRlQ2VsbFN0YXRlKG5vZGU6IE9uZVJvd05vZGUsIGNvbHVtbjogT25lQ29sdW1uRGVmKTogT25lQ2VsbFN0YXRlIHtcblxuICAgIC8vIFRoaXMgd2FzIGBmaWVsZCAhPT0gdW5kZWZpbmVkIHx8IGZpZWxkICE9PSAnJyB8fCBmaWVsZCAhPT0gbnVsbGAsIHdoaWNoIGlzXG4gICAgLy8gdHJ1ZSBmb3IgZXZlcnkgcG9zc2libGUgdmFsdWUgaW5jbHVkaW5nIGFsbCB0aHJlZSBpdCBtZWFudCB0byBleGNsdWRlIOKAlFxuICAgIC8vIGB8fGAgd2hlcmUgYCYmYCB3YXMgaW50ZW5kZWQuIEl0IGdhdGVkIHRoZSBmb3VyIGJyYW5jaGVzIGJlbG93LCBzbyBub25lXG4gICAgLy8gb2YgdGhlbSBjb3VsZCBldmVyIGZhbGwgdGhyb3VnaCB0byB0aGUgZGVmYXVsdC4gUmVkdWNlZCB0byB0aGUgY2hlY2sgaXRcbiAgICAvLyB3YXMgcmVhY2hpbmcgZm9yOiBhIGNvbHVtbiB3aXRoIG5vIGZpZWxkIGhhcyBubyB2YWx1ZSB0byByZW5kZXIuXG4gICAgY29uc3QgZmllbGQgPSBjb2x1bW4/LmZpZWxkO1xuXG4gICAgaWYgKCFmaWVsZCkge1xuXG4gICAgICByZXR1cm4geyB0eXBlOiAnbm9uZScsIHZhbHVlOiAnJyB9O1xuICAgIH1cblxuICAgIGNvbnN0IGlzRW1wdHkgPSB0aGlzLl9jZWxsRmllbGRWYWx1ZUVtcHR5LnRyYW5zZm9ybShub2RlLmRhdGEsIGZpZWxkKTtcbiAgICBjb25zdCBpc0dyb3VwID0gbm9kZS5ncm91cCB8fCBub2RlLmxlYWZHcm91cDtcbiAgICBjb25zdCBpc0F1dG9Hcm91cCA9IGNvbHVtbj8uYXV0b0dyb3VwRmllbGQ7XG5cbiAgICBpZiAoY29sdW1uICYmIGNvbHVtbi5jZWxsUmVuZGVyZXIgJiYgIWlzR3JvdXApIHtcblxuICAgICAgLy8gVGhlIHJlbmRlcmVyIHVzZWQgdG8gYmUgaGFuZGVkIGB7IG5vZGUsIGNvbHVtbkRlZiB9YCBhbmQgbm90aGluZyBlbHNlLFxuICAgICAgLy8gc28gdGhlIG9idmlvdXMgd2F5IHRvIHdyaXRlIG9uZSDigJQgYHBhcmFtcy52YWx1ZWAg4oCUIHByb2R1Y2VkIHRoZSBzdHJpbmdcbiAgICAgIC8vIFwidW5kZWZpbmVkXCIsIGFuZCBgcGFyYW1zLmRhdGEueGAgdGhyZXcuIEl0IG5vdyBnZXRzIGV4YWN0bHkgd2hhdCBldmVyeVxuICAgICAgLy8gb3RoZXIgcm93LXNjb3BlZCBob29rIGdldHMuXG4gICAgICByZXR1cm4geyB0eXBlOiAnaHRtbCcsIHZhbHVlOiBjb2x1bW4uY2VsbFJlbmRlcmVyKHRoaXMuY2VsbFBhcmFtcyhjb2x1bW4sIG5vZGUpKSB9XG4gICAgfVxuXG4gICAgLy8gMS4gQ2VsbCBHcm91cCBQbGFjZWhvbGRlclxuICAgIGlmIChpc0VtcHR5ICYmIGlzR3JvdXAgJiYgaXNBdXRvR3JvdXApIHtcblxuICAgICAgcmV0dXJuIHsgdHlwZTogJ3BsYWNlaG9sZGVyJywgdmFsdWU6IGNvbHVtbj8uY2VsbFJlbmRlcmVyUGFyYW1zPy5wbGFjZWhvbGRlciA/PyB0aGlzLl9jZWxsVmFsdWVHZXR0ZXIudHJhbnNmb3JtKG5vZGUuZGF0YSwgbm9kZSwgY29sdW1uLCB0aGlzLl9jb250ZXh0KSA/PyAnJyB9O1xuICAgIH1cblxuICAgIC8vIDIuIENlbGwgR3JvdXAgVGV4dCBWYWx1ZVxuICAgIGlmIChpc0dyb3VwICYmIGlzQXV0b0dyb3VwKSB7XG5cbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5mb3JtYXRWYWx1ZShub2RlLCBjb2x1bW4sIHRoaXMucmVzb2x2ZVZhbHVlKG5vZGUsIGNvbHVtbikpO1xuXG4gICAgICByZXR1cm4geyB0eXBlOiAndGV4dCcsIHZhbHVlOiB2YWx1ZSA/PyAnJyB9O1xuICAgIH1cblxuICAgIC8vIDMuIENlbGwgUGxhY2Vob2xkZXJcbiAgICAvL1xuICAgIC8vIFRoZSBhdXRvIGdyb3VwIGNvbHVtbiBpcyBkZWxpYmVyYXRlbHkgTk9UIGV4Y2x1ZGVkIGhlcmUuIENhc2VzIDEgYW5kIDJcbiAgICAvLyBhYm92ZSBhbHJlYWR5IGNsYWltZWQgdGhlIGdyb3VwIHJvd3MsIHNvIHdoYXQgcmVhY2hlcyB0aGlzIHBvaW50IGlzIGFcbiAgICAvLyBsZWFmIOKAlCBhbmQgYSBsZWFmIG9uIHRoZSBhdXRvIGdyb3VwIGNvbHVtbiBoYXMgdG8gcmVuZGVyIGl0cyBsYWJlbCB0b28sXG4gICAgLy8gaW5kZW50ZWQgYnkgbGV2ZWwuIEV4Y2x1ZGluZyBpdCBkcm9wcGVkIGV2ZXJ5IGxlYWYgdGhyb3VnaCB0byBjYXNlIDUgYW5kXG4gICAgLy8gcmVuZGVyZWQgdGhlIGdyb3VwIGNvbHVtbiBibGFuayBmb3IgdGhlIHdob2xlIGJvdHRvbSByb3cgb2YgYSB0cmVlLlxuICAgIGlmIChpc0VtcHR5ICYmICFpc0dyb3VwKSB7XG5cbiAgICAgIGNvbnN0IHZhbHVlR2V0dGVyID0gdGhpcy5fY2VsbFZhbHVlR2V0dGVyLnRyYW5zZm9ybShub2RlLmRhdGEsIG5vZGUsIGNvbHVtbiwgdGhpcy5fY29udGV4dCk7XG5cbiAgICAgIGlmICh2YWx1ZUdldHRlcikge1xuXG4gICAgICAgIHJldHVybiB7IHR5cGU6ICd0ZXh0JywgdmFsdWU6IHRoaXMuZm9ybWF0VmFsdWUobm9kZSwgY29sdW1uLCB2YWx1ZUdldHRlcikgfTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcGxhY2Vob2xkZXIgPSBjb2x1bW4/LmNlbGxSZW5kZXJlclBhcmFtcz8ucGxhY2Vob2xkZXIgPz8gJyc7XG5cbiAgICAgIHJldHVybiB7IHR5cGU6ICdwbGFjZWhvbGRlcicsIHZhbHVlOiBwbGFjZWhvbGRlciB9O1xuICAgIH1cblxuICAgIC8vIDQuIENlbGwgVGV4dCBWYWx1ZSAobGVhdmVzLCBpbmNsdWRpbmcgdGhlIGF1dG8gZ3JvdXAgY29sdW1uIOKAlCBzZWUgYWJvdmUpXG4gICAgaWYgKCFpc0dyb3VwKSB7XG5cbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5mb3JtYXRWYWx1ZShub2RlLCBjb2x1bW4sIHRoaXMucmVzb2x2ZVZhbHVlKG5vZGUsIGNvbHVtbikpO1xuXG4gICAgICByZXR1cm4geyB0eXBlOiAndGV4dCcsIHZhbHVlOiB2YWx1ZSA/PyAnJyB9O1xuICAgIH1cblxuICAgIC8vIDUuIERlZmF1bHRcbiAgICByZXR1cm4geyB0eXBlOiAnbm9uZScsIHZhbHVlOiAnJyB9O1xuICB9XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIFJvdy1zY29wZWQgY29sdW1uIHByZWRpY2F0ZXNcbiAgLy9cbiAgLy8gRXZlcnkgb25lIG9mIHRoZXNlIHJlc29sdmVzIHRoZSBzYW1lIHdheSBhbmQgcmVjZWl2ZXMgdGhlIHNhbWUgcGFyYW1zLCB2aWFcbiAgLy8gYGNlbGxQYXJhbXNgLiBUaGV5IHVzZWQgdG8gZWFjaCBidWlsZCB0aGVpciBvd24gc3Vic2V0IGlubGluZSwgd2hpY2ggaXMgaG93XG4gIC8vIGB2YWx1ZWAsIGBmaWVsZGAgYW5kIGBhcGlgIGNhbWUgdG8gYmUgbWlzc2luZyBmcm9tIGFsbCBvZiB0aGVtLlxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAvKiogV2hldGhlciB0aGlzIGNlbGwgbWF5IGJlIGVkaXRlZCBhdCBhbGwuIEEgY2FwYWJpbGl0eTogdW5zZXQgbWVhbnMgbm8uICovXG4gIHB1YmxpYyBlZGl0YWJsZUZuID0gKGNvbHVtbjogT25lQ29sdW1uRGVmLCBub2RlOiBPbmVSb3dOb2RlKTogYm9vbGVhbiA9PlxuICAgIHJlc29sdmVPbmVDZWxsUmVuZGVyZXJQYXJhbXMoY29sdW1uPy5lZGl0YWJsZSwgdGhpcy5jZWxsUGFyYW1zKGNvbHVtbiwgbm9kZSkpO1xuXG4gIC8qKlxuICAgKiBUaGUgc2Vjb25kIGVkaXQgZ2F0ZSwgQU5EZWQgd2l0aCBgZWRpdGFibGVgLlxuICAgKlxuICAgKiBBIHJlc3RyaWN0aW9uLCBzbyB1bnNldCBtZWFucyBcIm5vIHJlc3RyaWN0aW9uXCIuIEl0IHVzZWQgdG8gcmVzb2x2ZSB0aHJvdWdoXG4gICAqIGAhIXVuZGVmaW5lZGAgdG8gYGZhbHNlYCwgY2xvc2luZyB0aGUgZ2F0ZSBvbiBldmVyeSBjb2x1bW4gdGhhdCBkaWQgbm90IG5hbWVcbiAgICogaXQg4oCUIHNvIGBlZGl0YWJsZTogdHJ1ZWAgb24gaXRzIG93biBtYWRlIG5vdGhpbmcgZWRpdGFibGUuXG4gICAqL1xuICBwdWJsaWMgdXBkYXRhYmxlRm4gPSAoY29sdW1uOiBPbmVDb2x1bW5EZWYsIG5vZGU6IE9uZVJvd05vZGUpOiBib29sZWFuID0+XG4gICAgcmVzb2x2ZU9uZUNlbGxSZW5kZXJlclBhcmFtcyhjb2x1bW4/LnVwZGF0YWJsZSwgdGhpcy5jZWxsUGFyYW1zKGNvbHVtbiwgbm9kZSksIHRydWUpO1xuXG4gIC8qKiBEaXNhYmxlcyB0aGlzIGNvbHVtbidzIHJvdyBhY3Rpb24gYnV0dG9ucy4gTm90IGFuIGVkaXQgZ2F0ZS4gKi9cbiAgcHVibGljIGRpc2FibGVGbiA9IChjb2x1bW46IE9uZUNvbHVtbkRlZiwgbm9kZTogT25lUm93Tm9kZSk6IGJvb2xlYW4gPT5cbiAgICByZXNvbHZlT25lQ2VsbFJlbmRlcmVyUGFyYW1zKGNvbHVtbj8uZGlzYWJsZSwgdGhpcy5jZWxsUGFyYW1zKGNvbHVtbiwgbm9kZSkpO1xuXG4gIC8qKiBIaWRlcyB0aGlzIGNvbHVtbidzIHJvdyBhY3Rpb24gYnV0dG9ucyBlbnRpcmVseS4gKi9cbiAgcHVibGljIGhpZGVBY3Rpb25CdXR0b25GbiA9IChjb2x1bW46IE9uZUNvbHVtbkRlZiwgbm9kZTogT25lUm93Tm9kZSk6IGJvb2xlYW4gPT5cbiAgICByZXNvbHZlT25lQ2VsbFJlbmRlcmVyUGFyYW1zKGNvbHVtbj8uaGlkZUFjdGlvbkJ1dHRvbiwgdGhpcy5jZWxsUGFyYW1zKGNvbHVtbiwgbm9kZSkpO1xuXG4gIC8qKiBXaGV0aGVyIHRoaXMgY2VsbCBjYXJyaWVzIGEgcm93IGRyYWcgaGFuZGxlLiAqL1xuICBwdWJsaWMgcm93RHJhZ0ZuID0gKGNvbHVtbjogT25lQ29sdW1uRGVmLCBub2RlOiBPbmVSb3dOb2RlKTogYm9vbGVhbiA9PlxuICAgIHJlc29sdmVPbmVDZWxsUmVuZGVyZXJQYXJhbXMoY29sdW1uPy5yb3dEcmFnLCB0aGlzLmNlbGxQYXJhbXMoY29sdW1uLCBub2RlKSk7XG5cbiAgcHVibGljIHZhbHVlR2V0dGVyRm4gPSAoY29sdW1uOiBPbmVDb2x1bW5EZWYsIG5vZGU6IE9uZVJvd05vZGUpID0+XG4gICAgcmVzb2x2ZU9uZVZhbHVlR2V0dGVyUGFyYW1zKGNvbHVtbj8udmFsdWVHZXR0ZXIsIHsgZGF0YTogbm9kZS5kYXRhLCByb3dJbmRleDogbm9kZS5yb3dJbmRleCwgbm9kZSwgY29udGV4dDogdGhpcy5fY29udGV4dCB9KTtcbn1cbiJdfQ==
215
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib25lLWdyaWQtY2VsbC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb25lLWdyaWQvc3JjL2xpYi9jb3JlL3NlcnZpY2VzL29uZS1ncmlkLWNlbGwuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRzNDLE9BQU8sRUFBRSxXQUFXLEVBQUUsYUFBYSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDM0UsT0FBTyxFQUFFLHNCQUFzQixFQUFFLDRCQUE0QixFQUFFLDJCQUEyQixFQUFFLE1BQU0scUNBQXFDLENBQUM7O0FBSXhJLE1BQU0sT0FBTyxrQkFBa0I7SUFEL0I7UUFHVSxnQkFBVyxHQUFtQixFQUFFLENBQUM7UUFFakMsU0FBSSxHQUFzQixJQUFJLENBQUM7UUErTnZDLDhFQUE4RTtRQUM5RSwrQkFBK0I7UUFDL0IsRUFBRTtRQUNGLDZFQUE2RTtRQUM3RSw4RUFBOEU7UUFDOUUsa0VBQWtFO1FBQ2xFLDhFQUE4RTtRQUU5RSw0RUFBNEU7UUFDckUsZUFBVSxHQUFHLENBQUMsTUFBb0IsRUFBRSxJQUFnQixFQUFXLEVBQUUsQ0FDdEUsNEJBQTRCLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBRWhGOzs7Ozs7V0FNRztRQUNJLGdCQUFXLEdBQUcsQ0FBQyxNQUFvQixFQUFFLElBQWdCLEVBQVcsRUFBRSxDQUN2RSw0QkFBNEIsQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBRXZGLG1FQUFtRTtRQUM1RCxjQUFTLEdBQUcsQ0FBQyxNQUFvQixFQUFFLElBQWdCLEVBQVcsRUFBRSxDQUNyRSw0QkFB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QztZQUU5RSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxJQUFJLEVBQUUsRUFBRSxDQUFDO1FBQzlDLENBQUM7UUFFRCx5RUFBeUU7UUFDekUsb0VBQW9FO1FBQ3BFLDhEQUE4RDtRQUM5RCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFFYixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUU5RSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxJQUFJLEVBQUUsRUFBRSxDQUFDO1FBQzlDLENBQUM7UUFFRCxhQUFhO1FBQ2IsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxDQUFDO0lBQ3JDLENBQUM7K0dBak9VLGtCQUFrQjttSEFBbEIsa0JBQWtCOzs0RkFBbEIsa0JBQWtCO2tCQUQ5QixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT25lQ2VsbFByZXNlbnRhdGlvblBhcmFtcywgT25lQ2VsbFN0YXRlLCBPbmVDZWxsU3RhdGVzLCBPbmVDb2x1bW5EZWYgfSBmcm9tICcuLi9tb2RlbHMvb25lLWNvbHVtbi1kZWYtdHlwZXMubW9kZWwnO1xuaW1wb3J0IHsgT25lUm93Tm9kZSB9IGZyb20gJy4uL2luc3RhbnRzL29uZS1yb3ctbm9kZS5jbGFzcyc7XG5pbXBvcnQgeyBpc0NlbGxFbXB0eSwgcmVhZENlbGxWYWx1ZSB9IGZyb20gJy4uLy4uL2hlbHBlcnMvb25lLWNlbGwuaGVscGVyJztcbmltcG9ydCB7IHJlc29sdmVDZWxsVmFsdWVHZXR0ZXIsIHJlc29sdmVPbmVDZWxsUmVuZGVyZXJQYXJhbXMsIHJlc29sdmVPbmVWYWx1ZUdldHRlclBhcmFtcyB9IGZyb20gJy4uLy4uL2hlbHBlcnMvb25lLWNvbHVtbi1kZWYuaGVscGVyJztcbmltcG9ydCB0eXBlIHsgT25lR3JpZEFwaSB9IGZyb20gJy4uL2luc3RhbnRzL29uZS1ncmlkLWFwaS5jbGFzcyc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBPbmVHcmlkQ2VsbFNlcnZpY2Uge1xuXG4gIHByaXZhdGUgX2NvbHVtbkRlZnM6IE9uZUNvbHVtbkRlZltdID0gW107XG4gIHByaXZhdGUgX2NvbnRleHQ6IGFueTtcbiAgcHJpdmF0ZSBfYXBpOiBPbmVHcmlkQXBpIHwgbnVsbCA9IG51bGw7XG5cbiAgcHVibGljIGFwcGx5Q29sdW1uRGVmcyhjb2x1bW5EZWZzOiBPbmVDb2x1bW5EZWZbXSwgY29udGV4dDogYW55KSB7XG5cbiAgICB0aGlzLl9jb2x1bW5EZWZzID0gY29sdW1uRGVmcztcbiAgICB0aGlzLl9jb250ZXh0ID0gY29udGV4dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBCYWNrLXJlZmVyZW5jZSB0byB0aGUgZ3JpZCBhcGksIHNvIHByZWRpY2F0ZSBwYXJhbXMgY2FuIGNhcnJ5IGl0LlxuICAgKlxuICAgKiBQdXNoZWQgaW4gcmF0aGVyIHRoYW4gaW5qZWN0ZWQ6IGBPbmVHcmlkQXBpYCBhbHJlYWR5IGRlcGVuZHMgb24gdGhpc1xuICAgKiBzZXJ2aWNlLCBhbmQgaW5qZWN0aW5nIGl0IGJhY2sgd291bGQgY2xvc2UgYSBESSBjeWNsZS5cbiAgICovXG4gIHB1YmxpYyBzZXRHcmlkQXBpKGFwaTogT25lR3JpZEFwaSB8IG51bGwpOiB2b2lkIHtcblxuICAgIHRoaXMuX2FwaSA9IGFwaTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcGFyYW1zIGV2ZXJ5IHJvdy1zY29wZWQgY29sdW1uIGNhbGxiYWNrIHJlY2VpdmVzLlxuICAgKlxuICAgKiBPbmUgYnVpbGRlciwgZGVsaWJlcmF0ZWx5OiBgZWRpdGFibGVgLCBgdXBkYXRhYmxlYCwgYGRpc2FibGVgLCBgcm93RHJhZ2AsXG4gICAqIGBoaWRlQWN0aW9uQnV0dG9uYCwgYGNlbGxDbGFzc2AsIGBjZWxsU3R5bGVgLCBgY2VsbFJlbmRlcmVyYCBhbmRcbiAgICogYHZhbHVlRm9ybWF0dGVyYCBhcmUgYWxsIFwiZGVjaWRlIHNvbWV0aGluZyBhYm91dCB0aGlzIGNlbGxcIiwgYW5kIGEgY29uc3VtZXJcbiAgICogc2hvdWxkIG5vdCBoYXZlIHRvIHJlbWVtYmVyIHdoaWNoIG9mIHRoZW0gaGFwcGVucyB0byBiZSBoYW5kZWQgYHZhbHVlYCBvclxuICAgKiBgZmllbGRgLiBFYWNoIHVzZWQgdG8gYmUgY2FsbGVkIHdpdGggYSBzbGlnaHRseSBkaWZmZXJlbnQgc3Vic2V0LlxuICAgKi9cbiAgcHVibGljIGNlbGxQYXJhbXMoY29sdW1uOiBPbmVDb2x1bW5EZWYsIG5vZGU6IE9uZVJvd05vZGUpOiBPbmVDZWxsUHJlc2VudGF0aW9uUGFyYW1zIHtcblxuICAgIHJldHVybiB7XG4gICAgICAvLyBDb2x1bW4gY29uZmlnIGZpcnN0LCBzbyB0aGUgZ3JpZCdzIG93biBmaWVsZHMgd2luIGEgbmFtZSBjb2xsaXNpb246IGFcbiAgICAgIC8vIHN0YWxlIGB2YWx1ZWAgbGVmdCBpbiBgY2VsbFJlbmRlcmVyUGFyYW1zYCBtdXN0IG5vdCBzaGFkb3cgdGhpcyBjZWxsJ3MuXG4gICAgICAuLi4oY29sdW1uPy5jZWxsUmVuZGVyZXJQYXJhbXMgPz8ge30pLFxuICAgICAgdmFsdWU6IHRoaXMucmVzb2x2ZVZhbHVlKG5vZGUsIGNvbHVtbiksXG4gICAgICBkYXRhOiBub2RlLmRhdGEsXG4gICAgICBub2RlLFxuICAgICAgcm93SW5kZXg6IG5vZGUucm93SW5kZXgsXG4gICAgICBmaWVsZDogY29sdW1uPy5maWVsZCBhcyBzdHJpbmcsXG4gICAgICBjb2x1bW5EZWY6IGNvbHVtbixcbiAgICAgIGFwaTogdGhpcy5fYXBpID8/IHVuZGVmaW5lZCxcbiAgICAgIGNvbnRleHQ6IHRoaXMuX2NvbnRleHQsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBOZXcgTm9kZSBTdGF0ZXNcbiAgICovXG4gIHB1YmxpYyBnZW5lcmF0ZUNlbGxTdGF0ZXMobm9kZTogT25lUm93Tm9kZSk6IE9uZUNlbGxTdGF0ZXMgfCBudWxsIHtcblxuICAgIGlmICghbm9kZSkgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCBuZXdTdGF0ZXM6IE9uZUNlbGxTdGF0ZXMgPSB7fTtcblxuICAgIGZvciAoY29uc3QgY29sdW1uIG9mIHRoaXMuX2NvbHVtbkRlZnMpIHtcblxuICAgICAgY29uc3QgZmllbGQgPSBjb2x1bW4uZmllbGQ7XG5cbiAgICAgIC8vIENlbGwgc3RhdGUgaXMga2V5ZWQgYnkgZmllbGQsIHNvIGEgY29sdW1uIHdpdGhvdXQgb25lIGNvbnRyaWJ1dGVzXG4gICAgICAvLyBub3RoaW5nLiBTa2lwcGluZyBpdCBrZWVwcyBgdW5kZWZpbmVkYCBvdXQgb2YgdGhlIHN0YXRlIG9iamVjdDsgc3VjaCBhXG4gICAgICAvLyBjb2x1bW4gc3RpbGwgcmVuZGVycyBpdHMgYWN0aW9uIGJ1dHRvbnMsIHdoaWNoIGRvIG5vdCByZWFkIGNlbGwgc3RhdGUuXG4gICAgICBpZiAoIWZpZWxkKSBjb250aW51ZTtcblxuICAgICAgaWYgKGZpZWxkICE9PSAnX29uZVJvd051bWJlcicpIHtcblxuICAgICAgICBuZXdTdGF0ZXNbZmllbGRdID0gdGhpcy5nZW5lcmF0ZUNlbGxTdGF0ZShub2RlLCBjb2x1bW4pID8/IG5vZGUuY2VsbFN0YXRlc1tmaWVsZF0gPz8geyB0eXBlOiAnbm9uZScsIHZhbHVlOiAnJyB9O1xuXG4gICAgICB9IGVsc2Uge1xuXG4gICAgICAgIG5ld1N0YXRlc1tmaWVsZF0gPSBub2RlLmNlbGxTdGF0ZXNbZmllbGRdO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBuZXdTdGF0ZXM7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGNlbGwncyB2YWx1ZTogdGhlIGB2YWx1ZUdldHRlcmAncyBvdXRwdXQgd2hlcmUgdGhlIGNvbHVtbiBkZWNsYXJlcyBvbmUsXG4gICAqIHRoZSByYXcgZmllbGQgb3RoZXJ3aXNlLiBUaGlzIGlzIHRoZSB2YWx1ZSwgbm90IHRoZSBkaXNwbGF5IHRleHQg4oCUIHNlZVxuICAgKiB7QGxpbmsgZm9ybWF0VmFsdWV9LlxuICAgKi9cbiAgcHJpdmF0ZSByZXNvbHZlVmFsdWUobm9kZTogT25lUm93Tm9kZSwgY29sdW1uOiBPbmVDb2x1bW5EZWYpOiBhbnkge1xuXG4gICAgcmV0dXJuIGNvbHVtbj8udmFsdWVHZXR0ZXJcbiAgICAgID8gcmVzb2x2ZUNlbGxWYWx1ZUdldHRlcihub2RlLmRhdGEsIG5vZGUsIGNvbHVtbiwgdGhpcy5fY29udGV4dClcbiAgICAgIDogcmVhZENlbGxWYWx1ZShub2RlLmRhdGEsIGNvbHVtbi5maWVsZCk7XG4gIH1cblxuICAvKipcbiAgICogQXBwbHkgdGhlIGNvbHVtbidzIGB2YWx1ZUZvcm1hdHRlcmAuXG4gICAqXG4gICAqIGB2YWx1ZUZvcm1hdHRlcmAgd2FzIGRlY2xhcmVkIG9uIHRoZSBjb2x1bW4gZGVmaW5pdGlvbiBhbmQgY2FsbGVkIGZyb21cbiAgICogbm93aGVyZSDigJQgYSBjb25zdW1lciBjb3VsZCB3cml0ZSBvbmUsIGdldCBubyBlcnJvciwgYW5kIHNlZSBub3RoaW5nIGhhcHBlbi5cbiAgICogSXQgcnVucyBvbiBkaXNwbGF5ZWQgdGV4dCBvbmx5LCBhZnRlciB0aGUgYHZhbHVlR2V0dGVyYCwgYW5kIGlzIGRlbGliZXJhdGVseVxuICAgKiBza2lwcGVkIGZvciBwbGFjZWhvbGRlcnM6IGFuIGVtcHR5IGNlbGwgYWxyZWFkeSBoYXMgaXRzIG93biBtZWNoYW5pc20gaW5cbiAgICogYGNlbGxSZW5kZXJlclBhcmFtcy5wbGFjZWhvbGRlcmAsIGFuZCB0d28gZmVhdHVyZXMgY29tcGV0aW5nIHRvIGZpbGwgdGhlXG4gICAqIHNhbWUgZ2FwIGlzIHdvcnNlIHRoYW4gb25lLlxuICAgKlxuICAgKiBOb3RlIHRoYXQgc29ydGluZyBhbmQgZmlsdGVyaW5nIHJlYWQgdGhlIHVuZGVybHlpbmcgcm93IGRhdGEsIG5vdCB0aGlzIOKAlFxuICAgKiB3aGljaCBpcyBleGFjdGx5IHdoeSBmb3JtYXR0aW5nIGJlbG9uZ3MgaGVyZSByYXRoZXIgdGhhbiBpbiB0aGUgZ2V0dGVyLlxuICAgKi9cbiAgcHJpdmF0ZSBmb3JtYXRWYWx1ZShub2RlOiBPbmVSb3dOb2RlLCBjb2x1bW46IE9uZUNvbHVtbkRlZiwgdmFsdWU6IGFueSk6IGFueSB7XG5cbiAgICBpZiAodHlwZW9mIGNvbHVtbj8udmFsdWVGb3JtYXR0ZXIgIT09ICdmdW5jdGlvbicpIHJldHVybiB2YWx1ZTtcblxuICAgIC8vIGB2YWx1ZWAgaXMgcGFzc2VkIGV4cGxpY2l0bHkgcmF0aGVyIHRoYW4gbGVmdCB0byBgY2VsbFBhcmFtc2A6IHRoZSBlbXB0eVxuICAgIC8vIC1jZWxsIGJyYW5jaCByZXNvbHZlcyBpdCB0aHJvdWdoIHRoZSBnZXR0ZXIgYmVmb3JlIGRlY2lkaW5nIHdoZXRoZXIgdGhlcmVcbiAgICAvLyBpcyBhbnl0aGluZyB0byBmb3JtYXQsIGFuZCB0aGUgZm9ybWF0dGVyIG11c3Qgc2VlIHRoYXQgc2FtZSB2YWx1ZS5cbiAgICByZXR1cm4gY29sdW1uLnZhbHVlRm9ybWF0dGVyKHsgLi4udGhpcy5jZWxsUGFyYW1zKGNvbHVtbiwgbm9kZSksIHZhbHVlIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBwbGFjZWhvbGRlciBmb3IgYW4gZW1wdHkgY2VsbCwgb3IgYHVuZGVmaW5lZGAgd2hlbiB0aGlzIHJvdydzIHRyZWVcbiAgICogZGVwdGggbWF5IG5vdCBiZSBlZGl0ZWQuXG4gICAqXG4gICAqIGBjZWxsUmVuZGVyZXJQYXJhbXMucGxhY2Vob2xkZXJgIGlzIGEgcHJvbXB0LCBub3QgZGF0YTogaXQgcmVuZGVycyBhdCBoYWxmXG4gICAqIG9wYWNpdHkgd2hlcmUgdGhlIHZhbHVlIHdvdWxkIGdvLCB3aGljaCByZWFkcyBhcyBcImNsaWNrIGhlcmUgYW5kIGZpbGwgdGhpc1xuICAgKiBpblwiLiBPbiB0aGUgYXV0byBncm91cCBjb2x1bW4gYGVkaXRhYmxlTGV2ZWxzYCBkZWNpZGVzIHdoaWNoIGRlcHRocyBhY2NlcHRcbiAgICogYW4gZWRpdCBhdCBhbGwsIHNvIGEgZGVwdGggb3V0c2lkZSB0aGF0IGxpc3Qgd2FzIGFkdmVydGlzaW5nIGFuIGVkaXQgdGhlXG4gICAqIGdyaWQgdGhlbiByZWZ1c2VzIOKAlCB0aGUgY2VsbCBvZmZlcnMgbm8gaW5wdXQgYW5kIHRoZSBwcm9tcHQgbmV2ZXIgY2xlYXJzLlxuICAgKlxuICAgKiBUaGUgc3VwcHJlc3Npb24gaXMgc2NvcGVkIHRvIGNvbHVtbnMgdGhhdCBhY3R1YWxseSBkZWNsYXJlIGBlZGl0YWJsZUxldmVsc2AuXG4gICAqIFRoZSBsaXN0IGlzIG9wdC1pbiwgYW5kIGEgY29sdW1uIHdpdGhvdXQgb25lIGhhcyBubyBwZXItbGV2ZWwgcnVsZXMgcmF0aGVyXG4gICAqIHRoYW4gbm8gZWRpdGFibGUgbGV2ZWxzLCBzbyBwbGFpbiBncmlkcyBhbmQgdW50b3VjaGVkIHRyZWUgY29sdW1ucyBrZWVwXG4gICAqIHNob3dpbmcgdGhlaXIgcGxhY2Vob2xkZXIgZXhhY3RseSBhcyBiZWZvcmUuXG4gICAqL1xuICBwcml2YXRlIHJlc29sdmVQbGFjZWhvbGRlcihub2RlOiBPbmVSb3dOb2RlLCBjb2x1bW46IE9uZUNvbHVtbkRlZik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG5cbiAgICBjb25zdCBwbGFjZWhvbGRlciA9IGNvbHVtbj8uY2VsbFJlbmRlcmVyUGFyYW1zPy5wbGFjZWhvbGRlcjtcbiAgICBjb25zdCBlZGl0YWJsZUxldmVscyA9IGNvbHVtbj8uZWRpdGFibGVMZXZlbHM7XG5cbiAgICBpZiAoIWNvbHVtbj8uYXV0b0dyb3VwRmllbGQgfHwgIUFycmF5LmlzQXJyYXkoZWRpdGFibGVMZXZlbHMpKSByZXR1cm4gcGxhY2Vob2xkZXI7XG5cbiAgICByZXR1cm4gZWRpdGFibGVMZXZlbHMuaW5jbHVkZXMobm9kZT8ubGV2ZWwpID8gcGxhY2Vob2xkZXIgOiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgTmV3IE5vZGUgU3RhdGUgQmFzZWQgb24gQ29sdW1uIEZpZWxkXG4gICAqL1xuICBwdWJsaWMgZ2VuZXJhdGVDZWxsU3RhdGUobm9kZTogT25lUm93Tm9kZSwgY29sdW1uOiBPbmVDb2x1bW5EZWYpOiBPbmVDZWxsU3RhdGUge1xuXG4gICAgLy8gVGhpcyB3YXMgYGZpZWxkICE9PSB1bmRlZmluZWQgfHwgZmllbGQgIT09ICcnIHx8IGZpZWxkICE9PSBudWxsYCwgd2hpY2ggaXNcbiAgICAvLyB0cnVlIGZvciBldmVyeSBwb3NzaWJsZSB2YWx1ZSBpbmNsdWRpbmcgYWxsIHRocmVlIGl0IG1lYW50IHRvIGV4Y2x1ZGUg4oCUXG4gICAgLy8gYHx8YCB3aGVyZSBgJiZgIHdhcyBpbnRlbmRlZC4gSXQgZ2F0ZWQgdGhlIGZvdXIgYnJhbmNoZXMgYmVsb3csIHNvIG5vbmVcbiAgICAvLyBvZiB0aGVtIGNvdWxkIGV2ZXIgZmFsbCB0aHJvdWdoIHRvIHRoZSBkZWZhdWx0LiBSZWR1Y2VkIHRvIHRoZSBjaGVjayBpdFxuICAgIC8vIHdhcyByZWFjaGluZyBmb3I6IGEgY29sdW1uIHdpdGggbm8gZmllbGQgaGFzIG5vIHZhbHVlIHRvIHJlbmRlci5cbiAgICBjb25zdCBmaWVsZCA9IGNvbHVtbj8uZmllbGQ7XG5cbiAgICBpZiAoIWZpZWxkKSB7XG5cbiAgICAgIHJldHVybiB7IHR5cGU6ICdub25lJywgdmFsdWU6ICcnIH07XG4gICAgfVxuXG4gICAgY29uc3QgaXNFbXB0eSA9IGlzQ2VsbEVtcHR5KG5vZGUuZGF0YSwgZmllbGQpO1xuICAgIGNvbnN0IGlzR3JvdXAgPSBub2RlLmdyb3VwIHx8IG5vZGUubGVhZkdyb3VwO1xuICAgIGNvbnN0IGlzQXV0b0dyb3VwID0gY29sdW1uPy5hdXRvR3JvdXBGaWVsZDtcblxuICAgIGlmIChjb2x1bW4gJiYgY29sdW1uLmNlbGxSZW5kZXJlciAmJiAhaXNHcm91cCkge1xuXG4gICAgICAvLyBUaGUgcmVuZGVyZXIgdXNlZCB0byBiZSBoYW5kZWQgYHsgbm9kZSwgY29sdW1uRGVmIH1gIGFuZCBub3RoaW5nIGVsc2UsXG4gICAgICAvLyBzbyB0aGUgb2J2aW91cyB3YXkgdG8gd3JpdGUgb25lIOKAlCBgcGFyYW1zLnZhbHVlYCDigJQgcHJvZHVjZWQgdGhlIHN0cmluZ1xuICAgICAgLy8gXCJ1bmRlZmluZWRcIiwgYW5kIGBwYXJhbXMuZGF0YS54YCB0aHJldy4gSXQgbm93IGdldHMgZXhhY3RseSB3aGF0IGV2ZXJ5XG4gICAgICAvLyBvdGhlciByb3ctc2NvcGVkIGhvb2sgZ2V0cy5cbiAgICAgIHJldHVybiB7IHR5cGU6ICdodG1sJywgdmFsdWU6IGNvbHVtbi5jZWxsUmVuZGVyZXIodGhpcy5jZWxsUGFyYW1zKGNvbHVtbiwgbm9kZSkpIH1cbiAgICB9XG5cbiAgICAvLyAxLiBDZWxsIEdyb3VwIFBsYWNlaG9sZGVyXG4gICAgaWYgKGlzRW1wdHkgJiYgaXNHcm91cCAmJiBpc0F1dG9Hcm91cCkge1xuXG4gICAgICByZXR1cm4geyB0eXBlOiAncGxhY2Vob2xkZXInLCB2YWx1ZTogdGhpcy5yZXNvbHZlUGxhY2Vob2xkZXIobm9kZSwgY29sdW1uKSA/PyByZXNvbHZlQ2VsbFZhbHVlR2V0dGVyKG5vZGUuZGF0YSwgbm9kZSwgY29sdW1uLCB0aGlzLl9jb250ZXh0KSA/PyAnJyB9O1xuICAgIH1cblxuICAgIC8vIDIuIENlbGwgR3JvdXAgVGV4dCBWYWx1ZVxuICAgIGlmIChpc0dyb3VwICYmIGlzQXV0b0dyb3VwKSB7XG5cbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5mb3JtYXRWYWx1ZShub2RlLCBjb2x1bW4sIHRoaXMucmVzb2x2ZVZhbHVlKG5vZGUsIGNvbHVtbikpO1xuXG4gICAgICByZXR1cm4geyB0eXBlOiAndGV4dCcsIHZhbHVlOiB2YWx1ZSA/PyAnJyB9O1xuICAgIH1cblxuICAgIC8vIDMuIENlbGwgUGxhY2Vob2xkZXJcbiAgICAvL1xuICAgIC8vIFRoZSBhdXRvIGdyb3VwIGNvbHVtbiBpcyBkZWxpYmVyYXRlbHkgTk9UIGV4Y2x1ZGVkIGhlcmUuIENhc2VzIDEgYW5kIDJcbiAgICAvLyBhYm92ZSBhbHJlYWR5IGNsYWltZWQgdGhlIGdyb3VwIHJvd3MsIHNvIHdoYXQgcmVhY2hlcyB0aGlzIHBvaW50IGlzIGFcbiAgICAvLyBsZWFmIOKAlCBhbmQgYSBsZWFmIG9uIHRoZSBhdXRvIGdyb3VwIGNvbHVtbiBoYXMgdG8gcmVuZGVyIGl0cyBsYWJlbCB0b28sXG4gICAgLy8gaW5kZW50ZWQgYnkgbGV2ZWwuIEV4Y2x1ZGluZyBpdCBkcm9wcGVkIGV2ZXJ5IGxlYWYgdGhyb3VnaCB0byBjYXNlIDUgYW5kXG4gICAgLy8gcmVuZGVyZWQgdGhlIGdyb3VwIGNvbHVtbiBibGFuayBmb3IgdGhlIHdob2xlIGJvdHRvbSByb3cgb2YgYSB0cmVlLlxuICAgIGlmIChpc0VtcHR5ICYmICFpc0dyb3VwKSB7XG5cbiAgICAgIGNvbnN0IHZhbHVlR2V0dGVyID0gcmVzb2x2ZUNlbGxWYWx1ZUdldHRlcihub2RlLmRhdGEsIG5vZGUsIGNvbHVtbiwgdGhpcy5fY29udGV4dCk7XG5cbiAgICAgIGlmICh2YWx1ZUdldHRlcikge1xuXG4gICAgICAgIHJldHVybiB7IHR5cGU6ICd0ZXh0JywgdmFsdWU6IHRoaXMuZm9ybWF0VmFsdWUobm9kZSwgY29sdW1uLCB2YWx1ZUdldHRlcikgfTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcGxhY2Vob2xkZXIgPSB0aGlzLnJlc29sdmVQbGFjZWhvbGRlcihub2RlLCBjb2x1bW4pID8/ICcnO1xuXG4gICAgICByZXR1cm4geyB0eXBlOiAncGxhY2Vob2xkZXInLCB2YWx1ZTogcGxhY2Vob2xkZXIgfTtcbiAgICB9XG5cbiAgICAvLyA0LiBDZWxsIFRleHQgVmFsdWUgKGxlYXZlcywgaW5jbHVkaW5nIHRoZSBhdXRvIGdyb3VwIGNvbHVtbiDigJQgc2VlIGFib3ZlKVxuICAgIGlmICghaXNHcm91cCkge1xuXG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZm9ybWF0VmFsdWUobm9kZSwgY29sdW1uLCB0aGlzLnJlc29sdmVWYWx1ZShub2RlLCBjb2x1bW4pKTtcblxuICAgICAgcmV0dXJuIHsgdHlwZTogJ3RleHQnLCB2YWx1ZTogdmFsdWUgPz8gJycgfTtcbiAgICB9XG5cbiAgICAvLyA1LiBBIGdyb3VwIHJvdyBvdXRzaWRlIHRoZSBncm91cCBjb2x1bW46IHJlbmRlciB0aGUgdmFsdWUgd2hlbiB0aGUgcm93XG4gICAgLy8gYWN0dWFsbHkgY2FycmllcyBvbmUg4oCUIGFnZ3JlZ2F0ZXMgbGFuZCBpbiB0aGVzZSBjZWxscywgYW5kIGEgdHJlZVxuICAgIC8vIHBhcmVudCdzIG93biBkYXRhIGJlbG9uZ3Mgb24gc2NyZWVuIHRvby4gQmxhbmsgc3RheXMgYmxhbmsuXG4gICAgaWYgKCFpc0VtcHR5KSB7XG5cbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5mb3JtYXRWYWx1ZShub2RlLCBjb2x1bW4sIHRoaXMucmVzb2x2ZVZhbHVlKG5vZGUsIGNvbHVtbikpO1xuXG4gICAgICByZXR1cm4geyB0eXBlOiAndGV4dCcsIHZhbHVlOiB2YWx1ZSA/PyAnJyB9O1xuICAgIH1cblxuICAgIC8vIDYuIERlZmF1bHRcbiAgICByZXR1cm4geyB0eXBlOiAnbm9uZScsIHZhbHVlOiAnJyB9O1xuICB9XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIFJvdy1zY29wZWQgY29sdW1uIHByZWRpY2F0ZXNcbiAgLy9cbiAgLy8gRXZlcnkgb25lIG9mIHRoZXNlIHJlc29sdmVzIHRoZSBzYW1lIHdheSBhbmQgcmVjZWl2ZXMgdGhlIHNhbWUgcGFyYW1zLCB2aWFcbiAgLy8gYGNlbGxQYXJhbXNgLiBUaGV5IHVzZWQgdG8gZWFjaCBidWlsZCB0aGVpciBvd24gc3Vic2V0IGlubGluZSwgd2hpY2ggaXMgaG93XG4gIC8vIGB2YWx1ZWAsIGBmaWVsZGAgYW5kIGBhcGlgIGNhbWUgdG8gYmUgbWlzc2luZyBmcm9tIGFsbCBvZiB0aGVtLlxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAvKiogV2hldGhlciB0aGlzIGNlbGwgbWF5IGJlIGVkaXRlZCBhdCBhbGwuIEEgY2FwYWJpbGl0eTogdW5zZXQgbWVhbnMgbm8uICovXG4gIHB1YmxpYyBlZGl0YWJsZUZuID0gKGNvbHVtbjogT25lQ29sdW1uRGVmLCBub2RlOiBPbmVSb3dOb2RlKTogYm9vbGVhbiA9PlxuICAgIHJlc29sdmVPbmVDZWxsUmVuZGVyZXJQYXJhbXMoY29sdW1uPy5lZGl0YWJsZSwgdGhpcy5jZWxsUGFyYW1zKGNvbHVtbiwgbm9kZSkpO1xuXG4gIC8qKlxuICAgKiBUaGUgc2Vjb25kIGVkaXQgZ2F0ZSwgQU5EZWQgd2l0aCBgZWRpdGFibGVgLlxuICAgKlxuICAgKiBBIHJlc3RyaWN0aW9uLCBzbyB1bnNldCBtZWFucyBcIm5vIHJlc3RyaWN0aW9uXCIuIEl0IHVzZWQgdG8gcmVzb2x2ZSB0aHJvdWdoXG4gICAqIGAhIXVuZGVmaW5lZGAgdG8gYGZhbHNlYCwgY2xvc2luZyB0aGUgZ2F0ZSBvbiBldmVyeSBjb2x1bW4gdGhhdCBkaWQgbm90IG5hbWVcbiAgICogaXQg4oCUIHNvIGBlZGl0YWJsZTogdHJ1ZWAgb24gaXRzIG93biBtYWRlIG5vdGhpbmcgZWRpdGFibGUuXG4gICAqL1xuICBwdWJsaWMgdXBkYXRhYmxlRm4gPSAoY29sdW1uOiBPbmVDb2x1bW5EZWYsIG5vZGU6IE9uZVJvd05vZGUpOiBib29sZWFuID0+XG4gICAgcmVzb2x2ZU9uZUNlbGxSZW5kZXJlclBhcmFtcyhjb2x1bW4/LnVwZGF0YWJsZSwgdGhpcy5jZWxsUGFyYW1zKGNvbHVtbiwgbm9kZSksIHRydWUpO1xuXG4gIC8qKiBEaXNhYmxlcyB0aGlzIGNvbHVtbidzIHJvdyBhY3Rpb24gYnV0dG9ucy4gTm90IGFuIGVkaXQgZ2F0ZS4gKi9cbiAgcHVibGljIGRpc2FibGVGbiA9IChjb2x1bW46IE9uZUNvbHVtbkRlZiwgbm9kZTogT25lUm93Tm9kZSk6IGJvb2xlYW4gPT5cbiAgICByZXNvbHZlT25lQ2VsbFJlbmRlcmVyUGFyYW1zKGNvbHVtbj8uZGlzYWJsZSwgdGhpcy5jZWxsUGFyYW1zKGNvbHVtbiwgbm9kZSkpO1xuXG4gIC8qKiBIaWRlcyB0aGlzIGNvbHVtbidzIHJvdyBhY3Rpb24gYnV0dG9ucyBlbnRpcmVseS4gKi9cbiAgcHVibGljIGhpZGVBY3Rpb25CdXR0b25GbiA9IChjb2x1bW46IE9uZUNvbHVtbkRlZiwgbm9kZTogT25lUm93Tm9kZSk6IGJvb2xlYW4gPT5cbiAgICByZXNvbHZlT25lQ2VsbFJlbmRlcmVyUGFyYW1zKGNvbHVtbj8uaGlkZUFjdGlvbkJ1dHRvbiwgdGhpcy5jZWxsUGFyYW1zKGNvbHVtbiwgbm9kZSkpO1xuXG4gIC8qKiBXaGV0aGVyIHRoaXMgY2VsbCBjYXJyaWVzIGEgcm93IGRyYWcgaGFuZGxlLiAqL1xuICBwdWJsaWMgcm93RHJhZ0ZuID0gKGNvbHVtbjogT25lQ29sdW1uRGVmLCBub2RlOiBPbmVSb3dOb2RlKTogYm9vbGVhbiA9PlxuICAgIHJlc29sdmVPbmVDZWxsUmVuZGVyZXJQYXJhbXMoY29sdW1uPy5yb3dEcmFnLCB0aGlzLmNlbGxQYXJhbXMoY29sdW1uLCBub2RlKSk7XG5cbiAgcHVibGljIHZhbHVlR2V0dGVyRm4gPSAoY29sdW1uOiBPbmVDb2x1bW5EZWYsIG5vZGU6IE9uZVJvd05vZGUpID0+XG4gICAgcmVzb2x2ZU9uZVZhbHVlR2V0dGVyUGFyYW1zKGNvbHVtbj8udmFsdWVHZXR0ZXIsIHsgZGF0YTogbm9kZS5kYXRhLCByb3dJbmRleDogbm9kZS5yb3dJbmRleCwgbm9kZSwgY29udGV4dDogdGhpcy5fY29udGV4dCB9KTtcbn1cbiJdfQ==
@@ -39,4 +39,33 @@ export function resolveCellClass(column, row) {
39
39
  ? column.cellClass(row)
40
40
  : column.cellClass;
41
41
  }
42
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib25lLWNlbGwuaGVscGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb25lLWdyaWQvc3JjL2xpYi9oZWxwZXJzL29uZS1jZWxsLmhlbHBlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQTs7R0FFRztBQUNILE1BQU0sVUFBVSxZQUFZLENBQUMsUUFBZ0IsRUFBRSxLQUFhO0lBRTFELE9BQU8sR0FBRyxRQUFRLEtBQUssS0FBSyxFQUFFLENBQUM7QUFDakMsQ0FBQztBQUVELE1BQU0sVUFBVSxVQUFVLENBQUMsS0FBYSxFQUFFLEtBQWE7SUFFckQsT0FBTyxHQUFHLEtBQUssS0FBSyxLQUFLLEVBQUUsQ0FBQztBQUM5QixDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUsYUFBYSxDQUFJLElBQU8sRUFBRSxLQUFhO0lBRXJELE9BQU8sS0FBSyxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLENBQVcsQ0FBQztBQUM3RSxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsTUFBb0IsRUFBRSxHQUFRO0lBRTdELElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUztRQUFFLE9BQU8sRUFBRSxDQUFDO0lBRWpDLE9BQU8sT0FBTyxNQUFNLENBQUMsU0FBUyxLQUFLLFVBQVU7UUFDM0MsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDO1FBQ3ZCLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDO0FBQ3ZCLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxNQUFvQixFQUFFLEdBQVE7SUFFN0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTO1FBQUUsT0FBTyxFQUFFLENBQUM7SUFFakMsT0FBTyxPQUFPLE1BQU0sQ0FBQyxTQUFTLEtBQUssVUFBVTtRQUMzQyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUM7UUFDdkIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUM7QUFDdkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9uZUNvbHVtbkRlZiB9IGZyb20gXCIuLi9jb3JlL21vZGVscy9vbmUtY29sdW1uLWRlZi10eXBlcy5tb2RlbFwiO1xuXG4vKipcbiAqIEdlbmVyYXRlIENlbGwgRmllbGRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENlbGxGaWVsZChyb3dJbmRleDogbnVtYmVyLCBmaWVsZDogc3RyaW5nKTogc3RyaW5nIHtcblxuICByZXR1cm4gYCR7cm93SW5kZXh9LS0ke2ZpZWxkfWA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDZWxsS2V5KHJvd0lkOiBzdHJpbmcsIGZpZWxkOiBzdHJpbmcpOiBzdHJpbmcge1xuXG4gIHJldHVybiBgJHtyb3dJZH0tLSR7ZmllbGR9YDtcbn1cblxuLyoqXG4gKiBHZXQgVmFsdWUgRnJvbSBEYXRhIEZpZWxkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRGaWVsZFZhbHVlPFQ+KGRhdGE6IFQsIGZpZWxkOiBzdHJpbmcpOiBzdHJpbmcge1xuXG4gIHJldHVybiBmaWVsZD8uc3BsaXQoJy4nKT8ucmVkdWNlKChvYmosIGtleSkgPT4gb2JqPy5ba2V5XSwgZGF0YSkgYXMgc3RyaW5nO1xufVxuXG4vKipcbiAqIFJlc29sdmUgY2VsbCBzdHlsZSAoaGFuZGxlcyBib3RoIHN0YXRpYyBhbmQgZnVuY3Rpb24tYmFzZWQpXG4gKiBAcGFyYW0gY29sdW1uIFxuICogQHBhcmFtIHJvdyBcbiAqIEByZXR1cm5zIFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUNlbGxTdHlsZShjb2x1bW46IE9uZUNvbHVtbkRlZiwgcm93OiBhbnkpOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9IHtcblxuICBpZiAoIWNvbHVtbi5jZWxsU3R5bGUpIHJldHVybiB7fTtcblxuICByZXR1cm4gdHlwZW9mIGNvbHVtbi5jZWxsU3R5bGUgPT09ICdmdW5jdGlvbidcbiAgICA/IGNvbHVtbi5jZWxsU3R5bGUocm93KVxuICAgIDogY29sdW1uLmNlbGxTdHlsZTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIGNlbGwgY2xhc3MgKGhhbmRsZXMgYm90aCBzdGF0aWMgYW5kIGZ1bmN0aW9uLWJhc2VkKVxuICogQHBhcmFtIGNvbHVtbiBcbiAqIEBwYXJhbSByb3cgXG4gKiBAcmV0dXJucyBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVDZWxsQ2xhc3MoY29sdW1uOiBPbmVDb2x1bW5EZWYsIHJvdzogYW55KTogc3RyaW5nIHwgc3RyaW5nW10ge1xuXG4gIGlmICghY29sdW1uLmNlbGxDbGFzcykgcmV0dXJuICcnO1xuXG4gIHJldHVybiB0eXBlb2YgY29sdW1uLmNlbGxDbGFzcyA9PT0gJ2Z1bmN0aW9uJ1xuICAgID8gY29sdW1uLmNlbGxDbGFzcyhyb3cpXG4gICAgOiBjb2x1bW4uY2VsbENsYXNzO1xufSJdfQ==
42
+ /**
43
+ * The cell's raw field value, with blank treated as absent.
44
+ *
45
+ * Was `CellFieldValuePipe`. It lived as an Angular pipe but was only ever
46
+ * instantiated inside a service — a utility wearing a `@Pipe` decorator, which
47
+ * also cost it a module declaration for a template use that never existed.
48
+ */
49
+ export function readCellValue(data, field) {
50
+ const value = getFieldValue(data, field);
51
+ if (value === null || value === undefined)
52
+ return null;
53
+ if (typeof value === 'string' && value.trim() === '')
54
+ return null;
55
+ return value;
56
+ }
57
+ /**
58
+ * Whether a cell has nothing to show.
59
+ *
60
+ * Was `CellFieldValueEmptyPipe`. `field` is optional on `OneColumnDef` — an
61
+ * action-only column legitimately has none — and reading it unguarded used to
62
+ * throw while the grid built cell state, taking the whole grid down. No field
63
+ * means nothing to read, which is empty by definition.
64
+ */
65
+ export function isCellEmpty(data, field) {
66
+ if (!data || !field)
67
+ return true;
68
+ const value = getFieldValue(data, field);
69
+ return value === null || value === undefined || value === '';
70
+ }
71
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib25lLWNlbGwuaGVscGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb25lLWdyaWQvc3JjL2xpYi9oZWxwZXJzL29uZS1jZWxsLmhlbHBlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQTs7R0FFRztBQUNILE1BQU0sVUFBVSxZQUFZLENBQUMsUUFBZ0IsRUFBRSxLQUFhO0lBRTFELE9BQU8sR0FBRyxRQUFRLEtBQUssS0FBSyxFQUFFLENBQUM7QUFDakMsQ0FBQztBQUVELE1BQU0sVUFBVSxVQUFVLENBQUMsS0FBYSxFQUFFLEtBQWE7SUFFckQsT0FBTyxHQUFHLEtBQUssS0FBSyxLQUFLLEVBQUUsQ0FBQztBQUM5QixDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUsYUFBYSxDQUFJLElBQU8sRUFBRSxLQUFhO0lBRXJELE9BQU8sS0FBSyxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLENBQVcsQ0FBQztBQUM3RSxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsTUFBb0IsRUFBRSxHQUFRO0lBRTdELElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUztRQUFFLE9BQU8sRUFBRSxDQUFDO0lBRWpDLE9BQU8sT0FBTyxNQUFNLENBQUMsU0FBUyxLQUFLLFVBQVU7UUFDM0MsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDO1FBQ3ZCLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDO0FBQ3ZCLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxNQUFvQixFQUFFLEdBQVE7SUFFN0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTO1FBQUUsT0FBTyxFQUFFLENBQUM7SUFFakMsT0FBTyxPQUFPLE1BQU0sQ0FBQyxTQUFTLEtBQUssVUFBVTtRQUMzQyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUM7UUFDdkIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUM7QUFDdkIsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxhQUFhLENBQUksSUFBTyxFQUFFLEtBQWE7SUFFbkQsTUFBTSxLQUFLLEdBQUcsYUFBYSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztJQUV6QyxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksS0FBSyxLQUFLLFNBQVM7UUFBRSxPQUFPLElBQUksQ0FBQztJQUV2RCxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRTtRQUFFLE9BQU8sSUFBSSxDQUFDO0lBRWxFLE9BQU8sS0FBSyxDQUFDO0FBQ2pCLENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxVQUFVLFdBQVcsQ0FBSSxJQUFPLEVBQUUsS0FBYTtJQUVqRCxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBRWpDLE1BQU0sS0FBSyxHQUFHLGFBQWEsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFFekMsT0FBTyxLQUFLLEtBQUssSUFBSSxJQUFJLEtBQUssS0FBSyxTQUFTLElBQUksS0FBSyxLQUFLLEVBQUUsQ0FBQztBQUNqRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT25lQ29sdW1uRGVmIH0gZnJvbSBcIi4uL2NvcmUvbW9kZWxzL29uZS1jb2x1bW4tZGVmLXR5cGVzLm1vZGVsXCI7XG5cbi8qKlxuICogR2VuZXJhdGUgQ2VsbCBGaWVsZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2VsbEZpZWxkKHJvd0luZGV4OiBudW1iZXIsIGZpZWxkOiBzdHJpbmcpOiBzdHJpbmcge1xuXG4gIHJldHVybiBgJHtyb3dJbmRleH0tLSR7ZmllbGR9YDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENlbGxLZXkocm93SWQ6IHN0cmluZywgZmllbGQ6IHN0cmluZyk6IHN0cmluZyB7XG5cbiAgcmV0dXJuIGAke3Jvd0lkfS0tJHtmaWVsZH1gO1xufVxuXG4vKipcbiAqIEdldCBWYWx1ZSBGcm9tIERhdGEgRmllbGRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEZpZWxkVmFsdWU8VD4oZGF0YTogVCwgZmllbGQ6IHN0cmluZyk6IHN0cmluZyB7XG5cbiAgcmV0dXJuIGZpZWxkPy5zcGxpdCgnLicpPy5yZWR1Y2UoKG9iaiwga2V5KSA9PiBvYmo/LltrZXldLCBkYXRhKSBhcyBzdHJpbmc7XG59XG5cbi8qKlxuICogUmVzb2x2ZSBjZWxsIHN0eWxlIChoYW5kbGVzIGJvdGggc3RhdGljIGFuZCBmdW5jdGlvbi1iYXNlZClcbiAqIEBwYXJhbSBjb2x1bW4gXG4gKiBAcGFyYW0gcm93IFxuICogQHJldHVybnMgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlQ2VsbFN0eWxlKGNvbHVtbjogT25lQ29sdW1uRGVmLCByb3c6IGFueSk6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0ge1xuXG4gIGlmICghY29sdW1uLmNlbGxTdHlsZSkgcmV0dXJuIHt9O1xuXG4gIHJldHVybiB0eXBlb2YgY29sdW1uLmNlbGxTdHlsZSA9PT0gJ2Z1bmN0aW9uJ1xuICAgID8gY29sdW1uLmNlbGxTdHlsZShyb3cpXG4gICAgOiBjb2x1bW4uY2VsbFN0eWxlO1xufVxuXG4vKipcbiAqIFJlc29sdmUgY2VsbCBjbGFzcyAoaGFuZGxlcyBib3RoIHN0YXRpYyBhbmQgZnVuY3Rpb24tYmFzZWQpXG4gKiBAcGFyYW0gY29sdW1uIFxuICogQHBhcmFtIHJvdyBcbiAqIEByZXR1cm5zIFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUNlbGxDbGFzcyhjb2x1bW46IE9uZUNvbHVtbkRlZiwgcm93OiBhbnkpOiBzdHJpbmcgfCBzdHJpbmdbXSB7XG5cbiAgaWYgKCFjb2x1bW4uY2VsbENsYXNzKSByZXR1cm4gJyc7XG5cbiAgcmV0dXJuIHR5cGVvZiBjb2x1bW4uY2VsbENsYXNzID09PSAnZnVuY3Rpb24nXG4gICAgPyBjb2x1bW4uY2VsbENsYXNzKHJvdylcbiAgICA6IGNvbHVtbi5jZWxsQ2xhc3M7XG59XG5cbi8qKlxuICogVGhlIGNlbGwncyByYXcgZmllbGQgdmFsdWUsIHdpdGggYmxhbmsgdHJlYXRlZCBhcyBhYnNlbnQuXG4gKlxuICogV2FzIGBDZWxsRmllbGRWYWx1ZVBpcGVgLiBJdCBsaXZlZCBhcyBhbiBBbmd1bGFyIHBpcGUgYnV0IHdhcyBvbmx5IGV2ZXJcbiAqIGluc3RhbnRpYXRlZCBpbnNpZGUgYSBzZXJ2aWNlIOKAlCBhIHV0aWxpdHkgd2VhcmluZyBhIGBAUGlwZWAgZGVjb3JhdG9yLCB3aGljaFxuICogYWxzbyBjb3N0IGl0IGEgbW9kdWxlIGRlY2xhcmF0aW9uIGZvciBhIHRlbXBsYXRlIHVzZSB0aGF0IG5ldmVyIGV4aXN0ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkQ2VsbFZhbHVlPFQ+KGRhdGE6IFQsIGZpZWxkOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcblxuICAgIGNvbnN0IHZhbHVlID0gZ2V0RmllbGRWYWx1ZShkYXRhLCBmaWVsZCk7XG5cbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIG51bGw7XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS50cmltKCkgPT09ICcnKSByZXR1cm4gbnVsbDtcblxuICAgIHJldHVybiB2YWx1ZTtcbn1cblxuLyoqXG4gKiBXaGV0aGVyIGEgY2VsbCBoYXMgbm90aGluZyB0byBzaG93LlxuICpcbiAqIFdhcyBgQ2VsbEZpZWxkVmFsdWVFbXB0eVBpcGVgLiBgZmllbGRgIGlzIG9wdGlvbmFsIG9uIGBPbmVDb2x1bW5EZWZgIOKAlCBhblxuICogYWN0aW9uLW9ubHkgY29sdW1uIGxlZ2l0aW1hdGVseSBoYXMgbm9uZSDigJQgYW5kIHJlYWRpbmcgaXQgdW5ndWFyZGVkIHVzZWQgdG9cbiAqIHRocm93IHdoaWxlIHRoZSBncmlkIGJ1aWx0IGNlbGwgc3RhdGUsIHRha2luZyB0aGUgd2hvbGUgZ3JpZCBkb3duLiBObyBmaWVsZFxuICogbWVhbnMgbm90aGluZyB0byByZWFkLCB3aGljaCBpcyBlbXB0eSBieSBkZWZpbml0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNDZWxsRW1wdHk8VD4oZGF0YTogVCwgZmllbGQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuXG4gICAgaWYgKCFkYXRhIHx8ICFmaWVsZCkgcmV0dXJuIHRydWU7XG5cbiAgICBjb25zdCB2YWx1ZSA9IGdldEZpZWxkVmFsdWUoZGF0YSwgZmllbGQpO1xuXG4gICAgcmV0dXJuIHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09ICcnO1xufVxuIl19