@mediusinc/mng-commons 2.6.0 → 3.0.0-rc.1

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 (287) hide show
  1. package/README.md +17 -6
  2. package/dev-scripts/version-info.js +1 -0
  3. package/esm2022/lib/api/models/filter-param.model.mjs +33 -0
  4. package/esm2022/lib/api/models/query-param.model.mjs +68 -0
  5. package/esm2022/lib/api/models/query-result.model.mjs +24 -0
  6. package/esm2022/lib/api/utils/medius-rest.util.mjs +255 -0
  7. package/esm2022/lib/api/utils/object-serializer.util.mjs +258 -0
  8. package/esm2022/lib/components/action/action.component.mjs +304 -0
  9. package/esm2022/lib/components/action/editor/action-editor.component.mjs +386 -0
  10. package/esm2022/lib/components/action/localization/data-language-dropdown.component.mjs +54 -0
  11. package/{esm2020 → esm2022}/lib/components/action/models/action-execution.model.mjs +1 -1
  12. package/esm2022/lib/components/action/models/tableview-action-default-categories.model.mjs +11 -0
  13. package/{esm2020 → esm2022}/lib/components/action/route/action-route.component.mjs +4 -4
  14. package/esm2022/lib/components/form/autocomplete/autocomplete.component.mjs +300 -0
  15. package/{esm2020 → esm2022}/lib/components/form/date-range/date-range.component.mjs +5 -5
  16. package/esm2022/lib/components/form/dropdown/dropdown.component.mjs +212 -0
  17. package/esm2022/lib/components/form/editor/form-editor.component.mjs +288 -0
  18. package/{esm2020 → esm2022}/lib/components/form/formly/fields/formly-field-action/formly-field-action.component.mjs +4 -4
  19. package/{esm2020 → esm2022}/lib/components/form/formly/fields/formly-field-autocomplete/formly-field-autocomplete.component.mjs +5 -5
  20. package/{esm2020 → esm2022}/lib/components/form/formly/fields/formly-field-custom/formly-custom-field-base.model.mjs +4 -4
  21. package/esm2022/lib/components/form/formly/fields/formly-field-custom/formly-field-custom.component.mjs +39 -0
  22. package/{esm2020 → esm2022}/lib/components/form/formly/fields/formly-field-dropdown/formly-field-dropdown.component.mjs +4 -4
  23. package/{esm2020 → esm2022}/lib/components/form/formly/fields/formly-field-fieldset/formly-field-fieldset.component.mjs +4 -4
  24. package/{esm2020 → esm2022}/lib/components/form/formly/fields/formly-field-input/formly-field-input.component.mjs +5 -5
  25. package/{esm2020 → esm2022}/lib/components/form/formly/fields/formly-field-label/formly-field-label.component.mjs +4 -4
  26. package/{esm2020 → esm2022}/lib/components/form/formly/fields/formly-field-lookup-dialog/formly-field-lookup-dialog.component.mjs +7 -7
  27. package/{esm2020 → esm2022}/lib/components/form/formly/fields/formly-field-table-dialog-form/formly-field-table-dialog-form.component.mjs +4 -4
  28. package/{esm2020 → esm2022}/lib/components/form/formly/fields/formly-field-table-dialog-multiselect/formly-field-table-dialog-multiselect.component.mjs +4 -4
  29. package/esm2022/lib/components/form/formly/fields/formly-field-tabs/formly-field-tabs.component.mjs +19 -0
  30. package/{esm2020 → esm2022}/lib/components/form/formly/wrappers/formly-field-no-label-wrapper/formly-field-no-label-wrapper.component.mjs +4 -4
  31. package/{esm2020 → esm2022}/lib/components/form/formly/wrappers/formly-field-wrapper/formly-field-wrapper.component.mjs +4 -4
  32. package/esm2022/lib/components/form/models/form-editor.event.mjs +49 -0
  33. package/esm2022/lib/components/layout/breadcrumb.component.mjs +34 -0
  34. package/{esm2020 → esm2022}/lib/components/layout/footer.component.mjs +4 -4
  35. package/{esm2020 → esm2022}/lib/components/layout/main-layout.component.mjs +4 -4
  36. package/esm2022/lib/components/layout/menu-item.component.mjs +296 -0
  37. package/{esm2020 → esm2022}/lib/components/layout/menu.component.mjs +4 -4
  38. package/{esm2020 → esm2022}/lib/components/layout/services/main-layout.component.service.mjs +4 -4
  39. package/{esm2020 → esm2022}/lib/components/layout/topbar-user.component.mjs +4 -4
  40. package/{esm2020 → esm2022}/lib/components/layout/topbar.component.mjs +4 -4
  41. package/{esm2020 → esm2022}/lib/components/layout/version.component.mjs +4 -4
  42. package/{esm2020 → esm2022}/lib/components/pages/error/error-page.component.mjs +4 -4
  43. package/{esm2020 → esm2022}/lib/components/pages/not-found/not-found-page.component.mjs +4 -4
  44. package/{esm2020 → esm2022}/lib/components/tableview/models/table.event.mjs +1 -1
  45. package/{esm2020 → esm2022}/lib/components/tableview/route/tableview-route.abstract.component.mjs +5 -5
  46. package/{esm2020 → esm2022}/lib/components/tableview/route/tableview-route.component.mjs +4 -4
  47. package/esm2022/lib/components/tableview/table/column-filter/column-filter.component.mjs +124 -0
  48. package/esm2022/lib/components/tableview/table/column-value/column-value.component.mjs +110 -0
  49. package/esm2022/lib/components/tableview/table/table.component.mjs +747 -0
  50. package/esm2022/lib/components/tableview/tableview.component.mjs +147 -0
  51. package/esm2022/lib/descriptors/action/action.descriptor.mjs +634 -0
  52. package/esm2022/lib/descriptors/editor/editor.descriptor.mjs +304 -0
  53. package/esm2022/lib/descriptors/editor/field.descriptor.mjs +1088 -0
  54. package/esm2022/lib/descriptors/table/table.descriptor.mjs +542 -0
  55. package/esm2022/lib/descriptors/tableview/tableview.descriptor.mjs +352 -0
  56. package/{esm2020 → esm2022}/lib/descriptors/types/table.type.mjs +1 -5
  57. package/{esm2020 → esm2022}/lib/directives/component.directive.mjs +5 -5
  58. package/{esm2020 → esm2022}/lib/directives/template.directive.mjs +5 -5
  59. package/esm2022/lib/mng-commons.module.mjs +465 -0
  60. package/{esm2020 → esm2022}/lib/pipes/boolean.pipe.mjs +4 -4
  61. package/{esm2020 → esm2022}/lib/pipes/class-map.pipe.mjs +4 -4
  62. package/{esm2020 → esm2022}/lib/pipes/enum.pipe.mjs +4 -4
  63. package/{esm2020 → esm2022}/lib/pipes/enumerate-async.pipe.mjs +4 -4
  64. package/{esm2020 → esm2022}/lib/pipes/enumerate.pipe.mjs +4 -4
  65. package/{esm2020 → esm2022}/lib/pipes/getter.pipe.mjs +4 -4
  66. package/{esm2020 → esm2022}/lib/pipes/i18n-property.pipe.mjs +4 -4
  67. package/{esm2020 → esm2022}/lib/pipes/json-path.pipe.mjs +4 -4
  68. package/{esm2020 → esm2022}/lib/pipes/locale-default-row-class.pipe.mjs +4 -4
  69. package/{esm2020 → esm2022}/lib/pipes/parametrize.pipe.mjs +4 -4
  70. package/{esm2020 → esm2022}/lib/pipes/template.pipe.mjs +4 -4
  71. package/esm2022/lib/router/route-builder.mjs +308 -0
  72. package/esm2022/lib/router/routes-builder.mjs +61 -0
  73. package/esm2022/lib/security/authorization.guard.mjs +15 -0
  74. package/{esm2020 → esm2022}/lib/security/authorization.service.mjs +4 -4
  75. package/esm2022/lib/services/action-executor.service.mjs +703 -0
  76. package/{esm2020 → esm2022}/lib/services/commons.service.mjs +4 -4
  77. package/esm2022/lib/services/configuration.service.mjs +150 -0
  78. package/{esm2020 → esm2022}/lib/services/internal/commons-init.service.mjs +4 -4
  79. package/{esm2020 → esm2022}/lib/services/mng-localstorage-config.service.mjs +4 -4
  80. package/{esm2020 → esm2022}/lib/services/navigation.service.mjs +4 -4
  81. package/{esm2020 → esm2022}/lib/services/router.service.mjs +4 -4
  82. package/{esm2020 → esm2022}/lib/services/version.service.mjs +4 -4
  83. package/{esm2020 → esm2022}/lib/services/view-container.component.service.mjs +4 -4
  84. package/esm2022/lib/styles/styles.util.mjs +42 -0
  85. package/esm2022/lib/types/type.model.mjs +2 -0
  86. package/esm2022/lib/utils/date.util.mjs +120 -0
  87. package/esm2022/lib/utils/tableview.util.mjs +193 -0
  88. package/esm2022/lib/utils/type.util.mjs +94 -0
  89. package/{fesm2020 → fesm2022}/mediusinc-mng-commons.mjs +952 -940
  90. package/fesm2022/mediusinc-mng-commons.mjs.map +1 -0
  91. package/lib/api/utils/medius-rest.util.d.ts +4 -3
  92. package/lib/components/action/action.component.d.ts +1 -1
  93. package/lib/components/action/editor/action-editor.component.d.ts +6 -9
  94. package/lib/components/action/localization/data-language-dropdown.component.d.ts +1 -1
  95. package/lib/components/form/autocomplete/autocomplete.component.d.ts +4 -4
  96. package/lib/components/form/date-range/date-range.component.d.ts +1 -1
  97. package/lib/components/form/dropdown/dropdown.component.d.ts +3 -3
  98. package/lib/components/form/editor/form-editor.component.d.ts +1 -1
  99. package/lib/components/form/formly/fields/formly-field-custom/formly-custom-field-base.model.d.ts +1 -1
  100. package/lib/components/form/formly/fields/formly-field-custom/formly-field-custom.component.d.ts +1 -0
  101. package/lib/components/layout/breadcrumb.component.d.ts +5 -0
  102. package/lib/components/layout/menu-item.component.d.ts +1 -1
  103. package/lib/components/layout/version.component.d.ts +1 -1
  104. package/lib/components/tableview/models/table.event.d.ts +2 -2
  105. package/lib/components/tableview/route/tableview-route.component.d.ts +1 -1
  106. package/lib/components/tableview/table/column-filter/column-filter.component.d.ts +2 -2
  107. package/lib/components/tableview/table/column-value/column-value.component.d.ts +1 -1
  108. package/lib/components/tableview/table/table.component.d.ts +6 -7
  109. package/lib/components/tableview/tableview.component.d.ts +7 -11
  110. package/lib/descriptors/editor/editor.descriptor.d.ts +1 -1
  111. package/lib/descriptors/editor/field.descriptor.d.ts +3 -1
  112. package/lib/descriptors/table/table.descriptor.d.ts +8 -3
  113. package/lib/descriptors/tableview/tableview.descriptor.d.ts +4 -4
  114. package/lib/descriptors/types/table.type.d.ts +1 -5
  115. package/lib/directives/component.directive.d.ts +1 -1
  116. package/lib/directives/template.directive.d.ts +1 -1
  117. package/lib/router/route-builder.d.ts +6 -10
  118. package/lib/router/routes-builder.d.ts +0 -5
  119. package/lib/security/authorization.guard.d.ts +2 -11
  120. package/lib/services/action-executor.service.d.ts +1 -15
  121. package/lib/utils/route.util.d.ts +8 -19
  122. package/lib/utils/tableview.util.d.ts +5 -0
  123. package/package.json +12 -19
  124. package/esm2020/lib/api/models/filter-param.model.mjs +0 -33
  125. package/esm2020/lib/api/models/query-param.model.mjs +0 -68
  126. package/esm2020/lib/api/models/query-result.model.mjs +0 -24
  127. package/esm2020/lib/api/utils/medius-rest.util.mjs +0 -246
  128. package/esm2020/lib/api/utils/object-serializer.util.mjs +0 -258
  129. package/esm2020/lib/components/action/action.component.mjs +0 -303
  130. package/esm2020/lib/components/action/editor/action-editor.component.mjs +0 -390
  131. package/esm2020/lib/components/action/localization/data-language-dropdown.component.mjs +0 -47
  132. package/esm2020/lib/components/action/models/tableview-action-default-categories.model.mjs +0 -11
  133. package/esm2020/lib/components/form/autocomplete/autocomplete.component.mjs +0 -303
  134. package/esm2020/lib/components/form/dropdown/dropdown.component.mjs +0 -214
  135. package/esm2020/lib/components/form/editor/form-editor.component.mjs +0 -288
  136. package/esm2020/lib/components/form/formly/fields/formly-field-custom/formly-field-custom.component.mjs +0 -54
  137. package/esm2020/lib/components/form/formly/fields/formly-field-tabs/formly-field-tabs.component.mjs +0 -19
  138. package/esm2020/lib/components/form/models/form-editor.event.mjs +0 -49
  139. package/esm2020/lib/components/layout/breadcrumb.component.mjs +0 -19
  140. package/esm2020/lib/components/layout/menu-item.component.mjs +0 -294
  141. package/esm2020/lib/components/tableview/table/column-filter/column-filter.component.mjs +0 -126
  142. package/esm2020/lib/components/tableview/table/column-value/column-value.component.mjs +0 -108
  143. package/esm2020/lib/components/tableview/table/table.component.mjs +0 -749
  144. package/esm2020/lib/components/tableview/tableview.component.mjs +0 -146
  145. package/esm2020/lib/descriptors/action/action.descriptor.mjs +0 -634
  146. package/esm2020/lib/descriptors/editor/editor.descriptor.mjs +0 -304
  147. package/esm2020/lib/descriptors/editor/field.descriptor.mjs +0 -1083
  148. package/esm2020/lib/descriptors/table/table.descriptor.mjs +0 -521
  149. package/esm2020/lib/descriptors/tableview/tableview.descriptor.mjs +0 -347
  150. package/esm2020/lib/mng-commons.module.mjs +0 -469
  151. package/esm2020/lib/router/route-builder.mjs +0 -312
  152. package/esm2020/lib/router/routes-builder.mjs +0 -68
  153. package/esm2020/lib/security/authorization.guard.mjs +0 -30
  154. package/esm2020/lib/services/action-executor.service.mjs +0 -722
  155. package/esm2020/lib/services/configuration.service.mjs +0 -150
  156. package/esm2020/lib/styles/styles.util.mjs +0 -42
  157. package/esm2020/lib/types/type.model.mjs +0 -2
  158. package/esm2020/lib/utils/date.util.mjs +0 -120
  159. package/esm2020/lib/utils/tableview.util.mjs +0 -171
  160. package/esm2020/lib/utils/type.util.mjs +0 -94
  161. package/fesm2015/mediusinc-mng-commons.mjs +0 -15900
  162. package/fesm2015/mediusinc-mng-commons.mjs.map +0 -1
  163. package/fesm2020/mediusinc-mng-commons.mjs.map +0 -1
  164. /package/{esm2020 → esm2022}/index.mjs +0 -0
  165. /package/{esm2020 → esm2022}/lib/api/models/builders/query-param.builder.mjs +0 -0
  166. /package/{esm2020 → esm2022}/lib/api/models/filter-match-type.model.mjs +0 -0
  167. /package/{esm2020 → esm2022}/lib/api/models/index.mjs +0 -0
  168. /package/{esm2020 → esm2022}/lib/api/models/mappers.mjs +0 -0
  169. /package/{esm2020 → esm2022}/lib/api/models/query-mode.model.mjs +0 -0
  170. /package/{esm2020 → esm2022}/lib/api/models/serialization.model.mjs +0 -0
  171. /package/{esm2020 → esm2022}/lib/api/services/api.abstract.service.mjs +0 -0
  172. /package/{esm2020 → esm2022}/lib/api/services/crud-api.abstract.service.mjs +0 -0
  173. /package/{esm2020 → esm2022}/lib/api/services/get-all-api.abstract.service.mjs +0 -0
  174. /package/{esm2020 → esm2022}/lib/api/services/index.mjs +0 -0
  175. /package/{esm2020 → esm2022}/lib/api/utils/index.mjs +0 -0
  176. /package/{esm2020 → esm2022}/lib/components/action/index.mjs +0 -0
  177. /package/{esm2020 → esm2022}/lib/components/action/models/action-component.model.mjs +0 -0
  178. /package/{esm2020 → esm2022}/lib/components/action/models/action-confirmation-service.model.mjs +0 -0
  179. /package/{esm2020 → esm2022}/lib/components/action/models/index.mjs +0 -0
  180. /package/{esm2020 → esm2022}/lib/components/form/formly/fields/index.mjs +0 -0
  181. /package/{esm2020 → esm2022}/lib/components/form/formly/formly.config.mjs +0 -0
  182. /package/{esm2020 → esm2022}/lib/components/form/formly/index.mjs +0 -0
  183. /package/{esm2020 → esm2022}/lib/components/form/formly/models/formly-config.model.mjs +0 -0
  184. /package/{esm2020 → esm2022}/lib/components/form/formly/models/formly-field.model.mjs +0 -0
  185. /package/{esm2020 → esm2022}/lib/components/form/formly/models/index.mjs +0 -0
  186. /package/{esm2020 → esm2022}/lib/components/form/formly/wrappers/index.mjs +0 -0
  187. /package/{esm2020 → esm2022}/lib/components/form/index.mjs +0 -0
  188. /package/{esm2020 → esm2022}/lib/components/form/models/field-action-context.model.mjs +0 -0
  189. /package/{esm2020 → esm2022}/lib/components/form/models/form-editor.interface.mjs +0 -0
  190. /package/{esm2020 → esm2022}/lib/components/form/models/index.mjs +0 -0
  191. /package/{esm2020 → esm2022}/lib/components/layout/index.mjs +0 -0
  192. /package/{esm2020 → esm2022}/lib/components/layout/services/index.mjs +0 -0
  193. /package/{esm2020 → esm2022}/lib/components/pages/index.mjs +0 -0
  194. /package/{esm2020 → esm2022}/lib/components/tableview/index.mjs +0 -0
  195. /package/{esm2020 → esm2022}/lib/components/tableview/models/index.mjs +0 -0
  196. /package/{esm2020 → esm2022}/lib/components/tableview/table/models/index.mjs +0 -0
  197. /package/{esm2020 → esm2022}/lib/components/tableview/table/models/table.interface.mjs +0 -0
  198. /package/{esm2020 → esm2022}/lib/data-providers/base.data-provider.mjs +0 -0
  199. /package/{esm2020 → esm2022}/lib/data-providers/editor.data-provider.mjs +0 -0
  200. /package/{esm2020 → esm2022}/lib/data-providers/index.mjs +0 -0
  201. /package/{esm2020 → esm2022}/lib/data-providers/lookup.data-provider.mjs +0 -0
  202. /package/{esm2020 → esm2022}/lib/data-providers/table.data-provider.mjs +0 -0
  203. /package/{esm2020 → esm2022}/lib/data-providers/tableview-crud.data-provider.mjs +0 -0
  204. /package/{esm2020 → esm2022}/lib/data-providers/tableview.data-provider.mjs +0 -0
  205. /package/{esm2020 → esm2022}/lib/descriptors/action/action-button.descriptor.mjs +0 -0
  206. /package/{esm2020 → esm2022}/lib/descriptors/action/action-confirmation.descriptor.mjs +0 -0
  207. /package/{esm2020 → esm2022}/lib/descriptors/action/index.mjs +0 -0
  208. /package/{esm2020 → esm2022}/lib/descriptors/editor/field-validation.descriptor.mjs +0 -0
  209. /package/{esm2020 → esm2022}/lib/descriptors/editor/index.mjs +0 -0
  210. /package/{esm2020 → esm2022}/lib/descriptors/filter/filter.descriptor.mjs +0 -0
  211. /package/{esm2020 → esm2022}/lib/descriptors/filter/index.mjs +0 -0
  212. /package/{esm2020 → esm2022}/lib/descriptors/index.mjs +0 -0
  213. /package/{esm2020 → esm2022}/lib/descriptors/interfaces/field-config.interface.mjs +0 -0
  214. /package/{esm2020 → esm2022}/lib/descriptors/interfaces/index.mjs +0 -0
  215. /package/{esm2020 → esm2022}/lib/descriptors/interfaces/lookup-descriptor.interface.mjs +0 -0
  216. /package/{esm2020 → esm2022}/lib/descriptors/model.descriptor.mjs +0 -0
  217. /package/{esm2020 → esm2022}/lib/descriptors/table/column.descriptor.mjs +0 -0
  218. /package/{esm2020 → esm2022}/lib/descriptors/table/index.mjs +0 -0
  219. /package/{esm2020 → esm2022}/lib/descriptors/tableview/index.mjs +0 -0
  220. /package/{esm2020 → esm2022}/lib/descriptors/types/action.type.mjs +0 -0
  221. /package/{esm2020 → esm2022}/lib/descriptors/types/column.type.mjs +0 -0
  222. /package/{esm2020 → esm2022}/lib/descriptors/types/editor.type.mjs +0 -0
  223. /package/{esm2020 → esm2022}/lib/descriptors/types/field.type.mjs +0 -0
  224. /package/{esm2020 → esm2022}/lib/descriptors/types/filter.type.mjs +0 -0
  225. /package/{esm2020 → esm2022}/lib/descriptors/types/index.mjs +0 -0
  226. /package/{esm2020 → esm2022}/lib/directives/index.mjs +0 -0
  227. /package/{esm2020 → esm2022}/lib/models/column-value.model.mjs +0 -0
  228. /package/{esm2020 → esm2022}/lib/models/config.model.mjs +0 -0
  229. /package/{esm2020 → esm2022}/lib/models/enum.model.mjs +0 -0
  230. /package/{esm2020 → esm2022}/lib/models/error-internal.model.mjs +0 -0
  231. /package/{esm2020 → esm2022}/lib/models/error.model.mjs +0 -0
  232. /package/{esm2020 → esm2022}/lib/models/index.mjs +0 -0
  233. /package/{esm2020 → esm2022}/lib/models/menu.model.mjs +0 -0
  234. /package/{esm2020 → esm2022}/lib/models/tableview-attr.model.mjs +0 -0
  235. /package/{esm2020 → esm2022}/lib/models/user.model.mjs +0 -0
  236. /package/{esm2020 → esm2022}/lib/models/version.model.mjs +0 -0
  237. /package/{esm2020 → esm2022}/lib/models/view-container.model.mjs +0 -0
  238. /package/{esm2020 → esm2022}/lib/pipes/index.mjs +0 -0
  239. /package/{esm2020 → esm2022}/lib/pipes/models/internal/enumrate-pipe-i18n.model.mjs +0 -0
  240. /package/{esm2020 → esm2022}/lib/pipes/models/internal/index.mjs +0 -0
  241. /package/{esm2020 → esm2022}/lib/provide-commons.mjs +0 -0
  242. /package/{esm2020 → esm2022}/lib/router/index.mjs +0 -0
  243. /package/{esm2020 → esm2022}/lib/router/models/index.mjs +0 -0
  244. /package/{esm2020 → esm2022}/lib/router/models/router.model.mjs +0 -0
  245. /package/{esm2020 → esm2022}/lib/router/tableview-route-builder.mjs +0 -0
  246. /package/{esm2020 → esm2022}/lib/security/authorization.util.mjs +0 -0
  247. /package/{esm2020 → esm2022}/lib/security/index.mjs +0 -0
  248. /package/{esm2020 → esm2022}/lib/security/model/authorization.type.mjs +0 -0
  249. /package/{esm2020 → esm2022}/lib/security/model/index.mjs +0 -0
  250. /package/{esm2020 → esm2022}/lib/security/model/permission-service.interface.mjs +0 -0
  251. /package/{esm2020 → esm2022}/lib/security/model/permissions.model.mjs +0 -0
  252. /package/{esm2020 → esm2022}/lib/services/error-mapper.service.mjs +0 -0
  253. /package/{esm2020 → esm2022}/lib/services/index.mjs +0 -0
  254. /package/{esm2020 → esm2022}/lib/services/internal/commons-init.provider.mjs +0 -0
  255. /package/{esm2020 → esm2022}/lib/services/internal/index.mjs +0 -0
  256. /package/{esm2020 → esm2022}/lib/services/providers/config-service.provider.mjs +0 -0
  257. /package/{esm2020 → esm2022}/lib/services/providers/formly-config.provider.mjs +0 -0
  258. /package/{esm2020 → esm2022}/lib/services/providers/index.mjs +0 -0
  259. /package/{esm2020 → esm2022}/lib/services/tokens/browser-storage.token.mjs +0 -0
  260. /package/{esm2020 → esm2022}/lib/services/tokens/commons-init.token.mjs +0 -0
  261. /package/{esm2020 → esm2022}/lib/services/tokens/default-setting.token.mjs +0 -0
  262. /package/{esm2020 → esm2022}/lib/services/tokens/index.mjs +0 -0
  263. /package/{esm2020 → esm2022}/lib/services/tokens/module-config.token.mjs +0 -0
  264. /package/{esm2020 → esm2022}/lib/styles/button-style.builder.mjs +0 -0
  265. /package/{esm2020 → esm2022}/lib/styles/index.mjs +0 -0
  266. /package/{esm2020 → esm2022}/lib/styles/models/index.mjs +0 -0
  267. /package/{esm2020 → esm2022}/lib/styles/models/style-level.enum.mjs +0 -0
  268. /package/{esm2020 → esm2022}/lib/styles/models/style-size.enum.mjs +0 -0
  269. /package/{esm2020 → esm2022}/lib/types/i18n.type.mjs +0 -0
  270. /package/{esm2020 → esm2022}/lib/types/index.mjs +0 -0
  271. /package/{esm2020 → esm2022}/lib/types/mng-localstorage-config-value.type.mjs +0 -0
  272. /package/{esm2020 → esm2022}/lib/types/type.decorator.mjs +0 -0
  273. /package/{esm2020 → esm2022}/lib/utils/action-data-provider.util.mjs +0 -0
  274. /package/{esm2020 → esm2022}/lib/utils/editor-formly.util.mjs +0 -0
  275. /package/{esm2020 → esm2022}/lib/utils/enum.util.mjs +0 -0
  276. /package/{esm2020 → esm2022}/lib/utils/export.util.mjs +0 -0
  277. /package/{esm2020 → esm2022}/lib/utils/file.util.mjs +0 -0
  278. /package/{esm2020 → esm2022}/lib/utils/i18n.util.mjs +0 -0
  279. /package/{esm2020 → esm2022}/lib/utils/index.mjs +0 -0
  280. /package/{esm2020 → esm2022}/lib/utils/model.util.mjs +0 -0
  281. /package/{esm2020 → esm2022}/lib/utils/notification.util.mjs +0 -0
  282. /package/{esm2020 → esm2022}/lib/utils/object.util.mjs +0 -0
  283. /package/{esm2020 → esm2022}/lib/utils/route.util.mjs +0 -0
  284. /package/{esm2020 → esm2022}/lib/utils/string.util.mjs +0 -0
  285. /package/{esm2020 → esm2022}/lib/validators/field.validator.mjs +0 -0
  286. /package/{esm2020 → esm2022}/lib/validators/index.mjs +0 -0
  287. /package/{esm2020 → esm2022}/mediusinc-mng-commons.mjs +0 -0
