@ardium-ui/ui 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (491) hide show
  1. package/README.md +25 -0
  2. package/esm2022/ardium-ui-ui.mjs +5 -0
  3. package/esm2022/lib/_internal/boolean-component.mjs +108 -0
  4. package/esm2022/lib/_internal/clear-button/clear-button.component.mjs +12 -0
  5. package/esm2022/lib/_internal/clear-button/clear-button.module.mjs +18 -0
  6. package/esm2022/lib/_internal/disablable-component.mjs +44 -0
  7. package/esm2022/lib/_internal/focusable-component.mjs +91 -0
  8. package/esm2022/lib/_internal/item-storages/dropdown-item-storage.mjs +436 -0
  9. package/esm2022/lib/_internal/item-storages/simple-item-storage.mjs +349 -0
  10. package/esm2022/lib/_internal/item-storages/simplest-item-storage.mjs +155 -0
  11. package/esm2022/lib/_internal/models/pagination.model.mjs +124 -0
  12. package/esm2022/lib/_internal/ngmodel-component.mjs +42 -0
  13. package/esm2022/lib/_internal/queue.mjs +59 -0
  14. package/esm2022/lib/_internal/selectable-list-component.mjs +304 -0
  15. package/esm2022/lib/badge/badge.directive.mjs +123 -0
  16. package/esm2022/lib/badge/badge.module.mjs +18 -0
  17. package/esm2022/lib/badge/badge.types.mjs +16 -0
  18. package/esm2022/lib/buttons/_button-base.mjs +45 -0
  19. package/esm2022/lib/buttons/button/button.component.mjs +49 -0
  20. package/esm2022/lib/buttons/button/button.module.mjs +18 -0
  21. package/esm2022/lib/buttons/fab/fab.component.mjs +40 -0
  22. package/esm2022/lib/buttons/fab/fab.module.mjs +18 -0
  23. package/esm2022/lib/buttons/general-button.types.mjs +55 -0
  24. package/esm2022/lib/buttons/icon-button/icon-button.component.mjs +37 -0
  25. package/esm2022/lib/buttons/icon-button/icon-button.module.mjs +18 -0
  26. package/esm2022/lib/calendar/calendar.component.mjs +982 -0
  27. package/esm2022/lib/calendar/calendar.directives.mjs +107 -0
  28. package/esm2022/lib/calendar/calendar.helpers.mjs +47 -0
  29. package/esm2022/lib/calendar/calendar.module.mjs +21 -0
  30. package/esm2022/lib/calendar/calendar.types.mjs +11 -0
  31. package/esm2022/lib/card/card.children.mjs +97 -0
  32. package/esm2022/lib/card/card.component.mjs +40 -0
  33. package/esm2022/lib/card/card.module.mjs +59 -0
  34. package/esm2022/lib/card/card.types.mjs +9 -0
  35. package/esm2022/lib/checkbox/checkbox.component.mjs +73 -0
  36. package/esm2022/lib/checkbox/checkbox.module.mjs +18 -0
  37. package/esm2022/lib/checkbox/checkbox.types.mjs +6 -0
  38. package/esm2022/lib/checkbox-list/checkbox-list.component.mjs +139 -0
  39. package/esm2022/lib/checkbox-list/checkbox-list.module.mjs +19 -0
  40. package/esm2022/lib/checkbox-list/checkbox-list.types.mjs +7 -0
  41. package/esm2022/lib/chip/chip.component.mjs +55 -0
  42. package/esm2022/lib/chip/chip.module.mjs +21 -0
  43. package/esm2022/lib/chip/deletable-chip/deletable-chip.component.mjs +80 -0
  44. package/esm2022/lib/chip/selectable-chip/selectable-chip.component.mjs +77 -0
  45. package/esm2022/lib/color/color-display/color-display.component.mjs +48 -0
  46. package/esm2022/lib/color/color-display/color-display.module.mjs +18 -0
  47. package/esm2022/lib/color/color-display/color-display.types.mjs +9 -0
  48. package/esm2022/lib/color/color-picker/color-picker.component.mjs +484 -0
  49. package/esm2022/lib/color/color-picker/color-picker.directives.mjs +55 -0
  50. package/esm2022/lib/color/color-picker/color-picker.module.mjs +43 -0
  51. package/esm2022/lib/color/color-picker/color-picker.types.mjs +11 -0
  52. package/esm2022/lib/dialog/dialog.component.mjs +167 -0
  53. package/esm2022/lib/dialog/dialog.directives.mjs +14 -0
  54. package/esm2022/lib/dialog/dialog.module.mjs +21 -0
  55. package/esm2022/lib/dialog/dialog.types.mjs +6 -0
  56. package/esm2022/lib/divider/divider.component.mjs +26 -0
  57. package/esm2022/lib/divider/divider.module.mjs +18 -0
  58. package/esm2022/lib/dropdown-panel/dropdown-panel.component.mjs +130 -0
  59. package/esm2022/lib/dropdown-panel/dropdown-panel.module.mjs +18 -0
  60. package/esm2022/lib/dropdown-panel/dropdown-panel.types.mjs +10 -0
  61. package/esm2022/lib/file-inputs/file-drop-area/file-drop-area.component.mjs +82 -0
  62. package/esm2022/lib/file-inputs/file-drop-area/file-drop-area.directives.mjs +42 -0
  63. package/esm2022/lib/file-inputs/file-drop-area/file-drop-area.module.mjs +58 -0
  64. package/esm2022/lib/file-inputs/file-input/file-input.component.mjs +153 -0
  65. package/esm2022/lib/file-inputs/file-input/file-input.directives.mjs +73 -0
  66. package/esm2022/lib/file-inputs/file-input/file-input.module.mjs +21 -0
  67. package/esm2022/lib/file-inputs/file-input-base.mjs +187 -0
  68. package/esm2022/lib/file-inputs/file-input-types.mjs +2 -0
  69. package/esm2022/lib/form-field-frame/form-field-frame.component.mjs +74 -0
  70. package/esm2022/lib/form-field-frame/form-field-frame.directives.mjs +25 -0
  71. package/esm2022/lib/form-field-frame/form-field-frame.module.mjs +19 -0
  72. package/esm2022/lib/icon/icon.component.mjs +85 -0
  73. package/esm2022/lib/icon/icon.module.mjs +19 -0
  74. package/esm2022/lib/icon/icon.pipe.mjs +18 -0
  75. package/esm2022/lib/inputs/color-input/color-input.component.mjs +421 -0
  76. package/esm2022/lib/inputs/color-input/color-input.directives.mjs +101 -0
  77. package/esm2022/lib/inputs/color-input/color-input.module.mjs +85 -0
  78. package/esm2022/lib/inputs/color-input/color-input.types.mjs +2 -0
  79. package/esm2022/lib/inputs/digit-input/digit-input.component.mjs +218 -0
  80. package/esm2022/lib/inputs/digit-input/digit-input.model.mjs +217 -0
  81. package/esm2022/lib/inputs/digit-input/digit-input.module.mjs +18 -0
  82. package/esm2022/lib/inputs/digit-input/digit-input.types.mjs +15 -0
  83. package/esm2022/lib/inputs/digit-input/digit-input.utils.mjs +8 -0
  84. package/esm2022/lib/inputs/hex-input/hex-input.component.mjs +234 -0
  85. package/esm2022/lib/inputs/hex-input/hex-input.directives.mjs +36 -0
  86. package/esm2022/lib/inputs/hex-input/hex-input.module.mjs +21 -0
  87. package/esm2022/lib/inputs/hex-input.model.mjs +106 -0
  88. package/esm2022/lib/inputs/input/input.component.mjs +344 -0
  89. package/esm2022/lib/inputs/input/input.directives.mjs +58 -0
  90. package/esm2022/lib/inputs/input/input.module.mjs +47 -0
  91. package/esm2022/lib/inputs/input-transformers.mjs +66 -0
  92. package/esm2022/lib/inputs/input-types.mjs +6 -0
  93. package/esm2022/lib/inputs/input-utils.mjs +205 -0
  94. package/esm2022/lib/inputs/number-input/number-input.component.mjs +289 -0
  95. package/esm2022/lib/inputs/number-input/number-input.directives.mjs +14 -0
  96. package/esm2022/lib/inputs/number-input/number-input.module.mjs +21 -0
  97. package/esm2022/lib/inputs/password-input/password-input.component.mjs +222 -0
  98. package/esm2022/lib/inputs/password-input/password-input.directives.mjs +49 -0
  99. package/esm2022/lib/inputs/password-input/password-input.module.mjs +41 -0
  100. package/esm2022/lib/inputs/password-input/password-input.types.mjs +2 -0
  101. package/esm2022/lib/inputs/simple-input/simple-input.component.mjs +219 -0
  102. package/esm2022/lib/inputs/simple-input/simple-input.directives.mjs +36 -0
  103. package/esm2022/lib/inputs/simple-input/simple-input.module.mjs +37 -0
  104. package/esm2022/lib/kbd/kbd.component.mjs +42 -0
  105. package/esm2022/lib/kbd/kbd.module.mjs +19 -0
  106. package/esm2022/lib/kbd/kbd.pipe.mjs +17 -0
  107. package/esm2022/lib/kbd-shortcut/kbd-shortcut.component.mjs +55 -0
  108. package/esm2022/lib/kbd-shortcut/kbd-shortcut.module.mjs +19 -0
  109. package/esm2022/lib/modal/modal.component.mjs +120 -0
  110. package/esm2022/lib/modal/modal.module.mjs +21 -0
  111. package/esm2022/lib/option/option.component.mjs +77 -0
  112. package/esm2022/lib/option/option.module.mjs +18 -0
  113. package/esm2022/lib/progress-bar/progress-bar.component.mjs +95 -0
  114. package/esm2022/lib/progress-bar/progress-bar.directive.mjs +14 -0
  115. package/esm2022/lib/progress-bar/progress-bar.module.mjs +19 -0
  116. package/esm2022/lib/progress-bar/progress-bar.types.mjs +19 -0
  117. package/esm2022/lib/progress-circle/progress-circle.component.mjs +94 -0
  118. package/esm2022/lib/progress-circle/progress-circle.directive.mjs +14 -0
  119. package/esm2022/lib/progress-circle/progress-circle.module.mjs +19 -0
  120. package/esm2022/lib/progress-circle/progress-circle.types.mjs +10 -0
  121. package/esm2022/lib/radio/radio/radio.component.mjs +53 -0
  122. package/esm2022/lib/radio/radio-group.component.mjs +207 -0
  123. package/esm2022/lib/radio/radio.module.mjs +19 -0
  124. package/esm2022/lib/search-functions.mjs +64 -0
  125. package/esm2022/lib/segment/segment.component.mjs +168 -0
  126. package/esm2022/lib/segment/segment.directives.mjs +14 -0
  127. package/esm2022/lib/segment/segment.module.mjs +19 -0
  128. package/esm2022/lib/segment/segment.types.mjs +12 -0
  129. package/esm2022/lib/select/select.component.mjs +1160 -0
  130. package/esm2022/lib/select/select.directive.mjs +171 -0
  131. package/esm2022/lib/select/select.module.mjs +112 -0
  132. package/esm2022/lib/select/select.types.mjs +2 -0
  133. package/esm2022/lib/slide-toggle/slide-toggle.component.mjs +46 -0
  134. package/esm2022/lib/slide-toggle/slide-toggle.module.mjs +18 -0
  135. package/esm2022/lib/slider/abstract-slider.mjs +330 -0
  136. package/esm2022/lib/slider/range-slider/range-slider.component.mjs +143 -0
  137. package/esm2022/lib/slider/range-slider/range-slider.module.mjs +18 -0
  138. package/esm2022/lib/slider/slider.component.mjs +93 -0
  139. package/esm2022/lib/slider/slider.directive.mjs +16 -0
  140. package/esm2022/lib/slider/slider.module.mjs +20 -0
  141. package/esm2022/lib/slider/slider.types.mjs +10 -0
  142. package/esm2022/lib/snackbar/index.mjs +5 -0
  143. package/esm2022/lib/snackbar/snackbar-ref.mjs +51 -0
  144. package/esm2022/lib/snackbar/snackbar.component.mjs +48 -0
  145. package/esm2022/lib/snackbar/snackbar.service.mjs +227 -0
  146. package/esm2022/lib/snackbar/snackbar.token.mjs +20 -0
  147. package/esm2022/lib/snackbar/snackbar.types.mjs +25 -0
  148. package/esm2022/lib/spinner/spinner.component.mjs +22 -0
  149. package/esm2022/lib/spinner/spinner.module.mjs +18 -0
  150. package/esm2022/lib/star/star-button/star-button.component.mjs +53 -0
  151. package/esm2022/lib/star/star-button/star-button.module.mjs +19 -0
  152. package/esm2022/lib/star/star-display/star-display.component.mjs +66 -0
  153. package/esm2022/lib/star/star-display/star-display.module.mjs +19 -0
  154. package/esm2022/lib/star/star-input/star-input.component.mjs +221 -0
  155. package/esm2022/lib/star/star-input/star-input.module.mjs +19 -0
  156. package/esm2022/lib/star/star.component.mjs +28 -0
  157. package/esm2022/lib/star/star.module.mjs +18 -0
  158. package/esm2022/lib/star/star.types.mjs +23 -0
  159. package/esm2022/lib/statebox/statebox.component.mjs +158 -0
  160. package/esm2022/lib/statebox/statebox.module.mjs +18 -0
  161. package/esm2022/lib/statebox/statebox.types.mjs +2 -0
  162. package/esm2022/lib/table/table-item-storage.mjs +560 -0
  163. package/esm2022/lib/table/table.component.mjs +468 -0
  164. package/esm2022/lib/table/table.directives.mjs +64 -0
  165. package/esm2022/lib/table/table.module.mjs +46 -0
  166. package/esm2022/lib/table/table.types.mjs +30 -0
  167. package/esm2022/lib/table/utils.mjs +18 -0
  168. package/esm2022/lib/table-from-csv/table-from-csv.component.mjs +64 -0
  169. package/esm2022/lib/table-from-csv/table-from-csv.module.mjs +19 -0
  170. package/esm2022/lib/table-pagination/table-pagination.component.mjs +172 -0
  171. package/esm2022/lib/table-pagination/table-pagination.module.mjs +21 -0
  172. package/esm2022/lib/table-pagination/table-pagination.types.mjs +7 -0
  173. package/esm2022/lib/types/alignment.types.mjs +10 -0
  174. package/esm2022/lib/types/colors.types.mjs +43 -0
  175. package/esm2022/lib/types/item-storage.types.mjs +6 -0
  176. package/esm2022/lib/types/theming.types.mjs +48 -0
  177. package/esm2022/lib/types/utility.types.mjs +5 -0
  178. package/esm2022/public-api.mjs +194 -0
  179. package/fesm2022/ardium-ui-ui.mjs +14316 -0
  180. package/fesm2022/ardium-ui-ui.mjs.map +1 -0
  181. package/index.d.ts +5 -0
  182. package/lib/_internal/boolean-component.d.ts +50 -0
  183. package/lib/_internal/clear-button/clear-button.component.d.ts +6 -0
  184. package/lib/_internal/clear-button/clear-button.module.d.ts +8 -0
  185. package/lib/_internal/disablable-component.d.ts +11 -0
  186. package/lib/_internal/focusable-component.d.ts +52 -0
  187. package/lib/_internal/item-storages/dropdown-item-storage.d.ts +87 -0
  188. package/lib/_internal/item-storages/simple-item-storage.d.ts +159 -0
  189. package/lib/_internal/item-storages/simplest-item-storage.d.ts +70 -0
  190. package/lib/_internal/models/pagination.model.d.ts +53 -0
  191. package/lib/_internal/ngmodel-component.d.ts +42 -0
  192. package/lib/_internal/queue.d.ts +21 -0
  193. package/lib/_internal/selectable-list-component.d.ts +71 -0
  194. package/lib/badge/badge.directive.d.ts +31 -0
  195. package/lib/badge/badge.module.d.ts +8 -0
  196. package/lib/badge/badge.types.d.ts +17 -0
  197. package/lib/buttons/_button-base.d.ts +18 -0
  198. package/lib/buttons/button/button.component.d.ts +15 -0
  199. package/lib/buttons/button/button.module.d.ts +8 -0
  200. package/lib/buttons/fab/fab.component.d.ts +12 -0
  201. package/lib/buttons/fab/fab.module.d.ts +8 -0
  202. package/lib/buttons/general-button.types.d.ts +57 -0
  203. package/lib/buttons/icon-button/icon-button.component.d.ts +13 -0
  204. package/lib/buttons/icon-button/icon-button.module.d.ts +8 -0
  205. package/lib/calendar/calendar.component.d.ts +155 -0
  206. package/lib/calendar/calendar.directives.d.ts +51 -0
  207. package/lib/calendar/calendar.helpers.d.ts +15 -0
  208. package/lib/calendar/calendar.module.d.ts +11 -0
  209. package/lib/calendar/calendar.types.d.ts +80 -0
  210. package/lib/card/card.children.d.ts +43 -0
  211. package/lib/card/card.component.d.ts +13 -0
  212. package/lib/card/card.module.d.ts +9 -0
  213. package/lib/card/card.types.d.ts +10 -0
  214. package/lib/checkbox/checkbox.component.d.ts +21 -0
  215. package/lib/checkbox/checkbox.module.d.ts +8 -0
  216. package/lib/checkbox/checkbox.types.d.ts +6 -0
  217. package/lib/checkbox-list/checkbox-list.component.d.ts +50 -0
  218. package/lib/checkbox-list/checkbox-list.module.d.ts +9 -0
  219. package/lib/checkbox-list/checkbox-list.types.d.ts +7 -0
  220. package/lib/chip/chip.component.d.ts +18 -0
  221. package/lib/chip/chip.module.d.ts +11 -0
  222. package/lib/chip/deletable-chip/deletable-chip.component.d.ts +24 -0
  223. package/lib/chip/selectable-chip/selectable-chip.component.d.ts +24 -0
  224. package/lib/color/color-display/color-display.component.d.ts +17 -0
  225. package/lib/color/color-display/color-display.module.d.ts +8 -0
  226. package/lib/color/color-display/color-display.types.d.ts +9 -0
  227. package/lib/color/color-picker/color-picker.component.d.ts +125 -0
  228. package/lib/color/color-picker/color-picker.directives.d.ts +27 -0
  229. package/lib/color/color-picker/color-picker.module.d.ts +13 -0
  230. package/lib/color/color-picker/color-picker.types.d.ts +21 -0
  231. package/lib/dialog/dialog.component.d.ts +44 -0
  232. package/lib/dialog/dialog.directives.d.ts +9 -0
  233. package/lib/dialog/dialog.module.d.ts +11 -0
  234. package/lib/dialog/dialog.types.d.ts +28 -0
  235. package/lib/divider/divider.component.d.ts +8 -0
  236. package/lib/divider/divider.module.d.ts +8 -0
  237. package/lib/dropdown-panel/dropdown-panel.component.d.ts +37 -0
  238. package/lib/dropdown-panel/dropdown-panel.module.d.ts +8 -0
  239. package/lib/dropdown-panel/dropdown-panel.types.d.ts +12 -0
  240. package/lib/file-inputs/file-drop-area/file-drop-area.component.d.ts +22 -0
  241. package/lib/file-inputs/file-drop-area/file-drop-area.directives.d.ts +21 -0
  242. package/lib/file-inputs/file-drop-area/file-drop-area.module.d.ts +12 -0
  243. package/lib/file-inputs/file-input/file-input.component.d.ts +41 -0
  244. package/lib/file-inputs/file-input/file-input.directives.d.ts +39 -0
  245. package/lib/file-inputs/file-input/file-input.module.d.ts +11 -0
  246. package/lib/file-inputs/file-input-base.d.ts +43 -0
  247. package/lib/file-inputs/file-input-types.d.ts +10 -0
  248. package/lib/form-field-frame/form-field-frame.component.d.ts +32 -0
  249. package/lib/form-field-frame/form-field-frame.directives.d.ts +14 -0
  250. package/lib/form-field-frame/form-field-frame.module.d.ts +9 -0
  251. package/lib/icon/icon.component.d.ts +32 -0
  252. package/lib/icon/icon.module.d.ts +9 -0
  253. package/lib/icon/icon.pipe.d.ts +7 -0
  254. package/lib/inputs/color-input/color-input.component.d.ts +147 -0
  255. package/lib/inputs/color-input/color-input.directives.d.ts +52 -0
  256. package/lib/inputs/color-input/color-input.module.d.ts +16 -0
  257. package/lib/inputs/color-input/color-input.types.d.ts +5 -0
  258. package/lib/inputs/digit-input/digit-input.component.d.ts +50 -0
  259. package/lib/inputs/digit-input/digit-input.model.d.ts +26 -0
  260. package/lib/inputs/digit-input/digit-input.module.d.ts +8 -0
  261. package/lib/inputs/digit-input/digit-input.types.d.ts +27 -0
  262. package/lib/inputs/digit-input/digit-input.utils.d.ts +17 -0
  263. package/lib/inputs/hex-input/hex-input.component.d.ts +60 -0
  264. package/lib/inputs/hex-input/hex-input.directives.d.ts +20 -0
  265. package/lib/inputs/hex-input/hex-input.module.d.ts +11 -0
  266. package/lib/inputs/hex-input.model.d.ts +27 -0
  267. package/lib/inputs/input/input.component.d.ts +79 -0
  268. package/lib/inputs/input/input.directives.d.ts +33 -0
  269. package/lib/inputs/input/input.module.d.ts +13 -0
  270. package/lib/inputs/input-transformers.d.ts +24 -0
  271. package/lib/inputs/input-types.d.ts +6 -0
  272. package/lib/inputs/input-utils.d.ts +58 -0
  273. package/lib/inputs/number-input/number-input.component.d.ts +70 -0
  274. package/lib/inputs/number-input/number-input.directives.d.ts +8 -0
  275. package/lib/inputs/number-input/number-input.module.d.ts +11 -0
  276. package/lib/inputs/password-input/password-input.component.d.ts +54 -0
  277. package/lib/inputs/password-input/password-input.directives.d.ts +27 -0
  278. package/lib/inputs/password-input/password-input.module.d.ts +11 -0
  279. package/lib/inputs/password-input/password-input.types.d.ts +3 -0
  280. package/lib/inputs/simple-input/simple-input.component.d.ts +58 -0
  281. package/lib/inputs/simple-input/simple-input.directives.d.ts +20 -0
  282. package/lib/inputs/simple-input/simple-input.module.d.ts +11 -0
  283. package/lib/kbd/kbd.component.d.ts +15 -0
  284. package/lib/kbd/kbd.module.d.ts +9 -0
  285. package/lib/kbd/kbd.pipe.d.ts +7 -0
  286. package/lib/kbd-shortcut/kbd-shortcut.component.d.ts +18 -0
  287. package/lib/kbd-shortcut/kbd-shortcut.module.d.ts +9 -0
  288. package/lib/modal/modal.component.d.ts +36 -0
  289. package/lib/modal/modal.module.d.ts +11 -0
  290. package/lib/option/option.component.d.ts +29 -0
  291. package/lib/option/option.module.d.ts +8 -0
  292. package/lib/progress-bar/progress-bar.component.d.ts +26 -0
  293. package/lib/progress-bar/progress-bar.directive.d.ts +9 -0
  294. package/lib/progress-bar/progress-bar.module.d.ts +9 -0
  295. package/lib/progress-bar/progress-bar.types.d.ts +26 -0
  296. package/lib/progress-circle/progress-circle.component.d.ts +28 -0
  297. package/lib/progress-circle/progress-circle.directive.d.ts +9 -0
  298. package/lib/progress-circle/progress-circle.module.d.ts +9 -0
  299. package/lib/progress-circle/progress-circle.types.d.ts +17 -0
  300. package/lib/radio/radio/radio.component.d.ts +23 -0
  301. package/lib/radio/radio-group.component.d.ts +43 -0
  302. package/lib/radio/radio.module.d.ts +9 -0
  303. package/lib/search-functions.d.ts +10 -0
  304. package/lib/segment/segment.component.d.ts +48 -0
  305. package/lib/segment/segment.directives.d.ts +9 -0
  306. package/lib/segment/segment.module.d.ts +9 -0
  307. package/lib/segment/segment.types.d.ts +16 -0
  308. package/lib/select/select.component.d.ts +255 -0
  309. package/lib/select/select.directive.d.ts +94 -0
  310. package/lib/select/select.module.d.ts +14 -0
  311. package/lib/select/select.types.d.ts +109 -0
  312. package/lib/slide-toggle/slide-toggle.component.d.ts +14 -0
  313. package/lib/slide-toggle/slide-toggle.module.d.ts +8 -0
  314. package/lib/slider/abstract-slider.d.ts +88 -0
  315. package/lib/slider/range-slider/range-slider.component.d.ts +29 -0
  316. package/lib/slider/range-slider/range-slider.module.d.ts +8 -0
  317. package/lib/slider/slider.component.d.ts +18 -0
  318. package/lib/slider/slider.directive.d.ts +9 -0
  319. package/lib/slider/slider.module.d.ts +10 -0
  320. package/lib/slider/slider.types.d.ts +28 -0
  321. package/lib/snackbar/index.d.ts +4 -0
  322. package/lib/snackbar/snackbar-ref.d.ts +37 -0
  323. package/lib/snackbar/snackbar.component.d.ts +16 -0
  324. package/lib/snackbar/snackbar.service.d.ts +31 -0
  325. package/lib/snackbar/snackbar.token.d.ts +5 -0
  326. package/lib/snackbar/snackbar.types.d.ts +48 -0
  327. package/lib/spinner/spinner.component.d.ts +8 -0
  328. package/lib/spinner/spinner.module.d.ts +8 -0
  329. package/lib/star/star-button/star-button.component.d.ts +16 -0
  330. package/lib/star/star-button/star-button.module.d.ts +9 -0
  331. package/lib/star/star-display/star-display.component.d.ts +16 -0
  332. package/lib/star/star-display/star-display.module.d.ts +9 -0
  333. package/lib/star/star-input/star-input.component.d.ts +51 -0
  334. package/lib/star/star-input/star-input.module.d.ts +9 -0
  335. package/lib/star/star.component.d.ts +10 -0
  336. package/lib/star/star.module.d.ts +8 -0
  337. package/lib/star/star.types.d.ts +30 -0
  338. package/lib/statebox/statebox.component.d.ts +31 -0
  339. package/lib/statebox/statebox.module.d.ts +8 -0
  340. package/lib/statebox/statebox.types.d.ts +22 -0
  341. package/lib/table/table-item-storage.d.ts +266 -0
  342. package/lib/table/table.component.d.ts +127 -0
  343. package/lib/table/table.directives.d.ts +35 -0
  344. package/lib/table/table.module.d.ts +12 -0
  345. package/lib/table/table.types.d.ts +83 -0
  346. package/lib/table/utils.d.ts +4 -0
  347. package/lib/table-from-csv/table-from-csv.component.d.ts +16 -0
  348. package/lib/table-from-csv/table-from-csv.module.d.ts +9 -0
  349. package/lib/table-pagination/table-pagination.component.d.ts +48 -0
  350. package/lib/table-pagination/table-pagination.module.d.ts +11 -0
  351. package/lib/table-pagination/table-pagination.types.d.ts +9 -0
  352. package/lib/types/alignment.types.d.ts +11 -0
  353. package/lib/types/colors.types.d.ts +71 -0
  354. package/lib/types/item-storage.types.d.ts +98 -0
  355. package/lib/types/theming.types.d.ts +61 -0
  356. package/lib/types/utility.types.d.ts +11 -0
  357. package/package.json +36 -0
  358. package/prebuilt-themes/default/badge.css +208 -0
  359. package/prebuilt-themes/default/badge.css.map +1 -0
  360. package/prebuilt-themes/default/buttons/button.css +290 -0
  361. package/prebuilt-themes/default/buttons/button.css.map +1 -0
  362. package/prebuilt-themes/default/buttons/fab.css +307 -0
  363. package/prebuilt-themes/default/buttons/fab.css.map +1 -0
  364. package/prebuilt-themes/default/buttons/icon-button.css +288 -0
  365. package/prebuilt-themes/default/buttons/icon-button.css.map +1 -0
  366. package/prebuilt-themes/default/calendar.css +293 -0
  367. package/prebuilt-themes/default/calendar.css.map +1 -0
  368. package/prebuilt-themes/default/card.css +122 -0
  369. package/prebuilt-themes/default/card.css.map +1 -0
  370. package/prebuilt-themes/default/checkbox-list.css +65 -0
  371. package/prebuilt-themes/default/checkbox-list.css.map +1 -0
  372. package/prebuilt-themes/default/checkbox.css +365 -0
  373. package/prebuilt-themes/default/checkbox.css.map +1 -0
  374. package/prebuilt-themes/default/chips.css +367 -0
  375. package/prebuilt-themes/default/chips.css.map +1 -0
  376. package/prebuilt-themes/default/color-display.css +29 -0
  377. package/prebuilt-themes/default/color-display.css.map +1 -0
  378. package/prebuilt-themes/default/color-picker.css +106 -0
  379. package/prebuilt-themes/default/color-picker.css.map +1 -0
  380. package/prebuilt-themes/default/core.css +84 -0
  381. package/prebuilt-themes/default/core.css.map +1 -0
  382. package/prebuilt-themes/default/dialog.css +18 -0
  383. package/prebuilt-themes/default/dialog.css.map +1 -0
  384. package/prebuilt-themes/default/divider.css +11 -0
  385. package/prebuilt-themes/default/divider.css.map +1 -0
  386. package/prebuilt-themes/default/dropdown-panel.css +37 -0
  387. package/prebuilt-themes/default/dropdown-panel.css.map +1 -0
  388. package/prebuilt-themes/default/file-drop-area.css +279 -0
  389. package/prebuilt-themes/default/file-drop-area.css.map +1 -0
  390. package/prebuilt-themes/default/form-field-frame.css +84 -0
  391. package/prebuilt-themes/default/form-field-frame.css.map +1 -0
  392. package/prebuilt-themes/default/inputs/color-input.css +139 -0
  393. package/prebuilt-themes/default/inputs/color-input.css.map +1 -0
  394. package/prebuilt-themes/default/inputs/digit-input.css +45 -0
  395. package/prebuilt-themes/default/inputs/digit-input.css.map +1 -0
  396. package/prebuilt-themes/default/inputs/file-input.css +169 -0
  397. package/prebuilt-themes/default/inputs/file-input.css.map +1 -0
  398. package/prebuilt-themes/default/inputs/hex-input.css +119 -0
  399. package/prebuilt-themes/default/inputs/hex-input.css.map +1 -0
  400. package/prebuilt-themes/default/inputs/input.css +139 -0
  401. package/prebuilt-themes/default/inputs/input.css.map +1 -0
  402. package/prebuilt-themes/default/inputs/number-input.css +150 -0
  403. package/prebuilt-themes/default/inputs/number-input.css.map +1 -0
  404. package/prebuilt-themes/default/inputs/password-input.css +73 -0
  405. package/prebuilt-themes/default/inputs/password-input.css.map +1 -0
  406. package/prebuilt-themes/default/inputs/search-bar.css +114 -0
  407. package/prebuilt-themes/default/inputs/search-bar.css.map +1 -0
  408. package/prebuilt-themes/default/inputs/simple-input.css +114 -0
  409. package/prebuilt-themes/default/inputs/simple-input.css.map +1 -0
  410. package/prebuilt-themes/default/kbd-shortcut.css +12 -0
  411. package/prebuilt-themes/default/kbd-shortcut.css.map +1 -0
  412. package/prebuilt-themes/default/kbd.css +17 -0
  413. package/prebuilt-themes/default/kbd.css.map +1 -0
  414. package/prebuilt-themes/default/modal.css +73 -0
  415. package/prebuilt-themes/default/modal.css.map +1 -0
  416. package/prebuilt-themes/default/progress-bar.css +267 -0
  417. package/prebuilt-themes/default/progress-bar.css.map +1 -0
  418. package/prebuilt-themes/default/progress-circle.css +167 -0
  419. package/prebuilt-themes/default/progress-circle.css.map +1 -0
  420. package/prebuilt-themes/default/radio.css +226 -0
  421. package/prebuilt-themes/default/radio.css.map +1 -0
  422. package/prebuilt-themes/default/segment.css +391 -0
  423. package/prebuilt-themes/default/segment.css.map +1 -0
  424. package/prebuilt-themes/default/select.css +275 -0
  425. package/prebuilt-themes/default/select.css.map +1 -0
  426. package/prebuilt-themes/default/slide-toggle.css +264 -0
  427. package/prebuilt-themes/default/slide-toggle.css.map +1 -0
  428. package/prebuilt-themes/default/slider.css +354 -0
  429. package/prebuilt-themes/default/slider.css.map +1 -0
  430. package/prebuilt-themes/default/snackbar.css +183 -0
  431. package/prebuilt-themes/default/snackbar.css.map +1 -0
  432. package/prebuilt-themes/default/spinner.css +151 -0
  433. package/prebuilt-themes/default/spinner.css.map +1 -0
  434. package/prebuilt-themes/default/stars.css +291 -0
  435. package/prebuilt-themes/default/stars.css.map +1 -0
  436. package/prebuilt-themes/default/statebox.css +235 -0
  437. package/prebuilt-themes/default/statebox.css.map +1 -0
  438. package/prebuilt-themes/default/table-pagination.css +48 -0
  439. package/prebuilt-themes/default/table-pagination.css.map +1 -0
  440. package/prebuilt-themes/default/table.css +418 -0
  441. package/prebuilt-themes/default/table.css.map +1 -0
  442. package/public-api.d.ts +145 -0
  443. package/themes/_variables.scss +121 -0
  444. package/themes/default/_clear-button.scss +73 -0
  445. package/themes/default/_coloring.scss +137 -0
  446. package/themes/default/_dropdown-arrow.scss +12 -0
  447. package/themes/default/_mixins.scss +70 -0
  448. package/themes/default/badge.scss +94 -0
  449. package/themes/default/buttons/_button-mixins.scss +144 -0
  450. package/themes/default/buttons/button.scss +62 -0
  451. package/themes/default/buttons/fab.scss +72 -0
  452. package/themes/default/buttons/icon-button.scss +59 -0
  453. package/themes/default/calendar.scss +182 -0
  454. package/themes/default/card.scss +126 -0
  455. package/themes/default/checkbox-list.scss +83 -0
  456. package/themes/default/checkbox.scss +109 -0
  457. package/themes/default/chips.scss +206 -0
  458. package/themes/default/color-display.scss +41 -0
  459. package/themes/default/color-picker.scss +111 -0
  460. package/themes/default/core.scss +96 -0
  461. package/themes/default/dialog.scss +16 -0
  462. package/themes/default/divider.scss +13 -0
  463. package/themes/default/dropdown-panel.scss +45 -0
  464. package/themes/default/file-drop-area.scss +162 -0
  465. package/themes/default/form-field-frame.scss +78 -0
  466. package/themes/default/inputs/_shared.scss +46 -0
  467. package/themes/default/inputs/color-input.scss +46 -0
  468. package/themes/default/inputs/digit-input.scss +56 -0
  469. package/themes/default/inputs/file-input.scss +78 -0
  470. package/themes/default/inputs/hex-input.scss +27 -0
  471. package/themes/default/inputs/input.scss +52 -0
  472. package/themes/default/inputs/number-input.scss +121 -0
  473. package/themes/default/inputs/password-input.scss +43 -0
  474. package/themes/default/inputs/search-bar.scss +19 -0
  475. package/themes/default/inputs/simple-input.scss +19 -0
  476. package/themes/default/kbd-shortcut.scss +13 -0
  477. package/themes/default/kbd.scss +20 -0
  478. package/themes/default/modal.scss +93 -0
  479. package/themes/default/progress-bar.scss +166 -0
  480. package/themes/default/progress-circle.scss +56 -0
  481. package/themes/default/radio.scss +112 -0
  482. package/themes/default/segment.scss +339 -0
  483. package/themes/default/select.scss +253 -0
  484. package/themes/default/slide-toggle.scss +151 -0
  485. package/themes/default/slider.scss +224 -0
  486. package/themes/default/snackbar.scss +60 -0
  487. package/themes/default/spinner.scss +21 -0
  488. package/themes/default/stars.scss +122 -0
  489. package/themes/default/statebox.scss +109 -0
  490. package/themes/default/table-pagination.scss +56 -0
  491. package/themes/default/table.scss +403 -0
