novo-elements 5.1.1 → 5.2.3

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 (576) hide show
  1. package/README.md +7 -7
  2. package/bundles/novo-elements.umd.js +42693 -42665
  3. package/bundles/novo-elements.umd.js.map +1 -1
  4. package/bundles/novo-elements.umd.min.js +2 -2
  5. package/bundles/novo-elements.umd.min.js.map +1 -1
  6. package/elements/ace-editor/AceEditor.d.ts +37 -37
  7. package/elements/ace-editor/AceEditor.module.d.ts +2 -2
  8. package/elements/ace-editor/AceEditor.scss +5 -0
  9. package/elements/button/Button.d.ts +9 -9
  10. package/elements/button/Button.module.d.ts +2 -2
  11. package/elements/button/Button.scss +397 -0
  12. package/elements/calendar/Calendar.module.d.ts +2 -2
  13. package/elements/calendar/common/CalendarDateChange.d.ts +25 -25
  14. package/elements/calendar/common/CalendarDateChange.scss +23 -0
  15. package/elements/calendar/common/EventTypeLegend.d.ts +7 -7
  16. package/elements/calendar/day/CalendarAllDayEvent.d.ts +7 -7
  17. package/elements/calendar/day/CalendarDayEvent.d.ts +8 -8
  18. package/elements/calendar/day/CalendarDayView.d.ts +148 -148
  19. package/elements/calendar/day/CalendarDayView.scss +97 -0
  20. package/elements/calendar/day/CalendarHourSegment.d.ts +7 -7
  21. package/elements/calendar/month/CalendarMonthDay.d.ts +14 -14
  22. package/elements/calendar/month/CalendarMonthHeader.d.ts +14 -14
  23. package/elements/calendar/month/CalendarMonthView.d.ts +110 -110
  24. package/elements/calendar/month/CalendarMonthView.scss +169 -0
  25. package/elements/calendar/pipe/DayOfMonth.pipe.d.ts +6 -6
  26. package/elements/calendar/pipe/EndOfWeekDisplayPipe.pipe.d.ts +6 -6
  27. package/elements/calendar/pipe/Hours.pipe.d.ts +6 -6
  28. package/elements/calendar/pipe/Month.pipe.d.ts +6 -6
  29. package/elements/calendar/pipe/MonthDay.pipe.d.ts +6 -6
  30. package/elements/calendar/pipe/Weekday.pipe.d.ts +6 -6
  31. package/elements/calendar/pipe/Year.pipe.d.ts +6 -6
  32. package/elements/calendar/week/CalendarWeekEvent.d.ts +8 -8
  33. package/elements/calendar/week/CalendarWeekHeader.d.ts +14 -14
  34. package/elements/calendar/week/CalendarWeekView.d.ts +156 -156
  35. package/elements/calendar/week/CalendarWeekView.scss +86 -0
  36. package/elements/card/Card.d.ts +28 -28
  37. package/elements/card/Card.module.d.ts +2 -2
  38. package/elements/card/Card.scss +104 -0
  39. package/elements/category-dropdown/CategoryDropdown.d.ts +29 -29
  40. package/elements/category-dropdown/CategoryDropdown.module.d.ts +2 -2
  41. package/elements/category-dropdown/CategoryDropdown.scss +157 -0
  42. package/elements/chips/Chips.d.ts +78 -78
  43. package/elements/chips/Chips.module.d.ts +2 -2
  44. package/elements/chips/Chips.scss +373 -0
  45. package/elements/chips/RowChips.d.ts +12 -12
  46. package/elements/ckeditor/CKEditor.d.ts +44 -44
  47. package/elements/ckeditor/CKEditor.module.d.ts +2 -2
  48. package/elements/ckeditor/CKEditor.scss +37 -0
  49. package/elements/common/common.module.d.ts +2 -2
  50. package/elements/common/novo-template/novo-template.directive.d.ts +8 -8
  51. package/elements/data-table/ListInteractionTypes.d.ts +10 -10
  52. package/elements/data-table/cell-headers/data-table-checkbox-header-cell.component.d.ts +15 -15
  53. package/elements/data-table/cell-headers/data-table-expand-header-cell.component.d.ts +13 -13
  54. package/elements/data-table/cell-headers/data-table-header-cell.component.d.ts +81 -81
  55. package/elements/data-table/cell-headers/data-table-header-cell.directive.d.ts +11 -11
  56. package/elements/data-table/cells/data-table-cell.component.d.ts +17 -17
  57. package/elements/data-table/cells/data-table-checkbox-cell.component.d.ts +17 -17
  58. package/elements/data-table/cells/data-table-expand-cell.component.d.ts +16 -16
  59. package/elements/data-table/data-table-clear-button.component.d.ts +15 -15
  60. package/elements/data-table/data-table-expand.directive.d.ts +18 -18
  61. package/elements/data-table/data-table.component.d.ts +99 -99
  62. package/elements/data-table/data-table.component.scss +753 -0
  63. package/elements/data-table/data-table.module.d.ts +2 -2
  64. package/elements/data-table/data-table.pipes.d.ts +37 -37
  65. package/elements/data-table/data-table.source.d.ts +22 -22
  66. package/elements/data-table/interfaces.d.ts +128 -128
  67. package/elements/data-table/pagination/data-table-pagination.component.d.ts +52 -52
  68. package/elements/data-table/rows/data-table-header-row.component.d.ts +6 -6
  69. package/elements/data-table/rows/data-table-row.component.d.ts +7 -7
  70. package/elements/data-table/services/data-table-filter-utils.d.ts +3 -3
  71. package/elements/data-table/services/remote-data-table.service.d.ts +8 -8
  72. package/elements/data-table/services/static-data-table.service.d.ts +12 -12
  73. package/elements/data-table/sort-filter/sort-filter.directive.d.ts +8 -8
  74. package/elements/data-table/state/data-table-state.service.d.ts +32 -32
  75. package/elements/date-picker/DatePicker.d.ts +79 -79
  76. package/elements/date-picker/DatePicker.module.d.ts +2 -2
  77. package/elements/date-picker/DatePicker.scss +414 -0
  78. package/elements/date-picker/DatePickerInput.d.ts +66 -66
  79. package/elements/date-time-picker/DateTimePicker.d.ts +45 -45
  80. package/elements/date-time-picker/DateTimePicker.module.d.ts +2 -2
  81. package/elements/date-time-picker/DateTimePickerInput.d.ts +46 -46
  82. package/elements/date-time-picker/_DateTimePicker.scss +93 -0
  83. package/elements/dragula/Dragula.d.ts +13 -13
  84. package/elements/dragula/Dragula.module.d.ts +2 -2
  85. package/elements/dragula/Dragula.scss +18 -0
  86. package/elements/dragula/DragulaService.d.ts +23 -23
  87. package/elements/dropdown/Dropdown.d.ts +55 -55
  88. package/elements/dropdown/Dropdown.module.d.ts +2 -2
  89. package/elements/dropdown/Dropdown.scss +94 -0
  90. package/elements/expansion/_expansion-theme.scss +50 -0
  91. package/elements/expansion/accordion.d.ts +21 -21
  92. package/elements/expansion/expansion-animations.d.ts +9 -9
  93. package/elements/expansion/expansion-panel-content.d.ts +9 -9
  94. package/elements/expansion/expansion-panel-header.d.ts +45 -45
  95. package/elements/expansion/expansion-panel-header.scss +58 -0
  96. package/elements/expansion/expansion-panel.d.ts +54 -54
  97. package/elements/expansion/expansion-panel.scss +68 -0
  98. package/elements/expansion/expansion.module.d.ts +2 -2
  99. package/elements/form/Control.d.ts +107 -107
  100. package/elements/form/ControlGroup.d.ts +89 -83
  101. package/elements/form/ControlGroup.scss +147 -0
  102. package/elements/form/ControlTemplates.d.ts +9 -9
  103. package/elements/form/DynamicForm.d.ts +46 -46
  104. package/elements/form/FieldInteractionApi.d.ts +160 -160
  105. package/elements/form/FieldInteractionApiTypes.d.ts +29 -29
  106. package/elements/form/FieldInteractionModals.d.ts +16 -16
  107. package/elements/form/Form.d.ts +21 -21
  108. package/elements/form/Form.module.d.ts +2 -2
  109. package/elements/form/Form.scss +857 -0
  110. package/elements/form/FormControls.d.ts +22 -22
  111. package/elements/form/FormInterfaces.d.ts +36 -36
  112. package/elements/form/FormValidators.d.ts +22 -22
  113. package/elements/form/NovoFormControl.d.ts +100 -100
  114. package/elements/form/NovoFormGroup.d.ts +17 -17
  115. package/elements/form/controls/BaseControl.d.ts +106 -106
  116. package/elements/form/controls/ControlFactory.d.ts +4 -4
  117. package/elements/form/controls/ace-editor/AceEditorControl.d.ts +5 -5
  118. package/elements/form/controls/address/AddressControl.d.ts +5 -5
  119. package/elements/form/controls/check-list/CheckListControl.d.ts +5 -5
  120. package/elements/form/controls/checkbox/CheckboxControl.d.ts +5 -5
  121. package/elements/form/controls/custom/CustomControl.d.ts +5 -5
  122. package/elements/form/controls/date/DateControl.d.ts +5 -5
  123. package/elements/form/controls/date-time/DateTimeControl.d.ts +5 -5
  124. package/elements/form/controls/editor/EditorControl.d.ts +6 -6
  125. package/elements/form/controls/file/FileControl.d.ts +5 -5
  126. package/elements/form/controls/grouped/GroupedControl.d.ts +6 -6
  127. package/elements/form/controls/index.d.ts +19 -19
  128. package/elements/form/controls/native-select/NativeSelectControl.d.ts +6 -6
  129. package/elements/form/controls/picker/PickerControl.d.ts +9 -9
  130. package/elements/form/controls/quick-note/QuickNoteControl.d.ts +6 -6
  131. package/elements/form/controls/radio/RadioControl.d.ts +6 -6
  132. package/elements/form/controls/read-only/ReadOnlyControl.d.ts +5 -5
  133. package/elements/form/controls/select/SelectControl.d.ts +6 -6
  134. package/elements/form/controls/text-area/TextAreaControl.d.ts +5 -5
  135. package/elements/form/controls/textbox/TextBoxControl.d.ts +9 -9
  136. package/elements/form/controls/tiles/TilesControl.d.ts +6 -6
  137. package/elements/form/controls/time/TimeControl.d.ts +5 -5
  138. package/elements/form/extras/FormExtras.module.d.ts +2 -2
  139. package/elements/form/extras/address/Address.d.ts +65 -65
  140. package/elements/form/extras/address/Address.scss +152 -0
  141. package/elements/form/extras/checkbox/CheckList.d.ts +20 -20
  142. package/elements/form/extras/checkbox/Checkbox.d.ts +24 -24
  143. package/elements/form/extras/checkbox/Checkbox.scss +87 -0
  144. package/elements/form/extras/file/FileInput.d.ts +72 -72
  145. package/elements/form/extras/file/FileInput.scss +118 -0
  146. package/elements/form/extras/file/extras/file/File.d.ts +22 -22
  147. package/elements/header/Header.d.ts +22 -22
  148. package/elements/header/Header.module.d.ts +2 -2
  149. package/elements/header/Header.scss +96 -0
  150. package/elements/icon/Icon.d.ts +18 -18
  151. package/elements/icon/Icon.module.d.ts +2 -2
  152. package/elements/icon/Icon.scss +82 -0
  153. package/elements/list/List.d.ts +31 -31
  154. package/elements/list/List.module.d.ts +2 -2
  155. package/elements/list/List.scss +134 -0
  156. package/elements/loading/Loading.d.ts +26 -26
  157. package/elements/loading/Loading.module.d.ts +2 -2
  158. package/elements/loading/Loading.scss +56 -0
  159. package/elements/loading/NovoSpinner.scss +172 -0
  160. package/elements/modal/Modal.d.ts +45 -45
  161. package/elements/modal/Modal.module.d.ts +2 -2
  162. package/elements/modal/Modal.scss +207 -0
  163. package/elements/modal/ModalService.d.ts +10 -10
  164. package/elements/multi-picker/MultiPicker.d.ts +107 -107
  165. package/elements/multi-picker/MultiPicker.module.d.ts +2 -2
  166. package/elements/multi-picker/_MultiPicker.scss +74 -0
  167. package/elements/overlay/Overlay.d.ts +57 -57
  168. package/elements/overlay/Overlay.module.d.ts +2 -2
  169. package/elements/picker/Picker.d.ts +69 -69
  170. package/elements/picker/Picker.module.d.ts +2 -2
  171. package/elements/picker/Picker.scss +438 -0
  172. package/elements/picker/extras/base-picker-results/BasePickerResults.d.ts +91 -91
  173. package/elements/picker/extras/checklist-picker-results/ChecklistPickerResults.d.ts +21 -21
  174. package/elements/picker/extras/distributionlist-picker-results/DistributionListPickerResults.d.ts +13 -13
  175. package/elements/picker/extras/entity-picker-results/EntityPickerResults.d.ts +29 -29
  176. package/elements/picker/extras/grouped-multi-picker-results/GroupedMultiPickerResults.d.ts +42 -42
  177. package/elements/picker/extras/grouped-multi-picker-results/GroupedMultiPickerResults.scss +136 -0
  178. package/elements/picker/extras/mixed-multi-picker-results/MixedMultiPickerResults.d.ts +43 -43
  179. package/elements/picker/extras/mixed-multi-picker-results/MixedMultiPickerResults.scss +156 -0
  180. package/elements/picker/extras/picker-results/PickerResults.d.ts +11 -11
  181. package/elements/picker/extras/skills-picker-results/SkillsSpecialtyPickerResults.d.ts +21 -21
  182. package/elements/picker/extras/skills-picker-results/SkillsSpecialtyPickerResults.scss +65 -0
  183. package/elements/picker/extras/workers-comp-codes-picker-results/WorkersCompCodesPickerResults.d.ts +13 -13
  184. package/elements/picker/extras/workers-comp-codes-picker-results/WorkersCompCodesPickerResults.scss +0 -0
  185. package/elements/places/places.component.d.ts +71 -71
  186. package/elements/places/places.component.scss +26 -0
  187. package/elements/places/places.module.d.ts +2 -2
  188. package/elements/places/places.service.d.ts +22 -22
  189. package/elements/popover/PopOver.d.ts +30 -30
  190. package/elements/popover/PopOver.module.d.ts +2 -2
  191. package/elements/popover/PopOver.scss +179 -0
  192. package/elements/popover/PopOverContent.d.ts +45 -45
  193. package/elements/quick-note/QuickNote.d.ts +139 -139
  194. package/elements/quick-note/QuickNote.module.d.ts +2 -2
  195. package/elements/quick-note/QuickNote.scss +52 -0
  196. package/elements/quick-note/extras/quick-note-results/QuickNoteResults.d.ts +30 -30
  197. package/elements/radio/Radio.d.ts +26 -26
  198. package/elements/radio/Radio.module.d.ts +2 -2
  199. package/elements/radio/Radio.scss +94 -0
  200. package/elements/search/SearchBox.d.ts +59 -59
  201. package/elements/search/SearchBox.module.d.ts +2 -2
  202. package/elements/search/SearchBox.scss +67 -0
  203. package/elements/select/Select.d.ts +62 -62
  204. package/elements/select/Select.module.d.ts +2 -2
  205. package/elements/select/Select.scss +226 -0
  206. package/elements/simple-table/activity-table-renderers.d.ts +4 -4
  207. package/elements/simple-table/cell-header.d.ts +62 -62
  208. package/elements/simple-table/cell.d.ts +73 -73
  209. package/elements/simple-table/interfaces.d.ts +81 -81
  210. package/elements/simple-table/pagination.d.ts +37 -37
  211. package/elements/simple-table/row.d.ts +20 -20
  212. package/elements/simple-table/simple-table.module.d.ts +2 -2
  213. package/elements/simple-table/sort.d.ts +20 -20
  214. package/elements/simple-table/state.d.ts +22 -22
  215. package/elements/simple-table/table-source.d.ts +62 -62
  216. package/elements/simple-table/table.d.ts +59 -59
  217. package/elements/simple-table/table.scss +344 -0
  218. package/elements/slider/Slider.d.ts +18 -18
  219. package/elements/slider/Slider.module.d.ts +2 -2
  220. package/elements/slider/Slider.scss +89 -0
  221. package/elements/stepper/step-header.component.d.ts +45 -45
  222. package/elements/stepper/step-header.component.scss +78 -0
  223. package/elements/stepper/step-label.component.d.ts +5 -5
  224. package/elements/stepper/step-status.component.d.ts +6 -6
  225. package/elements/stepper/stepper.animations.d.ts +6 -6
  226. package/elements/stepper/stepper.component.d.ts +39 -39
  227. package/elements/stepper/stepper.component.scss +200 -0
  228. package/elements/stepper/stepper.module.d.ts +2 -2
  229. package/elements/switch/Switch.d.ts +19 -19
  230. package/elements/switch/Switch.module.d.ts +2 -2
  231. package/elements/switch/Switch.scss +143 -0
  232. package/elements/tabbed-group-picker/TabbedGroupPicker.d.ts +122 -122
  233. package/elements/tabbed-group-picker/TabbedGroupPicker.module.d.ts +2 -2
  234. package/elements/tabbed-group-picker/TabbedGroupPicker.scss +186 -0
  235. package/elements/table/Table.d.ts +184 -184
  236. package/elements/table/Table.module.d.ts +2 -2
  237. package/elements/table/Table.scss +585 -0
  238. package/elements/table/extras/TableExtras.module.d.ts +2 -2
  239. package/elements/table/extras/base-renderer/BaseRenderer.d.ts +5 -5
  240. package/elements/table/extras/date-cell/DateCell.d.ts +8 -8
  241. package/elements/table/extras/dropdown-cell/DropdownCell.d.ts +17 -17
  242. package/elements/table/extras/dropdown-cell/DropdownCell.scss +58 -0
  243. package/elements/table/extras/keep-filter-focus/KeepFilterFocus.d.ts +6 -6
  244. package/elements/table/extras/pagination/Pagination.d.ts +39 -39
  245. package/elements/table/extras/pagination/Pagination.scss +62 -0
  246. package/elements/table/extras/percentage-cell/PercentageCell.d.ts +3 -3
  247. package/elements/table/extras/row-details/RowDetails.d.ts +12 -12
  248. package/elements/table/extras/table-actions/TableActions.d.ts +2 -2
  249. package/elements/table/extras/table-cell/TableCell.d.ts +18 -18
  250. package/elements/table/extras/table-filter/TableFilter.d.ts +13 -13
  251. package/elements/table/extras/table-footer/TableFooter.d.ts +2 -2
  252. package/elements/table/extras/table-header/TableHeader.d.ts +2 -2
  253. package/elements/table/extras/th-orderable/ThOrderable.d.ts +30 -30
  254. package/elements/table/extras/th-sortable/ThSortable.d.ts +7 -7
  255. package/elements/tabs/Tabs.d.ts +49 -49
  256. package/elements/tabs/Tabs.module.d.ts +2 -2
  257. package/elements/tabs/Tabs.scss +287 -0
  258. package/elements/tiles/Tiles.d.ts +30 -30
  259. package/elements/tiles/Tiles.module.d.ts +2 -2
  260. package/elements/tiles/Tiles.scss +68 -0
  261. package/elements/time-picker/TimePicker.d.ts +38 -38
  262. package/elements/time-picker/TimePicker.module.d.ts +2 -2
  263. package/elements/time-picker/TimePicker.scss +388 -0
  264. package/elements/time-picker/TimePickerInput.d.ts +52 -52
  265. package/elements/tip-well/TipWell.d.ts +23 -23
  266. package/elements/tip-well/TipWell.module.d.ts +2 -2
  267. package/elements/tip-well/TipWell.scss +31 -0
  268. package/elements/toast/Toast.d.ts +28 -28
  269. package/elements/toast/Toast.module.d.ts +2 -2
  270. package/elements/toast/Toast.scss +413 -0
  271. package/elements/toast/ToastService.d.ts +40 -40
  272. package/elements/tooltip/Tooltip.component.d.ts +12 -11
  273. package/elements/tooltip/Tooltip.directive.d.ts +35 -34
  274. package/elements/tooltip/Tooltip.module.d.ts +2 -2
  275. package/elements/tooltip/Tooltip.scss +216 -0
  276. package/elements/unless/Unless.d.ts +12 -12
  277. package/elements/unless/Unless.module.d.ts +2 -2
  278. package/elements/value/EntityList.d.ts +13 -13
  279. package/elements/value/Render.d.ts +66 -66
  280. package/elements/value/Value.d.ts +40 -40
  281. package/elements/value/Value.module.d.ts +2 -2
  282. package/elements/value/Value.scss +57 -0
  283. package/elements/value/Values.scss +57 -0
  284. package/esm2015/elements/ace-editor/AceEditor.js +126 -126
  285. package/esm2015/elements/ace-editor/AceEditor.module.js +15 -15
  286. package/esm2015/elements/button/Button.js +74 -74
  287. package/esm2015/elements/button/Button.module.js +15 -15
  288. package/esm2015/elements/calendar/Calendar.module.js +81 -81
  289. package/esm2015/elements/calendar/common/CalendarDateChange.js +60 -60
  290. package/esm2015/elements/calendar/common/EventTypeLegend.js +32 -32
  291. package/esm2015/elements/calendar/day/CalendarAllDayEvent.js +40 -40
  292. package/esm2015/elements/calendar/day/CalendarDayEvent.js +41 -41
  293. package/esm2015/elements/calendar/day/CalendarDayView.js +302 -302
  294. package/esm2015/elements/calendar/day/CalendarHourSegment.js +34 -34
  295. package/esm2015/elements/calendar/month/CalendarMonthDay.js +87 -87
  296. package/esm2015/elements/calendar/month/CalendarMonthHeader.js +55 -55
  297. package/esm2015/elements/calendar/month/CalendarMonthView.js +171 -171
  298. package/esm2015/elements/calendar/pipe/DayOfMonth.pipe.js +16 -16
  299. package/esm2015/elements/calendar/pipe/EndOfWeekDisplayPipe.pipe.js +19 -19
  300. package/esm2015/elements/calendar/pipe/Hours.pipe.js +16 -16
  301. package/esm2015/elements/calendar/pipe/Month.pipe.js +16 -16
  302. package/esm2015/elements/calendar/pipe/MonthDay.pipe.js +16 -16
  303. package/esm2015/elements/calendar/pipe/Weekday.pipe.js +16 -16
  304. package/esm2015/elements/calendar/pipe/Year.pipe.js +16 -16
  305. package/esm2015/elements/calendar/week/CalendarWeekEvent.js +38 -38
  306. package/esm2015/elements/calendar/week/CalendarWeekHeader.js +46 -46
  307. package/esm2015/elements/calendar/week/CalendarWeekView.js +311 -311
  308. package/esm2015/elements/card/Card.js +104 -104
  309. package/esm2015/elements/card/Card.module.js +18 -18
  310. package/esm2015/elements/category-dropdown/CategoryDropdown.js +159 -159
  311. package/esm2015/elements/category-dropdown/CategoryDropdown.module.js +17 -17
  312. package/esm2015/elements/chips/Chips.js +356 -356
  313. package/esm2015/elements/chips/Chips.module.js +18 -18
  314. package/esm2015/elements/chips/RowChips.js +86 -86
  315. package/esm2015/elements/ckeditor/CKEditor.js +237 -237
  316. package/esm2015/elements/ckeditor/CKEditor.module.js +16 -16
  317. package/esm2015/elements/common/common.module.js +13 -13
  318. package/esm2015/elements/common/novo-template/novo-template.directive.js +22 -22
  319. package/esm2015/elements/data-table/ListInteractionTypes.js +1 -1
  320. package/esm2015/elements/data-table/cell-headers/data-table-checkbox-header-cell.component.js +73 -73
  321. package/esm2015/elements/data-table/cell-headers/data-table-expand-header-cell.component.js +47 -47
  322. package/esm2015/elements/data-table/cell-headers/data-table-header-cell.component.js +501 -501
  323. package/esm2015/elements/data-table/cell-headers/data-table-header-cell.directive.js +35 -35
  324. package/esm2015/elements/data-table/cells/data-table-cell.component.js +62 -62
  325. package/esm2015/elements/data-table/cells/data-table-checkbox-cell.component.js +65 -65
  326. package/esm2015/elements/data-table/cells/data-table-expand-cell.component.js +52 -52
  327. package/esm2015/elements/data-table/data-table-clear-button.component.js +54 -54
  328. package/esm2015/elements/data-table/data-table-expand.directive.js +57 -57
  329. package/esm2015/elements/data-table/data-table.component.js +665 -665
  330. package/esm2015/elements/data-table/data-table.module.js +87 -87
  331. package/esm2015/elements/data-table/data-table.pipes.js +150 -150
  332. package/esm2015/elements/data-table/data-table.source.js +62 -62
  333. package/esm2015/elements/data-table/interfaces.js +1 -1
  334. package/esm2015/elements/data-table/pagination/data-table-pagination.component.js +249 -249
  335. package/esm2015/elements/data-table/rows/data-table-header-row.component.js +23 -23
  336. package/esm2015/elements/data-table/rows/data-table-row.component.js +23 -23
  337. package/esm2015/elements/data-table/services/data-table-filter-utils.js +35 -35
  338. package/esm2015/elements/data-table/services/remote-data-table.service.js +3 -3
  339. package/esm2015/elements/data-table/services/static-data-table.service.js +48 -48
  340. package/esm2015/elements/data-table/sort-filter/sort-filter.directive.js +57 -57
  341. package/esm2015/elements/data-table/state/data-table-state.service.js +116 -116
  342. package/esm2015/elements/date-picker/DatePicker.js +493 -493
  343. package/esm2015/elements/date-picker/DatePicker.module.js +20 -20
  344. package/esm2015/elements/date-picker/DatePickerInput.js +255 -255
  345. package/esm2015/elements/date-time-picker/DateTimePicker.js +195 -195
  346. package/esm2015/elements/date-time-picker/DateTimePicker.module.js +22 -22
  347. package/esm2015/elements/date-time-picker/DateTimePickerInput.js +151 -151
  348. package/esm2015/elements/dragula/Dragula.js +66 -66
  349. package/esm2015/elements/dragula/Dragula.module.js +13 -13
  350. package/esm2015/elements/dragula/DragulaService.js +117 -117
  351. package/esm2015/elements/dropdown/Dropdown.js +284 -284
  352. package/esm2015/elements/dropdown/Dropdown.module.js +15 -15
  353. package/esm2015/elements/expansion/accordion.js +42 -42
  354. package/esm2015/elements/expansion/expansion-animations.js +33 -33
  355. package/esm2015/elements/expansion/expansion-panel-content.js +19 -19
  356. package/esm2015/elements/expansion/expansion-panel-header.js +131 -131
  357. package/esm2015/elements/expansion/expansion-panel.js +141 -141
  358. package/esm2015/elements/expansion/expansion.module.js +34 -34
  359. package/esm2015/elements/form/Control.js +645 -645
  360. package/esm2015/elements/form/ControlGroup.js +264 -247
  361. package/esm2015/elements/form/ControlTemplates.js +162 -161
  362. package/esm2015/elements/form/DynamicForm.js +221 -221
  363. package/esm2015/elements/form/FieldInteractionApi.js +680 -680
  364. package/esm2015/elements/form/FieldInteractionApiTypes.js +1 -1
  365. package/esm2015/elements/form/FieldInteractionModals.js +63 -63
  366. package/esm2015/elements/form/Form.js +93 -93
  367. package/esm2015/elements/form/Form.module.js +86 -86
  368. package/esm2015/elements/form/FormControls.js +23 -23
  369. package/esm2015/elements/form/FormInterfaces.js +1 -1
  370. package/esm2015/elements/form/FormValidators.js +115 -115
  371. package/esm2015/elements/form/NovoFormControl.js +154 -154
  372. package/esm2015/elements/form/NovoFormGroup.js +32 -32
  373. package/esm2015/elements/form/controls/BaseControl.js +101 -101
  374. package/esm2015/elements/form/controls/ControlFactory.js +47 -47
  375. package/esm2015/elements/form/controls/ace-editor/AceEditorControl.js +9 -9
  376. package/esm2015/elements/form/controls/address/AddressControl.js +11 -11
  377. package/esm2015/elements/form/controls/check-list/CheckListControl.js +10 -10
  378. package/esm2015/elements/form/controls/checkbox/CheckboxControl.js +9 -9
  379. package/esm2015/elements/form/controls/custom/CustomControl.js +10 -10
  380. package/esm2015/elements/form/controls/date/DateControl.js +9 -9
  381. package/esm2015/elements/form/controls/date-time/DateTimeControl.js +9 -9
  382. package/esm2015/elements/form/controls/editor/EditorControl.js +10 -10
  383. package/esm2015/elements/form/controls/file/FileControl.js +12 -12
  384. package/esm2015/elements/form/controls/grouped/GroupedControl.js +7 -7
  385. package/esm2015/elements/form/controls/index.js +20 -20
  386. package/esm2015/elements/form/controls/native-select/NativeSelectControl.js +11 -11
  387. package/esm2015/elements/form/controls/picker/PickerControl.js +17 -17
  388. package/esm2015/elements/form/controls/quick-note/QuickNoteControl.js +11 -11
  389. package/esm2015/elements/form/controls/radio/RadioControl.js +11 -11
  390. package/esm2015/elements/form/controls/read-only/ReadOnlyControl.js +10 -10
  391. package/esm2015/elements/form/controls/select/SelectControl.js +12 -12
  392. package/esm2015/elements/form/controls/text-area/TextAreaControl.js +9 -9
  393. package/esm2015/elements/form/controls/textbox/TextBoxControl.js +44 -44
  394. package/esm2015/elements/form/controls/tiles/TilesControl.js +11 -11
  395. package/esm2015/elements/form/controls/time/TimeControl.js +9 -9
  396. package/esm2015/elements/form/extras/FormExtras.module.js +36 -36
  397. package/esm2015/elements/form/extras/address/Address.js +512 -512
  398. package/esm2015/elements/form/extras/checkbox/CheckList.js +107 -107
  399. package/esm2015/elements/form/extras/checkbox/Checkbox.js +80 -80
  400. package/esm2015/elements/form/extras/file/FileInput.js +320 -320
  401. package/esm2015/elements/form/extras/file/extras/file/File.js +40 -40
  402. package/esm2015/elements/header/Header.js +96 -96
  403. package/esm2015/elements/header/Header.module.js +14 -14
  404. package/esm2015/elements/icon/Icon.js +53 -53
  405. package/esm2015/elements/icon/Icon.module.js +11 -11
  406. package/esm2015/elements/list/List.js +132 -132
  407. package/esm2015/elements/list/List.module.js +33 -33
  408. package/esm2015/elements/loading/Loading.js +174 -174
  409. package/esm2015/elements/loading/Loading.module.js +15 -15
  410. package/esm2015/elements/modal/Modal.js +138 -138
  411. package/esm2015/elements/modal/Modal.module.js +16 -16
  412. package/esm2015/elements/modal/ModalService.js +31 -31
  413. package/esm2015/elements/multi-picker/MultiPicker.js +600 -600
  414. package/esm2015/elements/multi-picker/MultiPicker.module.js +18 -18
  415. package/esm2015/elements/overlay/Overlay.js +238 -238
  416. package/esm2015/elements/overlay/Overlay.module.js +18 -18
  417. package/esm2015/elements/picker/Picker.js +343 -343
  418. package/esm2015/elements/picker/Picker.module.js +50 -50
  419. package/esm2015/elements/picker/extras/base-picker-results/BasePickerResults.js +353 -353
  420. package/esm2015/elements/picker/extras/checklist-picker-results/ChecklistPickerResults.js +127 -127
  421. package/esm2015/elements/picker/extras/distributionlist-picker-results/DistributionListPickerResults.js +63 -63
  422. package/esm2015/elements/picker/extras/entity-picker-results/EntityPickerResults.js +221 -221
  423. package/esm2015/elements/picker/extras/grouped-multi-picker-results/GroupedMultiPickerResults.js +264 -264
  424. package/esm2015/elements/picker/extras/mixed-multi-picker-results/MixedMultiPickerResults.js +193 -193
  425. package/esm2015/elements/picker/extras/picker-results/PickerResults.js +60 -60
  426. package/esm2015/elements/picker/extras/skills-picker-results/SkillsSpecialtyPickerResults.js +79 -79
  427. package/esm2015/elements/picker/extras/workers-comp-codes-picker-results/WorkersCompCodesPickerResults.js +79 -79
  428. package/esm2015/elements/places/places.component.js +369 -369
  429. package/esm2015/elements/places/places.module.js +18 -18
  430. package/esm2015/elements/places/places.service.js +248 -248
  431. package/esm2015/elements/popover/PopOver.js +144 -144
  432. package/esm2015/elements/popover/PopOver.module.js +14 -14
  433. package/esm2015/elements/popover/PopOverContent.js +198 -198
  434. package/esm2015/elements/quick-note/QuickNote.js +572 -572
  435. package/esm2015/elements/quick-note/QuickNote.module.js +19 -19
  436. package/esm2015/elements/quick-note/extras/quick-note-results/QuickNoteResults.js +138 -138
  437. package/esm2015/elements/radio/Radio.js +89 -89
  438. package/esm2015/elements/radio/Radio.module.js +16 -16
  439. package/esm2015/elements/search/SearchBox.js +193 -193
  440. package/esm2015/elements/search/SearchBox.module.js +19 -19
  441. package/esm2015/elements/select/Select.js +363 -358
  442. package/esm2015/elements/select/Select.module.js +19 -18
  443. package/esm2015/elements/simple-table/activity-table-renderers.js +16 -16
  444. package/esm2015/elements/simple-table/cell-header.js +278 -278
  445. package/esm2015/elements/simple-table/cell.js +291 -291
  446. package/esm2015/elements/simple-table/interfaces.js +1 -1
  447. package/esm2015/elements/simple-table/pagination.js +175 -175
  448. package/esm2015/elements/simple-table/row.js +66 -66
  449. package/esm2015/elements/simple-table/simple-table.module.js +92 -92
  450. package/esm2015/elements/simple-table/sort.js +87 -87
  451. package/esm2015/elements/simple-table/state.js +38 -38
  452. package/esm2015/elements/simple-table/table-source.js +70 -70
  453. package/esm2015/elements/simple-table/table.js +238 -238
  454. package/esm2015/elements/slider/Slider.js +81 -81
  455. package/esm2015/elements/slider/Slider.module.js +16 -16
  456. package/esm2015/elements/stepper/step-header.component.js +90 -90
  457. package/esm2015/elements/stepper/step-label.component.js +16 -16
  458. package/esm2015/elements/stepper/step-status.component.js +26 -26
  459. package/esm2015/elements/stepper/stepper.animations.js +19 -19
  460. package/esm2015/elements/stepper/stepper.component.js +139 -139
  461. package/esm2015/elements/stepper/stepper.module.js +21 -21
  462. package/esm2015/elements/switch/Switch.js +88 -88
  463. package/esm2015/elements/switch/Switch.module.js +16 -16
  464. package/esm2015/elements/tabbed-group-picker/TabbedGroupPicker.js +261 -261
  465. package/esm2015/elements/tabbed-group-picker/TabbedGroupPicker.module.js +33 -33
  466. package/esm2015/elements/table/Table.js +940 -940
  467. package/esm2015/elements/table/Table.module.js +40 -40
  468. package/esm2015/elements/table/extras/TableExtras.module.js +59 -59
  469. package/esm2015/elements/table/extras/base-renderer/BaseRenderer.js +8 -8
  470. package/esm2015/elements/table/extras/date-cell/DateCell.js +31 -31
  471. package/esm2015/elements/table/extras/dropdown-cell/DropdownCell.js +44 -44
  472. package/esm2015/elements/table/extras/keep-filter-focus/KeepFilterFocus.js +19 -19
  473. package/esm2015/elements/table/extras/pagination/Pagination.js +125 -125
  474. package/esm2015/elements/table/extras/percentage-cell/PercentageCell.js +15 -15
  475. package/esm2015/elements/table/extras/row-details/RowDetails.js +44 -44
  476. package/esm2015/elements/table/extras/table-actions/TableActions.js +11 -11
  477. package/esm2015/elements/table/extras/table-cell/TableCell.js +82 -82
  478. package/esm2015/elements/table/extras/table-filter/TableFilter.js +59 -59
  479. package/esm2015/elements/table/extras/table-footer/TableFooter.js +11 -11
  480. package/esm2015/elements/table/extras/table-header/TableHeader.js +11 -11
  481. package/esm2015/elements/table/extras/th-orderable/ThOrderable.js +125 -125
  482. package/esm2015/elements/table/extras/th-sortable/ThSortable.js +37 -37
  483. package/esm2015/elements/tabs/Tabs.js +253 -253
  484. package/esm2015/elements/tabs/Tabs.module.js +31 -31
  485. package/esm2015/elements/tiles/Tiles.js +154 -154
  486. package/esm2015/elements/tiles/Tiles.module.js +16 -16
  487. package/esm2015/elements/time-picker/TimePicker.js +201 -201
  488. package/esm2015/elements/time-picker/TimePicker.module.js +21 -21
  489. package/esm2015/elements/time-picker/TimePickerInput.js +202 -202
  490. package/esm2015/elements/tip-well/TipWell.js +94 -94
  491. package/esm2015/elements/tip-well/TipWell.module.js +16 -16
  492. package/esm2015/elements/toast/Toast.js +111 -111
  493. package/esm2015/elements/toast/Toast.module.js +15 -15
  494. package/esm2015/elements/toast/ToastService.js +92 -92
  495. package/esm2015/elements/tooltip/Tooltip.component.js +37 -34
  496. package/esm2015/elements/tooltip/Tooltip.directive.js +189 -187
  497. package/esm2015/elements/tooltip/Tooltip.module.js +16 -16
  498. package/esm2015/elements/unless/Unless.js +56 -56
  499. package/esm2015/elements/unless/Unless.module.js +15 -15
  500. package/esm2015/elements/value/EntityList.js +84 -84
  501. package/esm2015/elements/value/Render.js +415 -415
  502. package/esm2015/elements/value/Value.js +160 -160
  503. package/esm2015/elements/value/Value.module.js +17 -17
  504. package/esm2015/index.js +221 -221
  505. package/esm2015/novo-elements.js +25 -25
  506. package/esm2015/novo-elements.module.js +128 -128
  507. package/esm2015/novo-elements.providers.js +50 -50
  508. package/esm2015/pipes/Pipes.module.js +15 -15
  509. package/esm2015/pipes/decode-uri/DecodeURI.js +18 -18
  510. package/esm2015/pipes/group-by/GroupBy.js +24 -24
  511. package/esm2015/pipes/plural/Plural.js +349 -349
  512. package/esm2015/services/data-provider/ArrayCollection.js +301 -301
  513. package/esm2015/services/data-provider/Collection.js +1 -1
  514. package/esm2015/services/data-provider/CollectionEvent.js +21 -21
  515. package/esm2015/services/data-provider/PagedArrayCollection.js +78 -78
  516. package/esm2015/services/data-provider/PagedCollection.js +1 -1
  517. package/esm2015/services/date-format/DateFormat.js +189 -189
  518. package/esm2015/services/global/global.service.js +18 -18
  519. package/esm2015/services/novo-label-service.js +279 -279
  520. package/esm2015/services/options/OptionsService.js +26 -26
  521. package/esm2015/services/security/Security.js +67 -67
  522. package/esm2015/services/storage/storage.service.js +16 -16
  523. package/esm2015/services/template/NovoTemplateService.js +33 -33
  524. package/esm2015/utils/Helpers.js +395 -395
  525. package/esm2015/utils/app-bridge/AppBridge.js +710 -710
  526. package/esm2015/utils/calendar-utils/CalendarUtils.js +321 -321
  527. package/esm2015/utils/component-utils/ComponentUtils.js +20 -20
  528. package/esm2015/utils/countries/Countries.js +17538 -17538
  529. package/esm2015/utils/deferred/Deferred.js +14 -14
  530. package/esm2015/utils/form-utils/FormUtils.js +793 -788
  531. package/esm2015/utils/key-codes/KeyCodes.js +95 -95
  532. package/esm2015/utils/notifier/notifier.util.js +10 -10
  533. package/esm2015/utils/outside-click/OutsideClick.js +60 -60
  534. package/fesm2015/novo-elements.js +43328 -43295
  535. package/fesm2015/novo-elements.js.map +1 -1
  536. package/index.d.ts +225 -225
  537. package/novo-elements.d.ts +24 -24
  538. package/novo-elements.metadata.json +1 -1
  539. package/novo-elements.module.d.ts +2 -2
  540. package/novo-elements.providers.d.ts +5 -5
  541. package/novo-elements.scss +110 -0
  542. package/package.json +1 -1
  543. package/pipes/Pipes.module.d.ts +2 -2
  544. package/pipes/decode-uri/DecodeURI.d.ts +4 -4
  545. package/pipes/group-by/GroupBy.d.ts +4 -4
  546. package/pipes/plural/Plural.d.ts +4 -4
  547. package/services/data-provider/ArrayCollection.d.ts +178 -178
  548. package/services/data-provider/Collection.d.ts +93 -93
  549. package/services/data-provider/CollectionEvent.d.ts +17 -17
  550. package/services/data-provider/PagedArrayCollection.d.ts +18 -18
  551. package/services/data-provider/PagedCollection.d.ts +15 -15
  552. package/services/date-format/DateFormat.d.ts +13 -13
  553. package/services/global/global.service.d.ts +11 -11
  554. package/services/novo-label-service.d.ts +142 -142
  555. package/services/options/OptionsService.d.ts +9 -9
  556. package/services/security/Security.d.ts +19 -19
  557. package/services/storage/storage.service.d.ts +5 -5
  558. package/services/template/NovoTemplateService.d.ts +7 -7
  559. package/styles/content/typography.scss +200 -0
  560. package/styles/global/cdk.scss +106 -0
  561. package/styles/global/flex-grid.scss +156 -0
  562. package/styles/global/functions.scss +174 -0
  563. package/styles/global/include-media.scss +578 -0
  564. package/styles/global/layout.scss +3 -0
  565. package/styles/global/reset.scss +451 -0
  566. package/styles/global/variables.scss +324 -0
  567. package/utils/Helpers.d.ts +68 -68
  568. package/utils/app-bridge/AppBridge.d.ts +178 -178
  569. package/utils/calendar-utils/CalendarUtils.d.ts +150 -150
  570. package/utils/component-utils/ComponentUtils.d.ts +6 -6
  571. package/utils/countries/Countries.d.ts +51 -51
  572. package/utils/deferred/Deferred.d.ts +4 -4
  573. package/utils/form-utils/FormUtils.d.ts +77 -77
  574. package/utils/key-codes/KeyCodes.d.ts +93 -93
  575. package/utils/notifier/notifier.util.d.ts +1 -1
  576. package/utils/outside-click/OutsideClick.d.ts +24 -24
