@annalib/anna-core 20.2.3 → 20.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (104) hide show
  1. package/{esm2022 → esm2020}/annalib-anna-core.mjs +4 -4
  2. package/{esm2022 → esm2020}/lib/anna-core-shared-lib/components/anna-buyer-approval-icon-template/anna-buyer-approval-icon-template.component.mjs +15 -15
  3. package/{esm2022 → esm2020}/lib/anna-core-shared-lib/components/anna-deleted-order-icon-template/anna-deleted-order-icon-template.component.mjs +14 -14
  4. package/{esm2022 → esm2020}/lib/anna-core-shared-lib/components/anna-icon-column/anna-icon-column.component.mjs +36 -36
  5. package/{esm2022 → esm2020}/lib/anna-core-shared-lib/components/anna-live-icon-template/anna-live-icon-template.component.mjs +15 -15
  6. package/{esm2022 → esm2020}/lib/anna-core-shared-lib/components/anna-no-data/anna-no-data.component.mjs +22 -22
  7. package/{esm2022 → esm2020}/lib/anna-core-shared-lib/components/anna-notify-icon-template/anna-notify-icon-template.component.mjs +14 -14
  8. package/{esm2022 → esm2020}/lib/anna-core-shared-lib/components/anna-pay-for-performance-icon-template/anna-pay-for-performance-icon-template.component.mjs +23 -23
  9. package/{esm2022 → esm2020}/lib/anna-core-shared-lib/components/anna-rejected-icon-template/anna-rejected-icon-template.component.mjs +15 -15
  10. package/esm2020/lib/anna-core-shared-lib/constants/shared.constant.mjs +43 -0
  11. package/{esm2022 → esm2020}/lib/anna-core-shared-lib/directives/digits-only/digits-only.directive.mjs +284 -284
  12. package/{esm2022 → esm2020}/lib/anna-core-shared-lib/directives/fixed-rows-popup-table/fixed-rows-popup-table.directive.mjs +43 -43
  13. package/{esm2022 → esm2020}/lib/anna-core-shared-lib/directives/show-ellipsis-text/show-ellipsis-text.directive.mjs +36 -36
  14. package/{esm2022 → esm2020}/lib/anna-core-shared-lib/models/anna-generic-data-type.model.mjs +1 -1
  15. package/{esm2022 → esm2020}/lib/anna-core-shared-lib/models/anna-global-dropdown-config.model.mjs +1 -1
  16. package/{esm2022 → esm2020}/lib/anna-core-shared-lib/models/anna-non-editable-gt-models.mjs +10 -10
  17. package/{esm2022 → esm2020}/lib/anna-core-shared-lib/models/anna-sort.model.mjs +6 -6
  18. package/{esm2022 → esm2020}/lib/anna-core-shared-lib/models/anna-tooltip.model.mjs +29 -29
  19. package/{esm2022 → esm2020}/lib/anna-core-shared-lib/pipes/annaConvertZeroOrNullOrUndefined.pipe.mjs +26 -26
  20. package/{esm2022 → esm2020}/lib/anna-core-shared-lib/pipes/annaDateFormatter.pipe.mjs +22 -22
  21. package/{esm2022 → esm2020}/lib/anna-core-shared-lib/pipes/annaFilterSearchedText.pipe.mjs +53 -53
  22. package/{esm2022 → esm2020}/lib/anna-core-shared-lib/pipes/annaReplaceChar.pipe.mjs +25 -25
  23. package/{esm2022 → esm2020}/lib/anna-core-shared-lib/pipes/annaTypeOfData.pipe.mjs +16 -16
  24. package/{esm2022 → esm2020}/lib/anna-core-shared-lib/services/anna-date-time-format.service.mjs +208 -208
  25. package/esm2020/lib/anna-core-shared-lib/services/anna-filter.service.mjs +1145 -0
  26. package/{esm2022 → esm2020}/lib/anna-core-shared-lib/services/anna-generic-table.service.mjs +151 -151
  27. package/{esm2022 → esm2020}/lib/anna-core-shared-lib/services/anna-global-config.service.mjs +132 -132
  28. package/{esm2022 → esm2020}/lib/anna-core-shared-lib/services/anna-number-format.service.mjs +53 -53
  29. package/{esm2022 → esm2020}/lib/anna-core-shared-lib/services/anna-persisting-filter.service.mjs +66 -66
  30. package/{esm2022 → esm2020}/lib/anna-core-shared-lib/services/anna-sort.service.mjs +175 -175
  31. package/esm2020/lib/anna-core.module.mjs +213 -0
  32. package/{esm2022 → esm2020}/lib/anna-dropdown-lib/components/anna-calendar-filter/anna-calendar-filter.component.mjs +151 -151
  33. package/esm2020/lib/anna-dropdown-lib/components/anna-week-calendar-filter/anna-week-calendar-filter.component.mjs +364 -0
  34. package/{esm2022 → esm2020}/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-checkbox-filter/anna-column-checkbox-filter.component.mjs +237 -237
  35. package/{esm2022 → esm2020}/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-date-range-filter/anna-column-date-range-filter.component.mjs +180 -180
  36. package/{esm2022 → esm2020}/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-slider-filter/anna-column-slider-filter.component.mjs +306 -306
  37. package/{esm2022 → esm2020}/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-time-filter/anna-column-time-filter.component.mjs +291 -291
  38. package/esm2020/lib/anna-generic-table-lib/components/anna-non-editable-generic-table/anna-non-editable-generic-table.component.mjs +781 -0
  39. package/{esm2022 → esm2020}/lib/anna-generic-table-lib/components/anna-sort/anna-sort.component.mjs +64 -64
  40. package/esm2020/lib/anna-generic-table-lib/components/anna-table-virtual-scroll-viewport/anna-table-virtual-scroll-viewport.component.mjs +357 -0
  41. package/{esm2022 → esm2020}/lib/anna-generic-table-lib/directives/anna-fixed-row-size-table-virtual-scroll-strategy/anna-fixed-row-size-table-virtual-scroll-strategy.directive.mjs +189 -189
  42. package/{esm2022 → esm2020}/lib/anna-generic-table-lib/directives/anna-fixed-row-size-table-virtual-scroll-strategy/index.mjs +1 -1
  43. package/esm2020/lib/anna-generic-table-lib/directives/anna-virtual-table/anna-virtual-table.directive.mjs +178 -0
  44. package/{esm2022 → esm2020}/lib/anna-generic-table-lib/directives/anna-virtual-table/index.mjs +1 -1
  45. package/{esm2022 → esm2020}/public-api.mjs +56 -56
  46. package/fesm2015/annalib-anna-core.mjs +5782 -0
  47. package/fesm2015/annalib-anna-core.mjs.map +1 -0
  48. package/fesm2020/annalib-anna-core.mjs +5774 -0
  49. package/fesm2020/annalib-anna-core.mjs.map +1 -0
  50. package/index.d.ts +5 -5
  51. package/lib/anna-core-shared-lib/components/anna-buyer-approval-icon-template/anna-buyer-approval-icon-template.component.d.ts +8 -8
  52. package/lib/anna-core-shared-lib/components/anna-deleted-order-icon-template/anna-deleted-order-icon-template.component.d.ts +8 -8
  53. package/lib/anna-core-shared-lib/components/anna-icon-column/anna-icon-column.component.d.ts +17 -17
  54. package/lib/anna-core-shared-lib/components/anna-live-icon-template/anna-live-icon-template.component.d.ts +8 -8
  55. package/lib/anna-core-shared-lib/components/anna-no-data/anna-no-data.component.d.ts +11 -11
  56. package/lib/anna-core-shared-lib/components/anna-notify-icon-template/anna-notify-icon-template.component.d.ts +8 -8
  57. package/lib/anna-core-shared-lib/components/anna-pay-for-performance-icon-template/anna-pay-for-performance-icon-template.component.d.ts +12 -12
  58. package/lib/anna-core-shared-lib/components/anna-rejected-icon-template/anna-rejected-icon-template.component.d.ts +8 -8
  59. package/lib/anna-core-shared-lib/constants/shared.constant.d.ts +41 -41
  60. package/lib/anna-core-shared-lib/directives/digits-only/digits-only.directive.d.ts +34 -34
  61. package/lib/anna-core-shared-lib/directives/fixed-rows-popup-table/fixed-rows-popup-table.directive.d.ts +16 -16
  62. package/lib/anna-core-shared-lib/directives/show-ellipsis-text/show-ellipsis-text.directive.d.ts +10 -10
  63. package/lib/anna-core-shared-lib/models/anna-generic-data-type.model.d.ts +16 -16
  64. package/lib/anna-core-shared-lib/models/anna-global-dropdown-config.model.d.ts +97 -97
  65. package/lib/anna-core-shared-lib/models/anna-non-editable-gt-models.d.ts +118 -118
  66. package/lib/anna-core-shared-lib/models/anna-sort.model.d.ts +11 -11
  67. package/lib/anna-core-shared-lib/models/anna-tooltip.model.d.ts +25 -25
  68. package/lib/anna-core-shared-lib/pipes/annaConvertZeroOrNullOrUndefined.pipe.d.ts +9 -9
  69. package/lib/anna-core-shared-lib/pipes/annaDateFormatter.pipe.d.ts +8 -8
  70. package/lib/anna-core-shared-lib/pipes/annaFilterSearchedText.pipe.d.ts +9 -9
  71. package/lib/anna-core-shared-lib/pipes/annaReplaceChar.pipe.d.ts +9 -9
  72. package/lib/anna-core-shared-lib/pipes/annaTypeOfData.pipe.d.ts +7 -7
  73. package/lib/anna-core-shared-lib/services/anna-date-time-format.service.d.ts +28 -28
  74. package/lib/anna-core-shared-lib/services/anna-filter.service.d.ts +154 -154
  75. package/lib/anna-core-shared-lib/services/anna-generic-table.service.d.ts +27 -27
  76. package/lib/anna-core-shared-lib/services/anna-global-config.service.d.ts +21 -21
  77. package/lib/anna-core-shared-lib/services/anna-number-format.service.d.ts +8 -8
  78. package/lib/anna-core-shared-lib/services/anna-persisting-filter.service.d.ts +9 -9
  79. package/lib/anna-core-shared-lib/services/anna-sort.service.d.ts +18 -18
  80. package/lib/anna-core.module.d.ts +43 -43
  81. package/lib/anna-dropdown-lib/components/anna-calendar-filter/anna-calendar-filter.component.d.ts +45 -45
  82. package/lib/anna-dropdown-lib/components/anna-week-calendar-filter/anna-week-calendar-filter.component.d.ts +70 -70
  83. package/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-checkbox-filter/anna-column-checkbox-filter.component.d.ts +60 -60
  84. package/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-date-range-filter/anna-column-date-range-filter.component.d.ts +53 -53
  85. package/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-slider-filter/anna-column-slider-filter.component.d.ts +65 -65
  86. package/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-time-filter/anna-column-time-filter.component.d.ts +83 -83
  87. package/lib/anna-generic-table-lib/components/anna-non-editable-generic-table/anna-non-editable-generic-table.component.d.ts +174 -174
  88. package/lib/anna-generic-table-lib/components/anna-sort/anna-sort.component.d.ts +17 -17
  89. package/lib/anna-generic-table-lib/components/anna-table-virtual-scroll-viewport/anna-table-virtual-scroll-viewport.component.d.ts +141 -141
  90. package/lib/anna-generic-table-lib/directives/anna-fixed-row-size-table-virtual-scroll-strategy/anna-fixed-row-size-table-virtual-scroll-strategy.directive.d.ts +89 -89
  91. package/lib/anna-generic-table-lib/directives/anna-fixed-row-size-table-virtual-scroll-strategy/index.d.ts +1 -1
  92. package/lib/anna-generic-table-lib/directives/anna-virtual-table/anna-virtual-table.directive.d.ts +45 -45
  93. package/lib/anna-generic-table-lib/directives/anna-virtual-table/index.d.ts +1 -1
  94. package/package.json +18 -13
  95. package/public-api.d.ts +41 -41
  96. package/esm2022/lib/anna-core-shared-lib/constants/shared.constant.mjs +0 -43
  97. package/esm2022/lib/anna-core-shared-lib/services/anna-filter.service.mjs +0 -1145
  98. package/esm2022/lib/anna-core.module.mjs +0 -213
  99. package/esm2022/lib/anna-dropdown-lib/components/anna-week-calendar-filter/anna-week-calendar-filter.component.mjs +0 -364
  100. package/esm2022/lib/anna-generic-table-lib/components/anna-non-editable-generic-table/anna-non-editable-generic-table.component.mjs +0 -781
  101. package/esm2022/lib/anna-generic-table-lib/components/anna-table-virtual-scroll-viewport/anna-table-virtual-scroll-viewport.component.mjs +0 -357
  102. package/esm2022/lib/anna-generic-table-lib/directives/anna-virtual-table/anna-virtual-table.directive.mjs +0 -178
  103. package/fesm2022/annalib-anna-core.mjs +0 -5774
  104. package/fesm2022/annalib-anna-core.mjs.map +0 -1
