@sumaris-net/ngx-components 3.0.0-rc1 → 4.0.0-rc10

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 (677) hide show
  1. package/esm2022/public_api.mjs +340 -0
  2. package/{esm2020 → esm2022}/src/app/admin/admin-routing.module.mjs +8 -8
  3. package/{esm2020 → esm2022}/src/app/admin/admin.module.mjs +12 -12
  4. package/esm2022/src/app/admin/services/filter/person.filter.mjs +69 -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 +264 -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 +337 -0
  13. package/esm2022/src/app/core/account/new-token.modal.mjs +130 -0
  14. package/esm2022/src/app/core/account/token.table.mjs +146 -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/{esm2020 → esm2022}/src/app/core/core.testing.module.mjs +23 -23
  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 +718 -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 +730 -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-popover.component.mjs +152 -0
  41. package/esm2022/src/app/core/form/text-popover/text-popover.module.mjs +35 -0
  42. package/{esm2020 → esm2022}/src/app/core/graphql/graphql.module.mjs +6 -6
  43. package/esm2022/src/app/core/graphql/graphql.service.mjs +788 -0
  44. package/{esm2020 → esm2022}/src/app/core/graphql/graphql.utils.mjs +2 -1
  45. package/esm2022/src/app/core/home/home.mjs +282 -0
  46. package/esm2022/src/app/core/home/home.module.mjs +51 -0
  47. package/esm2022/src/app/core/icon/icon.component.mjs +40 -0
  48. package/{esm2020 → esm2022}/src/app/core/icon/icon.module.mjs +7 -7
  49. package/esm2022/src/app/core/install/install-upgrade-card.component.mjs +358 -0
  50. package/{esm2020 → esm2022}/src/app/core/install/install-upgrade-card.module.mjs +10 -10
  51. package/esm2022/src/app/core/menu/menu.component.mjs +264 -0
  52. package/esm2022/src/app/core/menu/menu.model.mjs +269 -0
  53. package/esm2022/src/app/core/menu/menu.module.mjs +52 -0
  54. package/esm2022/src/app/core/menu/menu.service.mjs +671 -0
  55. package/esm2022/src/app/core/menu/sub-menu-tab.directive.mjs +109 -0
  56. package/{esm2020 → esm2022}/src/app/core/menu/testing/menu-other.testing.mjs +5 -5
  57. package/esm2022/src/app/core/menu/testing/menu.testing.mjs +122 -0
  58. package/{esm2020 → esm2022}/src/app/core/menu/testing/menu.testing.module.mjs +12 -12
  59. package/esm2022/src/app/core/offline/update-offline-mode-card.component.mjs +29 -0
  60. package/{esm2020 → esm2022}/src/app/core/offline/update-offline-mode-card.module.mjs +10 -10
  61. package/esm2022/src/app/core/peer/select-peer.modal.mjs +193 -0
  62. package/{esm2020 → esm2022}/src/app/core/peer/select-peer.module.mjs +13 -13
  63. package/esm2022/src/app/core/register/register-confirm.page.mjs +88 -0
  64. package/esm2022/src/app/core/register/register.form.mjs +194 -0
  65. package/esm2022/src/app/core/register/register.modal.mjs +55 -0
  66. package/{esm2020 → esm2022}/src/app/core/register/register.module.mjs +13 -13
  67. package/esm2022/src/app/core/services/account.service.mjs +1243 -0
  68. package/esm2022/src/app/core/services/auth-guard.service.mjs +76 -0
  69. package/esm2022/src/app/core/services/base-entity-service.class.mjs +482 -0
  70. package/esm2022/src/app/core/services/base-graphql-service.class.mjs +224 -0
  71. package/esm2022/src/app/core/services/base58.mjs +79 -0
  72. package/{esm2020 → esm2022}/src/app/core/services/config/core.config.mjs +7 -7
  73. package/esm2022/src/app/core/services/config.service.mjs +367 -0
  74. package/esm2022/src/app/core/services/crypto.service.mjs +107 -0
  75. package/esm2022/src/app/core/services/local-settings.service.mjs +468 -0
  76. package/esm2022/src/app/core/services/model/account.model.mjs +155 -0
  77. package/esm2022/src/app/core/services/model/config.model.mjs +107 -0
  78. package/esm2022/src/app/core/services/model/department.model.mjs +34 -0
  79. package/esm2022/src/app/core/services/model/entity.decorators.mjs +97 -0
  80. package/esm2022/src/app/core/services/model/entity.model.mjs +228 -0
  81. package/esm2022/src/app/core/services/model/peer.model.mjs +83 -0
  82. package/esm2022/src/app/core/services/model/person.model.mjs +110 -0
  83. package/esm2022/src/app/core/services/model/referential.model.mjs +189 -0
  84. package/esm2022/src/app/core/services/model/token.model.mjs +57 -0
  85. package/esm2022/src/app/core/services/network.service.mjs +626 -0
  86. package/{esm2020 → esm2022}/src/app/core/services/network.types.mjs +1 -1
  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 +557 -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 +5 -5
  100. package/{esm2020 → esm2022}/src/app/core/services/validator/user-token.validator.mjs +5 -5
  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 +1775 -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/{esm2020 → esm2022}/src/app/core/table/testing/table.testing.module.mjs +16 -16
  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/esm2022/src/app/shared/form/loading-spinner.mjs +35 -0
  137. package/{esm2020 → esm2022}/src/app/shared/functions.mjs +2 -2
  138. package/esm2022/src/app/shared/geolocation/geolocation.utils.mjs +82 -0
  139. package/esm2022/src/app/shared/gesture/gesture-config.mjs +46 -0
  140. package/esm2022/src/app/shared/graph/graph-colors.mjs +219 -0
  141. package/esm2022/src/app/shared/guard/component-dirty.guard.mjs +59 -0
  142. package/esm2022/src/app/shared/help/help.modal.mjs +63 -0
  143. package/esm2022/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.mjs +23 -0
  144. package/esm2022/src/app/shared/hotkeys/hotkeys.service.mjs +85 -0
  145. package/{esm2020 → esm2022}/src/app/shared/hotkeys/shared-hotkeys.module.mjs +12 -12
  146. package/esm2022/src/app/shared/http/http.utils.mjs +56 -0
  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/{esm2020 → esm2022}/src/app/shared/material/chips/chips.module.mjs +30 -30
  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 +549 -0
  177. package/esm2022/src/app/shared/material/datetime/testing/mat-date-time.test.mjs +132 -0
  178. package/esm2022/src/app/shared/material/datetime/testing/mat-date.test.mjs +123 -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 +440 -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 +229 -0
  189. package/esm2022/src/app/shared/material/material.testing.module.mjs +221 -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 +20 -20
  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/{esm2020 → esm2022}/src/app/shared/material/swipe/swipe.module.mjs +19 -19
  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/material/text/testing/text-form.testing.mjs +31 -0
  206. package/esm2022/src/app/shared/material/text/text-form.component.mjs +97 -0
  207. package/esm2022/src/app/shared/material/text/text-form.module.mjs +63 -0
  208. package/esm2022/src/app/shared/named-filter/named-filter-selector.component.mjs +236 -0
  209. package/esm2022/src/app/shared/named-filter/named-filter.model.mjs +49 -0
  210. package/{esm2020 → esm2022}/src/app/shared/named-filter/named-filter.module.mjs +5 -5
  211. package/esm2022/src/app/shared/named-filter/named-filter.service.mjs +69 -0
  212. package/{esm2020 → esm2022}/src/app/shared/pipes/arrays.pipe.mjs +25 -25
  213. package/{esm2020 → esm2022}/src/app/shared/pipes/colors.pipe.mjs +4 -4
  214. package/esm2022/src/app/shared/pipes/date-diff-duration.pipe.mjs +51 -0
  215. package/esm2022/src/app/shared/pipes/date-format.pipe.mjs +72 -0
  216. package/esm2022/src/app/shared/pipes/date-from-now.pipe.mjs +28 -0
  217. package/esm2022/src/app/shared/pipes/duration.pipe.mjs +36 -0
  218. package/esm2022/src/app/shared/pipes/file-size.pipe.mjs +60 -0
  219. package/esm2022/src/app/shared/pipes/form.pipes.mjs +194 -0
  220. package/{esm2020 → esm2022}/src/app/shared/pipes/highlight.pipe.mjs +5 -5
  221. package/esm2022/src/app/shared/pipes/latlong-format.pipe.mjs +42 -0
  222. package/{esm2020 → esm2022}/src/app/shared/pipes/maps.pipe.mjs +13 -13
  223. package/esm2022/src/app/shared/pipes/maskito.pipe.mjs +118 -0
  224. package/{esm2020 → esm2022}/src/app/shared/pipes/math.pipes.mjs +13 -13
  225. package/esm2022/src/app/shared/pipes/ng-init.pipe.mjs +19 -0
  226. package/{esm2020 → esm2022}/src/app/shared/pipes/number-format.pipe.mjs +5 -5
  227. package/esm2022/src/app/shared/pipes/pipes.module.mjs +256 -0
  228. package/esm2022/src/app/shared/pipes/property.pipes.mjs +97 -0
  229. package/{esm2020 → esm2022}/src/app/shared/pipes/string.pipes.mjs +31 -31
  230. package/esm2022/src/app/shared/pipes/translate-context.pipe.mjs +44 -0
  231. package/{esm2020 → esm2022}/src/app/shared/pipes/types.pipes.mjs +14 -14
  232. package/esm2022/src/app/shared/rx-state.module.mjs +23 -0
  233. package/esm2022/src/app/shared/services/entity-service.class.mjs +7 -0
  234. package/esm2022/src/app/shared/services/memory-entity-service.class.mjs +347 -0
  235. package/esm2022/src/app/shared/services/progress-bar.service.mjs +31 -0
  236. package/esm2022/src/app/shared/services/startable-observable-service.class.mjs +121 -0
  237. package/esm2022/src/app/shared/services/startable-service.class.mjs +113 -0
  238. package/esm2022/src/app/shared/services/translate-context.service.mjs +104 -0
  239. package/esm2022/src/app/shared/services.mjs +62 -0
  240. package/{esm2020 → esm2022}/src/app/shared/shared-routing.module.mjs +12 -12
  241. package/esm2022/src/app/shared/shared.module.mjs +231 -0
  242. package/{esm2020 → esm2022}/src/app/shared/shared.testing.module.mjs +40 -40
  243. package/esm2022/src/app/shared/storage/storage-explorer.component.mjs +286 -0
  244. package/esm2022/src/app/shared/storage/storage-explorer.module.mjs +46 -0
  245. package/{esm2020 → esm2022}/src/app/shared/storage/storage-explorer.testing-routing.module.mjs +7 -7
  246. package/{esm2020 → esm2022}/src/app/shared/storage/storage-explorer.testing.module.mjs +6 -6
  247. package/esm2022/src/app/shared/storage/storage.service.mjs +134 -0
  248. package/{esm2020 → esm2022}/src/app/shared/storage/storage.utils.mjs +1 -1
  249. package/esm2022/src/app/shared/testing/observable.test.mjs +96 -0
  250. package/esm2022/src/app/shared/testing/tests.page.mjs +37 -0
  251. package/esm2022/src/app/shared/toast/toast.testing.mjs +52 -0
  252. package/{esm2020 → esm2022}/src/app/shared/toast/toast.testing.module.mjs +10 -10
  253. package/esm2022/src/app/shared/toast/toasts.mjs +144 -0
  254. package/esm2022/src/app/shared/toolbar/modal-toolbar.mjs +60 -0
  255. package/esm2022/src/app/shared/toolbar/toolbar.mjs +264 -0
  256. package/esm2022/src/app/shared/toolbar/toolbar.module.mjs +57 -0
  257. package/esm2022/src/app/shared/upload-file/testing/upload-file.testing.mjs +59 -0
  258. package/{esm2020 → esm2022}/src/app/shared/upload-file/testing/upload-file.testing.module.mjs +10 -10
  259. package/esm2022/src/app/shared/upload-file/upload-file-popover.component.mjs +107 -0
  260. package/esm2022/src/app/shared/upload-file/upload-file.component.mjs +211 -0
  261. package/esm2022/src/app/shared/upload-file/upload-file.model.mjs +27 -0
  262. package/esm2022/src/app/shared/validator/form-error-adapter.class.mjs +106 -0
  263. package/esm2022/src/app/shared/validator/validators.mjs +580 -0
  264. package/esm2022/src/app/shared/version/versions.mjs +81 -0
  265. package/{esm2020 → esm2022}/src/app/social/job/job.module.mjs +12 -12
  266. package/esm2022/src/app/social/job/progression/job-progression.component.mjs +35 -0
  267. package/esm2022/src/app/social/job/progression/job-progression.icon.mjs +232 -0
  268. package/esm2022/src/app/social/job/progression/job-progression.list.mjs +50 -0
  269. package/esm2022/src/app/social/job/progression/job-progression.model.mjs +29 -0
  270. package/esm2022/src/app/social/job/progression/job-progression.service.mjs +73 -0
  271. package/esm2022/src/app/social/job/testing/job-progression.testing.mjs +43 -0
  272. package/esm2022/src/app/social/job/testing/job-progression.testing.service.mjs +53 -0
  273. package/{esm2020 → esm2022}/src/app/social/job/testing/job.testing.module.mjs +9 -9
  274. package/esm2022/src/app/social/message/message.form.mjs +140 -0
  275. package/esm2022/src/app/social/message/message.modal.mjs +110 -0
  276. package/esm2022/src/app/social/message/message.model.mjs +75 -0
  277. package/esm2022/src/app/social/message/message.module.mjs +22 -0
  278. package/esm2022/src/app/social/message/message.service.mjs +110 -0
  279. package/{esm2020 → esm2022}/src/app/social/social.module.mjs +19 -19
  280. package/{esm2020 → esm2022}/src/app/social/social.testing.module.mjs +10 -10
  281. package/esm2022/src/app/social/user-event/notification/user-event-notification.icon.mjs +123 -0
  282. package/esm2022/src/app/social/user-event/notification/user-event-notification.list.mjs +263 -0
  283. package/esm2022/src/app/social/user-event/testing/user-event.testing.mjs +233 -0
  284. package/esm2022/src/app/social/user-event/testing/user-event.testing.model.mjs +129 -0
  285. package/{esm2020 → esm2022}/src/app/social/user-event/testing/user-event.testing.module.mjs +9 -9
  286. package/esm2022/src/app/social/user-event/testing/user-event.testing.service.mjs +116 -0
  287. package/esm2022/src/app/social/user-event/user-event.module.mjs +43 -0
  288. package/esm2022/src/app/social/user-event/user-event.service.mjs +512 -0
  289. package/esm2022/src/environments/environment.class.mjs +50 -0
  290. package/esm2022/src/environments/environment.loader.mjs +83 -0
  291. package/esm2022/src/environments/environment.mjs +97 -0
  292. package/{fesm2020 → fesm2022}/sumaris-net.ngx-components.mjs +11115 -9134
  293. package/fesm2022/sumaris-net.ngx-components.mjs.map +1 -0
  294. package/package.json +38 -19
  295. package/public_api.d.ts +5 -1
  296. package/src/app/admin/users/users.d.ts +1 -1
  297. package/src/app/admin/users/users.module.d.ts +2 -1
  298. package/src/app/core/account/account.page.d.ts +3 -2
  299. package/src/app/core/account/new-token.modal.d.ts +2 -4
  300. package/src/app/core/account/token.table.d.ts +6 -4
  301. package/src/app/core/form/buttons/form-buttons-bar.component.d.ts +2 -2
  302. package/src/app/core/form/entity/editor.class.d.ts +2 -2
  303. package/src/app/core/form/entity/entity-editor-modal.class.d.ts +1 -1
  304. package/src/app/core/form/entity/entity-editor.class.d.ts +10 -6
  305. package/src/app/core/form/entity/entity-metadata.component.d.ts +1 -1
  306. package/src/app/core/form/form.class.d.ts +1 -1
  307. package/src/app/core/form/list/list.form.d.ts +1 -1
  308. package/src/app/core/form/properties/properties.form.d.ts +1 -1
  309. package/src/app/core/form/properties/properties.table.d.ts +1 -1
  310. package/src/app/core/form/text-popover/text-popover.component.d.ts +2 -2
  311. package/src/app/core/form/text-popover/text-popover.module.d.ts +4 -5
  312. package/src/app/core/graphql/graphql.service.d.ts +2 -4
  313. package/src/app/core/graphql/graphql.utils.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 +7 -3
  318. package/src/app/core/menu/menu.module.d.ts +3 -5
  319. package/src/app/core/menu/menu.service.d.ts +3 -1
  320. package/src/app/core/menu/sub-menu-tab.directive.d.ts +1 -1
  321. package/src/app/core/offline/update-offline-mode-card.component.d.ts +1 -1
  322. package/src/app/core/peer/select-peer.modal.d.ts +1 -1
  323. package/src/app/core/services/account.service.d.ts +4 -0
  324. package/src/app/core/services/base-entity-service.class.d.ts +1 -1
  325. package/src/app/core/services/config/core.config.d.ts +2 -2
  326. package/src/app/core/services/model/person.model.d.ts +1 -1
  327. package/src/app/core/services/model/referential.model.d.ts +2 -1
  328. package/src/app/core/services/model/settings.model.d.ts +1 -1
  329. package/src/app/core/services/model/token.model.d.ts +1 -0
  330. package/src/app/core/services/network.service.d.ts +11 -7
  331. package/src/app/core/services/network.types.d.ts +2 -2
  332. package/src/app/core/services/storage/entity-store.class.d.ts +1 -1
  333. package/src/app/core/table/actions-column.component.d.ts +1 -1
  334. package/src/app/core/table/async-table.class.d.ts +1 -1
  335. package/src/app/core/table/memory-table.class.d.ts +1 -1
  336. package/src/app/core/table/table-select-columns.component.d.ts +1 -1
  337. package/src/app/core/table/table.class.d.ts +2 -1
  338. package/src/app/core/table/table.model.d.ts +1 -1
  339. package/src/app/core/table/testing/table.testing.d.ts +1 -1
  340. package/src/app/shared/audio/audio.d.ts +1 -1
  341. package/src/app/shared/debug/debug.component.d.ts +1 -1
  342. package/src/app/shared/directives/autofocus.directive.d.ts +1 -1
  343. package/src/app/shared/directives/ng-var.directive.d.ts +1 -1
  344. package/src/app/shared/directives/resizable/resizable.component.d.ts +1 -1
  345. package/src/app/shared/events.d.ts +1 -1
  346. package/src/app/shared/form/field.component.d.ts +1 -1
  347. package/src/app/shared/form/loading-spinner.d.ts +1 -1
  348. package/src/app/shared/help/help.modal.d.ts +1 -1
  349. package/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.d.ts +2 -4
  350. package/src/app/shared/http/http.utils.d.ts +1 -0
  351. package/src/app/shared/image/gallery/image-gallery.component.d.ts +1 -1
  352. package/src/app/shared/inputs.d.ts +1 -1
  353. package/src/app/shared/material/autocomplete/material.autocomplete.d.ts +2 -2
  354. package/src/app/shared/material/autocomplete/material.autocomplete.module.d.ts +10 -9
  355. package/src/app/shared/material/badge/badge.directive.d.ts +1 -1
  356. package/src/app/shared/material/boolean/boolean.module.d.ts +4 -5
  357. package/src/app/shared/material/boolean/material-boolean2.d.ts +1 -1
  358. package/src/app/shared/material/boolean/material.boolean.d.ts +1 -1
  359. package/src/app/shared/material/chips/material.chips.d.ts +1 -1
  360. package/src/app/shared/material/datetime/datetime.module.d.ts +2 -2
  361. package/src/app/shared/material/datetime/material.date.d.ts +2 -2
  362. package/src/app/shared/material/datetime/material.dateshort.d.ts +3 -3
  363. package/src/app/shared/material/datetime/material.datetime.d.ts +14 -7
  364. package/src/app/shared/material/duration/duration.module.d.ts +6 -5
  365. package/src/app/shared/material/duration/material.duration.d.ts +2 -2
  366. package/src/app/shared/material/latlong/material.latlong.d.ts +14 -8
  367. package/src/app/shared/material/latlong/material.latlong.module.d.ts +9 -8
  368. package/src/app/shared/material/latlong/testing/latlong.test.d.ts +2 -0
  369. package/src/app/shared/material/material.module.d.ts +2 -1
  370. package/src/app/shared/material/material.testing.module.d.ts +14 -13
  371. package/src/app/shared/material/numpad/numpad.append-to-input.directive.d.ts +1 -1
  372. package/src/app/shared/material/numpad/numpad.component.d.ts +1 -1
  373. package/src/app/shared/material/numpad/numpad.content.d.ts +1 -1
  374. package/src/app/shared/material/numpad/numpad.directive.d.ts +1 -1
  375. package/src/app/shared/material/swipe/material.swipe.d.ts +1 -1
  376. package/src/app/shared/material/testing/common.test.d.ts +4 -2
  377. package/src/app/shared/material/text/testing/text-form.testing.d.ts +13 -0
  378. package/src/app/{core/form/text-popover → shared/material/text}/text-form.component.d.ts +2 -2
  379. package/src/app/shared/material/text/text-form.module.d.ts +16 -0
  380. package/src/app/shared/named-filter/named-filter-selector.component.d.ts +9 -3
  381. package/src/app/shared/pipes/maskito.pipe.d.ts +16 -0
  382. package/src/app/shared/pipes/pipes.module.d.ts +5 -4
  383. package/src/app/shared/pipes/types.pipes.d.ts +3 -3
  384. package/src/app/shared/rx-state.module.d.ts +1 -1
  385. package/src/app/shared/services/entity-service.class.d.ts +1 -1
  386. package/src/app/shared/services/job.utils.d.ts +1 -1
  387. package/src/app/shared/services/memory-entity-service.class.d.ts +7 -3
  388. package/src/app/shared/services.d.ts +1 -0
  389. package/src/app/shared/shared.module.d.ts +16 -15
  390. package/src/app/shared/storage/storage-explorer.component.d.ts +1 -1
  391. package/src/app/shared/storage/storage-explorer.module.d.ts +3 -3
  392. package/src/app/shared/storage/storage.service.d.ts +1 -1
  393. package/src/app/shared/storage/storage.utils.d.ts +1 -1
  394. package/src/app/shared/toolbar/modal-toolbar.d.ts +1 -1
  395. package/src/app/shared/toolbar/toolbar.d.ts +1 -1
  396. package/src/app/shared/toolbar/toolbar.module.d.ts +4 -3
  397. package/src/app/shared/upload-file/upload-file-popover.component.d.ts +1 -1
  398. package/src/app/shared/upload-file/upload-file.component.d.ts +1 -1
  399. package/src/app/shared/upload-file/upload-file.model.d.ts +2 -2
  400. package/src/app/social/job/progression/job-progression.component.d.ts +1 -1
  401. package/src/app/social/job/progression/job-progression.icon.d.ts +1 -1
  402. package/src/app/social/job/progression/job-progression.list.d.ts +1 -1
  403. package/src/app/social/message/message.form.d.ts +8 -2
  404. package/src/app/social/message/message.modal.d.ts +5 -1
  405. package/src/app/social/message/message.model.d.ts +2 -0
  406. package/src/app/social/message/message.module.d.ts +2 -1
  407. package/src/app/social/message/message.service.d.ts +8 -3
  408. package/src/app/social/user-event/notification/user-event-notification.icon.d.ts +4 -3
  409. package/src/app/social/user-event/notification/user-event-notification.list.d.ts +1 -1
  410. package/src/app/social/user-event/user-event.model.d.ts +2 -2
  411. package/src/app/social/user-event/user-event.module.d.ts +3 -2
  412. package/src/app/social/user-event/user-event.service.d.ts +5 -0
  413. package/src/assets/environments/environment-test.json +6 -0
  414. package/src/assets/i18n/en-US.json +25 -23
  415. package/src/assets/i18n/en.json +25 -23
  416. package/src/assets/i18n/fr.json +10 -7
  417. package/src/assets/manifest.json +1 -1
  418. package/src/environments/environment.class.d.ts +2 -0
  419. package/src/environments/environment.loader.d.ts +26 -0
  420. package/src/theme/_material.globals.scss +2 -2
  421. package/src/theme/_material.scss +34 -5
  422. package/src/theme/_mixins.scss +2 -2
  423. package/src/theme/_ngx-components.globals.scss +2 -2
  424. package/src/theme/_ngx-components.scss +8 -9
  425. package/src/theme/_ngx-components.table.scss +20 -8
  426. package/esm2020/public_api.mjs +0 -336
  427. package/esm2020/src/app/admin/services/filter/person.filter.mjs +0 -59
  428. package/esm2020/src/app/admin/services/person.service.mjs +0 -170
  429. package/esm2020/src/app/admin/services/validator/person.validator.mjs +0 -71
  430. package/esm2020/src/app/admin/users/users.mjs +0 -259
  431. package/esm2020/src/app/admin/users/users.module.mjs +0 -54
  432. package/esm2020/src/app/core/about/about.modal.mjs +0 -71
  433. package/esm2020/src/app/core/account/account.page.mjs +0 -317
  434. package/esm2020/src/app/core/account/new-token.modal.mjs +0 -115
  435. package/esm2020/src/app/core/account/token.table.mjs +0 -137
  436. package/esm2020/src/app/core/auth/auth.form.mjs +0 -132
  437. package/esm2020/src/app/core/auth/auth.modal.mjs +0 -72
  438. package/esm2020/src/app/core/form/buttons/form-buttons-bar.component.mjs +0 -107
  439. package/esm2020/src/app/core/form/entity/editor.class.mjs +0 -679
  440. package/esm2020/src/app/core/form/entity/entity-editor-modal.class.mjs +0 -422
  441. package/esm2020/src/app/core/form/entity/entity-editor.class.mjs +0 -690
  442. package/esm2020/src/app/core/form/entity/entity-metadata.component.mjs +0 -25
  443. package/esm2020/src/app/core/form/form.class.mjs +0 -345
  444. package/esm2020/src/app/core/form/list/list.form.mjs +0 -222
  445. package/esm2020/src/app/core/form/properties/properties.form.mjs +0 -132
  446. package/esm2020/src/app/core/form/properties/properties.table.mjs +0 -265
  447. package/esm2020/src/app/core/form/properties/property.validator.mjs +0 -23
  448. package/esm2020/src/app/core/form/properties/testing/properties-form.test.mjs +0 -90
  449. package/esm2020/src/app/core/form/text-popover/testing/text-popover.testing.mjs +0 -70
  450. package/esm2020/src/app/core/form/text-popover/text-form.component.mjs +0 -89
  451. package/esm2020/src/app/core/form/text-popover/text-popover.component.mjs +0 -146
  452. package/esm2020/src/app/core/form/text-popover/text-popover.module.mjs +0 -40
  453. package/esm2020/src/app/core/graphql/graphql.service.mjs +0 -774
  454. package/esm2020/src/app/core/home/home.mjs +0 -258
  455. package/esm2020/src/app/core/home/home.module.mjs +0 -48
  456. package/esm2020/src/app/core/icon/icon.component.mjs +0 -41
  457. package/esm2020/src/app/core/install/install-upgrade-card.component.mjs +0 -344
  458. package/esm2020/src/app/core/menu/menu.component.mjs +0 -239
  459. package/esm2020/src/app/core/menu/menu.model.mjs +0 -247
  460. package/esm2020/src/app/core/menu/menu.module.mjs +0 -57
  461. package/esm2020/src/app/core/menu/menu.service.mjs +0 -654
  462. package/esm2020/src/app/core/menu/sub-menu-tab.directive.mjs +0 -98
  463. package/esm2020/src/app/core/menu/testing/menu.testing.mjs +0 -121
  464. package/esm2020/src/app/core/offline/update-offline-mode-card.component.mjs +0 -27
  465. package/esm2020/src/app/core/peer/select-peer.modal.mjs +0 -183
  466. package/esm2020/src/app/core/register/register-confirm.page.mjs +0 -81
  467. package/esm2020/src/app/core/register/register.form.mjs +0 -183
  468. package/esm2020/src/app/core/register/register.modal.mjs +0 -52
  469. package/esm2020/src/app/core/services/account.service.mjs +0 -1206
  470. package/esm2020/src/app/core/services/auth-guard.service.mjs +0 -71
  471. package/esm2020/src/app/core/services/base-entity-service.class.mjs +0 -468
  472. package/esm2020/src/app/core/services/base-graphql-service.class.mjs +0 -221
  473. package/esm2020/src/app/core/services/base58.mjs +0 -78
  474. package/esm2020/src/app/core/services/config.service.mjs +0 -355
  475. package/esm2020/src/app/core/services/crypto.service.mjs +0 -107
  476. package/esm2020/src/app/core/services/local-settings.service.mjs +0 -460
  477. package/esm2020/src/app/core/services/model/account.model.mjs +0 -147
  478. package/esm2020/src/app/core/services/model/config.model.mjs +0 -92
  479. package/esm2020/src/app/core/services/model/department.model.mjs +0 -30
  480. package/esm2020/src/app/core/services/model/entity.decorators.mjs +0 -97
  481. package/esm2020/src/app/core/services/model/entity.model.mjs +0 -225
  482. package/esm2020/src/app/core/services/model/peer.model.mjs +0 -68
  483. package/esm2020/src/app/core/services/model/person.model.mjs +0 -97
  484. package/esm2020/src/app/core/services/model/referential.model.mjs +0 -164
  485. package/esm2020/src/app/core/services/model/token.model.mjs +0 -48
  486. package/esm2020/src/app/core/services/network.service.mjs +0 -590
  487. package/esm2020/src/app/core/services/platform.service.mjs +0 -524
  488. package/esm2020/src/app/core/services/storage/entities-storage.service.mjs +0 -428
  489. package/esm2020/src/app/core/services/storage/entity-store.class.mjs +0 -449
  490. package/esm2020/src/app/core/services/testing/referential-filter.model.mjs +0 -23
  491. package/esm2020/src/app/core/services/testing/referential.validator.mjs +0 -45
  492. package/esm2020/src/app/core/services/validator/account.validator.mjs +0 -41
  493. package/esm2020/src/app/core/services/validator/base.validator.class.mjs +0 -47
  494. package/esm2020/src/app/core/services/validator/local-settings.validator.mjs +0 -66
  495. package/esm2020/src/app/core/settings/settings.page.mjs +0 -312
  496. package/esm2020/src/app/core/table/actions-column.component.mjs +0 -102
  497. package/esm2020/src/app/core/table/async-table.class.mjs +0 -1698
  498. package/esm2020/src/app/core/table/entities-async-table-datasource.class.mjs +0 -384
  499. package/esm2020/src/app/core/table/entities-table-datasource.class.mjs +0 -399
  500. package/esm2020/src/app/core/table/memory-table.class.mjs +0 -53
  501. package/esm2020/src/app/core/table/table-select-columns.component.mjs +0 -43
  502. package/esm2020/src/app/core/table/table.class.mjs +0 -1733
  503. package/esm2020/src/app/core/table/table.model.mjs +0 -12
  504. package/esm2020/src/app/core/table/testing/table-validator.service.mjs +0 -27
  505. package/esm2020/src/app/core/table/testing/table.testing.mjs +0 -281
  506. package/esm2020/src/app/core/table/testing/table2-validator.service.mjs +0 -24
  507. package/esm2020/src/app/core/table/testing/table2.testing.mjs +0 -242
  508. package/esm2020/src/app/shared/audio/audio.mjs +0 -248
  509. package/esm2020/src/app/shared/audio/audio.testing.mjs +0 -31
  510. package/esm2020/src/app/shared/capacitor/keyboard.mjs +0 -40
  511. package/esm2020/src/app/shared/capacitor/plugins.mjs +0 -9
  512. package/esm2020/src/app/shared/dates.mjs +0 -149
  513. package/esm2020/src/app/shared/debug/debug.component.mjs +0 -39
  514. package/esm2020/src/app/shared/directives/autofocus.directive.mjs +0 -93
  515. package/esm2020/src/app/shared/directives/autotitle.directive.mjs +0 -30
  516. package/esm2020/src/app/shared/directives/drag-and-drop.directive.mjs +0 -53
  517. package/esm2020/src/app/shared/directives/ng-var.directive.mjs +0 -31
  518. package/esm2020/src/app/shared/directives/resizable/resizable.component.mjs +0 -60
  519. package/esm2020/src/app/shared/directives/resizable/resizable.directive.mjs +0 -40
  520. package/esm2020/src/app/shared/file/file.service.mjs +0 -117
  521. package/esm2020/src/app/shared/form/field.component.mjs +0 -334
  522. package/esm2020/src/app/shared/form/loading-spinner.mjs +0 -36
  523. package/esm2020/src/app/shared/geolocation/geolocation.utils.mjs +0 -80
  524. package/esm2020/src/app/shared/gesture/gesture-config.mjs +0 -49
  525. package/esm2020/src/app/shared/graph/graph-colors.mjs +0 -212
  526. package/esm2020/src/app/shared/guard/component-dirty.guard.mjs +0 -57
  527. package/esm2020/src/app/shared/help/help.modal.mjs +0 -53
  528. package/esm2020/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.mjs +0 -23
  529. package/esm2020/src/app/shared/hotkeys/hotkeys.service.mjs +0 -81
  530. package/esm2020/src/app/shared/http/http.utils.mjs +0 -52
  531. package/esm2020/src/app/shared/image/gallery/image-gallery.component.mjs +0 -368
  532. package/esm2020/src/app/shared/image/gallery/testing/gallegry.model.testing.mjs +0 -27
  533. package/esm2020/src/app/shared/image/gallery/testing/gallery.service.testing.mjs +0 -90
  534. package/esm2020/src/app/shared/image/gallery/testing/gallery.testing.mjs +0 -39
  535. package/esm2020/src/app/shared/image/image.service.mjs +0 -98
  536. package/esm2020/src/app/shared/inputs.mjs +0 -231
  537. package/esm2020/src/app/shared/interceptors/progess.interceptor.mjs +0 -27
  538. package/esm2020/src/app/shared/logging/logging-service.class.mjs +0 -121
  539. package/esm2020/src/app/shared/material/autocomplete/material.autocomplete.config.mjs +0 -47
  540. package/esm2020/src/app/shared/material/autocomplete/material.autocomplete.mjs +0 -925
  541. package/esm2020/src/app/shared/material/autocomplete/material.autocomplete.module.mjs +0 -78
  542. package/esm2020/src/app/shared/material/autocomplete/testing/autocomplete.test.mjs +0 -209
  543. package/esm2020/src/app/shared/material/badge/badge.directive.mjs +0 -199
  544. package/esm2020/src/app/shared/material/badge/badge.test.mjs +0 -41
  545. package/esm2020/src/app/shared/material/boolean/boolean.module.mjs +0 -76
  546. package/esm2020/src/app/shared/material/boolean/material-boolean2.mjs +0 -248
  547. package/esm2020/src/app/shared/material/boolean/material.boolean.mjs +0 -254
  548. package/esm2020/src/app/shared/material/boolean/testing/boolean.test.page.mjs +0 -51
  549. package/esm2020/src/app/shared/material/chips/material.chips.mjs +0 -688
  550. package/esm2020/src/app/shared/material/chips/testing/chips.test.mjs +0 -143
  551. package/esm2020/src/app/shared/material/datetime/material.date.mjs +0 -378
  552. package/esm2020/src/app/shared/material/datetime/material.dateshort.mjs +0 -387
  553. package/esm2020/src/app/shared/material/datetime/material.datetime.mjs +0 -501
  554. package/esm2020/src/app/shared/material/datetime/testing/mat-date-time.test.mjs +0 -120
  555. package/esm2020/src/app/shared/material/datetime/testing/mat-date.test.mjs +0 -118
  556. package/esm2020/src/app/shared/material/datetime/testing/mat-dateshort.test.mjs +0 -111
  557. package/esm2020/src/app/shared/material/duration/duration.module.mjs +0 -67
  558. package/esm2020/src/app/shared/material/duration/material.duration.mjs +0 -258
  559. package/esm2020/src/app/shared/material/duration/testing/mat-duration.test.mjs +0 -76
  560. package/esm2020/src/app/shared/material/latlong/material.latlong.mjs +0 -383
  561. package/esm2020/src/app/shared/material/latlong/material.latlong.module.mjs +0 -67
  562. package/esm2020/src/app/shared/material/latlong/testing/latlong.test.mjs +0 -102
  563. package/esm2020/src/app/shared/material/material.module.mjs +0 -224
  564. package/esm2020/src/app/shared/material/material.testing.module.mjs +0 -210
  565. package/esm2020/src/app/shared/material/numpad/numpad.append-to-input.directive.mjs +0 -98
  566. package/esm2020/src/app/shared/material/numpad/numpad.component.mjs +0 -80
  567. package/esm2020/src/app/shared/material/numpad/numpad.container.mjs +0 -190
  568. package/esm2020/src/app/shared/material/numpad/numpad.content.mjs +0 -17
  569. package/esm2020/src/app/shared/material/numpad/numpad.directive.mjs +0 -162
  570. package/esm2020/src/app/shared/material/numpad/numpad.dom-service.mjs +0 -32
  571. package/esm2020/src/app/shared/material/numpad/numpad.model.mjs +0 -15
  572. package/esm2020/src/app/shared/material/numpad/testing/numpad.test.mjs +0 -46
  573. package/esm2020/src/app/shared/material/paginator/material.paginator-i18n.mjs +0 -46
  574. package/esm2020/src/app/shared/material/stepper/material.stepper-i18n.mjs +0 -22
  575. package/esm2020/src/app/shared/material/swipe/material.swipe.mjs +0 -345
  576. package/esm2020/src/app/shared/material/swipe/testing/swipe.test.mjs +0 -64
  577. package/esm2020/src/app/shared/material/testing/common.test.mjs +0 -95
  578. package/esm2020/src/app/shared/named-filter/named-filter-selector.component.mjs +0 -202
  579. package/esm2020/src/app/shared/named-filter/named-filter.model.mjs +0 -45
  580. package/esm2020/src/app/shared/named-filter/named-filter.service.mjs +0 -63
  581. package/esm2020/src/app/shared/pipes/date-diff-duration.pipe.mjs +0 -48
  582. package/esm2020/src/app/shared/pipes/date-format.pipe.mjs +0 -66
  583. package/esm2020/src/app/shared/pipes/date-from-now.pipe.mjs +0 -27
  584. package/esm2020/src/app/shared/pipes/duration.pipe.mjs +0 -34
  585. package/esm2020/src/app/shared/pipes/file-size.pipe.mjs +0 -62
  586. package/esm2020/src/app/shared/pipes/form.pipes.mjs +0 -187
  587. package/esm2020/src/app/shared/pipes/latlong-format.pipe.mjs +0 -46
  588. package/esm2020/src/app/shared/pipes/ng-init.pipe.mjs +0 -21
  589. package/esm2020/src/app/shared/pipes/pipes.module.mjs +0 -247
  590. package/esm2020/src/app/shared/pipes/property.pipes.mjs +0 -93
  591. package/esm2020/src/app/shared/pipes/translate-context.pipe.mjs +0 -43
  592. package/esm2020/src/app/shared/rx-state.module.mjs +0 -23
  593. package/esm2020/src/app/shared/services/entity-service.class.mjs +0 -7
  594. package/esm2020/src/app/shared/services/memory-entity-service.class.mjs +0 -339
  595. package/esm2020/src/app/shared/services/progress-bar.service.mjs +0 -33
  596. package/esm2020/src/app/shared/services/startable-observable-service.class.mjs +0 -121
  597. package/esm2020/src/app/shared/services/startable-service.class.mjs +0 -113
  598. package/esm2020/src/app/shared/services/translate-context.service.mjs +0 -103
  599. package/esm2020/src/app/shared/services.mjs +0 -62
  600. package/esm2020/src/app/shared/shared.module.mjs +0 -224
  601. package/esm2020/src/app/shared/storage/storage-explorer.component.mjs +0 -268
  602. package/esm2020/src/app/shared/storage/storage-explorer.module.mjs +0 -47
  603. package/esm2020/src/app/shared/storage/storage.service.mjs +0 -132
  604. package/esm2020/src/app/shared/testing/observable.test.mjs +0 -95
  605. package/esm2020/src/app/shared/testing/tests.page.mjs +0 -33
  606. package/esm2020/src/app/shared/toast/toast.testing.mjs +0 -51
  607. package/esm2020/src/app/shared/toast/toasts.mjs +0 -144
  608. package/esm2020/src/app/shared/toolbar/modal-toolbar.mjs +0 -58
  609. package/esm2020/src/app/shared/toolbar/toolbar.mjs +0 -251
  610. package/esm2020/src/app/shared/toolbar/toolbar.module.mjs +0 -53
  611. package/esm2020/src/app/shared/upload-file/testing/upload-file.testing.mjs +0 -58
  612. package/esm2020/src/app/shared/upload-file/upload-file-popover.component.mjs +0 -97
  613. package/esm2020/src/app/shared/upload-file/upload-file.component.mjs +0 -204
  614. package/esm2020/src/app/shared/upload-file/upload-file.model.mjs +0 -20
  615. package/esm2020/src/app/shared/validator/form-error-adapter.class.mjs +0 -104
  616. package/esm2020/src/app/shared/validator/validators.mjs +0 -580
  617. package/esm2020/src/app/shared/version/versions.mjs +0 -81
  618. package/esm2020/src/app/social/job/progression/job-progression.component.mjs +0 -34
  619. package/esm2020/src/app/social/job/progression/job-progression.icon.mjs +0 -223
  620. package/esm2020/src/app/social/job/progression/job-progression.list.mjs +0 -46
  621. package/esm2020/src/app/social/job/progression/job-progression.model.mjs +0 -23
  622. package/esm2020/src/app/social/job/progression/job-progression.service.mjs +0 -71
  623. package/esm2020/src/app/social/job/testing/job-progression.testing.mjs +0 -41
  624. package/esm2020/src/app/social/job/testing/job-progression.testing.service.mjs +0 -55
  625. package/esm2020/src/app/social/message/message.form.mjs +0 -84
  626. package/esm2020/src/app/social/message/message.modal.mjs +0 -93
  627. package/esm2020/src/app/social/message/message.model.mjs +0 -64
  628. package/esm2020/src/app/social/message/message.module.mjs +0 -35
  629. package/esm2020/src/app/social/message/message.service.mjs +0 -84
  630. package/esm2020/src/app/social/user-event/notification/user-event-notification.icon.mjs +0 -114
  631. package/esm2020/src/app/social/user-event/notification/user-event-notification.list.mjs +0 -246
  632. package/esm2020/src/app/social/user-event/testing/user-event.testing.mjs +0 -227
  633. package/esm2020/src/app/social/user-event/testing/user-event.testing.model.mjs +0 -112
  634. package/esm2020/src/app/social/user-event/testing/user-event.testing.service.mjs +0 -111
  635. package/esm2020/src/app/social/user-event/user-event.module.mjs +0 -39
  636. package/esm2020/src/app/social/user-event/user-event.service.mjs +0 -488
  637. package/esm2020/src/environments/environment.class.mjs +0 -5
  638. package/esm2020/src/environments/environment.mjs +0 -94
  639. package/fesm2015/sumaris-net.ngx-components.mjs +0 -41541
  640. package/fesm2015/sumaris-net.ngx-components.mjs.map +0 -1
  641. package/fesm2020/sumaris-net.ngx-components.mjs.map +0 -1
  642. /package/{esm2020 → esm2022}/src/app/core/services/errors.mjs +0 -0
  643. /package/{esm2020 → esm2022}/src/app/core/services/model/filter.model.mjs +0 -0
  644. /package/{esm2020 → esm2022}/src/app/core/services/model/history.model.mjs +0 -0
  645. /package/{esm2020 → esm2022}/src/app/core/services/model/model.enum.mjs +0 -0
  646. /package/{esm2020 → esm2022}/src/app/core/services/model/settings.model.mjs +0 -0
  647. /package/{esm2020 → esm2022}/src/app/core/services/model/tree-item-entity.model.mjs +0 -0
  648. /package/{esm2020 → esm2022}/src/app/core/services/network.utils.mjs +0 -0
  649. /package/{esm2020 → esm2022}/src/app/core/table/table.utils.mjs +0 -0
  650. /package/{esm2020 → esm2022}/src/app/shared/alerts.mjs +0 -0
  651. /package/{esm2020 → esm2022}/src/app/shared/constants.mjs +0 -0
  652. /package/{esm2020 → esm2022}/src/app/shared/debug/debug-service.class.mjs +0 -0
  653. /package/{esm2020 → esm2022}/src/app/shared/events.mjs +0 -0
  654. /package/{esm2020 → esm2022}/src/app/shared/file/csv.utils.mjs +0 -0
  655. /package/{esm2020 → esm2022}/src/app/shared/file/images.utils.mjs +0 -0
  656. /package/{esm2020 → esm2022}/src/app/shared/file/json.utils.mjs +0 -0
  657. /package/{esm2020 → esm2022}/src/app/shared/file/uri.utils.mjs +0 -0
  658. /package/{esm2020 → esm2022}/src/app/shared/focusable.mjs +0 -0
  659. /package/{esm2020 → esm2022}/src/app/shared/form/field.model.mjs +0 -0
  660. /package/{esm2020 → esm2022}/src/app/shared/forms.mjs +0 -0
  661. /package/{esm2020 → esm2022}/src/app/shared/gesture/hammer.utils.mjs +0 -0
  662. /package/{esm2020 → esm2022}/src/app/shared/graph/colors.utils.mjs +0 -0
  663. /package/{esm2020 → esm2022}/src/app/shared/image/image.model.mjs +0 -0
  664. /package/{esm2020 → esm2022}/src/app/shared/logging/log-level.model.mjs +0 -0
  665. /package/{esm2020 → esm2022}/src/app/shared/logging/logger.model.mjs +0 -0
  666. /package/{esm2020 → esm2022}/src/app/shared/logging/logging-service.config.mjs +0 -0
  667. /package/{esm2020 → esm2022}/src/app/shared/material/autocomplete/material.autocomplete.utils.mjs +0 -0
  668. /package/{esm2020 → esm2022}/src/app/shared/material/material.animations.mjs +0 -0
  669. /package/{esm2020 → esm2022}/src/app/shared/modules.mjs +0 -0
  670. /package/{esm2020 → esm2022}/src/app/shared/observables.mjs +0 -0
  671. /package/{esm2020 → esm2022}/src/app/shared/platforms.mjs +0 -0
  672. /package/{esm2020 → esm2022}/src/app/shared/services/job.utils.mjs +0 -0
  673. /package/{esm2020 → esm2022}/src/app/shared/services/validator-service.class.mjs +0 -0
  674. /package/{esm2020 → esm2022}/src/app/shared/types.mjs +0 -0
  675. /package/{esm2020 → esm2022}/src/app/social/social.errors.mjs +0 -0
  676. /package/{esm2020 → esm2022}/src/app/social/user-event/user-event.model.mjs +0 -0
  677. /package/{esm2020 → esm2022}/sumaris-net.ngx-components.mjs +0 -0