@@ -1,304 +0,0 @@
1
- import { Subject } from 'rxjs';
2
- import { ObjectSerializer } from '../../api/utils';
3
- import { MngFormEvent } from '../../components/form/models';
4
- import { MngErrorInternal } from '../../models';
5
- import { I18nUtils } from '../../utils';
6
- import { TableviewUtil } from '../../utils/tableview.util';
7
- import { ModelDescriptor } from '../model.descriptor';
8
- import { FieldInputTypeEnum, TableviewEditorTypeEnum } from '../types';
9
- import { AFieldDescriptor, FieldActionDescriptor, FieldGroupDescriptor, FieldInputDescriptor, FieldLookupDescriptor, FieldLookupEnumDescriptor, FieldManyEditorDescriptor, FieldManyToManyEditorDescriptor, FieldTabGroupDescriptor } from './field.descriptor';
10
- export class EditorDescriptor {
11
- constructor(modelType, idProperty, titleProperty, tableviewEditorType = TableviewEditorTypeEnum.None, i18nBaseKey) {
12
- this._tabs = [];
13
- this._groups = [];
14
- this._fields = [];
15
- this._disabled = false;
16
- this._isLocalized = false;
17
- this._eventsSubject = new Subject();
18
- this._modelType = modelType;
19
- this._model = new ModelDescriptor(modelType, idProperty, titleProperty, i18nBaseKey);
20
- this._tableviewEditorType = tableviewEditorType;
21
- }
22
- /**
23
- * auto generated editor descriptor based on openapi definition
24
- * generates all fields from definition
25
- * @param modelType class type
26
- * @param idProperty
27
- * @param titleProperty
28
- * @param tableEditorType
29
- */
30
- static from(modelType, idProperty, titleProperty, tableEditorType = TableviewEditorTypeEnum.None) {
31
- return EditorDescriptor.fromModelWithAttributes(modelType, TableviewUtil.getAttributeDefMap(modelType), titleProperty, idProperty, tableEditorType);
32
- }
33
- /**
34
- * auto generated editor descriptor based on openapi definition
35
- * generates only selected fields
36
- * @param modelType class type
37
- * @param attributes list of selected properties to generate fields based on
38
- * @param idProperty
39
- * @param titleProperty
40
- * @param tableEditorType
41
- */
42
- static fromModelWithAttributes(modelType, attributes, idProperty, titleProperty, tableEditorType = TableviewEditorTypeEnum.None) {
43
- const descriptor = new EditorDescriptor(modelType, idProperty, titleProperty, tableEditorType);
44
- attributes
45
- .filter(attr => !attr.type.includes('Set') && !attr.type.includes('Array'))
46
- .forEach(attr => descriptor.upsertFieldFromAttributeDef(attr, descriptor.fields.find(col => col.property === attr.name)));
47
- return descriptor;
48
- }
49
- get model() {
50
- return this._model;
51
- }
52
- get tabs() {
53
- return this._tabs;
54
- }
55
- get fields() {
56
- return this._fields;
57
- }
58
- get tableviewEditorType() {
59
- return this._tableviewEditorType;
60
- }
61
- get disabled() {
62
- return this._disabled;
63
- }
64
- get isLocalized() {
65
- return this._isLocalized;
66
- }
67
- get localizationLocaleProperty() {
68
- return this._localizationLocaleProperty;
69
- }
70
- get localizationLocalizationProperty() {
71
- return this._localizationLocalizationProperty;
72
- }
73
- get localizationBeanType() {
74
- return this._localizationModelType;
75
- }
76
- get localeLookup() {
77
- return this._localeLookup;
78
- }
79
- createTabGroup(name, title) {
80
- const tabGroup = new FieldTabGroupDescriptor(this, name);
81
- if (!title) {
82
- title = I18nUtils.Type.getTabKey(this.model.i18nBaseKey, name);
83
- }
84
- tabGroup.withTitle(title);
85
- this.createTabGroupDescriptor(tabGroup);
86
- return tabGroup;
87
- }
88
- createFieldGroup(name, title) {
89
- const fieldGroup = new FieldGroupDescriptor(this, name);
90
- if (title !== null) {
91
- if (!title) {
92
- title = I18nUtils.Type.getGroupKey(this.model.i18nBaseKey, name);
93
- }
94
- fieldGroup.withTitle(title);
95
- }
96
- this.createFieldGroupDescriptor(fieldGroup);
97
- return fieldGroup;
98
- }
99
- addFieldDescriptor(field) {
100
- this.createDefaultGroup();
101
- this._fields.push(field);
102
- this._currentGroup?.addField(field);
103
- return this;
104
- }
105
- addField(property) {
106
- const field = new FieldInputDescriptor(this, property);
107
- this.addFieldDescriptor(field);
108
- return field;
109
- }
110
- /**
111
- * removes filed if exists in descriptor
112
- * @param property field name
113
- */
114
- removeField(property) {
115
- const fieldIdx = this._fields.findIndex(f => f.property === property);
116
- if (fieldIdx < 0) {
117
- throw new MngErrorInternal(`Field ${property} does not exist.`, 'EditorDescriptor error').consoleError();
118
- }
119
- for (const group of this._groups) {
120
- const groupFieldIdx = group.fields.findIndex(f => f instanceof AFieldDescriptor && f.property === property);
121
- if (groupFieldIdx >= 0) {
122
- group.fields.splice(groupFieldIdx, 1);
123
- break;
124
- }
125
- }
126
- this._fields.splice(fieldIdx, 1);
127
- }
128
- getField(property) {
129
- return this._fields.find(f => f.property === property) ?? null;
130
- }
131
- addFieldAction(actionName) {
132
- const field = new FieldActionDescriptor(this, actionName);
133
- this.addFieldDescriptor(field);
134
- return field;
135
- }
136
- addFieldLookup(property, modelType) {
137
- const field = new FieldLookupDescriptor(this, property, modelType);
138
- this.addFieldDescriptor(field);
139
- return field;
140
- }
141
- addFieldLookupEnum(property, enumType, options, nameAsValue = false, optionsTitlePath) {
142
- const field = new FieldLookupEnumDescriptor(this, property, enumType, options, nameAsValue, optionsTitlePath);
143
- this.addFieldDescriptor(field);
144
- return field;
145
- }
146
- addFieldManyEditor(property, tableviewDescriptor) {
147
- const field = new FieldManyEditorDescriptor(this, property, tableviewDescriptor);
148
- this.addFieldDescriptor(field);
149
- return field;
150
- }
151
- addFieldManyToManyEditor(property, mainTableDescriptor, lookupTableDescriptor) {
152
- const field = new FieldManyToManyEditorDescriptor(this, property, mainTableDescriptor, lookupTableDescriptor);
153
- this.addFieldDescriptor(field);
154
- return field;
155
- }
156
- withDisabled(disabled = true) {
157
- this._disabled = disabled;
158
- return this;
159
- }
160
- addValidation(name, validator, message) {
161
- if (this._currentGroup) {
162
- this._currentGroup.withValidation(name, validator, message);
163
- }
164
- }
165
- copy() {
166
- const editor = new EditorDescriptor(this.model.type, this.model.idPropertyName, this.model.titlePropertyName, this.tableviewEditorType);
167
- for (const tabGroup of this._tabs) {
168
- editor.createTabGroupDescriptor(tabGroup.copy());
169
- }
170
- for (const tabGroup of editor._tabs) {
171
- for (const fieldGroup of tabGroup.fields) {
172
- editor._fields.push(...fieldGroup.fields);
173
- }
174
- editor._groups.push(...tabGroup.fields);
175
- }
176
- editor._currentTabGroup = editor._tabs[editor._tabs.length - 1];
177
- editor._currentGroup = editor._currentTabGroup.fields[editor._currentTabGroup.fields.length - 1];
178
- editor._disabled = this._disabled;
179
- return editor;
180
- }
181
- createFieldGroupDescriptor(fieldGroup) {
182
- this.createDefaultTabGroup();
183
- this._currentGroup = fieldGroup;
184
- this._groups.push(fieldGroup);
185
- this._currentTabGroup?.addField(fieldGroup);
186
- return this;
187
- }
188
- createTabGroupDescriptor(tabGroup) {
189
- this._currentTabGroup = tabGroup;
190
- this._tabs.push(tabGroup);
191
- return this;
192
- }
193
- createDefaultGroup() {
194
- this.createDefaultTabGroup();
195
- if (this._currentTabGroup?.fields.length === 0) {
196
- this.createFieldGroup(EditorDescriptor.defaultGroupName, null);
197
- }
198
- }
199
- createDefaultTabGroup() {
200
- if (this._tabs.length === 0) {
201
- this.createTabGroup(EditorDescriptor.defaultGroupName, 'general.general');
202
- }
203
- }
204
- /**
205
- * modifies selected field
206
- * do not use it for enums! (use withFieldModifiedEnum instead)
207
- * @param property field name
208
- * @param fieldType new field type for selected field
209
- * @param args additional parameters for field
210
- */
211
- withFieldModifiedType(property, fieldType, ...args) {
212
- const attribute = TableviewUtil.getAttributeDefMap(this._modelType).find(attribute => attribute.name === property);
213
- if (attribute) {
214
- attribute.fieldType = fieldType;
215
- this.upsertFieldFromAttributeDef(attribute, this.fields.find(fi => fi.property === property), ...args);
216
- }
217
- return this;
218
- }
219
- /**
220
- * modifies selected field with enum type
221
- * @param property field property name
222
- * @param enumType type of enum for new field
223
- * @param optionsTitlePath
224
- * @param values
225
- * @param nameAsValue
226
- */
227
- withFieldModifiedEnum(property, enumType, optionsTitlePath, values, nameAsValue = false) {
228
- const attribute = TableviewUtil.getAttributeDefMap(this._modelType).find(a => a.name === property);
229
- if (attribute) {
230
- attribute.fieldType = FieldInputTypeEnum.Radio;
231
- const field = this.fields.find(f => f.property === property);
232
- if (field && field instanceof FieldInputDescriptor) {
233
- field.asRadioFromEnum(enumType ?? ObjectSerializer.get().findEnum(attribute.type), optionsTitlePath, values, nameAsValue);
234
- }
235
- }
236
- return this;
237
- }
238
- /**
239
- * adds lookup to given field
240
- * @param property field property name
241
- * @param modelType model type of field
242
- * @param lookupProvider provider to be added to field
243
- * @param titleProperty
244
- */
245
- withFieldModifiedLookup(property, modelType, lookupProvider, titleProperty) {
246
- this.removeField(property);
247
- const field = this.addFieldLookup(property, modelType).asAutocomplete().withLookupDataProvider(lookupProvider);
248
- if (titleProperty) {
249
- field.withItemsLabelProperty(titleProperty);
250
- }
251
- return this;
252
- }
253
- /**
254
- * generates field based on attribute definition, used for auto model
255
- * @param attribute definition
256
- * @param field optional, if defined will be replaced, otherwise new will be generated
257
- * @param args additional arguments
258
- */
259
- upsertFieldFromAttributeDef(attribute, field, ...args) {
260
- if (field == null) {
261
- field = this.addField(attribute.name);
262
- }
263
- if (field instanceof FieldInputDescriptor) {
264
- if (attribute.enumType) {
265
- return field.asRadioFromEnum(attribute.enumType);
266
- }
267
- else {
268
- return field.asType(attribute.fieldType ?? TableviewUtil.toFieldInputTypeFromColumnType(attribute.columnType, attribute.columnDisplayType), ...args);
269
- }
270
- }
271
- return field;
272
- }
273
- /**
274
- * This method takes care of displaying correct/localized data in the editor
275
- * @param localizationsProperty property that tells us where on the model are localizations accessible
276
- * @param localeProperty property by which we find the locale
277
- * @param localizationModelType model type for localizations if it is different from the whole model
278
- * @param localeLookup lookup provider for locales supported by the application.
279
- */
280
- localized(localizationsProperty = 'localizations', localeProperty = 'locale', localizationModelType, localeLookup) {
281
- this._localizationLocalizationProperty = localizationsProperty;
282
- this._localizationLocaleProperty = localeProperty;
283
- this._isLocalized = true;
284
- this._localeLookup = localeLookup;
285
- if (localizationModelType) {
286
- this._localizationModelType = localizationModelType;
287
- }
288
- else {
289
- this._localizationModelType = this._modelType;
290
- }
291
- return this;
292
- }
293
- nextEvent(type, cmpType, cmpInstance, data) {
294
- this._eventsSubject.next(new MngFormEvent(type, cmpType, cmpInstance, data));
295
- }
296
- completeEvents() {
297
- this._eventsSubject.complete();
298
- }
299
- get events$() {
300
- return this._eventsSubject.asObservable();
301
- }
302
- }
303
- EditorDescriptor.defaultGroupName = '_default';
304
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdG9yLmRlc2NyaXB0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2Rlc2NyaXB0b3JzL2VkaXRvci9lZGl0b3IuZGVzY3JpcHRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQWEsT0FBTyxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBR3pDLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQ2pELE9BQU8sRUFBb0IsWUFBWSxFQUF1QixNQUFNLDhCQUE4QixDQUFDO0FBRW5HLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUc5QyxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQ3RDLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQztBQUN6RCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFHcEQsT0FBTyxFQUFDLGtCQUFrQixFQUFFLHVCQUF1QixFQUFDLE1BQU0sVUFBVSxDQUFDO0FBQ3JFLE9BQU8sRUFDSCxnQkFBZ0IsRUFDaEIscUJBQXFCLEVBQ3JCLG9CQUFvQixFQUNwQixvQkFBb0IsRUFDcEIscUJBQXFCLEVBQ3JCLHlCQUF5QixFQUN6Qix5QkFBeUIsRUFDekIsK0JBQStCLEVBQy9CLHVCQUF1QixFQUMxQixNQUFNLG9CQUFvQixDQUFDO0FBRTVCLE1BQU0sT0FBTyxnQkFBZ0I7SUFzQnpCLFlBQ0ksU0FBdUIsRUFDdkIsVUFBbUIsRUFDbkIsYUFBc0IsRUFDdEIsbUJBQW1CLEdBQUcsdUJBQXVCLENBQUMsSUFBSSxFQUNsRCxXQUF5QztRQXJCMUIsVUFBSyxHQUFzQyxFQUFFLENBQUM7UUFDOUMsWUFBTyxHQUFtQyxFQUFFLENBQUM7UUFDdEQsWUFBTyxHQUFvQyxFQUFFLENBQUM7UUFJOUMsY0FBUyxHQUFHLEtBQUssQ0FBQztRQUVsQixpQkFBWSxHQUFH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SUFBSSxDQUFDLGlDQUFpQyxHQUFHLHFCQUFxQixDQUFDO1FBQy9ELElBQUksQ0FBQywyQkFBMkIsR0FBRyxjQUFjLENBQUM7UUFDbEQsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDekIsSUFBSSxDQUFDLGFBQWEsR0FBRyxZQUFZLENBQUM7UUFFbEMsSUFBSSxxQkFBcUIsRUFBRTtZQUN2QixJQUFJLENBQUMsc0JBQXNCLEdBQUcscUJBQXFCLENBQUM7U0FDdkQ7YUFBTTtZQUNILElBQUksQ0FBQyxzQkFBc0IsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1NBQ2pEO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVNLFNBQVMsQ0FBQyxJQUEwQixFQUFFLE9BQWtCLEVBQUUsV0FBZ0IsRUFBRSxJQUEyQjtRQUMxRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLFlBQVksQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ2pGLENBQUM7SUFFTSxjQUFjO1FBQ2pCLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDbkMsQ0FBQztJQUVELElBQVcsT0FBTztRQUNkLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUM5QyxDQUFDOztBQWhZc0IsaUNBQWdCLEdBQUcsVUFBVSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtUeXBlfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHtPYnNlcnZhYmxlLCBTdWJqZWN0fSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHtNZWRpdXNRdWVyeVBhcmFtfSBmcm9tICcuLi8uLi9hcGkvbW9kZWxzJztcbmltcG9ydCB7T2JqZWN0U2VyaWFsaXplcn0gZnJvbSAnLi4vLi4vYXBpL3V0aWxzJztcbmltcG9ydCB7TW5nRmllbGRFdmVudERhdGEsIE1uZ0Zvcm1FdmVudCwgTW5nRm9ybUV2ZW50VHlwZUVudW19IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvZm9ybS9tb2RlbHMnO1xuaW1wb3J0IHtJTG9va3VwRGF0YVByb3ZpZGVyfSBmcm9tICcuLi8uLi9kYXRhLXByb3ZpZGVycyc7XG5pbXBvcnQge01uZ0Vycm9ySW50ZXJuYWx9IGZyb20gJy4uLy4uL21vZGVscyc7XG5pbXBvcnQge1RhYmxldmlld0F0dHJpYnV0ZURlZn0gZnJvbSAnLi4vLi4vbW9kZWxzL3RhYmxldmlldy1hdHRyLm1vZGVsJztcbmltcG9ydCB7Q2xhc3NUeXBlLCBFbnVtQ29uc3RhbnRUeXBlLCBFbnVtVHlwZSwgTW5nRmllbGRWYWxpZGF0aW9uTWVzc2FnZSwgTW5nRmllbGRWYWxpZGF0b3J9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7STE4blV0aWxzfSBmcm9tICcuLi8uLi91dGlscyc7XG5pbXBvcnQge1RhYmxldmlld1V0aWx9IGZyb20gJy4uLy4uL3V0aWxzL3RhYmxldmlldy51dGlsJztcbmltcG9ydCB7TW9kZWxEZXNjcmlwdG9yfSBmcm9tICcuLi9tb2RlbC5kZXNjcmlwdG9yJztcbmltcG9ydCB7VGFibGVEZXNjcmlwdG9yfSBmcm9tICcuLi90YWJsZSc7XG5pbXBvcnQge1RhYmxldmlld0Rlc2NyaXB0b3J9IGZyb20gJy4uL3RhYmxldmlldyc7XG5pbXBvcnQge0ZpZWxkSW5wdXRUeXBlRW51bSwgVGFibGV2aWV3RWRpdG9yVHlwZUVudW19IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7XG4gICAgQUZpZWxkRGVzY3JpcHRvcixcbiAgICBGaWVsZEFjdGlvbkRlc2NyaXB0b3IsXG4gICAgRmllbGRHcm91cERlc2NyaXB0b3IsXG4gICAgRmllbGRJbnB1dERlc2NyaXB0b3IsXG4gICAgRmllbGRMb29rdXBEZXNjcmlwdG9yLFxuICAgIEZpZWxkTG9va3VwRW51bURlc2NyaXB0b3IsXG4gICAgRmllbGRNYW55RWRpdG9yRGVzY3JpcHRvcixcbiAgICBGaWVsZE1hbnlUb01hbnlFZGl0b3JEZXNjcmlwdG9yLFxuICAgIEZpZWxkVGFiR3JvdXBEZXNjcmlwdG9yXG59IGZyb20gJy4vZmllbGQuZGVzY3JpcHRvcic7XG5cbmV4cG9ydCBjbGFzcyBFZGl0b3JEZXNjcmlwdG9yPFQ+IHtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IGRlZmF1bHRHcm91cE5hbWUgPSAnX2RlZmF1bHQnO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IF9tb2RlbDogTW9kZWxEZXNjcmlwdG9yPFQ+O1xuICAgIHByb3RlY3RlZCByZWFkb25seSBfbW9kZWxUeXBlOiBDbGFzc1R5cGU8VD47XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IF90YWJsZXZpZXdFZGl0b3JUeXBlOiBUYWJsZXZpZXdFZGl0b3JUeXBlRW51bTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgX3RhYnM6IEFycmF5PEZpZWxkVGFiR3JvdXBEZXNjcmlwdG9yPFQ+PiA9IFtdO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBfZ3JvdXBzOiBBcnJheTxGaWVsZEdyb3VwRGVzY3JpcHRvcjxUPj4gPSBbXTtcbiAgICBwcm90ZWN0ZWQgX2ZpZWxkczogQXJyYXk8QUZpZWxkRGVzY3JpcHRvcjxhbnksIFQ+PiA9IFtdO1xuICAgIHByb3RlY3RlZCBfY3VycmVudFRhYkdyb3VwPzogRmllbGRUYWJHcm91cERlc2NyaXB0b3I8VD47XG4gICAgcHJvdGVjdGVkIF9jdXJyZW50R3JvdXA/OiBGaWVsZEdyb3VwRGVzY3JpcHRvcjxUPjtcblxuICAgIHByb3RlY3RlZCBfZGlzYWJsZWQgPSBmYWxzZTtcblxuICAgIHByb3RlY3RlZCBfaXNMb2NhbGl6ZWQgPSBmYWxzZTtcbiAgICBwcm90ZWN0ZWQgX2xvY2FsaXphdGlvbkxvY2FsZVByb3BlcnR5Pzogc3RyaW5nO1xuICAgIHByb3RlY3RlZCBfbG9jYWxpemF0aW9uTG9jYWxpemF0aW9uUHJvcGVydHk/OiBzdHJpbmc7XG4gICAgcHJvdGVjdGVkIF9sb2NhbGl6YXRpb25Nb2RlbFR5cGU/OiBDbGFzc1R5cGU8YW55PjtcbiAgICBwcm90ZWN0ZWQgX2xvY2FsZUxvb2t1cD86IChxdWVyeVBhcmFtPzogTWVkaXVzUXVlcnlQYXJhbSwgc2VydmljZT86IGFueSwgc2VhcmNoPzogc3RyaW5nKSA9PiBPYnNlcnZhYmxlPEFycmF5PHN0cmluZz4+O1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IF9ldmVudHNTdWJqZWN0ID0gbmV3IFN1YmplY3Q8TW5nRm9ybUV2ZW50PFQ+PigpO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIG1vZGVsVHlwZTogQ2xhc3NUeXBlPFQ+LFxuICAgICAgICBpZFByb3BlcnR5Pzogc3RyaW5nLFxuICAgICAgICB0aXRsZVByb3BlcnR5Pzogc3RyaW5nLFxuICAgICAgICB0YWJsZXZpZXdFZGl0b3JUeXBlID0gVGFibGV2aWV3RWRpdG9yVHlwZUVudW0uTm9uZSxcbiAgICAgICAgaTE4bkJhc2VLZXk/OiBzdHJpbmcgfCBDbGFzc1R5cGU8dW5rbm93bj5cbiAgICApIHtcbiAgICAgICAgdGhpcy5fbW9kZWxUeXBlID0gbW9kZWxUeXBlO1xuICAgICAgICB0aGlzLl9tb2RlbCA9IG5ldyBNb2RlbERlc2NyaXB0b3I8VD4obW9kZWxUeXBlLCBpZFByb3BlcnR5LCB0aXRsZVByb3BlcnR5LCBpMThuQmFzZUtleSk7XG4gICAgICAgIHRoaXMuX3RhYmxldmlld0VkaXRvclR5cGUgPSB0YWJsZXZpZXdFZGl0b3JUeXBlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGF1dG8gZ2VuZXJhdGVkIGVkaXRvciBkZXNjcmlwdG9yIGJhc2VkIG9uIG9wZW5hcGkgZGVmaW5pdGlvblxuICAgICAqIGdlbmVyYXRlcyBhbGwgZmllbGRzIGZyb20gZGVmaW5pdGlvblxuICAgICAqIEBwYXJhbSBtb2RlbFR5cGUgY2xhc3MgdHlwZVxuICAgICAqIEBwYXJhbSBpZFByb3BlcnR5XG4gICAgICogQHBhcmFtIHRpdGxlUHJvcGVydHlcbiAgICAgKiBAcGFyYW0gdGFibGVFZGl0b3JUeXBlXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBmcm9tPFQ+KG1vZGVsVHlwZTogQ2xhc3NUeXBlPFQ+LCBpZFByb3BlcnR5Pzogc3RyaW5nLCB0aXRsZVByb3BlcnR5Pzogc3RyaW5nLCB0YWJsZUVkaXRvclR5cGUgPSBUYWJsZXZpZXdFZGl0b3JUeXBlRW51bS5Ob25lKTogRWRpdG9yRGVzY3JpcHRvcjxUPiB7XG4gICAgICAgIHJldHVybiBFZGl0b3JEZXNjcmlwdG9yLmZyb21Nb2RlbFdpdGhBdHRyaWJ1dGVzKG1vZGVsVHlwZSwgVGFibGV2aWV3VXRpbC5nZXRBdHRyaWJ1dGVEZWZNYXAobW9kZWxUeXBlKSwgdGl0bGVQcm9wZXJ0eSwgaWRQcm9wZXJ0eSwgdGFibGVFZGl0b3JUeXBlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBhdXRvIGdlbmVyYXRlZCBlZGl0b3IgZGVzY3JpcHRvciBiYXNlZCBvbiBvcGVuYXBpIGRlZmluaXRpb25cbiAgICAgKiBnZW5lcmF0ZXMgb25seSBzZWxlY3RlZCBmaWVsZHNcbiAgICAgKiBAcGFyYW0gbW9kZWxUeXBlIGNsYXNzIHR5cGVcbiAgICAgKiBAcGFyYW0gYXR0cmlidXRlcyBsaXN0IG9mIHNlbGVjdGVkIHByb3BlcnRpZXMgdG8gZ2VuZXJhdGUgZmllbGRzIGJhc2VkIG9uXG4gICAgICogQHBhcmFtIGlkUHJvcGVydHlcbiAgICAgKiBAcGFyYW0gdGl0bGVQcm9wZXJ0eVxuICAgICAqIEBwYXJhbSB0YWJsZUVkaXRvclR5cGVcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGZyb21Nb2RlbFdpdGhBdHRyaWJ1dGVzPFQ+KFxuICAgICAgICBtb2RlbFR5cGU6IENsYXNzVHlwZTxUPixcbiAgICAgICAgYXR0cmlidXRlczogVGFibGV2aWV3QXR0cmlidXRlRGVmW10sXG4gICAgICAgIGlkUHJvcGVydHk/OiBzdHJpbmcsXG4gICAgICAgIHRpdGxlUHJvcGVydHk/OiBzdHJpbmcsXG4gICAgICAgIHRhYmxlRWRpdG9yVHlwZSA9IFRhYmxldmlld0VkaXRvclR5cGVFbnVtLk5vbmVcbiAgICApOiBFZGl0b3JEZXNjcmlwdG9yPFQ+IHtcbiAgICAgICAgY29uc3QgZGVzY3JpcHRvciA9IG5ldyBFZGl0b3JEZXNjcmlwdG9yKG1vZGVsVHlwZSwgaWRQcm9wZXJ0eSwgdGl0bGVQcm9wZXJ0eSwgdGFibGVFZGl0b3JUeXBlKTtcblxuICAgICAgICBhdHRyaWJ1dGVzXG4gICAgICAgICAgICAuZmlsdGVyKGF0dHIgPT4gIWF0dHIudHlwZS5pbmNsdWRlcygnU2V0JykgJiYgIWF0dHIudHlwZS5pbmNsdWRlcygnQXJyYXknKSlcbiAgICAgICAgICAgIC5mb3JFYWNoKGF0dHIgPT5cbiAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLnVwc2VydEZpZWxkRnJvbUF0dHJpYnV0ZURlZihcbiAgICAgICAgICAgICAgICAgICAgYXR0cixcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci5maWVsZHMuZmluZChjb2wgPT4gY29sLnByb3BlcnR5ID09PSBhdHRyLm5hbWUpXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBtb2RlbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21vZGVsO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgdGFicygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RhYnM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBmaWVsZHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9maWVsZHM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCB0YWJsZXZpZXdFZGl0b3JUeXBlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdGFibGV2aWV3RWRpdG9yVHlwZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGRpc2FibGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGlzYWJsZWQ7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBpc0xvY2FsaXplZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzTG9jYWxpemVkO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbG9jYWxpemF0aW9uTG9jYWxlUHJvcGVydHkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sb2NhbGl6YXRpb25Mb2NhbGVQcm9wZXJ0eTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGxvY2FsaXphdGlvbkxvY2FsaXphdGlvblByb3BlcnR5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbG9jYWxpemF0aW9uTG9jYWxpemF0aW9uUHJvcGVydHk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBsb2NhbGl6YXRpb25CZWFuVHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvY2FsaXphdGlvbk1vZGVsVHlwZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGxvY2FsZUxvb2t1cCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvY2FsZUxvb2t1cDtcbiAgICB9XG5cbiAgICBwdWJsaWMgY3JlYXRlVGFiR3JvdXAobmFtZTogc3RyaW5nLCB0aXRsZT86IHN0cmluZyk6IEZpZWxkVGFiR3JvdXBEZXNjcmlwdG9yPFQ+IHtcbiAgICAgICAgY29uc3QgdGFiR3JvdXAgPSBuZXcgRmllbGRUYWJHcm91cERlc2NyaXB0b3I8VD4odGhpcywgbmFtZSk7XG4gICAgICAgIGlmICghdGl0bGUpIHtcbiAgICAgICAgICAgIHRpdGxlID0gSTE4blV0aWxzLlR5cGUuZ2V0VGFiS2V5KHRoaXMubW9kZWwuaTE4bkJhc2VLZXksIG5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIHRhYkdyb3VwLndpdGhUaXRsZSh0aXRsZSk7XG4gICAgICAgIHRoaXMuY3JlYXRlVGFiR3JvdXBEZXNjcmlwdG9yKHRhYkdyb3VwKTtcbiAgICAgICAgcmV0dXJuIHRhYkdyb3VwO1xuICAgIH1cblxuICAgIHB1YmxpYyBjcmVhdGVGaWVsZEdyb3VwKG5hbWU6IHN0cmluZywgdGl0bGU/OiBzdHJpbmcgfCBudWxsKTogRmllbGRHcm91cERlc2NyaXB0b3I8VD4ge1xuICAgICAgICBjb25zdCBmaWVsZEdyb3VwID0gbmV3IEZpZWxkR3JvdXBEZXNjcmlwdG9yPFQ+KHRoaXMsIG5hbWUpO1xuICAgICAgICBpZiAodGl0bGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGlmICghdGl0bGUpIHtcbiAgICAgICAgICAgICAgICB0aXRsZSA9IEkxOG5VdGlscy5UeXBlLmdldEdyb3VwS2V5KHRoaXMubW9kZWwuaTE4bkJhc2VLZXksIG5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmllbGRHcm91cC53aXRoVGl0bGUodGl0bGUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY3JlYXRlRmllbGRHcm91cERlc2NyaXB0b3IoZmllbGRHcm91cCk7XG4gICAgICAgIHJldHVybiBmaWVsZEdyb3VwO1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGRGaWVsZERlc2NyaXB0b3I8RlQsIEZWVCA9IEZUPihmaWVsZDogQUZpZWxkRGVzY3JpcHRvcjxGVCwgVCwgRlZUPik6IHRoaXMge1xuICAgICAgICB0aGlzLmNyZWF0ZURlZmF1bHRHcm91cCgpO1xuICAgICAgICB0aGlzLl9maWVsZHMucHVzaChmaWVsZCk7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRHcm91cD8uYWRkRmllbGQoZmllbGQpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkRmllbGQocHJvcGVydHk6IHN0cmluZyk6IEZpZWxkSW5wdXREZXNjcmlwdG9yPFQ+IHtcbiAgICAgICAgY29uc3QgZmllbGQgPSBuZXcgRmllbGRJbnB1dERlc2NyaXB0b3I8VD4odGhpcywgcHJvcGVydHkpO1xuICAgICAgICB0aGlzLmFkZEZpZWxkRGVzY3JpcHRvcihmaWVsZCk7XG4gICAgICAgIHJldHVybiBmaWVsZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiByZW1vdmVzIGZpbGVkIGlmIGV4aXN0cyBpbiBkZXNjcmlwdG9yXG4gICAgICogQHBhcmFtIHByb3BlcnR5IGZpZWxkIG5hbWVcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVtb3ZlRmllbGQocHJvcGVydHk6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBjb25zdCBmaWVsZElkeCA9IHRoaXMuX2ZpZWxkcy5maW5kSW5kZXgoZiA9PiBmLnByb3BlcnR5ID09PSBwcm9wZXJ0eSk7XG4gICAgICAgIGlmIChmaWVsZElkeCA8IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBNbmdFcnJvckludGVybmFsKGBGaWVsZCAke3Byb3BlcnR5fSBkb2VzIG5vdCBleGlzdC5gLCAnRWRpdG9yRGVzY3JpcHRvciBlcnJvcicpLmNvbnNvbGVFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgZ3JvdXAgb2YgdGhpcy5fZ3JvdXBzKSB7XG4gICAgICAgICAgICBjb25zdCBncm91cEZpZWxkSWR4ID0gZ3JvdXAuZmllbGRzLmZpbmRJbmRleChmID0+IGYgaW5zdGFuY2VvZiBBRmllbGREZXNjcmlwdG9yICYmIGYucHJvcGVydHkgPT09IHByb3BlcnR5KTtcbiAgICAgICAgICAgIGlmIChncm91cEZpZWxkSWR4ID49IDApIHtcbiAgICAgICAgICAgICAgICBncm91cC5maWVsZHMuc3BsaWNlKGdyb3VwRmllbGRJZHgsIDEpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2ZpZWxkcy5zcGxpY2UoZmllbGRJZHgsIDEpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRGaWVsZChwcm9wZXJ0eTogc3RyaW5nKTogQUZpZWxkRGVzY3JpcHRvcjxhbnksIFQ+IHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9maWVsZHMuZmluZChmID0+IGYucHJvcGVydHkgPT09IHByb3BlcnR5KSA/PyBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGRGaWVsZEFjdGlvbihhY3Rpb25OYW1lOiBzdHJpbmcpOiBGaWVsZEFjdGlvbkRlc2NyaXB0b3I8VD4ge1xuICAgICAgICBjb25zdCBmaWVsZCA9IG5ldyBGaWVsZEFjdGlvbkRlc2NyaXB0b3I8VD4odGhpcywgYWN0aW9uTmFtZSk7XG4gICAgICAgIHRoaXMuYWRkRmllbGREZXNjcmlwdG9yKGZpZWxkKTtcbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGRGaWVsZExvb2t1cDxGVD4ocHJvcGVydHk6IHN0cmluZywgbW9kZWxUeXBlOiBDbGFzc1R5cGU8RlQ+KTogRmllbGRMb29rdXBEZXNjcmlwdG9yPEZULCBUPiB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gbmV3IEZpZWxkTG9va3VwRGVzY3JpcHRvcjxGVCwgVD4odGhpcywgcHJvcGVydHksIG1vZGVsVHlwZSk7XG4gICAgICAgIHRoaXMuYWRkRmllbGREZXNjcmlwdG9yKGZpZWxkKTtcbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGRGaWVsZExvb2t1cEVudW0oXG4gICAgICAgIHByb3BlcnR5OiBzdHJpbmcsXG4gICAgICAgIGVudW1UeXBlOiBFbnVtVHlwZSxcbiAgICAgICAgb3B0aW9ucz86IEFycmF5PEVudW1Db25zdGFudFR5cGU+LFxuICAgICAgICBuYW1lQXNWYWx1ZSA9IGZhbHNlLFxuICAgICAgICBvcHRpb25zVGl0bGVQYXRoPzogc3RyaW5nIHwgbnVsbFxuICAgICk6IEZpZWxkTG9va3VwRW51bURlc2NyaXB0b3I8VD4ge1xuICAgICAgICBjb25zdCBmaWVsZCA9IG5ldyBGaWVsZExvb2t1cEVudW1EZXNjcmlwdG9yKHRoaXMsIHByb3BlcnR5LCBlbnVtVHlwZSwgb3B0aW9ucywgbmFtZUFzVmFsdWUsIG9wdGlvbnNUaXRsZVBhdGgpO1xuICAgICAgICB0aGlzLmFkZEZpZWxkRGVzY3JpcHRvcihmaWVsZCk7XG4gICAgICAgIHJldHVybiBmaWVsZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkRmllbGRNYW55RWRpdG9yPEZUPihwcm9wZXJ0eTogc3RyaW5nLCB0YWJsZXZpZXdEZXNjcmlwdG9yOiBUYWJsZXZpZXdEZXNjcmlwdG9yPEZUPik6IEZpZWxkTWFueUVkaXRvckRlc2NyaXB0b3I8RlQsIFQ+IHtcbiAgICAgICAgY29uc3QgZmllbGQgPSBuZXcgRmllbGRNYW55RWRpdG9yRGVzY3JpcHRvcih0aGlzLCBwcm9wZXJ0eSwgdGFibGV2aWV3RGVzY3JpcHRvcik7XG4gICAgICAgIHRoaXMuYWRkRmllbGREZXNjcmlwdG9yKGZpZWxkKTtcbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGRGaWVsZE1hbnlUb01hbnlFZGl0b3I8RlQ+KFxuICAgICAgICBwcm9wZXJ0eTogc3RyaW5nLFxuICAgICAgICBtYWluVGFibGVEZXNjcmlwdG9yOiBUYWJsZURlc2NyaXB0b3I8RlQ+LFxuICAgICAgICBsb29rdXBUYWJsZURlc2NyaXB0b3I6IFRhYmxlRGVzY3JpcHRvcjxGVD5cbiAgICApOiBGaWVsZE1hbnlUb01hbnlFZGl0b3JEZXNjcmlwdG9yPEZULCBUPiB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gbmV3IEZpZWxkTWFueVRvTWFueUVkaXRvckRlc2NyaXB0b3IodGhpcywgcHJvcGVydHksIG1haW5UYWJsZURlc2NyaXB0b3IsIGxvb2t1cFRhYmxlRGVzY3JpcHRvcik7XG4gICAgICAgIHRoaXMuYWRkRmllbGREZXNjcmlwdG9yKGZpZWxkKTtcbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgIH1cblxuICAgIHB1YmxpYyB3aXRoRGlzYWJsZWQoZGlzYWJsZWQgPSB0cnVlKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2Rpc2FibGVkID0gZGlzYWJsZWQ7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGRWYWxpZGF0aW9uKG5hbWU6IHN0cmluZywgdmFsaWRhdG9yPzogTW5nRmllbGRWYWxpZGF0b3IsIG1lc3NhZ2U/OiBNbmdGaWVsZFZhbGlkYXRpb25NZXNzYWdlKSB7XG4gICAgICAgIGlmICh0aGlzLl9jdXJyZW50R3JvdXApIHtcbiAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRHcm91cC53aXRoVmFsaWRhdGlvbihuYW1lLCB2YWxpZGF0b3IsIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGNvcHkoKTogRWRpdG9yRGVzY3JpcHRvcjxUPiB7XG4gICAgICAgIGNvbnN0IGVkaXRvciA9IG5ldyBFZGl0b3JEZXNjcmlwdG9yPFQ+KHRoaXMubW9kZWwudHlwZSwgdGhpcy5tb2RlbC5pZFByb3BlcnR5TmFtZSwgdGhpcy5tb2RlbC50aXRsZVByb3BlcnR5TmFtZSwgdGhpcy50YWJsZXZpZXdFZGl0b3JUeXBlKTtcbiAgICAgICAgZm9yIChjb25zdCB0YWJHcm91cCBvZiB0aGlzLl90YWJzKSB7XG4gICAgICAgICAgICBlZGl0b3IuY3JlYXRlVGFiR3JvdXBEZXNjcmlwdG9yKHRhYkdyb3VwLmNvcHkoKSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCB0YWJHcm91cCBvZiBlZGl0b3IuX3RhYnMpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZmllbGRHcm91cCBvZiB0YWJHcm91cC5maWVsZHMpIHtcbiAgICAgICAgICAgICAgICBlZGl0b3IuX2ZpZWxkcy5wdXNoKC4uLmZpZWxkR3JvdXAuZmllbGRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVkaXRvci5fZ3JvdXBzLnB1c2goLi4udGFiR3JvdXAuZmllbGRzKTtcbiAgICAgICAgfVxuICAgICAgICBlZGl0b3IuX2N1cnJlbnRUYWJHcm91cCA9IGVkaXRvci5fdGFic1tlZGl0b3IuX3RhYnMubGVuZ3RoIC0gMV07XG4gICAgICAgIGVkaXRvci5fY3VycmVudEdyb3VwID0gZWRpdG9yLl9jdXJyZW50VGFiR3JvdXAuZmllbGRzW2VkaXRvci5fY3VycmVudFRhYkdyb3VwLmZpZWxkcy5sZW5ndGggLSAxXTtcbiAgICAgICAgZWRpdG9yLl9kaXNhYmxlZCA9IHRoaXMuX2Rpc2FibGVkO1xuICAgICAgICByZXR1cm4gZWRpdG9yO1xuICAgIH1cblxuICAgIHB1YmxpYyBjcmVhdGVGaWVsZEdyb3VwRGVzY3JpcHRvcihmaWVsZEdyb3VwOiBGaWVsZEdyb3VwRGVzY3JpcHRvcjxUPik6IHRoaXMge1xuICAgICAgICB0aGlzLmNyZWF0ZURlZmF1bHRUYWJHcm91cCgpO1xuICAgICAgICB0aGlzLl9jdXJyZW50R3JvdXAgPSBmaWVsZEdyb3VwO1xuICAgICAgICB0aGlzLl9ncm91cHMucHVzaChmaWVsZEdyb3VwKTtcbiAgICAgICAgdGhpcy5fY3VycmVudFRhYkdyb3VwPy5hZGRGaWVsZChmaWVsZEdyb3VwKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGNyZWF0ZVRhYkdyb3VwRGVzY3JpcHRvcih0YWJHcm91cDogRmllbGRUYWJHcm91cERlc2NyaXB0b3I8VD4pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5fY3VycmVudFRhYkdyb3VwID0gdGFiR3JvdXA7XG4gICAgICAgIHRoaXMuX3RhYnMucHVzaCh0YWJHcm91cCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlRGVmYXVsdEdyb3VwKCkge1xuICAgICAgICB0aGlzLmNyZWF0ZURlZmF1bHRUYWJHcm91cCgpO1xuICAgICAgICBpZiAodGhpcy5fY3VycmVudFRhYkdyb3VwPy5maWVsZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZUZpZWxkR3JvdXAoRWRpdG9yRGVzY3JpcHRvci5kZWZhdWx0R3JvdXBOYW1lLCBudWxsKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlRGVmYXVsdFRhYkdyb3VwKCkge1xuICAgICAgICBpZiAodGhpcy5fdGFicy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlVGFiR3JvdXAoRWRpdG9yRGVzY3JpcHRvci5kZWZhdWx0R3JvdXBOYW1lLCAnZ2VuZXJhbC5nZW5lcmFsJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBtb2RpZmllcyBzZWxlY3RlZCBmaWVsZFxuICAgICAqIGRvIG5vdCB1c2UgaXQgZm9yIGVudW1zISAodXNlIHdpdGhGaWVsZE1vZGlmaWVkRW51bSBpbnN0ZWFkKVxuICAgICAqIEBwYXJhbSBwcm9wZXJ0eSBmaWVsZCBuYW1lXG4gICAgICogQHBhcmFtIGZpZWxkVHlwZSBuZXcgZmllbGQgdHlwZSBmb3Igc2VsZWN0ZWQgZmllbGRcbiAgICAgKiBAcGFyYW0gYXJncyBhZGRpdGlvbmFsIHBhcmFtZXRlcnMgZm9yIGZpZWxkXG4gICAgICovXG4gICAgcHVibGljIHdpdGhGaWVsZE1vZGlmaWVkVHlwZShwcm9wZXJ0eTogc3RyaW5nLCBmaWVsZFR5cGU6IEZpZWxkSW5wdXRUeXBlRW51bSwgLi4uYXJnczogYW55W10pOiB0aGlzIHtcbiAgICAgICAgY29uc3QgYXR0cmlidXRlID0gVGFibGV2aWV3VXRpbC5nZXRBdHRyaWJ1dGVEZWZNYXAodGhpcy5fbW9kZWxUeXBlKS5maW5kKGF0dHJpYnV0ZSA9PiBhdHRyaWJ1dGUubmFtZSA9PT0gcHJvcGVydHkpO1xuICAgICAgICBpZiAoYXR0cmlidXRlKSB7XG4gICAgICAgICAgICBhdHRyaWJ1dGUuZmllbGRUeXBlID0gZmllbGRUeXBlO1xuICAgICAgICAgICAgdGhpcy51cHNlcnRGaWVsZEZyb21BdHRyaWJ1dGVEZWYoXG4gICAgICAgICAgICAgICAgYXR0cmlidXRlLFxuICAgICAgICAgICAgICAgIHRoaXMuZmllbGRzLmZpbmQoZmkgPT4gZmkucHJvcGVydHkgPT09IHByb3BlcnR5KSxcbiAgICAgICAgICAgICAgICAuLi5hcmdzXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIG1vZGlmaWVzIHNlbGVjdGVkIGZpZWxkIHdpdGggZW51bSB0eXBlXG4gICAgICogQHBhcmFtIHByb3BlcnR5IGZpZWxkIHByb3BlcnR5IG5hbWVcbiAgICAgKiBAcGFyYW0gZW51bVR5cGUgdHlwZSBvZiBlbnVtIGZvciBuZXcgZmllbGRcbiAgICAgKiBAcGFyYW0gb3B0aW9uc1RpdGxlUGF0aFxuICAgICAqIEBwYXJhbSB2YWx1ZXNcbiAgICAgKiBAcGFyYW0gbmFtZUFzVmFsdWVcbiAgICAgKi9cbiAgICBwdWJsaWMgd2l0aEZpZWxkTW9kaWZpZWRFbnVtKHByb3BlcnR5OiBzdHJpbmcsIGVudW1UeXBlPzogRW51bVR5cGUsIG9wdGlvbnNUaXRsZVBhdGg/OiBzdHJpbmcgfCBudWxsLCB2YWx1ZXM/OiBBcnJheTxFbnVtQ29uc3RhbnRUeXBlPiwgbmFtZUFzVmFsdWUgPSBmYWxzZSk6IHRoaXMge1xuICAgICAgICBjb25zdCBhdHRyaWJ1dGUgPSBUYWJsZXZpZXdVdGlsLmdldEF0dHJpYnV0ZURlZk1hcCh0aGlzLl9tb2RlbFR5cGUpLmZpbmQoYSA9PiBhLm5hbWUgPT09IHByb3BlcnR5KTtcbiAgICAgICAgaWYgKGF0dHJpYnV0ZSkge1xuICAgICAgICAgICAgYXR0cmlidXRlLmZpZWxkVHlwZSA9IEZpZWxkSW5wdXRUeXBlRW51bS5SYWRpbztcbiAgICAgICAgICAgIGNvbnN0IGZpZWxkID0gdGhpcy5maWVsZHMuZmluZChmID0+IGYucHJvcGVydHkgPT09IHByb3BlcnR5KTtcbiAgICAgICAgICAgIGlmIChmaWVsZCAmJiBmaWVsZCBpbnN0YW5jZW9mIEZpZWxkSW5wdXREZXNjcmlwdG9yKSB7XG4gICAgICAgICAgICAgICAgZmllbGQuYXNSYWRpb0Zyb21FbnVtKGVudW1UeXBlID8/IChPYmplY3RTZXJpYWxpemVyLmdldCgpLmZpbmRFbnVtKGF0dHJpYnV0ZS50eXBlKSBhcyBFbnVtVHlwZSksIG9wdGlvbnNUaXRsZVBhdGgsIHZhbHVlcywgbmFtZUFzVmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYWRkcyBsb29rdXAgdG8gZ2l2ZW4gZmllbGRcbiAgICAgKiBAcGFyYW0gcHJvcGVydHkgZmllbGQgcHJvcGVydHkgbmFtZVxuICAgICAqIEBwYXJhbSBtb2RlbFR5cGUgbW9kZWwgdHlwZSBvZiBmaWVsZFxuICAgICAqIEBwYXJhbSBsb29rdXBQcm92aWRlciBwcm92aWRlciB0byBiZSBhZGRlZCB0byBmaWVsZFxuICAgICAqIEBwYXJhbSB0aXRsZVByb3BlcnR5XG4gICAgICovXG4gICAgcHVibGljIHdpdGhGaWVsZE1vZGlmaWVkTG9va3VwPE1UPihwcm9wZXJ0eTogc3RyaW5nLCBtb2RlbFR5cGU6IENsYXNzVHlwZTxNVD4sIGxvb2t1cFByb3ZpZGVyOiBJTG9va3VwRGF0YVByb3ZpZGVyPGFueSwgYW55PiwgdGl0bGVQcm9wZXJ0eT86IHN0cmluZyk6IHRoaXMge1xuICAgICAgICB0aGlzLnJlbW92ZUZpZWxkKHByb3BlcnR5KTtcbiAgICAgICAgY29uc3QgZmllbGQgPSB0aGlzLmFkZEZpZWxkTG9va3VwKHByb3BlcnR5LCBtb2RlbFR5cGUpLmFzQXV0b2NvbXBsZXRlKCkud2l0aExvb2t1cERhdGFQcm92aWRlcihsb29rdXBQcm92aWRlcik7XG5cbiAgICAgICAgaWYgKHRpdGxlUHJvcGVydHkpIHtcbiAgICAgICAgICAgIChmaWVsZCBhcyBGaWVsZExvb2t1cERlc2NyaXB0b3I8YW55LCBhbnk+KS53aXRoSXRlbXNMYWJlbFByb3BlcnR5KHRpdGxlUHJvcGVydHkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogZ2VuZXJhdGVzIGZpZWxkIGJhc2VkIG9uIGF0dHJpYnV0ZSBkZWZpbml0aW9uLCB1c2VkIGZvciBhdXRvIG1vZGVsXG4gICAgICogQHBhcmFtIGF0dHJpYnV0ZSBkZWZpbml0aW9uXG4gICAgICogQHBhcmFtIGZpZWxkIG9wdGlvbmFsLCBpZiBkZWZpbmVkIHdpbGwgYmUgcmVwbGFjZWQsIG90aGVyd2lzZSBuZXcgd2lsbCBiZSBnZW5lcmF0ZWRcbiAgICAgKiBAcGFyYW0gYXJncyBhZGRpdGlvbmFsIGFyZ3VtZW50c1xuICAgICAqL1xuICAgIHByaXZhdGUgdXBzZXJ0RmllbGRGcm9tQXR0cmlidXRlRGVmKGF0dHJpYnV0ZTogVGFibGV2aWV3QXR0cmlidXRlRGVmLCBmaWVsZD86IEFGaWVsZERlc2NyaXB0b3I8YW55LCBUPiwgLi4uYXJnczogYW55W10pOiBBRmllbGREZXNjcmlwdG9yPGFueSwgVD4ge1xuICAgICAgICBpZiAoZmllbGQgPT0gbnVsbCkge1xuICAgICAgICAgICAgZmllbGQgPSB0aGlzLmFkZEZpZWxkKGF0dHJpYnV0ZS5uYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmaWVsZCBpbnN0YW5jZW9mIEZpZWxkSW5wdXREZXNjcmlwdG9yKSB7XG4gICAgICAgICAgICBpZiAoYXR0cmlidXRlLmVudW1UeXBlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZpZWxkLmFzUmFkaW9Gcm9tRW51bShhdHRyaWJ1dGUuZW51bVR5cGUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmllbGQuYXNUeXBlKGF0dHJpYnV0ZS5maWVsZFR5cGUgPz8gVGFibGV2aWV3VXRpbC50b0ZpZWxkSW5wdXRUeXBlRnJvbUNvbHVtblR5cGUoYXR0cmlidXRlLmNvbHVtblR5cGUsIGF0dHJpYnV0ZS5jb2x1bW5EaXNwbGF5VHlwZSksIC4uLmFyZ3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgbWV0aG9kIHRha2VzIGNhcmUgb2YgZGlzcGxheWluZyBjb3JyZWN0L2xvY2FsaXplZCBkYXRhIGluIHRoZSBlZGl0b3JcbiAgICAgKiBAcGFyYW0gbG9jYWxpemF0aW9uc1Byb3BlcnR5IHByb3BlcnR5IHRoYXQgdGVsbHMgdXMgd2hlcmUgb24gdGhlIG1vZGVsIGFyZSBsb2NhbGl6YXRpb25zIGFjY2Vzc2libGVcbiAgICAgKiBAcGFyYW0gbG9jYWxlUHJvcGVydHkgcHJvcGVydHkgYnkgd2hpY2ggd2UgZmluZCB0aGUgbG9jYWxlXG4gICAgICogQHBhcmFtIGxvY2FsaXphdGlvbk1vZGVsVHlwZSBtb2RlbCB0eXBlIGZvciBsb2NhbGl6YXRpb25zIGlmIGl0IGlzIGRpZmZlcmVudCBmcm9tIHRoZSB3aG9sZSBtb2RlbFxuICAgICAqIEBwYXJhbSBsb2NhbGVMb29rdXAgbG9va3VwIHByb3ZpZGVyIGZvciBsb2NhbGVzIHN1cHBvcnRlZCBieSB0aGUgYXBwbGljYXRpb24uXG4gICAgICovXG4gICAgcHVibGljIGxvY2FsaXplZDxTPihcbiAgICAgICAgbG9jYWxpemF0aW9uc1Byb3BlcnR5ID0gJ2xvY2FsaXphdGlvbnMnLFxuICAgICAgICBsb2NhbGVQcm9wZXJ0eSA9ICdsb2NhbGUnLFxuICAgICAgICBsb2NhbGl6YXRpb25Nb2RlbFR5cGU/OiBDbGFzc1R5cGU8YW55PixcbiAgICAgICAgbG9jYWxlTG9va3VwPzogKHF1ZXJ5UGFyYW0/OiBNZWRpdXNRdWVyeVBhcmFtLCBzZXJ2aWNlPzogUywgc2VhcmNoPzogc3RyaW5nKSA9PiBPYnNlcnZhYmxlPEFycmF5PHN0cmluZz4+XG4gICAgKTogdGhpcyB7XG4gICAgICAgIHRoaXMuX2xvY2FsaXphdGlvbkxvY2FsaXphdGlvblByb3BlcnR5ID0gbG9jYWxpemF0aW9uc1Byb3BlcnR5O1xuICAgICAgICB0aGlzLl9sb2NhbGl6YXRpb25Mb2NhbGVQcm9wZXJ0eSA9IGxvY2FsZVByb3BlcnR5O1xuICAgICAgICB0aGlzLl9pc0xvY2FsaXplZCA9IHRydWU7XG4gICAgICAgIHRoaXMuX2xvY2FsZUxvb2t1cCA9IGxvY2FsZUxvb2t1cDtcblxuICAgICAgICBpZiAobG9jYWxpemF0aW9uTW9kZWxUeXBlKSB7XG4gICAgICAgICAgICB0aGlzLl9sb2NhbGl6YXRpb25Nb2RlbFR5cGUgPSBsb2NhbGl6YXRpb25Nb2RlbFR5cGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9sb2NhbGl6YXRpb25Nb2RlbFR5cGUgPSB0aGlzLl9tb2RlbFR5cGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIG5leHRFdmVudCh0eXBlOiBNbmdGb3JtRXZlbnRUeXBlRW51bSwgY21wVHlwZTogVHlwZTxhbnk+LCBjbXBJbnN0YW5jZTogYW55LCBkYXRhPzogTW5nRmllbGRFdmVudERhdGE8VD4pIHtcbiAgICAgICAgdGhpcy5fZXZlbnRzU3ViamVjdC5uZXh0KG5ldyBNbmdGb3JtRXZlbnQodHlwZSwgY21wVHlwZSwgY21wSW5zdGFuY2UsIGRhdGEpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY29tcGxldGVFdmVudHMoKSB7XG4gICAgICAgIHRoaXMuX2V2ZW50c1N1YmplY3QuY29tcGxldGUoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGV2ZW50cyQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9ldmVudHNTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICAgIH1cbn1cbiJdfQ==