@dereekb/dbx-form 9.17.2 → 9.18.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 (144) hide show
  1. package/calendar/README.md +6 -0
  2. package/calendar/index.d.ts +1 -0
  3. package/calendar/lib/calendar.module.d.ts +29 -0
  4. package/calendar/lib/calendar.schedule.selection.cell.component.d.ts +14 -0
  5. package/calendar/lib/calendar.schedule.selection.component.d.ts +27 -0
  6. package/calendar/lib/calendar.schedule.selection.d.ts +29 -0
  7. package/calendar/lib/calendar.schedule.selection.days.component.d.ts +17 -0
  8. package/calendar/lib/calendar.schedule.selection.days.form.component.d.ts +10 -0
  9. package/calendar/lib/calendar.schedule.selection.dialog.button.component.d.ts +12 -0
  10. package/calendar/lib/calendar.schedule.selection.dialog.component.d.ts +12 -0
  11. package/calendar/lib/calendar.schedule.selection.form.d.ts +4 -0
  12. package/calendar/lib/calendar.schedule.selection.popover.button.component.d.ts +15 -0
  13. package/calendar/lib/calendar.schedule.selection.popover.component.d.ts +14 -0
  14. package/calendar/lib/calendar.schedule.selection.popover.content.component.d.ts +7 -0
  15. package/calendar/lib/calendar.schedule.selection.range.component.d.ts +37 -0
  16. package/calendar/lib/calendar.schedule.selection.store.d.ts +142 -0
  17. package/calendar/lib/calendar.schedule.selection.store.provide.d.ts +24 -0
  18. package/calendar/lib/field/index.d.ts +1 -0
  19. package/calendar/lib/field/schedule/calendar.schedule.field.component.d.ts +40 -0
  20. package/calendar/lib/field/schedule/calendar.schedule.field.d.ts +6 -0
  21. package/calendar/lib/field/schedule/calendar.schedule.module.d.ts +15 -0
  22. package/calendar/lib/field/schedule/index.d.ts +3 -0
  23. package/calendar/lib/index.d.ts +16 -0
  24. package/esm2020/calendar/dereekb-dbx-form-calendar.mjs +5 -0
  25. package/esm2020/calendar/index.mjs +2 -0
  26. package/esm2020/calendar/lib/calendar.module.mjs +138 -0
  27. package/esm2020/calendar/lib/calendar.schedule.selection.cell.component.mjs +46 -0
  28. package/esm2020/calendar/lib/calendar.schedule.selection.component.mjs +72 -0
  29. package/esm2020/calendar/lib/calendar.schedule.selection.days.component.mjs +45 -0
  30. package/esm2020/calendar/lib/calendar.schedule.selection.days.form.component.mjs +26 -0
  31. package/esm2020/calendar/lib/calendar.schedule.selection.dialog.button.component.mjs +32 -0
  32. package/esm2020/calendar/lib/calendar.schedule.selection.dialog.component.mjs +35 -0
  33. package/esm2020/calendar/lib/calendar.schedule.selection.form.mjs +15 -0
  34. package/esm2020/calendar/lib/calendar.schedule.selection.mjs +30 -0
  35. package/esm2020/calendar/lib/calendar.schedule.selection.popover.button.component.mjs +45 -0
  36. package/esm2020/calendar/lib/calendar.schedule.selection.popover.component.mjs +37 -0
  37. package/esm2020/calendar/lib/calendar.schedule.selection.popover.content.component.mjs +27 -0
  38. package/esm2020/calendar/lib/calendar.schedule.selection.range.component.mjs +99 -0
  39. package/esm2020/calendar/lib/calendar.schedule.selection.store.mjs +294 -0
  40. package/esm2020/calendar/lib/calendar.schedule.selection.store.provide.mjs +52 -0
  41. package/esm2020/calendar/lib/field/index.mjs +3 -0
  42. package/esm2020/calendar/lib/field/schedule/calendar.schedule.field.component.mjs +95 -0
  43. package/esm2020/calendar/lib/field/schedule/calendar.schedule.field.mjs +16 -0
  44. package/esm2020/calendar/lib/field/schedule/calendar.schedule.module.mjs +54 -0
  45. package/esm2020/calendar/lib/field/schedule/index.mjs +4 -0
  46. package/esm2020/calendar/lib/index.mjs +17 -0
  47. package/esm2020/lib/form/action/form.action.directive.mjs +4 -4
  48. package/esm2020/lib/form/action/form.action.module.mjs +5 -5
  49. package/esm2020/lib/form/action/transition/form.action.transition.module.mjs +5 -5
  50. package/esm2020/lib/form/action/transition/form.action.transition.safety.directive.mjs +4 -4
  51. package/esm2020/lib/form/form.module.mjs +5 -5
  52. package/esm2020/lib/form/io/form.changes.directive.mjs +4 -4
  53. package/esm2020/lib/form/io/form.input.directive.mjs +4 -4
  54. package/esm2020/lib/form/io/form.io.module.mjs +5 -5
  55. package/esm2020/lib/form/io/form.loading.directive.mjs +4 -4
  56. package/esm2020/lib/form.module.mjs +5 -5
  57. package/esm2020/lib/formly/field/checklist/checklist.item.field.component.mjs +7 -7
  58. package/esm2020/lib/formly/field/checklist/checklist.item.field.content.default.component.mjs +4 -4
  59. package/esm2020/lib/formly/field/checklist/checklist.item.field.module.mjs +5 -5
  60. package/esm2020/lib/formly/field/component/component.field.component.mjs +4 -4
  61. package/esm2020/lib/formly/field/component/component.field.module.mjs +5 -5
  62. package/esm2020/lib/formly/field/form.field.module.mjs +5 -5
  63. package/esm2020/lib/formly/field/selection/list/list.field.component.mjs +4 -4
  64. package/esm2020/lib/formly/field/selection/list/list.field.module.mjs +5 -5
  65. package/esm2020/lib/formly/field/selection/pickable/pickable.chip.field.component.mjs +4 -4
  66. package/esm2020/lib/formly/field/selection/pickable/pickable.field.directive.mjs +4 -4
  67. package/esm2020/lib/formly/field/selection/pickable/pickable.field.module.mjs +5 -5
  68. package/esm2020/lib/formly/field/selection/pickable/pickable.list.field.component.mjs +13 -13
  69. package/esm2020/lib/formly/field/selection/searchable/searchable.chip.field.component.mjs +4 -4
  70. package/esm2020/lib/formly/field/selection/searchable/searchable.field.autocomplete.item.component.mjs +10 -10
  71. package/esm2020/lib/formly/field/selection/searchable/searchable.field.directive.mjs +4 -4
  72. package/esm2020/lib/formly/field/selection/searchable/searchable.field.module.mjs +5 -5
  73. package/esm2020/lib/formly/field/selection/searchable/searchable.text.field.component.mjs +4 -4
  74. package/esm2020/lib/formly/field/selection/selection.module.mjs +5 -5
  75. package/esm2020/lib/formly/field/texteditor/texteditor.field.component.mjs +4 -4
  76. package/esm2020/lib/formly/field/texteditor/texteditor.field.module.mjs +5 -5
  77. package/esm2020/lib/formly/field/value/array/array.field.component.mjs +14 -6
  78. package/esm2020/lib/formly/field/value/array/array.field.mjs +3 -2
  79. package/esm2020/lib/formly/field/value/array/array.field.module.mjs +5 -5
  80. package/esm2020/lib/formly/field/value/boolean/boolean.field.module.mjs +5 -5
  81. package/esm2020/lib/formly/field/value/date/date.field.module.mjs +5 -5
  82. package/esm2020/lib/formly/field/value/date/datetime.field.component.mjs +19 -9
  83. package/esm2020/lib/formly/field/value/number/number.field.mjs +4 -1
  84. package/esm2020/lib/formly/field/value/number/number.field.module.mjs +5 -5
  85. package/esm2020/lib/formly/field/value/phone/phone.field.component.mjs +4 -4
  86. package/esm2020/lib/formly/field/value/phone/phone.field.module.mjs +5 -5
  87. package/esm2020/lib/formly/field/value/text/text.field.module.mjs +5 -5
  88. package/esm2020/lib/formly/field/value/value.module.mjs +5 -5
  89. package/esm2020/lib/formly/field/wrapper/autotouch.wrapper.component.mjs +4 -4
  90. package/esm2020/lib/formly/field/wrapper/expandable.wrapper.component.mjs +4 -4
  91. package/esm2020/lib/formly/field/wrapper/expandable.wrapper.delegate.mjs +4 -4
  92. package/esm2020/lib/formly/field/wrapper/flex.wrapper.component.mjs +4 -4
  93. package/esm2020/lib/formly/field/wrapper/form.wrapper.module.mjs +5 -5
  94. package/esm2020/lib/formly/field/wrapper/info.wrapper.component.mjs +4 -4
  95. package/esm2020/lib/formly/field/wrapper/section.wrapper.component.mjs +4 -4
  96. package/esm2020/lib/formly/field/wrapper/style.wrapper.component.mjs +4 -4
  97. package/esm2020/lib/formly/field/wrapper/subsection.wrapper.component.mjs +4 -4
  98. package/esm2020/lib/formly/field/wrapper/toggle.wrapper.component.mjs +4 -4
  99. package/esm2020/lib/formly/field/wrapper/working.wrapper.component.mjs +4 -4
  100. package/esm2020/lib/formly/formly.context.directive.mjs +4 -4
  101. package/esm2020/lib/formly/formly.directive.mjs +13 -13
  102. package/esm2020/lib/formly/formly.form.component.mjs +4 -4
  103. package/esm2020/lib/formly/formly.module.mjs +5 -5
  104. package/esm2020/lib/layout/form.layout.module.mjs +5 -5
  105. package/esm2020/lib/layout/form.spacer.component.mjs +4 -4
  106. package/esm2020/mapbox/lib/field/latlng/latlng.field.component.mjs +4 -4
  107. package/esm2020/mapbox/lib/field/latlng/latlng.module.mjs +5 -5
  108. package/esm2020/mapbox/lib/field/zoom/zoom.field.component.mjs +4 -4
  109. package/esm2020/mapbox/lib/field/zoom/zoom.module.mjs +5 -5
  110. package/esm2020/mapbox/lib/mapbox.module.mjs +5 -5
  111. package/fesm2015/dereekb-dbx-form-calendar.mjs +1063 -0
  112. package/fesm2015/dereekb-dbx-form-calendar.mjs.map +1 -0
  113. package/fesm2015/dereekb-dbx-form-mapbox.mjs +18 -18
  114. package/fesm2015/dereekb-dbx-form-mapbox.mjs.map +1 -1
  115. package/fesm2015/dereekb-dbx-form.mjs +252 -230
  116. package/fesm2015/dereekb-dbx-form.mjs.map +1 -1
  117. package/fesm2020/dereekb-dbx-form-calendar.mjs +1055 -0
  118. package/fesm2020/dereekb-dbx-form-calendar.mjs.map +1 -0
  119. package/fesm2020/dereekb-dbx-form-mapbox.mjs +18 -18
  120. package/fesm2020/dereekb-dbx-form-mapbox.mjs.map +1 -1
  121. package/fesm2020/dereekb-dbx-form.mjs +252 -230
  122. package/fesm2020/dereekb-dbx-form.mjs.map +1 -1
  123. package/lib/extension/_extension.scss +38 -0
  124. package/lib/extension/calendar/_calendar.scss +89 -0
  125. package/lib/formly/field/value/array/array.field.component.d.ts +9 -2
  126. package/lib/formly/field/value/array/array.field.d.ts +1 -0
  127. package/lib/formly/field/value/date/datetime.field.component.d.ts +9 -7
  128. package/lib/formly/field/value/number/number.field.d.ts +4 -0
  129. package/lib/style/_all-core.scss +3 -1
  130. package/lib/style/_all-theme.scss +2 -0
  131. package/lib/style/_all-typography.scss +3 -1
  132. package/lib/style/_config.scss +16 -0
  133. package/lib/style/_core.scss +2 -2
  134. package/mapbox/esm2020/lib/field/latlng/latlng.field.component.mjs +4 -4
  135. package/mapbox/esm2020/lib/field/latlng/latlng.module.mjs +5 -5
  136. package/mapbox/esm2020/lib/field/zoom/zoom.field.component.mjs +4 -4
  137. package/mapbox/esm2020/lib/field/zoom/zoom.module.mjs +5 -5
  138. package/mapbox/esm2020/lib/mapbox.module.mjs +5 -5
  139. package/mapbox/fesm2015/dereekb-dbx-form-mapbox.mjs +18 -18
  140. package/mapbox/fesm2015/dereekb-dbx-form-mapbox.mjs.map +1 -1
  141. package/mapbox/fesm2020/dereekb-dbx-form-mapbox.mjs +18 -18
  142. package/mapbox/fesm2020/dereekb-dbx-form-mapbox.mjs.map +1 -1
  143. package/mapbox/package.json +7 -7
  144. package/package.json +16 -8