@@ -1,344 +0,0 @@
1
- import { ChangeDetectionStrategy, Component, Inject, Input } from '@angular/core';
2
- import { from, Subscription } from 'rxjs';
3
- import { debounceTime, distinctUntilChanged, filter, map, switchMap } from 'rxjs/operators';
4
- import { CORE_CONFIG_OPTIONS } from '../services/config/core.config';
5
- import { VersionUtils } from '../../shared/version/versions';
6
- import { slideUpDownAnimation } from '../../shared/material/material.animations';
7
- import { isNilOrBlank, isNotEmptyArray, isNotNil, isNotNilOrBlank, sleep } from '../../shared/functions';
8
- import { ENVIRONMENT } from '../../../environments/environment.class';
9
- import { Toasts } from '../../shared/toast/toasts';
10
- import { Peer } from '../services/model/peer.model';
11
- import { MimeTypes } from '../../shared/file/file.utils';
12
- import { UriUtils } from '../../shared/file/uri.utils';
13
- import * as i0 from "@angular/core";
14
- import * as i1 from "@ionic/angular";
15
- import * as i2 from "../services/config.service";
16
- import * as i3 from "@ngx-translate/core";
17
- import * as i4 from "../services/platform.service";
18
- import * as i5 from "../services/network.service";
19
- import * as i6 from "@angular/common";
20
- import * as i7 from "../../../environments/environment.class";
21
- export class AppInstallUpgradeCard {
22
- constructor(modalCtrl, configService, toastController, alertController, translate, cd, platform, network, environment) {
23
- this.modalCtrl = modalCtrl;
24
- this.configService = configService;
25
- this.toastController = toastController;
26
- this.alertController = alertController;
27
- this.translate = translate;
28
- this.cd = cd;
29
- this.platform = platform;
30
- this.network = network;
31
- this.environment = environment;
32
- this._subscription = new Subscription();
33
- this.loading = true;
34
- this.hasDownloader = false;
35
- this.downloading = false;
36
- this.waitingNetwork = false;
37
- this.showUpgradeWarning = true;
38
- this.showOfflineWarning = true;
39
- this.showInstallButton = false;
40
- }
41
- ngOnInit() {
42
- this.offline = this.network.offline;
43
- // Listen pod config
44
- this._subscription.add(from(this.network.ready())
45
- .pipe(debounceTime(1000), switchMap(() => this.configService.config), filter(isNotNil))
46
- .subscribe(config => this.checkNeedInstallOrUpdate(config)));
47
- // Listen network changes
48
- this._subscription.add(this.network.onNetworkStatusChanges
49
- .pipe(
50
- //debounceTime(450),
51
- //tap(() => this.waitingNetwork = false),
52
- map(connectionType => connectionType === 'none'), distinctUntilChanged())
53
- .subscribe(offline => {
54
- if (this.offline !== offline) {
55
- this.offline = offline;
56
- this.markForCheck();
57
- }
58
- }));
59
- }
60
- ngOnDestroy() {
61
- this._subscription.unsubscribe();
62
- this._subscription = null;
63
- this.installLinks = null;
64
- this.upgradeLinks = null;
65
- }
66
- async download(event, link) {
67
- if (!link || !link.url) {
68
- console.error('[install-upgrade-card] Missing required argument \'link.url\'');
69
- return; // Skip
70
- }
71
- // Mark link as downloading
72
- link.downloading = true;
73
- this.markForCheck();
74
- this.listenDownloadJob(link.url, this.platform.download({
75
- uri: link.url,
76
- title: link.title,
77
- filename: link.filename,
78
- mimeType: link.mimeType
79
- }))
80
- .then((location) => {
81
- if (this.platform.canOpenFile)
82
- link.location = location;
83
- link.downloading = false;
84
- })
85
- .catch(() => link.downloading = false)
86
- .then(() => this.markForCheck());
87
- }
88
- async openFile(event, link) {
89
- if (!link || !link.location || !link.mimeType) {
90
- console.error('[install-upgrade-card] Missing required argument \'link.location\' or \'link.mimeType\'');
91
- return; // Skip
92
- }
93
- try {
94
- await this.platform.open(link.location);
95
- }
96
- catch (err) {
97
- console.error('[install-upgrade-card] Cannot open file: ' + (err && err.message || err), err);
98
- }
99
- }
100
- async tryOnline() {
101
- this.waitingNetwork = true;
102
- this.markForCheck();
103
- try {
104
- await this.network.tryOnline({
105
- showLoadingToast: false,
106
- showOnlineToast: true,
107
- showOfflineToast: false
108
- });
109
- }
110
- finally {
111
- this.waitingNetwork = false;
112
- this.markForCheck();
113
- }
114
- }
115
- getPlatformName(platform) {
116
- switch (platform) {
117
- case 'android':
118
- return 'Android';
119
- case 'ios':
120
- return 'iOS';
121
- default:
122
- return '';
123
- }
124
- }
125
- asLink(value) {
126
- return value;
127
- }
128
- /* -- private method -- */
129
- async checkNeedInstallOrUpdate(config) {
130
- if (!config)
131
- return; // Skip
132
- console.info('[install-upgrade-card] Check if need to install or upgrade...');
133
- this.hasDownloader = this.platform.canDownload;
134
- try {
135
- const links = this.getLinks(config);
136
- // Check for upgrade
137
- this.upgradeLinks = this.getCompatibleUpgradeLinks(links, config);
138
- if (isNotEmptyArray(this.upgradeLinks)) {
139
- console.info(`[install-upgrade-card] Find upgrade links: ${this.upgradeLinks.map(l => l.url).join(',')}`);
140
- this.installLinks = null;
141
- this.listenDownloadJobs();
142
- }
143
- else {
144
- // Check for install links
145
- this.installLinks = this.getCompatibleInstallLinks(links);
146
- if (isNotEmptyArray(this.installLinks)) {
147
- console.info(`[install-upgrade-card] Find installation links ${this.installLinks.map(l => l.url).join(',')}`);
148
- await sleep(1000); // Add a delay, for animation
149
- }
150
- else {
151
- console.info(`[install-upgrade-card] No installation or upgrade links to display.`);
152
- }
153
- }
154
- }
155
- finally {
156
- this.loading = false;
157
- this.markForCheck();
158
- }
159
- }
160
- getCompatibleInstallLinks(installLinks) {
161
- // Already an native App: not need to install
162
- if (this.platform.isApp())
163
- return undefined;
164
- // If mobile web: return all
165
- if (this.platform.isMobileWeb()) {
166
- return installLinks;
167
- }
168
- return undefined;
169
- }
170
- getCompatibleUpgradeLinks(installLinks, config) {
171
- const appVersion = this.environment.version;
172
- const appMinVersionFromPod = config.getProperty(CORE_CONFIG_OPTIONS.APP_MIN_VERSION);
173
- if (!appVersion) {
174
- console.error('Missing value for \'environment.version\': cannot check app compatibility!');
175
- return undefined;
176
- }
177
- const needUpgrade = appMinVersionFromPod && !VersionUtils.isCompatible(appMinVersionFromPod, appVersion);
178
- if (!needUpgrade)
179
- return undefined;
180
- const upgradeLinks = this.platform.is('mobileweb')
181
- // All link if mobile web
182
- ? installLinks
183
- // Filter on platform, if mobile App
184
- : installLinks.filter(link => link.platform && this.platform.is(link.platform));
185
- // Use min version as default version
186
- upgradeLinks.forEach(link => {
187
- link.version = link.version || appMinVersionFromPod;
188
- });
189
- return isNotEmptyArray(upgradeLinks) ? upgradeLinks : undefined;
190
- }
191
- getLinks(config) {
192
- const result = [];
193
- // Android
194
- {
195
- // Get URL (from config, or environment)
196
- let url = config.getProperty(CORE_CONFIG_OPTIONS.ANDROID_INSTALL_URL);
197
- if (isNilOrBlank(url))
198
- url = this.environment.defaultAndroidInstallUrl || null;
199
- // Resolve relative URL
200
- const peer = this.network.peer;
201
- if (peer && (url.startsWith('./') || url.startsWith('/'))) {
202
- url = Peer.path(peer, url);
203
- }
204
- const minVersion = config.getProperty(CORE_CONFIG_OPTIONS.APP_MIN_VERSION);
205
- // Compute App name
206
- const name = isNotNilOrBlank(url) && config.label || this.environment.defaultAppName || 'SUMARiS';
207
- if (url) {
208
- let title;
209
- let mimeType;
210
- // Get file name
211
- let filename = UriUtils.getFilename(url);
212
- let version = minVersion || 'latest';
213
- // OK, this is a downloadable APK file (e.g. NOT a link to a playstore)
214
- if (filename?.toLowerCase().endsWith('.apk')) {
215
- // Define mime type
216
- mimeType = MimeTypes.ANDROID_APK;
217
- // Get the file version (if any)
218
- const versionMatches = /-v([1-9][0-9]*\.[0-9]+\.(:?(:?alpha|beta|rc)?[0-9]*))/i.exec(filename);
219
- version = versionMatches && versionMatches[1] || version;
220
- // Compute a new file name, with the version
221
- if (isNotNilOrBlank(name) && version !== 'latest') {
222
- filename = `${name}-v${version}.apk`.toLowerCase();
223
- title = `${name} v${version}`;
224
- }
225
- // Replace 'latest' with the app version, if present in the filename
226
- else if (filename.indexOf('latest') !== -1 && version !== 'latest') {
227
- filename = filename.replace('latest', version);
228
- }
229
- }
230
- result.push({ name, url, platform: 'android', version, filename, title, mimeType });
231
- }
232
- }
233
- // iOS - TODO
234
- //{
235
- // (...)
236
- //}
237
- return result;
238
- }
239
- listenDownloadJobs() {
240
- // Listening downloading promise, if exists
241
- (this.upgradeLinks || []).forEach(link => {
242
- const job = this.platform.getDownloadingJob(link.url);
243
- if (job) {
244
- link.downloading = true;
245
- this.listenDownloadJob(link.url, job)
246
- .then((location) => {
247
- link.location = location;
248
- link.downloading = false;
249
- })
250
- .catch(() => link.downloading = false)
251
- .then(() => this.markForCheck());
252
- }
253
- });
254
- }
255
- async listenDownloadJob(url, job) {
256
- if (!url || !job)
257
- return; // Skip
258
- try {
259
- // Mark as downloading
260
- if (!this.downloading) {
261
- console.info(`[install-upgrade-card] Asking platform to download '${url}'...`);
262
- this.downloading = true;
263
- this.markForCheck();
264
- }
265
- else {
266
- console.info(`[install-upgrade-card] Platform is already downloading!`);
267
- }
268
- const location = await job.toPromise();
269
- if (location) {
270
- console.info('[install-upgrade-card] File downloaded at: ' + location);
271
- this.showDownloadCompleteDialog();
272
- }
273
- return location;
274
- }
275
- // Failed: display a toast
276
- catch (err) {
277
- console.error('[install-upgrade-card] Download failed: ' + (err && err.message || err));
278
- this.showDownloadFailedToast(err);
279
- throw err;
280
- }
281
- finally {
282
- this.downloading = false;
283
- this.markForCheck();
284
- }
285
- }
286
- showDownloadFailedToast(err) {
287
- return this.showToast({
288
- message: 'ERROR.DOWNLOAD_FAILED',
289
- messageParams: { error: err },
290
- type: 'error',
291
- showCloseButton: true
292
- });
293
- }
294
- async showDownloadCompleteDialog() {
295
- if (!this._subscription)
296
- return; // Skip if component has been destroyed
297
- const translations = await this.translate.instant([
298
- 'INFO.ALERT_HEADER',
299
- 'INFO.UPDATE_APP_DOWNLOADED',
300
- 'COMMON.BTN_CLOSE'
301
- ]);
302
- const alert = await this.alertController.create({
303
- header: translations['INFO.ALERT_HEADER'],
304
- message: translations['INFO.UPDATE_APP_DOWNLOADED'],
305
- buttons: [
306
- {
307
- text: translations['COMMON.BTN_CLOSE'],
308
- role: 'cancel',
309
- cssClass: 'secondary'
310
- }
311
- ]
312
- });
313
- await alert.present();
314
- await alert.onDidDismiss();
315
- }
316
- markForCheck() {
317
- if (!this._subscription)
318
- return; // Skip if destroyed
319
- this.cd.markForCheck();
320
- }
321
- async showToast(opts) {
322
- if (!this._subscription)
323
- return; // Skip if component has been destroyed
324
- await Toasts.show(this.toastController, this.translate, opts);
325
- }
326
- }
327
- AppInstallUpgradeCard.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: AppInstallUpgradeCard, deps: [{ token: i1.ModalController }, { token: i2.ConfigService }, { token: i1.ToastController }, { token: i1.AlertController }, { token: i3.TranslateService }, { token: i0.ChangeDetectorRef }, { token: i4.PlatformService }, { token: i5.NetworkService }, { token: ENVIRONMENT }], target: i0.ɵɵFactoryTarget.Component });
328
- AppInstallUpgradeCard.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: AppInstallUpgradeCard, selector: "app-install-upgrade-card", inputs: { isLogin: "isLogin", showUpgradeWarning: "showUpgradeWarning", showOfflineWarning: "showOfflineWarning", showInstallButton: "showInstallButton" }, ngImport: i0, template: "\n\n<!-- Offline mode card-->\n<ion-card *ngIf=\"showOfflineWarning && (!loading && offline || waitingNetwork)\"\n color=\"accent\"\n class=\"main ion-no-margin\"\n @slideUpDownAnimation>\n <ion-card-content class=\"ion-no-padding\">\n <ion-grid>\n <ion-row>\n <ion-col>\n <ion-text class=\"ion-text-wrap\" *ngIf=\"!waitingNetwork; else waitingNetworkText\">\n <h4>\n <b *ngIf=\"isLogin; else notLogin\" [innerHTML]=\"'NETWORK.INFO.OFFLINE_OR_UNAUTHORIZED'| translate\"></b>\n <ng-template #notLogin>\n <b [innerHTML]=\"'NETWORK.INFO.OFFLINE'| translate\"></b>\n </ng-template>\n </h4>\n <h3>\n <small [innerHTML]=\"'NETWORK.INFO.OFFLINE_HELP'|translate\"></small>\n </h3>\n </ion-text>\n <ng-template #waitingNetworkText>\n <ion-text class=\"ion-text-wrap\" [innerHTML]=\"'NETWORK.INFO.RETRY_TO_CONNECT'| translate\"></ion-text>\n </ng-template>\n </ion-col>\n <ion-col size=\"auto\">\n\n <!-- Retry button -->\n <ion-button *ngIf=\"!waitingNetwork; else waitingSpinner\" color=\"tertiary\" class=\"ion-float-end\"\n (click)=\"tryOnline()\">\n <span translate>NETWORK.BTN_CHECK_ALIVE</span>\n </ion-button>\n\n </ion-col>\n </ion-row>\n </ion-grid>\n\n </ion-card-content>\n</ion-card>\n\n<!-- Upgrade links -->\n<ion-card *ngIf=\"showUpgradeWarning && !loading && !offline && upgradeLinks\"\n color=\"accent\"\n class=\"ion-no-margin\"\n @slideUpDownAnimation>\n <ion-card-content class=\"ion-no-padding\">\n <ion-grid>\n <ion-row *ngFor=\"let link of upgradeLinks; last as last\">\n <ion-col>\n <ion-text class=\"ion-text-wrap\">\n <h3>\n <span *ngIf=\"link.version\" [innerHTML]=\"'INFO.UPDATE_APP_TO_VERSION'| translate: link\"></span>\n <span *ngIf=\"!link.version\" [innerHTML]=\"'INFO.UPDATE_APP'| translate: link\"></span>\n </h3>\n <h4>\n <small *ngIf=\"last\" [innerHTML]=\"'INFO.UPDATE_APP_HELP'|translate\"></small>\n </h4>\n </ion-text>\n </ion-col>\n\n <ion-col size=\"auto\">\n <ng-container *ngTemplateOutlet=\"downloadButton; context: { $implicit: link }\"></ng-container>\n </ion-col>\n </ion-row>\n\n </ion-grid>\n\n </ion-card-content>\n</ion-card>\n\n<!-- Install links -->\n<ion-card *ngIf=\"showInstallButton && !loading && !offline && installLinks\"\n color=\"secondary\"\n class=\"ion-no-margin\"\n @slideUpDownAnimation>\n <ion-card-content class=\"ion-no-padding\">\n <ion-grid>\n <ion-row *ngFor=\"let link of installLinks; last as last\">\n <ion-col size=\"12\" size-sm=\"8\">\n <ion-text class=\"ion-text-wrap\">\n <h3 [innerHTML]=\"'INFO.DOWNLOAD_APP_TITLE'| translate: {name: link.name, platform: getPlatformName(link.platform) }\"></h3>\n <h4><small *ngIf=\"last\" [innerHTML]=\"'INFO.DOWNLOAD_APP_HELP'|translate\"></small></h4>\n </ion-text>\n </ion-col>\n <ion-col size=\"12\" size-sm=\"4\">\n <ng-container *ngTemplateOutlet=\"downloadButton; context: { $implicit: link }\"></ng-container>\n </ion-col>\n </ion-row>\n\n </ion-grid>\n\n </ion-card-content>\n</ion-card>\n\n<!-- Display a download button, depending on the link URL, and the device platform -->\n<ng-template #downloadButton let-link>\n\n <ng-container *ngIf=\"link.filename; else redirectButton\">\n\n <ng-container *ngIf=\"hasDownloader; else webDownloadButton\">\n <!-- Download using platform -->\n <ion-button (click)=\"download($event, asLink(link))\"\n *ngIf=\"!link.location; else openButton\"\n [disabled]=\"link.downloading\"\n color=\"tertiary\" class=\"ion-float-end\">\n <ion-icon slot=\"start\" *ngIf=\"!link.downloading\" name=\"download\"></ion-icon>\n <ion-spinner slot=\"start\" class=\"ion-no-padding\" *ngIf=\"link.downloading\"></ion-spinner>\n <ion-label translate>COMMON.BTN_DOWNLOAD</ion-label>\n </ion-button>\n\n <!-- Open APK button -->\n <ng-template #openButton>\n <ion-button *ngIf=\"link.location\"\n (click)=\"openFile($event, link)\"\n color=\"tertiary\" class=\"ion-float-end\" >\n <ion-label translate>COMMON.BTN_INSTALL</ion-label>\n </ion-button>\n </ng-template>\n </ng-container>\n\n <!-- Web download button -->\n <ng-template #webDownloadButton>\n <ion-button [download]=\"link.filename\"\n [href]=\"link.url\"\n color=\"tertiary\" class=\"ion-float-end\" >\n <ion-label translate>COMMON.BTN_DOWNLOAD</ion-label>\n </ion-button>\n </ng-template>\n </ng-container>\n\n <!-- Web redirect button -->\n <ng-template #redirectButton>\n <ion-button [href]=\"link.url\" rel=\"external\" color=\"tertiary\" class=\"ion-float-end\" target=\"_blank\">\n <ion-label translate>COMMON.BTN_SHOW_MORE</ion-label>\n </ion-button>\n </ng-template>\n</ng-template>\n\n\n<!-- Waiting spinner -->\n<ng-template #waitingSpinner>\n <ion-spinner color=\"light\"></ion-spinner>\n</ng-template>\n", styles: ["ion-text small{font-size:85%}\n"], dependencies: [{ kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i1.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i1.IonCard, selector: "ion-card", inputs: ["button", "color", "disabled", "download", "href", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: i1.IonCardContent, selector: "ion-card-content", inputs: ["mode"] }, { kind: "component", type: i1.IonCol, selector: "ion-col", inputs: ["offset", "offsetLg", "offsetMd", "offsetSm", "offsetXl", "offsetXs", "pull", "pullLg", "pullMd", "pullSm", "pullXl", "pullXs", "push", "pushLg", "pushMd", "pushSm", "pushXl", "pushXs", "size", "sizeLg", "sizeMd", "sizeSm", "sizeXl", "sizeXs"] }, { kind: "component", type: i1.IonGrid, selector: "ion-grid", inputs: ["fixed"] }, { kind: "component", type: i1.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i1.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i1.IonRow, selector: "ion-row" }, { kind: "component", type: i1.IonSpinner, selector: "ion-spinner", inputs: ["color", "duration", "name", "paused"] }, { kind: "component", type: i1.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "directive", type: i3.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }], animations: [slideUpDownAnimation], changeDetection: i0.ChangeDetectionStrategy.OnPush });
329
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: AppInstallUpgradeCard, decorators: [{
330
- type: Component,
331
- args: [{ selector: 'app-install-upgrade-card', changeDetection: ChangeDetectionStrategy.OnPush, animations: [slideUpDownAnimation], template: "\n\n<!-- Offline mode card-->\n<ion-card *ngIf=\"showOfflineWarning && (!loading && offline || waitingNetwork)\"\n color=\"accent\"\n class=\"main ion-no-margin\"\n @slideUpDownAnimation>\n <ion-card-content class=\"ion-no-padding\">\n <ion-grid>\n <ion-row>\n <ion-col>\n <ion-text class=\"ion-text-wrap\" *ngIf=\"!waitingNetwork; else waitingNetworkText\">\n <h4>\n <b *ngIf=\"isLogin; else notLogin\" [innerHTML]=\"'NETWORK.INFO.OFFLINE_OR_UNAUTHORIZED'| translate\"></b>\n <ng-template #notLogin>\n <b [innerHTML]=\"'NETWORK.INFO.OFFLINE'| translate\"></b>\n </ng-template>\n </h4>\n <h3>\n <small [innerHTML]=\"'NETWORK.INFO.OFFLINE_HELP'|translate\"></small>\n </h3>\n </ion-text>\n <ng-template #waitingNetworkText>\n <ion-text class=\"ion-text-wrap\" [innerHTML]=\"'NETWORK.INFO.RETRY_TO_CONNECT'| translate\"></ion-text>\n </ng-template>\n </ion-col>\n <ion-col size=\"auto\">\n\n <!-- Retry button -->\n <ion-button *ngIf=\"!waitingNetwork; else waitingSpinner\" color=\"tertiary\" class=\"ion-float-end\"\n (click)=\"tryOnline()\">\n <span translate>NETWORK.BTN_CHECK_ALIVE</span>\n </ion-button>\n\n </ion-col>\n </ion-row>\n </ion-grid>\n\n </ion-card-content>\n</ion-card>\n\n<!-- Upgrade links -->\n<ion-card *ngIf=\"showUpgradeWarning && !loading && !offline && upgradeLinks\"\n color=\"accent\"\n class=\"ion-no-margin\"\n @slideUpDownAnimation>\n <ion-card-content class=\"ion-no-padding\">\n <ion-grid>\n <ion-row *ngFor=\"let link of upgradeLinks; last as last\">\n <ion-col>\n <ion-text class=\"ion-text-wrap\">\n <h3>\n <span *ngIf=\"link.version\" [innerHTML]=\"'INFO.UPDATE_APP_TO_VERSION'| translate: link\"></span>\n <span *ngIf=\"!link.version\" [innerHTML]=\"'INFO.UPDATE_APP'| translate: link\"></span>\n </h3>\n <h4>\n <small *ngIf=\"last\" [innerHTML]=\"'INFO.UPDATE_APP_HELP'|translate\"></small>\n </h4>\n </ion-text>\n </ion-col>\n\n <ion-col size=\"auto\">\n <ng-container *ngTemplateOutlet=\"downloadButton; context: { $implicit: link }\"></ng-container>\n </ion-col>\n </ion-row>\n\n </ion-grid>\n\n </ion-card-content>\n</ion-card>\n\n<!-- Install links -->\n<ion-card *ngIf=\"showInstallButton && !loading && !offline && installLinks\"\n color=\"secondary\"\n class=\"ion-no-margin\"\n @slideUpDownAnimation>\n <ion-card-content class=\"ion-no-padding\">\n <ion-grid>\n <ion-row *ngFor=\"let link of installLinks; last as last\">\n <ion-col size=\"12\" size-sm=\"8\">\n <ion-text class=\"ion-text-wrap\">\n <h3 [innerHTML]=\"'INFO.DOWNLOAD_APP_TITLE'| translate: {name: link.name, platform: getPlatformName(link.platform) }\"></h3>\n <h4><small *ngIf=\"last\" [innerHTML]=\"'INFO.DOWNLOAD_APP_HELP'|translate\"></small></h4>\n </ion-text>\n </ion-col>\n <ion-col size=\"12\" size-sm=\"4\">\n <ng-container *ngTemplateOutlet=\"downloadButton; context: { $implicit: link }\"></ng-container>\n </ion-col>\n </ion-row>\n\n </ion-grid>\n\n </ion-card-content>\n</ion-card>\n\n<!-- Display a download button, depending on the link URL, and the device platform -->\n<ng-template #downloadButton let-link>\n\n <ng-container *ngIf=\"link.filename; else redirectButton\">\n\n <ng-container *ngIf=\"hasDownloader; else webDownloadButton\">\n <!-- Download using platform -->\n <ion-button (click)=\"download($event, asLink(link))\"\n *ngIf=\"!link.location; else openButton\"\n [disabled]=\"link.downloading\"\n color=\"tertiary\" class=\"ion-float-end\">\n <ion-icon slot=\"start\" *ngIf=\"!link.downloading\" name=\"download\"></ion-icon>\n <ion-spinner slot=\"start\" class=\"ion-no-padding\" *ngIf=\"link.downloading\"></ion-spinner>\n <ion-label translate>COMMON.BTN_DOWNLOAD</ion-label>\n </ion-button>\n\n <!-- Open APK button -->\n <ng-template #openButton>\n <ion-button *ngIf=\"link.location\"\n (click)=\"openFile($event, link)\"\n color=\"tertiary\" class=\"ion-float-end\" >\n <ion-label translate>COMMON.BTN_INSTALL</ion-label>\n </ion-button>\n </ng-template>\n </ng-container>\n\n <!-- Web download button -->\n <ng-template #webDownloadButton>\n <ion-button [download]=\"link.filename\"\n [href]=\"link.url\"\n color=\"tertiary\" class=\"ion-float-end\" >\n <ion-label translate>COMMON.BTN_DOWNLOAD</ion-label>\n </ion-button>\n </ng-template>\n </ng-container>\n\n <!-- Web redirect button -->\n <ng-template #redirectButton>\n <ion-button [href]=\"link.url\" rel=\"external\" color=\"tertiary\" class=\"ion-float-end\" target=\"_blank\">\n <ion-label translate>COMMON.BTN_SHOW_MORE</ion-label>\n </ion-button>\n </ng-template>\n</ng-template>\n\n\n<!-- Waiting spinner -->\n<ng-template #waitingSpinner>\n <ion-spinner color=\"light\"></ion-spinner>\n</ng-template>\n", styles: ["ion-text small{font-size:85%}\n"] }]
332
- }], ctorParameters: function () { return [{ type: i1.ModalController }, { type: i2.ConfigService }, { type: i1.ToastController }, { type: i1.AlertController }, { type: i3.TranslateService }, { type: i0.ChangeDetectorRef }, { type: i4.PlatformService }, { type: i5.NetworkService }, { type: i7.Environment, decorators: [{
333
- type: Inject,
334
- args: [ENVIRONMENT]
335
- }] }]; }, propDecorators: { isLogin: [{
336
- type: Input
337
- }], showUpgradeWarning: [{
338
- type: Input
339
- }], showOfflineWarning: [{
340
- type: Input
341
- }], showInstallButton: [{
342
- type: Input
343
- }] } });
344
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdGFsbC11cGdyYWRlLWNhcmQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9jb3JlL2luc3RhbGwvaW5zdGFsbC11cGdyYWRlLWNhcmQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9jb3JlL2luc3RhbGwvaW5zdGFsbC11cGdyYWRlLWNhcmQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFxQixTQUFTLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFFeEgsT0FBTyxFQUFFLElBQUksRUFBYyxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFJdEQsT0FBTyxFQUFFLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTVGLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUM3RCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUNqRixPQUFPLEVBQUUsWUFBWSxFQUFFLGVBQWUsRUFBRSxRQUFRLEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3pHLE9BQU8sRUFBZSxXQUFXLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUNuRixPQUFPLEVBQW9CLE1BQU0sRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRXJFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDekQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDZCQUE2QixDQUFD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LFFBQVEsRUFBRSxXQUFXO2lCQUN0QjthQUNGO1NBQ0YsQ0FBQyxDQUFDO1FBRUgsTUFBTSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDdEIsTUFBTSxLQUFLLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVPLFlBQVk7UUFDbEIsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhO1lBQUUsT0FBTyxDQUFDLG9CQUFvQjtRQUNyRCxJQUFJLENBQUMsRUFBRSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFTyxLQUFLLENBQUMsU0FBUyxDQUFDLElBQXNCO1FBQzVDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYTtZQUFFLE9BQU8sQ0FBQyx1Q0FBdUM7UUFDeEUsTUFBTSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNoRSxDQUFDOzttSEFqWFUscUJBQXFCLDBRQTJCdEIsV0FBVzt1R0EzQlYscUJBQXFCLDROQ3hDbEMsNDBLQWdKQSxpbUVEMUdjLENBQUMsb0JBQW9CLENBQUM7NEZBRXZCLHFCQUFxQjtrQkFQakMsU0FBUzsrQkFDRSwwQkFBMEIsbUJBR25CLHVCQUF1QixDQUFDLE1BQU0sY0FDbkMsQ0FBQyxvQkFBb0IsQ0FBQzs7MEJBNkIvQixNQUFNOzJCQUFDLFdBQVc7NENBZFosT0FBTztzQkFBZixLQUFLO2dCQUNHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFDRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBQ0csaUJBQWlCO3NCQUF6QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEluamVjdCwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBbGVydENvbnRyb2xsZXIsIE1vZGFsQ29udHJvbGxlciwgVG9hc3RDb250cm9sbGVyIH0gZnJvbSAnQGlvbmljL2FuZ3VsYXInO1xuaW1wb3J0IHsgZnJvbSwgT2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBDb25maWd1cmF0aW9uIH0gZnJvbSAnLi4vc2VydmljZXMvbW9kZWwvY29uZmlnLm1vZGVsJztcbmltcG9ydCB7IENvbmZpZ1NlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9jb25maWcuc2VydmljZSc7XG5pbXBvcnQgeyBQbGF0Zm9ybVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9wbGF0Zm9ybS5zZXJ2aWNlJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQsIGZpbHRlciwgbWFwLCBzd2l0Y2hNYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBOZXR3b3JrU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL25ldHdvcmsuc2VydmljZSc7XG5pbXBvcnQgeyBDT1JFX0NPTkZJR19PUFRJT05TIH0gZnJvbSAnLi4vc2VydmljZXMvY29uZmlnL2NvcmUuY29uZmlnJztcbmltcG9ydCB7IFZlcnNpb25VdGlscyB9IGZyb20gJy4uLy4uL3NoYXJlZC92ZXJzaW9uL3ZlcnNpb25zJztcbmltcG9ydCB7IHNsaWRlVXBEb3duQW5pbWF0aW9uIH0gZnJvbSAnLi4vLi4vc2hhcmVkL21hdGVyaWFsL21hdGVyaWFsLmFuaW1hdGlvbnMnO1xuaW1wb3J0IHsgaXNOaWxPckJsYW5rLCBpc05vdEVtcHR5QXJyYXksIGlzTm90TmlsLCBpc05vdE5pbE9yQmxhbmssIHNsZWVwIH0gZnJvbSAnLi4vLi4vc2hhcmVkL2Z1bmN0aW9ucyc7XG5pbXBvcnQgeyBFbnZpcm9ubWVudCwgRU5WSVJPTk1FTlQgfSBmcm9tICcuLi8uLi8uLi9lbnZpcm9ubWVudHMvZW52aXJvbm1lbnQuY2xhc3MnO1xuaW1wb3J0IHsgU2hvd1RvYXN0T3B0aW9ucywgVG9hc3RzIH0gZnJvbSAnLi4vLi4vc2hhcmVkL3RvYXN0L3RvYXN0cyc7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBQZWVyIH0gZnJvbSAnLi4vc2VydmljZXMvbW9kZWwvcGVlci5tb2RlbCc7XG5pbXBvcnQgeyBNaW1lVHlwZXMgfSBmcm9tICcuLi8uLi9zaGFyZWQvZmlsZS9maWxlLnV0aWxzJztcbmltcG9ydCB7IFVyaVV0aWxzIH0gZnJvbSAnLi4vLi4vc2hhcmVkL2ZpbGUvdXJpLnV0aWxzJztcblxuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIEluc3RhbGxBcHBMaW5rIHtcbiAgbmFtZTogc3RyaW5nO1xuICB1cmw6IHN0cmluZztcbiAgcGxhdGZvcm0/OiAnYW5kcm9pZCcgfCAnaW9zJztcbiAgdmVyc2lvbj86IHN0cmluZztcbiAgZmlsZW5hbWU/OiBzdHJpbmc7XG4gIHRpdGxlPzogc3RyaW5nO1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgbWltZVR5cGU/OiBzdHJpbmc7XG4gIGRvd25sb2FkaW5nPzogYm9vbGVhbjtcbiAgbG9jYXRpb24/OiBzdHJpbmc7XG59XG5cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLWluc3RhbGwtdXBncmFkZS1jYXJkJyxcbiAgdGVtcGxhdGVVcmw6ICdpbnN0YWxsLXVwZ3JhZGUtY2FyZC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2luc3RhbGwtdXBncmFkZS1jYXJkLmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBhbmltYXRpb25zOiBbc2xpZGVVcERvd25BbmltYXRpb25dXG59KVxuZXhwb3J0IGNsYXNzIEFwcEluc3RhbGxVcGdyYWRlQ2FyZCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcblxuICBwcml2YXRlIF9zdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG5cbiAgbG9hZGluZyA9IHRydWU7XG4gIGhhc0Rvd25sb2FkZXIgPSBmYWxzZTtcbiAgZG93bmxvYWRpbmcgPSBmYWxzZTtcbiAgd2FpdGluZ05ldHdvcmsgPSBmYWxzZTtcbiAgaW5zdGFsbExpbmtzOiBJbnN0YWxsQXBwTGlua1tdO1xuICB1cGdyYWRlTGlua3M6IEluc3RhbGxBcHBMaW5rW107XG4gIG9mZmxpbmU6IGJvb2xlYW47XG4gIHVwZ3JhZGVWZXJzaW9uOiBzdHJpbmc7XG5cbiAgQElucHV0KCkgaXNMb2dpbjogYm9vbGVhbjtcbiAgQElucHV0KCkgc2hvd1VwZ3JhZGVXYXJuaW5nID0gdHJ1ZTtcbiAgQElucHV0KCkgc2hvd09mZmxpbmVXYXJuaW5nID0gdHJ1ZTtcbiAgQElucHV0KCkgc2hvd0luc3RhbGxCdXR0b24gPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIG1vZGFsQ3RybDogTW9kYWxDb250cm9sbGVyLFxuICAgIHByaXZhdGUgY29uZmlnU2VydmljZTogQ29uZmlnU2VydmljZSxcbiAgICBwcml2YXRlIHRvYXN0Q29udHJvbGxlcjogVG9hc3RDb250cm9sbGVyLFxuICAgIHByaXZhdGUgYWxlcnRDb250cm9sbGVyOiBBbGVydENvbnRyb2xsZXIsXG4gICAgcHJpdmF0ZSB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjZDogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHVibGljIHBsYXRmb3JtOiBQbGF0Zm9ybVNlcnZpY2UsXG4gICAgcHVibGljIG5ldHdvcms6IE5ldHdvcmtTZXJ2aWNlLFxuICAgIEBJbmplY3QoRU5WSVJPTk1FTlQpIHByb3RlY3RlZCBlbnZpcm9ubWVudDogRW52aXJvbm1lbnRcbiAgKSB7XG5cbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuXG4gICAgdGhpcy5vZmZsaW5lID0gdGhpcy5uZXR3b3JrLm9mZmxpbmU7XG5cbiAgICAvLyBMaXN0ZW4gcG9kIGNvbmZpZ1xuICAgIHRoaXMuX3N1YnNjcmlwdGlvbi5hZGQoXG4gICAgICBmcm9tKHRoaXMubmV0d29yay5yZWFkeSgpKVxuICAgICAgICAucGlwZShcbiAgICAgICAgICBkZWJvdW5jZVRpbWUoMTAwMCksXG4gICAgICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMuY29uZmlnU2VydmljZS5jb25maWcpLFxuICAgICAgICAgIGZpbHRlcihpc05vdE5pbClcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKGNvbmZpZyA9PiB0aGlzLmNoZWNrTmVlZEluc3RhbGxPclVwZGF0ZShjb25maWcpKSk7XG5cbiAgICAvLyBMaXN0ZW4gbmV0d29yayBjaGFuZ2VzXG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uLmFkZChcbiAgICAgIHRoaXMubmV0d29yay5vbk5ldHdvcmtTdGF0dXNDaGFuZ2VzXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIC8vZGVib3VuY2VUaW1lKDQ1MCksXG4gICAgICAgICAgLy90YXAoKCkgPT4gdGhpcy53YWl0aW5nTmV0d29yayA9IGZhbHNlKSxcbiAgICAgICAgICBtYXAoY29ubmVjdGlvblR5cGUgPT4gY29ubmVjdGlvblR5cGUgPT09ICdub25lJyksXG4gICAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKVxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUob2ZmbGluZSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMub2ZmbGluZSAhPT0gb2ZmbGluZSkge1xuICAgICAgICAgICAgdGhpcy5vZmZsaW5lID0gb2ZmbGluZTtcbiAgICAgICAgICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLl9zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLl9zdWJzY3JpcHRpb24gPSBudWxsO1xuICAgIHRoaXMuaW5zdGFsbExpbmtzID0gbnVsbDtcbiAgICB0aGlzLnVwZ3JhZGVMaW5rcyA9IG51bGw7XG4gIH1cblxuICBhc3luYyBkb3dubG9hZChldmVudDogRXZlbnQsIGxpbms6IEluc3RhbGxBcHBMaW5rKSB7XG4gICAgaWYgKCFsaW5rIHx8ICFsaW5rLnVybCkge1xuICAgICAgY29uc29sZS5lcnJvcignW2luc3RhbGwtdXBncmFkZS1jYXJkXSBNaXNzaW5nIHJlcXVpcmVkIGFyZ3VtZW50IFxcJ2xpbmsudXJsXFwnJyk7XG4gICAgICByZXR1cm47IC8vIFNraXBcbiAgICB9XG5cbiAgICAvLyBNYXJrIGxpbmsgYXMgZG93bmxvYWRpbmdcbiAgICBsaW5rLmRvd25sb2FkaW5nID0gdHJ1ZTtcbiAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuXG4gICAgdGhpcy5saXN0ZW5Eb3dubG9hZEpvYihsaW5rLnVybCwgdGhpcy5wbGF0Zm9ybS5kb3dubG9hZCh7XG4gICAgICB1cmk6IGxpbmsudXJsLFxuICAgICAgdGl0bGU6IGxpbmsudGl0bGUsXG4gICAgICBmaWxlbmFtZTogbGluay5maWxlbmFtZSxcbiAgICAgIG1pbWVUeXBlOiBsaW5rLm1pbWVUeXBlXG4gICAgfSkpXG4gICAgICAudGhlbigobG9jYXRpb24pID0+IHtcbiAgICAgICAgaWYgKHRoaXMucGxhdGZvcm0uY2FuT3BlbkZpbGUpIGxpbmsubG9jYXRpb24gPSBsb2NhdGlvbjtcbiAgICAgICAgbGluay5kb3dubG9hZGluZyA9IGZhbHNlO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoKSA9PiBsaW5rLmRvd25sb2FkaW5nID0gZmFsc2UpXG4gICAgICAudGhlbigoKSA9PiB0aGlzLm1hcmtGb3JDaGVjaygpKTtcbiAgfVxuXG4gIGFzeW5jIG9wZW5GaWxlKGV2ZW50OiBFdmVudCwgbGluazogSW5zdGFsbEFwcExpbmspIHtcbiAgICBpZiAoIWxpbmsgfHwgIWxpbmsubG9jYXRpb24gfHwgIWxpbmsubWltZVR5cGUpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1tpbnN0YWxsLXVwZ3JhZGUtY2FyZF0gTWlzc2luZyByZXF1aXJlZCBhcmd1bWVudCBcXCdsaW5rLmxvY2F0aW9uXFwnIG9yIFxcJ2xpbmsubWltZVR5cGVcXCcnKTtcbiAgICAgIHJldHVybjsgLy8gU2tpcFxuICAgIH1cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5wbGF0Zm9ybS5vcGVuKGxpbmsubG9jYXRpb24pO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdbaW5zdGFsbC11cGdyYWRlLWNhcmRdIENhbm5vdCBvcGVuIGZpbGU6ICcgKyAoZXJyICYmIGVyci5tZXNzYWdlICB8fCBlcnIpLCBlcnIpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHRyeU9ubGluZSgpIHtcbiAgICB0aGlzLndhaXRpbmdOZXR3b3JrID0gdHJ1ZTtcbiAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMubmV0d29yay50cnlPbmxpbmUoe1xuICAgICAgICBzaG93TG9hZGluZ1RvYXN0OiBmYWxzZSxcbiAgICAgICAgc2hvd09ubGluZVRvYXN0OiB0cnVlLFxuICAgICAgICBzaG93T2ZmbGluZVRvYXN0OiBmYWxzZVxuICAgICAgfSk7XG4gICAgfVxuICAgIGZpbmFsbHkge1xuICAgICAgdGhpcy53YWl0aW5nTmV0d29yayA9IGZhbHNlO1xuICAgICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cblxuICBnZXRQbGF0Zm9ybU5hbWUocGxhdGZvcm06ICdhbmRyb2lkJ3wnaW9zJykge1xuICAgIHN3aXRjaCAocGxhdGZvcm0pIHtcbiAgICAgIGNhc2UgJ2FuZHJvaWQnOlxuICAgICAgICByZXR1cm4gJ0FuZHJvaWQnO1xuICAgICAgY2FzZSAnaW9zJzpcbiAgICAgICAgcmV0dXJuICdpT1MnO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgfVxuXG4gIGFzTGluayh2YWx1ZTogYW55KTogSW5zdGFsbEFwcExpbmsge1xuICAgIHJldHVybiB2YWx1ZSBhcyBJbnN0YWxsQXBwTGluaztcbiAgfVxuXG4gIC8qIC0tIHByaXZhdGUgbWV0aG9kICAtLSAqL1xuXG4gIHByaXZhdGUgYXN5bmMgY2hlY2tOZWVkSW5zdGFsbE9yVXBkYXRlKGNvbmZpZzogQ29uZmlndXJhdGlvbikge1xuICAgIGlmICghY29uZmlnKSByZXR1cm47IC8vIFNraXBcblxuICAgIGNvbnNvbGUuaW5mbygnW2luc3RhbGwtdXBncmFkZS1jYXJkXSBDaGVjayBpZiBuZWVkIHRvIGluc3RhbGwgb3IgdXBncmFkZS4uLicpO1xuXG4gICAgdGhpcy5oYXNEb3dubG9hZGVyID0gdGhpcy5wbGF0Zm9ybS5jYW5Eb3dubG9hZDtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBsaW5rcyA9IHRoaXMuZ2V0TGlua3MoY29uZmlnKTtcblxuICAgICAgLy8gQ2hlY2sgZm9yIHVwZ3JhZGVcbiAgICAgIHRoaXMudXBncmFkZUxpbmtzID0gdGhpcy5nZXRDb21wYXRpYmxlVXBncmFkZUxpbmtzKGxpbmtzLCBjb25maWcpO1xuXG4gICAgICBpZiAoaXNOb3RFbXB0eUFycmF5KHRoaXMudXBncmFkZUxpbmtzKSkge1xuICAgICAgICBjb25zb2xlLmluZm8oYFtpbnN0YWxsLXVwZ3JhZGUtY2FyZF0gRmluZCB1cGdyYWRlIGxpbmtzOiAke3RoaXMudXBncmFkZUxpbmtzLm1hcChsID0+IGwudXJsKS5qb2luKCcsJyl9YCk7XG4gICAgICAgIHRoaXMuaW5zdGFsbExpbmtzID0gbnVsbDtcbiAgICAgICAgdGhpcy5saXN0ZW5Eb3dubG9hZEpvYnMoKTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICAvLyBDaGVjayBmb3IgaW5zdGFsbCBsaW5rc1xuICAgICAgICB0aGlzLmluc3RhbGxMaW5rcyA9IHRoaXMuZ2V0Q29tcGF0aWJsZUluc3RhbGxMaW5rcyhsaW5rcyk7XG4gICAgICAgIGlmIChpc05vdEVtcHR5QXJyYXkodGhpcy5pbnN0YWxsTGlua3MpKSB7XG4gICAgICAgICAgY29uc29sZS5pbmZvKGBbaW5zdGFsbC11cGdyYWRlLWNhcmRdIEZpbmQgaW5zdGFsbGF0aW9uIGxpbmtzICR7dGhpcy5pbnN0YWxsTGlua3MubWFwKGwgPT4gbC51cmwpLmpvaW4oJywnKX1gKTtcbiAgICAgICAgICBhd2FpdCBzbGVlcCgxMDAwKTsgLy8gQWRkIGEgZGVsYXksIGZvciBhbmltYXRpb25cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmluZm8oYFtpbnN0YWxsLXVwZ3JhZGUtY2FyZF0gTm8gaW5zdGFsbGF0aW9uIG9yIHVwZ3JhZGUgbGlua3MgdG8gZGlzcGxheS5gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBmaW5hbGx5IHtcbiAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldENvbXBhdGlibGVJbnN0YWxsTGlua3MoaW5zdGFsbExpbmtzOiBJbnN0YWxsQXBwTGlua1tdKTogSW5zdGFsbEFwcExpbmtbXSB7XG5cbiAgICAvLyBBbHJlYWR5IGFuIG5hdGl2ZSBBcHA6IG5vdCBuZWVkIHRvIGluc3RhbGxcbiAgICBpZiAodGhpcy5wbGF0Zm9ybS5pc0FwcCgpKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgLy8gSWYgbW9iaWxlIHdlYjogcmV0dXJuIGFsbFxuICAgIGlmICh0aGlzLnBsYXRmb3JtLmlzTW9iaWxlV2ViKCkpIHtcbiAgICAgIHJldHVybiBpbnN0YWxsTGlua3M7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q29tcGF0aWJsZVVwZ3JhZGVMaW5rcyhpbnN0YWxsTGlua3M6IEluc3RhbGxBcHBMaW5rW10sIGNvbmZpZzogQ29uZmlndXJhdGlvbik6IEluc3RhbGxBcHBMaW5rW10ge1xuICAgIGNvbnN0IGFwcFZlcnNpb24gPSB0aGlzLmVudmlyb25tZW50LnZlcnNpb247XG4gICAgY29uc3QgYXBwTWluVmVyc2lvbkZyb21Qb2QgPSBjb25maWcuZ2V0UHJvcGVydHkoQ09SRV9DT05GSUdfT1BUSU9OUy5BUFBfTUlOX1ZFUlNJT04pO1xuXG4gICAgaWYgKCFhcHBWZXJzaW9uKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdNaXNzaW5nIHZhbHVlIGZvciBcXCdlbnZpcm9ubWVudC52ZXJzaW9uXFwnOiBjYW5ub3QgY2hlY2sgYXBwIGNvbXBhdGliaWxpdHkhJyk7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGNvbnN0IG5lZWRVcGdyYWRlID0gYXBwTWluVmVyc2lvbkZyb21Qb2QgJiYgIVZlcnNpb25VdGlscy5pc0NvbXBhdGlibGUoYXBwTWluVmVyc2lvbkZyb21Qb2QsIGFwcFZlcnNpb24pO1xuICAgIGlmICghbmVlZFVwZ3JhZGUpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCB1cGdyYWRlTGlua3MgPSB0aGlzLnBsYXRmb3JtLmlzKCdtb2JpbGV3ZWInKVxuICAgICAgLy8gQWxsIGxpbmsgaWYgbW9iaWxlIHdlYlxuICAgICAgPyBpbnN0YWxsTGlua3NcbiAgICAgIC8vIEZpbHRlciBvbiBwbGF0Zm9ybSwgaWYgbW9iaWxlIEFwcFxuICAgICAgOiBpbnN0YWxsTGlua3MuZmlsdGVyKGxpbmsgPT4gbGluay5wbGF0Zm9ybSAmJiB0aGlzLnBsYXRmb3JtLmlzKGxpbmsucGxhdGZvcm0pKTtcblxuICAgIC8vIFVzZSBtaW4gdmVyc2lvbiBhcyBkZWZhdWx0IHZlcnNpb25cbiAgICB1cGdyYWRlTGlua3MuZm9yRWFjaChsaW5rID0+IHtcbiAgICAgIGxpbmsudmVyc2lvbiA9IGxpbmsudmVyc2lvbiB8fCBhcHBNaW5WZXJzaW9uRnJvbVBvZDtcbiAgICB9KTtcblxuICAgIHJldHVybiBpc05vdEVtcHR5QXJyYXkodXBncmFkZUxpbmtzKSA/IHVwZ3JhZGVMaW5rcyA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0TGlua3MoY29uZmlnOiBDb25maWd1cmF0aW9uKTogSW5zdGFsbEFwcExpbmtbXSB7XG4gICAgY29uc3QgcmVzdWx0OiBJbnN0YWxsQXBwTGlua1tdID0gW107XG5cbiAgICAvLyBBbmRyb2lkXG4gICAge1xuICAgICAgLy8gR2V0IFVSTCAoZnJvbSBjb25maWcsIG9yIGVudmlyb25tZW50KVxuICAgICAgbGV0IHVybCA9IGNvbmZpZy5nZXRQcm9wZXJ0eShDT1JFX0NPTkZJR19PUFRJT05TLkFORFJPSURfSU5TVEFMTF9VUkwpO1xuICAgICAgaWYgKGlzTmlsT3JCbGFuayh1cmwpKSB1cmwgPSB0aGlzLmVudmlyb25tZW50LmRlZmF1bHRBbmRyb2lkSW5zdGFsbFVybCB8fCBudWxsO1xuXG4gICAgICAvLyBSZXNvbHZlIHJlbGF0aXZlIFVSTFxuICAgICAgY29uc3QgcGVlciA9IHRoaXMubmV0d29yay5wZWVyO1xuICAgICAgaWYgKHBlZXIgJiYgKHVybC5zdGFydHNXaXRoKCcuLycpIHx8IHVybC5zdGFydHNXaXRoKCcvJykpKSB7XG4gICAgICAgIHVybCA9IFBlZXIucGF0aChwZWVyLCB1cmwpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBtaW5WZXJzaW9uID0gY29uZmlnLmdldFByb3BlcnR5KENPUkVfQ09ORklHX09QVElPTlMuQVBQX01JTl9WRVJTSU9OKTtcblxuICAgICAgLy8gQ29tcHV0ZSBBcHAgbmFtZVxuICAgICAgY29uc3QgbmFtZTogc3RyaW5nID0gaXNOb3ROaWxPckJsYW5rKHVybCkgJiYgY29uZmlnLmxhYmVsIHx8IHRoaXMuZW52aXJvbm1lbnQuZGVmYXVsdEFwcE5hbWUgfHwgJ1NVTUFSaVMnO1xuXG4gICAgICBpZiAodXJsKSB7XG4gICAgICAgIGxldCB0aXRsZTogc3RyaW5nO1xuICAgICAgICBsZXQgbWltZVR5cGU6IHN0cmluZztcblxuICAgICAgICAvLyBHZXQgZmlsZSBuYW1lXG4gICAgICAgIGxldCBmaWxlbmFtZSA9IFVyaVV0aWxzLmdldEZpbGVuYW1lKHVybCk7XG4gICAgICAgIGxldCB2ZXJzaW9uID0gbWluVmVyc2lvbiB8fCAnbGF0ZXN0JztcblxuICAgICAgICAvLyBPSywgdGhpcyBpcyBhIGRvd25sb2FkYWJsZSBBUEsgZmlsZSAoZS5nLiBOT1QgYSBsaW5rIHRvIGEgcGxheXN0b3JlKVxuICAgICAgICBpZiAoZmlsZW5hbWU/LnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoJy5hcGsnKSkge1xuICAgICAgICAgIC8vIERlZmluZSBtaW1lIHR5cGVcbiAgICAgICAgICBtaW1lVHlwZSA9IE1pbWVUeXBlcy5BTkRST0lEX0FQSztcblxuICAgICAgICAgIC8vIEdldCB0aGUgZmlsZSB2ZXJzaW9uIChpZiBhbnkpXG4gICAgICAgICAgY29uc3QgdmVyc2lvbk1hdGNoZXMgPSAvLXYoWzEtOV1bMC05XSpcXC5bMC05XStcXC4oOj8oOj9hbHBoYXxiZXRhfHJjKT9bMC05XSopKS9pLmV4ZWMoZmlsZW5hbWUpO1xuICAgICAgICAgIHZlcnNpb24gPSB2ZXJzaW9uTWF0Y2hlcyAmJiB2ZXJzaW9uTWF0Y2hlc1sxXSB8fCB2ZXJzaW9uO1xuXG4gICAgICAgICAgLy8gQ29tcHV0ZSBhIG5ldyBmaWxlIG5hbWUsIHdpdGggdGhlIHZlcnNpb25cbiAgICAgICAgICBpZiAoaXNOb3ROaWxPckJsYW5rKG5hbWUpICYmIHZlcnNpb24gIT09ICdsYXRlc3QnKSB7XG4gICAgICAgICAgICBmaWxlbmFtZSA9IGAke25hbWV9LXYke3ZlcnNpb259LmFwa2AudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIHRpdGxlID0gYCR7bmFtZX0gdiR7dmVyc2lvbn1gO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFJlcGxhY2UgJ2xhdGVzdCcgd2l0aCB0aGUgYXBwIHZlcnNpb24sIGlmIHByZXNlbnQgaW4gdGhlIGZpbGVuYW1lXG4gICAgICAgICAgZWxzZSBpZiAoZmlsZW5hbWUuaW5kZXhPZignbGF0ZXN0JykgIT09IC0xICYmIHZlcnNpb24gIT09ICdsYXRlc3QnKSB7XG4gICAgICAgICAgICBmaWxlbmFtZSA9IGZpbGVuYW1lLnJlcGxhY2UoJ2xhdGVzdCcsIHZlcnNpb24pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJlc3VsdC5wdXNoKHsgbmFtZSwgdXJsLCBwbGF0Zm9ybTogJ2FuZHJvaWQnLCB2ZXJzaW9uLCBmaWxlbmFtZSwgdGl0bGUsIG1pbWVUeXBlIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGlPUyAtIFRPRE9cbiAgICAvL3tcbiAgICAvLyAgKC4uLilcbiAgICAvL31cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwcml2YXRlIGxpc3RlbkRvd25sb2FkSm9icygpIHtcbiAgICAvLyBMaXN0ZW5pbmcgZG93bmxvYWRpbmcgcHJvbWlzZSwgaWYgZXhpc3RzXG4gICAgKHRoaXMudXBncmFkZUxpbmtzIHx8IFtdKS5mb3JFYWNoKGxpbmsgPT4ge1xuICAgICAgY29uc3Qgam9iID0gdGhpcy5wbGF0Zm9ybS5nZXREb3dubG9hZGluZ0pvYihsaW5rLnVybCk7XG4gICAgICBpZiAoam9iKSB7XG4gICAgICAgIGxpbmsuZG93bmxvYWRpbmcgPSB0cnVlO1xuICAgICAgICB0aGlzLmxpc3RlbkRvd25sb2FkSm9iKGxpbmsudXJsLCBqb2IpXG4gICAgICAgICAgLnRoZW4oKGxvY2F0aW9uKSA9PiB7XG4gICAgICAgICAgICBsaW5rLmxvY2F0aW9uID0gbG9jYXRpb247XG4gICAgICAgICAgICBsaW5rLmRvd25sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuY2F0Y2goKCkgPT4gbGluay5kb3dubG9hZGluZyA9IGZhbHNlKVxuICAgICAgICAgIC50aGVuKCgpID0+IHRoaXMubWFya0ZvckNoZWNrKCkpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBsaXN0ZW5Eb3dubG9hZEpvYih1cmw6IHN0cmluZywgam9iOiBPYnNlcnZhYmxlPHN0cmluZz4pOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGlmICghdXJsIHx8ICFqb2IpIHJldHVybjsgLy8gU2tpcFxuXG4gICAgdHJ5IHtcbiAgICAgIC8vIE1hcmsgYXMgZG93bmxvYWRpbmdcbiAgICAgIGlmICghdGhpcy5kb3dubG9hZGluZykge1xuICAgICAgICBjb25zb2xlLmluZm8oYFtpbnN0YWxsLXVwZ3JhZGUtY2FyZF0gQXNraW5nIHBsYXRmb3JtIHRvIGRvd25sb2FkICcke3VybH0nLi4uYCk7XG4gICAgICAgIHRoaXMuZG93bmxvYWRpbmcgPSB0cnVlO1xuICAgICAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhgW2luc3RhbGwtdXBncmFkZS1jYXJkXSBQbGF0Zm9ybSBpcyBhbHJlYWR5IGRvd25sb2FkaW5nIWApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBsb2NhdGlvbiA9IGF3YWl0IGpvYi50b1Byb21pc2UoKTtcbiAgICAgIGlmIChsb2NhdGlvbikge1xuICAgICAgICBjb25zb2xlLmluZm8oJ1tpbnN0YWxsLXVwZ3JhZGUtY2FyZF0gRmlsZSBkb3dubG9hZGVkIGF0OiAnICsgbG9jYXRpb24pO1xuICAgICAgICB0aGlzLnNob3dEb3dubG9hZENvbXBsZXRlRGlhbG9nKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbG9jYXRpb247XG4gICAgfVxuICAgIC8vIEZhaWxlZDogZGlzcGxheSBhIHRvYXN0XG4gICAgY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5lcnJvcignW2luc3RhbGwtdXBncmFkZS1jYXJkXSBEb3dubG9hZCBmYWlsZWQ6ICcgKyAoZXJyICYmIGVyci5tZXNzYWdlIHx8IGVycikpO1xuICAgICAgdGhpcy5zaG93RG93bmxvYWRGYWlsZWRUb2FzdChlcnIpO1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgICBmaW5hbGx5IHtcbiAgICAgIHRoaXMuZG93bmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzaG93RG93bmxvYWRGYWlsZWRUb2FzdChlcnIpIHtcbiAgICByZXR1cm4gdGhpcy5zaG93VG9hc3Qoe1xuICAgICAgbWVzc2FnZTogJ0VSUk9SLkRPV05MT0FEX0ZBSUxFRCcsXG4gICAgICBtZXNzYWdlUGFyYW1zOiB7ZXJyb3I6IGVycn0sXG4gICAgICB0eXBlOiAnZXJyb3InLFxuICAgICAgc2hvd0Nsb3NlQnV0dG9uOiB0cnVlXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNob3dEb3dubG9hZENvbXBsZXRlRGlhbG9nKCkge1xuICAgIGlmICghdGhpcy5fc3Vic2NyaXB0aW9uKSByZXR1cm47IC8vIFNraXAgaWYgY29tcG9uZW50IGhhcyBiZWVuIGRlc3Ryb3llZFxuXG4gICAgY29uc3QgdHJhbnNsYXRpb25zID0gYXdhaXQgdGhpcy50cmFuc2xhdGUuaW5zdGFudChbXG4gICAgICAnSU5GTy5BTEVSVF9IRUFERVInLFxuICAgICAgJ0lORk8uVVBEQVRFX0FQUF9ET1dOTE9BREVEJyxcbiAgICAgICdDT01NT04uQlROX0NMT1NFJ1xuICAgIF0pO1xuICAgIGNvbnN0IGFsZXJ0ID0gYXdhaXQgdGhpcy5hbGVydENvbnRyb2xsZXIuY3JlYXRlKHtcbiAgICAgIGhlYWRlcjogdHJhbnNsYXRpb25zWydJTkZPLkFMRVJUX0hFQURFUiddLFxuICAgICAgbWVzc2FnZTogdHJhbnNsYXRpb25zWydJTkZPLlVQREFURV9BUFBfRE9XTkxPQURFRCddLFxuICAgICAgYnV0dG9uczogW1xuICAgICAgICB7XG4gICAgICAgICAgdGV4dDogdHJhbnNsYXRpb25zWydDT01NT04uQlROX0NMT1NFJ10sXG4gICAgICAgICAgcm9sZTogJ2NhbmNlbCcsXG4gICAgICAgICAgY3NzQ2xhc3M6ICdzZWNvbmRhcnknXG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9KTtcblxuICAgIGF3YWl0IGFsZXJ0LnByZXNlbnQoKTtcbiAgICBhd2FpdCBhbGVydC5vbkRpZERpc21pc3MoKTtcbiAgfVxuXG4gIHByaXZhdGUgbWFya0ZvckNoZWNrKCkge1xuICAgIGlmICghdGhpcy5fc3Vic2NyaXB0aW9uKSByZXR1cm47IC8vIFNraXAgaWYgZGVzdHJveWVkXG4gICAgdGhpcy5jZC5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc2hvd1RvYXN0KG9wdHM6IFNob3dUb2FzdE9wdGlvbnMpIHtcbiAgICBpZiAoIXRoaXMuX3N1YnNjcmlwdGlvbikgcmV0dXJuOyAvLyBTa2lwIGlmIGNvbXBvbmVudCBoYXMgYmVlbiBkZXN0cm95ZWRcbiAgICBhd2FpdCBUb2FzdHMuc2hvdyh0aGlzLnRvYXN0Q29udHJvbGxlciwgdGhpcy50cmFuc2xhdGUsIG9wdHMpO1xuICB9XG59XG4iLCJcblxuPCEtLSBPZmZsaW5lIG1vZGUgY2FyZC0tPlxuPGlvbi1jYXJkICpuZ0lmPVwic2hvd09mZmxpbmVXYXJuaW5nICYmICghbG9hZGluZyAmJiBvZmZsaW5lIHx8IHdhaXRpbmdOZXR3b3JrKVwiXG4gICAgICAgICAgY29sb3I9XCJhY2NlbnRcIlxuICAgICAgICAgIGNsYXNzPVwibWFpbiBpb24tbm8tbWFyZ2luXCJcbiAgICAgICAgICBAc2xpZGVVcERvd25BbmltYXRpb24+XG4gIDxpb24tY2FyZC1jb250ZW50IGNsYXNzPVwiaW9uLW5vLXBhZGRpbmdcIj5cbiAgICA8aW9uLWdyaWQ+XG4gICAgICA8aW9uLXJvdz5cbiAgICAgICAgPGlvbi1jb2w+XG4gICAgICAgICAgPGlvbi10ZXh0IGNsYXNzPVwiaW9uLXRleHQtd3JhcFwiICpuZ0lmPVwiIXdhaXRpbmdOZXR3b3JrOyBlbHNlIHdhaXRpbmdOZXR3b3JrVGV4dFwiPlxuICAgICAgICAgICAgPGg0PlxuICAgICAgICAgICAgPGIgKm5nSWY9XCJpc0xvZ2luOyBlbHNlIG5vdExvZ2luXCIgIFtpbm5lckhUTUxdPVwiJ05FVFdPUksuSU5GTy5PRkZMSU5FX09SX1VOQVVUSE9SSVpFRCd8IHRyYW5zbGF0ZVwiPjwvYj5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbm90TG9naW4+XG4gICAgICAgICAgICAgIDxiIFtpbm5lckhUTUxdPVwiJ05FVFdPUksuSU5GTy5PRkZMSU5FJ3wgdHJhbnNsYXRlXCI+PC9iPlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDwvaDQ+XG4gICAgICAgICAgICA8aDM+XG4gICAgICAgICAgICAgIDxzbWFsbCBbaW5uZXJIVE1MXT1cIidORVRXT1JLLklORk8uT0ZGTElORV9IRUxQJ3x0cmFuc2xhdGVcIj48L3NtYWxsPlxuICAgICAgICAgICAgPC9oMz5cbiAgICAgICAgICA8L2lvbi10ZXh0PlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjd2FpdGluZ05ldHdvcmtUZXh0PlxuICAgICAgICAgICAgPGlvbi10ZXh0IGNsYXNzPVwiaW9uLXRleHQtd3JhcFwiIFtpbm5lckhUTUxdPVwiJ05FVFdPUksuSU5GTy5SRVRSWV9UT19DT05ORUNUJ3wgdHJhbnNsYXRlXCI+PC9pb24tdGV4dD5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L2lvbi1jb2w+XG4gICAgICAgIDxpb24tY29sIHNpemU9XCJhdXRvXCI+XG5cbiAgICAgICAgICA8IS0tIFJldHJ5IGJ1dHRvbiAtLT5cbiAgICAgICAgICA8aW9uLWJ1dHRvbiAqbmdJZj1cIiF3YWl0aW5nTmV0d29yazsgZWxzZSB3YWl0aW5nU3Bpbm5lclwiIGNvbG9yPVwidGVydGlhcnlcIiBjbGFzcz1cImlvbi1mbG9hdC1lbmRcIlxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ0cnlPbmxpbmUoKVwiPlxuICAgICAgICAgICAgPHNwYW4gdHJhbnNsYXRlPk5FVFdPUksuQlROX0NIRUNLX0FMSVZFPC9zcGFuPlxuICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cblxuICAgICAgICA8L2lvbi1jb2w+XG4gICAgICA8L2lvbi1yb3c+XG4gICAgPC9pb24tZ3JpZD5cblxuICA8L2lvbi1jYXJkLWNvbnRlbnQ+XG48L2lvbi1jYXJkPlxuXG48IS0tIFVwZ3JhZGUgbGlua3MgLS0+XG48aW9uLWNhcmQgKm5nSWY9XCJzaG93VXBncmFkZVdhcm5pbmcgJiYgIWxvYWRpbmcgJiYgIW9mZmxpbmUgJiYgdXBncmFkZUxpbmtzXCJcbiAgICAgICAgICBjb2xvcj1cImFjY2VudFwiXG4gICAgICAgICAgY2xhc3M9XCJpb24tbm8tbWFyZ2luXCJcbiAgICAgICAgICBAc2xpZGVVcERvd25BbmltYXRpb24+XG4gIDxpb24tY2FyZC1jb250ZW50IGNsYXNzPVwiaW9uLW5vLXBhZGRpbmdcIj5cbiAgICA8aW9uLWdyaWQ+XG4gICAgICA8aW9uLXJvdyAqbmdGb3I9XCJsZXQgbGluayBvZiB1cGdyYWRlTGlua3M7IGxhc3QgYXMgbGFzdFwiPlxuICAgICAgICA8aW9uLWNvbD5cbiAgICAgICAgICA8aW9uLXRleHQgY2xhc3M9XCJpb24tdGV4dC13cmFwXCI+XG4gICAgICAgICAgICA8aDM+XG4gICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwibGluay52ZXJzaW9uXCIgW2lubmVySFRNTF09XCInSU5GTy5VUERBVEVfQVBQX1RPX1ZFUlNJT04nfCB0cmFuc2xhdGU6IGxpbmtcIj48L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWxpbmsudmVyc2lvblwiIFtpbm5lckhUTUxdPVwiJ0lORk8uVVBEQVRFX0FQUCd8IHRyYW5zbGF0ZTogbGlua1wiPjwvc3Bhbj5cbiAgICAgICAgICAgIDwvaDM+XG4gICAgICAgICAgICA8aDQ+XG4gICAgICAgICAgICAgIDxzbWFsbCAqbmdJZj1cImxhc3RcIiBbaW5uZXJIVE1MXT1cIidJTkZPLlVQREFURV9BUFBfSEVMUCd8dHJhbnNsYXRlXCI+PC9zbWFsbD5cbiAgICAgICAgICAgIDwvaDQ+XG4gICAgICAgICAgPC9pb24tdGV4dD5cbiAgICAgICAgPC9pb24tY29sPlxuXG4gICAgICAgIDxpb24tY29sIHNpemU9XCJhdXRvXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImRvd25sb2FkQnV0dG9uOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogbGluayAgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2lvbi1jb2w+XG4gICAgICA8L2lvbi1yb3c+XG5cbiAgICA8L2lvbi1ncmlkPlxuXG4gIDwvaW9uLWNhcmQtY29udGVudD5cbjwvaW9uLWNhcmQ+XG5cbjwhLS0gSW5zdGFsbCBsaW5rcyAtLT5cbjxpb24tY2FyZCAqbmdJZj1cInNob3dJbnN0YWxsQnV0dG9uICYmICFsb2FkaW5nICYmICFvZmZsaW5lICYmIGluc3RhbGxMaW5rc1wiXG4gICAgICAgICAgY29sb3I9XCJzZWNvbmRhcnlcIlxuICAgICAgICAgIGNsYXNzPVwiaW9uLW5vLW1hcmdpblwiXG4gICAgICAgICAgQHNsaWRlVXBEb3duQW5pbWF0aW9uPlxuICA8aW9uLWNhcmQtY29udGVudCBjbGFzcz1cImlvbi1uby1wYWRkaW5nXCI+XG4gICAgPGlvbi1ncmlkPlxuICAgICAgPGlvbi1yb3cgKm5nRm9yPVwibGV0IGxpbmsgb2YgaW5zdGFsbExpbmtzOyBsYXN0IGFzIGxhc3RcIj5cbiAgICAgICAgPGlvbi1jb2wgc2l6ZT1cIjEyXCIgc2l6ZS1zbT1cIjhcIj5cbiAgICAgICAgICA8aW9uLXRleHQgY2xhc3M9XCJpb24tdGV4dC13cmFwXCI+XG4gICAgICAgICAgICA8aDMgW2lubmVySFRNTF09XCInSU5GTy5ET1dOTE9BRF9BUFBfVElUTEUnfCB0cmFuc2xhdGU6IHtuYW1lOiBsaW5rLm5hbWUsIHBsYXRmb3JtOiBnZXRQbGF0Zm9ybU5hbWUobGluay5wbGF0Zm9ybSkgfVwiPjwvaDM+XG4gICAgICAgICAgICA8aDQ+PHNtYWxsICpuZ0lmPVwibGFzdFwiIFtpbm5lckhUTUxdPVwiJ0lORk8uRE9XTkxPQURfQVBQX0hFTFAnfHRyYW5zbGF0ZVwiPjwvc21hbGw+PC9oND5cbiAgICAgICAgICA8L2lvbi10ZXh0PlxuICAgICAgICA8L2lvbi1jb2w+XG4gICAgICAgIDxpb24tY29sIHNpemU9XCIxMlwiIHNpemUtc209XCI0XCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImRvd25sb2FkQnV0dG9uOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogbGluayAgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2lvbi1jb2w+XG4gICAgICA8L2lvbi1yb3c+XG5cbiAgICA8L2lvbi1ncmlkPlxuXG4gIDwvaW9uLWNhcmQtY29udGVudD5cbjwvaW9uLWNhcmQ+XG5cbjwhLS0gRGlzcGxheSBhIGRvd25sb2FkIGJ1dHRvbiwgZGVwZW5kaW5nIG9uIHRoZSBsaW5rIFVSTCwgYW5kIHRoZSBkZXZpY2UgcGxhdGZvcm0gLS0+XG48bmctdGVtcGxhdGUgI2Rvd25sb2FkQnV0dG9uIGxldC1saW5rPlxuXG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJsaW5rLmZpbGVuYW1lOyBlbHNlIHJlZGlyZWN0QnV0dG9uXCI+XG5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaGFzRG93bmxvYWRlcjsgZWxzZSB3ZWJEb3dubG9hZEJ1dHRvblwiPlxuICAgICAgPCEtLSBEb3dubG9hZCB1c2luZyBwbGF0Zm9ybSAtLT5cbiAgICAgIDxpb24tYnV0dG9uIChjbGljayk9XCJkb3dubG9hZCgkZXZlbnQsIGFzTGluayhsaW5rKSlcIlxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhbGluay5sb2NhdGlvbjsgZWxzZSBvcGVuQnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJsaW5rLmRvd25sb2FkaW5nXCJcbiAgICAgICAgICAgICAgICAgIGNvbG9yPVwidGVydGlhcnlcIiBjbGFzcz1cImlvbi1mbG9hdC1lbmRcIj5cbiAgICAgICAgPGlvbi1pY29uIHNsb3Q9XCJzdGFydFwiICpuZ0lmPVwiIWxpbmsuZG93bmxvYWRpbmdcIiBuYW1lPVwiZG93bmxvYWRcIj48L2lvbi1pY29uPlxuICAgICAgICA8aW9uLXNwaW5uZXIgc2xvdD1cInN0YXJ0XCIgY2xhc3M9XCJpb24tbm8tcGFkZGluZ1wiICpuZ0lmPVwibGluay5kb3dubG9hZGluZ1wiPjwvaW9uLXNwaW5uZXI+XG4gICAgICAgIDxpb24tbGFiZWwgdHJhbnNsYXRlPkNPTU1PTi5CVE5fRE9XTkxPQUQ8L2lvbi1sYWJlbD5cbiAgICAgIDwvaW9uLWJ1dHRvbj5cblxuICAgICAgPCEtLSBPcGVuIEFQSyBidXR0b24gLS0+XG4gICAgICA8bmctdGVtcGxhdGUgI29wZW5CdXR0b24+XG4gICAgICAgIDxpb24tYnV0dG9uICpuZ0lmPVwibGluay5sb2NhdGlvblwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvcGVuRmlsZSgkZXZlbnQsIGxpbmspXCJcbiAgICAgICAgICAgICAgICAgICAgY29sb3I9XCJ0ZXJ0aWFyeVwiIGNsYXNzPVwiaW9uLWZsb2F0LWVuZFwiID5cbiAgICAgICAgICA8aW9uLWxhYmVsIHRyYW5zbGF0ZT5DT01NT04uQlROX0lOU1RBTEw8L2lvbi1sYWJlbD5cbiAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDwhLS0gV2ViIGRvd25sb2FkIGJ1dHRvbiAtLT5cbiAgICA8bmctdGVtcGxhdGUgI3dlYkRvd25sb2FkQnV0dG9uPlxuICAgICAgPGlvbi1idXR0b24gW2Rvd25sb2FkXT1cImxpbmsuZmlsZW5hbWVcIlxuICAgICAgICAgICAgICAgICAgW2hyZWZdPVwibGluay51cmxcIlxuICAgICAgICAgICAgICAgICAgY29sb3I9XCJ0ZXJ0aWFyeVwiIGNsYXNzPVwiaW9uLWZsb2F0LWVuZFwiID5cbiAgICAgICAgPGlvbi1sYWJlbCB0cmFuc2xhdGU+Q09NTU9OLkJUTl9ET1dOTE9BRDwvaW9uLWxhYmVsPlxuICAgICAgPC9pb24tYnV0dG9uPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIDwvbmctY29udGFpbmVyPlxuXG4gIDwhLS0gV2ViIHJlZGlyZWN0IGJ1dHRvbiAtLT5cbiAgPG5nLXRlbXBsYXRlICNyZWRpcmVjdEJ1dHRvbj5cbiAgICA8aW9uLWJ1dHRvbiBbaHJlZl09XCJsaW5rLnVybFwiIHJlbD1cImV4dGVybmFsXCIgY29sb3I9XCJ0ZXJ0aWFyeVwiIGNsYXNzPVwiaW9uLWZsb2F0LWVuZFwiIHRhcmdldD1cIl9ibGFua1wiPlxuICAgICAgPGlvbi1sYWJlbCB0cmFuc2xhdGU+Q09NTU9OLkJUTl9TSE9XX01PUkU8L2lvbi1sYWJlbD5cbiAgICA8L2lvbi1idXR0b24+XG4gIDwvbmctdGVtcGxhdGU+XG48L25nLXRlbXBsYXRlPlxuXG5cbjwhLS0gV2FpdGluZyBzcGlubmVyIC0tPlxuPG5nLXRlbXBsYXRlICN3YWl0aW5nU3Bpbm5lcj5cbiAgPGlvbi1zcGlubmVyIGNvbG9yPVwibGlnaHRcIj48L2lvbi1zcGlubmVyPlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==