@@ -0,0 +1,484 @@
1
+ import { ChangeDetectionStrategy, Component, ContentChild, ElementRef, EventEmitter, HostListener, Input, Output, TemplateRef, ViewChild, ViewEncapsulation, } from '@angular/core';
2
+ import { coerceBooleanProperty, coerceNumberProperty, getEventRelativePos } from '@ardium-ui/devkit';
3
+ import * as Color from 'color';
4
+ import { round, roundToMultiple, roundToPrecision } from 'more-rounding';
5
+ import { _NgModelComponentBase } from '../../_internal/ngmodel-component';
6
+ import { ArdColorPickerColorReferenceTemplateDirective, ArdColorPickerHueIndicatorTemplateDirective, ArdColorPickerOpacityIndicatorTemplateDirective, ArdColorPickerShadeIndicatorTemplateDirective, } from './color-picker.directives';
7
+ import { ColorPickerVariant, _ColorPickerInputsSectionType } from './color-picker.types';
8
+ import * as i0 from "@angular/core";
9
+ import * as i1 from "@angular/common";
10
+ import * as i2 from "../../select/select.component";
11
+ import * as i3 from "../../inputs/number-input/number-input.component";
12
+ import * as i4 from "../../inputs/hex-input/hex-input.component";
13
+ const validHexColorRegex = /^#[0-9a-f]{3}(?:[0-9a-f]{3})?$/i;
14
+ const validHexAlphaColorRegex = /^#[0-9a-f]{4}(?:[0-9a-f]{4})?$/i;
15
+ export class ArdiumColorPickerComponent extends _NgModelComponentBase {
16
+ constructor() {
17
+ super(...arguments);
18
+ this._withOpacity = false;
19
+ this._referenceColor = Color('transparent');
20
+ this._wasReferenceColorSet = false;
21
+ //! appearance
22
+ this.wrapperClasses = '';
23
+ this.variant = ColorPickerVariant.Rounded;
24
+ this._vertical = false; //TODO implement in CSS
25
+ //! value-related
26
+ this._value = Color('red');
27
+ this._exactHue = 0;
28
+ this.valueChange = new EventEmitter();
29
+ this.colorHueChange = new EventEmitter();
30
+ this.colorSaturationChange = new EventEmitter();
31
+ this.colorValueChange = new EventEmitter();
32
+ this.colorOpacityChange = new EventEmitter();
33
+ this.focusedArea = null;
34
+ this._isMouseDown = false;
35
+ //! displaying the maps correctly
36
+ this.currentShadeMapColor = this.value;
37
+ this.currentOpacityMapColor = this.value;
38
+ //! inputs section
39
+ this.inputTypes = Object.values(_ColorPickerInputsSectionType);
40
+ this.currentInputType = _ColorPickerInputsSectionType.HEX;
41
+ this.hexInputValue = this.value.hex();
42
+ this.tripleInputData1 = {
43
+ value: 0,
44
+ max: 0 /* temporary value */,
45
+ };
46
+ this.tripleInputData2 = {
47
+ value: 0,
48
+ max: 0 /* temporary value */,
49
+ };
50
+ this.tripleInputData3 = {
51
+ value: 0,
52
+ max: 0 /* temporary value */,
53
+ };
54
+ this.tripleInputData4 = { value: 0, max: 100 };
55
+ }
56
+ get withOpacity() {
57
+ return this._withOpacity;
58
+ }
59
+ set withOpacity(v) {
60
+ this._withOpacity = coerceBooleanProperty(v);
61
+ if (this.focusedArea == 'opacity')
62
+ this.focusedArea = null;
63
+ }
64
+ set referenceColor(v) {
65
+ this._referenceColor = Color(v);
66
+ this._wasReferenceColorSet = true;
67
+ }
68
+ get referenceColor() {
69
+ return this._referenceColor;
70
+ }
71
+ get vertical() {
72
+ return this._vertical;
73
+ }
74
+ set vertical(v) {
75
+ this._vertical = coerceBooleanProperty(v);
76
+ }
77
+ get ngClasses() {
78
+ return [this.wrapperClasses, `ard-variant-${this.variant}`, this.vertical ? 'ard-vertical' : ''].join(' ');
79
+ }
80
+ set value(v) {
81
+ this.writeValue(v);
82
+ }
83
+ get value() {
84
+ return this._value;
85
+ }
86
+ set colorHue(v) {
87
+ const hue = coerceNumberProperty(v, 0);
88
+ this.value.hue(hue);
89
+ }
90
+ get colorHue() {
91
+ return this.value.hue();
92
+ }
93
+ set colorSaturation(v) {
94
+ const saturation = coerceNumberProperty(v, 100);
95
+ this.value.saturationl(saturation);
96
+ }
97
+ get colorSaturation() {
98
+ return this.value.saturationl();
99
+ }
100
+ set colorValue(v) {
101
+ const value = coerceNumberProperty(v, 100);
102
+ this.value.value(value);
103
+ }
104
+ get colorValue() {
105
+ return this.value.value();
106
+ }
107
+ set colorOpacity(v) {
108
+ const opacity = coerceNumberProperty(v, 1);
109
+ this.value.alpha(opacity);
110
+ }
111
+ get colorOpacity() {
112
+ return this.value.alpha();
113
+ }
114
+ writeValue(v) {
115
+ this._value = Color(v);
116
+ this._updateCurrentShadeMapColor();
117
+ this._updateCurrentOpacityMapColor();
118
+ this._updateHexInputValue();
119
+ this._updateTripleInputValues();
120
+ }
121
+ ngOnInit() {
122
+ if (this._wasReferenceColorSet)
123
+ return;
124
+ this._wasReferenceColorSet = true;
125
+ this.referenceColor = Color(this.value);
126
+ this._updateHexInputValue();
127
+ }
128
+ onShadeAreaMouseDown(event) {
129
+ this._isMouseDown = true;
130
+ this._updateShadeFromEvent(event);
131
+ }
132
+ onHueAreaMouseDown(event) {
133
+ this._isMouseDown = true;
134
+ this._updateHueFromEvent(event);
135
+ }
136
+ onOpacityAreaMouseDown(event) {
137
+ this._isMouseDown = true;
138
+ this._updateOpacityFromEvent(event);
139
+ }
140
+ onDocumentMouseUp() {
141
+ this._isMouseDown = false;
142
+ }
143
+ onDocumentMousemove(event) {
144
+ if (!this.focusedArea || !this._isMouseDown)
145
+ return;
146
+ if (!(event instanceof TouchEvent))
147
+ event.preventDefault();
148
+ if (this.focusedArea == 'shade') {
149
+ this._updateShadeFromEvent(event);
150
+ return;
151
+ }
152
+ if (this.focusedArea == 'hue') {
153
+ this._updateHueFromEvent(event);
154
+ return;
155
+ }
156
+ this._updateOpacityFromEvent(event);
157
+ }
158
+ _updateShadeFromEvent(event) {
159
+ const { left, right, top, bottom } = getEventRelativePos(event, this.shadeMapEl);
160
+ const shadeMapWidth = left + right;
161
+ const newSaturationRaw = (left / shadeMapWidth) * 100;
162
+ const newSaturation = round(Math.max(0, Math.min(100, newSaturationRaw)));
163
+ const shadeMapHeight = top + bottom;
164
+ const newValueRaw = (bottom / shadeMapHeight) * 100;
165
+ const newValue = round(Math.max(0, Math.min(100, newValueRaw)));
166
+ const oldSaturation = this.value.saturationv();
167
+ const oldValue = this.value.value();
168
+ if (oldSaturation == newSaturation && oldValue == newValue)
169
+ return;
170
+ this.value = Color(this.value).saturationv(newSaturation).value(newValue);
171
+ this._emitChange();
172
+ this._updateCurrentOpacityMapColor();
173
+ //emit specific events
174
+ if (oldSaturation != this.value.saturationv())
175
+ this.colorSaturationChange.next(this.value.saturationv());
176
+ if (oldValue != this.value.value())
177
+ this.colorValueChange.next(this.value.value());
178
+ }
179
+ _updateHueFromEvent(event) {
180
+ const { top, bottom } = getEventRelativePos(event, this.hueMapEl);
181
+ const hueMapHeight = top + bottom;
182
+ const newHueRaw = (top / hueMapHeight) * 360;
183
+ const newHue = round(Math.max(0, Math.min(360, newHueRaw)));
184
+ const newHueExact = newHue == 360 ? 359.99 : newHue;
185
+ if (this.value.hue() == newHueExact)
186
+ return;
187
+ this.value = Color(this.value).hue(newHueExact);
188
+ this._emitChange();
189
+ this.colorHueChange.next(this.value.hue());
190
+ this._updateCurrentShadeMapColor();
191
+ this._updateCurrentOpacityMapColor();
192
+ }
193
+ _updateOpacityFromEvent(event) {
194
+ if (!this.withOpacity)
195
+ return;
196
+ const { top, bottom } = getEventRelativePos(event, this.opacityMapEl);
197
+ const hueMapHeight = top + bottom;
198
+ const newOpacityRaw = bottom / hueMapHeight;
199
+ const newOpacity = roundToPrecision(Math.max(0, Math.min(1, newOpacityRaw)), 2);
200
+ if (this.value.alpha() == newOpacity)
201
+ return;
202
+ this.value = Color(this.value).alpha(newOpacity);
203
+ this._emitChange();
204
+ this.colorOpacityChange.next(this.value.alpha());
205
+ }
206
+ _updateCurrentShadeMapColor() {
207
+ this.currentShadeMapColor = Color.hsv(this.value.hue(), 100, 100);
208
+ }
209
+ _updateCurrentOpacityMapColor() {
210
+ if (!this.withOpacity)
211
+ return;
212
+ this.currentOpacityMapColor = Color.hsv(this.value.hue(), this.value.saturationv(), this.value.value());
213
+ }
214
+ getShadeIndicatorPosition() {
215
+ return {
216
+ '--top': 100 - this.value.value() + '%',
217
+ '--left': this.value.saturationv() + '%',
218
+ };
219
+ }
220
+ getHueIndicatorPosition() {
221
+ return {
222
+ '--top': this.value.hue() / 3.6 + '%',
223
+ };
224
+ }
225
+ getOpacityIndicatorPosition() {
226
+ return {
227
+ '--top': 100 - this.value.alpha() * 100 + '%',
228
+ };
229
+ }
230
+ onCurrentInputTypeChange(value) {
231
+ this.currentInputType = value[0];
232
+ if (this.currentInputType != _ColorPickerInputsSectionType.HEX) {
233
+ this._updateTripleInputValues();
234
+ }
235
+ }
236
+ _updateHexInputValue() {
237
+ if (this.currentInputType != _ColorPickerInputsSectionType.HEX)
238
+ return;
239
+ const HEX = this.value;
240
+ this.hexInputValue = HEX.hex().replace('#', '');
241
+ this.tripleInputData4.value = HEX.alpha() * 100;
242
+ }
243
+ _updateTripleInputValues() {
244
+ if (this.currentInputType == _ColorPickerInputsSectionType.HEX)
245
+ return;
246
+ switch (this.currentInputType) {
247
+ case _ColorPickerInputsSectionType.RGB:
248
+ const RGB = this.value.rgb();
249
+ this.tripleInputData1.value = RGB.red();
250
+ this.tripleInputData1.max = 255;
251
+ this.tripleInputData2.value = RGB.green();
252
+ this.tripleInputData2.max = 255;
253
+ this.tripleInputData3.value = RGB.blue();
254
+ this.tripleInputData3.max = 255;
255
+ this.tripleInputData4.value = RGB.alpha() * 100;
256
+ break;
257
+ case _ColorPickerInputsSectionType.HSL:
258
+ const HSL = this.value.hsl();
259
+ this.tripleInputData1.value = HSL.hue();
260
+ this.tripleInputData1.max = 360;
261
+ this.tripleInputData2.value = HSL.saturationl();
262
+ this.tripleInputData2.max = 100;
263
+ this.tripleInputData3.value = HSL.lightness();
264
+ this.tripleInputData3.max = 100;
265
+ this.tripleInputData4.value = HSL.alpha() * 100;
266
+ break;
267
+ case _ColorPickerInputsSectionType.HSV:
268
+ const HSV = this.value.hsv();
269
+ this.tripleInputData1.value = HSV.hue();
270
+ this.tripleInputData1.max = 360;
271
+ this.tripleInputData2.value = HSV.saturationv();
272
+ this.tripleInputData2.max = 100;
273
+ this.tripleInputData3.value = HSV.value();
274
+ this.tripleInputData3.max = 100;
275
+ this.tripleInputData4.value = HSV.alpha() * 100;
276
+ break;
277
+ default:
278
+ break;
279
+ }
280
+ }
281
+ onHexInputChange(value) {
282
+ if (this.withOpacity) {
283
+ if (!value.match(validHexAlphaColorRegex))
284
+ return;
285
+ }
286
+ else if (!value.match(validHexColorRegex))
287
+ return;
288
+ this.value = value;
289
+ }
290
+ onTripleInputChange(value, index) { }
291
+ //! events
292
+ _emitChange() {
293
+ const v = this.value;
294
+ this._onChangeRegistered?.(v);
295
+ this.valueChange.next(v);
296
+ }
297
+ getIndicatorContext() {
298
+ return {
299
+ $implicit: this.value,
300
+ };
301
+ }
302
+ getColorReferenceContext() {
303
+ return {
304
+ color: this.value,
305
+ $implicit: this.value,
306
+ referenceColor: this.referenceColor,
307
+ };
308
+ }
309
+ //! keyboard controls
310
+ onKeydown(event) {
311
+ const hasShift = event.shiftKey;
312
+ switch (event.key) {
313
+ case 'ArrowRight':
314
+ case 'ArrowLeft':
315
+ if (this.focusedArea != 'shade')
316
+ return;
317
+ this.nudgeColorSaturation(event.key == 'ArrowRight' ? 1 : -1, hasShift);
318
+ break;
319
+ case 'ArrowUp':
320
+ case 'ArrowDown':
321
+ switch (this.focusedArea) {
322
+ case 'shade':
323
+ this.nudgeColorValue(event.key == 'ArrowUp' ? 1 : -1, hasShift);
324
+ break;
325
+ case 'hue':
326
+ this.nudgeColorHue(event.key == 'ArrowDown' ? 1 : -1, hasShift);
327
+ break;
328
+ case 'opacity':
329
+ this.nudgeColorOpacity(event.key == 'ArrowUp' ? 1 : -1, hasShift);
330
+ break;
331
+ default:
332
+ console.error(new Error(`Unexpected ard-color-picker._focusedArea state "${this.focusedArea}"`));
333
+ break;
334
+ }
335
+ break;
336
+ }
337
+ }
338
+ nudgeColorSaturation(direction, hasShift) {
339
+ const v = this.value;
340
+ let diff = (direction * 100) / 255;
341
+ let newVal;
342
+ if (hasShift) {
343
+ diff = (diff * 255) / 10;
344
+ newVal = v.saturationv() + diff;
345
+ newVal = roundToMultiple(newVal, Math.abs(diff)); //round to tens
346
+ }
347
+ else {
348
+ newVal = v.saturationv() + diff;
349
+ }
350
+ const newValClamped = Math.max(0, Math.min(100, newVal));
351
+ this.value = Color(v).saturationv(newValClamped);
352
+ }
353
+ nudgeColorValue(direction, hasShift) {
354
+ const v = this.value;
355
+ let diff = (direction * 100) / 255;
356
+ let newVal;
357
+ if (hasShift) {
358
+ diff = (diff * 255) / 10;
359
+ newVal = v.value() + diff;
360
+ newVal = roundToMultiple(newVal, Math.abs(diff)); //round to tens
361
+ }
362
+ else {
363
+ newVal = v.value() + diff;
364
+ }
365
+ const newValClamped = Math.max(0, Math.min(100, newVal));
366
+ this.value = Color(v).value(newValClamped);
367
+ }
368
+ nudgeColorHue(direction, hasShift) {
369
+ const v = this.value;
370
+ let diff = direction, newVal;
371
+ if (hasShift) {
372
+ diff = direction * 30;
373
+ newVal = v.hue() + diff;
374
+ newVal = roundToMultiple(newVal, Math.abs(diff)); //round to tens
375
+ }
376
+ else {
377
+ newVal = v.hue() + diff;
378
+ }
379
+ const newValClamped = Math.max(0, Math.min(359.99, newVal));
380
+ console.log(newValClamped);
381
+ this.value = Color(v).hue(newValClamped);
382
+ }
383
+ nudgeColorOpacity(direction, hasShift) {
384
+ const v = this.value;
385
+ let diff = direction * 0.01;
386
+ let newVal;
387
+ if (hasShift) {
388
+ diff = diff * 10;
389
+ newVal = v.alpha() + diff;
390
+ newVal = roundToPrecision(newVal, 1); //round to one place
391
+ }
392
+ else {
393
+ newVal = v.alpha() + diff;
394
+ }
395
+ const newValClamped = Math.max(0, Math.min(1, newVal));
396
+ this.value = Color(v).alpha(newValClamped);
397
+ }
398
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.7", ngImport: i0, type: ArdiumColorPickerComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
399
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.7", type: ArdiumColorPickerComponent, selector: "ard-color-picker", inputs: { withOpacity: "withOpacity", referenceColor: "referenceColor", wrapperClasses: "wrapperClasses", variant: "variant", vertical: "vertical", value: "value", colorHue: "colorHue", colorSaturation: "colorSaturation", colorValue: "colorValue", colorOpacity: "colorOpacity", shadeIndicatorTemplate: "shadeIndicatorTemplate", hueIndicatorTemplate: "hueIndicatorTemplate", opacityIndicatorTemplate: "opacityIndicatorTemplate", colorReferenceTemplate: "colorReferenceTemplate" }, outputs: { valueChange: "valueChange", colorHueChange: "colorHueChange", colorSaturationChange: "colorSaturationChange", colorValueChange: "colorValueChange", colorOpacityChange: "colorOpacityChange" }, host: { listeners: { "document:pointerup": "onDocumentMouseUp()", "document:touchend": "onDocumentMouseUp()", "document:pointermove": "onDocumentMousemove($event)", "document:touchmove": "onDocumentMousemove($event)" } }, queries: [{ propertyName: "shadeIndicatorTemplateChild", first: true, predicate: ArdColorPickerShadeIndicatorTemplateDirective, descendants: true, read: TemplateRef }, { propertyName: "hueIndicatorTemplateChild", first: true, predicate: ArdColorPickerHueIndicatorTemplateDirective, descendants: true, read: TemplateRef }, { propertyName: "opacityIndicatorTemplateChild", first: true, predicate: ArdColorPickerOpacityIndicatorTemplateDirective, descendants: true, read: TemplateRef }, { propertyName: "colorReferenceTemplateChild", first: true, predicate: ArdColorPickerColorReferenceTemplateDirective, descendants: true, read: TemplateRef }], viewQueries: [{ propertyName: "shadeMapEl", first: true, predicate: ["shadeMap"], descendants: true, read: ElementRef }, { propertyName: "hueMapEl", first: true, predicate: ["hueMap"], descendants: true, read: ElementRef }, { propertyName: "opacityMapEl", first: true, predicate: ["opacityMap"], descendants: true, read: ElementRef }], usesInheritance: true, ngImport: i0, template: "<div class=\"ard-color-picker\" [ngClass]=\"ngClasses\" (keydown)=\"onKeydown($event)\">\r\n <div class=\"ard-color-picker-click-areas\"\r\n [style]=\"{\r\n '--ard-color-picker-current-hue': currentShadeMapColor,\r\n '--ard-color-picker-current-color': currentOpacityMapColor\r\n }\"\r\n >\r\n <div #shadeMap\r\n [tabIndex]=\"tabIndex\"\r\n class=\"ard-color-picker-shade-map\"\r\n (focus)=\"onFocus($event)\"\r\n (focus)=\"focusedArea = 'shade'\"\r\n (blur)=\"onBlur($event)\"\r\n (blur)=\"focusedArea = null\"\r\n (mousedown)=\"onShadeAreaMouseDown($event)\"\r\n (pointerdown)=\"onShadeAreaMouseDown($event)\"\r\n >\r\n <div class=\"ard-color-picker-shade-indicator-container\" [style]=\"getShadeIndicatorPosition()\">\r\n <ng-template #defaultShadeIndicatorTemplate>\r\n <div class=\"ard-color-picker-shade-indicator\"></div>\r\n </ng-template>\r\n \r\n <ng-template [ngTemplateOutlet]=\"shadeIndicatorTemplate || shadeIndicatorTemplateChild || defaultShadeIndicatorTemplate\"\r\n [ngTemplateOutletContext]=\"getIndicatorContext()\"\r\n ></ng-template>\r\n </div>\r\n </div>\r\n <div #hueMap\r\n [tabIndex]=\"tabIndex\"\r\n class=\"ard-color-picker-hue-map\"\r\n (focus)=\"onFocus($event)\"\r\n (focus)=\"focusedArea = 'hue'\"\r\n (blur)=\"onBlur($event)\"\r\n (blur)=\"focusedArea = null\"\r\n (mousedown)=\"onHueAreaMouseDown($event)\"\r\n (pointerdown)=\"onHueAreaMouseDown($event)\"\r\n >\r\n <div class=\"ard-color-picker-hue-indicator-container\" [style]=\"getHueIndicatorPosition()\">\r\n <ng-template #defaultHueIndicatorTemplate>\r\n <div class=\"ard-color-picker-hue-indicator\"></div>\r\n </ng-template>\r\n \r\n <ng-template [ngTemplateOutlet]=\"hueIndicatorTemplate || hueIndicatorTemplateChild || defaultHueIndicatorTemplate\"\r\n [ngTemplateOutletContext]=\"getIndicatorContext()\"\r\n ></ng-template>\r\n </div>\r\n </div>\r\n <div #opacityMap\r\n *ngIf=\"withOpacity\"\r\n [tabIndex]=\"tabIndex\"\r\n class=\"ard-color-picker-opacity-map\"\r\n (focus)=\"onFocus($event)\"\r\n (focus)=\"focusedArea = 'opacity'\"\r\n (blur)=\"onBlur($event)\"\r\n (blur)=\"focusedArea = null\"\r\n (mousedown)=\"onOpacityAreaMouseDown($event)\"\r\n (pointerdown)=\"onOpacityAreaMouseDown($event)\"\r\n >\r\n <div class=\"ard-color-picker-opacity-indicator-container\" [style]=\"getOpacityIndicatorPosition()\">\r\n <ng-template #defaultOpacityIndicatorTemplate>\r\n <div class=\"ard-color-picker-opacity-indicator\"></div>\r\n </ng-template>\r\n \r\n <ng-template [ngTemplateOutlet]=\"opacityIndicatorTemplate || opacityIndicatorTemplateChild || defaultOpacityIndicatorTemplate\"\r\n [ngTemplateOutletContext]=\"getIndicatorContext()\"\r\n ></ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"ard-color-picker-input-panel\">\r\n <div class=\"ard-color-picker-inputs\">\r\n <div class=\"ard-color-picker-input-type\">\r\n <ard-select\r\n compact\r\n clearable=\"false\"\r\n appearance=\"transparent\"\r\n [items]=\"inputTypes\"\r\n [value]=\"currentInputType\"\r\n (valueChange)=\"onCurrentInputTypeChange($event)\"\r\n ></ard-select>\r\n </div>\r\n <div class=\"ard-color-picker-reference-container\">\r\n <ng-template #defaultColorReferenceTemplate let-col let-refcol=\"referenceColor\">\r\n <div class=\"ard-color-picker-reference\">\r\n <div class=\"ard-color-picker-reference-reference\" [style]=\"{ background: refcol.rgb().toString() }\"></div>\r\n <div class=\"ard-color-picker-reference-current\" [style]=\"{ background: col.rgb().toString() }\"></div>\r\n </div>\r\n </ng-template>\r\n \r\n <ng-template [ngTemplateOutlet]=\"colorReferenceTemplate || colorReferenceTemplateChild || defaultColorReferenceTemplate\"\r\n [ngTemplateOutletContext]=\"getColorReferenceContext()\"\r\n ></ng-template>\r\n </div>\r\n <div class=\"ard-color-picker-inputs-container\"\r\n [ngClass]=\"{\r\n 'ard-mode-hex': currentInputType == 'HEX',\r\n 'ard-mode-triple': currentInputType != 'HEX',\r\n 'ard-mode-opacity': withOpacity\r\n }\"\r\n >\r\n <ng-template\r\n [ngTemplateOutlet]=\"currentInputType == 'HEX' ? hexInput : tripleInput\"\r\n ></ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<ng-template #hexInput>\r\n <ard-hex-input\r\n class=\"ard-color-picker-hex-input\"\r\n maxDigits=\"6\"\r\n [value]=\"hexInputValue\"\r\n (valueChange)=\"onHexInputChange($event)\"\r\n ></ard-hex-input>\r\n <ard-number-input\r\n *ngIf=\"withOpacity\"\r\n allowQuickChange=\"false\"\r\n [max]=\"tripleInputData4.max\"\r\n [value]=\"tripleInputData4.value\"\r\n (valueChange)=\"onTripleInputChange($event, 4)\"\r\n ></ard-number-input>\r\n</ng-template>\r\n\r\n<ng-template #tripleInput> \r\n <ard-number-input\r\n allowQuickChange=\"false\"\r\n [max]=\"tripleInputData1.max\"\r\n [value]=\"tripleInputData1.value\"\r\n (valueChange)=\"onTripleInputChange($event, 1)\"\r\n ></ard-number-input>\r\n <ard-number-input\r\n allowQuickChange=\"false\"\r\n [max]=\"tripleInputData2.max\"\r\n [value]=\"tripleInputData2.value\"\r\n (valueChange)=\"onTripleInputChange($event, 2)\"\r\n ></ard-number-input>\r\n <ard-number-input\r\n allowQuickChange=\"false\"\r\n [max]=\"tripleInputData3.max\"\r\n [value]=\"tripleInputData3.value\"\r\n (valueChange)=\"onTripleInputChange($event, 3)\"\r\n ></ard-number-input>\r\n <ard-number-input\r\n *ngIf=\"withOpacity\"\r\n allowQuickChange=\"false\"\r\n [max]=\"tripleInputData4.max\"\r\n [value]=\"tripleInputData4.value\"\r\n (valueChange)=\"onTripleInputChange($event, 4)\"\r\n ></ard-number-input>\r\n</ng-template>", styles: [".ard-color-picker{display:flex;flex-direction:column}.ard-color-picker-click-areas{display:flex;flex-direction:row}.ard-color-picker-click-areas.ard-vertical .ard-color-picker-click-areas{flex-direction:column}.ard-color-picker-shade-map,.ard-color-picker-hue-map,.ard-color-picker-opacity-map{position:relative}.ard-color-picker-shade-map{background:linear-gradient(to bottom,transparent,rgb(0,0,0)),linear-gradient(to right,transparent,var(--ard-color-picker-current-hue)),#fff}.ard-color-picker-hue-map{background:linear-gradient(to bottom,red,#ff8000,#ff0,#80ff00,#0f0,#00ff80,#0ff,#0080ff,#00f,#7f00ff,#f0f,#ff0080,red)}.ard-color-picker-opacity-map{--ard-color-picker-opacity-checkerboard-color: #ccc;--ard-color-picker-opacity-checkerboard-size: 10px;background-image:linear-gradient(45deg,var(--ard-color-picker-opacity-checkerboard-color) 25%,transparent 25%),linear-gradient(-45deg,var(--ard-color-picker-opacity-checkerboard-color) 25%,transparent 25%),linear-gradient(45deg,transparent 75%,var(--ard-color-picker-opacity-checkerboard-color) 75%),linear-gradient(-45deg,transparent 75%,var(--ard-color-picker-opacity-checkerboard-color) 75%);background-size:var(--ard-color-picker-opacity-checkerboard-size) var(--ard-color-picker-opacity-checkerboard-size);background-position:0 0,0 calc(var(--ard-color-picker-opacity-checkerboard-size) / 2),calc(var(--ard-color-picker-opacity-checkerboard-size) / 2) calc(var(--ard-color-picker-opacity-checkerboard-size) / 2 * -1),calc(var(--ard-color-picker-opacity-checkerboard-size) / 2 * -1) 0}.ard-color-picker-opacity-map:before{content:\"\";position:absolute;inset:0;background:linear-gradient(to bottom,var(--ard-color-picker-current-color),transparent)}.ard-color-picker-shade-indicator-container,.ard-color-picker-hue-indicator-container,.ard-color-picker-opacity-indicator-container{position:absolute;transform:translate(-50%,-50%)}.ard-color-picker-reference{--ard-color-picker-opacity-checkerboard-color: #ccc;--ard-color-picker-opacity-checkerboard-size: 10px;background-image:linear-gradient(45deg,var(--ard-color-picker-opacity-checkerboard-color) 25%,transparent 25%),linear-gradient(-45deg,var(--ard-color-picker-opacity-checkerboard-color) 25%,transparent 25%),linear-gradient(45deg,transparent 75%,var(--ard-color-picker-opacity-checkerboard-color) 75%),linear-gradient(-45deg,transparent 75%,var(--ard-color-picker-opacity-checkerboard-color) 75%);background-size:var(--ard-color-picker-opacity-checkerboard-size) var(--ard-color-picker-opacity-checkerboard-size);background-position:0 0,0 calc(var(--ard-color-picker-opacity-checkerboard-size) / 2),calc(var(--ard-color-picker-opacity-checkerboard-size) / 2) calc(var(--ard-color-picker-opacity-checkerboard-size) / 2 * -1),calc(var(--ard-color-picker-opacity-checkerboard-size) / 2 * -1) 0}\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: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i2.ArdiumSelectComponent, selector: "ard-select", inputs: ["valueFrom", "labelFrom", "disabledFrom", "groupLabelFrom", "groupDisabledFrom", "childrenFrom", "placeholder", "searchPlaceholder", "dropdownPosition", "clearButtonTitle", "noItemsFoundText", "loadingPlaceholderText", "searchInputId", "isLoading", "inputAttrs", "htmlId", "itemsAlreadyGrouped", "invertDisabled", "noGroupActions", "autoHighlightFirst", "autoFocus", "keepOpen", "hideSelected", "noBackspaceClear", "sortMultipleValues", "searchCaseSensitive", "keepSearchAfterSelect", "maxSelectedItems", "itemDisplayLimit", "searchFn", "compareWith", "appearance", "variant", "compact", "dropdowonAppearance", "dropdowonVariant", "groupItems", "items", "multiselectable", "clearable", "searchable", "addCustom", "value", "isOpen"], outputs: ["valueChange", "change", "add", "failedToAdd", "remove", "clear", "open", "close", "scroll", "scrollToEnd", "search", "isOpenChange"] }, { kind: "component", type: i3.ArdiumNumberInputComponent, selector: "ard-number-input", inputs: ["inputId", "placeholder", "appearance", "variant", "alignText", "compact", "inputAttrs", "value", "min", "max", "allowFloat", "allowQuickChange", "stepSize"], outputs: ["valueChange", "input", "change", "clear", "quickChange"] }, { kind: "component", type: i4.ArdiumHexInputComponent, selector: "ard-hex-input", inputs: ["inputId", "placeholder", "appearance", "variant", "compact", "case", "maxDigits", "hideHash", "clearable", "clearButtonTitle", "inputAttrs", "value"], outputs: ["valueChange", "input", "change", "clear"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
400
+ }
401
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.7", ngImport: i0, type: ArdiumColorPickerComponent, decorators: [{
402
+ type: Component,
403
+ args: [{ selector: 'ard-color-picker', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"ard-color-picker\" [ngClass]=\"ngClasses\" (keydown)=\"onKeydown($event)\">\r\n <div class=\"ard-color-picker-click-areas\"\r\n [style]=\"{\r\n '--ard-color-picker-current-hue': currentShadeMapColor,\r\n '--ard-color-picker-current-color': currentOpacityMapColor\r\n }\"\r\n >\r\n <div #shadeMap\r\n [tabIndex]=\"tabIndex\"\r\n class=\"ard-color-picker-shade-map\"\r\n (focus)=\"onFocus($event)\"\r\n (focus)=\"focusedArea = 'shade'\"\r\n (blur)=\"onBlur($event)\"\r\n (blur)=\"focusedArea = null\"\r\n (mousedown)=\"onShadeAreaMouseDown($event)\"\r\n (pointerdown)=\"onShadeAreaMouseDown($event)\"\r\n >\r\n <div class=\"ard-color-picker-shade-indicator-container\" [style]=\"getShadeIndicatorPosition()\">\r\n <ng-template #defaultShadeIndicatorTemplate>\r\n <div class=\"ard-color-picker-shade-indicator\"></div>\r\n </ng-template>\r\n \r\n <ng-template [ngTemplateOutlet]=\"shadeIndicatorTemplate || shadeIndicatorTemplateChild || defaultShadeIndicatorTemplate\"\r\n [ngTemplateOutletContext]=\"getIndicatorContext()\"\r\n ></ng-template>\r\n </div>\r\n </div>\r\n <div #hueMap\r\n [tabIndex]=\"tabIndex\"\r\n class=\"ard-color-picker-hue-map\"\r\n (focus)=\"onFocus($event)\"\r\n (focus)=\"focusedArea = 'hue'\"\r\n (blur)=\"onBlur($event)\"\r\n (blur)=\"focusedArea = null\"\r\n (mousedown)=\"onHueAreaMouseDown($event)\"\r\n (pointerdown)=\"onHueAreaMouseDown($event)\"\r\n >\r\n <div class=\"ard-color-picker-hue-indicator-container\" [style]=\"getHueIndicatorPosition()\">\r\n <ng-template #defaultHueIndicatorTemplate>\r\n <div class=\"ard-color-picker-hue-indicator\"></div>\r\n </ng-template>\r\n \r\n <ng-template [ngTemplateOutlet]=\"hueIndicatorTemplate || hueIndicatorTemplateChild || defaultHueIndicatorTemplate\"\r\n [ngTemplateOutletContext]=\"getIndicatorContext()\"\r\n ></ng-template>\r\n </div>\r\n </div>\r\n <div #opacityMap\r\n *ngIf=\"withOpacity\"\r\n [tabIndex]=\"tabIndex\"\r\n class=\"ard-color-picker-opacity-map\"\r\n (focus)=\"onFocus($event)\"\r\n (focus)=\"focusedArea = 'opacity'\"\r\n (blur)=\"onBlur($event)\"\r\n (blur)=\"focusedArea = null\"\r\n (mousedown)=\"onOpacityAreaMouseDown($event)\"\r\n (pointerdown)=\"onOpacityAreaMouseDown($event)\"\r\n >\r\n <div class=\"ard-color-picker-opacity-indicator-container\" [style]=\"getOpacityIndicatorPosition()\">\r\n <ng-template #defaultOpacityIndicatorTemplate>\r\n <div class=\"ard-color-picker-opacity-indicator\"></div>\r\n </ng-template>\r\n \r\n <ng-template [ngTemplateOutlet]=\"opacityIndicatorTemplate || opacityIndicatorTemplateChild || defaultOpacityIndicatorTemplate\"\r\n [ngTemplateOutletContext]=\"getIndicatorContext()\"\r\n ></ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"ard-color-picker-input-panel\">\r\n <div class=\"ard-color-picker-inputs\">\r\n <div class=\"ard-color-picker-input-type\">\r\n <ard-select\r\n compact\r\n clearable=\"false\"\r\n appearance=\"transparent\"\r\n [items]=\"inputTypes\"\r\n [value]=\"currentInputType\"\r\n (valueChange)=\"onCurrentInputTypeChange($event)\"\r\n ></ard-select>\r\n </div>\r\n <div class=\"ard-color-picker-reference-container\">\r\n <ng-template #defaultColorReferenceTemplate let-col let-refcol=\"referenceColor\">\r\n <div class=\"ard-color-picker-reference\">\r\n <div class=\"ard-color-picker-reference-reference\" [style]=\"{ background: refcol.rgb().toString() }\"></div>\r\n <div class=\"ard-color-picker-reference-current\" [style]=\"{ background: col.rgb().toString() }\"></div>\r\n </div>\r\n </ng-template>\r\n \r\n <ng-template [ngTemplateOutlet]=\"colorReferenceTemplate || colorReferenceTemplateChild || defaultColorReferenceTemplate\"\r\n [ngTemplateOutletContext]=\"getColorReferenceContext()\"\r\n ></ng-template>\r\n </div>\r\n <div class=\"ard-color-picker-inputs-container\"\r\n [ngClass]=\"{\r\n 'ard-mode-hex': currentInputType == 'HEX',\r\n 'ard-mode-triple': currentInputType != 'HEX',\r\n 'ard-mode-opacity': withOpacity\r\n }\"\r\n >\r\n <ng-template\r\n [ngTemplateOutlet]=\"currentInputType == 'HEX' ? hexInput : tripleInput\"\r\n ></ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<ng-template #hexInput>\r\n <ard-hex-input\r\n class=\"ard-color-picker-hex-input\"\r\n maxDigits=\"6\"\r\n [value]=\"hexInputValue\"\r\n (valueChange)=\"onHexInputChange($event)\"\r\n ></ard-hex-input>\r\n <ard-number-input\r\n *ngIf=\"withOpacity\"\r\n allowQuickChange=\"false\"\r\n [max]=\"tripleInputData4.max\"\r\n [value]=\"tripleInputData4.value\"\r\n (valueChange)=\"onTripleInputChange($event, 4)\"\r\n ></ard-number-input>\r\n</ng-template>\r\n\r\n<ng-template #tripleInput> \r\n <ard-number-input\r\n allowQuickChange=\"false\"\r\n [max]=\"tripleInputData1.max\"\r\n [value]=\"tripleInputData1.value\"\r\n (valueChange)=\"onTripleInputChange($event, 1)\"\r\n ></ard-number-input>\r\n <ard-number-input\r\n allowQuickChange=\"false\"\r\n [max]=\"tripleInputData2.max\"\r\n [value]=\"tripleInputData2.value\"\r\n (valueChange)=\"onTripleInputChange($event, 2)\"\r\n ></ard-number-input>\r\n <ard-number-input\r\n allowQuickChange=\"false\"\r\n [max]=\"tripleInputData3.max\"\r\n [value]=\"tripleInputData3.value\"\r\n (valueChange)=\"onTripleInputChange($event, 3)\"\r\n ></ard-number-input>\r\n <ard-number-input\r\n *ngIf=\"withOpacity\"\r\n allowQuickChange=\"false\"\r\n [max]=\"tripleInputData4.max\"\r\n [value]=\"tripleInputData4.value\"\r\n (valueChange)=\"onTripleInputChange($event, 4)\"\r\n ></ard-number-input>\r\n</ng-template>", styles: [".ard-color-picker{display:flex;flex-direction:column}.ard-color-picker-click-areas{display:flex;flex-direction:row}.ard-color-picker-click-areas.ard-vertical .ard-color-picker-click-areas{flex-direction:column}.ard-color-picker-shade-map,.ard-color-picker-hue-map,.ard-color-picker-opacity-map{position:relative}.ard-color-picker-shade-map{background:linear-gradient(to bottom,transparent,rgb(0,0,0)),linear-gradient(to right,transparent,var(--ard-color-picker-current-hue)),#fff}.ard-color-picker-hue-map{background:linear-gradient(to bottom,red,#ff8000,#ff0,#80ff00,#0f0,#00ff80,#0ff,#0080ff,#00f,#7f00ff,#f0f,#ff0080,red)}.ard-color-picker-opacity-map{--ard-color-picker-opacity-checkerboard-color: #ccc;--ard-color-picker-opacity-checkerboard-size: 10px;background-image:linear-gradient(45deg,var(--ard-color-picker-opacity-checkerboard-color) 25%,transparent 25%),linear-gradient(-45deg,var(--ard-color-picker-opacity-checkerboard-color) 25%,transparent 25%),linear-gradient(45deg,transparent 75%,var(--ard-color-picker-opacity-checkerboard-color) 75%),linear-gradient(-45deg,transparent 75%,var(--ard-color-picker-opacity-checkerboard-color) 75%);background-size:var(--ard-color-picker-opacity-checkerboard-size) var(--ard-color-picker-opacity-checkerboard-size);background-position:0 0,0 calc(var(--ard-color-picker-opacity-checkerboard-size) / 2),calc(var(--ard-color-picker-opacity-checkerboard-size) / 2) calc(var(--ard-color-picker-opacity-checkerboard-size) / 2 * -1),calc(var(--ard-color-picker-opacity-checkerboard-size) / 2 * -1) 0}.ard-color-picker-opacity-map:before{content:\"\";position:absolute;inset:0;background:linear-gradient(to bottom,var(--ard-color-picker-current-color),transparent)}.ard-color-picker-shade-indicator-container,.ard-color-picker-hue-indicator-container,.ard-color-picker-opacity-indicator-container{position:absolute;transform:translate(-50%,-50%)}.ard-color-picker-reference{--ard-color-picker-opacity-checkerboard-color: #ccc;--ard-color-picker-opacity-checkerboard-size: 10px;background-image:linear-gradient(45deg,var(--ard-color-picker-opacity-checkerboard-color) 25%,transparent 25%),linear-gradient(-45deg,var(--ard-color-picker-opacity-checkerboard-color) 25%,transparent 25%),linear-gradient(45deg,transparent 75%,var(--ard-color-picker-opacity-checkerboard-color) 75%),linear-gradient(-45deg,transparent 75%,var(--ard-color-picker-opacity-checkerboard-color) 75%);background-size:var(--ard-color-picker-opacity-checkerboard-size) var(--ard-color-picker-opacity-checkerboard-size);background-position:0 0,0 calc(var(--ard-color-picker-opacity-checkerboard-size) / 2),calc(var(--ard-color-picker-opacity-checkerboard-size) / 2) calc(var(--ard-color-picker-opacity-checkerboard-size) / 2 * -1),calc(var(--ard-color-picker-opacity-checkerboard-size) / 2 * -1) 0}\n"] }]
404
+ }], propDecorators: { withOpacity: [{
405
+ type: Input
406
+ }], referenceColor: [{
407
+ type: Input
408
+ }], wrapperClasses: [{
409
+ type: Input
410
+ }], variant: [{
411
+ type: Input
412
+ }], vertical: [{
413
+ type: Input
414
+ }], value: [{
415
+ type: Input
416
+ }], colorHue: [{
417
+ type: Input
418
+ }], colorSaturation: [{
419
+ type: Input
420
+ }], colorValue: [{
421
+ type: Input
422
+ }], colorOpacity: [{
423
+ type: Input
424
+ }], valueChange: [{
425
+ type: Output
426
+ }], colorHueChange: [{
427
+ type: Output
428
+ }], colorSaturationChange: [{
429
+ type: Output
430
+ }], colorValueChange: [{
431
+ type: Output
432
+ }], colorOpacityChange: [{
433
+ type: Output
434
+ }], shadeMapEl: [{
435
+ type: ViewChild,
436
+ args: ['shadeMap', { read: ElementRef }]
437
+ }], hueMapEl: [{
438
+ type: ViewChild,
439
+ args: ['hueMap', { read: ElementRef }]
440
+ }], opacityMapEl: [{
441
+ type: ViewChild,
442
+ args: ['opacityMap', { read: ElementRef }]
443
+ }], onDocumentMouseUp: [{
444
+ type: HostListener,
445
+ args: ['document:pointerup']
446
+ }, {
447
+ type: HostListener,
448
+ args: ['document:touchend']
449
+ }], onDocumentMousemove: [{
450
+ type: HostListener,
451
+ args: ['document:pointermove', ['$event']]
452
+ }, {
453
+ type: HostListener,
454
+ args: ['document:touchmove', ['$event']]
455
+ }], shadeIndicatorTemplate: [{
456
+ type: Input
457
+ }], hueIndicatorTemplate: [{
458
+ type: Input
459
+ }], opacityIndicatorTemplate: [{
460
+ type: Input
461
+ }], colorReferenceTemplate: [{
462
+ type: Input
463
+ }], shadeIndicatorTemplateChild: [{
464
+ type: ContentChild,
465
+ args: [ArdColorPickerShadeIndicatorTemplateDirective, {
466
+ read: TemplateRef,
467
+ }]
468
+ }], hueIndicatorTemplateChild: [{
469
+ type: ContentChild,
470
+ args: [ArdColorPickerHueIndicatorTemplateDirective, {
471
+ read: TemplateRef,
472
+ }]
473
+ }], opacityIndicatorTemplateChild: [{
474
+ type: ContentChild,
475
+ args: [ArdColorPickerOpacityIndicatorTemplateDirective, {
476
+ read: TemplateRef,
477
+ }]
478
+ }], colorReferenceTemplateChild: [{
479
+ type: ContentChild,
480
+ args: [ArdColorPickerColorReferenceTemplateDirective, {
481
+ read: TemplateRef,
482
+ }]
483
+ }] } });
484
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sb3ItcGlja2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3VpL3NyYy9saWIvY29sb3IvY29sb3ItcGlja2VyL2NvbG9yLXBpY2tlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy91aS9zcmMvbGliL2NvbG9yL2NvbG9yLXBpY2tlci9jb2xvci1waWNrZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsWUFBWSxFQUNaLFVBQVUsRUFDVixZQUFZLEVBQ1osWUFBWSxFQUNaLEtBQUssRUFFTCxNQUFNLEVBQ04sV0FBVyxFQUNYLFNBQVMsRUFDVCxpQkFBaUIsR0FDcEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLHFCQUFxQixFQUFFLG9CQUFvQixFQUFFLG1CQUFtQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDckcsT0FBTyxLQUFLLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDL0IsT0FBTyxFQUFFLEtBQUssRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDMUUsT0FBTyxFQUNILDZDQUE2QyxFQUM3QywyQ0FBMkMsRUFDM0MsK0NBQStDLEVBQy9DLDZDQUE2QyxHQUNoRCxNQUFNLDJCQUEyQixDQUFDO0FBQ25DLE9BQU8sRUFBaUUsa0JBQWtCLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQzs7Ozs7O0FBRXhKLE1BQU0sa0JBQWtCLEdBQUcsaUNBQWlDLENBQUM7QUFDN0QsTUFBTSx1QkFBdUIsR0FBRyxpQ0FBaUMsQ0FBQztBQWNsRSxNQUFNLE9BQU8sMEJBQTJCLFNBQVEscUJBQXFCO0lBUHJFOztRQVFZLGlCQUFZ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QUFRLENBQUM7O3NCQUMvQyxZQUFZO3VCQUFDLG9CQUFvQixFQUFFLENBQUMsUUFBUSxDQUFDO2dCQW1NckMsc0JBQXNCO3NCQUE5QixLQUFLO2dCQUNHLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFDRyx3QkFBd0I7c0JBQWhDLEtBQUs7Z0JBQ0csc0JBQXNCO3NCQUE5QixLQUFLO2dCQUlOLDJCQUEyQjtzQkFIMUIsWUFBWTt1QkFBQyw2Q0FBNkMsRUFBRTt3QkFDekQsSUFBSSxFQUFFLFdBQVc7cUJBQ3BCO2dCQUtELHlCQUF5QjtzQkFIeEIsWUFBWTt1QkFBQywyQ0FBMkMsRUFBRTt3QkFDdkQsSUFBSSxFQUFFLFdBQVc7cUJBQ3BCO2dCQUtELDZCQUE2QjtzQkFINUIsWUFBWTt1QkFBQywrQ0FBK0MsRUFBRTt3QkFDM0QsSUFBSSxFQUFFLFdBQVc7cUJBQ3BCO2dCQUtELDJCQUEyQjtzQkFIMUIsWUFBWTt1QkFBQyw2Q0FBNkMsRUFBRTt3QkFDekQsSUFBSSxFQUFFLFdBQVc7cUJBQ3BCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICBDb21wb25lbnQsXG4gICAgQ29udGVudENoaWxkLFxuICAgIEVsZW1lbnRSZWYsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIEhvc3RMaXN0ZW5lcixcbiAgICBJbnB1dCxcbiAgICBPbkluaXQsXG4gICAgT3V0cHV0LFxuICAgIFRlbXBsYXRlUmVmLFxuICAgIFZpZXdDaGlsZCxcbiAgICBWaWV3RW5jYXBzdWxhdGlvbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBjb2VyY2VCb29sZWFuUHJvcGVydHksIGNvZXJjZU51bWJlclByb3BlcnR5LCBnZXRFdmVudFJlbGF0aXZlUG9zIH0gZnJvbSAnQGFyZGl1bS11aS9kZXZraXQnO1xuaW1wb3J0ICogYXMgQ29sb3IgZnJvbSAnY29sb3InO1xuaW1wb3J0IHsgcm91bmQsIHJvdW5kVG9NdWx0aXBsZSwgcm91bmRUb1ByZWNpc2lvbiB9IGZyb20gJ21vcmUtcm91bmRpbmcnO1xuaW1wb3J0IHsgX05nTW9kZWxDb21wb25lbnRCYXNlIH0gZnJvbSAnLi4vLi4vX2ludGVybmFsL25nbW9kZWwtY29tcG9uZW50JztcbmltcG9ydCB7XG4gICAgQXJkQ29sb3JQaWNrZXJDb2xvclJlZmVyZW5jZVRlbXBsYXRlRGlyZWN0aXZlLFxuICAgIEFyZENvbG9yUGlja2VySHVlSW5kaWNhdG9yVGVtcGxhdGVEaXJlY3RpdmUsXG4gICAgQXJkQ29sb3JQaWNrZXJPcGFjaXR5SW5kaWNhdG9yVGVtcGxhdGVEaXJlY3RpdmUsXG4gICAgQXJkQ29sb3JQaWNrZXJTaGFkZUluZGljYXRvclRlbXBsYXRlRGlyZWN0aXZlLFxufSBmcm9tICcuL2NvbG9yLXBpY2tlci5kaXJlY3RpdmVzJztcbmltcG9ydCB7IENvbG9yUGlja2VyQ29sb3JSZWZlcmVuY2VDb250ZXh0LCBDb2xvclBpY2tlckluZGljYXRvckNvbnRleHQsIENvbG9yUGlja2VyVmFyaWFudCwgX0NvbG9yUGlja2VySW5wdXRzU2VjdGlvblR5cGUgfSBmcm9tICcuL2NvbG9yLXBpY2tlci50eXBlcyc7XG5cbmNvbnN0IHZhbGlkSGV4Q29sb3JSZWdleCA9IC9eI1swLTlhLWZdezN9KD86WzAtOWEtZl17M30pPyQvaTtcbmNvbnN0IHZhbGlkSGV4QWxwaGFDb2xvclJlZ2V4ID0gL14jWzAtOWEtZl17NH0oPzpbMC05YS1mXXs0fSk/JC9pO1xuXG50eXBlIFRyaXBsZUlucHV0T2JqZWN0ID0ge1xuICAgIHZhbHVlOiBudW1iZXI7XG4gICAgbWF4OiBudW1iZXI7XG59O1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2FyZC1jb2xvci1waWNrZXInLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9jb2xvci1waWNrZXIuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL2NvbG9yLXBpY2tlci5jb21wb25lbnQuc2NzcyddLFxuICAgIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIEFyZGl1bUNvbG9yUGlja2VyQ29tcG9uZW50IGV4dGVuZHMgX05nTW9kZWxDb21wb25lbnRCYXNlIGltcGxlbWVudHMgT25Jbml0IHtcbiAgICBwcml2YXRlIF93aXRoT3BhY2l0eTogYm9vbGVhbiA9IGZhbHNlO1xuICAgIEBJbnB1dCgpXG4gICAgZ2V0IHdpdGhPcGFjaXR5KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fd2l0aE9wYWNpdHk7XG4gICAgfVxuICAgIHNldCB3aXRoT3BhY2l0eSh2OiBhbnkpIHtcbiAgICAgICAgdGhpcy5fd2l0aE9wYWNpdHkgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodik7XG5cbiAgICAgICAgaWYgKHRoaXMuZm9jdXNlZEFyZWEgPT0gJ29wYWNpdHknKSB0aGlzLmZvY3VzZWRBcmVhID0gbnVsbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9yZWZlcmVuY2VDb2xvcjogQ29sb3IgPSBDb2xvcigndHJhbnNwYXJlbnQnKTtcbiAgICBwcml2YXRlIF93YXNSZWZlcmVuY2VDb2xvclNldDogYm9vbGVhbiA9IGZhbHNlO1xuICAgIEBJbnB1dCgpXG4gICAgc2V0IHJlZmVyZW5jZUNvbG9yKHY6IGFueSkge1xuICAgICAgICB0aGlzLl9yZWZlcmVuY2VDb2xvciA9IENvbG9yKHYpO1xuICAgICAgICB0aGlzLl93YXNSZWZlcmVuY2VDb2xvclNldCA9IHRydWU7XG4gICAgfVxuICAgIGdldCByZWZlcmVuY2VDb2xvcigpOiBDb2xvciB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWZlcmVuY2VDb2xvcjtcbiAgICB9XG5cbiAgICAvLyEgYXBwZWFyYW5jZVxuICAgIEBJbnB1dCgpIHdyYXBwZXJDbGFzc2VzOiBzdHJpbmcgPSAnJztcblxuICAgIEBJbnB1dCgpIHZhcmlhbnQ6IENvbG9yUGlja2VyVmFyaWFudCA9IENvbG9yUGlja2VyVmFyaWFudC5Sb3VuZGVkO1xuXG4gICAgcHJpdmF0ZSBfdmVydGljYWw6IGJvb2xlYW4gPSBmYWxzZTsgLy9UT0RPIGltcGxlbWVudCBpbiBDU1NcbiAgICBASW5wdXQoKVxuICAgIGdldCB2ZXJ0aWNhbCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZlcnRpY2FsO1xuICAgIH1cbiAgICBzZXQgdmVydGljYWwodjogYW55KSB7XG4gICAgICAgIHRoaXMuX3ZlcnRpY2FsID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHYpO1xuICAgIH1cblxuICAgIGdldCBuZ0NsYXNzZXMoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIFt0aGlzLndyYXBwZXJDbGFzc2VzLCBgYXJkLXZhcmlhbnQtJHt0aGlzLnZhcmlhbnR9YCwgdGhpcy52ZXJ0aWNhbCA/ICdhcmQtdmVydGljYWwnIDogJyddLmpvaW4oJyAnKTtcbiAgICB9XG5cbiAgICAvLyEgdmFsdWUtcmVsYXRlZFxuICAgIHByaXZhdGUgX3ZhbHVlOiBDb2xvciA9IENvbG9yKCdyZWQnKTtcbiAgICBwcml2YXRlIF9leGFjdEh1ZTogbnVtYmVyID0gMDtcbiAgICBASW5wdXQoKVxuICAgIHNldCB2YWx1ZSh2OiBhbnkpIHtcbiAgICAgICAgdGhpcy53cml0ZVZhbHVlKHYpO1xuICAgIH1cbiAgICBnZXQgdmFsdWUoKTogQ29sb3Ige1xuICAgICAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gICAgfVxuXG4gICAgQElucHV0KClcbiAgICBzZXQgY29sb3JIdWUodjogYW55KSB7XG4gICAgICAgIGNvbnN0IGh1ZSA9IGNvZXJjZU51bWJlclByb3BlcnR5KHYsIDApO1xuICAgICAgICB0aGlzLnZhbHVlLmh1ZShodWUpO1xuICAgIH1cbiAgICBnZXQgY29sb3JIdWUoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWUuaHVlKCk7XG4gICAgfVxuXG4gICAgQElucHV0KClcbiAgICBzZXQgY29sb3JTYXR1cmF0aW9uKHY6IGFueSkge1xuICAgICAgICBjb25zdCBzYXR1cmF0aW9uID0gY29lcmNlTnVtYmVyUHJvcGVydHkodiwgMTAwKTtcbiAgICAgICAgdGhpcy52YWx1ZS5zYXR1cmF0aW9ubChzYXR1cmF0aW9uKTtcbiAgICB9XG4gICAgZ2V0IGNvbG9yU2F0dXJhdGlvbigpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZS5zYXR1cmF0aW9ubCgpO1xuICAgIH1cblxuICAgIEBJbnB1dCgpXG4gICAgc2V0IGNvbG9yVmFsdWUodjogYW55KSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gY29lcmNlTnVtYmVyUHJvcGVydHkodiwgMTAwKTtcbiAgICAgICAgdGhpcy52YWx1ZS52YWx1ZSh2YWx1ZSk7XG4gICAgfVxuICAgIGdldCBjb2xvclZhbHVlKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlLnZhbHVlKCk7XG4gICAgfVxuXG4gICAgQElucHV0KClcbiAgICBzZXQgY29sb3JPcGFjaXR5KHY6IGFueSkge1xuICAgICAgICBjb25zdCBvcGFjaXR5ID0gY29lcmNlTnVtYmVyUHJvcGVydHkodiwgMSk7XG4gICAgICAgIHRoaXMudmFsdWUuYWxwaGEob3BhY2l0eSk7XG4gICAgfVxuICAgIGdldCBjb2xvck9wYWNpdHkoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWUuYWxwaGEoKTtcbiAgICB9XG5cbiAgICBAT3V0cHV0KCkgdmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPENvbG9yPigpO1xuICAgIEBPdXRwdXQoKSBjb2xvckh1ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xuICAgIEBPdXRwdXQoKSBjb2xvclNhdHVyYXRpb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcbiAgICBAT3V0cHV0KCkgY29sb3JWYWx1ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xuICAgIEBPdXRwdXQoKSBjb2xvck9wYWNpdHlDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcblxuICAgIHdyaXRlVmFsdWUodjogYW55KSB7XG4gICAgICAgIHRoaXMuX3ZhbHVlID0gQ29sb3Iodik7XG5cbiAgICAgICAgdGhpcy5fdXBkYXRlQ3VycmVudFNoYWRlTWFwQ29sb3IoKTtcbiAgICAgICAgdGhpcy5fdXBkYXRlQ3VycmVudE9wYWNpdHlNYXBDb2xvcigpO1xuICAgICAgICB0aGlzLl91cGRhdGVIZXhJbnB1dFZhbHVlKCk7XG4gICAgICAgIHRoaXMuX3VwZGF0ZVRyaXBsZUlucHV0VmFsdWVzKCk7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLl93YXNSZWZlcmVuY2VDb2xvclNldCkgcmV0dXJuO1xuXG4gICAgICAgIHRoaXMuX3dhc1JlZmVyZW5jZUNvbG9yU2V0ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5yZWZlcmVuY2VDb2xvciA9IENvbG9yKHRoaXMudmFsdWUpO1xuXG4gICAgICAgIHRoaXMuX3VwZGF0ZUhleElucHV0VmFsdWUoKTtcbiAgICB9XG5cbiAgICAvLyEgY3JlYXRpbmcgbmV3IHZhbHVlIGZyb20gaW50ZXJhY3Rpb25zXG4gICAgQFZpZXdDaGlsZCgnc2hhZGVNYXAnLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSlcbiAgICBzaGFkZU1hcEVsITogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XG4gICAgQFZpZXdDaGlsZCgnaHVlTWFwJywgeyByZWFkOiBFbGVtZW50UmVmIH0pXG4gICAgaHVlTWFwRWwhOiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PjtcbiAgICBAVmlld0NoaWxkKCdvcGFjaXR5TWFwJywgeyByZWFkOiBFbGVtZW50UmVmIH0pXG4gICAgb3BhY2l0eU1hcEVsITogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XG5cbiAgICBmb2N1c2VkQXJlYTogJ3NoYWRlJyB8ICdodWUnIHwgJ29wYWNpdHknIHwgbnVsbCA9IG51bGw7XG5cbiAgICBvblNoYWRlQXJlYU1vdXNlRG93bihldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9pc01vdXNlRG93biA9IHRydWU7XG4gICAgICAgIHRoaXMuX3VwZGF0ZVNoYWRlRnJvbUV2ZW50KGV2ZW50KTtcbiAgICB9XG4gICAgb25IdWVBcmVhTW91c2VEb3duKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2lzTW91c2VEb3duID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fdXBkYXRlSHVlRnJvbUV2ZW50KGV2ZW50KTtcbiAgICB9XG4gICAgb25PcGFjaXR5QXJlYU1vdXNlRG93bihldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9pc01vdXNlRG93biA9IHRydWU7XG4gICAgICAgIHRoaXMuX3VwZGF0ZU9wYWNpdHlGcm9tRXZlbnQoZXZlbnQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2lzTW91c2VEb3duOiBib29sZWFuID0gZmFsc2U7XG4gICAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6cG9pbnRlcnVwJylcbiAgICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDp0b3VjaGVuZCcpXG4gICAgb25Eb2N1bWVudE1vdXNlVXAoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2lzTW91c2VEb3duID0gZmFsc2U7XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6cG9pbnRlcm1vdmUnLCBbJyRldmVudCddKVxuICAgIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OnRvdWNobW92ZScsIFsnJGV2ZW50J10pXG4gICAgb25Eb2N1bWVudE1vdXNlbW92ZShldmVudDogTW91c2VFdmVudCB8IFRvdWNoRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmZvY3VzZWRBcmVhIHx8ICF0aGlzLl9pc01vdXNlRG93bikgcmV0dXJuO1xuXG4gICAgICAgIGlmICghKGV2ZW50IGluc3RhbmNlb2YgVG91Y2hFdmVudCkpIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgaWYgKHRoaXMuZm9jdXNlZEFyZWEgPT0gJ3NoYWRlJykge1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlU2hhZGVGcm9tRXZlbnQoZXZlbnQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmZvY3VzZWRBcmVhID09ICdodWUnKSB7XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVIdWVGcm9tRXZlbnQoZXZlbnQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3VwZGF0ZU9wYWNpdHlGcm9tRXZlbnQoZXZlbnQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3VwZGF0ZVNoYWRlRnJvbUV2ZW50KGV2ZW50OiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCB7IGxlZnQsIHJpZ2h0LCB0b3AsIGJvdHRvbSB9ID0gZ2V0RXZlbnRSZWxhdGl2ZVBvcyhldmVudCwgdGhpcy5zaGFkZU1hcEVsKTtcblxuICAgICAgICBjb25zdCBzaGFkZU1hcFdpZHRoID0gbGVmdCArIHJpZ2h0O1xuICAgICAgICBjb25zdCBuZXdTYXR1cmF0aW9uUmF3ID0gKGxlZnQgLyBzaGFkZU1hcFdpZHRoKSAqIDEwMDtcbiAgICAgICAgY29uc3QgbmV3U2F0dXJhdGlvbiA9IHJvdW5kKE1hdGgubWF4KDAsIE1hdGgubWluKDEwMCwgbmV3U2F0dXJhdGlvblJhdykpKTtcblxuICAgICAgICBjb25zdCBzaGFkZU1hcEhlaWdodCA9IHRvcCArIGJvdHRvbTtcbiAgICAgICAgY29uc3QgbmV3VmFsdWVSYXcgPSAoYm90dG9tIC8gc2hhZGVNYXBIZWlnaHQpICogMTAwO1xuICAgICAgICBjb25zdCBuZXdWYWx1ZSA9IHJvdW5kKE1hdGgubWF4KDAsIE1hdGgubWluKDEwMCwgbmV3VmFsdWVSYXcpKSk7XG5cbiAgICAgICAgY29uc3Qgb2xkU2F0dXJhdGlvbiA9IHRoaXMudmFsdWUuc2F0dXJhdGlvbnYoKTtcbiAgICAgICAgY29uc3Qgb2xkVmFsdWUgPSB0aGlzLnZhbHVlLnZhbHVlKCk7XG5cbiAgICAgICAgaWYgKG9sZFNhdHVyYXRpb24gPT0gbmV3U2F0dXJhdGlvbiAmJiBvbGRWYWx1ZSA9PSBuZXdWYWx1ZSkgcmV0dXJuO1xuXG4gICAgICAgIHRoaXMudmFsdWUgPSBDb2xvcih0aGlzLnZhbHVlKS5zYXR1cmF0aW9udihuZXdTYXR1cmF0aW9uKS52YWx1ZShuZXdWYWx1ZSk7XG5cbiAgICAgICAgdGhpcy5fZW1pdENoYW5nZSgpO1xuICAgICAgICB0aGlzLl91cGRhdGVDdXJyZW50T3BhY2l0eU1hcENvbG9yKCk7XG4gICAgICAgIC8vZW1pdCBzcGVjaWZpYyBldmVudHNcbiAgICAgICAgaWYgKG9sZFNhdHVyYXRpb24gIT0gdGhpcy52YWx1ZS5zYXR1cmF0aW9udigpKSB0aGlzLmNvbG9yU2F0dXJhdGlvbkNoYW5nZS5uZXh0KHRoaXMudmFsdWUuc2F0dXJhdGlvbnYoKSk7XG4gICAgICAgIGlmIChvbGRWYWx1ZSAhPSB0aGlzLnZhbHVlLnZhbHVlKCkpIHRoaXMuY29sb3JWYWx1ZUNoYW5nZS5uZXh0KHRoaXMudmFsdWUudmFsdWUoKSk7XG4gICAgfVxuICAgIHByaXZhdGUgX3VwZGF0ZUh1ZUZyb21FdmVudChldmVudDogTW91c2VFdmVudCB8IFRvdWNoRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgeyB0b3AsIGJvdHRvbSB9ID0gZ2V0RXZlbnRSZWxhdGl2ZVBvcyhldmVudCwgdGhpcy5odWVNYXBFbCk7XG5cbiAgICAgICAgY29uc3QgaHVlTWFwSGVpZ2h0ID0gdG9wICsgYm90dG9tO1xuICAgICAgICBjb25zdCBuZXdIdWVSYXcgPSAodG9wIC8gaHVlTWFwSGVpZ2h0KSAqIDM2MDtcbiAgICAgICAgY29uc3QgbmV3SHVlID0gcm91bmQoTWF0aC5tYXgoMCwgTWF0aC5taW4oMzYwLCBuZXdIdWVSYXcpKSk7XG4gICAgICAgIGNvbnN0IG5ld0h1ZUV4YWN0ID0gbmV3SHVlID09IDM2MCA/IDM1OS45OSA6IG5ld0h1ZTtcblxuICAgICAgICBpZiAodGhpcy52YWx1ZS5odWUoKSA9PSBuZXdIdWVFeGFjdCkgcmV0dXJuO1xuXG4gICAgICAgIHRoaXMudmFsdWUgPSBDb2xvcih0aGlzLnZhbHVlKS5odWUobmV3SHVlRXhhY3QpO1xuXG4gICAgICAgIHRoaXMuX2VtaXRDaGFuZ2UoKTtcbiAgICAgICAgdGhpcy5jb2xvckh1ZUNoYW5nZS5uZXh0KHRoaXMudmFsdWUuaHVlKCkpO1xuICAgICAgICB0aGlzLl91cGRhdGVDdXJyZW50U2hhZGVNYXBDb2xvcigpO1xuICAgICAgICB0aGlzLl91cGRhdGVDdXJyZW50T3BhY2l0eU1hcENvbG9yKCk7XG4gICAgfVxuICAgIHByaXZhdGUgX3VwZGF0ZU9wYWNpdHlGcm9tRXZlbnQoZXZlbnQ6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy53aXRoT3BhY2l0eSkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IHsgdG9wLCBib3R0b20gfSA9IGdldEV2ZW50UmVsYXRpdmVQb3MoZXZlbnQsIHRoaXMub3BhY2l0eU1hcEVsKTtcblxuICAgICAgICBjb25zdCBodWVNYXBIZWlnaHQgPSB0b3AgKyBib3R0b207XG4gICAgICAgIGNvbnN0IG5ld09wYWNpdHlSYXcgPSBib3R0b20gLyBodWVNYXBIZWlnaHQ7XG4gICAgICAgIGNvbnN0IG5ld09wYWNpdHkgPSByb3VuZFRvUHJlY2lzaW9uKE1hdGgubWF4KDAsIE1hdGgubWluKDEsIG5ld09wYWNpdHlSYXcpKSwgMik7XG5cbiAgICAgICAgaWYgKHRoaXMudmFsdWUuYWxwaGEoKSA9PSBuZXdPcGFjaXR5KSByZXR1cm47XG5cbiAgICAgICAgdGhpcy52YWx1ZSA9IENvbG9yKHRoaXMudmFsdWUpLmFscGhhKG5ld09wYWNpdHkpO1xuXG4gICAgICAgIHRoaXMuX2VtaXRDaGFuZ2UoKTtcbiAgICAgICAgdGhpcy5jb2xvck9wYWNpdHlDaGFuZ2UubmV4dCh0aGlzLnZhbHVlLmFscGhhKCkpO1xuICAgIH1cblxuICAgIC8vISBkaXNwbGF5aW5nIHRoZSBtYXBzIGNvcnJlY3RseVxuICAgIGN1cnJlbnRTaGFkZU1hcENvbG9yOiBDb2xvciA9IHRoaXMudmFsdWU7XG4gICAgcHJpdmF0ZSBfdXBkYXRlQ3VycmVudFNoYWRlTWFwQ29sb3IoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY3VycmVudFNoYWRlTWFwQ29sb3IgPSBDb2xvci5oc3YodGhpcy52YWx1ZS5odWUoKSwgMTAwLCAxMDApO1xuICAgIH1cbiAgICBjdXJyZW50T3BhY2l0eU1hcENvbG9yOiBDb2xvciA9IHRoaXMudmFsdWU7XG4gICAgcHJpdmF0ZSBfdXBkYXRlQ3VycmVudE9wYWNpdHlNYXBDb2xvcigpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLndpdGhPcGFjaXR5KSByZXR1cm47XG4gICAgICAgIHRoaXMuY3VycmVudE9wYWNpdHlNYXBDb2xvciA9IENvbG9yLmhzdih0aGlzLnZhbHVlLmh1ZSgpLCB0aGlzLnZhbHVlLnNhdHVyYXRpb252KCksIHRoaXMudmFsdWUudmFsdWUoKSk7XG4gICAgfVxuXG4gICAgZ2V0U2hhZGVJbmRpY2F0b3JQb3NpdGlvbigpOiB7ICctLXRvcCc6IHN0cmluZzsgJy0tbGVmdCc6IHN0cmluZyB9IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICctLXRvcCc6IDEwMCAtIHRoaXMudmFsdWUudmFsdWUoKSArICclJyxcbiAgICAgICAgICAgICctLWxlZnQnOiB0aGlzLnZhbHVlLnNhdHVyYXRpb252KCkgKyAnJScsXG4gICAgICAgIH07XG4gICAgfVxuICAgIGdldEh1ZUluZGljYXRvclBvc2l0aW9uKCk6IHsgJy0tdG9wJzogc3RyaW5nIH0ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgJy0tdG9wJzogdGhpcy52YWx1ZS5odWUoKSAvIDMuNiArICclJyxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgZ2V0T3BhY2l0eUluZGljYXRvclBvc2l0aW9uKCk6IHsgJy0tdG9wJzogc3RyaW5nIH0ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgJy0tdG9wJzogMTAwIC0gdGhpcy52YWx1ZS5hbHBoYSgpICogMTAwICsgJyUnLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8vISBpbnB1dHMgc2VjdGlvblxuICAgIGlucHV0VHlwZXM6IF9Db2xvclBpY2tlcklucHV0c1NlY3Rpb25UeXBlW10gPSBPYmplY3QudmFsdWVzKF9Db2xvclBpY2tlcklucHV0c1NlY3Rpb25UeXBlKTtcbiAgICBjdXJyZW50SW5wdXRUeXBlOiBfQ29sb3JQaWNrZXJJbnB1dHNTZWN0aW9uVHlwZSA9IF9Db2xvclBpY2tlcklucHV0c1NlY3Rpb25UeXBlLkhFWDtcblxuICAgIG9uQ3VycmVudElucHV0VHlwZUNoYW5nZSh2YWx1ZTogX0NvbG9yUGlja2VySW5wdXRzU2VjdGlvblR5cGVbXSk6IHZvaWQge1xuICAgICAgICB0aGlzLmN1cnJlbnRJbnB1dFR5cGUgPSB2YWx1ZVswXTtcblxuICAgICAgICBpZiAodGhpcy5jdXJyZW50SW5wdXRUeXBlICE9IF9Db2xvclBpY2tlcklucHV0c1NlY3Rpb25UeXBlLkhFWCkge1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlVHJpcGxlSW5wdXRWYWx1ZXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGhleElucHV0VmFsdWU6IHN0cmluZyA9IHRoaXMudmFsdWUuaGV4KCk7XG4gICAgcHJpdmF0ZSBfdXBkYXRlSGV4SW5wdXRWYWx1ZSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudElucHV0VHlwZSAhPSBfQ29sb3JQaWNrZXJJbnB1dHNTZWN0aW9uVHlwZS5IRVgpIHJldHVybjtcblxuICAgICAgICBjb25zdCBIRVggPSB0aGlzLnZhbHVlO1xuICAgICAgICB0aGlzLmhleElucHV0VmFsdWUgPSBIRVguaGV4KCkucmVwbGFjZSgnIycsICcnKTtcbiAgICAgICAgdGhpcy50cmlwbGVJbnB1dERhdGE0LnZhbHVlID0gSEVYLmFscGhhKCkgKiAxMDA7XG4gICAgfVxuXG4gICAgdHJpcGxlSW5wdXREYXRhMTogVHJpcGxlSW5wdXRPYmplY3QgPSB7XG4gICAgICAgIHZhbHVlOiAwLFxuICAgICAgICBtYXg6IDAgLyogdGVtcG9yYXJ5IHZhbHVlICovLFxuICAgIH07XG4gICAgdHJpcGxlSW5wdXREYXRhMjogVHJpcGxlSW5wdXRPYmplY3QgPSB7XG4gICAgICAgIHZhbHVlOiAwLFxuICAgICAgICBtYXg6IDAgLyogdGVtcG9yYXJ5IHZhbHVlICovLFxuICAgIH07XG4gICAgdHJpcGxlSW5wdXREYXRhMzogVHJpcGxlSW5wdXRPYmplY3QgPSB7XG4gICAgICAgIHZhbHVlOiAwLFxuICAgICAgICBtYXg6IDAgLyogdGVtcG9yYXJ5IHZhbHVlICovLFxuICAgIH07XG4gICAgdHJpcGxlSW5wdXREYXRhNDogVHJpcGxlSW5wdXRPYmplY3QgPSB7IHZhbHVlOiAwLCBtYXg6IDEwMCB9O1xuICAgIHByaXZhdGUgX3VwZGF0ZVRyaXBsZUlucHV0VmFsdWVzKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5jdXJyZW50SW5wdXRUeXBlID09IF9Db2xvclBpY2tlcklucHV0c1NlY3Rpb25UeXBlLkhFWCkgcmV0dXJuO1xuXG4gICAgICAgIHN3aXRjaCAodGhpcy5jdXJyZW50SW5wdXRUeXBlKSB7XG4gICAgICAgICAgICBjYXNlIF9Db2xvclBpY2tlcklucHV0c1NlY3Rpb25UeXBlLlJHQjpcbiAgICAgICAgICAgICAgICBjb25zdCBSR0IgPSB0aGlzLnZhbHVlLnJnYigpO1xuICAgICAgICAgICAgICAgIHRoaXMudHJpcGxlSW5wdXREYXRhMS52YWx1ZSA9IFJHQi5yZWQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnRyaXBsZUlucHV0RGF0YTEubWF4ID0gMjU1O1xuICAgICAgICAgICAgICAgIHRoaXMudHJpcGxlSW5wdXREYXRhMi52YWx1ZSA9IFJHQi5ncmVlbigpO1xuICAgICAgICAgICAgICAgIHRoaXMudHJpcGxlSW5wdXREYXRhMi5tYXggPSAyNTU7XG4gICAgICAgICAgICAgICAgdGhpcy50cmlwbGVJbnB1dERhdGEzLnZhbHVlID0gUkdCLmJsdWUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnRyaXBsZUlucHV0RGF0YTMubWF4ID0gMjU1O1xuICAgICAgICAgICAgICAgIHRoaXMudHJpcGxlSW5wdXREYXRhNC52YWx1ZSA9IFJHQi5hbHBoYSgpICogMTAwO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBfQ29sb3JQaWNrZXJJbnB1dHNTZWN0aW9uVHlwZS5IU0w6XG4gICAgICAgICAgICAgICAgY29uc3QgSFNMID0gdGhpcy52YWx1ZS5oc2woKTtcbiAgICAgICAgICAgICAgICB0aGlzLnRyaXBsZUlucHV0RGF0YTEudmFsdWUgPSBIU0wuaHVlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy50cmlwbGVJbnB1dERhdGExLm1heCA9IDM2MDtcbiAgICAgICAgICAgICAgICB0aGlzLnRyaXBsZUlucHV0RGF0YTIudmFsdWUgPSBIU0wuc2F0dXJhdGlvbmwoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnRyaXBsZUlucHV0RGF0YTIubWF4ID0gMTAwO1xuICAgICAgICAgICAgICAgIHRoaXMudHJpcGxlSW5wdXREYXRhMy52YWx1ZSA9IEhTTC5saWdodG5lc3MoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnRyaXBsZUlucHV0RGF0YTMubWF4ID0gMTAwO1xuICAgICAgICAgICAgICAgIHRoaXMudHJpcGxlSW5wdXREYXRhNC52YWx1ZSA9IEhTTC5hbHBoYSgpICogMTAwO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBfQ29sb3JQaWNrZXJJbnB1dHNTZWN0aW9uVHlwZS5IU1Y6XG4gICAgICAgICAgICAgICAgY29uc3QgSFNWID0gdGhpcy52YWx1ZS5oc3YoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnRyaXBsZUlucHV0RGF0YTEudmFsdWUgPSBIU1YuaHVlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy50cmlwbGVJbnB1dERhdGExLm1heCA9IDM2MDtcbiAgICAgICAgICAgICAgICB0aGlzLnRyaXBsZUlucHV0RGF0YTIudmFsdWUgPSBIU1Yuc2F0dXJhdGlvbnYoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnRyaXBsZUlucHV0RGF0YTIubWF4ID0gMTAwO1xuICAgICAgICAgICAgICAgIHRoaXMudHJpcGxlSW5wdXREYXRhMy52YWx1ZSA9IEhTVi52YWx1ZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMudHJpcGxlSW5wdXREYXRhMy5tYXggPSAxMDA7XG4gICAgICAgICAgICAgICAgdGhpcy50cmlwbGVJbnB1dERhdGE0LnZhbHVlID0gSFNWLmFscGhhKCkgKiAxMDA7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbkhleElucHV0Q2hhbmdlKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMud2l0aE9wYWNpdHkpIHtcbiAgICAgICAgICAgIGlmICghdmFsdWUubWF0Y2godmFsaWRIZXhBbHBoYUNvbG9yUmVnZXgpKSByZXR1cm47XG4gICAgICAgIH0gZWxzZSBpZiAoIXZhbHVlLm1hdGNoKHZhbGlkSGV4Q29sb3JSZWdleCkpIHJldHVybjtcblxuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuXG4gICAgb25UcmlwbGVJbnB1dENoYW5nZSh2YWx1ZTogbnVtYmVyIHwgbnVsbCwgaW5kZXg6IG51bWJlcik6IHZvaWQge31cblxuICAgIC8vISBldmVudHNcbiAgICBwcm90ZWN0ZWQgX2VtaXRDaGFuZ2UoKSB7XG4gICAgICAgIGNvbnN0IHYgPSB0aGlzLnZhbHVlO1xuICAgICAgICB0aGlzLl9vbkNoYW5nZVJlZ2lzdGVyZWQ/Lih2KTtcbiAgICAgICAgdGhpcy52YWx1ZUNoYW5nZS5uZXh0KHYpO1xuICAgIH1cblxuICAgIC8vISB0ZW1wbGF0ZSBjdXN0b21pemF0aW9uXG4gICAgQElucHV0KCkgc2hhZGVJbmRpY2F0b3JUZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT47XG4gICAgQElucHV0KCkgaHVlSW5kaWNhdG9yVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxhbnk+O1xuICAgIEBJbnB1dCgpIG9wYWNpdHlJbmRpY2F0b3JUZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT47XG4gICAgQElucHV0KCkgY29sb3JSZWZlcmVuY2VUZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT47XG4gICAgQENvbnRlbnRDaGlsZChBcmRDb2xvclBpY2tlclNoYWRlSW5kaWNhdG9yVGVtcGxhdGVEaXJlY3RpdmUsIHtcbiAgICAgICAgcmVhZDogVGVtcGxhdGVSZWYsXG4gICAgfSlcbiAgICBzaGFkZUluZGljYXRvclRlbXBsYXRlQ2hpbGQ/OiBUZW1wbGF0ZVJlZjxhbnk+O1xuICAgIEBDb250ZW50Q2hpbGQoQXJkQ29sb3JQaWNrZXJIdWVJbmRpY2F0b3JUZW1wbGF0ZURpcmVjdGl2ZSwge1xuICAgICAgICByZWFkOiBUZW1wbGF0ZVJlZixcbiAgICB9KVxuICAgIGh1ZUluZGljYXRvclRlbXBsYXRlQ2hpbGQ/OiBUZW1wbGF0ZVJlZjxhbnk+O1xuICAgIEBDb250ZW50Q2hpbGQoQXJkQ29sb3JQaWNrZXJPcGFjaXR5SW5kaWNhdG9yVGVtcGxhdGVEaXJlY3RpdmUsIHtcbiAgICAgICAgcmVhZDogVGVtcGxhdGVSZWYsXG4gICAgfSlcbiAgICBvcGFjaXR5SW5kaWNhdG9yVGVtcGxhdGVDaGlsZD86IFRlbXBsYXRlUmVmPGFueT47XG4gICAgQENvbnRlbnRDaGlsZChBcmRDb2xvclBpY2tlckNvbG9yUmVmZXJlbmNlVGVtcGxhdGVEaXJlY3RpdmUsIHtcbiAgICAgICAgcmVhZDogVGVtcGxhdGVSZWYsXG4gICAgfSlcbiAgICBjb2xvclJlZmVyZW5jZVRlbXBsYXRlQ2hpbGQ/OiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgZ2V0SW5kaWNhdG9yQ29udGV4dCgpOiBDb2xvclBpY2tlckluZGljYXRvckNvbnRleHQge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgJGltcGxpY2l0OiB0aGlzLnZhbHVlLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBnZXRDb2xvclJlZmVyZW5jZUNvbnRleHQoKTogQ29sb3JQaWNrZXJDb2xvclJlZmVyZW5jZUNvbnRleHQge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29sb3I6IHRoaXMudmFsdWUsXG4gICAgICAgICAgICAkaW1wbGljaXQ6IHRoaXMudmFsdWUsXG4gICAgICAgICAgICByZWZlcmVuY2VDb2xvcjogdGhpcy5yZWZlcmVuY2VDb2xvcixcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyEga2V5Ym9hcmQgY29udHJvbHNcbiAgICBvbktleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaGFzU2hpZnQgPSBldmVudC5zaGlmdEtleTtcbiAgICAgICAgc3dpdGNoIChldmVudC5rZXkpIHtcbiAgICAgICAgICAgIGNhc2UgJ0Fycm93UmlnaHQnOlxuICAgICAgICAgICAgY2FzZSAnQXJyb3dMZWZ0JzpcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5mb2N1c2VkQXJlYSAhPSAnc2hhZGUnKSByZXR1cm47XG4gICAgICAgICAgICAgICAgdGhpcy5udWRnZUNvbG9yU2F0dXJhdGlvbihldmVudC5rZXkgPT0gJ0Fycm93UmlnaHQnID8gMSA6IC0xLCBoYXNTaGlmdCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgJ0Fycm93VXAnOlxuICAgICAgICAgICAgY2FzZSAnQXJyb3dEb3duJzpcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMuZm9jdXNlZEFyZWEpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnc2hhZGUnOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5udWRnZUNvbG9yVmFsdWUoZXZlbnQua2V5ID09ICdBcnJvd1VwJyA/IDEgOiAtMSwgaGFzU2hpZnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2h1ZSc6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm51ZGdlQ29sb3JIdWUoZXZlbnQua2V5ID09ICdBcnJvd0Rvd24nID8gMSA6IC0xLCBoYXNTaGlmdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnb3BhY2l0eSc6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm51ZGdlQ29sb3JPcGFjaXR5KGV2ZW50LmtleSA9PSAnQXJyb3dVcCcgPyAxIDogLTEsIGhhc1NoaWZ0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKG5ldyBFcnJvcihgVW5leHBlY3RlZCBhcmQtY29sb3ItcGlja2VyLl9mb2N1c2VkQXJlYSBzdGF0ZSBcIiR7dGhpcy5mb2N1c2VkQXJlYX1cImApKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICBudWRnZUNvbG9yU2F0dXJhdGlvbihkaXJlY3Rpb246IDEgfCAtMSwgaGFzU2hpZnQ/OiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHYgPSB0aGlzLnZhbHVlO1xuICAgICAgICBsZXQgZGlmZiA9IChkaXJlY3Rpb24gKiAxMDApIC8gMjU1O1xuICAgICAgICBsZXQgbmV3VmFsOiBudW1iZXI7XG4gICAgICAgIGlmIChoYXNTaGlmdCkge1xuICAgICAgICAgICAgZGlmZiA9IChkaWZmICogMjU1KSAvIDEwO1xuICAgICAgICAgICAgbmV3VmFsID0gdi5zYXR1cmF0aW9udigpICsgZGlmZjtcbiAgICAgICAgICAgIG5ld1ZhbCA9IHJvdW5kVG9NdWx0aXBsZShuZXdWYWwsIE1hdGguYWJzKGRpZmYpKTsgLy9yb3VuZCB0byB0ZW5zXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBuZXdWYWwgPSB2LnNhdHVyYXRpb252KCkgKyBkaWZmO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5ld1ZhbENsYW1wZWQgPSBNYXRoLm1heCgwLCBNYXRoLm1pbigxMDAsIG5ld1ZhbCkpO1xuICAgICAgICB0aGlzLnZhbHVlID0gQ29sb3Iodikuc2F0dXJhdGlvbnYobmV3VmFsQ2xhbXBlZCk7XG4gICAgfVxuICAgIG51ZGdlQ29sb3JWYWx1ZShkaXJlY3Rpb246IDEgfCAtMSwgaGFzU2hpZnQ/OiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHYgPSB0aGlzLnZhbHVlO1xuICAgICAgICBsZXQgZGlmZiA9IChkaXJlY3Rpb24gKiAxMDApIC8gMjU1O1xuICAgICAgICBsZXQgbmV3VmFsOiBudW1iZXI7XG4gICAgICAgIGlmIChoYXNTaGlmdCkge1xuICAgICAgICAgICAgZGlmZiA9IChkaWZmICogMjU1KSAvIDEwO1xuICAgICAgICAgICAgbmV3VmFsID0gdi52YWx1ZSgpICsgZGlmZjtcbiAgICAgICAgICAgIG5ld1ZhbCA9IHJvdW5kVG9NdWx0aXBsZShuZXdWYWwsIE1hdGguYWJzKGRpZmYpKTsgLy9yb3VuZCB0byB0ZW5zXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBuZXdWYWwgPSB2LnZhbHVlKCkgKyBkaWZmO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5ld1ZhbENsYW1wZWQgPSBNYXRoLm1heCgwLCBNYXRoLm1pbigxMDAsIG5ld1ZhbCkpO1xuICAgICAgICB0aGlzLnZhbHVlID0gQ29sb3IodikudmFsdWUobmV3VmFsQ2xhbXBlZCk7XG4gICAgfVxuICAgIG51ZGdlQ29sb3JIdWUoZGlyZWN0aW9uOiAxIHwgLTEsIGhhc1NoaWZ0PzogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICBjb25zdCB2ID0gdGhpcy52YWx1ZTtcbiAgICAgICAgbGV0IGRpZmYgPSBkaXJlY3Rpb24gYXMgbnVtYmVyLFxuICAgICAgICAgICAgbmV3VmFsOiBudW1iZXI7XG4gICAgICAgIGlmIChoYXNTaGlmdCkge1xuICAgICAgICAgICAgZGlmZiA9IGRpcmVjdGlvbiAqIDMwO1xuICAgICAgICAgICAgbmV3VmFsID0gdi5odWUoKSArIGRpZmY7XG4gICAgICAgICAgICBuZXdWYWwgPSByb3VuZFRvTXVsdGlwbGUobmV3VmFsLCBNYXRoLmFicyhkaWZmKSk7IC8vcm91bmQgdG8gdGVuc1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbmV3VmFsID0gdi5odWUoKSArIGRpZmY7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbmV3VmFsQ2xhbXBlZCA9IE1hdGgubWF4KDAsIE1hdGgubWluKDM1OS45OSwgbmV3VmFsKSk7XG4gICAgICAgIGNvbnNvbGUubG9nKG5ld1ZhbENsYW1wZWQpO1xuICAgICAgICB0aGlzLnZhbHVlID0gQ29sb3IodikuaHVlKG5ld1ZhbENsYW1wZWQpO1xuICAgIH1cbiAgICBudWRnZUNvbG9yT3BhY2l0eShkaXJlY3Rpb246IDEgfCAtMSwgaGFzU2hpZnQ/OiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHYgPSB0aGlzLnZhbHVlO1xuICAgICAgICBsZXQgZGlmZiA9IGRpcmVjdGlvbiAqIDAuMDE7XG4gICAgICAgIGxldCBuZXdWYWw6IG51bWJlcjtcbiAgICAgICAgaWYgKGhhc1NoaWZ0KSB7XG4gICAgICAgICAgICBkaWZmID0gZGlmZiAqIDEwO1xuICAgICAgICAgICAgbmV3VmFsID0gdi5hbHBoYSgpICsgZGlmZjtcbiAgICAgICAgICAgIG5ld1ZhbCA9IHJvdW5kVG9QcmVjaXNpb24obmV3VmFsLCAxKTsgLy9yb3VuZCB0byBvbmUgcGxhY2VcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5ld1ZhbCA9IHYuYWxwaGEoKSArIGRpZmY7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbmV3VmFsQ2xhbXBlZCA9IE1hdGgubWF4KDAsIE1hdGgubWluKDEsIG5ld1ZhbCkpO1xuICAgICAgICB0aGlzLnZhbHVlID0gQ29sb3IodikuYWxwaGEobmV3VmFsQ2xhbXBlZCk7XG4gICAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImFyZC1jb2xvci1waWNrZXJcIiBbbmdDbGFzc109XCJuZ0NsYXNzZXNcIiAoa2V5ZG93bik9XCJvbktleWRvd24oJGV2ZW50KVwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImFyZC1jb2xvci1waWNrZXItY2xpY2stYXJlYXNcIlxyXG4gICAgICAgIFtzdHlsZV09XCJ7XHJcbiAgICAgICAgICAgICctLWFyZC1jb2xvci1waWNrZXItY3VycmVudC1odWUnOiBjdXJyZW50U2hhZGVNYXBDb2xvcixcclxuICAgICAgICAgICAgJy0tYXJkLWNvbG9yLXBpY2tlci1jdXJyZW50LWNvbG9yJzogY3VycmVudE9wYWNpdHlNYXBDb2xvclxyXG4gICAgICAgIH1cIlxyXG4gICAgPlxyXG4gICAgICAgIDxkaXYgI3NoYWRlTWFwXHJcbiAgICAgICAgICAgIFt0YWJJbmRleF09XCJ0YWJJbmRleFwiXHJcbiAgICAgICAgICAgIGNsYXNzPVwiYXJkLWNvbG9yLXBpY2tlci1zaGFkZS1tYXBcIlxyXG4gICAgICAgICAgICAoZm9jdXMpPVwib25Gb2N1cygkZXZlbnQpXCJcclxuICAgICAgICAgICAgKGZvY3VzKT1cImZvY3VzZWRBcmVhID0gJ3NoYWRlJ1wiXHJcbiAgICAgICAgICAgIChibHVyKT1cIm9uQmx1cigkZXZlbnQpXCJcclxuICAgICAgICAgICAgKGJsdXIpPVwiZm9jdXNlZEFyZWEgPSBudWxsXCJcclxuICAgICAgICAgICAgKG1vdXNlZG93bik9XCJvblNoYWRlQXJlYU1vdXNlRG93bigkZXZlbnQpXCJcclxuICAgICAgICAgICAgKHBvaW50ZXJkb3duKT1cIm9uU2hhZGVBcmVhTW91c2VEb3duKCRldmVudClcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFyZC1jb2xvci1waWNrZXItc2hhZGUtaW5kaWNhdG9yLWNvbnRhaW5lclwiIFtzdHlsZV09XCJnZXRTaGFkZUluZGljYXRvclBvc2l0aW9uKClcIj5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdFNoYWRlSW5kaWNhdG9yVGVtcGxhdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFyZC1jb2xvci1waWNrZXItc2hhZGUtaW5kaWNhdG9yXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwic2hhZGVJbmRpY2F0b3JUZW1wbGF0ZSB8fCBzaGFkZUluZGljYXRvclRlbXBsYXRlQ2hpbGQgfHwgZGVmYXVsdFNoYWRlSW5kaWNhdG9yVGVtcGxhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJnZXRJbmRpY2F0b3JDb250ZXh0KClcIlxyXG4gICAgICAgICAgICAgICAgPjwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgI2h1ZU1hcFxyXG4gICAgICAgICAgICBbdGFiSW5kZXhdPVwidGFiSW5kZXhcIlxyXG4gICAgICAgICAgICBjbGFzcz1cImFyZC1jb2xvci1waWNrZXItaHVlLW1hcFwiXHJcbiAgICAgICAgICAgIChmb2N1cyk9XCJvbkZvY3VzKCRldmVudClcIlxyXG4gICAgICAgICAgICAoZm9jdXMpPVwiZm9jdXNlZEFyZWEgPSAnaHVlJ1wiXHJcbiAgICAgICAgICAgIChibHVyKT1cIm9uQmx1cigkZXZlbnQpXCJcclxuICAgICAgICAgICAgKGJsdXIpPVwiZm9jdXNlZEFyZWEgPSBudWxsXCJcclxuICAgICAgICAgICAgKG1vdXNlZG93bik9XCJvbkh1ZUFyZWFNb3VzZURvd24oJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIChwb2ludGVyZG93bik9XCJvbkh1ZUFyZWFNb3VzZURvd24oJGV2ZW50KVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJkLWNvbG9yLXBpY2tlci1odWUtaW5kaWNhdG9yLWNvbnRhaW5lclwiIFtzdHlsZV09XCJnZXRIdWVJbmRpY2F0b3JQb3NpdGlvbigpXCI+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRIdWVJbmRpY2F0b3JUZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJkLWNvbG9yLXBpY2tlci1odWUtaW5kaWNhdG9yXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwiaHVlSW5kaWNhdG9yVGVtcGxhdGUgfHwgaHVlSW5kaWNhdG9yVGVtcGxhdGVDaGlsZCB8fCBkZWZhdWx0SHVlSW5kaWNhdG9yVGVtcGxhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJnZXRJbmRpY2F0b3JDb250ZXh0KClcIlxyXG4gICAgICAgICAgICAgICAgPjwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgI29wYWNpdHlNYXBcclxuICAgICAgICAgICAgKm5nSWY9XCJ3aXRoT3BhY2l0eVwiXHJcbiAgICAgICAgICAgIFt0YWJJbmRleF09XCJ0YWJJbmRleFwiXHJcbiAgICAgICAgICAgIGNsYXNzPVwiYXJkLWNvbG9yLXBpY2tlci1vcGFjaXR5LW1hcFwiXHJcbiAgICAgICAgICAgIChmb2N1cyk9XCJvbkZvY3VzKCRldmVudClcIlxyXG4gICAgICAgICAgICAoZm9jdXMpPVwiZm9jdXNlZEFyZWEgPSAnb3BhY2l0eSdcIlxyXG4gICAgICAgICAgICAoYmx1cik9XCJvbkJsdXIoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIChibHVyKT1cImZvY3VzZWRBcmVhID0gbnVsbFwiXHJcbiAgICAgICAgICAgIChtb3VzZWRvd24pPVwib25PcGFjaXR5QXJlYU1vdXNlRG93bigkZXZlbnQpXCJcclxuICAgICAgICAgICAgKHBvaW50ZXJkb3duKT1cIm9uT3BhY2l0eUFyZWFNb3VzZURvd24oJGV2ZW50KVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJkLWNvbG9yLXBpY2tlci1vcGFjaXR5LWluZGljYXRvci1jb250YWluZXJcIiBbc3R5bGVdPVwiZ2V0T3BhY2l0eUluZGljYXRvclBvc2l0aW9uKClcIj5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdE9wYWNpdHlJbmRpY2F0b3JUZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJkLWNvbG9yLXBpY2tlci1vcGFjaXR5LWluZGljYXRvclwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIm9wYWNpdHlJbmRpY2F0b3JUZW1wbGF0ZSB8fCBvcGFjaXR5SW5kaWNhdG9yVGVtcGxhdGVDaGlsZCB8fCBkZWZhdWx0T3BhY2l0eUluZGljYXRvclRlbXBsYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwiZ2V0SW5kaWNhdG9yQ29udGV4dCgpXCJcclxuICAgICAgICAgICAgICAgID48L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImFyZC1jb2xvci1waWNrZXItaW5wdXQtcGFuZWxcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiYXJkLWNvbG9yLXBpY2tlci1pbnB1dHNcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFyZC1jb2xvci1waWNrZXItaW5wdXQtdHlwZVwiPlxyXG4gICAgICAgICAgICAgICAgPGFyZC1zZWxlY3RcclxuICAgICAgICAgICAgICAgICAgICBjb21wYWN0XHJcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJhYmxlPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgIGFwcGVhcmFuY2U9XCJ0cmFuc3BhcmVudFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2l0ZW1zXT1cImlucHV0VHlwZXNcIlxyXG4gICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJjdXJyZW50SW5wdXRUeXBlXCJcclxuICAgICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25DdXJyZW50SW5wdXRUeXBlQ2hhbmdlKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgPjwvYXJkLXNlbGVjdD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcmQtY29sb3ItcGlja2VyLXJlZmVyZW5jZS1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdENvbG9yUmVmZXJlbmNlVGVtcGxhdGUgbGV0LWNvbCBsZXQtcmVmY29sPVwicmVmZXJlbmNlQ29sb3JcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJkLWNvbG9yLXBpY2tlci1yZWZlcmVuY2VcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFyZC1jb2xvci1waWNrZXItcmVmZXJlbmNlLXJlZmVyZW5jZVwiIFtzdHlsZV09XCJ7IGJhY2tncm91bmQ6IHJlZmNvbC5yZ2IoKS50b1N0cmluZygpIH1cIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFyZC1jb2xvci1waWNrZXItcmVmZXJlbmNlLWN1cnJlbnRcIiBbc3R5bGVdPVwieyBiYWNrZ3JvdW5kOiBjb2wucmdiKCkudG9TdHJpbmcoKSB9XCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJjb2xvclJlZmVyZW5jZVRlbXBsYXRlIHx8IGNvbG9yUmVmZXJlbmNlVGVtcGxhdGVDaGlsZCB8fCBkZWZhdWx0Q29sb3JSZWZlcmVuY2VUZW1wbGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cImdldENvbG9yUmVmZXJlbmNlQ29udGV4dCgpXCJcclxuICAgICAgICAgICAgICAgID48L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFyZC1jb2xvci1waWNrZXItaW5wdXRzLWNvbnRhaW5lclwiXHJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7XHJcbiAgICAgICAgICAgICAgICAgICAgJ2FyZC1tb2RlLWhleCc6IGN1cnJlbnRJbnB1dFR5cGUgPT0gJ0hFWCcsXHJcbiAgICAgICAgICAgICAgICAgICAgJ2FyZC1tb2RlLXRyaXBsZSc6IGN1cnJlbnRJbnB1dFR5cGUgIT0gJ0hFWCcsXHJcbiAgICAgICAgICAgICAgICAgICAgJ2FyZC1tb2RlLW9wYWNpdHknOiB3aXRoT3BhY2l0eVxyXG4gICAgICAgICAgICAgICAgfVwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZVxyXG4gICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImN1cnJlbnRJbnB1dFR5cGUgPT0gJ0hFWCcgPyBoZXhJbnB1dCA6IHRyaXBsZUlucHV0XCJcclxuICAgICAgICAgICAgICAgID48L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L2Rpdj5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjaGV4SW5wdXQ+XHJcbiAgICA8YXJkLWhleC1pbnB1dFxyXG4gICAgICAgIGNsYXNzPVwiYXJkLWNvbG9yLXBpY2tlci1oZXgtaW5wdXRcIlxyXG4gICAgICAgIG1heERpZ2l0cz1cIjZcIlxyXG4gICAgICAgIFt2YWx1ZV09XCJoZXhJbnB1dFZhbHVlXCJcclxuICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25IZXhJbnB1dENoYW5nZSgkZXZlbnQpXCJcclxuICAgID48L2FyZC1oZXgtaW5wdXQ+XHJcbiAgICA8YXJkLW51bWJlci1pbnB1dFxyXG4gICAgICAgICpuZ0lmPVwid2l0aE9wYWNpdHlcIlxyXG4gICAgICAgIGFsbG93UXVpY2tDaGFuZ2U9XCJmYWxzZVwiXHJcbiAgICAgICAgW21heF09XCJ0cmlwbGVJbnB1dERhdGE0Lm1heFwiXHJcbiAgICAgICAgW3ZhbHVlXT1cInRyaXBsZUlucHV0RGF0YTQudmFsdWVcIlxyXG4gICAgICAgICh2YWx1ZUNoYW5nZSk9XCJvblRyaXBsZUlucHV0Q2hhbmdlKCRldmVudCwgNClcIlxyXG4gICAgPjwvYXJkLW51bWJlci1pbnB1dD5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjdHJpcGxlSW5wdXQ+ICAgIFxyXG4gICAgPGFyZC1udW1iZXItaW5wdXRcclxuICAgICAgICBhbGxvd1F1aWNrQ2hhbmdlPVwiZmFsc2VcIlxyXG4gICAgICAgIFttYXhdPVwidHJpcGxlSW5wdXREYXRhMS5tYXhcIlxyXG4gICAgICAgIFt2YWx1ZV09XCJ0cmlwbGVJbnB1dERhdGExLnZhbHVlXCJcclxuICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25UcmlwbGVJbnB1dENoYW5nZSgkZXZlbnQsIDEpXCJcclxuICAgID48L2FyZC1udW1iZXItaW5wdXQ+XHJcbiAgICA8YXJkLW51bWJlci1pbnB1dFxyXG4gICAgICAgIGFsbG93UXVpY2tDaGFuZ2U9XCJmYWxzZVwiXHJcbiAgICAgICAgW21heF09XCJ0cmlwbGVJbnB1dERhdGEyLm1heFwiXHJcbiAgICAgICAgW3ZhbHVlXT1cInRyaXBsZUlucHV0RGF0YTIudmFsdWVcIlxyXG4gICAgICAgICh2YWx1ZUNoYW5nZSk9XCJvblRyaXBsZUlucHV0Q2hhbmdlKCRldmVudCwgMilcIlxyXG4gICAgPjwvYXJkLW51bWJlci1pbnB1dD5cclxuICAgIDxhcmQtbnVtYmVyLWlucHV0XHJcbiAgICAgICAgYWxsb3dRdWlja0NoYW5nZT1cImZhbHNlXCJcclxuICAgICAgICBbbWF4XT1cInRyaXBsZUlucHV0RGF0YTMubWF4XCJcclxuICAgICAgICBbdmFsdWVdPVwidHJpcGxlSW5wdXREYXRhMy52YWx1ZVwiXHJcbiAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9uVHJpcGxlSW5wdXRDaGFuZ2UoJGV2ZW50LCAzKVwiXHJcbiAgICA+PC9hcmQtbnVtYmVyLWlucHV0PlxyXG4gICAgPGFyZC1udW1iZXItaW5wdXRcclxuICAgICAgICAqbmdJZj1cIndpdGhPcGFjaXR5XCJcclxuICAgICAgICBhbGxvd1F1aWNrQ2hhbmdlPVwiZmFsc2VcIlxyXG4gICAgICAgIFttYXhdPVwidHJpcGxlSW5wdXREYXRhNC5tYXhcIlxyXG4gICAgICAgIFt2YWx1ZV09XCJ0cmlwbGVJbnB1dERhdGE0LnZhbHVlXCJcclxuICAgICAgICAodmFsdWVDaGFuZ2UpPVwib25UcmlwbGVJbnB1dENoYW5nZSgkZXZlbnQsIDQpXCJcclxuICAgID48L2FyZC1udW1iZXItaW5wdXQ+XHJcbjwvbmctdGVtcGxhdGU+Il19