@one-grid-core/angular 0.1.0-beta.5 → 0.2.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 (66) hide show
  1. package/README.md +49 -4
  2. package/esm2022/lib/components/one-grid/one-grid.component.mjs +67 -16
  3. package/esm2022/lib/components/one-grid-body/one-grid-body.component.mjs +282 -30
  4. package/esm2022/lib/components/one-grid-cell-group-renderer/one-grid-cell-group-renderer.component.mjs +10 -7
  5. package/esm2022/lib/components/one-grid-cell-option-menu/one-grid-cell-option-menu.component.mjs +60 -4
  6. package/esm2022/lib/components/one-grid-checkbox-header/one-grid-checkbox-header.component.mjs +14 -5
  7. package/esm2022/lib/components/one-grid-header/one-grid-header.component.mjs +50 -13
  8. package/esm2022/lib/components/one-grid-pagination/one-grid-pagination.component.mjs +39 -15
  9. package/esm2022/lib/components/one-grid-row-action/one-grid-row-action.component.mjs +54 -8
  10. package/esm2022/lib/components/one-grid-row-drag-handle/one-grid-row-drag-handle.component.mjs +110 -0
  11. package/esm2022/lib/core/directives/one-cell-renderer-component.directive.mjs +9 -2
  12. package/esm2022/lib/core/directives/one-cell-text-expand.directive.mjs +33 -51
  13. package/esm2022/lib/core/instants/one-grid-api.class.mjs +429 -166
  14. package/esm2022/lib/core/instants/one-row-node.class.mjs +103 -37
  15. package/esm2022/lib/core/models/one-column-def-types.model.mjs +1 -1
  16. package/esm2022/lib/core/models/one-event-types.model.mjs +1 -1
  17. package/esm2022/lib/core/models/one-grid-types.model.mjs +1 -1
  18. package/esm2022/lib/core/models/one-row-drag.model.mjs +2 -0
  19. package/esm2022/lib/core/models/one-row.model.mjs +1 -1
  20. package/esm2022/lib/core/models/one-tree-data.model.mjs +1 -1
  21. package/esm2022/lib/core/models/one-validation.model.mjs +1 -1
  22. package/esm2022/lib/core/pipes/cell-field-value-empty.pipe.mjs +8 -3
  23. package/esm2022/lib/core/pipes/column-sort-state.pipe.mjs +3 -1
  24. package/esm2022/lib/core/services/og-column.service.mjs +120 -13
  25. package/esm2022/lib/core/services/one-grid-cell.service.mjs +123 -20
  26. package/esm2022/lib/core/services/one-grid-row-drag.service.mjs +351 -0
  27. package/esm2022/lib/core/services/one-grid-selection.service.mjs +19 -6
  28. package/esm2022/lib/helpers/one-column-def.helper.mjs +27 -2
  29. package/esm2022/lib/helpers/one-filter.helper.mjs +71 -12
  30. package/esm2022/lib/helpers/one-validation.helper.mjs +7 -2
  31. package/esm2022/lib/index.mjs +8 -1
  32. package/esm2022/lib/one-grid.module.mjs +7 -16
  33. package/fesm2022/one-grid-core-angular.mjs +2046 -503
  34. package/fesm2022/one-grid-core-angular.mjs.map +1 -1
  35. package/lib/components/one-grid/one-grid.component.d.ts +16 -1
  36. package/lib/components/one-grid-body/one-grid-body.component.d.ts +132 -5
  37. package/lib/components/one-grid-cell-group-renderer/one-grid-cell-group-renderer.component.d.ts +6 -1
  38. package/lib/components/one-grid-cell-option-menu/one-grid-cell-option-menu.component.d.ts +19 -2
  39. package/lib/components/one-grid-checkbox-header/one-grid-checkbox-header.component.d.ts +5 -2
  40. package/lib/components/one-grid-header/one-grid-header.component.d.ts +15 -7
  41. package/lib/components/one-grid-pagination/one-grid-pagination.component.d.ts +24 -5
  42. package/lib/components/one-grid-row-action/one-grid-row-action.component.d.ts +44 -0
  43. package/lib/components/one-grid-row-drag-handle/one-grid-row-drag-handle.component.d.ts +39 -0
  44. package/lib/core/directives/one-cell-text-expand.directive.d.ts +21 -9
  45. package/lib/core/instants/one-grid-api.class.d.ts +212 -26
  46. package/lib/core/instants/one-row-node.class.d.ts +67 -14
  47. package/lib/core/models/one-column-def-types.model.d.ts +89 -15
  48. package/lib/core/models/one-event-types.model.d.ts +24 -1
  49. package/lib/core/models/one-grid-types.model.d.ts +36 -1
  50. package/lib/core/models/one-row-drag.model.d.ts +44 -0
  51. package/lib/core/models/one-row.model.d.ts +0 -5
  52. package/lib/core/models/one-tree-data.model.d.ts +13 -0
  53. package/lib/core/models/one-validation.model.d.ts +12 -2
  54. package/lib/core/pipes/column-sort-state.pipe.d.ts +1 -1
  55. package/lib/core/services/og-column.service.d.ts +44 -3
  56. package/lib/core/services/one-grid-cell.service.d.ts +52 -4
  57. package/lib/core/services/one-grid-row-drag.service.d.ts +113 -0
  58. package/lib/core/services/one-grid-selection.service.d.ts +9 -0
  59. package/lib/helpers/one-column-def.helper.d.ts +19 -1
  60. package/lib/helpers/one-filter.helper.d.ts +29 -4
  61. package/lib/index.d.ts +7 -0
  62. package/lib/one-grid.module.d.ts +17 -19
  63. package/package.json +1 -2
  64. package/scss/_one-grid.scss +389 -17
  65. package/esm2022/lib/core/pipes/cell-disable-resolver.pipe.mjs +0 -26
  66. package/lib/core/pipes/cell-disable-resolver.pipe.d.ts +0 -9
@@ -5,18 +5,21 @@ export class OneGridCellGroupRendererComponent {
5
5
  this.masterDetail = false;
6
6
  this.expansionChanged = new EventEmitter();
7
7
  }
8
- invokeChangedClick() {
9
- // if (this.masterDetail && !this.node.expanded) {
10
- // this.detailCellRendererParams.getDetailRowData({ data: this.node.data, node: this.node, successCallback: (rows) => { this.node.setDetailRowData(rows) }});
11
- // }
8
+ /**
9
+ * Presentational only: report the click and let the body, which holds the
10
+ * API, perform the toggle. The click is stopped from bubbling so it is not
11
+ * also read as a cell click by the cell underneath.
12
+ */
13
+ invokeChangedClick(event) {
14
+ event.stopPropagation();
12
15
  this.expansionChanged.emit({ rowIndex: this.node.rowIndex, data: this.node.data, node: this.node });
13
16
  }
14
17
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: OneGridCellGroupRendererComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
15
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: OneGridCellGroupRendererComponent, selector: "one-grid-cell-group-renderer", inputs: { node: "node", masterDetail: "masterDetail", detailCellRendererParams: "detailCellRendererParams", detailRendererComponent: "detailRendererComponent" }, outputs: { expansionChanged: "expansionChanged" }, ngImport: i0, template: "@if (node.expandable) {\n <span class=\"cell-group-renderer\" [style.padding-left.px]=\"6\" (click)=\"invokeChangedClick()\">\n @if (node.children?.length > 0 || masterDetail) {\n <i [class.node-expanded]=\"node.expanded\" class=\"bi bi-chevron-right expansion-icon\"></i>\n }\n </span>\n}\n", styles: [""] }); }
18
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: OneGridCellGroupRendererComponent, selector: "one-grid-cell-group-renderer", inputs: { node: "node", masterDetail: "masterDetail", detailCellRendererParams: "detailCellRendererParams", detailRendererComponent: "detailRendererComponent" }, outputs: { expansionChanged: "expansionChanged" }, ngImport: i0, template: "@if (node.expandable) {\n <span class=\"cell-group-renderer\" [style.padding-left.px]=\"6\">\n @if (node.children?.length > 0 || masterDetail) {\n <!-- A real button, not a div with a click handler: this is a\n disclosure control, so it needs to be focusable, operable with\n Enter and Space, and to expose its state via aria-expanded.\n mousedown is stopped so pressing the expander does not also\n begin a cell range selection on the cell underneath. -->\n <button\n type=\"button\"\n class=\"expansion-button\"\n [attr.aria-expanded]=\"node.expanded\"\n [attr.aria-label]=\"node.expanded ? 'Collapse row' : 'Expand row'\"\n (mousedown)=\"$event.stopPropagation()\"\n (dblclick)=\"$event.stopPropagation()\"\n (click)=\"invokeChangedClick($event)\">\n <i [class.node-expanded]=\"node.expanded\" class=\"bi bi-chevron-right expansion-icon\"></i>\n </button>\n }\n </span>\n}\n", styles: [""] }); }
16
19
  }
17
20
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: OneGridCellGroupRendererComponent, decorators: [{
18
21
  type: Component,
19
- args: [{ standalone: false, selector: 'one-grid-cell-group-renderer', template: "@if (node.expandable) {\n <span class=\"cell-group-renderer\" [style.padding-left.px]=\"6\" (click)=\"invokeChangedClick()\">\n @if (node.children?.length > 0 || masterDetail) {\n <i [class.node-expanded]=\"node.expanded\" class=\"bi bi-chevron-right expansion-icon\"></i>\n }\n </span>\n}\n" }]
22
+ args: [{ standalone: false, selector: 'one-grid-cell-group-renderer', template: "@if (node.expandable) {\n <span class=\"cell-group-renderer\" [style.padding-left.px]=\"6\">\n @if (node.children?.length > 0 || masterDetail) {\n <!-- A real button, not a div with a click handler: this is a\n disclosure control, so it needs to be focusable, operable with\n Enter and Space, and to expose its state via aria-expanded.\n mousedown is stopped so pressing the expander does not also\n begin a cell range selection on the cell underneath. -->\n <button\n type=\"button\"\n class=\"expansion-button\"\n [attr.aria-expanded]=\"node.expanded\"\n [attr.aria-label]=\"node.expanded ? 'Collapse row' : 'Expand row'\"\n (mousedown)=\"$event.stopPropagation()\"\n (dblclick)=\"$event.stopPropagation()\"\n (click)=\"invokeChangedClick($event)\">\n <i [class.node-expanded]=\"node.expanded\" class=\"bi bi-chevron-right expansion-icon\"></i>\n </button>\n }\n </span>\n}\n" }]
20
23
  }], propDecorators: { node: [{
21
24
  type: Input
22
25
  }], masterDetail: [{
@@ -28,4 +31,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
28
31
  }], expansionChanged: [{
29
32
  type: Output
30
33
  }] } });
31
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib25lLWdyaWQtY2VsbC1ncm91cC1yZW5kZXJlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vbmUtZ3JpZC9zcmMvbGliL2NvbXBvbmVudHMvb25lLWdyaWQtY2VsbC1ncm91cC1yZW5kZXJlci9vbmUtZ3JpZC1jZWxsLWdyb3VwLXJlbmRlcmVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29uZS1ncmlkL3NyYy9saWIvY29tcG9uZW50cy9vbmUtZ3JpZC1jZWxsLWdyb3VwLXJlbmRlcmVyL29uZS1ncmlkLWNlbGwtZ3JvdXAtcmVuZGVyZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBUSxNQUFNLGVBQWUsQ0FBQzs7QUFZN0UsTUFBTSxPQUFPLGlDQUFpQztJQU45QztRQVNXLGlCQUFZLEdBQVksS0FBSyxDQUFDO1FBRzdCLHFCQUFnQixHQUFHLElBQUksWUFBWSxFQUE0QixDQUFDO0tBVzNFO0lBVEMsa0JBQWtCO1FBRWhCLGtEQUFrRDtRQUVsRCwrSkFBK0o7UUFDL0osSUFBSTtRQUVKLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUN0RyxDQUFDOytHQWhCVSxpQ0FBaUM7bUdBQWpDLGlDQUFpQyx5UkNaOUMsb1VBT0E7OzRGREthLGlDQUFpQztrQkFON0MsU0FBUztpQ0FDSSxLQUFLLFlBQ1AsOEJBQThCOzhCQU0vQixJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyx3QkFBd0I7c0JBQWhDLEtBQUs7Z0JBQ0csdUJBQXVCO3NCQUEvQixLQUFLO2dCQUNJLGdCQUFnQjtzQkFBekIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0LCBUeXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPbmVSb3dOb2RlIH0gZnJvbSAnLi4vLi4vY29yZS9pbnN0YW50cy9vbmUtcm93LW5vZGUuY2xhc3MnO1xuaW1wb3J0IHsgRXhwYW5zaW9uQ2hhbmdlZEV2ZW50IH0gZnJvbSAnLi4vLi4vY29yZS9tb2RlbHMvb25lLWV2ZW50LXR5cGVzLm1vZGVsJztcbmltcG9ydCB7IE9uZURldGFpbENlbGxSZW5kZXJlclBhcmFtcyB9IGZyb20gJy4uLy4uL2NvcmUvbW9kZWxzL29uZS1tYXN0ZXItZGV0YWlsLm1vZGVsJztcbmltcG9ydCB7IE9uZUNlbGxSZW5kZXJlckNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2NvcmUvbW9kZWxzL29uZS10cmVlLWRhdGEubW9kZWwnO1xuXG5AQ29tcG9uZW50KHtcbiAgc3RhbmRhbG9uZTogZmFsc2UsXG4gIHNlbGVjdG9yOiAnb25lLWdyaWQtY2VsbC1ncm91cC1yZW5kZXJlcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9vbmUtZ3JpZC1jZWxsLWdyb3VwLXJlbmRlcmVyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL29uZS1ncmlkLWNlbGwtZ3JvdXAtcmVuZGVyZXIuY29tcG9uZW50LnNjc3MnXG59KVxuZXhwb3J0IGNsYXNzIE9uZUdyaWRDZWxsR3JvdXBSZW5kZXJlckNvbXBvbmVudDxUPiB7XG5cbiAgQElucHV0KCkgbm9kZTogT25lUm93Tm9kZTxUPjtcbiAgQElucHV0KCkgbWFzdGVyRGV0YWlsOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGRldGFpbENlbGxSZW5kZXJlclBhcmFtczogT25lRGV0YWlsQ2VsbFJlbmRlcmVyUGFyYW1zO1xuICBASW5wdXQoKSBkZXRhaWxSZW5kZXJlckNvbXBvbmVudDogVHlwZTxPbmVDZWxsUmVuZGVyZXJDb21wb25lbnQ+O1xuICBAT3V0cHV0KCkgZXhwYW5zaW9uQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8RXhwYW5zaW9uQ2hhbmdlZEV2ZW50PFQ+PigpO1xuXG4gIGludm9rZUNoYW5nZWRDbGljaygpIHtcblxuICAgIC8vIGlmICh0aGlzLm1hc3RlckRldGFpbCAmJiAhdGhpcy5ub2RlLmV4cGFuZGVkKSB7XG5cbiAgICAvLyAgIHRoaXMuZGV0YWlsQ2VsbFJlbmRlcmVyUGFyYW1zLmdldERldGFpbFJvd0RhdGEoeyBkYXRhOiB0aGlzLm5vZGUuZGF0YSwgbm9kZTogdGhpcy5ub2RlLCBzdWNjZXNzQ2FsbGJhY2s6IChyb3dzKSA9PiB7IHRoaXMubm9kZS5zZXREZXRhaWxSb3dEYXRhKHJvd3MpIH19KTtcbiAgICAvLyB9XG5cbiAgICB0aGlzLmV4cGFuc2lvbkNoYW5nZWQuZW1pdCh7IHJvd0luZGV4OiB0aGlzLm5vZGUucm93SW5kZXgsIGRhdGE6IHRoaXMubm9kZS5kYXRhLCBub2RlOiB0aGlzLm5vZGUgfSk7XG4gIH1cbn1cbiIsIkBpZiAobm9kZS5leHBhbmRhYmxlKSB7XG4gICAgPHNwYW4gY2xhc3M9XCJjZWxsLWdyb3VwLXJlbmRlcmVyXCIgW3N0eWxlLnBhZGRpbmctbGVmdC5weF09XCI2XCIgKGNsaWNrKT1cImludm9rZUNoYW5nZWRDbGljaygpXCI+XG4gICAgICAgIEBpZiAobm9kZS5jaGlsZHJlbj8ubGVuZ3RoID4gMCB8fCBtYXN0ZXJEZXRhaWwpIHtcbiAgICAgICAgICAgIDxpIFtjbGFzcy5ub2RlLWV4cGFuZGVkXT1cIm5vZGUuZXhwYW5kZWRcIiBjbGFzcz1cImJpIGJpLWNoZXZyb24tcmlnaHQgZXhwYW5zaW9uLWljb25cIj48L2k+XG4gICAgICAgIH1cbiAgICA8L3NwYW4+XG59XG4iXX0=
34
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib25lLWdyaWQtY2VsbC1ncm91cC1yZW5kZXJlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vbmUtZ3JpZC9zcmMvbGliL2NvbXBvbmVudHMvb25lLWdyaWQtY2VsbC1ncm91cC1yZW5kZXJlci9vbmUtZ3JpZC1jZWxsLWdyb3VwLXJlbmRlcmVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29uZS1ncmlkL3NyYy9saWIvY29tcG9uZW50cy9vbmUtZ3JpZC1jZWxsLWdyb3VwLXJlbmRlcmVyL29uZS1ncmlkLWNlbGwtZ3JvdXAtcmVuZGVyZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBUSxNQUFNLGVBQWUsQ0FBQzs7QUFZN0UsTUFBTSxPQUFPLGlDQUFpQztJQU45QztRQVNXLGlCQUFZLEdBQVksS0FBSyxDQUFDO1FBRzdCLHFCQUFnQixHQUFHLElBQUksWUFBWSxFQUE0QixDQUFDO0tBYTNFO0lBWEM7Ozs7T0FJRztJQUNILGtCQUFrQixDQUFDLEtBQWlCO1FBRWxDLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUV4QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7SUFDdEcsQ0FBQzsrR0FsQlUsaUNBQWlDO21HQUFqQyxpQ0FBaUMseVJDWjlDLDRsQ0FxQkE7OzRGRFRhLGlDQUFpQztrQkFON0MsU0FBUztpQ0FDSSxLQUFLLFlBQ1AsOEJBQThCOzhCQU0vQixJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyx3QkFBd0I7c0JBQWhDLEtBQUs7Z0JBQ0csdUJBQXVCO3NCQUEvQixLQUFLO2dCQUNJLGdCQUFnQjtzQkFBekIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0LCBUeXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPbmVSb3dOb2RlIH0gZnJvbSAnLi4vLi4vY29yZS9pbnN0YW50cy9vbmUtcm93LW5vZGUuY2xhc3MnO1xuaW1wb3J0IHsgRXhwYW5zaW9uQ2hhbmdlZEV2ZW50IH0gZnJvbSAnLi4vLi4vY29yZS9tb2RlbHMvb25lLWV2ZW50LXR5cGVzLm1vZGVsJztcbmltcG9ydCB7IE9uZURldGFpbENlbGxSZW5kZXJlclBhcmFtcyB9IGZyb20gJy4uLy4uL2NvcmUvbW9kZWxzL29uZS1tYXN0ZXItZGV0YWlsLm1vZGVsJztcbmltcG9ydCB7IE9uZUNlbGxSZW5kZXJlckNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2NvcmUvbW9kZWxzL29uZS10cmVlLWRhdGEubW9kZWwnO1xuXG5AQ29tcG9uZW50KHtcbiAgc3RhbmRhbG9uZTogZmFsc2UsXG4gIHNlbGVjdG9yOiAnb25lLWdyaWQtY2VsbC1ncm91cC1yZW5kZXJlcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9vbmUtZ3JpZC1jZWxsLWdyb3VwLXJlbmRlcmVyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL29uZS1ncmlkLWNlbGwtZ3JvdXAtcmVuZGVyZXIuY29tcG9uZW50LnNjc3MnXG59KVxuZXhwb3J0IGNsYXNzIE9uZUdyaWRDZWxsR3JvdXBSZW5kZXJlckNvbXBvbmVudDxUPiB7XG5cbiAgQElucHV0KCkgbm9kZTogT25lUm93Tm9kZTxUPjtcbiAgQElucHV0KCkgbWFzdGVyRGV0YWlsOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGRldGFpbENlbGxSZW5kZXJlclBhcmFtczogT25lRGV0YWlsQ2VsbFJlbmRlcmVyUGFyYW1zO1xuICBASW5wdXQoKSBkZXRhaWxSZW5kZXJlckNvbXBvbmVudDogVHlwZTxPbmVDZWxsUmVuZGVyZXJDb21wb25lbnQ+O1xuICBAT3V0cHV0KCkgZXhwYW5zaW9uQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8RXhwYW5zaW9uQ2hhbmdlZEV2ZW50PFQ+PigpO1xuXG4gIC8qKlxuICAgKiBQcmVzZW50YXRpb25hbCBvbmx5OiByZXBvcnQgdGhlIGNsaWNrIGFuZCBsZXQgdGhlIGJvZHksIHdoaWNoIGhvbGRzIHRoZVxuICAgKiBBUEksIHBlcmZvcm0gdGhlIHRvZ2dsZS4gVGhlIGNsaWNrIGlzIHN0b3BwZWQgZnJvbSBidWJibGluZyBzbyBpdCBpcyBub3RcbiAgICogYWxzbyByZWFkIGFzIGEgY2VsbCBjbGljayBieSB0aGUgY2VsbCB1bmRlcm5lYXRoLlxuICAgKi9cbiAgaW52b2tlQ2hhbmdlZENsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG5cbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgIHRoaXMuZXhwYW5zaW9uQ2hhbmdlZC5lbWl0KHsgcm93SW5kZXg6IHRoaXMubm9kZS5yb3dJbmRleCwgZGF0YTogdGhpcy5ub2RlLmRhdGEsIG5vZGU6IHRoaXMubm9kZSB9KTtcbiAgfVxufVxuIiwiQGlmIChub2RlLmV4cGFuZGFibGUpIHtcbiAgICA8c3BhbiBjbGFzcz1cImNlbGwtZ3JvdXAtcmVuZGVyZXJcIiBbc3R5bGUucGFkZGluZy1sZWZ0LnB4XT1cIjZcIj5cbiAgICAgICAgQGlmIChub2RlLmNoaWxkcmVuPy5sZW5ndGggPiAwIHx8IG1hc3RlckRldGFpbCkge1xuICAgICAgICAgICAgPCEtLSBBIHJlYWwgYnV0dG9uLCBub3QgYSBkaXYgd2l0aCBhIGNsaWNrIGhhbmRsZXI6IHRoaXMgaXMgYVxuICAgICAgICAgICAgICAgICBkaXNjbG9zdXJlIGNvbnRyb2wsIHNvIGl0IG5lZWRzIHRvIGJlIGZvY3VzYWJsZSwgb3BlcmFibGUgd2l0aFxuICAgICAgICAgICAgICAgICBFbnRlciBhbmQgU3BhY2UsIGFuZCB0byBleHBvc2UgaXRzIHN0YXRlIHZpYSBhcmlhLWV4cGFuZGVkLlxuICAgICAgICAgICAgICAgICBtb3VzZWRvd24gaXMgc3RvcHBlZCBzbyBwcmVzc2luZyB0aGUgZXhwYW5kZXIgZG9lcyBub3QgYWxzb1xuICAgICAgICAgICAgICAgICBiZWdpbiBhIGNlbGwgcmFuZ2Ugc2VsZWN0aW9uIG9uIHRoZSBjZWxsIHVuZGVybmVhdGguIC0tPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZXhwYW5zaW9uLWJ1dHRvblwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJub2RlLmV4cGFuZGVkXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIm5vZGUuZXhwYW5kZWQgPyAnQ29sbGFwc2Ugcm93JyA6ICdFeHBhbmQgcm93J1wiXG4gICAgICAgICAgICAgICAgKG1vdXNlZG93bik9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgICAgICAgIChkYmxjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJpbnZva2VDaGFuZ2VkQ2xpY2soJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgIDxpIFtjbGFzcy5ub2RlLWV4cGFuZGVkXT1cIm5vZGUuZXhwYW5kZWRcIiBjbGFzcz1cImJpIGJpLWNoZXZyb24tcmlnaHQgZXhwYW5zaW9uLWljb25cIj48L2k+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgfVxuICAgIDwvc3Bhbj5cbn1cbiJdfQ==
@@ -1,6 +1,9 @@
1
- import { Component, EventEmitter, HostListener, Input, Output } from '@angular/core';
1
+ import { Component, EventEmitter, HostListener, Input, Output, ViewChildren } from '@angular/core';
2
2
  import * as i0 from "@angular/core";
