primekit 1.0.11 → 1.0.13

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 (246) hide show
  1. package/README.md +25 -25
  2. package/esm2022/lib/lib/atomix-alert/atomix-alert.component.mjs +76 -0
  3. package/esm2022/lib/lib/atomix-autocomplete/atomix-autocomplete.component.mjs +108 -0
  4. package/esm2022/lib/lib/atomix-button/atomix-button.component.mjs +49 -0
  5. package/esm2022/lib/lib/atomix-button/atomix-button.models.mjs +2 -0
  6. package/esm2022/lib/lib/atomix-calendar/atomix-calendar.component.mjs +90 -0
  7. package/esm2022/lib/lib/atomix-card/atomix-card.component.mjs +24 -0
  8. package/esm2022/lib/lib/atomix-confirmation-dialog/atomix-confirmation-dialog.component.mjs +28 -0
  9. package/esm2022/lib/lib/atomix-daterange-calendar/atomix-daterange-calendar.component.mjs +717 -0
  10. package/esm2022/lib/lib/atomix-divider/atomix-divider.component.mjs +27 -0
  11. package/esm2022/lib/lib/atomix-dropdown/atomix-dropdown.component.mjs +105 -0
  12. package/esm2022/lib/lib/atomix-dynamic-dialog/atomix-dynamic-dialog.component.mjs +38 -0
  13. package/esm2022/lib/lib/atomix-dynamic-dialog/atomix-dynamic-dialog.models.mjs +2 -0
  14. package/esm2022/lib/lib/atomix-form/atomix-form-autocomplete/atomix-form-autocomplete.component.mjs +67 -0
  15. package/esm2022/lib/lib/atomix-form/atomix-form-calendar/atomix-form-calendar.component.mjs +59 -0
  16. package/esm2022/lib/lib/atomix-form/atomix-form-checkbox/atomix-form-checkbox.component.mjs +48 -0
  17. package/esm2022/lib/lib/atomix-form/atomix-form-chips/atomix-form-chips.component.mjs +54 -0
  18. package/esm2022/lib/lib/atomix-form/atomix-form-chips/form.chips.models.mjs +2 -0
  19. package/esm2022/lib/lib/atomix-form/atomix-form-dropdown/atomix-form-dropdown.component.mjs +70 -0
  20. package/esm2022/lib/lib/atomix-form/atomix-form-input-component/atomix-form-input-component.component.mjs +80 -0
  21. package/esm2022/lib/lib/atomix-form/atomix-form-inputmask-component/atomix-form-inputmask-component.component.mjs +48 -0
  22. package/esm2022/lib/lib/atomix-form/atomix-form-password-component/atomix-form-password-component.component.mjs +48 -0
  23. package/esm2022/lib/lib/atomix-form/atomix-form-radio-button/atomix-radio-button.component.mjs +46 -0
  24. package/esm2022/lib/lib/atomix-form/atomix-form-textarea/atomix-form-textarea.component.mjs +46 -0
  25. package/esm2022/lib/lib/atomix-input/atomix-input.component.mjs +94 -0
  26. package/esm2022/lib/lib/atomix-input-switch/atomix-input-switch.component.mjs +85 -0
  27. package/esm2022/lib/lib/atomix-loading-overlay/atomix-loading-overlay.component.mjs +44 -0
  28. package/esm2022/lib/lib/atomix-messages/messages.component.mjs +33 -0
  29. package/esm2022/lib/lib/atomix-pagination/atomix-pagination.component.mjs +48 -0
  30. package/esm2022/lib/lib/atomix-radio-button/atomix-radio-button.component.mjs +50 -0
  31. package/esm2022/lib/lib/atomix-search-dropdown/atomix-search-dropdown.component.mjs +149 -0
  32. package/esm2022/lib/lib/atomix-select-button/atomix-select-button-models.mjs +2 -0
  33. package/esm2022/lib/lib/atomix-select-button/atomix-select-button.component.mjs +25 -0
  34. package/esm2022/lib/lib/atomix-snackbar/atomix-snackbar.component.mjs +29 -0
  35. package/esm2022/lib/lib/atomix-spinner/atomix-spinner.component.mjs +24 -0
  36. package/esm2022/lib/lib/atomix-steps/atomix-steps.component.mjs +41 -0
  37. package/esm2022/lib/lib/atomix-tabMenu/atomix-tabMenu.component.mjs +51 -0
  38. package/esm2022/lib/lib/atomix-table/atomix-table.component.mjs +454 -0
  39. package/esm2022/lib/lib/atomix-table/atomix-table.models.mjs +2 -0
  40. package/esm2022/lib/lib/atomix-tag/atomix-tag.component.mjs +24 -0
  41. package/esm2022/lib/lib/utils/prime-icons.util.mjs +10 -0
  42. package/esm2022/lib/primekit.component.mjs +11 -0
  43. package/esm2022/lib/primekit.module.mjs +322 -0
  44. package/esm2022/lib/primekit.service.mjs +14 -0
  45. package/esm2022/primekit.mjs +5 -0
  46. package/esm2022/public-api.mjs +44 -0
  47. package/fesm2022/primekit.mjs +3158 -0
  48. package/fesm2022/primekit.mjs.map +1 -0
  49. package/index.d.ts +5 -0
  50. package/lib/lib/atomix-alert/atomix-alert.component.d.ts +22 -0
  51. package/lib/lib/atomix-autocomplete/atomix-autocomplete.component.d.ts +34 -0
  52. package/lib/lib/atomix-button/atomix-button.component.d.ts +19 -0
  53. package/{src/lib/lib/atomix-button/atomix-button.models.ts → lib/lib/atomix-button/atomix-button.models.d.ts} +2 -2
  54. package/lib/lib/atomix-calendar/atomix-calendar.component.d.ts +27 -0
  55. package/lib/lib/atomix-card/atomix-card.component.d.ts +9 -0
  56. package/lib/lib/atomix-confirmation-dialog/atomix-confirmation-dialog.component.d.ts +12 -0
  57. package/lib/lib/atomix-daterange-calendar/atomix-daterange-calendar.component.d.ts +79 -0
  58. package/lib/lib/atomix-divider/atomix-divider.component.d.ts +12 -0
  59. package/lib/lib/atomix-dropdown/atomix-dropdown.component.d.ts +50 -0
  60. package/lib/lib/atomix-dynamic-dialog/atomix-dynamic-dialog.component.d.ts +15 -0
  61. package/lib/lib/atomix-dynamic-dialog/atomix-dynamic-dialog.models.d.ts +11 -0
  62. package/lib/lib/atomix-form/atomix-form-autocomplete/atomix-form-autocomplete.component.d.ts +25 -0
  63. package/lib/lib/atomix-form/atomix-form-calendar/atomix-form-calendar.component.d.ts +23 -0
  64. package/lib/lib/atomix-form/atomix-form-checkbox/atomix-form-checkbox.component.d.ts +18 -0
  65. package/lib/lib/atomix-form/atomix-form-chips/atomix-form-chips.component.d.ts +19 -0
  66. package/lib/lib/atomix-form/atomix-form-chips/form.chips.models.d.ts +5 -0
  67. package/lib/lib/atomix-form/atomix-form-dropdown/atomix-form-dropdown.component.d.ts +25 -0
  68. package/lib/lib/atomix-form/atomix-form-input-component/atomix-form-input-component.component.d.ts +28 -0
  69. package/lib/lib/atomix-form/atomix-form-inputmask-component/atomix-form-inputmask-component.component.d.ts +17 -0
  70. package/lib/lib/atomix-form/atomix-form-password-component/atomix-form-password-component.component.d.ts +17 -0
  71. package/lib/lib/atomix-form/atomix-form-radio-button/atomix-radio-button.component.d.ts +19 -0
  72. package/lib/lib/atomix-form/atomix-form-textarea/atomix-form-textarea.component.d.ts +17 -0
  73. package/lib/lib/atomix-input/atomix-input.component.d.ts +29 -0
  74. package/lib/lib/atomix-input-switch/atomix-input-switch.component.d.ts +30 -0
  75. package/lib/lib/atomix-loading-overlay/atomix-loading-overlay.component.d.ts +16 -0
  76. package/lib/lib/atomix-messages/messages.component.d.ts +13 -0
  77. package/lib/lib/atomix-pagination/atomix-pagination.component.d.ts +19 -0
  78. package/lib/lib/atomix-radio-button/atomix-radio-button.component.d.ts +15 -0
  79. package/lib/lib/atomix-search-dropdown/atomix-search-dropdown.component.d.ts +60 -0
  80. package/{src/lib/lib/atomix-select-button/atomix-select-button-models.ts → lib/lib/atomix-select-button/atomix-select-button-models.d.ts} +4 -4
  81. package/lib/lib/atomix-select-button/atomix-select-button.component.d.ts +12 -0
  82. package/lib/lib/atomix-snackbar/atomix-snackbar.component.d.ts +12 -0
  83. package/lib/lib/atomix-spinner/atomix-spinner.component.d.ts +9 -0
  84. package/lib/lib/atomix-steps/atomix-steps.component.d.ts +19 -0
  85. package/lib/lib/atomix-tabMenu/atomix-tabMenu.component.d.ts +19 -0
  86. package/lib/lib/atomix-table/atomix-table.component.d.ts +119 -0
  87. package/lib/lib/atomix-table/atomix-table.models.d.ts +43 -0
  88. package/lib/lib/atomix-tag/atomix-tag.component.d.ts +9 -0
  89. package/lib/lib/utils/prime-icons.util.d.ts +3 -0
  90. package/lib/primekit.component.d.ts +5 -0
  91. package/lib/primekit.module.d.ts +72 -0
  92. package/lib/primekit.service.d.ts +6 -0
  93. package/package.json +28 -15
  94. package/{src/public-api.ts → public-api.d.ts} +38 -47
  95. package/src/assets/images/empty-table.svg +25 -25
  96. package/ng-package.json +0 -8
  97. package/src/lib/lib/atomix-alert/atomix-alert.component.css +0 -67
  98. package/src/lib/lib/atomix-alert/atomix-alert.component.html +0 -7
  99. package/src/lib/lib/atomix-alert/atomix-alert.component.spec.ts +0 -154
  100. package/src/lib/lib/atomix-alert/atomix-alert.component.ts +0 -75
  101. package/src/lib/lib/atomix-autocomplete/atomix-autocomplete.component.html +0 -35
  102. package/src/lib/lib/atomix-autocomplete/atomix-autocomplete.component.scss +0 -72
  103. package/src/lib/lib/atomix-autocomplete/atomix-autocomplete.component.spec.ts +0 -210
  104. package/src/lib/lib/atomix-autocomplete/atomix-autocomplete.component.ts +0 -70
  105. package/src/lib/lib/atomix-button/atomix-button.component.css +0 -70
  106. package/src/lib/lib/atomix-button/atomix-button.component.html +0 -20
  107. package/src/lib/lib/atomix-button/atomix-button.component.spec.ts +0 -135
  108. package/src/lib/lib/atomix-button/atomix-button.component.ts +0 -28
  109. package/src/lib/lib/atomix-calendar/atomix-calendar.component.css +0 -5
  110. package/src/lib/lib/atomix-calendar/atomix-calendar.component.html +0 -20
  111. package/src/lib/lib/atomix-calendar/atomix-calendar.component.spec.ts +0 -145
  112. package/src/lib/lib/atomix-calendar/atomix-calendar.component.ts +0 -71
  113. package/src/lib/lib/atomix-card/atomix-card.component.css +0 -4
  114. package/src/lib/lib/atomix-card/atomix-card.component.html +0 -3
  115. package/src/lib/lib/atomix-card/atomix-card.component.spec.ts +0 -63
  116. package/src/lib/lib/atomix-card/atomix-card.component.ts +0 -13
  117. package/src/lib/lib/atomix-confirmation-dialog/atomix-confirmation-dialog.component.css +0 -12
  118. package/src/lib/lib/atomix-confirmation-dialog/atomix-confirmation-dialog.component.html +0 -9
  119. package/src/lib/lib/atomix-confirmation-dialog/atomix-confirmation-dialog.component.spec.ts +0 -63
  120. package/src/lib/lib/atomix-confirmation-dialog/atomix-confirmation-dialog.component.ts +0 -22
  121. package/src/lib/lib/atomix-daterange-calendar/atomix-daterange-calendar.component.html +0 -233
  122. package/src/lib/lib/atomix-daterange-calendar/atomix-daterange-calendar.component.scss +0 -266
  123. package/src/lib/lib/atomix-daterange-calendar/atomix-daterange-calendar.component.spec.ts +0 -1465
  124. package/src/lib/lib/atomix-daterange-calendar/atomix-daterange-calendar.component.ts +0 -717
  125. package/src/lib/lib/atomix-divider/atomix-divider.component.css +0 -0
  126. package/src/lib/lib/atomix-divider/atomix-divider.component.html +0 -7
  127. package/src/lib/lib/atomix-divider/atomix-divider.component.spec.ts +0 -91
  128. package/src/lib/lib/atomix-divider/atomix-divider.component.ts +0 -17
  129. package/src/lib/lib/atomix-dropdown/atomix-dropdown.component.css +0 -25
  130. package/src/lib/lib/atomix-dropdown/atomix-dropdown.component.html +0 -37
  131. package/src/lib/lib/atomix-dropdown/atomix-dropdown.component.spec.ts +0 -178
  132. package/src/lib/lib/atomix-dropdown/atomix-dropdown.component.ts +0 -89
  133. package/src/lib/lib/atomix-dynamic-dialog/atomix-dynamic-dialog.component.css +0 -0
  134. package/src/lib/lib/atomix-dynamic-dialog/atomix-dynamic-dialog.component.html +0 -0
  135. package/src/lib/lib/atomix-dynamic-dialog/atomix-dynamic-dialog.component.spec.ts +0 -128
  136. package/src/lib/lib/atomix-dynamic-dialog/atomix-dynamic-dialog.component.ts +0 -42
  137. package/src/lib/lib/atomix-dynamic-dialog/atomix-dynamic-dialog.models.ts +0 -12
  138. package/src/lib/lib/atomix-form/atomix-form-autocomplete/atomix-form-autocomplete.component.html +0 -20
  139. package/src/lib/lib/atomix-form/atomix-form-autocomplete/atomix-form-autocomplete.component.scss +0 -7
  140. package/src/lib/lib/atomix-form/atomix-form-autocomplete/atomix-form-autocomplete.component.spec.ts +0 -169
  141. package/src/lib/lib/atomix-form/atomix-form-autocomplete/atomix-form-autocomplete.component.ts +0 -41
  142. package/src/lib/lib/atomix-form/atomix-form-calendar/atomix-form-calendar.component.html +0 -21
  143. package/src/lib/lib/atomix-form/atomix-form-calendar/atomix-form-calendar.component.scss +0 -7
  144. package/src/lib/lib/atomix-form/atomix-form-calendar/atomix-form-calendar.component.spec.ts +0 -142
  145. package/src/lib/lib/atomix-form/atomix-form-calendar/atomix-form-calendar.component.ts +0 -32
  146. package/src/lib/lib/atomix-form/atomix-form-checkbox/atomix-form-checkbox.component.html +0 -13
  147. package/src/lib/lib/atomix-form/atomix-form-checkbox/atomix-form-checkbox.component.scss +0 -14
  148. package/src/lib/lib/atomix-form/atomix-form-checkbox/atomix-form-checkbox.component.spec.ts +0 -112
  149. package/src/lib/lib/atomix-form/atomix-form-checkbox/atomix-form-checkbox.component.ts +0 -28
  150. package/src/lib/lib/atomix-form/atomix-form-chips/atomix-form-chips.component.html +0 -20
  151. package/src/lib/lib/atomix-form/atomix-form-chips/atomix-form-chips.component.scss +0 -3
  152. package/src/lib/lib/atomix-form/atomix-form-chips/atomix-form-chips.component.spec.ts +0 -153
  153. package/src/lib/lib/atomix-form/atomix-form-chips/atomix-form-chips.component.ts +0 -28
  154. package/src/lib/lib/atomix-form/atomix-form-chips/form.chips.models.ts +0 -5
  155. package/src/lib/lib/atomix-form/atomix-form-dropdown/atomix-form-dropdown.component.html +0 -24
  156. package/src/lib/lib/atomix-form/atomix-form-dropdown/atomix-form-dropdown.component.scss +0 -15
  157. package/src/lib/lib/atomix-form/atomix-form-dropdown/atomix-form-dropdown.component.spec.ts +0 -156
  158. package/src/lib/lib/atomix-form/atomix-form-dropdown/atomix-form-dropdown.component.ts +0 -36
  159. package/src/lib/lib/atomix-form/atomix-form-input-component/atomix-form-input-component.component.html +0 -33
  160. package/src/lib/lib/atomix-form/atomix-form-input-component/atomix-form-input-component.component.scss +0 -32
  161. package/src/lib/lib/atomix-form/atomix-form-input-component/atomix-form-input-component.component.spec.ts +0 -156
  162. package/src/lib/lib/atomix-form/atomix-form-input-component/atomix-form-input-component.component.ts +0 -42
  163. package/src/lib/lib/atomix-form/atomix-form-inputmask-component/atomix-form-inputmask-component.component.html +0 -14
  164. package/src/lib/lib/atomix-form/atomix-form-inputmask-component/atomix-form-inputmask-component.component.scss +0 -0
  165. package/src/lib/lib/atomix-form/atomix-form-inputmask-component/atomix-form-inputmask-component.component.spec.ts +0 -104
  166. package/src/lib/lib/atomix-form/atomix-form-inputmask-component/atomix-form-inputmask-component.component.ts +0 -24
  167. package/src/lib/lib/atomix-form/atomix-form-password-component/atomix-form-password-component.component.html +0 -16
  168. package/src/lib/lib/atomix-form/atomix-form-password-component/atomix-form-password-component.component.scss +0 -0
  169. package/src/lib/lib/atomix-form/atomix-form-password-component/atomix-form-password-component.component.spec.ts +0 -92
  170. package/src/lib/lib/atomix-form/atomix-form-password-component/atomix-form-password-component.component.ts +0 -24
  171. package/src/lib/lib/atomix-form/atomix-form-radio-button/atomix-radio-button.component.html +0 -23
  172. package/src/lib/lib/atomix-form/atomix-form-radio-button/atomix-radio-button.component.scss +0 -3
  173. package/src/lib/lib/atomix-form/atomix-form-radio-button/atomix-radio-button.component.spec.ts +0 -126
  174. package/src/lib/lib/atomix-form/atomix-form-radio-button/atomix-radio-button.component.ts +0 -26
  175. package/src/lib/lib/atomix-form/atomix-form-textarea/atomix-form-textarea.component.html +0 -17
  176. package/src/lib/lib/atomix-form/atomix-form-textarea/atomix-form-textarea.component.scss +0 -6
  177. package/src/lib/lib/atomix-form/atomix-form-textarea/atomix-form-textarea.component.spec.ts +0 -120
  178. package/src/lib/lib/atomix-form/atomix-form-textarea/atomix-form-textarea.component.ts +0 -24
  179. package/src/lib/lib/atomix-input/atomix-input.component.css +0 -52
  180. package/src/lib/lib/atomix-input/atomix-input.component.html +0 -45
  181. package/src/lib/lib/atomix-input/atomix-input.component.spec.ts +0 -229
  182. package/src/lib/lib/atomix-input/atomix-input.component.ts +0 -64
  183. package/src/lib/lib/atomix-input-switch/atomix-input-switch.component.css +0 -12
  184. package/src/lib/lib/atomix-input-switch/atomix-input-switch.component.html +0 -17
  185. package/src/lib/lib/atomix-input-switch/atomix-input-switch.component.spec.ts +0 -173
  186. package/src/lib/lib/atomix-input-switch/atomix-input-switch.component.ts +0 -62
  187. package/src/lib/lib/atomix-loading-overlay/atomix-loading-overlay.component.html +0 -47
  188. package/src/lib/lib/atomix-loading-overlay/atomix-loading-overlay.component.scss +0 -14
  189. package/src/lib/lib/atomix-loading-overlay/atomix-loading-overlay.component.spec.ts +0 -21
  190. package/src/lib/lib/atomix-loading-overlay/atomix-loading-overlay.component.ts +0 -25
  191. package/src/lib/lib/atomix-messages/messages.component.css +0 -0
  192. package/src/lib/lib/atomix-messages/messages.component.html +0 -9
  193. package/src/lib/lib/atomix-messages/messages.component.spec.ts +0 -115
  194. package/src/lib/lib/atomix-messages/messages.component.ts +0 -17
  195. package/src/lib/lib/atomix-pagination/atomix-pagination.component.css +0 -19
  196. package/src/lib/lib/atomix-pagination/atomix-pagination.component.html +0 -24
  197. package/src/lib/lib/atomix-pagination/atomix-pagination.component.spec.ts +0 -98
  198. package/src/lib/lib/atomix-pagination/atomix-pagination.component.ts +0 -36
  199. package/src/lib/lib/atomix-radio-button/atomix-radio-button.component.css +0 -0
  200. package/src/lib/lib/atomix-radio-button/atomix-radio-button.component.html +0 -7
  201. package/src/lib/lib/atomix-radio-button/atomix-radio-button.component.spec.ts +0 -116
  202. package/src/lib/lib/atomix-radio-button/atomix-radio-button.component.ts +0 -37
  203. package/src/lib/lib/atomix-search-dropdown/atomix-search-dropdown.component.css +0 -49
  204. package/src/lib/lib/atomix-search-dropdown/atomix-search-dropdown.component.html +0 -68
  205. package/src/lib/lib/atomix-search-dropdown/atomix-search-dropdown.component.spec.ts +0 -282
  206. package/src/lib/lib/atomix-search-dropdown/atomix-search-dropdown.component.ts +0 -119
  207. package/src/lib/lib/atomix-select-button/atomix-select-button.component.css +0 -5
  208. package/src/lib/lib/atomix-select-button/atomix-select-button.component.html +0 -7
  209. package/src/lib/lib/atomix-select-button/atomix-select-button.component.spec.ts +0 -73
  210. package/src/lib/lib/atomix-select-button/atomix-select-button.component.ts +0 -19
  211. package/src/lib/lib/atomix-snackbar/atomix-snackbar.component.css +0 -30
  212. package/src/lib/lib/atomix-snackbar/atomix-snackbar.component.html +0 -4
  213. package/src/lib/lib/atomix-snackbar/atomix-snackbar.component.spec.ts +0 -60
  214. package/src/lib/lib/atomix-snackbar/atomix-snackbar.component.ts +0 -27
  215. package/src/lib/lib/atomix-spinner/atomix-spinner.component.css +0 -0
  216. package/src/lib/lib/atomix-spinner/atomix-spinner.component.html +0 -7
  217. package/src/lib/lib/atomix-spinner/atomix-spinner.component.spec.ts +0 -70
  218. package/src/lib/lib/atomix-spinner/atomix-spinner.component.ts +0 -13
  219. package/src/lib/lib/atomix-steps/atomix-steps.component.html +0 -9
  220. package/src/lib/lib/atomix-steps/atomix-steps.component.scss +0 -0
  221. package/src/lib/lib/atomix-steps/atomix-steps.component.spec.ts +0 -120
  222. package/src/lib/lib/atomix-steps/atomix-steps.component.ts +0 -32
  223. package/src/lib/lib/atomix-tabMenu/atomix-tabMenu.component.css +0 -0
  224. package/src/lib/lib/atomix-tabMenu/atomix-tabMenu.component.html +0 -26
  225. package/src/lib/lib/atomix-tabMenu/atomix-tabMenu.component.spec.ts +0 -106
  226. package/src/lib/lib/atomix-tabMenu/atomix-tabMenu.component.ts +0 -36
  227. package/src/lib/lib/atomix-table/atomix-table.component.css +0 -152
  228. package/src/lib/lib/atomix-table/atomix-table.component.html +0 -647
  229. package/src/lib/lib/atomix-table/atomix-table.component.spec.ts +0 -1648
  230. package/src/lib/lib/atomix-table/atomix-table.component.ts +0 -422
  231. package/src/lib/lib/atomix-table/atomix-table.models.ts +0 -39
  232. package/src/lib/lib/atomix-tag/atomix-tag.component.css +0 -0
  233. package/src/lib/lib/atomix-tag/atomix-tag.component.html +0 -6
  234. package/src/lib/lib/atomix-tag/atomix-tag.component.spec.ts +0 -47
  235. package/src/lib/lib/atomix-tag/atomix-tag.component.ts +0 -13
  236. package/src/lib/lib/utils/prime-icons.util.spec.ts +0 -21
  237. package/src/lib/lib/utils/prime-icons.util.ts +0 -11
  238. package/src/lib/primekit.component.spec.ts +0 -19
  239. package/src/lib/primekit.component.ts +0 -10
  240. package/src/lib/primekit.module.spec.ts +0 -155
  241. package/src/lib/primekit.module.ts +0 -183
  242. package/src/lib/primekit.service.spec.ts +0 -17
  243. package/src/lib/primekit.service.ts +0 -8
  244. package/tsconfig.lib.json +0 -13
  245. package/tsconfig.lib.prod.json +0 -11
  246. package/tsconfig.spec.json +0 -10
