@mediusinc/mng-commons 6.0.0-rc.5 → 6.0.0-rc.7

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 (395) hide show
  1. package/README.md +6 -6
  2. package/core/components/notification/notification-wrapper.component.d.ts +4 -4
  3. package/core/data-list/data-list-params-helpers.d.ts +1 -0
  4. package/core/directives/component.directive.d.ts +11 -13
  5. package/core/directives/rerender.directive.d.ts +1 -1
  6. package/core/directives/template.directive.d.ts +3 -7
  7. package/core/error/error.model.d.ts +4 -4
  8. package/core/helpers/notification.d.ts +2 -2
  9. package/core/i18n/i18n-common.d.ts +2 -2
  10. package/core/provide.d.ts +3 -3
  11. package/core/styles/style-constants.d.ts +9 -8
  12. package/core/styles/style.model.d.ts +2 -1
  13. package/fesm2022/mediusinc-mng-commons-core.mjs +167 -201
  14. package/fesm2022/mediusinc-mng-commons-core.mjs.map +1 -1
  15. package/fesm2022/mediusinc-mng-commons-form-api.mjs +8 -9
  16. package/fesm2022/mediusinc-mng-commons-form-api.mjs.map +1 -1
  17. package/fesm2022/mediusinc-mng-commons-form.mjs +151 -52
  18. package/fesm2022/mediusinc-mng-commons-form.mjs.map +1 -1
  19. package/fesm2022/mediusinc-mng-commons-table-column-toggle.component-a8KG1NIX.mjs +30 -0
  20. package/fesm2022/mediusinc-mng-commons-table-column-toggle.component-a8KG1NIX.mjs.map +1 -0
  21. package/fesm2022/mediusinc-mng-commons-table-mediusinc-mng-commons-table-C2vrMoNL.mjs +2130 -0
  22. package/fesm2022/mediusinc-mng-commons-table-mediusinc-mng-commons-table-C2vrMoNL.mjs.map +1 -0
  23. package/fesm2022/mediusinc-mng-commons-table.mjs +1 -2154
  24. package/fesm2022/mediusinc-mng-commons-table.mjs.map +1 -1
  25. package/fesm2022/mediusinc-mng-commons-tableview-api.mjs +97 -49
  26. package/fesm2022/mediusinc-mng-commons-tableview-api.mjs.map +1 -1
  27. package/fesm2022/mediusinc-mng-commons-tableview.mjs +332 -293
  28. package/fesm2022/mediusinc-mng-commons-tableview.mjs.map +1 -1
  29. package/fesm2022/mediusinc-mng-commons.mjs.map +1 -1
  30. package/form/api/index.d.ts +1 -0
  31. package/form/api/models/empty-value.model.d.ts +7 -0
  32. package/form/components/autocomplete/autocomplete.component.d.ts +1 -2
  33. package/form/components/date-range/date-range.component.d.ts +4 -3
  34. package/form/components/dropdown/dropdown.component.d.ts +3 -2
  35. package/form/components/number-range/number-range.component.d.ts +3 -2
  36. package/form/directives/input-empty-value.directive.d.ts +40 -0
  37. package/form/directives/input-trim.directive.d.ts +3 -5
  38. package/form/index.d.ts +1 -0
  39. package/i18n/en.json +57 -8
  40. package/i18n/sl.json +1 -3
  41. package/package.json +10 -36
  42. package/provide.d.ts +2 -2
  43. package/table/components/column-toggle/column-toggle.component.d.ts +12 -0
  44. package/table/components/filter/filter-form/filter-form.component.d.ts +2 -2
  45. package/table/components/table/table.component.d.ts +0 -1
  46. package/table/helpers/filters.d.ts +3 -2
  47. package/table/helpers/notification.d.ts +2 -2
  48. package/table/provide.d.ts +7 -0
  49. package/table/services/table-metadata.service.d.ts +3 -3
  50. package/tableview/action/components/action/action.component.d.ts +1 -0
  51. package/tableview/action/components/editor/action-editor.component.d.ts +1 -1
  52. package/tableview/action/components/table/action-table.component.d.ts +2 -1
  53. package/tableview/action/helpers/notification.d.ts +3 -3
  54. package/tableview/action/models/execution/action-context.model.d.ts +2 -2
  55. package/tableview/action/services/action-executor.service.d.ts +1 -1
  56. package/tableview/api/action/descriptors/action.descriptor.d.ts +3 -3
  57. package/tableview/api/action/models/action-confirmation.model.d.ts +4 -2
  58. package/tableview/api/action/models/execution/action-context.model.d.ts +2 -2
  59. package/tableview/api/editor/descriptors/editor.descriptor.d.ts +5 -0
  60. package/tableview/api/editor/descriptors/field-base.descriptor.d.ts +14 -10
  61. package/tableview/api/editor/descriptors/field-group.descriptor.d.ts +10 -0
  62. package/tableview/api/editor/descriptors/field.descriptor.d.ts +36 -9
  63. package/tableview/api/editor/descriptors/wrappers/editor-descriptor-nested-object-wrapper.d.ts +1 -1
  64. package/tableview/api/editor/models/field-action-context.model.d.ts +1 -1
  65. package/tableview/api/editor/models/field.model.d.ts +1 -2
  66. package/tableview/api/editor/models/form-editor.interface.d.ts +2 -2
  67. package/tableview/api/editor/models/formly-custom-field.model.d.ts +1 -1
  68. package/tableview/api/editor/models/formly-field.model.d.ts +2 -2
  69. package/tableview/editor/components/editor/form-editor.component.d.ts +2 -2
  70. package/tableview/editor/components/formly/fields/formly-field-action/formly-field-action.component.d.ts +1 -1
  71. package/tableview/editor/components/formly/fields/formly-field-datepicker/formly-field-datepicker.component.d.ts +2 -1
  72. package/tableview/editor/components/formly/fields/formly-field-fieldset/formly-field-fieldset.component.d.ts +4 -6
  73. package/tableview/editor/components/formly/fields/formly-field-lookup-dialog/formly-field-lookup-dialog.component.d.ts +0 -2
  74. package/tableview/editor/components/formly/fields/formly-field-tabs/formly-field-tabs.component.d.ts +2 -2
  75. package/tableview/editor/components/formly/fields/formly-field-type.abstract.component.d.ts +8 -15
  76. package/tableview/editor/components/formly/fields/formly-group-type.abstract.component.d.ts +7 -0
  77. package/tableview/editor/components/formly/fields/formly-type.abstract.component.d.ts +20 -0
  78. package/tableview/editor/components/formly/wrappers/formly-field-no-label-wrapper/formly-field-no-label-wrapper.component.d.ts +11 -4
  79. package/tableview/editor/components/formly/wrappers/formly-field-wrapper/formly-field-wrapper.component.d.ts +2 -1
  80. package/tableview/editor/helpers/formly-config.d.ts +1 -1
  81. package/tableview/editor/helpers/notification.d.ts +3 -3
  82. package/tableview/editor/models/formly-config.model.d.ts +10 -1
  83. package/tableview/editor/models/formly.model.d.ts +23 -0
  84. package/tableview/editor/services/form-editor.service.d.ts +2 -2
  85. package/tableview/tableview/router/tableview-route-builder.d.ts +10 -3
  86. package/tableview/tableview/services/tableview-feature-config.token.d.ts +1 -1
  87. package/version-info.json +3 -3
  88. package/esm2022/core/action/action-data.model.mjs +0 -2
  89. package/esm2022/core/action/action-parameters.model.mjs +0 -2
  90. package/esm2022/core/components/notification/notification-wrapper.component.mjs +0 -50
  91. package/esm2022/core/data-list/data-list-params-helpers.mjs +0 -465
  92. package/esm2022/core/data-list/data-list.model.mjs +0 -2
  93. package/esm2022/core/data-list/filter-match.model.mjs +0 -105
  94. package/esm2022/core/data-list/filter-metadata.model.mjs +0 -2
  95. package/esm2022/core/data-providers/base.data-provider.mjs +0 -16
  96. package/esm2022/core/data-providers/lookup.data-provider.mjs +0 -2
  97. package/esm2022/core/descriptors/action.descriptor.mjs +0 -2
  98. package/esm2022/core/descriptors/column.descriptor.mjs +0 -2
  99. package/esm2022/core/descriptors/editor.descriptor.mjs +0 -2
  100. package/esm2022/core/descriptors/enum.descriptor.mjs +0 -2
  101. package/esm2022/core/descriptors/filter.descriptor.mjs +0 -2
  102. package/esm2022/core/descriptors/lookup.descriptor.mjs +0 -2
  103. package/esm2022/core/descriptors/model.descriptor.mjs +0 -2
  104. package/esm2022/core/descriptors/table.descriptor.mjs +0 -2
  105. package/esm2022/core/descriptors/tableview.descriptor.mjs +0 -2
  106. package/esm2022/core/directives/component.directive.mjs +0 -75
  107. package/esm2022/core/directives/rerender.directive.mjs +0 -25
  108. package/esm2022/core/directives/template.directive.mjs +0 -29
  109. package/esm2022/core/enum/enum-helpers.mjs +0 -90
  110. package/esm2022/core/enum/enum.model.mjs +0 -2
  111. package/esm2022/core/error/error-handler.mjs +0 -20
  112. package/esm2022/core/error/error-helpers.mjs +0 -273
  113. package/esm2022/core/error/error.model.mjs +0 -33
  114. package/esm2022/core/helpers/coercion.mjs +0 -55
  115. package/esm2022/core/helpers/date.mjs +0 -119
  116. package/esm2022/core/helpers/notification.mjs +0 -21
  117. package/esm2022/core/helpers/number.mjs +0 -19
  118. package/esm2022/core/helpers/object.mjs +0 -152
  119. package/esm2022/core/helpers/route.mjs +0 -58
  120. package/esm2022/core/helpers/string.mjs +0 -57
  121. package/esm2022/core/helpers/templates.mjs +0 -4
  122. package/esm2022/core/helpers/type-helpers.mjs +0 -2
  123. package/esm2022/core/i18n/i18n-common.mjs +0 -24
  124. package/esm2022/core/i18n/i18n-error.mjs +0 -29
  125. package/esm2022/core/i18n/i18n-type.mjs +0 -46
  126. package/esm2022/core/index.mjs +0 -107
  127. package/esm2022/core/log/log-publisher-console.service.mjs +0 -40
  128. package/esm2022/core/log/log.model.mjs +0 -10
  129. package/esm2022/core/log/logger.service.mjs +0 -131
  130. package/esm2022/core/mediusinc-mng-commons-core.mjs +0 -5
  131. package/esm2022/core/models/class-attribute.model.mjs +0 -2
  132. package/esm2022/core/models/class-service.model.mjs +0 -2
  133. package/esm2022/core/models/getter.model.mjs +0 -2
  134. package/esm2022/core/models/i18n.model.mjs +0 -2
  135. package/esm2022/core/models/menu.model.mjs +0 -2
  136. package/esm2022/core/models/user.model.mjs +0 -2
  137. package/esm2022/core/models/version.model.mjs +0 -2
  138. package/esm2022/core/pipes/boolean.pipe.mjs +0 -34
  139. package/esm2022/core/pipes/class-map.pipe.mjs +0 -23
  140. package/esm2022/core/pipes/enum.pipe.mjs +0 -38
  141. package/esm2022/core/pipes/enumerate-async.pipe.mjs +0 -36
  142. package/esm2022/core/pipes/enumerate.pipe.mjs +0 -49
  143. package/esm2022/core/pipes/getter.pipe.mjs +0 -21
  144. package/esm2022/core/pipes/i18n-property.pipe.mjs +0 -19
  145. package/esm2022/core/pipes/json-path.pipe.mjs +0 -25
  146. package/esm2022/core/pipes/parametrize.pipe.mjs +0 -86
  147. package/esm2022/core/pipes/template.pipe.mjs +0 -25
  148. package/esm2022/core/provide.mjs +0 -79
  149. package/esm2022/core/reactivity/effect.mjs +0 -22
  150. package/esm2022/core/reflect/type-enum-decorator.mjs +0 -12
  151. package/esm2022/core/reflect/type-enum-metadata.mjs +0 -62
  152. package/esm2022/core/registry/registry.model.mjs +0 -2
  153. package/esm2022/core/registry/type-registry.mjs +0 -106
  154. package/esm2022/core/router/route-builder.mjs +0 -431
  155. package/esm2022/core/router/router.model.mjs +0 -2
  156. package/esm2022/core/router/routes-builder.mjs +0 -52
  157. package/esm2022/core/rxjs/map-data-list-result-operator.mjs +0 -22
  158. package/esm2022/core/security/permission-helpers.mjs +0 -14
  159. package/esm2022/core/security/permission.guard.mjs +0 -15
  160. package/esm2022/core/security/permission.service.mjs +0 -101
  161. package/esm2022/core/security/permissions.model.mjs +0 -93
  162. package/esm2022/core/services/commons-configuration.service.mjs +0 -189
  163. package/esm2022/core/services/commons-init.service.mjs +0 -111
  164. package/esm2022/core/services/commons-router.service.mjs +0 -181
  165. package/esm2022/core/services/commons-storage.service.mjs +0 -31
  166. package/esm2022/core/services/commons.service.mjs +0 -324
  167. package/esm2022/core/services/providers/commons-init.provider.mjs +0 -4
  168. package/esm2022/core/services/tokens/browser-storage.token.mjs +0 -3
  169. package/esm2022/core/services/tokens/commons-init.token.mjs +0 -3
  170. package/esm2022/core/services/tokens/log-publisher.token.mjs +0 -3
  171. package/esm2022/core/services/tokens/module-config.token.mjs +0 -3
  172. package/esm2022/core/styles/style-constants.mjs +0 -11
  173. package/esm2022/core/styles/style.model.mjs +0 -20
  174. package/esm2022/filter/descriptors/filter-generic.descriptor.mjs +0 -31
  175. package/esm2022/filter/descriptors/filter-lookup.descriptor.mjs +0 -168
  176. package/esm2022/filter/descriptors/filter.descriptor.mjs +0 -421
  177. package/esm2022/filter/index.mjs +0 -8
  178. package/esm2022/filter/mediusinc-mng-commons-filter.mjs +0 -5
  179. package/esm2022/filter/models/filter-generic-property.model.mjs +0 -2
  180. package/esm2022/filter/models/filter.model.mjs +0 -20
  181. package/esm2022/form/api/data-providers/lookup-data-provider.factory.mjs +0 -15
  182. package/esm2022/form/api/data-providers/lookup.data-provider.mjs +0 -15
  183. package/esm2022/form/api/descriptors/action-button.descriptor.mjs +0 -56
  184. package/esm2022/form/api/descriptors/button-style.builder.mjs +0 -153
  185. package/esm2022/form/api/index.mjs +0 -10
  186. package/esm2022/form/api/mediusinc-mng-commons-form-api.mjs +0 -5
  187. package/esm2022/form/api/models/button.model.mjs +0 -2
  188. package/esm2022/form/api/models/trim.model.mjs +0 -2
  189. package/esm2022/form/components/autocomplete/autocomplete.component.mjs +0 -436
  190. package/esm2022/form/components/date-range/date-range.component.mjs +0 -147
  191. package/esm2022/form/components/dropdown/dropdown.component.mjs +0 -372
  192. package/esm2022/form/components/number-range/number-range.component.mjs +0 -123
  193. package/esm2022/form/directives/input-trim.directive.mjs +0 -50
  194. package/esm2022/form/index.mjs +0 -8
  195. package/esm2022/form/mediusinc-mng-commons-form.mjs +0 -5
  196. package/esm2022/index.mjs +0 -2
  197. package/esm2022/mediusinc-mng-commons.mjs +0 -5
  198. package/esm2022/model/class/data-providers/base-from-class-data-provider.factory.mjs +0 -5
  199. package/esm2022/model/class/descriptors/model-class.descriptor.mjs +0 -28
  200. package/esm2022/model/class/descriptors/type-class.descriptor.mjs +0 -6
  201. package/esm2022/model/class/helpers/model.mjs +0 -53
  202. package/esm2022/model/class/index.mjs +0 -8
  203. package/esm2022/model/class/mediusinc-mng-commons-model-class.mjs +0 -5
  204. package/esm2022/model/data-providers/base-from-type-data-provider.factory.mjs +0 -13
  205. package/esm2022/model/descriptors/enum.descriptor.mjs +0 -28
  206. package/esm2022/model/descriptors/model.descriptor.mjs +0 -53
  207. package/esm2022/model/descriptors/type.descriptor.mjs +0 -7
  208. package/esm2022/model/helpers/i18n.mjs +0 -47
  209. package/esm2022/model/index.mjs +0 -9
  210. package/esm2022/model/mediusinc-mng-commons-model.mjs +0 -5
  211. package/esm2022/provide.mjs +0 -6
  212. package/esm2022/table/api/class/class-table-attribute-converter.mjs +0 -80
  213. package/esm2022/table/api/class/class-table-attribute.model.mjs +0 -2
  214. package/esm2022/table/api/class/class-table-data-provider.factory.mjs +0 -5
  215. package/esm2022/table/api/class/class-table-descriptor-helpers.mjs +0 -99
  216. package/esm2022/table/api/class/class-table-descriptor.factory.mjs +0 -21
  217. package/esm2022/table/api/class/index.mjs +0 -6
  218. package/esm2022/table/api/class/mediusinc-mng-commons-table-api-class.mjs +0 -5
  219. package/esm2022/table/api/data-providers/table-data-provider.factory.mjs +0 -15
  220. package/esm2022/table/api/data-providers/table.data-provider.mjs +0 -33
  221. package/esm2022/table/api/descriptors/column.descriptor.mjs +0 -475
  222. package/esm2022/table/api/descriptors/sort.descriptor.mjs +0 -67
  223. package/esm2022/table/api/descriptors/table-descriptor.factory.mjs +0 -22
  224. package/esm2022/table/api/descriptors/table.descriptor.mjs +0 -1116
  225. package/esm2022/table/api/helpers/column-converter.mjs +0 -25
  226. package/esm2022/table/api/helpers/table-data-provider-descriptor-convert.mjs +0 -7
  227. package/esm2022/table/api/index.mjs +0 -19
  228. package/esm2022/table/api/mediusinc-mng-commons-table-api.mjs +0 -5
  229. package/esm2022/table/api/models/column-value.model.mjs +0 -2
  230. package/esm2022/table/api/models/column.model.mjs +0 -21
  231. package/esm2022/table/api/models/row-expandable-component.model.mjs +0 -2
  232. package/esm2022/table/api/models/table-columns.model.mjs +0 -2
  233. package/esm2022/table/api/models/table-event.model.mjs +0 -2
  234. package/esm2022/table/api/models/table.model.mjs +0 -21
  235. package/esm2022/table/components/column-filter/column-filter.component.mjs +0 -389
  236. package/esm2022/table/components/column-value/column-value.component.mjs +0 -78
  237. package/esm2022/table/components/filter/filter-active-tag/filter-active-tag.component.mjs +0 -55
  238. package/esm2022/table/components/filter/filter-form/filter-form.component.mjs +0 -226
  239. package/esm2022/table/components/filter/filter-overlay-with-tag/filter-overlay-with-tag.component.mjs +0 -219
  240. package/esm2022/table/components/table/table.component.mjs +0 -319
  241. package/esm2022/table/helpers/filters.mjs +0 -312
  242. package/esm2022/table/helpers/notification.mjs +0 -21
  243. package/esm2022/table/helpers/table-layout-prefs.mjs +0 -10
  244. package/esm2022/table/helpers/table.mjs +0 -24
  245. package/esm2022/table/index.mjs +0 -24
  246. package/esm2022/table/mediusinc-mng-commons-table.mjs +0 -5
  247. package/esm2022/table/models/column-preferences.model.mjs +0 -2
  248. package/esm2022/table/models/filter.model.mjs +0 -2
  249. package/esm2022/table/pipes/filter-value.pipe.mjs +0 -77
  250. package/esm2022/table/pipes/locale-default-row-class.pipe.mjs +0 -27
  251. package/esm2022/table/pipes/table-column-filter-class.pipe.mjs +0 -25
  252. package/esm2022/table/provide.mjs +0 -19
  253. package/esm2022/table/services/table-data.service.mjs +0 -194
  254. package/esm2022/table/services/table-feature-config.token.mjs +0 -3
  255. package/esm2022/table/services/table-metadata.service.mjs +0 -136
  256. package/esm2022/table/services/table-preferences.service.mjs +0 -142
  257. package/esm2022/tableview/action/components/action/action.component.mjs +0 -277
  258. package/esm2022/tableview/action/components/editor/action-editor.component.mjs +0 -86
  259. package/esm2022/tableview/action/components/editor/injector-context/action-editor-injector-context.component.mjs +0 -428
  260. package/esm2022/tableview/action/components/localization/data-language-dropdown.component.mjs +0 -35
  261. package/esm2022/tableview/action/components/route/action-route.component.mjs +0 -146
  262. package/esm2022/tableview/action/components/table/action-table.component.mjs +0 -102
  263. package/esm2022/tableview/action/guards/unsaved-changes.guard.mjs +0 -4
  264. package/esm2022/tableview/action/helpers/action-execution.mjs +0 -25
  265. package/esm2022/tableview/action/helpers/i18n.mjs +0 -102
  266. package/esm2022/tableview/action/helpers/notification.mjs +0 -78
  267. package/esm2022/tableview/action/helpers/styles.mjs +0 -32
  268. package/esm2022/tableview/action/models/action-editor-dialog-data.model.mjs +0 -2
  269. package/esm2022/tableview/action/models/can-component-deactivate.model.mjs +0 -2
  270. package/esm2022/tableview/action/models/execution/action-context.model.mjs +0 -64
  271. package/esm2022/tableview/action/models/execution/action-instance.model.mjs +0 -169
  272. package/esm2022/tableview/action/services/action-error-mapper.service.mjs +0 -20
  273. package/esm2022/tableview/action/services/action-executor.service.mjs +0 -772
  274. package/esm2022/tableview/action/services/component-action-executor.service.mjs +0 -19
  275. package/esm2022/tableview/action/services/data-provider-executor.service.mjs +0 -41
  276. package/esm2022/tableview/action/services/navigation.service.mjs +0 -53
  277. package/esm2022/tableview/action/services/providers/provide-action-executor.mjs +0 -9
  278. package/esm2022/tableview/action/services/providers/provide-view-container.mjs +0 -17
  279. package/esm2022/tableview/action/services/root-action-executor.service.mjs +0 -18
  280. package/esm2022/tableview/action/services/tokens/action-editor.token.mjs +0 -3
  281. package/esm2022/tableview/action/services/view-container.service.mjs +0 -40
  282. package/esm2022/tableview/api/action/descriptors/action-descriptor.factory.mjs +0 -28
  283. package/esm2022/tableview/api/action/descriptors/action-editor-descriptor.factory.mjs +0 -30
  284. package/esm2022/tableview/api/action/descriptors/action-editor.descriptor.mjs +0 -223
  285. package/esm2022/tableview/api/action/descriptors/action-link-descriptor.factory.mjs +0 -32
  286. package/esm2022/tableview/api/action/descriptors/action-link.descriptor.mjs +0 -74
  287. package/esm2022/tableview/api/action/descriptors/action.descriptor.mjs +0 -302
  288. package/esm2022/tableview/api/action/descriptors/editor-action-descriptor.factory.mjs +0 -21
  289. package/esm2022/tableview/api/action/descriptors/editor-action-editor-descriptor.factory.mjs +0 -21
  290. package/esm2022/tableview/api/action/descriptors/table-action-descriptor.factory.mjs +0 -37
  291. package/esm2022/tableview/api/action/descriptors/table-action-editor-descriptor.factory.mjs +0 -40
  292. package/esm2022/tableview/api/action/helpers/data-provider-executors.mjs +0 -100
  293. package/esm2022/tableview/api/action/models/action-component.model.mjs +0 -2
  294. package/esm2022/tableview/api/action/models/action-confirmation.model.mjs +0 -2
  295. package/esm2022/tableview/api/action/models/action-descriptor.types.mjs +0 -2
  296. package/esm2022/tableview/api/action/models/action-editor.model.mjs +0 -2
  297. package/esm2022/tableview/api/action/models/action-error.model.mjs +0 -14
  298. package/esm2022/tableview/api/action/models/action.type.mjs +0 -26
  299. package/esm2022/tableview/api/action/models/execution/action-context-validation.model.mjs +0 -2
  300. package/esm2022/tableview/api/action/models/execution/action-context.model.mjs +0 -2
  301. package/esm2022/tableview/api/action/models/execution/action-execution-error.model.mjs +0 -2
  302. package/esm2022/tableview/api/action/models/execution/action-instance-state.model.mjs +0 -32
  303. package/esm2022/tableview/api/action/models/execution/action-instance.model.mjs +0 -2
  304. package/esm2022/tableview/api/action/models/execution/view-container.model.mjs +0 -2
  305. package/esm2022/tableview/api/action/models/tableview-action-default-categories.model.mjs +0 -11
  306. package/esm2022/tableview/api/action/services/data-provider-executor.service.mjs +0 -28
  307. package/esm2022/tableview/api/action/services/tokens/data-language-dropdown.token.mjs +0 -3
  308. package/esm2022/tableview/api/class/editor/class-editor-attribute-converter.mjs +0 -85
  309. package/esm2022/tableview/api/class/editor/class-editor-attribute.model.mjs +0 -2
  310. package/esm2022/tableview/api/class/editor/class-editor-data-provider.factory.mjs +0 -5
  311. package/esm2022/tableview/api/class/editor/class-editor-descriptor-helpers.mjs +0 -95
  312. package/esm2022/tableview/api/class/editor/class-editor-descriptor.factory.mjs +0 -21
  313. package/esm2022/tableview/api/class/index.mjs +0 -13
  314. package/esm2022/tableview/api/class/mediusinc-mng-commons-tableview-api-class.mjs +0 -5
  315. package/esm2022/tableview/api/class/tableview/class-tableview-attribute-converter.mjs +0 -35
  316. package/esm2022/tableview/api/class/tableview/class-tableview-attribute.model.mjs +0 -2
  317. package/esm2022/tableview/api/class/tableview/class-tableview-data-provider.factory.mjs +0 -5
  318. package/esm2022/tableview/api/class/tableview/class-tableview-descriptor-helpers.mjs +0 -111
  319. package/esm2022/tableview/api/class/tableview/class-tableview-descriptor.factory.mjs +0 -26
  320. package/esm2022/tableview/api/editor/data-providers/editor-data-provider.factory.mjs +0 -15
  321. package/esm2022/tableview/api/editor/data-providers/editor.data-provider.mjs +0 -114
  322. package/esm2022/tableview/api/editor/descriptors/editor-descriptor.factory.mjs +0 -15
  323. package/esm2022/tableview/api/editor/descriptors/editor.descriptor.mjs +0 -437
  324. package/esm2022/tableview/api/editor/descriptors/field-action.descriptor.mjs +0 -51
  325. package/esm2022/tableview/api/editor/descriptors/field-base.descriptor.mjs +0 -314
  326. package/esm2022/tableview/api/editor/descriptors/field-group.descriptor.mjs +0 -103
  327. package/esm2022/tableview/api/editor/descriptors/field-lookup.descriptor.mjs +0 -211
  328. package/esm2022/tableview/api/editor/descriptors/field-many.descriptor.mjs +0 -142
  329. package/esm2022/tableview/api/editor/descriptors/field-validation.descriptor.mjs +0 -25
  330. package/esm2022/tableview/api/editor/descriptors/field.descriptor.mjs +0 -402
  331. package/esm2022/tableview/api/editor/descriptors/wrappers/editor-descriptor-nested-object-wrapper.mjs +0 -51
  332. package/esm2022/tableview/api/editor/models/editor-fields.model.mjs +0 -2
  333. package/esm2022/tableview/api/editor/models/editor.model.mjs +0 -9
  334. package/esm2022/tableview/api/editor/models/field-action-context.model.mjs +0 -2
  335. package/esm2022/tableview/api/editor/models/field-image-preview.model.mjs +0 -2
  336. package/esm2022/tableview/api/editor/models/field-validation.model.mjs +0 -2
  337. package/esm2022/tableview/api/editor/models/field.model.mjs +0 -57
  338. package/esm2022/tableview/api/editor/models/form-editor.event.mjs +0 -28
  339. package/esm2022/tableview/api/editor/models/form-editor.interface.mjs +0 -2
  340. package/esm2022/tableview/api/editor/models/formly-custom-field.model.mjs +0 -70
  341. package/esm2022/tableview/api/editor/models/formly-field.model.mjs +0 -2
  342. package/esm2022/tableview/api/editor/models/formly-options.model.mjs +0 -2
  343. package/esm2022/tableview/api/editor/models/radio.model.mjs +0 -2
  344. package/esm2022/tableview/api/index.mjs +0 -76
  345. package/esm2022/tableview/api/mediusinc-mng-commons-tableview-api.mjs +0 -5
  346. package/esm2022/tableview/api/tableview/data-providers/tableview-data-provider.factory.mjs +0 -18
  347. package/esm2022/tableview/api/tableview/data-providers/tableview.data-provider.mjs +0 -84
  348. package/esm2022/tableview/api/tableview/descriptors/tableview-descriptor.factory.mjs +0 -34
  349. package/esm2022/tableview/api/tableview/descriptors/tableview.descriptor.mjs +0 -377
  350. package/esm2022/tableview/api/tableview/helpers/files-export.mjs +0 -34
  351. package/esm2022/tableview/api/tableview/helpers/tableview-create.mjs +0 -26
  352. package/esm2022/tableview/api/tableview/helpers/tableview-data-provider-descriptor-convert.mjs +0 -7
  353. package/esm2022/tableview/api/tableview/helpers/tableview-default-actions.mjs +0 -324
  354. package/esm2022/tableview/api/tableview/helpers/tableview-input-builder.mjs +0 -319
  355. package/esm2022/tableview/api/tableview/models/tableview-descriptor-fields-manage-helper.type.mjs +0 -2
  356. package/esm2022/tableview/api/tableview/models/tableview-descriptor-helper.type.mjs +0 -2
  357. package/esm2022/tableview/api/tableview/models/tableview-input.model.mjs +0 -2
  358. package/esm2022/tableview/api/tableview/models/tableview-route.model.mjs +0 -2
  359. package/esm2022/tableview/editor/components/editor/auto-save-status/auto-save-status.component.mjs +0 -82
  360. package/esm2022/tableview/editor/components/editor/form-editor.component.mjs +0 -480
  361. package/esm2022/tableview/editor/components/formly/constants.mjs +0 -2
  362. package/esm2022/tableview/editor/components/formly/fields/formly-field-action/formly-field-action.component.mjs +0 -66
  363. package/esm2022/tableview/editor/components/formly/fields/formly-field-autocomplete/formly-field-autocomplete.component.mjs +0 -47
  364. package/esm2022/tableview/editor/components/formly/fields/formly-field-custom/formly-field-custom.component.mjs +0 -39
  365. package/esm2022/tableview/editor/components/formly/fields/formly-field-datepicker/formly-field-datepicker.component.mjs +0 -165
  366. package/esm2022/tableview/editor/components/formly/fields/formly-field-dropdown/formly-field-dropdown.component.mjs +0 -42
  367. package/esm2022/tableview/editor/components/formly/fields/formly-field-fieldset/formly-field-fieldset.component.mjs +0 -34
  368. package/esm2022/tableview/editor/components/formly/fields/formly-field-input/formly-field-input.component.mjs +0 -211
  369. package/esm2022/tableview/editor/components/formly/fields/formly-field-label/formly-field-label.component.mjs +0 -23
  370. package/esm2022/tableview/editor/components/formly/fields/formly-field-lookup-dialog/formly-field-lookup-dialog.component.mjs +0 -195
  371. package/esm2022/tableview/editor/components/formly/fields/formly-field-table-dialog-form/formly-field-table-dialog-form.component.mjs +0 -239
  372. package/esm2022/tableview/editor/components/formly/fields/formly-field-table-dialog-multiselect/formly-field-table-dialog-multiselect.component.mjs +0 -205
  373. package/esm2022/tableview/editor/components/formly/fields/formly-field-tabs/formly-field-tabs.component.mjs +0 -28
  374. package/esm2022/tableview/editor/components/formly/fields/formly-field-type.abstract.component.mjs +0 -46
  375. package/esm2022/tableview/editor/components/formly/pipes/formly-field-label.pipe.mjs +0 -19
  376. package/esm2022/tableview/editor/components/formly/wrappers/formly-field-no-label-wrapper/formly-field-no-label-wrapper.component.mjs +0 -33
  377. package/esm2022/tableview/editor/components/formly/wrappers/formly-field-wrapper/formly-field-wrapper.component.mjs +0 -59
  378. package/esm2022/tableview/editor/helpers/editor-autosave.mjs +0 -49
  379. package/esm2022/tableview/editor/helpers/editor-field.mjs +0 -39
  380. package/esm2022/tableview/editor/helpers/editor-formly.mjs +0 -388
  381. package/esm2022/tableview/editor/helpers/editor-validators.mjs +0 -25
  382. package/esm2022/tableview/editor/helpers/field-create.mjs +0 -21
  383. package/esm2022/tableview/editor/helpers/formly-config.mjs +0 -260
  384. package/esm2022/tableview/editor/helpers/notification.mjs +0 -11
  385. package/esm2022/tableview/editor/models/editor-auto-save-preview.model.mjs +0 -2
  386. package/esm2022/tableview/editor/models/formly-config.model.mjs +0 -2
  387. package/esm2022/tableview/editor/services/form-editor.service.mjs +0 -96
  388. package/esm2022/tableview/editor/services/formly-config.provider.mjs +0 -31
  389. package/esm2022/tableview/index.mjs +0 -67
  390. package/esm2022/tableview/mediusinc-mng-commons-tableview.mjs +0 -5
  391. package/esm2022/tableview/provide.mjs +0 -105
  392. package/esm2022/tableview/tableview/components/route/tableview-route.component.mjs +0 -15
  393. package/esm2022/tableview/tableview/components/tableview/tableview.component.mjs +0 -59
  394. package/esm2022/tableview/tableview/router/tableview-route-builder.mjs +0 -175
  395. package/esm2022/tableview/tableview/services/tableview-feature-config.token.mjs +0 -3