3
3
  export class OneGridCellOptionMenuComponent {
4
+ get menuLabel() {
5
+ return `Options for ${this.column?.headerName ?? this.column?.field ?? 'this cell'}`;
6
+ }
4
7
  constructor(elementRef) {
5
8
  this.elementRef = elementRef;
6
9
  this.column = null;
@@ -8,6 +11,56 @@ export class OneGridCellOptionMenuComponent {
8
11
  this.options = [];
9
12
  this.cellOptionMenuSelect = new EventEmitter();
10
13
  this.cellOptionMenuClose = new EventEmitter();
14
+ /**
15
+ * Roving tabindex: one item is tabbable and the arrows move which. Standard
16
+ * for a menu — a list of separately tabbable buttons makes a keyboard user
17
+ * tab through every option to get past the menu.
18
+ */
19
+ this.activeIndex = 0;
20
+ }
21
+ /**
22
+ * Move focus into the menu once it exists.
23
+ *
24
+ * Opening a menu and leaving focus on the trigger strands a keyboard user:
25
+ * the menu is on screen and nothing they press reaches it.
26
+ */
27
+ ngAfterViewInit() {
28
+ this.focusItem(0);
29
+ }
30
+ onItemKeydown(event, index, option) {
31
+ switch (event.key) {
32
+ case 'ArrowDown':
33
+ event.preventDefault();
34
+ this.focusItem((index + 1) % this.options.length);
35
+ return;
36
+ case 'ArrowUp':
37
+ event.preventDefault();
38
+ this.focusItem((index - 1 + this.options.length) % this.options.length);
39
+ return;
40
+ case 'Home':
41
+ event.preventDefault();
42
+ this.focusItem(0);
43
+ return;
44
+ case 'End':
45
+ event.preventDefault();
46
+ this.focusItem(this.options.length - 1);
47
+ return;
48
+ case 'Enter':
49
+ case ' ':
50
+ // A <button> already activates on both, but only once the default runs.
51
+ // Handling it here keeps the menu's behaviour independent of that.
52
+ event.preventDefault();
53
+ this.onOptionSelected(option);
54
+ return;
55
+ default:
56
+ return;
57
+ }
58
+ }
59
+ focusItem(index) {
60
+ if (!this.options?.length)
61
+ return;
62
+ this.activeIndex = index;
63
+ this.items?.get(index)?.nativeElement?.focus();
11
64
  }
12
65
  // Click outside
13
66
  onDocumentClick(event) {
@@ -39,11 +92,11 @@ export class OneGridCellOptionMenuComponent {
39
92
  this.cellOptionMenuClose.emit();
40
93
  }
41
94
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: OneGridCellOptionMenuComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
42
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: OneGridCellOptionMenuComponent, selector: "one-grid-cell-option-menu", inputs: { column: "column", node: "node", options: "options" }, outputs: { cellOptionMenuSelect: "cellOptionMenuSelect", cellOptionMenuClose: "cellOptionMenuClose" }, host: { listeners: { "document:click": "onDocumentClick($event)", "document:keydown.escape": "onEscape()", "document:scroll": "onScroll()" } }, ngImport: i0, template: "<div class=\"cell-option-menu\" #menuEl>\n @for (opt of options; track opt.value) {\n <div class=\"cell-option-menu-item\" (click)=\"onOptionSelected(opt)\">\n <!-- <span [style.padding-right.px]=\"8\"><lucide-icon name=\"check\" [size]=\"16\" [strokeWidth]=\"2\"></lucide-icon></span> -->\n <span>{{ opt.text }}</span> \n </div>\n }\n</div>", styles: [""] }); }
95
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: OneGridCellOptionMenuComponent, selector: "one-grid-cell-option-menu", inputs: { column: "column", node: "node", options: "options" }, outputs: { cellOptionMenuSelect: "cellOptionMenuSelect", cellOptionMenuClose: "cellOptionMenuClose" }, host: { listeners: { "document:click": "onDocumentClick($event)", "document:keydown.escape": "onEscape()", "document:scroll": "onScroll()" } }, viewQueries: [{ propertyName: "items", predicate: ["item"], descendants: true }], ngImport: i0, template: "<!-- A menu, so it is announced as one and operable from the keyboard: the items\n were `<div (click)>` with no role, which meant the menu could be opened by\n mouse and then not used at all without one. -->\n<div class=\"cell-option-menu\" role=\"menu\" #menuEl [attr.aria-label]=\"menuLabel\">\n @for (opt of options; let index = $index; track opt.value) {\n <button\n type=\"button\"\n role=\"menuitem\"\n class=\"cell-option-menu-item\"\n #item\n [tabindex]=\"index === activeIndex ? 0 : -1\"\n (click)=\"onOptionSelected(opt)\"\n (keydown)=\"onItemKeydown($event, index, opt)\">\n <span>{{ opt.text }}</span>\n </button>\n }\n</div>\n", styles: [""] }); }
43
96
  }
44
97
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: OneGridCellOptionMenuComponent, decorators: [{
45
98
  type: Component,
46
- args: [{ selector: 'one-grid-cell-option-menu', standalone: false, template: "<div class=\"cell-option-menu\" #menuEl>\n @for (opt of options; track opt.value) {\n <div class=\"cell-option-menu-item\" (click)=\"onOptionSelected(opt)\">\n <!-- <span [style.padding-right.px]=\"8\"><lucide-icon name=\"check\" [size]=\"16\" [strokeWidth]=\"2\"></lucide-icon></span> -->\n <span>{{ opt.text }}</span> \n </div>\n }\n</div>" }]
99
+ args: [{ selector: 'one-grid-cell-option-menu', standalone: false, template: "<!-- A menu, so it is announced as one and operable from the keyboard: the items\n were `<div (click)>` with no role, which meant the menu could be opened by\n mouse and then not used at all without one. -->\n<div class=\"cell-option-menu\" role=\"menu\" #menuEl [attr.aria-label]=\"menuLabel\">\n @for (opt of options; let index = $index; track opt.value) {\n <button\n type=\"button\"\n role=\"menuitem\"\n class=\"cell-option-menu-item\"\n #item\n [tabindex]=\"index === activeIndex ? 0 : -1\"\n (click)=\"onOptionSelected(opt)\"\n (keydown)=\"onItemKeydown($event, index, opt)\">\n <span>{{ opt.text }}</span>\n </button>\n }\n</div>\n" }]
47
100
  }], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { column: [{
48
101
  type: Input
49
102
  }], node: [{
@@ -54,6 +107,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
54
107
  type: Output
55
108
  }], cellOptionMenuClose: [{
56
109
  type: Output
110
+ }], items: [{
111
+ type: ViewChildren,
112
+ args: ['item']
57
113
  }], onDocumentClick: [{
58
114
  type: HostListener,
59
115
  args: ['document:click', ['$event']]
@@ -64,4 +120,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
64
120
  type: HostListener,
65
121
  args: ['document:scroll']
66
122
  }] } });