@@ -0,0 +1,717 @@
1
+ import { Component, EventEmitter, Input, Output, ViewChild, } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "@angular/common";
4
+ import * as i2 from "primeng/button";
5
+ import * as i3 from "primeng/inputtext";
6
+ import * as i4 from "primeng/calendar";
7
+ import * as i5 from "primeng/overlaypanel";
8
+ import * as i6 from "@angular/forms";
9
+ export class AtomixDaterangeCalendarComponent {
10
+ datePipe;
11
+ renderer;
12
+ placeholder = '';
13
+ styleClass = '';
14
+ selectionMode = 'range';
15
+ inputStyleClass = '';
16
+ inline = false;
17
+ disabled = false;
18
+ selectedDate = null;
19
+ maxDate;
20
+ minDate;
21
+ defaultPreset = null;
22
+ preservePreset = false;
23
+ customPresets = [];
24
+ selectedCustomPreset = null;
25
+ customPresetClick = new EventEmitter();
26
+ customRangeMode = false;
27
+ selectedPreset = null; // 'today' | 'yesterday' | 'last7days' | 'last30days' | 'last3months' | 'last6months' | 'last1year' | 'custom' | null
28
+ overlayPanel;
29
+ dateRangeChange = new EventEmitter();
30
+ // internal model bound to p-calendar to avoid changing external selection during first-click selection
31
+ modelDate = null;
32
+ enLocale = {
33
+ firstDayOfWeek: 0,
34
+ dayNames: [
35
+ 'Sunday',
36
+ 'Monday',
37
+ 'Tuesday',
38
+ 'Wednesday',
39
+ 'Thursday',
40
+ 'Friday',
41
+ 'Saturday',
42
+ ],
43
+ dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
44
+ dayNamesMin: ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'],
45
+ monthNames: [
46
+ 'January',
47
+ 'February',
48
+ 'March',
49
+ 'April',
50
+ 'May',
51
+ 'June',
52
+ 'July',
53
+ 'August',
54
+ 'September',
55
+ 'October',
56
+ 'November',
57
+ 'December',
58
+ ],
59
+ monthNamesShort: [
60
+ 'Jan',
61
+ 'Feb',
62
+ 'Mar',
63
+ 'Apr',
64
+ 'May',
65
+ 'Jun',
66
+ 'Jul',
67
+ 'Aug',
68
+ 'Sep',
69
+ 'Oct',
70
+ 'Nov',
71
+ 'Dec',
72
+ ],
73
+ today: 'Today',
74
+ clear: 'Clear',
75
+ };
76
+ // temporary storage for overlay session
77
+ _overlayInitialDate = null;
78
+ _overlayInitialPreset = null;
79
+ _calendarObservers = [];
80
+ _observedElements = [];
81
+ _parentObservers = [];
82
+ _observedParentElements = [];
83
+ _updateRafId = null; // requestAnimationFrame id
84
+ constructor(datePipe, renderer) {
85
+ this.datePipe = datePipe;
86
+ this.renderer = renderer;
87
+ }
88
+ ngOnInit() {
89
+ // Apply custom preset if set externally at init time
90
+ if (this.selectedCustomPreset && this.customPresets?.find(p => p.key === this.selectedCustomPreset)) {
91
+ this.selectedPreset = this.selectedCustomPreset;
92
+ this.selectedDate = null;
93
+ this.modelDate = null;
94
+ }
95
+ else if (!this.selectedDate && this.defaultPreset) {
96
+ this.applyPreset(this.defaultPreset);
97
+ }
98
+ // initialize internal model
99
+ this.modelDate = this.selectedDate ? [...this.selectedDate] : null;
100
+ // initial class update if there is a pre-selected range
101
+ this._scheduleUpdate();
102
+ // start observers if inline calendar is used
103
+ if (this.inline) {
104
+ this._startCalendarObservers();
105
+ }
106
+ }
107
+ ngOnChanges(changes) {
108
+ if (changes['selectedCustomPreset']) {
109
+ const preset = changes['selectedCustomPreset'].currentValue;
110
+ if (preset && this.customPresets?.find(p => p.key === preset)) {
111
+ this.selectedPreset = preset;
112
+ this.selectedDate = null;
113
+ this.modelDate = null;
114
+ }
115
+ else if (preset === null) {
116
+ // Only clear if the current preset is a custom one
117
+ if (this.customPresets?.find(p => p.key === this.selectedPreset)) {
118
+ this.selectedPreset = null;
119
+ }
120
+ }
121
+ }
122
+ if (changes['selectedDate']) {
123
+ const sel = changes['selectedDate'].currentValue;
124
+ if (sel && Array.isArray(sel) && sel.length === 2 && sel[0] && sel[1]) {
125
+ const preset = this.detectPreset(sel[0], sel[1]);
126
+ this.selectedPreset = preset ?? 'custom';
127
+ // sync internal model when external value changes
128
+ this.modelDate = [...sel];
129
+ }
130
+ else if (sel == null) {
131
+ this.selectedPreset = null;
132
+ this.modelDate = null;
133
+ }
134
+ }
135
+ }
136
+ onInputKeyDown(event) {
137
+ if (event.key === 'Enter' || event.key === ' ') {
138
+ try {
139
+ this.overlayPanel?.toggle(event);
140
+ }
141
+ catch (e) { }
142
+ event.preventDefault();
143
+ }
144
+ }
145
+ onOverlayShow() {
146
+ // store a deep copy of current selection/preset when overlay opens
147
+ if (this.selectedDate && Array.isArray(this.selectedDate)) {
148
+ this._overlayInitialDate = this.selectedDate.map((d) => d ? new Date(d.getFullYear(), d.getMonth(), d.getDate()) : d);
149
+ }
150
+ else {
151
+ this._overlayInitialDate = null;
152
+ }
153
+ this._overlayInitialPreset = this.selectedPreset;
154
+ // ensure calendar model shows the currently committed selection when opening
155
+ this.modelDate = this.selectedDate ? [...this.selectedDate] : null;
156
+ // ensure preset buttons reflect current selection when overlay opens
157
+ if (this.selectedDate &&
158
+ Array.isArray(this.selectedDate) &&
159
+ this.selectedDate.length === 2) {
160
+ const preset = this.detectPreset(this.selectedDate[0], this.selectedDate[1]);
161
+ this.selectedPreset = preset ?? 'custom';
162
+ }
163
+ else if (!this.selectedDate) {
164
+ this.selectedPreset = null;
165
+ }
166
+ // add start/end classes to range cells for styling
167
+ this._scheduleUpdate();
168
+ // observe DOM changes (PrimeNG may re-render inside overlay)
169
+ this._startCalendarObservers();
170
+ }
171
+ onOverlayHide() {
172
+ // if internal calendar model has an incomplete selection (partial range) revert to initial
173
+ const model = this.modelDate;
174
+ const isPartialModel = Boolean(model && Array.isArray(model) && model.length > 0 && model[0] && !model[1]);
175
+ if (isPartialModel) {
176
+ this.selectedDate = this._overlayInitialDate;
177
+ this.selectedPreset = this._overlayInitialPreset;
178
+ // reset internal model to synced value
179
+ this.modelDate = this.selectedDate ? [...this.selectedDate] : null;
180
+ }
181
+ this._overlayInitialDate = null;
182
+ this._overlayInitialPreset = null;
183
+ this.customRangeMode = false;
184
+ // cleanup any start/end classes to avoid stale classes
185
+ this._scheduleUpdate();
186
+ // stop observing
187
+ this._stopCalendarObservers();
188
+ }
189
+ onModelChange(dateRange) {
190
+ // When user clicks a first date, PrimeNG may emit an array with 1 value. We don't want to
191
+ // update the external selectedDate until the range is completed (two dates) so that
192
+ // the calendar does not jump back to a previously selected end date's month.
193
+ this.modelDate = dateRange ? [...dateRange] : null;
194
+ if (dateRange &&
195
+ Array.isArray(dateRange) &&
196
+ dateRange.length === 2 &&
197
+ dateRange[0] &&
198
+ dateRange[1]) {
199
+ this.selectedPreset = this.detectPreset(dateRange[0], dateRange[1]);
200
+ this.customRangeMode = false;
201
+ this.selectedDate = [...dateRange];
202
+ this.dateRangeChange.emit(this.selectedDate);
203
+ // close overlay like when applying a preset
204
+ try {
205
+ this.overlayPanel?.hide();
206
+ }
207
+ catch (e) { }
208
+ }
209
+ else if (!dateRange) {
210
+ // cleared selection
211
+ this.selectedPreset = null;
212
+ this.customRangeMode = false;
213
+ this.selectedDate = null;
214
+ this.dateRangeChange.emit(null);
215
+ }
216
+ else {
217
+ // single date selecting (partial range) - do not emit change yet; just keep internal model
218
+ // so the calendar's view remains where the user navigated to.
219
+ this.selectedPreset = null;
220
+ this.customRangeMode = false;
221
+ }
222
+ // update start/end classes while user is selecting or when range completes
223
+ this._scheduleUpdate();
224
+ }
225
+ // Called when the calendar's visible month/year changes
226
+ onCalendarViewChanged(event) {
227
+ // Reapply classes after PrimeNG re-render
228
+ this._scheduleUpdate();
229
+ // Reattach observers after a small delay since PrimeNG will likely replace DOM nodes
230
+ setTimeout(() => {
231
+ try {
232
+ this._stopCalendarObservers();
233
+ this._startCalendarObservers();
234
+ }
235
+ catch (e) { }
236
+ }, 40);
237
+ }
238
+ get hasSelection() {
239
+ return Boolean(this.selectedDate &&
240
+ Array.isArray(this.selectedDate) &&
241
+ this.selectedDate.length === 2 &&
242
+ !!this.selectedDate[0] &&
243
+ !!this.selectedDate[1]);
244
+ }
245
+ normalizeDate(d) {
246
+ return new Date(d.getFullYear(), d.getMonth(), d.getDate());
247
+ }
248
+ isSameDate(a, b) {
249
+ return (a.getFullYear() === b.getFullYear() &&
250
+ a.getMonth() === b.getMonth() &&
251
+ a.getDate() === b.getDate());
252
+ }
253
+ detectPreset(startRaw, endRaw) {
254
+ const start = this.normalizeDate(startRaw);
255
+ const end = this.normalizeDate(endRaw);
256
+ const today = this.normalizeDate(new Date());
257
+ // today
258
+ if (this.isSameDate(start, today) && this.isSameDate(end, today))
259
+ return 'today';
260
+ // yesterday
261
+ const y = new Date(today);
262
+ y.setDate(y.getDate() - 1);
263
+ if (this.isSameDate(start, y) && this.isSameDate(end, y))
264
+ return 'yesterday';
265
+ // last7days (last 7 days including today: start = today - 6, end = today)
266
+ const l7End = new Date(today);
267
+ const l7Start = new Date(today);
268
+ l7Start.setDate(today.getDate() - 6);
269
+ if (this.isSameDate(start, l7Start) && this.isSameDate(end, l7End))
270
+ return 'last7days';
271
+ // last30days (last 30 days including today: start = today - 29, end = today)
272
+ const l30End = new Date(today);
273
+ const l30Start = new Date(today);
274
+ l30Start.setDate(today.getDate() - 29);
275
+ if (this.isSameDate(start, l30Start) && this.isSameDate(end, l30End))
276
+ return 'last30days';
277
+ // last3months (last 3 months including today: start = today - 3 months, end = today)
278
+ const l3mEnd = new Date(today);
279
+ const l3mStart = new Date(today);
280
+ l3mStart.setMonth(today.getMonth() - 3);
281
+ if (this.isSameDate(start, l3mStart) && this.isSameDate(end, l3mEnd))
282
+ return 'last3months';
283
+ // last6months (last 6 months including today: start = today - 6 months, end = today)
284
+ const l6mEnd = new Date(today);
285
+ const l6mStart = new Date(today);
286
+ l6mStart.setMonth(today.getMonth() - 6);
287
+ if (this.isSameDate(start, l6mStart) && this.isSameDate(end, l6mEnd))
288
+ return 'last6months';
289
+ // last1year (last 1 year including today: start = today - 1 year, end = today)
290
+ const l1yEnd = new Date(today);
291
+ const l1yStart = new Date(today);
292
+ l1yStart.setFullYear(today.getFullYear() - 1);
293
+ if (this.isSameDate(start, l1yStart) && this.isSameDate(end, l1yEnd))
294
+ return 'last1year';
295
+ return null;
296
+ }
297
+ clearDateRange() {
298
+ this.selectedDate = null;
299
+ this.dateRangeChange.emit(this.selectedDate);
300
+ this.selectedPreset = null;
301
+ this.customRangeMode = false;
302
+ this.modelDate = null;
303
+ }
304
+ resetAndClose() {
305
+ this.clearDateRange();
306
+ if (this.overlayPanel) {
307
+ try {
308
+ this.overlayPanel.hide();
309
+ }
310
+ catch (e) { }
311
+ }
312
+ }
313
+ clearAndStop(event) {
314
+ this.clearDateRange();
315
+ try {
316
+ this.overlayPanel?.hide();
317
+ }
318
+ catch (e) { }
319
+ event.stopPropagation();
320
+ }
321
+ toggleCustomRange() {
322
+ this.customRangeMode = !this.customRangeMode;
323
+ if (this.customRangeMode)
324
+ this.selectedPreset = 'custom';
325
+ }
326
+ applyCustomRange() {
327
+ // ensure external selectedDate is in sync with internal model
328
+ this.selectedDate = this.modelDate ? [...this.modelDate] : null;
329
+ this.dateRangeChange.emit(this.selectedDate);
330
+ if (this.overlayPanel) {
331
+ try {
332
+ this.overlayPanel.hide();
333
+ }
334
+ catch (e) { }
335
+ }
336
+ this.customRangeMode = false;
337
+ this.selectedPreset = 'custom';
338
+ }
339
+ getDateRangeLabel() {
340
+ // Show custom preset label if a custom preset is selected
341
+ const customPreset = this.customPresets?.find(p => p.key === this.selectedPreset);
342
+ if (customPreset)
343
+ return customPreset.label;
344
+ // Check the internal model first to show real-time updates while selecting
345
+ const dateArray = this.modelDate || this.selectedDate;
346
+ if (!dateArray || !Array.isArray(dateArray))
347
+ return '';
348
+ const [start, end] = dateArray;
349
+ const arrow = '\u2794';
350
+ // Show just the first date with an arrow if only first date is selected
351
+ if (start && !end) {
352
+ const startStr = this.datePipe.transform(start, 'MM/dd/yyyy');
353
+ return `${startStr} ${arrow} `;
354
+ }
355
+ // Show the complete range if both dates are selected
356
+ if (start && end) {
357
+ const startStr = this.datePipe.transform(start, 'MM/dd/yyyy');
358
+ const endStr = this.datePipe.transform(end, 'MM/dd/yyyy');
359
+ return `${startStr} ${arrow} ${endStr}`;
360
+ }
361
+ return '';
362
+ }
363
+ onCustomPresetClick(key) {
364
+ this.selectedPreset = key;
365
+ this.selectedDate = null;
366
+ this.modelDate = null;
367
+ this.customPresetClick.emit(key);
368
+ try {
369
+ this.overlayPanel?.hide();
370
+ }
371
+ catch (e) { }
372
+ }
373
+ applyPreset(preset) {
374
+ const today = new Date();
375
+ let start = null;
376
+ let end = null;
377
+ switch (preset) {
378
+ case 'today':
379
+ start = end = new Date(today.getFullYear(), today.getMonth(), today.getDate());
380
+ break;
381
+ case 'yesterday':
382
+ const y = new Date(today);
383
+ y.setDate(y.getDate() - 1);
384
+ start = end = new Date(y.getFullYear(), y.getMonth(), y.getDate());
385
+ break;
386
+ case 'last7days': {
387
+ end = new Date(today.getFullYear(), today.getMonth(), today.getDate());
388
+ start = new Date(end);
389
+ start.setDate(end.getDate() - 6);
390
+ break;
391
+ }
392
+ case 'last30days': {
393
+ end = new Date(today.getFullYear(), today.getMonth(), today.getDate());
394
+ start = new Date(end);
395
+ start.setDate(end.getDate() - 29);
396
+ break;
397
+ }
398
+ case 'last3months': {
399
+ end = new Date(today.getFullYear(), today.getMonth(), today.getDate());
400
+ start = new Date(end);
401
+ start.setMonth(end.getMonth() - 3);
402
+ break;
403
+ }
404
+ case 'last6months': {
405
+ end = new Date(today.getFullYear(), today.getMonth(), today.getDate());
406
+ start = new Date(end);
407
+ start.setMonth(end.getMonth() - 6);
408
+ break;
409
+ }
410
+ case 'last1year': {
411
+ end = new Date(today.getFullYear(), today.getMonth(), today.getDate());
412
+ start = new Date(end);
413
+ start.setFullYear(end.getFullYear() - 1);
414
+ break;
415
+ }
416
+ default:
417
+ break;
418
+ }
419
+ if (start && end) {
420
+ this.selectedDate = [start, end];
421
+ this.modelDate = [start, end];
422
+ if (this.preservePreset) {
423
+ this.selectedDate = [start, end, { presets: preset }];
424
+ }
425
+ this.dateRangeChange.emit(this.selectedDate);
426
+ this.selectedPreset = preset;
427
+ this.customRangeMode = false;
428
+ }
429
+ try {
430
+ this.overlayPanel?.hide();
431
+ }
432
+ catch (e) { }
433
+ // ensure we update start/end classes after applying a preset
434
+ this._scheduleUpdate();
435
+ }
436
+ onDateRangeChange(dateRange) {
437
+ this.dateRangeChange.emit(dateRange);
438
+ if (dateRange && Array.isArray(dateRange)) {
439
+ this.selectedPreset = this.detectPreset(dateRange[0], dateRange[1]);
440
+ this.customRangeMode = false;
441
+ }
442
+ else if (!dateRange) {
443
+ this.selectedPreset = null;
444
+ this.customRangeMode = false;
445
+ }
446
+ this._scheduleUpdate();
447
+ }
448
+ ngOnDestroy() {
449
+ this._stopCalendarObservers();
450
+ this._cancelScheduledUpdate();
451
+ }
452
+ // Walk the rendered calendar DOM(s) (overlay + inline) and add start-range/end-range classes
453
+ _updateStartEndRangeClasses() {
454
+ try {
455
+ const calendarElements = this._getCalendarElements();
456
+ calendarElements.forEach((calEl) => {
457
+ // Remove existing classes from spans first
458
+ const allSpans = calEl.querySelectorAll('td > span');
459
+ allSpans.forEach((span) => {
460
+ this.renderer.removeClass(span, 'start-range');
461
+ this.renderer.removeClass(span, 'end-range');
462
+ this.renderer.removeClass(span, 'between-range');
463
+ });
464
+ // Collect span/date pairs, prefer data-date attribute
465
+ // Cache header month/year for this calendar to avoid querying per-span
466
+ const panelNode = calEl.closest('.p-datepicker') || calEl;
467
+ const headerMonthNode = panelNode.querySelector('.p-datepicker-header .p-datepicker-title .p-datepicker-month');
468
+ const headerYearNode = panelNode.querySelector('.p-datepicker-header .p-datepicker-title .p-datepicker-year');
469
+ const headerMonthIdx = headerMonthNode && headerMonthNode.textContent
470
+ ? (this.enLocale.monthNames || []).indexOf(headerMonthNode.textContent.trim())
471
+ : NaN;
472
+ const headerYearVal = headerYearNode && headerYearNode.textContent
473
+ ? parseInt(headerYearNode.textContent.trim(), 10)
474
+ : NaN;
475
+ const items = [];
476
+ const spans = calEl.querySelectorAll('td > span.p-highlight');
477
+ spans.forEach((span) => {
478
+ const td = span.closest('td');
479
+ // Try to read data-date attribute, which some PrimeNG versions render on span/td
480
+ let dataDate = span.getAttribute('data-date');
481
+ if (!dataDate && td)
482
+ dataDate = td.getAttribute('data-date');
483
+ if (dataDate) {
484
+ const parts = dataDate.split('-').map((p) => parseInt(p, 10));
485
+ if (parts.length >= 3 && parts.every((n) => !isNaN(n))) {
486
+ const [y, m, d] = parts;
487
+ const dt = new Date(y, m - 1, d);
488
+ items.push({ dt, td, span });
489
+ return;
490
+ }
491
+ }
492
+ // Fallback: parse day number and infer month/year from nearby header in the same .p-datepicker
493
+ const dayText = (span.textContent || '').trim();
494
+ const day = parseInt(dayText, 10);
495
+ if (!isNaN(day) && td) {
496
+ // Use cached header month/year when available
497
+ if (!isNaN(headerMonthIdx) && !isNaN(headerYearVal)) {
498
+ const dt = new Date(headerYearVal, headerMonthIdx, day);
499
+ items.push({ dt, td, span });
500
+ return;
501
+ }
502
+ }
503
+ // last resort: ignore span if date cannot be determined
504
+ });
505
+ if (items.length === 0)
506
+ return;
507
+ // Sort items to find min/max (start & end)
508
+ items.sort((a, b) => a.dt.getTime() - b.dt.getTime());
509
+ const detectedStart = items[0].dt;
510
+ const detectedEnd = items[items.length - 1].dt;
511
+ // Preferred range is modelDate/selectedDate if present
512
+ const range = this.selectedDate && this.selectedDate.length === 2
513
+ ? this.selectedDate
514
+ : this.modelDate && this.modelDate.length === 2
515
+ ? this.modelDate
516
+ : [detectedStart, detectedEnd];
517
+ const startDate = range && range[0]
518
+ ? this.normalizeDate(range[0])
519
+ : detectedStart;
520
+ const endDate = range && range[1]
521
+ ? this.normalizeDate(range[1])
522
+ : detectedEnd;
523
+ // For each item, add start-range,end-range, or between-range based on date
524
+ const sTime = startDate.getTime();
525
+ const eTime = endDate.getTime();
526
+ for (const it of items) {
527
+ const t = it.dt.getTime();
528
+ if (sTime === eTime && t === sTime) {
529
+ // single-day range, mark both start & end
530
+ this.renderer.addClass(it.span, 'start-range');
531
+ this.renderer.addClass(it.span, 'end-range');
532
+ }
533
+ else if (t === sTime) {
534
+ this.renderer.addClass(it.span, 'start-range');
535
+ }
536
+ else if (t === eTime) {
537
+ this.renderer.addClass(it.span, 'end-range');
538
+ }
539
+ else if (t > sTime && t < eTime) {
540
+ this.renderer.addClass(it.span, 'between-range');
541
+ }
542
+ }
543
+ });
544
+ }
545
+ catch (e) {
546
+ // ignore DOM errors (e.g., server-side rendering / missing elements)
547
+ }
548
+ }
549
+ isoDate(d) {
550
+ const y = d.getFullYear();
551
+ const m = String(d.getMonth() + 1).padStart(2, '0');
552
+ const day = String(d.getDate()).padStart(2, '0');
553
+ return `${y}-${m}-${day}`;
554
+ }
555
+ _findElementByDate(date) {
556
+ if (!date)
557
+ return undefined;
558
+ const y = date.getFullYear();
559
+ const m = date.getMonth() + 1; // 1..12
560
+ const d = date.getDate();
561
+ const isoUnpadded = `${y}-${m}-${d}`; // e.g. 2025-11-1
562
+ const isoPadded = `${y}-${String(m).padStart(2, '0')}-${String(d).padStart(2, '0')}`; // 2025-11-01
563
+ const selectors = [
564
+ `[data-date="${isoUnpadded}"]`,
565
+ `[data-date="${isoPadded}"]`,
566
+ ];
567
+ for (const sel of selectors) {
568
+ const foundInOverlay = document.querySelector(`.atomix-overlay-calendar ${sel}`);
569
+ if (foundInOverlay)
570
+ return (foundInOverlay.closest('td') || foundInOverlay);
571
+ }
572
+ for (const sel of selectors) {
573
+ const found = document.querySelector(sel);
574
+ if (found)
575
+ return found.closest('td') || found;
576
+ }
577
+ return undefined;
578
+ }
579
+ _startCalendarObservers() {
580
+ // stop first to avoid duplicates
581
+ this._stopCalendarObservers();
582
+ try {
583
+ const calEls = this._getCalendarElements();
584
+ try {
585
+ const panel = this.overlayPanel;
586
+ if (panel && panel.el && panel.el.nativeElement) {
587
+ const el = panel.el.nativeElement.querySelector('.p-datepicker');
588
+ if (el)
589
+ calEls.push(el);
590
+ }
591
+ }
592
+ catch (e) { }
593
+ calEls.forEach((el) => {
594
+ const obs = new MutationObserver(() => {
595
+ // Reapply classes after DOM changes (debounced)
596
+ this._scheduleUpdate();
597
+ });
598
+ // Watch childList, subtree and class attribute changes (span class toggles are common)
599
+ obs.observe(el, {
600
+ childList: true,
601
+ subtree: true,
602
+ attributes: true,
603
+ attributeFilter: ['class'],
604
+ });
605
+ this._calendarObservers.push(obs);
606
+ this._observedElements.push(el);
607
+ // Also observe parent - if PrimeNG replaces the .p-datepicker element, parent childList changes will fire
608
+ const parent = el.parentElement;
609
+ if (parent && this._observedParentElements.indexOf(parent) === -1) {
610
+ const parentObs = new MutationObserver(() => {
611
+ // reattach observers since the calEl may have been replaced
612
+ this._scheduleUpdate();
613
+ // detach and re-attach observers after DOM settles
614
+ setTimeout(() => {
615
+ try {
616
+ this._stopCalendarObservers();
617
+ this._startCalendarObservers();
618
+ }
619
+ catch (e) { }
620
+ }, 100); // slightly larger delay to let PrimeNG finish the month rendering
621
+ });
622
+ parentObs.observe(parent, { childList: true, subtree: false });
623
+ this._parentObservers.push(parentObs);
624
+ this._observedParentElements.push(parent);
625
+ }
626
+ });
627
+ }
628
+ catch (e) {
629
+ // ignore
630
+ }
631
+ }
632
+ _stopCalendarObservers() {
633
+ try {
634
+ this._calendarObservers.forEach((obs) => obs.disconnect());
635
+ this._parentObservers.forEach((obs) => obs.disconnect());
636
+ }
637
+ catch (e) { }
638
+ this._calendarObservers = [];
639
+ this._observedElements = [];
640
+ this._parentObservers = [];
641
+ this._observedParentElements = [];
642
+ }
643
+ _scheduleUpdate() {
644
+ if (this._updateRafId != null)
645
+ return; // already scheduled
646
+ this._updateRafId = window.requestAnimationFrame(() => {
647
+ this._updateRafId = null;
648
+ this._updateStartEndRangeClasses();
649
+ });
650
+ }
651
+ _cancelScheduledUpdate() {
652
+ if (this._updateRafId != null) {
653
+ window.cancelAnimationFrame(this._updateRafId);
654
+ this._updateRafId = null;
655
+ }
656
+ }
657
+ _getCalendarElements() {
658
+ const calEls = [];
659
+ const overlayCal = document.querySelector('.atomix-overlay-calendar .p-datepicker');
660
+ const inlineCal = document.querySelector('.inline-calendar .p-datepicker');
661
+ if (overlayCal)
662
+ calEls.push(overlayCal);
663
+ if (inlineCal)
664
+ calEls.push(inlineCal);
665
+ try {
666
+ const panel = this.overlayPanel;
667
+ if (panel && panel.el && panel.el.nativeElement) {
668
+ const el = panel.el.nativeElement.querySelector('.p-datepicker');
669
+ if (el)
670
+ calEls.push(el);
671
+ }
672
+ }
673
+ catch (e) { }
674
+ // remove duplicates
675
+ return Array.from(new Set(calEls));
676
+ }
677
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AtomixDaterangeCalendarComponent, deps: [{ token: i1.DatePipe }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component });
678
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: AtomixDaterangeCalendarComponent, selector: "atomix-daterange-calendar", inputs: { placeholder: "placeholder", styleClass: "styleClass", selectionMode: "selectionMode", inputStyleClass: "inputStyleClass", inline: "inline", disabled: "disabled", selectedDate: "selectedDate", maxDate: "maxDate", minDate: "minDate", defaultPreset: "defaultPreset", preservePreset: "preservePreset", customPresets: "customPresets", selectedCustomPreset: "selectedCustomPreset" }, outputs: { customPresetClick: "customPresetClick", dateRangeChange: "dateRangeChange" }, viewQueries: [{ propertyName: "overlayPanel", first: true, predicate: ["overlayPanel"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div>\n <ng-container *ngIf=\"!inline; else inlineBlock\">\n <div [ngClass]=\"styleClass\" class=\"input-wrapper\">\n <input\n pInputText\n type=\"text\"\n [ngClass]=\"inputStyleClass\"\n [placeholder]=\"placeholder\"\n [value]=\"getDateRangeLabel()\"\n readonly\n [disabled]=\"disabled\"\n (click)=\"overlayPanel?.toggle($event)\"\n (keydown)=\"onInputKeyDown($event)\"\n />\n <i\n class=\"pi pi-calendar input-icon\"\n title=\"Open calendar\"\n (click)=\"!disabled && overlayPanel?.toggle($event)\"\n ></i>\n <i\n *ngIf=\"hasSelection\"\n class=\"pi pi-times input-clear-icon\"\n title=\"Clear\"\n tabindex=\"0\"\n (click)=\"!disabled && clearAndStop($event)\"\n (keydown.enter)=\"!disabled && clearAndStop($event)\"\n (keydown.space)=\"!disabled && clearAndStop($event)\"\n ></i>\n </div>\n\n <p-overlayPanel\n #overlayPanel\n [dismissable]=\"true\"\n appendTo=\"body\"\n styleClass=\"atomix-date-range-overlay\"\n (onShow)=\"onOverlayShow()\"\n (onHide)=\"onOverlayHide()\"\n >\n <div class=\"overlay-inner\">\n <div class=\"overlay-left\">\n <div class=\"preset-list\">\n <button\n pButton\n pRipple\n type=\"button\"\n class=\"preset-btn\"\n (click)=\"applyPreset('today')\"\n [ngClass]=\"{ active: selectedPreset === 'today' }\"\n label=\"Today\"\n ></button>\n <button\n pButton\n pRipple\n type=\"button\"\n class=\"preset-btn\"\n (click)=\"applyPreset('yesterday')\"\n [ngClass]=\"{ active: selectedPreset === 'yesterday' }\"\n label=\"Yesterday\"\n ></button>\n <button\n pButton\n pRipple\n type=\"button\"\n class=\"preset-btn\"\n (click)=\"applyPreset('last7days')\"\n [ngClass]=\"{ active: selectedPreset === 'last7days' }\"\n label=\"Last 7 days\"\n ></button>\n <button\n pButton\n pRipple\n type=\"button\"\n class=\"preset-btn\"\n (click)=\"applyPreset('last30days')\"\n [ngClass]=\"{ active: selectedPreset === 'last30days' }\"\n label=\"Last 30 days\"\n ></button>\n <button\n pButton\n pRipple\n type=\"button\"\n class=\"preset-btn\"\n (click)=\"applyPreset('last3months')\"\n [ngClass]=\"{ active: selectedPreset === 'last3months' }\"\n label=\"Last 3 months\"\n ></button>\n <button\n pButton\n pRipple\n type=\"button\"\n class=\"preset-btn\"\n (click)=\"applyPreset('last6months')\"\n [ngClass]=\"{ active: selectedPreset === 'last6months' }\"\n label=\"Last 6 months\"\n ></button>\n <button\n pButton\n pRipple\n type=\"button\"\n class=\"preset-btn\"\n (click)=\"applyPreset('last1year')\"\n [ngClass]=\"{ active: selectedPreset === 'last1year' }\"\n label=\"Last 1 year\"\n ></button>\n <ng-container *ngFor=\"let cp of customPresets\">\n <button pButton pRipple type=\"button\" class=\"preset-btn\" (click)=\"onCustomPresetClick(cp.key)\" [ngClass]=\"{ 'active': selectedPreset === cp.key }\" [label]=\"cp.label\"></button>\n </ng-container>\n <a class=\"reset-link\" (click)=\"resetAndClose()\">Reset</a>\n </div>\n </div>\n <div class=\"overlay-right\">\n <p-calendar\n [(ngModel)]=\"modelDate\"\n [selectionMode]=\"'range'\"\n [inline]=\"true\"\n [dateFormat]=\"'mm/dd/yyyy'\"\n [showOtherMonths]=\"true\"\n [locale]=\"enLocale\"\n [showIcon]=\"false\"\n [styleClass]=\"'atomix-overlay-calendar'\"\n (ngModelChange)=\"onModelChange($event)\"\n (onMonthChange)=\"onCalendarViewChanged($event)\"\n (onYearChange)=\"onCalendarViewChanged($event)\"\n [disabled]=\"disabled\"\n [maxDate]=\"maxDate\"\n [minDate]=\"minDate\"\n ></p-calendar>\n </div>\n </div>\n </p-overlayPanel>\n </ng-container>\n\n <ng-template #inlineBlock>\n <div [ngClass]=\"styleClass\" class=\"input-wrapper\">\n <input\n pInputText\n type=\"text\"\n [ngClass]=\"inputStyleClass\"\n [placeholder]=\"placeholder\"\n [value]=\"getDateRangeLabel()\"\n readonly\n [disabled]=\"disabled\"\n (keydown)=\"onInputKeyDown($event)\"\n />\n <i class=\"pi pi-calendar input-icon\" title=\"Open calendar\"></i>\n <i\n *ngIf=\"hasSelection\"\n class=\"pi pi-times input-clear-icon\"\n title=\"Clear\"\n tabindex=\"0\"\n (click)=\"clearAndStop($event)\"\n (keydown.enter)=\"clearAndStop($event)\"\n (keydown.space)=\"clearAndStop($event)\"\n ></i>\n </div>\n <div class=\"overlay-inner inline-calendar flex\">\n <div class=\"overlay-left\">\n <div class=\"preset-list\">\n <button\n pButton\n pRipple\n type=\"button\"\n class=\"preset-btn\"\n (click)=\"applyPreset('today')\"\n [ngClass]=\"{ active: selectedPreset === 'today' }\"\n label=\"Today\"\n ></button>\n <button\n pButton\n pRipple\n type=\"button\"\n class=\"preset-btn\"\n (click)=\"applyPreset('yesterday')\"\n [ngClass]=\"{ active: selectedPreset === 'yesterday' }\"\n label=\"Yesterday\"\n ></button>\n <button\n pButton\n pRipple\n type=\"button\"\n class=\"preset-btn\"\n (click)=\"applyPreset('last7days')\"\n [ngClass]=\"{ active: selectedPreset === 'last7days' }\"\n label=\"Last 7 days\"\n ></button>\n <button\n pButton\n pRipple\n type=\"button\"\n class=\"preset-btn\"\n (click)=\"applyPreset('last30days')\"\n [ngClass]=\"{ active: selectedPreset === 'last30days' }\"\n label=\"Last 30 days\"\n ></button>\n <button\n pButton\n pRipple\n type=\"button\"\n class=\"preset-btn\"\n (click)=\"applyPreset('last3months')\"\n [ngClass]=\"{ active: selectedPreset === 'last3months' }\"\n label=\"Last 3 months\"\n ></button>\n <button\n pButton\n pRipple\n type=\"button\"\n class=\"preset-btn\"\n (click)=\"applyPreset('last1year')\"\n [ngClass]=\"{ active: selectedPreset === 'last1year' }\"\n label=\"Last 1 year\"\n ></button>\n <ng-container *ngFor=\"let cp of customPresets\">\n <button pButton pRipple type=\"button\" class=\"preset-btn\" (click)=\"onCustomPresetClick(cp.key)\" [ngClass]=\"{ 'active': selectedPreset === cp.key }\" [label]=\"cp.label\"></button>\n </ng-container>\n <a class=\"reset-link\" (click)=\"resetAndClose()\">Reset</a>\n </div>\n </div>\n <div class=\"overlay-right\">\n <p-calendar\n [(ngModel)]=\"modelDate\"\n [selectionMode]=\"'range'\"\n [inline]=\"true\"\n [dateFormat]=\"'mm/dd/yyyy'\"\n [showOtherMonths]=\"true\"\n [locale]=\"enLocale\"\n [showIcon]=\"false\"\n [styleClass]=\"'atomix-overlay-calendar'\"\n (ngModelChange)=\"onModelChange($event)\"\n (onMonthChange)=\"onCalendarViewChanged($event)\"\n (onYearChange)=\"onCalendarViewChanged($event)\"\n [disabled]=\"disabled\"\n [maxDate]=\"maxDate\"\n [minDate]=\"minDate\"\n ></p-calendar>\n </div>\n </div>\n </ng-template>\n</div>\n", styles: ["::ng-deep .p-calendar button{background-color:transparent!important}::ng-deep .p-overlaypanel .p-overlaypanel-content{margin-top:0!important}::ng-deep .p-datepicker{border:none!important;border-radius:var(--global-border-radius)}::ng-deep .p-datepicker .p-datepicker-header .p-datepicker-title .p-datepicker-month{color:#63b77e;transition:background-color .2s,color .2s,box-shadow .2s;font-weight:600;padding:.5rem}::ng-deep .p-datepicker .p-datepicker-header .p-datepicker-title .p-datepicker-year,::ng-deep .p-datepicker .p-datepicker-header .p-datepicker-title .p-datepicker-month{color:#63b77e;transition:background-color .2s,color .2s,box-shadow .2s;font-weight:600;padding:.5rem}::ng-deep .p-datepicker .p-monthpicker .p-monthpicker-month.p-highlight{color:#fff;background:#63c984;padding:1rem!important}::ng-deep .p-datepicker .p-monthpicker .p-monthpicker-month{padding:1rem!important}::ng-deep .p-datepicker .p-yearpicker .p-yearpicker-year.p-highlight{color:#fff;background:#63b77e;padding:1rem!important}::ng-deep .p-datepicker .p-yearpicker .p-yearpicker-year{padding:1rem!important}::ng-deep .p-datepicker table th{border-bottom:1px solid rgba(0,0,0,.12);color:var(--text-gray-700);font-weight:400;font-size:.875rem}::ng-deep .p-datepicker table td>span.p-highlight{color:#fff;background:#63c984}::ng-deep .p-datepicker table td{padding:.2rem 0}::ng-deep .p-datepicker table td>span{width:2.8rem;height:2.8rem;border-radius:0%;transition:none}::ng-deep .p-datepicker table td.p-datepicker-today>span{box-shadow:inset 0 0 0 2px #00000061}::ng-deep .p-datepicker table td>span.p-highlight.start-range{border-top-left-radius:10px;border-bottom-left-radius:10px}::ng-deep .p-datepicker table td>span.p-highlight.end-range{border-top-right-radius:10px;border-bottom-right-radius:10px}::ng-deep .p-datepicker table td>span.p-highlight.between-range{background:#00c37dad!important}::ng-deep .p-monthpicker-month{width:50%!important}::ng-deep .p-yearpicker-year{width:50%!important}::ng-deep .inline-calendar .p-datepicker table td>span{width:2.4rem;height:2.4rem}::ng-deep .inline-calendar{border-bottom:1px solid #e5e5e5}::ng-deep .atomix-date-range-overlay{border-radius:var(--global-border-radius)}.overlay-inner{display:flex;gap:1rem;align-items:flex-start;flex-wrap:nowrap}.overlay-left{padding:.75rem .75rem 2rem;text-align:center;border-right:1px solid #e5e5e5}.inline-calendar .overlay-left{padding-bottom:2rem}.input-wrapper{display:flex;align-items:center;gap:.5rem;position:relative}.input-wrapper input[readonly]{cursor:pointer;padding-right:40px!important;border-radius:var(--global-border-radius)}.input-wrapper input{color:#000000de}.input-wrapper input::placeholder{color:#0009}.input-icon{cursor:pointer;color:var(--primary-text-color)!important;position:absolute;right:10px}.input-clear-icon{cursor:pointer;color:var(--primary-text-color)!important;position:absolute;right:27px}.preset-list{display:flex;flex-direction:column;gap:0}.preset-btn{justify-content:flex-start;text-align:left;padding-left:8px}.inline-calendar .preset-btn{padding:.3rem .8rem!important}.inline-calendar{gap:0}.preset-btn .p-button-label{display:inline-block}.preset-btn:not(.p-button-outlined){background-color:transparent;color:var(--text-gray-700);border-radius:var(--global-border-radius)}.preset-btn:hover{background-color:#63b77e}.preset-btn.active,.preset-btn.p-button.active,.preset-btn.custom-active,.preset-btn.p-button.custom-active{background-color:#63b77e!important;color:#fff!important;font-weight:700;line-height:17px;border-radius:var(--global-border-radius)}.reset-link{text-align:left;cursor:pointer;margin-top:10px;padding:.3rem 1.4rem!important;color:#63b77e;font-weight:600}.atomix-date-range-overlay .overlay-left .reset-link{display:inline-block;margin-top:1rem;color:#2196f3;cursor:pointer}.overlay-right{flex:1;width:230px;max-width:230px}.overlay-inner.inline{flex-direction:row}:host ::ng-deep .p-column-filter-menu .overlay-inner.inline{display:flex!important;flex-direction:row!important;flex-wrap:nowrap!important}:host ::ng-deep .p-overlaypanel .overlay-inner.inline{display:flex!important;flex-direction:row!important}.overlay-actions{display:flex;gap:.5rem;justify-content:flex-end;margin-top:.5rem}.atomix-overlay-calendar ::ng-deep .p-datepicker{width:100%}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading", "severity", "raised", "rounded", "text", "outlined", "size", "plain"] }, { kind: "directive", type: i3.InputText, selector: "[pInputText]", inputs: ["variant"] }, { kind: "component", type: i4.Calendar, selector: "p-calendar", inputs: ["iconDisplay", "style", "styleClass", "inputStyle", "inputId", "name", "inputStyleClass", "placeholder", "ariaLabelledBy", "ariaLabel", "iconAriaLabel", "disabled", "dateFormat", "multipleSeparator", "rangeSeparator", "inline", "showOtherMonths", "selectOtherMonths", "showIcon", "icon", "appendTo", "readonlyInput", "shortYearCutoff", "monthNavigator", "yearNavigator", "hourFormat", "timeOnly", "stepYearPicker", "stepHour", "stepMinute", "stepSecond", "showSeconds", "required", "showOnFocus", "showWeek", "startWeekFromFirstDayOfYear", "showClear", "dataType", "selectionMode", "maxDateCount", "showButtonBar", "todayButtonStyleClass", "clearButtonStyleClass", "autofocus", "autoZIndex", "baseZIndex", "panelStyleClass", "panelStyle", "keepInvalid", "hideOnDateTimeSelect", "touchUI", "timeSeparator", "focusTrap", "showTransitionOptions", "hideTransitionOptions", "tabindex", "variant", "minDate", "maxDate", "disabledDates", "disabledDays", "yearRange", "showTime", "responsiveOptions", "numberOfMonths", "firstDayOfWeek", "locale", "view", "defaultDate"], outputs: ["onFocus", "onBlur", "onClose", "onSelect", "onClear", "onInput", "onTodayClick", "onClearClick", "onMonthChange", "onYearChange", "onClickOutside", "onShow"] }, { kind: "component", type: i5.OverlayPanel, selector: "p-overlayPanel", inputs: ["ariaLabel", "ariaLabelledBy", "dismissable", "showCloseIcon", "style", "styleClass", "appendTo", "autoZIndex", "ariaCloseLabel", "baseZIndex", "focusOnShow", "showTransitionOptions", "hideTransitionOptions"], outputs: ["onShow", "onHide"] }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
679
+ }
680
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AtomixDaterangeCalendarComponent, decorators: [{
681
+ type: Component,
682
+ args: [{ selector: 'atomix-daterange-calendar', template: "<div>\n <ng-container *ngIf=\"!inline; else inlineBlock\">\n <div [ngClass]=\"styleClass\" class=\"input-wrapper\">\n <input\n pInputText\n type=\"text\"\n [ngClass]=\"inputStyleClass\"\n [placeholder]=\"placeholder\"\n [value]=\"getDateRangeLabel()\"\n readonly\n [disabled]=\"disabled\"\n (click)=\"overlayPanel?.toggle($event)\"\n (keydown)=\"onInputKeyDown($event)\"\n />\n <i\n class=\"pi pi-calendar input-icon\"\n title=\"Open calendar\"\n (click)=\"!disabled && overlayPanel?.toggle($event)\"\n ></i>\n <i\n *ngIf=\"hasSelection\"\n class=\"pi pi-times input-clear-icon\"\n title=\"Clear\"\n tabindex=\"0\"\n (click)=\"!disabled && clearAndStop($event)\"\n (keydown.enter)=\"!disabled && clearAndStop($event)\"\n (keydown.space)=\"!disabled && clearAndStop($event)\"\n ></i>\n </div>\n\n <p-overlayPanel\n #overlayPanel\n [dismissable]=\"true\"\n appendTo=\"body\"\n styleClass=\"atomix-date-range-overlay\"\n (onShow)=\"onOverlayShow()\"\n (onHide)=\"onOverlayHide()\"\n >\n <div class=\"overlay-inner\">\n <div class=\"overlay-left\">\n <div class=\"preset-list\">\n <button\n pButton\n pRipple\n type=\"button\"\n class=\"preset-btn\"\n (click)=\"applyPreset('today')\"\n [ngClass]=\"{ active: selectedPreset === 'today' }\"\n label=\"Today\"\n ></button>\n <button\n pButton\n pRipple\n type=\"button\"\n class=\"preset-btn\"\n (click)=\"applyPreset('yesterday')\"\n [ngClass]=\"{ active: selectedPreset === 'yesterday' }\"\n label=\"Yesterday\"\n ></button>\n <button\n pButton\n pRipple\n type=\"button\"\n class=\"preset-btn\"\n (click)=\"applyPreset('last7days')\"\n [ngClass]=\"{ active: selectedPreset === 'last7days' }\"\n label=\"Last 7 days\"\n ></button>\n <button\n pButton\n pRipple\n type=\"button\"\n class=\"preset-btn\"\n (click)=\"applyPreset('last30days')\"\n [ngClass]=\"{ active: selectedPreset === 'last30days' }\"\n label=\"Last 30 days\"\n ></button>\n <button\n pButton\n pRipple\n type=\"button\"\n class=\"preset-btn\"\n (click)=\"applyPreset('last3months')\"\n [ngClass]=\"{ active: selectedPreset === 'last3months' }\"\n label=\"Last 3 months\"\n ></button>\n <button\n pButton\n pRipple\n type=\"button\"\n class=\"preset-btn\"\n (click)=\"applyPreset('last6months')\"\n [ngClass]=\"{ active: selectedPreset === 'last6months' }\"\n label=\"Last 6 months\"\n ></button>\n <button\n pButton\n pRipple\n type=\"button\"\n class=\"preset-btn\"\n (click)=\"applyPreset('last1year')\"\n [ngClass]=\"{ active: selectedPreset === 'last1year' }\"\n label=\"Last 1 year\"\n ></button>\n <ng-container *ngFor=\"let cp of customPresets\">\n <button pButton pRipple type=\"button\" class=\"preset-btn\" (click)=\"onCustomPresetClick(cp.key)\" [ngClass]=\"{ 'active': selectedPreset === cp.key }\" [label]=\"cp.label\"></button>\n </ng-container>\n <a class=\"reset-link\" (click)=\"resetAndClose()\">Reset</a>\n </div>\n </div>\n <div class=\"overlay-right\">\n <p-calendar\n [(ngModel)]=\"modelDate\"\n [selectionMode]=\"'range'\"\n [inline]=\"true\"\n [dateFormat]=\"'mm/dd/yyyy'\"\n [showOtherMonths]=\"true\"\n [locale]=\"enLocale\"\n [showIcon]=\"false\"\n [styleClass]=\"'atomix-overlay-calendar'\"\n (ngModelChange)=\"onModelChange($event)\"\n (onMonthChange)=\"onCalendarViewChanged($event)\"\n (onYearChange)=\"onCalendarViewChanged($event)\"\n [disabled]=\"disabled\"\n [maxDate]=\"maxDate\"\n [minDate]=\"minDate\"\n ></p-calendar>\n </div>\n </div>\n </p-overlayPanel>\n </ng-container>\n\n <ng-template #inlineBlock>\n <div [ngClass]=\"styleClass\" class=\"input-wrapper\">\n <input\n pInputText\n type=\"text\"\n [ngClass]=\"inputStyleClass\"\n [placeholder]=\"placeholder\"\n [value]=\"getDateRangeLabel()\"\n readonly\n [disabled]=\"disabled\"\n (keydown)=\"onInputKeyDown($event)\"\n />\n <i class=\"pi pi-calendar input-icon\" title=\"Open calendar\"></i>\n <i\n *ngIf=\"hasSelection\"\n class=\"pi pi-times input-clear-icon\"\n title=\"Clear\"\n tabindex=\"0\"\n (click)=\"clearAndStop($event)\"\n (keydown.enter)=\"clearAndStop($event)\"\n (keydown.space)=\"clearAndStop($event)\"\n ></i>\n </div>\n <div class=\"overlay-inner inline-calendar flex\">\n <div class=\"overlay-left\">\n <div class=\"preset-list\">\n <button\n pButton\n pRipple\n type=\"button\"\n class=\"preset-btn\"\n (click)=\"applyPreset('today')\"\n [ngClass]=\"{ active: selectedPreset === 'today' }\"\n label=\"Today\"\n ></button>\n <button\n pButton\n pRipple\n type=\"button\"\n class=\"preset-btn\"\n (click)=\"applyPreset('yesterday')\"\n [ngClass]=\"{ active: selectedPreset === 'yesterday' }\"\n label=\"Yesterday\"\n ></button>\n <button\n pButton\n pRipple\n type=\"button\"\n class=\"preset-btn\"\n (click)=\"applyPreset('last7days')\"\n [ngClass]=\"{ active: selectedPreset === 'last7days' }\"\n label=\"Last 7 days\"\n ></button>\n <button\n pButton\n pRipple\n type=\"button\"\n class=\"preset-btn\"\n (click)=\"applyPreset('last30days')\"\n [ngClass]=\"{ active: selectedPreset === 'last30days' }\"\n label=\"Last 30 days\"\n ></button>\n <button\n pButton\n pRipple\n type=\"button\"\n class=\"preset-btn\"\n (click)=\"applyPreset('last3months')\"\n [ngClass]=\"{ active: selectedPreset === 'last3months' }\"\n label=\"Last 3 months\"\n ></button>\n <button\n pButton\n pRipple\n type=\"button\"\n class=\"preset-btn\"\n (click)=\"applyPreset('last1year')\"\n [ngClass]=\"{ active: selectedPreset === 'last1year' }\"\n label=\"Last 1 year\"\n ></button>\n <ng-container *ngFor=\"let cp of customPresets\">\n <button pButton pRipple type=\"button\" class=\"preset-btn\" (click)=\"onCustomPresetClick(cp.key)\" [ngClass]=\"{ 'active': selectedPreset === cp.key }\" [label]=\"cp.label\"></button>\n </ng-container>\n <a class=\"reset-link\" (click)=\"resetAndClose()\">Reset</a>\n </div>\n </div>\n <div class=\"overlay-right\">\n <p-calendar\n [(ngModel)]=\"modelDate\"\n [selectionMode]=\"'range'\"\n [inline]=\"true\"\n [dateFormat]=\"'mm/dd/yyyy'\"\n [showOtherMonths]=\"true\"\n [locale]=\"enLocale\"\n [showIcon]=\"false\"\n [styleClass]=\"'atomix-overlay-calendar'\"\n (ngModelChange)=\"onModelChange($event)\"\n (onMonthChange)=\"onCalendarViewChanged($event)\"\n (onYearChange)=\"onCalendarViewChanged($event)\"\n [disabled]=\"disabled\"\n [maxDate]=\"maxDate\"\n [minDate]=\"minDate\"\n ></p-calendar>\n </div>\n </div>\n </ng-template>\n</div>\n", styles: ["::ng-deep .p-calendar button{background-color:transparent!important}::ng-deep .p-overlaypanel .p-overlaypanel-content{margin-top:0!important}::ng-deep .p-datepicker{border:none!important;border-radius:var(--global-border-radius)}::ng-deep .p-datepicker .p-datepicker-header .p-datepicker-title .p-datepicker-month{color:#63b77e;transition:background-color .2s,color .2s,box-shadow .2s;font-weight:600;padding:.5rem}::ng-deep .p-datepicker .p-datepicker-header .p-datepicker-title .p-datepicker-year,::ng-deep .p-datepicker .p-datepicker-header .p-datepicker-title .p-datepicker-month{color:#63b77e;transition:background-color .2s,color .2s,box-shadow .2s;font-weight:600;padding:.5rem}::ng-deep .p-datepicker .p-monthpicker .p-monthpicker-month.p-highlight{color:#fff;background:#63c984;padding:1rem!important}::ng-deep .p-datepicker .p-monthpicker .p-monthpicker-month{padding:1rem!important}::ng-deep .p-datepicker .p-yearpicker .p-yearpicker-year.p-highlight{color:#fff;background:#63b77e;padding:1rem!important}::ng-deep .p-datepicker .p-yearpicker .p-yearpicker-year{padding:1rem!important}::ng-deep .p-datepicker table th{border-bottom:1px solid rgba(0,0,0,.12);color:var(--text-gray-700);font-weight:400;font-size:.875rem}::ng-deep .p-datepicker table td>span.p-highlight{color:#fff;background:#63c984}::ng-deep .p-datepicker table td{padding:.2rem 0}::ng-deep .p-datepicker table td>span{width:2.8rem;height:2.8rem;border-radius:0%;transition:none}::ng-deep .p-datepicker table td.p-datepicker-today>span{box-shadow:inset 0 0 0 2px #00000061}::ng-deep .p-datepicker table td>span.p-highlight.start-range{border-top-left-radius:10px;border-bottom-left-radius:10px}::ng-deep .p-datepicker table td>span.p-highlight.end-range{border-top-right-radius:10px;border-bottom-right-radius:10px}::ng-deep .p-datepicker table td>span.p-highlight.between-range{background:#00c37dad!important}::ng-deep .p-monthpicker-month{width:50%!important}::ng-deep .p-yearpicker-year{width:50%!important}::ng-deep .inline-calendar .p-datepicker table td>span{width:2.4rem;height:2.4rem}::ng-deep .inline-calendar{border-bottom:1px solid #e5e5e5}::ng-deep .atomix-date-range-overlay{border-radius:var(--global-border-radius)}.overlay-inner{display:flex;gap:1rem;align-items:flex-start;flex-wrap:nowrap}.overlay-left{padding:.75rem .75rem 2rem;text-align:center;border-right:1px solid #e5e5e5}.inline-calendar .overlay-left{padding-bottom:2rem}.input-wrapper{display:flex;align-items:center;gap:.5rem;position:relative}.input-wrapper input[readonly]{cursor:pointer;padding-right:40px!important;border-radius:var(--global-border-radius)}.input-wrapper input{color:#000000de}.input-wrapper input::placeholder{color:#0009}.input-icon{cursor:pointer;color:var(--primary-text-color)!important;position:absolute;right:10px}.input-clear-icon{cursor:pointer;color:var(--primary-text-color)!important;position:absolute;right:27px}.preset-list{display:flex;flex-direction:column;gap:0}.preset-btn{justify-content:flex-start;text-align:left;padding-left:8px}.inline-calendar .preset-btn{padding:.3rem .8rem!important}.inline-calendar{gap:0}.preset-btn .p-button-label{display:inline-block}.preset-btn:not(.p-button-outlined){background-color:transparent;color:var(--text-gray-700);border-radius:var(--global-border-radius)}.preset-btn:hover{background-color:#63b77e}.preset-btn.active,.preset-btn.p-button.active,.preset-btn.custom-active,.preset-btn.p-button.custom-active{background-color:#63b77e!important;color:#fff!important;font-weight:700;line-height:17px;border-radius:var(--global-border-radius)}.reset-link{text-align:left;cursor:pointer;margin-top:10px;padding:.3rem 1.4rem!important;color:#63b77e;font-weight:600}.atomix-date-range-overlay .overlay-left .reset-link{display:inline-block;margin-top:1rem;color:#2196f3;cursor:pointer}.overlay-right{flex:1;width:230px;max-width:230px}.overlay-inner.inline{flex-direction:row}:host ::ng-deep .p-column-filter-menu .overlay-inner.inline{display:flex!important;flex-direction:row!important;flex-wrap:nowrap!important}:host ::ng-deep .p-overlaypanel .overlay-inner.inline{display:flex!important;flex-direction:row!important}.overlay-actions{display:flex;gap:.5rem;justify-content:flex-end;margin-top:.5rem}.atomix-overlay-calendar ::ng-deep .p-datepicker{width:100%}\n"] }]
683
+ }], ctorParameters: () => [{ type: i1.DatePipe }, { type: i0.Renderer2 }], propDecorators: { placeholder: [{
684
+ type: Input
685
+ }], styleClass: [{
686
+ type: Input
687
+ }], selectionMode: [{
688
+ type: Input
689
+ }], inputStyleClass: [{
690
+ type: Input
691
+ }], inline: [{
692
+ type: Input
693
+ }], disabled: [{
694
+ type: Input
695
+ }], selectedDate: [{
696
+ type: Input
697
+ }], maxDate: [{
698
+ type: Input
699
+ }], minDate: [{
700
+ type: Input
701
+ }], defaultPreset: [{
702
+ type: Input
703
+ }], preservePreset: [{
704
+ type: Input
705
+ }], customPresets: [{
706
+ type: Input
707
+ }], selectedCustomPreset: [{
708
+ type: Input
709
+ }], customPresetClick: [{
710
+ type: Output
711
+ }], overlayPanel: [{
712
+ type: ViewChild,
713
+ args: ['overlayPanel']
714
+ }], dateRangeChange: [{
715
+ type: Output
716
+ }] } });
717
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXRvbWl4LWRhdGVyYW5nZS1jYWxlbmRhci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9wcmltZWtpdC9zcmMvbGliL2xpYi9hdG9taXgtZGF0ZXJhbmdlLWNhbGVuZGFyL2F0b21peC1kYXRlcmFuZ2UtY2FsZW5kYXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcHJpbWVraXQvc3JjL2xpYi9saWIvYXRvbWl4LWRhdGVyYW5nZS1jYWxlbmRhci9hdG9taXgtZGF0ZXJhbmdlLWNhbGVuZGFyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFDTCxNQUFNLEVBQ04sU0FBUyxHQU1WLE1BQU0sZUFBZSxDQUFDOzs7Ozs7OztBQVN2QixNQUFNLE9BQU8sZ0NBQWdDO0lBMEZqQztJQUNBO0lBeEZELFdBQVcsR0FBVyxFQUFFLENBQUM7SUFDekIsVUFBVSxHQUFXLEVBQUUsQ0FBQztJQUN4QixhQUFhLEdBQVksT0FBTyxDQUFDO0lBQ2pDLGVBQWUsR0FBVyxFQUFFLENBQUM7SUFDN0IsTUFBTSxHQUFZLEtBQUssQ0FBQztJQUN4QixRQUFRLEdBQVksS0FBSyxDQUFDO0lBQzFCLFlBQVksR0FBUSxJQUFJLENBQUM7SUFDekIsT0FBTyxDQUFRO0lBQ2YsT0FBTyxDQUFRO0lBQ2YsYUFBYSxHQVFYLElBQUksQ0FBQztJQUNQLGNBQWMsR0FBWSxLQUFLLENBQUM7SUFDaEMsYUFBYSxHQUFxQyxFQUFFLENBQUM7SUFDckQsb0JBQW9CLEdBQWtCLElBQUksQ0FBQztJQUUxQyxpQkFBaUIsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO0lBRXpELGVBQWUsR0FBWSxLQUFLLENBQUM7SUFDakMsY0FBYyxHQUFrQixJQUFJLENBQUMsQ0FBQyxxSEFBcUg7SUFDaEksWUFBWSxD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QWM7c0JBQXRCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxvQkFBb0I7c0JBQTVCLEtBQUs7Z0JBRUksaUJBQWlCO3NCQUExQixNQUFNO2dCQUlvQixZQUFZO3NCQUF0QyxTQUFTO3VCQUFDLGNBQWM7Z0JBQ2YsZUFBZTtzQkFBeEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBWaWV3Q2hpbGQsXG4gIE9uQ2hhbmdlcyxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgT25Jbml0LFxuICBPbkRlc3Ryb3ksXG4gIFJlbmRlcmVyMixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPdmVybGF5UGFuZWwgfSBmcm9tICdwcmltZW5nL292ZXJsYXlwYW5lbCc7XG5pbXBvcnQgeyBEYXRlUGlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2F0b21peC1kYXRlcmFuZ2UtY2FsZW5kYXInLFxuICB0ZW1wbGF0ZVVybDogJy4vYXRvbWl4LWRhdGVyYW5nZS1jYWxlbmRhci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2F0b21peC1kYXRlcmFuZ2UtY2FsZW5kYXIuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgQXRvbWl4RGF0ZXJhbmdlQ2FsZW5kYXJDb21wb25lbnRcbiAgaW1wbGVtZW50cyBPbkNoYW5nZXMsIE9uSW5pdCwgT25EZXN0cm95XG57XG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgc3R5bGVDbGFzczogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIHNlbGVjdGlvbk1vZGU6ICdyYW5nZScgPSAncmFuZ2UnO1xuICBASW5wdXQoKSBpbnB1dFN0eWxlQ2xhc3M6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBpbmxpbmU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgZGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgc2VsZWN0ZWREYXRlOiBhbnkgPSBudWxsO1xuICBASW5wdXQoKSBtYXhEYXRlITogRGF0ZTtcbiAgQElucHV0KCkgbWluRGF0ZSE6IERhdGU7XG4gIEBJbnB1dCgpIGRlZmF1bHRQcmVzZXQ6XG4gICAgfCAndG9kYXknXG4gICAgfCAneWVzdGVyZGF5J1xuICAgIHwgJ2xhc3Q3ZGF5cydcbiAgICB8ICdsYXN0MzBkYXlzJ1xuICAgIHwgJ2xhc3QzbW9udGhzJ1xuICAgIHwgJ2xhc3Q2bW9udGhzJ1xuICAgIHwgJ2xhc3QxeWVhcidcbiAgICB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBwcmVzZXJ2ZVByZXNldDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBjdXN0b21QcmVzZXRzOiB7IGtleTogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH1bXSA9IFtdO1xuICBASW5wdXQoKSBzZWxlY3RlZEN1c3RvbVByZXNldDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgQE91dHB1dCgpIGN1c3RvbVByZXNldENsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cbiAgY3VzdG9tUmFuZ2VNb2RlOiBib29sZWFuID0gZmFsc2U7XG4gIHNlbGVjdGVkUHJlc2V0OiBzdHJpbmcgfCBudWxsID0gbnVsbDsgLy8gJ3RvZGF5JyB8ICd5ZXN0ZXJkYXknIHwgJ2xhc3Q3ZGF5cycgfCAnbGFzdDMwZGF5cycgfCAnbGFzdDNtb250aHMnIHwgJ2xhc3Q2bW9udGhzJyB8ICdsYXN0MXllYXInIHwgJ2N1c3RvbScgfCBudWxsXG4gIEBWaWV3Q2hpbGQoJ292ZXJsYXlQYW5lbCcpIG92ZXJsYXlQYW5lbD86IE92ZXJsYXlQYW5lbDtcbiAgQE91dHB1dCgpIGRhdGVSYW5nZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIC8vIGludGVybmFsIG1vZGVsIGJvdW5kIHRvIHAtY2FsZW5kYXIgdG8gYXZvaWQgY2hhbmdpbmcgZXh0ZXJuYWwgc2VsZWN0aW9uIGR1cmluZyBmaXJzdC1jbGljayBzZWxlY3Rpb25cbiAgbW9kZWxEYXRlOiBEYXRlW10gfCBudWxsID0gbnVsbDtcblxuICBlbkxvY2FsZSA9IHtcbiAgICBmaXJzdERheU9mV2VlazogMCxcbiAgICBkYXlOYW1lczogW1xuICAgICAgJ1N1bmRheScsXG4gICAgICAnTW9uZGF5JyxcbiAgICAgICdUdWVzZGF5JyxcbiAgICAgICdXZWRuZXNkYXknLFxuICAgICAgJ1RodXJzZGF5JyxcbiAgICAgICdGcmlkYXknLFxuICAgICAgJ1NhdHVyZGF5JyxcbiAgICBdLFxuICAgIGRheU5hbWVzU2hvcnQ6IFsnU3VuJywgJ01vbicsICdUdWUnLCAnV2VkJywgJ1RodScsICdGcmknLCAnU2F0J10sXG4gICAgZGF5TmFtZXNNaW46IFsnU3UnLCAnTW8nLCAnVHUnLCAnV2UnLCAnVGgnLCAnRnInLCAnU2EnXSxcbiAgICBtb250aE5hbWVzOiBbXG4gICAgICAnSmFudWFyeScsXG4gICAgICAnRmVicnVhcnknLFxuICAgICAgJ01hcmNoJyxcbiAgICAgICdBcHJpbCcsXG4gICAgICAnTWF5JyxcbiAgICAgICdKdW5lJyxcbiAgICAgICdKdWx5JyxcbiAgICAgICdBdWd1c3QnLFxuICAgICAgJ1NlcHRlbWJlcicsXG4gICAgICAnT2N0b2JlcicsXG4gICAgICAnTm92ZW1iZXInLFxuICAgICAgJ0RlY2VtYmVyJyxcbiAgICBdLFxuICAgIG1vbnRoTmFtZXNTaG9ydDogW1xuICAgICAgJ0phbicsXG4gICAgICAnRmViJyxcbiAgICAgICdNYXInLFxuICAgICAgJ0FwcicsXG4gICAgICAnTWF5JyxcbiAgICAgICdKdW4nLFxuICAgICAgJ0p1bCcsXG4gICAgICAnQXVnJyxcbiAgICAgICdTZXAnLFxuICAgICAgJ09jdCcsXG4gICAgICAnTm92JyxcbiAgICAgICdEZWMnLFxuICAgIF0sXG4gICAgdG9kYXk6ICdUb2RheScsXG4gICAgY2xlYXI6ICdDbGVhcicsXG4gIH07XG5cbiAgLy8gdGVtcG9yYXJ5IHN0b3JhZ2UgZm9yIG92ZXJsYXkgc2Vzc2lvblxuICBwcml2YXRlIF9vdmVybGF5SW5pdGlhbERhdGU6IERhdGVbXSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIF9vdmVybGF5SW5pdGlhbFByZXNldDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgX2NhbGVuZGFyT2JzZXJ2ZXJzOiBNdXRhdGlvbk9ic2VydmVyW10gPSBbXTtcbiAgcHJpdmF0ZSBfb2JzZXJ2ZWRFbGVtZW50czogRWxlbWVudFtdID0gW107XG4gIHByaXZhdGUgX3BhcmVudE9ic2VydmVyczogTXV0YXRpb25PYnNlcnZlcltdID0gW107XG4gIHByaXZhdGUgX29ic2VydmVkUGFyZW50RWxlbWVudHM6IEVsZW1lbnRbXSA9IFtdO1xuICBwcml2YXRlIF91cGRhdGVSYWZJZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7IC8vIHJlcXVlc3RBbmltYXRpb25GcmFtZSBpZFxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgZGF0ZVBpcGU6IERhdGVQaXBlLFxuICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMlxuICApIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgLy8gQXBwbHkgY3VzdG9tIHByZXNldCBpZiBzZXQgZXh0ZXJuYWxseSBhdCBpbml0IHRpbWVcbiAgICBpZiAodGhpcy5zZWxlY3RlZEN1c3RvbVByZXNldCAmJiB0aGlzLmN1c3RvbVByZXNldHM/LmZpbmQocCA9PiBwLmtleSA9PT0gdGhpcy5zZWxlY3RlZEN1c3RvbVByZXNldCkpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRQcmVzZXQgPSB0aGlzLnNlbGVjdGVkQ3VzdG9tUHJlc2V0O1xuICAgICAgdGhpcy5zZWxlY3RlZERhdGUgPSBudWxsO1xuICAgICAgdGhpcy5tb2RlbERhdGUgPSBudWxsO1xuICAgIH0gZWxzZSBpZiAoIXRoaXMuc2VsZWN0ZWREYXRlICYmIHRoaXMuZGVmYXVsdFByZXNldCkge1xuICAgICAgdGhpcy5hcHBseVByZXNldCh0aGlzLmRlZmF1bHRQcmVzZXQpO1xuICAgIH1cbiAgICAvLyBpbml0aWFsaXplIGludGVybmFsIG1vZGVsXG4gICAgdGhpcy5tb2RlbERhdGUgPSB0aGlzLnNlbGVjdGVkRGF0ZSA/IFsuLi50aGlzLnNlbGVjdGVkRGF0ZV0gOiBudWxsO1xuICAgIC8vIGluaXRpYWwgY2xhc3MgdXBkYXRlIGlmIHRoZXJlIGlzIGEgcHJlLXNlbGVjdGVkIHJhbmdlXG4gICAgdGhpcy5fc2NoZWR1bGVVcGRhdGUoKTtcbiAgICAvLyBzdGFydCBvYnNlcnZlcnMgaWYgaW5saW5lIGNhbGVuZGFyIGlzIHVzZWRcbiAgICBpZiAodGhpcy5pbmxpbmUpIHtcbiAgICAgIHRoaXMuX3N0YXJ0Q2FsZW5kYXJPYnNlcnZlcnMoKTtcbiAgICB9XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ3NlbGVjdGVkQ3VzdG9tUHJlc2V0J10pIHtcbiAgICAgIGNvbnN0IHByZXNldCA9IGNoYW5nZXNbJ3NlbGVjdGVkQ3VzdG9tUHJlc2V0J10uY3VycmVudFZhbHVlO1xuICAgICAgaWYgKHByZXNldCAmJiB0aGlzLmN1c3RvbVByZXNldHM/LmZpbmQocCA9PiBwLmtleSA9PT0gcHJlc2V0KSkge1xuICAgICAgICB0aGlzLnNlbGVjdGVkUHJlc2V0ID0gcHJlc2V0O1xuICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZSA9IG51bGw7XG4gICAgICAgIHRoaXMubW9kZWxEYXRlID0gbnVsbDtcbiAgICAgIH0gZWxzZSBpZiAocHJlc2V0ID09PSBudWxsKSB7XG4gICAgICAgIC8vIE9ubHkgY2xlYXIgaWYgdGhlIGN1cnJlbnQgcHJlc2V0IGlzIGEgY3VzdG9tIG9uZVxuICAgICAgICBpZiAodGhpcy5jdXN0b21QcmVzZXRzPy5maW5kKHAgPT4gcC5rZXkgPT09IHRoaXMuc2VsZWN0ZWRQcmVzZXQpKSB7XG4gICAgICAgICAgdGhpcy5zZWxlY3RlZFByZXNldCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ3NlbGVjdGVkRGF0ZSddKSB7XG4gICAgICBjb25zdCBzZWwgPSBjaGFuZ2VzWydzZWxlY3RlZERhdGUnXS5jdXJyZW50VmFsdWUgYXMgRGF0ZVtdIHwgbnVsbDtcbiAgICAgIGlmIChzZWwgJiYgQXJyYXkuaXNBcnJheShzZWwpICYmIHNlbC5sZW5ndGggPT09IDIgJiYgc2VsWzBdICYmIHNlbFsxXSkge1xuICAgICAgICBjb25zdCBwcmVzZXQgPSB0aGlzLmRldGVjdFByZXNldChzZWxbMF0sIHNlbFsxXSk7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRQcmVzZXQgPSBwcmVzZXQgPz8gJ2N1c3RvbSc7XG4gICAgICAgIC8vIHN5bmMgaW50ZXJuYWwgbW9kZWwgd2hlbiBleHRlcm5hbCB2YWx1ZSBjaGFuZ2VzXG4gICAgICAgIHRoaXMubW9kZWxEYXRlID0gWy4uLnNlbF07XG4gICAgICB9IGVsc2UgaWYgKHNlbCA9PSBudWxsKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRQcmVzZXQgPSBudWxsO1xuICAgICAgICB0aGlzLm1vZGVsRGF0ZSA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb25JbnB1dEtleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICBpZiAoZXZlbnQua2V5ID09PSAnRW50ZXInIHx8IGV2ZW50LmtleSA9PT0gJyAnKSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLm92ZXJsYXlQYW5lbD8udG9nZ2xlKGV2ZW50IGFzIGFueSk7XG4gICAgICB9IGNhdGNoIChlKSB7fVxuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gIH1cblxuICBvbk92ZXJsYXlTaG93KCk6IHZvaWQge1xuICAgIC8vIHN0b3JlIGEgZGVlcCBjb3B5IG9mIGN1cnJlbnQgc2VsZWN0aW9uL3ByZXNldCB3aGVuIG92ZXJsYXkgb3BlbnNcbiAgICBpZiAodGhpcy5zZWxlY3RlZERhdGUgJiYgQXJyYXkuaXNBcnJheSh0aGlzLnNlbGVjdGVkRGF0ZSkpIHtcbiAgICAgIHRoaXMuX292ZXJsYXlJbml0aWFsRGF0ZSA9ICh0aGlzLnNlbGVjdGVkRGF0ZSBhcyBEYXRlW10pLm1hcCgoZCkgPT5cbiAgICAgICAgZCA/IG5ldyBEYXRlKGQuZ2V0RnVsbFllYXIoKSwgZC5nZXRNb250aCgpLCBkLmdldERhdGUoKSkgOiBkXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9vdmVybGF5SW5pdGlhbERhdGUgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLl9vdmVybGF5SW5pdGlhbFByZXNldCA9IHRoaXMuc2VsZWN0ZWRQcmVzZXQ7XG4gICAgLy8gZW5zdXJlIGNhbGVuZGFyIG1vZGVsIHNob3dzIHRoZSBjdXJyZW50bHkgY29tbWl0dGVkIHNlbGVjdGlvbiB3aGVuIG9wZW5pbmdcbiAgICB0aGlzLm1vZGVsRGF0ZSA9IHRoaXMuc2VsZWN0ZWREYXRlID8gWy4uLnRoaXMuc2VsZWN0ZWREYXRlXSA6IG51bGw7XG4gICAgLy8gZW5zdXJlIHByZXNldCBidXR0b25zIHJlZmxlY3QgY3VycmVudCBzZWxlY3Rpb24gd2hlbiBvdmVybGF5IG9wZW5zXG4gICAgaWYgKFxuICAgICAgdGhpcy5zZWxlY3RlZERhdGUgJiZcbiAgICAgIEFycmF5LmlzQXJyYXkodGhpcy5zZWxlY3RlZERhdGUpICYmXG4gICAgICB0aGlzLnNlbGVjdGVkRGF0ZS5sZW5ndGggPT09IDJcbiAgICApIHtcbiAgICAgIGNvbnN0IHByZXNldCA9IHRoaXMuZGV0ZWN0UHJlc2V0KFxuICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZVswXSxcbiAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVbMV1cbiAgICAgICk7XG4gICAgICB0aGlzLnNlbGVjdGVkUHJlc2V0ID0gcHJlc2V0ID8/ICdjdXN0b20nO1xuICAgIH0gZWxzZSBpZiAoIXRoaXMuc2VsZWN0ZWREYXRlKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkUHJlc2V0ID0gbnVsbDtcbiAgICB9XG4gICAgLy8gYWRkIHN0YXJ0L2VuZCBjbGFzc2VzIHRvIHJhbmdlIGNlbGxzIGZvciBzdHlsaW5nXG4gICAgdGhpcy5fc2NoZWR1bGVVcGRhdGUoKTtcbiAgICAvLyBvYnNlcnZlIERPTSBjaGFuZ2VzIChQcmltZU5HIG1heSByZS1yZW5kZXIgaW5zaWRlIG92ZXJsYXkpXG4gICAgdGhpcy5fc3RhcnRDYWxlbmRhck9ic2VydmVycygpO1xuICB9XG5cbiAgb25PdmVybGF5SGlkZSgpOiB2b2lkIHtcbiAgICAvLyBpZiBpbnRlcm5hbCBjYWxlbmRhciBtb2RlbCBoYXMgYW4gaW5jb21wbGV0ZSBzZWxlY3Rpb24gKHBhcnRpYWwgcmFuZ2UpIHJldmVydCB0byBpbml0aWFsXG4gICAgY29uc3QgbW9kZWwgPSB0aGlzLm1vZGVsRGF0ZTtcbiAgICBjb25zdCBpc1BhcnRpYWxNb2RlbCA9IEJvb2xlYW4oXG4gICAgICBtb2RlbCAmJiBBcnJheS5pc0FycmF5KG1vZGVsKSAmJiBtb2RlbC5sZW5ndGggPiAwICYmIG1vZGVsWzBdICYmICFtb2RlbFsxXVxuICAgICk7XG4gICAgaWYgKGlzUGFydGlhbE1vZGVsKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkRGF0ZSA9IHRoaXMuX292ZXJsYXlJbml0aWFsRGF0ZTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRQcmVzZXQgPSB0aGlzLl9vdmVybGF5SW5pdGlhbFByZXNldDtcbiAgICAgIC8vIHJlc2V0IGludGVybmFsIG1vZGVsIHRvIHN5bmNlZCB2YWx1ZVxuICAgICAgdGhpcy5tb2RlbERhdGUgPSB0aGlzLnNlbGVjdGVkRGF0ZSA/IFsuLi50aGlzLnNlbGVjdGVkRGF0ZV0gOiBudWxsO1xuICAgIH1cbiAgICB0aGlzLl9vdmVybGF5SW5pdGlhbERhdGUgPSBudWxsO1xuICAgIHRoaXMuX292ZXJsYXlJbml0aWFsUHJlc2V0ID0gbnVsbDtcbiAgICB0aGlzLmN1c3RvbVJhbmdlTW9kZSA9IGZhbHNlO1xuICAgIC8vIGNsZWFudXAgYW55IHN0YXJ0L2VuZCBjbGFzc2VzIHRvIGF2b2lkIHN0YWxlIGNsYXNzZXNcbiAgICB0aGlzLl9zY2hlZHVsZVVwZGF0ZSgpO1xuICAgIC8vIHN0b3Agb2JzZXJ2aW5nXG4gICAgdGhpcy5fc3RvcENhbGVuZGFyT2JzZXJ2ZXJzKCk7XG4gIH1cblxuICBvbk1vZGVsQ2hhbmdlKGRhdGVSYW5nZTogRGF0ZVtdIHwgbnVsbCkge1xuICAgIC8vIFdoZW4gdXNlciBjbGlja3MgYSBmaXJzdCBkYXRlLCBQcmltZU5HIG1heSBlbWl0IGFuIGFycmF5IHdpdGggMSB2YWx1ZS4gV2UgZG9uJ3Qgd2FudCB0b1xuICAgIC8vIHVwZGF0ZSB0aGUgZXh0ZXJuYWwgc2VsZWN0ZWREYXRlIHVudGlsIHRoZSByYW5nZSBpcyBjb21wbGV0ZWQgKHR3byBkYXRlcykgc28gdGhhdFxuICAgIC8vIHRoZSBjYWxlbmRhciBkb2VzIG5vdCBqdW1wIGJhY2sgdG8gYSBwcmV2aW91c2x5IHNlbGVjdGVkIGVuZCBkYXRlJ3MgbW9udGguXG4gICAgdGhpcy5tb2RlbERhdGUgPSBkYXRlUmFuZ2UgPyBbLi4uZGF0ZVJhbmdlXSA6IG51bGw7XG4gICAgaWYgKFxuICAgICAgZGF0ZVJhbmdlICYmXG4gICAgICBBcnJheS5pc0FycmF5KGRhdGVSYW5nZSkgJiZcbiAgICAgIGRhdGVSYW5nZS5sZW5ndGggPT09IDIgJiZcbiAgICAgIGRhdGVSYW5nZVswXSAmJlxuICAgICAgZGF0ZVJhbmdlWzFdXG4gICAgKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkUHJlc2V0ID0gdGhpcy5kZXRlY3RQcmVzZXQoZGF0ZVJhbmdlWzBdLCBkYXRlUmFuZ2VbMV0pO1xuICAgICAgdGhpcy5jdXN0b21SYW5nZU1vZGUgPSBmYWxzZTtcbiAgICAgIHRoaXMuc2VsZWN0ZWREYXRlID0gWy4uLmRhdGVSYW5nZV07XG4gICAgICB0aGlzLmRhdGVSYW5nZUNoYW5nZS5lbWl0KHRoaXMuc2VsZWN0ZWREYXRlKTtcbiAgICAgIC8vIGNsb3NlIG92ZXJsYXkgbGlrZSB3aGVuIGFwcGx5aW5nIGEgcHJlc2V0XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLm92ZXJsYXlQYW5lbD8uaGlkZSgpO1xuICAgICAgfSBjYXRjaCAoZSkge31cbiAgICB9IGVsc2UgaWYgKCFkYXRlUmFuZ2UpIHtcbiAgICAgIC8vIGNsZWFyZWQgc2VsZWN0aW9uXG4gICAgICB0aGlzLnNlbGVjdGVkUHJlc2V0ID0gbnVsbDtcbiAgICAgIHRoaXMuY3VzdG9tUmFuZ2VNb2RlID0gZmFsc2U7XG4gICAgICB0aGlzLnNlbGVjdGVkRGF0ZSA9IG51bGw7XG4gICAgICB0aGlzLmRhdGVSYW5nZUNoYW5nZS5lbWl0KG51bGwpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBzaW5nbGUgZGF0ZSBzZWxlY3RpbmcgKHBhcnRpYWwgcmFuZ2UpIC0gZG8gbm90IGVtaXQgY2hhbmdlIHlldDsganVzdCBrZWVwIGludGVybmFsIG1vZGVsXG4gICAgICAvLyBzbyB0aGUgY2FsZW5kYXIncyB2aWV3IHJlbWFpbnMgd2hlcmUgdGhlIHVzZXIgbmF2aWdhdGVkIHRvLlxuICAgICAgdGhpcy5zZWxlY3RlZFByZXNldCA9IG51bGw7XG4gICAgICB0aGlzLmN1c3RvbVJhbmdlTW9kZSA9IGZhbHNlO1xuICAgIH1cbiAgICAvLyB1cGRhdGUgc3RhcnQvZW5kIGNsYXNzZXMgd2hpbGUgdXNlciBpcyBzZWxlY3Rpbmcgb3Igd2hlbiByYW5nZSBjb21wbGV0ZXNcbiAgICB0aGlzLl9zY2hlZHVsZVVwZGF0ZSgpO1xuICB9XG5cbiAgLy8gQ2FsbGVkIHdoZW4gdGhlIGNhbGVuZGFyJ3MgdmlzaWJsZSBtb250aC95ZWFyIGNoYW5nZXNcbiAgb25DYWxlbmRhclZpZXdDaGFuZ2VkKGV2ZW50PzogYW55KTogdm9pZCB7XG4gICAgLy8gUmVhcHBseSBjbGFzc2VzIGFmdGVyIFByaW1lTkcgcmUtcmVuZGVyXG4gICAgdGhpcy5fc2NoZWR1bGVVcGRhdGUoKTtcbiAgICAvLyBSZWF0dGFjaCBvYnNlcnZlcnMgYWZ0ZXIgYSBzbWFsbCBkZWxheSBzaW5jZSBQcmltZU5HIHdpbGwgbGlrZWx5IHJlcGxhY2UgRE9NIG5vZGVzXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLl9zdG9wQ2FsZW5kYXJPYnNlcnZlcnMoKTtcbiAgICAgICAgdGhpcy5fc3RhcnRDYWxlbmRhck9ic2VydmVycygpO1xuICAgICAgfSBjYXRjaCAoZSkge31cbiAgICB9LCA0MCk7XG4gIH1cblxuICBnZXQgaGFzU2VsZWN0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBCb29sZWFuKFxuICAgICAgdGhpcy5zZWxlY3RlZERhdGUgJiZcbiAgICAgICAgQXJyYXkuaXNBcnJheSh0aGlzLnNlbGVjdGVkRGF0ZSkgJiZcbiAgICAgICAgKHRoaXMuc2VsZWN0ZWREYXRlIGFzIERhdGVbXSkubGVuZ3RoID09PSAyICYmXG4gICAgICAgICEhKHRoaXMuc2VsZWN0ZWREYXRlIGFzIERhdGVbXSlbMF0gJiZcbiAgICAgICAgISEodGhpcy5zZWxlY3RlZERhdGUgYXMgRGF0ZVtdKVsxXVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIG5vcm1hbGl6ZURhdGUoZDogRGF0ZSk6IERhdGUge1xuICAgIHJldHVybiBuZXcgRGF0ZShkLmdldEZ1bGxZZWFyKCksIGQuZ2V0TW9udGgoKSwgZC5nZXREYXRlKCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBpc1NhbWVEYXRlKGE6IERhdGUsIGI6IERhdGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgYS5nZXRGdWxsWWVhcigpID09PSBiLmdldEZ1bGxZZWFyKCkgJiZcbiAgICAgIGEuZ2V0TW9udGgoKSA9PT0gYi5nZXRNb250aCgpICYmXG4gICAgICBhLmdldERhdGUoKSA9PT0gYi5nZXREYXRlKClcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBkZXRlY3RQcmVzZXQoc3RhcnRSYXc6IERhdGUsIGVuZFJhdzogRGF0ZSk6IHN0cmluZyB8IG51bGwge1xuICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5ub3JtYWxpemVEYXRlKHN0YXJ0UmF3KTtcbiAgICBjb25zdCBlbmQgPSB0aGlzLm5vcm1hbGl6ZURhdGUoZW5kUmF3KTtcbiAgICBjb25zdCB0b2RheSA9IHRoaXMubm9ybWFsaXplRGF0ZShuZXcgRGF0ZSgpKTtcbiAgICAvLyB0b2RheVxuICAgIGlmICh0aGlzLmlzU2FtZURhdGUoc3RhcnQsIHRvZGF5KSAmJiB0aGlzLmlzU2FtZURhdGUoZW5kLCB0b2RheSkpXG4gICAgICByZXR1cm4gJ3RvZGF5JztcbiAgICAvLyB5ZXN0ZXJkYXlcbiAgICBjb25zdCB5ID0gbmV3IERhdGUodG9kYXkpO1xuICAgIHkuc2V0RGF0ZSh5LmdldERhdGUoKSAtIDEpO1xuICAgIGlmICh0aGlzLmlzU2FtZURhdGUoc3RhcnQsIHkpICYmIHRoaXMuaXNTYW1lRGF0ZShlbmQsIHkpKVxuICAgICAgcmV0dXJuICd5ZXN0ZXJkYXknO1xuICAgIC8vIGxhc3Q3ZGF5cyAobGFzdCA3IGRheXMgaW5jbHVkaW5nIHRvZGF5OiBzdGFydCA9IHRvZGF5IC0gNiwgZW5kID0gdG9kYXkpXG4gICAgY29uc3QgbDdFbmQgPSBuZXcgRGF0ZSh0b2RheSk7XG4gICAgY29uc3QgbDdTdGFydCA9IG5ldyBEYXRlKHRvZGF5KTtcbiAgICBsN1N0YXJ0LnNldERhdGUodG9kYXkuZ2V0RGF0ZSgpIC0gNik7XG4gICAgaWYgKHRoaXMuaXNTYW1lRGF0ZShzdGFydCwgbDdTdGFydCkgJiYgdGhpcy5pc1NhbWVEYXRlKGVuZCwgbDdFbmQpKVxuICAgICAgcmV0dXJuICdsYXN0N2RheXMnO1xuICAgIC8vIGxhc3QzMGRheXMgKGxhc3QgMzAgZGF5cyBpbmNsdWRpbmcgdG9kYXk6IHN0YXJ0ID0gdG9kYXkgLSAyOSwgZW5kID0gdG9kYXkpXG4gICAgY29uc3QgbDMwRW5kID0gbmV3IERhdGUodG9kYXkpO1xuICAgIGNvbnN0IGwzMFN0YXJ0ID0gbmV3IERhdGUodG9kYXkpO1xuICAgIGwzMFN0YXJ0LnNldERhdGUodG9kYXkuZ2V0RGF0ZSgpIC0gMjkpO1xuICAgIGlmICh0aGlzLmlzU2FtZURhdGUoc3RhcnQsIGwzMFN0YXJ0KSAmJiB0aGlzLmlzU2FtZURhdGUoZW5kLCBsMzBFbmQpKVxuICAgICAgcmV0dXJuICdsYXN0MzBkYXlzJztcbiAgICAvLyBsYXN0M21vbnRocyAobGFzdCAzIG1vbnRocyBpbmNsdWRpbmcgdG9kYXk6IHN0YXJ0ID0gdG9kYXkgLSAzIG1vbnRocywgZW5kID0gdG9kYXkpXG4gICAgY29uc3QgbDNtRW5kID0gbmV3IERhdGUodG9kYXkpO1xuICAgIGNvbnN0IGwzbVN0YXJ0ID0gbmV3IERhdGUodG9kYXkpO1xuICAgIGwzbVN0YXJ0LnNldE1vbnRoKHRvZGF5LmdldE1vbnRoKCkgLSAzKTtcbiAgICBpZiAodGhpcy5pc1NhbWVEYXRlKHN0YXJ0LCBsM21TdGFydCkgJiYgdGhpcy5pc1NhbWVEYXRlKGVuZCwgbDNtRW5kKSlcbiAgICAgIHJldHVybiAnbGFzdDNtb250aHMnO1xuICAgIC8vIGxhc3Q2bW9udGhzIChsYXN0IDYgbW9udGhzIGluY2x1ZGluZyB0b2RheTogc3RhcnQgPSB0b2RheSAtIDYgbW9udGhzLCBlbmQgPSB0b2RheSlcbiAgICBjb25zdCBsNm1FbmQgPSBuZXcgRGF0ZSh0b2RheSk7XG4gICAgY29uc3QgbDZtU3RhcnQgPSBuZXcgRGF0ZSh0b2RheSk7XG4gICAgbDZtU3RhcnQuc2V0TW9udGgodG9kYXkuZ2V0TW9udGgoKSAtIDYpO1xuICAgIGlmICh0aGlzLmlzU2FtZURhdGUoc3RhcnQsIGw2bVN0YXJ0KSAmJiB0aGlzLmlzU2FtZURhdGUoZW5kLCBsNm1FbmQpKVxuICAgICAgcmV0dXJuICdsYXN0Nm1vbnRocyc7XG4gICAgLy8gbGFzdDF5ZWFyIChsYXN0IDEgeWVhciBpbmNsdWRpbmcgdG9kYXk6IHN0YXJ0ID0gdG9kYXkgLSAxIHllYXIsIGVuZCA9IHRvZGF5KVxuICAgIGNvbnN0IGwxeUVuZCA9IG5ldyBEYXRlKHRvZGF5KTtcbiAgICBjb25zdCBsMXlTdGFydCA9IG5ldyBEYXRlKHRvZGF5KTtcbiAgICBsMXlTdGFydC5zZXRGdWxsWWVhcih0b2RheS5nZXRGdWxsWWVhcigpIC0gMSk7XG4gICAgaWYgKHRoaXMuaXNTYW1lRGF0ZShzdGFydCwgbDF5U3RhcnQpICYmIHRoaXMuaXNTYW1lRGF0ZShlbmQsIGwxeUVuZCkpXG4gICAgICByZXR1cm4gJ2xhc3QxeWVhcic7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjbGVhckRhdGVSYW5nZSgpIHtcbiAgICB0aGlzLnNlbGVjdGVkRGF0ZSA9IG51bGw7XG4gICAgdGhpcy5kYXRlUmFuZ2VDaGFuZ2UuZW1pdCh0aGlzLnNlbGVjdGVkRGF0ZSk7XG4gICAgdGhpcy5zZWxlY3RlZFByZXNldCA9IG51bGw7XG4gICAgdGhpcy5jdXN0b21SYW5nZU1vZGUgPSBmYWxzZTtcbiAgICB0aGlzLm1vZGVsRGF0ZSA9IG51bGw7XG4gIH1cblxuICByZXNldEFuZENsb3NlKCkge1xuICAgIHRoaXMuY2xlYXJEYXRlUmFuZ2UoKTtcbiAgICBpZiAodGhpcy5vdmVybGF5UGFuZWwpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMub3ZlcmxheVBhbmVsLmhpZGUoKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgfVxuICB9XG5cbiAgY2xlYXJBbmRTdG9wKGV2ZW50OiBFdmVudCkge1xuICAgIHRoaXMuY2xlYXJEYXRlUmFuZ2UoKTtcbiAgICB0cnkge1xuICAgICAgdGhpcy5vdmVybGF5UGFuZWw/LmhpZGUoKTtcbiAgICB9IGNhdGNoIChlKSB7fVxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICB9XG5cbiAgdG9nZ2xlQ3VzdG9tUmFuZ2UoKSB7XG4gICAgdGhpcy5jdXN0b21SYW5nZU1vZGUgPSAhdGhpcy5jdXN0b21SYW5nZU1vZGU7XG4gICAgaWYgKHRoaXMuY3VzdG9tUmFuZ2VNb2RlKSB0aGlzLnNlbGVjdGVkUHJlc2V0ID0gJ2N1c3RvbSc7XG4gIH1cblxuICBhcHBseUN1c3RvbVJhbmdlKCkge1xuICAgIC8vIGVuc3VyZSBleHRlcm5hbCBzZWxlY3RlZERhdGUgaXMgaW4gc3luYyB3aXRoIGludGVybmFsIG1vZGVsXG4gICAgdGhpcy5zZWxlY3RlZERhdGUgPSB0aGlzLm1vZGVsRGF0ZSA/IFsuLi50aGlzLm1vZGVsRGF0ZV0gOiBudWxsO1xuICAgIHRoaXMuZGF0ZVJhbmdlQ2hhbmdlLmVtaXQodGhpcy5zZWxlY3RlZERhdGUpO1xuICAgIGlmICh0aGlzLm92ZXJsYXlQYW5lbCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5vdmVybGF5UGFuZWwuaGlkZSgpO1xuICAgICAgfSBjYXRjaCAoZSkge31cbiAgICB9XG4gICAgdGhpcy5jdXN0b21SYW5nZU1vZGUgPSBmYWxzZTtcbiAgICB0aGlzLnNlbGVjdGVkUHJlc2V0ID0gJ2N1c3RvbSc7XG4gIH1cblxuICAgIGdldERhdGVSYW5nZUxhYmVsKCkge1xuICAgIC8vIFNob3cgY3VzdG9tIHByZXNldCBsYWJlbCBpZiBhIGN1c3RvbSBwcmVzZXQgaXMgc2VsZWN0ZWRcbiAgICBjb25zdCBjdXN0b21QcmVzZXQgPSB0aGlzLmN1c3RvbVByZXNldHM/LmZpbmQocCA9PiBwLmtleSA9PT0gdGhpcy5zZWxlY3RlZFByZXNldCk7XG4gICAgaWYgKGN1c3RvbVByZXNldCkgcmV0dXJuIGN1c3RvbVByZXNldC5sYWJlbDtcblxuICAgIC8vIENoZWNrIHRoZSBpbnRlcm5hbCBtb2RlbCBmaXJzdCB0byBzaG93IHJlYWwtdGltZSB1cGRhdGVzIHdoaWxlIHNlbGVjdGluZ1xuICAgIGNvbnN0IGRhdGVBcnJheSA9IHRoaXMubW9kZWxEYXRlIHx8IHRoaXMuc2VsZWN0ZWREYXRlO1xuICAgIGlmICghZGF0ZUFycmF5IHx8ICFBcnJheS5pc0FycmF5KGRhdGVBcnJheSkpIHJldHVybiAnJztcblxuICAgIGNvbnN0IFtzdGFydCwgZW5kXSA9IGRhdGVBcnJheSBhcyAoRGF0ZSB8IG51bGwpW107XG4gICAgY29uc3QgYXJyb3cgPSAnXFx1Mjc5NCc7XG5cbiAgICAvLyBTaG93IGp1c3QgdGhlIGZpcnN0IGRhdGUgd2l0aCBhbiBhcnJvdyBpZiBvbmx5IGZpcnN0IGRhdGUgaXMgc2VsZWN0ZWRcbiAgICBpZiAoc3RhcnQgJiYgIWVuZCkge1xuICAgICAgY29uc3Qgc3RhcnRTdHIgPSB0aGlzLmRhdGVQaXBlLnRyYW5zZm9ybShzdGFydCwgJ01NL2RkL3l5eXknKTtcbiAgICAgIHJldHVybiBgJHtzdGFydFN0cn0gJHthcnJvd30gYDtcbiAgICB9XG5cbiAgICAvLyBTaG93IHRoZSBjb21wbGV0ZSByYW5nZSBpZiBib3RoIGRhdGVzIGFyZSBzZWxlY3RlZFxuICAgIGlmIChzdGFydCAmJiBlbmQpIHtcbiAgICAgIGNvbnN0IHN0YXJ0U3RyID0gdGhpcy5kYXRlUGlwZS50cmFuc2Zvcm0oc3RhcnQsICdNTS9kZC95eXl5Jyk7XG4gICAgICBjb25zdCBlbmRTdHIgPSB0aGlzLmRhdGVQaXBlLnRyYW5zZm9ybShlbmQsICdNTS9kZC95eXl5Jyk7XG4gICAgICByZXR1cm4gYCR7c3RhcnRTdHJ9ICR7YXJyb3d9ICR7ZW5kU3RyfWA7XG4gICAgfVxuXG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgb25DdXN0b21QcmVzZXRDbGljayhrZXk6IHN0cmluZykge1xuICAgIHRoaXMuc2VsZWN0ZWRQcmVzZXQgPSBrZXk7XG4gICAgdGhpcy5zZWxlY3RlZERhdGUgPSBudWxsO1xuICAgIHRoaXMubW9kZWxEYXRlID0gbnVsbDtcbiAgICB0aGlzLmN1c3RvbVByZXNldENsaWNrLmVtaXQoa2V5KTtcbiAgICB0cnkgeyB0aGlzLm92ZXJsYXlQYW5lbD8uaGlkZSgpOyB9IGNhdGNoIChlKSB7fVxuICB9XG5cbiAgYXBwbHlQcmVzZXQoXG4gICAgcHJlc2V0OlxuICAgICAgfCAndG9kYXknXG4gICAgICB8ICd5ZXN0ZXJkYXknXG4gICAgICB8ICdsYXN0N2RheXMnXG4gICAgICB8ICdsYXN0MzBkYXlzJ1xuICAgICAgfCAnbGFzdDNtb250aHMnXG4gICAgICB8ICdsYXN0Nm1vbnRocydcbiAgICAgIHwgJ2xhc3QxeWVhcidcbiAgKSB7XG4gICAgY29uc3QgdG9kYXkgPSBuZXcgRGF0ZSgpO1xuICAgIGxldCBzdGFydDogRGF0ZSB8IG51bGwgPSBudWxsO1xuICAgIGxldCBlbmQ6IERhdGUgfCBudWxsID0gbnVsbDtcbiAgICBzd2l0Y2ggKHByZXNldCkge1xuICAgICAgY2FzZSAndG9kYXknOlxuICAgICAgICBzdGFydCA9IGVuZCA9IG5ldyBEYXRlKFxuICAgICAgICAgIHRvZGF5LmdldEZ1bGxZZWFyKCksXG4gICAgICAgICAgdG9kYXkuZ2V0TW9udGgoKSxcbiAgICAgICAgICB0b2RheS5nZXREYXRlKClcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd5ZXN0ZXJkYXknOlxuICAgICAgICBjb25zdCB5ID0gbmV3IERhdGUodG9kYXkpO1xuICAgICAgICB5LnNldERhdGUoeS5nZXREYXRlKCkgLSAxKTtcbiAgICAgICAgc3RhcnQgPSBlbmQgPSBuZXcgRGF0ZSh5LmdldEZ1bGxZZWFyKCksIHkuZ2V0TW9udGgoKSwgeS5nZXREYXRlKCkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2xhc3Q3ZGF5cyc6IHtcbiAgICAgICAgZW5kID0gbmV3IERhdGUodG9kYXkuZ2V0RnVsbFllYXIoKSwgdG9kYXkuZ2V0TW9udGgoKSwgdG9kYXkuZ2V0RGF0ZSgpKTtcbiAgICAgICAgc3RhcnQgPSBuZXcgRGF0ZShlbmQpO1xuICAgICAgICBzdGFydC5zZXREYXRlKGVuZC5nZXREYXRlKCkgLSA2KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdsYXN0MzBkYXlzJzoge1xuICAgICAgICBlbmQgPSBuZXcgRGF0ZSh0b2RheS5nZXRGdWxsWWVhcigpLCB0b2RheS5nZXRNb250aCgpLCB0b2RheS5nZXREYXRlKCkpO1xuICAgICAgICBzdGFydCA9IG5ldyBEYXRlKGVuZCk7XG4gICAgICAgIHN0YXJ0LnNldERhdGUoZW5kLmdldERhdGUoKSAtIDI5KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdsYXN0M21vbnRocyc6IHtcbiAgICAgICAgZW5kID0gbmV3IERhdGUodG9kYXkuZ2V0RnVsbFllYXIoKSwgdG9kYXkuZ2V0TW9udGgoKSwgdG9kYXkuZ2V0RGF0ZSgpKTtcbiAgICAgICAgc3RhcnQgPSBuZXcgRGF0ZShlbmQpO1xuICAgICAgICBzdGFydC5zZXRNb250aChlbmQuZ2V0TW9udGgoKSAtIDMpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2xhc3Q2bW9udGhzJzoge1xuICAgICAgICBlbmQgPSBuZXcgRGF0ZSh0b2RheS5nZXRGdWxsWWVhcigpLCB0b2RheS5nZXRNb250aCgpLCB0b2RheS5nZXREYXRlKCkpO1xuICAgICAgICBzdGFydCA9IG5ldyBEYXRlKGVuZCk7XG4gICAgICAgIHN0YXJ0LnNldE1vbnRoKGVuZC5nZXRNb250aCgpIC0gNik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnbGFzdDF5ZWFyJzoge1xuICAgICAgICBlbmQgPSBuZXcgRGF0ZSh0b2RheS5nZXRGdWxsWWVhcigpLCB0b2RheS5nZXRNb250aCgpLCB0b2RheS5nZXREYXRlKCkpO1xuICAgICAgICBzdGFydCA9IG5ldyBEYXRlKGVuZCk7XG4gICAgICAgIHN0YXJ0LnNldEZ1bGxZZWFyKGVuZC5nZXRGdWxsWWVhcigpIC0gMSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGlmIChzdGFydCAmJiBlbmQpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWREYXRlID0gW3N0YXJ0LCBlbmRdO1xuICAgICAgdGhpcy5tb2RlbERhdGUgPSBbc3RhcnQsIGVuZF07XG4gICAgICBpZiAodGhpcy5wcmVzZXJ2ZVByZXNldCkge1xuICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZSA9IFtzdGFydCwgZW5kLCB7IHByZXNldHM6IHByZXNldCB9XTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZGF0ZVJhbmdlQ2hhbmdlLmVtaXQodGhpcy5zZWxlY3RlZERhdGUpO1xuICAgICAgdGhpcy5zZWxlY3RlZFByZXNldCA9IHByZXNldDtcbiAgICAgIHRoaXMuY3VzdG9tUmFuZ2VNb2RlID0gZmFsc2U7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICB0aGlzLm92ZXJsYXlQYW5lbD8uaGlkZSgpO1xuICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgLy8gZW5zdXJlIHdlIHVwZGF0ZSBzdGFydC9lbmQgY2xhc3NlcyBhZnRlciBhcHBseWluZyBhIHByZXNldFxuICAgIHRoaXMuX3NjaGVkdWxlVXBkYXRlKCk7XG4gIH1cblxuICBvbkRhdGVSYW5nZUNoYW5nZShkYXRlUmFuZ2U6IERhdGVbXSB8IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLmRhdGVSYW5nZUNoYW5nZS5lbWl0KGRhdGVSYW5nZSk7XG4gICAgaWYgKGRhdGVSYW5nZSAmJiBBcnJheS5pc0FycmF5KGRhdGVSYW5nZSkpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRQcmVzZXQgPSB0aGlzLmRldGVjdFByZXNldChkYXRlUmFuZ2VbMF0sIGRhdGVSYW5nZVsxXSk7XG4gICAgICB0aGlzLmN1c3RvbVJhbmdlTW9kZSA9IGZhbHNlO1xuICAgIH0gZWxzZSBpZiAoIWRhdGVSYW5nZSkge1xuICAgICAgdGhpcy5zZWxlY3RlZFByZXNldCA9IG51bGw7XG4gICAgICB0aGlzLmN1c3RvbVJhbmdlTW9kZSA9IGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLl9zY2hlZHVsZVVwZGF0ZSgpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5fc3RvcENhbGVuZGFyT2JzZXJ2ZXJzKCk7XG4gICAgdGhpcy5fY2FuY2VsU2NoZWR1bGVkVXBkYXRlKCk7XG4gIH1cblxuICAvLyBXYWxrIHRoZSByZW5kZXJlZCBjYWxlbmRhciBET00ocykgKG92ZXJsYXkgKyBpbmxpbmUpIGFuZCBhZGQgc3RhcnQtcmFuZ2UvZW5kLXJhbmdlIGNsYXNzZXNcbiAgcHJpdmF0ZSBfdXBkYXRlU3RhcnRFbmRSYW5nZUNsYXNzZXMoKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNhbGVuZGFyRWxlbWVudHMgPSB0aGlzLl9nZXRDYWxlbmRhckVsZW1lbnRzKCk7XG5cbiAgICAgIGNhbGVuZGFyRWxlbWVudHMuZm9yRWFjaCgoY2FsRWw6IEVsZW1lbnQpID0+IHtcbiAgICAgICAgLy8gUmVtb3ZlIGV4aXN0aW5nIGNsYXNzZXMgZnJvbSBzcGFucyBmaXJzdFxuICAgICAgICBjb25zdCBhbGxTcGFucyA9IGNhbEVsLnF1ZXJ5U2VsZWN0b3JBbGwoJ3RkID4gc3BhbicpO1xuICAgICAgICBhbGxTcGFucy5mb3JFYWNoKChzcGFuKSA9PiB7XG4gICAgICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyhzcGFuLCAnc3RhcnQtcmFuZ2UnKTtcbiAgICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKHNwYW4sICdlbmQtcmFuZ2UnKTtcbiAgICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKHNwYW4sICdiZXR3ZWVuLXJhbmdlJyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIENvbGxlY3Qgc3Bhbi9kYXRlIHBhaXJzLCBwcmVmZXIgZGF0YS1kYXRlIGF0dHJpYnV0ZVxuICAgICAgICAvLyBDYWNoZSBoZWFkZXIgbW9udGgveWVhciBmb3IgdGhpcyBjYWxlbmRhciB0byBhdm9pZCBxdWVyeWluZyBwZXItc3BhblxuICAgICAgICBjb25zdCBwYW5lbE5vZGUgPSBjYWxFbC5jbG9zZXN0KCcucC1kYXRlcGlja2VyJykgfHwgY2FsRWw7XG4gICAgICAgIGNvbnN0IGhlYWRlck1vbnRoTm9kZSA9IChwYW5lbE5vZGUgYXMgRWxlbWVudCkucXVlcnlTZWxlY3RvcihcbiAgICAgICAgICAnLnAtZGF0ZXBpY2tlci1oZWFkZXIgLnAtZGF0ZXBpY2tlci10aXRsZSAucC1kYXRlcGlja2VyLW1vbnRoJ1xuICAgICAgICApO1xuICAgICAgICBjb25zdCBoZWFkZXJZZWFyTm9kZSA9IChwYW5lbE5vZGUgYXMgRWxlbWVudCkucXVlcnlTZWxlY3RvcihcbiAgICAgICAgICAnLnAtZGF0ZXBpY2tlci1oZWFkZXIgLnAtZGF0ZXBpY2tlci10aXRsZSAucC1kYXRlcGlja2VyLXllYXInXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGhlYWRlck1vbnRoSWR4ID1cbiAgICAgICAgICBoZWFkZXJNb250aE5vZGUgJiYgaGVhZGVyTW9udGhOb2RlLnRleHRDb250ZW50XG4gICAgICAgICAgICA/ICh0aGlzLmVuTG9jYWxlLm1vbnRoTmFtZXMgfHwgW10pLmluZGV4T2YoXG4gICAgICAgICAgICAgICAgaGVhZGVyTW9udGhOb2RlLnRleHRDb250ZW50LnRyaW0oKVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICA6IE5hTjtcbiAgICAgICAgY29uc3QgaGVhZGVyWWVhclZhbCA9XG4gICAgICAgICAgaGVhZGVyWWVhck5vZGUgJiYgaGVhZGVyWWVhck5vZGUudGV4dENvbnRlbnRcbiAgICAgICAgICAgID8gcGFyc2VJbnQoaGVhZGVyWWVhck5vZGUudGV4dENvbnRlbnQudHJpbSgpLCAxMClcbiAgICAgICAgICAgIDogTmFOO1xuICAgICAgICBjb25zdCBpdGVtczogeyBkdDogRGF0ZTsgc3BhbjogRWxlbWVudDsgdGQ/OiBIVE1MRWxlbWVudCB8IG51bGwgfVtdID1cbiAgICAgICAgICBbXTtcbiAgICAgICAgY29uc3Qgc3BhbnMgPSBjYWxFbC5xdWVyeVNlbGVjdG9yQWxsKCd0ZCA+IHNwYW4ucC1oaWdobGlnaHQnKTtcbiAgICAgICAgc3BhbnMuZm9yRWFjaCgoc3BhbikgPT4ge1xuICAgICAgICAgIGNvbnN0IHRkID0gc3Bhbi5jbG9zZXN0KCd0ZCcpIGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICAgICAgICAvLyBUcnkgdG8gcmVhZCBkYXRhLWRhdGUgYXR0cmlidXRlLCB3aGljaCBzb21lIFByaW1lTkcgdmVyc2lvbnMgcmVuZGVyIG9uIHNwYW4vdGRcbiAgICAgICAgICBsZXQgZGF0YURhdGUgPSBzcGFuLmdldEF0dHJpYnV0ZSgnZGF0YS1kYXRlJyk7XG4gICAgICAgICAgaWYgKCFkYXRhRGF0ZSAmJiB0ZCkgZGF0YURhdGUgPSB0ZC5nZXRBdHRyaWJ1dGUoJ2RhdGEtZGF0ZScpO1xuICAgICAgICAgIGlmIChkYXRhRGF0ZSkge1xuICAgICAgICAgICAgY29uc3QgcGFydHMgPSBkYXRhRGF0ZS5zcGxpdCgnLScpLm1hcCgocCkgPT4gcGFyc2VJbnQocCwgMTApKTtcbiAgICAgICAgICAgIGlmIChwYXJ0cy5sZW5ndGggPj0gMyAmJiBwYXJ0cy5ldmVyeSgobikgPT4gIWlzTmFOKG4pKSkge1xuICAgICAgICAgICAgICBjb25zdCBbeSwgbSwgZF0gPSBwYXJ0cztcbiAgICAgICAgICAgICAgY29uc3QgZHQgPSBuZXcgRGF0ZSh5LCBtIC0gMSwgZCk7XG4gICAgICAgICAgICAgIGl0ZW1zLnB1c2goeyBkdCwgdGQsIHNwYW4gfSk7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gRmFsbGJhY2s6IHBhcnNlIGRheSBudW1iZXIgYW5kIGluZmVyIG1vbnRoL3llYXIgZnJvbSBuZWFyYnkgaGVhZGVyIGluIHRoZSBzYW1lIC5wLWRhdGVwaWNrZXJcbiAgICAgICAgICBjb25zdCBkYXlUZXh0ID0gKHNwYW4udGV4dENvbnRlbnQgfHwgJycpLnRyaW0oKTtcbiAgICAgICAgICBjb25zdCBkYXkgPSBwYXJzZUludChkYXlUZXh0LCAxMCk7XG4gICAgICAgICAgaWYgKCFpc05hTihkYXkpICYmIHRkKSB7XG4gICAgICAgICAgICAvLyBVc2UgY2FjaGVkIGhlYWRlciBtb250aC95ZWFyIHdoZW4gYXZhaWxhYmxlXG4gICAgICAgICAgICBpZiAoIWlzTmFOKGhlYWRlck1vbnRoSWR4KSAmJiAhaXNOYU4oaGVhZGVyWWVhclZhbCkpIHtcbiAgICAgICAgICAgICAgY29uc3QgZHQgPSBuZXcgRGF0ZShoZWFkZXJZZWFyVmFsLCBoZWFkZXJNb250aElkeCwgZGF5KTtcbiAgICAgICAgICAgICAgaXRlbXMucHVzaCh7IGR0LCB0ZCwgc3BhbiB9KTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBsYXN0IHJlc29ydDogaWdub3JlIHNwYW4gaWYgZGF0ZSBjYW5ub3QgYmUgZGV0ZXJtaW5lZFxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoaXRlbXMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICAgICAgLy8gU29ydCBpdGVtcyB0byBmaW5kIG1pbi9tYXggKHN0YXJ0ICYgZW5kKVxuICAgICAgICBpdGVtcy5zb3J0KChhLCBiKSA9PiBhLmR0LmdldFRpbWUoKSAtIGIuZHQuZ2V0VGltZSgpKTtcbiAgICAgICAgY29uc3QgZGV0ZWN0ZWRTdGFydCA9IGl0ZW1zWzBdLmR0O1xuICAgICAgICBjb25zdCBkZXRlY3RlZEVuZCA9IGl0ZW1zW2l0ZW1zLmxlbmd0aCAtIDFdLmR0O1xuXG4gICAgICAgIC8vIFByZWZlcnJlZCByYW5nZSBpcyBtb2RlbERhdGUvc2VsZWN0ZWREYXRlIGlmIHByZXNlbnRcbiAgICAgICAgY29uc3QgcmFuZ2UgPVxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlICYmIHRoaXMuc2VsZWN0ZWREYXRlLmxlbmd0aCA9PT0gMlxuICAgICAgICAgICAgPyB0aGlzLnNlbGVjdGVkRGF0ZVxuICAgICAgICAgICAgOiB0aGlzLm1vZGVsRGF0ZSAmJiB0aGlzLm1vZGVsRGF0ZS5sZW5ndGggPT09IDJcbiAgICAgICAgICAgICAgPyB0aGlzLm1vZGVsRGF0ZVxuICAgICAgICAgICAgICA6IFtkZXRlY3RlZFN0YXJ0LCBkZXRlY3RlZEVuZF07XG4gICAgICAgIGNvbnN0IHN0YXJ0RGF0ZSA9XG4gICAgICAgICAgcmFuZ2UgJiYgcmFuZ2VbMF1cbiAgICAgICAgICAgID8gdGhpcy5ub3JtYWxpemVEYXRlKHJhbmdlWzBdIGFzIERhdGUpXG4gICAgICAgICAgICA6IGRldGVjdGVkU3RhcnQ7XG4gICAgICAgIGNvbnN0IGVuZERhdGUgPVxuICAgICAgICAgIHJhbmdlICYmIHJhbmdlWzFdXG4gICAgICAgICAgICA/IHRoaXMubm9ybWFsaXplRGF0ZShyYW5nZVsxXSBhcyBEYXRlKVxuICAgICAgICAgICAgOiBkZXRlY3RlZEVuZDtcblxuICAgICAgICAvLyBGb3IgZWFjaCBpdGVtLCBhZGQgc3RhcnQtcmFuZ2UsZW5kLXJhbmdlLCBvciBiZXR3ZWVuLXJhbmdlIGJhc2VkIG9uIGRhdGVcbiAgICAgICAgY29uc3Qgc1RpbWUgPSBzdGFydERhdGUuZ2V0VGltZSgpO1xuICAgICAgICBjb25zdCBlVGltZSA9IGVuZERhdGUuZ2V0VGltZSgpO1xuICAgICAgICBmb3IgKGNvbnN0IGl0IG9mIGl0ZW1zKSB7XG4gICAgICAgICAgY29uc3QgdCA9IGl0LmR0LmdldFRpbWUoKTtcbiAgICAgICAgICBpZiAoc1RpbWUgPT09IGVUaW1lICYmIHQgPT09IHNUaW1lKSB7XG4gICAgICAgICAgICAvLyBzaW5nbGUtZGF5IHJhbmdlLCBtYXJrIGJvdGggc3RhcnQgJiBlbmRcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MoaXQuc3BhbiwgJ3N0YXJ0LXJhbmdlJyk7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKGl0LnNwYW4sICdlbmQtcmFuZ2UnKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHQgPT09IHNUaW1lKSB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKGl0LnNwYW4sICdzdGFydC1yYW5nZScpO1xuICAgICAgICAgIH0gZWxzZSBpZiAodCA9PT0gZVRpbWUpIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MoaXQuc3BhbiwgJ2VuZC1yYW5nZScpO1xuICAgICAgICAgIH0gZWxzZSBpZiAodCA+IHNUaW1lICYmIHQgPCBlVGltZSkge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhpdC5zcGFuLCAnYmV0d2Vlbi1yYW5nZScpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gaWdub3JlIERPTSBlcnJvcnMgKGUuZy4sIHNlcnZlci1zaWRlIHJlbmRlcmluZyAvIG1pc3NpbmcgZWxlbWVudHMpXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpc29EYXRlKGQ6IERhdGUpOiBzdHJpbmcge1xuICAgIGNvbnN0IHkgPSBkLmdldEZ1bGxZZWFyKCk7XG4gICAgY29uc3QgbSA9IFN0cmluZyhkLmdldE1vbnRoKCkgKyAxKS5wYWRTdGFydCgyLCAnMCcpO1xuICAgIGNvbnN0IGRheSA9IFN0cmluZyhkLmdldERhdGUoKSkucGFkU3RhcnQoMiwgJzAnKTtcbiAgICByZXR1cm4gYCR7eX0tJHttfS0ke2RheX1gO1xuICB9XG5cbiAgcHJpdmF0ZSBfZmluZEVsZW1lbnRCeURhdGUoZGF0ZT86IERhdGUpOiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCFkYXRlKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHkgPSBkYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgY29uc3QgbSA9IGRhdGUuZ2V0TW9udGgoKSArIDE7IC8vIDEuLjEyXG4gICAgY29uc3QgZCA9IGRhdGUuZ2V0RGF0ZSgpO1xuICAgIGNvbnN0IGlzb1VucGFkZGVkID0gYCR7eX0tJHttfS0ke2R9YDsgLy8gZS5nLiAyMDI1LTExLTFcbiAgICBjb25zdCBpc29QYWRkZWQgPSBgJHt5fS0ke1N0cmluZyhtKS5wYWRTdGFydCgyLCAnMCcpfS0ke1N0cmluZyhkKS5wYWRTdGFydCgyLCAnMCcpfWA7IC8vIDIwMjUtMTEtMDFcbiAgICBjb25zdCBzZWxlY3RvcnMgPSBbXG4gICAgICBgW2RhdGEtZGF0ZT1cIiR7aXNvVW5wYWRkZWR9XCJdYCxcbiAgICAgIGBbZGF0YS1kYXRlPVwiJHtpc29QYWRkZWR9XCJdYCxcbiAgICBdO1xuICAgIGZvciAoY29uc3Qgc2VsIG9mIHNlbGVjdG9ycykge1xuICAgICAgY29uc3QgZm91bmRJbk92ZXJsYXkgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFxuICAgICAgICBgLmF0b21peC1vdmVybGF5LWNhbGVuZGFyICR7c2VsfWBcbiAgICAgICkgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgICAgaWYgKGZvdW5kSW5PdmVybGF5KVxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIChmb3VuZEluT3ZlcmxheS5jbG9zZXN0KCd0ZCcpIGFzIEhUTUxFbGVtZW50IHwgbnVsbCkgfHwgZm91bmRJbk92ZXJsYXlcbiAgICAgICAgKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBzZWwgb2Ygc2VsZWN0b3JzKSB7XG4gICAgICBjb25zdCBmb3VuZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsKSBhcyBIVE1MRWxlbWVudCB8IG51bGw7XG4gICAgICBpZiAoZm91bmQpIHJldHVybiAoZm91bmQuY2xvc2VzdCgndGQnKSBhcyBIVE1MRWxlbWVudCB8IG51bGwpIHx8IGZvdW5kO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBfc3RhcnRDYWxlbmRhck9ic2VydmVycygpOiB2b2lkIHtcbiAgICAvLyBzdG9wIGZpcnN0IHRvIGF2b2lkIGR1cGxpY2F0ZXNcbiAgICB0aGlzLl9zdG9wQ2FsZW5kYXJPYnNlcnZlcnMoKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY2FsRWxzID0gdGhpcy5fZ2V0Q2FsZW5kYXJFbGVtZW50cygpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcGFuZWwgPSB0aGlzLm92ZXJsYXlQYW5lbCBhcyBhbnk7XG4gICAgICAgIGlmIChwYW5lbCAmJiBwYW5lbC5lbCAmJiBwYW5lbC5lbC5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAgICAgY29uc3QgZWwgPSBwYW5lbC5lbC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5wLWRhdGVwaWNrZXInKTtcbiAgICAgICAgICBpZiAoZWwpIGNhbEVscy5wdXNoKGVsIGFzIEVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7fVxuXG4gICAgICBjYWxFbHMuZm9yRWFjaCgoZWwpID0+IHtcbiAgICAgICAgY29uc3Qgb2JzID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCkgPT4ge1xuICAgICAgICAgIC8vIFJlYXBwbHkgY2xhc3NlcyBhZnRlciBET00gY2hhbmdlcyAoZGVib3VuY2VkKVxuICAgICAgICAgIHRoaXMuX3NjaGVkdWxlVXBkYXRlKCk7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBXYXRjaCBjaGlsZExpc3QsIHN1YnRyZWUgYW5kIGNsYXNzIGF0dHJpYnV0ZSBjaGFuZ2VzIChzcGFuIGNsYXNzIHRvZ2dsZXMgYXJlIGNvbW1vbilcbiAgICAgICAgb2JzLm9ic2VydmUoZWwsIHtcbiAgICAgICAgICBjaGlsZExpc3Q6IHRydWUsXG4gICAgICAgICAgc3VidHJlZTogdHJ1ZSxcbiAgICAgICAgICBhdHRyaWJ1dGVzOiB0cnVlLFxuICAgICAgICAgIGF0dHJpYnV0ZUZpbHRlcjogWydjbGFzcyddLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fY2FsZW5kYXJPYnNlcnZlcnMucHVzaChvYnMpO1xuICAgICAgICB0aGlzLl9vYnNlcnZlZEVsZW1lbnRzLnB1c2goZWwpO1xuICAgICAgICAvLyBBbHNvIG9ic2VydmUgcGFyZW50IC0gaWYgUHJpbWVORyByZXBsYWNlcyB0aGUgLnAtZGF0ZXBpY2tlciBlbGVtZW50LCBwYXJlbnQgY2hpbGRMaXN0IGNoYW5nZXMgd2lsbCBmaXJlXG4gICAgICAgIGNvbnN0IHBhcmVudCA9IGVsLnBhcmVudEVsZW1lbnQ7XG4gICAgICAgIGlmIChwYXJlbnQgJiYgdGhpcy5fb2JzZXJ2ZWRQYXJlbnRFbGVtZW50cy5pbmRleE9mKHBhcmVudCkgPT09IC0xKSB7XG4gICAgICAgICAgY29uc3QgcGFyZW50T2JzID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCkgPT4ge1xuICAgICAgICAgICAgLy8gcmVhdHRhY2ggb2JzZXJ2ZXJzIHNpbmNlIHRoZSBjYWxFbCBtYXkgaGF2ZSBiZWVuIHJlcGxhY2VkXG4gICAgICAgICAgICB0aGlzLl9zY2hlZHVsZVVwZGF0ZSgpO1xuICAgICAgICAgICAgLy8gZGV0YWNoIGFuZCByZS1hdHRhY2ggb2JzZXJ2ZXJzIGFmdGVyIERPTSBzZXR0bGVzXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zdG9wQ2FsZW5kYXJPYnNlcnZlcnMoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9zdGFydENhbGVuZGFyT2JzZXJ2ZXJzKCk7XG4gICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgICAgICAgICB9LCAxMDApOyAvLyBzbGlnaHRseSBsYXJnZXIgZGVsYXkgdG8gbGV0IFByaW1lTkcgZmluaXNoIHRoZSBtb250aCByZW5kZXJpbmdcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBwYXJlbnRPYnMub2JzZXJ2ZShwYXJlbnQsIHsgY2hpbGRMaXN0OiB0cnVlLCBzdWJ0cmVlOiBmYWxzZSB9KTtcbiAgICAgICAgICB0aGlzLl9wYXJlbnRPYnNlcnZlcnMucHVzaChwYXJlbnRPYnMpO1xuICAgICAgICAgIHRoaXMuX29ic2VydmVkUGFyZW50RWxlbWVudHMucHVzaChwYXJlbnQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBpZ25vcmVcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9zdG9wQ2FsZW5kYXJPYnNlcnZlcnMoKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuX2NhbGVuZGFyT2JzZXJ2ZXJzLmZvckVhY2goKG9icykgPT4gb2JzLmRpc2Nvbm5lY3QoKSk7XG4gICAgICB0aGlzLl9wYXJlbnRPYnNlcnZlcnMuZm9yRWFjaCgob2JzKSA9PiBvYnMuZGlzY29ubmVjdCgpKTtcbiAgICB9IGNhdGNoIChlKSB7fVxuICAgIHRoaXMuX2NhbGVuZGFyT2JzZXJ2ZXJzID0gW107XG4gICAgdGhpcy5fb2JzZXJ2ZWRFbGVtZW50cyA9IFtdO1xuICAgIHRoaXMuX3BhcmVudE9ic2VydmVycyA9IFtdO1xuICAgIHRoaXMuX29ic2VydmVkUGFyZW50RWxlbWVudHMgPSBbXTtcbiAgfVxuXG4gIHByaXZhdGUgX3NjaGVkdWxlVXBkYXRlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl91cGRhdGVSYWZJZCAhPSBudWxsKSByZXR1cm47IC8vIGFscmVhZHkgc2NoZWR1bGVkXG4gICAgdGhpcy5fdXBkYXRlUmFmSWQgPSB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgIHRoaXMuX3VwZGF0ZVJhZklkID0gbnVsbDtcbiAgICAgIHRoaXMuX3VwZGF0ZVN0YXJ0RW5kUmFuZ2VDbGFzc2VzKCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9jYW5jZWxTY2hlZHVsZWRVcGRhdGUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX3VwZGF0ZVJhZklkICE9IG51bGwpIHtcbiAgICAgIHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl91cGRhdGVSYWZJZCk7XG4gICAgICB0aGlzLl91cGRhdGVSYWZJZCA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0Q2FsZW5kYXJFbGVtZW50cygpOiBFbGVtZW50W10ge1xuICAgIGNvbnN0IGNhbEVsczogRWxlbWVudFtdID0gW107XG4gICAgY29uc3Qgb3ZlcmxheUNhbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAnLmF0b21peC1vdmVybGF5LWNhbGVuZGFyIC5wLWRhdGVwaWNrZXInXG4gICAgKTtcbiAgICBjb25zdCBpbmxpbmVDYWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuaW5saW5lLWNhbGVuZGFyIC5wLWRhdGVwaWNrZXInKTtcbiAgICBpZiAob3ZlcmxheUNhbCkgY2FsRWxzLnB1c2gob3ZlcmxheUNhbCk7XG4gICAgaWYgKGlubGluZUNhbCkgY2FsRWxzLnB1c2goaW5saW5lQ2FsKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcGFuZWwgPSB0aGlzLm92ZXJsYXlQYW5lbCBhcyBhbnk7XG4gICAgICBpZiAocGFuZWwgJiYgcGFuZWwuZWwgJiYgcGFuZWwuZWwubmF0aXZlRWxlbWVudCkge1xuICAgICAgICBjb25zdCBlbCA9IHBhbmVsLmVsLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignLnAtZGF0ZXBpY2tlcicpO1xuICAgICAgICBpZiAoZWwpIGNhbEVscy5wdXNoKGVsIGFzIEVsZW1lbnQpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgLy8gcmVtb3ZlIGR1cGxpY2F0ZXNcbiAgICByZXR1cm4gQXJyYXkuZnJvbShuZXcgU2V0KGNhbEVscykpO1xuICB9XG59XG4iLCI8ZGl2PlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlubGluZTsgZWxzZSBpbmxpbmVCbG9ja1wiPlxuICAgIDxkaXYgW25nQ2xhc3NdPVwic3R5bGVDbGFzc1wiIGNsYXNzPVwiaW5wdXQtd3JhcHBlclwiPlxuICAgICAgPGlucHV0XG4gICAgICAgIHBJbnB1dFRleHRcbiAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICBbbmdDbGFzc109XCJpbnB1dFN0eWxlQ2xhc3NcIlxuICAgICAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIlxuICAgICAgICBbdmFsdWVdPVwiZ2V0RGF0ZVJhbmdlTGFiZWwoKVwiXG4gICAgICAgIHJlYWRvbmx5XG4gICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgIChjbGljayk9XCJvdmVybGF5UGFuZWw/LnRvZ2dsZSgkZXZlbnQpXCJcbiAgICAgICAgKGtleWRvd24pPVwib25JbnB1dEtleURvd24oJGV2ZW50KVwiXG4gICAgICAvPlxuICAgICAgPGlcbiAgICAgICAgY2xhc3M9XCJwaSBwaS1jYWxlbmRhciBpbnB1dC1pY29uXCJcbiAgICAgICAgdGl0bGU9XCJPcGVuIGNhbGVuZGFyXCJcbiAgICAgICAgKGNsaWNrKT1cIiFkaXNhYmxlZCAmJiBvdmVybGF5UGFuZWw/LnRvZ2dsZSgkZXZlbnQpXCJcbiAgICAgID48L2k+XG4gICAgICA8aVxuICAgICAgICAqbmdJZj1cImhhc1NlbGVjdGlvblwiXG4gICAgICAgIGNsYXNzPVwicGkgcGktdGltZXMgaW5wdXQtY2xlYXItaWNvblwiXG4gICAgICAgIHRpdGxlPVwiQ2xlYXJcIlxuICAgICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgICAoY2xpY2spPVwiIWRpc2FibGVkICYmIGNsZWFyQW5kU3RvcCgkZXZlbnQpXCJcbiAgICAgICAgKGtleWRvd24uZW50ZXIpPVwiIWRpc2FibGVkICYmIGNsZWFyQW5kU3RvcCgkZXZlbnQpXCJcbiAgICAgICAgKGtleWRvd24uc3BhY2UpPVwiIWRpc2FibGVkICYmIGNsZWFyQW5kU3RvcCgkZXZlbnQpXCJcbiAgICAgID48L2k+XG4gICAgPC9kaXY+XG5cbiAgICA8cC1vdmVybGF5UGFuZWxcbiAgICAgICNvdmVybGF5UGFuZWxcbiAgICAgIFtkaXNtaXNzYWJsZV09XCJ0cnVlXCJcbiAgICAgIGFwcGVuZFRvPVwiYm9keVwiXG4gICAgICBzdHlsZUNsYXNzPVwiYXRvbWl4LWRhdGUtcmFuZ2Utb3ZlcmxheVwiXG4gICAgICAob25TaG93KT1cIm9uT3ZlcmxheVNob3coKVwiXG4gICAgICAob25IaWRlKT1cIm9uT3ZlcmxheUhpZGUoKVwiXG4gICAgPlxuICAgICAgPGRpdiBjbGFzcz1cIm92ZXJsYXktaW5uZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm92ZXJsYXktbGVmdFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcmVzZXQtbGlzdFwiPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICBwQnV0dG9uXG4gICAgICAgICAgICAgIHBSaXBwbGVcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIGNsYXNzPVwicHJlc2V0LWJ0blwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJhcHBseVByZXNldCgndG9kYXknKVwiXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgYWN0aXZlOiBzZWxlY3RlZFByZXNldCA9PT0gJ3RvZGF5JyB9XCJcbiAgICAgICAgICAgICAgbGFiZWw9XCJUb2RheVwiXG4gICAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIHBCdXR0b25cbiAgICAgICAgICAgICAgcFJpcHBsZVxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJwcmVzZXQtYnRuXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImFwcGx5UHJlc2V0KCd5ZXN0ZXJkYXknKVwiXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgYWN0aXZlOiBzZWxlY3RlZFByZXNldCA9PT0gJ3llc3RlcmRheScgfVwiXG4gICAgICAgICAgICAgIGxhYmVsPVwiWWVzdGVyZGF5XCJcbiAgICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgcEJ1dHRvblxuICAgICAgICAgICAgICBwUmlwcGxlXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBjbGFzcz1cInByZXNldC1idG5cIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiYXBwbHlQcmVzZXQoJ2xhc3Q3ZGF5cycpXCJcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyBhY3RpdmU6IHNlbGVjdGVkUHJlc2V0ID09PSAnbGFzdDdkYXlzJyB9XCJcbiAgICAgICAgICAgICAgbGFiZWw9XCJMYXN0IDcgZGF5c1wiXG4gICAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIHBCdXR0b25cbiAgICAgICAgICAgICAgcFJpcHBsZVxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJwcmVzZXQtYnRuXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImFwcGx5UHJlc2V0KCdsYXN0MzBkYXlzJylcIlxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7IGFjdGl2ZTogc2VsZWN0ZWRQcmVzZXQgPT09ICdsYXN0MzBkYXlzJyB9XCJcbiAgICAgICAgICAgICAgbGFiZWw9XCJMYXN0IDMwIGRheXNcIlxuICAgICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICBwQnV0dG9uXG4gICAgICAgICAgICAgIHBSaXBwbGVcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIGNsYXNzPVwicHJlc2V0LWJ0blwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJhcHBseVByZXNldCgnbGFzdDNtb250aHMnKVwiXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgYWN0aXZlOiBzZWxlY3RlZFByZXNldCA9PT0gJ2xhc3QzbW9udGhzJyB9XCJcbiAgICAgICAgICAgICAgbGFiZWw9XCJMYXN0IDMgbW9udGhzXCJcbiAgICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgcEJ1dHRvblxuICAgICAgICAgICAgICBwUmlwcGxlXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBjbGFzcz1cInByZXNldC1idG5cIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiYXBwbHlQcmVzZXQoJ2xhc3Q2bW9udGhzJylcIlxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7IGFjdGl2ZTogc2VsZWN0ZWRQcmVzZXQgPT09ICdsYXN0Nm1vbnRocycgfVwiXG4gICAgICAgICAgICAgIGxhYmVsPVwiTGFzdCA2IG1vbnRoc1wiXG4gICAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIHBCdXR0b25cbiAgICAgICAgICAgICAgcFJpcHBsZVxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJwcmVzZXQtYnRuXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImFwcGx5UHJlc2V0KCdsYXN0MXllYXInKVwiXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgYWN0aXZlOiBzZWxlY3RlZFByZXNldCA9PT0gJ2xhc3QxeWVhcicgfVwiXG4gICAgICAgICAgICAgIGxhYmVsPVwiTGFzdCAxIHllYXJcIlxuICAgICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY3Agb2YgY3VzdG9tUHJlc2V0c1wiPlxuICAgICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJwcmVzZXQtYnRuXCIgKGNsaWNrKT1cIm9uQ3VzdG9tUHJlc2V0Q2xpY2soY3Aua2V5KVwiIFtuZ0NsYXNzXT1cInsgJ2FjdGl2ZSc6IHNlbGVjdGVkUHJlc2V0ID09PSBjcC5rZXkgfVwiIFtsYWJlbF09XCJjcC5sYWJlbFwiPjwvYnV0dG9uPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8YSBjbGFzcz1cInJlc2V0LWxpbmtcIiAoY2xpY2spPVwicmVzZXRBbmRDbG9zZSgpXCI+UmVzZXQ8L2E+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwib3ZlcmxheS1yaWdodFwiPlxuICAgICAgICAgIDxwLWNhbGVuZGFyXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cIm1vZGVsRGF0ZVwiXG4gICAgICAgICAgICBbc2VsZWN0aW9uTW9kZV09XCIncmFuZ2UnXCJcbiAgICAgICAgICAgIFtpbmxpbmVdPVwidHJ1ZVwiXG4gICAgICAgICAgICBbZGF0ZUZvcm1hdF09XCInbW0vZGQveXl5eSdcIlxuICAgICAgICAgICAgW3Nob3dPdGhlck1vbnRoc109XCJ0cnVlXCJcbiAgICAgICAgICAgIFtsb2NhbGVdPVwiZW5Mb2NhbGVcIlxuICAgICAgICAgICAgW3Nob3dJY29uXT1cImZhbHNlXCJcbiAgICAgICAgICAgIFtzdHlsZUNsYXNzXT1cIidhdG9taXgtb3ZlcmxheS1jYWxlbmRhcidcIlxuICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25Nb2RlbENoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIChvbk1vbnRoQ2hhbmdlKT1cIm9uQ2FsZW5kYXJWaWV3Q2hhbmdlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgIChvblllYXJDaGFuZ2UpPVwib25DYWxlbmRhclZpZXdDaGFuZ2VkKCRldmVudClcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgICAgIFttYXhEYXRlXT1cIm1heERhdGVcIlxuICAgICAgICAgICAgW21pbkRhdGVdPVwibWluRGF0ZVwiXG4gICAgICAgICAgPjwvcC1jYWxlbmRhcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L3Atb3ZlcmxheVBhbmVsPlxuICA8L25nLWNvbnRhaW5lcj5cblxuICA8bmctdGVtcGxhdGUgI2lubGluZUJsb2NrPlxuICAgIDxkaXYgW25nQ2xhc3NdPVwic3R5bGVDbGFzc1wiIGNsYXNzPVwiaW5wdXQtd3JhcHBlclwiPlxuICAgICAgPGlucHV0XG4gICAgICAgIHBJbnB1dFRleHRcbiAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICBbbmdDbGFzc109XCJpbnB1dFN0eWxlQ2xhc3NcIlxuICAgICAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIlxuICAgICAgICBbdmFsdWVdPVwiZ2V0RGF0ZVJhbmdlTGFiZWwoKVwiXG4gICAgICAgIHJlYWRvbmx5XG4gICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgIChrZXlkb3duKT1cIm9uSW5wdXRLZXlEb3duKCRldmVudClcIlxuICAgICAgLz5cbiAgICAgIDxpIGNsYXNzPVwicGkgcGktY2FsZW5kYXIgaW5wdXQtaWNvblwiIHRpdGxlPVwiT3BlbiBjYWxlbmRhclwiPjwvaT5cbiAgICAgIDxpXG4gICAgICAgICpuZ0lmPVwiaGFzU2VsZWN0aW9uXCJcbiAgICAgICAgY2xhc3M9XCJwaSBwaS10aW1lcyBpbnB1dC1jbGVhci1pY29uXCJcbiAgICAgICAgdGl0bGU9XCJDbGVhclwiXG4gICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgIChjbGljayk9XCJjbGVhckFuZFN0b3AoJGV2ZW50KVwiXG4gICAgICAgIChrZXlkb3duLmVudGVyKT1cImNsZWFyQW5kU3RvcCgkZXZlbnQpXCJcbiAgICAgICAgKGtleWRvd24uc3BhY2UpPVwiY2xlYXJBbmRTdG9wKCRldmVudClcIlxuICAgICAgPjwvaT5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwib3ZlcmxheS1pbm5lciBpbmxpbmUtY2FsZW5kYXIgZmxleFwiPlxuICAgICAgPGRpdiBjbGFzcz1cIm92ZXJsYXktbGVmdFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicHJlc2V0LWxpc3RcIj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICBwQnV0dG9uXG4gICAgICAgICAgICBwUmlwcGxlXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwicHJlc2V0LWJ0blwiXG4gICAgICAgICAgICAoY2xpY2spPVwiYXBwbHlQcmVzZXQoJ3RvZGF5JylcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwieyBhY3RpdmU6IHNlbGVjdGVkUHJlc2V0ID09PSAndG9kYXknIH1cIlxuICAgICAgICAgICAgbGFiZWw9XCJUb2RheVwiXG4gICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHBCdXR0b25cbiAgICAgICAgICAgIHBSaXBwbGVcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCJwcmVzZXQtYnRuXCJcbiAgICAgICAgICAgIChjbGljayk9XCJhcHBseVByZXNldCgneWVzdGVyZGF5JylcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwieyBhY3RpdmU6IHNlbGVjdGVkUHJlc2V0ID09PSAneWVzdGVyZGF5JyB9XCJcbiAgICAgICAgICAgIGxhYmVsPVwiWWVzdGVyZGF5XCJcbiAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgcEJ1dHRvblxuICAgICAgICAgICAgcFJpcHBsZVxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cInByZXNldC1idG5cIlxuICAgICAgICAgICAgKGNsaWNrKT1cImFwcGx5UHJlc2V0KCdsYXN0N2RheXMnKVwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ7IGFjdGl2ZTogc2VsZWN0ZWRQcmVzZXQgPT09ICdsYXN0N2RheXMnIH1cIlxuICAgICAgICAgICAgbGFiZWw9XCJMYXN0IDcgZGF5c1wiXG4gICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHBCdXR0b25cbiAgICAgICAgICAgIHBSaXBwbGVcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCJwcmVzZXQtYnRuXCJcbiAgICAgICAgICAgIChjbGljayk9XCJhcHBseVByZXNldCgnbGFzdDMwZGF5cycpXCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgYWN0aXZlOiBzZWxlY3RlZFByZXNldCA9PT0gJ2xhc3QzMGRheXMnIH1cIlxuICAgICAgICAgICAgbGFiZWw9XCJMYXN0IDMwIGRheXNcIlxuICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICBwQnV0dG9uXG4gICAgICAgICAgICBwUmlwcGxlXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwicHJlc2V0LWJ0blwiXG4gICAgICAgICAgICAoY2xpY2spPVwiYXBwbHlQcmVzZXQoJ2xhc3QzbW9udGhzJylcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwieyBhY3RpdmU6IHNlbGVjdGVkUHJlc2V0ID09PSAnbGFzdDNtb250aHMnIH1cIlxuICAgICAgICAgICAgbGFiZWw9XCJMYXN0IDMgbW9udGhzXCJcbiAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgcEJ1dHRvblxuICAgICAgICAgICAgcFJpcHBsZVxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cInByZXNldC1idG5cIlxuICAgICAgICAgICAgKGNsaWNrKT1cImFwcGx5UHJlc2V0KCdsYXN0MXllYXInKVwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ7IGFjdGl2ZTogc2VsZWN0ZWRQcmVzZXQgPT09ICdsYXN0MXllYXInIH1cIlxuICAgICAgICAgICAgbGFiZWw9XCJMYXN0IDEgeWVhclwiXG4gICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNwIG9mIGN1c3RvbVByZXNldHNcIj5cbiAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInByZXNldC1idG5cIiAoY2xpY2spPVwib25DdXN0b21QcmVzZXRDbGljayhjcC5rZXkpXCIgW25nQ2xhc3NdPVwieyAnYWN0aXZlJzogc2VsZWN0ZWRQcmVzZXQgPT09IGNwLmtleSB9XCIgW2xhYmVsXT1cImNwLmxhYmVsXCI+PC9idXR0b24+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPGEgY2xhc3M9XCJyZXNldC1saW5rXCIgKGNsaWNrKT1cInJlc2V0QW5kQ2xvc2UoKVwiPlJlc2V0PC9hPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cIm92ZXJsYXktcmlnaHRcIj5cbiAgICAgICAgPHAtY2FsZW5kYXJcbiAgICAgICAgICBbKG5nTW9kZWwpXT1cIm1vZGVsRGF0ZVwiXG4gICAgICAgICAgW3NlbGVjdGlvbk1vZGVdPVwiJ3JhbmdlJ1wiXG4gICAgICAgICAgW2lubGluZV09XCJ0cnVlXCJcbiAgICAgICAgICBbZGF0ZUZvcm1hdF09XCInbW0vZGQveXl5eSdcIlxuICAgICAgICAgIFtzaG93T3RoZXJNb250aHNdPVwidHJ1ZVwiXG4gICAgICAgICAgW2xvY2FsZV09XCJlbkxvY2FsZVwiXG4gICAgICAgICAgW3Nob3dJY29uXT1cImZhbHNlXCJcbiAgICAgICAgICBbc3R5bGVDbGFzc109XCInYXRvbWl4LW92ZXJsYXktY2FsZW5kYXInXCJcbiAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvbk1vZGVsQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgIChvbk1vbnRoQ2hhbmdlKT1cIm9uQ2FsZW5kYXJWaWV3Q2hhbmdlZCgkZXZlbnQpXCJcbiAgICAgICAgICAob25ZZWFyQ2hhbmdlKT1cIm9uQ2FsZW5kYXJWaWV3Q2hhbmdlZCgkZXZlbnQpXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgIFttYXhEYXRlXT1cIm1heERhdGVcIlxuICAgICAgICAgIFttaW5EYXRlXT1cIm1pbkRhdGVcIlxuICAgICAgICA+PC9wLWNhbGVuZGFyPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvbmctdGVtcGxhdGU+XG48L2Rpdj5cbiJdfQ==