@annalib/anna-core 23.0.4 → 24.0.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 (176) hide show
  1. package/README.md +7 -3
  2. package/{esm2020 → esm2022}/annalib-anna-core.mjs +4 -4
  3. package/esm2022/lib/anna-core-shared-lib/components/anna-buyer-approval-icon-template/anna-buyer-approval-icon-template.component.mjs +12 -0
  4. package/esm2022/lib/anna-core-shared-lib/components/anna-deleted-order-icon-template/anna-deleted-order-icon-template.component.mjs +11 -0
  5. package/esm2022/lib/anna-core-shared-lib/components/anna-est-icon-template/anna-est-icon-template.component.mjs +11 -0
  6. package/esm2022/lib/anna-core-shared-lib/components/anna-icon-column/anna-icon-column.component.mjs +46 -0
  7. package/esm2022/lib/anna-core-shared-lib/components/anna-live-icon-template/anna-live-icon-template.component.mjs +12 -0
  8. package/esm2022/lib/anna-core-shared-lib/components/anna-no-data/anna-no-data.component.mjs +22 -0
  9. package/esm2022/lib/anna-core-shared-lib/components/anna-notify-icon-template/anna-notify-icon-template.component.mjs +11 -0
  10. package/esm2022/lib/anna-core-shared-lib/components/anna-pay-for-performance-icon-template/anna-pay-for-performance-icon-template.component.mjs +20 -0
  11. package/esm2022/lib/anna-core-shared-lib/components/anna-rejected-icon-template/anna-rejected-icon-template.component.mjs +12 -0
  12. package/esm2022/lib/anna-core-shared-lib/constants/shared.constant.mjs +47 -0
  13. package/esm2022/lib/anna-core-shared-lib/directives/digits-only/digits-only.directive.mjs +266 -0
  14. package/esm2022/lib/anna-core-shared-lib/directives/fixed-rows-popup-table/fixed-rows-popup-table.directive.mjs +46 -0
  15. package/esm2022/lib/anna-core-shared-lib/directives/show-ellipsis-text/show-ellipsis-text.directive.mjs +41 -0
  16. package/esm2022/lib/anna-core-shared-lib/models/anna-generic-data-type.model.mjs +2 -0
  17. package/esm2022/lib/anna-core-shared-lib/models/anna-global-dropdown-config.model.mjs +2 -0
  18. package/esm2022/lib/anna-core-shared-lib/models/anna-non-editable-gt-models.mjs +22 -0
  19. package/esm2022/lib/anna-core-shared-lib/models/anna-sort.model.mjs +7 -0
  20. package/{esm2020 → esm2022}/lib/anna-core-shared-lib/models/anna-tooltip.model.mjs +30 -30
  21. package/esm2022/lib/anna-core-shared-lib/pipes/annaConvertArrayToCommaSeperatedValue.pipe.mjs +39 -0
  22. package/esm2022/lib/anna-core-shared-lib/pipes/annaConvertZeroOrNullOrUndefined.pipe.mjs +27 -0
  23. package/esm2022/lib/anna-core-shared-lib/pipes/annaDateFormatter.pipe.mjs +21 -0
  24. package/esm2022/lib/anna-core-shared-lib/pipes/annaFilterSearchedText.pipe.mjs +53 -0
  25. package/esm2022/lib/anna-core-shared-lib/pipes/annaReplaceChar.pipe.mjs +27 -0
  26. package/esm2022/lib/anna-core-shared-lib/pipes/annaTypeOfData.pipe.mjs +17 -0
  27. package/esm2022/lib/anna-core-shared-lib/services/anna-date-time-format.service.mjs +240 -0
  28. package/esm2022/lib/anna-core-shared-lib/services/anna-filter.service.mjs +1290 -0
  29. package/esm2022/lib/anna-core-shared-lib/services/anna-generic-table.service.mjs +149 -0
  30. package/esm2022/lib/anna-core-shared-lib/services/anna-global-config.service.mjs +135 -0
  31. package/esm2022/lib/anna-core-shared-lib/services/anna-number-format.service.mjs +59 -0
  32. package/esm2022/lib/anna-core-shared-lib/services/anna-persisting-filter.service.mjs +64 -0
  33. package/esm2022/lib/anna-core-shared-lib/services/anna-sort.service.mjs +176 -0
  34. package/esm2022/lib/anna-core.module.mjs +209 -0
  35. package/esm2022/lib/anna-dropdown-lib/components/anna-calendar-filter/anna-calendar-filter.component.mjs +160 -0
  36. package/esm2022/lib/anna-dropdown-lib/components/anna-week-calendar-filter/anna-week-calendar-filter.component.mjs +359 -0
  37. package/esm2022/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-checkbox-filter/anna-column-checkbox-filter.component.mjs +256 -0
  38. package/esm2022/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-date-range-filter/anna-column-date-range-filter.component.mjs +186 -0
  39. package/esm2022/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-slider-filter/anna-column-slider-filter.component.mjs +316 -0
  40. package/esm2022/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-time-filter/anna-column-time-filter.component.mjs +295 -0
  41. package/esm2022/lib/anna-generic-table-lib/components/anna-non-editable-generic-table/anna-non-editable-generic-table.component.mjs +906 -0
  42. package/esm2022/lib/anna-generic-table-lib/components/anna-sort/anna-sort.component.mjs +68 -0
  43. package/esm2022/public-api.mjs +55 -0
  44. package/fesm2022/annalib-anna-core.mjs +5451 -0
  45. package/fesm2022/annalib-anna-core.mjs.map +1 -0
  46. package/index.d.ts +5 -5
  47. package/lib/anna-core-shared-lib/components/anna-buyer-approval-icon-template/anna-buyer-approval-icon-template.component.d.ts +5 -8
  48. package/lib/anna-core-shared-lib/components/anna-deleted-order-icon-template/anna-deleted-order-icon-template.component.d.ts +5 -8
  49. package/lib/anna-core-shared-lib/components/anna-est-icon-template/anna-est-icon-template.component.d.ts +5 -5
  50. package/lib/anna-core-shared-lib/components/anna-icon-column/anna-icon-column.component.d.ts +15 -17
  51. package/lib/anna-core-shared-lib/components/anna-live-icon-template/anna-live-icon-template.component.d.ts +5 -8
  52. package/lib/anna-core-shared-lib/components/anna-no-data/anna-no-data.component.d.ts +11 -11
  53. package/lib/anna-core-shared-lib/components/anna-notify-icon-template/anna-notify-icon-template.component.d.ts +5 -8
  54. package/lib/anna-core-shared-lib/components/anna-pay-for-performance-icon-template/anna-pay-for-performance-icon-template.component.d.ts +9 -12
  55. package/lib/anna-core-shared-lib/components/anna-rejected-icon-template/anna-rejected-icon-template.component.d.ts +5 -8
  56. package/lib/anna-core-shared-lib/constants/shared.constant.d.ts +45 -41
  57. package/lib/anna-core-shared-lib/directives/digits-only/digits-only.directive.d.ts +34 -34
  58. package/lib/anna-core-shared-lib/directives/fixed-rows-popup-table/fixed-rows-popup-table.directive.d.ts +16 -16
  59. package/lib/anna-core-shared-lib/directives/show-ellipsis-text/show-ellipsis-text.directive.d.ts +10 -10
  60. package/lib/anna-core-shared-lib/models/anna-generic-data-type.model.d.ts +16 -16
  61. package/lib/anna-core-shared-lib/models/anna-global-dropdown-config.model.d.ts +98 -97
  62. package/lib/anna-core-shared-lib/models/anna-non-editable-gt-models.d.ts +129 -118
  63. package/lib/anna-core-shared-lib/models/anna-sort.model.d.ts +11 -11
  64. package/lib/anna-core-shared-lib/models/anna-tooltip.model.d.ts +25 -25
  65. package/lib/anna-core-shared-lib/pipes/annaConvertArrayToCommaSeperatedValue.pipe.d.ts +9 -9
  66. package/lib/anna-core-shared-lib/pipes/annaConvertZeroOrNullOrUndefined.pipe.d.ts +9 -9
  67. package/lib/anna-core-shared-lib/pipes/annaDateFormatter.pipe.d.ts +7 -8
  68. package/lib/anna-core-shared-lib/pipes/annaFilterSearchedText.pipe.d.ts +9 -9
  69. package/lib/anna-core-shared-lib/pipes/annaReplaceChar.pipe.d.ts +9 -9
  70. package/lib/anna-core-shared-lib/pipes/annaTypeOfData.pipe.d.ts +7 -7
  71. package/lib/anna-core-shared-lib/services/anna-date-time-format.service.d.ts +34 -28
  72. package/lib/anna-core-shared-lib/services/anna-filter.service.d.ts +154 -154
  73. package/lib/anna-core-shared-lib/services/anna-generic-table.service.d.ts +27 -27
  74. package/lib/anna-core-shared-lib/services/anna-global-config.service.d.ts +21 -21
  75. package/lib/anna-core-shared-lib/services/anna-number-format.service.d.ts +8 -8
  76. package/lib/anna-core-shared-lib/services/anna-persisting-filter.service.d.ts +8 -9
  77. package/lib/anna-core-shared-lib/services/anna-sort.service.d.ts +18 -18
  78. package/lib/anna-core.module.d.ts +42 -45
  79. package/lib/anna-dropdown-lib/components/anna-calendar-filter/anna-calendar-filter.component.d.ts +45 -45
  80. package/lib/anna-dropdown-lib/components/anna-week-calendar-filter/anna-week-calendar-filter.component.d.ts +70 -70
  81. package/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-checkbox-filter/anna-column-checkbox-filter.component.d.ts +60 -60
  82. 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
  83. package/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-slider-filter/anna-column-slider-filter.component.d.ts +65 -65
  84. package/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-time-filter/anna-column-time-filter.component.d.ts +83 -83
  85. package/lib/anna-generic-table-lib/components/anna-non-editable-generic-table/anna-non-editable-generic-table.component.d.ts +177 -174
  86. package/lib/anna-generic-table-lib/components/anna-sort/anna-sort.component.d.ts +17 -17
  87. package/package.json +13 -18
  88. package/public-api.d.ts +39 -42
  89. package/src/lib/anna-common-scss/_animate.scss +11 -11
  90. package/src/lib/anna-common-scss/_application-spacing.scss +5 -4
  91. package/src/lib/anna-common-scss/_bootstrap-tooltip.scss +25 -23
  92. package/src/lib/anna-common-scss/_button.scss +1 -1
  93. package/src/lib/anna-common-scss/_colors.scss +1 -1
  94. package/src/lib/anna-common-scss/_common-order-listing-table.scss +146 -135
  95. package/src/lib/anna-common-scss/_custom-anna-datepicker.scss +1 -1
  96. package/src/lib/anna-common-scss/_customDropdown.scss +68 -67
  97. package/src/lib/anna-common-scss/_dashboard-partials.scss +66 -64
  98. package/src/lib/anna-common-scss/_date-picker-form.scss +40 -40
  99. package/src/lib/anna-common-scss/_drag-and-drop.scss +22 -0
  100. package/src/lib/anna-common-scss/_easy-filter.scss +107 -127
  101. package/src/lib/anna-common-scss/_edit-filter-popup.scss +17 -18
  102. package/src/lib/anna-common-scss/_filters.scss +482 -471
  103. package/src/lib/anna-common-scss/_font.scss +7 -8
  104. package/src/lib/anna-common-scss/_fonts.scss +7 -7
  105. package/src/lib/anna-common-scss/_generic-modal.scss +62 -58
  106. package/src/lib/anna-common-scss/_generic-table-common.scss +140 -145
  107. package/src/lib/anna-common-scss/_gt-table.scss +172 -181
  108. package/src/lib/anna-common-scss/_icons.scss +3 -0
  109. package/src/lib/anna-common-scss/_legend.scss +5 -5
  110. package/src/lib/anna-common-scss/_mat-button-toggle.scss +11 -11
  111. package/src/lib/anna-common-scss/_mat-menu.scss +14 -14
  112. package/src/lib/anna-common-scss/_mixins.scss +134 -135
  113. package/src/lib/anna-common-scss/_modal.scss +22 -22
  114. package/src/lib/anna-common-scss/_popup-filter-toggle-button.scss +9 -8
  115. package/src/lib/anna-common-scss/_scrollbar.scss +7 -7
  116. package/src/lib/anna-common-scss/_show-hide-total-row.scss +27 -0
  117. package/src/lib/anna-common-scss/_sort.scss +20 -20
  118. package/src/lib/anna-common-scss/_toggle.scss +54 -52
  119. package/src/lib/anna-common-scss/style.scss +1 -1
  120. package/src/lib/anna-common-scss/third-party-lib/_angular-material-mat-radio.scss +21 -17
  121. package/src/lib/anna-common-scss/third-party-lib/_anna-mat-button-toggle-group-size-lg.scss +34 -0
  122. package/src/lib/anna-common-scss/third-party-lib/_mat-autocomplete.scss +26 -23
  123. package/esm2020/lib/anna-core-shared-lib/components/anna-buyer-approval-icon-template/anna-buyer-approval-icon-template.component.mjs +0 -15
  124. package/esm2020/lib/anna-core-shared-lib/components/anna-deleted-order-icon-template/anna-deleted-order-icon-template.component.mjs +0 -14
  125. package/esm2020/lib/anna-core-shared-lib/components/anna-est-icon-template/anna-est-icon-template.component.mjs +0 -11
  126. package/esm2020/lib/anna-core-shared-lib/components/anna-icon-column/anna-icon-column.component.mjs +0 -36
  127. package/esm2020/lib/anna-core-shared-lib/components/anna-live-icon-template/anna-live-icon-template.component.mjs +0 -15
  128. package/esm2020/lib/anna-core-shared-lib/components/anna-no-data/anna-no-data.component.mjs +0 -22
  129. package/esm2020/lib/anna-core-shared-lib/components/anna-notify-icon-template/anna-notify-icon-template.component.mjs +0 -14
  130. package/esm2020/lib/anna-core-shared-lib/components/anna-pay-for-performance-icon-template/anna-pay-for-performance-icon-template.component.mjs +0 -23
  131. package/esm2020/lib/anna-core-shared-lib/components/anna-rejected-icon-template/anna-rejected-icon-template.component.mjs +0 -15
  132. package/esm2020/lib/anna-core-shared-lib/constants/shared.constant.mjs +0 -43
  133. package/esm2020/lib/anna-core-shared-lib/directives/digits-only/digits-only.directive.mjs +0 -284
  134. package/esm2020/lib/anna-core-shared-lib/directives/fixed-rows-popup-table/fixed-rows-popup-table.directive.mjs +0 -43
  135. package/esm2020/lib/anna-core-shared-lib/directives/show-ellipsis-text/show-ellipsis-text.directive.mjs +0 -38
  136. package/esm2020/lib/anna-core-shared-lib/models/anna-generic-data-type.model.mjs +0 -2
  137. package/esm2020/lib/anna-core-shared-lib/models/anna-global-dropdown-config.model.mjs +0 -2
  138. package/esm2020/lib/anna-core-shared-lib/models/anna-non-editable-gt-models.mjs +0 -11
  139. package/esm2020/lib/anna-core-shared-lib/models/anna-sort.model.mjs +0 -7
  140. package/esm2020/lib/anna-core-shared-lib/pipes/annaConvertArrayToCommaSeperatedValue.pipe.mjs +0 -38
  141. package/esm2020/lib/anna-core-shared-lib/pipes/annaConvertZeroOrNullOrUndefined.pipe.mjs +0 -26
  142. package/esm2020/lib/anna-core-shared-lib/pipes/annaDateFormatter.pipe.mjs +0 -22
  143. package/esm2020/lib/anna-core-shared-lib/pipes/annaFilterSearchedText.pipe.mjs +0 -53
  144. package/esm2020/lib/anna-core-shared-lib/pipes/annaReplaceChar.pipe.mjs +0 -25
  145. package/esm2020/lib/anna-core-shared-lib/pipes/annaTypeOfData.pipe.mjs +0 -16
  146. package/esm2020/lib/anna-core-shared-lib/services/anna-date-time-format.service.mjs +0 -208
  147. package/esm2020/lib/anna-core-shared-lib/services/anna-filter.service.mjs +0 -1155
  148. package/esm2020/lib/anna-core-shared-lib/services/anna-generic-table.service.mjs +0 -151
  149. package/esm2020/lib/anna-core-shared-lib/services/anna-global-config.service.mjs +0 -132
  150. package/esm2020/lib/anna-core-shared-lib/services/anna-number-format.service.mjs +0 -53
  151. package/esm2020/lib/anna-core-shared-lib/services/anna-persisting-filter.service.mjs +0 -66
  152. package/esm2020/lib/anna-core-shared-lib/services/anna-sort.service.mjs +0 -176
  153. package/esm2020/lib/anna-core.module.mjs +0 -221
  154. package/esm2020/lib/anna-dropdown-lib/components/anna-calendar-filter/anna-calendar-filter.component.mjs +0 -151
  155. package/esm2020/lib/anna-dropdown-lib/components/anna-week-calendar-filter/anna-week-calendar-filter.component.mjs +0 -364
  156. package/esm2020/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-checkbox-filter/anna-column-checkbox-filter.component.mjs +0 -237
  157. package/esm2020/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-date-range-filter/anna-column-date-range-filter.component.mjs +0 -180
  158. package/esm2020/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-slider-filter/anna-column-slider-filter.component.mjs +0 -306
  159. package/esm2020/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-time-filter/anna-column-time-filter.component.mjs +0 -291
  160. package/esm2020/lib/anna-generic-table-lib/components/anna-non-editable-generic-table/anna-non-editable-generic-table.component.mjs +0 -787
  161. package/esm2020/lib/anna-generic-table-lib/components/anna-sort/anna-sort.component.mjs +0 -64
  162. package/esm2020/lib/anna-generic-table-lib/components/anna-table-virtual-scroll-viewport/anna-table-virtual-scroll-viewport.component.mjs +0 -357
  163. 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
  164. package/esm2020/lib/anna-generic-table-lib/directives/anna-fixed-row-size-table-virtual-scroll-strategy/index.mjs +0 -2
  165. package/esm2020/lib/anna-generic-table-lib/directives/anna-virtual-table/anna-virtual-table.directive.mjs +0 -178
  166. package/esm2020/lib/anna-generic-table-lib/directives/anna-virtual-table/index.mjs +0 -2
  167. package/esm2020/public-api.mjs +0 -58
  168. package/fesm2015/annalib-anna-core.mjs +0 -5851
  169. package/fesm2015/annalib-anna-core.mjs.map +0 -1
  170. package/fesm2020/annalib-anna-core.mjs +0 -5842
  171. package/fesm2020/annalib-anna-core.mjs.map +0 -1
  172. package/lib/anna-generic-table-lib/components/anna-table-virtual-scroll-viewport/anna-table-virtual-scroll-viewport.component.d.ts +0 -141
  173. 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
  174. package/lib/anna-generic-table-lib/directives/anna-fixed-row-size-table-virtual-scroll-strategy/index.d.ts +0 -1
  175. package/lib/anna-generic-table-lib/directives/anna-virtual-table/anna-virtual-table.directive.d.ts +0 -45
  176. package/lib/anna-generic-table-lib/directives/anna-virtual-table/index.d.ts +0 -1