67
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib25lLWdyaWQtY2VsbC1vcHRpb24tbWVudS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vbmUtZ3JpZC9zcmMvbGliL2NvbXBvbmVudHMvb25lLWdyaWQtY2VsbC1vcHRpb24tbWVudS9vbmUtZ3JpZC1jZWxsLW9wdGlvbi1tZW51LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29uZS1ncmlkL3NyYy9saWIvY29tcG9uZW50cy9vbmUtZ3JpZC1jZWxsLW9wdGlvbi1tZW51L29uZS1ncmlkLWNlbGwtb3B0aW9uLW1lbnUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBYyxZQUFZLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQWEsTUFBTSxlQUFlLENBQUM7O0FBVzVHLE1BQU0sT0FBTyw4QkFBOEI7SUFRekMsWUFBb0IsVUFBc0I7UUFBdEIsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQU5qQyxXQUFNLEdBQWlCLElBQUksQ0FBQztRQUM1QixTQUFJLEdBQWUsSUFBSSxDQUFDO1FBQ3hCLFlBQU8sR0FBd0IsRUFBRSxDQUFDO1FBQ2pDLHlCQUFvQixHQUFHLElBQUksWUFBWSxFQUErQixDQUFDO1FBQ3ZFLHdCQUFtQixHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7SUFFWixDQUFDO0lBRTlDLGdCQUFnQjtJQUVoQixlQUFlLENBQUMsS0FBaUI7UUFFL0IsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQXFCLENBQUM7UUFFM0MsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBRXBELElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNmLENBQUM7SUFDSCxDQUFDO0lBRUQsYUFBYTtJQUViLFFBQVE7UUFFTixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDZixDQUFDO0lBRUQsNkNBQTZDO0lBRTdDLFFBQVE7UUFFTixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDZixDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLGdCQUFnQixDQUFDLE1BQVc7UUFFMUIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQztZQUM3QixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07WUFDbkIsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO1lBQ2YsTUFBTSxFQUFFLE1BQU07U0FDZixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDZixDQUFDO0lBRUQsc0JBQXNCO0lBQ2QsS0FBSztRQUVYLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQ2pELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNsQyxDQUFDOytHQXBEVSw4QkFBOEI7bUdBQTlCLDhCQUE4Qix3WENYM0MsaVlBT007OzRGRElPLDhCQUE4QjtrQkFOMUMsU0FBUzsrQkFDRSwyQkFBMkIsY0FDekIsS0FBSzsrRUFNUixNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDSSxvQkFBb0I7c0JBQTdCLE1BQU07Z0JBQ0csbUJBQW1CO3NCQUE1QixNQUFNO2dCQU1QLGVBQWU7c0JBRGQsWUFBWTt1QkFBQyxnQkFBZ0IsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFhMUMsUUFBUTtzQkFEUCxZQUFZO3VCQUFDLHlCQUF5QjtnQkFRdkMsUUFBUTtzQkFEUCxZQUFZO3VCQUFDLGlCQUFpQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBIb3N0TGlzdGVuZXIsIElucHV0LCBPdXRwdXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT25lUm93Tm9kZSB9IGZyb20gJy4uLy4uL2NvcmUvaW5zdGFudHMvb25lLXJvdy1ub2RlLmNsYXNzJztcbmltcG9ydCB7IE9uZUNvbHVtbkRlZiB9IGZyb20gJy4uLy4uL2NvcmUvbW9kZWxzL29uZS1jb2x1bW4tZGVmLXR5cGVzLm1vZGVsJztcbmltcG9ydCB7IENlbGxPcHRpb25NZW51U2VsZWN0ZWRFdmVudCwgT25lQ2VsbE9wdGlvbk1lbnUgfSBmcm9tICcuLi8uLi9jb3JlL21vZGVscy9vbmUtZXZlbnQtdHlwZXMubW9kZWwnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdvbmUtZ3JpZC1jZWxsLW9wdGlvbi1tZW51JyxcbiAgc3RhbmRhbG9uZTogZmFsc2UsXG4gIHRlbXBsYXRlVXJsOiAnLi9vbmUtZ3JpZC1jZWxsLW9wdGlvbi1tZW51LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL29uZS1ncmlkLWNlbGwtb3B0aW9uLW1lbnUuY29tcG9uZW50LnNjc3MnLFxufSlcbmV4cG9ydCBjbGFzcyBPbmVHcmlkQ2VsbE9wdGlvbk1lbnVDb21wb25lbnQge1xuXG4gIEBJbnB1dCgpIGNvbHVtbjogT25lQ29sdW1uRGVmID0gbnVsbDtcbiAgQElucHV0KCkgbm9kZTogT25lUm93Tm9kZSA9IG51bGw7XG4gIEBJbnB1dCgpIG9wdGlvbnM6IE9uZUNlbGxPcHRpb25NZW51W10gPSBbXTtcbiAgQE91dHB1dCgpIGNlbGxPcHRpb25NZW51U2VsZWN0ID0gbmV3IEV2ZW50RW1pdHRlcjxDZWxsT3B0aW9uTWVudVNlbGVjdGVkRXZlbnQ+KCk7XG4gIEBPdXRwdXQoKSBjZWxsT3B0aW9uTWVudUNsb3NlID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZikge31cblxuICAvLyBDbGljayBvdXRzaWRlXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJywgWyckZXZlbnQnXSlcbiAgb25Eb2N1bWVudENsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG5cbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICBpZiAoIXRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKHRhcmdldCkpIHtcblxuICAgICAgdGhpcy5jbG9zZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEVzY2FwZSBrZXlcbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6a2V5ZG93bi5lc2NhcGUnKVxuICBvbkVzY2FwZSgpIHtcblxuICAgIHRoaXMuY2xvc2UoKTtcbiAgfVxuXG4gIC8vIFNjcm9sbCBjbG9zZXMgbWVudSAocHJldmVudHMgbWlzYWxpZ25tZW50KVxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDpzY3JvbGwnKVxuICBvblNjcm9sbCgpIHtcblxuICAgIHRoaXMuY2xvc2UoKTtcbiAgfVxuXG4gIC8vIE9wdGlvbiBzZWxlY3RlZFxuICBvbk9wdGlvblNlbGVjdGVkKG9wdGlvbjogYW55KSB7XG5cbiAgICB0aGlzLmNlbGxPcHRpb25NZW51U2VsZWN0LmVtaXQoe1xuICAgICAgY29sdW1uOiB0aGlzLmNvbHVtbixcbiAgICAgIG5vZGU6IHRoaXMubm9kZSxcbiAgICAgIG9wdGlvbjogb3B0aW9uXG4gICAgfSk7XG4gICAgdGhpcy5jbG9zZSgpO1xuICB9XG5cbiAgLy8gU2luZ2xlIGNsb3NlIG1ldGhvZFxuICBwcml2YXRlIGNsb3NlKCkge1xuXG4gICAgdGhpcy5ub2RlLmNlbGxPcHRpb25zW3RoaXMuY29sdW1uLmZpZWxkXSA9IGZhbHNlO1xuICAgIHRoaXMuY2VsbE9wdGlvbk1lbnVDbG9zZS5lbWl0KCk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJjZWxsLW9wdGlvbi1tZW51XCIgI21lbnVFbD5cbiAgICBAZm9yIChvcHQgb2Ygb3B0aW9uczsgdHJhY2sgb3B0LnZhbHVlKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjZWxsLW9wdGlvbi1tZW51LWl0ZW1cIiAoY2xpY2spPVwib25PcHRpb25TZWxlY3RlZChvcHQpXCI+XG4gICAgICAgICAgICA8IS0tIDxzcGFuIFtzdHlsZS5wYWRkaW5nLXJpZ2h0LnB4XT1cIjhcIj48bHVjaWRlLWljb24gbmFtZT1cImNoZWNrXCIgW3NpemVdPVwiMTZcIiBbc3Ryb2tlV2lkdGhdPVwiMlwiPjwvbHVjaWRlLWljb24+PC9zcGFuPiAtLT5cbiAgICAgICAgICAgIDxzcGFuPnt7IG9wdC50ZXh0IH19PC9zcGFuPiBcbiAgICAgICAgPC9kaXY+XG4gICAgfVxuPC9kaXY+Il19
123
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib25lLWdyaWQtY2VsbC1vcHRpb24tbWVudS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vbmUtZ3JpZC9zcmMvbGliL2NvbXBvbmVudHMvb25lLWdyaWQtY2VsbC1vcHRpb24tbWVudS9vbmUtZ3JpZC1jZWxsLW9wdGlvbi1tZW51LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29uZS1ncmlkL3NyYy9saWIvY29tcG9uZW50cy9vbmUtZ3JpZC1jZWxsLW9wdGlvbi1tZW51L29uZS1ncmlkLWNlbGwtb3B0aW9uLW1lbnUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFpQixTQUFTLEVBQWMsWUFBWSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUF3QixZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBV3BKLE1BQU0sT0FBTyw4QkFBOEI7SUFpQnpDLElBQWMsU0FBUztRQUVyQixPQUFPLGVBQWUsSUFBSSxDQUFDLE1BQU0sRUFBRSxVQUFVLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLElBQUksV0FBVyxFQUFFLENBQUM7SUFDdkYsQ0FBQztJQUVELFlBQW9CLFVBQXNCO1FBQXRCLGVBQVUsR0FBVixVQUFVLENBQVk7UUFwQmpDLFdBQU0sR0FBaUIsSUFBSSxDQUFDO1FBQzVCLFNBQUksR0FBZSxJQUFJLENBQUM7UUFDeEIsWUFBTyxHQUF3QixFQUFFLENBQUM7UUFDakMseUJBQW9CLEdBQUcsSUFBSSxZQUFZLEVBQStCLENBQUM7UUFDdkUsd0JBQW1CLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUl6RDs7OztXQUlHO1FBQ08sZ0JBQVcsR0FBRyxDQUFDLENBQUM7SUFPbUIsQ0FBQztJQUU5Qzs7Ozs7T0FLRztJQUNILGVBQWU7UUFFYixJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BCLENBQUM7SUFFUyxhQUFhLENBQUMsS0FBb0IsRUFBRSxLQUFhLEVBQUUsTUFBeUI7UUFFcEYsUUFBUSxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUM7WUFFbEIsS0FBSyxXQUFXO2dCQUNkLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDdkIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUNsRCxPQUFPO1lBRVQsS0FBSyxTQUFTO2dCQUNaLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDdkIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUN4RSxPQUFPO1lBRVQsS0FBSyxNQUFNO2dCQUNULEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDdkIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDbEIsT0FBTztZQUVULEtBQUssS0FBSztnQkFDUixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ3ZCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ3hDLE9BQU87WUFFVCxLQUFLLE9BQU8sQ0FBQztZQUNiLEtBQUssR0FBRztnQkFDTix3RUFBd0U7Z0JBQ3hFLG1FQUFtRTtnQkFDbkUsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUN2QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQzlCLE9BQU87WUFFVDtnQkFDRSxPQUFPO1FBQ1gsQ0FBQztJQUNILENBQUM7SUFFTyxTQUFTLENBQUMsS0FBYTtRQUU3QixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxNQUFNO1lBQUUsT0FBTztRQUVsQyxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztRQUV6QixJQUFJLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLENBQUM7SUFDakQsQ0FBQztJQUVELGdCQUFnQjtJQUVoQixlQUFlLENBQUMsS0FBaUI7UUFFL0IsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQXFCLENBQUM7UUFFM0MsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBRXBELElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNmLENBQUM7SUFDSCxDQUFDO0lBRUQsYUFBYTtJQUViLFFBQVE7UUFFTixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDZixDQUFDO0lBRUQsNkNBQTZDO0lBRTdDLFFBQVE7UUFFTixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDZixDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLGdCQUFnQixDQUFDLE1BQVc7UUFFMUIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQztZQUM3QixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07WUFDbkIsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO1lBQ2YsTUFBTSxFQUFFLE1BQU07U0FDZixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDZixDQUFDO0lBRUQsc0JBQXNCO0lBQ2QsS0FBSztRQUVYLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQ2pELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNsQyxDQUFDOytHQTNIVSw4QkFBOEI7bUdBQTlCLDhCQUE4QiwwY0NYM0MscXZCQWlCQTs7NEZETmEsOEJBQThCO2tCQU4xQyxTQUFTOytCQUNFLDJCQUEyQixjQUN6QixLQUFLOytFQU1SLE1BQU07c0JBQWQsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNJLG9CQUFvQjtzQkFBN0IsTUFBTTtnQkFDRyxtQkFBbUI7c0JBQTVCLE1BQU07Z0JBRXVCLEtBQUs7c0JBQWxDLFlBQVk7dUJBQUMsTUFBTTtnQkEyRXBCLGVBQWU7c0JBRGQsWUFBWTt1QkFBQyxnQkFBZ0IsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFhMUMsUUFBUTtzQkFEUCxZQUFZO3VCQUFDLHlCQUF5QjtnQkFRdkMsUUFBUTtzQkFEUCxZQUFZO3VCQUFDLGlCQUFpQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0luaXQsIENvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBIb3N0TGlzdGVuZXIsIElucHV0LCBPdXRwdXQsIFF1ZXJ5TGlzdCwgVmlld0NoaWxkLCBWaWV3Q2hpbGRyZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9uZVJvd05vZGUgfSBmcm9tICcuLi8uLi9jb3JlL2luc3RhbnRzL29uZS1yb3ctbm9kZS5jbGFzcyc7XG5pbXBvcnQgeyBPbmVDb2x1bW5EZWYgfSBmcm9tICcuLi8uLi9jb3JlL21vZGVscy9vbmUtY29sdW1uLWRlZi10eXBlcy5tb2RlbCc7XG5pbXBvcnQgeyBDZWxsT3B0aW9uTWVudVNlbGVjdGVkRXZlbnQsIE9uZUNlbGxPcHRpb25NZW51IH0gZnJvbSAnLi4vLi4vY29yZS9tb2RlbHMvb25lLWV2ZW50LXR5cGVzLm1vZGVsJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnb25lLWdyaWQtY2VsbC1vcHRpb24tbWVudScsXG4gIHN0YW5kYWxvbmU6IGZhbHNlLFxuICB0ZW1wbGF0ZVVybDogJy4vb25lLWdyaWQtY2VsbC1vcHRpb24tbWVudS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9vbmUtZ3JpZC1jZWxsLW9wdGlvbi1tZW51LmNvbXBvbmVudC5zY3NzJyxcbn0pXG5leHBvcnQgY2xhc3MgT25lR3JpZENlbGxPcHRpb25NZW51Q29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCB7XG5cbiAgQElucHV0KCkgY29sdW1uOiBPbmVDb2x1bW5EZWYgPSBudWxsO1xuICBASW5wdXQoKSBub2RlOiBPbmVSb3dOb2RlID0gbnVsbDtcbiAgQElucHV0KCkgb3B0aW9uczogT25lQ2VsbE9wdGlvbk1lbnVbXSA9IFtdO1xuICBAT3V0cHV0KCkgY2VsbE9wdGlvbk1lbnVTZWxlY3QgPSBuZXcgRXZlbnRFbWl0dGVyPENlbGxPcHRpb25NZW51U2VsZWN0ZWRFdmVudD4oKTtcbiAgQE91dHB1dCgpIGNlbGxPcHRpb25NZW51Q2xvc2UgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgQFZpZXdDaGlsZHJlbignaXRlbScpIHByaXZhdGUgaXRlbXM/OiBRdWVyeUxpc3Q8RWxlbWVudFJlZjxIVE1MQnV0dG9uRWxlbWVudD4+O1xuXG4gIC8qKlxuICAgKiBSb3ZpbmcgdGFiaW5kZXg6IG9uZSBpdGVtIGlzIHRhYmJhYmxlIGFuZCB0aGUgYXJyb3dzIG1vdmUgd2hpY2guIFN0YW5kYXJkXG4gICAqIGZvciBhIG1lbnUg4oCUIGEgbGlzdCBvZiBzZXBhcmF0ZWx5IHRhYmJhYmxlIGJ1dHRvbnMgbWFrZXMgYSBrZXlib2FyZCB1c2VyXG4gICAqIHRhYiB0aHJvdWdoIGV2ZXJ5IG9wdGlvbiB0byBnZXQgcGFzdCB0aGUgbWVudS5cbiAgICovXG4gIHByb3RlY3RlZCBhY3RpdmVJbmRleCA9IDA7XG5cbiAgcHJvdGVjdGVkIGdldCBtZW51TGFiZWwoKTogc3RyaW5nIHtcblxuICAgIHJldHVybiBgT3B0aW9ucyBmb3IgJHt0aGlzLmNvbHVtbj8uaGVhZGVyTmFtZSA/PyB0aGlzLmNvbHVtbj8uZmllbGQgPz8gJ3RoaXMgY2VsbCd9YDtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZikge31cblxuICAvKipcbiAgICogTW92ZSBmb2N1cyBpbnRvIHRoZSBtZW51IG9uY2UgaXQgZXhpc3RzLlxuICAgKlxuICAgKiBPcGVuaW5nIGEgbWVudSBhbmQgbGVhdmluZyBmb2N1cyBvbiB0aGUgdHJpZ2dlciBzdHJhbmRzIGEga2V5Ym9hcmQgdXNlcjpcbiAgICogdGhlIG1lbnUgaXMgb24gc2NyZWVuIGFuZCBub3RoaW5nIHRoZXkgcHJlc3MgcmVhY2hlcyBpdC5cbiAgICovXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcblxuICAgIHRoaXMuZm9jdXNJdGVtKDApO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uSXRlbUtleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQsIGluZGV4OiBudW1iZXIsIG9wdGlvbjogT25lQ2VsbE9wdGlvbk1lbnUpOiB2b2lkIHtcblxuICAgIHN3aXRjaCAoZXZlbnQua2V5KSB7XG5cbiAgICAgIGNhc2UgJ0Fycm93RG93bic6XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuZm9jdXNJdGVtKChpbmRleCArIDEpICUgdGhpcy5vcHRpb25zLmxlbmd0aCk7XG4gICAgICAgIHJldHVybjtcblxuICAgICAgY2FzZSAnQXJyb3dVcCc6XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuZm9jdXNJdGVtKChpbmRleCAtIDEgKyB0aGlzLm9wdGlvbnMubGVuZ3RoKSAlIHRoaXMub3B0aW9ucy5sZW5ndGgpO1xuICAgICAgICByZXR1cm47XG5cbiAgICAgIGNhc2UgJ0hvbWUnOlxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLmZvY3VzSXRlbSgwKTtcbiAgICAgICAgcmV0dXJuO1xuXG4gICAgICBjYXNlICdFbmQnOlxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLmZvY3VzSXRlbSh0aGlzLm9wdGlvbnMubGVuZ3RoIC0gMSk7XG4gICAgICAgIHJldHVybjtcblxuICAgICAgY2FzZSAnRW50ZXInOlxuICAgICAgY2FzZSAnICc6XG4gICAgICAgIC8vIEEgPGJ1dHRvbj4gYWxyZWFkeSBhY3RpdmF0ZXMgb24gYm90aCwgYnV0IG9ubHkgb25jZSB0aGUgZGVmYXVsdCBydW5zLlxuICAgICAgICAvLyBIYW5kbGluZyBpdCBoZXJlIGtlZXBzIHRoZSBtZW51J3MgYmVoYXZpb3VyIGluZGVwZW5kZW50IG9mIHRoYXQuXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMub25PcHRpb25TZWxlY3RlZChvcHRpb24pO1xuICAgICAgICByZXR1cm47XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGZvY3VzSXRlbShpbmRleDogbnVtYmVyKTogdm9pZCB7XG5cbiAgICBpZiAoIXRoaXMub3B0aW9ucz8ubGVuZ3RoKSByZXR1cm47XG5cbiAgICB0aGlzLmFjdGl2ZUluZGV4ID0gaW5kZXg7XG5cbiAgICB0aGlzLml0ZW1zPy5nZXQoaW5kZXgpPy5uYXRpdmVFbGVtZW50Py5mb2N1cygpO1xuICB9XG5cbiAgLy8gQ2xpY2sgb3V0c2lkZVxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDpjbGljaycsIFsnJGV2ZW50J10pXG4gIG9uRG9jdW1lbnRDbGljayhldmVudDogTW91c2VFdmVudCkge1xuXG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuXG4gICAgaWYgKCF0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jb250YWlucyh0YXJnZXQpKSB7XG5cbiAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICB9XG4gIH1cblxuICAvLyBFc2NhcGUga2V5XG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmtleWRvd24uZXNjYXBlJylcbiAgb25Fc2NhcGUoKSB7XG5cbiAgICB0aGlzLmNsb3NlKCk7XG4gIH1cblxuICAvLyBTY3JvbGwgY2xvc2VzIG1lbnUgKHByZXZlbnRzIG1pc2FsaWdubWVudClcbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6c2Nyb2xsJylcbiAgb25TY3JvbGwoKSB7XG5cbiAgICB0aGlzLmNsb3NlKCk7XG4gIH1cblxuICAvLyBPcHRpb24gc2VsZWN0ZWRcbiAgb25PcHRpb25TZWxlY3RlZChvcHRpb246IGFueSkge1xuXG4gICAgdGhpcy5jZWxsT3B0aW9uTWVudVNlbGVjdC5lbWl0KHtcbiAgICAgIGNvbHVtbjogdGhpcy5jb2x1bW4sXG4gICAgICBub2RlOiB0aGlzLm5vZGUsXG4gICAgICBvcHRpb246IG9wdGlvblxuICAgIH0pO1xuICAgIHRoaXMuY2xvc2UoKTtcbiAgfVxuXG4gIC8vIFNpbmdsZSBjbG9zZSBtZXRob2RcbiAgcHJpdmF0ZSBjbG9zZSgpIHtcblxuICAgIHRoaXMubm9kZS5jZWxsT3B0aW9uc1t0aGlzLmNvbHVtbi5maWVsZF0gPSBmYWxzZTtcbiAgICB0aGlzLmNlbGxPcHRpb25NZW51Q2xvc2UuZW1pdCgpO1xuICB9XG59XG4iLCI8IS0tIEEgbWVudSwgc28gaXQgaXMgYW5ub3VuY2VkIGFzIG9uZSBhbmQgb3BlcmFibGUgZnJvbSB0aGUga2V5Ym9hcmQ6IHRoZSBpdGVtc1xuICAgICB3ZXJlIGA8ZGl2IChjbGljayk+YCB3aXRoIG5vIHJvbGUsIHdoaWNoIG1lYW50IHRoZSBtZW51IGNvdWxkIGJlIG9wZW5lZCBieVxuICAgICBtb3VzZSBhbmQgdGhlbiBub3QgdXNlZCBhdCBhbGwgd2l0aG91dCBvbmUuIC0tPlxuPGRpdiBjbGFzcz1cImNlbGwtb3B0aW9uLW1lbnVcIiByb2xlPVwibWVudVwiICNtZW51RWwgW2F0dHIuYXJpYS1sYWJlbF09XCJtZW51TGFiZWxcIj5cbiAgICBAZm9yIChvcHQgb2Ygb3B0aW9uczsgbGV0IGluZGV4ID0gJGluZGV4OyB0cmFjayBvcHQudmFsdWUpIHtcbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICByb2xlPVwibWVudWl0ZW1cIlxuICAgICAgICAgICAgY2xhc3M9XCJjZWxsLW9wdGlvbi1tZW51LWl0ZW1cIlxuICAgICAgICAgICAgI2l0ZW1cbiAgICAgICAgICAgIFt0YWJpbmRleF09XCJpbmRleCA9PT0gYWN0aXZlSW5kZXggPyAwIDogLTFcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uT3B0aW9uU2VsZWN0ZWQob3B0KVwiXG4gICAgICAgICAgICAoa2V5ZG93bik9XCJvbkl0ZW1LZXlkb3duKCRldmVudCwgaW5kZXgsIG9wdClcIj5cbiAgICAgICAgICAgIDxzcGFuPnt7IG9wdC50ZXh0IH19PC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICB9XG48L2Rpdj5cbiJdfQ==
@@ -10,6 +10,8 @@ export class OneGridCheckboxHeaderComponent {
10
10
  this.eventService = eventService;
11
11
  this.selectionService = selectionService;
12
12
  this.allowedEdit = false;
13
+ /** Unsubscribe callbacks for the two grid listeners below. */
14
+ this.teardown = [];
13
15
  this.state = 'unchecked';
14
16
  this.rowNodes = [];
15
17
  }
@@ -18,19 +20,26 @@ export class OneGridCheckboxHeaderComponent {
18
20
  /**
19
21
  * Listen Row Node Selection Changed Event
20
22
  */
21
- this.eventService.addEventListener('selectionChanged', (payload) => {
23
+ this.teardown.push(this.eventService.addEventListener('selectionChanged', (payload) => {
22
24
  this.rowNodes = this.api.getAllRowNodes();
23
25
  const rowIds = this.rowNodes && this.rowNodes.length > 0 ? this.rowNodes.map((node) => node.rowId) : [];
24
26
  this.state = this.selectionService.getSelectAllState(rowIds);
25
- });
27
+ }));
26
28
  /**
27
29
  * Listen Row Data Changed Event
28
30
  */
29
- this.eventService.addEventListener('rowDataChanged', (payload) => {
31
+ this.teardown.push(this.eventService.addEventListener('rowDataChanged', (payload) => {
30
32
  this.rowNodes = this.api.getAllRowNodes();
31
33
  const rowIds = this.rowNodes && this.rowNodes.length > 0 ? this.rowNodes.map((node) => node.rowId) : [];
32
34
  this.state = this.selectionService.getSelectAllState(rowIds);
33
- });
35
+ }));
36
+ }
37
+ ngOnDestroy() {
38
+ // Both listeners were registered and never released. The component-scoped
39
+ // event service happened to clean up after them; relying on that left the
40
+ // component's own lifecycle incomplete.
41
+ this.teardown.forEach(unsubscribe => unsubscribe());
42
+ this.teardown.length = 0;
34
43
  }