@@ -1,142 +0,0 @@
1
- import { Injectable, computed, inject, signal } from '@angular/core';
2
- import { Router } from '@angular/router';
3
- import { CommonsStorageService } from '@mediusinc/mng-commons/core';
4
- import { FilterDisplayTypeEnum } from '@mediusinc/mng-commons/filter';
5
- import { generateTableLayoutPrefsKey } from '../helpers/table-layout-prefs';
6
- import { TableMetadataService } from './table-metadata.service';
7
- import * as i0 from "@angular/core";
8
- export class TablePreferencesService {
9
- constructor() {
10
- this.#router = inject(Router);
11
- this.#storageService = inject(CommonsStorageService);
12
- this.#metadata = inject(TableMetadataService);
13
- this.localstorageKey = computed(() => {
14
- const descriptor = this.#metadata.descriptor();
15
- return descriptor.model.i18nBaseKey ? generateTableLayoutPrefsKey(descriptor.model.i18nBaseKey, this.#router.url, descriptor.identifier) : null;
16
- });
17
- this.#layoutPrefsSaveCnt = signal(0);
18
- this.layoutPreferences = computed(() => {
19
- const lsKey = this.localstorageKey();
20
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
21
- const cnt = this.#layoutPrefsSaveCnt(); // needed to force updates on user changes
22
- const layoutPrefs = lsKey ? this.#storageService.getItem(TableMetadataService.cmpTypeName, lsKey) : undefined;
23
- return layoutPrefs ?? { columnWidths: {} };
24
- });
25
- // columns
26
- this.columnsWithPrefs = computed(() => this.#computeColumnsWithLayout());
27
- }
28
- #router;
29
- #storageService;
30
- #metadata;
31
- #layoutPrefsSaveCnt;
32
- /**
33
- * Method is called on column resize
34
- * @param element event's element
35
- */
36
- onColumnResize({ element }) {
37
- const fieldId = element.id;
38
- const width = element.offsetWidth;
39
- const layoutPrefs = this.layoutPreferences();
40
- const col = this.columnsWithPrefs().find(el => el.descriptor.property === fieldId);
41
- if (col)
42
- col.width = width;
43
- if (!layoutPrefs.columnWidths)
44
- layoutPrefs.columnWidths = {};
45
- layoutPrefs.columnWidths[fieldId] = width;
46
- this.#saveLayoutPreferences(layoutPrefs);
47
- }
48
- onColumnToggle(event) {
49
- const layoutPrefs = this.layoutPreferences();
50
- const selectedColumns = event.value.map(v => v.descriptor.property);
51
- layoutPrefs.columnHidden = this.columnsWithPrefs()
52
- .filter(c => selectedColumns.indexOf(c.descriptor.property) < 0)
53
- .map(c => c.descriptor.property);
54
- this.#saveLayoutPreferences(layoutPrefs, true);
55
- }
56
- onColumnToggleAll() {
57
- const layoutPrefs = this.layoutPreferences();
58
- const columns = [...this.columnsWithPrefs()];
59
- const isVisible = !this.columnsWithPrefs().some(c => c.isVisible);
60
- for (const col of columns) {
61
- if (isVisible !== col.isVisible) {
62
- col.isVisible = isVisible;
63
- }
64
- }
65
- layoutPrefs.columnHidden = columns.filter(c => !c.isVisible).map(c => c.descriptor.property);
66
- this.#saveLayoutPreferences(layoutPrefs);
67
- }
68
- onColumnReorder(event) {
69
- if (event.dropIndex !== undefined && event.dropIndex >= 0 && event.dragIndex !== undefined && event.dragIndex >= 0 && event.dropIndex !== event.dragIndex) {
70
- const eventDropIndex = event.dropIndex;
71
- const eventDragIndex = event.dragIndex;
72
- const prevVisibleColumns = this.columnsWithPrefs().filter(c => c.isVisible);
73
- const colAtDrop = prevVisibleColumns[eventDropIndex];
74
- const colAtDrag = prevVisibleColumns[eventDragIndex];
75
- const colAtDropIndex = this.columnsWithPrefs().findIndex(el => el.id === colAtDrop.id);
76
- const colAtDragIndex = this.columnsWithPrefs().findIndex(el => el.id === colAtDrag.id);
77
- if (colAtDropIndex > -1 && colAtDragIndex > -1) {
78
- let columns = [...this.columnsWithPrefs()];
79
- columns.splice(colAtDragIndex, 1);
80
- const dropIndex = columns.findIndex(el => el.id === colAtDrop.id) + (eventDropIndex > eventDragIndex ? 1 : 0);
81
- columns = [...columns.slice(0, dropIndex), colAtDrag, ...columns.slice(dropIndex)];
82
- const layoutPrefs = this.layoutPreferences();
83
- layoutPrefs.columnOrder = columns.map(el => el.descriptor.property);
84
- this.#saveLayoutPreferences(layoutPrefs);
85
- }
86
- }
87
- }
88
- /**
89
- * Reset column order and column visibility to default settings
90
- */
91
- clearLayoutPreferences() {
92
- const key = this.localstorageKey();
93
- if (key) {
94
- this.#storageService.removeItem(TableMetadataService.cmpTypeName, key);
95
- this.#layoutPrefsSaveCnt.update(v => v + 1);
96
- }
97
- }
98
- #saveLayoutPreferences(layoutPrefs, forceUpdate = false) {
99
- const key = this.localstorageKey();
100
- if (key) {
101
- this.#storageService.setItem(TableMetadataService.cmpTypeName, key, layoutPrefs);
102
- if (forceUpdate) {
103
- this.#layoutPrefsSaveCnt.update(v => v + 1);
104
- }
105
- }
106
- }
107
- #computeColumnsWithLayout() {
108
- const descriptor = this.#metadata.descriptor();
109
- const layoutPrefs = this.layoutPreferences();
110
- // initialize columns with additional properties
111
- const timestamp = new Date().getTime();
112
- const columns = descriptor.columns.map(col => ({
113
- id: `${col.property}-${timestamp}`,
114
- descriptor: col,
115
- filter: this.#metadata
116
- .filters()
117
- .find(f => f.descriptor.showOnColumn === col.property &&
118
- ((f.descriptor.displayType == null && this.#metadata.defaultFilterDisplayType === FilterDisplayTypeEnum.Column) ||
119
- f.descriptor.displayType === FilterDisplayTypeEnum.Column)),
120
- sort: descriptor.sorts.find(f => f.showOnColumn === col.property),
121
- disabled: !col.isToggleable,
122
- isVisible: layoutPrefs.columnHidden ? !layoutPrefs.columnHidden.includes(col.property) : col.isVisible,
123
- width: layoutPrefs.columnWidths?.[col.property]
124
- }));
125
- if (layoutPrefs.columnOrder) {
126
- for (let i = 0; i < layoutPrefs.columnOrder.length; i++) {
127
- const colName = layoutPrefs.columnOrder[i];
128
- const colWithPrefs = columns.find(el => el.descriptor.property === colName);
129
- if (colWithPrefs) {
130
- colWithPrefs.orderIdx = i;
131
- }
132
- }
133
- }
134
- return columns.sort((a, b) => (a.orderIdx !== undefined && b.orderIdx !== undefined ? a.orderIdx - b.orderIdx : 0));
135
- }
136
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: TablePreferencesService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
137
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: TablePreferencesService }); }
138
- }
139
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: TablePreferencesService, decorators: [{
140
- type: Injectable
141
- }] });
142
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtcHJlZmVyZW5jZXMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3RhYmxlL3NyYy9zZXJ2aWNlcy90YWJsZS1wcmVmZXJlbmNlcy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDbkUsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBS3ZDLE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLDZCQUE2QixDQUFDO0FBQ2xFLE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLCtCQUErQixDQUFDO0FBR3BFLE9BQU8sRUFBQywyQkFBMkIsRUFBQyxNQUFNLCtCQUErQixDQUFDO0FBRTFFLE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLDBCQUEwQixDQUFDOztBQUc5RCxNQUFNLE9BQU8sdUJBQXVCO0lBRHBDO1FBRWEsWUFBTyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN6QixvQkFBZSxHQUFHLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQ2hELGNBQVMsR0FBRyxNQUFNLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUV6QyxvQkFBZSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUU7WUFDckMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUMvQyxPQUFPLFVBQVUsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQywyQkFBMkIsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUNwSixDQUFDLENBQUMsQ0FBQztRQUNN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QyxFQUFFLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEtBQUssT0FBTyxDQUFDLENBQUM7Z0JBQzVFLElBQUksWUFBWSxFQUFFLENBQUM7b0JBQ2YsWUFBWSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUM7Z0JBQzlCLENBQUM7WUFDTCxDQUFDO1FBQ0wsQ0FBQztRQUVELE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsS0FBSyxTQUFTLElBQUksQ0FBQyxDQUFDLFFBQVEsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN4SCxDQUFDOytHQXpJUSx1QkFBdUI7bUhBQXZCLHVCQUF1Qjs7NEZBQXZCLHVCQUF1QjtrQkFEbkMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SW5qZWN0YWJsZSwgY29tcHV0ZWQsIGluamVjdCwgc2lnbmFsfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7Um91dGVyfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuXG5pbXBvcnQge011bHRpU2VsZWN0Q2hhbmdlRXZlbnR9IGZyb20gJ3ByaW1lbmcvbXVsdGlzZWxlY3QnO1xuaW1wb3J0IHtUYWJsZUNvbHVtblJlb3JkZXJFdmVudH0gZnJvbSAncHJpbWVuZy90YWJsZSc7XG5cbmltcG9ydCB7Q29tbW9uc1N0b3JhZ2VTZXJ2aWNlfSBmcm9tICdAbWVkaXVzaW5jL21uZy1jb21tb25zL2NvcmUnO1xuaW1wb3J0IHtGaWx0ZXJEaXNwbGF5VHlwZUVudW19IGZyb20gJ0BtZWRpdXNpbmMvbW5nLWNvbW1vbnMvZmlsdGVyJztcbmltcG9ydCB7VGFibGVMYXlvdXRQcmVmZXJlbmNlc30gZnJvbSAnQG1lZGl1c2luYy9tbmctY29tbW9ucy90YWJsZS9hcGknO1xuXG5pbXBvcnQge2dlbmVyYXRlVGFibGVMYXlvdXRQcmVmc0tleX0gZnJvbSAnLi4vaGVscGVycy90YWJsZS1sYXlvdXQtcHJlZnMnO1xuaW1wb3J0IHtDb2x1bW5XaXRoUHJlZmVyZW5jZXN9IGZyb20gJy4uL21vZGVscy9jb2x1bW4tcHJlZmVyZW5jZXMubW9kZWwnO1xuaW1wb3J0IHtUYWJsZU1ldGFkYXRhU2VydmljZX0gZnJvbSAnLi90YWJsZS1tZXRhZGF0YS5zZXJ2aWNlJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFRhYmxlUHJlZmVyZW5jZXNTZXJ2aWNlIHtcbiAgICByZWFkb25seSAjcm91dGVyID0gaW5qZWN0KFJvdXRlcik7XG4gICAgcmVhZG9ubHkgI3N0b3JhZ2VTZXJ2aWNlID0gaW5qZWN0KENvbW1vbnNTdG9yYWdlU2VydmljZSk7XG4gICAgcmVhZG9ubHkgI21ldGFkYXRhID0gaW5qZWN0KFRhYmxlTWV0YWRhdGFTZXJ2aWNlKTtcblxuICAgIHJlYWRvbmx5IGxvY2Fsc3RvcmFnZUtleSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgY29uc3QgZGVzY3JpcHRvciA9IHRoaXMuI21ldGFkYXRhLmRlc2NyaXB0b3IoKTtcbiAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3IubW9kZWwuaTE4bkJhc2VLZXkgPyBnZW5lcmF0ZVRhYmxlTGF5b3V0UHJlZnNLZXkoZGVzY3JpcHRvci5tb2RlbC5pMThuQmFzZUtleSwgdGhpcy4jcm91dGVyLnVybCwgZGVzY3JpcHRvci5pZGVudGlmaWVyKSA6IG51bGw7XG4gICAgfSk7XG4gICAgcmVhZG9ubHkgI2xheW91dFByZWZzU2F2ZUNudCA9IHNpZ25hbCgwKTtcbiAgICByZWFkb25seSBsYXlvdXRQcmVmZXJlbmNlcyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgY29uc3QgbHNLZXkgPSB0aGlzLmxvY2Fsc3RvcmFnZUtleSgpO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgIGNvbnN0IGNudCA9IHRoaXMuI2xheW91dFByZWZzU2F2ZUNudCgpOyAvLyBuZWVkZWQgdG8gZm9yY2UgdXBkYXRlcyBvbiB1c2VyIGNoYW5nZXNcbiAgICAgICAgY29uc3QgbGF5b3V0UHJlZnMgPSBsc0tleSA/IHRoaXMuI3N0b3JhZ2VTZXJ2aWNlLmdldEl0ZW08VGFibGVMYXlvdXRQcmVmZXJlbmNlcz4oVGFibGVNZXRhZGF0YVNlcnZpY2UuY21wVHlwZU5hbWUsIGxzS2V5KSA6IHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIGxheW91dFByZWZzID8/IHtjb2x1bW5XaWR0aHM6IHt9fTtcbiAgICB9KTtcblxuICAgIC8vIGNvbHVtbnNcbiAgICBjb2x1bW5zV2l0aFByZWZzID0gY29tcHV0ZWQ8Q29sdW1uV2l0aFByZWZlcmVuY2VzW10+KCgpID0+IHRoaXMuI2NvbXB1dGVDb2x1bW5zV2l0aExheW91dCgpKTtcblxuICAgIC8qKlxuICAgICAqIE1ldGhvZCBpcyBjYWxsZWQgb24gY29sdW1uIHJlc2l6ZVxuICAgICAqIEBwYXJhbSBlbGVtZW50IGV2ZW50J3MgZWxlbWVudFxuICAgICAqL1xuICAgIHB1YmxpYyBvbkNvbHVtblJlc2l6ZSh7ZWxlbWVudH06IGFueSk6IHZvaWQge1xuICAgICAgICBjb25zdCBmaWVsZElkOiBzdHJpbmcgPSBlbGVtZW50LmlkO1xuICAgICAgICBjb25zdCB3aWR0aDogbnVtYmVyID0gZWxlbWVudC5vZmZzZXRXaWR0aDtcblxuICAgICAgICBjb25zdCBsYXlvdXRQcmVmcyA9IHRoaXMubGF5b3V0UHJlZmVyZW5jZXMoKTtcbiAgICAgICAgY29uc3QgY29sID0gdGhpcy5jb2x1bW5zV2l0aFByZWZzKCkuZmluZChlbCA9PiBlbC5kZXNjcmlwdG9yLnByb3BlcnR5ID09PSBmaWVsZElkKTtcbiAgICAgICAgaWYgKGNvbCkgY29sLndpZHRoID0gd2lkdGg7XG4gICAgICAgIGlmICghbGF5b3V0UHJlZnMuY29sdW1uV2lkdGhzKSBsYXlvdXRQcmVmcy5jb2x1bW5XaWR0aHMgPSB7fTtcblxuICAgICAgICBsYXlvdXRQcmVmcy5jb2x1bW5XaWR0aHNbZmllbGRJZF0gPSB3aWR0aDtcbiAgICAgICAgdGhpcy4jc2F2ZUxheW91dFByZWZlcmVuY2VzKGxheW91dFByZWZzKTtcbiAgICB9XG5cbiAgICBvbkNvbHVtblRvZ2dsZShldmVudDogTXVsdGlTZWxlY3RDaGFuZ2VFdmVudCkge1xuICAgICAgICBjb25zdCBsYXlvdXRQcmVmcyA9IHRoaXMubGF5b3V0UHJlZmVyZW5jZXMoKTtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRDb2x1bW5zID0gKGV2ZW50LnZhbHVlIGFzIENvbHVtbldpdGhQcmVmZXJlbmNlc1tdKS5tYXAodiA9PiB2LmRlc2NyaXB0b3IucHJvcGVydHkpO1xuICAgICAgICBsYXlvdXRQcmVmcy5jb2x1bW5IaWRkZW4gPSB0aGlzLmNvbHVtbnNXaXRoUHJlZnMoKVxuICAgICAgICAgICAgLmZpbHRlcihjID0+IHNlbGVjdGVkQ29sdW1ucy5pbmRleE9mKGMuZGVzY3JpcHRvci5wcm9wZXJ0eSkgPCAwKVxuICAgICAgICAgICAgLm1hcChjID0+IGMuZGVzY3JpcHRvci5wcm9wZXJ0eSk7XG4gICAgICAgIHRoaXMuI3NhdmVMYXlvdXRQcmVmZXJlbmNlcyhsYXlvdXRQcmVmcywgdHJ1ZSk7XG4gICAgfVxuXG4gICAgb25Db2x1bW5Ub2dnbGVBbGwoKSB7XG4gICAgICAgIGNvbnN0IGxheW91dFByZWZzID0gdGhpcy5sYXlvdXRQcmVmZXJlbmNlcygpO1xuICAgICAgICBjb25zdCBjb2x1bW5zID0gWy4uLnRoaXMuY29sdW1uc1dpdGhQcmVmcygpXTtcbiAgICAgICAgY29uc3QgaXNWaXNpYmxlID0gIXRoaXMuY29sdW1uc1dpdGhQcmVmcygpLnNvbWUoYyA9PiBjLmlzVmlzaWJsZSk7XG4gICAgICAgIGZvciAoY29uc3QgY29sIG9mIGNvbHVtbnMpIHtcbiAgICAgICAgICAgIGlmIChpc1Zpc2libGUgIT09IGNvbC5pc1Zpc2libGUpIHtcbiAgICAgICAgICAgICAgICBjb2wuaXNWaXNpYmxlID0gaXNWaXNpYmxlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxheW91dFByZWZzLmNvbHVtbkhpZGRlbiA9IGNvbHVtbnMuZmlsdGVyKGMgPT4gIWMuaXNWaXNpYmxlKS5tYXAoYyA9PiBjLmRlc2NyaXB0b3IucHJvcGVydHkpO1xuICAgICAgICB0aGlzLiNzYXZlTGF5b3V0UHJlZmVyZW5jZXMobGF5b3V0UHJlZnMpO1xuICAgIH1cblxuICAgIG9uQ29sdW1uUmVvcmRlcihldmVudDogVGFibGVDb2x1bW5SZW9yZGVyRXZlbnQpIHtcbiAgICAgICAgaWYgKGV2ZW50LmRyb3BJbmRleCAhPT0gdW5kZWZpbmVkICYmIGV2ZW50LmRyb3BJbmRleCA+PSAwICYmIGV2ZW50LmRyYWdJbmRleCAhPT0gdW5kZWZpbmVkICYmIGV2ZW50LmRyYWdJbmRleCA+PSAwICYmIGV2ZW50LmRyb3BJbmRleCAhPT0gZXZlbnQuZHJhZ0luZGV4KSB7XG4gICAgICAgICAgICBjb25zdCBldmVudERyb3BJbmRleCA9IGV2ZW50LmRyb3BJbmRleDtcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50RHJhZ0luZGV4ID0gZXZlbnQuZHJhZ0luZGV4O1xuICAgICAgICAgICAgY29uc3QgcHJldlZpc2libGVDb2x1bW5zID0gdGhpcy5jb2x1bW5zV2l0aFByZWZzKCkuZmlsdGVyKGMgPT4gYy5pc1Zpc2libGUpO1xuICAgICAgICAgICAgY29uc3QgY29sQXREcm9wID0gcHJldlZpc2libGVDb2x1bW5zW2V2ZW50RHJvcEluZGV4XTtcbiAgICAgICAgICAgIGNvbnN0IGNvbEF0RHJhZyA9IHByZXZWaXNpYmxlQ29sdW1uc1tldmVudERyYWdJbmRleF07XG4gICAgICAgICAgICBjb25zdCBjb2xBdERyb3BJbmRleCA9IHRoaXMuY29sdW1uc1dpdGhQcmVmcygpLmZpbmRJbmRleChlbCA9PiBlbC5pZCA9PT0gY29sQXREcm9wLmlkKTtcbiAgICAgICAgICAgIGNvbnN0IGNvbEF0RHJhZ0luZGV4ID0gdGhpcy5jb2x1bW5zV2l0aFByZWZzKCkuZmluZEluZGV4KGVsID0+IGVsLmlkID09PSBjb2xBdERyYWcuaWQpO1xuXG4gICAgICAgICAgICBpZiAoY29sQXREcm9wSW5kZXggPiAtMSAmJiBjb2xBdERyYWdJbmRleCA+IC0xKSB7XG4gICAgICAgICAgICAgICAgbGV0IGNvbHVtbnMgPSBbLi4udGhpcy5jb2x1bW5zV2l0aFByZWZzKCldO1xuICAgICAgICAgICAgICAgIGNvbHVtbnMuc3BsaWNlKGNvbEF0RHJhZ0luZGV4LCAxKTtcbiAgICAgICAgICAgICAgICBjb25zdCBkcm9wSW5kZXggPSBjb2x1bW5zLmZpbmRJbmRleChlbCA9PiBlbC5pZCA9PT0gY29sQXREcm9wLmlkKSArIChldmVudERyb3BJbmRleCA+IGV2ZW50RHJhZ0luZGV4ID8gMSA6IDApO1xuICAgICAgICAgICAgICAgIGNvbHVtbnMgPSBbLi4uY29sdW1ucy5zbGljZSgwLCBkcm9wSW5kZXgpLCBjb2xBdERyYWcsIC4uLmNvbHVtbnMuc2xpY2UoZHJvcEluZGV4KV07XG4gICAgICAgICAgICAgICAgY29uc3QgbGF5b3V0UHJlZnMgPSB0aGlzLmxheW91dFByZWZlcmVuY2VzKCk7XG4gICAgICAgICAgICAgICAgbGF5b3V0UHJlZnMuY29sdW1uT3JkZXIgPSBjb2x1bW5zLm1hcChlbCA9PiBlbC5kZXNjcmlwdG9yLnByb3BlcnR5KTtcbiAgICAgICAgICAgICAgICB0aGlzLiNzYXZlTGF5b3V0UHJlZmVyZW5jZXMobGF5b3V0UHJlZnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzZXQgY29sdW1uIG9yZGVyIGFuZCBjb2x1bW4gdmlzaWJpbGl0eSB0byBkZWZhdWx0IHNldHRpbmdzXG4gICAgICovXG4gICAgY2xlYXJMYXlvdXRQcmVmZXJlbmNlcygpIHtcbiAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5sb2NhbHN0b3JhZ2VLZXkoKTtcbiAgICAgICAgaWYgKGtleSkge1xuICAgICAgICAgICAgdGhpcy4jc3RvcmFnZVNlcnZpY2UucmVtb3ZlSXRlbShUYWJsZU1ldGFkYXRhU2VydmljZS5jbXBUeXBlTmFtZSwga2V5KTtcbiAgICAgICAgICAgIHRoaXMuI2xheW91dFByZWZzU2F2ZUNudC51cGRhdGUodiA9PiB2ICsgMSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAjc2F2ZUxheW91dFByZWZlcmVuY2VzKGxheW91dFByZWZzOiBUYWJsZUxheW91dFByZWZlcmVuY2VzLCBmb3JjZVVwZGF0ZSA9IGZhbHNlKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IHRoaXMubG9jYWxzdG9yYWdlS2V5KCk7XG4gICAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgICAgIHRoaXMuI3N0b3JhZ2VTZXJ2aWNlLnNldEl0ZW0oVGFibGVNZXRhZGF0YVNlcnZpY2UuY21wVHlwZU5hbWUsIGtleSwgbGF5b3V0UHJlZnMpO1xuICAgICAgICAgICAgaWYgKGZvcmNlVXBkYXRlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy4jbGF5b3V0UHJlZnNTYXZlQ250LnVwZGF0ZSh2ID0+IHYgKyAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgICNjb21wdXRlQ29sdW1uc1dpdGhMYXlvdXQoKSB7XG4gICAgICAgIGNvbnN0IGRlc2NyaXB0b3IgPSB0aGlzLiNtZXRhZGF0YS5kZXNjcmlwdG9yKCk7XG4gICAgICAgIGNvbnN0IGxheW91dFByZWZzID0gdGhpcy5sYXlvdXRQcmVmZXJlbmNlcygpO1xuXG4gICAgICAgIC8vIGluaXRpYWxpemUgY29sdW1ucyB3aXRoIGFkZGl0aW9uYWwgcHJvcGVydGllc1xuICAgICAgICBjb25zdCB0aW1lc3RhbXAgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICAgICAgY29uc3QgY29sdW1uczogQ29sdW1uV2l0aFByZWZlcmVuY2VzW10gPSBkZXNjcmlwdG9yLmNvbHVtbnMubWFwKGNvbCA9PiAoe1xuICAgICAgICAgICAgaWQ6IGAke2NvbC5wcm9wZXJ0eX0tJHt0aW1lc3RhbXB9YCxcbiAgICAgICAgICAgIGRlc2NyaXB0b3I6IGNvbCxcbiAgICAgICAgICAgIGZpbHRlcjogdGhpcy4jbWV0YWRhdGFcbiAgICAgICAgICAgICAgICAuZmlsdGVycygpXG4gICAgICAgICAgICAgICAgLmZpbmQoXG4gICAgICAgICAgICAgICAgICAgIGYgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgIGYuZGVzY3JpcHRvci5zaG93T25Db2x1bW4gPT09IGNvbC5wcm9wZXJ0eSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgKChmLmRlc2NyaXB0b3IuZGlzcGxheVR5cGUgPT0gbnVsbCAmJiB0aGlzLiNtZXRhZGF0YS5kZWZhdWx0RmlsdGVyRGlzcGxheVR5cGUgPT09IEZpbHRlckRpc3BsYXlUeXBlRW51bS5Db2x1bW4pIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5kZXNjcmlwdG9yLmRpc3BsYXlUeXBlID09PSBGaWx0ZXJEaXNwbGF5VHlwZUVudW0uQ29sdW1uKVxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICBzb3J0OiBkZXNjcmlwdG9yLnNvcnRzLmZpbmQoZiA9PiBmLnNob3dPbkNvbHVtbiA9PT0gY29sLnByb3BlcnR5KSxcbiAgICAgICAgICAgIGRpc2FibGVkOiAhY29sLmlzVG9nZ2xlYWJsZSxcbiAgICAgICAgICAgIGlzVmlzaWJsZTogbGF5b3V0UHJlZnMuY29sdW1uSGlkZGVuID8gIWxheW91dFByZWZzLmNvbHVtbkhpZGRlbi5pbmNsdWRlcyhjb2wucHJvcGVydHkpIDogY29sLmlzVmlzaWJsZSxcbiAgICAgICAgICAgIHdpZHRoOiBsYXlvdXRQcmVmcy5jb2x1bW5XaWR0aHM/Lltjb2wucHJvcGVydHldXG4gICAgICAgIH0pKTtcblxuICAgICAgICBpZiAobGF5b3V0UHJlZnMuY29sdW1uT3JkZXIpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGF5b3V0UHJlZnMuY29sdW1uT3JkZXIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb2xOYW1lID0gbGF5b3V0UHJlZnMuY29sdW1uT3JkZXJbaV07XG4gICAgICAgICAgICAgICAgY29uc3QgY29sV2l0aFByZWZzID0gY29sdW1ucy5maW5kKGVsID0+IGVsLmRlc2NyaXB0b3IucHJvcGVydHkgPT09IGNvbE5hbWUpO1xuICAgICAgICAgICAgICAgIGlmIChjb2xXaXRoUHJlZnMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29sV2l0aFByZWZzLm9yZGVySWR4ID0gaTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY29sdW1ucy5zb3J0KChhLCBiKSA9PiAoYS5vcmRlcklkeCAhPT0gdW5kZWZpbmVkICYmIGIub3JkZXJJZHggIT09IHVuZGVmaW5lZCA/IGEub3JkZXJJZHggLSBiLm9yZGVySWR4IDogMCkpO1xuICAgIH1cbn1cbiJdfQ==
@@ -1,277 +0,0 @@
1
- import { ChangeDetectionStrategy, Component, booleanAttribute, computed, effect, inject, input, output, signal, viewChild } from '@angular/core';
2
- import { toSignal } from '@angular/core/rxjs-interop';
3
- import { ActivatedRoute } from '@angular/router';
4
- import { TranslateService } from '@ngx-translate/core';
5
- import { ButtonModule } from 'primeng/button';
6
- import { Menu, MenuModule } from 'primeng/menu';
7
- import { RippleModule } from 'primeng/ripple';
8
- import { SplitButtonModule } from 'primeng/splitbutton';
9
- import { TooltipModule } from 'primeng/tooltip';
10
- import { combineLatest } from 'rxjs';
11
- import { ComponentDirective, ParametrizePipe, PermissionService, Permissions, toObservable } from '@mediusinc/mng-commons/core';
12
- import { ButtonStyleBuilder } from '@mediusinc/mng-commons/form/api';
13
- import { ActionInstanceStateEnum, ActionLinkDescriptorInst, ActionTypeEnum } from '@mediusinc/mng-commons/tableview/api';
14
- import { getI18nForActionAsync } from '../../helpers/i18n';
15
- import { ActionExecutorService } from '../../services/action-executor.service';
16
- import { provideActionExecutor } from '../../services/providers/provide-action-executor';
17
- import { ViewContainer } from '../../services/view-container.service';
18
- import * as i0 from "@angular/core";
19
- import * as i1 from "primeng/button";
20
- import * as i2 from "primeng/ripple";
21
- import * as i3 from "primeng/tooltip";
22
- import * as i4 from "primeng/splitbutton";
23
- import * as i5 from "@angular/router";
24
- import * as i6 from "primeng/menu";
25
- export class ActionComponent {
26
- constructor() {
27
- this.routeService = inject(ActivatedRoute);
28
- this.translate = inject(TranslateService);
29
- this.authorization = inject(PermissionService);
30
- this.actionExecutor = inject(ActionExecutorService);
31
- this.viewContainer = inject((ViewContainer), { optional: true });
32
- // metadata and editor mode input
33
- this.action = input.required();
34
- this.item = input();
35
- this.itemId = input();
36
- this.actionData = input();
37
- this.dataListParams = input();
38
- this.dataProvider = input();
39
- this.hostComponent = input();
40
- this.routeInit = input(undefined, { alias: 'route' });
41
- this.inputDisabled = input(false, { alias: 'disabled', transform: booleanAttribute });
42
- this.inputLoading = input(false, { alias: 'loading', transform: booleanAttribute });
43
- this.selectedItems = input([]);
44
- this.finish = output();
45
- this.subactionsMenu = viewChild(Menu);
46
- this.hostClass = computed(() => this.action().button?.style?.class ?? 'mng-action-button');
47
- this.isHostHidden = computed(() => !this.isVisible() || !this.isPermitted());
48
- this.loading = signal(false);
49
- this.isVisible = signal(true);
50
- this.isPermitted = signal(true);
51
- this.isEnabled = signal(true);
52
- this.label = signal('');
53
- this.tooltip = signal('');
54
- this.actionLink = computed(() => {
55
- const action = this.action();
56
- return action instanceof ActionLinkDescriptorInst ? action : undefined;
57
- });
58
- this.hasNoTitle = computed(() => this.action().button?.label === null);
59
- this.route = computed(() => this.routeInit() ?? this.routeService);
60
- this.routeData = toSignal(this.route().data);
61
- this.routePermissions = computed(() => {
62
- const routeData = this.routeData();
63
- const action = this.action();
64
- if (action.tableviewCategory && routeData && routeData['tableviewPermissions']) {
65
- const tableviewPermissions = routeData['tableviewPermissions'];
66
- if (tableviewPermissions[action.tableviewCategory]) {
67
- return tableviewPermissions[action.tableviewCategory];
68
- }
69
- }
70
- return undefined;
71
- });
72
- this.buttonClass = computed(() => {
73
- const action = this.action();
74
- return (action.button?.style instanceof ButtonStyleBuilder ? action.button.style : ButtonStyleBuilder.from(action.button?.style)).build(this.hasNoTitle());
75
- });
76
- this.subactions = signal([]);
77
- this.subactionSubscriptions = [];
78
- effect(() => this.processSubscriptions(), { allowSignalWrites: true });
79
- }
80
- ngOnDestroy() {
81
- this.actionExecutor.onActionDestroy(this.instance);
82
- this.isVisibleSubscription?.unsubscribe();
83
- this.isPermittedSubscription?.unsubscribe();
84
- this.isEnabledSubscription?.unsubscribe();
85
- this.labelSubscription?.unsubscribe();
86
- this.tooltipSubscription?.unsubscribe();
87
- this.resultSubscription?.unsubscribe();
88
- this.errorSubscription?.unsubscribe();
89
- this.stateSubscription?.unsubscribe();
90
- this.cmpInstSubscription?.unsubscribe();
91
- this.subactionSubscriptions.forEach(s => s.unsubscribe());
92
- }
93
- triggerAction(action, parameters, event) {
94
- if (action.subactionsAsMenu) {
95
- this.subactionsMenu()?.toggle(event ?? new Event('trigger'));
96
- return;
97
- }
98
- const actionData = this.actionData() ? this.actionData() : {};
99
- parameters ??= {
100
- itemId: this.itemId(),
101
- item: this.item(),
102
- actionData: actionData,
103
- dataListParams: this.dataListParams(),
104
- route: this.route(),
105
- sourceComponent: this,
106
- hostComponent: this.hostComponent(),
107
- selectedItems: this.selectedItems()
108
- };
109
- const instance = this.actionExecutor.triggerAction(action, parameters);
110
- this.instance = instance;
111
- const context = instance.context;
112
- if (!context) {
113
- // no context is provided if routing is triggered or editor is opened via dialog
114
- // it is in another component jurisdiction to handle contexts
115
- return;
116
- }
117
- this.resultSubscription?.unsubscribe();
118
- this.resultSubscription = instance.result$.subscribe({
119
- next: () => {
120
- this.finish.emit(instance);
121
- if (action.hasItemsSelection) {
122
- this.viewContainer?.reloadTable();
123
- }
124
- }
125
- });
126
- this.errorSubscription?.unsubscribe();
127
- this.errorSubscription = instance.error$.subscribe({
128
- next: () => {
129
- this.finish.emit(instance);
130
- }
131
- });
132
- this.stateSubscription?.unsubscribe();
133
- this.stateSubscription = this.instance.state$.subscribe(s => {
134
- switch (s) {
135
- case ActionInstanceStateEnum.RunStart:
136
- this.loading.set(true);
137
- break;
138
- case ActionInstanceStateEnum.RunEnd:
139
- case ActionInstanceStateEnum.RunError:
140
- this.loading.set(false);
141
- break;
142
- case ActionInstanceStateEnum.NextActionStart:
143
- if (this.instance?.nextActionInstance?.action.type === ActionTypeEnum.Direct) {
144
- this.loading.set(true);
145
- }
146
- break;
147
- case ActionInstanceStateEnum.NextActionEnd:
148
- if (this.instance?.nextActionInstance?.action.type === ActionTypeEnum.Direct) {
149
- this.loading.set(false);
150
- }
151
- break;
152
- case ActionInstanceStateEnum.ErrorActionStart:
153
- if (this.instance?.errorActionInstance?.action.type === ActionTypeEnum.Direct) {
154
- this.loading.set(true);
155
- }
156
- break;
157
- case ActionInstanceStateEnum.ErrorActionEnd:
158
- if (this.instance?.errorActionInstance?.action.type === ActionTypeEnum.Direct) {
159
- this.loading.set(false);
160
- }
161
- break;
162
- }
163
- });
164
- this.actionExecutor.run(context);
165
- }
166
- onCustomActionCmpInst(instance) {
167
- this.cmpInstSubscription?.unsubscribe();
168
- this.cmpInstSubscription = instance.trigger.subscribe(params => this.triggerAction(this.action(), params));
169
- }
170
- processSubscriptions() {
171
- const parameters = {
172
- itemId: this.itemId(),
173
- item: this.item(),
174
- actionData: this.actionData(),
175
- sourceComponent: this
176
- };
177
- const action = this.action();
178
- if (action.hasItemsSelection) {
179
- parameters.selectedItems = this.selectedItems();
180
- }
181
- const context = this.actionExecutor.prepareActionContextValidation(action, parameters, this.dataProvider());
182
- if (typeof action.isVisibleFunction === 'function') {
183
- this.isVisibleSubscription?.unsubscribe();
184
- this.isVisibleSubscription = toObservable(action.isVisibleFunction(context)).subscribe({
185
- next: res => this.isVisible.set(res)
186
- });
187
- }
188
- const routePermissions = this.routePermissions();
189
- if (typeof action.permissions !== 'undefined' || typeof routePermissions !== 'undefined') {
190
- this.isPermittedSubscription?.unsubscribe();
191
- const permissions = action.permissions && routePermissions ? Permissions.All.of(routePermissions, action.permissions) : (routePermissions ?? action.permissions);
192
- this.isVisibleSubscription = this.authorization.isActionVisible(permissions, context, this.route().snapshot).subscribe({
193
- next: res => this.isPermitted.set(res)
194
- });
195
- }
196
- if (typeof action.isEnabledFunction === 'function') {
197
- this.isEnabledSubscription?.unsubscribe();
198
- this.isEnabledSubscription = toObservable(action.isEnabledFunction(context)).subscribe({
199
- next: res => this.isEnabled.set(res)
200
- });
201
- }
202
- if (!this.hasNoTitle()) {
203
- this.labelSubscription?.unsubscribe();
204
- this.labelSubscription = getI18nForActionAsync(this.translate, action, 'title', { customKey: action.button?.label ?? undefined, item: this.item() }).subscribe({
205
- next: i18n => this.label.set(i18n ?? '')
206
- });
207
- }
208
- this.tooltipSubscription?.unsubscribe();
209
- if (action.button?.tooltip !== null && (action.button?.tooltip ?? true)) {
210
- this.tooltipSubscription = getI18nForActionAsync(this.translate, action, 'tooltip', {
211
- customKey: action.button?.tooltip,
212
- item: this.item(),
213
- missingTranslationStrategy: 'returnNull'
214
- }).subscribe({
215
- next: i18n => {
216
- this.tooltip.set(i18n ?? action.button?.tooltip ?? '');
217
- }
218
- });
219
- }
220
- this.subactions.set(this.processSubactions());
221
- }
222
- processSubactions() {
223
- this.subactionSubscriptions.forEach(s => s.unsubscribe());
224
- this.subactionSubscriptions = [];
225
- const menuItems = [];
226
- for (const subaction of this.action().subactions) {
227
- const menuItem = {};
228
- menuItem.icon = subaction.button?.icon ?? undefined;
229
- this.subactionSubscriptions.push(getI18nForActionAsync(this.translate, subaction, 'title', { customKey: subaction.button?.label ?? undefined, item: this.item() }).subscribe({
230
- next: res => (menuItem.label = res ?? undefined)
231
- }));
232
- this.subactionSubscriptions.push(getI18nForActionAsync(this.translate, subaction, 'tooltip', { customKey: subaction.button?.tooltip ?? undefined, item: this.item() }).subscribe({
233
- next: res => (menuItem.tooltip = res ?? undefined)
234
- }));
235
- const parameters = {
236
- itemId: this.itemId(),
237
- item: this.item(),
238
- actionData: this.actionData(),
239
- sourceComponent: this
240
- };
241
- if (subaction.hasItemsSelection) {
242
- parameters.selectedItems = this.selectedItems();
243
- }
244
- const context = this.actionExecutor.prepareActionContextValidation(subaction, parameters, this.dataProvider());
245
- if (typeof subaction.isEnabledFunction === 'function') {
246
- this.subactionSubscriptions.push(toObservable(subaction.isEnabledFunction(context)).subscribe({
247
- next: res => (menuItem.disabled = !res)
248
- }));
249
- }
250
- const visibilityObservables = [];
251
- if (typeof subaction.isVisibleFunction === 'function') {
252
- visibilityObservables.push(toObservable(subaction.isVisibleFunction(context)));
253
- }
254
- if (typeof subaction.permissions !== 'undefined') {
255
- visibilityObservables.push(this.authorization.isActionVisible(subaction.permissions, context, this.route().snapshot));
256
- }
257
- const routeData = this.route().snapshot.data;
258
- if (subaction.tableviewCategory && routeData.tableviewPermissions && routeData.tableviewPermissions[subaction.tableviewCategory]) {
259
- const routePermissions = routeData.tableviewPermissions[subaction.tableviewCategory];
260
- visibilityObservables.push(this.authorization.isActionVisible(routePermissions, context, this.route().snapshot));
261
- }
262
- this.subactionSubscriptions.push(combineLatest(visibilityObservables).subscribe(visibilities => {
263
- menuItem.visible = visibilities.every(value => value);
264
- }));
265
- menuItem.command = () => this.triggerAction(subaction);
266
- menuItems.push(menuItem);
267
- }
268
- return menuItems;
269
- }
270
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ActionComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
271
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.12", type: ActionComponent, isStandalone: true, selector: "mng-action", inputs: { action: { classPropertyName: "action", publicName: "action", isSignal: true, isRequired: true, transformFunction: null }, item: { classPropertyName: "item", publicName: "item", isSignal: true, isRequired: false, transformFunction: null }, itemId: { classPropertyName: "itemId", publicName: "itemId", isSignal: true, isRequired: false, transformFunction: null }, actionData: { classPropertyName: "actionData", publicName: "actionData", isSignal: true, isRequired: false, transformFunction: null }, dataListParams: { classPropertyName: "dataListParams", publicName: "dataListParams", isSignal: true, isRequired: false, transformFunction: null }, dataProvider: { classPropertyName: "dataProvider", publicName: "dataProvider", isSignal: true, isRequired: false, transformFunction: null }, hostComponent: { classPropertyName: "hostComponent", publicName: "hostComponent", isSignal: true, isRequired: false, transformFunction: null }, routeInit: { classPropertyName: "routeInit", publicName: "route", isSignal: true, isRequired: false, transformFunction: null }, inputDisabled: { classPropertyName: "inputDisabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, inputLoading: { classPropertyName: "inputLoading", publicName: "loading", isSignal: true, isRequired: false, transformFunction: null }, selectedItems: { classPropertyName: "selectedItems", publicName: "selectedItems", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { finish: "finish" }, host: { properties: { "class": "hostClass()", "class.m-0": "isHostHidden()" } }, providers: [provideActionExecutor()], viewQueries: [{ propertyName: "subactionsMenu", first: true, predicate: Menu, descendants: true, isSignal: true }], ngImport: i0, template: "@if (isVisible() && isPermitted()) {\n @if (actionLink(); as actionLink) {\n @if (actionLink.url !== '') {\n <a\n pButton\n pRipple\n [label]=\"label()\"\n [icon]=\"$any(action().button?.icon)\"\n [iconPos]=\"action().button?.iconPosition ?? 'left'\"\n [href]=\"!isEnabled() || inputDisabled() ? null : (actionLink.url | mngParametrize: itemId() : item() : actionData())\"\n [target]=\"actionLink.target\"\n [class.disabled]=\"!isEnabled() || inputDisabled()\"\n [pTooltip]=\"tooltip()\"\n [tooltipPosition]=\"action().button?.tooltipPosition ?? 'top'\"\n [class]=\"buttonClass()\"></a>\n } @else {\n <a\n pButton\n pRipple\n [icon]=\"$any(action().button?.icon)\"\n [iconPos]=\"action().button?.iconPosition ?? 'left'\"\n [label]=\"label()\"\n [target]=\"actionLink.target\"\n [replaceUrl]=\"actionLink.replaceUrl\"\n [routerLink]=\"!isEnabled() || inputDisabled() ? null : (actionLink.pathSegments | mngParametrize: itemId() : item() : actionData())\"\n [relativeTo]=\"route()\"\n [queryParams]=\"actionLink.queryParams | mngParametrize: itemId() : item() : actionData()\"\n [queryParamsHandling]=\"actionLink.queryParamsHandling\"\n [class.disabled]=\"!isEnabled() || inputDisabled()\"\n [pTooltip]=\"tooltip()\"\n [tooltipPosition]=\"action().button?.tooltipPosition ?? 'top'\"\n [class]=\"buttonClass()\"></a>\n }\n } @else if (action().component || action().componentFromDi) {\n <ng-container\n [mngComponent]=\"action().component\"\n [injectionToken]=\"action().componentFromDi\"\n [inputs]=\"{\n action: action(),\n item: item(),\n itemId: itemId(),\n actionData: actionData(),\n enabled: isEnabled(),\n loading: loading()\n }\"\n (instanceCreated)=\"onCustomActionCmpInst($event)\">\n </ng-container>\n } @else if (action().subactions.length > 0 && !action().subactionsAsMenu) {\n <p-splitButton\n [icon]=\"action().button?.icon ?? undefined\"\n [iconPos]=\"action().button?.iconPosition ?? 'left'\"\n [label]=\"label()\"\n [pTooltip]=\"tooltip()\"\n [tooltipPosition]=\"action().button?.tooltipPosition ?? 'top'\"\n [disabled]=\"!isEnabled() || inputDisabled()\"\n (onClick)=\"triggerAction(action())\"\n [class]=\"buttonClass()\"\n [model]=\"subactions()\">\n </p-splitButton>\n } @else {\n <button\n pButton\n pRipple\n type=\"button\"\n [icon]=\"$any(action().button?.icon)\"\n [iconPos]=\"action().button?.iconPosition ?? 'left'\"\n [label]=\"label()\"\n [pTooltip]=\"tooltip()\"\n [tooltipPosition]=\"action().button?.tooltipPosition ?? 'top'\"\n [loading]=\"loading() || inputLoading()\"\n loadingIcon=\"pi pi-spin pi-spinner\"\n [disabled]=\"!isEnabled() || inputDisabled()\"\n (click)=\"triggerAction(action(), undefined, $event)\"\n [class]=\"buttonClass()\"></button>\n <p-menu #subactionsMenu [model]=\"subactions()\" [popup]=\"true\" appendTo=\"body\" styleClass=\"mng-action-menu\"></p-menu>\n }\n}\n", styles: [":host{display:inline-block}\n"], dependencies: [{ kind: "ngmodule", type: ButtonModule }, { kind: "directive", type: i1.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading", "severity", "raised", "rounded", "text", "outlined", "size", "plain"] }, { kind: "ngmodule", type: RippleModule }, { kind: "directive", type: i2.Ripple, selector: "[pRipple]" }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i3.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "pipe", type: ParametrizePipe, name: "mngParametrize" }, { kind: "directive", type: ComponentDirective, selector: "[mngComponent]", inputs: ["mngComponent", "injectionToken", "inputs", "attachToHost", "parentInjector"], outputs: ["instanceCreated"] }, { kind: "ngmodule", type: SplitButtonModule }, { kind: "component", type: i4.SplitButton, selector: "p-splitButton", inputs: ["model", "severity", "raised", "rounded", "text", "outlined", "size", "plain", "icon", "iconPos", "label", "tooltip", "tooltipOptions", "style", "styleClass", "menuStyle", "menuStyleClass", "appendTo", "dir", "expandAriaLabel", "showTransitionOptions", "hideTransitionOptions", "buttonProps", "menuButtonProps", "autofocus", "disabled", "tabindex", "menuButtonDisabled", "buttonDisabled"], outputs: ["onClick", "onMenuHide", "onMenuShow", "onDropdownClick"] }, { kind: "directive", type: i5.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "ngmodule", type: MenuModule }, { kind: "component", type: i6.Menu, selector: "p-menu", inputs: ["model", "popup", "style", "styleClass", "appendTo", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "ariaLabel", "ariaLabelledBy", "id", "tabindex"], outputs: ["onShow", "onHide", "onBlur", "onFocus"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
272
- }
273
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ActionComponent, decorators: [{
274
- type: Component,
275
- args: [{ standalone: true, selector: 'mng-action', changeDetection: ChangeDetectionStrategy.OnPush, imports: [ButtonModule, RippleModule, TooltipModule, ParametrizePipe, ComponentDirective, SplitButtonModule, MenuModule], providers: [provideActionExecutor()], host: { '[class]': 'hostClass()', '[class.m-0]': 'isHostHidden()' }, template: "@if (isVisible() && isPermitted()) {\n @if (actionLink(); as actionLink) {\n @if (actionLink.url !== '') {\n <a\n pButton\n pRipple\n [label]=\"label()\"\n [icon]=\"$any(action().button?.icon)\"\n [iconPos]=\"action().button?.iconPosition ?? 'left'\"\n [href]=\"!isEnabled() || inputDisabled() ? null : (actionLink.url | mngParametrize: itemId() : item() : actionData())\"\n [target]=\"actionLink.target\"\n [class.disabled]=\"!isEnabled() || inputDisabled()\"\n [pTooltip]=\"tooltip()\"\n [tooltipPosition]=\"action().button?.tooltipPosition ?? 'top'\"\n [class]=\"buttonClass()\"></a>\n } @else {\n <a\n pButton\n pRipple\n [icon]=\"$any(action().button?.icon)\"\n [iconPos]=\"action().button?.iconPosition ?? 'left'\"\n [label]=\"label()\"\n [target]=\"actionLink.target\"\n [replaceUrl]=\"actionLink.replaceUrl\"\n [routerLink]=\"!isEnabled() || inputDisabled() ? null : (actionLink.pathSegments | mngParametrize: itemId() : item() : actionData())\"\n [relativeTo]=\"route()\"\n [queryParams]=\"actionLink.queryParams | mngParametrize: itemId() : item() : actionData()\"\n [queryParamsHandling]=\"actionLink.queryParamsHandling\"\n [class.disabled]=\"!isEnabled() || inputDisabled()\"\n [pTooltip]=\"tooltip()\"\n [tooltipPosition]=\"action().button?.tooltipPosition ?? 'top'\"\n [class]=\"buttonClass()\"></a>\n }\n } @else if (action().component || action().componentFromDi) {\n <ng-container\n [mngComponent]=\"action().component\"\n [injectionToken]=\"action().componentFromDi\"\n [inputs]=\"{\n action: action(),\n item: item(),\n itemId: itemId(),\n actionData: actionData(),\n enabled: isEnabled(),\n loading: loading()\n }\"\n (instanceCreated)=\"onCustomActionCmpInst($event)\">\n </ng-container>\n } @else if (action().subactions.length > 0 && !action().subactionsAsMenu) {\n <p-splitButton\n [icon]=\"action().button?.icon ?? undefined\"\n [iconPos]=\"action().button?.iconPosition ?? 'left'\"\n [label]=\"label()\"\n [pTooltip]=\"tooltip()\"\n [tooltipPosition]=\"action().button?.tooltipPosition ?? 'top'\"\n [disabled]=\"!isEnabled() || inputDisabled()\"\n (onClick)=\"triggerAction(action())\"\n [class]=\"buttonClass()\"\n [model]=\"subactions()\">\n </p-splitButton>\n } @else {\n <button\n pButton\n pRipple\n type=\"button\"\n [icon]=\"$any(action().button?.icon)\"\n [iconPos]=\"action().button?.iconPosition ?? 'left'\"\n [label]=\"label()\"\n [pTooltip]=\"tooltip()\"\n [tooltipPosition]=\"action().button?.tooltipPosition ?? 'top'\"\n [loading]=\"loading() || inputLoading()\"\n loadingIcon=\"pi pi-spin pi-spinner\"\n [disabled]=\"!isEnabled() || inputDisabled()\"\n (click)=\"triggerAction(action(), undefined, $event)\"\n [class]=\"buttonClass()\"></button>\n <p-menu #subactionsMenu [model]=\"subactions()\" [popup]=\"true\" appendTo=\"body\" styleClass=\"mng-action-menu\"></p-menu>\n }\n}\n", styles: [":host{display:inline-block}\n"] }]
276
- }], ctorParameters: () => [] });
277
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RhYmxldmlldy9zcmMvYWN0aW9uL2NvbXBvbmVudHMvYWN0aW9uL2FjdGlvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi90YWJsZXZpZXcvc3JjL2FjdGlvbi9jb21wb25lbnRzL2FjdGlvbi9hY3Rpb24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLHVCQUF1QixFQUFFLFNBQVMsRUFBb0MsZ0JBQWdCLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ2pMLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQztBQUNwRCxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFL0MsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFFckQsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzVDLE9BQU8sRUFBQyxJQUFJLEVBQUUsVUFBVSxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBQzlDLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUM1QyxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RCxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDOUMsT0FBTyxFQUEyQixhQUFhLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFFN0QsT0FBTyxFQUlILGtCQUFrQixFQUlsQixlQUFlLEVBQ2YsaUJBQWlCLEVBQ2pCLFdBQVcsRUFDWCxZQUFZLEVBQ2YsTUFBTSw2QkFBNkIsQ0FBQztBQUNyQyxPQUFPLEVBQUMsa0JBQWtCLEVB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QixnTEFBRSxpQkFBaUIsMnlCQUFFLFVBQVU7OzRGQUs5RyxlQUFlO2tCQVgzQixTQUFTO2lDQUNNLElBQUksWUFDTixZQUFZLG1CQUdMLHVCQUF1QixDQUFDLE1BQU0sV0FDdEMsQ0FBQyxZQUFZLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxlQUFlLEVBQUUsa0JBQWtCLEVBQUUsaUJBQWlCLEVBQUUsVUFBVSxDQUFDLGFBQzdHLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxRQUU5QixFQUFDLFNBQVMsRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLGdCQUFnQixFQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBPbkRlc3Ryb3ksIE91dHB1dFJlZlN1YnNjcmlwdGlvbiwgYm9vbGVhbkF0dHJpYnV0ZSwgY29tcHV0ZWQsIGVmZmVjdCwgaW5qZWN0LCBpbnB1dCwgb3V0cHV0LCBzaWduYWwsIHZpZXdDaGlsZH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge3RvU2lnbmFsfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQge0FjdGl2YXRlZFJvdXRlfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuXG5pbXBvcnQge1RyYW5zbGF0ZVNlcnZpY2V9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHtNZW51SXRlbX0gZnJvbSAncHJpbWVuZy9hcGknO1xuaW1wb3J0IHtCdXR0b25Nb2R1bGV9IGZyb20gJ3ByaW1lbmcvYnV0dG9uJztcbmltcG9ydCB7TWVudSwgTWVudU1vZHVsZX0gZnJvbSAncHJpbWVuZy9tZW51JztcbmltcG9ydCB7UmlwcGxlTW9kdWxlfSBmcm9tICdwcmltZW5nL3JpcHBsZSc7XG5pbXBvcnQge1NwbGl0QnV0dG9uTW9kdWxlfSBmcm9tICdwcmltZW5nL3NwbGl0YnV0dG9uJztcbmltcG9ydCB7VG9vbHRpcE1vZHVsZX0gZnJvbSAncHJpbWVuZy90b29sdGlwJztcbmltcG9ydCB7T2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9uLCBjb21iaW5lTGF0ZXN0fSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHtcbiAgICBBUGVybWlzc2lvbnMsXG4gICAgQWN0aW9uRGF0YSxcbiAgICBBY3Rpb25QYXJhbWV0ZXJzLFxuICAgIENvbXBvbmVudERpcmVjdGl2ZSxcbiAgICBEYXRhTGlzdFBhcmFtcyxcbiAgICBJRGF0YVByb3ZpZGVyLFxuICAgIElkVHlwZSxcbiAgICBQYXJhbWV0cml6ZVBpcGUsXG4gICAgUGVybWlzc2lvblNlcnZpY2UsXG4gICAgUGVybWlzc2lvbnMsXG4gICAgdG9PYnNlcnZhYmxlXG59IGZyb20gJ0BtZWRpdXNpbmMvbW5nLWNvbW1vbnMvY29yZSc7XG5pbXBvcnQge0J1dHRvblN0eWxlQnVpbGRlcn0gZnJvbSAnQG1lZGl1c2luYy9tbmctY29tbW9ucy9mb3JtL2FwaSc7XG5pbXBvcnQge1xuICAgIEFjdGlvbkNvbnRleHRWYWxpZGF0aW9uLFxuICAgIEFjdGlvbkRlc2NyaXB0b3JJbnN0LFxuICAgIEFjdGlvbkluc3RhbmNlU3RhdGVFbnVtLFxuICAgIEFjdGlvbkxpbmtEZXNjcmlwdG9ySW5zdCxcbiAgICBBY3Rpb25UeXBlRW51bSxcbiAgICBJQWN0aW9uQ29tcG9uZW50LFxuICAgIFRhYmxldmlld1JvdXRlRGF0YVxufSBmcm9tICdAbWVkaXVzaW5jL21uZy1jb21tb25zL3RhYmxldmlldy9hcGknO1xuXG5pbXBvcnQge2dldEkxOG5Gb3JBY3Rpb25Bc3luY30gZnJvbSAnLi4vLi4vaGVscGVycy9pMThuJztcbmltcG9ydCB7QWN0aW9uSW5zdGFuY2V9IGZyb20gJy4uLy4uL21vZGVscy9leGVjdXRpb24vYWN0aW9uLWluc3RhbmNlLm1vZGVsJztcbmltcG9ydCB7QWN0aW9uRXhlY3V0b3JTZXJ2aWNlfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9hY3Rpb24tZXhlY3V0b3Iuc2VydmljZSc7XG5pbXBvcnQge3Byb3ZpZGVBY3Rpb25FeGVjdXRvcn0gZnJvbSAnLi4vLi4vc2VydmljZXMvcHJvdmlkZXJzL3Byb3ZpZGUtYWN0aW9uLWV4ZWN1dG9yJztcbmltcG9ydCB7Vmlld0NvbnRhaW5lcn0gZnJvbSAnLi4vLi4vc2VydmljZXMvdmlldy1jb250YWluZXIuc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgc2VsZWN0b3I6ICdtbmctYWN0aW9uJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vYWN0aW9uLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9hY3Rpb24uY29tcG9uZW50LnNjc3MnXSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICBpbXBvcnRzOiBbQnV0dG9uTW9kdWxlLCBSaXBwbGVNb2R1bGUsIFRvb2x0aXBNb2R1bGUsIFBhcmFtZXRyaXplUGlwZSwgQ29tcG9uZW50RGlyZWN0aXZlLCBTcGxpdEJ1dHRvbk1vZHVsZSwgTWVudU1vZHVsZV0sXG4gICAgcHJvdmlkZXJzOiBbcHJvdmlkZUFjdGlvbkV4ZWN1dG9yKCldLFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvbm8taG9zdC1tZXRhZGF0YS1wcm9wZXJ0eVxuICAgIGhvc3Q6IHsnW2NsYXNzXSc6ICdob3N0Q2xhc3MoKScsICdbY2xhc3MubS0wXSc6ICdpc0hvc3RIaWRkZW4oKSd9XG59KVxuZXhwb3J0IGNsYXNzIEFjdGlvbkNvbXBvbmVudDxJdGVtID0gYW55LCBTZXJ2aWNlID0gdW5kZWZpbmVkPiBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gICAgcHJpdmF0ZSByZWFkb25seSByb3V0ZVNlcnZpY2UgPSBpbmplY3QoQWN0aXZhdGVkUm91dGUpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdHJhbnNsYXRlID0gaW5qZWN0KFRyYW5zbGF0ZVNlcnZpY2UpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgYXV0aG9yaXphdGlvbiA9IGluamVjdChQZXJtaXNzaW9uU2VydmljZSk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBhY3Rpb25FeGVjdXRvciA9IGluamVjdChBY3Rpb25FeGVjdXRvclNlcnZpY2UpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdmlld0NvbnRhaW5lcj8gPSBpbmplY3QoVmlld0NvbnRhaW5lcjxJdGVtLCBTZXJ2aWNlPiwge29wdGlvbmFsOiB0cnVlfSk7XG5cbiAgICAvLyBtZXRhZGF0YSBhbmQgZWRpdG9yIG1vZGUgaW5wdXRcbiAgICBwdWJsaWMgYWN0aW9uID0gaW5wdXQucmVxdWlyZWQ8QWN0aW9uRGVzY3JpcHRvckluc3Q8SXRlbSwgU2VydmljZSwgYW55LCBhbnksIGFueT4+KCk7XG4gICAgcHVibGljIGl0ZW0gPSBpbnB1dDxJdGVtPigpO1xuICAgIHB1YmxpYyBpdGVtSWQgPSBpbnB1dDxJZFR5cGU+KCk7XG4gICAgcHVibGljIGFjdGlvbkRhdGEgPSBpbnB1dDxBY3Rpb25EYXRhPigpO1xuICAgIHB1YmxpYyBkYXRhTGlzdFBhcmFtcyA9IGlucHV0PERhdGFMaXN0UGFyYW1zPigpO1xuICAgIHB1YmxpYyBkYXRhUHJvdmlkZXIgPSBpbnB1dDxJRGF0YVByb3ZpZGVyPEl0ZW0sIFNlcnZpY2U+PigpO1xuICAgIHB1YmxpYyBob3N0Q29tcG9uZW50ID0gaW5wdXQ8YW55PigpO1xuICAgIHB1YmxpYyByb3V0ZUluaXQgPSBpbnB1dDxBY3RpdmF0ZWRSb3V0ZSB8IHVuZGVmaW5lZD4odW5kZWZpbmVkLCB7YWxpYXM6ICdyb3V0ZSd9KTtcbiAgICBwdWJsaWMgaW5wdXREaXNhYmxlZCA9IGlucHV0PGJvb2xlYW4sIHVua25vd24+KGZhbHNlLCB7YWxpYXM6ICdkaXNhYmxlZCcsIHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZX0pO1xuICAgIHB1YmxpYyBpbnB1dExvYWRpbmcgPSBpbnB1dDxib29sZWFuLCB1bmtub3duPihmYWxzZSwge2FsaWFzOiAnbG9hZGluZycsIHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZX0pO1xuICAgIHB1YmxpYyBzZWxlY3RlZEl0ZW1zID0gaW5wdXQ8QXJyYXk8SXRlbT4+KFtdKTtcblxuICAgIHB1YmxpYyBmaW5pc2ggPSBvdXRwdXQ8QWN0aW9uSW5zdGFuY2U8SXRlbSwgU2VydmljZT4+KCk7XG5cbiAgICBwdWJsaWMgc3ViYWN0aW9uc01lbnUgPSB2aWV3Q2hpbGQoTWVudSk7XG5cbiAgICBwdWJsaWMgaG9zdENsYXNzID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5hY3Rpb24oKS5idXR0b24/LnN0eWxlPy5jbGFzcyA/PyAnbW5nLWFjdGlvbi1idXR0b24nKTtcbiAgICBwdWJsaWMgaXNIb3N0SGlkZGVuID0gY29tcHV0ZWQoKCkgPT4gIXRoaXMuaXNWaXNpYmxlKCkgfHwgIXRoaXMuaXNQZXJtaXR0ZWQoKSk7XG5cbiAgICBwdWJsaWMgbG9hZGluZyA9IHNpZ25hbChmYWxzZSk7XG5cbiAgICBwcml2YXRlIGlzVmlzaWJsZVN1YnNjcmlwdGlvbj86IFN1YnNjcmlwdGlvbjtcbiAgICBwdWJsaWMgaXNWaXNpYmxlID0gc2lnbmFsKHRydWUpO1xuICAgIHByaXZhdGUgaXNQZXJtaXR0ZWRTdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XG4gICAgcHVibGljIGlzUGVybWl0dGVkID0gc2lnbmFsKHRydWUpO1xuICAgIHByaXZhdGUgaXNFbmFibGVkU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuICAgIHB1YmxpYyBpc0VuYWJsZWQgPSBzaWduYWwodHJ1ZSk7XG4gICAgcHJpdmF0ZSBsYWJlbFN1YnNjcmlwdGlvbj86IFN1YnNjcmlwdGlvbjtcbiAgICBwdWJsaWMgbGFiZWwgPSBzaWduYWw8c3RyaW5nPignJyk7XG4gICAgcHJpdmF0ZSB0b29sdGlwU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuICAgIHB1YmxpYyB0b29sdGlwID0gc2lnbmFsPHN0cmluZz4oJycpO1xuXG4gICAgcHVibGljIGFjdGlvbkxpbmsgPSBjb21wdXRlZDxBY3Rpb25MaW5rRGVzY3JpcHRvckluc3Q8SXRlbT4gfCB1bmRlZmluZWQ+KCgpID0+IHtcbiAgICAgICAgY29uc3QgYWN0aW9uID0gdGhpcy5hY3Rpb24oKTtcbiAgICAgICAgcmV0dXJuIGFjdGlvbiBpbnN0YW5jZW9mIEFjdGlvbkxpbmtEZXNjcmlwdG9ySW5zdCA/IGFjdGlvbiA6IHVuZGVmaW5lZDtcbiAgICB9KTtcblxuICAgIHB1YmxpYyBoYXNOb1RpdGxlID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5hY3Rpb24oKS5idXR0b24/LmxhYmVsID09PSBudWxsKTtcblxuICAgIHByaXZhdGUgcmVzdWx0U3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuICAgIHByaXZhdGUgZXJyb3JTdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XG4gICAgcHJpdmF0ZSBzdGF0ZVN1YnNjcmlwdGlvbj86IFN1YnNjcmlwdGlvbjtcbiAgICBwcml2YXRlIGNtcEluc3RTdWJzY3JpcHRpb24/OiBPdXRwdXRSZWZTdWJzY3JpcHRpb247XG5cbiAgICBwdWJsaWMgcm91dGUgPSBjb21wdXRlZDxBY3RpdmF0ZWRSb3V0ZT4oKCkgPT4gdGhpcy5yb3V0ZUluaXQoKSA/PyB0aGlzLnJvdXRlU2VydmljZSk7XG4gICAgcHVibGljIHJvdXRlRGF0YSA9IHRvU2lnbmFsKHRoaXMucm91dGUoKS5kYXRhKTtcbiAgICBwcml2YXRlIHJvdXRlUGVybWlzc2lvbnMgPSBjb21wdXRlZDxBUGVybWlzc2lvbnMgfCB1bmRlZmluZWQ+KCgpID0+IHtcbiAgICAgICAgY29uc3Qgcm91dGVEYXRhID0gdGhpcy5yb3V0ZURhdGEoKTtcbiAgICAgICAgY29uc3QgYWN0aW9uID0gdGhpcy5hY3Rpb24oKTtcbiAgICAgICAgaWYgKGFjdGlvbi50YWJsZXZpZXdDYXRlZ29yeSAmJiByb3V0ZURhdGEgJiYgcm91dGVEYXRhWyd0YWJsZXZpZXdQZXJtaXNzaW9ucyddKSB7XG4gICAgICAgICAgICBjb25zdCB0YWJsZXZpZXdQZXJtaXNzaW9ucyA9IHJvdXRlRGF0YVsndGFibGV2aWV3UGVybWlzc2lvbnMnXTtcbiAgICAgICAgICAgIGlmICh0YWJsZXZpZXdQZXJtaXNzaW9uc1thY3Rpb24udGFibGV2aWV3Q2F0ZWdvcnldKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRhYmxldmlld1Blcm1pc3Npb25zW2FjdGlvbi50YWJsZXZpZXdDYXRlZ29yeV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9KTtcblxuICAgIHB1YmxpYyBidXR0b25DbGFzcyA9IGNvbXB1dGVkPHN0cmluZz4oKCkgPT4ge1xuICAgICAgICBjb25zdCBhY3Rpb24gPSB0aGlzLmFjdGlvbigpO1xuICAgICAgICByZXR1cm4gKGFjdGlvbi5idXR0b24/LnN0eWxlIGluc3RhbmNlb2YgQnV0dG9uU3R5bGVCdWlsZGVyID8gYWN0aW9uLmJ1dHRvbi5zdHlsZSA6IEJ1dHRvblN0eWxlQnVpbGRlci5mcm9tKGFjdGlvbi5idXR0b24/LnN0eWxlKSkuYnVpbGQodGhpcy5oYXNOb1RpdGxlKCkpO1xuICAgIH0pO1xuICAgIHB1YmxpYyBzdWJhY3Rpb25zID0gc2lnbmFsPE1lbnVJdGVtW10+KFtdKTtcbiAgICBwcml2YXRlIHN1YmFjdGlvblN1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbltdID0gW107XG5cbiAgICBwcml2YXRlIGluc3RhbmNlPzogQWN0aW9uSW5zdGFuY2U8SXRlbSwgU2VydmljZT47XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgZWZmZWN0KCgpID0+IHRoaXMucHJvY2Vzc1N1YnNjcmlwdGlvbnMoKSwge2FsbG93U2lnbmFsV3JpdGVzOiB0cnVlfSk7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMuYWN0aW9uRXhlY3V0b3Iub25BY3Rpb25EZXN0cm95KHRoaXMuaW5zdGFuY2UpO1xuICAgICAgICB0aGlzLmlzVmlzaWJsZVN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgdGhpcy5pc1Blcm1pdHRlZFN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgdGhpcy5pc0VuYWJsZWRTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIHRoaXMubGFiZWxTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIHRoaXMudG9vbHRpcFN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgdGhpcy5yZXN1bHRTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIHRoaXMuZXJyb3JTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIHRoaXMuc3RhdGVTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIHRoaXMuY21wSW5zdFN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgdGhpcy5zdWJhY3Rpb25TdWJzY3JpcHRpb25zLmZvckVhY2gocyA9PiBzLnVuc3Vic2NyaWJlKCkpO1xuICAgIH1cblxuICAgIHB1YmxpYyB0cmlnZ2VyQWN0aW9uKGFjdGlvbjogQWN0aW9uRGVzY3JpcHRvckluc3Q8SXRlbSwgU2VydmljZT4sIHBhcmFtZXRlcnM/OiBBY3Rpb25QYXJhbWV0ZXJzPEl0ZW0+LCBldmVudD86IEV2ZW50KSB7XG4gICAgICAgIGlmIChhY3Rpb24uc3ViYWN0aW9uc0FzTWVudSkge1xuICAgICAgICAgICAgdGhpcy5zdWJhY3Rpb25zTWVudSgpPy50b2dnbGUoZXZlbnQgPz8gbmV3IEV2ZW50KCd0cmlnZ2VyJykpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYWN0aW9uRGF0YSA9IHRoaXMuYWN0aW9uRGF0YSgpID8gdGhpcy5hY3Rpb25EYXRhKCkgOiB7fTtcblxuICAgICAgICBwYXJhbWV0ZXJzID8/PSB7XG4gICAgICAgICAgICBpdGVtSWQ6IHRoaXMuaXRlbUlkKCksXG4gICAgICAgICAgICBpdGVtOiB0aGlzLml0ZW0oKSxcbiAgICAgICAgICAgIGFjdGlvbkRhdGE6IGFjdGlvbkRhdGEsXG4gICAgICAgICAgICBkYXRhTGlzdFBhcmFtczogdGhpcy5kYXRhTGlzdFBhcmFtcygpLFxuICAgICAgICAgICAgcm91dGU6IHRoaXMucm91dGUoKSxcbiAgICAgICAgICAgIHNvdXJjZUNvbXBvbmVudDogdGhpcyxcbiAgICAgICAgICAgIGhvc3RDb21wb25lbnQ6IHRoaXMuaG9zdENvbXBvbmVudCgpLFxuICAgICAgICAgICAgc2VsZWN0ZWRJdGVtczogdGhpcy5zZWxlY3RlZEl0ZW1zKClcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBpbnN0YW5jZSA9IHRoaXMuYWN0aW9uRXhlY3V0b3IudHJpZ2dlckFjdGlvbjxJdGVtLCBTZXJ2aWNlPihhY3Rpb24sIHBhcmFtZXRlcnMpO1xuICAgICAgICB0aGlzLmluc3RhbmNlID0gaW5zdGFuY2U7XG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSBpbnN0YW5jZS5jb250ZXh0O1xuICAgICAgICBpZiAoIWNvbnRleHQpIHtcbiAgICAgICAgICAgIC8vIG5vIGNvbnRleHQgaXMgcHJvdmlkZWQgaWYgcm91dGluZyBpcyB0cmlnZ2VyZWQgb3IgZWRpdG9yIGlzIG9wZW5lZCB2aWEgZGlhbG9nXG4gICAgICAgICAgICAvLyBpdCBpcyBpbiBhbm90aGVyIGNvbXBvbmVudCBqdXJpc2RpY3Rpb24gdG8gaGFuZGxlIGNvbnRleHRzXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlc3VsdFN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgdGhpcy5yZXN1bHRTdWJzY3JpcHRpb24gPSBpbnN0YW5jZS5yZXN1bHQkLnN1YnNjcmliZSh7XG4gICAgICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5maW5pc2guZW1pdChpbnN0YW5jZSk7XG4gICAgICAgICAgICAgICAgaWYgKGFjdGlvbi5oYXNJdGVtc1NlbGVjdGlvbikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnZpZXdDb250YWluZXI/LnJlbG9hZFRhYmxlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmVycm9yU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgICAgICB0aGlzLmVycm9yU3Vic2NyaXB0aW9uID0gaW5zdGFuY2UuZXJyb3IkLnN1YnNjcmliZSh7XG4gICAgICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5maW5pc2guZW1pdChpbnN0YW5jZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuc3RhdGVTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIHRoaXMuc3RhdGVTdWJzY3JpcHRpb24gPSB0aGlzLmluc3RhbmNlLnN0YXRlJC5zdWJzY3JpYmUocyA9PiB7XG4gICAgICAgICAgICBzd2l0Y2ggKHMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIEFjdGlvbkluc3RhbmNlU3RhdGVFbnVtLlJ1blN0YXJ0OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcuc2V0KHRydWUpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIEFjdGlvbkluc3RhbmNlU3RhdGVFbnVtLlJ1bkVuZDpcbiAgICAgICAgICAgICAgICBjYXNlIEFjdGlvbkluc3RhbmNlU3RhdGVFbnVtLlJ1bkVycm9yOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBBY3Rpb25JbnN0YW5jZVN0YXRlRW51bS5OZXh0QWN0aW9uU3RhcnQ6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmluc3RhbmNlPy5uZXh0QWN0aW9uSW5zdGFuY2U/LmFjdGlvbi50eXBlID09PSBBY3Rpb25UeXBlRW51bS5EaXJlY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZy5zZXQodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBBY3Rpb25JbnN0YW5jZVN0YXRlRW51bS5OZXh0QWN0aW9uRW5kOlxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pbnN0YW5jZT8ubmV4dEFjdGlvbkluc3RhbmNlPy5hY3Rpb24udHlwZSA9PT0gQWN0aW9uVHlwZUVudW0uRGlyZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIEFjdGlvbkluc3RhbmNlU3RhdGVFbnVtLkVycm9yQWN0aW9uU3RhcnQ6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmluc3RhbmNlPy5lcnJvckFjdGlvbkluc3RhbmNlPy5hY3Rpb24udHlwZSA9PT0gQWN0aW9uVHlwZUVudW0uRGlyZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcuc2V0KHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgQWN0aW9uSW5zdGFuY2VTdGF0ZUVudW0uRXJyb3JBY3Rpb25FbmQ6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmluc3RhbmNlPy5lcnJvckFjdGlvbkluc3RhbmNlPy5hY3Rpb24udHlwZSA9PT0gQWN0aW9uVHlwZUVudW0uRGlyZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5hY3Rpb25FeGVjdXRvci5ydW4oY29udGV4dCk7XG4gICAgfVxuXG4gICAgcHVibGljIG9uQ3VzdG9tQWN0aW9uQ21wSW5zdChpbnN0YW5jZTogSUFjdGlvbkNvbXBvbmVudDxJdGVtPikge1xuICAgICAgICB0aGlzLmNtcEluc3RTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIHRoaXMuY21wSW5zdFN1YnNjcmlwdGlvbiA9IGluc3RhbmNlLnRyaWdnZXIuc3Vic2NyaWJlKHBhcmFtcyA9PiB0aGlzLnRyaWdnZXJBY3Rpb24odGhpcy5hY3Rpb24oKSwgcGFyYW1zKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwcm9jZXNzU3Vic2NyaXB0aW9ucygpIHtcbiAgICAgICAgY29uc3QgcGFyYW1ldGVyczogQWN0aW9uUGFyYW1ldGVyczxJdGVtPiA9IHtcbiAgICAgICAgICAgIGl0ZW1JZDogdGhpcy5pdGVtSWQoKSxcbiAgICAgICAgICAgIGl0ZW06IHRoaXMuaXRlbSgpLFxuICAgICAgICAgICAgYWN0aW9uRGF0YTogdGhpcy5hY3Rpb25EYXRhKCksXG4gICAgICAgICAgICBzb3VyY2VDb21wb25lbnQ6IHRoaXNcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgYWN0aW9uID0gdGhpcy5hY3Rpb24oKTtcbiAgICAgICAgaWYgKGFjdGlvbi5oYXNJdGVtc1NlbGVjdGlvbikge1xuICAgICAgICAgICAgcGFyYW1ldGVycy5zZWxlY3RlZEl0ZW1zID0gdGhpcy5zZWxlY3RlZEl0ZW1zKCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5hY3Rpb25FeGVjdXRvci5wcmVwYXJlQWN0aW9uQ29udGV4dFZhbGlkYXRpb24oYWN0aW9uLCBwYXJhbWV0ZXJzLCB0aGlzLmRhdGFQcm92aWRlcigpKTtcblxuICAgICAgICBpZiAodHlwZW9mIGFjdGlvbi5pc1Zpc2libGVGdW5jdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdGhpcy5pc1Zpc2libGVTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICB0aGlzLmlzVmlzaWJsZVN1YnNjcmlwdGlvbiA9IHRvT2JzZXJ2YWJsZShhY3Rpb24uaXNWaXNpYmxlRnVuY3Rpb24oY29udGV4dCkpLnN1YnNjcmliZSh7XG4gICAgICAgICAgICAgICAgbmV4dDogcmVzID0+IHRoaXMuaXNWaXNpYmxlLnNldChyZXMpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJvdXRlUGVybWlzc2lvbnMgPSB0aGlzLnJvdXRlUGVybWlzc2lvbnMoKTtcblxuICAgICAgICBpZiAodHlwZW9mIGFjdGlvbi5wZXJtaXNzaW9ucyAhPT0gJ3VuZGVmaW5lZCcgfHwgdHlwZW9mIHJvdXRlUGVybWlzc2lvbnMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aGlzLmlzUGVybWl0dGVkU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgY29uc3QgcGVybWlzc2lvbnMgPSBhY3Rpb24ucGVybWlzc2lvbnMgJiYgcm91dGVQZXJtaXNzaW9ucyA/IFBlcm1pc3Npb25zLkFsbC5vZihyb3V0ZVBlcm1pc3Npb25zLCBhY3Rpb24ucGVybWlzc2lvbnMpIDogKHJvdXRlUGVybWlzc2lvbnMgPz8gYWN0aW9uLnBlcm1pc3Npb25zISk7XG4gICAgICAgICAgICB0aGlzLmlzVmlzaWJsZVN1YnNjcmlwdGlvbiA9IHRoaXMuYXV0aG9yaXphdGlvbi5pc0FjdGlvblZpc2libGUocGVybWlzc2lvbnMsIGNvbnRleHQgYXMgQWN0aW9uQ29udGV4dFZhbGlkYXRpb248dW5rbm93biwgdW5rbm93bj4sIHRoaXMucm91dGUoKS5zbmFwc2hvdCkuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgICAgICBuZXh0OiByZXMgPT4gdGhpcy5pc1Blcm1pdHRlZC5zZXQocmVzKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBhY3Rpb24uaXNFbmFibGVkRnVuY3Rpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRoaXMuaXNFbmFibGVkU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgdGhpcy5pc0VuYWJsZWRTdWJzY3JpcHRpb24gPSB0b09ic2VydmFibGUoYWN0aW9uLmlzRW5hYmxlZEZ1bmN0aW9uKGNvbnRleHQpKS5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgICAgIG5leHQ6IHJlcyA9PiB0aGlzLmlzRW5hYmxlZC5zZXQocmVzKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuaGFzTm9UaXRsZSgpKSB7XG4gICAgICAgICAgICB0aGlzLmxhYmVsU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgdGhpcy5sYWJlbFN1YnNjcmlwdGlvbiA9IGdldEkxOG5Gb3JBY3Rpb25Bc3luYyh0aGlzLnRyYW5zbGF0ZSwgYWN0aW9uLCAndGl0bGUnLCB7Y3VzdG9tS2V5OiBhY3Rpb24uYnV0dG9uPy5sYWJlbCA/PyB1bmRlZmluZWQsIGl0ZW06IHRoaXMuaXRlbSgpfSkuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgICAgICBuZXh0OiBpMThuID0+IHRoaXMubGFiZWwuc2V0KGkxOG4gPz8gJycpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudG9vbHRpcFN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgaWYgKGFjdGlvbi5idXR0b24/LnRvb2x0aXAgIT09IG51bGwgJiYgKGFjdGlvbi5idXR0b24/LnRvb2x0aXAgPz8gdHJ1ZSkpIHtcbiAgICAgICAgICAgIHRoaXMudG9vbHRpcFN1YnNjcmlwdGlvbiA9IGdldEkxOG5Gb3JBY3Rpb25Bc3luYyh0aGlzLnRyYW5zbGF0ZSwgYWN0aW9uLCAndG9vbHRpcCcsIHtcbiAgICAgICAgICAgICAgICBjdXN0b21LZXk6IGFjdGlvbi5idXR0b24/LnRvb2x0aXAsXG4gICAgICAgICAgICAgICAgaXRlbTogdGhpcy5pdGVtKCksXG4gICAgICAgICAgICAgICAgbWlzc2luZ1RyYW5zbGF0aW9uU3RyYXRlZ3k6ICdyZXR1cm5OdWxsJ1xuICAgICAgICAgICAgfSkuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgICAgICBuZXh0OiBpMThuID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b29sdGlwLnNldChpMThuID8/IGFjdGlvbi5idXR0b24/LnRvb2x0aXAgPz8gJycpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zdWJhY3Rpb25zLnNldCh0aGlzLnByb2Nlc3NTdWJhY3Rpb25zKCkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcHJvY2Vzc1N1YmFjdGlvbnMoKTogTWVudUl0ZW1bXSB7XG4gICAgICAgIHRoaXMuc3ViYWN0aW9uU3Vic2NyaXB0aW9ucy5mb3JFYWNoKHMgPT4gcy51bnN1YnNjcmliZSgpKTtcbiAgICAgICAgdGhpcy5zdWJhY3Rpb25TdWJzY3JpcHRpb25zID0gW107XG5cbiAgICAgICAgY29uc3QgbWVudUl0ZW1zOiBNZW51SXRlbVtdID0gW107XG4gICAgICAgIGZvciAoY29uc3Qgc3ViYWN0aW9uIG9mIHRoaXMuYWN0aW9uKCkuc3ViYWN0aW9ucykge1xuICAgICAgICAgICAgY29uc3QgbWVudUl0ZW0gPSB7fSBhcyBNZW51SXRlbTtcblxuICAgICAgICAgICAgbWVudUl0ZW0uaWNvbiA9IHN1YmFjdGlvbi5idXR0b24/Lmljb24gPz8gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5zdWJhY3Rpb25TdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICAgICAgICAgICAgZ2V0STE4bkZvckFjdGlvbkFzeW5jKHRoaXMudHJhbnNsYXRlLCBzdWJhY3Rpb24sICd0aXRsZScsIHtjdXN0b21LZXk6IHN1YmFjdGlvbi5idXR0b24/LmxhYmVsID8/IHVuZGVmaW5lZCwgaXRlbTogdGhpcy5pdGVtKCl9KS5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgICAgICAgICBuZXh0OiByZXMgPT4gKG1lbnVJdGVtLmxhYmVsID0gcmVzID8/IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuc3ViYWN0aW9uU3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgICAgICAgICAgIGdldEkxOG5Gb3JBY3Rpb25Bc3luYyh0aGlzLnRyYW5zbGF0ZSwgc3ViYWN0aW9uLCAndG9vbHRpcCcsIHtjdXN0b21LZXk6IHN1YmFjdGlvbi5idXR0b24/LnRvb2x0aXAgPz8gdW5kZWZpbmVkLCBpdGVtOiB0aGlzLml0ZW0oKX0pLnN1YnNjcmliZSh7XG4gICAgICAgICAgICAgICAgICAgIG5leHQ6IHJlcyA9PiAobWVudUl0ZW0udG9vbHRpcCA9IHJlcyA/PyB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGNvbnN0IHBhcmFtZXRlcnM6IEFjdGlvblBhcmFtZXRlcnM8SXRlbT4gPSB7XG4gICAgICAgICAgICAgICAgaXRlbUlkOiB0aGlzLml0ZW1JZCgpLFxuICAgICAgICAgICAgICAgIGl0ZW06IHRoaXMuaXRlbSgpLFxuICAgICAgICAgICAgICAgIGFjdGlvbkRhdGE6IHRoaXMuYWN0aW9uRGF0YSgpLFxuICAgICAgICAgICAgICAgIHNvdXJjZUNvbXBvbmVudDogdGhpc1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaWYgKHN1YmFjdGlvbi5oYXNJdGVtc1NlbGVjdGlvbikge1xuICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMuc2VsZWN0ZWRJdGVtcyA9IHRoaXMuc2VsZWN0ZWRJdGVtcygpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5hY3Rpb25FeGVjdXRvci5wcmVwYXJlQWN0aW9uQ29udGV4dFZhbGlkYXRpb24oc3ViYWN0aW9uLCBwYXJhbWV0ZXJzLCB0aGlzLmRhdGFQcm92aWRlcigpKTtcblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBzdWJhY3Rpb24uaXNFbmFibGVkRnVuY3Rpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN1YmFjdGlvblN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgICAgICAgICAgICAgICAgdG9PYnNlcnZhYmxlKHN1YmFjdGlvbi5pc0VuYWJsZWRGdW5jdGlvbihjb250ZXh0KSkuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQ6IHJlcyA9PiAobWVudUl0ZW0uZGlzYWJsZWQgPSAhcmVzKVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHZpc2liaWxpdHlPYnNlcnZhYmxlczogT2JzZXJ2YWJsZTxib29sZWFuPltdID0gW107XG4gICAgICAgICAgICBpZiAodHlwZW9mIHN1YmFjdGlvbi5pc1Zpc2libGVGdW5jdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHZpc2liaWxpdHlPYnNlcnZhYmxlcy5wdXNoKHRvT2JzZXJ2YWJsZShzdWJhY3Rpb24uaXNWaXNpYmxlRnVuY3Rpb24oY29udGV4dCkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2Ygc3ViYWN0aW9uLnBlcm1pc3Npb25zICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIHZpc2liaWxpdHlPYnNlcnZhYmxlcy5wdXNoKHRoaXMuYXV0aG9yaXphdGlvbi5pc0FjdGlvblZpc2libGUoc3ViYWN0aW9uLnBlcm1pc3Npb25zLCBjb250ZXh0IGFzIEFjdGlvbkNvbnRleHRWYWxpZGF0aW9uPHVua25vd24sIHVua25vd24+LCB0aGlzLnJvdXRlKCkuc25hcHNob3QpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3Qgcm91dGVEYXRhID0gdGhpcy5yb3V0ZSgpLnNuYXBzaG90LmRhdGEgYXMgVGFibGV2aWV3Um91dGVEYXRhO1xuICAgICAgICAgICAgaWYgKHN1YmFjdGlvbi50YWJsZXZpZXdDYXRlZ29yeSAmJiByb3V0ZURhdGEudGFibGV2aWV3UGVybWlzc2lvbnMgJiYgcm91dGVEYXRhLnRhYmxldmlld1Blcm1pc3Npb25zW3N1YmFjdGlvbi50YWJsZXZpZXdDYXRlZ29yeV0pIHtcbiAgICAgICAgICAgICAgICBjb25zdCByb3V0ZVBlcm1pc3Npb25zID0gcm91dGVEYXRhLnRhYmxldmlld1Blcm1pc3Npb25zW3N1YmFjdGlvbi50YWJsZXZpZXdDYXRlZ29yeV07XG4gICAgICAgICAgICAgICAgdmlzaWJpbGl0eU9ic2VydmFibGVzLnB1c2godGhpcy5hdXRob3JpemF0aW9uLmlzQWN0aW9uVmlzaWJsZShyb3V0ZVBlcm1pc3Npb25zLCBjb250ZXh0IGFzIEFjdGlvbkNvbnRleHRWYWxpZGF0aW9uPHVua25vd24sIHVua25vd24+LCB0aGlzLnJvdXRlKCkuc25hcHNob3QpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5zdWJhY3Rpb25TdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICAgICAgICAgICAgY29tYmluZUxhdGVzdCh2aXNpYmlsaXR5T2JzZXJ2YWJsZXMpLnN1YnNjcmliZSh2aXNpYmlsaXRpZXMgPT4ge1xuICAgICAgICAgICAgICAgICAgICBtZW51SXRlbS52aXNpYmxlID0gdmlzaWJpbGl0aWVzLmV2ZXJ5KHZhbHVlID0+IHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgbWVudUl0ZW0uY29tbWFuZCA9ICgpID0+IHRoaXMudHJpZ2dlckFjdGlvbihzdWJhY3Rpb24pO1xuXG4gICAgICAgICAgICBtZW51SXRlbXMucHVzaChtZW51SXRlbSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lbnVJdGVtcztcbiAgICB9XG59XG4iLCJAaWYgKGlzVmlzaWJsZSgpICYmIGlzUGVybWl0dGVkKCkpIHtcbiAgICBAaWYgKGFjdGlvbkxpbmsoKTsgYXMgYWN0aW9uTGluaykge1xuICAgICAgICBAaWYgKGFjdGlvbkxpbmsudXJsICE9PSAnJykge1xuICAgICAgICAgICAgPGFcbiAgICAgICAgICAgICAgICBwQnV0dG9uXG4gICAgICAgICAgICAgICAgcFJpcHBsZVxuICAgICAgICAgICAgICAgIFtsYWJlbF09XCJsYWJlbCgpXCJcbiAgICAgICAgICAgICAgICBbaWNvbl09XCIkYW55KGFjdGlvbigpLmJ1dHRvbj8uaWNvbilcIlxuICAgICAgICAgICAgICAgIFtpY29uUG9zXT1cImFjdGlvbigpLmJ1dHRvbj8uaWNvblBvc2l0aW9uID8/ICdsZWZ0J1wiXG4gICAgICAgICAgICAgICAgW2hyZWZdPVwiIWlzRW5hYmxlZCgpIHx8IGlucHV0RGlzYWJsZWQoKSA/IG51bGwgOiAoYWN0aW9uTGluay51cmwgfCBtbmdQYXJhbWV0cml6ZTogaXRlbUlkKCkgOiBpdGVtKCkgOiBhY3Rpb25EYXRhKCkpXCJcbiAgICAgICAgICAgICAgICBbdGFyZ2V0XT1cImFjdGlvbkxpbmsudGFyZ2V0XCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuZGlzYWJsZWRdPVwiIWlzRW5hYmxlZCgpIHx8IGlucHV0RGlzYWJsZWQoKVwiXG4gICAgICAgICAgICAgICAgW3BUb29sdGlwXT1cInRvb2x0aXAoKVwiXG4gICAgICAgICAgICAgICAgW3Rvb2x0aXBQb3NpdGlvbl09XCJhY3Rpb24oKS5idXR0b24/LnRvb2x0aXBQb3NpdGlvbiA/PyAndG9wJ1wiXG4gICAgICAgICAgICAgICAgW2NsYXNzXT1cImJ1dHRvbkNsYXNzKClcIj48L2E+XG4gICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgPGFcbiAgICAgICAgICAgICAgICBwQnV0dG9uXG4gICAgICAgICAgICAgICAgcFJpcHBsZVxuICAgICAgICAgICAgICAgIFtpY29uXT1cIiRhbnkoYWN0aW9uKCkuYnV0dG9uPy5pY29uKVwiXG4gICAgICAgICAgICAgICAgW2ljb25Qb3NdPVwiYWN0aW9uKCkuYnV0dG9uPy5pY29uUG9zaXRpb24gPz8gJ2xlZnQnXCJcbiAgICAgICAgICAgICAgICBbbGFiZWxdPVwibGFiZWwoKVwiXG4gICAgICAgICAgICAgICAgW3RhcmdldF09XCJhY3Rpb25MaW5rLnRhcmdldFwiXG4gICAgICAgICAgICAgICAgW3JlcGxhY2VVcmxdPVwiYWN0aW9uTGluay5yZXBsYWNlVXJsXCJcbiAgICAgICAgICAgICAgICBbcm91dGVyTGlua109XCIhaXNFbmFibGVkKCkgfHwgaW5wdXREaXNhYmxlZCgpID8gbnVsbCA6IChhY3Rpb25MaW5rLnBhdGhTZWdtZW50cyB8IG1uZ1BhcmFtZXRyaXplOiBpdGVtSWQoKSA6IGl0ZW0oKSA6IGFjdGlvbkRhdGEoKSlcIlxuICAgICAgICAgICAgICAgIFtyZWxhdGl2ZVRvXT1cInJvdXRlKClcIlxuICAgICAgICAgICAgICAgIFtxdWVyeVBhcmFtc109XCJhY3Rpb25MaW5rLnF1ZXJ5UGFyYW1zIHwgbW5nUGFyYW1ldHJpemU6IGl0ZW1JZCgpIDogaXRlbSgpIDogYWN0aW9uRGF0YSgpXCJcbiAgICAgICAgICAgICAgICBbcXVlcnlQYXJhbXNIYW5kbGluZ109XCJhY3Rpb25MaW5rLnF1ZXJ5UGFyYW1zSGFuZGxpbmdcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5kaXNhYmxlZF09XCIhaXNFbmFibGVkKCkgfHwgaW5wdXREaXNhYmxlZCgpXCJcbiAgICAgICAgICAgICAgICBbcFRvb2x0aXBdPVwidG9vbHRpcCgpXCJcbiAgICAgICAgICAgICAgICBbdG9vbHRpcFBvc2l0aW9uXT1cImFjdGlvbigpLmJ1dHRvbj8udG9vbHRpcFBvc2l0aW9uID8/ICd0b3AnXCJcbiAgICAgICAgICAgICAgICBbY2xhc3NdPVwiYnV0dG9uQ2xhc3MoKVwiPjwvYT5cbiAgICAgICAgfVxuICAgIH0gQGVsc2UgaWYgKGFjdGlvbigpLmNvbXBvbmVudCB8fCBhY3Rpb24oKS5jb21wb25lbnRGcm9tRGkpIHtcbiAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgW21uZ0NvbXBvbmVudF09XCJhY3Rpb24oKS5jb21wb25lbnRcIlxuICAgICAgICAgICAgW2luamVjdGlvblRva2VuXT1cImFjdGlvbigpLmNvbXBvbmVudEZyb21EaVwiXG4gICAgICAgICAgICBbaW5wdXRzXT1cIntcbiAgICAgICAgICAgICAgICBhY3Rpb246IGFjdGlvbigpLFxuICAgICAgICAgICAgICAgIGl0ZW06IGl0ZW0oKSxcbiAgICAgICAgICAgICAgICBpdGVtSWQ6IGl0ZW1JZCgpLFxuICAgICAgICAgICAgICAgIGFjdGlvbkRhdGE6IGFjdGlvbkRhdGEoKSxcbiAgICAgICAgICAgICAgICBlbmFibGVkOiBpc0VuYWJsZWQoKSxcbiAgICAgICAgICAgICAgICBsb2FkaW5nOiBsb2FkaW5nKClcbiAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgKGluc3RhbmNlQ3JlYXRlZCk9XCJvbkN1c3RvbUFjdGlvbkNtcEluc3QoJGV2ZW50KVwiPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICB9IEBlbHNlIGlmIChhY3Rpb24oKS5zdWJhY3Rpb25zLmxlbmd0aCA+IDAgJiYgIWFjdGlvbigpLnN1YmFjdGlvbnNBc01lbnUpIHtcbiAgICAgICAgPHAtc3BsaXRCdXR0b25cbiAgICAgICAgICAgIFtpY29uXT1cImFjdGlvbigpLmJ1dHRvbj8uaWNvbiA/PyB1bmRlZmluZWRcIlxuICAgICAgICAgICAgW2ljb25Qb3NdPVwiYWN0aW9uKCkuYnV0dG9uPy5pY29uUG9zaXRpb24gPz8gJ2xlZnQnXCJcbiAgICAgICAgICAgIFtsYWJlbF09XCJsYWJlbCgpXCJcbiAgICAgICAgICAgIFtwVG9vbHRpcF09XCJ0b29sdGlwKClcIlxuICAgICAgICAgICAgW3Rvb2x0aXBQb3NpdGlvbl09XCJhY3Rpb24oKS5idXR0b24/LnRvb2x0aXBQb3NpdGlvbiA/PyAndG9wJ1wiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWlzRW5hYmxlZCgpIHx8IGlucHV0RGlzYWJsZWQoKVwiXG4gICAgICAgICAgICAob25DbGljayk9XCJ0cmlnZ2VyQWN0aW9uKGFjdGlvbigpKVwiXG4gICAgICAgICAgICBbY2xhc3NdPVwiYnV0dG9uQ2xhc3MoKVwiXG4gICAgICAgICAgICBbbW9kZWxdPVwic3ViYWN0aW9ucygpXCI+XG4gICAgICAgIDwvcC1zcGxpdEJ1dHRvbj5cbiAgICB9IEBlbHNlIHtcbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgcEJ1dHRvblxuICAgICAgICAgICAgcFJpcHBsZVxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBbaWNvbl09XCIkYW55KGFjdGlvbigpLmJ1dHRvbj8uaWNvbilcIlxuICAgICAgICAgICAgW2ljb25Qb3NdPVwiYWN0aW9uKCkuYnV0dG9uPy5pY29uUG9zaXRpb24gPz8gJ2xlZnQnXCJcbiAgICAgICAgICAgIFtsYWJlbF09XCJsYWJlbCgpXCJcbiAgICAgICAgICAgIFtwVG9vbHRpcF09XCJ0b29sdGlwKClcIlxuICAgICAgICAgICAgW3Rvb2x0aXBQb3NpdGlvbl09XCJhY3Rpb24oKS5idXR0b24/LnRvb2x0aXBQb3NpdGlvbiA/PyAndG9wJ1wiXG4gICAgICAgICAgICBbbG9hZGluZ109XCJsb2FkaW5nKCkgfHwgaW5wdXRMb2FkaW5nKClcIlxuICAgICAgICAgICAgbG9hZGluZ0ljb249XCJwaSBwaS1zcGluIHBpLXNwaW5uZXJcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFpc0VuYWJsZWQoKSB8fCBpbnB1dERpc2FibGVkKClcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInRyaWdnZXJBY3Rpb24oYWN0aW9uKCksIHVuZGVmaW5lZCwgJGV2ZW50KVwiXG4gICAgICAgICAgICBbY2xhc3NdPVwiYnV0dG9uQ2xhc3MoKVwiPjwvYnV0dG9uPlxuICAgICAgICA8cC1tZW51ICNzdWJhY3Rpb25zTWVudSBbbW9kZWxdPVwic3ViYWN0aW9ucygpXCIgW3BvcHVwXT1cInRydWVcIiBhcHBlbmRUbz1cImJvZHlcIiBzdHlsZUNsYXNzPVwibW5nLWFjdGlvbi1tZW51XCI+PC9wLW1lbnU+XG4gICAgfVxufVxuIl19