@acorex/components 4.0.24 → 4.1.2

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 (610) hide show
  1. package/README.md +2 -23
  2. package/acorex-components.d.ts +1 -0
  3. package/{esm2015/acorex-components.js → esm2020/acorex-components.mjs} +1 -1
  4. package/esm2020/lib/accordion/accordion.component.mjs +44 -0
  5. package/esm2020/lib/accordion/accordion.module.mjs +20 -0
  6. package/esm2020/lib/base/base-page.class.mjs +92 -0
  7. package/esm2020/lib/base/element.class.mjs +294 -0
  8. package/esm2020/lib/base/events.class.mjs +11 -0
  9. package/esm2020/lib/button/button.component.mjs +71 -0
  10. package/esm2020/lib/button/button.module.mjs +21 -0
  11. package/esm2020/lib/calendar/calendar-box/calendar-box.component.mjs +413 -0
  12. package/esm2020/lib/calendar/calendar-box/calendar-box.module.mjs +22 -0
  13. package/esm2020/lib/calendar/scheduler/scheduler-views.property.mjs +54 -0
  14. package/esm2020/lib/calendar/scheduler/scheduler.class.mjs +18 -0
  15. package/esm2020/lib/calendar/scheduler/scheduler.component.mjs +213 -0
  16. package/esm2020/lib/calendar/scheduler/scheduler.module.mjs +68 -0
  17. package/esm2020/lib/calendar/scheduler/toolbars/scheduler-toolbar-navigator.mjs +132 -0
  18. package/esm2020/lib/calendar/scheduler/toolbars/scheduler-toolbar-views.mjs +37 -0
  19. package/esm2020/lib/calendar/scheduler/views/agenda/scheduler-agenda-view.component.mjs +47 -0
  20. package/esm2020/lib/calendar/scheduler/views/daytime/scheduler-daytime-view.component.mjs +95 -0
  21. package/esm2020/lib/calendar/scheduler/views/month/scheduler-month-view.component.mjs +204 -0
  22. package/esm2020/lib/calendar/scheduler/views/scheduler-view.component.mjs +99 -0
  23. package/esm2020/lib/calendar/scheduler/views/timeline/scheduler-timeline-view.component.mjs +77 -0
  24. package/esm2020/lib/checkbox/checkbox.component.mjs +98 -0
  25. package/esm2020/lib/checkbox/checkbox.module.mjs +20 -0
  26. package/esm2020/lib/color-picker/color-box/color-box.component.mjs +422 -0
  27. package/esm2020/lib/color-picker/color-picker.component.mjs +82 -0
  28. package/esm2020/lib/color-picker/color-picker.module.mjs +24 -0
  29. package/esm2020/lib/context-menu/context-menu.component.mjs +65 -0
  30. package/esm2020/lib/context-menu/context-menu.directive.mjs +135 -0
  31. package/esm2020/lib/context-menu/context-menu.module.mjs +20 -0
  32. package/esm2020/lib/data-filter/columns/filter-column-date.component.mjs +138 -0
  33. package/esm2020/lib/data-filter/columns/filter-column-number.component.mjs +117 -0
  34. package/esm2020/lib/data-filter/columns/filter-column-selection.component.mjs +74 -0
  35. package/esm2020/lib/data-filter/columns/filter-column-string.component.mjs +117 -0
  36. package/esm2020/lib/data-filter/filter-panel/filter-panel.component.mjs +258 -0
  37. package/esm2020/lib/data-filter/filter.class.mjs +44 -0
  38. package/esm2020/lib/data-filter/filter.module.mjs +90 -0
  39. package/esm2020/lib/data-filter/toolbar/filter-toolbar.component.mjs +166 -0
  40. package/esm2020/lib/data-list/core/data-list.component.mjs +40 -0
  41. package/esm2020/lib/data-list/list/list.component.mjs +124 -0
  42. package/esm2020/lib/data-list/list/list.module.mjs +22 -0
  43. package/esm2020/lib/data-list/list/toolbar-list-view.component.mjs +85 -0
  44. package/esm2020/lib/data-source/datasource.component.mjs +47 -0
  45. package/esm2020/lib/data-source/datasource.module.mjs +18 -0
  46. package/esm2020/lib/data-source/read-param.mjs +5 -0
  47. package/esm2020/lib/date-picker/date-picker.component.mjs +705 -0
  48. package/esm2020/lib/date-picker/date-picker.module.mjs +25 -0
  49. package/esm2020/lib/dialog/dialog.component.mjs +24 -0
  50. package/esm2020/lib/dialog/dialog.module.mjs +21 -0
  51. package/esm2020/lib/dialog/dialog.service.mjs +150 -0
  52. package/esm2020/lib/drawer/drawer.component.mjs +54 -0
  53. package/esm2020/lib/drawer/drawer.module.mjs +20 -0
  54. package/esm2020/lib/dropdown/dropdown.component.mjs +177 -0
  55. package/esm2020/lib/dropdown/dropdown.module.mjs +26 -0
  56. package/esm2020/lib/fieldset/fieldset.component.mjs +59 -0
  57. package/esm2020/lib/fieldset/fieldset.module.mjs +19 -0
  58. package/esm2020/lib/form-group/form-group.component.mjs +34 -0
  59. package/esm2020/lib/form-group/form-group.module.mjs +21 -0
  60. package/esm2020/lib/label/label.component.mjs +19 -0
  61. package/esm2020/lib/label/label.module.mjs +21 -0
  62. package/esm2020/lib/loading/loading-indicator.component.mjs +17 -0
  63. package/esm2020/lib/loading/loading-panel.component.mjs +44 -0
  64. package/esm2020/lib/loading/loading.module.mjs +21 -0
  65. package/esm2020/lib/loading/loading.service.mjs +45 -0
  66. package/esm2020/lib/menu/menu-item.component.mjs +47 -0
  67. package/esm2020/lib/menu/menu.component.mjs +86 -0
  68. package/esm2020/lib/menu/menu.module.mjs +22 -0
  69. package/esm2020/lib/menu/menu2.component.mjs +96 -0
  70. package/esm2020/lib/number-box/number-box.component.mjs +622 -0
  71. package/esm2020/lib/number-box/number-box.module.mjs +21 -0
  72. package/esm2020/lib/page/content.component.mjs +32 -0
  73. package/esm2020/lib/page/footer.component.mjs +19 -0
  74. package/esm2020/lib/page/page.component.mjs +53 -0
  75. package/esm2020/lib/page/page.module.mjs +22 -0
  76. package/esm2020/lib/panel-box/panel-box.component.mjs +88 -0
  77. package/esm2020/lib/panel-box/panel-box.module.mjs +19 -0
  78. package/esm2020/lib/password-box/password-box.component.mjs +31 -0
  79. package/esm2020/lib/password-box/password-box.module.mjs +23 -0
  80. package/esm2020/lib/popover/custom-cdk-overlay.service.mjs +48 -0
  81. package/esm2020/lib/popover/overlay.service.mjs +87 -0
  82. package/esm2020/lib/popover/popover.component.mjs +115 -0
  83. package/esm2020/lib/popover/popover.module.mjs +19 -0
  84. package/esm2020/lib/popup/popup.component.mjs +147 -0
  85. package/esm2020/lib/popup/popup.module.mjs +25 -0
  86. package/esm2020/lib/popup/popup.service.mjs +93 -0
  87. package/esm2020/lib/progress-bar/progress-bar.component.mjs +19 -0
  88. package/esm2020/lib/progress-bar/progress-bar.module.mjs +19 -0
  89. package/esm2020/lib/property-editor/editors/color-editor/color.editor.mjs +38 -0
  90. package/esm2020/lib/property-editor/editors/color-editor/color.module.mjs +24 -0
  91. package/esm2020/lib/property-editor/editors/column-editor/column.editor.mjs +115 -0
  92. package/esm2020/lib/property-editor/editors/column-editor/column.module.mjs +32 -0
  93. package/esm2020/lib/property-editor/editors/conditional-color-editor/conditional-color.editor.mjs +211 -0
  94. package/esm2020/lib/property-editor/editors/conditional-color-editor/conditional-color.module.mjs +78 -0
  95. package/esm2020/lib/property-editor/editors/date-editor/date.editor.mjs +51 -0
  96. package/esm2020/lib/property-editor/editors/date-editor/date.module.mjs +24 -0
  97. package/esm2020/lib/property-editor/editors/number-editor/number.editor.mjs +60 -0
  98. package/esm2020/lib/property-editor/editors/number-editor/number.module.mjs +24 -0
  99. package/esm2020/lib/property-editor/editors/range-editor/range.editor.mjs +140 -0
  100. package/esm2020/lib/property-editor/editors/range-editor/range.module.mjs +61 -0
  101. package/esm2020/lib/property-editor/editors/selectbox-editor/selectbox.editor.mjs +71 -0
  102. package/esm2020/lib/property-editor/editors/selectbox-editor/selectbox.module.mjs +25 -0
  103. package/esm2020/lib/property-editor/editors/switch-editor/number.editor.mjs +29 -0
  104. package/esm2020/lib/property-editor/editors/switch-editor/number.module.mjs +25 -0
  105. package/esm2020/lib/property-editor/editors/text-editor/text.editor.mjs +30 -0
  106. package/esm2020/lib/property-editor/editors/text-editor/text.module.mjs +24 -0
  107. package/esm2020/lib/property-editor/editors/textarea-editor/textarea.editor.mjs +32 -0
  108. package/esm2020/lib/property-editor/editors/textarea-editor/textarea.module.mjs +25 -0
  109. package/esm2020/lib/property-editor/editors/time-editor/time.editor.mjs +43 -0
  110. package/esm2020/lib/property-editor/editors/time-editor/time.module.mjs +24 -0
  111. package/esm2020/lib/property-editor/property-editor-renderer.directive.mjs +152 -0
  112. package/esm2020/lib/property-editor/property-editor.class.mjs +101 -0
  113. package/esm2020/lib/property-editor/property-editor.module.mjs +161 -0
  114. package/esm2020/lib/query-builder/query-builder-group.component.mjs +124 -0
  115. package/esm2020/lib/query-builder/query-builder-popup/query-builder-popup.component.mjs +171 -0
  116. package/esm2020/lib/query-builder/query-builder-rule.component.mjs +357 -0
  117. package/esm2020/lib/query-builder/query-builder.class.mjs +20 -0
  118. package/esm2020/lib/query-builder/query-builder.component.mjs +82 -0
  119. package/esm2020/lib/query-builder/query-builder.module.mjs +59 -0
  120. package/esm2020/lib/query-builder/query-builder.service.mjs +191 -0
  121. package/esm2020/lib/searchbox/searchbox.component.mjs +79 -0
  122. package/esm2020/lib/searchbox/searchbox.module.mjs +24 -0
  123. package/esm2020/lib/selectbox/selectbox.component.mjs +956 -0
  124. package/esm2020/lib/selectbox/selectbox.module.mjs +44 -0
  125. package/esm2020/lib/selectbox/selectbox2.component.mjs +574 -0
  126. package/esm2020/lib/selection-list/selection-list.component.mjs +101 -0
  127. package/esm2020/lib/selection-list/selection-list.module.mjs +21 -0
  128. package/esm2020/lib/switch/switch.component.mjs +51 -0
  129. package/esm2020/lib/switch/switch.module.mjs +20 -0
  130. package/esm2020/lib/tab-page/tab-page-Renderer.component.mjs +69 -0
  131. package/esm2020/lib/tab-page/tab-page-host.component.mjs +109 -0
  132. package/esm2020/lib/tab-page/tab-page.module.mjs +21 -0
  133. package/esm2020/lib/tab-page/tab-page.service.mjs +156 -0
  134. package/esm2020/lib/tab-strip/tab-strip.component.mjs +36 -0
  135. package/esm2020/lib/tab-strip/tab-strip.module.mjs +19 -0
  136. package/esm2020/lib/tab-view/dynamic-tabs.directive.mjs +24 -0
  137. package/esm2020/lib/tab-view/tab-view.component.mjs +105 -0
  138. package/esm2020/lib/tab-view/tab-view.module.mjs +21 -0
  139. package/esm2020/lib/tab-view/tab.component.mjs +30 -0
  140. package/esm2020/lib/textarea/textarea.component.mjs +26 -0
  141. package/esm2020/lib/textarea/textarea.module.mjs +21 -0
  142. package/esm2020/lib/textbox/textbox.component.mjs +39 -0
  143. package/esm2020/lib/textbox/textbox.module.mjs +24 -0
  144. package/esm2020/lib/time-picker/time-picker.component.mjs +943 -0
  145. package/esm2020/lib/time-picker/time-picker.module.mjs +22 -0
  146. package/esm2020/lib/toast/toast-message/toast-message.component.mjs +74 -0
  147. package/esm2020/lib/toast/toast-wrapper/toast-wrapper.component.mjs +13 -0
  148. package/esm2020/lib/toast/toast.module.mjs +21 -0
  149. package/esm2020/lib/toast/toast.service.mjs +44 -0
  150. package/esm2020/lib/toolbar/group-button/toolbar-group-button.component.mjs +78 -0
  151. package/esm2020/lib/toolbar/menu/toolbar-menu.component.mjs +57 -0
  152. package/esm2020/lib/toolbar/search/toolbar-search.component.mjs +54 -0
  153. package/esm2020/lib/toolbar/title/toolbar-title.component.mjs +47 -0
  154. package/esm2020/lib/toolbar/toolbar-item.mjs +6 -0
  155. package/esm2020/lib/toolbar/toolbar.component.mjs +13 -0
  156. package/esm2020/lib/toolbar/toolbar.module.mjs +40 -0
  157. package/esm2020/lib/tooltip/tooltip.directive.mjs +100 -0
  158. package/esm2020/lib/tooltip/tooltip.module.mjs +19 -0
  159. package/esm2020/lib/tree-side-menu/tree-side-menu.component.mjs +646 -0
  160. package/esm2020/lib/tree-side-menu/tree-side-menu.module.mjs +35 -0
  161. package/esm2020/lib/tree-view/tree-view.component.mjs +726 -0
  162. package/esm2020/lib/tree-view/tree-view.module.mjs +22 -0
  163. package/esm2020/lib/upload-file/upload-file.component.mjs +170 -0
  164. package/esm2020/lib/upload-file/upload-file.events.mjs +2 -0
  165. package/esm2020/lib/upload-file/upload-file.module.mjs +24 -0
  166. package/esm2020/lib/validation/validation-form.component.mjs +64 -0
  167. package/esm2020/lib/validation/validation-rule.widget.mjs +111 -0
  168. package/esm2020/lib/validation/validation.class.mjs +2 -0
  169. package/esm2020/lib/validation/validation.component.mjs +90 -0
  170. package/esm2020/lib/validation/validation.module.mjs +34 -0
  171. package/esm2020/public-api.mjs +154 -0
  172. package/fesm2015/acorex-components.mjs +15092 -0
  173. package/fesm2015/acorex-components.mjs.map +1 -0
  174. package/fesm2020/acorex-components.mjs +15039 -0
  175. package/fesm2020/acorex-components.mjs.map +1 -0
  176. package/lib/accordion/accordion.component.d.ts +13 -0
  177. package/lib/accordion/accordion.module.d.ts +9 -0
  178. package/lib/{page → base}/base-page.class.d.ts +11 -6
  179. package/lib/base/element.class.d.ts +106 -0
  180. package/lib/base/events.class.d.ts +8 -18
  181. package/lib/button/button.component.d.ts +19 -4
  182. package/lib/button/button.module.d.ts +6 -0
  183. package/lib/calendar/calendar-box/calendar-box.component.d.ts +81 -0
  184. package/lib/calendar/calendar-box/calendar-box.module.d.ts +11 -0
  185. package/lib/calendar/scheduler/scheduler-views.property.d.ts +19 -0
  186. package/lib/calendar/scheduler/scheduler.class.d.ts +36 -0
  187. package/lib/calendar/scheduler/scheduler.component.d.ts +39 -0
  188. package/lib/calendar/scheduler/scheduler.module.d.ts +21 -0
  189. package/lib/calendar/scheduler/toolbars/scheduler-toolbar-navigator.d.ts +25 -0
  190. package/lib/calendar/scheduler/toolbars/scheduler-toolbar-views.d.ts +14 -0
  191. package/lib/calendar/scheduler/views/agenda/scheduler-agenda-view.component.d.ts +16 -0
  192. package/lib/calendar/scheduler/views/daytime/scheduler-daytime-view.component.d.ts +26 -0
  193. package/lib/calendar/scheduler/views/month/scheduler-month-view.component.d.ts +37 -0
  194. package/lib/calendar/scheduler/views/scheduler-view.component.d.ts +28 -0
  195. package/lib/calendar/scheduler/views/timeline/scheduler-timeline-view.component.d.ts +24 -0
  196. package/lib/checkbox/checkbox.component.d.ts +28 -7
  197. package/lib/checkbox/checkbox.module.d.ts +7 -0
  198. package/lib/color-picker/color-box/color-box.component.d.ts +25 -0
  199. package/lib/color-picker/color-picker.component.d.ts +30 -0
  200. package/lib/color-picker/color-picker.module.d.ts +13 -0
  201. package/lib/context-menu/context-menu.component.d.ts +22 -0
  202. package/lib/context-menu/context-menu.directive.d.ts +38 -0
  203. package/lib/context-menu/context-menu.module.d.ts +9 -0
  204. package/lib/data-filter/columns/filter-column-date.component.d.ts +22 -0
  205. package/lib/data-filter/columns/filter-column-number.component.d.ts +15 -0
  206. package/lib/data-filter/columns/filter-column-selection.component.d.ts +18 -0
  207. package/lib/data-filter/columns/filter-column-string.component.d.ts +15 -0
  208. package/lib/data-filter/filter-panel/filter-panel.component.d.ts +45 -0
  209. package/lib/data-filter/filter.class.d.ts +40 -0
  210. package/lib/data-filter/filter.module.d.ts +24 -0
  211. package/lib/data-filter/toolbar/filter-toolbar.component.d.ts +25 -0
  212. package/lib/data-list/core/data-list.component.d.ts +15 -0
  213. package/lib/data-list/list/list.component.d.ts +40 -0
  214. package/lib/data-list/list/list.module.d.ts +11 -0
  215. package/lib/data-list/list/toolbar-list-view.component.d.ts +17 -0
  216. package/lib/data-source/datasource.component.d.ts +16 -0
  217. package/lib/data-source/datasource.module.d.ts +7 -0
  218. package/lib/data-source/read-param.d.ts +40 -0
  219. package/lib/date-picker/date-picker.component.d.ts +81 -0
  220. package/lib/date-picker/date-picker.module.d.ts +14 -0
  221. package/lib/dialog/dialog.component.d.ts +13 -11
  222. package/lib/dialog/dialog.module.d.ts +8 -0
  223. package/lib/dialog/dialog.service.d.ts +34 -11
  224. package/lib/drawer/drawer.component.d.ts +8 -25
  225. package/lib/drawer/drawer.module.d.ts +7 -0
  226. package/lib/dropdown/dropdown.component.d.ts +29 -13
  227. package/lib/dropdown/dropdown.module.d.ts +11 -0
  228. package/lib/fieldset/fieldset.component.d.ts +11 -0
  229. package/lib/fieldset/fieldset.module.d.ts +8 -0
  230. package/lib/form-group/form-group.component.d.ts +14 -0
  231. package/lib/form-group/form-group.module.d.ts +8 -0
  232. package/lib/label/label.component.d.ts +8 -4
  233. package/lib/label/label.module.d.ts +6 -0
  234. package/lib/loading/loading-indicator.component.d.ts +9 -0
  235. package/lib/loading/loading-panel.component.d.ts +13 -0
  236. package/lib/loading/loading.module.d.ts +8 -0
  237. package/lib/loading/loading.service.d.ts +7 -39
  238. package/lib/menu/menu-item.component.d.ts +18 -0
  239. package/lib/menu/menu.component.d.ts +35 -0
  240. package/lib/menu/menu.module.d.ts +11 -0
  241. package/lib/menu/menu2.component.d.ts +21 -0
  242. package/lib/number-box/number-box.component.d.ts +51 -30
  243. package/lib/number-box/number-box.module.d.ts +8 -0
  244. package/lib/page/content.component.d.ts +8 -0
  245. package/lib/page/footer.component.d.ts +5 -0
  246. package/lib/page/page.component.d.ts +11 -6
  247. package/lib/page/page.module.d.ts +11 -0
  248. package/lib/panel-box/panel-box.component.d.ts +19 -0
  249. package/lib/panel-box/panel-box.module.d.ts +8 -0
  250. package/lib/password-box/password-box.component.d.ts +12 -0
  251. package/lib/password-box/password-box.module.d.ts +10 -0
  252. package/lib/{base → popover}/custom-cdk-overlay.service.d.ts +5 -0
  253. package/lib/{base → popover}/overlay.service.d.ts +5 -3
  254. package/lib/popover/popover.component.d.ts +30 -0
  255. package/lib/popover/popover.module.d.ts +8 -0
  256. package/lib/popup/popup.component.d.ts +21 -15
  257. package/lib/popup/popup.module.d.ts +11 -0
  258. package/lib/popup/popup.service.d.ts +7 -3
  259. package/lib/progress-bar/progress-bar.component.d.ts +7 -0
  260. package/lib/progress-bar/progress-bar.module.d.ts +8 -0
  261. package/lib/property-editor/editors/color-editor/color.editor.d.ts +13 -0
  262. package/lib/property-editor/editors/color-editor/color.module.d.ts +12 -0
  263. package/lib/property-editor/editors/column-editor/column.editor.d.ts +34 -0
  264. package/lib/property-editor/editors/column-editor/column.module.d.ts +20 -0
  265. package/lib/property-editor/editors/conditional-color-editor/conditional-color.editor.d.ts +44 -0
  266. package/lib/property-editor/editors/conditional-color-editor/conditional-color.module.d.ts +19 -0
  267. package/lib/property-editor/editors/date-editor/date.editor.d.ts +28 -0
  268. package/lib/property-editor/editors/date-editor/date.module.d.ts +12 -0
  269. package/lib/property-editor/editors/number-editor/number.editor.d.ts +19 -0
  270. package/lib/property-editor/editors/number-editor/number.module.d.ts +12 -0
  271. package/lib/property-editor/editors/range-editor/range.editor.d.ts +29 -0
  272. package/lib/property-editor/editors/range-editor/range.module.d.ts +18 -0
  273. package/lib/property-editor/editors/selectbox-editor/selectbox.editor.d.ts +28 -0
  274. package/lib/property-editor/editors/selectbox-editor/selectbox.module.d.ts +13 -0
  275. package/lib/property-editor/editors/switch-editor/number.editor.d.ts +11 -0
  276. package/lib/property-editor/editors/switch-editor/number.module.d.ts +13 -0
  277. package/lib/property-editor/editors/text-editor/text.editor.d.ts +15 -0
  278. package/lib/property-editor/editors/text-editor/text.module.d.ts +12 -0
  279. package/lib/property-editor/editors/textarea-editor/textarea.editor.d.ts +17 -0
  280. package/lib/property-editor/editors/textarea-editor/textarea.module.d.ts +12 -0
  281. package/lib/property-editor/editors/time-editor/time.editor.d.ts +17 -0
  282. package/lib/property-editor/editors/time-editor/time.module.d.ts +12 -0
  283. package/lib/property-editor/property-editor-renderer.directive.d.ts +30 -0
  284. package/lib/property-editor/property-editor.class.d.ts +67 -0
  285. package/lib/property-editor/property-editor.module.d.ts +19 -0
  286. package/lib/query-builder/query-builder-group.component.d.ts +33 -0
  287. package/lib/query-builder/query-builder-popup/query-builder-popup.component.d.ts +35 -0
  288. package/lib/query-builder/query-builder-rule.component.d.ts +45 -0
  289. package/lib/query-builder/query-builder.class.d.ts +45 -0
  290. package/lib/query-builder/query-builder.component.d.ts +27 -0
  291. package/lib/query-builder/query-builder.module.d.ts +22 -0
  292. package/lib/query-builder/query-builder.service.d.ts +18 -0
  293. package/lib/searchbox/searchbox.component.d.ts +22 -0
  294. package/lib/searchbox/searchbox.module.d.ts +13 -0
  295. package/lib/selectbox/selectbox.component.d.ts +114 -23
  296. package/lib/selectbox/selectbox.module.d.ts +13 -0
  297. package/lib/selectbox/selectbox2.component.d.ts +103 -0
  298. package/lib/selection-list/selection-list.component.d.ts +29 -6
  299. package/lib/selection-list/selection-list.module.d.ts +8 -0
  300. package/lib/switch/switch.component.d.ts +19 -5
  301. package/lib/switch/switch.module.d.ts +7 -0
  302. package/lib/tab-page/tab-page-Renderer.component.d.ts +16 -0
  303. package/lib/tab-page/tab-page-host.component.d.ts +26 -0
  304. package/lib/tab-page/tab-page.module.d.ts +10 -0
  305. package/lib/tab-page/tab-page.service.d.ts +30 -0
  306. package/lib/tab-strip/tab-strip.component.d.ts +28 -0
  307. package/lib/tab-strip/tab-strip.module.d.ts +8 -0
  308. package/lib/tab-view/dynamic-tabs.directive.d.ts +16 -0
  309. package/lib/tab-view/tab-view.component.d.ts +26 -0
  310. package/lib/tab-view/tab-view.module.d.ts +10 -0
  311. package/lib/tab-view/tab.component.d.ts +12 -0
  312. package/lib/textarea/textarea.component.d.ts +12 -0
  313. package/lib/textarea/textarea.module.d.ts +8 -0
  314. package/lib/textbox/textbox.component.d.ts +14 -6
  315. package/lib/textbox/textbox.module.d.ts +9 -0
  316. package/lib/time-picker/time-picker.component.d.ts +52 -0
  317. package/lib/time-picker/time-picker.module.d.ts +11 -0
  318. package/lib/toast/toast-message/toast-message.component.d.ts +18 -0
  319. package/lib/toast/toast-wrapper/toast-wrapper.component.d.ts +8 -0
  320. package/lib/toast/toast.module.d.ts +7 -0
  321. package/lib/toast/toast.service.d.ts +16 -13
  322. package/lib/toolbar/group-button/toolbar-group-button.component.d.ts +12 -0
  323. package/lib/toolbar/menu/toolbar-menu.component.d.ts +24 -0
  324. package/lib/toolbar/search/toolbar-search.component.d.ts +16 -0
  325. package/lib/toolbar/title/toolbar-title.component.d.ts +9 -0
  326. package/lib/toolbar/toolbar-item.d.ts +3 -0
  327. package/lib/toolbar/toolbar.component.d.ts +8 -0
  328. package/lib/toolbar/toolbar.module.d.ts +14 -0
  329. package/lib/tooltip/tooltip.directive.d.ts +18 -12
  330. package/lib/tooltip/tooltip.module.d.ts +6 -0
  331. package/lib/tree-side-menu/tree-side-menu.component.d.ts +111 -0
  332. package/lib/tree-side-menu/tree-side-menu.module.d.ts +11 -0
  333. package/lib/tree-view/tree-view.component.d.ts +117 -0
  334. package/lib/tree-view/tree-view.module.d.ts +11 -0
  335. package/lib/upload-file/upload-file.component.d.ts +38 -0
  336. package/lib/upload-file/upload-file.events.d.ts +10 -0
  337. package/lib/upload-file/upload-file.module.d.ts +13 -0
  338. package/lib/validation/validation-form.component.d.ts +19 -0
  339. package/lib/validation/validation-rule.widget.d.ts +8 -7
  340. package/lib/validation/validation.class.d.ts +0 -1
  341. package/lib/validation/validation.component.d.ts +25 -0
  342. package/lib/validation/validation.module.d.ts +8 -0
  343. package/package.json +25 -14
  344. package/public-api.d.ts +151 -31
  345. package/acorex-components.metadata.json +0 -1
  346. package/bundles/acorex-components.umd.js +0 -6491
  347. package/bundles/acorex-components.umd.js.map +0 -1
  348. package/bundles/acorex-components.umd.min.js +0 -16
  349. package/bundles/acorex-components.umd.min.js.map +0 -1
  350. package/esm2015/lib/alert/alert-button.component.js +0 -42
  351. package/esm2015/lib/alert/alert-contnet.component.js +0 -16
  352. package/esm2015/lib/alert/alert-footer.component.js +0 -18
  353. package/esm2015/lib/alert/alert-suffix.component.js +0 -18
  354. package/esm2015/lib/alert/alert-title.component.js +0 -16
  355. package/esm2015/lib/alert/alert.component.js +0 -87
  356. package/esm2015/lib/alert/alert.module.js +0 -28
  357. package/esm2015/lib/alert/index.js +0 -8
  358. package/esm2015/lib/base/common.module.js +0 -13
  359. package/esm2015/lib/base/custom-cdk-overlay.service.js +0 -56
  360. package/esm2015/lib/base/drawing.class.js +0 -11
  361. package/esm2015/lib/base/events.class.js +0 -19
  362. package/esm2015/lib/base/index.js +0 -7
  363. package/esm2015/lib/base/mixin/base-components.class.js +0 -72
  364. package/esm2015/lib/base/mixin/button-mixin.class.js +0 -36
  365. package/esm2015/lib/base/mixin/clickable-mixin.class.js +0 -17
  366. package/esm2015/lib/base/mixin/constratctor.js +0 -2
  367. package/esm2015/lib/base/mixin/datalist-component.class.js +0 -97
  368. package/esm2015/lib/base/mixin/dropdown-mixin.class.js +0 -36
  369. package/esm2015/lib/base/mixin/index.js +0 -3
  370. package/esm2015/lib/base/mixin/interactive-mixin.class.js +0 -47
  371. package/esm2015/lib/base/mixin/loading-mixin.class.js +0 -15
  372. package/esm2015/lib/base/mixin/mixin.class.js +0 -24
  373. package/esm2015/lib/base/mixin/selection-component.class.js +0 -158
  374. package/esm2015/lib/base/mixin/sizable-mixin.class.js +0 -19
  375. package/esm2015/lib/base/mixin/textbox-mixin.class.js +0 -19
  376. package/esm2015/lib/base/mixin/value-mixin.class.js +0 -172
  377. package/esm2015/lib/base/overlay.service.js +0 -96
  378. package/esm2015/lib/base/responsive.directive.js +0 -33
  379. package/esm2015/lib/base/styles.class.js +0 -4
  380. package/esm2015/lib/button/button-group.component.js +0 -71
  381. package/esm2015/lib/button/button-item.class.js +0 -2
  382. package/esm2015/lib/button/button-item.component.js +0 -35
  383. package/esm2015/lib/button/button.component.js +0 -34
  384. package/esm2015/lib/button/button.module.js +0 -24
  385. package/esm2015/lib/button/dropdown-button.component.js +0 -108
  386. package/esm2015/lib/button/index.js +0 -7
  387. package/esm2015/lib/calendar/calendar.component.js +0 -69
  388. package/esm2015/lib/calendar/calendar.module.js +0 -19
  389. package/esm2015/lib/calendar/index.js +0 -3
  390. package/esm2015/lib/carousel/carousel-arrows.component.js +0 -45
  391. package/esm2015/lib/carousel/carousel-item.component.js +0 -21
  392. package/esm2015/lib/carousel/carousel-pager.component.js +0 -71
  393. package/esm2015/lib/carousel/carousel-splidejs.class.js +0 -83
  394. package/esm2015/lib/carousel/carousel.class.js +0 -7
  395. package/esm2015/lib/carousel/carousel.component.js +0 -226
  396. package/esm2015/lib/carousel/carousel.module.js +0 -19
  397. package/esm2015/lib/carousel/index.js +0 -7
  398. package/esm2015/lib/checkbox/checkbox.component.js +0 -41
  399. package/esm2015/lib/checkbox/checkbox.module.js +0 -15
  400. package/esm2015/lib/checkbox/index.js +0 -3
  401. package/esm2015/lib/datalist/datalist.component.js +0 -71
  402. package/esm2015/lib/datalist/datalist.module.js +0 -17
  403. package/esm2015/lib/datalist/index.js +0 -3
  404. package/esm2015/lib/datapager/datapager-base.component.js +0 -33
  405. package/esm2015/lib/datapager/datapager-info.component.js +0 -59
  406. package/esm2015/lib/datapager/datapager-input-selector.component.js +0 -51
  407. package/esm2015/lib/datapager/datapager-next-buttons.components.js +0 -51
  408. package/esm2015/lib/datapager/datapager-numeric-selector.component.js +0 -86
  409. package/esm2015/lib/datapager/datapager-pagesize-dropdown.component.js +0 -69
  410. package/esm2015/lib/datapager/datapager-prev-buttons.component.js +0 -47
  411. package/esm2015/lib/datapager/datapager.component.js +0 -122
  412. package/esm2015/lib/datapager/datapager.module.js +0 -32
  413. package/esm2015/lib/datapager/index.js +0 -9
  414. package/esm2015/lib/datepicker/datepicker.component.js +0 -62
  415. package/esm2015/lib/datepicker/datepicker.module.js +0 -18
  416. package/esm2015/lib/datepicker/index.js +0 -3
  417. package/esm2015/lib/decorators/decorators.module.js +0 -17
  418. package/esm2015/lib/decorators/index.js +0 -4
  419. package/esm2015/lib/decorators/prefix.component.js +0 -28
  420. package/esm2015/lib/decorators/suffix.component.js +0 -28
  421. package/esm2015/lib/dialog/dialog.class.js +0 -47
  422. package/esm2015/lib/dialog/dialog.component.js +0 -39
  423. package/esm2015/lib/dialog/dialog.module.js +0 -19
  424. package/esm2015/lib/dialog/dialog.service.js +0 -139
  425. package/esm2015/lib/dialog/index.js +0 -5
  426. package/esm2015/lib/drawer/drawer-container.component.js +0 -67
  427. package/esm2015/lib/drawer/drawer-content.component.js +0 -24
  428. package/esm2015/lib/drawer/drawer.component.js +0 -139
  429. package/esm2015/lib/drawer/drawer.module.js +0 -18
  430. package/esm2015/lib/drawer/index.js +0 -5
  431. package/esm2015/lib/dropdown/dropdown.component.js +0 -127
  432. package/esm2015/lib/dropdown/dropdown.module.js +0 -15
  433. package/esm2015/lib/dropdown/index.js +0 -3
  434. package/esm2015/lib/form/form-field.component.js +0 -20
  435. package/esm2015/lib/form/form-field.module.js +0 -15
  436. package/esm2015/lib/form/form.component.js +0 -51
  437. package/esm2015/lib/form/index.js +0 -4
  438. package/esm2015/lib/icon/icon.component.js +0 -28
  439. package/esm2015/lib/icon/icon.module.js +0 -16
  440. package/esm2015/lib/icon/index.js +0 -3
  441. package/esm2015/lib/input-mask/index.js +0 -3
  442. package/esm2015/lib/input-mask/input-mask.component.js +0 -35
  443. package/esm2015/lib/input-mask/input-mask.module.js +0 -17
  444. package/esm2015/lib/label/index.js +0 -3
  445. package/esm2015/lib/label/label.component.js +0 -20
  446. package/esm2015/lib/label/label.module.js +0 -16
  447. package/esm2015/lib/loading/index.js +0 -5
  448. package/esm2015/lib/loading/loading.component.js +0 -23
  449. package/esm2015/lib/loading/loading.directive.js +0 -70
  450. package/esm2015/lib/loading/loading.module.js +0 -18
  451. package/esm2015/lib/loading/loading.service.js +0 -157
  452. package/esm2015/lib/number-box/index.js +0 -3
  453. package/esm2015/lib/number-box/number-box.component.js +0 -242
  454. package/esm2015/lib/number-box/number-box.module.js +0 -24
  455. package/esm2015/lib/page/base-page.class.js +0 -84
  456. package/esm2015/lib/page/index.js +0 -3
  457. package/esm2015/lib/page/page.component.js +0 -32
  458. package/esm2015/lib/popup/index.js +0 -4
  459. package/esm2015/lib/popup/popup.component.js +0 -143
  460. package/esm2015/lib/popup/popup.module.js +0 -19
  461. package/esm2015/lib/popup/popup.service.js +0 -89
  462. package/esm2015/lib/selectbox/index.js +0 -3
  463. package/esm2015/lib/selectbox/selectbox.component.js +0 -188
  464. package/esm2015/lib/selectbox/selectbox.module.js +0 -16
  465. package/esm2015/lib/selection-list/index.js +0 -3
  466. package/esm2015/lib/selection-list/selection-list.component.js +0 -46
  467. package/esm2015/lib/selection-list/selection-list.module.js +0 -16
  468. package/esm2015/lib/side-menu/index.js +0 -3
  469. package/esm2015/lib/side-menu/side-menu.component.js +0 -21
  470. package/esm2015/lib/side-menu/side-menu.module.js +0 -16
  471. package/esm2015/lib/switch/index.js +0 -3
  472. package/esm2015/lib/switch/switch.component.js +0 -29
  473. package/esm2015/lib/switch/switch.module.js +0 -16
  474. package/esm2015/lib/tabs/index.js +0 -6
  475. package/esm2015/lib/tabs/tab-strip.component.js +0 -57
  476. package/esm2015/lib/tabs/tab-view.component.js +0 -45
  477. package/esm2015/lib/tabs/tab.component.js +0 -48
  478. package/esm2015/lib/tabs/tabs.class.js +0 -4
  479. package/esm2015/lib/tabs/tabs.module.js +0 -18
  480. package/esm2015/lib/textbox/index.js +0 -3
  481. package/esm2015/lib/textbox/textbox.component.js +0 -46
  482. package/esm2015/lib/textbox/textbox.module.js +0 -24
  483. package/esm2015/lib/time-box/index.js +0 -3
  484. package/esm2015/lib/time-box/time-box.component.js +0 -127
  485. package/esm2015/lib/time-box/time-box.module.js +0 -24
  486. package/esm2015/lib/toast/index.js +0 -5
  487. package/esm2015/lib/toast/toast.class.js +0 -2
  488. package/esm2015/lib/toast/toast.component.js +0 -54
  489. package/esm2015/lib/toast/toast.module.js +0 -17
  490. package/esm2015/lib/toast/toast.service.js +0 -117
  491. package/esm2015/lib/tooltip/index.js +0 -4
  492. package/esm2015/lib/tooltip/tooltip.component.js +0 -37
  493. package/esm2015/lib/tooltip/tooltip.directive.js +0 -81
  494. package/esm2015/lib/tooltip/tooltip.module.js +0 -18
  495. package/esm2015/lib/validation/index.js +0 -3
  496. package/esm2015/lib/validation/validation-rule.widget.js +0 -110
  497. package/esm2015/lib/validation/validation.class.js +0 -2
  498. package/esm2015/lib/validation/validation.module.js +0 -28
  499. package/esm2015/public-api.js +0 -32
  500. package/fesm2015/acorex-components.js +0 -5430
  501. package/fesm2015/acorex-components.js.map +0 -1
  502. package/lib/alert/alert-button.component.d.ts +0 -10
  503. package/lib/alert/alert-contnet.component.d.ts +0 -2
  504. package/lib/alert/alert-footer.component.d.ts +0 -2
  505. package/lib/alert/alert-suffix.component.d.ts +0 -2
  506. package/lib/alert/alert-title.component.d.ts +0 -2
  507. package/lib/alert/alert.component.d.ts +0 -16
  508. package/lib/alert/alert.module.d.ts +0 -2
  509. package/lib/alert/index.d.ts +0 -7
  510. package/lib/base/common.module.d.ts +0 -2
  511. package/lib/base/drawing.class.d.ts +0 -9
  512. package/lib/base/index.d.ts +0 -6
  513. package/lib/base/mixin/base-components.class.d.ts +0 -51
  514. package/lib/base/mixin/button-mixin.class.d.ts +0 -34
  515. package/lib/base/mixin/clickable-mixin.class.d.ts +0 -29
  516. package/lib/base/mixin/constratctor.d.ts +0 -4
  517. package/lib/base/mixin/datalist-component.class.d.ts +0 -45
  518. package/lib/base/mixin/dropdown-mixin.class.d.ts +0 -38
  519. package/lib/base/mixin/index.d.ts +0 -2
  520. package/lib/base/mixin/interactive-mixin.class.d.ts +0 -34
  521. package/lib/base/mixin/loading-mixin.class.d.ts +0 -28
  522. package/lib/base/mixin/mixin.class.d.ts +0 -493
  523. package/lib/base/mixin/selection-component.class.d.ts +0 -46
  524. package/lib/base/mixin/sizable-mixin.class.d.ts +0 -28
  525. package/lib/base/mixin/textbox-mixin.class.d.ts +0 -33
  526. package/lib/base/mixin/value-mixin.class.d.ts +0 -50
  527. package/lib/base/responsive.directive.d.ts +0 -7
  528. package/lib/base/styles.class.d.ts +0 -6
  529. package/lib/button/button-group.component.d.ts +0 -19
  530. package/lib/button/button-item.class.d.ts +0 -17
  531. package/lib/button/button-item.component.d.ts +0 -16
  532. package/lib/button/dropdown-button.component.d.ts +0 -27
  533. package/lib/button/index.d.ts +0 -6
  534. package/lib/calendar/calendar.component.d.ts +0 -17
  535. package/lib/calendar/calendar.module.d.ts +0 -2
  536. package/lib/calendar/index.d.ts +0 -2
  537. package/lib/carousel/carousel-arrows.component.d.ts +0 -11
  538. package/lib/carousel/carousel-item.component.d.ts +0 -5
  539. package/lib/carousel/carousel-pager.component.d.ts +0 -19
  540. package/lib/carousel/carousel-splidejs.class.d.ts +0 -18
  541. package/lib/carousel/carousel.class.d.ts +0 -45
  542. package/lib/carousel/carousel.component.d.ts +0 -59
  543. package/lib/carousel/carousel.module.d.ts +0 -2
  544. package/lib/carousel/index.d.ts +0 -6
  545. package/lib/checkbox/index.d.ts +0 -2
  546. package/lib/datalist/datalist.component.d.ts +0 -22
  547. package/lib/datalist/datalist.module.d.ts +0 -2
  548. package/lib/datalist/index.d.ts +0 -2
  549. package/lib/datapager/datapager-base.component.d.ts +0 -12
  550. package/lib/datapager/datapager-info.component.d.ts +0 -24
  551. package/lib/datapager/datapager-input-selector.component.d.ts +0 -12
  552. package/lib/datapager/datapager-next-buttons.components.d.ts +0 -14
  553. package/lib/datapager/datapager-numeric-selector.component.d.ts +0 -17
  554. package/lib/datapager/datapager-pagesize-dropdown.component.d.ts +0 -17
  555. package/lib/datapager/datapager-prev-buttons.component.d.ts +0 -13
  556. package/lib/datapager/datapager.component.d.ts +0 -41
  557. package/lib/datapager/datapager.module.d.ts +0 -2
  558. package/lib/datapager/index.d.ts +0 -8
  559. package/lib/datepicker/datepicker.component.d.ts +0 -15
  560. package/lib/datepicker/datepicker.module.d.ts +0 -2
  561. package/lib/datepicker/index.d.ts +0 -2
  562. package/lib/decorators/decorators.module.d.ts +0 -2
  563. package/lib/decorators/index.d.ts +0 -3
  564. package/lib/decorators/prefix.component.d.ts +0 -5
  565. package/lib/decorators/suffix.component.d.ts +0 -5
  566. package/lib/dialog/dialog.class.d.ts +0 -35
  567. package/lib/dialog/index.d.ts +0 -4
  568. package/lib/drawer/drawer-container.component.d.ts +0 -10
  569. package/lib/drawer/drawer-content.component.d.ts +0 -5
  570. package/lib/drawer/index.d.ts +0 -4
  571. package/lib/dropdown/index.d.ts +0 -2
  572. package/lib/form/form-field.component.d.ts +0 -5
  573. package/lib/form/form-field.module.d.ts +0 -2
  574. package/lib/form/form.component.d.ts +0 -10
  575. package/lib/form/index.d.ts +0 -3
  576. package/lib/icon/icon.component.d.ts +0 -7
  577. package/lib/icon/icon.module.d.ts +0 -2
  578. package/lib/icon/index.d.ts +0 -2
  579. package/lib/input-mask/index.d.ts +0 -2
  580. package/lib/input-mask/input-mask.component.d.ts +0 -11
  581. package/lib/input-mask/input-mask.module.d.ts +0 -2
  582. package/lib/label/index.d.ts +0 -2
  583. package/lib/loading/index.d.ts +0 -4
  584. package/lib/loading/loading.component.d.ts +0 -5
  585. package/lib/loading/loading.directive.d.ts +0 -19
  586. package/lib/number-box/index.d.ts +0 -2
  587. package/lib/page/index.d.ts +0 -2
  588. package/lib/popup/index.d.ts +0 -3
  589. package/lib/selectbox/index.d.ts +0 -2
  590. package/lib/selection-list/index.d.ts +0 -2
  591. package/lib/side-menu/index.d.ts +0 -2
  592. package/lib/side-menu/side-menu.component.d.ts +0 -5
  593. package/lib/side-menu/side-menu.module.d.ts +0 -2
  594. package/lib/switch/index.d.ts +0 -2
  595. package/lib/tabs/index.d.ts +0 -5
  596. package/lib/tabs/tab-strip.component.d.ts +0 -14
  597. package/lib/tabs/tab-view.component.d.ts +0 -11
  598. package/lib/tabs/tab.component.d.ts +0 -15
  599. package/lib/tabs/tabs.class.d.ts +0 -18
  600. package/lib/tabs/tabs.module.d.ts +0 -2
  601. package/lib/textbox/index.d.ts +0 -2
  602. package/lib/time-box/index.d.ts +0 -2
  603. package/lib/time-box/time-box.component.d.ts +0 -26
  604. package/lib/time-box/time-box.module.d.ts +0 -2
  605. package/lib/toast/index.d.ts +0 -4
  606. package/lib/toast/toast.class.d.ts +0 -14
  607. package/lib/toast/toast.component.d.ts +0 -13
  608. package/lib/tooltip/index.d.ts +0 -3
  609. package/lib/tooltip/tooltip.component.d.ts +0 -7
  610. package/lib/validation/index.d.ts +0 -2