35
44
  /**
36
45
  * Toggle Selection Action
@@ -59,4 +68,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
59
68
  }], allowedEdit: [{
60
69
  type: Input
61
70
  }] } });
62
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib25lLWdyaWQtY2hlY2tib3gtaGVhZGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29uZS1ncmlkL3NyYy9saWIvY29tcG9uZW50cy9vbmUtZ3JpZC1jaGVja2JveC1oZWFkZXIvb25lLWdyaWQtY2hlY2tib3gtaGVhZGVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29uZS1ncmlkL3NyYy9saWIvY29tcG9uZW50cy9vbmUtZ3JpZC1jaGVja2JveC1oZWFkZXIvb25lLWdyaWQtY2hlY2tib3gtaGVhZGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFVLE1BQU0sZUFBZSxDQUFDOzs7Ozs7O0FBaUJ6RCxNQUFNLE9BQU8sOEJBQThCO0lBU3pDLFlBQ1UsWUFBaUMsRUFDakMsZ0JBQXlDO1FBRHpDLGlCQUFZLEdBQVosWUFBWSxDQUFxQjtRQUNqQyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQXlCO1FBUjFDLGdCQUFXLEdBQVksS0FBSyxDQUFDO1FBRS9CLFVBQUssR0FBcUIsV0FBVyxDQUFDO1FBQ3RDLGFBQVEsR0FBb0IsRUFBRSxDQUFDO0lBTWxDLENBQUM7SUFFTCxRQUFRO1FBRU4sSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQztRQUUzQzs7V0FFRztRQUNILElBQUksQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxPQUFpQyxFQUFFLEVBQUU7WUFFM0YsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBRTFDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQW1CLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBRXZILElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQy9ELENBQUMsQ0FBQyxDQUFDO1FBRUg7O1dBRUc7UUFDSCxJQUFJLENBQUMsWUFBWSxDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixFQUFFLENBQUMsT0FBK0IsRUFBRSxFQUFFO1lBRXZGLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUUxQyxNQUFNLE1BQU0sR0FBYSxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFtQixFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUVqSSxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMvRCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNILGtCQUFrQixDQUFDLEtBQVU7UUFFM0IsSUFBSSxJQUFJLENBQUMsYUFBYSxLQUFLLFFBQVE7WUFBRSxPQUFPO1FBRTVDLE1BQU0sT0FBTyxHQUFZLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO1FBRTlDLElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUU5QyxJQUFJLE9BQU8sRUFBRSxDQUFDO2dCQUVaLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLENBQUM7WUFFdkIsQ0FBQztpQkFBTSxDQUFDO2dCQUVOLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDekIsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDOytHQS9EVSw4QkFBOEI7bUdBQTlCLDhCQUE4QixvSENqQjNDLGlhQVFNOzs0RkRTTyw4QkFBOEI7a0JBTjFDLFNBQVM7aUNBQ0ksS0FBSyxZQUNQLDBCQUEwQjs4SEFNM0IsR0FBRztzQkFBWCxLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9uZUdyaWRTZWxlY3Rpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9zZXJ2aWNlcy9vbmUtZ3JpZC1zZWxlY3Rpb24uc2VydmljZSc7XG5pbXBvcnQgeyBPbmVSb3dOb2RlIH0gZnJvbSAnLi4vLi4vY29yZS9pbnN0YW50cy9vbmUtcm93LW5vZGUuY2xhc3MnO1xuaW1wb3J0IHsgT25lR3JpZEFwaSB9IGZyb20gJy4uLy4uL2NvcmUvaW5zdGFudHMvb25lLWdyaWQtYXBpLmNsYXNzJztcbmltcG9ydCB7IE9uZUdyaWRFdmVudFNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb3JlL3NlcnZpY2VzL29uZS1ncmlkLWV2ZW50LnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgT25lQ2hlY2tib3hTdGF0ZSwgUm93RGF0YUNoYW5nZWRFdmVudCxcbiAgUm93U2VsZWN0aW9uTW9kZSxcbiAgU2VsZWN0aW9uQ2hhbmdlZEV2ZW50LFxufSBmcm9tICcuLi8uLi9jb3JlL21vZGVscy9vbmUtZXZlbnQtdHlwZXMubW9kZWwnXG5cbkBDb21wb25lbnQoe1xuICBzdGFuZGFsb25lOiBmYWxzZSxcbiAgc2VsZWN0b3I6ICdvbmUtZ3JpZC1jaGVja2JveC1oZWFkZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vb25lLWdyaWQtY2hlY2tib3gtaGVhZGVyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL29uZS1ncmlkLWNoZWNrYm94LWhlYWRlci5jb21wb25lbnQuc2NzcycsXG59KVxuZXhwb3J0IGNsYXNzIE9uZUdyaWRDaGVja2JveEhlYWRlckNvbXBvbmVudDxUPiBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgQElucHV0KCkgYXBpITogT25lR3JpZEFwaTxUPjtcbiAgQElucHV0KCkgYWxsb3dlZEVkaXQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBwdWJsaWMgc3RhdGU6IE9uZUNoZWNrYm94U3RhdGUgPSAndW5jaGVja2VkJztcbiAgcHVibGljIHJvd05vZGVzOiBPbmVSb3dOb2RlPFQ+W10gPSBbXTtcbiAgcHVibGljIHNlbGVjdGlvbk1vZGU6IFJvd1NlbGVjdGlvbk1vZGU7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBldmVudFNlcnZpY2U6IE9uZUdyaWRFdmVudFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBzZWxlY3Rpb25TZXJ2aWNlOiBPbmVHcmlkU2VsZWN0aW9uU2VydmljZVxuICApIHsgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuXG4gICAgdGhpcy5zZWxlY3Rpb25Nb2RlID0gdGhpcy5hcGkucm93U2VsZWN0aW9uO1xuXG4gICAgLyoqXG4gICAgICogTGlzdGVuIFJvdyBOb2RlIFNlbGVjdGlvbiBDaGFuZ2VkIEV2ZW50XG4gICAgICovXG4gICAgdGhpcy5ldmVudFNlcnZpY2UuYWRkRXZlbnRMaXN0ZW5lcignc2VsZWN0aW9uQ2hhbmdlZCcsIChwYXlsb2FkOiBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQ8VD4pID0+IHtcblxuICAgICAgdGhpcy5yb3dOb2RlcyA9IHRoaXMuYXBpLmdldEFsbFJvd05vZGVzKCk7XG5cbiAgICAgIGNvbnN0IHJvd0lkcyA9IHRoaXMucm93Tm9kZXMgJiYgdGhpcy5yb3dOb2Rlcy5sZW5ndGggPiAwID8gdGhpcy5yb3dOb2Rlcy5tYXAoKG5vZGU6IE9uZVJvd05vZGU8VD4pID0+IG5vZGUucm93SWQpIDogW107XG5cbiAgICAgIHRoaXMuc3RhdGUgPSB0aGlzLnNlbGVjdGlvblNlcnZpY2UuZ2V0U2VsZWN0QWxsU3RhdGUocm93SWRzKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIExpc3RlbiBSb3cgRGF0YSBDaGFuZ2VkIEV2ZW50XG4gICAgICovXG4gICAgdGhpcy5ldmVudFNlcnZpY2UuYWRkRXZlbnRMaXN0ZW5lcigncm93RGF0YUNoYW5nZWQnLCAocGF5bG9hZDogUm93RGF0YUNoYW5nZWRFdmVudDxUPikgPT4ge1xuXG4gICAgICB0aGlzLnJvd05vZGVzID0gdGhpcy5hcGkuZ2V0QWxsUm93Tm9kZXMoKTtcblxuICAgICAgY29uc3Qgcm93SWRzOiBzdHJpbmdbXSA9IHRoaXMucm93Tm9kZXMgJiYgdGhpcy5yb3dOb2Rlcy5sZW5ndGggPiAwID8gdGhpcy5yb3dOb2Rlcy5tYXAoKG5vZGU6IE9uZVJvd05vZGU8VD4pID0+IG5vZGUucm93SWQpIDogW107XG5cbiAgICAgIHRoaXMuc3RhdGUgPSB0aGlzLnNlbGVjdGlvblNlcnZpY2UuZ2V0U2VsZWN0QWxsU3RhdGUocm93SWRzKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUb2dnbGUgU2VsZWN0aW9uIEFjdGlvblxuICAgKi9cbiAgdG9nZ2xlU2VsZWN0aW9uQWxsKGV2ZW50OiBhbnkpOiB2b2lkIHtcblxuICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgPT09ICdzaW5nbGUnKSByZXR1cm47XG5cbiAgICBjb25zdCBjaGVja2VkOiBib29sZWFuID0gZXZlbnQudGFyZ2V0LmNoZWNrZWQ7XG5cbiAgICBpZiAodGhpcy5yb3dOb2RlcyAmJiB0aGlzLnJvd05vZGVzLmxlbmd0aCA+IDApIHtcblxuICAgICAgaWYgKGNoZWNrZWQpIHtcblxuICAgICAgICB0aGlzLmFwaS5zZWxlY3RBbGwoKTtcblxuICAgICAgfSBlbHNlIHtcblxuICAgICAgICB0aGlzLmFwaS5kZXNlbGVjdEFsbCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cIm9uZS1ncmlkLWNoZWNrYm94XCI+XG4gICAgPGlucHV0XG4gICAgICAgIFtpZF09XCJhcGkuaWRcIlxuICAgICAgICBbdHlwZV09XCInY2hlY2tib3gnXCJcbiAgICAgICAgW2NsYXNzLmRpc2FibGVkXT1cInJvd05vZGVzIHwgaGVhZGVyQ2hlY2tib3hEaXNhYmxlZDpzZWxlY3Rpb25Nb2RlOmFsbG93ZWRFZGl0XCJcbiAgICAgICAgW2NoZWNrZWRdPVwicm93Tm9kZXMgfCBoZWFkZXJDaGVja2JveENoZWNrZWQ6c2VsZWN0aW9uTW9kZTpzdGF0ZVwiXG4gICAgICAgIFtpbmRldGVybWluYXRlXT1cInJvd05vZGVzIHwgaGVhZGVyQ2hlY2tib3hJbmRldGVybWluYXRlOnNlbGVjdGlvbk1vZGU6c3RhdGVcIlxuICAgICAgICAoY2hhbmdlKT1cInRvZ2dsZVNlbGVjdGlvbkFsbCgkZXZlbnQpXCIgLz5cbjwvZGl2PiJdfQ==
71
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib25lLWdyaWQtY2hlY2tib3gtaGVhZGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29uZS1ncmlkL3NyYy9saWIvY29tcG9uZW50cy9vbmUtZ3JpZC1jaGVja2JveC1oZWFkZXIvb25lLWdyaWQtY2hlY2tib3gtaGVhZGVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29uZS1ncmlkL3NyYy9saWIvY29tcG9uZW50cy9vbmUtZ3JpZC1jaGVja2JveC1oZWFkZXIvb25lLWdyaWQtY2hlY2tib3gtaGVhZGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFxQixNQUFNLGVBQWUsQ0FBQzs7Ozs7OztBQWlCcEUsTUFBTSxPQUFPLDhCQUE4QjtJQVl6QyxZQUNVLFlBQWlDLEVBQ2pDLGdCQUF5QztRQUR6QyxpQkFBWSxHQUFaLFlBQVksQ0FBcUI7UUFDakMscUJBQWdCLEdBQWhCLGdCQUFnQixDQUF5QjtRQVgxQyxnQkFBVyxHQUFZLEtBQUssQ0FBQztRQUV0Qyw4REFBOEQ7UUFDN0MsYUFBUSxHQUFzQixFQUFFLENBQUM7UUFFM0MsVUFBSyxHQUFxQixXQUFXLENBQUM7UUFDdEMsYUFBUSxHQUFvQixFQUFFLENBQUM7SUFNbEMsQ0FBQztJQUVMLFFBQVE7UUFFTixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDO1FBRTNDOztXQUVHO1FBQ0gsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLE9BQWlDLEVBQUUsRUFBRTtZQUU5RyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLENBQUM7WUFFMUMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBbUIsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFFdkgsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDL0QsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVKOztXQUVHO1FBQ0gsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLE9BQStCLEVBQUUsRUFBRTtZQUUxRyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLENBQUM7WUFFMUMsTUFBTSxNQUFNLEdBQWEsSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBbUIsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFFakksSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDL0QsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNOLENBQUM7SUFFRCxXQUFXO1FBRVQsMEVBQTBFO1FBQzFFLDBFQUEwRTtRQUMxRSx3Q0FBd0M7UUFDeEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1FBRXBELElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUMzQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxrQkFBa0IsQ0FBQyxLQUFVO1FBRTNCLElBQUksSUFBSSxDQUFDLGFBQWEsS0FBSyxRQUFRO1lBQUUsT0FBTztRQUU1QyxNQUFNLE9BQU8sR0FBWSxLQUFLLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztRQUU5QyxJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFFOUMsSUFBSSxPQUFPLEVBQUUsQ0FBQztnQkFFWixJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBRXZCLENBQUM7aUJBQU0sQ0FBQztnQkFFTixJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3pCLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQzsrR0E1RVUsOEJBQThCO21HQUE5Qiw4QkFBOEIsb0hDakIzQyxpYUFRTTs7NEZEU08sOEJBQThCO2tCQU4xQyxTQUFTO2lDQUNJLEtBQUssWUFDUCwwQkFBMEI7OEhBTTNCLEdBQUc7c0JBQVgsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9uZUdyaWRTZWxlY3Rpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9zZXJ2aWNlcy9vbmUtZ3JpZC1zZWxlY3Rpb24uc2VydmljZSc7XG5pbXBvcnQgeyBPbmVSb3dOb2RlIH0gZnJvbSAnLi4vLi4vY29yZS9pbnN0YW50cy9vbmUtcm93LW5vZGUuY2xhc3MnO1xuaW1wb3J0IHsgT25lR3JpZEFwaSB9IGZyb20gJy4uLy4uL2NvcmUvaW5zdGFudHMvb25lLWdyaWQtYXBpLmNsYXNzJztcbmltcG9ydCB7IE9uZUdyaWRFdmVudFNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb3JlL3NlcnZpY2VzL29uZS1ncmlkLWV2ZW50LnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgT25lQ2hlY2tib3hTdGF0ZSwgUm93RGF0YUNoYW5nZWRFdmVudCxcbiAgUm93U2VsZWN0aW9uTW9kZSxcbiAgU2VsZWN0aW9uQ2hhbmdlZEV2ZW50LFxufSBmcm9tICcuLi8uLi9jb3JlL21vZGVscy9vbmUtZXZlbnQtdHlwZXMubW9kZWwnXG5cbkBDb21wb25lbnQoe1xuICBzdGFuZGFsb25lOiBmYWxzZSxcbiAgc2VsZWN0b3I6ICdvbmUtZ3JpZC1jaGVja2JveC1oZWFkZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vb25lLWdyaWQtY2hlY2tib3gtaGVhZGVyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL29uZS1ncmlkLWNoZWNrYm94LWhlYWRlci5jb21wb25lbnQuc2NzcycsXG59KVxuZXhwb3J0IGNsYXNzIE9uZUdyaWRDaGVja2JveEhlYWRlckNvbXBvbmVudDxUPiBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcblxuICBASW5wdXQoKSBhcGkhOiBPbmVHcmlkQXBpPFQ+O1xuICBASW5wdXQoKSBhbGxvd2VkRWRpdDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKiBVbnN1YnNjcmliZSBjYWxsYmFja3MgZm9yIHRoZSB0d28gZ3JpZCBsaXN0ZW5lcnMgYmVsb3cuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgdGVhcmRvd246IEFycmF5PCgpID0+IHZvaWQ+ID0gW107XG5cbiAgcHVibGljIHN0YXRlOiBPbmVDaGVja2JveFN0YXRlID0gJ3VuY2hlY2tlZCc7XG4gIHB1YmxpYyByb3dOb2RlczogT25lUm93Tm9kZTxUPltdID0gW107XG4gIHB1YmxpYyBzZWxlY3Rpb25Nb2RlOiBSb3dTZWxlY3Rpb25Nb2RlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgZXZlbnRTZXJ2aWNlOiBPbmVHcmlkRXZlbnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgc2VsZWN0aW9uU2VydmljZTogT25lR3JpZFNlbGVjdGlvblNlcnZpY2VcbiAgKSB7IH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcblxuICAgIHRoaXMuc2VsZWN0aW9uTW9kZSA9IHRoaXMuYXBpLnJvd1NlbGVjdGlvbjtcblxuICAgIC8qKlxuICAgICAqIExpc3RlbiBSb3cgTm9kZSBTZWxlY3Rpb24gQ2hhbmdlZCBFdmVudFxuICAgICAqL1xuICAgIHRoaXMudGVhcmRvd24ucHVzaCh0aGlzLmV2ZW50U2VydmljZS5hZGRFdmVudExpc3RlbmVyKCdzZWxlY3Rpb25DaGFuZ2VkJywgKHBheWxvYWQ6IFNlbGVjdGlvbkNoYW5nZWRFdmVudDxUPikgPT4ge1xuXG4gICAgICB0aGlzLnJvd05vZGVzID0gdGhpcy5hcGkuZ2V0QWxsUm93Tm9kZXMoKTtcblxuICAgICAgY29uc3Qgcm93SWRzID0gdGhpcy5yb3dOb2RlcyAmJiB0aGlzLnJvd05vZGVzLmxlbmd0aCA+IDAgPyB0aGlzLnJvd05vZGVzLm1hcCgobm9kZTogT25lUm93Tm9kZTxUPikgPT4gbm9kZS5yb3dJZCkgOiBbXTtcblxuICAgICAgdGhpcy5zdGF0ZSA9IHRoaXMuc2VsZWN0aW9uU2VydmljZS5nZXRTZWxlY3RBbGxTdGF0ZShyb3dJZHMpO1xuICAgIH0pKTtcblxuICAgIC8qKlxuICAgICAqIExpc3RlbiBSb3cgRGF0YSBDaGFuZ2VkIEV2ZW50XG4gICAgICovXG4gICAgdGhpcy50ZWFyZG93bi5wdXNoKHRoaXMuZXZlbnRTZXJ2aWNlLmFkZEV2ZW50TGlzdGVuZXIoJ3Jvd0RhdGFDaGFuZ2VkJywgKHBheWxvYWQ6IFJvd0RhdGFDaGFuZ2VkRXZlbnQ8VD4pID0+IHtcblxuICAgICAgdGhpcy5yb3dOb2RlcyA9IHRoaXMuYXBpLmdldEFsbFJvd05vZGVzKCk7XG5cbiAgICAgIGNvbnN0IHJvd0lkczogc3RyaW5nW10gPSB0aGlzLnJvd05vZGVzICYmIHRoaXMucm93Tm9kZXMubGVuZ3RoID4gMCA/IHRoaXMucm93Tm9kZXMubWFwKChub2RlOiBPbmVSb3dOb2RlPFQ+KSA9PiBub2RlLnJvd0lkKSA6IFtdO1xuXG4gICAgICB0aGlzLnN0YXRlID0gdGhpcy5zZWxlY3Rpb25TZXJ2aWNlLmdldFNlbGVjdEFsbFN0YXRlKHJvd0lkcyk7XG4gICAgfSkpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG5cbiAgICAvLyBCb3RoIGxpc3RlbmVycyB3ZXJlIHJlZ2lzdGVyZWQgYW5kIG5ldmVyIHJlbGVhc2VkLiBUaGUgY29tcG9uZW50LXNjb3BlZFxuICAgIC8vIGV2ZW50IHNlcnZpY2UgaGFwcGVuZWQgdG8gY2xlYW4gdXAgYWZ0ZXIgdGhlbTsgcmVseWluZyBvbiB0aGF0IGxlZnQgdGhlXG4gICAgLy8gY29tcG9uZW50J3Mgb3duIGxpZmVjeWNsZSBpbmNvbXBsZXRlLlxuICAgIHRoaXMudGVhcmRvd24uZm9yRWFjaCh1bnN1YnNjcmliZSA9PiB1bnN1YnNjcmliZSgpKTtcblxuICAgIHRoaXMudGVhcmRvd24ubGVuZ3RoID0gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUb2dnbGUgU2VsZWN0aW9uIEFjdGlvblxuICAgKi9cbiAgdG9nZ2xlU2VsZWN0aW9uQWxsKGV2ZW50OiBhbnkpOiB2b2lkIHtcblxuICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgPT09ICdzaW5nbGUnKSByZXR1cm47XG5cbiAgICBjb25zdCBjaGVja2VkOiBib29sZWFuID0gZXZlbnQudGFyZ2V0LmNoZWNrZWQ7XG5cbiAgICBpZiAodGhpcy5yb3dOb2RlcyAmJiB0aGlzLnJvd05vZGVzLmxlbmd0aCA+IDApIHtcblxuICAgICAgaWYgKGNoZWNrZWQpIHtcblxuICAgICAgICB0aGlzLmFwaS5zZWxlY3RBbGwoKTtcblxuICAgICAgfSBlbHNlIHtcblxuICAgICAgICB0aGlzLmFwaS5kZXNlbGVjdEFsbCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cIm9uZS1ncmlkLWNoZWNrYm94XCI+XG4gICAgPGlucHV0XG4gICAgICAgIFtpZF09XCJhcGkuaWRcIlxuICAgICAgICBbdHlwZV09XCInY2hlY2tib3gnXCJcbiAgICAgICAgW2NsYXNzLmRpc2FibGVkXT1cInJvd05vZGVzIHwgaGVhZGVyQ2hlY2tib3hEaXNhYmxlZDpzZWxlY3Rpb25Nb2RlOmFsbG93ZWRFZGl0XCJcbiAgICAgICAgW2NoZWNrZWRdPVwicm93Tm9kZXMgfCBoZWFkZXJDaGVja2JveENoZWNrZWQ6c2VsZWN0aW9uTW9kZTpzdGF0ZVwiXG4gICAgICAgIFtpbmRldGVybWluYXRlXT1cInJvd05vZGVzIHwgaGVhZGVyQ2hlY2tib3hJbmRldGVybWluYXRlOnNlbGVjdGlvbk1vZGU6c3RhdGVcIlxuICAgICAgICAoY2hhbmdlKT1cInRvZ2dsZVNlbGVjdGlvbkFsbCgkZXZlbnQpXCIgLz5cbjwvZGl2PiJdfQ==
@@ -1,5 +1,6 @@
1
- import { Component, Input } from '@angular/core';
2
- import { Subject, Subscription } from 'rxjs';
1
+ import { Component, Input, ViewChild } from '@angular/core';
2
+ import { Subscription } from 'rxjs';
3
+ import { resolveColumnWidth } from '../../helpers/one-column-def.helper';
3
4
  import * as i0 from "@angular/core";
4
5
  import * as i1 from "../../core/services/one-grid-event.service";
5
6
  import * as i2 from "@angular/common";
@@ -7,16 +8,29 @@ import * as i3 from "lucide-angular";
7
8
  import * as i4 from "../one-grid-checkbox-header/one-grid-checkbox-header.component";
8
9
  import * as i5 from "../../core/pipes/column-sort-state.pipe";
9
10
  export class OneGridHeaderComponent {
11
+ /**
12
+ * Horizontal offset of the body, mirrored here so the header tracks it.
13
+ *
14
+ * Applied to the viewport's `scrollLeft` rather than as a transform on the
15
+ * row: sticky positioning needs a real scrollport above it. The group row,
16
+ * which is a sibling of that viewport, still reads this for its transform.
17
+ */
18
+ set scrollLeft(value) {
19
+ this._scrollLeft = value ?? 0;
20
+ this.applyScrollLeft();
21
+ }
22
+ get scrollLeft() {
23
+ return this._scrollLeft;
24
+ }
10
25
  constructor(eventService, cdr) {
11
26
  this.eventService = eventService;
12
27
  this.cdr = cdr;
13
- this.scrollLeft = 0;
28
+ this._scrollLeft = 0;
14
29
  this.allowedEdit = false;
15
30
  this.enableGroupColumnDefs = false;
16
31
  this.groupColumnDefs = [];
17
32
  this.columnDefs = [];
18
33
  this.sortModel = [];
19
- this.destroy$ = new Subject();
20
34
  this.subscriptions = new Subscription();
21
35
  this.draggedIndex = null;
22
36
  // Track resize state
@@ -58,6 +72,16 @@ export class OneGridHeaderComponent {
58
72
  // this.cdr.markForCheck();
59
73
  }));