@@ -1,321 +1,321 @@
1
- import * as dateFns from 'date-fns';
2
- const WEEKEND_DAY_NUMBERS = [0, 6];
3
- const DAYS_IN_WEEK = 7;
4
- const HOURS_IN_DAY = 24;
5
- const MINUTES_IN_HOUR = 60;
6
- export var CalendarEventResponse;
7
- (function (CalendarEventResponse) {
8
- CalendarEventResponse[CalendarEventResponse["Maybe"] = 0] = "Maybe";
9
- CalendarEventResponse[CalendarEventResponse["Accepted"] = 1] = "Accepted";
10
- CalendarEventResponse[CalendarEventResponse["Rejected"] = 2] = "Rejected";
11
- })(CalendarEventResponse || (CalendarEventResponse = {}));
12
- function getExcludedDays({ startDate, days, excluded }) {
13
- if (excluded.length < 1) {
14
- return 0;
15
- }
16
- let day = startDate.getDay();
17
- let reduce = 0;
18
- for (let i = 0; i < days; i++) {
19
- if (day === DAYS_IN_WEEK) {
20
- day = 0;
21
- }
22
- if (excluded.some((e) => e === day)) {
23
- reduce++;
24
- }
25
- day++;
26
- }
27
- return reduce;
28
- }
29
- function getWeekViewEventSpan({ event, offset, startOfWeek, excluded, }) {
30
- const begin = event.start < startOfWeek ? startOfWeek : event.start;
31
- let span = 1;
32
- if (event.end) {
33
- span = dateFns.differenceInDays(dateFns.addMinutes(dateFns.endOfDay(event.end), 1), dateFns.startOfDay(begin));
34
- }
35
- const totalLength = offset + span;
36
- if (totalLength > DAYS_IN_WEEK) {
37
- span = DAYS_IN_WEEK - offset;
38
- }
39
- return span - getExcludedDays({ startDate: begin, days: span, excluded });
40
- }
41
- export function getWeekViewEventOffset({ event, startOfWeek, excluded = [], }) {
42
- if (event.start < startOfWeek) {
43
- return 0;
44
- }
45
- const distance = dateFns.differenceInDays(event.start, startOfWeek);
46
- return distance - getExcludedDays({ startDate: startOfWeek, days: distance, excluded });
47
- }
48
- function isEventIsPeriod({ event, periodStart, periodEnd }) {
49
- const eventStart = event.start;
50
- const eventEnd = event.end || event.start;
51
- if (eventStart > periodStart && eventStart < periodEnd) {
52
- return true;
53
- }
54
- if (eventEnd > periodStart && eventEnd < periodEnd) {
55
- return true;
56
- }
57
- if (eventStart < periodStart && eventEnd > periodEnd) {
58
- return true;
59
- }
60
- if (dateFns.isSameSecond(eventStart, periodStart) || dateFns.isSameSecond(eventStart, periodEnd)) {
61
- return true;
62
- }
63
- if (dateFns.isSameSecond(eventEnd, periodStart) || dateFns.isSameSecond(eventEnd, periodEnd)) {
64
- return true;
65
- }
66
- return false;
67
- }
68
- function getEventsInPeriod({ events, periodStart, periodEnd }) {
69
- return events.filter((event) => isEventIsPeriod({ event, periodStart, periodEnd }));
70
- }
71
- function getEventsInTimeRange(events, dayStart, dayEnd) {
72
- return events.filter((event) => {
73
- const eventStart = event.start;
74
- const eventEnd = event.end || eventStart;
75
- const startOfView = dateFns.setMinutes(dateFns.setHours(dateFns.startOfDay(eventStart), dayStart.hour), dayStart.minute);
76
- const endOfView = dateFns.setMinutes(dateFns.setHours(dateFns.startOfMinute(eventStart), dayEnd.hour), dayEnd.minute);
77
- return dateFns.isAfter(eventEnd, startOfView) && dateFns.isBefore(eventStart, endOfView);
78
- });
79
- }
80
- function getWeekDay({ date }) {
81
- const today = dateFns.startOfDay(new Date());
82
- return {
83
- date,
84
- isPast: date < today,
85
- isToday: dateFns.isSameDay(date, today),
86
- isFuture: date > today,
87
- isWeekend: WEEKEND_DAY_NUMBERS.indexOf(dateFns.getDay(date)) > -1,
88
- };
89
- }
90
- export function getWeekViewHeader({ viewDate, weekStartsOn, excluded = [], }) {
91
- const start = dateFns.startOfWeek(viewDate, { weekStartsOn });
92
- const days = [];
93
- for (let i = 0; i < DAYS_IN_WEEK; i++) {
94
- const date = dateFns.addDays(start, i);
95
- if (!excluded.some((e) => date.getDay() === e)) {
96
- days.push(getWeekDay({ date }));
97
- }
98
- }
99
- return days;
100
- }
101
- export function getWeekView({ events = [], viewDate, weekStartsOn, excluded = [], hourSegments, segmentHeight, dayStart, dayEnd, }) {
102
- if (!events) {
103
- events = [];
104
- }
105
- const startOfViewWeek = dateFns.startOfWeek(viewDate, { weekStartsOn });
106
- const endOfViewWeek = dateFns.endOfWeek(viewDate, { weekStartsOn });
107
- const maxRange = DAYS_IN_WEEK - excluded.length;
108
- const eventsMapped = getEventsInTimeRange(getEventsInPeriod({ events, periodStart: startOfViewWeek, periodEnd: endOfViewWeek }), dayStart, dayEnd)
109
- .map((event) => {
110
- const offset = getWeekViewEventOffset({ event, startOfWeek: startOfViewWeek, excluded });
111
- const span = 1; // getWeekViewEventSpan({ event, offset, startOfWeek: startOfViewWeek, excluded });
112
- return { event, offset, span };
113
- })
114
- .filter((e) => e.offset < maxRange)
115
- .filter((e) => e.span > 0)
116
- .map((entry) => ({
117
- event: entry.event,
118
- offset: entry.offset,
119
- span: entry.span,
120
- startsBeforeWeek: entry.event.start < startOfViewWeek,
121
- endsAfterWeek: (entry.event.end || entry.event.start) > endOfViewWeek,
122
- top: 0,
123
- }))
124
- .sort((itemA, itemB) => {
125
- const startSecondsDiff = dateFns.differenceInSeconds(itemA.event.start, itemB.event.start);
126
- if (startSecondsDiff === 0) {
127
- return dateFns.differenceInSeconds(itemB.event.end || itemB.event.start, itemA.event.end || itemA.event.start);
128
- }
129
- return startSecondsDiff;
130
- })
131
- .map((entry) => {
132
- const startOfView = dateFns.setMinutes(dateFns.setHours(dateFns.startOfDay(entry.event.start), dayStart.hour), dayStart.minute);
133
- const endOfView = dateFns.setMinutes(dateFns.setHours(dateFns.startOfMinute(dateFns.endOfDay(entry.event.start)), dayEnd.hour), dayEnd.minute);
134
- const eventStart = entry.event.start;
135
- const eventEnd = entry.event.end || eventStart;
136
- const hourHeightModifier = (hourSegments * segmentHeight) / MINUTES_IN_HOUR;
137
- if (eventStart > startOfView) {
138
- entry.top += dateFns.differenceInMinutes(eventStart, startOfView);
139
- }
140
- entry.top *= hourHeightModifier;
141
- const startsBeforeDay = eventStart < startOfView;
142
- const endsAfterDay = eventEnd > endOfView;
143
- const startDate = startsBeforeDay ? startOfView : eventStart;
144
- const endDate = endsAfterDay ? endOfView : eventEnd;
145
- let height = dateFns.differenceInMinutes(endDate, startDate);
146
- if (!entry.event.end) {
147
- height = segmentHeight;
148
- }
149
- else {
150
- height *= hourHeightModifier;
151
- }
152
- entry.height = height;
153
- return entry;
154
- });
155
- const eventRows = [];
156
- const allocatedEvents = [];
157
- eventsMapped.forEach((event, index) => {
158
- if (allocatedEvents.indexOf(event) === -1) {
159
- allocatedEvents.push(event);
160
- const otherRowEvents = eventsMapped.slice(index + 1).filter((nextEvent) => {
161
- return nextEvent.top === event.top && nextEvent.offset === event.offset;
162
- });
163
- if (otherRowEvents.length > 0) {
164
- const totalEventsForRow = otherRowEvents.length + 1;
165
- event.span = 1 / totalEventsForRow;
166
- let nextOffset = event.span + event.offset;
167
- otherRowEvents.forEach((nextEvent) => {
168
- nextEvent.offset = nextOffset;
169
- nextEvent.span = event.span;
170
- nextOffset = nextEvent.span + nextEvent.offset;
171
- });
172
- allocatedEvents.push(...otherRowEvents);
173
- }
174
- eventRows.push({
175
- row: [event, ...otherRowEvents],
176
- });
177
- }
178
- });
179
- return eventRows;
180
- }
181
- export function getMonthView({ events = [], viewDate, weekStartsOn, excluded = [], }) {
182
- if (!events) {
183
- events = [];
184
- }
185
- const start = dateFns.startOfWeek(dateFns.startOfMonth(viewDate), { weekStartsOn });
186
- const end = dateFns.endOfWeek(dateFns.endOfMonth(viewDate), { weekStartsOn });
187
- const eventsInMonth = getEventsInPeriod({
188
- events,
189
- periodStart: start,
190
- periodEnd: end,
191
- });
192
- const days = [];
193
- for (let i = 0; i < dateFns.differenceInDays(end, start) + 1; i++) {
194
- const date = dateFns.addDays(start, i);
195
- if (!excluded.some((e) => date.getDay() === e)) {
196
- const day = getWeekDay({ date });
197
- const calEvents = getEventsInPeriod({
198
- events: eventsInMonth,
199
- periodStart: dateFns.startOfDay(date),
200
- periodEnd: dateFns.endOfDay(date),
201
- });
202
- day.inMonth = dateFns.isSameMonth(date, viewDate);
203
- day.events = calEvents;
204
- day.badgeTotal = calEvents.length;
205
- days.push(day);
206
- }
207
- }
208
- const totalDaysVisibleInWeek = DAYS_IN_WEEK - excluded.length;
209
- const rows = Math.floor(days.length / totalDaysVisibleInWeek);
210
- const rowOffsets = [];
211
- for (let i = 0; i < rows; i++) {
212
- rowOffsets.push(i * totalDaysVisibleInWeek);
213
- }
214
- return {
215
- rowOffsets,
216
- totalDaysVisibleInWeek,
217
- days,
218
- };
219
- }
220
- export function getDayView({ events = [], viewDate, hourSegments, dayStart, dayEnd, eventWidth, segmentHeight }) {
221
- if (!events) {
222
- events = [];
223
- }
224
- const startOfView = dateFns.setMinutes(dateFns.setHours(dateFns.startOfDay(viewDate), dayStart.hour), dayStart.minute);
225
- const endOfView = dateFns.setMinutes(dateFns.setHours(dateFns.startOfMinute(dateFns.endOfDay(viewDate)), dayEnd.hour), dayEnd.minute);
226
- const previousDayEvents = [];
227
- const dayViewEvents = getEventsInTimeRange(getEventsInPeriod({
228
- events: events.filter((event) => !event.allDay),
229
- periodStart: startOfView,
230
- periodEnd: endOfView,
231
- }), dayStart, dayEnd)
232
- .sort((eventA, eventB) => {
233
- return eventA.start.valueOf() - eventB.start.valueOf();
234
- })
235
- .map((event) => {
236
- const eventStart = event.start;
237
- const eventEnd = event.end || eventStart;
238
- const startsBeforeDay = eventStart < startOfView;
239
- const endsAfterDay = eventEnd > endOfView;
240
- const hourHeightModifier = (hourSegments * segmentHeight) / MINUTES_IN_HOUR;
241
- let top = 0;
242
- if (eventStart > startOfView) {
243
- top += dateFns.differenceInMinutes(eventStart, startOfView);
244
- }
245
- top *= hourHeightModifier;
246
- const startDate = startsBeforeDay ? startOfView : eventStart;
247
- const endDate = endsAfterDay ? endOfView : eventEnd;
248
- let height = dateFns.differenceInMinutes(endDate, startDate);
249
- if (!event.end) {
250
- height = segmentHeight;
251
- }
252
- else {
253
- height *= hourHeightModifier;
254
- }
255
- const bottom = top + height;
256
- const overlappingPreviousEvents = previousDayEvents.filter((previousEvent) => {
257
- const previousEventTop = previousEvent.top;
258
- const previousEventBottom = previousEvent.top + previousEvent.height;
259
- if (top < previousEventBottom && previousEventBottom < bottom) {
260
- return true;
261
- }
262
- else if (previousEventTop <= top && bottom <= previousEventBottom) {
263
- return true;
264
- }
265
- return false;
266
- });
267
- let left = 0;
268
- while (overlappingPreviousEvents.some((previousEvent) => previousEvent.left === left)) {
269
- left += eventWidth;
270
- }
271
- const dayEvent = {
272
- event,
273
- height,
274
- width: eventWidth,
275
- top,
276
- left,
277
- startsBeforeDay,
278
- endsAfterDay,
279
- };
280
- if (height > 0) {
281
- previousDayEvents.push(dayEvent);
282
- }
283
- return dayEvent;
284
- })
285
- .filter((dayEvent) => dayEvent.height > 0);
286
- const width = Math.max(...dayViewEvents.map((event) => event.left + event.width));
287
- const allDayEvents = getEventsInPeriod({
288
- events: events.filter((event) => event.allDay),
289
- periodStart: dateFns.startOfDay(startOfView),
290
- periodEnd: dateFns.endOfDay(endOfView),
291
- });
292
- return {
293
- events: dayViewEvents,
294
- width,
295
- allDayEvents,
296
- };
297
- }
298
- export function getDayViewHourGrid({ viewDate, hourSegments, dayStart, dayEnd, }) {
299
- const hours = [];
300
- const startOfView = dateFns.setMinutes(dateFns.setHours(dateFns.startOfDay(viewDate), dayStart.hour), dayStart.minute);
301
- const endOfView = dateFns.setMinutes(dateFns.setHours(dateFns.startOfMinute(dateFns.endOfDay(viewDate)), dayEnd.hour), dayEnd.minute);
302
- const segmentDuration = MINUTES_IN_HOUR / hourSegments;
303
- const startOfViewDay = dateFns.startOfDay(viewDate);
304
- for (let i = 0; i < HOURS_IN_DAY; i++) {
305
- const segments = [];
306
- for (let j = 0; j < hourSegments; j++) {
307
- const date = dateFns.addMinutes(dateFns.addHours(startOfViewDay, i), j * segmentDuration);
308
- if (date >= startOfView && date < endOfView) {
309
- segments.push({
310
- date,
311
- isStart: j === 0,
312
- });
313
- }
314
- }
315
- if (segments.length > 0) {
316
- hours.push({ segments });
317
- }
318
- }
319
- return hours;
320
- }
321
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2FsZW5kYXJVdGlscy5qcyIsInNvdXJjZVJvb3QiOiJDOi9Vc2Vycy9jaGFybGVzLmJhcm5lcy9Eb2N1bWVudHMvZGV2L25vdm8tZWxlbWVudHMvcHJvamVjdHMvbm92by1lbGVtZW50cy9zcmMvIiwic291cmNlcyI6WyJ1dGlscy9jYWxlbmRhci11dGlscy9DYWxlbmRhclV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sVUFBVSxDQUFDO0FBRXBDLE1BQU0sbUJBQW1CLEdBQWEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDN0MsTUFBTSxZQUFZLEdBQVcsQ0FBQyxDQUFDO0FBQy9CLE1BQU0sWUFBWSxHQUFXLEVBQUUsQ0FBQztBQUNoQyxNQUFNLGVBQWUsR0FBVyxFQUFFLENBQUM7QUFFbkMsTUFBTSxDQUFOLElBQVkscUJBSVg7QUFKRCxXQUFZLHFCQUFxQjtJQUMvQixtRUFBSyxDQUFBO0lBQ0wseUVBQVEsQ0FBQTtJQUNSLHlFQUFRLENBQUE7QUFDVixDQUFDLEVBSlcscUJBQXFCLEtBQXJCLHFCQUFxQixRQUloQztBQWdJRCxTQUFTLGVBQWUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUF5RDtJQUMzRyxJQUFJLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1FBQ3ZCLE9BQU8sQ0FBQyxDQUFDO0tBQ1Y7SUFDRCxJQUFJLEdBQUcsR0FBVyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDckMsSUFBSSxNQUFNLEdBQVcsQ0FBQyxDQUFDO0lBQ3ZCLEtBQUssSUFBSSxDQUFDLEdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDckMsSUFBSSxHQUFHLEtBQUssWUFBWSxFQUFFO1lBQ3hCLEdBQUcsR0FBRyxDQUFDLENBQUM7U0FDVDtRQUNELElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFB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QztvQkFDWixJQUFJO29CQUNKLE9BQU8sRUFBRSxDQUFDLEtBQUssQ0FBQztpQkFDakIsQ0FBQyxDQUFDO2FBQ0o7U0FDRjtRQUNELElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDdkIsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7U0FDMUI7S0FDRjtJQUVELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGRhdGVGbnMgZnJvbSAnZGF0ZS1mbnMnO1xyXG5cclxuY29uc3QgV0VFS0VORF9EQVlfTlVNQkVSUzogbnVtYmVyW10gPSBbMCwgNl07XHJcbmNvbnN0IERBWVNfSU5fV0VFSzogbnVtYmVyID0gNztcclxuY29uc3QgSE9VUlNfSU5fREFZOiBudW1iZXIgPSAyNDtcclxuY29uc3QgTUlOVVRFU19JTl9IT1VSOiBudW1iZXIgPSA2MDtcclxuXHJcbmV4cG9ydCBlbnVtIENhbGVuZGFyRXZlbnRSZXNwb25zZSB7XHJcbiAgTWF5YmUsXHJcbiAgQWNjZXB0ZWQsXHJcbiAgUmVqZWN0ZWQsXHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQ2FsZW5kYXJFdmVudFRpbWVzQ2hhbmdlZEV2ZW50IHtcclxuICBldmVudDogQ2FsZW5kYXJFdmVudDtcclxuICBuZXdTdGFydDogRGF0ZTtcclxuICBuZXdFbmQ/OiBEYXRlO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFdlZWtEYXkge1xyXG4gIGRhdGU6IERhdGU7XHJcbiAgaXNQYXN0OiBib29sZWFuO1xyXG4gIGlzVG9kYXk6IGJvb2xlYW47XHJcbiAgaXNGdXR1cmU6IGJvb2xlYW47XHJcbiAgaXNXZWVrZW5kOiBib29sZWFuO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEV2ZW50Q29sb3Ige1xyXG4gIHByaW1hcnk6IHN0cmluZztcclxuICBzZWNvbmRhcnk6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBFdmVudEFjdGlvbiB7XHJcbiAgbGFiZWw6IHN0cmluZztcclxuICBjc3NDbGFzcz86IHN0cmluZztcclxuICBvbkNsaWNrKHsgZXZlbnQgfTogeyBldmVudDogQ2FsZW5kYXJFdmVudCB9KTogYW55O1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIENhbGVuZGFyRXZlbnQge1xyXG4gIGlkPzogbnVtYmVyO1xyXG4gIHN0YXJ0OiBEYXRlO1xyXG4gIGVuZD86IERhdGU7XHJcbiAgdGl0bGU6IHN0cmluZztcclxuICBkZXNjcmlwdGlvbj86IHN0cmluZztcclxuICBjb2xvcjogRXZlbnRDb2xvcjtcclxuICB0eXBlPzogc3RyaW5nO1xyXG4gIHJlc3BvbnNlPzogQ2FsZW5kYXJFdmVudFJlc3BvbnNlO1xyXG4gIGFjdGlvbnM/OiBFdmVudEFjdGlvbltdO1xyXG4gIGFsbERheT86IGJvb2xlYW47XHJcbiAgY3NzQ2xhc3M/OiBzdHJpbmc7XHJcbiAgcmVzaXphYmxlPzoge1xyXG4gICAgYmVmb3JlU3RhcnQ/OiBib29sZWFuO1xyXG4gICAgYWZ0ZXJFbmQ/OiBib29sZWFuO1xyXG4gIH07XHJcbiAgZHJhZ2dhYmxlPzogYm9vbGVhbjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBXZWVrVmlld0V2ZW50IHtcclxuICBldmVudDogQ2FsZW5kYXJFdmVudDtcclxuICBvZmZzZXQ6IG51bWJlcjtcclxuICBzcGFuOiBudW1iZXI7XHJcbiAgc3RhcnRzQmVmb3JlV2VlazogYm9vbGVhbjtcclxuICBlbmRzQWZ0ZXJXZWVrOiBib29sZWFuO1xyXG4gIHRvcD86IG51bWJlcjtcclxuICBoZWlnaHQ/OiBudW1iZXI7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgV2Vla1ZpZXdFdmVudFJvdyB7XHJcbiAgcm93OiBXZWVrVmlld0V2ZW50W107XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgTW9udGhWaWV3RGF5IGV4dGVuZHMgV2Vla0RheSB7XHJcbiAgaW5Nb250aDogYm9vbGVhbjtcclxuICBldmVudHM6IENhbGVuZGFyRXZlbnRbXTtcclxuICBiYWNrZ3JvdW5kQ29sb3I/OiBzdHJpbmc7XHJcbiAgY3NzQ2xhc3M/OiBzdHJpbmc7XHJcbiAgYmFkZ2VUb3RhbDogbnVtYmVyO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIE1vbnRoVmlldyB7XHJcbiAgcm93T2Zmc2V0czogbnVtYmVyW107XHJcbiAgZGF5czogTW9udGhWaWV3RGF5W107XHJcbiAgdG90YWxEYXlzVmlzaWJsZUluV2VlazogbnVtYmVyO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIERheVZpZXdFdmVudCB7XHJcbiAgZXZlbnQ6IENhbGVuZGFyRXZlbnQ7XHJcbiAgaGVpZ2h0OiBudW1iZXI7XHJcbiAgd2lkdGg6IG51bWJlcjtcclxuICB0b3A6IG51bWJlcjtcclxuICBsZWZ0OiBudW1iZXI7XHJcbiAgc3RhcnRzQmVmb3JlRGF5OiBib29sZWFuO1xyXG4gIGVuZHNBZnRlckRheTogYm9vbGVhbjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBEYXlWaWV3IHtcclxuICBldmVudHM6IERheVZpZXdFdmVudFtdO1xyXG4gIHdpZHRoOiBudW1iZXI7XHJcbiAgYWxsRGF5RXZlbnRzOiBDYWxlbmRhckV2ZW50W107XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgRGF5Vmlld0hvdXJTZWdtZW50IHtcclxuICBpc1N0YXJ0OiBib29sZWFuO1xyXG4gIGRhdGU6IERhdGU7XHJcbiAgY3NzQ2xhc3M/OiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgRGF5Vmlld0hvdXIge1xyXG4gIHNlZ21lbnRzOiBEYXlWaWV3SG91clNlZ21lbnRbXTtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJc0V2ZW50SW5QZXJpb2RBcmdzIHtcclxuICBldmVudDogQ2FsZW5kYXJFdmVudDtcclxuICBwZXJpb2RTdGFydDogRGF0ZTtcclxuICBwZXJpb2RFbmQ6IERhdGU7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgR2V0RXZlbnRzSW5QZXJpb2RBcmdzIHtcclxuICBldmVudHM6IENhbGVuZGFyRXZlbnRbXTtcclxuICBwZXJpb2RTdGFydDogRGF0ZTtcclxuICBwZXJpb2RFbmQ6IERhdGU7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgR2V0RGF5Vmlld0FyZ3Mge1xyXG4gIGV2ZW50cz86IENhbGVuZGFyRXZlbnRbXTtcclxuICB2aWV3RGF0ZTogRGF0ZTtcclxuICBob3VyU2VnbWVudHM6IG51bWJlcjtcclxuICBkYXlTdGFydDoge1xyXG4gICAgaG91cjogbnVtYmVyO1xyXG4gICAgbWludXRlOiBudW1iZXI7XHJcbiAgfTtcclxuICBkYXlFbmQ6IHtcclxuICAgIGhvdXI6IG51bWJlcjtcclxuICAgIG1pbnV0ZTogbnVtYmVyO1xyXG4gIH07XHJcbiAgZXZlbnRXaWR0aDogbnVtYmVyO1xyXG4gIHNlZ21lbnRIZWlnaHQ6IG51bWJlcjtcclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0RXhjbHVkZWREYXlzKHsgc3RhcnREYXRlLCBkYXlzLCBleGNsdWRlZCB9OiB7IHN0YXJ0RGF0ZTogRGF0ZTsgZGF5czogbnVtYmVyOyBleGNsdWRlZDogbnVtYmVyW10gfSk6IG51bWJlciB7XHJcbiAgaWYgKGV4Y2x1ZGVkLmxlbmd0aCA8IDEpIHtcclxuICAgIHJldHVybiAwO1xyXG4gIH1cclxuICBsZXQgZGF5OiBudW1iZXIgPSBzdGFydERhdGUuZ2V0RGF5KCk7XHJcbiAgbGV0IHJlZHVjZTogbnVtYmVyID0gMDtcclxuICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgZGF5czsgaSsrKSB7XHJcbiAgICBpZiAoZGF5ID09PSBEQVlTX0lOX1dFRUspIHtcclxuICAgICAgZGF5ID0gMDtcclxuICAgIH1cclxuICAgIGlmIChleGNsdWRlZC5zb21lKChlKSA9PiBlID09PSBkYXkpKSB7XHJcbiAgICAgIHJlZHVjZSsrO1xyXG4gICAgfVxyXG4gICAgZGF5Kys7XHJcbiAgfVxyXG4gIHJldHVybiByZWR1Y2U7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdldFdlZWtWaWV3RXZlbnRTcGFuKHtcclxuICBldmVudCxcclxuICBvZmZzZXQsXHJcbiAgc3RhcnRPZldlZWssXHJcbiAgZXhjbHVkZWQsXHJcbn06IHtcclxuICBldmVudDogQ2FsZW5kYXJFdmVudDtcclxuICBvZmZzZXQ6IG51bWJlcjtcclxuICBzdGFydE9mV2VlazogRGF0ZTtcclxuICBleGNsdWRlZDogbnVtYmVyW107XHJcbn0pOiBudW1iZXIge1xyXG4gIGNvbnN0IGJlZ2luOiBEYXRlID0gZXZlbnQuc3RhcnQgPCBzdGFydE9mV2VlayA/IHN0YXJ0T2ZXZWVrIDogZXZlbnQuc3RhcnQ7XHJcbiAgbGV0IHNwYW46IG51bWJlciA9IDE7XHJcbiAgaWYgKGV2ZW50LmVuZCkge1xyXG4gICAgc3BhbiA9IGRhdGVGbnMuZGlmZmVyZW5jZUluRGF5cyhkYXRlRm5zLmFkZE1pbnV0ZXMoZGF0ZUZucy5lbmRPZkRheShldmVudC5lbmQpLCAxKSwgZGF0ZUZucy5zdGFydE9mRGF5KGJlZ2luKSk7XHJcbiAgfVxyXG4gIGNvbnN0IHRvdGFsTGVuZ3RoOiBudW1iZXIgPSBvZmZzZXQgKyBzcGFuO1xyXG4gIGlmICh0b3RhbExlbmd0aCA+IERBWVNfSU5fV0VFSykge1xyXG4gICAgc3BhbiA9IERBWVNfSU5fV0VFSyAtIG9mZnNldDtcclxuICB9XHJcbiAgcmV0dXJuIHNwYW4gLSBnZXRFeGNsdWRlZERheXMoeyBzdGFydERhdGU6IGJlZ2luLCBkYXlzOiBzcGFuLCBleGNsdWRlZCB9KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFdlZWtWaWV3RXZlbnRPZmZzZXQoe1xyXG4gIGV2ZW50LFxyXG4gIHN0YXJ0T2ZXZWVrLFxyXG4gIGV4Y2x1ZGVkID0gW10sXHJcbn06IHtcclxuICBldmVudDogQ2FsZW5kYXJFdmVudDtcclxuICBzdGFydE9mV2VlazogRGF0ZTtcclxuICBleGNsdWRlZD86IG51bWJlcltdO1xyXG59KTogbnVtYmVyIHtcclxuICBpZiAoZXZlbnQuc3RhcnQgPCBzdGFydE9mV2Vlaykge1xyXG4gICAgcmV0dXJuIDA7XHJcbiAgfVxyXG4gIGNvbnN0IGRpc3RhbmNlOiBudW1iZXIgPSBkYXRlRm5zLmRpZmZlcmVuY2VJbkRheXMoZXZlbnQuc3RhcnQsIHN0YXJ0T2ZXZWVrKTtcclxuICByZXR1cm4gZGlzdGFuY2UgLSBnZXRFeGNsdWRlZERheXMoeyBzdGFydERhdGU6IHN0YXJ0T2ZXZWVrLCBkYXlzOiBkaXN0YW5jZSwgZXhjbHVkZWQgfSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGlzRXZlbnRJc1BlcmlvZCh7IGV2ZW50LCBwZXJpb2RTdGFydCwgcGVyaW9kRW5kIH06IElzRXZlbnRJblBlcmlvZEFyZ3MpOiBib29sZWFuIHtcclxuICBjb25zdCBldmVudFN0YXJ0OiBEYXRlID0gZXZlbnQuc3RhcnQ7XHJcbiAgY29uc3QgZXZlbnRFbmQ6IERhdGUgPSBldmVudC5lbmQgfHwgZXZlbnQuc3RhcnQ7XHJcblxyXG4gIGlmIChldmVudFN0YXJ0ID4gcGVyaW9kU3RhcnQgJiYgZXZlbnRTdGFydCA8IHBlcmlvZEVuZCkge1xyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBpZiAoZXZlbnRFbmQgPiBwZXJpb2RTdGFydCAmJiBldmVudEVuZCA8IHBlcmlvZEVuZCkge1xyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBpZiAoZXZlbnRTdGFydCA8IHBlcmlvZFN0YXJ0ICYmIGV2ZW50RW5kID4gcGVyaW9kRW5kKSB7XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIGlmIChkYXRlRm5zLmlzU2FtZVNlY29uZChldmVudFN0YXJ0LCBwZXJpb2RTdGFydCkgfHwgZGF0ZUZucy5pc1NhbWVTZWNvbmQoZXZlbnRTdGFydCwgcGVyaW9kRW5kKSkge1xyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBpZiAoZGF0ZUZucy5pc1NhbWVTZWNvbmQoZXZlbnRFbmQsIHBlcmlvZFN0YXJ0KSB8fCBkYXRlRm5zLmlzU2FtZVNlY29uZChldmVudEVuZCwgcGVyaW9kRW5kKSkge1xyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gZmFsc2U7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdldEV2ZW50c0luUGVyaW9kKHsgZXZlbnRzLCBwZXJpb2RTdGFydCwgcGVyaW9kRW5kIH06IEdldEV2ZW50c0luUGVyaW9kQXJncyk6IENhbGVuZGFyRXZlbnRbXSB7XHJcbiAgcmV0dXJuIGV2ZW50cy5maWx0ZXIoKGV2ZW50OiBDYWxlbmRhckV2ZW50KSA9PiBpc0V2ZW50SXNQZXJpb2QoeyBldmVudCwgcGVyaW9kU3RhcnQsIHBlcmlvZEVuZCB9KSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdldEV2ZW50c0luVGltZVJhbmdlKGV2ZW50czogQ2FsZW5kYXJFdmVudFtdLCBkYXlTdGFydDogYW55LCBkYXlFbmQ6IGFueSkge1xyXG4gIHJldHVybiBldmVudHMuZmlsdGVyKChldmVudCkgPT4ge1xyXG4gICAgY29uc3QgZXZlbnRTdGFydDogRGF0ZSA9IGV2ZW50LnN0YXJ0O1xyXG4gICAgY29uc3QgZXZlbnRFbmQ6IERhdGUgPSBldmVudC5lbmQgfHwgZXZlbnRTdGFydDtcclxuXHJcbiAgICBjb25zdCBzdGFydE9mVmlldzogRGF0ZSA9IGRhdGVGbnMuc2V0TWludXRlcyhkYXRlRm5zLnNldEhvdXJzKGRhdGVGbnMuc3RhcnRPZkRheShldmVudFN0YXJ0KSwgZGF5U3RhcnQuaG91ciksIGRheVN0YXJ0Lm1pbnV0ZSk7XHJcbiAgICBjb25zdCBlbmRPZlZpZXc6IERhdGUgPSBkYXRlRm5zLnNldE1pbnV0ZXMoZGF0ZUZucy5zZXRIb3VycyhkYXRlRm5zLnN0YXJ0T2ZNaW51dGUoZXZlbnRTdGFydCksIGRheUVuZC5ob3VyKSwgZGF5RW5kLm1pbnV0ZSk7XHJcblxyXG4gICAgcmV0dXJuIGRhdGVGbnMuaXNBZnRlcihldmVudEVuZCwgc3RhcnRPZlZpZXcpICYmIGRhdGVGbnMuaXNCZWZvcmUoZXZlbnRTdGFydCwgZW5kT2ZWaWV3KTtcclxuICB9KTtcclxufVxyXG5cclxuZnVuY3Rpb24gZ2V0V2Vla0RheSh7IGRhdGUgfTogeyBkYXRlOiBEYXRlIH0pOiBXZWVrRGF5IHtcclxuICBjb25zdCB0b2RheTogRGF0ZSA9IGRhdGVGbnMuc3RhcnRPZkRheShuZXcgRGF0ZSgpKTtcclxuICByZXR1cm4ge1xyXG4gICAgZGF0ZSxcclxuICAgIGlzUGFzdDogZGF0ZSA8IHRvZGF5LFxyXG4gICAgaXNUb2RheTogZGF0ZUZucy5pc1NhbWVEYXkoZGF0ZSwgdG9kYXkpLFxyXG4gICAgaXNGdXR1cmU6IGRhdGUgPiB0b2RheSxcclxuICAgIGlzV2Vla2VuZDogV0VFS0VORF9EQVlfTlVNQkVSUy5pbmRleE9mKGRhdGVGbnMuZ2V0RGF5KGRhdGUpKSA+IC0xLFxyXG4gIH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRXZWVrVmlld0hlYWRlcih7XHJcbiAgdmlld0RhdGUsXHJcbiAgd2Vla1N0YXJ0c09uLFxyXG4gIGV4Y2x1ZGVkID0gW10sXHJcbn06IHtcclxuICB2aWV3RGF0ZTogRGF0ZTtcclxuICB3ZWVrU3RhcnRzT246IG51bWJlcjtcclxuICBleGNsdWRlZD86IG51bWJlcltdO1xyXG59KTogV2Vla0RheVtdIHtcclxuICBjb25zdCBzdGFydDogRGF0ZSA9IGRhdGVGbnMuc3RhcnRPZldlZWsodmlld0RhdGUsIHsgd2Vla1N0YXJ0c09uIH0pO1xyXG4gIGNvbnN0IGRheXM6IFdlZWtEYXlbXSA9IFtdO1xyXG4gIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBEQVlTX0lOX1dFRUs7IGkrKykge1xyXG4gICAgY29uc3QgZGF0ZTogRGF0ZSA9IGRhdGVGbnMuYWRkRGF5cyhzdGFydCwgaSk7XHJcbiAgICBpZiAoIWV4Y2x1ZGVkLnNvbWUoKGUpID0+IGRhdGUuZ2V0RGF5KCkgPT09IGUpKSB7XHJcbiAgICAgIGRheXMucHVzaChnZXRXZWVrRGF5KHsgZGF0ZSB9KSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZXR1cm4gZGF5cztcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFdlZWtWaWV3KHtcclxuICBldmVudHMgPSBbXSxcclxuICB2aWV3RGF0ZSxcclxuICB3ZWVrU3RhcnRzT24sXHJcbiAgZXhjbHVkZWQgPSBbXSxcclxuICBob3VyU2VnbWVudHMsXHJcbiAgc2VnbWVudEhlaWdodCxcclxuICBkYXlTdGFydCxcclxuICBkYXlFbmQsXHJcbn06IHtcclxuICBldmVudHM/OiBDYWxlbmRhckV2ZW50W107XHJcbiAgdmlld0RhdGU6IERhdGU7XHJcbiAgd2Vla1N0YXJ0c09uOiBudW1iZXI7XHJcbiAgZXhjbHVkZWQ/OiBudW1iZXJbXTtcclxuICBob3VyU2VnbWVudHM6IG51bWJlcjtcclxuICBzZWdtZW50SGVpZ2h0OiBudW1iZXI7XHJcbiAgZGF5U3RhcnQ6IGFueTtcclxuICBkYXlFbmQ6IGFueTtcclxufSk6IFdlZWtWaWV3RXZlbnRSb3dbXSB7XHJcbiAgaWYgKCFldmVudHMpIHtcclxuICAgIGV2ZW50cyA9IFtdO1xyXG4gIH1cclxuXHJcbiAgY29uc3Qgc3RhcnRPZlZpZXdXZWVrOiBEYXRlID0gZGF0ZUZucy5zdGFydE9mV2Vlayh2aWV3RGF0ZSwgeyB3ZWVrU3RhcnRzT24gfSk7XHJcbiAgY29uc3QgZW5kT2ZWaWV3V2VlazogRGF0ZSA9IGRhdGVGbnMuZW5kT2ZXZWVrKHZpZXdEYXRlLCB7IHdlZWtTdGFydHNPbiB9KTtcclxuICBjb25zdCBtYXhSYW5nZTogbnVtYmVyID0gREFZU19JTl9XRUVLIC0gZXhjbHVkZWQubGVuZ3RoO1xyXG5cclxuICBjb25zdCBldmVudHNNYXBwZWQ6IFdlZWtWaWV3RXZlbnRbXSA9IGdldEV2ZW50c0luVGltZVJhbmdlKFxyXG4gICAgZ2V0RXZlbnRzSW5QZXJpb2QoeyBldmVudHMsIHBlcmlvZFN0YXJ0OiBzdGFydE9mVmlld1dlZWssIHBlcmlvZEVuZDogZW5kT2ZWaWV3V2VlayB9KSxcclxuICAgIGRheVN0YXJ0LFxyXG4gICAgZGF5RW5kLFxyXG4gIClcclxuICAgIC5tYXAoKGV2ZW50KSA9PiB7XHJcbiAgICAgIGNvbnN0IG9mZnNldDogbnVtYmVyID0gZ2V0V2Vla1ZpZXdFdmVudE9mZnNldCh7IGV2ZW50LCBzdGFydE9mV2Vlazogc3RhcnRPZlZpZXdXZWVrLCBleGNsdWRlZCB9KTtcclxuICAgICAgY29uc3Qgc3BhbjogbnVtYmVyID0gMTsgLy8gZ2V0V2Vla1ZpZXdFdmVudFNwYW4oeyBldmVudCwgb2Zmc2V0LCBzdGFydE9mV2Vlazogc3RhcnRPZlZpZXdXZWVrLCBleGNsdWRlZCB9KTtcclxuICAgICAgcmV0dXJuIHsgZXZlbnQsIG9mZnNldCwgc3BhbiB9O1xyXG4gICAgfSlcclxuICAgIC5maWx0ZXIoKGUpID0+IGUub2Zmc2V0IDwgbWF4UmFuZ2UpXHJcbiAgICAuZmlsdGVyKChlKSA9PiBlLnNwYW4gPiAwKVxyXG4gICAgLm1hcCgoZW50cnkpID0+ICh7XHJcbiAgICAgIGV2ZW50OiBlbnRyeS5ldmVudCxcclxuICAgICAgb2Zmc2V0OiBlbnRyeS5vZmZzZXQsXHJcbiAgICAgIHNwYW46IGVudHJ5LnNwYW4sXHJcbiAgICAgIHN0YXJ0c0JlZm9yZVdlZWs6IGVudHJ5LmV2ZW50LnN0YXJ0IDwgc3RhcnRPZlZpZXdXZWVrLFxyXG4gICAgICBlbmRzQWZ0ZXJXZWVrOiAoZW50cnkuZXZlbnQuZW5kIHx8IGVudHJ5LmV2ZW50LnN0YXJ0KSA+IGVuZE9mVmlld1dlZWssXHJcbiAgICAgIHRvcDogMCxcclxuICAgIH0pKVxyXG4gICAgLnNvcnQoXHJcbiAgICAgIChpdGVtQSwgaXRlbUIpOiBudW1iZXIgPT4ge1xyXG4gICAgICAgIGNvbnN0IHN0YXJ0U2Vjb25kc0RpZmY6IG51bWJlciA9IGRhdGVGbnMuZGlmZmVyZW5jZUluU2Vjb25kcyhpdGVtQS5ldmVudC5zdGFydCwgaXRlbUIuZXZlbnQuc3RhcnQpO1xyXG4gICAgICAgIGlmIChzdGFydFNlY29uZHNEaWZmID09PSAwKSB7XHJcbiAgICAgICAgICByZXR1cm4gZGF0ZUZucy5kaWZmZXJlbmNlSW5TZWNvbmRzKGl0ZW1CLmV2ZW50LmVuZCB8fCBpdGVtQi5ldmVudC5zdGFydCwgaXRlbUEuZXZlbnQuZW5kIHx8IGl0ZW1BLmV2ZW50LnN0YXJ0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHN0YXJ0U2Vjb25kc0RpZmY7XHJcbiAgICAgIH0sXHJcbiAgICApXHJcbiAgICAubWFwKChlbnRyeTogV2Vla1ZpZXdFdmVudCkgPT4ge1xyXG4gICAgICBjb25zdCBzdGFydE9mVmlldzogRGF0ZSA9IGRhdGVGbnMuc2V0TWludXRlcyhkYXRlRm5zLnNldEhvdXJzKGRhdGVGbnMuc3RhcnRPZkRheShlbnRyeS5ldmVudC5zdGFydCksIGRheVN0YXJ0LmhvdXIpLCBkYXlTdGFydC5taW51dGUpO1xyXG4gICAgICBjb25zdCBlbmRPZlZpZXc6IERhdGUgPSBkYXRlRm5zLnNldE1pbnV0ZXMoXHJcbiAgICAgICAgZGF0ZUZucy5zZXRIb3VycyhkYXRlRm5zLnN0YXJ0T2ZNaW51dGUoZGF0ZUZucy5lbmRPZkRheShlbnRyeS5ldmVudC5zdGFydCkpLCBkYXlFbmQuaG91ciksXHJcbiAgICAgICAgZGF5RW5kLm1pbnV0ZSxcclxuICAgICAgKTtcclxuXHJcbiAgICAgIGNvbnN0IGV2ZW50U3RhcnQ6IERhdGUgPSBlbnRyeS5ldmVudC5zdGFydDtcclxuICAgICAgY29uc3QgZXZlbnRFbmQ6IERhdGUgPSBlbnRyeS5ldmVudC5lbmQgfHwgZXZlbnRTdGFydDtcclxuXHJcbiAgICAgIGNvbnN0IGhvdXJIZWlnaHRNb2RpZmllcjogbnVtYmVyID0gKGhvdXJTZWdtZW50cyAqIHNlZ21lbnRIZWlnaHQpIC8gTUlOVVRFU19JTl9IT1VSO1xyXG5cclxuICAgICAgaWYgKGV2ZW50U3RhcnQgPiBzdGFydE9mVmlldykge1xyXG4gICAgICAgIGVudHJ5LnRvcCArPSBkYXRlRm5zLmRpZmZlcmVuY2VJbk1pbnV0ZXMoZXZlbnRTdGFydCwgc3RhcnRPZlZpZXcpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBlbnRyeS50b3AgKj0gaG91ckhlaWdodE1vZGlmaWVyO1xyXG5cclxuICAgICAgY29uc3Qgc3RhcnRzQmVmb3JlRGF5OiBib29sZWFuID0gZXZlbnRTdGFydCA8IHN0YXJ0T2ZWaWV3O1xyXG4gICAgICBjb25zdCBlbmRzQWZ0ZXJEYXk6IGJvb2xlYW4gPSBldmVudEVuZCA+IGVuZE9mVmlldztcclxuXHJcbiAgICAgIGNvbnN0IHN0YXJ0RGF0ZTogRGF0ZSA9IHN0YXJ0c0JlZm9yZURheSA/IHN0YXJ0T2ZWaWV3IDogZXZlbnRTdGFydDtcclxuICAgICAgY29uc3QgZW5kRGF0ZTogRGF0ZSA9IGVuZHNBZnRlckRheSA/IGVuZE9mVmlldyA6IGV2ZW50RW5kO1xyXG5cclxuICAgICAgbGV0IGhlaWdodDogbnVtYmVyID0gZGF0ZUZucy5kaWZmZXJlbmNlSW5NaW51dGVzKGVuZERhdGUsIHN0YXJ0RGF0ZSk7XHJcblxyXG4gICAgICBpZiAoIWVudHJ5LmV2ZW50LmVuZCkge1xyXG4gICAgICAgIGhlaWdodCA9IHNlZ21lbnRIZWlnaHQ7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaGVpZ2h0ICo9IGhvdXJIZWlnaHRNb2RpZmllcjtcclxuICAgICAgfVxyXG5cclxuICAgICAgZW50cnkuaGVpZ2h0ID0gaGVpZ2h0O1xyXG5cclxuICAgICAgcmV0dXJuIGVudHJ5O1xyXG4gICAgfSk7XHJcblxyXG4gIGNvbnN0IGV2ZW50Um93czogV2Vla1ZpZXdFdmVudFJvd1tdID0gW107XHJcbiAgY29uc3QgYWxsb2NhdGVkRXZlbnRzOiBXZWVrVmlld0V2ZW50W10gPSBbXTtcclxuXHJcbiAgZXZlbnRzTWFwcGVkLmZvckVhY2goKGV2ZW50OiBXZWVrVmlld0V2ZW50LCBpbmRleDogbnVtYmVyKSA9PiB7XHJcbiAgICBpZiAoYWxsb2NhdGVkRXZlbnRzLmluZGV4T2YoZXZlbnQpID09PSAtMSkge1xyXG4gICAgICBhbGxvY2F0ZWRFdmVudHMucHVzaChldmVudCk7XHJcblxyXG4gICAgICBjb25zdCBvdGhlclJvd0V2ZW50czogV2Vla1ZpZXdFdmVudFtdID0gZXZlbnRzTWFwcGVkLnNsaWNlKGluZGV4ICsgMSkuZmlsdGVyKChuZXh0RXZlbnQpID0+IHtcclxuICAgICAgICByZXR1cm4gbmV4dEV2ZW50LnRvcCA9PT0gZXZlbnQudG9wICYmIG5leHRFdmVudC5vZmZzZXQgPT09IGV2ZW50Lm9mZnNldDtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBpZiAob3RoZXJSb3dFdmVudHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIGNvbnN0IHRvdGFsRXZlbnRzRm9yUm93ID0gb3RoZXJSb3dFdmVudHMubGVuZ3RoICsgMTtcclxuXHJcbiAgICAgICAgZXZlbnQuc3BhbiA9IDEgLyB0b3RhbEV2ZW50c0ZvclJvdztcclxuXHJcbiAgICAgICAgbGV0IG5leHRPZmZzZXQgPSBldmVudC5zcGFuICsgZXZlbnQub2Zmc2V0O1xyXG5cclxuICAgICAgICBvdGhlclJvd0V2ZW50cy5mb3JFYWNoKChuZXh0RXZlbnQ6IFdlZWtWaWV3RXZlbnQpID0+IHtcclxuICAgICAgICAgIG5leHRFdmVudC5vZmZzZXQgPSBuZXh0T2Zmc2V0O1xyXG4gICAgICAgICAgbmV4dEV2ZW50LnNwYW4gPSBldmVudC5zcGFuO1xyXG4gICAgICAgICAgbmV4dE9mZnNldCA9IG5leHRFdmVudC5zcGFuICsgbmV4dEV2ZW50Lm9mZnNldDtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgYWxsb2NhdGVkRXZlbnRzLnB1c2goLi4ub3RoZXJSb3dFdmVudHMpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBldmVudFJvd3MucHVzaCh7XHJcbiAgICAgICAgcm93OiBbZXZlbnQsIC4uLm90aGVyUm93RXZlbnRzXSxcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfSk7XHJcblxyXG4gIHJldHVybiBldmVudFJvd3M7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRNb250aFZpZXcoe1xyXG4gIGV2ZW50cyA9IFtdLFxyXG4gIHZpZXdEYXRlLFxyXG4gIHdlZWtTdGFydHNPbixcclxuICBleGNsdWRlZCA9IFtdLFxyXG59OiB7XHJcbiAgZXZlbnRzPzogQ2FsZW5kYXJFdmVudFtdO1xyXG4gIHZpZXdEYXRlOiBEYXRlO1xyXG4gIHdlZWtTdGFydHNPbjogbnVtYmVyO1xyXG4gIGV4Y2x1ZGVkPzogbnVtYmVyW107XHJcbn0pOiBNb250aFZpZXcge1xyXG4gIGlmICghZXZlbnRzKSB7XHJcbiAgICBldmVudHMgPSBbXTtcclxuICB9XHJcblxyXG4gIGNvbnN0IHN0YXJ0OiBEYXRlID0gZGF0ZUZucy5zdGFydE9mV2VlayhkYXRlRm5zLnN0YXJ0T2ZNb250aCh2aWV3RGF0ZSksIHsgd2Vla1N0YXJ0c09uIH0pO1xyXG4gIGNvbnN0IGVuZDogRGF0ZSA9IGRhdGVGbnMuZW5kT2ZXZWVrKGRhdGVGbnMuZW5kT2ZNb250aCh2aWV3RGF0ZSksIHsgd2Vla1N0YXJ0c09uIH0pO1xyXG4gIGNvbnN0IGV2ZW50c0luTW9udGg6IENhbGVuZGFyRXZlbnRbXSA9IGdldEV2ZW50c0luUGVyaW9kKHtcclxuICAgIGV2ZW50cyxcclxuICAgIHBlcmlvZFN0YXJ0OiBzdGFydCxcclxuICAgIHBlcmlvZEVuZDogZW5kLFxyXG4gIH0pO1xyXG4gIGNvbnN0IGRheXM6IE1vbnRoVmlld0RheVtdID0gW107XHJcbiAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IGRhdGVGbnMuZGlmZmVyZW5jZUluRGF5cyhlbmQsIHN0YXJ0KSArIDE7IGkrKykge1xyXG4gICAgY29uc3QgZGF0ZTogRGF0ZSA9IGRhdGVGbnMuYWRkRGF5cyhzdGFydCwgaSk7XHJcbiAgICBpZiAoIWV4Y2x1ZGVkLnNvbWUoKGUpID0+IGRhdGUuZ2V0RGF5KCkgPT09IGUpKSB7XHJcbiAgICAgIGNvbnN0IGRheTogTW9udGhWaWV3RGF5ID0gZ2V0V2Vla0RheSh7IGRhdGUgfSkgYXMgTW9udGhWaWV3RGF5O1xyXG4gICAgICBjb25zdCBjYWxFdmVudHM6IENhbGVuZGFyRXZlbnRbXSA9IGdldEV2ZW50c0luUGVyaW9kKHtcclxuICAgICAgICBldmVudHM6IGV2ZW50c0luTW9udGgsXHJcbiAgICAgICAgcGVyaW9kU3RhcnQ6IGRhdGVGbnMuc3RhcnRPZkRheShkYXRlKSxcclxuICAgICAgICBwZXJpb2RFbmQ6IGRhdGVGbnMuZW5kT2ZEYXkoZGF0ZSksXHJcbiAgICAgIH0pO1xyXG4gICAgICBkYXkuaW5Nb250aCA9IGRhdGVGbnMuaXNTYW1lTW9udGgoZGF0ZSwgdmlld0RhdGUpO1xyXG4gICAgICBkYXkuZXZlbnRzID0gY2FsRXZlbnRzO1xyXG4gICAgICBkYXkuYmFkZ2VUb3RhbCA9IGNhbEV2ZW50cy5sZW5ndGg7XHJcbiAgICAgIGRheXMucHVzaChkYXkpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY29uc3QgdG90YWxEYXlzVmlzaWJsZUluV2VlazogbnVtYmVyID0gREFZU19JTl9XRUVLIC0gZXhjbHVkZWQubGVuZ3RoO1xyXG4gIGNvbnN0IHJvd3M6IG51bWJlciA9IE1hdGguZmxvb3IoZGF5cy5sZW5ndGggLyB0b3RhbERheXNWaXNpYmxlSW5XZWVrKTtcclxuICBjb25zdCByb3dPZmZzZXRzOiBudW1iZXJbXSA9IFtdO1xyXG4gIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCByb3dzOyBpKyspIHtcclxuICAgIHJvd09mZnNldHMucHVzaChpICogdG90YWxEYXlzVmlzaWJsZUluV2Vlayk7XHJcbiAgfVxyXG5cclxuICByZXR1cm4ge1xyXG4gICAgcm93T2Zmc2V0cyxcclxuICAgIHRvdGFsRGF5c1Zpc2libGVJbldlZWssXHJcbiAgICBkYXlzLFxyXG4gIH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXREYXlWaWV3KHsgZXZlbnRzID0gW10sIHZpZXdEYXRlLCBob3VyU2VnbWVudHMsIGRheVN0YXJ0LCBkYXlFbmQsIGV2ZW50V2lkdGgsIHNlZ21lbnRIZWlnaHQgfTogR2V0RGF5Vmlld0FyZ3MpOiBEYXlWaWV3IHtcclxuICBpZiAoIWV2ZW50cykge1xyXG4gICAgZXZlbnRzID0gW107XHJcbiAgfVxyXG5cclxuICBjb25zdCBzdGFydE9mVmlldzogRGF0ZSA9IGRhdGVGbnMuc2V0TWludXRlcyhkYXRlRm5zLnNldEhvdXJzKGRhdGVGbnMuc3RhcnRPZkRheSh2aWV3RGF0ZSksIGRheVN0YXJ0LmhvdXIpLCBkYXlTdGFydC5taW51dGUpO1xyXG4gIGNvbnN0IGVuZE9mVmlldzogRGF0ZSA9IGRhdGVGbnMuc2V0TWludXRlcyhcclxuICAgIGRhdGVGbnMuc2V0SG91cnMoZGF0ZUZucy5zdGFydE9mTWludXRlKGRhdGVGbnMuZW5kT2ZEYXkodmlld0RhdGUpKSwgZGF5RW5kLmhvdXIpLFxyXG4gICAgZGF5RW5kLm1pbnV0ZSxcclxuICApO1xyXG4gIGNvbnN0IHByZXZpb3VzRGF5RXZlbnRzOiBEYXlWaWV3RXZlbnRbXSA9IFtdO1xyXG5cclxuICBjb25zdCBkYXlWaWV3RXZlbnRzOiBEYXlWaWV3RXZlbnRbXSA9IGdldEV2ZW50c0luVGltZVJhbmdlKFxyXG4gICAgZ2V0RXZlbnRzSW5QZXJpb2Qoe1xyXG4gICAgICBldmVudHM6IGV2ZW50cy5maWx0ZXIoKGV2ZW50OiBDYWxlbmRhckV2ZW50KSA9PiAhZXZlbnQuYWxsRGF5KSxcclxuICAgICAgcGVyaW9kU3RhcnQ6IHN0YXJ0T2ZWaWV3LFxyXG4gICAgICBwZXJpb2RFbmQ6IGVuZE9mVmlldyxcclxuICAgIH0pLFxyXG4gICAgZGF5U3RhcnQsXHJcbiAgICBkYXlFbmQsXHJcbiAgKVxyXG4gICAgLnNvcnQoKGV2ZW50QTogQ2FsZW5kYXJFdmVudCwgZXZlbnRCOiBDYWxlbmRhckV2ZW50KSA9PiB7XHJcbiAgICAgIHJldHVybiBldmVudEEuc3RhcnQudmFsdWVPZigpIC0gZXZlbnRCLnN0YXJ0LnZhbHVlT2YoKTtcclxuICAgIH0pXHJcbiAgICAubWFwKChldmVudDogQ2FsZW5kYXJFdmVudCkgPT4ge1xyXG4gICAgICBjb25zdCBldmVudFN0YXJ0OiBEYXRlID0gZXZlbnQuc3RhcnQ7XHJcbiAgICAgIGNvbnN0IGV2ZW50RW5kOiBEYXRlID0gZXZlbnQuZW5kIHx8IGV2ZW50U3RhcnQ7XHJcbiAgICAgIGNvbnN0IHN0YXJ0c0JlZm9yZURheTogYm9vbGVhbiA9IGV2ZW50U3RhcnQgPCBzdGFydE9mVmlldztcclxuICAgICAgY29uc3QgZW5kc0FmdGVyRGF5OiBib29sZWFuID0gZXZlbnRFbmQgPiBlbmRPZlZpZXc7XHJcbiAgICAgIGNvbnN0IGhvdXJIZWlnaHRNb2RpZmllcjogbnVtYmVyID0gKGhvdXJTZWdtZW50cyAqIHNlZ21lbnRIZWlnaHQpIC8gTUlOVVRFU19JTl9IT1VSO1xyXG5cclxuICAgICAgbGV0IHRvcDogbnVtYmVyID0gMDtcclxuXHJcbiAgICAgIGlmIChldmVudFN0YXJ0ID4gc3RhcnRPZlZpZXcpIHtcclxuICAgICAgICB0b3AgKz0gZGF0ZUZucy5kaWZmZXJlbmNlSW5NaW51dGVzKGV2ZW50U3RhcnQsIHN0YXJ0T2ZWaWV3KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdG9wICo9IGhvdXJIZWlnaHRNb2RpZmllcjtcclxuXHJcbiAgICAgIGNvbnN0IHN0YXJ0RGF0ZTogRGF0ZSA9IHN0YXJ0c0JlZm9yZURheSA/IHN0YXJ0T2ZWaWV3IDogZXZlbnRTdGFydDtcclxuICAgICAgY29uc3QgZW5kRGF0ZTogRGF0ZSA9IGVuZHNBZnRlckRheSA/IGVuZE9mVmlldyA6IGV2ZW50RW5kO1xyXG5cclxuICAgICAgbGV0IGhlaWdodDogbnVtYmVyID0gZGF0ZUZucy5kaWZmZXJlbmNlSW5NaW51dGVzKGVuZERhdGUsIHN0YXJ0RGF0ZSk7XHJcblxyXG4gICAgICBpZiAoIWV2ZW50LmVuZCkge1xyXG4gICAgICAgIGhlaWdodCA9IHNlZ21lbnRIZWlnaHQ7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaGVpZ2h0ICo9IGhvdXJIZWlnaHRNb2RpZmllcjtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgYm90dG9tOiBudW1iZXIgPSB0b3AgKyBoZWlnaHQ7XHJcblxyXG4gICAgICBjb25zdCBvdmVybGFwcGluZ1ByZXZpb3VzRXZlbnRzOiBEYXlWaWV3RXZlbnRbXSA9IHByZXZpb3VzRGF5RXZlbnRzLmZpbHRlcigocHJldmlvdXNFdmVudDogRGF5Vmlld0V2ZW50KSA9PiB7XHJcbiAgICAgICAgY29uc3QgcHJldmlvdXNFdmVudFRvcDogbnVtYmVyID0gcHJldmlvdXNFdmVudC50b3A7XHJcbiAgICAgICAgY29uc3QgcHJldmlvdXNFdmVudEJvdHRvbTogbnVtYmVyID0gcHJldmlvdXNFdmVudC50b3AgKyBwcmV2aW91c0V2ZW50LmhlaWdodDtcclxuXHJcbiAgICAgICAgaWYgKHRvcCA8IHByZXZpb3VzRXZlbnRCb3R0b20gJiYgcHJldmlvdXNFdmVudEJvdHRvbSA8IGJvdHRvbSkge1xyXG4gICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfSBlbHNlIGlmIChwcmV2aW91c0V2ZW50VG9wIDw9IHRvcCAmJiBib3R0b20gPD0gcHJldmlvdXNFdmVudEJvdHRvbSkge1xyXG4gICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgbGV0IGxlZnQ6IG51bWJlciA9IDA7XHJcblxyXG4gICAgICB3aGlsZSAob3ZlcmxhcHBpbmdQcmV2aW91c0V2ZW50cy5zb21lKChwcmV2aW91c0V2ZW50KSA9PiBwcmV2aW91c0V2ZW50LmxlZnQgPT09IGxlZnQpKSB7XHJcbiAgICAgICAgbGVmdCArPSBldmVudFdpZHRoO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBkYXlFdmVudDogRGF5Vmlld0V2ZW50ID0ge1xyXG4gICAgICAgIGV2ZW50LFxyXG4gICAgICAgIGhlaWdodCxcclxuICAgICAgICB3aWR0aDogZXZlbnRXaWR0aCxcclxuICAgICAgICB0b3AsXHJcbiAgICAgICAgbGVmdCxcclxuICAgICAgICBzdGFydHNCZWZvcmVEYXksXHJcbiAgICAgICAgZW5kc0FmdGVyRGF5LFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgaWYgKGhlaWdodCA+IDApIHtcclxuICAgICAgICBwcmV2aW91c0RheUV2ZW50cy5wdXNoKGRheUV2ZW50KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIGRheUV2ZW50O1xyXG4gICAgfSlcclxuICAgIC5maWx0ZXIoKGRheUV2ZW50OiBEYXlWaWV3RXZlbnQpID0+IGRheUV2ZW50LmhlaWdodCA+IDApO1xyXG5cclxuICBjb25zdCB3aWR0aDogbnVtYmVyID0gTWF0aC5tYXgoLi4uZGF5Vmlld0V2ZW50cy5tYXAoKGV2ZW50OiBEYXlWaWV3RXZlbnQpID0+IGV2ZW50LmxlZnQgKyBldmVudC53aWR0aCkpO1xyXG4gIGNvbnN0IGFsbERheUV2ZW50czogQ2FsZW5kYXJFdmVudFtdID0gZ2V0RXZlbnRzSW5QZXJpb2Qoe1xyXG4gICAgZXZlbnRzOiBldmVudHMuZmlsdGVyKChldmVudDogQ2FsZW5kYXJFdmVudCkgPT4gZXZlbnQuYWxsRGF5KSxcclxuICAgIHBlcmlvZFN0YXJ0OiBkYXRlRm5zLnN0YXJ0T2ZEYXkoc3RhcnRPZlZpZXcpLFxyXG4gICAgcGVyaW9kRW5kOiBkYXRlRm5zLmVuZE9mRGF5KGVuZE9mVmlldyksXHJcbiAgfSk7XHJcblxyXG4gIHJldHVybiB7XHJcbiAgICBldmVudHM6IGRheVZpZXdFdmVudHMsXHJcbiAgICB3aWR0aCxcclxuICAgIGFsbERheUV2ZW50cyxcclxuICB9O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGF5Vmlld0hvdXJHcmlkKHtcclxuICB2aWV3RGF0ZSxcclxuICBob3VyU2VnbWVudHMsXHJcbiAgZGF5U3RhcnQsXHJcbiAgZGF5RW5kLFxyXG59OiB7XHJcbiAgdmlld0RhdGU6IERhdGU7XHJcbiAgaG91clNlZ21lbnRzOiBudW1iZXI7XHJcbiAgZGF5U3RhcnQ6IGFueTtcclxuICBkYXlFbmQ6IGFueTtcclxufSk6IERheVZpZXdIb3VyW10ge1xyXG4gIGNvbnN0IGhvdXJzOiBEYXlWaWV3SG91cltdID0gW107XHJcblxyXG4gIGNvbnN0IHN0YXJ0T2ZWaWV3OiBEYXRlID0gZGF0ZUZucy5zZXRNaW51dGVzKGRhdGVGbnMuc2V0SG91cnMoZGF0ZUZucy5zdGFydE9mRGF5KHZpZXdEYXRlKSwgZGF5U3RhcnQuaG91ciksIGRheVN0YXJ0Lm1pbnV0ZSk7XHJcbiAgY29uc3QgZW5kT2ZWaWV3OiBEYXRlID0gZGF0ZUZucy5zZXRNaW51dGVzKFxyXG4gICAgZGF0ZUZucy5zZXRIb3VycyhkYXRlRm5zLnN0YXJ0T2ZNaW51dGUoZGF0ZUZucy5lbmRPZkRheSh2aWV3RGF0ZSkpLCBkYXlFbmQuaG91ciksXHJcbiAgICBkYXlFbmQubWludXRlLFxyXG4gICk7XHJcbiAgY29uc3Qgc2VnbWVudER1cmF0aW9uOiBudW1iZXIgPSBNSU5VVEVTX0lOX0hPVVIgLyBob3VyU2VnbWVudHM7XHJcbiAgY29uc3Qgc3RhcnRPZlZpZXdEYXk6IERhdGUgPSBkYXRlRm5zLnN0YXJ0T2ZEYXkodmlld0RhdGUpO1xyXG5cclxuICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgSE9VUlNfSU5fREFZOyBpKyspIHtcclxuICAgIGNvbnN0IHNlZ21lbnRzOiBEYXlWaWV3SG91clNlZ21lbnRbXSA9IFtdO1xyXG4gICAgZm9yIChsZXQgajogbnVtYmVyID0gMDsgaiA8IGhvdXJTZWdtZW50czsgaisrKSB7XHJcbiAgICAgIGNvbnN0IGRhdGU6IERhdGUgPSBkYXRlRm5zLmFkZE1pbnV0ZXMoZGF0ZUZucy5hZGRIb3VycyhzdGFydE9mVmlld0RheSwgaSksIGogKiBzZWdtZW50RHVyYXRpb24pO1xyXG4gICAgICBpZiAoZGF0ZSA+PSBzdGFydE9mVmlldyAmJiBkYXRlIDwgZW5kT2ZWaWV3KSB7XHJcbiAgICAgICAgc2VnbWVudHMucHVzaCh7XHJcbiAgICAgICAgICBkYXRlLFxyXG4gICAgICAgICAgaXNTdGFydDogaiA9PT0gMCxcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKHNlZ21lbnRzLmxlbmd0aCA+IDApIHtcclxuICAgICAgaG91cnMucHVzaCh7IHNlZ21lbnRzIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGhvdXJzO1xyXG59XHJcbiJdfQ==
1
+ import * as dateFns from 'date-fns';
2
+ const WEEKEND_DAY_NUMBERS = [0, 6];
3
+ const DAYS_IN_WEEK = 7;
4
+ const HOURS_IN_DAY = 24;
5
+ const MINUTES_IN_HOUR = 60;
6
+ export var CalendarEventResponse;
7
+ (function (CalendarEventResponse) {
8
+ CalendarEventResponse[CalendarEventResponse["Maybe"] = 0] = "Maybe";
9
+ CalendarEventResponse[CalendarEventResponse["Accepted"] = 1] = "Accepted";
10
+ CalendarEventResponse[CalendarEventResponse["Rejected"] = 2] = "Rejected";
11
+ })(CalendarEventResponse || (CalendarEventResponse = {}));
12
+ function getExcludedDays({ startDate, days, excluded }) {
13
+ if (excluded.length < 1) {
14
+ return 0;
15
+ }
16
+ let day = startDate.getDay();
17
+ let reduce = 0;
18
+ for (let i = 0; i < days; i++) {
19
+ if (day === DAYS_IN_WEEK) {
20
+ day = 0;
21
+ }
22
+ if (excluded.some((e) => e === day)) {
23
+ reduce++;
24
+ }
25
+ day++;
26
+ }
27
+ return reduce;
28
+ }
29
+ function getWeekViewEventSpan({ event, offset, startOfWeek, excluded, }) {
30
+ const begin = event.start < startOfWeek ? startOfWeek : event.start;
31
+ let span = 1;
32
+ if (event.end) {
33
+ span = dateFns.differenceInDays(dateFns.addMinutes(dateFns.endOfDay(event.end), 1), dateFns.startOfDay(begin));
34
+ }
35
+ const totalLength = offset + span;
36
+ if (totalLength > DAYS_IN_WEEK) {
37
+ span = DAYS_IN_WEEK - offset;
38
+ }
39
+ return span - getExcludedDays({ startDate: begin, days: span, excluded });
40
+ }
41
+ export function getWeekViewEventOffset({ event, startOfWeek, excluded = [], }) {
42
+ if (event.start < startOfWeek) {
43
+ return 0;
44
+ }
45
+ const distance = dateFns.differenceInDays(event.start, startOfWeek);
46
+ return distance - getExcludedDays({ startDate: startOfWeek, days: distance, excluded });
47
+ }
48
+ function isEventIsPeriod({ event, periodStart, periodEnd }) {
49
+ const eventStart = event.start;
50
+ const eventEnd = event.end || event.start;
51
+ if (eventStart > periodStart && eventStart < periodEnd) {
52
+ return true;
53
+ }
54
+ if (eventEnd > periodStart && eventEnd < periodEnd) {
55
+ return true;
56
+ }
57
+ if (eventStart < periodStart && eventEnd > periodEnd) {
58
+ return true;
59
+ }
60
+ if (dateFns.isSameSecond(eventStart, periodStart) || dateFns.isSameSecond(eventStart, periodEnd)) {
61
+ return true;
62
+ }
63
+ if (dateFns.isSameSecond(eventEnd, periodStart) || dateFns.isSameSecond(eventEnd, periodEnd)) {
64
+ return true;
65
+ }
66
+ return false;
67
+ }
68
+ function getEventsInPeriod({ events, periodStart, periodEnd }) {
69
+ return events.filter((event) => isEventIsPeriod({ event, periodStart, periodEnd }));
70
+ }
71
+ function getEventsInTimeRange(events, dayStart, dayEnd) {
72
+ return events.filter((event) => {
73
+ const eventStart = event.start;
74
+ const eventEnd = event.end || eventStart;
75
+ const startOfView = dateFns.setMinutes(dateFns.setHours(dateFns.startOfDay(eventStart), dayStart.hour), dayStart.minute);
76
+ const endOfView = dateFns.setMinutes(dateFns.setHours(dateFns.startOfMinute(eventStart), dayEnd.hour), dayEnd.minute);
77
+ return dateFns.isAfter(eventEnd, startOfView) && dateFns.isBefore(eventStart, endOfView);
78
+ });
79
+ }
80
+ function getWeekDay({ date }) {
81
+ const today = dateFns.startOfDay(new Date());
82
+ return {
83
+ date,
84
+ isPast: date < today,
85
+ isToday: dateFns.isSameDay(date, today),
86
+ isFuture: date > today,
87
+ isWeekend: WEEKEND_DAY_NUMBERS.indexOf(dateFns.getDay(date)) > -1,
88
+ };
89
+ }
90
+ export function getWeekViewHeader({ viewDate, weekStartsOn, excluded = [], }) {
91
+ const start = dateFns.startOfWeek(viewDate, { weekStartsOn });
92
+ const days = [];
93
+ for (let i = 0; i < DAYS_IN_WEEK; i++) {
94
+ const date = dateFns.addDays(start, i);
95
+ if (!excluded.some((e) => date.getDay() === e)) {
96
+ days.push(getWeekDay({ date }));
97
+ }
98
+ }
99
+ return days;
100
+ }
101
+ export function getWeekView({ events = [], viewDate, weekStartsOn, excluded = [], hourSegments, segmentHeight, dayStart, dayEnd, }) {
102
+ if (!events) {
103
+ events = [];
104
+ }
105
+ const startOfViewWeek = dateFns.startOfWeek(viewDate, { weekStartsOn });
106
+ const endOfViewWeek = dateFns.endOfWeek(viewDate, { weekStartsOn });
107
+ const maxRange = DAYS_IN_WEEK - excluded.length;
108
+ const eventsMapped = getEventsInTimeRange(getEventsInPeriod({ events, periodStart: startOfViewWeek, periodEnd: endOfViewWeek }), dayStart, dayEnd)
109
+ .map((event) => {
110
+ const offset = getWeekViewEventOffset({ event, startOfWeek: startOfViewWeek, excluded });
111
+ const span = 1; // getWeekViewEventSpan({ event, offset, startOfWeek: startOfViewWeek, excluded });
112
+ return { event, offset, span };
113
+ })
114
+ .filter((e) => e.offset < maxRange)
115
+ .filter((e) => e.span > 0)
116
+ .map((entry) => ({
117
+ event: entry.event,
118
+ offset: entry.offset,
119
+ span: entry.span,
120
+ startsBeforeWeek: entry.event.start < startOfViewWeek,
121
+ endsAfterWeek: (entry.event.end || entry.event.start) > endOfViewWeek,
122
+ top: 0,
123
+ }))
124
+ .sort((itemA, itemB) => {
125
+ const startSecondsDiff = dateFns.differenceInSeconds(itemA.event.start, itemB.event.start);
126
+ if (startSecondsDiff === 0) {
127
+ return dateFns.differenceInSeconds(itemB.event.end || itemB.event.start, itemA.event.end || itemA.event.start);
128
+ }
129
+ return startSecondsDiff;
130
+ })
131
+ .map((entry) => {
132
+ const startOfView = dateFns.setMinutes(dateFns.setHours(dateFns.startOfDay(entry.event.start), dayStart.hour), dayStart.minute);
133
+ const endOfView = dateFns.setMinutes(dateFns.setHours(dateFns.startOfMinute(dateFns.endOfDay(entry.event.start)), dayEnd.hour), dayEnd.minute);
134
+ const eventStart = entry.event.start;
135
+ const eventEnd = entry.event.end || eventStart;
136
+ const hourHeightModifier = (hourSegments * segmentHeight) / MINUTES_IN_HOUR;
137
+ if (eventStart > startOfView) {
138
+ entry.top += dateFns.differenceInMinutes(eventStart, startOfView);
139
+ }
140
+ entry.top *= hourHeightModifier;
141
+ const startsBeforeDay = eventStart < startOfView;
142
+ const endsAfterDay = eventEnd > endOfView;
143
+ const startDate = startsBeforeDay ? startOfView : eventStart;
144
+ const endDate = endsAfterDay ? endOfView : eventEnd;
145
+ let height = dateFns.differenceInMinutes(endDate, startDate);
146
+ if (!entry.event.end) {
147
+ height = segmentHeight;
148
+ }
149
+ else {
150
+ height *= hourHeightModifier;
151
+ }
152
+ entry.height = height;
153
+ return entry;
154
+ });
155
+ const eventRows = [];
156
+ const allocatedEvents = [];
157
+ eventsMapped.forEach((event, index) => {
158
+ if (allocatedEvents.indexOf(event) === -1) {
159
+ allocatedEvents.push(event);
160
+ const otherRowEvents = eventsMapped.slice(index + 1).filter((nextEvent) => {
161
+ return nextEvent.top === event.top && nextEvent.offset === event.offset;
162
+ });
163
+ if (otherRowEvents.length > 0) {
164
+ const totalEventsForRow = otherRowEvents.length + 1;
165
+ event.span = 1 / totalEventsForRow;
166
+ let nextOffset = event.span + event.offset;
167
+ otherRowEvents.forEach((nextEvent) => {
168
+ nextEvent.offset = nextOffset;
169
+ nextEvent.span = event.span;
170
+ nextOffset = nextEvent.span + nextEvent.offset;
171
+ });
172
+ allocatedEvents.push(...otherRowEvents);
173
+ }
174
+ eventRows.push({
175
+ row: [event, ...otherRowEvents],
176
+ });
177
+ }
178
+ });
179
+ return eventRows;
180
+ }
181
+ export function getMonthView({ events = [], viewDate, weekStartsOn, excluded = [], }) {
182
+ if (!events) {
183
+ events = [];
184
+ }
185
+ const start = dateFns.startOfWeek(dateFns.startOfMonth(viewDate), { weekStartsOn });
186
+ const end = dateFns.endOfWeek(dateFns.endOfMonth(viewDate), { weekStartsOn });
187
+ const eventsInMonth = getEventsInPeriod({
188
+ events,
189
+ periodStart: start,
190
+ periodEnd: end,
191
+ });
192
+ const days = [];
193
+ for (let i = 0; i < dateFns.differenceInDays(end, start) + 1; i++) {
194
+ const date = dateFns.addDays(start, i);
195
+ if (!excluded.some((e) => date.getDay() === e)) {
196
+ const day = getWeekDay({ date });
197
+ const calEvents = getEventsInPeriod({
198
+ events: eventsInMonth,
199
+ periodStart: dateFns.startOfDay(date),
200
+ periodEnd: dateFns.endOfDay(date),
201
+ });
202
+ day.inMonth = dateFns.isSameMonth(date, viewDate);
203
+ day.events = calEvents;
204
+ day.badgeTotal = calEvents.length;
205
+ days.push(day);
206
+ }
207
+ }
208
+ const totalDaysVisibleInWeek = DAYS_IN_WEEK - excluded.length;
209
+ const rows = Math.floor(days.length / totalDaysVisibleInWeek);
210
+ const rowOffsets = [];
211
+ for (let i = 0; i < rows; i++) {
212
+ rowOffsets.push(i * totalDaysVisibleInWeek);
213
+ }
214
+ return {
215
+ rowOffsets,
216
+ totalDaysVisibleInWeek,
217
+ days,
218
+ };
219
+ }
220
+ export function getDayView({ events = [], viewDate, hourSegments, dayStart, dayEnd, eventWidth, segmentHeight }) {
221
+ if (!events) {
222
+ events = [];
223
+ }
224
+ const startOfView = dateFns.setMinutes(dateFns.setHours(dateFns.startOfDay(viewDate), dayStart.hour), dayStart.minute);
225
+ const endOfView = dateFns.setMinutes(dateFns.setHours(dateFns.startOfMinute(dateFns.endOfDay(viewDate)), dayEnd.hour), dayEnd.minute);
226
+ const previousDayEvents = [];
227
+ const dayViewEvents = getEventsInTimeRange(getEventsInPeriod({
228
+ events: events.filter((event) => !event.allDay),
229
+ periodStart: startOfView,
230
+ periodEnd: endOfView,
231
+ }), dayStart, dayEnd)
232
+ .sort((eventA, eventB) => {
233
+ return eventA.start.valueOf() - eventB.start.valueOf();
234
+ })
235
+ .map((event) => {
236
+ const eventStart = event.start;
237
+ const eventEnd = event.end || eventStart;
238
+ const startsBeforeDay = eventStart < startOfView;
239
+ const endsAfterDay = eventEnd > endOfView;
240
+ const hourHeightModifier = (hourSegments * segmentHeight) / MINUTES_IN_HOUR;
241
+ let top = 0;
242
+ if (eventStart > startOfView) {
243
+ top += dateFns.differenceInMinutes(eventStart, startOfView);
244
+ }
245
+ top *= hourHeightModifier;
246
+ const startDate = startsBeforeDay ? startOfView : eventStart;
247
+ const endDate = endsAfterDay ? endOfView : eventEnd;
248
+ let height = dateFns.differenceInMinutes(endDate, startDate);
249
+ if (!event.end) {
250
+ height = segmentHeight;
251
+ }
252
+ else {
253
+ height *= hourHeightModifier;
254
+ }
255
+ const bottom = top + height;
256
+ const overlappingPreviousEvents = previousDayEvents.filter((previousEvent) => {
257
+ const previousEventTop = previousEvent.top;
258
+ const previousEventBottom = previousEvent.top + previousEvent.height;
259
+ if (top < previousEventBottom && previousEventBottom < bottom) {
260
+ return true;
261
+ }
262
+ else if (previousEventTop <= top && bottom <= previousEventBottom) {
263
+ return true;
264
+ }
265
+ return false;
266
+ });
267
+ let left = 0;
268
+ while (overlappingPreviousEvents.some((previousEvent) => previousEvent.left === left)) {
269
+ left += eventWidth;
270
+ }
271
+ const dayEvent = {
272
+ event,
273
+ height,
274
+ width: eventWidth,
275
+ top,
276
+ left,
277
+ startsBeforeDay,
278
+ endsAfterDay,
279
+ };
280
+ if (height > 0) {
281
+ previousDayEvents.push(dayEvent);
282
+ }
283
+ return dayEvent;
284
+ })
285
+ .filter((dayEvent) => dayEvent.height > 0);
286
+ const width = Math.max(...dayViewEvents.map((event) => event.left + event.width));
287
+ const allDayEvents = getEventsInPeriod({
288
+ events: events.filter((event) => event.allDay),
289
+ periodStart: dateFns.startOfDay(startOfView),
290
+ periodEnd: dateFns.endOfDay(endOfView),
291
+ });
292
+ return {
293
+ events: dayViewEvents,
294
+ width,
295
+ allDayEvents,
296
+ };
297
+ }
298
+ export function getDayViewHourGrid({ viewDate, hourSegments, dayStart, dayEnd, }) {
299
+ const hours = [];
300
+ const startOfView = dateFns.setMinutes(dateFns.setHours(dateFns.startOfDay(viewDate), dayStart.hour), dayStart.minute);
301
+ const endOfView = dateFns.setMinutes(dateFns.setHours(dateFns.startOfMinute(dateFns.endOfDay(viewDate)), dayEnd.hour), dayEnd.minute);
302
+ const segmentDuration = MINUTES_IN_HOUR / hourSegments;
303
+ const startOfViewDay = dateFns.startOfDay(viewDate);
304
+ for (let i = 0; i < HOURS_IN_DAY; i++) {
305
+ const segments = [];
306
+ for (let j = 0; j < hourSegments; j++) {
307
+ const date = dateFns.addMinutes(dateFns.addHours(startOfViewDay, i), j * segmentDuration);
308
+ if (date >= startOfView && date < endOfView) {
309
+ segments.push({
310
+ date,
311
+ isStart: j === 0,
312
+ });
313
+ }
314
+ }
315
+ if (segments.length > 0) {
316
+ hours.push({ segments });
317
+ }
318
+ }
319
+ return hours;
320
+ }
321
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2FsZW5kYXJVdGlscy5qcyIsInNvdXJjZVJvb3QiOiIvaG9tZS9ydW5uZXIvd29yay9ub3ZvLWVsZW1lbnRzL25vdm8tZWxlbWVudHMvcHJvamVjdHMvbm92by1lbGVtZW50cy9zcmMvIiwic291cmNlcyI6WyJ1dGlscy9jYWxlbmRhci11dGlscy9DYWxlbmRhclV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sVUFBVSxDQUFDO0FBRXBDLE1BQU0sbUJBQW1CLEdBQWEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDN0MsTUFBTSxZQUFZLEdBQVcsQ0FBQyxDQUFDO0FBQy9CLE1BQU0sWUFBWSxHQUFXLEVBQUUsQ0FBQztBQUNoQyxNQUFNLGVBQWUsR0FBVyxFQUFFLENBQUM7QUFFbkMsTUFBTSxDQUFOLElBQVkscUJBSVg7QUFKRCxXQUFZLHFCQUFxQjtJQUMvQixtRUFBSyxDQUFBO0lBQ0wseUVBQVEsQ0FBQTtJQUNSLHlFQUFRLENBQUE7QUFDVixDQUFDLEVBSlcscUJBQXFCLEtBQXJCLHFCQUFxQixRQUloQztBQWdJRCxTQUFTLGVBQWUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUF5RDtJQUMzRyxJQUFJLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1FBQ3ZCLE9BQU8sQ0FBQyxDQUFDO0tBQ1Y7SUFDRCxJQUFJLEdBQUcsR0FBVyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDckMsSUFBSSxNQUFNLEdBQVcsQ0FBQyxDQUFDO0lBQ3ZCLEtBQUssSUFBSSxDQUFDLEdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDckMsSUFBSSxHQUFHLEtBQUssWUFBWSxFQUFFO1lBQ3hCLEdBQUcsR0FBRyxDQUFDLENBQUM7U0FDVDtRQUNELElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFF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WixJQUFJO29CQUNKLE9BQU8sRUFBRSxDQUFDLEtBQUssQ0FBQztpQkFDakIsQ0FBQyxDQUFDO2FBQ0o7U0FDRjtRQUNELElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDdkIsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7U0FDMUI7S0FDRjtJQUVELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGRhdGVGbnMgZnJvbSAnZGF0ZS1mbnMnO1xuXG5jb25zdCBXRUVLRU5EX0RBWV9OVU1CRVJTOiBudW1iZXJbXSA9IFswLCA2XTtcbmNvbnN0IERBWVNfSU5fV0VFSzogbnVtYmVyID0gNztcbmNvbnN0IEhPVVJTX0lOX0RBWTogbnVtYmVyID0gMjQ7XG5jb25zdCBNSU5VVEVTX0lOX0hPVVI6IG51bWJlciA9IDYwO1xuXG5leHBvcnQgZW51bSBDYWxlbmRhckV2ZW50UmVzcG9uc2Uge1xuICBNYXliZSxcbiAgQWNjZXB0ZWQsXG4gIFJlamVjdGVkLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIENhbGVuZGFyRXZlbnRUaW1lc0NoYW5nZWRFdmVudCB7XG4gIGV2ZW50OiBDYWxlbmRhckV2ZW50O1xuICBuZXdTdGFydDogRGF0ZTtcbiAgbmV3RW5kPzogRGF0ZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBXZWVrRGF5IHtcbiAgZGF0ZTogRGF0ZTtcbiAgaXNQYXN0OiBib29sZWFuO1xuICBpc1RvZGF5OiBib29sZWFuO1xuICBpc0Z1dHVyZTogYm9vbGVhbjtcbiAgaXNXZWVrZW5kOiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV2ZW50Q29sb3Ige1xuICBwcmltYXJ5OiBzdHJpbmc7XG4gIHNlY29uZGFyeTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV2ZW50QWN0aW9uIHtcbiAgbGFiZWw6IHN0cmluZztcbiAgY3NzQ2xhc3M/OiBzdHJpbmc7XG4gIG9uQ2xpY2soeyBldmVudCB9OiB7IGV2ZW50OiBDYWxlbmRhckV2ZW50IH0pOiBhbnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2FsZW5kYXJFdmVudCB7XG4gIGlkPzogbnVtYmVyO1xuICBzdGFydDogRGF0ZTtcbiAgZW5kPzogRGF0ZTtcbiAgdGl0bGU6IHN0cmluZztcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIGNvbG9yOiBFdmVudENvbG9yO1xuICB0eXBlPzogc3RyaW5nO1xuICByZXNwb25zZT86IENhbGVuZGFyRXZlbnRSZXNwb25zZTtcbiAgYWN0aW9ucz86IEV2ZW50QWN0aW9uW107XG4gIGFsbERheT86IGJvb2xlYW47XG4gIGNzc0NsYXNzPzogc3RyaW5nO1xuICByZXNpemFibGU/OiB7XG4gICAgYmVmb3JlU3RhcnQ/OiBib29sZWFuO1xuICAgIGFmdGVyRW5kPzogYm9vbGVhbjtcbiAgfTtcbiAgZHJhZ2dhYmxlPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBXZWVrVmlld0V2ZW50IHtcbiAgZXZlbnQ6IENhbGVuZGFyRXZlbnQ7XG4gIG9mZnNldDogbnVtYmVyO1xuICBzcGFuOiBudW1iZXI7XG4gIHN0YXJ0c0JlZm9yZVdlZWs6IGJvb2xlYW47XG4gIGVuZHNBZnRlcldlZWs6IGJvb2xlYW47XG4gIHRvcD86IG51bWJlcjtcbiAgaGVpZ2h0PzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFdlZWtWaWV3RXZlbnRSb3cge1xuICByb3c6IFdlZWtWaWV3RXZlbnRbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNb250aFZpZXdEYXkgZXh0ZW5kcyBXZWVrRGF5IHtcbiAgaW5Nb250aDogYm9vbGVhbjtcbiAgZXZlbnRzOiBDYWxlbmRhckV2ZW50W107XG4gIGJhY2tncm91bmRDb2xvcj86IHN0cmluZztcbiAgY3NzQ2xhc3M/OiBzdHJpbmc7XG4gIGJhZGdlVG90YWw6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNb250aFZpZXcge1xuICByb3dPZmZzZXRzOiBudW1iZXJbXTtcbiAgZGF5czogTW9udGhWaWV3RGF5W107XG4gIHRvdGFsRGF5c1Zpc2libGVJbldlZWs6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEYXlWaWV3RXZlbnQge1xuICBldmVudDogQ2FsZW5kYXJFdmVudDtcbiAgaGVpZ2h0OiBudW1iZXI7XG4gIHdpZHRoOiBudW1iZXI7XG4gIHRvcDogbnVtYmVyO1xuICBsZWZ0OiBudW1iZXI7XG4gIHN0YXJ0c0JlZm9yZURheTogYm9vbGVhbjtcbiAgZW5kc0FmdGVyRGF5OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERheVZpZXcge1xuICBldmVudHM6IERheVZpZXdFdmVudFtdO1xuICB3aWR0aDogbnVtYmVyO1xuICBhbGxEYXlFdmVudHM6IENhbGVuZGFyRXZlbnRbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEYXlWaWV3SG91clNlZ21lbnQge1xuICBpc1N0YXJ0OiBib29sZWFuO1xuICBkYXRlOiBEYXRlO1xuICBjc3NDbGFzcz86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEYXlWaWV3SG91ciB7XG4gIHNlZ21lbnRzOiBEYXlWaWV3SG91clNlZ21lbnRbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJc0V2ZW50SW5QZXJpb2RBcmdzIHtcbiAgZXZlbnQ6IENhbGVuZGFyRXZlbnQ7XG4gIHBlcmlvZFN0YXJ0OiBEYXRlO1xuICBwZXJpb2RFbmQ6IERhdGU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2V0RXZlbnRzSW5QZXJpb2RBcmdzIHtcbiAgZXZlbnRzOiBDYWxlbmRhckV2ZW50W107XG4gIHBlcmlvZFN0YXJ0OiBEYXRlO1xuICBwZXJpb2RFbmQ6IERhdGU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2V0RGF5Vmlld0FyZ3Mge1xuICBldmVudHM/OiBDYWxlbmRhckV2ZW50W107XG4gIHZpZXdEYXRlOiBEYXRlO1xuICBob3VyU2VnbWVudHM6IG51bWJlcjtcbiAgZGF5U3RhcnQ6IHtcbiAgICBob3VyOiBudW1iZXI7XG4gICAgbWludXRlOiBudW1iZXI7XG4gIH07XG4gIGRheUVuZDoge1xuICAgIGhvdXI6IG51bWJlcjtcbiAgICBtaW51dGU6IG51bWJlcjtcbiAgfTtcbiAgZXZlbnRXaWR0aDogbnVtYmVyO1xuICBzZWdtZW50SGVpZ2h0OiBudW1iZXI7XG59XG5cbmZ1bmN0aW9uIGdldEV4Y2x1ZGVkRGF5cyh7IHN0YXJ0RGF0ZSwgZGF5cywgZXhjbHVkZWQgfTogeyBzdGFydERhdGU6IERhdGU7IGRheXM6IG51bWJlcjsgZXhjbHVkZWQ6IG51bWJlcltdIH0pOiBudW1iZXIge1xuICBpZiAoZXhjbHVkZWQubGVuZ3RoIDwgMSkge1xuICAgIHJldHVybiAwO1xuICB9XG4gIGxldCBkYXk6IG51bWJlciA9IHN0YXJ0RGF0ZS5nZXREYXkoKTtcbiAgbGV0IHJlZHVjZTogbnVtYmVyID0gMDtcbiAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IGRheXM7IGkrKykge1xuICAgIGlmIChkYXkgPT09IERBWVNfSU5fV0VFSykge1xuICAgICAgZGF5ID0gMDtcbiAgICB9XG4gICAgaWYgKGV4Y2x1ZGVkLnNvbWUoKGUpID0+IGUgPT09IGRheSkpIHtcbiAgICAgIHJlZHVjZSsrO1xuICAgIH1cbiAgICBkYXkrKztcbiAgfVxuICByZXR1cm4gcmVkdWNlO1xufVxuXG5mdW5jdGlvbiBnZXRXZWVrVmlld0V2ZW50U3Bhbih7XG4gIGV2ZW50LFxuICBvZmZzZXQsXG4gIHN0YXJ0T2ZXZWVrLFxuICBleGNsdWRlZCxcbn06IHtcbiAgZXZlbnQ6IENhbGVuZGFyRXZlbnQ7XG4gIG9mZnNldDogbnVtYmVyO1xuICBzdGFydE9mV2VlazogRGF0ZTtcbiAgZXhjbHVkZWQ6IG51bWJlcltdO1xufSk6IG51bWJlciB7XG4gIGNvbnN0IGJlZ2luOiBEYXRlID0gZXZlbnQuc3RhcnQgPCBzdGFydE9mV2VlayA/IHN0YXJ0T2ZXZWVrIDogZXZlbnQuc3RhcnQ7XG4gIGxldCBzcGFuOiBudW1iZXIgPSAxO1xuICBpZiAoZXZlbnQuZW5kKSB7XG4gICAgc3BhbiA9IGRhdGVGbnMuZGlmZmVyZW5jZUluRGF5cyhkYXRlRm5zLmFkZE1pbnV0ZXMoZGF0ZUZucy5lbmRPZkRheShldmVudC5lbmQpLCAxKSwgZGF0ZUZucy5zdGFydE9mRGF5KGJlZ2luKSk7XG4gIH1cbiAgY29uc3QgdG90YWxMZW5ndGg6IG51bWJlciA9IG9mZnNldCArIHNwYW47XG4gIGlmICh0b3RhbExlbmd0aCA+IERBWVNfSU5fV0VFSykge1xuICAgIHNwYW4gPSBEQVlTX0lOX1dFRUsgLSBvZmZzZXQ7XG4gIH1cbiAgcmV0dXJuIHNwYW4gLSBnZXRFeGNsdWRlZERheXMoeyBzdGFydERhdGU6IGJlZ2luLCBkYXlzOiBzcGFuLCBleGNsdWRlZCB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFdlZWtWaWV3RXZlbnRPZmZzZXQoe1xuICBldmVudCxcbiAgc3RhcnRPZldlZWssXG4gIGV4Y2x1ZGVkID0gW10sXG59OiB7XG4gIGV2ZW50OiBDYWxlbmRhckV2ZW50O1xuICBzdGFydE9mV2VlazogRGF0ZTtcbiAgZXhjbHVkZWQ/OiBudW1iZXJbXTtcbn0pOiBudW1iZXIge1xuICBpZiAoZXZlbnQuc3RhcnQgPCBzdGFydE9mV2Vlaykge1xuICAgIHJldHVybiAwO1xuICB9XG4gIGNvbnN0IGRpc3RhbmNlOiBudW1iZXIgPSBkYXRlRm5zLmRpZmZlcmVuY2VJbkRheXMoZXZlbnQuc3RhcnQsIHN0YXJ0T2ZXZWVrKTtcbiAgcmV0dXJuIGRpc3RhbmNlIC0gZ2V0RXhjbHVkZWREYXlzKHsgc3RhcnREYXRlOiBzdGFydE9mV2VlaywgZGF5czogZGlzdGFuY2UsIGV4Y2x1ZGVkIH0pO1xufVxuXG5mdW5jdGlvbiBpc0V2ZW50SXNQZXJpb2QoeyBldmVudCwgcGVyaW9kU3RhcnQsIHBlcmlvZEVuZCB9OiBJc0V2ZW50SW5QZXJpb2RBcmdzKTogYm9vbGVhbiB7XG4gIGNvbnN0IGV2ZW50U3RhcnQ6IERhdGUgPSBldmVudC5zdGFydDtcbiAgY29uc3QgZXZlbnRFbmQ6IERhdGUgPSBldmVudC5lbmQgfHwgZXZlbnQuc3RhcnQ7XG5cbiAgaWYgKGV2ZW50U3RhcnQgPiBwZXJpb2RTdGFydCAmJiBldmVudFN0YXJ0IDwgcGVyaW9kRW5kKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoZXZlbnRFbmQgPiBwZXJpb2RTdGFydCAmJiBldmVudEVuZCA8IHBlcmlvZEVuZCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKGV2ZW50U3RhcnQgPCBwZXJpb2RTdGFydCAmJiBldmVudEVuZCA+IHBlcmlvZEVuZCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKGRhdGVGbnMuaXNTYW1lU2Vjb25kKGV2ZW50U3RhcnQsIHBlcmlvZFN0YXJ0KSB8fCBkYXRlRm5zLmlzU2FtZVNlY29uZChldmVudFN0YXJ0LCBwZXJpb2RFbmQpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoZGF0ZUZucy5pc1NhbWVTZWNvbmQoZXZlbnRFbmQsIHBlcmlvZFN0YXJ0KSB8fCBkYXRlRm5zLmlzU2FtZVNlY29uZChldmVudEVuZCwgcGVyaW9kRW5kKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBnZXRFdmVudHNJblBlcmlvZCh7IGV2ZW50cywgcGVyaW9kU3RhcnQsIHBlcmlvZEVuZCB9OiBHZXRFdmVudHNJblBlcmlvZEFyZ3MpOiBDYWxlbmRhckV2ZW50W10ge1xuICByZXR1cm4gZXZlbnRzLmZpbHRlcigoZXZlbnQ6IENhbGVuZGFyRXZlbnQpID0+IGlzRXZlbnRJc1BlcmlvZCh7IGV2ZW50LCBwZXJpb2RTdGFydCwgcGVyaW9kRW5kIH0pKTtcbn1cblxuZnVuY3Rpb24gZ2V0RXZlbnRzSW5UaW1lUmFuZ2UoZXZlbnRzOiBDYWxlbmRhckV2ZW50W10sIGRheVN0YXJ0OiBhbnksIGRheUVuZDogYW55KSB7XG4gIHJldHVybiBldmVudHMuZmlsdGVyKChldmVudCkgPT4ge1xuICAgIGNvbnN0IGV2ZW50U3RhcnQ6IERhdGUgPSBldmVudC5zdGFydDtcbiAgICBjb25zdCBldmVudEVuZDogRGF0ZSA9IGV2ZW50LmVuZCB8fCBldmVudFN0YXJ0O1xuXG4gICAgY29uc3Qgc3RhcnRPZlZpZXc6IERhdGUgPSBkYXRlRm5zLnNldE1pbnV0ZXMoZGF0ZUZucy5zZXRIb3VycyhkYXRlRm5zLnN0YXJ0T2ZEYXkoZXZlbnRTdGFydCksIGRheVN0YXJ0LmhvdXIpLCBkYXlTdGFydC5taW51dGUpO1xuICAgIGNvbnN0IGVuZE9mVmlldzogRGF0ZSA9IGRhdGVGbnMuc2V0TWludXRlcyhkYXRlRm5zLnNldEhvdXJzKGRhdGVGbnMuc3RhcnRPZk1pbnV0ZShldmVudFN0YXJ0KSwgZGF5RW5kLmhvdXIpLCBkYXlFbmQubWludXRlKTtcblxuICAgIHJldHVybiBkYXRlRm5zLmlzQWZ0ZXIoZXZlbnRFbmQsIHN0YXJ0T2ZWaWV3KSAmJiBkYXRlRm5zLmlzQmVmb3JlKGV2ZW50U3RhcnQsIGVuZE9mVmlldyk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRXZWVrRGF5KHsgZGF0ZSB9OiB7IGRhdGU6IERhdGUgfSk6IFdlZWtEYXkge1xuICBjb25zdCB0b2RheTogRGF0ZSA9IGRhdGVGbnMuc3RhcnRPZkRheShuZXcgRGF0ZSgpKTtcbiAgcmV0dXJuIHtcbiAgICBkYXRlLFxuICAgIGlzUGFzdDogZGF0ZSA8IHRvZGF5LFxuICAgIGlzVG9kYXk6IGRhdGVGbnMuaXNTYW1lRGF5KGRhdGUsIHRvZGF5KSxcbiAgICBpc0Z1dHVyZTogZGF0ZSA+IHRvZGF5LFxuICAgIGlzV2Vla2VuZDogV0VFS0VORF9EQVlfTlVNQkVSUy5pbmRleE9mKGRhdGVGbnMuZ2V0RGF5KGRhdGUpKSA+IC0xLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0V2Vla1ZpZXdIZWFkZXIoe1xuICB2aWV3RGF0ZSxcbiAgd2Vla1N0YXJ0c09uLFxuICBleGNsdWRlZCA9IFtdLFxufToge1xuICB2aWV3RGF0ZTogRGF0ZTtcbiAgd2Vla1N0YXJ0c09uOiBudW1iZXI7XG4gIGV4Y2x1ZGVkPzogbnVtYmVyW107XG59KTogV2Vla0RheVtdIHtcbiAgY29uc3Qgc3RhcnQ6IERhdGUgPSBkYXRlRm5zLnN0YXJ0T2ZXZWVrKHZpZXdEYXRlLCB7IHdlZWtTdGFydHNPbiB9KTtcbiAgY29uc3QgZGF5czogV2Vla0RheVtdID0gW107XG4gIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBEQVlTX0lOX1dFRUs7IGkrKykge1xuICAgIGNvbnN0IGRhdGU6IERhdGUgPSBkYXRlRm5zLmFkZERheXMoc3RhcnQsIGkpO1xuICAgIGlmICghZXhjbHVkZWQuc29tZSgoZSkgPT4gZGF0ZS5nZXREYXkoKSA9PT0gZSkpIHtcbiAgICAgIGRheXMucHVzaChnZXRXZWVrRGF5KHsgZGF0ZSB9KSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGRheXM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRXZWVrVmlldyh7XG4gIGV2ZW50cyA9IFtdLFxuICB2aWV3RGF0ZSxcbiAgd2Vla1N0YXJ0c09uLFxuICBleGNsdWRlZCA9IFtdLFxuICBob3VyU2VnbWVudHMsXG4gIHNlZ21lbnRIZWlnaHQsXG4gIGRheVN0YXJ0LFxuICBkYXlFbmQsXG59OiB7XG4gIGV2ZW50cz86IENhbGVuZGFyRXZlbnRbXTtcbiAgdmlld0RhdGU6IERhdGU7XG4gIHdlZWtTdGFydHNPbjogbnVtYmVyO1xuICBleGNsdWRlZD86IG51bWJlcltdO1xuICBob3VyU2VnbWVudHM6IG51bWJlcjtcbiAgc2VnbWVudEhlaWdodDogbnVtYmVyO1xuICBkYXlTdGFydDogYW55O1xuICBkYXlFbmQ6IGFueTtcbn0pOiBXZWVrVmlld0V2ZW50Um93W10ge1xuICBpZiAoIWV2ZW50cykge1xuICAgIGV2ZW50cyA9IFtdO1xuICB9XG5cbiAgY29uc3Qgc3RhcnRPZlZpZXdXZWVrOiBEYXRlID0gZGF0ZUZucy5zdGFydE9mV2Vlayh2aWV3RGF0ZSwgeyB3ZWVrU3RhcnRzT24gfSk7XG4gIGNvbnN0IGVuZE9mVmlld1dlZWs6IERhdGUgPSBkYXRlRm5zLmVuZE9mV2Vlayh2aWV3RGF0ZSwgeyB3ZWVrU3RhcnRzT24gfSk7XG4gIGNvbnN0IG1heFJhbmdlOiBudW1iZXIgPSBEQVlTX0lOX1dFRUsgLSBleGNsdWRlZC5sZW5ndGg7XG5cbiAgY29uc3QgZXZlbnRzTWFwcGVkOiBXZWVrVmlld0V2ZW50W10gPSBnZXRFdmVudHNJblRpbWVSYW5nZShcbiAgICBnZXRFdmVudHNJblBlcmlvZCh7IGV2ZW50cywgcGVyaW9kU3RhcnQ6IHN0YXJ0T2ZWaWV3V2VlaywgcGVyaW9kRW5kOiBlbmRPZlZpZXdXZWVrIH0pLFxuICAgIGRheVN0YXJ0LFxuICAgIGRheUVuZCxcbiAgKVxuICAgIC5tYXAoKGV2ZW50KSA9PiB7XG4gICAgICBjb25zdCBvZmZzZXQ6IG51bWJlciA9IGdldFdlZWtWaWV3RXZlbnRPZmZzZXQoeyBldmVudCwgc3RhcnRPZldlZWs6IHN0YXJ0T2ZWaWV3V2VlaywgZXhjbHVkZWQgfSk7XG4gICAgICBjb25zdCBzcGFuOiBudW1iZXIgPSAxOyAvLyBnZXRXZWVrVmlld0V2ZW50U3Bhbih7IGV2ZW50LCBvZmZzZXQsIHN0YXJ0T2ZXZWVrOiBzdGFydE9mVmlld1dlZWssIGV4Y2x1ZGVkIH0pO1xuICAgICAgcmV0dXJuIHsgZXZlbnQsIG9mZnNldCwgc3BhbiB9O1xuICAgIH0pXG4gICAgLmZpbHRlcigoZSkgPT4gZS5vZmZzZXQgPCBtYXhSYW5nZSlcbiAgICAuZmlsdGVyKChlKSA9PiBlLnNwYW4gPiAwKVxuICAgIC5tYXAoKGVudHJ5KSA9PiAoe1xuICAgICAgZXZlbnQ6IGVudHJ5LmV2ZW50LFxuICAgICAgb2Zmc2V0OiBlbnRyeS5vZmZzZXQsXG4gICAgICBzcGFuOiBlbnRyeS5zcGFuLFxuICAgICAgc3RhcnRzQmVmb3JlV2VlazogZW50cnkuZXZlbnQuc3RhcnQgPCBzdGFydE9mVmlld1dlZWssXG4gICAgICBlbmRzQWZ0ZXJXZWVrOiAoZW50cnkuZXZlbnQuZW5kIHx8IGVudHJ5LmV2ZW50LnN0YXJ0KSA+IGVuZE9mVmlld1dlZWssXG4gICAgICB0b3A6IDAsXG4gICAgfSkpXG4gICAgLnNvcnQoXG4gICAgICAoaXRlbUEsIGl0ZW1CKTogbnVtYmVyID0+IHtcbiAgICAgICAgY29uc3Qgc3RhcnRTZWNvbmRzRGlmZjogbnVtYmVyID0gZGF0ZUZucy5kaWZmZXJlbmNlSW5TZWNvbmRzKGl0ZW1BLmV2ZW50LnN0YXJ0LCBpdGVtQi5ldmVudC5zdGFydCk7XG4gICAgICAgIGlmIChzdGFydFNlY29uZHNEaWZmID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIGRhdGVGbnMuZGlmZmVyZW5jZUluU2Vjb25kcyhpdGVtQi5ldmVudC5lbmQgfHwgaXRlbUIuZXZlbnQuc3RhcnQsIGl0ZW1BLmV2ZW50LmVuZCB8fCBpdGVtQS5ldmVudC5zdGFydCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0YXJ0U2Vjb25kc0RpZmY7XG4gICAgICB9LFxuICAgIClcbiAgICAubWFwKChlbnRyeTogV2Vla1ZpZXdFdmVudCkgPT4ge1xuICAgICAgY29uc3Qgc3RhcnRPZlZpZXc6IERhdGUgPSBkYXRlRm5zLnNldE1pbnV0ZXMoZGF0ZUZucy5zZXRIb3VycyhkYXRlRm5zLnN0YXJ0T2ZEYXkoZW50cnkuZXZlbnQuc3RhcnQpLCBkYXlTdGFydC5ob3VyKSwgZGF5U3RhcnQubWludXRlKTtcbiAgICAgIGNvbnN0IGVuZE9mVmlldzogRGF0ZSA9IGRhdGVGbnMuc2V0TWludXRlcyhcbiAgICAgICAgZGF0ZUZucy5zZXRIb3VycyhkYXRlRm5zLnN0YXJ0T2ZNaW51dGUoZGF0ZUZucy5lbmRPZkRheShlbnRyeS5ldmVudC5zdGFydCkpLCBkYXlFbmQuaG91ciksXG4gICAgICAgIGRheUVuZC5taW51dGUsXG4gICAgICApO1xuXG4gICAgICBjb25zdCBldmVudFN0YXJ0OiBEYXRlID0gZW50cnkuZXZlbnQuc3RhcnQ7XG4gICAgICBjb25zdCBldmVudEVuZDogRGF0ZSA9IGVudHJ5LmV2ZW50LmVuZCB8fCBldmVudFN0YXJ0O1xuXG4gICAgICBjb25zdCBob3VySGVpZ2h0TW9kaWZpZXI6IG51bWJlciA9IChob3VyU2VnbWVudHMgKiBzZWdtZW50SGVpZ2h0KSAvIE1JTlVURVNfSU5fSE9VUjtcblxuICAgICAgaWYgKGV2ZW50U3RhcnQgPiBzdGFydE9mVmlldykge1xuICAgICAgICBlbnRyeS50b3AgKz0gZGF0ZUZucy5kaWZmZXJlbmNlSW5NaW51dGVzKGV2ZW50U3RhcnQsIHN0YXJ0T2ZWaWV3KTtcbiAgICAgIH1cblxuICAgICAgZW50cnkudG9wICo9IGhvdXJIZWlnaHRNb2RpZmllcjtcblxuICAgICAgY29uc3Qgc3RhcnRzQmVmb3JlRGF5OiBib29sZWFuID0gZXZlbnRTdGFydCA8IHN0YXJ0T2ZWaWV3O1xuICAgICAgY29uc3QgZW5kc0FmdGVyRGF5OiBib29sZWFuID0gZXZlbnRFbmQgPiBlbmRPZlZpZXc7XG5cbiAgICAgIGNvbnN0IHN0YXJ0RGF0ZTogRGF0ZSA9IHN0YXJ0c0JlZm9yZURheSA/IHN0YXJ0T2ZWaWV3IDogZXZlbnRTdGFydDtcbiAgICAgIGNvbnN0IGVuZERhdGU6IERhdGUgPSBlbmRzQWZ0ZXJEYXkgPyBlbmRPZlZpZXcgOiBldmVudEVuZDtcblxuICAgICAgbGV0IGhlaWdodDogbnVtYmVyID0gZGF0ZUZucy5kaWZmZXJlbmNlSW5NaW51dGVzKGVuZERhdGUsIHN0YXJ0RGF0ZSk7XG5cbiAgICAgIGlmICghZW50cnkuZXZlbnQuZW5kKSB7XG4gICAgICAgIGhlaWdodCA9IHNlZ21lbnRIZWlnaHQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBoZWlnaHQgKj0gaG91ckhlaWdodE1vZGlmaWVyO1xuICAgICAgfVxuXG4gICAgICBlbnRyeS5oZWlnaHQgPSBoZWlnaHQ7XG5cbiAgICAgIHJldHVybiBlbnRyeTtcbiAgICB9KTtcblxuICBjb25zdCBldmVudFJvd3M6IFdlZWtWaWV3RXZlbnRSb3dbXSA9IFtdO1xuICBjb25zdCBhbGxvY2F0ZWRFdmVudHM6IFdlZWtWaWV3RXZlbnRbXSA9IFtdO1xuXG4gIGV2ZW50c01hcHBlZC5mb3JFYWNoKChldmVudDogV2Vla1ZpZXdFdmVudCwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgIGlmIChhbGxvY2F0ZWRFdmVudHMuaW5kZXhPZihldmVudCkgPT09IC0xKSB7XG4gICAgICBhbGxvY2F0ZWRFdmVudHMucHVzaChldmVudCk7XG5cbiAgICAgIGNvbnN0IG90aGVyUm93RXZlbnRzOiBXZWVrVmlld0V2ZW50W10gPSBldmVudHNNYXBwZWQuc2xpY2UoaW5kZXggKyAxKS5maWx0ZXIoKG5leHRFdmVudCkgPT4ge1xuICAgICAgICByZXR1cm4gbmV4dEV2ZW50LnRvcCA9PT0gZXZlbnQudG9wICYmIG5leHRFdmVudC5vZmZzZXQgPT09IGV2ZW50Lm9mZnNldDtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAob3RoZXJSb3dFdmVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCB0b3RhbEV2ZW50c0ZvclJvdyA9IG90aGVyUm93RXZlbnRzLmxlbmd0aCArIDE7XG5cbiAgICAgICAgZXZlbnQuc3BhbiA9IDEgLyB0b3RhbEV2ZW50c0ZvclJvdztcblxuICAgICAgICBsZXQgbmV4dE9mZnNldCA9IGV2ZW50LnNwYW4gKyBldmVudC5vZmZzZXQ7XG5cbiAgICAgICAgb3RoZXJSb3dFdmVudHMuZm9yRWFjaCgobmV4dEV2ZW50OiBXZWVrVmlld0V2ZW50KSA9PiB7XG4gICAgICAgICAgbmV4dEV2ZW50Lm9mZnNldCA9IG5leHRPZmZzZXQ7XG4gICAgICAgICAgbmV4dEV2ZW50LnNwYW4gPSBldmVudC5zcGFuO1xuICAgICAgICAgIG5leHRPZmZzZXQgPSBuZXh0RXZlbnQuc3BhbiArIG5leHRFdmVudC5vZmZzZXQ7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGFsbG9jYXRlZEV2ZW50cy5wdXNoKC4uLm90aGVyUm93RXZlbnRzKTtcbiAgICAgIH1cblxuICAgICAgZXZlbnRSb3dzLnB1c2goe1xuICAgICAgICByb3c6IFtldmVudCwgLi4ub3RoZXJSb3dFdmVudHNdLFxuICAgICAgfSk7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gZXZlbnRSb3dzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TW9udGhWaWV3KHtcbiAgZXZlbnRzID0gW10sXG4gIHZpZXdEYXRlLFxuICB3ZWVrU3RhcnRzT24sXG4gIGV4Y2x1ZGVkID0gW10sXG59OiB7XG4gIGV2ZW50cz86IENhbGVuZGFyRXZlbnRbXTtcbiAgdmlld0RhdGU6IERhdGU7XG4gIHdlZWtTdGFydHNPbjogbnVtYmVyO1xuICBleGNsdWRlZD86IG51bWJlcltdO1xufSk6IE1vbnRoVmlldyB7XG4gIGlmICghZXZlbnRzKSB7XG4gICAgZXZlbnRzID0gW107XG4gIH1cblxuICBjb25zdCBzdGFydDogRGF0ZSA9IGRhdGVGbnMuc3RhcnRPZldlZWsoZGF0ZUZucy5zdGFydE9mTW9udGgodmlld0RhdGUpLCB7IHdlZWtTdGFydHNPbiB9KTtcbiAgY29uc3QgZW5kOiBEYXRlID0gZGF0ZUZucy5lbmRPZldlZWsoZGF0ZUZucy5lbmRPZk1vbnRoKHZpZXdEYXRlKSwgeyB3ZWVrU3RhcnRzT24gfSk7XG4gIGNvbnN0IGV2ZW50c0luTW9udGg6IENhbGVuZGFyRXZlbnRbXSA9IGdldEV2ZW50c0luUGVyaW9kKHtcbiAgICBldmVudHMsXG4gICAgcGVyaW9kU3RhcnQ6IHN0YXJ0LFxuICAgIHBlcmlvZEVuZDogZW5kLFxuICB9KTtcbiAgY29uc3QgZGF5czogTW9udGhWaWV3RGF5W10gPSBbXTtcbiAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IGRhdGVGbnMuZGlmZmVyZW5jZUluRGF5cyhlbmQsIHN0YXJ0KSArIDE7IGkrKykge1xuICAgIGNvbnN0IGRhdGU6IERhdGUgPSBkYXRlRm5zLmFkZERheXMoc3RhcnQsIGkpO1xuICAgIGlmICghZXhjbHVkZWQuc29tZSgoZSkgPT4gZGF0ZS5nZXREYXkoKSA9PT0gZSkpIHtcbiAgICAgIGNvbnN0IGRheTogTW9udGhWaWV3RGF5ID0gZ2V0V2Vla0RheSh7IGRhdGUgfSkgYXMgTW9udGhWaWV3RGF5O1xuICAgICAgY29uc3QgY2FsRXZlbnRzOiBDYWxlbmRhckV2ZW50W10gPSBnZXRFdmVudHNJblBlcmlvZCh7XG4gICAgICAgIGV2ZW50czogZXZlbnRzSW5Nb250aCxcbiAgICAgICAgcGVyaW9kU3RhcnQ6IGRhdGVGbnMuc3RhcnRPZkRheShkYXRlKSxcbiAgICAgICAgcGVyaW9kRW5kOiBkYXRlRm5zLmVuZE9mRGF5KGRhdGUpLFxuICAgICAgfSk7XG4gICAgICBkYXkuaW5Nb250aCA9IGRhdGVGbnMuaXNTYW1lTW9udGgoZGF0ZSwgdmlld0RhdGUpO1xuICAgICAgZGF5LmV2ZW50cyA9IGNhbEV2ZW50cztcbiAgICAgIGRheS5iYWRnZVRvdGFsID0gY2FsRXZlbnRzLmxlbmd0aDtcbiAgICAgIGRheXMucHVzaChkYXkpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHRvdGFsRGF5c1Zpc2libGVJbldlZWs6IG51bWJlciA9IERBWVNfSU5fV0VFSyAtIGV4Y2x1ZGVkLmxlbmd0aDtcbiAgY29uc3Qgcm93czogbnVtYmVyID0gTWF0aC5mbG9vcihkYXlzLmxlbmd0aCAvIHRvdGFsRGF5c1Zpc2libGVJbldlZWspO1xuICBjb25zdCByb3dPZmZzZXRzOiBudW1iZXJbXSA9IFtdO1xuICBmb3IgKGxldCBpOiBudW1iZXIgPSAwOyBpIDwgcm93czsgaSsrKSB7XG4gICAgcm93T2Zmc2V0cy5wdXNoKGkgKiB0b3RhbERheXNWaXNpYmxlSW5XZWVrKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgcm93T2Zmc2V0cyxcbiAgICB0b3RhbERheXNWaXNpYmxlSW5XZWVrLFxuICAgIGRheXMsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREYXlWaWV3KHsgZXZlbnRzID0gW10sIHZpZXdEYXRlLCBob3VyU2VnbWVudHMsIGRheVN0YXJ0LCBkYXlFbmQsIGV2ZW50V2lkdGgsIHNlZ21lbnRIZWlnaHQgfTogR2V0RGF5Vmlld0FyZ3MpOiBEYXlWaWV3IHtcbiAgaWYgKCFldmVudHMpIHtcbiAgICBldmVudHMgPSBbXTtcbiAgfVxuXG4gIGNvbnN0IHN0YXJ0T2ZWaWV3OiBEYXRlID0gZGF0ZUZucy5zZXRNaW51dGVzKGRhdGVGbnMuc2V0SG91cnMoZGF0ZUZucy5zdGFydE9mRGF5KHZpZXdEYXRlKSwgZGF5U3RhcnQuaG91ciksIGRheVN0YXJ0Lm1pbnV0ZSk7XG4gIGNvbnN0IGVuZE9mVmlldzogRGF0ZSA9IGRhdGVGbnMuc2V0TWludXRlcyhcbiAgICBkYXRlRm5zLnNldEhvdXJzKGRhdGVGbnMuc3RhcnRPZk1pbnV0ZShkYXRlRm5zLmVuZE9mRGF5KHZpZXdEYXRlKSksIGRheUVuZC5ob3VyKSxcbiAgICBkYXlFbmQubWludXRlLFxuICApO1xuICBjb25zdCBwcmV2aW91c0RheUV2ZW50czogRGF5Vmlld0V2ZW50W10gPSBbXTtcblxuICBjb25zdCBkYXlWaWV3RXZlbnRzOiBEYXlWaWV3RXZlbnRbXSA9IGdldEV2ZW50c0luVGltZVJhbmdlKFxuICAgIGdldEV2ZW50c0luUGVyaW9kKHtcbiAgICAgIGV2ZW50czogZXZlbnRzLmZpbHRlcigoZXZlbnQ6IENhbGVuZGFyRXZlbnQpID0+ICFldmVudC5hbGxEYXkpLFxuICAgICAgcGVyaW9kU3RhcnQ6IHN0YXJ0T2ZWaWV3LFxuICAgICAgcGVyaW9kRW5kOiBlbmRPZlZpZXcsXG4gICAgfSksXG4gICAgZGF5U3RhcnQsXG4gICAgZGF5RW5kLFxuICApXG4gICAgLnNvcnQoKGV2ZW50QTogQ2FsZW5kYXJFdmVudCwgZXZlbnRCOiBDYWxlbmRhckV2ZW50KSA9PiB7XG4gICAgICByZXR1cm4gZXZlbnRBLnN0YXJ0LnZhbHVlT2YoKSAtIGV2ZW50Qi5zdGFydC52YWx1ZU9mKCk7XG4gICAgfSlcbiAgICAubWFwKChldmVudDogQ2FsZW5kYXJFdmVudCkgPT4ge1xuICAgICAgY29uc3QgZXZlbnRTdGFydDogRGF0ZSA9IGV2ZW50LnN0YXJ0O1xuICAgICAgY29uc3QgZXZlbnRFbmQ6IERhdGUgPSBldmVudC5lbmQgfHwgZXZlbnRTdGFydDtcbiAgICAgIGNvbnN0IHN0YXJ0c0JlZm9yZURheTogYm9vbGVhbiA9IGV2ZW50U3RhcnQgPCBzdGFydE9mVmlldztcbiAgICAgIGNvbnN0IGVuZHNBZnRlckRheTogYm9vbGVhbiA9IGV2ZW50RW5kID4gZW5kT2ZWaWV3O1xuICAgICAgY29uc3QgaG91ckhlaWdodE1vZGlmaWVyOiBudW1iZXIgPSAoaG91clNlZ21lbnRzICogc2VnbWVudEhlaWdodCkgLyBNSU5VVEVTX0lOX0hPVVI7XG5cbiAgICAgIGxldCB0b3A6IG51bWJlciA9IDA7XG5cbiAgICAgIGlmIChldmVudFN0YXJ0ID4gc3RhcnRPZlZpZXcpIHtcbiAgICAgICAgdG9wICs9IGRhdGVGbnMuZGlmZmVyZW5jZUluTWludXRlcyhldmVudFN0YXJ0LCBzdGFydE9mVmlldyk7XG4gICAgICB9XG5cbiAgICAgIHRvcCAqPSBob3VySGVpZ2h0TW9kaWZpZXI7XG5cbiAgICAgIGNvbnN0IHN0YXJ0RGF0ZTogRGF0ZSA9IHN0YXJ0c0JlZm9yZURheSA/IHN0YXJ0T2ZWaWV3IDogZXZlbnRTdGFydDtcbiAgICAgIGNvbnN0IGVuZERhdGU6IERhdGUgPSBlbmRzQWZ0ZXJEYXkgPyBlbmRPZlZpZXcgOiBldmVudEVuZDtcblxuICAgICAgbGV0IGhlaWdodDogbnVtYmVyID0gZGF0ZUZucy5kaWZmZXJlbmNlSW5NaW51dGVzKGVuZERhdGUsIHN0YXJ0RGF0ZSk7XG5cbiAgICAgIGlmICghZXZlbnQuZW5kKSB7XG4gICAgICAgIGhlaWdodCA9IHNlZ21lbnRIZWlnaHQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBoZWlnaHQgKj0gaG91ckhlaWdodE1vZGlmaWVyO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBib3R0b206IG51bWJlciA9IHRvcCArIGhlaWdodDtcblxuICAgICAgY29uc3Qgb3ZlcmxhcHBpbmdQcmV2aW91c0V2ZW50czogRGF5Vmlld0V2ZW50W10gPSBwcmV2aW91c0RheUV2ZW50cy5maWx0ZXIoKHByZXZpb3VzRXZlbnQ6IERheVZpZXdFdmVudCkgPT4ge1xuICAgICAgICBjb25zdCBwcmV2aW91c0V2ZW50VG9wOiBudW1iZXIgPSBwcmV2aW91c0V2ZW50LnRvcDtcbiAgICAgICAgY29uc3QgcHJldmlvdXNFdmVudEJvdHRvbTogbnVtYmVyID0gcHJldmlvdXNFdmVudC50b3AgKyBwcmV2aW91c0V2ZW50LmhlaWdodDtcblxuICAgICAgICBpZiAodG9wIDwgcHJldmlvdXNFdmVudEJvdHRvbSAmJiBwcmV2aW91c0V2ZW50Qm90dG9tIDwgYm90dG9tKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAocHJldmlvdXNFdmVudFRvcCA8PSB0b3AgJiYgYm90dG9tIDw9IHByZXZpb3VzRXZlbnRCb3R0b20pIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0pO1xuXG4gICAgICBsZXQgbGVmdDogbnVtYmVyID0gMDtcblxuICAgICAgd2hpbGUgKG92ZXJsYXBwaW5nUHJldmlvdXNFdmVudHMuc29tZSgocHJldmlvdXNFdmVudCkgPT4gcHJldmlvdXNFdmVudC5sZWZ0ID09PSBsZWZ0KSkge1xuICAgICAgICBsZWZ0ICs9IGV2ZW50V2lkdGg7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRheUV2ZW50OiBEYXlWaWV3RXZlbnQgPSB7XG4gICAgICAgIGV2ZW50LFxuICAgICAgICBoZWlnaHQsXG4gICAgICAgIHdpZHRoOiBldmVudFdpZHRoLFxuICAgICAgICB0b3AsXG4gICAgICAgIGxlZnQsXG4gICAgICAgIHN0YXJ0c0JlZm9yZURheSxcbiAgICAgICAgZW5kc0FmdGVyRGF5LFxuICAgICAgfTtcblxuICAgICAgaWYgKGhlaWdodCA+IDApIHtcbiAgICAgICAgcHJldmlvdXNEYXlFdmVudHMucHVzaChkYXlFdmVudCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBkYXlFdmVudDtcbiAgICB9KVxuICAgIC5maWx0ZXIoKGRheUV2ZW50OiBEYXlWaWV3RXZlbnQpID0+IGRheUV2ZW50LmhlaWdodCA+IDApO1xuXG4gIGNvbnN0IHdpZHRoOiBudW1iZXIgPSBNYXRoLm1heCguLi5kYXlWaWV3RXZlbnRzLm1hcCgoZXZlbnQ6IERheVZpZXdFdmVudCkgPT4gZXZlbnQubGVmdCArIGV2ZW50LndpZHRoKSk7XG4gIGNvbnN0IGFsbERheUV2ZW50czogQ2FsZW5kYXJFdmVudFtdID0gZ2V0RXZlbnRzSW5QZXJpb2Qoe1xuICAgIGV2ZW50czogZXZlbnRzLmZpbHRlcigoZXZlbnQ6IENhbGVuZGFyRXZlbnQpID0+IGV2ZW50LmFsbERheSksXG4gICAgcGVyaW9kU3RhcnQ6IGRhdGVGbnMuc3RhcnRPZkRheShzdGFydE9mVmlldyksXG4gICAgcGVyaW9kRW5kOiBkYXRlRm5zLmVuZE9mRGF5KGVuZE9mVmlldyksXG4gIH0pO1xuXG4gIHJldHVybiB7XG4gICAgZXZlbnRzOiBkYXlWaWV3RXZlbnRzLFxuICAgIHdpZHRoLFxuICAgIGFsbERheUV2ZW50cyxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldERheVZpZXdIb3VyR3JpZCh7XG4gIHZpZXdEYXRlLFxuICBob3VyU2VnbWVudHMsXG4gIGRheVN0YXJ0LFxuICBkYXlFbmQsXG59OiB7XG4gIHZpZXdEYXRlOiBEYXRlO1xuICBob3VyU2VnbWVudHM6IG51bWJlcjtcbiAgZGF5U3RhcnQ6IGFueTtcbiAgZGF5RW5kOiBhbnk7XG59KTogRGF5Vmlld0hvdXJbXSB7XG4gIGNvbnN0IGhvdXJzOiBEYXlWaWV3SG91cltdID0gW107XG5cbiAgY29uc3Qgc3RhcnRPZlZpZXc6IERhdGUgPSBkYXRlRm5zLnNldE1pbnV0ZXMoZGF0ZUZucy5zZXRIb3VycyhkYXRlRm5zLnN0YXJ0T2ZEYXkodmlld0RhdGUpLCBkYXlTdGFydC5ob3VyKSwgZGF5U3RhcnQubWludXRlKTtcbiAgY29uc3QgZW5kT2ZWaWV3OiBEYXRlID0gZGF0ZUZucy5zZXRNaW51dGVzKFxuICAgIGRhdGVGbnMuc2V0SG91cnMoZGF0ZUZucy5zdGFydE9mTWludXRlKGRhdGVGbnMuZW5kT2ZEYXkodmlld0RhdGUpKSwgZGF5RW5kLmhvdXIpLFxuICAgIGRheUVuZC5taW51dGUsXG4gICk7XG4gIGNvbnN0IHNlZ21lbnREdXJhdGlvbjogbnVtYmVyID0gTUlOVVRFU19JTl9IT1VSIC8gaG91clNlZ21lbnRzO1xuICBjb25zdCBzdGFydE9mVmlld0RheTogRGF0ZSA9IGRhdGVGbnMuc3RhcnRPZkRheSh2aWV3RGF0ZSk7XG5cbiAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IEhPVVJTX0lOX0RBWTsgaSsrKSB7XG4gICAgY29uc3Qgc2VnbWVudHM6IERheVZpZXdIb3VyU2VnbWVudFtdID0gW107XG4gICAgZm9yIChsZXQgajogbnVtYmVyID0gMDsgaiA8IGhvdXJTZWdtZW50czsgaisrKSB7XG4gICAgICBjb25zdCBkYXRlOiBEYXRlID0gZGF0ZUZucy5hZGRNaW51dGVzKGRhdGVGbnMuYWRkSG91cnMoc3RhcnRPZlZpZXdEYXksIGkpLCBqICogc2VnbWVudER1cmF0aW9uKTtcbiAgICAgIGlmIChkYXRlID49IHN0YXJ0T2ZWaWV3ICYmIGRhdGUgPCBlbmRPZlZpZXcpIHtcbiAgICAgICAgc2VnbWVudHMucHVzaCh7XG4gICAgICAgICAgZGF0ZSxcbiAgICAgICAgICBpc1N0YXJ0OiBqID09PSAwLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHNlZ21lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGhvdXJzLnB1c2goeyBzZWdtZW50cyB9KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaG91cnM7XG59XG4iXX0=