@@ -0,0 +1,359 @@
1
+ // Angular import statements
2
+ import { DatePipe, NgClass, NgIf } from "@angular/common";
3
+ import { Component, EventEmitter, Input, Output } from "@angular/core";
4
+ import { FormsModule } from "@angular/forms";
5
+ // Third party import statements
6
+ import { NgbCalendar, NgbDate, NgbDatepicker, NgbDatepickerConfig, NgbInputDatepicker, } from "@ng-bootstrap/ng-bootstrap";
7
+ import dayjs from "dayjs";
8
+ import { AnnaDateTimeFormatService } from "../../../anna-core-shared-lib/services/anna-date-time-format.service";
9
+ import { AnnaGlobalConfigService } from "../../../anna-core-shared-lib/services/anna-global-config.service";
10
+ import * as i0 from "@angular/core";
11
+ import * as i1 from "@ng-bootstrap/ng-bootstrap";
12
+ import * as i2 from "../../../anna-core-shared-lib/services/anna-date-time-format.service";
13
+ import * as i3 from "../../../anna-core-shared-lib/services/anna-global-config.service";
14
+ import * as i4 from "@angular/forms";
15
+ // User defined import statements
16
+ export class AnnaWeekCalendarComponent {
17
+ ngOnChanges(changes) {
18
+ // if some values are not sent, setting the default values
19
+ this.defaultValues = this.globalConfigService.defaultWeekCalendarConfig;
20
+ this.config = { ...this.defaultValues, ...this.config };
21
+ if (this.config.selectCurrentWeek) {
22
+ this.initializeWeekData();
23
+ if (this.fromDate) {
24
+ this.selectWeek(this.fromDate);
25
+ }
26
+ }
27
+ this.formatter = this.formattedDates();
28
+ if (this.selectedFromDate && this.selectedEndDate && this.config) {
29
+ // this.selectWeek(this.fromDate);
30
+ this.fromDate = NgbDate.from(this.selectedFromDate);
31
+ this.toDate = NgbDate.from(this.selectedEndDate);
32
+ this.weekNumberGenerator();
33
+ this.displayToUI();
34
+ this.setCalendarMap();
35
+ }
36
+ if (this.disabledDates.length > 0) {
37
+ this.disabledFunc = (date, current) => this.checkIfDateIsDisabled(date);
38
+ }
39
+ }
40
+ constructor(calendar, datePickerConfig, annaDateTimeFormatService, globalConfigService) {
41
+ this.calendar = calendar;
42
+ this.datePickerConfig = datePickerConfig;
43
+ this.annaDateTimeFormatService = annaDateTimeFormatService;
44
+ this.globalConfigService = globalConfigService;
45
+ this.hoveredDate = null;
46
+ this.toDate = null;
47
+ this.weekNumbers = [];
48
+ this.dateToDisplay = "";
49
+ this.multiSelectDropdownOpen = false;
50
+ this.calendarMap = new Map();
51
+ this.disabledDates = [];
52
+ this.applyWeekCalendarChanges = new EventEmitter();
53
+ this.calendarToggled = new EventEmitter();
54
+ }
55
+ getWeekNumber(week, firstDayOfWeek) {
56
+ const weekStartDate = dayjs(convertNgbDateToMoment(week[0]), "MM/DD/YYYY");
57
+ const weekYear = weekStartDate.year();
58
+ const yearStartDate = dayjs(`01/01/${weekYear}`, "MM/DD/YYYY");
59
+ const weekDay = yearStartDate.day();
60
+ const noOfDays = weekStartDate.diff(yearStartDate, "d") + 1;
61
+ function convertNgbDateToMoment(ngbDate) {
62
+ let converted = null;
63
+ if (ngbDate && ngbDate.month && ngbDate.day && ngbDate.year) {
64
+ converted = `${ngbDate.month}/${ngbDate.day}/${ngbDate.year}`;
65
+ converted = dayjs(converted).format("MM/DD/YYYY");
66
+ }
67
+ return converted;
68
+ }
69
+ function checkIfYearIsBroadcastLeapYear() {
70
+ const isLeapYear = (weekYear % 4 === 0 && weekYear % 100 !== 0) || weekYear % 400 === 0;
71
+ return (isLeapYear && (weekDay === 0 || weekDay === 6)) || (!isLeapYear && weekDay === 0);
72
+ }
73
+ const isLeapYear = checkIfYearIsBroadcastLeapYear();
74
+ const divider = isLeapYear ? 53 : 52;
75
+ const adder = isLeapYear ? 2 : 1;
76
+ const broadcastNumberOfDays = weekDay + noOfDays;
77
+ const broadcastWeekNumber = broadcastNumberOfDays % 7 > 0 ? broadcastNumberOfDays / 7 + adder : broadcastNumberOfDays / 7;
78
+ if (Math.floor(broadcastWeekNumber % divider) === 0) {
79
+ return divider;
80
+ }
81
+ return Math.floor(broadcastWeekNumber % divider);
82
+ }
83
+ ngAfterViewInit() {
84
+ // CHANGES@ANNALIB Changed this.
85
+ // this.calendar["__proto__"].getWeekNumber = this.getWeekNumber;
86
+ Object.setPrototypeOf(this.calendar, { getWeekNumber: this.getWeekNumber });
87
+ }
88
+ ngOnInit() {
89
+ // this.selectWeek(this.fromDate);
90
+ this.setCalendarMap();
91
+ }
92
+ initializeWeekData() {
93
+ this.weekObjects = [];
94
+ this.fromDate = this.calendar.getToday();
95
+ this.today = this.calendar.getToday();
96
+ const backDatedPeriod = JSON.parse(localStorage.getItem("userDetails") || "{}").locking_period_days;
97
+ if (backDatedPeriod < 0) {
98
+ const date = this.calendar.getPrev(this.calendar.getToday(), "d", Math.abs(backDatedPeriod));
99
+ this.today = NgbDate.from(date);
100
+ this.fromDate = NgbDate.from(date);
101
+ }
102
+ // Disable months before numberOfMonthsToEnable
103
+ this.datePickerConfig.markDisabled = (date) => {
104
+ const previousMonth = this.calendar.getPrev(this.today, "m", this.config.numberOfMonthsToEnableInPast);
105
+ const previousDay = this.calendar.getPrev(previousMonth, "d", 1);
106
+ return !NgbDate.from(previousDay).before(date);
107
+ };
108
+ this.formatter = this.formattedDates();
109
+ this.flag1 = false;
110
+ this.flag2 = false;
111
+ }
112
+ selectWeek(date) {
113
+ const dateObject = new Date(date.year, date.month - 1, date.day);
114
+ let constructDate = this.buildDate(dateObject);
115
+ if (!this.config.selectMultipleWeeks) {
116
+ // Single week selection
117
+ this.fromDate = this.constructStartDate(dateObject)(constructDate);
118
+ this.toDate = this.constructEndDate(dateObject)(constructDate);
119
+ this.weekNumberGenerator();
120
+ }
121
+ else {
122
+ if (date.before(this.fromDate)) {
123
+ this.fromDate = this.constructStartDate(dateObject)(constructDate);
124
+ if (this.flag1) {
125
+ this.toDate = this.constructEndDate(dateObject)(constructDate);
126
+ }
127
+ this.flag1 = !this.flag1;
128
+ }
129
+ else if (date.after(this.toDate)) {
130
+ if (this.flag2) {
131
+ this.fromDate = this.constructStartDate(dateObject)(constructDate);
132
+ // this.toDate = this.constructEndDate(dateObject)(constructDate);
133
+ }
134
+ this.flag2 = !this.flag2;
135
+ this.toDate = this.constructEndDate(dateObject)(constructDate);
136
+ }
137
+ else {
138
+ this.fromDate = this.constructStartDate(dateObject)(constructDate);
139
+ this.toDate = this.constructEndDate(dateObject)(constructDate);
140
+ }
141
+ if (this.disabledDates.length > 0) {
142
+ const dayjsStartDate = dayjs(this.annaDateTimeFormatService.convertNgbDateToMoment(this.fromDate), "MM/DD/YYYY");
143
+ const dayjsEndDate = dayjs(this.annaDateTimeFormatService.convertNgbDateToMoment(this.toDate), "MM/DD/YYYY");
144
+ let ngbDate;
145
+ while (!dayjsStartDate.isSame(dayjsEndDate)) {
146
+ ngbDate = this.annaDateTimeFormatService.convertToNgbDate(dayjsStartDate, "MM/DD/YYYY");
147
+ if (this.checkIfDateIsDisabled(ngbDate)) {
148
+ break;
149
+ }
150
+ dayjsStartDate.add(1, "d");
151
+ }
152
+ const newDateObject = new Date(ngbDate.year, ngbDate.month - 1, ngbDate.day - 1);
153
+ constructDate = this.buildDate(newDateObject);
154
+ this.toDate = this.constructEndDate(newDateObject)(constructDate);
155
+ }
156
+ this.weekNumberGenerator();
157
+ }
158
+ if (!this.config.showAsDropdown) {
159
+ this.applyChanges();
160
+ }
161
+ }
162
+ weekNumberGenerator() {
163
+ const dates = [];
164
+ let week = [];
165
+ let startDate = NgbDate.from(this.fromDate);
166
+ const endDate = NgbDate.from(this.toDate);
167
+ week.push(startDate);
168
+ while (endDate != null && !startDate.equals(endDate)) {
169
+ const date = this.calendar.getNext(startDate, "d", 1);
170
+ startDate = date;
171
+ week.push(date);
172
+ // Collect all days in week to calculate the week number
173
+ if (week.length === 7) {
174
+ dates.push(week);
175
+ week = [];
176
+ }
177
+ }
178
+ if ((this.config.maxWeeksToSelect ?? 0) > 0 && dates.length > (this.config.maxWeeksToSelect ?? 0)) {
179
+ dates.splice(this.config.maxWeeksToSelect ?? 0, dates.length - (this.config.maxWeeksToSelect ?? 0));
180
+ }
181
+ this.selectedDates(dates);
182
+ this.weekNumbers = [];
183
+ this.weekObjects = [];
184
+ dates.forEach((date) => {
185
+ this.weekNumbers.push(` Week ${this.calendar.getWeekNumber(date, this.config.firstDayOfWeek)}`);
186
+ const formattedDates = this.formatter(date[0], date[6]);
187
+ const dateObjects = {
188
+ startDate: formattedDates.formattedStartDate,
189
+ endDate: formattedDates.formattedEndDate,
190
+ };
191
+ this.weekObjects.push(dateObjects);
192
+ });
193
+ this.displayToUI();
194
+ }
195
+ selectedDates(dates) {
196
+ this.fromDate = dates[0][0];
197
+ this.toDate = dates[dates.length - 1][6];
198
+ }
199
+ formattedDates() {
200
+ const pipe = new DatePipe("en-US");
201
+ return (fromDate, toDate) => {
202
+ const fromDateObject = new Date(fromDate.year, fromDate.month - 1, fromDate.day);
203
+ const toDateObject = new Date(toDate.year, toDate.month - 1, toDate.day);
204
+ this.formattedStartDate = pipe.transform(fromDateObject, this.config.dateFormatForRequest);
205
+ this.formattedEndDate = pipe.transform(toDateObject, this.config.dateFormatForRequest);
206
+ this.dateToDisplay = `${pipe.transform(fromDateObject, this.config.dateFormatToDisplay)} to ${pipe.transform(toDateObject, this.config.dateFormatToDisplay)}`;
207
+ return this;
208
+ };
209
+ }
210
+ displayToUI() {
211
+ if (!this.config.selectMultipleWeeks && this.fromDate && this.toDate) {
212
+ // Display for only Single Week
213
+ this.formatter(this.fromDate, this.toDate);
214
+ }
215
+ else if (this.weekNumbers.length > (this.config.maxWeeksToShowWithRemainingCount ?? 0)) {
216
+ // Display for Multiple Weeks
217
+ const weekDisplay = [];
218
+ for (let i = 0; i < (this.config.maxWeeksToShowWithRemainingCount ?? 0); i++) {
219
+ weekDisplay.push(this.weekNumbers.shift());
220
+ }
221
+ const remainingWeeks = this.weekNumbers.length;
222
+ this.weekNumbers = [];
223
+ this.weekNumbers.push(`${weekDisplay} +${remainingWeeks}`);
224
+ }
225
+ }
226
+ constructStartDate(date) {
227
+ const { firstDayOfWeek } = this.config;
228
+ return (constructDate) => {
229
+ const startDay = date.getDay() !== 0 ? (firstDayOfWeek ?? 0) - date.getDay() : -6;
230
+ return constructDate(startDay);
231
+ };
232
+ }
233
+ constructEndDate(date) {
234
+ const { firstDayOfWeek } = this.config;
235
+ return (constructDate) => {
236
+ const endDay = date.getDay() !== 0 ? (firstDayOfWeek ?? 0) + 6 - date.getDay() : 0;
237
+ return constructDate(endDay);
238
+ };
239
+ }
240
+ buildDate(date) {
241
+ return (number) => {
242
+ const day = date.getDate() + number;
243
+ const dateObject = new Date(date.getFullYear(), date.getMonth(), day);
244
+ const ngbDateObject = {};
245
+ ngbDateObject.day = day;
246
+ if (ngbDateObject.day > 31 || ngbDateObject.day < 1) {
247
+ ngbDateObject.day = dateObject.getDate();
248
+ }
249
+ ngbDateObject.month = dateObject.getMonth() + 1;
250
+ ngbDateObject.year = dateObject.getFullYear();
251
+ return NgbDate.from(ngbDateObject);
252
+ };
253
+ }
254
+ isHovered(date) {
255
+ return (this.fromDate &&
256
+ !this.toDate &&
257
+ this.hoveredDate &&
258
+ date.after(this.fromDate) &&
259
+ date.before(this.hoveredDate));
260
+ }
261
+ isInside(date) {
262
+ return this.toDate && date.after(this.fromDate) && date.before(this.toDate);
263
+ }
264
+ isRange(date) {
265
+ return (date.equals(this.fromDate) ||
266
+ (this.toDate && date.equals(this.toDate)) ||
267
+ this.isInside(date) ||
268
+ this.isHovered(date));
269
+ }
270
+ previousWeek() {
271
+ if (this.fromDate) {
272
+ this.toDate = this.calendar.getPrev(this.fromDate, "d", 1);
273
+ this.fromDate = this.calendar.getPrev(this.fromDate, "d", this.calendar.getDaysPerWeek());
274
+ }
275
+ this.weekNumberGenerator();
276
+ this.applyChanges();
277
+ }
278
+ nextWeek() {
279
+ if (this.fromDate) {
280
+ this.fromDate = this.calendar.getNext(this.fromDate, "d", this.calendar.getDaysPerWeek());
281
+ this.toDate = this.calendar.getNext(this.fromDate, "d", this.calendar.getDaysPerWeek() - 1);
282
+ }
283
+ this.weekNumberGenerator();
284
+ this.applyChanges();
285
+ }
286
+ setCalendarMap() {
287
+ const dateObj = { fromDate: this.fromDate, toDate: this.toDate };
288
+ this.calendarMap.set("oldDates", dateObj);
289
+ }
290
+ applyChanges() {
291
+ this.multiSelectDropdownOpen = false;
292
+ if (!this.config.emitMultipleWeekObjects) {
293
+ const dates = {};
294
+ const formattedDates = this.formatter(this.fromDate, this.toDate);
295
+ dates.startDate = formattedDates.formattedStartDate;
296
+ dates.endDate = formattedDates.formattedEndDate;
297
+ this.applyWeekCalendarChanges.emit(dates);
298
+ }
299
+ else {
300
+ this.applyWeekCalendarChanges.emit(this.weekObjects);
301
+ }
302
+ this.setCalendarMap();
303
+ }
304
+ isFocused(value) {
305
+ this.calendarToggled.emit(value);
306
+ }
307
+ isDropdownOpenedForCalendar(datepicker) {
308
+ this.datepicker = datepicker;
309
+ if (this.datepicker.isOpen()) {
310
+ this.revertDates();
311
+ this.datepicker.close();
312
+ this.multiSelectDropdownOpen = false;
313
+ }
314
+ else {
315
+ this.datepicker.open();
316
+ this.multiSelectDropdownOpen = true;
317
+ }
318
+ }
319
+ revertDates() {
320
+ this.multiSelectDropdownOpen = false;
321
+ if (this.calendarMap.get("oldDates")) {
322
+ const dateObj = this.calendarMap.get("oldDates");
323
+ this.fromDate = dateObj.fromDate;
324
+ this.toDate = dateObj.toDate;
325
+ this.weekNumberGenerator();
326
+ this.displayToUI();
327
+ }
328
+ }
329
+ checkIfDateIsDisabled(date) {
330
+ const validatorFunc = (ngbDate) => ngbDate.year === date.year && ngbDate.month === date.month && ngbDate.day === date.day;
331
+ return this.disabledDates.some(validatorFunc);
332
+ }
333
+ closeDatepicker(datepickerRef) {
334
+ datepickerRef.close();
335
+ }
336
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AnnaWeekCalendarComponent, deps: [{ token: i1.NgbCalendar }, { token: i1.NgbDatepickerConfig }, { token: i2.AnnaDateTimeFormatService }, { token: i3.AnnaGlobalConfigService }], target: i0.ɵɵFactoryTarget.Component }); }
337
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: AnnaWeekCalendarComponent, isStandalone: true, selector: "anna-core-week-calendar-filter-lib", inputs: { selectedFromDate: "selectedFromDate", selectedEndDate: "selectedEndDate", disabledDates: "disabledDates", maxDate: "maxDate", minDate: "minDate", config: "config" }, outputs: { applyWeekCalendarChanges: "applyWeekCalendarChanges", calendarToggled: "calendarToggled" }, usesOnChanges: true, ngImport: i0, template: "<form\r\n class=\"form-inline\"\r\n *ngIf=\"config.showAsDropdown\"\r\n>\r\n <div class=\"form-group hidden\">\r\n <div class=\"input-group\">\r\n <input\r\n name=\"datepicker d-none\"\r\n class=\"form-control\"\r\n ngbDatepicker\r\n #datepicker=\"ngbDatepicker\"\r\n [autoClose]=\"false\"\r\n (dateSelect)=\"selectWeek($event)\"\r\n (closed)=\"isFocused(false)\"\r\n [displayMonths]=\"1\"\r\n [dayTemplate]=\"t\"\r\n [startDate]=\"fromDate!\"\r\n [firstDayOfWeek]=\"config.firstDayOfWeek\"\r\n [showWeekNumbers]=\"config.showWeekNumbers\"\r\n tabindex=\"-1\"\r\n [footerTemplate]=\"footerTemplate\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <!--Single week select-->\r\n <div *ngIf=\"!config.selectMultipleWeeks\">\r\n <span class=\"weeknumbers-label\"> &nbsp;{{ weekNumbers }} </span>\r\n <div class=\"form-group\">\r\n <div class=\"input-group\">\r\n <div class=\"single-week\">\r\n <div class=\"left\">\r\n <span\r\n class=\"material-icons next-round-btn\"\r\n (click)=\"previousWeek()\"\r\n >\r\n navigate_next\r\n </span>\r\n </div>\r\n <input\r\n #dpFromDate\r\n class=\"form-control\"\r\n placeholder=\"Select Weeks\"\r\n [ngClass]=\"[config.customClass === '' ? '' : config.customClass]\"\r\n name=\"dpFromDate\"\r\n [value]=\"dateToDisplay\"\r\n [readonly]=\"true\"\r\n (click)=\"isFocused(true); isDropdownOpenedForCalendar(datepicker)\"\r\n />\r\n <i\r\n class=\"mdi mdi-menu-down\"\r\n *ngIf=\"!datepicker.isOpen()\"\r\n (click)=\"datepicker.open()\"\r\n ></i>\r\n <i\r\n class=\"mdi mdi-menu-up\"\r\n *ngIf=\"datepicker.isOpen()\"\r\n (click)=\"isDropdownOpenedForCalendar(datepicker)\"\r\n ></i>\r\n <div class=\"right\">\r\n <span\r\n class=\"material-icons round-btn\"\r\n (click)=\"nextWeek()\"\r\n >\r\n navigate_next\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!--Multiple week select-->\r\n <div\r\n class=\"form-group\"\r\n *ngIf=\"config.selectMultipleWeeks\"\r\n >\r\n <div class=\"input-group\">\r\n <div class=\"multiple-weeks\">\r\n <input\r\n #dpFromDate\r\n class=\"form-control\"\r\n placeholder=\"Select Weeks\"\r\n [ngClass]=\"[config.customClass === '' ? '' : config.customClass]\"\r\n name=\"dpFromDate\"\r\n [readonly]=\"true\"\r\n [value]=\"weekNumbers\"\r\n (click)=\"isFocused(true); isDropdownOpenedForCalendar(datepicker)\"\r\n />\r\n <i\r\n *ngIf=\"!multiSelectDropdownOpen\"\r\n class=\"mdi mdi-menu-down multiselect-input-arrow\"\r\n ></i>\r\n <i\r\n *ngIf=\"multiSelectDropdownOpen\"\r\n class=\"mdi mdi-menu-up multiselect-input-arrow\"\r\n ></i>\r\n </div>\r\n </div>\r\n </div>\r\n</form>\r\n\r\n<ngb-datepicker\r\n #weekPicker\r\n *ngIf=\"!config.showAsDropdown\"\r\n [displayMonths]=\"1\"\r\n [startDate]=\"fromDate!\"\r\n [firstDayOfWeek]=\"config.firstDayOfWeek\"\r\n [showWeekNumbers]=\"config.showWeekNumbers\"\r\n [dayTemplate]=\"t\"\r\n [maxDate]=\"maxDate\"\r\n [minDate]=\"minDate\"\r\n (dateSelect)=\"selectWeek($event)\"\r\n [markDisabled]=\"disabledFunc\"\r\n>\r\n</ngb-datepicker>\r\n\r\n<ng-template #footerTemplate>\r\n <hr class=\"my-0\" />\r\n <button\r\n class=\"btn btn-primary btn-sm m-2 float-right apply-btn\"\r\n (click)=\"applyChanges(); closeDatepicker(datepicker)\"\r\n >\r\n Apply\r\n </button>\r\n <button\r\n class=\"btn btn-primary btn-sm m-2 float-right cancel-btn\"\r\n (click)=\"revertDates(); closeDatepicker(datepicker)\"\r\n >\r\n Cancel\r\n </button>\r\n</ng-template>\r\n\r\n<ng-template\r\n #t\r\n let-date\r\n let-focused=\"focused\"\r\n let-disabled=\"disabled\"\r\n>\r\n <span\r\n class=\"custom-day\"\r\n [class.focused]=\"focused\"\r\n [class.range]=\"isRange(date)\"\r\n [class.faded]=\"isHovered(date) || isInside(date)\"\r\n [class.disabled]=\"disabled\"\r\n (mouseenter)=\"hoveredDate = date\"\r\n (mouseleave)=\"hoveredDate = null\"\r\n >\r\n {{ date.day }}\r\n </span>\r\n</ng-template>\r\n", styles: [":host ::ng-deep .ngb-dp-arrow button:disabled{color:#4a4a4a;background-color:#fff;opacity:.25;cursor:not-allowed}:host ::ng-deep .ngb-dp-arrow button:disabled .ngb-dp-navigation-chevron{color:#4a4a4a}:host ::ng-deep .ngb-dp-arrow button .ngb-dp-navigation-chevron{color:#000}:host::ng-deep .right{width:unset!important;background-color:#fff!important}:host::ng-deep .ngb-dp-day,:host::ng-deep .ngb-dp-weekday{width:3rem!important;font-style:unset!important;color:#8bac2a;outline:none}:host::ng-deep .ngb-dp-day:first-child{border:1px solid black}:host::ng-deep .ngb-dp-day.disabled{color:#d4d4d4;cursor:not-allowed}:host::ng-deep .ngb-dp-showweek:before{content:\"Weeks\";margin-right:5px}:host::ng-deep .ngb-dp-week-number{font-style:unset!important;width:4rem!important;margin-right:5px;font-weight:700;color:#000!important;border-right:1px solid rgba(0,0,0,.125)}:host::ng-deep .ngb-dp-week-number:before{font-style:unset!important;content:\"Week \"}:host::ng-deep .ngb-dp-weekday.ngb-dp-showweek{margin-right:5px;width:4rem!important;border-right:1px solid rgba(0,0,0,.125)}:host::ng-deep .dropdown-menu{box-shadow:none}:host::ng-deep .dropdown-menu.show{top:15px!important}:host::ng-deep .bg-light{background-color:#fff!important}:host::ng-deep .ngb-dp-weekdays{border-top:1px solid rgba(0,0,0,.125)}:host::ng-deep .ngb-dp-arrow-btn:focus{box-shadow:none}.custom-day{text-align:center;padding:.185rem .25rem;display:inline-block;height:1.75rem;font-weight:700;color:#222b45;width:3rem!important}.custom-day.focused{background-color:#fff}.custom-day.faded{background-color:#0275d880!important}.custom-day.faded:focus{outline:none!important}.custom-day:hover{background-color:#268bff1f!important;color:#4a4a4a!important}.custom-day:focus{outline:none!important}.custom-day.range{background-color:#268bff1f!important;color:#4a4a4a!important}.custom-day.range:focus{outline:none!important}.custom-day.disabled{color:#d3d3d3}.input-group>.single-week,.input-group .multiple-weeks{display:inline-flex!important}.input-group>.single-week>.form-control,.input-group .multiple-weeks>.form-control{width:212px;border-radius:2px;border:solid 1px #b3b3b3;height:1.875rem;cursor:pointer}.input-group>.form-control{width:212px;border-radius:2px;border:solid 1px #b3b3b3;height:1.875rem;cursor:pointer}.form-control[readonly]{background-color:#fff!important}.next-round-btn{transform:rotate(180deg);margin-left:.125rem;line-height:1.3;border-radius:50%;cursor:pointer}.round-btn{line-height:1.3;border-radius:50%;cursor:pointer;margin-left:.25rem}:host::ng-deep select.custom-select{background:none;appearance:auto}.left,.right{width:1.875rem!important;height:1.875rem;background:#d8d8d8!important;border-radius:50%}.left{margin-right:.3125rem}.right{margin-left:.3125rem}:host::ng-deep .right .ngb-dp-navigation-chevron,:host::ng-deep .ngb-dp-navigation-chevron{color:#268bff}:host::ng-deep .ngb-dp-arrow-btn:focus{outline-width:0px}.custom-day.faded{background-color:#268bff33!important;color:#000!important;font-weight:600}.custom-day{text-align:center;padding:.185rem .25rem;color:#000;display:inline-block;line-height:1.9;height:2rem;width:2rem}.custom-day.focused{background-color:#e6e6e6}.custom-day.range{background-color:#268bff!important;color:#fff!important;font-weight:600}.custom-day:hover{background-color:#d9e1e6;border-radius:.25rem;color:#bdbdbd}:host::ng-deep div.ngb-dp-weekday{color:#8bac2a;font-family:Roboto;font-size:.8125rem;font-weight:700;font-stretch:normal;font-style:normal;line-height:2.6;letter-spacing:normal}.mdi-menu-up,.mdi-menu-down{position:absolute;right:2.438rem;top:1px;font-size:1.375rem;cursor:pointer}.multiselect-input-arrow{position:absolute;right:.75rem;top:3px;font-size:1.25rem;cursor:pointer;pointer-events:none}button:focus{outline:none;box-shadow:none;border-color:transparent}::ng-deep .ngb-dp-header,::ng-deep .ngb-dp-week{background:#fff!important}.weeknumbers-label{position:relative;left:30px;font-size:12px}.apply-btn{background-color:#268bff;color:#fff}.cancel-btn{background-color:#268bff1f;color:#268bff}\n"], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i4.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i4.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: NgbInputDatepicker, selector: "input[ngbDatepicker]", inputs: ["autoClose", "contentTemplate", "datepickerClass", "dayTemplate", "dayTemplateData", "displayMonths", "firstDayOfWeek", "footerTemplate", "markDisabled", "minDate", "maxDate", "navigation", "outsideDays", "placement", "popperOptions", "restoreFocus", "showWeekNumbers", "startDate", "container", "positionTarget", "weekdays", "disabled"], outputs: ["dateSelect", "navigate", "closed"], exportAs: ["ngbDatepicker"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: NgbDatepicker, selector: "ngb-datepicker", inputs: ["contentTemplate", "dayTemplate", "dayTemplateData", "displayMonths", "firstDayOfWeek", "footerTemplate", "markDisabled", "maxDate", "minDate", "navigation", "outsideDays", "showWeekNumbers", "startDate", "weekdays"], outputs: ["navigate", "dateSelect"], exportAs: ["ngbDatepicker"] }] }); }
338
+ }
339
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AnnaWeekCalendarComponent, decorators: [{
340
+ type: Component,
341
+ args: [{ selector: "anna-core-week-calendar-filter-lib", standalone: true, imports: [NgIf, FormsModule, NgbInputDatepicker, NgClass, NgbDatepicker], template: "<form\r\n class=\"form-inline\"\r\n *ngIf=\"config.showAsDropdown\"\r\n>\r\n <div class=\"form-group hidden\">\r\n <div class=\"input-group\">\r\n <input\r\n name=\"datepicker d-none\"\r\n class=\"form-control\"\r\n ngbDatepicker\r\n #datepicker=\"ngbDatepicker\"\r\n [autoClose]=\"false\"\r\n (dateSelect)=\"selectWeek($event)\"\r\n (closed)=\"isFocused(false)\"\r\n [displayMonths]=\"1\"\r\n [dayTemplate]=\"t\"\r\n [startDate]=\"fromDate!\"\r\n [firstDayOfWeek]=\"config.firstDayOfWeek\"\r\n [showWeekNumbers]=\"config.showWeekNumbers\"\r\n tabindex=\"-1\"\r\n [footerTemplate]=\"footerTemplate\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <!--Single week select-->\r\n <div *ngIf=\"!config.selectMultipleWeeks\">\r\n <span class=\"weeknumbers-label\"> &nbsp;{{ weekNumbers }} </span>\r\n <div class=\"form-group\">\r\n <div class=\"input-group\">\r\n <div class=\"single-week\">\r\n <div class=\"left\">\r\n <span\r\n class=\"material-icons next-round-btn\"\r\n (click)=\"previousWeek()\"\r\n >\r\n navigate_next\r\n </span>\r\n </div>\r\n <input\r\n #dpFromDate\r\n class=\"form-control\"\r\n placeholder=\"Select Weeks\"\r\n [ngClass]=\"[config.customClass === '' ? '' : config.customClass]\"\r\n name=\"dpFromDate\"\r\n [value]=\"dateToDisplay\"\r\n [readonly]=\"true\"\r\n (click)=\"isFocused(true); isDropdownOpenedForCalendar(datepicker)\"\r\n />\r\n <i\r\n class=\"mdi mdi-menu-down\"\r\n *ngIf=\"!datepicker.isOpen()\"\r\n (click)=\"datepicker.open()\"\r\n ></i>\r\n <i\r\n class=\"mdi mdi-menu-up\"\r\n *ngIf=\"datepicker.isOpen()\"\r\n (click)=\"isDropdownOpenedForCalendar(datepicker)\"\r\n ></i>\r\n <div class=\"right\">\r\n <span\r\n class=\"material-icons round-btn\"\r\n (click)=\"nextWeek()\"\r\n >\r\n navigate_next\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!--Multiple week select-->\r\n <div\r\n class=\"form-group\"\r\n *ngIf=\"config.selectMultipleWeeks\"\r\n >\r\n <div class=\"input-group\">\r\n <div class=\"multiple-weeks\">\r\n <input\r\n #dpFromDate\r\n class=\"form-control\"\r\n placeholder=\"Select Weeks\"\r\n [ngClass]=\"[config.customClass === '' ? '' : config.customClass]\"\r\n name=\"dpFromDate\"\r\n [readonly]=\"true\"\r\n [value]=\"weekNumbers\"\r\n (click)=\"isFocused(true); isDropdownOpenedForCalendar(datepicker)\"\r\n />\r\n <i\r\n *ngIf=\"!multiSelectDropdownOpen\"\r\n class=\"mdi mdi-menu-down multiselect-input-arrow\"\r\n ></i>\r\n <i\r\n *ngIf=\"multiSelectDropdownOpen\"\r\n class=\"mdi mdi-menu-up multiselect-input-arrow\"\r\n ></i>\r\n </div>\r\n </div>\r\n </div>\r\n</form>\r\n\r\n<ngb-datepicker\r\n #weekPicker\r\n *ngIf=\"!config.showAsDropdown\"\r\n [displayMonths]=\"1\"\r\n [startDate]=\"fromDate!\"\r\n [firstDayOfWeek]=\"config.firstDayOfWeek\"\r\n [showWeekNumbers]=\"config.showWeekNumbers\"\r\n [dayTemplate]=\"t\"\r\n [maxDate]=\"maxDate\"\r\n [minDate]=\"minDate\"\r\n (dateSelect)=\"selectWeek($event)\"\r\n [markDisabled]=\"disabledFunc\"\r\n>\r\n</ngb-datepicker>\r\n\r\n<ng-template #footerTemplate>\r\n <hr class=\"my-0\" />\r\n <button\r\n class=\"btn btn-primary btn-sm m-2 float-right apply-btn\"\r\n (click)=\"applyChanges(); closeDatepicker(datepicker)\"\r\n >\r\n Apply\r\n </button>\r\n <button\r\n class=\"btn btn-primary btn-sm m-2 float-right cancel-btn\"\r\n (click)=\"revertDates(); closeDatepicker(datepicker)\"\r\n >\r\n Cancel\r\n </button>\r\n</ng-template>\r\n\r\n<ng-template\r\n #t\r\n let-date\r\n let-focused=\"focused\"\r\n let-disabled=\"disabled\"\r\n>\r\n <span\r\n class=\"custom-day\"\r\n [class.focused]=\"focused\"\r\n [class.range]=\"isRange(date)\"\r\n [class.faded]=\"isHovered(date) || isInside(date)\"\r\n [class.disabled]=\"disabled\"\r\n (mouseenter)=\"hoveredDate = date\"\r\n (mouseleave)=\"hoveredDate = null\"\r\n >\r\n {{ date.day }}\r\n </span>\r\n</ng-template>\r\n", styles: [":host ::ng-deep .ngb-dp-arrow button:disabled{color:#4a4a4a;background-color:#fff;opacity:.25;cursor:not-allowed}:host ::ng-deep .ngb-dp-arrow button:disabled .ngb-dp-navigation-chevron{color:#4a4a4a}:host ::ng-deep .ngb-dp-arrow button .ngb-dp-navigation-chevron{color:#000}:host::ng-deep .right{width:unset!important;background-color:#fff!important}:host::ng-deep .ngb-dp-day,:host::ng-deep .ngb-dp-weekday{width:3rem!important;font-style:unset!important;color:#8bac2a;outline:none}:host::ng-deep .ngb-dp-day:first-child{border:1px solid black}:host::ng-deep .ngb-dp-day.disabled{color:#d4d4d4;cursor:not-allowed}:host::ng-deep .ngb-dp-showweek:before{content:\"Weeks\";margin-right:5px}:host::ng-deep .ngb-dp-week-number{font-style:unset!important;width:4rem!important;margin-right:5px;font-weight:700;color:#000!important;border-right:1px solid rgba(0,0,0,.125)}:host::ng-deep .ngb-dp-week-number:before{font-style:unset!important;content:\"Week \"}:host::ng-deep .ngb-dp-weekday.ngb-dp-showweek{margin-right:5px;width:4rem!important;border-right:1px solid rgba(0,0,0,.125)}:host::ng-deep .dropdown-menu{box-shadow:none}:host::ng-deep .dropdown-menu.show{top:15px!important}:host::ng-deep .bg-light{background-color:#fff!important}:host::ng-deep .ngb-dp-weekdays{border-top:1px solid rgba(0,0,0,.125)}:host::ng-deep .ngb-dp-arrow-btn:focus{box-shadow:none}.custom-day{text-align:center;padding:.185rem .25rem;display:inline-block;height:1.75rem;font-weight:700;color:#222b45;width:3rem!important}.custom-day.focused{background-color:#fff}.custom-day.faded{background-color:#0275d880!important}.custom-day.faded:focus{outline:none!important}.custom-day:hover{background-color:#268bff1f!important;color:#4a4a4a!important}.custom-day:focus{outline:none!important}.custom-day.range{background-color:#268bff1f!important;color:#4a4a4a!important}.custom-day.range:focus{outline:none!important}.custom-day.disabled{color:#d3d3d3}.input-group>.single-week,.input-group .multiple-weeks{display:inline-flex!important}.input-group>.single-week>.form-control,.input-group .multiple-weeks>.form-control{width:212px;border-radius:2px;border:solid 1px #b3b3b3;height:1.875rem;cursor:pointer}.input-group>.form-control{width:212px;border-radius:2px;border:solid 1px #b3b3b3;height:1.875rem;cursor:pointer}.form-control[readonly]{background-color:#fff!important}.next-round-btn{transform:rotate(180deg);margin-left:.125rem;line-height:1.3;border-radius:50%;cursor:pointer}.round-btn{line-height:1.3;border-radius:50%;cursor:pointer;margin-left:.25rem}:host::ng-deep select.custom-select{background:none;appearance:auto}.left,.right{width:1.875rem!important;height:1.875rem;background:#d8d8d8!important;border-radius:50%}.left{margin-right:.3125rem}.right{margin-left:.3125rem}:host::ng-deep .right .ngb-dp-navigation-chevron,:host::ng-deep .ngb-dp-navigation-chevron{color:#268bff}:host::ng-deep .ngb-dp-arrow-btn:focus{outline-width:0px}.custom-day.faded{background-color:#268bff33!important;color:#000!important;font-weight:600}.custom-day{text-align:center;padding:.185rem .25rem;color:#000;display:inline-block;line-height:1.9;height:2rem;width:2rem}.custom-day.focused{background-color:#e6e6e6}.custom-day.range{background-color:#268bff!important;color:#fff!important;font-weight:600}.custom-day:hover{background-color:#d9e1e6;border-radius:.25rem;color:#bdbdbd}:host::ng-deep div.ngb-dp-weekday{color:#8bac2a;font-family:Roboto;font-size:.8125rem;font-weight:700;font-stretch:normal;font-style:normal;line-height:2.6;letter-spacing:normal}.mdi-menu-up,.mdi-menu-down{position:absolute;right:2.438rem;top:1px;font-size:1.375rem;cursor:pointer}.multiselect-input-arrow{position:absolute;right:.75rem;top:3px;font-size:1.25rem;cursor:pointer;pointer-events:none}button:focus{outline:none;box-shadow:none;border-color:transparent}::ng-deep .ngb-dp-header,::ng-deep .ngb-dp-week{background:#fff!important}.weeknumbers-label{position:relative;left:30px;font-size:12px}.apply-btn{background-color:#268bff;color:#fff}.cancel-btn{background-color:#268bff1f;color:#268bff}\n"] }]
342
+ }], ctorParameters: function () { return [{ type: i1.NgbCalendar }, { type: i1.NgbDatepickerConfig }, { type: i2.AnnaDateTimeFormatService }, { type: i3.AnnaGlobalConfigService }]; }, propDecorators: { selectedFromDate: [{
343
+ type: Input
344
+ }], selectedEndDate: [{
345
+ type: Input
346
+ }], disabledDates: [{
347
+ type: Input
348
+ }], maxDate: [{
349
+ type: Input
350
+ }], minDate: [{
351
+ type: Input
352
+ }], config: [{
353
+ type: Input
354
+ }], applyWeekCalendarChanges: [{
355
+ type: Output
356
+ }], calendarToggled: [{
357
+ type: Output
358
+ }] } });
359
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5uYS13ZWVrLWNhbGVuZGFyLWZpbHRlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbm5hLWNvcmUvc3JjL2xpYi9hbm5hLWRyb3Bkb3duLWxpYi9jb21wb25lbnRzL2FubmEtd2Vlay1jYWxlbmRhci1maWx0ZXIvYW5uYS13ZWVrLWNhbGVuZGFyLWZpbHRlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbm5hLWNvcmUvc3JjL2xpYi9hbm5hLWRyb3Bkb3duLWxpYi9jb21wb25lbnRzL2FubmEtd2Vlay1jYWxlbmRhci1maWx0ZXIvYW5uYS13ZWVrLWNhbGVuZGFyLWZpbHRlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSw0QkFBNEI7QUFDNUIsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDMUQsT0FBTyxFQUFpQixTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBcUIsTUFBTSxFQUFpQixNQUFNLGVBQWUsQ0FBQztBQUN4SCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsZ0NBQWdDO0FBQ2hDLE9BQU8sRUFDSCxXQUFXLEVBQ1gsT0FBTyxFQUNQLGFBQWEsRUFDYixtQkFBbUIsRUFFbkIsa0JBQWtCLEdBQ3JCLE1BQU0sNEJBQTRCLENBQUM7QUFDcEMsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBSTFCLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHNFQUFzRSxDQUFDO0FBQ2pILE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLG1FQUFtRSxDQUFDOzs7Ozs7QUFFNUcsaUNBQWlDO0FBU2pDLE1BQU0sT0FBTyx5QkFBeUI7SUFvQ2xDLFdBQVcsQ0FBQyxPQUFzQjtRQUM5QiwwREFBMEQ7UUFDMUQs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Q0FBQyxhQUFhLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRUQsZUFBZSxDQUFDLGFBQWtCO1FBQzlCLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUMxQixDQUFDOytHQXRaUSx5QkFBeUI7bUdBQXpCLHlCQUF5QiwwWUM3QnRDLGs1S0F1SkEsa2hJRDVIYyxJQUFJLDRGQUFFLFdBQVcsd2RBQUUsa0JBQWtCLHllQUFFLE9BQU8sb0ZBQUUsYUFBYTs7NEZBRTlELHlCQUF5QjtrQkFQckMsU0FBUzsrQkFDSSxvQ0FBb0MsY0FHbEMsSUFBSSxXQUNQLENBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRSxrQkFBa0IsRUFBRSxPQUFPLEVBQUUsYUFBYSxDQUFDO2tOQXNCL0QsZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQVFHLE1BQU07c0JBQWQsS0FBSztnQkFDSSx3QkFBd0I7c0JBQWpDLE1BQU07Z0JBQ0csZUFBZTtzQkFBeEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbIi8vIEFuZ3VsYXIgaW1wb3J0IHN0YXRlbWVudHNcclxuaW1wb3J0IHsgRGF0ZVBpcGUsIE5nQ2xhc3MsIE5nSWYgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uXCI7XHJcbmltcG9ydCB7IEFmdGVyVmlld0luaXQsIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25DaGFuZ2VzLCBPbkluaXQsIE91dHB1dCwgU2ltcGxlQ2hhbmdlcyB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcbi8vIFRoaXJkIHBhcnR5IGltcG9ydCBzdGF0ZW1lbnRzXHJcbmltcG9ydCB7XHJcbiAgICBOZ2JDYWxlbmRhcixcclxuICAgIE5nYkRhdGUsXHJcbiAgICBOZ2JEYXRlcGlja2VyLFxyXG4gICAgTmdiRGF0ZXBpY2tlckNvbmZpZyxcclxuICAgIE5nYkRhdGVTdHJ1Y3QsXHJcbiAgICBOZ2JJbnB1dERhdGVwaWNrZXIsXHJcbn0gZnJvbSBcIkBuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwXCI7XHJcbmltcG9ydCBkYXlqcyBmcm9tIFwiZGF5anNcIjtcclxuXHJcbmltcG9ydCB7IFdlZWtPYmplY3QgfSBmcm9tIFwiLi4vLi4vLi4vYW5uYS1jb3JlLXNoYXJlZC1saWIvbW9kZWxzL2FubmEtZ2VuZXJpYy1kYXRhLXR5cGUubW9kZWxcIjtcclxuaW1wb3J0IHsgSVdlZWtDYWxlbmRhciB9IGZyb20gXCIuLi8uLi8uLi9hbm5hLWNvcmUtc2hhcmVkLWxpYi9tb2RlbHMvYW5uYS1nbG9iYWwtZHJvcGRvd24tY29uZmlnLm1vZGVsXCI7XHJcbmltcG9ydCB7IEFubmFEYXRlVGltZUZvcm1hdFNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vLi4vYW5uYS1jb3JlLXNoYXJlZC1saWIvc2VydmljZXMvYW5uYS1kYXRlLXRpbWUtZm9ybWF0LnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgQW5uYUdsb2JhbENvbmZpZ1NlcnZpY2UgfSBmcm9tIFwiLi4vLi4vLi4vYW5uYS1jb3JlLXNoYXJlZC1saWIvc2VydmljZXMvYW5uYS1nbG9iYWwtY29uZmlnLnNlcnZpY2VcIjtcclxuXHJcbi8vIFVzZXIgZGVmaW5lZCBpbXBvcnQgc3RhdGVtZW50c1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogXCJhbm5hLWNvcmUtd2Vlay1jYWxlbmRhci1maWx0ZXItbGliXCIsXHJcbiAgICB0ZW1wbGF0ZVVybDogXCIuL2FubmEtd2Vlay1jYWxlbmRhci1maWx0ZXIuY29tcG9uZW50Lmh0bWxcIixcclxuICAgIHN0eWxlVXJsczogW1wiLi9hbm5hLXdlZWstY2FsZW5kYXItZmlsdGVyLmNvbXBvbmVudC5zY3NzXCJdLFxyXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICAgIGltcG9ydHM6IFtOZ0lmLCBGb3Jtc01vZHVsZSwgTmdiSW5wdXREYXRlcGlja2VyLCBOZ0NsYXNzLCBOZ2JEYXRlcGlja2VyXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIEFubmFXZWVrQ2FsZW5kYXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgQWZ0ZXJWaWV3SW5pdCB7XHJcbiAgICBmcm9tRGF0ZTogTmdiRGF0ZSB8IG51bGw7XHJcbiAgICBob3ZlcmVkRGF0ZTogTmdiRGF0ZSB8IG51bGwgPSBudWxsO1xyXG4gICAgdG9EYXRlOiBOZ2JEYXRlIHwgbnVsbCA9IG51bGw7XHJcbiAgICB0b2RheTogTmdiRGF0ZTtcclxuXHJcbiAgICBtb2RlbDogTmdiRGF0ZVN0cnVjdDtcclxuXHJcbiAgICB3ZWVrTnVtYmVyczogc3RyaW5nW10gPSBbXTtcclxuICAgIHBpcGU6IERhdGVQaXBlO1xyXG4gICAgZGF0ZVRvRGlzcGxheTogc3RyaW5nID0gXCJcIjtcclxuICAgIHdlZWtPYmplY3RzOiBXZWVrT2JqZWN0W107XHJcbiAgICBtdWx0aVNlbGVjdERyb3Bkb3duT3BlbjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgZGF0ZXBpY2tlcjogTmdiSW5wdXREYXRlcGlja2VyO1xyXG4gICAgcHJpdmF0ZSBmb3JtYXR0ZXI6IGFueTtcclxuICAgIHB1YmxpYyBmb3JtYXR0ZWRTdGFydERhdGU6IHN0cmluZztcclxuICAgIHB1YmxpYyBmb3JtYXR0ZWRFbmREYXRlOiBzdHJpbmc7XHJcbiAgICBwcml2YXRlIGNhbGVuZGFyTWFwID0gbmV3IE1hcCgpO1xyXG4gICAgcHJpdmF0ZSBmbGFnMTogYm9vbGVhbjtcclxuICAgIHByaXZhdGUgZmxhZzI6IGJvb2xlYW47XHJcbiAgICBASW5wdXQoKSBzZWxlY3RlZEZyb21EYXRlOiBOZ2JEYXRlU3RydWN0O1xyXG4gICAgQElucHV0KCkgc2VsZWN0ZWRFbmREYXRlOiBOZ2JEYXRlU3RydWN0O1xyXG4gICAgQElucHV0KCkgZGlzYWJsZWREYXRlczogTmdiRGF0ZVtdID0gW107XHJcbiAgICBASW5wdXQoKSBtYXhEYXRlOiBhbnk7XHJcbiAgICBASW5wdXQoKSBtaW5EYXRlOiBhbnk7XHJcblxyXG4gICAgZGlzYWJsZWRGdW5jOiBhbnk7XHJcbiAgICBzdGF0ZTogYW55O1xyXG5cclxuICAgIC8vIFNldHRpbmcgdGhlIGRlZmF1bHQgdmFsdWVzO1xyXG4gICAgcHJpdmF0ZSBkZWZhdWx0VmFsdWVzOiBJV2Vla0NhbGVuZGFyO1xyXG5cclxuICAgIEBJbnB1dCgpIGNvbmZpZzogSVdlZWtDYWxlbmRhcjtcclxuICAgIEBPdXRwdXQoKSBhcHBseVdlZWtDYWxlbmRhckNoYW5nZXMgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgICBAT3V0cHV0KCkgY2FsZW5kYXJUb2dnbGVkID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgICAgICAvLyBpZiBzb21lIHZhbHVlcyBhcmUgbm90IHNlbnQsIHNldHRpbmcgdGhlIGRlZmF1bHQgdmFsdWVzXHJcbiAgICAgICAgdGhpcy5kZWZhdWx0VmFsdWVzID0gdGhpcy5nbG9iYWxDb25maWdTZXJ2aWNlLmRlZmF1bHRXZWVrQ2FsZW5kYXJDb25maWc7XHJcbiAgICAgICAgdGhpcy5jb25maWcgPSB7IC4uLnRoaXMuZGVmYXVsdFZhbHVlcywgLi4udGhpcy5jb25maWcgfTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuY29uZmlnLnNlbGVjdEN1cnJlbnRXZWVrKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaW5pdGlhbGl6ZVdlZWtEYXRhKCk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmZyb21EYXRlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdFdlZWsodGhpcy5mcm9tRGF0ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZm9ybWF0dGVyID0gdGhpcy5mb3JtYXR0ZWREYXRlcygpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZEZyb21EYXRlICYmIHRoaXMuc2VsZWN0ZWRFbmREYXRlICYmIHRoaXMuY29uZmlnKSB7XHJcbiAgICAgICAgICAgIC8vIHRoaXMuc2VsZWN0V2Vlayh0aGlzLmZyb21EYXRlKTtcclxuICAgICAgICAgICAgdGhpcy5mcm9tRGF0ZSA9IE5nYkRhdGUuZnJvbSh0aGlzLnNlbGVjdGVkRnJvbURhdGUpO1xyXG4gICAgICAgICAgICB0aGlzLnRvRGF0ZSA9IE5nYkRhdGUuZnJvbSh0aGlzLnNlbGVjdGVkRW5kRGF0ZSk7XHJcbiAgICAgICAgICAgIHRoaXMud2Vla051bWJlckdlbmVyYXRvcigpO1xyXG4gICAgICAgICAgICB0aGlzLmRpc3BsYXlUb1VJKCk7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0Q2FsZW5kYXJNYXAoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkRGF0ZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICB0aGlzLmRpc2FibGVkRnVuYyA9IChkYXRlOiBOZ2JEYXRlLCBjdXJyZW50OiB7IG1vbnRoOiBudW1iZXIgfSkgPT4gdGhpcy5jaGVja0lmRGF0ZUlzRGlzYWJsZWQoZGF0ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHByaXZhdGUgY2FsZW5kYXI6IE5nYkNhbGVuZGFyLFxyXG4gICAgICAgIHByaXZhdGUgZGF0ZVBpY2tlckNvbmZpZzogTmdiRGF0ZXBpY2tlckNvbmZpZyxcclxuICAgICAgICBwcml2YXRlIGFubmFEYXRlVGltZUZvcm1hdFNlcnZpY2U6IEFubmFEYXRlVGltZUZvcm1hdFNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBnbG9iYWxDb25maWdTZXJ2aWNlOiBBbm5hR2xvYmFsQ29uZmlnU2VydmljZSxcclxuICAgICkge31cclxuXHJcbiAgICBnZXRXZWVrTnVtYmVyKHdlZWs6IGFueSwgZmlyc3REYXlPZldlZWs6IGFueSkge1xyXG4gICAgICAgIGNvbnN0IHdlZWtTdGFydERhdGUgPSBkYXlqcyhjb252ZXJ0TmdiRGF0ZVRvTW9tZW50KHdlZWtbMF0pLCBcIk1NL0REL1lZWVlcIik7XHJcbiAgICAgICAgY29uc3Qgd2Vla1llYXIgPSB3ZWVrU3RhcnREYXRlLnllYXIoKTtcclxuICAgICAgICBjb25zdCB5ZWFyU3RhcnREYXRlID0gZGF5anMoYDAxLzAxLyR7d2Vla1llYXJ9YCwgXCJNTS9ERC9ZWVlZXCIpO1xyXG4gICAgICAgIGNvbnN0IHdlZWtEYXkgPSB5ZWFyU3RhcnREYXRlLmRheSgpO1xyXG5cclxuICAgICAgICBjb25zdCBub09mRGF5cyA9IHdlZWtTdGFydERhdGUuZGlmZih5ZWFyU3RhcnREYXRlLCBcImRcIikgKyAxO1xyXG5cclxuICAgICAgICBmdW5jdGlvbiBjb252ZXJ0TmdiRGF0ZVRvTW9tZW50KG5nYkRhdGU6IE5nYkRhdGUpOiBzdHJpbmcge1xyXG4gICAgICAgICAgICBsZXQgY29udmVydGVkID0gbnVsbDtcclxuICAgICAgICAgICAgaWYgKG5nYkRhdGUgJiYgbmdiRGF0ZS5tb250aCAmJiBuZ2JEYXRlLmRheSAmJiBuZ2JEYXRlLnllYXIpIHtcclxuICAgICAgICAgICAgICAgIGNvbnZlcnRlZCA9IGAke25nYkRhdGUubW9udGh9LyR7bmdiRGF0ZS5kYXl9LyR7bmdiRGF0ZS55ZWFyfWA7XHJcbiAgICAgICAgICAgICAgICBjb252ZXJ0ZWQgPSBkYXlqcyhjb252ZXJ0ZWQpLmZvcm1hdChcIk1NL0REL1lZWVlcIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlZDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIGNoZWNrSWZZZWFySXNCcm9hZGNhc3RMZWFwWWVhcigpIHtcclxuICAgICAgICAgICAgY29uc3QgaXNMZWFwWWVhciA9ICh3ZWVrWWVhciAlIDQgPT09IDAgJiYgd2Vla1llYXIgJSAxMDAgIT09IDApIHx8IHdlZWtZZWFyICUgNDAwID09PSAwO1xyXG4gICAgICAgICAgICByZXR1cm4gKGlzTGVhcFllYXIgJiYgKHdlZWtEYXkgPT09IDAgfHwgd2Vla0RheSA9PT0gNikpIHx8ICghaXNMZWFwWWVhciAmJiB3ZWVrRGF5ID09PSAwKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGlzTGVhcFllYXIgPSBjaGVja0lmWWVhcklzQnJvYWRjYXN0TGVhcFllYXIoKTtcclxuICAgICAgICBjb25zdCBkaXZpZGVyID0gaXNMZWFwWWVhciA/IDUzIDogNTI7XHJcbiAgICAgICAgY29uc3QgYWRkZXIgPSBpc0xlYXBZZWFyID8gMiA6IDE7XHJcblxyXG4gICAgICAgIGNvbnN0IGJyb2FkY2FzdE51bWJlck9mRGF5cyA9IHdlZWtEYXkgKyBub09mRGF5cztcclxuICAgICAgICBjb25zdCBicm9hZGNhc3RXZWVrTnVtYmVyID1cclxuICAgICAgICAgICAgYnJvYWRjYXN0TnVtYmVyT2ZEYXlzICUgNyA+IDAgPyBicm9hZGNhc3ROdW1iZXJPZkRheXMgLyA3ICsgYWRkZXIgOiBicm9hZGNhc3ROdW1iZXJPZkRheXMgLyA3O1xyXG5cclxuICAgICAgICBpZiAoTWF0aC5mbG9vcihicm9hZGNhc3RXZWVrTnVtYmVyICUgZGl2aWRlcikgPT09IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIGRpdmlkZXI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBNYXRoLmZsb29yKGJyb2FkY2FzdFdlZWtOdW1iZXIgJSBkaXZpZGVyKTtcclxuICAgIH1cclxuXHJcbiAgICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgICAgICAgLy8gQ0hBTkdFU0BBTk5BTElCIENoYW5nZWQgdGhpcy5cclxuICAgICAgICAvLyB0aGlzLmNhbGVuZGFyW1wiX19wcm90b19fXCJdLmdldFdlZWtOdW1iZXIgPSB0aGlzLmdldFdlZWtOdW1iZXI7XHJcbiAgICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMuY2FsZW5kYXIsIHsgZ2V0V2Vla051bWJlcjogdGhpcy5nZXRXZWVrTnVtYmVyIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgICAgIC8vIHRoaXMuc2VsZWN0V2Vlayh0aGlzLmZyb21EYXRlKTtcclxuICAgICAgICB0aGlzLnNldENhbGVuZGFyTWFwKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdGlhbGl6ZVdlZWtEYXRhKCkge1xyXG4gICAgICAgIHRoaXMud2Vla09iamVjdHMgPSBbXTtcclxuXHJcbiAgICAgICAgdGhpcy5mcm9tRGF0ZSA9IHRoaXMuY2FsZW5kYXIuZ2V0VG9kYXkoKTtcclxuICAgICAgICB0aGlzLnRvZGF5ID0gdGhpcy5jYWxlbmRhci5nZXRUb2RheSgpO1xyXG5cclxuICAgICAgICBjb25zdCBiYWNrRGF0ZWRQZXJpb2QgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwidXNlckRldGFpbHNcIikgfHwgXCJ7fVwiKS5sb2NraW5nX3BlcmlvZF9kYXlzO1xyXG4gICAgICAgIGlmIChiYWNrRGF0ZWRQZXJpb2QgPCAwKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRhdGU6IE5nYkRhdGUgPSB0aGlzLmNhbGVuZGFyLmdldFByZXYodGhpcy5jYWxlbmRhci5nZXRUb2RheSgpLCBcImRcIiwgTWF0aC5hYnMoYmFja0RhdGVkUGVyaW9kKSk7XHJcbiAgICAgICAgICAgIHRoaXMudG9kYXkgPSBOZ2JEYXRlLmZyb20oZGF0ZSk7XHJcbiAgICAgICAgICAgIHRoaXMuZnJvbURhdGUgPSBOZ2JEYXRlLmZyb20oZGF0ZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBEaXNhYmxlIG1vbnRocyBiZWZvcmUgbnVtYmVyT2ZNb250aHNUb0VuYWJsZVxyXG4gICAgICAgIHRoaXMuZGF0ZVBpY2tlckNvbmZpZy5tYXJrRGlzYWJsZWQgPSAoZGF0ZTogTmdiRGF0ZVN0cnVjdCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBwcmV2aW91c01vbnRoID0gdGhpcy5jYWxlbmRhci5nZXRQcmV2KHRoaXMudG9kYXksIFwibVwiLCB0aGlzLmNvbmZpZy5udW1iZXJPZk1vbnRoc1RvRW5hYmxlSW5QYXN0KTtcclxuICAgICAgICAgICAgY29uc3QgcHJldmlvdXNEYXkgPSB0aGlzLmNhbGVuZGFyLmdldFByZXYocHJldmlvdXNNb250aCwgXCJkXCIsIDEpO1xyXG4gICAgICAgICAgICByZXR1cm4gIU5nYkRhdGUuZnJvbShwcmV2aW91c0RheSkuYmVmb3JlKGRhdGUpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5mb3JtYXR0ZXIgPSB0aGlzLmZvcm1hdHRlZERhdGVzKCk7XHJcbiAgICAgICAgdGhpcy5mbGFnMSA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuZmxhZzIgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBzZWxlY3RXZWVrKGRhdGU6IE5nYkRhdGUpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBkYXRlT2JqZWN0ID0gbmV3IERhdGUoZGF0ZS55ZWFyLCBkYXRlLm1vbnRoIC0gMSwgZGF0ZS5kYXkpO1xyXG4gICAgICAgIGxldCBjb25zdHJ1Y3REYXRlID0gdGhpcy5idWlsZERhdGUoZGF0ZU9iamVjdCk7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5jb25maWcuc2VsZWN0TXVsdGlwbGVXZWVrcykge1xyXG4gICAgICAgICAgICAvLyBTaW5nbGUgd2VlayBzZWxlY3Rpb25cclxuICAgICAgICAgICAgdGhpcy5mcm9tRGF0ZSA9IHRoaXMuY29uc3RydWN0U3RhcnREYXRlKGRhdGVPYmplY3QpKGNvbnN0cnVjdERhdGUpO1xyXG4gICAgICAgICAgICB0aGlzLnRvRGF0ZSA9IHRoaXMuY29uc3RydWN0RW5kRGF0ZShkYXRlT2JqZWN0KShjb25zdHJ1Y3REYXRlKTtcclxuICAgICAgICAgICAgdGhpcy53ZWVrTnVtYmVyR2VuZXJhdG9yKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKGRhdGUuYmVmb3JlKHRoaXMuZnJvbURhdGUpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZyb21EYXRlID0gdGhpcy5jb25zdHJ1Y3RTdGFydERhdGUoZGF0ZU9iamVjdCkoY29uc3RydWN0RGF0ZSk7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5mbGFnMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG9EYXRlID0gdGhpcy5jb25zdHJ1Y3RFbmREYXRlKGRhdGVPYmplY3QpKGNvbnN0cnVjdERhdGUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5mbGFnMSA9ICF0aGlzLmZsYWcxO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGRhdGUuYWZ0ZXIodGhpcy50b0RhdGUpKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5mbGFnMikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZnJvbURhdGUgPSB0aGlzLmNvbnN0cnVjdFN0YXJ0RGF0ZShkYXRlT2JqZWN0KShjb25zdHJ1Y3REYXRlKTtcclxuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLnRvRGF0ZSA9IHRoaXMuY29uc3RydWN0RW5kRGF0ZShkYXRlT2JqZWN0KShjb25zdHJ1Y3REYXRlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuZmxhZzIgPSAhdGhpcy5mbGFnMjtcclxuICAgICAgICAgICAgICAgIHRoaXMudG9EYXRlID0gdGhpcy5jb25zdHJ1Y3RFbmREYXRlKGRhdGVPYmplY3QpKGNvbnN0cnVjdERhdGUpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5mcm9tRGF0ZSA9IHRoaXMuY29uc3RydWN0U3RhcnREYXRlKGRhdGVPYmplY3QpKGNvbnN0cnVjdERhdGUpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy50b0RhdGUgPSB0aGlzLmNvbnN0cnVjdEVuZERhdGUoZGF0ZU9iamVjdCkoY29uc3RydWN0RGF0ZSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmRpc2FibGVkRGF0ZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZGF5anNTdGFydERhdGUgPSBkYXlqcyhcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFubmFEYXRlVGltZUZvcm1hdFNlcnZpY2UuY29udmVydE5nYkRhdGVUb01vbWVudCh0aGlzLmZyb21EYXRlKSxcclxuICAgICAgICAgICAgICAgICAgICBcIk1NL0REL1lZWVlcIixcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkYXlqc0VuZERhdGUgPSBkYXlqcyhcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFubmFEYXRlVGltZUZvcm1hdFNlcnZpY2UuY29udmVydE5nYkRhdGVUb01vbWVudCh0aGlzLnRvRGF0ZSksXHJcbiAgICAgICAgICAgICAgICAgICAgXCJNTS9ERC9ZWVlZXCIsXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgbGV0IG5nYkRhdGU7XHJcbiAgICAgICAgICAgICAgICB3aGlsZSAoIWRheWpzU3RhcnREYXRlLmlzU2FtZShkYXlqc0VuZERhdGUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbmdiRGF0ZSA9IHRoaXMuYW5uYURhdGVUaW1lRm9ybWF0U2VydmljZS5jb252ZXJ0VG9OZ2JEYXRlKGRheWpzU3RhcnREYXRlLCBcIk1NL0REL1lZWVlcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY2hlY2tJZkRhdGVJc0Rpc2FibGVkKG5nYkRhdGUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBkYXlqc1N0YXJ0RGF0ZS5hZGQoMSwgXCJkXCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV3RGF0ZU9iamVjdCA9IG5ldyBEYXRlKG5nYkRhdGUueWVhciwgbmdiRGF0ZS5tb250aCAtIDEsIG5nYkRhdGUuZGF5IC0gMSk7XHJcbiAgICAgICAgICAgICAgICBjb25zdHJ1Y3REYXRlID0gdGhpcy5idWlsZERhdGUobmV3RGF0ZU9iamVjdCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRvRGF0ZSA9IHRoaXMuY29uc3RydWN0RW5kRGF0ZShuZXdEYXRlT2JqZWN0KShjb25zdHJ1Y3REYXRlKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy53ZWVrTnVtYmVyR2VuZXJhdG9yKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXRoaXMuY29uZmlnLnNob3dBc0Ryb3Bkb3duKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYXBwbHlDaGFuZ2VzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHdlZWtOdW1iZXJHZW5lcmF0b3IoKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgZGF0ZXMgPSBbXTtcclxuICAgICAgICBsZXQgd2VlayA9IFtdO1xyXG5cclxuICAgICAgICBsZXQgc3RhcnREYXRlID0gTmdiRGF0ZS5mcm9tKHRoaXMuZnJvbURhdGUpO1xyXG4gICAgICAgIGNvbnN0IGVuZERhdGUgPSBOZ2JEYXRlLmZyb20odGhpcy50b0RhdGUpO1xyXG5cclxuICAgICAgICB3ZWVrLnB1c2goc3RhcnREYXRlKTtcclxuICAgICAgICB3aGlsZSAoZW5kRGF0ZSAhPSBudWxsICYmICFzdGFydERhdGUuZXF1YWxzKGVuZERhdGUpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRhdGUgPSB0aGlzLmNhbGVuZGFyLmdldE5leHQoc3RhcnREYXRlLCBcImRcIiwgMSk7XHJcbiAgICAgICAgICAgIHN0YXJ0RGF0ZSA9IGRhdGU7XHJcbiAgICAgICAgICAgIHdlZWsucHVzaChkYXRlKTtcclxuXHJcbiAgICAgICAgICAgIC8vIENvbGxlY3QgYWxsIGRheXMgaW4gd2VlayB0byBjYWxjdWxhdGUgdGhlIHdlZWsgbnVtYmVyXHJcbiAgICAgICAgICAgIGlmICh3ZWVrLmxlbmd0aCA9PT0gNykge1xyXG4gICAgICAgICAgICAgICAgZGF0ZXMucHVzaCh3ZWVrKTtcclxuICAgICAgICAgICAgICAgIHdlZWsgPSBbXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoKHRoaXMuY29uZmlnLm1heFdlZWtzVG9TZWxlY3QgPz8gMCkgPiAwICYmIGRhdGVzLmxlbmd0aCA+ICh0aGlzLmNvbmZpZy5tYXhXZWVrc1RvU2VsZWN0ID8/IDApKSB7XHJcbiAgICAgICAgICAgIGRhdGVzLnNwbGljZSh0aGlzLmNvbmZpZy5tYXhXZWVrc1RvU2VsZWN0ID8/IDAsIGRhdGVzLmxlbmd0aCAtICh0aGlzLmNvbmZpZy5tYXhXZWVrc1RvU2VsZWN0ID8/IDApKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVzKGRhdGVzKTtcclxuXHJcbiAgICAgICAgdGhpcy53ZWVrTnVtYmVycyA9IFtdO1xyXG4gICAgICAgIHRoaXMud2Vla09iamVjdHMgPSBbXTtcclxuXHJcbiAgICAgICAgZGF0ZXMuZm9yRWFjaCgoZGF0ZSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLndlZWtOdW1iZXJzLnB1c2goYCBXZWVrICR7dGhpcy5jYWxlbmRhci5nZXRXZWVrTnVtYmVyKGRhdGUsIHRoaXMuY29uZmlnLmZpcnN0RGF5T2ZXZWVrKX1gKTtcclxuICAgICAgICAgICAgY29uc3QgZm9ybWF0dGVkRGF0ZXMgPSB0aGlzLmZvcm1hdHRlcihkYXRlWzBdLCBkYXRlWzZdKTtcclxuICAgICAgICAgICAgY29uc3QgZGF0ZU9iamVjdHMgPSB7XHJcbiAgICAgICAgICAgICAgICBzdGFydERhdGU6IGZvcm1hdHRlZERhdGVzLmZvcm1hdHRlZFN0YXJ0RGF0ZSxcclxuICAgICAgICAgICAgICAgIGVuZERhdGU6IGZvcm1hdHRlZERhdGVzLmZvcm1hdHRlZEVuZERhdGUsXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIHRoaXMud2Vla09iamVjdHMucHVzaChkYXRlT2JqZWN0cyk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuZGlzcGxheVRvVUkoKTtcclxuICAgIH1cclxuXHJcbiAgICBzZWxlY3RlZERhdGVzKGRhdGVzOiBhbnkpIHtcclxuICAgICAgICB0aGlzLmZyb21EYXRlID0gZGF0ZXNbMF1bMF07XHJcbiAgICAgICAgdGhpcy50b0RhdGUgPSBkYXRlc1tkYXRlcy5sZW5ndGggLSAxXVs2XTtcclxuICAgIH1cclxuXHJcbiAgICBmb3JtYXR0ZWREYXRlcygpIHtcclxuICAgICAgICBjb25zdCBwaXBlID0gbmV3IERhdGVQaXBlKFwiZW4tVVNcIik7XHJcbiAgICAgICAgcmV0dXJuIChmcm9tRGF0ZTogTmdiRGF0ZSwgdG9EYXRlOiBOZ2JEYXRlKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGZyb21EYXRlT2JqZWN0ID0gbmV3IERhdGUoZnJvbURhdGUueWVhciwgZnJvbURhdGUubW9udGggLSAxLCBmcm9tRGF0ZS5kYXkpO1xyXG4gICAgICAgICAgICBjb25zdCB0b0RhdGVPYmplY3QgPSBuZXcgRGF0ZSh0b0RhdGUueWVhciwgdG9EYXRlLm1vbnRoIC0gMSwgdG9EYXRlLmRheSk7XHJcbiAgICAgICAgICAgIHRoaXMuZm9ybWF0dGVkU3RhcnREYXRlID0gcGlwZS50cmFuc2Zvcm0oZnJvbURhdGVPYmplY3QsIHRoaXMuY29uZmlnLmRhdGVGb3JtYXRGb3JSZXF1ZXN0KTtcclxuICAgICAgICAgICAgdGhpcy5mb3JtYXR0ZWRFbmREYXRlID0gcGlwZS50cmFuc2Zvcm0odG9EYXRlT2JqZWN0LCB0aGlzLmNvbmZpZy5kYXRlRm9ybWF0Rm9yUmVxdWVzdCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmRhdGVUb0Rpc3BsYXkgPSBgJHtwaXBlLnRyYW5zZm9ybShcclxuICAgICAgICAgICAgICAgIGZyb21EYXRlT2JqZWN0LFxyXG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWcuZGF0ZUZvcm1hdFRvRGlzcGxheSxcclxuICAgICAgICAgICAgKX0gdG8gJHtwaXBlLnRyYW5zZm9ybSh0b0RhdGVPYmplY3QsIHRoaXMuY29uZmlnLmRhdGVGb3JtYXRUb0Rpc3BsYXkpfWA7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgZGlzcGxheVRvVUkoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmNvbmZpZy5zZWxlY3RNdWx0aXBsZVdlZWtzICYmIHRoaXMuZnJvbURhdGUgJiYgdGhpcy50b0RhdGUpIHtcclxuICAgICAgICAgICAgLy8gRGlzcGxheSBmb3Igb25seSBTaW5nbGUgV2Vla1xyXG4gICAgICAgICAgICB0aGlzLmZvcm1hdHRlcih0aGlzLmZyb21EYXRlLCB0aGlzLnRvRGF0ZSk7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLndlZWtOdW1iZXJzLmxlbmd0aCA+ICh0aGlzLmNvbmZpZy5tYXhXZWVrc1RvU2hvd1dpdGhSZW1haW5pbmdDb3VudCA/PyAwKSkge1xyXG4gICAgICAgICAgICAvLyBEaXNwbGF5IGZvciBNdWx0aXBsZSBXZWVrc1xyXG4gICAgICAgICAgICBjb25zdCB3ZWVrRGlzcGxheSA9IFtdO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8ICh0aGlzLmNvbmZpZy5tYXhXZWVrc1RvU2hvd1dpdGhSZW1haW5pbmdDb3VudCA/PyAwKTsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICB3ZWVrRGlzcGxheS5wdXNoKHRoaXMud2Vla051bWJlcnMuc2hpZnQoKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3QgcmVtYWluaW5nV2Vla3MgPSB0aGlzLndlZWtOdW1iZXJzLmxlbmd0aDtcclxuICAgICAgICAgICAgdGhpcy53ZWVrTnVtYmVycyA9IFtdO1xyXG4gICAgICAgICAgICB0aGlzLndlZWtOdW1iZXJzLnB1c2goYCR7d2Vla0Rpc3BsYXl9ICske3JlbWFpbmluZ1dlZWtzfWApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjb25zdHJ1Y3RTdGFydERhdGUoZGF0ZTogRGF0ZSkge1xyXG4gICAgICAgIGNvbnN0IHsgZmlyc3REYXlPZldlZWsgfSA9IHRoaXMuY29uZmlnO1xyXG4gICAgICAgIHJldHVybiAoY29uc3RydWN0RGF0ZTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0RGF5ID0gZGF0ZS5nZXREYXkoKSAhPT0gMCA/IChmaXJzdERheU9mV2VlayA/PyAwKSAtIGRhdGUuZ2V0RGF5KCkgOiAtNjtcclxuICAgICAgICAgICAgcmV0dXJuIGNvbnN0cnVjdERhdGUoc3RhcnREYXkpO1xyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3RydWN0RW5kRGF0ZShkYXRlOiBEYXRlKSB7XHJcbiAgICAgICAgY29uc3QgeyBmaXJzdERheU9mV2VlayB9ID0gdGhpcy5jb25maWc7XHJcbiAgICAgICAgcmV0dXJuIChjb25zdHJ1Y3REYXRlOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgZW5kRGF5ID0gZGF0ZS5nZXREYXkoKSAhPT0gMCA/IChmaXJzdERheU9mV2VlayA/PyAwKSArIDYgLSBkYXRlLmdldERheSgpIDogMDtcclxuICAgICAgICAgICAgcmV0dXJuIGNvbnN0cnVjdERhdGUoZW5kRGF5KTtcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIGJ1aWxkRGF0ZShkYXRlOiBEYXRlKSB7XHJcbiAgICAgICAgcmV0dXJuIChudW1iZXI6IG51bWJlcik6IE5nYkRhdGUgfCBudWxsID0+IHtcclxuICAgICAgICAgICAgY29uc3QgZGF5ID0gZGF0ZS5nZXREYXRlKCkgKyBudW1iZXI7XHJcbiAgICAgICAgICAgIGNvbnN0IGRhdGVPYmplY3QgPSBuZXcgRGF0ZShkYXRlLmdldEZ1bGxZZWFyKCksIGRhdGUuZ2V0TW9udGgoKSwgZGF5KTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IG5nYkRhdGVPYmplY3QgPSB7fSBhcyBOZ2JEYXRlO1xyXG4gICAgICAgICAgICBuZ2JEYXRlT2JqZWN0LmRheSA9IGRheTtcclxuXHJcbiAgICAgICAgICAgIGlmIChuZ2JEYXRlT2JqZWN0LmRheSA+IDMxIHx8IG5nYkRhdGVPYmplY3QuZGF5IDwgMSkge1xyXG4gICAgICAgICAgICAgICAgbmdiRGF0ZU9iamVjdC5kYXkgPSBkYXRlT2JqZWN0LmdldERhdGUoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbmdiRGF0ZU9iamVjdC5tb250aCA9IGRhdGVPYmplY3QuZ2V0TW9udGgoKSArIDE7XHJcbiAgICAgICAgICAgIG5nYkRhdGVPYmplY3QueWVhciA9IGRhdGVPYmplY3QuZ2V0RnVsbFllYXIoKTtcclxuICAgICAgICAgICAgcmV0dXJuIE5nYkRhdGUuZnJvbShuZ2JEYXRlT2JqZWN0KTtcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIGlzSG92ZXJlZChkYXRlOiBOZ2JEYXRlKTogYm9vbGVhbiB8IG51bGwge1xyXG4gICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgIHRoaXMuZnJvbURhdGUgJiZcclxuICAgICAgICAgICAgIXRoaXMudG9EYXRlICYmXHJcbiAgICAgICAgICAgIHRoaXMuaG92ZXJlZERhdGUgJiZcclxuICAgICAgICAgICAgZGF0ZS5hZnRlcih0aGlzLmZyb21EYXRlKSAmJlxyXG4gICAgICAgICAgICBkYXRlLmJlZm9yZSh0aGlzLmhvdmVyZWREYXRlKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgaXNJbnNpZGUoZGF0ZTogTmdiRGF0ZSk6IGJvb2xlYW4gfCBudWxsIHtcclxuICAgICAgICByZXR1cm4gdGhpcy50b0RhdGUgJiYgZGF0ZS5hZnRlcih0aGlzLmZyb21EYXRlKSAmJiBkYXRlLmJlZm9yZSh0aGlzLnRvRGF0ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgaXNSYW5nZShkYXRlOiBOZ2JEYXRlKTogYm9vbGVhbiB8IG51bGwge1xyXG4gICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgIGRhdGUuZXF1YWxzKHRoaXMuZnJvbURhdGUpIHx8XHJcbiAgICAgICAgICAgICh0aGlzLnRvRGF0ZSAmJiBkYXRlLmVxdWFscyh0aGlzLnRvRGF0ZSkpIHx8XHJcbiAgICAgICAgICAgIHRoaXMuaXNJbnNpZGUoZGF0ZSkgfHxcclxuICAgICAgICAgICAgdGhpcy5pc0hvdmVyZWQoZGF0ZSlcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHByZXZpb3VzV2VlaygpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5mcm9tRGF0ZSkge1xyXG4gICAgICAgICAgICB0aGlzLnRvRGF0ZSA9IHRoaXMuY2FsZW5kYXIuZ2V0UHJldih0aGlzLmZyb21EYXRlLCBcImRcIiwgMSk7XHJcbiAgICAgICAgICAgIHRoaXMuZnJvbURhdGUgPSB0aGlzLmNhbGVuZGFyLmdldFByZXYodGhpcy5mcm9tRGF0ZSwgXCJkXCIsIHRoaXMuY2FsZW5kYXIuZ2V0RGF5c1BlcldlZWsoKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMud2Vla051bWJlckdlbmVyYXRvcigpO1xyXG4gICAgICAgIHRoaXMuYXBwbHlDaGFuZ2VzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgbmV4dFdlZWsoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuZnJvbURhdGUpIHtcclxuICAgICAgICAgICAgdGhpcy5mcm9tRGF0ZSA9IHRoaXMuY2FsZW5kYXIuZ2V0TmV4dCh0aGlzLmZyb21EYXRlLCBcImRcIiwgdGhpcy5jYWxlbmRhci5nZXREYXlzUGVyV2VlaygpKTtcclxuICAgICAgICAgICAgdGhpcy50b0RhdGUgPSB0aGlzLmNhbGVuZGFyLmdldE5leHQodGhpcy5mcm9tRGF0ZSwgXCJkXCIsIHRoaXMuY2FsZW5kYXIuZ2V0RGF5c1BlcldlZWsoKSAtIDEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLndlZWtOdW1iZXJHZW5lcmF0b3IoKTtcclxuICAgICAgICB0aGlzLmFwcGx5Q2hhbmdlcygpO1xyXG4gICAgfVxyXG5cclxuICAgIHNldENhbGVuZGFyTWFwKCkge1xyXG4gICAgICAgIGNvbnN0IGRhdGVPYmogPSB7IGZyb21EYXRlOiB0aGlzLmZyb21EYXRlLCB0b0RhdGU6IHRoaXMudG9EYXRlIH07XHJcbiAgICAgICAgdGhpcy5jYWxlbmRhck1hcC5zZXQoXCJvbGREYXRlc1wiLCBkYXRlT2JqKTtcclxuICAgIH1cclxuXHJcbiAgICBhcHBseUNoYW5nZXMoKSB7XHJcbiAgICAgICAgdGhpcy5tdWx0aVNlbGVjdERyb3Bkb3duT3BlbiA9IGZhbHNlO1xyXG4gICAgICAgIGlmICghdGhpcy5jb25maWcuZW1pdE11bHRpcGxlV2Vla09iamVjdHMpIHtcclxuICAgICAgICAgICAgY29uc3QgZGF0ZXMgPSB7fSBhcyBXZWVrT2JqZWN0O1xyXG4gICAgICAgICAgICBjb25zdCBmb3JtYXR0ZWREYXRlcyA9IHRoaXMuZm9ybWF0dGVyKHRoaXMuZnJvbURhdGUsIHRoaXMudG9EYXRlKTtcclxuICAgICAgICAgICAgZGF0ZXMuc3RhcnREYXRlID0gZm9ybWF0dGVkRGF0ZXMuZm9ybWF0dGVkU3RhcnREYXRlO1xyXG4gICAgICAgICAgICBkYXRlcy5lbmREYXRlID0gZm9ybWF0dGVkRGF0ZXMuZm9ybWF0dGVkRW5kRGF0ZTtcclxuICAgICAgICAgICAgdGhpcy5hcHBseVdlZWtDYWxlbmRhckNoYW5nZXMuZW1pdChkYXRlcyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5hcHBseVdlZWtDYWxlbmRhckNoYW5nZXMuZW1pdCh0aGlzLndlZWtPYmplY3RzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5zZXRDYWxlbmRhck1hcCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGlzRm9jdXNlZCh2YWx1ZTogYW55KSB7XHJcbiAgICAgICAgdGhpcy5jYWxlbmRhclRvZ2dsZWQuZW1pdCh2YWx1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgaXNEcm9wZG93bk9wZW5lZEZvckNhbGVuZGFyKGRhdGVwaWNrZXI6IE5nYklucHV0RGF0ZXBpY2tlcikge1xyXG4gICAgICAgIHRoaXMuZGF0ZXBpY2tlciA9IGRhdGVwaWNrZXI7XHJcbiAgICAgICAgaWYgKHRoaXMuZGF0ZXBpY2tlci5pc09wZW4oKSkge1xyXG4gICAgICAgICAgICB0aGlzLnJldmVydERhdGVzKCk7XHJcbiAgICAgICAgICAgIHRoaXMuZGF0ZXBpY2tlci5jbG9zZSgpO1xyXG4gICAgICAgICAgICB0aGlzLm11bHRpU2VsZWN0RHJvcGRvd25PcGVuID0gZmFsc2U7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5kYXRlcGlja2VyLm9wZW4oKTtcclxuICAgICAgICAgICAgdGhpcy5tdWx0aVNlbGVjdERyb3Bkb3duT3BlbiA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldmVydERhdGVzKCkge1xyXG4gICAgICAgIHRoaXMubXVsdGlTZWxlY3REcm9wZG93bk9wZW4gPSBmYWxzZTtcclxuICAgICAgICBpZiAodGhpcy5jYWxlbmRhck1hcC5nZXQoXCJvbGREYXRlc1wiKSkge1xyXG4gICAgICAgICAgICBjb25zdCBkYXRlT2JqID0gdGhpcy5jYWxlbmRhck1hcC5nZXQoXCJvbGREYXRlc1wiKTtcclxuICAgICAgICAgICAgdGhpcy5mcm9tRGF0ZSA9IGRhdGVPYmouZnJvbURhdGU7XHJcbiAgICAgICAgICAgIHRoaXMudG9EYXRlID0gZGF0ZU9iai50b0RhdGU7XHJcbiAgICAgICAgICAgIHRoaXMud2Vla051bWJlckdlbmVyYXRvcigpO1xyXG4gICAgICAgICAgICB0aGlzLmRpc3BsYXlUb1VJKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNoZWNrSWZEYXRlSXNEaXNhYmxlZChkYXRlOiBhbnkpOiBib29sZWFuIHtcclxuICAgICAgICBjb25zdCB2YWxpZGF0b3JGdW5jID0gKG5nYkRhdGU6IE5nYkRhdGUpID0+XHJcbiAgICAgICAgICAgIG5nYkRhdGUueWVhciA9PT0gZGF0ZS55ZWFyICYmIG5nYkRhdGUubW9udGggPT09IGRhdGUubW9udGggJiYgbmdiRGF0ZS5kYXkgPT09IGRhdGUuZGF5O1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRpc2FibGVkRGF0ZXMuc29tZSh2YWxpZGF0b3JGdW5jKTtcclxuICAgIH1cclxuXHJcbiAgICBjbG9zZURhdGVwaWNrZXIoZGF0ZXBpY2tlclJlZjogYW55KSB7XHJcbiAgICAgICAgZGF0ZXBpY2tlclJlZi5jbG9zZSgpO1xyXG4gICAgfVxyXG59XHJcbiIsIjxmb3JtXHJcbiAgICBjbGFzcz1cImZvcm0taW5saW5lXCJcclxuICAgICpuZ0lmPVwiY29uZmlnLnNob3dBc0Ryb3Bkb3duXCJcclxuPlxyXG4gICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgaGlkZGVuXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwXCI+XHJcbiAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgICAgbmFtZT1cImRhdGVwaWNrZXIgZC1ub25lXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcclxuICAgICAgICAgICAgICAgIG5nYkRhdGVwaWNrZXJcclxuICAgICAgICAgICAgICAgICNkYXRlcGlja2VyPVwibmdiRGF0ZXBpY2tlclwiXHJcbiAgICAgICAgICAgICAgICBbYXV0b0Nsb3NlXT1cImZhbHNlXCJcclxuICAgICAgICAgICAgICAgIChkYXRlU2VsZWN0KT1cInNlbGVjdFdlZWsoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAoY2xvc2VkKT1cImlzRm9jdXNlZChmYWxzZSlcIlxyXG4gICAgICAgICAgICAgICAgW2Rpc3BsYXlNb250aHNdPVwiMVwiXHJcbiAgICAgICAgICAgICAgICBbZGF5VGVtcGxhdGVdPVwidFwiXHJcbiAgICAgICAgICAgICAgICBbc3RhcnREYXRlXT1cImZyb21EYXRlIVwiXHJcbiAgICAgICAgICAgICAgICBbZmlyc3REYXlPZldlZWtdPVwiY29uZmlnLmZpcnN0RGF5T2ZXZWVrXCJcclxuICAgICAgICAgICAgICAgIFtzaG93V2Vla051bWJlcnNdPVwiY29uZmlnLnNob3dXZWVrTnVtYmVyc1wiXHJcbiAgICAgICAgICAgICAgICB0YWJpbmRleD1cIi0xXCJcclxuICAgICAgICAgICAgICAgIFtmb290ZXJUZW1wbGF0ZV09XCJmb290ZXJUZW1wbGF0ZVwiXHJcbiAgICAgICAgICAgIC8+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tU2luZ2xlIHdlZWsgc2VsZWN0LS0+XHJcbiAgICA8ZGl2ICpuZ0lmPVwiIWNvbmZpZy5zZWxlY3RNdWx0aXBsZVdlZWtzXCI+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJ3ZWVrbnVtYmVycy1sYWJlbFwiPiAmbmJzcDt7eyB3ZWVrTnVtYmVycyB9fSA8L3NwYW4+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2luZ2xlLXdlZWtcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGVmdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtYXRlcmlhbC1pY29ucyBuZXh0LXJvdW5kLWJ0blwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicHJldmlvdXNXZWVrKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0ZV9uZXh0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgI2RwRnJvbURhdGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlbGVjdCBXZWVrc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIltjb25maWcuY3VzdG9tQ2xhc3MgPT09ICcnID8gJycgOiBjb25maWcuY3VzdG9tQ2xhc3NdXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT1cImRwRnJvbURhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiZGF0ZVRvRGlzcGxheVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImlzRm9jdXNlZCh0cnVlKTsgaXNEcm9wZG93bk9wZW5lZEZvckNhbGVuZGFyKGRhdGVwaWNrZXIpXCJcclxuICAgICAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWRpIG1kaS1tZW51LWRvd25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiFkYXRlcGlja2VyLmlzT3BlbigpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImRhdGVwaWNrZXIub3BlbigpXCJcclxuICAgICAgICAgICAgICAgICAgICA+PC9pPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWRpIG1kaS1tZW51LXVwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJkYXRlcGlja2VyLmlzT3BlbigpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImlzRHJvcGRvd25PcGVuZWRGb3JDYWxlbmRhcihkYXRlcGlja2VyKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmlnaHRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWF0ZXJpYWwtaWNvbnMgcm91bmQtYnRuXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJuZXh0V2VlaygpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdGVfbmV4dFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8IS0tTXVsdGlwbGUgd2VlayBzZWxlY3QtLT5cclxuICAgIDxkaXZcclxuICAgICAgICBjbGFzcz1cImZvcm0tZ3JvdXBcIlxyXG4gICAgICAgICpuZ0lmPVwiY29uZmlnLnNlbGVjdE11bHRpcGxlV2Vla3NcIlxyXG4gICAgPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXVsdGlwbGUtd2Vla3NcIj5cclxuICAgICAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgICAgICAgICNkcEZyb21EYXRlXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxyXG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VsZWN0IFdlZWtzXCJcclxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJbY29uZmlnLmN1c3RvbUNsYXNzID09PSAnJyA/ICcnIDogY29uZmlnLmN1c3RvbUNsYXNzXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgbmFtZT1cImRwRnJvbURhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwid2Vla051bWJlcnNcIlxyXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJpc0ZvY3VzZWQodHJ1ZSk7IGlzRHJvcGRvd25PcGVuZWRGb3JDYWxlbmRhcihkYXRlcGlja2VyKVwiXHJcbiAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgPGlcclxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiFtdWx0aVNlbGVjdERyb3Bkb3duT3BlblwiXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtZGkgbWRpLW1lbnUtZG93biBtdWx0aXNlbGVjdC1pbnB1dC1hcnJvd1wiXHJcbiAgICAgICAgICAgICAgICA+PC9pPlxyXG4gICAgICAgICAgICAgICAgPGlcclxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIm11bHRpU2VsZWN0RHJvcGRvd25PcGVuXCJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1kaSBtZGktbWVudS11cCBtdWx0aXNlbGVjdC1pbnB1dC1hcnJvd1wiXHJcbiAgICAgICAgICAgICAgICA+PC9pPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L2Zvcm0+XHJcblxyXG48bmdiLWRhdGVwaWNrZXJcclxuICAgICN3ZWVrUGlja2VyXHJcbiAgICAqbmdJZj1cIiFjb25maWcuc2hvd0FzRHJvcGRvd25cIlxyXG4gICAgW2Rpc3BsYXlNb250aHNdPVwiMVwiXHJcbiAgICBbc3RhcnREYXRlXT1cImZyb21EYXRlIVwiXHJcbiAgICBbZmlyc3REYXlPZldlZWtdPVwiY29uZmlnLmZpcnN0RGF5T2ZXZWVrXCJcclxuICAgIFtzaG93V2Vla051bWJlcnNdPVwiY29uZmlnLnNob3dXZWVrTnVtYmVyc1wiXHJcbiAgICBbZGF5VGVtcGxhdGVdPVwidFwiXHJcbiAgICBbbWF4RGF0ZV09XCJtYXhEYXRlXCJcclxuICAgIFttaW5EYXRlXT1cIm1pbkRhdGVcIlxyXG4gICAgKGRhdGVTZWxlY3QpPVwic2VsZWN0V2VlaygkZXZlbnQpXCJcclxuICAgIFttYXJrRGlzYWJsZWRdPVwiZGlzYWJsZWRGdW5jXCJcclxuPlxyXG48L25nYi1kYXRlcGlja2VyPlxyXG5cclxuPG5nLXRlbXBsYXRlICNmb290ZXJUZW1wbGF0ZT5cclxuICAgIDxociBjbGFzcz1cIm15LTBcIiAvPlxyXG4gICAgPGJ1dHRvblxyXG4gICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IGJ0bi1zbSBtLTIgZmxvYXQtcmlnaHQgYXBwbHktYnRuXCJcclxuICAgICAgICAoY2xpY2spPVwiYXBwbHlDaGFuZ2VzKCk7IGNsb3NlRGF0ZXBpY2tlcihkYXRlcGlja2VyKVwiXHJcbiAgICA+XHJcbiAgICAgICAgQXBwbHlcclxuICAgIDwvYnV0dG9uPlxyXG4gICAgPGJ1dHRvblxyXG4gICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IGJ0bi1zbSBtLTIgZmxvYXQtcmlnaHQgY2FuY2VsLWJ0blwiXHJcbiAgICAgICAgKGNsaWNrKT1cInJldmVydERhdGVzKCk7IGNsb3NlRGF0ZXBpY2tlcihkYXRlcGlja2VyKVwiXHJcbiAgICA+XHJcbiAgICAgICAgQ2FuY2VsXHJcbiAgICA8L2J1dHRvbj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcbjxuZy10ZW1wbGF0ZVxyXG4gICAgI3RcclxuICAgIGxldC1kYXRlXHJcbiAgICBsZXQtZm9jdXNlZD1cImZvY3VzZWRcIlxyXG4gICAgbGV0LWRpc2FibGVkPVwiZGlzYWJsZWRcIlxyXG4+XHJcbiAgICA8c3BhblxyXG4gICAgICAgIGNsYXNzPVwiY3VzdG9tLWRheVwiXHJcbiAgICAgICAgW2NsYXNzLmZvY3VzZWRdPVwiZm9jdXNlZFwiXHJcbiAgICAgICAgW2NsYXNzLnJhbmdlXT1cImlzUmFuZ2UoZGF0ZSlcIlxyXG4gICAgICAgIFtjbGFzcy5mYWRlZF09XCJpc0hvdmVyZWQoZGF0ZSkgfHwgaXNJbnNpZGUoZGF0ZSlcIlxyXG4gICAgICAgIFtjbGFzcy5kaXNhYmxlZF09XCJkaXNhYmxlZFwiXHJcbiAgICAgICAgKG1vdXNlZW50ZXIpPVwiaG92ZXJlZERhdGUgPSBkYXRlXCJcclxuICAgICAgICAobW91c2VsZWF2ZSk9XCJob3ZlcmVkRGF0ZSA9IG51bGxcIlxyXG4gICAgPlxyXG4gICAgICAgIHt7IGRhdGUuZGF5IH19XHJcbiAgICA8L3NwYW4+XHJcbjwvbmctdGVtcGxhdGU+XHJcbiJdfQ==