60
74
  }
75
+ ngAfterViewInit() {
76
+ // The input setter can run before the view exists, so whatever arrived
77
+ // first is applied once here.
78
+ this.applyScrollLeft();
79
+ }
80
+ applyScrollLeft() {
81
+ if (this.headerViewport) {
82
+ this.headerViewport.nativeElement.scrollLeft = this._scrollLeft;
83
+ }
84
+ }
61
85
  onHeaderMenuOptionClick(columnDef) {
62
86
  }
63
87
  onHeaderMenuSortClick(colId) {
@@ -83,7 +107,12 @@ export class OneGridHeaderComponent {
83
107
  this.resizing = true;
84
108
  this.resizeColumnIndex = columnIndex;
85
109
  this.startX = event.clientX;
86
- this.startWidth = this.columnDefs[columnIndex].width;
110
+ // Measure what is on screen rather than trusting `col.width`, which is
111
+ // optional: a column sized purely by minWidth had `undefined` here, and
112
+ // `Math.max(50, undefined + deltaX)` is NaN — the column collapsed on the
113
+ // first mouse move and could not be recovered.
114
+ const columnElement = event.target?.closest('.one-grid-header-column');
115
+ this.startWidth = columnElement?.offsetWidth || resolveColumnWidth(this.columnDefs[columnIndex]);
87
116
  // Add document-level listeners for drag and release
88
117
  document.addEventListener('mousemove', this.onResizeMove);
89
118
  document.addEventListener('mouseup', this.onResizeEnd);
@@ -116,19 +145,27 @@ export class OneGridHeaderComponent {
116
145
  event.preventDefault();
117
146
  this.draggedIndex = null;
118
147
  }
119
- /**
120
- * Clear All Subscriptions
121
- */
122
148
  ngOnDestroy() {
123
- this.destroy$.complete();
149
+ // This completed an unused Subject and left the real subscription running.
150
+ // It survived only because OneGridEventService is component-scoped and
151
+ // tears its own listeners down — the header was relying on that by accident.
152
+ this.subscriptions.unsubscribe();
153
+ // A resize in flight owns two listeners on `document`. Without this they
154
+ // outlive the component, and their closures keep it alive with them.
155
+ if (this.resizing) {
156
+ this.onResizeEnd();
157
+ }
124
158
  }
125
159
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: OneGridHeaderComponent, deps: [{ token: i1.OneGridEventService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
126
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: OneGridHeaderComponent, selector: "one-grid-header", inputs: { scrollLeft: "scrollLeft", allowedEdit: "allowedEdit", enableGroupColumnDefs: "enableGroupColumnDefs", api: "api" }, ngImport: i0, template: "<div class=\"one-grid-header\">\n @if (enableGroupColumnDefs) {\n <div class=\"one-group-header-row\" [style.transform]=\"'translateX(-' + scrollLeft + 'px)'\">\n <ng-container *ngTemplateOutlet=\"groupColumns; context: { groups: groupColumnDefs }\"></ng-container>\n </div>\n }\n <div class=\"one-grid-header-viewport\">\n <div class=\"one-header-row\" [style.transform]=\"'translateX(-' + scrollLeft + 'px)'\">\n <ng-container *ngTemplateOutlet=\"headerColumns; context: { columns: columnDefs }\"></ng-container>\n </div>\n </div>\n</div>\n\n<!-- Group Header Cell Template -->\n<ng-template #groupColumns let-groups=\"groups\">\n @for(group of groups; track group.id) {\n <div class=\"one-group-header-cell\"\n [style.width.px]=\"group.width\"\n [ngClass]=\"group._resolvedGroupClass\"\n [ngStyle]=\"group._resolvedGroupStyle\">\n <div class=\"one-group-header-cell-text\">\n {{ group.headerName }}\n </div>\n </div>\n }\n</ng-template>\n\n<!-- Header Cell Template -->\n<ng-template #headerColumns let-columns=\"columns\">\n @for (col of columns; let colIndex = $index; track col.id) {\n <div class=\"one-grid-header-column\"\n [attr.data-index]=\"colIndex\"\n [style.width.px]=\"col.width\"\n [style.min-width.px]=\"col.minWidth\"\n [style.max-width.px]=\"col.maxWidth\"\n [draggable]=\"col?.dragable\"\n (dragstart)=\"onDragColumnStart($event, colIndex)\"\n (dragover)=\"onDragColumnOver($event, colIndex)\"\n (dragend)=\"onDragColumnEnd($event)\"\n (drop)=\"onDropColumn($event)\">\n <div class=\"one-grid-header-cell\"\n [ngClass]=\"col._resolvedHeaderClass\"\n [ngStyle]=\"col._resolvedHeaderStyle\"\n >\n <span class=\"one-grid-header-cell-group\">\n @if (col?.headerCheckboxSelection) {\n <one-grid-checkbox-header\n [api]=\"api\"\n [allowedEdit]=\"allowedEdit\"\n />\n }\n\n {{ col?.headerName ?? '' }}\n </span>\n\n <!-- Og Resize Handler -->\n @if (col?.resizable) {\n <div class=\"og-resize-handle\" (mousedown)=\"onResizeStart($event, colIndex)\">\n <i class=\"bi bi-grip-vertical\"></i>\n </div>\n }\n\n <div class=\"one-grid-header-cell-group\">\n\n <!-- Sort Menu Button -->\n @if (col?.sortable) {\n <div class=\"one-grid-header-menu-button\" (click)=\"onHeaderMenuSortClick(col.field)\">\n\n @if ((col.field | columnSortState:api.sortModel) === 'asc') {\n <lucide-icon name=\"arrow-up-a-z\" [size]=\"16\" [strokeWidth]=\"2\"></lucide-icon>\n }\n @else if ((col.field | columnSortState:api.sortModel) === 'desc') {\n <lucide-icon name=\"arrow-down-z-a\" [size]=\"16\" [strokeWidth]=\"2\"></lucide-icon>\n }\n @else {\n <lucide-icon name=\"arrow-down-up\" [size]=\"16\" [strokeWidth]=\"2\"></lucide-icon>\n }\n </div>\n }\n\n <!-- Og Option Menu Button -->\n @if (col && !col.suppressHeaderMenuButton) {\n <div class=\"one-grid-header-menu-button\" (click)=\"onHeaderMenuOptionClick(col)\">\n <i class=\"bi bi-three-dots-vertical\"></i>\n </div>\n }\n </div>\n </div>\n </div>\n }\n</ng-template>\n", styles: [""], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i3.LucideAngularComponent, selector: "lucide-angular, lucide-icon, i-lucide, span-lucide", inputs: ["class", "name", "img", "color", "absoluteStrokeWidth", "size", "strokeWidth"] }, { kind: "component", type: i4.OneGridCheckboxHeaderComponent, selector: "one-grid-checkbox-header", inputs: ["api", "allowedEdit"] }, { kind: "pipe", type: i5.ColumnSortStatePipe, name: "columnSortState" }] }); }
160
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: OneGridHeaderComponent, selector: "one-grid-header", inputs: { scrollLeft: "scrollLeft", allowedEdit: "allowedEdit", enableGroupColumnDefs: "enableGroupColumnDefs", api: "api" }, viewQueries: [{ propertyName: "headerViewport", first: true, predicate: ["headerViewport"], descendants: true, static: true }], ngImport: i0, template: "<div class=\"one-grid-header\">\n @if (enableGroupColumnDefs) {\n <div class=\"one-group-header-row\" [style.transform]=\"'translateX(-' + scrollLeft + 'px)'\">\n <ng-container *ngTemplateOutlet=\"groupColumns; context: { groups: groupColumnDefs }\"></ng-container>\n </div>\n }\n <!-- The column row is scrolled rather than translated. `position: sticky`\n resolves against the nearest scrollport, and a transformed ancestor is\n not one \u2014 pinned headers could never hold their place inside it. The\n group row above keeps its transform: groups span contiguous columns,\n which pinning reorders, so the two features do not combine. -->\n <div #headerViewport class=\"one-grid-header-viewport\">\n <div class=\"one-header-row\">\n <ng-container *ngTemplateOutlet=\"headerColumns; context: { columns: columnDefs }\"></ng-container>\n </div>\n </div>\n</div>\n\n<!-- Group Header Cell Template -->\n<ng-template #groupColumns let-groups=\"groups\">\n @for(group of groups; track group.id) {\n <div class=\"one-group-header-cell\"\n [style.width.px]=\"group.width\"\n [ngClass]=\"group._resolvedGroupClass\"\n [ngStyle]=\"group._resolvedGroupStyle\">\n <div class=\"one-group-header-cell-text\">\n {{ group.headerName }}\n </div>\n </div>\n }\n</ng-template>\n\n<!-- Header Cell Template -->\n<ng-template #headerColumns let-columns=\"columns\">\n @for (col of columns; let colIndex = $index; track col.id) {\n <div class=\"one-grid-header-column\"\n [attr.data-index]=\"colIndex\"\n [class.one-column-pinned-left]=\"col.pinned === 'left'\"\n [class.one-column-pinned-right]=\"col.pinned === 'right'\"\n [class.one-column-pinned-edge]=\"col._pinnedEdge\"\n [class.one-column-pinned-edge]=\"col._pinnedEdge\"\n [style.left.px]=\"col.pinned === 'left' ? col._pinnedOffset : null\"\n [style.right.px]=\"col.pinned === 'right' ? col._pinnedOffset : null\"\n [style.width.px]=\"col.width\"\n [style.min-width.px]=\"col.minWidth\"\n [style.max-width.px]=\"col.maxWidth\"\n [draggable]=\"col._resolvedDragable\"\n (dragstart)=\"onDragColumnStart($event, colIndex)\"\n (dragover)=\"onDragColumnOver($event, colIndex)\"\n (dragend)=\"onDragColumnEnd($event)\"\n (drop)=\"onDropColumn($event)\">\n <div class=\"one-grid-header-cell\"\n [ngClass]=\"col._resolvedHeaderClass\"\n [ngStyle]=\"col._resolvedHeaderStyle\"\n >\n <span class=\"one-grid-header-cell-group\">\n @if (col?.headerCheckboxSelection) {\n <one-grid-checkbox-header\n [api]=\"api\"\n [allowedEdit]=\"allowedEdit\"\n />\n }\n\n {{ col?.headerName ?? '' }}\n </span>\n\n <!-- Og Resize Handler -->\n @if (col._resolvedResizable) {\n <div class=\"og-resize-handle\" (mousedown)=\"onResizeStart($event, colIndex)\">\n <i class=\"bi bi-grip-vertical\"></i>\n </div>\n }\n\n <div class=\"one-grid-header-cell-group\">\n\n <!-- Sort Menu Button -->\n @if (col._resolvedSortable) {\n <div class=\"one-grid-header-menu-button\" (click)=\"onHeaderMenuSortClick(col.field)\">\n\n @if ((col.field | columnSortState:api.sortModel) === 'asc') {\n <lucide-icon name=\"arrow-up-a-z\" [size]=\"16\" [strokeWidth]=\"2\"></lucide-icon>\n }\n @else if ((col.field | columnSortState:api.sortModel) === 'desc') {\n <lucide-icon name=\"arrow-down-z-a\" [size]=\"16\" [strokeWidth]=\"2\"></lucide-icon>\n }\n @else {\n <lucide-icon name=\"arrow-down-up\" [size]=\"16\" [strokeWidth]=\"2\"></lucide-icon>\n }\n </div>\n }\n\n <!-- Og Option Menu Button -->\n @if (col && !col._resolvedSuppressHeaderMenuButton) {\n <div class=\"one-grid-header-menu-button\" (click)=\"onHeaderMenuOptionClick(col)\">\n <i class=\"bi bi-three-dots-vertical\"></i>\n </div>\n }\n </div>\n </div>\n </div>\n }\n</ng-template>\n", styles: [""], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i3.LucideAngularComponent, selector: "lucide-angular, lucide-icon, i-lucide, span-lucide", inputs: ["class", "name", "img", "color", "absoluteStrokeWidth", "size", "strokeWidth"] }, { kind: "component", type: i4.OneGridCheckboxHeaderComponent, selector: "one-grid-checkbox-header", inputs: ["api", "allowedEdit"] }, { kind: "pipe", type: i5.ColumnSortStatePipe, name: "columnSortState" }] }); }
127
161
  }
