@mediusinc/mng-commons 0.21.1 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (381) hide show
  1. package/assets/i18n/en.json +20 -2
  2. package/assets/i18n/sl.json +18 -1
  3. package/esm2020/lib/api/models/builders/query-param.builder.mjs +58 -58
  4. package/esm2020/lib/api/models/filter-match-type.model.mjs +24 -24
  5. package/esm2020/lib/api/models/filter-param.model.mjs +32 -32
  6. package/esm2020/lib/api/models/index.mjs +8 -8
  7. package/esm2020/lib/api/models/mappers.mjs +12 -12
  8. package/esm2020/lib/api/models/query-mode.model.mjs +17 -17
  9. package/esm2020/lib/api/models/query-param.model.mjs +67 -67
  10. package/esm2020/lib/api/models/query-result.model.mjs +23 -23
  11. package/esm2020/lib/api/models/serialization.model.mjs +1 -1
  12. package/esm2020/lib/api/services/api.abstract.service.mjs +57 -57
  13. package/esm2020/lib/api/services/crud-api.abstract.service.mjs +75 -68
  14. package/esm2020/lib/api/services/get-all-api.abstract.service.mjs +30 -23
  15. package/esm2020/lib/api/services/index.mjs +3 -3
  16. package/esm2020/lib/api/utils/index.mjs +2 -2
  17. package/esm2020/lib/api/utils/medius-rest.util.mjs +212 -212
  18. package/esm2020/lib/api/utils/object-serializer.util.mjs +247 -247
  19. package/esm2020/lib/components/action/action.component.mjs +225 -221
  20. package/esm2020/lib/components/action/editor/action-editor.component.mjs +303 -284
  21. package/esm2020/lib/components/action/index.mjs +5 -4
  22. package/esm2020/lib/components/action/localization/data-language-dropdown.component.mjs +45 -0
  23. package/esm2020/lib/components/action/models/action-component.model.mjs +2 -0
  24. package/esm2020/lib/components/action/models/action-confirmation-service.model.mjs +1 -1
  25. package/esm2020/lib/components/action/models/action-execution.model.mjs +249 -245
  26. package/esm2020/lib/components/action/models/index.mjs +5 -4
  27. package/esm2020/lib/components/action/models/tableview-action-default-categories.model.mjs +10 -10
  28. package/esm2020/lib/components/action/route/action-route.component.mjs +129 -129
  29. package/esm2020/lib/components/form/autocomplete/autocomplete.component.mjs +299 -299
  30. package/esm2020/lib/components/form/date-range/date-range.component.mjs +108 -108
  31. package/esm2020/lib/components/form/dropdown/dropdown.component.mjs +193 -193
  32. package/esm2020/lib/components/form/editor/form-editor.component.mjs +243 -219
  33. package/esm2020/lib/components/form/formly/fields/formly-field-action/formly-field-action.component.mjs +38 -38
  34. package/esm2020/lib/components/form/formly/fields/formly-field-autocomplete/formly-field-autocomplete.component.mjs +49 -49
  35. package/esm2020/lib/components/form/formly/fields/formly-field-dropdown/formly-field-dropdown.component.mjs +44 -44
  36. package/esm2020/lib/components/form/formly/fields/formly-field-fieldset/formly-field-fieldset.component.mjs +25 -25
  37. package/esm2020/lib/components/form/formly/fields/formly-field-input/formly-field-input.component.mjs +149 -149
  38. package/esm2020/lib/components/form/formly/fields/formly-field-label/formly-field-label.component.mjs +23 -23
  39. package/esm2020/lib/components/form/formly/fields/formly-field-lookup-dialog/formly-field-lookup-dialog.component.mjs +180 -180
  40. package/esm2020/lib/components/form/formly/fields/formly-field-table-dialog-form/formly-field-table-dialog-form.component.mjs +178 -168
  41. package/esm2020/lib/components/form/formly/fields/formly-field-table-dialog-multiselect/formly-field-table-dialog-multiselect.component.mjs +148 -148
  42. package/esm2020/lib/components/form/formly/fields/formly-field-tabs/formly-field-tabs.component.mjs +16 -16
  43. package/esm2020/lib/components/form/formly/fields/index.mjs +10 -10
  44. package/esm2020/lib/components/form/formly/formly.config.mjs +211 -211
  45. package/esm2020/lib/components/form/formly/index.mjs +1 -1
  46. package/esm2020/lib/components/form/formly/models/formly-config.model.mjs +1 -1
  47. package/esm2020/lib/components/form/formly/models/formly-field.model.mjs +1 -1
  48. package/esm2020/lib/components/form/formly/models/index.mjs +2 -2
  49. package/esm2020/lib/components/form/formly/wrappers/formly-field-no-label-wrapper/formly-field-no-label-wrapper.component.mjs +14 -14
  50. package/esm2020/lib/components/form/formly/wrappers/formly-field-wrapper/formly-field-wrapper.component.mjs +83 -15
  51. package/esm2020/lib/components/form/formly/wrappers/index.mjs +2 -2
  52. package/esm2020/lib/components/form/index.mjs +4 -4
  53. package/esm2020/lib/components/form/models/field-action-context.model.mjs +1 -1
  54. package/esm2020/lib/components/form/models/form-editor.event.mjs +33 -33
  55. package/esm2020/lib/components/form/models/form-editor.interface.mjs +1 -1
  56. package/esm2020/lib/components/form/models/index.mjs +2 -2
  57. package/esm2020/lib/components/layout/breadcrumb.component.mjs +16 -16
  58. package/esm2020/lib/components/layout/footer.component.mjs +16 -16
  59. package/esm2020/lib/components/layout/index.mjs +7 -7
  60. package/esm2020/lib/components/layout/main-layout.component.mjs +51 -51
  61. package/esm2020/lib/components/layout/menu-item.component.mjs +271 -271
  62. package/esm2020/lib/components/layout/menu.component.mjs +20 -20
  63. package/esm2020/lib/components/layout/services/index.mjs +1 -1
  64. package/esm2020/lib/components/layout/services/main-layout.component.service.mjs +194 -194
  65. package/esm2020/lib/components/layout/topbar.component.mjs +64 -64
  66. package/esm2020/lib/components/layout/version.component.mjs +57 -57
  67. package/esm2020/lib/components/tableview/index.mjs +6 -6
  68. package/esm2020/lib/components/tableview/models/index.mjs +1 -1
  69. package/esm2020/lib/components/tableview/models/table.event.mjs +15 -15
  70. package/esm2020/lib/components/tableview/route/tableview-route.abstract.component.mjs +122 -115
  71. package/esm2020/lib/components/tableview/route/tableview-route.component.mjs +52 -52
  72. package/esm2020/lib/components/tableview/table/column-filter/column-filter.component.mjs +119 -119
  73. package/esm2020/lib/components/tableview/table/column-value/column-value.component.mjs +84 -83
  74. package/esm2020/lib/components/tableview/table/table.component.mjs +594 -590
  75. package/esm2020/lib/components/tableview/tableview.component.mjs +112 -112
  76. package/esm2020/lib/data-providers/base.data-provider.mjs +16 -16
  77. package/esm2020/lib/data-providers/editor.data-provider.mjs +37 -37
  78. package/esm2020/lib/data-providers/index.mjs +6 -6
  79. package/esm2020/lib/data-providers/lookup.data-provider.mjs +15 -15
  80. package/esm2020/lib/data-providers/table.data-provider.mjs +38 -38
  81. package/esm2020/lib/data-providers/tableview-crud.data-provider.mjs +24 -24
  82. package/esm2020/lib/data-providers/tableview.data-provider.mjs +45 -59
  83. package/esm2020/lib/descriptors/action/action-confirmation.descriptor.mjs +76 -76
  84. package/esm2020/lib/descriptors/action-button.descriptor.mjs +59 -59
  85. package/esm2020/lib/descriptors/action.descriptor.mjs +560 -548
  86. package/esm2020/lib/descriptors/column.descriptor.mjs +405 -386
  87. package/esm2020/lib/descriptors/editor.descriptor.mjs +290 -251
  88. package/esm2020/lib/descriptors/field-validation.descriptor.mjs +24 -24
  89. package/esm2020/lib/descriptors/field.descriptor.mjs +979 -937
  90. package/esm2020/lib/descriptors/filter.descriptor.mjs +320 -320
  91. package/esm2020/lib/descriptors/index.mjs +11 -11
  92. package/esm2020/lib/descriptors/interfaces/field-config.interface.mjs +1 -1
  93. package/esm2020/lib/descriptors/interfaces/index.mjs +2 -2
  94. package/esm2020/lib/descriptors/interfaces/lookup-descriptor.interface.mjs +1 -1
  95. package/esm2020/lib/descriptors/model.descriptor.mjs +44 -44
  96. package/esm2020/lib/descriptors/table.descriptor.mjs +482 -464
  97. package/esm2020/lib/descriptors/tableview.descriptor.mjs +344 -324
  98. package/esm2020/lib/descriptors/types/action.type.mjs +25 -25
  99. package/esm2020/lib/descriptors/types/column.type.mjs +20 -20
  100. package/esm2020/lib/descriptors/types/editor.type.mjs +7 -7
  101. package/esm2020/lib/descriptors/types/field.type.mjs +54 -54
  102. package/esm2020/lib/descriptors/types/filter.type.mjs +30 -30
  103. package/esm2020/lib/descriptors/types/index.mjs +6 -6
  104. package/esm2020/lib/descriptors/types/table.type.mjs +26 -26
  105. package/esm2020/lib/directives/component.directive.mjs +44 -44
  106. package/esm2020/lib/directives/index.mjs +2 -2
  107. package/esm2020/lib/directives/template.directive.mjs +27 -27
  108. package/esm2020/lib/mng-commons.module.mjs +475 -468
  109. package/esm2020/lib/models/column-value.model.mjs +1 -1
  110. package/esm2020/lib/models/config.model.mjs +2 -2
  111. package/esm2020/lib/models/enum.model.mjs +1 -1
  112. package/esm2020/lib/models/error.model.mjs +1 -1
  113. package/esm2020/lib/models/index.mjs +9 -9
  114. package/esm2020/lib/models/menu.model.mjs +1 -1
  115. package/esm2020/lib/models/tableview-attr.model.mjs +1 -1
  116. package/esm2020/lib/models/user.model.mjs +1 -1
  117. package/esm2020/lib/models/version.model.mjs +1 -1
  118. package/esm2020/lib/models/view-container.model.mjs +1 -1
  119. package/esm2020/lib/pipes/boolean.pipe.mjs +26 -26
  120. package/esm2020/lib/pipes/class-map.pipe.mjs +21 -21
  121. package/esm2020/lib/pipes/enum.pipe.mjs +24 -24
  122. package/esm2020/lib/pipes/enumerate-async.pipe.mjs +37 -37
  123. package/esm2020/lib/pipes/enumerate.pipe.mjs +54 -54
  124. package/esm2020/lib/pipes/getter.pipe.mjs +19 -19
  125. package/esm2020/lib/pipes/i18n-property.pipe.mjs +17 -17
  126. package/esm2020/lib/pipes/index.mjs +12 -11
  127. package/esm2020/lib/pipes/json-path.pipe.mjs +78 -78
  128. package/esm2020/lib/pipes/locale-default-row-class.pipe.mjs +26 -0
  129. package/esm2020/lib/pipes/models/internal/enumrate-pipe-i18n.model.mjs +1 -1
  130. package/esm2020/lib/pipes/models/internal/index.mjs +1 -1
  131. package/esm2020/lib/pipes/parametrize.pipe.mjs +84 -84
  132. package/esm2020/lib/pipes/template.pipe.mjs +23 -23
  133. package/esm2020/lib/router/index.mjs +2 -2
  134. package/esm2020/lib/router/models/index.mjs +1 -1
  135. package/esm2020/lib/router/models/router.model.mjs +1 -1
  136. package/esm2020/lib/router/route-builder.mjs +425 -425
  137. package/esm2020/lib/router/tableview-route-builder.mjs +186 -186
  138. package/esm2020/lib/security/authorization.guard.mjs +25 -25
  139. package/esm2020/lib/security/authorization.service.mjs +46 -46
  140. package/esm2020/lib/security/authorization.util.mjs +15 -15
  141. package/esm2020/lib/security/index.mjs +3 -3
  142. package/esm2020/lib/security/model/authorization.type.mjs +7 -7
  143. package/esm2020/lib/security/model/index.mjs +3 -3
  144. package/esm2020/lib/security/model/permission-service.interface.mjs +1 -1
  145. package/esm2020/lib/security/model/permissions.model.mjs +86 -86
  146. package/esm2020/lib/services/action-executor.service.mjs +552 -552
  147. package/esm2020/lib/services/commons.service.mjs +446 -420
  148. package/esm2020/lib/services/configuration.service.mjs +134 -134
  149. package/esm2020/lib/services/error-mapper.service.mjs +13 -13
  150. package/esm2020/lib/services/index.mjs +6 -6
  151. package/esm2020/lib/services/internal/commons-init.provider.mjs +3 -3
  152. package/esm2020/lib/services/internal/commons-init.service.mjs +43 -43
  153. package/esm2020/lib/services/internal/index.mjs +2 -2
  154. package/esm2020/lib/services/navigation.service.mjs +47 -47
  155. package/esm2020/lib/services/providers/config-service.provider.mjs +29 -29
  156. package/esm2020/lib/services/providers/formly-config.provider.mjs +30 -30
  157. package/esm2020/lib/services/providers/index.mjs +2 -2
  158. package/esm2020/lib/services/tokens/browser-storage.token.mjs +5 -5
  159. package/esm2020/lib/services/tokens/commons-init.token.mjs +2 -2
  160. package/esm2020/lib/services/tokens/default-setting.token.mjs +2 -2
  161. package/esm2020/lib/services/tokens/index.mjs +4 -4
  162. package/esm2020/lib/services/tokens/module-config.token.mjs +2 -2
  163. package/esm2020/lib/services/version.service.mjs +38 -38
  164. package/esm2020/lib/services/view-container.component.service.mjs +54 -54
  165. package/esm2020/lib/styles/button-style.builder.mjs +164 -164
  166. package/esm2020/lib/styles/index.mjs +2 -2
  167. package/esm2020/lib/styles/models/index.mjs +2 -2
  168. package/esm2020/lib/styles/models/style-level.enum.mjs +11 -11
  169. package/esm2020/lib/styles/models/style-size.enum.mjs +8 -8
  170. package/esm2020/lib/styles/styles.util.mjs +41 -41
  171. package/esm2020/lib/types/index.mjs +2 -2
  172. package/esm2020/lib/types/type.decorator.mjs +21 -21
  173. package/esm2020/lib/types/type.model.mjs +1 -1
  174. package/esm2020/lib/utils/action-data-provider.util.mjs +145 -145
  175. package/esm2020/lib/utils/date.util.mjs +117 -117
  176. package/esm2020/lib/utils/editor-formly.util.mjs +277 -268
  177. package/esm2020/lib/utils/enum.util.mjs +81 -81
  178. package/esm2020/lib/utils/i18n.util.mjs +233 -233
  179. package/esm2020/lib/utils/index.mjs +9 -9
  180. package/esm2020/lib/utils/model.util.mjs +68 -68
  181. package/esm2020/lib/utils/notification.util.mjs +51 -46
  182. package/esm2020/lib/utils/route.util.mjs +23 -23
  183. package/esm2020/lib/utils/string.util.mjs +26 -26
  184. package/esm2020/lib/utils/tableview.util.mjs +159 -159
  185. package/esm2020/lib/utils/type.util.mjs +92 -92
  186. package/esm2020/mediusinc-mng-commons.mjs +4 -4
  187. package/esm2020/public-api.mjs +54 -54
  188. package/fesm2015/mediusinc-mng-commons.mjs +13634 -13246
  189. package/fesm2015/mediusinc-mng-commons.mjs.map +1 -1
  190. package/fesm2020/mediusinc-mng-commons.mjs +13472 -13090
  191. package/fesm2020/mediusinc-mng-commons.mjs.map +1 -1
  192. package/index.d.ts +5 -5
  193. package/lib/api/models/builders/query-param.builder.d.ts +13 -13
  194. package/lib/api/models/filter-match-type.model.d.ts +23 -23
  195. package/lib/api/models/filter-param.model.d.ts +23 -23
  196. package/lib/api/models/index.d.ts +8 -8
  197. package/lib/api/models/mappers.d.ts +6 -6
  198. package/lib/api/models/query-mode.model.d.ts +16 -16
  199. package/lib/api/models/query-param.model.d.ts +31 -31
  200. package/lib/api/models/query-result.model.d.ts +24 -24
  201. package/lib/api/models/serialization.model.d.ts +8 -8
  202. package/lib/api/services/api.abstract.service.d.ts +24 -24
  203. package/lib/api/services/crud-api.abstract.service.d.ts +22 -22
  204. package/lib/api/services/get-all-api.abstract.service.d.ts +14 -14
  205. package/lib/api/services/index.d.ts +3 -3
  206. package/lib/api/utils/index.d.ts +2 -2
  207. package/lib/api/utils/medius-rest.util.d.ts +16 -16
  208. package/lib/api/utils/object-serializer.util.d.ts +33 -33
  209. package/lib/components/action/action.component.d.ts +74 -72
  210. package/lib/components/action/editor/action-editor.component.d.ts +69 -69
  211. package/lib/components/action/index.d.ts +4 -3
  212. package/lib/components/action/localization/data-language-dropdown.component.d.ts +25 -0
  213. package/lib/components/action/models/action-component.model.d.ts +15 -0
  214. package/lib/components/action/models/action-confirmation-service.model.d.ts +6 -6
  215. package/lib/components/action/models/action-execution.model.d.ts +135 -133
  216. package/lib/components/action/models/index.d.ts +4 -3
  217. package/lib/components/action/models/tableview-action-default-categories.model.d.ts +10 -10
  218. package/lib/components/action/route/action-route.component.d.ts +31 -31
  219. package/lib/components/form/autocomplete/autocomplete.component.d.ts +61 -61
  220. package/lib/components/form/date-range/date-range.component.d.ts +28 -28
  221. package/lib/components/form/dropdown/dropdown.component.d.ts +52 -52
  222. package/lib/components/form/editor/form-editor.component.d.ts +52 -45
  223. package/lib/components/form/formly/fields/formly-field-action/formly-field-action.component.d.ts +13 -13
  224. package/lib/components/form/formly/fields/formly-field-autocomplete/formly-field-autocomplete.component.d.ts +16 -16
  225. package/lib/components/form/formly/fields/formly-field-dropdown/formly-field-dropdown.component.d.ts +15 -15
  226. package/lib/components/form/formly/fields/formly-field-fieldset/formly-field-fieldset.component.d.ts +14 -14
  227. package/lib/components/form/formly/fields/formly-field-input/formly-field-input.component.d.ts +29 -29
  228. package/lib/components/form/formly/fields/formly-field-label/formly-field-label.component.d.ts +11 -11
  229. package/lib/components/form/formly/fields/formly-field-lookup-dialog/formly-field-lookup-dialog.component.d.ts +46 -46
  230. package/lib/components/form/formly/fields/formly-field-table-dialog-form/formly-field-table-dialog-form.component.d.ts +24 -21
  231. package/lib/components/form/formly/fields/formly-field-table-dialog-multiselect/formly-field-table-dialog-multiselect.component.d.ts +37 -37
  232. package/lib/components/form/formly/fields/formly-field-tabs/formly-field-tabs.component.d.ts +7 -7
  233. package/lib/components/form/formly/fields/index.d.ts +10 -10
  234. package/lib/components/form/formly/formly.config.d.ts +14 -14
  235. package/lib/components/form/formly/index.d.ts +1 -1
  236. package/lib/components/form/formly/models/formly-config.model.d.ts +11 -11
  237. package/lib/components/form/formly/models/formly-field.model.d.ts +16 -16
  238. package/lib/components/form/formly/models/index.d.ts +2 -2
  239. package/lib/components/form/formly/wrappers/formly-field-no-label-wrapper/formly-field-no-label-wrapper.component.d.ts +6 -6
  240. package/lib/components/form/formly/wrappers/formly-field-wrapper/formly-field-wrapper.component.d.ts +11 -6
  241. package/lib/components/form/formly/wrappers/index.d.ts +2 -2
  242. package/lib/components/form/index.d.ts +4 -4
  243. package/lib/components/form/models/field-action-context.model.d.ts +17 -17
  244. package/lib/components/form/models/form-editor.event.d.ts +37 -37
  245. package/lib/components/form/models/form-editor.interface.d.ts +10 -10
  246. package/lib/components/form/models/index.d.ts +2 -2
  247. package/lib/components/layout/breadcrumb.component.d.ts +8 -8
  248. package/lib/components/layout/footer.component.d.ts +9 -9
  249. package/lib/components/layout/index.d.ts +7 -7
  250. package/lib/components/layout/main-layout.component.d.ts +20 -20
  251. package/lib/components/layout/menu-item.component.d.ts +52 -52
  252. package/lib/components/layout/menu.component.d.ts +10 -10
  253. package/lib/components/layout/services/index.d.ts +1 -1
  254. package/lib/components/layout/services/main-layout.component.service.d.ts +65 -65
  255. package/lib/components/layout/topbar.component.d.ts +28 -28
  256. package/lib/components/layout/version.component.d.ts +19 -19
  257. package/lib/components/tableview/index.d.ts +6 -6
  258. package/lib/components/tableview/models/index.d.ts +1 -1
  259. package/lib/components/tableview/models/table.event.d.ts +17 -17
  260. package/lib/components/tableview/route/tableview-route.abstract.component.d.ts +29 -28
  261. package/lib/components/tableview/route/tableview-route.component.d.ts +18 -18
  262. package/lib/components/tableview/table/column-filter/column-filter.component.d.ts +38 -38
  263. package/lib/components/tableview/table/column-value/column-value.component.d.ts +35 -35
  264. package/lib/components/tableview/table/table.component.d.ts +115 -114
  265. package/lib/components/tableview/tableview.component.d.ts +48 -48
  266. package/lib/data-providers/base.data-provider.d.ts +14 -14
  267. package/lib/data-providers/editor.data-provider.d.ts +25 -25
  268. package/lib/data-providers/index.d.ts +6 -6
  269. package/lib/data-providers/lookup.data-provider.d.ts +14 -14
  270. package/lib/data-providers/table.data-provider.d.ts +27 -27
  271. package/lib/data-providers/tableview-crud.data-provider.d.ts +8 -8
  272. package/lib/data-providers/tableview.data-provider.d.ts +33 -37
  273. package/lib/descriptors/action/action-confirmation.descriptor.d.ts +36 -36
  274. package/lib/descriptors/action-button.descriptor.d.ts +22 -22
  275. package/lib/descriptors/action.descriptor.d.ts +217 -212
  276. package/lib/descriptors/column.descriptor.d.ts +130 -125
  277. package/lib/descriptors/editor.descriptor.d.ts +116 -95
  278. package/lib/descriptors/field-validation.descriptor.d.ts +19 -19
  279. package/lib/descriptors/field.descriptor.d.ts +342 -332
  280. package/lib/descriptors/filter.descriptor.d.ts +112 -112
  281. package/lib/descriptors/index.d.ts +11 -11
  282. package/lib/descriptors/interfaces/field-config.interface.d.ts +9 -9
  283. package/lib/descriptors/interfaces/index.d.ts +2 -2
  284. package/lib/descriptors/interfaces/lookup-descriptor.interface.d.ts +17 -17
  285. package/lib/descriptors/model.descriptor.d.ts +18 -18
  286. package/lib/descriptors/table.descriptor.d.ts +188 -182
  287. package/lib/descriptors/tableview.descriptor.d.ts +129 -122
  288. package/lib/descriptors/types/action.type.d.ts +21 -21
  289. package/lib/descriptors/types/column.type.d.ts +18 -18
  290. package/lib/descriptors/types/editor.type.d.ts +6 -6
  291. package/lib/descriptors/types/field.type.d.ts +46 -46
  292. package/lib/descriptors/types/filter.type.d.ts +27 -27
  293. package/lib/descriptors/types/index.d.ts +6 -6
  294. package/lib/descriptors/types/table.type.d.ts +22 -22
  295. package/lib/directives/component.directive.d.ts +16 -16
  296. package/lib/directives/index.d.ts +2 -2
  297. package/lib/directives/template.directive.d.ts +13 -13
  298. package/lib/mng-commons.module.d.ts +97 -95
  299. package/lib/models/column-value.model.d.ts +4 -4
  300. package/lib/models/config.model.d.ts +40 -39
  301. package/lib/models/enum.model.d.ts +6 -6
  302. package/lib/models/error.model.d.ts +14 -14
  303. package/lib/models/index.d.ts +9 -9
  304. package/lib/models/menu.model.d.ts +30 -30
  305. package/lib/models/tableview-attr.model.d.ts +10 -10
  306. package/lib/models/user.model.d.ts +8 -8
  307. package/lib/models/version.model.d.ts +18 -18
  308. package/lib/models/view-container.model.d.ts +43 -43
  309. package/lib/pipes/boolean.pipe.d.ts +7 -7
  310. package/lib/pipes/class-map.pipe.d.ts +7 -7
  311. package/lib/pipes/enum.pipe.d.ts +8 -8
  312. package/lib/pipes/enumerate-async.pipe.d.ts +14 -14
  313. package/lib/pipes/enumerate.pipe.d.ts +21 -21
  314. package/lib/pipes/getter.pipe.d.ts +7 -7
  315. package/lib/pipes/i18n-property.pipe.d.ts +8 -8
  316. package/lib/pipes/index.d.ts +11 -10
  317. package/lib/pipes/json-path.pipe.d.ts +13 -13
  318. package/lib/pipes/locale-default-row-class.pipe.d.ts +10 -0
  319. package/lib/pipes/models/internal/enumrate-pipe-i18n.model.d.ts +5 -5
  320. package/lib/pipes/models/internal/index.d.ts +1 -1
  321. package/lib/pipes/parametrize.pipe.d.ts +13 -13
  322. package/lib/pipes/template.pipe.d.ts +10 -10
  323. package/lib/router/index.d.ts +2 -2
  324. package/lib/router/models/index.d.ts +1 -1
  325. package/lib/router/models/router.model.d.ts +33 -33
  326. package/lib/router/route-builder.d.ts +98 -98
  327. package/lib/router/tableview-route-builder.d.ts +37 -37
  328. package/lib/security/authorization.guard.d.ts +11 -11
  329. package/lib/security/authorization.service.d.ts +19 -19
  330. package/lib/security/authorization.util.d.ts +5 -5
  331. package/lib/security/index.d.ts +3 -3
  332. package/lib/security/model/authorization.type.d.ts +6 -6
  333. package/lib/security/model/index.d.ts +3 -3
  334. package/lib/security/model/permission-service.interface.d.ts +6 -6
  335. package/lib/security/model/permissions.model.d.ts +37 -37
  336. package/lib/services/action-executor.service.d.ts +149 -149
  337. package/lib/services/commons.service.d.ts +89 -84
  338. package/lib/services/configuration.service.d.ts +52 -52
  339. package/lib/services/error-mapper.service.d.ts +7 -7
  340. package/lib/services/index.d.ts +6 -6
  341. package/lib/services/internal/commons-init.provider.d.ts +3 -3
  342. package/lib/services/internal/commons-init.service.d.ts +16 -16
  343. package/lib/services/internal/index.d.ts +2 -2
  344. package/lib/services/navigation.service.d.ts +14 -14
  345. package/lib/services/providers/config-service.provider.d.ts +6 -6
  346. package/lib/services/providers/formly-config.provider.d.ts +4 -4
  347. package/lib/services/providers/index.d.ts +2 -2
  348. package/lib/services/tokens/browser-storage.token.d.ts +2 -2
  349. package/lib/services/tokens/commons-init.token.d.ts +3 -3
  350. package/lib/services/tokens/default-setting.token.d.ts +2 -2
  351. package/lib/services/tokens/index.d.ts +4 -4
  352. package/lib/services/tokens/module-config.token.d.ts +3 -3
  353. package/lib/services/version.service.d.ts +13 -13
  354. package/lib/services/view-container.component.service.d.ts +31 -31
  355. package/lib/styles/button-style.builder.d.ts +67 -67
  356. package/lib/styles/index.d.ts +2 -2
  357. package/lib/styles/models/index.d.ts +2 -2
  358. package/lib/styles/models/style-level.enum.d.ts +10 -10
  359. package/lib/styles/models/style-size.enum.d.ts +7 -7
  360. package/lib/styles/styles.util.d.ts +14 -14
  361. package/lib/types/index.d.ts +2 -2
  362. package/lib/types/type.decorator.d.ts +4 -4
  363. package/lib/types/type.model.d.ts +23 -23
  364. package/lib/utils/action-data-provider.util.d.ts +20 -20
  365. package/lib/utils/date.util.d.ts +7 -7
  366. package/lib/utils/editor-formly.util.d.ts +12 -12
  367. package/lib/utils/enum.util.d.ts +50 -50
  368. package/lib/utils/i18n.util.d.ts +56 -56
  369. package/lib/utils/index.d.ts +9 -9
  370. package/lib/utils/model.util.d.ts +8 -8
  371. package/lib/utils/notification.util.d.ts +12 -11
  372. package/lib/utils/route.util.d.ts +4 -4
  373. package/lib/utils/string.util.d.ts +4 -4
  374. package/lib/utils/tableview.util.d.ts +40 -40
  375. package/lib/utils/type.util.d.ts +57 -57
  376. package/package.json +1 -1
  377. package/public-api.d.ts +34 -34
  378. package/scss/mng-overrides/_theme_datatable.scss +6 -0
  379. package/scss/mng-overrides/_theme_forms.scss +8 -0
  380. package/version-info.json +7 -7
  381. package/mediusinc-mng-commons-0.21.1.tgz +0 -0
