@ardium-ui/ui 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (491) hide show
  1. package/README.md +25 -0
  2. package/esm2022/ardium-ui-ui.mjs +5 -0
  3. package/esm2022/lib/_internal/boolean-component.mjs +108 -0
  4. package/esm2022/lib/_internal/clear-button/clear-button.component.mjs +12 -0
  5. package/esm2022/lib/_internal/clear-button/clear-button.module.mjs +18 -0
  6. package/esm2022/lib/_internal/disablable-component.mjs +44 -0
  7. package/esm2022/lib/_internal/focusable-component.mjs +91 -0
  8. package/esm2022/lib/_internal/item-storages/dropdown-item-storage.mjs +436 -0
  9. package/esm2022/lib/_internal/item-storages/simple-item-storage.mjs +349 -0
  10. package/esm2022/lib/_internal/item-storages/simplest-item-storage.mjs +155 -0
  11. package/esm2022/lib/_internal/models/pagination.model.mjs +124 -0
  12. package/esm2022/lib/_internal/ngmodel-component.mjs +42 -0
  13. package/esm2022/lib/_internal/queue.mjs +59 -0
  14. package/esm2022/lib/_internal/selectable-list-component.mjs +304 -0
  15. package/esm2022/lib/badge/badge.directive.mjs +123 -0
  16. package/esm2022/lib/badge/badge.module.mjs +18 -0
  17. package/esm2022/lib/badge/badge.types.mjs +16 -0
  18. package/esm2022/lib/buttons/_button-base.mjs +45 -0
  19. package/esm2022/lib/buttons/button/button.component.mjs +49 -0
  20. package/esm2022/lib/buttons/button/button.module.mjs +18 -0
  21. package/esm2022/lib/buttons/fab/fab.component.mjs +40 -0
  22. package/esm2022/lib/buttons/fab/fab.module.mjs +18 -0
  23. package/esm2022/lib/buttons/general-button.types.mjs +55 -0
  24. package/esm2022/lib/buttons/icon-button/icon-button.component.mjs +37 -0
  25. package/esm2022/lib/buttons/icon-button/icon-button.module.mjs +18 -0
  26. package/esm2022/lib/calendar/calendar.component.mjs +982 -0
  27. package/esm2022/lib/calendar/calendar.directives.mjs +107 -0
  28. package/esm2022/lib/calendar/calendar.helpers.mjs +47 -0
  29. package/esm2022/lib/calendar/calendar.module.mjs +21 -0
  30. package/esm2022/lib/calendar/calendar.types.mjs +11 -0
  31. package/esm2022/lib/card/card.children.mjs +97 -0
  32. package/esm2022/lib/card/card.component.mjs +40 -0
  33. package/esm2022/lib/card/card.module.mjs +59 -0
  34. package/esm2022/lib/card/card.types.mjs +9 -0
  35. package/esm2022/lib/checkbox/checkbox.component.mjs +73 -0
  36. package/esm2022/lib/checkbox/checkbox.module.mjs +18 -0
  37. package/esm2022/lib/checkbox/checkbox.types.mjs +6 -0
  38. package/esm2022/lib/checkbox-list/checkbox-list.component.mjs +139 -0
  39. package/esm2022/lib/checkbox-list/checkbox-list.module.mjs +19 -0
  40. package/esm2022/lib/checkbox-list/checkbox-list.types.mjs +7 -0
  41. package/esm2022/lib/chip/chip.component.mjs +55 -0
  42. package/esm2022/lib/chip/chip.module.mjs +21 -0
  43. package/esm2022/lib/chip/deletable-chip/deletable-chip.component.mjs +80 -0
  44. package/esm2022/lib/chip/selectable-chip/selectable-chip.component.mjs +77 -0
  45. package/esm2022/lib/color/color-display/color-display.component.mjs +48 -0
  46. package/esm2022/lib/color/color-display/color-display.module.mjs +18 -0
  47. package/esm2022/lib/color/color-display/color-display.types.mjs +9 -0
  48. package/esm2022/lib/color/color-picker/color-picker.component.mjs +484 -0
  49. package/esm2022/lib/color/color-picker/color-picker.directives.mjs +55 -0
  50. package/esm2022/lib/color/color-picker/color-picker.module.mjs +43 -0
  51. package/esm2022/lib/color/color-picker/color-picker.types.mjs +11 -0
  52. package/esm2022/lib/dialog/dialog.component.mjs +167 -0
  53. package/esm2022/lib/dialog/dialog.directives.mjs +14 -0
  54. package/esm2022/lib/dialog/dialog.module.mjs +21 -0
  55. package/esm2022/lib/dialog/dialog.types.mjs +6 -0
  56. package/esm2022/lib/divider/divider.component.mjs +26 -0
  57. package/esm2022/lib/divider/divider.module.mjs +18 -0
  58. package/esm2022/lib/dropdown-panel/dropdown-panel.component.mjs +130 -0
  59. package/esm2022/lib/dropdown-panel/dropdown-panel.module.mjs +18 -0
  60. package/esm2022/lib/dropdown-panel/dropdown-panel.types.mjs +10 -0
  61. package/esm2022/lib/file-inputs/file-drop-area/file-drop-area.component.mjs +82 -0
  62. package/esm2022/lib/file-inputs/file-drop-area/file-drop-area.directives.mjs +42 -0
  63. package/esm2022/lib/file-inputs/file-drop-area/file-drop-area.module.mjs +58 -0
  64. package/esm2022/lib/file-inputs/file-input/file-input.component.mjs +153 -0
  65. package/esm2022/lib/file-inputs/file-input/file-input.directives.mjs +73 -0
  66. package/esm2022/lib/file-inputs/file-input/file-input.module.mjs +21 -0
  67. package/esm2022/lib/file-inputs/file-input-base.mjs +187 -0
  68. package/esm2022/lib/file-inputs/file-input-types.mjs +2 -0
  69. package/esm2022/lib/form-field-frame/form-field-frame.component.mjs +74 -0
  70. package/esm2022/lib/form-field-frame/form-field-frame.directives.mjs +25 -0
  71. package/esm2022/lib/form-field-frame/form-field-frame.module.mjs +19 -0
  72. package/esm2022/lib/icon/icon.component.mjs +85 -0
  73. package/esm2022/lib/icon/icon.module.mjs +19 -0
  74. package/esm2022/lib/icon/icon.pipe.mjs +18 -0
  75. package/esm2022/lib/inputs/color-input/color-input.component.mjs +421 -0
  76. package/esm2022/lib/inputs/color-input/color-input.directives.mjs +101 -0
  77. package/esm2022/lib/inputs/color-input/color-input.module.mjs +85 -0
  78. package/esm2022/lib/inputs/color-input/color-input.types.mjs +2 -0
  79. package/esm2022/lib/inputs/digit-input/digit-input.component.mjs +218 -0
  80. package/esm2022/lib/inputs/digit-input/digit-input.model.mjs +217 -0
  81. package/esm2022/lib/inputs/digit-input/digit-input.module.mjs +18 -0
  82. package/esm2022/lib/inputs/digit-input/digit-input.types.mjs +15 -0
  83. package/esm2022/lib/inputs/digit-input/digit-input.utils.mjs +8 -0
  84. package/esm2022/lib/inputs/hex-input/hex-input.component.mjs +234 -0
  85. package/esm2022/lib/inputs/hex-input/hex-input.directives.mjs +36 -0
  86. package/esm2022/lib/inputs/hex-input/hex-input.module.mjs +21 -0
  87. package/esm2022/lib/inputs/hex-input.model.mjs +106 -0
  88. package/esm2022/lib/inputs/input/input.component.mjs +344 -0
  89. package/esm2022/lib/inputs/input/input.directives.mjs +58 -0
  90. package/esm2022/lib/inputs/input/input.module.mjs +47 -0
  91. package/esm2022/lib/inputs/input-transformers.mjs +66 -0
  92. package/esm2022/lib/inputs/input-types.mjs +6 -0
  93. package/esm2022/lib/inputs/input-utils.mjs +205 -0
  94. package/esm2022/lib/inputs/number-input/number-input.component.mjs +289 -0
  95. package/esm2022/lib/inputs/number-input/number-input.directives.mjs +14 -0
  96. package/esm2022/lib/inputs/number-input/number-input.module.mjs +21 -0
  97. package/esm2022/lib/inputs/password-input/password-input.component.mjs +222 -0
  98. package/esm2022/lib/inputs/password-input/password-input.directives.mjs +49 -0
  99. package/esm2022/lib/inputs/password-input/password-input.module.mjs +41 -0
  100. package/esm2022/lib/inputs/password-input/password-input.types.mjs +2 -0
  101. package/esm2022/lib/inputs/simple-input/simple-input.component.mjs +219 -0
  102. package/esm2022/lib/inputs/simple-input/simple-input.directives.mjs +36 -0
  103. package/esm2022/lib/inputs/simple-input/simple-input.module.mjs +37 -0
  104. package/esm2022/lib/kbd/kbd.component.mjs +42 -0
  105. package/esm2022/lib/kbd/kbd.module.mjs +19 -0
  106. package/esm2022/lib/kbd/kbd.pipe.mjs +17 -0
  107. package/esm2022/lib/kbd-shortcut/kbd-shortcut.component.mjs +55 -0
  108. package/esm2022/lib/kbd-shortcut/kbd-shortcut.module.mjs +19 -0
  109. package/esm2022/lib/modal/modal.component.mjs +120 -0
  110. package/esm2022/lib/modal/modal.module.mjs +21 -0
  111. package/esm2022/lib/option/option.component.mjs +77 -0
  112. package/esm2022/lib/option/option.module.mjs +18 -0
  113. package/esm2022/lib/progress-bar/progress-bar.component.mjs +95 -0
  114. package/esm2022/lib/progress-bar/progress-bar.directive.mjs +14 -0
  115. package/esm2022/lib/progress-bar/progress-bar.module.mjs +19 -0
  116. package/esm2022/lib/progress-bar/progress-bar.types.mjs +19 -0
  117. package/esm2022/lib/progress-circle/progress-circle.component.mjs +94 -0
  118. package/esm2022/lib/progress-circle/progress-circle.directive.mjs +14 -0
  119. package/esm2022/lib/progress-circle/progress-circle.module.mjs +19 -0
  120. package/esm2022/lib/progress-circle/progress-circle.types.mjs +10 -0
  121. package/esm2022/lib/radio/radio/radio.component.mjs +53 -0
  122. package/esm2022/lib/radio/radio-group.component.mjs +207 -0
  123. package/esm2022/lib/radio/radio.module.mjs +19 -0
  124. package/esm2022/lib/search-functions.mjs +64 -0
  125. package/esm2022/lib/segment/segment.component.mjs +168 -0
  126. package/esm2022/lib/segment/segment.directives.mjs +14 -0
  127. package/esm2022/lib/segment/segment.module.mjs +19 -0
  128. package/esm2022/lib/segment/segment.types.mjs +12 -0
  129. package/esm2022/lib/select/select.component.mjs +1160 -0
  130. package/esm2022/lib/select/select.directive.mjs +171 -0
  131. package/esm2022/lib/select/select.module.mjs +112 -0
  132. package/esm2022/lib/select/select.types.mjs +2 -0
  133. package/esm2022/lib/slide-toggle/slide-toggle.component.mjs +46 -0
  134. package/esm2022/lib/slide-toggle/slide-toggle.module.mjs +18 -0
  135. package/esm2022/lib/slider/abstract-slider.mjs +330 -0
  136. package/esm2022/lib/slider/range-slider/range-slider.component.mjs +143 -0
  137. package/esm2022/lib/slider/range-slider/range-slider.module.mjs +18 -0
  138. package/esm2022/lib/slider/slider.component.mjs +93 -0
  139. package/esm2022/lib/slider/slider.directive.mjs +16 -0
  140. package/esm2022/lib/slider/slider.module.mjs +20 -0
  141. package/esm2022/lib/slider/slider.types.mjs +10 -0
  142. package/esm2022/lib/snackbar/index.mjs +5 -0
  143. package/esm2022/lib/snackbar/snackbar-ref.mjs +51 -0
  144. package/esm2022/lib/snackbar/snackbar.component.mjs +48 -0
  145. package/esm2022/lib/snackbar/snackbar.service.mjs +227 -0
  146. package/esm2022/lib/snackbar/snackbar.token.mjs +20 -0
  147. package/esm2022/lib/snackbar/snackbar.types.mjs +25 -0
  148. package/esm2022/lib/spinner/spinner.component.mjs +22 -0
  149. package/esm2022/lib/spinner/spinner.module.mjs +18 -0
  150. package/esm2022/lib/star/star-button/star-button.component.mjs +53 -0
  151. package/esm2022/lib/star/star-button/star-button.module.mjs +19 -0
  152. package/esm2022/lib/star/star-display/star-display.component.mjs +66 -0
  153. package/esm2022/lib/star/star-display/star-display.module.mjs +19 -0
  154. package/esm2022/lib/star/star-input/star-input.component.mjs +221 -0
  155. package/esm2022/lib/star/star-input/star-input.module.mjs +19 -0
  156. package/esm2022/lib/star/star.component.mjs +28 -0
  157. package/esm2022/lib/star/star.module.mjs +18 -0
  158. package/esm2022/lib/star/star.types.mjs +23 -0
  159. package/esm2022/lib/statebox/statebox.component.mjs +158 -0
  160. package/esm2022/lib/statebox/statebox.module.mjs +18 -0
  161. package/esm2022/lib/statebox/statebox.types.mjs +2 -0
  162. package/esm2022/lib/table/table-item-storage.mjs +560 -0
  163. package/esm2022/lib/table/table.component.mjs +468 -0
  164. package/esm2022/lib/table/table.directives.mjs +64 -0
  165. package/esm2022/lib/table/table.module.mjs +46 -0
  166. package/esm2022/lib/table/table.types.mjs +30 -0
  167. package/esm2022/lib/table/utils.mjs +18 -0
  168. package/esm2022/lib/table-from-csv/table-from-csv.component.mjs +64 -0
  169. package/esm2022/lib/table-from-csv/table-from-csv.module.mjs +19 -0
  170. package/esm2022/lib/table-pagination/table-pagination.component.mjs +172 -0
  171. package/esm2022/lib/table-pagination/table-pagination.module.mjs +21 -0
  172. package/esm2022/lib/table-pagination/table-pagination.types.mjs +7 -0
  173. package/esm2022/lib/types/alignment.types.mjs +10 -0
  174. package/esm2022/lib/types/colors.types.mjs +43 -0
  175. package/esm2022/lib/types/item-storage.types.mjs +6 -0
  176. package/esm2022/lib/types/theming.types.mjs +48 -0
  177. package/esm2022/lib/types/utility.types.mjs +5 -0
  178. package/esm2022/public-api.mjs +194 -0
  179. package/fesm2022/ardium-ui-ui.mjs +14316 -0
  180. package/fesm2022/ardium-ui-ui.mjs.map +1 -0
  181. package/index.d.ts +5 -0
  182. package/lib/_internal/boolean-component.d.ts +50 -0
  183. package/lib/_internal/clear-button/clear-button.component.d.ts +6 -0
  184. package/lib/_internal/clear-button/clear-button.module.d.ts +8 -0
  185. package/lib/_internal/disablable-component.d.ts +11 -0
  186. package/lib/_internal/focusable-component.d.ts +52 -0
  187. package/lib/_internal/item-storages/dropdown-item-storage.d.ts +87 -0
  188. package/lib/_internal/item-storages/simple-item-storage.d.ts +159 -0
  189. package/lib/_internal/item-storages/simplest-item-storage.d.ts +70 -0
  190. package/lib/_internal/models/pagination.model.d.ts +53 -0
  191. package/lib/_internal/ngmodel-component.d.ts +42 -0
  192. package/lib/_internal/queue.d.ts +21 -0
  193. package/lib/_internal/selectable-list-component.d.ts +71 -0
  194. package/lib/badge/badge.directive.d.ts +31 -0
  195. package/lib/badge/badge.module.d.ts +8 -0
  196. package/lib/badge/badge.types.d.ts +17 -0
  197. package/lib/buttons/_button-base.d.ts +18 -0
  198. package/lib/buttons/button/button.component.d.ts +15 -0
  199. package/lib/buttons/button/button.module.d.ts +8 -0
  200. package/lib/buttons/fab/fab.component.d.ts +12 -0
  201. package/lib/buttons/fab/fab.module.d.ts +8 -0
  202. package/lib/buttons/general-button.types.d.ts +57 -0
  203. package/lib/buttons/icon-button/icon-button.component.d.ts +13 -0
  204. package/lib/buttons/icon-button/icon-button.module.d.ts +8 -0
  205. package/lib/calendar/calendar.component.d.ts +155 -0
  206. package/lib/calendar/calendar.directives.d.ts +51 -0
  207. package/lib/calendar/calendar.helpers.d.ts +15 -0
  208. package/lib/calendar/calendar.module.d.ts +11 -0
  209. package/lib/calendar/calendar.types.d.ts +80 -0
  210. package/lib/card/card.children.d.ts +43 -0
  211. package/lib/card/card.component.d.ts +13 -0
  212. package/lib/card/card.module.d.ts +9 -0
  213. package/lib/card/card.types.d.ts +10 -0
  214. package/lib/checkbox/checkbox.component.d.ts +21 -0
  215. package/lib/checkbox/checkbox.module.d.ts +8 -0
  216. package/lib/checkbox/checkbox.types.d.ts +6 -0
  217. package/lib/checkbox-list/checkbox-list.component.d.ts +50 -0
  218. package/lib/checkbox-list/checkbox-list.module.d.ts +9 -0
  219. package/lib/checkbox-list/checkbox-list.types.d.ts +7 -0
  220. package/lib/chip/chip.component.d.ts +18 -0
  221. package/lib/chip/chip.module.d.ts +11 -0
  222. package/lib/chip/deletable-chip/deletable-chip.component.d.ts +24 -0
  223. package/lib/chip/selectable-chip/selectable-chip.component.d.ts +24 -0
  224. package/lib/color/color-display/color-display.component.d.ts +17 -0
  225. package/lib/color/color-display/color-display.module.d.ts +8 -0
  226. package/lib/color/color-display/color-display.types.d.ts +9 -0
  227. package/lib/color/color-picker/color-picker.component.d.ts +125 -0
  228. package/lib/color/color-picker/color-picker.directives.d.ts +27 -0
  229. package/lib/color/color-picker/color-picker.module.d.ts +13 -0
  230. package/lib/color/color-picker/color-picker.types.d.ts +21 -0
  231. package/lib/dialog/dialog.component.d.ts +44 -0
  232. package/lib/dialog/dialog.directives.d.ts +9 -0
  233. package/lib/dialog/dialog.module.d.ts +11 -0
  234. package/lib/dialog/dialog.types.d.ts +28 -0
  235. package/lib/divider/divider.component.d.ts +8 -0
  236. package/lib/divider/divider.module.d.ts +8 -0
  237. package/lib/dropdown-panel/dropdown-panel.component.d.ts +37 -0
  238. package/lib/dropdown-panel/dropdown-panel.module.d.ts +8 -0
  239. package/lib/dropdown-panel/dropdown-panel.types.d.ts +12 -0
  240. package/lib/file-inputs/file-drop-area/file-drop-area.component.d.ts +22 -0
  241. package/lib/file-inputs/file-drop-area/file-drop-area.directives.d.ts +21 -0
  242. package/lib/file-inputs/file-drop-area/file-drop-area.module.d.ts +12 -0
  243. package/lib/file-inputs/file-input/file-input.component.d.ts +41 -0
  244. package/lib/file-inputs/file-input/file-input.directives.d.ts +39 -0
  245. package/lib/file-inputs/file-input/file-input.module.d.ts +11 -0
  246. package/lib/file-inputs/file-input-base.d.ts +43 -0
  247. package/lib/file-inputs/file-input-types.d.ts +10 -0
  248. package/lib/form-field-frame/form-field-frame.component.d.ts +32 -0
  249. package/lib/form-field-frame/form-field-frame.directives.d.ts +14 -0
  250. package/lib/form-field-frame/form-field-frame.module.d.ts +9 -0
  251. package/lib/icon/icon.component.d.ts +32 -0
  252. package/lib/icon/icon.module.d.ts +9 -0
  253. package/lib/icon/icon.pipe.d.ts +7 -0
  254. package/lib/inputs/color-input/color-input.component.d.ts +147 -0
  255. package/lib/inputs/color-input/color-input.directives.d.ts +52 -0
  256. package/lib/inputs/color-input/color-input.module.d.ts +16 -0
  257. package/lib/inputs/color-input/color-input.types.d.ts +5 -0
  258. package/lib/inputs/digit-input/digit-input.component.d.ts +50 -0
  259. package/lib/inputs/digit-input/digit-input.model.d.ts +26 -0
  260. package/lib/inputs/digit-input/digit-input.module.d.ts +8 -0
  261. package/lib/inputs/digit-input/digit-input.types.d.ts +27 -0
  262. package/lib/inputs/digit-input/digit-input.utils.d.ts +17 -0
  263. package/lib/inputs/hex-input/hex-input.component.d.ts +60 -0
  264. package/lib/inputs/hex-input/hex-input.directives.d.ts +20 -0
  265. package/lib/inputs/hex-input/hex-input.module.d.ts +11 -0
  266. package/lib/inputs/hex-input.model.d.ts +27 -0
  267. package/lib/inputs/input/input.component.d.ts +79 -0
  268. package/lib/inputs/input/input.directives.d.ts +33 -0
  269. package/lib/inputs/input/input.module.d.ts +13 -0
  270. package/lib/inputs/input-transformers.d.ts +24 -0
  271. package/lib/inputs/input-types.d.ts +6 -0
  272. package/lib/inputs/input-utils.d.ts +58 -0
  273. package/lib/inputs/number-input/number-input.component.d.ts +70 -0
  274. package/lib/inputs/number-input/number-input.directives.d.ts +8 -0
  275. package/lib/inputs/number-input/number-input.module.d.ts +11 -0
  276. package/lib/inputs/password-input/password-input.component.d.ts +54 -0
  277. package/lib/inputs/password-input/password-input.directives.d.ts +27 -0
  278. package/lib/inputs/password-input/password-input.module.d.ts +11 -0
  279. package/lib/inputs/password-input/password-input.types.d.ts +3 -0
  280. package/lib/inputs/simple-input/simple-input.component.d.ts +58 -0
  281. package/lib/inputs/simple-input/simple-input.directives.d.ts +20 -0
  282. package/lib/inputs/simple-input/simple-input.module.d.ts +11 -0
  283. package/lib/kbd/kbd.component.d.ts +15 -0
  284. package/lib/kbd/kbd.module.d.ts +9 -0
  285. package/lib/kbd/kbd.pipe.d.ts +7 -0
  286. package/lib/kbd-shortcut/kbd-shortcut.component.d.ts +18 -0
  287. package/lib/kbd-shortcut/kbd-shortcut.module.d.ts +9 -0
  288. package/lib/modal/modal.component.d.ts +36 -0
  289. package/lib/modal/modal.module.d.ts +11 -0
  290. package/lib/option/option.component.d.ts +29 -0
  291. package/lib/option/option.module.d.ts +8 -0
  292. package/lib/progress-bar/progress-bar.component.d.ts +26 -0
  293. package/lib/progress-bar/progress-bar.directive.d.ts +9 -0
  294. package/lib/progress-bar/progress-bar.module.d.ts +9 -0
  295. package/lib/progress-bar/progress-bar.types.d.ts +26 -0
  296. package/lib/progress-circle/progress-circle.component.d.ts +28 -0
  297. package/lib/progress-circle/progress-circle.directive.d.ts +9 -0
  298. package/lib/progress-circle/progress-circle.module.d.ts +9 -0
  299. package/lib/progress-circle/progress-circle.types.d.ts +17 -0
  300. package/lib/radio/radio/radio.component.d.ts +23 -0
  301. package/lib/radio/radio-group.component.d.ts +43 -0
  302. package/lib/radio/radio.module.d.ts +9 -0
  303. package/lib/search-functions.d.ts +10 -0
  304. package/lib/segment/segment.component.d.ts +48 -0
  305. package/lib/segment/segment.directives.d.ts +9 -0
  306. package/lib/segment/segment.module.d.ts +9 -0
  307. package/lib/segment/segment.types.d.ts +16 -0
  308. package/lib/select/select.component.d.ts +255 -0
  309. package/lib/select/select.directive.d.ts +94 -0
  310. package/lib/select/select.module.d.ts +14 -0
  311. package/lib/select/select.types.d.ts +109 -0
  312. package/lib/slide-toggle/slide-toggle.component.d.ts +14 -0
  313. package/lib/slide-toggle/slide-toggle.module.d.ts +8 -0
  314. package/lib/slider/abstract-slider.d.ts +88 -0
  315. package/lib/slider/range-slider/range-slider.component.d.ts +29 -0
  316. package/lib/slider/range-slider/range-slider.module.d.ts +8 -0
  317. package/lib/slider/slider.component.d.ts +18 -0
  318. package/lib/slider/slider.directive.d.ts +9 -0
  319. package/lib/slider/slider.module.d.ts +10 -0
  320. package/lib/slider/slider.types.d.ts +28 -0
  321. package/lib/snackbar/index.d.ts +4 -0
  322. package/lib/snackbar/snackbar-ref.d.ts +37 -0
  323. package/lib/snackbar/snackbar.component.d.ts +16 -0
  324. package/lib/snackbar/snackbar.service.d.ts +31 -0
  325. package/lib/snackbar/snackbar.token.d.ts +5 -0
  326. package/lib/snackbar/snackbar.types.d.ts +48 -0
  327. package/lib/spinner/spinner.component.d.ts +8 -0
  328. package/lib/spinner/spinner.module.d.ts +8 -0
  329. package/lib/star/star-button/star-button.component.d.ts +16 -0
  330. package/lib/star/star-button/star-button.module.d.ts +9 -0
  331. package/lib/star/star-display/star-display.component.d.ts +16 -0
  332. package/lib/star/star-display/star-display.module.d.ts +9 -0
  333. package/lib/star/star-input/star-input.component.d.ts +51 -0
  334. package/lib/star/star-input/star-input.module.d.ts +9 -0
  335. package/lib/star/star.component.d.ts +10 -0
  336. package/lib/star/star.module.d.ts +8 -0
  337. package/lib/star/star.types.d.ts +30 -0
  338. package/lib/statebox/statebox.component.d.ts +31 -0
  339. package/lib/statebox/statebox.module.d.ts +8 -0
  340. package/lib/statebox/statebox.types.d.ts +22 -0
  341. package/lib/table/table-item-storage.d.ts +266 -0
  342. package/lib/table/table.component.d.ts +127 -0
  343. package/lib/table/table.directives.d.ts +35 -0
  344. package/lib/table/table.module.d.ts +12 -0
  345. package/lib/table/table.types.d.ts +83 -0
  346. package/lib/table/utils.d.ts +4 -0
  347. package/lib/table-from-csv/table-from-csv.component.d.ts +16 -0
  348. package/lib/table-from-csv/table-from-csv.module.d.ts +9 -0
  349. package/lib/table-pagination/table-pagination.component.d.ts +48 -0
  350. package/lib/table-pagination/table-pagination.module.d.ts +11 -0
  351. package/lib/table-pagination/table-pagination.types.d.ts +9 -0
  352. package/lib/types/alignment.types.d.ts +11 -0
  353. package/lib/types/colors.types.d.ts +71 -0
  354. package/lib/types/item-storage.types.d.ts +98 -0
  355. package/lib/types/theming.types.d.ts +61 -0
  356. package/lib/types/utility.types.d.ts +11 -0
  357. package/package.json +36 -0
  358. package/prebuilt-themes/default/badge.css +208 -0
  359. package/prebuilt-themes/default/badge.css.map +1 -0
  360. package/prebuilt-themes/default/buttons/button.css +290 -0
  361. package/prebuilt-themes/default/buttons/button.css.map +1 -0
  362. package/prebuilt-themes/default/buttons/fab.css +307 -0
  363. package/prebuilt-themes/default/buttons/fab.css.map +1 -0
  364. package/prebuilt-themes/default/buttons/icon-button.css +288 -0
  365. package/prebuilt-themes/default/buttons/icon-button.css.map +1 -0
  366. package/prebuilt-themes/default/calendar.css +293 -0
  367. package/prebuilt-themes/default/calendar.css.map +1 -0
  368. package/prebuilt-themes/default/card.css +122 -0
  369. package/prebuilt-themes/default/card.css.map +1 -0
  370. package/prebuilt-themes/default/checkbox-list.css +65 -0
  371. package/prebuilt-themes/default/checkbox-list.css.map +1 -0
  372. package/prebuilt-themes/default/checkbox.css +365 -0
  373. package/prebuilt-themes/default/checkbox.css.map +1 -0
  374. package/prebuilt-themes/default/chips.css +367 -0
  375. package/prebuilt-themes/default/chips.css.map +1 -0
  376. package/prebuilt-themes/default/color-display.css +29 -0
  377. package/prebuilt-themes/default/color-display.css.map +1 -0
  378. package/prebuilt-themes/default/color-picker.css +106 -0
  379. package/prebuilt-themes/default/color-picker.css.map +1 -0
  380. package/prebuilt-themes/default/core.css +84 -0
  381. package/prebuilt-themes/default/core.css.map +1 -0
  382. package/prebuilt-themes/default/dialog.css +18 -0
  383. package/prebuilt-themes/default/dialog.css.map +1 -0
  384. package/prebuilt-themes/default/divider.css +11 -0
  385. package/prebuilt-themes/default/divider.css.map +1 -0
  386. package/prebuilt-themes/default/dropdown-panel.css +37 -0
  387. package/prebuilt-themes/default/dropdown-panel.css.map +1 -0
  388. package/prebuilt-themes/default/file-drop-area.css +279 -0
  389. package/prebuilt-themes/default/file-drop-area.css.map +1 -0
  390. package/prebuilt-themes/default/form-field-frame.css +84 -0
  391. package/prebuilt-themes/default/form-field-frame.css.map +1 -0
  392. package/prebuilt-themes/default/inputs/color-input.css +139 -0
  393. package/prebuilt-themes/default/inputs/color-input.css.map +1 -0
  394. package/prebuilt-themes/default/inputs/digit-input.css +45 -0
  395. package/prebuilt-themes/default/inputs/digit-input.css.map +1 -0
  396. package/prebuilt-themes/default/inputs/file-input.css +169 -0
  397. package/prebuilt-themes/default/inputs/file-input.css.map +1 -0
  398. package/prebuilt-themes/default/inputs/hex-input.css +119 -0
  399. package/prebuilt-themes/default/inputs/hex-input.css.map +1 -0
  400. package/prebuilt-themes/default/inputs/input.css +139 -0
  401. package/prebuilt-themes/default/inputs/input.css.map +1 -0
  402. package/prebuilt-themes/default/inputs/number-input.css +150 -0
  403. package/prebuilt-themes/default/inputs/number-input.css.map +1 -0
  404. package/prebuilt-themes/default/inputs/password-input.css +73 -0
  405. package/prebuilt-themes/default/inputs/password-input.css.map +1 -0
  406. package/prebuilt-themes/default/inputs/search-bar.css +114 -0
  407. package/prebuilt-themes/default/inputs/search-bar.css.map +1 -0
  408. package/prebuilt-themes/default/inputs/simple-input.css +114 -0
  409. package/prebuilt-themes/default/inputs/simple-input.css.map +1 -0
  410. package/prebuilt-themes/default/kbd-shortcut.css +12 -0
  411. package/prebuilt-themes/default/kbd-shortcut.css.map +1 -0
  412. package/prebuilt-themes/default/kbd.css +17 -0
  413. package/prebuilt-themes/default/kbd.css.map +1 -0
  414. package/prebuilt-themes/default/modal.css +73 -0
  415. package/prebuilt-themes/default/modal.css.map +1 -0
  416. package/prebuilt-themes/default/progress-bar.css +267 -0
  417. package/prebuilt-themes/default/progress-bar.css.map +1 -0
  418. package/prebuilt-themes/default/progress-circle.css +167 -0
  419. package/prebuilt-themes/default/progress-circle.css.map +1 -0
  420. package/prebuilt-themes/default/radio.css +226 -0
  421. package/prebuilt-themes/default/radio.css.map +1 -0
  422. package/prebuilt-themes/default/segment.css +391 -0
  423. package/prebuilt-themes/default/segment.css.map +1 -0
  424. package/prebuilt-themes/default/select.css +275 -0
  425. package/prebuilt-themes/default/select.css.map +1 -0
  426. package/prebuilt-themes/default/slide-toggle.css +264 -0
  427. package/prebuilt-themes/default/slide-toggle.css.map +1 -0
  428. package/prebuilt-themes/default/slider.css +354 -0
  429. package/prebuilt-themes/default/slider.css.map +1 -0
  430. package/prebuilt-themes/default/snackbar.css +183 -0
  431. package/prebuilt-themes/default/snackbar.css.map +1 -0
  432. package/prebuilt-themes/default/spinner.css +151 -0
  433. package/prebuilt-themes/default/spinner.css.map +1 -0
  434. package/prebuilt-themes/default/stars.css +291 -0
  435. package/prebuilt-themes/default/stars.css.map +1 -0
  436. package/prebuilt-themes/default/statebox.css +235 -0
  437. package/prebuilt-themes/default/statebox.css.map +1 -0
  438. package/prebuilt-themes/default/table-pagination.css +48 -0
  439. package/prebuilt-themes/default/table-pagination.css.map +1 -0
  440. package/prebuilt-themes/default/table.css +418 -0
  441. package/prebuilt-themes/default/table.css.map +1 -0
  442. package/public-api.d.ts +145 -0
  443. package/themes/_variables.scss +121 -0
  444. package/themes/default/_clear-button.scss +73 -0
  445. package/themes/default/_coloring.scss +137 -0
  446. package/themes/default/_dropdown-arrow.scss +12 -0
  447. package/themes/default/_mixins.scss +70 -0
  448. package/themes/default/badge.scss +94 -0
  449. package/themes/default/buttons/_button-mixins.scss +144 -0
  450. package/themes/default/buttons/button.scss +62 -0
  451. package/themes/default/buttons/fab.scss +72 -0
  452. package/themes/default/buttons/icon-button.scss +59 -0
  453. package/themes/default/calendar.scss +182 -0
  454. package/themes/default/card.scss +126 -0
  455. package/themes/default/checkbox-list.scss +83 -0
  456. package/themes/default/checkbox.scss +109 -0
  457. package/themes/default/chips.scss +206 -0
  458. package/themes/default/color-display.scss +41 -0
  459. package/themes/default/color-picker.scss +111 -0
  460. package/themes/default/core.scss +96 -0
  461. package/themes/default/dialog.scss +16 -0
  462. package/themes/default/divider.scss +13 -0
  463. package/themes/default/dropdown-panel.scss +45 -0
  464. package/themes/default/file-drop-area.scss +162 -0
  465. package/themes/default/form-field-frame.scss +78 -0
  466. package/themes/default/inputs/_shared.scss +46 -0
  467. package/themes/default/inputs/color-input.scss +46 -0
  468. package/themes/default/inputs/digit-input.scss +56 -0
  469. package/themes/default/inputs/file-input.scss +78 -0
  470. package/themes/default/inputs/hex-input.scss +27 -0
  471. package/themes/default/inputs/input.scss +52 -0
  472. package/themes/default/inputs/number-input.scss +121 -0
  473. package/themes/default/inputs/password-input.scss +43 -0
  474. package/themes/default/inputs/search-bar.scss +19 -0
  475. package/themes/default/inputs/simple-input.scss +19 -0
  476. package/themes/default/kbd-shortcut.scss +13 -0
  477. package/themes/default/kbd.scss +20 -0
  478. package/themes/default/modal.scss +93 -0
  479. package/themes/default/progress-bar.scss +166 -0
  480. package/themes/default/progress-circle.scss +56 -0
  481. package/themes/default/radio.scss +112 -0
  482. package/themes/default/segment.scss +339 -0
  483. package/themes/default/select.scss +253 -0
  484. package/themes/default/slide-toggle.scss +151 -0
  485. package/themes/default/slider.scss +224 -0
  486. package/themes/default/snackbar.scss +60 -0
  487. package/themes/default/spinner.scss +21 -0
  488. package/themes/default/stars.scss +122 -0
  489. package/themes/default/statebox.scss +109 -0
  490. package/themes/default/table-pagination.scss +56 -0
  491. package/themes/default/table.scss +403 -0
