@ptsecurity/mosaic 15.5.0 → 16.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 (788) hide show
  1. package/_theming.scss +29 -6
  2. package/_visual.scss +6 -4
  3. package/autocomplete/autocomplete-trigger.directive.d.ts +6 -16
  4. package/autocomplete/autocomplete.component.d.ts +1 -1
  5. package/button/_button-theme.scss +2 -5
  6. package/button/button.component.d.ts +1 -1
  7. package/button-toggle/_button-toggle-theme.scss +2 -5
  8. package/button-toggle/button-toggle.component.d.ts +3 -3
  9. package/card/card.component.d.ts +1 -1
  10. package/checkbox/_checkbox-theme.scss +6 -5
  11. package/checkbox/checkbox-config.d.ts +1 -1
  12. package/checkbox/checkbox.d.ts +1 -1
  13. package/code-block/_code-block-theme.scss +2 -6
  14. package/code-block/actionbar.component.d.ts +1 -1
  15. package/code-block/code-block.component.d.ts +1 -1
  16. package/core/common-behaviors/color.d.ts +1 -1
  17. package/core/common-behaviors/constructor.d.ts +2 -2
  18. package/core/common-behaviors/disabled.d.ts +1 -1
  19. package/core/common-behaviors/error-state.d.ts +1 -1
  20. package/core/common-behaviors/tabindex.d.ts +1 -1
  21. package/core/datetime/date-formats.d.ts +1 -1
  22. package/core/formatters/index.d.ts +1 -1
  23. package/core/formatters/number/formatter.d.ts +55 -0
  24. package/core/forms/_forms-theme.scss +2 -4
  25. package/core/label/label-options.d.ts +1 -1
  26. package/core/locales/en-US.d.ts +13 -2
  27. package/core/locales/es-LA.d.ts +21 -0
  28. package/core/locales/fa-IR.d.ts +22 -0
  29. package/core/locales/locale-service.d.ts +111 -5
  30. package/core/locales/pt-BR.d.ts +21 -0
  31. package/core/locales/ru-RU.d.ts +13 -2
  32. package/core/locales/zh-CN.d.ts +20 -0
  33. package/core/option/_optgroup-theme.scss +2 -4
  34. package/core/option/_option-theme.scss +2 -5
  35. package/core/option/action.d.ts +1 -1
  36. package/core/option/optgroup.d.ts +1 -1
  37. package/core/option/option.d.ts +37 -8
  38. package/core/overlay/overlay-position-map.d.ts +7 -1
  39. package/core/selection/pseudo-checkbox/pseudo-checkbox.d.ts +2 -2
  40. package/core/styles/_variables.scss +1 -0
  41. package/core/styles/theming/_badges.scss +2 -1
  42. package/core/styles/theming/_theming.scss +1 -0
  43. package/datepicker/_datepicker-theme.scss +2 -5
  44. package/datepicker/calendar-body.component.d.ts +2 -2
  45. package/datepicker/calendar-header.component.d.ts +9 -3
  46. package/datepicker/calendar.component.d.ts +4 -5
  47. package/datepicker/datepicker-input.directive.d.ts +1 -1
  48. package/datepicker/datepicker-toggle.component.d.ts +1 -1
  49. package/datepicker/datepicker.component.d.ts +1 -1
  50. package/datepicker/month-view.component.d.ts +4 -5
  51. package/divider/divider.component.d.ts +1 -1
  52. package/dl/_dl-theme.scss +2 -5
  53. package/dl/dl.component.d.ts +1 -1
  54. package/dropdown/_dropdown-theme.scss +2 -5
  55. package/dropdown/dropdown-item.component.d.ts +1 -1
  56. package/dropdown/dropdown-trigger.directive.d.ts +1 -1
  57. package/dropdown/dropdown.component.d.ts +1 -1
  58. package/dropdown/dropdown.types.d.ts +3 -3
  59. package/ellipsis-center/ellipsis-center.directive.d.ts +1 -1
  60. package/{esm2020 → esm2022}/autocomplete/autocomplete-origin.directive.mjs +4 -4
  61. package/esm2022/autocomplete/autocomplete-trigger.directive.mjs +555 -0
  62. package/{esm2020 → esm2022}/autocomplete/autocomplete.component.mjs +26 -26
  63. package/{esm2020 → esm2022}/autocomplete/autocomplete.module.mjs +10 -10
  64. package/esm2022/button/button.component.mjs +148 -0
  65. package/{esm2020 → esm2022}/button/button.module.mjs +13 -13
  66. package/esm2022/button-toggle/button-toggle.component.mjs +381 -0
  67. package/{esm2020 → esm2022}/button-toggle/button-toggle.module.mjs +5 -5
  68. package/esm2022/card/card.component.mjs +80 -0
  69. package/{esm2020 → esm2022}/card/card.module.mjs +9 -9
  70. package/{esm2020 → esm2022}/checkbox/checkbox-module.mjs +5 -5
  71. package/{esm2020 → esm2022}/checkbox/checkbox-required-validator.mjs +4 -4
  72. package/esm2022/checkbox/checkbox.mjs +300 -0
  73. package/{esm2020 → esm2022}/code-block/actionbar.component.mjs +4 -4
  74. package/esm2022/code-block/code-block.component.mjs +157 -0
  75. package/esm2022/code-block/code-block.module.mjs +60 -0
  76. package/esm2022/core/common-behaviors/color.mjs +33 -0
  77. package/{esm2020 → esm2022}/core/common-behaviors/common-module.mjs +5 -5
  78. package/{esm2020 → esm2022}/core/common-behaviors/disabled.mjs +6 -6
  79. package/{esm2020 → esm2022}/core/common-behaviors/tabindex.mjs +6 -6
  80. package/{esm2020 → esm2022}/core/error/error-options.mjs +7 -7
  81. package/{esm2020 → esm2022}/core/formatters/date/formatter.mjs +4 -4
  82. package/{esm2020 → esm2022}/core/formatters/date/formatter.pipe.mjs +40 -40
  83. package/esm2022/core/formatters/index.mjs +86 -0
  84. package/esm2022/core/formatters/number/formatter.mjs +350 -0
  85. package/{esm2020 → esm2022}/core/forms/forms-module.mjs +7 -7
  86. package/{esm2020 → esm2022}/core/forms/forms.directive.mjs +7 -7
  87. package/{esm2020 → esm2022}/core/highlight/highlight.pipe.mjs +4 -4
  88. package/{esm2020 → esm2022}/core/highlight/index.mjs +5 -5
  89. package/{esm2020 → esm2022}/core/line/line.mjs +8 -8
  90. package/esm2022/core/locales/en-US.mjs +21 -0
  91. package/esm2022/core/locales/es-LA.mjs +27 -0
  92. package/esm2022/core/locales/fa-IR.mjs +28 -0
  93. package/{esm2020 → esm2022}/core/locales/locale-service.mjs +7 -7
  94. package/{esm2020 → esm2022}/core/locales/locale-service.module.mjs +7 -7
  95. package/esm2022/core/locales/pt-BR.mjs +27 -0
  96. package/esm2022/core/locales/ru-RU.mjs +21 -0
  97. package/esm2022/core/locales/zh-CN.mjs +26 -0
  98. package/{esm2020 → esm2022}/core/option/action.mjs +9 -9
  99. package/{esm2020 → esm2022}/core/option/optgroup.mjs +5 -5
  100. package/{esm2020 → esm2022}/core/option/option-module.mjs +5 -5
  101. package/esm2022/core/option/option.mjs +298 -0
  102. package/esm2022/core/overlay/overlay-position-map.mjs +251 -0
  103. package/{esm2020 → esm2022}/core/pop-up/pop-up-trigger.mjs +4 -4
  104. package/{esm2020 → esm2022}/core/pop-up/pop-up.mjs +4 -4
  105. package/{esm2020 → esm2022}/core/selection/pseudo-checkbox/pseudo-checkbox.mjs +4 -4
  106. package/{esm2020 → esm2022}/core/selection/pseudo-checkbox/pseudo-checkbox.module.mjs +5 -5
  107. package/esm2022/core/services/measure-scrollbar.service.mjs +48 -0
  108. package/{esm2020 → esm2022}/core/utils/data-size/data-size.pipe.mjs +8 -8
  109. package/{esm2020 → esm2022}/core/version.mjs +2 -2
  110. package/{esm2020 → esm2022}/datepicker/calendar-body.component.mjs +4 -4
  111. package/esm2022/datepicker/calendar-header.component.mjs +135 -0
  112. package/esm2022/datepicker/calendar.component.mjs +166 -0
  113. package/esm2022/datepicker/datepicker-input.directive.mjs +955 -0
  114. package/{esm2020 → esm2022}/datepicker/datepicker-intl.mjs +4 -4
  115. package/{esm2020 → esm2022}/datepicker/datepicker-module.mjs +38 -38
  116. package/esm2022/datepicker/datepicker-toggle.component.mjs +86 -0
  117. package/esm2022/datepicker/datepicker.component.mjs +393 -0
  118. package/esm2022/datepicker/month-view.component.mjs +149 -0
  119. package/{esm2020 → esm2022}/divider/divider.component.mjs +4 -4
  120. package/{esm2020 → esm2022}/divider/divider.module.mjs +5 -5
  121. package/{esm2020 → esm2022}/dl/dl.component.mjs +10 -10
  122. package/{esm2020 → esm2022}/dl/dl.module.mjs +13 -13
  123. package/{esm2020 → esm2022}/dropdown/dropdown-content.directive.mjs +4 -4
  124. package/{esm2020 → esm2022}/dropdown/dropdown-item.component.mjs +6 -6
  125. package/esm2022/dropdown/dropdown-trigger.directive.mjs +489 -0
  126. package/esm2022/dropdown/dropdown.component.mjs +292 -0
  127. package/{esm2020 → esm2022}/dropdown/dropdown.module.mjs +15 -15
  128. package/esm2022/ellipsis-center/ellipsis-center.directive.mjs +106 -0
  129. package/{esm2020 → esm2022}/file-upload/file-drop.mjs +4 -4
  130. package/{esm2020 → esm2022}/file-upload/file-upload.module.mjs +25 -25
  131. package/esm2022/file-upload/multiple-file-upload.component.mjs +165 -0
  132. package/esm2022/file-upload/single-file-upload.component.mjs +134 -0
  133. package/{esm2020 → esm2022}/form-field/cleaner.mjs +4 -4
  134. package/esm2022/form-field/form-field.mjs +267 -0
  135. package/{esm2020 → esm2022}/form-field/form-field.module.mjs +23 -23
  136. package/{esm2020 → esm2022}/form-field/hint.mjs +4 -4
  137. package/esm2022/form-field/password-hint.mjs +146 -0
  138. package/{esm2020 → esm2022}/form-field/prefix.mjs +4 -4
  139. package/{esm2020 → esm2022}/form-field/stepper.mjs +6 -6
  140. package/{esm2020 → esm2022}/form-field/suffix.mjs +4 -4
  141. package/esm2022/form-field/validate.directive.mjs +158 -0
  142. package/{esm2020 → esm2022}/icon/icon.component.mjs +7 -7
  143. package/{esm2020 → esm2022}/icon/icon.module.mjs +11 -11
  144. package/{esm2020 → esm2022}/input/input-number-validators.mjs +7 -7
  145. package/esm2022/input/input-number.mjs +168 -0
  146. package/esm2022/input/input-password.mjs +343 -0
  147. package/esm2022/input/input.mjs +297 -0
  148. package/{esm2020 → esm2022}/input/input.module.mjs +23 -23
  149. package/esm2022/link/link.component.mjs +122 -0
  150. package/{esm2020 → esm2022}/link/link.module.mjs +7 -7
  151. package/esm2022/list/list-selection.component.mjs +705 -0
  152. package/{esm2020 → esm2022}/list/list.component.mjs +8 -8
  153. package/{esm2020 → esm2022}/list/list.module.mjs +20 -20
  154. package/esm2022/loader-overlay/loader-overlay.component.mjs +103 -0
  155. package/{esm2020 → esm2022}/loader-overlay/loader-overlay.module.mjs +17 -17
  156. package/{esm2020 → esm2022}/markdown/markdown.component.mjs +13 -13
  157. package/{esm2020 → esm2022}/markdown/markdown.module.mjs +5 -5
  158. package/{esm2020 → esm2022}/markdown/markdown.service.mjs +4 -4
  159. package/{esm2020 → esm2022}/modal/css-unit.pipe.mjs +4 -4
  160. package/esm2022/modal/modal-control.service.mjs +85 -0
  161. package/esm2022/modal/modal.component.mjs +520 -0
  162. package/{esm2020 → esm2022}/modal/modal.directive.mjs +13 -13
  163. package/esm2022/modal/modal.module.mjs +75 -0
  164. package/{esm2020 → esm2022}/modal/modal.service.mjs +8 -8
  165. package/esm2022/navbar/navbar-item.component.mjs +606 -0
  166. package/esm2022/navbar/navbar.component.mjs +248 -0
  167. package/{esm2020 → esm2022}/navbar/navbar.module.mjs +37 -37
  168. package/{esm2020 → esm2022}/navbar/vertical-navbar.component.mjs +20 -17
  169. package/esm2022/popover/popover-confirm.component.mjs +108 -0
  170. package/esm2022/popover/popover.component.mjs +266 -0
  171. package/{esm2020 → esm2022}/popover/popover.module.mjs +8 -8
  172. package/{esm2020 → esm2022}/progress-bar/progress-bar.component.mjs +4 -4
  173. package/{esm2020 → esm2022}/progress-bar/progress-bar.module.mjs +7 -7
  174. package/{esm2020 → esm2022}/progress-spinner/progress-spinner.component.mjs +12 -12
  175. package/{esm2020 → esm2022}/progress-spinner/progress-spinner.module.mjs +7 -7
  176. package/esm2022/radio/radio.component.mjs +457 -0
  177. package/{esm2020 → esm2022}/radio/radio.module.mjs +5 -5
  178. package/esm2022/select/select-option.directive.mjs +65 -0
  179. package/esm2022/select/select.component.mjs +1160 -0
  180. package/{esm2020 → esm2022}/select/select.module.mjs +32 -32
  181. package/esm2022/sidebar/sidebar.component.mjs +146 -0
  182. package/{esm2020 → esm2022}/sidebar/sidebar.module.mjs +9 -9
  183. package/esm2022/sidepanel/sidepanel-container.component.mjs +110 -0
  184. package/{esm2020 → esm2022}/sidepanel/sidepanel-directives.mjs +18 -18
  185. package/{esm2020 → esm2022}/sidepanel/sidepanel.module.mjs +32 -32
  186. package/{esm2020 → esm2022}/sidepanel/sidepanel.service.mjs +10 -10
  187. package/esm2022/splitter/splitter.component.mjs +482 -0
  188. package/{esm2020 → esm2022}/splitter/splitter.module.mjs +12 -12
  189. package/{esm2020 → esm2022}/table/table.component.mjs +4 -4
  190. package/{esm2020 → esm2022}/table/table.module.mjs +9 -9
  191. package/esm2022/tabs/paginated-tab-header.mjs +488 -0
  192. package/esm2022/tabs/tab-body.component.mjs +179 -0
  193. package/{esm2020 → esm2022}/tabs/tab-content.directive.mjs +4 -4
  194. package/esm2022/tabs/tab-group.component.mjs +349 -0
  195. package/{esm2020 → esm2022}/tabs/tab-header.component.mjs +4 -4
  196. package/{esm2020 → esm2022}/tabs/tab-label-wrapper.directive.mjs +4 -4
  197. package/{esm2020 → esm2022}/tabs/tab-label.directive.mjs +4 -4
  198. package/esm2022/tabs/tab-nav-bar/tab-nav-bar.mjs +111 -0
  199. package/{esm2020 → esm2022}/tabs/tab.component.mjs +43 -34
  200. package/{esm2020 → esm2022}/tabs/tabs.module.mjs +42 -42
  201. package/esm2022/tags/tag-default-options.mjs +4 -0
  202. package/esm2022/tags/tag-input.mjs +250 -0
  203. package/esm2022/tags/tag-list.component.mjs +718 -0
  204. package/esm2022/tags/tag.component.mjs +381 -0
  205. package/esm2022/tags/tag.module.mjs +56 -0
  206. package/esm2022/textarea/textarea.component.mjs +254 -0
  207. package/{esm2020 → esm2022}/textarea/textarea.module.mjs +5 -5
  208. package/esm2022/timepicker/timepicker.directive.mjs +647 -0
  209. package/{esm2020 → esm2022}/timepicker/timepicker.module.mjs +11 -11
  210. package/{esm2020 → esm2022}/timezone/cities-by-filter.pipe.mjs +4 -4
  211. package/esm2022/timezone/timezone-option.component.mjs +48 -0
  212. package/{esm2020 → esm2022}/timezone/timezone-option.directive.mjs +4 -4
  213. package/{esm2020 → esm2022}/timezone/timezone-select.component.mjs +11 -11
  214. package/{esm2020 → esm2022}/timezone/timezone.module.mjs +29 -29
  215. package/{esm2020 → esm2022}/timezone/utc-offset.pipe.mjs +4 -4
  216. package/esm2022/title/title.directive.mjs +107 -0
  217. package/{esm2020 → esm2022}/title/title.module.mjs +5 -5
  218. package/{esm2020 → esm2022}/toast/toast-container.component.mjs +4 -4
  219. package/esm2022/toast/toast.component.mjs +92 -0
  220. package/esm2022/toast/toast.module.mjs +48 -0
  221. package/esm2022/toast/toast.service.mjs +188 -0
  222. package/esm2022/toggle/toggle.component.mjs +156 -0
  223. package/{esm2020 → esm2022}/toggle/toggle.module.mjs +5 -5
  224. package/esm2022/tooltip/tooltip.component.mjs +299 -0
  225. package/{esm2020 → esm2022}/tooltip/tooltip.module.mjs +14 -14
  226. package/esm2022/tree/data-source/flat-data-source.mjs +162 -0
  227. package/{esm2020 → esm2022}/tree/node.mjs +4 -4
  228. package/{esm2020 → esm2022}/tree/outlet.mjs +4 -4
  229. package/esm2022/tree/padding.directive.mjs +113 -0
  230. package/esm2022/tree/toggle.mjs +81 -0
  231. package/esm2022/tree/tree-base.mjs +243 -0
  232. package/esm2022/tree/tree-option.component.mjs +303 -0
  233. package/esm2022/tree/tree-selection.component.mjs +558 -0
  234. package/{esm2020 → esm2022}/tree/tree.mjs +4 -4
  235. package/{esm2020 → esm2022}/tree/tree.module.mjs +21 -21
  236. package/esm2022/tree-select/tree-select.component.mjs +936 -0
  237. package/{esm2020 → esm2022}/tree-select/tree-select.module.mjs +17 -17
  238. package/{fesm2020 → fesm2022}/ptsecurity-mosaic-autocomplete.mjs +80 -77
  239. package/fesm2022/ptsecurity-mosaic-autocomplete.mjs.map +1 -0
  240. package/{fesm2020 → fesm2022}/ptsecurity-mosaic-button-toggle.mjs +47 -47
  241. package/{fesm2020 → fesm2022}/ptsecurity-mosaic-button-toggle.mjs.map +1 -1
  242. package/{fesm2020 → fesm2022}/ptsecurity-mosaic-button.mjs +25 -25
  243. package/{fesm2020 → fesm2022}/ptsecurity-mosaic-button.mjs.map +1 -1
  244. package/{fesm2020 → fesm2022}/ptsecurity-mosaic-card.mjs +17 -17
  245. package/{fesm2020 → fesm2022}/ptsecurity-mosaic-card.mjs.map +1 -1
  246. package/{fesm2020 → fesm2022}/ptsecurity-mosaic-checkbox.mjs +39 -39
  247. package/{fesm2020 → fesm2022}/ptsecurity-mosaic-checkbox.mjs.map +1 -1
  248. package/{fesm2020 → fesm2022}/ptsecurity-mosaic-code-block.mjs +34 -34
  249. package/{fesm2020 → fesm2022}/ptsecurity-mosaic-code-block.mjs.map +1 -1
  250. package/{fesm2020 → fesm2022}/ptsecurity-mosaic-core.mjs +600 -224
  251. package/fesm2022/ptsecurity-mosaic-core.mjs.map +1 -0
  252. package/{fesm2020 → fesm2022}/ptsecurity-mosaic-datepicker.mjs +335 -351
  253. package/fesm2022/ptsecurity-mosaic-datepicker.mjs.map +1 -0
  254. package/{fesm2020 → fesm2022}/ptsecurity-mosaic-divider.mjs +7 -7
  255. package/{fesm2020 → fesm2022}/ptsecurity-mosaic-divider.mjs.map +1 -1
  256. package/{fesm2020 → fesm2022}/ptsecurity-mosaic-dl.mjs +21 -21
  257. package/{fesm2020 → fesm2022}/ptsecurity-mosaic-dl.mjs.map +1 -1
  258. package/{fesm2020 → fesm2022}/ptsecurity-mosaic-dropdown.mjs +89 -89
  259. package/{fesm2020 → fesm2022}/ptsecurity-mosaic-dropdown.mjs.map +1 -1
  260. package/{fesm2020 → fesm2022}/ptsecurity-mosaic-ellipsis-center.mjs +11 -11
  261. package/{fesm2020 → fesm2022}/ptsecurity-mosaic-ellipsis-center.mjs.map +1 -1
  262. package/{fesm2020 → fesm2022}/ptsecurity-mosaic-file-upload.mjs +55 -47
  263. package/fesm2022/ptsecurity-mosaic-file-upload.mjs.map +1 -0
  264. package/{fesm2020 → fesm2022}/ptsecurity-mosaic-form-field.mjs +92 -87
  265. package/fesm2022/ptsecurity-mosaic-form-field.mjs.map +1 -0
  266. package/{fesm2020 → fesm2022}/ptsecurity-mosaic-icon.mjs +16 -16
  267. package/fesm2022/ptsecurity-mosaic-icon.mjs.map +1 -0
  268. package/{fesm2020 → fesm2022}/ptsecurity-mosaic-input.mjs +128 -128
  269. package/{fesm2020 → fesm2022}/ptsecurity-mosaic-input.mjs.map +1 -1
  270. package/{fesm2020 → fesm2022}/ptsecurity-mosaic-link.mjs +22 -22
  271. package/{fesm2020 → fesm2022}/ptsecurity-mosaic-link.mjs.map +1 -1
  272. package/{fesm2020 → fesm2022}/ptsecurity-mosaic-list.mjs +88 -88
  273. package/{fesm2020 → fesm2022}/ptsecurity-mosaic-list.mjs.map +1 -1
  274. package/fesm2022/ptsecurity-mosaic-loader-overlay.mjs +155 -0
  275. package/{fesm2015 → fesm2022}/ptsecurity-mosaic-loader-overlay.mjs.map +1 -1
  276. package/{fesm2020 → fesm2022}/ptsecurity-mosaic-markdown.mjs +19 -19
  277. package/{fesm2020 → fesm2022}/ptsecurity-mosaic-markdown.mjs.map +1 -1
  278. package/{fesm2020 → fesm2022}/ptsecurity-mosaic-modal.mjs +157 -144
  279. package/fesm2022/ptsecurity-mosaic-modal.mjs.map +1 -0
  280. package/{fesm2020 → fesm2022}/ptsecurity-mosaic-navbar.mjs +196 -187
  281. package/fesm2022/ptsecurity-mosaic-navbar.mjs.map +1 -0
  282. package/{fesm2020 → fesm2022}/ptsecurity-mosaic-popover.mjs +37 -37
  283. package/{fesm2015 → fesm2022}/ptsecurity-mosaic-popover.mjs.map +1 -1
  284. package/{fesm2020 → fesm2022}/ptsecurity-mosaic-progress-bar.mjs +9 -9
  285. package/{fesm2020 → fesm2022}/ptsecurity-mosaic-progress-bar.mjs.map +1 -1
  286. package/{fesm2020 → fesm2022}/ptsecurity-mosaic-progress-spinner.mjs +18 -18
  287. package/{fesm2020 → fesm2022}/ptsecurity-mosaic-progress-spinner.mjs.map +1 -1
  288. package/{fesm2020 → fesm2022}/ptsecurity-mosaic-radio.mjs +80 -79
  289. package/{fesm2015 → fesm2022}/ptsecurity-mosaic-radio.mjs.map +1 -1
  290. package/{fesm2020 → fesm2022}/ptsecurity-mosaic-select.mjs +188 -174
  291. package/fesm2022/ptsecurity-mosaic-select.mjs.map +1 -0
  292. package/{fesm2020 → fesm2022}/ptsecurity-mosaic-sidebar.mjs +29 -29
  293. package/{fesm2020 → fesm2022}/ptsecurity-mosaic-sidebar.mjs.map +1 -1
  294. package/{fesm2020 → fesm2022}/ptsecurity-mosaic-sidepanel.mjs +63 -63
  295. package/{fesm2020 → fesm2022}/ptsecurity-mosaic-sidepanel.mjs.map +1 -1
  296. package/{fesm2015 → fesm2022}/ptsecurity-mosaic-splitter.mjs +55 -55
  297. package/{fesm2020 → fesm2022}/ptsecurity-mosaic-splitter.mjs.map +1 -1
  298. package/fesm2022/ptsecurity-mosaic-table.mjs +45 -0
  299. package/fesm2022/ptsecurity-mosaic-table.mjs.map +1 -0
  300. package/{fesm2020 → fesm2022}/ptsecurity-mosaic-tabs.mjs +188 -179
  301. package/fesm2022/ptsecurity-mosaic-tabs.mjs.map +1 -0
  302. package/{fesm2020 → fesm2022}/ptsecurity-mosaic-tags.mjs +150 -144
  303. package/fesm2022/ptsecurity-mosaic-tags.mjs.map +1 -0
  304. package/{fesm2020 → fesm2022}/ptsecurity-mosaic-textarea.mjs +41 -41
  305. package/{fesm2015 → fesm2022}/ptsecurity-mosaic-textarea.mjs.map +1 -1
  306. package/{fesm2020 → fesm2022}/ptsecurity-mosaic-timepicker.mjs +95 -95
  307. package/{fesm2020 → fesm2022}/ptsecurity-mosaic-timepicker.mjs.map +1 -1
  308. package/fesm2022/ptsecurity-mosaic-timezone.mjs +314 -0
  309. package/{fesm2020 → fesm2022}/ptsecurity-mosaic-timezone.mjs.map +1 -1
  310. package/{fesm2020 → fesm2022}/ptsecurity-mosaic-title.mjs +18 -18
  311. package/fesm2022/ptsecurity-mosaic-title.mjs.map +1 -0
  312. package/{fesm2020 → fesm2022}/ptsecurity-mosaic-toast.mjs +47 -41
  313. package/{fesm2020 → fesm2022}/ptsecurity-mosaic-toast.mjs.map +1 -1
  314. package/{fesm2020 → fesm2022}/ptsecurity-mosaic-toggle.mjs +35 -35
  315. package/{fesm2020 → fesm2022}/ptsecurity-mosaic-toggle.mjs.map +1 -1
  316. package/{fesm2020 → fesm2022}/ptsecurity-mosaic-tooltip.mjs +47 -47
  317. package/{fesm2020 → fesm2022}/ptsecurity-mosaic-tooltip.mjs.map +1 -1
  318. package/{fesm2020 → fesm2022}/ptsecurity-mosaic-tree-select.mjs +123 -123
  319. package/fesm2022/ptsecurity-mosaic-tree-select.mjs.map +1 -0
  320. package/{fesm2020 → fesm2022}/ptsecurity-mosaic-tree.mjs +203 -198
  321. package/fesm2022/ptsecurity-mosaic-tree.mjs.map +1 -0
  322. package/file-upload/_file-upload-theme.scss +2 -4
  323. package/file-upload/file-upload.d.ts +1 -1
  324. package/file-upload/multiple-file-upload.component.d.ts +5 -4
  325. package/file-upload/single-file-upload.component.d.ts +5 -4
  326. package/form-field/_form-field-theme.scss +7 -5
  327. package/form-field/form-field.d.ts +1 -2
  328. package/form-field/form-field.scss +1 -3
  329. package/form-field/hint.d.ts +1 -1
  330. package/form-field/password-hint.d.ts +6 -3
  331. package/icon/icon.component.d.ts +1 -1
  332. package/input/_input-theme.scss +7 -6
  333. package/input/input-number-validators.d.ts +2 -2
  334. package/input/input-number.d.ts +1 -1
  335. package/input/input-password.d.ts +2 -2
  336. package/input/input.d.ts +1 -1
  337. package/link/_link-theme.scss +7 -8
  338. package/link/link.component.d.ts +1 -1
  339. package/list/_list-theme.scss +2 -5
  340. package/list/list-selection.component.d.ts +2 -2
  341. package/loader-overlay/_loader-overlay-theme.scss +2 -5
  342. package/loader-overlay/loader-overlay.component.d.ts +1 -1
  343. package/loader-overlay/loader-overlay.scss +3 -0
  344. package/markdown/_markdown-theme.scss +3 -6
  345. package/markdown/markdown.component.d.ts +1 -1
  346. package/modal/_modal-theme.scss +3 -5
  347. package/modal/modal.component.d.ts +5 -2
  348. package/modal/modal.module.d.ts +2 -1
  349. package/modal/modal.scss +14 -2
  350. package/modal/modal.type.d.ts +3 -3
  351. package/navbar/_navbar-theme.scss +2 -6
  352. package/navbar/navbar-item.component.d.ts +5 -4
  353. package/navbar/navbar.component.d.ts +7 -4
  354. package/navbar/vertical-navbar.component.d.ts +5 -3
  355. package/package.json +156 -246
  356. package/popover/_popover-theme.scss +2 -6
  357. package/popover/popover-confirm.component.d.ts +1 -1
  358. package/popover/popover.component.d.ts +1 -1
  359. package/prebuilt-themes/dark-theme.css +1 -1
  360. package/prebuilt-themes/default-theme.css +1 -1
  361. package/progress-bar/progress-bar.component.d.ts +2 -2
  362. package/progress-spinner/progress-spinner.component.d.ts +3 -3
  363. package/radio/_radio-theme.scss +6 -6
  364. package/radio/radio.component.d.ts +2 -2
  365. package/select/_select-theme.scss +2 -5
  366. package/select/select.component.d.ts +12 -9
  367. package/select/select.scss +3 -1
  368. package/sidebar/sidebar.component.d.ts +3 -3
  369. package/sidepanel/_sidepanel-theme.scss +2 -5
  370. package/sidepanel/sidepanel-directives.d.ts +2 -2
  371. package/splitter/splitter.component.d.ts +3 -3
  372. package/table/_table-theme.scss +2 -5
  373. package/tabs/_tabs-theme.scss +2 -5
  374. package/tabs/paginated-tab-header.d.ts +3 -3
  375. package/tabs/tab-body.component.d.ts +3 -3
  376. package/tabs/tab-group.component.d.ts +2 -2
  377. package/tabs/tab-header.component.d.ts +2 -2
  378. package/tabs/tab-label-wrapper.directive.d.ts +1 -1
  379. package/tabs/tab-nav-bar/tab-nav-bar.d.ts +1 -1
  380. package/tabs/tab.component.d.ts +1 -1
  381. package/tags/_tag-theme.scss +2 -5
  382. package/tags/tag-default-options.d.ts +4 -0
  383. package/tags/tag-input.d.ts +1 -1
  384. package/tags/tag-list.component.d.ts +2 -1
  385. package/tags/tag-list.scss +6 -2
  386. package/tags/tag.component.d.ts +2 -2
  387. package/textarea/_textarea-theme.scss +2 -5
  388. package/textarea/textarea.component.d.ts +1 -1
  389. package/timepicker/timepicker.directive.d.ts +1 -1
  390. package/timezone/_timezone-option-theme.scss +2 -5
  391. package/timezone/timezone-option.component.d.ts +1 -1
  392. package/toast/_toast-theme.scss +2 -5
  393. package/toast/toast.type.d.ts +1 -1
  394. package/toggle/_toggle-theme.scss +2 -5
  395. package/toggle/toggle.component.d.ts +2 -2
  396. package/tooltip/_tooltip-theme.scss +2 -5
  397. package/tooltip/tooltip.component.d.ts +3 -3
  398. package/tree/_tree-theme.scss +2 -4
  399. package/tree/node.d.ts +1 -1
  400. package/tree/padding.directive.d.ts +1 -1
  401. package/tree/toggle.d.ts +2 -2
  402. package/tree/tree-base.d.ts +1 -1
  403. package/tree/tree-option.component.d.ts +1 -1
  404. package/tree/tree-option.scss +4 -2
  405. package/tree/tree-selection.component.d.ts +1 -1
  406. package/tree-select/_tree-select-theme.scss +2 -5
  407. package/tree-select/tree-select.component.d.ts +1 -1
  408. package/esm2020/autocomplete/autocomplete-trigger.directive.mjs +0 -552
  409. package/esm2020/button/button.component.mjs +0 -148
  410. package/esm2020/button-toggle/button-toggle.component.mjs +0 -381
  411. package/esm2020/card/card.component.mjs +0 -80
  412. package/esm2020/checkbox/checkbox.mjs +0 -300
  413. package/esm2020/code-block/code-block.component.mjs +0 -157
  414. package/esm2020/code-block/code-block.module.mjs +0 -60
  415. package/esm2020/core/common-behaviors/color.mjs +0 -33
  416. package/esm2020/core/formatters/index.mjs +0 -78
  417. package/esm2020/core/formatters/number/formatter.mjs +0 -129
  418. package/esm2020/core/locales/en-US.mjs +0 -10
  419. package/esm2020/core/locales/es-LA.mjs +0 -6
  420. package/esm2020/core/locales/fa-IR.mjs +0 -6
  421. package/esm2020/core/locales/pt-BR.mjs +0 -6
  422. package/esm2020/core/locales/ru-RU.mjs +0 -10
  423. package/esm2020/core/locales/zh-CN.mjs +0 -6
  424. package/esm2020/core/option/option.mjs +0 -262
  425. package/esm2020/core/overlay/overlay-position-map.mjs +0 -245
  426. package/esm2020/core/services/measure-scrollbar.service.mjs +0 -48
  427. package/esm2020/datepicker/calendar-header.component.mjs +0 -134
  428. package/esm2020/datepicker/calendar.component.mjs +0 -175
  429. package/esm2020/datepicker/datepicker-input.directive.mjs +0 -954
  430. package/esm2020/datepicker/datepicker-toggle.component.mjs +0 -86
  431. package/esm2020/datepicker/datepicker.component.mjs +0 -393
  432. package/esm2020/datepicker/month-view.component.mjs +0 -158
  433. package/esm2020/dropdown/dropdown-trigger.directive.mjs +0 -489
  434. package/esm2020/dropdown/dropdown.component.mjs +0 -292
  435. package/esm2020/ellipsis-center/ellipsis-center.directive.mjs +0 -106
  436. package/esm2020/file-upload/multiple-file-upload.component.mjs +0 -161
  437. package/esm2020/file-upload/single-file-upload.component.mjs +0 -130
  438. package/esm2020/form-field/form-field.mjs +0 -270
  439. package/esm2020/form-field/password-hint.mjs +0 -138
  440. package/esm2020/form-field/validate.directive.mjs +0 -158
  441. package/esm2020/input/input-number.mjs +0 -168
  442. package/esm2020/input/input-password.mjs +0 -343
  443. package/esm2020/input/input.mjs +0 -297
  444. package/esm2020/link/link.component.mjs +0 -122
  445. package/esm2020/list/list-selection.component.mjs +0 -705
  446. package/esm2020/loader-overlay/loader-overlay.component.mjs +0 -103
  447. package/esm2020/modal/modal-control.service.mjs +0 -85
  448. package/esm2020/modal/modal.component.mjs +0 -510
  449. package/esm2020/modal/modal.module.mjs +0 -71
  450. package/esm2020/navbar/navbar-item.component.mjs +0 -605
  451. package/esm2020/navbar/navbar.component.mjs +0 -239
  452. package/esm2020/popover/popover-confirm.component.mjs +0 -108
  453. package/esm2020/popover/popover.component.mjs +0 -266
  454. package/esm2020/radio/radio.component.mjs +0 -456
  455. package/esm2020/select/select-option.directive.mjs +0 -65
  456. package/esm2020/select/select.component.mjs +0 -1146
  457. package/esm2020/sidebar/sidebar.component.mjs +0 -146
  458. package/esm2020/sidepanel/sidepanel-container.component.mjs +0 -110
  459. package/esm2020/splitter/splitter.component.mjs +0 -482
  460. package/esm2020/tabs/paginated-tab-header.mjs +0 -488
  461. package/esm2020/tabs/tab-body.component.mjs +0 -179
  462. package/esm2020/tabs/tab-group.component.mjs +0 -349
  463. package/esm2020/tabs/tab-nav-bar/tab-nav-bar.mjs +0 -111
  464. package/esm2020/tags/tag-default-options.mjs +0 -4
  465. package/esm2020/tags/tag-input.mjs +0 -248
  466. package/esm2020/tags/tag-list.component.mjs +0 -714
  467. package/esm2020/tags/tag.component.mjs +0 -381
  468. package/esm2020/tags/tag.module.mjs +0 -56
  469. package/esm2020/textarea/textarea.component.mjs +0 -254
  470. package/esm2020/timepicker/timepicker.directive.mjs +0 -647
  471. package/esm2020/timezone/timezone-option.component.mjs +0 -48
  472. package/esm2020/title/title.directive.mjs +0 -107
  473. package/esm2020/toast/toast.component.mjs +0 -92
  474. package/esm2020/toast/toast.module.mjs +0 -42
  475. package/esm2020/toast/toast.service.mjs +0 -188
  476. package/esm2020/toggle/toggle.component.mjs +0 -156
  477. package/esm2020/tooltip/tooltip.component.mjs +0 -299
  478. package/esm2020/tree/data-source/flat-data-source.mjs +0 -162
  479. package/esm2020/tree/padding.directive.mjs +0 -113
  480. package/esm2020/tree/toggle.mjs +0 -81
  481. package/esm2020/tree/tree-base.mjs +0 -243
  482. package/esm2020/tree/tree-option.component.mjs +0 -299
  483. package/esm2020/tree/tree-selection.component.mjs +0 -557
  484. package/esm2020/tree-select/tree-select.component.mjs +0 -936
  485. package/fesm2015/ptsecurity-mosaic-autocomplete.mjs +0 -753
  486. package/fesm2015/ptsecurity-mosaic-autocomplete.mjs.map +0 -1
  487. package/fesm2015/ptsecurity-mosaic-button-toggle.mjs +0 -405
  488. package/fesm2015/ptsecurity-mosaic-button-toggle.mjs.map +0 -1
  489. package/fesm2015/ptsecurity-mosaic-button.mjs +0 -193
  490. package/fesm2015/ptsecurity-mosaic-button.mjs.map +0 -1
  491. package/fesm2015/ptsecurity-mosaic-card.mjs +0 -111
  492. package/fesm2015/ptsecurity-mosaic-card.mjs.map +0 -1
  493. package/fesm2015/ptsecurity-mosaic-checkbox.mjs +0 -351
  494. package/fesm2015/ptsecurity-mosaic-checkbox.mjs.map +0 -1
  495. package/fesm2015/ptsecurity-mosaic-code-block.mjs +0 -280
  496. package/fesm2015/ptsecurity-mosaic-code-block.mjs.map +0 -1
  497. package/fesm2015/ptsecurity-mosaic-core.mjs +0 -2314
  498. package/fesm2015/ptsecurity-mosaic-core.mjs.map +0 -1
  499. package/fesm2015/ptsecurity-mosaic-datepicker.mjs +0 -2112
  500. package/fesm2015/ptsecurity-mosaic-datepicker.mjs.map +0 -1
  501. package/fesm2015/ptsecurity-mosaic-divider.mjs +0 -61
  502. package/fesm2015/ptsecurity-mosaic-divider.mjs.map +0 -1
  503. package/fesm2015/ptsecurity-mosaic-dl.mjs +0 -126
  504. package/fesm2015/ptsecurity-mosaic-dl.mjs.map +0 -1
  505. package/fesm2015/ptsecurity-mosaic-dropdown.mjs +0 -1115
  506. package/fesm2015/ptsecurity-mosaic-dropdown.mjs.map +0 -1
  507. package/fesm2015/ptsecurity-mosaic-ellipsis-center.mjs +0 -113
  508. package/fesm2015/ptsecurity-mosaic-ellipsis-center.mjs.map +0 -1
  509. package/fesm2015/ptsecurity-mosaic-file-upload.mjs +0 -392
  510. package/fesm2015/ptsecurity-mosaic-file-upload.mjs.map +0 -1
  511. package/fesm2015/ptsecurity-mosaic-form-field.mjs +0 -768
  512. package/fesm2015/ptsecurity-mosaic-form-field.mjs.map +0 -1
  513. package/fesm2015/ptsecurity-mosaic-icon.mjs +0 -86
  514. package/fesm2015/ptsecurity-mosaic-icon.mjs.map +0 -1
  515. package/fesm2015/ptsecurity-mosaic-input.mjs +0 -951
  516. package/fesm2015/ptsecurity-mosaic-input.mjs.map +0 -1
  517. package/fesm2015/ptsecurity-mosaic-link.mjs +0 -150
  518. package/fesm2015/ptsecurity-mosaic-link.mjs.map +0 -1
  519. package/fesm2015/ptsecurity-mosaic-list.mjs +0 -807
  520. package/fesm2015/ptsecurity-mosaic-list.mjs.map +0 -1
  521. package/fesm2015/ptsecurity-mosaic-loader-overlay.mjs +0 -157
  522. package/fesm2015/ptsecurity-mosaic-markdown.mjs +0 -128
  523. package/fesm2015/ptsecurity-mosaic-markdown.mjs.map +0 -1
  524. package/fesm2015/ptsecurity-mosaic-modal.mjs +0 -875
  525. package/fesm2015/ptsecurity-mosaic-modal.mjs.map +0 -1
  526. package/fesm2015/ptsecurity-mosaic-navbar.mjs +0 -1054
  527. package/fesm2015/ptsecurity-mosaic-navbar.mjs.map +0 -1
  528. package/fesm2015/ptsecurity-mosaic-popover.mjs +0 -411
  529. package/fesm2015/ptsecurity-mosaic-progress-bar.mjs +0 -74
  530. package/fesm2015/ptsecurity-mosaic-progress-bar.mjs.map +0 -1
  531. package/fesm2015/ptsecurity-mosaic-progress-spinner.mjs +0 -93
  532. package/fesm2015/ptsecurity-mosaic-progress-spinner.mjs.map +0 -1
  533. package/fesm2015/ptsecurity-mosaic-radio.mjs +0 -480
  534. package/fesm2015/ptsecurity-mosaic-select.mjs +0 -1286
  535. package/fesm2015/ptsecurity-mosaic-select.mjs.map +0 -1
  536. package/fesm2015/ptsecurity-mosaic-sidebar.mjs +0 -202
  537. package/fesm2015/ptsecurity-mosaic-sidebar.mjs.map +0 -1
  538. package/fesm2015/ptsecurity-mosaic-sidepanel.mjs +0 -622
  539. package/fesm2015/ptsecurity-mosaic-sidepanel.mjs.map +0 -1
  540. package/fesm2015/ptsecurity-mosaic-splitter.mjs.map +0 -1
  541. package/fesm2015/ptsecurity-mosaic-table.mjs +0 -45
  542. package/fesm2015/ptsecurity-mosaic-table.mjs.map +0 -1
  543. package/fesm2015/ptsecurity-mosaic-tabs.mjs +0 -1523
  544. package/fesm2015/ptsecurity-mosaic-tabs.mjs.map +0 -1
  545. package/fesm2015/ptsecurity-mosaic-tags.mjs +0 -1391
  546. package/fesm2015/ptsecurity-mosaic-tags.mjs.map +0 -1
  547. package/fesm2015/ptsecurity-mosaic-textarea.mjs +0 -280
  548. package/fesm2015/ptsecurity-mosaic-timepicker.mjs +0 -708
  549. package/fesm2015/ptsecurity-mosaic-timepicker.mjs.map +0 -1
  550. package/fesm2015/ptsecurity-mosaic-timezone.mjs +0 -316
  551. package/fesm2015/ptsecurity-mosaic-timezone.mjs.map +0 -1
  552. package/fesm2015/ptsecurity-mosaic-title.mjs +0 -128
  553. package/fesm2015/ptsecurity-mosaic-title.mjs.map +0 -1
  554. package/fesm2015/ptsecurity-mosaic-toast.mjs +0 -379
  555. package/fesm2015/ptsecurity-mosaic-toast.mjs.map +0 -1
  556. package/fesm2015/ptsecurity-mosaic-toggle.mjs +0 -178
  557. package/fesm2015/ptsecurity-mosaic-toggle.mjs.map +0 -1
  558. package/fesm2015/ptsecurity-mosaic-tooltip.mjs +0 -369
  559. package/fesm2015/ptsecurity-mosaic-tooltip.mjs.map +0 -1
  560. package/fesm2015/ptsecurity-mosaic-tree-select.mjs +0 -983
  561. package/fesm2015/ptsecurity-mosaic-tree-select.mjs.map +0 -1
  562. package/fesm2015/ptsecurity-mosaic-tree.mjs +0 -1815
  563. package/fesm2015/ptsecurity-mosaic-tree.mjs.map +0 -1
  564. package/fesm2020/ptsecurity-mosaic-autocomplete.mjs.map +0 -1
  565. package/fesm2020/ptsecurity-mosaic-core.mjs.map +0 -1
  566. package/fesm2020/ptsecurity-mosaic-datepicker.mjs.map +0 -1
  567. package/fesm2020/ptsecurity-mosaic-file-upload.mjs.map +0 -1
  568. package/fesm2020/ptsecurity-mosaic-form-field.mjs.map +0 -1
  569. package/fesm2020/ptsecurity-mosaic-icon.mjs.map +0 -1
  570. package/fesm2020/ptsecurity-mosaic-loader-overlay.mjs +0 -155
  571. package/fesm2020/ptsecurity-mosaic-loader-overlay.mjs.map +0 -1
  572. package/fesm2020/ptsecurity-mosaic-modal.mjs.map +0 -1
  573. package/fesm2020/ptsecurity-mosaic-navbar.mjs.map +0 -1
  574. package/fesm2020/ptsecurity-mosaic-popover.mjs.map +0 -1
  575. package/fesm2020/ptsecurity-mosaic-radio.mjs.map +0 -1
  576. package/fesm2020/ptsecurity-mosaic-select.mjs.map +0 -1
  577. package/fesm2020/ptsecurity-mosaic-splitter.mjs +0 -524
  578. package/fesm2020/ptsecurity-mosaic-table.mjs +0 -45
  579. package/fesm2020/ptsecurity-mosaic-table.mjs.map +0 -1
  580. package/fesm2020/ptsecurity-mosaic-tabs.mjs.map +0 -1
  581. package/fesm2020/ptsecurity-mosaic-tags.mjs.map +0 -1
  582. package/fesm2020/ptsecurity-mosaic-textarea.mjs.map +0 -1
  583. package/fesm2020/ptsecurity-mosaic-timezone.mjs +0 -314
  584. package/fesm2020/ptsecurity-mosaic-title.mjs.map +0 -1
  585. package/fesm2020/ptsecurity-mosaic-tree-select.mjs.map +0 -1
  586. package/fesm2020/ptsecurity-mosaic-tree.mjs.map +0 -1
  587. package/fesm2020/ptsecurity-mosaic.mjs +0 -4
  588. package/fesm2020/ptsecurity-mosaic.mjs.map +0 -1
  589. /package/{esm2020 → esm2022}/autocomplete/index.mjs +0 -0
  590. /package/{esm2020 → esm2022}/autocomplete/ptsecurity-mosaic-autocomplete.mjs +0 -0
  591. /package/{esm2020 → esm2022}/autocomplete/public-api.mjs +0 -0
  592. /package/{esm2020 → esm2022}/button/index.mjs +0 -0
  593. /package/{esm2020 → esm2022}/button/ptsecurity-mosaic-button.mjs +0 -0
  594. /package/{esm2020 → esm2022}/button/public-api.mjs +0 -0
  595. /package/{esm2020 → esm2022}/button-toggle/index.mjs +0 -0
  596. /package/{esm2020 → esm2022}/button-toggle/ptsecurity-mosaic-button-toggle.mjs +0 -0
  597. /package/{esm2020 → esm2022}/button-toggle/public-api.mjs +0 -0
  598. /package/{esm2020 → esm2022}/card/index.mjs +0 -0
  599. /package/{esm2020 → esm2022}/card/ptsecurity-mosaic-card.mjs +0 -0
  600. /package/{esm2020 → esm2022}/card/public-api.mjs +0 -0
  601. /package/{esm2020 → esm2022}/checkbox/checkbox-config.mjs +0 -0
  602. /package/{esm2020 → esm2022}/checkbox/index.mjs +0 -0
  603. /package/{esm2020 → esm2022}/checkbox/ptsecurity-mosaic-checkbox.mjs +0 -0
  604. /package/{esm2020 → esm2022}/checkbox/public-api.mjs +0 -0
  605. /package/{esm2020 → esm2022}/code-block/code-block.types.mjs +0 -0
  606. /package/{esm2020 → esm2022}/code-block/index.mjs +0 -0
  607. /package/{esm2020 → esm2022}/code-block/ptsecurity-mosaic-code-block.mjs +0 -0
  608. /package/{esm2020 → esm2022}/code-block/public-api.mjs +0 -0
  609. /package/{esm2020 → esm2022}/core/animation/animation.mjs +0 -0
  610. /package/{esm2020 → esm2022}/core/animation/fade-animations.mjs +0 -0
  611. /package/{esm2020 → esm2022}/core/animation/index.mjs +0 -0
  612. /package/{esm2020 → esm2022}/core/animation/select-animations.mjs +0 -0
  613. /package/{esm2020 → esm2022}/core/common-behaviors/constructor.mjs +0 -0
  614. /package/{esm2020 → esm2022}/core/common-behaviors/error-state.mjs +0 -0
  615. /package/{esm2020 → esm2022}/core/common-behaviors/index.mjs +0 -0
  616. /package/{esm2020 → esm2022}/core/datetime/date-adapter.mjs +0 -0
  617. /package/{esm2020 → esm2022}/core/datetime/date-formats.mjs +0 -0
  618. /package/{esm2020 → esm2022}/core/datetime/index.mjs +0 -0
  619. /package/{esm2020 → esm2022}/core/forms/index.mjs +0 -0
  620. /package/{esm2020 → esm2022}/core/index.mjs +0 -0
  621. /package/{esm2020 → esm2022}/core/label/label-options.mjs +0 -0
  622. /package/{esm2020 → esm2022}/core/locales/index.mjs +0 -0
  623. /package/{esm2020 → esm2022}/core/option/index.mjs +0 -0
  624. /package/{esm2020 → esm2022}/core/pop-up/constants.mjs +0 -0
  625. /package/{esm2020 → esm2022}/core/pop-up/index.mjs +0 -0
  626. /package/{esm2020 → esm2022}/core/ptsecurity-mosaic-core.mjs +0 -0
  627. /package/{esm2020 → esm2022}/core/public-api.mjs +0 -0
  628. /package/{esm2020 → esm2022}/core/select/constants.mjs +0 -0
  629. /package/{esm2020 → esm2022}/core/select/errors.mjs +0 -0
  630. /package/{esm2020 → esm2022}/core/select/events.mjs +0 -0
  631. /package/{esm2020 → esm2022}/core/select/index.mjs +0 -0
  632. /package/{esm2020 → esm2022}/core/selection/constants.mjs +0 -0
  633. /package/{esm2020 → esm2022}/core/selection/index.mjs +0 -0
  634. /package/{esm2020 → esm2022}/core/title/index.mjs +0 -0
  635. /package/{esm2020 → esm2022}/core/title/title-text-ref.mjs +0 -0
  636. /package/{esm2020 → esm2022}/core/utils/data-size/config.mjs +0 -0
  637. /package/{esm2020 → esm2022}/core/utils/data-size/index.mjs +0 -0
  638. /package/{esm2020 → esm2022}/core/utils/data-size/size.mjs +0 -0
  639. /package/{esm2020 → esm2022}/core/utils/index.mjs +0 -0
  640. /package/{esm2020 → esm2022}/core/utils/public-api.mjs +0 -0
  641. /package/{esm2020 → esm2022}/core/utils/utils.mjs +0 -0
  642. /package/{esm2020 → esm2022}/core/validation/index.mjs +0 -0
  643. /package/{esm2020 → esm2022}/core/validation/validation.mjs +0 -0
  644. /package/{esm2020 → esm2022}/datepicker/datepicker-animations.mjs +0 -0
  645. /package/{esm2020 → esm2022}/datepicker/datepicker-errors.mjs +0 -0
  646. /package/{esm2020 → esm2022}/datepicker/index.mjs +0 -0
  647. /package/{esm2020 → esm2022}/datepicker/ptsecurity-mosaic-datepicker.mjs +0 -0
  648. /package/{esm2020 → esm2022}/datepicker/public-api.mjs +0 -0
  649. /package/{esm2020 → esm2022}/divider/index.mjs +0 -0
  650. /package/{esm2020 → esm2022}/divider/ptsecurity-mosaic-divider.mjs +0 -0
  651. /package/{esm2020 → esm2022}/divider/public-api.mjs +0 -0
  652. /package/{esm2020 → esm2022}/dl/index.mjs +0 -0
  653. /package/{esm2020 → esm2022}/dl/ptsecurity-mosaic-dl.mjs +0 -0
  654. /package/{esm2020 → esm2022}/dl/public-api.mjs +0 -0
  655. /package/{esm2020 → esm2022}/dropdown/dropdown-animations.mjs +0 -0
  656. /package/{esm2020 → esm2022}/dropdown/dropdown-errors.mjs +0 -0
  657. /package/{esm2020 → esm2022}/dropdown/dropdown.types.mjs +0 -0
  658. /package/{esm2020 → esm2022}/dropdown/index.mjs +0 -0
  659. /package/{esm2020 → esm2022}/dropdown/ptsecurity-mosaic-dropdown.mjs +0 -0
  660. /package/{esm2020 → esm2022}/dropdown/public-api.mjs +0 -0
  661. /package/{esm2020 → esm2022}/ellipsis-center/index.mjs +0 -0
  662. /package/{esm2020 → esm2022}/ellipsis-center/ptsecurity-mosaic-ellipsis-center.mjs +0 -0
  663. /package/{esm2020 → esm2022}/ellipsis-center/public-api.mjs +0 -0
  664. /package/{esm2020 → esm2022}/file-upload/file-upload.mjs +0 -0
  665. /package/{esm2020 → esm2022}/file-upload/index.mjs +0 -0
  666. /package/{esm2020 → esm2022}/file-upload/ptsecurity-mosaic-file-upload.mjs +0 -0
  667. /package/{esm2020 → esm2022}/file-upload/public-api.mjs +0 -0
  668. /package/{esm2020 → esm2022}/form-field/form-field-control.mjs +0 -0
  669. /package/{esm2020 → esm2022}/form-field/form-field-errors.mjs +0 -0
  670. /package/{esm2020 → esm2022}/form-field/index.mjs +0 -0
  671. /package/{esm2020 → esm2022}/form-field/ptsecurity-mosaic-form-field.mjs +0 -0
  672. /package/{esm2020 → esm2022}/form-field/public-api.mjs +0 -0
  673. /package/{esm2020 → esm2022}/icon/index.mjs +0 -0
  674. /package/{esm2020 → esm2022}/icon/ptsecurity-mosaic-icon.mjs +0 -0
  675. /package/{esm2020 → esm2022}/icon/public-api.mjs +0 -0
  676. /package/{esm2020 → esm2022}/index.mjs +0 -0
  677. /package/{esm2020 → esm2022}/input/index.mjs +0 -0
  678. /package/{esm2020 → esm2022}/input/input-errors.mjs +0 -0
  679. /package/{esm2020 → esm2022}/input/input-value-accessor.mjs +0 -0
  680. /package/{esm2020 → esm2022}/input/ptsecurity-mosaic-input.mjs +0 -0
  681. /package/{esm2020 → esm2022}/input/public-api.mjs +0 -0
  682. /package/{esm2020 → esm2022}/link/index.mjs +0 -0
  683. /package/{esm2020 → esm2022}/link/ptsecurity-mosaic-link.mjs +0 -0
  684. /package/{esm2020 → esm2022}/link/public-api.mjs +0 -0
  685. /package/{esm2020 → esm2022}/list/index.mjs +0 -0
  686. /package/{esm2020 → esm2022}/list/ptsecurity-mosaic-list.mjs +0 -0
  687. /package/{esm2020 → esm2022}/list/public-api.mjs +0 -0
  688. /package/{esm2020 → esm2022}/loader-overlay/index.mjs +0 -0
  689. /package/{esm2020 → esm2022}/loader-overlay/ptsecurity-mosaic-loader-overlay.mjs +0 -0
  690. /package/{esm2020 → esm2022}/loader-overlay/public-api.mjs +0 -0
  691. /package/{esm2020 → esm2022}/markdown/index.mjs +0 -0
  692. /package/{esm2020 → esm2022}/markdown/markdown.values.mjs +0 -0
  693. /package/{esm2020 → esm2022}/markdown/ptsecurity-mosaic-markdown.mjs +0 -0
  694. /package/{esm2020 → esm2022}/markdown/public-api.mjs +0 -0
  695. /package/{esm2020 → esm2022}/modal/index.mjs +0 -0
  696. /package/{esm2020 → esm2022}/modal/modal-ref.class.mjs +0 -0
  697. /package/{esm2020 → esm2022}/modal/modal-util.mjs +0 -0
  698. /package/{esm2020 → esm2022}/modal/modal.type.mjs +0 -0
  699. /package/{esm2020 → esm2022}/modal/ptsecurity-mosaic-modal.mjs +0 -0
  700. /package/{esm2020 → esm2022}/modal/public-api.mjs +0 -0
  701. /package/{esm2020 → esm2022}/navbar/index.mjs +0 -0
  702. /package/{esm2020 → esm2022}/navbar/ptsecurity-mosaic-navbar.mjs +0 -0
  703. /package/{esm2020 → esm2022}/navbar/public-api.mjs +0 -0
  704. /package/{esm2020 → esm2022}/navbar/vertical-navbar.animation.mjs +0 -0
  705. /package/{esm2020 → esm2022}/popover/index.mjs +0 -0
  706. /package/{esm2020 → esm2022}/popover/popover-animations.mjs +0 -0
  707. /package/{esm2020 → esm2022}/popover/ptsecurity-mosaic-popover.mjs +0 -0
  708. /package/{esm2020 → esm2022}/popover/public-api.mjs +0 -0
  709. /package/{esm2020 → esm2022}/progress-bar/index.mjs +0 -0
  710. /package/{esm2020 → esm2022}/progress-bar/ptsecurity-mosaic-progress-bar.mjs +0 -0
  711. /package/{esm2020 → esm2022}/progress-bar/public-api.mjs +0 -0
  712. /package/{esm2020 → esm2022}/progress-spinner/index.mjs +0 -0
  713. /package/{esm2020 → esm2022}/progress-spinner/ptsecurity-mosaic-progress-spinner.mjs +0 -0
  714. /package/{esm2020 → esm2022}/progress-spinner/public-api.mjs +0 -0
  715. /package/{esm2020 → esm2022}/ptsecurity-mosaic.mjs +0 -0
  716. /package/{esm2020 → esm2022}/public-api.mjs +0 -0
  717. /package/{esm2020 → esm2022}/radio/index.mjs +0 -0
  718. /package/{esm2020 → esm2022}/radio/ptsecurity-mosaic-radio.mjs +0 -0
  719. /package/{esm2020 → esm2022}/radio/public-api.mjs +0 -0
  720. /package/{esm2020 → esm2022}/select/index.mjs +0 -0
  721. /package/{esm2020 → esm2022}/select/ptsecurity-mosaic-select.mjs +0 -0
  722. /package/{esm2020 → esm2022}/select/public-api.mjs +0 -0
  723. /package/{esm2020 → esm2022}/sidebar/index.mjs +0 -0
  724. /package/{esm2020 → esm2022}/sidebar/ptsecurity-mosaic-sidebar.mjs +0 -0
  725. /package/{esm2020 → esm2022}/sidebar/public-api.mjs +0 -0
  726. /package/{esm2020 → esm2022}/sidebar/sidebar-animations.mjs +0 -0
  727. /package/{esm2020 → esm2022}/sidepanel/index.mjs +0 -0
  728. /package/{esm2020 → esm2022}/sidepanel/ptsecurity-mosaic-sidepanel.mjs +0 -0
  729. /package/{esm2020 → esm2022}/sidepanel/public-api.mjs +0 -0
  730. /package/{esm2020 → esm2022}/sidepanel/sidepanel-animations.mjs +0 -0
  731. /package/{esm2020 → esm2022}/sidepanel/sidepanel-config.mjs +0 -0
  732. /package/{esm2020 → esm2022}/sidepanel/sidepanel-ref.mjs +0 -0
  733. /package/{esm2020 → esm2022}/splitter/index.mjs +0 -0
  734. /package/{esm2020 → esm2022}/splitter/ptsecurity-mosaic-splitter.mjs +0 -0
  735. /package/{esm2020 → esm2022}/splitter/public-api.mjs +0 -0
  736. /package/{esm2020 → esm2022}/table/index.mjs +0 -0
  737. /package/{esm2020 → esm2022}/table/ptsecurity-mosaic-table.mjs +0 -0
  738. /package/{esm2020 → esm2022}/table/public-api.mjs +0 -0
  739. /package/{esm2020 → esm2022}/tabs/index.mjs +0 -0
  740. /package/{esm2020 → esm2022}/tabs/ptsecurity-mosaic-tabs.mjs +0 -0
  741. /package/{esm2020 → esm2022}/tabs/public-api.mjs +0 -0
  742. /package/{esm2020 → esm2022}/tabs/tab-nav-bar/index.mjs +0 -0
  743. /package/{esm2020 → esm2022}/tabs/tabs-animations.mjs +0 -0
  744. /package/{esm2020 → esm2022}/tags/index.mjs +0 -0
  745. /package/{esm2020 → esm2022}/tags/ptsecurity-mosaic-tags.mjs +0 -0
  746. /package/{esm2020 → esm2022}/tags/public-api.mjs +0 -0
  747. /package/{esm2020 → esm2022}/tags/tag-text-control.mjs +0 -0
  748. /package/{esm2020 → esm2022}/textarea/index.mjs +0 -0
  749. /package/{esm2020 → esm2022}/textarea/ptsecurity-mosaic-textarea.mjs +0 -0
  750. /package/{esm2020 → esm2022}/textarea/public-api.mjs +0 -0
  751. /package/{esm2020 → esm2022}/timepicker/index.mjs +0 -0
  752. /package/{esm2020 → esm2022}/timepicker/ptsecurity-mosaic-timepicker.mjs +0 -0
  753. /package/{esm2020 → esm2022}/timepicker/public-api.mjs +0 -0
  754. /package/{esm2020 → esm2022}/timepicker/timepicker.constants.mjs +0 -0
  755. /package/{esm2020 → esm2022}/timezone/index.mjs +0 -0
  756. /package/{esm2020 → esm2022}/timezone/ptsecurity-mosaic-timezone.mjs +0 -0
  757. /package/{esm2020 → esm2022}/timezone/public-api.mjs +0 -0
  758. /package/{esm2020 → esm2022}/timezone/timezone.models.mjs +0 -0
  759. /package/{esm2020 → esm2022}/timezone/timezone.utils.mjs +0 -0
  760. /package/{esm2020 → esm2022}/title/index.mjs +0 -0
  761. /package/{esm2020 → esm2022}/title/ptsecurity-mosaic-title.mjs +0 -0
  762. /package/{esm2020 → esm2022}/title/public-api.mjs +0 -0
  763. /package/{esm2020 → esm2022}/toast/index.mjs +0 -0
  764. /package/{esm2020 → esm2022}/toast/ptsecurity-mosaic-toast.mjs +0 -0
  765. /package/{esm2020 → esm2022}/toast/public-api.mjs +0 -0
  766. /package/{esm2020 → esm2022}/toast/toast-animations.mjs +0 -0
  767. /package/{esm2020 → esm2022}/toast/toast.type.mjs +0 -0
  768. /package/{esm2020 → esm2022}/toggle/index.mjs +0 -0
  769. /package/{esm2020 → esm2022}/toggle/ptsecurity-mosaic-toggle.mjs +0 -0
  770. /package/{esm2020 → esm2022}/toggle/public-api.mjs +0 -0
  771. /package/{esm2020 → esm2022}/tooltip/index.mjs +0 -0
  772. /package/{esm2020 → esm2022}/tooltip/ptsecurity-mosaic-tooltip.mjs +0 -0
  773. /package/{esm2020 → esm2022}/tooltip/public-api.mjs +0 -0
  774. /package/{esm2020 → esm2022}/tooltip/tooltip.animations.mjs +0 -0
  775. /package/{esm2020 → esm2022}/tree/control/base-tree-control.mjs +0 -0
  776. /package/{esm2020 → esm2022}/tree/control/flat-tree-control.mjs +0 -0
  777. /package/{esm2020 → esm2022}/tree/control/nested-tree-control.mjs +0 -0
  778. /package/{esm2020 → esm2022}/tree/control/tree-control.mjs +0 -0
  779. /package/{esm2020 → esm2022}/tree/data-source/nested-data-source.mjs +0 -0
  780. /package/{esm2020 → esm2022}/tree/index.mjs +0 -0
  781. /package/{esm2020 → esm2022}/tree/ptsecurity-mosaic-tree.mjs +0 -0
  782. /package/{esm2020 → esm2022}/tree/public-api.mjs +0 -0
  783. /package/{esm2020 → esm2022}/tree/tree-errors.mjs +0 -0
  784. /package/{esm2020 → esm2022}/tree-select/index.mjs +0 -0
  785. /package/{esm2020 → esm2022}/tree-select/ptsecurity-mosaic-tree-select.mjs +0 -0
  786. /package/{esm2020 → esm2022}/tree-select/public-api.mjs +0 -0
  787. /package/{fesm2015 → fesm2022}/ptsecurity-mosaic.mjs +0 -0
  788. /package/{fesm2015 → fesm2022}/ptsecurity-mosaic.mjs.map +0 -0
