primekit 1.0.8 → 1.0.10

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 (244) hide show
  1. package/README.md +25 -25
  2. package/ng-package.json +8 -0
  3. package/package.json +12 -25
  4. package/src/assets/images/empty-table.svg +25 -25
  5. package/src/lib/lib/atomix-alert/atomix-alert.component.css +67 -0
  6. package/src/lib/lib/atomix-alert/atomix-alert.component.html +7 -0
  7. package/src/lib/lib/atomix-alert/atomix-alert.component.spec.ts +154 -0
  8. package/src/lib/lib/atomix-alert/atomix-alert.component.ts +75 -0
  9. package/src/lib/lib/atomix-autocomplete/atomix-autocomplete.component.html +35 -0
  10. package/src/lib/lib/atomix-autocomplete/atomix-autocomplete.component.scss +72 -0
  11. package/src/lib/lib/atomix-autocomplete/atomix-autocomplete.component.spec.ts +210 -0
  12. package/src/lib/lib/atomix-autocomplete/atomix-autocomplete.component.ts +70 -0
  13. package/src/lib/lib/atomix-button/atomix-button.component.css +70 -0
  14. package/src/lib/lib/atomix-button/atomix-button.component.html +20 -0
  15. package/src/lib/lib/atomix-button/atomix-button.component.spec.ts +135 -0
  16. package/src/lib/lib/atomix-button/atomix-button.component.ts +28 -0
  17. package/{lib/lib/atomix-button/atomix-button.models.d.ts → src/lib/lib/atomix-button/atomix-button.models.ts} +2 -2
  18. package/src/lib/lib/atomix-calendar/atomix-calendar.component.css +5 -0
  19. package/src/lib/lib/atomix-calendar/atomix-calendar.component.html +20 -0
  20. package/src/lib/lib/atomix-calendar/atomix-calendar.component.spec.ts +145 -0
  21. package/src/lib/lib/atomix-calendar/atomix-calendar.component.ts +71 -0
  22. package/src/lib/lib/atomix-card/atomix-card.component.css +4 -0
  23. package/src/lib/lib/atomix-card/atomix-card.component.html +3 -0
  24. package/src/lib/lib/atomix-card/atomix-card.component.spec.ts +63 -0
  25. package/src/lib/lib/atomix-card/atomix-card.component.ts +13 -0
  26. package/src/lib/lib/atomix-confirmation-dialog/atomix-confirmation-dialog.component.css +12 -0
  27. package/src/lib/lib/atomix-confirmation-dialog/atomix-confirmation-dialog.component.html +9 -0
  28. package/src/lib/lib/atomix-confirmation-dialog/atomix-confirmation-dialog.component.spec.ts +63 -0
  29. package/src/lib/lib/atomix-confirmation-dialog/atomix-confirmation-dialog.component.ts +22 -0
  30. package/src/lib/lib/atomix-daterange-calendar/atomix-daterange-calendar.component.html +233 -0
  31. package/src/lib/lib/atomix-daterange-calendar/atomix-daterange-calendar.component.scss +266 -0
  32. package/src/lib/lib/atomix-daterange-calendar/atomix-daterange-calendar.component.spec.ts +1465 -0
  33. package/src/lib/lib/atomix-daterange-calendar/atomix-daterange-calendar.component.ts +717 -0
  34. package/src/lib/lib/atomix-divider/atomix-divider.component.css +0 -0
  35. package/src/lib/lib/atomix-divider/atomix-divider.component.html +7 -0
  36. package/src/lib/lib/atomix-divider/atomix-divider.component.spec.ts +91 -0
  37. package/src/lib/lib/atomix-divider/atomix-divider.component.ts +17 -0
  38. package/src/lib/lib/atomix-dropdown/atomix-dropdown.component.css +25 -0
  39. package/src/lib/lib/atomix-dropdown/atomix-dropdown.component.html +37 -0
  40. package/src/lib/lib/atomix-dropdown/atomix-dropdown.component.spec.ts +178 -0
  41. package/src/lib/lib/atomix-dropdown/atomix-dropdown.component.ts +89 -0
  42. package/src/lib/lib/atomix-dynamic-dialog/atomix-dynamic-dialog.component.css +0 -0
  43. package/src/lib/lib/atomix-dynamic-dialog/atomix-dynamic-dialog.component.html +0 -0
  44. package/src/lib/lib/atomix-dynamic-dialog/atomix-dynamic-dialog.component.spec.ts +128 -0
  45. package/src/lib/lib/atomix-dynamic-dialog/atomix-dynamic-dialog.component.ts +42 -0
  46. package/src/lib/lib/atomix-dynamic-dialog/atomix-dynamic-dialog.models.ts +12 -0
  47. package/src/lib/lib/atomix-form/atomix-form-autocomplete/atomix-form-autocomplete.component.html +20 -0
  48. package/src/lib/lib/atomix-form/atomix-form-autocomplete/atomix-form-autocomplete.component.scss +7 -0
  49. package/src/lib/lib/atomix-form/atomix-form-autocomplete/atomix-form-autocomplete.component.spec.ts +169 -0
  50. package/src/lib/lib/atomix-form/atomix-form-autocomplete/atomix-form-autocomplete.component.ts +41 -0
  51. package/src/lib/lib/atomix-form/atomix-form-calendar/atomix-form-calendar.component.html +21 -0
  52. package/src/lib/lib/atomix-form/atomix-form-calendar/atomix-form-calendar.component.scss +7 -0
  53. package/src/lib/lib/atomix-form/atomix-form-calendar/atomix-form-calendar.component.spec.ts +142 -0
  54. package/src/lib/lib/atomix-form/atomix-form-calendar/atomix-form-calendar.component.ts +32 -0
  55. package/src/lib/lib/atomix-form/atomix-form-checkbox/atomix-form-checkbox.component.html +13 -0
  56. package/src/lib/lib/atomix-form/atomix-form-checkbox/atomix-form-checkbox.component.scss +14 -0
  57. package/src/lib/lib/atomix-form/atomix-form-checkbox/atomix-form-checkbox.component.spec.ts +112 -0
  58. package/src/lib/lib/atomix-form/atomix-form-checkbox/atomix-form-checkbox.component.ts +28 -0
  59. package/src/lib/lib/atomix-form/atomix-form-chips/atomix-form-chips.component.html +20 -0
  60. package/src/lib/lib/atomix-form/atomix-form-chips/atomix-form-chips.component.scss +3 -0
  61. package/src/lib/lib/atomix-form/atomix-form-chips/atomix-form-chips.component.spec.ts +153 -0
  62. package/src/lib/lib/atomix-form/atomix-form-chips/atomix-form-chips.component.ts +28 -0
  63. package/src/lib/lib/atomix-form/atomix-form-chips/form.chips.models.ts +5 -0
  64. package/src/lib/lib/atomix-form/atomix-form-dropdown/atomix-form-dropdown.component.html +24 -0
  65. package/src/lib/lib/atomix-form/atomix-form-dropdown/atomix-form-dropdown.component.scss +15 -0
  66. package/src/lib/lib/atomix-form/atomix-form-dropdown/atomix-form-dropdown.component.spec.ts +156 -0
  67. package/src/lib/lib/atomix-form/atomix-form-dropdown/atomix-form-dropdown.component.ts +36 -0
  68. package/src/lib/lib/atomix-form/atomix-form-input-component/atomix-form-input-component.component.html +33 -0
  69. package/src/lib/lib/atomix-form/atomix-form-input-component/atomix-form-input-component.component.scss +32 -0
  70. package/src/lib/lib/atomix-form/atomix-form-input-component/atomix-form-input-component.component.spec.ts +156 -0
  71. package/src/lib/lib/atomix-form/atomix-form-input-component/atomix-form-input-component.component.ts +42 -0
  72. package/src/lib/lib/atomix-form/atomix-form-inputmask-component/atomix-form-inputmask-component.component.html +14 -0
  73. package/src/lib/lib/atomix-form/atomix-form-inputmask-component/atomix-form-inputmask-component.component.scss +0 -0
  74. package/src/lib/lib/atomix-form/atomix-form-inputmask-component/atomix-form-inputmask-component.component.spec.ts +104 -0
  75. package/src/lib/lib/atomix-form/atomix-form-inputmask-component/atomix-form-inputmask-component.component.ts +24 -0
  76. package/src/lib/lib/atomix-form/atomix-form-password-component/atomix-form-password-component.component.html +16 -0
  77. package/src/lib/lib/atomix-form/atomix-form-password-component/atomix-form-password-component.component.scss +0 -0
  78. package/src/lib/lib/atomix-form/atomix-form-password-component/atomix-form-password-component.component.spec.ts +92 -0
  79. package/src/lib/lib/atomix-form/atomix-form-password-component/atomix-form-password-component.component.ts +24 -0
  80. package/src/lib/lib/atomix-form/atomix-form-radio-button/atomix-radio-button.component.html +23 -0
  81. package/src/lib/lib/atomix-form/atomix-form-radio-button/atomix-radio-button.component.scss +3 -0
  82. package/src/lib/lib/atomix-form/atomix-form-radio-button/atomix-radio-button.component.spec.ts +126 -0
  83. package/src/lib/lib/atomix-form/atomix-form-radio-button/atomix-radio-button.component.ts +26 -0
  84. package/src/lib/lib/atomix-form/atomix-form-textarea/atomix-form-textarea.component.html +17 -0
  85. package/src/lib/lib/atomix-form/atomix-form-textarea/atomix-form-textarea.component.scss +6 -0
  86. package/src/lib/lib/atomix-form/atomix-form-textarea/atomix-form-textarea.component.spec.ts +120 -0
  87. package/src/lib/lib/atomix-form/atomix-form-textarea/atomix-form-textarea.component.ts +24 -0
  88. package/src/lib/lib/atomix-input/atomix-input.component.css +52 -0
  89. package/src/lib/lib/atomix-input/atomix-input.component.html +45 -0
  90. package/src/lib/lib/atomix-input/atomix-input.component.spec.ts +229 -0
  91. package/src/lib/lib/atomix-input/atomix-input.component.ts +64 -0
  92. package/src/lib/lib/atomix-input-switch/atomix-input-switch.component.css +12 -0
  93. package/src/lib/lib/atomix-input-switch/atomix-input-switch.component.html +17 -0
  94. package/src/lib/lib/atomix-input-switch/atomix-input-switch.component.spec.ts +173 -0
  95. package/src/lib/lib/atomix-input-switch/atomix-input-switch.component.ts +62 -0
  96. package/src/lib/lib/atomix-loading-overlay/atomix-loading-overlay.component.html +47 -0
  97. package/src/lib/lib/atomix-loading-overlay/atomix-loading-overlay.component.scss +14 -0
  98. package/src/lib/lib/atomix-loading-overlay/atomix-loading-overlay.component.spec.ts +21 -0
  99. package/src/lib/lib/atomix-loading-overlay/atomix-loading-overlay.component.ts +25 -0
  100. package/src/lib/lib/atomix-messages/messages.component.css +0 -0
  101. package/src/lib/lib/atomix-messages/messages.component.html +9 -0
  102. package/src/lib/lib/atomix-messages/messages.component.spec.ts +115 -0
  103. package/src/lib/lib/atomix-messages/messages.component.ts +17 -0
  104. package/src/lib/lib/atomix-pagination/atomix-pagination.component.css +19 -0
  105. package/src/lib/lib/atomix-pagination/atomix-pagination.component.html +24 -0
  106. package/src/lib/lib/atomix-pagination/atomix-pagination.component.spec.ts +98 -0
  107. package/src/lib/lib/atomix-pagination/atomix-pagination.component.ts +36 -0
  108. package/src/lib/lib/atomix-radio-button/atomix-radio-button.component.css +0 -0
  109. package/src/lib/lib/atomix-radio-button/atomix-radio-button.component.html +7 -0
  110. package/src/lib/lib/atomix-radio-button/atomix-radio-button.component.spec.ts +116 -0
  111. package/src/lib/lib/atomix-radio-button/atomix-radio-button.component.ts +37 -0
  112. package/src/lib/lib/atomix-search-dropdown/atomix-search-dropdown.component.css +49 -0
  113. package/src/lib/lib/atomix-search-dropdown/atomix-search-dropdown.component.html +68 -0
  114. package/src/lib/lib/atomix-search-dropdown/atomix-search-dropdown.component.spec.ts +282 -0
  115. package/src/lib/lib/atomix-search-dropdown/atomix-search-dropdown.component.ts +119 -0
  116. package/{lib/lib/atomix-select-button/atomix-select-button-models.d.ts → src/lib/lib/atomix-select-button/atomix-select-button-models.ts} +4 -4
  117. package/src/lib/lib/atomix-select-button/atomix-select-button.component.css +5 -0
  118. package/src/lib/lib/atomix-select-button/atomix-select-button.component.html +7 -0
  119. package/src/lib/lib/atomix-select-button/atomix-select-button.component.spec.ts +73 -0
  120. package/src/lib/lib/atomix-select-button/atomix-select-button.component.ts +19 -0
  121. package/src/lib/lib/atomix-snackbar/atomix-snackbar.component.css +30 -0
  122. package/src/lib/lib/atomix-snackbar/atomix-snackbar.component.html +4 -0
  123. package/src/lib/lib/atomix-snackbar/atomix-snackbar.component.spec.ts +60 -0
  124. package/src/lib/lib/atomix-snackbar/atomix-snackbar.component.ts +27 -0
  125. package/src/lib/lib/atomix-spinner/atomix-spinner.component.css +0 -0
  126. package/src/lib/lib/atomix-spinner/atomix-spinner.component.html +7 -0
  127. package/src/lib/lib/atomix-spinner/atomix-spinner.component.spec.ts +70 -0
  128. package/src/lib/lib/atomix-spinner/atomix-spinner.component.ts +13 -0
  129. package/src/lib/lib/atomix-steps/atomix-steps.component.html +9 -0
  130. package/src/lib/lib/atomix-steps/atomix-steps.component.scss +0 -0
  131. package/src/lib/lib/atomix-steps/atomix-steps.component.spec.ts +120 -0
  132. package/src/lib/lib/atomix-steps/atomix-steps.component.ts +32 -0
  133. package/src/lib/lib/atomix-tabMenu/atomix-tabMenu.component.css +0 -0
  134. package/src/lib/lib/atomix-tabMenu/atomix-tabMenu.component.html +26 -0
  135. package/src/lib/lib/atomix-tabMenu/atomix-tabMenu.component.spec.ts +106 -0
  136. package/src/lib/lib/atomix-tabMenu/atomix-tabMenu.component.ts +36 -0
  137. package/src/lib/lib/atomix-table/atomix-table.component.css +152 -0
  138. package/src/lib/lib/atomix-table/atomix-table.component.html +647 -0
  139. package/src/lib/lib/atomix-table/atomix-table.component.spec.ts +1648 -0
  140. package/src/lib/lib/atomix-table/atomix-table.component.ts +422 -0
  141. package/src/lib/lib/atomix-table/atomix-table.models.ts +39 -0
  142. package/src/lib/lib/atomix-tag/atomix-tag.component.css +0 -0
  143. package/src/lib/lib/atomix-tag/atomix-tag.component.html +6 -0
  144. package/src/lib/lib/atomix-tag/atomix-tag.component.spec.ts +47 -0
  145. package/src/lib/lib/atomix-tag/atomix-tag.component.ts +13 -0
  146. package/src/lib/lib/utils/prime-icons.util.spec.ts +21 -0
  147. package/src/lib/lib/utils/prime-icons.util.ts +11 -0
  148. package/src/lib/primekit.component.spec.ts +19 -0
  149. package/src/lib/primekit.component.ts +10 -0
  150. package/src/lib/primekit.module.spec.ts +155 -0
  151. package/src/lib/primekit.module.ts +183 -0
  152. package/src/lib/primekit.service.spec.ts +17 -0
  153. package/src/lib/primekit.service.ts +8 -0
  154. package/{public-api.d.ts → src/public-api.ts} +47 -37
  155. package/tsconfig.lib.json +13 -0
  156. package/tsconfig.lib.prod.json +11 -0
  157. package/tsconfig.spec.json +10 -0
  158. package/esm2022/lib/lib/atomix-alert/atomix-alert.component.mjs +0 -76
  159. package/esm2022/lib/lib/atomix-autocomplete/atomix-autocomplete.component.mjs +0 -108
  160. package/esm2022/lib/lib/atomix-button/atomix-button.component.mjs +0 -49
  161. package/esm2022/lib/lib/atomix-button/atomix-button.models.mjs +0 -2
  162. package/esm2022/lib/lib/atomix-calendar/atomix-calendar.component.mjs +0 -90
  163. package/esm2022/lib/lib/atomix-card/atomix-card.component.mjs +0 -24
  164. package/esm2022/lib/lib/atomix-confirmation-dialog/atomix-confirmation-dialog.component.mjs +0 -28
  165. package/esm2022/lib/lib/atomix-daterange-calendar/atomix-daterange-calendar.component.mjs +0 -648
  166. package/esm2022/lib/lib/atomix-divider/atomix-divider.component.mjs +0 -27
  167. package/esm2022/lib/lib/atomix-dropdown/atomix-dropdown.component.mjs +0 -105
  168. package/esm2022/lib/lib/atomix-dynamic-dialog/atomix-dynamic-dialog.component.mjs +0 -38
  169. package/esm2022/lib/lib/atomix-dynamic-dialog/atomix-dynamic-dialog.models.mjs +0 -2
  170. package/esm2022/lib/lib/atomix-form/atomix-form-autocomplete/atomix-form-autocomplete.component.mjs +0 -67
  171. package/esm2022/lib/lib/atomix-form/atomix-form-calendar/atomix-form-calendar.component.mjs +0 -59
  172. package/esm2022/lib/lib/atomix-form/atomix-form-checkbox/atomix-form-checkbox.component.mjs +0 -48
  173. package/esm2022/lib/lib/atomix-form/atomix-form-chips/atomix-form-chips.component.mjs +0 -54
  174. package/esm2022/lib/lib/atomix-form/atomix-form-chips/form.chips.models.mjs +0 -2
  175. package/esm2022/lib/lib/atomix-form/atomix-form-dropdown/atomix-form-dropdown.component.mjs +0 -70
  176. package/esm2022/lib/lib/atomix-form/atomix-form-input-component/atomix-form-input-component.component.mjs +0 -80
  177. package/esm2022/lib/lib/atomix-form/atomix-form-inputmask-component/atomix-form-inputmask-component.component.mjs +0 -48
  178. package/esm2022/lib/lib/atomix-form/atomix-form-password-component/atomix-form-password-component.component.mjs +0 -48
  179. package/esm2022/lib/lib/atomix-form/atomix-form-radio-button/atomix-radio-button.component.mjs +0 -46
  180. package/esm2022/lib/lib/atomix-form/atomix-form-textarea/atomix-form-textarea.component.mjs +0 -46
  181. package/esm2022/lib/lib/atomix-input/atomix-input.component.mjs +0 -94
  182. package/esm2022/lib/lib/atomix-input-switch/atomix-input-switch.component.mjs +0 -85
  183. package/esm2022/lib/lib/atomix-messages/messages.component.mjs +0 -33
  184. package/esm2022/lib/lib/atomix-pagination/atomix-pagination.component.mjs +0 -48
  185. package/esm2022/lib/lib/atomix-radio-button/atomix-radio-button.component.mjs +0 -50
  186. package/esm2022/lib/lib/atomix-search-dropdown/atomix-search-dropdown.component.mjs +0 -149
  187. package/esm2022/lib/lib/atomix-select-button/atomix-select-button-models.mjs +0 -2
  188. package/esm2022/lib/lib/atomix-select-button/atomix-select-button.component.mjs +0 -25
  189. package/esm2022/lib/lib/atomix-snackbar/atomix-snackbar.component.mjs +0 -29
  190. package/esm2022/lib/lib/atomix-spinner/atomix-spinner.component.mjs +0 -24
  191. package/esm2022/lib/lib/atomix-steps/atomix-steps.component.mjs +0 -41
  192. package/esm2022/lib/lib/atomix-tabMenu/atomix-tabMenu.component.mjs +0 -51
  193. package/esm2022/lib/lib/atomix-table/atomix-table.component.mjs +0 -454
  194. package/esm2022/lib/lib/atomix-table/atomix-table.models.mjs +0 -2
  195. package/esm2022/lib/lib/atomix-tag/atomix-tag.component.mjs +0 -24
  196. package/esm2022/lib/lib/utils/prime-icons.util.mjs +0 -10
  197. package/esm2022/lib/primekit.component.mjs +0 -11
  198. package/esm2022/lib/primekit.module.mjs +0 -313
  199. package/esm2022/lib/primekit.service.mjs +0 -14
  200. package/esm2022/primekit.mjs +0 -5
  201. package/esm2022/public-api.mjs +0 -43
  202. package/fesm2022/primekit.mjs +0 -3041
  203. package/fesm2022/primekit.mjs.map +0 -1
  204. package/index.d.ts +0 -5
  205. package/lib/lib/atomix-alert/atomix-alert.component.d.ts +0 -22
  206. package/lib/lib/atomix-autocomplete/atomix-autocomplete.component.d.ts +0 -34
  207. package/lib/lib/atomix-button/atomix-button.component.d.ts +0 -19
  208. package/lib/lib/atomix-calendar/atomix-calendar.component.d.ts +0 -27
  209. package/lib/lib/atomix-card/atomix-card.component.d.ts +0 -9
  210. package/lib/lib/atomix-confirmation-dialog/atomix-confirmation-dialog.component.d.ts +0 -12
  211. package/lib/lib/atomix-daterange-calendar/atomix-daterange-calendar.component.d.ts +0 -72
  212. package/lib/lib/atomix-divider/atomix-divider.component.d.ts +0 -12
  213. package/lib/lib/atomix-dropdown/atomix-dropdown.component.d.ts +0 -50
  214. package/lib/lib/atomix-dynamic-dialog/atomix-dynamic-dialog.component.d.ts +0 -15
  215. package/lib/lib/atomix-dynamic-dialog/atomix-dynamic-dialog.models.d.ts +0 -11
  216. package/lib/lib/atomix-form/atomix-form-autocomplete/atomix-form-autocomplete.component.d.ts +0 -25
  217. package/lib/lib/atomix-form/atomix-form-calendar/atomix-form-calendar.component.d.ts +0 -23
  218. package/lib/lib/atomix-form/atomix-form-checkbox/atomix-form-checkbox.component.d.ts +0 -18
  219. package/lib/lib/atomix-form/atomix-form-chips/atomix-form-chips.component.d.ts +0 -19
  220. package/lib/lib/atomix-form/atomix-form-chips/form.chips.models.d.ts +0 -5
  221. package/lib/lib/atomix-form/atomix-form-dropdown/atomix-form-dropdown.component.d.ts +0 -25
  222. package/lib/lib/atomix-form/atomix-form-input-component/atomix-form-input-component.component.d.ts +0 -28
  223. package/lib/lib/atomix-form/atomix-form-inputmask-component/atomix-form-inputmask-component.component.d.ts +0 -17
  224. package/lib/lib/atomix-form/atomix-form-password-component/atomix-form-password-component.component.d.ts +0 -17
  225. package/lib/lib/atomix-form/atomix-form-radio-button/atomix-radio-button.component.d.ts +0 -19
  226. package/lib/lib/atomix-form/atomix-form-textarea/atomix-form-textarea.component.d.ts +0 -17
  227. package/lib/lib/atomix-input/atomix-input.component.d.ts +0 -29
  228. package/lib/lib/atomix-input-switch/atomix-input-switch.component.d.ts +0 -30
  229. package/lib/lib/atomix-messages/messages.component.d.ts +0 -13
  230. package/lib/lib/atomix-pagination/atomix-pagination.component.d.ts +0 -19
  231. package/lib/lib/atomix-radio-button/atomix-radio-button.component.d.ts +0 -15
  232. package/lib/lib/atomix-search-dropdown/atomix-search-dropdown.component.d.ts +0 -60
  233. package/lib/lib/atomix-select-button/atomix-select-button.component.d.ts +0 -12
  234. package/lib/lib/atomix-snackbar/atomix-snackbar.component.d.ts +0 -12
  235. package/lib/lib/atomix-spinner/atomix-spinner.component.d.ts +0 -9
  236. package/lib/lib/atomix-steps/atomix-steps.component.d.ts +0 -19
  237. package/lib/lib/atomix-tabMenu/atomix-tabMenu.component.d.ts +0 -19
  238. package/lib/lib/atomix-table/atomix-table.component.d.ts +0 -119
  239. package/lib/lib/atomix-table/atomix-table.models.d.ts +0 -43
  240. package/lib/lib/atomix-tag/atomix-tag.component.d.ts +0 -9
  241. package/lib/lib/utils/prime-icons.util.d.ts +0 -3
  242. package/lib/primekit.component.d.ts +0 -5
  243. package/lib/primekit.module.d.ts +0 -70
  244. package/lib/primekit.service.d.ts +0 -6
