@mediusinc/mng-commons 0.20.0 → 0.21.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 (377) hide show
  1. package/assets/i18n/en.json +9 -2
  2. package/assets/i18n/sl.json +9 -2
  3. package/esm2020/lib/api/models/builders/query-param.builder.mjs +58 -58
  4. package/esm2020/lib/api/models/filter-match-type.model.mjs +24 -24
  5. package/esm2020/lib/api/models/filter-param.model.mjs +32 -32
  6. package/esm2020/lib/api/models/index.mjs +8 -8
  7. package/esm2020/lib/api/models/mappers.mjs +12 -12
  8. package/esm2020/lib/api/models/query-mode.model.mjs +17 -17
  9. package/esm2020/lib/api/models/query-param.model.mjs +67 -67
  10. package/esm2020/lib/api/models/query-result.model.mjs +23 -23
  11. package/esm2020/lib/api/models/serialization.model.mjs +1 -1
  12. package/esm2020/lib/api/services/api.abstract.service.mjs +57 -57
  13. package/esm2020/lib/api/services/crud-api.abstract.service.mjs +75 -68
  14. package/esm2020/lib/api/services/get-all-api.abstract.service.mjs +30 -23
  15. package/esm2020/lib/api/services/index.mjs +3 -3
  16. package/esm2020/lib/api/utils/index.mjs +2 -2
  17. package/esm2020/lib/api/utils/medius-rest.util.mjs +212 -212
  18. package/esm2020/lib/api/utils/object-serializer.util.mjs +247 -247
  19. package/esm2020/lib/components/action/action.component.mjs +225 -221
  20. package/esm2020/lib/components/action/editor/action-editor.component.mjs +303 -284
  21. package/esm2020/lib/components/action/index.mjs +5 -4
  22. package/esm2020/lib/components/action/localization/data-language-dropdown.component.mjs +45 -0
  23. package/esm2020/lib/components/action/models/action-component.model.mjs +2 -0
  24. package/esm2020/lib/components/action/models/action-confirmation-service.model.mjs +1 -1
  25. package/esm2020/lib/components/action/models/action-execution.model.mjs +249 -245
  26. package/esm2020/lib/components/action/models/index.mjs +5 -4
  27. package/esm2020/lib/components/action/models/tableview-action-default-categories.model.mjs +10 -10
  28. package/esm2020/lib/components/action/route/action-route.component.mjs +129 -129
  29. package/esm2020/lib/components/form/autocomplete/autocomplete.component.mjs +299 -299
  30. package/esm2020/lib/components/form/date-range/date-range.component.mjs +108 -108
  31. package/esm2020/lib/components/form/dropdown/dropdown.component.mjs +193 -193
  32. package/esm2020/lib/components/form/editor/form-editor.component.mjs +240 -219
  33. package/esm2020/lib/components/form/formly/fields/formly-field-action/formly-field-action.component.mjs +38 -38
  34. package/esm2020/lib/components/form/formly/fields/formly-field-autocomplete/formly-field-autocomplete.component.mjs +49 -49
  35. package/esm2020/lib/components/form/formly/fields/formly-field-dropdown/formly-field-dropdown.component.mjs +44 -44
  36. package/esm2020/lib/components/form/formly/fields/formly-field-fieldset/formly-field-fieldset.component.mjs +25 -25
  37. package/esm2020/lib/components/form/formly/fields/formly-field-input/formly-field-input.component.mjs +149 -149
  38. package/esm2020/lib/components/form/formly/fields/formly-field-label/formly-field-label.component.mjs +23 -23
  39. package/esm2020/lib/components/form/formly/fields/formly-field-lookup-dialog/formly-field-lookup-dialog.component.mjs +180 -180
  40. package/esm2020/lib/components/form/formly/fields/formly-field-table-dialog-form/formly-field-table-dialog-form.component.mjs +167 -167
  41. package/esm2020/lib/components/form/formly/fields/formly-field-table-dialog-multiselect/formly-field-table-dialog-multiselect.component.mjs +148 -148
  42. package/esm2020/lib/components/form/formly/fields/formly-field-tabs/formly-field-tabs.component.mjs +16 -16
  43. package/esm2020/lib/components/form/formly/fields/index.mjs +10 -10
  44. package/esm2020/lib/components/form/formly/formly.config.mjs +211 -211
  45. package/esm2020/lib/components/form/formly/index.mjs +1 -1
  46. package/esm2020/lib/components/form/formly/models/formly-config.model.mjs +1 -1
  47. package/esm2020/lib/components/form/formly/models/formly-field.model.mjs +1 -1
  48. package/esm2020/lib/components/form/formly/models/index.mjs +2 -2
  49. package/esm2020/lib/components/form/formly/wrappers/formly-field-no-label-wrapper/formly-field-no-label-wrapper.component.mjs +14 -14
  50. package/esm2020/lib/components/form/formly/wrappers/formly-field-wrapper/formly-field-wrapper.component.mjs +79 -15
  51. package/esm2020/lib/components/form/formly/wrappers/index.mjs +2 -2
  52. package/esm2020/lib/components/form/index.mjs +4 -4
  53. package/esm2020/lib/components/form/models/field-action-context.model.mjs +1 -1
  54. package/esm2020/lib/components/form/models/form-editor.event.mjs +33 -33
  55. package/esm2020/lib/components/form/models/form-editor.interface.mjs +1 -1
  56. package/esm2020/lib/components/form/models/index.mjs +2 -2
  57. package/esm2020/lib/components/layout/breadcrumb.component.mjs +16 -16
  58. package/esm2020/lib/components/layout/footer.component.mjs +16 -16
  59. package/esm2020/lib/components/layout/index.mjs +7 -7
  60. package/esm2020/lib/components/layout/main-layout.component.mjs +51 -51
  61. package/esm2020/lib/components/layout/menu-item.component.mjs +271 -271
  62. package/esm2020/lib/components/layout/menu.component.mjs +20 -20
  63. package/esm2020/lib/components/layout/services/index.mjs +1 -1
  64. package/esm2020/lib/components/layout/services/main-layout.component.service.mjs +194 -194
  65. package/esm2020/lib/components/layout/topbar.component.mjs +64 -64
  66. package/esm2020/lib/components/layout/version.component.mjs +57 -57
  67. package/esm2020/lib/components/tableview/index.mjs +6 -6
  68. package/esm2020/lib/components/tableview/models/index.mjs +1 -1
  69. package/esm2020/lib/components/tableview/models/table.event.mjs +15 -15
  70. package/esm2020/lib/components/tableview/route/tableview-route.abstract.component.mjs +122 -115
  71. package/esm2020/lib/components/tableview/route/tableview-route.component.mjs +52 -52
  72. package/esm2020/lib/components/tableview/table/column-filter/column-filter.component.mjs +119 -119
  73. package/esm2020/lib/components/tableview/table/column-value/column-value.component.mjs +84 -83
  74. package/esm2020/lib/components/tableview/table/table.component.mjs +604 -590
  75. package/esm2020/lib/components/tableview/tableview.component.mjs +112 -112
  76. package/esm2020/lib/data-providers/base.data-provider.mjs +16 -16
  77. package/esm2020/lib/data-providers/editor.data-provider.mjs +37 -37
  78. package/esm2020/lib/data-providers/index.mjs +6 -6
  79. package/esm2020/lib/data-providers/lookup.data-provider.mjs +15 -15
  80. package/esm2020/lib/data-providers/table.data-provider.mjs +38 -38
  81. package/esm2020/lib/data-providers/tableview-crud.data-provider.mjs +24 -24
  82. package/esm2020/lib/data-providers/tableview.data-provider.mjs +45 -59
  83. package/esm2020/lib/descriptors/action/action-confirmation.descriptor.mjs +76 -76
  84. package/esm2020/lib/descriptors/action-button.descriptor.mjs +59 -59
  85. package/esm2020/lib/descriptors/action.descriptor.mjs +555 -548
  86. package/esm2020/lib/descriptors/column.descriptor.mjs +405 -386
  87. package/esm2020/lib/descriptors/editor.descriptor.mjs +290 -251
  88. package/esm2020/lib/descriptors/field-validation.descriptor.mjs +24 -24
  89. package/esm2020/lib/descriptors/field.descriptor.mjs +979 -937
  90. package/esm2020/lib/descriptors/filter.descriptor.mjs +320 -320
  91. package/esm2020/lib/descriptors/index.mjs +11 -11
  92. package/esm2020/lib/descriptors/interfaces/field-config.interface.mjs +1 -1
  93. package/esm2020/lib/descriptors/interfaces/index.mjs +2 -2
  94. package/esm2020/lib/descriptors/interfaces/lookup-descriptor.interface.mjs +1 -1
  95. package/esm2020/lib/descriptors/model.descriptor.mjs +44 -44
  96. package/esm2020/lib/descriptors/table.descriptor.mjs +482 -464
  97. package/esm2020/lib/descriptors/tableview.descriptor.mjs +340 -324
  98. package/esm2020/lib/descriptors/types/action.type.mjs +25 -25
  99. package/esm2020/lib/descriptors/types/column.type.mjs +20 -20
  100. package/esm2020/lib/descriptors/types/editor.type.mjs +7 -7
  101. package/esm2020/lib/descriptors/types/field.type.mjs +54 -54
  102. package/esm2020/lib/descriptors/types/filter.type.mjs +30 -30
  103. package/esm2020/lib/descriptors/types/index.mjs +6 -6
  104. package/esm2020/lib/descriptors/types/table.type.mjs +26 -26
  105. package/esm2020/lib/directives/component.directive.mjs +44 -44
  106. package/esm2020/lib/directives/index.mjs +2 -2
  107. package/esm2020/lib/directives/template.directive.mjs +27 -27
  108. package/esm2020/lib/mng-commons.module.mjs +471 -468
  109. package/esm2020/lib/models/column-value.model.mjs +1 -1
  110. package/esm2020/lib/models/config.model.mjs +2 -2
  111. package/esm2020/lib/models/enum.model.mjs +1 -1
  112. package/esm2020/lib/models/error.model.mjs +1 -1
  113. package/esm2020/lib/models/index.mjs +9 -9
  114. package/esm2020/lib/models/menu.model.mjs +1 -1
  115. package/esm2020/lib/models/tableview-attr.model.mjs +1 -1
  116. package/esm2020/lib/models/user.model.mjs +1 -1
  117. package/esm2020/lib/models/version.model.mjs +1 -1
  118. package/esm2020/lib/models/view-container.model.mjs +1 -1
  119. package/esm2020/lib/pipes/boolean.pipe.mjs +26 -26
  120. package/esm2020/lib/pipes/class-map.pipe.mjs +21 -21
  121. package/esm2020/lib/pipes/enum.pipe.mjs +24 -24
  122. package/esm2020/lib/pipes/enumerate-async.pipe.mjs +37 -37
  123. package/esm2020/lib/pipes/enumerate.pipe.mjs +54 -54
  124. package/esm2020/lib/pipes/getter.pipe.mjs +19 -19
  125. package/esm2020/lib/pipes/i18n-property.pipe.mjs +17 -17
  126. package/esm2020/lib/pipes/index.mjs +10 -10
  127. package/esm2020/lib/pipes/json-path.pipe.mjs +78 -78
  128. package/esm2020/lib/pipes/models/internal/enumrate-pipe-i18n.model.mjs +1 -1
  129. package/esm2020/lib/pipes/models/internal/index.mjs +1 -1
  130. package/esm2020/lib/pipes/parametrize.pipe.mjs +84 -84
  131. package/esm2020/lib/pipes/template.pipe.mjs +23 -23
  132. package/esm2020/lib/router/index.mjs +2 -2
  133. package/esm2020/lib/router/models/index.mjs +1 -1
  134. package/esm2020/lib/router/models/router.model.mjs +1 -1
  135. package/esm2020/lib/router/route-builder.mjs +425 -425
  136. package/esm2020/lib/router/tableview-route-builder.mjs +186 -186
  137. package/esm2020/lib/security/authorization.guard.mjs +25 -25
  138. package/esm2020/lib/security/authorization.service.mjs +46 -46
  139. package/esm2020/lib/security/authorization.util.mjs +15 -15
  140. package/esm2020/lib/security/index.mjs +3 -3
  141. package/esm2020/lib/security/model/authorization.type.mjs +7 -7
  142. package/esm2020/lib/security/model/index.mjs +3 -3
  143. package/esm2020/lib/security/model/permission-service.interface.mjs +1 -1
  144. package/esm2020/lib/security/model/permissions.model.mjs +86 -86
  145. package/esm2020/lib/services/action-executor.service.mjs +552 -552
  146. package/esm2020/lib/services/commons.service.mjs +446 -420
  147. package/esm2020/lib/services/configuration.service.mjs +119 -119
  148. package/esm2020/lib/services/error-mapper.service.mjs +13 -13
  149. package/esm2020/lib/services/index.mjs +6 -6
  150. package/esm2020/lib/services/internal/commons-init.provider.mjs +3 -3
  151. package/esm2020/lib/services/internal/commons-init.service.mjs +43 -43
  152. package/esm2020/lib/services/internal/index.mjs +2 -2
  153. package/esm2020/lib/services/navigation.service.mjs +47 -47
  154. package/esm2020/lib/services/providers/config-service.provider.mjs +29 -29
  155. package/esm2020/lib/services/providers/formly-config.provider.mjs +30 -30
  156. package/esm2020/lib/services/providers/index.mjs +2 -2
  157. package/esm2020/lib/services/tokens/browser-storage.token.mjs +5 -5
  158. package/esm2020/lib/services/tokens/commons-init.token.mjs +2 -2
  159. package/esm2020/lib/services/tokens/default-setting.token.mjs +2 -2
  160. package/esm2020/lib/services/tokens/index.mjs +4 -4
  161. package/esm2020/lib/services/tokens/module-config.token.mjs +2 -2
  162. package/esm2020/lib/services/version.service.mjs +38 -38
  163. package/esm2020/lib/services/view-container.component.service.mjs +54 -54
  164. package/esm2020/lib/styles/button-style.builder.mjs +164 -164
  165. package/esm2020/lib/styles/index.mjs +2 -2
  166. package/esm2020/lib/styles/models/index.mjs +2 -2
  167. package/esm2020/lib/styles/models/style-level.enum.mjs +11 -11
  168. package/esm2020/lib/styles/models/style-size.enum.mjs +8 -8
  169. package/esm2020/lib/styles/styles.util.mjs +41 -41
  170. package/esm2020/lib/types/index.mjs +2 -2
  171. package/esm2020/lib/types/type.decorator.mjs +21 -21
  172. package/esm2020/lib/types/type.model.mjs +1 -1
  173. package/esm2020/lib/utils/action-data-provider.util.mjs +145 -145
  174. package/esm2020/lib/utils/date.util.mjs +117 -117
  175. package/esm2020/lib/utils/editor-formly.util.mjs +277 -268
  176. package/esm2020/lib/utils/enum.util.mjs +81 -81
  177. package/esm2020/lib/utils/i18n.util.mjs +232 -232
  178. package/esm2020/lib/utils/index.mjs +9 -9
  179. package/esm2020/lib/utils/model.util.mjs +68 -68
  180. package/esm2020/lib/utils/notification.util.mjs +45 -45
  181. package/esm2020/lib/utils/route.util.mjs +23 -23
  182. package/esm2020/lib/utils/string.util.mjs +26 -26
  183. package/esm2020/lib/utils/tableview.util.mjs +159 -159
  184. package/esm2020/lib/utils/type.util.mjs +92 -92
  185. package/esm2020/mediusinc-mng-commons.mjs +4 -4
  186. package/esm2020/public-api.mjs +54 -54
  187. package/fesm2015/mediusinc-mng-commons.mjs +13513 -13172
  188. package/fesm2015/mediusinc-mng-commons.mjs.map +1 -1
  189. package/fesm2020/mediusinc-mng-commons.mjs +13352 -13016
  190. package/fesm2020/mediusinc-mng-commons.mjs.map +1 -1
  191. package/index.d.ts +5 -5
  192. package/lib/api/models/builders/query-param.builder.d.ts +13 -13
  193. package/lib/api/models/filter-match-type.model.d.ts +23 -23
  194. package/lib/api/models/filter-param.model.d.ts +23 -23
  195. package/lib/api/models/index.d.ts +8 -8
  196. package/lib/api/models/mappers.d.ts +6 -6
  197. package/lib/api/models/query-mode.model.d.ts +16 -16
  198. package/lib/api/models/query-param.model.d.ts +31 -31
  199. package/lib/api/models/query-result.model.d.ts +24 -24
  200. package/lib/api/models/serialization.model.d.ts +8 -8
  201. package/lib/api/services/api.abstract.service.d.ts +24 -24
  202. package/lib/api/services/crud-api.abstract.service.d.ts +22 -22
  203. package/lib/api/services/get-all-api.abstract.service.d.ts +14 -14
  204. package/lib/api/services/index.d.ts +3 -3
  205. package/lib/api/utils/index.d.ts +2 -2
  206. package/lib/api/utils/medius-rest.util.d.ts +16 -16
  207. package/lib/api/utils/object-serializer.util.d.ts +33 -33
  208. package/lib/components/action/action.component.d.ts +74 -72
  209. package/lib/components/action/editor/action-editor.component.d.ts +69 -69
  210. package/lib/components/action/index.d.ts +4 -3
  211. package/lib/components/action/localization/data-language-dropdown.component.d.ts +25 -0
  212. package/lib/components/action/models/action-component.model.d.ts +15 -0
  213. package/lib/components/action/models/action-confirmation-service.model.d.ts +6 -6
  214. package/lib/components/action/models/action-execution.model.d.ts +135 -133
  215. package/lib/components/action/models/index.d.ts +4 -3
  216. package/lib/components/action/models/tableview-action-default-categories.model.d.ts +10 -10
  217. package/lib/components/action/route/action-route.component.d.ts +31 -31
  218. package/lib/components/form/autocomplete/autocomplete.component.d.ts +61 -61
  219. package/lib/components/form/date-range/date-range.component.d.ts +28 -28
  220. package/lib/components/form/dropdown/dropdown.component.d.ts +52 -52
  221. package/lib/components/form/editor/form-editor.component.d.ts +50 -45
  222. package/lib/components/form/formly/fields/formly-field-action/formly-field-action.component.d.ts +13 -13
  223. package/lib/components/form/formly/fields/formly-field-autocomplete/formly-field-autocomplete.component.d.ts +16 -16
  224. package/lib/components/form/formly/fields/formly-field-dropdown/formly-field-dropdown.component.d.ts +15 -15
  225. package/lib/components/form/formly/fields/formly-field-fieldset/formly-field-fieldset.component.d.ts +14 -14
  226. package/lib/components/form/formly/fields/formly-field-input/formly-field-input.component.d.ts +29 -29
  227. package/lib/components/form/formly/fields/formly-field-label/formly-field-label.component.d.ts +11 -11
  228. package/lib/components/form/formly/fields/formly-field-lookup-dialog/formly-field-lookup-dialog.component.d.ts +46 -46
  229. package/lib/components/form/formly/fields/formly-field-table-dialog-form/formly-field-table-dialog-form.component.d.ts +21 -21
  230. package/lib/components/form/formly/fields/formly-field-table-dialog-multiselect/formly-field-table-dialog-multiselect.component.d.ts +37 -37
  231. package/lib/components/form/formly/fields/formly-field-tabs/formly-field-tabs.component.d.ts +7 -7
  232. package/lib/components/form/formly/fields/index.d.ts +10 -10
  233. package/lib/components/form/formly/formly.config.d.ts +14 -14
  234. package/lib/components/form/formly/index.d.ts +1 -1
  235. package/lib/components/form/formly/models/formly-config.model.d.ts +11 -11
  236. package/lib/components/form/formly/models/formly-field.model.d.ts +16 -16
  237. package/lib/components/form/formly/models/index.d.ts +2 -2
  238. package/lib/components/form/formly/wrappers/formly-field-no-label-wrapper/formly-field-no-label-wrapper.component.d.ts +6 -6
  239. package/lib/components/form/formly/wrappers/formly-field-wrapper/formly-field-wrapper.component.d.ts +11 -6
  240. package/lib/components/form/formly/wrappers/index.d.ts +2 -2
  241. package/lib/components/form/index.d.ts +4 -4
  242. package/lib/components/form/models/field-action-context.model.d.ts +17 -17
  243. package/lib/components/form/models/form-editor.event.d.ts +37 -37
  244. package/lib/components/form/models/form-editor.interface.d.ts +10 -10
  245. package/lib/components/form/models/index.d.ts +2 -2
  246. package/lib/components/layout/breadcrumb.component.d.ts +8 -8
  247. package/lib/components/layout/footer.component.d.ts +9 -9
  248. package/lib/components/layout/index.d.ts +7 -7
  249. package/lib/components/layout/main-layout.component.d.ts +20 -20
  250. package/lib/components/layout/menu-item.component.d.ts +52 -52
  251. package/lib/components/layout/menu.component.d.ts +10 -10
  252. package/lib/components/layout/services/index.d.ts +1 -1
  253. package/lib/components/layout/services/main-layout.component.service.d.ts +65 -65
  254. package/lib/components/layout/topbar.component.d.ts +28 -28
  255. package/lib/components/layout/version.component.d.ts +19 -19
  256. package/lib/components/tableview/index.d.ts +6 -6
  257. package/lib/components/tableview/models/index.d.ts +1 -1
  258. package/lib/components/tableview/models/table.event.d.ts +17 -17
  259. package/lib/components/tableview/route/tableview-route.abstract.component.d.ts +29 -28
  260. package/lib/components/tableview/route/tableview-route.component.d.ts +18 -18
  261. package/lib/components/tableview/table/column-filter/column-filter.component.d.ts +38 -38
  262. package/lib/components/tableview/table/column-value/column-value.component.d.ts +35 -35
  263. package/lib/components/tableview/table/table.component.d.ts +116 -114
  264. package/lib/components/tableview/tableview.component.d.ts +48 -48
  265. package/lib/data-providers/base.data-provider.d.ts +14 -14
  266. package/lib/data-providers/editor.data-provider.d.ts +25 -25
  267. package/lib/data-providers/index.d.ts +6 -6
  268. package/lib/data-providers/lookup.data-provider.d.ts +14 -14
  269. package/lib/data-providers/table.data-provider.d.ts +27 -27
  270. package/lib/data-providers/tableview-crud.data-provider.d.ts +8 -8
  271. package/lib/data-providers/tableview.data-provider.d.ts +33 -37
  272. package/lib/descriptors/action/action-confirmation.descriptor.d.ts +36 -36
  273. package/lib/descriptors/action-button.descriptor.d.ts +22 -22
  274. package/lib/descriptors/action.descriptor.d.ts +216 -212
  275. package/lib/descriptors/column.descriptor.d.ts +130 -125
  276. package/lib/descriptors/editor.descriptor.d.ts +116 -95
  277. package/lib/descriptors/field-validation.descriptor.d.ts +19 -19
  278. package/lib/descriptors/field.descriptor.d.ts +342 -332
  279. package/lib/descriptors/filter.descriptor.d.ts +112 -112
  280. package/lib/descriptors/index.d.ts +11 -11
  281. package/lib/descriptors/interfaces/field-config.interface.d.ts +9 -9
  282. package/lib/descriptors/interfaces/index.d.ts +2 -2
  283. package/lib/descriptors/interfaces/lookup-descriptor.interface.d.ts +17 -17
  284. package/lib/descriptors/model.descriptor.d.ts +18 -18
  285. package/lib/descriptors/table.descriptor.d.ts +188 -182
  286. package/lib/descriptors/tableview.descriptor.d.ts +129 -122
  287. package/lib/descriptors/types/action.type.d.ts +21 -21
  288. package/lib/descriptors/types/column.type.d.ts +18 -18
  289. package/lib/descriptors/types/editor.type.d.ts +6 -6
  290. package/lib/descriptors/types/field.type.d.ts +46 -46
  291. package/lib/descriptors/types/filter.type.d.ts +27 -27
  292. package/lib/descriptors/types/index.d.ts +6 -6
  293. package/lib/descriptors/types/table.type.d.ts +22 -22
  294. package/lib/directives/component.directive.d.ts +16 -16
  295. package/lib/directives/index.d.ts +2 -2
  296. package/lib/directives/template.directive.d.ts +13 -13
  297. package/lib/mng-commons.module.d.ts +96 -95
  298. package/lib/models/column-value.model.d.ts +4 -4
  299. package/lib/models/config.model.d.ts +40 -39
  300. package/lib/models/enum.model.d.ts +6 -6
  301. package/lib/models/error.model.d.ts +14 -14
  302. package/lib/models/index.d.ts +9 -9
  303. package/lib/models/menu.model.d.ts +30 -30
  304. package/lib/models/tableview-attr.model.d.ts +10 -10
  305. package/lib/models/user.model.d.ts +8 -8
  306. package/lib/models/version.model.d.ts +18 -18
  307. package/lib/models/view-container.model.d.ts +43 -43
  308. package/lib/pipes/boolean.pipe.d.ts +7 -7
  309. package/lib/pipes/class-map.pipe.d.ts +7 -7
  310. package/lib/pipes/enum.pipe.d.ts +8 -8
  311. package/lib/pipes/enumerate-async.pipe.d.ts +14 -14
  312. package/lib/pipes/enumerate.pipe.d.ts +21 -21
  313. package/lib/pipes/getter.pipe.d.ts +7 -7
  314. package/lib/pipes/i18n-property.pipe.d.ts +8 -8
  315. package/lib/pipes/index.d.ts +10 -10
  316. package/lib/pipes/json-path.pipe.d.ts +13 -13
  317. package/lib/pipes/models/internal/enumrate-pipe-i18n.model.d.ts +5 -5
  318. package/lib/pipes/models/internal/index.d.ts +1 -1
  319. package/lib/pipes/parametrize.pipe.d.ts +13 -13
  320. package/lib/pipes/template.pipe.d.ts +10 -10
  321. package/lib/router/index.d.ts +2 -2
  322. package/lib/router/models/index.d.ts +1 -1
  323. package/lib/router/models/router.model.d.ts +33 -33
  324. package/lib/router/route-builder.d.ts +98 -98
  325. package/lib/router/tableview-route-builder.d.ts +37 -37
  326. package/lib/security/authorization.guard.d.ts +11 -11
  327. package/lib/security/authorization.service.d.ts +19 -19
  328. package/lib/security/authorization.util.d.ts +5 -5
  329. package/lib/security/index.d.ts +3 -3
  330. package/lib/security/model/authorization.type.d.ts +6 -6
  331. package/lib/security/model/index.d.ts +3 -3
  332. package/lib/security/model/permission-service.interface.d.ts +6 -6
  333. package/lib/security/model/permissions.model.d.ts +37 -37
  334. package/lib/services/action-executor.service.d.ts +149 -149
  335. package/lib/services/commons.service.d.ts +89 -84
  336. package/lib/services/configuration.service.d.ts +45 -45
  337. package/lib/services/error-mapper.service.d.ts +7 -7
  338. package/lib/services/index.d.ts +6 -6
  339. package/lib/services/internal/commons-init.provider.d.ts +3 -3
  340. package/lib/services/internal/commons-init.service.d.ts +16 -16
  341. package/lib/services/internal/index.d.ts +2 -2
  342. package/lib/services/navigation.service.d.ts +14 -14
  343. package/lib/services/providers/config-service.provider.d.ts +6 -6
  344. package/lib/services/providers/formly-config.provider.d.ts +4 -4
  345. package/lib/services/providers/index.d.ts +2 -2
  346. package/lib/services/tokens/browser-storage.token.d.ts +2 -2
  347. package/lib/services/tokens/commons-init.token.d.ts +3 -3
  348. package/lib/services/tokens/default-setting.token.d.ts +2 -2
  349. package/lib/services/tokens/index.d.ts +4 -4
  350. package/lib/services/tokens/module-config.token.d.ts +3 -3
  351. package/lib/services/version.service.d.ts +13 -13
  352. package/lib/services/view-container.component.service.d.ts +31 -31
  353. package/lib/styles/button-style.builder.d.ts +67 -67
  354. package/lib/styles/index.d.ts +2 -2
  355. package/lib/styles/models/index.d.ts +2 -2
  356. package/lib/styles/models/style-level.enum.d.ts +10 -10
  357. package/lib/styles/models/style-size.enum.d.ts +7 -7
  358. package/lib/styles/styles.util.d.ts +14 -14
  359. package/lib/types/index.d.ts +2 -2
  360. package/lib/types/type.decorator.d.ts +4 -4
  361. package/lib/types/type.model.d.ts +23 -23
  362. package/lib/utils/action-data-provider.util.d.ts +20 -20
  363. package/lib/utils/date.util.d.ts +7 -7
  364. package/lib/utils/editor-formly.util.d.ts +12 -12
  365. package/lib/utils/enum.util.d.ts +50 -50
  366. package/lib/utils/i18n.util.d.ts +56 -56
  367. package/lib/utils/index.d.ts +9 -9
  368. package/lib/utils/model.util.d.ts +8 -8
  369. package/lib/utils/notification.util.d.ts +11 -11
  370. package/lib/utils/route.util.d.ts +4 -4
  371. package/lib/utils/string.util.d.ts +4 -4
  372. package/lib/utils/tableview.util.d.ts +40 -40
  373. package/lib/utils/type.util.d.ts +57 -57
  374. package/mediusinc-mng-commons-0.21.0-rc.1.tgz +0 -0
  375. package/package.json +1 -1
  376. package/public-api.d.ts +34 -34
  377. package/version-info.json +7 -7
