@annalib/anna-core 4.2.3 → 4.2.5

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 (147) hide show
  1. package/.browserslistrc +16 -0
  2. package/karma.conf.js +44 -0
  3. package/ng-package.json +14 -0
  4. package/package.json +18 -38
  5. package/src/lib/anna-core-shared-lib/components/anna-buyer-approval-icon-template/anna-buyer-approval-icon-template.component.html +22 -0
  6. package/src/lib/anna-core-shared-lib/components/anna-buyer-approval-icon-template/anna-buyer-approval-icon-template.component.scss +0 -0
  7. package/src/lib/anna-core-shared-lib/components/anna-buyer-approval-icon-template/anna-buyer-approval-icon-template.component.spec.ts +25 -0
  8. package/src/lib/anna-core-shared-lib/components/anna-buyer-approval-icon-template/anna-buyer-approval-icon-template.component.ts +16 -0
  9. package/src/lib/anna-core-shared-lib/components/anna-icon-column/anna-icon-column.component.html +33 -0
  10. package/src/lib/anna-core-shared-lib/components/anna-icon-column/anna-icon-column.component.scss +0 -0
  11. package/src/lib/anna-core-shared-lib/components/anna-icon-column/anna-icon-column.component.spec.ts +25 -0
  12. package/src/lib/anna-core-shared-lib/components/anna-icon-column/anna-icon-column.component.ts +28 -0
  13. package/src/lib/anna-core-shared-lib/components/anna-live-icon-template/anna-live-icon-template.component.html +20 -0
  14. package/src/lib/anna-core-shared-lib/components/anna-live-icon-template/anna-live-icon-template.component.scss +0 -0
  15. package/src/lib/anna-core-shared-lib/components/anna-live-icon-template/anna-live-icon-template.component.spec.ts +25 -0
  16. package/src/lib/anna-core-shared-lib/components/anna-live-icon-template/anna-live-icon-template.component.ts +16 -0
  17. package/src/lib/anna-core-shared-lib/components/anna-no-data/anna-no-data.component.html +3 -0
  18. package/src/lib/anna-core-shared-lib/components/anna-no-data/anna-no-data.component.scss +17 -0
  19. package/src/lib/anna-core-shared-lib/components/anna-no-data/anna-no-data.component.spec.ts +24 -0
  20. package/src/lib/anna-core-shared-lib/components/anna-no-data/anna-no-data.component.ts +20 -0
  21. package/src/lib/anna-core-shared-lib/components/anna-notify-icon-template/anna-notify-icon-template.component.html +23 -0
  22. package/src/lib/anna-core-shared-lib/components/anna-notify-icon-template/anna-notify-icon-template.component.scss +0 -0
  23. package/src/lib/anna-core-shared-lib/components/anna-notify-icon-template/anna-notify-icon-template.component.spec.ts +25 -0
  24. package/src/lib/anna-core-shared-lib/components/anna-notify-icon-template/anna-notify-icon-template.component.ts +16 -0
  25. package/src/lib/anna-core-shared-lib/components/anna-pay-for-performance-icon-template/anna-pay-for-performance-icon-template.component.html +15 -0
  26. package/src/lib/anna-core-shared-lib/components/anna-pay-for-performance-icon-template/anna-pay-for-performance-icon-template.component.scss +0 -0
  27. package/src/lib/anna-core-shared-lib/components/anna-pay-for-performance-icon-template/anna-pay-for-performance-icon-template.component.spec.ts +25 -0
  28. package/src/lib/anna-core-shared-lib/components/anna-pay-for-performance-icon-template/anna-pay-for-performance-icon-template.component.ts +19 -0
  29. package/src/lib/anna-core-shared-lib/components/anna-rejected-icon-template/anna-rejected-icon-template.component.html +14 -0
  30. package/src/lib/anna-core-shared-lib/components/anna-rejected-icon-template/anna-rejected-icon-template.component.scss +0 -0
  31. package/src/lib/anna-core-shared-lib/components/anna-rejected-icon-template/anna-rejected-icon-template.component.spec.ts +25 -0
  32. package/src/lib/anna-core-shared-lib/components/anna-rejected-icon-template/anna-rejected-icon-template.component.ts +16 -0
  33. package/src/lib/anna-core-shared-lib/constants/shared.constant.ts +34 -0
  34. package/src/lib/anna-core-shared-lib/directives/show-ellipsis-text/show-ellipsis-text.directive.ts +19 -0
  35. package/src/lib/anna-core-shared-lib/models/anna-generic-data-type.model.ts +19 -0
  36. package/{lib/anna-core-shared-lib/models/anna-global-dropdown-config.model.d.ts → src/lib/anna-core-shared-lib/models/anna-global-dropdown-config.model.ts} +21 -9
  37. package/{lib/anna-core-shared-lib/models/anna-non-editable-gt-models.d.ts → src/lib/anna-core-shared-lib/models/anna-non-editable-gt-models.ts} +27 -17
  38. package/src/lib/anna-core-shared-lib/models/anna-sort.model.ts +7 -0
  39. package/src/lib/anna-core-shared-lib/models/anna-tooltip.model.ts +44 -0
  40. package/src/lib/anna-core-shared-lib/pipes/annaConvertZeroOrNullOrUndefined.pipe.ts +20 -0
  41. package/src/lib/anna-core-shared-lib/pipes/annaFilterSearchedText.pipe.ts +43 -0
  42. package/src/lib/anna-core-shared-lib/pipes/annaReplaceChar.pipe.ts +19 -0
  43. package/src/lib/anna-core-shared-lib/pipes/annaTypeOfData.pipe.ts +12 -0
  44. package/src/lib/anna-core-shared-lib/services/anna-date-time-format.service.ts +216 -0
  45. package/src/lib/anna-core-shared-lib/services/anna-filter.service.ts +514 -0
  46. package/src/lib/anna-core-shared-lib/services/anna-generic-table.service.ts +44 -0
  47. package/src/lib/anna-core-shared-lib/services/anna-global-config.service.ts +170 -0
  48. package/src/lib/anna-core-shared-lib/services/anna-sort.service.ts +179 -0
  49. package/src/lib/anna-core.module.ts +110 -0
  50. package/src/lib/anna-dropdown-lib/components/anna-calendar-filter/anna-calendar-filter.component.html +46 -0
  51. package/src/lib/anna-dropdown-lib/components/anna-calendar-filter/anna-calendar-filter.component.scss +153 -0
  52. package/src/lib/anna-dropdown-lib/components/anna-calendar-filter/anna-calendar-filter.component.spec.ts +24 -0
  53. package/src/lib/anna-dropdown-lib/components/anna-calendar-filter/anna-calendar-filter.component.ts +106 -0
  54. package/src/lib/anna-dropdown-lib/components/anna-week-calendar-filter/anna-week-calendar-filter.component.html +129 -0
  55. package/src/lib/anna-dropdown-lib/components/anna-week-calendar-filter/anna-week-calendar-filter.component.scss +275 -0
  56. package/src/lib/anna-dropdown-lib/components/anna-week-calendar-filter/anna-week-calendar-filter.component.spec.ts +24 -0
  57. package/src/lib/anna-dropdown-lib/components/anna-week-calendar-filter/anna-week-calendar-filter.component.ts +412 -0
  58. package/src/lib/anna-generic-table-lib/components/anna-non-editable-generic-table/anna-non-editable-generic-table.component.html +926 -0
  59. package/src/lib/anna-generic-table-lib/components/anna-non-editable-generic-table/anna-non-editable-generic-table.component.scss +628 -0
  60. package/src/lib/anna-generic-table-lib/components/anna-non-editable-generic-table/anna-non-editable-generic-table.component.spec.ts +25 -0
  61. package/src/lib/anna-generic-table-lib/components/anna-non-editable-generic-table/anna-non-editable-generic-table.component.ts +2064 -0
  62. package/src/lib/anna-generic-table-lib/components/anna-sort/anna-sort.component.html +10 -0
  63. package/src/lib/anna-generic-table-lib/components/anna-sort/anna-sort.component.scss +1 -0
  64. package/src/lib/anna-generic-table-lib/components/anna-sort/anna-sort.component.spec.ts +24 -0
  65. package/src/lib/anna-generic-table-lib/components/anna-sort/anna-sort.component.ts +70 -0
  66. package/src/lib/anna-generic-table-lib/components/anna-table-virtual-scroll-viewport/anna-table-virtual-scroll-viewport.component.html +13 -0
  67. package/src/lib/anna-generic-table-lib/components/anna-table-virtual-scroll-viewport/anna-table-virtual-scroll-viewport.component.scss +88 -0
  68. package/src/lib/anna-generic-table-lib/components/anna-table-virtual-scroll-viewport/anna-table-virtual-scroll-viewport.component.spec.ts +25 -0
  69. package/src/lib/anna-generic-table-lib/components/anna-table-virtual-scroll-viewport/anna-table-virtual-scroll-viewport.component.ts +460 -0
  70. package/src/lib/anna-generic-table-lib/directives/anna-fixed-row-size-table-virtual-scroll-strategy/anna-fixed-row-size-table-virtual-scroll-strategy.directive.ts +237 -0
  71. package/{lib/anna-generic-table-lib/directives/anna-fixed-row-size-table-virtual-scroll-strategy/index.d.ts → src/lib/anna-generic-table-lib/directives/anna-fixed-row-size-table-virtual-scroll-strategy/index.ts} +0 -0
  72. package/src/lib/anna-generic-table-lib/directives/anna-virtual-table/anna-virtual-table.directive.ts +204 -0
  73. package/{lib/anna-generic-table-lib/directives/anna-virtual-table/index.d.ts → src/lib/anna-generic-table-lib/directives/anna-virtual-table/index.ts} +0 -0
  74. package/{public-api.d.ts → src/public-api.ts} +28 -0
  75. package/src/test.ts +27 -0
  76. package/tsconfig.lib.json +19 -0
  77. package/tsconfig.lib.prod.json +10 -0
  78. package/tsconfig.spec.json +17 -0
  79. package/annalib-anna-core.d.ts +0 -5
  80. package/esm2020/annalib-anna-core.mjs +0 -5
  81. package/esm2020/lib/anna-core-shared-lib/components/anna-buyer-approval-icon-template/anna-buyer-approval-icon-template.component.mjs +0 -15
  82. package/esm2020/lib/anna-core-shared-lib/components/anna-icon-column/anna-icon-column.component.mjs +0 -35
  83. package/esm2020/lib/anna-core-shared-lib/components/anna-live-icon-template/anna-live-icon-template.component.mjs +0 -15
  84. package/esm2020/lib/anna-core-shared-lib/components/anna-no-data/anna-no-data.component.mjs +0 -22
  85. package/esm2020/lib/anna-core-shared-lib/components/anna-notify-icon-template/anna-notify-icon-template.component.mjs +0 -15
  86. package/esm2020/lib/anna-core-shared-lib/components/anna-pay-for-performance-icon-template/anna-pay-for-performance-icon-template.component.mjs +0 -21
  87. package/esm2020/lib/anna-core-shared-lib/components/anna-rejected-icon-template/anna-rejected-icon-template.component.mjs +0 -15
  88. package/esm2020/lib/anna-core-shared-lib/constants/shared.constant.mjs +0 -34
  89. package/esm2020/lib/anna-core-shared-lib/directives/show-ellipsis-text/show-ellipsis-text.directive.mjs +0 -27
  90. package/esm2020/lib/anna-core-shared-lib/models/anna-generic-data-type.model.mjs +0 -2
  91. package/esm2020/lib/anna-core-shared-lib/models/anna-global-dropdown-config.model.mjs +0 -2
  92. package/esm2020/lib/anna-core-shared-lib/models/anna-non-editable-gt-models.mjs +0 -3
  93. package/esm2020/lib/anna-core-shared-lib/models/anna-sort.model.mjs +0 -2
  94. package/esm2020/lib/anna-core-shared-lib/models/anna-tooltip.model.mjs +0 -30
  95. package/esm2020/lib/anna-core-shared-lib/pipes/annaConvertZeroOrNullOrUndefined.pipe.mjs +0 -26
  96. package/esm2020/lib/anna-core-shared-lib/pipes/annaFilterSearchedText.pipe.mjs +0 -46
  97. package/esm2020/lib/anna-core-shared-lib/pipes/annaReplaceChar.pipe.mjs +0 -25
  98. package/esm2020/lib/anna-core-shared-lib/pipes/annaTypeOfData.pipe.mjs +0 -16
  99. package/esm2020/lib/anna-core-shared-lib/services/anna-date-time-format.service.mjs +0 -196
  100. package/esm2020/lib/anna-core-shared-lib/services/anna-filter.service.mjs +0 -426
  101. package/esm2020/lib/anna-core-shared-lib/services/anna-generic-table.service.mjs +0 -48
  102. package/esm2020/lib/anna-core-shared-lib/services/anna-global-config.service.mjs +0 -133
  103. package/esm2020/lib/anna-core-shared-lib/services/anna-sort.service.mjs +0 -147
  104. package/esm2020/lib/anna-core.module.mjs +0 -175
  105. package/esm2020/lib/anna-dropdown-lib/components/anna-calendar-filter/anna-calendar-filter.component.mjs +0 -100
  106. package/esm2020/lib/anna-dropdown-lib/components/anna-week-calendar-filter/anna-week-calendar-filter.component.mjs +0 -362
  107. package/esm2020/lib/anna-generic-table-lib/components/anna-non-editable-generic-table/anna-non-editable-generic-table.component.mjs +0 -1724
  108. package/esm2020/lib/anna-generic-table-lib/components/anna-sort/anna-sort.component.mjs +0 -67
  109. package/esm2020/lib/anna-generic-table-lib/components/anna-table-virtual-scroll-viewport/anna-table-virtual-scroll-viewport.component.mjs +0 -357
  110. package/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 +0 -189
  111. package/esm2020/lib/anna-generic-table-lib/directives/anna-fixed-row-size-table-virtual-scroll-strategy/index.mjs +0 -2
  112. package/esm2020/lib/anna-generic-table-lib/directives/anna-virtual-table/anna-virtual-table.directive.mjs +0 -178
  113. package/esm2020/lib/anna-generic-table-lib/directives/anna-virtual-table/index.mjs +0 -2
  114. package/esm2020/public-api.mjs +0 -47
  115. package/fesm2015/annalib-anna-core.mjs +0 -4302
  116. package/fesm2015/annalib-anna-core.mjs.map +0 -1
  117. package/fesm2020/annalib-anna-core.mjs +0 -4299
  118. package/fesm2020/annalib-anna-core.mjs.map +0 -1
  119. package/lib/anna-core-shared-lib/components/anna-buyer-approval-icon-template/anna-buyer-approval-icon-template.component.d.ts +0 -8
  120. package/lib/anna-core-shared-lib/components/anna-icon-column/anna-icon-column.component.d.ts +0 -16
  121. package/lib/anna-core-shared-lib/components/anna-live-icon-template/anna-live-icon-template.component.d.ts +0 -8
  122. package/lib/anna-core-shared-lib/components/anna-no-data/anna-no-data.component.d.ts +0 -11
  123. package/lib/anna-core-shared-lib/components/anna-notify-icon-template/anna-notify-icon-template.component.d.ts +0 -8
  124. package/lib/anna-core-shared-lib/components/anna-pay-for-performance-icon-template/anna-pay-for-performance-icon-template.component.d.ts +0 -11
  125. package/lib/anna-core-shared-lib/components/anna-rejected-icon-template/anna-rejected-icon-template.component.d.ts +0 -8
  126. package/lib/anna-core-shared-lib/constants/shared.constant.d.ts +0 -32
  127. package/lib/anna-core-shared-lib/directives/show-ellipsis-text/show-ellipsis-text.directive.d.ts +0 -9
  128. package/lib/anna-core-shared-lib/models/anna-generic-data-type.model.d.ts +0 -16
  129. package/lib/anna-core-shared-lib/models/anna-sort.model.d.ts +0 -6
  130. package/lib/anna-core-shared-lib/models/anna-tooltip.model.d.ts +0 -25
  131. package/lib/anna-core-shared-lib/pipes/annaConvertZeroOrNullOrUndefined.pipe.d.ts +0 -9
  132. package/lib/anna-core-shared-lib/pipes/annaFilterSearchedText.pipe.d.ts +0 -9
  133. package/lib/anna-core-shared-lib/pipes/annaReplaceChar.pipe.d.ts +0 -9
  134. package/lib/anna-core-shared-lib/pipes/annaTypeOfData.pipe.d.ts +0 -7
  135. package/lib/anna-core-shared-lib/services/anna-date-time-format.service.d.ts +0 -27
  136. package/lib/anna-core-shared-lib/services/anna-filter.service.d.ts +0 -73
  137. package/lib/anna-core-shared-lib/services/anna-generic-table.service.d.ts +0 -14
  138. package/lib/anna-core-shared-lib/services/anna-global-config.service.d.ts +0 -21
  139. package/lib/anna-core-shared-lib/services/anna-sort.service.d.ts +0 -16
  140. package/lib/anna-core.module.d.ts +0 -35
  141. package/lib/anna-dropdown-lib/components/anna-calendar-filter/anna-calendar-filter.component.d.ts +0 -34
  142. package/lib/anna-dropdown-lib/components/anna-week-calendar-filter/anna-week-calendar-filter.component.d.ts +0 -70
  143. package/lib/anna-generic-table-lib/components/anna-non-editable-generic-table/anna-non-editable-generic-table.component.d.ts +0 -271
  144. package/lib/anna-generic-table-lib/components/anna-sort/anna-sort.component.d.ts +0 -17
  145. package/lib/anna-generic-table-lib/components/anna-table-virtual-scroll-viewport/anna-table-virtual-scroll-viewport.component.d.ts +0 -141
  146. 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 +0 -89
  147. package/lib/anna-generic-table-lib/directives/anna-virtual-table/anna-virtual-table.directive.d.ts +0 -45