@@ -0,0 +1,37 @@
1
+ import { Component } from '@angular/core';
2
+ import { AbstractPopoverDirective } from '@dereekb/dbx-web';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "@dereekb/dbx-web";
5
+ import * as i2 from "./calendar.schedule.selection.popover.content.component";
6
+ export const DEFAULT_SCHEDULE_SELECTION_CALENDAR_DATE_POPOVER_KEY = 'calendarselection';
7
+ export class DbxScheduleSelectionCalendarDatePopoverComponent extends AbstractPopoverDirective {
8
+ static openPopover(popoverService, { origin, injector }, popoverKey) {
9
+ return popoverService.open({
10
+ key: popoverKey ?? DEFAULT_SCHEDULE_SELECTION_CALENDAR_DATE_POPOVER_KEY,
11
+ origin,
12
+ componentClass: DbxScheduleSelectionCalendarDatePopoverComponent,
13
+ injector
14
+ });
15
+ }
16
+ }
17
+ DbxScheduleSelectionCalendarDatePopoverComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: DbxScheduleSelectionCalendarDatePopoverComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
18
+ DbxScheduleSelectionCalendarDatePopoverComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: DbxScheduleSelectionCalendarDatePopoverComponent, selector: "ng-component", usesInheritance: true, ngImport: i0, template: `
19
+ <dbx-popover-content>
20
+ <dbx-popover-scroll-content>
21
+ <dbx-schedule-selection-calendar-date-popover-content (close)="close()"></dbx-schedule-selection-calendar-date-popover-content>
22
+ </dbx-popover-scroll-content>
23
+ </dbx-popover-content>
24
+ `, isInline: true, dependencies: [{ kind: "component", type: i1.DbxPopoverContentComponent, selector: "dbx-popover-content" }, { kind: "component", type: i1.DbxPopoverScrollContentComponent, selector: "dbx-popover-scroll-content" }, { kind: "component", type: i2.DbxScheduleSelectionCalendarDatePopoverContentComponent, selector: "dbx-schedule-selection-calendar-date-popover-content" }] });
25
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: DbxScheduleSelectionCalendarDatePopoverComponent, decorators: [{
26
+ type: Component,
27
+ args: [{
28
+ template: `
29
+ <dbx-popover-content>
30
+ <dbx-popover-scroll-content>
31
+ <dbx-schedule-selection-calendar-date-popover-content (close)="close()"></dbx-schedule-selection-calendar-date-popover-content>
32
+ </dbx-popover-scroll-content>
33
+ </dbx-popover-content>
34
+ `
35
+ }]
36
+ }] });
37
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXIuc2NoZWR1bGUuc2VsZWN0aW9uLnBvcG92ZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvZGJ4LWZvcm0vY2FsZW5kYXIvc3JjL2xpYi9jYWxlbmRhci5zY2hlZHVsZS5zZWxlY3Rpb24ucG9wb3Zlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBd0IsTUFBTSxlQUFlLENBQUM7QUFDaEUsT0FBTyxFQUFpQix3QkFBd0IsRUFBcUIsTUFBTSxrQkFBa0IsQ0FBQzs7OztBQUc5RixNQUFNLENBQUMsTUFBTSxvREFBb0QsR0FBRyxtQkFBbUIsQ0FBQztBQWdCeEYsTUFBTSxPQUFPLGdEQUFpRCxTQUFRLHdCQUE4QjtJQUNsRyxNQUFNLENBQUMsV0FBVyxDQUFDLGNBQWlDLEVBQUUsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFpRCxFQUFFLFVBQTBCO1FBQ25KLE9BQU8sY0FBYyxDQUFDLElBQUksQ0FBQztZQUN6QixHQUFHLEVBQUUsVUFBVSxJQUFJLG9EQUFvRDtZQUN2RSxNQUFNO1lBQ04sY0FBYyxFQUFFLGdEQUFnRDtZQUNoRSxRQUFRO1NBQ1QsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7OElBUlUsZ0RBQWdEO2tJQUFoRCxnREFBZ0QsMkVBUmpEOzs7Ozs7R0FNVDs0RkFFVSxnREFBZ0Q7a0JBVDVELFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFOzs7Ozs7R0FNVDtpQkFDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgSW5qZWN0b3IgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERieFBvcG92ZXJLZXksIEFic3RyYWN0UG9wb3ZlckRpcmVjdGl2ZSwgRGJ4UG9wb3ZlclNlcnZpY2UgfSBmcm9tICdAZGVyZWVrYi9kYngtd2ViJztcbmltcG9ydCB7IE5nUG9wb3ZlclJlZiB9IGZyb20gJ25nLW92ZXJsYXktY29udGFpbmVyJztcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfU0NIRURVTEVfU0VMRUNUSU9OX0NBTEVOREFSX0RBVEVfUE9QT1ZFUl9LRVkgPSAnY2FsZW5kYXJzZWxlY3Rpb24nO1xuXG5leHBvcnQgaW50ZXJmYWNlIERieFNjaGVkdWxlU2VsZWN0aW9uQ2FsZW5kYXJEYXRlUG9wb3ZlckNvbmZpZyB7XG4gIG9yaWdpbjogRWxlbWVudFJlZjtcbiAgaW5qZWN0b3I6IEluamVjdG9yO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGJ4LXBvcG92ZXItY29udGVudD5cbiAgICAgIDxkYngtcG9wb3Zlci1zY3JvbGwtY29udGVudD5cbiAgICAgICAgPGRieC1zY2hlZHVsZS1zZWxlY3Rpb24tY2FsZW5kYXItZGF0ZS1wb3BvdmVyLWNvbnRlbnQgKGNsb3NlKT1cImNsb3NlKClcIj48L2RieC1zY2hlZHVsZS1zZWxlY3Rpb24tY2FsZW5kYXItZGF0ZS1wb3BvdmVyLWNvbnRlbnQ+XG4gICAgICA8L2RieC1wb3BvdmVyLXNjcm9sbC1jb250ZW50PlxuICAgIDwvZGJ4LXBvcG92ZXItY29udGVudD5cbiAgYFxufSlcbmV4cG9ydCBjbGFzcyBEYnhTY2hlZHVsZVNlbGVjdGlvbkNhbGVuZGFyRGF0ZVBvcG92ZXJDb21wb25lbnQgZXh0ZW5kcyBBYnN0cmFjdFBvcG92ZXJEaXJlY3RpdmU8dm9pZD4ge1xuICBzdGF0aWMgb3BlblBvcG92ZXIocG9wb3ZlclNlcnZpY2U6IERieFBvcG92ZXJTZXJ2aWNlLCB7IG9yaWdpbiwgaW5qZWN0b3IgfTogRGJ4U2NoZWR1bGVTZWxlY3Rpb25DYWxlbmRhckRhdGVQb3BvdmVyQ29uZmlnLCBwb3BvdmVyS2V5PzogRGJ4UG9wb3ZlcktleSk6IE5nUG9wb3ZlclJlZjxhbnksIG51bWJlcj4ge1xuICAgIHJldHVybiBwb3BvdmVyU2VydmljZS5vcGVuKHtcbiAgICAgIGtleTogcG9wb3ZlcktleSA/PyBERUZBVUxUX1NDSEVEVUxFX1NFTEVDVElPTl9DQUxFTkRBUl9EQVRFX1BPUE9WRVJfS0VZLFxuICAgICAgb3JpZ2luLFxuICAgICAgY29tcG9uZW50Q2xhc3M6IERieFNjaGVkdWxlU2VsZWN0aW9uQ2FsZW5kYXJEYXRlUG9wb3ZlckNvbXBvbmVudCxcbiAgICAgIGluamVjdG9yXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,27 @@
1
+ import { Component } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "./calendar.schedule.selection.days.component";
4
+ import * as i2 from "./calendar.schedule.selection.range.component";
5
+ export class DbxScheduleSelectionCalendarDatePopoverContentComponent {
6
+ ngOnDestroy() { }
7
+ }
8
+ DbxScheduleSelectionCalendarDatePopoverContentComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: DbxScheduleSelectionCalendarDatePopoverContentComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
9
+ DbxScheduleSelectionCalendarDatePopoverContentComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: DbxScheduleSelectionCalendarDatePopoverContentComponent, selector: "dbx-schedule-selection-calendar-date-popover-content", ngImport: i0, template: `
10
+ <div>
11
+ <dbx-schedule-selection-calendar-date-range></dbx-schedule-selection-calendar-date-range>
12
+ <dbx-schedule-selection-calendar-date-days></dbx-schedule-selection-calendar-date-days>
13
+ </div>
14
+ `, isInline: true, dependencies: [{ kind: "component", type: i1.DbxScheduleSelectionCalendarDateDaysComponent, selector: "dbx-schedule-selection-calendar-date-days" }, { kind: "component", type: i2.DbxScheduleSelectionCalendarDateRangeComponent, selector: "dbx-schedule-selection-calendar-date-range", inputs: ["required", "appearance", "label", "hint", "disabled", "showCustomize"] }] });
15
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: DbxScheduleSelectionCalendarDatePopoverContentComponent, decorators: [{
16
+ type: Component,
17
+ args: [{
18
+ selector: 'dbx-schedule-selection-calendar-date-popover-content',
19
+ template: `
20
+ <div>
21
+ <dbx-schedule-selection-calendar-date-range></dbx-schedule-selection-calendar-date-range>
22
+ <dbx-schedule-selection-calendar-date-days></dbx-schedule-selection-calendar-date-days>
23
+ </div>
24
+ `
25
+ }]
26
+ }] });
27
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXIuc2NoZWR1bGUuc2VsZWN0aW9uLnBvcG92ZXIuY29udGVudC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9kYngtZm9ybS9jYWxlbmRhci9zcmMvbGliL2NhbGVuZGFyLnNjaGVkdWxlLnNlbGVjdGlvbi5wb3BvdmVyLmNvbnRlbnQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWEsTUFBTSxlQUFlLENBQUM7Ozs7QUFXckQsTUFBTSxPQUFPLHVEQUF1RDtJQUNsRSxXQUFXLEtBQVUsQ0FBQzs7cUpBRFgsdURBQXVEO3lJQUF2RCx1REFBdUQsNEZBUHhEOzs7OztHQUtUOzRGQUVVLHVEQUF1RDtrQkFUbkUsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsc0RBQXNEO29CQUNoRSxRQUFRLEVBQUU7Ozs7O0dBS1Q7aUJBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdkYngtc2NoZWR1bGUtc2VsZWN0aW9uLWNhbGVuZGFyLWRhdGUtcG9wb3Zlci1jb250ZW50JyxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2PlxuICAgICAgPGRieC1zY2hlZHVsZS1zZWxlY3Rpb24tY2FsZW5kYXItZGF0ZS1yYW5nZT48L2RieC1zY2hlZHVsZS1zZWxlY3Rpb24tY2FsZW5kYXItZGF0ZS1yYW5nZT5cbiAgICAgIDxkYngtc2NoZWR1bGUtc2VsZWN0aW9uLWNhbGVuZGFyLWRhdGUtZGF5cz48L2RieC1zY2hlZHVsZS1zZWxlY3Rpb24tY2FsZW5kYXItZGF0ZS1kYXlzPlxuICAgIDwvZGl2PlxuICBgXG59KVxuZXhwb3J0IGNsYXNzIERieFNjaGVkdWxlU2VsZWN0aW9uQ2FsZW5kYXJEYXRlUG9wb3ZlckNvbnRlbnRDb21wb25lbnQgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICBuZ09uRGVzdHJveSgpOiB2b2lkIHt9XG59XG4iXX0=
@@ -0,0 +1,99 @@
1
+ import { switchMap, throttleTime } from 'rxjs/operators';
2
+ import { SubscriptionObject } from '@dereekb/rxjs';
3
+ import { Component, Input } from '@angular/core';
4
+ import { DbxCalendarScheduleSelectionStore } from './calendar.schedule.selection.store';
5
+ import { DbxCalendarStore } from '@dereekb/dbx-web/calendar';
6
+ import { FormGroup, FormControl } from '@angular/forms';
7
+ import { randomNumberFactory } from '@dereekb/util';
8
+ import { distinctUntilChanged, filter, BehaviorSubject, startWith, of } from 'rxjs';
9
+ import { isSameDateDay } from '@dereekb/date';
10
+ import * as i0 from "@angular/core";
11
+ import * as i1 from "@dereekb/dbx-web/calendar";
12
+ import * as i2 from "./calendar.schedule.selection.store";
13
+ import * as i3 from "@angular/forms";
14
+ import * as i4 from "@angular/common";
15
+ import * as i5 from "@angular/material/form-field";
16
+ import * as i6 from "@dereekb/dbx-web";
17
+ import * as i7 from "@angular/material/datepicker";
18
+ export class DbxScheduleSelectionCalendarDateRangeComponent {
19
+ constructor(dbxCalendarStore, dbxCalendarScheduleSelectionStore) {
20
+ this.dbxCalendarStore = dbxCalendarStore;
21
+ this.dbxCalendarScheduleSelectionStore = dbxCalendarScheduleSelectionStore;
22
+ this.appearance = 'fill';
23
+ this.label = 'Enter a date range';
24
+ this.showCustomize = false;
25
+ this.random = randomNumberFactory(10000)();
26
+ this._pickerOpened = new BehaviorSubject(false);
27
+ this._syncSub = new SubscriptionObject();
28
+ this._valueSub = new SubscriptionObject();
29
+ this.range = new FormGroup({
30
+ start: new FormControl(null),
31
+ end: new FormControl(null)
32
+ });
33
+ this.minDate$ = this.dbxCalendarScheduleSelectionStore.minDate$;
34
+ this.maxDate$ = this.dbxCalendarScheduleSelectionStore.maxDate$;
35
+ this.isCustomized$ = this.dbxCalendarScheduleSelectionStore.isCustomized$;
36
+ this.pickerOpened$ = this._pickerOpened.asObservable();
37
+ }
38
+ set disabled(disabled) {
39
+ if (disabled) {
40
+ this.range.disable();
41
+ }
42
+ else {
43
+ this.range.enable();
44
+ }
45
+ }
46
+ ngOnInit() {
47
+ this._syncSub.subscription = this.dbxCalendarScheduleSelectionStore.inputRange$.subscribe((x) => {
48
+ this.range.setValue({
49
+ start: x.inputStart ?? null,
50
+ end: x.inputEnd ?? null
51
+ });
52
+ });
53
+ this._valueSub.subscription = this._pickerOpened
54
+ .pipe(distinctUntilChanged(), switchMap((opened) => {
55
+ let obs;
56
+ if (opened) {
57
+ obs = of({});
58
+ }
59
+ else {
60
+ obs = this.range.valueChanges.pipe(startWith(this.range.value));
61
+ }
62
+ return obs;
63
+ }), filter((x) => Boolean(x.start && x.end)), distinctUntilChanged((a, b) => isSameDateDay(a.start, b.start) && isSameDateDay(a.end, b.end)), throttleTime(100, undefined, { trailing: true }))
64
+ .subscribe((x) => {
65
+ if (x.start && x.end) {
66
+ this.dbxCalendarScheduleSelectionStore.setInputRange({ inputStart: x.start, inputEnd: x.end });
67
+ }
68
+ });
69
+ }
70
+ ngOnDestroy() {
71
+ this._syncSub.destroy();
72
+ this._valueSub.destroy();
73
+ }
74
+ pickerOpened() {
75
+ this._pickerOpened.next(true);
76
+ }
77
+ pickerClosed() {
78
+ this._pickerOpened.next(false);
79
+ }
80
+ }
81
+ DbxScheduleSelectionCalendarDateRangeComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: DbxScheduleSelectionCalendarDateRangeComponent, deps: [{ token: i1.DbxCalendarStore }, { token: i2.DbxCalendarScheduleSelectionStore }], target: i0.ɵɵFactoryTarget.Component });
82
+ DbxScheduleSelectionCalendarDateRangeComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: DbxScheduleSelectionCalendarDateRangeComponent, selector: "dbx-schedule-selection-calendar-date-range", inputs: { required: "required", appearance: "appearance", label: "label", hint: "hint", disabled: "disabled", showCustomize: "showCustomize" }, ngImport: i0, template: "<mat-form-field class=\"dbx-schedule-selection-calendar-date-range-field\" [appearance]=\"appearance\">\n <mat-label *ngIf=\"label\">{{ label }}</mat-label>\n <div *ngIf=\"showCustomize && (isCustomized$ | async)\" class=\"date-range-field-customized\">\n <span class=\"dbx-accent-bg date-range-field-customized-text\">Custom</span>\n </div>\n <mat-date-range-input [required]=\"required\" [min]=\"minDate$ | async\" [max]=\"maxDate$ | async\" [formGroup]=\"range\" [rangePicker]=\"picker\">\n <input matStartDate formControlName=\"start\" placeholder=\"Start date\" />\n <input matEndDate formControlName=\"end\" placeholder=\"End date\" />\n </mat-date-range-input>\n <mat-datepicker-toggle matIconSuffix [for]=\"picker\"></mat-datepicker-toggle>\n <div *ngIf=\"showCustomize\">\n <dbx-button-spacer></dbx-button-spacer>\n <ng-content select=\"[customizeButton]\"></ng-content>\n </div>\n <mat-date-range-picker #picker (opened)=\"pickerOpened()\" (closed)=\"pickerClosed()\"></mat-date-range-picker>\n <mat-error *ngIf=\"range.controls.start.hasError('matStartDateInvalid')\">Invalid start date</mat-error>\n <mat-error *ngIf=\"range.controls.end.hasError('matEndDateInvalid')\">Invalid end date</mat-error>\n</mat-form-field>\n", dependencies: [{ kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.MatError, selector: "mat-error", inputs: ["id"] }, { kind: "component", type: i5.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i5.MatLabel, selector: "mat-label" }, { kind: "directive", type: i6.DbxButtonSpacerDirective, selector: "dbx-button-spacer,[dbxButtonSpacer]" }, { kind: "component", type: i7.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { kind: "component", type: i7.MatDateRangeInput, selector: "mat-date-range-input", inputs: ["rangePicker", "required", "dateFilter", "min", "max", "disabled", "separator", "comparisonStart", "comparisonEnd"], exportAs: ["matDateRangeInput"] }, { kind: "directive", type: i7.MatStartDate, selector: "input[matStartDate]", inputs: ["errorStateMatcher"], outputs: ["dateChange", "dateInput"] }, { kind: "directive", type: i7.MatEndDate, selector: "input[matEndDate]", inputs: ["errorStateMatcher"], outputs: ["dateChange", "dateInput"] }, { kind: "component", type: i7.MatDateRangePicker, selector: "mat-date-range-picker", exportAs: ["matDateRangePicker"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }] });
83
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: DbxScheduleSelectionCalendarDateRangeComponent, decorators: [{
84
+ type: Component,
85
+ args: [{ selector: 'dbx-schedule-selection-calendar-date-range', template: "<mat-form-field class=\"dbx-schedule-selection-calendar-date-range-field\" [appearance]=\"appearance\">\n <mat-label *ngIf=\"label\">{{ label }}</mat-label>\n <div *ngIf=\"showCustomize && (isCustomized$ | async)\" class=\"date-range-field-customized\">\n <span class=\"dbx-accent-bg date-range-field-customized-text\">Custom</span>\n </div>\n <mat-date-range-input [required]=\"required\" [min]=\"minDate$ | async\" [max]=\"maxDate$ | async\" [formGroup]=\"range\" [rangePicker]=\"picker\">\n <input matStartDate formControlName=\"start\" placeholder=\"Start date\" />\n <input matEndDate formControlName=\"end\" placeholder=\"End date\" />\n </mat-date-range-input>\n <mat-datepicker-toggle matIconSuffix [for]=\"picker\"></mat-datepicker-toggle>\n <div *ngIf=\"showCustomize\">\n <dbx-button-spacer></dbx-button-spacer>\n <ng-content select=\"[customizeButton]\"></ng-content>\n </div>\n <mat-date-range-picker #picker (opened)=\"pickerOpened()\" (closed)=\"pickerClosed()\"></mat-date-range-picker>\n <mat-error *ngIf=\"range.controls.start.hasError('matStartDateInvalid')\">Invalid start date</mat-error>\n <mat-error *ngIf=\"range.controls.end.hasError('matEndDateInvalid')\">Invalid end date</mat-error>\n</mat-form-field>\n" }]
86
+ }], ctorParameters: function () { return [{ type: i1.DbxCalendarStore }, { type: i2.DbxCalendarScheduleSelectionStore }]; }, propDecorators: { required: [{
87
+ type: Input
88
+ }], appearance: [{
89
+ type: Input
90
+ }], label: [{
91
+ type: Input
92
+ }], hint: [{
93
+ type: Input
94
+ }], disabled: [{
95
+ type: Input
96
+ }], showCustomize: [{
97
+ type: Input
98
+ }] } });
99
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXIuc2NoZWR1bGUuc2VsZWN0aW9uLnJhbmdlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2RieC1mb3JtL2NhbGVuZGFyL3NyYy9saWIvY2FsZW5kYXIuc2NoZWR1bGUuc2VsZWN0aW9uLnJhbmdlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2RieC1mb3JtL2NhbGVuZGFyL3NyYy9saWIvY2FsZW5kYXIuc2NoZWR1bGUuc2VsZWN0aW9uLnJhbmdlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFhLE1BQU0sZUFBZSxDQUFDO0FBQzVELE9BQU8sRUFBRSxpQ0FBaUMsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ3hGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzdELE9BQU8sRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEQsT0FBTyxFQUFTLG1CQUFtQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLEVBQUUsZUFBZSxFQUFFLFNBQVMsRUFBYyxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDaEcsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7Ozs7Ozs7O0FBTzlDLE1BQU0sT0FBTyw4Q0FBOEM7SUEyQ3pELFlBQXFCLGdCQUFrQyxFQUFXLGlDQUFvRTtRQUFqSCxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQVcsc0NBQWlDLEdBQWpDLGlDQUFp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LENBQUMsaUNBQWlDLENBQUMsYUFBYSxDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO2FBQ2hHO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRUQsWUFBWTtRQUNWLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRCxZQUFZO1FBQ1YsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDakMsQ0FBQzs7NElBekZVLDhDQUE4QztnSUFBOUMsOENBQThDLGtPQ2YzRCwydUNBa0JBOzRGREhhLDhDQUE4QztrQkFKMUQsU0FBUzsrQkFDRSw0Q0FBNEM7dUpBS3RELFFBQVE7c0JBRFAsS0FBSztnQkFJTixVQUFVO3NCQURULEtBQUs7Z0JBSU4sS0FBSztzQkFESixLQUFLO2dCQUlOLElBQUk7c0JBREgsS0FBSztnQkFJRixRQUFRO3NCQURYLEtBQUs7Z0JBVU4sYUFBYTtzQkFEWixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgc3dpdGNoTWFwLCB0aHJvdHRsZVRpbWUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb25PYmplY3QgfSBmcm9tICdAZGVyZWVrYi9yeGpzJztcbmltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRGJ4Q2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0b3JlIH0gZnJvbSAnLi9jYWxlbmRhci5zY2hlZHVsZS5zZWxlY3Rpb24uc3RvcmUnO1xuaW1wb3J0IHsgRGJ4Q2FsZW5kYXJTdG9yZSB9IGZyb20gJ0BkZXJlZWtiL2RieC13ZWIvY2FsZW5kYXInO1xuaW1wb3J0IHsgRm9ybUdyb3VwLCBGb3JtQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE1heWJlLCByYW5kb21OdW1iZXJGYWN0b3J5IH0gZnJvbSAnQGRlcmVla2IvdXRpbCc7XG5pbXBvcnQgeyBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgZmlsdGVyLCBCZWhhdmlvclN1YmplY3QsIHN0YXJ0V2l0aCwgT2JzZXJ2YWJsZSwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGlzU2FtZURhdGVEYXkgfSBmcm9tICdAZGVyZWVrYi9kYXRlJztcbmltcG9ydCB7IE1hdEZvcm1GaWVsZEFwcGVhcmFuY2UgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZGJ4LXNjaGVkdWxlLXNlbGVjdGlvbi1jYWxlbmRhci1kYXRlLXJhbmdlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NhbGVuZGFyLnNjaGVkdWxlLnNlbGVjdGlvbi5yYW5nZS5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgRGJ4U2NoZWR1bGVTZWxlY3Rpb25DYWxlbmRhckRhdGVSYW5nZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIEBJbnB1dCgpXG4gIHJlcXVpcmVkPzogYm9vbGVhbjtcblxuICBASW5wdXQoKVxuICBhcHBlYXJhbmNlOiBNYXRGb3JtRmllbGRBcHBlYXJhbmNlID0gJ2ZpbGwnO1xuXG4gIEBJbnB1dCgpXG4gIGxhYmVsPzogTWF5YmU8c3RyaW5nPiA9ICdFbnRlciBhIGRhdGUgcmFuZ2UnO1xuXG4gIEBJbnB1dCgpXG4gIGhpbnQ/OiBNYXliZTxzdHJpbmc+O1xuXG4gIEBJbnB1dCgpXG4gIHNldCBkaXNhYmxlZChkaXNhYmxlZDogTWF5YmU8Ym9vbGVhbj4pIHtcbiAgICBpZiAoZGlzYWJsZWQpIHtcbiAgICAgIHRoaXMucmFuZ2UuZGlzYWJsZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJhbmdlLmVuYWJsZSgpO1xuICAgIH1cbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHNob3dDdXN0b21pemUgPSBmYWxzZTtcblxuICByZWFkb25seSByYW5kb20gPSByYW5kb21OdW1iZXJGYWN0b3J5KDEwMDAwKSgpO1xuXG4gIHByaXZhdGUgX3BpY2tlck9wZW5lZCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIHByaXZhdGUgX3N5bmNTdWIgPSBuZXcgU3Vic2NyaXB0aW9uT2JqZWN0KCk7XG4gIHByaXZhdGUgX3ZhbHVlU3ViID0gbmV3IFN1YnNjcmlwdGlvbk9iamVjdCgpO1xuXG4gIHJlYWRvbmx5IHJhbmdlID0gbmV3IEZvcm1Hcm91cCh7XG4gICAgc3RhcnQ6IG5ldyBGb3JtQ29udHJvbDxNYXliZTxEYXRlPj4obnVsbCksXG4gICAgZW5kOiBuZXcgRm9ybUNvbnRyb2w8TWF5YmU8RGF0ZT4+KG51bGwpXG4gIH0pO1xuXG4gIHJlYWRvbmx5IG1pbkRhdGUkID0gdGhpcy5kYnhDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RvcmUubWluRGF0ZSQ7XG4gIHJlYWRvbmx5IG1heERhdGUkID0gdGhpcy5kYnhDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RvcmUubWF4RGF0ZSQ7XG4gIHJlYWRvbmx5IGlzQ3VzdG9taXplZCQgPSB0aGlzLmRieENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdG9yZS5pc0N1c3RvbWl6ZWQkO1xuXG4gIHJlYWRvbmx5IHBpY2tlck9wZW5lZCQgPSB0aGlzLl9waWNrZXJPcGVuZWQuYXNPYnNlcnZhYmxlKCk7XG5cbiAgY29uc3RydWN0b3IocmVhZG9ubHkgZGJ4Q2FsZW5kYXJTdG9yZTogRGJ4Q2FsZW5kYXJTdG9yZSwgcmVhZG9ubHkgZGJ4Q2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0b3JlOiBEYnhDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RvcmUpIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5fc3luY1N1Yi5zdWJzY3JpcHRpb24gPSB0aGlzLmRieENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdG9yZS5pbnB1dFJhbmdlJC5zdWJzY3JpYmUoKHgpID0+IHtcbiAgICAgIHRoaXMucmFuZ2Uuc2V0VmFsdWUoe1xuICAgICAgICBzdGFydDogeC5pbnB1dFN0YXJ0ID8/IG51bGwsXG4gICAgICAgIGVuZDogeC5pbnB1dEVuZCA/PyBudWxsXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHRoaXMuX3ZhbHVlU3ViLnN1YnNjcmlwdGlvbiA9IHRoaXMuX3BpY2tlck9wZW5lZFxuICAgICAgLnBpcGUoXG4gICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgICAgIHN3aXRjaE1hcCgob3BlbmVkKSA9PiB7XG4gICAgICAgICAgbGV0IG9iczogT2JzZXJ2YWJsZTx7IHN0YXJ0PzogTWF5YmU8RGF0ZT47IGVuZD86IE1heWJlPERhdGU+IH0+O1xuXG4gICAgICAgICAgaWYgKG9wZW5lZCkge1xuICAgICAgICAgICAgb2JzID0gb2Yoe30pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBvYnMgPSB0aGlzLnJhbmdlLnZhbHVlQ2hhbmdlcy5waXBlKHN0YXJ0V2l0aCh0aGlzLnJhbmdlLnZhbHVlKSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIG9icztcbiAgICAgICAgfSksXG4gICAgICAgIGZpbHRlcigoeCkgPT4gQm9vbGVhbih4LnN0YXJ0ICYmIHguZW5kKSksXG4gICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKChhLCBiKSA9PiBpc1NhbWVEYXRlRGF5KGEuc3RhcnQsIGIuc3RhcnQpICYmIGlzU2FtZURhdGVEYXkoYS5lbmQsIGIuZW5kKSksXG4gICAgICAgIHRocm90dGxlVGltZSgxMDAsIHVuZGVmaW5lZCwgeyB0cmFpbGluZzogdHJ1ZSB9KVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoeCkgPT4ge1xuICAgICAgICBpZiAoeC5zdGFydCAmJiB4LmVuZCkge1xuICAgICAgICAgIHRoaXMuZGJ4Q2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0b3JlLnNldElucHV0UmFuZ2UoeyBpbnB1dFN0YXJ0OiB4LnN0YXJ0LCBpbnB1dEVuZDogeC5lbmQgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5fc3luY1N1Yi5kZXN0cm95KCk7XG4gICAgdGhpcy5fdmFsdWVTdWIuZGVzdHJveSgpO1xuICB9XG5cbiAgcGlja2VyT3BlbmVkKCkge1xuICAgIHRoaXMuX3BpY2tlck9wZW5lZC5uZXh0KHRydWUpO1xuICB9XG5cbiAgcGlja2VyQ2xvc2VkKCkge1xuICAgIHRoaXMuX3BpY2tlck9wZW5lZC5uZXh0KGZhbHNlKTtcbiAgfVxufVxuIiwiPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwiZGJ4LXNjaGVkdWxlLXNlbGVjdGlvbi1jYWxlbmRhci1kYXRlLXJhbmdlLWZpZWxkXCIgW2FwcGVhcmFuY2VdPVwiYXBwZWFyYW5jZVwiPlxuICA8bWF0LWxhYmVsICpuZ0lmPVwibGFiZWxcIj57eyBsYWJlbCB9fTwvbWF0LWxhYmVsPlxuICA8ZGl2ICpuZ0lmPVwic2hvd0N1c3RvbWl6ZSAmJiAoaXNDdXN0b21pemVkJCB8IGFzeW5jKVwiIGNsYXNzPVwiZGF0ZS1yYW5nZS1maWVsZC1jdXN0b21pemVkXCI+XG4gICAgPHNwYW4gY2xhc3M9XCJkYngtYWNjZW50LWJnIGRhdGUtcmFuZ2UtZmllbGQtY3VzdG9taXplZC10ZXh0XCI+Q3VzdG9tPC9zcGFuPlxuICA8L2Rpdj5cbiAgPG1hdC1kYXRlLXJhbmdlLWlucHV0IFtyZXF1aXJlZF09XCJyZXF1aXJlZFwiIFttaW5dPVwibWluRGF0ZSQgfCBhc3luY1wiIFttYXhdPVwibWF4RGF0ZSQgfCBhc3luY1wiIFtmb3JtR3JvdXBdPVwicmFuZ2VcIiBbcmFuZ2VQaWNrZXJdPVwicGlja2VyXCI+XG4gICAgPGlucHV0IG1hdFN0YXJ0RGF0ZSBmb3JtQ29udHJvbE5hbWU9XCJzdGFydFwiIHBsYWNlaG9sZGVyPVwiU3RhcnQgZGF0ZVwiIC8+XG4gICAgPGlucHV0IG1hdEVuZERhdGUgZm9ybUNvbnRyb2xOYW1lPVwiZW5kXCIgcGxhY2Vob2xkZXI9XCJFbmQgZGF0ZVwiIC8+XG4gIDwvbWF0LWRhdGUtcmFuZ2UtaW5wdXQ+XG4gIDxtYXQtZGF0ZXBpY2tlci10b2dnbGUgbWF0SWNvblN1ZmZpeCBbZm9yXT1cInBpY2tlclwiPjwvbWF0LWRhdGVwaWNrZXItdG9nZ2xlPlxuICA8ZGl2ICpuZ0lmPVwic2hvd0N1c3RvbWl6ZVwiPlxuICAgIDxkYngtYnV0dG9uLXNwYWNlcj48L2RieC1idXR0b24tc3BhY2VyPlxuICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIltjdXN0b21pemVCdXR0b25dXCI+PC9uZy1jb250ZW50PlxuICA8L2Rpdj5cbiAgPG1hdC1kYXRlLXJhbmdlLXBpY2tlciAjcGlja2VyIChvcGVuZWQpPVwicGlja2VyT3BlbmVkKClcIiAoY2xvc2VkKT1cInBpY2tlckNsb3NlZCgpXCI+PC9tYXQtZGF0ZS1yYW5nZS1waWNrZXI+XG4gIDxtYXQtZXJyb3IgKm5nSWY9XCJyYW5nZS5jb250cm9scy5zdGFydC5oYXNFcnJvcignbWF0U3RhcnREYXRlSW52YWxpZCcpXCI+SW52YWxpZCBzdGFydCBkYXRlPC9tYXQtZXJyb3I+XG4gIDxtYXQtZXJyb3IgKm5nSWY9XCJyYW5nZS5jb250cm9scy5lbmQuaGFzRXJyb3IoJ21hdEVuZERhdGVJbnZhbGlkJylcIj5JbnZhbGlkIGVuZCBkYXRlPC9tYXQtZXJyb3I+XG48L21hdC1mb3JtLWZpZWxkPlxuIl19
@@ -0,0 +1,294 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { dateBlockDayOfWeekFactory, dateBlockTimingDateFactory, dateScheduleDateFilter, DateScheduleDayCode, dateScheduleDayCodes, dateScheduleEncodedWeek, dateTimingRelativeIndexFactory, expandDateScheduleDayCodesToDayOfWeekSet, findMaxDate, findMinDate, isDateInDateRangeFunction, isDateWithinDateBlockRangeFunction, isSameDate, isSameDateDay, isSameDateRange, isSameDateScheduleRange } from '@dereekb/date';
3
+ import { filterMaybe } from '@dereekb/rxjs';
4
+ import { iterableToArray, addToSet, toggleInSet, isIndexNumberInIndexRangeFunction, minAndMaxNumber, setsAreEquivalent, range } from '@dereekb/util';
5
+ import { ComponentStore } from '@ngrx/component-store';
6
+ import { addYears, startOfDay, startOfYear } from 'date-fns';
7
+ import { distinctUntilChanged, map, shareReplay } from 'rxjs';
8
+ import { defaultCalendarScheduleSelectionCellContentFactory } from './calendar.schedule.selection';
9
+ import * as i0 from "@angular/core";
10
+ export function initialCalendarScheduleSelectionState() {
11
+ const start = startOfDay(new Date());
12
+ const scheduleDays = new Set([DateScheduleDayCode.WEEKDAY, DateScheduleDayCode.WEEKEND]);
13
+ const allowedDaysOfWeek = expandDateScheduleDayCodesToDayOfWeekSet(Array.from(scheduleDays));
14
+ const indexFactory = dateTimingRelativeIndexFactory({ start });
15
+ const indexDayOfWeek = dateBlockDayOfWeekFactory(start);
16
+ return {
17
+ start,
18
+ indexFactory,
19
+ selectedIndexes: new Set(),
20
+ scheduleDays,
21
+ allowedDaysOfWeek,
22
+ indexDayOfWeek,
23
+ isEnabledFilterDay: () => true,
24
+ isEnabledDay: () => false,
25
+ minDate: new Date(0),
26
+ maxDate: startOfYear(addYears(new Date(), 100)),
27
+ cellContentFactory: defaultCalendarScheduleSelectionCellContentFactory
28
+ };
29
+ }
30
+ export class DbxCalendarScheduleSelectionStore extends ComponentStore {
31
+ constructor() {
32
+ super(initialCalendarScheduleSelectionState());
33
+ // MARK: Accessors
34
+ this.filter$ = this.state$.pipe(map((x) => x.filter), distinctUntilChanged(), shareReplay(1));
35
+ this.inputStart$ = this.state$.pipe(map((x) => x.inputStart), distinctUntilChanged(isSameDate), shareReplay(1));
36
+ this.inputEnd$ = this.state$.pipe(map((x) => x.inputEnd), distinctUntilChanged(isSameDate), shareReplay(1));
37
+ this.currentInputRange$ = this.state$.pipe(map(({ inputStart, inputEnd }) => ({ inputStart, inputEnd })), distinctUntilChanged((a, b) => isSameDate(a.inputStart, b.inputStart) && isSameDate(a.inputEnd, b.inputEnd)), map((x) => {
38
+ if (x.inputStart && x.inputEnd) {
39
+ return x;
40
+ }
41
+ else {
42
+ return undefined;
43
+ }
44
+ }), shareReplay(1));
45
+ this.inputRange$ = this.currentInputRange$.pipe(filterMaybe(), shareReplay(1));
46
+ this.selectedDates$ = this.state$.pipe(map((x) => x.selectedIndexes), distinctUntilChanged(), shareReplay(1));
47
+ this.isEnabledFilterDayFunction$ = this.state$.pipe(map((x) => x.isEnabledFilterDay), shareReplay(1));
48
+ this.isEnabledDayFunction$ = this.state$.pipe(map((x) => x.isEnabledDay), shareReplay(1));
49
+ this.currentDateRange$ = this.state$.pipe(map(computeCalendarScheduleSelectionRange), distinctUntilChanged((a, b) => isSameDateRange(a, b)), shareReplay(1));
50
+ this.dateRange$ = this.currentDateRange$.pipe(filterMaybe(), shareReplay(1));
51
+ this.scheduleDays$ = this.state$.pipe(map((x) => x.scheduleDays), distinctUntilChanged(setsAreEquivalent), shareReplay(1));
52
+ this.currentSelectionValue$ = this.state$.pipe(map((x) => x.currentSelectionValue), shareReplay(1));
53
+ this.selectionValue$ = this.currentSelectionValue$.pipe(filterMaybe(), shareReplay(1));
54
+ this.currentDateScheduleRangeValue$ = this.currentSelectionValue$.pipe(map((x) => x?.dateScheduleRange), distinctUntilChanged(isSameDateScheduleRange), shareReplay(1));
55
+ this.dateScheduleRangeValue$ = this.currentDateScheduleRangeValue$.pipe(filterMaybe(), shareReplay(1));
56
+ this.minDate$ = this.state$.pipe(map((x) => findMaxDate([x.filter?.start, x.minDate])), distinctUntilChanged(isSameDateDay), shareReplay(1));
57
+ this.maxDate$ = this.state$.pipe(map((x) => findMinDate([x.filter?.end, x.maxDate])), distinctUntilChanged(isSameDateDay), shareReplay(1));
58
+ this.cellContentFactory$ = this.state$.pipe(map((x) => x.cellContentFactory), distinctUntilChanged(), shareReplay(1));
59
+ this.isCustomized$ = this.state$.pipe(map((x) => x.selectedIndexes.size > 0), distinctUntilChanged(), shareReplay(1));
60
+ // MARK: State Changes
61
+ this.setFilter = this.updater((state, filter) => updateStateWithFilter(state, filter));
62
+ this.clearFilter = this.updater((state) => updateStateWithFilter(state, undefined));
63
+ this.setTimezone = this.updater((state, timezone) => ({ ...state, timezone }));
64
+ this.setInputRange = this.updater((state, range) => updateStateWithChangedRange(state, range));
65
+ this.toggleSelectedDates = this.updater((state, toggle) => updateStateWithChangedDates(state, { toggle }));
66
+ this.addSelectedDates = this.updater((state, add) => updateStateWithChangedDates(state, { add }));
67
+ this.removeSelectedDates = this.updater((state, remove) => updateStateWithChangedDates(state, { remove }));
68
+ this.setSelectedDates = this.updater((state, set) => updateStateWithChangedDates(state, { set }));
69
+ this.setScheduleDays = this.updater((state, scheduleDays) => updateStateWithChangedScheduleDays(state, scheduleDays));
70
+ this.setAllowAllScheduleDays = this.updater((state) => updateStateWithChangedScheduleDays(state, null));
71
+ this.setDateScheduleRangeValue = this.updater((state, value) => updateStateWithDateScheduleRangeValue(state, value));
72
+ this.setCellContentFactory = this.updater((state, cellContentFactory) => ({ ...state, cellContentFactory }));
73
+ }
74
+ }
75
+ DbxCalendarScheduleSelectionStore.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: DbxCalendarScheduleSelectionStore, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
76
+ DbxCalendarScheduleSelectionStore.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: DbxCalendarScheduleSelectionStore });
77
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: DbxCalendarScheduleSelectionStore, decorators: [{
78
+ type: Injectable
79
+ }], ctorParameters: function () { return []; } });
80
+ export function updateStateWithFilter(state, filter) {
81
+ let isEnabledFilterDay = () => true;
82
+ if (filter) {
83
+ isEnabledFilterDay = dateScheduleDateFilter(filter);
84
+ }
85
+ return { ...state, filter, isEnabledFilterDay };
86
+ }
87
+ export function updateStateWithDateScheduleRangeValue(state, change) {
88
+ const isSameValue = isSameDateScheduleRange(state.currentSelectionValue?.dateScheduleRange, change);
89
+ if (isSameValue) {
90
+ return state;
91
+ }
92
+ else {
93
+ if (change != null) {
94
+ const nextState = { ...state, inputStart: change.start, inputEnd: change.end, selectedIndexes: new Set(change.ex) };
95
+ return updateStateWithChangedScheduleDays(finalizeNewCalendarScheduleSelectionState(nextState), dateScheduleDayCodes(change.w));
96
+ }
97
+ else {
98
+ return noSelectionCalendarScheduleSelectionState(state); // clear selection, retain disabled days
99
+ }
100
+ }
101
+ }
102
+ export function updateStateWithChangedScheduleDays(state, change) {
103
+ const { scheduleDays: currentScheduleDays } = state;
104
+ const scheduleDays = new Set(change || [DateScheduleDayCode.WEEKDAY, DateScheduleDayCode.WEEKEND]);
105
+ if (setsAreEquivalent(currentScheduleDays, scheduleDays)) {
106
+ return state; // no change
107
+ }
108
+ else {
109
+ const allowedDaysOfWeek = expandDateScheduleDayCodesToDayOfWeekSet(Array.from(scheduleDays));
110
+ const nextState = { ...state, scheduleDays, allowedDaysOfWeek };
111
+ return finalizeNewCalendarScheduleSelectionState(nextState);
112
+ }
113
+ }
114
+ export function updateStateWithChangedDates(state, change) {
115
+ const { indexFactory, allowedDaysOfWeek, indexDayOfWeek } = state;
116
+ let selectedIndexes;
117
+ if (change.set) {
118
+ selectedIndexes = new Set(iterableToArray(change.set).map(indexFactory));
119
+ }
120
+ else {
121
+ selectedIndexes = new Set(state.selectedIndexes);
122
+ if (change.toggle) {
123
+ const allowedToToggle = iterableToArray(change.toggle)
124
+ .map(indexFactory)
125
+ .filter((i) => allowedDaysOfWeek.has(indexDayOfWeek(i)));
126
+ toggleInSet(selectedIndexes, allowedToToggle);
127
+ }
128
+ if (change.add) {
129
+ addToSet(selectedIndexes, iterableToArray(change.add).map(indexFactory));
130
+ }
131
+ if (change.remove) {
132
+ addToSet(selectedIndexes, iterableToArray(change.remove).map(indexFactory));
133
+ }
134
+ }
135
+ const nextState = { ...state, selectedIndexes };
136
+ nextState.isEnabledDay = isEnabledDayInCalendarScheduleSelectionState(nextState);
137
+ // Recalculate the range and simplified to exclusions
138
+ const rangeAndExclusion = computeScheduleSelectionRangeAndExclusion(nextState);
139
+ if (rangeAndExclusion) {
140
+ return finalizeNewCalendarScheduleSelectionState({ ...nextState, selectedIndexes: new Set(rangeAndExclusion.excluded), inputStart: rangeAndExclusion.start, inputEnd: rangeAndExclusion.end });
141
+ }
142
+ else {
143
+ // no selected days
144
+ return noSelectionCalendarScheduleSelectionState(state);
145
+ }
146
+ }
147
+ export function noSelectionCalendarScheduleSelectionState(state) {
148
+ return finalizeNewCalendarScheduleSelectionState({ ...state, selectedIndexes: new Set(), inputStart: null, inputEnd: null });
149
+ }
150
+ export function updateStateWithChangedRange(state, change) {
151
+ const { inputStart: currentInputStart, inputEnd: currentInputEnd, indexFactory, minDate, maxDate } = state;
152
+ const inputStart = startOfDay(change.inputStart);
153
+ const inputEnd = startOfDay(change.inputEnd);
154
+ const isValidRange = minDate != null || maxDate != null ? isDateInDateRangeFunction({ start: minDate ?? undefined, end: maxDate ?? undefined }) : () => true;
155
+ if (!isValidRange(inputStart) || !isValidRange(inputEnd) || (isSameDateDay(inputStart, currentInputStart) && isSameDateDay(inputEnd, currentInputEnd))) {
156
+ return state; // if no change, return the current state.
157
+ }
158
+ // retain all indexes that are within the new range
159
+ const minIndex = indexFactory(inputStart);
160
+ const maxIndex = indexFactory(inputEnd) + 1;
161
+ const currentIndexes = Array.from(state.selectedIndexes);
162
+ const isInCurrentRange = isIndexNumberInIndexRangeFunction({ minIndex, maxIndex });
163
+ const excludedIndexesInNewRange = currentIndexes.filter(isInCurrentRange);
164
+ const nextState = { ...state, excludedIndexesInNewRange, inputStart, inputEnd };
165
+ return finalizeNewCalendarScheduleSelectionState(nextState);
166
+ }
167
+ export function finalizeNewCalendarScheduleSelectionState(nextState) {
168
+ nextState.isEnabledDay = isEnabledDayInCalendarScheduleSelectionState(nextState);
169
+ nextState.currentSelectionValue = computeScheduleSelectionValue(nextState);
170
+ return nextState;
171
+ }
172
+ export function isEnabledDayInCalendarScheduleSelectionState(state) {
173
+ const { indexFactory, inputStart, inputEnd, indexDayOfWeek, allowedDaysOfWeek } = state;
174
+ let isInStartAndEndRange;
175
+ if (inputStart && inputEnd) {
176
+ isInStartAndEndRange = isDateWithinDateBlockRangeFunction({ start: state.start, range: { start: inputStart, end: inputEnd } });
177
+ }
178
+ else {
179
+ isInStartAndEndRange = () => false;
180
+ }
181
+ return (input) => {
182
+ const index = indexFactory(input);
183
+ const dayOfWeek = indexDayOfWeek(index);
184
+ const isInSelectedRange = isInStartAndEndRange(input);
185
+ const isSelected = state.selectedIndexes.has(index);
186
+ const isAllowedDayOfWeek = allowedDaysOfWeek.has(dayOfWeek);
187
+ const result = isAllowedDayOfWeek && ((isInSelectedRange && !isSelected) || (isSelected && !isInSelectedRange));
188
+ return result;
189
+ };
190
+ }
191
+ export function computeScheduleSelectionValue(state) {
192
+ const { scheduleDays, allowedDaysOfWeek, indexDayOfWeek } = state;
193
+ const rangeAndExclusion = computeScheduleSelectionRangeAndExclusion(state);
194
+ if (rangeAndExclusion == null) {
195
+ return null;
196
+ }
197
+ const { start, end, excluded, dateBlockRange } = rangeAndExclusion;
198
+ const indexOffset = dateBlockRange.i;
199
+ const ex = excluded
200
+ .filter((x) => {
201
+ const isExcludedIndex = allowedDaysOfWeek.has(indexDayOfWeek(x));
202
+ return isExcludedIndex;
203
+ })
204
+ .map((x) => x - indexOffset); // set to the proper offset
205
+ const w = dateScheduleEncodedWeek(scheduleDays);
206
+ const d = []; // "included" blocks are never used/calculated.
207
+ const dateScheduleRange = {
208
+ start,
209
+ end,
210
+ w,
211
+ d,
212
+ ex
213
+ };
214
+ return {
215
+ dateScheduleRange,
216
+ minMaxRange: { start, end }
217
+ };
218
+ }
219
+ export function computeScheduleSelectionRangeAndExclusion(state) {
220
+ const { isEnabledDay } = state;
221
+ const dateFactory = dateBlockTimingDateFactory(state);
222
+ const dateBlockRange = computeCalendarScheduleSelectionDateBlockRange(state);
223
+ if (dateBlockRange == null) {
224
+ return null; // returns null if no items are selected.
225
+ }
226
+ const start = dateFactory(dateBlockRange.i);
227
+ const end = dateFactory(dateBlockRange.to);
228
+ const excluded = range(dateBlockRange.i, dateBlockRange.to + 1).filter((x) => {
229
+ const isExcludedIndex = !isEnabledDay(x);
230
+ return isExcludedIndex;
231
+ });
232
+ const result = {
233
+ dateBlockRange,
234
+ start,
235
+ end,
236
+ excluded
237
+ };
238
+ return result;
239
+ }
240
+ export function computeCalendarScheduleSelectionRange(state) {
241
+ const dateFactory = dateBlockTimingDateFactory(state);
242
+ const dateBlockRange = computeCalendarScheduleSelectionDateBlockRange(state);
243
+ if (dateBlockRange != null) {
244
+ return { start: dateFactory(dateBlockRange.i), end: dateFactory(dateBlockRange.to) };
245
+ }
246
+ else {
247
+ return undefined;
248
+ }
249
+ }
250
+ export function computeCalendarScheduleSelectionDateBlockRange(state) {
251
+ const { indexFactory, inputStart, inputEnd, allowedDaysOfWeek, indexDayOfWeek, isEnabledDay, isEnabledFilterDay } = state;
252
+ const enabledSelectedIndexes = Array.from(state.selectedIndexes).filter((i) => allowedDaysOfWeek.has(indexDayOfWeek(i)));
253
+ const minAndMaxSelectedValues = minAndMaxNumber(enabledSelectedIndexes);
254
+ let startRange;
255
+ let endRange;
256
+ if (minAndMaxSelectedValues) {
257
+ startRange = minAndMaxSelectedValues.min;
258
+ endRange = minAndMaxSelectedValues.max;
259
+ }
260
+ if (inputStart != null && inputEnd != null) {
261
+ const inputStartIndex = indexFactory(inputStart);
262
+ const inputEndIndex = indexFactory(inputEnd);
263
+ startRange = startRange != null ? Math.min(inputStartIndex, startRange) : inputStartIndex;
264
+ endRange = endRange != null ? Math.max(inputEndIndex, endRange) : inputEndIndex;
265
+ }
266
+ if (startRange != null && endRange != null) {
267
+ const scanStartIndex = startRange;
268
+ const scanEndIndex = endRange;
269
+ // clear start and end
270
+ startRange = undefined;
271
+ endRange = undefined;
272
+ // if the min is equal to the start index, then we are in the range and need to iterate dates until we find one that is not selected/excluded.
273
+ for (let i = scanStartIndex; i <= scanEndIndex; i += 1) {
274
+ if (isEnabledFilterDay(i) && isEnabledDay(i)) {
275
+ startRange = i;
276
+ break;
277
+ }
278
+ }
279
+ // same with the max
280
+ for (let i = scanEndIndex; i >= scanStartIndex; i -= 1) {
281
+ if (isEnabledFilterDay(i) && isEnabledDay(i)) {
282
+ endRange = i;
283
+ break;
284
+ }
285
+ }
286
+ }
287
+ if (startRange != null && endRange != null) {
288
+ return { i: startRange, to: endRange };
289
+ }
290
+ else {
291
+ return undefined;
292
+ }
293
+ }
294
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXIuc2NoZWR1bGUuc2VsZWN0aW9uLnN0b3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvZGJ4LWZvcm0vY2FsZW5kYXIvc3JjL2xpYi9jYWxlbmRhci5zY2hlZHVsZS5zZWxlY3Rpb24uc3RvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBRUwseUJBQXlCLEVBR3pCLDBCQUEwQixFQUcxQixzQkFBc0IsRUFFdEIsbUJBQW1CLEVBQ25CLG9CQUFvQixFQUNwQix1QkFBdUIsRUFJdkIsOEJBQThCLEVBQzlCLHdDQUF3QyxFQUN4QyxXQUFXLEVBQ1gsV0FBVyxFQUNYLHlCQUF5QixFQUV6QixrQ0FBa0MsRUFDbEMsVUFBVSxFQUNWLGFBQWEsRUFDYixlQUFlLEVBQ2YsdUJBQXVCLEVBQ3hCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUMsT0FBTyxFQUE0RCxlQUFlLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxpQ0FBaUMsRUFBWSxlQUFlLEVBQUUsaUJBQWlCLEVBQWEsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3BPLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDN0QsT0FBTyxFQUFjLG9CQUFvQixFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDMUUsT0FBTyxFQUErRSxrREFBa0QsRUFBRSxNQUFNLCtCQUErQixDQUFDOztBQWtGaEwsTUFBTSxVQUFVLHFDQUFxQztJQUNuRCxNQUFNLEtBQUssR0FBRyxVQUFVLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FB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RjtJQUVELElBQUksVUFBVSxJQUFJLElBQUksSUFBSSxRQUFRLElBQUksSUFBSSxFQUFFO1FBQzFDLE9BQU8sRUFBRSxDQUFDLEVBQUUsVUFBVSxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsQ0FBQztLQUN4QztTQUFNO1FBQ0wsT0FBTyxTQUFTLENBQUM7S0FDbEI7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgRGF0ZUJsb2NrRGF5T2ZXZWVrRmFjdG9yeSxcbiAgZGF0ZUJsb2NrRGF5T2ZXZWVrRmFjdG9yeSxcbiAgRGF0ZUJsb2NrSW5kZXgsXG4gIERhdGVCbG9ja1JhbmdlV2l0aFJhbmdlLFxuICBkYXRlQmxvY2tUaW1pbmdEYXRlRmFjdG9yeSxcbiAgRGF0ZU9yRGF0ZUJsb2NrSW5kZXgsXG4gIERhdGVSYW5nZSxcbiAgZGF0ZVNjaGVkdWxlRGF0ZUZpbHRlcixcbiAgRGF0ZVNjaGVkdWxlRGF0ZUZpbHRlckNvbmZpZyxcbiAgRGF0ZVNjaGVkdWxlRGF5Q29kZSxcbiAgZGF0ZVNjaGVkdWxlRGF5Q29kZXMsXG4gIGRhdGVTY2hlZHVsZUVuY29kZWRXZWVrLFxuICBEYXRlU2NoZWR1bGVFbmNvZGVkV2VlayxcbiAgRGF0ZVNjaGVkdWxlUmFuZ2UsXG4gIERhdGVUaW1pbmdSZWxhdGl2ZUluZGV4RmFjdG9yeSxcbiAgZGF0ZVRpbWluZ1JlbGF0aXZlSW5kZXhGYWN0b3J5LFxuICBleHBhbmREYXRlU2NoZWR1bGVEYXlDb2Rlc1RvRGF5T2ZXZWVrU2V0LFxuICBmaW5kTWF4RGF0ZSxcbiAgZmluZE1pbkRhdGUsXG4gIGlzRGF0ZUluRGF0ZVJhbmdlRnVuY3Rpb24sXG4gIElzRGF0ZVdpdGhpbkRhdGVCbG9ja1JhbmdlRnVuY3Rpb24sXG4gIGlzRGF0ZVdpdGhpbkRhdGVCbG9ja1JhbmdlRnVuY3Rpb24sXG4gIGlzU2FtZURhdGUsXG4gIGlzU2FtZURhdGVEYXksXG4gIGlzU2FtZURhdGVSYW5nZSxcbiAgaXNTYW1lRGF0ZVNjaGVkdWxlUmFuZ2Vcbn0gZnJvbSAnQGRlcmVla2IvZGF0ZSc7XG5pbXBvcnQgeyBmaWx0ZXJNYXliZSB9IGZyb20gJ0BkZXJlZWtiL3J4anMnO1xuaW1wb3J0IHsgTWF5YmUsIFRpbWV6b25lU3RyaW5nLCBEZWNpc2lvbkZ1bmN0aW9uLCBJdGVyYWJsZU9yVmFsdWUsIGl0ZXJhYmxlVG9BcnJheSwgYWRkVG9TZXQsIHRvZ2dsZUluU2V0LCBpc0luZGV4TnVtYmVySW5JbmRleFJhbmdlRnVuY3Rpb24sIE1heWJlTWFwLCBtaW5BbmRNYXhOdW1iZXIsIHNldHNBcmVFcXVpdmFsZW50LCBEYXlPZldlZWssIHJhbmdlIH0gZnJvbSAnQGRlcmVla2IvdXRpbCc7XG5pbXBvcnQgeyBDb21wb25lbnRTdG9yZSB9IGZyb20gJ0BuZ3J4L2NvbXBvbmVudC1zdG9yZSc7XG5pbXBvcnQgeyBhZGRZZWFycywgc3RhcnRPZkRheSwgc3RhcnRPZlllYXIgfSBmcm9tICdkYXRlLWZucyc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgbWFwLCBzaGFyZVJlcGxheSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvbkNlbGxDb250ZW50RmFjdG9yeSwgQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblZhbHVlLCBkZWZhdWx0Q2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvbkNlbGxDb250ZW50RmFjdG9yeSB9IGZyb20gJy4vY2FsZW5kYXIuc2NoZWR1bGUuc2VsZWN0aW9uJztcblxuZXhwb3J0IGludGVyZmFjZSBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uSW5wdXREYXRlUmFuZ2Uge1xuICAvKipcbiAgICogSW5wdXQgU3RhcnQgRGF0ZVxuICAgKi9cbiAgaW5wdXRTdGFydDogRGF0ZTtcbiAgLyoqXG4gICAqIElucHV0IEVuZCBEYXRlXG4gICAqL1xuICBpbnB1dEVuZDogRGF0ZTtcbn1cblxuZXhwb3J0IHR5cGUgUGFydGlhbENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25JbnB1dERhdGVSYW5nZSA9IFBhcnRpYWw8TWF5YmVNYXA8Q2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvbklucHV0RGF0ZVJhbmdlPj47XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlIGV4dGVuZHMgUGFydGlhbENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25JbnB1dERhdGVSYW5nZSB7XG4gIC8qKlxuICAgKiBGaWx0ZXJzIHRoZSBkYXlzIG9mIHRoZSBzY2hlZHVsZSB0byBvbmx5IGFsbG93IHNlbGVjdGluZyBkYXlzIGluIHRoZSBzY2hlZHVsZS5cbiAgICovXG4gIGZpbHRlcj86IE1heWJlPERhdGVTY2hlZHVsZURhdGVGaWx0ZXJDb25maWc+O1xuICAvKipcbiAgICogTWluaW11bSBkYXRlIGFsbG93ZWQgaWYgbm8gZmlsdGVyIGlzIHNldC4gSWYgYSBmaWx0ZXIgaXMgc2V0LCB0aGUgZ3JlYXRlciBvZiB0aGUgdHdvIGRhdGVzIGlzIHVzZWQgYXMgdGhlIG1pbmltdW0uXG4gICAqL1xuICBtaW5EYXRlPzogTWF5YmU8RGF0ZT47XG4gIC8qKlxuICAgKiBNYXhpbXVtIGRhdGUgYWxsb3dlZCBpZiBubyBmaXRsZXIgaXMgc2V0LiBJZiBhIGZpbHRlciBpcyBzZXQsIHRoZSBsZXNzZXIgb2YgdGhlIHR3byBkYXRlcyBpcyB1c2VkIGFzIHRoZSBtYXhpbXVtLlxuICAgKi9cbiAgbWF4RGF0ZT86IE1heWJlPERhdGU+O1xuICAvKipcbiAgICogU3RhcnQgZGF0ZS4gSXMgdXBkYXRlZCBhcyB0aGUgaW5wdXRTdGFydCBpcyBtb2RpZmllZCBvciBmaWx0ZXIgaXMgcHJvdmlkZWQgdGhhdCBwcm92aWRlcyB0aGUgc3RhcnQgZGF0ZS5cbiAgICpcbiAgICogRGVmYXVsdHMgdG8gdG9kYXkgYW5kIHRoZSBjdXJyZW50IHRpbWV6b25lLlxuICAgKi9cbiAgc3RhcnQ6IERhdGU7XG4gIC8qKlxuICAgKiBEYXRlVGltaW5nUmVsYXRpdmVJbmRleEZhY3RvcnlcbiAgICovXG4gIGluZGV4RmFjdG9yeTogRGF0ZVRpbWluZ1JlbGF0aXZlSW5kZXhGYWN0b3J5O1xuICAvKipcbiAgICogQXJyYXkgb2YgbWFudWFsbHkgc2VsZWN0ZWQgZGF0ZXMuXG4gICAqXG4gICAqIFZhbHVlcyB0aGF0IGV4aXN0IG91dHNpZGUgb2YgdGhlIFwiaW5wdXRcIiByYW5nZSBhcmUgY29uc2lkZXJlZCB0b2dnbGVkIG9uLCB3aGlsZSB0aG9zZVxuICAgKiB0aGF0IGFyZSBzZWxlY3RlZCB3aXRoaW4gdGhlIHJhbmdlIGFyZSBjb25zaWRlcmVkIHRvZ2dsZWQgb2ZmLlxuICAgKlxuICAgKiBJZiBkYXRlcyBhcmUgc2VsZWN0ZWQsIGFuZCB0aGVuIGEgcmFuZ2UgaXMgc2VsZWN0ZWQsIHRoZW4gdGhvc2UgZGF0ZXMgd2l0aGluIHRoZSByYW5nZSB0aGF0IGZhbGxcbiAgICogd2l0aGluIHRoZSByYW5nZSBhcmUgY2xlYXJlZCBmcm9tIHNlbGVjdGlvbi5cbiAgICpcbiAgICogVGhlc2UgaW5kZXhlcyBhcmUgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IGRhdGUuXG4gICAqL1xuICBzZWxlY3RlZEluZGV4ZXM6IFNldDxEYXRlQmxvY2tJbmRleD47XG4gIC8qKlxuICAgKiBEYXlzIG9mIHRoZSBzY2hlZHVsZSB0aGF0IGFyZSBhbGxvd2VkIHRvIGJlIHBpY2tlZC5cbiAgICovXG4gIHNjaGVkdWxlRGF5czogU2V0PERhdGVTY2hlZHVsZURheUNvZGU+O1xuICAvKipcbiAgICogU2V0IG9mIHRoZSBkYXlzIG9mIHdlZWsgdGhhdCBhcmUgYWxsb3dlZC5cbiAgICovXG4gIGFsbG93ZWREYXlzT2ZXZWVrOiBTZXQ8RGF5T2ZXZWVrPjtcbiAgLyoqXG4gICAqXG4gICAqL1xuICBpbmRleERheU9mV2VlazogRGF0ZUJsb2NrRGF5T2ZXZWVrRmFjdG9yeTtcbiAgLyoqXG4gICAqIERlY2lzaW9uIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0cnVlIGlmIGEgdmFsdWUgaXMgZW5hYmxlZCBnaXZlbiB0aGUgY3VycmVudCBmaWx0ZXIuXG4gICAqL1xuICBpc0VuYWJsZWRGaWx0ZXJEYXk6IERlY2lzaW9uRnVuY3Rpb248RGF0ZU9yRGF0ZUJsb2NrSW5kZXg+O1xuICAvKipcbiAgICogRGVjaXNpb24gZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRydWUgaWYgYSB2YWx1ZSBpcyBlbmFibGVkLlxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHRha2UgdGhlIGN1cnJlbnQgZmlsdGVyIGludG8gYWNjb3VudC5cbiAgICovXG4gIGlzRW5hYmxlZERheTogRGVjaXNpb25GdW5jdGlvbjxEYXRlT3JEYXRlQmxvY2tJbmRleD47XG4gIC8qKlxuICAgKiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uQ2VsbENvbnRlbnRGYWN0b3J5IGZvciB0aGUgdmlldy5cbiAgICovXG4gIGNlbGxDb250ZW50RmFjdG9yeTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvbkNlbGxDb250ZW50RmFjdG9yeTtcbiAgLyoqXG4gICAqIEN1cnJlbnQgc2VsZWN0aW9uIHZhbHVlLlxuICAgKi9cbiAgY3VycmVudFNlbGVjdGlvblZhbHVlPzogTWF5YmU8Q2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblZhbHVlPjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluaXRpYWxDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUoKTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlIHtcbiAgY29uc3Qgc3RhcnQgPSBzdGFydE9mRGF5KG5ldyBEYXRlKCkpO1xuICBjb25zdCBzY2hlZHVsZURheXMgPSBuZXcgU2V0KFtEYXRlU2NoZWR1bGVEYXlDb2RlLldFRUtEQVksIERhdGVTY2hlZHVsZURheUNvZGUuV0VFS0VORF0pO1xuICBjb25zdCBhbGxvd2VkRGF5c09mV2VlayA9IGV4cGFuZERhdGVTY2hlZHVsZURheUNvZGVzVG9EYXlPZldlZWtTZXQoQXJyYXkuZnJvbShzY2hlZHVsZURheXMpKTtcbiAgY29uc3QgaW5kZXhGYWN0b3J5ID0gZGF0ZVRpbWluZ1JlbGF0aXZlSW5kZXhGYWN0b3J5KHsgc3RhcnQgfSk7XG4gIGNvbnN0IGluZGV4RGF5T2ZXZWVrID0gZGF0ZUJsb2NrRGF5T2ZXZWVrRmFjdG9yeShzdGFydCk7XG5cbiAgcmV0dXJuIHtcbiAgICBzdGFydCxcbiAgICBpbmRleEZhY3RvcnksXG4gICAgc2VsZWN0ZWRJbmRleGVzOiBuZXcgU2V0KCksXG4gICAgc2NoZWR1bGVEYXlzLFxuICAgIGFsbG93ZWREYXlzT2ZXZWVrLFxuICAgIGluZGV4RGF5T2ZXZWVrLFxuICAgIGlzRW5hYmxlZEZpbHRlckRheTogKCkgPT4gdHJ1ZSxcbiAgICBpc0VuYWJsZWREYXk6ICgpID0+IGZhbHNlLFxuICAgIG1pbkRhdGU6IG5ldyBEYXRlKDApLFxuICAgIG1heERhdGU6IHN0YXJ0T2ZZZWFyKGFkZFllYXJzKG5ldyBEYXRlKCksIDEwMCkpLFxuICAgIGNlbGxDb250ZW50RmFjdG9yeTogZGVmYXVsdENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25DZWxsQ29udGVudEZhY3RvcnlcbiAgfTtcbn1cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIERieENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdG9yZSBleHRlbmRzIENvbXBvbmVudFN0b3JlPENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZT4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihpbml0aWFsQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlKCkpO1xuICB9XG5cbiAgLy8gTUFSSzogQWNjZXNzb3JzXG4gIHJlYWRvbmx5IGZpbHRlciQgPSB0aGlzLnN0YXRlJC5waXBlKFxuICAgIG1hcCgoeCkgPT4geC5maWx0ZXIpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBpbnB1dFN0YXJ0JCA9IHRoaXMuc3RhdGUkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiB4LmlucHV0U3RhcnQpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKGlzU2FtZURhdGUpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgaW5wdXRFbmQkID0gdGhpcy5zdGF0ZSQucGlwZShcbiAgICBtYXAoKHgpID0+IHguaW5wdXRFbmQpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKGlzU2FtZURhdGUpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgY3VycmVudElucHV0UmFuZ2UkOiBPYnNlcnZhYmxlPE1heWJlPENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25JbnB1dERhdGVSYW5nZT4+ID0gdGhpcy5zdGF0ZSQucGlwZShcbiAgICBtYXAoKHsgaW5wdXRTdGFydCwgaW5wdXRFbmQgfSkgPT4gKHsgaW5wdXRTdGFydCwgaW5wdXRFbmQgfSkpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKChhLCBiKSA9PiBpc1NhbWVEYXRlKGEuaW5wdXRTdGFydCwgYi5pbnB1dFN0YXJ0KSAmJiBpc1NhbWVEYXRlKGEuaW5wdXRFbmQsIGIuaW5wdXRFbmQpKSxcbiAgICBtYXAoKHgpID0+IHtcbiAgICAgIGlmICh4LmlucHV0U3RhcnQgJiYgeC5pbnB1dEVuZCkge1xuICAgICAgICByZXR1cm4geCBhcyBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uSW5wdXREYXRlUmFuZ2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH0pLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgaW5wdXRSYW5nZSQ6IE9ic2VydmFibGU8Q2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvbklucHV0RGF0ZVJhbmdlPiA9IHRoaXMuY3VycmVudElucHV0UmFuZ2UkLnBpcGUoZmlsdGVyTWF5YmUoKSwgc2hhcmVSZXBsYXkoMSkpO1xuXG4gIHJlYWRvbmx5IHNlbGVjdGVkRGF0ZXMkOiBPYnNlcnZhYmxlPFNldDxEYXRlQmxvY2tJbmRleD4+ID0gdGhpcy5zdGF0ZSQucGlwZShcbiAgICBtYXAoKHgpID0+IHguc2VsZWN0ZWRJbmRleGVzKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgaXNFbmFibGVkRmlsdGVyRGF5RnVuY3Rpb24kOiBPYnNlcnZhYmxlPERlY2lzaW9uRnVuY3Rpb248RGF0ZU9yRGF0ZUJsb2NrSW5kZXg+PiA9IHRoaXMuc3RhdGUkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiB4LmlzRW5hYmxlZEZpbHRlckRheSksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBpc0VuYWJsZWREYXlGdW5jdGlvbiQ6IE9ic2VydmFibGU8RGVjaXNpb25GdW5jdGlvbjxEYXRlT3JEYXRlQmxvY2tJbmRleD4+ID0gdGhpcy5zdGF0ZSQucGlwZShcbiAgICBtYXAoKHgpID0+IHguaXNFbmFibGVkRGF5KSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IGN1cnJlbnREYXRlUmFuZ2UkOiBPYnNlcnZhYmxlPE1heWJlPERhdGVSYW5nZT4+ID0gdGhpcy5zdGF0ZSQucGlwZShcbiAgICBtYXAoY29tcHV0ZUNhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25SYW5nZSksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKGEsIGIpID0+IGlzU2FtZURhdGVSYW5nZShhLCBiKSksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBkYXRlUmFuZ2UkOiBPYnNlcnZhYmxlPERhdGVSYW5nZT4gPSB0aGlzLmN1cnJlbnREYXRlUmFuZ2UkLnBpcGUoZmlsdGVyTWF5YmUoKSwgc2hhcmVSZXBsYXkoMSkpO1xuXG4gIHJlYWRvbmx5IHNjaGVkdWxlRGF5cyQ6IE9ic2VydmFibGU8U2V0PERhdGVTY2hlZHVsZURheUNvZGU+PiA9IHRoaXMuc3RhdGUkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiB4LnNjaGVkdWxlRGF5cyksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoc2V0c0FyZUVxdWl2YWxlbnQpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgY3VycmVudFNlbGVjdGlvblZhbHVlJCA9IHRoaXMuc3RhdGUkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiB4LmN1cnJlbnRTZWxlY3Rpb25WYWx1ZSksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcbiAgcmVhZG9ubHkgc2VsZWN0aW9uVmFsdWUkID0gdGhpcy5jdXJyZW50U2VsZWN0aW9uVmFsdWUkLnBpcGUoZmlsdGVyTWF5YmUoKSwgc2hhcmVSZXBsYXkoMSkpO1xuXG4gIHJlYWRvbmx5IGN1cnJlbnREYXRlU2NoZWR1bGVSYW5nZVZhbHVlJCA9IHRoaXMuY3VycmVudFNlbGVjdGlvblZhbHVlJC5waXBlKFxuICAgIG1hcCgoeCkgPT4geD8uZGF0ZVNjaGVkdWxlUmFuZ2UpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKGlzU2FtZURhdGVTY2hlZHVsZVJhbmdlKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuICByZWFkb25seSBkYXRlU2NoZWR1bGVSYW5nZVZhbHVlJCA9IHRoaXMuY3VycmVudERhdGVTY2hlZHVsZVJhbmdlVmFsdWUkLnBpcGUoZmlsdGVyTWF5YmUoKSwgc2hhcmVSZXBsYXkoMSkpO1xuXG4gIHJlYWRvbmx5IG1pbkRhdGUkID0gdGhpcy5zdGF0ZSQucGlwZShcbiAgICBtYXAoKHgpID0+IGZpbmRNYXhEYXRlKFt4LmZpbHRlcj8uc3RhcnQsIHgubWluRGF0ZV0pKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZChpc1NhbWVEYXRlRGF5KSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IG1heERhdGUkID0gdGhpcy5zdGF0ZSQucGlwZShcbiAgICBtYXAoKHgpID0+IGZpbmRNaW5EYXRlKFt4LmZpbHRlcj8uZW5kLCB4Lm1heERhdGVdKSksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoaXNTYW1lRGF0ZURheSksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBjZWxsQ29udGVudEZhY3RvcnkkID0gdGhpcy5zdGF0ZSQucGlwZShcbiAgICBtYXAoKHgpID0+IHguY2VsbENvbnRlbnRGYWN0b3J5KSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgaXNDdXN0b21pemVkJCA9IHRoaXMuc3RhdGUkLnBpcGUoXG4gICAgbWFwKCh4KSA9PiB4LnNlbGVjdGVkSW5kZXhlcy5zaXplID4gMCksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIC8vIE1BUks6IFN0YXRlIENoYW5nZXNcbiAgcmVhZG9ubHkgc2V0RmlsdGVyID0gdGhpcy51cGRhdGVyKChzdGF0ZSwgZmlsdGVyOiBNYXliZTxEYXRlU2NoZWR1bGVEYXRlRmlsdGVyQ29uZmlnPikgPT4gdXBkYXRlU3RhdGVXaXRoRmlsdGVyKHN0YXRlLCBmaWx0ZXIpKTtcbiAgcmVhZG9ubHkgY2xlYXJGaWx0ZXIgPSB0aGlzLnVwZGF0ZXIoKHN0YXRlKSA9PiB1cGRhdGVTdGF0ZVdpdGhGaWx0ZXIoc3RhdGUsIHVuZGVmaW5lZCkpO1xuXG4gIHJlYWRvbmx5IHNldFRpbWV6b25lID0gdGhpcy51cGRhdGVyKChzdGF0ZSwgdGltZXpvbmU6IE1heWJlPFRpbWV6b25lU3RyaW5nPikgPT4gKHsgLi4uc3RhdGUsIHRpbWV6b25lIH0pKTtcbiAgcmVhZG9ubHkgc2V0SW5wdXRSYW5nZSA9IHRoaXMudXBkYXRlcigoc3RhdGUsIHJhbmdlOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uSW5wdXREYXRlUmFuZ2UpID0+IHVwZGF0ZVN0YXRlV2l0aENoYW5nZWRSYW5nZShzdGF0ZSwgcmFuZ2UpKTtcblxuICByZWFkb25seSB0b2dnbGVTZWxlY3RlZERhdGVzID0gdGhpcy51cGRhdGVyKChzdGF0ZSwgdG9nZ2xlOiBJdGVyYWJsZU9yVmFsdWU8RGF0ZU9yRGF0ZUJsb2NrSW5kZXg+KSA9PiB1cGRhdGVTdGF0ZVdpdGhDaGFuZ2VkRGF0ZXMoc3RhdGUsIHsgdG9nZ2xlIH0pKTtcbiAgcmVhZG9ubHkgYWRkU2VsZWN0ZWREYXRlcyA9IHRoaXMudXBkYXRlcigoc3RhdGUsIGFkZDogSXRlcmFibGVPclZhbHVlPERhdGVPckRhdGVCbG9ja0luZGV4PikgPT4gdXBkYXRlU3RhdGVXaXRoQ2hhbmdlZERhdGVzKHN0YXRlLCB7IGFkZCB9KSk7XG4gIHJlYWRvbmx5IHJlbW92ZVNlbGVjdGVkRGF0ZXMgPSB0aGlzLnVwZGF0ZXIoKHN0YXRlLCByZW1vdmU6IEl0ZXJhYmxlT3JWYWx1ZTxEYXRlT3JEYXRlQmxvY2tJbmRleD4pID0+IHVwZGF0ZVN0YXRlV2l0aENoYW5nZWREYXRlcyhzdGF0ZSwgeyByZW1vdmUgfSkpO1xuICByZWFkb25seSBzZXRTZWxlY3RlZERhdGVzID0gdGhpcy51cGRhdGVyKChzdGF0ZSwgc2V0OiBJdGVyYWJsZU9yVmFsdWU8RGF0ZU9yRGF0ZUJsb2NrSW5kZXg+KSA9PiB1cGRhdGVTdGF0ZVdpdGhDaGFuZ2VkRGF0ZXMoc3RhdGUsIHsgc2V0IH0pKTtcblxuICByZWFkb25seSBzZXRTY2hlZHVsZURheXMgPSB0aGlzLnVwZGF0ZXIoKHN0YXRlLCBzY2hlZHVsZURheXM6IEl0ZXJhYmxlPERhdGVTY2hlZHVsZURheUNvZGU+KSA9PiB1cGRhdGVTdGF0ZVdpdGhDaGFuZ2VkU2NoZWR1bGVEYXlzKHN0YXRlLCBzY2hlZHVsZURheXMpKTtcbiAgcmVhZG9ubHkgc2V0QWxsb3dBbGxTY2hlZHVsZURheXMgPSB0aGlzLnVwZGF0ZXIoKHN0YXRlKSA9PiB1cGRhdGVTdGF0ZVdpdGhDaGFuZ2VkU2NoZWR1bGVEYXlzKHN0YXRlLCBudWxsKSk7XG5cbiAgcmVhZG9ubHkgc2V0RGF0ZVNjaGVkdWxlUmFuZ2VWYWx1ZSA9IHRoaXMudXBkYXRlcigoc3RhdGUsIHZhbHVlOiBNYXliZTxEYXRlU2NoZWR1bGVSYW5nZT4pID0+IHVwZGF0ZVN0YXRlV2l0aERhdGVTY2hlZHVsZVJhbmdlVmFsdWUoc3RhdGUsIHZhbHVlKSk7XG4gIHJlYWRvbmx5IHNldENlbGxDb250ZW50RmFjdG9yeSA9IHRoaXMudXBkYXRlcigoc3RhdGUsIGNlbGxDb250ZW50RmFjdG9yeTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvbkNlbGxDb250ZW50RmFjdG9yeSkgPT4gKHsgLi4uc3RhdGUsIGNlbGxDb250ZW50RmFjdG9yeSB9KSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVTdGF0ZVdpdGhGaWx0ZXIoc3RhdGU6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSwgZmlsdGVyOiBNYXliZTxEYXRlU2NoZWR1bGVEYXRlRmlsdGVyQ29uZmlnPik6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSB7XG4gIGxldCBpc0VuYWJsZWRGaWx0ZXJEYXk6IE1heWJlPERlY2lzaW9uRnVuY3Rpb248RGF0ZU9yRGF0ZUJsb2NrSW5kZXg+PiA9ICgpID0+IHRydWU7XG5cbiAgaWYgKGZpbHRlcikge1xuICAgIGlzRW5hYmxlZEZpbHRlckRheSA9IGRhdGVTY2hlZHVsZURhdGVGaWx0ZXIoZmlsdGVyKTtcbiAgfVxuXG4gIHJldHVybiB7IC4uLnN0YXRlLCBmaWx0ZXIsIGlzRW5hYmxlZEZpbHRlckRheSB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlU3RhdGVXaXRoRGF0ZVNjaGVkdWxlUmFuZ2VWYWx1ZShzdGF0ZTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlLCBjaGFuZ2U6IE1heWJlPERhdGVTY2hlZHVsZVJhbmdlPik6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSB7XG4gIGNvbnN0IGlzU2FtZVZhbHVlID0gaXNTYW1lRGF0ZVNjaGVkdWxlUmFuZ2Uoc3RhdGUuY3VycmVudFNlbGVjdGlvblZhbHVlPy5kYXRlU2NoZWR1bGVSYW5nZSwgY2hhbmdlKTtcblxuICBpZiAoaXNTYW1lVmFsdWUpIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH0gZWxzZSB7XG4gICAgaWYgKGNoYW5nZSAhPSBudWxsKSB7XG4gICAgICBjb25zdCBuZXh0U3RhdGU6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSA9IHsgLi4uc3RhdGUsIGlucHV0U3RhcnQ6IGNoYW5nZS5zdGFydCwgaW5wdXRFbmQ6IGNoYW5nZS5lbmQsIHNlbGVjdGVkSW5kZXhlczogbmV3IFNldChjaGFuZ2UuZXgpIH07XG4gICAgICByZXR1cm4gdXBkYXRlU3RhdGVXaXRoQ2hhbmdlZFNjaGVkdWxlRGF5cyhmaW5hbGl6ZU5ld0NhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZShuZXh0U3RhdGUpLCBkYXRlU2NoZWR1bGVEYXlDb2RlcyhjaGFuZ2UudykpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbm9TZWxlY3Rpb25DYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUoc3RhdGUpOyAvLyBjbGVhciBzZWxlY3Rpb24sIHJldGFpbiBkaXNhYmxlZCBkYXlzXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVTdGF0ZVdpdGhDaGFuZ2VkU2NoZWR1bGVEYXlzKHN0YXRlOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUsIGNoYW5nZTogTWF5YmU8SXRlcmFibGU8RGF0ZVNjaGVkdWxlRGF5Q29kZT4+KTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlIHtcbiAgY29uc3QgeyBzY2hlZHVsZURheXM6IGN1cnJlbnRTY2hlZHVsZURheXMgfSA9IHN0YXRlO1xuICBjb25zdCBzY2hlZHVsZURheXMgPSBuZXcgU2V0KGNoYW5nZSB8fCBbRGF0ZVNjaGVkdWxlRGF5Q29kZS5XRUVLREFZLCBEYXRlU2NoZWR1bGVEYXlDb2RlLldFRUtFTkRdKTtcblxuICBpZiAoc2V0c0FyZUVxdWl2YWxlbnQoY3VycmVudFNjaGVkdWxlRGF5cywgc2NoZWR1bGVEYXlzKSkge1xuICAgIHJldHVybiBzdGF0ZTsgLy8gbm8gY2hhbmdlXG4gIH0gZWxzZSB7XG4gICAgY29uc3QgYWxsb3dlZERheXNPZldlZWsgPSBleHBhbmREYXRlU2NoZWR1bGVEYXlDb2Rlc1RvRGF5T2ZXZWVrU2V0KEFycmF5LmZyb20oc2NoZWR1bGVEYXlzKSk7XG4gICAgY29uc3QgbmV4dFN0YXRlID0geyAuLi5zdGF0ZSwgc2NoZWR1bGVEYXlzLCBhbGxvd2VkRGF5c09mV2VlayB9O1xuICAgIHJldHVybiBmaW5hbGl6ZU5ld0NhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZShuZXh0U3RhdGUpO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlRGF0ZXNDaGFuZ2Uge1xuICB0b2dnbGU/OiBJdGVyYWJsZU9yVmFsdWU8RGF0ZU9yRGF0ZUJsb2NrSW5kZXg+O1xuICBhZGQ/OiBJdGVyYWJsZU9yVmFsdWU8RGF0ZU9yRGF0ZUJsb2NrSW5kZXg+O1xuICByZW1vdmU/OiBJdGVyYWJsZU9yVmFsdWU8RGF0ZU9yRGF0ZUJsb2NrSW5kZXg+O1xuICBzZXQ/OiBJdGVyYWJsZU9yVmFsdWU8RGF0ZU9yRGF0ZUJsb2NrSW5kZXg+O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlU3RhdGVXaXRoQ2hhbmdlZERhdGVzKHN0YXRlOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUsIGNoYW5nZTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlRGF0ZXNDaGFuZ2UpOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUge1xuICBjb25zdCB7IGluZGV4RmFjdG9yeSwgYWxsb3dlZERheXNPZldlZWssIGluZGV4RGF5T2ZXZWVrIH0gPSBzdGF0ZTtcbiAgbGV0IHNlbGVjdGVkSW5kZXhlczogU2V0PERhdGVCbG9ja0luZGV4PjtcblxuICBpZiAoY2hhbmdlLnNldCkge1xuICAgIHNlbGVjdGVkSW5kZXhlcyA9IG5ldyBTZXQoaXRlcmFibGVUb0FycmF5KGNoYW5nZS5zZXQpLm1hcChpbmRleEZhY3RvcnkpKTtcbiAgfSBlbHNlIHtcbiAgICBzZWxlY3RlZEluZGV4ZXMgPSBuZXcgU2V0KHN0YXRlLnNlbGVjdGVkSW5kZXhlcyk7XG5cbiAgICBpZiAoY2hhbmdlLnRvZ2dsZSkge1xuICAgICAgY29uc3QgYWxsb3dlZFRvVG9nZ2xlID0gaXRlcmFibGVUb0FycmF5KGNoYW5nZS50b2dnbGUpXG4gICAgICAgIC5tYXAoaW5kZXhGYWN0b3J5KVxuICAgICAgICAuZmlsdGVyKChpKSA9PiBhbGxvd2VkRGF5c09mV2Vlay5oYXMoaW5kZXhEYXlPZldlZWsoaSkpKTtcbiAgICAgIHRvZ2dsZUluU2V0KHNlbGVjdGVkSW5kZXhlcywgYWxsb3dlZFRvVG9nZ2xlKTtcbiAgICB9XG5cbiAgICBpZiAoY2hhbmdlLmFkZCkge1xuICAgICAgYWRkVG9TZXQoc2VsZWN0ZWRJbmRleGVzLCBpdGVyYWJsZVRvQXJyYXkoY2hhbmdlLmFkZCkubWFwKGluZGV4RmFjdG9yeSkpO1xuICAgIH1cblxuICAgIGlmIChjaGFuZ2UucmVtb3ZlKSB7XG4gICAgICBhZGRUb1NldChzZWxlY3RlZEluZGV4ZXMsIGl0ZXJhYmxlVG9BcnJheShjaGFuZ2UucmVtb3ZlKS5tYXAoaW5kZXhGYWN0b3J5KSk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgbmV4dFN0YXRlID0geyAuLi5zdGF0ZSwgc2VsZWN0ZWRJbmRleGVzIH07XG4gIG5leHRTdGF0ZS5pc0VuYWJsZWREYXkgPSBpc0VuYWJsZWREYXlJbkNhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZShuZXh0U3RhdGUpO1xuXG4gIC8vIFJlY2FsY3VsYXRlIHRoZSByYW5nZSBhbmQgc2ltcGxpZmllZCB0byBleGNsdXNpb25zXG4gIGNvbnN0IHJhbmdlQW5kRXhjbHVzaW9uID0gY29tcHV0ZVNjaGVkdWxlU2VsZWN0aW9uUmFuZ2VBbmRFeGNsdXNpb24obmV4dFN0YXRlKTtcblxuICBpZiAocmFuZ2VBbmRFeGNsdXNpb24pIHtcbiAgICByZXR1cm4gZmluYWxpemVOZXdDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUoeyAuLi5uZXh0U3RhdGUsIHNlbGVjdGVkSW5kZXhlczogbmV3IFNldChyYW5nZUFuZEV4Y2x1c2lvbi5leGNsdWRlZCksIGlucHV0U3RhcnQ6IHJhbmdlQW5kRXhjbHVzaW9uLnN0YXJ0LCBpbnB1dEVuZDogcmFuZ2VBbmRFeGNsdXNpb24uZW5kIH0pO1xuICB9IGVsc2Uge1xuICAgIC8vIG5vIHNlbGVjdGVkIGRheXNcbiAgICByZXR1cm4gbm9TZWxlY3Rpb25DYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUoc3RhdGUpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBub1NlbGVjdGlvbkNhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZShzdGF0ZTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlKTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlIHtcbiAgcmV0dXJuIGZpbmFsaXplTmV3Q2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlKHsgLi4uc3RhdGUsIHNlbGVjdGVkSW5kZXhlczogbmV3IFNldCgpLCBpbnB1dFN0YXJ0OiBudWxsLCBpbnB1dEVuZDogbnVsbCB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVN0YXRlV2l0aENoYW5nZWRSYW5nZShzdGF0ZTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlLCBjaGFuZ2U6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25JbnB1dERhdGVSYW5nZSk6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSB7XG4gIGNvbnN0IHsgaW5wdXRTdGFydDogY3VycmVudElucHV0U3RhcnQsIGlucHV0RW5kOiBjdXJyZW50SW5wdXRFbmQsIGluZGV4RmFjdG9yeSwgbWluRGF0ZSwgbWF4RGF0ZSB9ID0gc3RhdGU7XG5cbiAgY29uc3QgaW5wdXRTdGFydCA9IHN0YXJ0T2ZEYXkoY2hhbmdlLmlucHV0U3RhcnQpO1xuICBjb25zdCBpbnB1dEVuZCA9IHN0YXJ0T2ZEYXkoY2hhbmdlLmlucHV0RW5kKTtcblxuICBjb25zdCBpc1ZhbGlkUmFuZ2UgPSBtaW5EYXRlICE9IG51bGwgfHwgbWF4RGF0ZSAhPSBudWxsID8gaXNEYXRlSW5EYXRlUmFuZ2VGdW5jdGlvbih7IHN0YXJ0OiBtaW5EYXRlID8/IHVuZGVmaW5lZCwgZW5kOiBtYXhEYXRlID8/IHVuZGVmaW5lZCB9KSA6ICgpID0+IHRydWU7XG5cbiAgaWYgKCFpc1ZhbGlkUmFuZ2UoaW5wdXRTdGFydCkgfHwgIWlzVmFsaWRSYW5nZShpbnB1dEVuZCkgfHwgKGlzU2FtZURhdGVEYXkoaW5wdXRTdGFydCwgY3VycmVudElucHV0U3RhcnQpICYmIGlzU2FtZURhdGVEYXkoaW5wdXRFbmQsIGN1cnJlbnRJbnB1dEVuZCkpKSB7XG4gICAgcmV0dXJuIHN0YXRlOyAvLyBpZiBubyBjaGFuZ2UsIHJldHVybiB0aGUgY3VycmVudCBzdGF0ZS5cbiAgfVxuXG4gIC8vIHJldGFpbiBhbGwgaW5kZXhlcyB0aGF0IGFyZSB3aXRoaW4gdGhlIG5ldyByYW5nZVxuICBjb25zdCBtaW5JbmRleCA9IGluZGV4RmFjdG9yeShpbnB1dFN0YXJ0KTtcbiAgY29uc3QgbWF4SW5kZXggPSBpbmRleEZhY3RvcnkoaW5wdXRFbmQpICsgMTtcblxuICBjb25zdCBjdXJyZW50SW5kZXhlczogRGF0ZUJsb2NrSW5kZXhbXSA9IEFycmF5LmZyb20oc3RhdGUuc2VsZWN0ZWRJbmRleGVzKTtcbiAgY29uc3QgaXNJbkN1cnJlbnRSYW5nZSA9IGlzSW5kZXhOdW1iZXJJbkluZGV4UmFuZ2VGdW5jdGlvbih7IG1pbkluZGV4LCBtYXhJbmRleCB9KTtcbiAgY29uc3QgZXhjbHVkZWRJbmRleGVzSW5OZXdSYW5nZSA9IGN1cnJlbnRJbmRleGVzLmZpbHRlcihpc0luQ3VycmVudFJhbmdlKTtcblxuICBjb25zdCBuZXh0U3RhdGUgPSB7IC4uLnN0YXRlLCBleGNsdWRlZEluZGV4ZXNJbk5ld1JhbmdlLCBpbnB1dFN0YXJ0LCBpbnB1dEVuZCB9O1xuICByZXR1cm4gZmluYWxpemVOZXdDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUobmV4dFN0YXRlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmFsaXplTmV3Q2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlKG5leHRTdGF0ZTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlKTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlIHtcbiAgbmV4dFN0YXRlLmlzRW5hYmxlZERheSA9IGlzRW5hYmxlZERheUluQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlKG5leHRTdGF0ZSk7XG4gIG5leHRTdGF0ZS5jdXJyZW50U2VsZWN0aW9uVmFsdWUgPSBjb21wdXRlU2NoZWR1bGVTZWxlY3Rpb25WYWx1ZShuZXh0U3RhdGUpO1xuICByZXR1cm4gbmV4dFN0YXRlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNFbmFibGVkRGF5SW5DYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUoc3RhdGU6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSk6IERlY2lzaW9uRnVuY3Rpb248RGF0ZU9yRGF0ZUJsb2NrSW5kZXg+IHtcbiAgY29uc3QgeyBpbmRleEZhY3RvcnksIGlucHV0U3RhcnQsIGlucHV0RW5kLCBpbmRleERheU9mV2VlaywgYWxsb3dlZERheXNPZldlZWsgfSA9IHN0YXRlO1xuXG4gIGxldCBpc0luU3RhcnRBbmRFbmRSYW5nZTogSXNEYXRlV2l0aGluRGF0ZUJsb2NrUmFuZ2VGdW5jdGlvbjtcblxuICBpZiAoaW5wdXRTdGFydCAmJiBpbnB1dEVuZCkge1xuICAgIGlzSW5TdGFydEFuZEVuZFJhbmdlID0gaXNEYXRlV2l0aGluRGF0ZUJsb2NrUmFuZ2VGdW5jdGlvbih7IHN0YXJ0OiBzdGF0ZS5zdGFydCwgcmFuZ2U6IHsgc3RhcnQ6IGlucHV0U3RhcnQsIGVuZDogaW5wdXRFbmQgfSB9KTtcbiAgfSBlbHNlIHtcbiAgICBpc0luU3RhcnRBbmRFbmRSYW5nZSA9ICgpID0+IGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIChpbnB1dDogRGF0ZU9yRGF0ZUJsb2NrSW5kZXgpID0+IHtcbiAgICBjb25zdCBpbmRleCA9IGluZGV4RmFjdG9yeShpbnB1dCk7XG4gICAgY29uc3QgZGF5T2ZXZWVrID0gaW5kZXhEYXlPZldlZWsoaW5kZXgpO1xuXG4gICAgY29uc3QgaXNJblNlbGVjdGVkUmFuZ2UgPSBpc0luU3RhcnRBbmRFbmRSYW5nZShpbnB1dCk7XG4gICAgY29uc3QgaXNTZWxlY3RlZCA9IHN0YXRlLnNlbGVjdGVkSW5kZXhlcy5oYXMoaW5kZXgpO1xuICAgIGNvbnN0IGlzQWxsb3dlZERheU9mV2VlayA9IGFsbG93ZWREYXlzT2ZXZWVrLmhhcyhkYXlPZldlZWspO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gaXNBbGxvd2VkRGF5T2ZXZWVrICYmICgoaXNJblNlbGVjdGVkUmFuZ2UgJiYgIWlzU2VsZWN0ZWQpIHx8IChpc1NlbGVjdGVkICYmICFpc0luU2VsZWN0ZWRSYW5nZSkpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlU2NoZWR1bGVTZWxlY3Rpb25WYWx1ZShzdGF0ZTogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblN0YXRlKTogTWF5YmU8Q2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblZhbHVlPiB7XG4gIGNvbnN0IHsgc2NoZWR1bGVEYXlzLCBhbGxvd2VkRGF5c09mV2VlaywgaW5kZXhEYXlPZldlZWsgfSA9IHN0YXRlO1xuICBjb25zdCByYW5nZUFuZEV4Y2x1c2lvbiA9IGNvbXB1dGVTY2hlZHVsZVNlbGVjdGlvblJhbmdlQW5kRXhjbHVzaW9uKHN0YXRlKTtcblxuICBpZiAocmFuZ2VBbmRFeGNsdXNpb24gPT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgeyBzdGFydCwgZW5kLCBleGNsdWRlZCwgZGF0ZUJsb2NrUmFuZ2UgfSA9IHJhbmdlQW5kRXhjbHVzaW9uO1xuICBjb25zdCBpbmRleE9mZnNldCA9IGRhdGVCbG9ja1JhbmdlLmk7XG5cbiAgY29uc3QgZXg6IERhdGVCbG9ja0luZGV4W10gPSBleGNsdWRlZFxuICAgIC5maWx0ZXIoKHgpID0+IHtcbiAgICAgIGNvbnN0IGlzRXhjbHVkZWRJbmRleCA9IGFsbG93ZWREYXlzT2ZXZWVrLmhhcyhpbmRleERheU9mV2Vlayh4KSk7XG4gICAgICByZXR1cm4gaXNFeGNsdWRlZEluZGV4O1xuICAgIH0pXG4gICAgLm1hcCgoeCkgPT4geCAtIGluZGV4T2Zmc2V0KTsgLy8gc2V0IHRvIHRoZSBwcm9wZXIgb2Zmc2V0XG5cbiAgY29uc3QgdzogRGF0ZVNjaGVkdWxlRW5jb2RlZFdlZWsgPSBkYXRlU2NoZWR1bGVFbmNvZGVkV2VlayhzY2hlZHVsZURheXMpO1xuICBjb25zdCBkOiBEYXRlQmxvY2tJbmRleFtdID0gW107IC8vIFwiaW5jbHVkZWRcIiBibG9ja3MgYXJlIG5ldmVyIHVzZWQvY2FsY3VsYXRlZC5cblxuICBjb25zdCBkYXRlU2NoZWR1bGVSYW5nZTogRGF0ZVNjaGVkdWxlUmFuZ2UgPSB7XG4gICAgc3RhcnQsXG4gICAgZW5kLFxuICAgIHcsXG4gICAgZCxcbiAgICBleFxuICB9O1xuXG4gIHJldHVybiB7XG4gICAgZGF0ZVNjaGVkdWxlUmFuZ2UsXG4gICAgbWluTWF4UmFuZ2U6IHsgc3RhcnQsIGVuZCB9XG4gIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblJhbmdlQW5kRXhjbHVzaW9uIGV4dGVuZHMgRGF0ZVJhbmdlIHtcbiAgZGF0ZUJsb2NrUmFuZ2U6IERhdGVCbG9ja1JhbmdlV2l0aFJhbmdlO1xuICBleGNsdWRlZDogRGF0ZUJsb2NrSW5kZXhbXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVTY2hlZHVsZVNlbGVjdGlvblJhbmdlQW5kRXhjbHVzaW9uKHN0YXRlOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUpOiBNYXliZTxDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uUmFuZ2VBbmRFeGNsdXNpb24+IHtcbiAgY29uc3QgeyBpc0VuYWJsZWREYXkgfSA9IHN0YXRlO1xuICBjb25zdCBkYXRlRmFjdG9yeSA9IGRhdGVCbG9ja1RpbWluZ0RhdGVGYWN0b3J5KHN0YXRlKTtcbiAgY29uc3QgZGF0ZUJsb2NrUmFuZ2UgPSBjb21wdXRlQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvbkRhdGVCbG9ja1JhbmdlKHN0YXRlKTtcblxuICBpZiAoZGF0ZUJsb2NrUmFuZ2UgPT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsOyAvLyByZXR1cm5zIG51bGwgaWYgbm8gaXRlbXMgYXJlIHNlbGVjdGVkLlxuICB9XG5cbiAgY29uc3Qgc3RhcnQgPSBkYXRlRmFjdG9yeShkYXRlQmxvY2tSYW5nZS5pKTtcbiAgY29uc3QgZW5kID0gZGF0ZUZhY3RvcnkoZGF0ZUJsb2NrUmFuZ2UudG8pO1xuXG4gIGNvbnN0IGV4Y2x1ZGVkOiBEYXRlQmxvY2tJbmRleFtdID0gcmFuZ2UoZGF0ZUJsb2NrUmFuZ2UuaSwgZGF0ZUJsb2NrUmFuZ2UudG8gKyAxKS5maWx0ZXIoKHgpID0+IHtcbiAgICBjb25zdCBpc0V4Y2x1ZGVkSW5kZXggPSAhaXNFbmFibGVkRGF5KHgpO1xuICAgIHJldHVybiBpc0V4Y2x1ZGVkSW5kZXg7XG4gIH0pO1xuXG4gIGNvbnN0IHJlc3VsdDogQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblJhbmdlQW5kRXhjbHVzaW9uID0ge1xuICAgIGRhdGVCbG9ja1JhbmdlLFxuICAgIHN0YXJ0LFxuICAgIGVuZCxcbiAgICBleGNsdWRlZFxuICB9O1xuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlQ2FsZW5kYXJTY2hlZHVsZVNlbGVjdGlvblJhbmdlKHN0YXRlOiBDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uU3RhdGUpOiBNYXliZTxEYXRlUmFuZ2U+IHtcbiAgY29uc3QgZGF0ZUZhY3RvcnkgPSBkYXRlQmxvY2tUaW1pbmdEYXRlRmFjdG9yeShzdGF0ZSk7XG4gIGNvbnN0IGRhdGVCbG9ja1JhbmdlID0gY29tcHV0ZUNhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25EYXRlQmxvY2tSYW5nZShzdGF0ZSk7XG5cbiAgaWYgKGRhdGVCbG9ja1JhbmdlICE9IG51bGwpIHtcbiAgICByZXR1cm4geyBzdGFydDogZGF0ZUZhY3RvcnkoZGF0ZUJsb2NrUmFuZ2UuaSksIGVuZDogZGF0ZUZhY3RvcnkoZGF0ZUJsb2NrUmFuZ2UudG8gYXMgbnVtYmVyKSB9O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVDYWxlbmRhclNjaGVkdWxlU2VsZWN0aW9uRGF0ZUJsb2NrUmFuZ2Uoc3RhdGU6IENhbGVuZGFyU2NoZWR1bGVTZWxlY3Rpb25TdGF0ZSk6IE1heWJlPERhdGVCbG9ja1JhbmdlV2l0aFJhbmdlPiB7XG4gIGNvbnN0IHsgaW5kZXhGYWN0b3J5LCBpbnB1dFN0YXJ0LCBpbnB1dEVuZCwgYWxsb3dlZERheXNPZldlZWssIGluZGV4RGF5T2ZXZWVrLCBpc0VuYWJsZWREYXksIGlzRW5hYmxlZEZpbHRlckRheSB9ID0gc3RhdGU7XG4gIGNvbnN0IGVuYWJsZWRTZWxlY3RlZEluZGV4ZXMgPSBBcnJheS5mcm9tKHN0YXRlLnNlbGVjdGVkSW5kZXhlcykuZmlsdGVyKChpKSA9PiBhbGxvd2VkRGF5c09mV2Vlay5oYXMoaW5kZXhEYXlPZldlZWsoaSkpKTtcbiAgY29uc3QgbWluQW5kTWF4U2VsZWN0ZWRWYWx1ZXMgPSBtaW5BbmRNYXhOdW1iZXIoZW5hYmxlZFNlbGVjdGVkSW5kZXhlcyk7XG5cbiAgbGV0IHN0YXJ0UmFuZ2U6IE1heWJlPERhdGVCbG9ja0luZGV4PjtcbiAgbGV0IGVuZFJhbmdlOiBNYXliZTxEYXRlQmxvY2tJbmRleD47XG5cbiAgaWYgKG1pbkFuZE1heFNlbGVjdGVkVmFsdWVzKSB7XG4gICAgc3RhcnRSYW5nZSA9IG1pbkFuZE1heFNlbGVjdGVkVmFsdWVzLm1pbjtcbiAgICBlbmRSYW5nZSA9IG1pbkFuZE1heFNlbGVjdGVkVmFsdWVzLm1heDtcbiAgfVxuXG4gIGlmIChpbnB1dFN0YXJ0ICE9IG51bGwgJiYgaW5wdXRFbmQgIT0gbnVsbCkge1xuICAgIGNvbnN0IGlucHV0U3RhcnRJbmRleCA9IGluZGV4RmFjdG9yeShpbnB1dFN0YXJ0KTtcbiAgICBjb25zdCBpbnB1dEVuZEluZGV4ID0gaW5kZXhGYWN0b3J5KGlucHV0RW5kKTtcblxuICAgIHN0YXJ0UmFuZ2UgPSBzdGFydFJhbmdlICE9IG51bGwgPyBNYXRoLm1pbihpbnB1dFN0YXJ0SW5kZXgsIHN0YXJ0UmFuZ2UpIDogaW5wdXRTdGFydEluZGV4O1xuICAgIGVuZFJhbmdlID0gZW5kUmFuZ2UgIT0gbnVsbCA/IE1hdGgubWF4KGlucHV0RW5kSW5kZXgsIGVuZFJhbmdlKSA6IGlucHV0RW5kSW5kZXg7XG4gIH1cblxuICBpZiAoc3RhcnRSYW5nZSAhPSBudWxsICYmIGVuZFJhbmdlICE9IG51bGwpIHtcbiAgICBjb25zdCBzY2FuU3RhcnRJbmRleCA9IHN0YXJ0UmFuZ2U7XG4gICAgY29uc3Qgc2NhbkVuZEluZGV4ID0gZW5kUmFuZ2U7XG5cbiAgICAvLyBjbGVhciBzdGFydCBhbmQgZW5kXG4gICAgc3RhcnRSYW5nZSA9IHVuZGVmaW5lZDtcbiAgICBlbmRSYW5nZSA9IHVuZGVmaW5lZDtcblxuICAgIC8vIGlmIHRoZSBtaW4gaXMgZXF1YWwgdG8gdGhlIHN0YXJ0IGluZGV4LCB0aGVuIHdlIGFyZSBpbiB0aGUgcmFuZ2UgYW5kIG5lZWQgdG8gaXRlcmF0ZSBkYXRlcyB1bnRpbCB3ZSBmaW5kIG9uZSB0aGF0IGlzIG5vdCBzZWxlY3RlZC9leGNsdWRlZC5cbiAgICBmb3IgKGxldCBpID0gc2NhblN0YXJ0SW5kZXg7IGkgPD0gc2NhbkVuZEluZGV4OyBpICs9IDEpIHtcbiAgICAgIGlmIChpc0VuYWJsZWRGaWx0ZXJEYXkoaSkgJiYgaXNFbmFibGVkRGF5KGkpKSB7XG4gICAgICAgIHN0YXJ0UmFuZ2UgPSBpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBzYW1lIHdpdGggdGhlIG1heFxuICAgIGZvciAobGV0IGkgPSBzY2FuRW5kSW5kZXg7IGkgPj0gc2NhblN0YXJ0SW5kZXg7IGkgLT0gMSkge1xuICAgICAgaWYgKGlzRW5hYmxlZEZpbHRlckRheShpKSAmJiBpc0VuYWJsZWREYXkoaSkpIHtcbiAgICAgICAgZW5kUmFuZ2UgPSBpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoc3RhcnRSYW5nZSAhPSBudWxsICYmIGVuZFJhbmdlICE9IG51bGwpIHtcbiAgICByZXR1cm4geyBpOiBzdGFydFJhbmdlLCB0bzogZW5kUmFuZ2UgfTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG4iXX0=