@@ -1,219 +1,243 @@
1
- import { ChangeDetectionStrategy, Component, ContentChildren, EventEmitter, Input, Output, ViewChild } from '@angular/core';
2
- import { FormArray, FormGroup } from '@angular/forms';
3
- import { Observable, of } from 'rxjs';
4
- import { MngTemplateDirective } from '../../../directives';
5
- import { EditorFormlyUtil, NotificationUtil } from '../../../utils';
6
- import { MngFormEditorSubmitEvent } from '../models';
7
- import * as i0 from "@angular/core";
8
- import * as i1 from "@ngx-translate/core";
9
- import * as i2 from "@angular/forms";
10
- import * as i3 from "@ngx-formly/core";
11
- import * as i4 from "primeng/button";
12
- import * as i5 from "primeng/messages";
13
- import * as i6 from "@angular/common";
14
- export class MngFormEditorComponent {
15
- constructor(translateService) {
16
- this.translateService = translateService;
17
- this.submitLoading = false;
18
- // extra features input
19
- this.isSubmitButtonVisible = false;
20
- this.isFormDisabled = null;
21
- // event outputs
22
- this.formSubmitEventEmitter = new EventEmitter();
23
- this.form = new FormGroup({});
24
- this.formOptions = {
25
- formState: {
26
- add: false,
27
- edit: false,
28
- disabled: false
29
- }
30
- };
31
- this.formModel = {};
32
- this.formMessages = [];
33
- this.subscriptions = [];
34
- }
35
- ngOnInit() {
36
- this.resetFormModel(this.item);
37
- this.submitLoading$ = this.submitLoading instanceof Observable ? this.submitLoading : of(this.submitLoading);
38
- // init fields for formly
39
- this.formFields = EditorFormlyUtil.createFormlyConfigFromDescriptor(this.descriptor, this);
40
- this.updateFormState();
41
- }
42
- ngOnDestroy() {
43
- this.subscriptions.forEach(s => s.unsubscribe());
44
- }
45
- submit() {
46
- this.submitButtonElementRef?.nativeElement.click();
47
- }
48
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
49
- onSubmit(event) {
50
- this.formOptions.formState.submittedOn = Date.now();
51
- this.formMessages = [];
52
- const formSubmitItem = this.getFormValue();
53
- if (this.form.valid) {
54
- this.formSubmitEventEmitter.next(new MngFormEditorSubmitEvent(formSubmitItem));
55
- }
56
- else {
57
- // find and mark invalid tabs
58
- if (this.formFields[0].type === 'tabs' && this.formFields[0].fieldGroup) {
59
- for (const tab of this.formFields[0].fieldGroup) {
60
- const isInvalid = this.isAnyFieldInvalid(tab.fieldGroup);
61
- this.formOptions.formState['tab_' + (tab.id ? tab.id : tab.props.props.label) + '_invalid'] = isInvalid;
62
- }
63
- }
64
- const event = new MngFormEditorSubmitEvent(formSubmitItem);
65
- event.success = false;
66
- this.formMessages.push(NotificationUtil.getFormEditorWarningMessage(this.translateService, 'mngEditor.invalidFormToastTitle', 'mngEditor.invalidFormToastMessage'));
67
- this.formSubmitEventEmitter.next(event);
68
- }
69
- }
70
- getFormValue() {
71
- const formValue = this.form.getRawValue();
72
- this.descriptor.fields.forEach(field => {
73
- if (field && field.setter) {
74
- const splitPath = field.property.split('.');
75
- let fieldValue = formValue;
76
- for (let i = 0; i < splitPath.length - 1; i++) {
77
- const currentSubPath = splitPath[i];
78
- if (typeof fieldValue[currentSubPath] !== 'object') {
79
- fieldValue[currentSubPath] = {};
80
- }
81
- fieldValue = fieldValue[currentSubPath];
82
- }
83
- fieldValue = fieldValue[splitPath[splitPath.length - 1]];
84
- field.setter(formValue, fieldValue);
85
- }
86
- });
87
- return formValue;
88
- }
89
- resetFormModel(item) {
90
- this.formOrigItem = item;
91
- // TODO: to check if this is ok, could be problems with dates, if so, try lodash
92
- const formModel = JSON.parse(JSON.stringify(item ?? {}));
93
- this.descriptor.fields.forEach(field => {
94
- if (field.getter && item) {
95
- const splitPath = field.property.split('.');
96
- let currentObject = formModel;
97
- for (let i = 0; i < splitPath.length; i++) {
98
- const currentSubPath = splitPath[i];
99
- if (i === splitPath.length - 1) {
100
- currentObject[currentSubPath] = field.getter(item);
101
- }
102
- else {
103
- if (typeof currentObject[currentSubPath] !== 'object') {
104
- currentObject[currentSubPath] = {};
105
- }
106
- currentObject = currentObject[currentSubPath];
107
- }
108
- }
109
- }
110
- });
111
- if (typeof this.formOptions.resetModel === 'function') {
112
- // could not be initiated yet
113
- this.formOptions.resetModel(this.formModel);
114
- }
115
- this.formModel = formModel;
116
- }
117
- getFormField(key) {
118
- return this.findFormField(this.form, key.split('.'));
119
- }
120
- setFormFieldValue(key, value) {
121
- const control = this.getFormField(key);
122
- if (control) {
123
- control.setValue(value);
124
- return true;
125
- }
126
- else {
127
- console.warn(`Value was not set, because field ${key} was not found.`);
128
- return false;
129
- }
130
- }
131
- patchFormFieldValue(key, value) {
132
- const control = this.getFormField(key);
133
- if (control) {
134
- control.patchValue(value);
135
- return true;
136
- }
137
- else {
138
- console.warn(`Value was not set, because field ${key} was not found.`);
139
- return false;
140
- }
141
- }
142
- resetFormFieldValue(key, value) {
143
- const control = this.getFormField(key);
144
- if (control) {
145
- control.reset(value);
146
- return true;
147
- }
148
- else {
149
- console.warn(`Value was not set, because field ${key} was not found.`);
150
- return false;
151
- }
152
- }
153
- findFormField(control, keyPath) {
154
- if (keyPath.length === 0) {
155
- return control;
156
- }
157
- if (keyPath.length === 1) {
158
- return control.get(keyPath[0]);
159
- }
160
- let nextControl = null;
161
- if (control instanceof FormGroup) {
162
- nextControl = control.get(keyPath[0]);
163
- }
164
- else if (control instanceof FormArray) {
165
- const idx = +keyPath[0];
166
- if (!isNaN(idx)) {
167
- nextControl = control.at(idx);
168
- }
169
- }
170
- if (!control) {
171
- return null;
172
- }
173
- return this.findFormField(nextControl, keyPath.slice(1));
174
- }
175
- isAnyFieldInvalid(fields = []) {
176
- for (const field of fields) {
177
- let fieldInvalid = false;
178
- if (Array.isArray(field.fieldGroup)) {
179
- fieldInvalid = this.isAnyFieldInvalid(field.fieldGroup);
180
- }
181
- else if (typeof field.type !== 'undefined') {
182
- fieldInvalid = !field.formControl?.valid;
183
- }
184
- if (fieldInvalid) {
185
- return true;
186
- }
187
- }
188
- return false;
189
- }
190
- updateFormState() {
191
- this.formOptions.formState.disabled = this.isFormDisabled !== null ? this.isFormDisabled === true : this.descriptor.disabled;
192
- }
193
- }
194
- MngFormEditorComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: MngFormEditorComponent, deps: [{ token: i1.TranslateService }], target: i0.ɵɵFactoryTarget.Component });
195
- MngFormEditorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.1.0", type: MngFormEditorComponent, selector: "mng-form-editor", inputs: { descriptor: "descriptor", submitLoading: "submitLoading", item: "item", isSubmitButtonVisible: "isSubmitButtonVisible", isFormDisabled: "isFormDisabled" }, outputs: { formSubmitEventEmitter: "formSubmit" }, queries: [{ propertyName: "templates", predicate: MngTemplateDirective }], viewQueries: [{ propertyName: "submitButtonElementRef", first: true, predicate: ["submitButton"], descendants: true }], ngImport: i0, template: "<form [formGroup]=\"form\" (ngSubmit)=\"onSubmit($event)\">\n <formly-form [form]=\"form\" [fields]=\"formFields\" [options]=\"formOptions\" [model]=\"formModel\"></formly-form>\n <button #submitButton pButton type=\"submit\" [class.hidden]=\"!isSubmitButtonVisible\" [disabled]=\"form.disabled\" [loading]=\"(submitLoading$ | async) ?? false\"></button>\n</form>\n<p-messages [value]=\"formMessages\" [enableService]=\"false\"></p-messages>\n", dependencies: [{ kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i3.FormlyForm, selector: "formly-form", inputs: ["form", "model", "fields", "options"], outputs: ["modelChange"] }, { kind: "directive", type: i4.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading"] }, { kind: "component", type: i5.Messages, selector: "p-messages", inputs: ["value", "closable", "style", "styleClass", "enableService", "key", "escape", "severity", "showTransitionOptions", "hideTransitionOptions"], outputs: ["valueChange"] }, { kind: "pipe", type: i6.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
196
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: MngFormEditorComponent, decorators: [{
197
- type: Component,
198
- args: [{ selector: 'mng-form-editor', changeDetection: ChangeDetectionStrategy.OnPush, template: "<form [formGroup]=\"form\" (ngSubmit)=\"onSubmit($event)\">\n <formly-form [form]=\"form\" [fields]=\"formFields\" [options]=\"formOptions\" [model]=\"formModel\"></formly-form>\n <button #submitButton pButton type=\"submit\" [class.hidden]=\"!isSubmitButtonVisible\" [disabled]=\"form.disabled\" [loading]=\"(submitLoading$ | async) ?? false\"></button>\n</form>\n<p-messages [value]=\"formMessages\" [enableService]=\"false\"></p-messages>\n" }]
199
- }], ctorParameters: function () { return [{ type: i1.TranslateService }]; }, propDecorators: { descriptor: [{
200
- type: Input
201
- }], submitLoading: [{
202
- type: Input
203
- }], item: [{
204
- type: Input
205
- }], isSubmitButtonVisible: [{
206
- type: Input
207
- }], isFormDisabled: [{
208
- type: Input
209
- }], formSubmitEventEmitter: [{
210
- type: Output,
211
- args: ['formSubmit']
212
- }], templates: [{
213
- type: ContentChildren,
214
- args: [MngTemplateDirective]
215
- }], submitButtonElementRef: [{
216
- type: ViewChild,
217
- args: ['submitButton']
218
- }] } });
219
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1lZGl0b3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL2Zvcm0vZWRpdG9yL2Zvcm0tZWRpdG9yLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9mb3JtL2VkaXRvci9mb3JtLWVkaXRvci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBYyxZQUFZLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQWEsU0FBUyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3BLLE9BQU8sRUFBa0IsU0FBUyxFQUFFLFNBQVMsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBS3JFLE9BQU8sRUFBQyxVQUFVLEVBQWdCLEVBQUUsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUdsRCxPQUFPLEVBQUMsb0JBQW9CLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUN6RCxPQUFPLEVBQUMsZ0JBQWdCLEVBQUUsZ0JBQWdCLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUVsRSxPQUFPLEVBQXVCLHdCQUF3QixFQUFDLE1BQU0sV0FBVyxDQUFDOzs7Ozs7OztBQU96RSxNQUFNLE9BQU8sc0JBQXNCO0lBbUMvQixZQUFvQixnQkFBa0M7UUFBbEMscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQWhDdEMsa0JBQWEsR0FBa0MsS0FBSyxDQUFDO1FBS3JFLHVCQUF1QjtRQUNQLDBCQUFxQixHQUFHLEtBQUssQ0FBQztRQUM5QixtQkFBYyxHQUFHLElBQUksQ0FBQztRQUV0QyxnQkFBZ0I7UUFDYSwyQkFBc0IsR0FBRyxJQUFJLFlBQVksRUFBK0IsQ0FBQztRQU0vRixTQUFJLEdBQWMsSUFBSSxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDcEMsZ0JBQVcsR0FBc0I7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QVksRUFBRTtnQkFDZCxPQUFPLElBQUksQ0FBQzthQUNmO1NBQ0o7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBRU8sZUFBZTtRQUNuQixJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLGNBQWMsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQztJQUNqSSxDQUFDOzttSEEvTVEsc0JBQXNCO3VHQUF0QixzQkFBc0IsMFNBZ0JkLG9CQUFvQixxSkNuQ3pDLG1jQUtBOzJGRGNhLHNCQUFzQjtrQkFMbEMsU0FBUzsrQkFDSSxpQkFBaUIsbUJBRVYsdUJBQXVCLENBQUMsTUFBTTt1R0FJL0IsVUFBVTtzQkFBekIsS0FBSztnQkFDVSxhQUFhO3NCQUE1QixLQUFLO2dCQUdVLElBQUk7c0JBQW5CLEtBQUs7Z0JBR1UscUJBQXFCO3NCQUFwQyxLQUFLO2dCQUNVLGNBQWM7c0JBQTdCLEtBQUs7Z0JBR3VCLHNCQUFzQjtzQkFBbEQsTUFBTTt1QkFBQyxZQUFZO2dCQUcwQixTQUFTO3NCQUF0RCxlQUFlO3VCQUFDLG9CQUFvQjtnQkFDSCxzQkFBc0I7c0JBQXZELFNBQVM7dUJBQUMsY0FBYyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgQ29udGVudENoaWxkcmVuLCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3V0cHV0LCBRdWVyeUxpc3QsIFZpZXdDaGlsZH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0Fic3RyYWN0Q29udHJvbCwgRm9ybUFycmF5LCBGb3JtR3JvdXB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuaW1wb3J0IHtGb3JtbHlGaWVsZENvbmZpZywgRm9ybWx5Rm9ybU9wdGlvbnN9IGZyb20gJ0BuZ3gtZm9ybWx5L2NvcmUnO1xuaW1wb3J0IHtUcmFuc2xhdGVTZXJ2aWNlfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7TWVzc2FnZX0gZnJvbSAncHJpbWVuZy9hcGknO1xuaW1wb3J0IHtPYnNlcnZhYmxlLCBTdWJzY3JpcHRpb24sIG9mfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHtFZGl0b3JEZXNjcmlwdG9yfSBmcm9tICcuLi8uLi8uLi9kZXNjcmlwdG9ycyc7XG5pbXBvcnQge01uZ1RlbXBsYXRlRGlyZWN0aXZlfSBmcm9tICcuLi8uLi8uLi9kaXJlY3RpdmVzJztcbmltcG9ydCB7RWRpdG9yRm9ybWx5VXRpbCwgTm90aWZpY2F0aW9uVXRpbH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMnO1xuaW1wb3J0IHtNbmdGb3JtbHlGaWVsZENvbmZpZ30gZnJvbSAnLi4vZm9ybWx5L21vZGVscyc7XG5pbXBvcnQge0lGb3JtRWRpdG9yQ29tcG9uZW50LCBNbmdGb3JtRWRpdG9yU3VibWl0RXZlbnR9IGZyb20gJy4uL21vZGVscyc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnbW5nLWZvcm0tZWRpdG9yJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vZm9ybS1lZGl0b3IuY29tcG9uZW50Lmh0bWwnLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIE1uZ0Zvcm1FZGl0b3JDb21wb25lbnQ8VD4gaW1wbGVtZW50cyBJRm9ybUVkaXRvckNvbXBvbmVudDxUPiwgT25Jbml0LCBPbkRlc3Ryb3kge1xuICAgIC8vIG1ldGFkYXRhIGFuZCBlZGl0b3IgbW9kZSBpbnB1dFxuICAgIEBJbnB1dCgpIHB1YmxpYyBkZXNjcmlwdG9yITogRWRpdG9yRGVzY3JpcHRvcjxUPjtcbiAgICBASW5wdXQoKSBwdWJsaWMgc3VibWl0TG9hZGluZzogT2JzZXJ2YWJsZTxib29sZWFuPiB8IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIC8vIGRhdGEgc291cmNlIGlucHV0cztcbiAgICBASW5wdXQoKSBwdWJsaWMgaXRlbT86IFQ7XG5cbiAgICAvLyBleHRyYSBmZWF0dXJlcyBpbnB1dFxuICAgIEBJbnB1dCgpIHB1YmxpYyBpc1N1Ym1pdEJ1dHRvblZpc2libGUgPSBmYWxzZTtcbiAgICBASW5wdXQoKSBwdWJsaWMgaXNGb3JtRGlzYWJsZWQgPSBudWxsO1xuXG4gICAgLy8gZXZlbnQgb3V0cHV0c1xuICAgIEBPdXRwdXQoJ2Zvcm1TdWJtaXQnKSBwdWJsaWMgZm9ybVN1Ym1pdEV2ZW50RW1pdHRlciA9IG5ldyBFdmVudEVtaXR0ZXI8TW5nRm9ybUVkaXRvclN1Ym1pdEV2ZW50PFQ+PigpO1xuXG4gICAgLy8gY29udGVudCBhbmQgdmlldyBxdWVyaWVzXG4gICAgQENvbnRlbnRDaGlsZHJlbihNbmdUZW1wbGF0ZURpcmVjdGl2ZSkgcHVibGljIHRlbXBsYXRlcyE6IFF1ZXJ5TGlzdDxNbmdUZW1wbGF0ZURpcmVjdGl2ZT47XG4gICAgQFZpZXdDaGlsZCgnc3VibWl0QnV0dG9uJykgcHVibGljIHN1Ym1pdEJ1dHRvbkVsZW1lbnRSZWY/OiBFbGVtZW50UmVmO1xuXG4gICAgcHVibGljIGZvcm06IEZvcm1Hcm91cCA9IG5ldyBGb3JtR3JvdXAoe30pO1xuICAgIHB1YmxpYyBmb3JtT3B0aW9uczogRm9ybWx5Rm9ybU9wdGlvbnMgPSB7XG4gICAgICAgIGZvcm1TdGF0ZToge1xuICAgICAgICAgICAgYWRkOiBmYWxzZSxcbiAgICAgICAgICAgIGVkaXQ6IGZhbHNlLFxuICAgICAgICAgICAgZGlzYWJsZWQ6IGZhbHNlXG4gICAgICAgIH1cbiAgICB9O1xuICAgIHB1YmxpYyBmb3JtRmllbGRzITogRm9ybWx5RmllbGRDb25maWdbXTtcbiAgICBwdWJsaWMgZm9ybU9yaWdJdGVtPzogVDtcbiAgICBwdWJsaWMgZm9ybU1vZGVsOiBhbnkgPSB7fTtcbiAgICBwdWJsaWMgZm9ybU1lc3NhZ2VzOiBNZXNzYWdlW10gPSBbXTtcbiAgICBwdWJsaWMgc3VibWl0TG9hZGluZyQhOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuXG4gICAgcHJpdmF0ZSBzdWJzY3JpcHRpb25zOiBTdWJzY3JpcHRpb25bXSA9IFtdO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSB0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlKSB7fVxuXG4gICAgcHVibGljIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLnJlc2V0Rm9ybU1vZGVsKHRoaXMuaXRlbSk7XG4gICAgICAgIHRoaXMuc3VibWl0TG9hZGluZyQgPSB0aGlzLnN1Ym1pdExvYWRpbmcgaW5zdGFuY2VvZiBPYnNlcnZhYmxlID8gdGhpcy5zdWJtaXRMb2FkaW5nIDogb2YodGhpcy5zdWJtaXRMb2FkaW5nKTtcblxuICAgICAgICAvLyBpbml0IGZpZWxkcyBmb3IgZm9ybWx5XG4gICAgICAgIHRoaXMuZm9ybUZpZWxkcyA9IEVkaXRvckZvcm1seVV0aWwuY3JlYXRlRm9ybWx5Q29uZmlnRnJvbURlc2NyaXB0b3IodGhpcy5kZXNjcmlwdG9yLCB0aGlzKTtcbiAgICAgICAgdGhpcy51cGRhdGVGb3JtU3RhdGUoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5mb3JFYWNoKHMgPT4gcy51bnN1YnNjcmliZSgpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3VibWl0KCkge1xuICAgICAgICB0aGlzLnN1Ym1pdEJ1dHRvbkVsZW1lbnRSZWY/Lm5hdGl2ZUVsZW1lbnQuY2xpY2soKTtcbiAgICB9XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgcHVibGljIG9uU3VibWl0KGV2ZW50OiBFdmVudCkge1xuICAgICAgICB0aGlzLmZvcm1PcHRpb25zLmZvcm1TdGF0ZS5zdWJtaXR0ZWRPbiA9IERhdGUubm93KCk7XG4gICAgICAgIHRoaXMuZm9ybU1lc3NhZ2VzID0gW107XG5cbiAgICAgICAgY29uc3QgZm9ybVN1Ym1pdEl0ZW0gPSB0aGlzLmdldEZvcm1WYWx1ZSgpO1xuICAgICAgICBpZiAodGhpcy5mb3JtLnZhbGlkKSB7XG4gICAgICAgICAgICB0aGlzLmZvcm1TdWJtaXRFdmVudEVtaXR0ZXIubmV4dChuZXcgTW5nRm9ybUVkaXRvclN1Ym1pdEV2ZW50KGZvcm1TdWJtaXRJdGVtKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBmaW5kIGFuZCBtYXJrIGludmFsaWQgdGFic1xuICAgICAgICAgICAgaWYgKHRoaXMuZm9ybUZpZWxkc1swXS50eXBlID09PSAndGFicycgJiYgdGhpcy5mb3JtRmllbGRzWzBdLmZpZWxkR3JvdXApIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHRhYiBvZiB0aGlzLmZvcm1GaWVsZHNbMF0uZmllbGRHcm91cCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpc0ludmFsaWQgPSB0aGlzLmlzQW55RmllbGRJbnZhbGlkKHRhYi5maWVsZEdyb3VwKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtT3B0aW9ucy5mb3JtU3RhdGVbJ3RhYl8nICsgKHRhYi5pZCA/IHRhYi5pZCA6ICh0YWIucHJvcHMgYXMgTW5nRm9ybWx5RmllbGRDb25maWcpLnByb3BzLmxhYmVsKSArICdfaW52YWxpZCddID0gaXNJbnZhbGlkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0gbmV3IE1uZ0Zvcm1FZGl0b3JTdWJtaXRFdmVudChmb3JtU3VibWl0SXRlbSk7XG4gICAgICAgICAgICBldmVudC5zdWNjZXNzID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmZvcm1NZXNzYWdlcy5wdXNoKE5vdGlmaWNhdGlvblV0aWwuZ2V0Rm9ybUVkaXRvcldhcm5pbmdNZXNzYWdlKHRoaXMudHJhbnNsYXRlU2VydmljZSwgJ21uZ0VkaXRvci5pbnZhbGlkRm9ybVRvYXN0VGl0bGUnLCAnbW5nRWRpdG9yLmludmFsaWRGb3JtVG9hc3RNZXNzYWdlJykpO1xuICAgICAgICAgICAgdGhpcy5mb3JtU3VibWl0RXZlbnRFbWl0dGVyLm5leHQoZXZlbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldEZvcm1WYWx1ZSgpOiBUIHtcbiAgICAgICAgY29uc3QgZm9ybVZhbHVlID0gdGhpcy5mb3JtLmdldFJhd1ZhbHVlKCk7XG4gICAgICAgIHRoaXMuZGVzY3JpcHRvci5maWVsZHMuZm9yRWFjaChmaWVsZCA9PiB7XG4gICAgICAgICAgICBpZiAoZmllbGQgJiYgZmllbGQuc2V0dGVyKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3BsaXRQYXRoID0gZmllbGQucHJvcGVydHkuc3BsaXQoJy4nKTtcbiAgICAgICAgICAgICAgICBsZXQgZmllbGRWYWx1ZSA9IGZvcm1WYWx1ZTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNwbGl0UGF0aC5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VycmVudFN1YlBhdGggPSBzcGxpdFBhdGhbaV07XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZmllbGRWYWx1ZVtjdXJyZW50U3ViUGF0aF0gIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWVsZFZhbHVlW2N1cnJlbnRTdWJQYXRoXSA9IHt9O1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgZmllbGRWYWx1ZSA9IGZpZWxkVmFsdWVbY3VycmVudFN1YlBhdGhdO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGZpZWxkVmFsdWUgPSBmaWVsZFZhbHVlW3NwbGl0UGF0aFtzcGxpdFBhdGgubGVuZ3RoIC0gMV1dO1xuICAgICAgICAgICAgICAgIGZpZWxkLnNldHRlcihmb3JtVmFsdWUsIGZpZWxkVmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGZvcm1WYWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVzZXRGb3JtTW9kZWwoaXRlbT86IFQpIHtcbiAgICAgICAgdGhpcy5mb3JtT3JpZ0l0ZW0gPSBpdGVtO1xuICAgICAgICAvLyBUT0RPOiB0byBjaGVjayBpZiB0aGlzIGlzIG9rLCBjb3VsZCBiZSBwcm9ibGVtcyB3aXRoIGRhdGVzLCBpZiBzbywgdHJ5IGxvZGFzaFxuICAgICAgICBjb25zdCBmb3JtTW9kZWwgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGl0ZW0gPz8ge30pKTtcblxuICAgICAgICB0aGlzLmRlc2NyaXB0b3IuZmllbGRzLmZvckVhY2goZmllbGQgPT4ge1xuICAgICAgICAgICAgaWYgKGZpZWxkLmdldHRlciAmJiBpdGVtKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3BsaXRQYXRoID0gZmllbGQucHJvcGVydHkuc3BsaXQoJy4nKTtcbiAgICAgICAgICAgICAgICBsZXQgY3VycmVudE9iamVjdCA9IGZvcm1Nb2RlbDtcblxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3BsaXRQYXRoLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRTdWJQYXRoID0gc3BsaXRQYXRoW2ldO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PT0gc3BsaXRQYXRoLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRPYmplY3RbY3VycmVudFN1YlBhdGhdID0gZmllbGQuZ2V0dGVyKGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjdXJyZW50T2JqZWN0W2N1cnJlbnRTdWJQYXRoXSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50T2JqZWN0W2N1cnJlbnRTdWJQYXRoXSA9IHt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50T2JqZWN0ID0gY3VycmVudE9iamVjdFtjdXJyZW50U3ViUGF0aF07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuZm9ybU9wdGlvbnMucmVzZXRNb2RlbCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgLy8gY291bGQgbm90IGJlIGluaXRpYXRlZCB5ZXRcbiAgICAgICAgICAgIHRoaXMuZm9ybU9wdGlvbnMucmVzZXRNb2RlbCh0aGlzLmZvcm1Nb2RlbCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5mb3JtTW9kZWwgPSBmb3JtTW9kZWw7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEZvcm1GaWVsZChrZXk6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5maW5kRm9ybUZpZWxkKHRoaXMuZm9ybSwga2V5LnNwbGl0KCcuJykpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRGb3JtRmllbGRWYWx1ZShrZXk6IHN0cmluZywgdmFsdWU6IGFueSkge1xuICAgICAgICBjb25zdCBjb250cm9sID0gdGhpcy5nZXRGb3JtRmllbGQoa2V5KTtcbiAgICAgICAgaWYgKGNvbnRyb2wpIHtcbiAgICAgICAgICAgIGNvbnRyb2wuc2V0VmFsdWUodmFsdWUpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYFZhbHVlIHdhcyBub3Qgc2V0LCBiZWNhdXNlIGZpZWxkICR7a2V5fSB3YXMgbm90IGZvdW5kLmApO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHBhdGNoRm9ybUZpZWxkVmFsdWUoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgICAgICAgY29uc3QgY29udHJvbCA9IHRoaXMuZ2V0Rm9ybUZpZWxkKGtleSk7XG4gICAgICAgIGlmIChjb250cm9sKSB7XG4gICAgICAgICAgICBjb250cm9sLnBhdGNoVmFsdWUodmFsdWUpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYFZhbHVlIHdhcyBub3Qgc2V0LCBiZWNhdXNlIGZpZWxkICR7a2V5fSB3YXMgbm90IGZvdW5kLmApO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHJlc2V0Rm9ybUZpZWxkVmFsdWUoa2V5OiBzdHJpbmcsIHZhbHVlPzogYW55KSB7XG4gICAgICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmdldEZvcm1GaWVsZChrZXkpO1xuICAgICAgICBpZiAoY29udHJvbCkge1xuICAgICAgICAgICAgY29udHJvbC5yZXNldCh2YWx1ZSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgVmFsdWUgd2FzIG5vdCBzZXQsIGJlY2F1c2UgZmllbGQgJHtrZXl9IHdhcyBub3QgZm91bmQuYCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGZpbmRGb3JtRmllbGQoY29udHJvbDogQWJzdHJhY3RDb250cm9sLCBrZXlQYXRoOiBzdHJpbmdbXSk6IEFic3RyYWN0Q29udHJvbCB8IG51bGwge1xuICAgICAgICBpZiAoa2V5UGF0aC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBjb250cm9sO1xuICAgICAgICB9XG4gICAgICAgIGlmIChrZXlQYXRoLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbnRyb2wuZ2V0KGtleVBhdGhbMF0pO1xuICAgICAgICB9XG4gICAgICAgIGxldCBuZXh0Q29udHJvbDogQWJzdHJhY3RDb250cm9sIHwgbnVsbCA9IG51bGw7XG4gICAgICAgIGlmIChjb250cm9sIGluc3RhbmNlb2YgRm9ybUdyb3VwKSB7XG4gICAgICAgICAgICBuZXh0Q29udHJvbCA9IGNvbnRyb2wuZ2V0KGtleVBhdGhbMF0pO1xuICAgICAgICB9IGVsc2UgaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBGb3JtQXJyYXkpIHtcbiAgICAgICAgICAgIGNvbnN0IGlkeCA9ICtrZXlQYXRoWzBdO1xuICAgICAgICAgICAgaWYgKCFpc05hTihpZHgpKSB7XG4gICAgICAgICAgICAgICAgbmV4dENvbnRyb2wgPSBjb250cm9sLmF0KGlkeCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWNvbnRyb2wpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmZpbmRGb3JtRmllbGQobmV4dENvbnRyb2whLCBrZXlQYXRoLnNsaWNlKDEpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzQW55RmllbGRJbnZhbGlkKGZpZWxkczogRm9ybWx5RmllbGRDb25maWdbXSA9IFtdKTogYm9vbGVhbiB7XG4gICAgICAgIGZvciAoY29uc3QgZmllbGQgb2YgZmllbGRzKSB7XG4gICAgICAgICAgICBsZXQgZmllbGRJbnZhbGlkID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShmaWVsZC5maWVsZEdyb3VwKSkge1xuICAgICAgICAgICAgICAgIGZpZWxkSW52YWxpZCA9IHRoaXMuaXNBbnlGaWVsZEludmFsaWQoZmllbGQuZmllbGRHcm91cCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBmaWVsZC50eXBlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIGZpZWxkSW52YWxpZCA9ICFmaWVsZC5mb3JtQ29udHJvbD8udmFsaWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZmllbGRJbnZhbGlkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlRm9ybVN0YXRlKCkge1xuICAgICAgICB0aGlzLmZvcm1PcHRpb25zLmZvcm1TdGF0ZS5kaXNhYmxlZCA9IHRoaXMuaXNGb3JtRGlzYWJsZWQgIT09IG51bGwgPyB0aGlzLmlzRm9ybURpc2FibGVkID09PSB0cnVlIDogdGhpcy5kZXNjcmlwdG9yLmRpc2FibGVkO1xuICAgIH1cbn1cbiIsIjxmb3JtIFtmb3JtR3JvdXBdPVwiZm9ybVwiIChuZ1N1Ym1pdCk9XCJvblN1Ym1pdCgkZXZlbnQpXCI+XG4gICAgPGZvcm1seS1mb3JtIFtmb3JtXT1cImZvcm1cIiBbZmllbGRzXT1cImZvcm1GaWVsZHNcIiBbb3B0aW9uc109XCJmb3JtT3B0aW9uc1wiIFttb2RlbF09XCJmb3JtTW9kZWxcIj48L2Zvcm1seS1mb3JtPlxuICAgIDxidXR0b24gI3N1Ym1pdEJ1dHRvbiBwQnV0dG9uIHR5cGU9XCJzdWJtaXRcIiBbY2xhc3MuaGlkZGVuXT1cIiFpc1N1Ym1pdEJ1dHRvblZpc2libGVcIiBbZGlzYWJsZWRdPVwiZm9ybS5kaXNhYmxlZFwiIFtsb2FkaW5nXT1cIihzdWJtaXRMb2FkaW5nJCB8IGFzeW5jKSA/PyBmYWxzZVwiPjwvYnV0dG9uPlxuPC9mb3JtPlxuPHAtbWVzc2FnZXMgW3ZhbHVlXT1cImZvcm1NZXNzYWdlc1wiIFtlbmFibGVTZXJ2aWNlXT1cImZhbHNlXCI+PC9wLW1lc3NhZ2VzPlxuIl19
1
+ import { ChangeDetectionStrategy, Component, ContentChildren, EventEmitter, Input, Output, ViewChild } from '@angular/core';
2
+ import { FormArray, FormGroup } from '@angular/forms';
3
+ import { Observable, of } from 'rxjs';
4
+ import { TableviewEditorTypeEnum } from '../../../descriptors/types';
5
+ import { MngTemplateDirective } from '../../../directives';
6
+ import { EditorFormlyUtil, NotificationUtil } from '../../../utils';
7
+ import { MngFormEditorSubmitEvent } from '../models';
8
+ import * as i0 from "@angular/core";
9
+ import * as i1 from "../../../services";
10
+ import * as i2 from "@ngx-translate/core";
11
+ import * as i3 from "@angular/forms";
12
+ import * as i4 from "@ngx-formly/core";
13
+ import * as i5 from "primeng/button";
14
+ import * as i6 from "primeng/messages";
15
+ import * as i7 from "@angular/common";
16
+ export class MngFormEditorComponent {
17
+ constructor(mngCommonsService, translateService) {
18
+ this.mngCommonsService = mngCommonsService;
19
+ this.translateService = translateService;
20
+ this.submitLoading = false;
21
+ // extra features input
22
+ this.isSubmitButtonVisible = false;
23
+ this.isFormDisabled = null;
24
+ // event outputs
25
+ this.formSubmitEventEmitter = new EventEmitter();
26
+ this.form = new FormGroup({});
27
+ this.formOptions = {
28
+ formState: {
29
+ add: false,
30
+ edit: false,
31
+ disabled: false
32
+ }
33
+ };
34
+ this.formModel = {};
35
+ this.formMessages = [];
36
+ this.subscriptions = [];
37
+ }
38
+ ngOnInit() {
39
+ this.setInitialFormState();
40
+ this.resetFormModel(this.item);
41
+ this.submitLoading$ = this.submitLoading instanceof Observable ? this.submitLoading : of(this.submitLoading);
42
+ // init fields for formly
43
+ this.formFields = EditorFormlyUtil.createFormlyConfigFromDescriptor(this.descriptor, this);
44
+ this.updateFormState();
45
+ // let the user know, that adding new value in table view with localizations is only supported in the default language
46
+ if (this.descriptor.isLocalized &&
47
+ (this.descriptor.tableviewEditorType === TableviewEditorTypeEnum.Add || this.descriptor.tableviewEditorType === TableviewEditorTypeEnum.Edit)) {
48
+ this.formMessages.push(NotificationUtil.getFormEditorInfoMessage(this.translateService, 'mngEditor.localizations.addInDefaultLanguageTitle', 'mngEditor.localizations.addInDefaultLanguageDescription', { defaultLanguage: this.mngCommonsService.defaultDataLanguage }));
49
+ }
50
+ }
51
+ ngOnDestroy() {
52
+ this.subscriptions.forEach(s => s.unsubscribe());
53
+ }
54
+ submit() {
55
+ this.submitButtonElementRef?.nativeElement.click();
56
+ }
57
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
58
+ onSubmit(event) {
59
+ this.formOptions.formState.submittedOn = Date.now();
60
+ this.formMessages = [];
61
+ const formSubmitItem = this.getFormValue();
62
+ if (this.form.valid) {
63
+ this.formSubmitEventEmitter.next(new MngFormEditorSubmitEvent(formSubmitItem));
64
+ }
65
+ else {
66
+ // find and mark invalid tabs
67
+ if (this.formFields[0].type === 'tabs' && this.formFields[0].fieldGroup) {
68
+ for (const tab of this.formFields[0].fieldGroup) {
69
+ const isInvalid = this.isAnyFieldInvalid(tab.fieldGroup);
70
+ this.formOptions.formState['tab_' + (tab.id ? tab.id : tab.props.props.label) + '_invalid'] = isInvalid;
71
+ }
72
+ }
73
+ const event = new MngFormEditorSubmitEvent(formSubmitItem);
74
+ event.success = false;
75
+ this.formMessages.push(NotificationUtil.getFormEditorWarningMessage(this.translateService, 'mngEditor.invalidFormToastTitle', 'mngEditor.invalidFormToastMessage'));
76
+ this.formSubmitEventEmitter.next(event);
77
+ }
78
+ }
79
+ getFormValue() {
80
+ const formValue = this.form.getRawValue();
81
+ this.descriptor.fields.forEach(field => {
82
+ if (field && field.setter) {
83
+ const splitPath = field.property.split('.');
84
+ let fieldValue = formValue;
85
+ for (let i = 0; i < splitPath.length - 1; i++) {
86
+ const currentSubPath = splitPath[i];
87
+ if (typeof fieldValue[currentSubPath] !== 'object') {
88
+ fieldValue[currentSubPath] = {};
89
+ }
90
+ fieldValue = fieldValue[currentSubPath];
91
+ }
92
+ fieldValue = fieldValue[splitPath[splitPath.length - 1]];
93
+ field.setter(formValue, fieldValue);
94
+ }
95
+ });
96
+ return formValue;
97
+ }
98
+ resetFormModel(item) {
99
+ this.formOrigItem = item;
100
+ // TODO: to check if this is ok, could be problems with dates, if so, try lodash
101
+ const formModel = JSON.parse(JSON.stringify(item ?? {}));
102
+ this.descriptor.fields.forEach(field => {
103
+ if (field.getter && item) {
104
+ const splitPath = field.property.split('.');
105
+ let currentObject = formModel;
106
+ for (let i = 0; i < splitPath.length; i++) {
107
+ const currentSubPath = splitPath[i];
108
+ if (i === splitPath.length - 1) {
109
+ currentObject[currentSubPath] = field.getter(item);
110
+ }
111
+ else {
112
+ if (typeof currentObject[currentSubPath] !== 'object') {
113
+ currentObject[currentSubPath] = {};
114
+ }
115
+ currentObject = currentObject[currentSubPath];
116
+ }
117
+ }
118
+ }
119
+ });
120
+ if (typeof this.formOptions.resetModel === 'function') {
121
+ // could not be initiated yet
122
+ this.formOptions.resetModel(this.formModel);
123
+ }
124
+ this.formModel = formModel;
125
+ }
126
+ getFormField(key) {
127
+ return this.findFormField(this.form, key.split('.'));
128
+ }
129
+ setFormFieldValue(key, value) {
130
+ const control = this.getFormField(key);
131
+ if (control) {
132
+ control.setValue(value);
133
+ return true;
134
+ }
135
+ else {
136
+ console.warn(`Value was not set, because field ${key} was not found.`);
137
+ return false;
138
+ }
139
+ }
140
+ patchFormFieldValue(key, value) {
141
+ const control = this.getFormField(key);
142
+ if (control) {
143
+ control.patchValue(value);
144
+ return true;
145
+ }
146
+ else {
147
+ console.warn(`Value was not set, because field ${key} was not found.`);
148
+ return false;
149
+ }
150
+ }
151
+ resetFormFieldValue(key, value) {
152
+ const control = this.getFormField(key);
153
+ if (control) {
154
+ control.reset(value);
155
+ return true;
156
+ }
157
+ else {
158
+ console.warn(`Value was not set, because field ${key} was not found.`);
159
+ return false;
160
+ }
161
+ }
162
+ findFormField(control, keyPath) {
163
+ if (keyPath.length === 0) {
164
+ return control;
165
+ }
166
+ if (keyPath.length === 1) {
167
+ return control.get(keyPath[0]);
168
+ }
169
+ let nextControl = null;
170
+ if (control instanceof FormGroup) {
171
+ nextControl = control.get(keyPath[0]);
172
+ }
173
+ else if (control instanceof FormArray) {
174
+ const idx = +keyPath[0];
175
+ if (!isNaN(idx)) {
176
+ nextControl = control.at(idx);
177
+ }
178
+ }
179
+ if (!control) {
180
+ return null;
181
+ }
182
+ return this.findFormField(nextControl, keyPath.slice(1));
183
+ }
184
+ isAnyFieldInvalid(fields = []) {
185
+ for (const field of fields) {
186
+ let fieldInvalid = false;
187
+ if (Array.isArray(field.fieldGroup)) {
188
+ fieldInvalid = this.isAnyFieldInvalid(field.fieldGroup);
189
+ }
190
+ else if (typeof field.type !== 'undefined') {
191
+ fieldInvalid = !field.formControl?.valid;
192
+ }
193
+ if (fieldInvalid) {
194
+ return true;
195
+ }
196
+ }
197
+ return false;
198
+ }
199
+ updateFormState() {
200
+ this.formOptions.formState.disabled = this.isFormDisabled !== null ? this.isFormDisabled === true : this.descriptor.disabled;
201
+ }
202
+ /**
203
+ * @private Sets form state based on editor descriptor type.
204
+ * Possible options are: disabled, add or edit.
205
+ */
206
+ setInitialFormState() {
207
+ if (this.descriptor.tableviewEditorType === TableviewEditorTypeEnum.Add) {
208
+ this.formOptions.formState.add = true;
209
+ }
210
+ else if (this.descriptor.tableviewEditorType === TableviewEditorTypeEnum.Edit) {
211
+ this.formOptions.formState.edit = true;
212
+ }
213
+ else if (this.descriptor.tableviewEditorType === TableviewEditorTypeEnum.Details) {
214
+ this.formOptions.formState.disabled = true;
215
+ }
216
+ }
217
+ }
218
+ MngFormEditorComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: MngFormEditorComponent, deps: [{ token: i1.MngCommonsService }, { token: i2.TranslateService }], target: i0.ɵɵFactoryTarget.Component });
219
+ MngFormEditorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.1.0", type: MngFormEditorComponent, selector: "mng-form-editor", inputs: { descriptor: "descriptor", submitLoading: "submitLoading", item: "item", isSubmitButtonVisible: "isSubmitButtonVisible", isFormDisabled: "isFormDisabled" }, outputs: { formSubmitEventEmitter: "formSubmit" }, queries: [{ propertyName: "templates", predicate: MngTemplateDirective }], viewQueries: [{ propertyName: "submitButtonElementRef", first: true, predicate: ["submitButton"], descendants: true }], ngImport: i0, template: "<form [formGroup]=\"form\" (ngSubmit)=\"onSubmit($event)\">\n <formly-form [form]=\"form\" [fields]=\"formFields\" [options]=\"formOptions\" [model]=\"formModel\"></formly-form>\n <button #submitButton pButton type=\"submit\" [class.hidden]=\"!isSubmitButtonVisible\" [disabled]=\"form.disabled\" [loading]=\"(submitLoading$ | async) ?? false\"></button>\n</form>\n<p-messages [value]=\"formMessages\" [enableService]=\"false\"></p-messages>\n", dependencies: [{ kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i4.FormlyForm, selector: "formly-form", inputs: ["form", "model", "fields", "options"], outputs: ["modelChange"] }, { kind: "directive", type: i5.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading"] }, { kind: "component", type: i6.Messages, selector: "p-messages", inputs: ["value", "closable", "style", "styleClass", "enableService", "key", "escape", "severity", "showTransitionOptions", "hideTransitionOptions"], outputs: ["valueChange"] }, { kind: "pipe", type: i7.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
220
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: MngFormEditorComponent, decorators: [{
221
+ type: Component,
222
+ args: [{ selector: 'mng-form-editor', changeDetection: ChangeDetectionStrategy.OnPush, template: "<form [formGroup]=\"form\" (ngSubmit)=\"onSubmit($event)\">\n <formly-form [form]=\"form\" [fields]=\"formFields\" [options]=\"formOptions\" [model]=\"formModel\"></formly-form>\n <button #submitButton pButton type=\"submit\" [class.hidden]=\"!isSubmitButtonVisible\" [disabled]=\"form.disabled\" [loading]=\"(submitLoading$ | async) ?? false\"></button>\n</form>\n<p-messages [value]=\"formMessages\" [enableService]=\"false\"></p-messages>\n" }]
223
+ }], ctorParameters: function () { return [{ type: i1.MngCommonsService }, { type: i2.TranslateService }]; }, propDecorators: { descriptor: [{
224
+ type: Input
225
+ }], submitLoading: [{
226
+ type: Input
227
+ }], item: [{
228
+ type: Input
229
+ }], isSubmitButtonVisible: [{
230
+ type: Input
231
+ }], isFormDisabled: [{
232
+ type: Input
233
+ }], formSubmitEventEmitter: [{
234
+ type: Output,
235
+ args: ['formSubmit']
236
+ }], templates: [{
237
+ type: ContentChildren,
238
+ args: [MngTemplateDirective]
239
+ }], submitButtonElementRef: [{
240
+ type: ViewChild,
241
+ args: ['submitButton']
242
+ }] } });
243
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1lZGl0b3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL2Zvcm0vZWRpdG9yL2Zvcm0tZWRpdG9yLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9mb3JtL2VkaXRvci9mb3JtLWVkaXRvci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBYyxZQUFZLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQWEsU0FBUyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3BLLE9BQU8sRUFBa0IsU0FBUyxFQUFFLFNBQVMsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBS3JFLE9BQU8sRUFBQyxVQUFVLEVBQWdCLEVBQUUsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUdsRCxPQUFPLEVBQUMsdUJBQXVCLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQztBQUNuRSxPQUFPLEVBQUMsb0JBQW9CLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUV6RCxPQUFPLEVBQUMsZ0JBQWdCLEVBQUUsZ0JBQWdCLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUVsRSxPQUFPLEVBQXVCLHdCQUF3QixFQUFDLE1BQU0sV0FBVyxDQUFDOzs7Ozs7Ozs7QUFPekUsTUFBTSxPQUFPLHNCQUFzQjtJQW1DL0IsWUFBb0IsaUJBQW9DLEVBQVUsZ0JBQWtDO1FBQWhGLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFBVSxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBaENwRixrQkFBYSxHQUFrQyxLQUFLLENBQUM7UUFLckUsdUJBQXVCO1FBQ1AsMEJBQXFCLEdBQUcsS0FBSyxDQUFDO1FBQzlCLG1CQUFjLEdBQUcsSUFBSSxDQUFDO1FBRXRDLGdCQUFnQjtRQUNhLDJCQUFzQixH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QUFDLG1CQUFtQixLQUFLLHVCQUF1QixDQUFDLElBQUksRUFBRTtZQUM3RSxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1NBQzFDO2FBQU0sSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLG1CQUFtQixLQUFLLHVCQUF1QixDQUFDLE9BQU8sRUFBRTtZQUNoRixJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1NBQzlDO0lBQ0wsQ0FBQzs7bUhBN09RLHNCQUFzQjt1R0FBdEIsc0JBQXNCLDBTQWdCZCxvQkFBb0IscUpDckN6QyxtY0FLQTsyRkRnQmEsc0JBQXNCO2tCQUxsQyxTQUFTOytCQUNJLGlCQUFpQixtQkFFVix1QkFBdUIsQ0FBQyxNQUFNO3VJQUkvQixVQUFVO3NCQUF6QixLQUFLO2dCQUNVLGFBQWE7c0JBQTVCLEtBQUs7Z0JBR1UsSUFBSTtzQkFBbkIsS0FBSztnQkFHVSxxQkFBcUI7c0JBQXBDLEtBQUs7Z0JBQ1UsY0FBYztzQkFBN0IsS0FBSztnQkFHdUIsc0JBQXNCO3NCQUFsRCxNQUFNO3VCQUFDLFlBQVk7Z0JBRzBCLFNBQVM7c0JBQXRELGVBQWU7dUJBQUMsb0JBQW9CO2dCQUNILHNCQUFzQjtzQkFBdkQsU0FBUzt1QkFBQyxjQUFjIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBDb250ZW50Q2hpbGRyZW4sIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0LCBPdXRwdXQsIFF1ZXJ5TGlzdCwgVmlld0NoaWxkfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7QWJzdHJhY3RDb250cm9sLCBGb3JtQXJyYXksIEZvcm1Hcm91cH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5pbXBvcnQge0Zvcm1seUZpZWxkQ29uZmlnLCBGb3JtbHlGb3JtT3B0aW9uc30gZnJvbSAnQG5neC1mb3JtbHkvY29yZSc7XG5pbXBvcnQge1RyYW5zbGF0ZVNlcnZpY2V9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHtNZXNzYWdlfSBmcm9tICdwcmltZW5nL2FwaSc7XG5pbXBvcnQge09ic2VydmFibGUsIFN1YnNjcmlwdGlvbiwgb2Z9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQge0VkaXRvckRlc2NyaXB0b3J9IGZyb20gJy4uLy4uLy4uL2Rlc2NyaXB0b3JzJztcbmltcG9ydCB7VGFibGV2aWV3RWRpdG9yVHlwZUVudW19IGZyb20gJy4uLy4uLy4uL2Rlc2NyaXB0b3JzL3R5cGVzJztcbmltcG9ydCB7TW5nVGVtcGxhdGVEaXJlY3RpdmV9IGZyb20gJy4uLy4uLy4uL2RpcmVjdGl2ZXMnO1xuaW1wb3J0IHtNbmdDb21tb25zU2VydmljZX0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMnO1xuaW1wb3J0IHtFZGl0b3JGb3JtbHlVdGlsLCBOb3RpZmljYXRpb25VdGlsfSBmcm9tICcuLi8uLi8uLi91dGlscyc7XG5pbXBvcnQge01uZ0Zvcm1seUZpZWxkQ29uZmlnfSBmcm9tICcuLi9mb3JtbHkvbW9kZWxzJztcbmltcG9ydCB7SUZvcm1FZGl0b3JDb21wb25lbnQsIE1uZ0Zvcm1FZGl0b3JTdWJtaXRFdmVudH0gZnJvbSAnLi4vbW9kZWxzJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdtbmctZm9ybS1lZGl0b3InLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9mb3JtLWVkaXRvci5jb21wb25lbnQuaHRtbCcsXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgTW5nRm9ybUVkaXRvckNvbXBvbmVudDxUPiBpbXBsZW1lbnRzIElGb3JtRWRpdG9yQ29tcG9uZW50PFQ+LCBPbkluaXQsIE9uRGVzdHJveSB7XG4gICAgLy8gbWV0YWRhdGEgYW5kIGVkaXRvciBtb2RlIGlucHV0XG4gICAgQElucHV0KCkgcHVibGljIGRlc2NyaXB0b3IhOiBFZGl0b3JEZXNjcmlwdG9yPFQ+O1xuICAgIEBJbnB1dCgpIHB1YmxpYyBzdWJtaXRMb2FkaW5nOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHwgYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgLy8gZGF0YSBzb3VyY2UgaW5wdXRzO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBpdGVtPzogVDtcblxuICAgIC8vIGV4dHJhIGZlYXR1cmVzIGlucHV0XG4gICAgQElucHV0KCkgcHVibGljIGlzU3VibWl0QnV0dG9uVmlzaWJsZSA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBpc0Zvcm1EaXNhYmxlZCA9IG51bGw7XG5cbiAgICAvLyBldmVudCBvdXRwdXRzXG4gICAgQE91dHB1dCgnZm9ybVN1Ym1pdCcpIHB1YmxpYyBmb3JtU3VibWl0RXZlbnRFbWl0dGVyID0gbmV3IEV2ZW50RW1pdHRlcjxNbmdGb3JtRWRpdG9yU3VibWl0RXZlbnQ8VD4+KCk7XG5cbiAgICAvLyBjb250ZW50IGFuZCB2aWV3IHF1ZXJpZXNcbiAgICBAQ29udGVudENoaWxkcmVuKE1uZ1RlbXBsYXRlRGlyZWN0aXZlKSBwdWJsaWMgdGVtcGxhdGVzITogUXVlcnlMaXN0PE1uZ1RlbXBsYXRlRGlyZWN0aXZlPjtcbiAgICBAVmlld0NoaWxkKCdzdWJtaXRCdXR0b24nKSBwdWJsaWMgc3VibWl0QnV0dG9uRWxlbWVudFJlZj86IEVsZW1lbnRSZWY7XG5cbiAgICBwdWJsaWMgZm9ybTogRm9ybUdyb3VwID0gbmV3IEZvcm1Hcm91cCh7fSk7XG4gICAgcHVibGljIGZvcm1PcHRpb25zOiBGb3JtbHlGb3JtT3B0aW9ucyA9IHtcbiAgICAgICAgZm9ybVN0YXRlOiB7XG4gICAgICAgICAgICBhZGQ6IGZhbHNlLFxuICAgICAgICAgICAgZWRpdDogZmFsc2UsXG4gICAgICAgICAgICBkaXNhYmxlZDogZmFsc2VcbiAgICAgICAgfVxuICAgIH07XG4gICAgcHVibGljIGZvcm1GaWVsZHMhOiBGb3JtbHlGaWVsZENvbmZpZ1tdO1xuICAgIHB1YmxpYyBmb3JtT3JpZ0l0ZW0/OiBUO1xuICAgIHB1YmxpYyBmb3JtTW9kZWw6IGFueSA9IHt9O1xuICAgIHB1YmxpYyBmb3JtTWVzc2FnZXM6IE1lc3NhZ2VbXSA9IFtdO1xuICAgIHB1YmxpYyBzdWJtaXRMb2FkaW5nJCE6IE9ic2VydmFibGU8Ym9vbGVhbj47XG5cbiAgICBwcml2YXRlIHN1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbltdID0gW107XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIG1uZ0NvbW1vbnNTZXJ2aWNlOiBNbmdDb21tb25zU2VydmljZSwgcHJpdmF0ZSB0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlKSB7fVxuXG4gICAgcHVibGljIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLnNldEluaXRpYWxGb3JtU3RhdGUoKTtcbiAgICAgICAgdGhpcy5yZXNldEZvcm1Nb2RlbCh0aGlzLml0ZW0pO1xuICAgICAgICB0aGlzLnN1Ym1pdExvYWRpbmckID0gdGhpcy5zdWJtaXRMb2FkaW5nIGluc3RhbmNlb2YgT2JzZXJ2YWJsZSA/IHRoaXMuc3VibWl0TG9hZGluZyA6IG9mKHRoaXMuc3VibWl0TG9hZGluZyk7XG5cbiAgICAgICAgLy8gaW5pdCBmaWVsZHMgZm9yIGZvcm1seVxuICAgICAgICB0aGlzLmZvcm1GaWVsZHMgPSBFZGl0b3JGb3JtbHlVdGlsLmNyZWF0ZUZvcm1seUNvbmZpZ0Zyb21EZXNjcmlwdG9yKHRoaXMuZGVzY3JpcHRvciwgdGhpcyk7XG4gICAgICAgIHRoaXMudXBkYXRlRm9ybVN0YXRlKCk7XG5cbiAgICAgICAgLy8gbGV0IHRoZSB1c2VyIGtub3csIHRoYXQgYWRkaW5nIG5ldyB2YWx1ZSBpbiB0YWJsZSB2aWV3IHdpdGggbG9jYWxpemF0aW9ucyBpcyBvbmx5IHN1cHBvcnRlZCBpbiB0aGUgZGVmYXVsdCBsYW5ndWFnZVxuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLmRlc2NyaXB0b3IuaXNMb2NhbGl6ZWQgJiZcbiAgICAgICAgICAgICh0aGlzLmRlc2NyaXB0b3IudGFibGV2aWV3RWRpdG9yVHlwZSA9PT0gVGFibGV2aWV3RWRpdG9yVHlwZUVudW0uQWRkIHx8IHRoaXMuZGVzY3JpcHRvci50YWJsZXZpZXdFZGl0b3JUeXBlID09PSBUYWJsZXZpZXdFZGl0b3JUeXBlRW51bS5FZGl0KVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMuZm9ybU1lc3NhZ2VzLnB1c2goXG4gICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uVXRpbC5nZXRGb3JtRWRpdG9ySW5mb01lc3NhZ2UoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHJhbnNsYXRlU2VydmljZSxcbiAgICAgICAgICAgICAgICAgICAgJ21uZ0VkaXRvci5sb2NhbGl6YXRpb25zLmFkZEluRGVmYXVsdExhbmd1YWdlVGl0bGUnLFxuICAgICAgICAgICAgICAgICAgICAnbW5nRWRpdG9yLmxvY2FsaXphdGlvbnMuYWRkSW5EZWZhdWx0TGFuZ3VhZ2VEZXNjcmlwdGlvbicsXG4gICAgICAgICAgICAgICAgICAgIHtkZWZhdWx0TGFuZ3VhZ2U6IHRoaXMubW5nQ29tbW9uc1NlcnZpY2UuZGVmYXVsdERhdGFMYW5ndWFnZX1cbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG5nT25EZXN0cm95KCkge1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMuZm9yRWFjaChzID0+IHMudW5zdWJzY3JpYmUoKSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN1Ym1pdCgpIHtcbiAgICAgICAgdGhpcy5zdWJtaXRCdXR0b25FbGVtZW50UmVmPy5uYXRpdmVFbGVtZW50LmNsaWNrKCk7XG4gICAgfVxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIHB1YmxpYyBvblN1Ym1pdChldmVudDogRXZlbnQpIHtcbiAgICAgICAgdGhpcy5mb3JtT3B0aW9ucy5mb3JtU3RhdGUuc3VibWl0dGVkT24gPSBEYXRlLm5vdygpO1xuICAgICAgICB0aGlzLmZvcm1NZXNzYWdlcyA9IFtdO1xuXG4gICAgICAgIGNvbnN0IGZvcm1TdWJtaXRJdGVtID0gdGhpcy5nZXRGb3JtVmFsdWUoKTtcbiAgICAgICAgaWYgKHRoaXMuZm9ybS52YWxpZCkge1xuICAgICAgICAgICAgdGhpcy5mb3JtU3VibWl0RXZlbnRFbWl0dGVyLm5leHQobmV3IE1uZ0Zvcm1FZGl0b3JTdWJtaXRFdmVudChmb3JtU3VibWl0SXRlbSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gZmluZCBhbmQgbWFyayBpbnZhbGlkIHRhYnNcbiAgICAgICAgICAgIGlmICh0aGlzLmZvcm1GaWVsZHNbMF0udHlwZSA9PT0gJ3RhYnMnICYmIHRoaXMuZm9ybUZpZWxkc1swXS5maWVsZEdyb3VwKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCB0YWIgb2YgdGhpcy5mb3JtRmllbGRzWzBdLmZpZWxkR3JvdXApIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNJbnZhbGlkID0gdGhpcy5pc0FueUZpZWxkSW52YWxpZCh0YWIuZmllbGRHcm91cCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybU9wdGlvbnMuZm9ybVN0YXRlWyd0YWJfJyArICh0YWIuaWQgPyB0YWIuaWQgOiAodGFiLnByb3BzIGFzIE1uZ0Zvcm1seUZpZWxkQ29uZmlnKS5wcm9wcy5sYWJlbCkgKyAnX2ludmFsaWQnXSA9IGlzSW52YWxpZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBldmVudCA9IG5ldyBNbmdGb3JtRWRpdG9yU3VibWl0RXZlbnQoZm9ybVN1Ym1pdEl0ZW0pO1xuICAgICAgICAgICAgZXZlbnQuc3VjY2VzcyA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5mb3JtTWVzc2FnZXMucHVzaChOb3RpZmljYXRpb25VdGlsLmdldEZvcm1FZGl0b3JXYXJuaW5nTWVzc2FnZSh0aGlzLnRyYW5zbGF0ZVNlcnZpY2UsICdtbmdFZGl0b3IuaW52YWxpZEZvcm1Ub2FzdFRpdGxlJywgJ21uZ0VkaXRvci5pbnZhbGlkRm9ybVRvYXN0TWVzc2FnZScpKTtcbiAgICAgICAgICAgIHRoaXMuZm9ybVN1Ym1pdEV2ZW50RW1pdHRlci5uZXh0KGV2ZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXRGb3JtVmFsdWUoKTogVCB7XG4gICAgICAgIGNvbnN0IGZvcm1WYWx1ZSA9IHRoaXMuZm9ybS5nZXRSYXdWYWx1ZSgpO1xuICAgICAgICB0aGlzLmRlc2NyaXB0b3IuZmllbGRzLmZvckVhY2goZmllbGQgPT4ge1xuICAgICAgICAgICAgaWYgKGZpZWxkICYmIGZpZWxkLnNldHRlcikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNwbGl0UGF0aCA9IGZpZWxkLnByb3BlcnR5LnNwbGl0KCcuJyk7XG4gICAgICAgICAgICAgICAgbGV0IGZpZWxkVmFsdWUgPSBmb3JtVmFsdWU7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzcGxpdFBhdGgubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRTdWJQYXRoID0gc3BsaXRQYXRoW2ldO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGZpZWxkVmFsdWVbY3VycmVudFN1YlBhdGhdICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRWYWx1ZVtjdXJyZW50U3ViUGF0aF0gPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkVmFsdWUgPSBmaWVsZFZhbHVlW2N1cnJlbnRTdWJQYXRoXTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBmaWVsZFZhbHVlID0gZmllbGRWYWx1ZVtzcGxpdFBhdGhbc3BsaXRQYXRoLmxlbmd0aCAtIDFdXTtcbiAgICAgICAgICAgICAgICBmaWVsZC5zZXR0ZXIoZm9ybVZhbHVlLCBmaWVsZFZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBmb3JtVmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIHJlc2V0Rm9ybU1vZGVsKGl0ZW0/OiBUKSB7XG4gICAgICAgIHRoaXMuZm9ybU9yaWdJdGVtID0gaXRlbTtcbiAgICAgICAgLy8gVE9ETzogdG8gY2hlY2sgaWYgdGhpcyBpcyBvaywgY291bGQgYmUgcHJvYmxlbXMgd2l0aCBkYXRlcywgaWYgc28sIHRyeSBsb2Rhc2hcbiAgICAgICAgY29uc3QgZm9ybU1vZGVsID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShpdGVtID8/IHt9KSk7XG5cbiAgICAgICAgdGhpcy5kZXNjcmlwdG9yLmZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICAgICAgICAgIGlmIChmaWVsZC5nZXR0ZXIgJiYgaXRlbSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNwbGl0UGF0aCA9IGZpZWxkLnByb3BlcnR5LnNwbGl0KCcuJyk7XG4gICAgICAgICAgICAgICAgbGV0IGN1cnJlbnRPYmplY3QgPSBmb3JtTW9kZWw7XG5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNwbGl0UGF0aC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50U3ViUGF0aCA9IHNwbGl0UGF0aFtpXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT09IHNwbGl0UGF0aC5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50T2JqZWN0W2N1cnJlbnRTdWJQYXRoXSA9IGZpZWxkLmdldHRlcihpdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY3VycmVudE9iamVjdFtjdXJyZW50U3ViUGF0aF0gIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE9iamVjdFtjdXJyZW50U3ViUGF0aF0gPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE9iamVjdCA9IGN1cnJlbnRPYmplY3RbY3VycmVudFN1YlBhdGhdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmZvcm1PcHRpb25zLnJlc2V0TW9kZWwgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIC8vIGNvdWxkIG5vdCBiZSBpbml0aWF0ZWQgeWV0XG4gICAgICAgICAgICB0aGlzLmZvcm1PcHRpb25zLnJlc2V0TW9kZWwodGhpcy5mb3JtTW9kZWwpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZm9ybU1vZGVsID0gZm9ybU1vZGVsO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRGb3JtRmllbGQoa2V5OiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmluZEZvcm1GaWVsZCh0aGlzLmZvcm0sIGtleS5zcGxpdCgnLicpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0Rm9ybUZpZWxkVmFsdWUoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgICAgICAgY29uc3QgY29udHJvbCA9IHRoaXMuZ2V0Rm9ybUZpZWxkKGtleSk7XG4gICAgICAgIGlmIChjb250cm9sKSB7XG4gICAgICAgICAgICBjb250cm9sLnNldFZhbHVlKHZhbHVlKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGBWYWx1ZSB3YXMgbm90IHNldCwgYmVjYXVzZSBmaWVsZCAke2tleX0gd2FzIG5vdCBmb3VuZC5gKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBwYXRjaEZvcm1GaWVsZFZhbHVlKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmdldEZvcm1GaWVsZChrZXkpO1xuICAgICAgICBpZiAoY29udHJvbCkge1xuICAgICAgICAgICAgY29udHJvbC5wYXRjaFZhbHVlKHZhbHVlKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGBWYWx1ZSB3YXMgbm90IHNldCwgYmVjYXVzZSBmaWVsZCAke2tleX0gd2FzIG5vdCBmb3VuZC5gKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyByZXNldEZvcm1GaWVsZFZhbHVlKGtleTogc3RyaW5nLCB2YWx1ZT86IGFueSkge1xuICAgICAgICBjb25zdCBjb250cm9sID0gdGhpcy5nZXRGb3JtRmllbGQoa2V5KTtcbiAgICAgICAgaWYgKGNvbnRyb2wpIHtcbiAgICAgICAgICAgIGNvbnRyb2wucmVzZXQodmFsdWUpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYFZhbHVlIHdhcyBub3Qgc2V0LCBiZWNhdXNlIGZpZWxkICR7a2V5fSB3YXMgbm90IGZvdW5kLmApO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmaW5kRm9ybUZpZWxkKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCwga2V5UGF0aDogc3RyaW5nW10pOiBBYnN0cmFjdENvbnRyb2wgfCBudWxsIHtcbiAgICAgICAgaWYgKGtleVBhdGgubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gY29udHJvbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoa2V5UGF0aC5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiBjb250cm9sLmdldChrZXlQYXRoWzBdKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbmV4dENvbnRyb2w6IEFic3RyYWN0Q29udHJvbCB8IG51bGwgPSBudWxsO1xuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEZvcm1Hcm91cCkge1xuICAgICAgICAgICAgbmV4dENvbnRyb2wgPSBjb250cm9sLmdldChrZXlQYXRoWzBdKTtcbiAgICAgICAgfSBlbHNlIGlmIChjb250cm9sIGluc3RhbmNlb2YgRm9ybUFycmF5KSB7XG4gICAgICAgICAgICBjb25zdCBpZHggPSAra2V5UGF0aFswXTtcbiAgICAgICAgICAgIGlmICghaXNOYU4oaWR4KSkge1xuICAgICAgICAgICAgICAgIG5leHRDb250cm9sID0gY29udHJvbC5hdChpZHgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFjb250cm9sKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5maW5kRm9ybUZpZWxkKG5leHRDb250cm9sISwga2V5UGF0aC5zbGljZSgxKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc0FueUZpZWxkSW52YWxpZChmaWVsZHM6IEZvcm1seUZpZWxkQ29uZmlnW10gPSBbXSk6IGJvb2xlYW4ge1xuICAgICAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIGZpZWxkcykge1xuICAgICAgICAgICAgbGV0IGZpZWxkSW52YWxpZCA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZmllbGQuZmllbGRHcm91cCkpIHtcbiAgICAgICAgICAgICAgICBmaWVsZEludmFsaWQgPSB0aGlzLmlzQW55RmllbGRJbnZhbGlkKGZpZWxkLmZpZWxkR3JvdXApO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZmllbGQudHlwZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBmaWVsZEludmFsaWQgPSAhZmllbGQuZm9ybUNvbnRyb2w/LnZhbGlkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGZpZWxkSW52YWxpZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZUZvcm1TdGF0ZSgpIHtcbiAgICAgICAgdGhpcy5mb3JtT3B0aW9ucy5mb3JtU3RhdGUuZGlzYWJsZWQgPSB0aGlzLmlzRm9ybURpc2FibGVkICE9PSBudWxsID8gdGhpcy5pc0Zvcm1EaXNhYmxlZCA9PT0gdHJ1ZSA6IHRoaXMuZGVzY3JpcHRvci5kaXNhYmxlZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcHJpdmF0ZSBTZXRzIGZvcm0gc3RhdGUgYmFzZWQgb24gZWRpdG9yIGRlc2NyaXB0b3IgdHlwZS5cbiAgICAgKiBQb3NzaWJsZSBvcHRpb25zIGFyZTogZGlzYWJsZWQsIGFkZCBvciBlZGl0LlxuICAgICAqL1xuICAgIHByaXZhdGUgc2V0SW5pdGlhbEZvcm1TdGF0ZSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuZGVzY3JpcHRvci50YWJsZXZpZXdFZGl0b3JUeXBlID09PSBUYWJsZXZpZXdFZGl0b3JUeXBlRW51bS5BZGQpIHtcbiAgICAgICAgICAgIHRoaXMuZm9ybU9wdGlvbnMuZm9ybVN0YXRlLmFkZCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5kZXNjcmlwdG9yLnRhYmxldmlld0VkaXRvclR5cGUgPT09IFRhYmxldmlld0VkaXRvclR5cGVFbnVtLkVkaXQpIHtcbiAgICAgICAgICAgIHRoaXMuZm9ybU9wdGlvbnMuZm9ybVN0YXRlLmVkaXQgPSB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZGVzY3JpcHRvci50YWJsZXZpZXdFZGl0b3JUeXBlID09PSBUYWJsZXZpZXdFZGl0b3JUeXBlRW51bS5EZXRhaWxzKSB7XG4gICAgICAgICAgICB0aGlzLmZvcm1PcHRpb25zLmZvcm1TdGF0ZS5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCI8Zm9ybSBbZm9ybUdyb3VwXT1cImZvcm1cIiAobmdTdWJtaXQpPVwib25TdWJtaXQoJGV2ZW50KVwiPlxuICAgIDxmb3JtbHktZm9ybSBbZm9ybV09XCJmb3JtXCIgW2ZpZWxkc109XCJmb3JtRmllbGRzXCIgW29wdGlvbnNdPVwiZm9ybU9wdGlvbnNcIiBbbW9kZWxdPVwiZm9ybU1vZGVsXCI+PC9mb3JtbHktZm9ybT5cbiAgICA8YnV0dG9uICNzdWJtaXRCdXR0b24gcEJ1dHRvbiB0eXBlPVwic3VibWl0XCIgW2NsYXNzLmhpZGRlbl09XCIhaXNTdWJtaXRCdXR0b25WaXNpYmxlXCIgW2Rpc2FibGVkXT1cImZvcm0uZGlzYWJsZWRcIiBbbG9hZGluZ109XCIoc3VibWl0TG9hZGluZyQgfCBhc3luYykgPz8gZmFsc2VcIj48L2J1dHRvbj5cbjwvZm9ybT5cbjxwLW1lc3NhZ2VzIFt2YWx1ZV09XCJmb3JtTWVzc2FnZXNcIiBbZW5hYmxlU2VydmljZV09XCJmYWxzZVwiPjwvcC1tZXNzYWdlcz5cbiJdfQ==