@@ -1,67 +0,0 @@
1
- // Angular import statements
2
- import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core';
3
- import { AnnaSortService } from '../../../anna-core-shared-lib/services/anna-sort.service';
4
- import * as i0 from "@angular/core";
5
- import * as i1 from "../../../anna-core-shared-lib/services/anna-sort.service";
6
- import * as i2 from "@angular/common";
7
- //Add onChange push change detection
8
- export class AnnaSortComponent {
9
- constructor(annaSortService) {
10
- this.annaSortService = annaSortService;
11
- this.sortOptionClicked = new EventEmitter();
12
- this.sortOptions = [
13
- {
14
- sortType: 'ASC',
15
- isOptionActive: false,
16
- text: 'A to Z',
17
- },
18
- {
19
- sortType: 'DESC',
20
- isOptionActive: false,
21
- text: 'Z to A',
22
- },
23
- {
24
- sortType: 'DEFAULT',
25
- isOptionActive: false,
26
- text: 'DEFAULT',
27
- },
28
- ];
29
- }
30
- ngOnChanges(changes) {
31
- console.log("sort component ngOnChanges");
32
- console.log(this.sortObjectKey);
33
- if (changes["sortObjectKey"] && changes["sortObjectKey"].currentValue) {
34
- console.log("inside sort active func");
35
- let sortType = this.annaSortService.columnSortState.get(this.sortObjectKey);
36
- this.setSortType(sortType);
37
- }
38
- }
39
- sortOptionChanged(index, sortType) {
40
- this.sortOptions.forEach((item) => (item.isOptionActive = false));
41
- this.sortOptions[index].isOptionActive = true;
42
- this.sortOptionClicked.emit(sortType);
43
- }
44
- ngOnInit() {
45
- console.log("sort component ngOnInit");
46
- console.log(this.annaSortService.columnSortState);
47
- this.annaSortService.updateSortTypeSubject.subscribe((item) => {
48
- this.setSortType(item);
49
- });
50
- }
51
- setSortType(option) {
52
- this.sortOptions.forEach(item => item.isOptionActive = false);
53
- let index = this.sortOptions.findIndex(item => item.sortType == option);
54
- this.sortOptions[index].isOptionActive = true;
55
- }
56
- }
57
- AnnaSortComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: AnnaSortComponent, deps: [{ token: i1.AnnaSortService }], target: i0.ɵɵFactoryTarget.Component });
58
- AnnaSortComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", 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"], directives: [{ type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
59
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: AnnaSortComponent, decorators: [{
60
- type: Component,
61
- 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"] }]
62
- }], ctorParameters: function () { return [{ type: i1.AnnaSortService }]; }, propDecorators: { sortObjectKey: [{
63
- type: Input
64
- }], sortOptionClicked: [{
65
- type: Output
66
- }] } });
67
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5uYS1zb3J0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FubmEtY29yZS9zcmMvbGliL2FubmEtZ2VuZXJpYy10YWJsZS1saWIvY29tcG9uZW50cy9hbm5hLXNvcnQvYW5uYS1zb3J0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FubmEtY29yZS9zcmMvbGliL2FubmEtZ2VuZXJpYy10YWJsZS1saWIvY29tcG9uZW50cy9hbm5hLXNvcnQvYW5uYS1zb3J0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDRCQUE0QjtBQUM1QixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQWEsTUFBTSxFQUFpQixNQUFNLGVBQWUsQ0FBQztBQUUxSCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMERBQTBELENBQUM7Ozs7QUFFM0Ysb0NBQW9DO0FBT3BDLE1BQU0sT0FBTyxpQkFBaUI7SUF1QjVCLFlBQW9CLGVBQWdDO1FBQWhDLG9CQUFlLEdBQWYsZUFBZSxDQUFpQjtRQXBCMUMsc0JBQWlCLEdBQUcsSUFBSSxZQUFZLEVBQVksQ0FBQztRQUUzRCxnQkFBVyxHQUFpQjtZQUMxQjtnQkFDRSxRQUFRLEVBQUUsS0FBSztnQkFDZixjQUFjLEVBQUUsS0FBSztnQkFDckIsSUFBSSxFQUFFLFFBQVE7YUFDZjtZQUNEO2dCQUNFLFFBQVEsRUFBRSxNQUFNO2dCQUNoQixjQUFjLEVBQUUsS0FBSztnQkFDckIsSUFBSSxFQUFFLFFBQVE7YUFDZjtZQUNEO2dCQUNFLFFBQVEsRUFBRSxTQUFTO2dCQUNuQixjQUFjLEVBQUUsS0FBSztnQkFDckIsSUFBSSxFQUFFLFNBQVM7YUFDaEI7U0FDRixDQUFDO0lBRXFELENBQUM7SUFFeEQsV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLE9BQU8sQ0FBQyxHQUFHLENBQUMsNEJBQTRCLENBQUMsQ0FBQztRQUMxQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUNoQyxJQUFHLE9BQU8sQ0FBQyxlQUFlLENBQUMsSUFBSSxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUMsWUFBWSxFQUFDO1lBQ25FLE9BQU8sQ0FBQyxHQUFHLENBQUMseUJBQXlCLENBQUMsQ0FBQztZQUN2QyxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQ3JELElBQUksQ0FBQyxhQUFhLENBQ25CLENBQUM7WUFDRixJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQzVCO0lBRUgsQ0FBQztJQUVELGlCQUFpQixDQUFDLEtBQWEsRUFBRSxRQUFrQjtRQUNqRCxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDbEUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO1FBQzlDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVELFFBQVE7UUFDTixPQUFPLENBQUMsR0FBRyxDQUFDLHlCQUF5QixDQUFDLENBQUM7UUFDdkMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ2xELElBQUksQ0FBQyxlQUFlLENBQUMscUJBQXFCLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBWSxFQUFFLEVBQUU7WUFDcEUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6QixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxXQUFXLENBQUMsTUFBYztRQUN4QixJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDLENBQUM7UUFDOUQsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLE1BQU0sQ0FBQyxDQUFDO1FBQ3hFLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztJQUNoRCxDQUFDOzs4R0F4RFUsaUJBQWlCO2tHQUFqQixpQkFBaUIsZ0xDWjlCLCtUQVNJOzJGREdTLGlCQUFpQjtrQkFON0IsU0FBUzsrQkFDRSxvQkFBb0IsbUJBR2IsdUJBQXVCLENBQUMsTUFBTTtzR0FJdEMsYUFBYTtzQkFBckIsS0FBSztnQkFDSSxpQkFBaUI7c0JBQTFCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyIvLyBBbmd1bGFyIGltcG9ydCBzdGF0ZW1lbnRzXHJcbmltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uQ2hhbmdlcywgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFNvcnRPcHRpb24sIFNvcnRUeXBlIH0gZnJvbSAnLi4vLi4vLi4vYW5uYS1jb3JlLXNoYXJlZC1saWIvbW9kZWxzL2FubmEtc29ydC5tb2RlbCc7XHJcbmltcG9ydCB7IEFubmFTb3J0U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2FubmEtY29yZS1zaGFyZWQtbGliL3NlcnZpY2VzL2FubmEtc29ydC5zZXJ2aWNlJztcclxuXHJcbi8vQWRkIG9uQ2hhbmdlIHB1c2ggY2hhbmdlIGRldGVjdGlvblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2FubmEtY29yZS1zb3J0LWxpYicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2FubmEtc29ydC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vYW5uYS1zb3J0LmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcclxufSlcclxuZXhwb3J0IGNsYXNzIEFubmFTb3J0Q29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2Vze1xyXG4gIFxyXG4gIEBJbnB1dCgpIHNvcnRPYmplY3RLZXk6IHN0cmluZztcclxuICBAT3V0cHV0KCkgc29ydE9wdGlvbkNsaWNrZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFNvcnRUeXBlPigpO1xyXG5cclxuICBzb3J0T3B0aW9uczogU29ydE9wdGlvbltdID0gW1xyXG4gICAge1xyXG4gICAgICBzb3J0VHlwZTogJ0FTQycsXHJcbiAgICAgIGlzT3B0aW9uQWN0aXZlOiBmYWxzZSxcclxuICAgICAgdGV4dDogJ0EgdG8gWicsXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICBzb3J0VHlwZTogJ0RFU0MnLFxyXG4gICAgICBpc09wdGlvbkFjdGl2ZTogZmFsc2UsXHJcbiAgICAgIHRleHQ6ICdaIHRvIEEnLFxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgc29ydFR5cGU6ICdERUZBVUxUJyxcclxuICAgICAgaXNPcHRpb25BY3RpdmU6IGZhbHNlLFxyXG4gICAgICB0ZXh0OiAnREVGQVVMVCcsXHJcbiAgICB9LFxyXG4gIF07XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgYW5uYVNvcnRTZXJ2aWNlOiBBbm5hU29ydFNlcnZpY2UpIHt9XHJcbiAgXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgY29uc29sZS5sb2coXCJzb3J0IGNvbXBvbmVudCBuZ09uQ2hhbmdlc1wiKTtcclxuICAgIGNvbnNvbGUubG9nKHRoaXMuc29ydE9iamVjdEtleSk7XHJcbiAgICBpZihjaGFuZ2VzW1wic29ydE9iamVjdEtleVwiXSAmJiBjaGFuZ2VzW1wic29ydE9iamVjdEtleVwiXS5jdXJyZW50VmFsdWUpe1xyXG4gICAgICBjb25zb2xlLmxvZyhcImluc2lkZSBzb3J0IGFjdGl2ZSBmdW5jXCIpO1xyXG4gICAgICBsZXQgc29ydFR5cGUgPSB0aGlzLmFubmFTb3J0U2VydmljZS5jb2x1bW5Tb3J0U3RhdGUuZ2V0KFxyXG4gICAgICAgIHRoaXMuc29ydE9iamVjdEtleVxyXG4gICAgICApO1xyXG4gICAgICB0aGlzLnNldFNvcnRUeXBlKHNvcnRUeXBlKTtcclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICBzb3J0T3B0aW9uQ2hhbmdlZChpbmRleDogbnVtYmVyLCBzb3J0VHlwZTogU29ydFR5cGUpIHtcclxuICAgIHRoaXMuc29ydE9wdGlvbnMuZm9yRWFjaCgoaXRlbSkgPT4gKGl0ZW0uaXNPcHRpb25BY3RpdmUgPSBmYWxzZSkpO1xyXG4gICAgdGhpcy5zb3J0T3B0aW9uc1tpbmRleF0uaXNPcHRpb25BY3RpdmUgPSB0cnVlO1xyXG4gICAgdGhpcy5zb3J0T3B0aW9uQ2xpY2tlZC5lbWl0KHNvcnRUeXBlKTtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgY29uc29sZS5sb2coXCJzb3J0IGNvbXBvbmVudCBuZ09uSW5pdFwiKTtcclxuICAgIGNvbnNvbGUubG9nKHRoaXMuYW5uYVNvcnRTZXJ2aWNlLmNvbHVtblNvcnRTdGF0ZSk7XHJcbiAgICB0aGlzLmFubmFTb3J0U2VydmljZS51cGRhdGVTb3J0VHlwZVN1YmplY3Quc3Vic2NyaWJlKChpdGVtOiBzdHJpbmcpID0+IHtcclxuICAgICAgdGhpcy5zZXRTb3J0VHlwZShpdGVtKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc2V0U29ydFR5cGUob3B0aW9uOiBzdHJpbmcpe1xyXG4gICAgdGhpcy5zb3J0T3B0aW9ucy5mb3JFYWNoKGl0ZW0gPT4gaXRlbS5pc09wdGlvbkFjdGl2ZSA9IGZhbHNlKTtcclxuICAgIGxldCBpbmRleCA9IHRoaXMuc29ydE9wdGlvbnMuZmluZEluZGV4KGl0ZW0gPT4gaXRlbS5zb3J0VHlwZSA9PSBvcHRpb24pO1xyXG4gICAgdGhpcy5zb3J0T3B0aW9uc1tpbmRleF0uaXNPcHRpb25BY3RpdmUgPSB0cnVlO1xyXG4gIH1cclxufVxyXG4iLCI8cCBjbGFzcz1cInNvcnQtY29udGFpbmVyXCI+XHJcbiAgICA8YnV0dG9uXHJcbiAgICAgICAgY2xhc3M9XCJzb3J0LWJ0blwiXHJcbiAgICAgICAgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBzb3J0T3B0aW9uczsgbGV0IGkgPSBpbmRleFwiXHJcbiAgICAgICAgKGNsaWNrKT1cInNvcnRPcHRpb25DaGFuZ2VkKGksIG9wdGlvbi5zb3J0VHlwZSlcIlxyXG4gICAgICAgIFtuZ0NsYXNzXT1cInsgYWN0aXZlOiBvcHRpb24uaXNPcHRpb25BY3RpdmUgfVwiXHJcbiAgICA+XHJcbiAgICAgICAge3tvcHRpb24udGV4dH19XHJcbiAgICA8L2J1dHRvbj5cclxuPC9wPiJdfQ==
@@ -1,357 +0,0 @@
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 { AnnaGenericTableService } 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: "13.2.7", 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.AnnaGenericTableService }], target: i0.ɵɵFactoryTarget.Component });
316
- AnnaTableVirtualScrollViewportComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", 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: "13.2.7", 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.AnnaGenericTableService }]; }, 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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QUNUO1lBQ0UsT0FBTyxFQUFFLGFBQWE7WUFDdEIsV0FBVyxFQUFFLHVDQUF1QztTQUNyRDtRQUNEO1lBQ0UsT0FBTyxFQUFFLHdCQUF3QjtZQUNqQyxXQUFXLEVBQUUsdUNBQXVDO1NBQ3JEO0tBQ0Ysa0xDeEZKLHFqQkFZTTsyRkQ4RVEsdUNBQXVDO2tCQXhCbkQsU0FBUzsrQkFDRSxvQ0FBb0MsUUFHeEM7d0JBQ0osS0FBSyxFQUFFLG9DQUFvQzt3QkFDM0MsMERBQTBELEVBQ3hELDhCQUE4Qjt3QkFDaEMsd0RBQXdELEVBQ3RELDhCQUE4QjtxQkFDakMsaUJBQ2MsaUJBQWlCLENBQUMsSUFBSSxtQkFDcEIsdUJBQXVCLENBQUMsTUFBTSxhQUNwQzt3QkFDVDs0QkFDRSxPQUFPLEVBQUUsYUFBYTs0QkFDdEIsV0FBVyx5Q0FBeUM7eUJBQ3JEO3dCQUNEOzRCQUNFLE9BQU8sRUFBRSx3QkFBd0I7NEJBQ2pDLFdBQVcseUNBQXlDO3lCQUNyRDtxQkFDRjs7MEJBZ0dFLFFBQVE7OzBCQUNSLE1BQU07MkJBQUMsdUJBQXVCOzswQkFFOUIsUUFBUTs2SUF2RlAsV0FBVztzQkFEZCxLQUFLO2dCQWlCSSxtQkFBbUI7c0JBQTVCLE1BQU07Z0JBVXdDLGVBQWU7c0JBQTdELFNBQVM7dUJBQUMsZ0JBQWdCLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXHJcbiAqXHJcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXHJcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcclxuICovXHJcblxyXG4gaW1wb3J0IHsgRGlyZWN0aW9uYWxpdHkgfSBmcm9tIFwiQGFuZ3VsYXIvY2RrL2JpZGlcIjtcclxuIGltcG9ydCB7IExpc3RSYW5nZSB9IGZyb20gXCJAYW5ndWxhci9jZGsvY29sbGVjdGlvbnNcIjtcclxuIGltcG9ydCB7XHJcbiAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxyXG4gICBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgQ29tcG9uZW50LFxyXG4gICBFbGVtZW50UmVmLFxyXG4gICBJbmplY3QsXHJcbiAgIElucHV0LFxyXG4gICBOZ1pvbmUsXHJcbiAgIE9uRGVzdHJveSxcclxuICAgT25Jbml0LFxyXG4gICBPcHRpb25hbCxcclxuICAgT3V0cHV0LFxyXG4gICBWaWV3Q2hpbGQsXHJcbiAgIFZpZXdFbmNhcHN1bGF0aW9uXHJcbiB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbiBpbXBvcnQge1xyXG4gICBhbmltYXRpb25GcmFtZVNjaGVkdWxlcixcclxuICAgYXNhcFNjaGVkdWxlcixcclxuICAgT2JzZXJ2YWJsZSxcclxuICAgU3ViamVjdCxcclxuICAgT2JzZXJ2ZXIsXHJcbiAgIFN1YnNjcmlwdGlvblxyXG4gfSBmcm9tIFwicnhqc1wiO1xyXG4gaW1wb3J0IHsgYXVkaXRUaW1lLCBzdGFydFdpdGgsIHRha2VVbnRpbCB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xyXG4gaW1wb3J0IHtcclxuICAgQ2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0LFxyXG4gICBDZGtTY3JvbGxhYmxlLFxyXG4gICBDZGtWaXJ0dWFsU2Nyb2xsUmVwZWF0ZXIsXHJcbiAgIFZJUlRVQUxfU0NST0xMX1NUUkFURUdZLFxyXG4gICBWaXJ0dWFsU2Nyb2xsU3RyYXRlZ3ksXHJcbiAgIFNjcm9sbERpc3BhdGNoZXIsXHJcbiAgIFZpZXdwb3J0UnVsZXIsXHJcbiAgIEV4dGVuZGVkU2Nyb2xsVG9PcHRpb25zXHJcbiB9IGZyb20gXCJAYW5ndWxhci9jZGsvc2Nyb2xsaW5nXCI7XHJcbmltcG9ydCB7IEFubmFHZW5lcmljVGFibGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vYW5uYS1jb3JlLXNoYXJlZC1saWIvc2VydmljZXMvYW5uYS1nZW5lcmljLXRhYmxlLnNlcnZpY2UnO1xyXG4gXHJcbiAvKiogQ2hlY2tzIGlmIHRoZSBnaXZlbiByYW5nZXMgYXJlIGVxdWFsLiAqL1xyXG4gZnVuY3Rpb24gcmFuZ2VzRXF1YWwocjE6IExpc3RSYW5nZSwgcjI6IExpc3RSYW5nZSk6IGJvb2xlYW4ge1xyXG4gICByZXR1cm4gcjEuc3RhcnQgPT0gcjIuc3RhcnQgJiYgcjEuZW5kID09IHIyLmVuZDtcclxuIH1cclxuIFxyXG4gLyoqXHJcbiAgKiBTY2hlZHVsZXIgdG8gYmUgdXNlZCBmb3Igc2Nyb2xsIGV2ZW50cy4gTmVlZHMgdG8gZmFsbCBiYWNrIHRvXHJcbiAgKiBzb21ldGhpbmcgdGhhdCBkb2Vzbid0IHJlbHkgb24gcmVxdWVzdEFuaW1hdGlvbkZyYW1lIG9uIGVudmlyb25tZW50c1xyXG4gICogdGhhdCBkb24ndCBzdXBwb3J0IGl0IChlLmcuIHNlcnZlci1zaWRlIHJlbmRlcmluZykuXHJcbiAgKi9cclxuIGNvbnN0IFNDUk9MTF9TQ0hFRFVMRVIgPVxyXG4gICB0eXBlb2YgcmVxdWVzdEFuaW1hdGlvbkZyYW1lICE9PSBcInVuZGVmaW5lZFwiXHJcbiAgICAgPyBhbmltYXRpb25GcmFtZVNjaGVkdWxlclxyXG4gICAgIDogYXNhcFNjaGVkdWxlcjtcclxuIFxyXG4gLyoqXHJcbiAgKiBBIHZpZXdwb3J0IHRoYXQgdmlydHVhbGl6ZXMgaXRzIHNjcm9sbGluZyB3aXRoIHRoZSBoZWxwIG9mIGBDZGtWaXJ0dWFsRm9yT2ZgLlxyXG4gICogVXNlcyBgdG9wOiAjcHhgIGluc3RlYWQgb2YgYHRyYW5zZm9ybTogdHJhbnNsYXRlWSgjcHgpYCBsaWtlIHRoZSBjZGsgdmlydHVhbCBzY3JvbGwgdmlld3BvcnQgZG9lc1xyXG4gICogd2hpY2ggYXZvaWRzIGZsaWNrZXJpbmcgb2YgZWxlbWVudHMgaW4gdGhlIHRyYW5zZm9ybWVkIGNvbnRhaW5lciB3aXRoIGBwb3NpdGlvbjogc3RpY2t5YC5cclxuICAqL1xyXG4gQENvbXBvbmVudCh7XHJcbiAgIHNlbGVjdG9yOiBcImFubmEtdGFibGUtdmlydHVhbC1zY3JvbGwtdmlld3BvcnRcIixcclxuICAgdGVtcGxhdGVVcmw6IFwiYW5uYS10YWJsZS12aXJ0dWFsLXNjcm9sbC12aWV3cG9ydC5jb21wb25lbnQuaHRtbFwiLFxyXG4gICBzdHlsZVVybHM6IFtcImFubmEtdGFibGUtdmlydHVhbC1zY3JvbGwtdmlld3BvcnQuY29tcG9uZW50LnNjc3NcIl0sXHJcbiAgIGhvc3Q6IHtcclxuICAgICBjbGFzczogXCJhbm5hLXRhYmxlLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0XCIsXHJcbiAgICAgXCJbY2xhc3MuYW5uYS10YWJsZS12aXJ0dWFsLXNjcm9sbC1vcmllbnRhdGlvbi1ob3Jpem9udGFsXVwiOlxyXG4gICAgICAgJ29yaWVudGF0aW9uID09PSBcImhvcml6b250YWxcIicsXHJcbiAgICAgXCJbY2xhc3MuYW5uYS10YWJsZS12aXJ0dWFsLXNjcm9sbC1vcmllbnRhdGlvbi12ZXJ0aWNhbF1cIjpcclxuICAgICAgICdvcmllbnRhdGlvbiAhPT0gXCJob3Jpem9udGFsXCInXHJcbiAgIH0sXHJcbiAgIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXHJcbiAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxyXG4gICBwcm92aWRlcnM6IFtcclxuICAgICB7XHJcbiAgICAgICBwcm92aWRlOiBDZGtTY3JvbGxhYmxlLFxyXG4gICAgICAgdXNlRXhpc3Rpbmc6IEFubmFUYWJsZVZpcnR1YWxTY3JvbGxWaWV3cG9ydENvbXBvbmVudFxyXG4gICAgIH0sXHJcbiAgICAge1xyXG4gICAgICAgcHJvdmlkZTogQ2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0LFxyXG4gICAgICAgdXNlRXhpc3Rpbmc6IEFubmFUYWJsZVZpcnR1YWxTY3JvbGxWaWV3cG9ydENvbXBvbmVudFxyXG4gICAgIH1cclxuICAgXVxyXG4gfSlcclxuIGV4cG9ydCBjbGFzcyBBbm5hVGFibGVWaXJ0dWFsU2Nyb2xsVmlld3BvcnRDb21wb25lbnQgZXh0ZW5kcyBDZGtTY3JvbGxhYmxlXHJcbiAgIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gICAvKiogRW1pdHMgd2hlbiB0aGUgdmlld3BvcnQgaXMgZGV0YWNoZWQgZnJvbSBhIENka1ZpcnR1YWxGb3JPZi4gKi9cclxuICAgcHJpdmF0ZSBfZGV0YWNoZWRTdWJqZWN0ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuIFxyXG4gICAvKiogRW1pdHMgd2hlbiB0aGUgcmVuZGVyZWQgcmFuZ2UgY2hhbmdlcy4gKi9cclxuICAgcHJpdmF0ZSBfcmVuZGVyZWRSYW5nZVN1YmplY3QgPSBuZXcgU3ViamVjdDxMaXN0UmFuZ2U+KCk7XHJcbiBcclxuICAgLyoqIFRoZSBkaXJlY3Rpb24gdGhlIHZpZXdwb3J0IHNjcm9sbHMuICovXHJcbiAgIEBJbnB1dCgpXHJcbiAgIGdldCBvcmllbnRhdGlvbigpIHtcclxuICAgICByZXR1cm4gdGhpcy5fb3JpZW50YXRpb247XHJcbiAgIH1cclxuICAgc2V0IG9yaWVudGF0aW9uKG9yaWVudGF0aW9uOiBcImhvcml6b250YWxcIiB8IFwidmVydGljYWxcIikge1xyXG4gICAgIGlmICh0aGlzLl9vcmllbnRhdGlvbiAhPT0gb3JpZW50YXRpb24pIHtcclxuICAgICAgIHRoaXMuX29yaWVudGF0aW9uID0gb3JpZW50YXRpb247XHJcbiAgICAgICB0aGlzLl9jYWxjdWxhdGVTcGFjZXJTaXplKCk7XHJcbiAgICAgfVxyXG4gICB9XHJcbiAgIHByaXZhdGUgX29yaWVudGF0aW9uOiBcImhvcml6b250YWxcIiB8IFwidmVydGljYWxcIiA9IFwidmVydGljYWxcIjtcclxuIFxyXG4gICAvLyBOb3RlOiB3ZSBkb24ndCB1c2UgdGhlIHR5cGljYWwgRXZlbnRFbWl0dGVyIGhlcmUgYmVjYXVzZSB3ZSBuZWVkIHRvIHN1YnNjcmliZSB0byB0aGUgc2Nyb2xsXHJcbiAgIC8vIHN0cmF0ZWd5IGxhemlseSAoaS5lLiBvbmx5IGlmIHRoZSB1c2VyIGlzIGFjdHVhbGx5IGxpc3RlbmluZyB0byB0aGUgZXZlbnRzKS4gV2UgZG8gdGhpcyBiZWNhdXNlXHJcbiAgIC8vIGRlcGVuZGluZyBvbiBob3cgdGhlIHN0cmF0ZWd5IGNhbGN1bGF0ZXMgdGhlIHNjcm9sbGVkIGluZGV4LCBpdCBtYXkgY29tZSBhdCBhIGNvc3QgdG9cclxuICAgLy8gcGVyZm9ybWFuY2UuXHJcbiAgIC8qKiBFbWl0cyB3aGVuIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgZWxlbWVudCB2aXNpYmxlIGluIHRoZSB2aWV3cG9ydCBjaGFuZ2VzLiAqL1xyXG4gICBAT3V0cHV0KCkgc2Nyb2xsZWRJbmRleENoYW5nZTogT2JzZXJ2YWJsZTxudW1iZXI+ID0gbmV3IE9ic2VydmFibGUoXHJcbiAgICAgKG9ic2VydmVyOiBPYnNlcnZlcjxudW1iZXI+KSA9PlxyXG4gICAgICAgdGhpcy5fc2Nyb2xsU3RyYXRlZ3kuc2Nyb2xsZWRJbmRleENoYW5nZS5zdWJzY3JpYmUoaW5kZXggPT5cclxuICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PlxyXG4gICAgICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiBvYnNlcnZlci5uZXh0KGluZGV4KSlcclxuICAgICAgICAgKVxyXG4gICAgICAgKVxyXG4gICApO1xyXG4gXHJcbiAgIC8qKiBUaGUgZWxlbWVudCB0aGF0IHdyYXBzIHRoZSByZW5kZXJlZCBjb250ZW50LiAqL1xyXG4gICBAVmlld0NoaWxkKFwiY29udGVudFdyYXBwZXJcIiwgeyBzdGF0aWM6IHRydWUgfSkgX2NvbnRlbnRXcmFwcGVyOiBFbGVtZW50UmVmPFxyXG4gICAgIEhUTUxFbGVtZW50XHJcbiAgID47XHJcbiBcclxuICAgLyoqIEEgc3RyZWFtIHRoYXQgZW1pdHMgd2hlbmV2ZXIgdGhlIHJlbmRlcmVkIHJhbmdlIGNoYW5nZXMuICovXHJcbiAgIHJlbmRlcmVkUmFuZ2VTdHJlYW06IE9ic2VydmFibGU8TGlzdFJhbmdlPiA9IHRoaXMuX3JlbmRlcmVkUmFuZ2VTdWJqZWN0O1xyXG4gXHJcbiAgIC8qKlxyXG4gICAgKiBUaGUgdG90YWwgc2l6ZSBvZiBhbGwgY29udGVudCAoaW4gcGl4ZWxzKSwgaW5jbHVkaW5nIGNvbnRlbnQgdGhhdCBpcyBub3QgY3VycmVudGx5IHJlbmRlcmVkLlxyXG4gICAgKi9cclxuICAgcHJpdmF0ZSBfdG90YWxDb250ZW50U2l6ZSA9IDA7XHJcbiBcclxuICAgLyoqIEEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgYHN0eWxlLndpZHRoYCBwcm9wZXJ0eSB2YWx1ZSB0byBiZSB1c2VkIGZvciB0aGUgc3BhY2VyIGVsZW1lbnQuICovXHJcbiAgIF90b3RhbENvbnRlbnRXaWR0aCA9IFwiXCI7XHJcbiBcclxuICAgLyoqIEEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgYHN0eWxlLmhlaWdodGAgcHJvcGVydHkgdmFsdWUgdG8gYmUgdXNlZCBmb3IgdGhlIHNwYWNlciBlbGVtZW50LiAqL1xyXG4gICBfdG90YWxDb250ZW50SGVpZ2h0ID0gXCJcIjtcclxuIFxyXG4gICAvKipcclxuICAgICogVGhlIENTUyB0cmFuc2Zvcm0gYXBwbGllZCB0byB0aGUgcmVuZGVyZWQgc3Vic2V0IG9mIGl0ZW1zIHNvIHRoYXQgdGhleSBhcHBlYXIgd2l0aGluIHRoZSBib3VuZHNcclxuICAgICogb2YgdGhlIHZpc2libGUgdmlld3BvcnQuXHJcbiAgICAqL1xyXG4gICBwcml2YXRlIF9yZW5kZXJlZENvbnRlbnRUcmFuc2Zvcm06IHN0cmluZztcclxuIFxyXG4gICAvKiogVGhlIGN1cnJlbnRseSByZW5kZXJlZCByYW5nZSBvZiBpbmRpY2VzLiAqL1xyXG4gICBwcml2YXRlIF9yZW5kZXJlZFJhbmdlOiBMaXN0UmFuZ2UgPSB7IHN0YXJ0OiAwLCBlbmQ6IDAgfTtcclxuIFxyXG4gICAvKiogVGhlIGxlbmd0aCBvZiB0aGUgZGF0YSBib3VuZCB0byB0aGlzIHZpZXdwb3J0IChpbiBudW1iZXIgb2YgaXRlbXMpLiAqL1xyXG4gICBwcml2YXRlIF9kYXRhTGVuZ3RoID0gMDtcclxuIFxyXG4gICAvKiogVGhlIHNpemUgb2YgdGhlIHZpZXdwb3J0IChpbiBwaXhlbHMpLiAqL1xyXG4gICBwcml2YXRlIF92aWV3cG9ydFNpemUgPSAwO1xyXG4gXHJcbiAgIC8qKiB0aGUgY3VycmVudGx5IGF0dGFjaGVkIENka1ZpcnR1YWxTY3JvbGxSZXBlYXRlci4gKi9cclxuICAgcHJpdmF0ZSBfZm9yT2Y6IENka1ZpcnR1YWxTY3JvbGxSZXBlYXRlcjxhbnk+IHwgbnVsbDtcclxuIFxyXG4gICAvKiogVGhlIGxhc3QgcmVuZGVyZWQgY29udGVudCBvZmZzZXQgdGhhdCB3YXMgc2V0LiAqL1xyXG4gICBwcml2YXRlIF9yZW5kZXJlZENvbnRlbnRPZmZzZXQgPSAwO1xyXG4gXHJcbiAgIC8qKlxyXG4gICAgKiBXaGV0aGVyIHRoZSBsYXN0IHJlbmRlcmVkIGNvbnRlbnQgb2Zmc2V0IHdhcyB0byB0aGUgZW5kIG9mIHRoZSBjb250ZW50IChhbmQgdGhlcmVmb3JlIG5lZWRzIHRvXHJcbiAgICAqIGJlIHJld3JpdHRlbiBhcyBhbiBvZmZzZXQgdG8gdGhlIHN0YXJ0IG9mIHRoZSBjb250ZW50KS5cclxuICAgICovXHJcbiAgIHByaXZhdGUgX3JlbmRlcmVkQ29udGVudE9mZnNldE5lZWRzUmV3cml0ZSA9IGZhbHNlO1xyXG4gXHJcbiAgIC8qKiBXaGV0aGVyIHRoZXJlIGlzIGEgcGVuZGluZyBjaGFuZ2UgZGV0ZWN0aW9uIGN5Y2xlLiAqL1xyXG4gICBwcml2YXRlIF9pc0NoYW5nZURldGVjdGlvblBlbmRpbmcgPSBmYWxzZTtcclxuIFxyXG4gICAvKiogQSBsaXN0IG9mIGZ1bmN0aW9ucyB0byBydW4gYWZ0ZXIgdGhlIG5leHQgY2hhbmdlIGRldGVjdGlvbiBjeWNsZS4gKi9cclxuICAgcHJpdmF0ZSBfcnVuQWZ0ZXJDaGFuZ2VEZXRlY3Rpb246IEZ1bmN0aW9uW10gPSBbXTtcclxuIFxyXG4gICAvKiogU3Vic2NyaXB0aW9uIHRvIGNoYW5nZXMgaW4gdGhlIHZpZXdwb3J0IHNpemUuICovXHJcbiAgIHByaXZhdGUgX3ZpZXdwb3J0Q2hhbmdlcyA9IFN1YnNjcmlwdGlvbi5FTVBUWTtcclxuIFxyXG4gICBjb25zdHJ1Y3RvcihcclxuICAgICBwdWJsaWMgb3ZlcnJpZGUgZWxlbWVudFJlZjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4sXHJcbiAgICAgcHJpdmF0ZSBfY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgIG5nWm9uZTogTmdab25lLFxyXG4gICAgIEBPcHRpb25hbCgpXHJcbiAgICAgQEluamVjdChWSVJUVUFMX1NDUk9MTF9TVFJBVEVHWSlcclxuICAgICBwcml2YXRlIF9zY3JvbGxTdHJhdGVneTogVmlydHVhbFNjcm9sbFN0cmF0ZWd5LFxyXG4gICAgIEBPcHRpb25hbCgpIGRpcjogRGlyZWN0aW9uYWxpdHksXHJcbiAgICAgc2Nyb2xsRGlzcGF0Y2hlcjogU2Nyb2xsRGlzcGF0Y2hlcixcclxuICAgICB2aWV3cG9ydFJ1bGVyOiBWaWV3cG9ydFJ1bGVyLFxyXG4gICAgIHByaXZhdGUgYW5uYUd0U2VydmljZTogQW5uYUdlbmVyaWNUYWJsZVNlcnZpY2VcclxuICAgKSB7XHJcbiAgICAgc3VwZXIoZWxlbWVudFJlZiwgc2Nyb2xsRGlzcGF0Y2hlciwgbmdab25lLCBkaXIpO1xyXG4gXHJcbiAgICAgaWYgKCFfc2Nyb2xsU3RyYXRlZ3kpIHtcclxuICAgICAgIHRocm93IEVycm9yKFxyXG4gICAgICAgICAnRXJyb3I6IGNkay12aXJ0dWFsLXNjcm9sbC12aWV3cG9ydCByZXF1aXJlcyB0aGUgXCJpdGVtU2l6ZVwiIHByb3BlcnR5IHRvIGJlIHNldC4nXHJcbiAgICAgICApO1xyXG4gICAgIH1cclxuIFxyXG4gICAgIHRoaXMuX3ZpZXdwb3J0Q2hhbmdlcyA9IHZpZXdwb3J0UnVsZXIuY2hhbmdlKCkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgIHRoaXMuY2hlY2tWaWV3cG9ydFNpemUoKTtcclxuICAgICB9KTtcclxuICAgfVxyXG4gXHJcbiAgIG92ZXJyaWRlIG5nT25Jbml0KCkge1xyXG4gICAgIHN1cGVyLm5nT25Jbml0KCk7XHJcbiBcclxuICAgICAvLyBJdCdzIHN0aWxsIHRvbyBlYXJseSB0byBtZWFzdXJlIHRoZSB2aWV3cG9ydCBhdCB0aGlzIHBvaW50LiBEZWZlcnJpbmcgd2l0aCBhIHByb21pc2UgYWxsb3dzXHJcbiAgICAgLy8gdGhlIFZpZXdwb3J0IHRvIGJlIHJlbmRlcmVkIHdpdGggdGhlIGNvcnJlY3Qgc2l6ZSBiZWZvcmUgd2UgbWVhc3VyZS4gV2UgcnVuIHRoaXMgb3V0c2lkZSB0aGVcclxuICAgICAvLyB6b25lIHRvIGF2b2lkIGNhdXNpbmcgbW9yZSBjaGFuZ2UgZGV0ZWN0aW9uIGN5Y2xlcy4gV2UgaGFuZGxlIHRoZSBjaGFuZ2UgZGV0ZWN0aW9uIGxvb3BcclxuICAgICAvLyBvdXJzZWx2ZXMgaW5zdGVhZC5cclxuICAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PlxyXG4gICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XHJcbiAgICAgICAgIHRoaXMuX21lYXN1cmVWaWV3cG9ydFNpemUoKTtcclxuICAgICAgICAgdGhpcy5fc2Nyb2xsU3RyYXRlZ3kuYXR0YWNoKHRoaXMgYXMgYW55KTtcclxuIFxyXG4gICAgICAgICB0aGlzLmVsZW1lbnRTY3JvbGxlZCgpXHJcbiAgICAgICAgICAgLnBpcGUoXHJcbiAgICAgICAgICAgICAvLyBTdGFydCBvZmYgd2l0aCBhIGZha2Ugc2Nyb2xsIGV2ZW50IHNvIHdlIHByb3Blcmx5IGRldGVjdCBvdXIgaW5pdGlhbCBwb3NpdGlvbi5cclxuICAgICAgICAgICAgIHN0YXJ0V2l0aChudWxsKSxcclxuICAgICAgICAgICAgIC8vIENvbGxlY3QgbXVsdGlwbGUgZXZlbnRzIGludG8gb25lIHVudGlsIHRoZSBuZXh0IGFuaW1hdGlvbiBmcmFtZS4gVGhpcyB3YXkgaWZcclxuICAgICAgICAgICAgIC8vIHRoZXJlIGFyZSBtdWx0aXBsZSBzY3JvbGwgZXZlbnRzIGluIHRoZSBzYW1lIGZyYW1lIHdlIG9ubHkgbmVlZCB0byByZWNoZWNrXHJcbiAgICAgICAgICAgICAvLyBvdXIgbGF5b3V0IG9uY2UuXHJcbiAgICAgICAgICAgICBhdWRpdFRpbWUoMCwgU0NST0xMX1NDSEVEVUxFUilcclxuICAgICAgICAgICApXHJcbiAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7IHRoaXMuX3Njcm9sbFN0cmF0ZWd5Lm9uQ29udGVudFNjcm9sbGVkKCk7IHRoaXMuYW5uYUd0U2VydmljZS52aXJ0dWFsU2Nyb2xsU3ViamVjdC5uZXh0KHRydWUpO30pO1xyXG4gXHJcbiAgICAgICAgIHRoaXMuX21hcmtDaGFuZ2VEZXRlY3Rpb25OZWVkZWQoKTtcclxuICAgICAgIH0pXHJcbiAgICAgKTtcclxuICAgfVxyXG4gXHJcbiAgIG92ZXJyaWRlIG5nT25EZXN0cm95KCkge1xyXG4gICAgIHRoaXMuZGV0YWNoKCk7XHJcbiAgICAgdGhpcy5fc2Nyb2xsU3RyYXRlZ3kuZGV0YWNoKCk7XHJcbiBcclxuICAgICAvLyBDb21wbGV0ZSBhbGwgc3ViamVjdHNcclxuICAgICB0aGlzLl9yZW5kZXJlZFJhbmdlU3ViamVjdC5jb21wbGV0ZSgpO1xyXG4gICAgIHRoaXMuX2RldGFjaGVkU3ViamVjdC5jb21wbGV0ZSgpO1xyXG4gICAgIHRoaXMuX3ZpZXdwb3J0Q2hhbmdlcy51bnN1YnNjcmliZSgpO1xyXG4gXHJcbiAgICAgc3VwZXIubmdPbkRlc3Ryb3koKTtcclxuICAgfVxyXG4gXHJcbiAgIC8qKiBBdHRhY2hlcyBhIGBDZGtWaXJ0dWFsU2Nyb2xsUmVwZWF0ZXJgIHRvIHRoaXMgdmlld3BvcnQuICovXHJcbiAgIGF0dGFjaChmb3JPZjogQ2RrVmlydHVhbFNjcm9sbFJlcGVhdGVyPGFueT4pIHtcclxuICAgICBpZiAodGhpcy5fZm9yT2YpIHtcclxuICAgICAgIHRocm93IEVycm9yKFwiQ2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0IGlzIGFscmVhZHkgYXR0YWNoZWQuXCIpO1xyXG4gICAgIH1cclxuIFxyXG4gICAgIC8vIFN1YnNjcmliZSB0byB0aGUgZGF0YSBzdHJlYW0gb2YgdGhlIENka1ZpcnR1YWxGb3JPZiB0byBrZWVwIHRyYWNrIG9mIHdoZW4gdGhlIGRhdGEgbGVuZ3RoXHJcbiAgICAgLy8gY2hhbmdlcy4gUnVuIG91dHNpZGUgdGhlIHpvbmUgdG8gYXZvaWQgdHJpZ2dlcmluZyBjaGFuZ2UgZGV0ZWN0aW9uLCBzaW5jZSB3ZSdyZSBtYW5hZ2luZyB0aGVcclxuICAgICAvLyBjaGFuZ2UgZGV0ZWN0aW9uIGxvb3Agb3Vyc2VsdmVzLlxyXG4gICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcclxuICAgICAgIHRoaXMuX2Zvck9mID0gZm9yT2Y7XHJcbiAgICAgICB0aGlzLl9mb3JPZi5kYXRhU3RyZWFtXHJcbiAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXRhY2hlZFN1YmplY3QpKVxyXG4gICAgICAgICAuc3Vic2NyaWJlKGRhdGEgPT4ge1xyXG4gICAgICAgICAgIGNvbnN0IG5ld0xlbmd0aCA9IGRhdGEubGVuZ3RoO1xyXG4gICAgICAgICAgIGlmIChuZXdMZW5ndGggIT09IHRoaXMuX2RhdGFMZW5ndGgpIHtcclxuICAgICAgICAgICAgIHRoaXMuX2RhdGFMZW5ndGggPSBuZXdMZW5ndGg7XHJcbiAgICAgICAgICAgICB0aGlzLl9zY3JvbGxTdHJhdGVneS5vbkRhdGFMZW5ndGhDaGFuZ2VkKCk7XHJcbiAgICAgICAgICAgfVxyXG4gICAgICAgICAgIHRoaXMuX2RvQ2hhbmdlRGV0ZWN0aW9uKCk7XHJcbiAgICAgICAgIH0pO1xyXG4gICAgIH0pO1xyXG4gICB9XHJcbiBcclxuICAgLyoqIERldGFjaGVzIHRoZSBjdXJyZW50IGBDZGtWaXJ0dWFsRm9yT2ZgLiAqL1xyXG4gICBkZXRhY2goKSB7XHJcbiAgICAgdGhpcy5fZm9yT2YgPSBudWxsO1xyXG4gICAgIHRoaXMuX2RldGFjaGVkU3ViamVjdC5uZXh0KCk7XHJcbiAgIH1cclxuIFxyXG4gICAvKiogR2V0cyB0aGUgbGVuZ3RoIG9mIHRoZSBkYXRhIGJvdW5kIHRvIHRoaXMgdmlld3BvcnQgKGluIG51bWJlciBvZiBpdGVtcykuICovXHJcbiAgIGdldERhdGFMZW5ndGgoKTogbnVtYmVyIHtcclxuICAgICByZXR1cm4gdGhpcy5fZGF0YUxlbmd0aDtcclxuICAgfVxyXG4gXHJcbiAgIC8qKiBHZXRzIHRoZSBzaXplIG9mIHRoZSB2aWV3cG9ydCAoaW4gcGl4ZWxzKS4gKi9cclxuICAgZ2V0Vmlld3BvcnRTaXplKCk6IG51bWJlciB7XHJcbiAgICAgcmV0dXJuIHRoaXMuX3ZpZXdwb3J0U2l6ZTtcclxuICAgfVxyXG4gXHJcbiAgIC8vIFRPRE8obW1hbGVyYmEpOiBUaGlzIGlzIHRlY2huaWNhbGx5IG91dCBvZiBzeW5jIHdpdGggd2hhdCdzIHJlYWxseSByZW5kZXJlZCB1bnRpbCBhIHJlbmRlclxyXG4gICAvLyBjeWNsZSBoYXBwZW5zLiBJJ20gYmVpbmcgY2FyZWZ1bCB0byBvbmx5IGNhbGwgaXQgYWZ0ZXIgdGhlIHJlbmRlciBjeWNsZSBpcyBjb21wbGV0ZSBhbmQgYmVmb3JlXHJcbiAgIC8vIHNldHRpbmcgaXQgdG8gc29tZXRoaW5nIGVsc2UsIGJ1dCBpdHMgZXJyb3IgcHJvbmUgYW5kIHNob3VsZCBwcm9iYWJseSBiZSBzcGxpdCBpbnRvXHJcbiAgIC8vIGBwZW5kaW5nUmFuZ2VgIGFuZCBgcmVuZGVyZWRSYW5nZWAsIHRoZSBsYXR0ZXIgcmVmbGVjdGluZyB3aGF0cyBhY3R1YWxseSBpbiB0aGUgRE9NLlxyXG4gXHJcbiAgIC8qKiBHZXQgdGhlIGN1cnJlbnQgcmVuZGVyZWQgcmFuZ2Ugb2YgaXRlbXMuICovXHJcbiAgIGdldFJlbmRlcmVkUmFuZ2UoKTogTGlzdFJhbmdlIHtcclxuICAgICByZXR1cm4gdGhpcy5fcmVuZGVyZWRSYW5nZTtcclxuICAgfVxyXG4gXHJcbiAgIC8qKlxyXG4gICAgKiBTZXRzIHRoZSB0b3RhbCBzaXplIG9mIGFsbCBjb250ZW50IChpbiBwaXhlbHMpLCBpbmNsdWRpbmcgY29udGVudCB0aGF0IGlzIG5vdCBjdXJyZW50bHlcclxuICAgICogcmVuZGVyZWQuXHJcbiAgICAqL1xyXG4gICBzZXRUb3RhbENvbnRlbnRTaXplKHNpemU6IG51bWJlcikge1xyXG4gICAgIGlmICh0aGlzLl90b3RhbENvbnRlbnRTaXplICE9PSBzaXplKSB7XHJcbiAgICAgICB0aGlzLl90b3RhbENvbnRlbnRTaXplID0gc2l6ZTtcclxuICAgICAgIHRoaXMuX2NhbGN1bGF0ZVNwYWNlclNpemUoKTtcclxuICAgICAgIHRoaXMuX21hcmtDaGFuZ2VEZXRlY3Rpb25OZWVkZWQoKTtcclxuICAgICB9XHJcbiAgIH1cclxuIFxyXG4gICAvKiogU2V0cyB0aGUgY3VycmVudGx5IHJlbmRlcmVkIHJhbmdlIG9mIGluZGljZXMuICovXHJcbiAgIHNldFJlbmRlcmVkUmFuZ2UocmFuZ2U6IExpc3RSYW5nZSkge1xyXG4gICAgIGlmICghcmFuZ2VzRXF1YWwodGhpcy5fcmVuZGVyZWRSYW5nZSwgcmFuZ2UpKSB7XHJcbiAgICAgICB0aGlzLl9yZW5kZXJlZFJhbmdlU3ViamVjdC5uZXh0KCh0aGlzLl9yZW5kZXJlZFJhbmdlID0gcmFuZ2UpKTtcclxuICAgICAgIHRoaXMuX21hcmtDaGFuZ2VEZXRlY3Rpb25OZWVkZWQoKCkgPT5cclxuICAgICAgICAgdGhpcy5fc2Nyb2xsU3RyYXRlZ3kub25Db250ZW50UmVuZGVyZWQoKVxyXG4gICAgICAgKTtcclxuICAgICB9XHJcbiAgIH1cclxuIFxyXG4gICAvKipcclxuICAgICogR2V0cyB0aGUgb2Zmc2V0IGZyb20gdGhlIHN0YXJ0IG9mIHRoZSB2aWV3cG9ydCB0byB0aGUgc3RhcnQgb2YgdGhlIHJlbmRlcmVkIGRhdGEgKGluIHBpeGVscykuXHJcbiAgICAqL1xyXG4gICBnZXRPZmZzZXRUb1JlbmRlcmVkQ29udGVudFN0YXJ0KCk6IG51bWJlciB8IG51bGwge1xyXG4gICAgIHJldHVybiB0aGlzLl9yZW5kZXJlZENvbnRlbnRPZmZzZXROZWVkc1Jld3JpdGVcclxuICAgICAgID8gbnVsbFxyXG4gICAgICAgOiB0aGlzLl9yZW5kZXJlZENvbnRlbnRPZmZzZXQ7XHJcbiAgIH1cclxuIFxyXG4gICAvKipcclxuICAgICogU2V0cyB0aGUgb2Zmc2V0IGZyb20gdGhlIHN0YXJ0IG9mIHRoZSB2aWV3cG9ydCB0byBlaXRoZXIgdGhlIHN0YXJ0IG9yIGVuZCBvZiB0aGUgcmVuZGVyZWQgZGF0YVxyXG4gICAgKiAoaW4gcGl4ZWxzKS5cclxuICAgICovXHJcbiAgIHNldFJlbmRlcmVkQ29udGVudE9mZnNldChvZmZzZXQ6IG51bWJlcikge1xyXG4gICAgIGxldCB0b3AgPSBgJHtOdW1iZXIob2Zmc2V0KX1weGA7XHJcbiAgICAgdGhpcy5fcmVuZGVyZWRDb250ZW50T2Zmc2V0ID0gb2Zmc2V0O1xyXG4gICAgIGlmICh0aGlzLl9yZW5kZXJlZENvbnRlbnRUcmFuc2Zvcm0gIT0gdG9wKSB7XHJcbiAgICAgICAvLyBXZSBrbm93IHRoaXMgdmFsdWUgaXMgc2FmZSBiZWNhdXNlIHdlIHBhcnNlIGBvZmZzZXRgIHdpdGggYE51bWJlcigpYCBiZWZvcmUgcGFzc2luZyBpdFxyXG4gICAgICAgLy8gaW50byB0aGUgc3RyaW5nLlxyXG4gICAgICAgdGhpcy5fcmVuZGVyZWRDb250ZW50VHJhbnNmb3JtID0gdG9wO1xyXG4gICAgICAgdGhpcy5fbWFya0NoYW5nZURldGVjdGlvbk5lZWRlZCgoKSA9PiB7XHJcbiAgICAgICAgIGlmICh0aGlzLl9yZW5kZXJlZENvbnRlbnRPZmZzZXROZWVkc1Jld3JpdGUpIHtcclxuICAgICAgICAgICB0aGlzLl9yZW5kZXJlZENvbnRlbnRPZmZzZXQgLT0gdGhpcy5tZWFzdXJlUmVuZGVyZWRDb250ZW50U2l6ZSgpO1xyXG4gICAgICAgICAgIHRoaXMuX3JlbmRlcmVkQ29udGVudE9mZnNldE5lZWRzUmV3cml0ZSA9IGZhbHNlO1xyXG4gICAgICAgICAgIHRoaXMuc2V0UmVuZGVyZWRDb250ZW50T2Zmc2V0KHRoaXMuX3JlbmRlcmVkQ29udGVudE9mZnNldCk7XHJcbiAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgdGhpcy5fc2Nyb2xsU3RyYXRlZ3kub25SZW5kZXJlZE9mZnNldENoYW5nZWQoKTtcclxuICAgICAgICAgfVxyXG4gICAgICAgfSk7XHJcbiAgICAgfVxyXG4gICB9XHJcbiBcclxuICAgLyoqXHJcbiAgICAqIFNjcm9sbHMgdG8gdGhlIGdpdmVuIG9mZnNldCBmcm9tIHRoZSBzdGFydCBvZiB0aGUgdmlld3BvcnQuIFBsZWFzZSBub3RlIHRoYXQgdGhpcyBpcyBub3QgYWx3YXlzXHJcbiAgICAqIHRoZSBzYW1lIGFzIHNldHRpbmcgYHNjcm9sbFRvcGAgb3IgYHNjcm9sbExlZnRgLiBJbiBhIGhvcml6b250YWwgdmlld3BvcnQgd2l0aCByaWdodC10by1sZWZ0XHJcbiAgICAqIGRpcmVjdGlvbiwgdGhpcyB3b3VsZCBiZSB0aGUgZXF1aXZhbGVudCBvZiBzZXR0aW5nIGEgZmljdGlvbmFsIGBzY3JvbGxSaWdodGAgcHJvcGVydHkuXHJcbiAgICAqIEBwYXJhbSBvZmZzZXQgVGhlIG9mZnNldCB0byBzY3JvbGwgdG8uXHJcbiAgICAqIEBwYXJhbSBiZWhhdmlvciBUaGUgU2Nyb2xsQmVoYXZpb3IgdG8gdXNlIHdoZW4gc2Nyb2xsaW5nLiBEZWZhdWx0IGlzIGJlaGF2aW9yIGlzIGBhdXRvYC5cclxuICAgICovXHJcbiAgIHNjcm9sbFRvT2Zmc2V0KG9mZnNldDogbnVtYmVyLCBiZWhhdmlvcjogU2Nyb2xsQmVoYXZpb3IgPSBcImF1dG9cIikge1xyXG4gICAgIGNvbnN0IG9wdGlvbnM6IEV4dGVuZGVkU2Nyb2xsVG9PcHRpb25zID0geyBiZWhhdmlvciwgdG9wOiBvZmZzZXQgfTtcclxuICAgICB0aGlzLnNjcm9sbFRvKG9wdGlvbnMpO1xyXG4gICB9XHJcbiBcclxuICAgLyoqXHJcbiAgICAqIFNjcm9sbHMgdG8gdGhlIG9mZnNldCBmb3IgdGhlIGdpdmVuIGluZGV4LlxyXG4gICAgKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IG9mIHRoZSBlbGVtZW50IHRvIHNjcm9sbCB0by5cclxuICAgICogQHBhcmFtIGJlaGF2aW9yIFRoZSBTY3JvbGxCZWhhdmlvciB0byB1c2Ugd2hlbiBzY3JvbGxpbmcuIERlZmF1bHQgaXMgYmVoYXZpb3IgaXMgYGF1dG9gLlxyXG4gICAgKi9cclxuICAgc2Nyb2xsVG9JbmRleChpbmRleDogbnVtYmVyLCBiZWhhdmlvcjogU2Nyb2xsQmVoYXZpb3IgPSBcImF1dG9cIikge1xyXG4gICAgIHRoaXMuX3Njcm9sbFN0cmF0ZWd5LnNjcm9sbFRvSW5kZXgoaW5kZXgsIGJlaGF2aW9yKTtcclxuICAgfVxyXG4gXHJcbiAgIC8qKlxyXG4gICAgKiBHZXRzIHRoZSBjdXJyZW50IHNjcm9sbCBvZmZzZXQgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIHZpZXdwb3J0IChpbiBwaXhlbHMpLlxyXG4gICAgKiBAcGFyYW0gZnJvbSBUaGUgZWRnZSB0byBtZWFzdXJlIHRoZSBvZmZzZXQgZnJvbS4gRGVmYXVsdHMgdG8gJ3RvcCcgaW4gdmVydGljYWwgbW9kZSBhbmQgJ3N0YXJ0J1xyXG4gICAgKiAgICAgaW4gaG9yaXpvbnRhbCBtb2RlLlxyXG4gICAgKi9cclxuICAvLyAgQ0hBTkdFU0BBTk5BTElCIGFkZGVkIG92ZXJyaWRlIHRvIGZ1bmN0aW9uc1xyXG4gICBvdmVycmlkZSBtZWFzdXJlU2Nyb2xsT2Zmc2V0KFxyXG4gICAgIGZyb20/OiBcInRvcFwiIHwgXCJsZWZ0XCIgfCBcInJpZ2h0XCIgfCBcImJvdHRvbVwiIHwgXCJzdGFydFwiIHwgXCJlbmRcIlxyXG4gICApOiBudW1iZXIge1xyXG4gICAgIHJldHVybiBmcm9tXHJcbiAgICAgICA/IHN1cGVyLm1lYXN1cmVTY3JvbGxPZmZzZXQoZnJvbSlcclxuICAgICAgIDogc3VwZXIubWVhc3VyZVNjcm9sbE9mZnNldChcInRvcFwiKTtcclxuICAgfVxyXG4gXHJcbiAgIC8qKiBNZWFzdXJlIHRoZSBjb21iaW5lZCBzaXplIG9mIGFsbCBvZiB0aGUgcmVuZGVyZWQgaXRlbXMuICovXHJcbiAgIG1lYXN1cmVSZW5kZXJlZENvbnRlbnRTaXplKCk6IG51bWJlciB7XHJcbiAgICAgY29uc3QgY29udGVudEVsID0gdGhpcy5fY29udGVudFdyYXBwZXIubmF0aXZlRWxlbWVudDtcclxuICAgICByZXR1cm4gY29udGVudEVsLm9mZnNldEhlaWdodDtcclxuICAgfVxyXG4gXHJcbiAgIC8qKlxyXG4gICAgKiBNZWFzdXJlIHRoZSB0b3RhbCBjb21iaW5lZCBzaXplIG9mIHRoZSBnaXZlbiByYW5nZS4gVGhyb3dzIGlmIHRoZSByYW5nZSBpbmNsdWRlcyBpdGVtcyB0aGF0IGFyZVxyXG4gICAgKiBub3QgcmVuZGVyZWQuXHJcbiAgICAqL1xyXG4gICBtZWFzdXJlUmFuZ2VTaXplKHJhbmdlOiBMaXN0UmFuZ2UpOiBudW1iZXIge1xyXG4gICAgIGlmICghdGhpcy5fZm9yT2YpIHtcclxuICAgICAgIHJldHVybiAwO1xyXG4gICAgIH1cclxuICAgICByZXR1cm4gdGhpcy5fZm9yT2YubWVhc3VyZVJhbmdlU2l6ZShyYW5nZSwgdGhpcy5vcmllbnRhdGlvbik7XHJcbiAgIH1cclxuIFxyXG4gICAvKiogVXBkYXRlIHRoZSB2aWV3cG9ydCBkaW1lbnNpb25zIGFuZCByZS1yZW5kZXIuICovXHJcbiAgIGNoZWNrVmlld3BvcnRTaXplKCkge1xyXG4gICAgIC8vIFRPRE86IENsZWFudXAgbGF0ZXIgd2hlbiBhZGQgbG9naWMgZm9yIGhhbmRsaW5nIGNvbnRlbnQgcmVzaXplXHJcbiAgICAgdGhpcy5fbWVhc3VyZVZpZXdwb3J0U2l6ZSgpO1xyXG4gICAgIHRoaXMuX3Njcm9sbFN0cmF0ZWd5Lm9uRGF0YUxlbmd0aENoYW5nZWQoKTtcclxuICAgfVxyXG4gXHJcbiAgIC8qKiBNZWFzdXJlIHRoZSB2aWV3cG9ydCBzaXplLiAqL1xyXG4gICBwcml2YXRlIF9tZWFzdXJlVmlld3BvcnRTaXplKCkge1xyXG4gICAgIGNvbnN0IHZpZXdwb3J0RWwgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcclxuICAgICB0aGlzLl92aWV3cG9ydFNpemUgPSB2aWV3cG9ydEVsLmNsaWVudEhlaWdodDtcclxuICAgfVxyXG4gXHJcbiAgIC8qKiBRdWV1ZSB1cCBjaGFuZ2UgZGV0ZWN0aW9uIHRvIHJ1bi4gKi9cclxuICAgcHJpdmF0ZSBfbWFya0NoYW5nZURldGVjdGlvbk5lZWRlZChydW5BZnRlcj86IEZ1bmN0aW9uKSB7XHJcbiAgICAgaWYgKHJ1bkFmdGVyKSB7XHJcbiAgICAgICB0aGlzLl9ydW5BZnRlckNoYW5nZURldGVjdGlvbi5wdXNoKHJ1bkFmdGVyKTtcclxuICAgICB9XHJcbiBcclxuICAgICAvLyBVc2UgYSBQcm9taXNlIHRvIGJhdGNoIHRvZ2V0aGVyIGNhbGxzIHRvIGBfZG9DaGFuZ2VEZXRlY3Rpb25gLiBUaGlzIHdheSBpZiB3ZSBzZXQgYSBidW5jaCBvZlxyXG4gICAgIC8vIHByb3BlcnRpZXMgc2VxdWVudGlhbGx5IHdlIG9ubHkgaGF2ZSB0byBydW4gYF9kb0NoYW5nZURldGVjdGlvbmAgb25jZSBhdCB0aGUgZW5kLlxyXG4gICAgIGlmICghdGhpcy5faXNDaGFuZ2VEZXRlY3Rpb25QZW5kaW5nKSB7XHJcbiAgICAgICB0aGlzLl9pc0NoYW5nZURldGVjdGlvblBlbmRpbmcgPSB0cnVlO1xyXG4gICAgICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT5cclxuICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XHJcbiAgICAgICAgICAgdGhpcy5fZG9DaGFuZ2VEZXRlY3Rpb24oKTtcclxuICAgICAgICAgfSlcclxuICAgICAgICk7XHJcbiAgICAgfVxyXG4gICB9XHJcbiBcclxuICAgLyoqIFJ1biBjaGFuZ2UgZGV0ZWN0aW9uLiAqL1xyXG4gICBwcml2YXRlIF9kb0NoYW5nZURldGVjdGlvbigpIHtcclxuICAgICB0aGlzLl9pc0NoYW5nZURldGVjdGlvblBlbmRpbmcgPSBmYWxzZTtcclxuIFxyXG4gICAgIC8vIEFwcGx5IHRoZSBjb250ZW50IHRyYW5zZm9ybS4gVGhlIHRyYW5zZm9ybSBjYW4ndCBiZSBzZXQgdmlhIGFuIEFuZ3VsYXIgYmluZGluZyBiZWNhdXNlXHJcbiAgICAgLy8gYnlwYXNzU2VjdXJpdHlUcnVzdFN0eWxlIGlzIGJhbm5lZCBpbiBHb29nbGUuIEhvd2V2ZXIgdGhlIHZhbHVlIGlzIHNhZmUsIGl0J3MgY29tcG9zZWQgb2ZcclxuICAgICAvLyBzdHJpbmcgbGl0ZXJhbHMsIGEgdmFyaWFibGUgdGhhdCBjYW4gb25seSBiZSAnWCcgb3IgJ1knLCBhbmQgdXNlciBpbnB1dCB0aGF0IGlzIHJ1biB0aHJvdWdoXHJcbiAgICAgLy8gdGhlIGBOdW1iZXJgIGZ1bmN0aW9uIGZpcnN0IHRvIGNvZXJjZSBpdCB0byBhIG51bWVyaWMgdmFsdWUuXHJcbiAgICAgdGhpcy5fY29udGVudFdyYXBwZXIubmF0aXZlRWxlbWVudC5zdHlsZS50b3AgPSB0aGlzLl9yZW5kZXJlZENvbnRlbnRUcmFuc2Zvcm07XHJcbiAgICAgLy8gQXBwbHkgY2hhbmdlcyB0byBBbmd1bGFyIGJpbmRpbmdzLiBOb3RlOiBXZSBtdXN0IGNhbGwgYG1hcmtGb3JDaGVja2AgdG8gcnVuIGNoYW5nZSBkZXRlY3Rpb25cclxuICAgICAvLyBmcm9tIHRoZSByb290LCBzaW5jZSB0aGUgcmVwZWF0ZWQgaXRlbXMgYXJlIGNvbnRlbnQgcHJvamVjdGVkIGluLiBDYWxsaW5nIGBkZXRlY3RDaGFuZ2VzYFxyXG4gICAgIC8vIGluc3RlYWQgZG9lcyBub3QgcHJvcGVybHkgY2hlY2sgdGhlIHByb2plY3RlZCBjb250ZW50LlxyXG4gICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKSk7XHJcbiBcclxuICAgICBjb25zdCBydW5BZnRlckNoYW5nZURldGVjdGlvbiA9IHRoaXMuX3J1bkFmdGVyQ2hhbmdlRGV0ZWN0aW9uO1xyXG4gICAgIHRoaXMuX3J1bkFmdGVyQ2hhbmdlRGV0ZWN0aW9uID0gW107XHJcbiAgICAgZm9yIChjb25zdCBmbiBvZiBydW5BZnRlckNoYW5nZURldGVjdGlvbikge1xyXG4gICAgICAgZm4oKTtcclxuICAgICB9XHJcbiAgIH1cclxuIFxyXG4gICAvKiogQ2FsY3VsYXRlcyB0aGUgYHN0eWxlLndpZHRoYCBhbmQgYHN0eWxlLmhlaWdodGAgZm9yIHRoZSBzcGFjZXIgZWxlbWVudC4gKi9cclxuICAgcHJpdmF0ZSBfY2FsY3VsYXRlU3BhY2VyU2l6ZSgpIHtcclxuICAgICB0aGlzLl90b3RhbENvbnRlbnRIZWlnaHQgPSBgJHt0aGlzLl90b3RhbENvbnRlbnRTaXplfXB4YDtcclxuICAgICB0aGlzLl90b3RhbENvbnRlbnRXaWR0aCA9IFwiXCI7XHJcbiAgIH1cclxuIH1cclxuICIsIjwhLS1cclxuICBXcmFwIHRoZSByZW5kZXJlZCBjb250ZW50IGluIGFuIGVsZW1lbnQgdGhhdCB3aWxsIGJlIHVzZWQgdG8gb2Zmc2V0IGl0IGJhc2VkIG9uIHRoZSBzY3JvbGxcclxuICBwb3NpdGlvbi5cclxuLS0+XHJcbjxkaXYgI2NvbnRlbnRXcmFwcGVyIGNsYXNzPVwiYW5uYS10YWJsZS12aXJ0dWFsLXNjcm9sbC1jb250ZW50LXdyYXBwZXJcIj5cclxuXHQ8bmctY29udGVudD48L25nLWNvbnRlbnQ+XHJcbjwvZGl2PlxyXG48IS0tXHJcbiAgU3BhY2VyIHVzZWQgdG8gZm9yY2UgdGhlIHNjcm9sbGluZyBjb250YWluZXIgdG8gdGhlIGNvcnJlY3Qgc2l6ZSBmb3IgdGhlICp0b3RhbCogbnVtYmVyIG9mIGl0ZW1zXHJcbiAgc28gdGhhdCB0aGUgc2Nyb2xsYmFyIGNhcHR1cmVzIHRoZSBzaXplIG9mIHRoZSBlbnRpcmUgZGF0YSBzZXQuXHJcbi0tPlxyXG48ZGl2IGNsYXNzPVwiYXBwLXRhYmxlLXZpcnR1YWwtc2Nyb2xsLXNwYWNlclwiIFtzdHlsZS53aWR0aF09XCJfdG90YWxDb250ZW50V2lkdGhcIiBbc3R5bGUuaGVpZ2h0XT1cIl90b3RhbENvbnRlbnRIZWlnaHRcIj5cclxuPC9kaXY+Il19