@@ -1,64 +1,64 @@
1
- // Angular import statements
2
- import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core';
3
- import { SortTypeEnum } from '../../../anna-core-shared-lib/models/anna-sort.model';
4
- import { AnnaSortService } from '../../../anna-core-shared-lib/services/anna-sort.service';
5
- import * as i0 from "@angular/core";
6
- import * as i1 from "../../../anna-core-shared-lib/services/anna-sort.service";
7
- import * as i2 from "@angular/common";
8
- //Add onChange push change detection
9
- export class AnnaSortComponent {
10
- constructor(annaSortService) {
11
- this.annaSortService = annaSortService;
12
- this.sortOptionClicked = new EventEmitter();
13
- this.sortOptions = [
14
- {
15
- sortType: SortTypeEnum.ASC,
16
- isOptionActive: false,
17
- text: 'A to Z',
18
- },
19
- {
20
- sortType: SortTypeEnum.DESC,
21
- isOptionActive: false,
22
- text: 'Z to A',
23
- },
24
- {
25
- sortType: SortTypeEnum.DEFAULT,
26
- isOptionActive: false,
27
- text: 'Default',
28
- },
29
- ];
30
- }
31
- ngOnChanges(changes) {
32
- if (changes["sortObjectKey"] && changes["sortObjectKey"].currentValue) {
33
- let sortType = this.annaSortService.columnSortState.get(this.sortObjectKey);
34
- this.setSortType(sortType);
35
- }
36
- }
37
- sortOptionChanged(index, sortType) {
38
- this.sortOptions.forEach((item) => (item.isOptionActive = false));
39
- this.sortOptions[index].isOptionActive = true;
40
- this.sortOptionClicked.emit(sortType);
41
- }
42
- ngOnInit() {
43
- this.annaSortService.updateSortTypeSubject.subscribe((item) => {
44
- this.setSortType(item);
45
- });
46
- }
47
- setSortType(option) {
48
- option = option ? option : SortTypeEnum.DEFAULT;
49
- this.sortOptions.forEach(item => item.isOptionActive = false);
50
- let index = this.sortOptions.findIndex(item => item.sortType == option);
51
- this.sortOptions[index].isOptionActive = true;
52
- }
53
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AnnaSortComponent, deps: [{ token: i1.AnnaSortService }], target: i0.ɵɵFactoryTarget.Component }); }
54
- static { thiscmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: AnnaSortComponent, selector: "anna-core-sort-lib", inputs: { sortObjectKey: "sortObjectKey" }, outputs: { sortOptionClicked: "sortOptionClicked" }, usesOnChanges: true, ngImport: i0, template: "<p class=\"sort-container\">\r\n <button\r\n class=\"sort-btn\"\r\n *ngFor=\"let option of sortOptions; let i = index\"\r\n (click)=\"sortOptionChanged(i, option.sortType)\"\r\n [ngClass]=\"{ active: option.isOptionActive }\"\r\n >\r\n {{option.text}}\r\n </button>\r\n</p>", styles: [".sort-btn{background:#fff;border:none;border-right:1px solid #1b88ff;text-decoration:underline;font-family:Roboto;font-size:14px;font-weight:400;font-stretch:normal;font-style:normal;line-height:1.07;letter-spacing:normal;color:#1b88ff;cursor:pointer;flex:1;text-align:center}.sort-btn:last-of-type{border-right:none}.sort-btn.active{color:#202b47;text-decoration:none}p.sort-container{margin-top:8px;padding-bottom:8px;border-bottom:1px solid #e6e6e6;margin-bottom:0;display:flex}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
55
- }
56
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AnnaSortComponent, decorators: [{
57
- type: Component,
58
- args: [{ selector: 'anna-core-sort-lib', changeDetection: ChangeDetectionStrategy.OnPush, template: "<p class=\"sort-container\">\r\n <button\r\n class=\"sort-btn\"\r\n *ngFor=\"let option of sortOptions; let i = index\"\r\n (click)=\"sortOptionChanged(i, option.sortType)\"\r\n [ngClass]=\"{ active: option.isOptionActive }\"\r\n >\r\n {{option.text}}\r\n </button>\r\n</p>", styles: [".sort-btn{background:#fff;border:none;border-right:1px solid #1b88ff;text-decoration:underline;font-family:Roboto;font-size:14px;font-weight:400;font-stretch:normal;font-style:normal;line-height:1.07;letter-spacing:normal;color:#1b88ff;cursor:pointer;flex:1;text-align:center}.sort-btn:last-of-type{border-right:none}.sort-btn.active{color:#202b47;text-decoration:none}p.sort-container{margin-top:8px;padding-bottom:8px;border-bottom:1px solid #e6e6e6;margin-bottom:0;display:flex}\n"] }]
59
- }], ctorParameters: function () { return [{ type: i1.AnnaSortService }]; }, propDecorators: { sortObjectKey: [{
60
- type: Input
61
- }], sortOptionClicked: [{
62
- type: Output
63
- }] } });
64
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5uYS1zb3J0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FubmEtY29yZS9zcmMvbGliL2FubmEtZ2VuZXJpYy10YWJsZS1saWIvY29tcG9uZW50cy9hbm5hLXNvcnQvYW5uYS1zb3J0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FubmEtY29yZS9zcmMvbGliL2FubmEtZ2VuZXJpYy10YWJsZS1saWIvY29tcG9uZW50cy9hbm5hLXNvcnQvYW5uYS1zb3J0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDRCQUE0QjtBQUM1QixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQWEsTUFBTSxFQUFpQixNQUFNLGVBQWUsQ0FBQztBQUMxSCxPQUFPLEVBQXdCLFlBQVksRUFBRSxNQUFNLHNEQUFzRCxDQUFDO0FBQzFHLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwREFBMEQsQ0FBQzs7OztBQUUzRixvQ0FBb0M7QUFPcEMsTUFBTSxPQUFPLGlCQUFpQjtJQXVCNUIsWUFBb0IsZUFBZ0M7UUFBaEMsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBcEIxQyxzQkFBaUIsR0FBRyxJQUFJLFlBQVksRUFBWSxDQUFDO1FBRTNELGdCQUFXLEdBQWlCO1lBQzFCO2dCQUNFLFFBQVEsRUFBRSxZQUFZLENBQUMsR0FBRztnQkFDMUIsY0FBYyxFQUFFLEtBQUs7Z0JBQ3JCLElBQUksRUFBRSxRQUFRO2FBQ2Y7WUFDRDtnQkFDRSxRQUFRLEVBQUUsWUFBWSxDQUFDLElBQUk7Z0JBQzNCLGNBQWMsRUFBRSxLQUFLO2dCQUNyQixJQUFJLEVBQUUsUUFBUTthQUNmO1lBQ0Q7Z0JBQ0UsUUFBUSxFQUFFLFlBQVksQ0FBQyxPQUFPO2dCQUM5QixjQUFjLEVBQUUsS0FBSztnQkFDckIsSUFBSSxFQUFFLFNBQVM7YUFDaEI7U0FDRixDQUFDO0lBRXFELENBQUM7SUFFeEQsV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLElBQUcsT0FBTyxDQUFDLGVBQWUsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQyxZQUFZLEVBQUM7WUFDbkUsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUM1RSxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQzVCO0lBRUgsQ0FBQztJQUVELGlCQUFpQixDQUFDLEtBQWEsRUFBRSxRQUFrQjtRQUNqRCxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDbEUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO1FBQzlDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLENBQUMsZUFBZSxDQUFDLHFCQUFxQixDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQVksRUFBRSxFQUFFO1lBQ3BFLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDekIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsV0FBVyxDQUFDLE1BQWM7UUFDeEIsTUFBTSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQSxZQUFZLENBQUMsT0FBTyxDQUFDO1FBQy9DLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUMsQ0FBQztRQUM5RCxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksTUFBTSxDQUFDLENBQUM7UUFDeEUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO0lBQ2hELENBQUM7K0dBbERVLGlCQUFpQjttR0FBakIsaUJBQWlCLGdMQ1o5QiwrVEFTSTs7NEZER1MsaUJBQWlCO2tCQU43QixTQUFTOytCQUNFLG9CQUFvQixtQkFHYix1QkFBdUIsQ0FBQyxNQUFNO3NHQUl0QyxhQUFhO3NCQUFyQixLQUFLO2dCQUNJLGlCQUFpQjtzQkFBMUIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbIi8vIEFuZ3VsYXIgaW1wb3J0IHN0YXRlbWVudHNcclxuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25DaGFuZ2VzLCBPdXRwdXQsIFNpbXBsZUNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgU29ydE9wdGlvbiwgU29ydFR5cGUsIFNvcnRUeXBlRW51bSB9IGZyb20gJy4uLy4uLy4uL2FubmEtY29yZS1zaGFyZWQtbGliL21vZGVscy9hbm5hLXNvcnQubW9kZWwnO1xyXG5pbXBvcnQgeyBBbm5hU29ydFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9hbm5hLWNvcmUtc2hhcmVkLWxpYi9zZXJ2aWNlcy9hbm5hLXNvcnQuc2VydmljZSc7XHJcblxyXG4vL0FkZCBvbkNoYW5nZSBwdXNoIGNoYW5nZSBkZXRlY3Rpb25cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdhbm5hLWNvcmUtc29ydC1saWInLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9hbm5hLXNvcnQuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2FubmEtc29ydC5jb21wb25lbnQuc2NzcyddLFxyXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBbm5hU29ydENvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlc3tcclxuICBcclxuICBASW5wdXQoKSBzb3J0T2JqZWN0S2V5OiBzdHJpbmc7XHJcbiAgQE91dHB1dCgpIHNvcnRPcHRpb25DbGlja2VkID0gbmV3IEV2ZW50RW1pdHRlcjxTb3J0VHlwZT4oKTtcclxuXHJcbiAgc29ydE9wdGlvbnM6IFNvcnRPcHRpb25bXSA9IFtcclxuICAgIHtcclxuICAgICAgc29ydFR5cGU6IFNvcnRUeXBlRW51bS5BU0MsXHJcbiAgICAgIGlzT3B0aW9uQWN0aXZlOiBmYWxzZSxcclxuICAgICAgdGV4dDogJ0EgdG8gWicsXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBzb3J0VHlwZTogU29ydFR5cGVFbnVtLkRFU0MsXHJcbiAgICAgIGlzT3B0aW9uQWN0aXZlOiBmYWxzZSxcclxuICAgICAgdGV4dDogJ1ogdG8gQScsXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBzb3J0VHlwZTogU29ydFR5cGVFbnVtLkRFRkFVTFQsXHJcbiAgICAgIGlzT3B0aW9uQWN0aXZlOiBmYWxzZSxcclxuICAgICAgdGV4dDogJ0RlZmF1bHQnLFxyXG4gICAgfSxcclxuICBdO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGFubmFTb3J0U2VydmljZTogQW5uYVNvcnRTZXJ2aWNlKSB7fVxyXG4gIFxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgIGlmKGNoYW5nZXNbXCJzb3J0T2JqZWN0S2V5XCJdICYmIGNoYW5nZXNbXCJzb3J0T2JqZWN0S2V5XCJdLmN1cnJlbnRWYWx1ZSl7XHJcbiAgICAgIGxldCBzb3J0VHlwZSA9IHRoaXMuYW5uYVNvcnRTZXJ2aWNlLmNvbHVtblNvcnRTdGF0ZS5nZXQodGhpcy5zb3J0T2JqZWN0S2V5KTtcclxuICAgICAgdGhpcy5zZXRTb3J0VHlwZShzb3J0VHlwZSk7XHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcbiAgc29ydE9wdGlvbkNoYW5nZWQoaW5kZXg6IG51bWJlciwgc29ydFR5cGU6IFNvcnRUeXBlKSB7XHJcbiAgICB0aGlzLnNvcnRPcHRpb25zLmZvckVhY2goKGl0ZW0pID0+IChpdGVtLmlzT3B0aW9uQWN0aXZlID0gZmFsc2UpKTtcclxuICAgIHRoaXMuc29ydE9wdGlvbnNbaW5kZXhdLmlzT3B0aW9uQWN0aXZlID0gdHJ1ZTtcclxuICAgIHRoaXMuc29ydE9wdGlvbkNsaWNrZWQuZW1pdChzb3J0VHlwZSk7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuYW5uYVNvcnRTZXJ2aWNlLnVwZGF0ZVNvcnRUeXBlU3ViamVjdC5zdWJzY3JpYmUoKGl0ZW06IHN0cmluZykgPT4ge1xyXG4gICAgICB0aGlzLnNldFNvcnRUeXBlKGl0ZW0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBzZXRTb3J0VHlwZShvcHRpb246IHN0cmluZyl7XHJcbiAgICBvcHRpb24gPSBvcHRpb24gPyBvcHRpb24gOlNvcnRUeXBlRW51bS5ERUZBVUxUO1xyXG4gICAgdGhpcy5zb3J0T3B0aW9ucy5mb3JFYWNoKGl0ZW0gPT4gaXRlbS5pc09wdGlvbkFjdGl2ZSA9IGZhbHNlKTtcclxuICAgIGxldCBpbmRleCA9IHRoaXMuc29ydE9wdGlvbnMuZmluZEluZGV4KGl0ZW0gPT4gaXRlbS5zb3J0VHlwZSA9PSBvcHRpb24pO1xyXG4gICAgdGhpcy5zb3J0T3B0aW9uc1tpbmRleF0uaXNPcHRpb25BY3RpdmUgPSB0cnVlO1xyXG4gIH1cclxufVxyXG4iLCI8cCBjbGFzcz1cInNvcnQtY29udGFpbmVyXCI+XHJcbiAgICA8YnV0dG9uXHJcbiAgICAgICAgY2xhc3M9XCJzb3J0LWJ0blwiXHJcbiAgICAgICAgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBzb3J0T3B0aW9uczsgbGV0IGkgPSBpbmRleFwiXHJcbiAgICAgICAgKGNsaWNrKT1cInNvcnRPcHRpb25DaGFuZ2VkKGksIG9wdGlvbi5zb3J0VHlwZSlcIlxyXG4gICAgICAgIFtuZ0NsYXNzXT1cInsgYWN0aXZlOiBvcHRpb24uaXNPcHRpb25BY3RpdmUgfVwiXHJcbiAgICA+XHJcbiAgICAgICAge3tvcHRpb24udGV4dH19XHJcbiAgICA8L2J1dHRvbj5cclxuPC9wPiJdfQ==
1
+ // Angular import statements
2
+ import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core';
3
+ import { SortTypeEnum } from '../../../anna-core-shared-lib/models/anna-sort.model';
4
+ import { AnnaSortService } from '../../../anna-core-shared-lib/services/anna-sort.service';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "../../../anna-core-shared-lib/services/anna-sort.service";
7
+ import * as i2 from "@angular/common";
8
+ //Add onChange push change detection
9
+ export class AnnaSortComponent {
10
+ constructor(annaSortService) {
11
+ this.annaSortService = annaSortService;
12
+ this.sortOptionClicked = new EventEmitter();
13
+ this.sortOptions = [
14
+ {
15
+ sortType: SortTypeEnum.ASC,
16
+ isOptionActive: false,
17
+ text: 'A to Z',
18
+ },
19
+ {
20
+ sortType: SortTypeEnum.DESC,
21
+ isOptionActive: false,
22
+ text: 'Z to A',
23
+ },
24
+ {
25
+ sortType: SortTypeEnum.DEFAULT,
26
+ isOptionActive: false,
27
+ text: 'Default',
28
+ },
29
+ ];
30
+ }
31
+ ngOnChanges(changes) {
32
+ if (changes["sortObjectKey"] && changes["sortObjectKey"].currentValue) {
33
+ let sortType = this.annaSortService.columnSortState.get(this.sortObjectKey);
34
+ this.setSortType(sortType);
35
+ }
36
+ }
37
+ sortOptionChanged(index, sortType) {
38
+ this.sortOptions.forEach((item) => (item.isOptionActive = false));
39
+ this.sortOptions[index].isOptionActive = true;
40
+ this.sortOptionClicked.emit(sortType);
41
+ }
42
+ ngOnInit() {
43
+ this.annaSortService.updateSortTypeSubject.subscribe((item) => {
44
+ this.setSortType(item);
45
+ });
46
+ }
47
+ setSortType(option) {
48
+ option = option ? option : SortTypeEnum.DEFAULT;
49
+ this.sortOptions.forEach(item => item.isOptionActive = false);
50
+ let index = this.sortOptions.findIndex(item => item.sortType == option);
51
+ this.sortOptions[index].isOptionActive = true;
52
+ }
53
+ }
54
+ AnnaSortComponentfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: AnnaSortComponent, deps: [{ token: i1.AnnaSortService }], target: i0.ɵɵFactoryTarget.Component });
55
+ AnnaSortComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: AnnaSortComponent, selector: "anna-core-sort-lib", inputs: { sortObjectKey: "sortObjectKey" }, outputs: { sortOptionClicked: "sortOptionClicked" }, usesOnChanges: true, ngImport: i0, template: "<p class=\"sort-container\">\r\n <button\r\n class=\"sort-btn\"\r\n *ngFor=\"let option of sortOptions; let i = index\"\r\n (click)=\"sortOptionChanged(i, option.sortType)\"\r\n [ngClass]=\"{ active: option.isOptionActive }\"\r\n >\r\n {{option.text}}\r\n </button>\r\n</p>", styles: [".sort-btn{background:white;border:none;border-right:1px solid #1b88ff;text-decoration:underline;font-family:Roboto;font-size:14px;font-weight:400;font-stretch:normal;font-style:normal;line-height:1.07;letter-spacing:normal;color:#1b88ff;cursor:pointer;flex:1;text-align:center}.sort-btn:last-of-type{border-right:none}.sort-btn.active{color:#202b47;text-decoration:none}p.sort-container{margin-top:8px;padding-bottom:8px;border-bottom:1px solid #e6e6e6;margin-bottom:0;display:flex}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
56
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: AnnaSortComponent, decorators: [{
57
+ type: Component,
58
+ args: [{ selector: 'anna-core-sort-lib', changeDetection: ChangeDetectionStrategy.OnPush, template: "<p class=\"sort-container\">\r\n <button\r\n class=\"sort-btn\"\r\n *ngFor=\"let option of sortOptions; let i = index\"\r\n (click)=\"sortOptionChanged(i, option.sortType)\"\r\n [ngClass]=\"{ active: option.isOptionActive }\"\r\n >\r\n {{option.text}}\r\n </button>\r\n</p>", styles: [".sort-btn{background:white;border:none;border-right:1px solid #1b88ff;text-decoration:underline;font-family:Roboto;font-size:14px;font-weight:400;font-stretch:normal;font-style:normal;line-height:1.07;letter-spacing:normal;color:#1b88ff;cursor:pointer;flex:1;text-align:center}.sort-btn:last-of-type{border-right:none}.sort-btn.active{color:#202b47;text-decoration:none}p.sort-container{margin-top:8px;padding-bottom:8px;border-bottom:1px solid #e6e6e6;margin-bottom:0;display:flex}\n"] }]
59
+ }], ctorParameters: function () { return [{ type: i1.AnnaSortService }]; }, propDecorators: { sortObjectKey: [{
60
+ type: Input
61
+ }], sortOptionClicked: [{
62
+ type: Output
63
+ }] } });
64
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5uYS1zb3J0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FubmEtY29yZS9zcmMvbGliL2FubmEtZ2VuZXJpYy10YWJsZS1saWIvY29tcG9uZW50cy9hbm5hLXNvcnQvYW5uYS1zb3J0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FubmEtY29yZS9zcmMvbGliL2FubmEtZ2VuZXJpYy10YWJsZS1saWIvY29tcG9uZW50cy9hbm5hLXNvcnQvYW5uYS1zb3J0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDRCQUE0QjtBQUM1QixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQWEsTUFBTSxFQUFpQixNQUFNLGVBQWUsQ0FBQztBQUMxSCxPQUFPLEVBQXdCLFlBQVksRUFBRSxNQUFNLHNEQUFzRCxDQUFDO0FBQzFHLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwwREFBMEQsQ0FBQzs7OztBQUUzRixvQ0FBb0M7QUFPcEMsTUFBTSxPQUFPLGlCQUFpQjtJQXVCNUIsWUFBb0IsZUFBZ0M7UUFBaEMsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBcEIxQyxzQkFBaUIsR0FBRyxJQUFJLFlBQVksRUFBWSxDQUFDO1FBRTNELGdCQUFXLEdBQWlCO1lBQzFCO2dCQUNFLFFBQVEsRUFBRSxZQUFZLENBQUMsR0FBRztnQkFDMUIsY0FBYyxFQUFFLEtBQUs7Z0JBQ3JCLElBQUksRUFBRSxRQUFRO2FBQ2Y7WUFDRDtnQkFDRSxRQUFRLEVBQUUsWUFBWSxDQUFDLElBQUk7Z0JBQzNCLGNBQWMsRUFBRSxLQUFLO2dCQUNyQixJQUFJLEVBQUUsUUFBUTthQUNmO1lBQ0Q7Z0JBQ0UsUUFBUSxFQUFFLFlBQVksQ0FBQyxPQUFPO2dCQUM5QixjQUFjLEVBQUUsS0FBSztnQkFDckIsSUFBSSxFQUFFLFNBQVM7YUFDaEI7U0FDRixDQUFDO0lBRXFELENBQUM7SUFFeEQsV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLElBQUcsT0FBTyxDQUFDLGVBQWUsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQyxZQUFZLEVBQUM7WUFDbkUsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUM1RSxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQzVCO0lBRUgsQ0FBQztJQUVELGlCQUFpQixDQUFDLEtBQWEsRUFBRSxRQUFrQjtRQUNqRCxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDbEUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO1FBQzlDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLENBQUMsZUFBZSxDQUFDLHFCQUFxQixDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQVksRUFBRSxFQUFFO1lBQ3BFLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDekIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsV0FBVyxDQUFDLE1BQWM7UUFDeEIsTUFBTSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQSxZQUFZLENBQUMsT0FBTyxDQUFDO1FBQy9DLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUMsQ0FBQztRQUM5RCxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksTUFBTSxDQUFDLENBQUM7UUFDeEUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO0lBQ2hELENBQUM7OzhHQWxEVSxpQkFBaUI7a0dBQWpCLGlCQUFpQixnTENaOUIsK1RBU0k7MkZER1MsaUJBQWlCO2tCQU43QixTQUFTOytCQUNFLG9CQUFvQixtQkFHYix1QkFBdUIsQ0FBQyxNQUFNO3NHQUl0QyxhQUFhO3NCQUFyQixLQUFLO2dCQUNJLGlCQUFpQjtzQkFBMUIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbIi8vIEFuZ3VsYXIgaW1wb3J0IHN0YXRlbWVudHNcclxuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25DaGFuZ2VzLCBPdXRwdXQsIFNpbXBsZUNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgU29ydE9wdGlvbiwgU29ydFR5cGUsIFNvcnRUeXBlRW51bSB9IGZyb20gJy4uLy4uLy4uL2FubmEtY29yZS1zaGFyZWQtbGliL21vZGVscy9hbm5hLXNvcnQubW9kZWwnO1xyXG5pbXBvcnQgeyBBbm5hU29ydFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9hbm5hLWNvcmUtc2hhcmVkLWxpYi9zZXJ2aWNlcy9hbm5hLXNvcnQuc2VydmljZSc7XHJcblxyXG4vL0FkZCBvbkNoYW5nZSBwdXNoIGNoYW5nZSBkZXRlY3Rpb25cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdhbm5hLWNvcmUtc29ydC1saWInLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9hbm5hLXNvcnQuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2FubmEtc29ydC5jb21wb25lbnQuc2NzcyddLFxyXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBbm5hU29ydENvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlc3tcclxuICBcclxuICBASW5wdXQoKSBzb3J0T2JqZWN0S2V5OiBzdHJpbmc7XHJcbiAgQE91dHB1dCgpIHNvcnRPcHRpb25DbGlja2VkID0gbmV3IEV2ZW50RW1pdHRlcjxTb3J0VHlwZT4oKTtcclxuXHJcbiAgc29ydE9wdGlvbnM6IFNvcnRPcHRpb25bXSA9IFtcclxuICAgIHtcclxuICAgICAgc29ydFR5cGU6IFNvcnRUeXBlRW51bS5BU0MsXHJcbiAgICAgIGlzT3B0aW9uQWN0aXZlOiBmYWxzZSxcclxuICAgICAgdGV4dDogJ0EgdG8gWicsXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBzb3J0VHlwZTogU29ydFR5cGVFbnVtLkRFU0MsXHJcbiAgICAgIGlzT3B0aW9uQWN0aXZlOiBmYWxzZSxcclxuICAgICAgdGV4dDogJ1ogdG8gQScsXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBzb3J0VHlwZTogU29ydFR5cGVFbnVtLkRFRkFVTFQsXHJcbiAgICAgIGlzT3B0aW9uQWN0aXZlOiBmYWxzZSxcclxuICAgICAgdGV4dDogJ0RlZmF1bHQnLFxyXG4gICAgfSxcclxuICBdO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGFubmFTb3J0U2VydmljZTogQW5uYVNvcnRTZXJ2aWNlKSB7fVxyXG4gIFxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgIGlmKGNoYW5nZXNbXCJzb3J0T2JqZWN0S2V5XCJdICYmIGNoYW5nZXNbXCJzb3J0T2JqZWN0S2V5XCJdLmN1cnJlbnRWYWx1ZSl7XHJcbiAgICAgIGxldCBzb3J0VHlwZSA9IHRoaXMuYW5uYVNvcnRTZXJ2aWNlLmNvbHVtblNvcnRTdGF0ZS5nZXQodGhpcy5zb3J0T2JqZWN0S2V5KTtcclxuICAgICAgdGhpcy5zZXRTb3J0VHlwZShzb3J0VHlwZSk7XHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcbiAgc29ydE9wdGlvbkNoYW5nZWQoaW5kZXg6IG51bWJlciwgc29ydFR5cGU6IFNvcnRUeXBlKSB7XHJcbiAgICB0aGlzLnNvcnRPcHRpb25zLmZvckVhY2goKGl0ZW0pID0+IChpdGVtLmlzT3B0aW9uQWN0aXZlID0gZmFsc2UpKTtcclxuICAgIHRoaXMuc29ydE9wdGlvbnNbaW5kZXhdLmlzT3B0aW9uQWN0aXZlID0gdHJ1ZTtcclxuICAgIHRoaXMuc29ydE9wdGlvbkNsaWNrZWQuZW1pdChzb3J0VHlwZSk7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuYW5uYVNvcnRTZXJ2aWNlLnVwZGF0ZVNvcnRUeXBlU3ViamVjdC5zdWJzY3JpYmUoKGl0ZW06IHN0cmluZykgPT4ge1xyXG4gICAgICB0aGlzLnNldFNvcnRUeXBlKGl0ZW0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBzZXRTb3J0VHlwZShvcHRpb246IHN0cmluZyl7XHJcbiAgICBvcHRpb24gPSBvcHRpb24gPyBvcHRpb24gOlNvcnRUeXBlRW51bS5ERUZBVUxUO1xyXG4gICAgdGhpcy5zb3J0T3B0aW9ucy5mb3JFYWNoKGl0ZW0gPT4gaXRlbS5pc09wdGlvbkFjdGl2ZSA9IGZhbHNlKTtcclxuICAgIGxldCBpbmRleCA9IHRoaXMuc29ydE9wdGlvbnMuZmluZEluZGV4KGl0ZW0gPT4gaXRlbS5zb3J0VHlwZSA9PSBvcHRpb24pO1xyXG4gICAgdGhpcy5zb3J0T3B0aW9uc1tpbmRleF0uaXNPcHRpb25BY3RpdmUgPSB0cnVlO1xyXG4gIH1cclxufVxyXG4iLCI8cCBjbGFzcz1cInNvcnQtY29udGFpbmVyXCI+XHJcbiAgICA8YnV0dG9uXHJcbiAgICAgICAgY2xhc3M9XCJzb3J0LWJ0blwiXHJcbiAgICAgICAgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBzb3J0T3B0aW9uczsgbGV0IGkgPSBpbmRleFwiXHJcbiAgICAgICAgKGNsaWNrKT1cInNvcnRPcHRpb25DaGFuZ2VkKGksIG9wdGlvbi5zb3J0VHlwZSlcIlxyXG4gICAgICAgIFtuZ0NsYXNzXT1cInsgYWN0aXZlOiBvcHRpb24uaXNPcHRpb25BY3RpdmUgfVwiXHJcbiAgICA+XHJcbiAgICAgICAge3tvcHRpb24udGV4dH19XHJcbiAgICA8L2J1dHRvbj5cclxuPC9wPiJdfQ==
@@ -0,0 +1,357 @@
1
+ /**
2
+ * @license
3
+ * Copyright Google LLC All Rights Reserved.
4
+ *
5
+ * Use of this source code is governed by an MIT-style license that can be
6
+ * found in the LICENSE file at https://angular.io/license
7
+ */
8
+ import { Directionality } from "@angular/cdk/bidi";
9
+ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, Inject, Input, NgZone, Optional, Output, ViewChild, ViewEncapsulation } from "@angular/core";
10
+ import { animationFrameScheduler, asapScheduler, Observable, Subject, Subscription } from "rxjs";
11
+ import { auditTime, startWith, takeUntil } from "rxjs/operators";
12
+ import { CdkVirtualScrollViewport, CdkScrollable, VIRTUAL_SCROLL_STRATEGY, ScrollDispatcher, ViewportRuler } from "@angular/cdk/scrolling";
13
+ import { AnnaGtHelperService } from '../../../anna-core-shared-lib/services/anna-generic-table.service';
14
+ import * as i0 from "@angular/core";
15
+ import * as i1 from "@angular/cdk/bidi";
16
+ import * as i2 from "@angular/cdk/scrolling";
17
+ import * as i3 from "../../../anna-core-shared-lib/services/anna-generic-table.service";
18
+ /** Checks if the given ranges are equal. */
19
+ function rangesEqual(r1, r2) {
20
+ return r1.start == r2.start && r1.end == r2.end;
21
+ }
22
+ /**
23
+ * Scheduler to be used for scroll events. Needs to fall back to
24
+ * something that doesn't rely on requestAnimationFrame on environments
25
+ * that don't support it (e.g. server-side rendering).
26
+ */
27
+ const SCROLL_SCHEDULER = typeof requestAnimationFrame !== "undefined"
28
+ ? animationFrameScheduler
29
+ : asapScheduler;
30
+ /**
31
+ * A viewport that virtualizes its scrolling with the help of `CdkVirtualForOf`.
32
+ * Uses `top: #px` instead of `transform: translateY(#px)` like the cdk virtual scroll viewport does
33
+ * which avoids flickering of elements in the transformed container with `position: sticky`.
34
+ */
35
+ export class AnnaTableVirtualScrollViewportComponent extends CdkScrollable {
36
+ constructor(elementRef, _changeDetectorRef, ngZone, _scrollStrategy, dir, scrollDispatcher, viewportRuler, annaGtService) {
37
+ super(elementRef, scrollDispatcher, ngZone, dir);
38
+ this.elementRef = elementRef;
39
+ this._changeDetectorRef = _changeDetectorRef;
40
+ this._scrollStrategy = _scrollStrategy;
41
+ this.annaGtService = annaGtService;
42
+ /** Emits when the viewport is detached from a CdkVirtualForOf. */
43
+ this._detachedSubject = new Subject();
44
+ /** Emits when the rendered range changes. */
45
+ this._renderedRangeSubject = new Subject();
46
+ this._orientation = "vertical";
47
+ // Note: we don't use the typical EventEmitter here because we need to subscribe to the scroll
48
+ // strategy lazily (i.e. only if the user is actually listening to the events). We do this because
49
+ // depending on how the strategy calculates the scrolled index, it may come at a cost to
50
+ // performance.
51
+ /** Emits when the index of the first element visible in the viewport changes. */
52
+ this.scrolledIndexChange = new Observable((observer) => this._scrollStrategy.scrolledIndexChange.subscribe(index => Promise.resolve().then(() => this.ngZone.run(() => observer.next(index)))));
53
+ /** A stream that emits whenever the rendered range changes. */
54
+ this.renderedRangeStream = this._renderedRangeSubject;
55
+ /**
56
+ * The total size of all content (in pixels), including content that is not currently rendered.
57
+ */
58
+ this._totalContentSize = 0;
59
+ /** A string representing the `style.width` property value to be used for the spacer element. */
60
+ this._totalContentWidth = "";
61
+ /** A string representing the `style.height` property value to be used for the spacer element. */
62
+ this._totalContentHeight = "";
63
+ /** The currently rendered range of indices. */
64
+ this._renderedRange = { start: 0, end: 0 };
65
+ /** The length of the data bound to this viewport (in number of items). */
66
+ this._dataLength = 0;
67
+ /** The size of the viewport (in pixels). */
68
+ this._viewportSize = 0;
69
+ /** The last rendered content offset that was set. */
70
+ this._renderedContentOffset = 0;
71
+ /**
72
+ * Whether the last rendered content offset was to the end of the content (and therefore needs to
73
+ * be rewritten as an offset to the start of the content).
74
+ */
75
+ this._renderedContentOffsetNeedsRewrite = false;
76
+ /** Whether there is a pending change detection cycle. */
77
+ this._isChangeDetectionPending = false;
78
+ /** A list of functions to run after the next change detection cycle. */
79
+ this._runAfterChangeDetection = [];
80
+ /** Subscription to changes in the viewport size. */
81
+ this._viewportChanges = Subscription.EMPTY;
82
+ if (!_scrollStrategy) {
83
+ throw Error('Error: cdk-virtual-scroll-viewport requires the "itemSize" property to be set.');
84
+ }
85
+ this._viewportChanges = viewportRuler.change().subscribe(() => {
86
+ this.checkViewportSize();
87
+ });
88
+ }
89
+ /** The direction the viewport scrolls. */
90
+ get orientation() {
91
+ return this._orientation;
92
+ }
93
+ set orientation(orientation) {
94
+ if (this._orientation !== orientation) {
95
+ this._orientation = orientation;
96
+ this._calculateSpacerSize();
97
+ }
98
+ }
99
+ ngOnInit() {
100
+ super.ngOnInit();
101
+ // It's still too early to measure the viewport at this point. Deferring with a promise allows
102
+ // the Viewport to be rendered with the correct size before we measure. We run this outside the
103
+ // zone to avoid causing more change detection cycles. We handle the change detection loop
104
+ // ourselves instead.
105
+ this.ngZone.runOutsideAngular(() => Promise.resolve().then(() => {
106
+ this._measureViewportSize();
107
+ this._scrollStrategy.attach(this);
108
+ this.elementScrolled()
109
+ .pipe(
110
+ // Start off with a fake scroll event so we properly detect our initial position.
111
+ startWith(null),
112
+ // Collect multiple events into one until the next animation frame. This way if
113
+ // there are multiple scroll events in the same frame we only need to recheck
114
+ // our layout once.
115
+ auditTime(0, SCROLL_SCHEDULER))
116
+ .subscribe(() => { this._scrollStrategy.onContentScrolled(); this.annaGtService.virtualScrollSubject.next(true); });
117
+ this._markChangeDetectionNeeded();
118
+ }));
119
+ }
120
+ ngOnDestroy() {
121
+ this.detach();
122
+ this._scrollStrategy.detach();
123
+ // Complete all subjects
124
+ this._renderedRangeSubject.complete();
125
+ this._detachedSubject.complete();
126
+ this._viewportChanges.unsubscribe();
127
+ super.ngOnDestroy();
128
+ }
129
+ /** Attaches a `CdkVirtualScrollRepeater` to this viewport. */
130
+ attach(forOf) {
131
+ if (this._forOf) {
132
+ throw Error("CdkVirtualScrollViewport is already attached.");
133
+ }
134
+ // Subscribe to the data stream of the CdkVirtualForOf to keep track of when the data length
135
+ // changes. Run outside the zone to avoid triggering change detection, since we're managing the
136
+ // change detection loop ourselves.
137
+ this.ngZone.runOutsideAngular(() => {
138
+ this._forOf = forOf;
139
+ this._forOf.dataStream
140
+ .pipe(takeUntil(this._detachedSubject))
141
+ .subscribe(data => {
142
+ const newLength = data.length;
143
+ if (newLength !== this._dataLength) {
144
+ this._dataLength = newLength;
145
+ this._scrollStrategy.onDataLengthChanged();
146
+ }
147
+ this._doChangeDetection();
148
+ });
149
+ });
150
+ }
151
+ /** Detaches the current `CdkVirtualForOf`. */
152
+ detach() {
153
+ this._forOf = null;
154
+ this._detachedSubject.next();
155
+ }
156
+ /** Gets the length of the data bound to this viewport (in number of items). */
157
+ getDataLength() {
158
+ return this._dataLength;
159
+ }
160
+ /** Gets the size of the viewport (in pixels). */
161
+ getViewportSize() {
162
+ return this._viewportSize;
163
+ }
164
+ // TODO(mmalerba): This is technically out of sync with what's really rendered until a render
165
+ // cycle happens. I'm being careful to only call it after the render cycle is complete and before
166
+ // setting it to something else, but its error prone and should probably be split into
167
+ // `pendingRange` and `renderedRange`, the latter reflecting whats actually in the DOM.
168
+ /** Get the current rendered range of items. */
169
+ getRenderedRange() {
170
+ return this._renderedRange;
171
+ }
172
+ /**
173
+ * Sets the total size of all content (in pixels), including content that is not currently
174
+ * rendered.
175
+ */
176
+ setTotalContentSize(size) {
177
+ if (this._totalContentSize !== size) {
178
+ this._totalContentSize = size;
179
+ this._calculateSpacerSize();
180
+ this._markChangeDetectionNeeded();
181
+ }
182
+ }
183
+ /** Sets the currently rendered range of indices. */
184
+ setRenderedRange(range) {
185
+ if (!rangesEqual(this._renderedRange, range)) {
186
+ this._renderedRangeSubject.next((this._renderedRange = range));
187
+ this._markChangeDetectionNeeded(() => this._scrollStrategy.onContentRendered());
188
+ }
189
+ }
190
+ /**
191
+ * Gets the offset from the start of the viewport to the start of the rendered data (in pixels).
192
+ */
193
+ getOffsetToRenderedContentStart() {
194
+ return this._renderedContentOffsetNeedsRewrite
195
+ ? null
196
+ : this._renderedContentOffset;
197
+ }
198
+ /**
199
+ * Sets the offset from the start of the viewport to either the start or end of the rendered data
200
+ * (in pixels).
201
+ */
202
+ setRenderedContentOffset(offset) {
203
+ let top = `${Number(offset)}px`;
204
+ this._renderedContentOffset = offset;
205
+ if (this._renderedContentTransform != top) {
206
+ // We know this value is safe because we parse `offset` with `Number()` before passing it
207
+ // into the string.
208
+ this._renderedContentTransform = top;
209
+ this._markChangeDetectionNeeded(() => {
210
+ if (this._renderedContentOffsetNeedsRewrite) {
211
+ this._renderedContentOffset -= this.measureRenderedContentSize();
212
+ this._renderedContentOffsetNeedsRewrite = false;
213
+ this.setRenderedContentOffset(this._renderedContentOffset);
214
+ }
215
+ else {
216
+ this._scrollStrategy.onRenderedOffsetChanged();
217
+ }
218
+ });
219
+ }
220
+ }
221
+ /**
222
+ * Scrolls to the given offset from the start of the viewport. Please note that this is not always
223
+ * the same as setting `scrollTop` or `scrollLeft`. In a horizontal viewport with right-to-left
224
+ * direction, this would be the equivalent of setting a fictional `scrollRight` property.
225
+ * @param offset The offset to scroll to.
226
+ * @param behavior The ScrollBehavior to use when scrolling. Default is behavior is `auto`.
227
+ */
228
+ scrollToOffset(offset, behavior = "auto") {
229
+ const options = { behavior, top: offset };
230
+ this.scrollTo(options);
231
+ }
232
+ /**
233
+ * Scrolls to the offset for the given index.
234
+ * @param index The index of the element to scroll to.
235
+ * @param behavior The ScrollBehavior to use when scrolling. Default is behavior is `auto`.
236
+ */
237
+ scrollToIndex(index, behavior = "auto") {
238
+ this._scrollStrategy.scrollToIndex(index, behavior);
239
+ }
240
+ /**
241
+ * Gets the current scroll offset from the start of the viewport (in pixels).
242
+ * @param from The edge to measure the offset from. Defaults to 'top' in vertical mode and 'start'
243
+ * in horizontal mode.
244
+ */
245
+ // CHANGES@ANNALIB added override to functions
246
+ measureScrollOffset(from) {
247
+ return from
248
+ ? super.measureScrollOffset(from)
249
+ : super.measureScrollOffset("top");
250
+ }
251
+ /** Measure the combined size of all of the rendered items. */
252
+ measureRenderedContentSize() {
253
+ const contentEl = this._contentWrapper.nativeElement;
254
+ return contentEl.offsetHeight;
255
+ }
256
+ /**
257
+ * Measure the total combined size of the given range. Throws if the range includes items that are
258
+ * not rendered.
259
+ */
260
+ measureRangeSize(range) {
261
+ if (!this._forOf) {
262
+ return 0;
263
+ }
264
+ return this._forOf.measureRangeSize(range, this.orientation);
265
+ }
266
+ /** Update the viewport dimensions and re-render. */
267
+ checkViewportSize() {
268
+ // TODO: Cleanup later when add logic for handling content resize
269
+ this._measureViewportSize();
270
+ this._scrollStrategy.onDataLengthChanged();
271
+ }
272
+ /** Measure the viewport size. */
273
+ _measureViewportSize() {
274
+ const viewportEl = this.elementRef.nativeElement;
275
+ this._viewportSize = viewportEl.clientHeight;
276
+ }
277
+ /** Queue up change detection to run. */
278
+ _markChangeDetectionNeeded(runAfter) {
279
+ if (runAfter) {
280
+ this._runAfterChangeDetection.push(runAfter);
281
+ }
282
+ // Use a Promise to batch together calls to `_doChangeDetection`. This way if we set a bunch of
283
+ // properties sequentially we only have to run `_doChangeDetection` once at the end.
284
+ if (!this._isChangeDetectionPending) {
285
+ this._isChangeDetectionPending = true;
286
+ this.ngZone.runOutsideAngular(() => Promise.resolve().then(() => {
287
+ this._doChangeDetection();
288
+ }));
289
+ }
290
+ }
291
+ /** Run change detection. */
292
+ _doChangeDetection() {
293
+ this._isChangeDetectionPending = false;
294
+ // Apply the content transform. The transform can't be set via an Angular binding because
295
+ // bypassSecurityTrustStyle is banned in Google. However the value is safe, it's composed of
296
+ // string literals, a variable that can only be 'X' or 'Y', and user input that is run through
297
+ // the `Number` function first to coerce it to a numeric value.
298
+ this._contentWrapper.nativeElement.style.top = this._renderedContentTransform;
299
+ // Apply changes to Angular bindings. Note: We must call `markForCheck` to run change detection
300
+ // from the root, since the repeated items are content projected in. Calling `detectChanges`
301
+ // instead does not properly check the projected content.
302
+ this.ngZone.run(() => this._changeDetectorRef.markForCheck());
303
+ const runAfterChangeDetection = this._runAfterChangeDetection;
304
+ this._runAfterChangeDetection = [];
305
+ for (const fn of runAfterChangeDetection) {
306
+ fn();
307
+ }
308
+ }
309
+ /** Calculates the `style.width` and `style.height` for the spacer element. */
310
+ _calculateSpacerSize() {
311
+ this._totalContentHeight = `${this._totalContentSize}px`;
312
+ this._totalContentWidth = "";
313
+ }
314
+ }
315
+ AnnaTableVirtualScrollViewportComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: AnnaTableVirtualScrollViewportComponent, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i0.NgZone }, { token: VIRTUAL_SCROLL_STRATEGY, optional: true }, { token: i1.Directionality, optional: true }, { token: i2.ScrollDispatcher }, { token: i2.ViewportRuler }, { token: i3.AnnaGtHelperService }], target: i0.ɵɵFactoryTarget.Component });
316
+ AnnaTableVirtualScrollViewportComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: AnnaTableVirtualScrollViewportComponent, selector: "anna-table-virtual-scroll-viewport", inputs: { orientation: "orientation" }, outputs: { scrolledIndexChange: "scrolledIndexChange" }, host: { properties: { "class.anna-table-virtual-scroll-orientation-horizontal": "orientation === \"horizontal\"", "class.anna-table-virtual-scroll-orientation-vertical": "orientation !== \"horizontal\"" }, classAttribute: "anna-table-virtual-scroll-viewport" }, providers: [
317
+ {
318
+ provide: CdkScrollable,
319
+ useExisting: AnnaTableVirtualScrollViewportComponent
320
+ },
321
+ {
322
+ provide: CdkVirtualScrollViewport,
323
+ useExisting: AnnaTableVirtualScrollViewportComponent
324
+ }
325
+ ], viewQueries: [{ propertyName: "_contentWrapper", first: true, predicate: ["contentWrapper"], descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<!--\r\n Wrap the rendered content in an element that will be used to offset it based on the scroll\r\n position.\r\n-->\r\n<div #contentWrapper class=\"anna-table-virtual-scroll-content-wrapper\">\r\n\t<ng-content></ng-content>\r\n</div>\r\n<!--\r\n Spacer used to force the scrolling container to the correct size for the *total* number of items\r\n so that the scrollbar captures the size of the entire data set.\r\n-->\r\n<div class=\"app-table-virtual-scroll-spacer\" [style.width]=\"_totalContentWidth\" [style.height]=\"_totalContentHeight\">\r\n</div>", styles: ["anna-table-virtual-scroll-viewport{display:block;position:relative;overflow:auto;contain:strict;will-change:scroll-position;-webkit-overflow-scrolling:touch}.anna-table-virtual-scroll-content-wrapper{position:absolute;top:0;left:0;contain:content}[dir=rtl] .anna-table-virtual-scroll-content-wrapper{right:0;left:auto}.app-table-virtual-scroll-orientation-horizontal .anna-table-virtual-scroll-content-wrapper{min-height:100%}.app-table-virtual-scroll-orientation-horizontal .anna-table-virtual-scroll-content-wrapper>dl:not([cdkVirtualFor]),.app-table-virtual-scroll-orientation-horizontal .anna-table-virtual-scroll-content-wrapper>ol:not([cdkVirtualFor]),.app-table-virtual-scroll-orientation-horizontal .anna-table-virtual-scroll-content-wrapper>table:not([cdkVirtualFor]),.app-table-virtual-scroll-orientation-horizontal .anna-table-virtual-scroll-content-wrapper>ul:not([cdkVirtualFor]){padding-left:0;padding-right:0;margin-left:0;margin-right:0;border-left-width:0;border-right-width:0;outline:none}.app-table-virtual-scroll-orientation-vertical .anna-table-virtual-scroll-content-wrapper{min-width:100%}.app-table-virtual-scroll-orientation-vertical .anna-table-virtual-scroll-content-wrapper>dl:not([cdkVirtualFor]),.app-table-virtual-scroll-orientation-vertical .anna-table-virtual-scroll-content-wrapper>ol:not([cdkVirtualFor]),.app-table-virtual-scroll-orientation-vertical .anna-table-virtual-scroll-content-wrapper>table:not([cdkVirtualFor]),.app-table-virtual-scroll-orientation-vertical .anna-table-virtual-scroll-content-wrapper>ul:not([cdkVirtualFor]){padding-top:0;padding-bottom:0;margin-top:0;margin-bottom:0;border-top-width:0;border-bottom-width:0;outline:none}.app-table-virtual-scroll-spacer{position:absolute;top:0;left:0;height:1px;width:1px;transform-origin:0 0}[dir=rtl] .app-table-virtual-scroll-spacer{right:0;left:auto;transform-origin:100% 0}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
326
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: AnnaTableVirtualScrollViewportComponent, decorators: [{
327
+ type: Component,
328
+ args: [{ selector: "anna-table-virtual-scroll-viewport", host: {
329
+ class: "anna-table-virtual-scroll-viewport",
330
+ "[class.anna-table-virtual-scroll-orientation-horizontal]": 'orientation === "horizontal"',
331
+ "[class.anna-table-virtual-scroll-orientation-vertical]": 'orientation !== "horizontal"'
332
+ }, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, providers: [
333
+ {
334
+ provide: CdkScrollable,
335
+ useExisting: AnnaTableVirtualScrollViewportComponent
336
+ },
337
+ {
338
+ provide: CdkVirtualScrollViewport,
339
+ useExisting: AnnaTableVirtualScrollViewportComponent
340
+ }
341
+ ], template: "<!--\r\n Wrap the rendered content in an element that will be used to offset it based on the scroll\r\n position.\r\n-->\r\n<div #contentWrapper class=\"anna-table-virtual-scroll-content-wrapper\">\r\n\t<ng-content></ng-content>\r\n</div>\r\n<!--\r\n Spacer used to force the scrolling container to the correct size for the *total* number of items\r\n so that the scrollbar captures the size of the entire data set.\r\n-->\r\n<div class=\"app-table-virtual-scroll-spacer\" [style.width]=\"_totalContentWidth\" [style.height]=\"_totalContentHeight\">\r\n</div>", styles: ["anna-table-virtual-scroll-viewport{display:block;position:relative;overflow:auto;contain:strict;will-change:scroll-position;-webkit-overflow-scrolling:touch}.anna-table-virtual-scroll-content-wrapper{position:absolute;top:0;left:0;contain:content}[dir=rtl] .anna-table-virtual-scroll-content-wrapper{right:0;left:auto}.app-table-virtual-scroll-orientation-horizontal .anna-table-virtual-scroll-content-wrapper{min-height:100%}.app-table-virtual-scroll-orientation-horizontal .anna-table-virtual-scroll-content-wrapper>dl:not([cdkVirtualFor]),.app-table-virtual-scroll-orientation-horizontal .anna-table-virtual-scroll-content-wrapper>ol:not([cdkVirtualFor]),.app-table-virtual-scroll-orientation-horizontal .anna-table-virtual-scroll-content-wrapper>table:not([cdkVirtualFor]),.app-table-virtual-scroll-orientation-horizontal .anna-table-virtual-scroll-content-wrapper>ul:not([cdkVirtualFor]){padding-left:0;padding-right:0;margin-left:0;margin-right:0;border-left-width:0;border-right-width:0;outline:none}.app-table-virtual-scroll-orientation-vertical .anna-table-virtual-scroll-content-wrapper{min-width:100%}.app-table-virtual-scroll-orientation-vertical .anna-table-virtual-scroll-content-wrapper>dl:not([cdkVirtualFor]),.app-table-virtual-scroll-orientation-vertical .anna-table-virtual-scroll-content-wrapper>ol:not([cdkVirtualFor]),.app-table-virtual-scroll-orientation-vertical .anna-table-virtual-scroll-content-wrapper>table:not([cdkVirtualFor]),.app-table-virtual-scroll-orientation-vertical .anna-table-virtual-scroll-content-wrapper>ul:not([cdkVirtualFor]){padding-top:0;padding-bottom:0;margin-top:0;margin-bottom:0;border-top-width:0;border-bottom-width:0;outline:none}.app-table-virtual-scroll-spacer{position:absolute;top:0;left:0;height:1px;width:1px;transform-origin:0 0}[dir=rtl] .app-table-virtual-scroll-spacer{right:0;left:auto;transform-origin:100% 0}\n"] }]
342
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: i0.NgZone }, { type: undefined, decorators: [{
343
+ type: Optional
344
+ }, {
345
+ type: Inject,
346
+ args: [VIRTUAL_SCROLL_STRATEGY]
347
+ }] }, { type: i1.Directionality, decorators: [{
348
+ type: Optional
349
+ }] }, { type: i2.ScrollDispatcher }, { type: i2.ViewportRuler }, { type: i3.AnnaGtHelperService }]; }, propDecorators: { orientation: [{
350
+ type: Input
351
+ }], scrolledIndexChange: [{
352
+ type: Output
353
+ }], _contentWrapper: [{
354
+ type: ViewChild,
355
+ args: ["contentWrapper", { static: true }]
356
+ }] } });
357
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5uYS10YWJsZS12aXJ0dWFsLXNjcm9sbC12aWV3cG9ydC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbm5hLWNvcmUvc3JjL2xpYi9hbm5hLWdlbmVyaWMtdGFibGUtbGliL2NvbXBvbmVudHMvYW5uYS10YWJsZS12aXJ0dWFsLXNjcm9sbC12aWV3cG9ydC9hbm5hLXRhYmxlLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FubmEtY29yZS9zcmMvbGliL2FubmEtZ2VuZXJpYy10YWJsZS1saWIvY29tcG9uZW50cy9hbm5hLXRhYmxlLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0L2FubmEtdGFibGUtdmlydHVhbC1zY3JvbGwtdmlld3BvcnQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBRUYsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRW5ELE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsTUFBTSxFQUNOLEtBQUssRUFDTCxNQUFNLEVBR04sUUFBUSxFQUNSLE1BQU0sRUFDTixTQUFTLEVBQ1QsaUJBQWlCLEVBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsYUFBYSxFQUNiLFVBQVUsRUFDVixPQUFPLEVBRVAsWUFBWSxFQUNiLE1BQU0sTUFBTSxDQUFDO0FBQ2QsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDakUsT0FBTyxFQUNMLHdCQUF3QixFQUN4QixhQUFhLEVBRWIsdUJBQXVCLEVBRXZCLGdCQUFnQixFQUNoQixhQUFhLEVBRWQsTUFBTSx3QkFBd0IsQ0FB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QUNUO1lBQ0UsT0FBTyxFQUFFLGFBQWE7WUFDdEIsV0FBVyxFQUFFLHVDQUF1QztTQUNyRDtRQUNEO1lBQ0UsT0FBTyxFQUFFLHdCQUF3QjtZQUNqQyxXQUFXLEVBQUUsdUNBQXVDO1NBQ3JEO0tBQ0Ysa0xDeEZKLHFqQkFZTTsyRkQ4RVEsdUNBQXVDO2tCQXhCbkQsU0FBUzsrQkFDRSxvQ0FBb0MsUUFHeEM7d0JBQ0osS0FBSyxFQUFFLG9DQUFvQzt3QkFDM0MsMERBQTBELEVBQ3hELDhCQUE4Qjt3QkFDaEMsd0RBQXdELEVBQ3RELDhCQUE4QjtxQkFDakMsaUJBQ2MsaUJBQWlCLENBQUMsSUFBSSxtQkFDcEIsdUJBQXVCLENBQUMsTUFBTSxhQUNwQzt3QkFDVDs0QkFDRSxPQUFPLEVBQUUsYUFBYTs0QkFDdEIsV0FBVyx5Q0FBeUM7eUJBQ3JEO3dCQUNEOzRCQUNFLE9BQU8sRUFBRSx3QkFBd0I7NEJBQ2pDLFdBQVcseUNBQXlDO3lCQUNyRDtxQkFDRjs7MEJBZ0dFLFFBQVE7OzBCQUNSLE1BQU07MkJBQUMsdUJBQXVCOzswQkFFOUIsUUFBUTt5SUF2RlAsV0FBVztzQkFEZCxLQUFLO2dCQWlCSSxtQkFBbUI7c0JBQTVCLE1BQU07Z0JBVXdDLGVBQWU7c0JBQTdELFNBQVM7dUJBQUMsZ0JBQWdCLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXHJcbiAqXHJcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXHJcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcclxuICovXHJcblxyXG4gaW1wb3J0IHsgRGlyZWN0aW9uYWxpdHkgfSBmcm9tIFwiQGFuZ3VsYXIvY2RrL2JpZGlcIjtcclxuIGltcG9ydCB7IExpc3RSYW5nZSB9IGZyb20gXCJAYW5ndWxhci9jZGsvY29sbGVjdGlvbnNcIjtcclxuIGltcG9ydCB7XHJcbiAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxyXG4gICBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgQ29tcG9uZW50LFxyXG4gICBFbGVtZW50UmVmLFxyXG4gICBJbmplY3QsXHJcbiAgIElucHV0LFxyXG4gICBOZ1pvbmUsXHJcbiAgIE9uRGVzdHJveSxcclxuICAgT25Jbml0LFxyXG4gICBPcHRpb25hbCxcclxuICAgT3V0cHV0LFxyXG4gICBWaWV3Q2hpbGQsXHJcbiAgIFZpZXdFbmNhcHN1bGF0aW9uXHJcbiB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbiBpbXBvcnQge1xyXG4gICBhbmltYXRpb25GcmFtZVNjaGVkdWxlcixcclxuICAgYXNhcFNjaGVkdWxlcixcclxuICAgT2JzZXJ2YWJsZSxcclxuICAgU3ViamVjdCxcclxuICAgT2JzZXJ2ZXIsXHJcbiAgIFN1YnNjcmlwdGlvblxyXG4gfSBmcm9tIFwicnhqc1wiO1xyXG4gaW1wb3J0IHsgYXVkaXRUaW1lLCBzdGFydFdpdGgsIHRha2VVbnRpbCB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xyXG4gaW1wb3J0IHtcclxuICAgQ2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0LFxyXG4gICBDZGtTY3JvbGxhYmxlLFxyXG4gICBDZGtWaXJ0dWFsU2Nyb2xsUmVwZWF0ZXIsXHJcbiAgIFZJUlRVQUxfU0NST0xMX1NUUkFURUdZLFxyXG4gICBWaXJ0dWFsU2Nyb2xsU3RyYXRlZ3ksXHJcbiAgIFNjcm9sbERpc3BhdGNoZXIsXHJcbiAgIFZpZXdwb3J0UnVsZXIsXHJcbiAgIEV4dGVuZGVkU2Nyb2xsVG9PcHRpb25zXHJcbiB9IGZyb20gXCJAYW5ndWxhci9jZGsvc2Nyb2xsaW5nXCI7XHJcbmltcG9ydCB7IEFubmFHdEhlbHBlclNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9hbm5hLWNvcmUtc2hhcmVkLWxpYi9zZXJ2aWNlcy9hbm5hLWdlbmVyaWMtdGFibGUuc2VydmljZSc7XHJcbiBcclxuIC8qKiBDaGVja3MgaWYgdGhlIGdpdmVuIHJhbmdlcyBhcmUgZXF1YWwuICovXHJcbiBmdW5jdGlvbiByYW5nZXNFcXVhbChyMTogTGlzdFJhbmdlLCByMjogTGlzdFJhbmdlKTogYm9vbGVhbiB7XHJcbiAgIHJldHVybiByMS5zdGFydCA9PSByMi5zdGFydCAmJiByMS5lbmQgPT0gcjIuZW5kO1xyXG4gfVxyXG4gXHJcbiAvKipcclxuICAqIFNjaGVkdWxlciB0byBiZSB1c2VkIGZvciBzY3JvbGwgZXZlbnRzLiBOZWVkcyB0byBmYWxsIGJhY2sgdG9cclxuICAqIHNvbWV0aGluZyB0aGF0IGRvZXNuJ3QgcmVseSBvbiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgb24gZW52aXJvbm1lbnRzXHJcbiAgKiB0aGF0IGRvbid0IHN1cHBvcnQgaXQgKGUuZy4gc2VydmVyLXNpZGUgcmVuZGVyaW5nKS5cclxuICAqL1xyXG4gY29uc3QgU0NST0xMX1NDSEVEVUxFUiA9XHJcbiAgIHR5cGVvZiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgIT09IFwidW5kZWZpbmVkXCJcclxuICAgICA/IGFuaW1hdGlvbkZyYW1lU2NoZWR1bGVyXHJcbiAgICAgOiBhc2FwU2NoZWR1bGVyO1xyXG4gXHJcbiAvKipcclxuICAqIEEgdmlld3BvcnQgdGhhdCB2aXJ0dWFsaXplcyBpdHMgc2Nyb2xsaW5nIHdpdGggdGhlIGhlbHAgb2YgYENka1ZpcnR1YWxGb3JPZmAuXHJcbiAgKiBVc2VzIGB0b3A6ICNweGAgaW5zdGVhZCBvZiBgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKCNweClgIGxpa2UgdGhlIGNkayB2aXJ0dWFsIHNjcm9sbCB2aWV3cG9ydCBkb2VzXHJcbiAgKiB3aGljaCBhdm9pZHMgZmxpY2tlcmluZyBvZiBlbGVtZW50cyBpbiB0aGUgdHJhbnNmb3JtZWQgY29udGFpbmVyIHdpdGggYHBvc2l0aW9uOiBzdGlja3lgLlxyXG4gICovXHJcbiBAQ29tcG9uZW50KHtcclxuICAgc2VsZWN0b3I6IFwiYW5uYS10YWJsZS12aXJ0dWFsLXNjcm9sbC12aWV3cG9ydFwiLFxyXG4gICB0ZW1wbGF0ZVVybDogXCJhbm5hLXRhYmxlLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0LmNvbXBvbmVudC5odG1sXCIsXHJcbiAgIHN0eWxlVXJsczogW1wiYW5uYS10YWJsZS12aXJ0dWFsLXNjcm9sbC12aWV3cG9ydC5jb21wb25lbnQuc2Nzc1wiXSxcclxuICAgaG9zdDoge1xyXG4gICAgIGNsYXNzOiBcImFubmEtdGFibGUtdmlydHVhbC1zY3JvbGwtdmlld3BvcnRcIixcclxuICAgICBcIltjbGFzcy5hbm5hLXRhYmxlLXZpcnR1YWwtc2Nyb2xsLW9yaWVudGF0aW9uLWhvcml6b250YWxdXCI6XHJcbiAgICAgICAnb3JpZW50YXRpb24gPT09IFwiaG9yaXpvbnRhbFwiJyxcclxuICAgICBcIltjbGFzcy5hbm5hLXRhYmxlLXZpcnR1YWwtc2Nyb2xsLW9yaWVudGF0aW9uLXZlcnRpY2FsXVwiOlxyXG4gICAgICAgJ29yaWVudGF0aW9uICE9PSBcImhvcml6b250YWxcIidcclxuICAgfSxcclxuICAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcclxuICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXHJcbiAgIHByb3ZpZGVyczogW1xyXG4gICAgIHtcclxuICAgICAgIHByb3ZpZGU6IENka1Njcm9sbGFibGUsXHJcbiAgICAgICB1c2VFeGlzdGluZzogQW5uYVRhYmxlVmlydHVhbFNjcm9sbFZpZXdwb3J0Q29tcG9uZW50XHJcbiAgICAgfSxcclxuICAgICB7XHJcbiAgICAgICBwcm92aWRlOiBDZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQsXHJcbiAgICAgICB1c2VFeGlzdGluZzogQW5uYVRhYmxlVmlydHVhbFNjcm9sbFZpZXdwb3J0Q29tcG9uZW50XHJcbiAgICAgfVxyXG4gICBdXHJcbiB9KVxyXG4gZXhwb3J0IGNsYXNzIEFubmFUYWJsZVZpcnR1YWxTY3JvbGxWaWV3cG9ydENvbXBvbmVudCBleHRlbmRzIENka1Njcm9sbGFibGVcclxuICAgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcbiAgIC8qKiBFbWl0cyB3aGVuIHRoZSB2aWV3cG9ydCBpcyBkZXRhY2hlZCBmcm9tIGEgQ2RrVmlydHVhbEZvck9mLiAqL1xyXG4gICBwcml2YXRlIF9kZXRhY2hlZFN1YmplY3QgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG4gXHJcbiAgIC8qKiBFbWl0cyB3aGVuIHRoZSByZW5kZXJlZCByYW5nZSBjaGFuZ2VzLiAqL1xyXG4gICBwcml2YXRlIF9yZW5kZXJlZFJhbmdlU3ViamVjdCA9IG5ldyBTdWJqZWN0PExpc3RSYW5nZT4oKTtcclxuIFxyXG4gICAvKiogVGhlIGRpcmVjdGlvbiB0aGUgdmlld3BvcnQgc2Nyb2xscy4gKi9cclxuICAgQElucHV0KClcclxuICAgZ2V0IG9yaWVudGF0aW9uKCkge1xyXG4gICAgIHJldHVybiB0aGlzLl9vcmllbnRhdGlvbjtcclxuICAgfVxyXG4gICBzZXQgb3JpZW50YXRpb24ob3JpZW50YXRpb246IFwiaG9yaXpvbnRhbFwiIHwgXCJ2ZXJ0aWNhbFwiKSB7XHJcbiAgICAgaWYgKHRoaXMuX29yaWVudGF0aW9uICE9PSBvcmllbnRhdGlvbikge1xyXG4gICAgICAgdGhpcy5fb3JpZW50YXRpb24gPSBvcmllbnRhdGlvbjtcclxuICAgICAgIHRoaXMuX2NhbGN1bGF0ZVNwYWNlclNpemUoKTtcclxuICAgICB9XHJcbiAgIH1cclxuICAgcHJpdmF0ZSBfb3JpZW50YXRpb246IFwiaG9yaXpvbnRhbFwiIHwgXCJ2ZXJ0aWNhbFwiID0gXCJ2ZXJ0aWNhbFwiO1xyXG4gXHJcbiAgIC8vIE5vdGU6IHdlIGRvbid0IHVzZSB0aGUgdHlwaWNhbCBFdmVudEVtaXR0ZXIgaGVyZSBiZWNhdXNlIHdlIG5lZWQgdG8gc3Vic2NyaWJlIHRvIHRoZSBzY3JvbGxcclxuICAgLy8gc3RyYXRlZ3kgbGF6aWx5IChpLmUuIG9ubHkgaWYgdGhlIHVzZXIgaXMgYWN0dWFsbHkgbGlzdGVuaW5nIHRvIHRoZSBldmVudHMpLiBXZSBkbyB0aGlzIGJlY2F1c2VcclxuICAgLy8gZGVwZW5kaW5nIG9uIGhvdyB0aGUgc3RyYXRlZ3kgY2FsY3VsYXRlcyB0aGUgc2Nyb2xsZWQgaW5kZXgsIGl0IG1heSBjb21lIGF0IGEgY29zdCB0b1xyXG4gICAvLyBwZXJmb3JtYW5jZS5cclxuICAgLyoqIEVtaXRzIHdoZW4gdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBlbGVtZW50IHZpc2libGUgaW4gdGhlIHZpZXdwb3J0IGNoYW5nZXMuICovXHJcbiAgIEBPdXRwdXQoKSBzY3JvbGxlZEluZGV4Q2hhbmdlOiBPYnNlcnZhYmxlPG51bWJlcj4gPSBuZXcgT2JzZXJ2YWJsZShcclxuICAgICAob2JzZXJ2ZXI6IE9ic2VydmVyPG51bWJlcj4pID0+XHJcbiAgICAgICB0aGlzLl9zY3JvbGxTdHJhdGVneS5zY3JvbGxlZEluZGV4Q2hhbmdlLnN1YnNjcmliZShpbmRleCA9PlxyXG4gICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+XHJcbiAgICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IG9ic2VydmVyLm5leHQoaW5kZXgpKVxyXG4gICAgICAgICApXHJcbiAgICAgICApXHJcbiAgICk7XHJcbiBcclxuICAgLyoqIFRoZSBlbGVtZW50IHRoYXQgd3JhcHMgdGhlIHJlbmRlcmVkIGNvbnRlbnQuICovXHJcbiAgIEBWaWV3Q2hpbGQoXCJjb250ZW50V3JhcHBlclwiLCB7IHN0YXRpYzogdHJ1ZSB9KSBfY29udGVudFdyYXBwZXI6IEVsZW1lbnRSZWY8XHJcbiAgICAgSFRNTEVsZW1lbnRcclxuICAgPjtcclxuIFxyXG4gICAvKiogQSBzdHJlYW0gdGhhdCBlbWl0cyB3aGVuZXZlciB0aGUgcmVuZGVyZWQgcmFuZ2UgY2hhbmdlcy4gKi9cclxuICAgcmVuZGVyZWRSYW5nZVN0cmVhbTogT2JzZXJ2YWJsZTxMaXN0UmFuZ2U+ID0gdGhpcy5fcmVuZGVyZWRSYW5nZVN1YmplY3Q7XHJcbiBcclxuICAgLyoqXHJcbiAgICAqIFRoZSB0b3RhbCBzaXplIG9mIGFsbCBjb250ZW50IChpbiBwaXhlbHMpLCBpbmNsdWRpbmcgY29udGVudCB0aGF0IGlzIG5vdCBjdXJyZW50bHkgcmVuZGVyZWQuXHJcbiAgICAqL1xyXG4gICBwcml2YXRlIF90b3RhbENvbnRlbnRTaXplID0gMDtcclxuIFxyXG4gICAvKiogQSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBgc3R5bGUud2lkdGhgIHByb3BlcnR5IHZhbHVlIHRvIGJlIHVzZWQgZm9yIHRoZSBzcGFjZXIgZWxlbWVudC4gKi9cclxuICAgX3RvdGFsQ29udGVudFdpZHRoID0gXCJcIjtcclxuIFxyXG4gICAvKiogQSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBgc3R5bGUuaGVpZ2h0YCBwcm9wZXJ0eSB2YWx1ZSB0byBiZSB1c2VkIGZvciB0aGUgc3BhY2VyIGVsZW1lbnQuICovXHJcbiAgIF90b3RhbENvbnRlbnRIZWlnaHQgPSBcIlwiO1xyXG4gXHJcbiAgIC8qKlxyXG4gICAgKiBUaGUgQ1NTIHRyYW5zZm9ybSBhcHBsaWVkIHRvIHRoZSByZW5kZXJlZCBzdWJzZXQgb2YgaXRlbXMgc28gdGhhdCB0aGV5IGFwcGVhciB3aXRoaW4gdGhlIGJvdW5kc1xyXG4gICAgKiBvZiB0aGUgdmlzaWJsZSB2aWV3cG9ydC5cclxuICAgICovXHJcbiAgIHByaXZhdGUgX3JlbmRlcmVkQ29udGVudFRyYW5zZm9ybTogc3RyaW5nO1xyXG4gXHJcbiAgIC8qKiBUaGUgY3VycmVudGx5IHJlbmRlcmVkIHJhbmdlIG9mIGluZGljZXMuICovXHJcbiAgIHByaXZhdGUgX3JlbmRlcmVkUmFuZ2U6IExpc3RSYW5nZSA9IHsgc3RhcnQ6IDAsIGVuZDogMCB9O1xyXG4gXHJcbiAgIC8qKiBUaGUgbGVuZ3RoIG9mIHRoZSBkYXRhIGJvdW5kIHRvIHRoaXMgdmlld3BvcnQgKGluIG51bWJlciBvZiBpdGVtcykuICovXHJcbiAgIHByaXZhdGUgX2RhdGFMZW5ndGggPSAwO1xyXG4gXHJcbiAgIC8qKiBUaGUgc2l6ZSBvZiB0aGUgdmlld3BvcnQgKGluIHBpeGVscykuICovXHJcbiAgIHByaXZhdGUgX3ZpZXdwb3J0U2l6ZSA9IDA7XHJcbiBcclxuICAgLyoqIHRoZSBjdXJyZW50bHkgYXR0YWNoZWQgQ2RrVmlydHVhbFNjcm9sbFJlcGVhdGVyLiAqL1xyXG4gICBwcml2YXRlIF9mb3JPZjogQ2RrVmlydHVhbFNjcm9sbFJlcGVhdGVyPGFueT4gfCBudWxsO1xyXG4gXHJcbiAgIC8qKiBUaGUgbGFzdCByZW5kZXJlZCBjb250ZW50IG9mZnNldCB0aGF0IHdhcyBzZXQuICovXHJcbiAgIHByaXZhdGUgX3JlbmRlcmVkQ29udGVudE9mZnNldCA9IDA7XHJcbiBcclxuICAgLyoqXHJcbiAgICAqIFdoZXRoZXIgdGhlIGxhc3QgcmVuZGVyZWQgY29udGVudCBvZmZzZXQgd2FzIHRvIHRoZSBlbmQgb2YgdGhlIGNvbnRlbnQgKGFuZCB0aGVyZWZvcmUgbmVlZHMgdG9cclxuICAgICogYmUgcmV3cml0dGVuIGFzIGFuIG9mZnNldCB0byB0aGUgc3RhcnQgb2YgdGhlIGNvbnRlbnQpLlxyXG4gICAgKi9cclxuICAgcHJpdmF0ZSBfcmVuZGVyZWRDb250ZW50T2Zmc2V0TmVlZHNSZXdyaXRlID0gZmFsc2U7XHJcbiBcclxuICAgLyoqIFdoZXRoZXIgdGhlcmUgaXMgYSBwZW5kaW5nIGNoYW5nZSBkZXRlY3Rpb24gY3ljbGUuICovXHJcbiAgIHByaXZhdGUgX2lzQ2hhbmdlRGV0ZWN0aW9uUGVuZGluZyA9IGZhbHNlO1xyXG4gXHJcbiAgIC8qKiBBIGxpc3Qgb2YgZnVuY3Rpb25zIHRvIHJ1biBhZnRlciB0aGUgbmV4dCBjaGFuZ2UgZGV0ZWN0aW9uIGN5Y2xlLiAqL1xyXG4gICBwcml2YXRlIF9ydW5BZnRlckNoYW5nZURldGVjdGlvbjogRnVuY3Rpb25bXSA9IFtdO1xyXG4gXHJcbiAgIC8qKiBTdWJzY3JpcHRpb24gdG8gY2hhbmdlcyBpbiB0aGUgdmlld3BvcnQgc2l6ZS4gKi9cclxuICAgcHJpdmF0ZSBfdmlld3BvcnRDaGFuZ2VzID0gU3Vic2NyaXB0aW9uLkVNUFRZO1xyXG4gXHJcbiAgIGNvbnN0cnVjdG9yKFxyXG4gICAgIHB1YmxpYyBvdmVycmlkZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PixcclxuICAgICBwcml2YXRlIF9jaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICAgbmdab25lOiBOZ1pvbmUsXHJcbiAgICAgQE9wdGlvbmFsKClcclxuICAgICBASW5qZWN0KFZJUlRVQUxfU0NST0xMX1NUUkFURUdZKVxyXG4gICAgIHByaXZhdGUgX3Njcm9sbFN0cmF0ZWd5OiBWaXJ0dWFsU2Nyb2xsU3RyYXRlZ3ksXHJcbiAgICAgQE9wdGlvbmFsKCkgZGlyOiBEaXJlY3Rpb25hbGl0eSxcclxuICAgICBzY3JvbGxEaXNwYXRjaGVyOiBTY3JvbGxEaXNwYXRjaGVyLFxyXG4gICAgIHZpZXdwb3J0UnVsZXI6IFZpZXdwb3J0UnVsZXIsXHJcbiAgICAgcHJpdmF0ZSBhbm5hR3RTZXJ2aWNlOiBBbm5hR3RIZWxwZXJTZXJ2aWNlXHJcbiAgICkge1xyXG4gICAgIHN1cGVyKGVsZW1lbnRSZWYsIHNjcm9sbERpc3BhdGNoZXIsIG5nWm9uZSwgZGlyKTtcclxuIFxyXG4gICAgIGlmICghX3Njcm9sbFN0cmF0ZWd5KSB7XHJcbiAgICAgICB0aHJvdyBFcnJvcihcclxuICAgICAgICAgJ0Vycm9yOiBjZGstdmlydHVhbC1zY3JvbGwtdmlld3BvcnQgcmVxdWlyZXMgdGhlIFwiaXRlbVNpemVcIiBwcm9wZXJ0eSB0byBiZSBzZXQuJ1xyXG4gICAgICAgKTtcclxuICAgICB9XHJcbiBcclxuICAgICB0aGlzLl92aWV3cG9ydENoYW5nZXMgPSB2aWV3cG9ydFJ1bGVyLmNoYW5nZSgpLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICB0aGlzLmNoZWNrVmlld3BvcnRTaXplKCk7XHJcbiAgICAgfSk7XHJcbiAgIH1cclxuIFxyXG4gICBvdmVycmlkZSBuZ09uSW5pdCgpIHtcclxuICAgICBzdXBlci5uZ09uSW5pdCgpO1xyXG4gXHJcbiAgICAgLy8gSXQncyBzdGlsbCB0b28gZWFybHkgdG8gbWVhc3VyZSB0aGUgdmlld3BvcnQgYXQgdGhpcyBwb2ludC4gRGVmZXJyaW5nIHdpdGggYSBwcm9taXNlIGFsbG93c1xyXG4gICAgIC8vIHRoZSBWaWV3cG9ydCB0byBiZSByZW5kZXJlZCB3aXRoIHRoZSBjb3JyZWN0IHNpemUgYmVmb3JlIHdlIG1lYXN1cmUuIFdlIHJ1biB0aGlzIG91dHNpZGUgdGhlXHJcbiAgICAgLy8gem9uZSB0byBhdm9pZCBjYXVzaW5nIG1vcmUgY2hhbmdlIGRldGVjdGlvbiBjeWNsZXMuIFdlIGhhbmRsZSB0aGUgY2hhbmdlIGRldGVjdGlvbiBsb29wXHJcbiAgICAgLy8gb3Vyc2VsdmVzIGluc3RlYWQuXHJcbiAgICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT5cclxuICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICB0aGlzLl9tZWFzdXJlVmlld3BvcnRTaXplKCk7XHJcbiAgICAgICAgIHRoaXMuX3Njcm9sbFN0cmF0ZWd5LmF0dGFjaCh0aGlzIGFzIGFueSk7XHJcbiBcclxuICAgICAgICAgdGhpcy5lbGVtZW50U2Nyb2xsZWQoKVxyXG4gICAgICAgICAgIC5waXBlKFxyXG4gICAgICAgICAgICAgLy8gU3RhcnQgb2ZmIHdpdGggYSBmYWtlIHNjcm9sbCBldmVudCBzbyB3ZSBwcm9wZXJseSBkZXRlY3Qgb3VyIGluaXRpYWwgcG9zaXRpb24uXHJcbiAgICAgICAgICAgICBzdGFydFdpdGgobnVsbCksXHJcbiAgICAgICAgICAgICAvLyBDb2xsZWN0IG11bHRpcGxlIGV2ZW50cyBpbnRvIG9uZSB1bnRpbCB0aGUgbmV4dCBhbmltYXRpb24gZnJhbWUuIFRoaXMgd2F5IGlmXHJcbiAgICAgICAgICAgICAvLyB0aGVyZSBhcmUgbXVsdGlwbGUgc2Nyb2xsIGV2ZW50cyBpbiB0aGUgc2FtZSBmcmFtZSB3ZSBvbmx5IG5lZWQgdG8gcmVjaGVja1xyXG4gICAgICAgICAgICAgLy8gb3VyIGxheW91dCBvbmNlLlxyXG4gICAgICAgICAgICAgYXVkaXRUaW1lKDAsIFNDUk9MTF9TQ0hFRFVMRVIpXHJcbiAgICAgICAgICAgKVxyXG4gICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4geyB0aGlzLl9zY3JvbGxTdHJhdGVneS5vbkNvbnRlbnRTY3JvbGxlZCgpOyB0aGlzLmFubmFHdFNlcnZpY2UudmlydHVhbFNjcm9sbFN1YmplY3QubmV4dCh0cnVlKTt9KTtcclxuIFxyXG4gICAgICAgICB0aGlzLl9tYXJrQ2hhbmdlRGV0ZWN0aW9uTmVlZGVkKCk7XHJcbiAgICAgICB9KVxyXG4gICAgICk7XHJcbiAgIH1cclxuIFxyXG4gICBvdmVycmlkZSBuZ09uRGVzdHJveSgpIHtcclxuICAgICB0aGlzLmRldGFjaCgpO1xyXG4gICAgIHRoaXMuX3Njcm9sbFN0cmF0ZWd5LmRldGFjaCgpO1xyXG4gXHJcbiAgICAgLy8gQ29tcGxldGUgYWxsIHN1YmplY3RzXHJcbiAgICAgdGhpcy5fcmVuZGVyZWRSYW5nZVN1YmplY3QuY29tcGxldGUoKTtcclxuICAgICB0aGlzLl9kZXRhY2hlZFN1YmplY3QuY29tcGxldGUoKTtcclxuICAgICB0aGlzLl92aWV3cG9ydENoYW5nZXMudW5zdWJzY3JpYmUoKTtcclxuIFxyXG4gICAgIHN1cGVyLm5nT25EZXN0cm95KCk7XHJcbiAgIH1cclxuIFxyXG4gICAvKiogQXR0YWNoZXMgYSBgQ2RrVmlydHVhbFNjcm9sbFJlcGVhdGVyYCB0byB0aGlzIHZpZXdwb3J0LiAqL1xyXG4gICBhdHRhY2goZm9yT2Y6IENka1ZpcnR1YWxTY3JvbGxSZXBlYXRlcjxhbnk+KSB7XHJcbiAgICAgaWYgKHRoaXMuX2Zvck9mKSB7XHJcbiAgICAgICB0aHJvdyBFcnJvcihcIkNka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydCBpcyBhbHJlYWR5IGF0dGFjaGVkLlwiKTtcclxuICAgICB9XHJcbiBcclxuICAgICAvLyBTdWJzY3JpYmUgdG8gdGhlIGRhdGEgc3RyZWFtIG9mIHRoZSBDZGtWaXJ0dWFsRm9yT2YgdG8ga2VlcCB0cmFjayBvZiB3aGVuIHRoZSBkYXRhIGxlbmd0aFxyXG4gICAgIC8vIGNoYW5nZXMuIFJ1biBvdXRzaWRlIHRoZSB6b25lIHRvIGF2b2lkIHRyaWdnZXJpbmcgY2hhbmdlIGRldGVjdGlvbiwgc2luY2Ugd2UncmUgbWFuYWdpbmcgdGhlXHJcbiAgICAgLy8gY2hhbmdlIGRldGVjdGlvbiBsb29wIG91cnNlbHZlcy5cclxuICAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XHJcbiAgICAgICB0aGlzLl9mb3JPZiA9IGZvck9mO1xyXG4gICAgICAgdGhpcy5fZm9yT2YuZGF0YVN0cmVhbVxyXG4gICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5fZGV0YWNoZWRTdWJqZWN0KSlcclxuICAgICAgICAgLnN1YnNjcmliZShkYXRhID0+IHtcclxuICAgICAgICAgICBjb25zdCBuZXdMZW5ndGggPSBkYXRhLmxlbmd0aDtcclxuICAgICAgICAgICBpZiAobmV3TGVuZ3RoICE9PSB0aGlzLl9kYXRhTGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICB0aGlzLl9kYXRhTGVuZ3RoID0gbmV3TGVuZ3RoO1xyXG4gICAgICAgICAgICAgdGhpcy5fc2Nyb2xsU3RyYXRlZ3kub25EYXRhTGVuZ3RoQ2hhbmdlZCgpO1xyXG4gICAgICAgICAgIH1cclxuICAgICAgICAgICB0aGlzLl9kb0NoYW5nZURldGVjdGlvbigpO1xyXG4gICAgICAgICB9KTtcclxuICAgICB9KTtcclxuICAgfVxyXG4gXHJcbiAgIC8qKiBEZXRhY2hlcyB0aGUgY3VycmVudCBgQ2RrVmlydHVhbEZvck9mYC4gKi9cclxuICAgZGV0YWNoKCkge1xyXG4gICAgIHRoaXMuX2Zvck9mID0gbnVsbDtcclxuICAgICB0aGlzLl9kZXRhY2hlZFN1YmplY3QubmV4dCgpO1xyXG4gICB9XHJcbiBcclxuICAgLyoqIEdldHMgdGhlIGxlbmd0aCBvZiB0aGUgZGF0YSBib3VuZCB0byB0aGlzIHZpZXdwb3J0IChpbiBudW1iZXIgb2YgaXRlbXMpLiAqL1xyXG4gICBnZXREYXRhTGVuZ3RoKCk6IG51bWJlciB7XHJcbiAgICAgcmV0dXJuIHRoaXMuX2RhdGFMZW5ndGg7XHJcbiAgIH1cclxuIFxyXG4gICAvKiogR2V0cyB0aGUgc2l6ZSBvZiB0aGUgdmlld3BvcnQgKGluIHBpeGVscykuICovXHJcbiAgIGdldFZpZXdwb3J0U2l6ZSgpOiBudW1iZXIge1xyXG4gICAgIHJldHVybiB0aGlzLl92aWV3cG9ydFNpemU7XHJcbiAgIH1cclxuIFxyXG4gICAvLyBUT0RPKG1tYWxlcmJhKTogVGhpcyBpcyB0ZWNobmljYWxseSBvdXQgb2Ygc3luYyB3aXRoIHdoYXQncyByZWFsbHkgcmVuZGVyZWQgdW50aWwgYSByZW5kZXJcclxuICAgLy8gY3ljbGUgaGFwcGVucy4gSSdtIGJlaW5nIGNhcmVmdWwgdG8gb25seSBjYWxsIGl0IGFmdGVyIHRoZSByZW5kZXIgY3ljbGUgaXMgY29tcGxldGUgYW5kIGJlZm9yZVxyXG4gICAvLyBzZXR0aW5nIGl0IHRvIHNvbWV0aGluZyBlbHNlLCBidXQgaXRzIGVycm9yIHByb25lIGFuZCBzaG91bGQgcHJvYmFibHkgYmUgc3BsaXQgaW50b1xyXG4gICAvLyBgcGVuZGluZ1JhbmdlYCBhbmQgYHJlbmRlcmVkUmFuZ2VgLCB0aGUgbGF0dGVyIHJlZmxlY3Rpbmcgd2hhdHMgYWN0dWFsbHkgaW4gdGhlIERPTS5cclxuIFxyXG4gICAvKiogR2V0IHRoZSBjdXJyZW50IHJlbmRlcmVkIHJhbmdlIG9mIGl0ZW1zLiAqL1xyXG4gICBnZXRSZW5kZXJlZFJhbmdlKCk6IExpc3RSYW5nZSB7XHJcbiAgICAgcmV0dXJuIHRoaXMuX3JlbmRlcmVkUmFuZ2U7XHJcbiAgIH1cclxuIFxyXG4gICAvKipcclxuICAgICogU2V0cyB0aGUgdG90YWwgc2l6ZSBvZiBhbGwgY29udGVudCAoaW4gcGl4ZWxzKSwgaW5jbHVkaW5nIGNvbnRlbnQgdGhhdCBpcyBub3QgY3VycmVudGx5XHJcbiAgICAqIHJlbmRlcmVkLlxyXG4gICAgKi9cclxuICAgc2V0VG90YWxDb250ZW50U2l6ZShzaXplOiBudW1iZXIpIHtcclxuICAgICBpZiAodGhpcy5fdG90YWxDb250ZW50U2l6ZSAhPT0gc2l6ZSkge1xyXG4gICAgICAgdGhpcy5fdG90YWxDb250ZW50U2l6ZSA9IHNpemU7XHJcbiAgICAgICB0aGlzLl9jYWxjdWxhdGVTcGFjZXJTaXplKCk7XHJcbiAgICAgICB0aGlzLl9tYXJrQ2hhbmdlRGV0ZWN0aW9uTmVlZGVkKCk7XHJcbiAgICAgfVxyXG4gICB9XHJcbiBcclxuICAgLyoqIFNldHMgdGhlIGN1cnJlbnRseSByZW5kZXJlZCByYW5nZSBvZiBpbmRpY2VzLiAqL1xyXG4gICBzZXRSZW5kZXJlZFJhbmdlKHJhbmdlOiBMaXN0UmFuZ2UpIHtcclxuICAgICBpZiAoIXJhbmdlc0VxdWFsKHRoaXMuX3JlbmRlcmVkUmFuZ2UsIHJhbmdlKSkge1xyXG4gICAgICAgdGhpcy5fcmVuZGVyZWRSYW5nZVN1YmplY3QubmV4dCgodGhpcy5fcmVuZGVyZWRSYW5nZSA9IHJhbmdlKSk7XHJcbiAgICAgICB0aGlzLl9tYXJrQ2hhbmdlRGV0ZWN0aW9uTmVlZGVkKCgpID0+XHJcbiAgICAgICAgIHRoaXMuX3Njcm9sbFN0cmF0ZWd5Lm9uQ29udGVudFJlbmRlcmVkKClcclxuICAgICAgICk7XHJcbiAgICAgfVxyXG4gICB9XHJcbiBcclxuICAgLyoqXHJcbiAgICAqIEdldHMgdGhlIG9mZnNldCBmcm9tIHRoZSBzdGFydCBvZiB0aGUgdmlld3BvcnQgdG8gdGhlIHN0YXJ0IG9mIHRoZSByZW5kZXJlZCBkYXRhIChpbiBwaXhlbHMpLlxyXG4gICAgKi9cclxuICAgZ2V0T2Zmc2V0VG9SZW5kZXJlZENvbnRlbnRTdGFydCgpOiBudW1iZXIgfCBudWxsIHtcclxuICAgICByZXR1cm4gdGhpcy5fcmVuZGVyZWRDb250ZW50T2Zmc2V0TmVlZHNSZXdyaXRlXHJcbiAgICAgICA/IG51bGxcclxuICAgICAgIDogdGhpcy5fcmVuZGVyZWRDb250ZW50T2Zmc2V0O1xyXG4gICB9XHJcbiBcclxuICAgLyoqXHJcbiAgICAqIFNldHMgdGhlIG9mZnNldCBmcm9tIHRoZSBzdGFydCBvZiB0aGUgdmlld3BvcnQgdG8gZWl0aGVyIHRoZSBzdGFydCBvciBlbmQgb2YgdGhlIHJlbmRlcmVkIGRhdGFcclxuICAgICogKGluIHBpeGVscykuXHJcbiAgICAqL1xyXG4gICBzZXRSZW5kZXJlZENvbnRlbnRPZmZzZXQob2Zmc2V0OiBudW1iZXIpIHtcclxuICAgICBsZXQgdG9wID0gYCR7TnVtYmVyKG9mZnNldCl9cHhgO1xyXG4gICAgIHRoaXMuX3JlbmRlcmVkQ29udGVudE9mZnNldCA9IG9mZnNldDtcclxuICAgICBpZiAodGhpcy5fcmVuZGVyZWRDb250ZW50VHJhbnNmb3JtICE9IHRvcCkge1xyXG4gICAgICAgLy8gV2Uga25vdyB0aGlzIHZhbHVlIGlzIHNhZmUgYmVjYXVzZSB3ZSBwYXJzZSBgb2Zmc2V0YCB3aXRoIGBOdW1iZXIoKWAgYmVmb3JlIHBhc3NpbmcgaXRcclxuICAgICAgIC8vIGludG8gdGhlIHN0cmluZy5cclxuICAgICAgIHRoaXMuX3JlbmRlcmVkQ29udGVudFRyYW5zZm9ybSA9IHRvcDtcclxuICAgICAgIHRoaXMuX21hcmtDaGFuZ2VEZXRlY3Rpb25OZWVkZWQoKCkgPT4ge1xyXG4gICAgICAgICBpZiAodGhpcy5fcmVuZGVyZWRDb250ZW50T2Zmc2V0TmVlZHNSZXdyaXRlKSB7XHJcbiAgICAgICAgICAgdGhpcy5fcmVuZGVyZWRDb250ZW50T2Zmc2V0IC09IHRoaXMubWVhc3VyZVJlbmRlcmVkQ29udGVudFNpemUoKTtcclxuICAgICAgICAgICB0aGlzLl9yZW5kZXJlZENvbnRlbnRPZmZzZXROZWVkc1Jld3JpdGUgPSBmYWxzZTtcclxuICAgICAgICAgICB0aGlzLnNldFJlbmRlcmVkQ29udGVudE9mZnNldCh0aGlzLl9yZW5kZXJlZENvbnRlbnRPZmZzZXQpO1xyXG4gICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgIHRoaXMuX3Njcm9sbFN0cmF0ZWd5Lm9uUmVuZGVyZWRPZmZzZXRDaGFuZ2VkKCk7XHJcbiAgICAgICAgIH1cclxuICAgICAgIH0pO1xyXG4gICAgIH1cclxuICAgfVxyXG4gXHJcbiAgIC8qKlxyXG4gICAgKiBTY3JvbGxzIHRvIHRoZSBnaXZlbiBvZmZzZXQgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIHZpZXdwb3J0LiBQbGVhc2Ugbm90ZSB0aGF0IHRoaXMgaXMgbm90IGFsd2F5c1xyXG4gICAgKiB0aGUgc2FtZSBhcyBzZXR0aW5nIGBzY3JvbGxUb3BgIG9yIGBzY3JvbGxMZWZ0YC4gSW4gYSBob3Jpem9udGFsIHZpZXdwb3J0IHdpdGggcmlnaHQtdG8tbGVmdFxyXG4gICAgKiBkaXJlY3Rpb24sIHRoaXMgd291bGQgYmUgdGhlIGVxdWl2YWxlbnQgb2Ygc2V0dGluZyBhIGZpY3Rpb25hbCBgc2Nyb2xsUmlnaHRgIHByb3BlcnR5LlxyXG4gICAgKiBAcGFyYW0gb2Zmc2V0IFRoZSBvZmZzZXQgdG8gc2Nyb2xsIHRvLlxyXG4gICAgKiBAcGFyYW0gYmVoYXZpb3IgVGhlIFNjcm9sbEJlaGF2aW9yIHRvIHVzZSB3aGVuIHNjcm9sbGluZy4gRGVmYXVsdCBpcyBiZWhhdmlvciBpcyBgYXV0b2AuXHJcbiAgICAqL1xyXG4gICBzY3JvbGxUb09mZnNldChvZmZzZXQ6IG51bWJlciwgYmVoYXZpb3I6IFNjcm9sbEJlaGF2aW9yID0gXCJhdXRvXCIpIHtcclxuICAgICBjb25zdCBvcHRpb25zOiBFeHRlbmRlZFNjcm9sbFRvT3B0aW9ucyA9IHsgYmVoYXZpb3IsIHRvcDogb2Zmc2V0IH07XHJcbiAgICAgdGhpcy5zY3JvbGxUbyhvcHRpb25zKTtcclxuICAgfVxyXG4gXHJcbiAgIC8qKlxyXG4gICAgKiBTY3JvbGxzIHRvIHRoZSBvZmZzZXQgZm9yIHRoZSBnaXZlbiBpbmRleC5cclxuICAgICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCBvZiB0aGUgZWxlbWVudCB0byBzY3JvbGwgdG8uXHJcbiAgICAqIEBwYXJhbSBiZWhhdmlvciBUaGUgU2Nyb2xsQmVoYXZpb3IgdG8gdXNlIHdoZW4gc2Nyb2xsaW5nLiBEZWZhdWx0IGlzIGJlaGF2aW9yIGlzIGBhdXRvYC5cclxuICAgICovXHJcbiAgIHNjcm9sbFRvSW5kZXgoaW5kZXg6IG51bWJlciwgYmVoYXZpb3I6IFNjcm9sbEJlaGF2aW9yID0gXCJhdXRvXCIpIHtcclxuICAgICB0aGlzLl9zY3JvbGxTdHJhdGVneS5zY3JvbGxUb0luZGV4KGluZGV4LCBiZWhhdmlvcik7XHJcbiAgIH1cclxuIFxyXG4gICAvKipcclxuICAgICogR2V0cyB0aGUgY3VycmVudCBzY3JvbGwgb2Zmc2V0IGZyb20gdGhlIHN0YXJ0IG9mIHRoZSB2aWV3cG9ydCAoaW4gcGl4ZWxzKS5cclxuICAgICogQHBhcmFtIGZyb20gVGhlIGVkZ2UgdG8gbWVhc3VyZSB0aGUgb2Zmc2V0IGZyb20uIERlZmF1bHRzIHRvICd0b3AnIGluIHZlcnRpY2FsIG1vZGUgYW5kICdzdGFydCdcclxuICAgICogICAgIGluIGhvcml6b250YWwgbW9kZS5cclxuICAgICovXHJcbiAgLy8gIENIQU5HRVNAQU5OQUxJQiBhZGRlZCBvdmVycmlkZSB0byBmdW5jdGlvbnNcclxuICAgb3ZlcnJpZGUgbWVhc3VyZVNjcm9sbE9mZnNldChcclxuICAgICBmcm9tPzogXCJ0b3BcIiB8IFwibGVmdFwiIHwgXCJyaWdodFwiIHwgXCJib3R0b21cIiB8IFwic3RhcnRcIiB8IFwiZW5kXCJcclxuICAgKTogbnVtYmVyIHtcclxuICAgICByZXR1cm4gZnJvbVxyXG4gICAgICAgPyBzdXBlci5tZWFzdXJlU2Nyb2xsT2Zmc2V0KGZyb20pXHJcbiAgICAgICA6IHN1cGVyLm1lYXN1cmVTY3JvbGxPZmZzZXQoXCJ0b3BcIik7XHJcbiAgIH1cclxuIFxyXG4gICAvKiogTWVhc3VyZSB0aGUgY29tYmluZWQgc2l6ZSBvZiBhbGwgb2YgdGhlIHJlbmRlcmVkIGl0ZW1zLiAqL1xyXG4gICBtZWFzdXJlUmVuZGVyZWRDb250ZW50U2l6ZSgpOiBudW1iZXIge1xyXG4gICAgIGNvbnN0IGNvbnRlbnRFbCA9IHRoaXMuX2NvbnRlbnRXcmFwcGVyLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICAgcmV0dXJuIGNvbnRlbnRFbC5vZmZzZXRIZWlnaHQ7XHJcbiAgIH1cclxuIFxyXG4gICAvKipcclxuICAgICogTWVhc3VyZSB0aGUgdG90YWwgY29tYmluZWQgc2l6ZSBvZiB0aGUgZ2l2ZW4gcmFuZ2UuIFRocm93cyBpZiB0aGUgcmFuZ2UgaW5jbHVkZXMgaXRlbXMgdGhhdCBhcmVcclxuICAgICogbm90IHJlbmRlcmVkLlxyXG4gICAgKi9cclxuICAgbWVhc3VyZVJhbmdlU2l6ZShyYW5nZTogTGlzdFJhbmdlKTogbnVtYmVyIHtcclxuICAgICBpZiAoIXRoaXMuX2Zvck9mKSB7XHJcbiAgICAgICByZXR1cm4gMDtcclxuICAgICB9XHJcbiAgICAgcmV0dXJuIHRoaXMuX2Zvck9mLm1lYXN1cmVSYW5nZVNpemUocmFuZ2UsIHRoaXMub3JpZW50YXRpb24pO1xyXG4gICB9XHJcbiBcclxuICAgLyoqIFVwZGF0ZSB0aGUgdmlld3BvcnQgZGltZW5zaW9ucyBhbmQgcmUtcmVuZGVyLiAqL1xyXG4gICBjaGVja1ZpZXdwb3J0U2l6ZSgpIHtcclxuICAgICAvLyBUT0RPOiBDbGVhbnVwIGxhdGVyIHdoZW4gYWRkIGxvZ2ljIGZvciBoYW5kbGluZyBjb250ZW50IHJlc2l6ZVxyXG4gICAgIHRoaXMuX21lYXN1cmVWaWV3cG9ydFNpemUoKTtcclxuICAgICB0aGlzLl9zY3JvbGxTdHJhdGVneS5vbkRhdGFMZW5ndGhDaGFuZ2VkKCk7XHJcbiAgIH1cclxuIFxyXG4gICAvKiogTWVhc3VyZSB0aGUgdmlld3BvcnQgc2l6ZS4gKi9cclxuICAgcHJpdmF0ZSBfbWVhc3VyZVZpZXdwb3J0U2l6ZSgpIHtcclxuICAgICBjb25zdCB2aWV3cG9ydEVsID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICAgdGhpcy5fdmlld3BvcnRTaXplID0gdmlld3BvcnRFbC5jbGllbnRIZWlnaHQ7XHJcbiAgIH1cclxuIFxyXG4gICAvKiogUXVldWUgdXAgY2hhbmdlIGRldGVjdGlvbiB0byBydW4uICovXHJcbiAgIHByaXZhdGUgX21hcmtDaGFuZ2VEZXRlY3Rpb25OZWVkZWQocnVuQWZ0ZXI/OiBGdW5jdGlvbikge1xyXG4gICAgIGlmIChydW5BZnRlcikge1xyXG4gICAgICAgdGhpcy5fcnVuQWZ0ZXJDaGFuZ2VEZXRlY3Rpb24ucHVzaChydW5BZnRlcik7XHJcbiAgICAgfVxyXG4gXHJcbiAgICAgLy8gVXNlIGEgUHJvbWlzZSB0byBiYXRjaCB0b2dldGhlciBjYWxscyB0byBgX2RvQ2hhbmdlRGV0ZWN0aW9uYC4gVGhpcyB3YXkgaWYgd2Ugc2V0IGEgYnVuY2ggb2ZcclxuICAgICAvLyBwcm9wZXJ0aWVzIHNlcXVlbnRpYWxseSB3ZSBvbmx5IGhhdmUgdG8gcnVuIGBfZG9DaGFuZ2VEZXRlY3Rpb25gIG9uY2UgYXQgdGhlIGVuZC5cclxuICAgICBpZiAoIXRoaXMuX2lzQ2hhbmdlRGV0ZWN0aW9uUGVuZGluZykge1xyXG4gICAgICAgdGhpcy5faXNDaGFuZ2VEZXRlY3Rpb25QZW5kaW5nID0gdHJ1ZTtcclxuICAgICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+XHJcbiAgICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgIHRoaXMuX2RvQ2hhbmdlRGV0ZWN0aW9uKCk7XHJcbiAgICAgICAgIH0pXHJcbiAgICAgICApO1xyXG4gICAgIH1cclxuICAgfVxyXG4gXHJcbiAgIC8qKiBSdW4gY2hhbmdlIGRldGVjdGlvbi4gKi9cclxuICAgcHJpdmF0ZSBfZG9DaGFuZ2VEZXRlY3Rpb24oKSB7XHJcbiAgICAgdGhpcy5faXNDaGFuZ2VEZXRlY3Rpb25QZW5kaW5nID0gZmFsc2U7XHJcbiBcclxuICAgICAvLyBBcHBseSB0aGUgY29udGVudCB0cmFuc2Zvcm0uIFRoZSB0cmFuc2Zvcm0gY2FuJ3QgYmUgc2V0IHZpYSBhbiBBbmd1bGFyIGJpbmRpbmcgYmVjYXVzZVxyXG4gICAgIC8vIGJ5cGFzc1NlY3VyaXR5VHJ1c3RTdHlsZSBpcyBiYW5uZWQgaW4gR29vZ2xlLiBIb3dldmVyIHRoZSB2YWx1ZSBpcyBzYWZlLCBpdCdzIGNvbXBvc2VkIG9mXHJcbiAgICAgLy8gc3RyaW5nIGxpdGVyYWxzLCBhIHZhcmlhYmxlIHRoYXQgY2FuIG9ubHkgYmUgJ1gnIG9yICdZJywgYW5kIHVzZXIgaW5wdXQgdGhhdCBpcyBydW4gdGhyb3VnaFxyXG4gICAgIC8vIHRoZSBgTnVtYmVyYCBmdW5jdGlvbiBmaXJzdCB0byBjb2VyY2UgaXQgdG8gYSBudW1lcmljIHZhbHVlLlxyXG4gICAgIHRoaXMuX2NvbnRlbnRXcmFwcGVyLm5hdGl2ZUVsZW1lbnQuc3R5bGUudG9wID0gdGhpcy5fcmVuZGVyZWRDb250ZW50VHJhbnNmb3JtO1xyXG4gICAgIC8vIEFwcGx5IGNoYW5nZXMgdG8gQW5ndWxhciBiaW5kaW5ncy4gTm90ZTogV2UgbXVzdCBjYWxsIGBtYXJrRm9yQ2hlY2tgIHRvIHJ1biBjaGFuZ2UgZGV0ZWN0aW9uXHJcbiAgICAgLy8gZnJvbSB0aGUgcm9vdCwgc2luY2UgdGhlIHJlcGVhdGVkIGl0ZW1zIGFyZSBjb250ZW50IHByb2plY3RlZCBpbi4gQ2FsbGluZyBgZGV0ZWN0Q2hhbmdlc2BcclxuICAgICAvLyBpbnN0ZWFkIGRvZXMgbm90IHByb3Blcmx5IGNoZWNrIHRoZSBwcm9qZWN0ZWQgY29udGVudC5cclxuICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4gdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCkpO1xyXG4gXHJcbiAgICAgY29uc3QgcnVuQWZ0ZXJDaGFuZ2VEZXRlY3Rpb24gPSB0aGlzLl9ydW5BZnRlckNoYW5nZURldGVjdGlvbjtcclxuICAgICB0aGlzLl9ydW5BZnRlckNoYW5nZURldGVjdGlvbiA9IFtdO1xyXG4gICAgIGZvciAoY29uc3QgZm4gb2YgcnVuQWZ0ZXJDaGFuZ2VEZXRlY3Rpb24pIHtcclxuICAgICAgIGZuKCk7XHJcbiAgICAgfVxyXG4gICB9XHJcbiBcclxuICAgLyoqIENhbGN1bGF0ZXMgdGhlIGBzdHlsZS53aWR0aGAgYW5kIGBzdHlsZS5oZWlnaHRgIGZvciB0aGUgc3BhY2VyIGVsZW1lbnQuICovXHJcbiAgIHByaXZhdGUgX2NhbGN1bGF0ZVNwYWNlclNpemUoKSB7XHJcbiAgICAgdGhpcy5fdG90YWxDb250ZW50SGVpZ2h0ID0gYCR7dGhpcy5fdG90YWxDb250ZW50U2l6ZX1weGA7XHJcbiAgICAgdGhpcy5fdG90YWxDb250ZW50V2lkdGggPSBcIlwiO1xyXG4gICB9XHJcbiB9XHJcbiAiLCI8IS0tXHJcbiAgV3JhcCB0aGUgcmVuZGVyZWQgY29udGVudCBpbiBhbiBlbGVtZW50IHRoYXQgd2lsbCBiZSB1c2VkIHRvIG9mZnNldCBpdCBiYXNlZCBvbiB0aGUgc2Nyb2xsXHJcbiAgcG9zaXRpb24uXHJcbi0tPlxyXG48ZGl2ICNjb250ZW50V3JhcHBlciBjbGFzcz1cImFubmEtdGFibGUtdmlydHVhbC1zY3JvbGwtY29udGVudC13cmFwcGVyXCI+XHJcblx0PG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxyXG48L2Rpdj5cclxuPCEtLVxyXG4gIFNwYWNlciB1c2VkIHRvIGZvcmNlIHRoZSBzY3JvbGxpbmcgY29udGFpbmVyIHRvIHRoZSBjb3JyZWN0IHNpemUgZm9yIHRoZSAqdG90YWwqIG51bWJlciBvZiBpdGVtc1xyXG4gIHNvIHRoYXQgdGhlIHNjcm9sbGJhciBjYXB0dXJlcyB0aGUgc2l6ZSBvZiB0aGUgZW50aXJlIGRhdGEgc2V0LlxyXG4tLT5cclxuPGRpdiBjbGFzcz1cImFwcC10YWJsZS12aXJ0dWFsLXNjcm9sbC1zcGFjZXJcIiBbc3R5bGUud2lkdGhdPVwiX3RvdGFsQ29udGVudFdpZHRoXCIgW3N0eWxlLmhlaWdodF09XCJfdG90YWxDb250ZW50SGVpZ2h0XCI+XHJcbjwvZGl2PiJdfQ==