@@ -1,272 +1,272 @@
1
- import { animate, state, style, transition, trigger } from '@angular/animations';
2
- import { Component, EventEmitter, HostBinding, Input, Output } from '@angular/core';
3
- import { GuardsCheckEnd, NavigationEnd } from '@angular/router';
4
- import { BehaviorSubject, Observable, combineLatest, distinctUntilChanged, from, of } from 'rxjs';
5
- import { first, map } from 'rxjs/operators';
6
- import * as i0 from "@angular/core";
7
- import * as i1 from "@angular/router";
8
- import * as i2 from "../../security";
9
- import * as i3 from "../../services";
10
- import * as i4 from "./services";
11
- import * as i5 from "@angular/common";
12
- import * as i6 from "primeng/ripple";
13
- import * as i7 from "@ngx-translate/core";
14
- export class MngMenuItemComponent {
15
- constructor(injector, router, route, authorization, mngCommons, mainLayoutService) {
16
- this.injector = injector;
17
- this.router = router;
18
- this.route = route;
19
- this.authorization = authorization;
20
- this.mngCommons = mngCommons;
21
- this.mainLayoutService = mainLayoutService;
22
- this.index = 0;
23
- this.root = false;
24
- this.parentKey = null;
25
- this.visibleChangeEventEmitter = new EventEmitter();
26
- this.hostClassNoPadding = false;
27
- this.hostClassChildrenHidden = false;
28
- this.key = '';
29
- this.active = false;
30
- this.hover = false;
31
- this.guardsIsAllowedSubject = new BehaviorSubject(true);
32
- this.isPermittedSubject = new BehaviorSubject(true);
33
- this.isVisibleSubject = new BehaviorSubject(true);
34
- this.childrenVisibilitySubject = [];
35
- this.guardsIsAllowed$ = this.guardsIsAllowedSubject.asObservable().pipe(distinctUntilChanged());
36
- this.isPermitted$ = this.isPermittedSubject.asObservable().pipe(distinctUntilChanged());
37
- this.isVisible$ = this.isVisibleSubject.asObservable().pipe(distinctUntilChanged());
38
- }
39
- ngOnInit() {
40
- this.key = this.parentKey ? this.parentKey + '-' + this.index : String(this.index);
41
- if (this.item.routerLink) {
42
- if (typeof this.item.routerLink === 'string') {
43
- this.itemUrl = this.item.routerLink;
44
- }
45
- else {
46
- this.itemUrl = this.router.parseUrl(this.item.routerLink.join('/'));
47
- }
48
- }
49
- if (!this.mngCommons.menuModeIsSlim && this.item.routerLink) {
50
- this.updateActiveStateFromRoute();
51
- }
52
- this.menuSourceSubscription = this.mngCommons.menuActiveKey$.subscribe(key => {
53
- // deactivate current active menu
54
- if (this.active && this.key !== key && key.indexOf(this.key) !== 0) {
55
- this.active = false;
56
- }
57
- });
58
- this.menuResetSubscription = this.mngCommons.menuReset$.subscribe(() => {
59
- this.active = false;
60
- });
61
- this.routerEventsSubscription = this.router.events.subscribe(next => {
62
- if (next instanceof GuardsCheckEnd && next.shouldActivate) {
63
- this.checkIfMenuItemIsAllowedFromGuard(next.state);
64
- }
65
- else if (next instanceof NavigationEnd) {
66
- if (this.mngCommons.menuModeIsSlim && !this.mainLayoutService.isMobile()) {
67
- this.active = false;
68
- }
69
- else {
70
- this.updateActiveStateFromRoute();
71
- }
72
- }
73
- });
74
- if (this.item.permissions) {
75
- this.isPermittedSubscription = this.authorization.isPermitted(this.item.permissions).subscribe({
76
- next: isPermitted => {
77
- this.isPermittedSubject.next(isPermitted);
78
- }
79
- });
80
- }
81
- this.checkIfMenuItemIsAllowedFromGuard(this.router.routerState.snapshot);
82
- this.isVisibleCombinedSubscription = combineLatest([of(this.item.visible !== false), this.isPermitted$, this.guardsIsAllowed$]).subscribe({
83
- next: res => {
84
- const isVisible = res.every(r => r === true);
85
- this.hostClassNoPadding = !isVisible;
86
- this.isVisibleSubject.next(isVisible);
87
- }
88
- });
89
- this.isVisibleSubscription = this.isVisible$.subscribe(v => {
90
- this.visibleChangeEventEmitter.emit(v);
91
- });
92
- if (this.item.items) {
93
- this.childrenVisibilitySubject = this.item.items.map(() => new BehaviorSubject(true));
94
- this.areChildrenVisibleSubscription = combineLatest(this.childrenVisibilitySubject.map(s => s.asObservable().pipe(distinctUntilChanged()))).subscribe(visible => {
95
- const anyChildVisible = visible.some(v => v === true);
96
- this.hostClassChildrenHidden = !anyChildVisible;
97
- });
98
- }
99
- }
100
- updateActiveStateFromRoute() {
101
- if (this.itemUrl) {
102
- this.active = this.router.isActive(this.itemUrl, {
103
- matrixParams: 'ignored',
104
- queryParams: 'ignored',
105
- paths: this.item.items ? 'subset' : 'exact',
106
- fragment: 'ignored'
107
- });
108
- }
109
- else {
110
- this.active = false;
111
- }
112
- }
113
- itemClick(event) {
114
- // avoid processing disabled items
115
- if (this.item.disabled) {
116
- event.preventDefault();
117
- return;
118
- }
119
- // navigate with hover in horizontal mode
120
- if (this.root) {
121
- this.mainLayoutService.menuHoverActive = !this.mainLayoutService.menuHoverActive;
122
- }
123
- // notify other items
124
- this.mngCommons.menuChangeActiveKey(this.key);
125
- // toggle active state
126
- if (this.item.items) {
127
- this.active = !this.active;
128
- }
129
- else {
130
- // activate item
131
- this.active = true;
132
- if (this.mainLayoutService.isMobile()) {
133
- this.mainLayoutService.staticMenuMobileActive = false;
134
- }
135
- if (this.mngCommons.menuModeIsOverlay) {
136
- this.mainLayoutService.overlayMenuActive = false;
137
- }
138
- // reset horizontal menu
139
- if (this.mngCommons.menuModeIsSlim && !this.mainLayoutService.isMobile()) {
140
- this.mngCommons.menuReset();
141
- this.mainLayoutService.menuHoverActive = false;
142
- }
143
- }
144
- }
145
- onMouseEnter() {
146
- // activate item on hover
147
- if (this.root && this.mainLayoutService.menuHoverActive && this.mngCommons.menuModeIsSlim && this.mainLayoutService.isDesktop()) {
148
- this.mngCommons.menuChangeActiveKey(this.key);
149
- this.active = true;
150
- }
151
- }
152
- ngOnDestroy() {
153
- this.menuSourceSubscription?.unsubscribe();
154
- this.menuResetSubscription?.unsubscribe();
155
- this.routerEventsSubscription?.unsubscribe();
156
- this.guardsIsAllowedSubscription?.unsubscribe();
157
- this.isPermittedSubscription?.unsubscribe();
158
- this.isVisibleSubscription?.unsubscribe();
159
- this.isVisibleCombinedSubscription?.unsubscribe();
160
- this.areChildrenVisibleSubscription?.unsubscribe();
161
- }
162
- onChildVisibleChange(visible, item, idx) {
163
- this.childrenVisibilitySubject[idx].next(visible);
164
- }
165
- checkIfMenuItemIsAllowedFromGuard(routerState) {
166
- this.guardsIsAllowedSubscription?.unsubscribe();
167
- if (this.item.guards?.length) {
168
- const obs = [];
169
- for (const guard of this.item.guards) {
170
- const tokenInjectedInstance = this.injector.get(guard);
171
- if (tokenInjectedInstance && 'canActivate' in tokenInjectedInstance) {
172
- const guardInstance = tokenInjectedInstance;
173
- const canActivateRes = guardInstance.canActivate(this.route.snapshot, routerState);
174
- let canActivateObs;
175
- if (canActivateRes instanceof Observable) {
176
- canActivateObs = canActivateRes;
177
- }
178
- else if (canActivateRes instanceof Promise) {
179
- canActivateObs = from(canActivateRes);
180
- }
181
- else {
182
- canActivateObs = of(canActivateRes);
183
- }
184
- obs.push(canActivateObs.pipe(first(), map(res => res === true) // if url tree is present, that means redirect and implies not allowed
185
- ));
186
- }
187
- }
188
- this.guardsIsAllowedSubscription = combineLatest(obs)
189
- .pipe(first())
190
- .subscribe(next => {
191
- const result = next.every(n => n === true);
192
- this.guardsIsAllowedSubject.next(result);
193
- });
194
- }
195
- else {
196
- this.guardsIsAllowedSubject.next(true);
197
- }
198
- }
199
- }
200
- MngMenuItemComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: MngMenuItemComponent, deps: [{ token: i0.Injector }, { token: i1.Router }, { token: i1.ActivatedRoute }, { token: i2.MngAuthorizationService }, { token: i3.MngCommonsService }, { token: i4.MngMainLayoutComponentService }], target: i0.ɵɵFactoryTarget.Component });
201
- MngMenuItemComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.1.0", type: MngMenuItemComponent, selector: "[mng-menuitem]", inputs: { item: "item", index: "index", root: "root", parentKey: "parentKey" }, outputs: { visibleChangeEventEmitter: "visibleChange" }, host: { properties: { "class.layout-root-menuitem": "root", "class.active-menuitem": "active", "class.py-0": "this.hostClassNoPadding", "class.hidden": "this.hostClassChildrenHidden" } }, ngImport: i0, template: "<ng-container *ngIf=\"isVisible$ | async\">\n <div *ngIf=\"root\" class=\"layout-menuitem-root-text\">\n {{ item.label! | translate }}\n </div>\n <a\n *ngIf=\"!item.routerLink || item.items\"\n [attr.href]=\"item.href\"\n (click)=\"itemClick($event)\"\n (mouseenter)=\"onMouseEnter()\"\n (keydown.enter)=\"itemClick($event)\"\n [routerLink]=\"item.routerLink\"\n [attr.target]=\"item.target\"\n [attr.tabindex]=\"0\"\n [ngClass]=\"item.className ?? ''\"\n pRipple>\n <i [ngClass]=\"item.icon ?? ''\" class=\"layout-menuitem-icon\"></i>\n <span class=\"layout-menuitem-text\">{{ item.label! | translate }}</span>\n <i class=\"pi pi-fw pi-angle-down layout-submenu-toggler\" *ngIf=\"item.items\"></i>\n <span class=\"menuitem-badge\" *ngIf=\"item.badge\">{{ item.badge }}</span>\n </a>\n <a\n *ngIf=\"item.routerLink && !item.items\"\n (click)=\"itemClick($event)\"\n (mouseenter)=\"hover = true\"\n (mouseleave)=\"hover = false\"\n [routerLink]=\"item.routerLink\"\n routerLinkActive=\"active-menuitem-routerlink\"\n [routerLinkActiveOptions]=\"{paths: 'exact', matrixParams: 'ignored', queryParams: 'ignored', fragment: 'ignored'}\"\n [attr.target]=\"item.target\"\n [attr.tabindex]=\"0\"\n [ngClass]=\"item.className ?? ''\"\n pRipple>\n <i [ngClass]=\"item.icon ?? ''\" class=\"layout-menuitem-icon\"></i>\n <span class=\"layout-menuitem-text\">{{ item.label! | translate }}</span>\n <i class=\"pi pi-fw pi-angle-down layout-submenu-toggler\" *ngIf=\"item.items\"></i>\n <span class=\"menuitem-badge\" *ngIf=\"item.badge\">{{ item.badge }}</span>\n </a>\n <ul\n *ngIf=\"item.items || (item.items && (mngCommons.menuModeIsStatic$ | async) && root)\"\n [@children]=\"\n (mngCommons.menuModeIsSlim$ | async) && (mainLayoutService.isMobile$ | async) === false && root\n ? active\n ? 'visible'\n : 'hidden'\n : (mngCommons.menuModeIsStatic$ | async) && root && (mainLayoutService.isMobile$ | async) === false\n ? 'visible'\n : active\n ? 'visibleAnimated'\n : 'hiddenAnimated'\n \">\n <ng-template ngFor let-child let-i=\"index\" [ngForOf]=\"item.items\">\n <li mng-menuitem [item]=\"child\" [index]=\"i\" [parentKey]=\"key\" [class]=\"child.badgeClassName\" (visibleChange)=\"onChildVisibleChange($event, item, i)\"></li>\n </ng-template>\n </ul>\n</ng-container>\n", dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.RouterLinkWithHref, selector: "a[routerLink],area[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "preserveFragment", "skipLocationChange", "replaceUrl", "state", "relativeTo", "routerLink"] }, { kind: "directive", type: i1.RouterLinkActive, selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "ariaCurrentWhenActive", "routerLinkActive"], outputs: ["isActiveChange"], exportAs: ["routerLinkActive"] }, { kind: "directive", type: i6.Ripple, selector: "[pRipple]" }, { kind: "component", type: MngMenuItemComponent, selector: "[mng-menuitem]", inputs: ["item", "index", "root", "parentKey"], outputs: ["visibleChange"] }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }, { kind: "pipe", type: i7.TranslatePipe, name: "translate" }], animations: [
202
- trigger('children', [
203
- state('void', style({
204
- height: '0px'
205
- })),
206
- state('hiddenAnimated', style({
207
- height: '0px'
208
- })),
209
- state('visibleAnimated', style({
210
- height: '*'
211
- })),
212
- state('visible', style({
213
- height: '*',
214
- 'z-index': 100
215
- })),
216
- state('hidden', style({
217
- height: '0px',
218
- 'z-index': '*'
219
- })),
220
- transition('visibleAnimated => hiddenAnimated', animate('400ms cubic-bezier(0.86, 0, 0.07, 1)')),
221
- transition('hiddenAnimated => visibleAnimated', animate('400ms cubic-bezier(0.86, 0, 0.07, 1)')),
222
- transition('void => visibleAnimated, visibleAnimated => void', animate('400ms cubic-bezier(0.86, 0, 0.07, 1)'))
223
- ])
224
- ] });
225
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: MngMenuItemComponent, decorators: [{
226
- type: Component,
227
- args: [{ selector: '[mng-menuitem]', host: {
228
- '[class.layout-root-menuitem]': 'root',
229
- '[class.active-menuitem]': 'active'
230
- }, animations: [
231
- trigger('children', [
232
- state('void', style({
233
- height: '0px'
234
- })),
235
- state('hiddenAnimated', style({
236
- height: '0px'
237
- })),
238
- state('visibleAnimated', style({
239
- height: '*'
240
- })),
241
- state('visible', style({
242
- height: '*',
243
- 'z-index': 100
244
- })),
245
- state('hidden', style({
246
- height: '0px',
247
- 'z-index': '*'
248
- })),
249
- transition('visibleAnimated => hiddenAnimated', animate('400ms cubic-bezier(0.86, 0, 0.07, 1)')),
250
- transition('hiddenAnimated => visibleAnimated', animate('400ms cubic-bezier(0.86, 0, 0.07, 1)')),
251
- transition('void => visibleAnimated, visibleAnimated => void', animate('400ms cubic-bezier(0.86, 0, 0.07, 1)'))
252
- ])
253
- ], template: "<ng-container *ngIf=\"isVisible$ | async\">\n <div *ngIf=\"root\" class=\"layout-menuitem-root-text\">\n {{ item.label! | translate }}\n </div>\n <a\n *ngIf=\"!item.routerLink || item.items\"\n [attr.href]=\"item.href\"\n (click)=\"itemClick($event)\"\n (mouseenter)=\"onMouseEnter()\"\n (keydown.enter)=\"itemClick($event)\"\n [routerLink]=\"item.routerLink\"\n [attr.target]=\"item.target\"\n [attr.tabindex]=\"0\"\n [ngClass]=\"item.className ?? ''\"\n pRipple>\n <i [ngClass]=\"item.icon ?? ''\" class=\"layout-menuitem-icon\"></i>\n <span class=\"layout-menuitem-text\">{{ item.label! | translate }}</span>\n <i class=\"pi pi-fw pi-angle-down layout-submenu-toggler\" *ngIf=\"item.items\"></i>\n <span class=\"menuitem-badge\" *ngIf=\"item.badge\">{{ item.badge }}</span>\n </a>\n <a\n *ngIf=\"item.routerLink && !item.items\"\n (click)=\"itemClick($event)\"\n (mouseenter)=\"hover = true\"\n (mouseleave)=\"hover = false\"\n [routerLink]=\"item.routerLink\"\n routerLinkActive=\"active-menuitem-routerlink\"\n [routerLinkActiveOptions]=\"{paths: 'exact', matrixParams: 'ignored', queryParams: 'ignored', fragment: 'ignored'}\"\n [attr.target]=\"item.target\"\n [attr.tabindex]=\"0\"\n [ngClass]=\"item.className ?? ''\"\n pRipple>\n <i [ngClass]=\"item.icon ?? ''\" class=\"layout-menuitem-icon\"></i>\n <span class=\"layout-menuitem-text\">{{ item.label! | translate }}</span>\n <i class=\"pi pi-fw pi-angle-down layout-submenu-toggler\" *ngIf=\"item.items\"></i>\n <span class=\"menuitem-badge\" *ngIf=\"item.badge\">{{ item.badge }}</span>\n </a>\n <ul\n *ngIf=\"item.items || (item.items && (mngCommons.menuModeIsStatic$ | async) && root)\"\n [@children]=\"\n (mngCommons.menuModeIsSlim$ | async) && (mainLayoutService.isMobile$ | async) === false && root\n ? active\n ? 'visible'\n : 'hidden'\n : (mngCommons.menuModeIsStatic$ | async) && root && (mainLayoutService.isMobile$ | async) === false\n ? 'visible'\n : active\n ? 'visibleAnimated'\n : 'hiddenAnimated'\n \">\n <ng-template ngFor let-child let-i=\"index\" [ngForOf]=\"item.items\">\n <li mng-menuitem [item]=\"child\" [index]=\"i\" [parentKey]=\"key\" [class]=\"child.badgeClassName\" (visibleChange)=\"onChildVisibleChange($event, item, i)\"></li>\n </ng-template>\n </ul>\n</ng-container>\n" }]
254
- }], ctorParameters: function () { return [{ type: i0.Injector }, { type: i1.Router }, { type: i1.ActivatedRoute }, { type: i2.MngAuthorizationService }, { type: i3.MngCommonsService }, { type: i4.MngMainLayoutComponentService }]; }, propDecorators: { item: [{
255
- type: Input
256
- }], index: [{
257
- type: Input
258
- }], root: [{
259
- type: Input
260
- }], parentKey: [{
261
- type: Input
262
- }], visibleChangeEventEmitter: [{
263
- type: Output,
264
- args: ['visibleChange']
265
- }], hostClassNoPadding: [{
266
- type: HostBinding,
267
- args: ['class.py-0']
268
- }], hostClassChildrenHidden: [{
269
- type: HostBinding,
270
- args: ['class.hidden']
271
- }] } });
1
+ import { animate, state, style, transition, trigger } from '@angular/animations';
2
+ import { Component, EventEmitter, HostBinding, Input, Output } from '@angular/core';
3
+ import { GuardsCheckEnd, NavigationEnd } from '@angular/router';
4
+ import { BehaviorSubject, Observable, combineLatest, distinctUntilChanged, from, of } from 'rxjs';
5
+ import { first, map } from 'rxjs/operators';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "@angular/router";
8
+ import * as i2 from "../../security";
9
+ import * as i3 from "../../services";
10
+ import * as i4 from "./services";
11
+ import * as i5 from "@angular/common";
12
+ import * as i6 from "primeng/ripple";
13
+ import * as i7 from "@ngx-translate/core";
14
+ export class MngMenuItemComponent {
15
+ constructor(injector, router, route, authorization, mngCommons, mainLayoutService) {
16
+ this.injector = injector;
17
+ this.router = router;
18
+ this.route = route;
19
+ this.authorization = authorization;
20
+ this.mngCommons = mngCommons;
21
+ this.mainLayoutService = mainLayoutService;
22
+ this.index = 0;
23
+ this.root = false;
24
+ this.parentKey = null;
25
+ this.visibleChangeEventEmitter = new EventEmitter();
26
+ this.hostClassNoPadding = false;
27
+ this.hostClassChildrenHidden = false;
28
+ this.key = '';
29
+ this.active = false;
30
+ this.hover = false;
31
+ this.guardsIsAllowedSubject = new BehaviorSubject(true);
32
+ this.isPermittedSubject = new BehaviorSubject(true);
33
+ this.isVisibleSubject = new BehaviorSubject(true);
34
+ this.childrenVisibilitySubject = [];
35
+ this.guardsIsAllowed$ = this.guardsIsAllowedSubject.asObservable().pipe(distinctUntilChanged());
36
+ this.isPermitted$ = this.isPermittedSubject.asObservable().pipe(distinctUntilChanged());
37
+ this.isVisible$ = this.isVisibleSubject.asObservable().pipe(distinctUntilChanged());
38
+ }
39
+ ngOnInit() {
40
+ this.key = this.parentKey ? this.parentKey + '-' + this.index : String(this.index);
41
+ if (this.item.routerLink) {
42
+ if (typeof this.item.routerLink === 'string') {
43
+ this.itemUrl = this.item.routerLink;
44
+ }
45
+ else {
46
+ this.itemUrl = this.router.parseUrl(this.item.routerLink.join('/'));
47
+ }
48
+ }
49
+ if (!this.mngCommons.menuModeIsSlim && this.item.routerLink) {
50
+ this.updateActiveStateFromRoute();
51
+ }
52
+ this.menuSourceSubscription = this.mngCommons.menuActiveKey$.subscribe(key => {
53
+ // deactivate current active menu
54
+ if (this.active && this.key !== key && key.indexOf(this.key) !== 0) {
55
+ this.active = false;
56
+ }
57
+ });
58
+ this.menuResetSubscription = this.mngCommons.menuReset$.subscribe(() => {
59
+ this.active = false;
60
+ });
61
+ this.routerEventsSubscription = this.router.events.subscribe(next => {
62
+ if (next instanceof GuardsCheckEnd && next.shouldActivate) {
63
+ this.checkIfMenuItemIsAllowedFromGuard(next.state);
64
+ }
65
+ else if (next instanceof NavigationEnd) {
66
+ if (this.mngCommons.menuModeIsSlim && !this.mainLayoutService.isMobile()) {
67
+ this.active = false;
68
+ }
69
+ else {
70
+ this.updateActiveStateFromRoute();
71
+ }
72
+ }
73
+ });
74
+ if (this.item.permissions) {
75
+ this.isPermittedSubscription = this.authorization.isPermitted(this.item.permissions).subscribe({
76
+ next: isPermitted => {
77
+ this.isPermittedSubject.next(isPermitted);
78
+ }
79
+ });
80
+ }
81
+ this.checkIfMenuItemIsAllowedFromGuard(this.router.routerState.snapshot);
82
+ this.isVisibleCombinedSubscription = combineLatest([of(this.item.visible !== false), this.isPermitted$, this.guardsIsAllowed$]).subscribe({
83
+ next: res => {
84
+ const isVisible = res.every(r => r === true);
85
+ this.hostClassNoPadding = !isVisible;
86
+ this.isVisibleSubject.next(isVisible);
87
+ }
88
+ });
89
+ this.isVisibleSubscription = this.isVisible$.subscribe(v => {
90
+ this.visibleChangeEventEmitter.emit(v);
91
+ });
92
+ if (this.item.items) {
93
+ this.childrenVisibilitySubject = this.item.items.map(() => new BehaviorSubject(true));
94
+ this.areChildrenVisibleSubscription = combineLatest(this.childrenVisibilitySubject.map(s => s.asObservable().pipe(distinctUntilChanged()))).subscribe(visible => {
95
+ const anyChildVisible = visible.some(v => v === true);
96
+ this.hostClassChildrenHidden = !anyChildVisible;
97
+ });
98
+ }
99
+ }
100
+ updateActiveStateFromRoute() {
101
+ if (this.itemUrl) {
102
+ this.active = this.router.isActive(this.itemUrl, {
103
+ matrixParams: 'ignored',
104
+ queryParams: 'ignored',
105
+ paths: this.item.items ? 'subset' : 'exact',
106
+ fragment: 'ignored'
107
+ });
108
+ }
109
+ else {
110
+ this.active = false;
111
+ }
112
+ }
113
+ itemClick(event) {
114
+ // avoid processing disabled items
115
+ if (this.item.disabled) {
116
+ event.preventDefault();
117
+ return;
118
+ }
119
+ // navigate with hover in horizontal mode
120
+ if (this.root) {
121
+ this.mainLayoutService.menuHoverActive = !this.mainLayoutService.menuHoverActive;
122
+ }
123
+ // notify other items
124
+ this.mngCommons.menuChangeActiveKey(this.key);
125
+ // toggle active state
126
+ if (this.item.items) {
127
+ this.active = !this.active;
128
+ }
129
+ else {
130
+ // activate item
131
+ this.active = true;
132
+ if (this.mainLayoutService.isMobile()) {
133
+ this.mainLayoutService.staticMenuMobileActive = false;
134
+ }
135
+ if (this.mngCommons.menuModeIsOverlay) {
136
+ this.mainLayoutService.overlayMenuActive = false;
137
+ }
138
+ // reset horizontal menu
139
+ if (this.mngCommons.menuModeIsSlim && !this.mainLayoutService.isMobile()) {
140
+ this.mngCommons.menuReset();
141
+ this.mainLayoutService.menuHoverActive = false;
142
+ }
143
+ }
144
+ }
145
+ onMouseEnter() {
146
+ // activate item on hover
147
+ if (this.root && this.mainLayoutService.menuHoverActive && this.mngCommons.menuModeIsSlim && this.mainLayoutService.isDesktop()) {
148
+ this.mngCommons.menuChangeActiveKey(this.key);
149
+ this.active = true;
150
+ }
151
+ }
152
+ ngOnDestroy() {
153
+ this.menuSourceSubscription?.unsubscribe();
154
+ this.menuResetSubscription?.unsubscribe();
155
+ this.routerEventsSubscription?.unsubscribe();
156
+ this.guardsIsAllowedSubscription?.unsubscribe();
157
+ this.isPermittedSubscription?.unsubscribe();
158
+ this.isVisibleSubscription?.unsubscribe();
159
+ this.isVisibleCombinedSubscription?.unsubscribe();
160
+ this.areChildrenVisibleSubscription?.unsubscribe();
161
+ }
162
+ onChildVisibleChange(visible, item, idx) {
163
+ this.childrenVisibilitySubject[idx].next(visible);
164
+ }
165
+ checkIfMenuItemIsAllowedFromGuard(routerState) {
166
+ this.guardsIsAllowedSubscription?.unsubscribe();
167
+ if (this.item.guards?.length) {
168
+ const obs = [];
169
+ for (const guard of this.item.guards) {
170
+ const tokenInjectedInstance = this.injector.get(guard);
171
+ if (tokenInjectedInstance && 'canActivate' in tokenInjectedInstance) {
172
+ const guardInstance = tokenInjectedInstance;
173
+ const canActivateRes = guardInstance.canActivate(this.route.snapshot, routerState);
174
+ let canActivateObs;
175
+ if (canActivateRes instanceof Observable) {
176
+ canActivateObs = canActivateRes;
177
+ }
178
+ else if (canActivateRes instanceof Promise) {
179
+ canActivateObs = from(canActivateRes);
180
+ }
181
+ else {
182
+ canActivateObs = of(canActivateRes);
183
+ }
184
+ obs.push(canActivateObs.pipe(first(), map(res => res === true) // if url tree is present, that means redirect and implies not allowed
185
+ ));
186
+ }
187
+ }
188
+ this.guardsIsAllowedSubscription = combineLatest(obs)
189
+ .pipe(first())
190
+ .subscribe(next => {
191
+ const result = next.every(n => n === true);
192
+ this.guardsIsAllowedSubject.next(result);
193
+ });
194
+ }
195
+ else {
196
+ this.guardsIsAllowedSubject.next(true);
197
+ }
198
+ }
199
+ }
200
+ MngMenuItemComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: MngMenuItemComponent, deps: [{ token: i0.Injector }, { token: i1.Router }, { token: i1.ActivatedRoute }, { token: i2.MngAuthorizationService }, { token: i3.MngCommonsService }, { token: i4.MngMainLayoutComponentService }], target: i0.ɵɵFactoryTarget.Component });
201
+ MngMenuItemComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.1.0", type: MngMenuItemComponent, selector: "[mng-menuitem]", inputs: { item: "item", index: "index", root: "root", parentKey: "parentKey" }, outputs: { visibleChangeEventEmitter: "visibleChange" }, host: { properties: { "class.layout-root-menuitem": "root", "class.active-menuitem": "active", "class.py-0": "this.hostClassNoPadding", "class.hidden": "this.hostClassChildrenHidden" } }, ngImport: i0, template: "<ng-container *ngIf=\"isVisible$ | async\">\n <div *ngIf=\"root\" class=\"layout-menuitem-root-text\">\n {{ item.label! | translate }}\n </div>\n <a\n *ngIf=\"!item.routerLink || item.items\"\n [attr.href]=\"item.href\"\n (click)=\"itemClick($event)\"\n (mouseenter)=\"onMouseEnter()\"\n (keydown.enter)=\"itemClick($event)\"\n [routerLink]=\"item.routerLink\"\n [attr.target]=\"item.target\"\n [attr.tabindex]=\"0\"\n [ngClass]=\"item.className ?? ''\"\n pRipple>\n <i [ngClass]=\"item.icon ?? ''\" class=\"layout-menuitem-icon\"></i>\n <span class=\"layout-menuitem-text\">{{ item.label! | translate }}</span>\n <i class=\"pi pi-fw pi-angle-down layout-submenu-toggler\" *ngIf=\"item.items\"></i>\n <span class=\"menuitem-badge\" *ngIf=\"item.badge\">{{ item.badge }}</span>\n </a>\n <a\n *ngIf=\"item.routerLink && !item.items\"\n (click)=\"itemClick($event)\"\n (mouseenter)=\"hover = true\"\n (mouseleave)=\"hover = false\"\n [routerLink]=\"item.routerLink\"\n routerLinkActive=\"active-menuitem-routerlink\"\n [routerLinkActiveOptions]=\"{paths: 'exact', matrixParams: 'ignored', queryParams: 'ignored', fragment: 'ignored'}\"\n [attr.target]=\"item.target\"\n [attr.tabindex]=\"0\"\n [ngClass]=\"item.className ?? ''\"\n pRipple>\n <i [ngClass]=\"item.icon ?? ''\" class=\"layout-menuitem-icon\"></i>\n <span class=\"layout-menuitem-text\">{{ item.label! | translate }}</span>\n <i class=\"pi pi-fw pi-angle-down layout-submenu-toggler\" *ngIf=\"item.items\"></i>\n <span class=\"menuitem-badge\" *ngIf=\"item.badge\">{{ item.badge }}</span>\n </a>\n <ul\n *ngIf=\"item.items || (item.items && (mngCommons.menuModeIsStatic$ | async) && root)\"\n [@children]=\"\n (mngCommons.menuModeIsSlim$ | async) && (mainLayoutService.isMobile$ | async) === false && root\n ? active\n ? 'visible'\n : 'hidden'\n : (mngCommons.menuModeIsStatic$ | async) && root && (mainLayoutService.isMobile$ | async) === false\n ? 'visible'\n : active\n ? 'visibleAnimated'\n : 'hiddenAnimated'\n \">\n <ng-template ngFor let-child let-i=\"index\" [ngForOf]=\"item.items\">\n <li mng-menuitem [item]=\"child\" [index]=\"i\" [parentKey]=\"key\" [class]=\"child.badgeClassName\" (visibleChange)=\"onChildVisibleChange($event, item, i)\"></li>\n </ng-template>\n </ul>\n</ng-container>\n", dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.RouterLinkWithHref, selector: "a[routerLink],area[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "preserveFragment", "skipLocationChange", "replaceUrl", "state", "relativeTo", "routerLink"] }, { kind: "directive", type: i1.RouterLinkActive, selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "ariaCurrentWhenActive", "routerLinkActive"], outputs: ["isActiveChange"], exportAs: ["routerLinkActive"] }, { kind: "directive", type: i6.Ripple, selector: "[pRipple]" }, { kind: "component", type: MngMenuItemComponent, selector: "[mng-menuitem]", inputs: ["item", "index", "root", "parentKey"], outputs: ["visibleChange"] }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }, { kind: "pipe", type: i7.TranslatePipe, name: "translate" }], animations: [
202
+ trigger('children', [
203
+ state('void', style({
204
+ height: '0px'
205
+ })),
206
+ state('hiddenAnimated', style({
207
+ height: '0px'
208
+ })),
209
+ state('visibleAnimated', style({
210
+ height: '*'
211
+ })),
212
+ state('visible', style({
213
+ height: '*',
214
+ 'z-index': 100
215
+ })),
216
+ state('hidden', style({
217
+ height: '0px',
218
+ 'z-index': '*'
219
+ })),
220
+ transition('visibleAnimated => hiddenAnimated', animate('400ms cubic-bezier(0.86, 0, 0.07, 1)')),
221
+ transition('hiddenAnimated => visibleAnimated', animate('400ms cubic-bezier(0.86, 0, 0.07, 1)')),
222
+ transition('void => visibleAnimated, visibleAnimated => void', animate('400ms cubic-bezier(0.86, 0, 0.07, 1)'))
223
+ ])
224
+ ] });
225
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: MngMenuItemComponent, decorators: [{
226
+ type: Component,
227
+ args: [{ selector: '[mng-menuitem]', host: {
228
+ '[class.layout-root-menuitem]': 'root',
229
+ '[class.active-menuitem]': 'active'
230
+ }, animations: [
231
+ trigger('children', [
232
+ state('void', style({
233
+ height: '0px'
234
+ })),
235
+ state('hiddenAnimated', style({
236
+ height: '0px'
237
+ })),
238
+ state('visibleAnimated', style({
239
+ height: '*'
240
+ })),
241
+ state('visible', style({
242
+ height: '*',
243
+ 'z-index': 100
244
+ })),
245
+ state('hidden', style({
246
+ height: '0px',
247
+ 'z-index': '*'
248
+ })),
249
+ transition('visibleAnimated => hiddenAnimated', animate('400ms cubic-bezier(0.86, 0, 0.07, 1)')),
250
+ transition('hiddenAnimated => visibleAnimated', animate('400ms cubic-bezier(0.86, 0, 0.07, 1)')),
251
+ transition('void => visibleAnimated, visibleAnimated => void', animate('400ms cubic-bezier(0.86, 0, 0.07, 1)'))
252
+ ])
253
+ ], template: "<ng-container *ngIf=\"isVisible$ | async\">\n <div *ngIf=\"root\" class=\"layout-menuitem-root-text\">\n {{ item.label! | translate }}\n </div>\n <a\n *ngIf=\"!item.routerLink || item.items\"\n [attr.href]=\"item.href\"\n (click)=\"itemClick($event)\"\n (mouseenter)=\"onMouseEnter()\"\n (keydown.enter)=\"itemClick($event)\"\n [routerLink]=\"item.routerLink\"\n [attr.target]=\"item.target\"\n [attr.tabindex]=\"0\"\n [ngClass]=\"item.className ?? ''\"\n pRipple>\n <i [ngClass]=\"item.icon ?? ''\" class=\"layout-menuitem-icon\"></i>\n <span class=\"layout-menuitem-text\">{{ item.label! | translate }}</span>\n <i class=\"pi pi-fw pi-angle-down layout-submenu-toggler\" *ngIf=\"item.items\"></i>\n <span class=\"menuitem-badge\" *ngIf=\"item.badge\">{{ item.badge }}</span>\n </a>\n <a\n *ngIf=\"item.routerLink && !item.items\"\n (click)=\"itemClick($event)\"\n (mouseenter)=\"hover = true\"\n (mouseleave)=\"hover = false\"\n [routerLink]=\"item.routerLink\"\n routerLinkActive=\"active-menuitem-routerlink\"\n [routerLinkActiveOptions]=\"{paths: 'exact', matrixParams: 'ignored', queryParams: 'ignored', fragment: 'ignored'}\"\n [attr.target]=\"item.target\"\n [attr.tabindex]=\"0\"\n [ngClass]=\"item.className ?? ''\"\n pRipple>\n <i [ngClass]=\"item.icon ?? ''\" class=\"layout-menuitem-icon\"></i>\n <span class=\"layout-menuitem-text\">{{ item.label! | translate }}</span>\n <i class=\"pi pi-fw pi-angle-down layout-submenu-toggler\" *ngIf=\"item.items\"></i>\n <span class=\"menuitem-badge\" *ngIf=\"item.badge\">{{ item.badge }}</span>\n </a>\n <ul\n *ngIf=\"item.items || (item.items && (mngCommons.menuModeIsStatic$ | async) && root)\"\n [@children]=\"\n (mngCommons.menuModeIsSlim$ | async) && (mainLayoutService.isMobile$ | async) === false && root\n ? active\n ? 'visible'\n : 'hidden'\n : (mngCommons.menuModeIsStatic$ | async) && root && (mainLayoutService.isMobile$ | async) === false\n ? 'visible'\n : active\n ? 'visibleAnimated'\n : 'hiddenAnimated'\n \">\n <ng-template ngFor let-child let-i=\"index\" [ngForOf]=\"item.items\">\n <li mng-menuitem [item]=\"child\" [index]=\"i\" [parentKey]=\"key\" [class]=\"child.badgeClassName\" (visibleChange)=\"onChildVisibleChange($event, item, i)\"></li>\n </ng-template>\n </ul>\n</ng-container>\n" }]
254
+ }], ctorParameters: function () { return [{ type: i0.Injector }, { type: i1.Router }, { type: i1.ActivatedRoute }, { type: i2.MngAuthorizationService }, { type: i3.MngCommonsService }, { type: i4.MngMainLayoutComponentService }]; }, propDecorators: { item: [{
255
+ type: Input
256
+ }], index: [{
257
+ type: Input
258
+ }], root: [{
259
+ type: Input
260
+ }], parentKey: [{
261
+ type: Input
262
+ }], visibleChangeEventEmitter: [{
263
+ type: Output,
264
+ args: ['visibleChange']
265
+ }], hostClassNoPadding: [{
266
+ type: HostBinding,
267
+ args: ['class.py-0']
268
+ }], hostClassChildrenHidden: [{
269
+ type: HostBinding,
270
+ args: ['class.hidden']
271
+ }] } });
272
272
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudS1pdGVtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9sYXlvdXQvbWVudS1pdGVtLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9sYXlvdXQvbWVudS1pdGVtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDL0UsT0FBTyxFQUFDLFNBQVMsRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFZLEtBQUssRUFBcUIsTUFBTSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQy9HLE9BQU8sRUFBOEIsY0FBYyxFQUF3QixhQUFhLEVBQXVDLE1BQU0saUJBQWlCLENBQUM7QUFFdkosT0FBTyxFQUFDLGVBQWUsRUFBRSxVQUFVLEVBQWdCLGFBQWEsRUFBRSxvQkFBb0IsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQzlHLE9BQU8sRUFBQyxLQUFLLEVBQUUsR0FBRyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7OztBQXlEMUMsTUFBTSxPQUFPLG9CQUFvQjtJQWtDN0IsWUFDWSxRQUFrQixFQUNsQixNQUFjLEVBQ2QsS0FBcUIsRUFDckIsYUFBc0MsRUFDdkMsVUFBNkIsRUFDN0IsaUJBQWdEO1FBTC9DLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDbEIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLFVBQUssR0FBTCxLQUFLLENBQWdCO1FBQ3JCLGtCQUFhLEdBQWIsYUFBYSxDQUF5QjtRQUN2QyxlQUFVLEdBQVYsVUFBVSxDQUFtQjtRQUM3QixzQkFBaUIsR0FBakIsaUJBQWlCLENBQStCO1FBdENsRCxVQUFLLEdBQUcsQ0FBQyxDQUFDO1FB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QVosS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUVtQix5QkFBeUI7c0JBQWpELE1BQU07dUJBQUMsZUFBZTtnQkFFWSxrQkFBa0I7c0JBQXBELFdBQVc7dUJBQUMsWUFBWTtnQkFDWSx1QkFBdUI7c0JBQTNELFdBQVc7dUJBQUMsY0FBYyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7YW5pbWF0ZSwgc3RhdGUsIHN0eWxlLCB0cmFuc2l0aW9uLCB0cmlnZ2VyfSBmcm9tICdAYW5ndWxhci9hbmltYXRpb25zJztcbmltcG9ydCB7Q29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIEhvc3RCaW5kaW5nLCBJbmplY3RvciwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0LCBPdXRwdXR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtBY3RpdmF0ZWRSb3V0ZSwgQ2FuQWN0aXZhdGUsIEd1YXJkc0NoZWNrRW5kLCBJc0FjdGl2ZU1hdGNoT3B0aW9ucywgTmF2aWdhdGlvbkVuZCwgUm91dGVyLCBSb3V0ZXJTdGF0ZVNuYXBzaG90LCBVcmxUcmVlfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuXG5pbXBvcnQge0JlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9uLCBjb21iaW5lTGF0ZXN0LCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgZnJvbSwgb2Z9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtmaXJzdCwgbWFwfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7TW5nTWVudUl0ZW19IGZyb20gJy4uLy4uL21vZGVscyc7XG5pbXBvcnQge01uZ0F1dGhvcml6YXRpb25TZXJ2aWNlfSBmcm9tICcuLi8uLi9zZWN1cml0eSc7XG5pbXBvcnQge01uZ0NvbW1vbnNTZXJ2aWNlfSBmcm9tICcuLi8uLi9zZXJ2aWNlcyc7XG5pbXBvcnQge01uZ01haW5MYXlvdXRDb21wb25lbnRTZXJ2aWNlfSBmcm9tICcuL3NlcnZpY2VzJztcblxuQENvbXBvbmVudCh7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9jb21wb25lbnQtc2VsZWN0b3JcbiAgICBzZWxlY3RvcjogJ1ttbmctbWVudWl0ZW1dJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vbWVudS1pdGVtLmNvbXBvbmVudC5odG1sJyxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L25vLWhvc3QtbWV0YWRhdGEtcHJvcGVydHlcbiAgICBob3N0OiB7XG4gICAgICAgICdbY2xhc3MubGF5b3V0LXJvb3QtbWVudWl0ZW1dJzogJ3Jvb3QnLFxuICAgICAgICAnW2NsYXNzLmFjdGl2ZS1tZW51aXRlbV0nOiAnYWN0aXZlJ1xuICAgIH0sXG4gICAgYW5pbWF0aW9uczogW1xuICAgICAgICB0cmlnZ2VyKCdjaGlsZHJlbicsIFtcbiAgICAgICAgICAgIHN0YXRlKFxuICAgICAgICAgICAgICAgICd2b2lkJyxcbiAgICAgICAgICAgICAgICBzdHlsZSh7XG4gICAgICAgICAgICAgICAgICAgIGhlaWdodDogJzBweCdcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHN0YXRlKFxuICAgICAgICAgICAgICAgICdoaWRkZW5BbmltYXRlZCcsXG4gICAgICAgICAgICAgICAgc3R5bGUoe1xuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6ICcwcHgnXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBzdGF0ZShcbiAgICAgICAgICAgICAgICAndmlzaWJsZUFuaW1hdGVkJyxcbiAgICAgICAgICAgICAgICBzdHlsZSh7XG4gICAgICAgICAgICAgICAgICAgIGhlaWdodDogJyonXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBzdGF0ZShcbiAgICAgICAgICAgICAgICAndmlzaWJsZScsXG4gICAgICAgICAgICAgICAgc3R5bGUoe1xuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6ICcqJyxcbiAgICAgICAgICAgICAgICAgICAgJ3otaW5kZXgnOiAxMDBcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHN0YXRlKFxuICAgICAgICAgICAgICAgICdoaWRkZW4nLFxuICAgICAgICAgICAgICAgIHN0eWxlKHtcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAnMHB4JyxcbiAgICAgICAgICAgICAgICAgICAgJ3otaW5kZXgnOiAnKidcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHRyYW5zaXRpb24oJ3Zpc2libGVBbmltYXRlZCA9PiBoaWRkZW5BbmltYXRlZCcsIGFuaW1hdGUoJzQwMG1zIGN1YmljLWJlemllcigwLjg2LCAwLCAwLjA3LCAxKScpKSxcbiAgICAgICAgICAgIHRyYW5zaXRpb24oJ2hpZGRlbkFuaW1hdGVkID0+IHZpc2libGVBbmltYXRlZCcsIGFuaW1hdGUoJzQwMG1zIGN1YmljLWJlemllcigwLjg2LCAwLCAwLjA3LCAxKScpKSxcbiAgICAgICAgICAgIHRyYW5zaXRpb24oJ3ZvaWQgPT4gdmlzaWJsZUFuaW1hdGVkLCB2aXNpYmxlQW5pbWF0ZWQgPT4gdm9pZCcsIGFuaW1hdGUoJzQwMG1zIGN1YmljLWJlemllcigwLjg2LCAwLCAwLjA3LCAxKScpKVxuICAgICAgICBdKVxuICAgIF1cbiAgICAvLyBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBNbmdNZW51SXRlbUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgICBASW5wdXQoKSBpdGVtITogTW5nTWVudUl0ZW07XG4gICAgQElucHV0KCkgaW5kZXggPSAwO1xuICAgIEBJbnB1dCgpIHJvb3QgPSBmYWxzZTtcbiAgICBASW5wdXQoKSBwYXJlbnRLZXk6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gICAgQE91dHB1dCgndmlzaWJsZUNoYW5nZScpIHZpc2libGVDaGFuZ2VFdmVudEVtaXR0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLnB5LTAnKSBwcml2YXRlIGhvc3RDbGFzc05vUGFkZGluZyA9IGZhbHNlO1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaGlkZGVuJykgcHJpdmF0ZSBob3N0Q2xhc3NDaGlsZHJlbkhpZGRlbiA9IGZhbHNlO1xuXG4gICAgcHVibGljIGtleSA9ICcnO1xuICAgIHB1YmxpYyBhY3RpdmUgPSBmYWxzZTtcbiAgICBwdWJsaWMgaG92ZXIgPSBmYWxzZTtcblxuICAgIHByaXZhdGUgZ3VhcmRzSXNBbGxvd2VkU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3QodHJ1ZSk7XG4gICAgcHJpdmF0ZSBndWFyZHNJc0FsbG93ZWQkOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuICAgIHByaXZhdGUgaXNQZXJtaXR0ZWRTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdCh0cnVlKTtcbiAgICBwcml2YXRlIGlzUGVybWl0dGVkJDogT2JzZXJ2YWJsZTxib29sZWFuPjtcbiAgICBwcml2YXRlIGlzVmlzaWJsZVN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KHRydWUpO1xuICAgIHB1YmxpYyBpc1Zpc2libGUkOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuXG4gICAgcHJpdmF0ZSBjaGlsZHJlblZpc2liaWxpdHlTdWJqZWN0OiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj5bXSA9IFtdO1xuXG4gICAgcHJpdmF0ZSBpdGVtVXJsPzogc3RyaW5nIHwgVXJsVHJlZTtcbiAgICBwcml2YXRlIG1lbnVTb3VyY2VTdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XG4gICAgcHJpdmF0ZSBtZW51UmVzZXRTdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XG4gICAgcHJpdmF0ZSByb3V0ZXJFdmVudHNTdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XG4gICAgcHJpdmF0ZSBndWFyZHNJc0FsbG93ZWRTdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XG4gICAgcHJpdmF0ZSBpc1Blcm1pdHRlZFN1YnNjcmlwdGlvbj86IFN1YnNjcmlwdGlvbjtcbiAgICBwcml2YXRlIGlzVmlzaWJsZVN1YnNjcmlwdGlvbj86IFN1YnNjcmlwdGlvbjtcbiAgICBwcml2YXRlIGlzVmlzaWJsZUNvbWJpbmVkU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuICAgIHByaXZhdGUgYXJlQ2hpbGRyZW5WaXNpYmxlU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgaW5qZWN0b3I6IEluamVjdG9yLFxuICAgICAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxuICAgICAgICBwcml2YXRlIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICAgICAgcHJpdmF0ZSBhdXRob3JpemF0aW9uOiBNbmdBdXRob3JpemF0aW9uU2VydmljZSxcbiAgICAgICAgcHVibGljIG1uZ0NvbW1vbnM6IE1uZ0NvbW1vbnNTZXJ2aWNlLFxuICAgICAgICBwdWJsaWMgbWFpbkxheW91dFNlcnZpY2U6IE1uZ01haW5MYXlvdXRDb21wb25lbnRTZXJ2aWNlXG4gICAgKSB7XG4gICAgICAgIHRoaXMuZ3VhcmRzSXNBbGxvd2VkJCA9IHRoaXMuZ3VhcmRzSXNBbGxvd2VkU3ViamVjdC5hc09ic2VydmFibGUoKS5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpO1xuICAgICAgICB0aGlzLmlzUGVybWl0dGVkJCA9IHRoaXMuaXNQZXJtaXR0ZWRTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSk7XG4gICAgICAgIHRoaXMuaXNWaXNpYmxlJCA9IHRoaXMuaXNWaXNpYmxlU3ViamVjdC5hc09ic2VydmFibGUoKS5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpO1xuICAgIH1cblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLmtleSA9IHRoaXMucGFyZW50S2V5ID8gdGhpcy5wYXJlbnRLZXkgKyAnLScgKyB0aGlzLmluZGV4IDogU3RyaW5nKHRoaXMuaW5kZXgpO1xuICAgICAgICBpZiAodGhpcy5pdGVtLnJvdXRlckxpbmspIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5pdGVtLnJvdXRlckxpbmsgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pdGVtVXJsID0gdGhpcy5pdGVtLnJvdXRlckxpbms7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuaXRlbVVybCA9IHRoaXMucm91dGVyLnBhcnNlVXJsKHRoaXMuaXRlbS5yb3V0ZXJMaW5rLmpvaW4oJy8nKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMubW5nQ29tbW9ucy5tZW51TW9kZUlzU2xpbSAmJiB0aGlzLml0ZW0ucm91dGVyTGluaykge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVBY3RpdmVTdGF0ZUZyb21Sb3V0ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5tZW51U291cmNlU3Vic2NyaXB0aW9uID0gdGhpcy5tbmdDb21tb25zLm1lbnVBY3RpdmVLZXkkLnN1YnNjcmliZShrZXkgPT4ge1xuICAgICAgICAgICAgLy8gZGVhY3RpdmF0ZSBjdXJyZW50IGFjdGl2ZSBtZW51XG4gICAgICAgICAgICBpZiAodGhpcy5hY3RpdmUgJiYgdGhpcy5rZXkgIT09IGtleSAmJiBrZXkuaW5kZXhPZih0aGlzLmtleSkgIT09IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLm1lbnVSZXNldFN1YnNjcmlwdGlvbiA9IHRoaXMubW5nQ29tbW9ucy5tZW51UmVzZXQkLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnJvdXRlckV2ZW50c1N1YnNjcmlwdGlvbiA9IHRoaXMucm91dGVyLmV2ZW50cy5zdWJzY3JpYmUobmV4dCA9PiB7XG4gICAgICAgICAgICBpZiAobmV4dCBpbnN0YW5jZW9mIEd1YXJkc0NoZWNrRW5kICYmIG5leHQuc2hvdWxkQWN0aXZhdGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrSWZNZW51SXRlbUlzQWxsb3dlZEZyb21HdWFyZChuZXh0LnN0YXRlKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobmV4dCBpbnN0YW5jZW9mIE5hdmlnYXRpb25FbmQpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5tbmdDb21tb25zLm1lbnVNb2RlSXNTbGltICYmICF0aGlzLm1haW5MYXlvdXRTZXJ2aWNlLmlzTW9iaWxlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUFjdGl2ZVN0YXRlRnJvbVJvdXRlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAodGhpcy5pdGVtLnBlcm1pc3Npb25zKSB7XG4gICAgICAgICAgICB0aGlzLmlzUGVybWl0dGVkU3Vic2NyaXB0aW9uID0gdGhpcy5hdXRob3JpemF0aW9uLmlzUGVybWl0dGVkKHRoaXMuaXRlbS5wZXJtaXNzaW9ucykuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgICAgICBuZXh0OiBpc1Blcm1pdHRlZCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNQZXJtaXR0ZWRTdWJqZWN0Lm5leHQoaXNQZXJtaXR0ZWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jaGVja0lmTWVudUl0ZW1Jc0FsbG93ZWRGcm9tR3VhcmQodGhpcy5yb3V0ZXIucm91dGVyU3RhdGUuc25hcHNob3QpO1xuXG4gICAgICAgIHRoaXMuaXNWaXNpYmxlQ29tYmluZWRTdWJzY3JpcHRpb24gPSBjb21iaW5lTGF0ZXN0KFtvZih0aGlzLml0ZW0udmlzaWJsZSAhPT0gZmFsc2UpLCB0aGlzLmlzUGVybWl0dGVkJCwgdGhpcy5ndWFyZHNJc0FsbG93ZWQkXSkuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgIG5leHQ6IHJlcyA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaXNWaXNpYmxlID0gcmVzLmV2ZXJ5KHIgPT4gciA9PT0gdHJ1ZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5ob3N0Q2xhc3NOb1BhZGRpbmcgPSAhaXNWaXNpYmxlO1xuICAgICAgICAgICAgICAgIHRoaXMuaXNWaXNpYmxlU3ViamVjdC5uZXh0KGlzVmlzaWJsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmlzVmlzaWJsZVN1YnNjcmlwdGlvbiA9IHRoaXMuaXNWaXNpYmxlJC5zdWJzY3JpYmUodiA9PiB7XG4gICAgICAgICAgICB0aGlzLnZpc2libGVDaGFuZ2VFdmVudEVtaXR0ZXIuZW1pdCh2KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHRoaXMuaXRlbS5pdGVtcykge1xuICAgICAgICAgICAgdGhpcy5jaGlsZHJlblZpc2liaWxpdHlTdWJqZWN0ID0gdGhpcy5pdGVtLml0ZW1zLm1hcCgoKSA9PiBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KHRydWUpKTtcblxuICAgICAgICAgICAgdGhpcy5hcmVDaGlsZHJlblZpc2libGVTdWJzY3JpcHRpb24gPSBjb21iaW5lTGF0ZXN0KHRoaXMuY2hpbGRyZW5WaXNpYmlsaXR5U3ViamVjdC5tYXAocyA9PiBzLmFzT2JzZXJ2YWJsZSgpLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSkpKS5zdWJzY3JpYmUodmlzaWJsZSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgYW55Q2hpbGRWaXNpYmxlID0gdmlzaWJsZS5zb21lKHYgPT4gdiA9PT0gdHJ1ZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5ob3N0Q2xhc3NDaGlsZHJlbkhpZGRlbiA9ICFhbnlDaGlsZFZpc2libGU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHVwZGF0ZUFjdGl2ZVN0YXRlRnJvbVJvdXRlKCkge1xuICAgICAgICBpZiAodGhpcy5pdGVtVXJsKSB7XG4gICAgICAgICAgICB0aGlzLmFjdGl2ZSA9IHRoaXMucm91dGVyLmlzQWN0aXZlKHRoaXMuaXRlbVVybCwgPElzQWN0aXZlTWF0Y2hPcHRpb25zPntcbiAgICAgICAgICAgICAgICBtYXRyaXhQYXJhbXM6ICdpZ25vcmVkJyxcbiAgICAgICAgICAgICAgICBxdWVyeVBhcmFtczogJ2lnbm9yZWQnLFxuICAgICAgICAgICAgICAgIHBhdGhzOiB0aGlzLml0ZW0uaXRlbXMgPyAnc3Vic2V0JyA6ICdleGFjdCcsXG4gICAgICAgICAgICAgICAgZnJhZ21lbnQ6ICdpZ25vcmVkJ1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaXRlbUNsaWNrKGV2ZW50OiBFdmVudCkge1xuICAgICAgICAvLyBhdm9pZCBwcm9jZXNzaW5nIGRpc2FibGVkIGl0ZW1zXG4gICAgICAgIGlmICh0aGlzLml0ZW0uZGlzYWJsZWQpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBuYXZpZ2F0ZSB3aXRoIGhvdmVyIGluIGhvcml6b250YWwgbW9kZVxuICAgICAgICBpZiAodGhpcy5yb290KSB7XG4gICAgICAgICAgICB0aGlzLm1haW5MYXlvdXRTZXJ2aWNlLm1lbnVIb3ZlckFjdGl2ZSA9ICF0aGlzLm1haW5MYXlvdXRTZXJ2aWNlLm1lbnVIb3ZlckFjdGl2ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIG5vdGlmeSBvdGhlciBpdGVtc1xuICAgICAgICB0aGlzLm1uZ0NvbW1vbnMubWVudUNoYW5nZUFjdGl2ZUtleSh0aGlzLmtleSk7XG5cbiAgICAgICAgLy8gdG9nZ2xlIGFjdGl2ZSBzdGF0ZVxuICAgICAgICBpZiAodGhpcy5pdGVtLml0ZW1zKSB7XG4gICAgICAgICAgICB0aGlzLmFjdGl2ZSA9ICF0aGlzLmFjdGl2ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGFjdGl2YXRlIGl0ZW1cbiAgICAgICAgICAgIHRoaXMuYWN0aXZlID0gdHJ1ZTtcblxuICAgICAgICAgICAgaWYgKHRoaXMubWFpbkxheW91dFNlcnZpY2UuaXNNb2JpbGUoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMubWFpbkxheW91dFNlcnZpY2Uuc3RhdGljTWVudU1vYmlsZUFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5tbmdDb21tb25zLm1lbnVNb2RlSXNPdmVybGF5KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5tYWluTGF5b3V0U2VydmljZS5vdmVybGF5TWVudUFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyByZXNldCBob3Jpem9udGFsIG1lbnVcbiAgICAgICAgICAgIGlmICh0aGlzLm1uZ0NvbW1vbnMubWVudU1vZGVJc1NsaW0gJiYgIXRoaXMubWFpbkxheW91dFNlcnZpY2UuaXNNb2JpbGUoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMubW5nQ29tbW9ucy5tZW51UmVzZXQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLm1haW5MYXlvdXRTZXJ2aWNlLm1lbnVIb3ZlckFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25Nb3VzZUVudGVyKCkge1xuICAgICAgICAvLyBhY3RpdmF0ZSBpdGVtIG9uIGhvdmVyXG4gICAgICAgIGlmICh0aGlzLnJvb3QgJiYgdGhpcy5tYWluTGF5b3V0U2VydmljZS5tZW51SG92ZXJBY3RpdmUgJiYgdGhpcy5tbmdDb21tb25zLm1lbnVNb2RlSXNTbGltICYmIHRoaXMubWFpbkxheW91dFNlcnZpY2UuaXNEZXNrdG9wKCkpIHtcbiAgICAgICAgICAgIHRoaXMubW5nQ29tbW9ucy5tZW51Q2hhbmdlQWN0aXZlS2V5KHRoaXMua2V5KTtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICB0aGlzLm1lbnVTb3VyY2VTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIHRoaXMubWVudVJlc2V0U3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgICAgICB0aGlzLnJvdXRlckV2ZW50c1N1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgdGhpcy5ndWFyZHNJc0FsbG93ZWRTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIHRoaXMuaXNQZXJtaXR0ZWRTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIHRoaXMuaXNWaXNpYmxlU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgICAgICB0aGlzLmlzVmlzaWJsZUNvbWJpbmVkU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgICAgICB0aGlzLmFyZUNoaWxkcmVuVmlzaWJsZVN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICB9XG5cbiAgICBvbkNoaWxkVmlzaWJsZUNoYW5nZSh2aXNpYmxlOiBib29sZWFuLCBpdGVtOiBNbmdNZW51SXRlbSwgaWR4OiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5jaGlsZHJlblZpc2liaWxpdHlTdWJqZWN0W2lkeF0ubmV4dCh2aXNpYmxlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNoZWNrSWZNZW51SXRlbUlzQWxsb3dlZEZyb21HdWFyZChyb3V0ZXJTdGF0ZTogUm91dGVyU3RhdGVTbmFwc2hvdCkge1xuICAgICAgICB0aGlzLmd1YXJkc0lzQWxsb3dlZFN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgaWYgKHRoaXMuaXRlbS5ndWFyZHM/Lmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3Qgb2JzID0gW107XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGd1YXJkIG9mIHRoaXMuaXRlbS5ndWFyZHMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0b2tlbkluamVjdGVkSW5zdGFuY2UgPSB0aGlzLmluamVjdG9yLmdldChndWFyZCk7XG4gICAgICAgICAgICAgICAgaWYgKHRva2VuSW5qZWN0ZWRJbnN0YW5jZSAmJiAnY2FuQWN0aXZhdGUnIGluIHRva2VuSW5qZWN0ZWRJbnN0YW5jZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBndWFyZEluc3RhbmNlID0gdG9rZW5JbmplY3RlZEluc3RhbmNlIGFzIENhbkFjdGl2YXRlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjYW5BY3RpdmF0ZVJlcyA9IGd1YXJkSW5zdGFuY2UuY2FuQWN0aXZhdGUodGhpcy5yb3V0ZS5zbmFwc2hvdCwgcm91dGVyU3RhdGUpO1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBjYW5BY3RpdmF0ZU9iczogT2JzZXJ2YWJsZTxib29sZWFuIHwgVXJsVHJlZT47XG4gICAgICAgICAgICAgICAgICAgIGlmIChjYW5BY3RpdmF0ZVJlcyBpbnN0YW5jZW9mIE9ic2VydmFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbkFjdGl2YXRlT2JzID0gY2FuQWN0aXZhdGVSZXM7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2FuQWN0aXZhdGVSZXMgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYW5BY3RpdmF0ZU9icyA9IGZyb20oY2FuQWN0aXZhdGVSZXMpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FuQWN0aXZhdGVPYnMgPSBvZihjYW5BY3RpdmF0ZVJlcyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgb2JzLnB1c2goXG4gICAgICAgICAgICAgICAgICAgICAgICBjYW5BY3RpdmF0ZU9icy5waXBlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0KCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwKHJlcyA9PiByZXMgPT09IHRydWUpIC8vIGlmIHVybCB0cmVlIGlzIHByZXNlbnQsIHRoYXQgbWVhbnMgcmVkaXJlY3QgYW5kIGltcGxpZXMgbm90IGFsbG93ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmd1YXJkc0lzQWxsb3dlZFN1YnNjcmlwdGlvbiA9IGNvbWJpbmVMYXRlc3Qob2JzKVxuICAgICAgICAgICAgICAgIC5waXBlKGZpcnN0KCkpXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZShuZXh0ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV4dC5ldmVyeShuID0+IG4gPT09IHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmd1YXJkc0lzQWxsb3dlZFN1YmplY3QubmV4dChyZXN1bHQpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5ndWFyZHNJc0FsbG93ZWRTdWJqZWN0Lm5leHQodHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCI8bmctY29udGFpbmVyICpuZ0lmPVwiaXNWaXNpYmxlJCB8IGFzeW5jXCI+XG4gICAgPGRpdiAqbmdJZj1cInJvb3RcIiBjbGFzcz1cImxheW91dC1tZW51aXRlbS1yb290LXRleHRcIj5cbiAgICAgICAge3sgaXRlbS5sYWJlbCEgfCB0cmFuc2xhdGUgfX1cbiAgICA8L2Rpdj5cbiAgICA8YVxuICAgICAgICAqbmdJZj1cIiFpdGVtLnJvdXRlckxpbmsgfHwgaXRlbS5pdGVtc1wiXG4gICAgICAgIFthdHRyLmhyZWZdPVwiaXRlbS5ocmVmXCJcbiAgICAgICAgKGNsaWNrKT1cIml0ZW1DbGljaygkZXZlbnQpXCJcbiAgICAgICAgKG1vdXNlZW50ZXIpPVwib25Nb3VzZUVudGVyKClcIlxuICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJpdGVtQ2xpY2soJGV2ZW50KVwiXG4gICAgICAgIFtyb3V0ZXJMaW5rXT1cIml0ZW0ucm91dGVyTGlua1wiXG4gICAgICAgIFthdHRyLnRhcmdldF09XCJpdGVtLnRhcmdldFwiXG4gICAgICAgIFthdHRyLnRhYmluZGV4XT1cIjBcIlxuICAgICAgICBbbmdDbGFzc109XCJpdGVtLmNsYXNzTmFtZSA/PyAnJ1wiXG4gICAgICAgIHBSaXBwbGU+XG4gICAgICAgIDxpIFtuZ0NsYXNzXT1cIml0ZW0uaWNvbiA/PyAnJ1wiIGNsYXNzPVwibGF5b3V0LW1lbnVpdGVtLWljb25cIj48L2k+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwibGF5b3V0LW1lbnVpdGVtLXRleHRcIj57eyBpdGVtLmxhYmVsISB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgPGkgY2xhc3M9XCJwaSBwaS1mdyBwaS1hbmdsZS1kb3duIGxheW91dC1zdWJtZW51LXRvZ2dsZXJcIiAqbmdJZj1cIml0ZW0uaXRlbXNcIj48L2k+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwibWVudWl0ZW0tYmFkZ2VcIiAqbmdJZj1cIml0ZW0uYmFkZ2VcIj57eyBpdGVtLmJhZGdlIH19PC9zcGFuPlxuICAgIDwvYT5cbiAgICA8YVxuICAgICAgICAqbmdJZj1cIml0ZW0ucm91dGVyTGluayAmJiAhaXRlbS5pdGVtc1wiXG4gICAgICAgIChjbGljayk9XCJpdGVtQ2xpY2soJGV2ZW50KVwiXG4gICAgICAgIChtb3VzZWVudGVyKT1cImhvdmVyID0gdHJ1ZVwiXG4gICAgICAgIChtb3VzZWxlYXZlKT1cImhvdmVyID0gZmFsc2VcIlxuICAgICAgICBbcm91dGVyTGlua109XCJpdGVtLnJvdXRlckxpbmtcIlxuICAgICAgICByb3V0ZXJMaW5rQWN0aXZlPVwiYWN0aXZlLW1lbnVpdGVtLXJvdXRlcmxpbmtcIlxuICAgICAgICBbcm91dGVyTGlua0FjdGl2ZU9wdGlvbnNdPVwie3BhdGhzOiAnZXhhY3QnLCBtYXRyaXhQYXJhbXM6ICdpZ25vcmVkJywgcXVlcnlQYXJhbXM6ICdpZ25vcmVkJywgZnJhZ21lbnQ6ICdpZ25vcmVkJ31cIlxuICAgICAgICBbYXR0ci50YXJnZXRdPVwiaXRlbS50YXJnZXRcIlxuICAgICAgICBbYXR0ci50YWJpbmRleF09XCIwXCJcbiAgICAgICAgW25nQ2xhc3NdPVwiaXRlbS5jbGFzc05hbWUgPz8gJydcIlxuICAgICAgICBwUmlwcGxlPlxuICAgICAgICA8aSBbbmdDbGFzc109XCJpdGVtLmljb24gPz8gJydcIiBjbGFzcz1cImxheW91dC1tZW51aXRlbS1pY29uXCI+PC9pPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImxheW91dC1tZW51aXRlbS10ZXh0XCI+e3sgaXRlbS5sYWJlbCEgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgIDxpIGNsYXNzPVwicGkgcGktZncgcGktYW5nbGUtZG93biBsYXlvdXQtc3VibWVudS10b2dnbGVyXCIgKm5nSWY9XCJpdGVtLml0ZW1zXCI+PC9pPlxuICAgICAgICA8c3BhbiBjbGFzcz1cIm1lbnVpdGVtLWJhZGdlXCIgKm5nSWY9XCJpdGVtLmJhZGdlXCI+e3sgaXRlbS5iYWRnZSB9fTwvc3Bhbj5cbiAgICA8L2E+XG4gICAgPHVsXG4gICAgICAgICpuZ0lmPVwiaXRlbS5pdGVtcyB8fCAoaXRlbS5pdGVtcyAmJiAobW5nQ29tbW9ucy5tZW51TW9kZUlzU3RhdGljJCB8IGFzeW5jKSAmJiByb290KVwiXG4gICAgICAgIFtAY2hpbGRyZW5dPVwiXG4gICAgICAgICAgICAobW5nQ29tbW9ucy5tZW51TW9kZUlzU2xpbSQgfCBhc3luYykgJiYgKG1haW5MYXlvdXRTZXJ2aWNlLmlzTW9iaWxlJCB8IGFzeW5jKSA9PT0gZmFsc2UgJiYgcm9vdFxuICAgICAgICAgICAgICAgID8gYWN0aXZlXG4gICAgICAgICAgICAgICAgICAgID8gJ3Zpc2libGUnXG4gICAgICAgICAgICAgICAgICAgIDogJ2hpZGRlbidcbiAgICAgICAgICAgICAgICA6IChtbmdDb21tb25zLm1lbnVNb2RlSXNTdGF0aWMkIHwgYXN5bmMpICYmIHJvb3QgJiYgKG1haW5MYXlvdXRTZXJ2aWNlLmlzTW9iaWxlJCB8IGFzeW5jKSA9PT0gZmFsc2VcbiAgICAgICAgICAgICAgICA/ICd2aXNpYmxlJ1xuICAgICAgICAgICAgICAgIDogYWN0aXZlXG4gICAgICAgICAgICAgICAgPyAndmlzaWJsZUFuaW1hdGVkJ1xuICAgICAgICAgICAgICAgIDogJ2hpZGRlbkFuaW1hdGVkJ1xuICAgICAgICBcIj5cbiAgICAgICAgPG5nLXRlbXBsYXRlIG5nRm9yIGxldC1jaGlsZCBsZXQtaT1cImluZGV4XCIgW25nRm9yT2ZdPVwiaXRlbS5pdGVtc1wiPlxuICAgICAgICAgICAgPGxpIG1uZy1tZW51aXRlbSBbaXRlbV09XCJjaGlsZFwiIFtpbmRleF09XCJpXCIgW3BhcmVudEtleV09XCJrZXlcIiBbY2xhc3NdPVwiY2hpbGQuYmFkZ2VDbGFzc05hbWVcIiAodmlzaWJsZUNoYW5nZSk9XCJvbkNoaWxkVmlzaWJsZUNoYW5nZSgkZXZlbnQsIGl0ZW0sIGkpXCI+PC9saT5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L3VsPlxuPC9uZy1jb250YWluZXI+XG4iXX0=