@@ -1,954 +0,0 @@
1
- // tslint:disable:no-empty, deprecation
2
- import { coerceBooleanProperty } from '@angular/cdk/coercion';
3
- import { Directive, ElementRef, EventEmitter, forwardRef, Inject, Input, Optional, Output, Renderer2 } from '@angular/core';
4
- import { NG_VALIDATORS, NG_VALUE_ACCESSOR, Validators } from '@angular/forms';
5
- import { UP_ARROW, RIGHT_ARROW, DOWN_ARROW, LEFT_ARROW, END, PAGE_DOWN, HOME, PAGE_UP, SPACE, TAB, ESCAPE, DELETE, BACKSPACE, hasModifierKey, isHorizontalMovement, isLetterKey, isVerticalMovement } from '@ptsecurity/cdk/keycodes';
6
- import { DateAdapter, MC_DATE_FORMATS, MC_LOCALE_SERVICE, McLocaleService, validationTooltipHideDelay, validationTooltipShowDelay } from '@ptsecurity/mosaic/core';
7
- import { McFormFieldControl } from '@ptsecurity/mosaic/form-field';
8
- import { McWarningTooltipTrigger } from '@ptsecurity/mosaic/tooltip';
9
- import { Subject, Subscription } from 'rxjs';
10
- import { createMissingDateImplError } from './datepicker-errors';
11
- import { McDatepicker } from './datepicker.component';
12
- import * as i0 from "@angular/core";
13
- import * as i1 from "@ptsecurity/mosaic/core";
14
- // tslint:disable:naming-convention
15
- var DateParts;
16
- (function (DateParts) {
17
- DateParts["year"] = "y";
18
- DateParts["month"] = "m";
19
- DateParts["day"] = "d";
20
- })(DateParts || (DateParts = {}));
21
- export const MAX_YEAR = 9999;
22
- const YEAR_LENGTH = 4;
23
- class DateDigit {
24
- constructor(value, start, length) {
25
- this.value = value;
26
- this.start = start;
27
- this.length = length;
28
- this.maxDays = 31;
29
- this.maxMonth = 12;
30
- if (value === DateParts.day) {
31
- this.parse = this.parseDay;
32
- }
33
- else if (value === DateParts.month) {
34
- this.parse = this.parseMonth;
35
- }
36
- else if (value === DateParts.year) {
37
- this.parse = this.parseYear;
38
- }
39
- }
40
- get end() {
41
- return this.start + this.length;
42
- }
43
- get isDay() {
44
- return this.value === DateParts.day;
45
- }
46
- get isMonth() {
47
- return this.value === DateParts.month;
48
- }
49
- get isYear() {
50
- return this.value === DateParts.year;
51
- }
52
- get fullName() {
53
- if (this.isDay) {
54
- return 'date';
55
- }
56
- if (this.isMonth) {
57
- return 'month';
58
- }
59
- if (this.isYear) {
60
- return 'year';
61
- }
62
- return '';
63
- }
64
- parseDay(value) {
65
- const parsedValue = parseInt(value);
66
- if (parsedValue === 0) {
67
- return 1;
68
- }
69
- if (parsedValue > this.maxDays) {
70
- return this.maxDays;
71
- }
72
- return parsedValue;
73
- }
74
- parseMonth(value) {
75
- const parsedValue = parseInt(value);
76
- if (parsedValue === 0) {
77
- return 1;
78
- }
79
- if (parsedValue > this.maxMonth) {
80
- return this.maxMonth;
81
- }
82
- return parsedValue;
83
- }
84
- parseYear(value) {
85
- const parsedValue = parseInt(value);
86
- if (parsedValue === 0) {
87
- return 1;
88
- }
89
- if (parsedValue > MAX_YEAR) {
90
- return parseInt(value.substring(0, YEAR_LENGTH));
91
- }
92
- return parsedValue;
93
- }
94
- }
95
- /** @docs-private */
96
- export const MC_DATEPICKER_VALUE_ACCESSOR = {
97
- provide: NG_VALUE_ACCESSOR,
98
- useExisting: forwardRef(() => McDatepickerInput),
99
- multi: true
100
- };
101
- /** @docs-private */
102
- export const MC_DATEPICKER_VALIDATORS = {
103
- provide: NG_VALIDATORS,
104
- useExisting: forwardRef(() => McDatepickerInput),
105
- multi: true
106
- };
107
- /**
108
- * An event used for datepicker input and change events. We don't always have access to a native
109
- * input or change event because the event may have been triggered by the user clicking on the
110
- * calendar popup. For consistency, we always use McDatepickerInputEvent instead.
111
- */
112
- export class McDatepickerInputEvent {
113
- constructor(
114
- /** Reference to the datepicker input component that emitted the event. */
115
- target,
116
- /** Reference to the native input element associated with the datepicker input. */
117
- targetElement) {
118
- this.target = target;
119
- this.targetElement = targetElement;
120
- this.value = this.target.value;
121
- }
122
- }
123
- let uniqueComponentIdSuffix = 0;
124
- /** Directive used to connect an input to a McDatepicker. */
125
- export class McDatepickerInput {
126
- constructor(elementRef, renderer, adapter, dateFormats, localeService) {
127
- this.elementRef = elementRef;
128
- this.renderer = renderer;
129
- this.adapter = adapter;
130
- this.dateFormats = dateFormats;
131
- this.localeService = localeService;
132
- this.stateChanges = new Subject();
133
- this.controlType = 'datepicker';
134
- this.focused = false;
135
- /** Emits when the value changes (either due to user input or programmatic change). */
136
- this.valueChange = new EventEmitter();
137
- /** Emits when the disabled state has changed */
138
- this.disabledChange = new EventEmitter();
139
- this._placeholder = '';
140
- this._disabled = false;
141
- this.incorrectInput = new EventEmitter();
142
- /** Emits when a `change` event is fired on this `<input>`. */
143
- this.dateChange = new EventEmitter();
144
- /** Emits when an `input` event is fired on this `<input>`. */
145
- this.dateInput = new EventEmitter();
146
- this.uid = `mc-datepicker-${uniqueComponentIdSuffix++}`;
147
- this.datepickerSubscription = Subscription.EMPTY;
148
- this.localeSubscription = Subscription.EMPTY;
149
- /** Whether the last value set on the input was valid. */
150
- this.lastValueValid = false;
151
- this.firstDigit = null;
152
- this.secondDigit = null;
153
- this.thirdDigit = null;
154
- this.usePlaceholderFromInput = false;
155
- // tslint:disable-next-line:no-empty
156
- this.onTouched = () => { };
157
- this.onInput = () => {
158
- this.correctCursorPosition();
159
- const formattedValue = this.replaceSymbols(this.viewValue);
160
- const newTimeObj = this.getDateFromString(formattedValue);
161
- this.lastValueValid = !!newTimeObj;
162
- if (!newTimeObj) {
163
- if (!this.viewValue) {
164
- this.lastValueValid = false;
165
- this.updateValue(newTimeObj);
166
- }
167
- else {
168
- this.control.updateValueAndValidity();
169
- }
170
- return;
171
- }
172
- this.setViewValue(this.getTimeStringFromDate(newTimeObj, this.dateInputFormat), true);
173
- this.selectNextDigitByCursor(this.selectionStart);
174
- this.updateValue(newTimeObj);
175
- };
176
- this.parseOnBlur = () => {
177
- if (!this.viewValue || !this.readyForParse) {
178
- return null;
179
- }
180
- const date = this.getDefaultValue();
181
- const viewDigits = this.viewValue
182
- .split(this.separator)
183
- .map((value) => value)
184
- .filter((value) => value);
185
- const [firsViewDigit, secondViewDigit, thirdViewDigit] = viewDigits;
186
- // tslint:disable-next-line:no-magic-numbers
187
- if (viewDigits.length !== 3) {
188
- this.lastValueValid = false;
189
- this._value = null;
190
- return setTimeout(() => this.control.updateValueAndValidity());
191
- }
192
- date[this.firstDigit.fullName] = this.firstDigit.parse(firsViewDigit);
193
- date[this.secondDigit.fullName] = this.secondDigit.parse(secondViewDigit);
194
- date[this.thirdDigit.fullName] = this.thirdDigit.parse(thirdViewDigit);
195
- const [digitWithYear, viewDigitWithYear] = [this.firstDigit, this.secondDigit, this.thirdDigit]
196
- .reduce((acc, digit, index) => digit.value === DateParts.year ? [digit, viewDigits[index]] : acc, []);
197
- // tslint:disable-next-line:no-magic-numbers
198
- if (viewDigitWithYear.length < 3) {
199
- // tslint:disable-next-line:no-magic-numbers
200
- date.year += date.year < 30 ? 2000 : 1900;
201
- }
202
- else if (viewDigitWithYear.length < digitWithYear.length) {
203
- this.lastValueValid = false;
204
- this._value = null;
205
- return setTimeout(() => this.control.updateValueAndValidity());
206
- }
207
- const newTimeObj = this.createDateTime(date);
208
- if (!newTimeObj) {
209
- this.lastValueValid = false;
210
- this._value = null;
211
- this.cvaOnChange(null);
212
- return setTimeout(() => this.control.updateValueAndValidity());
213
- }
214
- this.lastValueValid = !!newTimeObj;
215
- this.setViewValue(this.getTimeStringFromDate(newTimeObj, this.dateInputFormat), true);
216
- this.updateValue(newTimeObj);
217
- };
218
- this.updateLocaleParams = () => {
219
- this.setFormat(this.dateInputFormat);
220
- if (!this.usePlaceholderFromInput) {
221
- this._placeholder = this.localeService.getParams('datepicker').placeholder;
222
- }
223
- this.value = this.value;
224
- };
225
- // tslint:disable-next-line:no-empty
226
- this.cvaOnChange = () => { };
227
- // tslint:disable-next-line:no-empty
228
- this.validatorOnChange = () => { };
229
- /** The form control validator for whether the input parses. */
230
- this.parseValidator = () => {
231
- return this.focused ||
232
- this.empty ||
233
- this.lastValueValid ? null : { mcDatepickerParse: { text: this.elementRef.nativeElement.value } };
234
- };
235
- /** The form control validator for the min date. */
236
- this.minValidator = (control) => {
237
- const controlValue = this.adapter.deserialize(control.value);
238
- return !this.min || !controlValue || this.adapter.compareDateTime(this.min, controlValue) <= 0 ?
239
- null :
240
- { mcDatepickerMin: { min: this.min, actual: controlValue } };
241
- };
242
- /** The form control validator for the max date. */
243
- this.maxValidator = (control) => {
244
- const controlValue = this.adapter.deserialize(control.value);
245
- return !this.max || !controlValue || this.adapter.compareDateTime(this.max, controlValue) >= 0 ?
246
- null :
247
- { mcDatepickerMax: { max: this.max, actual: controlValue } };
248
- };
249
- /** The form control validator for the date filter. */
250
- this.filterValidator = (control) => {
251
- const controlValue = this.adapter.deserialize(control.value);
252
- return !this.dateFilter || !controlValue || this.dateFilter(controlValue) ?
253
- null : { mcDatepickerFilter: true };
254
- };
255
- this.validator = Validators.compose([
256
- this.parseValidator,
257
- this.minValidator,
258
- this.maxValidator,
259
- this.filterValidator
260
- ]);
261
- if (!this.adapter) {
262
- throw createMissingDateImplError('DateAdapter');
263
- }
264
- if (!this.dateFormats) {
265
- throw createMissingDateImplError('MC_DATE_FORMATS');
266
- }
267
- this.setFormat(this.dateInputFormat);
268
- this.localeSubscription = adapter.localeChanges
269
- .subscribe(this.updateLocaleParams);
270
- }
271
- get placeholder() {
272
- return this._placeholder;
273
- }
274
- set placeholder(value) {
275
- this._placeholder = value;
276
- this.usePlaceholderFromInput = true;
277
- }
278
- get required() {
279
- return this._required;
280
- }
281
- set required(value) {
282
- this._required = coerceBooleanProperty(value);
283
- }
284
- /** The datepicker that this input is associated with. */
285
- set mcDatepicker(value) {
286
- if (!value) {
287
- return;
288
- }
289
- this.datepicker = value;
290
- this.datepicker.registerInput(this);
291
- this.datepickerSubscription.unsubscribe();
292
- this.datepickerSubscription = this.datepicker.selectedChanged
293
- .subscribe((selected) => {
294
- const newValue = this.saveTimePart(selected);
295
- this.value = newValue;
296
- this.cvaOnChange(newValue);
297
- this.onTouched();
298
- this.dateChange.emit(new McDatepickerInputEvent(this, this.elementRef.nativeElement));
299
- });
300
- }
301
- /** Function that can be used to filter out dates within the datepicker. */
302
- set mcDatepickerFilter(value) {
303
- this.dateFilter = value;
304
- this.validatorOnChange();
305
- }
306
- /** The value of the input. */
307
- get value() {
308
- return this._value;
309
- }
310
- set value(value) {
311
- let newValue = this.adapter.deserialize(value);
312
- this.lastValueValid = !newValue || this.adapter.isValid(newValue);
313
- newValue = this.getValidDateOrNull(newValue);
314
- const oldDate = this.value;
315
- this._value = newValue;
316
- this.formatValue(newValue);
317
- if (!this.adapter.sameDate(oldDate, newValue)) {
318
- this.valueChange.emit(newValue);
319
- }
320
- }
321
- /** The minimum valid date. */
322
- get min() {
323
- return this._min;
324
- }
325
- set min(value) {
326
- this._min = this.adapter.deserialize(value);
327
- this.validatorOnChange();
328
- }
329
- /** The maximum valid date. */
330
- get max() {
331
- return this._max;
332
- }
333
- set max(value) {
334
- this._max = this.adapter.deserialize(value);
335
- this.validatorOnChange();
336
- }
337
- /** Whether the datepicker-input is disabled. */
338
- get disabled() {
339
- return this._disabled;
340
- }
341
- set disabled(value) {
342
- const newValue = coerceBooleanProperty(value);
343
- const element = this.elementRef.nativeElement;
344
- if (this._disabled !== newValue) {
345
- this._disabled = newValue;
346
- this.disabledChange.emit(newValue);
347
- }
348
- // We need to null check the `blur` method, because it's undefined during SSR.
349
- if (newValue && element.blur) {
350
- // Normally, native input elements automatically blur if they turn disabled. This behavior
351
- // is problematic, because it would mean that it triggers another change detection cycle,
352
- // which then causes a changed after checked error if the input element was focused before.
353
- element.blur();
354
- }
355
- }
356
- get id() {
357
- return this._id;
358
- }
359
- set id(value) {
360
- this._id = value || this.uid;
361
- }
362
- set mcValidationTooltip(tooltip) {
363
- if (!tooltip) {
364
- return;
365
- }
366
- tooltip.enterDelay = validationTooltipShowDelay;
367
- tooltip.trigger = 'manual';
368
- tooltip.initListeners();
369
- this.incorrectInput.subscribe(() => {
370
- if (tooltip.isOpen) {
371
- return;
372
- }
373
- tooltip.show();
374
- setTimeout(() => tooltip.hide(), validationTooltipHideDelay);
375
- });
376
- }
377
- get empty() {
378
- return !this.viewValue && !this.isBadInput();
379
- }
380
- get viewValue() {
381
- return this.elementRef.nativeElement.value;
382
- }
383
- get ngControl() {
384
- return this.control;
385
- }
386
- get isReadOnly() {
387
- return this.elementRef.nativeElement.readOnly;
388
- }
389
- get dateInputFormat() {
390
- return this.localeService?.getParams('datepicker').dateInput || this.dateFormats.dateInput;
391
- }
392
- get readyForParse() {
393
- return !!(this.firstDigit && this.secondDigit && this.thirdDigit);
394
- }
395
- get selectionStart() {
396
- return this.elementRef.nativeElement.selectionStart;
397
- }
398
- set selectionStart(value) {
399
- this.elementRef.nativeElement.selectionStart = value;
400
- }
401
- get selectionEnd() {
402
- return this.elementRef.nativeElement.selectionEnd;
403
- }
404
- set selectionEnd(value) {
405
- this.elementRef.nativeElement.selectionEnd = value;
406
- }
407
- onContainerClick() {
408
- this.focus();
409
- }
410
- focus() {
411
- this.elementRef.nativeElement.focus();
412
- }
413
- focusChanged(isFocused) {
414
- if (isFocused !== this.focused) {
415
- this.focused = isFocused;
416
- this.onTouched();
417
- this.stateChanges.next();
418
- }
419
- }
420
- ngOnDestroy() {
421
- this.datepickerSubscription.unsubscribe();
422
- this.localeSubscription.unsubscribe();
423
- this.valueChange.complete();
424
- this.disabledChange.complete();
425
- }
426
- /** @docs-private */
427
- registerOnValidatorChange(fn) {
428
- this.validatorOnChange = fn;
429
- }
430
- /** @docs-private */
431
- validate(control) {
432
- this.setControl(control);
433
- return this.validator ? this.validator(control) : null;
434
- }
435
- // Implemented as part of ControlValueAccessor.
436
- writeValue(value) {
437
- this.value = value;
438
- }
439
- // Implemented as part of ControlValueAccessor.
440
- registerOnChange(fn) {
441
- this.cvaOnChange = fn;
442
- }
443
- // Implemented as part of ControlValueAccessor.
444
- registerOnTouched(fn) {
445
- this.onTouched = fn;
446
- }
447
- // Implemented as part of ControlValueAccessor.
448
- setDisabledState(isDisabled) {
449
- this.disabled = isDisabled;
450
- }
451
- onKeyDown(event) {
452
- if (this.isReadOnly) {
453
- return;
454
- }
455
- const keyCode = event.keyCode;
456
- if (this.isLetterKey(event)) {
457
- event.preventDefault();
458
- this.incorrectInput.emit();
459
- }
460
- else if (this.isKeyForOpen(event)) {
461
- event.preventDefault();
462
- this.datepicker?.open();
463
- }
464
- else if (this.isKeyForClose(event)) {
465
- event.preventDefault();
466
- this.datepicker.close();
467
- }
468
- else if (keyCode === TAB) {
469
- this.datepicker.close(false);
470
- }
471
- else if (this.isKeyForByPass(event)) {
472
- return;
473
- }
474
- else if (keyCode === SPACE) {
475
- this.spaceKeyHandler(event);
476
- }
477
- else if ([UP_ARROW, DOWN_ARROW].includes(keyCode)) {
478
- event.preventDefault();
479
- this.verticalArrowKeyHandler(keyCode);
480
- }
481
- else if ([LEFT_ARROW, RIGHT_ARROW, HOME, PAGE_UP, END, PAGE_DOWN].includes(keyCode)) {
482
- event.preventDefault();
483
- this.changeCaretPosition(keyCode);
484
- }
485
- else if (/^\D$/.test(event.key)) {
486
- event.preventDefault();
487
- const newValue = this.getNewValue(event.key, this.selectionStart);
488
- const formattedValue = this.replaceSymbols(newValue);
489
- if (newValue !== formattedValue) {
490
- this.setViewValue(formattedValue, true);
491
- setTimeout(this.onInput);
492
- }
493
- else {
494
- this.incorrectInput.emit();
495
- }
496
- }
497
- else {
498
- setTimeout(this.onInput);
499
- }
500
- }
501
- onChange() {
502
- setTimeout(() => {
503
- this.dateChange.emit(new McDatepickerInputEvent(this, this.elementRef.nativeElement));
504
- });
505
- }
506
- /** Handles blur events on the input. */
507
- onBlur() {
508
- // Reformat the input only if we have a valid value.
509
- this.parseOnBlur();
510
- this.focusChanged(false);
511
- this.onInput();
512
- }
513
- onPaste($event) {
514
- $event.preventDefault();
515
- let rawValue = $event.clipboardData.getData('text');
516
- if (rawValue.match(/^\d\D/)) {
517
- rawValue = `0${rawValue}`;
518
- }
519
- rawValue.replace(/[^A-Za-z0-9]+/g, this.separator);
520
- if (/[a-z]/gi.test(rawValue)) {
521
- this.incorrectInput.emit();
522
- }
523
- const match = rawValue.match(/^(?<first>\d+)\W(?<second>\d+)\W(?<third>\d+)$/);
524
- if (!match?.groups?.first || !match?.groups?.second || !match?.groups?.third) {
525
- this.setViewValue(rawValue);
526
- return rawValue;
527
- }
528
- const value = [match.groups.first, match.groups.second, match.groups.third].join(this.separator);
529
- const newTimeObj = this.getDateFromString(value);
530
- if (!newTimeObj) {
531
- this.setViewValue(value);
532
- return value;
533
- }
534
- this.setViewValue(this.getTimeStringFromDate(newTimeObj, this.dateInputFormat));
535
- this.updateValue(newTimeObj);
536
- }
537
- toISO8601(value) {
538
- return this.adapter.toIso8601(value);
539
- }
540
- saveTimePart(selected) {
541
- if (!this.value) {
542
- return selected;
543
- }
544
- const years = this.adapter.getYear(selected);
545
- const month = this.adapter.getMonth(selected);
546
- const day = this.adapter.getDate(selected);
547
- const hours = this.adapter.getHours(this.value);
548
- const minutes = this.adapter.getMinutes(this.value);
549
- const seconds = this.adapter.getSeconds(this.value);
550
- const milliseconds = this.adapter.getMilliseconds(this.value);
551
- return this.adapter.createDateTime(years, month, day, hours, minutes, seconds, milliseconds);
552
- }
553
- setFormat(format) {
554
- // @ts-ignore
555
- this.separator = format.match(/[aA-zZ]+(?<separator>\W|\D)[aA-zZ]+/).groups.separator;
556
- this.separatorPositions = format
557
- .split('')
558
- .reduce((acc, item, index) => this.separator === item ? [...acc, index + 1] : acc, []);
559
- this.getDigitPositions(format);
560
- }
561
- updateValue(newValue) {
562
- if (!this.adapter.sameDate(newValue, this.value)) {
563
- this._value = newValue;
564
- this.cvaOnChange(newValue);
565
- this.valueChange.emit(newValue);
566
- this.dateInput.emit(new McDatepickerInputEvent(this, this.elementRef.nativeElement));
567
- }
568
- this.control?.updateValueAndValidity({ emitEvent: false });
569
- }
570
- isKeyForClose(event) {
571
- return (event.altKey && event.keyCode === UP_ARROW) || event.keyCode === ESCAPE;
572
- }
573
- isKeyForOpen(event) {
574
- return event.altKey && event.keyCode === DOWN_ARROW;
575
- }
576
- isLetterKey(event) {
577
- return isLetterKey(event) && !event.ctrlKey && !event.metaKey;
578
- }
579
- isKeyForByPass(event) {
580
- return (hasModifierKey(event) && (isVerticalMovement(event) || isHorizontalMovement(event))) ||
581
- event.ctrlKey || event.metaKey ||
582
- [DELETE, BACKSPACE, TAB].includes(event.keyCode);
583
- }
584
- spaceKeyHandler(event) {
585
- event.preventDefault();
586
- if (this.selectionStart === this.selectionEnd) {
587
- const value = this.getNewValue(event.key, this.selectionStart);
588
- this.setViewValue(value);
589
- setTimeout(this.onInput);
590
- }
591
- else if (this.selectionStart !== this.selectionEnd) {
592
- this.selectNextDigit(this.selectionStart, true);
593
- }
594
- }
595
- getNewValue(key, position) {
596
- return [this.viewValue.slice(0, position), key, this.viewValue.slice(position)].join('');
597
- }
598
- setViewValue(value, savePosition = false) {
599
- if (savePosition) {
600
- const selectionStart = this.selectionStart;
601
- const selectionEnd = this.selectionEnd;
602
- this.renderer.setProperty(this.elementRef.nativeElement, 'value', value);
603
- this.selectionStart = selectionStart;
604
- this.selectionEnd = selectionEnd;
605
- }
606
- else {
607
- this.renderer.setProperty(this.elementRef.nativeElement, 'value', value);
608
- }
609
- }
610
- replaceSymbols(value) {
611
- return value
612
- .split(this.separator)
613
- .map((part) => part.replace(/^([0-9]+)\W$/, '0$1'))
614
- .join(this.separator);
615
- }
616
- getDateFromString(timeString) {
617
- if (!timeString || timeString.length < this.firstDigit.length) {
618
- return null;
619
- }
620
- const date = this.getDefaultValue();
621
- const viewDigits = timeString
622
- .split(this.separator)
623
- .map((value) => value);
624
- const [firsViewDigit, secondViewDigit, thirdViewDigit] = viewDigits;
625
- if (viewDigits.length === 1) {
626
- if (/\D/.test(firsViewDigit) || firsViewDigit.length < this.firstDigit.length) {
627
- return null;
628
- }
629
- date[this.firstDigit.fullName] = this.firstDigit.parse(firsViewDigit);
630
- if (this.firstDigit.isDay) {
631
- date.month = 1;
632
- }
633
- // tslint:disable-next-line:no-magic-numbers
634
- }
635
- else if (viewDigits.length === 2) {
636
- if (firsViewDigit.length < this.firstDigit.length || secondViewDigit.length < this.secondDigit.length) {
637
- return null;
638
- }
639
- date[this.firstDigit.fullName] = this.firstDigit.parse(firsViewDigit);
640
- date[this.secondDigit.fullName] = this.secondDigit.parse(secondViewDigit);
641
- // tslint:disable-next-line:no-magic-numbers
642
- }
643
- else if (viewDigits.length === 3) {
644
- if (firsViewDigit.length < this.firstDigit.length ||
645
- secondViewDigit.length < this.secondDigit.length ||
646
- thirdViewDigit.length < this.thirdDigit.length) {
647
- return null;
648
- }
649
- date[this.firstDigit.fullName] = this.firstDigit.parse(firsViewDigit);
650
- date[this.secondDigit.fullName] = this.secondDigit.parse(secondViewDigit);
651
- date[this.thirdDigit.fullName] = this.thirdDigit.parse(thirdViewDigit);
652
- }
653
- else {
654
- return null;
655
- }
656
- return this.createDateTime(date);
657
- }
658
- getDefaultValue() {
659
- const defaultValue = this.value || this.adapter.today();
660
- return {
661
- year: this.adapter.getYear(defaultValue),
662
- month: this.adapter.getMonth(defaultValue),
663
- date: this.adapter.getDate(defaultValue),
664
- hours: this.adapter.getHours(defaultValue),
665
- minutes: this.adapter.getMinutes(defaultValue),
666
- seconds: this.adapter.getSeconds(defaultValue),
667
- milliseconds: this.adapter.getMilliseconds(defaultValue)
668
- };
669
- }
670
- getTimeStringFromDate(value, timeFormat) {
671
- if (!value || !this.adapter.isValid(value)) {
672
- return '';
673
- }
674
- return this.adapter.format(value, timeFormat);
675
- }
676
- getDateEditMetrics(cursorPosition) {
677
- for (const digit of [this.firstDigit, this.secondDigit, this.thirdDigit]) {
678
- if (cursorPosition >= digit.start && cursorPosition <= digit.end) {
679
- return [digit.value, digit.start, digit.end];
680
- }
681
- }
682
- return [this.thirdDigit.value, this.thirdDigit.start, this.thirdDigit.end];
683
- }
684
- incrementDate(dateVal, whatToIncrement) {
685
- let year = this.adapter.getYear(dateVal);
686
- let month = this.adapter.getMonth(dateVal);
687
- let day = this.adapter.getDate(dateVal);
688
- switch (whatToIncrement) {
689
- case DateParts.day:
690
- day++;
691
- if (day > this.adapter.getNumDaysInMonth(dateVal)) {
692
- day = 1;
693
- }
694
- break;
695
- case DateParts.month:
696
- month++;
697
- // tslint:disable-next-line:no-magic-numbers
698
- if (month > 11) {
699
- month = 0;
700
- }
701
- const lastDay = this.getLastDayFor(year, month);
702
- if (day > lastDay) {
703
- day = lastDay;
704
- }
705
- break;
706
- case DateParts.year:
707
- year++;
708
- if (year > MAX_YEAR) {
709
- year = 1;
710
- }
711
- break;
712
- default:
713
- }
714
- return this.createDate(year, month, day);
715
- }
716
- getLastDayFor(year, month) {
717
- return this.adapter.getNumDaysInMonth(this.createDate(year, month, 1));
718
- }
719
- decrementDate(dateVal, whatToDecrement) {
720
- let year = this.adapter.getYear(dateVal);
721
- let month = this.adapter.getMonth(dateVal);
722
- let day = this.adapter.getDate(dateVal);
723
- switch (whatToDecrement) {
724
- case DateParts.day:
725
- day--;
726
- if (day < 1) {
727
- day = this.adapter.getNumDaysInMonth(dateVal);
728
- }
729
- break;
730
- case DateParts.month:
731
- month--;
732
- if (month < 0) {
733
- // tslint:disable-next-line:no-magic-numbers
734
- month = 11;
735
- }
736
- const lastDay = this.getLastDayFor(year, month);
737
- if (day > lastDay) {
738
- day = lastDay;
739
- }
740
- break;
741
- case DateParts.year:
742
- year--;
743
- if (year < 1) {
744
- year = MAX_YEAR;
745
- }
746
- break;
747
- default:
748
- }
749
- return this.createDate(year, month, day);
750
- }
751
- verticalArrowKeyHandler(keyCode) {
752
- if (!this.value) {
753
- return;
754
- }
755
- let changedTime;
756
- const [modifiedTimePart, selectionStart, selectionEnd] = this.getDateEditMetrics(this.selectionStart);
757
- if (keyCode === UP_ARROW) {
758
- changedTime = this.incrementDate(this.value, modifiedTimePart);
759
- }
760
- if (keyCode === DOWN_ARROW) {
761
- changedTime = this.decrementDate(this.value, modifiedTimePart);
762
- }
763
- this.value = changedTime;
764
- this.selectionStart = selectionStart;
765
- this.selectionEnd = selectionEnd;
766
- this.cvaOnChange(changedTime);
767
- this.onChange();
768
- this.stateChanges.next();
769
- }
770
- changeCaretPosition(keyCode) {
771
- if (!this.value) {
772
- return;
773
- }
774
- let cursorPos = this.selectionStart;
775
- if ([HOME, PAGE_UP].includes(keyCode)) {
776
- cursorPos = 0;
777
- }
778
- else if ([END, PAGE_DOWN].includes(keyCode)) {
779
- cursorPos = this.viewValue.length;
780
- }
781
- else if (keyCode === LEFT_ARROW) {
782
- cursorPos = cursorPos === 0 ? this.viewValue.length : cursorPos - 1;
783
- }
784
- else if (keyCode === RIGHT_ARROW) {
785
- const nextSeparatorPos = this.viewValue.indexOf(this.separator, cursorPos);
786
- cursorPos = nextSeparatorPos ? nextSeparatorPos + 1 : 0;
787
- }
788
- this.selectDigitByCursor(cursorPos);
789
- }
790
- selectDigitByCursor(cursorPos) {
791
- setTimeout(() => {
792
- const [, selectionStart, selectionEnd] = this.getDateEditMetrics(cursorPos);
793
- this.selectionStart = selectionStart;
794
- this.selectionEnd = selectionEnd;
795
- });
796
- }
797
- selectNextDigitByCursor(cursorPos) {
798
- setTimeout(() => {
799
- const [, , endPositionOfCurrentDigit] = this.getDateEditMetrics(cursorPos);
800
- const [, selectionStart, selectionEnd] = this.getDateEditMetrics(endPositionOfCurrentDigit + 1);
801
- this.selectionStart = selectionStart;
802
- this.selectionEnd = selectionEnd;
803
- });
804
- }
805
- selectNextDigit(cursorPos, cycle = false) {
806
- setTimeout(() => {
807
- const lastValue = cycle ? 0 : cursorPos;
808
- const nextSeparatorPos = this.viewValue.indexOf(this.separator, cursorPos);
809
- const newCursorPos = nextSeparatorPos > 0 ? nextSeparatorPos + 1 : lastValue;
810
- const [, selectionStart, selectionEnd] = this.getDateEditMetrics(newCursorPos);
811
- this.selectionStart = selectionStart;
812
- this.selectionEnd = selectionEnd;
813
- });
814
- }
815
- /** Checks whether the input is invalid based on the native validation. */
816
- isBadInput() {
817
- const validity = this.elementRef.nativeElement.validity;
818
- return validity && validity.badInput;
819
- }
820
- /** Formats a value and sets it on the input element. */
821
- formatValue(value) {
822
- const formattedValue = value ? this.adapter.format(value, this.dateInputFormat) : '';
823
- this.setViewValue(formattedValue);
824
- }
825
- setControl(control) {
826
- if (this.control) {
827
- return;
828
- }
829
- this.control = control;
830
- this.control.valueChanges
831
- .subscribe((value) => this._value = value);
832
- }
833
- /**
834
- * @param obj The object to check.
835
- * @returns The given object if it is both a date instance and valid, otherwise null.
836
- */
837
- getValidDateOrNull(obj) {
838
- return (this.adapter.isDateInstance(obj) && this.adapter.isValid(obj)) ? obj : null;
839
- }
840
- getDigitPositions(format) {
841
- this.firstDigit = this.secondDigit = this.thirdDigit = null;
842
- const formatInLowerCase = format.toLowerCase();
843
- formatInLowerCase
844
- .split('')
845
- .reduce(({ prev, length, start }, value, index, arr) => {
846
- if (value === this.separator || (arr.length - 1) === index) {
847
- if (!this.firstDigit) {
848
- this.firstDigit = new DateDigit(prev, start, length);
849
- }
850
- else if (!this.secondDigit) {
851
- this.secondDigit = new DateDigit(prev, start, length);
852
- }
853
- else if (!this.thirdDigit) {
854
- this.thirdDigit = new DateDigit(prev, start, arr.length - start);
855
- }
856
- // tslint:disable:no-parameter-reassignment
857
- length = 0;
858
- start = index + 1;
859
- }
860
- else {
861
- length++;
862
- }
863
- return { prev: value, length, start };
864
- }, { length: 0, start: 0 });
865
- if (!this.firstDigit || !this.secondDigit || !this.thirdDigit) {
866
- Error(`Can' t use this format: ${format}`);
867
- }
868
- }
869
- createDate(year, month, day) {
870
- return this.adapter.createDateTime(year, month, day, this.adapter.getHours(this.value), this.adapter.getMinutes(this.value), this.adapter.getSeconds(this.value), this.adapter.getMilliseconds(this.value));
871
- }
872
- createDateTime(value) {
873
- if (Object.values(value).some(isNaN)) {
874
- return null;
875
- }
876
- return this.adapter.createDateTime(value.year, value.month - 1, value.date, value.hours, value.minutes, value.seconds, value.milliseconds);
877
- }
878
- correctCursorPosition() {
879
- if (this.selectionStart && this.separatorPositions.includes(this.selectionStart)) {
880
- this.selectionStart = this.selectionStart - 1;
881
- }
882
- }
883
- }
884
- /** @nocollapse */ McDatepickerInput.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: McDatepickerInput, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i1.DateAdapter, optional: true }, { token: MC_DATE_FORMATS, optional: true }, { token: MC_LOCALE_SERVICE, optional: true }], target: i0.ɵɵFactoryTarget.Directive });
885
- /** @nocollapse */ McDatepickerInput.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.9", type: McDatepickerInput, selector: "input[mcDatepicker]", inputs: { placeholder: "placeholder", required: "required", mcDatepicker: "mcDatepicker", mcDatepickerFilter: "mcDatepickerFilter", value: "value", min: "min", max: "max", disabled: "disabled", id: "id", mcValidationTooltip: "mcValidationTooltip" }, outputs: { incorrectInput: "incorrectInput", dateChange: "dateChange", dateInput: "dateInput" }, host: { listeners: { "paste": "onPaste($event)", "change": "onChange()", "focus": "focusChanged(true)", "blur": "onBlur()", "keydown": "onKeyDown($event)" }, properties: { "attr.placeholder": "placeholder", "attr.required": "required", "attr.disabled": "disabled || null", "attr.min": "min ? toISO8601(min) : null", "attr.max": "max ? toISO8601(max) : null", "attr.autocomplete": "\"off\"" }, classAttribute: "mc-input mc-datepicker" }, providers: [
886
- MC_DATEPICKER_VALUE_ACCESSOR,
887
- MC_DATEPICKER_VALIDATORS,
888
- { provide: McFormFieldControl, useExisting: McDatepickerInput }
889
- ], exportAs: ["mcDatepickerInput"], ngImport: i0 });
890
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: McDatepickerInput, decorators: [{
891
- type: Directive,
892
- args: [{
893
- selector: 'input[mcDatepicker]',
894
- exportAs: 'mcDatepickerInput',
895
- providers: [
896
- MC_DATEPICKER_VALUE_ACCESSOR,
897
- MC_DATEPICKER_VALIDATORS,
898
- { provide: McFormFieldControl, useExisting: McDatepickerInput }
899
- ],
900
- host: {
901
- class: 'mc-input mc-datepicker',
902
- '[attr.placeholder]': 'placeholder',
903
- '[attr.required]': 'required',
904
- '[attr.disabled]': 'disabled || null',
905
- '[attr.min]': 'min ? toISO8601(min) : null',
906
- '[attr.max]': 'max ? toISO8601(max) : null',
907
- '[attr.autocomplete]': '"off"',
908
- '(paste)': 'onPaste($event)',
909
- '(change)': 'onChange()',
910
- '(focus)': 'focusChanged(true)',
911
- '(blur)': 'onBlur()',
912
- '(keydown)': 'onKeyDown($event)'
913
- }
914
- }]
915
- }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i1.DateAdapter, decorators: [{
916
- type: Optional
917
- }] }, { type: undefined, decorators: [{
918
- type: Optional
919
- }, {
920
- type: Inject,
921
- args: [MC_DATE_FORMATS]
922
- }] }, { type: i1.McLocaleService, decorators: [{
923
- type: Optional
924
- }, {
925
- type: Inject,
926
- args: [MC_LOCALE_SERVICE]
927
- }] }]; }, propDecorators: { placeholder: [{
928
- type: Input
929
- }], required: [{
930
- type: Input
931
- }], mcDatepicker: [{
932
- type: Input
933
- }], mcDatepickerFilter: [{
934
- type: Input
935
- }], value: [{
936
- type: Input
937
- }], min: [{
938
- type: Input
939
- }], max: [{
940
- type: Input
941
- }], disabled: [{
942
- type: Input
943
- }], id: [{
944
- type: Input
945
- }], mcValidationTooltip: [{
946
- type: Input
947
- }], incorrectInput: [{
948
- type: Output
949
- }], dateChange: [{
950
- type: Output
951
- }], dateInput: [{
952
- type: Output
953
- }] } });
954
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXBpY2tlci1pbnB1dC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9tb3NhaWMvZGF0ZXBpY2tlci9kYXRlcGlja2VyLWlucHV0LmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx1Q0FBdUM7QUFDdkMsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDOUQsT0FBTyxFQUNILFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLFVBQVUsRUFDVixNQUFNLEVBQ04sS0FBSyxFQUVMLFFBQVEsRUFDUixNQUFNLEVBQ04sU0FBUyxFQUNaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFHSCxhQUFhLEVBQ2IsaUJBQWlCLEVBSWpCLFVBQVUsRUFDYixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFDSCxRQUFRLEVBQ1IsV0FBVyxFQUNYLFVBQVUsRUFDVixVQUFVLEVBQ1YsR0FBRyxFQUNILFNBQVMsRUFDVCxJQUFJLEVBQ0osT0FBTyxFQUNQLEtBQUssRUFDTCxHQUFHLEVBQ0gsTUFBTSxFQUNOLE1BQU0sRUFDTixTQUFTLEVBQ1QsY0FBYyxFQUNkLG9CQUFvQixFQUNwQixXQUFXLEVBQ1gsa0JBQWtCLEVBQ3JCLE1BQU0sMEJBQTBCLENBQUM7QUFDbEMsT0FBTyxFQUNILFdBQVcsRUFDWCxlQUFlLEVBQ2YsaUJBQWlCLEVBRWpCLGVBQWUsRUFDZiwwQkFBMEIsRUFDMUIsMEJBQTBCLEVBQzdCLE1BQU0seUJBQXlCLENBQUM7QUFDakMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDbkUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDckUsT0FBTyxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFN0MsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1B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QUdZLFNBQVM7c0JBQTNCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyIvLyB0c2xpbnQ6ZGlzYWJsZTpuby1lbXB0eSwgZGVwcmVjYXRpb25cbmltcG9ydCB7IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2VyY2lvbic7XG5pbXBvcnQge1xuICAgIERpcmVjdGl2ZSxcbiAgICBFbGVtZW50UmVmLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBmb3J3YXJkUmVmLFxuICAgIEluamVjdCxcbiAgICBJbnB1dCxcbiAgICBPbkRlc3Ryb3ksXG4gICAgT3B0aW9uYWwsXG4gICAgT3V0cHV0LFxuICAgIFJlbmRlcmVyMlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gICAgQWJzdHJhY3RDb250cm9sLFxuICAgIENvbnRyb2xWYWx1ZUFjY2Vzc29yLFxuICAgIE5HX1ZBTElEQVRPUlMsXG4gICAgTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgVmFsaWRhdGlvbkVycm9ycyxcbiAgICBWYWxpZGF0b3IsXG4gICAgVmFsaWRhdG9yRm4sXG4gICAgVmFsaWRhdG9yc1xufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge1xuICAgIFVQX0FSUk9XLFxuICAgIFJJR0hUX0FSUk9XLFxuICAgIERPV05fQVJST1csXG4gICAgTEVGVF9BUlJPVyxcbiAgICBFTkQsXG4gICAgUEFHRV9ET1dOLFxuICAgIEhPTUUsXG4gICAgUEFHRV9VUCxcbiAgICBTUEFDRSxcbiAgICBUQUIsXG4gICAgRVNDQVBFLFxuICAgIERFTEVURSxcbiAgICBCQUNLU1BBQ0UsXG4gICAgaGFzTW9kaWZpZXJLZXksXG4gICAgaXNIb3Jpem9udGFsTW92ZW1lbnQsXG4gICAgaXNMZXR0ZXJLZXksXG4gICAgaXNWZXJ0aWNhbE1vdmVtZW50XG59IGZyb20gJ0BwdHNlY3VyaXR5L2Nkay9rZXljb2Rlcyc7XG5pbXBvcnQge1xuICAgIERhdGVBZGFwdGVyLFxuICAgIE1DX0RBVEVfRk9STUFUUyxcbiAgICBNQ19MT0NBTEVfU0VSVklDRSxcbiAgICBNY0RhdGVGb3JtYXRzLFxuICAgIE1jTG9jYWxlU2VydmljZSxcbiAgICB2YWxpZGF0aW9uVG9vbHRpcEhpZGVEZWxheSxcbiAgICB2YWxpZGF0aW9uVG9vbHRpcFNob3dEZWxheVxufSBmcm9tICdAcHRzZWN1cml0eS9tb3NhaWMvY29yZSc7XG5pbXBvcnQgeyBNY0Zvcm1GaWVsZENvbnRyb2wgfSBmcm9tICdAcHRzZWN1cml0eS9tb3NhaWMvZm9ybS1maWVsZCc7XG5pbXBvcnQgeyBNY1dhcm5pbmdUb29sdGlwVHJpZ2dlciB9IGZyb20gJ0BwdHNlY3VyaXR5L21vc2FpYy90b29sdGlwJztcbmltcG9ydCB7IFN1YmplY3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBjcmVhdGVNaXNzaW5nRGF0ZUltcGxFcnJvciB9IGZyb20gJy4vZGF0ZXBpY2tlci1lcnJvcnMnO1xuaW1wb3J0IHsgTWNEYXRlcGlja2VyIH0gZnJvbSAnLi9kYXRlcGlja2VyLmNvbXBvbmVudCc7XG5cblxuLy8gdHNsaW50OmRpc2FibGU6bmFtaW5nLWNvbnZlbnRpb25cbmVudW0gRGF0ZVBhcnRzIHtcbiAgICB5ZWFyID0gJ3knLFxuICAgIG1vbnRoID0gJ20nLFxuICAgIGRheSA9ICdkJ1xufVxuXG5leHBvcnQgY29uc3QgTUFYX1lFQVIgPSA5OTk5O1xuY29uc3QgWUVBUl9MRU5HVEggPSA0O1xuXG5jbGFzcyBEYXRlRGlnaXQge1xuICAgIG1heERheXMgPSAzMTtcbiAgICBtYXhNb250aCA9IDEyO1xuXG4gICAgcGFyc2U6ICh2YWx1ZTogc3RyaW5nKSA9PiBudW1iZXI7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgdmFsdWU6IERhdGVQYXJ0cywgcHVibGljIHN0YXJ0OiBudW1iZXIsIHB1YmxpYyBsZW5ndGg6IG51bWJlcikge1xuICAgICAgICBpZiAodmFsdWUgPT09IERhdGVQYXJ0cy5kYXkpIHtcbiAgICAgICAgICAgIHRoaXMucGFyc2UgPSB0aGlzLnBhcnNlRGF5O1xuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09PSBEYXRlUGFydHMubW9udGgpIHtcbiAgICAgICAgICAgIHRoaXMucGFyc2UgPSB0aGlzLnBhcnNlTW9udGg7XG4gICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT09IERhdGVQYXJ0cy55ZWFyKSB7XG4gICAgICAgICAgICB0aGlzLnBhcnNlID0gdGhpcy5wYXJzZVllYXI7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXQgZW5kKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXJ0ICsgdGhpcy5sZW5ndGg7XG4gICAgfVxuXG4gICAgZ2V0IGlzRGF5KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZSA9PT0gRGF0ZVBhcnRzLmRheTtcbiAgICB9XG5cbiAgICBnZXQgaXNNb250aCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWUgPT09IERhdGVQYXJ0cy5tb250aDtcbiAgICB9XG5cbiAgICBnZXQgaXNZZWFyKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZSA9PT0gRGF0ZVBhcnRzLnllYXI7XG4gICAgfVxuXG4gICAgZ2V0IGZ1bGxOYW1lKCk6IHN0cmluZyB7XG4gICAgICAgIGlmICh0aGlzLmlzRGF5KSB7IHJldHVybiAnZGF0ZSc7IH1cblxuICAgICAgICBpZiAodGhpcy5pc01vbnRoKSB7IHJldHVybiAnbW9udGgnOyB9XG5cbiAgICAgICAgaWYgKHRoaXMuaXNZZWFyKSB7IHJldHVybiAneWVhcic7IH1cblxuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwYXJzZURheSh2YWx1ZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgcGFyc2VkVmFsdWU6IG51bWJlciA9IHBhcnNlSW50KHZhbHVlKTtcblxuICAgICAgICBpZiAocGFyc2VkVmFsdWUgPT09IDApIHsgcmV0dXJuIDE7IH1cblxuICAgICAgICBpZiAocGFyc2VkVmFsdWUgPiB0aGlzLm1heERheXMpIHsgcmV0dXJuIHRoaXMubWF4RGF5czsgfVxuXG4gICAgICAgIHJldHVybiBwYXJzZWRWYWx1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHBhcnNlTW9udGgodmFsdWU6IHN0cmluZyk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHBhcnNlZFZhbHVlOiBudW1iZXIgPSBwYXJzZUludCh2YWx1ZSk7XG5cbiAgICAgICAgaWYgKHBhcnNlZFZhbHVlID09PSAwKSB7IHJldHVybiAxOyB9XG5cbiAgICAgICAgaWYgKHBhcnNlZFZhbHVlID4gdGhpcy5tYXhNb250aCkgeyByZXR1cm4gdGhpcy5tYXhNb250aDsgfVxuXG4gICAgICAgIHJldHVybiBwYXJzZWRWYWx1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHBhcnNlWWVhcih2YWx1ZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgcGFyc2VkVmFsdWU6IG51bWJlciA9IHBhcnNlSW50KHZhbHVlKTtcblxuICAgICAgICBpZiAocGFyc2VkVmFsdWUgPT09IDApIHsgcmV0dXJuIDE7IH1cblxuICAgICAgICBpZiAocGFyc2VkVmFsdWUgPiBNQVhfWUVBUikgeyByZXR1cm4gcGFyc2VJbnQodmFsdWUuc3Vic3RyaW5nKDAsIFlFQVJfTEVOR1RIKSk7IH1cblxuICAgICAgICByZXR1cm4gcGFyc2VkVmFsdWU7XG4gICAgfVxufVxuXG4vKiogQGRvY3MtcHJpdmF0ZSAqL1xuZXhwb3J0IGNvbnN0IE1DX0RBVEVQSUNLRVJfVkFMVUVfQUNDRVNTT1I6IGFueSA9IHtcbiAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBNY0RhdGVwaWNrZXJJbnB1dCksXG4gICAgbXVsdGk6IHRydWVcbn07XG5cbi8qKiBAZG9jcy1wcml2YXRlICovXG5leHBvcnQgY29uc3QgTUNfREFURVBJQ0tFUl9WQUxJREFUT1JTOiBhbnkgPSB7XG4gICAgcHJvdmlkZTogTkdfVkFMSURBVE9SUyxcbiAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBNY0RhdGVwaWNrZXJJbnB1dCksXG4gICAgbXVsdGk6IHRydWVcbn07XG5cblxuLyoqXG4gKiBBbiBldmVudCB1c2VkIGZvciBkYXRlcGlja2VyIGlucHV0IGFuZCBjaGFuZ2UgZXZlbnRzLiBXZSBkb24ndCBhbHdheXMgaGF2ZSBhY2Nlc3MgdG8gYSBuYXRpdmVcbiAqIGlucHV0IG9yIGNoYW5nZSBldmVudCBiZWNhdXNlIHRoZSBldmVudCBtYXkgaGF2ZSBiZWVuIHRyaWdnZXJlZCBieSB0aGUgdXNlciBjbGlja2luZyBvbiB0aGVcbiAqIGNhbGVuZGFyIHBvcHVwLiBGb3IgY29uc2lzdGVuY3ksIHdlIGFsd2F5cyB1c2UgTWNEYXRlcGlja2VySW5wdXRFdmVudCBpbnN0ZWFkLlxuICovXG5leHBvcnQgY2xhc3MgTWNEYXRlcGlja2VySW5wdXRFdmVudDxEPiB7XG4gICAgLyoqIFRoZSBuZXcgdmFsdWUgZm9yIHRoZSB0YXJnZXQgZGF0ZXBpY2tlciBpbnB1dC4gKi9cbiAgICB2YWx1ZTogRCB8IG51bGw7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgLyoqIFJlZmVyZW5jZSB0byB0aGUgZGF0ZXBpY2tlciBpbnB1dCBjb21wb25lbnQgdGhhdCBlbWl0dGVkIHRoZSBldmVudC4gKi9cbiAgICAgICAgcHVibGljIHRhcmdldDogTWNEYXRlcGlja2VySW5wdXQ8RD4sXG4gICAgICAgIC8qKiBSZWZlcmVuY2UgdG8gdGhlIG5hdGl2ZSBpbnB1dCBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgZGF0ZXBpY2tlciBpbnB1dC4gKi9cbiAgICAgICAgcHVibGljIHRhcmdldEVsZW1lbnQ6IEhUTUxFbGVtZW50XG4gICAgKSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLnRhcmdldC52YWx1ZTtcbiAgICB9XG59XG5cbmxldCB1bmlxdWVDb21wb25lbnRJZFN1ZmZpeCA9IDA7XG5cbmludGVyZmFjZSBEYXRlVGltZU9iamVjdCB7XG4gICAgeWVhcjogbnVtYmVyO1xuICAgIG1vbnRoOiBudW1iZXI7XG4gICAgZGF0ZTogbnVtYmVyO1xuICAgIGhvdXJzOiBudW1iZXI7XG4gICAgbWludXRlczogbnVtYmVyO1xuICAgIHNlY29uZHM6IG51bWJlcjtcbiAgICBtaWxsaXNlY29uZHM6IG51bWJlcjtcbn1cblxuXG4vKiogRGlyZWN0aXZlIHVzZWQgdG8gY29ubmVjdCBhbiBpbnB1dCB0byBhIE1jRGF0ZXBpY2tlci4gKi9cbkBEaXJlY3RpdmUoe1xuICAgIHNlbGVjdG9yOiAnaW5wdXRbbWNEYXRlcGlja2VyXScsXG4gICAgZXhwb3J0QXM6ICdtY0RhdGVwaWNrZXJJbnB1dCcsXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIE1DX0RBVEVQSUNLRVJfVkFMVUVfQUNDRVNTT1IsXG4gICAgICAgIE1DX0RBVEVQSUNLRVJfVkFMSURBVE9SUyxcbiAgICAgICAgeyBwcm92aWRlOiBNY0Zvcm1GaWVsZENvbnRyb2wsIHVzZUV4aXN0aW5nOiBNY0RhdGVwaWNrZXJJbnB1dCB9XG4gICAgXSxcbiAgICBob3N0OiB7XG4gICAgICAgIGNsYXNzOiAnbWMtaW5wdXQgbWMtZGF0ZXBpY2tlcicsXG4gICAgICAgICdbYXR0ci5wbGFjZWhvbGRlcl0nOiAncGxhY2Vob2xkZXInLFxuICAgICAgICAnW2F0dHIucmVxdWlyZWRdJzogJ3JlcXVpcmVkJyxcbiAgICAgICAgJ1thdHRyLmRpc2FibGVkXSc6ICdkaXNhYmxlZCB8fCBudWxsJyxcbiAgICAgICAgJ1thdHRyLm1pbl0nOiAnbWluID8gdG9JU084NjAxKG1pbikgOiBudWxsJyxcbiAgICAgICAgJ1thdHRyLm1heF0nOiAnbWF4ID8gdG9JU084NjAxKG1heCkgOiBudWxsJyxcbiAgICAgICAgJ1thdHRyLmF1dG9jb21wbGV0ZV0nOiAnXCJvZmZcIicsXG5cbiAgICAgICAgJyhwYXN0ZSknOiAnb25QYXN0ZSgkZXZlbnQpJyxcbiAgICAgICAgJyhjaGFuZ2UpJzogJ29uQ2hhbmdlKCknLFxuXG4gICAgICAgICcoZm9jdXMpJzogJ2ZvY3VzQ2hhbmdlZCh0cnVlKScsXG4gICAgICAgICcoYmx1ciknOiAnb25CbHVyKCknLFxuXG4gICAgICAgICcoa2V5ZG93biknOiAnb25LZXlEb3duKCRldmVudCknXG4gICAgfVxufSlcbmV4cG9ydCBjbGFzcyBNY0RhdGVwaWNrZXJJbnB1dDxEPiBpbXBsZW1lbnRzIE1jRm9ybUZpZWxkQ29udHJvbDxEPiwgQ29udHJvbFZhbHVlQWNjZXNzb3IsIFZhbGlkYXRvciwgT25EZXN0cm95IHtcbiAgICByZWFkb25seSBzdGF0ZUNoYW5nZXM6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gICAgcmVhZG9ubHkgZXJyb3JTdGF0ZTogYm9vbGVhbjtcblxuICAgIGNvbnRyb2xUeXBlOiBzdHJpbmcgPSAnZGF0ZXBpY2tlcic7XG5cbiAgICBmb2N1c2VkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBkYXRlcGlja2VyOiBNY0RhdGVwaWNrZXI8RD47XG5cbiAgICBkYXRlRmlsdGVyOiAoZGF0ZTogRCB8IG51bGwpID0+IGJvb2xlYW47XG5cbiAgICAvKiogRW1pdHMgd2hlbiB0aGUgdmFsdWUgY2hhbmdlcyAoZWl0aGVyIGR1ZSB0byB1c2VyIGlucHV0IG9yIHByb2dyYW1tYXRpYyBjaGFuZ2UpLiAqL1xuICAgIHZhbHVlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxEIHwgbnVsbD4oKTtcblxuICAgIC8qKiBFbWl0cyB3aGVuIHRoZSBkaXNhYmxlZCBzdGF0ZSBoYXMgY2hhbmdlZCAqL1xuICAgIGRpc2FibGVkQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gICAgQElucHV0KClcbiAgICBnZXQgcGxhY2Vob2xkZXIoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BsYWNlaG9sZGVyO1xuICAgIH1cblxuICAgIHNldCBwbGFjZWhvbGRlcih2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX3BsYWNlaG9sZGVyID0gdmFsdWU7XG4gICAgICAgIHRoaXMudXNlUGxhY2Vob2xkZXJGcm9tSW5wdXQgPSB0cnVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3BsYWNlaG9sZGVyOiBzdHJpbmcgPSAnJztcblxuICAgIEBJbnB1dCgpXG4gICAgZ2V0IHJlcXVpcmVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVxdWlyZWQ7XG4gICAgfVxuXG4gICAgc2V0IHJlcXVpcmVkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuX3JlcXVpcmVkID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9yZXF1aXJlZDogYm9vbGVhbjtcblxuICAgIC8qKiBUaGUgZGF0ZXBpY2tlciB0aGF0IHRoaXMgaW5wdXQgaXMgYXNzb2NpYXRlZCB3aXRoLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgc2V0IG1jRGF0ZXBpY2tlcih2YWx1ZTogTWNEYXRlcGlja2VyPEQ+KSB7XG4gICAgICAgIGlmICghdmFsdWUpIHsgcmV0dXJuOyB9XG5cbiAgICAgICAgdGhpcy5kYXRlcGlja2VyID0gdmFsdWU7XG4gICAgICAgIHRoaXMuZGF0ZXBpY2tlci5yZWdpc3RlcklucHV0KHRoaXMpO1xuICAgICAgICB0aGlzLmRhdGVwaWNrZXJTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcblxuICAgICAgICB0aGlzLmRhdGVwaWNrZXJTdWJzY3JpcHRpb24gPSB0aGlzLmRhdGVwaWNrZXIuc2VsZWN0ZWRDaGFuZ2VkXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChzZWxlY3RlZDogRCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gdGhpcy5zYXZlVGltZVBhcnQoc2VsZWN0ZWQpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IG5ld1ZhbHVlO1xuICAgICAgICAgICAgICAgIHRoaXMuY3ZhT25DaGFuZ2UobmV3VmFsdWUpO1xuICAgICAgICAgICAgICAgIHRoaXMub25Ub3VjaGVkKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5kYXRlQ2hhbmdlLmVtaXQobmV3IE1jRGF0ZXBpY2tlcklucHV0RXZlbnQodGhpcywgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKiBGdW5jdGlvbiB0aGF0IGNhbiBiZSB1c2VkIHRvIGZpbHRlciBvdXQgZGF0ZXMgd2l0aGluIHRoZSBkYXRlcGlja2VyLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgc2V0IG1jRGF0ZXBpY2tlckZpbHRlcih2YWx1ZTogKGRhdGU6IEQgfCBudWxsKSA9PiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuZGF0ZUZpbHRlciA9IHZhbHVlO1xuICAgICAgICB0aGlzLnZhbGlkYXRvck9uQ2hhbmdlKCk7XG4gICAgfVxuXG4gICAgLyoqIFRoZSB2YWx1ZSBvZiB0aGUgaW5wdXQuICovXG4gICAgQElucHV0KClcbiAgICBnZXQgdmFsdWUoKTogRCB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gICAgfVxuXG4gICAgc2V0IHZhbHVlKHZhbHVlOiBEIHwgbnVsbCkge1xuICAgICAgICBsZXQgbmV3VmFsdWUgPSB0aGlzLmFkYXB0ZXIuZGVzZXJpYWxpemUodmFsdWUpO1xuXG4gICAgICAgIHRoaXMubGFzdFZhbHVlVmFsaWQgPSAhbmV3VmFsdWUgfHwgdGhpcy5hZGFwdGVyLmlzVmFsaWQobmV3VmFsdWUpO1xuXG4gICAgICAgIG5ld1ZhbHVlID0gdGhpcy5nZXRWYWxpZERhdGVPck51bGwobmV3VmFsdWUpO1xuXG4gICAgICAgIGNvbnN0IG9sZERhdGUgPSB0aGlzLnZhbHVlO1xuICAgICAgICB0aGlzLl92YWx1ZSA9IG5ld1ZhbHVlO1xuICAgICAgICB0aGlzLmZvcm1hdFZhbHVlKG5ld1ZhbHVlKTtcblxuICAgICAgICBpZiAoIXRoaXMuYWRhcHRlci5zYW1lRGF0ZShvbGREYXRlLCBuZXdWYWx1ZSkpIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdChuZXdWYWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF92YWx1ZTogRCB8IG51bGw7XG5cbiAgICAvKiogVGhlIG1pbmltdW0gdmFsaWQgZGF0ZS4gKi9cbiAgICBASW5wdXQoKVxuICAgIGdldCBtaW4oKTogRCB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWluO1xuICAgIH1cblxuICAgIHNldCBtaW4odmFsdWU6IEQgfCBudWxsKSB7XG4gICAgICAgIHRoaXMuX21pbiA9IHRoaXMuYWRhcHRlci5kZXNlcmlhbGl6ZSh2YWx1ZSk7XG4gICAgICAgIHRoaXMudmFsaWRhdG9yT25DaGFuZ2UoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9taW46IEQgfCBudWxsO1xuXG4gICAgLyoqIFRoZSBtYXhpbXVtIHZhbGlkIGRhdGUuICovXG4gICAgQElucHV0KClcbiAgICBnZXQgbWF4KCk6IEQgfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21heDtcbiAgICB9XG5cbiAgICBzZXQgbWF4KHZhbHVlOiBEIHwgbnVsbCkge1xuICAgICAgICB0aGlzLl9tYXggPSB0aGlzLmFkYXB0ZXIuZGVzZXJpYWxpemUodmFsdWUpO1xuICAgICAgICB0aGlzLnZhbGlkYXRvck9uQ2hhbmdlKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfbWF4OiBEIHwgbnVsbDtcblxuICAgIC8qKiBXaGV0aGVyIHRoZSBkYXRlcGlja2VyLWlucHV0IGlzIGRpc2FibGVkLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgZ2V0IGRpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGlzYWJsZWQ7XG4gICAgfVxuXG4gICAgc2V0IGRpc2FibGVkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuXG4gICAgICAgIGlmICh0aGlzLl9kaXNhYmxlZCAhPT0gbmV3VmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuX2Rpc2FibGVkID0gbmV3VmFsdWU7XG4gICAgICAgICAgICB0aGlzLmRpc2FibGVkQ2hhbmdlLmVtaXQobmV3VmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gV2UgbmVlZCB0byBudWxsIGNoZWNrIHRoZSBgYmx1cmAgbWV0aG9kLCBiZWNhdXNlIGl0J3MgdW5kZWZpbmVkIGR1cmluZyBTU1IuXG4gICAgICAgIGlmIChuZXdWYWx1ZSAmJiBlbGVtZW50LmJsdXIpIHtcbiAgICAgICAgICAgIC8vIE5vcm1hbGx5LCBuYXRpdmUgaW5wdXQgZWxlbWVudHMgYXV0b21hdGljYWxseSBibHVyIGlmIHRoZXkgdHVybiBkaXNhYmxlZC4gVGhpcyBiZWhhdmlvclxuICAgICAgICAgICAgLy8gaXMgcHJvYmxlbWF0aWMsIGJlY2F1c2UgaXQgd291bGQgbWVhbiB0aGF0IGl0IHRyaWdnZXJzIGFub3RoZXIgY2hhbmdlIGRldGVjdGlvbiBjeWNsZSxcbiAgICAgICAgICAgIC8vIHdoaWNoIHRoZW4gY2F1c2VzIGEgY2hhbmdlZCBhZnRlciBjaGVja2VkIGVycm9yIGlmIHRoZSBpbnB1dCBlbGVtZW50IHdhcyBmb2N1c2VkIGJlZm9yZS5cbiAgICAgICAgICAgIGVsZW1lbnQuYmx1cigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIEBJbnB1dCgpXG4gICAgZ2V0IGlkKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pZDtcbiAgICB9XG5cbiAgICBzZXQgaWQodmFsdWU6IHN0cmluZykge1xuICAgICAgICB0aGlzLl9pZCA9IHZhbHVlIHx8IHRoaXMudWlkO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2lkOiBzdHJpbmc7XG5cbiAgICBASW5wdXQoKVxuICAgIHNldCBtY1ZhbGlkYXRpb25Ub29sdGlwKHRvb2x0aXA6IE1jV2FybmluZ1Rvb2x0aXBUcmlnZ2VyKSB7XG4gICAgICAgIGlmICghdG9vbHRpcCkgeyByZXR1cm47IH1cblxuICAgICAgICB0b29sdGlwLmVudGVyRGVsYXkgPSB2YWxpZGF0aW9uVG9vbHRpcFNob3dEZWxheTtcbiAgICAgICAgdG9vbHRpcC50cmlnZ2VyID0gJ21hbnVhbCc7XG5cbiAgICAgICAgdG9vbHRpcC5pbml0TGlzdGVuZXJzKCk7XG5cbiAgICAgICAgdGhpcy5pbmNvcnJlY3RJbnB1dC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRvb2x0aXAuaXNPcGVuKSB7IHJldHVybjsgfVxuXG4gICAgICAgICAgICB0b29sdGlwLnNob3coKTtcblxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0b29sdGlwLmhpZGUoKSwgdmFsaWRhdGlvblRvb2x0aXBIaWRlRGVsYXkpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBAT3V0cHV0KCkgaW5jb3JyZWN0SW5wdXQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgICAvKiogRW1pdHMgd2hlbiBhIGBjaGFuZ2VgIGV2ZW50IGlzIGZpcmVkIG9uIHRoaXMgYDxpbnB1dD5gLiAqL1xuICAgIEBPdXRwdXQoKSByZWFkb25seSBkYXRlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxNY0RhdGVwaWNrZXJJbnB1dEV2ZW50PEQ+PigpO1xuXG4gICAgLyoqIEVtaXRzIHdoZW4gYW4gYGlucHV0YCBldmVudCBpcyBmaXJlZCBvbiB0aGlzIGA8aW5wdXQ+YC4gKi9cbiAgICBAT3V0cHV0KCkgcmVhZG9ubHkgZGF0ZUlucHV0ID0gbmV3IEV2ZW50RW1pdHRlcjxNY0RhdGVwaWNrZXJJbnB1dEV2ZW50PEQ+PigpO1xuXG4gICAgZ2V0IGVtcHR5KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gIXRoaXMudmlld1ZhbHVlICYmICF0aGlzLmlzQmFkSW5wdXQoKTtcbiAgICB9XG5cbiAgICBnZXQgdmlld1ZhbHVlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC52YWx1ZTtcbiAgICB9XG5cbiAgICBnZXQgbmdDb250cm9sKCk6IGFueSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRyb2w7XG4gICAgfVxuXG4gICAgZ2V0IGlzUmVhZE9ubHkoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5yZWFkT25seTtcbiAgICB9XG5cbiAgICBnZXQgZGF0ZUlucHV0Rm9ybWF0KCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvY2FsZVNlcnZpY2U/LmdldFBhcmFtcygnZGF0ZXBpY2tlcicpLmRhdGVJbnB1dCB8fCB0aGlzLmRhdGVGb3JtYXRzLmRhdGVJbnB1dDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldCByZWFkeUZvclBhcnNlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gISEodGhpcy5maXJzdERpZ2l0ICYmIHRoaXMuc2Vjb25kRGlnaXQgJiYgdGhpcy50aGlyZERpZ2l0KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldCBzZWxlY3Rpb25TdGFydCgpOiBudW1iZXIgfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnNlbGVjdGlvblN0YXJ0O1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0IHNlbGVjdGlvblN0YXJ0KHZhbHVlOiBudW1iZXIgfCBudWxsKSB7XG4gICAgICAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnNlbGVjdGlvblN0YXJ0ID0gdmFsdWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXQgc2VsZWN0aW9uRW5kKCk6IG51bWJlciB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuc2VsZWN0aW9uRW5kO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0IHNlbGVjdGlvbkVuZCh2YWx1ZTogbnVtYmVyIHwgbnVsbCkge1xuICAgICAgICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5zZWxlY3Rpb25FbmQgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbDtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHVpZCA9IGBtYy1kYXRlcGlja2VyLSR7dW5pcXVlQ29tcG9uZW50SWRTdWZmaXgrK31gO1xuXG4gICAgcHJpdmF0ZSBkYXRlcGlja2VyU3Vic2NyaXB0aW9uID0gU3Vic2NyaXB0aW9uLkVNUFRZO1xuXG4gICAgcHJpdmF0ZSBsb2NhbGVTdWJzY3JpcHRpb24gPSBTdWJzY3JpcHRpb24uRU1QVFk7XG5cbiAgICAvKiogV2hldGhlciB0aGUgbGFzdCB2YWx1ZSBzZXQgb24gdGhlIGlucHV0IHdhcyB2YWxpZC4gKi9cbiAgICBwcml2YXRlIGxhc3RWYWx1ZVZhbGlkID0gZmFsc2U7XG5cbiAgICAvKiogVGhlIGNvbWJpbmVkIGZvcm0gY29udHJvbCB2YWxpZGF0b3IgZm9yIHRoaXMgaW5wdXQuICovXG4gICAgcHJpdmF0ZSByZWFkb25seSB2YWxpZGF0b3I6IFZhbGlkYXRvckZuIHwgbnVsbDtcblxuICAgIHByaXZhdGUgc2VwYXJhdG9yOiBzdHJpbmc7XG5cbiAgICBwcml2YXRlIGZpcnN0RGlnaXQ6IERhdGVEaWdpdCB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgc2Vjb25kRGlnaXQ6IERhdGVEaWdpdCB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgdGhpcmREaWdpdDogRGF0ZURpZ2l0IHwgbnVsbCA9IG51bGw7XG5cbiAgICBwcml2YXRlIHNlcGFyYXRvclBvc2l0aW9uczogbnVtYmVyW107XG5cbiAgICBwcml2YXRlIHVzZVBsYWNlaG9sZGVyRnJvbUlucHV0OiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD4sXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICAgICAgQE9wdGlvbmFsKCkgcmVhZG9ubHkgYWRhcHRlcjogRGF0ZUFkYXB0ZXI8RD4sXG4gICAgICAgIEBPcHRpb25hbCgpIEBJbmplY3QoTUNfREFURV9GT1JNQVRTKSBwcml2YXRlIHJlYWRvbmx5IGRhdGVGb3JtYXRzOiBNY0RhdGVGb3JtYXRzLFxuICAgICAgICBAT3B0aW9uYWwoKSBASW5qZWN0KE1DX0xPQ0FMRV9TRVJWSUNFKSBwcml2YXRlIGxvY2FsZVNlcnZpY2U6IE1jTG9jYWxlU2VydmljZVxuICAgICkge1xuICAgICAgICB0aGlzLnZhbGlkYXRvciA9IFZhbGlkYXRvcnMuY29tcG9zZShbXG4gICAgICAgICAgICB0aGlzLnBhcnNlVmFsaWRhdG9yLFxuICAgICAgICAgICAgdGhpcy5taW5WYWxpZGF0b3IsXG4gICAgICAgICAgICB0aGlzLm1heFZhbGlkYXRvcixcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyVmFsaWRhdG9yXG4gICAgICAgIF0pO1xuXG4gICAgICAgIGlmICghdGhpcy5hZGFwdGVyKSB7XG4gICAgICAgICAgICB0aHJvdyBjcmVhdGVNaXNzaW5nRGF0ZUltcGxFcnJvcignRGF0ZUFkYXB0ZXInKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5kYXRlRm9ybWF0cykge1xuICAgICAgICAgICAgdGhyb3cgY3JlYXRlTWlzc2luZ0RhdGVJbXBsRXJyb3IoJ01DX0RBVEVfRk9STUFUUycpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZXRGb3JtYXQodGhpcy5kYXRlSW5wdXRGb3JtYXQpO1xuXG4gICAgICAgIHRoaXMubG9jYWxlU3Vic2NyaXB0aW9uID0gYWRhcHRlci5sb2NhbGVDaGFuZ2VzXG4gICAgICAgICAgICAuc3Vic2NyaWJlKHRoaXMudXBkYXRlTG9jYWxlUGFyYW1zKTtcbiAgICB9XG5cbiAgICBvbkNvbnRhaW5lckNsaWNrKCkge1xuICAgICAgICB0aGlzLmZvY3VzKCk7XG4gICAgfVxuXG4gICAgZm9jdXMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgfVxuXG4gICAgZm9jdXNDaGFuZ2VkKGlzRm9jdXNlZDogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICBpZiAoaXNGb2N1c2VkICE9PSB0aGlzLmZvY3VzZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNlZCA9IGlzRm9jdXNlZDtcbiAgICAgICAgICAgIHRoaXMub25Ub3VjaGVkKCk7XG4gICAgICAgICAgICB0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tZW1wdHlcbiAgICBvblRvdWNoZWQgPSAoKSA9PiB7fTtcblxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICB0aGlzLmRhdGVwaWNrZXJTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgdGhpcy5sb2NhbGVTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgdGhpcy52YWx1ZUNoYW5nZS5jb21wbGV0ZSgpO1xuICAgICAgICB0aGlzLmRpc2FibGVkQ2hhbmdlLmNvbXBsZXRlKCk7XG4gICAgfVxuXG4gICAgLyoqIEBkb2NzLXByaXZhdGUgKi9cbiAgICByZWdpc3Rlck9uVmFsaWRhdG9yQ2hhbmdlKGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIHRoaXMudmFsaWRhdG9yT25DaGFuZ2UgPSBmbjtcbiAgICB9XG5cbiAgICAvKiogQGRvY3MtcHJpdmF0ZSAqL1xuICAgIHZhbGlkYXRlKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsIHtcbiAgICAgICAgdGhpcy5zZXRDb250cm9sKGNvbnRyb2wpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLnZhbGlkYXRvciA/IHRoaXMudmFsaWRhdG9yKGNvbnRyb2wpIDogbnVsbDtcbiAgICB9XG5cbiAgICAvLyBJbXBsZW1lbnRlZCBhcyBwYXJ0IG9mIENvbnRyb2xWYWx1ZUFjY2Vzc29yLlxuICAgIHdyaXRlVmFsdWUodmFsdWU6IEQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIH1cblxuICAgIC8vIEltcGxlbWVudGVkIGFzIHBhcnQgb2YgQ29udHJvbFZhbHVlQWNjZXNzb3IuXG4gICAgcmVnaXN0ZXJPbkNoYW5nZShmbjogKHZhbHVlOiBhbnkpID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jdmFPbkNoYW5nZSA9IGZuO1xuICAgIH1cblxuICAgIC8vIEltcGxlbWVudGVkIGFzIHBhcnQgb2YgQ29udHJvbFZhbHVlQWNjZXNzb3IuXG4gICAgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgICB9XG5cbiAgICAvLyBJbXBsZW1lbnRlZCBhcyBwYXJ0IG9mIENvbnRyb2xWYWx1ZUFjY2Vzc29yLlxuICAgIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcbiAgICB9XG5cbiAgICBvbktleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuaXNSZWFkT25seSkgeyByZXR1cm47IH1cblxuICAgICAgICBjb25zdCBrZXlDb2RlID0gZXZlbnQua2V5Q29kZTtcblxuICAgICAgICBpZiAodGhpcy5pc0xldHRlcktleShldmVudCkpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgICAgIHRoaXMuaW5jb3JyZWN0SW5wdXQuZW1pdCgpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNLZXlGb3JPcGVuKGV2ZW50KSkge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICAgICAgdGhpcy5kYXRlcGlja2VyPy5vcGVuKCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc0tleUZvckNsb3NlKGV2ZW50KSkge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICAgICAgdGhpcy5kYXRlcGlja2VyLmNsb3NlKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5Q29kZSA9PT0gVEFCKSB7XG4gICAgICAgICAgICB0aGlzLmRhdGVwaWNrZXIuY2xvc2UoZmFsc2UpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNLZXlGb3JCeVBhc3MoZXZlbnQpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5Q29kZSA9PT0gU1BBQ0UpIHtcbiAgICAgICAgICAgIHRoaXMuc3BhY2VLZXlIYW5kbGVyKGV2ZW50KTtcbiAgICAgICAgfSBlbHNlIGlmIChbVVBfQVJST1csIERPV05fQVJST1ddLmluY2x1ZGVzKGtleUNvZGUpKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgICAgICB0aGlzLnZlcnRpY2FsQXJyb3dLZXlIYW5kbGVyKGtleUNvZGUpO1xuICAgICAgICB9IGVsc2UgaWYgKFtMRUZUX0FSUk9XLCBSSUdIVF9BUlJPVywgSE9NRSwgUEFHRV9VUCwgRU5ELCBQQUdFX0RPV05dLmluY2x1ZGVzKGtleUNvZGUpKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgICAgICB0aGlzLmNoYW5nZUNhcmV0UG9zaXRpb24oa2V5Q29kZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoL15cXEQkLy50ZXN0KGV2ZW50LmtleSkpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gdGhpcy5nZXROZXdWYWx1ZShldmVudC5rZXksIHRoaXMuc2VsZWN0aW9uU3RhcnQgYXMgbnVtYmVyKTtcbiAgICAgICAgICAgIGNvbnN0IGZvcm1hdHRlZFZhbHVlID0gdGhpcy5yZXBsYWNlU3ltYm9scyhuZXdWYWx1ZSk7XG5cbiAgICAgICAgICAgIGlmIChuZXdWYWx1ZSAhPT0gZm9ybWF0dGVkVmFsdWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFZpZXdWYWx1ZShmb3JtYXR0ZWRWYWx1ZSwgdHJ1ZSk7XG5cbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KHRoaXMub25JbnB1dCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5jb3JyZWN0SW5wdXQuZW1pdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2V0VGltZW91dCh0aGlzLm9uSW5wdXQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25JbnB1dCA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5jb3JyZWN0Q3Vyc29yUG9zaXRpb24oKTtcbiAgICAgICAgY29uc3QgZm9ybWF0dGVkVmFsdWUgPSB0aGlzLnJlcGxhY2VTeW1ib2xzKHRoaXMudmlld1ZhbHVlKTtcblxuICAgICAgICBjb25zdCBuZXdUaW1lT2JqID0gdGhpcy5nZXREYXRlRnJvbVN0cmluZyhmb3JtYXR0ZWRWYWx1ZSk7XG4gICAgICAgIHRoaXMubGFzdFZhbHVlVmFsaWQgPSAhIW5ld1RpbWVPYmo7XG5cbiAgICAgICAgaWYgKCFuZXdUaW1lT2JqKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMudmlld1ZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sYXN0VmFsdWVWYWxpZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlVmFsdWUobmV3VGltZU9iaiBhcyBEKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZXRWaWV3VmFsdWUodGhpcy5nZXRUaW1lU3RyaW5nRnJvbURhdGUobmV3VGltZU9iaiwgdGhpcy5kYXRlSW5wdXRGb3JtYXQpLCB0cnVlKTtcblxuICAgICAgICB0aGlzLnNlbGVjdE5leHREaWdpdEJ5Q3Vyc29yKCh0aGlzLnNlbGVjdGlvblN0YXJ0IGFzIG51bWJlcikpO1xuXG4gICAgICAgIHRoaXMudXBkYXRlVmFsdWUobmV3VGltZU9iaik7XG4gICAgfVxuXG4gICAgcGFyc2VPbkJsdXIgPSAoKTogYW55ID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLnZpZXdWYWx1ZSB8fCAhdGhpcy5yZWFkeUZvclBhcnNlKSB7IHJldHVybiBudWxsOyB9XG5cbiAgICAgICAgY29uc3QgZGF0ZTogRGF0ZVRpbWVPYmplY3QgPSB0aGlzLmdldERlZmF1bHRWYWx1ZSgpO1xuXG4gICAgICAgIGNvbnN0IHZpZXdEaWdpdHM6IHN0cmluZ1tdID0gdGhpcy52aWV3VmFsdWVcbiAgICAgICAgICAgIC5zcGxpdCh0aGlzLnNlcGFyYXRvcilcbiAgICAgICAgICAgIC5tYXAoKHZhbHVlOiBzdHJpbmcpID0+IHZhbHVlKVxuICAgICAgICAgICAgLmZpbHRlcigodmFsdWUpID0+IHZhbHVlKTtcblxuICAgICAgICBjb25zdCBbZmlyc1ZpZXdEaWdpdCwgc2Vjb25kVmlld0RpZ2l0LCB0aGlyZFZpZXdEaWdpdF0gPSB2aWV3RGlnaXRzO1xuXG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1tYWdpYy1udW1iZXJzXG4gICAgICAgIGlmICh2aWV3RGlnaXRzLmxlbmd0aCAhPT0gMykge1xuICAgICAgICAgICAgdGhpcy5sYXN0VmFsdWVWYWxpZCA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5fdmFsdWUgPSBudWxsO1xuXG4gICAgICAgICAgICByZXR1cm4gc2V0VGltZW91dCgoKSA9PiB0aGlzLmNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRhdGVbdGhpcy5maXJzdERpZ2l0IS5mdWxsTmFtZV0gPSB0aGlzLmZpcnN0RGlnaXQhLnBhcnNlKGZpcnNWaWV3RGlnaXQpO1xuICAgICAgICBkYXRlW3RoaXMuc2Vjb25kRGlnaXQhLmZ1bGxOYW1lXSA9IHRoaXMuc2Vjb25kRGlnaXQhLnBhcnNlKHNlY29uZFZpZXdEaWdpdCk7XG4gICAgICAgIGRhdGVbdGhpcy50aGlyZERpZ2l0IS5mdWxsTmFtZV0gPSB0aGlzLnRoaXJkRGlnaXQhLnBhcnNlKHRoaXJkVmlld0RpZ2l0KTtcblxuICAgICAgICBjb25zdCBbZGlnaXRXaXRoWWVhciwgdmlld0RpZ2l0V2l0aFllYXJdID0gW3RoaXMuZmlyc3REaWdpdCwgdGhpcy5zZWNvbmREaWdpdCwgdGhpcy50aGlyZERpZ2l0XVxuICAgICAgICAgICAgLnJlZHVjZSgoYWNjOiBhbnksIGRpZ2l0LCBpbmRleCkgPT4gZGlnaXQhLnZhbHVlID09PSBEYXRlUGFydHMueWVhciA/IFtkaWdpdCwgdmlld0RpZ2l0c1tpbmRleF1dIDogYWNjLCBbXSk7XG5cbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLW1hZ2ljLW51bWJlcnNcbiAgICAgICAgaWYgKHZpZXdEaWdpdFdpdGhZZWFyLmxlbmd0aCA8IDMpIHtcbiAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1tYWdpYy1udW1iZXJzXG4gICAgICAgICAgICBkYXRlLnllYXIgKz0gZGF0ZS55ZWFyIDwgMzAgPyAyMDAwIDogMTkwMDtcbiAgICAgICAgfSBlbHNlIGlmICh2aWV3RGlnaXRXaXRoWWVhci5sZW5ndGggPCBkaWdpdFdpdGhZZWFyLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5sYXN0VmFsdWVWYWxpZCA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5fdmFsdWUgPSBudWxsO1xuXG4gICAgICAgICAgICByZXR1cm4gc2V0VGltZW91dCgoKSA9PiB0aGlzLmNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5ld1RpbWVPYmogPSB0aGlzLmNyZWF0ZURhdGVUaW1lKGRhdGUpO1xuXG4gICAgICAgIGlmICghbmV3VGltZU9iaikge1xuICAgICAgICAgICAgdGhpcy5sYXN0VmFsdWVWYWxpZCA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5fdmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5jdmFPbkNoYW5nZShudWxsKTtcblxuICAgICAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5jb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxhc3RWYWx1ZVZhbGlkID0gISFuZXdUaW1lT2JqO1xuXG4gICAgICAgIHRoaXMuc2V0Vmlld1ZhbHVlKHRoaXMuZ2V0VGltZVN0cmluZ0Zyb21EYXRlKG5ld1RpbWVPYmosIHRoaXMuZGF0ZUlucHV0Rm9ybWF0KSwgdHJ1ZSk7XG5cbiAgICAgICAgdGhpcy51cGRhdGVWYWx1ZShuZXdUaW1lT2JqKTtcbiAgICB9XG5cbiAgICBvbkNoYW5nZSgpIHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmRhdGVDaGFuZ2UuZW1pdChuZXcgTWNEYXRlcGlja2VySW5wdXRFdmVudCh0aGlzLCB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKiogSGFuZGxlcyBibHVyIGV2ZW50cyBvbiB0aGUgaW5wdXQuICovXG4gICAgb25CbHVyKCkge1xuICAgICAgICAvLyBSZWZvcm1hdCB0aGUgaW5wdXQgb25seSBpZiB3ZSBoYXZlIGEgdmFsaWQgdmFsdWUuXG4gICAgICAgIHRoaXMucGFyc2VPbkJsdXIoKTtcblxuICAgICAgICB0aGlzLmZvY3VzQ2hhbmdlZChmYWxzZSk7XG5cbiAgICAgICAgdGhpcy5vbklucHV0KCk7XG4gICAgfVxuXG4gICAgb25QYXN0ZSgkZXZlbnQpIHtcbiAgICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgbGV0IHJhd1ZhbHVlID0gJGV2ZW50LmNsaXBib2FyZERhdGEuZ2V0RGF0YSgndGV4dCcpO1xuXG4gICAgICAgIGlmIChyYXdWYWx1ZS5tYXRjaCgvXlxcZFxcRC8pKSB7XG4gICAgICAgICAgICByYXdWYWx1ZSA9IGAwJHtyYXdWYWx1ZX1gO1xuICAgICAgICB9XG4gICAgICAgIHJhd1ZhbHVlLnJlcGxhY2UoL1teQS1aYS16MC05XSsvZywgdGhpcy5zZXBhcmF0b3IpO1xuXG4gICAgICAgIGlmICgvW2Etel0vZ2kudGVzdChyYXdWYWx1ZSkpIHtcbiAgICAgICAgICAgIHRoaXMuaW5jb3JyZWN0SW5wdXQuZW1pdCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbWF0Y2g6IFJlZ0V4cE1hdGNoQXJyYXkgfCBudWxsID0gcmF3VmFsdWUubWF0Y2goL14oPzxmaXJzdD5cXGQrKVxcVyg/PHNlY29uZD5cXGQrKVxcVyg/PHRoaXJkPlxcZCspJC8pO1xuXG4gICAgICAgIGlmICghbWF0Y2g/Lmdyb3Vwcz8uZmlyc3QgfHwgIW1hdGNoPy5ncm91cHM/LnNlY29uZCB8fCAhbWF0Y2g/Lmdyb3Vwcz8udGhpcmQpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0Vmlld1ZhbHVlKHJhd1ZhbHVlKTtcblxuICAgICAgICAgICAgcmV0dXJuIHJhd1ZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdmFsdWUgPSBbbWF0Y2guZ3JvdXBzLmZpcnN0LCBtYXRjaC5ncm91cHMuc2Vjb25kLCBtYXRjaC5ncm91cHMudGhpcmRdLmpvaW4odGhpcy5zZXBhcmF0b3IpO1xuXG4gICAgICAgIGNvbnN0IG5ld1RpbWVPYmogPSB0aGlzLmdldERhdGVGcm9tU3RyaW5nKHZhbHVlKTtcblxuICAgICAgICBpZiAoIW5ld1RpbWVPYmopIHtcbiAgICAgICAgICAgIHRoaXMuc2V0Vmlld1ZhbHVlKHZhbHVlKTtcblxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZXRWaWV3VmFsdWUodGhpcy5nZXRUaW1lU3RyaW5nRnJvbURhdGUobmV3VGltZU9iaiwgdGhpcy5kYXRlSW5wdXRGb3JtYXQpKTtcblxuICAgICAgICB0aGlzLnVwZGF0ZVZhbHVlKG5ld1RpbWVPYmopO1xuICAgIH1cblxuICAgIHRvSVNPODYwMSh2YWx1ZTogRCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmFkYXB0ZXIudG9Jc284NjAxKHZhbHVlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNhdmVUaW1lUGFydChzZWxlY3RlZDogRCkge1xuICAgICAgICBpZiAoIXRoaXMudmFsdWUpIHsgcmV0dXJuIHNlbGVjdGVkOyB9XG5cbiAgICAgICAgY29uc3QgeWVhcnMgPSB0aGlzLmFkYXB0ZXIuZ2V0WWVhcihzZWxlY3RlZCk7XG4gICAgICAgIGNvbnN0IG1vbnRoID0gdGhpcy5hZGFwdGVyLmdldE1vbnRoKHNlbGVjdGVkKTtcbiAgICAgICAgY29uc3QgZGF5ID0gdGhpcy5hZGFwdGVyLmdldERhdGUoc2VsZWN0ZWQpO1xuXG4gICAgICAgIGNvbnN0IGhvdXJzID0gdGhpcy5hZGFwdGVyLmdldEhvdXJzKHRoaXMudmFsdWUpO1xuICAgICAgICBjb25zdCBtaW51dGVzID0gdGhpcy5hZGFwdGVyLmdldE1pbnV0ZXModGhpcy52YWx1ZSk7XG4gICAgICAgIGNvbnN0IHNlY29uZHMgPSB0aGlzLmFkYXB0ZXIuZ2V0U2Vjb25kcyh0aGlzLnZhbHVlKTtcbiAgICAgICAgY29uc3QgbWlsbGlzZWNvbmRzID0gdGhpcy5hZGFwdGVyLmdldE1pbGxpc2Vjb25kcyh0aGlzLnZhbHVlKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5hZGFwdGVyLmNyZWF0ZURhdGVUaW1lKHllYXJzLCBtb250aCwgZGF5LCBob3VycywgbWludXRlcywgc2Vjb25kcywgbWlsbGlzZWNvbmRzKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZUxvY2FsZVBhcmFtcyA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5zZXRGb3JtYXQodGhpcy5kYXRlSW5wdXRGb3JtYXQpO1xuXG4gICAgICAgIGlmICghdGhpcy51c2VQbGFjZWhvbGRlckZyb21JbnB1dCkge1xuICAgICAgICAgICAgdGhpcy5fcGxhY2Vob2xkZXIgPSB0aGlzLmxvY2FsZVNlcnZpY2UuZ2V0UGFyYW1zKCdkYXRlcGlja2VyJykucGxhY2Vob2xkZXI7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy52YWx1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldEZvcm1hdChmb3JtYXQ6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHRoaXMuc2VwYXJhdG9yID0gZm9ybWF0Lm1hdGNoKC9bYUEtelpdKyg/PHNlcGFyYXRvcj5cXFd8XFxEKVthQS16Wl0rLykuZ3JvdXBzLnNlcGFyYXRvcjtcblxuICAgICAgICB0aGlzLnNlcGFyYXRvclBvc2l0aW9ucyA9IGZvcm1hdFxuICAgICAgICAgICAgLnNwbGl0KCcnKVxuICAgICAgICAgICAgLnJlZHVjZSgoYWNjOiBhbnksIGl0ZW0sIGluZGV4OiBudW1iZXIpID0+IHRoaXMuc2VwYXJhdG9yID09PSBpdGVtID8gWy4uLmFjYywgaW5kZXggKyAxXSA6IGFjYywgW10pO1xuXG4gICAgICAgIHRoaXMuZ2V0RGlnaXRQb3NpdGlvbnMoZm9ybWF0KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZVZhbHVlKG5ld1ZhbHVlOiBEKSB7XG4gICAgICAgIGlmICghdGhpcy5hZGFwdGVyLnNhbWVEYXRlKG5ld1ZhbHVlLCB0aGlzLnZhbHVlKSkge1xuICAgICAgICAgICAgdGhpcy5fdmFsdWUgPSBuZXdWYWx1ZTtcbiAgICAgICAgICAgIHRoaXMuY3ZhT25DaGFuZ2UobmV3VmFsdWUpO1xuICAgICAgICAgICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KG5ld1ZhbHVlKTtcbiAgICAgICAgICAgIHRoaXMuZGF0ZUlucHV0LmVtaXQobmV3IE1jRGF0ZXBpY2tlcklucHV0RXZlbnQodGhpcywgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29udHJvbD8udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc0tleUZvckNsb3NlKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAoZXZlbnQuYWx0S2V5ICYmIGV2ZW50LmtleUNvZGUgPT09IFVQX0FSUk9XKSB8fCBldmVudC5rZXlDb2RlID09PSBFU0NBUEU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc0tleUZvck9wZW4oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGV2ZW50LmFsdEtleSAmJiBldmVudC5rZXlDb2RlID09PSBET1dOX0FSUk9XO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNMZXR0ZXJLZXkoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGlzTGV0dGVyS2V5KGV2ZW50KSAmJiAhZXZlbnQuY3RybEtleSAmJiAhZXZlbnQubWV0YUtleTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzS2V5Rm9yQnlQYXNzKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAoaGFzTW9kaWZpZXJLZXkoZXZlbnQpICYmIChpc1ZlcnRpY2FsTW92ZW1lbnQoZXZlbnQpIHx8IGlzSG9yaXpvbnRhbE1vdmVtZW50KGV2ZW50KSkpIHx8XG4gICAgICAgIGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQubWV0YUtleSB8fFxuICAgICAgICBbREVMRVRFLCBCQUNLU1BBQ0UsIFRBQl0uaW5jbHVkZXMoZXZlbnQua2V5Q29kZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzcGFjZUtleUhhbmRsZXIoZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25TdGFydCA9PT0gdGhpcy5zZWxlY3Rpb25FbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXROZXdWYWx1ZShldmVudC5rZXksIHRoaXMuc2VsZWN0aW9uU3RhcnQgYXMgbnVtYmVyKTtcbiAgICAgICAgICAgIHRoaXMuc2V0Vmlld1ZhbHVlKHZhbHVlKTtcblxuICAgICAgICAgICAgc2V0VGltZW91dCh0aGlzLm9uSW5wdXQpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0aW9uU3RhcnQgIT09IHRoaXMuc2VsZWN0aW9uRW5kKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdE5leHREaWdpdCh0aGlzLnNlbGVjdGlvblN0YXJ0IGFzIG51bWJlciwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGdldE5ld1ZhbHVlKGtleTogc3RyaW5nLCBwb3NpdGlvbjogbnVtYmVyKSB7XG4gICAgICAgIHJldHVybiBbdGhpcy52aWV3VmFsdWUuc2xpY2UoMCwgcG9zaXRpb24pLCBrZXksIHRoaXMudmlld1ZhbHVlLnNsaWNlKHBvc2l0aW9uKV0uam9pbignJyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRWaWV3VmFsdWUodmFsdWU6IHN0cmluZywgc2F2ZVBvc2l0aW9uOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICAgICAgaWYgKHNhdmVQb3NpdGlvbikge1xuICAgICAgICAgICAgY29uc3Qgc2VsZWN0aW9uU3RhcnQgPSB0aGlzLnNlbGVjdGlvblN0YXJ0O1xuICAgICAgICAgICAgY29uc3Qgc2VsZWN0aW9uRW5kID0gdGhpcy5zZWxlY3Rpb25FbmQ7XG5cbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICd2YWx1ZScsIHZhbHVlKTtcblxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25TdGFydCA9IHNlbGVjdGlvblN0YXJ0O1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25FbmQgPSBzZWxlY3Rpb25FbmQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFByb3BlcnR5KHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAndmFsdWUnLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHJlcGxhY2VTeW1ib2xzKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdmFsdWVcbiAgICAgICAgICAgIC5zcGxpdCh0aGlzLnNlcGFyYXRvcilcbiAgICAgICAgICAgIC5tYXAoKHBhcnQ6IHN0cmluZykgPT4gcGFydC5yZXBsYWNlKC9eKFswLTldKylcXFckLywgJzAkMScpKVxuICAgICAgICAgICAgLmpvaW4odGhpcy5zZXBhcmF0b3IpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0RGF0ZUZyb21TdHJpbmcodGltZVN0cmluZzogc3RyaW5nKTogRCB8IG51bGwge1xuICAgICAgICBpZiAoIXRpbWVTdHJpbmcgfHwgdGltZVN0cmluZy5sZW5ndGggPCB0aGlzLmZpcnN0RGlnaXQhLmxlbmd0aCkgeyByZXR1cm4gbnVsbDsgfVxuXG4gICAgICAgIGNvbnN0IGRhdGUgPSB0aGlzLmdldERlZmF1bHRWYWx1ZSgpO1xuXG4gICAgICAgIGNvbnN0IHZpZXdEaWdpdHM6IHN0cmluZ1tdID0gdGltZVN0cmluZ1xuICAgICAgICAgICAgLnNwbGl0KHRoaXMuc2VwYXJhdG9yKVxuICAgICAgICAgICAgLm1hcCgodmFsdWU6IHN0cmluZykgPT4gdmFsdWUpO1xuXG4gICAgICAgIGNvbnN0IFtmaXJzVmlld0RpZ2l0LCBzZWNvbmRWaWV3RGlnaXQsIHRoaXJkVmlld0RpZ2l0XSA9IHZpZXdEaWdpdHM7XG5cblxuICAgICAgICBpZiAodmlld0RpZ2l0cy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIGlmICgvXFxELy50ZXN0KGZpcnNWaWV3RGlnaXQpIHx8IGZpcnNWaWV3RGlnaXQubGVuZ3RoIDwgdGhpcy5maXJzdERpZ2l0IS5sZW5ndGgpIHsgcmV0dXJuIG51bGw7IH1cblxuICAgICAgICAgICAgZGF0ZVt0aGlzLmZpcnN0RGlnaXQhLmZ1bGxOYW1lXSA9IHRoaXMuZmlyc3REaWdpdCEucGFyc2UoZmlyc1ZpZXdEaWdpdCk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmZpcnN0RGlnaXQhLmlzRGF5KSB7XG4gICAgICAgICAgICAgICAgZGF0ZS5tb250aCA9IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1tYWdpYy1udW1iZXJzXG4gICAgICAgIH0gZWxzZSBpZiAodmlld0RpZ2l0cy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgIGlmIChmaXJzVmlld0RpZ2l0Lmxlbmd0aCA8IHRoaXMuZmlyc3REaWdpdCEubGVuZ3RoIHx8IHNlY29uZFZpZXdEaWdpdC5sZW5ndGggPCB0aGlzLnNlY29uZERpZ2l0IS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZGF0ZVt0aGlzLmZpcnN0RGlnaXQhLmZ1bGxOYW1lXSA9IHRoaXMuZmlyc3REaWdpdCEucGFyc2UoZmlyc1ZpZXdEaWdpdCk7XG4gICAgICAgICAgICBkYXRlW3RoaXMuc2Vjb25kRGlnaXQhLmZ1bGxOYW1lXSA9IHRoaXMuc2Vjb25kRGlnaXQhLnBhcnNlKHNlY29uZFZpZXdEaWdpdCk7XG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1tYWdpYy1udW1iZXJzXG4gICAgICAgIH0gZWxzZSBpZiAodmlld0RpZ2l0cy5sZW5ndGggPT09IDMpIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBmaXJzVmlld0RpZ2l0Lmxlbmd0aCA8IHRoaXMuZmlyc3REaWdpdCEubGVuZ3RoIHx8XG4gICAgICAgICAgICAgICAgc2Vjb25kVmlld0RpZ2l0Lmxlbmd0aCA8IHRoaXMuc2Vjb25kRGlnaXQhLmxlbmd0aCB8fFxuICAgICAgICAgICAgICAgIHRoaXJkVmlld0RpZ2l0Lmxlbmd0aCA8IHRoaXMudGhpcmREaWdpdCEubGVuZ3RoXG4gICAgICAgICAgICApIHsgcmV0dXJuIG51bGw7IH1cblxuICAgICAgICAgICAgZGF0ZVt0aGlzLmZpcnN0RGlnaXQhLmZ1bGxOYW1lXSA9IHRoaXMuZmlyc3REaWdpdCEucGFyc2UoZmlyc1ZpZXdEaWdpdCk7XG4gICAgICAgICAgICBkYXRlW3RoaXMuc2Vjb25kRGlnaXQhLmZ1bGxOYW1lXSA9IHRoaXMuc2Vjb25kRGlnaXQhLnBhcnNlKHNlY29uZFZpZXdEaWdpdCk7XG4gICAgICAgICAgICBkYXRlW3RoaXMudGhpcmREaWdpdCEuZnVsbE5hbWVdID0gdGhpcy50aGlyZERpZ2l0IS5wYXJzZSh0aGlyZFZpZXdEaWdpdCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZURhdGVUaW1lKGRhdGUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0RGVmYXVsdFZhbHVlKCk6IERhdGVUaW1lT2JqZWN0IHtcbiAgICAgICAgY29uc3QgZGVmYXVsdFZhbHVlID0gdGhpcy52YWx1ZSB8fCB0aGlzLmFkYXB0ZXIudG9kYXkoKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeWVhcjogdGhpcy5hZGFwdGVyLmdldFllYXIoZGVmYXVsdFZhbHVlKSxcbiAgICAgICAgICAgIG1vbnRoOiB0aGlzLmFkYXB0ZXIuZ2V0TW9udGgoZGVmYXVsdFZhbHVlKSxcbiAgICAgICAgICAgIGRhdGU6IHRoaXMuYWRhcHRlci5nZXREYXRlKGRlZmF1bHRWYWx1ZSksXG4gICAgICAgICAgICBob3VyczogdGhpcy5hZGFwdGVyLmdldEhvdXJzKGRlZmF1bHRWYWx1ZSksXG4gICAgICAgICAgICBtaW51dGVzOiB0aGlzLmFkYXB0ZXIuZ2V0TWludXRlcyhkZWZhdWx0VmFsdWUpLFxuICAgICAgICAgICAgc2Vjb25kczogdGhpcy5hZGFwdGVyLmdldFNlY29uZHMoZGVmYXVsdFZhbHVlKSxcbiAgICAgICAgICAgIG1pbGxpc2Vjb25kczogdGhpcy5hZGFwdGVyLmdldE1pbGxpc2Vjb25kcyhkZWZhdWx0VmFsdWUpXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRUaW1lU3RyaW5nRnJvbURhdGUodmFsdWU6IEQgfCBudWxsLCB0aW1lRm9ybWF0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBpZiAoIXZhbHVlIHx8ICF0aGlzLmFkYXB0ZXIuaXNWYWxpZCh2YWx1ZSkpIHsgcmV0dXJuICcnOyB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuYWRhcHRlci5mb3JtYXQodmFsdWUsIHRpbWVGb3JtYXQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0RGF0ZUVkaXRNZXRyaWNzKGN1cnNvclBvc2l0aW9uOiBudW1iZXIpOiBbXG4gICAgICAgIG1vZGlmaWVkVGltZVBhcnQ6IERhdGVQYXJ0cyxcbiAgICAgICAgY3Vyc29yU3RhcnRQb3NpdGlvbjogbnVtYmVyLFxuICAgICAgICBjdXJzb3JFbmRQb3NpdGlvbjogbnVtYmVyXG4gICAgXSB7XG4gICAgICAgIGZvciAoY29uc3QgZGlnaXQgb2YgW3RoaXMuZmlyc3REaWdpdCwgdGhpcy5zZWNvbmREaWdpdCwgdGhpcy50aGlyZERpZ2l0XSkge1xuICAgICAgICAgICAgaWYgKGN1cnNvclBvc2l0aW9uID49IGRpZ2l0IS5zdGFydCAmJiBjdXJzb3JQb3NpdGlvbiA8PSBkaWdpdCEuZW5kKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtkaWdpdCEudmFsdWUsIGRpZ2l0IS5zdGFydCwgZGlnaXQhLmVuZF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gW3RoaXMudGhpcmREaWdpdCEudmFsdWUsIHRoaXMudGhpcmREaWdpdCEuc3RhcnQsIHRoaXMudGhpcmREaWdpdCEuZW5kXTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGluY3JlbWVudERhdGUoZGF0ZVZhbDogRCwgd2hhdFRvSW5jcmVtZW50OiBEYXRlUGFydHMpOiBEIHtcbiAgICAgICAgbGV0IHllYXIgPSB0aGlzLmFkYXB0ZXIuZ2V0WWVhcihkYXRlVmFsKTtcbiAgICAgICAgbGV0IG1vbnRoID0gdGhpcy5hZGFwdGVyLmdldE1vbnRoKGRhdGVWYWwpO1xuICAgICAgICBsZXQgZGF5ID0gdGhpcy5hZGFwdGVyLmdldERhdGUoZGF0ZVZhbCk7XG5cbiAgICAgICAgc3dpdGNoICh3aGF0VG9JbmNyZW1lbnQpIHtcbiAgICAgICAgICAgIGNhc2UgRGF0ZVBhcnRzLmRheTpcbiAgICAgICAgICAgICAgICBkYXkrKztcblxuICAgICAgICAgICAgICAgIGlmIChkYXkgPiB0aGlzLmFkYXB0ZXIuZ2V0TnVtRGF5c0luTW9udGgoZGF0ZVZhbCkpIHtcbiAgICAgICAgICAgICAgICAgICAgZGF5ID0gMTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgRGF0ZVBhcnRzLm1vbnRoOlxuICAgICAgICAgICAgICAgIG1vbnRoKys7XG5cbiAgICAgICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tbWFnaWMtbnVtYmVyc1xuICAgICAgICAgICAgICAgIGlmIChtb250aCA+IDExKSB7XG4gICAgICAgICAgICAgICAgICAgIG1vbnRoID0gMDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBsYXN0RGF5ID0gdGhpcy5nZXRMYXN0RGF5Rm9yKHllYXIsIG1vbnRoKTtcblxuICAgICAgICAgICAgICAgIGlmIChkYXkgPiBsYXN0RGF5KSB7XG4gICAgICAgICAgICAgICAgICAgIGRheSA9IGxhc3REYXk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIERhdGVQYXJ0cy55ZWFyOlxuICAgICAgICAgICAgICAgIHllYXIrKztcblxuICAgICAgICAgICAgICAgIGlmICh5ZWFyID4gTUFYX1lFQVIpIHtcbiAgICAgICAgICAgICAgICAgICAgeWVhciA9IDE7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlRGF0ZSh5ZWFyLCBtb250aCwgZGF5KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldExhc3REYXlGb3IoeWVhcjogbnVtYmVyLCBtb250aDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRhcHRlci5nZXROdW1EYXlzSW5Nb250aCh0aGlzLmNyZWF0ZURhdGUoeWVhciwgbW9udGgsIDEpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGRlY3JlbWVudERhdGUoZGF0ZVZhbDogRCwgd2hhdFRvRGVjcmVtZW50OiBEYXRlUGFydHMpOiBEIHtcbiAgICAgICAgbGV0IHllYXIgPSB0aGlzLmFkYXB0ZXIuZ2V0WWVhcihkYXRlVmFsKTtcbiAgICAgICAgbGV0IG1vbnRoID0gdGhpcy5hZGFwdGVyLmdldE1vbnRoKGRhdGVWYWwpO1xuICAgICAgICBsZXQgZGF5ID0gdGhpcy5hZGFwdGVyLmdldERhdGUoZGF0ZVZhbCk7XG5cbiAgICAgICAgc3dpdGNoICh3aGF0VG9EZWNyZW1lbnQpIHtcbiAgICAgICAgICAgIGNhc2UgRGF0ZVBhcnRzLmRheTpcbiAgICAgICAgICAgICAgICBkYXktLTtcblxuICAgICAgICAgICAgICAgIGlmIChkYXkgPCAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGRheSA9IHRoaXMuYWRhcHRlci5nZXROdW1EYXlzSW5Nb250aChkYXRlVmFsKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgRGF0ZVBhcnRzLm1vbnRoOlxuICAgICAgICAgICAgICAgIG1vbnRoLS07XG5cbiAgICAgICAgICAgICAgICBpZiAobW9udGggPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1tYWdpYy1udW1iZXJzXG4gICAgICAgICAgICAgICAgICAgIG1vbnRoID0gMTE7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgbGFzdERheSA9IHRoaXMuZ2V0TGFzdERheUZvcih5ZWFyLCBtb250aCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoZGF5ID4gbGFzdERheSkge1xuICAgICAgICAgICAgICAgICAgICBkYXkgPSBsYXN0RGF5O1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBEYXRlUGFydHMueWVhcjpcbiAgICAgICAgICAgICAgICB5ZWFyLS07XG5cbiAgICAgICAgICAgICAgICBpZiAoeWVhciA8IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgeWVhciA9IE1BWF9ZRUFSO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZURhdGUoeWVhciwgbW9udGgsIGRheSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB2ZXJ0aWNhbEFycm93S2V5SGFuZGxlcihrZXlDb2RlOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLnZhbHVlKSB7IHJldHVybjsgfVxuXG4gICAgICAgIGxldCBjaGFuZ2VkVGltZTtcblxuICAgICAgICBjb25zdCBbbW9kaWZpZWRUaW1lUGFydCwgc2VsZWN0aW9uU3RhcnQsIHNlbGVjdGlvbkVuZF0gPSB0aGlzLmdldERhdGVFZGl0TWV0cmljcyh0aGlzLnNlbGVjdGlvblN0YXJ0IGFzIG51bWJlcik7XG5cbiAgICAgICAgaWYgKGtleUNvZGUgPT09IFVQX0FSUk9XKSB7XG4gICAgICAgICAgICBjaGFuZ2VkVGltZSA9IHRoaXMuaW5jcmVtZW50RGF0ZSh0aGlzLnZhbHVlLCBtb2RpZmllZFRpbWVQYXJ0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChrZXlDb2RlID09PSBET1dOX0FSUk9XKSB7XG4gICAgICAgICAgICBjaGFuZ2VkVGltZSA9IHRoaXMuZGVjcmVtZW50RGF0ZSh0aGlzLnZhbHVlLCBtb2RpZmllZFRpbWVQYXJ0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudmFsdWUgPSBjaGFuZ2VkVGltZTtcblxuICAgICAgICB0aGlzLnNlbGVjdGlvblN0YXJ0ID0gc2VsZWN0aW9uU3RhcnQ7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uRW5kID0gc2VsZWN0aW9uRW5kO1xuXG4gICAgICAgIHRoaXMuY3ZhT25DaGFuZ2UoY2hhbmdlZFRpbWUpO1xuXG4gICAgICAgIHRoaXMub25DaGFuZ2UoKTtcbiAgICAgICAgdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgY2hhbmdlQ2FyZXRQb3NpdGlvbihrZXlDb2RlOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLnZhbHVlKSB7IHJldHVybjsgfVxuXG4gICAgICAgIGxldCBjdXJzb3JQb3MgPSB0aGlzLnNlbGVjdGlvblN0YXJ0IGFzIG51bWJlcjtcblxuICAgICAgICBpZiAoW0hPTUUsIFBBR0VfVVBdLmluY2x1ZGVzKGtleUNvZGUpKSB7XG4gICAgICAgICAgICBjdXJzb3JQb3MgPSAwO1xuICAgICAgICB9IGVsc2UgaWYgKFtFTkQsIFBBR0VfRE9XTl0uaW5jbHVkZXMoa2V5Q29kZSkpIHtcbiAgICAgICAgICAgIGN1cnNvclBvcyA9IHRoaXMudmlld1ZhbHVlLmxlbmd0aDtcbiAgICAgICAgfSBlbHNlIGlmIChrZXlDb2RlID09PSBMRUZUX0FSUk9XKSB7XG4gICAgICAgICAgICBjdXJzb3JQb3MgPSBjdXJzb3JQb3MgPT09IDAgPyB0aGlzLnZpZXdWYWx1ZS5sZW5ndGggOiBjdXJzb3JQb3MgLSAxO1xuICAgICAgICB9IGVsc2UgaWYgKGtleUNvZGUgPT09IFJJR0hUX0FSUk9XKSB7XG4gICAgICAgICAgICBjb25zdCBuZXh0U2VwYXJhdG9yUG9zOiBudW1iZXIgPSB0aGlzLnZpZXdWYWx1ZS5pbmRleE9mKHRoaXMuc2VwYXJhdG9yLCBjdXJzb3JQb3MpO1xuXG4gICAgICAgICAgICBjdXJzb3JQb3MgPSBuZXh0U2VwYXJhdG9yUG9zID8gbmV4dFNlcGFyYXRvclBvcyArIDEgOiAwO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZWxlY3REaWdpdEJ5Q3Vyc29yKGN1cnNvclBvcyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZWxlY3REaWdpdEJ5Q3Vyc29yKGN1cnNvclBvczogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgWywgc2VsZWN0aW9uU3RhcnQsIHNlbGVjdGlvbkVuZF0gPSB0aGlzLmdldERhdGVFZGl0TWV0cmljcyhjdXJzb3JQb3MpO1xuXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvblN0YXJ0ID0gc2VsZWN0aW9uU3RhcnQ7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbkVuZCA9IHNlbGVjdGlvbkVuZDtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZWxlY3ROZXh0RGlnaXRCeUN1cnNvcihjdXJzb3JQb3M6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IFssICwgZW5kUG9zaXRpb25PZkN1cnJlbnREaWdpdF0gPSB0aGlzLmdldERhdGVFZGl0TWV0cmljcyhjdXJzb3JQb3MpO1xuICAgICAgICAgICAgY29uc3QgWywgc2VsZWN0aW9uU3RhcnQsIHNlbGVjdGlvbkVuZF0gPSB0aGlzLmdldERhdGVFZGl0TWV0cmljcyhlbmRQb3NpdGlvbk9mQ3VycmVudERpZ2l0ICsgMSk7XG5cbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uU3RhcnQgPSBzZWxlY3Rpb25TdGFydDtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uRW5kID0gc2VsZWN0aW9uRW5kO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNlbGVjdE5leHREaWdpdChjdXJzb3JQb3M6IG51bWJlciwgY3ljbGU6IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGxhc3RWYWx1ZSA9IGN5Y2xlID8gMCA6IGN1cnNvclBvcztcbiAgICAgICAgICAgIGNvbnN0IG5leHRTZXBhcmF0b3JQb3M6IG51bWJlciA9IHRoaXMudmlld1ZhbHVlLmluZGV4T2YodGhpcy5zZXBhcmF0b3IsIGN1cnNvclBvcyk7XG5cbiAgICAgICAgICAgIGNvbnN0IG5ld0N1cnNvclBvcyA9IG5leHRTZXBhcmF0b3JQb3MgPiAwID8gbmV4dFNlcGFyYXRvclBvcyArIDEgOiBsYXN0VmFsdWU7XG5cbiAgICAgICAgICAgIGNvbnN0IFssIHNlbGVjdGlvblN0YXJ0LCBzZWxlY3Rpb25FbmRdID0gdGhpcy5nZXREYXRlRWRpdE1ldHJpY3MobmV3Q3Vyc29yUG9zKTtcblxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25TdGFydCA9IHNlbGVjdGlvblN0YXJ0O1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25FbmQgPSBzZWxlY3Rpb25FbmQ7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKiBDaGVja3Mgd2hldGhlciB0aGUgaW5wdXQgaXMgaW52YWxpZCBiYXNlZCBvbiB0aGUgbmF0aXZlIHZhbGlkYXRpb24uICovXG4gICAgcHJpdmF0ZSBpc0JhZElucHV0KCk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCB2YWxpZGl0eSA9ICg8SFRNTElucHV0RWxlbWVudD4gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpLnZhbGlkaXR5O1xuXG4gICAgICAgIHJldHVybiB2YWxpZGl0eSAmJiB2YWxpZGl0eS5iYWRJbnB1dDtcbiAgICB9XG5cbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tZW1wdHlcbiAgICBwcml2YXRlIGN2YU9uQ2hhbmdlOiAodmFsdWU6IGFueSkgPT4gdm9pZCA9ICgpID0+IHt9O1xuXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWVtcHR5XG4gICAgcHJpdmF0ZSB2YWxpZGF0b3JPbkNoYW5nZSA9ICgpID0+IHt9O1xuXG4gICAgLyoqIFRoZSBmb3JtIGNvbnRyb2wgdmFsaWRhdG9yIGZvciB3aGV0aGVyIHRoZSBpbnB1dCBwYXJzZXMuICovXG4gICAgcHJpdmF0ZSBwYXJzZVZhbGlkYXRvcjogVmFsaWRhdG9yRm4gPSAoKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5mb2N1c2VkIHx8XG4gICAgICAgICAgICB0aGlzLmVtcHR5IHx8XG4gICAgICAgICAgICB0aGlzLmxhc3RWYWx1ZVZhbGlkID8gbnVsbCA6IHsgbWNEYXRlcGlja2VyUGFyc2U6IHsgdGV4dDogdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQudmFsdWUgfSB9O1xuICAgIH1cblxuICAgIC8qKiBUaGUgZm9ybSBjb250cm9sIHZhbGlkYXRvciBmb3IgdGhlIG1pbiBkYXRlLiAqL1xuICAgIHByaXZhdGUgbWluVmFsaWRhdG9yOiBWYWxpZGF0b3JGbiA9IChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCA9PiB7XG4gICAgICAgIGNvbnN0IGNvbnRyb2xWYWx1ZSA9IHRoaXMuYWRhcHRlci5kZXNlcmlhbGl6ZShjb250cm9sLnZhbHVlKTtcblxuICAgICAgICByZXR1cm4gIXRoaXMubWluIHx8ICFjb250cm9sVmFsdWUgfHwgdGhpcy5hZGFwdGVyLmNvbXBhcmVEYXRlVGltZSh0aGlzLm1pbiwgY29udHJvbFZhbHVlKSA8PSAwID9cbiAgICAgICAgICAgIG51bGwgOlxuICAgICAgICAgICAgeyBtY0RhdGVwaWNrZXJNaW46IHsgbWluOiB0aGlzLm1pbiwgYWN0dWFsOiBjb250cm9sVmFsdWUgfSB9O1xuICAgIH1cblxuICAgIC8qKiBUaGUgZm9ybSBjb250cm9sIHZhbGlkYXRvciBmb3IgdGhlIG1heCBkYXRlLiAqL1xuICAgIHByaXZhdGUgbWF4VmFsaWRhdG9yOiBWYWxpZGF0b3JGbiA9IChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCA9PiB7XG4gICAgICAgIGNvbnN0IGNvbnRyb2xWYWx1ZSA9IHRoaXMuYWRhcHRlci5kZXNlcmlhbGl6ZShjb250cm9sLnZhbHVlKTtcblxuICAgICAgICByZXR1cm4gIXRoaXMubWF4IHx8ICFjb250cm9sVmFsdWUgfHwgdGhpcy5hZGFwdGVyLmNvbXBhcmVEYXRlVGltZSh0aGlzLm1heCwgY29udHJvbFZhbHVlKSA+PSAwID9cbiAgICAgICAgICAgIG51bGwgOlxuICAgICAgICAgICAgeyBtY0RhdGVwaWNrZXJNYXg6IHsgbWF4OiB0aGlzLm1heCwgYWN0dWFsOiBjb250cm9sVmFsdWUgfSB9O1xuICAgIH1cblxuICAgIC8qKiBUaGUgZm9ybSBjb250cm9sIHZhbGlkYXRvciBmb3IgdGhlIGRhdGUgZmlsdGVyLiAqL1xuICAgIHByaXZhdGUgZmlsdGVyVmFsaWRhdG9yOiBWYWxpZGF0b3JGbiA9IChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCA9PiB7XG4gICAgICAgIGNvbnN0IGNvbnRyb2xWYWx1ZSA9IHRoaXMuYWRhcHRlci5kZXNlcmlhbGl6ZShjb250cm9sLnZhbHVlKTtcblxuICAgICAgICByZXR1cm4gIXRoaXMuZGF0ZUZpbHRlciB8fCAhY29udHJvbFZhbHVlIHx8IHRoaXMuZGF0ZUZpbHRlcihjb250cm9sVmFsdWUpID9cbiAgICAgICAgICAgIG51bGwgOiB7IG1jRGF0ZXBpY2tlckZpbHRlcjogdHJ1ZSB9O1xuICAgIH1cblxuICAgIC8qKiBGb3JtYXRzIGEgdmFsdWUgYW5kIHNldHMgaXQgb24gdGhlIGlucHV0IGVsZW1lbnQuICovXG4gICAgcHJpdmF0ZSBmb3JtYXRWYWx1ZSh2YWx1ZTogRCB8IG51bGwpIHtcbiAgICAgICAgY29uc3QgZm9ybWF0dGVkVmFsdWUgPSB2YWx1ZSA/IHRoaXMuYWRhcHRlci5mb3JtYXQodmFsdWUsIHRoaXMuZGF0ZUlucHV0Rm9ybWF0KSA6ICcnO1xuXG4gICAgICAgIHRoaXMuc2V0Vmlld1ZhbHVlKGZvcm1hdHRlZFZhbHVlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldENvbnRyb2woY29udHJvbDogQWJzdHJhY3RDb250cm9sKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbnRyb2wpIHsgcmV0dXJuOyB9XG5cbiAgICAgICAgdGhpcy5jb250cm9sID0gY29udHJvbDtcblxuICAgICAgICB0aGlzLmNvbnRyb2wudmFsdWVDaGFuZ2VzXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCh2YWx1ZSkgPT4gdGhpcy5fdmFsdWUgPSB2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIG9iaiBUaGUgb2JqZWN0IHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIFRoZSBnaXZlbiBvYmplY3QgaWYgaXQgaXMgYm90aCBhIGRhdGUgaW5zdGFuY2UgYW5kIHZhbGlkLCBvdGhlcndpc2UgbnVsbC5cbiAgICAgKi9cbiAgICBwcml2YXRlIGdldFZhbGlkRGF0ZU9yTnVsbChvYmo6IGFueSk6IEQgfCBudWxsIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLmFkYXB0ZXIuaXNEYXRlSW5zdGFuY2Uob2JqKSAmJiB0aGlzLmFkYXB0ZXIuaXNWYWxpZChvYmopKSA/IG9iaiA6IG51bGw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXREaWdpdFBvc2l0aW9ucyhmb3JtYXQ6IHN0cmluZykge1xuICAgICAgICB0aGlzLmZpcnN0RGlnaXQgPSB0aGlzLnNlY29uZERpZ2l0ID0gdGhpcy50aGlyZERpZ2l0ID0gbnVsbDtcblxuICAgICAgICBjb25zdCBmb3JtYXRJbkxvd2VyQ2FzZSA9IGZvcm1hdC50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgIGZvcm1hdEluTG93ZXJDYXNlXG4gICAgICAgICAgICAuc3BsaXQoJycpXG4gICAgICAgICAgICAucmVkdWNlKFxuICAgICAgICAgICAgICAgICh7IHByZXYsIGxlbmd0aCwgc3RhcnQgfTogYW55LCB2YWx1ZTogc3RyaW5nLCBpbmRleDogbnVtYmVyLCBhcnIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSB0aGlzLnNlcGFyYXRvciB8fCAoYXJyLmxlbmd0aCAtIDEpID09PSBpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmZpcnN0RGlnaXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZpcnN0RGlnaXQgPSBuZXcgRGF0ZURpZ2l0KHByZXYsIHN0YXJ0LCBsZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghdGhpcy5zZWNvbmREaWdpdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2Vjb25kRGlnaXQgPSBuZXcgRGF0ZURpZ2l0KHByZXYsIHN0YXJ0LCBsZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghdGhpcy50aGlyZERpZ2l0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50aGlyZERpZ2l0ID0gbmV3IERhdGVEaWdpdChwcmV2LCBzdGFydCwgYXJyLmxlbmd0aCAtIHN0YXJ0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGU6bm8tcGFyYW1ldGVyLXJlYXNzaWdubWVudFxuICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gaW5kZXggKyAxO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoKys7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBwcmV2OiB2YWx1ZSwgbGVuZ3RoLCBzdGFydCB9O1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgeyBsZW5ndGg6IDAsIHN0YXJ0OiAwIH1cbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmZpcnN0RGlnaXQgfHwgIXRoaXMuc2Vjb25kRGlnaXQgfHwgIXRoaXMudGhpcmREaWdpdCkge1xuICAgICAgICAgICAgRXJyb3IoYENhbicgdCB1c2UgdGhpcyBmb3JtYXQ6ICR7Zm9ybWF0fWApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVEYXRlKHllYXI6IG51bWJlciwgbW9udGg6IG51bWJlciwgZGF5OiBudW1iZXIpOiBEIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRhcHRlci5jcmVhdGVEYXRlVGltZShcbiAgICAgICAgICAgIHllYXIsXG4gICAgICAgICAgICBtb250aCxcbiAgICAgICAgICAgIGRheSxcbiAgICAgICAgICAgIHRoaXMuYWRhcHRlci5nZXRIb3Vycyh0aGlzLnZhbHVlIGFzIEQpLFxuICAgICAgICAgICAgdGhpcy5hZGFwdGVyLmdldE1pbnV0ZXModGhpcy52YWx1ZSBhcyBEKSxcbiAgICAgICAgICAgIHRoaXMuYWRhcHRlci5nZXRTZWNvbmRzKHRoaXMudmFsdWUgYXMgRCksXG4gICAgICAgICAgICB0aGlzLmFkYXB0ZXIuZ2V0TWlsbGlzZWNvbmRzKHRoaXMudmFsdWUgYXMgRClcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZURhdGVUaW1lKHZhbHVlOiBEYXRlVGltZU9iamVjdCk6IEQgfCBudWxsIHtcbiAgICAgICAgaWYgKE9iamVjdC52YWx1ZXModmFsdWUpLnNvbWUoaXNOYU4pKSB7IHJldHVybiBudWxsOyB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuYWRhcHRlci5jcmVhdGVEYXRlVGltZShcbiAgICAgICAgICAgIHZhbHVlLnllYXIsXG4gICAgICAgICAgICB2YWx1ZS5tb250aCAtIDEsXG4gICAgICAgICAgICB2YWx1ZS5kYXRlLFxuICAgICAgICAgICAgdmFsdWUuaG91cnMsXG4gICAgICAgICAgICB2YWx1ZS5taW51dGVzLFxuICAgICAgICAgICAgdmFsdWUuc2Vjb25kcyxcbiAgICAgICAgICAgIHZhbHVlLm1pbGxpc2Vjb25kc1xuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgY29ycmVjdEN1cnNvclBvc2l0aW9uKCkge1xuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25TdGFydCAmJiB0aGlzLnNlcGFyYXRvclBvc2l0aW9ucy5pbmNsdWRlcyh0aGlzLnNlbGVjdGlvblN0YXJ0KSkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25TdGFydCA9IHRoaXMuc2VsZWN0aW9uU3RhcnQgLSAxO1xuICAgICAgICB9XG4gICAgfVxufVxuIl19