128
162
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: OneGridHeaderComponent, decorators: [{
129
163
  type: Component,
130
- args: [{ standalone: false, selector: 'one-grid-header', template: "<div class=\"one-grid-header\">\n @if (enableGroupColumnDefs) {\n <div class=\"one-group-header-row\" [style.transform]=\"'translateX(-' + scrollLeft + 'px)'\">\n <ng-container *ngTemplateOutlet=\"groupColumns; context: { groups: groupColumnDefs }\"></ng-container>\n </div>\n }\n <div class=\"one-grid-header-viewport\">\n <div class=\"one-header-row\" [style.transform]=\"'translateX(-' + scrollLeft + 'px)'\">\n <ng-container *ngTemplateOutlet=\"headerColumns; context: { columns: columnDefs }\"></ng-container>\n </div>\n </div>\n</div>\n\n<!-- Group Header Cell Template -->\n<ng-template #groupColumns let-groups=\"groups\">\n @for(group of groups; track group.id) {\n <div class=\"one-group-header-cell\"\n [style.width.px]=\"group.width\"\n [ngClass]=\"group._resolvedGroupClass\"\n [ngStyle]=\"group._resolvedGroupStyle\">\n <div class=\"one-group-header-cell-text\">\n {{ group.headerName }}\n </div>\n </div>\n }\n</ng-template>\n\n<!-- Header Cell Template -->\n<ng-template #headerColumns let-columns=\"columns\">\n @for (col of columns; let colIndex = $index; track col.id) {\n <div class=\"one-grid-header-column\"\n [attr.data-index]=\"colIndex\"\n [style.width.px]=\"col.width\"\n [style.min-width.px]=\"col.minWidth\"\n [style.max-width.px]=\"col.maxWidth\"\n [draggable]=\"col?.dragable\"\n (dragstart)=\"onDragColumnStart($event, colIndex)\"\n (dragover)=\"onDragColumnOver($event, colIndex)\"\n (dragend)=\"onDragColumnEnd($event)\"\n (drop)=\"onDropColumn($event)\">\n <div class=\"one-grid-header-cell\"\n [ngClass]=\"col._resolvedHeaderClass\"\n [ngStyle]=\"col._resolvedHeaderStyle\"\n >\n <span class=\"one-grid-header-cell-group\">\n @if (col?.headerCheckboxSelection) {\n <one-grid-checkbox-header\n [api]=\"api\"\n [allowedEdit]=\"allowedEdit\"\n />\n }\n\n {{ col?.headerName ?? '' }}\n </span>\n\n <!-- Og Resize Handler -->\n @if (col?.resizable) {\n <div class=\"og-resize-handle\" (mousedown)=\"onResizeStart($event, colIndex)\">\n <i class=\"bi bi-grip-vertical\"></i>\n </div>\n }\n\n <div class=\"one-grid-header-cell-group\">\n\n <!-- Sort Menu Button -->\n @if (col?.sortable) {\n <div class=\"one-grid-header-menu-button\" (click)=\"onHeaderMenuSortClick(col.field)\">\n\n @if ((col.field | columnSortState:api.sortModel) === 'asc') {\n <lucide-icon name=\"arrow-up-a-z\" [size]=\"16\" [strokeWidth]=\"2\"></lucide-icon>\n }\n @else if ((col.field | columnSortState:api.sortModel) === 'desc') {\n <lucide-icon name=\"arrow-down-z-a\" [size]=\"16\" [strokeWidth]=\"2\"></lucide-icon>\n }\n @else {\n <lucide-icon name=\"arrow-down-up\" [size]=\"16\" [strokeWidth]=\"2\"></lucide-icon>\n }\n </div>\n }\n\n <!-- Og Option Menu Button -->\n @if (col && !col.suppressHeaderMenuButton) {\n <div class=\"one-grid-header-menu-button\" (click)=\"onHeaderMenuOptionClick(col)\">\n <i class=\"bi bi-three-dots-vertical\"></i>\n </div>\n }\n </div>\n </div>\n </div>\n }\n</ng-template>\n" }]
131
- }], ctorParameters: () => [{ type: i1.OneGridEventService }, { type: i0.ChangeDetectorRef }], propDecorators: { scrollLeft: [{
164
+ args: [{ standalone: false, selector: 'one-grid-header', template: "<div class=\"one-grid-header\">\n @if (enableGroupColumnDefs) {\n <div class=\"one-group-header-row\" [style.transform]=\"'translateX(-' + scrollLeft + 'px)'\">\n <ng-container *ngTemplateOutlet=\"groupColumns; context: { groups: groupColumnDefs }\"></ng-container>\n </div>\n }\n <!-- The column row is scrolled rather than translated. `position: sticky`\n resolves against the nearest scrollport, and a transformed ancestor is\n not one \u2014 pinned headers could never hold their place inside it. The\n group row above keeps its transform: groups span contiguous columns,\n which pinning reorders, so the two features do not combine. -->\n <div #headerViewport class=\"one-grid-header-viewport\">\n <div class=\"one-header-row\">\n <ng-container *ngTemplateOutlet=\"headerColumns; context: { columns: columnDefs }\"></ng-container>\n </div>\n </div>\n</div>\n\n<!-- Group Header Cell Template -->\n<ng-template #groupColumns let-groups=\"groups\">\n @for(group of groups; track group.id) {\n <div class=\"one-group-header-cell\"\n [style.width.px]=\"group.width\"\n [ngClass]=\"group._resolvedGroupClass\"\n [ngStyle]=\"group._resolvedGroupStyle\">\n <div class=\"one-group-header-cell-text\">\n {{ group.headerName }}\n </div>\n </div>\n }\n</ng-template>\n\n<!-- Header Cell Template -->\n<ng-template #headerColumns let-columns=\"columns\">\n @for (col of columns; let colIndex = $index; track col.id) {\n <div class=\"one-grid-header-column\"\n [attr.data-index]=\"colIndex\"\n [class.one-column-pinned-left]=\"col.pinned === 'left'\"\n [class.one-column-pinned-right]=\"col.pinned === 'right'\"\n [class.one-column-pinned-edge]=\"col._pinnedEdge\"\n [class.one-column-pinned-edge]=\"col._pinnedEdge\"\n [style.left.px]=\"col.pinned === 'left' ? col._pinnedOffset : null\"\n [style.right.px]=\"col.pinned === 'right' ? col._pinnedOffset : null\"\n [style.width.px]=\"col.width\"\n [style.min-width.px]=\"col.minWidth\"\n [style.max-width.px]=\"col.maxWidth\"\n [draggable]=\"col._resolvedDragable\"\n (dragstart)=\"onDragColumnStart($event, colIndex)\"\n (dragover)=\"onDragColumnOver($event, colIndex)\"\n (dragend)=\"onDragColumnEnd($event)\"\n (drop)=\"onDropColumn($event)\">\n <div class=\"one-grid-header-cell\"\n [ngClass]=\"col._resolvedHeaderClass\"\n [ngStyle]=\"col._resolvedHeaderStyle\"\n >\n <span class=\"one-grid-header-cell-group\">\n @if (col?.headerCheckboxSelection) {\n <one-grid-checkbox-header\n [api]=\"api\"\n [allowedEdit]=\"allowedEdit\"\n />\n }\n\n {{ col?.headerName ?? '' }}\n </span>\n\n <!-- Og Resize Handler -->\n @if (col._resolvedResizable) {\n <div class=\"og-resize-handle\" (mousedown)=\"onResizeStart($event, colIndex)\">\n <i class=\"bi bi-grip-vertical\"></i>\n </div>\n }\n\n <div class=\"one-grid-header-cell-group\">\n\n <!-- Sort Menu Button -->\n @if (col._resolvedSortable) {\n <div class=\"one-grid-header-menu-button\" (click)=\"onHeaderMenuSortClick(col.field)\">\n\n @if ((col.field | columnSortState:api.sortModel) === 'asc') {\n <lucide-icon name=\"arrow-up-a-z\" [size]=\"16\" [strokeWidth]=\"2\"></lucide-icon>\n }\n @else if ((col.field | columnSortState:api.sortModel) === 'desc') {\n <lucide-icon name=\"arrow-down-z-a\" [size]=\"16\" [strokeWidth]=\"2\"></lucide-icon>\n }\n @else {\n <lucide-icon name=\"arrow-down-up\" [size]=\"16\" [strokeWidth]=\"2\"></lucide-icon>\n }\n </div>\n }\n\n <!-- Og Option Menu Button -->\n @if (col && !col._resolvedSuppressHeaderMenuButton) {\n <div class=\"one-grid-header-menu-button\" (click)=\"onHeaderMenuOptionClick(col)\">\n <i class=\"bi bi-three-dots-vertical\"></i>\n </div>\n }\n </div>\n </div>\n </div>\n }\n</ng-template>\n" }]
165
+ }], ctorParameters: () => [{ type: i1.OneGridEventService }, { type: i0.ChangeDetectorRef }], propDecorators: { headerViewport: [{
166
+ type: ViewChild,
167
+ args: ['headerViewport', { static: true }]
168
+ }], scrollLeft: [{
132
169
  type: Input
133
170
  }], allowedEdit: [{
134
171
  type: Input
@@ -137,4 +174,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
137
174
  }], api: [{
138
175
  type: Input
139
176
  }] } });