@@ -0,0 +1,956 @@
1
+ import { Component, ViewEncapsulation, ChangeDetectionStrategy, Input, EventEmitter, Output, ViewChild, ChangeDetectorRef, ElementRef, ContentChild, NgZone, TemplateRef } from '@angular/core';
2
+ import { Observable } from 'rxjs';
3
+ import { debounceTime, distinctUntilChanged } from 'rxjs/operators';
4
+ import { AXTextBoxComponent } from '../textbox/textbox.component';
5
+ import { AXDropdownComponent } from '../dropdown/dropdown.component';
6
+ import { AXValidatableComponent } from '../base/element.class';
7
+ import { AXDataSourceComponent } from '../data-source/datasource.component';
8
+ import { AXValidation } from '../validation/validation.component';
9
+ import { AXBaseEvent } from '../base/events.class';
10
+ import { AXSearchBoxComponent } from '../searchbox/searchbox.component';
11
+ import { AXConfig } from '@acorex/core';
12
+ import { differenceBy } from 'lodash';
13
+ import * as i0 from "@angular/core";
14
+ import * as i1 from "../dropdown/dropdown.component";
15
+ import * as i2 from "../textbox/textbox.component";
16
+ import * as i3 from "../searchbox/searchbox.component";
17
+ import * as i4 from "../checkbox/checkbox.component";
18
+ import * as i5 from "@acorex/core";
19
+ import * as i6 from "@angular/common";
20
+ export class AXSelectBoxSelectionChangedEvent extends AXBaseEvent {
21
+ constructor(component, selectedItems, selectedValues) {
22
+ super();
23
+ this.selectedItems = selectedItems;
24
+ this.selectedValues = selectedValues;
25
+ this.component = component;
26
+ }
27
+ }
28
+ export class AXSelectBoxComponent extends AXValidatableComponent {
29
+ constructor(cdr, ref, zone) {
30
+ super();
31
+ this.cdr = cdr;
32
+ this.ref = ref;
33
+ this.zone = zone;
34
+ this.showDropDownButton = true;
35
+ this.showCheckBox = true;
36
+ this.readonly = false;
37
+ this.rtl = AXConfig.get('layout.rtl');
38
+ this.disabled = false;
39
+ this.size = 'md';
40
+ this.allowNull = true;
41
+ this.textAlign = null;
42
+ this.bufferSize = 20;
43
+ this.remoteOperation = false;
44
+ this.dropdownToggle = new EventEmitter();
45
+ // this input is Private and only use in LOV
46
+ this.currentfocusedIndex = -1;
47
+ this.showLoading = false;
48
+ this.skip = -1;
49
+ this.searchText = '';
50
+ // @Input()
51
+ // chipsWidth: string = '';
52
+ this.text = '';
53
+ this.totalCount = 0;
54
+ this.allowSearch = true;
55
+ this.textField = 'text';
56
+ this.valueField = 'value';
57
+ this.disabledField = 'disabled';
58
+ this.mode = 'single';
59
+ this.itemRemove = false;
60
+ this.itemsChange = new EventEmitter();
61
+ this.onBlur = new EventEmitter();
62
+ this.onFocus = new EventEmitter();
63
+ this._items = [];
64
+ this.hasSelectedValue = false;
65
+ this.itemsFiltered = [];
66
+ // #endregion
67
+ this.dropDownDisabled = false;
68
+ this.selectionChanged = new EventEmitter();
69
+ this.selectedItemsChange = new EventEmitter();
70
+ this._selectedItems = [];
71
+ this.delay = 500;
72
+ this.selectedValuesChange = new EventEmitter();
73
+ }
74
+ get dataSource() {
75
+ return this._dataSource ? this._dataSource : this._contentDataSource;
76
+ }
77
+ set dataSource(v) {
78
+ this._dataSource = v;
79
+ }
80
+ get validation() {
81
+ return this._validation ? this._validation : this._contentValidation;
82
+ }
83
+ set validation(v) {
84
+ this._validation = v;
85
+ }
86
+ get items() {
87
+ return this._items;
88
+ }
89
+ set items(v) {
90
+ this._items = v;
91
+ if (this.itemsChange) {
92
+ this.itemsChange.emit(v);
93
+ }
94
+ if (this.itemsStatusObserver) {
95
+ this.itemsStatusObserver.next(this.items.length);
96
+ }
97
+ }
98
+ get selectedItems() {
99
+ return this._selectedItems || [];
100
+ }
101
+ set selectedItems(v) {
102
+ this.setSelectedItemsChange(v);
103
+ // if (!v) {
104
+ // v = [];
105
+ // }
106
+ // const old = this.selectedItems;
107
+ // if (JSON.stringify(old) !== JSON.stringify(v)) {
108
+ // this._selectedItems = this.mode == 'single' ? v.slice(0, 1) : [...new Set(v)]; //[...new Set(v[0])] : [...new Set(v)];
109
+ // this._selectedItems.forEach((c) => (c.selected = true));
110
+ // this.selectedItemsChange.emit(this._selectedItems);
111
+ // this.selectedValuesChange.emit(this.selectedValues);
112
+ // this.clearValidationStyle(this.ref.nativeElement);
113
+ // this.waitForData(() => {
114
+ // if (this._selectedItems) {
115
+ // this.items.forEach((c) => (c.selected = this._selectedItems.some((i) => i[this.valueField] == c[this.valueField])));
116
+ // }
117
+ // });
118
+ // }
119
+ }
120
+ setSelectedItemsChange(v, old = this.selectedItems) {
121
+ if (!v) {
122
+ v = [];
123
+ }
124
+ // const old = this.selectedItems;
125
+ var f = differenceBy(old, v, this.valueField);
126
+ var s = differenceBy(v, old, this.valueField);
127
+ // if (JSON.stringify(old) !== JSON.stringify(v)) {
128
+ if (f.length != 0 || s.length != 0) {
129
+ this._selectedItems = this.mode == 'single' ? v.slice(0, 1) : [...new Set(v)]; //[...new Set(v[0])] : [...new Set(v)];
130
+ this._selectedItems.forEach((c) => (c.selected = true));
131
+ this.selectedItemsChange.emit(this._selectedItems);
132
+ this.selectedValuesChange.emit(this.selectedValues);
133
+ this.clearValidationStyle(this.ref.nativeElement);
134
+ this.waitForData(() => {
135
+ if (this._selectedItems) {
136
+ this.items.forEach((c) => (c.selected = this._selectedItems.some((i) => i[this.valueField] == c[this.valueField])));
137
+ }
138
+ });
139
+ }
140
+ }
141
+ ngOnInit() {
142
+ if (this.rowTemplate === undefined && this.rowInputTemplate != undefined) {
143
+ this.rowTemplate = this.rowInputTemplate;
144
+ }
145
+ if (this.rtl == null) {
146
+ this.rtl = window.getComputedStyle(this.ref.nativeElement, null).getPropertyValue('direction') === 'rtl';
147
+ }
148
+ }
149
+ scrolled(e) {
150
+ if (this.remoteOperation &&
151
+ this.totalCount > this.items.length &&
152
+ this.listContainer.nativeElement.scrollHeight != 0 &&
153
+ this.listContainer.nativeElement.scrollHeight - this.listContainer.nativeElement.scrollTop - 300 < 50) {
154
+ if (this.skip !== this.items.length) {
155
+ this.showLoading = true;
156
+ this.skip = this.items.length;
157
+ const params = {};
158
+ params.skip = this.items.length;
159
+ params.take = this.bufferSize; //* (Math.floor(this.items.length / this.bufferSize) + 1);
160
+ if (this.textbox) {
161
+ params.searchText = this.text;
162
+ }
163
+ else {
164
+ params.searchText = null;
165
+ }
166
+ this.fetch(params);
167
+ }
168
+ }
169
+ }
170
+ setSelectedItems(v, isUserInput) {
171
+ let changed = false;
172
+ if (isUserInput) {
173
+ changed = JSON.stringify(v) !== JSON.stringify(this.selectedItems);
174
+ }
175
+ this.selectedItems = v;
176
+ this.setSelectedIndex();
177
+ if (isUserInput && changed) {
178
+ this.emitSelectionChangedEvent();
179
+ }
180
+ }
181
+ textChanged(e) {
182
+ if ((e.value === null || e.value === undefined || e.value === '') && (e.oldValue === null || e.oldValue === undefined || e.oldValue === '')) {
183
+ }
184
+ else {
185
+ this.currentfocusedIndex = -1;
186
+ if (this.remoteOperation) {
187
+ this.searchText = this.text;
188
+ // this.searchText = e.value;
189
+ // this.text = e.value;
190
+ // this.items = [];
191
+ if (this.items) {
192
+ let t = this.items.length;
193
+ for (let i = 0; i < t; i++) {
194
+ this.items.pop();
195
+ }
196
+ }
197
+ // this.items.forEach((element) => {
198
+ // this.items.pop();
199
+ // });
200
+ const params = {};
201
+ params.searchText = this.text;
202
+ // params.searchText = e.value;
203
+ params.skip = 0;
204
+ params.take = this.bufferSize;
205
+ this.fetch(params);
206
+ }
207
+ }
208
+ }
209
+ isItemDisabled(item) {
210
+ if (item[this.disabledField] == true) {
211
+ return true;
212
+ }
213
+ else if (this.disabledCallback) {
214
+ return this.disabledCallback({ item, index: -1 });
215
+ }
216
+ else {
217
+ return false;
218
+ }
219
+ }
220
+ onButtonClick(e) {
221
+ console.log('onButtonClick', e);
222
+ }
223
+ setSelectedIndex(sign = null) {
224
+ if (sign == null) {
225
+ if (!this.remoteOperation && this.text && this.text !== '') {
226
+ this.currentfocusedIndex = this.items
227
+ .filter((c) => c[this.textField].toLowerCase().includes(this.text.toLowerCase()))
228
+ .indexOf(this.selectedItems[this.selectedItems.length - 1]);
229
+ }
230
+ else {
231
+ this.currentfocusedIndex = this.items.indexOf(this.selectedItems[this.selectedItems.length - 1]);
232
+ }
233
+ }
234
+ else {
235
+ sign === -1 ? this.currentfocusedIndex-- : this.currentfocusedIndex++;
236
+ }
237
+ if (this.remoteOperation) {
238
+ this.itemsFiltered = this.items;
239
+ }
240
+ else {
241
+ this.itemsFiltered = this.text
242
+ ? this.items.filter((c) => c[this.textField].toLowerCase().includes(this.text.toLowerCase()))
243
+ : this.items;
244
+ }
245
+ this.currentfocusedIndex =
246
+ this.currentfocusedIndex < 0
247
+ ? 0
248
+ : this.currentfocusedIndex >= this.itemsFiltered.length
249
+ ? this.itemsFiltered.length - 1
250
+ : this.currentfocusedIndex;
251
+ //
252
+ // set scroll
253
+ if (this.listContainer) {
254
+ this.zone.runOutsideAngular(() => {
255
+ const itemDiv = this.listContainer.nativeElement.querySelector(`.list-item:nth-child(${this.currentfocusedIndex})`);
256
+ if (itemDiv) {
257
+ itemDiv.scrollIntoView({ behavior: 'smooth' });
258
+ }
259
+ });
260
+ }
261
+ }
262
+ get selectedValues() {
263
+ if (this.mode === 'single') {
264
+ return this._selectedItems.map((c) => c[this.valueField])[0];
265
+ }
266
+ else {
267
+ return this._selectedItems.map((c) => c[this.valueField]) || [];
268
+ }
269
+ }
270
+ set selectedValues(v) {
271
+ if (this.compareSelectedValues(v)) {
272
+ return;
273
+ }
274
+ if (v == null) {
275
+ this.selectedItems = [];
276
+ }
277
+ else {
278
+ if (v !== undefined) {
279
+ if (v != [] && v != '' && v != null) {
280
+ this.hasSelectedValue = true;
281
+ }
282
+ this.waitForData(() => {
283
+ if (this.mode === 'single') {
284
+ if (this.items.filter((c) => v == c[this.valueField])) {
285
+ this.selectedItems = this.items.filter((c) => v == c[this.valueField]);
286
+ }
287
+ else {
288
+ this.selectedItems = [];
289
+ }
290
+ }
291
+ else {
292
+ if (Array.isArray(v)) {
293
+ if (this.selectedItems.length > v.length) {
294
+ this.selectedItems = this.selectedItems.filter((c) => v.includes(c[this.valueField]));
295
+ }
296
+ else {
297
+ let addId = [];
298
+ v.forEach((vId) => {
299
+ addId.push({
300
+ [this.valueField]: vId
301
+ });
302
+ });
303
+ let newId = differenceBy(addId, this.selectedItems, this.valueField);
304
+ let vv = [];
305
+ newId.forEach((rc) => {
306
+ vv.push(rc[this.valueField]);
307
+ });
308
+ this.items
309
+ .filter((c) => vv.includes(c[this.valueField]))
310
+ .forEach((res) => {
311
+ this.selectedItems.push(res);
312
+ });
313
+ // this.selectedItems.push(this.items.filter((c) => vv.includes(c[this.valueField])));
314
+ this.setSelectedItemsChange(this.selectedItems, vv.length > 0 ? [1] : this.selectedItems);
315
+ }
316
+ // this.selectedItems = this.items.filter((c) => v.includes(c[this.valueField]));
317
+ }
318
+ else if (v) {
319
+ this.selectedItems = this.items.filter((c) => v === c[this.valueField]);
320
+ }
321
+ else {
322
+ this.selectedItems = [];
323
+ }
324
+ }
325
+ this.selectedValuesChange.emit(this.selectedValues);
326
+ this.cdr.markForCheck();
327
+ this.cdr.detectChanges();
328
+ });
329
+ }
330
+ }
331
+ }
332
+ compareSelectedValues(newValue) {
333
+ const currentValue = this.selectedValues;
334
+ return (currentValue == null && newValue == null) || JSON.stringify(currentValue) === JSON.stringify(newValue);
335
+ }
336
+ setSelectedValues(v, isUserInput) {
337
+ const changed = isUserInput ? !this.compareSelectedValues(v) : false;
338
+ this.selectedValues = v;
339
+ if (isUserInput && changed) {
340
+ this.emitSelectionChangedEvent();
341
+ }
342
+ }
343
+ emitSelectionChangedEvent() {
344
+ this.selectedValuesChange.emit(this.selectedValues);
345
+ this.selectionChanged.emit(new AXSelectBoxSelectionChangedEvent(this, this.selectedItems, this.selectedValues));
346
+ }
347
+ ngAfterViewInit() {
348
+ if (this.bufferSize < 10) {
349
+ this.bufferSize = 10;
350
+ }
351
+ if (this.mode == 'single') {
352
+ this.showCheckBox = false;
353
+ }
354
+ else {
355
+ this.showCheckBox = true;
356
+ }
357
+ if (!this.remoteOperation || (this.remoteOperation && this.hasSelectedValue)) {
358
+ this.refresh();
359
+ }
360
+ }
361
+ dropdownToggleSelecBox(e) {
362
+ this.text = '';
363
+ if (this.dropdown.isOpen) {
364
+ this.refresh();
365
+ setTimeout(() => {
366
+ if (this.serchBox) {
367
+ this.serchBox.focus();
368
+ }
369
+ }, 1);
370
+ }
371
+ else {
372
+ // this.refresh();
373
+ }
374
+ this.dropdownToggle.emit(e);
375
+ }
376
+ ngAfterContentInit() {
377
+ // if (!this.allowSearch) {
378
+ // if (this.readonly == false) {
379
+ // this.itemRemove = true;
380
+ // this.readonly = true;
381
+ // }
382
+ // }
383
+ this.initValidation(this.ref, 'selectedItems', this.validation);
384
+ if (this.dataSource) {
385
+ // if (this.allowSearch == false) {
386
+ // this.fetch();
387
+ // }
388
+ this.dataSource.onDataReceived.subscribe((c) => {
389
+ this.showLoading = false;
390
+ this.dataReceived(c.data.result);
391
+ });
392
+ }
393
+ this.cdr.markForCheck();
394
+ this.cdr.detectChanges();
395
+ }
396
+ dataReceived(data) {
397
+ if (this.remoteOperation) {
398
+ if (this.searchText && this.searchText != null && this.searchText !== '') {
399
+ if (data.totalCount) {
400
+ if (this.items.length == 0) {
401
+ //this.items = data.items;
402
+ data.items.forEach((item) => {
403
+ this.items.push(item);
404
+ });
405
+ }
406
+ else {
407
+ data.items.forEach((item) => {
408
+ this.items.push(item);
409
+ });
410
+ // if (this.itemsStatusObserver) {
411
+ // this.itemsStatusObserver.next(this.items.length);
412
+ // }
413
+ }
414
+ this.totalCount = data.totalCount;
415
+ }
416
+ else {
417
+ if (this.items.length == 0) {
418
+ this.items = data.items;
419
+ }
420
+ else {
421
+ data.items.forEach((item) => {
422
+ this.items.push(item);
423
+ });
424
+ // if (this.itemsStatusObserver) {
425
+ // this.itemsStatusObserver.next(this.items.length);
426
+ // }
427
+ }
428
+ this.totalCount = data.items == undefined ? 0 : data.items.length;
429
+ }
430
+ }
431
+ else if (data.items && data.items.length === data.totalCount) {
432
+ this.items = data.items;
433
+ this.totalCount = data.items.length;
434
+ }
435
+ else if (data.totalCount) {
436
+ data.items.forEach((elm) => {
437
+ this.items.push(elm);
438
+ });
439
+ // if (this.itemsStatusObserver) {
440
+ // this.itemsStatusObserver.next(this.items.length);
441
+ // }
442
+ this.totalCount = data.totalCount;
443
+ }
444
+ else {
445
+ data.forEach((elm) => {
446
+ this.items.push(elm);
447
+ // if (this.itemsStatusObserver) {
448
+ // this.itemsStatusObserver.next(this.items.length);
449
+ // }
450
+ });
451
+ this.totalCount = data.length;
452
+ }
453
+ }
454
+ else {
455
+ this.items = data;
456
+ }
457
+ this.cdr.markForCheck();
458
+ this.cdr.detectChanges();
459
+ this.dropdown.updatePosition();
460
+ }
461
+ // private params: AXDataSourceReadParams = {};
462
+ fetch(params = {}) {
463
+ // this.params = params;
464
+ if (this.dataSource) {
465
+ this.showLoading = true;
466
+ this.dataSource.fetch(params);
467
+ }
468
+ }
469
+ refresh() {
470
+ const params = {};
471
+ if (this.remoteOperation) {
472
+ params.skip = 0;
473
+ this.skip = 0;
474
+ params.take = this.bufferSize;
475
+ }
476
+ if (this.dataSource != undefined) {
477
+ // this.items = [];
478
+ // this.items.forEach((element) => {
479
+ // this.items.pop();
480
+ // });
481
+ if (this.items) {
482
+ let t = this.items.length;
483
+ for (let i = 0; i < t; i++) {
484
+ this.items.pop();
485
+ }
486
+ }
487
+ this.fetch(params);
488
+ }
489
+ }
490
+ handleItemRemoveClick(item) {
491
+ if (this.mode === 'single') {
492
+ // this.selectedItems = null;
493
+ this.setSelectedValues(null, true);
494
+ // this.selectedItemsChange.emit(this._selectedItems);
495
+ // this.clearValidationStyle(this.ref.nativeElement);
496
+ }
497
+ else {
498
+ // this.selectedItems = this.selectedItems.filter((c) => c !== item);
499
+ this.setSelectedItems(this.selectedItems.filter((c) => c[this.valueField] !== item[this.valueField]), true);
500
+ // this._selectedItems = this._selectedItems.filter(c => c !== item);
501
+ // this.selectedItemsChange.emit(this._selectedItems);
502
+ // this.clearValidationStyle(this.ref.nativeElement);
503
+ }
504
+ // this.text = '';
505
+ this.validate();
506
+ this.cdr.markForCheck();
507
+ }
508
+ onFocusTextBox(e) { }
509
+ onTextBoxClick(e) {
510
+ if (this.disabled == false && this.readonly == false) {
511
+ this.dropdown.open();
512
+ }
513
+ }
514
+ handleItemClick(e, item) {
515
+ if (this.isItemDisabled(item) == false) {
516
+ const value = item[this.valueField];
517
+ if (this.mode === 'single') {
518
+ // this.selectedValues = value;
519
+ this.setSelectedValues(value, true);
520
+ }
521
+ else {
522
+ const exists = this.selectedValues.slice(0);
523
+ if (exists.includes(value)) {
524
+ if (this.allowNull == true || (this.allowNull == false && this.selectedItems.length > 1)) {
525
+ this.handleItemRemoveClick(item);
526
+ }
527
+ }
528
+ else {
529
+ exists.push(value);
530
+ // this.selectedValues = exists;
531
+ this.setSelectedValues(exists, true);
532
+ }
533
+ }
534
+ if (this.mode == 'single') {
535
+ this.text = '';
536
+ this.dropdown.close();
537
+ this.cdr.markForCheck();
538
+ }
539
+ // if (e.stopPropagation() == undefined) {
540
+ // e.stopPropagation();
541
+ // }
542
+ setTimeout(() => {
543
+ if (this.serchBox) {
544
+ this.serchBox.focus();
545
+ }
546
+ }, 0);
547
+ }
548
+ e.stopPropagation();
549
+ }
550
+ handleKeyEventSearch(e) {
551
+ if (this.disabled || this.readonly) {
552
+ this.dropdown.close();
553
+ setTimeout(() => {
554
+ this.textBoxSelectBox.focus();
555
+ }, 0);
556
+ return false;
557
+ }
558
+ if (e.key === 'Escape') {
559
+ this.text = null;
560
+ setTimeout(() => {
561
+ this.textBoxSelectBox.focus();
562
+ }, 0);
563
+ }
564
+ if ((e.key === 'ArrowDown' || e.key === 'ArrowUp') && this.getItems().length > 0 && e.type === 'keydown') {
565
+ if (this.mode === 'single') {
566
+ this.currentfocusedIndex = this.currentfocusedIndex + (e.key === 'ArrowDown' ? 1 : -1);
567
+ this.selectedItemByIndex(this.currentfocusedIndex);
568
+ }
569
+ else {
570
+ if (this.dropdown.isOpen) {
571
+ this.setSelectedIndex(e.key === 'ArrowDown' ? 1 : -1);
572
+ }
573
+ else {
574
+ this.dropdown.open();
575
+ setTimeout(() => {
576
+ if (this.serchBox) {
577
+ this.serchBox.focus();
578
+ }
579
+ }, 0);
580
+ }
581
+ }
582
+ }
583
+ // if (e.key == 'Enter' && this.dropdown.isOpen && this.mode == 'single') {
584
+ // this.dropdown.close();
585
+ // setTimeout(() => {
586
+ // this.dropdown.focus();
587
+ // }, 0);
588
+ // }
589
+ //e.stopPropagation();
590
+ //e.preventDefault();
591
+ e.stopImmediatePropagation();
592
+ if (e.type === 'keydown' && e.key == 'Enter' && this.dropdown.isOpen) {
593
+ if (!this.remoteOperation && this.text && this.text !== '') {
594
+ this.itemsFiltered = this.items.filter((c) => c[this.textField].toLowerCase().includes(this.text.toLowerCase()));
595
+ if (this.itemsFiltered.length === 1) {
596
+ this.currentfocusedIndex = 0;
597
+ }
598
+ }
599
+ else {
600
+ this.itemsFiltered = this.items;
601
+ }
602
+ if (this.selectedItems.filter((c) => c[this.valueField] === this.itemsFiltered[this.currentfocusedIndex][this.valueField]).length > 0 &&
603
+ this.mode == 'multiple') {
604
+ if (this.allowNull == true || (this.allowNull == false && this.selectedItems.length > 1)) {
605
+ if (!this.remoteOperation && this.text && this.text !== '') {
606
+ this.selectedItems = this.selectedItems.filter((c) => c !==
607
+ this.items.filter((c) => c[this.textField].toLowerCase().includes(this.text.toLowerCase()))[this.currentfocusedIndex]);
608
+ }
609
+ else {
610
+ this.selectedItems = this.selectedItems.filter((c) => c[this.valueField] !== this.items[this.currentfocusedIndex][this.valueField]);
611
+ }
612
+ this.emitSelectionChangedEvent();
613
+ }
614
+ }
615
+ else {
616
+ if (this.mode == 'multiple') {
617
+ if (this.currentfocusedIndex != -1) {
618
+ if (!this.remoteOperation && this.text && this.text !== '') {
619
+ if (this.itemsFiltered.length === 1) {
620
+ this.selectedItems.push(this.itemsFiltered[0]);
621
+ }
622
+ else {
623
+ this.selectedItems.push(this.itemsFiltered[this.currentfocusedIndex]);
624
+ }
625
+ }
626
+ else {
627
+ this.selectedItems.push(this.items[this.currentfocusedIndex]);
628
+ }
629
+ this.emitSelectionChangedEvent();
630
+ }
631
+ }
632
+ else {
633
+ if (this.text && this.itemsFiltered?.length === 1) {
634
+ this.setSelectedItems(this.itemsFiltered, true);
635
+ }
636
+ if (this.mode == 'single') {
637
+ this.dropdown.close();
638
+ setTimeout(() => {
639
+ this.textBoxSelectBox.focus();
640
+ }, 0);
641
+ }
642
+ }
643
+ }
644
+ e.stopPropagation();
645
+ e.preventDefault();
646
+ e.stopImmediatePropagation();
647
+ }
648
+ this.cdr.markForCheck();
649
+ }
650
+ isChar(str) {
651
+ if (str.includes('Shift') ||
652
+ str.includes('Tab') ||
653
+ str.includes('Control') ||
654
+ str.includes('Alt') ||
655
+ str.includes('CapsLock') ||
656
+ str.includes('Meta') ||
657
+ str.includes('ContextMenu') ||
658
+ str.includes('Enter') ||
659
+ str.includes('Backspace') ||
660
+ str.includes('PrintScreen') ||
661
+ str.includes('ScrollLock') ||
662
+ str.includes('Pause') ||
663
+ str.includes('Home') ||
664
+ str.includes('End') ||
665
+ str.includes('Insert') ||
666
+ str.includes('PageUp') ||
667
+ str.includes('Delete') ||
668
+ str.includes('PageDown') ||
669
+ str.includes('NumLock') ||
670
+ str.includes('Escape') ||
671
+ str.includes('Arrow') ||
672
+ str.includes('ّF1') ||
673
+ str.includes('F2') ||
674
+ str.includes('F3') ||
675
+ str.includes('F4') ||
676
+ str.includes('F5') ||
677
+ str.includes('F6') ||
678
+ str.includes('F7') ||
679
+ str.includes('F8') ||
680
+ str.includes('F9') ||
681
+ str.includes('F10') ||
682
+ str.includes('F11') ||
683
+ str.includes('F12')) {
684
+ return false;
685
+ }
686
+ else {
687
+ return true;
688
+ }
689
+ }
690
+ handleKeyEvent(e) {
691
+ // const NumberMinusPattern = /[a-zA-Z0-9\-]/g;
692
+ // const Farsi = /[پچجحخهعغفقثصضشسیبلاتنمکگوئدذرزطظژؤإأءًٌٍَُِّ\s]+$/;
693
+ // const inputChar = String.fromCharCode(e.charCode);
694
+ // const patternEn = /^[a-zA-Z0-9]*$/;
695
+ // const pattern = /^[\u0600-\u06FF\s]+$/;
696
+ const inputChar = e.key;
697
+ if ((inputChar != 'Backspace' &&
698
+ inputChar != 'Backspace' &&
699
+ inputChar != 'Tab' &&
700
+ inputChar != 'Enter' &&
701
+ inputChar != 'Escape' &&
702
+ inputChar != 'ArrowDown' &&
703
+ inputChar != 'ArrowUp') ||
704
+ e.code === 'Space' ||
705
+ e.ctrlKey == true) {
706
+ e.preventDefault();
707
+ }
708
+ if (e.key === 'Backspace' &&
709
+ e.type === 'keydown' &&
710
+ ((this.allowNull === true && this.selectedItems.length > 0) || (this.allowNull === false && this.selectedItems.length > 1))) {
711
+ this.selectedItems.pop();
712
+ this.emitSelectionChangedEvent();
713
+ }
714
+ if (this.disabled || this.readonly) {
715
+ this.dropdown.close();
716
+ setTimeout(() => {
717
+ this.textBoxSelectBox.focus();
718
+ }, 0);
719
+ return false;
720
+ }
721
+ const INPUT = String.fromCharCode(e.keyCode);
722
+ if (this.isChar(e.key) && this.allowSearch && e.ctrlKey == false) {
723
+ this.dropdown.open();
724
+ setTimeout(() => {
725
+ if (this.serchBox) {
726
+ this.serchBox.focus();
727
+ }
728
+ }, 0);
729
+ this.text = e.key;
730
+ }
731
+ if (e.key === 'Escape') {
732
+ this.text = null;
733
+ this.dropdown.close();
734
+ setTimeout(() => {
735
+ this.textBoxSelectBox.focus();
736
+ }, 0);
737
+ }
738
+ if ((e.key === 'ArrowDown' || e.key === 'ArrowUp') && this.getItems().length > 0 && e.type === 'keydown') {
739
+ if (this.mode === 'single') {
740
+ this.selectedItemByIndex(this.currentfocusedIndex + (e.key === 'ArrowDown' ? 1 : -1));
741
+ }
742
+ else {
743
+ if (this.dropdown.isOpen) {
744
+ // this.setSelectedIndex((e.key === 'ArrowDown' ? 1 : -1));
745
+ if (this.allowSearch == false) {
746
+ this.setSelectedIndex(e.key === 'ArrowDown' ? 1 : -1);
747
+ }
748
+ else {
749
+ setTimeout(() => {
750
+ if (this.serchBox) {
751
+ this.serchBox.focus();
752
+ }
753
+ }, 0);
754
+ }
755
+ }
756
+ else {
757
+ this.dropdown.open();
758
+ if (this.allowSearch == true) {
759
+ setTimeout(() => {
760
+ if (this.serchBox) {
761
+ this.serchBox.focus();
762
+ }
763
+ }, 0);
764
+ }
765
+ }
766
+ }
767
+ }
768
+ if (this.allowSearch === false) {
769
+ if (e.type === 'keydown' && e.key == 'Enter' && this.dropdown.isOpen) {
770
+ e.stopImmediatePropagation();
771
+ if (this.selectedItems.filter((c) => c[this.valueField] === this.itemsFiltered[this.currentfocusedIndex][this.valueField]).length > 0 &&
772
+ this.mode == 'multiple') {
773
+ if (this.allowNull == true || (this.allowNull == false && this.selectedItems.length > 1)) {
774
+ if (!this.remoteOperation && this.text && this.text !== '') {
775
+ this.selectedItems = this.selectedItems.filter((c) => c !==
776
+ this.items.filter((c) => c[this.textField].toLowerCase().includes(this.text.toLowerCase()))[this.currentfocusedIndex]);
777
+ }
778
+ else {
779
+ this.selectedItems = this.selectedItems.filter((c) => c[this.valueField] !== this.items[this.currentfocusedIndex][this.valueField]);
780
+ }
781
+ this.emitSelectionChangedEvent();
782
+ }
783
+ }
784
+ else {
785
+ if (this.mode == 'multiple') {
786
+ if (this.currentfocusedIndex != -1) {
787
+ if (!this.remoteOperation && this.text && this.text !== '') {
788
+ if (this.itemsFiltered.length === 1) {
789
+ this.selectedItems.push(this.itemsFiltered[0]);
790
+ }
791
+ else {
792
+ this.selectedItems.push(this.itemsFiltered[this.currentfocusedIndex]);
793
+ }
794
+ }
795
+ else {
796
+ this.selectedItems.push(this.items[this.currentfocusedIndex]);
797
+ }
798
+ this.emitSelectionChangedEvent();
799
+ }
800
+ }
801
+ else {
802
+ if (this.text && this.itemsFiltered.length === 1) {
803
+ this.setSelectedItems(this.itemsFiltered, true);
804
+ }
805
+ if (this.mode == 'single') {
806
+ this.dropdown.close();
807
+ setTimeout(() => {
808
+ this.textBoxSelectBox.focus();
809
+ }, 0);
810
+ }
811
+ }
812
+ }
813
+ }
814
+ }
815
+ this.cdr.markForCheck();
816
+ }
817
+ focus() {
818
+ this.textbox.focus();
819
+ }
820
+ selectedItemByIndex(index) {
821
+ let item = [];
822
+ if (!this.remoteOperation && this.text && this.text !== '') {
823
+ this.itemsFiltered = this.items.filter((c) => c[this.textField].toLowerCase().includes(this.text.toLowerCase()));
824
+ item = this.itemsFiltered[index];
825
+ }
826
+ else {
827
+ item = this.items[index];
828
+ }
829
+ //
830
+ // const item = this.text ? this.items.filter((c) => (c[this.textField] as string).toLowerCase().includes(this.text.toLowerCase()))[index] : this.items[index];
831
+ if (item) {
832
+ this.setSelectedItems([item], true);
833
+ }
834
+ this.setSelectedIndex();
835
+ }
836
+ getItems() {
837
+ if (this.items == null) {
838
+ return [];
839
+ }
840
+ return !this.remoteOperation && this.text && this.text !== ''
841
+ ? this.items.filter((c) => c[this.textField].toLowerCase().includes(this.text.toLowerCase()))
842
+ : this.items;
843
+ }
844
+ isItemSelected(item) {
845
+ return this.selectedItems && this.selectedItems.filter((c) => c[this.valueField] === item[this.valueField]).length > 0;
846
+ }
847
+ waitForData(callbackfn) {
848
+ if (this.items && this.items.length) {
849
+ callbackfn();
850
+ }
851
+ else if (!this.itemsStatusObserver) {
852
+ Observable.create((observer) => {
853
+ this.itemsStatusObserver = observer;
854
+ })
855
+ .pipe(debounceTime(100))
856
+ .pipe(distinctUntilChanged())
857
+ .subscribe((c) => {
858
+ callbackfn();
859
+ });
860
+ }
861
+ }
862
+ }
863
+ AXSelectBoxComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.10", ngImport: i0, type: AXSelectBoxComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.ElementRef }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component });
864
+ AXSelectBoxComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.10", type: AXSelectBoxComponent, selector: "ax-select-box", inputs: { showDropDownButton: "showDropDownButton", rowInputTemplate: "rowInputTemplate", showCheckBox: "showCheckBox", readonly: "readonly", rtl: "rtl", disabled: "disabled", placeholder: "placeholder", size: "size", allowNull: "allowNull", textAlign: "textAlign", bufferSize: "bufferSize", remoteOperation: "remoteOperation", dataSource: "dataSource", validation: "validation", disabledCallback: "disabledCallback", allowSearch: "allowSearch", textField: "textField", valueField: "valueField", disabledField: "disabledField", mode: "mode", items: "items", selectedItems: "selectedItems", selectedValues: "selectedValues" }, outputs: { dropdownToggle: "dropdownToggle", itemsChange: "itemsChange", onBlur: "onBlur", onFocus: "onFocus", selectionChanged: "selectionChanged", selectedItemsChange: "selectedItemsChange", selectedValuesChange: "selectedValuesChange" }, host: { styleAttribute: "width: 100%" }, providers: [{ provide: AXValidatableComponent, useExisting: AXSelectBoxComponent }], queries: [{ propertyName: "rowTemplate", first: true, predicate: TemplateRef, descendants: true, static: true }, { propertyName: "_contentDataSource", first: true, predicate: AXDataSourceComponent, descendants: true, static: true }, { propertyName: "_contentValidation", first: true, predicate: AXValidation, descendants: true, static: true }], viewQueries: [{ propertyName: "span", first: true, predicate: AXTextBoxComponent, descendants: true, static: true }, { propertyName: "textbox", first: true, predicate: AXTextBoxComponent, descendants: true, static: true }, { propertyName: "listContainer", first: true, predicate: ["listContainer"], descendants: true, static: true }, { propertyName: "serchBox", first: true, predicate: ["serchBox"], descendants: true }, { propertyName: "textBoxSelectBox", first: true, predicate: ["textBoxSelectBox"], descendants: true, static: true }, { propertyName: "dropdown", first: true, predicate: ["d"], descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<ax-drop-down [size]=\"size\" [rtl]=\"rtl\" [showDropDownButton]=\"showDropDownButton\" [disabled]=\"disabled\"\r\n [readonly]=\"readonly\" #d (dropdownToggle)=\"dropdownToggleSelecBox($event)\">\r\n <ng-container start>\r\n <ng-content select=\"[start]\">\r\n </ng-content>\r\n </ng-container>\r\n <ng-container header>\r\n <div class=\"ax chips-container\" [horizontalScroll]=\"40\">\r\n <div class=\"chips\" [class.chips-blank]=\"mode === 'single'\" [title]=\"item[textField]\"\r\n *ngFor=\"let item of selectedItems\">\r\n <span class=\"chips-text\">\r\n {{item[textField]}}\r\n </span>\r\n <span class=\"close-icon\" (click)=\"handleItemRemoveClick(item)\"\r\n *ngIf=\"(readonly!=true || itemRemove ==true)&& disabled!=true && (allowNull==true || (selectedItems.length > 1))\">\r\n <i class=\"far fa-times-circle close\"></i>\r\n </span>\r\n </div>\r\n <div class=\"search-wrapper\" (click)=\"onTextBoxClick($event)\">\r\n <ax-text-box #textBoxSelectBox [textAlign]=\"textAlign\"\r\n [placeholder]=\"selectedItems.length == 0 ? placeholder : ''\" [readonly]=\"readonly\"\r\n [disabled]=\"disabled\" (onkey)=\"handleKeyEvent($event)\" [size]=\"size\"\r\n (onFocus)=\"onFocusTextBox($event)\">\r\n </ax-text-box>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-container end>\r\n <ng-content select=\"[end]\">\r\n </ng-content>\r\n </ng-container>\r\n\r\n <ng-container panel>\r\n <div *ngIf=\"allowSearch\" class=\"search-wrapper\" style=\"padding: 0.7em;\">\r\n <ax-search-box #serchBox [(value)]=\"text\" (onkey)=\"handleKeyEventSearch($event)\"\r\n (textChanged)=\"textChanged($event)\" (onButtonClick)=\"textChanged($event)\">\r\n </ax-search-box>\r\n </div>\r\n <div class=\"ax list-container\">\r\n <div #listContainer class=\"list-container-items\" (scroll)=\"scrolled($event)\">\r\n <ng-container *ngIf=\"getItems().length>0; then thenTemplate; else elseTemplate\"></ng-container>\r\n <ng-template #thenTemplate>\r\n <div [class.ax-state-disabled]=\"isItemDisabled(item)\" class=\"list-item\"\r\n *ngFor=\"let item of getItems();let i = index\" [class.focused]=\"i==currentfocusedIndex\"\r\n [class.selected]=\"isItemSelected(item)\" (click)=\"handleItemClick($event,item)\">\r\n <div style=\"display: flex;\">\r\n <ax-check-box *ngIf=\"showCheckBox\" [size]=\"size\" [value]=\"isItemSelected(item)\"\r\n [disabled]=\"(!allowNull && selectedItems.length === 1 && isItemSelected(item)) || isItemDisabled(item)\"\r\n (onClick)=\"handleItemClick($event,item)\">\r\n </ax-check-box>\r\n <ng-container *ngIf=\"rowTemplate; else elseTemplate\">\r\n <div style=\"white-space: nowrap;text-overflow: ellipsis;overflow: hidden;\"\r\n [title]=\"item[textField]\"\r\n [ngStyle]=\"(showCheckBox) ? {'padding-inline-start': '0.5rem'}:''\">\r\n <ng-container *ngTemplateOutlet=\"rowTemplate; context:{ $implicit: item }\">\r\n </ng-container>\r\n </div>\r\n\r\n </ng-container>\r\n <ng-template #elseTemplate>\r\n <div style=\"white-space: nowrap;text-overflow: ellipsis;overflow: hidden;\"\r\n [title]=\"item[textField]\"\r\n [ngStyle]=\"(showCheckBox) ? {'padding-inline-start': '0.5rem'}:''\">\r\n {{ item[textField] }}\r\n </div>\r\n </ng-template>\r\n\r\n </div>\r\n\r\n </div>\r\n\r\n </ng-template>\r\n <div *ngIf=\"showLoading\" class=\"ax-pad-sm\" style=\"text-align: center;\">\r\n <i class=\"far fa-spinner-third fa-pulse fa-2x\" style=\"color: var(--ax-primary-color);\"></i>\r\n\r\n </div>\r\n <!-- <ax-loading-indicator ></ax-loading-indicator> -->\r\n <ng-template #elseTemplate>\r\n <ng-container *ngIf=\"showLoading == true; then searchTemplate else noDataTemplate\"></ng-container>\r\n <ng-template #searchTemplate>\r\n <div class=\"list-item\">\r\n {{'common.searching' | trans}}\r\n </div>\r\n </ng-template>\r\n <ng-template #noDataTemplate>\r\n <div class=\"list-item\">\r\n {{'common.noDataFound' | trans}}\r\n </div>\r\n </ng-template>\r\n\r\n </ng-template>\r\n\r\n </div>\r\n\r\n </div>\r\n </ng-container>\r\n\r\n</ax-drop-down>", components: [{ type: i1.AXDropdownComponent, selector: "ax-drop-down", inputs: ["rtl", "readonly", "loading"], outputs: ["dropdownToggle", "onButtonClick"] }, { type: i2.AXTextBoxComponent, selector: "ax-text-box", inputs: ["mask", "type", "showMask", "maxLength", "maskGuid", "maskPlaceholder", "maskKeepCharPositions"] }, { type: i3.AXSearchBoxComponent, selector: "ax-search-box", inputs: ["placeholder", "text", "delay"], outputs: ["textChanged", "onButtonClick"] }, { type: i4.AXCheckBoxComponent, selector: "ax-check-box", inputs: ["readonly", "disabled", "size", "label", "tabIndex", "indeterminate", "value"], outputs: ["onValueChanged", "valueChange", "onClick"] }], directives: [{ type: i5.AXHorizontalScrollDirective, selector: "[horizontalScroll]", inputs: ["horizontalScroll"] }, { type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i6.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i6.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }], pipes: { "trans": i5.AXTranslatorPipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
865
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.10", ngImport: i0, type: AXSelectBoxComponent, decorators: [{
866
+ type: Component,
867
+ args: [{ selector: 'ax-select-box', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, host: { style: 'width: 100%' }, providers: [{ provide: AXValidatableComponent, useExisting: AXSelectBoxComponent }], template: "<ax-drop-down [size]=\"size\" [rtl]=\"rtl\" [showDropDownButton]=\"showDropDownButton\" [disabled]=\"disabled\"\r\n [readonly]=\"readonly\" #d (dropdownToggle)=\"dropdownToggleSelecBox($event)\">\r\n <ng-container start>\r\n <ng-content select=\"[start]\">\r\n </ng-content>\r\n </ng-container>\r\n <ng-container header>\r\n <div class=\"ax chips-container\" [horizontalScroll]=\"40\">\r\n <div class=\"chips\" [class.chips-blank]=\"mode === 'single'\" [title]=\"item[textField]\"\r\n *ngFor=\"let item of selectedItems\">\r\n <span class=\"chips-text\">\r\n {{item[textField]}}\r\n </span>\r\n <span class=\"close-icon\" (click)=\"handleItemRemoveClick(item)\"\r\n *ngIf=\"(readonly!=true || itemRemove ==true)&& disabled!=true && (allowNull==true || (selectedItems.length > 1))\">\r\n <i class=\"far fa-times-circle close\"></i>\r\n </span>\r\n </div>\r\n <div class=\"search-wrapper\" (click)=\"onTextBoxClick($event)\">\r\n <ax-text-box #textBoxSelectBox [textAlign]=\"textAlign\"\r\n [placeholder]=\"selectedItems.length == 0 ? placeholder : ''\" [readonly]=\"readonly\"\r\n [disabled]=\"disabled\" (onkey)=\"handleKeyEvent($event)\" [size]=\"size\"\r\n (onFocus)=\"onFocusTextBox($event)\">\r\n </ax-text-box>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-container end>\r\n <ng-content select=\"[end]\">\r\n </ng-content>\r\n </ng-container>\r\n\r\n <ng-container panel>\r\n <div *ngIf=\"allowSearch\" class=\"search-wrapper\" style=\"padding: 0.7em;\">\r\n <ax-search-box #serchBox [(value)]=\"text\" (onkey)=\"handleKeyEventSearch($event)\"\r\n (textChanged)=\"textChanged($event)\" (onButtonClick)=\"textChanged($event)\">\r\n </ax-search-box>\r\n </div>\r\n <div class=\"ax list-container\">\r\n <div #listContainer class=\"list-container-items\" (scroll)=\"scrolled($event)\">\r\n <ng-container *ngIf=\"getItems().length>0; then thenTemplate; else elseTemplate\"></ng-container>\r\n <ng-template #thenTemplate>\r\n <div [class.ax-state-disabled]=\"isItemDisabled(item)\" class=\"list-item\"\r\n *ngFor=\"let item of getItems();let i = index\" [class.focused]=\"i==currentfocusedIndex\"\r\n [class.selected]=\"isItemSelected(item)\" (click)=\"handleItemClick($event,item)\">\r\n <div style=\"display: flex;\">\r\n <ax-check-box *ngIf=\"showCheckBox\" [size]=\"size\" [value]=\"isItemSelected(item)\"\r\n [disabled]=\"(!allowNull && selectedItems.length === 1 && isItemSelected(item)) || isItemDisabled(item)\"\r\n (onClick)=\"handleItemClick($event,item)\">\r\n </ax-check-box>\r\n <ng-container *ngIf=\"rowTemplate; else elseTemplate\">\r\n <div style=\"white-space: nowrap;text-overflow: ellipsis;overflow: hidden;\"\r\n [title]=\"item[textField]\"\r\n [ngStyle]=\"(showCheckBox) ? {'padding-inline-start': '0.5rem'}:''\">\r\n <ng-container *ngTemplateOutlet=\"rowTemplate; context:{ $implicit: item }\">\r\n </ng-container>\r\n </div>\r\n\r\n </ng-container>\r\n <ng-template #elseTemplate>\r\n <div style=\"white-space: nowrap;text-overflow: ellipsis;overflow: hidden;\"\r\n [title]=\"item[textField]\"\r\n [ngStyle]=\"(showCheckBox) ? {'padding-inline-start': '0.5rem'}:''\">\r\n {{ item[textField] }}\r\n </div>\r\n </ng-template>\r\n\r\n </div>\r\n\r\n </div>\r\n\r\n </ng-template>\r\n <div *ngIf=\"showLoading\" class=\"ax-pad-sm\" style=\"text-align: center;\">\r\n <i class=\"far fa-spinner-third fa-pulse fa-2x\" style=\"color: var(--ax-primary-color);\"></i>\r\n\r\n </div>\r\n <!-- <ax-loading-indicator ></ax-loading-indicator> -->\r\n <ng-template #elseTemplate>\r\n <ng-container *ngIf=\"showLoading == true; then searchTemplate else noDataTemplate\"></ng-container>\r\n <ng-template #searchTemplate>\r\n <div class=\"list-item\">\r\n {{'common.searching' | trans}}\r\n </div>\r\n </ng-template>\r\n <ng-template #noDataTemplate>\r\n <div class=\"list-item\">\r\n {{'common.noDataFound' | trans}}\r\n </div>\r\n </ng-template>\r\n\r\n </ng-template>\r\n\r\n </div>\r\n\r\n </div>\r\n </ng-container>\r\n\r\n</ax-drop-down>" }]
868
+ }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i0.ElementRef }, { type: i0.NgZone }]; }, propDecorators: { showDropDownButton: [{
869
+ type: Input
870
+ }], rowTemplate: [{
871
+ type: ContentChild,
872
+ args: [TemplateRef, { static: true }]
873
+ }], rowInputTemplate: [{
874
+ type: Input
875
+ }], span: [{
876
+ type: ViewChild,
877
+ args: [AXTextBoxComponent, { static: true }]
878
+ }], textbox: [{
879
+ type: ViewChild,
880
+ args: [AXTextBoxComponent, { static: true }]
881
+ }], listContainer: [{
882
+ type: ViewChild,
883
+ args: ['listContainer', { static: true }]
884
+ }], serchBox: [{
885
+ type: ViewChild,
886
+ args: ['serchBox', { static: false }]
887
+ }], textBoxSelectBox: [{
888
+ type: ViewChild,
889
+ args: ['textBoxSelectBox', { static: true }]
890
+ }], showCheckBox: [{
891
+ type: Input
892
+ }], readonly: [{
893
+ type: Input
894
+ }], rtl: [{
895
+ type: Input
896
+ }], disabled: [{
897
+ type: Input
898
+ }], placeholder: [{
899
+ type: Input
900
+ }], size: [{
901
+ type: Input
902
+ }], allowNull: [{
903
+ type: Input
904
+ }], textAlign: [{
905
+ type: Input
906
+ }], bufferSize: [{
907
+ type: Input
908
+ }], remoteOperation: [{
909
+ type: Input
910
+ }], dropdownToggle: [{
911
+ type: Output
912
+ }], _contentDataSource: [{
913
+ type: ContentChild,
914
+ args: [AXDataSourceComponent, { static: true }]
915
+ }], dataSource: [{
916
+ type: Input
917
+ }], _contentValidation: [{
918
+ type: ContentChild,
919
+ args: [AXValidation, { static: true }]
920
+ }], validation: [{
921
+ type: Input
922
+ }], dropdown: [{
923
+ type: ViewChild,
924
+ args: ['d', { static: true }]
925
+ }], disabledCallback: [{
926
+ type: Input
927
+ }], allowSearch: [{
928
+ type: Input
929
+ }], textField: [{
930
+ type: Input
931
+ }], valueField: [{
932
+ type: Input
933
+ }], disabledField: [{
934
+ type: Input
935
+ }], mode: [{
936
+ type: Input
937
+ }], itemsChange: [{
938
+ type: Output
939
+ }], onBlur: [{
940
+ type: Output
941
+ }], onFocus: [{
942
+ type: Output
943
+ }], items: [{
944
+ type: Input
945
+ }], selectionChanged: [{
946
+ type: Output
947
+ }], selectedItemsChange: [{
948
+ type: Output
949
+ }], selectedItems: [{
950
+ type: Input
951
+ }], selectedValuesChange: [{
952
+ type: Output
953
+ }], selectedValues: [{
954
+ type: Input
955
+ }] } });
956
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0Ym94LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Fjb3JleC9jb21wb25lbnRzL3NyYy9saWIvc2VsZWN0Ym94L3NlbGVjdGJveC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hY29yZXgvY29tcG9uZW50cy9zcmMvbGliL3NlbGVjdGJveC9zZWxlY3Rib3guY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxpQkFBaUIsRUFDakIsdUJBQXVCLEVBQ3ZCLEtBQUssRUFDTCxZQUFZLEVBQ1osTUFBTSxFQUNOLFNBQVMsRUFDVCxpQkFBaUIsRUFDakIsVUFBVSxFQUNWLFlBQVksRUFDWixNQUFNLEVBR04sV0FBVyxFQUNaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDbEMsT0FBTyxFQUFFLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3JFLE9BQU8sRUFBK0Qsc0JBQXNCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM1SCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUM1RSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFFbEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDeEMsT0FBTyxFQUFFLFlB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QVEsQ0FBQyxLQUFLLENBQUM7WUFDbkIsR0FBRyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUM7WUFDdkIsR0FBRyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7WUFDbkIsR0FBRyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUM7WUFDeEIsR0FBRyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7WUFDcEIsR0FBRyxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUM7WUFDM0IsR0FBRyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUM7WUFDckIsR0FBRyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUM7WUFDekIsR0FBRyxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUM7WUFDM0IsR0FBRyxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUM7WUFDMUIsR0FBRyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUM7WUFDckIsR0FBRyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7WUFDcEIsR0FBRyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7WUFDbkIsR0FBRyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUM7WUFDdEIsR0FBRyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUM7WUFDdEIsR0FBRyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUM7WUFDdEIsR0FBRyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUM7WUFDeEIsR0FBRyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUM7WUFDdkIsR0FBRyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUM7WUFDdEIsR0FBRyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUM7WUFDckIsR0FBRyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7WUFDbkIsR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7WUFDbEIsR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7WUFDbEIsR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7WUFDbEIsR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7WUFDbEIsR0FBRyxDQUFDLFFB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O2dCQUVHLE9BQU87c0JBQWhCLE1BQU07Z0JBSUksS0FBSztzQkFEZixLQUFLO2dCQXNCTixnQkFBZ0I7c0JBRGYsTUFBTTtnQkFJUCxtQkFBbUI7c0JBRGxCLE1BQU07Z0JBS0ksYUFBYTtzQkFEdkIsS0FBSztnQkFpTE4sb0JBQW9CO3NCQURuQixNQUFNO2dCQUlJLGNBQWM7c0JBRHhCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBWaWV3RW5jYXBzdWxhdGlvbixcclxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcclxuICBJbnB1dCxcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgT3V0cHV0LFxyXG4gIFZpZXdDaGlsZCxcclxuICBDaGFuZ2VEZXRlY3RvclJlZixcclxuICBFbGVtZW50UmVmLFxyXG4gIENvbnRlbnRDaGlsZCxcclxuICBOZ1pvbmUsXHJcbiAgUXVlcnlMaXN0LFxyXG4gIENvbnRlbnRDaGlsZHJlbixcclxuICBUZW1wbGF0ZVJlZlxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IEFYVGV4dEJveENvbXBvbmVudCB9IGZyb20gJy4uL3RleHRib3gvdGV4dGJveC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBBWERyb3Bkb3duQ29tcG9uZW50IH0gZnJvbSAnLi4vZHJvcGRvd24vZHJvcGRvd24uY29tcG9uZW50JztcclxuaW1wb3J0IHsgQVhCYXNlU2l6YWJsZUNvbXBvbmVudCwgQVhCYXNlSW5wdXRDb21wb25lbnQsIEFYRWxlbWVudFNpemUsIEFYVmFsaWRhdGFibGVDb21wb25lbnQgfSBmcm9tICcuLi9iYXNlL2VsZW1lbnQuY2xhc3MnO1xyXG5pbXBvcnQgeyBBWERhdGFTb3VyY2VDb21wb25lbnQgfSBmcm9tICcuLi9kYXRhLXNvdXJjZS9kYXRhc291cmNlLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEFYVmFsaWRhdGlvbiB9IGZyb20gJy4uL3ZhbGlkYXRpb24vdmFsaWRhdGlvbi5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBBWERhdGFTb3VyY2VSZWFkUGFyYW1zIH0gZnJvbSAnLi4vZGF0YS1zb3VyY2UvcmVhZC1wYXJhbSc7XHJcbmltcG9ydCB7IEFYQmFzZUV2ZW50IH0gZnJvbSAnLi4vYmFzZS9ldmVudHMuY2xhc3MnO1xyXG5pbXBvcnQgeyBBWFNlYXJjaEJveENvbXBvbmVudCB9IGZyb20gJy4uL3NlYXJjaGJveC9zZWFyY2hib3guY29tcG9uZW50JztcclxuaW1wb3J0IHsgQVhDb25maWcgfSBmcm9tICdAYWNvcmV4L2NvcmUnO1xyXG5pbXBvcnQgeyBkaWZmZXJlbmNlQnkgfSBmcm9tICdsb2Rhc2gnO1xyXG5leHBvcnQgY2xhc3MgQVhTZWxlY3RCb3hTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXh0ZW5kcyBBWEJhc2VFdmVudCB7XHJcbiAgY29uc3RydWN0b3IoY29tcG9uZW50OiBhbnksIHB1YmxpYyBzZWxlY3RlZEl0ZW1zOiBhbnlbXSwgcHVibGljIHNlbGVjdGVkVmFsdWVzOiBhbnlbXSB8IGFueSkge1xyXG4gICAgc3VwZXIoKTtcclxuICAgIHRoaXMuY29tcG9uZW50ID0gY29tcG9uZW50O1xyXG4gIH1cclxufVxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdheC1zZWxlY3QtYm94JyxcclxuICB0ZW1wbGF0ZVVybDogJy4vc2VsZWN0Ym94LmNvbXBvbmVudC5odG1sJyxcclxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxyXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxyXG4gIGhvc3Q6IHsgc3R5bGU6ICd3aWR0aDogMTAwJScgfSxcclxuICBwcm92aWRlcnM6IFt7IHByb3ZpZGU6IEFYVmFsaWRhdGFibGVDb21wb25lbnQsIHVzZUV4aXN0aW5nOiBBWFNlbGVjdEJveENvbXBvbmVudCB9XVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQVhTZWxlY3RCb3hDb21wb25lbnQgZXh0ZW5kcyBBWFZhbGlkYXRhYmxlQ29tcG9uZW50IGltcGxlbWVudHMgQVhCYXNlU2l6YWJsZUNvbXBvbmVudCwgQVhCYXNlSW5wdXRDb21wb25lbnQge1xyXG4gIEBJbnB1dCgpIHNob3dEcm9wRG93bkJ1dHRvbjogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIEBDb250ZW50Q2hpbGQoVGVtcGxhdGVSZWYsIHsgc3RhdGljOiB0cnVlIH0pXHJcbiAgcm93VGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgcm93SW5wdXRUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcclxuICBAVmlld0NoaWxkKEFYVGV4dEJveENvbXBvbmVudCwgeyBzdGF0aWM6IHRydWUgfSlcclxuICBzcGFuOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcclxuXHJcbiAgQFZpZXdDaGlsZChBWFRleHRCb3hDb21wb25lbnQsIHsgc3RhdGljOiB0cnVlIH0pXHJcbiAgdGV4dGJveDogQVhUZXh0Qm94Q29tcG9uZW50O1xyXG5cclxuICBAVmlld0NoaWxkKCdsaXN0Q29udGFpbmVyJywgeyBzdGF0aWM6IHRydWUgfSlcclxuICBsaXN0Q29udGFpbmVyOiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PjtcclxuXHJcbiAgQFZpZXdDaGlsZCgnc2VyY2hCb3gnLCB7IHN0YXRpYzogZmFsc2UgfSlcclxuICBzZXJjaEJveDogQVhTZWFyY2hCb3hDb21wb25lbnQ7XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ3RleHRCb3hTZWxlY3RCb3gnLCB7IHN0YXRpYzogdHJ1ZSB9KVxyXG4gIHRleHRCb3hTZWxlY3RCb3g6IEFYVGV4dEJveENvbXBvbmVudDtcclxuXHJcbiAgQElucHV0KCkgc2hvd0NoZWNrQm94OiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgQElucHV0KCkgcmVhZG9ubHk6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgQElucHV0KCkgcnRsOiBib29sZWFuID0gQVhDb25maWcuZ2V0KCdsYXlvdXQucnRsJyk7XHJcblxyXG4gIEBJbnB1dCgpIGRpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyOiBzdHJpbmc7XHJcblxyXG4gIEBJbnB1dCgpIHNpemU6IEFYRWxlbWVudFNpemUgPSAnbWQnO1xyXG5cclxuICBASW5wdXQoKSBhbGxvd051bGw6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICBASW5wdXQoKSB0ZXh0QWxpZ246ICdyaWdodCcgfCAnbGVmdCcgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgQElucHV0KCkgYnVmZmVyU2l6ZTogbnVtYmVyID0gMjA7XHJcblxyXG4gIEBJbnB1dCgpIHJlbW90ZU9wZXJhdGlvbjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBAT3V0cHV0KClcclxuICBkcm9wZG93blRvZ2dsZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICAvLyB0aGlzIGlucHV0IGlzIFByaXZhdGUgYW5kIG9ubHkgdXNlIGluIExPVlxyXG5cclxuICBjdXJyZW50Zm9jdXNlZEluZGV4OiBudW1iZXIgPSAtMTtcclxuICBzaG93TG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBza2lwOiBudW1iZXIgPSAtMTtcclxuICBzZWFyY2hUZXh0OiBzdHJpbmcgPSAnJztcclxuICAvLyBASW5wdXQoKVxyXG4gIC8vIGNoaXBzV2lkdGg6IHN0cmluZyA9ICcnO1xyXG5cclxuICB0ZXh0OiBzdHJpbmcgPSAnJztcclxuICB0b3RhbENvdW50OiBudW1iZXIgPSAwO1xyXG5cclxuICBAQ29udGVudENoaWxkKEFYRGF0YVNvdXJjZUNvbXBvbmVudCwgeyBzdGF0aWM6IHRydWUgfSlcclxuICBwcml2YXRlIF9jb250ZW50RGF0YVNvdXJjZTogQVhEYXRhU291cmNlQ29tcG9uZW50O1xyXG5cclxuICBwcml2YXRlIF9kYXRhU291cmNlOiBBWERhdGFTb3VyY2VDb21wb25lbnQ7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGdldCBkYXRhU291cmNlKCk6IEFYRGF0YVNvdXJjZUNvbXBvbmVudCB7XHJcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZSA/IHRoaXMuX2RhdGFTb3VyY2UgOiB0aGlzLl9jb250ZW50RGF0YVNvdXJjZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgZGF0YVNvdXJjZSh2OiBBWERhdGFTb3VyY2VDb21wb25lbnQpIHtcclxuICAgIHRoaXMuX2RhdGFTb3VyY2UgPSB2O1xyXG4gIH1cclxuXHJcbiAgQENvbnRlbnRDaGlsZChBWFZhbGlkYXRpb24sIHsgc3RhdGljOiB0cnVlIH0pXHJcbiAgcHJpdmF0ZSBfY29udGVudFZhbGlkYXRpb246IEFYVmFsaWRhdGlvbjtcclxuXHJcbiAgcHJpdmF0ZSBfdmFsaWRhdGlvbjogQVhWYWxpZGF0aW9uO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBnZXQgdmFsaWRhdGlvbigpOiBBWFZhbGlkYXRpb24ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3ZhbGlkYXRpb24gPyB0aGlzLl92YWxpZGF0aW9uIDogdGhpcy5fY29udGVudFZhbGlkYXRpb247XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IHZhbGlkYXRpb24odjogQVhWYWxpZGF0aW9uKSB7XHJcbiAgICB0aGlzLl92YWxpZGF0aW9uID0gdjtcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZiwgcHJpdmF0ZSByZWY6IEVsZW1lbnRSZWYsIHByaXZhdGUgem9uZTogTmdab25lKSB7XHJcbiAgICBzdXBlcigpO1xyXG4gIH1cclxuXHJcbiAgQFZpZXdDaGlsZCgnZCcsIHsgc3RhdGljOiB0cnVlIH0pXHJcbiAgZHJvcGRvd246IEFYRHJvcGRvd25Db21wb25lbnQ7XHJcblxyXG4gIEBJbnB1dCgpIGRpc2FibGVkQ2FsbGJhY2s6IChlOiB7IGl0ZW06IGFueTsgaW5kZXg6IG51bWJlciB9KSA9PiBib29sZWFuO1xyXG5cclxuICBASW5wdXQoKSBhbGxvd1NlYXJjaDogYm9vbGVhbiA9IHRydWU7XHJcbiAgQElucHV0KCkgdGV4dEZpZWxkOiBzdHJpbmcgPSAndGV4dCc7XHJcbiAgQElucHV0KCkgdmFsdWVGaWVsZDogc3RyaW5nID0gJ3ZhbHVlJztcclxuICBASW5wdXQoKSBkaXNhYmxlZEZpZWxkOiBzdHJpbmcgPSAnZGlzYWJsZWQnO1xyXG4gIEBJbnB1dCgpIG1vZGU6ICdzaW5nbGUnIHwgJ211bHRpcGxlJyA9ICdzaW5nbGUnO1xyXG4gIGl0ZW1SZW1vdmU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBAT3V0cHV0KCkgaXRlbXNDaGFuZ2U6IEV2ZW50RW1pdHRlcjxhbnlbXT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueVtdPigpO1xyXG5cclxuICBAT3V0cHV0KCkgb25CbHVyOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICBAT3V0cHV0KCkgb25Gb2N1czogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgcHJpdmF0ZSBfaXRlbXM6IGFueVtdID0gW107XHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgZ2V0IGl0ZW1zKCk6IGFueVtdIHtcclxuICAgIHJldHVybiB0aGlzLl9pdGVtcztcclxuICB9XHJcbiAgcHVibGljIHNldCBpdGVtcyh2OiBhbnlbXSkge1xyXG4gICAgdGhpcy5faXRlbXMgPSB2O1xyXG4gICAgaWYgKHRoaXMuaXRlbXNDaGFuZ2UpIHtcclxuICAgICAgdGhpcy5pdGVtc0NoYW5nZS5lbWl0KHYpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuaXRlbXNTdGF0dXNPYnNlcnZlcikge1xyXG4gICAgICB0aGlzLml0ZW1zU3RhdHVzT2JzZXJ2ZXIubmV4dCh0aGlzLml0ZW1zLmxlbmd0aCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBoYXNTZWxlY3RlZFZhbHVlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgaXRlbXNGaWx0ZXJlZDogYW55W10gPSBbXTtcclxuXHJcbiAgLy8gI2VuZHJlZ2lvblxyXG5cclxuICBkcm9wRG93bkRpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIEBPdXRwdXQoKVxyXG4gIHNlbGVjdGlvbkNoYW5nZWQ6IEV2ZW50RW1pdHRlcjxBWFNlbGVjdEJveFNlbGVjdGlvbkNoYW5nZWRFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPEFYU2VsZWN0Qm94U2VsZWN0aW9uQ2hhbmdlZEV2ZW50PigpO1xyXG5cclxuICBAT3V0cHV0KClcclxuICBzZWxlY3RlZEl0ZW1zQ2hhbmdlOiBFdmVudEVtaXR0ZXI8YW55W10+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnlbXT4oKTtcclxuXHJcbiAgcHJpdmF0ZSBfc2VsZWN0ZWRJdGVtczogYW55W10gPSBbXTtcclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBnZXQgc2VsZWN0ZWRJdGVtcygpOiBhbnlbXSB7XHJcbiAgICByZXR1cm4gdGhpcy5fc2VsZWN0ZWRJdGVtcyB8fCBbXTtcclxuICB9XHJcbiAgcHVibGljIHNldCBzZWxlY3RlZEl0ZW1zKHY6IGFueVtdKSB7XHJcbiAgICB0aGlzLnNldFNlbGVjdGVkSXRlbXNDaGFuZ2Uodik7XHJcbiAgICAvLyBpZiAoIXYpIHtcclxuICAgIC8vICAgdiA9IFtdO1xyXG4gICAgLy8gfVxyXG5cclxuICAgIC8vIGNvbnN0IG9sZCA9IHRoaXMuc2VsZWN0ZWRJdGVtcztcclxuICAgIC8vIGlmIChKU09OLnN0cmluZ2lmeShvbGQpICE9PSBKU09OLnN0cmluZ2lmeSh2KSkge1xyXG4gICAgLy8gICB0aGlzLl9zZWxlY3RlZEl0ZW1zID0gdGhpcy5tb2RlID09ICdzaW5nbGUnID8gdi5zbGljZSgwLCAxKSA6IFsuLi5uZXcgU2V0KHYpXTsgLy9bLi4ubmV3IFNldCh2WzBdKV0gOiBbLi4ubmV3IFNldCh2KV07XHJcbiAgICAvLyAgIHRoaXMuX3NlbGVjdGVkSXRlbXMuZm9yRWFjaCgoYykgPT4gKGMuc2VsZWN0ZWQgPSB0cnVlKSk7XHJcbiAgICAvLyAgIHRoaXMuc2VsZWN0ZWRJdGVtc0NoYW5nZS5lbWl0KHRoaXMuX3NlbGVjdGVkSXRlbXMpO1xyXG4gICAgLy8gICB0aGlzLnNlbGVjdGVkVmFsdWVzQ2hhbmdlLmVtaXQodGhpcy5zZWxlY3RlZFZhbHVlcyk7XHJcbiAgICAvLyAgIHRoaXMuY2xlYXJWYWxpZGF0aW9uU3R5bGUodGhpcy5yZWYubmF0aXZlRWxlbWVudCk7XHJcbiAgICAvLyAgIHRoaXMud2FpdEZvckRhdGEoKCkgPT4ge1xyXG4gICAgLy8gICAgIGlmICh0aGlzLl9zZWxlY3RlZEl0ZW1zKSB7XHJcbiAgICAvLyAgICAgICB0aGlzLml0ZW1zLmZvckVhY2goKGMpID0+IChjLnNlbGVjdGVkID0gdGhpcy5fc2VsZWN0ZWRJdGVtcy5zb21lKChpKSA9PiBpW3RoaXMudmFsdWVGaWVsZF0gPT0gY1t0aGlzLnZhbHVlRmllbGRdKSkpO1xyXG4gICAgLy8gICAgIH1cclxuICAgIC8vICAgfSk7XHJcbiAgICAvLyB9XHJcbiAgfVxyXG5cclxuICBzZXRTZWxlY3RlZEl0ZW1zQ2hhbmdlKHY6IGFueVtdLCBvbGQ6IGFueVtdID0gdGhpcy5zZWxlY3RlZEl0ZW1zKSB7XHJcbiAgICBpZiAoIXYpIHtcclxuICAgICAgdiA9IFtdO1xyXG4gICAgfVxyXG4gICAgLy8gY29uc3Qgb2xkID0gdGhpcy5zZWxlY3RlZEl0ZW1zO1xyXG4gICAgdmFyIGYgPSBkaWZmZXJlbmNlQnkob2xkLCB2LCB0aGlzLnZhbHVlRmllbGQpO1xyXG4gICAgdmFyIHMgPSBkaWZmZXJlbmNlQnkodiwgb2xkLCB0aGlzLnZhbHVlRmllbGQpO1xyXG4gICAgLy8gaWYgKEpTT04uc3RyaW5naWZ5KG9sZCkgIT09IEpTT04uc3RyaW5naWZ5KHYpKSB7XHJcbiAgICBpZiAoZi5sZW5ndGggIT0gMCB8fCBzLmxlbmd0aCAhPSAwKSB7XHJcbiAgICAgIHRoaXMuX3NlbGVjdGVkSXRlbXMgPSB0aGlzLm1vZGUgPT0gJ3NpbmdsZScgPyB2LnNsaWNlKDAsIDEpIDogWy4uLm5ldyBTZXQodildOyAvL1suLi5uZXcgU2V0KHZbMF0pXSA6IFsuLi5uZXcgU2V0KHYpXTtcclxuICAgICAgdGhpcy5fc2VsZWN0ZWRJdGVtcy5mb3JFYWNoKChjKSA9PiAoYy5zZWxlY3RlZCA9IHRydWUpKTtcclxuICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zQ2hhbmdlLmVtaXQodGhpcy5fc2VsZWN0ZWRJdGVtcyk7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRWYWx1ZXNDaGFuZ2UuZW1pdCh0aGlzLnNlbGVjdGVkVmFsdWVzKTtcclxuICAgICAgdGhpcy5jbGVhclZhbGlkYXRpb25TdHlsZSh0aGlzLnJlZi5uYXRpdmVFbGVtZW50KTtcclxuICAgICAgdGhpcy53YWl0Rm9yRGF0YSgoKSA9PiB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3NlbGVjdGVkSXRlbXMpIHtcclxuICAgICAgICAgIHRoaXMuaXRlbXMuZm9yRWFjaCgoYykgPT4gKGMuc2VsZWN0ZWQgPSB0aGlzLl9zZWxlY3RlZEl0ZW1zLnNvbWUoKGkpID0+IGlbdGhpcy52YWx1ZUZpZWxkXSA9PSBjW3RoaXMudmFsdWVGaWVsZF0pKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgaWYgKHRoaXMucm93VGVtcGxhdGUgPT09IHVuZGVmaW5lZCAmJiB0aGlzLnJvd0lucHV0VGVtcGxhdGUgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRoaXMucm93VGVtcGxhdGUgPSB0aGlzLnJvd0lucHV0VGVtcGxhdGU7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5ydGwgPT0gbnVsbCkge1xyXG4gICAgICB0aGlzLnJ0bCA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMucmVmLm5hdGl2ZUVsZW1lbnQsIG51bGwpLmdldFByb3BlcnR5VmFsdWUoJ2RpcmVjdGlvbicpID09PSAncnRsJztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNjcm9sbGVkKGUpIHtcclxuICAgIGlmIChcclxuICAgICAgdGhpcy5yZW1vdGVPcGVyYXRpb24gJiZcclxuICAgICAgdGhpcy50b3RhbENvdW50ID4gdGhpcy5pdGVtcy5sZW5ndGggJiZcclxuICAgICAgdGhpcy5saXN0Q29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsSGVpZ2h0ICE9IDAgJiZcclxuICAgICAgdGhpcy5saXN0Q29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsSGVpZ2h0IC0gdGhpcy5saXN0Q29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wIC0gMzAwIDwgNTBcclxuICAgICkge1xyXG4gICAgICBpZiAodGhpcy5za2lwICE9PSB0aGlzLml0ZW1zLmxlbmd0aCkge1xyXG4gICAgICAgIHRoaXMuc2hvd0xvYWRpbmcgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuc2tpcCA9IHRoaXMuaXRlbXMubGVuZ3RoO1xyXG4gICAgICAgIGNvbnN0IHBhcmFtczogQVhEYXRhU291cmNlUmVhZFBhcmFtcyA9IHt9O1xyXG4gICAgICAgIHBhcmFtcy5za2lwID0gdGhpcy5pdGVtcy5sZW5ndGg7XHJcbiAgICAgICAgcGFyYW1zLnRha2UgPSB0aGlzLmJ1ZmZlclNpemU7IC8vKiAoTWF0aC5mbG9vcih0aGlzLml0ZW1zLmxlbmd0aCAvIHRoaXMuYnVmZmVyU2l6ZSkgKyAxKTtcclxuICAgICAgICBpZiAodGhpcy50ZXh0Ym94KSB7XHJcbiAgICAgICAgICBwYXJhbXMuc2VhcmNoVGV4dCA9IHRoaXMudGV4dDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcGFyYW1zLnNlYXJjaFRleHQgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmZldGNoKHBhcmFtcyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbiAgcHJpdmF0ZSBzZXRTZWxlY3RlZEl0ZW1zKHY6IGFueVtdLCBpc1VzZXJJbnB1dDogYm9vbGVhbikge1xyXG4gICAgbGV0IGNoYW5nZWQgPSBmYWxzZTtcclxuICAgIGlmIChpc1VzZXJJbnB1dCkge1xyXG4gICAgICBjaGFuZ2VkID0gSlNPTi5zdHJpbmdpZnkodikgIT09IEpTT04uc3RyaW5naWZ5KHRoaXMuc2VsZWN0ZWRJdGVtcyk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnNlbGVjdGVkSXRlbXMgPSB2O1xyXG4gICAgdGhpcy5zZXRTZWxlY3RlZEluZGV4KCk7XHJcbiAgICBpZiAoaXNVc2VySW5wdXQgJiYgY2hhbmdlZCkge1xyXG4gICAgICB0aGlzLmVtaXRTZWxlY3Rpb25DaGFuZ2VkRXZlbnQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2VhcmNoQ2hhbmdlT2JzZXJ2ZXI6IGFueTtcclxuXHJcbiAgZGVsYXk6IG51bWJlciA9IDUwMDtcclxuXHJcbiAgdGV4dENoYW5nZWQoZSkge1xyXG4gICAgaWYgKChlLnZhbHVlID09PSBudWxsIHx8IGUudmFsdWUgPT09IHVuZGVmaW5lZCB8fCBlLnZhbHVlID09PSAnJykgJiYgKGUub2xkVmFsdWUgPT09IG51bGwgfHwgZS5vbGRWYWx1ZSA9PT0gdW5kZWZpbmVkIHx8IGUub2xkVmFsdWUgPT09ICcnKSkge1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5jdXJyZW50Zm9jdXNlZEluZGV4ID0gLTE7XHJcbiAgICAgIGlmICh0aGlzLnJlbW90ZU9wZXJhdGlvbikge1xyXG4gICAgICAgIHRoaXMuc2VhcmNoVGV4dCA9IHRoaXMudGV4dDtcclxuICAgICAgICAvLyAgdGhpcy5zZWFyY2hUZXh0ID0gZS52YWx1ZTtcclxuICAgICAgICAvLyB0aGlzLnRleHQgPSBlLnZhbHVlO1xyXG4gICAgICAgIC8vIHRoaXMuaXRlbXMgPSBbXTtcclxuICAgICAgICBpZiAodGhpcy5pdGVtcykge1xyXG4gICAgICAgICAgbGV0IHQgPSB0aGlzLml0ZW1zLmxlbmd0aDtcclxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaXRlbXMucG9wKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyB0aGlzLml0ZW1zLmZvckVhY2goKGVsZW1lbnQpID0+IHtcclxuICAgICAgICAvLyAgIHRoaXMuaXRlbXMucG9wKCk7XHJcbiAgICAgICAgLy8gfSk7XHJcbiAgICAgICAgY29uc3QgcGFyYW1zOiBBWERhdGFTb3VyY2VSZWFkUGFyYW1zID0ge307XHJcbiAgICAgICAgcGFyYW1zLnNlYXJjaFRleHQgPSB0aGlzLnRleHQ7XHJcbiAgICAgICAgLy8gcGFyYW1zLnNlYXJjaFRleHQgPSBlLnZhbHVlO1xyXG4gICAgICAgIHBhcmFtcy5za2lwID0gMDtcclxuICAgICAgICBwYXJhbXMudGFrZSA9IHRoaXMuYnVmZmVyU2l6ZTtcclxuICAgICAgICB0aGlzLmZldGNoKHBhcmFtcyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGlzSXRlbURpc2FibGVkKGl0ZW06IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKGl0ZW1bdGhpcy5kaXNhYmxlZEZpZWxkXSA9PSB0cnVlKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLmRpc2FibGVkQ2FsbGJhY2spIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZGlzYWJsZWRDYWxsYmFjayh7IGl0ZW0sIGluZGV4OiAtMSB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uQnV0dG9uQ2xpY2soZSkge1xyXG4gICAgY29uc29sZS5sb2coJ29uQnV0dG9uQ2xpY2snLCBlKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0U2VsZWN0ZWRJbmRleChzaWduOiAtMSB8IDEgfCBudWxsID0gbnVsbCk6IHZvaWQge1xyXG4gICAgaWYgKHNpZ24gPT0gbnVsbCkge1xyXG4gICAgICBpZiAoIXRoaXMucmVtb3RlT3BlcmF0aW9uICYmIHRoaXMudGV4dCAmJiB0aGlzLnRleHQgIT09ICcnKSB7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50Zm9jdXNlZEluZGV4ID0gdGhpcy5pdGVtc1xyXG4gICAgICAgICAgLmZpbHRlcigoYykgPT4gKGNbdGhpcy50ZXh0RmllbGRdIGFzIHN0cmluZykudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh0aGlzLnRleHQudG9Mb3dlckNhc2UoKSkpXHJcbiAgICAgICAgICAuaW5kZXhPZih0aGlzLnNlbGVjdGVkSXRlbXNbdGhpcy5zZWxlY3RlZEl0ZW1zLmxlbmd0aCAtIDFdKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmN1cnJlbnRmb2N1c2VkSW5kZXggPSB0aGlzLml0ZW1zLmluZGV4T2YodGhpcy5zZWxlY3RlZEl0ZW1zW3RoaXMuc2VsZWN0ZWRJdGVtcy5sZW5ndGggLSAxXSk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHNpZ24gPT09IC0xID8gdGhpcy5jdXJyZW50Zm9jdXNlZEluZGV4LS0gOiB0aGlzLmN1cnJlbnRmb2N1c2VkSW5kZXgrKztcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5yZW1vdGVPcGVyYXRpb24pIHtcclxuICAgICAgdGhpcy5pdGVtc0ZpbHRlcmVkID0gdGhpcy5pdGVtcztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuaXRlbXNGaWx0ZXJlZCA9IHRoaXMudGV4dFxyXG4gICAgICAgID8gdGhpcy5pdGVtcy5maWx0ZXIoKGMpID0+IChjW3RoaXMudGV4dEZpZWxkXSBhcyBzdHJpbmcpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModGhpcy50ZXh0LnRvTG93ZXJDYXNlKCkpKVxyXG4gICAgICAgIDogdGhpcy5pdGVtcztcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmN1cnJlbnRmb2N1c2VkSW5kZXggPVxyXG4gICAgICB0aGlzLmN1cnJlbnRmb2N1c2VkSW5kZXggPCAwXHJcbiAgICAgICAgPyAwXHJcbiAgICAgICAgOiB0aGlzLmN1cnJlbnRmb2N1c2VkSW5kZXggPj0gdGhpcy5pdGVtc0ZpbHRlcmVkLmxlbmd0aFxyXG4gICAgICAgID8gdGhpcy5pdGVtc0ZpbHRlcmVkLmxlbmd0aCAtIDFcclxuICAgICAgICA6IHRoaXMuY3VycmVudGZvY3VzZWRJbmRleDtcclxuICAgIC8vXHJcbiAgICAvLyBzZXQgc2Nyb2xsXHJcbiAgICBpZiAodGhpcy5saXN0Q29udGFpbmVyKSB7XHJcbiAgICAgIHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgaXRlbURpdiA9IHRoaXMubGlzdENvbnRhaW5lci5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoYC5saXN0LWl0ZW06bnRoLWNoaWxkKCR7dGhpcy5jdXJyZW50Zm9jdXNlZEluZGV4fSlgKTtcclxuICAgICAgICBpZiAoaXRlbURpdikge1xyXG4gICAgICAgICAgaXRlbURpdi5zY3JvbGxJbnRvVmlldyh7IGJlaGF2aW9yOiAnc21vb3RoJyB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgQE91dHB1dCgpXHJcbiAgc2VsZWN0ZWRWYWx1ZXNDaGFuZ2U6IEV2ZW50RW1pdHRlcjxhbnlbXSB8IGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueVtdIHwgYW55PigpO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBnZXQgc2VsZWN0ZWRWYWx1ZXMoKTogYW55W10gfCBhbnkge1xyXG4gICAgaWYgKHRoaXMubW9kZSA9PT0gJ3NpbmdsZScpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuX3NlbGVjdGVkSXRlbXMubWFwKChjKSA9PiBjW3RoaXMudmFsdWVGaWVsZF0pWzBdO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHRoaXMuX3NlbGVjdGVkSXRlbXMubWFwKChjKSA9PiBjW3RoaXMudmFsdWVGaWVsZF0pIHx8IFtdO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldCBzZWxlY3RlZFZhbHVlcyh2OiBhbnlbXSB8IGFueSkge1xyXG4gICAgaWYgKHRoaXMuY29tcGFyZVNlbGVjdGVkVmFsdWVzKHYpKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmICh2ID09IG51bGwpIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zID0gW107XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAodiAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgaWYgKHYgIT0gW10gJiYgdiAhPSAnJyAmJiB2ICE9IG51bGwpIHtcclxuICAgICAgICAgIHRoaXMuaGFzU2VsZWN0ZWRWYWx1ZSA9IHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLndhaXRGb3JEYXRhKCgpID0+IHtcclxuICAgICAgICAgIGlmICh0aGlzLm1vZGUgPT09ICdzaW5nbGUnKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLml0ZW1zLmZpbHRlcigoYykgPT4gdiA9PSBjW3RoaXMudmFsdWVGaWVsZF0pKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zID0gdGhpcy5pdGVtcy5maWx0ZXIoKGMpID0+IHYgPT0gY1t0aGlzLnZhbHVlRmllbGRdKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbXMgPSBbXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodikpIHtcclxuICAgICAgICAgICAgICBpZiAodGhpcy5zZWxlY3RlZEl0ZW1zLmxlbmd0aCA+IHYubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbXMgPSB0aGlzLnNlbGVjdGVkSXRlbXMuZmlsdGVyKChjKSA9PiB2LmluY2x1ZGVzKGNbdGhpcy52YWx1ZUZpZWxkXSkpO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgYWRkSWQgPSBbXTtcclxuICAgICAgICAgICAgICAgIHYuZm9yRWFjaCgodklkKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIGFkZElkLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICAgIFt0aGlzLnZhbHVlRmllbGRdOiB2SWRcclxuICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICBsZXQgbmV3SWQgPSBkaWZmZXJlbmNlQnkoYWRkSWQsIHRoaXMuc2VsZWN0ZWRJdGVtcywgdGhpcy52YWx1ZUZpZWxkKTtcclxuICAgICAgICAgICAgICAgIGxldCB2diA9IFtdO1xyXG4gICAgICAgICAgICAgICAgbmV3SWQuZm9yRWFjaCgocmMpID0+IHtcclxuICAgICAgICAgICAgICAgICAgdnYucHVzaChyY1t0aGlzLnZhbHVlRmllbGRdKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pdGVtc1xyXG4gICAgICAgICAgICAgICAgICAuZmlsdGVyKChjKSA9PiB2di5pbmNsdWRlcyhjW3RoaXMudmFsdWVGaWVsZF0pKVxyXG4gICAgICAgICAgICAgICAgICAuZm9yRWFjaCgocmVzKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zLnB1c2gocmVzKTtcclxuICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAvLyAgdGhpcy5zZWxlY3RlZEl0ZW1zLnB1c2godGhpcy5pdGVtcy5maWx0ZXIoKGMpID0+IHZ2LmluY2x1ZGVzKGNbdGhpcy52YWx1ZUZpZWxkXSkpKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0U2VsZWN0ZWRJdGVtc0NoYW5nZSh0aGlzLnNlbGVjdGVkSXRlbXMsIHZ2Lmxlbmd0aCA+IDAgPyBbMV0gOiB0aGlzLnNlbGVjdGVkSXRlbXMpO1xyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgLy8gIHRoaXMuc2VsZWN0ZWRJdGVtcyA9IHRoaXMuaXRlbXMuZmlsdGVyKChjKSA9PiB2LmluY2x1ZGVzKGNbdGhpcy52YWx1ZUZpZWxkXSkpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHYpIHtcclxuICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbXMgPSB0aGlzLml0ZW1zLmZpbHRlcigoYykgPT4gdiA9PT0gY1t0aGlzLnZhbHVlRmllbGRdKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbXMgPSBbXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZFZhbHVlc0NoYW5nZS5lbWl0KHRoaXMuc2VsZWN0ZWRWYWx1ZXMpO1xyXG4gICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgY29tcGFyZVNlbGVjdGVkVmFsdWVzKG5ld1ZhbHVlOiBhbnlbXSB8IGFueSkge1xyXG4gICAgY29uc3QgY3VycmVudFZhbHVlID0gdGhpcy5zZWxlY3RlZFZhbHVlcztcclxuICAgIHJldHVybiAoY3VycmVudFZhbHVlID09IG51bGwgJiYgbmV3VmFsdWUgPT0gbnVsbCkgfHwgSlNPTi5zdHJpbmdpZnkoY3VycmVudFZhbHVlKSA9PT0gSlNPTi5zdHJpbmdpZnkobmV3VmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRTZWxlY3RlZFZhbHVlcyh2OiBhbnlbXSB8IGFueSwgaXNVc2VySW5wdXQ6IGJvb2xlYW4pIHtcclxuICAgIGNvbnN0IGNoYW5nZWQgPSBpc1VzZXJJbnB1dCA/ICF0aGlzLmNvbXBhcmVTZWxlY3RlZFZhbHVlcyh2KSA6IGZhbHNlO1xyXG4gICAgdGhpcy5zZWxlY3RlZFZhbHVlcyA9IHY7XHJcbiAgICBpZiAoaXNVc2VySW5wdXQgJiYgY2hhbmdlZCkge1xyXG4gICAgICB0aGlzLmVtaXRTZWxlY3Rpb25DaGFuZ2VkRXZlbnQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZW1pdFNlbGVjdGlvbkNoYW5nZWRFdmVudCgpIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRWYWx1ZXNDaGFuZ2UuZW1pdCh0aGlzLnNlbGVjdGVkVmFsdWVzKTtcclxuICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlZC5lbWl0KG5ldyBBWFNlbGVjdEJveFNlbGVjdGlvbkNoYW5nZWRFdmVudCh0aGlzLCB0aGlzLnNlbGVjdGVkSXRlbXMsIHRoaXMuc2VsZWN0ZWRWYWx1ZXMpKTtcclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmJ1ZmZlclNpemUgPCAxMCkge1xyXG4gICAgICB0aGlzLmJ1ZmZlclNpemUgPSAxMDtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLm1vZGUgPT0gJ3NpbmdsZScpIHtcclxuICAgICAgdGhpcy5zaG93Q2hlY2tCb3ggPSBmYWxzZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuc2hvd0NoZWNrQm94ID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIGlmICghdGhpcy5yZW1vdGVPcGVyYXRpb24gfHwgKHRoaXMucmVtb3RlT3BlcmF0aW9uICYmIHRoaXMuaGFzU2VsZWN0ZWRWYWx1ZSkpIHtcclxuICAgICAgdGhpcy5yZWZyZXNoKCk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGRyb3Bkb3duVG9nZ2xlU2VsZWNCb3goZSkge1xyXG4gICAgdGhpcy50ZXh0ID0gJyc7XHJcbiAgICBpZiAodGhpcy5kcm9wZG93bi5pc09wZW4pIHtcclxuICAgICAgdGhpcy5yZWZyZXNoKCk7XHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLnNlcmNoQm94KSB7XHJcbiAgICAgICAgICB0aGlzLnNlcmNoQm94LmZvY3VzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LCAxKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vICB0aGlzLnJlZnJlc2goKTtcclxuICAgIH1cclxuICAgIHRoaXMuZHJvcGRvd25Ub2dnbGUuZW1pdChlKTtcclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHtcclxuICAgIC8vIGlmICghdGhpcy5hbGxvd1NlYXJjaCkge1xyXG4gICAgLy8gICAgIGlmICh0aGlzLnJlYWRvbmx5ID09IGZhbHNlKSB7XHJcbiAgICAvLyAgICAgICAgIHRoaXMuaXRlbVJlbW92ZSA9IHRydWU7XHJcbiAgICAvLyAgICAgICAgIHRoaXMucmVhZG9ubHkgPSB0cnVlO1xyXG4gICAgLy8gICAgIH1cclxuICAgIC8vIH1cclxuICAgIHRoaXMuaW5pdFZhbGlkYXRpb24odGhpcy5yZWYsICdzZWxlY3RlZEl0ZW1zJywgdGhpcy52YWxpZGF0aW9uKTtcclxuICAgIGlmICh0aGlzLmRhdGFTb3VyY2UpIHtcclxuICAgICAgLy8gaWYgKHRoaXMuYWxsb3dTZWFyY2ggPT0gZmFsc2UpIHtcclxuICAgICAgLy8gICB0aGlzLmZldGNoKCk7XHJcbiAgICAgIC8vIH1cclxuICAgICAgdGhpcy5kYXRhU291cmNlLm9uRGF0YVJlY2VpdmVkLnN1YnNjcmliZSgoYykgPT4ge1xyXG4gICAgICAgIHRoaXMuc2hvd0xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmRhdGFSZWNlaXZlZChjLmRhdGEucmVzdWx0KTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZGF0YVJlY2VpdmVkKGRhdGE6IGFueSkge1xyXG4gICAgaWYgKHRoaXMucmVtb3RlT3BlcmF0aW9uKSB7XHJcbiAgICAgIGlmICh0aGlzLnNlYXJjaFRleHQgJiYgdGhpcy5zZWFyY2hUZXh0ICE9IG51bGwgJiYgdGhpcy5zZWFyY2hUZXh0ICE9PSAnJykge1xyXG4gICAgICAgIGlmIChkYXRhLnRvdGFsQ291bnQpIHtcclxuICAgICAgICAgIGlmICh0aGlzLml0ZW1zLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgIC8vdGhpcy5pdGVtcyA9IGRhdGEuaXRlbXM7XHJcbiAgICAgICAgICAgIGRhdGEuaXRlbXMuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMuaXRlbXMucHVzaChpdGVtKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBkYXRhLml0ZW1zLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgICAgICAgICB0aGlzLml0ZW1zLnB1c2goaXRlbSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAvLyBpZiAodGhpcy5pdGVtc1N0YXR1c09ic2VydmVyKSB7XHJcbiAgICAgICAgICAgIC8vICAgdGhpcy5pdGVtc1N0YXR1c09ic2VydmVyLm5leHQodGhpcy5pdGVtcy5sZW5ndGgpO1xyXG4gICAgICAgICAgICAvLyB9XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgdGhpcy50b3RhbENvdW50ID0gZGF0YS50b3RhbENvdW50O1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBpZiAodGhpcy5pdGVtcy5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgICAgICB0aGlzLml0ZW1zID0gZGF0YS5pdGVtcztcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGRhdGEuaXRlbXMuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMuaXRlbXMucHVzaChpdGVtKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIC8vIGlmICh0aGlzLml0ZW1zU3RhdHVzT2JzZXJ2ZXIpIHtcclxuICAgICAgICAgICAgLy8gICB0aGlzLml0ZW1zU3RhdHVzT2JzZXJ2ZXIubmV4dCh0aGlzLml0ZW1zLmxlbmd0aCk7XHJcbiAgICAgICAgICAgIC8vIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMudG90YWxDb3VudCA9IGRhdGEuaXRlbXMgPT0gdW5kZWZpbmVkID8gMCA6IGRhdGEuaXRlbXMubGVuZ3RoO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIGlmIChkYXRhLml0ZW1zICYmIGRhdGEuaXRlbXMubGVuZ3RoID09PSBkYXRhLnRvdGFsQ291bnQpIHtcclxuICAgICAgICB0aGlzLml0ZW1zID0gZGF0YS5pdGVtcztcclxuICAgICAgICB0aGlzLnRvdGFsQ291bnQgPSBkYXRhLml0ZW1zLmxlbmd0aDtcclxuICAgICAgfSBlbHNlIGlmIChkYXRhLnRvdGFsQ291bnQpIHtcclxuICAgICAgICBkYXRhLml0ZW1zLmZvckVhY2goKGVsbSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5pdGVtcy5wdXNoKGVsbSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgLy8gaWYgKHRoaXMuaXRlbXNTdGF0dXNPYnNlcnZlcikge1xyXG4gICAgICAgIC8vICAgdGhpcy5pdGVtc1N0YXR1c09ic2VydmVyLm5leHQodGhpcy5pdGVtcy5sZW5ndGgpO1xyXG4gICAgICAgIC8vIH1cclxuICAgICAgICB0aGlzLnRvdGFsQ291bnQgPSBkYXRhLnRvdGFsQ291bnQ7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgZGF0YS5mb3JFYWNoKChlbG0pID0+IHtcclxuICAgICAgICAgIHRoaXMuaXRlbXMucHVzaChlbG0pO1xyXG4gICAgICAgICAgLy8gaWYgKHRoaXMuaXRlbXNTdGF0dXNPYnNlcnZlcikge1xyXG4gICAgICAgICAgLy8gICB0aGlzLml0ZW1zU3RhdHVzT2JzZXJ2ZXIubmV4dCh0aGlzLml0ZW1zLmxlbmd0aCk7XHJcbiAgICAgICAgICAvLyB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy50b3RhbENvdW50ID0gZGF0YS5sZW5ndGg7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuaXRlbXMgPSBkYXRhO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG5cclxuICAgIHRoaXMuZHJvcGRvd24udXBkYXRlUG9zaXRpb24oKTtcclxuICB9XHJcblxyXG4gIC8vIHByaXZhdGUgcGFyYW1zOiBBWERhdGFTb3VyY2VSZWFkUGFyYW1zID0ge307XHJcblxyXG4gIGZldGNoKHBhcmFtczogQVhEYXRhU291cmNlUmVhZFBhcmFtcyA9IHt9KSB7XHJcbiAgICAvLyAgdGhpcy5wYXJhbXMgPSBwYXJhbXM7XHJcbiAgICBpZiAodGhpcy5kYXRhU291cmNlKSB7XHJcbiAgICAgIHRoaXMuc2hvd0xvYWRpbmcgPSB0cnVlO1xyXG4gICAgICB0aGlzLmRhdGFTb3VyY2UuZmV0Y2gocGFyYW1zKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlZnJlc2goKSB7XHJcbiAgICBjb25zdCBwYXJhbXM6IEFYRGF0YVNvdXJjZVJlYWRQYXJhbXMgPSB7fTtcclxuICAgIGlmICh0aGlzLnJlbW90ZU9wZXJhdGlvbikge1xyXG4gICAgICBwYXJhbXMuc2tpcCA9IDA7XHJcbiAgICAgIHRoaXMuc2tpcCA9IDA7XHJcbiAgICAgIHBhcmFtcy50YWtlID0gdGhpcy5idWZmZXJTaXplO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuZGF0YVNvdXJjZSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgLy8gdGhpcy5pdGVtcyA9IFtdO1xyXG4gICAgICAvLyB0aGlzLml0ZW1zLmZvckVhY2goKGVsZW1lbnQpID0+IHtcclxuICAgICAgLy8gICB0aGlzLml0ZW1zLnBvcCgpO1xyXG4gICAgICAvLyB9KTtcclxuXHJcbiAgICAgIGlmICh0aGlzLml0ZW1zKSB7XHJcbiAgICAgICAgbGV0IHQgPSB0aGlzLml0ZW1zLmxlbmd0aDtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHQ7IGkrKykge1xyXG4gICAgICAgICAgdGhpcy5pdGVtcy5wb3AoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuZmV0Y2gocGFyYW1zKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGhhbmRsZUl0ZW1SZW1vdmVDbGljayhpdGVtKSB7XHJcbiAgICBpZiAodGhpcy5tb2RlID09PSAnc2luZ2xlJykge1xyXG4gICAgICAvLyB0aGlzLnNlbGVjdGVkSXRlbXMgPSBudWxsO1xyXG4gICAgICB0aGlzLnNldFNlbGVjdGVkVmFsdWVzKG51bGwsIHRydWUpO1xyXG4gICAgICAvLyB0aGlzLnNlbGVjdGVkSXRlbXNDaGFuZ2UuZW1pdCh0aGlzLl9zZWxlY3RlZEl0ZW1zKTtcclxuICAgICAgLy8gdGhpcy5jbGVhclZhbGlkYXRpb25TdHlsZSh0aGlzLnJlZi5uYXRpdmVFbGVtZW50KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIHRoaXMuc2VsZWN0ZWRJdGVtcyA9IHRoaXMuc2VsZWN0ZWRJdGVtcy5maWx0ZXIoKGMpID0+IGMgIT09IGl0ZW0pO1xyXG4gICAgICB0aGlzLnNldFNlbGVjdGVkSXRlbXMoXHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zLmZpbHRlcigoYykgPT4gY1t0aGlzLnZhbHVlRmllbGRdICE9PSBpdGVtW3RoaXMudmFsdWVGaWVsZF0pLFxyXG4gICAgICAgIHRydWVcclxuICAgICAgKTtcclxuICAgICAgLy8gdGhpcy5fc2VsZWN0ZWRJdGVtcyA9IHRoaXMuX3NlbGVjdGVkSXRlbXMuZmlsdGVyKGMgPT4gYyAhPT0gaXRlbSk7XHJcbiAgICAgIC8vIHRoaXMuc2VsZWN0ZWRJdGVtc0NoYW5nZS5lbWl0KHRoaXMuX3NlbGVjdGVkSXRlbXMpO1xyXG4gICAgICAvLyB0aGlzLmNsZWFyVmFsaWRhdGlvblN0eWxlKHRoaXMucmVmLm5hdGl2ZUVsZW1lbnQpO1xyXG4gICAgfVxyXG4gICAgLy8gdGhpcy50ZXh0ID0gJyc7XHJcbiAgICB0aGlzLnZhbGlkYXRlKCk7XHJcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICB9XHJcblxyXG4gIG9uRm9jdXNUZXh0Qm94KGUpIHt9XHJcblxyXG4gIG9uVGV4dEJveENsaWNrKGUpIHtcclxuICAgIGlmICh0aGlzLmRpc2FibGVkID09IGZhbHNlICYmIHRoaXMucmVhZG9ubHkgPT0gZmFsc2UpIHtcclxuICAgICAgdGhpcy5kcm9wZG93bi5vcGVuKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBoYW5kbGVJdGVtQ2xpY2soZTogTW91c2VFdmVudCwgaXRlbTogYW55KSB7XHJcbiAgICBpZiAodGhpcy5pc0l0ZW1EaXNhYmxlZChpdGVtKSA9PSBmYWxzZSkge1xyXG4gICAgICBjb25zdCB2YWx1ZSA9IGl0ZW1bdGhpcy52YWx1ZUZpZWxkXTtcclxuXHJcbiAgICAgIGlmICh0aGlzLm1vZGUgPT09ICdzaW5nbGUnKSB7XHJcbiAgICAgICAgLy8gdGhpcy5zZWxlY3RlZFZhbHVlcyA9IHZhbHVlO1xyXG4gICAgICAgIHRoaXMuc2V0U2VsZWN0ZWRWYWx1ZXModmFsdWUsIHRydWUpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IGV4aXN0cyA9IHRoaXMuc2VsZWN0ZWRWYWx1ZXMuc2xpY2UoMCk7XHJcbiAgICAgICAgaWYgKGV4aXN0cy5pbmNsdWRlcyh2YWx1ZSkpIHtcclxuICAgICAgICAgIGlmICh0aGlzLmFsbG93TnVsbCA9PSB0cnVlIHx8ICh0aGlzLmFsbG93TnVsbCA9PSBmYWxzZSAmJiB0aGlzLnNlbGVjdGVkSXRlbXMubGVuZ3RoID4gMSkpIHtcclxuICAgICAgICAgICAgdGhpcy5oYW5kbGVJdGVtUmVtb3ZlQ2xpY2soaXRlbSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGV4aXN0cy5wdXNoKHZhbHVlKTtcclxuICAgICAgICAgIC8vIHRoaXMuc2VsZWN0ZWRWYWx1ZXMgPSBleGlzdHM7XHJcbiAgICAgICAgICB0aGlzLnNldFNlbGVjdGVkVmFsdWVzKGV4aXN0cywgdHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodGhpcy5tb2RlID09ICdzaW5nbGUnKSB7XHJcbiAgICAgICAgdGhpcy50ZXh0ID0gJyc7XHJcbiAgICAgICAgdGhpcy5kcm9wZG93bi5jbG9zZSgpO1xyXG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIGlmIChlLnN0b3BQcm9wYWdhdGlvbigpID09IHVuZGVmaW5lZCkge1xyXG4gICAgICAvLyAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgLy8gfVxyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICBpZiAodGhpcy5zZXJjaEJveCkge1xyXG4gICAgICAgICAgdGhpcy5zZXJjaEJveC5mb2N1cygpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSwgMCk7XHJcbiAgICB9XHJcblxyXG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICB9XHJcblxyXG4gIGhhbmRsZUtleUV2ZW50U2VhcmNoKGU6IEtleWJvYXJkRXZlbnQpIHtcclxuICAgIGlmICh0aGlzLmRpc2FibGVkIHx8IHRoaXMucmVhZG9ubHkpIHtcclxuICAgICAgdGhpcy5kcm9wZG93bi5jbG9zZSgpO1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICB0aGlzLnRleHRCb3hTZWxlY3RCb3guZm9jdXMoKTtcclxuICAgICAgfSwgMCk7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIGlmIChlLmtleSA9PT0gJ0VzY2FwZScpIHtcclxuICAgICAgdGhpcy50ZXh0ID0gbnVsbDtcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy50ZXh0Qm94U2VsZWN0Qm94LmZvY3VzKCk7XHJcbiAgICAgIH0sIDApO1xyXG4gICAgfVxyXG4gICAgaWYgKChlLmtleSA9PT0gJ0Fycm93RG93bicgfHwgZS5rZXkgPT09ICdBcnJvd1VwJykgJiYgdGhpcy5nZXRJdGVtcygpLmxlbmd0aCA+IDAgJiYgZS50eXBlID09PSAna2V5ZG93bicpIHtcclxuICAgICAgaWYgKHRoaXMubW9kZSA9PT0gJ3NpbmdsZScpIHtcclxuICAgICAgICB0aGlzLmN1cnJlbnRmb2N1c2VkSW5kZXggPSB0aGlzLmN1cnJlbnRmb2N1c2VkSW5kZXggKyAoZS5rZXkgPT09ICdBcnJvd0Rvd24nID8gMSA6IC0xKTtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbUJ5SW5kZXgodGhpcy5jdXJyZW50Zm9jdXNlZEluZGV4KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpZiAodGhpcy5kcm9wZG93bi5pc09wZW4pIHtcclxuICAgICAgICAgIHRoaXMuc2V0U2VsZWN0ZWRJbmRleChlLmtleSA9PT0gJ0Fycm93RG93bicgPyAxIDogLTEpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLmRyb3Bkb3duLm9wZW4oKTtcclxuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5zZXJjaEJveCkge1xyXG4gICAgICAgICAgICAgIHRoaXMuc2VyY2hCb3guZm9jdXMoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSwgMCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyBpZiAoZS5rZXkgPT0gJ0VudGVyJyAmJiB0aGlzLmRyb3Bkb3duLmlzT3BlbiAmJiB0aGlzLm1vZGUgPT0gJ3NpbmdsZScpIHtcclxuICAgIC8vICAgICB0aGlzLmRyb3Bkb3duLmNsb3NlKCk7XHJcbiAgICAvLyAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAvLyAgICAgICAgIHRoaXMuZHJvcGRvd24uZm9jdXMoKTtcclxuICAgIC8vICAgICB9LCAwKTtcclxuICAgIC8vIH1cclxuICAgIC8vZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIC8vZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuICAgIGlmIChlLnR5cGUgPT09ICdrZXlkb3duJyAmJiBlLmtleSA9PSAnRW50ZXInICYmIHRoaXMuZHJvcGRvd24uaXNPcGVuKSB7XHJcbiAgICAgIGlmICghdGhpcy5yZW1vdGVPcGVyYXRpb24gJiYgdGhpcy50ZXh0ICYmIHRoaXMudGV4dCAhPT0gJycpIHtcclxuICAgICAgICB0aGlzLml0ZW1zRmlsdGVyZWQgPSB0aGlzLml0ZW1zLmZpbHRlcigoYykgPT4gKGNbdGhpcy50ZXh0RmllbGRdIGFzIHN0cmluZykudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh0aGlzLnRleHQudG9Mb3dlckNhc2UoKSkpO1xyXG4gICAgICAgIGlmICh0aGlzLml0ZW1zRmlsdGVyZWQubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgICAgICB0aGlzLmN1cnJlbnRmb2N1c2VkSW5kZXggPSAwO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLml0ZW1zRmlsdGVyZWQgPSB0aGlzLml0ZW1zO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoXHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zLmZpbHRlcigoYykgPT4gY1t0aGlzLnZhbHVlRmllbGRdID09PSB0aGlzLml0ZW1zRmlsdGVyZWRbdGhpcy5jdXJyZW50Zm9jdXNlZEluZGV4XVt0aGlzLnZhbHVlRmllbGRdKS5sZW5ndGggPiAwICYmXHJcbiAgICAgICAgdGhpcy5tb2RlID09ICdtdWx0aXBsZSdcclxuICAgICAgKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuYWxsb3dOdWxsID09IHRydWUgfHwgKHRoaXMuYWxsb3dOdWxsID09IGZhbHNlICYmIHRoaXMuc2VsZWN0ZWRJdGVtcy5sZW5ndGggPiAxKSkge1xyXG4gICAgICAgICAgaWYgKCF0aGlzLnJlbW90ZU9wZXJhdGlvbiAmJiB0aGlzLnRleHQgJiYgdGhpcy50ZXh0ICE9PSAnJykge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbXMgPSB0aGlzLnNlbGVjdGVkSXRlbXMuZmlsdGVyKFxyXG4gICAgICAgICAgICAgIChjKSA9PlxyXG4gICAgICAgICAgICAgICAgYyAhPT1cclxuICAgICAgICAgICAgICAgIHRoaXMuaXRlbXMuZmlsdGVyKChjKSA9PiAoY1t0aGlzLnRleHRGaWVsZF0gYXMgc3RyaW5nKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHRoaXMudGV4dC50b0xvd2VyQ2FzZSgpKSlbdGhpcy5jdXJyZW50Zm9jdXNlZEluZGV4XVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zID0gdGhpcy5zZWxlY3RlZEl0ZW1zLmZpbHRlcigoYykgPT4gY1t0aGlzLnZhbHVlRmllbGRdICE9PSB0aGlzLml0ZW1zW3RoaXMuY3VycmVudGZvY3VzZWRJbmRleF1bdGhpcy52YWx1ZUZpZWxkXSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLmVtaXRTZWxlY3Rpb25DaGFuZ2VkRXZlbnQoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaWYgKHRoaXMubW9kZSA9PSAnbXVsdGlwbGUnKSB7XHJcbiAgICAgICAgICBpZiAodGhpcy5jdXJyZW50Zm9jdXNlZEluZGV4ICE9IC0xKSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5yZW1vdGVPcGVyYXRpb24gJiYgdGhpcy50ZXh0ICYmIHRoaXMudGV4dCAhPT0gJycpIHtcclxuICAgICAgICAgICAgICBpZiAodGhpcy5pdGVtc0ZpbHRlcmVkLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zLnB1c2godGhpcy5pdGVtc0ZpbHRlcmVkWzBdKTtcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zLnB1c2godGhpcy5pdGVtc0ZpbHRlcmVkW3RoaXMuY3VycmVudGZvY3VzZWRJbmRleF0pO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbXMucHVzaCh0aGlzLml0ZW1zW3RoaXMuY3VycmVudGZvY3VzZWRJbmRleF0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuZW1pdFNlbGVjdGlvbkNoYW5nZWRFdmVudCgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBpZiAodGhpcy50ZXh0ICYmIHRoaXMuaXRlbXNGaWx0ZXJlZD8ubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0U2VsZWN0ZWRJdGVtcyh0aGlzLml0ZW1zRmlsdGVyZWQsIHRydWUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKHRoaXMubW9kZSA9PSAnc2luZ2xlJykge1xyXG4gICAgICAgICAgICB0aGlzLmRyb3Bkb3duLmNsb3NlKCk7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMudGV4dEJveFNlbGVjdEJveC5mb2N1cygpO1xyXG4gICAgICAgICAgICB9LCAwKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgfVxyXG5cclxuICBpc0NoYXIoc3RyOiBzdHJpbmcpIHtcclxuICAgIGlmIChcclxuICAgICAgc3RyLmluY2x1ZGVzKCdTaGlmdCcpIHx8XHJcbiAgICAgIHN0ci5pbmNsdWRlcygnVGFiJykgfHxcclxuICAgICAgc3RyLmluY2x1ZGVzKCdDb250cm9sJykgfHxcclxuICAgICAgc3RyLmluY2x1ZGVzKCdBbHQnKSB8fFxyXG4gICAgICBzdHIuaW5jbHVkZXMoJ0NhcHNMb2NrJykgfHxcclxuICAgICAgc3RyLmluY2x1ZGVzKCdNZXRhJykgfHxcclxuICAgICAgc3RyLmluY2x1ZGVzKCdDb250ZXh0TWVudScpIHx8XHJcbiAgICAgIHN0ci5pbmNsdWRlcygnRW50ZXInKSB8fFxyXG4gICAgICBzdHIuaW5jbHVkZXMoJ0JhY2tzcGFjZScpIHx8XHJcbiAgICAgIHN0ci5pbmNsdWRlcygnUHJpbnRTY3JlZW4nKSB8fFxyXG4gICAgICBzdHIuaW5jbHVkZXMoJ1Njcm9sbExvY2snKSB8fFxyXG4gICAgICBzdHIuaW5jbHVkZXMoJ1BhdXNlJykgfHxcclxuICAgICAgc3RyLmluY2x1ZGVzKCdIb21lJykgfHxcclxuICAgICAgc3RyLmluY2x1ZGVzKCdFbmQnKSB8fFxyXG4gICAgICBzdHIuaW5jbHVkZXMoJ0luc2VydCcpIHx8XHJcbiAgICAgIHN0ci5pbmNsdWRlcygnUGFnZVVwJykgfHxcclxuICAgICAgc3RyLmluY2x1ZGVzKCdEZWxldGUnKSB8fFxyXG4gICAgICBzdHIuaW5jbHVkZXMoJ1BhZ2VEb3duJykgfHxcclxuICAgICAgc3RyLmluY2x1ZGVzKCdOdW1Mb2NrJykgfHxcclxuICAgICAgc3RyLmluY2x1ZGVzKCdFc2NhcGUnKSB8fFxyXG4gICAgICBzdHIuaW5jbHVkZXMoJ0Fycm93JykgfHxcclxuICAgICAgc3RyLmluY2x1ZGVzKCfZkUYxJykgfHxcclxuICAgICAgc3RyLmluY2x1ZGVzKCdGMicpIHx8XHJcbiAgICAgIHN0ci5pbmNsdWRlcygnRjMnKSB8fFxyXG4gICAgICBzdHIuaW5jbHVkZXMoJ0Y0JykgfHxcclxuICAgICAgc3RyLmluY2x1ZGVzKCdGNScpIHx8XHJcbiAgICAgIHN0ci5pbmNsdWRlcygnRjYnKSB8fFxyXG4gICAgICBzdHIuaW5jbHVkZXMoJ0Y3JykgfHxcclxuICAgICAgc3RyLmluY2x1ZGVzKCdGOCcpIHx8XHJcbiAgICAgIHN0ci5pbmNsdWRlcygnRjknKSB8fFxyXG4gICAgICBzdHIuaW5jbHVkZXMoJ0YxMCcpIHx8XHJcbiAgICAgIHN0ci5pbmNsdWRlcygnRjExJykgfHxcclxuICAgICAgc3RyLmluY2x1ZGVzKCdGMTInKVxyXG4gICAgKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaGFuZGxlS2V5RXZlbnQoZTogYW55KSB7XHJcbiAgICAvLyBjb25zdCBOdW1iZXJNaW51c1BhdHRlcm4gPSAvW2EtekEtWjAtOVxcLV0vZztcclxuICAgIC8vIGNvbnN0IEZhcnNpID0gL1vZvtqG2KzYrdiu2YfYudi62YHZgtir2LXYtti02LPbjNio2YTYp9iq2YbZhdqp2q/ZiNim2K/YsNix2LLYt9i42pjYpNil2KPYodmL2YzZjdmO2Y/ZkNmRXFxzXSskLztcclxuICAgIC8vICBjb25zdCBpbnB1dENoYXIgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGUuY2hhckNvZGUpO1xyXG4gICAgLy8gY29uc3QgcGF0dGVybkVuID0gL15bYS16QS1aMC05XSokLztcclxuICAgIC8vIGNvbnN0IHBhdHRlcm4gPSAvXltcXHUwNjAwLVxcdTA2RkZcXHNdKyQvO1xyXG4gICAgY29uc3QgaW5wdXRDaGFyID0gZS5rZXk7XHJcbiAgICBpZiAoXHJcbiAgICAgIChpbnB1dENoYXIgIT0gJ0JhY2tzcGFjZScgJiZcclxuICAgICAgICBpbnB1dENoYXIgIT0gJ0JhY2tzcGFjZScgJiZcclxuICAgICAgICBpbnB1dENoYXIgIT0gJ1RhYicgJiZcclxuICAgICAgICBpbnB1dENoYXIgIT0gJ0VudGVyJyAmJlxyXG4gICAgICAgIGlucHV0Q2hhciAhPSAnRXNjYXBlJyAmJlxyXG4gICAgICAgIGlucHV0Q2hhciAhPSAnQXJyb3dEb3duJyAmJlxyXG4gICAgICAgIGlucHV0Q2hhciAhPSAnQXJyb3dVcCcpIHx8XHJcbiAgICAgIGUuY29kZSA9PT0gJ1NwYWNlJyB8fFxyXG4gICAgICBlLmN0cmxLZXkgPT0gdHJ1ZVxyXG4gICAgKSB7XHJcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgIH1cclxuICAgIGlmIChcclxuICAgICAgZS5rZXkgPT09ICdCYWNrc3BhY2UnICYmXHJcbiAgICAgIGUudHlwZSA9PT0gJ2tleWRvd24nICYmXHJcbiAgICAgICgodGhpcy5hbGxvd051bGwgPT09IHRydWUgJiYgdGhpcy5zZWxlY3RlZEl0ZW1zLmxlbmd0aCA+IDApIHx8ICh0aGlzLmFsbG93TnVsbCA9PT0gZmFsc2UgJiYgdGhpcy5zZWxlY3RlZEl0ZW1zLmxlbmd0aCA+IDEpKVxyXG4gICAgKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtcy5wb3AoKTtcclxuICAgICAgdGhpcy5lbWl0U2VsZWN0aW9uQ2hhbmdlZEV2ZW50KCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5kaXNhYmxlZCB8fCB0aGlzLnJlYWRvbmx5KSB7XHJcbiAgICAgIHRoaXMuZHJvcGRvd24uY2xvc2UoKTtcclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy50ZXh0Qm94U2VsZWN0Qm94LmZvY3VzKCk7XHJcbiAgICAgIH0sIDApO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBjb25zdCBJTlBVVCA9IFN0cmluZy5mcm9tQ2hhckNvZGUoZS5rZXlDb2RlKTtcclxuICAgIGlmICh0aGlzLmlzQ2hhcihlLmtleSkgJiYgdGhpcy5hbGxvd1NlYXJjaCAmJiBlLmN0cmxLZXkgPT0gZmFsc2UpIHtcclxuICAgICAgdGhpcy5kcm9wZG93bi5vcGVuKCk7XHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLnNlcmNoQm94KSB7XHJcbiAgICAgICAgICB0aGlzLnNlcmNoQm94LmZvY3VzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LCAwKTtcclxuICAgICAgdGhpcy50ZXh0ID0gZS5rZXk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGUua2V5ID09PSAnRXNjYXBlJykge1xyXG4gICAgICB0aGlzLnRleHQgPSBudWxsO1xyXG4gICAgICB0aGlzLmRyb3Bkb3duLmNsb3NlKCk7XHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMudGV4dEJveFNlbGVjdEJveC5mb2N1cygpO1xyXG4gICAgICB9LCAwKTtcclxuICAgIH1cclxuICAgIGlmICgoZS5rZXkgPT09ICdBcnJvd0Rvd24nIHx8IGUua2V5ID09PSAnQXJyb3dVcCcpICYmIHRoaXMuZ2V0SXRlbXMoKS5sZW5ndGggPiAwICYmIGUudHlwZSA9PT0gJ2tleWRvd24nKSB7XHJcbiAgICAgIGlmICh0aGlzLm1vZGUgPT09ICdzaW5nbGUnKSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1CeUluZGV4KHRoaXMuY3VycmVudGZvY3VzZWRJbmRleCArIChlLmtleSA9PT0gJ0Fycm93RG93bicgPyAxIDogLTEpKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpZiAodGhpcy5kcm9wZG93bi5pc09wZW4pIHtcclxuICAgICAgICAgIC8vICB0aGlzLnNldFNlbGVjdGVkSW5kZXgoKGUua2V5ID09PSAnQXJyb3dEb3duJyA/IDEgOiAtMSkpO1xyXG4gICAgICAgICAgaWYgKHRoaXMuYWxsb3dTZWFyY2ggPT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgdGhpcy5zZXRTZWxlY3RlZEluZGV4KGUua2V5ID09PSAnQXJyb3dEb3duJyA/IDEgOiAtMSk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICBpZiAodGhpcy5zZXJjaEJveCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXJjaEJveC5mb2N1cygpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSwgMCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuZHJvcGRvd24ub3BlbigpO1xyXG4gICAgICAgICAgaWYgKHRoaXMuYWxsb3dTZWFyY2ggPT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICBpZiAodGhpcy5zZXJjaEJveCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXJjaEJveC5mb2N1cygpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSwgMCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuYWxsb3dTZWFyY2ggPT09IGZhbHNlKSB7XHJcbiAgICAgIGlmIChlLnR5cGUgPT09ICdrZXlkb3duJyAmJiBlLmtleSA9PSAnRW50ZXInICYmIHRoaXMuZHJvcGRvd24uaXNPcGVuKSB7XHJcbiAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbXMuZmlsdGVyKChjKSA9PiBjW3RoaXMudmFsdWVGaWVsZF0gPT09IHRoaXMuaXRlbXNGaWx0ZXJlZFt0aGlzLmN1cnJlbnRmb2N1c2VkSW5kZXhdW3RoaXMudmFsdWVGaWVsZF0pLmxlbmd0aCA+IDAgJiZcclxuICAgICAgICAgIHRoaXMubW9kZSA9PSAnbXVsdGlwbGUnXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICBpZiAodGhpcy5hbGxvd051bGwgPT0gdHJ1ZSB8fCAodGhpcy5hbGxvd051bGwgPT0gZmFsc2UgJiYgdGhpcy5zZWxlY3RlZEl0ZW1zLmxlbmd0aCA+IDEpKSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5yZW1vdGVPcGVyYXRpb24gJiYgdGhpcy50ZXh0ICYmIHRoaXMudGV4dCAhPT0gJycpIHtcclxuICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbXMgPSB0aGlzLnNlbGVjdGVkSXRlbXMuZmlsdGVyKFxyXG4gICAgICAgICAgICAgICAgKGMpID0+XHJcbiAgICAgICAgICAgICAgICAgIGMgIT09XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuaXRlbXMuZmlsdGVyKChjKSA9PiAoY1t0aGlzLnRleHRGaWVsZF0gYXMgc3RyaW5nKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHRoaXMudGV4dC50b0xvd2VyQ2FzZSgpKSlbdGhpcy5jdXJyZW50Zm9jdXNlZEluZGV4XVxyXG4gICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zID0gdGhpcy5zZWxlY3RlZEl0ZW1zLmZpbHRlcigoYykgPT4gY1t0aGlzLnZhbHVlRmllbGRdICE9PSB0aGlzLml0ZW1zW3RoaXMuY3VycmVudGZvY3VzZWRJbmRleF1bdGhpcy52YWx1ZUZpZWxkXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5lbWl0U2VsZWN0aW9uQ2hhbmdlZEV2ZW50KCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGlmICh0aGlzLm1vZGUgPT0gJ211bHRpcGxlJykge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5jdXJyZW50Zm9jdXNlZEluZGV4ICE9IC0xKSB7XHJcbiAgICAgICAgICAgICAgaWYgKCF0aGlzLnJlbW90ZU9wZXJhdGlvbiAmJiB0aGlzLnRleHQgJiYgdGhpcy50ZXh0ICE9PSAnJykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXRlbXNGaWx0ZXJlZC5sZW5ndGggPT09IDEpIHtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zLnB1c2godGhpcy5pdGVtc0ZpbHRlcmVkWzBdKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtcy5wdXNoKHRoaXMuaXRlbXNGaWx0ZXJlZFt0aGlzLmN1cnJlbnRmb2N1c2VkSW5kZXhdKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zLnB1c2godGhpcy5pdGVtc1t0aGlzLmN1cnJlbnRmb2N1c2VkSW5kZXhdKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgdGhpcy5lbWl0U2VsZWN0aW9uQ2hhbmdlZEV2ZW50KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnRleHQgJiYgdGhpcy5pdGVtc0ZpbHRlcmVkLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICAgICAgICAgIHRoaXMuc2V0U2VsZWN0ZWRJdGVtcyh0aGlzLml0ZW1zRmlsdGVyZWQsIHRydWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh0aGlzLm1vZGUgPT0gJ3NpbmdsZScpIHtcclxuICAgICAgICAgICAgICB0aGlzLmRyb3Bkb3duLmNsb3NlKCk7XHJcbiAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRleHRCb3hTZWxlY3RCb3guZm9jdXMoKTtcclxuICAgICAgICAgICAgICB9LCAwKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gIH1cclxuXHJcbiAgZm9jdXMoKTogdm9pZCB7XHJcbiAgICB0aGlzLnRleHRib3guZm9jdXMoKTtcclxuICB9XHJcblxyXG4gIHNlbGVjdGVkSXRlbUJ5SW5kZXgoaW5kZXg6IG51bWJlcikge1xyXG4gICAgbGV0IGl0ZW0gPSBbXTtcclxuICAgIGlmICghdGhpcy5yZW1vdGVPcGVyYXRpb24gJiYgdGhpcy50ZXh0ICYmIHRoaXMudGV4dCAhPT0gJycpIHtcclxuICAgICAgdGhpcy5pdGVtc0ZpbHRlcmVkID0gdGhpcy5pdGVtcy5maWx0ZXIoKGMpID0+IChjW3RoaXMudGV4dEZpZWxkXSBhcyBzdHJpbmcpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModGhpcy50ZXh0LnRvTG93ZXJDYXNlKCkpKTtcclxuXHJcbiAgICAgIGl0ZW0gPSB0aGlzLml0ZW1zRmlsdGVyZWRbaW5kZXhdO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaXRlbSA9IHRoaXMuaXRlbXNbaW5kZXhdO1xyXG4gICAgfVxyXG4gICAgLy9cclxuICAgIC8vICBjb25zdCBpdGVtID0gdGhpcy50ZXh0ID8gdGhpcy5pdGVtcy5maWx0ZXIoKGMpID0+IChjW3RoaXMudGV4dEZpZWxkXSBhcyBzdHJpbmcpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModGhpcy50ZXh0LnRvTG93ZXJDYXNlKCkpKVtpbmRleF0gOiB0aGlzLml0ZW1zW2luZGV4XTtcclxuICAgIGlmIChpdGVtKSB7XHJcbiAgICAgIHRoaXMuc2V0U2VsZWN0ZWRJdGVtcyhbaXRlbV0sIHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc2V0U2VsZWN0ZWRJbmRleCgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0SXRlbXMoKTogYW55W10ge1xyXG4gICAgaWYgKHRoaXMuaXRlbXMgPT0gbnVsbCkge1xyXG4gICAgICByZXR1cm4gW107XHJcbiAgICB9XHJcbiAgICByZXR1cm4gIXRoaXMucmVtb3RlT3BlcmF0aW9uICYmIHRoaXMudGV4dCAmJiB0aGlzLnRleHQgIT09ICcnXHJcbiAgICAgID8gdGhpcy5pdGVtcy5maWx0ZXIoKGMpID0+IChjW3RoaXMudGV4dEZpZWxkXSBhcyBzdHJpbmcpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModGhpcy50ZXh0LnRvTG93ZXJDYXNlKCkpKVxyXG4gICAgICA6IHRoaXMuaXRlbXM7XHJcbiAgfVxyXG5cclxuICBpc0l0ZW1TZWxlY3RlZChpdGVtOiBhbnkpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkSXRlbXMgJiYgdGhpcy5zZWxlY3RlZEl0ZW1zLmZpbHRlcigoYykgPT4gY1t0aGlzLnZhbHVlRmllbGRdID09PSBpdGVtW3RoaXMudmFsdWVGaWVsZF0pLmxlbmd0aCA+IDA7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGl0ZW1zU3RhdHVzT2JzZXJ2ZXI6IGFueTtcclxuICBwcml2YXRlIHdhaXRGb3JEYXRhKGNhbGxiYWNrZm46ICgpID0+IHZvaWQpIHtcclxuICAgIGlmICh0aGlzLml0ZW1zICYmIHRoaXMuaXRlbXMubGVuZ3RoKSB7XHJcbiAgICAgIGNhbGxiYWNrZm4oKTtcclxuICAgIH0gZWxzZSBpZiAoIXRoaXMuaXRlbXNTdGF0dXNPYnNlcnZlcikge1xyXG4gICAgICBPYnNlcnZhYmxlLmNyZWF0ZSgob2JzZXJ2ZXIpID0+IHtcclxuICAgICAgICB0aGlzLml0ZW1zU3RhdHVzT2JzZXJ2ZXIgPSBvYnNlcnZlcjtcclxuICAgICAgfSlcclxuICAgICAgICAucGlwZShkZWJvdW5jZVRpbWUoMTAwKSlcclxuICAgICAgICAucGlwZShkaXN0aW5jdFVudGlsQ2hhbmdlZCgpKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoKGMpID0+IHtcclxuICAgICAgICAgIGNhbGxiYWNrZm4oKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwiPGF4LWRyb3AtZG93biBbc2l6ZV09XCJzaXplXCIgW3J0bF09XCJydGxcIiBbc2hvd0Ryb3BEb3duQnV0dG9uXT1cInNob3dEcm9wRG93bkJ1dHRvblwiIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXHJcbiAgICBbcmVhZG9ubHldPVwicmVhZG9ubHlcIiAjZCAoZHJvcGRvd25Ub2dnbGUpPVwiZHJvcGRvd25Ub2dnbGVTZWxlY0JveCgkZXZlbnQpXCI+XHJcbiAgICA8bmctY29udGFpbmVyIHN0YXJ0PlxyXG4gICAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIltzdGFydF1cIj5cclxuICAgICAgICA8L25nLWNvbnRlbnQ+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDxuZy1jb250YWluZXIgaGVhZGVyPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJheCBjaGlwcy1jb250YWluZXJcIiBbaG9yaXpvbnRhbFNjcm9sbF09XCI0MFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hpcHNcIiBbY2xhc3MuY2hpcHMtYmxhbmtdPVwibW9kZSA9PT0gJ3NpbmdsZSdcIiBbdGl0bGVdPVwiaXRlbVt0ZXh0RmllbGRdXCJcclxuICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mIHNlbGVjdGVkSXRlbXNcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2hpcHMtdGV4dFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7aXRlbVt0ZXh0RmllbGRdfX1cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2xvc2UtaWNvblwiIChjbGljayk9XCJoYW5kbGVJdGVtUmVtb3ZlQ2xpY2soaXRlbSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiKHJlYWRvbmx5IT10cnVlIHx8IGl0ZW1SZW1vdmUgPT10cnVlKSYmIGRpc2FibGVkIT10cnVlICYmIChhbGxvd051bGw9PXRydWUgfHwgKHNlbGVjdGVkSXRlbXMubGVuZ3RoID4gMSkpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXIgZmEtdGltZXMtY2lyY2xlIGNsb3NlXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlYXJjaC13cmFwcGVyXCIgKGNsaWNrKT1cIm9uVGV4dEJveENsaWNrKCRldmVudClcIj5cclxuICAgICAgICAgICAgICAgIDxheC10ZXh0LWJveCAjdGV4dEJveFNlbGVjdEJveCBbdGV4dEFsaWduXT1cInRleHRBbGlnblwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cInNlbGVjdGVkSXRlbXMubGVuZ3RoID09IDAgPyBwbGFjZWhvbGRlciA6ICcnXCIgW3JlYWRvbmx5XT1cInJlYWRvbmx5XCJcclxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIiAob25rZXkpPVwiaGFuZGxlS2V5RXZlbnQoJGV2ZW50KVwiIFtzaXplXT1cInNpemVcIlxyXG4gICAgICAgICAgICAgICAgICAgIChvbkZvY3VzKT1cIm9uRm9jdXNUZXh0Qm94KCRldmVudClcIj5cclxuICAgICAgICAgICAgICAgIDwvYXgtdGV4dC1ib3g+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8bmctY29udGFpbmVyIGVuZD5cclxuICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbZW5kXVwiPlxyXG4gICAgICAgIDwvbmctY29udGVudD5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgIDxuZy1jb250YWluZXIgcGFuZWw+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cImFsbG93U2VhcmNoXCIgY2xhc3M9XCJzZWFyY2gtd3JhcHBlclwiIHN0eWxlPVwicGFkZGluZzogMC43ZW07XCI+XHJcbiAgICAgICAgICAgIDxheC1zZWFyY2gtYm94ICNzZXJjaEJveCBbKHZhbHVlKV09XCJ0ZXh0XCIgKG9ua2V5KT1cImhhbmRsZUtleUV2ZW50U2VhcmNoKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgKHRleHRDaGFuZ2VkKT1cInRleHRDaGFuZ2VkKCRldmVudClcIiAob25CdXR0b25DbGljayk9XCJ0ZXh0Q2hhbmdlZCgkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgIDwvYXgtc2VhcmNoLWJveD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiYXggbGlzdC1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgPGRpdiAjbGlzdENvbnRhaW5lciBjbGFzcz1cImxpc3QtY29udGFpbmVyLWl0ZW1zXCIgKHNjcm9sbCk9XCJzY3JvbGxlZCgkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ2V0SXRlbXMoKS5sZW5ndGg+MDsgdGhlbiB0aGVuVGVtcGxhdGU7IGVsc2UgZWxzZVRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3RoZW5UZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IFtjbGFzcy5heC1zdGF0ZS1kaXNhYmxlZF09XCJpc0l0ZW1EaXNhYmxlZChpdGVtKVwiIGNsYXNzPVwibGlzdC1pdGVtXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZ2V0SXRlbXMoKTtsZXQgaSA9IGluZGV4XCIgW2NsYXNzLmZvY3VzZWRdPVwiaT09Y3VycmVudGZvY3VzZWRJbmRleFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZWxlY3RlZF09XCJpc0l0ZW1TZWxlY3RlZChpdGVtKVwiIChjbGljayk9XCJoYW5kbGVJdGVtQ2xpY2soJGV2ZW50LGl0ZW0pXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4O1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGF4LWNoZWNrLWJveCAqbmdJZj1cInNob3dDaGVja0JveFwiIFtzaXplXT1cInNpemVcIiBbdmFsdWVdPVwiaXNJdGVtU2VsZWN0ZWQoaXRlbSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIoIWFsbG93TnVsbCAmJiBzZWxlY3RlZEl0ZW1zLmxlbmd0aCA9PT0gMSAmJiBpc0l0ZW1TZWxlY3RlZChpdGVtKSkgfHwgaXNJdGVtRGlzYWJsZWQoaXRlbSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkNsaWNrKT1cImhhbmRsZUl0ZW1DbGljaygkZXZlbnQsaXRlbSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXgtY2hlY2stYm94PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInJvd1RlbXBsYXRlOyBlbHNlIGVsc2VUZW1wbGF0ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJ3aGl0ZS1zcGFjZTogbm93cmFwO3RleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO292ZXJmbG93OiBoaWRkZW47XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cIml0ZW1bdGV4dEZpZWxkXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cIihzaG93Q2hlY2tCb3gpID8geydwYWRkaW5nLWlubGluZS1zdGFydCc6ICcwLjVyZW0nfTonJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwicm93VGVtcGxhdGU7IGNvbnRleHQ6eyAkaW1wbGljaXQ6IGl0ZW0gfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZWxzZVRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJ3aGl0ZS1zcGFjZTogbm93cmFwO3RleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO292ZXJmbG93OiBoaWRkZW47XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cIml0ZW1bdGV4dEZpZWxkXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cIihzaG93Q2hlY2tCb3gpID8geydwYWRkaW5nLWlubGluZS1zdGFydCc6ICcwLjVyZW0nfTonJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBpdGVtW3RleHRGaWVsZF0gfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzaG93TG9hZGluZ1wiIGNsYXNzPVwiYXgtcGFkLXNtXCIgc3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXI7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXIgZmEtc3Bpbm5lci10aGlyZCBmYS1wdWxzZSBmYS0yeFwiIHN0eWxlPVwiY29sb3I6IHZhcigtLWF4LXByaW1hcnktY29sb3IpO1wiPjwvaT5cclxuXHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwhLS0gPGF4LWxvYWRpbmctaW5kaWNhdG9yID48L2F4LWxvYWRpbmctaW5kaWNhdG9yPiAtLT5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZWxzZVRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG93TG9hZGluZyA9PSB0cnVlOyB0aGVuIHNlYXJjaFRlbXBsYXRlIGVsc2Ugbm9EYXRhVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3NlYXJjaFRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGlzdC1pdGVtXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eydjb21tb24uc2VhcmNoaW5nJyB8IHRyYW5zfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI25vRGF0YVRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGlzdC1pdGVtXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eydjb21tb24ubm9EYXRhRm91bmQnIHwgdHJhbnN9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbjwvYXgtZHJvcC1kb3duPiJdfQ==