@sumaris-net/ngx-components 2.6.17 → 4.0.0-rc1

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 (721) hide show
  1. package/esm2022/public_api.mjs +337 -0
  2. package/{esm2020 → esm2022}/src/app/admin/admin-routing.module.mjs +8 -8
  3. package/{esm2020 → esm2022}/src/app/admin/admin.module.mjs +11 -11
  4. package/esm2022/src/app/admin/services/filter/person.filter.mjs +68 -0
  5. package/esm2022/src/app/admin/services/person.service.mjs +174 -0
  6. package/esm2022/src/app/admin/services/validator/person.validator.mjs +72 -0
  7. package/esm2022/src/app/admin/users/users.mjs +273 -0
  8. package/esm2022/src/app/admin/users/users.module.mjs +58 -0
  9. package/esm2022/src/app/core/about/about.modal.mjs +84 -0
  10. package/{esm2020 → esm2022}/src/app/core/about/about.module.mjs +9 -9
  11. package/{esm2020 → esm2022}/src/app/core/account/account.module.mjs +22 -22
  12. package/esm2022/src/app/core/account/account.page.mjs +335 -0
  13. package/esm2022/src/app/core/account/new-token.modal.mjs +125 -0
  14. package/esm2022/src/app/core/account/token.table.mjs +141 -0
  15. package/esm2022/src/app/core/auth/auth.form.mjs +140 -0
  16. package/esm2022/src/app/core/auth/auth.modal.mjs +76 -0
  17. package/{esm2020 → esm2022}/src/app/core/auth/auth.module.mjs +16 -16
  18. package/{esm2020 → esm2022}/src/app/core/core.module.mjs +87 -87
  19. package/esm2022/src/app/core/core.testing.module.mjs +93 -0
  20. package/esm2022/src/app/core/form/buttons/form-buttons-bar.component.mjs +109 -0
  21. package/{esm2020 → esm2022}/src/app/core/form/buttons/form-buttons-bar.module.mjs +10 -10
  22. package/esm2022/src/app/core/form/entity/editor.class.mjs +713 -0
  23. package/esm2022/src/app/core/form/entity/entity-editor-modal.class.mjs +436 -0
  24. package/esm2022/src/app/core/form/entity/entity-editor.class.mjs +724 -0
  25. package/esm2022/src/app/core/form/entity/entity-metadata.component.mjs +24 -0
  26. package/{esm2020 → esm2022}/src/app/core/form/entity/entity.module.mjs +11 -11
  27. package/esm2022/src/app/core/form/form.class.mjs +353 -0
  28. package/{esm2020 → esm2022}/src/app/core/form/form.module.mjs +30 -30
  29. package/{esm2020 → esm2022}/src/app/core/form/form.utils.mjs +69 -60
  30. package/esm2022/src/app/core/form/list/list.form.mjs +233 -0
  31. package/{esm2020 → esm2022}/src/app/core/form/list/list.module.mjs +10 -10
  32. package/esm2022/src/app/core/form/properties/properties.form.mjs +143 -0
  33. package/{esm2020 → esm2022}/src/app/core/form/properties/properties.module.mjs +13 -13
  34. package/esm2022/src/app/core/form/properties/properties.table.mjs +269 -0
  35. package/esm2022/src/app/core/form/properties/property.validator.mjs +24 -0
  36. package/esm2022/src/app/core/form/properties/testing/properties-form.test.mjs +95 -0
  37. package/{esm2020 → esm2022}/src/app/core/form/properties/testing/properties-form.testing.module.mjs +11 -11
  38. package/esm2022/src/app/core/form/text-popover/testing/text-popover.testing.mjs +73 -0
  39. package/{esm2020 → esm2022}/src/app/core/form/text-popover/testing/text-popover.testing.module.mjs +10 -10
  40. package/esm2022/src/app/core/form/text-popover/text-form.component.mjs +97 -0
  41. package/{esm2020 → esm2022}/src/app/core/form/text-popover/text-popover.component.mjs +26 -20
  42. package/{esm2020 → esm2022}/src/app/core/form/text-popover/text-popover.module.mjs +12 -12
  43. package/{esm2020 → esm2022}/src/app/core/graphql/graphql.module.mjs +5 -5
  44. package/esm2022/src/app/core/graphql/graphql.service.mjs +787 -0
  45. package/{esm2020 → esm2022}/src/app/core/graphql/graphql.utils.mjs +2 -1
  46. package/esm2022/src/app/core/home/home.mjs +283 -0
  47. package/esm2022/src/app/core/home/home.module.mjs +51 -0
  48. package/esm2022/src/app/core/icon/icon.component.mjs +40 -0
  49. package/{esm2020 → esm2022}/src/app/core/icon/icon.module.mjs +7 -7
  50. package/esm2022/src/app/core/install/install-upgrade-card.component.mjs +358 -0
  51. package/{esm2020 → esm2022}/src/app/core/install/install-upgrade-card.module.mjs +10 -10
  52. package/esm2022/src/app/core/menu/menu.component.mjs +260 -0
  53. package/esm2022/src/app/core/menu/menu.model.mjs +268 -0
  54. package/esm2022/src/app/core/menu/menu.module.mjs +52 -0
  55. package/esm2022/src/app/core/menu/menu.service.mjs +665 -0
  56. package/esm2022/src/app/core/menu/sub-menu-tab.directive.mjs +109 -0
  57. package/{esm2020 → esm2022}/src/app/core/menu/testing/menu-other.testing.mjs +4 -4
  58. package/esm2022/src/app/core/menu/testing/menu.testing.mjs +122 -0
  59. package/{esm2020 → esm2022}/src/app/core/menu/testing/menu.testing.module.mjs +12 -12
  60. package/esm2022/src/app/core/offline/update-offline-mode-card.component.mjs +29 -0
  61. package/{esm2020 → esm2022}/src/app/core/offline/update-offline-mode-card.module.mjs +10 -10
  62. package/esm2022/src/app/core/peer/select-peer.modal.mjs +192 -0
  63. package/{esm2020 → esm2022}/src/app/core/peer/select-peer.module.mjs +13 -13
  64. package/esm2022/src/app/core/register/register-confirm.page.mjs +88 -0
  65. package/esm2022/src/app/core/register/register.form.mjs +194 -0
  66. package/esm2022/src/app/core/register/register.modal.mjs +55 -0
  67. package/{esm2020 → esm2022}/src/app/core/register/register.module.mjs +13 -13
  68. package/esm2022/src/app/core/services/account.service.mjs +1217 -0
  69. package/esm2022/src/app/core/services/auth-guard.service.mjs +76 -0
  70. package/esm2022/src/app/core/services/base-entity-service.class.mjs +482 -0
  71. package/esm2022/src/app/core/services/base-graphql-service.class.mjs +224 -0
  72. package/esm2022/src/app/core/services/base58.mjs +79 -0
  73. package/{esm2020 → esm2022}/src/app/core/services/config/core.config.mjs +4 -4
  74. package/esm2022/src/app/core/services/config.service.mjs +365 -0
  75. package/esm2022/src/app/core/services/crypto.service.mjs +107 -0
  76. package/esm2022/src/app/core/services/local-settings.service.mjs +468 -0
  77. package/esm2022/src/app/core/services/model/account.model.mjs +153 -0
  78. package/esm2022/src/app/core/services/model/config.model.mjs +105 -0
  79. package/esm2022/src/app/core/services/model/department.model.mjs +33 -0
  80. package/esm2022/src/app/core/services/model/entity.decorators.mjs +97 -0
  81. package/esm2022/src/app/core/services/model/entity.model.mjs +228 -0
  82. package/esm2022/src/app/core/services/model/peer.model.mjs +82 -0
  83. package/esm2022/src/app/core/services/model/person.model.mjs +109 -0
  84. package/esm2022/src/app/core/services/model/referential.model.mjs +185 -0
  85. package/esm2022/src/app/core/services/model/token.model.mjs +52 -0
  86. package/esm2022/src/app/core/services/network.service.mjs +608 -0
  87. package/{esm2020 → esm2022}/src/app/core/services/pipes/account.pipes.mjs +9 -9
  88. package/{esm2020 → esm2022}/src/app/core/services/pipes/department-to-string.pipe.mjs +5 -5
  89. package/{esm2020 → esm2022}/src/app/core/services/pipes/person-to-string.pipe.mjs +5 -5
  90. package/{esm2020 → esm2022}/src/app/core/services/pipes/usage-mode.pipes.mjs +9 -9
  91. package/esm2022/src/app/core/services/platform.service.mjs +546 -0
  92. package/esm2022/src/app/core/services/storage/entities-storage.service.mjs +434 -0
  93. package/esm2022/src/app/core/services/storage/entity-store.class.mjs +458 -0
  94. package/esm2022/src/app/core/services/testing/referential-filter.model.mjs +25 -0
  95. package/esm2022/src/app/core/services/testing/referential.validator.mjs +46 -0
  96. package/esm2022/src/app/core/services/validator/account.validator.mjs +45 -0
  97. package/esm2022/src/app/core/services/validator/base.validator.class.mjs +49 -0
  98. package/esm2022/src/app/core/services/validator/local-settings.validator.mjs +67 -0
  99. package/{esm2020 → esm2022}/src/app/core/services/validator/user-settings.validator.mjs +4 -4
  100. package/{esm2020 → esm2022}/src/app/core/services/validator/user-token.validator.mjs +4 -4
  101. package/{esm2020 → esm2022}/src/app/core/settings/settings.module.mjs +9 -9
  102. package/esm2022/src/app/core/settings/settings.page.mjs +328 -0
  103. package/esm2022/src/app/core/table/actions-column.component.mjs +115 -0
  104. package/esm2022/src/app/core/table/async-table.class.mjs +1735 -0
  105. package/esm2022/src/app/core/table/entities-async-table-datasource.class.mjs +386 -0
  106. package/esm2022/src/app/core/table/entities-table-datasource.class.mjs +401 -0
  107. package/esm2022/src/app/core/table/memory-table.class.mjs +57 -0
  108. package/esm2022/src/app/core/table/table-select-columns.component.mjs +46 -0
  109. package/esm2022/src/app/core/table/table.class.mjs +1771 -0
  110. package/esm2022/src/app/core/table/table.model.mjs +16 -0
  111. package/{esm2020 → esm2022}/src/app/core/table/table.module.mjs +12 -12
  112. package/esm2022/src/app/core/table/testing/table-validator.service.mjs +28 -0
  113. package/esm2022/src/app/core/table/testing/table.testing.mjs +291 -0
  114. package/esm2022/src/app/core/table/testing/table.testing.module.mjs +50 -0
  115. package/esm2022/src/app/core/table/testing/table2-validator.service.mjs +25 -0
  116. package/esm2022/src/app/core/table/testing/table2.testing.mjs +250 -0
  117. package/esm2022/src/app/shared/audio/audio.mjs +251 -0
  118. package/esm2022/src/app/shared/audio/audio.testing.mjs +32 -0
  119. package/{esm2020 → esm2022}/src/app/shared/audio/audio.testing.module.mjs +10 -10
  120. package/esm2022/src/app/shared/capacitor/keyboard.mjs +42 -0
  121. package/esm2022/src/app/shared/capacitor/plugins.mjs +9 -0
  122. package/esm2022/src/app/shared/dates.mjs +149 -0
  123. package/esm2022/src/app/shared/debug/debug.component.mjs +40 -0
  124. package/{esm2020 → esm2022}/src/app/shared/debug/debug.module.mjs +14 -14
  125. package/esm2022/src/app/shared/directives/autofocus.directive.mjs +98 -0
  126. package/esm2022/src/app/shared/directives/autotitle.directive.mjs +32 -0
  127. package/{esm2020 → esm2022}/src/app/shared/directives/directives.module.mjs +13 -13
  128. package/esm2022/src/app/shared/directives/drag-and-drop.directive.mjs +52 -0
  129. package/esm2022/src/app/shared/directives/ng-var.directive.mjs +33 -0
  130. package/esm2022/src/app/shared/directives/resizable/resizable.component.mjs +62 -0
  131. package/esm2022/src/app/shared/directives/resizable/resizable.directive.mjs +45 -0
  132. package/{esm2020 → esm2022}/src/app/shared/directives/resizable/resizable.module.mjs +5 -5
  133. package/esm2022/src/app/shared/file/file.service.mjs +122 -0
  134. package/{esm2020 → esm2022}/src/app/shared/file/file.utils.mjs +2 -2
  135. package/esm2022/src/app/shared/form/field.component.mjs +353 -0
  136. package/{esm2020 → esm2022}/src/app/shared/form/field.model.mjs +1 -1
  137. package/esm2022/src/app/shared/form/loading-spinner.mjs +35 -0
  138. package/{esm2020 → esm2022}/src/app/shared/functions.mjs +5 -4
  139. package/esm2022/src/app/shared/geolocation/geolocation.utils.mjs +82 -0
  140. package/esm2022/src/app/shared/gesture/gesture-config.mjs +46 -0
  141. package/esm2022/src/app/shared/graph/graph-colors.mjs +219 -0
  142. package/esm2022/src/app/shared/guard/component-dirty.guard.mjs +59 -0
  143. package/esm2022/src/app/shared/help/help.modal.mjs +63 -0
  144. package/esm2022/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.mjs +24 -0
  145. package/esm2022/src/app/shared/hotkeys/hotkeys.service.mjs +85 -0
  146. package/{esm2020 → esm2022}/src/app/shared/hotkeys/shared-hotkeys.module.mjs +13 -13
  147. package/esm2022/src/app/shared/image/gallery/image-gallery.component.mjs +388 -0
  148. package/{esm2020 → esm2022}/src/app/shared/image/gallery/image-gallery.module.mjs +22 -22
  149. package/esm2022/src/app/shared/image/gallery/testing/gallegry.model.testing.mjs +26 -0
  150. package/esm2022/src/app/shared/image/gallery/testing/gallery.service.testing.mjs +90 -0
  151. package/esm2022/src/app/shared/image/gallery/testing/gallery.testing.mjs +41 -0
  152. package/{esm2020 → esm2022}/src/app/shared/image/gallery/testing/gallery.testing.module.mjs +16 -16
  153. package/{esm2020 → esm2022}/src/app/shared/image/image.module.mjs +11 -11
  154. package/esm2022/src/app/shared/image/image.service.mjs +104 -0
  155. package/esm2022/src/app/shared/inputs.mjs +231 -0
  156. package/esm2022/src/app/shared/interceptors/progess.interceptor.mjs +28 -0
  157. package/esm2022/src/app/shared/logging/logging-service.class.mjs +128 -0
  158. package/{esm2020 → esm2022}/src/app/shared/logging/logging-service.module.mjs +8 -8
  159. package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.config.mjs +49 -0
  160. package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.mjs +961 -0
  161. package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.module.mjs +82 -0
  162. package/esm2022/src/app/shared/material/autocomplete/testing/autocomplete.test.mjs +217 -0
  163. package/esm2022/src/app/shared/material/badge/badge.directive.mjs +209 -0
  164. package/{esm2020 → esm2022}/src/app/shared/material/badge/badge.module.mjs +9 -9
  165. package/esm2022/src/app/shared/material/badge/badge.test.mjs +42 -0
  166. package/esm2022/src/app/shared/material/boolean/boolean.module.mjs +72 -0
  167. package/esm2022/src/app/shared/material/boolean/material-boolean2.mjs +266 -0
  168. package/esm2022/src/app/shared/material/boolean/material.boolean.mjs +271 -0
  169. package/esm2022/src/app/shared/material/boolean/testing/boolean.test.page.mjs +54 -0
  170. package/esm2022/src/app/shared/material/chips/chips.module.mjs +76 -0
  171. package/esm2022/src/app/shared/material/chips/material.chips.mjs +719 -0
  172. package/esm2022/src/app/shared/material/chips/testing/chips.test.mjs +148 -0
  173. package/{esm2020 → esm2022}/src/app/shared/material/datetime/datetime.module.mjs +38 -38
  174. package/esm2022/src/app/shared/material/datetime/material.date.mjs +396 -0
  175. package/esm2022/src/app/shared/material/datetime/material.dateshort.mjs +406 -0
  176. package/esm2022/src/app/shared/material/datetime/material.datetime.mjs +523 -0
  177. package/esm2022/src/app/shared/material/datetime/testing/mat-date-time.test.mjs +125 -0
  178. package/esm2022/src/app/shared/material/datetime/testing/mat-date.test.mjs +122 -0
  179. package/esm2022/src/app/shared/material/datetime/testing/mat-dateshort.test.mjs +115 -0
  180. package/esm2022/src/app/shared/material/duration/duration.module.mjs +70 -0
  181. package/{esm2020 → esm2022}/src/app/shared/material/duration/duration.utils.mjs +2 -2
  182. package/esm2022/src/app/shared/material/duration/material.duration.mjs +273 -0
  183. package/esm2022/src/app/shared/material/duration/testing/mat-duration.test.mjs +79 -0
  184. package/{esm2020 → esm2022}/src/app/shared/material/latlong/latlong.utils.mjs +3 -3
  185. package/esm2022/src/app/shared/material/latlong/material.latlong.mjs +415 -0
  186. package/esm2022/src/app/shared/material/latlong/material.latlong.module.mjs +72 -0
  187. package/esm2022/src/app/shared/material/latlong/testing/latlong.test.mjs +113 -0
  188. package/esm2022/src/app/shared/material/material.module.mjs +224 -0
  189. package/esm2022/src/app/shared/material/material.testing.module.mjs +210 -0
  190. package/esm2022/src/app/shared/material/numpad/numpad.append-to-input.directive.mjs +104 -0
  191. package/esm2022/src/app/shared/material/numpad/numpad.component.mjs +83 -0
  192. package/esm2022/src/app/shared/material/numpad/numpad.container.mjs +203 -0
  193. package/esm2022/src/app/shared/material/numpad/numpad.content.mjs +19 -0
  194. package/esm2022/src/app/shared/material/numpad/numpad.directive.mjs +168 -0
  195. package/esm2022/src/app/shared/material/numpad/numpad.dom-service.mjs +36 -0
  196. package/esm2022/src/app/shared/material/numpad/numpad.model.mjs +16 -0
  197. package/{esm2020 → esm2022}/src/app/shared/material/numpad/numpad.module.mjs +21 -21
  198. package/esm2022/src/app/shared/material/numpad/testing/numpad.test.mjs +48 -0
  199. package/esm2022/src/app/shared/material/paginator/material.paginator-i18n.mjs +48 -0
  200. package/esm2022/src/app/shared/material/stepper/material.stepper-i18n.mjs +23 -0
  201. package/esm2022/src/app/shared/material/swipe/material.swipe.mjs +368 -0
  202. package/esm2022/src/app/shared/material/swipe/swipe.module.mjs +56 -0
  203. package/esm2022/src/app/shared/material/swipe/testing/swipe.test.mjs +67 -0
  204. package/esm2022/src/app/shared/material/testing/common.test.mjs +105 -0
  205. package/esm2022/src/app/shared/named-filter/named-filter-selector.component.mjs +212 -0
  206. package/esm2022/src/app/shared/named-filter/named-filter.model.mjs +49 -0
  207. package/{esm2020 → esm2022}/src/app/shared/named-filter/named-filter.module.mjs +5 -5
  208. package/esm2022/src/app/shared/named-filter/named-filter.service.mjs +69 -0
  209. package/{esm2020 → esm2022}/src/app/shared/pipes/arrays.pipe.mjs +25 -25
  210. package/esm2022/src/app/shared/pipes/colors.pipe.mjs +27 -0
  211. package/esm2022/src/app/shared/pipes/date-diff-duration.pipe.mjs +51 -0
  212. package/esm2022/src/app/shared/pipes/date-format.pipe.mjs +72 -0
  213. package/esm2022/src/app/shared/pipes/date-from-now.pipe.mjs +28 -0
  214. package/esm2022/src/app/shared/pipes/duration.pipe.mjs +36 -0
  215. package/esm2022/src/app/shared/pipes/file-size.pipe.mjs +60 -0
  216. package/esm2022/src/app/shared/pipes/form.pipes.mjs +194 -0
  217. package/{esm2020 → esm2022}/src/app/shared/pipes/highlight.pipe.mjs +5 -5
  218. package/esm2022/src/app/shared/pipes/latlong-format.pipe.mjs +42 -0
  219. package/{esm2020 → esm2022}/src/app/shared/pipes/maps.pipe.mjs +13 -13
  220. package/esm2022/src/app/shared/pipes/maskito.pipe.mjs +118 -0
  221. package/{esm2020 → esm2022}/src/app/shared/pipes/math.pipes.mjs +13 -13
  222. package/esm2022/src/app/shared/pipes/ng-init.pipe.mjs +19 -0
  223. package/{esm2020 → esm2022}/src/app/shared/pipes/number-format.pipe.mjs +5 -5
  224. package/esm2022/src/app/shared/pipes/pipes.module.mjs +256 -0
  225. package/esm2022/src/app/shared/pipes/property.pipes.mjs +97 -0
  226. package/esm2022/src/app/shared/pipes/string.pipes.mjs +135 -0
  227. package/esm2022/src/app/shared/pipes/translate-context.pipe.mjs +44 -0
  228. package/esm2022/src/app/shared/pipes/types.pipes.mjs +58 -0
  229. package/esm2022/src/app/shared/rx-state.module.mjs +23 -0
  230. package/esm2022/src/app/shared/services/entity-service.class.mjs +7 -0
  231. package/esm2022/src/app/shared/services/memory-entity-service.class.mjs +347 -0
  232. package/esm2022/src/app/shared/services/progress-bar.service.mjs +31 -0
  233. package/esm2022/src/app/shared/services/startable-observable-service.class.mjs +121 -0
  234. package/esm2022/src/app/shared/services/startable-service.class.mjs +113 -0
  235. package/esm2022/src/app/shared/services/translate-context.service.mjs +104 -0
  236. package/{esm2020 → esm2022}/src/app/shared/shared-routing.module.mjs +11 -11
  237. package/esm2022/src/app/shared/shared.module.mjs +217 -0
  238. package/{esm2020 → esm2022}/src/app/shared/shared.testing.module.mjs +40 -40
  239. package/esm2022/src/app/shared/storage/storage-explorer.component.mjs +286 -0
  240. package/esm2022/src/app/shared/storage/storage-explorer.module.mjs +46 -0
  241. package/{esm2020 → esm2022}/src/app/shared/storage/storage-explorer.testing-routing.module.mjs +7 -7
  242. package/{esm2020 → esm2022}/src/app/shared/storage/storage-explorer.testing.module.mjs +6 -6
  243. package/esm2022/src/app/shared/storage/storage.service.mjs +134 -0
  244. package/{esm2020 → esm2022}/src/app/shared/storage/storage.utils.mjs +1 -1
  245. package/esm2022/src/app/shared/testing/observable.test.mjs +96 -0
  246. package/esm2022/src/app/shared/testing/tests.page.mjs +37 -0
  247. package/esm2022/src/app/shared/toast/toast.testing.mjs +52 -0
  248. package/{esm2020 → esm2022}/src/app/shared/toast/toast.testing.module.mjs +10 -10
  249. package/esm2022/src/app/shared/toast/toasts.mjs +144 -0
  250. package/esm2022/src/app/shared/toolbar/modal-toolbar.mjs +60 -0
  251. package/esm2022/src/app/shared/toolbar/toolbar.mjs +264 -0
  252. package/esm2022/src/app/shared/toolbar/toolbar.module.mjs +57 -0
  253. package/esm2022/src/app/shared/upload-file/testing/upload-file.testing.mjs +59 -0
  254. package/{esm2020 → esm2022}/src/app/shared/upload-file/testing/upload-file.testing.module.mjs +10 -10
  255. package/esm2022/src/app/shared/upload-file/upload-file-popover.component.mjs +107 -0
  256. package/esm2022/src/app/shared/upload-file/upload-file.component.mjs +211 -0
  257. package/esm2022/src/app/shared/upload-file/upload-file.model.mjs +27 -0
  258. package/esm2022/src/app/shared/validator/form-error-adapter.class.mjs +106 -0
  259. package/esm2022/src/app/shared/validator/validators.mjs +580 -0
  260. package/esm2022/src/app/shared/version/versions.mjs +81 -0
  261. package/esm2022/src/app/social/job/job.module.mjs +42 -0
  262. package/esm2022/src/app/social/job/progression/job-progression.component.mjs +35 -0
  263. package/esm2022/src/app/social/job/progression/job-progression.icon.mjs +232 -0
  264. package/esm2022/src/app/social/job/progression/job-progression.list.mjs +50 -0
  265. package/esm2022/src/app/social/job/progression/job-progression.model.mjs +28 -0
  266. package/esm2022/src/app/social/job/progression/job-progression.service.mjs +73 -0
  267. package/esm2022/src/app/social/job/testing/job-progression.testing.mjs +43 -0
  268. package/esm2022/src/app/social/job/testing/job-progression.testing.service.mjs +53 -0
  269. package/{esm2020 → esm2022}/src/app/social/job/testing/job.testing.module.mjs +9 -9
  270. package/esm2022/src/app/social/message/message.form.mjs +88 -0
  271. package/esm2022/src/app/social/message/message.modal.mjs +102 -0
  272. package/esm2022/src/app/social/message/message.model.mjs +71 -0
  273. package/esm2022/src/app/social/message/message.module.mjs +35 -0
  274. package/esm2022/src/app/social/message/message.service.mjs +88 -0
  275. package/{esm2020 → esm2022}/src/app/social/social.module.mjs +19 -19
  276. package/{esm2020 → esm2022}/src/app/social/social.testing.module.mjs +10 -10
  277. package/esm2022/src/app/social/user-event/notification/user-event-notification.icon.mjs +123 -0
  278. package/esm2022/src/app/social/user-event/notification/user-event-notification.list.mjs +263 -0
  279. package/esm2022/src/app/social/user-event/testing/user-event.testing.mjs +233 -0
  280. package/esm2022/src/app/social/user-event/testing/user-event.testing.model.mjs +128 -0
  281. package/{esm2020 → esm2022}/src/app/social/user-event/testing/user-event.testing.module.mjs +9 -9
  282. package/esm2022/src/app/social/user-event/testing/user-event.testing.service.mjs +116 -0
  283. package/esm2022/src/app/social/user-event/user-event.module.mjs +43 -0
  284. package/esm2022/src/app/social/user-event/user-event.service.mjs +498 -0
  285. package/esm2022/src/environments/environment.class.mjs +47 -0
  286. package/esm2022/src/environments/environment.mjs +94 -0
  287. package/{fesm2020 → fesm2022}/sumaris-net.ngx-components.mjs +12191 -10087
  288. package/fesm2022/sumaris-net.ngx-components.mjs.map +1 -0
  289. package/package.json +11 -16
  290. package/public_api.d.ts +12 -5
  291. package/src/app/admin/users/users.d.ts +1 -1
  292. package/src/app/admin/users/users.module.d.ts +2 -1
  293. package/src/app/core/about/about.modal.d.ts +1 -1
  294. package/src/app/core/account/account.page.d.ts +3 -4
  295. package/src/app/core/account/new-token.modal.d.ts +1 -1
  296. package/src/app/core/account/token.table.d.ts +1 -1
  297. package/src/app/core/auth/auth.form.d.ts +1 -1
  298. package/src/app/core/auth/auth.modal.d.ts +1 -1
  299. package/src/app/core/form/buttons/form-buttons-bar.component.d.ts +2 -2
  300. package/src/app/core/form/entity/editor.class.d.ts +4 -4
  301. package/src/app/core/form/entity/entity-editor-modal.class.d.ts +1 -1
  302. package/src/app/core/form/entity/entity-editor.class.d.ts +6 -10
  303. package/src/app/core/form/entity/entity-metadata.component.d.ts +1 -1
  304. package/src/app/core/form/form.class.d.ts +1 -1
  305. package/src/app/core/form/list/list.form.d.ts +1 -1
  306. package/src/app/core/form/properties/properties.form.d.ts +1 -1
  307. package/src/app/core/form/properties/properties.table.d.ts +2 -3
  308. package/src/app/core/form/properties/property.validator.d.ts +1 -1
  309. package/src/app/core/form/properties/testing/properties-form.test.d.ts +1 -1
  310. package/src/app/core/form/text-popover/testing/text-popover.testing.d.ts +1 -1
  311. package/src/app/core/form/text-popover/text-form.component.d.ts +1 -1
  312. package/src/app/core/form/text-popover/text-popover.component.d.ts +1 -1
  313. package/src/app/core/home/home.d.ts +1 -1
  314. package/src/app/core/home/home.module.d.ts +4 -3
  315. package/src/app/core/icon/icon.component.d.ts +1 -1
  316. package/src/app/core/install/install-upgrade-card.component.d.ts +1 -1
  317. package/src/app/core/menu/menu.component.d.ts +4 -8
  318. package/src/app/core/menu/menu.model.d.ts +0 -1
  319. package/src/app/core/menu/menu.module.d.ts +3 -5
  320. package/src/app/core/menu/menu.service.d.ts +1 -3
  321. package/src/app/core/menu/sub-menu-tab.directive.d.ts +1 -1
  322. package/src/app/core/menu/testing/menu-other.testing.d.ts +1 -1
  323. package/src/app/core/menu/testing/menu.testing.d.ts +1 -1
  324. package/src/app/core/offline/update-offline-mode-card.component.d.ts +1 -1
  325. package/src/app/core/peer/select-peer.modal.d.ts +1 -1
  326. package/src/app/core/register/register-confirm.page.d.ts +1 -1
  327. package/src/app/core/register/register.form.d.ts +1 -1
  328. package/src/app/core/register/register.modal.d.ts +1 -1
  329. package/src/app/core/services/account.service.d.ts +0 -4
  330. package/src/app/core/services/base-entity-service.class.d.ts +2 -2
  331. package/src/app/core/services/base-graphql-service.class.d.ts +1 -1
  332. package/src/app/core/services/config/core.config.d.ts +1 -1
  333. package/src/app/core/services/model/person.model.d.ts +1 -1
  334. package/src/app/core/services/model/referential.model.d.ts +1 -2
  335. package/src/app/core/services/model/settings.model.d.ts +1 -1
  336. package/src/app/core/services/network.types.d.ts +2 -2
  337. package/src/app/core/services/storage/entity-store.class.d.ts +1 -1
  338. package/src/app/core/services/validator/base.validator.class.d.ts +1 -1
  339. package/src/app/core/settings/settings.page.d.ts +1 -1
  340. package/src/app/core/table/actions-column.component.d.ts +2 -2
  341. package/src/app/core/table/async-table.class.d.ts +1 -1
  342. package/src/app/core/table/entities-async-table-datasource.class.d.ts +1 -1
  343. package/src/app/core/table/entities-table-datasource.class.d.ts +1 -1
  344. package/src/app/core/table/memory-table.class.d.ts +3 -3
  345. package/src/app/core/table/table-select-columns.component.d.ts +1 -1
  346. package/src/app/core/table/table.class.d.ts +3 -3
  347. package/src/app/core/table/table.model.d.ts +1 -1
  348. package/src/app/core/table/testing/table.testing.d.ts +5 -4
  349. package/src/app/core/table/testing/table.testing.module.d.ts +8 -5
  350. package/src/app/core/table/testing/table2-validator.service.d.ts +15 -0
  351. package/src/app/core/table/testing/table2.testing.d.ts +45 -0
  352. package/src/app/shared/audio/audio.d.ts +1 -1
  353. package/src/app/shared/audio/audio.testing.d.ts +1 -1
  354. package/src/app/shared/debug/debug.component.d.ts +1 -1
  355. package/src/app/shared/directives/autofocus.directive.d.ts +1 -1
  356. package/src/app/shared/directives/autotitle.directive.d.ts +1 -1
  357. package/src/app/shared/directives/drag-and-drop.directive.d.ts +1 -1
  358. package/src/app/shared/directives/ng-var.directive.d.ts +1 -1
  359. package/src/app/shared/directives/resizable/resizable.component.d.ts +1 -1
  360. package/src/app/shared/directives/resizable/resizable.directive.d.ts +1 -1
  361. package/src/app/shared/events.d.ts +1 -1
  362. package/src/app/shared/form/field.component.d.ts +4 -5
  363. package/src/app/shared/form/field.model.d.ts +2 -0
  364. package/src/app/shared/form/loading-spinner.d.ts +1 -1
  365. package/src/app/shared/functions.d.ts +2 -2
  366. package/src/app/shared/help/help.modal.d.ts +2 -2
  367. package/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.d.ts +1 -1
  368. package/src/app/shared/hotkeys/hotkeys.service.d.ts +3 -3
  369. package/src/app/shared/image/gallery/image-gallery.component.d.ts +3 -3
  370. package/src/app/shared/image/gallery/testing/gallery.testing.d.ts +2 -2
  371. package/src/app/shared/inputs.d.ts +1 -1
  372. package/src/app/shared/material/autocomplete/material.autocomplete.d.ts +9 -9
  373. package/src/app/shared/material/autocomplete/material.autocomplete.module.d.ts +10 -9
  374. package/src/app/shared/material/autocomplete/testing/autocomplete.test.d.ts +1 -1
  375. package/src/app/shared/material/badge/badge.directive.d.ts +1 -1
  376. package/src/app/shared/material/badge/badge.test.d.ts +1 -1
  377. package/src/app/shared/material/boolean/boolean.module.d.ts +12 -11
  378. package/src/app/shared/material/boolean/material-boolean2.d.ts +66 -0
  379. package/src/app/shared/material/boolean/material.boolean.d.ts +5 -4
  380. package/src/app/shared/material/boolean/testing/boolean.test.page.d.ts +21 -0
  381. package/src/app/shared/material/chips/material.chips.d.ts +8 -9
  382. package/src/app/shared/material/chips/testing/chips.test.d.ts +2 -2
  383. package/src/app/shared/material/datetime/datetime.module.d.ts +2 -2
  384. package/src/app/shared/material/datetime/material.date.d.ts +5 -4
  385. package/src/app/shared/material/datetime/material.dateshort.d.ts +8 -7
  386. package/src/app/shared/material/datetime/material.datetime.d.ts +8 -6
  387. package/src/app/shared/material/datetime/testing/mat-date-time.test.d.ts +7 -1
  388. package/src/app/shared/material/datetime/testing/mat-date.test.d.ts +3 -1
  389. package/src/app/shared/material/datetime/testing/mat-dateshort.test.d.ts +3 -1
  390. package/src/app/shared/material/duration/duration.module.d.ts +6 -5
  391. package/src/app/shared/material/duration/material.duration.d.ts +6 -5
  392. package/src/app/shared/material/duration/testing/mat-duration.test.d.ts +22 -0
  393. package/src/app/shared/material/latlong/material.latlong.d.ts +8 -7
  394. package/src/app/shared/material/latlong/material.latlong.module.d.ts +9 -8
  395. package/src/app/shared/material/latlong/testing/latlong.test.d.ts +3 -1
  396. package/src/app/shared/material/material.testing.module.d.ts +22 -18
  397. package/src/app/shared/material/numpad/numpad.append-to-input.directive.d.ts +1 -1
  398. package/src/app/shared/material/numpad/numpad.component.d.ts +1 -1
  399. package/src/app/shared/material/numpad/numpad.container.d.ts +1 -1
  400. package/src/app/shared/material/numpad/numpad.content.d.ts +1 -1
  401. package/src/app/shared/material/numpad/numpad.directive.d.ts +1 -1
  402. package/src/app/shared/material/numpad/numpad.dom-service.d.ts +3 -3
  403. package/src/app/shared/material/numpad/testing/numpad.test.d.ts +1 -1
  404. package/src/app/shared/material/paginator/material.paginator-i18n.d.ts +0 -3
  405. package/src/app/shared/material/swipe/material.swipe.d.ts +6 -6
  406. package/src/app/shared/material/swipe/swipe.module.d.ts +2 -1
  407. package/src/app/shared/material/swipe/testing/swipe.test.d.ts +1 -1
  408. package/src/app/shared/material/testing/common.test.d.ts +25 -0
  409. package/src/app/shared/named-filter/named-filter-selector.component.d.ts +1 -1
  410. package/src/app/shared/named-filter/named-filter.service.d.ts +1 -1
  411. package/src/app/shared/pipes/maskito.pipe.d.ts +16 -0
  412. package/src/app/shared/pipes/ng-init.pipe.d.ts +1 -1
  413. package/src/app/shared/pipes/pipes.module.d.ts +5 -4
  414. package/src/app/shared/pipes/string.pipes.d.ts +6 -0
  415. package/src/app/shared/pipes/types.pipes.d.ts +7 -0
  416. package/src/app/shared/rx-state.module.d.ts +10 -0
  417. package/src/app/shared/services/entity-service.class.d.ts +1 -1
  418. package/src/app/shared/services/job.utils.d.ts +1 -1
  419. package/src/app/shared/services/memory-entity-service.class.d.ts +1 -1
  420. package/src/app/shared/services/startable-observable-service.class.d.ts +3 -0
  421. package/src/app/shared/services/startable-service.class.d.ts +3 -0
  422. package/src/app/shared/shared.module.d.ts +7 -9
  423. package/src/app/shared/storage/storage-explorer.component.d.ts +1 -1
  424. package/src/app/shared/storage/storage-explorer.module.d.ts +3 -3
  425. package/src/app/shared/storage/storage.service.d.ts +1 -1
  426. package/src/app/shared/storage/storage.utils.d.ts +1 -1
  427. package/src/app/shared/testing/observable.test.d.ts +1 -1
  428. package/src/app/shared/testing/tests.page.d.ts +1 -1
  429. package/src/app/shared/toast/toast.testing.d.ts +1 -1
  430. package/src/app/shared/toolbar/modal-toolbar.d.ts +1 -1
  431. package/src/app/shared/toolbar/toolbar.d.ts +1 -1
  432. package/src/app/shared/toolbar/toolbar.module.d.ts +4 -3
  433. package/src/app/shared/upload-file/testing/upload-file.testing.d.ts +1 -1
  434. package/src/app/shared/upload-file/upload-file-popover.component.d.ts +1 -1
  435. package/src/app/shared/upload-file/upload-file.component.d.ts +1 -1
  436. package/src/app/shared/upload-file/upload-file.model.d.ts +2 -2
  437. package/src/app/social/job/progression/job-progression.component.d.ts +17 -3
  438. package/src/app/social/job/progression/job-progression.icon.d.ts +24 -10
  439. package/src/app/social/job/progression/job-progression.list.d.ts +3 -3
  440. package/src/app/social/job/progression/job-progression.model.d.ts +0 -1
  441. package/src/app/social/job/testing/job-progression.testing.d.ts +3 -6
  442. package/src/app/social/message/message.form.d.ts +2 -8
  443. package/src/app/social/message/message.modal.d.ts +1 -5
  444. package/src/app/social/message/message.model.d.ts +0 -2
  445. package/src/app/social/message/message.module.d.ts +1 -2
  446. package/src/app/social/message/message.service.d.ts +3 -8
  447. package/src/app/social/user-event/notification/user-event-notification.icon.d.ts +4 -3
  448. package/src/app/social/user-event/notification/user-event-notification.list.d.ts +1 -1
  449. package/src/app/social/user-event/testing/user-event.testing.d.ts +1 -1
  450. package/src/app/social/user-event/testing/user-event.testing.model.d.ts +0 -1
  451. package/src/app/social/user-event/user-event.model.d.ts +2 -2
  452. package/src/app/social/user-event/user-event.module.d.ts +3 -2
  453. package/src/app/social/user-event/user-event.service.d.ts +1 -6
  454. package/src/assets/i18n/en-US.json +17 -15
  455. package/src/assets/i18n/en.json +17 -15
  456. package/src/assets/i18n/fr.json +7 -6
  457. package/src/assets/img/logo/logo-eis.png +0 -0
  458. package/src/assets/manifest.json +1 -1
  459. package/src/environments/environment.class.d.ts +0 -1
  460. package/src/theme/_material.globals.scss +51 -19
  461. package/src/theme/_material.scss +15 -15
  462. package/src/theme/_mixins.scss +3 -3
  463. package/src/theme/_ngx-components.globals.scss +6 -1
  464. package/src/theme/_ngx-components.scss +262 -534
  465. package/src/theme/_ngx-components.table.scss +599 -0
  466. package/src/theme/_theme.scss +1 -0
  467. package/esm2020/public_api.mjs +0 -330
  468. package/esm2020/src/app/admin/services/filter/person.filter.mjs +0 -59
  469. package/esm2020/src/app/admin/services/person.service.mjs +0 -170
  470. package/esm2020/src/app/admin/services/validator/person.validator.mjs +0 -71
  471. package/esm2020/src/app/admin/users/users.mjs +0 -250
  472. package/esm2020/src/app/admin/users/users.module.mjs +0 -54
  473. package/esm2020/src/app/core/about/about.modal.mjs +0 -71
  474. package/esm2020/src/app/core/account/account.page.mjs +0 -319
  475. package/esm2020/src/app/core/account/new-token.modal.mjs +0 -115
  476. package/esm2020/src/app/core/account/token.table.mjs +0 -137
  477. package/esm2020/src/app/core/auth/auth.form.mjs +0 -131
  478. package/esm2020/src/app/core/auth/auth.modal.mjs +0 -72
  479. package/esm2020/src/app/core/core.testing.module.mjs +0 -86
  480. package/esm2020/src/app/core/form/buttons/form-buttons-bar.component.mjs +0 -107
  481. package/esm2020/src/app/core/form/entity/editor.class.mjs +0 -683
  482. package/esm2020/src/app/core/form/entity/entity-editor-modal.class.mjs +0 -422
  483. package/esm2020/src/app/core/form/entity/entity-editor.class.mjs +0 -696
  484. package/esm2020/src/app/core/form/entity/entity-metadata.component.mjs +0 -25
  485. package/esm2020/src/app/core/form/form.class.mjs +0 -345
  486. package/esm2020/src/app/core/form/list/list.form.mjs +0 -222
  487. package/esm2020/src/app/core/form/properties/properties.form.mjs +0 -132
  488. package/esm2020/src/app/core/form/properties/properties.table.mjs +0 -267
  489. package/esm2020/src/app/core/form/properties/property.validator.mjs +0 -23
  490. package/esm2020/src/app/core/form/properties/testing/properties-form.test.mjs +0 -90
  491. package/esm2020/src/app/core/form/text-popover/testing/text-popover.testing.mjs +0 -70
  492. package/esm2020/src/app/core/form/text-popover/text-form.component.mjs +0 -89
  493. package/esm2020/src/app/core/graphql/graphql.service.mjs +0 -778
  494. package/esm2020/src/app/core/home/home.mjs +0 -257
  495. package/esm2020/src/app/core/home/home.module.mjs +0 -48
  496. package/esm2020/src/app/core/icon/icon.component.mjs +0 -41
  497. package/esm2020/src/app/core/install/install-upgrade-card.component.mjs +0 -344
  498. package/esm2020/src/app/core/menu/menu.component.mjs +0 -242
  499. package/esm2020/src/app/core/menu/menu.model.mjs +0 -247
  500. package/esm2020/src/app/core/menu/menu.module.mjs +0 -57
  501. package/esm2020/src/app/core/menu/menu.service.mjs +0 -660
  502. package/esm2020/src/app/core/menu/sub-menu-tab.directive.mjs +0 -98
  503. package/esm2020/src/app/core/menu/testing/menu.testing.mjs +0 -121
  504. package/esm2020/src/app/core/offline/update-offline-mode-card.component.mjs +0 -27
  505. package/esm2020/src/app/core/peer/select-peer.modal.mjs +0 -183
  506. package/esm2020/src/app/core/register/register-confirm.page.mjs +0 -81
  507. package/esm2020/src/app/core/register/register.form.mjs +0 -183
  508. package/esm2020/src/app/core/register/register.modal.mjs +0 -52
  509. package/esm2020/src/app/core/services/account.service.mjs +0 -1233
  510. package/esm2020/src/app/core/services/auth-guard.service.mjs +0 -71
  511. package/esm2020/src/app/core/services/base-entity-service.class.mjs +0 -468
  512. package/esm2020/src/app/core/services/base-graphql-service.class.mjs +0 -221
  513. package/esm2020/src/app/core/services/base58.mjs +0 -78
  514. package/esm2020/src/app/core/services/config.service.mjs +0 -355
  515. package/esm2020/src/app/core/services/crypto.service.mjs +0 -107
  516. package/esm2020/src/app/core/services/local-settings.service.mjs +0 -460
  517. package/esm2020/src/app/core/services/model/account.model.mjs +0 -147
  518. package/esm2020/src/app/core/services/model/config.model.mjs +0 -92
  519. package/esm2020/src/app/core/services/model/department.model.mjs +0 -30
  520. package/esm2020/src/app/core/services/model/entity.decorators.mjs +0 -97
  521. package/esm2020/src/app/core/services/model/entity.model.mjs +0 -225
  522. package/esm2020/src/app/core/services/model/peer.model.mjs +0 -68
  523. package/esm2020/src/app/core/services/model/person.model.mjs +0 -97
  524. package/esm2020/src/app/core/services/model/referential.model.mjs +0 -167
  525. package/esm2020/src/app/core/services/model/token.model.mjs +0 -48
  526. package/esm2020/src/app/core/services/network.service.mjs +0 -590
  527. package/esm2020/src/app/core/services/platform.service.mjs +0 -534
  528. package/esm2020/src/app/core/services/storage/entities-storage.service.mjs +0 -428
  529. package/esm2020/src/app/core/services/storage/entity-store.class.mjs +0 -449
  530. package/esm2020/src/app/core/services/testing/referential-filter.model.mjs +0 -23
  531. package/esm2020/src/app/core/services/testing/referential.validator.mjs +0 -45
  532. package/esm2020/src/app/core/services/validator/account.validator.mjs +0 -41
  533. package/esm2020/src/app/core/services/validator/base.validator.class.mjs +0 -47
  534. package/esm2020/src/app/core/services/validator/local-settings.validator.mjs +0 -66
  535. package/esm2020/src/app/core/settings/settings.page.mjs +0 -312
  536. package/esm2020/src/app/core/table/actions-column.component.mjs +0 -102
  537. package/esm2020/src/app/core/table/async-table.class.mjs +0 -1698
  538. package/esm2020/src/app/core/table/entities-async-table-datasource.class.mjs +0 -384
  539. package/esm2020/src/app/core/table/entities-table-datasource.class.mjs +0 -399
  540. package/esm2020/src/app/core/table/memory-table.class.mjs +0 -53
  541. package/esm2020/src/app/core/table/table-select-columns.component.mjs +0 -43
  542. package/esm2020/src/app/core/table/table.class.mjs +0 -1733
  543. package/esm2020/src/app/core/table/table.model.mjs +0 -12
  544. package/esm2020/src/app/core/table/testing/table-validator.service.mjs +0 -27
  545. package/esm2020/src/app/core/table/testing/table.testing.mjs +0 -281
  546. package/esm2020/src/app/core/table/testing/table.testing.module.mjs +0 -38
  547. package/esm2020/src/app/shared/audio/audio.mjs +0 -248
  548. package/esm2020/src/app/shared/audio/audio.testing.mjs +0 -31
  549. package/esm2020/src/app/shared/capacitor/keyboard.mjs +0 -40
  550. package/esm2020/src/app/shared/capacitor/plugins.mjs +0 -9
  551. package/esm2020/src/app/shared/dates.mjs +0 -149
  552. package/esm2020/src/app/shared/debug/debug.component.mjs +0 -39
  553. package/esm2020/src/app/shared/directives/autofocus.directive.mjs +0 -93
  554. package/esm2020/src/app/shared/directives/autotitle.directive.mjs +0 -30
  555. package/esm2020/src/app/shared/directives/drag-and-drop.directive.mjs +0 -53
  556. package/esm2020/src/app/shared/directives/ng-var.directive.mjs +0 -31
  557. package/esm2020/src/app/shared/directives/resizable/resizable.component.mjs +0 -59
  558. package/esm2020/src/app/shared/directives/resizable/resizable.directive.mjs +0 -40
  559. package/esm2020/src/app/shared/file/file.service.mjs +0 -117
  560. package/esm2020/src/app/shared/form/field.component.mjs +0 -332
  561. package/esm2020/src/app/shared/form/loading-spinner.mjs +0 -36
  562. package/esm2020/src/app/shared/geolocation/geolocation.utils.mjs +0 -80
  563. package/esm2020/src/app/shared/gesture/gesture-config.mjs +0 -49
  564. package/esm2020/src/app/shared/graph/graph-colors.mjs +0 -212
  565. package/esm2020/src/app/shared/guard/component-dirty.guard.mjs +0 -57
  566. package/esm2020/src/app/shared/help/help.modal.mjs +0 -53
  567. package/esm2020/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.mjs +0 -23
  568. package/esm2020/src/app/shared/hotkeys/hotkeys.service.mjs +0 -84
  569. package/esm2020/src/app/shared/image/gallery/image-gallery.component.mjs +0 -368
  570. package/esm2020/src/app/shared/image/gallery/testing/gallegry.model.testing.mjs +0 -27
  571. package/esm2020/src/app/shared/image/gallery/testing/gallery.service.testing.mjs +0 -90
  572. package/esm2020/src/app/shared/image/gallery/testing/gallery.testing.mjs +0 -39
  573. package/esm2020/src/app/shared/image/image.service.mjs +0 -98
  574. package/esm2020/src/app/shared/inputs.mjs +0 -231
  575. package/esm2020/src/app/shared/interceptors/progess.interceptor.mjs +0 -27
  576. package/esm2020/src/app/shared/logging/logging-service.class.mjs +0 -121
  577. package/esm2020/src/app/shared/material/autocomplete/material.autocomplete.config.mjs +0 -47
  578. package/esm2020/src/app/shared/material/autocomplete/material.autocomplete.mjs +0 -920
  579. package/esm2020/src/app/shared/material/autocomplete/material.autocomplete.module.mjs +0 -78
  580. package/esm2020/src/app/shared/material/autocomplete/testing/autocomplete.test.mjs +0 -209
  581. package/esm2020/src/app/shared/material/badge/badge.directive.mjs +0 -199
  582. package/esm2020/src/app/shared/material/badge/badge.test.mjs +0 -41
  583. package/esm2020/src/app/shared/material/boolean/boolean.module.mjs +0 -68
  584. package/esm2020/src/app/shared/material/boolean/material.boolean.mjs +0 -253
  585. package/esm2020/src/app/shared/material/chips/chips.module.mjs +0 -76
  586. package/esm2020/src/app/shared/material/chips/material.chips.mjs +0 -696
  587. package/esm2020/src/app/shared/material/chips/testing/chips.test.mjs +0 -143
  588. package/esm2020/src/app/shared/material/datetime/material.date.mjs +0 -376
  589. package/esm2020/src/app/shared/material/datetime/material.dateshort.mjs +0 -385
  590. package/esm2020/src/app/shared/material/datetime/material.datetime.mjs +0 -499
  591. package/esm2020/src/app/shared/material/datetime/testing/mat-date-time.test.mjs +0 -108
  592. package/esm2020/src/app/shared/material/datetime/testing/mat-date.test.mjs +0 -110
  593. package/esm2020/src/app/shared/material/datetime/testing/mat-dateshort.test.mjs +0 -103
  594. package/esm2020/src/app/shared/material/duration/duration.module.mjs +0 -67
  595. package/esm2020/src/app/shared/material/duration/material.duration.mjs +0 -257
  596. package/esm2020/src/app/shared/material/latlong/material.latlong.mjs +0 -382
  597. package/esm2020/src/app/shared/material/latlong/material.latlong.module.mjs +0 -67
  598. package/esm2020/src/app/shared/material/latlong/testing/latlong.test.mjs +0 -102
  599. package/esm2020/src/app/shared/material/material.module.mjs +0 -224
  600. package/esm2020/src/app/shared/material/material.testing.module.mjs +0 -168
  601. package/esm2020/src/app/shared/material/numpad/numpad.append-to-input.directive.mjs +0 -98
  602. package/esm2020/src/app/shared/material/numpad/numpad.component.mjs +0 -80
  603. package/esm2020/src/app/shared/material/numpad/numpad.container.mjs +0 -190
  604. package/esm2020/src/app/shared/material/numpad/numpad.content.mjs +0 -17
  605. package/esm2020/src/app/shared/material/numpad/numpad.directive.mjs +0 -162
  606. package/esm2020/src/app/shared/material/numpad/numpad.dom-service.mjs +0 -37
  607. package/esm2020/src/app/shared/material/numpad/numpad.model.mjs +0 -15
  608. package/esm2020/src/app/shared/material/numpad/testing/numpad.test.mjs +0 -46
  609. package/esm2020/src/app/shared/material/paginator/material.paginator-i18n.mjs +0 -46
  610. package/esm2020/src/app/shared/material/stepper/material.stepper-i18n.mjs +0 -22
  611. package/esm2020/src/app/shared/material/swipe/material.swipe.mjs +0 -344
  612. package/esm2020/src/app/shared/material/swipe/swipe.module.mjs +0 -52
  613. package/esm2020/src/app/shared/material/swipe/testing/swipe.test.mjs +0 -64
  614. package/esm2020/src/app/shared/named-filter/named-filter-selector.component.mjs +0 -202
  615. package/esm2020/src/app/shared/named-filter/named-filter.model.mjs +0 -45
  616. package/esm2020/src/app/shared/named-filter/named-filter.service.mjs +0 -63
  617. package/esm2020/src/app/shared/pipes/colors.pipe.mjs +0 -25
  618. package/esm2020/src/app/shared/pipes/date-diff-duration.pipe.mjs +0 -48
  619. package/esm2020/src/app/shared/pipes/date-format.pipe.mjs +0 -66
  620. package/esm2020/src/app/shared/pipes/date-from-now.pipe.mjs +0 -27
  621. package/esm2020/src/app/shared/pipes/duration.pipe.mjs +0 -34
  622. package/esm2020/src/app/shared/pipes/file-size.pipe.mjs +0 -62
  623. package/esm2020/src/app/shared/pipes/form.pipes.mjs +0 -187
  624. package/esm2020/src/app/shared/pipes/latlong-format.pipe.mjs +0 -46
  625. package/esm2020/src/app/shared/pipes/ng-init.pipe.mjs +0 -21
  626. package/esm2020/src/app/shared/pipes/pipes.module.mjs +0 -239
  627. package/esm2020/src/app/shared/pipes/property.pipes.mjs +0 -93
  628. package/esm2020/src/app/shared/pipes/string.pipes.mjs +0 -121
  629. package/esm2020/src/app/shared/pipes/translate-context.pipe.mjs +0 -43
  630. package/esm2020/src/app/shared/pipes/types.pipes.mjs +0 -45
  631. package/esm2020/src/app/shared/services/entity-service.class.mjs +0 -7
  632. package/esm2020/src/app/shared/services/memory-entity-service.class.mjs +0 -339
  633. package/esm2020/src/app/shared/services/progress-bar.service.mjs +0 -33
  634. package/esm2020/src/app/shared/services/startable-observable-service.class.mjs +0 -118
  635. package/esm2020/src/app/shared/services/startable-service.class.mjs +0 -110
  636. package/esm2020/src/app/shared/services/translate-context.service.mjs +0 -103
  637. package/esm2020/src/app/shared/shared.module.mjs +0 -231
  638. package/esm2020/src/app/shared/storage/storage-explorer.component.mjs +0 -268
  639. package/esm2020/src/app/shared/storage/storage-explorer.module.mjs +0 -47
  640. package/esm2020/src/app/shared/storage/storage.service.mjs +0 -132
  641. package/esm2020/src/app/shared/testing/observable.test.mjs +0 -95
  642. package/esm2020/src/app/shared/testing/tests.page.mjs +0 -33
  643. package/esm2020/src/app/shared/toast/toast.testing.mjs +0 -51
  644. package/esm2020/src/app/shared/toast/toasts.mjs +0 -144
  645. package/esm2020/src/app/shared/toolbar/modal-toolbar.mjs +0 -58
  646. package/esm2020/src/app/shared/toolbar/toolbar.mjs +0 -251
  647. package/esm2020/src/app/shared/toolbar/toolbar.module.mjs +0 -53
  648. package/esm2020/src/app/shared/upload-file/testing/upload-file.testing.mjs +0 -58
  649. package/esm2020/src/app/shared/upload-file/upload-file-popover.component.mjs +0 -97
  650. package/esm2020/src/app/shared/upload-file/upload-file.component.mjs +0 -204
  651. package/esm2020/src/app/shared/upload-file/upload-file.model.mjs +0 -20
  652. package/esm2020/src/app/shared/validator/form-error-adapter.class.mjs +0 -104
  653. package/esm2020/src/app/shared/validator/validators.mjs +0 -580
  654. package/esm2020/src/app/shared/version/versions.mjs +0 -81
  655. package/esm2020/src/app/social/job/job.module.mjs +0 -42
  656. package/esm2020/src/app/social/job/progression/job-progression.component.mjs +0 -20
  657. package/esm2020/src/app/social/job/progression/job-progression.icon.mjs +0 -216
  658. package/esm2020/src/app/social/job/progression/job-progression.list.mjs +0 -43
  659. package/esm2020/src/app/social/job/progression/job-progression.model.mjs +0 -23
  660. package/esm2020/src/app/social/job/progression/job-progression.service.mjs +0 -71
  661. package/esm2020/src/app/social/job/testing/job-progression.testing.mjs +0 -52
  662. package/esm2020/src/app/social/job/testing/job-progression.testing.service.mjs +0 -55
  663. package/esm2020/src/app/social/message/message.form.mjs +0 -136
  664. package/esm2020/src/app/social/message/message.modal.mjs +0 -99
  665. package/esm2020/src/app/social/message/message.model.mjs +0 -67
  666. package/esm2020/src/app/social/message/message.module.mjs +0 -22
  667. package/esm2020/src/app/social/message/message.service.mjs +0 -105
  668. package/esm2020/src/app/social/user-event/notification/user-event-notification.icon.mjs +0 -114
  669. package/esm2020/src/app/social/user-event/notification/user-event-notification.list.mjs +0 -246
  670. package/esm2020/src/app/social/user-event/testing/user-event.testing.mjs +0 -227
  671. package/esm2020/src/app/social/user-event/testing/user-event.testing.model.mjs +0 -112
  672. package/esm2020/src/app/social/user-event/testing/user-event.testing.service.mjs +0 -111
  673. package/esm2020/src/app/social/user-event/user-event.module.mjs +0 -39
  674. package/esm2020/src/app/social/user-event/user-event.service.mjs +0 -501
  675. package/esm2020/src/environments/environment.class.mjs +0 -5
  676. package/esm2020/src/environments/environment.loader.mjs +0 -79
  677. package/esm2020/src/environments/environment.mjs +0 -97
  678. package/fesm2015/sumaris-net.ngx-components.mjs +0 -40966
  679. package/fesm2015/sumaris-net.ngx-components.mjs.map +0 -1
  680. package/fesm2020/sumaris-net.ngx-components.mjs.map +0 -1
  681. package/resources/README.md +0 -7
  682. package/src/assets/environments/environment-test.json +0 -6
  683. package/src/environments/environment.loader.d.ts +0 -26
  684. /package/{esm2020 → esm2022}/src/app/core/services/errors.mjs +0 -0
  685. /package/{esm2020 → esm2022}/src/app/core/services/model/filter.model.mjs +0 -0
  686. /package/{esm2020 → esm2022}/src/app/core/services/model/history.model.mjs +0 -0
  687. /package/{esm2020 → esm2022}/src/app/core/services/model/model.enum.mjs +0 -0
  688. /package/{esm2020 → esm2022}/src/app/core/services/model/settings.model.mjs +0 -0
  689. /package/{esm2020 → esm2022}/src/app/core/services/model/tree-item-entity.model.mjs +0 -0
  690. /package/{esm2020 → esm2022}/src/app/core/services/network.types.mjs +0 -0
  691. /package/{esm2020 → esm2022}/src/app/core/services/network.utils.mjs +0 -0
  692. /package/{esm2020 → esm2022}/src/app/core/table/table.utils.mjs +0 -0
  693. /package/{esm2020 → esm2022}/src/app/shared/alerts.mjs +0 -0
  694. /package/{esm2020 → esm2022}/src/app/shared/constants.mjs +0 -0
  695. /package/{esm2020 → esm2022}/src/app/shared/debug/debug-service.class.mjs +0 -0
  696. /package/{esm2020 → esm2022}/src/app/shared/events.mjs +0 -0
  697. /package/{esm2020 → esm2022}/src/app/shared/file/csv.utils.mjs +0 -0
  698. /package/{esm2020 → esm2022}/src/app/shared/file/images.utils.mjs +0 -0
  699. /package/{esm2020 → esm2022}/src/app/shared/file/json.utils.mjs +0 -0
  700. /package/{esm2020 → esm2022}/src/app/shared/file/uri.utils.mjs +0 -0
  701. /package/{esm2020 → esm2022}/src/app/shared/focusable.mjs +0 -0
  702. /package/{esm2020 → esm2022}/src/app/shared/forms.mjs +0 -0
  703. /package/{esm2020 → esm2022}/src/app/shared/gesture/hammer.utils.mjs +0 -0
  704. /package/{esm2020 → esm2022}/src/app/shared/graph/colors.utils.mjs +0 -0
  705. /package/{esm2020 → esm2022}/src/app/shared/http/http.utils.mjs +0 -0
  706. /package/{esm2020 → esm2022}/src/app/shared/image/image.model.mjs +0 -0
  707. /package/{esm2020 → esm2022}/src/app/shared/logging/log-level.model.mjs +0 -0
  708. /package/{esm2020 → esm2022}/src/app/shared/logging/logger.model.mjs +0 -0
  709. /package/{esm2020 → esm2022}/src/app/shared/logging/logging-service.config.mjs +0 -0
  710. /package/{esm2020 → esm2022}/src/app/shared/material/autocomplete/material.autocomplete.utils.mjs +0 -0
  711. /package/{esm2020 → esm2022}/src/app/shared/material/material.animations.mjs +0 -0
  712. /package/{esm2020 → esm2022}/src/app/shared/modules.mjs +0 -0
  713. /package/{esm2020 → esm2022}/src/app/shared/observables.mjs +0 -0
  714. /package/{esm2020 → esm2022}/src/app/shared/platforms.mjs +0 -0
  715. /package/{esm2020 → esm2022}/src/app/shared/services/job.utils.mjs +0 -0
  716. /package/{esm2020 → esm2022}/src/app/shared/services/validator-service.class.mjs +0 -0
  717. /package/{esm2020 → esm2022}/src/app/shared/services.mjs +0 -0
  718. /package/{esm2020 → esm2022}/src/app/shared/types.mjs +0 -0
  719. /package/{esm2020 → esm2022}/src/app/social/social.errors.mjs +0 -0
  720. /package/{esm2020 → esm2022}/src/app/social/user-event/user-event.model.mjs +0 -0
  721. /package/{esm2020 → esm2022}/sumaris-net.ngx-components.mjs +0 -0