140
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib25lLWdyaWQtaGVhZGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29uZS1ncmlkL3NyYy9saWIvY29tcG9uZW50cy9vbmUtZ3JpZC1oZWFkZXIvb25lLWdyaWQtaGVhZGVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29uZS1ncmlkL3NyYy9saWIvY29tcG9uZW50cy9vbmUtZ3JpZC1oZWFkZXIvb25lLWdyaWQtaGVhZGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBcUIsU0FBUyxFQUFFLEtBQUssRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFFdkYsT0FBTyxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7Ozs7QUFZN0MsTUFBTSxPQUFPLHNCQUFzQjtJQXFCakMsWUFDVSxZQUFpQyxFQUNqQyxHQUFzQjtRQUR0QixpQkFBWSxHQUFaLFlBQVksQ0FBcUI7UUFDakMsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFyQnZCLGVBQVUsR0FBRyxDQUFDLENBQUM7UUFDZixnQkFBVyxHQUFZLEtBQUssQ0FBQztRQUM3QiwwQkFBcUIsR0FBWSxLQUFLLENBQUM7UUFHdEMsb0JBQWUsR0FBd0IsRUFBRSxDQUFDO1FBQzFDLGVBQVUsR0FBc0IsRUFBRSxDQUFDO1FBRXJDLGNBQVMsR0FBc0IsRUFBRSxDQUFDO1FBQ2xDLGFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBQy9CLGtCQUFhLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNuQyxpQkFBWSxHQUFrQixJQUFJLENBQUM7UUFFM0MscUJBQXFCO1FBQ2IsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUNqQixzQkFBaUIsR0FBa0IsSUFBSSxDQUFDO1FBQ3hDLFdBQU0sR0FBRyxDQUFDLENBQUM7UUFDWCxlQUFVLEdBQUcsQ0FB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RUFBRSxDQUFDO1lBRXBFLE9BQU87UUFDVCxDQUFDO1FBRUQsOEJBQThCO1FBQzlCLElBQUksQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxXQUFXLENBQUMsQ0FBQztRQUUzRCwwQ0FBMEM7UUFDMUMsSUFBSSxDQUFDLFlBQVksR0FBRyxXQUFXLENBQUM7SUFDbEMsQ0FBQztJQUVELGVBQWUsQ0FBQyxLQUFnQjtRQUU5QixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztJQUMzQixDQUFDO0lBRUQsWUFBWSxDQUFDLEtBQWdCO1FBRTNCLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUV2QixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztJQUMzQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxXQUFXO1FBRVQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUMzQixDQUFDOytHQTNLVSxzQkFBc0I7bUdBQXRCLHNCQUFzQixxTENkbkMsbytIQTJGQTs7NEZEN0VhLHNCQUFzQjtrQkFObEMsU0FBUztpQ0FDSSxLQUFLLFlBQ1AsaUJBQWlCO3dIQU1sQixVQUFVO3NCQUFsQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0cscUJBQXFCO3NCQUE3QixLQUFLO2dCQUNHLEdBQUc7c0JBQVgsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT25lQ29sdW1uRGVmLCBPbmVHcm91cENvbHVtbkRlZiB9IGZyb20gJy4uLy4uL2NvcmUvbW9kZWxzL29uZS1jb2x1bW4tZGVmLXR5cGVzLm1vZGVsJztcbmltcG9ydCB7IFN1YmplY3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgT25lR3JpZEFwaSB9IGZyb20gJy4uLy4uL2NvcmUvaW5zdGFudHMvb25lLWdyaWQtYXBpLmNsYXNzJztcbmltcG9ydCB7IE9uZVNvcnRNb2RlbCB9IGZyb20gJy4uLy4uL2NvcmUvbW9kZWxzL29uZS1ncmlkLXR5cGVzLm1vZGVsJztcbmltcG9ydCB7IENvbHVtbkNoYW5nZWRFdmVudCB9IGZyb20gJy4uLy4uL2NvcmUvbW9kZWxzL29uZS1ldmVudC10eXBlcy5tb2RlbCc7XG5pbXBvcnQgeyBPbmVHcmlkRXZlbnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9zZXJ2aWNlcy9vbmUtZ3JpZC1ldmVudC5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHN0YW5kYWxvbmU6IGZhbHNlLFxuICBzZWxlY3RvcjogJ29uZS1ncmlkLWhlYWRlcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9vbmUtZ3JpZC1oZWFkZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vb25lLWdyaWQtaGVhZGVyLmNvbXBvbmVudC5zY3NzJ1xufSlcbmV4cG9ydCBjbGFzcyBPbmVHcmlkSGVhZGVyQ29tcG9uZW50PFQ+IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuXG4gIEBJbnB1dCgpIHNjcm9sbExlZnQgPSAwO1xuICBASW5wdXQoKSBhbGxvd2VkRWRpdDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBlbmFibGVHcm91cENvbHVtbkRlZnM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgYXBpITogT25lR3JpZEFwaTxUPjtcblxuICBwcm90ZWN0ZWQgZ3JvdXBDb2x1bW5EZWZzOiBPbmVHcm91cENvbHVtbkRlZltdID0gW107XG4gIHByb3RlY3RlZCBjb2x1bW5EZWZzOiBPbmVDb2x1bW5EZWY8VD5bXSA9IFtdO1xuXG4gIHByaXZhdGUgc29ydE1vZGVsOiBPbmVTb3J0TW9kZWw8VD5bXSA9IFtdO1xuICBwcml2YXRlIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb25zID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuICBwcml2YXRlIGRyYWdnZWRJbmRleDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG5cbiAgLy8gVHJhY2sgcmVzaXplIHN0YXRlXG4gIHByaXZhdGUgcmVzaXppbmcgPSBmYWxzZTtcbiAgcHJpdmF0ZSByZXNpemVDb2x1bW5JbmRleDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgc3RhcnRYID0gMDtcbiAgcHJpdmF0ZSBzdGFydFdpZHRoID0gMDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGV2ZW50U2VydmljZTogT25lR3JpZEV2ZW50U2VydmljZSxcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWZcbiAgICkge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcblxuICAgIC8vIExpc3RlbiBDb2x1bW4gQ2hhbmdlZCBFdmVudFxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQodGhpcy5ldmVudFNlcnZpY2UuYWRkRXZlbnRMaXN0ZW5lcignY29sdW1uQ2hhbmdlZCcsIChwYXlsb2FkOiBDb2x1bW5DaGFuZ2VkRXZlbnQpID0+IHtcblxuICAgICAgY29uc3QgeyBncm91cHMsIGNvbHVtbnMgfSA9IHBheWxvYWQ7XG5cbiAgICAgIGlmIChncm91cHMpIHtcblxuICAgICAgICB0aGlzLmdyb3VwQ29sdW1uRGVmcyA9IGdyb3VwcyBhcyBPbmVHcm91cENvbHVtbkRlZltdO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29sdW1ucykge1xuXG4gICAgICAgIHRoaXMuY29sdW1uRGVmcyA9IGNvbHVtbnMgYXMgT25lQ29sdW1uRGVmW107XG4gICAgICB9XG5cbiAgICAgIC8vIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH0pKTtcbiAgfVxuXG4gIG9uSGVhZGVyTWVudU9wdGlvbkNsaWNrKGNvbHVtbkRlZjogT25lQ29sdW1uRGVmPFQ+KSB7XG5cbiAgfVxuXG4gIG9uSGVhZGVyTWVudVNvcnRDbGljayhjb2xJZDoga2V5b2YgVCkge1xuXG4gICAgY29uc3QgY3VycmVudFNvcnQgPSB0aGlzLnNvcnRNb2RlbC5maW5kKHNvcnQgPT4gc29ydC5jb2xJZCA9PT0gY29sSWQpPy5zb3J0ID8/IG51bGw7XG5cbiAgICBjb25zdCBuZXh0U29ydCA9IHRoaXMuY3ljbGVTb3J0KGN1cnJlbnRTb3J0KTtcblxuICAgIHRoaXMuc29ydE1vZGVsID0gbmV4dFNvcnQgPyBbeyBjb2xJZCwgc29ydDogbmV4dFNvcnQgfV0gOiBbXTtcblxuICAgIHRoaXMuYXBpLm9uU29ydENoYW5nZWQodGhpcy5zb3J0TW9kZWwpO1xuICB9XG5cbiAgLy8gQ3ljbGUgU29ydGluZyBNb2RlbFxuICBwcml2YXRlIGN5Y2xlU29ydChjdXJyZW50OiAnYXNjJyB8ICdkZXNjJyB8IG51bGwpOiAnYXNjJyB8ICdkZXNjJyB8IG51bGwge1xuXG4gICAgc3dpdGNoIChjdXJyZW50KSB7XG5cbiAgICAgIGNhc2UgbnVsbDogcmV0dXJuICdhc2MnO1xuXG4gICAgICBjYXNlICdhc2MnOiByZXR1cm4gJ2Rlc2MnO1xuXG4gICAgICBjYXNlICdkZXNjJzogcmV0dXJuIG51bGw7XG5cbiAgICAgIGRlZmF1bHQ6IHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIG9uUmVzaXplU3RhcnQoZXZlbnQ6IE1vdXNlRXZlbnQsIGNvbHVtbkluZGV4OiBudW1iZXIpOiB2b2lkIHtcblxuICAgIC8vIFByZXZlbnQgdGV4dCBzZWxlY3Rpb24gYW5kIGRlZmF1bHQgYmVoYXZpb3JcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgLy8gU3RvcmUgaW5pdGlhbCB2YWx1ZXNcbiAgICB0aGlzLnJlc2l6aW5nID0gdHJ1ZTtcbiAgICB0aGlzLnJlc2l6ZUNvbHVtbkluZGV4ID0gY29sdW1uSW5kZXg7XG4gICAgdGhpcy5zdGFydFggPSBldmVudC5jbGllbnRYO1xuICAgIHRoaXMuc3RhcnRXaWR0aCA9IHRoaXMuY29sdW1uRGVmc1tjb2x1bW5JbmRleF0ud2lkdGg7XG5cbiAgICAvLyBBZGQgZG9jdW1lbnQtbGV2ZWwgbGlzdGVuZXJzIGZvciBkcmFnIGFuZCByZWxlYXNlXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5vblJlc2l6ZU1vdmUpO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLm9uUmVzaXplRW5kKTtcblxuICAgIC8vIEFkZCBhIGNsYXNzIHRvIGJvZHkgdG8gbWFpbnRhaW4gY3Vyc29yIGR1cmluZyBkcmFnXG4gICAgZG9jdW1lbnQuYm9keS5zdHlsZS5jdXJzb3IgPSAnY29sLXJlc2l6ZSc7XG4gIH1cblxuICAvLyBBcnJvdyBmdW5jdGlvbiB0byBwcmVzZXJ2ZSAndGhpcycgY29udGV4dFxuICBwcml2YXRlIG9uUmVzaXplTW92ZSA9IChldmVudDogTW91c2VFdmVudCk6IHZvaWQgPT4ge1xuXG4gICAgaWYgKCF0aGlzLnJlc2l6aW5nIHx8IHRoaXMucmVzaXplQ29sdW1uSW5kZXggPT09IG51bGwpIHJldHVybjtcblxuICAgIC8vIENhbGN1bGF0ZSBob3cgZmFyIHRoZSBtb3VzZSBoYXMgbW92ZWRcbiAgICBjb25zdCBkZWx0YVggPSBldmVudC5jbGllbnRYIC0gdGhpcy5zdGFydFg7XG5cbiAgICAvLyBDYWxjdWxhdGUgbmV3IHdpZHRoICh3aXRoIG1pbmltdW0gb2YgNTBweClcbiAgICBjb25zdCBuZXdXaWR0aCA9IE1hdGgubWF4KDUwLCB0aGlzLnN0YXJ0V2lkdGggKyBkZWx0YVgpO1xuXG4gICAgLy8gVXBkYXRlIHRoZSBjb2x1bW4gd2lkdGhcbiAgICB0aGlzLmFwaS51cGRhdGVDb2x1bW4odGhpcy5jb2x1bW5EZWZzW3RoaXMucmVzaXplQ29sdW1uSW5kZXhdLmlkLCB7IHdpZHRoOiBuZXdXaWR0aCB9KTtcbiAgfVxuXG4gIHByaXZhdGUgb25SZXNpemVFbmQgPSAoKTogdm9pZCA9PiB7XG5cbiAgICAvLyBDbGVhbiB1cFxuICAgIHRoaXMucmVzaXppbmcgPSBmYWxzZTtcbiAgICB0aGlzLnJlc2l6ZUNvbHVtbkluZGV4ID0gbnVsbDtcbiAgICBkb2N1bWVudC5ib2R5LnN0eWxlLmN1cnNvciA9ICcnO1xuXG4gICAgLy8gUmVtb3ZlIGRvY3VtZW50IGxpc3RlbmVyc1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMub25SZXNpemVNb3ZlKTtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5vblJlc2l6ZUVuZCk7XG4gIH1cblxuICAvLyBUcmFjayB0aGUgZHJhZ2dlZCBjb2x1bW4gaW5kZXhcbiAgb25EcmFnQ29sdW1uU3RhcnQoZXZlbnQ6IERyYWdFdmVudCwgaW5kZXg6IG51bWJlcik6IHZvaWQge1xuXG4gICAgdGhpcy5kcmFnZ2VkSW5kZXggPSBpbmRleDtcblxuICAgIC8vIE9wdGlvbmFsOiBTZXQgZHJhZyBpbWFnZS9lZmZlY3RcbiAgICBpZiAoZXZlbnQuZGF0YVRyYW5zZmVyKSB7XG5cbiAgICAgIGV2ZW50LmRhdGFUcmFuc2Zlci5lZmZlY3RBbGxvd2VkID0gJ21vdmUnO1xuICAgIH1cbiAgfVxuXG4gIG9uRHJhZ0NvbHVtbk92ZXIoZXZlbnQ6IERyYWdFdmVudCwgdGFyZ2V0SW5kZXg6IG51bWJlcik6IHZvaWQge1xuXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgIC8vIFNraXAgaWYgZHJhZ2dpbmcgb3ZlciBpdHNlbGYgb3Igbm8gZHJhZyBpbiBwcm9ncmVzc1xuICAgIGlmICh0aGlzLmRyYWdnZWRJbmRleCA9PT0gbnVsbCB8fCB0aGlzLmRyYWdnZWRJbmRleCA9PT0gdGFyZ2V0SW5kZXgpIHtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIElNTUVESUFURUxZIHJlb3JkZXIgY29sdW1uc1xuICAgIHRoaXMuYXBpLnJlb3JkZXJDb2x1bW5EZWZzKHRoaXMuZHJhZ2dlZEluZGV4LCB0YXJnZXRJbmRleCk7XG5cbiAgICAvLyBVcGRhdGUgZHJhZ2dlZEluZGV4IHRvIHRoZSBuZXcgcG9zaXRpb25cbiAgICB0aGlzLmRyYWdnZWRJbmRleCA9IHRhcmdldEluZGV4O1xuICB9XG5cbiAgb25EcmFnQ29sdW1uRW5kKGV2ZW50OiBEcmFnRXZlbnQpOiB2b2lkIHtcblxuICAgIHRoaXMuZHJhZ2dlZEluZGV4ID0gbnVsbDtcbiAgfVxuXG4gIG9uRHJvcENvbHVtbihldmVudDogRHJhZ0V2ZW50KTogdm9pZCB7XG5cbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgdGhpcy5kcmFnZ2VkSW5kZXggPSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIEFsbCBTdWJzY3JpcHRpb25zXG4gICAqL1xuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcblxuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cIm9uZS1ncmlkLWhlYWRlclwiPlxuICAgIEBpZiAoZW5hYmxlR3JvdXBDb2x1bW5EZWZzKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJvbmUtZ3JvdXAtaGVhZGVyLXJvd1wiIFtzdHlsZS50cmFuc2Zvcm1dPVwiJ3RyYW5zbGF0ZVgoLScgKyBzY3JvbGxMZWZ0ICsgJ3B4KSdcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJncm91cENvbHVtbnM7IGNvbnRleHQ6IHsgZ3JvdXBzOiBncm91cENvbHVtbkRlZnMgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICB9XG4gICAgPGRpdiBjbGFzcz1cIm9uZS1ncmlkLWhlYWRlci12aWV3cG9ydFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwib25lLWhlYWRlci1yb3dcIiBbc3R5bGUudHJhbnNmb3JtXT1cIid0cmFuc2xhdGVYKC0nICsgc2Nyb2xsTGVmdCArICdweCknXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaGVhZGVyQ29sdW1uczsgY29udGV4dDogeyBjb2x1bW5zOiBjb2x1bW5EZWZzIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG48L2Rpdj5cblxuPCEtLSBHcm91cCBIZWFkZXIgQ2VsbCBUZW1wbGF0ZSAtLT5cbjxuZy10ZW1wbGF0ZSAjZ3JvdXBDb2x1bW5zIGxldC1ncm91cHM9XCJncm91cHNcIj5cbiAgICBAZm9yKGdyb3VwIG9mIGdyb3VwczsgdHJhY2sgZ3JvdXAuaWQpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cIm9uZS1ncm91cC1oZWFkZXItY2VsbFwiXG4gICAgICAgICAgICBbc3R5bGUud2lkdGgucHhdPVwiZ3JvdXAud2lkdGhcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwiZ3JvdXAuX3Jlc29sdmVkR3JvdXBDbGFzc1wiXG4gICAgICAgICAgICBbbmdTdHlsZV09XCJncm91cC5fcmVzb2x2ZWRHcm91cFN0eWxlXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwib25lLWdyb3VwLWhlYWRlci1jZWxsLXRleHRcIj5cbiAgICAgICAgICAgICAgICB7eyBncm91cC5oZWFkZXJOYW1lIH19XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgfVxuPC9uZy10ZW1wbGF0ZT5cblxuPCEtLSBIZWFkZXIgQ2VsbCBUZW1wbGF0ZSAtLT5cbjxuZy10ZW1wbGF0ZSAjaGVhZGVyQ29sdW1ucyBsZXQtY29sdW1ucz1cImNvbHVtbnNcIj5cbiAgICBAZm9yIChjb2wgb2YgY29sdW1uczsgbGV0IGNvbEluZGV4ID0gJGluZGV4OyB0cmFjayBjb2wuaWQpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cIm9uZS1ncmlkLWhlYWRlci1jb2x1bW5cIlxuICAgICAgICAgICAgW2F0dHIuZGF0YS1pbmRleF09XCJjb2xJbmRleFwiXG4gICAgICAgICAgICBbc3R5bGUud2lkdGgucHhdPVwiY29sLndpZHRoXCJcbiAgICAgICAgICAgIFtzdHlsZS5taW4td2lkdGgucHhdPVwiY29sLm1pbldpZHRoXCJcbiAgICAgICAgICAgIFtzdHlsZS5tYXgtd2lkdGgucHhdPVwiY29sLm1heFdpZHRoXCJcbiAgICAgICAgICAgIFtkcmFnZ2FibGVdPVwiY29sPy5kcmFnYWJsZVwiXG4gICAgICAgICAgICAoZHJhZ3N0YXJ0KT1cIm9uRHJhZ0NvbHVtblN0YXJ0KCRldmVudCwgY29sSW5kZXgpXCJcbiAgICAgICAgICAgIChkcmFnb3Zlcik9XCJvbkRyYWdDb2x1bW5PdmVyKCRldmVudCwgY29sSW5kZXgpXCJcbiAgICAgICAgICAgIChkcmFnZW5kKT1cIm9uRHJhZ0NvbHVtbkVuZCgkZXZlbnQpXCJcbiAgICAgICAgICAgIChkcm9wKT1cIm9uRHJvcENvbHVtbigkZXZlbnQpXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwib25lLWdyaWQtaGVhZGVyLWNlbGxcIlxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImNvbC5fcmVzb2x2ZWRIZWFkZXJDbGFzc1wiXG4gICAgICAgICAgICAgICAgW25nU3R5bGVdPVwiY29sLl9yZXNvbHZlZEhlYWRlclN0eWxlXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJvbmUtZ3JpZC1oZWFkZXItY2VsbC1ncm91cFwiPlxuICAgICAgICAgICAgICAgICAgICBAaWYgKGNvbD8uaGVhZGVyQ2hlY2tib3hTZWxlY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxvbmUtZ3JpZC1jaGVja2JveC1oZWFkZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXBpXT1cImFwaVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FsbG93ZWRFZGl0XT1cImFsbG93ZWRFZGl0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB7eyBjb2w/LmhlYWRlck5hbWUgPz8gJycgfX1cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICA8IS0tIE9nIFJlc2l6ZSBIYW5kbGVyIC0tPlxuICAgICAgICAgICAgICAgIEBpZiAoY29sPy5yZXNpemFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm9nLXJlc2l6ZS1oYW5kbGVcIiAobW91c2Vkb3duKT1cIm9uUmVzaXplU3RhcnQoJGV2ZW50LCBjb2xJbmRleClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiYmkgYmktZ3JpcC12ZXJ0aWNhbFwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm9uZS1ncmlkLWhlYWRlci1jZWxsLWdyb3VwXCI+XG5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSBTb3J0IE1lbnUgQnV0dG9uIC0tPlxuICAgICAgICAgICAgICAgICAgICBAaWYgKGNvbD8uc29ydGFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJvbmUtZ3JpZC1oZWFkZXItbWVudS1idXR0b25cIiAoY2xpY2spPVwib25IZWFkZXJNZW51U29ydENsaWNrKGNvbC5maWVsZClcIj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoKGNvbC5maWVsZCB8IGNvbHVtblNvcnRTdGF0ZTphcGkuc29ydE1vZGVsKSA9PT0gJ2FzYycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGx1Y2lkZS1pY29uIG5hbWU9XCJhcnJvdy11cC1hLXpcIiBbc2l6ZV09XCIxNlwiIFtzdHJva2VXaWR0aF09XCIyXCI+PC9sdWNpZGUtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQGVsc2UgaWYgKChjb2wuZmllbGQgfCBjb2x1bW5Tb3J0U3RhdGU6YXBpLnNvcnRNb2RlbCkgPT09ICdkZXNjJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bHVjaWRlLWljb24gbmFtZT1cImFycm93LWRvd24tei1hXCIgW3NpemVdPVwiMTZcIiBbc3Ryb2tlV2lkdGhdPVwiMlwiPjwvbHVjaWRlLWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGx1Y2lkZS1pY29uIG5hbWU9XCJhcnJvdy1kb3duLXVwXCIgW3NpemVdPVwiMTZcIiBbc3Ryb2tlV2lkdGhdPVwiMlwiPjwvbHVjaWRlLWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICA8IS0tIE9nIE9wdGlvbiBNZW51IEJ1dHRvbiAtLT5cbiAgICAgICAgICAgICAgICAgICAgQGlmIChjb2wgJiYgIWNvbC5zdXBwcmVzc0hlYWRlck1lbnVCdXR0b24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJvbmUtZ3JpZC1oZWFkZXItbWVudS1idXR0b25cIiAoY2xpY2spPVwib25IZWFkZXJNZW51T3B0aW9uQ2xpY2soY29sKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiYmkgYmktdGhyZWUtZG90cy12ZXJ0aWNhbFwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgfVxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
177
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib25lLWdyaWQtaGVhZGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29uZS1ncmlkL3NyYy9saWIvY29tcG9uZW50cy9vbmUtZ3JpZC1oZWFkZXIvb25lLWdyaWQtaGVhZGVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29uZS1ncmlkL3NyYy9saWIvY29tcG9uZW50cy9vbmUtZ3JpZC1oZWFkZXIvb25lLWdyaWQtaGVhZGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBb0MsU0FBUyxFQUFjLEtBQUssRUFBcUIsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTdILE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFLcEMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0scUNBQXFDLENBQUM7Ozs7Ozs7QUFRekUsTUFBTSxPQUFPLHNCQUFzQjtJQUlqQzs7Ozs7O09BTUc7SUFDSCxJQUNJLFVBQVUsQ0FBQyxLQUFhO1FBRTFCLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxJQUFJLENBQUMsQ0FBQztRQUU5QixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDekIsQ0FBQztJQUVELElBQUksVUFBVTtRQUVaLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUMxQixDQUFDO0lBb0JELFlBQ1UsWUFBaUMsRUFDakMsR0FBc0I7UUFEdEIsaUJBQVksR0FBWixZQUFZLENBQXFCO1FBQ2pDLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBcEJ4QixnQkFBVyxHQUFHLENBQUMsQ0FBQztRQUNmLGdCQUFXLEdBQVksS0FBSyxDQUFDO1FBQzdCLDBCQUFxQixHQUFZLEtBQUssQ0FBQztRQUd0QyxvQkFBZSxHQUF3QixFQUFFLENBQUM7UUFDMUMsZUFBVSxHQUFzQixFQUFFLENBQUM7UUFFckMsY0FB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V0FBVztRQUVULDJFQUEyRTtRQUMzRSx1RUFBdUU7UUFDdkUsNkVBQTZFO1FBQzdFLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxFQUFFLENBQUM7UUFFakMseUVBQXlFO1FBQ3pFLHFFQUFxRTtRQUNyRSxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUVsQixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDckIsQ0FBQztJQUNILENBQUM7K0dBN05VLHNCQUFzQjttR0FBdEIsc0JBQXNCLHFUQ2ZuQyx5eEpBc0dBOzs0RkR2RmEsc0JBQXNCO2tCQU5sQyxTQUFTO2lDQUNJLEtBQUssWUFDUCxpQkFBaUI7d0hBTTRCLGNBQWM7c0JBQXBFLFNBQVM7dUJBQUMsZ0JBQWdCLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQVV6QyxVQUFVO3NCQURiLEtBQUs7Z0JBY0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxxQkFBcUI7c0JBQTdCLEtBQUs7Z0JBQ0csR0FBRztzQkFBWCxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgRWxlbWVudFJlZiwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9uZUNvbHVtbkRlZiwgT25lR3JvdXBDb2x1bW5EZWYgfSBmcm9tICcuLi8uLi9jb3JlL21vZGVscy9vbmUtY29sdW1uLWRlZi10eXBlcy5tb2RlbCc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IE9uZUdyaWRBcGkgfSBmcm9tICcuLi8uLi9jb3JlL2luc3RhbnRzL29uZS1ncmlkLWFwaS5jbGFzcyc7XG5pbXBvcnQgeyBPbmVTb3J0TW9kZWwgfSBmcm9tICcuLi8uLi9jb3JlL21vZGVscy9vbmUtZ3JpZC10eXBlcy5tb2RlbCc7XG5pbXBvcnQgeyBDb2x1bW5DaGFuZ2VkRXZlbnQgfSBmcm9tICcuLi8uLi9jb3JlL21vZGVscy9vbmUtZXZlbnQtdHlwZXMubW9kZWwnO1xuaW1wb3J0IHsgT25lR3JpZEV2ZW50U2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvc2VydmljZXMvb25lLWdyaWQtZXZlbnQuc2VydmljZSc7XG5pbXBvcnQgeyByZXNvbHZlQ29sdW1uV2lkdGggfSBmcm9tICcuLi8uLi9oZWxwZXJzL29uZS1jb2x1bW4tZGVmLmhlbHBlcic7XG5cbkBDb21wb25lbnQoe1xuICBzdGFuZGFsb25lOiBmYWxzZSxcbiAgc2VsZWN0b3I6ICdvbmUtZ3JpZC1oZWFkZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vb25lLWdyaWQtaGVhZGVyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL29uZS1ncmlkLWhlYWRlci5jb21wb25lbnQuc2Nzcydcbn0pXG5leHBvcnQgY2xhc3MgT25lR3JpZEhlYWRlckNvbXBvbmVudDxUPiBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcblxuICBAVmlld0NoaWxkKCdoZWFkZXJWaWV3cG9ydCcsIHsgc3RhdGljOiB0cnVlIH0pIHByaXZhdGUgaGVhZGVyVmlld3BvcnQ/OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcblxuICAvKipcbiAgICogSG9yaXpvbnRhbCBvZmZzZXQgb2YgdGhlIGJvZHksIG1pcnJvcmVkIGhlcmUgc28gdGhlIGhlYWRlciB0cmFja3MgaXQuXG4gICAqXG4gICAqIEFwcGxpZWQgdG8gdGhlIHZpZXdwb3J0J3MgYHNjcm9sbExlZnRgIHJhdGhlciB0aGFuIGFzIGEgdHJhbnNmb3JtIG9uIHRoZVxuICAgKiByb3c6IHN0aWNreSBwb3NpdGlvbmluZyBuZWVkcyBhIHJlYWwgc2Nyb2xscG9ydCBhYm92ZSBpdC4gVGhlIGdyb3VwIHJvdyxcbiAgICogd2hpY2ggaXMgYSBzaWJsaW5nIG9mIHRoYXQgdmlld3BvcnQsIHN0aWxsIHJlYWRzIHRoaXMgZm9yIGl0cyB0cmFuc2Zvcm0uXG4gICAqL1xuICBASW5wdXQoKVxuICBzZXQgc2Nyb2xsTGVmdCh2YWx1ZTogbnVtYmVyKSB7XG5cbiAgICB0aGlzLl9zY3JvbGxMZWZ0ID0gdmFsdWUgPz8gMDtcblxuICAgIHRoaXMuYXBwbHlTY3JvbGxMZWZ0KCk7XG4gIH1cblxuICBnZXQgc2Nyb2xsTGVmdCgpOiBudW1iZXIge1xuXG4gICAgcmV0dXJuIHRoaXMuX3Njcm9sbExlZnQ7XG4gIH1cblxuICBwcml2YXRlIF9zY3JvbGxMZWZ0ID0gMDtcbiAgQElucHV0KCkgYWxsb3dlZEVkaXQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgZW5hYmxlR3JvdXBDb2x1bW5EZWZzOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGFwaSE6IE9uZUdyaWRBcGk8VD47XG5cbiAgcHJvdGVjdGVkIGdyb3VwQ29sdW1uRGVmczogT25lR3JvdXBDb2x1bW5EZWZbXSA9IFtdO1xuICBwcm90ZWN0ZWQgY29sdW1uRGVmczogT25lQ29sdW1uRGVmPFQ+W10gPSBbXTtcblxuICBwcml2YXRlIHNvcnRNb2RlbDogT25lU29ydE1vZGVsPFQ+W10gPSBbXTtcbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb25zID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuICBwcml2YXRlIGRyYWdnZWRJbmRleDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG5cbiAgLy8gVHJhY2sgcmVzaXplIHN0YXRlXG4gIHByaXZhdGUgcmVzaXppbmcgPSBmYWxzZTtcbiAgcHJpdmF0ZSByZXNpemVDb2x1bW5JbmRleDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgc3RhcnRYID0gMDtcbiAgcHJpdmF0ZSBzdGFydFdpZHRoID0gMDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGV2ZW50U2VydmljZTogT25lR3JpZEV2ZW50U2VydmljZSxcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWZcbiAgICkge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcblxuICAgIC8vIExpc3RlbiBDb2x1bW4gQ2hhbmdlZCBFdmVudFxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQodGhpcy5ldmVudFNlcnZpY2UuYWRkRXZlbnRMaXN0ZW5lcignY29sdW1uQ2hhbmdlZCcsIChwYXlsb2FkOiBDb2x1bW5DaGFuZ2VkRXZlbnQpID0+IHtcblxuICAgICAgY29uc3QgeyBncm91cHMsIGNvbHVtbnMgfSA9IHBheWxvYWQ7XG5cbiAgICAgIGlmIChncm91cHMpIHtcblxuICAgICAgICB0aGlzLmdyb3VwQ29sdW1uRGVmcyA9IGdyb3VwcyBhcyBPbmVHcm91cENvbHVtbkRlZltdO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29sdW1ucykge1xuXG4gICAgICAgIHRoaXMuY29sdW1uRGVmcyA9IGNvbHVtbnMgYXMgT25lQ29sdW1uRGVmW107XG4gICAgICB9XG5cbiAgICAgIC8vIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH0pKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcblxuICAgIC8vIFRoZSBpbnB1dCBzZXR0ZXIgY2FuIHJ1biBiZWZvcmUgdGhlIHZpZXcgZXhpc3RzLCBzbyB3aGF0ZXZlciBhcnJpdmVkXG4gICAgLy8gZmlyc3QgaXMgYXBwbGllZCBvbmNlIGhlcmUuXG4gICAgdGhpcy5hcHBseVNjcm9sbExlZnQoKTtcbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlTY3JvbGxMZWZ0KCk6IHZvaWQge1xuXG4gICAgaWYgKHRoaXMuaGVhZGVyVmlld3BvcnQpIHtcblxuICAgICAgdGhpcy5oZWFkZXJWaWV3cG9ydC5uYXRpdmVFbGVtZW50LnNjcm9sbExlZnQgPSB0aGlzLl9zY3JvbGxMZWZ0O1xuICAgIH1cbiAgfVxuXG4gIG9uSGVhZGVyTWVudU9wdGlvbkNsaWNrKGNvbHVtbkRlZjogT25lQ29sdW1uRGVmPFQ+KSB7XG5cbiAgfVxuXG4gIG9uSGVhZGVyTWVudVNvcnRDbGljayhjb2xJZDoga2V5b2YgVCkge1xuXG4gICAgY29uc3QgY3VycmVudFNvcnQgPSB0aGlzLnNvcnRNb2RlbC5maW5kKHNvcnQgPT4gc29ydC5jb2xJZCA9PT0gY29sSWQpPy5zb3J0ID8/IG51bGw7XG5cbiAgICBjb25zdCBuZXh0U29ydCA9IHRoaXMuY3ljbGVTb3J0KGN1cnJlbnRTb3J0KTtcblxuICAgIHRoaXMuc29ydE1vZGVsID0gbmV4dFNvcnQgPyBbeyBjb2xJZCwgc29ydDogbmV4dFNvcnQgfV0gOiBbXTtcblxuICAgIHRoaXMuYXBpLm9uU29ydENoYW5nZWQodGhpcy5zb3J0TW9kZWwpO1xuICB9XG5cbiAgLy8gQ3ljbGUgU29ydGluZyBNb2RlbFxuICBwcml2YXRlIGN5Y2xlU29ydChjdXJyZW50OiAnYXNjJyB8ICdkZXNjJyB8IG51bGwpOiAnYXNjJyB8ICdkZXNjJyB8IG51bGwge1xuXG4gICAgc3dpdGNoIChjdXJyZW50KSB7XG5cbiAgICAgIGNhc2UgbnVsbDogcmV0dXJuICdhc2MnO1xuXG4gICAgICBjYXNlICdhc2MnOiByZXR1cm4gJ2Rlc2MnO1xuXG4gICAgICBjYXNlICdkZXNjJzogcmV0dXJuIG51bGw7XG5cbiAgICAgIGRlZmF1bHQ6IHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIG9uUmVzaXplU3RhcnQoZXZlbnQ6IE1vdXNlRXZlbnQsIGNvbHVtbkluZGV4OiBudW1iZXIpOiB2b2lkIHtcblxuICAgIC8vIFByZXZlbnQgdGV4dCBzZWxlY3Rpb24gYW5kIGRlZmF1bHQgYmVoYXZpb3JcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgLy8gU3RvcmUgaW5pdGlhbCB2YWx1ZXNcbiAgICB0aGlzLnJlc2l6aW5nID0gdHJ1ZTtcbiAgICB0aGlzLnJlc2l6ZUNvbHVtbkluZGV4ID0gY29sdW1uSW5kZXg7XG4gICAgdGhpcy5zdGFydFggPSBldmVudC5jbGllbnRYO1xuXG4gICAgLy8gTWVhc3VyZSB3aGF0IGlzIG9uIHNjcmVlbiByYXRoZXIgdGhhbiB0cnVzdGluZyBgY29sLndpZHRoYCwgd2hpY2ggaXNcbiAgICAvLyBvcHRpb25hbDogYSBjb2x1bW4gc2l6ZWQgcHVyZWx5IGJ5IG1pbldpZHRoIGhhZCBgdW5kZWZpbmVkYCBoZXJlLCBhbmRcbiAgICAvLyBgTWF0aC5tYXgoNTAsIHVuZGVmaW5lZCArIGRlbHRhWClgIGlzIE5hTiDigJQgdGhlIGNvbHVtbiBjb2xsYXBzZWQgb24gdGhlXG4gICAgLy8gZmlyc3QgbW91c2UgbW92ZSBhbmQgY291bGQgbm90IGJlIHJlY292ZXJlZC5cbiAgICBjb25zdCBjb2x1bW5FbGVtZW50ID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCk/LmNsb3Nlc3Q8SFRNTEVsZW1lbnQ+KCcub25lLWdyaWQtaGVhZGVyLWNvbHVtbicpO1xuXG4gICAgdGhpcy5zdGFydFdpZHRoID0gY29sdW1uRWxlbWVudD8ub2Zmc2V0V2lkdGggfHwgcmVzb2x2ZUNvbHVtbldpZHRoKHRoaXMuY29sdW1uRGVmc1tjb2x1bW5JbmRleF0pO1xuXG4gICAgLy8gQWRkIGRvY3VtZW50LWxldmVsIGxpc3RlbmVycyBmb3IgZHJhZyBhbmQgcmVsZWFzZVxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMub25SZXNpemVNb3ZlKTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5vblJlc2l6ZUVuZCk7XG5cbiAgICAvLyBBZGQgYSBjbGFzcyB0byBib2R5IHRvIG1haW50YWluIGN1cnNvciBkdXJpbmcgZHJhZ1xuICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuY3Vyc29yID0gJ2NvbC1yZXNpemUnO1xuICB9XG5cbiAgLy8gQXJyb3cgZnVuY3Rpb24gdG8gcHJlc2VydmUgJ3RoaXMnIGNvbnRleHRcbiAgcHJpdmF0ZSBvblJlc2l6ZU1vdmUgPSAoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkID0+IHtcblxuICAgIGlmICghdGhpcy5yZXNpemluZyB8fCB0aGlzLnJlc2l6ZUNvbHVtbkluZGV4ID09PSBudWxsKSByZXR1cm47XG5cbiAgICAvLyBDYWxjdWxhdGUgaG93IGZhciB0aGUgbW91c2UgaGFzIG1vdmVkXG4gICAgY29uc3QgZGVsdGFYID0gZXZlbnQuY2xpZW50WCAtIHRoaXMuc3RhcnRYO1xuXG4gICAgLy8gQ2FsY3VsYXRlIG5ldyB3aWR0aCAod2l0aCBtaW5pbXVtIG9mIDUwcHgpXG4gICAgY29uc3QgbmV3V2lkdGggPSBNYXRoLm1heCg1MCwgdGhpcy5zdGFydFdpZHRoICsgZGVsdGFYKTtcblxuICAgIC8vIFVwZGF0ZSB0aGUgY29sdW1uIHdpZHRoXG4gICAgdGhpcy5hcGkudXBkYXRlQ29sdW1uKHRoaXMuY29sdW1uRGVmc1t0aGlzLnJlc2l6ZUNvbHVtbkluZGV4XS5pZCwgeyB3aWR0aDogbmV3V2lkdGggfSk7XG4gIH1cblxuICBwcml2YXRlIG9uUmVzaXplRW5kID0gKCk6IHZvaWQgPT4ge1xuXG4gICAgLy8gQ2xlYW4gdXBcbiAgICB0aGlzLnJlc2l6aW5nID0gZmFsc2U7XG4gICAgdGhpcy5yZXNpemVDb2x1bW5JbmRleCA9IG51bGw7XG4gICAgZG9jdW1lbnQuYm9keS5zdHlsZS5jdXJzb3IgPSAnJztcblxuICAgIC8vIFJlbW92ZSBkb2N1bWVudCBsaXN0ZW5lcnNcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLm9uUmVzaXplTW92ZSk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMub25SZXNpemVFbmQpO1xuICB9XG5cbiAgLy8gVHJhY2sgdGhlIGRyYWdnZWQgY29sdW1uIGluZGV4XG4gIG9uRHJhZ0NvbHVtblN0YXJ0KGV2ZW50OiBEcmFnRXZlbnQsIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcblxuICAgIHRoaXMuZHJhZ2dlZEluZGV4ID0gaW5kZXg7XG5cbiAgICAvLyBPcHRpb25hbDogU2V0IGRyYWcgaW1hZ2UvZWZmZWN0XG4gICAgaWYgKGV2ZW50LmRhdGFUcmFuc2Zlcikge1xuXG4gICAgICBldmVudC5kYXRhVHJhbnNmZXIuZWZmZWN0QWxsb3dlZCA9ICdtb3ZlJztcbiAgICB9XG4gIH1cblxuICBvbkRyYWdDb2x1bW5PdmVyKGV2ZW50OiBEcmFnRXZlbnQsIHRhcmdldEluZGV4OiBudW1iZXIpOiB2b2lkIHtcblxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAvLyBTa2lwIGlmIGRyYWdnaW5nIG92ZXIgaXRzZWxmIG9yIG5vIGRyYWcgaW4gcHJvZ3Jlc3NcbiAgICBpZiAodGhpcy5kcmFnZ2VkSW5kZXggPT09IG51bGwgfHwgdGhpcy5kcmFnZ2VkSW5kZXggPT09IHRhcmdldEluZGV4KSB7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJTU1FRElBVEVMWSByZW9yZGVyIGNvbHVtbnNcbiAgICB0aGlzLmFwaS5yZW9yZGVyQ29sdW1uRGVmcyh0aGlzLmRyYWdnZWRJbmRleCwgdGFyZ2V0SW5kZXgpO1xuXG4gICAgLy8gVXBkYXRlIGRyYWdnZWRJbmRleCB0byB0aGUgbmV3IHBvc2l0aW9uXG4gICAgdGhpcy5kcmFnZ2VkSW5kZXggPSB0YXJnZXRJbmRleDtcbiAgfVxuXG4gIG9uRHJhZ0NvbHVtbkVuZChldmVudDogRHJhZ0V2ZW50KTogdm9pZCB7XG5cbiAgICB0aGlzLmRyYWdnZWRJbmRleCA9IG51bGw7XG4gIH1cblxuICBvbkRyb3BDb2x1bW4oZXZlbnQ6IERyYWdFdmVudCk6IHZvaWQge1xuXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgIHRoaXMuZHJhZ2dlZEluZGV4ID0gbnVsbDtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuXG4gICAgLy8gVGhpcyBjb21wbGV0ZWQgYW4gdW51c2VkIFN1YmplY3QgYW5kIGxlZnQgdGhlIHJlYWwgc3Vic2NyaXB0aW9uIHJ1bm5pbmcuXG4gICAgLy8gSXQgc3Vydml2ZWQgb25seSBiZWNhdXNlIE9uZUdyaWRFdmVudFNlcnZpY2UgaXMgY29tcG9uZW50LXNjb3BlZCBhbmRcbiAgICAvLyB0ZWFycyBpdHMgb3duIGxpc3RlbmVycyBkb3duIOKAlCB0aGUgaGVhZGVyIHdhcyByZWx5aW5nIG9uIHRoYXQgYnkgYWNjaWRlbnQuXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnVuc3Vic2NyaWJlKCk7XG5cbiAgICAvLyBBIHJlc2l6ZSBpbiBmbGlnaHQgb3ducyB0d28gbGlzdGVuZXJzIG9uIGBkb2N1bWVudGAuIFdpdGhvdXQgdGhpcyB0aGV5XG4gICAgLy8gb3V0bGl2ZSB0aGUgY29tcG9uZW50LCBhbmQgdGhlaXIgY2xvc3VyZXMga2VlcCBpdCBhbGl2ZSB3aXRoIHRoZW0uXG4gICAgaWYgKHRoaXMucmVzaXppbmcpIHtcblxuICAgICAgdGhpcy5vblJlc2l6ZUVuZCgpO1xuICAgIH1cbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cIm9uZS1ncmlkLWhlYWRlclwiPlxuICAgIEBpZiAoZW5hYmxlR3JvdXBDb2x1bW5EZWZzKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJvbmUtZ3JvdXAtaGVhZGVyLXJvd1wiIFtzdHlsZS50cmFuc2Zvcm1dPVwiJ3RyYW5zbGF0ZVgoLScgKyBzY3JvbGxMZWZ0ICsgJ3B4KSdcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJncm91cENvbHVtbnM7IGNvbnRleHQ6IHsgZ3JvdXBzOiBncm91cENvbHVtbkRlZnMgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICB9XG4gICAgPCEtLSBUaGUgY29sdW1uIHJvdyBpcyBzY3JvbGxlZCByYXRoZXIgdGhhbiB0cmFuc2xhdGVkLiBgcG9zaXRpb246IHN0aWNreWBcbiAgICAgICAgIHJlc29sdmVzIGFnYWluc3QgdGhlIG5lYXJlc3Qgc2Nyb2xscG9ydCwgYW5kIGEgdHJhbnNmb3JtZWQgYW5jZXN0b3IgaXNcbiAgICAgICAgIG5vdCBvbmUg4oCUIHBpbm5lZCBoZWFkZXJzIGNvdWxkIG5ldmVyIGhvbGQgdGhlaXIgcGxhY2UgaW5zaWRlIGl0LiBUaGVcbiAgICAgICAgIGdyb3VwIHJvdyBhYm92ZSBrZWVwcyBpdHMgdHJhbnNmb3JtOiBncm91cHMgc3BhbiBjb250aWd1b3VzIGNvbHVtbnMsXG4gICAgICAgICB3aGljaCBwaW5uaW5nIHJlb3JkZXJzLCBzbyB0aGUgdHdvIGZlYXR1cmVzIGRvIG5vdCBjb21iaW5lLiAtLT5cbiAgICA8ZGl2ICNoZWFkZXJWaWV3cG9ydCBjbGFzcz1cIm9uZS1ncmlkLWhlYWRlci12aWV3cG9ydFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwib25lLWhlYWRlci1yb3dcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJoZWFkZXJDb2x1bW5zOyBjb250ZXh0OiB7IGNvbHVtbnM6IGNvbHVtbkRlZnMgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuXG48IS0tIEdyb3VwIEhlYWRlciBDZWxsIFRlbXBsYXRlIC0tPlxuPG5nLXRlbXBsYXRlICNncm91cENvbHVtbnMgbGV0LWdyb3Vwcz1cImdyb3Vwc1wiPlxuICAgIEBmb3IoZ3JvdXAgb2YgZ3JvdXBzOyB0cmFjayBncm91cC5pZCkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwib25lLWdyb3VwLWhlYWRlci1jZWxsXCJcbiAgICAgICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJncm91cC53aWR0aFwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJncm91cC5fcmVzb2x2ZWRHcm91cENsYXNzXCJcbiAgICAgICAgICAgIFtuZ1N0eWxlXT1cImdyb3VwLl9yZXNvbHZlZEdyb3VwU3R5bGVcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJvbmUtZ3JvdXAtaGVhZGVyLWNlbGwtdGV4dFwiPlxuICAgICAgICAgICAgICAgIHt7IGdyb3VwLmhlYWRlck5hbWUgfX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICB9XG48L25nLXRlbXBsYXRlPlxuXG48IS0tIEhlYWRlciBDZWxsIFRlbXBsYXRlIC0tPlxuPG5nLXRlbXBsYXRlICNoZWFkZXJDb2x1bW5zIGxldC1jb2x1bW5zPVwiY29sdW1uc1wiPlxuICAgIEBmb3IgKGNvbCBvZiBjb2x1bW5zOyBsZXQgY29sSW5kZXggPSAkaW5kZXg7IHRyYWNrIGNvbC5pZCkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwib25lLWdyaWQtaGVhZGVyLWNvbHVtblwiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLWluZGV4XT1cImNvbEluZGV4XCJcbiAgICAgICAgICAgIFtjbGFzcy5vbmUtY29sdW1uLXBpbm5lZC1sZWZ0XT1cImNvbC5waW5uZWQgPT09ICdsZWZ0J1wiXG4gICAgICAgICAgICBbY2xhc3Mub25lLWNvbHVtbi1waW5uZWQtcmlnaHRdPVwiY29sLnBpbm5lZCA9PT0gJ3JpZ2h0J1wiXG4gICAgICAgIFtjbGFzcy5vbmUtY29sdW1uLXBpbm5lZC1lZGdlXT1cImNvbC5fcGlubmVkRWRnZVwiXG4gICAgICAgICAgICBbY2xhc3Mub25lLWNvbHVtbi1waW5uZWQtZWRnZV09XCJjb2wuX3Bpbm5lZEVkZ2VcIlxuICAgICAgICAgICAgW3N0eWxlLmxlZnQucHhdPVwiY29sLnBpbm5lZCA9PT0gJ2xlZnQnID8gY29sLl9waW5uZWRPZmZzZXQgOiBudWxsXCJcbiAgICAgICAgICAgIFtzdHlsZS5yaWdodC5weF09XCJjb2wucGlubmVkID09PSAncmlnaHQnID8gY29sLl9waW5uZWRPZmZzZXQgOiBudWxsXCJcbiAgICAgICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJjb2wud2lkdGhcIlxuICAgICAgICAgICAgW3N0eWxlLm1pbi13aWR0aC5weF09XCJjb2wubWluV2lkdGhcIlxuICAgICAgICAgICAgW3N0eWxlLm1heC13aWR0aC5weF09XCJjb2wubWF4V2lkdGhcIlxuICAgICAgICAgICAgW2RyYWdnYWJsZV09XCJjb2wuX3Jlc29sdmVkRHJhZ2FibGVcIlxuICAgICAgICAgICAgKGRyYWdzdGFydCk9XCJvbkRyYWdDb2x1bW5TdGFydCgkZXZlbnQsIGNvbEluZGV4KVwiXG4gICAgICAgICAgICAoZHJhZ292ZXIpPVwib25EcmFnQ29sdW1uT3ZlcigkZXZlbnQsIGNvbEluZGV4KVwiXG4gICAgICAgICAgICAoZHJhZ2VuZCk9XCJvbkRyYWdDb2x1bW5FbmQoJGV2ZW50KVwiXG4gICAgICAgICAgICAoZHJvcCk9XCJvbkRyb3BDb2x1bW4oJGV2ZW50KVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm9uZS1ncmlkLWhlYWRlci1jZWxsXCJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJjb2wuX3Jlc29sdmVkSGVhZGVyQ2xhc3NcIlxuICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cImNvbC5fcmVzb2x2ZWRIZWFkZXJTdHlsZVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwib25lLWdyaWQtaGVhZGVyLWNlbGwtZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICAgICAgQGlmIChjb2w/LmhlYWRlckNoZWNrYm94U2VsZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8b25lLWdyaWQtY2hlY2tib3gtaGVhZGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FwaV09XCJhcGlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthbGxvd2VkRWRpdF09XCJhbGxvd2VkRWRpdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAge3sgY29sPy5oZWFkZXJOYW1lID8/ICcnIH19XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgPCEtLSBPZyBSZXNpemUgSGFuZGxlciAtLT5cbiAgICAgICAgICAgICAgICBAaWYgKGNvbC5fcmVzb2x2ZWRSZXNpemFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm9nLXJlc2l6ZS1oYW5kbGVcIiAobW91c2Vkb3duKT1cIm9uUmVzaXplU3RhcnQoJGV2ZW50LCBjb2xJbmRleClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiYmkgYmktZ3JpcC12ZXJ0aWNhbFwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm9uZS1ncmlkLWhlYWRlci1jZWxsLWdyb3VwXCI+XG5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSBTb3J0IE1lbnUgQnV0dG9uIC0tPlxuICAgICAgICAgICAgICAgICAgICBAaWYgKGNvbC5fcmVzb2x2ZWRTb3J0YWJsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm9uZS1ncmlkLWhlYWRlci1tZW51LWJ1dHRvblwiIChjbGljayk9XCJvbkhlYWRlck1lbnVTb3J0Q2xpY2soY29sLmZpZWxkKVwiPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmICgoY29sLmZpZWxkIHwgY29sdW1uU29ydFN0YXRlOmFwaS5zb3J0TW9kZWwpID09PSAnYXNjJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bHVjaWRlLWljb24gbmFtZT1cImFycm93LXVwLWEtelwiIFtzaXplXT1cIjE2XCIgW3N0cm9rZVdpZHRoXT1cIjJcIj48L2x1Y2lkZS1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAZWxzZSBpZiAoKGNvbC5maWVsZCB8IGNvbHVtblNvcnRTdGF0ZTphcGkuc29ydE1vZGVsKSA9PT0gJ2Rlc2MnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsdWNpZGUtaWNvbiBuYW1lPVwiYXJyb3ctZG93bi16LWFcIiBbc2l6ZV09XCIxNlwiIFtzdHJva2VXaWR0aF09XCIyXCI+PC9sdWNpZGUtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bHVjaWRlLWljb24gbmFtZT1cImFycm93LWRvd24tdXBcIiBbc2l6ZV09XCIxNlwiIFtzdHJva2VXaWR0aF09XCIyXCI+PC9sdWNpZGUtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gT2cgT3B0aW9uIE1lbnUgQnV0dG9uIC0tPlxuICAgICAgICAgICAgICAgICAgICBAaWYgKGNvbCAmJiAhY29sLl9yZXNvbHZlZFN1cHByZXNzSGVhZGVyTWVudUJ1dHRvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm9uZS1ncmlkLWhlYWRlci1tZW51LWJ1dHRvblwiIChjbGljayk9XCJvbkhlYWRlck1lbnVPcHRpb25DbGljayhjb2wpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJiaSBiaS10aHJlZS1kb3RzLXZlcnRpY2FsXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICB9XG48L25nLXRlbXBsYXRlPlxuIl19