@@ -1,648 +0,0 @@
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
- customRangeMode = false;
24
- selectedPreset = null; // 'today' | 'yesterday' | 'last7days' | 'last30days' | 'last3months' | 'last6months' | 'last1year' | 'custom' | null
25
- overlayPanel;
26
- dateRangeChange = new EventEmitter();
27
- // internal model bound to p-calendar to avoid changing external selection during first-click selection
28
- modelDate = null;
29
- enLocale = {
30
- firstDayOfWeek: 0,
31
- dayNames: [
32
- 'Sunday',
33
- 'Monday',
34
- 'Tuesday',
35
- 'Wednesday',
36
- 'Thursday',
37
- 'Friday',
38
- 'Saturday',
39
- ],
40
- dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
41
- dayNamesMin: ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'],
42
- monthNames: [
43
- 'January',
44
- 'February',
45
- 'March',
46
- 'April',
47
- 'May',
48
- 'June',
49
- 'July',
50
- 'August',
51
- 'September',
52
- 'October',
53
- 'November',
54
- 'December',
55
- ],
56
- monthNamesShort: [
57
- 'Jan',
58
- 'Feb',
59
- 'Mar',
60
- 'Apr',
61
- 'May',
62
- 'Jun',
63
- 'Jul',
64
- 'Aug',
65
- 'Sep',
66
- 'Oct',
67
- 'Nov',
68
- 'Dec',
69
- ],
70
- today: 'Today',
71
- clear: 'Clear',
72
- };
73
- // temporary storage for overlay session
74
- _overlayInitialDate = null;
75
- _overlayInitialPreset = null;
76
- _calendarObservers = [];
77
- _observedElements = [];
78
- _parentObservers = [];
79
- _observedParentElements = [];
80
- _updateRafId = null; // requestAnimationFrame id
81
- constructor(datePipe, renderer) {
82
- this.datePipe = datePipe;
83
- this.renderer = renderer;
84
- }
85
- ngOnInit() {
86
- if (!this.selectedDate && this.defaultPreset) {
87
- this.applyPreset(this.defaultPreset);
88
- }
89
- // initialize internal model
90
- this.modelDate = this.selectedDate ? [...this.selectedDate] : null;
91
- // initial class update if there is a pre-selected range
92
- this._scheduleUpdate();
93
- // start observers if inline calendar is used
94
- if (this.inline) {
95
- this._startCalendarObservers();
96
- }
97
- }
98
- ngOnChanges(changes) {
99
- if (changes['selectedDate']) {
100
- const sel = changes['selectedDate'].currentValue;
101
- if (sel && Array.isArray(sel) && sel.length === 2 && sel[0] && sel[1]) {
102
- const preset = this.detectPreset(sel[0], sel[1]);
103
- this.selectedPreset = preset ?? 'custom';
104
- // sync internal model when external value changes
105
- this.modelDate = [...sel];
106
- }
107
- else if (sel == null) {
108
- this.selectedPreset = null;
109
- this.modelDate = null;
110
- }
111
- }
112
- }
113
- onInputKeyDown(event) {
114
- if (event.key === 'Enter' || event.key === ' ') {
115
- try {
116
- this.overlayPanel?.toggle(event);
117
- }
118
- catch (e) { }
119
- event.preventDefault();
120
- }
121
- }
122
- onOverlayShow() {
123
- // store a deep copy of current selection/preset when overlay opens
124
- if (this.selectedDate && Array.isArray(this.selectedDate)) {
125
- this._overlayInitialDate = this.selectedDate.map(d => (d ? new Date(d.getFullYear(), d.getMonth(), d.getDate()) : d));
126
- }
127
- else {
128
- this._overlayInitialDate = null;
129
- }
130
- this._overlayInitialPreset = this.selectedPreset;
131
- // ensure calendar model shows the currently committed selection when opening
132
- this.modelDate = this.selectedDate ? [...this.selectedDate] : null;
133
- // ensure preset buttons reflect current selection when overlay opens
134
- if (this.selectedDate && Array.isArray(this.selectedDate) && this.selectedDate.length === 2) {
135
- const preset = this.detectPreset(this.selectedDate[0], this.selectedDate[1]);
136
- this.selectedPreset = preset ?? 'custom';
137
- }
138
- else if (!this.selectedDate) {
139
- this.selectedPreset = null;
140
- }
141
- // add start/end classes to range cells for styling
142
- this._scheduleUpdate();
143
- // observe DOM changes (PrimeNG may re-render inside overlay)
144
- this._startCalendarObservers();
145
- }
146
- onOverlayHide() {
147
- // if internal calendar model has an incomplete selection (partial range) revert to initial
148
- const model = this.modelDate;
149
- const isPartialModel = Boolean(model && Array.isArray(model) && model.length > 0 && model[0] && !model[1]);
150
- if (isPartialModel) {
151
- this.selectedDate = this._overlayInitialDate;
152
- this.selectedPreset = this._overlayInitialPreset;
153
- // reset internal model to synced value
154
- this.modelDate = this.selectedDate ? [...this.selectedDate] : null;
155
- }
156
- this._overlayInitialDate = null;
157
- this._overlayInitialPreset = null;
158
- this.customRangeMode = false;
159
- // cleanup any start/end classes to avoid stale classes
160
- this._scheduleUpdate();
161
- // stop observing
162
- this._stopCalendarObservers();
163
- }
164
- onModelChange(dateRange) {
165
- // When user clicks a first date, PrimeNG may emit an array with 1 value. We don't want to
166
- // update the external selectedDate until the range is completed (two dates) so that
167
- // the calendar does not jump back to a previously selected end date's month.
168
- this.modelDate = dateRange ? [...dateRange] : null;
169
- if (dateRange && Array.isArray(dateRange) && dateRange.length === 2 && dateRange[0] && dateRange[1]) {
170
- this.selectedPreset = this.detectPreset(dateRange[0], dateRange[1]);
171
- this.customRangeMode = false;
172
- this.selectedDate = [...dateRange];
173
- this.dateRangeChange.emit(this.selectedDate);
174
- // close overlay like when applying a preset
175
- try {
176
- this.overlayPanel?.hide();
177
- }
178
- catch (e) { }
179
- }
180
- else if (!dateRange) {
181
- // cleared selection
182
- this.selectedPreset = null;
183
- this.customRangeMode = false;
184
- this.selectedDate = null;
185
- this.dateRangeChange.emit(null);
186
- }
187
- else {
188
- // single date selecting (partial range) - do not emit change yet; just keep internal model
189
- // so the calendar's view remains where the user navigated to.
190
- this.selectedPreset = null;
191
- this.customRangeMode = false;
192
- }
193
- // update start/end classes while user is selecting or when range completes
194
- this._scheduleUpdate();
195
- }
196
- // Called when the calendar's visible month/year changes
197
- onCalendarViewChanged(event) {
198
- // Reapply classes after PrimeNG re-render
199
- this._scheduleUpdate();
200
- // Reattach observers after a small delay since PrimeNG will likely replace DOM nodes
201
- setTimeout(() => {
202
- try {
203
- this._stopCalendarObservers();
204
- this._startCalendarObservers();
205
- }
206
- catch (e) { }
207
- }, 40);
208
- }
209
- get hasSelection() {
210
- return Boolean(this.selectedDate &&
211
- Array.isArray(this.selectedDate) &&
212
- this.selectedDate.length === 2 &&
213
- !!this.selectedDate[0] &&
214
- !!this.selectedDate[1]);
215
- }
216
- normalizeDate(d) {
217
- return new Date(d.getFullYear(), d.getMonth(), d.getDate());
218
- }
219
- isSameDate(a, b) {
220
- return (a.getFullYear() === b.getFullYear() &&
221
- a.getMonth() === b.getMonth() &&
222
- a.getDate() === b.getDate());
223
- }
224
- detectPreset(startRaw, endRaw) {
225
- const start = this.normalizeDate(startRaw);
226
- const end = this.normalizeDate(endRaw);
227
- const today = this.normalizeDate(new Date());
228
- // today
229
- if (this.isSameDate(start, today) && this.isSameDate(end, today))
230
- return 'today';
231
- // yesterday
232
- const y = new Date(today);
233
- y.setDate(y.getDate() - 1);
234
- if (this.isSameDate(start, y) && this.isSameDate(end, y))
235
- return 'yesterday';
236
- // last7days (last 7 days including today: start = today - 6, end = today)
237
- const l7End = new Date(today);
238
- const l7Start = new Date(today);
239
- l7Start.setDate(today.getDate() - 6);
240
- if (this.isSameDate(start, l7Start) && this.isSameDate(end, l7End))
241
- return 'last7days';
242
- // last30days (last 30 days including today: start = today - 29, end = today)
243
- const l30End = new Date(today);
244
- const l30Start = new Date(today);
245
- l30Start.setDate(today.getDate() - 29);
246
- if (this.isSameDate(start, l30Start) && this.isSameDate(end, l30End))
247
- return 'last30days';
248
- // last3months (last 3 months including today: start = today - 3 months, end = today)
249
- const l3mEnd = new Date(today);
250
- const l3mStart = new Date(today);
251
- l3mStart.setMonth(today.getMonth() - 3);
252
- if (this.isSameDate(start, l3mStart) && this.isSameDate(end, l3mEnd))
253
- return 'last3months';
254
- // last6months (last 6 months including today: start = today - 6 months, end = today)
255
- const l6mEnd = new Date(today);
256
- const l6mStart = new Date(today);
257
- l6mStart.setMonth(today.getMonth() - 6);
258
- if (this.isSameDate(start, l6mStart) && this.isSameDate(end, l6mEnd))
259
- return 'last6months';
260
- // last1year (last 1 year including today: start = today - 1 year, end = today)
261
- const l1yEnd = new Date(today);
262
- const l1yStart = new Date(today);
263
- l1yStart.setFullYear(today.getFullYear() - 1);
264
- if (this.isSameDate(start, l1yStart) && this.isSameDate(end, l1yEnd))
265
- return 'last1year';
266
- return null;
267
- }
268
- clearDateRange() {
269
- this.selectedDate = null;
270
- this.dateRangeChange.emit(this.selectedDate);
271
- this.selectedPreset = null;
272
- this.customRangeMode = false;
273
- this.modelDate = null;
274
- }
275
- resetAndClose() {
276
- this.clearDateRange();
277
- if (this.overlayPanel) {
278
- try {
279
- this.overlayPanel.hide();
280
- }
281
- catch (e) { }
282
- }
283
- }
284
- clearAndStop(event) {
285
- this.clearDateRange();
286
- try {
287
- this.overlayPanel?.hide();
288
- }
289
- catch (e) { }
290
- event.stopPropagation();
291
- }
292
- toggleCustomRange() {
293
- this.customRangeMode = !this.customRangeMode;
294
- if (this.customRangeMode)
295
- this.selectedPreset = 'custom';
296
- }
297
- applyCustomRange() {
298
- // ensure external selectedDate is in sync with internal model
299
- this.selectedDate = this.modelDate ? [...this.modelDate] : null;
300
- this.dateRangeChange.emit(this.selectedDate);
301
- if (this.overlayPanel) {
302
- try {
303
- this.overlayPanel.hide();
304
- }
305
- catch (e) { }
306
- }
307
- this.customRangeMode = false;
308
- this.selectedPreset = 'custom';
309
- }
310
- getDateRangeLabel() {
311
- // Check the internal model first to show real-time updates while selecting
312
- const dateArray = this.modelDate || this.selectedDate;
313
- if (!dateArray || !Array.isArray(dateArray))
314
- return '';
315
- const [start, end] = dateArray;
316
- const arrow = '\u2794';
317
- // Show just the first date with an arrow if only first date is selected
318
- if (start && !end) {
319
- const startStr = this.datePipe.transform(start, 'MM/dd/yyyy');
320
- return `${startStr} ${arrow} `;
321
- }
322
- // Show the complete range if both dates are selected
323
- if (start && end) {
324
- const startStr = this.datePipe.transform(start, 'MM/dd/yyyy');
325
- const endStr = this.datePipe.transform(end, 'MM/dd/yyyy');
326
- return `${startStr} ${arrow} ${endStr}`;
327
- }
328
- return '';
329
- }
330
- applyPreset(preset) {
331
- const today = new Date();
332
- let start = null;
333
- let end = null;
334
- switch (preset) {
335
- case 'today':
336
- start = end = new Date(today.getFullYear(), today.getMonth(), today.getDate());
337
- break;
338
- case 'yesterday':
339
- const y = new Date(today);
340
- y.setDate(y.getDate() - 1);
341
- start = end = new Date(y.getFullYear(), y.getMonth(), y.getDate());
342
- break;
343
- case 'last7days': {
344
- end = new Date(today.getFullYear(), today.getMonth(), today.getDate());
345
- start = new Date(end);
346
- start.setDate(end.getDate() - 6);
347
- break;
348
- }
349
- case 'last30days': {
350
- end = new Date(today.getFullYear(), today.getMonth(), today.getDate());
351
- start = new Date(end);
352
- start.setDate(end.getDate() - 29);
353
- break;
354
- }
355
- case 'last3months': {
356
- end = new Date(today.getFullYear(), today.getMonth(), today.getDate());
357
- start = new Date(end);
358
- start.setMonth(end.getMonth() - 3);
359
- break;
360
- }
361
- case 'last6months': {
362
- end = new Date(today.getFullYear(), today.getMonth(), today.getDate());
363
- start = new Date(end);
364
- start.setMonth(end.getMonth() - 6);
365
- break;
366
- }
367
- case 'last1year': {
368
- end = new Date(today.getFullYear(), today.getMonth(), today.getDate());
369
- start = new Date(end);
370
- start.setFullYear(end.getFullYear() - 1);
371
- break;
372
- }
373
- default:
374
- break;
375
- }
376
- if (start && end) {
377
- this.selectedDate = [start, end];
378
- this.modelDate = [start, end];
379
- if (this.preservePreset) {
380
- this.selectedDate = [start, end, { presets: preset }];
381
- }
382
- this.dateRangeChange.emit(this.selectedDate);
383
- this.selectedPreset = preset;
384
- this.customRangeMode = false;
385
- }
386
- try {
387
- this.overlayPanel?.hide();
388
- }
389
- catch (e) { }
390
- // ensure we update start/end classes after applying a preset
391
- this._scheduleUpdate();
392
- }
393
- onDateRangeChange(dateRange) {
394
- this.dateRangeChange.emit(dateRange);
395
- if (dateRange && Array.isArray(dateRange)) {
396
- this.selectedPreset = this.detectPreset(dateRange[0], dateRange[1]);
397
- this.customRangeMode = false;
398
- }
399
- else if (!dateRange) {
400
- this.selectedPreset = null;
401
- this.customRangeMode = false;
402
- }
403
- this._scheduleUpdate();
404
- }
405
- ngOnDestroy() {
406
- this._stopCalendarObservers();
407
- this._cancelScheduledUpdate();
408
- }
409
- // Walk the rendered calendar DOM(s) (overlay + inline) and add start-range/end-range classes
410
- _updateStartEndRangeClasses() {
411
- try {
412
- const calendarElements = this._getCalendarElements();
413
- calendarElements.forEach((calEl) => {
414
- // Remove existing classes from spans first
415
- const allSpans = calEl.querySelectorAll('td > span');
416
- allSpans.forEach((span) => {
417
- this.renderer.removeClass(span, 'start-range');
418
- this.renderer.removeClass(span, 'end-range');
419
- this.renderer.removeClass(span, 'between-range');
420
- });
421
- // Collect span/date pairs, prefer data-date attribute
422
- // Cache header month/year for this calendar to avoid querying per-span
423
- const panelNode = calEl.closest('.p-datepicker') || calEl;
424
- const headerMonthNode = panelNode.querySelector('.p-datepicker-header .p-datepicker-title .p-datepicker-month');
425
- const headerYearNode = panelNode.querySelector('.p-datepicker-header .p-datepicker-title .p-datepicker-year');
426
- const headerMonthIdx = headerMonthNode && headerMonthNode.textContent ? (this.enLocale.monthNames || []).indexOf(headerMonthNode.textContent.trim()) : NaN;
427
- const headerYearVal = headerYearNode && headerYearNode.textContent ? parseInt(headerYearNode.textContent.trim(), 10) : NaN;
428
- const items = [];
429
- const spans = calEl.querySelectorAll('td > span.p-highlight');
430
- spans.forEach((span) => {
431
- const td = span.closest('td');
432
- // Try to read data-date attribute, which some PrimeNG versions render on span/td
433
- let dataDate = span.getAttribute('data-date');
434
- if (!dataDate && td)
435
- dataDate = td.getAttribute('data-date');
436
- if (dataDate) {
437
- const parts = dataDate.split('-').map((p) => parseInt(p, 10));
438
- if (parts.length >= 3 && parts.every((n) => !isNaN(n))) {
439
- const [y, m, d] = parts;
440
- const dt = new Date(y, m - 1, d);
441
- items.push({ dt, td, span });
442
- return;
443
- }
444
- }
445
- // Fallback: parse day number and infer month/year from nearby header in the same .p-datepicker
446
- const dayText = (span.textContent || '').trim();
447
- const day = parseInt(dayText, 10);
448
- if (!isNaN(day) && td) {
449
- // Use cached header month/year when available
450
- if (!isNaN(headerMonthIdx) && !isNaN(headerYearVal)) {
451
- const dt = new Date(headerYearVal, headerMonthIdx, day);
452
- items.push({ dt, td, span });
453
- return;
454
- }
455
- }
456
- // last resort: ignore span if date cannot be determined
457
- });
458
- if (items.length === 0)
459
- return;
460
- // Sort items to find min/max (start & end)
461
- items.sort((a, b) => a.dt.getTime() - b.dt.getTime());
462
- const detectedStart = items[0].dt;
463
- const detectedEnd = items[items.length - 1].dt;
464
- // Preferred range is modelDate/selectedDate if present
465
- const range = (this.selectedDate && this.selectedDate.length === 2) ? this.selectedDate : (this.modelDate && this.modelDate.length === 2 ? this.modelDate : [detectedStart, detectedEnd]);
466
- const startDate = range && range[0] ? this.normalizeDate(range[0]) : detectedStart;
467
- const endDate = range && range[1] ? this.normalizeDate(range[1]) : detectedEnd;
468
- // For each item, add start-range,end-range, or between-range based on date
469
- const sTime = startDate.getTime();
470
- const eTime = endDate.getTime();
471
- for (const it of items) {
472
- const t = it.dt.getTime();
473
- if (sTime === eTime && t === sTime) {
474
- // single-day range, mark both start & end
475
- this.renderer.addClass(it.span, 'start-range');
476
- this.renderer.addClass(it.span, 'end-range');
477
- }
478
- else if (t === sTime) {
479
- this.renderer.addClass(it.span, 'start-range');
480
- }
481
- else if (t === eTime) {
482
- this.renderer.addClass(it.span, 'end-range');
483
- }
484
- else if (t > sTime && t < eTime) {
485
- this.renderer.addClass(it.span, 'between-range');
486
- }
487
- }
488
- });
489
- }
490
- catch (e) {
491
- // ignore DOM errors (e.g., server-side rendering / missing elements)
492
- }
493
- }
494
- isoDate(d) {
495
- const y = d.getFullYear();
496
- const m = String(d.getMonth() + 1).padStart(2, '0');
497
- const day = String(d.getDate()).padStart(2, '0');
498
- return `${y}-${m}-${day}`;
499
- }
500
- _findElementByDate(date) {
501
- if (!date)
502
- return undefined;
503
- const y = date.getFullYear();
504
- const m = date.getMonth() + 1; // 1..12
505
- const d = date.getDate();
506
- const isoUnpadded = `${y}-${m}-${d}`; // e.g. 2025-11-1
507
- const isoPadded = `${y}-${String(m).padStart(2, '0')}-${String(d).padStart(2, '0')}`; // 2025-11-01
508
- const selectors = [`[data-date="${isoUnpadded}"]`, `[data-date="${isoPadded}"]`];
509
- for (const sel of selectors) {
510
- const foundInOverlay = document.querySelector(`.atomix-overlay-calendar ${sel}`);
511
- if (foundInOverlay)
512
- return foundInOverlay.closest('td') || foundInOverlay;
513
- }
514
- for (const sel of selectors) {
515
- const found = document.querySelector(sel);
516
- if (found)
517
- return found.closest('td') || found;
518
- }
519
- return undefined;
520
- }
521
- _startCalendarObservers() {
522
- // stop first to avoid duplicates
523
- this._stopCalendarObservers();
524
- try {
525
- const calEls = this._getCalendarElements();
526
- try {
527
- const panel = this.overlayPanel;
528
- if (panel && panel.el && panel.el.nativeElement) {
529
- const el = panel.el.nativeElement.querySelector('.p-datepicker');
530
- if (el)
531
- calEls.push(el);
532
- }
533
- }
534
- catch (e) { }
535
- calEls.forEach((el) => {
536
- const obs = new MutationObserver(() => {
537
- // Reapply classes after DOM changes (debounced)
538
- this._scheduleUpdate();
539
- });
540
- // Watch childList, subtree and class attribute changes (span class toggles are common)
541
- obs.observe(el, { childList: true, subtree: true, attributes: true, attributeFilter: ['class'] });
542
- this._calendarObservers.push(obs);
543
- this._observedElements.push(el);
544
- // Also observe parent - if PrimeNG replaces the .p-datepicker element, parent childList changes will fire
545
- const parent = el.parentElement;
546
- if (parent && this._observedParentElements.indexOf(parent) === -1) {
547
- const parentObs = new MutationObserver(() => {
548
- // reattach observers since the calEl may have been replaced
549
- this._scheduleUpdate();
550
- // detach and re-attach observers after DOM settles
551
- setTimeout(() => {
552
- try {
553
- this._stopCalendarObservers();
554
- this._startCalendarObservers();
555
- }
556
- catch (e) { }
557
- }, 100); // slightly larger delay to let PrimeNG finish the month rendering
558
- });
559
- parentObs.observe(parent, { childList: true, subtree: false });
560
- this._parentObservers.push(parentObs);
561
- this._observedParentElements.push(parent);
562
- }
563
- });
564
- }
565
- catch (e) {
566
- // ignore
567
- }
568
- }
569
- _stopCalendarObservers() {
570
- try {
571
- this._calendarObservers.forEach((obs) => obs.disconnect());
572
- this._parentObservers.forEach((obs) => obs.disconnect());
573
- }
574
- catch (e) { }
575
- this._calendarObservers = [];
576
- this._observedElements = [];
577
- this._parentObservers = [];
578
- this._observedParentElements = [];
579
- }
580
- _scheduleUpdate() {
581
- if (this._updateRafId != null)
582
- return; // already scheduled
583
- this._updateRafId = window.requestAnimationFrame(() => {
584
- this._updateRafId = null;
585
- this._updateStartEndRangeClasses();
586
- });
587
- }
588
- _cancelScheduledUpdate() {
589
- if (this._updateRafId != null) {
590
- window.cancelAnimationFrame(this._updateRafId);
591
- this._updateRafId = null;
592
- }
593
- }
594
- _getCalendarElements() {
595
- const calEls = [];
596
- const overlayCal = document.querySelector('.atomix-overlay-calendar .p-datepicker');
597
- const inlineCal = document.querySelector('.inline-calendar .p-datepicker');
598
- if (overlayCal)
599
- calEls.push(overlayCal);
600
- if (inlineCal)
601
- calEls.push(inlineCal);
602
- try {
603
- const panel = this.overlayPanel;
604
- if (panel && panel.el && panel.el.nativeElement) {
605
- const el = panel.el.nativeElement.querySelector('.p-datepicker');
606
- if (el)
607
- calEls.push(el);
608
- }
609
- }
610
- catch (e) { }
611
- // remove duplicates
612
- return Array.from(new Set(calEls));
613
- }
614
- 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 });
615
- 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" }, outputs: { 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 class=\"pi pi-calendar input-icon\" title=\"Open calendar\" (click)=\"!disabled && overlayPanel?.toggle($event)\"></i>\n <i *ngIf=\"hasSelection\" class=\"pi pi-times input-clear-icon\" title=\"Clear\" tabindex=\"0\" (click)=\"!disabled && clearAndStop($event)\" (keydown.enter)=\"!disabled && clearAndStop($event)\" (keydown.space)=\"!disabled && clearAndStop($event)\"></i>\n\n </div>\n\n <p-overlayPanel #overlayPanel [dismissable]=\"true\" appendTo=\"body\" styleClass=\"atomix-date-range-overlay\" (onShow)=\"onOverlayShow()\" (onHide)=\"onOverlayHide()\">\n <div class=\"overlay-inner\">\n <div class=\"overlay-left\">\n <div class=\"preset-list\">\n <button pButton pRipple type=\"button\" class=\"preset-btn\" (click)=\"applyPreset('today')\" [ngClass]=\"{ 'active': selectedPreset === 'today' }\" label=\"Today\"></button>\n <button pButton pRipple type=\"button\" class=\"preset-btn\" (click)=\"applyPreset('yesterday')\" [ngClass]=\"{ 'active': selectedPreset === 'yesterday' }\" label=\"Yesterday\"></button>\n <button pButton pRipple type=\"button\" class=\"preset-btn\" (click)=\"applyPreset('last7days')\" [ngClass]=\"{ 'active': selectedPreset === 'last7days' }\" label=\"Last 7 days\"></button>\n <button pButton pRipple type=\"button\" class=\"preset-btn\" (click)=\"applyPreset('last30days')\" [ngClass]=\"{ 'active': selectedPreset === 'last30days' }\" label=\"Last 30 days\"></button>\n <button pButton pRipple type=\"button\" class=\"preset-btn\" (click)=\"applyPreset('last3months')\" [ngClass]=\"{ 'active': selectedPreset === 'last3months' }\" label=\"Last 3 months\"></button>\n <button pButton pRipple type=\"button\" class=\"preset-btn\" (click)=\"applyPreset('last6months')\" [ngClass]=\"{ 'active': selectedPreset === 'last6months' }\" label=\"Last 6 months\"></button>\n <button pButton pRipple type=\"button\" class=\"preset-btn\" (click)=\"applyPreset('last1year')\" [ngClass]=\"{ 'active': selectedPreset === 'last1year' }\" label=\"Last 1 year\"></button>\n <a class=\"reset-link\" (click)=\"resetAndClose()\">Reset</a>\n </div>\n </div>\n <div class=\"overlay-right\">\n <p-calendar [(ngModel)]=\"modelDate\" [selectionMode]=\"'range'\" [inline]=\"true\" [dateFormat]=\"'mm/dd/yyyy'\" [showOtherMonths]=\"true\" [locale]=\"enLocale\" [showIcon]=\"false\" [styleClass]=\"'atomix-overlay-calendar'\" (ngModelChange)=\"onModelChange($event)\" (onMonthChange)=\"onCalendarViewChanged($event)\" (onYearChange)=\"onCalendarViewChanged($event)\" [disabled]=\"disabled\" [maxDate]=\"maxDate\" [minDate]=\"minDate\"></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 *ngIf=\"hasSelection\" class=\"pi pi-times input-clear-icon\" title=\"Clear\" tabindex=\"0\" (click)=\"clearAndStop($event)\" (keydown.enter)=\"clearAndStop($event)\" (keydown.space)=\"clearAndStop($event)\"></i>\n </div>\n <div class=\"overlay-inner inline-calendar flex\">\n <div class=\"overlay-left\">\n <div class=\"preset-list\">\n <button pButton pRipple type=\"button\" class=\"preset-btn\" (click)=\"applyPreset('today')\" [ngClass]=\"{ 'active': selectedPreset === 'today' }\" label=\"Today\"></button>\n <button pButton pRipple type=\"button\" class=\"preset-btn\" (click)=\"applyPreset('yesterday')\" [ngClass]=\"{ 'active': selectedPreset === 'yesterday' }\" label=\"Yesterday\"></button>\n <button pButton pRipple type=\"button\" class=\"preset-btn\" (click)=\"applyPreset('last7days')\" [ngClass]=\"{ 'active': selectedPreset === 'last7days' }\" label=\"Last 7 days\"></button>\n <button pButton pRipple type=\"button\" class=\"preset-btn\" (click)=\"applyPreset('last30days')\" [ngClass]=\"{ 'active': selectedPreset === 'last30days' }\" label=\"Last 30 days\"></button>\n <button pButton pRipple type=\"button\" class=\"preset-btn\" (click)=\"applyPreset('last3months')\" [ngClass]=\"{ 'active': selectedPreset === 'last3months' }\" label=\"Last 3 months\"></button>\n <button pButton pRipple type=\"button\" class=\"preset-btn\" (click)=\"applyPreset('last1year')\" [ngClass]=\"{ 'active': selectedPreset === 'last1year' }\" label=\"Last 1 year\"></button>\n <a class=\"reset-link\" (click)=\"resetAndClose()\">Reset</a>\n </div>\n </div>\n <div class=\"overlay-right\">\n <p-calendar [(ngModel)]=\"modelDate\" [selectionMode]=\"'range'\" [inline]=\"true\" [dateFormat]=\"'mm/dd/yyyy'\" [showOtherMonths]=\"true\" [locale]=\"enLocale\" [showIcon]=\"false\" [styleClass]=\"'atomix-overlay-calendar'\" (ngModelChange)=\"onModelChange($event)\" (onMonthChange)=\"onCalendarViewChanged($event)\" (onYearChange)=\"onCalendarViewChanged($event)\" [disabled]=\"disabled\" [maxDate]=\"maxDate\" [minDate]=\"minDate\"></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)}.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:12px}.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.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"] }] });
616
- }
617
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AtomixDaterangeCalendarComponent, decorators: [{
618
- type: Component,
619
- 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 class=\"pi pi-calendar input-icon\" title=\"Open calendar\" (click)=\"!disabled && overlayPanel?.toggle($event)\"></i>\n <i *ngIf=\"hasSelection\" class=\"pi pi-times input-clear-icon\" title=\"Clear\" tabindex=\"0\" (click)=\"!disabled && clearAndStop($event)\" (keydown.enter)=\"!disabled && clearAndStop($event)\" (keydown.space)=\"!disabled && clearAndStop($event)\"></i>\n\n </div>\n\n <p-overlayPanel #overlayPanel [dismissable]=\"true\" appendTo=\"body\" styleClass=\"atomix-date-range-overlay\" (onShow)=\"onOverlayShow()\" (onHide)=\"onOverlayHide()\">\n <div class=\"overlay-inner\">\n <div class=\"overlay-left\">\n <div class=\"preset-list\">\n <button pButton pRipple type=\"button\" class=\"preset-btn\" (click)=\"applyPreset('today')\" [ngClass]=\"{ 'active': selectedPreset === 'today' }\" label=\"Today\"></button>\n <button pButton pRipple type=\"button\" class=\"preset-btn\" (click)=\"applyPreset('yesterday')\" [ngClass]=\"{ 'active': selectedPreset === 'yesterday' }\" label=\"Yesterday\"></button>\n <button pButton pRipple type=\"button\" class=\"preset-btn\" (click)=\"applyPreset('last7days')\" [ngClass]=\"{ 'active': selectedPreset === 'last7days' }\" label=\"Last 7 days\"></button>\n <button pButton pRipple type=\"button\" class=\"preset-btn\" (click)=\"applyPreset('last30days')\" [ngClass]=\"{ 'active': selectedPreset === 'last30days' }\" label=\"Last 30 days\"></button>\n <button pButton pRipple type=\"button\" class=\"preset-btn\" (click)=\"applyPreset('last3months')\" [ngClass]=\"{ 'active': selectedPreset === 'last3months' }\" label=\"Last 3 months\"></button>\n <button pButton pRipple type=\"button\" class=\"preset-btn\" (click)=\"applyPreset('last6months')\" [ngClass]=\"{ 'active': selectedPreset === 'last6months' }\" label=\"Last 6 months\"></button>\n <button pButton pRipple type=\"button\" class=\"preset-btn\" (click)=\"applyPreset('last1year')\" [ngClass]=\"{ 'active': selectedPreset === 'last1year' }\" label=\"Last 1 year\"></button>\n <a class=\"reset-link\" (click)=\"resetAndClose()\">Reset</a>\n </div>\n </div>\n <div class=\"overlay-right\">\n <p-calendar [(ngModel)]=\"modelDate\" [selectionMode]=\"'range'\" [inline]=\"true\" [dateFormat]=\"'mm/dd/yyyy'\" [showOtherMonths]=\"true\" [locale]=\"enLocale\" [showIcon]=\"false\" [styleClass]=\"'atomix-overlay-calendar'\" (ngModelChange)=\"onModelChange($event)\" (onMonthChange)=\"onCalendarViewChanged($event)\" (onYearChange)=\"onCalendarViewChanged($event)\" [disabled]=\"disabled\" [maxDate]=\"maxDate\" [minDate]=\"minDate\"></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 *ngIf=\"hasSelection\" class=\"pi pi-times input-clear-icon\" title=\"Clear\" tabindex=\"0\" (click)=\"clearAndStop($event)\" (keydown.enter)=\"clearAndStop($event)\" (keydown.space)=\"clearAndStop($event)\"></i>\n </div>\n <div class=\"overlay-inner inline-calendar flex\">\n <div class=\"overlay-left\">\n <div class=\"preset-list\">\n <button pButton pRipple type=\"button\" class=\"preset-btn\" (click)=\"applyPreset('today')\" [ngClass]=\"{ 'active': selectedPreset === 'today' }\" label=\"Today\"></button>\n <button pButton pRipple type=\"button\" class=\"preset-btn\" (click)=\"applyPreset('yesterday')\" [ngClass]=\"{ 'active': selectedPreset === 'yesterday' }\" label=\"Yesterday\"></button>\n <button pButton pRipple type=\"button\" class=\"preset-btn\" (click)=\"applyPreset('last7days')\" [ngClass]=\"{ 'active': selectedPreset === 'last7days' }\" label=\"Last 7 days\"></button>\n <button pButton pRipple type=\"button\" class=\"preset-btn\" (click)=\"applyPreset('last30days')\" [ngClass]=\"{ 'active': selectedPreset === 'last30days' }\" label=\"Last 30 days\"></button>\n <button pButton pRipple type=\"button\" class=\"preset-btn\" (click)=\"applyPreset('last3months')\" [ngClass]=\"{ 'active': selectedPreset === 'last3months' }\" label=\"Last 3 months\"></button>\n <button pButton pRipple type=\"button\" class=\"preset-btn\" (click)=\"applyPreset('last1year')\" [ngClass]=\"{ 'active': selectedPreset === 'last1year' }\" label=\"Last 1 year\"></button>\n <a class=\"reset-link\" (click)=\"resetAndClose()\">Reset</a>\n </div>\n </div>\n <div class=\"overlay-right\">\n <p-calendar [(ngModel)]=\"modelDate\" [selectionMode]=\"'range'\" [inline]=\"true\" [dateFormat]=\"'mm/dd/yyyy'\" [showOtherMonths]=\"true\" [locale]=\"enLocale\" [showIcon]=\"false\" [styleClass]=\"'atomix-overlay-calendar'\" (ngModelChange)=\"onModelChange($event)\" (onMonthChange)=\"onCalendarViewChanged($event)\" (onYearChange)=\"onCalendarViewChanged($event)\" [disabled]=\"disabled\" [maxDate]=\"maxDate\" [minDate]=\"minDate\"></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)}.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:12px}.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"] }]
620
- }], ctorParameters: () => [{ type: i1.DatePipe }, { type: i0.Renderer2 }], propDecorators: { placeholder: [{
621
- type: Input
622
- }], styleClass: [{
623
- type: Input
624
- }], selectionMode: [{
625
- type: Input
626
- }], inputStyleClass: [{
627
- type: Input
628
- }], inline: [{
629
- type: Input
630
- }], disabled: [{
631
- type: Input
632
- }], selectedDate: [{
633
- type: Input
634
- }], maxDate: [{
635
- type: Input
636
- }], minDate: [{
637
- type: Input
638
- }], defaultPreset: [{
639
- type: Input
640
- }], preservePreset: [{
641
- type: Input
642
- }], overlayPanel: [{
643
- type: ViewChild,
644
- args: ['overlayPanel']
645
- }], dateRangeChange: [{
646
- type: Output
647
- }] } });
648
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXRvbWl4LWRhdGVyYW5nZS1jYWxlbmRhci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9wcmltZWtpdC9zcmMvbGliL2xpYi9hdG9taXgtZGF0ZXJhbmdlLWNhbGVuZGFyL2F0b21peC1kYXRlcmFuZ2UtY2FsZW5kYXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcHJpbWVraXQvc3JjL2xpYi9saWIvYXRvbWl4LWRhdGVyYW5nZS1jYWxlbmRhci9hdG9taXgtZGF0ZXJhbmdlLWNhbGVuZGFyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUEwRCxNQUFNLGVBQWUsQ0FBQzs7Ozs7Ozs7QUFTMUksTUFBTSxPQUFPLGdDQUFnQztJQTJFdkI7SUFBNEI7SUExRXZDLFdBQVcsR0FBVyxFQUFFLENBQUM7SUFDekIsVUFBVSxHQUFXLEVBQUUsQ0FBQztJQUN4QixhQUFhLEdBQVksT0FBTyxDQUFDO0lBQ2pDLGVBQWUsR0FBVyxFQUFFLENBQUM7SUFDN0IsTUFBTSxHQUFZLEtBQUssQ0FBQztJQUN4QixRQUFRLEdBQVksS0FBSyxDQUFDO0lBQzFCLFlBQVksR0FBUSxJQUFJLENBQUM7SUFDekIsT0FBTyxDQUFRO0lBQ2YsT0FBTyxDQUFRO0lBQ2YsYUFBYSxHQUE0RyxJQUFJLENBQUM7SUFDOUgsY0FBYyxHQUFZLEtBQUssQ0FBQztJQUV6QyxlQUFlLEdBQVksS0FBSyxDQUFDO0lBQ2pDLGNBQWMsR0FBa0IsSUFBSSxDQUFDLENBQUMscUhBQXFIO0lBQ2hJLFlBQVksQ0FBZ0I7SUFDN0MsZUFBZSxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7SUFFcEQsdUdBQXVHO0lBQ3ZHLFNBQVMsR0FBa0IsSUFBSSxDQUFDO0lBRWhDLFFBQVEsR0FBRztRQUNULGNBQWMsRUFBRSxDQUFDO1FBQ2pCLFFBQVEsRUFBRTtZQUNSLFFBQVE7WUFDUixRQUFRO1lBQ1IsU0FBUztZQUNULFdBQVc7WUFDWCxVQUFVO1lBQ1YsUUFBUTtZQUNSLFVBQVU7U0FDWDtRQUNELGFBQWEsRUFBRSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQztRQUNoRSxXQUFXLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUM7UUFDdkQsVUFBVSxFQUFFO1lBQ1YsU0FBUztZQUNULFVBQVU7WUFDVixPQUFPO1lBQ1AsT0FBTztZQUNQLEtBQUs7WUFDTCxNQUFNO1lBQ04sTUFBTTtZQUNOLFFBQVE7WUFDUixXQUFXO1lBQ1gsU0FBUztZQUNULFVBQVU7WUFDVixVQUFVO1NBQ1g7UUFDRCxlQUFlLEVBQUU7WUFDZixLQUFLO1lBQ0wsS0FBSztZQUNMLEtBQUs7WUFDTCxLQUFLO1lBQ0wsS0FBSztZQUNMLEtBQUs7WUFDTCxLQUFLO1lBQ0wsS0FBSztZQUNMLEtBQUs7WUFDTCxLQUFLO1lBQ0wsS0FBSztZQUNMLEtBQUs7U0FDTjtRQUNELEtBQUssRUFBRSxPQUFPO1FBQ2QsS0FBSyxFQUFFLE9BQU87S0FDZixDQUFDO0lBRUYsd0NBQXdDO0lBQ2hDLG1CQUFtQixHQUFrQixJQUFJLENBQUM7SUFDMUMscUJBQXFCLEdBQWtCLElBQUksQ0FBQztJQUM1QyxrQkFBa0IsR0FBdUIsRUFBRSxDQUFDO0lBQzVDLGlCQUFpQixHQUFjLEVBQUUsQ0FBQztJQUNsQyxnQkFBZ0IsR0FBdUIsRUFBRSxDQUFDO0lBQzFDLHVCQUF1QixHQUFjLEVBQUUsQ0FBQztJQUN4QyxZQUFZLEdBQWtCLElBQUksQ0FBQyxDQUFDLDJCQUEyQjtJQUV2RSxZQUFvQixRQUFrQixFQUFVLFFBQW1CO1FBQS9DLGFBQVEsR0FBUixRQUFRLENBQVU7UUFBVSxhQUFRLEdBQVIsUUFBUSxDQUFXO0lBQUcsQ0FBQztJQUV2RSxRQUFRO1FBQ04sSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQzdDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3ZDLENBQUM7UUFDRCw0QkFBNEI7UUFDNUIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDbkUsd0RBQXdEO1FBQ3hELElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN2Qiw2Q0FBNkM7UUFDN0MsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDaEIsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7UUFDakMsQ0FBQztJQUNILENBQUM7SUFFRCxXQUFXLENBQUMsT0FBc0I7UUFDaEMsSUFBSSxPQUFPLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQztZQUM1QixNQUFNLEdBQUcsR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsWUFBNkIsQ0FBQztZQUNsRSxJQUFJLEdBQUcsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDcEUsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2pELElBQUksQ0FBQyxjQUFjLEdBQUcsTUFBTSxJQUFJLFFBQVEsQ0FBQztnQkFDM0Msa0RBQWtEO2dCQUNsRCxJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztZQUM1QixDQUFDO2lCQUFNLElBQUksR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO2dCQUN2QixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztnQkFDM0IsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7WUFDeEIsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsY0FBYyxDQUFDLEtBQW9CO1FBQ2pDLElBQUksS0FBSyxDQUFDLEdBQUcsS0FBSyxPQUFPLElBQUksS0FBSyxDQUFDLEdBQUcsS0FBSyxHQUFHLEVBQUUsQ0FBQztZQUMvQyxJQUFJLENBQUM7Z0JBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxNQUFNLENBQUMsS0FBWSxDQUFDLENBQUM7WUFBQyxDQUFDO1lBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFBLENBQUM7WUFDN0QsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3pCLENBQUM7SUFDSCxDQUFDO0lBRUEsYUFBYTtRQUNWLG1FQUFtRTtRQUNuRSxJQUFJLElBQUksQ0FBQyxZQUFZLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztZQUMxRCxJQUFJLENBQUMsbUJBQW1CLEdBQUksSUFBSSxDQUFDLFlBQXVCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEksQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDO1FBQ2xDLENBQUM7UUFDRCxJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQztRQUNqRCw2RUFBNkU7UUFDN0UsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDbkUscUVBQXFFO1FBQ3JFLElBQUksSUFBSSxDQUFDLFlBQVksSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUMxRixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzdFLElBQUksQ0FBQyxjQUFjLEdBQUcsTUFBTSxJQUFJLFFBQVEsQ0FBQztRQUM3QyxDQUFDO2FBQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUM5QixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztRQUM3QixDQUFDO1FBQ0QsbURBQW1EO1FBQ25ELElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN2Qiw2REFBNkQ7UUFDN0QsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7SUFDbkMsQ0FBQztJQUVELGFBQWE7UUFDWCwyRkFBMkY7UUFDM0YsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUM3QixNQUFNLGNBQWMsR0FBRyxPQUFPLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDM0csSUFBSSxjQUFjLEVBQUUsQ0FBQztZQUNuQixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQztZQUM3QyxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQztZQUNqRCx1Q0FBdUM7WUFDdkMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDckUsQ0FBQztRQUNELElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUM7UUFDaEMsSUFBSSxDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQztRQUNsQyxJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQztRQUMvQix1REFBdUQ7UUFDdkQsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3JCLGlCQUFpQjtRQUNqQixJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztJQUNoQyxDQUFDO0lBRUQsYUFBYSxDQUFDLFNBQXdCO1FBQ3BDLDBGQUEwRjtRQUMxRixvRkFBb0Y7UUFDcEYsNkVBQTZFO1FBQzdFLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUNuRCxJQUFJLFNBQVMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNsRyxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BFLElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO1lBQy9CLElBQUksQ0FBQyxZQUFZLEdBQUcsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDO1lBQ25DLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUM3Qyw0Q0FBNEM7WUFDNUMsSUFBSSxDQUFDO2dCQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsSUFBSSxFQUFFLENBQUM7WUFBQyxDQUFDO1lBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFBLENBQUM7UUFDakQsQ0FBQzthQUFNLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUN0QixvQkFBb0I7WUFDcEIsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7WUFDM0IsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUM7WUFDN0IsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7WUFDekIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbEMsQ0FBQzthQUFNLENBQUM7WUFDTiwyRkFBMkY7WUFDM0YsOERBQThEO1lBQzlELElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO1lBQzNCLElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO1FBQy9CLENBQUM7UUFDRCwyRUFBMkU7UUFDM0UsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFRCx3REFBd0Q7SUFDeEQscUJBQXFCLENBQUMsS0FBVztRQUMvQiwwQ0FBMEM7UUFDMUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3ZCLHFGQUFxRjtRQUNyRixVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ2QsSUFBSSxDQUFDO2dCQUNILElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO2dCQUM5QixJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztZQUNqQyxDQUFDO1lBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDakIsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ1QsQ0FBQztJQUVELElBQUksWUFBWTtRQUNkLE9BQU8sT0FBTyxDQUNaLElBQUksQ0FBQyxZQUFZO1lBQ2YsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDO1lBQy9CLElBQUksQ0FBQyxZQUF1QixDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQzFDLENBQUMsQ0FBRSxJQUFJLENBQUMsWUFBdUIsQ0FBQyxDQUFDLENBQUM7WUFDbEMsQ0FBQyxDQUFFLElBQUksQ0FBQyxZQUF1QixDQUFDLENBQUMsQ0FBQyxDQUNyQyxDQUFDO0lBQ0osQ0FBQztJQUVPLGFBQWEsQ0FBQyxDQUFPO1FBQzNCLE9BQU8sSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBRU8sVUFBVSxDQUFDLENBQU8sRUFBRSxDQUFPO1FBQ2pDLE9BQU8sQ0FDTCxDQUFDLENBQUMsV0FBVyxFQUFFLEtBQUssQ0FBQyxDQUFDLFdBQVcsRUFBRTtZQUNuQyxDQUFDLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDLFFBQVEsRUFBRTtZQUM3QixDQUFDLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUM1QixDQUFDO0lBQ0osQ0FBQztJQUVPLFlBQVksQ0FBQyxRQUFjLEVBQUUsTUFBWTtRQUMvQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzNDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdkMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUM7UUFDN0MsUUFBUTtRQUNSLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDO1lBQUUsT0FBTyxPQUFPLENBQUM7UUFDakYsWUFBWTtRQUNaLE1BQU0sQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzFCLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzNCLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBQUUsT0FBTyxXQUFXLENBQUM7UUFDN0UsMEVBQTBFO1FBQzFFLE1BQU0sS0FBSyxHQUFHLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlCLE1BQU0sT0FBTyxHQUFHLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2hDLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3JDLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDO1lBQUUsT0FBTyxXQUFXLENBQUM7UUFDdkYsNkVBQTZFO1FBQzdFLE1BQU0sTUFBTSxHQUFHLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQy9CLE1BQU0sUUFBUSxHQUFHLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pDLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZDLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDO1lBQUUsT0FBTyxZQUFZLENBQUM7UUFDMUYscUZBQXFGO1FBQ3JGLE1BQU0sTUFBTSxHQUFHLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQy9CLE1BQU0sUUFBUSxHQUFHLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pDLFFBQVEsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3hDLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDO1lBQUUsT0FBTyxhQUFhLENBQUM7UUFDM0YscUZBQXFGO1FBQ3JGLE1BQU0sTUFBTSxHQUFHLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQy9CLE1BQU0sUUFBUSxHQUFHLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pDLFFBQVEsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3hDLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDO1lBQUUsT0FBTyxhQUFhLENBQUM7UUFDM0YsK0VBQStFO1FBQy9FLE1BQU0sTUFBTSxHQUFHLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQy9CLE1BQU0sUUFBUSxHQUFHLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pDLFFBQVEsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzlDLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDO1lBQUUsT0FBTyxXQUFXLENBQUM7UUFDekYsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsY0FBYztRQUNaLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUM3QyxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztRQUMzQixJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQztRQUM3QixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztJQUN4QixDQUFDO0lBRUQsYUFBYTtRQUNYLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN0QixJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN0QixJQUFJLENBQUM7Z0JBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUFDLENBQUM7WUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUEsQ0FBQztRQUNoRCxDQUFDO0lBQ0gsQ0FBQztJQUVELFlBQVksQ0FBQyxLQUFZO1FBQ3ZCLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUM7WUFBQyxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksRUFBRSxDQUFDO1FBQUMsQ0FBQztRQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQSxDQUFDO1FBQy9DLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRUQsaUJBQWlCO1FBQ2YsSUFBSSxDQUFDLGVBQWUsR0FBRyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUM7UUFDN0MsSUFBSSxJQUFJLENBQUMsZUFBZTtZQUFFLElBQUksQ0FBQyxjQUFjLEdBQUcsUUFBUSxDQUFDO0lBQzNELENBQUM7SUFFRCxnQkFBZ0I7UUFDZCw4REFBOEQ7UUFDOUQsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDaEUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzdDLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3RCLElBQUksQ0FBQztnQkFBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQUMsQ0FBQztZQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQSxDQUFDO1FBQ2hELENBQUM7UUFDRCxJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQztRQUM3QixJQUFJLENBQUMsY0FBYyxHQUFHLFFBQVEsQ0FBQztJQUNqQyxDQUFDO0lBRUMsaUJBQWlCO1FBQ2pCLDJFQUEyRTtRQUMzRSxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUM7UUFDdEQsSUFBSSxDQUFDLFNBQVMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDO1lBQUUsT0FBTyxFQUFFLENBQUM7UUFFdkQsTUFBTSxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsR0FBRyxTQUE0QixDQUFDO1FBQzFDLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQztRQUUvQix3RUFBd0U7UUFDeEUsSUFBSSxLQUFLLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNsQixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsWUFBWSxDQUFDLENBQUM7WUFDOUQsT0FBTyxHQUFHLFFBQVEsSUFBSSxLQUFLLEdBQUcsQ0FBQztRQUNqQyxDQUFDO1FBRUQscURBQXFEO1FBQ3JELElBQUksS0FBSyxJQUFJLEdBQUcsRUFBRSxDQUFDO1lBQ2pCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxZQUFZLENBQUMsQ0FBQztZQUM5RCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsWUFBWSxDQUFDLENBQUM7WUFDMUQsT0FBTyxHQUFHLFFBQVEsSUFBSSxLQUFLLElBQUksTUFBTSxFQUFFLENBQUM7UUFDMUMsQ0FBQztRQUVELE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVELFdBQVcsQ0FBQyxNQUE0RjtRQUN0RyxNQUFNLEtBQUssR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ3pCLElBQUksS0FBSyxHQUFnQixJQUFJLENBQUM7UUFDOUIsSUFBSSxHQUFHLEdBQWdCLElBQUksQ0FBQztRQUM1QixRQUFRLE1BQU0sRUFBRSxDQUFDO1lBQ2YsS0FBSyxPQUFPO2dCQUNWLEtBQUssR0FBRyxHQUFHLEdBQUcsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxFQUFFLEtBQUssQ0FBQyxRQUFRLEVBQUUsRUFBRSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztnQkFDL0UsTUFBTTtZQUNSLEtBQUssV0FBVztnQkFDZCxNQUFNLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDMUIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQzNCLEtBQUssR0FBRyxHQUFHLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztnQkFDbkUsTUFBTTtZQUNSLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQztnQkFDakIsR0FBRyxHQUFHLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsRUFBRSxLQUFLLENBQUMsUUFBUSxFQUFFLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7Z0JBQ3ZFLEtBQUssR0FBRyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDdEIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ2pDLE1BQU07WUFDUixDQUFDO1lBQ0QsS0FBSyxZQUFZLENBQUMsQ0FBQyxDQUFDO2dCQUNsQixHQUFHLEdBQUcsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxFQUFFLEtBQUssQ0FBQyxRQUFRLEVBQUUsRUFBRSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztnQkFDdkUsS0FBSyxHQUFHLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUN0QixLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztnQkFDbEMsTUFBTTtZQUNSLENBQUM7WUFDRCxLQUFLLGFBQWEsQ0FBQyxDQUFDLENBQUM7Z0JBQ25CLEdBQUcsR0FBRyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLEVBQUUsS0FBSyxDQUFDLFFBQVEsRUFBRSxFQUFFLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO2dCQUN2RSxLQUFLLEdBQUcsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3RCLEtBQUssQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUNuQyxNQUFNO1lBQ1IsQ0FBQztZQUNELEtBQUssYUFBYSxDQUFDLENBQUMsQ0FBQztnQkFDbkIsR0FBRyxHQUFHLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsRUFBRSxLQUFLLENBQUMsUUFBUSxFQUFFLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7Z0JBQ3ZFLEtBQUssR0FBRyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDdEIsS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ25DLE1BQU07WUFDUixDQUFDO1lBQ0QsS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFDO2dCQUNqQixHQUFHLEdBQUcsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxFQUFFLEtBQUssQ0FBQyxRQUFRLEVBQUUsRUFBRSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztnQkFDdkUsS0FBSyxHQUFHLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUN0QixLQUFLLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDekMsTUFBTTtZQUNSLENBQUM7WUFDRDtnQkFDRSxNQUFNO1FBQ1YsQ0FBQztRQUNELElBQUksS0FBSyxJQUFJLEdBQUcsRUFBRSxDQUFDO1lBQ2pCLElBQUksQ0FBQyxZQUFZLEdBQUcsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDakMsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztZQUM5QixJQUFHLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDdkIsSUFBSSxDQUFDLFlBQVksR0FBRyxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztZQUN4RCxDQUFDO1lBQ0QsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQzdDLElBQUksQ0FBQyxjQUFjLEdBQUcsTUFBTSxDQUFDO1lBQzdCLElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO1FBQy9CLENBQUM7UUFDRCxJQUFJLENBQUM7WUFBQyxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksRUFBRSxDQUFDO1FBQUMsQ0FBQztRQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQSxDQUFDO1FBQy9DLDZEQUE2RDtRQUM3RCxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDekIsQ0FBQztJQUVELGlCQUFpQixDQUFDLFNBQXdCO1FBQ3hDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3JDLElBQUksU0FBUyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztZQUMxQyxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BFLElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO1FBQy9CLENBQUM7YUFBTSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7WUFDM0IsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUM7UUFDL0IsQ0FBQztRQUNILElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBQzlCLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO0lBQ2hDLENBQUM7SUFFRCw2RkFBNkY7SUFDckYsMkJBQTJCO1FBQ2pDLElBQUksQ0FBQztZQUNILE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7WUFFckQsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBYyxFQUFFLEVBQUU7Z0JBQzFDLDJDQUEyQztnQkFDM0MsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUNyRCxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7b0JBQ3hCLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxhQUFhLENBQUMsQ0FBQztvQkFDL0MsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxDQUFDO29CQUM3QyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsZUFBZSxDQUFDLENBQUM7Z0JBQ25ELENBQUMsQ0FBQyxDQUFDO2dCQUVULHNEQUFzRDtnQkFDdEQsdUVBQXVFO2dCQUN2RSxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxJQUFJLEtBQUssQ0FBQztnQkFDMUQsTUFBTSxlQUFlLEdBQUksU0FBcUIsQ0FBQyxhQUFhLENBQUMsOERBQThELENBQUMsQ0FBQztnQkFDN0gsTUFBTSxjQUFjLEdBQUksU0FBcUIsQ0FBQyxhQUFhLENBQUMsNkRBQTZELENBQUMsQ0FBQztnQkFDM0gsTUFBTSxjQUFjLEdBQUcsZUFBZSxJQUFJLGVBQWUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLElBQUksRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO2dCQUMzSixNQUFNLGFBQWEsR0FBRyxjQUFjLElBQUksY0FBYyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztnQkFDckgsTUFBTSxLQUFLLEdBQTJELEVBQUUsQ0FBQztnQkFDekUsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLGdCQUFnQixDQUFDLHVCQUF1QixDQUFDLENBQUM7Z0JBQzlELEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtvQkFDckIsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQXVCLENBQUM7b0JBQ3BELGlGQUFpRjtvQkFDakYsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQztvQkFDOUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxFQUFFO3dCQUFFLFFBQVEsR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDO29CQUM3RCxJQUFJLFFBQVEsRUFBRSxDQUFDO3dCQUNiLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7d0JBQzlELElBQUksS0FBSyxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDOzRCQUN2RCxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7NEJBQ3hCLE1BQU0sRUFBRSxHQUFHLElBQUksSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDOzRCQUNqQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDOzRCQUM3QixPQUFPO3dCQUNULENBQUM7b0JBQ0gsQ0FBQztvQkFDRCwrRkFBK0Y7b0JBQy9GLE1BQU0sT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztvQkFDaEQsTUFBTSxHQUFHLEdBQUcsUUFBUSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQztvQkFDbEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQzt3QkFDdEIsOENBQThDO3dCQUM5QyxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUM7NEJBQ3BELE1BQU0sRUFBRSxHQUFHLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxjQUFjLEVBQUUsR0FBRyxDQUFDLENBQUM7NEJBQ3hELEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7NEJBQzdCLE9BQU87d0JBQ1QsQ0FBQztvQkFDSCxDQUFDO29CQUNELHdEQUF3RDtnQkFDMUQsQ0FBQyxDQUFDLENBQUM7Z0JBRVQsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUM7b0JBQUUsT0FBTztnQkFFekIsMkNBQTJDO2dCQUMzQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7Z0JBQ3RELE1BQU0sYUFBYSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ2xDLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFFckQsdURBQXVEO2dCQUN2RCxNQUFNLEtBQUssR0FBRyxDQUFDLElBQUksQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUM7Z0JBQzFMLE1BQU0sU0FBUyxHQUFHLEtBQUssSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQztnQkFDM0YsTUFBTSxPQUFPLEdBQUcsS0FBSyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDO2dCQUVqRiwyRUFBMkU7Z0JBQzNFLE1BQU0sS0FBSyxHQUFHLFNBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDbEMsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNoQyxLQUFLLE1BQU0sRUFBRSxJQUFJLEtBQUssRUFBRSxDQUFDO29CQUN2QixNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDO29CQUMxQixJQUFJLEtBQUssS0FBSyxLQUFLLElBQUksQ0FBQyxLQUFLLEtBQUssRUFBRSxDQUFDO3dCQUNuQywwQ0FBMEM7d0JBQzFDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsYUFBYSxDQUFDLENBQUM7d0JBQy9DLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLENBQUM7b0JBQy9DLENBQUM7eUJBQU0sSUFBSSxDQUFDLEtBQUssS0FBSyxFQUFFLENBQUM7d0JBQ3ZCLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsYUFBYSxDQUFDLENBQUM7b0JBQ2pELENBQUM7eUJBQU0sSUFBSSxDQUFDLEtBQUssS0FBSyxFQUFFLENBQUM7d0JBQ3ZCLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLENBQUM7b0JBQy9DLENBQUM7eUJBQU0sSUFBSSxDQUFDLEdBQUcsS0FBSyxJQUFJLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQzt3QkFDbEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxlQUFlLENBQUMsQ0FBQztvQkFDbkQsQ0FBQztnQkFDSCxDQUFDO1lBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO1FBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNYLHFFQUFxRTtRQUN2RSxDQUFDO0lBQ0gsQ0FBQztJQUVPLE9BQU8sQ0FBQyxDQUFPO1FBQ3JCLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUMxQixNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDcEQsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDakQsT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVPLGtCQUFrQixDQUFDLElBQVc7UUFDcEMsSUFBSSxDQUFDLElBQUk7WUFBRSxPQUFPLFNBQVMsQ0FBQztRQUM1QixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDN0IsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLFFBQVE7UUFDdkMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3pCLE1BQU0sV0FBVyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLGlCQUFpQjtRQUN2RCxNQUFNLFNBQVMsR0FBRyxHQUFHLENBQUMsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsYUFBYTtRQUNuRyxNQUFNLFNBQVMsR0FBRyxDQUFDLGVBQWUsV0FBVyxJQUFJLEVBQUUsZUFBZSxTQUFTLElBQUksQ0FBQyxDQUFDO1FBQ2pGLEtBQUssTUFBTSxHQUFHLElBQUksU0FBUyxFQUFFLENBQUM7WUFDNUIsTUFBTSxjQUFjLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyw0QkFBNEIsR0FBRyxFQUFFLENBQXVCLENBQUM7WUFDdkcsSUFBSSxjQUFjO2dCQUFFLE9BQU8sY0FBYyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQXVCLElBQUksY0FBYyxDQUFDO1FBQ2xHLENBQUM7UUFDRCxLQUFLLE1BQU0sR0FBRyxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQzVCLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUF1QixDQUFDO1lBQ2hFLElBQUksS0FBSztnQkFBRSxPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUF1QixJQUFJLEtBQUssQ0FBQztRQUN2RSxDQUFDO1FBQ0QsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVPLHVCQUF1QjtRQUM3QixpQ0FBaUM7UUFDakMsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7UUFDOUIsSUFBSSxDQUFDO1lBQ1AsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7WUFDdkMsSUFBSSxDQUFDO2dCQUNILE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxZQUFtQixDQUFDO2dCQUN2QyxJQUFJLEtBQUssSUFBSSxLQUFLLENBQUMsRUFBRSxJQUFJLEtBQUssQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLENBQUM7b0JBQ2hELE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMsQ0FBQztvQkFDakUsSUFBSSxFQUFFO3dCQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBYSxDQUFDLENBQUM7Z0JBQ3JDLENBQUM7WUFDSCxDQUFDO1lBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFBLENBQUM7WUFFZCxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUU7Z0JBQ3BCLE1BQU0sR0FBRyxHQUFHLElBQUksZ0JBQWdCLENBQUMsR0FBRyxFQUFFO29CQUNwQyxnREFBZ0Q7b0JBQ2hELElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztnQkFDekIsQ0FBQyxDQUFDLENBQUM7Z0JBQ0gsdUZBQXVGO2dCQUN2RixHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLGVBQWUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDbEcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDbEMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDaEMsMEdBQTBHO2dCQUMxRyxNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUMsYUFBYSxDQUFDO2dCQUNoQyxJQUFJLE1BQU0sSUFBSSxJQUFJLENBQUMsdUJBQXVCLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7b0JBQ2xFLE1BQU0sU0FBUyxHQUFHLElBQUksZ0JBQWdCLENBQUMsR0FBRyxFQUFFO3dCQUMxQyw0REFBNEQ7d0JBQzVELElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQzt3QkFDdkIsbURBQW1EO3dCQUNuRCxVQUFVLENBQUMsR0FBRyxFQUFFOzRCQUNkLElBQUksQ0FBQztnQ0FDSCxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztnQ0FDOUIsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7NEJBQ2pDLENBQUM7NEJBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7d0JBQ2pCLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLGtFQUFrRTtvQkFDN0UsQ0FBQyxDQUFDLENBQUM7b0JBQ0gsU0FBUyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO29CQUMvRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO29CQUN0QyxJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUM1QyxDQUFDO1lBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO1FBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNYLFNBQVM7UUFDWCxDQUFDO0lBQ0gsQ0FBQztJQUVPLHNCQUFzQjtRQUM1QixJQUFJLENBQUM7WUFDSCxJQUFJLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztZQUMzRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQztRQUMzRCxDQUFDO1FBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDZixJQUFJLENBQUMsa0JBQWtCLEdBQUcsRUFBRSxDQUFDO1FBQzdCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxFQUFFLENBQUM7UUFDNUIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMsdUJBQXVCLEdBQUcsRUFBRSxDQUFDO0lBQ3BDLENBQUM7SUFFTyxlQUFlO1FBQ3JCLElBQUksSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJO1lBQUUsT0FBTyxDQUFDLG9CQUFvQjtRQUMzRCxJQUFJLENBQUMsWUFBWSxHQUFHLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLEVBQUU7WUFDcEQsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7WUFDekIsSUFBSSxDQUFDLDJCQUEyQixFQUFFLENBQUM7UUFDckMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sc0JBQXNCO1FBQzVCLElBQUksSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUM5QixNQUFNLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQy9DLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1FBQzNCLENBQUM7SUFDSCxDQUFDO0lBRU8sb0JBQW9CO1FBQzFCLE1BQU0sTUFBTSxHQUFjLEVBQUUsQ0FBQztRQUM3QixNQUFNLFVBQVUsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLHdDQUF3QyxDQUFDLENBQUM7UUFDcEYsTUFBTSxTQUFTLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO1FBQzNFLElBQUksVUFBVTtZQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDeEMsSUFBSSxTQUFTO1lBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUM7WUFDSCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsWUFBbUIsQ0FBQztZQUN2QyxJQUFJLEtBQUssSUFBSSxLQUFLLENBQUMsRUFBRSxJQUFJLEtBQUssQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBQ2hELE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMsQ0FBQztnQkFDakUsSUFBSSxFQUFFO29CQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBYSxDQUFDLENBQUM7WUFDckMsQ0FBQztRQUNILENBQUM7UUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNmLG9CQUFvQjtRQUNwQixPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUNyQyxDQUFDO3dHQWxsQlUsZ0NBQWdDOzRGQUFoQyxnQ0FBZ0MsMmlCQ1Q3Qyx1d0xBeUVBOzs0RkRoRWEsZ0NBQWdDO2tCQUw1QyxTQUFTOytCQUNFLDJCQUEyQjtxR0FLNUIsV0FBVztzQkFBbkIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUlxQixZQUFZO3NCQUF0QyxTQUFTO3VCQUFDLGNBQWM7Z0JBQ2YsZUFBZTtzQkFBeEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0LCBWaWV3Q2hpbGQsIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlcywgT25Jbml0LCBPbkRlc3Ryb3ksIFJlbmRlcmVyMiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT3ZlcmxheVBhbmVsIH0gZnJvbSAncHJpbWVuZy9vdmVybGF5cGFuZWwnO1xuaW1wb3J0IHsgRGF0ZVBpcGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhdG9taXgtZGF0ZXJhbmdlLWNhbGVuZGFyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2F0b21peC1kYXRlcmFuZ2UtY2FsZW5kYXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9hdG9taXgtZGF0ZXJhbmdlLWNhbGVuZGFyLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIEF0b21peERhdGVyYW5nZUNhbGVuZGFyQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzLCBPbkluaXQsIE9uRGVzdHJveSB7XG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgc3R5bGVDbGFzczogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIHNlbGVjdGlvbk1vZGU6ICdyYW5nZScgPSAncmFuZ2UnO1xuICBASW5wdXQoKSBpbnB1dFN0eWxlQ2xhc3M6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBpbmxpbmU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgZGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgc2VsZWN0ZWREYXRlOiBhbnkgPSBudWxsO1xuICBASW5wdXQoKSBtYXhEYXRlITogRGF0ZTtcbiAgQElucHV0KCkgbWluRGF0ZSE6IERhdGU7XG4gIEBJbnB1dCgpIGRlZmF1bHRQcmVzZXQ6ICd0b2RheScgfCAneWVzdGVyZGF5JyB8ICdsYXN0N2RheXMnIHwgJ2xhc3QzMGRheXMnIHwgJ2xhc3QzbW9udGhzJyB8ICdsYXN0Nm1vbnRocycgfCAnbGFzdDF5ZWFyJyB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBwcmVzZXJ2ZVByZXNldDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGN1c3RvbVJhbmdlTW9kZTogYm9vbGVhbiA9IGZhbHNlO1xuICBzZWxlY3RlZFByZXNldDogc3RyaW5nIHwgbnVsbCA9IG51bGw7IC8vICd0b2RheScgfCAneWVzdGVyZGF5JyB8ICdsYXN0N2RheXMnIHwgJ2xhc3QzMGRheXMnIHwgJ2xhc3QzbW9udGhzJyB8ICdsYXN0Nm1vbnRocycgfCAnbGFzdDF5ZWFyJyB8ICdjdXN0b20nIHwgbnVsbFxuICBAVmlld0NoaWxkKCdvdmVybGF5UGFuZWwnKSBvdmVybGF5UGFuZWw/OiBPdmVybGF5UGFuZWw7XG4gIEBPdXRwdXQoKSBkYXRlUmFuZ2VDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICAvLyBpbnRlcm5hbCBtb2RlbCBib3VuZCB0byBwLWNhbGVuZGFyIHRvIGF2b2lkIGNoYW5naW5nIGV4dGVybmFsIHNlbGVjdGlvbiBkdXJpbmcgZmlyc3QtY2xpY2sgc2VsZWN0aW9uXG4gIG1vZGVsRGF0ZTogRGF0ZVtdIHwgbnVsbCA9IG51bGw7XG5cbiAgZW5Mb2NhbGUgPSB7XG4gICAgZmlyc3REYXlPZldlZWs6IDAsXG4gICAgZGF5TmFtZXM6IFtcbiAgICAgICdTdW5kYXknLFxuICAgICAgJ01vbmRheScsXG4gICAgICAnVHVlc2RheScsXG4gICAgICAnV2VkbmVzZGF5JyxcbiAgICAgICdUaHVyc2RheScsXG4gICAgICAnRnJpZGF5JyxcbiAgICAgICdTYXR1cmRheScsXG4gICAgXSxcbiAgICBkYXlOYW1lc1Nob3J0OiBbJ1N1bicsICdNb24nLCAnVHVlJywgJ1dlZCcsICdUaHUnLCAnRnJpJywgJ1NhdCddLFxuICAgIGRheU5hbWVzTWluOiBbJ1N1JywgJ01vJywgJ1R1JywgJ1dlJywgJ1RoJywgJ0ZyJywgJ1NhJ10sXG4gICAgbW9udGhOYW1lczogW1xuICAgICAgJ0phbnVhcnknLFxuICAgICAgJ0ZlYnJ1YXJ5JyxcbiAgICAgICdNYXJjaCcsXG4gICAgICAnQXByaWwnLFxuICAgICAgJ01heScsXG4gICAgICAnSnVuZScsXG4gICAgICAnSnVseScsXG4gICAgICAnQXVndXN0JyxcbiAgICAgICdTZXB0ZW1iZXInLFxuICAgICAgJ09jdG9iZXInLFxuICAgICAgJ05vdmVtYmVyJyxcbiAgICAgICdEZWNlbWJlcicsXG4gICAgXSxcbiAgICBtb250aE5hbWVzU2hvcnQ6IFtcbiAgICAgICdKYW4nLFxuICAgICAgJ0ZlYicsXG4gICAgICAnTWFyJyxcbiAgICAgICdBcHInLFxuICAgICAgJ01heScsXG4gICAgICAnSnVuJyxcbiAgICAgICdKdWwnLFxuICAgICAgJ0F1ZycsXG4gICAgICAnU2VwJyxcbiAgICAgICdPY3QnLFxuICAgICAgJ05vdicsXG4gICAgICAnRGVjJyxcbiAgICBdLFxuICAgIHRvZGF5OiAnVG9kYXknLFxuICAgIGNsZWFyOiAnQ2xlYXInLFxuICB9O1xuXG4gIC8vIHRlbXBvcmFyeSBzdG9yYWdlIGZvciBvdmVybGF5IHNlc3Npb25cbiAgcHJpdmF0ZSBfb3ZlcmxheUluaXRpYWxEYXRlOiBEYXRlW10gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfb3ZlcmxheUluaXRpYWxQcmVzZXQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIF9jYWxlbmRhck9ic2VydmVyczogTXV0YXRpb25PYnNlcnZlcltdID0gW107XG4gIHByaXZhdGUgX29ic2VydmVkRWxlbWVudHM6IEVsZW1lbnRbXSA9IFtdO1xuICBwcml2YXRlIF9wYXJlbnRPYnNlcnZlcnM6IE11dGF0aW9uT2JzZXJ2ZXJbXSA9IFtdO1xuICBwcml2YXRlIF9vYnNlcnZlZFBhcmVudEVsZW1lbnRzOiBFbGVtZW50W10gPSBbXTtcbiAgcHJpdmF0ZSBfdXBkYXRlUmFmSWQ6IG51bWJlciB8IG51bGwgPSBudWxsOyAvLyByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgaWRcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGRhdGVQaXBlOiBEYXRlUGlwZSwgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zZWxlY3RlZERhdGUgJiYgdGhpcy5kZWZhdWx0UHJlc2V0KSB7XG4gICAgICB0aGlzLmFwcGx5UHJlc2V0KHRoaXMuZGVmYXVsdFByZXNldCk7XG4gICAgfVxuICAgIC8vIGluaXRpYWxpemUgaW50ZXJuYWwgbW9kZWxcbiAgICB0aGlzLm1vZGVsRGF0ZSA9IHRoaXMuc2VsZWN0ZWREYXRlID8gWy4uLnRoaXMuc2VsZWN0ZWREYXRlXSA6IG51bGw7XG4gICAgLy8gaW5pdGlhbCBjbGFzcyB1cGRhdGUgaWYgdGhlcmUgaXMgYSBwcmUtc2VsZWN0ZWQgcmFuZ2VcbiAgICB0aGlzLl9zY2hlZHVsZVVwZGF0ZSgpO1xuICAgIC8vIHN0YXJ0IG9ic2VydmVycyBpZiBpbmxpbmUgY2FsZW5kYXIgaXMgdXNlZFxuICAgIGlmICh0aGlzLmlubGluZSkge1xuICAgICAgdGhpcy5fc3RhcnRDYWxlbmRhck9ic2VydmVycygpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1snc2VsZWN0ZWREYXRlJ10pIHtcbiAgICAgIGNvbnN0IHNlbCA9IGNoYW5nZXNbJ3NlbGVjdGVkRGF0ZSddLmN1cnJlbnRWYWx1ZSBhcyBEYXRlW10gfCBudWxsO1xuICAgICAgaWYgKHNlbCAmJiBBcnJheS5pc0FycmF5KHNlbCkgJiYgc2VsLmxlbmd0aCA9PT0gMiAmJiBzZWxbMF0gJiYgc2VsWzFdKSB7XG4gICAgICAgICAgY29uc3QgcHJlc2V0ID0gdGhpcy5kZXRlY3RQcmVzZXQoc2VsWzBdLCBzZWxbMV0pO1xuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRQcmVzZXQgPSBwcmVzZXQgPz8gJ2N1c3RvbSc7XG4gICAgICAgIC8vIHN5bmMgaW50ZXJuYWwgbW9kZWwgd2hlbiBleHRlcm5hbCB2YWx1ZSBjaGFuZ2VzXG4gICAgICAgIHRoaXMubW9kZWxEYXRlID0gWy4uLnNlbF07XG4gICAgICB9IGVsc2UgaWYgKHNlbCA9PSBudWxsKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRQcmVzZXQgPSBudWxsO1xuICAgICAgICB0aGlzLm1vZGVsRGF0ZSA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb25JbnB1dEtleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICBpZiAoZXZlbnQua2V5ID09PSAnRW50ZXInIHx8IGV2ZW50LmtleSA9PT0gJyAnKSB7XG4gICAgICB0cnkgeyB0aGlzLm92ZXJsYXlQYW5lbD8udG9nZ2xlKGV2ZW50IGFzIGFueSk7IH0gY2F0Y2ggKGUpIHt9XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgfVxuXG4gICBvbk92ZXJsYXlTaG93KCk6IHZvaWQge1xuICAgICAgLy8gc3RvcmUgYSBkZWVwIGNvcHkgb2YgY3VycmVudCBzZWxlY3Rpb24vcHJlc2V0IHdoZW4gb3ZlcmxheSBvcGVuc1xuICAgICAgaWYgKHRoaXMuc2VsZWN0ZWREYXRlICYmIEFycmF5LmlzQXJyYXkodGhpcy5zZWxlY3RlZERhdGUpKSB7XG4gICAgICAgIHRoaXMuX292ZXJsYXlJbml0aWFsRGF0ZSA9ICh0aGlzLnNlbGVjdGVkRGF0ZSBhcyBEYXRlW10pLm1hcChkID0+IChkID8gbmV3IERhdGUoZC5nZXRGdWxsWWVhcigpLCBkLmdldE1vbnRoKCksIGQuZ2V0RGF0ZSgpKSA6IGQpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX292ZXJsYXlJbml0aWFsRGF0ZSA9IG51bGw7XG4gICAgICB9XG4gICAgICB0aGlzLl9vdmVybGF5SW5pdGlhbFByZXNldCA9IHRoaXMuc2VsZWN0ZWRQcmVzZXQ7XG4gICAgICAvLyBlbnN1cmUgY2FsZW5kYXIgbW9kZWwgc2hvd3MgdGhlIGN1cnJlbnRseSBjb21taXR0ZWQgc2VsZWN0aW9uIHdoZW4gb3BlbmluZ1xuICAgICAgdGhpcy5tb2RlbERhdGUgPSB0aGlzLnNlbGVjdGVkRGF0ZSA/IFsuLi50aGlzLnNlbGVjdGVkRGF0ZV0gOiBudWxsO1xuICAgICAgLy8gZW5zdXJlIHByZXNldCBidXR0b25zIHJlZmxlY3QgY3VycmVudCBzZWxlY3Rpb24gd2hlbiBvdmVybGF5IG9wZW5zXG4gICAgICBpZiAodGhpcy5zZWxlY3RlZERhdGUgJiYgQXJyYXkuaXNBcnJheSh0aGlzLnNlbGVjdGVkRGF0ZSkgJiYgdGhpcy5zZWxlY3RlZERhdGUubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgY29uc3QgcHJlc2V0ID0gdGhpcy5kZXRlY3RQcmVzZXQodGhpcy5zZWxlY3RlZERhdGVbMF0sIHRoaXMuc2VsZWN0ZWREYXRlWzFdKTtcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkUHJlc2V0ID0gcHJlc2V0ID8/ICdjdXN0b20nO1xuICAgICAgfSBlbHNlIGlmICghdGhpcy5zZWxlY3RlZERhdGUpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFByZXNldCA9IG51bGw7XG4gICAgICB9XG4gICAgICAvLyBhZGQgc3RhcnQvZW5kIGNsYXNzZXMgdG8gcmFuZ2UgY2VsbHMgZm9yIHN0eWxpbmdcbiAgICAgIHRoaXMuX3NjaGVkdWxlVXBkYXRlKCk7XG4gICAgICAvLyBvYnNlcnZlIERPTSBjaGFuZ2VzIChQcmltZU5HIG1heSByZS1yZW5kZXIgaW5zaWRlIG92ZXJsYXkpXG4gICAgICB0aGlzLl9zdGFydENhbGVuZGFyT2JzZXJ2ZXJzKCk7XG4gIH1cblxuICBvbk92ZXJsYXlIaWRlKCk6IHZvaWQge1xuICAgIC8vIGlmIGludGVybmFsIGNhbGVuZGFyIG1vZGVsIGhhcyBhbiBpbmNvbXBsZXRlIHNlbGVjdGlvbiAocGFydGlhbCByYW5nZSkgcmV2ZXJ0IHRvIGluaXRpYWxcbiAgICBjb25zdCBtb2RlbCA9IHRoaXMubW9kZWxEYXRlO1xuICAgIGNvbnN0IGlzUGFydGlhbE1vZGVsID0gQm9vbGVhbihtb2RlbCAmJiBBcnJheS5pc0FycmF5KG1vZGVsKSAmJiBtb2RlbC5sZW5ndGggPiAwICYmIG1vZGVsWzBdICYmICFtb2RlbFsxXSk7XG4gICAgaWYgKGlzUGFydGlhbE1vZGVsKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkRGF0ZSA9IHRoaXMuX292ZXJsYXlJbml0aWFsRGF0ZTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRQcmVzZXQgPSB0aGlzLl9vdmVybGF5SW5pdGlhbFByZXNldDtcbiAgICAgIC8vIHJlc2V0IGludGVybmFsIG1vZGVsIHRvIHN5bmNlZCB2YWx1ZVxuICAgICAgdGhpcy5tb2RlbERhdGUgPSB0aGlzLnNlbGVjdGVkRGF0ZSA/IFsuLi50aGlzLnNlbGVjdGVkRGF0ZV0gOiBudWxsO1xuICAgIH1cbiAgICB0aGlzLl9vdmVybGF5SW5pdGlhbERhdGUgPSBudWxsO1xuICAgIHRoaXMuX292ZXJsYXlJbml0aWFsUHJlc2V0ID0gbnVsbDtcbiAgICB0aGlzLmN1c3RvbVJhbmdlTW9kZSA9IGZhbHNlO1xuICAvLyBjbGVhbnVwIGFueSBzdGFydC9lbmQgY2xhc3NlcyB0byBhdm9pZCBzdGFsZSBjbGFzc2VzXG4gIHRoaXMuX3NjaGVkdWxlVXBkYXRlKCk7XG4gICAgLy8gc3RvcCBvYnNlcnZpbmdcbiAgICB0aGlzLl9zdG9wQ2FsZW5kYXJPYnNlcnZlcnMoKTtcbiAgfVxuXG4gIG9uTW9kZWxDaGFuZ2UoZGF0ZVJhbmdlOiBEYXRlW10gfCBudWxsKSB7XG4gICAgLy8gV2hlbiB1c2VyIGNsaWNrcyBhIGZpcnN0IGRhdGUsIFByaW1lTkcgbWF5IGVtaXQgYW4gYXJyYXkgd2l0aCAxIHZhbHVlLiBXZSBkb24ndCB3YW50IHRvXG4gICAgLy8gdXBkYXRlIHRoZSBleHRlcm5hbCBzZWxlY3RlZERhdGUgdW50aWwgdGhlIHJhbmdlIGlzIGNvbXBsZXRlZCAodHdvIGRhdGVzKSBzbyB0aGF0XG4gICAgLy8gdGhlIGNhbGVuZGFyIGRvZXMgbm90IGp1bXAgYmFjayB0byBhIHByZXZpb3VzbHkgc2VsZWN0ZWQgZW5kIGRhdGUncyBtb250aC5cbiAgICB0aGlzLm1vZGVsRGF0ZSA9IGRhdGVSYW5nZSA/IFsuLi5kYXRlUmFuZ2VdIDogbnVsbDtcbiAgICBpZiAoZGF0ZVJhbmdlICYmIEFycmF5LmlzQXJyYXkoZGF0ZVJhbmdlKSAmJiBkYXRlUmFuZ2UubGVuZ3RoID09PSAyICYmIGRhdGVSYW5nZVswXSAmJiBkYXRlUmFuZ2VbMV0pIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFByZXNldCA9IHRoaXMuZGV0ZWN0UHJlc2V0KGRhdGVSYW5nZVswXSwgZGF0ZVJhbmdlWzFdKTtcbiAgICAgICAgdGhpcy5jdXN0b21SYW5nZU1vZGUgPSBmYWxzZTtcbiAgICAgIHRoaXMuc2VsZWN0ZWREYXRlID0gWy4uLmRhdGVSYW5nZV07XG4gICAgICB0aGlzLmRhdGVSYW5nZUNoYW5nZS5lbWl0KHRoaXMuc2VsZWN0ZWREYXRlKTtcbiAgICAgIC8vIGNsb3NlIG92ZXJsYXkgbGlrZSB3aGVuIGFwcGx5aW5nIGEgcHJlc2V0XG4gICAgICB0cnkgeyB0aGlzLm92ZXJsYXlQYW5lbD8uaGlkZSgpOyB9IGNhdGNoIChlKSB7fVxuICAgIH0gZWxzZSBpZiAoIWRhdGVSYW5nZSkge1xuICAgICAgLy8gY2xlYXJlZCBzZWxlY3Rpb25cbiAgICAgIHRoaXMuc2VsZWN0ZWRQcmVzZXQgPSBudWxsO1xuICAgICAgdGhpcy5jdXN0b21SYW5nZU1vZGUgPSBmYWxzZTtcbiAgICAgIHRoaXMuc2VsZWN0ZWREYXRlID0gbnVsbDtcbiAgICAgIHRoaXMuZGF0ZVJhbmdlQ2hhbmdlLmVtaXQobnVsbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHNpbmdsZSBkYXRlIHNlbGVjdGluZyAocGFydGlhbCByYW5nZSkgLSBkbyBub3QgZW1pdCBjaGFuZ2UgeWV0OyBqdXN0IGtlZXAgaW50ZXJuYWwgbW9kZWxcbiAgICAgIC8vIHNvIHRoZSBjYWxlbmRhcidzIHZpZXcgcmVtYWlucyB3aGVyZSB0aGUgdXNlciBuYXZpZ2F0ZWQgdG8uXG4gICAgICB0aGlzLnNlbGVjdGVkUHJlc2V0ID0gbnVsbDtcbiAgICAgIHRoaXMuY3VzdG9tUmFuZ2VNb2RlID0gZmFsc2U7XG4gICAgfVxuICAgIC8vIHVwZGF0ZSBzdGFydC9lbmQgY2xhc3NlcyB3aGlsZSB1c2VyIGlzIHNlbGVjdGluZyBvciB3aGVuIHJhbmdlIGNvbXBsZXRlc1xuICAgIHRoaXMuX3NjaGVkdWxlVXBkYXRlKCk7XG4gIH1cblxuICAvLyBDYWxsZWQgd2hlbiB0aGUgY2FsZW5kYXIncyB2aXNpYmxlIG1vbnRoL3llYXIgY2hhbmdlc1xuICBvbkNhbGVuZGFyVmlld0NoYW5nZWQoZXZlbnQ/OiBhbnkpOiB2b2lkIHtcbiAgICAvLyBSZWFwcGx5IGNsYXNzZXMgYWZ0ZXIgUHJpbWVORyByZS1yZW5kZXJcbiAgICB0aGlzLl9zY2hlZHVsZVVwZGF0ZSgpO1xuICAgIC8vIFJlYXR0YWNoIG9ic2VydmVycyBhZnRlciBhIHNtYWxsIGRlbGF5IHNpbmNlIFByaW1lTkcgd2lsbCBsaWtlbHkgcmVwbGFjZSBET00gbm9kZXNcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuX3N0b3BDYWxlbmRhck9ic2VydmVycygpO1xuICAgICAgICB0aGlzLl9zdGFydENhbGVuZGFyT2JzZXJ2ZXJzKCk7XG4gICAgICB9IGNhdGNoIChlKSB7IH1cbiAgICB9LCA0MCk7XG4gIH1cblxuICBnZXQgaGFzU2VsZWN0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBCb29sZWFuKFxuICAgICAgdGhpcy5zZWxlY3RlZERhdGUgJiZcbiAgICAgICAgQXJyYXkuaXNBcnJheSh0aGlzLnNlbGVjdGVkRGF0ZSkgJiZcbiAgICAgICAgKHRoaXMuc2VsZWN0ZWREYXRlIGFzIERhdGVbXSkubGVuZ3RoID09PSAyICYmXG4gICAgICAgICEhKHRoaXMuc2VsZWN0ZWREYXRlIGFzIERhdGVbXSlbMF0gJiZcbiAgICAgICAgISEodGhpcy5zZWxlY3RlZERhdGUgYXMgRGF0ZVtdKVsxXVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIG5vcm1hbGl6ZURhdGUoZDogRGF0ZSk6IERhdGUge1xuICAgIHJldHVybiBuZXcgRGF0ZShkLmdldEZ1bGxZZWFyKCksIGQuZ2V0TW9udGgoKSwgZC5nZXREYXRlKCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBpc1NhbWVEYXRlKGE6IERhdGUsIGI6IERhdGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgYS5nZXRGdWxsWWVhcigpID09PSBiLmdldEZ1bGxZZWFyKCkgJiZcbiAgICAgIGEuZ2V0TW9udGgoKSA9PT0gYi5nZXRNb250aCgpICYmXG4gICAgICBhLmdldERhdGUoKSA9PT0gYi5nZXREYXRlKClcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBkZXRlY3RQcmVzZXQoc3RhcnRSYXc6IERhdGUsIGVuZFJhdzogRGF0ZSk6IHN0cmluZyB8IG51bGwge1xuICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5ub3JtYWxpemVEYXRlKHN0YXJ0UmF3KTtcbiAgICBjb25zdCBlbmQgPSB0aGlzLm5vcm1hbGl6ZURhdGUoZW5kUmF3KTtcbiAgICBjb25zdCB0b2RheSA9IHRoaXMubm9ybWFsaXplRGF0ZShuZXcgRGF0ZSgpKTtcbiAgICAvLyB0b2RheVxuICAgIGlmICh0aGlzLmlzU2FtZURhdGUoc3RhcnQsIHRvZGF5KSAmJiB0aGlzLmlzU2FtZURhdGUoZW5kLCB0b2RheSkpIHJldHVybiAndG9kYXknO1xuICAgIC8vIHllc3RlcmRheVxuICAgIGNvbnN0IHkgPSBuZXcgRGF0ZSh0b2RheSk7XG4gICAgeS5zZXREYXRlKHkuZ2V0RGF0ZSgpIC0gMSk7XG4gICAgaWYgKHRoaXMuaXNTYW1lRGF0ZShzdGFydCwgeSkgJiYgdGhpcy5pc1NhbWVEYXRlKGVuZCwgeSkpIHJldHVybiAneWVzdGVyZGF5JztcbiAgICAvLyBsYXN0N2RheXMgKGxhc3QgNyBkYXlzIGluY2x1ZGluZyB0b2RheTogc3RhcnQgPSB0b2RheSAtIDYsIGVuZCA9IHRvZGF5KVxuICAgIGNvbnN0IGw3RW5kID0gbmV3IERhdGUodG9kYXkpO1xuICAgIGNvbnN0IGw3U3RhcnQgPSBuZXcgRGF0ZSh0b2RheSk7XG4gICAgbDdTdGFydC5zZXREYXRlKHRvZGF5LmdldERhdGUoKSAtIDYpO1xuICAgIGlmICh0aGlzLmlzU2FtZURhdGUoc3RhcnQsIGw3U3RhcnQpICYmIHRoaXMuaXNTYW1lRGF0ZShlbmQsIGw3RW5kKSkgcmV0dXJuICdsYXN0N2RheXMnO1xuICAgIC8vIGxhc3QzMGRheXMgKGxhc3QgMzAgZGF5cyBpbmNsdWRpbmcgdG9kYXk6IHN0YXJ0ID0gdG9kYXkgLSAyOSwgZW5kID0gdG9kYXkpXG4gICAgY29uc3QgbDMwRW5kID0gbmV3IERhdGUodG9kYXkpO1xuICAgIGNvbnN0IGwzMFN0YXJ0ID0gbmV3IERhdGUodG9kYXkpO1xuICAgIGwzMFN0YXJ0LnNldERhdGUodG9kYXkuZ2V0RGF0ZSgpIC0gMjkpO1xuICAgIGlmICh0aGlzLmlzU2FtZURhdGUoc3RhcnQsIGwzMFN0YXJ0KSAmJiB0aGlzLmlzU2FtZURhdGUoZW5kLCBsMzBFbmQpKSByZXR1cm4gJ2xhc3QzMGRheXMnO1xuICAgIC8vIGxhc3QzbW9udGhzIChsYXN0IDMgbW9udGhzIGluY2x1ZGluZyB0b2RheTogc3RhcnQgPSB0b2RheSAtIDMgbW9udGhzLCBlbmQgPSB0b2RheSlcbiAgICBjb25zdCBsM21FbmQgPSBuZXcgRGF0ZSh0b2RheSk7XG4gICAgY29uc3QgbDNtU3RhcnQgPSBuZXcgRGF0ZSh0b2RheSk7XG4gICAgbDNtU3RhcnQuc2V0TW9udGgodG9kYXkuZ2V0TW9udGgoKSAtIDMpO1xuICAgIGlmICh0aGlzLmlzU2FtZURhdGUoc3RhcnQsIGwzbVN0YXJ0KSAmJiB0aGlzLmlzU2FtZURhdGUoZW5kLCBsM21FbmQpKSByZXR1cm4gJ2xhc3QzbW9udGhzJztcbiAgICAvLyBsYXN0Nm1vbnRocyAobGFzdCA2IG1vbnRocyBpbmNsdWRpbmcgdG9kYXk6IHN0YXJ0ID0gdG9kYXkgLSA2IG1vbnRocywgZW5kID0gdG9kYXkpXG4gICAgY29uc3QgbDZtRW5kID0gbmV3IERhdGUodG9kYXkpO1xuICAgIGNvbnN0IGw2bVN0YXJ0ID0gbmV3IERhdGUodG9kYXkpO1xuICAgIGw2bVN0YXJ0LnNldE1vbnRoKHRvZGF5LmdldE1vbnRoKCkgLSA2KTtcbiAgICBpZiAodGhpcy5pc1NhbWVEYXRlKHN0YXJ0LCBsNm1TdGFydCkgJiYgdGhpcy5pc1NhbWVEYXRlKGVuZCwgbDZtRW5kKSkgcmV0dXJuICdsYXN0Nm1vbnRocyc7XG4gICAgLy8gbGFzdDF5ZWFyIChsYXN0IDEgeWVhciBpbmNsdWRpbmcgdG9kYXk6IHN0YXJ0ID0gdG9kYXkgLSAxIHllYXIsIGVuZCA9IHRvZGF5KVxuICAgIGNvbnN0IGwxeUVuZCA9IG5ldyBEYXRlKHRvZGF5KTtcbiAgICBjb25zdCBsMXlTdGFydCA9IG5ldyBEYXRlKHRvZGF5KTtcbiAgICBsMXlTdGFydC5zZXRGdWxsWWVhcih0b2RheS5nZXRGdWxsWWVhcigpIC0gMSk7XG4gICAgaWYgKHRoaXMuaXNTYW1lRGF0ZShzdGFydCwgbDF5U3RhcnQpICYmIHRoaXMuaXNTYW1lRGF0ZShlbmQsIGwxeUVuZCkpIHJldHVybiAnbGFzdDF5ZWFyJztcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNsZWFyRGF0ZVJhbmdlKCkge1xuICAgIHRoaXMuc2VsZWN0ZWREYXRlID0gbnVsbDtcbiAgICB0aGlzLmRhdGVSYW5nZUNoYW5nZS5lbWl0KHRoaXMuc2VsZWN0ZWREYXRlKTtcbiAgICB0aGlzLnNlbGVjdGVkUHJlc2V0ID0gbnVsbDtcbiAgICB0aGlzLmN1c3RvbVJhbmdlTW9kZSA9IGZhbHNlO1xuICAgIHRoaXMubW9kZWxEYXRlID0gbnVsbDtcbiAgfVxuXG4gIHJlc2V0QW5kQ2xvc2UoKSB7XG4gICAgdGhpcy5jbGVhckRhdGVSYW5nZSgpO1xuICAgIGlmICh0aGlzLm92ZXJsYXlQYW5lbCkge1xuICAgICAgdHJ5IHsgdGhpcy5vdmVybGF5UGFuZWwuaGlkZSgpOyB9IGNhdGNoIChlKSB7fVxuICAgIH1cbiAgfVxuXG4gIGNsZWFyQW5kU3RvcChldmVudDogRXZlbnQpIHtcbiAgICB0aGlzLmNsZWFyRGF0ZVJhbmdlKCk7XG4gICAgdHJ5IHsgdGhpcy5vdmVybGF5UGFuZWw/LmhpZGUoKTsgfSBjYXRjaCAoZSkge31cbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgfVxuXG4gIHRvZ2dsZUN1c3RvbVJhbmdlKCkge1xuICAgIHRoaXMuY3VzdG9tUmFuZ2VNb2RlID0gIXRoaXMuY3VzdG9tUmFuZ2VNb2RlO1xuICAgIGlmICh0aGlzLmN1c3RvbVJhbmdlTW9kZSkgdGhpcy5zZWxlY3RlZFByZXNldCA9ICdjdXN0b20nO1xuICB9XG5cbiAgYXBwbHlDdXN0b21SYW5nZSgpIHtcbiAgICAvLyBlbnN1cmUgZXh0ZXJuYWwgc2VsZWN0ZWREYXRlIGlzIGluIHN5bmMgd2l0aCBpbnRlcm5hbCBtb2RlbFxuICAgIHRoaXMuc2VsZWN0ZWREYXRlID0gdGhpcy5tb2RlbERhdGUgPyBbLi4udGhpcy5tb2RlbERhdGVdIDogbnVsbDtcbiAgICB0aGlzLmRhdGVSYW5nZUNoYW5nZS5lbWl0KHRoaXMuc2VsZWN0ZWREYXRlKTtcbiAgICBpZiAodGhpcy5vdmVybGF5UGFuZWwpIHtcbiAgICAgIHRyeSB7IHRoaXMub3ZlcmxheVBhbmVsLmhpZGUoKTsgfSBjYXRjaCAoZSkge31cbiAgICB9XG4gICAgdGhpcy5jdXN0b21SYW5nZU1vZGUgPSBmYWxzZTtcbiAgICB0aGlzLnNlbGVjdGVkUHJlc2V0ID0gJ2N1c3RvbSc7XG4gIH1cblxuICAgIGdldERhdGVSYW5nZUxhYmVsKCkge1xuICAgIC8vIENoZWNrIHRoZSBpbnRlcm5hbCBtb2RlbCBmaXJzdCB0byBzaG93IHJlYWwtdGltZSB1cGRhdGVzIHdoaWxlIHNlbGVjdGluZ1xuICAgIGNvbnN0IGRhdGVBcnJheSA9IHRoaXMubW9kZWxEYXRlIHx8IHRoaXMuc2VsZWN0ZWREYXRlO1xuICAgIGlmICghZGF0ZUFycmF5IHx8ICFBcnJheS5pc0FycmF5KGRhdGVBcnJheSkpIHJldHVybiAnJztcbiAgICBcbiAgICBjb25zdCBbc3RhcnQsIGVuZF0gPSBkYXRlQXJyYXkgYXMgKERhdGUgfCBudWxsKVtdO1xuICAgICAgICAgICAgY29uc3QgYXJyb3cgPSAnXFx1Mjc5NCc7XG5cbiAgICAvLyBTaG93IGp1c3QgdGhlIGZpcnN0IGRhdGUgd2l0aCBhbiBhcnJvdyBpZiBvbmx5IGZpcnN0IGRhdGUgaXMgc2VsZWN0ZWRcbiAgICBpZiAoc3RhcnQgJiYgIWVuZCkge1xuICAgICAgY29uc3Qgc3RhcnRTdHIgPSB0aGlzLmRhdGVQaXBlLnRyYW5zZm9ybShzdGFydCwgJ01NL2RkL3l5eXknKTtcbiAgICAgIHJldHVybiBgJHtzdGFydFN0cn0gJHthcnJvd30gYDtcbiAgICB9XG4gICAgXG4gICAgLy8gU2hvdyB0aGUgY29tcGxldGUgcmFuZ2UgaWYgYm90aCBkYXRlcyBhcmUgc2VsZWN0ZWRcbiAgICBpZiAoc3RhcnQgJiYgZW5kKSB7XG4gICAgICBjb25zdCBzdGFydFN0ciA9IHRoaXMuZGF0ZVBpcGUudHJhbnNmb3JtKHN0YXJ0LCAnTU0vZGQveXl5eScpO1xuICAgICAgY29uc3QgZW5kU3RyID0gdGhpcy5kYXRlUGlwZS50cmFuc2Zvcm0oZW5kLCAnTU0vZGQveXl5eScpO1xuICAgICAgcmV0dXJuIGAke3N0YXJ0U3RyfSAke2Fycm93fSAke2VuZFN0cn1gO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBhcHBseVByZXNldChwcmVzZXQ6ICd0b2RheSd8J3llc3RlcmRheSd8J2xhc3Q3ZGF5cyd8J2xhc3QzMGRheXMnfCdsYXN0M21vbnRocyd8J2xhc3Q2bW9udGhzJ3wnbGFzdDF5ZWFyJykge1xuICAgIGNvbnN0IHRvZGF5ID0gbmV3IERhdGUoKTtcbiAgICBsZXQgc3RhcnQ6IERhdGUgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgZW5kOiBEYXRlIHwgbnVsbCA9IG51bGw7XG4gICAgc3dpdGNoIChwcmVzZXQpIHtcbiAgICAgIGNhc2UgJ3RvZGF5JzpcbiAgICAgICAgc3RhcnQgPSBlbmQgPSBuZXcgRGF0ZSh0b2RheS5nZXRGdWxsWWVhcigpLCB0b2RheS5nZXRNb250aCgpLCB0b2RheS5nZXREYXRlKCkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3llc3RlcmRheSc6XG4gICAgICAgIGNvbnN0IHkgPSBuZXcgRGF0ZSh0b2RheSk7XG4gICAgICAgIHkuc2V0RGF0ZSh5LmdldERhdGUoKSAtIDEpO1xuICAgICAgICBzdGFydCA9IGVuZCA9IG5ldyBEYXRlKHkuZ2V0RnVsbFllYXIoKSwgeS5nZXRNb250aCgpLCB5LmdldERhdGUoKSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnbGFzdDdkYXlzJzoge1xuICAgICAgICBlbmQgPSBuZXcgRGF0ZSh0b2RheS5nZXRGdWxsWWVhcigpLCB0b2RheS5nZXRNb250aCgpLCB0b2RheS5nZXREYXRlKCkpO1xuICAgICAgICBzdGFydCA9IG5ldyBEYXRlKGVuZCk7XG4gICAgICAgIHN0YXJ0LnNldERhdGUoZW5kLmdldERhdGUoKSAtIDYpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2xhc3QzMGRheXMnOiB7XG4gICAgICAgIGVuZCA9IG5ldyBEYXRlKHRvZGF5LmdldEZ1bGxZZWFyKCksIHRvZGF5LmdldE1vbnRoKCksIHRvZGF5LmdldERhdGUoKSk7XG4gICAgICAgIHN0YXJ0ID0gbmV3IERhdGUoZW5kKTtcbiAgICAgICAgc3RhcnQuc2V0RGF0ZShlbmQuZ2V0RGF0ZSgpIC0gMjkpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2xhc3QzbW9udGhzJzoge1xuICAgICAgICBlbmQgPSBuZXcgRGF0ZSh0b2RheS5nZXRGdWxsWWVhcigpLCB0b2RheS5nZXRNb250aCgpLCB0b2RheS5nZXREYXRlKCkpO1xuICAgICAgICBzdGFydCA9IG5ldyBEYXRlKGVuZCk7XG4gICAgICAgIHN0YXJ0LnNldE1vbnRoKGVuZC5nZXRNb250aCgpIC0gMyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnbGFzdDZtb250aHMnOiB7XG4gICAgICAgIGVuZCA9IG5ldyBEYXRlKHRvZGF5LmdldEZ1bGxZZWFyKCksIHRvZGF5LmdldE1vbnRoKCksIHRvZGF5LmdldERhdGUoKSk7XG4gICAgICAgIHN0YXJ0ID0gbmV3IERhdGUoZW5kKTtcbiAgICAgICAgc3RhcnQuc2V0TW9udGgoZW5kLmdldE1vbnRoKCkgLSA2KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdsYXN0MXllYXInOiB7XG4gICAgICAgIGVuZCA9IG5ldyBEYXRlKHRvZGF5LmdldEZ1bGxZZWFyKCksIHRvZGF5LmdldE1vbnRoKCksIHRvZGF5LmdldERhdGUoKSk7XG4gICAgICAgIHN0YXJ0ID0gbmV3IERhdGUoZW5kKTtcbiAgICAgICAgc3RhcnQuc2V0RnVsbFllYXIoZW5kLmdldEZ1bGxZZWFyKCkgLSAxKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgaWYgKHN0YXJ0ICYmIGVuZCkge1xuICAgICAgdGhpcy5zZWxlY3RlZERhdGUgPSBbc3RhcnQsIGVuZF07XG4gICAgICB0aGlzLm1vZGVsRGF0ZSA9IFtzdGFydCwgZW5kXTtcbiAgICAgIGlmKHRoaXMucHJlc2VydmVQcmVzZXQpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZERhdGUgPSBbc3RhcnQsIGVuZCwgeyBwcmVzZXRzOiBwcmVzZXQgfV07XG4gICAgICB9XG4gICAgICB0aGlzLmRhdGVSYW5nZUNoYW5nZS5lbWl0KHRoaXMuc2VsZWN0ZWREYXRlKTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRQcmVzZXQgPSBwcmVzZXQ7XG4gICAgICB0aGlzLmN1c3RvbVJhbmdlTW9kZSA9IGZhbHNlO1xuICAgIH1cbiAgICB0cnkgeyB0aGlzLm92ZXJsYXlQYW5lbD8uaGlkZSgpOyB9IGNhdGNoIChlKSB7fVxuICAgIC8vIGVuc3VyZSB3ZSB1cGRhdGUgc3RhcnQvZW5kIGNsYXNzZXMgYWZ0ZXIgYXBwbHlpbmcgYSBwcmVzZXRcbiAgICB0aGlzLl9zY2hlZHVsZVVwZGF0ZSgpO1xuICB9XG5cbiAgb25EYXRlUmFuZ2VDaGFuZ2UoZGF0ZVJhbmdlOiBEYXRlW10gfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5kYXRlUmFuZ2VDaGFuZ2UuZW1pdChkYXRlUmFuZ2UpO1xuICAgIGlmIChkYXRlUmFuZ2UgJiYgQXJyYXkuaXNBcnJheShkYXRlUmFuZ2UpKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkUHJlc2V0ID0gdGhpcy5kZXRlY3RQcmVzZXQoZGF0ZVJhbmdlWzBdLCBkYXRlUmFuZ2VbMV0pO1xuICAgICAgdGhpcy5jdXN0b21SYW5nZU1vZGUgPSBmYWxzZTtcbiAgICB9IGVsc2UgaWYgKCFkYXRlUmFuZ2UpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRQcmVzZXQgPSBudWxsO1xuICAgICAgdGhpcy5jdXN0b21SYW5nZU1vZGUgPSBmYWxzZTtcbiAgICB9XG4gIHRoaXMuX3NjaGVkdWxlVXBkYXRlKCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLl9zdG9wQ2FsZW5kYXJPYnNlcnZlcnMoKTtcbiAgICB0aGlzLl9jYW5jZWxTY2hlZHVsZWRVcGRhdGUoKTtcbiAgfVxuXG4gIC8vIFdhbGsgdGhlIHJlbmRlcmVkIGNhbGVuZGFyIERPTShzKSAob3ZlcmxheSArIGlubGluZSkgYW5kIGFkZCBzdGFydC1yYW5nZS9lbmQtcmFuZ2UgY2xhc3Nlc1xuICBwcml2YXRlIF91cGRhdGVTdGFydEVuZFJhbmdlQ2xhc3NlcygpOiB2b2lkIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY2FsZW5kYXJFbGVtZW50cyA9IHRoaXMuX2dldENhbGVuZGFyRWxlbWVudHMoKTtcblxuICAgICAgY2FsZW5kYXJFbGVtZW50cy5mb3JFYWNoKChjYWxFbDogRWxlbWVudCkgPT4ge1xuICAgICAgICAvLyBSZW1vdmUgZXhpc3RpbmcgY2xhc3NlcyBmcm9tIHNwYW5zIGZpcnN0XG4gICAgICAgIGNvbnN0IGFsbFNwYW5zID0gY2FsRWwucXVlcnlTZWxlY3RvckFsbCgndGQgPiBzcGFuJyk7XG4gICAgICAgIGFsbFNwYW5zLmZvckVhY2goKHNwYW4pID0+IHtcbiAgICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKHNwYW4sICdzdGFydC1yYW5nZScpO1xuICAgICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3Moc3BhbiwgJ2VuZC1yYW5nZScpO1xuICAgICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3Moc3BhbiwgJ2JldHdlZW4tcmFuZ2UnKTtcbiAgICAgICAgfSk7XG5cbiAgLy8gQ29sbGVjdCBzcGFuL2RhdGUgcGFpcnMsIHByZWZlciBkYXRhLWRhdGUgYXR0cmlidXRlXG4gIC8vIENhY2hlIGhlYWRlciBtb250aC95ZWFyIGZvciB0aGlzIGNhbGVuZGFyIHRvIGF2b2lkIHF1ZXJ5aW5nIHBlci1zcGFuXG4gIGNvbnN0IHBhbmVsTm9kZSA9IGNhbEVsLmNsb3Nlc3QoJy5wLWRhdGVwaWNrZXInKSB8fCBjYWxFbDtcbiAgY29uc3QgaGVhZGVyTW9udGhOb2RlID0gKHBhbmVsTm9kZSBhcyBFbGVtZW50KS5xdWVyeVNlbGVjdG9yKCcucC1kYXRlcGlja2VyLWhlYWRlciAucC1kYXRlcGlja2VyLXRpdGxlIC5wLWRhdGVwaWNrZXItbW9udGgnKTtcbiAgY29uc3QgaGVhZGVyWWVhck5vZGUgPSAocGFuZWxOb2RlIGFzIEVsZW1lbnQpLnF1ZXJ5U2VsZWN0b3IoJy5wLWRhdGVwaWNrZXItaGVhZGVyIC5wLWRhdGVwaWNrZXItdGl0bGUgLnAtZGF0ZXBpY2tlci15ZWFyJyk7XG4gIGNvbnN0IGhlYWRlck1vbnRoSWR4ID0gaGVhZGVyTW9udGhOb2RlICYmIGhlYWRlck1vbnRoTm9kZS50ZXh0Q29udGVudCA/ICh0aGlzLmVuTG9jYWxlLm1vbnRoTmFtZXMgfHwgW10pLmluZGV4T2YoaGVhZGVyTW9udGhOb2RlLnRleHRDb250ZW50LnRyaW0oKSkgOiBOYU47XG4gIGNvbnN0IGhlYWRlclllYXJWYWwgPSBoZWFkZXJZZWFyTm9kZSAmJiBoZWFkZXJZZWFyTm9kZS50ZXh0Q29udGVudCA/IHBhcnNlSW50KGhlYWRlclllYXJOb2RlLnRleHRDb250ZW50LnRyaW0oKSwgMTApIDogTmFOO1xuICAgICAgICBjb25zdCBpdGVtczogeyBkdDogRGF0ZTsgc3BhbjogRWxlbWVudDsgdGQ/OiBIVE1MRWxlbWVudCB8IG51bGwgfVtdID0gW107XG4gICAgICAgIGNvbnN0IHNwYW5zID0gY2FsRWwucXVlcnlTZWxlY3RvckFsbCgndGQgPiBzcGFuLnAtaGlnaGxpZ2h0Jyk7XG4gICAgICAgIHNwYW5zLmZvckVhY2goKHNwYW4pID0+IHtcbiAgICAgICAgICBjb25zdCB0ZCA9IHNwYW4uY2xvc2VzdCgndGQnKSBhcyBIVE1MRWxlbWVudCB8IG51bGw7XG4gICAgICAgICAgLy8gVHJ5IHRvIHJlYWQgZGF0YS1kYXRlIGF0dHJpYnV0ZSwgd2hpY2ggc29tZSBQcmltZU5HIHZlcnNpb25zIHJlbmRlciBvbiBzcGFuL3RkXG4gICAgICAgICAgbGV0IGRhdGFEYXRlID0gc3Bhbi5nZXRBdHRyaWJ1dGUoJ2RhdGEtZGF0ZScpO1xuICAgICAgICAgIGlmICghZGF0YURhdGUgJiYgdGQpIGRhdGFEYXRlID0gdGQuZ2V0QXR0cmlidXRlKCdkYXRhLWRhdGUnKTtcbiAgICAgICAgICBpZiAoZGF0YURhdGUpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcnRzID0gZGF0YURhdGUuc3BsaXQoJy0nKS5tYXAoKHApID0+IHBhcnNlSW50KHAsIDEwKSk7XG4gICAgICAgICAgICBpZiAocGFydHMubGVuZ3RoID49IDMgJiYgcGFydHMuZXZlcnkoKG4pID0+ICFpc05hTihuKSkpIHtcbiAgICAgICAgICAgICAgY29uc3QgW3ksIG0sIGRdID0gcGFydHM7XG4gICAgICAgICAgICAgIGNvbnN0IGR0ID0gbmV3IERhdGUoeSwgbSAtIDEsIGQpO1xuICAgICAgICAgICAgICBpdGVtcy5wdXNoKHsgZHQsIHRkLCBzcGFuIH0pO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIEZhbGxiYWNrOiBwYXJzZSBkYXkgbnVtYmVyIGFuZCBpbmZlciBtb250aC95ZWFyIGZyb20gbmVhcmJ5IGhlYWRlciBpbiB0aGUgc2FtZSAucC1kYXRlcGlja2VyXG4gICAgICAgICAgY29uc3QgZGF5VGV4dCA9IChzcGFuLnRleHRDb250ZW50IHx8ICcnKS50cmltKCk7XG4gICAgICAgICAgY29uc3QgZGF5ID0gcGFyc2VJbnQoZGF5VGV4dCwgMTApO1xuICAgICAgICAgIGlmICghaXNOYU4oZGF5KSAmJiB0ZCkge1xuICAgICAgICAgICAgLy8gVXNlIGNhY2hlZCBoZWFkZXIgbW9udGgveWVhciB3aGVuIGF2YWlsYWJsZVxuICAgICAgICAgICAgaWYgKCFpc05hTihoZWFkZXJNb250aElkeCkgJiYgIWlzTmFOKGhlYWRlclllYXJWYWwpKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGR0ID0gbmV3IERhdGUoaGVhZGVyWWVhclZhbCwgaGVhZGVyTW9udGhJZHgsIGRheSk7XG4gICAgICAgICAgICAgIGl0ZW1zLnB1c2goeyBkdCwgdGQsIHNwYW4gfSk7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gbGFzdCByZXNvcnQ6IGlnbm9yZSBzcGFuIGlmIGRhdGUgY2Fubm90IGJlIGRldGVybWluZWRcbiAgICAgICAgfSk7XG5cbiAgaWYgKGl0ZW1zLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICAgIC8vIFNvcnQgaXRlbXMgdG8gZmluZCBtaW4vbWF4IChzdGFydCAmIGVuZClcbiAgICAgICAgaXRlbXMuc29ydCgoYSwgYikgPT4gYS5kdC5nZXRUaW1lKCkgLSBiLmR0LmdldFRpbWUoKSk7XG4gICAgICAgIGNvbnN0IGRldGVjdGVkU3RhcnQgPSBpdGVtc1swXS5kdDtcbiAgICAgICAgY29uc3QgZGV0ZWN0ZWRFbmQgPSBpdGVtc1tpdGVtcy5sZW5ndGggLSAxXS5kdDtcblxuICAvLyBQcmVmZXJyZWQgcmFuZ2UgaXMgbW9kZWxEYXRlL3NlbGVjdGVkRGF0ZSBpZiBwcmVzZW50XG4gIGNvbnN0IHJhbmdlID0gKHRoaXMuc2VsZWN0ZWREYXRlICYmIHRoaXMuc2VsZWN0ZWREYXRlLmxlbmd0aCA9PT0gMikgPyB0aGlzLnNlbGVjdGVkRGF0ZSA6ICh0aGlzLm1vZGVsRGF0ZSAmJiB0aGlzLm1vZGVsRGF0ZS5sZW5ndGggPT09IDIgPyB0aGlzLm1vZGVsRGF0ZSA6IFtkZXRlY3RlZFN0YXJ0LCBkZXRlY3RlZEVuZF0pO1xuICBjb25zdCBzdGFydERhdGUgPSByYW5nZSAmJiByYW5nZVswXSA/IHRoaXMubm9ybWFsaXplRGF0ZShyYW5nZVswXSBhcyBEYXRlKSA6IGRldGVjdGVkU3RhcnQ7XG4gIGNvbnN0IGVuZERhdGUgPSByYW5nZSAmJiByYW5nZVsxXSA/IHRoaXMubm9ybWFsaXplRGF0ZShyYW5nZVsxXSBhcyBEYXRlKSA6IGRldGVjdGVkRW5kO1xuXG4gICAgICAgIC8vIEZvciBlYWNoIGl0ZW0sIGFkZCBzdGFydC1yYW5nZSxlbmQtcmFuZ2UsIG9yIGJldHdlZW4tcmFuZ2UgYmFzZWQgb24gZGF0ZVxuICAgICAgICBjb25zdCBzVGltZSA9IHN0YXJ0RGF0ZS5nZXRUaW1lKCk7XG4gICAgICAgIGNvbnN0IGVUaW1lID0gZW5kRGF0ZS5nZXRUaW1lKCk7XG4gICAgICAgIGZvciAoY29uc3QgaXQgb2YgaXRlbXMpIHtcbiAgICAgICAgICBjb25zdCB0ID0gaXQuZHQuZ2V0VGltZSgpO1xuICAgICAgICAgIGlmIChzVGltZSA9PT0gZVRpbWUgJiYgdCA9PT0gc1RpbWUpIHtcbiAgICAgICAgICAgIC8vIHNpbmdsZS1kYXkgcmFuZ2UsIG1hcmsgYm90aCBzdGFydCAmIGVuZFxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhpdC5zcGFuLCAnc3RhcnQtcmFuZ2UnKTtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MoaXQuc3BhbiwgJ2VuZC1yYW5nZScpO1xuICAgICAgICAgIH0gZWxzZSBpZiAodCA9PT0gc1RpbWUpIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MoaXQuc3BhbiwgJ3N0YXJ0LXJhbmdlJyk7XG4gICAgICAgICAgfSBlbHNlIGlmICh0ID09PSBlVGltZSkge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhpdC5zcGFuLCAnZW5kLXJhbmdlJyk7XG4gICAgICAgICAgfSBlbHNlIGlmICh0ID4gc1RpbWUgJiYgdCA8IGVUaW1lKSB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKGl0LnNwYW4sICdiZXR3ZWVuLXJhbmdlJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBpZ25vcmUgRE9NIGVycm9ycyAoZS5nLiwgc2VydmVyLXNpZGUgcmVuZGVyaW5nIC8gbWlzc2luZyBlbGVtZW50cylcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGlzb0RhdGUoZDogRGF0ZSk6IHN0cmluZyB7XG4gICAgY29uc3QgeSA9IGQuZ2V0RnVsbFllYXIoKTtcbiAgICBjb25zdCBtID0gU3RyaW5nKGQuZ2V0TW9udGgoKSArIDEpLnBhZFN0YXJ0KDIsICcwJyk7XG4gICAgY29uc3QgZGF5ID0gU3RyaW5nKGQuZ2V0RGF0ZSgpKS5wYWRTdGFydCgyLCAnMCcpO1xuICAgIHJldHVybiBgJHt5fS0ke219LSR7ZGF5fWA7XG4gIH1cblxuICBwcml2YXRlIF9maW5kRWxlbWVudEJ5RGF0ZShkYXRlPzogRGF0ZSk6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIWRhdGUpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgeSA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICBjb25zdCBtID0gZGF0ZS5nZXRNb250aCgpICsgMTsgLy8gMS4uMTJcbiAgICBjb25zdCBkID0gZGF0ZS5nZXREYXRlKCk7XG4gICAgY29uc3QgaXNvVW5wYWRkZWQgPSBgJHt5fS0ke219LSR7ZH1gOyAvLyBlLmcuIDIwMjUtMTEtMVxuICAgIGNvbnN0IGlzb1BhZGRlZCA9IGAke3l9LSR7U3RyaW5nKG0pLnBhZFN0YXJ0KDIsICcwJyl9LSR7U3RyaW5nKGQpLnBhZFN0YXJ0KDIsICcwJyl9YDsgLy8gMjAyNS0xMS0wMVxuICAgIGNvbnN0IHNlbGVjdG9ycyA9IFtgW2RhdGEtZGF0ZT1cIiR7aXNvVW5wYWRkZWR9XCJdYCwgYFtkYXRhLWRhdGU9XCIke2lzb1BhZGRlZH1cIl1gXTtcbiAgICBmb3IgKGNvbnN0IHNlbCBvZiBzZWxlY3RvcnMpIHtcbiAgICAgIGNvbnN0IGZvdW5kSW5PdmVybGF5ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgLmF0b21peC1vdmVybGF5LWNhbGVuZGFyICR7c2VsfWApIGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICAgIGlmIChmb3VuZEluT3ZlcmxheSkgcmV0dXJuIGZvdW5kSW5PdmVybGF5LmNsb3Nlc3QoJ3RkJykgYXMgSFRNTEVsZW1lbnQgfCBudWxsIHx8IGZvdW5kSW5PdmVybGF5O1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHNlbCBvZiBzZWxlY3RvcnMpIHtcbiAgICAgIGNvbnN0IGZvdW5kID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWwpIGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICAgIGlmIChmb3VuZCkgcmV0dXJuIGZvdW5kLmNsb3Nlc3QoJ3RkJykgYXMgSFRNTEVsZW1lbnQgfCBudWxsIHx8IGZvdW5kO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBfc3RhcnRDYWxlbmRhck9ic2VydmVycygpOiB2b2lkIHtcbiAgICAvLyBzdG9wIGZpcnN0IHRvIGF2b2lkIGR1cGxpY2F0ZXNcbiAgICB0aGlzLl9zdG9wQ2FsZW5kYXJPYnNlcnZlcnMoKTtcbiAgICB0cnkge1xuICBjb25zdCBjYWxFbHMgPSB0aGlzLl9nZXRDYWxlbmRhckVsZW1lbnRzKCk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwYW5lbCA9IHRoaXMub3ZlcmxheVBhbmVsIGFzIGFueTtcbiAgICAgICAgaWYgKHBhbmVsICYmIHBhbmVsLmVsICYmIHBhbmVsLmVsLm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgICBjb25zdCBlbCA9IHBhbmVsLmVsLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignLnAtZGF0ZXBpY2tlcicpO1xuICAgICAgICAgIGlmIChlbCkgY2FsRWxzLnB1c2goZWwgYXMgRWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHt9XG5cbiAgICAgIGNhbEVscy5mb3JFYWNoKChlbCkgPT4ge1xuICAgICAgICBjb25zdCBvYnMgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigoKSA9PiB7XG4gICAgICAgICAgLy8gUmVhcHBseSBjbGFzc2VzIGFmdGVyIERPTSBjaGFuZ2VzIChkZWJvdW5jZWQpXG4gICAgICAgICAgdGhpcy5fc2NoZWR1bGVVcGRhdGUoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIFdhdGNoIGNoaWxkTGlzdCwgc3VidHJlZSBhbmQgY2xhc3MgYXR0cmlidXRlIGNoYW5nZXMgKHNwYW4gY2xhc3MgdG9nZ2xlcyBhcmUgY29tbW9uKVxuICAgICAgICBvYnMub2JzZXJ2ZShlbCwgeyBjaGlsZExpc3Q6IHRydWUsIHN1YnRyZWU6IHRydWUsIGF0dHJpYnV0ZXM6IHRydWUsIGF0dHJpYnV0ZUZpbHRlcjogWydjbGFzcyddIH0pO1xuICAgICAgICB0aGlzLl9jYWxlbmRhck9ic2VydmVycy5wdXNoKG9icyk7XG4gICAgICAgIHRoaXMuX29ic2VydmVkRWxlbWVudHMucHVzaChlbCk7XG4gICAgICAgIC8vIEFsc28gb2JzZXJ2ZSBwYXJlbnQgLSBpZiBQcmltZU5HIHJlcGxhY2VzIHRoZSAucC1kYXRlcGlja2VyIGVsZW1lbnQsIHBhcmVudCBjaGlsZExpc3QgY2hhbmdlcyB3aWxsIGZpcmVcbiAgICAgICAgY29uc3QgcGFyZW50ID0gZWwucGFyZW50RWxlbWVudDtcbiAgICAgICAgaWYgKHBhcmVudCAmJiB0aGlzLl9vYnNlcnZlZFBhcmVudEVsZW1lbnRzLmluZGV4T2YocGFyZW50KSA9PT0gLTEpIHtcbiAgICAgICAgICBjb25zdCBwYXJlbnRPYnMgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigoKSA9PiB7XG4gICAgICAgICAgICAvLyByZWF0dGFjaCBvYnNlcnZlcnMgc2luY2UgdGhlIGNhbEVsIG1heSBoYXZlIGJlZW4gcmVwbGFjZWRcbiAgICAgICAgICAgIHRoaXMuX3NjaGVkdWxlVXBkYXRlKCk7XG4gICAgICAgICAgICAvLyBkZXRhY2ggYW5kIHJlLWF0dGFjaCBvYnNlcnZlcnMgYWZ0ZXIgRE9NIHNldHRsZXNcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3N0b3BDYWxlbmRhck9ic2VydmVycygpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3N0YXJ0Q2FsZW5kYXJPYnNlcnZlcnMoKTtcbiAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgeyB9XG4gICAgICAgICAgICB9LCAxMDApOyAvLyBzbGlnaHRseSBsYXJnZXIgZGVsYXkgdG8gbGV0IFByaW1lTkcgZmluaXNoIHRoZSBtb250aCByZW5kZXJpbmdcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBwYXJlbnRPYnMub2JzZXJ2ZShwYXJlbnQsIHsgY2hpbGRMaXN0OiB0cnVlLCBzdWJ0cmVlOiBmYWxzZSB9KTtcbiAgICAgICAgICB0aGlzLl9wYXJlbnRPYnNlcnZlcnMucHVzaChwYXJlbnRPYnMpO1xuICAgICAgICAgIHRoaXMuX29ic2VydmVkUGFyZW50RWxlbWVudHMucHVzaChwYXJlbnQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBpZ25vcmVcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9zdG9wQ2FsZW5kYXJPYnNlcnZlcnMoKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuX2NhbGVuZGFyT2JzZXJ2ZXJzLmZvckVhY2goKG9icykgPT4gb2JzLmRpc2Nvbm5lY3QoKSk7XG4gICAgICB0aGlzLl9wYXJlbnRPYnNlcnZlcnMuZm9yRWFjaCgob2JzKSA9PiBvYnMuZGlzY29ubmVjdCgpKTtcbiAgICB9IGNhdGNoIChlKSB7IH1cbiAgICB0aGlzLl9jYWxlbmRhck9ic2VydmVycyA9IFtdO1xuICAgIHRoaXMuX29ic2VydmVkRWxlbWVudHMgPSBbXTtcbiAgICB0aGlzLl9wYXJlbnRPYnNlcnZlcnMgPSBbXTtcbiAgICB0aGlzLl9vYnNlcnZlZFBhcmVudEVsZW1lbnRzID0gW107XG4gIH1cblxuICBwcml2YXRlIF9zY2hlZHVsZVVwZGF0ZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fdXBkYXRlUmFmSWQgIT0gbnVsbCkgcmV0dXJuOyAvLyBhbHJlYWR5IHNjaGVkdWxlZFxuICAgIHRoaXMuX3VwZGF0ZVJhZklkID0gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICB0aGlzLl91cGRhdGVSYWZJZCA9IG51bGw7XG4gICAgICB0aGlzLl91cGRhdGVTdGFydEVuZFJhbmdlQ2xhc3NlcygpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfY2FuY2VsU2NoZWR1bGVkVXBkYXRlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl91cGRhdGVSYWZJZCAhPSBudWxsKSB7XG4gICAgICB3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5fdXBkYXRlUmFmSWQpO1xuICAgICAgdGhpcy5fdXBkYXRlUmFmSWQgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2dldENhbGVuZGFyRWxlbWVudHMoKTogRWxlbWVudFtdIHtcbiAgICBjb25zdCBjYWxFbHM6IEVsZW1lbnRbXSA9IFtdO1xuICAgIGNvbnN0IG92ZXJsYXlDYWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuYXRvbWl4LW92ZXJsYXktY2FsZW5kYXIgLnAtZGF0ZXBpY2tlcicpO1xuICAgIGNvbnN0IGlubGluZUNhbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5pbmxpbmUtY2FsZW5kYXIgLnAtZGF0ZXBpY2tlcicpO1xuICAgIGlmIChvdmVybGF5Q2FsKSBjYWxFbHMucHVzaChvdmVybGF5Q2FsKTtcbiAgICBpZiAoaW5saW5lQ2FsKSBjYWxFbHMucHVzaChpbmxpbmVDYWwpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBwYW5lbCA9IHRoaXMub3ZlcmxheVBhbmVsIGFzIGFueTtcbiAgICAgIGlmIChwYW5lbCAmJiBwYW5lbC5lbCAmJiBwYW5lbC5lbC5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IGVsID0gcGFuZWwuZWwubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcucC1kYXRlcGlja2VyJyk7XG4gICAgICAgIGlmIChlbCkgY2FsRWxzLnB1c2goZWwgYXMgRWxlbWVudCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkgeyB9XG4gICAgLy8gcmVtb3ZlIGR1cGxpY2F0ZXNcbiAgICByZXR1cm4gQXJyYXkuZnJvbShuZXcgU2V0KGNhbEVscykpO1xuICB9XG59XG4iLCI8ZGl2PlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlubGluZTsgZWxzZSBpbmxpbmVCbG9ja1wiPlxuICAgIDxkaXYgW25nQ2xhc3NdPVwic3R5bGVDbGFzc1wiIGNsYXNzPVwiaW5wdXQtd3JhcHBlclwiPlxuICAgICAgPGlucHV0XG4gICAgICAgIHBJbnB1dFRleHRcbiAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICBbbmdDbGFzc109XCJpbnB1dFN0eWxlQ2xhc3NcIlxuICAgICAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIlxuICAgICAgICBbdmFsdWVdPVwiZ2V0RGF0ZVJhbmdlTGFiZWwoKVwiXG4gICAgICAgIHJlYWRvbmx5XG4gICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgIChjbGljayk9XCJvdmVybGF5UGFuZWw/LnRvZ2dsZSgkZXZlbnQpXCJcbiAgICAgICAgKGtleWRvd24pPVwib25JbnB1dEtleURvd24oJGV2ZW50KVwiXG4gICAgICAvPlxuICAgICAgPGkgY2xhc3M9XCJwaSBwaS1jYWxlbmRhciBpbnB1dC1pY29uXCIgdGl0bGU9XCJPcGVuIGNhbGVuZGFyXCIgKGNsaWNrKT1cIiFkaXNhYmxlZCAmJiBvdmVybGF5UGFuZWw/LnRvZ2dsZSgkZXZlbnQpXCI+PC9pPlxuICAgICAgPGkgKm5nSWY9XCJoYXNTZWxlY3Rpb25cIiBjbGFzcz1cInBpIHBpLXRpbWVzIGlucHV0LWNsZWFyLWljb25cIiB0aXRsZT1cIkNsZWFyXCIgdGFiaW5kZXg9XCIwXCIgKGNsaWNrKT1cIiFkaXNhYmxlZCAmJiBjbGVhckFuZFN0b3AoJGV2ZW50KVwiIChrZXlkb3duLmVudGVyKT1cIiFkaXNhYmxlZCAmJiBjbGVhckFuZFN0b3AoJGV2ZW50KVwiIChrZXlkb3duLnNwYWNlKT1cIiFkaXNhYmxlZCAmJiBjbGVhckFuZFN0b3AoJGV2ZW50KVwiPjwvaT5cblxuICAgIDwvZGl2PlxuXG4gICAgPHAtb3ZlcmxheVBhbmVsICNvdmVybGF5UGFuZWwgW2Rpc21pc3NhYmxlXT1cInRydWVcIiBhcHBlbmRUbz1cImJvZHlcIiBzdHlsZUNsYXNzPVwiYXRvbWl4LWRhdGUtcmFuZ2Utb3ZlcmxheVwiIChvblNob3cpPVwib25PdmVybGF5U2hvdygpXCIgKG9uSGlkZSk9XCJvbk92ZXJsYXlIaWRlKClcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJvdmVybGF5LWlubmVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJvdmVybGF5LWxlZnRcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJlc2V0LWxpc3RcIj5cbiAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInByZXNldC1idG5cIiAoY2xpY2spPVwiYXBwbHlQcmVzZXQoJ3RvZGF5JylcIiBbbmdDbGFzc109XCJ7ICdhY3RpdmUnOiBzZWxlY3RlZFByZXNldCA9PT0gJ3RvZGF5JyB9XCIgbGFiZWw9XCJUb2RheVwiPjwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwicHJlc2V0LWJ0blwiIChjbGljayk9XCJhcHBseVByZXNldCgneWVzdGVyZGF5JylcIiBbbmdDbGFzc109XCJ7ICdhY3RpdmUnOiBzZWxlY3RlZFByZXNldCA9PT0gJ3llc3RlcmRheScgfVwiIGxhYmVsPVwiWWVzdGVyZGF5XCI+PC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJwcmVzZXQtYnRuXCIgKGNsaWNrKT1cImFwcGx5UHJlc2V0KCdsYXN0N2RheXMnKVwiIFtuZ0NsYXNzXT1cInsgJ2FjdGl2ZSc6IHNlbGVjdGVkUHJlc2V0ID09PSAnbGFzdDdkYXlzJyB9XCIgbGFiZWw9XCJMYXN0IDcgZGF5c1wiPjwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwicHJlc2V0LWJ0blwiIChjbGljayk9XCJhcHBseVByZXNldCgnbGFzdDMwZGF5cycpXCIgW25nQ2xhc3NdPVwieyAnYWN0aXZlJzogc2VsZWN0ZWRQcmVzZXQgPT09ICdsYXN0MzBkYXlzJyB9XCIgbGFiZWw9XCJMYXN0IDMwIGRheXNcIj48L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInByZXNldC1idG5cIiAoY2xpY2spPVwiYXBwbHlQcmVzZXQoJ2xhc3QzbW9udGhzJylcIiBbbmdDbGFzc109XCJ7ICdhY3RpdmUnOiBzZWxlY3RlZFByZXNldCA9PT0gJ2xhc3QzbW9udGhzJyB9XCIgbGFiZWw9XCJMYXN0IDMgbW9udGhzXCI+PC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJwcmVzZXQtYnRuXCIgKGNsaWNrKT1cImFwcGx5UHJlc2V0KCdsYXN0Nm1vbnRocycpXCIgW25nQ2xhc3NdPVwieyAnYWN0aXZlJzogc2VsZWN0ZWRQcmVzZXQgPT09ICdsYXN0Nm1vbnRocycgfVwiIGxhYmVsPVwiTGFzdCA2IG1vbnRoc1wiPjwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwicHJlc2V0LWJ0blwiIChjbGljayk9XCJhcHBseVByZXNldCgnbGFzdDF5ZWFyJylcIiBbbmdDbGFzc109XCJ7ICdhY3RpdmUnOiBzZWxlY3RlZFByZXNldCA9PT0gJ2xhc3QxeWVhcicgfVwiIGxhYmVsPVwiTGFzdCAxIHllYXJcIj48L2J1dHRvbj5cbiAgICAgICAgICAgIDxhIGNsYXNzPVwicmVzZXQtbGlua1wiIChjbGljayk9XCJyZXNldEFuZENsb3NlKClcIj5SZXNldDwvYT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJvdmVybGF5LXJpZ2h0XCI+XG4gICAgICAgICAgPHAtY2FsZW5kYXIgWyhuZ01vZGVsKV09XCJtb2RlbERhdGVcIiBbc2VsZWN0aW9uTW9kZV09XCIncmFuZ2UnXCIgW2lubGluZV09XCJ0cnVlXCIgW2RhdGVGb3JtYXRdPVwiJ21tL2RkL3l5eXknXCIgW3Nob3dPdGhlck1vbnRoc109XCJ0cnVlXCIgW2xvY2FsZV09XCJlbkxvY2FsZVwiIFtzaG93SWNvbl09XCJmYWxzZVwiIFtzdHlsZUNsYXNzXT1cIidhdG9taXgtb3ZlcmxheS1jYWxlbmRhcidcIiAobmdNb2RlbENoYW5nZSk9XCJvbk1vZGVsQ2hhbmdlKCRldmVudClcIiAob25Nb250aENoYW5nZSk9XCJvbkNhbGVuZGFyVmlld0NoYW5nZWQoJGV2ZW50KVwiIChvblllYXJDaGFuZ2UpPVwib25DYWxlbmRhclZpZXdDaGFuZ2VkKCRldmVudClcIiBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIiBbbWF4RGF0ZV09XCJtYXhEYXRlXCIgW21pbkRhdGVdPVwibWluRGF0ZVwiPjwvcC1jYWxlbmRhcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L3Atb3ZlcmxheVBhbmVsPlxuICA8L25nLWNvbnRhaW5lcj5cblxuICA8bmctdGVtcGxhdGUgI2lubGluZUJsb2NrPlxuICAgIDxkaXYgW25nQ2xhc3NdPVwic3R5bGVDbGFzc1wiIGNsYXNzPVwiaW5wdXQtd3JhcHBlclwiPlxuICAgICAgPGlucHV0XG4gICAgICAgIHBJbnB1dFRleHRcbiAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICBbbmdDbGFzc109XCJpbnB1dFN0eWxlQ2xhc3NcIlxuICAgICAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIlxuICAgICAgICBbdmFsdWVdPVwiZ2V0RGF0ZVJhbmdlTGFiZWwoKVwiXG4gICAgICAgIHJlYWRvbmx5XG4gICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgIChrZXlkb3duKT1cIm9uSW5wdXRLZXlEb3duKCRldmVudClcIlxuICAgICAgLz5cbiAgICAgIDxpIGNsYXNzPVwicGkgcGktY2FsZW5kYXIgaW5wdXQtaWNvblwiIHRpdGxlPVwiT3BlbiBjYWxlbmRhclwiPjwvaT5cbiAgICAgIDxpICpuZ0lmPVwiaGFzU2VsZWN0aW9uXCIgY2xhc3M9XCJwaSBwaS10aW1lcyBpbnB1dC1jbGVhci1pY29uXCIgdGl0bGU9XCJDbGVhclwiIHRhYmluZGV4PVwiMFwiIChjbGljayk9XCJjbGVhckFuZFN0b3AoJGV2ZW50KVwiIChrZXlkb3duLmVudGVyKT1cImNsZWFyQW5kU3RvcCgkZXZlbnQpXCIgKGtleWRvd24uc3BhY2UpPVwiY2xlYXJBbmRTdG9wKCRldmVudClcIj48L2k+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cIm92ZXJsYXktaW5uZXIgaW5saW5lLWNhbGVuZGFyIGZsZXhcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJvdmVybGF5LWxlZnRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInByZXNldC1saXN0XCI+XG4gICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwicHJlc2V0LWJ0blwiIChjbGljayk9XCJhcHBseVByZXNldCgndG9kYXknKVwiIFtuZ0NsYXNzXT1cInsgJ2FjdGl2ZSc6IHNlbGVjdGVkUHJlc2V0ID09PSAndG9kYXknIH1cIiBsYWJlbD1cIlRvZGF5XCI+PC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwicHJlc2V0LWJ0blwiIChjbGljayk9XCJhcHBseVByZXNldCgneWVzdGVyZGF5JylcIiBbbmdDbGFzc109XCJ7ICdhY3RpdmUnOiBzZWxlY3RlZFByZXNldCA9PT0gJ3llc3RlcmRheScgfVwiIGxhYmVsPVwiWWVzdGVyZGF5XCI+PC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwicHJlc2V0LWJ0blwiIChjbGljayk9XCJhcHBseVByZXNldCgnbGFzdDdkYXlzJylcIiBbbmdDbGFzc109XCJ7ICdhY3RpdmUnOiBzZWxlY3RlZFByZXNldCA9PT0gJ2xhc3Q3ZGF5cycgfVwiIGxhYmVsPVwiTGFzdCA3IGRheXNcIj48L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gcFJpcHBsZSB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJwcmVzZXQtYnRuXCIgKGNsaWNrKT1cImFwcGx5UHJlc2V0KCdsYXN0MzBkYXlzJylcIiBbbmdDbGFzc109XCJ7ICdhY3RpdmUnOiBzZWxlY3RlZFByZXNldCA9PT0gJ2xhc3QzMGRheXMnIH1cIiBsYWJlbD1cIkxhc3QgMzAgZGF5c1wiPjwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiBwUmlwcGxlIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInByZXNldC1idG5cIiAoY2xpY2spPVwiYXBwbHlQcmVzZXQoJ2xhc3QzbW9udGhzJylcIiBbbmdDbGFzc109XCJ7ICdhY3RpdmUnOiBzZWxlY3RlZFByZXNldCA9PT0gJ2xhc3QzbW9udGhzJyB9XCIgbGFiZWw9XCJMYXN0IDMgbW9udGhzXCI+PC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHBSaXBwbGUgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwicHJlc2V0LWJ0blwiIChjbGljayk9XCJhcHBseVByZXNldCgnbGFzdDF5ZWFyJylcIiBbbmdDbGFzc109XCJ7ICdhY3RpdmUnOiBzZWxlY3RlZFByZXNldCA9PT0gJ2xhc3QxeWVhcicgfVwiIGxhYmVsPVwiTGFzdCAxIHllYXJcIj48L2J1dHRvbj5cbiAgICAgICAgICA8YSBjbGFzcz1cInJlc2V0LWxpbmtcIiAoY2xpY2spPVwicmVzZXRBbmRDbG9zZSgpXCI+UmVzZXQ8L2E+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJvdmVybGF5LXJpZ2h0XCI+XG4gIDxwLWNhbGVuZGFyIFsobmdNb2RlbCldPVwibW9kZWxEYXRlXCIgW3NlbGVjdGlvbk1vZGVdPVwiJ3JhbmdlJ1wiIFtpbmxpbmVdPVwidHJ1ZVwiIFtkYXRlRm9ybWF0XT1cIidtbS9kZC95eXl5J1wiIFtzaG93T3RoZXJNb250aHNdPVwidHJ1ZVwiIFtsb2NhbGVdPVwiZW5Mb2NhbGVcIiBbc2hvd0ljb25dPVwiZmFsc2VcIiBbc3R5bGVDbGFzc109XCInYXRvbWl4LW92ZXJsYXktY2FsZW5kYXInXCIgKG5nTW9kZWxDaGFuZ2UpPVwib25Nb2RlbENoYW5nZSgkZXZlbnQpXCIgKG9uTW9udGhDaGFuZ2UpPVwib25DYWxlbmRhclZpZXdDaGFuZ2VkKCRldmVudClcIiAob25ZZWFyQ2hhbmdlKT1cIm9uQ2FsZW5kYXJWaWV3Q2hhbmdlZCgkZXZlbnQpXCIgW2Rpc2FibGVkXT1cImRpc2FibGVkXCIgW21heERhdGVdPVwibWF4RGF0ZVwiIFttaW5EYXRlXT1cIm1pbkRhdGVcIj48L3AtY2FsZW5kYXI+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9uZy10ZW1wbGF0ZT5cbjwvZGl2PlxuIl19