@wavemaker/app-ng-runtime 11.8.0-rc.5680 → 11.8.1-next.45204

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 (1455) hide show
  1. app-ng-runtime/build-task/bundles/index.umd.js +9 -33
  2. app-ng-runtime/build-task/esm2022/advanced/carousel/carousel-template/carousel-template.build.mjs +2 -4
  3. app-ng-runtime/build-task/esm2022/advanced/carousel/carousel.build.mjs +1 -1
  4. app-ng-runtime/build-task/esm2022/basic/default/label/label.build.mjs +1 -1
  5. app-ng-runtime/build-task/esm2022/basic/progress/progress-bar/progress-bar.build.mjs +1 -1
  6. app-ng-runtime/build-task/esm2022/containers/accordion/accordion.build.mjs +1 -1
  7. app-ng-runtime/build-task/esm2022/containers/repeat-template.build.mjs +2 -4
  8. app-ng-runtime/build-task/esm2022/containers/tabs/tabs.build.mjs +1 -1
  9. app-ng-runtime/build-task/esm2022/data/form/form-field/form-field.build.mjs +1 -1
  10. app-ng-runtime/build-task/esm2022/data/form/form.build.mjs +2 -5
  11. app-ng-runtime/build-task/esm2022/data/list/list.build.mjs +1 -1
  12. app-ng-runtime/build-task/esm2022/data/media-list/media-list.build.mjs +1 -1
  13. app-ng-runtime/build-task/esm2022/data/table/table-column/table-column.build.mjs +1 -1
  14. app-ng-runtime/build-task/esm2022/data/table/table.build.mjs +1 -1
  15. app-ng-runtime/build-task/esm2022/dialogs/partial-dialog/partial-dialog.build.mjs +1 -1
  16. app-ng-runtime/build-task/esm2022/input/file-upload/file-upload.build.mjs +1 -1
  17. app-ng-runtime/build-task/esm2022/navigation/menu/menu.build.mjs +2 -19
  18. app-ng-runtime/build-task/esm2022/navigation/popover/popover.build.mjs +1 -1
  19. app-ng-runtime/build-task/esm2022/page/page-content/page-content.build.mjs +1 -1
  20. app-ng-runtime/build-task/esm2022/page/page.build.mjs +2 -3
  21. app-ng-runtime/build-task/esm2022/utils/utils.mjs +1 -1
  22. app-ng-runtime/build-task/fesm2022/index.mjs +6 -31
  23. app-ng-runtime/build-task/fesm2022/index.mjs.map +1 -1
  24. app-ng-runtime/components/advanced/carousel/bundles/index.umd.js +16 -26
  25. app-ng-runtime/components/advanced/carousel/carousel-template/carousel-template.directive.d.ts +2 -2
  26. app-ng-runtime/components/advanced/carousel/carousel.directive.d.ts +2 -2
  27. app-ng-runtime/components/advanced/carousel/esm2022/carousel-template/carousel-template.directive.mjs +7 -12
  28. app-ng-runtime/components/advanced/carousel/esm2022/carousel.animator.mjs +2 -3
  29. app-ng-runtime/components/advanced/carousel/esm2022/carousel.directive.mjs +7 -12
  30. app-ng-runtime/components/advanced/carousel/esm2022/carousel.module.mjs +2 -2
  31. app-ng-runtime/components/advanced/carousel/fesm2022/index.mjs +14 -25
  32. app-ng-runtime/components/advanced/carousel/fesm2022/index.mjs.map +1 -1
  33. app-ng-runtime/components/advanced/login/bundles/index.umd.js +13 -19
  34. app-ng-runtime/components/advanced/login/esm2022/login.component.mjs +10 -17
  35. app-ng-runtime/components/advanced/login/esm2022/login.module.mjs +2 -2
  36. app-ng-runtime/components/advanced/login/fesm2022/index.mjs +11 -18
  37. app-ng-runtime/components/advanced/login/fesm2022/index.mjs.map +1 -1
  38. app-ng-runtime/components/advanced/login/login.component.d.ts +2 -2
  39. app-ng-runtime/components/advanced/marquee/bundles/index.umd.js +6 -11
  40. app-ng-runtime/components/advanced/marquee/esm2022/marquee.directive.mjs +7 -12
  41. app-ng-runtime/components/advanced/marquee/esm2022/marquee.module.mjs +2 -2
  42. app-ng-runtime/components/advanced/marquee/fesm2022/index.mjs +8 -13
  43. app-ng-runtime/components/advanced/marquee/fesm2022/index.mjs.map +1 -1
  44. app-ng-runtime/components/advanced/marquee/marquee.directive.d.ts +2 -2
  45. app-ng-runtime/components/base/bundles/index.umd.js +282 -367
  46. app-ng-runtime/components/base/directives/show-in-device.directive.d.ts +6 -3
  47. app-ng-runtime/components/base/esm2022/components.module.mjs +2 -2
  48. app-ng-runtime/components/base/esm2022/directives/show-in-device.directive.mjs +15 -13
  49. app-ng-runtime/components/base/esm2022/pipes/custom-pipes.mjs +34 -35
  50. app-ng-runtime/components/base/esm2022/pipes/image.pipe.mjs +2 -2
  51. app-ng-runtime/components/base/esm2022/pipes/sanitize.pipe.mjs +3 -3
  52. app-ng-runtime/components/base/esm2022/pipes/trust-as.pipe.mjs +3 -3
  53. app-ng-runtime/components/base/esm2022/pipes/wm-pipe.mjs +2 -3
  54. app-ng-runtime/components/base/esm2022/utils/data-utils.mjs +29 -30
  55. app-ng-runtime/components/base/esm2022/utils/form-utils.mjs +42 -48
  56. app-ng-runtime/components/base/esm2022/utils/live-utils.mjs +7 -8
  57. app-ng-runtime/components/base/esm2022/utils/widget-utils.mjs +27 -28
  58. app-ng-runtime/components/base/esm2022/widgets/common/base/base-container.component.mjs +7 -8
  59. app-ng-runtime/components/base/esm2022/widgets/common/base/base-field-validations.mjs +22 -23
  60. app-ng-runtime/components/base/esm2022/widgets/common/base/base.component.mjs +16 -36
  61. app-ng-runtime/components/base/esm2022/widgets/common/base/dataset-aware-nav.component.mjs +18 -52
  62. app-ng-runtime/components/base/esm2022/widgets/common/base/partial-container.directive.mjs +5 -6
  63. app-ng-runtime/components/base/esm2022/widgets/common/base/stylable.component.mjs +3 -3
  64. app-ng-runtime/components/base/esm2022/widgets/common/base/text-content.directive.mjs +3 -3
  65. app-ng-runtime/components/base/esm2022/widgets/common/container/container.directive.mjs +7 -12
  66. app-ng-runtime/components/base/esm2022/widgets/common/dialog/dialog.service.mjs +4 -5
  67. app-ng-runtime/components/base/esm2022/widgets/common/item-template/item-template.directive.mjs +7 -12
  68. app-ng-runtime/components/base/esm2022/widgets/common/lazy-load/lazy-load.directive.mjs +7 -14
  69. app-ng-runtime/components/base/esm2022/widgets/common/message/message.component.mjs +10 -16
  70. app-ng-runtime/components/base/esm2022/widgets/common/partial/partial.directive.mjs +8 -14
  71. app-ng-runtime/components/base/esm2022/widgets/common/partial-param/partial-param.directive.mjs +8 -9
  72. app-ng-runtime/components/base/esm2022/widgets/common/pull-to-refresh/pull-to-refresh.mjs +1 -1
  73. app-ng-runtime/components/base/esm2022/widgets/common/redraw/redrawable.directive.mjs +4 -4
  74. app-ng-runtime/components/base/esm2022/widgets/common/repeat-template/repeat-template.directive.mjs +7 -12
  75. app-ng-runtime/components/base/esm2022/widgets/common/smooth-scroll/smooth-scroll.directive.mjs +10 -11
  76. app-ng-runtime/components/base/esm2022/widgets/framework/deviceview.mjs +1 -1
  77. app-ng-runtime/components/base/esm2022/widgets/framework/property-change-handler.mjs +2 -3
  78. app-ng-runtime/components/base/esm2022/widgets/framework/styler.mjs +1 -1
  79. app-ng-runtime/components/base/esm2022/widgets/framework/widget-props.mjs +1 -1
  80. app-ng-runtime/components/base/esm2022/widgets/framework/widget-proxy-provider.mjs +3 -4
  81. app-ng-runtime/components/base/esm2022/widgets/framework/widget-registry.mjs +1 -1
  82. app-ng-runtime/components/base/fesm2022/index.mjs +284 -372
  83. app-ng-runtime/components/base/fesm2022/index.mjs.map +1 -1
  84. app-ng-runtime/components/base/pipes/custom-pipes.d.ts +1 -1
  85. app-ng-runtime/components/base/utils/data-utils.d.ts +0 -1
  86. app-ng-runtime/components/base/utils/widget-utils.d.ts +2 -2
  87. app-ng-runtime/components/base/widgets/common/base/base-container.component.d.ts +1 -1
  88. app-ng-runtime/components/base/widgets/common/base/base-field-validations.d.ts +1 -1
  89. app-ng-runtime/components/base/widgets/common/base/base.component.d.ts +2 -4
  90. app-ng-runtime/components/base/widgets/common/base/dataset-aware-nav.component.d.ts +1 -1
  91. app-ng-runtime/components/base/widgets/common/base/partial-container.directive.d.ts +1 -1
  92. app-ng-runtime/components/base/widgets/common/container/container.directive.d.ts +2 -2
  93. app-ng-runtime/components/base/widgets/common/item-template/item-template.directive.d.ts +2 -2
  94. app-ng-runtime/components/base/widgets/common/lazy-load/lazy-load.directive.d.ts +2 -2
  95. app-ng-runtime/components/base/widgets/common/message/message.component.d.ts +2 -2
  96. app-ng-runtime/components/base/widgets/common/partial/partial.directive.d.ts +2 -2
  97. app-ng-runtime/components/base/widgets/common/repeat-template/repeat-template.directive.d.ts +2 -2
  98. app-ng-runtime/components/basic/default/anchor/anchor.component.d.ts +2 -2
  99. app-ng-runtime/components/basic/default/audio/audio.component.d.ts +2 -3
  100. app-ng-runtime/components/basic/default/bundles/index.umd.js +119 -163
  101. app-ng-runtime/components/basic/default/esm2022/anchor/anchor.component.mjs +27 -31
  102. app-ng-runtime/components/basic/default/esm2022/audio/audio.component.mjs +11 -18
  103. app-ng-runtime/components/basic/default/esm2022/basic.module.mjs +2 -2
  104. app-ng-runtime/components/basic/default/esm2022/html/html.directive.mjs +8 -13
  105. app-ng-runtime/components/basic/default/esm2022/icon/icon.component.mjs +14 -19
  106. app-ng-runtime/components/basic/default/esm2022/iframe/iframe.component.mjs +9 -15
  107. app-ng-runtime/components/basic/default/esm2022/label/label.directive.mjs +9 -15
  108. app-ng-runtime/components/basic/default/esm2022/picture/picture.directive.mjs +7 -12
  109. app-ng-runtime/components/basic/default/esm2022/picture/picture.props.mjs +1 -1
  110. app-ng-runtime/components/basic/default/esm2022/spinner/spinner.component.mjs +30 -34
  111. app-ng-runtime/components/basic/default/esm2022/video/video.component.mjs +17 -21
  112. app-ng-runtime/components/basic/default/fesm2022/index.mjs +117 -162
  113. app-ng-runtime/components/basic/default/fesm2022/index.mjs.map +1 -1
  114. app-ng-runtime/components/basic/default/html/html.directive.d.ts +2 -2
  115. app-ng-runtime/components/basic/default/icon/icon.component.d.ts +2 -2
  116. app-ng-runtime/components/basic/default/iframe/iframe.component.d.ts +2 -2
  117. app-ng-runtime/components/basic/default/label/label.directive.d.ts +2 -2
  118. app-ng-runtime/components/basic/default/picture/picture.directive.d.ts +2 -2
  119. app-ng-runtime/components/basic/default/spinner/spinner.component.d.ts +2 -2
  120. app-ng-runtime/components/basic/default/video/video.component.d.ts +2 -2
  121. app-ng-runtime/components/basic/progress/bundles/index.umd.js +30 -43
  122. app-ng-runtime/components/basic/progress/esm2022/progress-bar/progress-bar.component.mjs +15 -22
  123. app-ng-runtime/components/basic/progress/esm2022/progress-circle/progress-circle.component.mjs +12 -20
  124. app-ng-runtime/components/basic/progress/esm2022/progress.module.mjs +2 -2
  125. app-ng-runtime/components/basic/progress/esm2022/utils.mjs +3 -3
  126. app-ng-runtime/components/basic/progress/fesm2022/index.mjs +28 -42
  127. app-ng-runtime/components/basic/progress/fesm2022/index.mjs.map +1 -1
  128. app-ng-runtime/components/basic/progress/progress-bar/progress-bar.component.d.ts +2 -2
  129. app-ng-runtime/components/basic/progress/progress-circle/progress-circle.component.d.ts +2 -3
  130. app-ng-runtime/components/basic/rich-text-editor/bundles/index.umd.js +13 -19
  131. app-ng-runtime/components/basic/rich-text-editor/esm2022/rich-text-editor.component.mjs +10 -17
  132. app-ng-runtime/components/basic/rich-text-editor/esm2022/rich-text-editor.module.mjs +2 -2
  133. app-ng-runtime/components/basic/rich-text-editor/fesm2022/index.mjs +11 -18
  134. app-ng-runtime/components/basic/rich-text-editor/fesm2022/index.mjs.map +1 -1
  135. app-ng-runtime/components/basic/rich-text-editor/rich-text-editor.component.d.ts +2 -2
  136. app-ng-runtime/components/basic/search/bundles/index.umd.js +175 -186
  137. app-ng-runtime/components/basic/search/esm2022/data-provider/data-provider.mjs +1 -1
  138. app-ng-runtime/components/basic/search/esm2022/data-provider/local-data-provider.mjs +23 -26
  139. app-ng-runtime/components/basic/search/esm2022/data-provider/remote-data-provider.mjs +11 -12
  140. app-ng-runtime/components/basic/search/esm2022/scrollable.directive.mjs +3 -3
  141. app-ng-runtime/components/basic/search/esm2022/search.component.mjs +138 -148
  142. app-ng-runtime/components/basic/search/esm2022/search.module.mjs +2 -2
  143. app-ng-runtime/components/basic/search/fesm2022/index.mjs +174 -186
  144. app-ng-runtime/components/basic/search/fesm2022/index.mjs.map +1 -1
  145. app-ng-runtime/components/basic/search/search.component.d.ts +2 -2
  146. app-ng-runtime/components/basic/tree/bundles/index.umd.js +17 -23
  147. app-ng-runtime/components/basic/tree/esm2022/tree.component.mjs +14 -21
  148. app-ng-runtime/components/basic/tree/esm2022/tree.module.mjs +2 -2
  149. app-ng-runtime/components/basic/tree/fesm2022/index.mjs +15 -22
  150. app-ng-runtime/components/basic/tree/fesm2022/index.mjs.map +1 -1
  151. app-ng-runtime/components/basic/tree/tree.component.d.ts +2 -2
  152. app-ng-runtime/components/chart/bundles/index.umd.js +84 -97
  153. app-ng-runtime/components/chart/chart.component.d.ts +3 -3
  154. app-ng-runtime/components/chart/chart.utils.d.ts +3 -3
  155. app-ng-runtime/components/chart/esm2022/chart.component.mjs +68 -82
  156. app-ng-runtime/components/chart/esm2022/chart.module.mjs +2 -2
  157. app-ng-runtime/components/chart/esm2022/chart.utils.mjs +13 -14
  158. app-ng-runtime/components/chart/fesm2022/index.mjs +81 -95
  159. app-ng-runtime/components/chart/fesm2022/index.mjs.map +1 -1
  160. app-ng-runtime/components/containers/accordion/accordion-pane/accordion-pane.component.d.ts +2 -2
  161. app-ng-runtime/components/containers/accordion/accordion.directive.d.ts +2 -2
  162. app-ng-runtime/components/containers/accordion/bundles/index.umd.js +40 -51
  163. app-ng-runtime/components/containers/accordion/esm2022/accordion-pane/accordion-pane.component.mjs +17 -23
  164. app-ng-runtime/components/containers/accordion/esm2022/accordion-pane/accordion-pane.props.mjs +4 -4
  165. app-ng-runtime/components/containers/accordion/esm2022/accordion.directive.mjs +19 -25
  166. app-ng-runtime/components/containers/accordion/esm2022/accordion.module.mjs +2 -2
  167. app-ng-runtime/components/containers/accordion/fesm2022/index.mjs +38 -50
  168. app-ng-runtime/components/containers/accordion/fesm2022/index.mjs.map +1 -1
  169. app-ng-runtime/components/containers/layout-grid/bundles/index.umd.js +17 -32
  170. app-ng-runtime/components/containers/layout-grid/esm2022/layout-grid-column/layout-grid-column.directive.mjs +8 -13
  171. app-ng-runtime/components/containers/layout-grid/esm2022/layout-grid-row/layout-grid-row.directive.mjs +7 -12
  172. app-ng-runtime/components/containers/layout-grid/esm2022/layout-grid.directive.mjs +7 -12
  173. app-ng-runtime/components/containers/layout-grid/esm2022/layout-grid.module.mjs +2 -2
  174. app-ng-runtime/components/containers/layout-grid/fesm2022/index.mjs +19 -34
  175. app-ng-runtime/components/containers/layout-grid/fesm2022/index.mjs.map +1 -1
  176. app-ng-runtime/components/containers/layout-grid/layout-grid-column/layout-grid-column.directive.d.ts +2 -2
  177. app-ng-runtime/components/containers/layout-grid/layout-grid-row/layout-grid-row.directive.d.ts +2 -2
  178. app-ng-runtime/components/containers/layout-grid/layout-grid.directive.d.ts +2 -2
  179. app-ng-runtime/components/containers/linear-layout/bundles/index.umd.js +11 -21
  180. app-ng-runtime/components/containers/linear-layout/esm2022/linear-layout-item/linear-layout-item.directive.mjs +7 -12
  181. app-ng-runtime/components/containers/linear-layout/esm2022/linear-layout.directive.mjs +7 -12
  182. app-ng-runtime/components/containers/linear-layout/esm2022/linear-layout.module.mjs +2 -2
  183. app-ng-runtime/components/containers/linear-layout/fesm2022/index.mjs +13 -23
  184. app-ng-runtime/components/containers/linear-layout/fesm2022/index.mjs.map +1 -1
  185. app-ng-runtime/components/containers/linear-layout/linear-layout-item/linear-layout-item.directive.d.ts +2 -2
  186. app-ng-runtime/components/containers/linear-layout/linear-layout.directive.d.ts +2 -2
  187. app-ng-runtime/components/containers/panel/bundles/index.umd.js +85 -85
  188. app-ng-runtime/components/containers/panel/esm2022/panel.component.mjs +82 -83
  189. app-ng-runtime/components/containers/panel/esm2022/panel.module.mjs +2 -2
  190. app-ng-runtime/components/containers/panel/fesm2022/index.mjs +83 -84
  191. app-ng-runtime/components/containers/panel/fesm2022/index.mjs.map +1 -1
  192. app-ng-runtime/components/containers/panel/panel.component.d.ts +3 -3
  193. app-ng-runtime/components/containers/tabs/bundles/index.umd.js +63 -74
  194. app-ng-runtime/components/containers/tabs/esm2022/tab-pane/tab-pane.component.mjs +8 -14
  195. app-ng-runtime/components/containers/tabs/esm2022/tab-pane/tab-pane.props.mjs +4 -4
  196. app-ng-runtime/components/containers/tabs/esm2022/tabs.animator.mjs +1 -1
  197. app-ng-runtime/components/containers/tabs/esm2022/tabs.component.mjs +51 -57
  198. app-ng-runtime/components/containers/tabs/esm2022/tabs.module.mjs +2 -2
  199. app-ng-runtime/components/containers/tabs/esm2022/tabs.props.mjs +1 -1
  200. app-ng-runtime/components/containers/tabs/fesm2022/index.mjs +61 -73
  201. app-ng-runtime/components/containers/tabs/fesm2022/index.mjs.map +1 -1
  202. app-ng-runtime/components/containers/tabs/tab-pane/tab-pane.component.d.ts +2 -2
  203. app-ng-runtime/components/containers/tabs/tabs.component.d.ts +2 -2
  204. app-ng-runtime/components/containers/tile/bundles/index.umd.js +6 -11
  205. app-ng-runtime/components/containers/tile/esm2022/tile.directive.mjs +7 -12
  206. app-ng-runtime/components/containers/tile/esm2022/tile.module.mjs +2 -2
  207. app-ng-runtime/components/containers/tile/fesm2022/index.mjs +8 -13
  208. app-ng-runtime/components/containers/tile/fesm2022/index.mjs.map +1 -1
  209. app-ng-runtime/components/containers/tile/tile.directive.d.ts +2 -2
  210. app-ng-runtime/components/containers/wizard/bundles/index.umd.js +98 -102
  211. app-ng-runtime/components/containers/wizard/esm2022/wizard-step/wizard-step.directive.mjs +8 -13
  212. app-ng-runtime/components/containers/wizard/esm2022/wizard.component.mjs +93 -92
  213. app-ng-runtime/components/containers/wizard/esm2022/wizard.module.mjs +2 -2
  214. app-ng-runtime/components/containers/wizard/fesm2022/index.mjs +100 -104
  215. app-ng-runtime/components/containers/wizard/fesm2022/index.mjs.map +1 -1
  216. app-ng-runtime/components/containers/wizard/wizard-step/wizard-step.directive.d.ts +2 -2
  217. app-ng-runtime/components/containers/wizard/wizard.component.d.ts +2 -2
  218. app-ng-runtime/components/data/card/bundles/index.umd.js +50 -70
  219. app-ng-runtime/components/data/card/card-actions/card-actions.directive.d.ts +2 -2
  220. app-ng-runtime/components/data/card/card-content/card-content.component.d.ts +2 -2
  221. app-ng-runtime/components/data/card/card-footer/card-footer.directive.d.ts +2 -2
  222. app-ng-runtime/components/data/card/card.component.d.ts +2 -2
  223. app-ng-runtime/components/data/card/esm2022/card-actions/card-actions.directive.mjs +7 -12
  224. app-ng-runtime/components/data/card/esm2022/card-content/card-content.component.mjs +9 -15
  225. app-ng-runtime/components/data/card/esm2022/card-footer/card-footer.directive.mjs +7 -12
  226. app-ng-runtime/components/data/card/esm2022/card.component.mjs +34 -38
  227. app-ng-runtime/components/data/card/esm2022/card.module.mjs +2 -2
  228. app-ng-runtime/components/data/card/fesm2022/index.mjs +52 -72
  229. app-ng-runtime/components/data/card/fesm2022/index.mjs.map +1 -1
  230. app-ng-runtime/components/data/form/bundles/index.umd.js +188 -202
  231. app-ng-runtime/components/data/form/esm2022/form-action/form-action.directive.mjs +9 -15
  232. app-ng-runtime/components/data/form/esm2022/form-field/form-field.directive.mjs +16 -21
  233. app-ng-runtime/components/data/form/esm2022/form-field/form-field.props.mjs +1 -1
  234. app-ng-runtime/components/data/form/esm2022/form-widget.directive.mjs +4 -4
  235. app-ng-runtime/components/data/form/esm2022/form.component.mjs +135 -139
  236. app-ng-runtime/components/data/form/esm2022/form.module.mjs +2 -2
  237. app-ng-runtime/components/data/form/esm2022/form.props.mjs +1 -1
  238. app-ng-runtime/components/data/form/esm2022/live-actions/dependson.directive.mjs +4 -4
  239. app-ng-runtime/components/data/form/esm2022/live-actions/live-actions.directive.mjs +4 -4
  240. app-ng-runtime/components/data/form/esm2022/live-filter/live-filter.directive.mjs +6 -7
  241. app-ng-runtime/components/data/form/esm2022/live-form/live-form.directive.mjs +15 -18
  242. app-ng-runtime/components/data/form/fesm2022/index.mjs +191 -206
  243. app-ng-runtime/components/data/form/fesm2022/index.mjs.map +1 -1
  244. app-ng-runtime/components/data/form/form-action/form-action.directive.d.ts +2 -2
  245. app-ng-runtime/components/data/form/form-field/form-field.directive.d.ts +2 -2
  246. app-ng-runtime/components/data/form/form.component.d.ts +4 -4
  247. app-ng-runtime/components/data/form/live-form/live-form.directive.d.ts +1 -1
  248. app-ng-runtime/components/data/list/bundles/index.umd.js +772 -780
  249. app-ng-runtime/components/data/list/esm2022/list-item.directive.mjs +4 -4
  250. app-ng-runtime/components/data/list/esm2022/list.animator.mjs +3 -5
  251. app-ng-runtime/components/data/list/esm2022/list.component.mjs +764 -772
  252. app-ng-runtime/components/data/list/esm2022/list.module.mjs +2 -2
  253. app-ng-runtime/components/data/list/fesm2022/index.mjs +770 -779
  254. app-ng-runtime/components/data/list/fesm2022/index.mjs.map +1 -1
  255. app-ng-runtime/components/data/list/list.component.d.ts +54 -55
  256. app-ng-runtime/components/data/live-table/bundles/index.umd.js +7 -13
  257. app-ng-runtime/components/data/live-table/esm2022/live-table.component.mjs +8 -14
  258. app-ng-runtime/components/data/live-table/esm2022/live-table.module.mjs +2 -2
  259. app-ng-runtime/components/data/live-table/fesm2022/index.mjs +9 -15
  260. app-ng-runtime/components/data/live-table/fesm2022/index.mjs.map +1 -1
  261. app-ng-runtime/components/data/live-table/live-table.component.d.ts +2 -2
  262. app-ng-runtime/components/data/pagination/bundles/index.umd.js +110 -113
  263. app-ng-runtime/components/data/pagination/esm2022/pagination.component.mjs +107 -111
  264. app-ng-runtime/components/data/pagination/esm2022/pagination.module.mjs +2 -2
  265. app-ng-runtime/components/data/pagination/fesm2022/index.mjs +108 -112
  266. app-ng-runtime/components/data/pagination/fesm2022/index.mjs.map +1 -1
  267. app-ng-runtime/components/data/pagination/pagination.component.d.ts +2 -2
  268. app-ng-runtime/components/data/table/bundles/index.umd.js +269 -314
  269. app-ng-runtime/components/data/table/esm2022/table-action/table-action.directive.mjs +9 -15
  270. app-ng-runtime/components/data/table/esm2022/table-column/table-column.directive.mjs +25 -40
  271. app-ng-runtime/components/data/table/esm2022/table-column/table-column.props.mjs +2 -2
  272. app-ng-runtime/components/data/table/esm2022/table-column-group/table-column-group.directive.mjs +8 -13
  273. app-ng-runtime/components/data/table/esm2022/table-cud.directive.mjs +9 -10
  274. app-ng-runtime/components/data/table/esm2022/table-filter.directive.mjs +58 -56
  275. app-ng-runtime/components/data/table/esm2022/table-row/table-row.directive.mjs +8 -13
  276. app-ng-runtime/components/data/table/esm2022/table-row-action/table-row-action.directive.mjs +8 -14
  277. app-ng-runtime/components/data/table/esm2022/table.component.mjs +150 -165
  278. app-ng-runtime/components/data/table/esm2022/table.module.mjs +2 -2
  279. app-ng-runtime/components/data/table/esm2022/table.props.mjs +2 -2
  280. app-ng-runtime/components/data/table/fesm2022/index.mjs +267 -313
  281. app-ng-runtime/components/data/table/fesm2022/index.mjs.map +1 -1
  282. app-ng-runtime/components/data/table/table-action/table-action.directive.d.ts +2 -2
  283. app-ng-runtime/components/data/table/table-column/table-column.directive.d.ts +8 -8
  284. app-ng-runtime/components/data/table/table-column-group/table-column-group.directive.d.ts +2 -2
  285. app-ng-runtime/components/data/table/table-row/table-row.directive.d.ts +2 -2
  286. app-ng-runtime/components/data/table/table-row-action/table-row-action.directive.d.ts +2 -2
  287. app-ng-runtime/components/data/table/table.component.d.ts +4 -4
  288. app-ng-runtime/components/dialogs/alert-dialog/alert-dialog.component.d.ts +2 -2
  289. app-ng-runtime/components/dialogs/alert-dialog/bundles/index.umd.js +9 -15
  290. app-ng-runtime/components/dialogs/alert-dialog/esm2022/alert-dialog.component.mjs +10 -16
  291. app-ng-runtime/components/dialogs/alert-dialog/esm2022/alert-dialog.module.mjs +2 -2
  292. app-ng-runtime/components/dialogs/alert-dialog/fesm2022/index.mjs +11 -17
  293. app-ng-runtime/components/dialogs/alert-dialog/fesm2022/index.mjs.map +1 -1
  294. app-ng-runtime/components/dialogs/confirm-dialog/bundles/index.umd.js +11 -17
  295. app-ng-runtime/components/dialogs/confirm-dialog/confirm-dialog.component.d.ts +2 -2
  296. app-ng-runtime/components/dialogs/confirm-dialog/esm2022/confirm-dialog.component.mjs +12 -18
  297. app-ng-runtime/components/dialogs/confirm-dialog/esm2022/confirm-dialog.module.mjs +2 -2
  298. app-ng-runtime/components/dialogs/confirm-dialog/fesm2022/index.mjs +13 -19
  299. app-ng-runtime/components/dialogs/confirm-dialog/fesm2022/index.mjs.map +1 -1
  300. app-ng-runtime/components/dialogs/default/base-dialog.d.ts +2 -2
  301. app-ng-runtime/components/dialogs/default/bundles/index.umd.js +71 -75
  302. app-ng-runtime/components/dialogs/default/dialog-footer/dialog-footer.directive.d.ts +2 -2
  303. app-ng-runtime/components/dialogs/default/esm2022/base-dialog.mjs +9 -14
  304. app-ng-runtime/components/dialogs/default/esm2022/dialog-body/dialog-body.directive.mjs +4 -4
  305. app-ng-runtime/components/dialogs/default/esm2022/dialog-footer/dialog-footer.directive.mjs +7 -12
  306. app-ng-runtime/components/dialogs/default/esm2022/dialog-header/dialog-header.component.mjs +55 -49
  307. app-ng-runtime/components/dialogs/default/esm2022/dialog.module.mjs +2 -2
  308. app-ng-runtime/components/dialogs/default/fesm2022/index.mjs +72 -76
  309. app-ng-runtime/components/dialogs/default/fesm2022/index.mjs.map +1 -1
  310. app-ng-runtime/components/dialogs/design-dialog/bundles/index.umd.js +14 -20
  311. app-ng-runtime/components/dialogs/design-dialog/dialog.component.d.ts +2 -2
  312. app-ng-runtime/components/dialogs/design-dialog/esm2022/design-dialog.module.mjs +2 -2
  313. app-ng-runtime/components/dialogs/design-dialog/esm2022/dialog.component.mjs +15 -21
  314. app-ng-runtime/components/dialogs/design-dialog/fesm2022/index.mjs +16 -22
  315. app-ng-runtime/components/dialogs/design-dialog/fesm2022/index.mjs.map +1 -1
  316. app-ng-runtime/components/dialogs/iframe-dialog/bundles/index.umd.js +14 -20
  317. app-ng-runtime/components/dialogs/iframe-dialog/esm2022/iframe-dialog.component.mjs +15 -21
  318. app-ng-runtime/components/dialogs/iframe-dialog/esm2022/iframe-dialog.module.mjs +2 -2
  319. app-ng-runtime/components/dialogs/iframe-dialog/fesm2022/index.mjs +16 -22
  320. app-ng-runtime/components/dialogs/iframe-dialog/fesm2022/index.mjs.map +1 -1
  321. app-ng-runtime/components/dialogs/iframe-dialog/iframe-dialog.component.d.ts +2 -2
  322. app-ng-runtime/components/dialogs/login-dialog/bundles/index.umd.js +4 -4
  323. app-ng-runtime/components/dialogs/login-dialog/esm2022/login-dialog.directive.mjs +4 -4
  324. app-ng-runtime/components/dialogs/login-dialog/esm2022/login-dialog.module.mjs +2 -2
  325. app-ng-runtime/components/dialogs/login-dialog/fesm2022/index.mjs +4 -4
  326. app-ng-runtime/components/dialogs/login-dialog/fesm2022/index.mjs.map +1 -1
  327. app-ng-runtime/components/dialogs/partial-dialog/bundles/index.umd.js +10 -16
  328. app-ng-runtime/components/dialogs/partial-dialog/esm2022/partial-dialog.component.mjs +11 -17
  329. app-ng-runtime/components/dialogs/partial-dialog/esm2022/partial-dialog.module.mjs +2 -2
  330. app-ng-runtime/components/dialogs/partial-dialog/fesm2022/index.mjs +12 -18
  331. app-ng-runtime/components/dialogs/partial-dialog/fesm2022/index.mjs.map +1 -1
  332. app-ng-runtime/components/dialogs/partial-dialog/partial-dialog.component.d.ts +2 -2
  333. app-ng-runtime/components/input/calendar/bundles/index.umd.js +38 -46
  334. app-ng-runtime/components/input/calendar/calendar.component.d.ts +2 -2
  335. app-ng-runtime/components/input/calendar/esm2022/calendar.component.mjs +35 -44
  336. app-ng-runtime/components/input/calendar/esm2022/calendar.module.mjs +2 -2
  337. app-ng-runtime/components/input/calendar/fesm2022/index.mjs +36 -45
  338. app-ng-runtime/components/input/calendar/fesm2022/index.mjs.map +1 -1
  339. app-ng-runtime/components/input/chips/bundles/index.umd.js +61 -69
  340. app-ng-runtime/components/input/chips/chips.component.d.ts +3 -3
  341. app-ng-runtime/components/input/chips/esm2022/chips.component.mjs +58 -67
  342. app-ng-runtime/components/input/chips/esm2022/chips.module.mjs +2 -2
  343. app-ng-runtime/components/input/chips/fesm2022/index.mjs +58 -67
  344. app-ng-runtime/components/input/chips/fesm2022/index.mjs.map +1 -1
  345. app-ng-runtime/components/input/color-picker/bundles/index.umd.js +12 -25
  346. app-ng-runtime/components/input/color-picker/color-picker.component.d.ts +2 -2
  347. app-ng-runtime/components/input/color-picker/esm2022/color-picker.component.mjs +13 -26
  348. app-ng-runtime/components/input/color-picker/esm2022/color-picker.module.mjs +2 -2
  349. app-ng-runtime/components/input/color-picker/fesm2022/index.mjs +13 -26
  350. app-ng-runtime/components/input/color-picker/fesm2022/index.mjs.map +1 -1
  351. app-ng-runtime/components/input/currency/bundles/index.umd.js +11 -18
  352. app-ng-runtime/components/input/currency/currency.component.d.ts +2 -2
  353. app-ng-runtime/components/input/currency/esm2022/currency.component.mjs +12 -19
  354. app-ng-runtime/components/input/currency/esm2022/currency.module.mjs +2 -2
  355. app-ng-runtime/components/input/currency/fesm2022/index.mjs +12 -19
  356. app-ng-runtime/components/input/currency/fesm2022/index.mjs.map +1 -1
  357. app-ng-runtime/components/input/default/base-form.component.d.ts +3 -3
  358. app-ng-runtime/components/input/default/bundles/index.umd.js +487 -610
  359. app-ng-runtime/components/input/default/button/button.component.d.ts +2 -2
  360. app-ng-runtime/components/input/default/button-group/button-group.directive.d.ts +2 -2
  361. app-ng-runtime/components/input/default/checkbox/checkbox.component.d.ts +2 -3
  362. app-ng-runtime/components/input/default/checkboxset/checkboxset.component.d.ts +2 -2
  363. app-ng-runtime/components/input/default/composite/composite.directive.d.ts +2 -2
  364. app-ng-runtime/components/input/default/dataset-aware-form.component.d.ts +4 -4
  365. app-ng-runtime/components/input/default/esm2022/base-form-custom.component.mjs +3 -3
  366. app-ng-runtime/components/input/default/esm2022/base-form.component.mjs +11 -17
  367. app-ng-runtime/components/input/default/esm2022/button/button.component.mjs +28 -32
  368. app-ng-runtime/components/input/default/esm2022/button-group/button-group.directive.mjs +7 -12
  369. app-ng-runtime/components/input/default/esm2022/caption-position.directive.mjs +6 -6
  370. app-ng-runtime/components/input/default/esm2022/checkbox/checkbox.component.mjs +17 -27
  371. app-ng-runtime/components/input/default/esm2022/checkboxset/checkboxset.component.mjs +103 -107
  372. app-ng-runtime/components/input/default/esm2022/composite/composite.directive.mjs +7 -12
  373. app-ng-runtime/components/input/default/esm2022/dataset-aware-form.component.mjs +26 -32
  374. app-ng-runtime/components/input/default/esm2022/input.module.mjs +2 -2
  375. app-ng-runtime/components/input/default/esm2022/number/number.component.mjs +10 -17
  376. app-ng-runtime/components/input/default/esm2022/radioset/radioset.component.mjs +102 -105
  377. app-ng-runtime/components/input/default/esm2022/select/select.component.mjs +68 -70
  378. app-ng-runtime/components/input/default/esm2022/switch/switch.component.mjs +31 -38
  379. app-ng-runtime/components/input/default/esm2022/text/base/base-input.mjs +11 -18
  380. app-ng-runtime/components/input/default/esm2022/text/calendar/input-calendar.component.mjs +12 -23
  381. app-ng-runtime/components/input/default/esm2022/text/color/input-color.component.mjs +12 -23
  382. app-ng-runtime/components/input/default/esm2022/text/email/input-email.component.mjs +11 -20
  383. app-ng-runtime/components/input/default/esm2022/text/locale/number-locale.mjs +24 -35
  384. app-ng-runtime/components/input/default/esm2022/text/number/input-number.component.mjs +12 -21
  385. app-ng-runtime/components/input/default/esm2022/text/text/input-text.component.mjs +11 -20
  386. app-ng-runtime/components/input/default/esm2022/textarea/textarea.component.mjs +12 -21
  387. app-ng-runtime/components/input/default/fesm2022/index.mjs +488 -613
  388. app-ng-runtime/components/input/default/fesm2022/index.mjs.map +1 -1
  389. app-ng-runtime/components/input/default/number/number.component.d.ts +2 -2
  390. app-ng-runtime/components/input/default/radioset/radioset.component.d.ts +2 -2
  391. app-ng-runtime/components/input/default/select/select.component.d.ts +4 -3
  392. app-ng-runtime/components/input/default/switch/switch.component.d.ts +2 -2
  393. app-ng-runtime/components/input/default/text/base/base-input.d.ts +2 -3
  394. app-ng-runtime/components/input/default/text/calendar/input-calendar.component.d.ts +2 -2
  395. app-ng-runtime/components/input/default/text/color/input-color.component.d.ts +2 -2
  396. app-ng-runtime/components/input/default/text/email/input-email.component.d.ts +2 -2
  397. app-ng-runtime/components/input/default/text/locale/number-locale.d.ts +1 -1
  398. app-ng-runtime/components/input/default/text/number/input-number.component.d.ts +2 -2
  399. app-ng-runtime/components/input/default/text/text/input-text.component.d.ts +2 -2
  400. app-ng-runtime/components/input/default/textarea/textarea.component.d.ts +2 -2
  401. app-ng-runtime/components/input/epoch/base-date-time.component.d.ts +2 -2
  402. app-ng-runtime/components/input/epoch/bundles/index.umd.js +165 -214
  403. app-ng-runtime/components/input/epoch/date/date.component.d.ts +2 -3
  404. app-ng-runtime/components/input/epoch/date-time/date-time.component.d.ts +2 -2
  405. app-ng-runtime/components/input/epoch/esm2022/base-date-time.component.mjs +36 -44
  406. app-ng-runtime/components/input/epoch/esm2022/date/date.component.mjs +22 -36
  407. app-ng-runtime/components/input/epoch/esm2022/date/date.props.mjs +2 -2
  408. app-ng-runtime/components/input/epoch/esm2022/date/imaskUtil.mjs +2 -8
  409. app-ng-runtime/components/input/epoch/esm2022/date-time/date-time-picker.component.mjs +41 -42
  410. app-ng-runtime/components/input/epoch/esm2022/date-time/date-time.component.mjs +37 -49
  411. app-ng-runtime/components/input/epoch/esm2022/epoch.module.mjs +2 -2
  412. app-ng-runtime/components/input/epoch/esm2022/picker/picker.component.mjs +5 -7
  413. app-ng-runtime/components/input/epoch/esm2022/time/time.component.mjs +24 -35
  414. app-ng-runtime/components/input/epoch/fesm2022/index.mjs +161 -211
  415. app-ng-runtime/components/input/epoch/fesm2022/index.mjs.map +1 -1
  416. app-ng-runtime/components/input/epoch/time/time.component.d.ts +2 -2
  417. app-ng-runtime/components/input/file-upload/bundles/index.umd.js +135 -133
  418. app-ng-runtime/components/input/file-upload/esm2022/file-upload.component.mjs +132 -131
  419. app-ng-runtime/components/input/file-upload/esm2022/file-upload.module.mjs +2 -2
  420. app-ng-runtime/components/input/file-upload/fesm2022/index.mjs +133 -132
  421. app-ng-runtime/components/input/file-upload/fesm2022/index.mjs.map +1 -1
  422. app-ng-runtime/components/input/file-upload/file-upload.component.d.ts +2 -2
  423. app-ng-runtime/components/input/rating/bundles/index.umd.js +51 -60
  424. app-ng-runtime/components/input/rating/esm2022/rating.component.mjs +48 -58
  425. app-ng-runtime/components/input/rating/esm2022/rating.module.mjs +2 -2
  426. app-ng-runtime/components/input/rating/fesm2022/index.mjs +48 -58
  427. app-ng-runtime/components/input/rating/fesm2022/index.mjs.map +1 -1
  428. app-ng-runtime/components/input/rating/rating.component.d.ts +2 -2
  429. app-ng-runtime/components/input/slider/bundles/index.umd.js +13 -23
  430. app-ng-runtime/components/input/slider/esm2022/slider.component.mjs +14 -24
  431. app-ng-runtime/components/input/slider/esm2022/slider.module.mjs +2 -2
  432. app-ng-runtime/components/input/slider/fesm2022/index.mjs +14 -24
  433. app-ng-runtime/components/input/slider/fesm2022/index.mjs.map +1 -1
  434. app-ng-runtime/components/input/slider/slider.component.d.ts +2 -2
  435. app-ng-runtime/components/navigation/breadcrumb/breadcrumb.component.d.ts +2 -2
  436. app-ng-runtime/components/navigation/breadcrumb/bundles/index.umd.js +28 -33
  437. app-ng-runtime/components/navigation/breadcrumb/esm2022/breadcrumb.component.mjs +29 -34
  438. app-ng-runtime/components/navigation/breadcrumb/esm2022/breadcrumb.module.mjs +2 -2
  439. app-ng-runtime/components/navigation/breadcrumb/fesm2022/index.mjs +30 -35
  440. app-ng-runtime/components/navigation/breadcrumb/fesm2022/index.mjs.map +1 -1
  441. app-ng-runtime/components/navigation/menu/bundles/index.umd.js +137 -154
  442. app-ng-runtime/components/navigation/menu/esm2022/menu-adapator.component.mjs +7 -13
  443. app-ng-runtime/components/navigation/menu/esm2022/menu-dropdown/menu-dropdown.component.mjs +4 -5
  444. app-ng-runtime/components/navigation/menu/esm2022/menu-dropdown-item/menu-dropdown-item.component.mjs +26 -27
  445. app-ng-runtime/components/navigation/menu/esm2022/menu.component.mjs +40 -44
  446. app-ng-runtime/components/navigation/menu/esm2022/menu.module.mjs +2 -2
  447. app-ng-runtime/components/navigation/menu/esm2022/nav/nav-item/nav-item.directive.mjs +7 -12
  448. app-ng-runtime/components/navigation/menu/esm2022/nav/nav.component.mjs +56 -60
  449. app-ng-runtime/components/navigation/menu/esm2022/nav/navigation-control.directive.mjs +3 -3
  450. app-ng-runtime/components/navigation/menu/fesm2022/index.mjs +135 -153
  451. app-ng-runtime/components/navigation/menu/fesm2022/index.mjs.map +1 -1
  452. app-ng-runtime/components/navigation/menu/menu-adapator.component.d.ts +1 -1
  453. app-ng-runtime/components/navigation/menu/menu-dropdown-item/menu-dropdown-item.component.d.ts +1 -12
  454. app-ng-runtime/components/navigation/menu/menu.component.d.ts +2 -2
  455. app-ng-runtime/components/navigation/menu/nav/nav-item/nav-item.directive.d.ts +2 -2
  456. app-ng-runtime/components/navigation/menu/nav/nav.component.d.ts +2 -2
  457. app-ng-runtime/components/navigation/navbar/bundles/index.umd.js +22 -29
  458. app-ng-runtime/components/navigation/navbar/esm2022/navbar.component.mjs +23 -30
  459. app-ng-runtime/components/navigation/navbar/esm2022/navbar.module.mjs +2 -2
  460. app-ng-runtime/components/navigation/navbar/fesm2022/index.mjs +24 -31
  461. app-ng-runtime/components/navigation/navbar/fesm2022/index.mjs.map +1 -1
  462. app-ng-runtime/components/navigation/navbar/navbar.component.d.ts +2 -2
  463. app-ng-runtime/components/navigation/popover/bundles/index.umd.js +11 -18
  464. app-ng-runtime/components/navigation/popover/esm2022/popover.component.mjs +12 -19
  465. app-ng-runtime/components/navigation/popover/esm2022/popover.module.mjs +2 -2
  466. app-ng-runtime/components/navigation/popover/fesm2022/index.mjs +13 -20
  467. app-ng-runtime/components/navigation/popover/fesm2022/index.mjs.map +1 -1
  468. app-ng-runtime/components/navigation/popover/popover.component.d.ts +2 -2
  469. app-ng-runtime/components/page/default/bundles/index.umd.js +31 -63
  470. app-ng-runtime/components/page/default/content/content.component.d.ts +2 -2
  471. app-ng-runtime/components/page/default/esm2022/content/content.component.mjs +7 -13
  472. app-ng-runtime/components/page/default/esm2022/layout.directive.mjs +7 -12
  473. app-ng-runtime/components/page/default/esm2022/page-content/page-content.component.mjs +7 -13
  474. app-ng-runtime/components/page/default/esm2022/page.directive.mjs +7 -12
  475. app-ng-runtime/components/page/default/esm2022/page.module.mjs +2 -2
  476. app-ng-runtime/components/page/default/esm2022/router-outlet.directive.mjs +7 -12
  477. app-ng-runtime/components/page/default/esm2022/spa-page.directive.mjs +7 -12
  478. app-ng-runtime/components/page/default/fesm2022/index.mjs +33 -65
  479. app-ng-runtime/components/page/default/fesm2022/index.mjs.map +1 -1
  480. app-ng-runtime/components/page/default/layout.directive.d.ts +2 -2
  481. app-ng-runtime/components/page/default/page-content/page-content.component.d.ts +2 -2
  482. app-ng-runtime/components/page/default/page.directive.d.ts +2 -2
  483. app-ng-runtime/components/page/default/router-outlet.directive.d.ts +2 -2
  484. app-ng-runtime/components/page/default/spa-page.directive.d.ts +2 -2
  485. app-ng-runtime/components/page/footer/bundles/index.umd.js +6 -11
  486. app-ng-runtime/components/page/footer/esm2022/footer.directive.mjs +7 -12
  487. app-ng-runtime/components/page/footer/esm2022/footer.module.mjs +2 -2
  488. app-ng-runtime/components/page/footer/fesm2022/index.mjs +8 -13
  489. app-ng-runtime/components/page/footer/fesm2022/index.mjs.map +1 -1
  490. app-ng-runtime/components/page/footer/footer.directive.d.ts +2 -2
  491. app-ng-runtime/components/page/header/bundles/index.umd.js +6 -12
  492. app-ng-runtime/components/page/header/esm2022/header.component.mjs +7 -13
  493. app-ng-runtime/components/page/header/esm2022/header.module.mjs +2 -2
  494. app-ng-runtime/components/page/header/fesm2022/index.mjs +8 -14
  495. app-ng-runtime/components/page/header/fesm2022/index.mjs.map +1 -1
  496. app-ng-runtime/components/page/header/header.component.d.ts +2 -2
  497. app-ng-runtime/components/page/left-panel/bundles/index.umd.js +7 -12
  498. app-ng-runtime/components/page/left-panel/esm2022/left-panel.animator.mjs +1 -1
  499. app-ng-runtime/components/page/left-panel/esm2022/left-panel.directive.mjs +8 -13
  500. app-ng-runtime/components/page/left-panel/esm2022/left-panel.module.mjs +2 -2
  501. app-ng-runtime/components/page/left-panel/fesm2022/index.mjs +9 -14
  502. app-ng-runtime/components/page/left-panel/fesm2022/index.mjs.map +1 -1
  503. app-ng-runtime/components/page/left-panel/left-panel.directive.d.ts +2 -2
  504. app-ng-runtime/components/page/right-panel/bundles/index.umd.js +6 -11
  505. app-ng-runtime/components/page/right-panel/esm2022/right-panel.directive.mjs +7 -12
  506. app-ng-runtime/components/page/right-panel/esm2022/right-panel.module.mjs +2 -2
  507. app-ng-runtime/components/page/right-panel/fesm2022/index.mjs +8 -13
  508. app-ng-runtime/components/page/right-panel/fesm2022/index.mjs.map +1 -1
  509. app-ng-runtime/components/page/right-panel/right-panel.directive.d.ts +2 -2
  510. app-ng-runtime/components/page/top-nav/bundles/index.umd.js +6 -11
  511. app-ng-runtime/components/page/top-nav/esm2022/top-nav.directive.mjs +7 -12
  512. app-ng-runtime/components/page/top-nav/esm2022/top-nav.module.mjs +2 -2
  513. app-ng-runtime/components/page/top-nav/fesm2022/index.mjs +8 -13
  514. app-ng-runtime/components/page/top-nav/fesm2022/index.mjs.map +1 -1
  515. app-ng-runtime/components/page/top-nav/top-nav.directive.d.ts +2 -2
  516. app-ng-runtime/components/prefab/bundles/index.umd.js +18 -28
  517. app-ng-runtime/components/prefab/esm2022/prefab-container/prefab-container.directive.mjs +8 -14
  518. app-ng-runtime/components/prefab/esm2022/prefab.directive.mjs +9 -15
  519. app-ng-runtime/components/prefab/esm2022/prefab.module.mjs +2 -2
  520. app-ng-runtime/components/prefab/fesm2022/index.mjs +15 -26
  521. app-ng-runtime/components/prefab/fesm2022/index.mjs.map +1 -1
  522. app-ng-runtime/components/prefab/prefab-container/prefab-container.directive.d.ts +2 -2
  523. app-ng-runtime/components/prefab/prefab.directive.d.ts +2 -2
  524. app-ng-runtime/core/bundles/index.umd.js +146 -158
  525. app-ng-runtime/core/esm2022/core.module.mjs +2 -2
  526. app-ng-runtime/core/esm2022/public_api.mjs +2 -3
  527. app-ng-runtime/core/esm2022/services/constant.service.mjs +2 -2
  528. app-ng-runtime/core/esm2022/services/field-type.service.mjs +4 -5
  529. app-ng-runtime/core/esm2022/services/field-widget.service.mjs +4 -5
  530. app-ng-runtime/core/esm2022/services/pagination.service.mjs +7 -8
  531. app-ng-runtime/core/esm2022/services/script-loader.service.mjs +3 -3
  532. app-ng-runtime/core/esm2022/services/state-persistence.service.mjs +17 -18
  533. app-ng-runtime/core/esm2022/services/user-custom-pipe-manager.service.mjs +2 -2
  534. app-ng-runtime/core/esm2022/services/utils.service.mjs +4 -5
  535. app-ng-runtime/core/esm2022/services/viewport.service.mjs +4 -5
  536. app-ng-runtime/core/esm2022/utils/build-utils.mjs +4 -5
  537. app-ng-runtime/core/esm2022/utils/dom.mjs +1 -1
  538. app-ng-runtime/core/esm2022/utils/event-notifier.mjs +1 -1
  539. app-ng-runtime/core/esm2022/utils/expression-parser.mjs +5 -6
  540. app-ng-runtime/core/esm2022/utils/id-generator.mjs +1 -1
  541. app-ng-runtime/core/esm2022/utils/lru-cache.mjs +2 -3
  542. app-ng-runtime/core/esm2022/utils/utils.mjs +82 -79
  543. app-ng-runtime/core/esm2022/utils/watcher.mjs +7 -9
  544. app-ng-runtime/core/esm2022/utils/wm-project-properties.mjs +1 -1
  545. app-ng-runtime/core/fesm2022/index.mjs +142 -158
  546. app-ng-runtime/core/fesm2022/index.mjs.map +1 -1
  547. app-ng-runtime/core/public_api.d.ts +1 -2
  548. app-ng-runtime/core/services/pagination.service.d.ts +1 -1
  549. app-ng-runtime/core/utils/utils.d.ts +9 -5
  550. app-ng-runtime/http/bundles/index.umd.js +10 -10
  551. app-ng-runtime/http/esm2022/http-service.module.mjs +2 -2
  552. app-ng-runtime/http/esm2022/http.service.mjs +6 -7
  553. app-ng-runtime/http/esm2022/wm-http-request.mjs +1 -1
  554. app-ng-runtime/http/esm2022/wm-http-response.mjs +1 -1
  555. app-ng-runtime/http/fesm2022/index.mjs +6 -7
  556. app-ng-runtime/http/fesm2022/index.mjs.map +1 -1
  557. app-ng-runtime/locales/angular/global/af-na.js +4 -4
  558. app-ng-runtime/locales/angular/global/af.js +4 -4
  559. app-ng-runtime/locales/angular/global/agq.js +4 -4
  560. app-ng-runtime/locales/angular/global/ak.js +4 -4
  561. app-ng-runtime/locales/angular/global/am.js +4 -4
  562. app-ng-runtime/locales/angular/global/ar-ae.js +4 -4
  563. app-ng-runtime/locales/angular/global/ar-bh.js +4 -4
  564. app-ng-runtime/locales/angular/global/ar-dj.js +4 -4
  565. app-ng-runtime/locales/angular/global/ar-dz.js +4 -4
  566. app-ng-runtime/locales/angular/global/ar-eg.js +4 -4
  567. app-ng-runtime/locales/angular/global/ar-eh.js +4 -4
  568. app-ng-runtime/locales/angular/global/ar-er.js +4 -4
  569. app-ng-runtime/locales/angular/global/ar-il.js +4 -4
  570. app-ng-runtime/locales/angular/global/ar-iq.js +4 -4
  571. app-ng-runtime/locales/angular/global/ar-jo.js +4 -4
  572. app-ng-runtime/locales/angular/global/ar-km.js +4 -4
  573. app-ng-runtime/locales/angular/global/ar-kw.js +4 -4
  574. app-ng-runtime/locales/angular/global/ar-lb.js +4 -4
  575. app-ng-runtime/locales/angular/global/ar-ly.js +4 -4
  576. app-ng-runtime/locales/angular/global/ar-ma.js +4 -4
  577. app-ng-runtime/locales/angular/global/ar-mr.js +4 -4
  578. app-ng-runtime/locales/angular/global/ar-om.js +4 -4
  579. app-ng-runtime/locales/angular/global/ar-ps.js +4 -4
  580. app-ng-runtime/locales/angular/global/ar-qa.js +4 -4
  581. app-ng-runtime/locales/angular/global/ar-sa.js +4 -4
  582. app-ng-runtime/locales/angular/global/ar-sd.js +4 -4
  583. app-ng-runtime/locales/angular/global/ar-so.js +4 -4
  584. app-ng-runtime/locales/angular/global/ar-ss.js +4 -4
  585. app-ng-runtime/locales/angular/global/ar-sy.js +4 -4
  586. app-ng-runtime/locales/angular/global/ar-td.js +4 -4
  587. app-ng-runtime/locales/angular/global/ar-tn.js +4 -4
  588. app-ng-runtime/locales/angular/global/ar-ye.js +4 -4
  589. app-ng-runtime/locales/angular/global/ar.js +4 -4
  590. app-ng-runtime/locales/angular/global/as.js +4 -4
  591. app-ng-runtime/locales/angular/global/asa.js +4 -4
  592. app-ng-runtime/locales/angular/global/ast.js +4 -4
  593. app-ng-runtime/locales/angular/global/az-cyrl.js +4 -4
  594. app-ng-runtime/locales/angular/global/az-latn.js +4 -4
  595. app-ng-runtime/locales/angular/global/az.js +4 -4
  596. app-ng-runtime/locales/angular/global/bas.js +4 -4
  597. app-ng-runtime/locales/angular/global/be-tarask.js +4 -4
  598. app-ng-runtime/locales/angular/global/be.js +4 -4
  599. app-ng-runtime/locales/angular/global/bem.js +4 -4
  600. app-ng-runtime/locales/angular/global/bez.js +4 -4
  601. app-ng-runtime/locales/angular/global/bg.js +4 -4
  602. app-ng-runtime/locales/angular/global/bm.js +4 -4
  603. app-ng-runtime/locales/angular/global/bn-in.js +4 -4
  604. app-ng-runtime/locales/angular/global/bn.js +4 -4
  605. app-ng-runtime/locales/angular/global/bo-in.js +4 -4
  606. app-ng-runtime/locales/angular/global/bo.js +4 -4
  607. app-ng-runtime/locales/angular/global/br.js +4 -4
  608. app-ng-runtime/locales/angular/global/brx.js +4 -4
  609. app-ng-runtime/locales/angular/global/bs-cyrl.js +4 -4
  610. app-ng-runtime/locales/angular/global/bs-latn.js +4 -4
  611. app-ng-runtime/locales/angular/global/bs.js +4 -4
  612. app-ng-runtime/locales/angular/global/ca-ad.js +4 -4
  613. app-ng-runtime/locales/angular/global/ca-es-valencia.js +4 -4
  614. app-ng-runtime/locales/angular/global/ca-fr.js +4 -4
  615. app-ng-runtime/locales/angular/global/ca-it.js +4 -4
  616. app-ng-runtime/locales/angular/global/ca.js +4 -4
  617. app-ng-runtime/locales/angular/global/ccp-in.js +4 -4
  618. app-ng-runtime/locales/angular/global/ccp.js +4 -4
  619. app-ng-runtime/locales/angular/global/ce.js +4 -4
  620. app-ng-runtime/locales/angular/global/ceb.js +4 -4
  621. app-ng-runtime/locales/angular/global/cgg.js +4 -4
  622. app-ng-runtime/locales/angular/global/chr.js +4 -4
  623. app-ng-runtime/locales/angular/global/ckb-ir.js +4 -4
  624. app-ng-runtime/locales/angular/global/ckb.js +4 -4
  625. app-ng-runtime/locales/angular/global/cs.js +4 -4
  626. app-ng-runtime/locales/angular/global/cy.js +4 -4
  627. app-ng-runtime/locales/angular/global/da-gl.js +4 -4
  628. app-ng-runtime/locales/angular/global/da.js +4 -4
  629. app-ng-runtime/locales/angular/global/dav.js +4 -4
  630. app-ng-runtime/locales/angular/global/de-at.js +4 -4
  631. app-ng-runtime/locales/angular/global/de-be.js +4 -4
  632. app-ng-runtime/locales/angular/global/de-ch.js +4 -4
  633. app-ng-runtime/locales/angular/global/de-it.js +4 -4
  634. app-ng-runtime/locales/angular/global/de-li.js +4 -4
  635. app-ng-runtime/locales/angular/global/de-lu.js +4 -4
  636. app-ng-runtime/locales/angular/global/de.js +4 -4
  637. app-ng-runtime/locales/angular/global/dje.js +4 -4
  638. app-ng-runtime/locales/angular/global/doi.js +4 -4
  639. app-ng-runtime/locales/angular/global/dsb.js +4 -4
  640. app-ng-runtime/locales/angular/global/dua.js +4 -4
  641. app-ng-runtime/locales/angular/global/dyo.js +4 -4
  642. app-ng-runtime/locales/angular/global/dz.js +4 -4
  643. app-ng-runtime/locales/angular/global/ebu.js +4 -4
  644. app-ng-runtime/locales/angular/global/ee-tg.js +4 -4
  645. app-ng-runtime/locales/angular/global/ee.js +4 -4
  646. app-ng-runtime/locales/angular/global/el-cy.js +4 -4
  647. app-ng-runtime/locales/angular/global/el.js +4 -4
  648. app-ng-runtime/locales/angular/global/en-001.js +4 -4
  649. app-ng-runtime/locales/angular/global/en-150.js +4 -4
  650. app-ng-runtime/locales/angular/global/en-ae.js +4 -4
  651. app-ng-runtime/locales/angular/global/en-ag.js +4 -4
  652. app-ng-runtime/locales/angular/global/en-ai.js +4 -4
  653. app-ng-runtime/locales/angular/global/en-as.js +4 -4
  654. app-ng-runtime/locales/angular/global/en-at.js +4 -4
  655. app-ng-runtime/locales/angular/global/en-au.js +4 -4
  656. app-ng-runtime/locales/angular/global/en-bb.js +4 -4
  657. app-ng-runtime/locales/angular/global/en-be.js +4 -4
  658. app-ng-runtime/locales/angular/global/en-bi.js +4 -4
  659. app-ng-runtime/locales/angular/global/en-bm.js +4 -4
  660. app-ng-runtime/locales/angular/global/en-bs.js +4 -4
  661. app-ng-runtime/locales/angular/global/en-bw.js +4 -4
  662. app-ng-runtime/locales/angular/global/en-bz.js +4 -4
  663. app-ng-runtime/locales/angular/global/en-ca.js +4 -4
  664. app-ng-runtime/locales/angular/global/en-cc.js +4 -4
  665. app-ng-runtime/locales/angular/global/en-ch.js +4 -4
  666. app-ng-runtime/locales/angular/global/en-ck.js +4 -4
  667. app-ng-runtime/locales/angular/global/en-cm.js +4 -4
  668. app-ng-runtime/locales/angular/global/en-cx.js +4 -4
  669. app-ng-runtime/locales/angular/global/en-cy.js +4 -4
  670. app-ng-runtime/locales/angular/global/en-de.js +4 -4
  671. app-ng-runtime/locales/angular/global/en-dg.js +4 -4
  672. app-ng-runtime/locales/angular/global/en-dk.js +4 -4
  673. app-ng-runtime/locales/angular/global/en-dm.js +4 -4
  674. app-ng-runtime/locales/angular/global/en-er.js +4 -4
  675. app-ng-runtime/locales/angular/global/en-fi.js +4 -4
  676. app-ng-runtime/locales/angular/global/en-fj.js +4 -4
  677. app-ng-runtime/locales/angular/global/en-fk.js +4 -4
  678. app-ng-runtime/locales/angular/global/en-fm.js +4 -4
  679. app-ng-runtime/locales/angular/global/en-gb.js +4 -4
  680. app-ng-runtime/locales/angular/global/en-gd.js +4 -4
  681. app-ng-runtime/locales/angular/global/en-gg.js +4 -4
  682. app-ng-runtime/locales/angular/global/en-gh.js +4 -4
  683. app-ng-runtime/locales/angular/global/en-gi.js +4 -4
  684. app-ng-runtime/locales/angular/global/en-gm.js +4 -4
  685. app-ng-runtime/locales/angular/global/en-gu.js +4 -4
  686. app-ng-runtime/locales/angular/global/en-gy.js +4 -4
  687. app-ng-runtime/locales/angular/global/en-hk.js +4 -4
  688. app-ng-runtime/locales/angular/global/en-ie.js +4 -4
  689. app-ng-runtime/locales/angular/global/en-il.js +4 -4
  690. app-ng-runtime/locales/angular/global/en-im.js +4 -4
  691. app-ng-runtime/locales/angular/global/en-in.js +4 -4
  692. app-ng-runtime/locales/angular/global/en-io.js +4 -4
  693. app-ng-runtime/locales/angular/global/en-je.js +4 -4
  694. app-ng-runtime/locales/angular/global/en-jm.js +4 -4
  695. app-ng-runtime/locales/angular/global/en-ke.js +4 -4
  696. app-ng-runtime/locales/angular/global/en-ki.js +4 -4
  697. app-ng-runtime/locales/angular/global/en-kn.js +4 -4
  698. app-ng-runtime/locales/angular/global/en-ky.js +4 -4
  699. app-ng-runtime/locales/angular/global/en-lc.js +4 -4
  700. app-ng-runtime/locales/angular/global/en-lr.js +4 -4
  701. app-ng-runtime/locales/angular/global/en-ls.js +4 -4
  702. app-ng-runtime/locales/angular/global/en-mg.js +4 -4
  703. app-ng-runtime/locales/angular/global/en-mh.js +4 -4
  704. app-ng-runtime/locales/angular/global/en-mo.js +4 -4
  705. app-ng-runtime/locales/angular/global/en-mp.js +4 -4
  706. app-ng-runtime/locales/angular/global/en-ms.js +4 -4
  707. app-ng-runtime/locales/angular/global/en-mt.js +4 -4
  708. app-ng-runtime/locales/angular/global/en-mu.js +4 -4
  709. app-ng-runtime/locales/angular/global/en-mv.js +4 -4
  710. app-ng-runtime/locales/angular/global/en-mw.js +4 -4
  711. app-ng-runtime/locales/angular/global/en-my.js +4 -4
  712. app-ng-runtime/locales/angular/global/en-na.js +4 -4
  713. app-ng-runtime/locales/angular/global/en-nf.js +4 -4
  714. app-ng-runtime/locales/angular/global/en-ng.js +4 -4
  715. app-ng-runtime/locales/angular/global/en-nl.js +4 -4
  716. app-ng-runtime/locales/angular/global/en-nr.js +4 -4
  717. app-ng-runtime/locales/angular/global/en-nu.js +4 -4
  718. app-ng-runtime/locales/angular/global/en-nz.js +4 -4
  719. app-ng-runtime/locales/angular/global/en-pg.js +4 -4
  720. app-ng-runtime/locales/angular/global/en-ph.js +4 -4
  721. app-ng-runtime/locales/angular/global/en-pk.js +4 -4
  722. app-ng-runtime/locales/angular/global/en-pn.js +4 -4
  723. app-ng-runtime/locales/angular/global/en-pr.js +4 -4
  724. app-ng-runtime/locales/angular/global/en-pw.js +4 -4
  725. app-ng-runtime/locales/angular/global/en-rw.js +4 -4
  726. app-ng-runtime/locales/angular/global/en-sb.js +4 -4
  727. app-ng-runtime/locales/angular/global/en-sc.js +4 -4
  728. app-ng-runtime/locales/angular/global/en-sd.js +4 -4
  729. app-ng-runtime/locales/angular/global/en-se.js +4 -4
  730. app-ng-runtime/locales/angular/global/en-sg.js +4 -4
  731. app-ng-runtime/locales/angular/global/en-sh.js +4 -4
  732. app-ng-runtime/locales/angular/global/en-si.js +4 -4
  733. app-ng-runtime/locales/angular/global/en-sl.js +4 -4
  734. app-ng-runtime/locales/angular/global/en-ss.js +4 -4
  735. app-ng-runtime/locales/angular/global/en-sx.js +4 -4
  736. app-ng-runtime/locales/angular/global/en-sz.js +4 -4
  737. app-ng-runtime/locales/angular/global/en-tc.js +4 -4
  738. app-ng-runtime/locales/angular/global/en-tk.js +4 -4
  739. app-ng-runtime/locales/angular/global/en-to.js +4 -4
  740. app-ng-runtime/locales/angular/global/en-tt.js +4 -4
  741. app-ng-runtime/locales/angular/global/en-tv.js +4 -4
  742. app-ng-runtime/locales/angular/global/en-tz.js +4 -4
  743. app-ng-runtime/locales/angular/global/en-ug.js +4 -4
  744. app-ng-runtime/locales/angular/global/en-um.js +4 -4
  745. app-ng-runtime/locales/angular/global/en-vc.js +4 -4
  746. app-ng-runtime/locales/angular/global/en-vg.js +4 -4
  747. app-ng-runtime/locales/angular/global/en-vi.js +4 -4
  748. app-ng-runtime/locales/angular/global/en-vu.js +4 -4
  749. app-ng-runtime/locales/angular/global/en-ws.js +4 -4
  750. app-ng-runtime/locales/angular/global/en-za.js +4 -4
  751. app-ng-runtime/locales/angular/global/en-zm.js +4 -4
  752. app-ng-runtime/locales/angular/global/en-zw.js +4 -4
  753. app-ng-runtime/locales/angular/global/en.js +4 -4
  754. app-ng-runtime/locales/angular/global/eo.js +4 -4
  755. app-ng-runtime/locales/angular/global/es-419.js +4 -4
  756. app-ng-runtime/locales/angular/global/es-ar.js +4 -4
  757. app-ng-runtime/locales/angular/global/es-bo.js +4 -4
  758. app-ng-runtime/locales/angular/global/es-br.js +4 -4
  759. app-ng-runtime/locales/angular/global/es-bz.js +4 -4
  760. app-ng-runtime/locales/angular/global/es-cl.js +4 -4
  761. app-ng-runtime/locales/angular/global/es-co.js +4 -4
  762. app-ng-runtime/locales/angular/global/es-cr.js +4 -4
  763. app-ng-runtime/locales/angular/global/es-cu.js +4 -4
  764. app-ng-runtime/locales/angular/global/es-do.js +4 -4
  765. app-ng-runtime/locales/angular/global/es-ea.js +4 -4
  766. app-ng-runtime/locales/angular/global/es-ec.js +4 -4
  767. app-ng-runtime/locales/angular/global/es-gq.js +4 -4
  768. app-ng-runtime/locales/angular/global/es-gt.js +4 -4
  769. app-ng-runtime/locales/angular/global/es-hn.js +4 -4
  770. app-ng-runtime/locales/angular/global/es-ic.js +4 -4
  771. app-ng-runtime/locales/angular/global/es-mx.js +4 -4
  772. app-ng-runtime/locales/angular/global/es-ni.js +4 -4
  773. app-ng-runtime/locales/angular/global/es-pa.js +4 -4
  774. app-ng-runtime/locales/angular/global/es-pe.js +4 -4
  775. app-ng-runtime/locales/angular/global/es-ph.js +4 -4
  776. app-ng-runtime/locales/angular/global/es-pr.js +4 -4
  777. app-ng-runtime/locales/angular/global/es-py.js +4 -4
  778. app-ng-runtime/locales/angular/global/es-sv.js +4 -4
  779. app-ng-runtime/locales/angular/global/es-us.js +4 -4
  780. app-ng-runtime/locales/angular/global/es-uy.js +4 -4
  781. app-ng-runtime/locales/angular/global/es-ve.js +4 -4
  782. app-ng-runtime/locales/angular/global/es.js +4 -4
  783. app-ng-runtime/locales/angular/global/et.js +4 -4
  784. app-ng-runtime/locales/angular/global/eu.js +4 -4
  785. app-ng-runtime/locales/angular/global/ewo.js +4 -4
  786. app-ng-runtime/locales/angular/global/fa-af.js +4 -4
  787. app-ng-runtime/locales/angular/global/fa.js +4 -4
  788. app-ng-runtime/locales/angular/global/ff-adlm-bf.js +4 -4
  789. app-ng-runtime/locales/angular/global/ff-adlm-cm.js +4 -4
  790. app-ng-runtime/locales/angular/global/ff-adlm-gh.js +4 -4
  791. app-ng-runtime/locales/angular/global/ff-adlm-gm.js +4 -4
  792. app-ng-runtime/locales/angular/global/ff-adlm-gw.js +4 -4
  793. app-ng-runtime/locales/angular/global/ff-adlm-lr.js +4 -4
  794. app-ng-runtime/locales/angular/global/ff-adlm-mr.js +4 -4
  795. app-ng-runtime/locales/angular/global/ff-adlm-ne.js +4 -4
  796. app-ng-runtime/locales/angular/global/ff-adlm-ng.js +4 -4
  797. app-ng-runtime/locales/angular/global/ff-adlm-sl.js +4 -4
  798. app-ng-runtime/locales/angular/global/ff-adlm-sn.js +4 -4
  799. app-ng-runtime/locales/angular/global/ff-adlm.js +4 -4
  800. app-ng-runtime/locales/angular/global/ff-cm.js +44 -58
  801. app-ng-runtime/locales/angular/global/ff-gn.js +44 -58
  802. app-ng-runtime/locales/angular/global/ff-latn-bf.js +4 -4
  803. app-ng-runtime/locales/angular/global/ff-latn-cm.js +4 -4
  804. app-ng-runtime/locales/angular/global/ff-latn-gh.js +4 -4
  805. app-ng-runtime/locales/angular/global/ff-latn-gm.js +4 -4
  806. app-ng-runtime/locales/angular/global/ff-latn-gn.js +4 -4
  807. app-ng-runtime/locales/angular/global/ff-latn-gw.js +4 -4
  808. app-ng-runtime/locales/angular/global/ff-latn-lr.js +4 -4
  809. app-ng-runtime/locales/angular/global/ff-latn-mr.js +4 -4
  810. app-ng-runtime/locales/angular/global/ff-latn-ne.js +4 -4
  811. app-ng-runtime/locales/angular/global/ff-latn-ng.js +4 -4
  812. app-ng-runtime/locales/angular/global/ff-latn-sl.js +4 -4
  813. app-ng-runtime/locales/angular/global/ff-latn.js +4 -4
  814. app-ng-runtime/locales/angular/global/ff-mr.js +44 -58
  815. app-ng-runtime/locales/angular/global/ff.js +4 -4
  816. app-ng-runtime/locales/angular/global/fi.js +4 -4
  817. app-ng-runtime/locales/angular/global/fil.js +4 -4
  818. app-ng-runtime/locales/angular/global/fo-dk.js +4 -4
  819. app-ng-runtime/locales/angular/global/fo.js +4 -4
  820. app-ng-runtime/locales/angular/global/fr-be.js +4 -4
  821. app-ng-runtime/locales/angular/global/fr-bf.js +4 -4
  822. app-ng-runtime/locales/angular/global/fr-bi.js +4 -4
  823. app-ng-runtime/locales/angular/global/fr-bj.js +4 -4
  824. app-ng-runtime/locales/angular/global/fr-bl.js +4 -4
  825. app-ng-runtime/locales/angular/global/fr-ca.js +4 -4
  826. app-ng-runtime/locales/angular/global/fr-cd.js +4 -4
  827. app-ng-runtime/locales/angular/global/fr-cf.js +4 -4
  828. app-ng-runtime/locales/angular/global/fr-cg.js +4 -4
  829. app-ng-runtime/locales/angular/global/fr-ch.js +4 -4
  830. app-ng-runtime/locales/angular/global/fr-ci.js +4 -4
  831. app-ng-runtime/locales/angular/global/fr-cm.js +4 -4
  832. app-ng-runtime/locales/angular/global/fr-dj.js +4 -4
  833. app-ng-runtime/locales/angular/global/fr-dz.js +4 -4
  834. app-ng-runtime/locales/angular/global/fr-ga.js +4 -4
  835. app-ng-runtime/locales/angular/global/fr-gf.js +4 -4
  836. app-ng-runtime/locales/angular/global/fr-gn.js +4 -4
  837. app-ng-runtime/locales/angular/global/fr-gp.js +4 -4
  838. app-ng-runtime/locales/angular/global/fr-gq.js +4 -4
  839. app-ng-runtime/locales/angular/global/fr-ht.js +4 -4
  840. app-ng-runtime/locales/angular/global/fr-km.js +4 -4
  841. app-ng-runtime/locales/angular/global/fr-lu.js +4 -4
  842. app-ng-runtime/locales/angular/global/fr-ma.js +4 -4
  843. app-ng-runtime/locales/angular/global/fr-mc.js +4 -4
  844. app-ng-runtime/locales/angular/global/fr-mf.js +4 -4
  845. app-ng-runtime/locales/angular/global/fr-mg.js +4 -4
  846. app-ng-runtime/locales/angular/global/fr-ml.js +4 -4
  847. app-ng-runtime/locales/angular/global/fr-mq.js +4 -4
  848. app-ng-runtime/locales/angular/global/fr-mr.js +4 -4
  849. app-ng-runtime/locales/angular/global/fr-mu.js +4 -4
  850. app-ng-runtime/locales/angular/global/fr-nc.js +4 -4
  851. app-ng-runtime/locales/angular/global/fr-ne.js +4 -4
  852. app-ng-runtime/locales/angular/global/fr-pf.js +4 -4
  853. app-ng-runtime/locales/angular/global/fr-pm.js +4 -4
  854. app-ng-runtime/locales/angular/global/fr-re.js +4 -4
  855. app-ng-runtime/locales/angular/global/fr-rw.js +4 -4
  856. app-ng-runtime/locales/angular/global/fr-sc.js +4 -4
  857. app-ng-runtime/locales/angular/global/fr-sn.js +4 -4
  858. app-ng-runtime/locales/angular/global/fr-sy.js +4 -4
  859. app-ng-runtime/locales/angular/global/fr-td.js +4 -4
  860. app-ng-runtime/locales/angular/global/fr-tg.js +4 -4
  861. app-ng-runtime/locales/angular/global/fr-tn.js +4 -4
  862. app-ng-runtime/locales/angular/global/fr-vu.js +4 -4
  863. app-ng-runtime/locales/angular/global/fr-wf.js +4 -4
  864. app-ng-runtime/locales/angular/global/fr-yt.js +4 -4
  865. app-ng-runtime/locales/angular/global/fr.js +4 -4
  866. app-ng-runtime/locales/angular/global/fur.js +4 -4
  867. app-ng-runtime/locales/angular/global/fy.js +4 -4
  868. app-ng-runtime/locales/angular/global/ga-gb.js +4 -4
  869. app-ng-runtime/locales/angular/global/ga.js +4 -4
  870. app-ng-runtime/locales/angular/global/gd.js +4 -4
  871. app-ng-runtime/locales/angular/global/gl.js +4 -4
  872. app-ng-runtime/locales/angular/global/gsw-fr.js +4 -4
  873. app-ng-runtime/locales/angular/global/gsw-li.js +4 -4
  874. app-ng-runtime/locales/angular/global/gsw.js +4 -4
  875. app-ng-runtime/locales/angular/global/gu.js +4 -4
  876. app-ng-runtime/locales/angular/global/guz.js +4 -4
  877. app-ng-runtime/locales/angular/global/gv.js +4 -4
  878. app-ng-runtime/locales/angular/global/ha-gh.js +4 -4
  879. app-ng-runtime/locales/angular/global/ha-ne.js +4 -4
  880. app-ng-runtime/locales/angular/global/ha.js +4 -4
  881. app-ng-runtime/locales/angular/global/haw.js +4 -4
  882. app-ng-runtime/locales/angular/global/he.js +4 -4
  883. app-ng-runtime/locales/angular/global/hi-latn.js +4 -4
  884. app-ng-runtime/locales/angular/global/hi.js +4 -4
  885. app-ng-runtime/locales/angular/global/hr-ba.js +4 -4
  886. app-ng-runtime/locales/angular/global/hr.js +4 -4
  887. app-ng-runtime/locales/angular/global/hsb.js +4 -4
  888. app-ng-runtime/locales/angular/global/hu.js +4 -4
  889. app-ng-runtime/locales/angular/global/hy.js +4 -4
  890. app-ng-runtime/locales/angular/global/ia.js +4 -4
  891. app-ng-runtime/locales/angular/global/id.js +4 -4
  892. app-ng-runtime/locales/angular/global/ig.js +4 -4
  893. app-ng-runtime/locales/angular/global/ii.js +4 -4
  894. app-ng-runtime/locales/angular/global/is.js +4 -4
  895. app-ng-runtime/locales/angular/global/it-ch.js +4 -4
  896. app-ng-runtime/locales/angular/global/it-sm.js +4 -4
  897. app-ng-runtime/locales/angular/global/it-va.js +4 -4
  898. app-ng-runtime/locales/angular/global/it.js +4 -4
  899. app-ng-runtime/locales/angular/global/ja.js +4 -4
  900. app-ng-runtime/locales/angular/global/jgo.js +4 -4
  901. app-ng-runtime/locales/angular/global/jmc.js +4 -4
  902. app-ng-runtime/locales/angular/global/jv.js +4 -4
  903. app-ng-runtime/locales/angular/global/ka.js +4 -4
  904. app-ng-runtime/locales/angular/global/kab.js +4 -4
  905. app-ng-runtime/locales/angular/global/kam.js +4 -4
  906. app-ng-runtime/locales/angular/global/kde.js +4 -4
  907. app-ng-runtime/locales/angular/global/kea.js +4 -4
  908. app-ng-runtime/locales/angular/global/kgp.js +4 -4
  909. app-ng-runtime/locales/angular/global/khq.js +4 -4
  910. app-ng-runtime/locales/angular/global/ki.js +4 -4
  911. app-ng-runtime/locales/angular/global/kk.js +4 -4
  912. app-ng-runtime/locales/angular/global/kkj.js +4 -4
  913. app-ng-runtime/locales/angular/global/kl.js +4 -4
  914. app-ng-runtime/locales/angular/global/kln.js +4 -4
  915. app-ng-runtime/locales/angular/global/km.js +4 -4
  916. app-ng-runtime/locales/angular/global/kn.js +4 -4
  917. app-ng-runtime/locales/angular/global/ko-kp.js +4 -4
  918. app-ng-runtime/locales/angular/global/ko.js +4 -4
  919. app-ng-runtime/locales/angular/global/kok.js +4 -4
  920. app-ng-runtime/locales/angular/global/ks-arab.js +4 -4
  921. app-ng-runtime/locales/angular/global/ks-deva.js +4 -4
  922. app-ng-runtime/locales/angular/global/ks.js +4 -4
  923. app-ng-runtime/locales/angular/global/ksb.js +4 -4
  924. app-ng-runtime/locales/angular/global/ksf.js +4 -4
  925. app-ng-runtime/locales/angular/global/ksh.js +4 -4
  926. app-ng-runtime/locales/angular/global/ku.js +4 -4
  927. app-ng-runtime/locales/angular/global/kw.js +4 -4
  928. app-ng-runtime/locales/angular/global/ky.js +4 -4
  929. app-ng-runtime/locales/angular/global/lag.js +4 -4
  930. app-ng-runtime/locales/angular/global/lb.js +4 -4
  931. app-ng-runtime/locales/angular/global/lg.js +4 -4
  932. app-ng-runtime/locales/angular/global/lkt.js +4 -4
  933. app-ng-runtime/locales/angular/global/ln-ao.js +4 -4
  934. app-ng-runtime/locales/angular/global/ln-cf.js +4 -4
  935. app-ng-runtime/locales/angular/global/ln-cg.js +4 -4
  936. app-ng-runtime/locales/angular/global/ln.js +4 -4
  937. app-ng-runtime/locales/angular/global/lo.js +4 -4
  938. app-ng-runtime/locales/angular/global/lrc-iq.js +4 -4
  939. app-ng-runtime/locales/angular/global/lrc.js +4 -4
  940. app-ng-runtime/locales/angular/global/lt.js +4 -4
  941. app-ng-runtime/locales/angular/global/lu.js +4 -4
  942. app-ng-runtime/locales/angular/global/luo.js +4 -4
  943. app-ng-runtime/locales/angular/global/luy.js +4 -4
  944. app-ng-runtime/locales/angular/global/lv.js +4 -4
  945. app-ng-runtime/locales/angular/global/mai.js +4 -4
  946. app-ng-runtime/locales/angular/global/mas-tz.js +4 -4
  947. app-ng-runtime/locales/angular/global/mas.js +4 -4
  948. app-ng-runtime/locales/angular/global/mer.js +4 -4
  949. app-ng-runtime/locales/angular/global/mfe.js +4 -4
  950. app-ng-runtime/locales/angular/global/mg.js +4 -4
  951. app-ng-runtime/locales/angular/global/mgh.js +4 -4
  952. app-ng-runtime/locales/angular/global/mgo.js +4 -4
  953. app-ng-runtime/locales/angular/global/mi.js +4 -4
  954. app-ng-runtime/locales/angular/global/mk.js +4 -4
  955. app-ng-runtime/locales/angular/global/ml.js +4 -4
  956. app-ng-runtime/locales/angular/global/mn.js +4 -4
  957. app-ng-runtime/locales/angular/global/mni-beng.js +4 -4
  958. app-ng-runtime/locales/angular/global/mni.js +4 -4
  959. app-ng-runtime/locales/angular/global/mr.js +4 -4
  960. app-ng-runtime/locales/angular/global/ms-bn.js +4 -4
  961. app-ng-runtime/locales/angular/global/ms-id.js +4 -4
  962. app-ng-runtime/locales/angular/global/ms-sg.js +4 -4
  963. app-ng-runtime/locales/angular/global/ms.js +4 -4
  964. app-ng-runtime/locales/angular/global/mt.js +4 -4
  965. app-ng-runtime/locales/angular/global/mua.js +4 -4
  966. app-ng-runtime/locales/angular/global/my.js +4 -4
  967. app-ng-runtime/locales/angular/global/mzn.js +4 -4
  968. app-ng-runtime/locales/angular/global/naq.js +4 -4
  969. app-ng-runtime/locales/angular/global/nb-sj.js +4 -4
  970. app-ng-runtime/locales/angular/global/nb.js +4 -4
  971. app-ng-runtime/locales/angular/global/nd.js +4 -4
  972. app-ng-runtime/locales/angular/global/nds-nl.js +4 -4
  973. app-ng-runtime/locales/angular/global/nds.js +4 -4
  974. app-ng-runtime/locales/angular/global/ne-in.js +4 -4
  975. app-ng-runtime/locales/angular/global/ne.js +4 -4
  976. app-ng-runtime/locales/angular/global/nl-aw.js +4 -4
  977. app-ng-runtime/locales/angular/global/nl-be.js +4 -4
  978. app-ng-runtime/locales/angular/global/nl-bq.js +4 -4
  979. app-ng-runtime/locales/angular/global/nl-cw.js +4 -4
  980. app-ng-runtime/locales/angular/global/nl-sr.js +4 -4
  981. app-ng-runtime/locales/angular/global/nl-sx.js +4 -4
  982. app-ng-runtime/locales/angular/global/nl.js +4 -4
  983. app-ng-runtime/locales/angular/global/nmg.js +4 -4
  984. app-ng-runtime/locales/angular/global/nn.js +4 -4
  985. app-ng-runtime/locales/angular/global/nnh.js +4 -4
  986. app-ng-runtime/locales/angular/global/no.js +4 -4
  987. app-ng-runtime/locales/angular/global/nus.js +4 -4
  988. app-ng-runtime/locales/angular/global/nyn.js +4 -4
  989. app-ng-runtime/locales/angular/global/om-ke.js +4 -4
  990. app-ng-runtime/locales/angular/global/om.js +4 -4
  991. app-ng-runtime/locales/angular/global/or.js +4 -4
  992. app-ng-runtime/locales/angular/global/os-ru.js +4 -4
  993. app-ng-runtime/locales/angular/global/os.js +4 -4
  994. app-ng-runtime/locales/angular/global/pa-arab.js +4 -4
  995. app-ng-runtime/locales/angular/global/pa-guru.js +4 -4
  996. app-ng-runtime/locales/angular/global/pa.js +4 -4
  997. app-ng-runtime/locales/angular/global/pcm.js +4 -4
  998. app-ng-runtime/locales/angular/global/pl.js +4 -4
  999. app-ng-runtime/locales/angular/global/ps-pk.js +4 -4
  1000. app-ng-runtime/locales/angular/global/ps.js +4 -4
  1001. app-ng-runtime/locales/angular/global/pt-ao.js +4 -4
  1002. app-ng-runtime/locales/angular/global/pt-ch.js +4 -4
  1003. app-ng-runtime/locales/angular/global/pt-cv.js +4 -4
  1004. app-ng-runtime/locales/angular/global/pt-gq.js +4 -4
  1005. app-ng-runtime/locales/angular/global/pt-gw.js +4 -4
  1006. app-ng-runtime/locales/angular/global/pt-lu.js +4 -4
  1007. app-ng-runtime/locales/angular/global/pt-mo.js +4 -4
  1008. app-ng-runtime/locales/angular/global/pt-mz.js +4 -4
  1009. app-ng-runtime/locales/angular/global/pt-pt.js +4 -4
  1010. app-ng-runtime/locales/angular/global/pt-st.js +4 -4
  1011. app-ng-runtime/locales/angular/global/pt-tl.js +4 -4
  1012. app-ng-runtime/locales/angular/global/pt.js +4 -4
  1013. app-ng-runtime/locales/angular/global/qu-bo.js +4 -4
  1014. app-ng-runtime/locales/angular/global/qu-ec.js +4 -4
  1015. app-ng-runtime/locales/angular/global/qu.js +4 -4
  1016. app-ng-runtime/locales/angular/global/rm.js +4 -4
  1017. app-ng-runtime/locales/angular/global/rn.js +4 -4
  1018. app-ng-runtime/locales/angular/global/ro-md.js +4 -4
  1019. app-ng-runtime/locales/angular/global/ro.js +4 -4
  1020. app-ng-runtime/locales/angular/global/rof.js +4 -4
  1021. app-ng-runtime/locales/angular/global/ru-by.js +4 -4
  1022. app-ng-runtime/locales/angular/global/ru-kg.js +4 -4
  1023. app-ng-runtime/locales/angular/global/ru-kz.js +4 -4
  1024. app-ng-runtime/locales/angular/global/ru-md.js +4 -4
  1025. app-ng-runtime/locales/angular/global/ru-ua.js +4 -4
  1026. app-ng-runtime/locales/angular/global/ru.js +4 -4
  1027. app-ng-runtime/locales/angular/global/rw.js +4 -4
  1028. app-ng-runtime/locales/angular/global/rwk.js +4 -4
  1029. app-ng-runtime/locales/angular/global/sa.js +4 -4
  1030. app-ng-runtime/locales/angular/global/sah.js +4 -4
  1031. app-ng-runtime/locales/angular/global/saq.js +4 -4
  1032. app-ng-runtime/locales/angular/global/sat-olck.js +4 -4
  1033. app-ng-runtime/locales/angular/global/sat.js +4 -4
  1034. app-ng-runtime/locales/angular/global/sbp.js +4 -4
  1035. app-ng-runtime/locales/angular/global/sc.js +4 -4
  1036. app-ng-runtime/locales/angular/global/sd-arab.js +4 -4
  1037. app-ng-runtime/locales/angular/global/sd-deva.js +4 -4
  1038. app-ng-runtime/locales/angular/global/sd.js +4 -4
  1039. app-ng-runtime/locales/angular/global/se-fi.js +4 -4
  1040. app-ng-runtime/locales/angular/global/se-se.js +4 -4
  1041. app-ng-runtime/locales/angular/global/se.js +4 -4
  1042. app-ng-runtime/locales/angular/global/seh.js +4 -4
  1043. app-ng-runtime/locales/angular/global/ses.js +4 -4
  1044. app-ng-runtime/locales/angular/global/sg.js +4 -4
  1045. app-ng-runtime/locales/angular/global/shi-latn.js +4 -4
  1046. app-ng-runtime/locales/angular/global/shi-tfng.js +4 -4
  1047. app-ng-runtime/locales/angular/global/shi.js +4 -4
  1048. app-ng-runtime/locales/angular/global/si.js +4 -4
  1049. app-ng-runtime/locales/angular/global/sk.js +4 -4
  1050. app-ng-runtime/locales/angular/global/sl.js +4 -4
  1051. app-ng-runtime/locales/angular/global/smn.js +4 -4
  1052. app-ng-runtime/locales/angular/global/sn.js +4 -4
  1053. app-ng-runtime/locales/angular/global/so-dj.js +4 -4
  1054. app-ng-runtime/locales/angular/global/so-et.js +4 -4
  1055. app-ng-runtime/locales/angular/global/so-ke.js +4 -4
  1056. app-ng-runtime/locales/angular/global/so.js +4 -4
  1057. app-ng-runtime/locales/angular/global/sq-mk.js +4 -4
  1058. app-ng-runtime/locales/angular/global/sq-xk.js +4 -4
  1059. app-ng-runtime/locales/angular/global/sq.js +4 -4
  1060. app-ng-runtime/locales/angular/global/sr-cyrl-ba.js +4 -4
  1061. app-ng-runtime/locales/angular/global/sr-cyrl-me.js +4 -4
  1062. app-ng-runtime/locales/angular/global/sr-cyrl-xk.js +4 -4
  1063. app-ng-runtime/locales/angular/global/sr-cyrl.js +4 -4
  1064. app-ng-runtime/locales/angular/global/sr-latn-ba.js +4 -4
  1065. app-ng-runtime/locales/angular/global/sr-latn-me.js +4 -4
  1066. app-ng-runtime/locales/angular/global/sr-latn-xk.js +4 -4
  1067. app-ng-runtime/locales/angular/global/sr-latn.js +4 -4
  1068. app-ng-runtime/locales/angular/global/sr.js +4 -4
  1069. app-ng-runtime/locales/angular/global/su-latn.js +4 -4
  1070. app-ng-runtime/locales/angular/global/su.js +4 -4
  1071. app-ng-runtime/locales/angular/global/sv-ax.js +4 -4
  1072. app-ng-runtime/locales/angular/global/sv-fi.js +4 -4
  1073. app-ng-runtime/locales/angular/global/sv.js +4 -4
  1074. app-ng-runtime/locales/angular/global/sw-cd.js +4 -4
  1075. app-ng-runtime/locales/angular/global/sw-ke.js +4 -4
  1076. app-ng-runtime/locales/angular/global/sw-ug.js +4 -4
  1077. app-ng-runtime/locales/angular/global/sw.js +4 -4
  1078. app-ng-runtime/locales/angular/global/ta-lk.js +4 -4
  1079. app-ng-runtime/locales/angular/global/ta-my.js +4 -4
  1080. app-ng-runtime/locales/angular/global/ta-sg.js +4 -4
  1081. app-ng-runtime/locales/angular/global/ta.js +4 -4
  1082. app-ng-runtime/locales/angular/global/te.js +4 -4
  1083. app-ng-runtime/locales/angular/global/teo-ke.js +4 -4
  1084. app-ng-runtime/locales/angular/global/teo.js +4 -4
  1085. app-ng-runtime/locales/angular/global/tg.js +4 -4
  1086. app-ng-runtime/locales/angular/global/th.js +4 -4
  1087. app-ng-runtime/locales/angular/global/ti-er.js +4 -4
  1088. app-ng-runtime/locales/angular/global/ti.js +4 -4
  1089. app-ng-runtime/locales/angular/global/tk.js +4 -4
  1090. app-ng-runtime/locales/angular/global/to.js +4 -4
  1091. app-ng-runtime/locales/angular/global/tr-cy.js +4 -4
  1092. app-ng-runtime/locales/angular/global/tr.js +4 -4
  1093. app-ng-runtime/locales/angular/global/tt.js +4 -4
  1094. app-ng-runtime/locales/angular/global/twq.js +4 -4
  1095. app-ng-runtime/locales/angular/global/tzm.js +4 -4
  1096. app-ng-runtime/locales/angular/global/ug.js +4 -4
  1097. app-ng-runtime/locales/angular/global/uk.js +4 -4
  1098. app-ng-runtime/locales/angular/global/und.js +4 -4
  1099. app-ng-runtime/locales/angular/global/ur-in.js +4 -4
  1100. app-ng-runtime/locales/angular/global/ur.js +4 -4
  1101. app-ng-runtime/locales/angular/global/uz-arab.js +4 -4
  1102. app-ng-runtime/locales/angular/global/uz-cyrl.js +4 -4
  1103. app-ng-runtime/locales/angular/global/uz-latn.js +4 -4
  1104. app-ng-runtime/locales/angular/global/uz.js +4 -4
  1105. app-ng-runtime/locales/angular/global/vai-latn.js +4 -4
  1106. app-ng-runtime/locales/angular/global/vai-vaii.js +4 -4
  1107. app-ng-runtime/locales/angular/global/vai.js +4 -4
  1108. app-ng-runtime/locales/angular/global/vi.js +4 -4
  1109. app-ng-runtime/locales/angular/global/vun.js +4 -4
  1110. app-ng-runtime/locales/angular/global/wae.js +4 -4
  1111. app-ng-runtime/locales/angular/global/wo.js +4 -4
  1112. app-ng-runtime/locales/angular/global/xh.js +4 -4
  1113. app-ng-runtime/locales/angular/global/xog.js +4 -4
  1114. app-ng-runtime/locales/angular/global/yav.js +4 -4
  1115. app-ng-runtime/locales/angular/global/yi.js +4 -4
  1116. app-ng-runtime/locales/angular/global/yo-bj.js +4 -4
  1117. app-ng-runtime/locales/angular/global/yo.js +4 -4
  1118. app-ng-runtime/locales/angular/global/yrl-co.js +4 -4
  1119. app-ng-runtime/locales/angular/global/yrl-ve.js +4 -4
  1120. app-ng-runtime/locales/angular/global/yrl.js +4 -4
  1121. app-ng-runtime/locales/angular/global/yue-hans.js +4 -4
  1122. app-ng-runtime/locales/angular/global/yue-hant.js +4 -4
  1123. app-ng-runtime/locales/angular/global/yue.js +4 -4
  1124. app-ng-runtime/locales/angular/global/zgh.js +4 -4
  1125. app-ng-runtime/locales/angular/global/zh-hans-hk.js +4 -4
  1126. app-ng-runtime/locales/angular/global/zh-hans-mo.js +4 -4
  1127. app-ng-runtime/locales/angular/global/zh-hans-sg.js +4 -4
  1128. app-ng-runtime/locales/angular/global/zh-hans.js +4 -4
  1129. app-ng-runtime/locales/angular/global/zh-hant-hk.js +4 -4
  1130. app-ng-runtime/locales/angular/global/zh-hant-mo.js +4 -4
  1131. app-ng-runtime/locales/angular/global/zh-hant.js +4 -4
  1132. app-ng-runtime/locales/angular/global/zh.js +4 -4
  1133. app-ng-runtime/locales/angular/global/zu.js +4 -4
  1134. app-ng-runtime/mobile/components/basic/default/bundles/index.umd.js +143 -148
  1135. app-ng-runtime/mobile/components/basic/default/esm2022/anchor/anchor.directive.mjs +7 -8
  1136. app-ng-runtime/mobile/components/basic/default/esm2022/app-update/app-update.component.mjs +6 -7
  1137. app-ng-runtime/mobile/components/basic/default/esm2022/basic.module.mjs +2 -2
  1138. app-ng-runtime/mobile/components/basic/default/esm2022/file-browser/file-browser.component.mjs +43 -47
  1139. app-ng-runtime/mobile/components/basic/default/esm2022/file-browser/file-selector.service.mjs +5 -7
  1140. app-ng-runtime/mobile/components/basic/default/esm2022/image-cache/image-cache.directive.mjs +5 -6
  1141. app-ng-runtime/mobile/components/basic/default/esm2022/network-info-toaster/network-info-toaster.component.mjs +47 -49
  1142. app-ng-runtime/mobile/components/basic/default/esm2022/process-manager/process-management.service.mjs +2 -2
  1143. app-ng-runtime/mobile/components/basic/default/esm2022/process-manager/process-manager.component.mjs +32 -31
  1144. app-ng-runtime/mobile/components/basic/default/fesm2022/index.mjs +140 -146
  1145. app-ng-runtime/mobile/components/basic/default/fesm2022/index.mjs.map +1 -1
  1146. app-ng-runtime/mobile/components/basic/default/network-info-toaster/network-info-toaster.component.d.ts +2 -2
  1147. app-ng-runtime/mobile/components/basic/search/bundles/index.umd.js +3 -3
  1148. app-ng-runtime/mobile/components/basic/search/esm2022/search.directive.mjs +3 -3
  1149. app-ng-runtime/mobile/components/basic/search/esm2022/search.module.mjs +2 -2
  1150. app-ng-runtime/mobile/components/basic/search/fesm2022/index.mjs +3 -3
  1151. app-ng-runtime/mobile/components/basic/search/fesm2022/index.mjs.map +1 -1
  1152. app-ng-runtime/mobile/components/containers/segmented-control/bundles/index.umd.js +30 -42
  1153. app-ng-runtime/mobile/components/containers/segmented-control/esm2022/segment-content/segment-content.component.mjs +8 -14
  1154. app-ng-runtime/mobile/components/containers/segmented-control/esm2022/segmented-control.component.mjs +21 -28
  1155. app-ng-runtime/mobile/components/containers/segmented-control/esm2022/segmented-control.module.mjs +2 -2
  1156. app-ng-runtime/mobile/components/containers/segmented-control/fesm2022/index.mjs +28 -41
  1157. app-ng-runtime/mobile/components/containers/segmented-control/fesm2022/index.mjs.map +1 -1
  1158. app-ng-runtime/mobile/components/containers/segmented-control/segment-content/segment-content.component.d.ts +2 -2
  1159. app-ng-runtime/mobile/components/containers/segmented-control/segmented-control.component.d.ts +2 -2
  1160. app-ng-runtime/mobile/components/data/media-list/bundles/index.umd.js +48 -53
  1161. app-ng-runtime/mobile/components/data/media-list/esm2022/media-list-item/media-list-item.directive.mjs +2 -2
  1162. app-ng-runtime/mobile/components/data/media-list/esm2022/media-list.component.mjs +42 -48
  1163. app-ng-runtime/mobile/components/data/media-list/esm2022/media-list.module.mjs +2 -2
  1164. app-ng-runtime/mobile/components/data/media-list/fesm2022/index.mjs +44 -50
  1165. app-ng-runtime/mobile/components/data/media-list/fesm2022/index.mjs.map +1 -1
  1166. app-ng-runtime/mobile/components/data/media-list/media-list.component.d.ts +2 -2
  1167. app-ng-runtime/mobile/components/device/barcode-scanner/barcode-scanner.component.d.ts +2 -2
  1168. app-ng-runtime/mobile/components/device/barcode-scanner/bundles/index.umd.js +8 -14
  1169. app-ng-runtime/mobile/components/device/barcode-scanner/esm2022/barcode-scanner.component.mjs +9 -15
  1170. app-ng-runtime/mobile/components/device/barcode-scanner/esm2022/barcode-scanner.module.mjs +2 -2
  1171. app-ng-runtime/mobile/components/device/barcode-scanner/fesm2022/index.mjs +10 -16
  1172. app-ng-runtime/mobile/components/device/barcode-scanner/fesm2022/index.mjs.map +1 -1
  1173. app-ng-runtime/mobile/components/device/camera/bundles/index.umd.js +9 -15
  1174. app-ng-runtime/mobile/components/device/camera/camera.component.d.ts +2 -2
  1175. app-ng-runtime/mobile/components/device/camera/esm2022/camera.component.mjs +10 -16
  1176. app-ng-runtime/mobile/components/device/camera/esm2022/camera.module.mjs +2 -2
  1177. app-ng-runtime/mobile/components/device/camera/fesm2022/index.mjs +11 -17
  1178. app-ng-runtime/mobile/components/device/camera/fesm2022/index.mjs.map +1 -1
  1179. app-ng-runtime/mobile/components/input/file-upload/bundles/index.umd.js +3 -3
  1180. app-ng-runtime/mobile/components/input/file-upload/esm2022/file-upload.directive.mjs +3 -3
  1181. app-ng-runtime/mobile/components/input/file-upload/esm2022/file-upload.module.mjs +2 -2
  1182. app-ng-runtime/mobile/components/input/file-upload/fesm2022/index.mjs +3 -3
  1183. app-ng-runtime/mobile/components/input/file-upload/fesm2022/index.mjs.map +1 -1
  1184. app-ng-runtime/mobile/components/page/default/bundles/index.umd.js +10 -11
  1185. app-ng-runtime/mobile/components/page/default/esm2022/page-content-loader/page-content-loader.component.mjs +3 -4
  1186. app-ng-runtime/mobile/components/page/default/esm2022/page.directive.mjs +4 -5
  1187. app-ng-runtime/mobile/components/page/default/esm2022/page.module.mjs +2 -2
  1188. app-ng-runtime/mobile/components/page/default/fesm2022/index.mjs +6 -8
  1189. app-ng-runtime/mobile/components/page/default/fesm2022/index.mjs.map +1 -1
  1190. app-ng-runtime/mobile/components/page/left-panel/bundles/index.umd.js +3 -3
  1191. app-ng-runtime/mobile/components/page/left-panel/esm2022/left-panel.directive.mjs +3 -3
  1192. app-ng-runtime/mobile/components/page/left-panel/esm2022/left-panel.module.mjs +2 -2
  1193. app-ng-runtime/mobile/components/page/left-panel/fesm2022/index.mjs +3 -3
  1194. app-ng-runtime/mobile/components/page/left-panel/fesm2022/index.mjs.map +1 -1
  1195. app-ng-runtime/mobile/components/page/mobile-navbar/bundles/index.umd.js +35 -40
  1196. app-ng-runtime/mobile/components/page/mobile-navbar/esm2022/mobile-navbar.component.mjs +36 -41
  1197. app-ng-runtime/mobile/components/page/mobile-navbar/esm2022/mobile-navbar.module.mjs +2 -2
  1198. app-ng-runtime/mobile/components/page/mobile-navbar/fesm2022/index.mjs +36 -41
  1199. app-ng-runtime/mobile/components/page/mobile-navbar/fesm2022/index.mjs.map +1 -1
  1200. app-ng-runtime/mobile/components/page/mobile-navbar/mobile-navbar.component.d.ts +2 -2
  1201. app-ng-runtime/mobile/components/page/tab-bar/bundles/index.umd.js +46 -52
  1202. app-ng-runtime/mobile/components/page/tab-bar/esm2022/tab-bar.module.mjs +2 -2
  1203. app-ng-runtime/mobile/components/page/tab-bar/esm2022/tabbar.component.mjs +43 -50
  1204. app-ng-runtime/mobile/components/page/tab-bar/fesm2022/index.mjs +44 -51
  1205. app-ng-runtime/mobile/components/page/tab-bar/fesm2022/index.mjs.map +1 -1
  1206. app-ng-runtime/mobile/components/page/tab-bar/tabbar.component.d.ts +2 -2
  1207. app-ng-runtime/mobile/core/bundles/index.umd.js +43 -43
  1208. app-ng-runtime/mobile/core/esm2022/core.module.mjs +3 -3
  1209. app-ng-runtime/mobile/core/esm2022/native.xhr.mjs +1 -1
  1210. app-ng-runtime/mobile/core/esm2022/services/device-file-cache.service.mjs +3 -3
  1211. app-ng-runtime/mobile/core/esm2022/services/device-file-download.service.mjs +6 -7
  1212. app-ng-runtime/mobile/core/esm2022/services/device-file-opener.service.mjs +4 -5
  1213. app-ng-runtime/mobile/core/esm2022/services/device-file-upload.service.mjs +5 -6
  1214. app-ng-runtime/mobile/core/esm2022/services/device-file.service.mjs +7 -8
  1215. app-ng-runtime/mobile/core/esm2022/services/device.service.mjs +4 -5
  1216. app-ng-runtime/mobile/core/esm2022/services/ext-app-message.service.mjs +6 -7
  1217. app-ng-runtime/mobile/core/esm2022/services/network.service.mjs +10 -11
  1218. app-ng-runtime/mobile/core/fesm2022/index.mjs +39 -40
  1219. app-ng-runtime/mobile/core/fesm2022/index.mjs.map +1 -1
  1220. app-ng-runtime/mobile/core/services/ext-app-message.service.d.ts +1 -1
  1221. app-ng-runtime/mobile/core/services/network.service.d.ts +1 -7
  1222. app-ng-runtime/mobile/offline/bundles/index.umd.js +159 -176
  1223. app-ng-runtime/mobile/offline/esm2022/models/local-db-store.mjs +21 -23
  1224. app-ng-runtime/mobile/offline/esm2022/offline.module.mjs +3 -3
  1225. app-ng-runtime/mobile/offline/esm2022/services/change-log.service.mjs +8 -9
  1226. app-ng-runtime/mobile/offline/esm2022/services/local-db-data-pull.service.mjs +37 -39
  1227. app-ng-runtime/mobile/offline/esm2022/services/local-db-management.service.mjs +47 -56
  1228. app-ng-runtime/mobile/offline/esm2022/services/local-db.service.mjs +6 -7
  1229. app-ng-runtime/mobile/offline/esm2022/services/local-key-value.service.mjs +2 -2
  1230. app-ng-runtime/mobile/offline/esm2022/services/push.service.mjs +3 -3
  1231. app-ng-runtime/mobile/offline/esm2022/services/workers/error-blocker.mjs +3 -4
  1232. app-ng-runtime/mobile/offline/esm2022/services/workers/file-handler.mjs +13 -18
  1233. app-ng-runtime/mobile/offline/esm2022/services/workers/id-resolver.mjs +3 -3
  1234. app-ng-runtime/mobile/offline/esm2022/services/workers/multi-part-param-transformer.mjs +5 -9
  1235. app-ng-runtime/mobile/offline/esm2022/utils/file-upload.utils.mjs +1 -1
  1236. app-ng-runtime/mobile/offline/esm2022/utils/live-variable.utils.mjs +11 -12
  1237. app-ng-runtime/mobile/offline/esm2022/utils/query-executor.utils.mjs +4 -5
  1238. app-ng-runtime/mobile/offline/esm2022/utils/security.utils.mjs +2 -3
  1239. app-ng-runtime/mobile/offline/esm2022/utils/utils.mjs +1 -1
  1240. app-ng-runtime/mobile/offline/fesm2022/index.mjs +153 -171
  1241. app-ng-runtime/mobile/offline/fesm2022/index.mjs.map +1 -1
  1242. app-ng-runtime/mobile/placeholder/runtime/bundles/index.umd.js +2 -3
  1243. app-ng-runtime/mobile/placeholder/runtime/esm2022/components/app-ext.component.mjs +2 -3
  1244. app-ng-runtime/mobile/placeholder/runtime/esm2022/mobile-runtime.module.mjs +2 -2
  1245. app-ng-runtime/mobile/placeholder/runtime/fesm2022/index.mjs +2 -3
  1246. app-ng-runtime/mobile/placeholder/runtime/fesm2022/index.mjs.map +1 -1
  1247. app-ng-runtime/mobile/placeholder/runtime-dynamic/bundles/index.umd.js +1 -1
  1248. app-ng-runtime/mobile/placeholder/runtime-dynamic/esm2022/mobile-runtime-dynamic.module.mjs +2 -2
  1249. app-ng-runtime/mobile/placeholder/runtime-dynamic/fesm2022/index.mjs +1 -1
  1250. app-ng-runtime/mobile/placeholder/runtime-dynamic/fesm2022/index.mjs.map +1 -1
  1251. app-ng-runtime/mobile/runtime/bundles/index.umd.js +17 -21
  1252. app-ng-runtime/mobile/runtime/esm2022/components/app-ext.component.mjs +3 -4
  1253. app-ng-runtime/mobile/runtime/esm2022/mobile-runtime.module.mjs +4 -5
  1254. app-ng-runtime/mobile/runtime/esm2022/services/cookie.service.mjs +3 -7
  1255. app-ng-runtime/mobile/runtime/esm2022/services/http-interceptor.service.mjs +5 -6
  1256. app-ng-runtime/mobile/runtime/esm2022/services/webprocess.service.mjs +3 -3
  1257. app-ng-runtime/mobile/runtime/fesm2022/index.mjs +13 -18
  1258. app-ng-runtime/mobile/runtime/fesm2022/index.mjs.map +1 -1
  1259. app-ng-runtime/mobile/runtime-dynamic/bundles/index.umd.js +5 -5
  1260. app-ng-runtime/mobile/runtime-dynamic/esm2022/mobile-runtime-dynamic.module.mjs +2 -2
  1261. app-ng-runtime/mobile/runtime-dynamic/esm2022/services/live-sync.service.mjs +5 -5
  1262. app-ng-runtime/mobile/runtime-dynamic/fesm2022/index.mjs +5 -5
  1263. app-ng-runtime/mobile/runtime-dynamic/fesm2022/index.mjs.map +1 -1
  1264. app-ng-runtime/mobile/variables/bundles/index.umd.js +21 -28
  1265. app-ng-runtime/mobile/variables/esm2022/services/camera-service.mjs +5 -5
  1266. app-ng-runtime/mobile/variables/esm2022/services/contacts-service.mjs +1 -1
  1267. app-ng-runtime/mobile/variables/esm2022/services/datasync-service.mjs +9 -10
  1268. app-ng-runtime/mobile/variables/esm2022/services/device-service/device-service.mjs +1 -1
  1269. app-ng-runtime/mobile/variables/esm2022/services/device-service/location-service.mjs +1 -1
  1270. app-ng-runtime/mobile/variables/esm2022/services/file-service.mjs +3 -11
  1271. app-ng-runtime/mobile/variables/esm2022/services/scan-service.mjs +1 -1
  1272. app-ng-runtime/mobile/variables/esm2022/variables.module.mjs +3 -3
  1273. app-ng-runtime/mobile/variables/fesm2022/index.mjs +16 -24
  1274. app-ng-runtime/mobile/variables/fesm2022/index.mjs.map +1 -1
  1275. app-ng-runtime/oAuth/bundles/index.umd.js +15 -15
  1276. app-ng-runtime/oAuth/esm2022/oAuth.module.mjs +2 -2
  1277. app-ng-runtime/oAuth/esm2022/oAuth.service.mjs +5 -6
  1278. app-ng-runtime/oAuth/esm2022/oAuth.utils.mjs +7 -8
  1279. app-ng-runtime/oAuth/fesm2022/index.mjs +11 -12
  1280. app-ng-runtime/oAuth/fesm2022/index.mjs.map +1 -1
  1281. app-ng-runtime/package.json +1 -1
  1282. app-ng-runtime/runtime/base/bundles/index.umd.js +243 -259
  1283. app-ng-runtime/runtime/base/components/app-component/app.component.d.ts +1 -3
  1284. app-ng-runtime/runtime/base/directives/accessroles.directive.d.ts +3 -4
  1285. app-ng-runtime/runtime/base/esm2022/components/app-component/app.component.mjs +30 -34
  1286. app-ng-runtime/runtime/base/esm2022/components/app-spinner.component.mjs +8 -9
  1287. app-ng-runtime/runtime/base/esm2022/components/base-layout.component.mjs +4 -5
  1288. app-ng-runtime/runtime/base/esm2022/components/base-page.component.mjs +15 -16
  1289. app-ng-runtime/runtime/base/esm2022/components/base-partial.component.mjs +14 -15
  1290. app-ng-runtime/runtime/base/esm2022/components/base-prefab.component.mjs +16 -17
  1291. app-ng-runtime/runtime/base/esm2022/components/base-spa-page.component.mjs +15 -16
  1292. app-ng-runtime/runtime/base/esm2022/components/custom-toaster.component.mjs +15 -17
  1293. app-ng-runtime/runtime/base/esm2022/components/empty-component/empty-page.component.mjs +3 -4
  1294. app-ng-runtime/runtime/base/esm2022/components/prefab-preview.component.mjs +3 -4
  1295. app-ng-runtime/runtime/base/esm2022/directives/accessroles.directive.mjs +16 -24
  1296. app-ng-runtime/runtime/base/esm2022/directives/prefab.directive.mjs +4 -4
  1297. app-ng-runtime/runtime/base/esm2022/guards/auth.guard.mjs +3 -3
  1298. app-ng-runtime/runtime/base/esm2022/guards/can-deactivate-page.guard.mjs +3 -3
  1299. app-ng-runtime/runtime/base/esm2022/guards/page-not-found.guard.mjs +3 -3
  1300. app-ng-runtime/runtime/base/esm2022/guards/role.guard.mjs +4 -5
  1301. app-ng-runtime/runtime/base/esm2022/overrides/wm_dom_renderer.mjs +4 -4
  1302. app-ng-runtime/runtime/base/esm2022/overrides/wm_shared_styles_host.mjs +5 -5
  1303. app-ng-runtime/runtime/base/esm2022/resolves/app-extension.resolve.mjs +3 -3
  1304. app-ng-runtime/runtime/base/esm2022/resolves/app-js.resolve.mjs +3 -3
  1305. app-ng-runtime/runtime/base/esm2022/resolves/app-variables.resolve.mjs +3 -3
  1306. app-ng-runtime/runtime/base/esm2022/resolves/i18n.resolve.mjs +3 -3
  1307. app-ng-runtime/runtime/base/esm2022/resolves/metadata.resolve.mjs +3 -3
  1308. app-ng-runtime/runtime/base/esm2022/resolves/security-config.resolve.mjs +3 -3
  1309. app-ng-runtime/runtime/base/esm2022/runtime-base.module.mjs +3 -3
  1310. app-ng-runtime/runtime/base/esm2022/services/app-defaults.service.mjs +3 -3
  1311. app-ng-runtime/runtime/base/esm2022/services/app.manager.service.mjs +16 -19
  1312. app-ng-runtime/runtime/base/esm2022/services/app.service.mjs +8 -9
  1313. app-ng-runtime/runtime/base/esm2022/services/dynamic-component-ref-provider.service.mjs +4 -5
  1314. app-ng-runtime/runtime/base/esm2022/services/http-interceptor.services.mjs +5 -6
  1315. app-ng-runtime/runtime/base/esm2022/services/i18n.service.mjs +13 -15
  1316. app-ng-runtime/runtime/base/esm2022/services/navigation.service.mjs +9 -10
  1317. app-ng-runtime/runtime/base/esm2022/services/pipe-provider.service.mjs +3 -3
  1318. app-ng-runtime/runtime/base/esm2022/services/pipe.service.mjs +3 -3
  1319. app-ng-runtime/runtime/base/esm2022/services/prefab-manager.service.mjs +4 -5
  1320. app-ng-runtime/runtime/base/esm2022/services/spinner.service.mjs +8 -9
  1321. app-ng-runtime/runtime/base/esm2022/services/toaster.service.mjs +7 -8
  1322. app-ng-runtime/runtime/base/esm2022/util/fragment-monitor.mjs +3 -3
  1323. app-ng-runtime/runtime/base/esm2022/util/wm-route-reuse-strategy.mjs +8 -7
  1324. app-ng-runtime/runtime/base/fesm2022/index.mjs +252 -269
  1325. app-ng-runtime/runtime/base/fesm2022/index.mjs.map +1 -1
  1326. app-ng-runtime/runtime/base/overrides/wm_dom_renderer.d.ts +2 -2
  1327. app-ng-runtime/runtime/base/services/i18n.service.d.ts +1 -1
  1328. app-ng-runtime/runtime/dynamic/bundles/index.umd.js +21 -22
  1329. app-ng-runtime/runtime/dynamic/esm2022/app/app.module.mjs +1 -1
  1330. app-ng-runtime/runtime/dynamic/esm2022/app/components/page-wrapper.component.mjs +3 -4
  1331. app-ng-runtime/runtime/dynamic/esm2022/app/services/app-extension.service.mjs +3 -3
  1332. app-ng-runtime/runtime/dynamic/esm2022/app/services/app-js-provider.service.mjs +3 -3
  1333. app-ng-runtime/runtime/dynamic/esm2022/app/services/app-resource-manager.service.mjs +3 -3
  1334. app-ng-runtime/runtime/dynamic/esm2022/app/services/app-variables-provider.service.mjs +3 -3
  1335. app-ng-runtime/runtime/dynamic/esm2022/app/services/component-ref-provider.service.mjs +5 -6
  1336. app-ng-runtime/runtime/dynamic/esm2022/app/services/prefab-config-provider.service.mjs +3 -3
  1337. app-ng-runtime/runtime/dynamic/esm2022/main.mjs +2 -3
  1338. app-ng-runtime/runtime/dynamic/fesm2022/index.mjs +19 -21
  1339. app-ng-runtime/runtime/dynamic/fesm2022/index.mjs.map +1 -1
  1340. app-ng-runtime/scripts/datatable/datatable.js +2 -3
  1341. app-ng-runtime/scripts/jquery-ui/ui/widgets/droppable.js +7 -7
  1342. app-ng-runtime/scripts/jquery-ui/ui/widgets/resizable.js +10 -13
  1343. app-ng-runtime/scripts/jquery-ui/ui/widgets/sortable.js +7 -7
  1344. app-ng-runtime/security/bundles/index.umd.js +17 -17
  1345. app-ng-runtime/security/esm2022/security.module.mjs +2 -2
  1346. app-ng-runtime/security/esm2022/security.service.mjs +13 -14
  1347. app-ng-runtime/security/fesm2022/index.mjs +13 -14
  1348. app-ng-runtime/security/fesm2022/index.mjs.map +1 -1
  1349. app-ng-runtime/security/security.service.d.ts +1 -1
  1350. app-ng-runtime/swipey/esm2022/swipe.animation.mjs +1 -1
  1351. app-ng-runtime/swipey/fesm2022/index.mjs.map +1 -1
  1352. app-ng-runtime/transpiler/bundles/index.umd.js +9 -10
  1353. app-ng-runtime/transpiler/esm2022/build.mjs +6 -8
  1354. app-ng-runtime/transpiler/fesm2022/index.mjs +5 -7
  1355. app-ng-runtime/transpiler/fesm2022/index.mjs.map +1 -1
  1356. app-ng-runtime/variables/bundles/index.umd.js +150 -160
  1357. app-ng-runtime/variables/esm2022/factory/variable.factory.mjs +1 -1
  1358. app-ng-runtime/variables/esm2022/manager/action/login-action.manager.mjs +14 -15
  1359. app-ng-runtime/variables/esm2022/manager/action/logout-action.manager.mjs +1 -1
  1360. app-ng-runtime/variables/esm2022/manager/action/notification-action.manager.mjs +8 -9
  1361. app-ng-runtime/variables/esm2022/manager/variable/base-variable.manager.mjs +2 -3
  1362. app-ng-runtime/variables/esm2022/manager/variable/device-variable-manager.mjs +1 -1
  1363. app-ng-runtime/variables/esm2022/manager/variable/device-variable-service.mjs +1 -1
  1364. app-ng-runtime/variables/esm2022/manager/variable/web-socket-variable.manager.mjs +10 -11
  1365. app-ng-runtime/variables/esm2022/model/action/notification-action.mjs +1 -1
  1366. app-ng-runtime/variables/esm2022/service/metadata-service/metadata.service.mjs +3 -3
  1367. app-ng-runtime/variables/esm2022/service/variables.service.mjs +8 -9
  1368. app-ng-runtime/variables/esm2022/util/action/navigation-action.utils.mjs +4 -4
  1369. app-ng-runtime/variables/esm2022/util/variable/pagination.utils.mjs +23 -30
  1370. app-ng-runtime/variables/esm2022/util/variable/service-variable.utils.mjs +28 -29
  1371. app-ng-runtime/variables/esm2022/util/variable/variables.utils.mjs +70 -75
  1372. app-ng-runtime/variables/esm2022/variables.module.mjs +2 -2
  1373. app-ng-runtime/variables/fesm2022/index.mjs +163 -174
  1374. app-ng-runtime/variables/fesm2022/index.mjs.map +1 -1
  1375. app-ng-runtime/variables/util/variable/service-variable.utils.d.ts +1 -1
  1376. app-ng-runtime/build-task/.npmignore +0 -2
  1377. app-ng-runtime/components/advanced/carousel/.npmignore +0 -2
  1378. app-ng-runtime/components/advanced/login/.npmignore +0 -2
  1379. app-ng-runtime/components/advanced/marquee/.npmignore +0 -2
  1380. app-ng-runtime/components/base/.npmignore +0 -2
  1381. app-ng-runtime/components/basic/default/.npmignore +0 -2
  1382. app-ng-runtime/components/basic/progress/.npmignore +0 -2
  1383. app-ng-runtime/components/basic/rich-text-editor/.npmignore +0 -2
  1384. app-ng-runtime/components/basic/search/.npmignore +0 -2
  1385. app-ng-runtime/components/basic/tree/.npmignore +0 -2
  1386. app-ng-runtime/components/chart/.npmignore +0 -2
  1387. app-ng-runtime/components/containers/accordion/.npmignore +0 -2
  1388. app-ng-runtime/components/containers/layout-grid/.npmignore +0 -2
  1389. app-ng-runtime/components/containers/linear-layout/.npmignore +0 -2
  1390. app-ng-runtime/components/containers/panel/.npmignore +0 -2
  1391. app-ng-runtime/components/containers/tabs/.npmignore +0 -2
  1392. app-ng-runtime/components/containers/tile/.npmignore +0 -2
  1393. app-ng-runtime/components/containers/wizard/.npmignore +0 -2
  1394. app-ng-runtime/components/data/card/.npmignore +0 -2
  1395. app-ng-runtime/components/data/form/.npmignore +0 -2
  1396. app-ng-runtime/components/data/list/.npmignore +0 -2
  1397. app-ng-runtime/components/data/live-table/.npmignore +0 -2
  1398. app-ng-runtime/components/data/pagination/.npmignore +0 -2
  1399. app-ng-runtime/components/data/table/.npmignore +0 -2
  1400. app-ng-runtime/components/dialogs/alert-dialog/.npmignore +0 -2
  1401. app-ng-runtime/components/dialogs/confirm-dialog/.npmignore +0 -2
  1402. app-ng-runtime/components/dialogs/default/.npmignore +0 -2
  1403. app-ng-runtime/components/dialogs/design-dialog/.npmignore +0 -2
  1404. app-ng-runtime/components/dialogs/iframe-dialog/.npmignore +0 -2
  1405. app-ng-runtime/components/dialogs/login-dialog/.npmignore +0 -2
  1406. app-ng-runtime/components/dialogs/partial-dialog/.npmignore +0 -2
  1407. app-ng-runtime/components/input/calendar/.npmignore +0 -2
  1408. app-ng-runtime/components/input/chips/.npmignore +0 -2
  1409. app-ng-runtime/components/input/color-picker/.npmignore +0 -2
  1410. app-ng-runtime/components/input/currency/.npmignore +0 -2
  1411. app-ng-runtime/components/input/default/.npmignore +0 -2
  1412. app-ng-runtime/components/input/epoch/.npmignore +0 -2
  1413. app-ng-runtime/components/input/file-upload/.npmignore +0 -2
  1414. app-ng-runtime/components/input/rating/.npmignore +0 -2
  1415. app-ng-runtime/components/input/slider/.npmignore +0 -2
  1416. app-ng-runtime/components/navigation/breadcrumb/.npmignore +0 -2
  1417. app-ng-runtime/components/navigation/menu/.npmignore +0 -2
  1418. app-ng-runtime/components/navigation/navbar/.npmignore +0 -2
  1419. app-ng-runtime/components/navigation/popover/.npmignore +0 -2
  1420. app-ng-runtime/components/page/default/.npmignore +0 -2
  1421. app-ng-runtime/components/page/footer/.npmignore +0 -2
  1422. app-ng-runtime/components/page/header/.npmignore +0 -2
  1423. app-ng-runtime/components/page/left-panel/.npmignore +0 -2
  1424. app-ng-runtime/components/page/right-panel/.npmignore +0 -2
  1425. app-ng-runtime/components/page/top-nav/.npmignore +0 -2
  1426. app-ng-runtime/components/prefab/.npmignore +0 -2
  1427. app-ng-runtime/core/.npmignore +0 -2
  1428. app-ng-runtime/core/esm2022/services/custom-icons-loader.service.mjs +0 -26
  1429. app-ng-runtime/core/services/custom-icons-loader.service.d.ts +0 -7
  1430. app-ng-runtime/http/.npmignore +0 -2
  1431. app-ng-runtime/mobile/components/basic/default/.npmignore +0 -2
  1432. app-ng-runtime/mobile/components/basic/search/.npmignore +0 -2
  1433. app-ng-runtime/mobile/components/containers/segmented-control/.npmignore +0 -2
  1434. app-ng-runtime/mobile/components/data/media-list/.npmignore +0 -2
  1435. app-ng-runtime/mobile/components/device/barcode-scanner/.npmignore +0 -2
  1436. app-ng-runtime/mobile/components/device/camera/.npmignore +0 -2
  1437. app-ng-runtime/mobile/components/input/file-upload/.npmignore +0 -2
  1438. app-ng-runtime/mobile/components/page/default/.npmignore +0 -2
  1439. app-ng-runtime/mobile/components/page/left-panel/.npmignore +0 -2
  1440. app-ng-runtime/mobile/components/page/mobile-navbar/.npmignore +0 -2
  1441. app-ng-runtime/mobile/components/page/tab-bar/.npmignore +0 -2
  1442. app-ng-runtime/mobile/core/.npmignore +0 -2
  1443. app-ng-runtime/mobile/offline/.npmignore +0 -2
  1444. app-ng-runtime/mobile/placeholder/runtime/.npmignore +0 -2
  1445. app-ng-runtime/mobile/placeholder/runtime-dynamic/.npmignore +0 -2
  1446. app-ng-runtime/mobile/runtime/.npmignore +0 -2
  1447. app-ng-runtime/mobile/runtime-dynamic/.npmignore +0 -2
  1448. app-ng-runtime/mobile/variables/.npmignore +0 -2
  1449. app-ng-runtime/oAuth/.npmignore +0 -2
  1450. app-ng-runtime/runtime/base/.npmignore +0 -2
  1451. app-ng-runtime/runtime/dynamic/.npmignore +0 -2
  1452. app-ng-runtime/security/.npmignore +0 -2
  1453. app-ng-runtime/swipey/.npmignore +0 -2
  1454. app-ng-runtime/transpiler/.npmignore +0 -2
  1455. app-ng-runtime/variables/.npmignore +0 -2
@@ -1,11 +1,10 @@
1
- import { Attribute, Component, ContentChildren, HostBinding, HostListener, Inject, Injector, NgZone, Optional, SkipSelf, ViewChild, ViewContainerRef } from '@angular/core';
1
+ import { Attribute, Component, ContentChildren, HostBinding, HostListener, Injector, NgZone, Optional, SkipSelf, ViewChild, ViewContainerRef } from '@angular/core';
2
2
  import { FormArray, FormBuilder } from '@angular/forms';
3
3
  import { $appDigest, $invokeWatchers, $parseEvent, AbstractDialogService, App, DataSource, DataType, debounce, DynamicComponentRefProvider, extendProto, getClonedObject, getFiles, getValidJSON, isDefined, isElementInViewport, removeAttr, removeClass, scrollToElement, } from '@wm/core';
4
4
  import { getFieldLayoutConfig, Live_Operations, MessageComponent, parseValueByType, PartialDirective, performDataOperation, provideAsWidgetRef, StylableComponent, styler, WidgetRef } from '@wm/components/base';
5
5
  import { PrefabDirective } from '@wm/components/prefab';
6
6
  import { ListComponent } from '@wm/components/data/list';
7
7
  import { registerFormProps } from './form.props';
8
- import { debounce as _debounce, filter, find, findIndex, forEach, get, includes, isArray, isEmpty, isEqual, isUndefined, keys, last, set, some, split } from "lodash-es";
9
8
  import * as i0 from "@angular/core";
10
9
  import * as i1 from "@angular/forms";
11
10
  import * as i2 from "@wm/core";
@@ -17,11 +16,6 @@ import * as i7 from "@angular/common";
17
16
  import * as i8 from "@wm/components/input";
18
17
  const _c0 = ["dynamicForm"];
19
18
  const _c1 = ["wmForm", ""];
20
- const _c2 = ["*"];
21
- const _c3 = (a0, a1) => ({ "form-elements": a0, "form-body": a1 });
22
- const _c4 = (a0, a1) => ({ "form-elements": a0, "form-content": a1 });
23
- const _c5 = a0 => ({ "modal-footer": a0 });
24
- const _c6 = a0 => ({ btn: a0 });
25
19
  function FormComponent_ng_template_0_Template(rf, ctx) { if (rf & 1) {
26
20
  i0.ɵɵprojection(0);
27
21
  } }
@@ -31,27 +25,27 @@ function FormComponent_ng_container_2_Template(rf, ctx) { if (rf & 1) {
31
25
  function FormComponent_ng_template_3_div_0_i_3_Template(rf, ctx) { if (rf & 1) {
32
26
  i0.ɵɵelement(0, "i", 22);
33
27
  } if (rf & 2) {
34
- const ctx_r0 = i0.ɵɵnextContext(3);
35
- i0.ɵɵproperty("ngClass", ctx_r0.iconclass);
28
+ const ctx_r16 = i0.ɵɵnextContext(3);
29
+ i0.ɵɵproperty("ngClass", ctx_r16.iconclass);
36
30
  } }
31
+ const _c2 = function (a0) { return { btn: a0 }; };
37
32
  function FormComponent_ng_template_3_div_0_ng_container_8_Template(rf, ctx) { if (rf & 1) {
38
33
  i0.ɵɵelementContainer(0, 23);
39
34
  } if (rf & 2) {
40
- const btn_r2 = ctx.$implicit;
41
- const index_r3 = ctx.index;
42
- const ctx_r0 = i0.ɵɵnextContext(3);
43
- const buttonRef_r4 = i0.ɵɵreference(8);
44
- const anchorRef_r5 = i0.ɵɵreference(10);
45
- i0.ɵɵproperty("ngTemplateOutlet", btn_r2.widgetType === "button" ? buttonRef_r4 : anchorRef_r5)("ngTemplateOutletContext", i0.ɵɵpureFunction1(3, _c6, btn_r2))("ngTemplateOutletInjector", ctx_r0.createCustomInjector("action_header_" + index_r3, i0.ɵɵpureFunction1(5, _c6, btn_r2)));
35
+ const btn_r19 = ctx.$implicit;
36
+ i0.ɵɵnextContext(3);
37
+ const _r7 = i0.ɵɵreference(8);
38
+ const _r9 = i0.ɵɵreference(10);
39
+ i0.ɵɵproperty("ngTemplateOutlet", btn_r19.widgetType === "button" ? _r7 : _r9)("ngTemplateOutletContext", i0.ɵɵpureFunction1(2, _c2, btn_r19));
46
40
  } }
47
41
  function FormComponent_ng_template_3_div_0_button_10_Template(rf, ctx) { if (rf & 1) {
48
- const _r6 = i0.ɵɵgetCurrentView();
42
+ const _r21 = i0.ɵɵgetCurrentView();
49
43
  i0.ɵɵelementStart(0, "button", 24);
50
- i0.ɵɵlistener("click", function FormComponent_ng_template_3_div_0_button_10_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r6); const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.expandCollapsePanel()); });
44
+ i0.ɵɵlistener("click", function FormComponent_ng_template_3_div_0_button_10_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r21); const ctx_r20 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r20.expandCollapsePanel()); });
51
45
  i0.ɵɵelementEnd();
52
46
  } if (rf & 2) {
53
- const ctx_r0 = i0.ɵɵnextContext(3);
54
- i0.ɵɵproperty("ngClass", ctx_r0.expanded ? "wi-minus" : "wi-plus");
47
+ const ctx_r18 = i0.ɵɵnextContext(3);
48
+ i0.ɵɵproperty("ngClass", ctx_r18.expanded ? "wi-minus" : "wi-plus");
55
49
  } }
56
50
  function FormComponent_ng_template_3_div_0_Template(rf, ctx) { if (rf & 1) {
57
51
  i0.ɵɵelementStart(0, "div", 14)(1, "h3", 15)(2, "div", 16);
@@ -61,28 +55,28 @@ function FormComponent_ng_template_3_div_0_Template(rf, ctx) { if (rf & 1) {
61
55
  i0.ɵɵelement(5, "div", 18)(6, "div", 19);
62
56
  i0.ɵɵelementEnd();
63
57
  i0.ɵɵelementStart(7, "div", 20);
64
- i0.ɵɵtemplate(8, FormComponent_ng_template_3_div_0_ng_container_8_Template, 1, 7, "ng-container", 13);
58
+ i0.ɵɵtemplate(8, FormComponent_ng_template_3_div_0_ng_container_8_Template, 1, 4, "ng-container", 13);
65
59
  i0.ɵɵpipe(9, "filter");
66
60
  i0.ɵɵtemplate(10, FormComponent_ng_template_3_div_0_button_10_Template, 1, 1, "button", 21);
67
61
  i0.ɵɵelementEnd()()();
68
62
  } if (rf & 2) {
69
- const ctx_r0 = i0.ɵɵnextContext(2);
63
+ const ctx_r12 = i0.ɵɵnextContext(2);
70
64
  i0.ɵɵadvance(3);
71
- i0.ɵɵproperty("ngIf", ctx_r0.iconclass);
65
+ i0.ɵɵproperty("ngIf", ctx_r12.iconclass);
72
66
  i0.ɵɵadvance(2);
73
- i0.ɵɵproperty("innerHTML", ctx_r0.title, i0.ɵɵsanitizeHtml);
74
- i0.ɵɵadvance();
75
- i0.ɵɵproperty("innerHTML", ctx_r0.subheading, i0.ɵɵsanitizeHtml);
67
+ i0.ɵɵproperty("innerHTML", ctx_r12.title, i0.ɵɵsanitizeHtml);
68
+ i0.ɵɵadvance(1);
69
+ i0.ɵɵproperty("innerHTML", ctx_r12.subheading, i0.ɵɵsanitizeHtml);
76
70
  i0.ɵɵadvance(2);
77
- i0.ɵɵproperty("ngForOf", i0.ɵɵpipeBind3(9, 5, ctx_r0.buttonArray, "position", "header"));
71
+ i0.ɵɵproperty("ngForOf", i0.ɵɵpipeBind3(9, 5, ctx_r12.buttonArray, "position", "header"));
78
72
  i0.ɵɵadvance(2);
79
- i0.ɵɵproperty("ngIf", ctx_r0.collapsible);
73
+ i0.ɵɵproperty("ngIf", ctx_r12.collapsible);
80
74
  } }
81
75
  function FormComponent_ng_template_3_p_2_Template(rf, ctx) { if (rf & 1) {
82
76
  i0.ɵɵelement(0, "p", 25);
83
77
  } if (rf & 2) {
84
- const ctx_r0 = i0.ɵɵnextContext(2);
85
- i0.ɵɵattribute("aria-hidden", !ctx_r0.statusMessage.caption)("aria-label", ctx_r0.statusMessage.caption);
78
+ const ctx_r13 = i0.ɵɵnextContext(2);
79
+ i0.ɵɵattribute("aria-hidden", !ctx_r13.statusMessage.caption)("aria-label", ctx_r13.statusMessage.caption);
86
80
  } }
87
81
  function FormComponent_ng_template_3_ng_container_4_Template(rf, ctx) { if (rf & 1) {
88
82
  i0.ɵɵelementContainer(0);
@@ -90,13 +84,15 @@ function FormComponent_ng_template_3_ng_container_4_Template(rf, ctx) { if (rf &
90
84
  function FormComponent_ng_template_3_ng_container_6_Template(rf, ctx) { if (rf & 1) {
91
85
  i0.ɵɵelementContainer(0, 23);
92
86
  } if (rf & 2) {
93
- const btn_r7 = ctx.$implicit;
94
- const index_r8 = ctx.index;
95
- const ctx_r0 = i0.ɵɵnextContext(2);
96
- const buttonRef_r4 = i0.ɵɵreference(8);
97
- const anchorRef_r5 = i0.ɵɵreference(10);
98
- i0.ɵɵproperty("ngTemplateOutlet", btn_r7.widgetType === "button" ? buttonRef_r4 : anchorRef_r5)("ngTemplateOutletContext", i0.ɵɵpureFunction1(3, _c6, btn_r7))("ngTemplateOutletInjector", ctx_r0.createCustomInjector("action_footer_" + index_r8, i0.ɵɵpureFunction1(5, _c6, btn_r7)));
87
+ const btn_r22 = ctx.$implicit;
88
+ i0.ɵɵnextContext(2);
89
+ const _r7 = i0.ɵɵreference(8);
90
+ const _r9 = i0.ɵɵreference(10);
91
+ i0.ɵɵproperty("ngTemplateOutlet", btn_r22.widgetType === "button" ? _r7 : _r9)("ngTemplateOutletContext", i0.ɵɵpureFunction1(2, _c2, btn_r22));
99
92
  } }
93
+ const _c3 = function (a0, a1) { return { "form-elements": a0, "form-body": a1 }; };
94
+ const _c4 = function (a0, a1) { return { "form-elements": a0, "form-content": a1 }; };
95
+ const _c5 = function (a0) { return { "modal-footer": a0 }; };
100
96
  function FormComponent_ng_template_3_Template(rf, ctx) { if (rf & 1) {
101
97
  i0.ɵɵtemplate(0, FormComponent_ng_template_3_div_0_Template, 11, 9, "div", 7);
102
98
  i0.ɵɵelementStart(1, "div", 8);
@@ -105,27 +101,27 @@ function FormComponent_ng_template_3_Template(rf, ctx) { if (rf & 1) {
105
101
  i0.ɵɵtemplate(4, FormComponent_ng_template_3_ng_container_4_Template, 1, 0, "ng-container", 11);
106
102
  i0.ɵɵelementEnd();
107
103
  i0.ɵɵelementStart(5, "div", 12);
108
- i0.ɵɵtemplate(6, FormComponent_ng_template_3_ng_container_6_Template, 1, 7, "ng-container", 13);
104
+ i0.ɵɵtemplate(6, FormComponent_ng_template_3_ng_container_6_Template, 1, 4, "ng-container", 13);
109
105
  i0.ɵɵpipe(7, "filter");
110
106
  i0.ɵɵelementEnd()();
111
107
  } if (rf & 2) {
112
- const ctx_r0 = i0.ɵɵnextContext();
113
- const content_r9 = i0.ɵɵreference(1);
114
- i0.ɵɵproperty("ngIf", !ctx_r0.isLayoutDialog && (ctx_r0.title || ctx_r0.subheading || ctx_r0.iconclass || ctx_r0.showButtons("header")));
115
- i0.ɵɵadvance();
116
- i0.ɵɵclassProp("hidden", !ctx_r0.expanded);
117
- i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction2(15, _c3, ctx_r0.isLayoutDialog, !ctx_r0.isLayoutDialog));
118
- i0.ɵɵadvance();
119
- i0.ɵɵproperty("ngIf", !!ctx_r0.statusMessage.caption);
120
- i0.ɵɵadvance();
121
- i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction2(18, _c4, !ctx_r0.isLayoutDialog, ctx_r0.isLayoutDialog));
122
- i0.ɵɵadvance();
123
- i0.ɵɵproperty("ngTemplateOutlet", content_r9);
124
- i0.ɵɵadvance();
125
- i0.ɵɵclassProp("hidden", !ctx_r0.expanded || !ctx_r0.showButtons("footer"));
126
- i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction1(21, _c5, ctx_r0.isLayoutDialog));
127
- i0.ɵɵadvance();
128
- i0.ɵɵproperty("ngForOf", i0.ɵɵpipeBind3(7, 11, ctx_r0.buttonArray, "position", "footer"));
108
+ const ctx_r4 = i0.ɵɵnextContext();
109
+ const _r0 = i0.ɵɵreference(1);
110
+ i0.ɵɵproperty("ngIf", !ctx_r4.isLayoutDialog && (ctx_r4.title || ctx_r4.subheading || ctx_r4.iconclass || ctx_r4.showButtons("header")));
111
+ i0.ɵɵadvance(1);
112
+ i0.ɵɵclassProp("hidden", !ctx_r4.expanded);
113
+ i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction2(15, _c3, ctx_r4.isLayoutDialog, !ctx_r4.isLayoutDialog));
114
+ i0.ɵɵadvance(1);
115
+ i0.ɵɵproperty("ngIf", !!ctx_r4.statusMessage.caption);
116
+ i0.ɵɵadvance(1);
117
+ i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction2(18, _c4, !ctx_r4.isLayoutDialog, ctx_r4.isLayoutDialog));
118
+ i0.ɵɵadvance(1);
119
+ i0.ɵɵproperty("ngTemplateOutlet", _r0);
120
+ i0.ɵɵadvance(1);
121
+ i0.ɵɵclassProp("hidden", !ctx_r4.expanded || !ctx_r4.showButtons("footer"));
122
+ i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction1(21, _c5, ctx_r4.isLayoutDialog));
123
+ i0.ɵɵadvance(1);
124
+ i0.ɵɵproperty("ngForOf", i0.ɵɵpipeBind3(7, 11, ctx_r4.buttonArray, "position", "footer"));
129
125
  } }
130
126
  function FormComponent_ng_template_5_ng_container_0_Template(rf, ctx) { if (rf & 1) {
131
127
  i0.ɵɵelementContainer(0);
@@ -134,32 +130,33 @@ function FormComponent_ng_template_5_Template(rf, ctx) { if (rf & 1) {
134
130
  i0.ɵɵtemplate(0, FormComponent_ng_template_5_ng_container_0_Template, 1, 0, "ng-container", 11);
135
131
  } if (rf & 2) {
136
132
  i0.ɵɵnextContext();
137
- const content_r9 = i0.ɵɵreference(1);
138
- i0.ɵɵproperty("ngTemplateOutlet", content_r9);
133
+ const _r0 = i0.ɵɵreference(1);
134
+ i0.ɵɵproperty("ngTemplateOutlet", _r0);
139
135
  } }
140
136
  function FormComponent_ng_template_7_Template(rf, ctx) { if (rf & 1) {
141
- const _r10 = i0.ɵɵgetCurrentView();
137
+ const _r26 = i0.ɵɵgetCurrentView();
142
138
  i0.ɵɵelementStart(0, "button", 26);
143
- i0.ɵɵlistener("click", function FormComponent_ng_template_7_Template_button_click_0_listener($event) { const btn_r11 = i0.ɵɵrestoreView(_r10).btn; const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.invokeActionEvent($event, btn_r11.action)); });
139
+ i0.ɵɵlistener("click", function FormComponent_ng_template_7_Template_button_click_0_listener($event) { const restoredCtx = i0.ɵɵrestoreView(_r26); const btn_r24 = restoredCtx.btn; const ctx_r25 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r25.invokeActionEvent($event, btn_r24.action)); });
144
140
  i0.ɵɵelementEnd();
145
141
  } if (rf & 2) {
146
- const btn_r11 = ctx.btn;
147
- const ctx_r0 = i0.ɵɵnextContext();
148
- i0.ɵɵclassProp("hidden", btn_r11.updateMode ? !ctx_r0.isUpdateMode : ctx_r0.isUpdateMode);
149
- i0.ɵɵpropertyInterpolate("name", btn_r11.key);
150
- i0.ɵɵattribute("aria-label", btn_r11.displayName);
142
+ const btn_r24 = ctx.btn;
143
+ const ctx_r8 = i0.ɵɵnextContext();
144
+ i0.ɵɵclassProp("hidden", btn_r24.updateMode ? !ctx_r8.isUpdateMode : ctx_r8.isUpdateMode);
145
+ i0.ɵɵpropertyInterpolate("name", btn_r24.key);
146
+ i0.ɵɵattribute("aria-label", btn_r24.displayName);
151
147
  } }
152
148
  function FormComponent_ng_template_9_Template(rf, ctx) { if (rf & 1) {
153
- const _r12 = i0.ɵɵgetCurrentView();
149
+ const _r29 = i0.ɵɵgetCurrentView();
154
150
  i0.ɵɵelementStart(0, "a", 27);
155
- i0.ɵɵlistener("click", function FormComponent_ng_template_9_Template_a_click_0_listener($event) { const btn_r13 = i0.ɵɵrestoreView(_r12).btn; const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.invokeActionEvent($event, btn_r13.action)); });
151
+ i0.ɵɵlistener("click", function FormComponent_ng_template_9_Template_a_click_0_listener($event) { const restoredCtx = i0.ɵɵrestoreView(_r29); const btn_r27 = restoredCtx.btn; const ctx_r28 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r28.invokeActionEvent($event, btn_r27.action)); });
156
152
  i0.ɵɵelementEnd();
157
153
  } if (rf & 2) {
158
- const btn_r13 = ctx.btn;
159
- const ctx_r0 = i0.ɵɵnextContext();
160
- i0.ɵɵclassProp("hidden", btn_r13.updateMode ? !ctx_r0.isUpdateMode : ctx_r0.isUpdateMode);
161
- i0.ɵɵpropertyInterpolate("name", btn_r13.key);
154
+ const btn_r27 = ctx.btn;
155
+ const ctx_r10 = i0.ɵɵnextContext();
156
+ i0.ɵɵclassProp("hidden", btn_r27.updateMode ? !ctx_r10.isUpdateMode : ctx_r10.isUpdateMode);
157
+ i0.ɵɵpropertyInterpolate("name", btn_r27.key);
162
158
  } }
159
+ const _c6 = ["*"];
163
160
  const WIDGET_CONFIG = { widgetType: 'wm-form', hostClass: 'panel app-panel app-form' };
164
161
  const LOGIN_FORM_CONFIG = { widgetType: 'wm-form', hostClass: 'app-form app-login-form' };
165
162
  const LIVE_FORM_CONFIG = { widgetType: 'wm-liveform', hostClass: 'panel app-panel app-liveform liveform-inline' };
@@ -180,7 +177,7 @@ const getWidgetConfig = (isLiveForm, isLiveFilter, role) => {
180
177
  // Generate the form field with given field definition. Add a grid column wrapper around the form field.
181
178
  const setMarkupForFormField = (field, columnWidth) => {
182
179
  let propsTmpl = '';
183
- forEach(field, (value, key) => {
180
+ _.forEach(field, (value, key) => {
184
181
  propsTmpl = `${propsTmpl} ${key}="${value}"`;
185
182
  });
186
183
  return `<wm-gridcolumn columnwidth="${columnWidth}">
@@ -222,7 +219,7 @@ const setTouchedState = (self, ngForm, fieldName) => {
222
219
  return;
223
220
  }
224
221
  if (ngForm.controls) {
225
- forEach(ngForm.controls, (ctrl, fieldName) => {
222
+ _.forEach(ngForm.controls, (ctrl, fieldName) => {
226
223
  setTouchedState(self, ctrl, fieldName);
227
224
  });
228
225
  }
@@ -284,8 +281,8 @@ export class FormComponent extends StylableComponent {
284
281
  }
285
282
  return isDefined(this._formIsInList) ? this._formIsInList : this.parentList;
286
283
  }
287
- constructor(inj, fb, app, dialogService, dynamicComponentProvider, ngZone, parentList, parentForm, parentPrefab, parentPartial, onBeforeSubmitEvt, onSubmitEvt, onBeforeRenderEvt, binddataset, bindformdata, isLiveForm, isLiveFilter, role, key, name, explicitContext) {
288
- super(inj, getWidgetConfig(isLiveForm, isLiveFilter, role), explicitContext);
284
+ constructor(inj, fb, app, dialogService, dynamicComponentProvider, ngZone, parentList, parentForm, parentPrefab, parentPartial, onBeforeSubmitEvt, onSubmitEvt, onBeforeRenderEvt, binddataset, bindformdata, isLiveForm, isLiveFilter, role, key, name) {
285
+ super(inj, getWidgetConfig(isLiveForm, isLiveFilter, role));
289
286
  this.fb = fb;
290
287
  this.app = app;
291
288
  this.dialogService = dialogService;
@@ -314,7 +311,7 @@ export class FormComponent extends StylableComponent {
314
311
  type: ''
315
312
  };
316
313
  this.primaryKey = [];
317
- this._debouncedUpdateFieldSource = _debounce(this.updateFieldSource, 350);
314
+ this._debouncedUpdateFieldSource = _.debounce(this.updateFieldSource, 350);
318
315
  this.validationMessages = [];
319
316
  this._debouncedSubmitForm = debounce(($event) => {
320
317
  // calling submit event in ngZone as change detection is not triggered post the submit callback and actions like notification are not shown
@@ -349,7 +346,7 @@ export class FormComponent extends StylableComponent {
349
346
  ngAfterViewInit() {
350
347
  if (this.parentForm && this.parentForm.ngform && this.isParentList) {
351
348
  // setting formArray control on ngform.
352
- if (!get(this.parentForm.ngform.controls, this.parentList.name)) {
349
+ if (!_.get(this.parentForm.ngform.controls, this.parentList.name)) {
353
350
  this.parentForm.ngform.setControl(this.parentList.name, new FormArray([]));
354
351
  }
355
352
  // pushing the ngform to formArray.
@@ -387,10 +384,10 @@ export class FormComponent extends StylableComponent {
387
384
  * 5. this means form name change applies only when there is single form (immediate child) inside the parentContainer.
388
385
  */
389
386
  const prefabInnerForm = parentContentEl.find('form').first();
390
- if (get(prefabInnerForm[0], 'widget.widgetId') === this.widgetId) {
387
+ if (_.get(prefabInnerForm[0], 'widget.widgetId') === this.widgetId) {
391
388
  // check whether form inside prefab container is inside the list. If true, do not change the name.
392
389
  if (!prefabInnerForm.isParentList && !prefabInnerForm.siblings('form').length) {
393
- binding = get(parentContainer, 'name');
390
+ binding = _.get(parentContainer, 'name');
394
391
  }
395
392
  }
396
393
  }
@@ -426,16 +423,16 @@ export class FormComponent extends StylableComponent {
426
423
  const formEle = this.getNativeElement();
427
424
  const formObjs = formEle.querySelectorAll('.app-form');
428
425
  const validationMsgs = [];
429
- forEach(formObjs, e => {
426
+ _.forEach(formObjs, e => {
430
427
  const formInstance = e.widget;
431
428
  // differentiating the validationMessages prefix based on the formGroupName
432
429
  // as the formName's are same when forms are in list
433
- let formName = get(formInstance, 'formGroupName') || formInstance.name;
430
+ let formName = _.get(formInstance, 'formGroupName') || formInstance.name;
434
431
  if (isDefined(formInstance.formArrayIndex)) {
435
432
  formName = formName + '[' + formInstance.formArrayIndex + ']';
436
433
  }
437
434
  let current = formInstance;
438
- while (get(current, 'parentForm')) {
435
+ while (_.get(current, 'parentForm')) {
439
436
  let parentName = current.parentForm.formGroupName || current.parentForm.name;
440
437
  if (current.parentForm.parentFormArray) {
441
438
  parentName = parentName + '[' + current.parentForm.formArrayIndex + ']';
@@ -458,7 +455,7 @@ export class FormComponent extends StylableComponent {
458
455
  if (!formFields) {
459
456
  return;
460
457
  }
461
- forEach(controls, (v, k) => {
458
+ _.forEach(controls, (v, k) => {
462
459
  const field = formFields.find(e => e.key === k);
463
460
  if (!field || (validateTouch && !v.touched)) {
464
461
  return;
@@ -485,18 +482,18 @@ export class FormComponent extends StylableComponent {
485
482
  this.validationMessages.push({
486
483
  field: k,
487
484
  value: field.value,
488
- errorType: keys(v.errors),
485
+ errorType: _.keys(v.errors),
489
486
  message: field.validationmessage || '',
490
487
  getElement: () => {
491
488
  return field.$element.find('[focus-target]');
492
489
  },
493
- formName: last(prefix.split('.')),
490
+ formName: _.last(prefix.split('.')),
494
491
  fullyQualifiedFormName: prefix
495
492
  });
496
493
  }
497
494
  else {
498
495
  this.validationMessages[index].value = field.value;
499
- this.validationMessages[index].errorType = keys(v.errors);
496
+ this.validationMessages[index].errorType = _.keys(v.errors);
500
497
  }
501
498
  }
502
499
  else if (v.valid && index > -1) {
@@ -505,7 +502,7 @@ export class FormComponent extends StylableComponent {
505
502
  }
506
503
  // This will return a object containing the error details from the list of formFields that are invalid
507
504
  setValidationMsgs(validateTouch) {
508
- if (!this.formFields.length && isEmpty(this.ngform.controls)) {
505
+ if (!this.formFields.length && _.isEmpty(this.ngform.controls)) {
509
506
  return;
510
507
  }
511
508
  this.setValidationOnFields(this, this.name, validateTouch);
@@ -587,10 +584,10 @@ export class FormComponent extends StylableComponent {
587
584
  break;
588
585
  case 'formdata':
589
586
  // For livelist when multiselect is enabled, formdata will be array of objects. In this case consider the last object as formdata.
590
- if (isEqual(nv, ov)) {
587
+ if (_.isEqual(nv, ov)) {
591
588
  break;
592
589
  }
593
- isArray(nv) ? this.setFormData(last(nv)) : this.setFormData(nv);
590
+ _.isArray(nv) ? this.setFormData(_.last(nv)) : this.setFormData(nv);
594
591
  // if dataset on the formFields are not set as the datasourceChange is triggered before the formFields are registered.
595
592
  if (!this.isDataSourceUpdated && this.datasource) {
596
593
  this.onDataSourceChange();
@@ -620,7 +617,7 @@ export class FormComponent extends StylableComponent {
620
617
  const formFields = this.getFormFields();
621
618
  formFields.forEach(field => {
622
619
  // notifying the dataset change to the form-field widget.
623
- if (!field.isDataSetBound && get(field.formWidget, 'dataset$')) {
620
+ if (!field.isDataSetBound && _.get(field.formWidget, 'dataset$')) {
624
621
  field.formWidget.dataset$.next();
625
622
  }
626
623
  });
@@ -669,7 +666,7 @@ export class FormComponent extends StylableComponent {
669
666
  }
670
667
  // if there is an App.onServiceError handler for the app, that message should be used instead of server returned error message
671
668
  checkAppServiceErrorMsg(type) {
672
- const notificationAction = get(this.app, 'Actions.appNotification');
669
+ const notificationAction = _.get(this.app, 'Actions.appNotification');
673
670
  if (notificationAction && type === 'error') {
674
671
  return notificationAction.getMessage();
675
672
  }
@@ -682,7 +679,7 @@ export class FormComponent extends StylableComponent {
682
679
  // Set the classes on the form based on the captionposition and captionwidth properties
683
680
  setLayoutConfig() {
684
681
  let layoutConfig;
685
- layoutConfig = getFieldLayoutConfig(this.captionwidth, this.captionposition, get(this.app.selectedViewPort, 'os'));
682
+ layoutConfig = getFieldLayoutConfig(this.captionwidth, this.captionposition, _.get(this.app.selectedViewPort, 'os'));
686
683
  this._widgetClass = layoutConfig.widgetCls;
687
684
  this._captionClass = layoutConfig.captionCls;
688
685
  $appDigest();
@@ -703,9 +700,9 @@ export class FormComponent extends StylableComponent {
703
700
  this.parentForm.setFormData(this.parentForm.formdata, this.formFields, this.formdata || {});
704
701
  }
705
702
  // WMS-18967: Applying formadata after formfields are ready
706
- if (fieldCount === this.numberOfFields && !isEmpty(this.formdata)) {
703
+ if (fieldCount === this.numberOfFields && !_.isEmpty(this.formdata)) {
707
704
  this.onDataSourceChange();
708
- isArray(this.formdata) ? this.setFormData(last(this.formdata)) : this.setFormData(this.formdata);
705
+ _.isArray(this.formdata) ? this.setFormData(_.last(this.formdata)) : this.setFormData(this.formdata);
709
706
  }
710
707
  }
711
708
  registerActions(formAction) {
@@ -714,8 +711,8 @@ export class FormComponent extends StylableComponent {
714
711
  // Update the dataoutput whenever there is a change in inside form widget value
715
712
  updateFormDataOutput(dataObject) {
716
713
  // Set the values of the widgets inside the live form (other than form fields) in form data
717
- forEach(this.ngform.value, (val, key) => {
718
- if (!find(this.formFields, { key })) {
714
+ _.forEach(this.ngform.value, (val, key) => {
715
+ if (!_.find(this.formFields, { key })) {
719
716
  dataObject[key] = val;
720
717
  }
721
718
  });
@@ -739,20 +736,20 @@ export class FormComponent extends StylableComponent {
739
736
  // This form is having innerform i.e. address, these fields are listed as
740
737
  // {"applicantName": "", "applicantID": "", "address": {"street": ""}}
741
738
  if (field.form.widgetId !== this.widgetId && field.form.formGroupName) {
742
- const fd = get(formData, field.form.formGroupName, {});
739
+ const fd = _.get(formData, field.form.formGroupName, {});
743
740
  fd[fieldName] = fieldValue;
744
- set(formData, field.form.formGroupName, fd);
741
+ _.set(formData, field.form.formGroupName, fd);
745
742
  }
746
- else if (this.parentForm && this.parentForm.ngform && field.form.isParentList) { // Fix for [WMS-25806]: use formArrayIndex only if form has a parent form
743
+ else if ((typeof field.form.formArrayIndex === 'number') && field.form.isParentList && !this.parentForm) { // Fix for [WMS-25806]: use formArrayIndex only if form has a parent form
747
744
  // setting formdata based on formArrayIndex
748
- const fd = get(formData, field.form.parentList.name, []);
745
+ const fd = _.get(formData, field.form.parentList.name, []);
749
746
  fd[field.form.formArrayIndex] = fd[field.form.formArrayIndex] || {};
750
747
  fd[field.form.formArrayIndex][fieldName] = fieldValue;
751
- set(formData, field.form.parentList.name, fd);
748
+ _.set(formData, field.form.parentList.name, fd);
752
749
  }
753
750
  else {
754
751
  // In case of update the field will be already present in form data
755
- set(formData, fieldName, fieldValue);
752
+ _.set(formData, fieldName, fieldValue);
756
753
  }
757
754
  });
758
755
  this.updateFormDataOutput(formData);
@@ -767,7 +764,7 @@ export class FormComponent extends StylableComponent {
767
764
  // FormFields will contain all the fields in parent and inner form also.
768
765
  // This returns the formFields in the form based on the form name.
769
766
  getFormFields() {
770
- return filter(this.formFields, formField => {
767
+ return _.filter(this.formFields, formField => {
771
768
  return formField.form.name === this.name;
772
769
  });
773
770
  }
@@ -778,12 +775,12 @@ export class FormComponent extends StylableComponent {
778
775
  const fd = innerFormdata ? innerFormdata : data;
779
776
  if (fd) {
780
777
  if (fd.hasOwnProperty(key)) {
781
- field.value = get(fd, key);
778
+ field.value = _.get(fd, key);
782
779
  }
783
- else if (includes(key, '.')) {
780
+ else if (_.includes(key, '.')) {
784
781
  // key contains '.' when mapping the fields to child reference i.e. childCol is having key as "parent.childCol"
785
- if (fd.hasOwnProperty(split(key, '.')[0])) {
786
- field.value = get(fd, key);
782
+ if (fd.hasOwnProperty(_.split(key, '.')[0])) {
783
+ field.value = _.get(fd, key);
787
784
  }
788
785
  }
789
786
  // WMS-18906: For default value, do not mark the form as dirty.
@@ -796,11 +793,11 @@ export class FormComponent extends StylableComponent {
796
793
  * if formGroupName is defined which means field is inside the inner form
797
794
  * then set the formdata on the field's form using formGroupName
798
795
  */
799
- if (formGroupName && get(data, formGroupName)) {
796
+ if (formGroupName && _.get(data, formGroupName)) {
800
797
  this.setFormData.call(field.form, data[formGroupName]);
801
798
  }
802
799
  // if formdata is assigned later then on propertyChangeHandler, even inner forms data also needs to be updated.
803
- if (get(field.form, 'parentFormArray')) {
800
+ if (_.get(field.form, 'parentFormArray')) {
804
801
  this.setFormDataFromParentFormData.call(field.form, data);
805
802
  }
806
803
  }
@@ -983,7 +980,7 @@ export class FormComponent extends StylableComponent {
983
980
  template = this.errormessage || error.error || error;
984
981
  $appDigest();
985
982
  return {
986
- 'result': get(error, 'error') || error,
983
+ 'result': _.get(error, 'error') || error,
987
984
  'status': false,
988
985
  'message': template,
989
986
  'type': 'error'
@@ -1010,8 +1007,8 @@ export class FormComponent extends StylableComponent {
1010
1007
  }
1011
1008
  // Method to show/hide the panel header or footer based on the buttons
1012
1009
  showButtons(position) {
1013
- return some(this.buttonArray, btn => {
1014
- return includes(btn.position, position) && btn.updateMode === this.isUpdateMode;
1010
+ return _.some(this.buttonArray, btn => {
1011
+ return _.includes(btn.position, position) && btn.updateMode === this.isUpdateMode;
1015
1012
  });
1016
1013
  }
1017
1014
  // Expand or collapse the panel
@@ -1040,13 +1037,13 @@ export class FormComponent extends StylableComponent {
1040
1037
  if (!form.parentForm) {
1041
1038
  return {};
1042
1039
  }
1043
- if (!form.bindformdata && get(form.parentForm, 'formdata') && !isEmpty(form.parentForm.formdata)) {
1040
+ if (!form.bindformdata && _.get(form.parentForm, 'formdata') && !_.isEmpty(form.parentForm.formdata)) {
1044
1041
  return form.parentForm.formdata;
1045
1042
  }
1046
1043
  return this.getNearestParentFormData(form.parentForm);
1047
1044
  }
1048
1045
  setFormDataFromParentFormData(formdata) {
1049
- if (isEmpty(this.formdata) && this.parentForm && formdata) {
1046
+ if (_.isEmpty(this.formdata) && this.parentForm && formdata) {
1050
1047
  /**
1051
1048
  * If form is inside list,
1052
1049
  * 1. directly applying the formdata to the formArray to update the formdata on list of forms using patchValue.
@@ -1057,9 +1054,9 @@ export class FormComponent extends StylableComponent {
1057
1054
  * If not inside list, just set the formdata on all the formfields including innerForm fields
1058
1055
  */
1059
1056
  if (this.parentFormArray) {
1060
- let childFormArrayData = get(formdata, this.parentList.name);
1057
+ let childFormArrayData = _.get(formdata, this.parentList.name);
1061
1058
  if (childFormArrayData) {
1062
- if (!isArray(childFormArrayData)) {
1059
+ if (!_.isArray(childFormArrayData)) {
1063
1060
  childFormArrayData = [childFormArrayData];
1064
1061
  }
1065
1062
  this.parentFormArray.patchValue(childFormArrayData);
@@ -1069,7 +1066,7 @@ export class FormComponent extends StylableComponent {
1069
1066
  this.setFormData(this.formdata);
1070
1067
  }
1071
1068
  else if (this.isParentList && this.parentForm.formGroupName) {
1072
- const parentFormData = get(formdata, this.parentForm.formGroupName);
1069
+ const parentFormData = _.get(formdata, this.parentForm.formGroupName);
1073
1070
  this.setFormDataFromParentFormData(parentFormData);
1074
1071
  }
1075
1072
  }
@@ -1080,7 +1077,7 @@ export class FormComponent extends StylableComponent {
1080
1077
  }
1081
1078
  // On form data source change. This method is overridden by live form and live filter
1082
1079
  onDataSourceChange() {
1083
- if (get(this.formFields, 'length') && !this.bindformdata) {
1080
+ if (_.get(this.formFields, 'length') && !this.bindformdata) {
1084
1081
  this.isDataSourceUpdated = true;
1085
1082
  /**
1086
1083
  * formdata on the parent form will be set before the inner forms are rendered.
@@ -1112,7 +1109,7 @@ export class FormComponent extends StylableComponent {
1112
1109
  let noOfColumns;
1113
1110
  let $gridLayout;
1114
1111
  // Check if grid layout is present or not for first time
1115
- if (isUndefined(this._isGridLayoutPresent)) {
1112
+ if (_.isUndefined(this._isGridLayoutPresent)) {
1116
1113
  this._isGridLayoutPresent = this.$element.find('.panel-body [wmlayoutgrid]').length > 0;
1117
1114
  }
1118
1115
  if (this._isGridLayoutPresent) {
@@ -1134,7 +1131,7 @@ export class FormComponent extends StylableComponent {
1134
1131
  let userFields;
1135
1132
  let fields = this.metadata ? this.metadata.data || this.metadata : [];
1136
1133
  this.formFields = []; // empty the form fields
1137
- if (isEmpty(fields)) {
1134
+ if (_.isEmpty(fields)) {
1138
1135
  return;
1139
1136
  }
1140
1137
  if (this.onBeforeRenderEvt) {
@@ -1143,7 +1140,7 @@ export class FormComponent extends StylableComponent {
1143
1140
  fields = userFields;
1144
1141
  }
1145
1142
  }
1146
- if (!isArray(fields)) {
1143
+ if (!_.isArray(fields)) {
1147
1144
  return;
1148
1145
  }
1149
1146
  while (fields[colCount]) {
@@ -1229,12 +1226,12 @@ export class FormComponent extends StylableComponent {
1229
1226
  }
1230
1227
  ngOnDestroy() {
1231
1228
  // on form destroy, removing this form from the parentForm too.
1232
- const controls = this.parentForm && get(this.parentForm, 'ngform.controls');
1229
+ const controls = this.parentForm && _.get(this.parentForm, 'ngform.controls');
1233
1230
  if (controls) {
1234
1231
  // when current form is inside the list (i.e. incase of formArray).
1235
- if (get(this.parentList, 'name') && controls.hasOwnProperty(this.parentList.name)) {
1232
+ if (_.get(this.parentList, 'name') && controls.hasOwnProperty(this.parentList.name)) {
1236
1233
  //get the index of current form in the list and remove the FormControl from FormArray
1237
- const index = findIndex(this.parentList.getWidgets(this.name), { widgetId: this.widgetId });
1234
+ const index = _.findIndex(this.parentList.getWidgets(this.name), { widgetId: this.widgetId });
1238
1235
  this.parentForm.ngform.controls[this.parentList.name].removeAt(index);
1239
1236
  }
1240
1237
  // when we have formGroupName set i.e. multiple formInstance with counter appended to formName
@@ -1247,7 +1244,7 @@ export class FormComponent extends StylableComponent {
1247
1244
  }
1248
1245
  super.ngOnDestroy();
1249
1246
  }
1250
- static { this.ɵfac = function FormComponent_Factory(t) { return new (t || FormComponent)(i0.ɵɵdirectiveInject(i0.Injector), i0.ɵɵdirectiveInject(i1.FormBuilder), i0.ɵɵdirectiveInject(i2.App), i0.ɵɵdirectiveInject(i2.AbstractDialogService), i0.ɵɵdirectiveInject(i2.DynamicComponentRefProvider), i0.ɵɵdirectiveInject(i0.NgZone), i0.ɵɵdirectiveInject(i3.ListComponent, 8), i0.ɵɵdirectiveInject(FormComponent, 12), i0.ɵɵdirectiveInject(i4.PrefabDirective, 12), i0.ɵɵdirectiveInject(i5.PartialDirective, 12), i0.ɵɵinjectAttribute('beforesubmit.event'), i0.ɵɵinjectAttribute('submit.event'), i0.ɵɵinjectAttribute('beforerender.event'), i0.ɵɵinjectAttribute('dataset.bind'), i0.ɵɵinjectAttribute('formdata.bind'), i0.ɵɵinjectAttribute('wmLiveForm'), i0.ɵɵinjectAttribute('wmLiveFilter'), i0.ɵɵinjectAttribute('data-role'), i0.ɵɵinjectAttribute('key'), i0.ɵɵinjectAttribute('name'), i0.ɵɵdirectiveInject('EXPLICIT_CONTEXT', 8)); }; }
1247
+ static { this.ɵfac = function FormComponent_Factory(t) { return new (t || FormComponent)(i0.ɵɵdirectiveInject(i0.Injector), i0.ɵɵdirectiveInject(i1.FormBuilder), i0.ɵɵdirectiveInject(i2.App), i0.ɵɵdirectiveInject(i2.AbstractDialogService), i0.ɵɵdirectiveInject(i2.DynamicComponentRefProvider), i0.ɵɵdirectiveInject(i0.NgZone), i0.ɵɵdirectiveInject(i3.ListComponent, 8), i0.ɵɵdirectiveInject(FormComponent, 12), i0.ɵɵdirectiveInject(i4.PrefabDirective, 12), i0.ɵɵdirectiveInject(i5.PartialDirective, 12), i0.ɵɵinjectAttribute('beforesubmit.event'), i0.ɵɵinjectAttribute('submit.event'), i0.ɵɵinjectAttribute('beforerender.event'), i0.ɵɵinjectAttribute('dataset.bind'), i0.ɵɵinjectAttribute('formdata.bind'), i0.ɵɵinjectAttribute('wmLiveForm'), i0.ɵɵinjectAttribute('wmLiveFilter'), i0.ɵɵinjectAttribute('data-role'), i0.ɵɵinjectAttribute('key'), i0.ɵɵinjectAttribute('name')); }; }
1251
1248
  static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: FormComponent, selectors: [["form", "wmForm", ""]], contentQueries: function FormComponent_ContentQueries(rf, ctx, dirIndex) { if (rf & 1) {
1252
1249
  i0.ɵɵcontentQuery(dirIndex, WidgetRef, 5);
1253
1250
  } if (rf & 2) {
@@ -1266,23 +1263,28 @@ export class FormComponent extends StylableComponent {
1266
1263
  i0.ɵɵhostProperty("action", ctx.action, i0.ɵɵsanitizeUrl);
1267
1264
  } }, features: [i0.ɵɵProvidersFeature([
1268
1265
  provideAsWidgetRef(FormComponent)
1269
- ]), i0.ɵɵInheritDefinitionFeature], attrs: _c1, ngContentSelectors: _c2, decls: 13, vars: 3, consts: [["content", ""], ["defaultTemplate", ""], ["pageLayoutTemplate", ""], ["buttonRef", ""], ["anchorRef", ""], ["dynamicForm", ""], [4, "ngIf", "ngIfThen", "ngIfElse"], ["class", "panel-heading", 4, "ngIf"], [1, "panel-body", 3, "ngClass"], ["wmMessage", "", "caption.bind", "statusMessage.caption", "type.bind", "statusMessage.type", 4, "ngIf"], [3, "ngClass"], [4, "ngTemplateOutlet"], [1, "basic-btn-grp", "form-action", "panel-footer", "clearfix", 3, "ngClass"], [3, "ngTemplateOutlet", "ngTemplateOutletContext", "ngTemplateOutletInjector", 4, "ngFor", "ngForOf"], [1, "panel-heading"], [1, "panel-title"], [1, "pull-left"], ["class", "app-icon panel-icon", "aria-hidden", "true", 3, "ngClass", 4, "ngIf"], [1, "heading", 3, "innerHTML"], [1, "description", 3, "innerHTML"], [1, "form-action", "panel-actions", "basic-btn-grp"], ["type", "button", "class", "app-icon wi panel-action", "title", "Collapse/Expand", 3, "ngClass", "click", 4, "ngIf"], ["aria-hidden", "true", 1, "app-icon", "panel-icon", 3, "ngClass"], [3, "ngTemplateOutlet", "ngTemplateOutletContext", "ngTemplateOutletInjector"], ["type", "button", "title", "Collapse/Expand", 1, "app-icon", "wi", "panel-action", 3, "click", "ngClass"], ["wmMessage", "", "caption.bind", "statusMessage.caption", "type.bind", "statusMessage.type"], ["wmButton", "", "caption.bind", "btn.displayName", "class.bind", "btn.class", "iconclass.bind", "btn.iconclass", "show.bind", "btn.show", "type.bind", "btn.type", "hint.bind", "btn.title", "shortcutkey.bind", "btn.shortcutkey", "disabled.bind", "ngform.status === 'PENDING' || btn.disabled", "tabindex.bind", "btn.tabindex", 3, "click", "name"], ["wmAnchor", "", "caption.bind", "btn.displayName", "class.bind", "btn.class", "iconclass.bind", "btn.iconclass", "show.bind", "btn.show", "hint.bind", "btn.title", "shortcutkey.bind", "btn.shortcutkey", "hyperlink.bind", "btn.hyperlink", "target.bind", "btn.target", "tabindex.bind", "btn.tabindex", 3, "click", "name"]], template: function FormComponent_Template(rf, ctx) { if (rf & 1) {
1266
+ ]), i0.ɵɵInheritDefinitionFeature], attrs: _c1, ngContentSelectors: _c6, decls: 13, vars: 3, consts: [["content", ""], [4, "ngIf", "ngIfThen", "ngIfElse"], ["defaultTemplate", ""], ["pageLayoutTemplate", ""], ["buttonRef", ""], ["anchorRef", ""], ["dynamicForm", ""], ["class", "panel-heading", 4, "ngIf"], [1, "panel-body", 3, "ngClass"], ["wmMessage", "", "caption.bind", "statusMessage.caption", "type.bind", "statusMessage.type", 4, "ngIf"], [3, "ngClass"], [4, "ngTemplateOutlet"], [1, "basic-btn-grp", "form-action", "panel-footer", "clearfix", 3, "ngClass"], [3, "ngTemplateOutlet", "ngTemplateOutletContext", 4, "ngFor", "ngForOf"], [1, "panel-heading"], [1, "panel-title"], [1, "pull-left"], ["class", "app-icon panel-icon", "aria-hidden", "true", 3, "ngClass", 4, "ngIf"], [1, "heading", 3, "innerHTML"], [1, "description", 3, "innerHTML"], [1, "form-action", "panel-actions", "basic-btn-grp"], ["type", "button", "class", "app-icon wi panel-action", "title", "Collapse/Expand", 3, "ngClass", "click", 4, "ngIf"], ["aria-hidden", "true", 1, "app-icon", "panel-icon", 3, "ngClass"], [3, "ngTemplateOutlet", "ngTemplateOutletContext"], ["type", "button", "title", "Collapse/Expand", 1, "app-icon", "wi", "panel-action", 3, "ngClass", "click"], ["wmMessage", "", "caption.bind", "statusMessage.caption", "type.bind", "statusMessage.type"], ["wmButton", "", "caption.bind", "btn.displayName", "class.bind", "btn.class", "iconclass.bind", "btn.iconclass", "show.bind", "btn.show", "type.bind", "btn.type", "hint.bind", "btn.title", "shortcutkey.bind", "btn.shortcutkey", "disabled.bind", "ngform.status === 'PENDING' || btn.disabled", "tabindex.bind", "btn.tabindex", 3, "name", "click"], ["wmAnchor", "", "caption.bind", "btn.displayName", "class.bind", "btn.class", "iconclass.bind", "btn.iconclass", "show.bind", "btn.show", "hint.bind", "btn.title", "shortcutkey.bind", "btn.shortcutkey", "hyperlink.bind", "btn.hyperlink", "target.bind", "btn.target", "tabindex.bind", "btn.tabindex", 3, "name", "click"]], template: function FormComponent_Template(rf, ctx) { if (rf & 1) {
1270
1267
  i0.ɵɵprojectionDef();
1271
- i0.ɵɵtemplate(0, FormComponent_ng_template_0_Template, 1, 0, "ng-template", null, 0, i0.ɵɵtemplateRefExtractor)(2, FormComponent_ng_container_2_Template, 1, 0, "ng-container", 6)(3, FormComponent_ng_template_3_Template, 8, 23, "ng-template", null, 1, i0.ɵɵtemplateRefExtractor)(5, FormComponent_ng_template_5_Template, 1, 1, "ng-template", null, 2, i0.ɵɵtemplateRefExtractor)(7, FormComponent_ng_template_7_Template, 1, 4, "ng-template", null, 3, i0.ɵɵtemplateRefExtractor)(9, FormComponent_ng_template_9_Template, 1, 3, "ng-template", null, 4, i0.ɵɵtemplateRefExtractor);
1272
- i0.ɵɵelementContainer(11, null, 5);
1268
+ i0.ɵɵtemplate(0, FormComponent_ng_template_0_Template, 1, 0, "ng-template", null, 0, i0.ɵɵtemplateRefExtractor);
1269
+ i0.ɵɵtemplate(2, FormComponent_ng_container_2_Template, 1, 0, "ng-container", 1);
1270
+ i0.ɵɵtemplate(3, FormComponent_ng_template_3_Template, 8, 23, "ng-template", null, 2, i0.ɵɵtemplateRefExtractor);
1271
+ i0.ɵɵtemplate(5, FormComponent_ng_template_5_Template, 1, 1, "ng-template", null, 3, i0.ɵɵtemplateRefExtractor);
1272
+ i0.ɵɵtemplate(7, FormComponent_ng_template_7_Template, 1, 4, "ng-template", null, 4, i0.ɵɵtemplateRefExtractor);
1273
+ i0.ɵɵtemplate(9, FormComponent_ng_template_9_Template, 1, 3, "ng-template", null, 5, i0.ɵɵtemplateRefExtractor);
1274
+ i0.ɵɵelementContainer(11, null, 6);
1273
1275
  } if (rf & 2) {
1274
- const defaultTemplate_r14 = i0.ɵɵreference(4);
1275
- const pageLayoutTemplate_r15 = i0.ɵɵreference(6);
1276
+ const _r3 = i0.ɵɵreference(4);
1277
+ const _r5 = i0.ɵɵreference(6);
1276
1278
  i0.ɵɵadvance(2);
1277
- i0.ɵɵproperty("ngIf", ctx.formlayout === "page")("ngIfThen", pageLayoutTemplate_r15)("ngIfElse", defaultTemplate_r14);
1279
+ i0.ɵɵproperty("ngIf", ctx.formlayout === "page")("ngIfThen", _r5)("ngIfElse", _r3);
1278
1280
  } }, dependencies: [i6.AnchorComponent, i7.NgClass, i7.NgForOf, i7.NgIf, i7.NgTemplateOutlet, i8.ButtonComponent, i5.MessageComponent, i5.FilterPipe], encapsulation: 2 }); }
1279
1281
  }
1280
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(FormComponent, [{
1282
+ (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(FormComponent, [{
1281
1283
  type: Component,
1282
1284
  args: [{ selector: 'form[wmForm]', providers: [
1283
1285
  provideAsWidgetRef(FormComponent)
1284
- ], template: "<ng-template #content><ng-content></ng-content></ng-template>\n\n<ng-container *ngIf=\"formlayout === 'page'; then pageLayoutTemplate else defaultTemplate\">\n</ng-container>\n\n<ng-template #defaultTemplate>\n <div class=\"panel-heading\" *ngIf=\"!isLayoutDialog && (title || subheading || iconclass || showButtons('header'))\">\n <h3 class=\"panel-title\">\n <div class=\"pull-left\">\n <i class=\"app-icon panel-icon\" aria-hidden=\"true\" [ngClass]=\"iconclass\" *ngIf=\"iconclass\"></i>\n </div>\n <div class=\"pull-left\">\n <div class=\"heading\" [innerHTML]=\"title\"></div>\n <div class=\"description\" [innerHTML]=\"subheading\"></div>\n </div>\n <div class=\"form-action panel-actions basic-btn-grp\">\n <ng-container *ngFor=\"let btn of buttonArray | filter : 'position' : 'header'; let index = index\"\n [ngTemplateOutlet]=\"btn.widgetType === 'button' ? buttonRef : anchorRef\"\n [ngTemplateOutletContext]=\"{btn:btn}\"\n [ngTemplateOutletInjector]=\"createCustomInjector('action_header_' + index, {btn:btn})\">\n </ng-container>\n <button type=\"button\" class=\"app-icon wi panel-action\" *ngIf=\"collapsible\" title=\"Collapse/Expand\"\n [ngClass]=\"expanded ? 'wi-minus': 'wi-plus'\" (click)=\"expandCollapsePanel();\"></button>\n </div>\n </h3>\n </div>\n <div class=\"panel-body\" [ngClass]=\"{'form-elements': isLayoutDialog, 'form-body': !isLayoutDialog}\" [class.hidden]=\"!expanded\">\n <p wmMessage *ngIf=\"!!statusMessage.caption\" [attr.aria-hidden]=\"!statusMessage.caption\" [attr.aria-label]=\"statusMessage.caption\" caption.bind=\"statusMessage.caption\" type.bind=\"statusMessage.type\"></p>\n <div [ngClass]=\"{'form-elements': !isLayoutDialog, 'form-content': isLayoutDialog}\">\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n </div>\n <div class=\"basic-btn-grp form-action panel-footer clearfix\" [ngClass]=\"{'modal-footer': isLayoutDialog}\" [class.hidden]=\"!expanded || !showButtons('footer')\">\n <ng-container *ngFor=\"let btn of buttonArray | filter : 'position' : 'footer'; let index = index\"\n [ngTemplateOutlet]=\"btn.widgetType === 'button' ? buttonRef : anchorRef\"\n [ngTemplateOutletContext]=\"{btn:btn}\"\n [ngTemplateOutletInjector]=\"createCustomInjector('action_footer_' + index, {btn:btn})\">\n </ng-container>\n </div>\n </div>\n</ng-template>\n\n<ng-template #pageLayoutTemplate>\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n</ng-template>\n\n<ng-template #buttonRef let-btn=\"btn\">\n <button wmButton name=\"{{btn.key}}\" caption.bind=\"btn.displayName\" class.bind=\"btn.class\" iconclass.bind=\"btn.iconclass\" show.bind=\"btn.show\"\n (click)=\"invokeActionEvent($event, btn.action)\" type.bind=\"btn.type\" hint.bind=\"btn.title\" shortcutkey.bind=\"btn.shortcutkey\" disabled.bind=\"ngform.status === 'PENDING' || btn.disabled\"\n tabindex.bind=\"btn.tabindex\" [attr.aria-label]=\"btn.displayName\" [class.hidden]=\"btn.updateMode ? !isUpdateMode : isUpdateMode\"></button>\n</ng-template>\n\n<ng-template #anchorRef let-btn=\"btn\">\n <a wmAnchor name=\"{{btn.key}}\" caption.bind=\"btn.displayName\" class.bind=\"btn.class\" iconclass.bind=\"btn.iconclass\" show.bind=\"btn.show\"\n (click)=\"invokeActionEvent($event, btn.action)\" hint.bind=\"btn.title\" shortcutkey.bind=\"btn.shortcutkey\"\n hyperlink.bind=\"btn.hyperlink\" target.bind=\"btn.target\"\n tabindex.bind=\"btn.tabindex\" [class.hidden]=\"btn.updateMode ? !isUpdateMode : isUpdateMode\"></a>\n</ng-template>\n\n<ng-container #dynamicForm></ng-container>\n" }]
1285
- }], () => [{ type: i0.Injector }, { type: i1.FormBuilder }, { type: i2.App }, { type: i2.AbstractDialogService }, { type: i2.DynamicComponentRefProvider }, { type: i0.NgZone }, { type: i3.ListComponent, decorators: [{
1286
+ ], template: "<ng-template #content><ng-content></ng-content></ng-template>\n\n<ng-container *ngIf=\"formlayout === 'page'; then pageLayoutTemplate else defaultTemplate\">\n</ng-container>\n\n<ng-template #defaultTemplate>\n <div class=\"panel-heading\" *ngIf=\"!isLayoutDialog && (title || subheading || iconclass || showButtons('header'))\">\n <h3 class=\"panel-title\">\n <div class=\"pull-left\">\n <i class=\"app-icon panel-icon\" aria-hidden=\"true\" [ngClass]=\"iconclass\" *ngIf=\"iconclass\"></i>\n </div>\n <div class=\"pull-left\">\n <div class=\"heading\" [innerHTML]=\"title\"></div>\n <div class=\"description\" [innerHTML]=\"subheading\"></div>\n </div>\n <div class=\"form-action panel-actions basic-btn-grp\">\n <ng-container *ngFor=\"let btn of buttonArray | filter : 'position' : 'header'\"\n [ngTemplateOutlet]=\"btn.widgetType === 'button' ? buttonRef : anchorRef\" [ngTemplateOutletContext]=\"{btn:btn}\">\n </ng-container>\n <button type=\"button\" class=\"app-icon wi panel-action\" *ngIf=\"collapsible\" title=\"Collapse/Expand\"\n [ngClass]=\"expanded ? 'wi-minus': 'wi-plus'\" (click)=\"expandCollapsePanel();\"></button>\n </div>\n </h3>\n </div>\n <div class=\"panel-body\" [ngClass]=\"{'form-elements': isLayoutDialog, 'form-body': !isLayoutDialog}\" [class.hidden]=\"!expanded\">\n <p wmMessage *ngIf=\"!!statusMessage.caption\" [attr.aria-hidden]=\"!statusMessage.caption\" [attr.aria-label]=\"statusMessage.caption\" caption.bind=\"statusMessage.caption\" type.bind=\"statusMessage.type\"></p>\n <div [ngClass]=\"{'form-elements': !isLayoutDialog, 'form-content': isLayoutDialog}\">\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n </div>\n <div class=\"basic-btn-grp form-action panel-footer clearfix\" [ngClass]=\"{'modal-footer': isLayoutDialog}\" [class.hidden]=\"!expanded || !showButtons('footer')\">\n <ng-container *ngFor=\"let btn of buttonArray | filter : 'position' : 'footer'\"\n [ngTemplateOutlet]=\"btn.widgetType === 'button' ? buttonRef : anchorRef\" [ngTemplateOutletContext]=\"{btn:btn}\">\n </ng-container>\n </div>\n </div>\n</ng-template>\n\n<ng-template #pageLayoutTemplate>\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n</ng-template>\n\n<ng-template #buttonRef let-btn=\"btn\">\n <button wmButton name=\"{{btn.key}}\" caption.bind=\"btn.displayName\" class.bind=\"btn.class\" iconclass.bind=\"btn.iconclass\" show.bind=\"btn.show\"\n (click)=\"invokeActionEvent($event, btn.action)\" type.bind=\"btn.type\" hint.bind=\"btn.title\" shortcutkey.bind=\"btn.shortcutkey\" disabled.bind=\"ngform.status === 'PENDING' || btn.disabled\"\n tabindex.bind=\"btn.tabindex\" [attr.aria-label]=\"btn.displayName\" [class.hidden]=\"btn.updateMode ? !isUpdateMode : isUpdateMode\"></button>\n</ng-template>\n\n<ng-template #anchorRef let-btn=\"btn\">\n <a wmAnchor name=\"{{btn.key}}\" caption.bind=\"btn.displayName\" class.bind=\"btn.class\" iconclass.bind=\"btn.iconclass\" show.bind=\"btn.show\"\n (click)=\"invokeActionEvent($event, btn.action)\" hint.bind=\"btn.title\" shortcutkey.bind=\"btn.shortcutkey\"\n hyperlink.bind=\"btn.hyperlink\" target.bind=\"btn.target\"\n tabindex.bind=\"btn.tabindex\" [class.hidden]=\"btn.updateMode ? !isUpdateMode : isUpdateMode\"></a>\n</ng-template>\n\n<ng-container #dynamicForm></ng-container>\n" }]
1287
+ }], function () { return [{ type: i0.Injector }, { type: i1.FormBuilder }, { type: i2.App }, { type: i2.AbstractDialogService }, { type: i2.DynamicComponentRefProvider }, { type: i0.NgZone }, { type: i3.ListComponent, decorators: [{
1286
1288
  type: Optional
1287
1289
  }] }, { type: FormComponent, decorators: [{
1288
1290
  type: SkipSelf
@@ -1326,12 +1328,7 @@ export class FormComponent extends StylableComponent {
1326
1328
  }] }, { type: undefined, decorators: [{
1327
1329
  type: Attribute,
1328
1330
  args: ['name']
1329
- }] }, { type: undefined, decorators: [{
1330
- type: Inject,
1331
- args: ['EXPLICIT_CONTEXT']
1332
- }, {
1333
- type: Optional
1334
- }] }], { dynamicFormRef: [{
1331
+ }] }]; }, { dynamicFormRef: [{
1335
1332
  type: ViewChild,
1336
1333
  args: ['dynamicForm', { static: true, read: ViewContainerRef }]
1337
1334
  }], messageRef: [{
@@ -1353,5 +1350,4 @@ export class FormComponent extends StylableComponent {
1353
1350
  type: HostListener,
1354
1351
  args: ['keydown', ['$event']]
1355
1352
  }] }); })();
1356
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(FormComponent, { className: "FormComponent", filePath: "form.component.ts", lineNumber: 159 }); })();
1357
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3dpZGdldHMvZGF0YS9mb3JtL3NyYy9mb3JtLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvd2lkZ2V0cy9kYXRhL2Zvcm0vc3JjL2Zvcm0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUdILFNBQVMsRUFDVCxTQUFTLEVBQ1QsZUFBZSxFQUNmLFdBQVcsRUFDWCxZQUFZLEVBQUUsTUFBTSxFQUNwQixRQUFRLEVBQ1IsTUFBTSxFQUVOLFFBQVEsRUFDUixRQUFRLEVBQ1IsU0FBUyxFQUNULGdCQUFnQixFQUNuQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUMsU0FBUyxFQUFFLFdBQVcsRUFBWSxNQUFNLGdCQUFnQixDQUFDO0FBRWpFLE9BQU8sRUFDSCxVQUFVLEVBQ1YsZUFBZSxFQUNmLFdBQVcsRUFDWCxxQkFBcUIsRUFDckIsR0FBRyxFQUNILFVBQVUsRUFDVixRQUFRLEVBQ1IsUUFBUSxFQUNSLDJCQUEyQixFQUMzQixXQUFXLEVBQ1gsZUFBZSxFQUNmLFFBQVEsRUFDUixZQUFZLEVBQ1osU0FBUyxFQUNULG1CQUFtQixFQUNuQixVQUFVLEVBQ1YsV0FBVyxFQUNYLGVBQWUsR0FDbEIsTUFBTSxVQUFVLENBQUM7QUFDbEIsT0FBTyxFQUNILG9CQUFvQixFQUNwQixlQUFlLEVBQ2YsZ0JBQWdCLEVBQ2hCLGdCQUFnQixFQUNoQixnQkFBZ0IsRUFDaEIsb0JBQW9CLEVBQ3BCLGtCQUFrQixFQUNsQixpQkFBaUIsRUFDakIsTUFBTSxFQUNOLFNBQVMsRUFDWixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUN0RCxPQUFPLEVBQUMsYUFBYSxFQUFDLE1B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Qjs7c0JBQzlCLFNBQVM7dUJBQUMsY0FBYzs7c0JBQ3hCLFNBQVM7dUJBQUMsb0JBQW9COztzQkFDOUIsU0FBUzt1QkFBQyxjQUFjOztzQkFDeEIsU0FBUzt1QkFBQyxlQUFlOztzQkFDekIsU0FBUzt1QkFBQyxZQUFZOztzQkFDdEIsU0FBUzt1QkFBQyxjQUFjOztzQkFDeEIsU0FBUzt1QkFBQyxXQUFXOztzQkFDckIsU0FBUzt1QkFBQyxLQUFLOztzQkFDZixTQUFTO3VCQUFDLE1BQU07O3NCQUNoQixNQUFNO3VCQUFDLGtCQUFrQjs7c0JBQUcsUUFBUTtxQkFwSzJCLGNBQWM7a0JBQWpGLFNBQVM7bUJBQUMsYUFBYSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUU7WUFDckMsVUFBVTtrQkFBdEMsU0FBUzttQkFBQyxnQkFBZ0I7WUFFc0IsYUFBYTtrQkFBN0QsZUFBZTttQkFBQyxTQUFTLEVBQUUsRUFBQyxXQUFXLEVBQUUsSUFBSSxFQUFDO1lBNEd4QixNQUFNO2tCQUE1QixXQUFXO21CQUFDLFFBQVE7WUFFZSxNQUFNO2tCQUF6QyxZQUFZO21CQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQztZQUlYLE9BQU87a0JBQTdCLFlBQVk7bUJBQUMsT0FBTztZQUlnQixnQkFBZ0I7a0JBQXBELFlBQVk7bUJBQUMsU0FBUyxFQUFFLENBQUMsUUFBUSxDQUFDOztrRkEzSDFCLGFBQWEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIEFmdGVyQ29udGVudEluaXQsXG4gICAgQWZ0ZXJWaWV3SW5pdCxcbiAgICBBdHRyaWJ1dGUsXG4gICAgQ29tcG9uZW50LFxuICAgIENvbnRlbnRDaGlsZHJlbixcbiAgICBIb3N0QmluZGluZyxcbiAgICBIb3N0TGlzdGVuZXIsIEluamVjdCxcbiAgICBJbmplY3RvcixcbiAgICBOZ1pvbmUsXG4gICAgT25EZXN0cm95LFxuICAgIE9wdGlvbmFsLFxuICAgIFNraXBTZWxmLFxuICAgIFZpZXdDaGlsZCxcbiAgICBWaWV3Q29udGFpbmVyUmVmXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtGb3JtQXJyYXksIEZvcm1CdWlsZGVyLCBGb3JtR3JvdXB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuaW1wb3J0IHtcbiAgICAkYXBwRGlnZXN0LFxuICAgICRpbnZva2VXYXRjaGVycyxcbiAgICAkcGFyc2VFdmVudCxcbiAgICBBYnN0cmFjdERpYWxvZ1NlcnZpY2UsXG4gICAgQXBwLFxuICAgIERhdGFTb3VyY2UsXG4gICAgRGF0YVR5cGUsXG4gICAgZGVib3VuY2UsXG4gICAgRHluYW1pY0NvbXBvbmVudFJlZlByb3ZpZGVyLFxuICAgIGV4dGVuZFByb3RvLFxuICAgIGdldENsb25lZE9iamVjdCxcbiAgICBnZXRGaWxlcyxcbiAgICBnZXRWYWxpZEpTT04sXG4gICAgaXNEZWZpbmVkLFxuICAgIGlzRWxlbWVudEluVmlld3BvcnQsXG4gICAgcmVtb3ZlQXR0cixcbiAgICByZW1vdmVDbGFzcyxcbiAgICBzY3JvbGxUb0VsZW1lbnQsXG59IGZyb20gJ0B3bS9jb3JlJztcbmltcG9ydCB7XG4gICAgZ2V0RmllbGRMYXlvdXRDb25maWcsXG4gICAgTGl2ZV9PcGVyYXRpb25zLFxuICAgIE1lc3NhZ2VDb21wb25lbnQsXG4gICAgcGFyc2VWYWx1ZUJ5VHlwZSxcbiAgICBQYXJ0aWFsRGlyZWN0aXZlLFxuICAgIHBlcmZvcm1EYXRhT3BlcmF0aW9uLFxuICAgIHByb3ZpZGVBc1dpZGdldFJlZixcbiAgICBTdHlsYWJsZUNvbXBvbmVudCxcbiAgICBzdHlsZXIsXG4gICAgV2lkZ2V0UmVmXG59IGZyb20gJ0B3bS9jb21wb25lbnRzL2Jhc2UnO1xuaW1wb3J0IHtQcmVmYWJEaXJlY3RpdmV9IGZyb20gJ0B3bS9jb21wb25lbnRzL3ByZWZhYic7XG5pbXBvcnQge0xpc3RDb21wb25lbnR9IGZyb20gJ0B3bS9jb21wb25lbnRzL2RhdGEvbGlzdCc7XG5cbmltcG9ydCB7cmVnaXN0ZXJGb3JtUHJvcHN9IGZyb20gJy4vZm9ybS5wcm9wcyc7XG5pbXBvcnQge1xuICAgIGRlYm91bmNlIGFzIF9kZWJvdW5jZSxcbiAgICBmaWx0ZXIsXG4gICAgZmluZCwgZmluZEluZGV4LFxuICAgIGZvckVhY2gsXG4gICAgZ2V0LFxuICAgIGluY2x1ZGVzLFxuICAgIGlzQXJyYXksXG4gICAgaXNFbXB0eSwgaXNFcXVhbCxcbiAgICBpc1VuZGVmaW5lZCxcbiAgICBrZXlzLFxuICAgIGxhc3QsXG4gICAgc2V0LFxuICAgIHNvbWUsXG4gICAgc3BsaXRcbn0gZnJvbSBcImxvZGFzaC1lc1wiO1xuXG5jb25zdCBXSURHRVRfQ09ORklHID0ge3dpZGdldFR5cGU6ICd3bS1mb3JtJywgaG9zdENsYXNzOiAncGFuZWwgYXBwLXBhbmVsIGFwcC1mb3JtJ307XG5jb25zdCBMT0dJTl9GT1JNX0NPTkZJRyA9IHt3aWRnZXRUeXBlOiAnd20tZm9ybScsIGhvc3RDbGFzczogJ2FwcC1mb3JtIGFwcC1sb2dpbi1mb3JtJ307XG5jb25zdCBMSVZFX0ZPUk1fQ09ORklHID0ge3dpZGdldFR5cGU6ICd3bS1saXZlZm9ybScsIGhvc3RDbGFzczogJ3BhbmVsIGFwcC1wYW5lbCBhcHAtbGl2ZWZvcm0gbGl2ZWZvcm0taW5saW5lJ307XG5jb25zdCBMSVZFX0ZJTFRFUl9DT05GSUcgPSB7d2lkZ2V0VHlwZTogJ3dtLWxpdmVmaWx0ZXInLCBob3N0Q2xhc3M6ICdwYW5lbCBhcHAtcGFuZWwgYXBwLWxpdmVmaWx0ZXIgY2xlYXJmaXggbGl2ZWZvcm0taW5saW5lJ307XG5cbmNvbnN0IGdldFdpZGdldENvbmZpZyA9IChpc0xpdmVGb3JtLCBpc0xpdmVGaWx0ZXIsIHJvbGUpID0+IHtcbiAgICBsZXQgY29uZmlnID0gV0lER0VUX0NPTkZJRztcbiAgICBpZiAoaXNMaXZlRm9ybSAhPT0gbnVsbCkge1xuICAgICAgICBjb25maWcgPSBMSVZFX0ZPUk1fQ09ORklHO1xuICAgIH0gZWxzZSBpZiAoaXNMaXZlRmlsdGVyICE9PSBudWxsKSB7XG4gICAgICAgIGNvbmZpZyA9IExJVkVfRklMVEVSX0NPTkZJRztcbiAgICB9IGVsc2UgaWYgKHJvbGUgPT09ICdhcHAtbG9naW4nKSB7XG4gICAgICAgIGNvbmZpZyA9IExPR0lOX0ZPUk1fQ09ORklHO1xuICAgIH1cbiAgICByZXR1cm4gY29uZmlnO1xufTtcblxuLy8gR2VuZXJhdGUgdGhlIGZvcm0gZmllbGQgd2l0aCBnaXZlbiBmaWVsZCBkZWZpbml0aW9uLiBBZGQgYSBncmlkIGNvbHVtbiB3cmFwcGVyIGFyb3VuZCB0aGUgZm9ybSBmaWVsZC5cbmNvbnN0IHNldE1hcmt1cEZvckZvcm1GaWVsZCA9IChmaWVsZCwgY29sdW1uV2lkdGgpID0+ICB7XG4gICAgbGV0IHByb3BzVG1wbCA9ICcnO1xuICAgIGZvckVhY2goZmllbGQsICh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgIHByb3BzVG1wbCA9IGAke3Byb3BzVG1wbH0gJHtrZXl9PVwiJHt2YWx1ZX1cImA7XG4gICAgfSk7XG4gICAgcmV0dXJuIGA8d20tZ3JpZGNvbHVtbiBjb2x1bW53aWR0aD1cIiR7Y29sdW1uV2lkdGh9XCI+XG4gICAgICAgICAgICAgICAgICA8d20tZm9ybS1maWVsZCAke3Byb3BzVG1wbH0+PC93bS1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgPC93bS1ncmlkY29sdW1uPmA7XG59O1xuXG4vLyBGdW5jdGlvbiB0byBmaW5kIG91dCB0aGUgZmlyc3QgaW52YWxpZCBlbGVtZW50IGluIGZvcm1cbmNvbnN0IGZpbmRJbnZhbGlkRWxlbWVudCA9ICgkZm9ybUVsZSwgbmdGb3JtKSA9PiB7XG4gICAgY29uc3QgJGVsZSA9ICRmb3JtRWxlLmZpbmQoJ2Zvcm0ubmctaW52YWxpZDp2aXNpYmxlLCBbZm9ybUNvbnRyb2xOYW1lXS5uZy1pbnZhbGlkOnZpc2libGUnKS5maXJzdCgpO1xuICAgIGxldCBmb3JtT2JqID0gbmdGb3JtO1xuICAgIC8vIElmIGVsZW1lbnQgaXMgZm9ybSwgZmluZCBvdXQgdGhlIGZpcnN0IGludmFsaWQgZWxlbWVudCBpbiB0aGlzIGZvcm1cbiAgICBpZiAoJGVsZS5pcygnZm9ybScpKSB7XG4gICAgICAgIGZvcm1PYmogPSBuZ0Zvcm0gJiYgbmdGb3JtLmNvbnRyb2xzWyRlbGUuYXR0cignZm9ybUNvbnRyb2xOYW1lJykgfHwgJGVsZS5hdHRyKCduYW1lJyldO1xuICAgICAgICBpZiAoZm9ybU9iaikge1xuICAgICAgICAgICAgcmV0dXJuIGZpbmRJbnZhbGlkRWxlbWVudCgkZWxlLCBmb3JtT2JqKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBuZ0Zvcm06IGZvcm1PYmosXG4gICAgICAgICRlbGU6ICRlbGVcbiAgICB9O1xufTtcblxuLy8gRnVuY3Rpb24gdG8gZ2V0IHRoZSBhY3RpdmUgZWxlbWVudCBtYXJrdXAgYmFzZWQgb24gd2lkZ2V0IHR5cGVcbmNvbnN0IGdldEFjdGl2ZUVsZW1lbnQgPSAoZWxlbWVudCkgPT4ge1xuICAgIGNvbnN0IHdpZGdldFR5cGUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnd2lkZ2V0dHlwZScpO1xuICAgIHN3aXRjaCAod2lkZ2V0VHlwZSkge1xuICAgICAgICBjYXNlICdzZWxlY3QnOlxuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQucXVlcnlTZWxlY3Rvcignc2VsZWN0Jyk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAndGV4dGFyZWEnOlxuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQucXVlcnlTZWxlY3RvcigndGV4dGFyZWEnKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQucXVlcnlTZWxlY3RvcignaW5wdXQnKTtcbiAgICB9XG59XG5jb25zdCBzZXRUb3VjaGVkU3RhdGUgPSAoc2VsZiwgbmdGb3JtLCBmaWVsZE5hbWUpID0+IHtcbiAgICBpZiAobmdGb3JtLnZhbGlkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKG5nRm9ybS5jb250cm9scykge1xuICAgICAgICBmb3JFYWNoKG5nRm9ybS5jb250cm9scywgKGN0cmwsIGZpZWxkTmFtZSkgPT4ge1xuICAgICAgICAgICAgc2V0VG91Y2hlZFN0YXRlKHNlbGYsIGN0cmwsIGZpZWxkTmFtZSk7XG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCBlbGVtZW50ID0gc2VsZi4kZWxlbWVudC5maW5kKGBbd21mb3JtZmllbGRdW2tleT1cIiR7ZmllbGROYW1lfVwiXWApO1xuICAgICAgICBpZiAoIWVsZW1lbnQubGVuZ3RoKSB7XG4gICAgICAgICAgICBlbGVtZW50ID0gc2VsZi4kZWxlbWVudC5maW5kKGBbd21mb3JtZmllbGRdW25hbWU9XCIke2ZpZWxkTmFtZX1cIl1gKTtcbiAgICAgICAgfVxuICAgICAgICBlbGVtZW50WzBdLnNldEF0dHJpYnV0ZSgnX19lcnJvcm1zZycsIGVsZW1lbnRbMF0uZ2V0QXR0cmlidXRlKCdfX3ZhbGlkYXRpb25JZCcpKTtcbiAgICAgICAgbGV0IGFjdGl2ZUVsZW1lbnQgPSBnZXRBY3RpdmVFbGVtZW50KGVsZW1lbnRbMF0pO1xuICAgICAgICBhY3RpdmVFbGVtZW50Py5zZXRBdHRyaWJ1dGUoJ2FyaWEtaW52YWxpZCcsIG5nRm9ybS5pbnZhbGlkKTtcbiAgICAgICAgYWN0aXZlRWxlbWVudD8uc2V0QXR0cmlidXRlKCdhcmlhLWRlc2NyaWJlZGJ5JywgZWxlbWVudFswXS5nZXRBdHRyaWJ1dGUoJ19fdmFsaWRhdGlvbklkJykpO1xuICAgICAgICBuZ0Zvcm0ubWFya0FzVG91Y2hlZCgpO1xuICAgIH1cbn07XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnZm9ybVt3bUZvcm1dJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vZm9ybS5jb21wb25lbnQuaHRtbCcsXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIHByb3ZpZGVBc1dpZGdldFJlZihGb3JtQ29tcG9uZW50KVxuICAgIF1cbn0pXG5leHBvcnQgY2xhc3MgRm9ybUNvbXBvbmVudCBleHRlbmRzIFN0eWxhYmxlQ29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95LCBBZnRlckNvbnRlbnRJbml0LCBBZnRlclZpZXdJbml0IHtcbiAgICBzdGF0aWMgIGluaXRpYWxpemVQcm9wcyA9IHJlZ2lzdGVyRm9ybVByb3BzKCk7XG4gICAgQFZpZXdDaGlsZCgnZHluYW1pY0Zvcm0nLCB7IHN0YXRpYzogdHJ1ZSwgcmVhZDogVmlld0NvbnRhaW5lclJlZiB9KSBkeW5hbWljRm9ybVJlZjogVmlld0NvbnRhaW5lclJlZjtcbiAgICBAVmlld0NoaWxkKE1lc3NhZ2VDb21wb25lbnQpIG1lc3NhZ2VSZWY7XG4gICAgLy8gdGhpcyBpcyB0aGUgcmVmZXJlbmNlIHRvIHRoZSBjb21wb25lbnQgcmVmcyBpbnNpZGUgdGhlIGZvcm0tZ3JvdXBcbiAgICBAQ29udGVudENoaWxkcmVuKFdpZGdldFJlZiwge2Rlc2NlbmRhbnRzOiB0cnVlfSkgY29tcG9uZW50UmVmcztcblxuICAgIGF1dG91cGRhdGU7XG4gICAgcHVibGljIGZvcm1sYXlvdXQ6IGFueTtcbiAgICBwdWJsaWMgaXNEYXRhU291cmNlVXBkYXRlZDogYm9vbGVhbjtcbiAgICBjYXB0aW9uQWxpZ25DbGFzczogc3RyaW5nO1xuICAgIHZhbGlkYXRpb250eXBlOiBzdHJpbmc7XG4gICAgY2FwdGlvbmFsaWduOiBzdHJpbmc7XG4gICAgY2FwdGlvbnBvc2l0aW9uOiBzdHJpbmc7XG4gICAgY2FwdGlvbnNpemU7XG4gICAgY29sbGFwc2libGU6IGJvb2xlYW47XG4gICAgZXhwYW5kZWQ6IGJvb2xlYW47XG4gICAgZWxTY29wZTtcbiAgICBfd2lkZ2V0Q2xhc3MgPSAnJztcbiAgICBjYXB0aW9ud2lkdGg6IHN0cmluZztcbiAgICBfY2FwdGlvbkNsYXNzID0gJyc7XG4gICAgbmdmb3JtOiBGb3JtR3JvdXA7XG4gICAgZm9ybUZpZWxkcyA9IFtdO1xuICAgIGZvcm1maWVsZHMgPSB7fTtcbiAgICBmb3JtV2lkZ2V0cyA9IHt9O1xuICAgIGZpbHRlcldpZGdldHMgPSB7fTtcbiAgICBidXR0b25BcnJheSA9IFtdO1xuICAgIGRhdGFvdXRwdXQgPSB7fTtcbiAgICBkYXRhc291cmNlO1xuICAgIGZvcm1kYXRhc291cmNlO1xuICAgIGZvcm1kYXRhID0ge307XG4gICAgaXNTZWxlY3RlZDtcbiAgICBwcmV2RGF0YVZhbHVlcztcbiAgICBwcmV2RGF0YU9iamVjdDtcbiAgICBwcmV2Zm9ybUZpZWxkcztcbiAgICBzdGF0dXNNZXNzYWdlID0ge1xuICAgICAgICBjYXB0aW9uOiAnJyxcbiAgICAgICAgdHlwZTogJydcbiAgICB9O1xuICAgIG1lc3NhZ2VsYXlvdXQ7XG4gICAgbWV0YWRhdGE7XG4gICAgZXJyb3JtZXNzYWdlO1xuICAgIG9uRXJyb3I7XG4gICAgb25TdWNjZXNzO1xuICAgIHByaW1hcnlLZXkgPSBbXTtcbiAgICBwb3N0bWVzc2FnZTtcbiAgICBfbGl2ZVRhYmxlUGFyZW50O1xuICAgIHVwZGF0ZU1vZGU7XG4gICAgbmFtZTtcbiAgICAvLyBMaXZlIEZvcm0gTWV0aG9kc1xuICAgIGNsZWFyRGF0YTogRnVuY3Rpb247XG4gICAgY2FuY2VsOiBGdW5jdGlvbjtcbiAgICBkZWxldGU6IEZ1bmN0aW9uO1xuICAgIHNhdmU6IEZ1bmN0aW9uO1xuICAgIHNhdmVBbmROZXc6IEZ1bmN0aW9uO1xuICAgIHNhdmVBbmRWaWV3OiBGdW5jdGlvbjtcbiAgICBzZXRQcmltYXJ5S2V5OiAoKSA9PiB7fTtcbiAgICBkaWFsb2dJZDogc3RyaW5nO1xuICAgIC8vIExpdmUgRmlsdGVyXG4gICAgZW5hYmxlZW1wdHlmaWx0ZXI7XG4gICAgcGFnZXNpemU7XG4gICAgcmVzdWx0O1xuICAgIHBhZ2luYXRpb247XG4gICAgY2xlYXJGaWx0ZXI6IEZ1bmN0aW9uO1xuICAgIGFwcGx5RmlsdGVyOiBGdW5jdGlvbjtcbiAgICBmaWx0ZXI6IEZ1bmN0aW9uO1xuICAgIGZpbHRlck9uRGVmYXVsdDogRnVuY3Rpb247XG4gICAgb25NYXhEZWZhdWx0VmFsdWVDaGFuZ2U6IEZ1bmN0aW9uO1xuICAgIG51bWJlck9mRmllbGRzOiBudW1iZXI7XG5cbiAgICBwcml2YXRlIF9kZWJvdW5jZWRVcGRhdGVGaWVsZFNvdXJjZTogRnVuY3Rpb24gPSBfZGVib3VuY2UodGhpcy51cGRhdGVGaWVsZFNvdXJjZSwgMzUwKTtcbiAgICBwcml2YXRlIG9wZXJhdGlvblR5cGU7XG4gICAgcHJpdmF0ZSBfaXNMYXlvdXREaWFsb2c7XG4gICAgcHJpdmF0ZSBfZHluYW1pY0NvbnRleHQ7XG4gICAgcHJpdmF0ZSBfaXNHcmlkTGF5b3V0UHJlc2VudDtcbiAgICBwcml2YXRlIHZhbGlkYXRpb25NZXNzYWdlcyA9IFtdO1xuICAgIHByaXZhdGUgZm9ybUdyb3VwTmFtZTtcbiAgICBwcml2YXRlIGZvcm1BcnJheUluZGV4O1xuICAgIHByaXZhdGUgYmluZGluZ1ZhbHVlO1xuICAgIHByaXZhdGUgX2Zvcm1Jc0luTGlzdDtcbiAgICBwcml2YXRlIF90cmlnZ2VyZWRCeVVzZXI6IGJvb2xlYW47XG5cblxuICAgIHByaXZhdGUgX2RlYm91bmNlZFN1Ym1pdEZvcm0gPSBkZWJvdW5jZSgoJGV2ZW50KSA9PiB7XG4gICAgICAgIC8vIGNhbGxpbmcgc3VibWl0IGV2ZW50IGluIG5nWm9uZSBhcyBjaGFuZ2UgZGV0ZWN0aW9uIGlzIG5vdCB0cmlnZ2VyZWQgcG9zdCB0aGUgc3VibWl0IGNhbGxiYWNrIGFuZCBhY3Rpb25zIGxpa2Ugbm90aWZpY2F0aW9uIGFyZSBub3Qgc2hvd25cbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc3VibWl0Rm9ybSgkZXZlbnQpO1xuICAgICAgICB9KTtcbiAgICB9LCAyNTApO1xuXG4gICAgc2V0IGlzTGF5b3V0RGlhbG9nKG52KSB7XG4gICAgICAgIGlmIChudikge1xuICAgICAgICAgICAgcmVtb3ZlQ2xhc3ModGhpcy5uYXRpdmVFbGVtZW50LCAncGFuZWwgYXBwLXBhbmVsIGxpdmVmb3JtLWlubGluZScpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2lzTGF5b3V0RGlhbG9nID0gbnY7XG4gICAgfVxuXG4gICAgZ2V0IGlzTGF5b3V0RGlhbG9nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faXNMYXlvdXREaWFsb2c7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfaXNVcGRhdGVNb2RlO1xuICAgIHNldCBpc1VwZGF0ZU1vZGUobnYpIHtcbiAgICAgICAgdGhpcy5faXNVcGRhdGVNb2RlID0gbnY7XG4gICAgICAgIHRoaXMuZm9ybUZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICAgICAgICAgIGZpZWxkLnNldFJlYWRPbmx5U3RhdGUobnYpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBnZXQgaXNVcGRhdGVNb2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faXNVcGRhdGVNb2RlO1xuICAgIH1cblxuICAgIEBIb3N0QmluZGluZygnYWN0aW9uJykgYWN0aW9uOiBzdHJpbmc7XG5cbiAgICBASG9zdExpc3RlbmVyKCdzdWJtaXQnLCBbJyRldmVudCddKSBzdWJtaXQoJGV2ZW50KSB7XG4gICAgICAgIHRoaXMuX2RlYm91bmNlZFN1Ym1pdEZvcm0oJGV2ZW50KTtcbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKCdyZXNldCcpIG9uUmVzZXQoKSB7XG4gICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKCdrZXlkb3duJywgWyckZXZlbnQnXSkgb25LZXlkb3duSGFuZGxlcihldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgICAgICB0aGlzLl90cmlnZ2VyZWRCeVVzZXIgPSB0cnVlO1xuICAgIH1cbiAgICAvLyByZXR1cm5zIHRoZSBmb3JtQXJyYXkgY29udHJvbCBvbiB0aGUgcGFyZW50Rm9ybS5cbiAgICBnZXQgcGFyZW50Rm9ybUFycmF5KCk6IEZvcm1BcnJheSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcmVudEZvcm0gJiYgdGhpcy5pc1BhcmVudExpc3QgJiYgdGhpcy5wYXJlbnRGb3JtLm5nZm9ybS5nZXQodGhpcy5wYXJlbnRMaXN0Lm5hbWUpIGFzIEZvcm1BcnJheTtcbiAgICB9XG5cbiAgICAvLyByZXR1cm5zIHRydWUgb25seSB3aGVuIGNsb3Nlc3QgbGl2ZWxpc3QgaXMgdGhlIGltbWVkaWF0ZSBwYXJlbnQgb2YgdGhlIGZvcm0uXG4gICAgLy8gY2hlY2tzIGZvciBsaXZlbGlzdCBoYXZpbmcgYW55IGZvcm0gZWxlbWVudHMgd2l0aCBwYXJlbnRGb3JtIG5hbWUuXG4gICAgLy8gSWYgbGl2ZWxpc3QgaXMgbm90IGNvbnRhaW5pbmcgYW55IHBhcmVudEZvcm0gZWxlbWVudHMgdGhlbiBpdCByZXR1cm5zIHRydWUuXG4gICAgZ2V0IGlzUGFyZW50TGlzdCgpIHtcbiAgICAgICAgaWYgKHRoaXMucGFyZW50TGlzdCAmJiB0aGlzLnBhcmVudEZvcm0gJiYgIWlzRGVmaW5lZCh0aGlzLl9mb3JtSXNJbkxpc3QpKSB7XG4gICAgICAgICAgICBjb25zdCBmb3JtRWxlID0gdGhpcy4kZWxlbWVudDtcbiAgICAgICAgICAgIGNvbnN0IGxpc3RFbGUgPSBmb3JtRWxlLmNsb3Nlc3QoJy5hcHAtbGl2ZWxpc3RbbmFtZT1cIicgKyB0aGlzLnBhcmVudExpc3QubmFtZSArICdcIl0nKTtcbiAgICAgICAgICAgIGlmIChsaXN0RWxlLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2Zvcm1Jc0luTGlzdCA9ICEobGlzdEVsZS5maW5kKCdmb3JtW3dpZGdldC1pZD1cIicgKyB0aGlzLnBhcmVudEZvcm0ud2lkZ2V0SWQgKyAnXCJdJykpLmxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXNEZWZpbmVkKHRoaXMuX2Zvcm1Jc0luTGlzdCkgPyB0aGlzLl9mb3JtSXNJbkxpc3QgOiB0aGlzLnBhcmVudExpc3Q7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIGluajogSW5qZWN0b3IsXG4gICAgICAgIHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyLFxuICAgICAgICBwcml2YXRlIGFwcDogQXBwLFxuICAgICAgICBwcml2YXRlIGRpYWxvZ1NlcnZpY2U6IEFic3RyYWN0RGlhbG9nU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBkeW5hbWljQ29tcG9uZW50UHJvdmlkZXI6IER5bmFtaWNDb21wb25lbnRSZWZQcm92aWRlcixcbiAgICAgICAgcHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZSxcbiAgICAgICAgQE9wdGlvbmFsKCkgcHVibGljIHBhcmVudExpc3Q6IExpc3RDb21wb25lbnQsXG4gICAgICAgIEBTa2lwU2VsZigpIEBPcHRpb25hbCgpIHB1YmxpYyBwYXJlbnRGb3JtOiBGb3JtQ29tcG9uZW50LFxuICAgICAgICBAU2tpcFNlbGYoKSBAT3B0aW9uYWwoKSBwdWJsaWMgcGFyZW50UHJlZmFiOiBQcmVmYWJEaXJlY3RpdmUsXG4gICAgICAgIEBTa2lwU2VsZigpIEBPcHRpb25hbCgpIHB1YmxpYyBwYXJlbnRQYXJ0aWFsOiBQYXJ0aWFsRGlyZWN0aXZlLFxuICAgICAgICBAQXR0cmlidXRlKCdiZWZvcmVzdWJtaXQuZXZlbnQnKSBwdWJsaWMgb25CZWZvcmVTdWJtaXRFdnQsXG4gICAgICAgIEBBdHRyaWJ1dGUoJ3N1Ym1pdC5ldmVudCcpIHB1YmxpYyBvblN1Ym1pdEV2dCxcbiAgICAgICAgQEF0dHJpYnV0ZSgnYmVmb3JlcmVuZGVyLmV2ZW50JykgcHVibGljIG9uQmVmb3JlUmVuZGVyRXZ0LFxuICAgICAgICBAQXR0cmlidXRlKCdkYXRhc2V0LmJpbmQnKSBwdWJsaWMgYmluZGRhdGFzZXQsXG4gICAgICAgIEBBdHRyaWJ1dGUoJ2Zvcm1kYXRhLmJpbmQnKSBwcml2YXRlIGJpbmRmb3JtZGF0YSxcbiAgICAgICAgQEF0dHJpYnV0ZSgnd21MaXZlRm9ybScpIGlzTGl2ZUZvcm0sXG4gICAgICAgIEBBdHRyaWJ1dGUoJ3dtTGl2ZUZpbHRlcicpIGlzTGl2ZUZpbHRlcixcbiAgICAgICAgQEF0dHJpYnV0ZSgnZGF0YS1yb2xlJykgcm9sZSxcbiAgICAgICAgQEF0dHJpYnV0ZSgna2V5Jykga2V5LFxuICAgICAgICBAQXR0cmlidXRlKCduYW1lJykgbmFtZSxcbiAgICAgICAgQEluamVjdCgnRVhQTElDSVRfQ09OVEVYVCcpIEBPcHRpb25hbCgpIGV4cGxpY2l0Q29udGV4dDogYW55XG4gICAgKSB7XG4gICAgICAgIHN1cGVyKGluaiwgZ2V0V2lkZ2V0Q29uZmlnKGlzTGl2ZUZvcm0sIGlzTGl2ZUZpbHRlciwgcm9sZSksIGV4cGxpY2l0Q29udGV4dCk7XG5cbiAgICAgICAgc3R5bGVyKHRoaXMubmF0aXZlRWxlbWVudCwgdGhpcyk7XG5cbiAgICAgICAgLy8gcmVtb3ZlIHRpdGxlIHByb3BlcnR5IGFzIGF0dHJpYnV0ZSBhcyBpdCBpcyBjYXVzaW5nIHVubmVjZXNzYXJ5IHRvb2x0aXBcbiAgICAgICAgcmVtb3ZlQXR0cih0aGlzLm5hdGl2ZUVsZW1lbnQsICd0aXRsZScpO1xuICAgICAgICB0aGlzLmlzVXBkYXRlTW9kZSA9IHRydWU7XG4gICAgICAgIHRoaXMuZGlhbG9nSWQgPSB0aGlzLm5hdGl2ZUVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkaWFsb2dJZCcpO1xuICAgICAgICB0aGlzLm5nZm9ybSA9IGZiLmdyb3VwKHt9KTtcbiAgICAgICAgdGhpcy5iaW5kaW5nVmFsdWUgPSBrZXkgfHwgbmFtZTtcblxuICAgICAgICAvLyBPbiB2YWx1ZSBjaGFuZ2UgaW4gZm9ybSwgdXBkYXRlIHRoZSBkYXRhb3V0cHV0XG4gICAgICAgIGNvbnN0IG9uVmFsdWVDaGFuZ2VTdWJzY3JpcHRpb24gPSAgdGhpcy5uZ2Zvcm0udmFsdWVDaGFuZ2VzXG4gICAgICAgICAgICAuc3Vic2NyaWJlKHRoaXMudXBkYXRlRGF0YU91dHB1dC5iaW5kKHRoaXMpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlckRlc3Ryb3lMaXN0ZW5lcigoKSA9PiBvblZhbHVlQ2hhbmdlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCkpO1xuICAgICAgICB0aGlzLmVsU2NvcGUgPSB0aGlzO1xuXG4gICAgICAgIHRoaXMuYWRkRXZlbnRzVG9Db250ZXh0KHRoaXMuY29udGV4dCk7XG4gICAgfVxuXG4gICAgbmdBZnRlckNvbnRlbnRJbml0KCkge1xuICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jb21wb25lbnRSZWZzLmZvckVhY2goY29tcG9uZW50UmVmID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50UmVmLm5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gUmVnaXN0ZXIgd2lkZ2V0cyBpbnNpZGUgZm9ybSB3aXRoIGZvcm1XaWRnZXRzXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybVdpZGdldHNbY29tcG9uZW50UmVmLm5hbWVdID0gY29tcG9uZW50UmVmO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LCAyNTApO1xuICAgIH1cblxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAgICAgaWYgKHRoaXMucGFyZW50Rm9ybSAmJiB0aGlzLnBhcmVudEZvcm0ubmdmb3JtICYmIHRoaXMuaXNQYXJlbnRMaXN0KSB7XG4gICAgICAgICAgICAvLyBzZXR0aW5nIGZvcm1BcnJheSBjb250cm9sIG9uIG5nZm9ybS5cbiAgICAgICAgICAgIGlmICghZ2V0KHRoaXMucGFyZW50Rm9ybS5uZ2Zvcm0uY29udHJvbHMsIHRoaXMucGFyZW50TGlzdC5uYW1lKSkge1xuICAgICAgICAgICAgICAgIHRoaXMucGFyZW50Rm9ybS5uZ2Zvcm0uc2V0Q29udHJvbCh0aGlzLnBhcmVudExpc3QubmFtZSwgbmV3IEZvcm1BcnJheShbXSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gcHVzaGluZyB0aGUgbmdmb3JtIHRvIGZvcm1BcnJheS5cbiAgICAgICAgICAgIHRoaXMucGFyZW50Rm9ybUFycmF5LnB1c2godGhpcy5uZ2Zvcm0pO1xuICAgICAgICAgICAgdGhpcy5mb3JtQXJyYXlJbmRleCA9IHRoaXMucGFyZW50Rm9ybUFycmF5Lmxlbmd0aCAtIDE7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hZGRJbm5lck5nRm9ybVRvRm9ybSh0aGlzLmJpbmRpbmdWYWx1ZSk7XG4gICAgfVxuXG4gICAgZmluZE9wZXJhdGlvblR5cGUoKSB7fVxuXG4gICAgcHJpdmF0ZSBhZGRJbm5lck5nRm9ybVRvRm9ybShiaW5kaW5nKSB7XG4gICAgICAgIGlmICh0aGlzLnBhcmVudEZvcm0gJiYgdGhpcy5wYXJlbnRGb3JtLm5nZm9ybSkge1xuICAgICAgICAgICAgLy8gaGFuZGxpbmcgYXMgZm9ybUFycmF5IHdoZW4gcGFyZW50IGlzIGxpc3QuIEhlbmNlIHJldHVybmluZyBoZXJlIGZyb20gYWRkaW5nIHRvIHBhcmVudEZvcm0gYWdhaW4uXG4gICAgICAgICAgICBpZiAodGhpcy5pc1BhcmVudExpc3QpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBhc3NpZ25pbmcgdGhlIGNvbnRyb2wgbmFtZSBvZiB0aGUgZm9ybSBpbnNpZGUgdGhlIHByZWZhYiB3aXRoIHRoZSBwcmVmYWIgbmFtZS5cbiAgICAgICAgICAgIC8vIFRoaXMgd2lsbCBoYXBwZW4gb25seSB3aGVuIHRoZXJlIGlzIG9ubHkgb25lIGZvcm0gaW5zaWRlIHByZWZhYi5cbiAgICAgICAgICAgIC8vIFdlIGRvIG5vdCBzdXBwb3J0IGNoYW5naW5nIHRoaXMgd2hlbiBtdWx0aXBsZSBmb3JtcyBhcmUgaW5zaWRlIHByZWZhYi5cbiAgICAgICAgICAgIC8vIFRoaXMgc2NlbmFyaW8gaGFzIHRvIGJlIGhhbmRsZWQgYnkgZW5kIHVzZXIgYnkgY2hhbmdpbmcgZm9ybSBuYW1lcyBpbiBwcmVmYWIgYWNjb3JkaW5nIHRvIHRoZSBkYXRhbW9kZWwgYmluZGluZy5cbiAgICAgICAgICAgIGNvbnN0IHBhcmVudENvbnRhaW5lciA9IHRoaXMucGFyZW50UHJlZmFiIHx8IHRoaXMucGFyZW50UGFydGlhbDtcbiAgICAgICAgICAgIGlmIChwYXJlbnRDb250YWluZXIpIHtcbiAgICAgICAgICAgICAgICBsZXQgcGFyZW50Q29udGVudEVsO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnBhcmVudFByZWZhYikge1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnRDb250ZW50RWwgPSBwYXJlbnRDb250YWluZXIuJGVsZW1lbnQuZmluZCgnW3dtcHJlZmFiY29udGFpbmVyXScpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudENvbnRlbnRFbCA9IHBhcmVudENvbnRhaW5lci4kZWxlbWVudDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICogYXNzaWduaW5nIHRoZSBmb3JtIG5hbWUgdG8gdGhlIHBhcmVudENvbnRhaW5lciBuYW1lIGkuZS4gcGFydGlhbCBuYW1lIG9yIHBlcmZhYiBuYW1lIGJ5IGZvbGxvd2luZ1xuICAgICAgICAgICAgICAgICAqIDEuIHJldHJpZXZpbmcgYWxsIHRoZSBmb3JtcyBpbiB0aGUgcGFyZW50Q29udGFpbmVyXG4gICAgICAgICAgICAgICAgICogMi4gY29uc2lkZXIgdGhlIGZpcnN0IGZvcm1cbiAgICAgICAgICAgICAgICAgKiAzLiBpZiB0aGlzIGZvcm0gaXMgaW5zaWRlIGxpc3QgaS5lLiBhbHNvIGZpbmQgaWYgdGhpcyBsaXN0IGlzIGFsc28gaW5zaWRlIHRoZSBwYXJlbnRDb250YWluZXIgKHByZWZhYiAvIHBhcnRpYWwpXG4gICAgICAgICAgICAgICAgICogNC4gdGhlbiBkbyBub3QgY2hhbmdlIHRoZSBmb3JtIG5hbWUgd2hlbiBmb3JtIGlzIGluc2lkZSBsaXN0IGFuZCBhbHNvIHdoZW4gdGhlcmUgYXJlIHNpYmxpbmdzIHRvIHRoZSBmb3JtXG4gICAgICAgICAgICAgICAgICogNS4gdGhpcyBtZWFucyBmb3JtIG5hbWUgY2hhbmdlIGFwcGxpZXMgb25seSB3aGVuIHRoZXJlIGlzIHNpbmdsZSBmb3JtIChpbW1lZGlhdGUgY2hpbGQpIGluc2lkZSB0aGUgcGFyZW50Q29udGFpbmVyLlxuICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgIGNvbnN0IHByZWZhYklubmVyRm9ybSA9IHBhcmVudENvbnRlbnRFbC5maW5kKCdmb3JtJykuZmlyc3QoKTtcbiAgICAgICAgICAgICAgICBpZiAoZ2V0KHByZWZhYklubmVyRm9ybVswXSwgJ3dpZGdldC53aWRnZXRJZCcpID09PSB0aGlzLndpZGdldElkKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIHdoZXRoZXIgZm9ybSBpbnNpZGUgcHJlZmFiIGNvbnRhaW5lciBpcyBpbnNpZGUgdGhlIGxpc3QuIElmIHRydWUsIGRvIG5vdCBjaGFuZ2UgdGhlIG5hbWUuXG4gICAgICAgICAgICAgICAgICAgIGlmICghcHJlZmFiSW5uZXJGb3JtLmlzUGFyZW50TGlzdCAmJiAhcHJlZmFiSW5uZXJGb3JtLnNpYmxpbmdzKCdmb3JtJykubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBiaW5kaW5nID0gZ2V0KHBhcmVudENvbnRhaW5lciwgJ25hbWUnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBjb3VudGVyID0gMTtcbiAgICAgICAgICAgIGxldCBpbm5lckJpbmRpbmcgPSBiaW5kaW5nO1xuICAgICAgICAgICAgLy8gSW5uZXIgZm9ybXMgbWF5IGhhdmUgc2FtZSBuYW1lcy4gSWYgc2FtZSBuYW1lIGlzIHByZXNlbnQsIGFwcGVuZCB1bnFpdWUgaWRlbnRpZmllclxuICAgICAgICAgICAgd2hpbGUgKHRoaXMucGFyZW50Rm9ybS5uZ2Zvcm0uY29udHJvbHMuaGFzT3duUHJvcGVydHkoaW5uZXJCaW5kaW5nKSkge1xuICAgICAgICAgICAgICAgIGlubmVyQmluZGluZyA9IGAke2JpbmRpbmd9XyR7Y291bnRlcn1gO1xuICAgICAgICAgICAgICAgIGNvdW50ZXIrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwTmFtZSA9IGlubmVyQmluZGluZztcbiAgICAgICAgICAgIC8vIElmIHBhcmVudCBmb3JtIGlzIHByZXNlbnQsIGFkZCB0aGUgY3VycmVudCBmb3JtIGFzIGFzIGZvcm1Hcm91cCBmb3IgcGFyZW50IGZvcm1cbiAgICAgICAgICAgIHRoaXMucGFyZW50Rm9ybS5uZ2Zvcm0uYWRkQ29udHJvbChpbm5lckJpbmRpbmcsIHRoaXMubmdmb3JtKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEV4cG9zZSB0aGUgZXZlbnRzIG9uIGNvbnRleHQgc28gdGhhdCB0aGV5IGNhbiBiZSBhY2Nlc3NlZCBieSBmb3JtIGFjdGlvbnNcbiAgICBwcml2YXRlIGFkZEV2ZW50c1RvQ29udGV4dChjb250ZXh0KSB7XG4gICAgICAgIGNvbnRleHQuY2FuY2VsID0gKCkgPT4gdGhpcy5jYW5jZWwoKTtcbiAgICAgICAgY29udGV4dC5yZXNldCA9ICgpID0+IHRoaXMucmVzZXQoKTtcbiAgICAgICAgY29udGV4dC5zYXZlID0gZXZ0ID0+IHRoaXMuc2F2ZShldnQpO1xuICAgICAgICBjb250ZXh0LnNhdmVBbmROZXcgPSAoKSA9PiB0aGlzLnNhdmVBbmROZXcoKTtcbiAgICAgICAgY29udGV4dC5zYXZlQW5kVmlldyA9ICgpID0+IHRoaXMuc2F2ZUFuZFZpZXcoKTtcbiAgICAgICAgY29udGV4dC5kZWxldGUgPSAoKSA9PiB0aGlzLmRlbGV0ZSgpO1xuICAgICAgICBjb250ZXh0Lm5ldyA9ICgpID0+IHRoaXMubmV3KCk7XG4gICAgICAgIGNvbnRleHQuZWRpdCA9ICgpID0+IHRoaXMuZWRpdCgpO1xuICAgICAgICBjb250ZXh0LmhpZ2hsaWdodEludmFsaWRGaWVsZHMgPSAoKSA9PiB0aGlzLmhpZ2hsaWdodEludmFsaWRGaWVsZHMoKTtcbiAgICAgICAgY29udGV4dC5maWx0ZXIgPSAoKSA9PiB0aGlzLmZpbHRlcigpO1xuICAgICAgICBjb250ZXh0LmNsZWFyRmlsdGVyID0gKCkgPT4gdGhpcy5jbGVhckZpbHRlcigpO1xuICAgICAgICBjb250ZXh0LnN1Ym1pdCA9IGV2dCA9PiB0aGlzLnN1Ym1pdChldnQpO1xuICAgIH1cblxuICAgIC8vIFRoaXMgbWV0aG9kIGdldHMgYWxsIHRoZSBpbm5lciBmb3JtcyBhbmQgdmFsaWRhdGVzIGVhY2ggZm9ybS5cbiAgICBwcml2YXRlIHNldFZhbGlkYXRpb25PbklubmVyRm9ybXModmFsaWRhdGVUb3VjaCkge1xuICAgICAgICBjb25zdCBmb3JtRWxlID0gdGhpcy5nZXROYXRpdmVFbGVtZW50KCk7XG4gICAgICAgIGNvbnN0IGZvcm1PYmpzID0gZm9ybUVsZS5xdWVyeVNlbGVjdG9yQWxsKCcuYXBwLWZvcm0nKTtcbiAgICAgICAgY29uc3QgdmFsaWRhdGlvbk1zZ3MgPSBbXTtcbiAgICAgICAgZm9yRWFjaChmb3JtT2JqcywgZSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmb3JtSW5zdGFuY2UgPSAoZSBhcyBhbnkpLndpZGdldDtcbiAgICAgICAgICAgIC8vIGRpZmZlcmVudGlhdGluZyB0aGUgdmFsaWRhdGlvbk1lc3NhZ2VzIHByZWZpeCBiYXNlZCBvbiB0aGUgZm9ybUdyb3VwTmFtZVxuICAgICAgICAgICAgLy8gYXMgdGhlIGZvcm1OYW1lJ3MgYXJlIHNhbWUgd2hlbiBmb3JtcyBhcmUgaW4gbGlzdFxuICAgICAgICAgICAgbGV0IGZvcm1OYW1lID0gZ2V0KGZvcm1JbnN0YW5jZSwgJ2Zvcm1Hcm91cE5hbWUnKSB8fCBmb3JtSW5zdGFuY2UubmFtZTtcbiAgICAgICAgICAgIGlmIChpc0RlZmluZWQoZm9ybUluc3RhbmNlLmZvcm1BcnJheUluZGV4KSkge1xuICAgICAgICAgICAgICAgIGZvcm1OYW1lID0gZm9ybU5hbWUgKyAnWycgKyBmb3JtSW5zdGFuY2UuZm9ybUFycmF5SW5kZXggKyAnXSc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgY3VycmVudCA9IGZvcm1JbnN0YW5jZTtcbiAgICAgICAgICAgIHdoaWxlIChnZXQoY3VycmVudCwgJ3BhcmVudEZvcm0nKSkge1xuICAgICAgICAgICAgICAgIGxldCBwYXJlbnROYW1lID0gY3VycmVudC5wYXJlbnRGb3JtLmZvcm1Hcm91cE5hbWUgfHwgY3VycmVudC5wYXJlbnRGb3JtLm5hbWU7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnQucGFyZW50Rm9ybS5wYXJlbnRGb3JtQXJyYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50TmFtZSA9IHBhcmVudE5hbWUgKyAnWycgKyBjdXJyZW50LnBhcmVudEZvcm0uZm9ybUFycmF5SW5kZXggKyAnXSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZvcm1OYW1lID0gcGFyZW50TmFtZSArICcuJyArIGZvcm1OYW1lO1xuICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LnBhcmVudEZvcm07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNldFZhbGlkYXRpb25PbkZpZWxkcyhmb3JtSW5zdGFuY2UsIGZvcm1OYW1lLCB2YWxpZGF0ZVRvdWNoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2Qgc2V0cyB2YWxpZGF0aW9uIG9uIGZvcm1GaWVsZHMuXG4gICAgICogQXBwbGllcyB0byBpbm5lcmZvcm0gYW5kIGFsc28gc2V0cyBpbm5lcmZvcm0gdmFsaWRhdGlvbiBvbiBwYXJlbnQgZm9ybS5cbiAgICAgKiBAcGFyYW0gcHJlZml4IGNvbnRhaW5zIHRoZSBmb3JtIG5hbWUsIHdoaWNoIGFsc28gaW5jbHVkZXMgaXRzIHBhcmVudHMgZm9ybSBuYW1lXG4gICAgICogQHBhcmFtIHtib29sZWFufSB2YWxpZGF0ZVRvdWNoXG4gICAgICovXG4gICAgcHJpdmF0ZSBzZXRWYWxpZGF0aW9uT25GaWVsZHMoZm9ybTogRm9ybUNvbXBvbmVudCwgcHJlZml4OiBzdHJpbmcsIHZhbGlkYXRlVG91Y2g/OiBib29sZWFuKSB7XG4gICAgICAgIGNvbnN0IGNvbnRyb2xzID0gZm9ybS5uZ2Zvcm0uY29udHJvbHM7XG4gICAgICAgIGNvbnN0IGZvcm1GaWVsZHMgPSBmb3JtLmZvcm1GaWVsZHM7XG4gICAgICAgIGlmICghZm9ybUZpZWxkcykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGZvckVhY2goY29udHJvbHMsICh2LCBrKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmaWVsZCA9IGZvcm1GaWVsZHMuZmluZChlID0+IGUua2V5ID09PSBrKTtcbiAgICAgICAgICAgIGlmICghZmllbGQgfHwgKHZhbGlkYXRlVG91Y2ggJiYgIXYudG91Y2hlZCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaWVsZC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0Jyk/LnNldEF0dHJpYnV0ZSgnYXJpYS1pbnZhbGlkJywgdi5pbnZhbGlkKTtcbiAgICAgICAgICAgIC8vIGludm9raW5nIHRoZSBwcmVwYXJlVmFsaWRhdGlvbiBvbiBib3RoIHBhcmVudCBmb3JtIGFuZCBjdXJyZW50IGZvcm0uXG4gICAgICAgICAgICB0aGlzLnByZXBhcmVWYWxpZGF0aW9uT2JqKHYsIGssIGZpZWxkLCBwcmVmaXgpO1xuICAgICAgICAgICAgdGhpcy5wcmVwYXJlVmFsaWRhdGlvbk9iai5jYWxsKGZvcm0sIHYsIGssIGZpZWxkLCBwcmVmaXgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBBc3NpZ25zIC8gdXBkYXRlcyB2YWxpZGF0aW9uTWVzc2FnZXMgYmFzZWQgb24gYW5ndWxhciBlcnJvcnMgb24gZmllbGRcbiAgICBwcml2YXRlIHByZXBhcmVWYWxpZGF0aW9uT2JqKHYsIGssIGZpZWxkLCBwcmVmaXgpIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLnZhbGlkYXRpb25NZXNzYWdlcy5maW5kSW5kZXgoZSA9PiAoZS5maWVsZCA9PT0gayAmJiBlLmZ1bGx5UXVhbGlmaWVkRm9ybU5hbWUgPT09IHByZWZpeCkpO1xuICAgICAgICBpZiAodi5pbnZhbGlkKSB7XG4gICAgICAgICAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICogZmllbGQgY29udGFpbnMgdGhlIGZpZWxkTmFtZVxuICAgICAgICAgICAgICAgICAqIHZhbHVlIGNvbnRhaW5zIHRoZSBmaWVsZCB2YWx1ZVxuICAgICAgICAgICAgICAgICAqIGVycm9yVHlwZSBjb250YWlucyB0aGUgbGlzdCBvZiBlcnJvcnNcbiAgICAgICAgICAgICAgICAgKiBtZXNzYWdlIGNvbnRhaW5zIHRoZSB2YWxpZGF0aW9uIG1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgKiBnZXRFbGVtZW50IHJldHVybnMgdGhlIGVsZW1lbnQgaGF2aW5nIGZvY3VzLXRhcmdldFxuICAgICAgICAgICAgICAgICAqIGZvcm1OYW1lIHJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGZvcm1cbiAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgZmllbGQ6IGssXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmaWVsZC52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JUeXBlOiBrZXlzKHYuZXJyb3JzKSxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogZmllbGQudmFsaWRhdGlvbm1lc3NhZ2UgfHwgJycsXG4gICAgICAgICAgICAgICAgICAgIGdldEVsZW1lbnQ6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmaWVsZC4kZWxlbWVudC5maW5kKCdbZm9jdXMtdGFyZ2V0XScpO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBmb3JtTmFtZTogbGFzdChwcmVmaXguc3BsaXQoJy4nKSksXG4gICAgICAgICAgICAgICAgICAgIGZ1bGx5UXVhbGlmaWVkRm9ybU5hbWU6IHByZWZpeFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlc1tpbmRleF0udmFsdWUgPSBmaWVsZC52YWx1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlc1tpbmRleF0uZXJyb3JUeXBlID0ga2V5cyh2LmVycm9ycyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodi52YWxpZCAmJiBpbmRleCA+IC0xKSB7XG4gICAgICAgICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gVGhpcyB3aWxsIHJldHVybiBhIG9iamVjdCBjb250YWluaW5nIHRoZSBlcnJvciBkZXRhaWxzIGZyb20gdGhlIGxpc3Qgb2YgZm9ybUZpZWxkcyB0aGF0IGFyZSBpbnZhbGlkXG4gICAgcHJpdmF0ZSBzZXRWYWxpZGF0aW9uTXNncyh2YWxpZGF0ZVRvdWNoPzogYm9vbGVhbikge1xuICAgICAgICBpZiAoIXRoaXMuZm9ybUZpZWxkcy5sZW5ndGggJiYgaXNFbXB0eSh0aGlzLm5nZm9ybS5jb250cm9scykpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldFZhbGlkYXRpb25PbkZpZWxkcyh0aGlzLCB0aGlzLm5hbWUsIHZhbGlkYXRlVG91Y2gpO1xuICAgICAgICB0aGlzLnNldFZhbGlkYXRpb25PbklubmVyRm9ybXModmFsaWRhdGVUb3VjaCk7XG4gICAgfVxuXG4gICAgLy8gY2hhbmdlIGFuZCBibHVyIGV2ZW50cyBhcmUgYWRkZWQgZnJvbSB0aGUgdGVtcGxhdGVcbiAgICBwcm90ZWN0ZWQgaGFuZGxlRXZlbnQobm9kZTogSFRNTEVsZW1lbnQsIGV2ZW50TmFtZTogc3RyaW5nLCBjYWxsYmFjazogRnVuY3Rpb24sIGxvY2FsczogYW55KSB7XG4gICAgICAgIGlmIChldmVudE5hbWUgIT09ICdzdWJtaXQnKSB7XG4gICAgICAgICAgICBzdXBlci5oYW5kbGVFdmVudCh0aGlzLm5hdGl2ZUVsZW1lbnQsIGV2ZW50TmFtZSwgY2FsbGJhY2ssIGxvY2Fscyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZUZpZWxkU291cmNlKCkge1xuICAgICAgICBpZiAodGhpcy5mb3JtZGF0YXNvdXJjZSAmJiB0aGlzLmZvcm1kYXRhc291cmNlLmV4ZWN1dGUoRGF0YVNvdXJjZS5PcGVyYXRpb24uSVNfQVBJX0FXQVJFKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZm9ybWRhdGFzb3VyY2UgJiYgIXRoaXMuZm9ybWRhdGFzb3VyY2UudHdvV2F5QmluZGluZykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZm9ybUZpZWxkcy5mb3JFYWNoKGZvcm1GaWVsZCA9PiB7XG4gICAgICAgICAgICBmb3JtRmllbGQuc2V0Rm9ybVdpZGdldCgnZGF0YXZhbHVlc291cmNlJywgdGhpcy5mb3JtZGF0YXNvdXJjZSk7XG4gICAgICAgICAgICBmb3JtRmllbGQuc2V0Rm9ybVdpZGdldCgnYmluZGRhdGF2YWx1ZScsIGAke3RoaXMuYmluZGZvcm1kYXRhfS4ke2Zvcm1GaWVsZC5rZXl9YCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFRoaXMgbWV0aG9kIGxvb3BzIHRocm91Z2ggdGhlIGZvcm0gZmllbGRzIGFuZCBoaWdobGlnaHRzIHRoZSBpbnZhbGlkIGZpZWxkcyBieSBzZXR0aW5nIHN0YXRlIHRvIHRvdWNoZWRcbiAgICBoaWdobGlnaHRJbnZhbGlkRmllbGRzKCkge1xuICAgICAgICBzZXRUb3VjaGVkU3RhdGUodGhpcywgdGhpcy5uZ2Zvcm0sICcnKTtcbiAgICB9XG5cbiAgICAvLyBEaXNhYmxlIHRoZSBmb3JtIHN1Ym1pdCBpZiBmb3JtIGlzIGluIGludmFsaWQgc3RhdGUuIEhpZ2hsaWdodCBhbGwgdGhlIGludmFsaWQgZmllbGRzIGlmIHZhbGlkYXRpb24gdHlwZSBpcyBkZWZhdWx0XG4gICAgdmFsaWRhdGVGaWVsZHNPblN1Ym1pdCgpIHtcbiAgICAgICAgdGhpcy5zZXRWYWxpZGF0aW9uTXNncygpO1xuICAgICAgICAvLyBEaXNhYmxlIHRoZSBmb3JtIHN1Ym1pdCBpZiBmb3JtIGlzIGluIGludmFsaWQgc3RhdGUuIEZvciBkZWxldGUgb3BlcmF0aW9uLCBkbyBub3QgY2hlY2sgdGhlIHZhbGlkYXRpb24uXG4gICAgICAgIGlmICh0aGlzLm9wZXJhdGlvblR5cGUgIT09ICdkZWxldGUnICYmICh0aGlzLnZhbGlkYXRpb250eXBlID09PSAnaHRtbCcgfHwgdGhpcy52YWxpZGF0aW9udHlwZSA9PT0gJ2RlZmF1bHQnKVxuICAgICAgICAgICAgICAgICYmIHRoaXMubmdmb3JtICYmIHRoaXMubmdmb3JtLmludmFsaWQpIHtcblxuICAgICAgICAgICAgaWYgKHRoaXMubmdmb3JtLmludmFsaWQpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy52YWxpZGF0aW9udHlwZSA9PT0gJ2RlZmF1bHQnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGlnaGxpZ2h0SW52YWxpZEZpZWxkcygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBGaW5kIHRoZSBmaXJzdCBpbnZhbGlkIHVudG9jaGVkIGVsZW1lbnQgYW5kIHNldCBpdCB0byB0b3VjaGVkLlxuICAgICAgICAgICAgICAgIC8vIFNhZmFyaSBkb2VzIG5vdCBmb3JtIHZhbGlkYXRpb25zLiB0aGlzIHdpbGwgZW5zdXJlIHRoYXQgZXJyb3IgaXMgc2hvd24gZm9yIHVzZXJcbiAgICAgICAgICAgICAgICBjb25zdCBlbGVGb3JtID0gZmluZEludmFsaWRFbGVtZW50KHRoaXMuJGVsZW1lbnQsIHRoaXMubmdmb3JtKTtcbiAgICAgICAgICAgICAgICBjb25zdCAkaW52YWxpZEZvcm0gPSBlbGVGb3JtLm5nRm9ybTtcbiAgICAgICAgICAgICAgICBsZXQgJGludmFsaWRFbGUgID0gZWxlRm9ybS4kZWxlO1xuICAgICAgICAgICAgICAgICRpbnZhbGlkRWxlID0gJGludmFsaWRFbGUucGFyZW50KCkuZmluZCgnW2ZvY3VzLXRhcmdldF0nKTtcbiAgICAgICAgICAgICAgICBpZiAoJGludmFsaWRFbGUubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIG9uIHNhdmUgY2xpY2sgaW4gcGFnZSBsYXlvdXQgbGl2ZWZvcm0sIGZvY3VzIG9mIGF1dG9jb21wbGV0ZSB3aWRnZXQgb3BlbnMgZnVsbC1zY3JlZW4gc2VhcmNoLlxuICAgICAgICAgICAgICAgICAgICBpZiAoISRpbnZhbGlkRWxlLmhhc0NsYXNzKCdhcHAtc2VhcmNoLWlucHV0JykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICRpbnZhbGlkRWxlLmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmdFbGUgPSAkaW52YWxpZEZvcm0gJiYgJGludmFsaWRGb3JtLmNvbnRyb2xzWyRpbnZhbGlkRWxlLmF0dHIoJ2Zvcm1Db250cm9sTmFtZScpIHx8ICRpbnZhbGlkRWxlLmF0dHIoJ25hbWUnKV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChuZ0VsZSAmJiBuZ0VsZS5tYXJrQXNUb3VjaGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZ0VsZS5tYXJrQXNUb3VjaGVkKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgJGFwcERpZ2VzdCgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIG9uUHJvcGVydHlDaGFuZ2Uoa2V5LCBudiwgb3Y/KSB7XG4gICAgICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICAgICAgICBjYXNlICdjYXB0aW9uYWxpZ24nOlxuICAgICAgICAgICAgICAgIHRoaXMuY2FwdGlvbkFsaWduQ2xhc3MgPSAnYWxpZ24tJyArIG52O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnY2FwdGlvbnBvc2l0aW9uJzpcbiAgICAgICAgICAgICAgICB0aGlzLnNldExheW91dENvbmZpZygpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnY2FwdGlvbndpZHRoJzpcbiAgICAgICAgICAgICAgICB0aGlzLnNldExheW91dENvbmZpZygpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnY2FwdGlvbnNpemUnOlxuICAgICAgICAgICAgICAgIHRoaXMuY2FwdGlvbnNpemUgPSBudjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ25vdmFsaWRhdGUnOlxuICAgICAgICAgICAgICAgIC8vICBTZXQgdmFsaWRhdGlvbiB0eXBlIGJhc2VkIG9uIHRoZSBub3ZhbGlkYXRlIHByb3BlcnR5XG4gICAgICAgICAgICAgICAgdGhpcy53aWRnZXQudmFsaWRhdGlvbnR5cGUgPSAobnYgPT09IHRydWUgfHwgbnYgPT09ICd0cnVlJykgPyAnbm9uZScgOiAnZGVmYXVsdCc7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdmb3JtZGF0YSc6XG4gICAgICAgICAgICAgICAgLy8gRm9yIGxpdmVsaXN0IHdoZW4gbXVsdGlzZWxlY3QgaXMgZW5hYmxlZCwgZm9ybWRhdGEgd2lsbCBiZSBhcnJheSBvZiBvYmplY3RzLiBJbiB0aGlzIGNhc2UgY29uc2lkZXIgdGhlIGxhc3Qgb2JqZWN0IGFzIGZvcm1kYXRhLlxuICAgICAgICAgICAgICAgIGlmIChpc0VxdWFsKG52LCBvdikpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlzQXJyYXkobnYpID8gdGhpcy5zZXRGb3JtRGF0YShsYXN0KG52KSkgOiB0aGlzLnNldEZvcm1EYXRhKG52KTtcbiAgICAgICAgICAgICAgICAvLyBpZiBkYXRhc2V0IG9uIHRoZSBmb3JtRmllbGRzIGFyZSBub3Qgc2V0IGFzIHRoZSBkYXRhc291cmNlQ2hhbmdlIGlzIHRyaWdnZXJlZCBiZWZvcmUgdGhlIGZvcm1GaWVsZHMgYXJlIHJlZ2lzdGVyZWQuXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzRGF0YVNvdXJjZVVwZGF0ZWQgJiYgdGhpcy5kYXRhc291cmNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25EYXRhU291cmNlQ2hhbmdlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZGVmYXVsdG1vZGUnOlxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc0xheW91dERpYWxvZykge1xuICAgICAgICAgICAgICAgICAgICBpZiAobnYgJiYgbnYgPT09ICdFZGl0Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVNb2RlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlTW9kZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNVcGRhdGVNb2RlID0gdGhpcy51cGRhdGVNb2RlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2RhdGFzb3VyY2UnOlxuICAgICAgICAgICAgICAgIHRoaXMub25EYXRhU291cmNlQ2hhbmdlKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdmb3JtZGF0YXNvdXJjZSc6XG4gICAgICAgICAgICAgICAgdGhpcy5vbkZvcm1EYXRhU291cmNlQ2hhbmdlKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdtZXRhZGF0YSc6XG4gICAgICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZUZvcm1GaWVsZHMoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2RhdGFzZXQnOlxuICAgICAgICAgICAgICAgIGNvbnN0IGZvcm1GaWVsZHMgPSB0aGlzLmdldEZvcm1GaWVsZHMoKTtcbiAgICAgICAgICAgICAgICBmb3JtRmllbGRzLmZvckVhY2goZmllbGQgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBub3RpZnlpbmcgdGhlIGRhdGFzZXQgY2hhbmdlIHRvIHRoZSBmb3JtLWZpZWxkIHdpZGdldC5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFmaWVsZC5pc0RhdGFTZXRCb3VuZCAmJiBnZXQoZmllbGQuZm9ybVdpZGdldCwgJ2RhdGFzZXQkJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLmZvcm1XaWRnZXQuZGF0YXNldCQubmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHN1cGVyLm9uUHJvcGVydHlDaGFuZ2Uoa2V5LCBudiwgb3YpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gRXZlbnQgY2FsbGJhY2tzIG9uIHN1Y2Nlc3MvZXJyb3JcbiAgICBvblJlc3VsdENiKGRhdGEsIHN0YXR1cywgZXZlbnQ/KSB7XG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IHskZXZlbnQ6IGV2ZW50LCAkZGF0YTogZGF0YSwgJG9wZXJhdGlvbjogdGhpcy5vcGVyYXRpb25UeXBlfTtcbiAgICAgICAgLy8gd2hldGhlciBzZXJ2aWNlIGNhbGwgc3VjY2VzcyBvciBmYWlsdXJlIGNhbGwgdGhpcyBtZXRob2RcbiAgICAgICAgdGhpcy5pbnZva2VFdmVudENhbGxiYWNrKCdyZXN1bHQnLCBwYXJhbXMpO1xuICAgICAgICBpZiAoc3RhdHVzKSB7XG4gICAgICAgICAgICAvLyBpZiBzZXJ2aWNlIGNhbGwgaXMgc3VjY2VzcyBjYWxsIHRoaXMgbWV0aG9kXG4gICAgICAgICAgICB0aGlzLmludm9rZUV2ZW50Q2FsbGJhY2soJ3N1Y2Nlc3MnLCBwYXJhbXMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gaWYgc2VydmljZSBjYWxsIGZhaWxzIGNhbGwgdGhpcyBtZXRob2RcbiAgICAgICAgICAgIHRoaXMuaW52b2tlRXZlbnRDYWxsYmFjaygnZXJyb3InLCBwYXJhbXMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gRGlzcGxheSBvciBoaWRlIHRoZSBpbmxpbmUgbWVzc2FnZS8gdG9hc3RlclxuICAgIHRvZ2dsZU1lc3NhZ2Uoc2hvdzogYm9vbGVhbiwgbXNnPzogc3RyaW5nLCB0eXBlPzogc3RyaW5nLCBoZWFkZXI/OiBzdHJpbmcpIHtcbiAgICAgICAgbGV0IHRlbXBsYXRlO1xuICAgICAgICBpZiAoc2hvdyAmJiBtc2cpIHtcbiAgICAgICAgICAgIHRlbXBsYXRlID0gKHR5cGUgPT09ICdlcnJvcicgJiYgdGhpcy5lcnJvcm1lc3NhZ2UpID8gdGhpcy5lcnJvcm1lc3NhZ2UgOiBtc2c7XG4gICAgICAgICAgICBpZiAodGhpcy5tZXNzYWdlbGF5b3V0ID09PSAnSW5saW5lJykge1xuICAgICAgICAgICAgICAgIHRlbXBsYXRlID0gdGhpcy5jaGVja0FwcFNlcnZpY2VFcnJvck1zZyh0eXBlKSB8fCB0ZW1wbGF0ZTtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXR1c01lc3NhZ2UgPSB7J2NhcHRpb24nOiB0ZW1wbGF0ZSB8fCAnJywgdHlwZTogdHlwZX07XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubWVzc2FnZVJlZikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VSZWYuc2hvd01lc3NhZ2UodGhpcy5zdGF0dXNNZXNzYWdlLmNhcHRpb24sIHRoaXMuc3RhdHVzTWVzc2FnZS50eXBlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gd2hlbiBtZXNzYWdlIGxheW91dCBpcyBpbmxpbmUgb24gc2F2ZSwgc2Nyb2xsIHRoZSB2aWV3IHRvIHRvcCBvZiB0aGUgZm9ybSB0byBzZWUgdGhlIHN0YXR1cyBvZiB0aGUgb3BlcmF0aW9uXG4gICAgICAgICAgICAgICAgaWYgKCFpc0VsZW1lbnRJblZpZXdwb3J0KHRoaXMuJGVsZW1lbnRbMF0pKSB7XG4gICAgICAgICAgICAgICAgICAgIHNjcm9sbFRvRWxlbWVudCh0aGlzLiRlbGVtZW50WzBdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuYXBwLm5vdGlmeUFwcCh0ZW1wbGF0ZSwgdHlwZSwgaGVhZGVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdHVzTWVzc2FnZS5jYXB0aW9uID0gJyc7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBpZiB0aGVyZSBpcyBhbiBBcHAub25TZXJ2aWNlRXJyb3IgaGFuZGxlciBmb3IgdGhlIGFwcCwgdGhhdCBtZXNzYWdlIHNob3VsZCBiZSB1c2VkIGluc3RlYWQgb2Ygc2VydmVyIHJldHVybmVkIGVycm9yIG1lc3NhZ2VcbiAgICBjaGVja0FwcFNlcnZpY2VFcnJvck1zZyh0eXBlKSB7XG4gICAgICAgIGNvbnN0IG5vdGlmaWNhdGlvbkFjdGlvbiA9IGdldCh0aGlzLmFwcCwgJ0FjdGlvbnMuYXBwTm90aWZpY2F0aW9uJyk7XG4gICAgICAgIGlmIChub3RpZmljYXRpb25BY3Rpb24gJiYgdHlwZSA9PT0gJ2Vycm9yJykge1xuICAgICAgICAgICAgcmV0dXJuIG5vdGlmaWNhdGlvbkFjdGlvbi5nZXRNZXNzYWdlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEhpZGUgdGhlIGlubGluZSBtZXNzYWdlLyB0b2FzdGVyXG4gICAgY2xlYXJNZXNzYWdlKCkge1xuICAgICAgICB0aGlzLnRvZ2dsZU1lc3NhZ2UoZmFsc2UpO1xuICAgIH1cblxuICAgIC8vIFNldCB0aGUgY2xhc3NlcyBvbiB0aGUgZm9ybSBiYXNlZCBvbiB0aGUgY2FwdGlvbnBvc2l0aW9uIGFuZCBjYXB0aW9ud2lkdGggcHJvcGVydGllc1xuICAgIHByaXZhdGUgc2V0TGF5b3V0Q29uZmlnKCkge1xuICAgICAgICBsZXQgbGF5b3V0Q29uZmlnO1xuICAgICAgICBsYXlvdXRDb25maWcgPSBnZXRGaWVsZExheW91dENvbmZpZyh0aGlzLmNhcHRpb253aWR0aCwgdGhpcy5jYXB0aW9ucG9zaXRpb24sIGdldCh0aGlzLmFwcC5zZWxlY3RlZFZpZXdQb3J0LCAnb3MnKSk7XG4gICAgICAgIHRoaXMuX3dpZGdldENsYXNzID0gbGF5b3V0Q29uZmlnLndpZGdldENscztcbiAgICAgICAgdGhpcy5fY2FwdGlvbkNsYXNzID0gbGF5b3V0Q29uZmlnLmNhcHRpb25DbHM7XG5cbiAgICAgICAgJGFwcERpZ2VzdCgpO1xuICAgIH1cblxuICAgIHJlZ2lzdGVyRm9ybVdpZGdldCh3aWRnZXQpIHtcbiAgICAgICAgY29uc3QgbmFtZSA9IHdpZGdldC5uYW1lIHx8IHdpZGdldC5rZXk7XG4gICAgICAgIHRoaXMuZm9ybVdpZGdldHNbbmFtZV0gPSB3aWRnZXQ7XG4gICAgfVxuXG4gICAgcmVnaXN0ZXJGb3JtRmllbGRzKGZvcm1GaWVsZCkge1xuICAgICAgICBjb25zdCBmaWVsZENvdW50ID0gdGhpcy5mb3JtRmllbGRzLnB1c2goZm9ybUZpZWxkKTtcbiAgICAgICAgdGhpcy5mb3JtZmllbGRzW2Zvcm1GaWVsZC5rZXldID0gZm9ybUZpZWxkO1xuICAgICAgICB0aGlzLnJlZ2lzdGVyRm9ybVdpZGdldChmb3JtRmllbGQpO1xuICAgICAgICB0aGlzLl9kZWJvdW5jZWRVcGRhdGVGaWVsZFNvdXJjZSgpO1xuICAgICAgICBpZiAodGhpcy5wYXJlbnRGb3JtKSB7XG4gICAgICAgICAgICB0aGlzLnBhcmVudEZvcm0uZm9ybUZpZWxkcy5wdXNoKGZvcm1GaWVsZCk7XG4gICAgICAgICAgICB0aGlzLnBhcmVudEZvcm0uZm9ybWZpZWxkc1tmb3JtRmllbGQua2V5XSA9IGZvcm1GaWVsZDtcbiAgICAgICAgICAgIC8vIGlubmVyIGZvcm1maWVsZHMgYXJlIHB1c2hlZCB0byBwYXJlbnRGb3JtLCBwYXNzaW5nIGN1cnJlbnQgaW5uZXJGb3JtJ3MgZm9ybWRhdGEgdG8gc2V0IGlubmVyRm9ybWRhdGEgdG8gdGhlc2UgaW5uZXJGb3JtRmllbGRzXG4gICAgICAgICAgICB0aGlzLnBhcmVudEZvcm0uc2V0Rm9ybURhdGEodGhpcy5wYXJlbnRGb3JtLmZvcm1kYXRhLCB0aGlzLmZvcm1GaWVsZHMsIHRoaXMuZm9ybWRhdGEgfHwge30pO1xuICAgICAgICB9XG4gICAgICAgIC8vIFdNUy0xODk2NzogQXBwbHlpbmcgZm9ybWFkYXRhIGFmdGVyIGZvcm1maWVsZHMgYXJlIHJlYWR5XG4gICAgICAgIGlmIChmaWVsZENvdW50ID09PSB0aGlzLm51bWJlck9mRmllbGRzICYmICFpc0VtcHR5KHRoaXMuZm9ybWRhdGEpKSB7XG4gICAgICAgICAgICB0aGlzLm9uRGF0YVNvdXJjZUNoYW5nZSgpO1xuICAgICAgICAgICAgaXNBcnJheSh0aGlzLmZvcm1kYXRhKSA/IHRoaXMuc2V0Rm9ybURhdGEobGFzdCh0aGlzLmZvcm1kYXRhKSkgOiB0aGlzLnNldEZvcm1EYXRhKHRoaXMuZm9ybWRhdGEpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVnaXN0ZXJBY3Rpb25zKGZvcm1BY3Rpb24pIHtcbiAgICAgICAgdGhpcy5idXR0b25BcnJheS5wdXNoKGZvcm1BY3Rpb24pO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSB0aGUgZGF0YW91dHB1dCB3aGVuZXZlciB0aGVyZSBpcyBhIGNoYW5nZSBpbiBpbnNpZGUgZm9ybSB3aWRnZXQgdmFsdWVcbiAgICB1cGRhdGVGb3JtRGF0YU91dHB1dChkYXRhT2JqZWN0KSB7XG4gICAgICAgIC8vIFNldCB0aGUgdmFsdWVzIG9mIHRoZSB3aWRnZXRzIGluc2lkZSB0aGUgbGl2ZSBmb3JtIChvdGhlciB0aGFuIGZvcm0gZmllbGRzKSBpbiBmb3JtIGRhdGFcbiAgICAgICAgZm9yRWFjaCh0aGlzLm5nZm9ybS52YWx1ZSwgKHZhbCwga2V5KSA9PiB7XG4gICAgICAgICAgICBpZiAoIWZpbmQodGhpcy5mb3JtRmllbGRzLCB7a2V5fSkpIHtcbiAgICAgICAgICAgICAgICBkYXRhT2JqZWN0W2tleV0gPSB2YWw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmRhdGFvdXRwdXQgPSBkYXRhT2JqZWN0O1xuICAgIH1cblxuICAgIC8vIENvbnN0cnVjdCB0aGUgZGF0YSBvYmplY3QgbWVyZ2luZyB0aGUgZm9ybSBmaWVsZHMgYW5kIGN1c3RvbSB3aWRnZXRzIGRhdGFcbiAgICBjb25zdHJ1Y3REYXRhT2JqZWN0KCkge1xuICAgICAgICBjb25zdCBmb3JtRGF0YSAgICAgPSB7fTtcbiAgICAgICAgY29uc3QgZm9ybUZpZWxkcyA9IHRoaXMuZ2V0Rm9ybUZpZWxkcygpO1xuICAgICAgICAvLyBHZXQgYWxsIGZvcm0gZmllbGRzIGFuZCBwcmVwYXJlIGZvcm0gZGF0YSBhcyBrZXkgdmFsdWUgcGFpcnNcbiAgICAgICAgZm9ybUZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICAgICAgICAgIGxldCBmaWVsZE5hbWUsXG4gICAgICAgICAgICAgICAgZmllbGRWYWx1ZTtcbiAgICAgICAgICAgIGZpZWxkVmFsdWUgPSBmaWVsZC5kYXRhdmFsdWUgfHwgZmllbGQuX2NvbnRyb2wudmFsdWU7XG4gICAgICAgICAgICBmaWVsZFZhbHVlID0gKGZpZWxkVmFsdWUgPT09IG51bGwgfHwgZmllbGRWYWx1ZSA9PT0gJycpID8gdW5kZWZpbmVkIDogZmllbGRWYWx1ZTtcblxuICAgICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT09ICdmaWxlJykge1xuICAgICAgICAgICAgICAgIGZpZWxkVmFsdWUgPSBnZXRGaWxlcyh0aGlzLm5hbWUsIGZpZWxkLmtleSArICdfZm9ybVdpZGdldCcsIGZpZWxkLm11bHRpcGxlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZmllbGROYW1lID0gZmllbGQua2V5IHx8IGZpZWxkLnRhcmdldCB8fCBmaWVsZC5uYW1lO1xuXG4gICAgICAgICAgICAvLyBvbiBjdXJyZW50IEZvcm0sIHdoZW4gZmllbGQgaXMgaW5uZXJGb3JtIGZpZWxkIHRoZW4gd2UgZ3JvdXAgdGhlc2UgZmllbGRzIHVuZGVyIG5ldyBvYmplY3QgdXNpbmcgZm9ybUdyb3VwTmFtZSBhcyBrZXlcbiAgICAgICAgICAgIC8vIEZvciBzdXBwb3NlLCBhcHBsaWNhbnROYW1lLCBhcHBsaWNhbnRJRCBhcmUgZm9ybWZpZWxkcyBpbiBjdXJyZW50Rm9ybVxuICAgICAgICAgICAgLy8gVGhpcyBmb3JtIGlzIGhhdmluZyBpbm5lcmZvcm0gaS5lLiBhZGRyZXNzLCB0aGVzZSBmaWVsZHMgYXJlIGxpc3RlZCBhc1xuICAgICAgICAgICAgLy8ge1wiYXBwbGljYW50TmFtZVwiOiBcIlwiLCBcImFwcGxpY2FudElEXCI6IFwiXCIsIFwiYWRkcmVzc1wiOiB7XCJzdHJlZXRcIjogXCJcIn19XG4gICAgICAgICAgICBpZiAoZmllbGQuZm9ybS53aWRnZXRJZCAhPT0gdGhpcy53aWRnZXRJZCAmJiBmaWVsZC5mb3JtLmZvcm1Hcm91cE5hbWUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmZCA9IGdldChmb3JtRGF0YSwgZmllbGQuZm9ybS5mb3JtR3JvdXBOYW1lLCB7fSk7XG4gICAgICAgICAgICAgICAgZmRbZmllbGROYW1lXSA9IGZpZWxkVmFsdWU7XG4gICAgICAgICAgICAgICAgc2V0KGZvcm1EYXRhLCBmaWVsZC5mb3JtLmZvcm1Hcm91cE5hbWUsIGZkKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5wYXJlbnRGb3JtICYmIHRoaXMucGFyZW50Rm9ybS5uZ2Zvcm0gJiYgZmllbGQuZm9ybS5pc1BhcmVudExpc3QpIHsgLy8gRml4IGZvciBbV01TLTI1ODA2XTogdXNlIGZvcm1BcnJheUluZGV4IG9ubHkgaWYgZm9ybSBoYXMgYSBwYXJlbnQgZm9ybVxuICAgICAgICAgICAgICAgIC8vIHNldHRpbmcgZm9ybWRhdGEgYmFzZWQgb24gZm9ybUFycmF5SW5kZXhcbiAgICAgICAgICAgICAgICBjb25zdCBmZCA9IGdldChmb3JtRGF0YSwgZmllbGQuZm9ybS5wYXJlbnRMaXN0Lm5hbWUsIFtdKTtcbiAgICAgICAgICAgICAgICBmZFtmaWVsZC5mb3JtLmZvcm1BcnJheUluZGV4XSA9IGZkW2ZpZWxkLmZvcm0uZm9ybUFycmF5SW5kZXhdIHx8IHt9O1xuICAgICAgICAgICAgICAgIGZkW2ZpZWxkLmZvcm0uZm9ybUFycmF5SW5kZXhdW2ZpZWxkTmFtZV0gPSBmaWVsZFZhbHVlO1xuICAgICAgICAgICAgICAgIHNldChmb3JtRGF0YSwgZmllbGQuZm9ybS5wYXJlbnRMaXN0Lm5hbWUsIGZkKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gSW4gY2FzZSBvZiB1cGRhdGUgdGhlIGZpZWxkIHdpbGwgYmUgYWxyZWFkeSBwcmVzZW50IGluIGZvcm0gZGF0YVxuICAgICAgICAgICAgICAgIHNldChmb3JtRGF0YSwgZmllbGROYW1lLCBmaWVsZFZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMudXBkYXRlRm9ybURhdGFPdXRwdXQoZm9ybURhdGEpO1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhb3V0cHV0O1xuICAgIH1cblxuICAgIHVwZGF0ZURhdGFPdXRwdXQoKSB7XG4gICAgICAgIHRoaXMuY29uc3RydWN0RGF0YU9iamVjdCgpO1xuICAgICAgICBpZiAodGhpcy5uZ2Zvcm0udG91Y2hlZCkge1xuICAgICAgICAgICAgdGhpcy5zZXRWYWxpZGF0aW9uTXNncyh0cnVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEZvcm1GaWVsZHMgd2lsbCBjb250YWluIGFsbCB0aGUgZmllbGRzIGluIHBhcmVudCBhbmQgaW5uZXIgZm9ybSBhbHNvLlxuICAgIC8vIFRoaXMgcmV0dXJucyB0aGUgZm9ybUZpZWxkcyBpbiB0aGUgZm9ybSBiYXNlZCBvbiB0aGUgZm9ybSBuYW1lLlxuICAgIGdldEZvcm1GaWVsZHMoKSB7XG4gICAgICAgIHJldHVybiBmaWx0ZXIodGhpcy5mb3JtRmllbGRzLCBmb3JtRmllbGQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGZvcm1GaWVsZC5mb3JtLm5hbWUgPT09IHRoaXMubmFtZTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc2V0RmllbGRWYWx1ZShmaWVsZCwgZGF0YSwgaW5uZXJGb3JtZGF0YT8pIHtcbiAgICAgICAgY29uc3Qga2V5ID0gZmllbGQua2V5IHx8IGZpZWxkLm5hbWU7XG4gICAgICAgIC8vIGlmIGN1c3RvbWZpZWxkIHBhcmFtIHZhbHVlIGlzIG5vdCBpbiB0aGUgZm9ybWRhdGEgdGhlbiBkbyBub3QgYXNzaWduIGZpZWxkIHZhbHVlXG4gICAgICAgIC8vIGFzIGl0IGNhbiBjb250YWluIGRlZmF1bHQgdmFsdWUgd2hpY2ggd2lsbCBhZ2FpbiBiZSBvdmVycmlkZGVuIGJ5IHVuZGVmaW5lZC5cbiAgICAgICAgY29uc3QgZmQgPSBpbm5lckZvcm1kYXRhID8gaW5uZXJGb3JtZGF0YSA6IGRhdGE7XG4gICAgICAgIGlmIChmZCkge1xuICAgICAgICAgICAgaWYgKGZkLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgICAgICBmaWVsZC52YWx1ZSA9IGdldChmZCwga2V5KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5jbHVkZXMoa2V5LCAnLicpKSB7XG4gICAgICAgICAgICAgICAgLy8ga2V5IGNvbnRhaW5zICcuJyB3aGVuIG1hcHBpbmcgdGhlIGZpZWxkcyB0byBjaGlsZCByZWZlcmVuY2UgaS5lLiBjaGlsZENvbCBpcyBoYXZpbmcga2V5IGFzIFwicGFyZW50LmNoaWxkQ29sXCJcbiAgICAgICAgICAgICAgICBpZiAoZmQuaGFzT3duUHJvcGVydHkoc3BsaXQoa2V5LCAnLicpWzBdKSkge1xuICAgICAgICAgICAgICAgICAgICBmaWVsZC52YWx1ZSA9IGdldChmZCwga2V5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBXTVMtMTg5MDY6IEZvciBkZWZhdWx0IHZhbHVlLCBkbyBub3QgbWFyayB0aGUgZm9ybSBhcyBkaXJ0eS5cbiAgICAgICAgICAgIGlmICh0aGlzLmRpcnR5ICYmICF0aGlzLl90cmlnZ2VyZWRCeVVzZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1hcmtBc1ByaXN0aW5lKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZm9ybUdyb3VwTmFtZSA9IGZpZWxkLmZvcm0uZm9ybUdyb3VwTmFtZTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGlmIGZvcm1Hcm91cE5hbWUgaXMgZGVmaW5lZCB3aGljaCBtZWFucyBmaWVsZCBpcyBpbnNpZGUgdGhlIGlubmVyIGZvcm1cbiAgICAgICAgICogdGhlbiBzZXQgdGhlIGZvcm1kYXRhIG9uIHRoZSBmaWVsZCdzIGZvcm0gdXNpbmcgZm9ybUdyb3VwTmFtZVxuICAgICAgICAgKi9cbiAgICAgICAgaWYgKGZvcm1Hcm91cE5hbWUgJiYgZ2V0KGRhdGEsIGZvcm1Hcm91cE5hbWUpKSB7XG4gICAgICAgICAgICB0aGlzLnNldEZvcm1EYXRhLmNhbGwoZmllbGQuZm9ybSwgZGF0YVtmb3JtR3JvdXBOYW1lXSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gaWYgZm9ybWRhdGEgaXMgYXNzaWduZWQgbGF0ZXIgdGhlbiBvbiBwcm9wZXJ0eUNoYW5nZUhhbmRsZXIsIGV2ZW4gaW5uZXIgZm9ybXMgZGF0YSBhbHNvIG5lZWRzIHRvIGJlIHVwZGF0ZWQuXG4gICAgICAgIGlmIChnZXQoZmllbGQuZm9ybSwgJ3BhcmVudEZvcm1BcnJheScpKSB7XG4gICAgICAgICAgICB0aGlzLnNldEZvcm1EYXRhRnJvbVBhcmVudEZvcm1EYXRhLmNhbGwoZmllbGQuZm9ybSwgZGF0YSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRGb3JtRGF0YShkYXRhLCBpbm5lckZvcm1GaWVsZHM/LCBpbm5lckZvcm1kYXRhPykge1xuICAgICAgICAvLyB3aGVyZWFzIGZvcm1GaWVsZHMgZXhwbGljaXRseSBwYXNzZWQgY2FuIGNvbnRhaW4gaW5uZXJmb3JtIGZpZWxkcyBhbHNvLlxuICAgICAgICBjb25zdCBmb3JtRmllbGRzID0gaW5uZXJGb3JtRmllbGRzIHx8IHRoaXMuZm9ybUZpZWxkcztcbiAgICAgICAgZm9ybUZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2V0RmllbGRWYWx1ZShmaWVsZCwgZGF0YSwgaW5uZXJGb3JtZGF0YSk7XG4gICAgICAgICAgICBpZiAoZmllbGQuZmllbGRWYWxpZGF0aW9ucykge1xuICAgICAgICAgICAgICAgIGZpZWxkLmZpZWxkVmFsaWRhdGlvbnMuc2V0Q3VzdG9tVmFsaWRhdGlvbk1lc3NhZ2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY29uc3RydWN0RGF0YU9iamVjdCgpO1xuICAgIH1cblxuICAgIHJlc2V0Rm9ybVN0YXRlKCkge1xuICAgICAgICAvLyBjbGVhcmluZyB0aGUgdmFsaWRhdGlvbk1lc3NhZ2VzIG9uIHJlc2V0LlxuICAgICAgICBpZiAodGhpcy52YWxpZGF0aW9uTWVzc2FnZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlcyA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5uZ2Zvcm0pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm5nZm9ybS5tYXJrQXNVbnRvdWNoZWQoKTtcbiAgICAgICAgdGhpcy5uZ2Zvcm0ubWFya0FzUHJpc3RpbmUoKTtcbiAgICB9XG5cbiAgICByZXNldCgpIHtcbiAgICAgICAgdGhpcy5yZXNldEZvcm1TdGF0ZSgpO1xuICAgICAgICB0aGlzLmZvcm1GaWVsZHMuZm9yRWFjaChmaWVsZCA9PiB7XG4gICAgICAgICAgICBmaWVsZC52YWx1ZSA9ICcnO1xuICAgICAgICAgICAgaWYgKGZpZWxkLndpZGdldHR5cGUgPT09ICd1cGxvYWQnIHx8IGZpZWxkLnR5cGUgPT09IERhdGFUeXBlLkJMT0IpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlc2V0RmlsZVVwbG9hZFdpZGdldChmaWVsZCwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaWVsZC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0Jyk/LnJlbW92ZUF0dHJpYnV0ZSgnYXJpYS1pbnZhbGlkJyk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNvbnN0cnVjdERhdGFPYmplY3QoKTtcbiAgICAgICAgdGhpcy5jbGVhck1lc3NhZ2UoKTtcbiAgICB9XG5cbiAgICBzYXZlUHJldmZvcm1GaWVsZHMoKSB7XG4gICAgICAgIHRoaXMucHJldmZvcm1GaWVsZHMgPSBnZXRDbG9uZWRPYmplY3QodGhpcy5mb3JtRmllbGRzLm1hcChmaWVsZCA9PiB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICdrZXknOiBmaWVsZC5rZXksXG4gICAgICAgICAgICAgICAgJ3R5cGUnOiBmaWVsZC50eXBlLFxuICAgICAgICAgICAgICAgICd3aWRnZXR0eXBlJzogZmllbGQud2lkZ2V0dHlwZSxcbiAgICAgICAgICAgICAgICAnb3V0cHV0Zm9ybWF0JzogZmllbGQub3V0cHV0Zm9ybWF0LFxuICAgICAgICAgICAgICAgICd2YWx1ZSc6IGZpZWxkLnZhbHVlXG4gICAgICAgICAgICB9O1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgc2F2ZVByZXZEYXRhVmFsdWVzKCkge1xuICAgICAgICB0aGlzLnByZXZEYXRhVmFsdWVzID0gdGhpcy5mb3JtRmllbGRzLm1hcCgob2JqKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4geydrZXknOiBvYmoua2V5LCAndmFsdWUnOiBvYmoudmFsdWV9O1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzZXRSZWFkb25seUZpZWxkcygpIHtcbiAgICAgICAgdGhpcy5mb3JtRmllbGRzLmZvckVhY2goZmllbGQgPT4ge1xuICAgICAgICAgICAgZmllbGQuc2V0UmVhZE9ubHlTdGF0ZSgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICByZXNldEZpbGVVcGxvYWRXaWRnZXQoZmllbGQsIHNraXBWYWx1ZVNldD8pIHtcbiAgICAgICAgY29uc3QgJGZvcm1FbGUgPSB0aGlzLiRlbGVtZW50O1xuICAgICAgICAkZm9ybUVsZS5maW5kKCdbbmFtZT1cIicgKyBmaWVsZC5rZXkgKyAnX2Zvcm1XaWRnZXRcIl0nKS52YWwoJycpO1xuICAgICAgICBmaWVsZC5fY29udHJvbC5yZXNldCgpO1xuICAgICAgICBpZiAoIXNraXBWYWx1ZVNldCkge1xuICAgICAgICAgICAgZmllbGQuaHJlZiA9ICcnO1xuICAgICAgICAgICAgZmllbGQudmFsdWUgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZW1wdHlEYXRhTW9kZWwoKSB7XG4gICAgICAgIHRoaXMuZm9ybUZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICAgICAgICAgIGlmIChpc0RlZmluZWQoZmllbGQpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT09IERhdGFUeXBlLkJMT0IpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNldEZpbGVVcGxvYWRXaWRnZXQoZmllbGQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkLmRhdGF2YWx1ZSA9ICcnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc2V0RGVmYXVsdFZhbHVlcygpIHtcbiAgICAgICAgdGhpcy5mb3JtRmllbGRzLmZvckVhY2goZmllbGQgPT4ge1xuICAgICAgICAgICAgdGhpcy5vbkZpZWxkRGVmYXVsdFZhbHVlQ2hhbmdlKGZpZWxkLCBmaWVsZC5kZWZhdWx0dmFsdWUpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzZXRPcGVyYXRpb25UeXBlKG1vZGUpIHtcbiAgICAgICAgdGhpcy5vcGVyYXRpb25UeXBlID0gbW9kZSB8fCAnaW5zZXJ0JztcbiAgICB9XG5cbiAgICBuZXcoKSB7XG4gICAgICAgIHRoaXMucmVzZXRGb3JtU3RhdGUoKTtcbiAgICAgICAgdGhpcy5vcGVyYXRpb25UeXBlID0gTGl2ZV9PcGVyYXRpb25zLklOU0VSVDtcbiAgICAgICAgdGhpcy5jbGVhck1lc3NhZ2UoKTtcbiAgICAgICAgaWYgKHRoaXMuaXNTZWxlY3RlZCkge1xuICAgICAgICAgICAgdGhpcy5zYXZlUHJldmZvcm1GaWVsZHMoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVtcHR5RGF0YU1vZGVsKCk7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXREZWZhdWx0VmFsdWVzKCk7XG4gICAgICAgICAgICB0aGlzLnNhdmVQcmV2RGF0YVZhbHVlcygpO1xuICAgICAgICAgICAgdGhpcy5jb25zdHJ1Y3REYXRhT2JqZWN0KCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmlzVXBkYXRlTW9kZSA9IHRydWU7XG4gICAgfVxuXG4gICAgZWRpdCgpIHtcbiAgICAgICAgdGhpcy5yZXNldEZvcm1TdGF0ZSgpO1xuICAgICAgICB0aGlzLmNsZWFyTWVzc2FnZSgpO1xuXG4gICAgICAgIHRoaXMub3BlcmF0aW9uVHlwZSA9IExpdmVfT3BlcmF0aW9ucy5VUERBVEU7XG5cbiAgICAgICAgaWYgKHRoaXMuaXNTZWxlY3RlZCkge1xuICAgICAgICAgICAgdGhpcy5zYXZlUHJldmZvcm1GaWVsZHMoKTtcbiAgICAgICAgICAgIHRoaXMuc2F2ZVByZXZEYXRhVmFsdWVzKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wcmV2RGF0YU9iamVjdCA9IGdldENsb25lZE9iamVjdCh0aGlzLmZvcm1kYXRhIHx8IHt9KTtcblxuICAgICAgICB0aGlzLnNldFJlYWRvbmx5RmllbGRzKCk7XG4gICAgICAgIHRoaXMuaXNVcGRhdGVNb2RlID0gdHJ1ZTtcblxuICAgICAgICAkYXBwRGlnZXN0KCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB0cmlnZ2VyV01FdmVudChldmVudE5hbWUpIHtcbiAgICAgICAgY29uc3QgdGFibGVJZCA9IHRoaXMubmF0aXZlRWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RlcGVuZHNvbnRhYmxlJyk7XG4gICAgICAgIGlmICghdGFibGVJZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgICRpbnZva2VXYXRjaGVycyh0cnVlKTtcbiAgICAgICAgdGhpcy5hcHAubm90aWZ5KCd3bS1ldmVudCcsIHtldmVudE5hbWUsIHdpZGdldE5hbWU6IHRhYmxlSWR9KTtcbiAgICB9XG5cbiAgICBzdWJtaXRGb3JtKCRldmVudCkge1xuICAgICAgICBsZXQgdGVtcGxhdGUsIGZvcm1EYXRhLCByZXN1bHQ7XG4gICAgICAgIGNvbnN0IGRhdGFTb3VyY2UgPSB0aGlzLmRhdGFzb3VyY2U7XG4gICAgICAgIC8vIERpc2FibGUgdGhlIGZvcm0gc3VibWl0IGlmIGZvcm0gaXMgaW4gaW52YWxpZCBzdGF0ZS5cbiAgICAgICAgaWYgKHRoaXMudmFsaWRhdGVGaWVsZHNPblN1Ym1pdCgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBmb3JtRGF0YSA9IGdldENsb25lZE9iamVjdCh0aGlzLmNvbnN0cnVjdERhdGFPYmplY3QoKSk7XG5cbiAgICAgICAgY29uc3QgZ2V0UGFyYW1zID0gKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHskZXZlbnQsICRmb3JtRGF0YTogZm9ybURhdGEsICRkYXRhOiBmb3JtRGF0YX07XG4gICAgICAgIH07XG5cblxuICAgICAgICBpZiAodGhpcy5vbkJlZm9yZVN1Ym1pdEV2dCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuaW52b2tlRXZlbnRDYWxsYmFjaygnYmVmb3Jlc3VibWl0JywgZ2V0UGFyYW1zKCkpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXNldEZvcm1TdGF0ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yZXNldEZvcm1TdGF0ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMub25TdWJtaXRFdnQgfHwgZGF0YVNvdXJjZSkge1xuICAgICAgICAgICAgLy8gSWYgb24gc3VibWl0IGlzIHRoZXJlIGV4ZWN1dGUgaXQgYW5kIGlmIGl0IHJldHVybnMgdHJ1ZSBkbyBzZXJ2aWNlIHZhcmlhYmxlIGludm9rZSBlbHNlIHJldHVyblxuICAgICAgICAgICAgLy8gSWYgaXRzIGEgc2VydmljZSB2YXJpYWJsZSBjYWxsIHNldElucHV0IGFuZCBhc3NpZ24gZm9ybSBkYXRhIGFuZCBpbnZva2UgdGhlIHNlcnZpY2VcbiAgICAgICAgICAgIGlmIChkYXRhU291cmNlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudFBhZ2VOdW0gPSBkYXRhU291cmNlLnBhZ2luYXRpb24gJiYgZGF0YVNvdXJjZS5wYWdpbmF0aW9uLm51bWJlciArIDE7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3BlcmF0aW9uVHlwZSA9IHRoaXMub3BlcmF0aW9uVHlwZSA/IHRoaXMub3BlcmF0aW9uVHlwZSA6ICdpbnNlcnQnO1xuICAgICAgICAgICAgICAgIHBlcmZvcm1EYXRhT3BlcmF0aW9uKGRhdGFTb3VyY2UsIGZvcm1EYXRhLCB7b3BlcmF0aW9uVHlwZTogb3BlcmF0aW9uVHlwZX0pXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YVNvdXJjZS5jYXRlZ29yeSA9PT0gJ3dtLkNydWRWYXJpYWJsZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRyaWdnZXJXTUV2ZW50KCdyZXNldEVkaXRNb2RlJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhc291cmNlLmV4ZWN1dGUoRGF0YVNvdXJjZS5PcGVyYXRpb24uTElTVF9SRUNPUkRTLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdza2lwVG9nZ2xlU3RhdGUnOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnb3BlcmF0aW9uJzogJ2xpc3QnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGFnZSc6IGN1cnJlbnRQYWdlTnVtLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHJldmVudE1pc3NpbmdPcE1zZyc6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5kaWFsb2dJZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNsb3NlRGlhbG9nKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzRGVmaW5lZChkYXRhLmJvZHkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gZ2V0VmFsaWRKU09OKGRhdGEuYm9keSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gaXNEZWZpbmVkKHJlc3VsdCkgPyByZXN1bHQgOiBkYXRhLmJvZHk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGRhdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyZXN1bHQnOiByZXN1bHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N0YXR1cyc6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21lc3NhZ2UnOiB0aGlzLnBvc3RtZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlJzogJ3N1Y2Nlc3MnXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9LCAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlID0gdGhpcy5lcnJvcm1lc3NhZ2UgfHwgZXJyb3IuZXJyb3IgfHwgZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICAkYXBwRGlnZXN0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyZXN1bHQnOiBnZXQoZXJyb3IsICdlcnJvcicpIHx8IGVycm9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdGF0dXMnOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbWVzc2FnZSc6IHRlbXBsYXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlJzogJ2Vycm9yJ1xuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfSkudGhlbihyZXNwb25zZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICgocmVzcG9uc2UudHlwZSA9PT0gJ2Vycm9yJyAmJiAhdGhpcy5vbkVycm9yKSB8fCAocmVzcG9uc2UudHlwZSA9PT0gJ3N1Y2Nlc3MnICYmICF0aGlzLm9uU3VjY2VzcykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG9nZ2xlTWVzc2FnZSh0cnVlLCByZXNwb25zZS5tZXNzYWdlLCByZXNwb25zZS50eXBlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmludm9rZUV2ZW50Q2FsbGJhY2soJ3N1Ym1pdCcsIGdldFBhcmFtcygpKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vblJlc3VsdENiKHJlc3BvbnNlLnJlc3VsdCwgcmVzcG9uc2Uuc3RhdHVzLCAkZXZlbnQpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmludm9rZUV2ZW50Q2FsbGJhY2soJ3N1Ym1pdCcsIGdldFBhcmFtcygpKTtcbiAgICAgICAgICAgICAgICB0aGlzLm9uUmVzdWx0Q2Ioe30sIHRydWUsICRldmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm9uUmVzdWx0Q2Ioe30sIHRydWUsICRldmVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjbG9zZURpYWxvZygpIHtcbiAgICAgICAgdGhpcy5kaWFsb2dTZXJ2aWNlLmNsb3NlKHRoaXMuZGlhbG9nSWQpO1xuICAgIH1cblxuICAgIC8vIE1ldGhvZCB0byBzaG93L2hpZGUgdGhlIHBhbmVsIGhlYWRlciBvciBmb290ZXIgYmFzZWQgb24gdGhlIGJ1dHRvbnNcbiAgICBzaG93QnV0dG9ucyhwb3NpdGlvbikge1xuICAgICAgICByZXR1cm4gc29tZSh0aGlzLmJ1dHRvbkFycmF5LCBidG4gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGluY2x1ZGVzKGJ0bi5wb3NpdGlvbiwgcG9zaXRpb24pICYmIGJ0bi51cGRhdGVNb2RlID09PSB0aGlzLmlzVXBkYXRlTW9kZTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gRXhwYW5kIG9yIGNvbGxhcHNlIHRoZSBwYW5lbFxuICAgIGV4cGFuZENvbGxhcHNlUGFuZWwoKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbGxhcHNpYmxlKSB7XG4gICAgICAgICAgICAvLyBmbGlwIHRoZSBhY3RpdmUgZmxhZ1xuICAgICAgICAgICAgdGhpcy5leHBhbmRlZCA9ICF0aGlzLmV4cGFuZGVkO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25EYXRhU291cmNlVXBkYXRlKHJlc3BvbnNlLCBuZXdGb3JtLCB1cGRhdGVNb2RlKSB7XG4gICAgICAgIGlmIChuZXdGb3JtKSB7XG4gICAgICAgICAgICB0aGlzLm5ldygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZXRGb3JtRGF0YShyZXNwb25zZSk7XG4gICAgICAgICAgICB0aGlzLmNsb3NlRGlhbG9nKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pc1VwZGF0ZU1vZGUgPSBpc0RlZmluZWQodXBkYXRlTW9kZSkgPyB1cGRhdGVNb2RlIDogdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCB0cmFudmVyc2VzIHRocm91Z2ggdGhlIHBhcmVudCBjb250YWluaW5nIGZvcm1kYXRhIGFuZCByZXR1cm5zIHRoZSBwYXJlbnQgZm9ybWRhdGEuXG4gICAgICogQHBhcmFtIGZvcm0sIHJlcHJlc2VudHMgdGhlIGN1cnJlbnQgZm9ybSBpbnN0YW5jZVxuICAgICAqIEByZXR1cm5zIHthbnl9XG4gICAgICovXG4gICAgZ2V0TmVhcmVzdFBhcmVudEZvcm1EYXRhKGZvcm0pIHtcbiAgICAgICAgaWYgKCFmb3JtLnBhcmVudEZvcm0pIHtcbiAgICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWZvcm0uYmluZGZvcm1kYXRhICYmIGdldChmb3JtLnBhcmVudEZvcm0sICdmb3JtZGF0YScpICYmICFpc0VtcHR5KGZvcm0ucGFyZW50Rm9ybS5mb3JtZGF0YSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmb3JtLnBhcmVudEZvcm0uZm9ybWRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TmVhcmVzdFBhcmVudEZvcm1EYXRhKGZvcm0ucGFyZW50Rm9ybSk7XG4gICAgfVxuXG4gICAgc2V0Rm9ybURhdGFGcm9tUGFyZW50Rm9ybURhdGEoZm9ybWRhdGE6IGFueSkge1xuICAgICAgICBpZiAoaXNFbXB0eSh0aGlzLmZvcm1kYXRhKSAmJiB0aGlzLnBhcmVudEZvcm0gJiYgZm9ybWRhdGEpIHtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogSWYgZm9ybSBpcyBpbnNpZGUgbGlzdCxcbiAgICAgICAgICAgICAqIDEuIGRpcmVjdGx5IGFwcGx5aW5nIHRoZSBmb3JtZGF0YSB0byB0aGUgZm9ybUFycmF5IHRvIHVwZGF0ZSB0aGUgZm9ybWRhdGEgb24gbGlzdCBvZiBmb3JtcyB1c2luZyBwYXRjaFZhbHVlLlxuICAgICAgICAgICAgICogMi4gYW5kIGFsc28gc2V0dGluZyBpbmRpdmlkdWFsIGZvcm1kYXRhIHRvIHRoZSBmb3JtIGluc2lkZSBlYWNoIGl0ZW0gYmFzZWQgb24gZm9ybUFycmF5SW5kZXgsIHdoZW4gZm9ybSBpcyBub3QgYm91bmQgdG8gZm9ybWRhdGEuXG4gICAgICAgICAgICAgKiAzLiBleHBsaWNpdGx5IGludm9raW5nIGZvcm1kYXRhIGFzIGZvcm1GaWVsZHMgd2lsbCBjb250YWluIGFsbCB0aGUgZm9ybWZpZWxkcyBpbmNsdWRpbmcgaW5uZXJGb3JtJ3MgZmllbGRzXG4gICAgICAgICAgICAgKiAoaWYgd2UgZG8gbm90IGludm9rZSBleHBsaWNpdGx5IHRoZW4gZm9ybUZpZWxkcyB3aWxsIGp1c3QgY29udGFpbiB0aGUgZmllbGRzIGluc2lkZSBjdXJyZW50IGZvcm0gYW5kIG5vdCBpbm5lciBmb3JtIGZpZWxkcylcbiAgICAgICAgICAgICAqIDQuIGlmIGNoaWxkRm9ybUFycmF5RGF0YSBpcyBub3QgYXZhaWxhYmxlIHdlIHdpbGwgY2hlY2sgZm9yIGlubmVyIGZvcm0gZGF0YSB1c2luZyBcImZvcm1Hcm91cE5hbWVcIiBhbmQgd2lsbCBzZXQgdGhlIGlubmVyZm9ybSBkYXRhXG4gICAgICAgICAgICAgKiBJZiBub3QgaW5zaWRlIGxpc3QsIGp1c3Qgc2V0IHRoZSBmb3JtZGF0YSBvbiBhbGwgdGhlIGZvcm1maWVsZHMgaW5jbHVkaW5nIGlubmVyRm9ybSBmaWVsZHNcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50Rm9ybUFycmF5KSB7XG4gICAgICAgICAgICAgICAgbGV0IGNoaWxkRm9ybUFycmF5RGF0YSA9IGdldChmb3JtZGF0YSwgdGhpcy5wYXJlbnRMaXN0Lm5hbWUpO1xuICAgICAgICAgICAgICAgIGlmIChjaGlsZEZvcm1BcnJheURhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0FycmF5KGNoaWxkRm9ybUFycmF5RGF0YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkRm9ybUFycmF5RGF0YSA9IFtjaGlsZEZvcm1BcnJheURhdGFdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGFyZW50Rm9ybUFycmF5LnBhdGNoVmFsdWUoY2hpbGRGb3JtQXJyYXlEYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmJpbmRmb3JtZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtZGF0YSA9IGNoaWxkRm9ybUFycmF5RGF0YVt0aGlzLmZvcm1BcnJheUluZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEZvcm1EYXRhKHRoaXMuZm9ybWRhdGEpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc1BhcmVudExpc3QgJiYgdGhpcy5wYXJlbnRGb3JtLmZvcm1Hcm91cE5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyZW50Rm9ybURhdGEgPSBnZXQoZm9ybWRhdGEsIHRoaXMucGFyZW50Rm9ybS5mb3JtR3JvdXBOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRGb3JtRGF0YUZyb21QYXJlbnRGb3JtRGF0YShwYXJlbnRGb3JtRGF0YSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldEZvcm1EYXRhKGZvcm1kYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIE9uIGZvcm0gZGF0YSBzb3VyY2UgY2hhbmdlLiBUaGlzIG1ldGhvZCBpcyBvdmVycmlkZGVuIGJ5IGxpdmUgZm9ybSBhbmQgbGl2ZSBmaWx0ZXJcbiAgICBvbkRhdGFTb3VyY2VDaGFuZ2UoKSB7XG4gICAgICAgIGlmIChnZXQodGhpcy5mb3JtRmllbGRzLCAnbGVuZ3RoJykgJiYgIXRoaXMuYmluZGZvcm1kYXRhKSB7XG4gICAgICAgICAgICB0aGlzLmlzRGF0YVNvdXJjZVVwZGF0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBmb3JtZGF0YSBvbiB0aGUgcGFyZW50IGZvcm0gd2lsbCBiZSBzZXQgYmVmb3JlIHRoZSBpbm5lciBmb3JtcyBhcmUgcmVuZGVyZWQuXG4gICAgICAgICAgICAgKiBIZW5jZSBoYW5kbGluZyBmb3JtZGF0YSBvbiB0aGUgaW5uZXJGb3Jtcywgd2hpY2ggbWlnaHQgYmUgcmVuZGVyZWQgc2xvd2x5IChzdXBwb3NlIHByZWZhYiB3aXRoIGZvcm0pXG4gICAgICAgICAgICAgKiBzZXR0aW5nIGlubmVyIGZvcm0ncyBmb3JtZGF0YSBvYnRhaW5lZCBmcm9tIHBhcmVudCBmb3JtZGF0YVxuICAgICAgICAgICAgICogdGhpcyBhcHBsaWVzIG9ubHkgd2hlbiBmb3JtZGF0YSBpcyBub3QgZ2l2ZW4gb24gdGhlIGlubmVyIGZvcm0uXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGNvbnN0IGZvcm1kYXRhID0gdGhpcy5nZXROZWFyZXN0UGFyZW50Rm9ybURhdGEodGhpcyk7XG4gICAgICAgICAgICB0aGlzLnNldEZvcm1EYXRhRnJvbVBhcmVudEZvcm1EYXRhKGZvcm1kYXRhKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIE9uIGZvcm0gZGF0YSBzb3VyY2UgY2hhbmdlLiBUaGlzIG1ldGhvZCBpcyBvdmVycmlkZGVuIGJ5IGxpdmUgZm9ybSBhbmQgbGl2ZSBmaWx0ZXJcbiAgICBvbkZvcm1EYXRhU291cmNlQ2hhbmdlKCkge1xuICAgICAgICB0aGlzLnVwZGF0ZUZpZWxkU291cmNlKCk7XG4gICAgfVxuXG4gICAgLy8gT24gZm9ybSBmaWVsZCBkZWZhdWx0IHZhbHVlIGNoYW5nZS4gVGhpcyBtZXRob2QgaXMgb3ZlcnJpZGRlbiBieSBsaXZlIGZvcm0gYW5kIGxpdmUgZmlsdGVyXG4gICAgb25GaWVsZERlZmF1bHRWYWx1ZUNoYW5nZShmaWVsZCwgbnYpIHtcbiAgICAgICAgZmllbGQudmFsdWUgPSBwYXJzZVZhbHVlQnlUeXBlKG52LCB1bmRlZmluZWQsIGZpZWxkLndpZGdldHR5cGUsIGZpZWxkLnRyYWlsaW5nemVybyk7XG4gICAgICAgIC8vIFdNUy0yMjQzNDogRm9yIGRlZmF1bHQgdmFsdWUgc2V0IG9uIGluZGl2aWR1YWwgZm9ybSBmaWVsZHMsIGRvIG5vdCBtYXJrIHRoZSBmb3JtIGFzIGRpcnR5LlxuICAgICAgICBpZiAodGhpcy5kaXJ0eSAmJiAhdGhpcy5fdHJpZ2dlcmVkQnlVc2VyKSB7XG4gICAgICAgICAgICB0aGlzLm1hcmtBc1ByaXN0aW5lKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBPbiBmb3JtIGZpZWxkIHZhbHVlIGNoYW5nZS4gVGhpcyBtZXRob2QgaXMgb3ZlcnJpZGRlbiBieSBsaXZlIGZvcm0gYW5kIGxpdmUgZmlsdGVyXG4gICAgb25GaWVsZFZhbHVlQ2hhbmdlKCkge1xuICAgIH1cblxuICAgIC8vIEZ1bmN0aW9uIHRvIGdlbmVyYXRlIGFuZCBjb21waWxlIHRoZSBmb3JtIGZpZWxkcyBmcm9tIHRoZSBtZXRhZGF0YVxuICAgIGFzeW5jIGdlbmVyYXRlRm9ybUZpZWxkcygpIHtcbiAgICAgICAgbGV0IG5vT2ZDb2x1bW5zO1xuICAgICAgICBsZXQgJGdyaWRMYXlvdXQ7XG4gICAgICAgIC8vIENoZWNrIGlmIGdyaWQgbGF5b3V0IGlzIHByZXNlbnQgb3Igbm90IGZvciBmaXJzdCB0aW1lXG4gICAgICAgIGlmIChpc1VuZGVmaW5lZCh0aGlzLl9pc0dyaWRMYXlvdXRQcmVzZW50KSkge1xuICAgICAgICAgICAgdGhpcy5faXNHcmlkTGF5b3V0UHJlc2VudCA9IHRoaXMuJGVsZW1lbnQuZmluZCgnLnBhbmVsLWJvZHkgW3dtbGF5b3V0Z3JpZF0nKS5sZW5ndGggPiAwO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9pc0dyaWRMYXlvdXRQcmVzZW50KSB7XG4gICAgICAgICAgICAkZ3JpZExheW91dCA9IHRoaXMuJGVsZW1lbnQuZmluZCgnLmZvcm0tZWxlbWVudHMgW3dtbGF5b3V0Z3JpZF0nKS5maXJzdCgpO1xuICAgICAgICAgICAgbm9PZkNvbHVtbnMgPSBOdW1iZXIoJGdyaWRMYXlvdXQuYXR0cignY29sdW1ucycpKSB8fCAxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgJGdyaWRMYXlvdXQgPSB0aGlzLiRlbGVtZW50LmZpbmQoJy5mb3JtLWVsZW1lbnRzIC5keW5hbWljLWZvcm0tY29udGFpbmVyJyk7XG4gICAgICAgICAgICBpZiAoISRncmlkTGF5b3V0Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRoaXMuJGVsZW1lbnQuZmluZCgnLmZvcm0tZWxlbWVudHMnKS5wcmVwZW5kKCc8ZGl2IGNsYXNzPVwiZHluYW1pYy1mb3JtLWNvbnRhaW5lclwiPjwvZGl2PicpO1xuICAgICAgICAgICAgICAgICRncmlkTGF5b3V0ID0gdGhpcy4kZWxlbWVudC5maW5kKCcuZm9ybS1lbGVtZW50cyAuZHluYW1pYy1mb3JtLWNvbnRhaW5lcicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbm9PZkNvbHVtbnMgPSAxO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbHVtbldpZHRoID0gMTIgLyBub09mQ29sdW1ucztcbiAgICAgICAgbGV0IGZpZWxkVGVtcGxhdGUgPSAnJztcbiAgICAgICAgbGV0IGNvbENvdW50ID0gMDtcbiAgICAgICAgbGV0IGluZGV4O1xuICAgICAgICBsZXQgdXNlckZpZWxkcztcbiAgICAgICAgbGV0IGZpZWxkcyA9IHRoaXMubWV0YWRhdGEgPyB0aGlzLm1ldGFkYXRhLmRhdGEgfHwgdGhpcy5tZXRhZGF0YSA6IFtdO1xuXG4gICAgICAgIHRoaXMuZm9ybUZpZWxkcyA9IFtdOyAvLyBlbXB0eSB0aGUgZm9ybSBmaWVsZHNcblxuICAgICAgICBpZiAoaXNFbXB0eShmaWVsZHMpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5vbkJlZm9yZVJlbmRlckV2dCkge1xuICAgICAgICAgICAgdXNlckZpZWxkcyA9IHRoaXMuaW52b2tlRXZlbnRDYWxsYmFjaygnYmVmb3JlcmVuZGVyJywgeyRtZXRhZGF0YTogZmllbGRzfSk7XG4gICAgICAgICAgICBpZiAodXNlckZpZWxkcykge1xuICAgICAgICAgICAgICAgIGZpZWxkcyA9IHVzZXJGaWVsZHM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWlzQXJyYXkoZmllbGRzKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgd2hpbGUgKGZpZWxkc1tjb2xDb3VudF0pIHtcbiAgICAgICAgICAgIGxldCBjb2xUbXBsID0gJyc7XG4gICAgICAgICAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBub09mQ29sdW1uczsgaW5kZXgrKykge1xuICAgICAgICAgICAgICAgIGlmIChmaWVsZHNbY29sQ291bnRdKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbFRtcGwgKz0gc2V0TWFya3VwRm9yRm9ybUZpZWxkKGZpZWxkc1tjb2xDb3VudF0sIGNvbHVtbldpZHRoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29sQ291bnQrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpZWxkVGVtcGxhdGUgKz0gYDx3bS1ncmlkcm93PiR7Y29sVG1wbH08L3dtLWdyaWRyb3c+YDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5faXNHcmlkTGF5b3V0UHJlc2VudCkge1xuICAgICAgICAgICAgZmllbGRUZW1wbGF0ZSA9IGA8d20tbGF5b3V0Z3JpZD4ke2ZpZWxkVGVtcGxhdGV9PC93bS1sYXlvdXRncmlkPmA7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmR5bmFtaWNGb3JtUmVmLmNsZWFyKCk7XG5cbiAgICAgICAgaWYgKCF0aGlzLl9keW5hbWljQ29udGV4dCkge1xuICAgICAgICAgICAgdGhpcy5fZHluYW1pY0NvbnRleHQgPSBPYmplY3QuY3JlYXRlKHRoaXMudmlld1BhcmVudCk7XG4gICAgICAgICAgICB0aGlzLl9keW5hbWljQ29udGV4dC5mb3JtID0gdGhpcztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb21wb25lbnRGYWN0b3J5UmVmID0gYXdhaXQgdGhpcy5keW5hbWljQ29tcG9uZW50UHJvdmlkZXIuZ2V0Q29tcG9uZW50RmFjdG9yeVJlZihcbiAgICAgICAgICAgICdhcHAtZm9ybS1keW5hbWljLScgKyB0aGlzLndpZGdldElkLFxuICAgICAgICAgICAgZmllbGRUZW1wbGF0ZSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBub0NhY2hlOiB0cnVlLFxuICAgICAgICAgICAgICAgIHRyYW5zcGlsZTogdHJ1ZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IHRoaXMuZHluYW1pY0Zvcm1SZWYuY3JlYXRlQ29tcG9uZW50KGNvbXBvbmVudEZhY3RvcnlSZWYsIDAsIHRoaXMuaW5qKTtcbiAgICAgICAgZXh0ZW5kUHJvdG8oY29tcG9uZW50Lmluc3RhbmNlLCB0aGlzLl9keW5hbWljQ29udGV4dCk7XG4gICAgICAgICRncmlkTGF5b3V0WzBdLmFwcGVuZENoaWxkKGNvbXBvbmVudC5sb2NhdGlvbi5uYXRpdmVFbGVtZW50KTtcbiAgICAgICAgdGhpcy5zZXRGb3JtRGF0YSh0aGlzLmZvcm1kYXRhKTtcbiAgICB9XG5cbiAgICBnZXQgbW9kZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3BlcmF0aW9uVHlwZSB8fCB0aGlzLmZpbmRPcGVyYXRpb25UeXBlKCk7XG4gICAgfVxuXG4gICAgZ2V0IGRpcnR5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uZ2Zvcm0gJiYgdGhpcy5uZ2Zvcm0uZGlydHk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2Qgc2V0cyB0aGUgZm9ybSBzdGF0ZSB0byBwcmlzdGluZSBieSBpbnRlcm5hbGx5IGNhbGxpbmcgYW5ndWxhciBtYXJrQXNQcmlzdGluZSBtZXRob2Qgb24gdGhlIGZvcm1cbiAgICAgKiBAcGFyYW0gdmFsdWUsIFdoZW4gdHJ1ZSwgbWFyayBvbmx5IHRoaXMgY29udHJvbC4gV2hlbiBmYWxzZSBvciBub3Qgc3VwcGxpZWQsIG1hcmtzIGFsbCBkaXJlY3QgYW5jZXN0b3JzLiBEZWZhdWx0IGlzIGZhbHNlXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgbWFya0FzUHJpc3RpbmUodmFsdWU6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgICAgICB0aGlzLm5nZm9ybS5tYXJrQXNQcmlzdGluZSh7IG9ubHlTZWxmOiB2YWx1ZSB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBzZXRzIHRoZSBmb3JtIHN0YXRlIHRvIGRpcnR5IGJ5IGludGVybmFsbHkgY2FsbGluZyBhbmd1bGFyIG1hcmtBc0RpcnR5IG1ldGhvZCBvbiB0aGUgZm9ybVxuICAgICAqIEBwYXJhbSB2YWx1ZSwgV2hlbiB0cnVlLCBtYXJrIG9ubHkgdGhpcyBjb250cm9sLiBXaGVuIGZhbHNlIG9yIG5vdCBzdXBwbGllZCwgbWFya3MgYWxsIGRpcmVjdCBhbmNlc3RvcnMuIERlZmF1bHQgaXMgZmFsc2VcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICBtYXJrQXNEaXJ0eSh2YWx1ZTogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgICAgIHRoaXMubmdmb3JtLm1hcmtBc0RpcnR5KHsgb25seVNlbGY6IHZhbHVlIH0pO1xuICAgIH1cblxuICAgIGdldCBpbnZhbGlkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uZ2Zvcm0gJiYgdGhpcy5uZ2Zvcm0uaW52YWxpZDtcbiAgICB9XG5cbiAgICBnZXQgdG91Y2hlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmdmb3JtICYmIHRoaXMubmdmb3JtLnRvdWNoZWQ7XG4gICAgfVxuXG4gICAgZ2V0IHZhbGlkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uZ2Zvcm0gJiYgdGhpcy5uZ2Zvcm0udmFsaWQ7XG4gICAgfVxuXG4gICAgZ2V0IHByaXN0aW5lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uZ2Zvcm0gJiYgdGhpcy5uZ2Zvcm0ucHJpc3RpbmU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2Qgc2V0cyB0aGUgZm9ybSBzdGF0ZSB0byB0b3VjaGVkIGJ5IGludGVybmFsbHkgY2FsbGluZyBhbmd1bGFyIG1hcmtBc1RvdWNoZWQgbWV0aG9kIG9uIHRoZSBmb3JtXG4gICAgICogQHBhcmFtIHZhbHVlLCBXaGVuIHRydWUsIG1hcmsgb25seSB0aGlzIGNvbnRyb2wuIFdoZW4gZmFsc2Ugb3Igbm90IHN1cHBsaWVkLCBtYXJrcyBhbGwgZGlyZWN0IGFuY2VzdG9ycy4gRGVmYXVsdCBpcyBmYWxzZVxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICAgIG1hcmtBc1RvdWNoZWQodmFsdWU6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgICAgICB0aGlzLm5nZm9ybS5tYXJrQXNUb3VjaGVkKHsgb25seVNlbGY6IHZhbHVlIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIHNldHMgdGhlIGZvcm0gc3RhdGUgdG8gdW50b3VjaGVkIGJ5IGludGVybmFsbHkgY2FsbGluZyBhbmd1bGFyIG1hcmtBc1VudG91Y2hlZCBtZXRob2Qgb24gdGhlIGZvcm1cbiAgICAgKiBAcGFyYW0gdmFsdWUsIFdoZW4gdHJ1ZSwgbWFyayBvbmx5IHRoaXMgY29udHJvbC4gV2hlbiBmYWxzZSBvciBub3Qgc3VwcGxpZWQsIG1hcmtzIGFsbCBkaXJlY3QgYW5jZXN0b3JzLiBEZWZhdWx0IGlzIGZhbHNlXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgbWFya0FzVW50b3VjaGVkKHZhbHVlOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy5uZ2Zvcm0ubWFya0FzVW50b3VjaGVkKHsgb25seVNlbGY6IHZhbHVlIH0pO1xuICAgIH1cblxuICAgIGludm9rZUFjdGlvbkV2ZW50KCRldmVudCwgZXhwcmVzc2lvbjogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IGZuID0gJHBhcnNlRXZlbnQoZXhwcmVzc2lvbik7XG4gICAgICAgIGZuKHRoaXMudmlld1BhcmVudCwgT2JqZWN0LmFzc2lnbih0aGlzLmNvbnRleHQsIHskZXZlbnR9KSk7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIC8vIG9uIGZvcm0gZGVzdHJveSwgcmVtb3ZpbmcgdGhpcyBmb3JtIGZyb20gdGhlIHBhcmVudEZvcm0gdG9vLlxuICAgICAgICBjb25zdCBjb250cm9scyA9IHRoaXMucGFyZW50Rm9ybSAmJiBnZXQodGhpcy5wYXJlbnRGb3JtLCAnbmdmb3JtLmNvbnRyb2xzJyk7XG4gICAgICAgIGlmIChjb250cm9scykge1xuICAgICAgICAgICAgLy8gd2hlbiBjdXJyZW50IGZvcm0gaXMgaW5zaWRlIHRoZSBsaXN0IChpLmUuIGluY2FzZSBvZiBmb3JtQXJyYXkpLlxuICAgICAgICAgICAgaWYgKGdldCh0aGlzLnBhcmVudExpc3QsICduYW1lJykgJiYgY29udHJvbHMuaGFzT3duUHJvcGVydHkodGhpcy5wYXJlbnRMaXN0Lm5hbWUpKSB7XG4gICAgICAgICAgICAgICAgLy9nZXQgdGhlIGluZGV4IG9mIGN1cnJlbnQgZm9ybSBpbiB0aGUgbGlzdCBhbmQgcmVtb3ZlIHRoZSBGb3JtQ29udHJvbCBmcm9tIEZvcm1BcnJheVxuICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gZmluZEluZGV4KHRoaXMucGFyZW50TGlzdC5nZXRXaWRnZXRzKHRoaXMubmFtZSksIHt3aWRnZXRJZDogdGhpcy53aWRnZXRJZH0pO1xuICAgICAgICAgICAgICAgICg8Rm9ybUFycmF5PnRoaXMucGFyZW50Rm9ybS5uZ2Zvcm0uY29udHJvbHNbdGhpcy5wYXJlbnRMaXN0Lm5hbWVdKS5yZW1vdmVBdChpbmRleCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyB3aGVuIHdlIGhhdmUgZm9ybUdyb3VwTmFtZSBzZXQgaS5lLiBtdWx0aXBsZSBmb3JtSW5zdGFuY2Ugd2l0aCBjb3VudGVyIGFwcGVuZGVkIHRvIGZvcm1OYW1lXG4gICAgICAgICAgICBpZiAodGhpcy5mb3JtR3JvdXBOYW1lICYmIGNvbnRyb2xzLmhhc093blByb3BlcnR5KHRoaXMuZm9ybUdyb3VwTmFtZSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBhcmVudEZvcm0ubmdmb3JtLnJlbW92ZUNvbnRyb2wodGhpcy5mb3JtR3JvdXBOYW1lKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wYXJlbnRGb3JtLm5nZm9ybS5yZW1vdmVDb250cm9sKHRoaXMubmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc3VwZXIubmdPbkRlc3Ryb3koKTtcbiAgICB9XG59XG4iLCI8bmctdGVtcGxhdGUgI2NvbnRlbnQ+PG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PjwvbmctdGVtcGxhdGU+XG5cbjxuZy1jb250YWluZXIgKm5nSWY9XCJmb3JtbGF5b3V0ID09PSAncGFnZSc7IHRoZW4gcGFnZUxheW91dFRlbXBsYXRlIGVsc2UgZGVmYXVsdFRlbXBsYXRlXCI+XG48L25nLWNvbnRhaW5lcj5cblxuPG5nLXRlbXBsYXRlICNkZWZhdWx0VGVtcGxhdGU+XG4gICAgPGRpdiBjbGFzcz1cInBhbmVsLWhlYWRpbmdcIiAqbmdJZj1cIiFpc0xheW91dERpYWxvZyAmJiAodGl0bGUgfHwgc3ViaGVhZGluZyB8fCBpY29uY2xhc3MgfHwgc2hvd0J1dHRvbnMoJ2hlYWRlcicpKVwiPlxuICAgICAgICA8aDMgY2xhc3M9XCJwYW5lbC10aXRsZVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB1bGwtbGVmdFwiPlxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiYXBwLWljb24gcGFuZWwtaWNvblwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIFtuZ0NsYXNzXT1cImljb25jbGFzc1wiICpuZ0lmPVwiaWNvbmNsYXNzXCI+PC9pPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHVsbC1sZWZ0XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlYWRpbmdcIiBbaW5uZXJIVE1MXT1cInRpdGxlXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRlc2NyaXB0aW9uXCIgW2lubmVySFRNTF09XCJzdWJoZWFkaW5nXCI+PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWFjdGlvbiBwYW5lbC1hY3Rpb25zIGJhc2ljLWJ0bi1ncnBcIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBidG4gb2YgYnV0dG9uQXJyYXkgfCBmaWx0ZXIgOiAncG9zaXRpb24nIDogJ2hlYWRlcic7IGxldCBpbmRleCA9IGluZGV4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImJ0bi53aWRnZXRUeXBlID09PSAnYnV0dG9uJyA/IGJ1dHRvblJlZiA6IGFuY2hvclJlZlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie2J0bjpidG59XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0SW5qZWN0b3JdPVwiY3JlYXRlQ3VzdG9tSW5qZWN0b3IoJ2FjdGlvbl9oZWFkZXJfJyArIGluZGV4LCB7YnRuOmJ0bn0pXCI+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJhcHAtaWNvbiB3aSBwYW5lbC1hY3Rpb25cIiAqbmdJZj1cImNvbGxhcHNpYmxlXCIgdGl0bGU9XCJDb2xsYXBzZS9FeHBhbmRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiZXhwYW5kZWQgPyAnd2ktbWludXMnOiAnd2ktcGx1cydcIiAoY2xpY2spPVwiZXhwYW5kQ29sbGFwc2VQYW5lbCgpO1wiPjwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvaDM+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cInBhbmVsLWJvZHlcIiBbbmdDbGFzc109XCJ7J2Zvcm0tZWxlbWVudHMnOiBpc0xheW91dERpYWxvZywgJ2Zvcm0tYm9keSc6ICFpc0xheW91dERpYWxvZ31cIiBbY2xhc3MuaGlkZGVuXT1cIiFleHBhbmRlZFwiPlxuICAgICAgICA8cCB3bU1lc3NhZ2UgKm5nSWY9XCIhIXN0YXR1c01lc3NhZ2UuY2FwdGlvblwiIFthdHRyLmFyaWEtaGlkZGVuXT1cIiFzdGF0dXNNZXNzYWdlLmNhcHRpb25cIiBbYXR0ci5hcmlhLWxhYmVsXT1cInN0YXR1c01lc3NhZ2UuY2FwdGlvblwiIGNhcHRpb24uYmluZD1cInN0YXR1c01lc3NhZ2UuY2FwdGlvblwiIHR5cGUuYmluZD1cInN0YXR1c01lc3NhZ2UudHlwZVwiPjwvcD5cbiAgICAgICAgPGRpdiBbbmdDbGFzc109XCJ7J2Zvcm0tZWxlbWVudHMnOiAhaXNMYXlvdXREaWFsb2csICdmb3JtLWNvbnRlbnQnOiBpc0xheW91dERpYWxvZ31cIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjb250ZW50XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYmFzaWMtYnRuLWdycCBmb3JtLWFjdGlvbiBwYW5lbC1mb290ZXIgY2xlYXJmaXhcIiBbbmdDbGFzc109XCJ7J21vZGFsLWZvb3Rlcic6IGlzTGF5b3V0RGlhbG9nfVwiIFtjbGFzcy5oaWRkZW5dPVwiIWV4cGFuZGVkIHx8ICFzaG93QnV0dG9ucygnZm9vdGVyJylcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGJ0biBvZiBidXR0b25BcnJheSB8IGZpbHRlciA6ICdwb3NpdGlvbicgOiAnZm9vdGVyJzsgbGV0IGluZGV4ID0gaW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJidG4ud2lkZ2V0VHlwZSA9PT0gJ2J1dHRvbicgPyBidXR0b25SZWYgOiBhbmNob3JSZWZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie2J0bjpidG59XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRJbmplY3Rvcl09XCJjcmVhdGVDdXN0b21JbmplY3RvcignYWN0aW9uX2Zvb3Rlcl8nICsgaW5kZXgsIHtidG46YnRufSlcIj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjcGFnZUxheW91dFRlbXBsYXRlPlxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjb250ZW50XCI+PC9uZy1jb250YWluZXI+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2J1dHRvblJlZiBsZXQtYnRuPVwiYnRuXCI+XG4gICAgPGJ1dHRvbiAgd21CdXR0b24gbmFtZT1cInt7YnRuLmtleX19XCIgY2FwdGlvbi5iaW5kPVwiYnRuLmRpc3BsYXlOYW1lXCIgY2xhc3MuYmluZD1cImJ0bi5jbGFzc1wiIGljb25jbGFzcy5iaW5kPVwiYnRuLmljb25jbGFzc1wiIHNob3cuYmluZD1cImJ0bi5zaG93XCJcbiAgICAgICAgICAgICAoY2xpY2spPVwiaW52b2tlQWN0aW9uRXZlbnQoJGV2ZW50LCBidG4uYWN0aW9uKVwiIHR5cGUuYmluZD1cImJ0bi50eXBlXCIgaGludC5iaW5kPVwiYnRuLnRpdGxlXCIgc2hvcnRjdXRrZXkuYmluZD1cImJ0bi5zaG9ydGN1dGtleVwiIGRpc2FibGVkLmJpbmQ9XCJuZ2Zvcm0uc3RhdHVzID09PSAnUEVORElORycgfHwgYnRuLmRpc2FibGVkXCJcbiAgICAgICAgICAgICB0YWJpbmRleC5iaW5kPVwiYnRuLnRhYmluZGV4XCIgW2F0dHIuYXJpYS1sYWJlbF09XCJidG4uZGlzcGxheU5hbWVcIiBbY2xhc3MuaGlkZGVuXT1cImJ0bi51cGRhdGVNb2RlID8gIWlzVXBkYXRlTW9kZSA6IGlzVXBkYXRlTW9kZVwiPjwvYnV0dG9uPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNhbmNob3JSZWYgbGV0LWJ0bj1cImJ0blwiPlxuICAgIDxhIHdtQW5jaG9yIG5hbWU9XCJ7e2J0bi5rZXl9fVwiIGNhcHRpb24uYmluZD1cImJ0bi5kaXNwbGF5TmFtZVwiIGNsYXNzLmJpbmQ9XCJidG4uY2xhc3NcIiBpY29uY2xhc3MuYmluZD1cImJ0bi5pY29uY2xhc3NcIiBzaG93LmJpbmQ9XCJidG4uc2hvd1wiXG4gICAgICAgICAgICAgKGNsaWNrKT1cImludm9rZUFjdGlvbkV2ZW50KCRldmVudCwgYnRuLmFjdGlvbilcIiBoaW50LmJpbmQ9XCJidG4udGl0bGVcIiBzaG9ydGN1dGtleS5iaW5kPVwiYnRuLnNob3J0Y3V0a2V5XCJcbiAgICAgICAgICAgICBoeXBlcmxpbmsuYmluZD1cImJ0bi5oeXBlcmxpbmtcIiB0YXJnZXQuYmluZD1cImJ0bi50YXJnZXRcIlxuICAgICAgICAgICAgIHRhYmluZGV4LmJpbmQ9XCJidG4udGFiaW5kZXhcIiBbY2xhc3MuaGlkZGVuXT1cImJ0bi51cGRhdGVNb2RlID8gIWlzVXBkYXRlTW9kZSA6IGlzVXBkYXRlTW9kZVwiPjwvYT5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy1jb250YWluZXIgI2R5bmFtaWNGb3JtPjwvbmctY29udGFpbmVyPlxuIl19
1353
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3dpZGdldHMvZGF0YS9mb3JtL3NyYy9mb3JtLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvd2lkZ2V0cy9kYXRhL2Zvcm0vc3JjL2Zvcm0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUdILFNBQVMsRUFDVCxTQUFTLEVBQ1QsZUFBZSxFQUNmLFdBQVcsRUFDWCxZQUFZLEVBQ1osUUFBUSxFQUNSLE1BQU0sRUFFTixRQUFRLEVBQ1IsUUFBUSxFQUNSLFNBQVMsRUFDVCxnQkFBZ0IsRUFDbkIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFDLFNBQVMsRUFBRSxXQUFXLEVBQVksTUFBTSxnQkFBZ0IsQ0FBQztBQUVqRSxPQUFPLEVBQ0gsVUFBVSxFQUNWLGVBQWUsRUFDZixXQUFXLEVBQ1gscUJBQXFCLEVBQ3JCLEdBQUcsRUFDSCxVQUFVLEVBQ1YsUUFBUSxFQUNSLFFBQVEsRUFDUiwyQkFBMkIsRUFDM0IsV0FBVyxFQUNYLGVBQWUsRUFDZixRQUFRLEVBQ1IsWUFBWSxFQUNaLFNBQVMsRUFDVCxtQkFBbUIsRUFDbkIsVUFBVSxFQUNWLFdBQVcsRUFDWCxlQUFlLEdBQ2xCLE1BQU0sVUFBVSxDQUFDO0FBQ2xCLE9BQU8sRUFDSCxvQkFBb0IsRUFDcEIsZUFBZSxFQUNmLGdCQUFnQixFQUNoQixnQkFBZ0IsRUFDaEIsZ0JBQWdCLEVBQ2hCLG9CQUFvQixFQUNwQixrQkFBa0IsRUFDbEIsaUJBQWlCLEVBQ2pCLE1BQU0sRUFDTixTQUFTLEVBQ1osTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDdEQsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLDBCQUEwQixD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QUFDLFdBQVc7O3NCQUNyQixTQUFTO3VCQUFDLEtBQUs7O3NCQUNmLFNBQVM7dUJBQUMsTUFBTTt3QkFuSytDLGNBQWM7a0JBQWpGLFNBQVM7bUJBQUMsYUFBYSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUU7WUFDckMsVUFBVTtrQkFBdEMsU0FBUzttQkFBQyxnQkFBZ0I7WUFFc0IsYUFBYTtrQkFBN0QsZUFBZTttQkFBQyxTQUFTLEVBQUUsRUFBQyxXQUFXLEVBQUUsSUFBSSxFQUFDO1lBNEd4QixNQUFNO2tCQUE1QixXQUFXO21CQUFDLFFBQVE7WUFFZSxNQUFNO2tCQUF6QyxZQUFZO21CQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQztZQUlYLE9BQU87a0JBQTdCLFlBQVk7bUJBQUMsT0FBTztZQUlnQixnQkFBZ0I7a0JBQXBELFlBQVk7bUJBQUMsU0FBUyxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBBZnRlckNvbnRlbnRJbml0LFxuICAgIEFmdGVyVmlld0luaXQsXG4gICAgQXR0cmlidXRlLFxuICAgIENvbXBvbmVudCxcbiAgICBDb250ZW50Q2hpbGRyZW4sXG4gICAgSG9zdEJpbmRpbmcsXG4gICAgSG9zdExpc3RlbmVyLFxuICAgIEluamVjdG9yLFxuICAgIE5nWm9uZSxcbiAgICBPbkRlc3Ryb3ksXG4gICAgT3B0aW9uYWwsXG4gICAgU2tpcFNlbGYsXG4gICAgVmlld0NoaWxkLFxuICAgIFZpZXdDb250YWluZXJSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0Zvcm1BcnJheSwgRm9ybUJ1aWxkZXIsIEZvcm1Hcm91cH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5pbXBvcnQge1xuICAgICRhcHBEaWdlc3QsXG4gICAgJGludm9rZVdhdGNoZXJzLFxuICAgICRwYXJzZUV2ZW50LFxuICAgIEFic3RyYWN0RGlhbG9nU2VydmljZSxcbiAgICBBcHAsXG4gICAgRGF0YVNvdXJjZSxcbiAgICBEYXRhVHlwZSxcbiAgICBkZWJvdW5jZSxcbiAgICBEeW5hbWljQ29tcG9uZW50UmVmUHJvdmlkZXIsXG4gICAgZXh0ZW5kUHJvdG8sXG4gICAgZ2V0Q2xvbmVkT2JqZWN0LFxuICAgIGdldEZpbGVzLFxuICAgIGdldFZhbGlkSlNPTixcbiAgICBpc0RlZmluZWQsXG4gICAgaXNFbGVtZW50SW5WaWV3cG9ydCxcbiAgICByZW1vdmVBdHRyLFxuICAgIHJlbW92ZUNsYXNzLFxuICAgIHNjcm9sbFRvRWxlbWVudCxcbn0gZnJvbSAnQHdtL2NvcmUnO1xuaW1wb3J0IHtcbiAgICBnZXRGaWVsZExheW91dENvbmZpZyxcbiAgICBMaXZlX09wZXJhdGlvbnMsXG4gICAgTWVzc2FnZUNvbXBvbmVudCxcbiAgICBwYXJzZVZhbHVlQnlUeXBlLFxuICAgIFBhcnRpYWxEaXJlY3RpdmUsXG4gICAgcGVyZm9ybURhdGFPcGVyYXRpb24sXG4gICAgcHJvdmlkZUFzV2lkZ2V0UmVmLFxuICAgIFN0eWxhYmxlQ29tcG9uZW50LFxuICAgIHN0eWxlcixcbiAgICBXaWRnZXRSZWZcbn0gZnJvbSAnQHdtL2NvbXBvbmVudHMvYmFzZSc7XG5pbXBvcnQge1ByZWZhYkRpcmVjdGl2ZX0gZnJvbSAnQHdtL2NvbXBvbmVudHMvcHJlZmFiJztcbmltcG9ydCB7TGlzdENvbXBvbmVudH0gZnJvbSAnQHdtL2NvbXBvbmVudHMvZGF0YS9saXN0JztcblxuaW1wb3J0IHtyZWdpc3RlckZvcm1Qcm9wc30gZnJvbSAnLi9mb3JtLnByb3BzJztcblxuZGVjbGFyZSBjb25zdCBfO1xuXG5jb25zdCBXSURHRVRfQ09ORklHID0ge3dpZGdldFR5cGU6ICd3bS1mb3JtJywgaG9zdENsYXNzOiAncGFuZWwgYXBwLXBhbmVsIGFwcC1mb3JtJ307XG5jb25zdCBMT0dJTl9GT1JNX0NPTkZJRyA9IHt3aWRnZXRUeXBlOiAnd20tZm9ybScsIGhvc3RDbGFzczogJ2FwcC1mb3JtIGFwcC1sb2dpbi1mb3JtJ307XG5jb25zdCBMSVZFX0ZPUk1fQ09ORklHID0ge3dpZGdldFR5cGU6ICd3bS1saXZlZm9ybScsIGhvc3RDbGFzczogJ3BhbmVsIGFwcC1wYW5lbCBhcHAtbGl2ZWZvcm0gbGl2ZWZvcm0taW5saW5lJ307XG5jb25zdCBMSVZFX0ZJTFRFUl9DT05GSUcgPSB7d2lkZ2V0VHlwZTogJ3dtLWxpdmVmaWx0ZXInLCBob3N0Q2xhc3M6ICdwYW5lbCBhcHAtcGFuZWwgYXBwLWxpdmVmaWx0ZXIgY2xlYXJmaXggbGl2ZWZvcm0taW5saW5lJ307XG5cbmNvbnN0IGdldFdpZGdldENvbmZpZyA9IChpc0xpdmVGb3JtLCBpc0xpdmVGaWx0ZXIsIHJvbGUpID0+IHtcbiAgICBsZXQgY29uZmlnID0gV0lER0VUX0NPTkZJRztcbiAgICBpZiAoaXNMaXZlRm9ybSAhPT0gbnVsbCkge1xuICAgICAgICBjb25maWcgPSBMSVZFX0ZPUk1fQ09ORklHO1xuICAgIH0gZWxzZSBpZiAoaXNMaXZlRmlsdGVyICE9PSBudWxsKSB7XG4gICAgICAgIGNvbmZpZyA9IExJVkVfRklMVEVSX0NPTkZJRztcbiAgICB9IGVsc2UgaWYgKHJvbGUgPT09ICdhcHAtbG9naW4nKSB7XG4gICAgICAgIGNvbmZpZyA9IExPR0lOX0ZPUk1fQ09ORklHO1xuICAgIH1cbiAgICByZXR1cm4gY29uZmlnO1xufTtcblxuLy8gR2VuZXJhdGUgdGhlIGZvcm0gZmllbGQgd2l0aCBnaXZlbiBmaWVsZCBkZWZpbml0aW9uLiBBZGQgYSBncmlkIGNvbHVtbiB3cmFwcGVyIGFyb3VuZCB0aGUgZm9ybSBmaWVsZC5cbmNvbnN0IHNldE1hcmt1cEZvckZvcm1GaWVsZCA9IChmaWVsZCwgY29sdW1uV2lkdGgpID0+ICB7XG4gICAgbGV0IHByb3BzVG1wbCA9ICcnO1xuICAgIF8uZm9yRWFjaChmaWVsZCwgKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgcHJvcHNUbXBsID0gYCR7cHJvcHNUbXBsfSAke2tleX09XCIke3ZhbHVlfVwiYDtcbiAgICB9KTtcbiAgICByZXR1cm4gYDx3bS1ncmlkY29sdW1uIGNvbHVtbndpZHRoPVwiJHtjb2x1bW5XaWR0aH1cIj5cbiAgICAgICAgICAgICAgICAgIDx3bS1mb3JtLWZpZWxkICR7cHJvcHNUbXBsfT48L3dtLWZvcm0tZmllbGQ+XG4gICAgICAgICAgICA8L3dtLWdyaWRjb2x1bW4+YDtcbn07XG5cbi8vIEZ1bmN0aW9uIHRvIGZpbmQgb3V0IHRoZSBmaXJzdCBpbnZhbGlkIGVsZW1lbnQgaW4gZm9ybVxuY29uc3QgZmluZEludmFsaWRFbGVtZW50ID0gKCRmb3JtRWxlLCBuZ0Zvcm0pID0+IHtcbiAgICBjb25zdCAkZWxlID0gJGZvcm1FbGUuZmluZCgnZm9ybS5uZy1pbnZhbGlkOnZpc2libGUsIFtmb3JtQ29udHJvbE5hbWVdLm5nLWludmFsaWQ6dmlzaWJsZScpLmZpcnN0KCk7XG4gICAgbGV0IGZvcm1PYmogPSBuZ0Zvcm07XG4gICAgLy8gSWYgZWxlbWVudCBpcyBmb3JtLCBmaW5kIG91dCB0aGUgZmlyc3QgaW52YWxpZCBlbGVtZW50IGluIHRoaXMgZm9ybVxuICAgIGlmICgkZWxlLmlzKCdmb3JtJykpIHtcbiAgICAgICAgZm9ybU9iaiA9IG5nRm9ybSAmJiBuZ0Zvcm0uY29udHJvbHNbJGVsZS5hdHRyKCdmb3JtQ29udHJvbE5hbWUnKSB8fCAkZWxlLmF0dHIoJ25hbWUnKV07XG4gICAgICAgIGlmIChmb3JtT2JqKSB7XG4gICAgICAgICAgICByZXR1cm4gZmluZEludmFsaWRFbGVtZW50KCRlbGUsIGZvcm1PYmopO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIG5nRm9ybTogZm9ybU9iaixcbiAgICAgICAgJGVsZTogJGVsZVxuICAgIH07XG59O1xuXG4vLyBGdW5jdGlvbiB0byBnZXQgdGhlIGFjdGl2ZSBlbGVtZW50IG1hcmt1cCBiYXNlZCBvbiB3aWRnZXQgdHlwZVxuY29uc3QgZ2V0QWN0aXZlRWxlbWVudCA9IChlbGVtZW50KSA9PiB7XG4gICAgY29uc3Qgd2lkZ2V0VHlwZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCd3aWRnZXR0eXBlJyk7XG4gICAgc3dpdGNoICh3aWRnZXRUeXBlKSB7XG4gICAgICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudC5xdWVyeVNlbGVjdG9yKCdzZWxlY3QnKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICd0ZXh0YXJlYSc6XG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudC5xdWVyeVNlbGVjdG9yKCd0ZXh0YXJlYScpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudC5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpO1xuICAgIH1cbn1cbmNvbnN0IHNldFRvdWNoZWRTdGF0ZSA9IChzZWxmLCBuZ0Zvcm0sIGZpZWxkTmFtZSkgPT4ge1xuICAgIGlmIChuZ0Zvcm0udmFsaWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAobmdGb3JtLmNvbnRyb2xzKSB7XG4gICAgICAgIF8uZm9yRWFjaChuZ0Zvcm0uY29udHJvbHMsIChjdHJsLCBmaWVsZE5hbWUpID0+IHtcbiAgICAgICAgICAgIHNldFRvdWNoZWRTdGF0ZShzZWxmLCBjdHJsLCBmaWVsZE5hbWUpO1xuICAgICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBsZXQgZWxlbWVudCA9IHNlbGYuJGVsZW1lbnQuZmluZChgW3dtZm9ybWZpZWxkXVtrZXk9XCIke2ZpZWxkTmFtZX1cIl1gKTtcbiAgICAgICAgaWYgKCFlbGVtZW50Lmxlbmd0aCkge1xuICAgICAgICAgICAgZWxlbWVudCA9IHNlbGYuJGVsZW1lbnQuZmluZChgW3dtZm9ybWZpZWxkXVtuYW1lPVwiJHtmaWVsZE5hbWV9XCJdYCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxlbWVudFswXS5zZXRBdHRyaWJ1dGUoJ19fZXJyb3Jtc2cnLCBlbGVtZW50WzBdLmdldEF0dHJpYnV0ZSgnX192YWxpZGF0aW9uSWQnKSk7XG4gICAgICAgIGxldCBhY3RpdmVFbGVtZW50ID0gZ2V0QWN0aXZlRWxlbWVudChlbGVtZW50WzBdKTtcbiAgICAgICAgYWN0aXZlRWxlbWVudD8uc2V0QXR0cmlidXRlKCdhcmlhLWludmFsaWQnLCBuZ0Zvcm0uaW52YWxpZCk7XG4gICAgICAgIGFjdGl2ZUVsZW1lbnQ/LnNldEF0dHJpYnV0ZSgnYXJpYS1kZXNjcmliZWRieScsIGVsZW1lbnRbMF0uZ2V0QXR0cmlidXRlKCdfX3ZhbGlkYXRpb25JZCcpKTtcbiAgICAgICAgbmdGb3JtLm1hcmtBc1RvdWNoZWQoKTtcbiAgICB9XG59O1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2Zvcm1bd21Gb3JtXScsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2Zvcm0uY29tcG9uZW50Lmh0bWwnLFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICBwcm92aWRlQXNXaWRnZXRSZWYoRm9ybUNvbXBvbmVudClcbiAgICBdXG59KVxuZXhwb3J0IGNsYXNzIEZvcm1Db21wb25lbnQgZXh0ZW5kcyBTdHlsYWJsZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uRGVzdHJveSwgQWZ0ZXJDb250ZW50SW5pdCwgQWZ0ZXJWaWV3SW5pdCB7XG4gICAgc3RhdGljICBpbml0aWFsaXplUHJvcHMgPSByZWdpc3RlckZvcm1Qcm9wcygpO1xuICAgIEBWaWV3Q2hpbGQoJ2R5bmFtaWNGb3JtJywgeyBzdGF0aWM6IHRydWUsIHJlYWQ6IFZpZXdDb250YWluZXJSZWYgfSkgZHluYW1pY0Zvcm1SZWY6IFZpZXdDb250YWluZXJSZWY7XG4gICAgQFZpZXdDaGlsZChNZXNzYWdlQ29tcG9uZW50KSBtZXNzYWdlUmVmO1xuICAgIC8vIHRoaXMgaXMgdGhlIHJlZmVyZW5jZSB0byB0aGUgY29tcG9uZW50IHJlZnMgaW5zaWRlIHRoZSBmb3JtLWdyb3VwXG4gICAgQENvbnRlbnRDaGlsZHJlbihXaWRnZXRSZWYsIHtkZXNjZW5kYW50czogdHJ1ZX0pIGNvbXBvbmVudFJlZnM7XG5cbiAgICBhdXRvdXBkYXRlO1xuICAgIHB1YmxpYyBmb3JtbGF5b3V0OiBhbnk7XG4gICAgcHVibGljIGlzRGF0YVNvdXJjZVVwZGF0ZWQ6IGJvb2xlYW47XG4gICAgY2FwdGlvbkFsaWduQ2xhc3M6IHN0cmluZztcbiAgICB2YWxpZGF0aW9udHlwZTogc3RyaW5nO1xuICAgIGNhcHRpb25hbGlnbjogc3RyaW5nO1xuICAgIGNhcHRpb25wb3NpdGlvbjogc3RyaW5nO1xuICAgIGNhcHRpb25zaXplO1xuICAgIGNvbGxhcHNpYmxlOiBib29sZWFuO1xuICAgIGV4cGFuZGVkOiBib29sZWFuO1xuICAgIGVsU2NvcGU7XG4gICAgX3dpZGdldENsYXNzID0gJyc7XG4gICAgY2FwdGlvbndpZHRoOiBzdHJpbmc7XG4gICAgX2NhcHRpb25DbGFzcyA9ICcnO1xuICAgIG5nZm9ybTogRm9ybUdyb3VwO1xuICAgIGZvcm1GaWVsZHMgPSBbXTtcbiAgICBmb3JtZmllbGRzID0ge307XG4gICAgZm9ybVdpZGdldHMgPSB7fTtcbiAgICBmaWx0ZXJXaWRnZXRzID0ge307XG4gICAgYnV0dG9uQXJyYXkgPSBbXTtcbiAgICBkYXRhb3V0cHV0ID0ge307XG4gICAgZGF0YXNvdXJjZTtcbiAgICBmb3JtZGF0YXNvdXJjZTtcbiAgICBmb3JtZGF0YSA9IHt9O1xuICAgIGlzU2VsZWN0ZWQ7XG4gICAgcHJldkRhdGFWYWx1ZXM7XG4gICAgcHJldkRhdGFPYmplY3Q7XG4gICAgcHJldmZvcm1GaWVsZHM7XG4gICAgc3RhdHVzTWVzc2FnZSA9IHtcbiAgICAgICAgY2FwdGlvbjogJycsXG4gICAgICAgIHR5cGU6ICcnXG4gICAgfTtcbiAgICBtZXNzYWdlbGF5b3V0O1xuICAgIG1ldGFkYXRhO1xuICAgIGVycm9ybWVzc2FnZTtcbiAgICBvbkVycm9yO1xuICAgIG9uU3VjY2VzcztcbiAgICBwcmltYXJ5S2V5ID0gW107XG4gICAgcG9zdG1lc3NhZ2U7XG4gICAgX2xpdmVUYWJsZVBhcmVudDtcbiAgICB1cGRhdGVNb2RlO1xuICAgIG5hbWU7XG4gICAgLy8gTGl2ZSBGb3JtIE1ldGhvZHNcbiAgICBjbGVhckRhdGE6IEZ1bmN0aW9uO1xuICAgIGNhbmNlbDogRnVuY3Rpb247XG4gICAgZGVsZXRlOiBGdW5jdGlvbjtcbiAgICBzYXZlOiBGdW5jdGlvbjtcbiAgICBzYXZlQW5kTmV3OiBGdW5jdGlvbjtcbiAgICBzYXZlQW5kVmlldzogRnVuY3Rpb247XG4gICAgc2V0UHJpbWFyeUtleTogKCkgPT4ge307XG4gICAgZGlhbG9nSWQ6IHN0cmluZztcbiAgICAvLyBMaXZlIEZpbHRlclxuICAgIGVuYWJsZWVtcHR5ZmlsdGVyO1xuICAgIHBhZ2VzaXplO1xuICAgIHJlc3VsdDtcbiAgICBwYWdpbmF0aW9uO1xuICAgIGNsZWFyRmlsdGVyOiBGdW5jdGlvbjtcbiAgICBhcHBseUZpbHRlcjogRnVuY3Rpb247XG4gICAgZmlsdGVyOiBGdW5jdGlvbjtcbiAgICBmaWx0ZXJPbkRlZmF1bHQ6IEZ1bmN0aW9uO1xuICAgIG9uTWF4RGVmYXVsdFZhbHVlQ2hhbmdlOiBGdW5jdGlvbjtcbiAgICBudW1iZXJPZkZpZWxkczogbnVtYmVyO1xuXG4gICAgcHJpdmF0ZSBfZGVib3VuY2VkVXBkYXRlRmllbGRTb3VyY2U6IEZ1bmN0aW9uID0gXy5kZWJvdW5jZSh0aGlzLnVwZGF0ZUZpZWxkU291cmNlLCAzNTApO1xuICAgIHByaXZhdGUgb3BlcmF0aW9uVHlwZTtcbiAgICBwcml2YXRlIF9pc0xheW91dERpYWxvZztcbiAgICBwcml2YXRlIF9keW5hbWljQ29udGV4dDtcbiAgICBwcml2YXRlIF9pc0dyaWRMYXlvdXRQcmVzZW50O1xuICAgIHByaXZhdGUgdmFsaWRhdGlvbk1lc3NhZ2VzID0gW107XG4gICAgcHJpdmF0ZSBmb3JtR3JvdXBOYW1lO1xuICAgIHByaXZhdGUgZm9ybUFycmF5SW5kZXg7XG4gICAgcHJpdmF0ZSBiaW5kaW5nVmFsdWU7XG4gICAgcHJpdmF0ZSBfZm9ybUlzSW5MaXN0O1xuICAgIHByaXZhdGUgX3RyaWdnZXJlZEJ5VXNlcjogYm9vbGVhbjtcblxuXG4gICAgcHJpdmF0ZSBfZGVib3VuY2VkU3VibWl0Rm9ybSA9IGRlYm91bmNlKCgkZXZlbnQpID0+IHtcbiAgICAgICAgLy8gY2FsbGluZyBzdWJtaXQgZXZlbnQgaW4gbmdab25lIGFzIGNoYW5nZSBkZXRlY3Rpb24gaXMgbm90IHRyaWdnZXJlZCBwb3N0IHRoZSBzdWJtaXQgY2FsbGJhY2sgYW5kIGFjdGlvbnMgbGlrZSBub3RpZmljYXRpb24gYXJlIG5vdCBzaG93blxuICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zdWJtaXRGb3JtKCRldmVudCk7XG4gICAgICAgIH0pO1xuICAgIH0sIDI1MCk7XG5cbiAgICBzZXQgaXNMYXlvdXREaWFsb2cobnYpIHtcbiAgICAgICAgaWYgKG52KSB7XG4gICAgICAgICAgICByZW1vdmVDbGFzcyh0aGlzLm5hdGl2ZUVsZW1lbnQsICdwYW5lbCBhcHAtcGFuZWwgbGl2ZWZvcm0taW5saW5lJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5faXNMYXlvdXREaWFsb2cgPSBudjtcbiAgICB9XG5cbiAgICBnZXQgaXNMYXlvdXREaWFsb2coKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc0xheW91dERpYWxvZztcbiAgICB9XG5cbiAgICBwcml2YXRlIF9pc1VwZGF0ZU1vZGU7XG4gICAgc2V0IGlzVXBkYXRlTW9kZShudikge1xuICAgICAgICB0aGlzLl9pc1VwZGF0ZU1vZGUgPSBudjtcbiAgICAgICAgdGhpcy5mb3JtRmllbGRzLmZvckVhY2goZmllbGQgPT4ge1xuICAgICAgICAgICAgZmllbGQuc2V0UmVhZE9ubHlTdGF0ZShudik7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGdldCBpc1VwZGF0ZU1vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc1VwZGF0ZU1vZGU7XG4gICAgfVxuXG4gICAgQEhvc3RCaW5kaW5nKCdhY3Rpb24nKSBhY3Rpb246IHN0cmluZztcblxuICAgIEBIb3N0TGlzdGVuZXIoJ3N1Ym1pdCcsIFsnJGV2ZW50J10pIHN1Ym1pdCgkZXZlbnQpIHtcbiAgICAgICAgdGhpcy5fZGVib3VuY2VkU3VibWl0Rm9ybSgkZXZlbnQpO1xuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ3Jlc2V0Jykgb25SZXNldCgpIHtcbiAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ2tleWRvd24nLCBbJyRldmVudCddKSBvbktleWRvd25IYW5kbGVyKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgICAgIHRoaXMuX3RyaWdnZXJlZEJ5VXNlciA9IHRydWU7XG4gICAgfVxuICAgIC8vIHJldHVybnMgdGhlIGZvcm1BcnJheSBjb250cm9sIG9uIHRoZSBwYXJlbnRGb3JtLlxuICAgIGdldCBwYXJlbnRGb3JtQXJyYXkoKTogRm9ybUFycmF5IHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyZW50Rm9ybSAmJiB0aGlzLmlzUGFyZW50TGlzdCAmJiB0aGlzLnBhcmVudEZvcm0ubmdmb3JtLmdldCh0aGlzLnBhcmVudExpc3QubmFtZSkgYXMgRm9ybUFycmF5O1xuICAgIH1cblxuICAgIC8vIHJldHVybnMgdHJ1ZSBvbmx5IHdoZW4gY2xvc2VzdCBsaXZlbGlzdCBpcyB0aGUgaW1tZWRpYXRlIHBhcmVudCBvZiB0aGUgZm9ybS5cbiAgICAvLyBjaGVja3MgZm9yIGxpdmVsaXN0IGhhdmluZyBhbnkgZm9ybSBlbGVtZW50cyB3aXRoIHBhcmVudEZvcm0gbmFtZS5cbiAgICAvLyBJZiBsaXZlbGlzdCBpcyBub3QgY29udGFpbmluZyBhbnkgcGFyZW50Rm9ybSBlbGVtZW50cyB0aGVuIGl0IHJldHVybnMgdHJ1ZS5cbiAgICBnZXQgaXNQYXJlbnRMaXN0KCkge1xuICAgICAgICBpZiAodGhpcy5wYXJlbnRMaXN0ICYmIHRoaXMucGFyZW50Rm9ybSAmJiAhaXNEZWZpbmVkKHRoaXMuX2Zvcm1Jc0luTGlzdCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGZvcm1FbGUgPSB0aGlzLiRlbGVtZW50O1xuICAgICAgICAgICAgY29uc3QgbGlzdEVsZSA9IGZvcm1FbGUuY2xvc2VzdCgnLmFwcC1saXZlbGlzdFtuYW1lPVwiJyArIHRoaXMucGFyZW50TGlzdC5uYW1lICsgJ1wiXScpO1xuICAgICAgICAgICAgaWYgKGxpc3RFbGUubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZm9ybUlzSW5MaXN0ID0gIShsaXN0RWxlLmZpbmQoJ2Zvcm1bd2lkZ2V0LWlkPVwiJyArIHRoaXMucGFyZW50Rm9ybS53aWRnZXRJZCArICdcIl0nKSkubGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpc0RlZmluZWQodGhpcy5fZm9ybUlzSW5MaXN0KSA/IHRoaXMuX2Zvcm1Jc0luTGlzdCA6IHRoaXMucGFyZW50TGlzdDtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgaW5qOiBJbmplY3RvcixcbiAgICAgICAgcHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIsXG4gICAgICAgIHByaXZhdGUgYXBwOiBBcHAsXG4gICAgICAgIHByaXZhdGUgZGlhbG9nU2VydmljZTogQWJzdHJhY3REaWFsb2dTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGR5bmFtaWNDb21wb25lbnRQcm92aWRlcjogRHluYW1pY0NvbXBvbmVudFJlZlByb3ZpZGVyLFxuICAgICAgICBwcml2YXRlIG5nWm9uZTogTmdab25lLFxuICAgICAgICBAT3B0aW9uYWwoKSBwdWJsaWMgcGFyZW50TGlzdDogTGlzdENvbXBvbmVudCxcbiAgICAgICAgQFNraXBTZWxmKCkgQE9wdGlvbmFsKCkgcHVibGljIHBhcmVudEZvcm06IEZvcm1Db21wb25lbnQsXG4gICAgICAgIEBTa2lwU2VsZigpIEBPcHRpb25hbCgpIHB1YmxpYyBwYXJlbnRQcmVmYWI6IFByZWZhYkRpcmVjdGl2ZSxcbiAgICAgICAgQFNraXBTZWxmKCkgQE9wdGlvbmFsKCkgcHVibGljIHBhcmVudFBhcnRpYWw6IFBhcnRpYWxEaXJlY3RpdmUsXG4gICAgICAgIEBBdHRyaWJ1dGUoJ2JlZm9yZXN1Ym1pdC5ldmVudCcpIHB1YmxpYyBvbkJlZm9yZVN1Ym1pdEV2dCxcbiAgICAgICAgQEF0dHJpYnV0ZSgnc3VibWl0LmV2ZW50JykgcHVibGljIG9uU3VibWl0RXZ0LFxuICAgICAgICBAQXR0cmlidXRlKCdiZWZvcmVyZW5kZXIuZXZlbnQnKSBwdWJsaWMgb25CZWZvcmVSZW5kZXJFdnQsXG4gICAgICAgIEBBdHRyaWJ1dGUoJ2RhdGFzZXQuYmluZCcpIHB1YmxpYyBiaW5kZGF0YXNldCxcbiAgICAgICAgQEF0dHJpYnV0ZSgnZm9ybWRhdGEuYmluZCcpIHByaXZhdGUgYmluZGZvcm1kYXRhLFxuICAgICAgICBAQXR0cmlidXRlKCd3bUxpdmVGb3JtJykgaXNMaXZlRm9ybSxcbiAgICAgICAgQEF0dHJpYnV0ZSgnd21MaXZlRmlsdGVyJykgaXNMaXZlRmlsdGVyLFxuICAgICAgICBAQXR0cmlidXRlKCdkYXRhLXJvbGUnKSByb2xlLFxuICAgICAgICBAQXR0cmlidXRlKCdrZXknKSBrZXksXG4gICAgICAgIEBBdHRyaWJ1dGUoJ25hbWUnKSBuYW1lXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKGluaiwgZ2V0V2lkZ2V0Q29uZmlnKGlzTGl2ZUZvcm0sIGlzTGl2ZUZpbHRlciwgcm9sZSksKTtcblxuICAgICAgICBzdHlsZXIodGhpcy5uYXRpdmVFbGVtZW50LCB0aGlzKTtcblxuICAgICAgICAvLyByZW1vdmUgdGl0bGUgcHJvcGVydHkgYXMgYXR0cmlidXRlIGFzIGl0IGlzIGNhdXNpbmcgdW5uZWNlc3NhcnkgdG9vbHRpcFxuICAgICAgICByZW1vdmVBdHRyKHRoaXMubmF0aXZlRWxlbWVudCwgJ3RpdGxlJyk7XG4gICAgICAgIHRoaXMuaXNVcGRhdGVNb2RlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5kaWFsb2dJZCA9IHRoaXMubmF0aXZlRWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RpYWxvZ0lkJyk7XG4gICAgICAgIHRoaXMubmdmb3JtID0gZmIuZ3JvdXAoe30pO1xuICAgICAgICB0aGlzLmJpbmRpbmdWYWx1ZSA9IGtleSB8fCBuYW1lO1xuXG4gICAgICAgIC8vIE9uIHZhbHVlIGNoYW5nZSBpbiBmb3JtLCB1cGRhdGUgdGhlIGRhdGFvdXRwdXRcbiAgICAgICAgY29uc3Qgb25WYWx1ZUNoYW5nZVN1YnNjcmlwdGlvbiA9ICB0aGlzLm5nZm9ybS52YWx1ZUNoYW5nZXNcbiAgICAgICAgICAgIC5zdWJzY3JpYmUodGhpcy51cGRhdGVEYXRhT3V0cHV0LmJpbmQodGhpcykpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVyRGVzdHJveUxpc3RlbmVyKCgpID0+IG9uVmFsdWVDaGFuZ2VTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKSk7XG4gICAgICAgIHRoaXMuZWxTY29wZSA9IHRoaXM7XG5cbiAgICAgICAgdGhpcy5hZGRFdmVudHNUb0NvbnRleHQodGhpcy5jb250ZXh0KTtcbiAgICB9XG5cbiAgICBuZ0FmdGVyQ29udGVudEluaXQoKSB7XG4gICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNvbXBvbmVudFJlZnMuZm9yRWFjaChjb21wb25lbnRSZWYgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnRSZWYubmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBSZWdpc3RlciB3aWRnZXRzIGluc2lkZSBmb3JtIHdpdGggZm9ybVdpZGdldHNcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtV2lkZ2V0c1tjb21wb25lbnRSZWYubmFtZV0gPSBjb21wb25lbnRSZWY7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sIDI1MCk7XG4gICAgfVxuXG4gICAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgICAgICBpZiAodGhpcy5wYXJlbnRGb3JtICYmIHRoaXMucGFyZW50Rm9ybS5uZ2Zvcm0gJiYgdGhpcy5pc1BhcmVudExpc3QpIHtcbiAgICAgICAgICAgIC8vIHNldHRpbmcgZm9ybUFycmF5IGNvbnRyb2wgb24gbmdmb3JtLlxuICAgICAgICAgICAgaWYgKCFfLmdldCh0aGlzLnBhcmVudEZvcm0ubmdmb3JtLmNvbnRyb2xzLCB0aGlzLnBhcmVudExpc3QubmFtZSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBhcmVudEZvcm0ubmdmb3JtLnNldENvbnRyb2wodGhpcy5wYXJlbnRMaXN0Lm5hbWUsIG5ldyBGb3JtQXJyYXkoW10pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHB1c2hpbmcgdGhlIG5nZm9ybSB0byBmb3JtQXJyYXkuXG4gICAgICAgICAgICB0aGlzLnBhcmVudEZvcm1BcnJheS5wdXNoKHRoaXMubmdmb3JtKTtcbiAgICAgICAgICAgIHRoaXMuZm9ybUFycmF5SW5kZXggPSB0aGlzLnBhcmVudEZvcm1BcnJheS5sZW5ndGggLSAxO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYWRkSW5uZXJOZ0Zvcm1Ub0Zvcm0odGhpcy5iaW5kaW5nVmFsdWUpO1xuICAgIH1cblxuICAgIGZpbmRPcGVyYXRpb25UeXBlKCkge31cblxuICAgIHByaXZhdGUgYWRkSW5uZXJOZ0Zvcm1Ub0Zvcm0oYmluZGluZykge1xuICAgICAgICBpZiAodGhpcy5wYXJlbnRGb3JtICYmIHRoaXMucGFyZW50Rm9ybS5uZ2Zvcm0pIHtcbiAgICAgICAgICAgIC8vIGhhbmRsaW5nIGFzIGZvcm1BcnJheSB3aGVuIHBhcmVudCBpcyBsaXN0LiBIZW5jZSByZXR1cm5pbmcgaGVyZSBmcm9tIGFkZGluZyB0byBwYXJlbnRGb3JtIGFnYWluLlxuICAgICAgICAgICAgaWYgKHRoaXMuaXNQYXJlbnRMaXN0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gYXNzaWduaW5nIHRoZSBjb250cm9sIG5hbWUgb2YgdGhlIGZvcm0gaW5zaWRlIHRoZSBwcmVmYWIgd2l0aCB0aGUgcHJlZmFiIG5hbWUuXG4gICAgICAgICAgICAvLyBUaGlzIHdpbGwgaGFwcGVuIG9ubHkgd2hlbiB0aGVyZSBpcyBvbmx5IG9uZSBmb3JtIGluc2lkZSBwcmVmYWIuXG4gICAgICAgICAgICAvLyBXZSBkbyBub3Qgc3VwcG9ydCBjaGFuZ2luZyB0aGlzIHdoZW4gbXVsdGlwbGUgZm9ybXMgYXJlIGluc2lkZSBwcmVmYWIuXG4gICAgICAgICAgICAvLyBUaGlzIHNjZW5hcmlvIGhhcyB0byBiZSBoYW5kbGVkIGJ5IGVuZCB1c2VyIGJ5IGNoYW5naW5nIGZvcm0gbmFtZXMgaW4gcHJlZmFiIGFjY29yZGluZyB0byB0aGUgZGF0YW1vZGVsIGJpbmRpbmcuXG4gICAgICAgICAgICBjb25zdCBwYXJlbnRDb250YWluZXIgPSB0aGlzLnBhcmVudFByZWZhYiB8fCB0aGlzLnBhcmVudFBhcnRpYWw7XG4gICAgICAgICAgICBpZiAocGFyZW50Q29udGFpbmVyKSB7XG4gICAgICAgICAgICAgICAgbGV0IHBhcmVudENvbnRlbnRFbDtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5wYXJlbnRQcmVmYWIpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50Q29udGVudEVsID0gcGFyZW50Q29udGFpbmVyLiRlbGVtZW50LmZpbmQoJ1t3bXByZWZhYmNvbnRhaW5lcl0nKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnRDb250ZW50RWwgPSBwYXJlbnRDb250YWluZXIuJGVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAqIGFzc2lnbmluZyB0aGUgZm9ybSBuYW1lIHRvIHRoZSBwYXJlbnRDb250YWluZXIgbmFtZSBpLmUuIHBhcnRpYWwgbmFtZSBvciBwZXJmYWIgbmFtZSBieSBmb2xsb3dpbmdcbiAgICAgICAgICAgICAgICAgKiAxLiByZXRyaWV2aW5nIGFsbCB0aGUgZm9ybXMgaW4gdGhlIHBhcmVudENvbnRhaW5lclxuICAgICAgICAgICAgICAgICAqIDIuIGNvbnNpZGVyIHRoZSBmaXJzdCBmb3JtXG4gICAgICAgICAgICAgICAgICogMy4gaWYgdGhpcyBmb3JtIGlzIGluc2lkZSBsaXN0IGkuZS4gYWxzbyBmaW5kIGlmIHRoaXMgbGlzdCBpcyBhbHNvIGluc2lkZSB0aGUgcGFyZW50Q29udGFpbmVyIChwcmVmYWIgLyBwYXJ0aWFsKVxuICAgICAgICAgICAgICAgICAqIDQuIHRoZW4gZG8gbm90IGNoYW5nZSB0aGUgZm9ybSBuYW1lIHdoZW4gZm9ybSBpcyBpbnNpZGUgbGlzdCBhbmQgYWxzbyB3aGVuIHRoZXJlIGFyZSBzaWJsaW5ncyB0byB0aGUgZm9ybVxuICAgICAgICAgICAgICAgICAqIDUuIHRoaXMgbWVhbnMgZm9ybSBuYW1lIGNoYW5nZSBhcHBsaWVzIG9ubHkgd2hlbiB0aGVyZSBpcyBzaW5nbGUgZm9ybSAoaW1tZWRpYXRlIGNoaWxkKSBpbnNpZGUgdGhlIHBhcmVudENvbnRhaW5lci5cbiAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICBjb25zdCBwcmVmYWJJbm5lckZvcm0gPSBwYXJlbnRDb250ZW50RWwuZmluZCgnZm9ybScpLmZpcnN0KCk7XG4gICAgICAgICAgICAgICAgaWYgKF8uZ2V0KHByZWZhYklubmVyRm9ybVswXSwgJ3dpZGdldC53aWRnZXRJZCcpID09PSB0aGlzLndpZGdldElkKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIHdoZXRoZXIgZm9ybSBpbnNpZGUgcHJlZmFiIGNvbnRhaW5lciBpcyBpbnNpZGUgdGhlIGxpc3QuIElmIHRydWUsIGRvIG5vdCBjaGFuZ2UgdGhlIG5hbWUuXG4gICAgICAgICAgICAgICAgICAgIGlmICghcHJlZmFiSW5uZXJGb3JtLmlzUGFyZW50TGlzdCAmJiAhcHJlZmFiSW5uZXJGb3JtLnNpYmxpbmdzKCdmb3JtJykubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBiaW5kaW5nID0gXy5nZXQocGFyZW50Q29udGFpbmVyLCAnbmFtZScpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGNvdW50ZXIgPSAxO1xuICAgICAgICAgICAgbGV0IGlubmVyQmluZGluZyA9IGJpbmRpbmc7XG4gICAgICAgICAgICAvLyBJbm5lciBmb3JtcyBtYXkgaGF2ZSBzYW1lIG5hbWVzLiBJZiBzYW1lIG5hbWUgaXMgcHJlc2VudCwgYXBwZW5kIHVucWl1ZSBpZGVudGlmaWVyXG4gICAgICAgICAgICB3aGlsZSAodGhpcy5wYXJlbnRGb3JtLm5nZm9ybS5jb250cm9scy5oYXNPd25Qcm9wZXJ0eShpbm5lckJpbmRpbmcpKSB7XG4gICAgICAgICAgICAgICAgaW5uZXJCaW5kaW5nID0gYCR7YmluZGluZ31fJHtjb3VudGVyfWA7XG4gICAgICAgICAgICAgICAgY291bnRlcisrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5mb3JtR3JvdXBOYW1lID0gaW5uZXJCaW5kaW5nO1xuICAgICAgICAgICAgLy8gSWYgcGFyZW50IGZvcm0gaXMgcHJlc2VudCwgYWRkIHRoZSBjdXJyZW50IGZvcm0gYXMgYXMgZm9ybUdyb3VwIGZvciBwYXJlbnQgZm9ybVxuICAgICAgICAgICAgdGhpcy5wYXJlbnRGb3JtLm5nZm9ybS5hZGRDb250cm9sKGlubmVyQmluZGluZywgdGhpcy5uZ2Zvcm0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gRXhwb3NlIHRoZSBldmVudHMgb24gY29udGV4dCBzbyB0aGF0IHRoZXkgY2FuIGJlIGFjY2Vzc2VkIGJ5IGZvcm0gYWN0aW9uc1xuICAgIHByaXZhdGUgYWRkRXZlbnRzVG9Db250ZXh0KGNvbnRleHQpIHtcbiAgICAgICAgY29udGV4dC5jYW5jZWwgPSAoKSA9PiB0aGlzLmNhbmNlbCgpO1xuICAgICAgICBjb250ZXh0LnJlc2V0ID0gKCkgPT4gdGhpcy5yZXNldCgpO1xuICAgICAgICBjb250ZXh0LnNhdmUgPSBldnQgPT4gdGhpcy5zYXZlKGV2dCk7XG4gICAgICAgIGNvbnRleHQuc2F2ZUFuZE5ldyA9ICgpID0+IHRoaXMuc2F2ZUFuZE5ldygpO1xuICAgICAgICBjb250ZXh0LnNhdmVBbmRWaWV3ID0gKCkgPT4gdGhpcy5zYXZlQW5kVmlldygpO1xuICAgICAgICBjb250ZXh0LmRlbGV0ZSA9ICgpID0+IHRoaXMuZGVsZXRlKCk7XG4gICAgICAgIGNvbnRleHQubmV3ID0gKCkgPT4gdGhpcy5uZXcoKTtcbiAgICAgICAgY29udGV4dC5lZGl0ID0gKCkgPT4gdGhpcy5lZGl0KCk7XG4gICAgICAgIGNvbnRleHQuaGlnaGxpZ2h0SW52YWxpZEZpZWxkcyA9ICgpID0+IHRoaXMuaGlnaGxpZ2h0SW52YWxpZEZpZWxkcygpO1xuICAgICAgICBjb250ZXh0LmZpbHRlciA9ICgpID0+IHRoaXMuZmlsdGVyKCk7XG4gICAgICAgIGNvbnRleHQuY2xlYXJGaWx0ZXIgPSAoKSA9PiB0aGlzLmNsZWFyRmlsdGVyKCk7XG4gICAgICAgIGNvbnRleHQuc3VibWl0ID0gZXZ0ID0+IHRoaXMuc3VibWl0KGV2dCk7XG4gICAgfVxuXG4gICAgLy8gVGhpcyBtZXRob2QgZ2V0cyBhbGwgdGhlIGlubmVyIGZvcm1zIGFuZCB2YWxpZGF0ZXMgZWFjaCBmb3JtLlxuICAgIHByaXZhdGUgc2V0VmFsaWRhdGlvbk9uSW5uZXJGb3Jtcyh2YWxpZGF0ZVRvdWNoKSB7XG4gICAgICAgIGNvbnN0IGZvcm1FbGUgPSB0aGlzLmdldE5hdGl2ZUVsZW1lbnQoKTtcbiAgICAgICAgY29uc3QgZm9ybU9ianMgPSBmb3JtRWxlLnF1ZXJ5U2VsZWN0b3JBbGwoJy5hcHAtZm9ybScpO1xuICAgICAgICBjb25zdCB2YWxpZGF0aW9uTXNncyA9IFtdO1xuICAgICAgICBfLmZvckVhY2goZm9ybU9ianMsIGUgPT4ge1xuICAgICAgICAgICAgY29uc3QgZm9ybUluc3RhbmNlID0gKGUgYXMgYW55KS53aWRnZXQ7XG4gICAgICAgICAgICAvLyBkaWZmZXJlbnRpYXRpbmcgdGhlIHZhbGlkYXRpb25NZXNzYWdlcyBwcmVmaXggYmFzZWQgb24gdGhlIGZvcm1Hcm91cE5hbWVcbiAgICAgICAgICAgIC8vIGFzIHRoZSBmb3JtTmFtZSdzIGFyZSBzYW1lIHdoZW4gZm9ybXMgYXJlIGluIGxpc3RcbiAgICAgICAgICAgIGxldCBmb3JtTmFtZSA9IF8uZ2V0KGZvcm1JbnN0YW5jZSwgJ2Zvcm1Hcm91cE5hbWUnKSB8fCBmb3JtSW5zdGFuY2UubmFtZTtcbiAgICAgICAgICAgIGlmIChpc0RlZmluZWQoZm9ybUluc3RhbmNlLmZvcm1BcnJheUluZGV4KSkge1xuICAgICAgICAgICAgICAgIGZvcm1OYW1lID0gZm9ybU5hbWUgKyAnWycgKyBmb3JtSW5zdGFuY2UuZm9ybUFycmF5SW5kZXggKyAnXSc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgY3VycmVudCA9IGZvcm1JbnN0YW5jZTtcbiAgICAgICAgICAgIHdoaWxlIChfLmdldChjdXJyZW50LCAncGFyZW50Rm9ybScpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHBhcmVudE5hbWUgPSBjdXJyZW50LnBhcmVudEZvcm0uZm9ybUdyb3VwTmFtZSB8fCBjdXJyZW50LnBhcmVudEZvcm0ubmFtZTtcbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudC5wYXJlbnRGb3JtLnBhcmVudEZvcm1BcnJheSkge1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnROYW1lID0gcGFyZW50TmFtZSArICdbJyArIGN1cnJlbnQucGFyZW50Rm9ybS5mb3JtQXJyYXlJbmRleCArICddJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZm9ybU5hbWUgPSBwYXJlbnROYW1lICsgJy4nICsgZm9ybU5hbWU7XG4gICAgICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQucGFyZW50Rm9ybTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc2V0VmFsaWRhdGlvbk9uRmllbGRzKGZvcm1JbnN0YW5jZSwgZm9ybU5hbWUsIHZhbGlkYXRlVG91Y2gpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBzZXRzIHZhbGlkYXRpb24gb24gZm9ybUZpZWxkcy5cbiAgICAgKiBBcHBsaWVzIHRvIGlubmVyZm9ybSBhbmQgYWxzbyBzZXRzIGlubmVyZm9ybSB2YWxpZGF0aW9uIG9uIHBhcmVudCBmb3JtLlxuICAgICAqIEBwYXJhbSBwcmVmaXggY29udGFpbnMgdGhlIGZvcm0gbmFtZSwgd2hpY2ggYWxzbyBpbmNsdWRlcyBpdHMgcGFyZW50cyBmb3JtIG5hbWVcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHZhbGlkYXRlVG91Y2hcbiAgICAgKi9cbiAgICBwcml2YXRlIHNldFZhbGlkYXRpb25PbkZpZWxkcyhmb3JtOiBGb3JtQ29tcG9uZW50LCBwcmVmaXg6IHN0cmluZywgdmFsaWRhdGVUb3VjaD86IGJvb2xlYW4pIHtcbiAgICAgICAgY29uc3QgY29udHJvbHMgPSBmb3JtLm5nZm9ybS5jb250cm9scztcbiAgICAgICAgY29uc3QgZm9ybUZpZWxkcyA9IGZvcm0uZm9ybUZpZWxkcztcbiAgICAgICAgaWYgKCFmb3JtRmllbGRzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgXy5mb3JFYWNoKGNvbnRyb2xzLCAodiwgaykgPT4ge1xuICAgICAgICAgICAgY29uc3QgZmllbGQgPSBmb3JtRmllbGRzLmZpbmQoZSA9PiBlLmtleSA9PT0gayk7XG4gICAgICAgICAgICBpZiAoIWZpZWxkIHx8ICh2YWxpZGF0ZVRvdWNoICYmICF2LnRvdWNoZWQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmllbGQubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpPy5zZXRBdHRyaWJ1dGUoJ2FyaWEtaW52YWxpZCcsIHYuaW52YWxpZCk7XG4gICAgICAgICAgICAvLyBpbnZva2luZyB0aGUgcHJlcGFyZVZhbGlkYXRpb24gb24gYm90aCBwYXJlbnQgZm9ybSBhbmQgY3VycmVudCBmb3JtLlxuICAgICAgICAgICAgdGhpcy5wcmVwYXJlVmFsaWRhdGlvbk9iaih2LCBrLCBmaWVsZCwgcHJlZml4KTtcbiAgICAgICAgICAgIHRoaXMucHJlcGFyZVZhbGlkYXRpb25PYmouY2FsbChmb3JtLCB2LCBrLCBmaWVsZCwgcHJlZml4KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQXNzaWducyAvIHVwZGF0ZXMgdmFsaWRhdGlvbk1lc3NhZ2VzIGJhc2VkIG9uIGFuZ3VsYXIgZXJyb3JzIG9uIGZpZWxkXG4gICAgcHJpdmF0ZSBwcmVwYXJlVmFsaWRhdGlvbk9iaih2LCBrLCBmaWVsZCwgcHJlZml4KSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy52YWxpZGF0aW9uTWVzc2FnZXMuZmluZEluZGV4KGUgPT4gKGUuZmllbGQgPT09IGsgJiYgZS5mdWxseVF1YWxpZmllZEZvcm1OYW1lID09PSBwcmVmaXgpKTtcbiAgICAgICAgaWYgKHYuaW52YWxpZCkge1xuICAgICAgICAgICAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAqIGZpZWxkIGNvbnRhaW5zIHRoZSBmaWVsZE5hbWVcbiAgICAgICAgICAgICAgICAgKiB2YWx1ZSBjb250YWlucyB0aGUgZmllbGQgdmFsdWVcbiAgICAgICAgICAgICAgICAgKiBlcnJvclR5cGUgY29udGFpbnMgdGhlIGxpc3Qgb2YgZXJyb3JzXG4gICAgICAgICAgICAgICAgICogbWVzc2FnZSBjb250YWlucyB0aGUgdmFsaWRhdGlvbiBtZXNzYWdlXG4gICAgICAgICAgICAgICAgICogZ2V0RWxlbWVudCByZXR1cm5zIHRoZSBlbGVtZW50IGhhdmluZyBmb2N1cy10YXJnZXRcbiAgICAgICAgICAgICAgICAgKiBmb3JtTmFtZSByZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBmb3JtXG4gICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgdGhpcy52YWxpZGF0aW9uTWVzc2FnZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkOiBrLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZmllbGQudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIGVycm9yVHlwZTogXy5rZXlzKHYuZXJyb3JzKSxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogZmllbGQudmFsaWRhdGlvbm1lc3NhZ2UgfHwgJycsXG4gICAgICAgICAgICAgICAgICAgIGdldEVsZW1lbnQ6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmaWVsZC4kZWxlbWVudC5maW5kKCdbZm9jdXMtdGFyZ2V0XScpO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBmb3JtTmFtZTogXy5sYXN0KHByZWZpeC5zcGxpdCgnLicpKSxcbiAgICAgICAgICAgICAgICAgICAgZnVsbHlRdWFsaWZpZWRGb3JtTmFtZTogcHJlZml4XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VzW2luZGV4XS52YWx1ZSA9IGZpZWxkLnZhbHVlO1xuICAgICAgICAgICAgICAgIHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VzW2luZGV4XS5lcnJvclR5cGUgPSBfLmtleXModi5lcnJvcnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHYudmFsaWQgJiYgaW5kZXggPiAtMSkge1xuICAgICAgICAgICAgdGhpcy52YWxpZGF0aW9uTWVzc2FnZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRoaXMgd2lsbCByZXR1cm4gYSBvYmplY3QgY29udGFpbmluZyB0aGUgZXJyb3IgZGV0YWlscyBmcm9tIHRoZSBsaXN0IG9mIGZvcm1GaWVsZHMgdGhhdCBhcmUgaW52YWxpZFxuICAgIHByaXZhdGUgc2V0VmFsaWRhdGlvbk1zZ3ModmFsaWRhdGVUb3VjaD86IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKCF0aGlzLmZvcm1GaWVsZHMubGVuZ3RoICYmIF8uaXNFbXB0eSh0aGlzLm5nZm9ybS5jb250cm9scykpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldFZhbGlkYXRpb25PbkZpZWxkcyh0aGlzLCB0aGlzLm5hbWUsIHZhbGlkYXRlVG91Y2gpO1xuICAgICAgICB0aGlzLnNldFZhbGlkYXRpb25PbklubmVyRm9ybXModmFsaWRhdGVUb3VjaCk7XG4gICAgfVxuXG4gICAgLy8gY2hhbmdlIGFuZCBibHVyIGV2ZW50cyBhcmUgYWRkZWQgZnJvbSB0aGUgdGVtcGxhdGVcbiAgICBwcm90ZWN0ZWQgaGFuZGxlRXZlbnQobm9kZTogSFRNTEVsZW1lbnQsIGV2ZW50TmFtZTogc3RyaW5nLCBjYWxsYmFjazogRnVuY3Rpb24sIGxvY2FsczogYW55KSB7XG4gICAgICAgIGlmIChldmVudE5hbWUgIT09ICdzdWJtaXQnKSB7XG4gICAgICAgICAgICBzdXBlci5oYW5kbGVFdmVudCh0aGlzLm5hdGl2ZUVsZW1lbnQsIGV2ZW50TmFtZSwgY2FsbGJhY2ssIGxvY2Fscyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZUZpZWxkU291cmNlKCkge1xuICAgICAgICBpZiAodGhpcy5mb3JtZGF0YXNvdXJjZSAmJiB0aGlzLmZvcm1kYXRhc291cmNlLmV4ZWN1dGUoRGF0YVNvdXJjZS5PcGVyYXRpb24uSVNfQVBJX0FXQVJFKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZm9ybWRhdGFzb3VyY2UgJiYgIXRoaXMuZm9ybWRhdGFzb3VyY2UudHdvV2F5QmluZGluZykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZm9ybUZpZWxkcy5mb3JFYWNoKGZvcm1GaWVsZCA9PiB7XG4gICAgICAgICAgICBmb3JtRmllbGQuc2V0Rm9ybVdpZGdldCgnZGF0YXZhbHVlc291cmNlJywgdGhpcy5mb3JtZGF0YXNvdXJjZSk7XG4gICAgICAgICAgICBmb3JtRmllbGQuc2V0Rm9ybVdpZGdldCgnYmluZGRhdGF2YWx1ZScsIGAke3RoaXMuYmluZGZvcm1kYXRhfS4ke2Zvcm1GaWVsZC5rZXl9YCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFRoaXMgbWV0aG9kIGxvb3BzIHRocm91Z2ggdGhlIGZvcm0gZmllbGRzIGFuZCBoaWdobGlnaHRzIHRoZSBpbnZhbGlkIGZpZWxkcyBieSBzZXR0aW5nIHN0YXRlIHRvIHRvdWNoZWRcbiAgICBoaWdobGlnaHRJbnZhbGlkRmllbGRzKCkge1xuICAgICAgICBzZXRUb3VjaGVkU3RhdGUodGhpcywgdGhpcy5uZ2Zvcm0sICcnKTtcbiAgICB9XG5cbiAgICAvLyBEaXNhYmxlIHRoZSBmb3JtIHN1Ym1pdCBpZiBmb3JtIGlzIGluIGludmFsaWQgc3RhdGUuIEhpZ2hsaWdodCBhbGwgdGhlIGludmFsaWQgZmllbGRzIGlmIHZhbGlkYXRpb24gdHlwZSBpcyBkZWZhdWx0XG4gICAgdmFsaWRhdGVGaWVsZHNPblN1Ym1pdCgpIHtcbiAgICAgICAgdGhpcy5zZXRWYWxpZGF0aW9uTXNncygpO1xuICAgICAgICAvLyBEaXNhYmxlIHRoZSBmb3JtIHN1Ym1pdCBpZiBmb3JtIGlzIGluIGludmFsaWQgc3RhdGUuIEZvciBkZWxldGUgb3BlcmF0aW9uLCBkbyBub3QgY2hlY2sgdGhlIHZhbGlkYXRpb24uXG4gICAgICAgIGlmICh0aGlzLm9wZXJhdGlvblR5cGUgIT09ICdkZWxldGUnICYmICh0aGlzLnZhbGlkYXRpb250eXBlID09PSAnaHRtbCcgfHwgdGhpcy52YWxpZGF0aW9udHlwZSA9PT0gJ2RlZmF1bHQnKVxuICAgICAgICAgICAgICAgICYmIHRoaXMubmdmb3JtICYmIHRoaXMubmdmb3JtLmludmFsaWQpIHtcblxuICAgICAgICAgICAgaWYgKHRoaXMubmdmb3JtLmludmFsaWQpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy52YWxpZGF0aW9udHlwZSA9PT0gJ2RlZmF1bHQnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGlnaGxpZ2h0SW52YWxpZEZpZWxkcygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBGaW5kIHRoZSBmaXJzdCBpbnZhbGlkIHVudG9jaGVkIGVsZW1lbnQgYW5kIHNldCBpdCB0byB0b3VjaGVkLlxuICAgICAgICAgICAgICAgIC8vIFNhZmFyaSBkb2VzIG5vdCBmb3JtIHZhbGlkYXRpb25zLiB0aGlzIHdpbGwgZW5zdXJlIHRoYXQgZXJyb3IgaXMgc2hvd24gZm9yIHVzZXJcbiAgICAgICAgICAgICAgICBjb25zdCBlbGVGb3JtID0gZmluZEludmFsaWRFbGVtZW50KHRoaXMuJGVsZW1lbnQsIHRoaXMubmdmb3JtKTtcbiAgICAgICAgICAgICAgICBjb25zdCAkaW52YWxpZEZvcm0gPSBlbGVGb3JtLm5nRm9ybTtcbiAgICAgICAgICAgICAgICBsZXQgJGludmFsaWRFbGUgID0gZWxlRm9ybS4kZWxlO1xuICAgICAgICAgICAgICAgICRpbnZhbGlkRWxlID0gJGludmFsaWRFbGUucGFyZW50KCkuZmluZCgnW2ZvY3VzLXRhcmdldF0nKTtcbiAgICAgICAgICAgICAgICBpZiAoJGludmFsaWRFbGUubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIG9uIHNhdmUgY2xpY2sgaW4gcGFnZSBsYXlvdXQgbGl2ZWZvcm0sIGZvY3VzIG9mIGF1dG9jb21wbGV0ZSB3aWRnZXQgb3BlbnMgZnVsbC1zY3JlZW4gc2VhcmNoLlxuICAgICAgICAgICAgICAgICAgICBpZiAoISRpbnZhbGlkRWxlLmhhc0NsYXNzKCdhcHAtc2VhcmNoLWlucHV0JykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICRpbnZhbGlkRWxlLmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmdFbGUgPSAkaW52YWxpZEZvcm0gJiYgJGludmFsaWRGb3JtLmNvbnRyb2xzWyRpbnZhbGlkRWxlLmF0dHIoJ2Zvcm1Db250cm9sTmFtZScpIHx8ICRpbnZhbGlkRWxlLmF0dHIoJ25hbWUnKV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChuZ0VsZSAmJiBuZ0VsZS5tYXJrQXNUb3VjaGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZ0VsZS5tYXJrQXNUb3VjaGVkKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgJGFwcERpZ2VzdCgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIG9uUHJvcGVydHlDaGFuZ2Uoa2V5LCBudiwgb3Y/KSB7XG4gICAgICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICAgICAgICBjYXNlICdjYXB0aW9uYWxpZ24nOlxuICAgICAgICAgICAgICAgIHRoaXMuY2FwdGlvbkFsaWduQ2xhc3MgPSAnYWxpZ24tJyArIG52O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnY2FwdGlvbnBvc2l0aW9uJzpcbiAgICAgICAgICAgICAgICB0aGlzLnNldExheW91dENvbmZpZygpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnY2FwdGlvbndpZHRoJzpcbiAgICAgICAgICAgICAgICB0aGlzLnNldExheW91dENvbmZpZygpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnY2FwdGlvbnNpemUnOlxuICAgICAgICAgICAgICAgIHRoaXMuY2FwdGlvbnNpemUgPSBudjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ25vdmFsaWRhdGUnOlxuICAgICAgICAgICAgICAgIC8vICBTZXQgdmFsaWRhdGlvbiB0eXBlIGJhc2VkIG9uIHRoZSBub3ZhbGlkYXRlIHByb3BlcnR5XG4gICAgICAgICAgICAgICAgdGhpcy53aWRnZXQudmFsaWRhdGlvbnR5cGUgPSAobnYgPT09IHRydWUgfHwgbnYgPT09ICd0cnVlJykgPyAnbm9uZScgOiAnZGVmYXVsdCc7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdmb3JtZGF0YSc6XG4gICAgICAgICAgICAgICAgLy8gRm9yIGxpdmVsaXN0IHdoZW4gbXVsdGlzZWxlY3QgaXMgZW5hYmxlZCwgZm9ybWRhdGEgd2lsbCBiZSBhcnJheSBvZiBvYmplY3RzLiBJbiB0aGlzIGNhc2UgY29uc2lkZXIgdGhlIGxhc3Qgb2JqZWN0IGFzIGZvcm1kYXRhLlxuICAgICAgICAgICAgICAgIGlmIChfLmlzRXF1YWwobnYsIG92KSkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXy5pc0FycmF5KG52KSA/IHRoaXMuc2V0Rm9ybURhdGEoXy5sYXN0KG52KSkgOiB0aGlzLnNldEZvcm1EYXRhKG52KTtcbiAgICAgICAgICAgICAgICAvLyBpZiBkYXRhc2V0IG9uIHRoZSBmb3JtRmllbGRzIGFyZSBub3Qgc2V0IGFzIHRoZSBkYXRhc291cmNlQ2hhbmdlIGlzIHRyaWdnZXJlZCBiZWZvcmUgdGhlIGZvcm1GaWVsZHMgYXJlIHJlZ2lzdGVyZWQuXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzRGF0YVNvdXJjZVVwZGF0ZWQgJiYgdGhpcy5kYXRhc291cmNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25EYXRhU291cmNlQ2hhbmdlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZGVmYXVsdG1vZGUnOlxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc0xheW91dERpYWxvZykge1xuICAgICAgICAgICAgICAgICAgICBpZiAobnYgJiYgbnYgPT09ICdFZGl0Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVNb2RlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlTW9kZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNVcGRhdGVNb2RlID0gdGhpcy51cGRhdGVNb2RlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2RhdGFzb3VyY2UnOlxuICAgICAgICAgICAgICAgIHRoaXMub25EYXRhU291cmNlQ2hhbmdlKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdmb3JtZGF0YXNvdXJjZSc6XG4gICAgICAgICAgICAgICAgdGhpcy5vbkZvcm1EYXRhU291cmNlQ2hhbmdlKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdtZXRhZGF0YSc6XG4gICAgICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZUZvcm1GaWVsZHMoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2RhdGFzZXQnOlxuICAgICAgICAgICAgICAgIGNvbnN0IGZvcm1GaWVsZHMgPSB0aGlzLmdldEZvcm1GaWVsZHMoKTtcbiAgICAgICAgICAgICAgICBmb3JtRmllbGRzLmZvckVhY2goZmllbGQgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBub3RpZnlpbmcgdGhlIGRhdGFzZXQgY2hhbmdlIHRvIHRoZSBmb3JtLWZpZWxkIHdpZGdldC5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFmaWVsZC5pc0RhdGFTZXRCb3VuZCAmJiBfLmdldChmaWVsZC5mb3JtV2lkZ2V0LCAnZGF0YXNldCQnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQuZm9ybVdpZGdldC5kYXRhc2V0JC5uZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgc3VwZXIub25Qcm9wZXJ0eUNoYW5nZShrZXksIG52LCBvdik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBFdmVudCBjYWxsYmFja3Mgb24gc3VjY2Vzcy9lcnJvclxuICAgIG9uUmVzdWx0Q2IoZGF0YSwgc3RhdHVzLCBldmVudD8pIHtcbiAgICAgICAgY29uc3QgcGFyYW1zID0geyRldmVudDogZXZlbnQsICRkYXRhOiBkYXRhLCAkb3BlcmF0aW9uOiB0aGlzLm9wZXJhdGlvblR5cGV9O1xuICAgICAgICAvLyB3aGV0aGVyIHNlcnZpY2UgY2FsbCBzdWNjZXNzIG9yIGZhaWx1cmUgY2FsbCB0aGlzIG1ldGhvZFxuICAgICAgICB0aGlzLmludm9rZUV2ZW50Q2FsbGJhY2soJ3Jlc3VsdCcsIHBhcmFtcyk7XG4gICAgICAgIGlmIChzdGF0dXMpIHtcbiAgICAgICAgICAgIC8vIGlmIHNlcnZpY2UgY2FsbCBpcyBzdWNjZXNzIGNhbGwgdGhpcyBtZXRob2RcbiAgICAgICAgICAgIHRoaXMuaW52b2tlRXZlbnRDYWxsYmFjaygnc3VjY2VzcycsIHBhcmFtcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBpZiBzZXJ2aWNlIGNhbGwgZmFpbHMgY2FsbCB0aGlzIG1ldGhvZFxuICAgICAgICAgICAgdGhpcy5pbnZva2VFdmVudENhbGxiYWNrKCdlcnJvcicsIHBhcmFtcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBEaXNwbGF5IG9yIGhpZGUgdGhlIGlubGluZSBtZXNzYWdlLyB0b2FzdGVyXG4gICAgdG9nZ2xlTWVzc2FnZShzaG93OiBib29sZWFuLCBtc2c/OiBzdHJpbmcsIHR5cGU/OiBzdHJpbmcsIGhlYWRlcj86IHN0cmluZykge1xuICAgICAgICBsZXQgdGVtcGxhdGU7XG4gICAgICAgIGlmIChzaG93ICYmIG1zZykge1xuICAgICAgICAgICAgdGVtcGxhdGUgPSAodHlwZSA9PT0gJ2Vycm9yJyAmJiB0aGlzLmVycm9ybWVzc2FnZSkgPyB0aGlzLmVycm9ybWVzc2FnZSA6IG1zZztcbiAgICAgICAgICAgIGlmICh0aGlzLm1lc3NhZ2VsYXlvdXQgPT09ICdJbmxpbmUnKSB7XG4gICAgICAgICAgICAgICAgdGVtcGxhdGUgPSB0aGlzLmNoZWNrQXBwU2VydmljZUVycm9yTXNnKHR5cGUpIHx8IHRlbXBsYXRlO1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhdHVzTWVzc2FnZSA9IHsnY2FwdGlvbic6IHRlbXBsYXRlIHx8ICcnLCB0eXBlOiB0eXBlfTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5tZXNzYWdlUmVmKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVJlZi5zaG93TWVzc2FnZSh0aGlzLnN0YXR1c01lc3NhZ2UuY2FwdGlvbiwgdGhpcy5zdGF0dXNNZXNzYWdlLnR5cGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyB3aGVuIG1lc3NhZ2UgbGF5b3V0IGlzIGlubGluZSBvbiBzYXZlLCBzY3JvbGwgdGhlIHZpZXcgdG8gdG9wIG9mIHRoZSBmb3JtIHRvIHNlZSB0aGUgc3RhdHVzIG9mIHRoZSBvcGVyYXRpb25cbiAgICAgICAgICAgICAgICBpZiAoIWlzRWxlbWVudEluVmlld3BvcnQodGhpcy4kZWxlbWVudFswXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgc2Nyb2xsVG9FbGVtZW50KHRoaXMuJGVsZW1lbnRbMF0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hcHAubm90aWZ5QXBwKHRlbXBsYXRlLCB0eXBlLCBoZWFkZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zdGF0dXNNZXNzYWdlLmNhcHRpb24gPSAnJztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGlmIHRoZXJlIGlzIGFuIEFwcC5vblNlcnZpY2VFcnJvciBoYW5kbGVyIGZvciB0aGUgYXBwLCB0aGF0IG1lc3NhZ2Ugc2hvdWxkIGJlIHVzZWQgaW5zdGVhZCBvZiBzZXJ2ZXIgcmV0dXJuZWQgZXJyb3IgbWVzc2FnZVxuICAgIGNoZWNrQXBwU2VydmljZUVycm9yTXNnKHR5cGUpIHtcbiAgICAgICAgY29uc3Qgbm90aWZpY2F0aW9uQWN0aW9uID0gXy5nZXQodGhpcy5hcHAsICdBY3Rpb25zLmFwcE5vdGlmaWNhdGlvbicpO1xuICAgICAgICBpZiAobm90aWZpY2F0aW9uQWN0aW9uICYmIHR5cGUgPT09ICdlcnJvcicpIHtcbiAgICAgICAgICAgIHJldHVybiBub3RpZmljYXRpb25BY3Rpb24uZ2V0TWVzc2FnZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBIaWRlIHRoZSBpbmxpbmUgbWVzc2FnZS8gdG9hc3RlclxuICAgIGNsZWFyTWVzc2FnZSgpIHtcbiAgICAgICAgdGhpcy50b2dnbGVNZXNzYWdlKGZhbHNlKTtcbiAgICB9XG5cbiAgICAvLyBTZXQgdGhlIGNsYXNzZXMgb24gdGhlIGZvcm0gYmFzZWQgb24gdGhlIGNhcHRpb25wb3NpdGlvbiBhbmQgY2FwdGlvbndpZHRoIHByb3BlcnRpZXNcbiAgICBwcml2YXRlIHNldExheW91dENvbmZpZygpIHtcbiAgICAgICAgbGV0IGxheW91dENvbmZpZztcbiAgICAgICAgbGF5b3V0Q29uZmlnID0gZ2V0RmllbGRMYXlvdXRDb25maWcodGhpcy5jYXB0aW9ud2lkdGgsIHRoaXMuY2FwdGlvbnBvc2l0aW9uLCBfLmdldCh0aGlzLmFwcC5zZWxlY3RlZFZpZXdQb3J0LCAnb3MnKSk7XG4gICAgICAgIHRoaXMuX3dpZGdldENsYXNzID0gbGF5b3V0Q29uZmlnLndpZGdldENscztcbiAgICAgICAgdGhpcy5fY2FwdGlvbkNsYXNzID0gbGF5b3V0Q29uZmlnLmNhcHRpb25DbHM7XG5cbiAgICAgICAgJGFwcERpZ2VzdCgpO1xuICAgIH1cblxuICAgIHJlZ2lzdGVyRm9ybVdpZGdldCh3aWRnZXQpIHtcbiAgICAgICAgY29uc3QgbmFtZSA9IHdpZGdldC5uYW1lIHx8IHdpZGdldC5rZXk7XG4gICAgICAgIHRoaXMuZm9ybVdpZGdldHNbbmFtZV0gPSB3aWRnZXQ7XG4gICAgfVxuXG4gICAgcmVnaXN0ZXJGb3JtRmllbGRzKGZvcm1GaWVsZCkge1xuICAgICAgICBjb25zdCBmaWVsZENvdW50ID0gdGhpcy5mb3JtRmllbGRzLnB1c2goZm9ybUZpZWxkKTtcbiAgICAgICAgdGhpcy5mb3JtZmllbGRzW2Zvcm1GaWVsZC5rZXldID0gZm9ybUZpZWxkO1xuICAgICAgICB0aGlzLnJlZ2lzdGVyRm9ybVdpZGdldChmb3JtRmllbGQpO1xuICAgICAgICB0aGlzLl9kZWJvdW5jZWRVcGRhdGVGaWVsZFNvdXJjZSgpO1xuICAgICAgICBpZiAodGhpcy5wYXJlbnRGb3JtKSB7XG4gICAgICAgICAgICB0aGlzLnBhcmVudEZvcm0uZm9ybUZpZWxkcy5wdXNoKGZvcm1GaWVsZCk7XG4gICAgICAgICAgICB0aGlzLnBhcmVudEZvcm0uZm9ybWZpZWxkc1tmb3JtRmllbGQua2V5XSA9IGZvcm1GaWVsZDtcbiAgICAgICAgICAgIC8vIGlubmVyIGZvcm1maWVsZHMgYXJlIHB1c2hlZCB0byBwYXJlbnRGb3JtLCBwYXNzaW5nIGN1cnJlbnQgaW5uZXJGb3JtJ3MgZm9ybWRhdGEgdG8gc2V0IGlubmVyRm9ybWRhdGEgdG8gdGhlc2UgaW5uZXJGb3JtRmllbGRzXG4gICAgICAgICAgICB0aGlzLnBhcmVudEZvcm0uc2V0Rm9ybURhdGEodGhpcy5wYXJlbnRGb3JtLmZvcm1kYXRhLCB0aGlzLmZvcm1GaWVsZHMsIHRoaXMuZm9ybWRhdGEgfHwge30pO1xuICAgICAgICB9XG4gICAgICAgIC8vIFdNUy0xODk2NzogQXBwbHlpbmcgZm9ybWFkYXRhIGFmdGVyIGZvcm1maWVsZHMgYXJlIHJlYWR5XG4gICAgICAgIGlmIChmaWVsZENvdW50ID09PSB0aGlzLm51bWJlck9mRmllbGRzICYmICFfLmlzRW1wdHkodGhpcy5mb3JtZGF0YSkpIHtcbiAgICAgICAgICAgIHRoaXMub25EYXRhU291cmNlQ2hhbmdlKCk7XG4gICAgICAgICAgICBfLmlzQXJyYXkodGhpcy5mb3JtZGF0YSkgPyB0aGlzLnNldEZvcm1EYXRhKF8ubGFzdCh0aGlzLmZvcm1kYXRhKSkgOiB0aGlzLnNldEZvcm1EYXRhKHRoaXMuZm9ybWRhdGEpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVnaXN0ZXJBY3Rpb25zKGZvcm1BY3Rpb24pIHtcbiAgICAgICAgdGhpcy5idXR0b25BcnJheS5wdXNoKGZvcm1BY3Rpb24pO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSB0aGUgZGF0YW91dHB1dCB3aGVuZXZlciB0aGVyZSBpcyBhIGNoYW5nZSBpbiBpbnNpZGUgZm9ybSB3aWRnZXQgdmFsdWVcbiAgICB1cGRhdGVGb3JtRGF0YU91dHB1dChkYXRhT2JqZWN0KSB7XG4gICAgICAgIC8vIFNldCB0aGUgdmFsdWVzIG9mIHRoZSB3aWRnZXRzIGluc2lkZSB0aGUgbGl2ZSBmb3JtIChvdGhlciB0aGFuIGZvcm0gZmllbGRzKSBpbiBmb3JtIGRhdGFcbiAgICAgICAgXy5mb3JFYWNoKHRoaXMubmdmb3JtLnZhbHVlLCAodmFsLCBrZXkpID0+IHtcbiAgICAgICAgICAgIGlmICghXy5maW5kKHRoaXMuZm9ybUZpZWxkcywge2tleX0pKSB7XG4gICAgICAgICAgICAgICAgZGF0YU9iamVjdFtrZXldID0gdmFsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5kYXRhb3V0cHV0ID0gZGF0YU9iamVjdDtcbiAgICB9XG5cbiAgICAvLyBDb25zdHJ1Y3QgdGhlIGRhdGEgb2JqZWN0IG1lcmdpbmcgdGhlIGZvcm0gZmllbGRzIGFuZCBjdXN0b20gd2lkZ2V0cyBkYXRhXG4gICAgY29uc3RydWN0RGF0YU9iamVjdCgpIHtcbiAgICAgICAgY29uc3QgZm9ybURhdGEgICAgID0ge307XG4gICAgICAgIGNvbnN0IGZvcm1GaWVsZHMgPSB0aGlzLmdldEZvcm1GaWVsZHMoKTtcbiAgICAgICAgLy8gR2V0IGFsbCBmb3JtIGZpZWxkcyBhbmQgcHJlcGFyZSBmb3JtIGRhdGEgYXMga2V5IHZhbHVlIHBhaXJzXG4gICAgICAgIGZvcm1GaWVsZHMuZm9yRWFjaChmaWVsZCA9PiB7XG4gICAgICAgICAgICBsZXQgZmllbGROYW1lLFxuICAgICAgICAgICAgICAgIGZpZWxkVmFsdWU7XG4gICAgICAgICAgICBmaWVsZFZhbHVlID0gZmllbGQuZGF0YXZhbHVlIHx8IGZpZWxkLl9jb250cm9sLnZhbHVlO1xuICAgICAgICAgICAgZmllbGRWYWx1ZSA9IChmaWVsZFZhbHVlID09PSBudWxsIHx8IGZpZWxkVmFsdWUgPT09ICcnKSA/IHVuZGVmaW5lZCA6IGZpZWxkVmFsdWU7XG5cbiAgICAgICAgICAgIGlmIChmaWVsZC50eXBlID09PSAnZmlsZScpIHtcbiAgICAgICAgICAgICAgICBmaWVsZFZhbHVlID0gZ2V0RmlsZXModGhpcy5uYW1lLCBmaWVsZC5rZXkgKyAnX2Zvcm1XaWRnZXQnLCBmaWVsZC5tdWx0aXBsZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZpZWxkTmFtZSA9IGZpZWxkLmtleSB8fCBmaWVsZC50YXJnZXQgfHwgZmllbGQubmFtZTtcblxuICAgICAgICAgICAgLy8gb24gY3VycmVudCBGb3JtLCB3aGVuIGZpZWxkIGlzIGlubmVyRm9ybSBmaWVsZCB0aGVuIHdlIGdyb3VwIHRoZXNlIGZpZWxkcyB1bmRlciBuZXcgb2JqZWN0IHVzaW5nIGZvcm1Hcm91cE5hbWUgYXMga2V5XG4gICAgICAgICAgICAvLyBGb3Igc3VwcG9zZSwgYXBwbGljYW50TmFtZSwgYXBwbGljYW50SUQgYXJlIGZvcm1maWVsZHMgaW4gY3VycmVudEZvcm1cbiAgICAgICAgICAgIC8vIFRoaXMgZm9ybSBpcyBoYXZpbmcgaW5uZXJmb3JtIGkuZS4gYWRkcmVzcywgdGhlc2UgZmllbGRzIGFyZSBsaXN0ZWQgYXNcbiAgICAgICAgICAgIC8vIHtcImFwcGxpY2FudE5hbWVcIjogXCJcIiwgXCJhcHBsaWNhbnRJRFwiOiBcIlwiLCBcImFkZHJlc3NcIjoge1wic3RyZWV0XCI6IFwiXCJ9fVxuICAgICAgICAgICAgaWYgKGZpZWxkLmZvcm0ud2lkZ2V0SWQgIT09IHRoaXMud2lkZ2V0SWQgJiYgZmllbGQuZm9ybS5mb3JtR3JvdXBOYW1lKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmQgPSBfLmdldChmb3JtRGF0YSwgZmllbGQuZm9ybS5mb3JtR3JvdXBOYW1lLCB7fSk7XG4gICAgICAgICAgICAgICAgZmRbZmllbGROYW1lXSA9IGZpZWxkVmFsdWU7XG4gICAgICAgICAgICAgICAgXy5zZXQoZm9ybURhdGEsIGZpZWxkLmZvcm0uZm9ybUdyb3VwTmFtZSwgZmQpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICgodHlwZW9mIGZpZWxkLmZvcm0uZm9ybUFycmF5SW5kZXggPT09ICdudW1iZXInKSAmJiBmaWVsZC5mb3JtLmlzUGFyZW50TGlzdCAmJiAhdGhpcy5wYXJlbnRGb3JtKSB7IC8vIEZpeCBmb3IgW1dNUy0yNTgwNl06IHVzZSBmb3JtQXJyYXlJbmRleCBvbmx5IGlmIGZvcm0gaGFzIGEgcGFyZW50IGZvcm1cbiAgICAgICAgICAgICAgICAvLyBzZXR0aW5nIGZvcm1kYXRhIGJhc2VkIG9uIGZvcm1BcnJheUluZGV4XG4gICAgICAgICAgICAgICAgY29uc3QgZmQgPSBfLmdldChmb3JtRGF0YSwgZmllbGQuZm9ybS5wYXJlbnRMaXN0Lm5hbWUsIFtdKTtcbiAgICAgICAgICAgICAgICBmZFtmaWVsZC5mb3JtLmZvcm1BcnJheUluZGV4XSA9IGZkW2ZpZWxkLmZvcm0uZm9ybUFycmF5SW5kZXhdIHx8IHt9O1xuICAgICAgICAgICAgICAgIGZkW2ZpZWxkLmZvcm0uZm9ybUFycmF5SW5kZXhdW2ZpZWxkTmFtZV0gPSBmaWVsZFZhbHVlO1xuICAgICAgICAgICAgICAgIF8uc2V0KGZvcm1EYXRhLCBmaWVsZC5mb3JtLnBhcmVudExpc3QubmFtZSwgZmQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBJbiBjYXNlIG9mIHVwZGF0ZSB0aGUgZmllbGQgd2lsbCBiZSBhbHJlYWR5IHByZXNlbnQgaW4gZm9ybSBkYXRhXG4gICAgICAgICAgICAgICAgXy5zZXQoZm9ybURhdGEsIGZpZWxkTmFtZSwgZmllbGRWYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnVwZGF0ZUZvcm1EYXRhT3V0cHV0KGZvcm1EYXRhKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YW91dHB1dDtcbiAgICB9XG5cbiAgICB1cGRhdGVEYXRhT3V0cHV0KCkge1xuICAgICAgICB0aGlzLmNvbnN0cnVjdERhdGFPYmplY3QoKTtcbiAgICAgICAgaWYgKHRoaXMubmdmb3JtLnRvdWNoZWQpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0VmFsaWRhdGlvbk1zZ3ModHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBGb3JtRmllbGRzIHdpbGwgY29udGFpbiBhbGwgdGhlIGZpZWxkcyBpbiBwYXJlbnQgYW5kIGlubmVyIGZvcm0gYWxzby5cbiAgICAvLyBUaGlzIHJldHVybnMgdGhlIGZvcm1GaWVsZHMgaW4gdGhlIGZvcm0gYmFzZWQgb24gdGhlIGZvcm0gbmFtZS5cbiAgICBnZXRGb3JtRmllbGRzKCkge1xuICAgICAgICByZXR1cm4gXy5maWx0ZXIodGhpcy5mb3JtRmllbGRzLCBmb3JtRmllbGQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGZvcm1GaWVsZC5mb3JtLm5hbWUgPT09IHRoaXMubmFtZTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc2V0RmllbGRWYWx1ZShmaWVsZCwgZGF0YSwgaW5uZXJGb3JtZGF0YT8pIHtcbiAgICAgICAgY29uc3Qga2V5ID0gZmllbGQua2V5IHx8IGZpZWxkLm5hbWU7XG4gICAgICAgIC8vIGlmIGN1c3RvbWZpZWxkIHBhcmFtIHZhbHVlIGlzIG5vdCBpbiB0aGUgZm9ybWRhdGEgdGhlbiBkbyBub3QgYXNzaWduIGZpZWxkIHZhbHVlXG4gICAgICAgIC8vIGFzIGl0IGNhbiBjb250YWluIGRlZmF1bHQgdmFsdWUgd2hpY2ggd2lsbCBhZ2FpbiBiZSBvdmVycmlkZGVuIGJ5IHVuZGVmaW5lZC5cbiAgICAgICAgY29uc3QgZmQgPSBpbm5lckZvcm1kYXRhID8gaW5uZXJGb3JtZGF0YSA6IGRhdGE7XG4gICAgICAgIGlmIChmZCkge1xuICAgICAgICAgICAgaWYgKGZkLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgICAgICBmaWVsZC52YWx1ZSA9ICBfLmdldChmZCwga2V5KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoXy5pbmNsdWRlcyhrZXksICcuJykpIHtcbiAgICAgICAgICAgICAgICAvLyBrZXkgY29udGFpbnMgJy4nIHdoZW4gbWFwcGluZyB0aGUgZmllbGRzIHRvIGNoaWxkIHJlZmVyZW5jZSBpLmUuIGNoaWxkQ29sIGlzIGhhdmluZyBrZXkgYXMgXCJwYXJlbnQuY2hpbGRDb2xcIlxuICAgICAgICAgICAgICAgIGlmIChmZC5oYXNPd25Qcm9wZXJ0eShfLnNwbGl0KGtleSwgJy4nKVswXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgZmllbGQudmFsdWUgPSAgXy5nZXQoZmQsIGtleSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gV01TLTE4OTA2OiBGb3IgZGVmYXVsdCB2YWx1ZSwgZG8gbm90IG1hcmsgdGhlIGZvcm0gYXMgZGlydHkuXG4gICAgICAgICAgICBpZiAodGhpcy5kaXJ0eSAmJiAhdGhpcy5fdHJpZ2dlcmVkQnlVc2VyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5tYXJrQXNQcmlzdGluZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZvcm1Hcm91cE5hbWUgPSBmaWVsZC5mb3JtLmZvcm1Hcm91cE5hbWU7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBpZiBmb3JtR3JvdXBOYW1lIGlzIGRlZmluZWQgd2hpY2ggbWVhbnMgZmllbGQgaXMgaW5zaWRlIHRoZSBpbm5lciBmb3JtXG4gICAgICAgICAqIHRoZW4gc2V0IHRoZSBmb3JtZGF0YSBvbiB0aGUgZmllbGQncyBmb3JtIHVzaW5nIGZvcm1Hcm91cE5hbWVcbiAgICAgICAgICovXG4gICAgICAgIGlmIChmb3JtR3JvdXBOYW1lICYmIF8uZ2V0KGRhdGEsIGZvcm1Hcm91cE5hbWUpKSB7XG4gICAgICAgICAgICB0aGlzLnNldEZvcm1EYXRhLmNhbGwoZmllbGQuZm9ybSwgZGF0YVtmb3JtR3JvdXBOYW1lXSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gaWYgZm9ybWRhdGEgaXMgYXNzaWduZWQgbGF0ZXIgdGhlbiBvbiBwcm9wZXJ0eUNoYW5nZUhhbmRsZXIsIGV2ZW4gaW5uZXIgZm9ybXMgZGF0YSBhbHNvIG5lZWRzIHRvIGJlIHVwZGF0ZWQuXG4gICAgICAgIGlmIChfLmdldChmaWVsZC5mb3JtLCAncGFyZW50Rm9ybUFycmF5JykpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0Rm9ybURhdGFGcm9tUGFyZW50Rm9ybURhdGEuY2FsbChmaWVsZC5mb3JtLCBkYXRhKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNldEZvcm1EYXRhKGRhdGEsIGlubmVyRm9ybUZpZWxkcz8sIGlubmVyRm9ybWRhdGE/KSB7XG4gICAgICAgIC8vIHdoZXJlYXMgZm9ybUZpZWxkcyBleHBsaWNpdGx5IHBhc3NlZCBjYW4gY29udGFpbiBpbm5lcmZvcm0gZmllbGRzIGFsc28uXG4gICAgICAgIGNvbnN0IGZvcm1GaWVsZHMgPSBpbm5lckZvcm1GaWVsZHMgfHwgdGhpcy5mb3JtRmllbGRzO1xuICAgICAgICBmb3JtRmllbGRzLmZvckVhY2goZmllbGQgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXRGaWVsZFZhbHVlKGZpZWxkLCBkYXRhLCBpbm5lckZvcm1kYXRhKTtcbiAgICAgICAgICAgIGlmIChmaWVsZC5maWVsZFZhbGlkYXRpb25zKSB7XG4gICAgICAgICAgICAgICAgZmllbGQuZmllbGRWYWxpZGF0aW9ucy5zZXRDdXN0b21WYWxpZGF0aW9uTWVzc2FnZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jb25zdHJ1Y3REYXRhT2JqZWN0KCk7XG4gICAgfVxuXG4gICAgcmVzZXRGb3JtU3RhdGUoKSB7XG4gICAgICAgIC8vIGNsZWFyaW5nIHRoZSB2YWxpZGF0aW9uTWVzc2FnZXMgb24gcmVzZXQuXG4gICAgICAgIGlmICh0aGlzLnZhbGlkYXRpb25NZXNzYWdlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VzID0gW107XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLm5nZm9ybSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubmdmb3JtLm1hcmtBc1VudG91Y2hlZCgpO1xuICAgICAgICB0aGlzLm5nZm9ybS5tYXJrQXNQcmlzdGluZSgpO1xuICAgIH1cblxuICAgIHJlc2V0KCkge1xuICAgICAgICB0aGlzLnJlc2V0Rm9ybVN0YXRlKCk7XG4gICAgICAgIHRoaXMuZm9ybUZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICAgICAgICAgIGZpZWxkLnZhbHVlID0gJyc7XG4gICAgICAgICAgICBpZiAoZmllbGQud2lkZ2V0dHlwZSA9PT0gJ3VwbG9hZCcgfHwgZmllbGQudHlwZSA9PT0gRGF0YVR5cGUuQkxPQikge1xuICAgICAgICAgICAgICAgIHRoaXMucmVzZXRGaWxlVXBsb2FkV2lkZ2V0KGZpZWxkLCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpZWxkLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignaW5wdXQnKT8ucmVtb3ZlQXR0cmlidXRlKCdhcmlhLWludmFsaWQnKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY29uc3RydWN0RGF0YU9iamVjdCgpO1xuICAgICAgICB0aGlzLmNsZWFyTWVzc2FnZSgpO1xuICAgIH1cblxuICAgIHNhdmVQcmV2Zm9ybUZpZWxkcygpIHtcbiAgICAgICAgdGhpcy5wcmV2Zm9ybUZpZWxkcyA9IGdldENsb25lZE9iamVjdCh0aGlzLmZvcm1GaWVsZHMubWFwKGZpZWxkID0+IHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgJ2tleSc6IGZpZWxkLmtleSxcbiAgICAgICAgICAgICAgICAndHlwZSc6IGZpZWxkLnR5cGUsXG4gICAgICAgICAgICAgICAgJ3dpZGdldHR5cGUnOiBmaWVsZC53aWRnZXR0eXBlLFxuICAgICAgICAgICAgICAgICdvdXRwdXRmb3JtYXQnOiBmaWVsZC5vdXRwdXRmb3JtYXQsXG4gICAgICAgICAgICAgICAgJ3ZhbHVlJzogZmllbGQudmFsdWVcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBzYXZlUHJldkRhdGFWYWx1ZXMoKSB7XG4gICAgICAgIHRoaXMucHJldkRhdGFWYWx1ZXMgPSB0aGlzLmZvcm1GaWVsZHMubWFwKChvYmopID0+IHtcbiAgICAgICAgICAgIHJldHVybiB7J2tleSc6IG9iai5rZXksICd2YWx1ZSc6IG9iai52YWx1ZX07XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHNldFJlYWRvbmx5RmllbGRzKCkge1xuICAgICAgICB0aGlzLmZvcm1GaWVsZHMuZm9yRWFjaChmaWVsZCA9PiB7XG4gICAgICAgICAgICBmaWVsZC5zZXRSZWFkT25seVN0YXRlKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHJlc2V0RmlsZVVwbG9hZFdpZGdldChmaWVsZCwgc2tpcFZhbHVlU2V0Pykge1xuICAgICAgICBjb25zdCAkZm9ybUVsZSA9IHRoaXMuJGVsZW1lbnQ7XG4gICAgICAgICRmb3JtRWxlLmZpbmQoJ1tuYW1lPVwiJyArIGZpZWxkLmtleSArICdfZm9ybVdpZGdldFwiXScpLnZhbCgnJyk7XG4gICAgICAgIGZpZWxkLl9jb250cm9sLnJlc2V0KCk7XG4gICAgICAgIGlmICghc2tpcFZhbHVlU2V0KSB7XG4gICAgICAgICAgICBmaWVsZC5ocmVmID0gJyc7XG4gICAgICAgICAgICBmaWVsZC52YWx1ZSA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBlbXB0eURhdGFNb2RlbCgpIHtcbiAgICAgICAgdGhpcy5mb3JtRmllbGRzLmZvckVhY2goZmllbGQgPT4ge1xuICAgICAgICAgICAgaWYgKGlzRGVmaW5lZChmaWVsZCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoZmllbGQudHlwZSA9PT0gRGF0YVR5cGUuQkxPQikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc2V0RmlsZVVwbG9hZFdpZGdldChmaWVsZCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZmllbGQuZGF0YXZhbHVlID0gJyc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzZXREZWZhdWx0VmFsdWVzKCkge1xuICAgICAgICB0aGlzLmZvcm1GaWVsZHMuZm9yRWFjaChmaWVsZCA9PiB7XG4gICAgICAgICAgICB0aGlzLm9uRmllbGREZWZhdWx0VmFsdWVDaGFuZ2UoZmllbGQsIGZpZWxkLmRlZmF1bHR2YWx1ZSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHNldE9wZXJhdGlvblR5cGUobW9kZSkge1xuICAgICAgICB0aGlzLm9wZXJhdGlvblR5cGUgPSBtb2RlIHx8ICdpbnNlcnQnO1xuICAgIH1cblxuICAgIG5ldygpIHtcbiAgICAgICAgdGhpcy5yZXNldEZvcm1TdGF0ZSgpO1xuICAgICAgICB0aGlzLm9wZXJhdGlvblR5cGUgPSBMaXZlX09wZXJhdGlvbnMuSU5TRVJUO1xuICAgICAgICB0aGlzLmNsZWFyTWVzc2FnZSgpO1xuICAgICAgICBpZiAodGhpcy5pc1NlbGVjdGVkKSB7XG4gICAgICAgICAgICB0aGlzLnNhdmVQcmV2Zm9ybUZpZWxkcygpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZW1wdHlEYXRhTW9kZWwoKTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNldERlZmF1bHRWYWx1ZXMoKTtcbiAgICAgICAgICAgIHRoaXMuc2F2ZVByZXZEYXRhVmFsdWVzKCk7XG4gICAgICAgICAgICB0aGlzLmNvbnN0cnVjdERhdGFPYmplY3QoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuaXNVcGRhdGVNb2RlID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBlZGl0KCkge1xuICAgICAgICB0aGlzLnJlc2V0Rm9ybVN0YXRlKCk7XG4gICAgICAgIHRoaXMuY2xlYXJNZXNzYWdlKCk7XG5cbiAgICAgICAgdGhpcy5vcGVyYXRpb25UeXBlID0gTGl2ZV9PcGVyYXRpb25zLlVQREFURTtcblxuICAgICAgICBpZiAodGhpcy5pc1NlbGVjdGVkKSB7XG4gICAgICAgICAgICB0aGlzLnNhdmVQcmV2Zm9ybUZpZWxkcygpO1xuICAgICAgICAgICAgdGhpcy5zYXZlUHJldkRhdGFWYWx1ZXMoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnByZXZEYXRhT2JqZWN0ID0gZ2V0Q2xvbmVkT2JqZWN0KHRoaXMuZm9ybWRhdGEgfHwge30pO1xuXG4gICAgICAgIHRoaXMuc2V0UmVhZG9ubHlGaWVsZHMoKTtcbiAgICAgICAgdGhpcy5pc1VwZGF0ZU1vZGUgPSB0cnVlO1xuXG4gICAgICAgICRhcHBEaWdlc3QoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHRyaWdnZXJXTUV2ZW50KGV2ZW50TmFtZSkge1xuICAgICAgICBjb25zdCB0YWJsZUlkID0gdGhpcy5uYXRpdmVFbGVtZW50LmdldEF0dHJpYnV0ZSgnZGVwZW5kc29udGFibGUnKTtcbiAgICAgICAgaWYgKCF0YWJsZUlkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgJGludm9rZVdhdGNoZXJzKHRydWUpO1xuICAgICAgICB0aGlzLmFwcC5ub3RpZnkoJ3dtLWV2ZW50Jywge2V2ZW50TmFtZSwgd2lkZ2V0TmFtZTogdGFibGVJZH0pO1xuICAgIH1cblxuICAgIHN1Ym1pdEZvcm0oJGV2ZW50KSB7XG4gICAgICAgIGxldCB0ZW1wbGF0ZSwgZm9ybURhdGEsIHJlc3VsdDtcbiAgICAgICAgY29uc3QgZGF0YVNvdXJjZSA9IHRoaXMuZGF0YXNvdXJjZTtcbiAgICAgICAgLy8gRGlzYWJsZSB0aGUgZm9ybSBzdWJtaXQgaWYgZm9ybSBpcyBpbiBpbnZhbGlkIHN0YXRlLlxuICAgICAgICBpZiAodGhpcy52YWxpZGF0ZUZpZWxkc09uU3VibWl0KCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvcm1EYXRhID0gZ2V0Q2xvbmVkT2JqZWN0KHRoaXMuY29uc3RydWN0RGF0YU9iamVjdCgpKTtcblxuICAgICAgICBjb25zdCBnZXRQYXJhbXMgPSAoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4geyRldmVudCwgJGZvcm1EYXRhOiBmb3JtRGF0YSwgJGRhdGE6IGZvcm1EYXRhfTtcbiAgICAgICAgfTtcblxuXG4gICAgICAgIGlmICh0aGlzLm9uQmVmb3JlU3VibWl0RXZ0KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pbnZva2VFdmVudENhbGxiYWNrKCdiZWZvcmVzdWJtaXQnLCBnZXRQYXJhbXMoKSkgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlc2V0Rm9ybVN0YXRlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJlc2V0Rm9ybVN0YXRlKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5vblN1Ym1pdEV2dCB8fCBkYXRhU291cmNlKSB7XG4gICAgICAgICAgICAvLyBJZiBvbiBzdWJtaXQgaXMgdGhlcmUgZXhlY3V0ZSBpdCBhbmQgaWYgaXQgcmV0dXJucyB0cnVlIGRvIHNlcnZpY2UgdmFyaWFibGUgaW52b2tlIGVsc2UgcmV0dXJuXG4gICAgICAgICAgICAvLyBJZiBpdHMgYSBzZXJ2aWNlIHZhcmlhYmxlIGNhbGwgc2V0SW5wdXQgYW5kIGFzc2lnbiBmb3JtIGRhdGEgYW5kIGludm9rZSB0aGUgc2VydmljZVxuICAgICAgICAgICAgaWYgKGRhdGFTb3VyY2UpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50UGFnZU51bSA9IGRhdGFTb3VyY2UucGFnaW5hdGlvbiAmJiBkYXRhU291cmNlLnBhZ2luYXRpb24ubnVtYmVyICsgMTtcbiAgICAgICAgICAgICAgICBjb25zdCBvcGVyYXRpb25UeXBlID0gdGhpcy5vcGVyYXRpb25UeXBlID8gdGhpcy5vcGVyYXRpb25UeXBlIDogJ2luc2VydCc7XG4gICAgICAgICAgICAgICAgcGVyZm9ybURhdGFPcGVyYXRpb24oZGF0YVNvdXJjZSwgZm9ybURhdGEsIHtvcGVyYXRpb25UeXBlOiBvcGVyYXRpb25UeXBlfSlcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4oKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhU291cmNlLmNhdGVnb3J5ID09PSAnd20uQ3J1ZFZhcmlhYmxlJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudHJpZ2dlcldNRXZlbnQoJ3Jlc2V0RWRpdE1vZGUnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGFzb3VyY2UuZXhlY3V0ZShEYXRhU291cmNlLk9wZXJhdGlvbi5MSVNUX1JFQ09SRFMsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NraXBUb2dnbGVTdGF0ZSc6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvcGVyYXRpb24nOiAnbGlzdCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwYWdlJzogY3VycmVudFBhZ2VOdW0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwcmV2ZW50TWlzc2luZ09wTXNnJzogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRpYWxvZ0lkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2xvc2VEaWFsb2coKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNEZWZpbmVkKGRhdGEuYm9keSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBnZXRWYWxpZEpTT04oZGF0YS5ib2R5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBpc0RlZmluZWQocmVzdWx0KSA/IHJlc3VsdCA6IGRhdGEuYm9keTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Jlc3VsdCc6IHJlc3VsdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3RhdHVzJzogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbWVzc2FnZSc6IHRoaXMucG9zdG1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnOiAnc3VjY2VzcydcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH0sIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUgPSB0aGlzLmVycm9ybWVzc2FnZSB8fCBlcnJvci5lcnJvciB8fCBlcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICRhcHBEaWdlc3QoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Jlc3VsdCc6IF8uZ2V0KGVycm9yLCAnZXJyb3InKSB8fCBlcnJvcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3RhdHVzJzogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21lc3NhZ2UnOiB0ZW1wbGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZSc6ICdlcnJvcidcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH0pLnRoZW4ocmVzcG9uc2UgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoKHJlc3BvbnNlLnR5cGUgPT09ICdlcnJvcicgJiYgIXRoaXMub25FcnJvcikgfHwgKHJlc3BvbnNlLnR5cGUgPT09ICdzdWNjZXNzJyAmJiAhdGhpcy5vblN1Y2Nlc3MpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRvZ2dsZU1lc3NhZ2UodHJ1ZSwgcmVzcG9uc2UubWVzc2FnZSwgcmVzcG9uc2UudHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnZva2VFdmVudENhbGxiYWNrKCdzdWJtaXQnLCBnZXRQYXJhbXMoKSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25SZXN1bHRDYihyZXNwb25zZS5yZXN1bHQsIHJlc3BvbnNlLnN0YXR1cywgJGV2ZW50KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbnZva2VFdmVudENhbGxiYWNrKCdzdWJtaXQnLCBnZXRQYXJhbXMoKSk7XG4gICAgICAgICAgICAgICAgdGhpcy5vblJlc3VsdENiKHt9LCB0cnVlLCAkZXZlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5vblJlc3VsdENiKHt9LCB0cnVlLCAkZXZlbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY2xvc2VEaWFsb2coKSB7XG4gICAgICAgIHRoaXMuZGlhbG9nU2VydmljZS5jbG9zZSh0aGlzLmRpYWxvZ0lkKTtcbiAgICB9XG5cbiAgICAvLyBNZXRob2QgdG8gc2hvdy9oaWRlIHRoZSBwYW5lbCBoZWFkZXIgb3IgZm9vdGVyIGJhc2VkIG9uIHRoZSBidXR0b25zXG4gICAgc2hvd0J1dHRvbnMocG9zaXRpb24pIHtcbiAgICAgICAgcmV0dXJuIF8uc29tZSh0aGlzLmJ1dHRvbkFycmF5LCBidG4gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIF8uaW5jbHVkZXMoYnRuLnBvc2l0aW9uLCBwb3NpdGlvbikgJiYgYnRuLnVwZGF0ZU1vZGUgPT09IHRoaXMuaXNVcGRhdGVNb2RlO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBFeHBhbmQgb3IgY29sbGFwc2UgdGhlIHBhbmVsXG4gICAgZXhwYW5kQ29sbGFwc2VQYW5lbCgpIHtcbiAgICAgICAgaWYgKHRoaXMuY29sbGFwc2libGUpIHtcbiAgICAgICAgICAgIC8vIGZsaXAgdGhlIGFjdGl2ZSBmbGFnXG4gICAgICAgICAgICB0aGlzLmV4cGFuZGVkID0gIXRoaXMuZXhwYW5kZWQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbkRhdGFTb3VyY2VVcGRhdGUocmVzcG9uc2UsIG5ld0Zvcm0sIHVwZGF0ZU1vZGUpIHtcbiAgICAgICAgaWYgKG5ld0Zvcm0pIHtcbiAgICAgICAgICAgIHRoaXMubmV3KCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNldEZvcm1EYXRhKHJlc3BvbnNlKTtcbiAgICAgICAgICAgIHRoaXMuY2xvc2VEaWFsb2coKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmlzVXBkYXRlTW9kZSA9IGlzRGVmaW5lZCh1cGRhdGVNb2RlKSA/IHVwZGF0ZU1vZGUgOiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIHRyYW52ZXJzZXMgdGhyb3VnaCB0aGUgcGFyZW50IGNvbnRhaW5pbmcgZm9ybWRhdGEgYW5kIHJldHVybnMgdGhlIHBhcmVudCBmb3JtZGF0YS5cbiAgICAgKiBAcGFyYW0gZm9ybSwgcmVwcmVzZW50cyB0aGUgY3VycmVudCBmb3JtIGluc3RhbmNlXG4gICAgICogQHJldHVybnMge2FueX1cbiAgICAgKi9cbiAgICBnZXROZWFyZXN0UGFyZW50Rm9ybURhdGEoZm9ybSkge1xuICAgICAgICBpZiAoIWZvcm0ucGFyZW50Rm9ybSkge1xuICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICB9XG4gICAgICAgIGlmICghZm9ybS5iaW5kZm9ybWRhdGEgJiYgXy5nZXQoZm9ybS5wYXJlbnRGb3JtLCAnZm9ybWRhdGEnKSAmJiAhXy5pc0VtcHR5KGZvcm0ucGFyZW50Rm9ybS5mb3JtZGF0YSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmb3JtLnBhcmVudEZvcm0uZm9ybWRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TmVhcmVzdFBhcmVudEZvcm1EYXRhKGZvcm0ucGFyZW50Rm9ybSk7XG4gICAgfVxuXG4gICAgc2V0Rm9ybURhdGFGcm9tUGFyZW50Rm9ybURhdGEoZm9ybWRhdGE6IGFueSkge1xuICAgICAgICBpZiAoXy5pc0VtcHR5KHRoaXMuZm9ybWRhdGEpICYmIHRoaXMucGFyZW50Rm9ybSAmJiBmb3JtZGF0YSkge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBJZiBmb3JtIGlzIGluc2lkZSBsaXN0LFxuICAgICAgICAgICAgICogMS4gZGlyZWN0bHkgYXBwbHlpbmcgdGhlIGZvcm1kYXRhIHRvIHRoZSBmb3JtQXJyYXkgdG8gdXBkYXRlIHRoZSBmb3JtZGF0YSBvbiBsaXN0IG9mIGZvcm1zIHVzaW5nIHBhdGNoVmFsdWUuXG4gICAgICAgICAgICAgKiAyLiBhbmQgYWxzbyBzZXR0aW5nIGluZGl2aWR1YWwgZm9ybWRhdGEgdG8gdGhlIGZvcm0gaW5zaWRlIGVhY2ggaXRlbSBiYXNlZCBvbiBmb3JtQXJyYXlJbmRleCwgd2hlbiBmb3JtIGlzIG5vdCBib3VuZCB0byBmb3JtZGF0YS5cbiAgICAgICAgICAgICAqIDMuIGV4cGxpY2l0bHkgaW52b2tpbmcgZm9ybWRhdGEgYXMgZm9ybUZpZWxkcyB3aWxsIGNvbnRhaW4gYWxsIHRoZSBmb3JtZmllbGRzIGluY2x1ZGluZyBpbm5lckZvcm0ncyBmaWVsZHNcbiAgICAgICAgICAgICAqIChpZiB3ZSBkbyBub3QgaW52b2tlIGV4cGxpY2l0bHkgdGhlbiBmb3JtRmllbGRzIHdpbGwganVzdCBjb250YWluIHRoZSBmaWVsZHMgaW5zaWRlIGN1cnJlbnQgZm9ybSBhbmQgbm90IGlubmVyIGZvcm0gZmllbGRzKVxuICAgICAgICAgICAgICogNC4gaWYgY2hpbGRGb3JtQXJyYXlEYXRhIGlzIG5vdCBhdmFpbGFibGUgd2Ugd2lsbCBjaGVjayBmb3IgaW5uZXIgZm9ybSBkYXRhIHVzaW5nIFwiZm9ybUdyb3VwTmFtZVwiIGFuZCB3aWxsIHNldCB0aGUgaW5uZXJmb3JtIGRhdGFcbiAgICAgICAgICAgICAqIElmIG5vdCBpbnNpZGUgbGlzdCwganVzdCBzZXQgdGhlIGZvcm1kYXRhIG9uIGFsbCB0aGUgZm9ybWZpZWxkcyBpbmNsdWRpbmcgaW5uZXJGb3JtIGZpZWxkc1xuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBpZiAodGhpcy5wYXJlbnRGb3JtQXJyYXkpIHtcbiAgICAgICAgICAgICAgICBsZXQgY2hpbGRGb3JtQXJyYXlEYXRhID0gXy5nZXQoZm9ybWRhdGEsIHRoaXMucGFyZW50TGlzdC5uYW1lKTtcbiAgICAgICAgICAgICAgICBpZiAoY2hpbGRGb3JtQXJyYXlEYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghXy5pc0FycmF5KGNoaWxkRm9ybUFycmF5RGF0YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkRm9ybUFycmF5RGF0YSA9IFtjaGlsZEZvcm1BcnJheURhdGFdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGFyZW50Rm9ybUFycmF5LnBhdGNoVmFsdWUoY2hpbGRGb3JtQXJyYXlEYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmJpbmRmb3JtZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtZGF0YSA9IGNoaWxkRm9ybUFycmF5RGF0YVt0aGlzLmZvcm1BcnJheUluZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEZvcm1EYXRhKHRoaXMuZm9ybWRhdGEpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc1BhcmVudExpc3QgJiYgdGhpcy5wYXJlbnRGb3JtLmZvcm1Hcm91cE5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyZW50Rm9ybURhdGEgPSBfLmdldChmb3JtZGF0YSwgdGhpcy5wYXJlbnRGb3JtLmZvcm1Hcm91cE5hbWUpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEZvcm1EYXRhRnJvbVBhcmVudEZvcm1EYXRhKHBhcmVudEZvcm1EYXRhKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0Rm9ybURhdGEoZm9ybWRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gT24gZm9ybSBkYXRhIHNvdXJjZSBjaGFuZ2UuIFRoaXMgbWV0aG9kIGlzIG92ZXJyaWRkZW4gYnkgbGl2ZSBmb3JtIGFuZCBsaXZlIGZpbHRlclxuICAgIG9uRGF0YVNvdXJjZUNoYW5nZSgpIHtcbiAgICAgICAgaWYgKF8uZ2V0KHRoaXMuZm9ybUZpZWxkcywgJ2xlbmd0aCcpICYmICF0aGlzLmJpbmRmb3JtZGF0YSkge1xuICAgICAgICAgICAgdGhpcy5pc0RhdGFTb3VyY2VVcGRhdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogZm9ybWRhdGEgb24gdGhlIHBhcmVudCBmb3JtIHdpbGwgYmUgc2V0IGJlZm9yZSB0aGUgaW5uZXIgZm9ybXMgYXJlIHJlbmRlcmVkLlxuICAgICAgICAgICAgICogSGVuY2UgaGFuZGxpbmcgZm9ybWRhdGEgb24gdGhlIGlubmVyRm9ybXMsIHdoaWNoIG1pZ2h0IGJlIHJlbmRlcmVkIHNsb3dseSAoc3VwcG9zZSBwcmVmYWIgd2l0aCBmb3JtKVxuICAgICAgICAgICAgICogc2V0dGluZyBpbm5lciBmb3JtJ3MgZm9ybWRhdGEgb2J0YWluZWQgZnJvbSBwYXJlbnQgZm9ybWRhdGFcbiAgICAgICAgICAgICAqIHRoaXMgYXBwbGllcyBvbmx5IHdoZW4gZm9ybWRhdGEgaXMgbm90IGdpdmVuIG9uIHRoZSBpbm5lciBmb3JtLlxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBjb25zdCBmb3JtZGF0YSA9IHRoaXMuZ2V0TmVhcmVzdFBhcmVudEZvcm1EYXRhKHRoaXMpO1xuICAgICAgICAgICAgdGhpcy5zZXRGb3JtRGF0YUZyb21QYXJlbnRGb3JtRGF0YShmb3JtZGF0YSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBPbiBmb3JtIGRhdGEgc291cmNlIGNoYW5nZS4gVGhpcyBtZXRob2QgaXMgb3ZlcnJpZGRlbiBieSBsaXZlIGZvcm0gYW5kIGxpdmUgZmlsdGVyXG4gICAgb25Gb3JtRGF0YVNvdXJjZUNoYW5nZSgpIHtcbiAgICAgICAgdGhpcy51cGRhdGVGaWVsZFNvdXJjZSgpO1xuICAgIH1cblxuICAgIC8vIE9uIGZvcm0gZmllbGQgZGVmYXVsdCB2YWx1ZSBjaGFuZ2UuIFRoaXMgbWV0aG9kIGlzIG92ZXJyaWRkZW4gYnkgbGl2ZSBmb3JtIGFuZCBsaXZlIGZpbHRlclxuICAgIG9uRmllbGREZWZhdWx0VmFsdWVDaGFuZ2UoZmllbGQsIG52KSB7XG4gICAgICAgIGZpZWxkLnZhbHVlID0gcGFyc2VWYWx1ZUJ5VHlwZShudiwgdW5kZWZpbmVkLCBmaWVsZC53aWRnZXR0eXBlLCBmaWVsZC50cmFpbGluZ3plcm8pO1xuICAgICAgICAvLyBXTVMtMjI0MzQ6IEZvciBkZWZhdWx0IHZhbHVlIHNldCBvbiBpbmRpdmlkdWFsIGZvcm0gZmllbGRzLCBkbyBub3QgbWFyayB0aGUgZm9ybSBhcyBkaXJ0eS5cbiAgICAgICAgaWYgKHRoaXMuZGlydHkgJiYgIXRoaXMuX3RyaWdnZXJlZEJ5VXNlcikge1xuICAgICAgICAgICAgdGhpcy5tYXJrQXNQcmlzdGluZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gT24gZm9ybSBmaWVsZCB2YWx1ZSBjaGFuZ2UuIFRoaXMgbWV0aG9kIGlzIG92ZXJyaWRkZW4gYnkgbGl2ZSBmb3JtIGFuZCBsaXZlIGZpbHRlclxuICAgIG9uRmllbGRWYWx1ZUNoYW5nZSgpIHtcbiAgICB9XG5cbiAgICAvLyBGdW5jdGlvbiB0byBnZW5lcmF0ZSBhbmQgY29tcGlsZSB0aGUgZm9ybSBmaWVsZHMgZnJvbSB0aGUgbWV0YWRhdGFcbiAgICBhc3luYyBnZW5lcmF0ZUZvcm1GaWVsZHMoKSB7XG4gICAgICAgIGxldCBub09mQ29sdW1ucztcbiAgICAgICAgbGV0ICRncmlkTGF5b3V0O1xuICAgICAgICAvLyBDaGVjayBpZiBncmlkIGxheW91dCBpcyBwcmVzZW50IG9yIG5vdCBmb3IgZmlyc3QgdGltZVxuICAgICAgICBpZiAoXy5pc1VuZGVmaW5lZCh0aGlzLl9pc0dyaWRMYXlvdXRQcmVzZW50KSkge1xuICAgICAgICAgICAgdGhpcy5faXNHcmlkTGF5b3V0UHJlc2VudCA9IHRoaXMuJGVsZW1lbnQuZmluZCgnLnBhbmVsLWJvZHkgW3dtbGF5b3V0Z3JpZF0nKS5sZW5ndGggPiAwO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9pc0dyaWRMYXlvdXRQcmVzZW50KSB7XG4gICAgICAgICAgICAkZ3JpZExheW91dCA9IHRoaXMuJGVsZW1lbnQuZmluZCgnLmZvcm0tZWxlbWVudHMgW3dtbGF5b3V0Z3JpZF0nKS5maXJzdCgpO1xuICAgICAgICAgICAgbm9PZkNvbHVtbnMgPSBOdW1iZXIoJGdyaWRMYXlvdXQuYXR0cignY29sdW1ucycpKSB8fCAxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgJGdyaWRMYXlvdXQgPSB0aGlzLiRlbGVtZW50LmZpbmQoJy5mb3JtLWVsZW1lbnRzIC5keW5hbWljLWZvcm0tY29udGFpbmVyJyk7XG4gICAgICAgICAgICBpZiAoISRncmlkTGF5b3V0Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRoaXMuJGVsZW1lbnQuZmluZCgnLmZvcm0tZWxlbWVudHMnKS5wcmVwZW5kKCc8ZGl2IGNsYXNzPVwiZHluYW1pYy1mb3JtLWNvbnRhaW5lclwiPjwvZGl2PicpO1xuICAgICAgICAgICAgICAgICRncmlkTGF5b3V0ID0gdGhpcy4kZWxlbWVudC5maW5kKCcuZm9ybS1lbGVtZW50cyAuZHluYW1pYy1mb3JtLWNvbnRhaW5lcicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbm9PZkNvbHVtbnMgPSAxO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbHVtbldpZHRoID0gMTIgLyBub09mQ29sdW1ucztcbiAgICAgICAgbGV0IGZpZWxkVGVtcGxhdGUgPSAnJztcbiAgICAgICAgbGV0IGNvbENvdW50ID0gMDtcbiAgICAgICAgbGV0IGluZGV4O1xuICAgICAgICBsZXQgdXNlckZpZWxkcztcbiAgICAgICAgbGV0IGZpZWxkcyA9IHRoaXMubWV0YWRhdGEgPyB0aGlzLm1ldGFkYXRhLmRhdGEgfHwgdGhpcy5tZXRhZGF0YSA6IFtdO1xuXG4gICAgICAgIHRoaXMuZm9ybUZpZWxkcyA9IFtdOyAvLyBlbXB0eSB0aGUgZm9ybSBmaWVsZHNcblxuICAgICAgICBpZiAoXy5pc0VtcHR5KGZpZWxkcykpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm9uQmVmb3JlUmVuZGVyRXZ0KSB7XG4gICAgICAgICAgICB1c2VyRmllbGRzID0gdGhpcy5pbnZva2VFdmVudENhbGxiYWNrKCdiZWZvcmVyZW5kZXInLCB7JG1ldGFkYXRhOiBmaWVsZHN9KTtcbiAgICAgICAgICAgIGlmICh1c2VyRmllbGRzKSB7XG4gICAgICAgICAgICAgICAgZmllbGRzID0gdXNlckZpZWxkcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghXy5pc0FycmF5KGZpZWxkcykpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHdoaWxlIChmaWVsZHNbY29sQ291bnRdKSB7XG4gICAgICAgICAgICBsZXQgY29sVG1wbCA9ICcnO1xuICAgICAgICAgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgbm9PZkNvbHVtbnM7IGluZGV4KyspIHtcbiAgICAgICAgICAgICAgICBpZiAoZmllbGRzW2NvbENvdW50XSkge1xuICAgICAgICAgICAgICAgICAgICBjb2xUbXBsICs9IHNldE1hcmt1cEZvckZvcm1GaWVsZChmaWVsZHNbY29sQ291bnRdLCBjb2x1bW5XaWR0aCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbENvdW50Kys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaWVsZFRlbXBsYXRlICs9IGA8d20tZ3JpZHJvdz4ke2NvbFRtcGx9PC93bS1ncmlkcm93PmA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuX2lzR3JpZExheW91dFByZXNlbnQpIHtcbiAgICAgICAgICAgIGZpZWxkVGVtcGxhdGUgPSBgPHdtLWxheW91dGdyaWQ+JHtmaWVsZFRlbXBsYXRlfTwvd20tbGF5b3V0Z3JpZD5gO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5keW5hbWljRm9ybVJlZi5jbGVhcigpO1xuXG4gICAgICAgIGlmICghdGhpcy5fZHluYW1pY0NvbnRleHQpIHtcbiAgICAgICAgICAgIHRoaXMuX2R5bmFtaWNDb250ZXh0ID0gT2JqZWN0LmNyZWF0ZSh0aGlzLnZpZXdQYXJlbnQpO1xuICAgICAgICAgICAgdGhpcy5fZHluYW1pY0NvbnRleHQuZm9ybSA9IHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29tcG9uZW50RmFjdG9yeVJlZiA9IGF3YWl0IHRoaXMuZHluYW1pY0NvbXBvbmVudFByb3ZpZGVyLmdldENvbXBvbmVudEZhY3RvcnlSZWYoXG4gICAgICAgICAgICAnYXBwLWZvcm0tZHluYW1pYy0nICsgdGhpcy53aWRnZXRJZCxcbiAgICAgICAgICAgIGZpZWxkVGVtcGxhdGUsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbm9DYWNoZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICB0cmFuc3BpbGU6IHRydWVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICBjb25zdCBjb21wb25lbnQgPSB0aGlzLmR5bmFtaWNGb3JtUmVmLmNyZWF0ZUNvbXBvbmVudChjb21wb25lbnRGYWN0b3J5UmVmLCAwLCB0aGlzLmluaik7XG4gICAgICAgIGV4dGVuZFByb3RvKGNvbXBvbmVudC5pbnN0YW5jZSwgdGhpcy5fZHluYW1pY0NvbnRleHQpO1xuICAgICAgICAkZ3JpZExheW91dFswXS5hcHBlbmRDaGlsZChjb21wb25lbnQubG9jYXRpb24ubmF0aXZlRWxlbWVudCk7XG4gICAgICAgIHRoaXMuc2V0Rm9ybURhdGEodGhpcy5mb3JtZGF0YSk7XG4gICAgfVxuXG4gICAgZ2V0IG1vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9wZXJhdGlvblR5cGUgfHwgdGhpcy5maW5kT3BlcmF0aW9uVHlwZSgpO1xuICAgIH1cblxuICAgIGdldCBkaXJ0eSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmdmb3JtICYmIHRoaXMubmdmb3JtLmRpcnR5O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIHNldHMgdGhlIGZvcm0gc3RhdGUgdG8gcHJpc3RpbmUgYnkgaW50ZXJuYWxseSBjYWxsaW5nIGFuZ3VsYXIgbWFya0FzUHJpc3RpbmUgbWV0aG9kIG9uIHRoZSBmb3JtXG4gICAgICogQHBhcmFtIHZhbHVlLCBXaGVuIHRydWUsIG1hcmsgb25seSB0aGlzIGNvbnRyb2wuIFdoZW4gZmFsc2Ugb3Igbm90IHN1cHBsaWVkLCBtYXJrcyBhbGwgZGlyZWN0IGFuY2VzdG9ycy4gRGVmYXVsdCBpcyBmYWxzZVxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICAgIG1hcmtBc1ByaXN0aW5lKHZhbHVlOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy5uZ2Zvcm0ubWFya0FzUHJpc3RpbmUoeyBvbmx5U2VsZjogdmFsdWUgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2Qgc2V0cyB0aGUgZm9ybSBzdGF0ZSB0byBkaXJ0eSBieSBpbnRlcm5hbGx5IGNhbGxpbmcgYW5ndWxhciBtYXJrQXNEaXJ0eSBtZXRob2Qgb24gdGhlIGZvcm1cbiAgICAgKiBAcGFyYW0gdmFsdWUsIFdoZW4gdHJ1ZSwgbWFyayBvbmx5IHRoaXMgY29udHJvbC4gV2hlbiBmYWxzZSBvciBub3Qgc3VwcGxpZWQsIG1hcmtzIGFsbCBkaXJlY3QgYW5jZXN0b3JzLiBEZWZhdWx0IGlzIGZhbHNlXG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgbWFya0FzRGlydHkodmFsdWU6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgICAgICB0aGlzLm5nZm9ybS5tYXJrQXNEaXJ0eSh7IG9ubHlTZWxmOiB2YWx1ZSB9KTtcbiAgICB9XG5cbiAgICBnZXQgaW52YWxpZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmdmb3JtICYmIHRoaXMubmdmb3JtLmludmFsaWQ7XG4gICAgfVxuXG4gICAgZ2V0IHRvdWNoZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5nZm9ybSAmJiB0aGlzLm5nZm9ybS50b3VjaGVkO1xuICAgIH1cblxuICAgIGdldCB2YWxpZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmdmb3JtICYmIHRoaXMubmdmb3JtLnZhbGlkO1xuICAgIH1cblxuICAgIGdldCBwcmlzdGluZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmdmb3JtICYmIHRoaXMubmdmb3JtLnByaXN0aW5lO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIHNldHMgdGhlIGZvcm0gc3RhdGUgdG8gdG91Y2hlZCBieSBpbnRlcm5hbGx5IGNhbGxpbmcgYW5ndWxhciBtYXJrQXNUb3VjaGVkIG1ldGhvZCBvbiB0aGUgZm9ybVxuICAgICAqIEBwYXJhbSB2YWx1ZSwgV2hlbiB0cnVlLCBtYXJrIG9ubHkgdGhpcyBjb250cm9sLiBXaGVuIGZhbHNlIG9yIG5vdCBzdXBwbGllZCwgbWFya3MgYWxsIGRpcmVjdCBhbmNlc3RvcnMuIERlZmF1bHQgaXMgZmFsc2VcbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICBtYXJrQXNUb3VjaGVkKHZhbHVlOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy5uZ2Zvcm0ubWFya0FzVG91Y2hlZCh7IG9ubHlTZWxmOiB2YWx1ZSB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1ldGhvZCBzZXRzIHRoZSBmb3JtIHN0YXRlIHRvIHVudG91Y2hlZCBieSBpbnRlcm5hbGx5IGNhbGxpbmcgYW5ndWxhciBtYXJrQXNVbnRvdWNoZWQgbWV0aG9kIG9uIHRoZSBmb3JtXG4gICAgICogQHBhcmFtIHZhbHVlLCBXaGVuIHRydWUsIG1hcmsgb25seSB0aGlzIGNvbnRyb2wuIFdoZW4gZmFsc2Ugb3Igbm90IHN1cHBsaWVkLCBtYXJrcyBhbGwgZGlyZWN0IGFuY2VzdG9ycy4gRGVmYXVsdCBpcyBmYWxzZVxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICAgIG1hcmtBc1VudG91Y2hlZCh2YWx1ZTogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgICAgIHRoaXMubmdmb3JtLm1hcmtBc1VudG91Y2hlZCh7IG9ubHlTZWxmOiB2YWx1ZSB9KTtcbiAgICB9XG5cbiAgICBpbnZva2VBY3Rpb25FdmVudCgkZXZlbnQsIGV4cHJlc3Npb246IHN0cmluZykge1xuICAgICAgICBjb25zdCBmbiA9ICRwYXJzZUV2ZW50KGV4cHJlc3Npb24pO1xuICAgICAgICBmbih0aGlzLnZpZXdQYXJlbnQsIE9iamVjdC5hc3NpZ24odGhpcy5jb250ZXh0LCB7JGV2ZW50fSkpO1xuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICAvLyBvbiBmb3JtIGRlc3Ryb3ksIHJlbW92aW5nIHRoaXMgZm9ybSBmcm9tIHRoZSBwYXJlbnRGb3JtIHRvby5cbiAgICAgICAgY29uc3QgY29udHJvbHMgPSB0aGlzLnBhcmVudEZvcm0gJiYgXy5nZXQodGhpcy5wYXJlbnRGb3JtLCAnbmdmb3JtLmNvbnRyb2xzJyk7XG4gICAgICAgIGlmIChjb250cm9scykge1xuICAgICAgICAgICAgLy8gd2hlbiBjdXJyZW50IGZvcm0gaXMgaW5zaWRlIHRoZSBsaXN0IChpLmUuIGluY2FzZSBvZiBmb3JtQXJyYXkpLlxuICAgICAgICAgICAgaWYgKF8uZ2V0KHRoaXMucGFyZW50TGlzdCwgJ25hbWUnKSAmJiBjb250cm9scy5oYXNPd25Qcm9wZXJ0eSh0aGlzLnBhcmVudExpc3QubmFtZSkpIHtcbiAgICAgICAgICAgICAgICAvL2dldCB0aGUgaW5kZXggb2YgY3VycmVudCBmb3JtIGluIHRoZSBsaXN0IGFuZCByZW1vdmUgdGhlIEZvcm1Db250cm9sIGZyb20gRm9ybUFycmF5XG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBfLmZpbmRJbmRleCh0aGlzLnBhcmVudExpc3QuZ2V0V2lkZ2V0cyh0aGlzLm5hbWUpLCB7d2lkZ2V0SWQ6IHRoaXMud2lkZ2V0SWR9KTtcbiAgICAgICAgICAgICAgICAoPEZvcm1BcnJheT50aGlzLnBhcmVudEZvcm0ubmdmb3JtLmNvbnRyb2xzW3RoaXMucGFyZW50TGlzdC5uYW1lXSkucmVtb3ZlQXQoaW5kZXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gd2hlbiB3ZSBoYXZlIGZvcm1Hcm91cE5hbWUgc2V0IGkuZS4gbXVsdGlwbGUgZm9ybUluc3RhbmNlIHdpdGggY291bnRlciBhcHBlbmRlZCB0byBmb3JtTmFtZVxuICAgICAgICAgICAgaWYgKHRoaXMuZm9ybUdyb3VwTmFtZSAmJiBjb250cm9scy5oYXNPd25Qcm9wZXJ0eSh0aGlzLmZvcm1Hcm91cE5hbWUpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wYXJlbnRGb3JtLm5nZm9ybS5yZW1vdmVDb250cm9sKHRoaXMuZm9ybUdyb3VwTmFtZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMucGFyZW50Rm9ybS5uZ2Zvcm0ucmVtb3ZlQ29udHJvbCh0aGlzLm5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHN1cGVyLm5nT25EZXN0cm95KCk7XG4gICAgfVxufVxuIiwiPG5nLXRlbXBsYXRlICNjb250ZW50PjxuZy1jb250ZW50PjwvbmctY29udGVudD48L25nLXRlbXBsYXRlPlxuXG48bmctY29udGFpbmVyICpuZ0lmPVwiZm9ybWxheW91dCA9PT0gJ3BhZ2UnOyB0aGVuIHBhZ2VMYXlvdXRUZW1wbGF0ZSBlbHNlIGRlZmF1bHRUZW1wbGF0ZVwiPlxuPC9uZy1jb250YWluZXI+XG5cbjxuZy10ZW1wbGF0ZSAjZGVmYXVsdFRlbXBsYXRlPlxuICAgIDxkaXYgY2xhc3M9XCJwYW5lbC1oZWFkaW5nXCIgKm5nSWY9XCIhaXNMYXlvdXREaWFsb2cgJiYgKHRpdGxlIHx8IHN1YmhlYWRpbmcgfHwgaWNvbmNsYXNzIHx8IHNob3dCdXR0b25zKCdoZWFkZXInKSlcIj5cbiAgICAgICAgPGgzIGNsYXNzPVwicGFuZWwtdGl0bGVcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLWxlZnRcIj5cbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImFwcC1pY29uIHBhbmVsLWljb25cIiBhcmlhLWhpZGRlbj1cInRydWVcIiBbbmdDbGFzc109XCJpY29uY2xhc3NcIiAqbmdJZj1cImljb25jbGFzc1wiPjwvaT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB1bGwtbGVmdFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZWFkaW5nXCIgW2lubmVySFRNTF09XCJ0aXRsZVwiPjwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXNjcmlwdGlvblwiIFtpbm5lckhUTUxdPVwic3ViaGVhZGluZ1wiPjwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1hY3Rpb24gcGFuZWwtYWN0aW9ucyBiYXNpYy1idG4tZ3JwXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYnRuIG9mIGJ1dHRvbkFycmF5IHwgZmlsdGVyIDogJ3Bvc2l0aW9uJyA6ICdoZWFkZXInXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImJ0bi53aWRnZXRUeXBlID09PSAnYnV0dG9uJyA/IGJ1dHRvblJlZiA6IGFuY2hvclJlZlwiIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7YnRuOmJ0bn1cIj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImFwcC1pY29uIHdpIHBhbmVsLWFjdGlvblwiICpuZ0lmPVwiY29sbGFwc2libGVcIiB0aXRsZT1cIkNvbGxhcHNlL0V4cGFuZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJleHBhbmRlZCA/ICd3aS1taW51cyc6ICd3aS1wbHVzJ1wiIChjbGljayk9XCJleHBhbmRDb2xsYXBzZVBhbmVsKCk7XCI+PC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9oMz5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwicGFuZWwtYm9keVwiIFtuZ0NsYXNzXT1cInsnZm9ybS1lbGVtZW50cyc6IGlzTGF5b3V0RGlhbG9nLCAnZm9ybS1ib2R5JzogIWlzTGF5b3V0RGlhbG9nfVwiIFtjbGFzcy5oaWRkZW5dPVwiIWV4cGFuZGVkXCI+XG4gICAgICAgIDxwIHdtTWVzc2FnZSAqbmdJZj1cIiEhc3RhdHVzTWVzc2FnZS5jYXB0aW9uXCIgW2F0dHIuYXJpYS1oaWRkZW5dPVwiIXN0YXR1c01lc3NhZ2UuY2FwdGlvblwiIFthdHRyLmFyaWEtbGFiZWxdPVwic3RhdHVzTWVzc2FnZS5jYXB0aW9uXCIgY2FwdGlvbi5iaW5kPVwic3RhdHVzTWVzc2FnZS5jYXB0aW9uXCIgdHlwZS5iaW5kPVwic3RhdHVzTWVzc2FnZS50eXBlXCI+PC9wPlxuICAgICAgICA8ZGl2IFtuZ0NsYXNzXT1cInsnZm9ybS1lbGVtZW50cyc6ICFpc0xheW91dERpYWxvZywgJ2Zvcm0tY29udGVudCc6IGlzTGF5b3V0RGlhbG9nfVwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNvbnRlbnRcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJiYXNpYy1idG4tZ3JwIGZvcm0tYWN0aW9uIHBhbmVsLWZvb3RlciBjbGVhcmZpeFwiIFtuZ0NsYXNzXT1cInsnbW9kYWwtZm9vdGVyJzogaXNMYXlvdXREaWFsb2d9XCIgW2NsYXNzLmhpZGRlbl09XCIhZXhwYW5kZWQgfHwgIXNob3dCdXR0b25zKCdmb290ZXInKVwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYnRuIG9mIGJ1dHRvbkFycmF5IHwgZmlsdGVyIDogJ3Bvc2l0aW9uJyA6ICdmb290ZXInXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiYnRuLndpZGdldFR5cGUgPT09ICdidXR0b24nID8gYnV0dG9uUmVmIDogYW5jaG9yUmVmXCIgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntidG46YnRufVwiPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNwYWdlTGF5b3V0VGVtcGxhdGU+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNvbnRlbnRcIj48L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjYnV0dG9uUmVmIGxldC1idG49XCJidG5cIj5cbiAgICA8YnV0dG9uICB3bUJ1dHRvbiBuYW1lPVwie3tidG4ua2V5fX1cIiBjYXB0aW9uLmJpbmQ9XCJidG4uZGlzcGxheU5hbWVcIiBjbGFzcy5iaW5kPVwiYnRuLmNsYXNzXCIgaWNvbmNsYXNzLmJpbmQ9XCJidG4uaWNvbmNsYXNzXCIgc2hvdy5iaW5kPVwiYnRuLnNob3dcIlxuICAgICAgICAgICAgIChjbGljayk9XCJpbnZva2VBY3Rpb25FdmVudCgkZXZlbnQsIGJ0bi5hY3Rpb24pXCIgdHlwZS5iaW5kPVwiYnRuLnR5cGVcIiBoaW50LmJpbmQ9XCJidG4udGl0bGVcIiBzaG9ydGN1dGtleS5iaW5kPVwiYnRuLnNob3J0Y3V0a2V5XCIgZGlzYWJsZWQuYmluZD1cIm5nZm9ybS5zdGF0dXMgPT09ICdQRU5ESU5HJyB8fCBidG4uZGlzYWJsZWRcIlxuICAgICAgICAgICAgIHRhYmluZGV4LmJpbmQ9XCJidG4udGFiaW5kZXhcIiBbYXR0ci5hcmlhLWxhYmVsXT1cImJ0bi5kaXNwbGF5TmFtZVwiIFtjbGFzcy5oaWRkZW5dPVwiYnRuLnVwZGF0ZU1vZGUgPyAhaXNVcGRhdGVNb2RlIDogaXNVcGRhdGVNb2RlXCI+PC9idXR0b24+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2FuY2hvclJlZiBsZXQtYnRuPVwiYnRuXCI+XG4gICAgPGEgd21BbmNob3IgbmFtZT1cInt7YnRuLmtleX19XCIgY2FwdGlvbi5iaW5kPVwiYnRuLmRpc3BsYXlOYW1lXCIgY2xhc3MuYmluZD1cImJ0bi5jbGFzc1wiIGljb25jbGFzcy5iaW5kPVwiYnRuLmljb25jbGFzc1wiIHNob3cuYmluZD1cImJ0bi5zaG93XCJcbiAgICAgICAgICAgICAoY2xpY2spPVwiaW52b2tlQWN0aW9uRXZlbnQoJGV2ZW50LCBidG4uYWN0aW9uKVwiIGhpbnQuYmluZD1cImJ0bi50aXRsZVwiIHNob3J0Y3V0a2V5LmJpbmQ9XCJidG4uc2hvcnRjdXRrZXlcIlxuICAgICAgICAgICAgIGh5cGVybGluay5iaW5kPVwiYnRuLmh5cGVybGlua1wiIHRhcmdldC5iaW5kPVwiYnRuLnRhcmdldFwiXG4gICAgICAgICAgICAgdGFiaW5kZXguYmluZD1cImJ0bi50YWJpbmRleFwiIFtjbGFzcy5oaWRkZW5dPVwiYnRuLnVwZGF0ZU1vZGUgPyAhaXNVcGRhdGVNb2RlIDogaXNVcGRhdGVNb2RlXCI+PC9hPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLWNvbnRhaW5lciAjZHluYW1pY0Zvcm0+PC9uZy1jb250YWluZXI+XG4iXX0=