@@ -1,660 +0,0 @@
1
- import { EventEmitter, Inject, Injectable, InjectionToken, Optional } from '@angular/core';
2
- import { BehaviorSubject, combineLatest, from, merge, mergeMap, Subject } from 'rxjs';
3
- import { MenuItem, MenuItems } from './menu.model';
4
- import { NavigationEnd } from '@angular/router';
5
- import { ENVIRONMENT } from '../../../environments/environment.class';
6
- import { DateUtils } from '../../shared/dates';
7
- import { distinctUntilChanged, filter, map, throttleTime } from 'rxjs/operators';
8
- import { CORE_CONFIG_OPTIONS } from '../services/config/core.config';
9
- import { isEmptyArray, isNil, isNotEmptyArray, isNotNil, isNotNilOrBlank, toBoolean } from '../../shared/functions';
10
- import { StartableObservableService } from '../../shared/services/startable-observable-service.class';
11
- import { firstNotNilPromise } from '../../shared/observables';
12
- import { TreeItemEntityUtils } from '../services/model/tree-item-entity.model';
13
- import { AboutModal } from '../about/about.modal';
14
- import * as i0 from "@angular/core";
15
- import * as i1 from "../services/local-settings.service";
16
- import * as i2 from "../services/config.service";
17
- import * as i3 from "../services/account.service";
18
- import * as i4 from "@angular/router";
19
- import * as i5 from "@ionic/angular";
20
- import * as i6 from "@ngx-translate/core";
21
- import * as i7 from "../../../environments/environment.class";
22
- import * as i8 from "./menu.model";
23
- export const DEFAULT_MENU_SHOW_WHEN = 'lg';
24
- export const APP_MENU_ITEMS = new InjectionToken('menuItems');
25
- export const APP_MENU_OPTIONS = new InjectionToken('menuOptions');
26
- export class MenuService extends StartableObservableService {
27
- constructor(settings, configService, accountService, router, modalCtrl, alertController, navController, translate, environment, options, staticItems) {
28
- super(settings);
29
- this.settings = settings;
30
- this.configService = configService;
31
- this.accountService = accountService;
32
- this.router = router;
33
- this.modalCtrl = modalCtrl;
34
- this.alertController = alertController;
35
- this.navController = navController;
36
- this.translate = translate;
37
- this.environment = environment;
38
- this.accountChanges = new BehaviorSubject(undefined);
39
- this.onPinned = new EventEmitter(true);
40
- this._detachedSubItems = [];
41
- this._itemCounter = 0;
42
- this._logPrefix = '[menu-service] ';
43
- this._$opened = new Subject();
44
- this._$splitPaneWhen = new BehaviorSubject(DEFAULT_MENU_SHOW_WHEN);
45
- this._$enabled = new BehaviorSubject(true);
46
- this._$listenRoute = new BehaviorSubject(false);
47
- this._options = {
48
- ...options,
49
- subMenu: {
50
- disableIcon: false,
51
- savePinned: true,
52
- ...(options?.subMenu || {}),
53
- // Force disable on mobile
54
- enable: options?.subMenu?.enable !== false && !this.settings.mobile,
55
- }
56
- };
57
- this._$enableSubMenu = new BehaviorSubject(this._options.subMenu.enable);
58
- this._debug = !environment.production;
59
- this._detachedSubItems = [];
60
- this._staticItems = (staticItems || []).map(source => {
61
- const target = this.fromObject({ static: true, ...source }, { computeId: true, fillParent: true, fillDefaultFromParent: true });
62
- const detachedItems = TreeItemEntityUtils.deleteRecursively(target, (item) => item.static !== true);
63
- if (detachedItems?.length) {
64
- console.debug(this._logPrefix + 'Detached init items', detachedItems);
65
- detachedItems.forEach(item => this._detachToParent(item));
66
- this._detachedSubItems.push(...detachedItems);
67
- }
68
- return target;
69
- });
70
- }
71
- get opened() {
72
- return this._$opened.asObservable();
73
- }
74
- get splitPaneWhen() {
75
- return this._$splitPaneWhen.asObservable();
76
- }
77
- get enabled() {
78
- return this._$enabled.asObservable();
79
- }
80
- get subMenuEnabled() {
81
- return this._$enableSubMenu.value;
82
- }
83
- get subItems() {
84
- return (this.data || []).reduce((res, rootElement) => res.concat(rootElement.children), []);
85
- }
86
- get _staticSubItems() {
87
- return (this._staticItems || []).reduce((res, rootElement) => res.concat(rootElement.children), []);
88
- }
89
- enable(value) {
90
- this._$enabled.next(value);
91
- }
92
- enableSubMenu(value) {
93
- this._$enableSubMenu.next(value);
94
- }
95
- setSplitPaneShowWhen(value) {
96
- if (this._$splitPaneWhen.value !== value) {
97
- this._$splitPaneWhen.next(value);
98
- }
99
- }
100
- toggleSplitPaneWhen() {
101
- if (this._$splitPaneWhen.value !== false) {
102
- this._$splitPaneWhen.next(false);
103
- }
104
- else {
105
- this._$splitPaneWhen.next(DEFAULT_MENU_SHOW_WHEN);
106
- }
107
- }
108
- fromObject(source, opts) {
109
- const target = MenuItem.fromObject(source, { withChildren: false });
110
- // Compute id if need
111
- if (opts?.computeId && isNil(target.id))
112
- target.id = this._computeNewId();
113
- // Remove icon if disabled
114
- if (this._options.subMenu.disableIcon) {
115
- Object.assign(target, { icon: undefined, matIcon: undefined, matSvgIcon: undefined });
116
- }
117
- // Recursive
118
- target.children = (source.children || []).map((json) => this.fromObject(json, { ...opts, fillParent: false }));
119
- // Fill parent (once, when the full tree is ready)
120
- if (opts?.fillParent) {
121
- TreeItemEntityUtils.treeFillParent(target);
122
- // Fill defaults from the parent (once filled)
123
- if (opts?.fillDefaultFromParent) {
124
- TreeItemEntityUtils.visit(target, (item) => {
125
- if (!item.parent)
126
- return; // Skip if no parent
127
- item.parentPath = item.parentPath || item.parent.path;
128
- item.parentPathParams = item.parentPathParams || item.parent.pathParams;
129
- item.static = toBoolean(item.static, item.parent.static);
130
- // Compute path, from parent path + action
131
- if (!item.path && !!item.action) {
132
- item.path = item.parent.path;
133
- item.pathParams = (typeof item.action === 'string') ? { action: item.action } : { actionId: item.id.toString(), actionTitle: item.title };
134
- }
135
- });
136
- }
137
- }
138
- return target;
139
- }
140
- createSubMenu(source) {
141
- if (!this.subMenuEnabled)
142
- return null; // Skip if disabled
143
- const target = this.fromObject(source);
144
- // Check if exists
145
- if (this.started) {
146
- const existingItem = this._findExistingItem(target);
147
- if (existingItem)
148
- return existingItem;
149
- }
150
- // Create
151
- if (isNil(target.id))
152
- target.id = this._computeNewId();
153
- return target;
154
- }
155
- async addSubMenuItems(sources, opts) {
156
- if (!this.started)
157
- await this.ready();
158
- if (!this.subMenuEnabled)
159
- return; // Skip
160
- return sources.map(source => this._addSubMenuItem(this.fromObject(source), opts));
161
- }
162
- async addSubMenuItem(item, opts) {
163
- if (!this.started)
164
- await this.ready();
165
- if (!this.subMenuEnabled)
166
- return; // Skip
167
- return this._addSubMenuItem(this.fromObject(item), opts);
168
- }
169
- async removeSubMenuItems(items) {
170
- if (!this.started)
171
- await this.ready();
172
- return (items || []).map(item => this._removeSubMenuItem(this.fromObject(item)));
173
- }
174
- async removeSubMenuItem(item) {
175
- if (!this.started)
176
- await this.ready();
177
- return this._removeSubMenuItem(this.fromObject(item));
178
- }
179
- togglePinned(source) {
180
- const item = (source instanceof MenuItem) ? source : this._findExistingItem(this.fromObject(source));
181
- // Skip if not found
182
- if (!item) {
183
- if (this._debug)
184
- console.warn(this._logPrefix + `Sub menu {${source.path}} cannot be found - unable to toggle pinned!`);
185
- return;
186
- }
187
- // Skip if static
188
- if (item.static)
189
- return;
190
- // Unpinned
191
- if (item.pinned) {
192
- item.pinned = false;
193
- if (!item.detached) {
194
- this._detachedSubItems = [
195
- ...this._detachedSubItems,
196
- ...this._detachSubMenuItems()
197
- ];
198
- }
199
- }
200
- // Pinned
201
- else {
202
- item.pinned = true;
203
- }
204
- this.onPinned.emit(item);
205
- }
206
- async executeAction(event, item) {
207
- const action = item?.action;
208
- if (!action)
209
- return; // skip
210
- if (typeof action === 'string') {
211
- switch (action) {
212
- case 'logout':
213
- await this.logout();
214
- break;
215
- case 'about':
216
- await this.openAboutModal();
217
- break;
218
- case 'expand':
219
- await this.toggleExpandableItem(item);
220
- if (item.path) {
221
- await this.navController.navigateRoot(item.path, {
222
- queryParams: item.pathParams
223
- });
224
- }
225
- break;
226
- default: {
227
- if (item.path) {
228
- await this.navController.navigateRoot(item.path, {
229
- queryParams: item.pathParams
230
- });
231
- }
232
- else {
233
- throw new Error('Unknown action: ' + action);
234
- }
235
- }
236
- }
237
- }
238
- else if (typeof action === 'function') {
239
- action(event);
240
- }
241
- }
242
- async logout() {
243
- const translations = await this.translate.instant([
244
- 'AUTH.LOGOUT.CONFIRM_TITLE',
245
- 'AUTH.LOGOUT.CONFIRM_MESSAGE',
246
- 'COMMON.BTN_CANCEL',
247
- 'AUTH.LOGOUT.BTN_CONFIRM',
248
- ]);
249
- const alert = await this.alertController.create({
250
- header: translations['AUTH.LOGOUT.CONFIRM_TITLE'],
251
- message: translations['AUTH.LOGOUT.CONFIRM_MESSAGE'],
252
- buttons: [
253
- {
254
- text: translations['COMMON.BTN_CANCEL'],
255
- role: 'cancel',
256
- cssClass: 'secondary',
257
- },
258
- {
259
- text: translations['AUTH.LOGOUT.BTN_CONFIRM'],
260
- cssClass: 'ion-color-primary',
261
- handler: () => {
262
- this.accountService.logout();
263
- // Back to home
264
- setTimeout(() => this.navController.navigateRoot('/'), 100);
265
- },
266
- },
267
- ],
268
- });
269
- await alert.present();
270
- }
271
- async openAboutModal() {
272
- const modal = await this.modalCtrl.create({ component: AboutModal });
273
- return modal.present();
274
- }
275
- async toggleExpandableItem(item) {
276
- if (!item.expanded) {
277
- if (this._debug)
278
- console.debug(this._logPrefix + 'Expand item', item);
279
- item.matIcon = 'expand_less';
280
- // Try to attach some item
281
- this._detachedSubItems
282
- .filter(childItem => !!this._findParent(childItem, [item]))
283
- .forEach(childItem => this._attachMenuToParent(item, childItem));
284
- }
285
- else {
286
- item.matIcon = 'expand_more';
287
- this._detachedSubItems = [
288
- ...this._detachedSubItems,
289
- ...this._detachSubMenuItems({ path: '/', params: {} }, item.children)
290
- ];
291
- }
292
- }
293
- _markAsOpened() {
294
- this._$opened.next(true);
295
- }
296
- _markAsClosed() {
297
- this._$opened.next(false);
298
- }
299
- async close() {
300
- this._$opened.next(false);
301
- }
302
- async open() {
303
- this._$opened.next(true);
304
- }
305
- async ngOnStart() {
306
- console.info(`${this._logPrefix}Starting...`);
307
- // Restore sub items from settings
308
- await this.settings.ready();
309
- const settingsSubItems = this.settings.getPageSettings('menu', 'sub-items');
310
- if (isNotEmptyArray(settingsSubItems)) {
311
- console.debug(this._logPrefix + 'Restoring pinned items from settings...', settingsSubItems);
312
- this._detachedSubItems = settingsSubItems.map(source => this.fromObject(source, { computeId: true, fillParent: true }));
313
- }
314
- const accountEvent$ = merge(from(this.accountService.ready()), this.accountService.onLogin, this.accountService.onLogout.pipe(map(_ => null))).pipe(map(account => isNotNil(account?.id) ? account : null), distinctUntilChanged((a1, a2) => DateUtils.isSame(a1?.updateDate, a2?.updateDate)));
315
- this.registerSubscription(
316
- // Combine config and account events
317
- combineLatest([
318
- this.configService.config,
319
- accountEvent$
320
- ]).subscribe(([config, account]) => {
321
- if (this._debug)
322
- console.debug(`${this._logPrefix}Received config or account event. Refreshing items...`, account);
323
- // Load all items
324
- const items = this._loadMenuItems(config, account);
325
- // Emit new root items
326
- this.dataSubject.next(items);
327
- // Emit account changes event
328
- this.accountChanges.next(account);
329
- }));
330
- this.registerSubscription(merge(this.accountChanges.pipe(map(() => MenuItems.parsePathWithQuery(this.router.routerState.snapshot.url))), this._$listenRoute.pipe(filter(listen => listen === true && this.started), mergeMap(_ => this.router.events), filter(event => event instanceof NavigationEnd), map((event) => MenuItems.parsePathWithQuery(event.url)))).pipe(throttleTime(250))
331
- .subscribe(pathParam => {
332
- const detachedSubItems = this._detachSubMenuItems(pathParam);
333
- if (detachedSubItems?.length) {
334
- this._detachedSubItems = [
335
- ...this._detachedSubItems,
336
- ...detachedSubItems
337
- ];
338
- if (this._debug)
339
- console.debug(`${this._logPrefix}Newly detached items: `, detachedSubItems);
340
- }
341
- }));
342
- // Save pinned items
343
- this.registerSubscription(this.onPinned
344
- .subscribe(item => {
345
- // Collect pinned elements, then serialize it (without id)
346
- const pinnedSubItems = this.subItems.filter(i => i.isPinned())
347
- .map(item => item.asObject({ withChildren: true, keepLocalId: false }));
348
- if (pinnedSubItems.length && this._debug)
349
- console.debug(this._logPrefix + `Saving ${pinnedSubItems.length} pinned items, in local settings`, pinnedSubItems);
350
- this.settings.savePageSetting('menu', pinnedSubItems, 'sub-items');
351
- }));
352
- return firstNotNilPromise(this.dataSubject);
353
- }
354
- _loadMenuItems(config, account) {
355
- if (this._debug)
356
- console.debug(`${this._logPrefix}Loading menu items...`);
357
- // Save previous children of root items
358
- const detachedSubItems = (this.subItems || []).concat(this._staticSubItems || [])
359
- .reduce((res, rootItem) => {
360
- const children = rootItem.children;
361
- if (isEmptyArray(children))
362
- return res;
363
- // Detach all root children
364
- rootItem.children = [];
365
- children.forEach(child => child.parent = null);
366
- // Return root children
367
- return res.concat(children);
368
- }, this._detachedSubItems || []);
369
- // Reset base root items (clean items added by config)
370
- let items = this._staticItems.slice();
371
- // Concat config's items
372
- const configValue = config?.getProperty(CORE_CONFIG_OPTIONS.MENU_ITEMS);
373
- if (isNotNilOrBlank(configValue)) {
374
- try {
375
- const configItems = JSON.parse(configValue);
376
- items = (configItems || []).reduce((res, source) => {
377
- // Normalize the item
378
- const item = this.fromObject({ static: true, ...source }, { computeId: true });
379
- // Skip is already loaded
380
- if (res.find((i) => MenuItems.isSame(i, item)))
381
- return res;
382
- // Reuse existing id, if possible
383
- const existingItem = this.data?.find((i) => MenuItems.isSame(i, item));
384
- if (existingItem) {
385
- item.id = existingItem.id;
386
- }
387
- if (item.after) {
388
- const index = res.findIndex(i => i.title === item.after);
389
- if (index !== -1) {
390
- return res.slice(0, index + 1)
391
- .concat(item)
392
- .concat(res.slice(index + 1));
393
- }
394
- }
395
- else if (item.before) {
396
- const index = res.findIndex(i => i.title === item.before);
397
- if (index !== -1) {
398
- return res.slice(0, index)
399
- .concat(item)
400
- .concat(res.slice(index));
401
- }
402
- }
403
- return res.concat(item);
404
- }, items);
405
- }
406
- catch (err) {
407
- console.error(`${this._logPrefix}Invalid value for option '${CORE_CONFIG_OPTIONS.MENU_ITEMS.key}'. Expected an array of menu item`, err);
408
- }
409
- }
410
- // Filter item using account rights
411
- const opts = { debug: this._debug };
412
- items = items
413
- .filter(item => MenuItems.checkIfVisible(item, account, config, opts))
414
- .map(item => {
415
- // Replace title using a config property
416
- if (isNotNilOrBlank(item.titleProperty) && config) {
417
- item.title = config.properties[item.titleProperty] || item.title;
418
- }
419
- return item;
420
- });
421
- if (this._debug)
422
- console.debug(`${this._logPrefix}Found ${items.length} visible root items...`);
423
- // Re-attach sub menu items
424
- if (this.subMenuEnabled && detachedSubItems.length) {
425
- if (account) {
426
- this._addSubMenuItems(detachedSubItems, { skipIfExists: false, availableParents: detachedSubItems.concat(items) });
427
- }
428
- else {
429
- this._detachedSubItems = detachedSubItems;
430
- }
431
- }
432
- else {
433
- this._detachedSubItems = [];
434
- }
435
- return items;
436
- }
437
- _addSubMenuItems(sources, opts) {
438
- return sources.map(source => this._addSubMenuItem(source, opts));
439
- }
440
- _addSubMenuItem(newItem, opts) {
441
- opts = {
442
- skipIfExists: true,
443
- ...opts,
444
- };
445
- const pathParam = MenuItems.parsePathWithQuery(this.router.routerState.snapshot.url);
446
- // Find if item already exists
447
- const existingItem = this._findExistingItem(newItem, opts?.availableParents);
448
- if (existingItem) {
449
- // No changes
450
- if (opts.skipIfExists && MenuItems.isSame(existingItem, newItem) && existingItem.visible) {
451
- // DEBUG
452
- if (this._debug)
453
- console.debug(`${this._logPrefix}Skipping sub item (same visible item already exist)`, newItem);
454
- return existingItem;
455
- }
456
- if (this._debug)
457
- console.debug(`${this._logPrefix}Updating existing sub item #`, existingItem.id);
458
- // Replace existing item, but keep the existing id
459
- if (newItem !== existingItem) {
460
- newItem.id = existingItem.id;
461
- newItem.$children = existingItem.$children;
462
- newItem.pinned = existingItem.pinned;
463
- newItem.static = existingItem.static;
464
- if (newItem.pinned || newItem.static || existingItem.expanded) {
465
- // If loading, keep existing title if pinned (avoid to show skeleton)
466
- newItem.title = newItem.title || existingItem.title;
467
- }
468
- else {
469
- newItem.title = isNotNil(newItem.title) ? newItem.title : existingItem.title;
470
- }
471
- // Auto set icon, for expand action
472
- if (existingItem.action === 'expand') {
473
- newItem.icon = null;
474
- newItem.matIcon = existingItem.expanded ? 'expand_less' : 'expand_more';
475
- }
476
- }
477
- }
478
- // Generate item's id (if need)
479
- else if (isNil(newItem.id)) {
480
- newItem.id = this._computeNewId();
481
- }
482
- // Default icon for expand action
483
- if (newItem.action === 'expand' && !newItem.matIcon) {
484
- newItem.matIcon = 'expand_more';
485
- }
486
- // If visible, get the parent where to attach the item
487
- const parent = this._findParent(newItem, opts?.availableParents);
488
- if (parent && parent.expanded) {
489
- // Attach item to parent
490
- this._attachMenuToParent(parent, newItem);
491
- // Update detached items :
492
- // - excluded new item
493
- // - attach and exclude those than can be attached to the new item
494
- // Search in detached items one have newItem as parent
495
- if (newItem.expanded) {
496
- const ancestor = newItem.ancestor;
497
- this._detachedSubItems = this._detachedSubItems.concat(...newItem.children)
498
- .reduce((res, item) => {
499
- // Excluded newly add item
500
- if (item.id === newItem.id)
501
- return res;
502
- // If some detached can be attached to the new item: do it
503
- if (MenuItems.checkIfSubMenuVisible(item, pathParam)) {
504
- const parent = this._findParent(item, [ancestor]);
505
- if (parent) {
506
- // Update item's children
507
- const detachedChildren = this._detachSubMenuItems(pathParam, item.children || []);
508
- // Attach item
509
- this._attachMenuToParent(parent, item);
510
- // Remember detached children
511
- return res.concat(...detachedChildren);
512
- }
513
- }
514
- // Detach (if need)
515
- this._detachToParent(item);
516
- // Add to detached items
517
- return res.concat(item);
518
- }, []);
519
- }
520
- else {
521
- // Remove from detached elements
522
- this._detachedSubItems = this._detachedSubItems.filter(item => item.id !== newItem.id);
523
- // Detach children
524
- newItem.children.forEach(item => this._detachToParent(item));
525
- }
526
- }
527
- else {
528
- // Add or update detached item
529
- const detachedIndex = isNotNil(newItem.id) ? this._detachedSubItems.findIndex(item => item.id === newItem.id) : -1;
530
- if (detachedIndex !== -1) {
531
- this._detachedSubItems[detachedIndex] = newItem;
532
- }
533
- else {
534
- this._detachedSubItems.push(newItem);
535
- }
536
- }
537
- // Start listening route
538
- if (!this._$listenRoute.value)
539
- this._$listenRoute.next(true);
540
- return newItem;
541
- }
542
- _computeNewId() {
543
- return this._itemCounter++;
544
- }
545
- _removeSubMenuItem(item) {
546
- const existingItem = this._findExistingItem(item);
547
- if (existingItem) {
548
- this._detachToParent(existingItem);
549
- return existingItem;
550
- }
551
- }
552
- _detachSubMenuItems(currentPathParam, subItems) {
553
- currentPathParam = currentPathParam ? currentPathParam : MenuItems.parsePathWithQuery(this.router.routerState.snapshot.url.toString());
554
- return (subItems || this.subItems)
555
- .reduce((res, subItem) => {
556
- // Not visible => should be detach
557
- if (!MenuItems.checkIfSubMenuVisible(subItem, currentPathParam)) {
558
- this._detachToParent(subItem);
559
- return res.concat(subItem);
560
- }
561
- // Visible: check children
562
- return res.concat(this._detachSubMenuItems(currentPathParam, subItem.children));
563
- }, []);
564
- }
565
- _detachToParent(item) {
566
- if (!item?.parent)
567
- return; // Skip if already detached
568
- let children = item.parent.children || [];
569
- // Remove from parent children
570
- const indexInParent = children.indexOf(item);
571
- if (indexInParent !== -1) {
572
- children = children.slice(); // Copy original array, because it can be used in a loop
573
- children.splice(indexInParent, 1);
574
- item.parent.children = children;
575
- }
576
- item.parent = null;
577
- }
578
- _findExistingItem(searchItem, items, recursive = true) {
579
- items = items || [...this._detachedSubItems, ...this.data];
580
- if (!items.length)
581
- return undefined; // Not found
582
- for (const item of items) {
583
- if (MenuItems.isSameIdOrPathAndParams(searchItem, item))
584
- return item;
585
- if (recursive && item.children) {
586
- const child = this._findExistingItem(searchItem, item.children);
587
- if (child)
588
- return child;
589
- }
590
- }
591
- return null;
592
- }
593
- _findParent(childItem, availableParents) {
594
- if (!childItem?.path)
595
- return undefined;
596
- if (childItem.parent)
597
- return childItem.parent;
598
- availableParents = availableParents || [...this._detachedSubItems, ...this.data];
599
- return availableParents.reduce((res, item) => {
600
- if (!item?.path)
601
- return res;
602
- // A found item already match with the menuItem.parentPath : keep it as it
603
- // There is a found candidate that already match the current candidate : keep it
604
- if (MenuItems.isParent(childItem, res))
605
- return res;
606
- // If the menu item has explicit parentPath and its path and path param are the same as the candidate : use it as parent
607
- if (MenuItems.isParent(childItem, item))
608
- return item;
609
- if (!res && item.children?.length) {
610
- return this._findParent(childItem, item.children);
611
- }
612
- return res;
613
- }, undefined);
614
- }
615
- ;
616
- _attachMenuToParent(parent, child) {
617
- if (this._debug)
618
- console.debug(`${this._logPrefix}Attach sub-menu {${MenuItems.getUrl(child)}} to parent {${MenuItems.getUrl(parent)}}`);
619
- // Avoid to keep identical menu item (we replace it with the new child menu item)
620
- //if (!parent?.$children) parent.$children = new BehaviorSubject<MenuItem[]>([]);
621
- const children = parent.children || [];
622
- const existingIndex = children.findIndex(item => MenuItems.isSameIdOrPathAndParams(item, child));
623
- // Update existing element
624
- if (existingIndex !== -1) {
625
- if (children[existingIndex] !== child) {
626
- children[existingIndex] = child;
627
- parent.children = children;
628
- child.parent = parent;
629
- }
630
- }
631
- else {
632
- children.push(child);
633
- // Sort by tab (or id)
634
- parent.children = children.sort(MenuItems.sortByTabOrId);
635
- child.parent = parent;
636
- }
637
- }
638
- }
639
- MenuService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: MenuService, deps: [{ token: i1.LocalSettingsService }, { token: i2.ConfigService }, { token: i3.AccountService }, { token: i4.Router }, { token: i5.ModalController }, { token: i5.AlertController }, { token: i5.NavController }, { token: i6.TranslateService }, { token: ENVIRONMENT }, { token: APP_MENU_OPTIONS, optional: true }, { token: APP_MENU_ITEMS, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
640
- MenuService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: MenuService, providedIn: 'root' });
641
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: MenuService, decorators: [{
642
- type: Injectable,
643
- args: [{
644
- providedIn: 'root', deps: [ENVIRONMENT]
645
- }]
646
- }], ctorParameters: function () { return [{ type: i1.LocalSettingsService }, { type: i2.ConfigService }, { type: i3.AccountService }, { type: i4.Router }, { type: i5.ModalController }, { type: i5.AlertController }, { type: i5.NavController }, { type: i6.TranslateService }, { type: i7.Environment, decorators: [{
647
- type: Inject,
648
- args: [ENVIRONMENT]
649
- }] }, { type: i8.MenuOptions, decorators: [{
650
- type: Optional
651
- }, {
652
- type: Inject,
653
- args: [APP_MENU_OPTIONS]
654
- }] }, { type: undefined, decorators: [{
655
- type: Optional
656
- }, {
657
- type: Inject,
658
- args: [APP_MENU_ITEMS]
659
- }] }]; } });
660
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9jb3JlL21lbnUvbWVudS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNGLE9BQU8sRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNsRyxPQUFPLEVBQWEsUUFBUSxFQUFFLFNBQVMsRUFBZSxNQUFNLGNBQWMsQ0FBQztBQUMzRSxPQUFPLEVBQUUsYUFBYSxFQUFVLE1BQU0saUJBQWlCLENBQUM7QUFDeEQsT0FBTyxFQUFlLFdBQVcsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQ25GLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMvQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUlqRixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNyRSxPQUFPLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxlQUFlLEVBQUUsUUFBUSxFQUFFLGVBQWUsRUFBRSxTQUFTLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUVwSCxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSwwREFBMEQsQ0FBQztBQUN0RyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUc5RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUcvRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7Ozs7Ozs7Ozs7QUFHbEQs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QUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFckIsc0JBQXNCO1lBQ3RCLE1BQU0sQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDekQsS0FBSyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7U0FDdkI7SUFDSCxDQUFDOzt3R0E1dEJVLFdBQVcsa1FBeUJaLFdBQVcsYUFDQyxnQkFBZ0IsNkJBQ2hCLGNBQWM7NEdBM0J6QixXQUFXLGNBRlYsTUFBTTsyRkFFUCxXQUFXO2tCQUh2QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsV0FBVyxDQUFDO2lCQUN4Qzs7MEJBMEJJLE1BQU07MkJBQUMsV0FBVzs7MEJBQ2xCLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsZ0JBQWdCOzswQkFDbkMsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxjQUFjIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRXZlbnRFbWl0dGVyLCBJbmplY3QsIEluamVjdGFibGUsIEluamVjdGlvblRva2VuLCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBjb21iaW5lTGF0ZXN0LCBmcm9tLCBtZXJnZSwgbWVyZ2VNYXAsIE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IElNZW51SXRlbSwgTWVudUl0ZW0sIE1lbnVJdGVtcywgTWVudU9wdGlvbnMgfSBmcm9tICcuL21lbnUubW9kZWwnO1xuaW1wb3J0IHsgTmF2aWdhdGlvbkVuZCwgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IEVudmlyb25tZW50LCBFTlZJUk9OTUVOVCB9IGZyb20gJy4uLy4uLy4uL2Vudmlyb25tZW50cy9lbnZpcm9ubWVudC5jbGFzcyc7XG5pbXBvcnQgeyBEYXRlVXRpbHMgfSBmcm9tICcuLi8uLi9zaGFyZWQvZGF0ZXMnO1xuaW1wb3J0IHsgZGlzdGluY3RVbnRpbENoYW5nZWQsIGZpbHRlciwgbWFwLCB0aHJvdHRsZVRpbWUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBBY2NvdW50U2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2FjY291bnQuc2VydmljZSc7XG5pbXBvcnQgeyBDb25maWdTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvY29uZmlnLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ29uZmlndXJhdGlvbiB9IGZyb20gJy4uL3NlcnZpY2VzL21vZGVsL2NvbmZpZy5tb2RlbCc7XG5pbXBvcnQgeyBDT1JFX0NPTkZJR19PUFRJT05TIH0gZnJvbSAnLi4vc2VydmljZXMvY29uZmlnL2NvcmUuY29uZmlnJztcbmltcG9ydCB7IGlzRW1wdHlBcnJheSwgaXNOaWwsIGlzTm90RW1wdHlBcnJheSwgaXNOb3ROaWwsIGlzTm90TmlsT3JCbGFuaywgdG9Cb29sZWFuIH0gZnJvbSAnLi4vLi4vc2hhcmVkL2Z1bmN0aW9ucyc7XG5pbXBvcnQgeyBBY2NvdW50IH0gZnJvbSAnLi4vc2VydmljZXMvbW9kZWwvYWNjb3VudC5tb2RlbCc7XG5pbXBvcnQgeyBTdGFydGFibGVPYnNlcnZhYmxlU2VydmljZSB9IGZyb20gJy4uLy4uL3NoYXJlZC9zZXJ2aWNlcy9zdGFydGFibGUtb2JzZXJ2YWJsZS1zZXJ2aWNlLmNsYXNzJztcbmltcG9ydCB7IGZpcnN0Tm90TmlsUHJvbWlzZSB9IGZyb20gJy4uLy4uL3NoYXJlZC9vYnNlcnZhYmxlcyc7XG5pbXBvcnQgeyBJY29uUmVmIH0gZnJvbSAnLi4vLi4vc2hhcmVkL3R5cGVzJztcbmltcG9ydCB7IExvY2FsU2V0dGluZ3NTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvbG9jYWwtc2V0dGluZ3Muc2VydmljZSc7XG5pbXBvcnQgeyBUcmVlSXRlbUVudGl0eVV0aWxzIH0gZnJvbSAnLi4vc2VydmljZXMvbW9kZWwvdHJlZS1pdGVtLWVudGl0eS5tb2RlbCc7XG5pbXBvcnQgeyBBbGVydENvbnRyb2xsZXIsIE1vZGFsQ29udHJvbGxlciwgTmF2Q29udHJvbGxlciB9IGZyb20gJ0Bpb25pYy9hbmd1bGFyJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IEFib3V0TW9kYWwgfSBmcm9tICcuLi9hYm91dC9hYm91dC5tb2RhbCc7XG5cbmV4cG9ydCB0eXBlIFNwbGl0UGFuZVNob3dXaGVuID0gYm9vbGVhbiB8ICdsZyc7XG5leHBvcnQgY29uc3QgREVGQVVMVF9NRU5VX1NIT1dfV0hFTjogU3BsaXRQYW5lU2hvd1doZW4gPSAnbGcnO1xuZXhwb3J0IGNvbnN0IEFQUF9NRU5VX0lURU1TID0gbmV3IEluamVjdGlvblRva2VuPElNZW51SXRlbVtdPignbWVudUl0ZW1zJyk7XG5leHBvcnQgY29uc3QgQVBQX01FTlVfT1BUSU9OUyA9IG5ldyBJbmplY3Rpb25Ub2tlbjxNZW51T3B0aW9ucz4oJ21lbnVPcHRpb25zJyk7XG5cblxuZXhwb3J0IGludGVyZmFjZSBNZW51UGF0aFBhcmFtIHtcbiAgcGF0aDogc3RyaW5nO1xuICBwYXJhbXM6IHtba2V5OiBzdHJpbmddOiBzdHJpbmd9O1xufVxuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290JywgZGVwczogW0VOVklST05NRU5UXVxufSlcbmV4cG9ydCBjbGFzcyBNZW51U2VydmljZSBleHRlbmRzIFN0YXJ0YWJsZU9ic2VydmFibGVTZXJ2aWNlPE1lbnVJdGVtW10+IHtcblxuICByZWFkb25seSBhY2NvdW50Q2hhbmdlcyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8QWNjb3VudD4odW5kZWZpbmVkKTtcbiAgcmVhZG9ubHkgb25QaW5uZWQgPSBuZXcgRXZlbnRFbWl0dGVyPE1lbnVJdGVtPih0cnVlKTtcblxuICBwcml2YXRlIF9zdGF0aWNJdGVtczogTWVudUl0ZW1bXTtcbiAgcHJpdmF0ZSBfZGV0YWNoZWRTdWJJdGVtczogTWVudUl0ZW1bXSA9IFtdO1xuICBwcml2YXRlIF9pdGVtQ291bnRlciA9IDA7XG4gIHByaXZhdGUgcmVhZG9ubHkgX29wdGlvbnM6IE1lbnVPcHRpb25zO1xuICBwcml2YXRlIHJlYWRvbmx5IF9sb2dQcmVmaXggPSAnW21lbnUtc2VydmljZV0gJztcbiAgcHJpdmF0ZSByZWFkb25seSBfJG9wZW5lZCA9IG5ldyBTdWJqZWN0PGJvb2xlYW4+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgXyRzcGxpdFBhbmVXaGVuID0gbmV3IEJlaGF2aW9yU3ViamVjdDxTcGxpdFBhbmVTaG93V2hlbj4oREVGQVVMVF9NRU5VX1NIT1dfV0hFTik7XG4gIHByaXZhdGUgcmVhZG9ubHkgXyRlbmFibGVkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPih0cnVlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfJGVuYWJsZVN1Yk1lbnU6IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPjtcbiAgcHJpdmF0ZSByZWFkb25seSBfJGxpc3RlblJvdXRlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIHNldHRpbmdzOiBMb2NhbFNldHRpbmdzU2VydmljZSxcbiAgICBwcm90ZWN0ZWQgY29uZmlnU2VydmljZTogQ29uZmlnU2VydmljZSxcbiAgICBwcm90ZWN0ZWQgYWNjb3VudFNlcnZpY2U6IEFjY291bnRTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCByb3V0ZXI6IFJvdXRlcixcbiAgICBwcm90ZWN0ZWQgbW9kYWxDdHJsOiBNb2RhbENvbnRyb2xsZXIsXG4gICAgcHJvdGVjdGVkIGFsZXJ0Q29udHJvbGxlcjogQWxlcnRDb250cm9sbGVyLFxuICAgIHByb3RlY3RlZCBuYXZDb250cm9sbGVyOiBOYXZDb250cm9sbGVyLFxuICAgIHByb3RlY3RlZCB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgQEluamVjdChFTlZJUk9OTUVOVCkgcHJvdGVjdGVkIGVudmlyb25tZW50OiBFbnZpcm9ubWVudCxcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEFQUF9NRU5VX09QVElPTlMpIG9wdGlvbnM/OiBNZW51T3B0aW9ucyxcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEFQUF9NRU5VX0lURU1TKSBzdGF0aWNJdGVtcz86IElNZW51SXRlbVtdXG4gICkge1xuICAgIHN1cGVyKHNldHRpbmdzKTtcbiAgICB0aGlzLl9vcHRpb25zID0ge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIHN1Yk1lbnU6IHtcbiAgICAgICAgZGlzYWJsZUljb246IGZhbHNlLFxuICAgICAgICBzYXZlUGlubmVkOiB0cnVlLFxuICAgICAgICAuLi4ob3B0aW9ucz8uc3ViTWVudSB8fCB7fSksXG4gICAgICAgIC8vIEZvcmNlIGRpc2FibGUgb24gbW9iaWxlXG4gICAgICAgIGVuYWJsZTogb3B0aW9ucz8uc3ViTWVudT8uZW5hYmxlICE9PSBmYWxzZSAmJiAhdGhpcy5zZXR0aW5ncy5tb2JpbGUsXG4gICAgICB9XG4gICAgfTtcbiAgICB0aGlzLl8kZW5hYmxlU3ViTWVudSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4odGhpcy5fb3B0aW9ucy5zdWJNZW51LmVuYWJsZSk7XG4gICAgdGhpcy5fZGVidWcgPSAhZW52aXJvbm1lbnQucHJvZHVjdGlvbjtcblxuICAgIHRoaXMuX2RldGFjaGVkU3ViSXRlbXMgPSBbXTtcbiAgICB0aGlzLl9zdGF0aWNJdGVtcyA9IChzdGF0aWNJdGVtcyB8fCBbXSkubWFwKHNvdXJjZSA9PiB7XG4gICAgICBjb25zdCB0YXJnZXQgPSB0aGlzLmZyb21PYmplY3Qoe3N0YXRpYzogdHJ1ZSwgLi4uc291cmNlfSwge2NvbXB1dGVJZDogdHJ1ZSwgZmlsbFBhcmVudDogdHJ1ZSwgZmlsbERlZmF1bHRGcm9tUGFyZW50OiB0cnVlfSk7XG5cbiAgICAgIGNvbnN0IGRldGFjaGVkSXRlbXMgPSBUcmVlSXRlbUVudGl0eVV0aWxzLmRlbGV0ZVJlY3Vyc2l2ZWx5KHRhcmdldCwgKGl0ZW0pID0+IGl0ZW0uc3RhdGljICE9PSB0cnVlKTtcbiAgICAgIGlmIChkZXRhY2hlZEl0ZW1zPy5sZW5ndGgpIHtcbiAgICAgICAgY29uc29sZS5kZWJ1Zyh0aGlzLl9sb2dQcmVmaXggKyAnRGV0YWNoZWQgaW5pdCBpdGVtcycsIGRldGFjaGVkSXRlbXMpO1xuICAgICAgICBkZXRhY2hlZEl0ZW1zLmZvckVhY2goaXRlbSA9PiB0aGlzLl9kZXRhY2hUb1BhcmVudChpdGVtKSk7XG5cbiAgICAgICAgdGhpcy5fZGV0YWNoZWRTdWJJdGVtcy5wdXNoKC4uLmRldGFjaGVkSXRlbXMpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9KTtcbiAgfVxuXG4gIGdldCBvcGVuZWQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuXyRvcGVuZWQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICBnZXQgc3BsaXRQYW5lV2hlbigpOiBPYnNlcnZhYmxlPFNwbGl0UGFuZVNob3dXaGVuPiB7XG4gICAgcmV0dXJuIHRoaXMuXyRzcGxpdFBhbmVXaGVuLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgZ2V0IGVuYWJsZWQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuXyRlbmFibGVkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgZ2V0IHN1Yk1lbnVFbmFibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl8kZW5hYmxlU3ViTWVudS52YWx1ZTtcbiAgfVxuXG4gIGdldCBzdWJJdGVtcygpOiBNZW51SXRlbVtdIHtcbiAgICByZXR1cm4gKHRoaXMuZGF0YSB8fCBbXSkucmVkdWNlKChyZXMsIHJvb3RFbGVtZW50KSA9PiByZXMuY29uY2F0KHJvb3RFbGVtZW50LmNoaWxkcmVuKSwgW10pO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgX3N0YXRpY1N1Ykl0ZW1zKCk6IE1lbnVJdGVtW10ge1xuICAgIHJldHVybiAodGhpcy5fc3RhdGljSXRlbXMgfHwgW10pLnJlZHVjZSgocmVzLCByb290RWxlbWVudCkgPT4gcmVzLmNvbmNhdChyb290RWxlbWVudC5jaGlsZHJlbiksIFtdKTtcbiAgfVxuXG4gIGVuYWJsZSh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuXyRlbmFibGVkLm5leHQodmFsdWUpO1xuICB9XG5cbiAgZW5hYmxlU3ViTWVudSh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuXyRlbmFibGVTdWJNZW51Lm5leHQodmFsdWUpO1xuICB9XG5cbiAgc2V0U3BsaXRQYW5lU2hvd1doZW4odmFsdWU6IFNwbGl0UGFuZVNob3dXaGVuKSB7XG4gICAgaWYgKHRoaXMuXyRzcGxpdFBhbmVXaGVuLnZhbHVlICE9PSB2YWx1ZSkge1xuICAgICAgdGhpcy5fJHNwbGl0UGFuZVdoZW4ubmV4dCh2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgdG9nZ2xlU3BsaXRQYW5lV2hlbigpIHtcbiAgICBpZiAodGhpcy5fJHNwbGl0UGFuZVdoZW4udmFsdWUgIT09IGZhbHNlKSB7XG4gICAgICB0aGlzLl8kc3BsaXRQYW5lV2hlbi5uZXh0KGZhbHNlKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLl8kc3BsaXRQYW5lV2hlbi5uZXh0KERFRkFVTFRfTUVOVV9TSE9XX1dIRU4pO1xuICAgIH1cbiAgfVxuXG4gIGZyb21PYmplY3Qoc291cmNlOiBhbnksIG9wdHM/OiB7d2l0aENoaWxkcmVuPzogYm9vbGVhbjsgY29tcHV0ZUlkPzogYm9vbGVhbjsgZmlsbFBhcmVudD86IGJvb2xlYW47IGZpbGxEZWZhdWx0RnJvbVBhcmVudD86IGJvb2xlYW59KTogTWVudUl0ZW0ge1xuICAgIGNvbnN0IHRhcmdldCA9IE1lbnVJdGVtLmZyb21PYmplY3Qoc291cmNlLCB7d2l0aENoaWxkcmVuOiBmYWxzZX0pO1xuICAgIC8vIENvbXB1dGUgaWQgaWYgbmVlZFxuICAgIGlmIChvcHRzPy5jb21wdXRlSWQgJiYgaXNOaWwodGFyZ2V0LmlkKSkgdGFyZ2V0LmlkID0gdGhpcy5fY29tcHV0ZU5ld0lkKCk7XG5cbiAgICAvLyBSZW1vdmUgaWNvbiBpZiBkaXNhYmxlZFxuICAgIGlmICh0aGlzLl9vcHRpb25zLnN1Yk1lbnUuZGlzYWJsZUljb24pIHtcbiAgICAgIE9iamVjdC5hc3NpZ24odGFyZ2V0LCA8SWNvblJlZj57aWNvbjogdW5kZWZpbmVkLCBtYXRJY29uOiB1bmRlZmluZWQsIG1hdFN2Z0ljb246IHVuZGVmaW5lZH0pO1xuICAgIH1cblxuICAgIC8vIFJlY3Vyc2l2ZVxuICAgIHRhcmdldC5jaGlsZHJlbiA9IChzb3VyY2UuY2hpbGRyZW4gfHwgW10pLm1hcCgoanNvbjogYW55KSA9PiB0aGlzLmZyb21PYmplY3QoanNvbiwgey4uLm9wdHMsIGZpbGxQYXJlbnQ6IGZhbHNlfSkpO1xuXG4gICAgLy8gRmlsbCBwYXJlbnQgKG9uY2UsIHdoZW4gdGhlIGZ1bGwgdHJlZSBpcyByZWFkeSlcbiAgICBpZiAob3B0cz8uZmlsbFBhcmVudCkge1xuICAgICAgVHJlZUl0ZW1FbnRpdHlVdGlscy50cmVlRmlsbFBhcmVudCh0YXJnZXQpO1xuXG4gICAgICAvLyBGaWxsIGRlZmF1bHRzIGZyb20gdGhlIHBhcmVudCAob25jZSBmaWxsZWQpXG4gICAgICBpZiAob3B0cz8uZmlsbERlZmF1bHRGcm9tUGFyZW50KSB7XG4gICAgICAgIFRyZWVJdGVtRW50aXR5VXRpbHMudmlzaXQodGFyZ2V0LCAoaXRlbSkgPT4ge1xuICAgICAgICAgIGlmICghaXRlbS5wYXJlbnQpIHJldHVybjsgLy8gU2tpcCBpZiBubyBwYXJlbnRcbiAgICAgICAgICBpdGVtLnBhcmVudFBhdGggPSBpdGVtLnBhcmVudFBhdGggfHwgaXRlbS5wYXJlbnQucGF0aDtcbiAgICAgICAgICBpdGVtLnBhcmVudFBhdGhQYXJhbXMgPSBpdGVtLnBhcmVudFBhdGhQYXJhbXMgfHwgaXRlbS5wYXJlbnQucGF0aFBhcmFtcztcbiAgICAgICAgICBpdGVtLnN0YXRpYyA9IHRvQm9vbGVhbihpdGVtLnN0YXRpYywgaXRlbS5wYXJlbnQuc3RhdGljKTtcbiAgICAgICAgICAvLyBDb21wdXRlIHBhdGgsIGZyb20gcGFyZW50IHBhdGggKyBhY3Rpb25cbiAgICAgICAgICBpZiAoIWl0ZW0ucGF0aCAmJiAhIWl0ZW0uYWN0aW9uKSB7XG4gICAgICAgICAgICBpdGVtLnBhdGggPSBpdGVtLnBhcmVudC5wYXRoO1xuICAgICAgICAgICAgaXRlbS5wYXRoUGFyYW1zID0gKHR5cGVvZiBpdGVtLmFjdGlvbiA9PT0gJ3N0cmluZycpID8ge2FjdGlvbjogaXRlbS5hY3Rpb259IDoge2FjdGlvbklkOiBpdGVtLmlkLnRvU3RyaW5nKCksIGFjdGlvblRpdGxlOiBpdGVtLnRpdGxlfTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuXG5cbiAgICByZXR1cm4gdGFyZ2V0O1xuICB9XG5cbiAgY3JlYXRlU3ViTWVudShzb3VyY2U6IFBhcnRpYWw8SU1lbnVJdGVtPik6IE1lbnVJdGVtIHtcbiAgICBpZiAoIXRoaXMuc3ViTWVudUVuYWJsZWQpIHJldHVybiBudWxsOyAvLyBTa2lwIGlmIGRpc2FibGVkXG5cbiAgICBjb25zdCB0YXJnZXQgPSB0aGlzLmZyb21PYmplY3Qoc291cmNlKTtcblxuICAgIC8vIENoZWNrIGlmIGV4aXN0c1xuICAgIGlmICh0aGlzLnN0YXJ0ZWQpIHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nSXRlbSA9IHRoaXMuX2ZpbmRFeGlzdGluZ0l0ZW0odGFyZ2V0KTtcbiAgICAgIGlmIChleGlzdGluZ0l0ZW0pIHJldHVybiBleGlzdGluZ0l0ZW07XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlXG4gICAgaWYgKGlzTmlsKHRhcmdldC5pZCkpIHRhcmdldC5pZCA9IHRoaXMuX2NvbXB1dGVOZXdJZCgpO1xuXG4gICAgcmV0dXJuIHRhcmdldDtcbiAgfVxuXG4gIGFzeW5jIGFkZFN1Yk1lbnVJdGVtcyhzb3VyY2VzOiBJTWVudUl0ZW1bXSwgb3B0cz86IHtza2lwSWZFeGlzdHM/OiBib29sZWFufSkge1xuICAgIGlmICghdGhpcy5zdGFydGVkKSBhd2FpdCB0aGlzLnJlYWR5KCk7XG4gICAgaWYgKCF0aGlzLnN1Yk1lbnVFbmFibGVkKSByZXR1cm47IC8vIFNraXBcbiAgICByZXR1cm4gc291cmNlcy5tYXAoc291cmNlID0+IHRoaXMuX2FkZFN1Yk1lbnVJdGVtKHRoaXMuZnJvbU9iamVjdChzb3VyY2UpLCBvcHRzKSk7XG4gIH1cblxuICBhc3luYyBhZGRTdWJNZW51SXRlbShpdGVtOiBJTWVudUl0ZW0sIG9wdHM/OiB7c2tpcElmRXhpc3RzPzogYm9vbGVhbn0pIHtcbiAgICBpZiAoIXRoaXMuc3RhcnRlZCkgYXdhaXQgdGhpcy5yZWFkeSgpO1xuICAgIGlmICghdGhpcy5zdWJNZW51RW5hYmxlZCkgcmV0dXJuOyAvLyBTa2lwXG4gICAgcmV0dXJuIHRoaXMuX2FkZFN1Yk1lbnVJdGVtKHRoaXMuZnJvbU9iamVjdChpdGVtKSwgb3B0cyk7XG4gIH1cblxuICBhc3luYyByZW1vdmVTdWJNZW51SXRlbXMoaXRlbXM6IElNZW51SXRlbVtdKSB7XG4gICAgaWYgKCF0aGlzLnN0YXJ0ZWQpIGF3YWl0IHRoaXMucmVhZHkoKTtcbiAgICByZXR1cm4gKGl0ZW1zIHx8IFtdKS5tYXAoaXRlbSA9PiB0aGlzLl9yZW1vdmVTdWJNZW51SXRlbSh0aGlzLmZyb21PYmplY3QoaXRlbSkpKTtcbiAgfVxuXG4gIGFzeW5jIHJlbW92ZVN1Yk1lbnVJdGVtKGl0ZW06IElNZW51SXRlbSkge1xuICAgIGlmICghdGhpcy5zdGFydGVkKSBhd2FpdCB0aGlzLnJlYWR5KCk7XG4gICAgcmV0dXJuIHRoaXMuX3JlbW92ZVN1Yk1lbnVJdGVtKHRoaXMuZnJvbU9iamVjdChpdGVtKSk7XG4gIH1cblxuICB0b2dnbGVQaW5uZWQoc291cmNlOiBJTWVudUl0ZW0pIHtcbiAgICBjb25zdCBpdGVtID0gKHNvdXJjZSBpbnN0YW5jZW9mIE1lbnVJdGVtKSA/IHNvdXJjZSA6IHRoaXMuX2ZpbmRFeGlzdGluZ0l0ZW0odGhpcy5mcm9tT2JqZWN0KHNvdXJjZSkpO1xuXG4gICAgLy8gU2tpcCBpZiBub3QgZm91bmRcbiAgICBpZiAoIWl0ZW0pIHtcbiAgICAgIGlmICh0aGlzLl9kZWJ1ZykgY29uc29sZS53YXJuKHRoaXMuX2xvZ1ByZWZpeCArIGBTdWIgbWVudSB7JHtzb3VyY2UucGF0aH19IGNhbm5vdCBiZSBmb3VuZCAtIHVuYWJsZSB0byB0b2dnbGUgcGlubmVkIWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFNraXAgaWYgc3RhdGljXG4gICAgaWYgKGl0ZW0uc3RhdGljKSByZXR1cm47XG5cbiAgICAvLyBVbnBpbm5lZFxuICAgIGlmIChpdGVtLnBpbm5lZCkge1xuICAgICAgaXRlbS5waW5uZWQgPSBmYWxzZTtcbiAgICAgIGlmICghaXRlbS5kZXRhY2hlZCkge1xuXG4gICAgICAgIHRoaXMuX2RldGFjaGVkU3ViSXRlbXMgPSBbXG4gICAgICAgICAgLi4udGhpcy5fZGV0YWNoZWRTdWJJdGVtcyxcbiAgICAgICAgICAuLi50aGlzLl9kZXRhY2hTdWJNZW51SXRlbXMoKVxuICAgICAgICBdO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFBpbm5lZFxuICAgIGVsc2Uge1xuICAgICAgaXRlbS5waW5uZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIHRoaXMub25QaW5uZWQuZW1pdChpdGVtKTtcbiAgfVxuXG5cbiAgYXN5bmMgZXhlY3V0ZUFjdGlvbihldmVudDogRXZlbnQsIGl0ZW06IE1lbnVJdGVtKSB7XG4gICAgY29uc3QgYWN0aW9uID0gaXRlbT8uYWN0aW9uO1xuICAgIGlmICghYWN0aW9uKSByZXR1cm47IC8vIHNraXBcbiAgICBpZiAodHlwZW9mIGFjdGlvbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHN3aXRjaCAoYWN0aW9uIGFzIHN0cmluZykge1xuICAgICAgICBjYXNlICdsb2dvdXQnOlxuICAgICAgICAgIGF3YWl0IHRoaXMubG9nb3V0KCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2Fib3V0JzpcbiAgICAgICAgICBhd2FpdCB0aGlzLm9wZW5BYm91dE1vZGFsKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2V4cGFuZCc6XG4gICAgICAgICAgYXdhaXQgdGhpcy50b2dnbGVFeHBhbmRhYmxlSXRlbShpdGVtKTtcbiAgICAgICAgICBpZiAoaXRlbS5wYXRoKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLm5hdkNvbnRyb2xsZXIubmF2aWdhdGVSb290KGl0ZW0ucGF0aCwge1xuICAgICAgICAgICAgICBxdWVyeVBhcmFtczogaXRlbS5wYXRoUGFyYW1zXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICBpZiAoaXRlbS5wYXRoKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLm5hdkNvbnRyb2xsZXIubmF2aWdhdGVSb290KGl0ZW0ucGF0aCwge1xuICAgICAgICAgICAgICBxdWVyeVBhcmFtczogaXRlbS5wYXRoUGFyYW1zXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gYWN0aW9uOiAnICsgYWN0aW9uKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZW9mIGFjdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgKGFjdGlvbiBhcyB1bmtub3duIGFzIGFueSkoZXZlbnQpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGxvZ291dCgpIHtcbiAgICBjb25zdCB0cmFuc2xhdGlvbnMgPSBhd2FpdCB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KFtcbiAgICAgICdBVVRILkxPR09VVC5DT05GSVJNX1RJVExFJyxcbiAgICAgICdBVVRILkxPR09VVC5DT05GSVJNX01FU1NBR0UnLFxuICAgICAgJ0NPTU1PTi5CVE5fQ0FOQ0VMJyxcbiAgICAgICdBVVRILkxPR09VVC5CVE5fQ09ORklSTScsXG4gICAgXSk7XG4gICAgY29uc3QgYWxlcnQgPSBhd2FpdCB0aGlzLmFsZXJ0Q29udHJvbGxlci5jcmVhdGUoe1xuICAgICAgaGVhZGVyOiB0cmFuc2xhdGlvbnNbJ0FVVEguTE9HT1VULkNPTkZJUk1fVElUTEUnXSxcbiAgICAgIG1lc3NhZ2U6IHRyYW5zbGF0aW9uc1snQVVUSC5MT0dPVVQuQ09ORklSTV9NRVNTQUdFJ10sXG4gICAgICBidXR0b25zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiB0cmFuc2xhdGlvbnNbJ0NPTU1PTi5CVE5fQ0FOQ0VMJ10sXG4gICAgICAgICAgcm9sZTogJ2NhbmNlbCcsXG4gICAgICAgICAgY3NzQ2xhc3M6ICdzZWNvbmRhcnknLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdGV4dDogdHJhbnNsYXRpb25zWydBVVRILkxPR09VVC5CVE5fQ09ORklSTSddLFxuICAgICAgICAgIGNzc0NsYXNzOiAnaW9uLWNvbG9yLXByaW1hcnknLFxuICAgICAgICAgIGhhbmRsZXI6ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuYWNjb3VudFNlcnZpY2UubG9nb3V0KCk7XG5cbiAgICAgICAgICAgIC8vIEJhY2sgdG8gaG9tZVxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLm5hdkNvbnRyb2xsZXIubmF2aWdhdGVSb290KCcvJyksIDEwMCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSk7XG5cbiAgICBhd2FpdCBhbGVydC5wcmVzZW50KCk7XG4gIH1cblxuICBhc3luYyBvcGVuQWJvdXRNb2RhbCgpIHtcbiAgICBjb25zdCBtb2RhbCA9IGF3YWl0IHRoaXMubW9kYWxDdHJsLmNyZWF0ZSh7IGNvbXBvbmVudDogQWJvdXRNb2RhbCB9KTtcbiAgICByZXR1cm4gbW9kYWwucHJlc2VudCgpO1xuICB9XG5cbiAgYXN5bmMgdG9nZ2xlRXhwYW5kYWJsZUl0ZW0oaXRlbTogTWVudUl0ZW0pIHtcbiAgICBpZiAoIWl0ZW0uZXhwYW5kZWQpIHtcbiAgICAgIGlmICh0aGlzLl9kZWJ1ZykgY29uc29sZS5kZWJ1Zyh0aGlzLl9sb2dQcmVmaXggKyAnRXhwYW5kIGl0ZW0nLCBpdGVtKTtcblxuICAgICAgaXRlbS5tYXRJY29uID0gJ2V4cGFuZF9sZXNzJztcblxuICAgICAgLy8gVHJ5IHRvIGF0dGFjaCBzb21lIGl0ZW1cbiAgICAgIHRoaXMuX2RldGFjaGVkU3ViSXRlbXNcbiAgICAgICAgLmZpbHRlcihjaGlsZEl0ZW0gPT4gISF0aGlzLl9maW5kUGFyZW50KGNoaWxkSXRlbSwgW2l0ZW1dKSlcbiAgICAgICAgLmZvckVhY2goY2hpbGRJdGVtID0+IHRoaXMuX2F0dGFjaE1lbnVUb1BhcmVudChpdGVtLCBjaGlsZEl0ZW0pKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBpdGVtLm1hdEljb24gPSAnZXhwYW5kX21vcmUnO1xuXG4gICAgICB0aGlzLl9kZXRhY2hlZFN1Ykl0ZW1zID0gW1xuICAgICAgICAuLi50aGlzLl9kZXRhY2hlZFN1Ykl0ZW1zLFxuICAgICAgICAuLi50aGlzLl9kZXRhY2hTdWJNZW51SXRlbXMoe3BhdGg6ICcvJywgcGFyYW1zOiB7fX0sIGl0ZW0uY2hpbGRyZW4pXG4gICAgICBdO1xuICAgIH1cbiAgfVxuXG4gIF9tYXJrQXNPcGVuZWQoKSB7XG4gICAgdGhpcy5fJG9wZW5lZC5uZXh0KHRydWUpO1xuICB9XG5cbiAgX21hcmtBc0Nsb3NlZCgpIHtcbiAgICB0aGlzLl8kb3BlbmVkLm5leHQoZmFsc2UpO1xuICB9XG5cbiAgYXN5bmMgY2xvc2UoKSB7XG4gICAgdGhpcy5fJG9wZW5lZC5uZXh0KGZhbHNlKTtcbiAgfVxuXG4gIGFzeW5jIG9wZW4oKSB7XG4gICAgdGhpcy5fJG9wZW5lZC5uZXh0KHRydWUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIG5nT25TdGFydCgpIHtcbiAgICBjb25zb2xlLmluZm8oYCR7dGhpcy5fbG9nUHJlZml4fVN0YXJ0aW5nLi4uYCk7XG5cbiAgICAvLyBSZXN0b3JlIHN1YiBpdGVtcyBmcm9tIHNldHRpbmdzXG4gICAgYXdhaXQgdGhpcy5zZXR0aW5ncy5yZWFkeSgpO1xuICAgIGNvbnN0IHNldHRpbmdzU3ViSXRlbXM6IElNZW51SXRlbVtdID0gdGhpcy5zZXR0aW5ncy5nZXRQYWdlU2V0dGluZ3MoJ21lbnUnLCAnc3ViLWl0ZW1zJyk7XG4gICAgaWYgKGlzTm90RW1wdHlBcnJheShzZXR0aW5nc1N1Ykl0ZW1zKSkge1xuICAgICAgY29uc29sZS5kZWJ1Zyh0aGlzLl9sb2dQcmVmaXggKyAnUmVzdG9yaW5nIHBpbm5lZCBpdGVtcyBmcm9tIHNldHRpbmdzLi4uJywgc2V0dGluZ3NTdWJJdGVtcyk7XG4gICAgICB0aGlzLl9kZXRhY2hlZFN1Ykl0ZW1zID0gc2V0dGluZ3NTdWJJdGVtcy5tYXAoc291cmNlID0+IHRoaXMuZnJvbU9iamVjdChzb3VyY2UsIHtjb21wdXRlSWQ6IHRydWUsIGZpbGxQYXJlbnQ6IHRydWV9KSk7XG4gICAgfVxuXG4gICAgY29uc3QgYWNjb3VudEV2ZW50JCA9IG1lcmdlKFxuICAgICAgZnJvbSh0aGlzLmFjY291bnRTZXJ2aWNlLnJlYWR5KCkpLFxuICAgICAgdGhpcy5hY2NvdW50U2VydmljZS5vbkxvZ2luLFxuICAgICAgdGhpcy5hY2NvdW50U2VydmljZS5vbkxvZ291dC5waXBlKFxuICAgICAgICBtYXAoXyA9PiBudWxsKVxuICAgICAgKVxuICAgICkucGlwZShcbiAgICAgIG1hcChhY2NvdW50ID0+IGlzTm90TmlsKGFjY291bnQ/LmlkKSA/IGFjY291bnQgOiBudWxsKSxcbiAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKChhMSwgYTIpID0+IERhdGVVdGlscy5pc1NhbWUoYTE/LnVwZGF0ZURhdGUsIGEyPy51cGRhdGVEYXRlKSlcbiAgICApO1xuXG4gICAgdGhpcy5yZWdpc3RlclN1YnNjcmlwdGlvbihcbiAgICAgIC8vIENvbWJpbmUgY29uZmlnIGFuZCBhY2NvdW50IGV2ZW50c1xuICAgICAgY29tYmluZUxhdGVzdChbXG4gICAgICAgIHRoaXMuY29uZmlnU2VydmljZS5jb25maWcsXG4gICAgICAgIGFjY291bnRFdmVudCRcbiAgICAgIF0pLnN1YnNjcmliZSgoW2NvbmZpZywgYWNjb3VudF0pID0+IHtcbiAgICAgICAgaWYgKHRoaXMuX2RlYnVnKSBjb25zb2xlLmRlYnVnKGAke3RoaXMuX2xvZ1ByZWZpeH1SZWNlaXZlZCBjb25maWcgb3IgYWNjb3VudCBldmVudC4gUmVmcmVzaGluZyBpdGVtcy4uLmAsIGFjY291bnQpO1xuXG4gICAgICAgIC8vIExvYWQgYWxsIGl0ZW1zXG4gICAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5fbG9hZE1lbnVJdGVtcyhjb25maWcsIGFjY291bnQpO1xuXG4gICAgICAgIC8vIEVtaXQgbmV3IHJvb3QgaXRlbXNcbiAgICAgICAgdGhpcy5kYXRhU3ViamVjdC5uZXh0KGl0ZW1zKTtcblxuICAgICAgICAvLyBFbWl0IGFjY291bnQgY2hhbmdlcyBldmVudFxuICAgICAgICB0aGlzLmFjY291bnRDaGFuZ2VzLm5leHQoYWNjb3VudCk7XG4gICAgICB9KVxuICAgICk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyU3Vic2NyaXB0aW9uKFxuICAgICAgbWVyZ2UoXG4gICAgICAgIHRoaXMuYWNjb3VudENoYW5nZXMucGlwZShcbiAgICAgICAgICBtYXAoKCkgPT4gTWVudUl0ZW1zLnBhcnNlUGF0aFdpdGhRdWVyeSh0aGlzLnJvdXRlci5yb3V0ZXJTdGF0ZS5zbmFwc2hvdC51cmwpKVxuICAgICAgICApLFxuICAgICAgICB0aGlzLl8kbGlzdGVuUm91dGUucGlwZShcbiAgICAgICAgICBmaWx0ZXIobGlzdGVuID0+IGxpc3RlbiA9PT0gdHJ1ZSAmJiB0aGlzLnN0YXJ0ZWQpLFxuICAgICAgICAgIG1lcmdlTWFwKF8gPT4gdGhpcy5yb3V0ZXIuZXZlbnRzKSxcbiAgICAgICAgICBmaWx0ZXIoZXZlbnQgPT4gZXZlbnQgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uRW5kKSxcbiAgICAgICAgICBtYXAoKGV2ZW50OiBOYXZpZ2F0aW9uRW5kKSA9PiBNZW51SXRlbXMucGFyc2VQYXRoV2l0aFF1ZXJ5KGV2ZW50LnVybCkpLFxuICAgICAgICApXG4gICAgICApLnBpcGUoXG4gICAgICAgIHRocm90dGxlVGltZSgyNTApXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKHBhdGhQYXJhbSA9PiB7XG4gICAgICAgIGNvbnN0IGRldGFjaGVkU3ViSXRlbXMgPSB0aGlzLl9kZXRhY2hTdWJNZW51SXRlbXMocGF0aFBhcmFtKTtcbiAgICAgICAgaWYgKGRldGFjaGVkU3ViSXRlbXM/Lmxlbmd0aCkge1xuICAgICAgICAgIHRoaXMuX2RldGFjaGVkU3ViSXRlbXMgPSBbXG4gICAgICAgICAgICAuLi50aGlzLl9kZXRhY2hlZFN1Ykl0ZW1zLFxuICAgICAgICAgICAgLi4uZGV0YWNoZWRTdWJJdGVtc1xuICAgICAgICAgIF07XG5cbiAgICAgICAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoYCR7dGhpcy5fbG9nUHJlZml4fU5ld2x5IGRldGFjaGVkIGl0ZW1zOiBgLCBkZXRhY2hlZFN1Ykl0ZW1zKTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuXG5cbiAgICAvLyBTYXZlIHBpbm5lZCBpdGVtc1xuICAgIHRoaXMucmVnaXN0ZXJTdWJzY3JpcHRpb24oXG4gICAgICB0aGlzLm9uUGlubmVkXG4gICAgICAgIC5zdWJzY3JpYmUoaXRlbSA9PiB7XG5cbiAgICAgICAgICAvLyBDb2xsZWN0IHBpbm5lZCBlbGVtZW50cywgdGhlbiBzZXJpYWxpemUgaXQgKHdpdGhvdXQgaWQpXG4gICAgICAgICAgY29uc3QgcGlubmVkU3ViSXRlbXMgPSB0aGlzLnN1Ykl0ZW1zLmZpbHRlcihpID0+IGkuaXNQaW5uZWQoKSlcbiAgICAgICAgICAgIC5tYXAoaXRlbSA9PiBpdGVtLmFzT2JqZWN0KHt3aXRoQ2hpbGRyZW46IHRydWUsIGtlZXBMb2NhbElkOiBmYWxzZX0pKTtcblxuICAgICAgICAgIGlmIChwaW5uZWRTdWJJdGVtcy5sZW5ndGggJiYgdGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcodGhpcy5fbG9nUHJlZml4ICsgYFNhdmluZyAke3Bpbm5lZFN1Ykl0ZW1zLmxlbmd0aH0gcGlubmVkIGl0ZW1zLCBpbiBsb2NhbCBzZXR0aW5nc2AsIHBpbm5lZFN1Ykl0ZW1zKTtcbiAgICAgICAgICB0aGlzLnNldHRpbmdzLnNhdmVQYWdlU2V0dGluZygnbWVudScsIHBpbm5lZFN1Ykl0ZW1zLCAnc3ViLWl0ZW1zJyk7XG4gICAgICAgIH0pXG4gICAgKTtcblxuICAgIHJldHVybiBmaXJzdE5vdE5pbFByb21pc2UodGhpcy5kYXRhU3ViamVjdCk7XG4gIH1cblxuICBwcml2YXRlIF9sb2FkTWVudUl0ZW1zKGNvbmZpZzogQ29uZmlndXJhdGlvbnxudWxsLCBhY2NvdW50OiBBY2NvdW50fG51bGwpIHtcbiAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoYCR7dGhpcy5fbG9nUHJlZml4fUxvYWRpbmcgbWVudSBpdGVtcy4uLmApO1xuXG4gICAgLy8gU2F2ZSBwcmV2aW91cyBjaGlsZHJlbiBvZiByb290IGl0ZW1zXG4gICAgY29uc3QgZGV0YWNoZWRTdWJJdGVtcyA9ICh0aGlzLnN1Ykl0ZW1zIHx8IFtdKS5jb25jYXQodGhpcy5fc3RhdGljU3ViSXRlbXMgfHwgW10pXG4gICAgICAucmVkdWNlKChyZXMsIHJvb3RJdGVtKSA9PiB7XG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gcm9vdEl0ZW0uY2hpbGRyZW47XG4gICAgICAgIGlmIChpc0VtcHR5QXJyYXkoY2hpbGRyZW4pKSByZXR1cm4gcmVzO1xuICAgICAgICAvLyBEZXRhY2ggYWxsIHJvb3QgY2hpbGRyZW5cbiAgICAgICAgcm9vdEl0ZW0uY2hpbGRyZW4gPSBbXTtcbiAgICAgICAgY2hpbGRyZW4uZm9yRWFjaChjaGlsZCA9PiBjaGlsZC5wYXJlbnQgPSBudWxsKTtcbiAgICAgICAgLy8gUmV0dXJuIHJvb3QgY2hpbGRyZW5cbiAgICAgICAgcmV0dXJuIHJlcy5jb25jYXQoY2hpbGRyZW4pO1xuICAgICAgfSwgdGhpcy5fZGV0YWNoZWRTdWJJdGVtcyB8fCBbXSk7XG5cbiAgICAvLyBSZXNldCBiYXNlIHJvb3QgaXRlbXMgKGNsZWFuIGl0ZW1zIGFkZGVkIGJ5IGNvbmZpZylcbiAgICBsZXQgaXRlbXM6IE1lbnVJdGVtW10gPSB0aGlzLl9zdGF0aWNJdGVtcy5zbGljZSgpO1xuXG4gICAgLy8gQ29uY2F0IGNvbmZpZydzIGl0ZW1zXG4gICAgY29uc3QgY29uZmlnVmFsdWU6IHN0cmluZyA9IGNvbmZpZz8uZ2V0UHJvcGVydHkoQ09SRV9DT05GSUdfT1BUSU9OUy5NRU5VX0lURU1TKTtcbiAgICBpZiAoaXNOb3ROaWxPckJsYW5rKGNvbmZpZ1ZhbHVlKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY29uZmlnSXRlbXMgPSBKU09OLnBhcnNlKGNvbmZpZ1ZhbHVlKSBhcyBJTWVudUl0ZW1bXTtcbiAgICAgICAgaXRlbXMgPSAoY29uZmlnSXRlbXMgfHwgW10pLnJlZHVjZSgocmVzOiBNZW51SXRlbVtdLCBzb3VyY2UpID0+IHtcblxuICAgICAgICAgIC8vIE5vcm1hbGl6ZSB0aGUgaXRlbVxuICAgICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmZyb21PYmplY3Qoe3N0YXRpYzogdHJ1ZSwgLi4uc291cmNlfSwge2NvbXB1dGVJZDogdHJ1ZX0pO1xuXG4gICAgICAgICAgLy8gU2tpcCBpcyBhbHJlYWR5IGxvYWRlZFxuICAgICAgICAgIGlmIChyZXMuZmluZCgoaSkgPT4gTWVudUl0ZW1zLmlzU2FtZShpLCBpdGVtKSkpIHJldHVybiByZXM7XG5cbiAgICAgICAgICAvLyBSZXVzZSBleGlzdGluZyBpZCwgaWYgcG9zc2libGVcbiAgICAgICAgICBjb25zdCBleGlzdGluZ0l0ZW0gPSB0aGlzLmRhdGE/LmZpbmQoKGkpID0+IE1lbnVJdGVtcy5pc1NhbWUoaSwgaXRlbSkpO1xuICAgICAgICAgIGlmIChleGlzdGluZ0l0ZW0pIHtcbiAgICAgICAgICAgIGl0ZW0uaWQgPSBleGlzdGluZ0l0ZW0uaWQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGl0ZW0uYWZ0ZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gcmVzLmZpbmRJbmRleChpID0+IGkudGl0bGUgPT09IGl0ZW0uYWZ0ZXIpO1xuICAgICAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgICByZXR1cm4gcmVzLnNsaWNlKDAsIGluZGV4ICsgMSlcbiAgICAgICAgICAgICAgICAuY29uY2F0KGl0ZW0pXG4gICAgICAgICAgICAgICAgLmNvbmNhdChyZXMuc2xpY2UoaW5kZXggKyAxKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2UgaWYgKGl0ZW0uYmVmb3JlKSB7XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHJlcy5maW5kSW5kZXgoaSA9PiBpLnRpdGxlID09PSBpdGVtLmJlZm9yZSk7XG4gICAgICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICAgIHJldHVybiByZXMuc2xpY2UoMCwgaW5kZXgpXG4gICAgICAgICAgICAgICAgLmNvbmNhdChpdGVtKVxuICAgICAgICAgICAgICAgIC5jb25jYXQocmVzLnNsaWNlKGluZGV4KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByZXMuY29uY2F0KGl0ZW0pO1xuICAgICAgICB9LCBpdGVtcyk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgJHt0aGlzLl9sb2dQcmVmaXh9SW52YWxpZCB2YWx1ZSBmb3Igb3B0aW9uICcke0NPUkVfQ09ORklHX09QVElPTlMuTUVOVV9JVEVNUy5rZXl9Jy4gRXhwZWN0ZWQgYW4gYXJyYXkgb2YgbWVudSBpdGVtYCwgZXJyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBGaWx0ZXIgaXRlbSB1c2luZyBhY2NvdW50IHJpZ2h0c1xuICAgIGNvbnN0IG9wdHMgPSB7ZGVidWc6IHRoaXMuX2RlYnVnfTtcbiAgICBpdGVtcyA9IGl0ZW1zXG4gICAgICAuZmlsdGVyKGl0ZW0gPT4gTWVudUl0ZW1zLmNoZWNrSWZWaXNpYmxlKGl0ZW0sIGFjY291bnQsIGNvbmZpZywgb3B0cykpXG4gICAgICAubWFwKGl0ZW0gPT4ge1xuICAgICAgICAvLyBSZXBsYWNlIHRpdGxlIHVzaW5nIGEgY29uZmlnIHByb3BlcnR5XG4gICAgICAgIGlmIChpc05vdE5pbE9yQmxhbmsoaXRlbS50aXRsZVByb3BlcnR5KSAmJiBjb25maWcpIHtcbiAgICAgICAgICBpdGVtLnRpdGxlID0gY29uZmlnLnByb3BlcnRpZXNbaXRlbS50aXRsZVByb3BlcnR5XSB8fCBpdGVtLnRpdGxlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgICB9KTtcblxuICAgIGlmICh0aGlzLl9kZWJ1ZykgY29uc29sZS5kZWJ1ZyhgJHt0aGlzLl9sb2dQcmVmaXh9Rm91bmQgJHtpdGVtcy5sZW5ndGh9IHZpc2libGUgcm9vdCBpdGVtcy4uLmApO1xuXG4gICAgLy8gUmUtYXR0YWNoIHN1YiBtZW51IGl0ZW1zXG4gICAgaWYgKHRoaXMuc3ViTWVudUVuYWJsZWQgJiYgZGV0YWNoZWRTdWJJdGVtcy5sZW5ndGgpIHtcbiAgICAgIGlmIChhY2NvdW50KSB7XG4gICAgICAgIHRoaXMuX2FkZFN1Yk1lbnVJdGVtcyhkZXRhY2hlZFN1Ykl0ZW1zLCB7c2tpcElmRXhpc3RzOiBmYWxzZSwgYXZhaWxhYmxlUGFyZW50czogZGV0YWNoZWRTdWJJdGVtcy5jb25jYXQoaXRlbXMpfSk7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgdGhpcy5fZGV0YWNoZWRTdWJJdGVtcyA9IGRldGFjaGVkU3ViSXRlbXM7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5fZGV0YWNoZWRTdWJJdGVtcyA9IFtdO1xuICAgIH1cblxuICAgIHJldHVybiBpdGVtcztcbiAgfVxuXG4gIHByaXZhdGUgX2FkZFN1Yk1lbnVJdGVtcyhzb3VyY2VzOiBNZW51SXRlbVtdLCBvcHRzPzoge3NraXBJZkV4aXN0cz86IGJvb2xlYW47IGF2YWlsYWJsZVBhcmVudHM/OiBNZW51SXRlbVtdfSkge1xuICAgIHJldHVybiBzb3VyY2VzLm1hcChzb3VyY2UgPT4gdGhpcy5fYWRkU3ViTWVudUl0ZW0oc291cmNlLCBvcHRzKSk7XG4gIH1cblxuICBwcml2YXRlIF9hZGRTdWJNZW51SXRlbShuZXdJdGVtOiBNZW51SXRlbSwgb3B0cz86IHtza2lwSWZFeGlzdHM/OiBib29sZWFuOyBhdmFpbGFibGVQYXJlbnRzPzogTWVudUl0ZW1bXX0pIHtcbiAgICBvcHRzID0ge1xuICAgICAgc2tpcElmRXhpc3RzOiB0cnVlLFxuICAgICAgLi4ub3B0cyxcbiAgICB9O1xuXG4gICAgY29uc3QgcGF0aFBhcmFtID0gTWVudUl0ZW1zLnBhcnNlUGF0aFdpdGhRdWVyeSh0aGlzLnJvdXRlci5yb3V0ZXJTdGF0ZS5zbmFwc2hvdC51cmwpO1xuXG4gICAgLy8gRmluZCBpZiBpdGVtIGFscmVhZHkgZXhpc3RzXG4gICAgY29uc3QgZXhpc3RpbmdJdGVtID0gdGhpcy5fZmluZEV4aXN0aW5nSXRlbShuZXdJdGVtLCBvcHRzPy5hdmFpbGFibGVQYXJlbnRzKTtcbiAgICBpZiAoZXhpc3RpbmdJdGVtKSB7XG4gICAgICAvLyBObyBjaGFuZ2VzXG4gICAgICBpZiAob3B0cy5za2lwSWZFeGlzdHMgJiYgTWVudUl0ZW1zLmlzU2FtZShleGlzdGluZ0l0ZW0sIG5ld0l0ZW0pICYmIGV4aXN0aW5nSXRlbS52aXNpYmxlKSB7XG4gICAgICAgIC8vIERFQlVHXG4gICAgICAgIGlmICh0aGlzLl9kZWJ1ZykgY29uc29sZS5kZWJ1ZyhgJHt0aGlzLl9sb2dQcmVmaXh9U2tpcHBpbmcgc3ViIGl0ZW0gKHNhbWUgdmlzaWJsZSBpdGVtIGFscmVhZHkgZXhpc3QpYCwgbmV3SXRlbSk7XG4gICAgICAgIHJldHVybiBleGlzdGluZ0l0ZW07XG4gICAgICB9XG5cblxuICAgICAgaWYgKHRoaXMuX2RlYnVnKSBjb25zb2xlLmRlYnVnKGAke3RoaXMuX2xvZ1ByZWZpeH1VcGRhdGluZyBleGlzdGluZyBzdWIgaXRlbSAjYCwgZXhpc3RpbmdJdGVtLmlkKTtcblxuICAgICAgLy8gUmVwbGFjZSBleGlzdGluZyBpdGVtLCBidXQga2VlcCB0aGUgZXhpc3RpbmcgaWRcbiAgICAgIGlmIChuZXdJdGVtICE9PSBleGlzdGluZ0l0ZW0pIHtcbiAgICAgICAgbmV3SXRlbS5pZCA9IGV4aXN0aW5nSXRlbS5pZDtcbiAgICAgICAgbmV3SXRlbS4kY2hpbGRyZW4gPSBleGlzdGluZ0l0ZW0uJGNoaWxkcmVuO1xuICAgICAgICBuZXdJdGVtLnBpbm5lZCA9IGV4aXN0aW5nSXRlbS5waW5uZWQ7XG4gICAgICAgIG5ld0l0ZW0uc3RhdGljID0gZXhpc3RpbmdJdGVtLnN0YXRpYztcbiAgICAgICAgaWYgKG5ld0l0ZW0ucGlubmVkIHx8IG5ld0l0ZW0uc3RhdGljIHx8IGV4aXN0aW5nSXRlbS5leHBhbmRlZCkge1xuICAgICAgICAgIC8vIElmIGxvYWRpbmcsIGtlZXAgZXhpc3RpbmcgdGl0bGUgaWYgcGlubmVkIChhdm9pZCB0byBzaG93IHNrZWxldG9uKVxuICAgICAgICAgIG5ld0l0ZW0udGl0bGUgPSBuZXdJdGVtLnRpdGxlIHx8IGV4aXN0aW5nSXRlbS50aXRsZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBuZXdJdGVtLnRpdGxlID0gaXNOb3ROaWwobmV3SXRlbS50aXRsZSkgPyBuZXdJdGVtLnRpdGxlIDogZXhpc3RpbmdJdGVtLnRpdGxlO1xuICAgICAgICB9XG4gICAgICAgIC8vIEF1dG8gc2V0IGljb24sIGZvciBleHBhbmQgYWN0aW9uXG4gICAgICAgIGlmIChleGlzdGluZ0l0ZW0uYWN0aW9uID09PSAnZXhwYW5kJykge1xuICAgICAgICAgIG5ld0l0ZW0uaWNvbiA9IG51bGw7XG4gICAgICAgICAgbmV3SXRlbS5tYXRJY29uID0gZXhpc3RpbmdJdGVtLmV4cGFuZGVkID8gJ2V4cGFuZF9sZXNzJyA6ICdleHBhbmRfbW9yZSc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBHZW5lcmF0ZSBpdGVtJ3MgaWQgKGlmIG5lZWQpXG4gICAgZWxzZSBpZiAoaXNOaWwobmV3SXRlbS5pZCkpIHtcbiAgICAgIG5ld0l0ZW0uaWQgPSB0aGlzLl9jb21wdXRlTmV3SWQoKTtcbiAgICB9XG5cbiAgICAvLyBEZWZhdWx0IGljb24gZm9yIGV4cGFuZCBhY3Rpb25cbiAgICBpZiAobmV3SXRlbS5hY3Rpb24gPT09ICdleHBhbmQnICYmICFuZXdJdGVtLm1hdEljb24pIHtcbiAgICAgIG5ld0l0ZW0ubWF0SWNvbiA9ICdleHBhbmRfbW9yZSc7XG4gICAgfVxuXG4gICAgLy8gSWYgdmlzaWJsZSwgZ2V0IHRoZSBwYXJlbnQgd2hlcmUgdG8gYXR0YWNoIHRoZSBpdGVtXG4gICAgY29uc3QgcGFyZW50ID0gdGhpcy5fZmluZFBhcmVudChuZXdJdGVtLCBvcHRzPy5hdmFpbGFibGVQYXJlbnRzKTtcbiAgICBpZiAocGFyZW50ICYmIHBhcmVudC5leHBhbmRlZCkge1xuICAgICAgLy8gQXR0YWNoIGl0ZW0gdG8gcGFyZW50XG4gICAgICB0aGlzLl9hdHRhY2hNZW51VG9QYXJlbnQocGFyZW50LCBuZXdJdGVtKTtcblxuICAgICAgLy8gVXBkYXRlIGRldGFjaGVkIGl0ZW1zIDpcbiAgICAgIC8vIC0gZXhjbHVkZWQgbmV3IGl0ZW1cbiAgICAgIC8vIC0gYXR0YWNoIGFuZCBleGNsdWRlIHRob3NlIHRoYW4gY2FuIGJlIGF0dGFjaGVkIHRvIHRoZSBuZXcgaXRlbVxuICAgICAgLy8gU2VhcmNoIGluIGRldGFjaGVkIGl0ZW1zIG9uZSBoYXZlIG5ld0l0ZW0gYXMgcGFyZW50XG4gICAgICBpZiAobmV3SXRlbS5leHBhbmRlZCkge1xuICAgICAgICBjb25zdCBhbmNlc3RvciA9IG5ld0l0ZW0uYW5jZXN0b3I7XG4gICAgICAgIHRoaXMuX2RldGFjaGVkU3ViSXRlbXMgPSB0aGlzLl9kZXRhY2hlZFN1Ykl0ZW1zLmNvbmNhdCguLi5uZXdJdGVtLmNoaWxkcmVuKVxuICAgICAgICAgIC5yZWR1Y2UoKHJlcywgaXRlbSkgPT4ge1xuICAgICAgICAgICAgLy8gRXhjbHVkZWQgbmV3bHkgYWRkIGl0ZW1cbiAgICAgICAgICAgIGlmIChpdGVtLmlkID09PSBuZXdJdGVtLmlkKSByZXR1cm4gcmVzO1xuXG4gICAgICAgICAgICAvLyBJZiBzb21lIGRldGFjaGVkIGNhbiBiZSBhdHRhY2hlZCB0byB0aGUgbmV3IGl0ZW06IGRvIGl0XG4gICAgICAgICAgICBpZiAoTWVudUl0ZW1zLmNoZWNrSWZTdWJNZW51VmlzaWJsZShpdGVtLCBwYXRoUGFyYW0pKSB7XG5cbiAgICAgICAgICAgICAgY29uc3QgcGFyZW50ID0gdGhpcy5fZmluZFBhcmVudChpdGVtLCBbYW5jZXN0b3JdKTtcbiAgICAgICAgICAgICAgaWYgKHBhcmVudCkge1xuICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBpdGVtJ3MgY2hpbGRyZW5cbiAgICAgICAgICAgICAgICBjb25zdCBkZXRhY2hlZENoaWxkcmVuID0gdGhpcy5fZGV0YWNoU3ViTWVudUl0ZW1zKHBhdGhQYXJhbSwgaXRlbS5jaGlsZHJlbiB8fCBbXSk7XG5cbiAgICAgICAgICAgICAgICAvLyBBdHRhY2ggaXRlbVxuICAgICAgICAgICAgICAgIHRoaXMuX2F0dGFjaE1lbnVUb1BhcmVudChwYXJlbnQsIGl0ZW0pO1xuXG4gICAgICAgICAgICAgICAgLy8gUmVtZW1iZXIgZGV0YWNoZWQgY2hpbGRyZW5cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzLmNvbmNhdCguLi5kZXRhY2hlZENoaWxkcmVuKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBEZXRhY2ggKGlmIG5lZWQpXG4gICAgICAgICAgICB0aGlzLl9kZXRhY2hUb1BhcmVudChpdGVtKTtcblxuICAgICAgICAgICAgLy8gQWRkIHRvIGRldGFjaGVkIGl0ZW1zXG4gICAgICAgICAgICByZXR1cm4gcmVzLmNvbmNhdChpdGVtKTtcbiAgICAgICAgICB9LCBbXSk7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgLy8gUmVtb3ZlIGZyb20gZGV0YWNoZWQgZWxlbWVudHNcbiAgICAgICAgdGhpcy5fZGV0YWNoZWRTdWJJdGVtcyA9IHRoaXMuX2RldGFjaGVkU3ViSXRlbXMuZmlsdGVyKGl0ZW0gPT4gaXRlbS5pZCAhPT0gbmV3SXRlbS5pZCk7XG5cbiAgICAgICAgLy8gRGV0YWNoIGNoaWxkcmVuXG4gICAgICAgIG5ld0l0ZW0uY2hpbGRyZW4uZm9yRWFjaChpdGVtID0+IHRoaXMuX2RldGFjaFRvUGFyZW50KGl0ZW0pKTtcblxuICAgICAgfVxuXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgLy8gQWRkIG9yIHVwZGF0ZSBkZXRhY2hlZCBpdGVtXG4gICAgICBjb25zdCBkZXRhY2hlZEluZGV4ID0gaXNOb3ROaWwobmV3SXRlbS5pZCkgPyB0aGlzLl9kZXRhY2hlZFN1Ykl0ZW1zLmZpbmRJbmRleChpdGVtID0+IGl0ZW0uaWQgPT09IG5ld0l0ZW0uaWQpIDogLTE7XG4gICAgICBpZiAoZGV0YWNoZWRJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgdGhpcy5fZGV0YWNoZWRTdWJJdGVtc1tkZXRhY2hlZEluZGV4XSA9IG5ld0l0ZW07XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgdGhpcy5fZGV0YWNoZWRTdWJJdGVtcy5wdXNoKG5ld0l0ZW0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFN0YXJ0IGxpc3RlbmluZyByb3V0ZVxuICAgIGlmICghdGhpcy5fJGxpc3RlblJvdXRlLnZhbHVlKSB0aGlzLl8kbGlzdGVuUm91dGUubmV4dCh0cnVlKTtcblxuICAgIHJldHVybiBuZXdJdGVtO1xuICB9XG5cbiAgcHJpdmF0ZSBfY29tcHV0ZU5ld0lkKCkge1xuICAgIHJldHVybiB0aGlzLl9pdGVtQ291bnRlcisrO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVtb3ZlU3ViTWVudUl0ZW0oaXRlbTogTWVudUl0ZW0pIHtcbiAgICBjb25zdCBleGlzdGluZ0l0ZW0gPSB0aGlzLl9maW5kRXhpc3RpbmdJdGVtKGl0ZW0pO1xuICAgIGlmIChleGlzdGluZ0l0ZW0pIHtcbiAgICAgIHRoaXMuX2RldGFjaFRvUGFyZW50KGV4aXN0aW5nSXRlbSk7XG4gICAgICByZXR1cm4gZXhpc3RpbmdJdGVtO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2RldGFjaFN1Yk1lbnVJdGVtcyhjdXJyZW50UGF0aFBhcmFtPzogTWVudVBhdGhQYXJhbSwgc3ViSXRlbXM/OiBNZW51SXRlbVtdKSB7XG4gICAgY3VycmVudFBhdGhQYXJhbSA9IGN1cnJlbnRQYXRoUGFyYW0gPyBjdXJyZW50UGF0aFBhcmFtIDogTWVudUl0ZW1zLnBhcnNlUGF0aFdpdGhRdWVyeSh0aGlzLnJvdXRlci5yb3V0ZXJTdGF0ZS5zbmFwc2hvdC51cmwudG9TdHJpbmcoKSk7XG4gICAgcmV0dXJuIChzdWJJdGVtcyB8fCB0aGlzLnN1Ykl0ZW1zKVxuICAgICAgLnJlZHVjZSgocmVzLCBzdWJJdGVtKSA9PiB7XG5cbiAgICAgICAgLy8gTm90IHZpc2libGUgPT4gc2hvdWxkIGJlIGRldGFjaFxuICAgICAgICBpZiAoIU1lbnVJdGVtcy5jaGVja0lmU3ViTWVudVZpc2libGUoc3ViSXRlbSwgY3VycmVudFBhdGhQYXJhbSkpIHtcblxuICAgICAgICAgIHRoaXMuX2RldGFjaFRvUGFyZW50KHN1Ykl0ZW0pO1xuXG4gICAgICAgICAgcmV0dXJuIHJlcy5jb25jYXQoc3ViSXRlbSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVmlzaWJsZTogY2hlY2sgY2hpbGRyZW5cbiAgICAgICAgcmV0dXJuIHJlcy5jb25jYXQoXG4gICAgICAgICAgdGhpcy5fZGV0YWNoU3ViTWVudUl0ZW1zKGN1cnJlbnRQYXRoUGFyYW0sIHN1Ykl0ZW0uY2hpbGRyZW4pXG4gICAgICAgICk7XG4gICAgICB9LCBbXSk7XG4gIH1cblxuICBwcml2YXRlIF9kZXRhY2hUb1BhcmVudChpdGVtOiBNZW51SXRlbSkge1xuICAgIGlmICghaXRlbT8ucGFyZW50KSByZXR1cm47IC8vIFNraXAgaWYgYWxyZWFkeSBkZXRhY2hlZFxuICAgIGxldCBjaGlsZHJlbiA9IGl0ZW0ucGFyZW50LmNoaWxkcmVuIHx8IFtdO1xuXG4gICAgLy8gUmVtb3ZlIGZyb20gcGFyZW50IGNoaWxkcmVuXG4gICAgY29uc3QgaW5kZXhJblBhcmVudCA9IGNoaWxkcmVuLmluZGV4T2YoaXRlbSk7XG4gICAgaWYgKGluZGV4SW5QYXJlbnQgIT09IC0xKSB7XG4gICAgICBjaGlsZHJlbiA9IGNoaWxkcmVuLnNsaWNlKCk7IC8vIENvcHkgb3JpZ2luYWwgYXJyYXksIGJlY2F1c2UgaXQgY2FuIGJlIHVzZWQgaW4gYSBsb29wXG4gICAgICBjaGlsZHJlbi5zcGxpY2UoaW5kZXhJblBhcmVudCwgMSk7XG4gICAgICBpdGVtLnBhcmVudC5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICAgIH1cblxuICAgIGl0ZW0ucGFyZW50ID0gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgX2ZpbmRFeGlzdGluZ0l0ZW0oc2VhcmNoSXRlbTogSU1lbnVJdGVtLCBpdGVtcz86IE1lbnVJdGVtW10sIHJlY3Vyc2l2ZSA9IHRydWUpOiBNZW51SXRlbSB7XG4gICAgaXRlbXMgPSBpdGVtcyB8fCBbLi4udGhpcy5fZGV0YWNoZWRTdWJJdGVtcywgLi4udGhpcy5kYXRhXTtcbiAgICBpZiAoIWl0ZW1zLmxlbmd0aCkgcmV0dXJuIHVuZGVmaW5lZDsgLy8gTm90IGZvdW5kXG4gICAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgICBpZiAoTWVudUl0ZW1zLmlzU2FtZUlkT3JQYXRoQW5kUGFyYW1zKHNlYXJjaEl0ZW0sIGl0ZW0pKSByZXR1cm4gaXRlbTtcbiAgICAgIGlmIChyZWN1cnNpdmUgJiYgaXRlbS5jaGlsZHJlbikge1xuICAgICAgICBjb25zdCBjaGlsZCA9IHRoaXMuX2ZpbmRFeGlzdGluZ0l0ZW0oc2VhcmNoSXRlbSwgaXRlbS5jaGlsZHJlbik7XG4gICAgICAgIGlmIChjaGlsZCkgcmV0dXJuIGNoaWxkO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgX2ZpbmRQYXJlbnQoY2hpbGRJdGVtOiBNZW51SXRlbSwgYXZhaWxhYmxlUGFyZW50cz86IE1lbnVJdGVtW10pOiBNZW51SXRlbSB7XG4gICAgaWYgKCFjaGlsZEl0ZW0/LnBhdGgpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgaWYgKGNoaWxkSXRlbS5wYXJlbnQpIHJldHVybiBjaGlsZEl0ZW0ucGFyZW50O1xuXG4gICAgYXZhaWxhYmxlUGFyZW50cyA9IGF2YWlsYWJsZVBhcmVudHMgfHwgWy4uLnRoaXMuX2RldGFjaGVkU3ViSXRlbXMsIC4uLnRoaXMuZGF0YV07XG5cbiAgICByZXR1cm4gYXZhaWxhYmxlUGFyZW50cy5yZWR1Y2UoKHJlcywgaXRlbSkgPT4ge1xuICAgICAgaWYgKCFpdGVtPy5wYXRoKSByZXR1cm4gcmVzO1xuXG4gICAgICAvLyBBIGZvdW5kIGl0ZW0gYWxyZWFkeSBtYXRjaCB3aXRoIHRoZSBtZW51SXRlbS5wYXJlbnRQYXRoIDoga2VlcCBpdCBhcyBpdFxuICAgICAgLy8gVGhlcmUgaXMgYSBmb3VuZCBjYW5kaWRhdGUgdGhhdCBhbHJlYWR5IG1hdGNoIHRoZSBjdXJyZW50IGNhbmRpZGF0ZSA6IGtlZXAgaXRcbiAgICAgIGlmIChNZW51SXRlbXMuaXNQYXJlbnQoY2hpbGRJdGVtLCByZXMpKSByZXR1cm4gcmVzO1xuXG4gICAgICAvLyBJZiB0aGUgbWVudSBpdGVtIGhhcyBleHBsaWNpdCBwYXJlbnRQYXRoIGFuZCBpdHMgcGF0aCBhbmQgcGF0aCBwYXJhbSBhcmUgdGhlIHNhbWUgYXMgdGhlIGNhbmRpZGF0ZSAgOiB1c2UgaXQgYXMgcGFyZW50XG4gICAgICBpZiAoTWVudUl0ZW1zLmlzUGFyZW50KGNoaWxkSXRlbSwgaXRlbSkpIHJldHVybiBpdGVtO1xuXG4gICAgICBpZiAoIXJlcyAmJiBpdGVtLmNoaWxkcmVuPy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbmRQYXJlbnQoY2hpbGRJdGVtLCBpdGVtLmNoaWxkcmVuKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlcztcbiAgICB9LCB1bmRlZmluZWQpO1xuICB9O1xuXG4gIHByaXZhdGUgX2F0dGFjaE1lbnVUb1BhcmVudChwYXJlbnQ6IE1lbnVJdGVtLCBjaGlsZDogTWVudUl0ZW0pIHtcblxuICAgIGlmICh0aGlzLl9kZWJ1ZykgY29uc29sZS5kZWJ1ZyhgJHt0aGlzLl9sb2dQcmVmaXh9QXR0YWNoIHN1Yi1tZW51IHske01lbnVJdGVtcy5nZXRVcmwoY2hpbGQpfX0gdG8gcGFyZW50IHske01lbnVJdGVtcy5nZXRVcmwocGFyZW50KX19YCk7XG5cbiAgICAvLyBBdm9pZCB0byBrZWVwIGlkZW50aWNhbCBtZW51IGl0ZW0gKHdlIHJlcGxhY2UgaXQgd2l0aCB0aGUgbmV3IGNoaWxkIG1lbnUgaXRlbSlcbiAgICAvL2lmICghcGFyZW50Py4kY2hpbGRyZW4pIHBhcmVudC4kY2hpbGRyZW4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PE1lbnVJdGVtW10+KFtdKTtcbiAgICBjb25zdCBjaGlsZHJlbiA9IHBhcmVudC5jaGlsZHJlbiB8fCBbXTtcbiAgICBjb25zdCBleGlzdGluZ0luZGV4ID0gY2hpbGRyZW4uZmluZEluZGV4KGl0ZW0gPT4gTWVudUl0ZW1zLmlzU2FtZUlkT3JQYXRoQW5kUGFyYW1zKGl0ZW0sIGNoaWxkKSk7XG5cbiAgICAvLyBVcGRhdGUgZXhpc3RpbmcgZWxlbWVudFxuICAgIGlmIChleGlzdGluZ0luZGV4ICE9PSAtMSkge1xuICAgICAgaWYgKGNoaWxkcmVuW2V4aXN0aW5nSW5kZXhdICE9PSBjaGlsZCkge1xuICAgICAgICBjaGlsZHJlbltleGlzdGluZ0luZGV4XSA9IGNoaWxkO1xuICAgICAgICBwYXJlbnQuY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgICAgICAgY2hpbGQucGFyZW50ID0gcGFyZW50O1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGNoaWxkcmVuLnB1c2goY2hpbGQpO1xuXG4gICAgICAvLyBTb3J0IGJ5IHRhYiAob3IgaWQpXG4gICAgICBwYXJlbnQuY2hpbGRyZW4gPSBjaGlsZHJlbi5zb3J0KE1lbnVJdGVtcy5zb3J0QnlUYWJPcklkKTtcbiAgICAgIGNoaWxkLnBhcmVudCA9IHBhcmVudDtcbiAgICB9XG4gIH1cblxufVxuIl19