@@ -0,0 +1,982 @@
1
+ import { forwardRef } from '@angular/core';
2
+ import { ChangeDetectionStrategy, Component, ContentChild, EventEmitter, HostListener, Input, Output, ViewEncapsulation, } from '@angular/core';
3
+ import { coerceBooleanProperty, coerceNumberProperty } from '@ardium-ui/devkit';
4
+ import { roundToMultiple } from 'more-rounding';
5
+ import { isDefined, isNull } from 'simple-bool';
6
+ import { ComponentColor } from '../types/colors.types';
7
+ import { _NgModelComponentBase } from '../_internal/ngmodel-component';
8
+ import { ArdDaysViewHeaderTemplateDirective, ArdDayTemplateDirective, ArdFloatingMonthTemplateDirective, ArdMonthsViewHeaderTemplateDirective, ArdMonthTemplateDirective, ArdWeekdayTemplateDirective, ArdYearsViewHeaderTemplateDirective, ArdYearTemplateDirective, } from './calendar.directives';
9
+ import { getMonthLayout } from './calendar.helpers';
10
+ import { CalendarView, } from './calendar.types';
11
+ import { NG_VALUE_ACCESSOR } from '@angular/forms';
12
+ import * as i0 from "@angular/core";
13
+ import * as i1 from "@angular/common";
14
+ import * as i2 from "../buttons/button/button.component";
15
+ import * as i3 from "../buttons/icon-button/icon-button.component";
16
+ import * as i4 from "../icon/icon.component";
17
+ function isLeapYear(year) {
18
+ return (year % 4 == 0 && year % 100 != 0) || year % 400 == 0;
19
+ }
20
+ export class ArdiumCalendarComponent extends _NgModelComponentBase {
21
+ constructor() {
22
+ super(...arguments);
23
+ this._wasSelectedChecked = false;
24
+ //! determining today state
25
+ this.todayDate = new Date();
26
+ //! color & wrapper classes
27
+ this.color = ComponentColor.Primary;
28
+ //! open year & month setters
29
+ //pick a year range start so that the today date is always in the 3rd row
30
+ this.todayYearRangeStart = this.todayDate.getFullYear() - (this.todayDate.getFullYear() % 4) - 8;
31
+ this.displayedYearRangeStart = this.todayYearRangeStart;
32
+ this.yearRangeArrayCache = null;
33
+ this._activeDate = new Date(this.todayDate.getFullYear(), this.todayDate.getMonth(), this.todayDate.getDate());
34
+ //! selection functions
35
+ this._selected = null;
36
+ //! output events
37
+ this.yearSelected = new EventEmitter();
38
+ this.monthSelected = new EventEmitter();
39
+ this.selectedChange = new EventEmitter();
40
+ this.activeYearChange = new EventEmitter();
41
+ this.activeMonthChange = new EventEmitter();
42
+ this.viewChange = new EventEmitter();
43
+ this.changeEvent = new EventEmitter();
44
+ //! calendar entry hover & click
45
+ this._highlightedDay = null;
46
+ this._highlightedMonth = null;
47
+ this._highlightedYear = null;
48
+ this._isUsingKeyboard = false;
49
+ //! settings
50
+ this._firstWeekday = 1;
51
+ this._nointeract = false;
52
+ this._staticHeight = false;
53
+ //months view array
54
+ this.monthsArray = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];
55
+ //years view array
56
+ this._yearsArrayCache = null;
57
+ this._yearsArrayCacheStartYear = null;
58
+ //! change view functions
59
+ this.activeView = CalendarView.Days;
60
+ }
61
+ ngOnInit() {
62
+ this._updateCalendarArray();
63
+ this._updateWeekdayArray();
64
+ this._updateDisplayedYearRangeStart();
65
+ }
66
+ ngOnChanges(changes) {
67
+ if (this._wasSelectedChecked)
68
+ return;
69
+ this._wasSelectedChecked = true;
70
+ if (changes['selected']) {
71
+ const v = this.selected;
72
+ if (isNull(v))
73
+ return;
74
+ this.activeDate = new Date(v.getFullYear(), v.getMonth(), 1);
75
+ }
76
+ }
77
+ isDayToday(day) {
78
+ return this.activeYear == this.todayDate.getFullYear() && this.activeMonth == this.todayDate.getMonth() && day == this.todayDate.getDate();
79
+ }
80
+ isMonthToday(month) {
81
+ return this.activeYear == this.todayDate.getFullYear() && month == this.todayDate.getMonth();
82
+ }
83
+ isYearToday(year) {
84
+ return year == this.todayDate.getFullYear();
85
+ }
86
+ //! determining if an entry is selected
87
+ isDaySelected(day) {
88
+ if (day instanceof Date)
89
+ day = day.getDate();
90
+ return (this.selected != null &&
91
+ this.activeYear == this.selected.getFullYear() &&
92
+ this.activeMonth == this.selected.getMonth() &&
93
+ day == this.selected.getDate());
94
+ }
95
+ isMonthSelected(month) {
96
+ if (month instanceof Date)
97
+ month = month.getMonth();
98
+ return this.selected != null && this.activeYear == this.selected.getFullYear() && month == this.selected.getMonth();
99
+ }
100
+ isYearSelected(year) {
101
+ if (year instanceof Date)
102
+ year = year.getFullYear();
103
+ return this.selected != null && year == this.selected.getFullYear();
104
+ }
105
+ get ngClasses() {
106
+ return [`ard-color-${this.color}`, this.nointeract ? 'ard-calendar-nointeract' : '', this.staticHeight ? 'ard-calendar-static-height' : ''].join(' ');
107
+ }
108
+ _updateDisplayedYearRangeStart(forcedYear) {
109
+ if (isDefined(forcedYear))
110
+ this.displayedYearRangeStart = forcedYear;
111
+ //add the difference between the active year and the start of the range for the current year
112
+ //rounded to a multiple of 24, towards the number zero
113
+ //the difference may be negative, if the active year is before todayYearRangeStart
114
+ this.displayedYearRangeStart = this.todayYearRangeStart + roundToMultiple(this.activeYear - this.todayYearRangeStart, 24, 'to_zero');
115
+ }
116
+ get yearRangeArray() {
117
+ if (!this.yearRangeArrayCache) {
118
+ let yearRangeStart = this.displayedYearRangeStart;
119
+ const newArray = new Array(24).map(() => yearRangeStart++);
120
+ this.yearRangeArrayCache = newArray;
121
+ }
122
+ return this.yearRangeArrayCache;
123
+ }
124
+ set activeDate(v) {
125
+ const newDate = new Date(v);
126
+ if (this.activeYear != newDate.getFullYear())
127
+ this.yearRangeArrayCache = null;
128
+ this._activeDate = newDate;
129
+ this._updateCalendarArray();
130
+ }
131
+ get activeDate() {
132
+ return this._activeDate;
133
+ }
134
+ get activeYear() {
135
+ return this._activeDate.getFullYear();
136
+ }
137
+ set activeYear(v) {
138
+ const year = coerceNumberProperty(v, new Date().getFullYear());
139
+ this._activeDate.setFullYear(year);
140
+ this.activeDate = new Date(year, this.activeMonth, 1);
141
+ this.yearRangeArrayCache = null;
142
+ this._updateCalendarArray();
143
+ }
144
+ get activeMonth() {
145
+ return this._activeDate.getMonth();
146
+ }
147
+ set activeMonth(v) {
148
+ const month = coerceNumberProperty(v, new Date().getMonth());
149
+ const oldDateYear = this.activeYear;
150
+ this.activeDate = new Date(this.activeYear, month, 1);
151
+ if (oldDateYear != this.activeYear)
152
+ this.yearRangeArrayCache = null;
153
+ this._updateCalendarArray();
154
+ }
155
+ set selected(v) {
156
+ this.writeValue(v);
157
+ }
158
+ get selected() {
159
+ return this._selected;
160
+ }
161
+ writeValue(v) {
162
+ if (typeof v == 'string') {
163
+ //try to see if it is an array of numbers separated by a comma
164
+ const vAsArray1 = v.split(',').map(v => Number(v));
165
+ if (vAsArray1.length >= 1 && vAsArray1.length <= 3 && vAsArray1.every(v => !isNaN(v))) {
166
+ v = new Date(vAsArray1[0], vAsArray1[1] ?? 0, vAsArray1[2] ?? 1);
167
+ }
168
+ else {
169
+ //try to see if it is an array of numbers separated by some whitespace
170
+ const vAsArray2 = v.split(/\s/).map(v => Number(v));
171
+ if (vAsArray2.length >= 1 && vAsArray2.length <= 3 && vAsArray2.every(v => !isNaN(v))) {
172
+ v = new Date(vAsArray2[0], vAsArray2[1] ?? 0, vAsArray2[2] ?? 1);
173
+ }
174
+ else {
175
+ v = new Date(v);
176
+ }
177
+ }
178
+ }
179
+ //is a Date object && does not contain an error
180
+ if (v instanceof Date && !isNaN(v.valueOf())) {
181
+ this._selected = v;
182
+ return;
183
+ }
184
+ if (v == null) {
185
+ this._selected = null;
186
+ return;
187
+ }
188
+ console.warn(`Could not parse [selected] value on <ard-calendar>, as it is not a valid value. Provided value: "${v}"`);
189
+ this._selected = null;
190
+ }
191
+ _emitChange() {
192
+ const v = this.selected;
193
+ this._onChangeRegistered?.(v);
194
+ this.selectedChange.emit(v);
195
+ this.changeEvent.emit(v);
196
+ }
197
+ get highlightedDay() {
198
+ return this._highlightedDay;
199
+ }
200
+ set highlightedDay(v) {
201
+ if (isNull(v)) {
202
+ this._highlightedDay = v;
203
+ return;
204
+ }
205
+ const date = new Date(this.activeYear, this.activeMonth, v);
206
+ this._highlightedDay = date.getDate();
207
+ }
208
+ setHighlightedDayAdjustDate(day) {
209
+ this.highlightedDay = day;
210
+ const date = new Date(this.activeYear, this.activeMonth, day);
211
+ if (this.activeYear != date.getFullYear())
212
+ this.activeYear = date.getFullYear();
213
+ if (this.activeMonth != date.getMonth())
214
+ this.activeMonth = date.getMonth();
215
+ }
216
+ get highlightedMonth() {
217
+ return this._highlightedMonth;
218
+ }
219
+ set highlightedMonth(v) {
220
+ if (isNull(v)) {
221
+ this._highlightedMonth = v;
222
+ return;
223
+ }
224
+ const date = new Date(this.activeYear, v, 1);
225
+ this._highlightedMonth = date.getMonth();
226
+ }
227
+ setHighlightedMonthAdjustDate(month) {
228
+ this.highlightedMonth = month;
229
+ const date = new Date(this.activeYear, month, 1);
230
+ if (this.activeYear != date.getFullYear())
231
+ this.activeYear = date.getFullYear();
232
+ }
233
+ get highlightedYear() {
234
+ return this._highlightedYear;
235
+ }
236
+ set highlightedYear(v) {
237
+ this._highlightedYear = v;
238
+ }
239
+ setHighlightedYearAdjustPage(year) {
240
+ this.highlightedYear = year;
241
+ if (year < this.displayedYearRangeStart || year >= this.displayedYearRangeStart + 24) {
242
+ //add the difference between the highlighted year and the displayed range start year
243
+ //rounded to a multiple of 24, away from the number zero
244
+ //the difference may be negative, if the first if condition is met
245
+ this.displayedYearRangeStart += roundToMultiple(year - this.displayedYearRangeStart, 24, 'from_zero');
246
+ }
247
+ }
248
+ get currentAriaLabel() {
249
+ return new Date(this.activeYear, this.activeMonth, this.highlightedDay ?? 1).toLocaleDateString(undefined, {
250
+ weekday: 'long',
251
+ year: 'numeric',
252
+ month: 'long',
253
+ day: 'numeric',
254
+ });
255
+ }
256
+ onCalendarDayMouseover(day) {
257
+ if (day == null)
258
+ return;
259
+ if (this._isUsingKeyboard)
260
+ return;
261
+ this.highlightedDay = day;
262
+ }
263
+ onCalendarMonthMouseover(month) {
264
+ if (this._isUsingKeyboard)
265
+ return;
266
+ this.highlightedMonth = month;
267
+ }
268
+ onCalendarYearMouseover(year) {
269
+ if (this._isUsingKeyboard)
270
+ return;
271
+ this.highlightedYear = year;
272
+ }
273
+ onDocumentMousemove() {
274
+ if (!this._isUsingKeyboard)
275
+ this.highlightedDay = null;
276
+ this._isUsingKeyboard = false;
277
+ }
278
+ onDocumentKeydown() {
279
+ this._isUsingKeyboard = true;
280
+ }
281
+ onCalendarDayClick(day) {
282
+ if (day == null)
283
+ return;
284
+ this.selectDay(day);
285
+ this.focus();
286
+ this.highlightedDay = day;
287
+ }
288
+ onCalendarMonthClick(month) {
289
+ this.selectMonth(month);
290
+ }
291
+ onCalendarYearClick(year) {
292
+ this.selectYear(year);
293
+ }
294
+ onDayGridFocus() {
295
+ this.highlightedDay = 1;
296
+ }
297
+ onDayGridBlur() {
298
+ this.highlightedDay = null;
299
+ }
300
+ onDayGridClick() {
301
+ this.highlightedDay ??= 1;
302
+ }
303
+ onMonthGridFocus() {
304
+ this.highlightedMonth = 0;
305
+ }
306
+ onMonthGridBlur() {
307
+ this.highlightedMonth = null;
308
+ }
309
+ onMonthGridClick() {
310
+ this.highlightedMonth ??= 0;
311
+ }
312
+ onYearGridFocus() {
313
+ this.highlightedYear = this.displayedYearRangeStart;
314
+ }
315
+ onYearGridBlur() {
316
+ this.highlightedYear = null;
317
+ }
318
+ onYearGridClick() {
319
+ this.highlightedYear ??= this.displayedYearRangeStart;
320
+ }
321
+ //! main grid keyboard controls
322
+ onMainGridKeydown(event) {
323
+ switch (event.code) {
324
+ case 'Space':
325
+ case 'Enter':
326
+ this._onEnterPress(event);
327
+ break;
328
+ case 'ArrowUp':
329
+ this._onArrowUpPress(event);
330
+ break;
331
+ case 'ArrowDown':
332
+ this._onArrowDownPress(event);
333
+ break;
334
+ case 'ArrowLeft':
335
+ this._onArrowLeftPress(event);
336
+ break;
337
+ case 'ArrowRight':
338
+ this._onArrowRightPress(event);
339
+ break;
340
+ case 'Home':
341
+ this._onHomePress(event);
342
+ break;
343
+ case 'End':
344
+ this._onEndPress(event);
345
+ break;
346
+ case 'PageUp':
347
+ this._onPageUpPress(event);
348
+ break;
349
+ case 'PageDown':
350
+ this._onPageDownPress(event);
351
+ break;
352
+ default:
353
+ return;
354
+ }
355
+ }
356
+ //select currently selected entry
357
+ _onEnterPress(event) {
358
+ event.preventDefault();
359
+ this.selectCurrentlyHighlighted();
360
+ }
361
+ //highlight the entry one line above
362
+ _onArrowUpPress(event) {
363
+ event.preventDefault();
364
+ switch (this.activeView) {
365
+ case CalendarView.Days:
366
+ this.highlightPreviousDay(7);
367
+ break;
368
+ case CalendarView.Months:
369
+ this.highlightPreviousMonth(3); //3 months per line
370
+ break;
371
+ case CalendarView.Years:
372
+ this.highlightPreviousYear(4); //4 years per line
373
+ break;
374
+ }
375
+ }
376
+ //highlight the entry one line below
377
+ _onArrowDownPress(event) {
378
+ event.preventDefault();
379
+ switch (this.activeView) {
380
+ case CalendarView.Days:
381
+ this.highlightNextDay(7);
382
+ break;
383
+ case CalendarView.Months:
384
+ this.highlightNextMonth(3); //3 months per line
385
+ break;
386
+ case CalendarView.Years:
387
+ this.highlightNextYear(4); //4 years per line
388
+ break;
389
+ }
390
+ }
391
+ //highlight previous entry
392
+ _onArrowLeftPress(event) {
393
+ event.preventDefault();
394
+ switch (this.activeView) {
395
+ case CalendarView.Days:
396
+ this.highlightPreviousDay();
397
+ break;
398
+ case CalendarView.Months:
399
+ this.highlightPreviousMonth();
400
+ break;
401
+ case CalendarView.Years:
402
+ this.highlightPreviousYear();
403
+ break;
404
+ }
405
+ }
406
+ //highlight next entry
407
+ _onArrowRightPress(event) {
408
+ event.preventDefault();
409
+ switch (this.activeView) {
410
+ case CalendarView.Days:
411
+ this.highlightNextDay();
412
+ break;
413
+ case CalendarView.Months:
414
+ this.highlightNextMonth();
415
+ break;
416
+ case CalendarView.Years:
417
+ this.highlightNextYear();
418
+ break;
419
+ }
420
+ }
421
+ //highlight first entry on the page
422
+ _onHomePress(event) {
423
+ event.preventDefault();
424
+ switch (this.activeView) {
425
+ case CalendarView.Days:
426
+ this.highlightFirstDay();
427
+ break;
428
+ case CalendarView.Months:
429
+ this.highlightFirstMonth();
430
+ break;
431
+ case CalendarView.Years:
432
+ this.highlightFirstYear();
433
+ break;
434
+ }
435
+ }
436
+ //highlight last entry on the page
437
+ _onEndPress(event) {
438
+ event.preventDefault();
439
+ switch (this.activeView) {
440
+ case CalendarView.Days:
441
+ this.highlightLastDay();
442
+ break;
443
+ case CalendarView.Months:
444
+ this.highlightLastMonth();
445
+ break;
446
+ case CalendarView.Years:
447
+ this.highlightLastYear();
448
+ break;
449
+ }
450
+ }
451
+ //alone: highlight same entry on the previous page
452
+ //with alt: highlight same entry multiple pages before (days view: 12 pages, months view: 10 pages, years view: 5 pages)
453
+ _onPageUpPress(event) {
454
+ event.preventDefault();
455
+ switch (this.activeView) {
456
+ case CalendarView.Days:
457
+ if (event.altKey)
458
+ this.highlightSameDayPreviousYear();
459
+ else
460
+ this.highlightSameDayPreviousMonth();
461
+ break;
462
+ case CalendarView.Months:
463
+ this.highlightSameMonthPreviousYear(event.altKey);
464
+ break;
465
+ case CalendarView.Years:
466
+ this.highlightSameYearPreviousPage(event.altKey);
467
+ break;
468
+ }
469
+ }
470
+ //alone: highlight same entry on the next page
471
+ //with alt: highlight same entry multiple pages after (days view: 12 pages, months view: 10 pages, years view: 5 pages)
472
+ _onPageDownPress(event) {
473
+ event.preventDefault();
474
+ switch (this.activeView) {
475
+ case CalendarView.Days:
476
+ if (event.altKey)
477
+ this.highlightSameDayNextYear();
478
+ else
479
+ this.highlightSameDayNextMonth();
480
+ break;
481
+ case CalendarView.Months:
482
+ this.highlightSameMonthNextYear(event.altKey);
483
+ break;
484
+ case CalendarView.Years:
485
+ this.highlightSameYearNextPage(event.altKey);
486
+ break;
487
+ }
488
+ }
489
+ //! manipulation methods
490
+ //selecting
491
+ selectDay(day) {
492
+ if (this.isDaySelected(day))
493
+ return;
494
+ if (isNull(day)) {
495
+ if (!isDefined(this.selected))
496
+ return;
497
+ this.selected = null;
498
+ this._emitChange();
499
+ return;
500
+ }
501
+ if (day instanceof Date)
502
+ day = day.getDate();
503
+ this.selected = new Date(this.activeYear, this.activeMonth, day);
504
+ this._emitChange();
505
+ }
506
+ selectMonth(month) {
507
+ if (isNull(month)) {
508
+ this.activeMonth = null;
509
+ return;
510
+ }
511
+ if (month instanceof Date)
512
+ month = month.getMonth();
513
+ this.activeMonth = month;
514
+ this.activeMonthChange.emit(month);
515
+ this.monthSelected.emit(month);
516
+ this.openDaysView();
517
+ }
518
+ selectYear(year) {
519
+ if (isNull(year)) {
520
+ this.activeYear = null;
521
+ return;
522
+ }
523
+ if (year instanceof Date)
524
+ year = year.getFullYear();
525
+ this.activeYear = year;
526
+ this.activeYearChange.emit(year);
527
+ this.yearSelected.emit(year);
528
+ this.openMonthsView();
529
+ }
530
+ selectCurrentlyHighlighted() {
531
+ if (!isDefined(this.highlightedDay))
532
+ return;
533
+ switch (this.activeView) {
534
+ case CalendarView.Days:
535
+ this.selectDay(this.highlightedDay);
536
+ return;
537
+ case CalendarView.Months:
538
+ this.selectMonth(this.highlightedMonth);
539
+ return;
540
+ case CalendarView.Years:
541
+ this.selectYear(this.highlightedYear);
542
+ return;
543
+ default:
544
+ return;
545
+ }
546
+ }
547
+ //active months/years
548
+ changeMonth(offset) {
549
+ const oldyear = this.activeYear;
550
+ this.activeMonth += offset;
551
+ if (this.activeYear != oldyear)
552
+ this.activeYearChange.emit(this.activeYear);
553
+ this.activeMonthChange.emit(this.activeMonth);
554
+ }
555
+ changeYear(offset) {
556
+ this.activeYear += offset;
557
+ this.activeYearChange.emit(this.activeYear);
558
+ }
559
+ //changing year page
560
+ changeYearsViewPage(pages) {
561
+ this.displayedYearRangeStart += 24 * pages;
562
+ }
563
+ //next/prev highlighting
564
+ highlightNextDay(offset = 1) {
565
+ const currentDay = this.highlightedDay;
566
+ if (!isDefined(currentDay)) {
567
+ this.highlightedDay = 1;
568
+ return;
569
+ }
570
+ this.setHighlightedDayAdjustDate(currentDay + offset);
571
+ }
572
+ highlightPreviousDay(offset = 1) {
573
+ this.highlightNextDay(offset * -1);
574
+ }
575
+ highlightNextMonth(offset = 1) {
576
+ const currentMonth = this.highlightedMonth;
577
+ if (!isDefined(currentMonth)) {
578
+ this.highlightedMonth = 0;
579
+ return;
580
+ }
581
+ this.setHighlightedMonthAdjustDate(currentMonth + offset);
582
+ }
583
+ highlightPreviousMonth(offset = 1) {
584
+ this.highlightNextMonth(offset * -1);
585
+ }
586
+ highlightNextYear(offset = 1) {
587
+ const currentYear = this.highlightedYear;
588
+ if (!isDefined(currentYear)) {
589
+ this.highlightedYear = 0;
590
+ return;
591
+ }
592
+ this.setHighlightedYearAdjustPage(currentYear + offset);
593
+ }
594
+ highlightPreviousYear(offset = 1) {
595
+ this.highlightNextYear(offset * -1);
596
+ }
597
+ //first/last highlighting
598
+ highlightFirstDay() {
599
+ this.highlightedDay = 1;
600
+ }
601
+ highlightLastDay() {
602
+ switch (this.activeMonth + 1) {
603
+ case 1:
604
+ case 3:
605
+ case 5:
606
+ case 7:
607
+ case 8:
608
+ case 10:
609
+ case 12:
610
+ this.highlightedDay = 31;
611
+ break;
612
+ case 4:
613
+ case 6:
614
+ case 9:
615
+ case 11:
616
+ this.highlightedDay = 30;
617
+ break;
618
+ case 2:
619
+ if (isLeapYear(this.activeYear))
620
+ this.highlightedDay = 29;
621
+ else
622
+ this.highlightedDay = 28;
623
+ }
624
+ }
625
+ highlightFirstMonth() {
626
+ this.highlightedMonth = 0;
627
+ }
628
+ highlightLastMonth() {
629
+ this.highlightedMonth = 11;
630
+ }
631
+ highlightFirstYear() {
632
+ this.highlightedYear = this.displayedYearRangeStart;
633
+ }
634
+ highlightLastYear() {
635
+ this.highlightedYear = this.displayedYearRangeStart + 23; //24 years per page
636
+ }
637
+ //same day next/prev month/year
638
+ highlightSameDayNextMonth() {
639
+ this.activeMonth++;
640
+ this._fixDateAfterMonthChange();
641
+ }
642
+ highlightSameDayPreviousMonth() {
643
+ this.activeMonth--;
644
+ this._fixDateAfterMonthChange();
645
+ }
646
+ _fixDateAfterMonthChange() {
647
+ switch (this.activeMonth + 1) {
648
+ case 1:
649
+ case 3:
650
+ case 5:
651
+ case 7:
652
+ case 8:
653
+ case 10:
654
+ case 12:
655
+ //do nothing
656
+ break;
657
+ case 4:
658
+ case 6:
659
+ case 9:
660
+ case 11:
661
+ //only do if day is 31
662
+ if (this.highlightedDay == 31)
663
+ this.highlightedDay = 30;
664
+ break;
665
+ case 2: {
666
+ //skip if below 29 or null
667
+ if (!this.highlightedDay || this.highlightedDay < 29)
668
+ break;
669
+ if (isLeapYear(this.activeYear))
670
+ this.highlightedDay = 29;
671
+ else
672
+ this.highlightedDay = 28;
673
+ }
674
+ }
675
+ }
676
+ highlightSameDayNextYear() {
677
+ this.activeYear++;
678
+ this._fixDateAfterYearChange();
679
+ }
680
+ highlightSameDayPreviousYear() {
681
+ this.activeYear--;
682
+ this._fixDateAfterYearChange();
683
+ }
684
+ _fixDateAfterYearChange() {
685
+ if (this.highlightedDay != 29)
686
+ return; //skip if not 29th day is selected
687
+ if (isLeapYear(this.activeYear))
688
+ return; //skip if nea year is a leap year
689
+ if (this.activeMonth != 1)
690
+ return; //skip if not february
691
+ this.highlightedDay = 28;
692
+ }
693
+ //same month next/prev year
694
+ highlightSameMonthNextYear(multiple) {
695
+ this.activeYear += multiple ? 10 : 1;
696
+ }
697
+ highlightSameMonthPreviousYear(multiple) {
698
+ this.activeYear -= multiple ? 10 : 1;
699
+ }
700
+ //same year next/prev page(s)
701
+ highlightSameYearNextPage(multiple) {
702
+ if (!isDefined(this.highlightedYear)) {
703
+ this.highlightedYear = this.displayedYearRangeStart;
704
+ return;
705
+ }
706
+ this.setHighlightedYearAdjustPage(this.highlightedYear + (multiple ? 60 : 24));
707
+ }
708
+ highlightSameYearPreviousPage(multiple) {
709
+ if (!isDefined(this.highlightedYear)) {
710
+ this.highlightedYear = this.displayedYearRangeStart;
711
+ return;
712
+ }
713
+ this.setHighlightedYearAdjustPage(this.highlightedYear - (multiple ? 60 : 24));
714
+ }
715
+ get firstWeekday() {
716
+ return this._firstWeekday;
717
+ }
718
+ set firstWeekday(v) {
719
+ this._firstWeekday = coerceNumberProperty(v, 1) % 7;
720
+ this._updateCalendarArray();
721
+ this._updateWeekdayArray();
722
+ }
723
+ get nointeract() {
724
+ return this._nointeract || this.disabled;
725
+ }
726
+ set nointeract(v) {
727
+ this._nointeract = coerceBooleanProperty(v);
728
+ }
729
+ get staticHeight() {
730
+ return this._staticHeight;
731
+ }
732
+ set staticHeight(v) {
733
+ this._staticHeight = coerceBooleanProperty(v);
734
+ }
735
+ _updateCalendarArray() {
736
+ const resultObj = getMonthLayout(this._activeDate, this.firstWeekday);
737
+ this.reserveTopRow = resultObj.leadingSpaces < 3;
738
+ this.calendarArray = resultObj.array;
739
+ }
740
+ getYearsArray() {
741
+ const year = this.displayedYearRangeStart;
742
+ if (this._yearsArrayCacheStartYear == year && isDefined(this._yearsArrayCache))
743
+ return this._yearsArrayCache;
744
+ const newArray = [];
745
+ for (let i = year; i < year + 24; i++) {
746
+ newArray.push(i);
747
+ }
748
+ this._yearsArrayCache = newArray;
749
+ this._yearsArrayCacheStartYear = year;
750
+ return newArray;
751
+ }
752
+ _updateWeekdayArray() {
753
+ this.weekdayArray = [0, 1, 2, 3, 4, 5, 6].map(v => (v + this.firstWeekday) % 7);
754
+ }
755
+ set startView(v) {
756
+ this.activeView = v;
757
+ }
758
+ openYearsView() {
759
+ this.activeView = CalendarView.Years;
760
+ this._updateDisplayedYearRangeStart();
761
+ this.viewChange.emit(this.activeView);
762
+ }
763
+ openMonthsView() {
764
+ this.activeView = CalendarView.Months;
765
+ //bring back old value
766
+ const oldYear = this.activeYear;
767
+ this.activeYear = this.activeYear ?? this.todayDate.getFullYear();
768
+ //emit events
769
+ this.viewChange.emit(this.activeView);
770
+ if (oldYear != this.activeYear && this.activeYear == this.todayDate.getFullYear())
771
+ this.activeYearChange.emit(this.activeYear);
772
+ }
773
+ openDaysView() {
774
+ this.activeView = CalendarView.Days;
775
+ //bring back old values
776
+ const oldYear = this.activeYear;
777
+ this.activeYear = this.activeYear ?? this.todayDate.getFullYear();
778
+ const oldMonth = this.activeMonth;
779
+ this.activeMonth = this.activeMonth ?? this.todayDate.getMonth();
780
+ //emit events
781
+ this.viewChange.emit(this.activeView);
782
+ if (oldYear != this.activeYear && this.activeYear == this.todayDate.getFullYear())
783
+ this.activeYearChange.emit(this.activeYear);
784
+ if (oldMonth != this.activeMonth && this.activeMonth == this.todayDate.getMonth())
785
+ this.activeMonthChange.emit(this.activeMonth);
786
+ }
787
+ //! context getters
788
+ //headers
789
+ getYearsViewHeaderContext() {
790
+ const yearRangeStart = this.displayedYearRangeStart;
791
+ const yearRangeEnd = yearRangeStart + 23;
792
+ const dateRange = {
793
+ low: new Date(yearRangeStart, 0, 1),
794
+ high: new Date(yearRangeEnd, 0, 1),
795
+ };
796
+ return {
797
+ nextPage: () => {
798
+ this.changeYearsViewPage(+1);
799
+ },
800
+ prevPage: () => {
801
+ this.changeYearsViewPage(-1);
802
+ },
803
+ openDaysView: () => {
804
+ this.openDaysView();
805
+ },
806
+ yearRange: {
807
+ low: yearRangeStart,
808
+ high: yearRangeEnd,
809
+ },
810
+ dateRange,
811
+ $implicit: dateRange,
812
+ };
813
+ }
814
+ getMonthsViewHeaderContext() {
815
+ return {
816
+ openYearsView: () => {
817
+ this.openYearsView();
818
+ },
819
+ openDaysView: () => {
820
+ this.openDaysView();
821
+ },
822
+ year: this.activeYear,
823
+ date: this.activeDate,
824
+ $implicit: this.activeYear,
825
+ };
826
+ }
827
+ getDaysViewHeaderContext() {
828
+ return {
829
+ nextMonth: () => {
830
+ this.changeMonth(+1);
831
+ },
832
+ prevMonth: () => {
833
+ this.changeMonth(-1);
834
+ },
835
+ nextYear: () => {
836
+ this.changeYear(+1);
837
+ },
838
+ prevYear: () => {
839
+ this.changeYear(-1);
840
+ },
841
+ openYearsView: () => {
842
+ this.openYearsView();
843
+ },
844
+ openMonthsView: () => {
845
+ this.openMonthsView();
846
+ },
847
+ year: this.activeYear,
848
+ month: this.activeMonth,
849
+ date: this.activeDate,
850
+ $implicit: this.activeDate,
851
+ };
852
+ }
853
+ //weekday
854
+ getWeekdayContext(dayIndex) {
855
+ const date = new Date(1970, 0, 4 + dayIndex);
856
+ return {
857
+ dayIndex,
858
+ date,
859
+ $implicit: date,
860
+ };
861
+ }
862
+ //floating month
863
+ getFloatingMonthContext() {
864
+ return {
865
+ month: this.activeMonth,
866
+ date: this.activeDate,
867
+ $implicit: this.activeDate,
868
+ };
869
+ }
870
+ //grid elements (year, month, day)
871
+ getYearContext(year) {
872
+ return {
873
+ value: year,
874
+ date: new Date(this.activeYear, 0, 1),
875
+ $implicit: year,
876
+ select: (year) => {
877
+ this.selectYear(year);
878
+ },
879
+ };
880
+ }
881
+ getMonthContext(month) {
882
+ const date = new Date(this.activeYear, month, 1);
883
+ return {
884
+ month,
885
+ date,
886
+ $implicit: date,
887
+ select: (month) => {
888
+ this.selectMonth(month);
889
+ },
890
+ };
891
+ }
892
+ getDayContext(day) {
893
+ return {
894
+ value: day,
895
+ date: new Date(this.activeYear, this.activeMonth, day),
896
+ $implicit: day,
897
+ select: (day) => {
898
+ this.selectDay(day);
899
+ },
900
+ };
901
+ }
902
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.7", ngImport: i0, type: ArdiumCalendarComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
903
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.7", type: ArdiumCalendarComponent, selector: "ard-calendar", inputs: { color: "color", activeYear: "activeYear", activeMonth: "activeMonth", selected: "selected", firstWeekday: "firstWeekday", nointeract: "nointeract", staticHeight: "staticHeight", startView: "startView" }, outputs: { yearSelected: "yearSelected", monthSelected: "monthSelected", selectedChange: "selectedChange", activeYearChange: "activeYearChange", activeMonthChange: "activeMonthChange", viewChange: "viewChange", changeEvent: "change" }, host: { listeners: { "document:mousemove": "onDocumentMousemove()", "document:keydown": "onDocumentKeydown()" } }, providers: [
904
+ {
905
+ provide: NG_VALUE_ACCESSOR,
906
+ useExisting: forwardRef(() => ArdiumCalendarComponent),
907
+ multi: true,
908
+ },
909
+ ], queries: [{ propertyName: "yearsViewHeaderTemplate", first: true, predicate: ArdYearsViewHeaderTemplateDirective, descendants: true }, { propertyName: "monthsViewHeaderTemplate", first: true, predicate: ArdMonthsViewHeaderTemplateDirective, descendants: true }, { propertyName: "daysViewHeaderTemplate", first: true, predicate: ArdDaysViewHeaderTemplateDirective, descendants: true }, { propertyName: "weekdayTemplate", first: true, predicate: ArdWeekdayTemplateDirective, descendants: true }, { propertyName: "floatingMonthTemplate", first: true, predicate: ArdFloatingMonthTemplateDirective, descendants: true }, { propertyName: "yearTemplate", first: true, predicate: ArdYearTemplateDirective, descendants: true }, { propertyName: "monthTemplate", first: true, predicate: ArdMonthTemplateDirective, descendants: true }, { propertyName: "dayTemplate", first: true, predicate: ArdDayTemplateDirective, descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"ard-calendar\" [ngClass]=\"ngClasses\">\r\n <ng-template [ngTemplateOutlet]=\"activeView == 'days' ? daysView : activeView == 'months' ? monthsView : yearsView\"/>\r\n</div>\r\n\r\n<ng-template #yearsView>\r\n <div class=\"ard-calendar-header-container\">\r\n <ng-template #defaultYearsViewHeaderTemplate let-currRange let-nextPage=\"nextPage\" let-prevPage=\"prevPage\" let-openDaysView=\"openDaysView\">\r\n <div class=\"ard-calendar-days-view-header\">\r\n <ard-button\r\n class=\"ard-calendar-header-button\"\r\n appearance=\"transparent\"\r\n color=\"none\"\r\n [tabIndex]=\"tabIndex\"\r\n (click)=\"openDaysView()\"\r\n >\r\n {{ currRange.low | date: 'YYYY' }}\r\n &mdash;\r\n {{ currRange.high | date: 'YYYY' }}\r\n <div class=\"ard-dropdown-arrow\"></div>\r\n </ard-button>\r\n <div class=\"ard-calendar-arrows\">\r\n <ard-icon-button size=\"small\" appearance=\"transparent\" color=\"none\" (click)=\"prevPage()\" [tabIndex]=\"tabIndex\">\r\n <ard-icon>chevron_left</ard-icon>\r\n </ard-icon-button>\r\n <ard-icon-button size=\"small\" appearance=\"transparent\" color=\"none\" (click)=\"nextPage()\" [tabIndex]=\"tabIndex\">\r\n <ard-icon>chevron_right</ard-icon>\r\n </ard-icon-button>\r\n </div>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"yearsViewHeaderTemplate || defaultYearsViewHeaderTemplate\"\r\n [ngTemplateOutletContext]=\"getYearsViewHeaderContext()\"\r\n />\r\n </div>\r\n <div class=\"ard-calendar-main-container\">\r\n <div #focusableElement\r\n class=\"ard-calendar-simple-grid\"\r\n [tabindex]=\"tabIndex\"\r\n [ariaLabel]=\"currentAriaLabel\"\r\n (focus)=\"onFocus($event)\"\r\n (focus)=\"onYearGridFocus()\"\r\n (blur)=\"onBlur($event)\"\r\n (blur)=\"onYearGridBlur()\"\r\n (click)=\"onYearGridClick()\"\r\n (keydown)=\"onMainGridKeydown($event)\"\r\n role=\"grid\"\r\n >\r\n <ng-container *ngFor=\"let year of getYearsArray()\">\r\n <div class=\"ard-calendar-entry\"\r\n [class.ard-calendar-entry-highlighted]=\"highlightedYear == year || activeYear == year\"\r\n [class.ard-calendar-entry-selected]=\"isYearSelected(year)\"\r\n [class.ard-calendar-today]=\"isYearToday(year)\"\r\n (click)=\"onCalendarYearClick(year)\"\r\n (mousemove)=\"$event.stopPropagation()\"\r\n (mouseover)=\"onCalendarYearMouseover(year)\"\r\n role=\"gridcell\"\r\n >\r\n <button class=\"ard-calendar-entry-button\" tabindex=\"-1\">\r\n <div class=\"ard-focus-overlay\"></div>\r\n <div class=\"ard-button-content\">\r\n <ng-template #defaultYearTemplate let-year>\r\n {{ year }}\r\n </ng-template>\r\n <ng-template\r\n [ngTemplateOutlet]=\"yearTemplate || defaultYearTemplate\"\r\n [ngTemplateOutletContext]=\"getYearContext(year)\"\r\n ></ng-template>\r\n </div>\r\n </button>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #monthsView>\r\n <div class=\"ard-calendar-header-container\">\r\n <ng-template #defaultMonthsViewHeaderTemplate let-year let-nextPage=\"nextPage\" let-prevPage=\"prevPage\" let-openDaysView=\"openDaysView\">\r\n <div class=\"ard-calendar-days-view-header\">\r\n <ard-button\r\n class=\"ard-calendar-header-button\"\r\n appearance=\"transparent\"\r\n [color]=\"color\"\r\n [tabIndex]=\"tabIndex\"\r\n (click)=\"openDaysView()\"\r\n >\r\n {{ year }}\r\n <div class=\"ard-dropdown-arrow\"></div>\r\n </ard-button>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"monthsViewHeaderTemplate || defaultMonthsViewHeaderTemplate\"\r\n [ngTemplateOutletContext]=\"getMonthsViewHeaderContext()\"\r\n />\r\n </div>\r\n <div class=\"ard-calendar-main-container\">\r\n <div #focusableElement\r\n class=\"ard-calendar-simple-grid\"\r\n [tabindex]=\"tabIndex\"\r\n [ariaLabel]=\"currentAriaLabel\"\r\n (focus)=\"onFocus($event)\"\r\n (focus)=\"onMonthGridFocus()\"\r\n (blur)=\"onBlur($event)\"\r\n (blur)=\"onMonthGridBlur()\"\r\n (click)=\"onMonthGridClick()\"\r\n (keydown)=\"onMainGridKeydown($event)\"\r\n role=\"grid\"\r\n >\r\n <ng-container *ngFor=\"let month of monthsArray\">\r\n <div class=\"ard-calendar-entry\"\r\n [class.ard-calendar-entry-highlighted]=\"highlightedMonth == month || activeMonth == month\"\r\n [class.ard-calendar-entry-selected]=\"isMonthSelected(month)\"\r\n [class.ard-calendar-today]=\"isMonthToday(month)\"\r\n (click)=\"onCalendarMonthClick(month)\"\r\n (mousemove)=\"$event.stopPropagation()\"\r\n (mouseover)=\"onCalendarMonthMouseover(month)\"\r\n role=\"gridcell\"\r\n >\r\n <button class=\"ard-calendar-entry-button\" tabindex=\"-1\">\r\n <div class=\"ard-focus-overlay\"></div>\r\n <div class=\"ard-button-content\">\r\n <ng-template #defaultMonthTemplate let-month>\r\n {{ month | date: \"MMM\" | uppercase }}\r\n </ng-template>\r\n <ng-template\r\n [ngTemplateOutlet]=\"monthTemplate || defaultMonthTemplate\"\r\n [ngTemplateOutletContext]=\"getMonthContext(month)\"\r\n ></ng-template>\r\n </div>\r\n </button>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #daysView>\r\n <div class=\"ard-calendar-header-container\">\r\n <ng-template #defaultDaysViewHeaderTemplate let-currDate let-nextMonth=\"nextMonth\" let-prevMonth=\"prevMonth\" let-openYearsView=\"openYearsView\">\r\n <div class=\"ard-calendar-days-view-header\">\r\n <ard-button\r\n class=\"ard-calendar-header-button\"\r\n appearance=\"transparent\"\r\n color=\"none\"\r\n [tabIndex]=\"tabIndex\"\r\n (click)=\"openYearsView()\"\r\n >\r\n {{ currDate | date: 'MMM YYYY' | uppercase }}\r\n <div class=\"ard-dropdown-arrow\"></div>\r\n </ard-button>\r\n <div class=\"ard-calendar-arrows\">\r\n <ard-icon-button size=\"small\" appearance=\"transparent\" color=\"none\" (click)=\"prevMonth()\" [tabIndex]=\"tabIndex\">\r\n <ard-icon>chevron_left</ard-icon>\r\n </ard-icon-button>\r\n <ard-icon-button size=\"small\" appearance=\"transparent\" color=\"none\" (click)=\"nextMonth()\" [tabIndex]=\"tabIndex\">\r\n <ard-icon>chevron_right</ard-icon>\r\n </ard-icon-button>\r\n </div>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"daysViewHeaderTemplate || defaultDaysViewHeaderTemplate\"\r\n [ngTemplateOutletContext]=\"getDaysViewHeaderContext()\"\r\n />\r\n </div>\r\n <div class=\"ard-calendar-main-container\">\r\n <div class=\"ard-calendar-day-labels ard-calendar-grid\">\r\n <ng-template #defaultWeekdayTemplate let-date>\r\n <div class=\"ard-calendar-weekday\">{{ date | date: 'EEEEE' }}</div>\r\n </ng-template>\r\n <ng-container *ngFor=\"let weekdayIndex of weekdayArray\">\r\n <ng-template\r\n [ngTemplateOutlet]=\"weekdayTemplate || defaultWeekdayTemplate\"\r\n [ngTemplateOutletContext]=\"getWeekdayContext(weekdayIndex)\"\r\n ></ng-template>\r\n </ng-container>\r\n </div>\r\n <div #focusableElement\r\n class=\"ard-calendar-main-grid ard-calendar-grid\"\r\n [class.ard-reserve-top-row]=\"reserveTopRow\"\r\n [tabindex]=\"tabIndex\"\r\n [ariaLabel]=\"currentAriaLabel\"\r\n (focus)=\"onFocus($event)\"\r\n (focus)=\"onDayGridFocus()\"\r\n (blur)=\"onBlur($event)\"\r\n (blur)=\"onDayGridBlur()\"\r\n (click)=\"onDayGridClick()\"\r\n (keydown)=\"onMainGridKeydown($event)\"\r\n role=\"grid\"\r\n >\r\n <div class=\"ard-calendar-floating-month\">\r\n <ng-template #defaultFloatingMonthTemplate let-date>\r\n {{ date | date: 'LLL' | uppercase }}\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"floatingMonthTemplate || defaultFloatingMonthTemplate\"\r\n [ngTemplateOutletContext]=\"getFloatingMonthContext()\"\r\n ></ng-template>\r\n </div>\r\n <ng-container *ngFor=\"let week of calendarArray\">\r\n <ng-container *ngFor=\"let day of week\">\r\n <div class=\"ard-calendar-entry\"\r\n [class.ard-calendar-entry-empty]=\"day == null\"\r\n [class.ard-calendar-entry-highlighted]=\"highlightedDay == day\"\r\n [class.ard-calendar-entry-selected]=\"isDaySelected(day)\"\r\n [class.ard-calendar-today]=\"isDayToday(day)\"\r\n (click)=\"onCalendarDayClick(day)\"\r\n (mousemove)=\"$event.stopPropagation()\"\r\n (mouseover)=\"onCalendarDayMouseover(day)\"\r\n role=\"gridcell\"\r\n >\r\n <button class=\"ard-calendar-entry-button\"\r\n *ngIf=\"day != null\"\r\n tabindex=\"-1\"\r\n >\r\n <div class=\"ard-focus-overlay\"></div>\r\n <div class=\"ard-button-content\">\r\n <ng-template #defaultDayTemplate let-day>\r\n {{ day }}\r\n </ng-template>\r\n <ng-template\r\n [ngTemplateOutlet]=\"dayTemplate || defaultDayTemplate\"\r\n [ngTemplateOutletContext]=\"getDayContext(day)\"\r\n ></ng-template>\r\n </div>\r\n </button>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n\r\n<!-- <ng-container *ngIf=\"isLoading\">\r\n <ng-template #defaultLoadingSpinnerTemplate>\r\n <div class=\"ard-spinner\"></div>\r\n </ng-template>\r\n\r\n <ng-template [ngTemplateOutlet]=\"loadingSpinnerTemplate || defaultLoadingSpinnerTemplate\">\r\n </ng-template>\r\n</ng-container> -->", styles: [".ard-calendar{display:flex;flex-direction:column}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i2.ArdiumButtonComponent, selector: "ard-button", inputs: ["variant", "alignIcon", "vertical", "icon"] }, { kind: "component", type: i3.ArdiumIconButtonComponent, selector: "ard-icon-button", inputs: ["wrapperClasses", "color", "compact"] }, { kind: "component", type: i4.ArdiumIconComponent, selector: "ard-icon", inputs: ["ariaLabel", "icon", "filled", "weight", "grade", "opticalSize"] }, { kind: "pipe", type: i1.UpperCasePipe, name: "uppercase" }, { kind: "pipe", type: i1.DatePipe, name: "date" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
910
+ }
911
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.7", ngImport: i0, type: ArdiumCalendarComponent, decorators: [{
912
+ type: Component,
913
+ args: [{ selector: 'ard-calendar', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, providers: [
914
+ {
915
+ provide: NG_VALUE_ACCESSOR,
916
+ useExisting: forwardRef(() => ArdiumCalendarComponent),
917
+ multi: true,
918
+ },
919
+ ], template: "<div class=\"ard-calendar\" [ngClass]=\"ngClasses\">\r\n <ng-template [ngTemplateOutlet]=\"activeView == 'days' ? daysView : activeView == 'months' ? monthsView : yearsView\"/>\r\n</div>\r\n\r\n<ng-template #yearsView>\r\n <div class=\"ard-calendar-header-container\">\r\n <ng-template #defaultYearsViewHeaderTemplate let-currRange let-nextPage=\"nextPage\" let-prevPage=\"prevPage\" let-openDaysView=\"openDaysView\">\r\n <div class=\"ard-calendar-days-view-header\">\r\n <ard-button\r\n class=\"ard-calendar-header-button\"\r\n appearance=\"transparent\"\r\n color=\"none\"\r\n [tabIndex]=\"tabIndex\"\r\n (click)=\"openDaysView()\"\r\n >\r\n {{ currRange.low | date: 'YYYY' }}\r\n &mdash;\r\n {{ currRange.high | date: 'YYYY' }}\r\n <div class=\"ard-dropdown-arrow\"></div>\r\n </ard-button>\r\n <div class=\"ard-calendar-arrows\">\r\n <ard-icon-button size=\"small\" appearance=\"transparent\" color=\"none\" (click)=\"prevPage()\" [tabIndex]=\"tabIndex\">\r\n <ard-icon>chevron_left</ard-icon>\r\n </ard-icon-button>\r\n <ard-icon-button size=\"small\" appearance=\"transparent\" color=\"none\" (click)=\"nextPage()\" [tabIndex]=\"tabIndex\">\r\n <ard-icon>chevron_right</ard-icon>\r\n </ard-icon-button>\r\n </div>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"yearsViewHeaderTemplate || defaultYearsViewHeaderTemplate\"\r\n [ngTemplateOutletContext]=\"getYearsViewHeaderContext()\"\r\n />\r\n </div>\r\n <div class=\"ard-calendar-main-container\">\r\n <div #focusableElement\r\n class=\"ard-calendar-simple-grid\"\r\n [tabindex]=\"tabIndex\"\r\n [ariaLabel]=\"currentAriaLabel\"\r\n (focus)=\"onFocus($event)\"\r\n (focus)=\"onYearGridFocus()\"\r\n (blur)=\"onBlur($event)\"\r\n (blur)=\"onYearGridBlur()\"\r\n (click)=\"onYearGridClick()\"\r\n (keydown)=\"onMainGridKeydown($event)\"\r\n role=\"grid\"\r\n >\r\n <ng-container *ngFor=\"let year of getYearsArray()\">\r\n <div class=\"ard-calendar-entry\"\r\n [class.ard-calendar-entry-highlighted]=\"highlightedYear == year || activeYear == year\"\r\n [class.ard-calendar-entry-selected]=\"isYearSelected(year)\"\r\n [class.ard-calendar-today]=\"isYearToday(year)\"\r\n (click)=\"onCalendarYearClick(year)\"\r\n (mousemove)=\"$event.stopPropagation()\"\r\n (mouseover)=\"onCalendarYearMouseover(year)\"\r\n role=\"gridcell\"\r\n >\r\n <button class=\"ard-calendar-entry-button\" tabindex=\"-1\">\r\n <div class=\"ard-focus-overlay\"></div>\r\n <div class=\"ard-button-content\">\r\n <ng-template #defaultYearTemplate let-year>\r\n {{ year }}\r\n </ng-template>\r\n <ng-template\r\n [ngTemplateOutlet]=\"yearTemplate || defaultYearTemplate\"\r\n [ngTemplateOutletContext]=\"getYearContext(year)\"\r\n ></ng-template>\r\n </div>\r\n </button>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #monthsView>\r\n <div class=\"ard-calendar-header-container\">\r\n <ng-template #defaultMonthsViewHeaderTemplate let-year let-nextPage=\"nextPage\" let-prevPage=\"prevPage\" let-openDaysView=\"openDaysView\">\r\n <div class=\"ard-calendar-days-view-header\">\r\n <ard-button\r\n class=\"ard-calendar-header-button\"\r\n appearance=\"transparent\"\r\n [color]=\"color\"\r\n [tabIndex]=\"tabIndex\"\r\n (click)=\"openDaysView()\"\r\n >\r\n {{ year }}\r\n <div class=\"ard-dropdown-arrow\"></div>\r\n </ard-button>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"monthsViewHeaderTemplate || defaultMonthsViewHeaderTemplate\"\r\n [ngTemplateOutletContext]=\"getMonthsViewHeaderContext()\"\r\n />\r\n </div>\r\n <div class=\"ard-calendar-main-container\">\r\n <div #focusableElement\r\n class=\"ard-calendar-simple-grid\"\r\n [tabindex]=\"tabIndex\"\r\n [ariaLabel]=\"currentAriaLabel\"\r\n (focus)=\"onFocus($event)\"\r\n (focus)=\"onMonthGridFocus()\"\r\n (blur)=\"onBlur($event)\"\r\n (blur)=\"onMonthGridBlur()\"\r\n (click)=\"onMonthGridClick()\"\r\n (keydown)=\"onMainGridKeydown($event)\"\r\n role=\"grid\"\r\n >\r\n <ng-container *ngFor=\"let month of monthsArray\">\r\n <div class=\"ard-calendar-entry\"\r\n [class.ard-calendar-entry-highlighted]=\"highlightedMonth == month || activeMonth == month\"\r\n [class.ard-calendar-entry-selected]=\"isMonthSelected(month)\"\r\n [class.ard-calendar-today]=\"isMonthToday(month)\"\r\n (click)=\"onCalendarMonthClick(month)\"\r\n (mousemove)=\"$event.stopPropagation()\"\r\n (mouseover)=\"onCalendarMonthMouseover(month)\"\r\n role=\"gridcell\"\r\n >\r\n <button class=\"ard-calendar-entry-button\" tabindex=\"-1\">\r\n <div class=\"ard-focus-overlay\"></div>\r\n <div class=\"ard-button-content\">\r\n <ng-template #defaultMonthTemplate let-month>\r\n {{ month | date: \"MMM\" | uppercase }}\r\n </ng-template>\r\n <ng-template\r\n [ngTemplateOutlet]=\"monthTemplate || defaultMonthTemplate\"\r\n [ngTemplateOutletContext]=\"getMonthContext(month)\"\r\n ></ng-template>\r\n </div>\r\n </button>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #daysView>\r\n <div class=\"ard-calendar-header-container\">\r\n <ng-template #defaultDaysViewHeaderTemplate let-currDate let-nextMonth=\"nextMonth\" let-prevMonth=\"prevMonth\" let-openYearsView=\"openYearsView\">\r\n <div class=\"ard-calendar-days-view-header\">\r\n <ard-button\r\n class=\"ard-calendar-header-button\"\r\n appearance=\"transparent\"\r\n color=\"none\"\r\n [tabIndex]=\"tabIndex\"\r\n (click)=\"openYearsView()\"\r\n >\r\n {{ currDate | date: 'MMM YYYY' | uppercase }}\r\n <div class=\"ard-dropdown-arrow\"></div>\r\n </ard-button>\r\n <div class=\"ard-calendar-arrows\">\r\n <ard-icon-button size=\"small\" appearance=\"transparent\" color=\"none\" (click)=\"prevMonth()\" [tabIndex]=\"tabIndex\">\r\n <ard-icon>chevron_left</ard-icon>\r\n </ard-icon-button>\r\n <ard-icon-button size=\"small\" appearance=\"transparent\" color=\"none\" (click)=\"nextMonth()\" [tabIndex]=\"tabIndex\">\r\n <ard-icon>chevron_right</ard-icon>\r\n </ard-icon-button>\r\n </div>\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"daysViewHeaderTemplate || defaultDaysViewHeaderTemplate\"\r\n [ngTemplateOutletContext]=\"getDaysViewHeaderContext()\"\r\n />\r\n </div>\r\n <div class=\"ard-calendar-main-container\">\r\n <div class=\"ard-calendar-day-labels ard-calendar-grid\">\r\n <ng-template #defaultWeekdayTemplate let-date>\r\n <div class=\"ard-calendar-weekday\">{{ date | date: 'EEEEE' }}</div>\r\n </ng-template>\r\n <ng-container *ngFor=\"let weekdayIndex of weekdayArray\">\r\n <ng-template\r\n [ngTemplateOutlet]=\"weekdayTemplate || defaultWeekdayTemplate\"\r\n [ngTemplateOutletContext]=\"getWeekdayContext(weekdayIndex)\"\r\n ></ng-template>\r\n </ng-container>\r\n </div>\r\n <div #focusableElement\r\n class=\"ard-calendar-main-grid ard-calendar-grid\"\r\n [class.ard-reserve-top-row]=\"reserveTopRow\"\r\n [tabindex]=\"tabIndex\"\r\n [ariaLabel]=\"currentAriaLabel\"\r\n (focus)=\"onFocus($event)\"\r\n (focus)=\"onDayGridFocus()\"\r\n (blur)=\"onBlur($event)\"\r\n (blur)=\"onDayGridBlur()\"\r\n (click)=\"onDayGridClick()\"\r\n (keydown)=\"onMainGridKeydown($event)\"\r\n role=\"grid\"\r\n >\r\n <div class=\"ard-calendar-floating-month\">\r\n <ng-template #defaultFloatingMonthTemplate let-date>\r\n {{ date | date: 'LLL' | uppercase }}\r\n </ng-template>\r\n\r\n <ng-template\r\n [ngTemplateOutlet]=\"floatingMonthTemplate || defaultFloatingMonthTemplate\"\r\n [ngTemplateOutletContext]=\"getFloatingMonthContext()\"\r\n ></ng-template>\r\n </div>\r\n <ng-container *ngFor=\"let week of calendarArray\">\r\n <ng-container *ngFor=\"let day of week\">\r\n <div class=\"ard-calendar-entry\"\r\n [class.ard-calendar-entry-empty]=\"day == null\"\r\n [class.ard-calendar-entry-highlighted]=\"highlightedDay == day\"\r\n [class.ard-calendar-entry-selected]=\"isDaySelected(day)\"\r\n [class.ard-calendar-today]=\"isDayToday(day)\"\r\n (click)=\"onCalendarDayClick(day)\"\r\n (mousemove)=\"$event.stopPropagation()\"\r\n (mouseover)=\"onCalendarDayMouseover(day)\"\r\n role=\"gridcell\"\r\n >\r\n <button class=\"ard-calendar-entry-button\"\r\n *ngIf=\"day != null\"\r\n tabindex=\"-1\"\r\n >\r\n <div class=\"ard-focus-overlay\"></div>\r\n <div class=\"ard-button-content\">\r\n <ng-template #defaultDayTemplate let-day>\r\n {{ day }}\r\n </ng-template>\r\n <ng-template\r\n [ngTemplateOutlet]=\"dayTemplate || defaultDayTemplate\"\r\n [ngTemplateOutletContext]=\"getDayContext(day)\"\r\n ></ng-template>\r\n </div>\r\n </button>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n\r\n<!-- <ng-container *ngIf=\"isLoading\">\r\n <ng-template #defaultLoadingSpinnerTemplate>\r\n <div class=\"ard-spinner\"></div>\r\n </ng-template>\r\n\r\n <ng-template [ngTemplateOutlet]=\"loadingSpinnerTemplate || defaultLoadingSpinnerTemplate\">\r\n </ng-template>\r\n</ng-container> -->", styles: [".ard-calendar{display:flex;flex-direction:column}\n"] }]
920
+ }], propDecorators: { color: [{
921
+ type: Input
922
+ }], activeYear: [{
923
+ type: Input
924
+ }], activeMonth: [{
925
+ type: Input
926
+ }], selected: [{
927
+ type: Input
928
+ }], yearSelected: [{
929
+ type: Output
930
+ }], monthSelected: [{
931
+ type: Output
932
+ }], selectedChange: [{
933
+ type: Output
934
+ }], activeYearChange: [{
935
+ type: Output
936
+ }], activeMonthChange: [{
937
+ type: Output
938
+ }], viewChange: [{
939
+ type: Output
940
+ }], changeEvent: [{
941
+ type: Output,
942
+ args: ['change']
943
+ }], onDocumentMousemove: [{
944
+ type: HostListener,
945
+ args: ['document:mousemove']
946
+ }], onDocumentKeydown: [{
947
+ type: HostListener,
948
+ args: ['document:keydown']
949
+ }], firstWeekday: [{
950
+ type: Input
951
+ }], nointeract: [{
952
+ type: Input
953
+ }], staticHeight: [{
954
+ type: Input
955
+ }], startView: [{
956
+ type: Input
957
+ }], yearsViewHeaderTemplate: [{
958
+ type: ContentChild,
959
+ args: [ArdYearsViewHeaderTemplateDirective]
960
+ }], monthsViewHeaderTemplate: [{
961
+ type: ContentChild,
962
+ args: [ArdMonthsViewHeaderTemplateDirective]
963
+ }], daysViewHeaderTemplate: [{
964
+ type: ContentChild,
965
+ args: [ArdDaysViewHeaderTemplateDirective]
966
+ }], weekdayTemplate: [{
967
+ type: ContentChild,
968
+ args: [ArdWeekdayTemplateDirective]
969
+ }], floatingMonthTemplate: [{
970
+ type: ContentChild,
971
+ args: [ArdFloatingMonthTemplateDirective]
972
+ }], yearTemplate: [{
973
+ type: ContentChild,
974
+ args: [ArdYearTemplateDirective]
975
+ }], monthTemplate: [{
976
+ type: ContentChild,
977
+ args: [ArdMonthTemplateDirective]
978
+ }], dayTemplate: [{
979
+ type: ContentChild,
980
+ args: [ArdDayTemplateDirective]
981
+ }] } });
982
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdWkvc3JjL2xpYi9jYWxlbmRhci9jYWxlbmRhci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy91aS9zcmMvbGliL2NhbGVuZGFyL2NhbGVuZGFyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBNEIsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JFLE9BQU8sRUFDSCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFlBQVksRUFDWixZQUFZLEVBQ1osWUFBWSxFQUNaLEtBQUssRUFFTCxNQUFNLEVBRU4saUJBQWlCLEdBQ3BCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2hGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDaEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDaEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3ZFLE9BQU8sRUFDSCxrQ0FBa0MsRUFDbEMsdUJBQXVCLEVBQ3ZCLGlDQUFpQyxFQUNqQyxvQ0FBb0MsRUFDcEMseUJBQXlCLEVBQ3pCLDJCQUEyQixFQUMzQixtQ0FBbUMsRUFDbkMsd0JBQXdCLEdBQzNCLE1BQU0sdUJBQXVCLENBQUM7QUFDL0IsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3BELE9BQU8sRUFDSCxZQUFZLEdBVWYsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7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QkFHbEQsc0JBQXNCO3NCQURyQixZQUFZO3VCQUFDLGtDQUFrQztnQkFJaEQsZUFBZTtzQkFEZCxZQUFZO3VCQUFDLDJCQUEyQjtnQkFJekMscUJBQXFCO3NCQURwQixZQUFZO3VCQUFDLGlDQUFpQztnQkFJL0MsWUFBWTtzQkFEWCxZQUFZO3VCQUFDLHdCQUF3QjtnQkFHdEMsYUFBYTtzQkFEWixZQUFZO3VCQUFDLHlCQUF5QjtnQkFHdkMsV0FBVztzQkFEVixZQUFZO3VCQUFDLHVCQUF1QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFRoaXNSZWNlaXZlciB9IGZyb20gJ0Bhbmd1bGFyL2NvbXBpbGVyJztcbmltcG9ydCB7IE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlcywgZm9yd2FyZFJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICBDb21wb25lbnQsXG4gICAgQ29udGVudENoaWxkLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBIb3N0TGlzdGVuZXIsXG4gICAgSW5wdXQsXG4gICAgT25Jbml0LFxuICAgIE91dHB1dCxcbiAgICBUZW1wbGF0ZVJlZixcbiAgICBWaWV3RW5jYXBzdWxhdGlvbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBjb2VyY2VCb29sZWFuUHJvcGVydHksIGNvZXJjZU51bWJlclByb3BlcnR5IH0gZnJvbSAnQGFyZGl1bS11aS9kZXZraXQnO1xuaW1wb3J0IHsgcm91bmRUb011bHRpcGxlIH0gZnJvbSAnbW9yZS1yb3VuZGluZyc7XG5pbXBvcnQgeyBpc0RlZmluZWQsIGlzTnVsbCB9IGZyb20gJ3NpbXBsZS1ib29sJztcbmltcG9ydCB7IENvbXBvbmVudENvbG9yIH0gZnJvbSAnLi4vdHlwZXMvY29sb3JzLnR5cGVzJztcbmltcG9ydCB7IF9OZ01vZGVsQ29tcG9uZW50QmFzZSB9IGZyb20gJy4uL19pbnRlcm5hbC9uZ21vZGVsLWNvbXBvbmVudCc7XG5pbXBvcnQge1xuICAgIEFyZERheXNWaWV3SGVhZGVyVGVtcGxhdGVEaXJlY3RpdmUsXG4gICAgQXJkRGF5VGVtcGxhdGVEaXJlY3RpdmUsXG4gICAgQXJkRmxvYXRpbmdNb250aFRlbXBsYXRlRGlyZWN0aXZlLFxuICAgIEFyZE1vbnRoc1ZpZXdIZWFkZXJUZW1wbGF0ZURpcmVjdGl2ZSxcbiAgICBBcmRNb250aFRlbXBsYXRlRGlyZWN0aXZlLFxuICAgIEFyZFdlZWtkYXlUZW1wbGF0ZURpcmVjdGl2ZSxcbiAgICBBcmRZZWFyc1ZpZXdIZWFkZXJUZW1wbGF0ZURpcmVjdGl2ZSxcbiAgICBBcmRZZWFyVGVtcGxhdGVEaXJlY3RpdmUsXG59IGZyb20gJy4vY2FsZW5kYXIuZGlyZWN0aXZlcyc7XG5pbXBvcnQgeyBnZXRNb250aExheW91dCB9IGZyb20gJy4vY2FsZW5kYXIuaGVscGVycyc7XG5pbXBvcnQge1xuICAgIENhbGVuZGFyVmlldyxcbiAgICBDYWxlbmRhckRheUNvbnRleHQsXG4gICAgQ2FsZW5kYXJEYXlzVmlld0hlYWRlckNvbnRleHQsXG4gICAgQ2FsZW5kYXJGbG9hdGluZ01vbnRoQ29udGV4dCxcbiAgICBDYWxlbmRhck1vbnRoQ29udGV4dCxcbiAgICBDYWxlbmRhck1vbnRoc1ZpZXdIZWFkZXJDb250ZXh0LFxuICAgIENhbGVuZGFyV2Vla2RheUNvbnRleHQsXG4gICAgQ2FsZW5kYXJZZWFyQ29udGV4dCxcbiAgICBDYWxlbmRhclllYXJzVmlld0hlYWRlckNvbnRleHQsXG4gICAgRGF0ZVJhbmdlLFxufSBmcm9tICcuL2NhbGVuZGFyLnR5cGVzJztcbmltcG9ydCB7IE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5mdW5jdGlvbiBpc0xlYXBZZWFyKHllYXI6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoeWVhciAlIDQgPT0gMCAmJiB5ZWFyICUgMTAwICE9IDApIHx8IHllYXIgJSA0MDAgPT0gMDtcbn1cblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdhcmQtY2FsZW5kYXInLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9jYWxlbmRhci5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vY2FsZW5kYXIuY29tcG9uZW50LnNjc3MnXSxcbiAgICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEFyZGl1bUNhbGVuZGFyQ29tcG9uZW50KSxcbiAgICAgICAgICAgIG11bHRpOiB0cnVlLFxuICAgICAgICB9LFxuICAgIF0sXG59KVxuZXhwb3J0IGNsYXNzIEFyZGl1bUNhbGVuZGFyQ29tcG9uZW50IGV4dGVuZHMgX05nTW9kZWxDb21wb25lbnRCYXNlIGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuICAgIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLl91cGRhdGVDYWxlbmRhckFycmF5KCk7XG4gICAgICAgIHRoaXMuX3VwZGF0ZVdlZWtkYXlBcnJheSgpO1xuICAgICAgICB0aGlzLl91cGRhdGVEaXNwbGF5ZWRZZWFyUmFuZ2VTdGFydCgpO1xuICAgIH1cbiAgICBwcml2YXRlIF93YXNTZWxlY3RlZENoZWNrZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLl93YXNTZWxlY3RlZENoZWNrZWQpIHJldHVybjtcbiAgICAgICAgdGhpcy5fd2FzU2VsZWN0ZWRDaGVja2VkID0gdHJ1ZTtcblxuICAgICAgICBpZiAoY2hhbmdlc1snc2VsZWN0ZWQnXSkge1xuICAgICAgICAgICAgY29uc3QgdiA9IHRoaXMuc2VsZWN0ZWQ7XG4gICAgICAgICAgICBpZiAoaXNOdWxsKHYpKSByZXR1cm47XG5cbiAgICAgICAgICAgIHRoaXMuYWN0aXZlRGF0ZSA9IG5ldyBEYXRlKHYuZ2V0RnVsbFllYXIoKSwgdi5nZXRNb250aCgpLCAxKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vISBkZXRlcm1pbmluZyB0b2RheSBzdGF0ZVxuICAgIHRvZGF5RGF0ZTogRGF0ZSA9IG5ldyBEYXRlKCk7XG5cbiAgICBpc0RheVRvZGF5KGRheTogbnVtYmVyIHwgbnVsbCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5hY3RpdmVZZWFyID09IHRoaXMudG9kYXlEYXRlLmdldEZ1bGxZZWFyKCkgJiYgdGhpcy5hY3RpdmVNb250aCA9PSB0aGlzLnRvZGF5RGF0ZS5nZXRNb250aCgpICYmIGRheSA9PSB0aGlzLnRvZGF5RGF0ZS5nZXREYXRlKCk7XG4gICAgfVxuICAgIGlzTW9udGhUb2RheShtb250aDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmFjdGl2ZVllYXIgPT0gdGhpcy50b2RheURhdGUuZ2V0RnVsbFllYXIoKSAmJiBtb250aCA9PSB0aGlzLnRvZGF5RGF0ZS5nZXRNb250aCgpO1xuICAgIH1cbiAgICBpc1llYXJUb2RheSh5ZWFyOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHllYXIgPT0gdGhpcy50b2RheURhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICB9XG5cbiAgICAvLyEgZGV0ZXJtaW5pbmcgaWYgYW4gZW50cnkgaXMgc2VsZWN0ZWRcbiAgICBpc0RheVNlbGVjdGVkKGRheTogbnVtYmVyIHwgRGF0ZSB8IG51bGwpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKGRheSBpbnN0YW5jZW9mIERhdGUpIGRheSA9IGRheS5nZXREYXRlKCk7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkICE9IG51bGwgJiZcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlWWVhciA9PSB0aGlzLnNlbGVjdGVkLmdldEZ1bGxZZWFyKCkgJiZcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlTW9udGggPT0gdGhpcy5zZWxlY3RlZC5nZXRNb250aCgpICYmXG4gICAgICAgICAgICBkYXkgPT0gdGhpcy5zZWxlY3RlZC5nZXREYXRlKClcbiAgICAgICAgKTtcbiAgICB9XG4gICAgaXNNb250aFNlbGVjdGVkKG1vbnRoOiBudW1iZXIgfCBEYXRlKTogYm9vbGVhbiB7XG4gICAgICAgIGlmIChtb250aCBpbnN0YW5jZW9mIERhdGUpIG1vbnRoID0gbW9udGguZ2V0TW9udGgoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWQgIT0gbnVsbCAmJiB0aGlzLmFjdGl2ZVllYXIgPT0gdGhpcy5zZWxlY3RlZC5nZXRGdWxsWWVhcigpICYmIG1vbnRoID09IHRoaXMuc2VsZWN0ZWQuZ2V0TW9udGgoKTtcbiAgICB9XG4gICAgaXNZZWFyU2VsZWN0ZWQoeWVhcjogbnVtYmVyIHwgRGF0ZSk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoeWVhciBpbnN0YW5jZW9mIERhdGUpIHllYXIgPSB5ZWFyLmdldEZ1bGxZZWFyKCk7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGVkICE9IG51bGwgJiYgeWVhciA9PSB0aGlzLnNlbGVjdGVkLmdldEZ1bGxZZWFyKCk7XG4gICAgfVxuXG4gICAgLy8hIGNvbG9yICYgd3JhcHBlciBjbGFzc2VzXG4gICAgQElucHV0KCkgY29sb3I6IENvbXBvbmVudENvbG9yID0gQ29tcG9uZW50Q29sb3IuUHJpbWFyeTtcblxuICAgIGdldCBuZ0NsYXNzZXMoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIFtgYXJkLWNvbG9yLSR7dGhpcy5jb2xvcn1gLCB0aGlzLm5vaW50ZXJhY3QgPyAnYXJkLWNhbGVuZGFyLW5vaW50ZXJhY3QnIDogJycsIHRoaXMuc3RhdGljSGVpZ2h0ID8gJ2FyZC1jYWxlbmRhci1zdGF0aWMtaGVpZ2h0JyA6ICcnXS5qb2luKCcgJyk7XG4gICAgfVxuXG4gICAgLy8hIG9wZW4geWVhciAmIG1vbnRoIHNldHRlcnNcbiAgICAvL3BpY2sgYSB5ZWFyIHJhbmdlIHN0YXJ0IHNvIHRoYXQgdGhlIHRvZGF5IGRhdGUgaXMgYWx3YXlzIGluIHRoZSAzcmQgcm93XG4gICAgcHJpdmF0ZSByZWFkb25seSB0b2RheVllYXJSYW5nZVN0YXJ0OiBudW1iZXIgPSB0aGlzLnRvZGF5RGF0ZS5nZXRGdWxsWWVhcigpIC0gKHRoaXMudG9kYXlEYXRlLmdldEZ1bGxZZWFyKCkgJSA0KSAtIDg7XG5cbiAgICBkaXNwbGF5ZWRZZWFyUmFuZ2VTdGFydDogbnVtYmVyID0gdGhpcy50b2RheVllYXJSYW5nZVN0YXJ0O1xuXG4gICAgcHJpdmF0ZSBfdXBkYXRlRGlzcGxheWVkWWVhclJhbmdlU3RhcnQoZm9yY2VkWWVhcj86IG51bWJlcik6IHZvaWQge1xuICAgICAgICBpZiAoaXNEZWZpbmVkKGZvcmNlZFllYXIpKSB0aGlzLmRpc3BsYXllZFllYXJSYW5nZVN0YXJ0ID0gZm9yY2VkWWVhcjtcblxuICAgICAgICAvL2FkZCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBhY3RpdmUgeWVhciBhbmQgdGhlIHN0YXJ0IG9mIHRoZSByYW5nZSBmb3IgdGhlIGN1cnJlbnQgeWVhclxuICAgICAgICAvL3JvdW5kZWQgdG8gYSBtdWx0aXBsZSBvZiAyNCwgdG93YXJkcyB0aGUgbnVtYmVyIHplcm9cbiAgICAgICAgLy90aGUgZGlmZmVyZW5jZSBtYXkgYmUgbmVnYXRpdmUsIGlmIHRoZSBhY3RpdmUgeWVhciBpcyBiZWZvcmUgdG9kYXlZZWFyUmFuZ2VTdGFydFxuICAgICAgICB0aGlzLmRpc3BsYXllZFllYXJSYW5nZVN0YXJ0ID0gdGhpcy50b2RheVllYXJSYW5nZVN0YXJ0ICsgcm91bmRUb011bHRpcGxlKHRoaXMuYWN0aXZlWWVhciAtIHRoaXMudG9kYXlZZWFyUmFuZ2VTdGFydCwgMjQsICd0b196ZXJvJyk7XG4gICAgfVxuXG4gICAgeWVhclJhbmdlQXJyYXlDYWNoZTogbnVtYmVyW10gfCBudWxsID0gbnVsbDtcbiAgICBnZXQgeWVhclJhbmdlQXJyYXkoKTogbnVtYmVyW10ge1xuICAgICAgICBpZiAoIXRoaXMueWVhclJhbmdlQXJyYXlDYWNoZSkge1xuICAgICAgICAgICAgbGV0IHllYXJSYW5nZVN0YXJ0ID0gdGhpcy5kaXNwbGF5ZWRZZWFyUmFuZ2VTdGFydDtcbiAgICAgICAgICAgIGNvbnN0IG5ld0FycmF5ID0gbmV3IEFycmF5KDI0KS5tYXAoKCkgPT4geWVhclJhbmdlU3RhcnQrKyk7XG4gICAgICAgICAgICB0aGlzLnllYXJSYW5nZUFycmF5Q2FjaGUgPSBuZXdBcnJheTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy55ZWFyUmFuZ2VBcnJheUNhY2hlO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfYWN0aXZlRGF0ZTogRGF0ZSA9IG5ldyBEYXRlKHRoaXMudG9kYXlEYXRlLmdldEZ1bGxZZWFyKCksIHRoaXMudG9kYXlEYXRlLmdldE1vbnRoKCksIHRoaXMudG9kYXlEYXRlLmdldERhdGUoKSk7XG4gICAgc2V0IGFjdGl2ZURhdGUodjogRGF0ZSB8IHN0cmluZyB8IG51bWJlcikge1xuICAgICAgICBjb25zdCBuZXdEYXRlID0gbmV3IERhdGUodik7XG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZVllYXIgIT0gbmV3RGF0ZS5nZXRGdWxsWWVhcigpKSB0aGlzLnllYXJSYW5nZUFycmF5Q2FjaGUgPSBudWxsO1xuICAgICAgICB0aGlzLl9hY3RpdmVEYXRlID0gbmV3RGF0ZTtcblxuICAgICAgICB0aGlzLl91cGRhdGVDYWxlbmRhckFycmF5KCk7XG4gICAgfVxuICAgIGdldCBhY3RpdmVEYXRlKCk6IERhdGUge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWN0aXZlRGF0ZTtcbiAgICB9XG5cbiAgICBnZXQgYWN0aXZlWWVhcigpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWN0aXZlRGF0ZS5nZXRGdWxsWWVhcigpO1xuICAgIH1cbiAgICBASW5wdXQoKVxuICAgIHNldCBhY3RpdmVZZWFyKHY6IGFueSkge1xuICAgICAgICBjb25zdCB5ZWFyID0gY29lcmNlTnVtYmVyUHJvcGVydHkodiwgbmV3IERhdGUoKS5nZXRGdWxsWWVhcigpKTtcbiAgICAgICAgdGhpcy5fYWN0aXZlRGF0ZS5zZXRGdWxsWWVhcih5ZWFyKTtcbiAgICAgICAgdGhpcy5hY3RpdmVEYXRlID0gbmV3IERhdGUoeWVhciwgdGhpcy5hY3RpdmVNb250aCwgMSk7XG4gICAgICAgIHRoaXMueWVhclJhbmdlQXJyYXlDYWNoZSA9IG51bGw7XG5cbiAgICAgICAgdGhpcy5fdXBkYXRlQ2FsZW5kYXJBcnJheSgpO1xuICAgIH1cblxuICAgIGdldCBhY3RpdmVNb250aCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWN0aXZlRGF0ZS5nZXRNb250aCgpO1xuICAgIH1cbiAgICBASW5wdXQoKVxuICAgIHNldCBhY3RpdmVNb250aCh2OiBhbnkpIHtcbiAgICAgICAgY29uc3QgbW9udGggPSBjb2VyY2VOdW1iZXJQcm9wZXJ0eSh2LCBuZXcgRGF0ZSgpLmdldE1vbnRoKCkpO1xuICAgICAgICBjb25zdCBvbGREYXRlWWVhciA9IHRoaXMuYWN0aXZlWWVhcjtcbiAgICAgICAgdGhpcy5hY3RpdmVEYXRlID0gbmV3IERhdGUodGhpcy5hY3RpdmVZZWFyLCBtb250aCwgMSk7XG4gICAgICAgIGlmIChvbGREYXRlWWVhciAhPSB0aGlzLmFjdGl2ZVllYXIpIHRoaXMueWVhclJhbmdlQXJyYXlDYWNoZSA9IG51bGw7XG5cbiAgICAgICAgdGhpcy5fdXBkYXRlQ2FsZW5kYXJBcnJheSgpO1xuICAgIH1cbiAgICAvLyEgc2VsZWN0aW9uIGZ1bmN0aW9uc1xuICAgIHByb3RlY3RlZCBfc2VsZWN0ZWQ6IERhdGUgfCBudWxsID0gbnVsbDtcbiAgICBASW5wdXQoKVxuICAgIHNldCBzZWxlY3RlZCh2OiBhbnkpIHtcbiAgICAgICAgdGhpcy53cml0ZVZhbHVlKHYpO1xuICAgIH1cbiAgICBnZXQgc2VsZWN0ZWQoKTogRGF0ZSB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2VsZWN0ZWQ7XG4gICAgfVxuXG4gICAgd3JpdGVWYWx1ZSh2OiBhbnkpOiB2b2lkIHtcbiAgICAgICAgaWYgKHR5cGVvZiB2ID09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAvL3RyeSB0byBzZWUgaWYgaXQgaXMgYW4gYXJyYXkgb2YgbnVtYmVycyBzZXBhcmF0ZWQgYnkgYSBjb21tYVxuICAgICAgICAgICAgY29uc3QgdkFzQXJyYXkxID0gdi5zcGxpdCgnLCcpLm1hcCh2ID0+IE51bWJlcih2KSk7XG4gICAgICAgICAgICBpZiAodkFzQXJyYXkxLmxlbmd0aCA+PSAxICYmIHZBc0FycmF5MS5sZW5ndGggPD0gMyAmJiB2QXNBcnJheTEuZXZlcnkodiA9PiAhaXNOYU4odikpKSB7XG4gICAgICAgICAgICAgICAgdiA9IG5ldyBEYXRlKHZBc0FycmF5MVswXSwgdkFzQXJyYXkxWzFdID8/IDAsIHZBc0FycmF5MVsyXSA/PyAxKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy90cnkgdG8gc2VlIGlmIGl0IGlzIGFuIGFycmF5IG9mIG51bWJlcnMgc2VwYXJhdGVkIGJ5IHNvbWUgd2hpdGVzcGFjZVxuICAgICAgICAgICAgICAgIGNvbnN0IHZBc0FycmF5MiA9IHYuc3BsaXQoL1xccy8pLm1hcCh2ID0+IE51bWJlcih2KSk7XG4gICAgICAgICAgICAgICAgaWYgKHZBc0FycmF5Mi5sZW5ndGggPj0gMSAmJiB2QXNBcnJheTIubGVuZ3RoIDw9IDMgJiYgdkFzQXJyYXkyLmV2ZXJ5KHYgPT4gIWlzTmFOKHYpKSkge1xuICAgICAgICAgICAgICAgICAgICB2ID0gbmV3IERhdGUodkFzQXJyYXkyWzBdLCB2QXNBcnJheTJbMV0gPz8gMCwgdkFzQXJyYXkyWzJdID8/IDEpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHYgPSBuZXcgRGF0ZSh2KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy9pcyBhIERhdGUgb2JqZWN0ICYmIGRvZXMgbm90IGNvbnRhaW4gYW4gZXJyb3JcbiAgICAgICAgaWYgKHYgaW5zdGFuY2VvZiBEYXRlICYmICFpc05hTih2LnZhbHVlT2YoKSkpIHtcbiAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkID0gdjtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodiA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLl9zZWxlY3RlZCA9IG51bGw7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS53YXJuKGBDb3VsZCBub3QgcGFyc2UgW3NlbGVjdGVkXSB2YWx1ZSBvbiA8YXJkLWNhbGVuZGFyPiwgYXMgaXQgaXMgbm90IGEgdmFsaWQgdmFsdWUuIFByb3ZpZGVkIHZhbHVlOiBcIiR7dn1cImApO1xuICAgICAgICB0aGlzLl9zZWxlY3RlZCA9IG51bGw7XG4gICAgfVxuXG4gICAgLy8hIG91dHB1dCBldmVudHNcbiAgICBAT3V0cHV0KCkgeWVhclNlbGVjdGVkID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG4gICAgQE91dHB1dCgpIG1vbnRoU2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcblxuICAgIEBPdXRwdXQoKSBzZWxlY3RlZENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8RGF0ZSB8IG51bGw+KCk7XG4gICAgQE91dHB1dCgpIGFjdGl2ZVllYXJDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcbiAgICBAT3V0cHV0KCkgYWN0aXZlTW9udGhDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcblxuICAgIEBPdXRwdXQoKSB2aWV3Q2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxDYWxlbmRhclZpZXc+KCk7XG5cbiAgICBAT3V0cHV0KCdjaGFuZ2UnKSBjaGFuZ2VFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8RGF0ZSB8IG51bGw+KCk7XG5cbiAgICBwcm90ZWN0ZWQgX2VtaXRDaGFuZ2UoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHYgPSB0aGlzLnNlbGVjdGVkO1xuICAgICAgICB0aGlzLl9vbkNoYW5nZVJlZ2lzdGVyZWQ/Lih2KTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZENoYW5nZS5lbWl0KHYpO1xuICAgICAgICB0aGlzLmNoYW5nZUV2ZW50LmVtaXQodik7XG4gICAgfVxuXG4gICAgLy8hIGNhbGVuZGFyIGVudHJ5IGhvdmVyICYgY2xpY2tcbiAgICBwcml2YXRlIF9oaWdobGlnaHRlZERheTogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgZ2V0IGhpZ2hsaWdodGVkRGF5KCk6IG51bWJlciB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5faGlnaGxpZ2h0ZWREYXk7XG4gICAgfVxuICAgIHNldCBoaWdobGlnaHRlZERheSh2OiBudW1iZXIgfCBudWxsKSB7XG4gICAgICAgIGlmIChpc051bGwodikpIHtcbiAgICAgICAgICAgIHRoaXMuX2hpZ2hsaWdodGVkRGF5ID0gdjtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUodGhpcy5hY3RpdmVZZWFyLCB0aGlzLmFjdGl2ZU1vbnRoLCB2KTtcbiAgICAgICAgdGhpcy5faGlnaGxpZ2h0ZWREYXkgPSBkYXRlLmdldERhdGUoKTtcbiAgICB9XG5cbiAgICBzZXRIaWdobGlnaHRlZERheUFkanVzdERhdGUoZGF5OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5oaWdobGlnaHRlZERheSA9IGRheTtcblxuICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUodGhpcy5hY3RpdmVZZWFyLCB0aGlzLmFjdGl2ZU1vbnRoLCBkYXkpO1xuXG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZVllYXIgIT0gZGF0ZS5nZXRGdWxsWWVhcigpKSB0aGlzLmFjdGl2ZVllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKCk7XG5cbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlTW9udGggIT0gZGF0ZS5nZXRNb250aCgpKSB0aGlzLmFjdGl2ZU1vbnRoID0gZGF0ZS5nZXRNb250aCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2hpZ2hsaWdodGVkTW9udGg6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICAgIGdldCBoaWdobGlnaHRlZE1vbnRoKCk6IG51bWJlciB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5faGlnaGxpZ2h0ZWRNb250aDtcbiAgICB9XG4gICAgc2V0IGhpZ2hsaWdodGVkTW9udGgodjogbnVtYmVyIHwgbnVsbCkge1xuICAgICAgICBpZiAoaXNOdWxsKHYpKSB7XG4gICAgICAgICAgICB0aGlzLl9oaWdobGlnaHRlZE1vbnRoID0gdjtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUodGhpcy5hY3RpdmVZZWFyLCB2LCAxKTtcbiAgICAgICAgdGhpcy5faGlnaGxpZ2h0ZWRNb250aCA9IGRhdGUuZ2V0TW9udGgoKTtcbiAgICB9XG5cbiAgICBzZXRIaWdobGlnaHRlZE1vbnRoQWRqdXN0RGF0ZShtb250aDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaGlnaGxpZ2h0ZWRNb250aCA9IG1vbnRoO1xuXG4gICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh0aGlzLmFjdGl2ZVllYXIsIG1vbnRoLCAxKTtcblxuICAgICAgICBpZiAodGhpcy5hY3RpdmVZZWFyICE9IGRhdGUuZ2V0RnVsbFllYXIoKSkgdGhpcy5hY3RpdmVZZWFyID0gZGF0ZS5nZXRGdWxsWWVhcigpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2hpZ2hsaWdodGVkWWVhcjogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgZ2V0IGhpZ2hsaWdodGVkWWVhcigpOiBudW1iZXIgfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hpZ2hsaWdodGVkWWVhcjtcbiAgICB9XG4gICAgc2V0IGhpZ2hsaWdodGVkWWVhcih2OiBudW1iZXIgfCBudWxsKSB7XG4gICAgICAgIHRoaXMuX2hpZ2hsaWdodGVkWWVhciA9IHY7XG4gICAgfVxuXG4gICAgc2V0SGlnaGxpZ2h0ZWRZZWFyQWRqdXN0UGFnZSh5ZWFyOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5oaWdobGlnaHRlZFllYXIgPSB5ZWFyO1xuXG4gICAgICAgIGlmICh5ZWFyIDwgdGhpcy5kaXNwbGF5ZWRZZWFyUmFuZ2VTdGFydCB8fCB5ZWFyID49IHRoaXMuZGlzcGxheWVkWWVhclJhbmdlU3RhcnQgKyAyNCkge1xuICAgICAgICAgICAgLy9hZGQgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgaGlnaGxpZ2h0ZWQgeWVhciBhbmQgdGhlIGRpc3BsYXllZCByYW5nZSBzdGFydCB5ZWFyXG4gICAgICAgICAgICAvL3JvdW5kZWQgdG8gYSBtdWx0aXBsZSBvZiAyNCwgYXdheSBmcm9tIHRoZSBudW1iZXIgemVyb1xuICAgICAgICAgICAgLy90aGUgZGlmZmVyZW5jZSBtYXkgYmUgbmVnYXRpdmUsIGlmIHRoZSBmaXJzdCBpZiBjb25kaXRpb24gaXMgbWV0XG4gICAgICAgICAgICB0aGlzLmRpc3BsYXllZFllYXJSYW5nZVN0YXJ0ICs9IHJvdW5kVG9NdWx0aXBsZSh5ZWFyIC0gdGhpcy5kaXNwbGF5ZWRZZWFyUmFuZ2VTdGFydCwgMjQsICdmcm9tX3plcm8nKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldCBjdXJyZW50QXJpYUxhYmVsKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBuZXcgRGF0ZSh0aGlzLmFjdGl2ZVllYXIsIHRoaXMuYWN0aXZlTW9udGgsIHRoaXMuaGlnaGxpZ2h0ZWREYXkgPz8gMSkudG9Mb2NhbGVEYXRlU3RyaW5nKHVuZGVmaW5lZCwge1xuICAgICAgICAgICAgd2Vla2RheTogJ2xvbmcnLFxuICAgICAgICAgICAgeWVhcjogJ251bWVyaWMnLFxuICAgICAgICAgICAgbW9udGg6ICdsb25nJyxcbiAgICAgICAgICAgIGRheTogJ251bWVyaWMnLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBvbkNhbGVuZGFyRGF5TW91c2VvdmVyKGRheTogbnVtYmVyIHwgbnVsbCk6IHZvaWQge1xuICAgICAgICBpZiAoZGF5ID09IG51bGwpIHJldHVybjtcbiAgICAgICAgaWYgKHRoaXMuX2lzVXNpbmdLZXlib2FyZCkgcmV0dXJuO1xuXG4gICAgICAgIHRoaXMuaGlnaGxpZ2h0ZWREYXkgPSBkYXk7XG4gICAgfVxuICAgIG9uQ2FsZW5kYXJNb250aE1vdXNlb3Zlcihtb250aDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLl9pc1VzaW5nS2V5Ym9hcmQpIHJldHVybjtcblxuICAgICAgICB0aGlzLmhpZ2hsaWdodGVkTW9udGggPSBtb250aDtcbiAgICB9XG4gICAgb25DYWxlbmRhclllYXJNb3VzZW92ZXIoeWVhcjogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLl9pc1VzaW5nS2V5Ym9hcmQpIHJldHVybjtcblxuICAgICAgICB0aGlzLmhpZ2hsaWdodGVkWWVhciA9IHllYXI7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfaXNVc2luZ0tleWJvYXJkOiBib29sZWFuID0gZmFsc2U7XG4gICAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6bW91c2Vtb3ZlJylcbiAgICBvbkRvY3VtZW50TW91c2Vtb3ZlKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuX2lzVXNpbmdLZXlib2FyZCkgdGhpcy5oaWdobGlnaHRlZERheSA9IG51bGw7XG5cbiAgICAgICAgdGhpcy5faXNVc2luZ0tleWJvYXJkID0gZmFsc2U7XG4gICAgfVxuICAgIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmtleWRvd24nKVxuICAgIG9uRG9jdW1lbnRLZXlkb3duKCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9pc1VzaW5nS2V5Ym9hcmQgPSB0cnVlO1xuICAgIH1cblxuICAgIG9uQ2FsZW5kYXJEYXlDbGljayhkYXk6IG51bWJlciB8IG51bGwpOiB2b2lkIHtcbiAgICAgICAgaWYgKGRheSA9PSBudWxsKSByZXR1cm47XG5cbiAgICAgICAgdGhpcy5zZWxlY3REYXkoZGF5KTtcblxuICAgICAgICB0aGlzLmZvY3VzKCk7XG4gICAgICAgIHRoaXMuaGlnaGxpZ2h0ZWREYXkgPSBkYXk7XG4gICAgfVxuICAgIG9uQ2FsZW5kYXJNb250aENsaWNrKG1vbnRoOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZWxlY3RNb250aChtb250aCk7XG4gICAgfVxuICAgIG9uQ2FsZW5kYXJZZWFyQ2xpY2soeWVhcjogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2VsZWN0WWVhcih5ZWFyKTtcbiAgICB9XG5cbiAgICBvbkRheUdyaWRGb2N1cygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5oaWdobGlnaHRlZERheSA9IDE7XG4gICAgfVxuICAgIG9uRGF5R3JpZEJsdXIoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaGlnaGxpZ2h0ZWREYXkgPSBudWxsO1xuICAgIH1cbiAgICBvbkRheUdyaWRDbGljaygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5oaWdobGlnaHRlZERheSA/Pz0gMTtcbiAgICB9XG5cbiAgICBvbk1vbnRoR3JpZEZvY3VzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmhpZ2hsaWdodGVkTW9udGggPSAwO1xuICAgIH1cbiAgICBvbk1vbnRoR3JpZEJsdXIoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaGlnaGxpZ2h0ZWRNb250aCA9IG51bGw7XG4gICAgfVxuICAgIG9uTW9udGhHcmlkQ2xpY2soKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaGlnaGxpZ2h0ZWRNb250aCA/Pz0gMDtcbiAgICB9XG5cbiAgICBvblllYXJHcmlkRm9jdXMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaGlnaGxpZ2h0ZWRZZWFyID0gdGhpcy5kaXNwbGF5ZWRZZWFyUmFuZ2VTdGFydDtcbiAgICB9XG4gICAgb25ZZWFyR3JpZEJsdXIoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaGlnaGxpZ2h0ZWRZZWFyID0gbnVsbDtcbiAgICB9XG4gICAgb25ZZWFyR3JpZENsaWNrKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmhpZ2hsaWdodGVkWWVhciA/Pz0gdGhpcy5kaXNwbGF5ZWRZZWFyUmFuZ2VTdGFydDtcbiAgICB9XG5cbiAgICAvLyEgbWFpbiBncmlkIGtleWJvYXJkIGNvbnRyb2xzXG4gICAgb25NYWluR3JpZEtleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgc3dpdGNoIChldmVudC5jb2RlKSB7XG4gICAgICAgICAgICBjYXNlICdTcGFjZSc6XG4gICAgICAgICAgICBjYXNlICdFbnRlcic6XG4gICAgICAgICAgICAgICAgdGhpcy5fb25FbnRlclByZXNzKGV2ZW50KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0Fycm93VXAnOlxuICAgICAgICAgICAgICAgIHRoaXMuX29uQXJyb3dVcFByZXNzKGV2ZW50KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0Fycm93RG93bic6XG4gICAgICAgICAgICAgICAgdGhpcy5fb25BcnJvd0Rvd25QcmVzcyhldmVudCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdBcnJvd0xlZnQnOlxuICAgICAgICAgICAgICAgIHRoaXMuX29uQXJyb3dMZWZ0UHJlc3MoZXZlbnQpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnQXJyb3dSaWdodCc6XG4gICAgICAgICAgICAgICAgdGhpcy5fb25BcnJvd1JpZ2h0UHJlc3MoZXZlbnQpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnSG9tZSc6XG4gICAgICAgICAgICAgICAgdGhpcy5fb25Ib21lUHJlc3MoZXZlbnQpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnRW5kJzpcbiAgICAgICAgICAgICAgICB0aGlzLl9vbkVuZFByZXNzKGV2ZW50KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ1BhZ2VVcCc6XG4gICAgICAgICAgICAgICAgdGhpcy5fb25QYWdlVXBQcmVzcyhldmVudCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdQYWdlRG93bic6XG4gICAgICAgICAgICAgICAgdGhpcy5fb25QYWdlRG93blByZXNzKGV2ZW50KTtcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy9zZWxlY3QgY3VycmVudGx5IHNlbGVjdGVkIGVudHJ5XG4gICAgcHJpdmF0ZSBfb25FbnRlclByZXNzKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgdGhpcy5zZWxlY3RDdXJyZW50bHlIaWdobGlnaHRlZCgpO1xuICAgIH1cbiAgICAvL2hpZ2hsaWdodCB0aGUgZW50cnkgb25lIGxpbmUgYWJvdmVcbiAgICBwcml2YXRlIF9vbkFycm93VXBQcmVzcyhldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBzd2l0Y2ggKHRoaXMuYWN0aXZlVmlldykge1xuICAgICAgICAgICAgY2FzZSBDYWxlbmRhclZpZXcuRGF5czpcbiAgICAgICAgICAgICAgICB0aGlzLmhpZ2hsaWdodFByZXZpb3VzRGF5KDcpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBDYWxlbmRhclZpZXcuTW9udGhzOlxuICAgICAgICAgICAgICAgIHRoaXMuaGlnaGxpZ2h0UHJldmlvdXNNb250aCgzKTsgLy8zIG1vbnRocyBwZXIgbGluZVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBDYWxlbmRhclZpZXcuWWVhcnM6XG4gICAgICAgICAgICAgICAgdGhpcy5oaWdobGlnaHRQcmV2aW91c1llYXIoNCk7IC8vNCB5ZWFycyBwZXIgbGluZVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vaGlnaGxpZ2h0IHRoZSBlbnRyeSBvbmUgbGluZSBiZWxvd1xuICAgIHByaXZhdGUgX29uQXJyb3dEb3duUHJlc3MoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgc3dpdGNoICh0aGlzLmFjdGl2ZVZpZXcpIHtcbiAgICAgICAgICAgIGNhc2UgQ2FsZW5kYXJWaWV3LkRheXM6XG4gICAgICAgICAgICAgICAgdGhpcy5oaWdobGlnaHROZXh0RGF5KDcpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBDYWxlbmRhclZpZXcuTW9udGhzOlxuICAgICAgICAgICAgICAgIHRoaXMuaGlnaGxpZ2h0TmV4dE1vbnRoKDMpOyAvLzMgbW9udGhzIHBlciBsaW5lXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIENhbGVuZGFyVmlldy5ZZWFyczpcbiAgICAgICAgICAgICAgICB0aGlzLmhpZ2hsaWdodE5leHRZZWFyKDQpOyAvLzQgeWVhcnMgcGVyIGxpbmVcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICAvL2hpZ2hsaWdodCBwcmV2aW91cyBlbnRyeVxuICAgIHByaXZhdGUgX29uQXJyb3dMZWZ0UHJlc3MoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgc3dpdGNoICh0aGlzLmFjdGl2ZVZpZXcpIHtcbiAgICAgICAgICAgIGNhc2UgQ2FsZW5kYXJWaWV3LkRheXM6XG4gICAgICAgICAgICAgICAgdGhpcy5oaWdobGlnaHRQcmV2aW91c0RheSgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBDYWxlbmRhclZpZXcuTW9udGhzOlxuICAgICAgICAgICAgICAgIHRoaXMuaGlnaGxpZ2h0UHJldmlvdXNNb250aCgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBDYWxlbmRhclZpZXcuWWVhcnM6XG4gICAgICAgICAgICAgICAgdGhpcy5oaWdobGlnaHRQcmV2aW91c1llYXIoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICAvL2hpZ2hsaWdodCBuZXh0IGVudHJ5XG4gICAgcHJpdmF0ZSBfb25BcnJvd1JpZ2h0UHJlc3MoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgc3dpdGNoICh0aGlzLmFjdGl2ZVZpZXcpIHtcbiAgICAgICAgICAgIGNhc2UgQ2FsZW5kYXJWaWV3LkRheXM6XG4gICAgICAgICAgICAgICAgdGhpcy5oaWdobGlnaHROZXh0RGF5KCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIENhbGVuZGFyVmlldy5Nb250aHM6XG4gICAgICAgICAgICAgICAgdGhpcy5oaWdobGlnaHROZXh0TW9udGgoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgQ2FsZW5kYXJWaWV3LlllYXJzOlxuICAgICAgICAgICAgICAgIHRoaXMuaGlnaGxpZ2h0TmV4dFllYXIoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICAvL2hpZ2hsaWdodCBmaXJzdCBlbnRyeSBvbiB0aGUgcGFnZVxuICAgIHByaXZhdGUgX29uSG9tZVByZXNzKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHN3aXRjaCAodGhpcy5hY3RpdmVWaWV3KSB7XG4gICAgICAgICAgICBjYXNlIENhbGVuZGFyVmlldy5EYXlzOlxuICAgICAgICAgICAgICAgIHRoaXMuaGlnaGxpZ2h0Rmlyc3REYXkoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgQ2FsZW5kYXJWaWV3Lk1vbnRoczpcbiAgICAgICAgICAgICAgICB0aGlzLmhpZ2hsaWdodEZpcnN0TW9udGgoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgQ2FsZW5kYXJWaWV3LlllYXJzOlxuICAgICAgICAgICAgICAgIHRoaXMuaGlnaGxpZ2h0Rmlyc3RZZWFyKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy9oaWdobGlnaHQgbGFzdCBlbnRyeSBvbiB0aGUgcGFnZVxuICAgIHByaXZhdGUgX29uRW5kUHJlc3MoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgc3dpdGNoICh0aGlzLmFjdGl2ZVZpZXcpIHtcbiAgICAgICAgICAgIGNhc2UgQ2FsZW5kYXJWaWV3LkRheXM6XG4gICAgICAgICAgICAgICAgdGhpcy5oaWdobGlnaHRMYXN0RGF5KCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIENhbGVuZGFyVmlldy5Nb250aHM6XG4gICAgICAgICAgICAgICAgdGhpcy5oaWdobGlnaHRMYXN0TW9udGgoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgQ2FsZW5kYXJWaWV3LlllYXJzOlxuICAgICAgICAgICAgICAgIHRoaXMuaGlnaGxpZ2h0TGFzdFllYXIoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICAvL2Fsb25lOiBoaWdobGlnaHQgc2FtZSBlbnRyeSBvbiB0aGUgcHJldmlvdXMgcGFnZVxuICAgIC8vd2l0aCBhbHQ6IGhpZ2hsaWdodCBzYW1lIGVudHJ5IG11bHRpcGxlIHBhZ2VzIGJlZm9yZSAoZGF5cyB2aWV3OiAxMiBwYWdlcywgbW9udGhzIHZpZXc6IDEwIHBhZ2VzLCB5ZWFycyB2aWV3OiA1IHBhZ2VzKVxuICAgIHByaXZhdGUgX29uUGFnZVVwUHJlc3MoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgc3dpdGNoICh0aGlzLmFjdGl2ZVZpZXcpIHtcbiAgICAgICAgICAgIGNhc2UgQ2FsZW5kYXJWaWV3LkRheXM6XG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50LmFsdEtleSkgdGhpcy5oaWdobGlnaHRTYW1lRGF5UHJldmlvdXNZZWFyKCk7XG4gICAgICAgICAgICAgICAgZWxzZSB0aGlzLmhpZ2hsaWdodFNhbWVEYXlQcmV2aW91c01vbnRoKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIENhbGVuZGFyVmlldy5Nb250aHM6XG4gICAgICAgICAgICAgICAgdGhpcy5oaWdobGlnaHRTYW1lTW9udGhQcmV2aW91c1llYXIoZXZlbnQuYWx0S2V5KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgQ2FsZW5kYXJWaWV3LlllYXJzOlxuICAgICAgICAgICAgICAgIHRoaXMuaGlnaGxpZ2h0U2FtZVllYXJQcmV2aW91c1BhZ2UoZXZlbnQuYWx0S2V5KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICAvL2Fsb25lOiBoaWdobGlnaHQgc2FtZSBlbnRyeSBvbiB0aGUgbmV4dCBwYWdlXG4gICAgLy93aXRoIGFsdDogaGlnaGxpZ2h0IHNhbWUgZW50cnkgbXVsdGlwbGUgcGFnZXMgYWZ0ZXIgKGRheXMgdmlldzogMTIgcGFnZXMsIG1vbnRocyB2aWV3OiAxMCBwYWdlcywgeWVhcnMgdmlldzogNSBwYWdlcylcbiAgICBwcml2YXRlIF9vblBhZ2VEb3duUHJlc3MoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgc3dpdGNoICh0aGlzLmFjdGl2ZVZpZXcpIHtcbiAgICAgICAgICAgIGNhc2UgQ2FsZW5kYXJWaWV3LkRheXM6XG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50LmFsdEtleSkgdGhpcy5oaWdobGlnaHRTYW1lRGF5TmV4dFllYXIoKTtcbiAgICAgICAgICAgICAgICBlbHNlIHRoaXMuaGlnaGxpZ2h0U2FtZURheU5leHRNb250aCgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBDYWxlbmRhclZpZXcuTW9udGhzOlxuICAgICAgICAgICAgICAgIHRoaXMuaGlnaGxpZ2h0U2FtZU1vbnRoTmV4dFllYXIoZXZlbnQuYWx0S2V5KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgQ2FsZW5kYXJWaWV3LlllYXJzOlxuICAgICAgICAgICAgICAgIHRoaXMuaGlnaGxpZ2h0U2FtZVllYXJOZXh0UGFnZShldmVudC5hbHRLZXkpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vISBtYW5pcHVsYXRpb24gbWV0aG9kc1xuICAgIC8vc2VsZWN0aW5nXG4gICAgc2VsZWN0RGF5KGRheTogbnVtYmVyIHwgRGF0ZSB8IG51bGwpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuaXNEYXlTZWxlY3RlZChkYXkpKSByZXR1cm47XG4gICAgICAgIGlmIChpc051bGwoZGF5KSkge1xuICAgICAgICAgICAgaWYgKCFpc0RlZmluZWQodGhpcy5zZWxlY3RlZCkpIHJldHVybjtcblxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZCA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLl9lbWl0Q2hhbmdlKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGF5IGluc3RhbmNlb2YgRGF0ZSkgZGF5ID0gZGF5LmdldERhdGUoKTtcblxuICAgICAgICB0aGlzLnNlbGVjdGVkID0gbmV3IERhdGUodGhpcy5hY3RpdmVZZWFyLCB0aGlzLmFjdGl2ZU1vbnRoLCBkYXkpO1xuICAgICAgICB0aGlzLl9lbWl0Q2hhbmdlKCk7XG4gICAgfVxuICAgIHNlbGVjdE1vbnRoKG1vbnRoOiBudW1iZXIgfCBEYXRlIHwgbnVsbCk6IHZvaWQge1xuICAgICAgICBpZiAoaXNOdWxsKG1vbnRoKSkge1xuICAgICAgICAgICAgdGhpcy5hY3RpdmVNb250aCA9IG51bGw7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1vbnRoIGluc3RhbmNlb2YgRGF0ZSkgbW9udGggPSBtb250aC5nZXRNb250aCgpO1xuXG4gICAgICAgIHRoaXMuYWN0aXZlTW9udGggPSBtb250aDtcblxuICAgICAgICB0aGlzLmFjdGl2ZU1vbnRoQ2hhbmdlLmVtaXQobW9udGgpO1xuICAgICAgICB0aGlzLm1vbnRoU2VsZWN0ZWQuZW1pdChtb250aCk7XG5cbiAgICAgICAgdGhpcy5vcGVuRGF5c1ZpZXcoKTtcbiAgICB9XG4gICAgc2VsZWN0WWVhcih5ZWFyOiBudW1iZXIgfCBEYXRlIHwgbnVsbCk6IHZvaWQge1xuICAgICAgICBpZiAoaXNOdWxsKHllYXIpKSB7XG4gICAgICAgICAgICB0aGlzLmFjdGl2ZVllYXIgPSBudWxsO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh5ZWFyIGluc3RhbmNlb2YgRGF0ZSkgeWVhciA9IHllYXIuZ2V0RnVsbFllYXIoKTtcblxuICAgICAgICB0aGlzLmFjdGl2ZVllYXIgPSB5ZWFyO1xuXG4gICAgICAgIHRoaXMuYWN0aXZlWWVhckNoYW5nZS5lbWl0KHllYXIpO1xuICAgICAgICB0aGlzLnllYXJTZWxlY3RlZC5lbWl0KHllYXIpO1xuXG4gICAgICAgIHRoaXMub3Blbk1vbnRoc1ZpZXcoKTtcbiAgICB9XG4gICAgc2VsZWN0Q3VycmVudGx5SGlnaGxpZ2h0ZWQoKTogdm9pZCB7XG4gICAgICAgIGlmICghaXNEZWZpbmVkKHRoaXMuaGlnaGxpZ2h0ZWREYXkpKSByZXR1cm47XG5cbiAgICAgICAgc3dpdGNoICh0aGlzLmFjdGl2ZVZpZXcpIHtcbiAgICAgICAgICAgIGNhc2UgQ2FsZW5kYXJWaWV3LkRheXM6XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3REYXkodGhpcy5oaWdobGlnaHRlZERheSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgY2FzZSBDYWxlbmRhclZpZXcuTW9udGhzOlxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0TW9udGgodGhpcy5oaWdobGlnaHRlZE1vbnRoKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBjYXNlIENhbGVuZGFyVmlldy5ZZWFyczpcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdFllYXIodGhpcy5oaWdobGlnaHRlZFllYXIpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy9hY3RpdmUgbW9udGhzL3llYXJzXG4gICAgY2hhbmdlTW9udGgob2Zmc2V0OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgb2xkeWVhciA9IHRoaXMuYWN0aXZlWWVhcjtcbiAgICAgICAgdGhpcy5hY3RpdmVNb250aCArPSBvZmZzZXQ7XG5cbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlWWVhciAhPSBvbGR5ZWFyKSB0aGlzLmFjdGl2ZVllYXJDaGFuZ2UuZW1pdCh0aGlzLmFjdGl2ZVllYXIpO1xuICAgICAgICB0aGlzLmFjdGl2ZU1vbnRoQ2hhbmdlLmVtaXQodGhpcy5hY3RpdmVNb250aCk7XG4gICAgfVxuICAgIGNoYW5nZVllYXIob2Zmc2V0OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5hY3RpdmVZZWFyICs9IG9mZnNldDtcblxuICAgICAgICB0aGlzLmFjdGl2ZVllYXJDaGFuZ2UuZW1pdCh0aGlzLmFjdGl2ZVllYXIpO1xuICAgIH1cbiAgICAvL2NoYW5naW5nIHllYXIgcGFnZVxuICAgIGNoYW5nZVllYXJzVmlld1BhZ2UocGFnZXM6IG51bWJlcik6IHZvaWQge1xuICAgICAgICB0aGlzLmRpc3BsYXllZFllYXJSYW5nZVN0YXJ0ICs9IDI0ICogcGFnZXM7XG4gICAgfVxuICAgIC8vbmV4dC9wcmV2IGhpZ2hsaWdodGluZ1xuICAgIGhpZ2hsaWdodE5leHREYXkob2Zmc2V0OiBudW1iZXIgPSAxKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnREYXkgPSB0aGlzLmhpZ2hsaWdodGVkRGF5O1xuICAgICAgICBpZiAoIWlzRGVmaW5lZChjdXJyZW50RGF5KSkge1xuICAgICAgICAgICAgdGhpcy5oaWdobGlnaHRlZERheSA9IDE7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXRIaWdobGlnaHRlZERheUFkanVzdERhdGUoY3VycmVudERheSArIG9mZnNldCk7XG4gICAgfVxuICAgIGhpZ2hsaWdodFByZXZpb3VzRGF5KG9mZnNldDogbnVtYmVyID0gMSk6IHZvaWQge1xuICAgICAgICB0aGlzLmhpZ2hsaWdodE5leHREYXkob2Zmc2V0ICogLTEpO1xuICAgIH1cbiAgICBoaWdobGlnaHROZXh0TW9udGgob2Zmc2V0OiBudW1iZXIgPSAxKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRNb250aCA9IHRoaXMuaGlnaGxpZ2h0ZWRNb250aDtcbiAgICAgICAgaWYgKCFpc0RlZmluZWQoY3VycmVudE1vbnRoKSkge1xuICAgICAgICAgICAgdGhpcy5oaWdobGlnaHRlZE1vbnRoID0gMDtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldEhpZ2hsaWdodGVkTW9udGhBZGp1c3REYXRlKGN1cnJlbnRNb250aCArIG9mZnNldCk7XG4gICAgfVxuICAgIGhpZ2hsaWdodFByZXZpb3VzTW9udGgob2Zmc2V0OiBudW1iZXIgPSAxKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaGlnaGxpZ2h0TmV4dE1vbnRoKG9mZnNldCAqIC0xKTtcbiAgICB9XG4gICAgaGlnaGxpZ2h0TmV4dFllYXIob2Zmc2V0OiBudW1iZXIgPSAxKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRZZWFyID0gdGhpcy5oaWdobGlnaHRlZFllYXI7XG4gICAgICAgIGlmICghaXNEZWZpbmVkKGN1cnJlbnRZZWFyKSkge1xuICAgICAgICAgICAgdGhpcy5oaWdobGlnaHRlZFllYXIgPSAwO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0SGlnaGxpZ2h0ZWRZZWFyQWRqdXN0UGFnZShjdXJyZW50WWVhciArIG9mZnNldCk7XG4gICAgfVxuICAgIGhpZ2hsaWdodFByZXZpb3VzWWVhcihvZmZzZXQ6IG51bWJlciA9IDEpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5oaWdobGlnaHROZXh0WWVhcihvZmZzZXQgKiAtMSk7XG4gICAgfVxuICAgIC8vZmlyc3QvbGFzdCBoaWdobGlnaHRpbmdcbiAgICBoaWdobGlnaHRGaXJzdERheSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5oaWdobGlnaHRlZERheSA9IDE7XG4gICAgfVxuICAgIGhpZ2hsaWdodExhc3REYXkoKTogdm9pZCB7XG4gICAgICAgIHN3aXRjaCAodGhpcy5hY3RpdmVNb250aCArIDEpIHtcbiAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgIGNhc2UgODpcbiAgICAgICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgICBjYXNlIDEyOlxuICAgICAgICAgICAgICAgIHRoaXMuaGlnaGxpZ2h0ZWREYXkgPSAzMTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgIGNhc2UgOTpcbiAgICAgICAgICAgIGNhc2UgMTE6XG4gICAgICAgICAgICAgICAgdGhpcy5oaWdobGlnaHRlZERheSA9IDMwO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgIGlmIChpc0xlYXBZZWFyKHRoaXMuYWN0aXZlWWVhcikpIHRoaXMuaGlnaGxpZ2h0ZWREYXkgPSAyOTtcbiAgICAgICAgICAgICAgICBlbHNlIHRoaXMuaGlnaGxpZ2h0ZWREYXkgPSAyODtcbiAgICAgICAgfVxuICAgIH1cbiAgICBoaWdobGlnaHRGaXJzdE1vbnRoKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmhpZ2hsaWdodGVkTW9udGggPSAwO1xuICAgIH1cbiAgICBoaWdobGlnaHRMYXN0TW9udGgoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaGlnaGxpZ2h0ZWRNb250aCA9IDExO1xuICAgIH1cbiAgICBoaWdobGlnaHRGaXJzdFllYXIoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaGlnaGxpZ2h0ZWRZZWFyID0gdGhpcy5kaXNwbGF5ZWRZZWFyUmFuZ2VTdGFydDtcbiAgICB9XG4gICAgaGlnaGxpZ2h0TGFzdFllYXIoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaGlnaGxpZ2h0ZWRZZWFyID0gdGhpcy5kaXNwbGF5ZWRZZWFyUmFuZ2VTdGFydCArIDIzOyAvLzI0IHllYXJzIHBlciBwYWdlXG4gICAgfVxuICAgIC8vc2FtZSBkYXkgbmV4dC9wcmV2IG1vbnRoL3llYXJcbiAgICBoaWdobGlnaHRTYW1lRGF5TmV4dE1vbnRoKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmFjdGl2ZU1vbnRoKys7XG5cbiAgICAgICAgdGhpcy5fZml4RGF0ZUFmdGVyTW9udGhDaGFuZ2UoKTtcbiAgICB9XG4gICAgaGlnaGxpZ2h0U2FtZURheVByZXZpb3VzTW9udGgoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuYWN0aXZlTW9udGgtLTtcblxuICAgICAgICB0aGlzLl9maXhEYXRlQWZ0ZXJNb250aENoYW5nZSgpO1xuICAgIH1cbiAgICBwcml2YXRlIF9maXhEYXRlQWZ0ZXJNb250aENoYW5nZSgpOiB2b2lkIHtcbiAgICAgICAgc3dpdGNoICh0aGlzLmFjdGl2ZU1vbnRoICsgMSkge1xuICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgY2FzZSA4OlxuICAgICAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICAgIGNhc2UgMTI6XG4gICAgICAgICAgICAgICAgLy9kbyBub3RoaW5nXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgICBjYXNlIDExOlxuICAgICAgICAgICAgICAgIC8vb25seSBkbyBpZiBkYXkgaXMgMzFcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5oaWdobGlnaHRlZERheSA9PSAzMSkgdGhpcy5oaWdobGlnaHRlZERheSA9IDMwO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAyOiB7XG4gICAgICAgICAgICAgICAgLy9za2lwIGlmIGJlbG93IDI5IG9yIG51bGxcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaGlnaGxpZ2h0ZWREYXkgfHwgdGhpcy5oaWdobGlnaHRlZERheSA8IDI5KSBicmVhaztcblxuICAgICAgICAgICAgICAgIGlmIChpc0xlYXBZZWFyKHRoaXMuYWN0aXZlWWVhcikpIHRoaXMuaGlnaGxpZ2h0ZWREYXkgPSAyOTtcbiAgICAgICAgICAgICAgICBlbHNlIHRoaXMuaGlnaGxpZ2h0ZWREYXkgPSAyODtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBoaWdobGlnaHRTYW1lRGF5TmV4dFllYXIoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuYWN0aXZlWWVhcisrO1xuXG4gICAgICAgIHRoaXMuX2ZpeERhdGVBZnRlclllYXJDaGFuZ2UoKTtcbiAgICB9XG4gICAgaGlnaGxpZ2h0U2FtZURheVByZXZpb3VzWWVhcigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5hY3RpdmVZZWFyLS07XG5cbiAgICAgICAgdGhpcy5fZml4RGF0ZUFmdGVyWWVhckNoYW5nZSgpO1xuICAgIH1cbiAgICBwcml2YXRlIF9maXhEYXRlQWZ0ZXJZZWFyQ2hhbmdlKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5oaWdobGlnaHRlZERheSAhPSAyOSkgcmV0dXJuOyAvL3NraXAgaWYgbm90IDI5dGggZGF5IGlzIHNlbGVjdGVkXG4gICAgICAgIGlmIChpc0xlYXBZZWFyKHRoaXMuYWN0aXZlWWVhcikpIHJldHVybjsgLy9za2lwIGlmIG5lYSB5ZWFyIGlzIGEgbGVhcCB5ZWFyXG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZU1vbnRoICE9IDEpIHJldHVybjsgLy9za2lwIGlmIG5vdCBmZWJydWFyeVxuXG4gICAgICAgIHRoaXMuaGlnaGxpZ2h0ZWREYXkgPSAyODtcbiAgICB9XG4gICAgLy9zYW1lIG1vbnRoIG5leHQvcHJldiB5ZWFyXG4gICAgaGlnaGxpZ2h0U2FtZU1vbnRoTmV4dFllYXIobXVsdGlwbGU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5hY3RpdmVZZWFyICs9IG11bHRpcGxlID8gMTAgOiAxO1xuICAgIH1cbiAgICBoaWdobGlnaHRTYW1lTW9udGhQcmV2aW91c1llYXIobXVsdGlwbGU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5hY3RpdmVZZWFyIC09IG11bHRpcGxlID8gMTAgOiAxO1xuICAgIH1cbiAgICAvL3NhbWUgeWVhciBuZXh0L3ByZXYgcGFnZShzKVxuICAgIGhpZ2hsaWdodFNhbWVZZWFyTmV4dFBhZ2UobXVsdGlwbGU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgaWYgKCFpc0RlZmluZWQodGhpcy5oaWdobGlnaHRlZFllYXIpKSB7XG4gICAgICAgICAgICB0aGlzLmhpZ2hsaWdodGVkWWVhciA9IHRoaXMuZGlzcGxheWVkWWVhclJhbmdlU3RhcnQ7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNldEhpZ2hsaWdodGVkWWVhckFkanVzdFBhZ2UodGhpcy5oaWdobGlnaHRlZFllYXIgKyAobXVsdGlwbGUgPyA2MCA6IDI0KSk7XG4gICAgfVxuICAgIGhpZ2hsaWdodFNhbWVZZWFyUHJldmlvdXNQYWdlKG11bHRpcGxlOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIGlmICghaXNEZWZpbmVkKHRoaXMuaGlnaGxpZ2h0ZWRZZWFyKSkge1xuICAgICAgICAgICAgdGhpcy5oaWdobGlnaHRlZFllYXIgPSB0aGlzLmRpc3BsYXllZFllYXJSYW5nZVN0YXJ0O1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZXRIaWdobGlnaHRlZFllYXJBZGp1c3RQYWdlKHRoaXMuaGlnaGxpZ2h0ZWRZZWFyIC0gKG11bHRpcGxlID8gNjAgOiAyNCkpO1xuICAgIH1cblxuICAgIC8vISBzZXR0aW5nc1xuICAgIHByb3RlY3RlZCBfZmlyc3RXZWVrZGF5OiBudW1iZXIgPSAxO1xuICAgIEBJbnB1dCgpXG4gICAgZ2V0IGZpcnN0V2Vla2RheSgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmlyc3RXZWVrZGF5O1xuICAgIH1cbiAgICBzZXQgZmlyc3RXZWVrZGF5KHY6IGFueSkge1xuICAgICAgICB0aGlzLl9maXJzdFdlZWtkYXkgPSBjb2VyY2VOdW1iZXJQcm9wZXJ0eSh2LCAxKSAlIDc7XG5cbiAgICAgICAgdGhpcy5fdXBkYXRlQ2FsZW5kYXJBcnJheSgpO1xuICAgICAgICB0aGlzLl91cGRhdGVXZWVrZGF5QXJyYXkoKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX25vaW50ZXJhY3Q6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBASW5wdXQoKVxuICAgIGdldCBub2ludGVyYWN0KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fbm9pbnRlcmFjdCB8fCB0aGlzLmRpc2FibGVkO1xuICAgIH1cbiAgICBzZXQgbm9pbnRlcmFjdCh2OiBhbnkpIHtcbiAgICAgICAgdGhpcy5fbm9pbnRlcmFjdCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2KTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX3N0YXRpY0hlaWdodDogYm9vbGVhbiA9IGZhbHNlO1xuICAgIEBJbnB1dCgpXG4gICAgZ2V0IHN0YXRpY0hlaWdodCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0YXRpY0hlaWdodDtcbiAgICB9XG4gICAgc2V0IHN0YXRpY0hlaWdodCh2OiBhbnkpIHtcbiAgICAgICAgdGhpcy5fc3RhdGljSGVpZ2h0ID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHYpO1xuICAgIH1cblxuICAgIC8vISBjYWxlbmRhciBhcnJheVxuICAgIC8vZGF5cyB2aWV3IGFycmF5XG4gICAgY2FsZW5kYXJBcnJheSE6IChudW1iZXIgfCBudWxsKVtdW107XG5cbiAgICByZXNlcnZlVG9wUm93ITogYm9vbGVhbjtcblxuICAgIHByb3RlY3RlZCBfdXBkYXRlQ2FsZW5kYXJBcnJheSgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcmVzdWx0T2JqID0gZ2V0TW9udGhMYXlvdXQodGhpcy5fYWN0aXZlRGF0ZSwgdGhpcy5maXJzdFdlZWtkYXkpO1xuXG4gICAgICAgIHRoaXMucmVzZXJ2ZVRvcFJvdyA9IHJlc3VsdE9iai5sZWFkaW5nU3BhY2VzIDwgMztcbiAgICAgICAgdGhpcy5jYWxlbmRhckFycmF5ID0gcmVzdWx0T2JqLmFycmF5O1xuICAgIH1cblxuICAgIC8vbW9udGhzIHZpZXcgYXJyYXlcbiAgICByZWFkb25seSBtb250aHNBcnJheTogbnVtYmVyW10gPSBbMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExXTtcblxuICAgIC8veWVhcnMgdmlldyBhcnJheVxuICAgIHByaXZhdGUgX3llYXJzQXJyYXlDYWNoZTogbnVtYmVyW10gfCBudWxsID0gbnVsbDtcbiAgICBwcml2YXRlIF95ZWFyc0FycmF5Q2FjaGVTdGFydFllYXI6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICAgIGdldFllYXJzQXJyYXkoKTogbnVtYmVyW10ge1xuICAgICAgICBjb25zdCB5ZWFyID0gdGhpcy5kaXNwbGF5ZWRZZWFyUmFuZ2VTdGFydDtcblxuICAgICAgICBpZiAodGhpcy5feWVhcnNBcnJheUNhY2hlU3RhcnRZZWFyID09IHllYXIgJiYgaXNEZWZpbmVkKHRoaXMuX3llYXJzQXJyYXlDYWNoZSkpIHJldHVybiB0aGlzLl95ZWFyc0FycmF5Q2FjaGU7XG5cbiAgICAgICAgY29uc3QgbmV3QXJyYXk6IG51bWJlcltdID0gW107XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IHllYXI7IGkgPCB5ZWFyICsgMjQ7IGkrKykge1xuICAgICAgICAgICAgbmV3QXJyYXkucHVzaChpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3llYXJzQXJyYXlDYWNoZSA9IG5ld0FycmF5O1xuICAgICAgICB0aGlzLl95ZWFyc0FycmF5Q2FjaGVTdGFydFllYXIgPSB5ZWFyO1xuICAgICAgICByZXR1cm4gbmV3QXJyYXk7XG4gICAgfVxuXG4gICAgLy8hIHdlZWtkYXkgYXJyYXlcbiAgICB3ZWVrZGF5QXJyYXkhOiBudW1iZXJbXTtcblxuICAgIHByb3RlY3RlZCBfdXBkYXRlV2Vla2RheUFycmF5KCk6IHZvaWQge1xuICAgICAgICB0aGlzLndlZWtkYXlBcnJheSA9IFswLCAxLCAyLCAzLCA0LCA1LCA2XS5tYXAodiA9PiAodiArIHRoaXMuZmlyc3RXZWVrZGF5KSAlIDcpO1xuICAgIH1cblxuICAgIC8vISBjaGFuZ2UgdmlldyBmdW5jdGlvbnNcbiAgICBhY3RpdmVWaWV3OiBDYWxlbmRhclZpZXcgPSBDYWxlbmRhclZpZXcuRGF5cztcblxuICAgIEBJbnB1dCgpXG4gICAgc2V0IHN0YXJ0Vmlldyh2OiBDYWxlbmRhclZpZXcpIHtcbiAgICAgICAgdGhpcy5hY3RpdmVWaWV3ID0gdjtcbiAgICB9XG5cbiAgICBvcGVuWWVhcnNWaWV3KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmFjdGl2ZVZpZXcgPSBDYWxlbmRhclZpZXcuWWVhcnM7XG5cbiAgICAgICAgdGhpcy5fdXBkYXRlRGlzcGxheWVkWWVhclJhbmdlU3RhcnQoKTtcblxuICAgICAgICB0aGlzLnZpZXdDaGFuZ2UuZW1pdCh0aGlzLmFjdGl2ZVZpZXcpO1xuICAgIH1cbiAgICBvcGVuTW9udGhzVmlldygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5hY3RpdmVWaWV3ID0gQ2FsZW5kYXJWaWV3Lk1vbnRocztcbiAgICAgICAgLy9icmluZyBiYWNrIG9sZCB2YWx1ZVxuICAgICAgICBjb25zdCBvbGRZZWFyID0gdGhpcy5hY3RpdmVZZWFyO1xuICAgICAgICB0aGlzLmFjdGl2ZVllYXIgPSB0aGlzLmFjdGl2ZVllYXIgPz8gdGhpcy50b2RheURhdGUuZ2V0RnVsbFllYXIoKTtcblxuICAgICAgICAvL2VtaXQgZXZlbnRzXG4gICAgICAgIHRoaXMudmlld0NoYW5nZS5lbWl0KHRoaXMuYWN0aXZlVmlldyk7XG4gICAgICAgIGlmIChvbGRZZWFyICE9IHRoaXMuYWN0aXZlWWVhciAmJiB0aGlzLmFjdGl2ZVllYXIgPT0gdGhpcy50b2RheURhdGUuZ2V0RnVsbFllYXIoKSkgdGhpcy5hY3RpdmVZZWFyQ2hhbmdlLmVtaXQodGhpcy5hY3RpdmVZZWFyKTtcbiAgICB9XG4gICAgb3BlbkRheXNWaWV3KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmFjdGl2ZVZpZXcgPSBDYWxlbmRhclZpZXcuRGF5cztcbiAgICAgICAgLy9icmluZyBiYWNrIG9sZCB2YWx1ZXNcbiAgICAgICAgY29uc3Qgb2xkWWVhciA9IHRoaXMuYWN0aXZlWWVhcjtcbiAgICAgICAgdGhpcy5hY3RpdmVZZWFyID0gdGhpcy5hY3RpdmVZZWFyID8/IHRoaXMudG9kYXlEYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgICAgIGNvbnN0IG9sZE1vbnRoID0gdGhpcy5hY3RpdmVNb250aDtcbiAgICAgICAgdGhpcy5hY3RpdmVNb250aCA9IHRoaXMuYWN0aXZlTW9udGggPz8gdGhpcy50b2RheURhdGUuZ2V0TW9udGgoKTtcblxuICAgICAgICAvL2VtaXQgZXZlbnRzXG4gICAgICAgIHRoaXMudmlld0NoYW5nZS5lbWl0KHRoaXMuYWN0aXZlVmlldyk7XG4gICAgICAgIGlmIChvbGRZZWFyICE9IHRoaXMuYWN0aXZlWWVhciAmJiB0aGlzLmFjdGl2ZVllYXIgPT0gdGhpcy50b2RheURhdGUuZ2V0RnVsbFllYXIoKSkgdGhpcy5hY3RpdmVZZWFyQ2hhbmdlLmVtaXQodGhpcy5hY3RpdmVZZWFyKTtcbiAgICAgICAgaWYgKG9sZE1vbnRoICE9IHRoaXMuYWN0aXZlTW9udGggJiYgdGhpcy5hY3RpdmVNb250aCA9PSB0aGlzLnRvZGF5RGF0ZS5nZXRNb250aCgpKSB0aGlzLmFjdGl2ZU1vbnRoQ2hhbmdlLmVtaXQodGhpcy5hY3RpdmVNb250aCk7XG4gICAgfVxuXG4gICAgLy8hIHRlbXBsYXRlIGN1c3RvbWl6YXRpb25cbiAgICAvL2hlYWRlcnNcbiAgICBAQ29udGVudENoaWxkKEFyZFllYXJzVmlld0hlYWRlclRlbXBsYXRlRGlyZWN0aXZlKVxuICAgIHllYXJzVmlld0hlYWRlclRlbXBsYXRlPzogVGVtcGxhdGVSZWY8Q2FsZW5kYXJZZWFyc1ZpZXdIZWFkZXJDb250ZXh0PjtcbiAgICBAQ29udGVudENoaWxkKEFyZE1vbnRoc1ZpZXdIZWFkZXJUZW1wbGF0ZURpcmVjdGl2ZSlcbiAgICBtb250aHNWaWV3SGVhZGVyVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxDYWxlbmRhck1vbnRoc1ZpZXdIZWFkZXJDb250ZXh0PjtcbiAgICBAQ29udGVudENoaWxkKEFyZERheXNWaWV3SGVhZGVyVGVtcGxhdGVEaXJlY3RpdmUpXG4gICAgZGF5c1ZpZXdIZWFkZXJUZW1wbGF0ZT86IFRlbXBsYXRlUmVmPENhbGVuZGFyRGF5c1ZpZXdIZWFkZXJDb250ZXh0PjtcbiAgICAvL3dlZWtkYXlcbiAgICBAQ29udGVudENoaWxkKEFyZFdlZWtkYXlUZW1wbGF0ZURpcmVjdGl2ZSlcbiAgICB3ZWVrZGF5VGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxDYWxlbmRhcldlZWtkYXlDb250ZXh0PjtcbiAgICAvL2Zsb2F0aW5nIG1vbnRoXG4gICAgQENvbnRlbnRDaGlsZChBcmRGbG9hdGluZ01vbnRoVGVtcGxhdGVEaXJlY3RpdmUpXG4gICAgZmxvYXRpbmdNb250aFRlbXBsYXRlPzogVGVtcGxhdGVSZWY8Q2FsZW5kYXJGbG9hdGluZ01vbnRoQ29udGV4dD47XG4gICAgLy9ncmlkIGVsZW1lbnRzICh5ZWFyLCBtb250aCwgZGF5KVxuICAgIEBDb250ZW50Q2hpbGQoQXJkWWVhclRlbXBsYXRlRGlyZWN0aXZlKVxuICAgIHllYXJUZW1wbGF0ZT86IFRlbXBsYXRlUmVmPENhbGVuZGFyWWVhckNvbnRleHQ+O1xuICAgIEBDb250ZW50Q2hpbGQoQXJkTW9udGhUZW1wbGF0ZURpcmVjdGl2ZSlcbiAgICBtb250aFRlbXBsYXRlPzogVGVtcGxhdGVSZWY8Q2FsZW5kYXJNb250aENvbnRleHQ+O1xuICAgIEBDb250ZW50Q2hpbGQoQXJkRGF5VGVtcGxhdGVEaXJlY3RpdmUpXG4gICAgZGF5VGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxDYWxlbmRhckRheUNvbnRleHQ+O1xuXG4gICAgLy8hIGNvbnRleHQgZ2V0dGVyc1xuICAgIC8vaGVhZGVyc1xuICAgIGdldFllYXJzVmlld0hlYWRlckNvbnRleHQoKTogQ2FsZW5kYXJZZWFyc1ZpZXdIZWFkZXJDb250ZXh0IHtcbiAgICAgICAgY29uc3QgeWVhclJhbmdlU3RhcnQgPSB0aGlzLmRpc3BsYXllZFllYXJSYW5nZVN0YXJ0O1xuICAgICAgICBjb25zdCB5ZWFyUmFuZ2VFbmQgPSB5ZWFyUmFuZ2VTdGFydCArIDIzO1xuICAgICAgICBjb25zdCBkYXRlUmFuZ2U6IERhdGVSYW5nZSA9IHtcbiAgICAgICAgICAgIGxvdzogbmV3IERhdGUoeWVhclJhbmdlU3RhcnQsIDAsIDEpLFxuICAgICAgICAgICAgaGlnaDogbmV3IERhdGUoeWVhclJhbmdlRW5kLCAwLCAxKSxcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5leHRQYWdlOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VZZWFyc1ZpZXdQYWdlKCsxKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwcmV2UGFnZTogKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlWWVhcnNWaWV3UGFnZSgtMSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb3BlbkRheXNWaWV3OiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcGVuRGF5c1ZpZXcoKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB5ZWFyUmFuZ2U6IHtcbiAgICAgICAgICAgICAgICBsb3c6IHllYXJSYW5nZVN0YXJ0LFxuICAgICAgICAgICAgICAgIGhpZ2g6IHllYXJSYW5nZUVuZCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkYXRlUmFuZ2UsXG4gICAgICAgICAgICAkaW1wbGljaXQ6IGRhdGVSYW5nZSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgZ2V0TW9udGhzVmlld0hlYWRlckNvbnRleHQoKTogQ2FsZW5kYXJNb250aHNWaWV3SGVhZGVyQ29udGV4dCB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBvcGVuWWVhcnNWaWV3OiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcGVuWWVhcnNWaWV3KCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb3BlbkRheXNWaWV3OiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcGVuRGF5c1ZpZXcoKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB5ZWFyOiB0aGlzLmFjdGl2ZVllYXIsXG4gICAgICAgICAgICBkYXRlOiB0aGlzLmFjdGl2ZURhdGUsXG4gICAgICAgICAgICAkaW1wbGljaXQ6IHRoaXMuYWN0aXZlWWVhcixcbiAgICAgICAgfTtcbiAgICB9XG4gICAgZ2V0RGF5c1ZpZXdIZWFkZXJDb250ZXh0KCk6IENhbGVuZGFyRGF5c1ZpZXdIZWFkZXJDb250ZXh0IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5leHRNb250aDogKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlTW9udGgoKzEpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHByZXZNb250aDogKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlTW9udGgoLTEpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5leHRZZWFyOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VZZWFyKCsxKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwcmV2WWVhcjogKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlWWVhcigtMSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb3BlblllYXJzVmlldzogKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMub3BlblllYXJzVmlldygpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9wZW5Nb250aHNWaWV3OiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcGVuTW9udGhzVmlldygpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHllYXI6IHRoaXMuYWN0aXZlWWVhcixcbiAgICAgICAgICAgIG1vbnRoOiB0aGlzLmFjdGl2ZU1vbnRoLFxuICAgICAgICAgICAgZGF0ZTogdGhpcy5hY3RpdmVEYXRlLFxuICAgICAgICAgICAgJGltcGxpY2l0OiB0aGlzLmFjdGl2ZURhdGUsXG4gICAgICAgIH07XG4gICAgfVxuICAgIC8vd2Vla2RheVxuICAgIGdldFdlZWtkYXlDb250ZXh0KGRheUluZGV4OiBudW1iZXIpOiBDYWxlbmRhcldlZWtkYXlDb250ZXh0IHtcbiAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKDE5NzAsIDAsIDQgKyBkYXlJbmRleCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkYXlJbmRleCxcbiAgICAgICAgICAgIGRhdGUsXG4gICAgICAgICAgICAkaW1wbGljaXQ6IGRhdGUsXG4gICAgICAgIH07XG4gICAgfVxuICAgIC8vZmxvYXRpbmcgbW9udGhcbiAgICBnZXRGbG9hdGluZ01vbnRoQ29udGV4dCgpOiBDYWxlbmRhckZsb2F0aW5nTW9udGhDb250ZXh0IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG1vbnRoOiB0aGlzLmFjdGl2ZU1vbnRoLFxuICAgICAgICAgICAgZGF0ZTogdGhpcy5hY3RpdmVEYXRlLFxuICAgICAgICAgICAgJGltcGxpY2l0OiB0aGlzLmFjdGl2ZURhdGUsXG4gICAgICAgIH07XG4gICAgfVxuICAgIC8vZ3JpZCBlbGVtZW50cyAoeWVhciwgbW9udGgsIGRheSlcbiAgICBnZXRZZWFyQ29udGV4dCh5ZWFyOiBudW1iZXIpOiBDYWxlbmRhclllYXJDb250ZXh0IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHZhbHVlOiB5ZWFyLFxuICAgICAgICAgICAgZGF0ZTogbmV3IERhdGUodGhpcy5hY3RpdmVZZWFyLCAwLCAxKSxcbiAgICAgICAgICAgICRpbXBsaWNpdDogeWVhcixcbiAgICAgICAgICAgIHNlbGVjdDogKHllYXI6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0WWVhcih5ZWFyKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgfVxuICAgIGdldE1vbnRoQ29udGV4dChtb250aDogbnVtYmVyKTogQ2FsZW5kYXJNb250aENvbnRleHQge1xuICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUodGhpcy5hY3RpdmVZZWFyLCBtb250aCwgMSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBtb250aCxcbiAgICAgICAgICAgIGRhdGUsXG4gICAgICAgICAgICAkaW1wbGljaXQ6IGRhdGUsXG4gICAgICAgICAgICBzZWxlY3Q6IChtb250aDogbnVtYmVyIHwgRGF0ZSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0TW9udGgobW9udGgpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgZ2V0RGF5Q29udGV4dChkYXk6IG51bWJlcik6IENhbGVuZGFyRGF5Q29udGV4dCB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB2YWx1ZTogZGF5LFxuICAgICAgICAgICAgZGF0ZTogbmV3IERhdGUodGhpcy5hY3RpdmVZZWFyLCB0aGlzLmFjdGl2ZU1vbnRoLCBkYXkpLFxuICAgICAgICAgICAgJGltcGxpY2l0OiBkYXksXG4gICAgICAgICAgICBzZWxlY3Q6IChkYXk6IG51bWJlciB8IERhdGUpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdERheShkYXkpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiYXJkLWNhbGVuZGFyXCIgW25nQ2xhc3NdPVwibmdDbGFzc2VzXCI+XHJcbiAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwiYWN0aXZlVmlldyA9PSAnZGF5cycgPyBkYXlzVmlldyA6IGFjdGl2ZVZpZXcgPT0gJ21vbnRocycgPyBtb250aHNWaWV3IDogeWVhcnNWaWV3XCIvPlxyXG48L2Rpdj5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjeWVhcnNWaWV3PlxyXG4gICAgPGRpdiBjbGFzcz1cImFyZC1jYWxlbmRhci1oZWFkZXItY29udGFpbmVyXCI+XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0WWVhcnNWaWV3SGVhZGVyVGVtcGxhdGUgbGV0LWN1cnJSYW5nZSBsZXQtbmV4dFBhZ2U9XCJuZXh0UGFnZVwiIGxldC1wcmV2UGFnZT1cInByZXZQYWdlXCIgbGV0LW9wZW5EYXlzVmlldz1cIm9wZW5EYXlzVmlld1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJkLWNhbGVuZGFyLWRheXMtdmlldy1oZWFkZXJcIj5cclxuICAgICAgICAgICAgICAgIDxhcmQtYnV0dG9uXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhcmQtY2FsZW5kYXItaGVhZGVyLWJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgYXBwZWFyYW5jZT1cInRyYW5zcGFyZW50XCJcclxuICAgICAgICAgICAgICAgICAgICBjb2xvcj1cIm5vbmVcIlxyXG4gICAgICAgICAgICAgICAgICAgIFt0YWJJbmRleF09XCJ0YWJJbmRleFwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5EYXlzVmlldygpXCJcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICB7eyBjdXJyUmFuZ2UubG93IHwgZGF0ZTogJ1lZWVknIH19XHJcbiAgICAgICAgICAgICAgICAgICAgJm1kYXNoO1xyXG4gICAgICAgICAgICAgICAgICAgIHt7IGN1cnJSYW5nZS5oaWdoIHwgZGF0ZTogJ1lZWVknIH19XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFyZC1kcm9wZG93bi1hcnJvd1wiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9hcmQtYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFyZC1jYWxlbmRhci1hcnJvd3NcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YXJkLWljb24tYnV0dG9uIHNpemU9XCJzbWFsbFwiIGFwcGVhcmFuY2U9XCJ0cmFuc3BhcmVudFwiIGNvbG9yPVwibm9uZVwiIChjbGljayk9XCJwcmV2UGFnZSgpXCIgW3RhYkluZGV4XT1cInRhYkluZGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxhcmQtaWNvbj5jaGV2cm9uX2xlZnQ8L2FyZC1pY29uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYXJkLWljb24tYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxhcmQtaWNvbi1idXR0b24gc2l6ZT1cInNtYWxsXCIgYXBwZWFyYW5jZT1cInRyYW5zcGFyZW50XCIgY29sb3I9XCJub25lXCIgKGNsaWNrKT1cIm5leHRQYWdlKClcIiBbdGFiSW5kZXhdPVwidGFiSW5kZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGFyZC1pY29uPmNoZXZyb25fcmlnaHQ8L2FyZC1pY29uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYXJkLWljb24tYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZVxyXG4gICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJ5ZWFyc1ZpZXdIZWFkZXJUZW1wbGF0ZSB8fCBkZWZhdWx0WWVhcnNWaWV3SGVhZGVyVGVtcGxhdGVcIlxyXG4gICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwiZ2V0WWVhcnNWaWV3SGVhZGVyQ29udGV4dCgpXCJcclxuICAgICAgICAvPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiYXJkLWNhbGVuZGFyLW1haW4tY29udGFpbmVyXCI+XHJcbiAgICAgICAgPGRpdiAjZm9jdXNhYmxlRWxlbWVudFxyXG4gICAgICAgICAgICBjbGFzcz1cImFyZC1jYWxlbmRhci1zaW1wbGUtZ3JpZFwiXHJcbiAgICAgICAgICAgIFt0YWJpbmRleF09XCJ0YWJJbmRleFwiXHJcbiAgICAgICAgICAgIFthcmlhTGFiZWxdPVwiY3VycmVudEFyaWFMYWJlbFwiXHJcbiAgICAgICAgICAgIChmb2N1cyk9XCJvbkZvY3VzKCRldmVudClcIlxyXG4gICAgICAgICAgICAoZm9jdXMpPVwib25ZZWFyR3JpZEZvY3VzKClcIlxyXG4gICAgICAgICAgICAoYmx1cik9XCJvbkJsdXIoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIChibHVyKT1cIm9uWWVhckdyaWRCbHVyKClcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwib25ZZWFyR3JpZENsaWNrKClcIlxyXG4gICAgICAgICAgICAoa2V5ZG93bik9XCJvbk1haW5HcmlkS2V5ZG93bigkZXZlbnQpXCJcclxuICAgICAgICAgICAgcm9sZT1cImdyaWRcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgeWVhciBvZiBnZXRZZWFyc0FycmF5KClcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcmQtY2FsZW5kYXItZW50cnlcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5hcmQtY2FsZW5kYXItZW50cnktaGlnaGxpZ2h0ZWRdPVwiaGlnaGxpZ2h0ZWRZZWFyID09IHllYXIgfHwgYWN0aXZlWWVhciA9PSB5ZWFyXCJcclxuICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYXJkLWNhbGVuZGFyLWVudHJ5LXNlbGVjdGVkXT1cImlzWWVhclNlbGVjdGVkKHllYXIpXCJcclxuICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYXJkLWNhbGVuZGFyLXRvZGF5XT1cImlzWWVhclRvZGF5KHllYXIpXCJcclxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25DYWxlbmRhclllYXJDbGljayh5ZWFyKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKG1vdXNlbW92ZSk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxyXG4gICAgICAgICAgICAgICAgICAgIChtb3VzZW92ZXIpPVwib25DYWxlbmRhclllYXJNb3VzZW92ZXIoeWVhcilcIlxyXG4gICAgICAgICAgICAgICAgICAgIHJvbGU9XCJncmlkY2VsbFwiXHJcbiAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImFyZC1jYWxlbmRhci1lbnRyeS1idXR0b25cIiB0YWJpbmRleD1cIi0xXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcmQtZm9jdXMtb3ZlcmxheVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJkLWJ1dHRvbi1jb250ZW50XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRZZWFyVGVtcGxhdGUgbGV0LXllYXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgeWVhciB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInllYXJUZW1wbGF0ZSB8fCBkZWZhdWx0WWVhclRlbXBsYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwiZ2V0WWVhckNvbnRleHQoeWVhcilcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48bmctdGVtcGxhdGUgI21vbnRoc1ZpZXc+XHJcbiAgICA8ZGl2IGNsYXNzPVwiYXJkLWNhbGVuZGFyLWhlYWRlci1jb250YWluZXJcIj5cclxuICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRNb250aHNWaWV3SGVhZGVyVGVtcGxhdGUgbGV0LXllYXIgbGV0LW5leHRQYWdlPVwibmV4dFBhZ2VcIiBsZXQtcHJldlBhZ2U9XCJwcmV2UGFnZVwiIGxldC1vcGVuRGF5c1ZpZXc9XCJvcGVuRGF5c1ZpZXdcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFyZC1jYWxlbmRhci1kYXlzLXZpZXctaGVhZGVyXCI+XHJcbiAgICAgICAgICAgICAgICA8YXJkLWJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYXJkLWNhbGVuZGFyLWhlYWRlci1idXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgIGFwcGVhcmFuY2U9XCJ0cmFuc3BhcmVudFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2NvbG9yXT1cImNvbG9yXCJcclxuICAgICAgICAgICAgICAgICAgICBbdGFiSW5kZXhdPVwidGFiSW5kZXhcIlxyXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvcGVuRGF5c1ZpZXcoKVwiXHJcbiAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAge3sgeWVhciB9fVxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcmQtZHJvcGRvd24tYXJyb3dcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvYXJkLWJ1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgPG5nLXRlbXBsYXRlXHJcbiAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIm1vbnRoc1ZpZXdIZWFkZXJUZW1wbGF0ZSB8fCBkZWZhdWx0TW9udGhzVmlld0hlYWRlclRlbXBsYXRlXCJcclxuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cImdldE1vbnRoc1ZpZXdIZWFkZXJDb250ZXh0KClcIlxyXG4gICAgICAgIC8+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJhcmQtY2FsZW5kYXItbWFpbi1jb250YWluZXJcIj5cclxuICAgICAgICA8ZGl2ICNmb2N1c2FibGVFbGVtZW50XHJcbiAgICAgICAgICAgIGNsYXNzPVwiYXJkLWNhbGVuZGFyLXNpbXBsZS1ncmlkXCJcclxuICAgICAgICAgICAgW3RhYmluZGV4XT1cInRhYkluZGV4XCJcclxuICAgICAgICAgICAgW2FyaWFMYWJlbF09XCJjdXJyZW50QXJpYUxhYmVsXCJcclxuICAgICAgICAgICAgKGZvY3VzKT1cIm9uRm9jdXMoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIChmb2N1cyk9XCJvbk1vbnRoR3JpZEZvY3VzKClcIlxyXG4gICAgICAgICAgICAoYmx1cik9XCJvbkJsdXIoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIChibHVyKT1cIm9uTW9udGhHcmlkQmx1cigpXCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uTW9udGhHcmlkQ2xpY2soKVwiXHJcbiAgICAgICAgICAgIChrZXlkb3duKT1cIm9uTWFpbkdyaWRLZXlkb3duKCRldmVudClcIlxyXG4gICAgICAgICAgICByb2xlPVwiZ3JpZFwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBtb250aCBvZiBtb250aHNBcnJheVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFyZC1jYWxlbmRhci1lbnRyeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmFyZC1jYWxlbmRhci1lbnRyeS1oaWdobGlnaHRlZF09XCJoaWdobGlnaHRlZE1vbnRoID09IG1vbnRoIHx8IGFjdGl2ZU1vbnRoID09IG1vbnRoXCJcclxuICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYXJkLWNhbGVuZGFyLWVudHJ5LXNlbGVjdGVkXT1cImlzTW9udGhTZWxlY3RlZChtb250aClcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5hcmQtY2FsZW5kYXItdG9kYXldPVwiaXNNb250aFRvZGF5KG1vbnRoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uQ2FsZW5kYXJNb250aENsaWNrKG1vbnRoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKG1vdXNlbW92ZSk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxyXG4gICAgICAgICAgICAgICAgICAgIChtb3VzZW92ZXIpPVwib25DYWxlbmRhck1vbnRoTW91c2VvdmVyKG1vbnRoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgcm9sZT1cImdyaWRjZWxsXCJcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYXJkLWNhbGVuZGFyLWVudHJ5LWJ1dHRvblwiIHRhYmluZGV4PVwiLTFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFyZC1mb2N1cy1vdmVybGF5XCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcmQtYnV0dG9uLWNvbnRlbnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdE1vbnRoVGVtcGxhdGUgbGV0LW1vbnRoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IG1vbnRoIHwgZGF0ZTogXCJNTU1cIiB8IHVwcGVyY2FzZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIm1vbnRoVGVtcGxhdGUgfHwgZGVmYXVsdE1vbnRoVGVtcGxhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJnZXRNb250aENvbnRleHQobW9udGgpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuPG5nLXRlbXBsYXRlICNkYXlzVmlldz5cclxuICAgIDxkaXYgY2xhc3M9XCJhcmQtY2FsZW5kYXItaGVhZGVyLWNvbnRhaW5lclwiPlxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdERheXNWaWV3SGVhZGVyVGVtcGxhdGUgbGV0LWN1cnJEYXRlIGxldC1uZXh0TW9udGg9XCJuZXh0TW9udGhcIiBsZXQtcHJldk1vbnRoPVwicHJldk1vbnRoXCIgbGV0LW9wZW5ZZWFyc1ZpZXc9XCJvcGVuWWVhcnNWaWV3XCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcmQtY2FsZW5kYXItZGF5cy12aWV3LWhlYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgPGFyZC1idXR0b25cclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFyZC1jYWxlbmRhci1oZWFkZXItYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICBhcHBlYXJhbmNlPVwidHJhbnNwYXJlbnRcIlxyXG4gICAgICAgICAgICAgICAgICAgIGNvbG9yPVwibm9uZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3RhYkluZGV4XT1cInRhYkluZGV4XCJcclxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib3BlblllYXJzVmlldygpXCJcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICB7eyBjdXJyRGF0ZSB8IGRhdGU6ICdNTU0gWVlZWScgfCB1cHBlcmNhc2UgfX1cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJkLWRyb3Bkb3duLWFycm93XCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2FyZC1idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJkLWNhbGVuZGFyLWFycm93c1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxhcmQtaWNvbi1idXR0b24gc2l6ZT1cInNtYWxsXCIgYXBwZWFyYW5jZT1cInRyYW5zcGFyZW50XCIgY29sb3I9XCJub25lXCIgKGNsaWNrKT1cInByZXZNb250aCgpXCIgW3RhYkluZGV4XT1cInRhYkluZGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxhcmQtaWNvbj5jaGV2cm9uX2xlZnQ8L2FyZC1pY29uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvYXJkLWljb24tYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxhcmQtaWNvbi1idXR0b24gc2l6ZT1cInNtYWxsXCIgYXBwZWFyYW5jZT1cInRyYW5zcGFyZW50XCIgY29sb3I9XCJub25lXCIgKGNsaWNrKT1cIm5leHRNb250aCgpXCIgW3RhYkluZGV4XT1cInRhYkluZGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxhcmQtaWNvbj5jaGV2cm9uX3JpZ2h0PC9hcmQtaWNvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2FyZC1pY29uLWJ1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICA8bmctdGVtcGxhdGVcclxuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiZGF5c1ZpZXdIZWFkZXJUZW1wbGF0ZSB8fCBkZWZhdWx0RGF5c1ZpZXdIZWFkZXJUZW1wbGF0ZVwiXHJcbiAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJnZXREYXlzVmlld0hlYWRlckNvbnRleHQoKVwiXHJcbiAgICAgICAgLz5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImFyZC1jYWxlbmRhci1tYWluLWNvbnRhaW5lclwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhcmQtY2FsZW5kYXItZGF5LWxhYmVscyBhcmQtY2FsZW5kYXItZ3JpZFwiPlxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRXZWVrZGF5VGVtcGxhdGUgbGV0LWRhdGU+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJkLWNhbGVuZGFyLXdlZWtkYXlcIj57eyBkYXRlIHwgZGF0ZTogJ0VFRUVFJyB9fTwvZGl2PlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCB3ZWVrZGF5SW5kZXggb2Ygd2Vla2RheUFycmF5XCI+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGVcclxuICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJ3ZWVrZGF5VGVtcGxhdGUgfHwgZGVmYXVsdFdlZWtkYXlUZW1wbGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cImdldFdlZWtkYXlDb250ZXh0KHdlZWtkYXlJbmRleClcIlxyXG4gICAgICAgICAgICAgICAgPjwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgI2ZvY3VzYWJsZUVsZW1lbnRcclxuICAgICAgICAgICAgY2xhc3M9XCJhcmQtY2FsZW5kYXItbWFpbi1ncmlkIGFyZC1jYWxlbmRhci1ncmlkXCJcclxuICAgICAgICAgICAgW2NsYXNzLmFyZC1yZXNlcnZlLXRvcC1yb3ddPVwicmVzZXJ2ZVRvcFJvd1wiXHJcbiAgICAgICAgICAgIFt0YWJpbmRleF09XCJ0YWJJbmRleFwiXHJcbiAgICAgICAgICAgIFthcmlhTGFiZWxdPVwiY3VycmVudEFyaWFMYWJlbFwiXHJcbiAgICAgICAgICAgIChmb2N1cyk9XCJvbkZvY3VzKCRldmVudClcIlxyXG4gICAgICAgICAgICAoZm9jdXMpPVwib25EYXlHcmlkRm9jdXMoKVwiXHJcbiAgICAgICAgICAgIChibHVyKT1cIm9uQmx1cigkZXZlbnQpXCJcclxuICAgICAgICAgICAgKGJsdXIpPVwib25EYXlHcmlkQmx1cigpXCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uRGF5R3JpZENsaWNrKClcIlxyXG4gICAgICAgICAgICAoa2V5ZG93bik9XCJvbk1haW5HcmlkS2V5ZG93bigkZXZlbnQpXCJcclxuICAgICAgICAgICAgcm9sZT1cImdyaWRcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFyZC1jYWxlbmRhci1mbG9hdGluZy1tb250aFwiPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0RmxvYXRpbmdNb250aFRlbXBsYXRlIGxldC1kYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7IGRhdGUgfCBkYXRlOiAnTExMJyB8IHVwcGVyY2FzZSB9fVxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGVcclxuICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJmbG9hdGluZ01vbnRoVGVtcGxhdGUgfHwgZGVmYXVsdEZsb2F0aW5nTW9udGhUZW1wbGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cImdldEZsb2F0aW5nTW9udGhDb250ZXh0KClcIlxyXG4gICAgICAgICAgICAgICAgPjwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCB3ZWVrIG9mIGNhbGVuZGFyQXJyYXlcIj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGRheSBvZiB3ZWVrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFyZC1jYWxlbmRhci1lbnRyeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5hcmQtY2FsZW5kYXItZW50cnktZW1wdHldPVwiZGF5ID09IG51bGxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYXJkLWNhbGVuZGFyLWVudHJ5LWhpZ2hsaWdodGVkXT1cImhpZ2hsaWdodGVkRGF5ID09IGRheVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5hcmQtY2FsZW5kYXItZW50cnktc2VsZWN0ZWRdPVwiaXNEYXlTZWxlY3RlZChkYXkpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmFyZC1jYWxlbmRhci10b2RheV09XCJpc0RheVRvZGF5KGRheSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25DYWxlbmRhckRheUNsaWNrKGRheSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAobW91c2Vtb3ZlKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChtb3VzZW92ZXIpPVwib25DYWxlbmRhckRheU1vdXNlb3ZlcihkYXkpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgcm9sZT1cImdyaWRjZWxsXCJcclxuICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhcmQtY2FsZW5kYXItZW50cnktYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZGF5ICE9IG51bGxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFiaW5kZXg9XCItMVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcmQtZm9jdXMtb3ZlcmxheVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFyZC1idXR0b24tY29udGVudFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdERheVRlbXBsYXRlIGxldC1kYXk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGRheSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImRheVRlbXBsYXRlIHx8IGRlZmF1bHREYXlUZW1wbGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJnZXREYXlDb250ZXh0KGRheSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG5cclxuPCEtLSA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNMb2FkaW5nXCI+XHJcbiAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRMb2FkaW5nU3Bpbm5lclRlbXBsYXRlPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhcmQtc3Bpbm5lclwiPjwvZGl2PlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwibG9hZGluZ1NwaW5uZXJUZW1wbGF0ZSB8fCBkZWZhdWx0TG9hZGluZ1NwaW5uZXJUZW1wbGF0ZVwiPlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuPC9uZy1jb250YWluZXI+IC0tPiJdfQ==