@sumaris-net/ngx-components 18.24.24 → 21.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 (801) hide show
  1. package/README.md +2 -0
  2. package/doc/build.md +2 -2
  3. package/doc/changelog.md +6 -5
  4. package/fesm2022/sumaris-net-ngx-components-testing.mjs +496 -0
  5. package/fesm2022/sumaris-net-ngx-components-testing.mjs.map +1 -0
  6. package/fesm2022/sumaris-net.ngx-components.mjs +2782 -2426
  7. package/fesm2022/sumaris-net.ngx-components.mjs.map +1 -1
  8. package/package.json +20 -15
  9. package/src/assets/environments/environment-test.json +2 -2
  10. package/src/assets/i18n/fr.json +6 -5
  11. package/src/assets/manifest.json +1 -1
  12. package/src/theme/_icons.scss +8 -12
  13. package/src/theme/_ionic.globals.scss +15 -1
  14. package/src/theme/_material.globals.scss +4 -1
  15. package/src/theme/_material.scss +16 -13
  16. package/src/theme/_mixins.scss +7 -1
  17. package/src/theme/_ngx-components.forms.scss +87 -84
  18. package/src/theme/_ngx-components.globals.scss +2 -0
  19. package/src/theme/_ngx-components.scss +20 -5
  20. package/src/theme/_ngx-components.table.scss +37 -26
  21. package/src/theme/_ngx-components.tabs.scss +16 -14
  22. package/src/theme/_responsive.scss +2 -0
  23. package/src/theme/_roboto.scss +3 -0
  24. package/src/theme/_theme.scss +11 -14
  25. package/src/theme/_theme.variables.scss +11 -2
  26. package/src/theme/ionic/ionic.functions.color.scss +13 -5
  27. package/src/theme/ionic/ionic.globals.scss +4 -4
  28. package/src/theme/ionic/ionic.theme.default.scss +2 -0
  29. package/types/sumaris-net-ngx-components-testing.d.ts +286 -0
  30. package/types/sumaris-net.ngx-components.d.ts +14216 -0
  31. package/esm2022/public_api.mjs +0 -403
  32. package/esm2022/src/app/admin/admin-routing.module.mjs +0 -34
  33. package/esm2022/src/app/admin/admin.module.mjs +0 -32
  34. package/esm2022/src/app/admin/users/person.filter.mjs +0 -157
  35. package/esm2022/src/app/admin/users/person.service.mjs +0 -226
  36. package/esm2022/src/app/admin/users/person.validator.mjs +0 -78
  37. package/esm2022/src/app/admin/users/users-select.modal.mjs +0 -167
  38. package/esm2022/src/app/admin/users/users.mjs +0 -502
  39. package/esm2022/src/app/admin/users/users.module.mjs +0 -59
  40. package/esm2022/src/app/admin/users/users.utils.mjs +0 -29
  41. package/esm2022/src/app/core/about/about.modal.mjs +0 -119
  42. package/esm2022/src/app/core/about/about.module.mjs +0 -22
  43. package/esm2022/src/app/core/account/account.module.mjs +0 -75
  44. package/esm2022/src/app/core/account/account.page.mjs +0 -426
  45. package/esm2022/src/app/core/account/new-token.form.mjs +0 -109
  46. package/esm2022/src/app/core/account/new-token.modal.mjs +0 -66
  47. package/esm2022/src/app/core/account/password/change-password.form.mjs +0 -63
  48. package/esm2022/src/app/core/account/password/change-password.module.mjs +0 -22
  49. package/esm2022/src/app/core/account/password/change-password.page.mjs +0 -150
  50. package/esm2022/src/app/core/account/token.table.mjs +0 -160
  51. package/esm2022/src/app/core/auth/auth.form.mjs +0 -159
  52. package/esm2022/src/app/core/auth/auth.modal.mjs +0 -76
  53. package/esm2022/src/app/core/auth/auth.module.mjs +0 -56
  54. package/esm2022/src/app/core/auth/reset-password.modal.mjs +0 -89
  55. package/esm2022/src/app/core/core.module.mjs +0 -157
  56. package/esm2022/src/app/core/core.testing.module.mjs +0 -128
  57. package/esm2022/src/app/core/form/array/form-array.mjs +0 -328
  58. package/esm2022/src/app/core/form/array/testing/form-array-test.module.mjs +0 -23
  59. package/esm2022/src/app/core/form/array/testing/form-array.test.mjs +0 -97
  60. package/esm2022/src/app/core/form/buttons/form-buttons-bar.component.mjs +0 -111
  61. package/esm2022/src/app/core/form/buttons/form-buttons-bar.module.mjs +0 -31
  62. package/esm2022/src/app/core/form/entity/editor.class.mjs +0 -268
  63. package/esm2022/src/app/core/form/entity/entity-editor-modal.class.mjs +0 -420
  64. package/esm2022/src/app/core/form/entity/entity-editor.class.mjs +0 -753
  65. package/esm2022/src/app/core/form/entity/entity-metadata.component.mjs +0 -25
  66. package/esm2022/src/app/core/form/entity/entity.module.mjs +0 -33
  67. package/esm2022/src/app/core/form/entity/tab-editor.class.mjs +0 -190
  68. package/esm2022/src/app/core/form/form-container.class.mjs +0 -371
  69. package/esm2022/src/app/core/form/form.class.mjs +0 -342
  70. package/esm2022/src/app/core/form/form.module.mjs +0 -77
  71. package/esm2022/src/app/core/form/form.utils.mjs +0 -238
  72. package/esm2022/src/app/core/form/list/list.form.mjs +0 -243
  73. package/esm2022/src/app/core/form/list/list.module.mjs +0 -31
  74. package/esm2022/src/app/core/form/properties/properties-file.service.mjs +0 -133
  75. package/esm2022/src/app/core/form/properties/properties.form.mjs +0 -397
  76. package/esm2022/src/app/core/form/properties/properties.module.mjs +0 -85
  77. package/esm2022/src/app/core/form/properties/properties.table.mjs +0 -267
  78. package/esm2022/src/app/core/form/properties/properties.utils.mjs +0 -304
  79. package/esm2022/src/app/core/form/properties/property.validator.mjs +0 -70
  80. package/esm2022/src/app/core/form/properties/testing/properties-form.test.mjs +0 -103
  81. package/esm2022/src/app/core/form/properties/testing/properties-form.testing.module.mjs +0 -23
  82. package/esm2022/src/app/core/form/text/testing/text-form.testing.mjs +0 -42
  83. package/esm2022/src/app/core/form/text/testing/text-form.testing.module.mjs +0 -25
  84. package/esm2022/src/app/core/form/text/text-form.component.mjs +0 -205
  85. package/esm2022/src/app/core/form/text/text-form.module.mjs +0 -31
  86. package/esm2022/src/app/core/form/text-popover/testing/text-popover.testing.mjs +0 -73
  87. package/esm2022/src/app/core/form/text-popover/testing/text-popover.testing.module.mjs +0 -22
  88. package/esm2022/src/app/core/form/text-popover/text-popover.component.mjs +0 -164
  89. package/esm2022/src/app/core/form/text-popover/text-popover.module.mjs +0 -32
  90. package/esm2022/src/app/core/form/username/username.form.mjs +0 -55
  91. package/esm2022/src/app/core/form/username/username.module.mjs +0 -20
  92. package/esm2022/src/app/core/graphql/graphql.module.mjs +0 -14
  93. package/esm2022/src/app/core/graphql/graphql.service.mjs +0 -781
  94. package/esm2022/src/app/core/graphql/graphql.utils.mjs +0 -119
  95. package/esm2022/src/app/core/home/home.mjs +0 -472
  96. package/esm2022/src/app/core/home/home.module.mjs +0 -54
  97. package/esm2022/src/app/core/icon/icon.component.mjs +0 -40
  98. package/esm2022/src/app/core/icon/icon.module.mjs +0 -20
  99. package/esm2022/src/app/core/install/install-upgrade-card.component.mjs +0 -394
  100. package/esm2022/src/app/core/install/install-upgrade-card.module.mjs +0 -31
  101. package/esm2022/src/app/core/menu/menu.component.mjs +0 -273
  102. package/esm2022/src/app/core/menu/menu.model.mjs +0 -327
  103. package/esm2022/src/app/core/menu/menu.module.mjs +0 -47
  104. package/esm2022/src/app/core/menu/menu.service.mjs +0 -666
  105. package/esm2022/src/app/core/menu/sub-menu-tab.directive.mjs +0 -113
  106. package/esm2022/src/app/core/menu/testing/menu-other.testing.mjs +0 -51
  107. package/esm2022/src/app/core/menu/testing/menu.testing.mjs +0 -165
  108. package/esm2022/src/app/core/menu/testing/menu.testing.module.mjs +0 -60
  109. package/esm2022/src/app/core/offline/update-offline-mode-card.component.mjs +0 -28
  110. package/esm2022/src/app/core/offline/update-offline-mode-card.module.mjs +0 -31
  111. package/esm2022/src/app/core/peer/select-peer.modal.mjs +0 -350
  112. package/esm2022/src/app/core/peer/select-peer.module.mjs +0 -36
  113. package/esm2022/src/app/core/register/register-confirm.page.mjs +0 -90
  114. package/esm2022/src/app/core/register/register.form.mjs +0 -197
  115. package/esm2022/src/app/core/register/register.modal.mjs +0 -55
  116. package/esm2022/src/app/core/register/register.module.mjs +0 -23
  117. package/esm2022/src/app/core/services/account.service.mjs +0 -1403
  118. package/esm2022/src/app/core/services/auth-guard.service.mjs +0 -74
  119. package/esm2022/src/app/core/services/base-entity-service.class.mjs +0 -499
  120. package/esm2022/src/app/core/services/base-graphql-service.class.mjs +0 -224
  121. package/esm2022/src/app/core/services/base58.mjs +0 -83
  122. package/esm2022/src/app/core/services/config/core.config.mjs +0 -293
  123. package/esm2022/src/app/core/services/config.service.mjs +0 -384
  124. package/esm2022/src/app/core/services/crypto.service.mjs +0 -110
  125. package/esm2022/src/app/core/services/errors.mjs +0 -54
  126. package/esm2022/src/app/core/services/local-settings.service.mjs +0 -540
  127. package/esm2022/src/app/core/services/model/account.model.mjs +0 -192
  128. package/esm2022/src/app/core/services/model/config.model.mjs +0 -111
  129. package/esm2022/src/app/core/services/model/department.model.mjs +0 -35
  130. package/esm2022/src/app/core/services/model/entity.decorators.mjs +0 -97
  131. package/esm2022/src/app/core/services/model/entity.model.mjs +0 -347
  132. package/esm2022/src/app/core/services/model/filter.model.mjs +0 -169
  133. package/esm2022/src/app/core/services/model/history.model.mjs +0 -2
  134. package/esm2022/src/app/core/services/model/model.enum.mjs +0 -11
  135. package/esm2022/src/app/core/services/model/node-feature.model.mjs +0 -31
  136. package/esm2022/src/app/core/services/model/peer.model.mjs +0 -114
  137. package/esm2022/src/app/core/services/model/person.model.mjs +0 -118
  138. package/esm2022/src/app/core/services/model/referential.model.mjs +0 -207
  139. package/esm2022/src/app/core/services/model/settings.model.mjs +0 -6
  140. package/esm2022/src/app/core/services/model/token.model.mjs +0 -57
  141. package/esm2022/src/app/core/services/model/tree-item-entity.model.mjs +0 -234
  142. package/esm2022/src/app/core/services/network.service.mjs +0 -759
  143. package/esm2022/src/app/core/services/network.types.mjs +0 -2
  144. package/esm2022/src/app/core/services/network.utils.mjs +0 -35
  145. package/esm2022/src/app/core/services/pipes/account.pipes.mjs +0 -38
  146. package/esm2022/src/app/core/services/pipes/department-to-string.pipe.mjs +0 -23
  147. package/esm2022/src/app/core/services/pipes/person-to-string.pipe.mjs +0 -23
  148. package/esm2022/src/app/core/services/pipes/pipes.module.mjs +0 -58
  149. package/esm2022/src/app/core/services/pipes/referential-to-string.pipe.mjs +0 -36
  150. package/esm2022/src/app/core/services/pipes/usage-mode.pipes.mjs +0 -37
  151. package/esm2022/src/app/core/services/platform.service.mjs +0 -788
  152. package/esm2022/src/app/core/services/storage/entities-storage.service.mjs +0 -427
  153. package/esm2022/src/app/core/services/storage/entity-store.class.mjs +0 -450
  154. package/esm2022/src/app/core/services/testing/referential-filter.model.mjs +0 -25
  155. package/esm2022/src/app/core/services/testing/referential.validator.mjs +0 -46
  156. package/esm2022/src/app/core/services/validator/account.validator.mjs +0 -46
  157. package/esm2022/src/app/core/services/validator/base.validator.class.mjs +0 -49
  158. package/esm2022/src/app/core/services/validator/local-settings.validator.mjs +0 -57
  159. package/esm2022/src/app/core/services/validator/user-settings.validator.mjs +0 -27
  160. package/esm2022/src/app/core/services/validator/user-token.validator.mjs +0 -55
  161. package/esm2022/src/app/core/settings/settings.module.mjs +0 -23
  162. package/esm2022/src/app/core/settings/settings.page.mjs +0 -406
  163. package/esm2022/src/app/core/table/async-table.class.mjs +0 -1888
  164. package/esm2022/src/app/core/table/column/actions-column.component.mjs +0 -137
  165. package/esm2022/src/app/core/table/column/nav-actions-column.component.mjs +0 -120
  166. package/esm2022/src/app/core/table/column/row-field.component.mjs +0 -116
  167. package/esm2022/src/app/core/table/entities-async-table-datasource.class.mjs +0 -415
  168. package/esm2022/src/app/core/table/entities-table-datasource.class.mjs +0 -407
  169. package/esm2022/src/app/core/table/memory-table.class.mjs +0 -57
  170. package/esm2022/src/app/core/table/table-select-columns.component.mjs +0 -46
  171. package/esm2022/src/app/core/table/table.class.mjs +0 -1918
  172. package/esm2022/src/app/core/table/table.model.mjs +0 -21
  173. package/esm2022/src/app/core/table/table.module.mjs +0 -51
  174. package/esm2022/src/app/core/table/table.pipes.mjs +0 -76
  175. package/esm2022/src/app/core/table/table.utils.mjs +0 -34
  176. package/esm2022/src/app/core/table/testing/nested-table.testing.mjs +0 -326
  177. package/esm2022/src/app/core/table/testing/table-validator.service.mjs +0 -32
  178. package/esm2022/src/app/core/table/testing/table.testing.mjs +0 -342
  179. package/esm2022/src/app/core/table/testing/table.testing.module.mjs +0 -47
  180. package/esm2022/src/app/core/table/testing/table2-validator.service.mjs +0 -25
  181. package/esm2022/src/app/core/table/testing/table2.testing.mjs +0 -322
  182. package/esm2022/src/app/shared/alerts.mjs +0 -243
  183. package/esm2022/src/app/shared/audio/audio.mjs +0 -255
  184. package/esm2022/src/app/shared/audio/audio.testing.mjs +0 -32
  185. package/esm2022/src/app/shared/audio/audio.testing.module.mjs +0 -30
  186. package/esm2022/src/app/shared/base64.utils.mjs +0 -59
  187. package/esm2022/src/app/shared/capacitor/keyboard.mjs +0 -42
  188. package/esm2022/src/app/shared/capacitor/plugins.mjs +0 -10
  189. package/esm2022/src/app/shared/constants.mjs +0 -20
  190. package/esm2022/src/app/shared/dates.mjs +0 -216
  191. package/esm2022/src/app/shared/debug/debug-service.class.mjs +0 -3
  192. package/esm2022/src/app/shared/debug/debug.component.mjs +0 -44
  193. package/esm2022/src/app/shared/debug/debug.module.mjs +0 -23
  194. package/esm2022/src/app/shared/directives/autofocus.directive.mjs +0 -91
  195. package/esm2022/src/app/shared/directives/autoresize.directive.mjs +0 -75
  196. package/esm2022/src/app/shared/directives/autotitle.directive.mjs +0 -30
  197. package/esm2022/src/app/shared/directives/autotooltip.directive.mjs +0 -35
  198. package/esm2022/src/app/shared/directives/cell-selection/cell-identifier.directive.mjs +0 -55
  199. package/esm2022/src/app/shared/directives/cell-selection/cell-selection.directive.mjs +0 -206
  200. package/esm2022/src/app/shared/directives/cell-selection/cell-selection.service.mjs +0 -204
  201. package/esm2022/src/app/shared/directives/directives.module.mjs +0 -53
  202. package/esm2022/src/app/shared/directives/drag-and-drop.directive.mjs +0 -52
  203. package/esm2022/src/app/shared/directives/ng-var.directive.mjs +0 -33
  204. package/esm2022/src/app/shared/directives/resizable/resizable.component.mjs +0 -62
  205. package/esm2022/src/app/shared/directives/resizable/resizable.directive.mjs +0 -96
  206. package/esm2022/src/app/shared/directives/resizable/resizable.module.mjs +0 -17
  207. package/esm2022/src/app/shared/directives/throttled-click.directive.mjs +0 -43
  208. package/esm2022/src/app/shared/events.mjs +0 -64
  209. package/esm2022/src/app/shared/file/csv.utils.mjs +0 -97
  210. package/esm2022/src/app/shared/file/file.service.mjs +0 -118
  211. package/esm2022/src/app/shared/file/file.utils.mjs +0 -117
  212. package/esm2022/src/app/shared/file/images.utils.mjs +0 -218
  213. package/esm2022/src/app/shared/file/json.utils.mjs +0 -58
  214. package/esm2022/src/app/shared/file/uri.utils.mjs +0 -29
  215. package/esm2022/src/app/shared/file/url.utils.mjs +0 -213
  216. package/esm2022/src/app/shared/focusable.mjs +0 -6
  217. package/esm2022/src/app/shared/form/field.component.mjs +0 -388
  218. package/esm2022/src/app/shared/form/field.model.mjs +0 -100
  219. package/esm2022/src/app/shared/form/loading-spinner.mjs +0 -35
  220. package/esm2022/src/app/shared/forms.mjs +0 -593
  221. package/esm2022/src/app/shared/functions.mjs +0 -900
  222. package/esm2022/src/app/shared/geolocation/geolocation.utils.mjs +0 -94
  223. package/esm2022/src/app/shared/gesture/gesture-config.mjs +0 -46
  224. package/esm2022/src/app/shared/gesture/hammer.utils.mjs +0 -2
  225. package/esm2022/src/app/shared/graph/colors.utils.mjs +0 -85
  226. package/esm2022/src/app/shared/graph/graph-colors.mjs +0 -214
  227. package/esm2022/src/app/shared/guard/component-dirty.guard.mjs +0 -68
  228. package/esm2022/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.mjs +0 -23
  229. package/esm2022/src/app/shared/hotkeys/hotkeys.service.mjs +0 -147
  230. package/esm2022/src/app/shared/hotkeys/shared-hotkeys.module.mjs +0 -24
  231. package/esm2022/src/app/shared/html.utils.mjs +0 -35
  232. package/esm2022/src/app/shared/http/http.utils.mjs +0 -56
  233. package/esm2022/src/app/shared/image/gallery/image-gallery.component.mjs +0 -452
  234. package/esm2022/src/app/shared/image/gallery/image-gallery.module.mjs +0 -62
  235. package/esm2022/src/app/shared/image/gallery/testing/gallegry.model.testing.mjs +0 -26
  236. package/esm2022/src/app/shared/image/gallery/testing/gallery.service.testing.mjs +0 -92
  237. package/esm2022/src/app/shared/image/gallery/testing/gallery.testing.mjs +0 -37
  238. package/esm2022/src/app/shared/image/gallery/testing/gallery.testing.module.mjs +0 -59
  239. package/esm2022/src/app/shared/image/image.model.mjs +0 -2
  240. package/esm2022/src/app/shared/image/image.module.mjs +0 -24
  241. package/esm2022/src/app/shared/image/image.service.mjs +0 -118
  242. package/esm2022/src/app/shared/inputs.mjs +0 -281
  243. package/esm2022/src/app/shared/interceptors/progess.interceptor.mjs +0 -27
  244. package/esm2022/src/app/shared/logging/log-level.model.mjs +0 -48
  245. package/esm2022/src/app/shared/logging/logger.model.mjs +0 -47
  246. package/esm2022/src/app/shared/logging/logging-service.class.mjs +0 -125
  247. package/esm2022/src/app/shared/logging/logging-service.config.mjs +0 -2
  248. package/esm2022/src/app/shared/logging/logging-service.module.mjs +0 -30
  249. package/esm2022/src/app/shared/markdown/markdown.component.mjs +0 -321
  250. package/esm2022/src/app/shared/markdown/markdown.directive.mjs +0 -34
  251. package/esm2022/src/app/shared/markdown/markdown.modal.mjs +0 -99
  252. package/esm2022/src/app/shared/markdown/markdown.module.mjs +0 -87
  253. package/esm2022/src/app/shared/markdown/markdown.service.mjs +0 -204
  254. package/esm2022/src/app/shared/markdown/markdown.utils.mjs +0 -87
  255. package/esm2022/src/app/shared/markdown/testing/markdown.test.mjs +0 -55
  256. package/esm2022/src/app/shared/markdown/testing/markdown.testing.module.mjs +0 -30
  257. package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.config.mjs +0 -46
  258. package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.mjs +0 -1373
  259. package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.module.mjs +0 -81
  260. package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.utils.mjs +0 -18
  261. package/esm2022/src/app/shared/material/autocomplete/testing/autocomplete.test.mjs +0 -244
  262. package/esm2022/src/app/shared/material/badge/badge.directive.mjs +0 -251
  263. package/esm2022/src/app/shared/material/badge/badge.module.mjs +0 -20
  264. package/esm2022/src/app/shared/material/badge/badge.test.mjs +0 -42
  265. package/esm2022/src/app/shared/material/boolean/boolean.module.mjs +0 -70
  266. package/esm2022/src/app/shared/material/boolean/material.boolean.mjs +0 -374
  267. package/esm2022/src/app/shared/material/boolean/testing/boolean.test.page.mjs +0 -83
  268. package/esm2022/src/app/shared/material/chips/chips.module.mjs +0 -74
  269. package/esm2022/src/app/shared/material/chips/material.chips.mjs +0 -843
  270. package/esm2022/src/app/shared/material/chips/testing/chips.test.mjs +0 -151
  271. package/esm2022/src/app/shared/material/datetime/datetime.module.mjs +0 -79
  272. package/esm2022/src/app/shared/material/datetime/material.date.mjs +0 -474
  273. package/esm2022/src/app/shared/material/datetime/material.dateshort.mjs +0 -457
  274. package/esm2022/src/app/shared/material/datetime/material.datetime.mjs +0 -852
  275. package/esm2022/src/app/shared/material/datetime/testing/mat-date-time.test.mjs +0 -140
  276. package/esm2022/src/app/shared/material/datetime/testing/mat-date.test.mjs +0 -127
  277. package/esm2022/src/app/shared/material/datetime/testing/mat-dateshort.test.mjs +0 -118
  278. package/esm2022/src/app/shared/material/duration/duration.module.mjs +0 -61
  279. package/esm2022/src/app/shared/material/duration/duration.utils.mjs +0 -16
  280. package/esm2022/src/app/shared/material/duration/material.duration.mjs +0 -283
  281. package/esm2022/src/app/shared/material/duration/testing/mat-duration.test.mjs +0 -85
  282. package/esm2022/src/app/shared/material/latlong/latlong.utils.mjs +0 -319
  283. package/esm2022/src/app/shared/material/latlong/material.latlong-input.mjs +0 -471
  284. package/esm2022/src/app/shared/material/latlong/material.latlong.mjs +0 -231
  285. package/esm2022/src/app/shared/material/latlong/material.latlong.module.mjs +0 -68
  286. package/esm2022/src/app/shared/material/latlong/testing/latlong.test.mjs +0 -138
  287. package/esm2022/src/app/shared/material/material.animations.mjs +0 -200
  288. package/esm2022/src/app/shared/material/material.config.mjs +0 -3
  289. package/esm2022/src/app/shared/material/material.module.mjs +0 -224
  290. package/esm2022/src/app/shared/material/material.testing.module.mjs +0 -234
  291. package/esm2022/src/app/shared/material/paginator/material.paginator-i18n.mjs +0 -51
  292. package/esm2022/src/app/shared/material/stepper/material.stepper-i18n.mjs +0 -23
  293. package/esm2022/src/app/shared/material/swipe/material.swipe.mjs +0 -379
  294. package/esm2022/src/app/shared/material/swipe/swipe.module.mjs +0 -52
  295. package/esm2022/src/app/shared/material/swipe/testing/swipe.test.mjs +0 -67
  296. package/esm2022/src/app/shared/material/test/test-component.mjs +0 -264
  297. package/esm2022/src/app/shared/material/testing/common.test.mjs +0 -111
  298. package/esm2022/src/app/shared/modules.mjs +0 -12
  299. package/esm2022/src/app/shared/named-filter/named-filter-selector.component.mjs +0 -306
  300. package/esm2022/src/app/shared/named-filter/named-filter.model.mjs +0 -49
  301. package/esm2022/src/app/shared/named-filter/named-filter.module.mjs +0 -24
  302. package/esm2022/src/app/shared/named-filter/named-filter.service.mjs +0 -69
  303. package/esm2022/src/app/shared/named-filter/testing/named-filter-selector.testing.mjs +0 -74
  304. package/esm2022/src/app/shared/named-filter/testing/named-filter.testing.module.mjs +0 -28
  305. package/esm2022/src/app/shared/observables.mjs +0 -104
  306. package/esm2022/src/app/shared/pipes/arrays.pipe.mjs +0 -251
  307. package/esm2022/src/app/shared/pipes/badge.pipes.mjs +0 -25
  308. package/esm2022/src/app/shared/pipes/colors.pipe.mjs +0 -29
  309. package/esm2022/src/app/shared/pipes/date-diff-duration.pipe.mjs +0 -50
  310. package/esm2022/src/app/shared/pipes/date-format.pipe.mjs +0 -72
  311. package/esm2022/src/app/shared/pipes/date-from-now.pipe.mjs +0 -28
  312. package/esm2022/src/app/shared/pipes/date-from.pipe.mjs +0 -29
  313. package/esm2022/src/app/shared/pipes/dates.pipe.mjs +0 -18
  314. package/esm2022/src/app/shared/pipes/display-with.pipe.mjs +0 -23
  315. package/esm2022/src/app/shared/pipes/duration.pipe.mjs +0 -34
  316. package/esm2022/src/app/shared/pipes/file-size.pipe.mjs +0 -53
  317. package/esm2022/src/app/shared/pipes/form.pipes.mjs +0 -258
  318. package/esm2022/src/app/shared/pipes/highlight.pipe.mjs +0 -50
  319. package/esm2022/src/app/shared/pipes/html.pipes.mjs +0 -102
  320. package/esm2022/src/app/shared/pipes/latlong-format.pipe.mjs +0 -42
  321. package/esm2022/src/app/shared/pipes/maps.pipe.mjs +0 -65
  322. package/esm2022/src/app/shared/pipes/maskito.pipe.mjs +0 -67
  323. package/esm2022/src/app/shared/pipes/math.pipes.mjs +0 -77
  324. package/esm2022/src/app/shared/pipes/ng-init.pipe.mjs +0 -19
  325. package/esm2022/src/app/shared/pipes/number-format.pipe.mjs +0 -17
  326. package/esm2022/src/app/shared/pipes/observable.pipes.mjs +0 -63
  327. package/esm2022/src/app/shared/pipes/pipes.module.mjs +0 -316
  328. package/esm2022/src/app/shared/pipes/property.pipes.mjs +0 -148
  329. package/esm2022/src/app/shared/pipes/selection.pipes.mjs +0 -177
  330. package/esm2022/src/app/shared/pipes/string.pipes.mjs +0 -196
  331. package/esm2022/src/app/shared/pipes/translate-context.pipe.mjs +0 -44
  332. package/esm2022/src/app/shared/pipes/types.pipes.mjs +0 -74
  333. package/esm2022/src/app/shared/pipes/url.pipes.mjs +0 -35
  334. package/esm2022/src/app/shared/platforms.mjs +0 -81
  335. package/esm2022/src/app/shared/print/print.service.mjs +0 -305
  336. package/esm2022/src/app/shared/regexps.mjs +0 -103
  337. package/esm2022/src/app/shared/rx-state/rx-state.decorators.mjs +0 -193
  338. package/esm2022/src/app/shared/rx-state/rx-state.module.mjs +0 -19
  339. package/esm2022/src/app/shared/rx-state/rx-state.types.mjs +0 -2
  340. package/esm2022/src/app/shared/services/entity-service.class.mjs +0 -44
  341. package/esm2022/src/app/shared/services/job.utils.mjs +0 -92
  342. package/esm2022/src/app/shared/services/memory-entity-service.class.mjs +0 -362
  343. package/esm2022/src/app/shared/services/progress-bar.service.mjs +0 -31
  344. package/esm2022/src/app/shared/services/startable-observable-service.class.mjs +0 -144
  345. package/esm2022/src/app/shared/services/startable-service.class.mjs +0 -118
  346. package/esm2022/src/app/shared/services/translate-context.service.mjs +0 -107
  347. package/esm2022/src/app/shared/services/validator-service.class.mjs +0 -2
  348. package/esm2022/src/app/shared/services.mjs +0 -85
  349. package/esm2022/src/app/shared/shared-routing.module.mjs +0 -72
  350. package/esm2022/src/app/shared/shared.module.mjs +0 -229
  351. package/esm2022/src/app/shared/shared.testing.module.mjs +0 -108
  352. package/esm2022/src/app/shared/storage/storage-explorer.component.mjs +0 -281
  353. package/esm2022/src/app/shared/storage/storage-explorer.module.mjs +0 -42
  354. package/esm2022/src/app/shared/storage/storage-explorer.testing-routing.module.mjs +0 -27
  355. package/esm2022/src/app/shared/storage/storage-explorer.testing.module.mjs +0 -25
  356. package/esm2022/src/app/shared/storage/storage.service.mjs +0 -134
  357. package/esm2022/src/app/shared/storage/storage.utils.mjs +0 -13
  358. package/esm2022/src/app/shared/testing/maskito.test.mjs +0 -41
  359. package/esm2022/src/app/shared/testing/observable.test.mjs +0 -94
  360. package/esm2022/src/app/shared/testing/tests.page.mjs +0 -37
  361. package/esm2022/src/app/shared/toast/toast.testing.mjs +0 -54
  362. package/esm2022/src/app/shared/toast/toast.testing.module.mjs +0 -31
  363. package/esm2022/src/app/shared/toast/toasts.mjs +0 -134
  364. package/esm2022/src/app/shared/toolbar/modal-toolbar.mjs +0 -62
  365. package/esm2022/src/app/shared/toolbar/toolbar.mjs +0 -279
  366. package/esm2022/src/app/shared/toolbar/toolbar.module.mjs +0 -26
  367. package/esm2022/src/app/shared/types.mjs +0 -2
  368. package/esm2022/src/app/shared/upload-file/testing/upload-file.testing.mjs +0 -59
  369. package/esm2022/src/app/shared/upload-file/testing/upload-file.testing.module.mjs +0 -30
  370. package/esm2022/src/app/shared/upload-file/upload-file-popover.component.mjs +0 -114
  371. package/esm2022/src/app/shared/upload-file/upload-file.component.mjs +0 -216
  372. package/esm2022/src/app/shared/upload-file/upload-file.model.mjs +0 -26
  373. package/esm2022/src/app/shared/validator/form-error-adapter.class.mjs +0 -122
  374. package/esm2022/src/app/shared/validator/validators.mjs +0 -658
  375. package/esm2022/src/app/shared/version/versions.mjs +0 -80
  376. package/esm2022/src/app/social/config/social.config.mjs +0 -9
  377. package/esm2022/src/app/social/feed/feed.component.mjs +0 -317
  378. package/esm2022/src/app/social/feed/feed.directive.mjs +0 -151
  379. package/esm2022/src/app/social/feed/feed.model.mjs +0 -60
  380. package/esm2022/src/app/social/feed/feed.module.mjs +0 -24
  381. package/esm2022/src/app/social/feed/feed.page.mjs +0 -67
  382. package/esm2022/src/app/social/feed/feed.service.mjs +0 -222
  383. package/esm2022/src/app/social/feed/testing/feed.testing.mjs +0 -66
  384. package/esm2022/src/app/social/feed/testing/feed.testing.module.mjs +0 -23
  385. package/esm2022/src/app/social/job/job.module.mjs +0 -23
  386. package/esm2022/src/app/social/job/progression/job-progression.component.mjs +0 -38
  387. package/esm2022/src/app/social/job/progression/job-progression.icon.mjs +0 -241
  388. package/esm2022/src/app/social/job/progression/job-progression.list.mjs +0 -50
  389. package/esm2022/src/app/social/job/progression/job-progression.model.mjs +0 -29
  390. package/esm2022/src/app/social/job/progression/job-progression.service.mjs +0 -91
  391. package/esm2022/src/app/social/job/testing/job-progression.testing.mjs +0 -38
  392. package/esm2022/src/app/social/job/testing/job-progression.testing.service.mjs +0 -34
  393. package/esm2022/src/app/social/job/testing/job.testing.module.mjs +0 -22
  394. package/esm2022/src/app/social/message/message.form.mjs +0 -149
  395. package/esm2022/src/app/social/message/message.modal.mjs +0 -116
  396. package/esm2022/src/app/social/message/message.model.mjs +0 -86
  397. package/esm2022/src/app/social/message/message.module.mjs +0 -25
  398. package/esm2022/src/app/social/message/message.service.mjs +0 -198
  399. package/esm2022/src/app/social/social.errors.mjs +0 -11
  400. package/esm2022/src/app/social/social.module.mjs +0 -22
  401. package/esm2022/src/app/social/social.testing.module.mjs +0 -72
  402. package/esm2022/src/app/social/user-event/notification/user-event-notification.icon.mjs +0 -191
  403. package/esm2022/src/app/social/user-event/notification/user-event-notification.list.mjs +0 -280
  404. package/esm2022/src/app/social/user-event/notification/user-event-notification.modal.mjs +0 -84
  405. package/esm2022/src/app/social/user-event/testing/user-event.testing.mjs +0 -273
  406. package/esm2022/src/app/social/user-event/testing/user-event.testing.model.mjs +0 -129
  407. package/esm2022/src/app/social/user-event/testing/user-event.testing.module.mjs +0 -22
  408. package/esm2022/src/app/social/user-event/testing/user-event.testing.service.mjs +0 -128
  409. package/esm2022/src/app/social/user-event/user-event.model.mjs +0 -2
  410. package/esm2022/src/app/social/user-event/user-event.module.mjs +0 -24
  411. package/esm2022/src/app/social/user-event/user-event.service.mjs +0 -512
  412. package/esm2022/src/environments/environment.class.mjs +0 -69
  413. package/esm2022/src/environments/environment.loader.mjs +0 -77
  414. package/esm2022/src/environments/environment.mjs +0 -133
  415. package/esm2022/sumaris-net.ngx-components.mjs +0 -5
  416. package/index.d.ts +0 -5
  417. package/public_api.d.ts +0 -364
  418. package/src/app/admin/admin-routing.module.d.ts +0 -9
  419. package/src/app/admin/admin.module.d.ts +0 -10
  420. package/src/app/admin/users/person.filter.d.ts +0 -37
  421. package/src/app/admin/users/person.service.d.ts +0 -61
  422. package/src/app/admin/users/person.validator.d.ts +0 -23
  423. package/src/app/admin/users/users-select.modal.d.ts +0 -73
  424. package/src/app/admin/users/users.d.ts +0 -89
  425. package/src/app/admin/users/users.module.d.ts +0 -15
  426. package/src/app/admin/users/users.utils.d.ts +0 -6
  427. package/src/app/core/about/about.modal.d.ts +0 -44
  428. package/src/app/core/about/about.module.d.ts +0 -11
  429. package/src/app/core/account/account.module.d.ts +0 -18
  430. package/src/app/core/account/account.page.d.ts +0 -93
  431. package/src/app/core/account/new-token.form.d.ts +0 -30
  432. package/src/app/core/account/new-token.modal.d.ts +0 -29
  433. package/src/app/core/account/password/change-password.form.d.ts +0 -19
  434. package/src/app/core/account/password/change-password.module.d.ts +0 -11
  435. package/src/app/core/account/password/change-password.page.d.ts +0 -36
  436. package/src/app/core/account/token.table.d.ts +0 -28
  437. package/src/app/core/auth/auth.form.d.ts +0 -38
  438. package/src/app/core/auth/auth.modal.d.ts +0 -24
  439. package/src/app/core/auth/auth.module.d.ts +0 -13
  440. package/src/app/core/auth/reset-password.modal.d.ts +0 -29
  441. package/src/app/core/core.module.d.ts +0 -28
  442. package/src/app/core/core.testing.module.d.ts +0 -16
  443. package/src/app/core/form/array/form-array.d.ts +0 -147
  444. package/src/app/core/form/array/testing/form-array-test.module.d.ts +0 -12
  445. package/src/app/core/form/array/testing/form-array.test.d.ts +0 -27
  446. package/src/app/core/form/buttons/form-buttons-bar.component.d.ts +0 -38
  447. package/src/app/core/form/buttons/form-buttons-bar.module.d.ts +0 -9
  448. package/src/app/core/form/entity/editor.class.d.ts +0 -86
  449. package/src/app/core/form/entity/entity-editor-modal.class.d.ts +0 -126
  450. package/src/app/core/form/entity/entity-editor.class.d.ts +0 -211
  451. package/src/app/core/form/entity/entity-metadata.component.d.ts +0 -13
  452. package/src/app/core/form/entity/entity.module.d.ts +0 -11
  453. package/src/app/core/form/entity/tab-editor.class.d.ts +0 -66
  454. package/src/app/core/form/form-container.class.d.ts +0 -132
  455. package/src/app/core/form/form.class.d.ts +0 -148
  456. package/src/app/core/form/form.module.d.ts +0 -15
  457. package/src/app/core/form/form.utils.d.ts +0 -301
  458. package/src/app/core/form/list/list.form.d.ts +0 -83
  459. package/src/app/core/form/list/list.module.d.ts +0 -9
  460. package/src/app/core/form/properties/properties-file.service.d.ts +0 -26
  461. package/src/app/core/form/properties/properties.form.d.ts +0 -109
  462. package/src/app/core/form/properties/properties.module.d.ts +0 -18
  463. package/src/app/core/form/properties/properties.table.d.ts +0 -73
  464. package/src/app/core/form/properties/properties.utils.d.ts +0 -59
  465. package/src/app/core/form/properties/property.validator.d.ts +0 -27
  466. package/src/app/core/form/properties/testing/properties-form.test.d.ts +0 -22
  467. package/src/app/core/form/properties/testing/properties-form.testing.module.d.ts +0 -12
  468. package/src/app/core/form/text/testing/text-form.testing.d.ts +0 -19
  469. package/src/app/core/form/text/testing/text-form.testing.module.d.ts +0 -14
  470. package/src/app/core/form/text/text-form.component.d.ts +0 -66
  471. package/src/app/core/form/text/text-form.module.d.ts +0 -9
  472. package/src/app/core/form/text-popover/testing/text-popover.testing.d.ts +0 -16
  473. package/src/app/core/form/text-popover/testing/text-popover.testing.module.d.ts +0 -11
  474. package/src/app/core/form/text-popover/text-popover.component.d.ts +0 -81
  475. package/src/app/core/form/text-popover/text-popover.module.d.ts +0 -10
  476. package/src/app/core/form/username/username.form.d.ts +0 -19
  477. package/src/app/core/form/username/username.module.d.ts +0 -9
  478. package/src/app/core/graphql/graphql.module.d.ts +0 -7
  479. package/src/app/core/graphql/graphql.service.d.ts +0 -138
  480. package/src/app/core/graphql/graphql.utils.d.ts +0 -47
  481. package/src/app/core/home/home.d.ts +0 -135
  482. package/src/app/core/home/home.module.d.ts +0 -16
  483. package/src/app/core/icon/icon.component.d.ts +0 -13
  484. package/src/app/core/icon/icon.module.d.ts +0 -9
  485. package/src/app/core/install/install-upgrade-card.component.d.ts +0 -63
  486. package/src/app/core/install/install-upgrade-card.module.d.ts +0 -9
  487. package/src/app/core/menu/menu.component.d.ts +0 -69
  488. package/src/app/core/menu/menu.model.d.ts +0 -163
  489. package/src/app/core/menu/menu.module.d.ts +0 -12
  490. package/src/app/core/menu/menu.service.d.ts +0 -93
  491. package/src/app/core/menu/sub-menu-tab.directive.d.ts +0 -29
  492. package/src/app/core/menu/testing/menu-other.testing.d.ts +0 -15
  493. package/src/app/core/menu/testing/menu.testing.d.ts +0 -53
  494. package/src/app/core/menu/testing/menu.testing.module.d.ts +0 -12
  495. package/src/app/core/offline/update-offline-mode-card.component.d.ts +0 -11
  496. package/src/app/core/offline/update-offline-mode-card.module.d.ts +0 -9
  497. package/src/app/core/peer/select-peer.modal.d.ts +0 -108
  498. package/src/app/core/peer/select-peer.module.d.ts +0 -12
  499. package/src/app/core/register/register-confirm.page.d.ts +0 -24
  500. package/src/app/core/register/register.form.d.ts +0 -49
  501. package/src/app/core/register/register.modal.d.ts +0 -14
  502. package/src/app/core/register/register.module.d.ts +0 -12
  503. package/src/app/core/services/account.service.d.ts +0 -236
  504. package/src/app/core/services/auth-guard.service.d.ts +0 -17
  505. package/src/app/core/services/base-entity-service.class.d.ts +0 -134
  506. package/src/app/core/services/base-graphql-service.class.d.ts +0 -77
  507. package/src/app/core/services/base58.d.ts +0 -7
  508. package/src/app/core/services/config/core.config.d.ts +0 -52
  509. package/src/app/core/services/config.service.d.ts +0 -63
  510. package/src/app/core/services/crypto.service.d.ts +0 -45
  511. package/src/app/core/services/errors.d.ts +0 -65
  512. package/src/app/core/services/local-settings.service.d.ts +0 -130
  513. package/src/app/core/services/model/account.model.d.ts +0 -66
  514. package/src/app/core/services/model/config.model.d.ts +0 -37
  515. package/src/app/core/services/model/department.model.d.ts +0 -11
  516. package/src/app/core/services/model/entity.decorators.d.ts +0 -17
  517. package/src/app/core/services/model/entity.model.d.ts +0 -133
  518. package/src/app/core/services/model/filter.model.d.ts +0 -37
  519. package/src/app/core/services/model/history.model.d.ts +0 -20
  520. package/src/app/core/services/model/model.enum.d.ts +0 -7
  521. package/src/app/core/services/model/node-feature.model.d.ts +0 -14
  522. package/src/app/core/services/model/peer.model.d.ts +0 -35
  523. package/src/app/core/services/model/person.model.d.ts +0 -39
  524. package/src/app/core/services/model/referential.model.d.ts +0 -85
  525. package/src/app/core/services/model/settings.model.d.ts +0 -29
  526. package/src/app/core/services/model/token.model.d.ts +0 -22
  527. package/src/app/core/services/model/tree-item-entity.model.d.ts +0 -62
  528. package/src/app/core/services/network.service.d.ts +0 -184
  529. package/src/app/core/services/network.types.d.ts +0 -4
  530. package/src/app/core/services/network.utils.d.ts +0 -39
  531. package/src/app/core/services/pipes/account.pipes.d.ts +0 -15
  532. package/src/app/core/services/pipes/department-to-string.pipe.d.ts +0 -9
  533. package/src/app/core/services/pipes/person-to-string.pipe.d.ts +0 -11
  534. package/src/app/core/services/pipes/pipes.module.d.ts +0 -11
  535. package/src/app/core/services/pipes/referential-to-string.pipe.d.ts +0 -23
  536. package/src/app/core/services/pipes/usage-mode.pipes.d.ts +0 -15
  537. package/src/app/core/services/platform.service.d.ts +0 -127
  538. package/src/app/core/services/storage/entities-storage.service.d.ts +0 -108
  539. package/src/app/core/services/storage/entity-store.class.d.ts +0 -113
  540. package/src/app/core/services/testing/referential-filter.model.d.ts +0 -9
  541. package/src/app/core/services/testing/referential.validator.d.ts +0 -22
  542. package/src/app/core/services/validator/account.validator.d.ts +0 -24
  543. package/src/app/core/services/validator/base.validator.class.d.ts +0 -21
  544. package/src/app/core/services/validator/local-settings.validator.d.ts +0 -18
  545. package/src/app/core/services/validator/user-settings.validator.d.ts +0 -10
  546. package/src/app/core/services/validator/user-token.validator.d.ts +0 -13
  547. package/src/app/core/settings/settings.module.d.ts +0 -12
  548. package/src/app/core/settings/settings.page.d.ts +0 -89
  549. package/src/app/core/table/async-table.class.d.ts +0 -445
  550. package/src/app/core/table/column/actions-column.component.d.ts +0 -65
  551. package/src/app/core/table/column/nav-actions-column.component.d.ts +0 -47
  552. package/src/app/core/table/column/row-field.component.d.ts +0 -41
  553. package/src/app/core/table/entities-async-table-datasource.class.d.ts +0 -103
  554. package/src/app/core/table/entities-table-datasource.class.d.ts +0 -102
  555. package/src/app/core/table/memory-table.class.d.ts +0 -25
  556. package/src/app/core/table/table-select-columns.component.d.ts +0 -22
  557. package/src/app/core/table/table.class.d.ts +0 -427
  558. package/src/app/core/table/table.model.d.ts +0 -31
  559. package/src/app/core/table/table.module.d.ts +0 -14
  560. package/src/app/core/table/table.pipes.d.ts +0 -30
  561. package/src/app/core/table/table.utils.d.ts +0 -13
  562. package/src/app/core/table/testing/nested-table.testing.d.ts +0 -54
  563. package/src/app/core/table/testing/table-validator.service.d.ts +0 -17
  564. package/src/app/core/table/testing/table.testing.d.ts +0 -55
  565. package/src/app/core/table/testing/table.testing.module.d.ts +0 -17
  566. package/src/app/core/table/testing/table2-validator.service.d.ts +0 -15
  567. package/src/app/core/table/testing/table2.testing.d.ts +0 -53
  568. package/src/app/shared/alerts.d.ts +0 -55
  569. package/src/app/shared/audio/audio.d.ts +0 -45
  570. package/src/app/shared/audio/audio.testing.d.ts +0 -13
  571. package/src/app/shared/audio/audio.testing.module.d.ts +0 -11
  572. package/src/app/shared/base64.utils.d.ts +0 -7
  573. package/src/app/shared/capacitor/keyboard.d.ts +0 -16
  574. package/src/app/shared/capacitor/plugins.d.ts +0 -8
  575. package/src/app/shared/constants.d.ts +0 -16
  576. package/src/app/shared/dates.d.ts +0 -85
  577. package/src/app/shared/debug/debug-service.class.d.ts +0 -5
  578. package/src/app/shared/debug/debug.component.d.ts +0 -14
  579. package/src/app/shared/debug/debug.module.d.ts +0 -12
  580. package/src/app/shared/directives/autofocus.directive.d.ts +0 -18
  581. package/src/app/shared/directives/autoresize.directive.d.ts +0 -20
  582. package/src/app/shared/directives/autotitle.directive.d.ts +0 -11
  583. package/src/app/shared/directives/autotooltip.directive.d.ts +0 -14
  584. package/src/app/shared/directives/cell-selection/cell-identifier.directive.d.ts +0 -17
  585. package/src/app/shared/directives/cell-selection/cell-selection.directive.d.ts +0 -29
  586. package/src/app/shared/directives/cell-selection/cell-selection.service.d.ts +0 -67
  587. package/src/app/shared/directives/directives.module.d.ts +0 -15
  588. package/src/app/shared/directives/drag-and-drop.directive.d.ts +0 -17
  589. package/src/app/shared/directives/ng-var.directive.d.ts +0 -12
  590. package/src/app/shared/directives/resizable/resizable.component.d.ts +0 -21
  591. package/src/app/shared/directives/resizable/resizable.directive.d.ts +0 -24
  592. package/src/app/shared/directives/resizable/resizable.module.d.ts +0 -8
  593. package/src/app/shared/directives/throttled-click.directive.d.ts +0 -16
  594. package/src/app/shared/events.d.ts +0 -29
  595. package/src/app/shared/file/csv.utils.d.ts +0 -30
  596. package/src/app/shared/file/file.service.d.ts +0 -23
  597. package/src/app/shared/file/file.utils.d.ts +0 -20
  598. package/src/app/shared/file/images.utils.d.ts +0 -42
  599. package/src/app/shared/file/json.utils.d.ts +0 -19
  600. package/src/app/shared/file/uri.utils.d.ts +0 -8
  601. package/src/app/shared/file/url.utils.d.ts +0 -108
  602. package/src/app/shared/focusable.d.ts +0 -4
  603. package/src/app/shared/form/field.component.d.ts +0 -83
  604. package/src/app/shared/form/field.model.d.ts +0 -88
  605. package/src/app/shared/form/loading-spinner.d.ts +0 -8
  606. package/src/app/shared/forms.d.ts +0 -170
  607. package/src/app/shared/functions.d.ts +0 -325
  608. package/src/app/shared/geolocation/geolocation.utils.d.ts +0 -25
  609. package/src/app/shared/gesture/gesture-config.d.ts +0 -15
  610. package/src/app/shared/gesture/hammer.utils.d.ts +0 -16
  611. package/src/app/shared/graph/colors.utils.d.ts +0 -34
  612. package/src/app/shared/graph/graph-colors.d.ts +0 -63
  613. package/src/app/shared/guard/component-dirty.guard.d.ts +0 -14
  614. package/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.d.ts +0 -8
  615. package/src/app/shared/hotkeys/hotkeys.service.d.ts +0 -48
  616. package/src/app/shared/hotkeys/shared-hotkeys.module.d.ts +0 -11
  617. package/src/app/shared/html.utils.d.ts +0 -17
  618. package/src/app/shared/http/http.utils.d.ts +0 -28
  619. package/src/app/shared/image/gallery/image-gallery.component.d.ts +0 -139
  620. package/src/app/shared/image/gallery/image-gallery.module.d.ts +0 -15
  621. package/src/app/shared/image/gallery/testing/gallegry.model.testing.d.ts +0 -12
  622. package/src/app/shared/image/gallery/testing/gallery.service.testing.d.ts +0 -33
  623. package/src/app/shared/image/gallery/testing/gallery.testing.d.ts +0 -16
  624. package/src/app/shared/image/gallery/testing/gallery.testing.module.d.ts +0 -13
  625. package/src/app/shared/image/image.model.d.ts +0 -7
  626. package/src/app/shared/image/image.module.d.ts +0 -8
  627. package/src/app/shared/image/image.service.d.ts +0 -39
  628. package/src/app/shared/inputs.d.ts +0 -37
  629. package/src/app/shared/interceptors/progess.interceptor.d.ts +0 -8
  630. package/src/app/shared/logging/log-level.model.d.ts +0 -38
  631. package/src/app/shared/logging/logger.model.d.ts +0 -68
  632. package/src/app/shared/logging/logging-service.class.d.ts +0 -39
  633. package/src/app/shared/logging/logging-service.config.d.ts +0 -25
  634. package/src/app/shared/logging/logging-service.module.d.ts +0 -9
  635. package/src/app/shared/markdown/markdown.component.d.ts +0 -86
  636. package/src/app/shared/markdown/markdown.directive.d.ts +0 -13
  637. package/src/app/shared/markdown/markdown.modal.d.ts +0 -49
  638. package/src/app/shared/markdown/markdown.module.d.ts +0 -17
  639. package/src/app/shared/markdown/markdown.service.d.ts +0 -37
  640. package/src/app/shared/markdown/markdown.utils.d.ts +0 -26
  641. package/src/app/shared/markdown/testing/markdown.test.d.ts +0 -18
  642. package/src/app/shared/markdown/testing/markdown.testing.module.d.ts +0 -12
  643. package/src/app/shared/material/autocomplete/material.autocomplete.config.d.ts +0 -74
  644. package/src/app/shared/material/autocomplete/material.autocomplete.d.ts +0 -231
  645. package/src/app/shared/material/autocomplete/material.autocomplete.module.d.ts +0 -23
  646. package/src/app/shared/material/autocomplete/material.autocomplete.utils.d.ts +0 -5
  647. package/src/app/shared/material/autocomplete/testing/autocomplete.test.d.ts +0 -48
  648. package/src/app/shared/material/badge/badge.directive.d.ts +0 -43
  649. package/src/app/shared/material/badge/badge.module.d.ts +0 -10
  650. package/src/app/shared/material/badge/badge.test.d.ts +0 -21
  651. package/src/app/shared/material/boolean/boolean.module.d.ts +0 -21
  652. package/src/app/shared/material/boolean/material.boolean.d.ts +0 -94
  653. package/src/app/shared/material/boolean/testing/boolean.test.page.d.ts +0 -31
  654. package/src/app/shared/material/chips/chips.module.d.ts +0 -22
  655. package/src/app/shared/material/chips/material.chips.d.ts +0 -167
  656. package/src/app/shared/material/chips/testing/chips.test.d.ts +0 -32
  657. package/src/app/shared/material/datetime/datetime.module.d.ts +0 -25
  658. package/src/app/shared/material/datetime/material.date.d.ts +0 -90
  659. package/src/app/shared/material/datetime/material.dateshort.d.ts +0 -89
  660. package/src/app/shared/material/datetime/material.datetime.d.ts +0 -136
  661. package/src/app/shared/material/datetime/testing/mat-date-time.test.d.ts +0 -38
  662. package/src/app/shared/material/datetime/testing/mat-date.test.d.ts +0 -32
  663. package/src/app/shared/material/datetime/testing/mat-dateshort.test.d.ts +0 -31
  664. package/src/app/shared/material/duration/duration.module.d.ts +0 -18
  665. package/src/app/shared/material/duration/duration.utils.d.ts +0 -2
  666. package/src/app/shared/material/duration/material.duration.d.ts +0 -64
  667. package/src/app/shared/material/duration/testing/mat-duration.test.d.ts +0 -23
  668. package/src/app/shared/material/latlong/latlong.utils.d.ts +0 -59
  669. package/src/app/shared/material/latlong/material.latlong-input.d.ts +0 -93
  670. package/src/app/shared/material/latlong/material.latlong.d.ts +0 -90
  671. package/src/app/shared/material/latlong/material.latlong.module.d.ts +0 -21
  672. package/src/app/shared/material/latlong/testing/latlong.test.d.ts +0 -30
  673. package/src/app/shared/material/material.animations.d.ts +0 -8
  674. package/src/app/shared/material/material.config.d.ts +0 -3
  675. package/src/app/shared/material/material.module.d.ts +0 -44
  676. package/src/app/shared/material/material.testing.module.d.ts +0 -31
  677. package/src/app/shared/material/paginator/material.paginator-i18n.d.ts +0 -12
  678. package/src/app/shared/material/stepper/material.stepper-i18n.d.ts +0 -10
  679. package/src/app/shared/material/swipe/material.swipe.d.ts +0 -89
  680. package/src/app/shared/material/swipe/swipe.module.d.ts +0 -16
  681. package/src/app/shared/material/swipe/testing/swipe.test.d.ts +0 -22
  682. package/src/app/shared/material/test/test-component.d.ts +0 -75
  683. package/src/app/shared/material/testing/common.test.d.ts +0 -25
  684. package/src/app/shared/modules.d.ts +0 -9
  685. package/src/app/shared/named-filter/named-filter-selector.component.d.ts +0 -63
  686. package/src/app/shared/named-filter/named-filter.model.d.ts +0 -32
  687. package/src/app/shared/named-filter/named-filter.module.d.ts +0 -13
  688. package/src/app/shared/named-filter/named-filter.service.d.ts +0 -32
  689. package/src/app/shared/named-filter/testing/named-filter-selector.testing.d.ts +0 -34
  690. package/src/app/shared/named-filter/testing/named-filter.testing.module.d.ts +0 -10
  691. package/src/app/shared/observables.d.ts +0 -32
  692. package/src/app/shared/pipes/arrays.pipe.d.ts +0 -93
  693. package/src/app/shared/pipes/badge.pipes.d.ts +0 -7
  694. package/src/app/shared/pipes/colors.pipe.d.ts +0 -9
  695. package/src/app/shared/pipes/date-diff-duration.pipe.d.ts +0 -25
  696. package/src/app/shared/pipes/date-format.pipe.d.ts +0 -35
  697. package/src/app/shared/pipes/date-from-now.pipe.d.ts +0 -14
  698. package/src/app/shared/pipes/date-from.pipe.d.ts +0 -14
  699. package/src/app/shared/pipes/dates.pipe.d.ts +0 -10
  700. package/src/app/shared/pipes/display-with.pipe.d.ts +0 -8
  701. package/src/app/shared/pipes/duration.pipe.d.ts +0 -23
  702. package/src/app/shared/pipes/file-size.pipe.d.ts +0 -30
  703. package/src/app/shared/pipes/form.pipes.d.ts +0 -84
  704. package/src/app/shared/pipes/highlight.pipe.d.ts +0 -11
  705. package/src/app/shared/pipes/html.pipes.d.ts +0 -50
  706. package/src/app/shared/pipes/latlong-format.pipe.d.ts +0 -20
  707. package/src/app/shared/pipes/maps.pipe.d.ts +0 -23
  708. package/src/app/shared/pipes/maskito.pipe.d.ts +0 -14
  709. package/src/app/shared/pipes/math.pipes.d.ts +0 -26
  710. package/src/app/shared/pipes/ng-init.pipe.d.ts +0 -8
  711. package/src/app/shared/pipes/number-format.pipe.d.ts +0 -9
  712. package/src/app/shared/pipes/observable.pipes.d.ts +0 -25
  713. package/src/app/shared/pipes/pipes.module.d.ts +0 -36
  714. package/src/app/shared/pipes/property.pipes.d.ts +0 -46
  715. package/src/app/shared/pipes/selection.pipes.d.ts +0 -62
  716. package/src/app/shared/pipes/string.pipes.d.ts +0 -72
  717. package/src/app/shared/pipes/translate-context.pipe.d.ts +0 -17
  718. package/src/app/shared/pipes/types.pipes.d.ts +0 -30
  719. package/src/app/shared/pipes/url.pipes.d.ts +0 -27
  720. package/src/app/shared/platforms.d.ts +0 -16
  721. package/src/app/shared/print/print.service.d.ts +0 -94
  722. package/src/app/shared/regexps.d.ts +0 -32
  723. package/src/app/shared/rx-state/rx-state.decorators.d.ts +0 -33
  724. package/src/app/shared/rx-state/rx-state.module.d.ts +0 -10
  725. package/src/app/shared/rx-state/rx-state.types.d.ts +0 -5
  726. package/src/app/shared/services/entity-service.class.d.ts +0 -117
  727. package/src/app/shared/services/job.utils.d.ts +0 -20
  728. package/src/app/shared/services/memory-entity-service.class.d.ts +0 -87
  729. package/src/app/shared/services/progress-bar.service.d.ts +0 -20
  730. package/src/app/shared/services/startable-observable-service.class.d.ts +0 -51
  731. package/src/app/shared/services/startable-service.class.d.ts +0 -38
  732. package/src/app/shared/services/translate-context.service.d.ts +0 -29
  733. package/src/app/shared/services/validator-service.class.d.ts +0 -11
  734. package/src/app/shared/services.d.ts +0 -17
  735. package/src/app/shared/shared-routing.module.d.ts +0 -23
  736. package/src/app/shared/shared.module.d.ts +0 -33
  737. package/src/app/shared/shared.testing.module.d.ts +0 -20
  738. package/src/app/shared/storage/storage-explorer.component.d.ts +0 -60
  739. package/src/app/shared/storage/storage-explorer.module.d.ts +0 -13
  740. package/src/app/shared/storage/storage-explorer.testing-routing.module.d.ts +0 -9
  741. package/src/app/shared/storage/storage-explorer.testing.module.d.ts +0 -10
  742. package/src/app/shared/storage/storage.service.d.ts +0 -22
  743. package/src/app/shared/storage/storage.utils.d.ts +0 -19
  744. package/src/app/shared/testing/maskito.test.d.ts +0 -10
  745. package/src/app/shared/testing/observable.test.d.ts +0 -25
  746. package/src/app/shared/testing/tests.page.d.ts +0 -20
  747. package/src/app/shared/toast/toast.testing.d.ts +0 -15
  748. package/src/app/shared/toast/toast.testing.module.d.ts +0 -12
  749. package/src/app/shared/toast/toasts.d.ts +0 -16
  750. package/src/app/shared/toolbar/modal-toolbar.d.ts +0 -21
  751. package/src/app/shared/toolbar/toolbar.d.ts +0 -72
  752. package/src/app/shared/toolbar/toolbar.module.d.ts +0 -16
  753. package/src/app/shared/types.d.ts +0 -45
  754. package/src/app/shared/upload-file/testing/upload-file.testing.d.ts +0 -21
  755. package/src/app/shared/upload-file/testing/upload-file.testing.module.d.ts +0 -11
  756. package/src/app/shared/upload-file/upload-file-popover.component.d.ts +0 -49
  757. package/src/app/shared/upload-file/upload-file.component.d.ts +0 -50
  758. package/src/app/shared/upload-file/upload-file.model.d.ts +0 -30
  759. package/src/app/shared/validator/form-error-adapter.class.d.ts +0 -33
  760. package/src/app/shared/validator/validators.d.ts +0 -145
  761. package/src/app/shared/version/versions.d.ts +0 -14
  762. package/src/app/social/config/social.config.d.ts +0 -4
  763. package/src/app/social/feed/feed.component.d.ts +0 -91
  764. package/src/app/social/feed/feed.directive.d.ts +0 -32
  765. package/src/app/social/feed/feed.model.d.ts +0 -69
  766. package/src/app/social/feed/feed.module.d.ts +0 -13
  767. package/src/app/social/feed/feed.page.d.ts +0 -24
  768. package/src/app/social/feed/feed.service.d.ts +0 -85
  769. package/src/app/social/feed/testing/feed.testing.d.ts +0 -23
  770. package/src/app/social/feed/testing/feed.testing.module.d.ts +0 -12
  771. package/src/app/social/job/job.module.d.ts +0 -12
  772. package/src/app/social/job/progression/job-progression.component.d.ts +0 -24
  773. package/src/app/social/job/progression/job-progression.icon.d.ts +0 -63
  774. package/src/app/social/job/progression/job-progression.list.d.ts +0 -20
  775. package/src/app/social/job/progression/job-progression.model.d.ts +0 -10
  776. package/src/app/social/job/progression/job-progression.service.d.ts +0 -33
  777. package/src/app/social/job/testing/job-progression.testing.d.ts +0 -13
  778. package/src/app/social/job/testing/job-progression.testing.service.d.ts +0 -9
  779. package/src/app/social/job/testing/job.testing.module.d.ts +0 -11
  780. package/src/app/social/message/message.form.d.ts +0 -36
  781. package/src/app/social/message/message.modal.d.ts +0 -47
  782. package/src/app/social/message/message.model.d.ts +0 -36
  783. package/src/app/social/message/message.module.d.ts +0 -14
  784. package/src/app/social/message/message.service.d.ts +0 -44
  785. package/src/app/social/social.errors.d.ts +0 -10
  786. package/src/app/social/social.module.d.ts +0 -20
  787. package/src/app/social/social.testing.module.d.ts +0 -14
  788. package/src/app/social/user-event/notification/user-event-notification.icon.d.ts +0 -47
  789. package/src/app/social/user-event/notification/user-event-notification.list.d.ts +0 -77
  790. package/src/app/social/user-event/notification/user-event-notification.modal.d.ts +0 -37
  791. package/src/app/social/user-event/testing/user-event.testing.d.ts +0 -44
  792. package/src/app/social/user-event/testing/user-event.testing.model.d.ts +0 -42
  793. package/src/app/social/user-event/testing/user-event.testing.module.d.ts +0 -11
  794. package/src/app/social/user-event/testing/user-event.testing.service.d.ts +0 -41
  795. package/src/app/social/user-event/user-event.model.d.ts +0 -44
  796. package/src/app/social/user-event/user-event.module.d.ts +0 -14
  797. package/src/app/social/user-event/user-event.service.d.ts +0 -124
  798. package/src/environments/environment.class.d.ts +0 -86
  799. package/src/environments/environment.d.ts +0 -2
  800. package/src/environments/environment.loader.d.ts +0 -24
  801. package/src/theme/_globals.scss +0 -5
@@ -1,788 +0,0 @@
1
- import { Inject, Injectable, Optional } from '@angular/core';
2
- import { isNilOrBlank, isNotNil, isNotNilOrBlank, toBoolean } from '../../shared/functions';
3
- import { Toasts } from '../../shared/toast/toasts';
4
- import { BehaviorSubject, combineLatest, from, Observable, of, Subscription, timer } from 'rxjs';
5
- import { catchError, skip, tap } from 'rxjs/operators';
6
- import { ENVIRONMENT } from '../../../environments/environment.class';
7
- import { CORE_CONFIG_OPTIONS } from './config/core.config';
8
- import { NotificationVisibility } from '@awesome-cordova-plugins/downloader/ngx';
9
- import { StartableService } from '../../shared/services/startable-service.class';
10
- import { isMobile, isWindows } from '../../shared/platforms';
11
- import { VersionUtils } from '../../shared/version/versions';
12
- import { FilesUtils, MimeTypes } from '../../shared/file/file.utils';
13
- import { UriUtils } from '../../shared/file/uri.utils';
14
- import { SplashScreen } from '@capacitor/splash-screen';
15
- import { StatusBar, Style } from '@capacitor/status-bar';
16
- import { Browser } from '@capacitor/browser';
17
- import { Keyboard } from '@capacitor/keyboard';
18
- import { CapacitorPlugins } from '../../shared/capacitor/plugins';
19
- import { locale as momentLocale } from 'moment';
20
- import { APP_LOGGING_SERVICE } from '../../shared/logging/logging-service.class';
21
- import { Clipboard } from '@capacitor/clipboard';
22
- import { EdgeToEdge } from '@capawesome/capacitor-android-edge-to-edge-support';
23
- import { getColorContrast, getColorShade, getColorTint, hexToRgbArray, isLightColor, mixHex } from '../../shared/graph/colors.utils';
24
- import { Peer } from './model/peer.model';
25
- import { UrlUtils } from '../../shared/file/url.utils';
26
- import { APP_BASE_HREF } from '@angular/common';
27
- import * as i0 from "@angular/core";
28
- import * as i1 from "@ionic/angular";
29
- import * as i2 from "@angular/cdk/platform";
30
- import * as i3 from "@angular/cdk/clipboard";
31
- import * as i4 from "@ngx-translate/core";
32
- import * as i5 from "@angular/material-moment-adapter";
33
- import * as i6 from "./storage/entities-storage.service";
34
- import * as i7 from "./local-settings.service";
35
- import * as i8 from "./network.service";
36
- import * as i9 from "./account.service";
37
- import * as i10 from "./config.service";
38
- import * as i11 from "ionic-cache";
39
- import * as i12 from "../../shared/audio/audio";
40
- import * as i13 from "@awesome-cordova-plugins/downloader/ngx";
41
- import * as i14 from "../../../environments/environment.class";
42
- export const AndroidOsEnvironment = Object.freeze({
43
- DIRECTORY_DOWNLOADS: 'Download',
44
- DIRECTORY_DOWNLOADS_OLD: 'Downloads', // Old name, for older Android version
45
- // TODO: find value for this. See https://developer.android.com/reference/android/os/Environment#getExternalStorageState(java.io.File)
46
- // DIRECTORY_MUSIC,
47
- // DIRECTORY_PODCASTS,
48
- // DIRECTORY_RINGTONES,
49
- // DIRECTORY_ALARMS,
50
- // DIRECTORY_NOTIFICATIONS,
51
- // DIRECTORY_PICTURES,
52
- // DIRECTORY_MOVIES,
53
- // DIRECTORY_DCIM,
54
- // DIRECTORY_DOCUMENTS,
55
- // DIRECTORY_AUDIOBOOKS,
56
- });
57
- export class PlatformService extends StartableService {
58
- ionicPlatform;
59
- cdkPlatform;
60
- cdkClipboard;
61
- toastController;
62
- translate;
63
- dateAdapter;
64
- entitiesStorage;
65
- settings;
66
- networkService;
67
- accountService;
68
- configService;
69
- cache;
70
- audioProvider;
71
- environment;
72
- downloader;
73
- appBaseHref;
74
- _logger;
75
- _mobile;
76
- _desktop;
77
- _cordova;
78
- _capacitor;
79
- _android;
80
- _ios;
81
- busySubject = new BehaviorSubject(false);
82
- constructor(ionicPlatform, cdkPlatform, cdkClipboard, toastController, translate, dateAdapter, entitiesStorage, settings, networkService, accountService, configService, cache, audioProvider, environment, loggingService, downloader, appBaseHref) {
83
- super(ionicPlatform);
84
- this.ionicPlatform = ionicPlatform;
85
- this.cdkPlatform = cdkPlatform;
86
- this.cdkClipboard = cdkClipboard;
87
- this.toastController = toastController;
88
- this.translate = translate;
89
- this.dateAdapter = dateAdapter;
90
- this.entitiesStorage = entitiesStorage;
91
- this.settings = settings;
92
- this.networkService = networkService;
93
- this.accountService = accountService;
94
- this.configService = configService;
95
- this.cache = cache;
96
- this.audioProvider = audioProvider;
97
- this.environment = environment;
98
- this.downloader = downloader;
99
- this.appBaseHref = appBaseHref;
100
- this._logger = loggingService?.getLogger('platform');
101
- this._debug = !environment.production;
102
- if (this._debug)
103
- console.debug('[platform] Creating service');
104
- if (this._logger) {
105
- this._logger.debug('ctor', 'Creating service');
106
- ionicPlatform.pause.subscribe(() => {
107
- this._logger.info('ctor', 'Pause app');
108
- });
109
- ionicPlatform.resume.subscribe(() => {
110
- this._logger.info('ctor', 'Resume app');
111
- });
112
- }
113
- }
114
- _downloadingJobs = new Map();
115
- checkAppVersionTimer;
116
- is(platformName) {
117
- switch (platformName) {
118
- case 'mobile':
119
- // Exclude Windows touch screens - see sumaris-app issues #323 and #346
120
- return isMobile(window);
121
- case 'mobileweb':
122
- // Exclude Windows touch screens - see sumaris-app issues #323 and #346
123
- return this.ionicPlatform.is(platformName) && !isWindows(window);
124
- default:
125
- return this.ionicPlatform.is(platformName);
126
- }
127
- }
128
- get mobile() {
129
- return isNotNil(this._mobile) ? this._mobile : this.is('mobile');
130
- }
131
- /**
132
- * Say if opened has been opened inside an Android or iOs App.
133
- * This is used to known if there is cordova features
134
- */
135
- isCapacitor() {
136
- return this._capacitor;
137
- }
138
- /**
139
- * Say if opened has been opened inside an Android or iOs App.
140
- * This is used to known if there is cordova features
141
- */
142
- isCordova() {
143
- return this._cordova;
144
- }
145
- isAndroidCordova() {
146
- return (this._android && this._cordova) || false;
147
- }
148
- isIOSCordova() {
149
- return (this._ios && this._cordova) || false;
150
- }
151
- isAndroid() {
152
- return this._android || false;
153
- }
154
- isIOS() {
155
- return this._ios || false;
156
- }
157
- isMacOSDesktop() {
158
- return this._desktop && this.isCordova();
159
- }
160
- /**
161
- * Is a native App (and NOT a mobile web)
162
- */
163
- isApp() {
164
- return this.isAndroidCordova() || this.isIOSCordova();
165
- }
166
- isWeb() {
167
- return !this.isApp();
168
- }
169
- isMobileWeb() {
170
- return this.mobile && this.isWeb();
171
- }
172
- get canDownload() {
173
- return this.downloader && this.isAndroidCordova();
174
- }
175
- get canOpenFile() {
176
- return false; // TODO: fixme using @capacitor/filesystem ?
177
- }
178
- width() {
179
- return this.ionicPlatform.width();
180
- }
181
- height() {
182
- return this.ionicPlatform.height();
183
- }
184
- async ngOnStart() {
185
- const now = Date.now();
186
- this.accountService.tokenType = undefined;
187
- console.debug('[platform] Starting platform...');
188
- this._logger?.info('ngOnStart', 'Starting platform...');
189
- try {
190
- this._mobile = this.is('mobile');
191
- this._desktop = this.is('desktop');
192
- this._cordova = this.is('cordova');
193
- this._capacitor = this.is('capacitor');
194
- this._android = this.is('android');
195
- this._ios = this.is('ios');
196
- const logMessage = `Detected {mobile: ${this._mobile}, desktop: ${this._desktop}, cordova: ${this._cordova}, capacitor: ${this._capacitor}, android: ${this._android}, ios: ${this._ios}}`;
197
- console.info('[platform] ' + logMessage);
198
- this._logger?.info('ngOnStart', logMessage);
199
- // Configure theme
200
- await this.configureTheme(this._mobile);
201
- // Configure Capacitor plugins
202
- await this.configureCapacitorPlugins();
203
- // Configure translation
204
- this.configureTranslate();
205
- // Configure cache
206
- this.configureCache();
207
- // Start root services
208
- await Promise.all([this.entitiesStorage.ready(), this.settings.ready(), this.networkService.ready(), this.audioProvider.ready()]);
209
- // Check if web app has update, and reload page if need
210
- if (this.isWeb() && this.environment.production) {
211
- await this.checkAppVersion({ canReload: true });
212
- }
213
- // Update cache configuration when network changed
214
- this.registerSubscription(this.networkService.onNetworkStatusChanges
215
- .pipe(skip(1) // Already done once, so we skip the first event
216
- )
217
- .subscribe((type) => this.configureCache(type !== 'none')));
218
- console.info(`[platform] Starting platform [OK] {mobile: ${this._mobile}, capacitor: ${this._capacitor}, web: ${this.isWeb()}, downloader: ${this.canDownload}} in ${Date.now() - now}ms`);
219
- // Pass auth token
220
- this.registerSubscription(this.configService.config.subscribe((config) => {
221
- if (!config)
222
- return; // Skip
223
- // Update authentication type
224
- const tokenType = config.getProperty(CORE_CONFIG_OPTIONS.AUTH_TOKEN_TYPE);
225
- if (isNotNilOrBlank(tokenType) && this.accountService.tokenType !== tokenType) {
226
- console.info(`[platform] Using auth token type {${tokenType}}`);
227
- this.accountService.tokenType = tokenType;
228
- }
229
- // Enable auth API using tokens
230
- const authApiEnabled = config.getPropertyAsBoolean(CORE_CONFIG_OPTIONS.AUTH_API_TOKEN_ENABLED);
231
- if (isNotNil(authApiEnabled) && authApiEnabled !== this.accountService.apiTokenEnabled) {
232
- console.info(`[platform] Using auth API tokens ? ${authApiEnabled}}`);
233
- this.accountService.apiTokenEnabled = authApiEnabled;
234
- }
235
- }));
236
- // Hide the splashscreen (if mobile or macOS) - after 1s
237
- if (this._mobile || this.isMacOSDesktop()) {
238
- setTimeout(async () => {
239
- await SplashScreen.hide();
240
- // Play startup sound (is mobile)
241
- if (this._mobile) {
242
- await this.audioProvider.playStartupSound();
243
- }
244
- }, 1000);
245
- }
246
- // Check if new version, every 1 min
247
- const checkIntervalMs = (this.environment.checkAppVersionIntervalInSeconds || 0) * 1000;
248
- if (this.isWeb() && this.environment.production && checkIntervalMs > 0) {
249
- this.checkAppVersionTimer?.unsubscribe();
250
- const subscription = timer(checkIntervalMs, checkIntervalMs).subscribe((_) => this.checkAppVersion({ silent: true, canReload: false /*do NOT auto reload, when app is started*/ }));
251
- this.checkAppVersionTimer = subscription;
252
- this.registerSubscription(subscription);
253
- subscription.add(() => this.unregisterSubscription(subscription));
254
- }
255
- }
256
- catch (err) {
257
- // Manage startup error
258
- return this.onStartupError(err);
259
- }
260
- }
261
- /**
262
- * Used to show a backdrop when platform is busy (e.g. from the app.component.ts)
263
- */
264
- markAsBusy() {
265
- if (!this.busySubject.value) {
266
- this.busySubject.next(true);
267
- }
268
- }
269
- markAsNotBusy() {
270
- if (this.busySubject.value) {
271
- this.busySubject.next(false);
272
- }
273
- }
274
- async open(url, opts) {
275
- console.info(`[platform] Opening link: ${url}`);
276
- if (this._mobile && this._capacitor) {
277
- await Browser.open({ url, ...opts });
278
- }
279
- else {
280
- window.open(url, opts?.windowName);
281
- }
282
- }
283
- getDownloadingJob(uri) {
284
- return this._downloadingJobs.get(uri);
285
- }
286
- download(request) {
287
- if (!request || !request.uri)
288
- throw new Error("Missing argument 'request' or 'request.uri'");
289
- if (this.canDownload) {
290
- // Check if not already downloading file
291
- let job$ = this._downloadingJobs.get(request.uri);
292
- if (job$)
293
- return job$;
294
- // Compute subPath (final filename)
295
- let subPath = request.destinationInExternalPublicDir?.subPath ||
296
- request.destinationInExternalFilesDir?.subPath ||
297
- request.filename ||
298
- UriUtils.getFilename(request.uri) ||
299
- request.title ||
300
- 'download';
301
- subPath = subPath
302
- .toLowerCase()
303
- // Remove spaces
304
- .replace(/\s+/g, '-');
305
- // Force APK to finish with '.apk'
306
- if (request.mimeType === MimeTypes.ANDROID_APK && !subPath.toLowerCase().endsWith('.apk')) {
307
- subPath += '.apk';
308
- }
309
- const downloadRequest = {
310
- visibleInDownloadsUi: true,
311
- notificationVisibility: NotificationVisibility.VisibleNotifyCompleted,
312
- ...request,
313
- filename: undefined, // Force unset
314
- destinationInExternalPublicDir: !request.destinationInExternalFilesDir
315
- ? {
316
- dirType: AndroidOsEnvironment.DIRECTORY_DOWNLOADS,
317
- ...request.destinationInExternalPublicDir,
318
- subPath,
319
- }
320
- : undefined,
321
- destinationInExternalFilesDir: request.destinationInExternalFilesDir
322
- ? {
323
- dirType: AndroidOsEnvironment.DIRECTORY_DOWNLOADS,
324
- ...request.destinationInExternalFilesDir,
325
- subPath,
326
- }
327
- : undefined,
328
- };
329
- // Start download
330
- console.debug('[platform] Downloading, using request: ' + JSON.stringify(downloadRequest));
331
- job$ = from(this.downloader.download(downloadRequest));
332
- // Remember this request uri
333
- this._downloadingJobs.set(downloadRequest.uri, job$);
334
- return job$.pipe(tap((location) => {
335
- console.info('[platform] File successfully downloaded at:' + location);
336
- // Forget job
337
- this._downloadingJobs.delete(downloadRequest.uri);
338
- return location;
339
- }), catchError((err) => {
340
- console.error('[platform] Unable to download: ' + ((err && err.message) || err));
341
- // Forget the request
342
- this._downloadingJobs.delete(downloadRequest.uri);
343
- // Retry with another location - issue in older Android version
344
- if (downloadRequest.destinationInExternalPublicDir?.dirType === AndroidOsEnvironment.DIRECTORY_DOWNLOADS) {
345
- downloadRequest.destinationInExternalPublicDir.dirType = AndroidOsEnvironment.DIRECTORY_DOWNLOADS_OLD;
346
- return this.download(downloadRequest);
347
- }
348
- throw err;
349
- }));
350
- }
351
- // Fallback (if not Android and Capacitor): opening the URI
352
- // TODO: find a way to download under iOS (see https://www.c-sharpcorner.com/article/how-to-download-a-file-using-file-transfer-plugin-in-ionic-3/)
353
- else {
354
- FilesUtils.downloadUri(request.uri, request.filename);
355
- return of(undefined);
356
- }
357
- }
358
- async copyToClipboard(data, opts) {
359
- const value = typeof data === 'string' ? data : data.string;
360
- let copied = true;
361
- if (this.isAndroidCordova()) {
362
- const writeOptions = typeof data === 'string' ? { string: value } : data;
363
- await Clipboard.write(writeOptions);
364
- }
365
- else {
366
- copied = this.cdkClipboard.copy(value);
367
- }
368
- if (copied) {
369
- // Show toast
370
- if (opts && isNotNilOrBlank(opts.message)) {
371
- await Toasts.show(this.toastController, this.translate, {
372
- type: 'info',
373
- ...opts,
374
- });
375
- }
376
- }
377
- else {
378
- console.error('[platform] Unable to copy to clipboard: ' + data);
379
- }
380
- }
381
- async updateTheme(options) {
382
- if (!options)
383
- return;
384
- const style = document.documentElement.style;
385
- // options.colors = {
386
- // ...options.colors,
387
- // primary: '#124541',
388
- // };
389
- // Set colors
390
- if (options.colors) {
391
- console.info('[platform] Changing theme colors ', options.colors);
392
- // Add 100 & 900 color for primary and secondary color
393
- ['primary', 'secondary'].forEach((colorName) => {
394
- const color = options.colors[colorName];
395
- options.colors[colorName + '100'] = (color && mixHex('#ffffff', color, 10)) || undefined;
396
- options.colors[colorName + '900'] = (color && mixHex('#000000', color, 12)) || undefined;
397
- });
398
- Object.getOwnPropertyNames(options.colors).forEach((colorName) => {
399
- // Remove existing value
400
- style.removeProperty(`--ion-color-${colorName}`);
401
- style.removeProperty(`--ion-color-${colorName}-rgb`);
402
- style.removeProperty(`--ion-color-${colorName}-contrast`);
403
- style.removeProperty(`--ion-color-${colorName}-contrast-rgb`);
404
- style.removeProperty(`--ion-color-${colorName}-shade`);
405
- style.removeProperty(`--ion-color-${colorName}-tint`);
406
- // Set new value, if any
407
- const color = options.colors[colorName];
408
- if (isNotNilOrBlank(color)) {
409
- // Base color
410
- style.setProperty(`--ion-color-${colorName}`, color);
411
- style.setProperty(`--ion-color-${colorName}-rgb`, hexToRgbArray(color).join(', '));
412
- // Contrast color
413
- const contrastColor = getColorContrast(color, true);
414
- style.setProperty(`--ion-color-${colorName}-contrast`, contrastColor);
415
- style.setProperty(`--ion-color-${colorName}-contrast-rgb`, hexToRgbArray(contrastColor).join(', '));
416
- // Shade color
417
- style.setProperty(`--ion-color-${colorName}-shade`, getColorShade(color));
418
- // Tint color
419
- style.setProperty(`--ion-color-${colorName}-tint`, getColorTint(color));
420
- }
421
- });
422
- }
423
- // Set CSS vars
424
- if (options.vars) {
425
- console.info('[platform] Changing theme vars ', options.vars);
426
- Object.getOwnPropertyNames(options.vars).forEach((varName) => {
427
- // Set new value, if any
428
- const value = options.vars[varName];
429
- if (isNotNilOrBlank(value)) {
430
- style.setProperty(varName, value);
431
- }
432
- else {
433
- style.removeProperty(varName);
434
- }
435
- });
436
- }
437
- // Set dark mode
438
- if (isNotNil(options.darkMode)) {
439
- await this.toggleDarkTheme(options.darkMode);
440
- }
441
- }
442
- async toggleDarkTheme(enable) {
443
- const classList = document.documentElement.classList;
444
- // Toggle the class
445
- const wasEnabled = classList.contains('dark');
446
- if (enable !== wasEnabled) {
447
- console.debug(`[platform] ${enable ? 'Enable' : 'Disable'} dark mode...`);
448
- classList.toggle('dark', enable);
449
- // If mobile (Android or iOS)
450
- if (this.isApp() && (this.isIOS() || this.isAndroid())) {
451
- // Read the primary color, if any
452
- const style = getComputedStyle(document.documentElement);
453
- const primaryColor = style.getPropertyValue('--ion-color-primary')?.trim();
454
- const backgroundColor = !primaryColor || enable ? '#000000' : primaryColor;
455
- // Configure status bar style
456
- const statusBarStyle = isLightColor(backgroundColor) ? Style.Light : Style.Dark;
457
- console.debug(`[platform] StatusBar icons style: ${statusBarStyle} ...`);
458
- try {
459
- await StatusBar.setStyle({ style: statusBarStyle });
460
- }
461
- catch (err) {
462
- console.error('[platform] Error while setting StatusBar icons style', err);
463
- }
464
- // Configure status bar background color (always use black on dark mode)
465
- if (this.isAndroid()) {
466
- try {
467
- console.debug(`[platform] EdgeToEdge background color: ${backgroundColor}`);
468
- await EdgeToEdge.setBackgroundColor({ color: backgroundColor });
469
- }
470
- catch (err) {
471
- console.error('[platform] Error while setting EdgeToEdge background color', err);
472
- await StatusBar.setBackgroundColor({ color: backgroundColor });
473
- }
474
- }
475
- else {
476
- try {
477
- console.debug(`[platform] StatusBar background color: ${backgroundColor}`);
478
- await StatusBar.setBackgroundColor({ color: backgroundColor });
479
- }
480
- catch (err) {
481
- console.error('[platform] Error while setting StatusBar background color', err);
482
- }
483
- }
484
- }
485
- }
486
- }
487
- toggleHighContrast(enable) {
488
- if (enable && !document.documentElement.classList.contains('high-contrast')) {
489
- console.debug('[platform] Enable high contrast...');
490
- }
491
- document.documentElement.classList.toggle('high-contrast', enable);
492
- }
493
- /**
494
- * Handle deep links (Android App Links / iOS Universal Links)
495
- */
496
- async addDeepLinkListener(listenerFn) {
497
- if (!this.isApp() || typeof listenerFn !== 'function')
498
- return; // Skip
499
- // Handle deep links (Android App Links / iOS Universal Links)
500
- try {
501
- console.info('[platform] Start listen deep links');
502
- const { App } = await import('@capacitor/app');
503
- const listener = await App.addListener('appUrlOpen', (data) => {
504
- try {
505
- console.info(`[platform] Processing deep link: ${data?.url}`);
506
- const url = new URL(data?.url || '');
507
- // Get the peer
508
- const peer = Peer.parseUrl(url);
509
- peer.path = undefined; // FIXME We clean the path (=baseHref) as we cannot detect it from a deep link
510
- // Build an absolute path from the URL pathname and search
511
- const path = UrlUtils.addTrailingSlash(UrlUtils.cleanUrl(url.pathname || '/'));
512
- const query = url.search || '';
513
- const fullPath = `${path}${query}`;
514
- console.info(`[platform] Processing deep link [OK] - peer: ${peer.url} path: ${fullPath}`);
515
- // Call the given listener
516
- listenerFn({ peerUrl: peer.url, path: fullPath });
517
- }
518
- catch (e) {
519
- console.warn('[platform] Failed to handle deep link', e, data);
520
- }
521
- });
522
- let subscription = new Subscription();
523
- subscription.add(() => {
524
- console.info('[platform] Stop listen deep links');
525
- listener.remove();
526
- this.unregisterSubscription(subscription);
527
- subscription = null; // Forget the subscription
528
- });
529
- this.registerSubscription(subscription);
530
- return subscription;
531
- }
532
- catch (err) {
533
- console.warn('[platform] Capacitor App plugin not available for deep links', err);
534
- }
535
- }
536
- showToast(opts) {
537
- if (!this.toastController)
538
- throw new Error("Missing toastController in component's constructor");
539
- return new Promise((resolve) => Toasts.show(this.toastController, this.translate, {
540
- ...opts,
541
- onWillPresent: (t) => resolve(t),
542
- }));
543
- }
544
- async closeToast(id) {
545
- return this.toastController?.dismiss(null, null, id);
546
- }
547
- /* -- protected methods -- */
548
- async configureTheme(mobile, win = window) {
549
- // Listen for changes to settings dark mode
550
- if (this.environment.allowDarkMode) {
551
- const isScreen$ = new Observable((observer) => {
552
- const matchMedia = win.matchMedia('screen');
553
- matchMedia.addEventListener('change', (e) => observer.next(e.matches));
554
- observer.next(matchMedia.matches);
555
- });
556
- this.registerSubscription(combineLatest([isScreen$, this.settings.darkMode$]).subscribe(([isScreen, enable]) => this.toggleDarkTheme(isScreen && enable)));
557
- }
558
- else {
559
- await this.toggleDarkTheme(false);
560
- }
561
- // Workaround, for MS Windows touch screen (detected as mobile, but forced as desktop)
562
- if (!mobile &&
563
- (win.document.documentElement?.classList.contains('plt-mobile') || win.document.documentElement.classList?.contains('plt-mobileweb'))) {
564
- console.warn('[platform] Force class list to: <html class="plt-desktop">. Workaround for Windows touch screen.');
565
- win.document.documentElement.classList.remove('plt-mobile', 'plt-mobileweb');
566
- win.document.documentElement.classList.add('plt-desktop');
567
- }
568
- }
569
- async configureCapacitorPlugins() {
570
- if (!this._capacitor)
571
- return; // Skip
572
- console.info('[platform] Configuring Capacitor plugins...');
573
- let pluginName;
574
- try {
575
- pluginName = CapacitorPlugins.EdgeToEdge;
576
- if (this.isApp() && this.isAndroid()) {
577
- await EdgeToEdge.enable();
578
- }
579
- pluginName = CapacitorPlugins.StatusBar;
580
- if (this.isApp()) {
581
- // Avoid overlays (Android 15 or iOS)
582
- await StatusBar.setOverlaysWebView({ overlay: false });
583
- }
584
- // Hide accessory bar (iOS only)
585
- if (this.isApp() && this.isIOS()) {
586
- pluginName = CapacitorPlugins.Keyboard;
587
- await Keyboard.setAccessoryBarVisible({ isVisible: false });
588
- }
589
- }
590
- catch (err) {
591
- const logMessage = `Error while configuring ${pluginName} plugin: ${err.message || err}\n${err?.originalStack || JSON.stringify(err)}`;
592
- console.error('[platform] ' + logMessage);
593
- this._logger?.error('configureCapacitorPlugins', logMessage);
594
- }
595
- }
596
- configureTranslate() {
597
- console.info('[platform] Configuring i18n ...');
598
- // this language will be used as a fallback when a translation isn't found in the current language
599
- this.translate.setDefaultLang(this.environment.defaultLocale);
600
- // apply locale immediately
601
- this.applyLocale(this.environment.defaultLocale);
602
- // When locale changes, apply to date adapter
603
- this.registerSubscription(this.translate.onLangChange.subscribe((event) => {
604
- if (event && event.lang) {
605
- this.applyLocale(event.lang);
606
- }
607
- }));
608
- this.registerSubscription(this.settings.onChange.subscribe((data) => {
609
- if (data) {
610
- // Apply locale
611
- if (data.locale) {
612
- if (data.locale !== this.translate.currentLang) {
613
- this.translate.use(data.locale);
614
- }
615
- }
616
- else {
617
- // Applying default, when settings has no locale property (hotfix - ludovic.pecquot@e-is.pro - 14/11/2021 - since v1.20.42)
618
- console.warn('[platform] No locale found in settings: applying defaultLocale: ', this.environment.defaultLocale);
619
- this.translate.use(this.environment.defaultLocale);
620
- }
621
- }
622
- }));
623
- // Use account's settings, (like locale), when account inheritance enabled
624
- this.registerSubscription(this.accountService.onLogin.subscribe(async (account) => {
625
- if (account.settings && this.settings.settings.accountInheritance) {
626
- console.debug('[platform] Copying account settings into local settings...');
627
- await this.settings.apply(account.settings.asLocalSettings());
628
- }
629
- }));
630
- }
631
- applyLocale(locale) {
632
- // force 'en' as 'en_GB'
633
- if (locale === 'en') {
634
- locale = 'en_GB';
635
- }
636
- // config moment lib
637
- try {
638
- momentLocale(locale);
639
- console.debug('[platform] Use locale {' + locale + '}');
640
- }
641
- catch (err) {
642
- // If error, fallback to en
643
- momentLocale('en');
644
- console.warn('[platform] Unknown locale for moment lib. Using default [en]');
645
- }
646
- // Config date adapter
647
- this.dateAdapter.setLocale(momentLocale());
648
- }
649
- configureCache(online) {
650
- online = toBoolean(online, this.cache.isOnline());
651
- const cacheTTL = online ? 3600 /* 1h */ : 3600 * 24 * 30; /* 1 month */
652
- console.info(`[platform] Configuring cache [OK] {online: ${online}, timeToLive: ${cacheTTL / 3600}h, offlineInvalidate: false}`);
653
- this.cache.setDefaultTTL(cacheTTL);
654
- this.cache.setOfflineInvalidate(false); // Do not invalidate cache when offline
655
- }
656
- async checkAppVersion(opts) {
657
- if (this.networkService.offline || !this.isWeb())
658
- return; // Skip
659
- const silent = opts?.silent === true;
660
- const production = this.environment.production;
661
- const canAutoReload = !opts || opts.canReload !== false;
662
- if (!silent)
663
- console.info('[platform] Checking remote app version...');
664
- const actualVersion = this.environment.version;
665
- if (isNilOrBlank(actualVersion)) {
666
- console.error("[platform] Missing required value for 'environment.version'. Cannot check remote app version.");
667
- this.checkAppVersionTimer?.unsubscribe(); // Stop timer if exists
668
- return; // Skip
669
- }
670
- const remoteVersion = (await this.networkService.getAppVersion(this.appBaseHref)).trim();
671
- if (isNilOrBlank(remoteVersion)) {
672
- if (production && !silent)
673
- console.error('[platform] Cannot load remote app version. Skipping version check');
674
- this.checkAppVersionTimer?.unsubscribe(); // Stop timer if exists
675
- return;
676
- }
677
- if (VersionUtils.isCompatible(remoteVersion, actualVersion)) {
678
- if (!silent)
679
- console.info(`[platform] Checking remote app version [OK] {remote: '${remoteVersion}', actual: '${actualVersion}'}`);
680
- return;
681
- }
682
- // If newer version exists
683
- let reloadPath = location.href.replace(/[&?]version=[^&]*/gi, ''); // Remove old version in query params
684
- reloadPath += reloadPath.indexOf('?') === -1 ? '?' : '&'; // Add query param separator
685
- reloadPath += 'version=' + remoteVersion; // Add version (to avoid a reload infinite loop)
686
- // Already try to reload, but version still bad
687
- if (reloadPath === location.href) {
688
- if (canAutoReload)
689
- console.error(`[platform] Reloaded page failed, because version still mismatch! Please check version.appup file (expected app version: ${actualVersion})`);
690
- // Stop timer, to avoid infinite loop
691
- this.checkAppVersionTimer?.unsubscribe();
692
- return;
693
- }
694
- console.warn(`[platform] More recent version detected (remote: ${remoteVersion}, actual: ${actualVersion}`);
695
- // Auto reload
696
- if (canAutoReload) {
697
- console.info('[platform] Will reloading at ' + reloadPath);
698
- location.href = reloadPath;
699
- // App stop
700
- }
701
- // Ask user to reload
702
- else {
703
- // Stop timer, to avoid infinite loop
704
- this.checkAppVersionTimer?.unsubscribe();
705
- // Display a reload toast
706
- await this.showToast({
707
- message: 'CONFIRM.RELOAD_APP',
708
- messageParams: { version: remoteVersion, name: this.environment.name },
709
- type: 'info',
710
- duration: -1,
711
- showCloseButton: true,
712
- buttons: [
713
- // Reload button
714
- {
715
- text: this.translate.instant('COMMON.BTN_UPDATE'),
716
- side: 'end',
717
- handler: () => {
718
- location.href = reloadPath;
719
- return true;
720
- },
721
- },
722
- ],
723
- });
724
- }
725
- }
726
- async onStartupError(err) {
727
- console.error('[platform] Failed starting the platform! ' + JSON.stringify(err));
728
- let message = (err && err.message) || err;
729
- const detailsMessage = err && ((err.details && err.details.message) || err.details);
730
- // Set specific error when Firefox is in private mode or history never remembered (see Mantis Ifremer #56441)
731
- if (err.code === 11 && this.cdkPlatform.FIREFOX) {
732
- message = 'ERROR.FIREFOX_NO_STORAGE';
733
- }
734
- if (this.translate) {
735
- message = await this.translate.instant(message);
736
- if (err && err.code) {
737
- message += ` {code: ${err.code}}`;
738
- }
739
- }
740
- else {
741
- message = `Fatal error: Please contact your administrator.\n\n{code: ${(err && err.code) || 'null'}, message: "${message}"}`;
742
- }
743
- if (this.toastController) {
744
- if (detailsMessage) {
745
- message += `<br/><small>${detailsMessage}</small>`;
746
- }
747
- await this.showToast({
748
- type: 'error',
749
- duration: -1,
750
- showCloseButton: true,
751
- message,
752
- });
753
- }
754
- else if (window) {
755
- if (detailsMessage) {
756
- message += `\n\n{cause: "${detailsMessage}"}`;
757
- }
758
- window.alert(message);
759
- }
760
- else {
761
- console.error(message);
762
- if (err && err.details)
763
- console.error('cause', err.details);
764
- }
765
- }
766
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PlatformService, deps: [{ token: i1.Platform }, { token: i2.Platform }, { token: i3.Clipboard }, { token: i1.ToastController }, { token: i4.TranslateService }, { token: i5.MomentDateAdapter }, { token: i6.EntitiesStorage }, { token: i7.LocalSettingsService }, { token: i8.NetworkService }, { token: i9.AccountService }, { token: i10.ConfigService }, { token: i11.CacheService }, { token: i12.AudioProvider }, { token: ENVIRONMENT }, { token: APP_LOGGING_SERVICE, optional: true }, { token: i13.Downloader, optional: true }, { token: APP_BASE_HREF, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
767
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PlatformService, providedIn: 'root' });
768
- }
769
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PlatformService, decorators: [{
770
- type: Injectable,
771
- args: [{ providedIn: 'root' }]
772
- }], ctorParameters: () => [{ type: i1.Platform }, { type: i2.Platform }, { type: i3.Clipboard }, { type: i1.ToastController }, { type: i4.TranslateService }, { type: i5.MomentDateAdapter }, { type: i6.EntitiesStorage }, { type: i7.LocalSettingsService }, { type: i8.NetworkService }, { type: i9.AccountService }, { type: i10.ConfigService }, { type: i11.CacheService }, { type: i12.AudioProvider }, { type: i14.Environment, decorators: [{
773
- type: Inject,
774
- args: [ENVIRONMENT]
775
- }] }, { type: undefined, decorators: [{
776
- type: Optional
777
- }, {
778
- type: Inject,
779
- args: [APP_LOGGING_SERVICE]
780
- }] }, { type: i13.Downloader, decorators: [{
781
- type: Optional
782
- }] }, { type: undefined, decorators: [{
783
- type: Optional
784
- }, {
785
- type: Inject,
786
- args: [APP_BASE_HREF]
787
- }] }] });
788
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxhdGZvcm0uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29yZS9zZXJ2aWNlcy9wbGF0Zm9ybS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQVU3RCxPQUFPLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxlQUFlLEVBQUUsU0FBUyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFNUYsT0FBTyxFQUFvQixNQUFNLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUdyRSxPQUFPLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLEVBQUUsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2pHLE9BQU8sRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3ZELE9BQU8sRUFBZSxXQUFXLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUVuRixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUUzRCxPQUFPLEVBQStCLHNCQUFzQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDOUcsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFDakYsT0FBTyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM3RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDN0QsT0FBTyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNyRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDBC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Z0JBQWdCLGNBQWMsSUFBSSxDQUFDO1lBQ2hELENBQUM7WUFDRCxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3hCLENBQUM7YUFBTSxDQUFDO1lBQ04sT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN2QixJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsT0FBTztnQkFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDOUQsQ0FBQztJQUNILENBQUM7d0dBanlCVSxlQUFlLG1aQXlCaEIsV0FBVyxhQUNDLG1CQUFtQix3RUFFbkIsYUFBYTs0R0E1QnhCLGVBQWUsY0FERixNQUFNOzs0RkFDbkIsZUFBZTtrQkFEM0IsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUU7OzBCQTBCN0IsTUFBTTsyQkFBQyxXQUFXOzswQkFDbEIsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxtQkFBbUI7OzBCQUN0QyxRQUFROzswQkFDUixRQUFROzswQkFBSSxNQUFNOzJCQUFDLGFBQWEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIE9wdGlvbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBQbGF0Zm9ybSwgVG9hc3RDb250cm9sbGVyIH0gZnJvbSAnQGlvbmljL2FuZ3VsYXInO1xuaW1wb3J0IHsgTmV0d29ya1NlcnZpY2UgfSBmcm9tICcuL25ldHdvcmsuc2VydmljZSc7XG5pbXBvcnQgeyBBdXRoVG9rZW5UeXBlIH0gZnJvbSAnLi9uZXR3b3JrLnR5cGVzJztcbmltcG9ydCB7IFBsYXRmb3JtcyB9IGZyb20gJ0Bpb25pYy9jb3JlJztcbmltcG9ydCB7IExvY2FsU2V0dGluZ3NTZXJ2aWNlIH0gZnJvbSAnLi9sb2NhbC1zZXR0aW5ncy5zZXJ2aWNlJztcbmltcG9ydCB7IENhY2hlU2VydmljZSB9IGZyb20gJ2lvbmljLWNhY2hlJztcbmltcG9ydCB7IEF1ZGlvUHJvdmlkZXIgfSBmcm9tICcuLi8uLi9zaGFyZWQvYXVkaW8vYXVkaW8nO1xuaW1wb3J0IHsgUGxhdGZvcm0gYXMgQ2RrUGxhdGZvcm0gfSBmcm9tICdAYW5ndWxhci9jZGsvcGxhdGZvcm0nO1xuXG5pbXBvcnQgeyBpc05pbE9yQmxhbmssIGlzTm90TmlsLCBpc05vdE5pbE9yQmxhbmssIHRvQm9vbGVhbiB9IGZyb20gJy4uLy4uL3NoYXJlZC9mdW5jdGlvbnMnO1xuaW1wb3J0IHsgRW50aXRpZXNTdG9yYWdlIH0gZnJvbSAnLi9zdG9yYWdlL2VudGl0aWVzLXN0b3JhZ2Uuc2VydmljZSc7XG5pbXBvcnQgeyBTaG93VG9hc3RPcHRpb25zLCBUb2FzdHMgfSBmcm9tICcuLi8uLi9zaGFyZWQvdG9hc3QvdG9hc3RzJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IEFjY291bnRTZXJ2aWNlIH0gZnJvbSAnLi9hY2NvdW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBjb21iaW5lTGF0ZXN0LCBmcm9tLCBPYnNlcnZhYmxlLCBvZiwgU3Vic2NyaXB0aW9uLCB0aW1lciB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgY2F0Y2hFcnJvciwgc2tpcCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgRW52aXJvbm1lbnQsIEVOVklST05NRU5UIH0gZnJvbSAnLi4vLi4vLi4vZW52aXJvbm1lbnRzL2Vudmlyb25tZW50LmNsYXNzJztcbmltcG9ydCB7IENvbmZpZ1NlcnZpY2UgfSBmcm9tICcuL2NvbmZpZy5zZXJ2aWNlJztcbmltcG9ydCB7IENPUkVfQ09ORklHX09QVElPTlMgfSBmcm9tICcuL2NvbmZpZy9jb3JlLmNvbmZpZyc7XG5pbXBvcnQgeyBNb21lbnREYXRlQWRhcHRlciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsLW1vbWVudC1hZGFwdGVyJztcbmltcG9ydCB7IERvd25sb2FkZXIsIERvd25sb2FkUmVxdWVzdCwgTm90aWZpY2F0aW9uVmlzaWJpbGl0eSB9IGZyb20gJ0Bhd2Vzb21lLWNvcmRvdmEtcGx1Z2lucy9kb3dubG9hZGVyL25neCc7XG5pbXBvcnQgeyBTdGFydGFibGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2hhcmVkL3NlcnZpY2VzL3N0YXJ0YWJsZS1zZXJ2aWNlLmNsYXNzJztcbmltcG9ydCB7IGlzTW9iaWxlLCBpc1dpbmRvd3MgfSBmcm9tICcuLi8uLi9zaGFyZWQvcGxhdGZvcm1zJztcbmltcG9ydCB7IFZlcnNpb25VdGlscyB9IGZyb20gJy4uLy4uL3NoYXJlZC92ZXJzaW9uL3ZlcnNpb25zJztcbmltcG9ydCB7IEZpbGVzVXRpbHMsIE1pbWVUeXBlcyB9IGZyb20gJy4uLy4uL3NoYXJlZC9maWxlL2ZpbGUudXRpbHMnO1xuaW1wb3J0IHsgVXJpVXRpbHMgfSBmcm9tICcuLi8uLi9zaGFyZWQvZmlsZS91cmkudXRpbHMnO1xuaW1wb3J0IHsgU3BsYXNoU2NyZWVuIH0gZnJvbSAnQGNhcGFjaXRvci9zcGxhc2gtc2NyZWVuJztcbmltcG9ydCB7IFN0YXR1c0JhciwgU3R5bGUgfSBmcm9tICdAY2FwYWNpdG9yL3N0YXR1cy1iYXInO1xuaW1wb3J0IHsgQnJvd3NlciwgT3Blbk9wdGlvbnMgfSBmcm9tICdAY2FwYWNpdG9yL2Jyb3dzZXInO1xuaW1wb3J0IHsgS2V5Ym9hcmQgfSBmcm9tICdAY2FwYWNpdG9yL2tleWJvYXJkJztcbmltcG9ydCB7IENhcGFjaXRvclBsdWdpbnMgfSBmcm9tICcuLi8uLi9zaGFyZWQvY2FwYWNpdG9yL3BsdWdpbnMnO1xuaW1wb3J0IHsgbG9jYWxlIGFzIG1vbWVudExvY2FsZSB9IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgeyBJTG9nZ2VyLCBJTG9nZ2luZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zaGFyZWQvbG9nZ2luZy9sb2dnZXIubW9kZWwnO1xuaW1wb3J0IHsgQVBQX0xPR0dJTkdfU0VSVklDRSB9IGZyb20gJy4uLy4uL3NoYXJlZC9sb2dnaW5nL2xvZ2dpbmctc2VydmljZS5jbGFzcyc7XG5pbXBvcnQgeyBDbGlwYm9hcmQgYXMgQ2RrQ2xpcGJvYXJkIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NsaXBib2FyZCc7XG5pbXBvcnQgeyBDbGlwYm9hcmQgfSBmcm9tICdAY2FwYWNpdG9yL2NsaXBib2FyZCc7XG5pbXBvcnQgeyBXcml0ZU9wdGlvbnMgfSBmcm9tICdAY2FwYWNpdG9yL2NsaXBib2FyZC9kaXN0L2VzbS9kZWZpbml0aW9ucyc7XG5pbXBvcnQgeyBFZGdlVG9FZGdlIH0gZnJvbSAnQGNhcGF3ZXNvbWUvY2FwYWNpdG9yLWFuZHJvaWQtZWRnZS10by1lZGdlLXN1cHBvcnQnO1xuaW1wb3J0IHsgZ2V0Q29sb3JDb250cmFzdCwgZ2V0Q29sb3JTaGFkZSwgZ2V0Q29sb3JUaW50LCBoZXhUb1JnYkFycmF5LCBpc0xpZ2h0Q29sb3IsIG1peEhleCB9IGZyb20gJy4uLy4uL3NoYXJlZC9ncmFwaC9jb2xvcnMudXRpbHMnO1xuaW1wb3J0IHsgUGVlciB9IGZyb20gJy4vbW9kZWwvcGVlci5tb2RlbCc7XG5pbXBvcnQgeyBVcmxVdGlscyB9IGZyb20gJy4uLy4uL3NoYXJlZC9maWxlL3VybC51dGlscyc7XG5pbXBvcnQgeyBBUFBfQkFTRV9IUkVGIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcblxuZXhwb3J0IGNvbnN0IEFuZHJvaWRPc0Vudmlyb25tZW50ID0gT2JqZWN0LmZyZWV6ZSh7XG4gIERJUkVDVE9SWV9ET1dOTE9BRFM6ICdEb3dubG9hZCcsXG4gIERJUkVDVE9SWV9ET1dOTE9BRFNfT0xEOiAnRG93bmxvYWRzJywgLy8gT2xkIG5hbWUsIGZvciBvbGRlciBBbmRyb2lkIHZlcnNpb25cbiAgLy8gVE9ETzogZmluZCB2YWx1ZSBmb3IgdGhpcy4gU2VlIGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL29zL0Vudmlyb25tZW50I2dldEV4dGVybmFsU3RvcmFnZVN0YXRlKGphdmEuaW8uRmlsZSlcbiAgLy8gRElSRUNUT1JZX01VU0lDLFxuICAvLyBESVJFQ1RPUllfUE9EQ0FTVFMsXG4gIC8vIERJUkVDVE9SWV9SSU5HVE9ORVMsXG4gIC8vIERJUkVDVE9SWV9BTEFSTVMsXG4gIC8vIERJUkVDVE9SWV9OT1RJRklDQVRJT05TLFxuICAvLyBESVJFQ1RPUllfUElDVFVSRVMsXG4gIC8vIERJUkVDVE9SWV9NT1ZJRVMsXG4gIC8vIERJUkVDVE9SWV9EQ0lNLFxuICAvLyBESVJFQ1RPUllfRE9DVU1FTlRTLFxuICAvLyBESVJFQ1RPUllfQVVESU9CT09LUyxcbn0pO1xuXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIFBsYXRmb3JtU2VydmljZSBleHRlbmRzIFN0YXJ0YWJsZVNlcnZpY2Uge1xuICBwcml2YXRlIF9sb2dnZXI6IElMb2dnZXI7XG4gIHByaXZhdGUgX21vYmlsZTogYm9vbGVhbjtcbiAgcHJpdmF0ZSBfZGVza3RvcDogYm9vbGVhbjtcbiAgcHJpdmF0ZSBfY29yZG92YTogYm9vbGVhbjtcbiAgcHJpdmF0ZSBfY2FwYWNpdG9yOiBib29sZWFuO1xuICBwcml2YXRlIF9hbmRyb2lkOiBib29sZWFuO1xuICBwcml2YXRlIF9pb3M6IGJvb2xlYW47XG5cbiAgYnVzeVN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGlvbmljUGxhdGZvcm06IFBsYXRmb3JtLFxuICAgIHByaXZhdGUgY2RrUGxhdGZvcm06IENka1BsYXRmb3JtLFxuICAgIHByaXZhdGUgY2RrQ2xpcGJvYXJkOiBDZGtDbGlwYm9hcmQsXG4gICAgcHJpdmF0ZSB0b2FzdENvbnRyb2xsZXI6IFRvYXN0Q29udHJvbGxlcixcbiAgICBwcml2YXRlIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICBwcml2YXRlIGRhdGVBZGFwdGVyOiBNb21lbnREYXRlQWRhcHRlcixcbiAgICBwcml2YXRlIGVudGl0aWVzU3RvcmFnZTogRW50aXRpZXNTdG9yYWdlLFxuICAgIHByaXZhdGUgc2V0dGluZ3M6IExvY2FsU2V0dGluZ3NTZXJ2aWNlLFxuICAgIHByaXZhdGUgbmV0d29ya1NlcnZpY2U6IE5ldHdvcmtTZXJ2aWNlLFxuICAgIHByaXZhdGUgYWNjb3VudFNlcnZpY2U6IEFjY291bnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgY29uZmlnU2VydmljZTogQ29uZmlnU2VydmljZSxcbiAgICBwcml2YXRlIGNhY2hlOiBDYWNoZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBhdWRpb1Byb3ZpZGVyOiBBdWRpb1Byb3ZpZGVyLFxuICAgIEBJbmplY3QoRU5WSVJPTk1FTlQpIHByb3RlY3RlZCBlbnZpcm9ubWVudDogRW52aXJvbm1lbnQsXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChBUFBfTE9HR0lOR19TRVJWSUNFKSBsb2dnaW5nU2VydmljZTogSUxvZ2dpbmdTZXJ2aWNlLFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgZG93bmxvYWRlcjogRG93bmxvYWRlcixcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEFQUF9CQVNFX0hSRUYpIHByb3RlY3RlZCBhcHBCYXNlSHJlZjogc3RyaW5nXG4gICkge1xuICAgIHN1cGVyKGlvbmljUGxhdGZvcm0pO1xuXG4gICAgdGhpcy5fbG9nZ2VyID0gbG9nZ2luZ1NlcnZpY2U/LmdldExvZ2dlcigncGxhdGZvcm0nKTtcbiAgICB0aGlzLl9kZWJ1ZyA9ICFlbnZpcm9ubWVudC5wcm9kdWN0aW9uO1xuICAgIGlmICh0aGlzLl9kZWJ1ZykgY29uc29sZS5kZWJ1ZygnW3BsYXRmb3JtXSBDcmVhdGluZyBzZXJ2aWNlJyk7XG5cbiAgICBpZiAodGhpcy5fbG9nZ2VyKSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZGVidWcoJ2N0b3InLCAnQ3JlYXRpbmcgc2VydmljZScpO1xuICAgICAgaW9uaWNQbGF0Zm9ybS5wYXVzZS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLl9sb2dnZXIuaW5mbygnY3RvcicsICdQYXVzZSBhcHAnKTtcbiAgICAgIH0pO1xuICAgICAgaW9uaWNQbGF0Zm9ybS5yZXN1bWUuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ2N0b3InLCAnUmVzdW1lIGFwcCcpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgX2Rvd25sb2FkaW5nSm9iczogTWFwPHN0cmluZywgT2JzZXJ2YWJsZTxzdHJpbmc+PiA9IG5ldyBNYXAoKTtcblxuICBwcml2YXRlIGNoZWNrQXBwVmVyc2lvblRpbWVyOiBTdWJzY3JpcHRpb247XG5cbiAgaXMocGxhdGZvcm1OYW1lOiBQbGF0Zm9ybXMpOiBib29sZWFuIHtcbiAgICBzd2l0Y2ggKHBsYXRmb3JtTmFtZSkge1xuICAgICAgY2FzZSAnbW9iaWxlJzpcbiAgICAgICAgLy8gRXhjbHVkZSBXaW5kb3dzIHRvdWNoIHNjcmVlbnMgLSBzZWUgc3VtYXJpcy1hcHAgaXNzdWVzICMzMjMgYW5kICMzNDZcbiAgICAgICAgcmV0dXJuIGlzTW9iaWxlKHdpbmRvdyk7XG4gICAgICBjYXNlICdtb2JpbGV3ZWInOlxuICAgICAgICAvLyBFeGNsdWRlIFdpbmRvd3MgdG91Y2ggc2NyZWVucyAtIHNlZSBzdW1hcmlzLWFwcCBpc3N1ZXMgIzMyMyBhbmQgIzM0NlxuICAgICAgICByZXR1cm4gdGhpcy5pb25pY1BsYXRmb3JtLmlzKHBsYXRmb3JtTmFtZSkgJiYgIWlzV2luZG93cyh3aW5kb3cpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHRoaXMuaW9uaWNQbGF0Zm9ybS5pcyhwbGF0Zm9ybU5hbWUpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBtb2JpbGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlzTm90TmlsKHRoaXMuX21vYmlsZSkgPyB0aGlzLl9tb2JpbGUgOiB0aGlzLmlzKCdtb2JpbGUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYXkgaWYgb3BlbmVkIGhhcyBiZWVuIG9wZW5lZCBpbnNpZGUgYW4gQW5kcm9pZCBvciBpT3MgQXBwLlxuICAgKiBUaGlzIGlzIHVzZWQgdG8ga25vd24gaWYgdGhlcmUgaXMgY29yZG92YSBmZWF0dXJlc1xuICAgKi9cbiAgaXNDYXBhY2l0b3IoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2NhcGFjaXRvcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYXkgaWYgb3BlbmVkIGhhcyBiZWVuIG9wZW5lZCBpbnNpZGUgYW4gQW5kcm9pZCBvciBpT3MgQXBwLlxuICAgKiBUaGlzIGlzIHVzZWQgdG8ga25vd24gaWYgdGhlcmUgaXMgY29yZG92YSBmZWF0dXJlc1xuICAgKi9cbiAgaXNDb3Jkb3ZhKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9jb3Jkb3ZhO1xuICB9XG5cbiAgaXNBbmRyb2lkQ29yZG92YSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKHRoaXMuX2FuZHJvaWQgJiYgdGhpcy5fY29yZG92YSkgfHwgZmFsc2U7XG4gIH1cblxuICBpc0lPU0NvcmRvdmEoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICh0aGlzLl9pb3MgJiYgdGhpcy5fY29yZG92YSkgfHwgZmFsc2U7XG4gIH1cblxuICBpc0FuZHJvaWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2FuZHJvaWQgfHwgZmFsc2U7XG4gIH1cblxuICBpc0lPUygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faW9zIHx8IGZhbHNlO1xuICB9XG5cbiAgaXNNYWNPU0Rlc2t0b3AoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2Rlc2t0b3AgJiYgdGhpcy5pc0NvcmRvdmEoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJcyBhIG5hdGl2ZSBBcHAgKGFuZCBOT1QgYSBtb2JpbGUgd2ViKVxuICAgKi9cbiAgaXNBcHAoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNBbmRyb2lkQ29yZG92YSgpIHx8IHRoaXMuaXNJT1NDb3Jkb3ZhKCk7XG4gIH1cblxuICBpc1dlYigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuaXNBcHAoKTtcbiAgfVxuXG4gIGlzTW9iaWxlV2ViKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm1vYmlsZSAmJiB0aGlzLmlzV2ViKCk7XG4gIH1cblxuICBnZXQgY2FuRG93bmxvYWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZG93bmxvYWRlciAmJiB0aGlzLmlzQW5kcm9pZENvcmRvdmEoKTtcbiAgfVxuXG4gIGdldCBjYW5PcGVuRmlsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7IC8vIFRPRE86IGZpeG1lIHVzaW5nIEBjYXBhY2l0b3IvZmlsZXN5c3RlbSA/XG4gIH1cblxuICB3aWR0aCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmlvbmljUGxhdGZvcm0ud2lkdGgoKTtcbiAgfVxuXG4gIGhlaWdodCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmlvbmljUGxhdGZvcm0uaGVpZ2h0KCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgbmdPblN0YXJ0KCk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICB0aGlzLmFjY291bnRTZXJ2aWNlLnRva2VuVHlwZSA9IHVuZGVmaW5lZDtcbiAgICBjb25zb2xlLmRlYnVnKCdbcGxhdGZvcm1dIFN0YXJ0aW5nIHBsYXRmb3JtLi4uJyk7XG4gICAgdGhpcy5fbG9nZ2VyPy5pbmZvKCduZ09uU3RhcnQnLCAnU3RhcnRpbmcgcGxhdGZvcm0uLi4nKTtcblxuICAgIHRyeSB7XG4gICAgICB0aGlzLl9tb2JpbGUgPSB0aGlzLmlzKCdtb2JpbGUnKTtcbiAgICAgIHRoaXMuX2Rlc2t0b3AgPSB0aGlzLmlzKCdkZXNrdG9wJyk7XG4gICAgICB0aGlzLl9jb3Jkb3ZhID0gdGhpcy5pcygnY29yZG92YScpO1xuICAgICAgdGhpcy5fY2FwYWNpdG9yID0gdGhpcy5pcygnY2FwYWNpdG9yJyk7XG4gICAgICB0aGlzLl9hbmRyb2lkID0gdGhpcy5pcygnYW5kcm9pZCcpO1xuICAgICAgdGhpcy5faW9zID0gdGhpcy5pcygnaW9zJyk7XG5cbiAgICAgIGNvbnN0IGxvZ01lc3NhZ2UgPSBgRGV0ZWN0ZWQge21vYmlsZTogJHt0aGlzLl9tb2JpbGV9LCBkZXNrdG9wOiAke3RoaXMuX2Rlc2t0b3B9LCBjb3Jkb3ZhOiAke3RoaXMuX2NvcmRvdmF9LCBjYXBhY2l0b3I6ICR7dGhpcy5fY2FwYWNpdG9yfSwgYW5kcm9pZDogJHt0aGlzLl9hbmRyb2lkfSwgaW9zOiAke3RoaXMuX2lvc319YDtcbiAgICAgIGNvbnNvbGUuaW5mbygnW3BsYXRmb3JtXSAnICsgbG9nTWVzc2FnZSk7XG4gICAgICB0aGlzLl9sb2dnZXI/LmluZm8oJ25nT25TdGFydCcsIGxvZ01lc3NhZ2UpO1xuXG4gICAgICAvLyBDb25maWd1cmUgdGhlbWVcbiAgICAgIGF3YWl0IHRoaXMuY29uZmlndXJlVGhlbWUodGhpcy5fbW9iaWxlKTtcblxuICAgICAgLy8gQ29uZmlndXJlIENhcGFjaXRvciBwbHVnaW5zXG4gICAgICBhd2FpdCB0aGlzLmNvbmZpZ3VyZUNhcGFjaXRvclBsdWdpbnMoKTtcblxuICAgICAgLy8gQ29uZmlndXJlIHRyYW5zbGF0aW9uXG4gICAgICB0aGlzLmNvbmZpZ3VyZVRyYW5zbGF0ZSgpO1xuXG4gICAgICAvLyBDb25maWd1cmUgY2FjaGVcbiAgICAgIHRoaXMuY29uZmlndXJlQ2FjaGUoKTtcblxuICAgICAgLy8gU3RhcnQgcm9vdCBzZXJ2aWNlc1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW3RoaXMuZW50aXRpZXNTdG9yYWdlLnJlYWR5KCksIHRoaXMuc2V0dGluZ3MucmVhZHkoKSwgdGhpcy5uZXR3b3JrU2VydmljZS5yZWFkeSgpLCB0aGlzLmF1ZGlvUHJvdmlkZXIucmVhZHkoKV0pO1xuXG4gICAgICAvLyBDaGVjayBpZiB3ZWIgYXBwIGhhcyB1cGRhdGUsIGFuZCByZWxvYWQgcGFnZSBpZiBuZWVkXG4gICAgICBpZiAodGhpcy5pc1dlYigpICYmIHRoaXMuZW52aXJvbm1lbnQucHJvZHVjdGlvbikge1xuICAgICAgICBhd2FpdCB0aGlzLmNoZWNrQXBwVmVyc2lvbih7IGNhblJlbG9hZDogdHJ1ZSB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gVXBkYXRlIGNhY2hlIGNvbmZpZ3VyYXRpb24gd2hlbiBuZXR3b3JrIGNoYW5nZWRcbiAgICAgIHRoaXMucmVnaXN0ZXJTdWJzY3JpcHRpb24oXG4gICAgICAgIHRoaXMubmV0d29ya1NlcnZpY2Uub25OZXR3b3JrU3RhdHVzQ2hhbmdlc1xuICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgc2tpcCgxKSAvLyBBbHJlYWR5IGRvbmUgb25jZSwgc28gd2Ugc2tpcCB0aGUgZmlyc3QgZXZlbnRcbiAgICAgICAgICApXG4gICAgICAgICAgLnN1YnNjcmliZSgodHlwZSkgPT4gdGhpcy5jb25maWd1cmVDYWNoZSh0eXBlICE9PSAnbm9uZScpKVxuICAgICAgKTtcblxuICAgICAgY29uc29sZS5pbmZvKFxuICAgICAgICBgW3BsYXRmb3JtXSBTdGFydGluZyBwbGF0Zm9ybSBbT0tdIHttb2JpbGU6ICR7dGhpcy5fbW9iaWxlfSwgY2FwYWNpdG9yOiAke3RoaXMuX2NhcGFjaXRvcn0sIHdlYjogJHt0aGlzLmlzV2ViKCl9LCBkb3dubG9hZGVyOiAke3RoaXMuY2FuRG93bmxvYWR9fSBpbiAke0RhdGUubm93KCkgLSBub3d9bXNgXG4gICAgICApO1xuXG4gICAgICAvLyBQYXNzIGF1dGggdG9rZW5cbiAgICAgIHRoaXMucmVnaXN0ZXJTdWJzY3JpcHRpb24oXG4gICAgICAgIHRoaXMuY29uZmlnU2VydmljZS5jb25maWcuc3Vic2NyaWJlKChjb25maWcpID0+IHtcbiAgICAgICAgICBpZiAoIWNvbmZpZykgcmV0dXJuOyAvLyBTa2lwXG5cbiAgICAgICAgICAvLyBVcGRhdGUgYXV0aGVudGljYXRpb24gdHlwZVxuICAgICAgICAgIGNvbnN0IHRva2VuVHlwZTogQXV0aFRva2VuVHlwZSA9IGNvbmZpZy5nZXRQcm9wZXJ0eShDT1JFX0NPTkZJR19PUFRJT05TLkFVVEhfVE9LRU5fVFlQRSkgYXMgQXV0aFRva2VuVHlwZTtcbiAgICAgICAgICBpZiAoaXNOb3ROaWxPckJsYW5rKHRva2VuVHlwZSkgJiYgdGhpcy5hY2NvdW50U2VydmljZS50b2tlblR5cGUgIT09IHRva2VuVHlwZSkge1xuICAgICAgICAgICAgY29uc29sZS5pbmZvKGBbcGxhdGZvcm1dIFVzaW5nIGF1dGggdG9rZW4gdHlwZSB7JHt0b2tlblR5cGV9fWApO1xuICAgICAgICAgICAgdGhpcy5hY2NvdW50U2VydmljZS50b2tlblR5cGUgPSB0b2tlblR5cGU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gRW5hYmxlIGF1dGggQVBJIHVzaW5nIHRva2Vuc1xuICAgICAgICAgIGNvbnN0IGF1dGhBcGlFbmFibGVkID0gY29uZmlnLmdldFByb3BlcnR5QXNCb29sZWFuKENPUkVfQ09ORklHX09QVElPTlMuQVVUSF9BUElfVE9LRU5fRU5BQkxFRCk7XG4gICAgICAgICAgaWYgKGlzTm90TmlsKGF1dGhBcGlFbmFibGVkKSAmJiBhdXRoQXBpRW5hYmxlZCAhPT0gdGhpcy5hY2NvdW50U2VydmljZS5hcGlUb2tlbkVuYWJsZWQpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuaW5mbyhgW3BsYXRmb3JtXSBVc2luZyBhdXRoIEFQSSB0b2tlbnMgPyAke2F1dGhBcGlFbmFibGVkfX1gKTtcbiAgICAgICAgICAgIHRoaXMuYWNjb3VudFNlcnZpY2UuYXBpVG9rZW5FbmFibGVkID0gYXV0aEFwaUVuYWJsZWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgKTtcblxuICAgICAgLy8gSGlkZSB0aGUgc3BsYXNoc2NyZWVuIChpZiBtb2JpbGUgb3IgbWFjT1MpIC0gYWZ0ZXIgMXNcbiAgICAgIGlmICh0aGlzLl9tb2JpbGUgfHwgdGhpcy5pc01hY09TRGVza3RvcCgpKSB7XG4gICAgICAgIHNldFRpbWVvdXQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGF3YWl0IFNwbGFzaFNjcmVlbi5oaWRlKCk7XG5cbiAgICAgICAgICAvLyBQbGF5IHN0YXJ0dXAgc291bmQgKGlzIG1vYmlsZSlcbiAgICAgICAgICBpZiAodGhpcy5fbW9iaWxlKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmF1ZGlvUHJvdmlkZXIucGxheVN0YXJ0dXBTb3VuZCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgMTAwMCk7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIG5ldyB2ZXJzaW9uLCBldmVyeSAxIG1pblxuICAgICAgY29uc3QgY2hlY2tJbnRlcnZhbE1zID0gKHRoaXMuZW52aXJvbm1lbnQuY2hlY2tBcHBWZXJzaW9uSW50ZXJ2YWxJblNlY29uZHMgfHwgMCkgKiAxMDAwO1xuICAgICAgaWYgKHRoaXMuaXNXZWIoKSAmJiB0aGlzLmVudmlyb25tZW50LnByb2R1Y3Rpb24gJiYgY2hlY2tJbnRlcnZhbE1zID4gMCkge1xuICAgICAgICB0aGlzLmNoZWNrQXBwVmVyc2lvblRpbWVyPy51bnN1YnNjcmliZSgpO1xuICAgICAgICBjb25zdCBzdWJzY3JpcHRpb24gPSB0aW1lcihjaGVja0ludGVydmFsTXMsIGNoZWNrSW50ZXJ2YWxNcykuc3Vic2NyaWJlKChfKSA9PlxuICAgICAgICAgIHRoaXMuY2hlY2tBcHBWZXJzaW9uKHsgc2lsZW50OiB0cnVlLCBjYW5SZWxvYWQ6IGZhbHNlIC8qZG8gTk9UIGF1dG8gcmVsb2FkLCB3aGVuIGFwcCBpcyBzdGFydGVkKi8gfSlcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5jaGVja0FwcFZlcnNpb25UaW1lciA9IHN1YnNjcmlwdGlvbjtcbiAgICAgICAgdGhpcy5yZWdpc3RlclN1YnNjcmlwdGlvbihzdWJzY3JpcHRpb24pO1xuICAgICAgICBzdWJzY3JpcHRpb24uYWRkKCgpID0+IHRoaXMudW5yZWdpc3RlclN1YnNjcmlwdGlvbihzdWJzY3JpcHRpb24pKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8vIE1hbmFnZSBzdGFydHVwIGVycm9yXG4gICAgICByZXR1cm4gdGhpcy5vblN0YXJ0dXBFcnJvcihlcnIpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVc2VkIHRvIHNob3cgYSBiYWNrZHJvcCB3aGVuIHBsYXRmb3JtIGlzIGJ1c3kgKGUuZy4gZnJvbSB0aGUgYXBwLmNvbXBvbmVudC50cylcbiAgICovXG4gIG1hcmtBc0J1c3koKSB7XG4gICAgaWYgKCF0aGlzLmJ1c3lTdWJqZWN0LnZhbHVlKSB7XG4gICAgICB0aGlzLmJ1c3lTdWJqZWN0Lm5leHQodHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgbWFya0FzTm90QnVzeSgpIHtcbiAgICBpZiAodGhpcy5idXN5U3ViamVjdC52YWx1ZSkge1xuICAgICAgdGhpcy5idXN5U3ViamVjdC5uZXh0KGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBvcGVuKHVybDogc3RyaW5nLCBvcHRzPzogT21pdDxPcGVuT3B0aW9ucywgJ3VybCc+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc29sZS5pbmZvKGBbcGxhdGZvcm1dIE9wZW5pbmcgbGluazogJHt1cmx9YCk7XG4gICAgaWYgKHRoaXMuX21vYmlsZSAmJiB0aGlzLl9jYXBhY2l0b3IpIHtcbiAgICAgIGF3YWl0IEJyb3dzZXIub3Blbih7IHVybCwgLi4ub3B0cyB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgd2luZG93Lm9wZW4odXJsLCBvcHRzPy53aW5kb3dOYW1lKTtcbiAgICB9XG4gIH1cblxuICBnZXREb3dubG9hZGluZ0pvYih1cmk6IHN0cmluZyk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuX2Rvd25sb2FkaW5nSm9icy5nZXQodXJpKTtcbiAgfVxuXG4gIGRvd25sb2FkKHJlcXVlc3Q6IHsgdXJpOiBzdHJpbmc7IGZpbGVuYW1lPzogc3RyaW5nIH0gJiBQYXJ0aWFsPERvd25sb2FkUmVxdWVzdD4pOiBPYnNlcnZhYmxlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIGlmICghcmVxdWVzdCB8fCAhcmVxdWVzdC51cmkpIHRocm93IG5ldyBFcnJvcihcIk1pc3NpbmcgYXJndW1lbnQgJ3JlcXVlc3QnIG9yICdyZXF1ZXN0LnVyaSdcIik7XG5cbiAgICBpZiAodGhpcy5jYW5Eb3dubG9hZCkge1xuICAgICAgLy8gQ2hlY2sgaWYgbm90IGFscmVhZHkgZG93bmxvYWRpbmcgZmlsZVxuICAgICAgbGV0IGpvYiQgPSB0aGlzLl9kb3dubG9hZGluZ0pvYnMuZ2V0KHJlcXVlc3QudXJpKTtcbiAgICAgIGlmIChqb2IkKSByZXR1cm4gam9iJDtcblxuICAgICAgLy8gQ29tcHV0ZSBzdWJQYXRoIChmaW5hbCBmaWxlbmFtZSlcbiAgICAgIGxldCBzdWJQYXRoID1cbiAgICAgICAgcmVxdWVzdC5kZXN0aW5hdGlvbkluRXh0ZXJuYWxQdWJsaWNEaXI/LnN1YlBhdGggfHxcbiAgICAgICAgcmVxdWVzdC5kZXN0aW5hdGlvbkluRXh0ZXJuYWxGaWxlc0Rpcj8uc3ViUGF0aCB8fFxuICAgICAgICByZXF1ZXN0LmZpbGVuYW1lIHx8XG4gICAgICAgIFVyaVV0aWxzLmdldEZpbGVuYW1lKHJlcXVlc3QudXJpKSB8fFxuICAgICAgICByZXF1ZXN0LnRpdGxlIHx8XG4gICAgICAgICdkb3dubG9hZCc7XG5cbiAgICAgIHN1YlBhdGggPSBzdWJQYXRoXG4gICAgICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgICAgIC8vIFJlbW92ZSBzcGFjZXNcbiAgICAgICAgLnJlcGxhY2UoL1xccysvZywgJy0nKTtcblxuICAgICAgLy8gRm9yY2UgQVBLIHRvIGZpbmlzaCB3aXRoICcuYXBrJ1xuICAgICAgaWYgKHJlcXVlc3QubWltZVR5cGUgPT09IE1pbWVUeXBlcy5BTkRST0lEX0FQSyAmJiAhc3ViUGF0aC50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCcuYXBrJykpIHtcbiAgICAgICAgc3ViUGF0aCArPSAnLmFwayc7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRvd25sb2FkUmVxdWVzdCA9IDxEb3dubG9hZFJlcXVlc3Q+e1xuICAgICAgICB2aXNpYmxlSW5Eb3dubG9hZHNVaTogdHJ1ZSxcbiAgICAgICAgbm90aWZpY2F0aW9uVmlzaWJpbGl0eTogTm90aWZpY2F0aW9uVmlzaWJpbGl0eS5WaXNpYmxlTm90aWZ5Q29tcGxldGVkLFxuICAgICAgICAuLi5yZXF1ZXN0LFxuICAgICAgICBmaWxlbmFtZTogdW5kZWZpbmVkLCAvLyBGb3JjZSB1bnNldFxuICAgICAgICBkZXN0aW5hdGlvbkluRXh0ZXJuYWxQdWJsaWNEaXI6ICFyZXF1ZXN0LmRlc3RpbmF0aW9uSW5FeHRlcm5hbEZpbGVzRGlyXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIGRpclR5cGU6IEFuZHJvaWRPc0Vudmlyb25tZW50LkRJUkVDVE9SWV9ET1dOTE9BRFMsXG4gICAgICAgICAgICAgIC4uLnJlcXVlc3QuZGVzdGluYXRpb25JbkV4dGVybmFsUHVibGljRGlyLFxuICAgICAgICAgICAgICBzdWJQYXRoLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICBkZXN0aW5hdGlvbkluRXh0ZXJuYWxGaWxlc0RpcjogcmVxdWVzdC5kZXN0aW5hdGlvbkluRXh0ZXJuYWxGaWxlc0RpclxuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICBkaXJUeXBlOiBBbmRyb2lkT3NFbnZpcm9ubWVudC5ESVJFQ1RPUllfRE9XTkxPQURTLFxuICAgICAgICAgICAgICAuLi5yZXF1ZXN0LmRlc3RpbmF0aW9uSW5FeHRlcm5hbEZpbGVzRGlyLFxuICAgICAgICAgICAgICBzdWJQYXRoLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgfTtcblxuICAgICAgLy8gU3RhcnQgZG93bmxvYWRcbiAgICAgIGNvbnNvbGUuZGVidWcoJ1twbGF0Zm9ybV0gRG93bmxvYWRpbmcsIHVzaW5nIHJlcXVlc3Q6ICcgKyBKU09OLnN0cmluZ2lmeShkb3dubG9hZFJlcXVlc3QpKTtcbiAgICAgIGpvYiQgPSBmcm9tKHRoaXMuZG93bmxvYWRlci5kb3dubG9hZChkb3dubG9hZFJlcXVlc3QpKTtcblxuICAgICAgLy8gUmVtZW1iZXIgdGhpcyByZXF1ZXN0IHVyaVxuICAgICAgdGhpcy5fZG93bmxvYWRpbmdKb2JzLnNldChkb3dubG9hZFJlcXVlc3QudXJpLCBqb2IkKTtcbiAgICAgIHJldHVybiBqb2IkLnBpcGUoXG4gICAgICAgIHRhcCgobG9jYXRpb24pID0+IHtcbiAgICAgICAgICBjb25zb2xlLmluZm8oJ1twbGF0Zm9ybV0gRmlsZSBzdWNjZXNzZnVsbHkgZG93bmxvYWRlZCBhdDonICsgbG9jYXRpb24pO1xuICAgICAgICAgIC8vIEZvcmdldCBqb2JcbiAgICAgICAgICB0aGlzLl9kb3dubG9hZGluZ0pvYnMuZGVsZXRlKGRvd25sb2FkUmVxdWVzdC51cmkpO1xuICAgICAgICAgIHJldHVybiBsb2NhdGlvbjtcbiAgICAgICAgfSksXG4gICAgICAgIGNhdGNoRXJyb3IoKGVycikgPT4ge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1twbGF0Zm9ybV0gVW5hYmxlIHRvIGRvd25sb2FkOiAnICsgKChlcnIgJiYgZXJyLm1lc3NhZ2UpIHx8IGVycikpO1xuICAgICAgICAgIC8vIEZvcmdldCB0aGUgcmVxdWVzdFxuICAgICAgICAgIHRoaXMuX2Rvd25sb2FkaW5nSm9icy5kZWxldGUoZG93bmxvYWRSZXF1ZXN0LnVyaSk7XG5cbiAgICAgICAgICAvLyBSZXRyeSB3aXRoIGFub3RoZXIgbG9jYXRpb24gLSBpc3N1ZSBpbiBvbGRlciBBbmRyb2lkIHZlcnNpb25cbiAgICAgICAgICBpZiAoZG93bmxvYWRSZXF1ZXN0LmRlc3RpbmF0aW9uSW5FeHRlcm5hbFB1YmxpY0Rpcj8uZGlyVHlwZSA9PT0gQW5kcm9pZE9zRW52aXJvbm1lbnQuRElSRUNUT1JZX0RPV05MT0FEUykge1xuICAgICAgICAgICAgZG93bmxvYWRSZXF1ZXN0LmRlc3RpbmF0aW9uSW5FeHRlcm5hbFB1YmxpY0Rpci5kaXJUeXBlID0gQW5kcm9pZE9zRW52aXJvbm1lbnQuRElSRUNUT1JZX0RPV05MT0FEU19PTEQ7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kb3dubG9hZChkb3dubG9hZFJlcXVlc3QpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrIChpZiBub3QgQW5kcm9pZCBhbmQgQ2FwYWNpdG9yKTogb3BlbmluZyB0aGUgVVJJXG4gICAgLy8gVE9ETzogZmluZCBhIHdheSB0byBkb3dubG9hZCB1bmRlciBpT1MgKHNlZSBodHRwczovL3d3dy5jLXNoYXJwY29ybmVyLmNvbS9hcnRpY2xlL2hvdy10by1kb3dubG9hZC1hLWZpbGUtdXNpbmctZmlsZS10cmFuc2Zlci1wbHVnaW4taW4taW9uaWMtMy8pXG4gICAgZWxzZSB7XG4gICAgICBGaWxlc1V0aWxzLmRvd25sb2FkVXJpKHJlcXVlc3QudXJpLCByZXF1ZXN0LmZpbGVuYW1lKTtcbiAgICAgIHJldHVybiBvZih1bmRlZmluZWQpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGNvcHlUb0NsaXBib2FyZChkYXRhOiBzdHJpbmcgfCBXcml0ZU9wdGlvbnMsIG9wdHM/OiBTaG93VG9hc3RPcHRpb25zKSB7XG4gICAgY29uc3QgdmFsdWUgPSB0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycgPyBkYXRhIDogZGF0YS5zdHJpbmc7XG4gICAgbGV0IGNvcGllZCA9IHRydWU7XG4gICAgaWYgKHRoaXMuaXNBbmRyb2lkQ29yZG92YSgpKSB7XG4gICAgICBjb25zdCB3cml0ZU9wdGlvbnMgPSB0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycgPyB7IHN0cmluZzogdmFsdWUgfSA6IGRhdGE7XG4gICAgICBhd2FpdCBDbGlwYm9hcmQud3JpdGUod3JpdGVPcHRpb25zKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29waWVkID0gdGhpcy5jZGtDbGlwYm9hcmQuY29weSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgaWYgKGNvcGllZCkge1xuICAgICAgLy8gU2hvdyB0b2FzdFxuICAgICAgaWYgKG9wdHMgJiYgaXNOb3ROaWxPckJsYW5rKG9wdHMubWVzc2FnZSkpIHtcbiAgICAgICAgYXdhaXQgVG9hc3RzLnNob3codGhpcy50b2FzdENvbnRyb2xsZXIsIHRoaXMudHJhbnNsYXRlLCB7XG4gICAgICAgICAgdHlwZTogJ2luZm8nLFxuICAgICAgICAgIC4uLm9wdHMsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdbcGxhdGZvcm1dIFVuYWJsZSB0byBjb3B5IHRvIGNsaXBib2FyZDogJyArIGRhdGEpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZVRoZW1lKG9wdGlvbnM6IHsgZGFya01vZGU/OiBib29sZWFuOyBjb2xvcnM/OiB7IFtjb2xvcjogc3RyaW5nXTogc3RyaW5nIH07IHZhcnM/OiB7IFtjb2xvcjogc3RyaW5nXTogc3RyaW5nIH0gfSkge1xuICAgIGlmICghb3B0aW9ucykgcmV0dXJuO1xuICAgIGNvbnN0IHN0eWxlID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlO1xuXG4gICAgLy8gb3B0aW9ucy5jb2xvcnMgPSB7XG4gICAgLy8gICAuLi5vcHRpb25zLmNvbG9ycyxcbiAgICAvLyAgIHByaW1hcnk6ICcjMTI0NTQxJyxcbiAgICAvLyB9O1xuXG4gICAgLy8gU2V0IGNvbG9yc1xuICAgIGlmIChvcHRpb25zLmNvbG9ycykge1xuICAgICAgY29uc29sZS5pbmZvKCdbcGxhdGZvcm1dIENoYW5naW5nIHRoZW1lIGNvbG9ycyAnLCBvcHRpb25zLmNvbG9ycyk7XG5cbiAgICAgIC8vIEFkZCAxMDAgJiA5MDAgY29sb3IgZm9yIHByaW1hcnkgYW5kIHNlY29uZGFyeSBjb2xvclxuICAgICAgWydwcmltYXJ5JywgJ3NlY29uZGFyeSddLmZvckVhY2goKGNvbG9yTmFtZSkgPT4ge1xuICAgICAgICBjb25zdCBjb2xvciA9IG9wdGlvbnMuY29sb3JzW2NvbG9yTmFtZV07XG4gICAgICAgIG9wdGlvbnMuY29sb3JzW2NvbG9yTmFtZSArICcxMDAnXSA9IChjb2xvciAmJiBtaXhIZXgoJyNmZmZmZmYnLCBjb2xvciwgMTApKSB8fCB1bmRlZmluZWQ7XG4gICAgICAgIG9wdGlvbnMuY29sb3JzW2NvbG9yTmFtZSArICc5MDAnXSA9IChjb2xvciAmJiBtaXhIZXgoJyMwMDAwMDAnLCBjb2xvciwgMTIpKSB8fCB1bmRlZmluZWQ7XG4gICAgICB9KTtcblxuICAgICAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMob3B0aW9ucy5jb2xvcnMpLmZvckVhY2goKGNvbG9yTmFtZSkgPT4ge1xuICAgICAgICAvLyBSZW1vdmUgZXhpc3RpbmcgdmFsdWVcbiAgICAgICAgc3R5bGUucmVtb3ZlUHJvcGVydHkoYC0taW9uLWNvbG9yLSR7Y29sb3JOYW1lfWApO1xuICAgICAgICBzdHlsZS5yZW1vdmVQcm9wZXJ0eShgLS1pb24tY29sb3ItJHtjb2xvck5hbWV9LXJnYmApO1xuICAgICAgICBzdHlsZS5yZW1vdmVQcm9wZXJ0eShgLS1pb24tY29sb3ItJHtjb2xvck5hbWV9LWNvbnRyYXN0YCk7XG4gICAgICAgIHN0eWxlLnJlbW92ZVByb3BlcnR5KGAtLWlvbi1jb2xvci0ke2NvbG9yTmFtZX0tY29udHJhc3QtcmdiYCk7XG4gICAgICAgIHN0eWxlLnJlbW92ZVByb3BlcnR5KGAtLWlvbi1jb2xvci0ke2NvbG9yTmFtZX0tc2hhZGVgKTtcbiAgICAgICAgc3R5bGUucmVtb3ZlUHJvcGVydHkoYC0taW9uLWNvbG9yLSR7Y29sb3JOYW1lfS10aW50YCk7XG5cbiAgICAgICAgLy8gU2V0IG5ldyB2YWx1ZSwgaWYgYW55XG4gICAgICAgIGNvbnN0IGNvbG9yID0gb3B0aW9ucy5jb2xvcnNbY29sb3JOYW1lXTtcbiAgICAgICAgaWYgKGlzTm90TmlsT3JCbGFuayhjb2xvcikpIHtcbiAgICAgICAgICAvLyBCYXNlIGNvbG9yXG4gICAgICAgICAgc3R5bGUuc2V0UHJvcGVydHkoYC0taW9uLWNvbG9yLSR7Y29sb3JOYW1lfWAsIGNvbG9yKTtcbiAgICAgICAgICBzdHlsZS5zZXRQcm9wZXJ0eShgLS1pb24tY29sb3ItJHtjb2xvck5hbWV9LXJnYmAsIGhleFRvUmdiQXJyYXkoY29sb3IpLmpvaW4oJywgJykpO1xuXG4gICAgICAgICAgLy8gQ29udHJhc3QgY29sb3JcbiAgICAgICAgICBjb25zdCBjb250cmFzdENvbG9yID0gZ2V0Q29sb3JDb250cmFzdChjb2xvciwgdHJ1ZSk7XG4gICAgICAgICAgc3R5bGUuc2V0UHJvcGVydHkoYC0taW9uLWNvbG9yLSR7Y29sb3JOYW1lfS1jb250cmFzdGAsIGNvbnRyYXN0Q29sb3IpO1xuICAgICAgICAgIHN0eWxlLnNldFByb3BlcnR5KGAtLWlvbi1jb2xvci0ke2NvbG9yTmFtZX0tY29udHJhc3QtcmdiYCwgaGV4VG9SZ2JBcnJheShjb250cmFzdENvbG9yKS5qb2luKCcsICcpKTtcblxuICAgICAgICAgIC8vIFNoYWRlIGNvbG9yXG4gICAgICAgICAgc3R5bGUuc2V0UHJvcGVydHkoYC0taW9uLWNvbG9yLSR7Y29sb3JOYW1lfS1zaGFkZWAsIGdldENvbG9yU2hhZGUoY29sb3IpKTtcblxuICAgICAgICAgIC8vIFRpbnQgY29sb3JcbiAgICAgICAgICBzdHlsZS5zZXRQcm9wZXJ0eShgLS1pb24tY29sb3ItJHtjb2xvck5hbWV9LXRpbnRgLCBnZXRDb2xvclRpbnQoY29sb3IpKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gU2V0IENTUyB2YXJzXG4gICAgaWYgKG9wdGlvbnMudmFycykge1xuICAgICAgY29uc29sZS5pbmZvKCdbcGxhdGZvcm1dIENoYW5naW5nIHRoZW1lIHZhcnMgJywgb3B0aW9ucy52YXJzKTtcbiAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG9wdGlvbnMudmFycykuZm9yRWFjaCgodmFyTmFtZSkgPT4ge1xuICAgICAgICAvLyBTZXQgbmV3IHZhbHVlLCBpZiBhbnlcbiAgICAgICAgY29uc3QgdmFsdWUgPSBvcHRpb25zLnZhcnNbdmFyTmFtZV07XG4gICAgICAgIGlmIChpc05vdE5pbE9yQmxhbmsodmFsdWUpKSB7XG4gICAgICAgICAgc3R5bGUuc2V0UHJvcGVydHkodmFyTmFtZSwgdmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0eWxlLnJlbW92ZVByb3BlcnR5KHZhck5hbWUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBTZXQgZGFyayBtb2RlXG4gICAgaWYgKGlzTm90TmlsKG9wdGlvbnMuZGFya01vZGUpKSB7XG4gICAgICBhd2FpdCB0aGlzLnRvZ2dsZURhcmtUaGVtZShvcHRpb25zLmRhcmtNb2RlKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyB0b2dnbGVEYXJrVGhlbWUoZW5hYmxlOiBib29sZWFuKSB7XG4gICAgY29uc3QgY2xhc3NMaXN0ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsYXNzTGlzdDtcblxuICAgIC8vIFRvZ2dsZSB0aGUgY2xhc3NcbiAgICBjb25zdCB3YXNFbmFibGVkID0gY2xhc3NMaXN0LmNvbnRhaW5zKCdkYXJrJyk7XG4gICAgaWYgKGVuYWJsZSAhPT0gd2FzRW5hYmxlZCkge1xuICAgICAgY29uc29sZS5kZWJ1ZyhgW3BsYXRmb3JtXSAke2VuYWJsZSA/ICdFbmFibGUnIDogJ0Rpc2FibGUnfSBkYXJrIG1vZGUuLi5gKTtcbiAgICAgIGNsYXNzTGlzdC50b2dnbGUoJ2RhcmsnLCBlbmFibGUpO1xuXG4gICAgICAvLyBJZiBtb2JpbGUgKEFuZHJvaWQgb3IgaU9TKVxuICAgICAgaWYgKHRoaXMuaXNBcHAoKSAmJiAodGhpcy5pc0lPUygpIHx8IHRoaXMuaXNBbmRyb2lkKCkpKSB7XG4gICAgICAgIC8vIFJlYWQgdGhlIHByaW1hcnkgY29sb3IsIGlmIGFueVxuICAgICAgICBjb25zdCBzdHlsZSA9IGdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KTtcbiAgICAgICAgY29uc3QgcHJpbWFyeUNvbG9yID0gc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgnLS1pb24tY29sb3ItcHJpbWFyeScpPy50cmltKCk7XG4gICAgICAgIGNvbnN0IGJhY2tncm91bmRDb2xvciA9ICFwcmltYXJ5Q29sb3IgfHwgZW5hYmxlID8gJyMwMDAwMDAnIDogcHJpbWFyeUNvbG9yO1xuXG4gICAgICAgIC8vIENvbmZpZ3VyZSBzdGF0dXMgYmFyIHN0eWxlXG4gICAgICAgIGNvbnN0IHN0YXR1c0JhclN0eWxlID0gaXNMaWdodENvbG9yKGJhY2tncm91bmRDb2xvcikgPyBTdHlsZS5MaWdodCA6IFN0eWxlLkRhcms7XG4gICAgICAgIGNvbnNvbGUuZGVidWcoYFtwbGF0Zm9ybV0gU3RhdHVzQmFyIGljb25zIHN0eWxlOiAke3N0YXR1c0JhclN0eWxlfSAuLi5gKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBTdGF0dXNCYXIuc2V0U3R5bGUoeyBzdHlsZTogc3RhdHVzQmFyU3R5bGUgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1twbGF0Zm9ybV0gRXJyb3Igd2hpbGUgc2V0dGluZyBTdGF0dXNCYXIgaWNvbnMgc3R5bGUnLCBlcnIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ29uZmlndXJlIHN0YXR1cyBiYXIgYmFja2dyb3VuZCBjb2xvciAoYWx3YXlzIHVzZSBibGFjayBvbiBkYXJrIG1vZGUpXG5cbiAgICAgICAgaWYgKHRoaXMuaXNBbmRyb2lkKCkpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhgW3BsYXRmb3JtXSBFZGdlVG9FZGdlIGJhY2tncm91bmQgY29sb3I6ICR7YmFja2dyb3VuZENvbG9yfWApO1xuICAgICAgICAgICAgYXdhaXQgRWRnZVRvRWRnZS5zZXRCYWNrZ3JvdW5kQ29sb3IoeyBjb2xvcjogYmFja2dyb3VuZENvbG9yIH0pO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignW3BsYXRmb3JtXSBFcnJvciB3aGlsZSBzZXR0aW5nIEVkZ2VUb0VkZ2UgYmFja2dyb3VuZCBjb2xvcicsIGVycik7XG4gICAgICAgICAgICBhd2FpdCBTdGF0dXNCYXIuc2V0QmFja2dyb3VuZENvbG9yKHsgY29sb3I6IGJhY2tncm91bmRDb2xvciB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoYFtwbGF0Zm9ybV0gU3RhdHVzQmFyIGJhY2tncm91bmQgY29sb3I6ICR7YmFja2dyb3VuZENvbG9yfWApO1xuICAgICAgICAgICAgYXdhaXQgU3RhdHVzQmFyLnNldEJhY2tncm91bmRDb2xvcih7IGNvbG9yOiBiYWNrZ3JvdW5kQ29sb3IgfSk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdbcGxhdGZvcm1dIEVycm9yIHdoaWxlIHNldHRpbmcgU3RhdHVzQmFyIGJhY2tncm91bmQgY29sb3InLCBlcnIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHRvZ2dsZUhpZ2hDb250cmFzdChlbmFibGU6IGJvb2xlYW4pIHtcbiAgICBpZiAoZW5hYmxlICYmICFkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdoaWdoLWNvbnRyYXN0JykpIHtcbiAgICAgIGNvbnNvbGUuZGVidWcoJ1twbGF0Zm9ybV0gRW5hYmxlIGhpZ2ggY29udHJhc3QuLi4nKTtcbiAgICB9XG4gICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoJ2hpZ2gtY29udHJhc3QnLCBlbmFibGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBkZWVwIGxpbmtzIChBbmRyb2lkIEFwcCBMaW5rcyAvIGlPUyBVbml2ZXJzYWwgTGlua3MpXG4gICAqL1xuICBhc3luYyBhZGREZWVwTGlua0xpc3RlbmVyKGxpc3RlbmVyRm46IChkZXBwTGluazogeyBwZWVyVXJsOiBzdHJpbmc7IHBhdGg6IHN0cmluZyB9KSA9PiB2b2lkKTogUHJvbWlzZTxTdWJzY3JpcHRpb24+IHtcbiAgICBpZiAoIXRoaXMuaXNBcHAoKSB8fCB0eXBlb2YgbGlzdGVuZXJGbiAhPT0gJ2Z1bmN0aW9uJykgcmV0dXJuOyAvLyBTa2lwXG5cbiAgICAvLyBIYW5kbGUgZGVlcCBsaW5rcyAoQW5kcm9pZCBBcHAgTGlua3MgLyBpT1MgVW5pdmVyc2FsIExpbmtzKVxuICAgIHRyeSB7XG4gICAgICBjb25zb2xlLmluZm8oJ1twbGF0Zm9ybV0gU3RhcnQgbGlzdGVuIGRlZXAgbGlua3MnKTtcblxuICAgICAgY29uc3QgeyBBcHAgfSA9IGF3YWl0IGltcG9ydCgnQGNhcGFjaXRvci9hcHAnKTtcbiAgICAgIGNvbnN0IGxpc3RlbmVyID0gYXdhaXQgQXBwLmFkZExpc3RlbmVyKCdhcHBVcmxPcGVuJywgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnNvbGUuaW5mbyhgW3BsYXRmb3JtXSBQcm9jZXNzaW5nIGRlZXAgbGluazogJHtkYXRhPy51cmx9YCk7XG5cbiAgICAgICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKGRhdGE/LnVybCB8fCAnJyk7XG5cbiAgICAgICAgICAvLyBHZXQgdGhlIHBlZXJcbiAgICAgICAgICBjb25zdCBwZWVyID0gUGVlci5wYXJzZVVybCh1cmwpO1xuICAgICAgICAgIHBlZXIucGF0aCA9IHVuZGVmaW5lZDsgLy8gRklYTUUgV2UgY2xlYW4gdGhlIHBhdGggKD1iYXNlSHJlZikgYXMgd2UgY2Fubm90IGRldGVjdCBpdCBmcm9tIGEgZGVlcCBsaW5rXG5cbiAgICAgICAgICAvLyBCdWlsZCBhbiBhYnNvbHV0ZSBwYXRoIGZyb20gdGhlIFVSTCBwYXRobmFtZSBhbmQgc2VhcmNoXG4gICAgICAgICAgY29uc3QgcGF0aCA9IFVybFV0aWxzLmFkZFRyYWlsaW5nU2xhc2goVXJsVXRpbHMuY2xlYW5VcmwodXJsLnBhdGhuYW1lIHx8ICcvJykpO1xuICAgICAgICAgIGNvbnN0IHF1ZXJ5ID0gdXJsLnNlYXJjaCB8fCAnJztcbiAgICAgICAgICBjb25zdCBmdWxsUGF0aCA9IGAke3BhdGh9JHtxdWVyeX1gO1xuXG4gICAgICAgICAgY29uc29sZS5pbmZvKGBbcGxhdGZvcm1dIFByb2Nlc3NpbmcgZGVlcCBsaW5rIFtPS10gLSBwZWVyOiAke3BlZXIudXJsfSBwYXRoOiAke2Z1bGxQYXRofWApO1xuXG4gICAgICAgICAgLy8gQ2FsbCB0aGUgZ2l2ZW4gbGlzdGVuZXJcbiAgICAgICAgICBsaXN0ZW5lckZuKHsgcGVlclVybDogcGVlci51cmwsIHBhdGg6IGZ1bGxQYXRoIH0pO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKCdbcGxhdGZvcm1dIEZhaWxlZCB0byBoYW5kbGUgZGVlcCBsaW5rJywgZSwgZGF0YSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgbGV0IHN1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcbiAgICAgIHN1YnNjcmlwdGlvbi5hZGQoKCkgPT4ge1xuICAgICAgICBjb25zb2xlLmluZm8oJ1twbGF0Zm9ybV0gU3RvcCBsaXN0ZW4gZGVlcCBsaW5rcycpO1xuICAgICAgICBsaXN0ZW5lci5yZW1vdmUoKTtcbiAgICAgICAgdGhpcy51bnJlZ2lzdGVyU3Vic2NyaXB0aW9uKHN1YnNjcmlwdGlvbik7XG4gICAgICAgIHN1YnNjcmlwdGlvbiA9IG51bGw7IC8vIEZvcmdldCB0aGUgc3Vic2NyaXB0aW9uXG4gICAgICB9KTtcbiAgICAgIHRoaXMucmVnaXN0ZXJTdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uKTtcbiAgICAgIHJldHVybiBzdWJzY3JpcHRpb247XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1twbGF0Zm9ybV0gQ2FwYWNpdG9yIEFwcCBwbHVnaW4gbm90IGF2YWlsYWJsZSBmb3IgZGVlcCBsaW5rcycsIGVycik7XG4gICAgfVxuICB9XG5cbiAgc2hvd1RvYXN0KG9wdHM6IFNob3dUb2FzdE9wdGlvbnMpOiBQcm9taXNlPEhUTUxJb25Ub2FzdEVsZW1lbnQ+IHtcbiAgICBpZiAoIXRoaXMudG9hc3RDb250cm9sbGVyKSB0aHJvdyBuZXcgRXJyb3IoXCJNaXNzaW5nIHRvYXN0Q29udHJvbGxlciBpbiBjb21wb25lbnQncyBjb25zdHJ1Y3RvclwiKTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+XG4gICAgICBUb2FzdHMuc2hvdyh0aGlzLnRvYXN0Q29udHJvbGxlciwgdGhpcy50cmFuc2xhdGUsIHtcbiAgICAgICAgLi4ub3B0cyxcbiAgICAgICAgb25XaWxsUHJlc2VudDogKHQpID0+IHJlc29sdmUodCksXG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBhc3luYyBjbG9zZVRvYXN0KGlkPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMudG9hc3RDb250cm9sbGVyPy5kaXNtaXNzKG51bGwsIG51bGwsIGlkKTtcbiAgfVxuXG4gIC8qIC0tIHByb3RlY3RlZCBtZXRob2RzIC0tICovXG5cbiAgcHJvdGVjdGVkIGFzeW5jIGNvbmZpZ3VyZVRoZW1lKG1vYmlsZTogYm9vbGVhbiwgd2luOiBhbnkgPSB3aW5kb3cpIHtcbiAgICAvLyBMaXN0ZW4gZm9yIGNoYW5nZXMgdG8gc2V0dGluZ3MgZGFyayBtb2RlXG4gICAgaWYgKHRoaXMuZW52aXJvbm1lbnQuYWxsb3dEYXJrTW9kZSkge1xuICAgICAgY29uc3QgaXNTY3JlZW4kID0gbmV3IE9ic2VydmFibGU8Ym9vbGVhbj4oKG9ic2VydmVyKSA9PiB7XG4gICAgICAgIGNvbnN0IG1hdGNoTWVkaWEgPSB3aW4ubWF0Y2hNZWRpYSgnc2NyZWVuJyk7XG4gICAgICAgIG1hdGNoTWVkaWEuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKGUpID0+IG9ic2VydmVyLm5leHQoZS5tYXRjaGVzKSk7XG4gICAgICAgIG9ic2VydmVyLm5leHQobWF0Y2hNZWRpYS5tYXRjaGVzKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5yZWdpc3RlclN1YnNjcmlwdGlvbihcbiAgICAgICAgY29tYmluZUxhdGVzdChbaXNTY3JlZW4kLCB0aGlzLnNldHRpbmdzLmRhcmtNb2RlJF0pLnN1YnNjcmliZSgoW2lzU2NyZWVuLCBlbmFibGVdKSA9PiB0aGlzLnRvZ2dsZURhcmtUaGVtZShpc1NjcmVlbiAmJiBlbmFibGUpKVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgdGhpcy50b2dnbGVEYXJrVGhlbWUoZmFsc2UpO1xuICAgIH1cblxuICAgIC8vIFdvcmthcm91bmQsIGZvciBNUyBXaW5kb3dzIHRvdWNoIHNjcmVlbiAoZGV0ZWN0ZWQgYXMgbW9iaWxlLCBidXQgZm9yY2VkIGFzIGRlc2t0b3ApXG4gICAgaWYgKFxuICAgICAgIW1vYmlsZSAmJlxuICAgICAgKHdpbi5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ/LmNsYXNzTGlzdC5jb250YWlucygncGx0LW1vYmlsZScpIHx8IHdpbi5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xhc3NMaXN0Py5jb250YWlucygncGx0LW1vYmlsZXdlYicpKVxuICAgICkge1xuICAgICAgY29uc29sZS53YXJuKCdbcGxhdGZvcm1dIEZvcmNlIGNsYXNzIGxpc3QgdG86IDxodG1sIGNsYXNzPVwicGx0LWRlc2t0b3BcIj4uIFdvcmthcm91bmQgZm9yIFdpbmRvd3MgdG91Y2ggc2NyZWVuLicpO1xuICAgICAgd2luLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdwbHQtbW9iaWxlJywgJ3BsdC1tb2JpbGV3ZWInKTtcbiAgICAgIHdpbi5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgncGx0LWRlc2t0b3AnKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgY29uZmlndXJlQ2FwYWNpdG9yUGx1Z2lucygpIHtcbiAgICBpZiAoIXRoaXMuX2NhcGFjaXRvcikgcmV0dXJuOyAvLyBTa2lwXG5cbiAgICBjb25zb2xlLmluZm8oJ1twbGF0Zm9ybV0gQ29uZmlndXJpbmcgQ2FwYWNpdG9yIHBsdWdpbnMuLi4nKTtcblxuICAgIGxldCBwbHVnaW5OYW1lOiBzdHJpbmc7XG4gICAgdHJ5IHtcbiAgICAgIHBsdWdpbk5hbWUgPSBDYXBhY2l0b3JQbHVnaW5zLkVkZ2VUb0VkZ2U7XG4gICAgICBpZiAodGhpcy5pc0FwcCgpICYmIHRoaXMuaXNBbmRyb2lkKCkpIHtcbiAgICAgICAgYXdhaXQgRWRnZVRvRWRnZS5lbmFibGUoKTtcbiAgICAgIH1cblxuICAgICAgcGx1Z2luTmFtZSA9IENhcGFjaXRvclBsdWdpbnMuU3RhdHVzQmFyO1xuICAgICAgaWYgKHRoaXMuaXNBcHAoKSkge1xuICAgICAgICAvLyBBdm9pZCBvdmVybGF5cyAoQW5kcm9pZCAxNSBvciBpT1MpXG4gICAgICAgIGF3YWl0IFN0YXR1c0Jhci5zZXRPdmVybGF5c1dlYlZpZXcoeyBvdmVybGF5OiBmYWxzZSB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gSGlkZSBhY2Nlc3NvcnkgYmFyIChpT1Mgb25seSlcbiAgICAgIGlmICh0aGlzLmlzQXBwKCkgJiYgdGhpcy5pc0lPUygpKSB7XG4gICAgICAgIHBsdWdpbk5hbWUgPSBDYXBhY2l0b3JQbHVnaW5zLktleWJvYXJkO1xuICAgICAgICBhd2FpdCBLZXlib2FyZC5zZXRBY2Nlc3NvcnlCYXJWaXNpYmxlKHsgaXNWaXNpYmxlOiBmYWxzZSB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnN0IGxvZ01lc3NhZ2UgPSBgRXJyb3Igd2hpbGUgY29uZmlndXJpbmcgJHtwbHVnaW5OYW1lfSBwbHVnaW46ICR7ZXJyLm1lc3NhZ2UgfHwgZXJyfVxcbiR7ZXJyPy5vcmlnaW5hbFN0YWNrIHx8IEpTT04uc3RyaW5naWZ5KGVycil9YDtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1twbGF0Zm9ybV0gJyArIGxvZ01lc3NhZ2UpO1xuICAgICAgdGhpcy5fbG9nZ2VyPy5lcnJvcignY29uZmlndXJlQ2FwYWNpdG9yUGx1Z2lucycsIGxvZ01lc3NhZ2UpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBjb25maWd1cmVUcmFuc2xhdGUoKSB7XG4gICAgY29uc29sZS5pbmZvKCdbcGxhdGZvcm1dIENvbmZpZ3VyaW5nIGkxOG4gLi4uJyk7XG5cbiAgICAvLyB0aGlzIGxhbmd1YWdlIHdpbGwgYmUgdXNlZCBhcyBhIGZhbGxiYWNrIHdoZW4gYSB0cmFuc2xhdGlvbiBpc24ndCBmb3VuZCBpbiB0aGUgY3VycmVudCBsYW5ndWFnZVxuICAgIHRoaXMudHJhbnNsYXRlLnNldERlZmF1bHRMYW5nKHRoaXMuZW52aXJvbm1lbnQuZGVmYXVsdExvY2FsZSk7XG4gICAgLy8gYXBwbHkgbG9jYWxlIGltbWVkaWF0ZWx5XG4gICAgdGhpcy5hcHBseUxvY2FsZSh0aGlzLmVudmlyb25tZW50LmRlZmF1bHRMb2NhbGUpO1xuXG4gICAgLy8gV2hlbiBsb2NhbGUgY2hhbmdlcywgYXBwbHkgdG8gZGF0ZSBhZGFwdGVyXG4gICAgdGhpcy5yZWdpc3RlclN1YnNjcmlwdGlvbihcbiAgICAgIHRoaXMudHJhbnNsYXRlLm9uTGFuZ0NoYW5nZS5zdWJzY3JpYmUoKGV2ZW50KSA9PiB7XG4gICAgICAgIGlmIChldmVudCAmJiBldmVudC5sYW5nKSB7XG4gICAgICAgICAgdGhpcy5hcHBseUxvY2FsZShldmVudC5sYW5nKTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuXG4gICAgdGhpcy5yZWdpc3RlclN1YnNjcmlwdGlvbihcbiAgICAgIHRoaXMuc2V0dGluZ3Mub25DaGFuZ2Uuc3Vic2NyaWJlKChkYXRhKSA9PiB7XG4gICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgLy8gQXBwbHkgbG9jYWxlXG4gICAgICAgICAgaWYgKGRhdGEubG9jYWxlKSB7XG4gICAgICAgICAgICBpZiAoZGF0YS5sb2NhbGUgIT09IHRoaXMudHJhbnNsYXRlLmN1cnJlbnRMYW5nKSB7XG4gICAgICAgICAgICAgIHRoaXMudHJhbnNsYXRlLnVzZShkYXRhLmxvY2FsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIEFwcGx5aW5nIGRlZmF1bHQsIHdoZW4gc2V0dGluZ3MgaGFzIG5vIGxvY2FsZSBwcm9wZXJ0eSAoaG90Zml4IC0gbHVkb3ZpYy5wZWNxdW90QGUtaXMucHJvIC0gMTQvMTEvMjAyMSAtIHNpbmNlIHYxLjIwLjQyKVxuICAgICAgICAgICAgY29uc29sZS53YXJuKCdbcGxhdGZvcm1dIE5vIGxvY2FsZSBmb3VuZCBpbiBzZXR0aW5nczogYXBwbHlpbmcgZGVmYXVsdExvY2FsZTogJywgdGhpcy5lbnZpcm9ubWVudC5kZWZhdWx0TG9jYWxlKTtcbiAgICAgICAgICAgIHRoaXMudHJhbnNsYXRlLnVzZSh0aGlzLmVudmlyb25tZW50LmRlZmF1bHRMb2NhbGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuXG4gICAgLy8gVXNlIGFjY291bnQncyBzZXR0aW5ncywgKGxpa2UgbG9jYWxlKSwgd2hlbiBhY2NvdW50IGluaGVyaXRhbmNlIGVuYWJsZWRcbiAgICB0aGlzLnJlZ2lzdGVyU3Vic2NyaXB0aW9uKFxuICAgICAgdGhpcy5hY2NvdW50U2VydmljZS5vbkxvZ2luLnN1YnNjcmliZShhc3luYyAoYWNjb3VudCkgPT4ge1xuICAgICAgICBpZiAoYWNjb3VudC5zZXR0aW5ncyAmJiB0aGlzLnNldHRpbmdzLnNldHRpbmdzLmFjY291bnRJbmhlcml0YW5jZSkge1xuICAgICAgICAgIGNvbnNvbGUuZGVidWcoJ1twbGF0Zm9ybV0gQ29weWluZyBhY2NvdW50IHNldHRpbmdzIGludG8gbG9jYWwgc2V0dGluZ3MuLi4nKTtcbiAgICAgICAgICBhd2FpdCB0aGlzLnNldHRpbmdzLmFwcGx5KGFjY291bnQuc2V0dGluZ3MuYXNMb2NhbFNldHRpbmdzKCkpO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXBwbHlMb2NhbGUobG9jYWxlOiBzdHJpbmcpIHtcbiAgICAvLyBmb3JjZSAnZW4nIGFzICdlbl9HQidcbiAgICBpZiAobG9jYWxlID09PSAnZW4nKSB7XG4gICAgICBsb2NhbGUgPSAnZW5fR0InO1xuICAgIH1cblxuICAgIC8vIGNvbmZpZyBtb21lbnQgbGliXG4gICAgdHJ5IHtcbiAgICAgIG1vbWVudExvY2FsZShsb2NhbGUpO1xuICAgICAgY29uc29sZS5kZWJ1ZygnW3BsYXRmb3JtXSBVc2UgbG9jYWxlIHsnICsgbG9jYWxlICsgJ30nKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8vIElmIGVycm9yLCBmYWxsYmFjayB0byBlblxuICAgICAgbW9tZW50TG9jYWxlKCdlbicpO1xuICAgICAgY29uc29sZS53YXJuKCdbcGxhdGZvcm1dIFVua25vd24gbG9jYWxlIGZvciBtb21lbnQgbGliLiBVc2luZyBkZWZhdWx0IFtlbl0nKTtcbiAgICB9XG5cbiAgICAvLyBDb25maWcgZGF0ZSBhZGFwdGVyXG4gICAgdGhpcy5kYXRlQWRhcHRlci5zZXRMb2NhbGUobW9tZW50TG9jYWxlKCkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNvbmZpZ3VyZUNhY2hlKG9ubGluZT86IGJvb2xlYW4pIHtcbiAgICBvbmxpbmUgPSB0b0Jvb2xlYW4ob25saW5lLCB0aGlzLmNhY2hlLmlzT25saW5lKCkpO1xuICAgIGNvbnN0IGNhY2hlVFRMID0gb25saW5lID8gMzYwMCAvKiAxaCAqLyA6IDM2MDAgKiAyNCAqIDMwOyAvKiAxIG1vbnRoICovXG4gICAgY29uc29sZS5pbmZvKGBbcGxhdGZvcm1dIENvbmZpZ3VyaW5nIGNhY2hlIFtPS10ge29ubGluZTogJHtvbmxpbmV9LCB0aW1lVG9MaXZlOiAke2NhY2hlVFRMIC8gMzYwMH1oLCBvZmZsaW5lSW52YWxpZGF0ZTogZmFsc2V9YCk7XG4gICAgdGhpcy5jYWNoZS5zZXREZWZhdWx0VFRMKGNhY2hlVFRMKTtcbiAgICB0aGlzLmNhY2hlLnNldE9mZmxpbmVJbnZhbGlkYXRlKGZhbHNlKTsgLy8gRG8gbm90IGludmFsaWRhdGUgY2FjaGUgd2hlbiBvZmZsaW5lXG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgY2hlY2tBcHBWZXJzaW9uKG9wdHM/OiB7IGNhblJlbG9hZD86IGJvb2xlYW47IHNpbGVudD86IGJvb2xlYW4gfSkge1xuICAgIGlmICh0aGlzLm5ldHdvcmtTZXJ2aWNlLm9mZmxpbmUgfHwgIXRoaXMuaXNXZWIoKSkgcmV0dXJuOyAvLyBTa2lwXG5cbiAgICBjb25zdCBzaWxlbnQgPSBvcHRzPy5zaWxlbnQgPT09IHRydWU7XG4gICAgY29uc3QgcHJvZHVjdGlvbiA9IHRoaXMuZW52aXJvbm1lbnQucHJvZHVjdGlvbjtcbiAgICBjb25zdCBjYW5BdXRvUmVsb2FkID0gIW9wdHMgfHwgb3B0cy5jYW5SZWxvYWQgIT09IGZhbHNlO1xuXG4gICAgaWYgKCFzaWxlbnQpIGNvbnNvbGUuaW5mbygnW3BsYXRmb3JtXSBDaGVja2luZyByZW1vdGUgYXBwIHZlcnNpb24uLi4nKTtcblxuICAgIGNvbnN0IGFjdHVhbFZlcnNpb24gPSB0aGlzLmVudmlyb25tZW50LnZlcnNpb247XG4gICAgaWYgKGlzTmlsT3JCbGFuayhhY3R1YWxWZXJzaW9uKSkge1xuICAgICAgY29uc29sZS5lcnJvcihcIltwbGF0Zm9ybV0gTWlzc2luZyByZXF1aXJlZCB2YWx1ZSBmb3IgJ2Vudmlyb25tZW50LnZlcnNpb24nLiBDYW5ub3QgY2hlY2sgcmVtb3RlIGFwcCB2ZXJzaW9uLlwiKTtcbiAgICAgIHRoaXMuY2hlY2tBcHBWZXJzaW9uVGltZXI/LnVuc3Vic2NyaWJlKCk7IC8vIFN0b3AgdGltZXIgaWYgZXhpc3RzXG4gICAgICByZXR1cm47IC8vIFNraXBcbiAgICB9XG5cbiAgICBjb25zdCByZW1vdGVWZXJzaW9uID0gKGF3YWl0IHRoaXMubmV0d29ya1NlcnZpY2UuZ2V0QXBwVmVyc2lvbih0aGlzLmFwcEJhc2VIcmVmKSkudHJpbSgpO1xuICAgIGlmIChpc05pbE9yQmxhbmsocmVtb3RlVmVyc2lvbikpIHtcbiAgICAgIGlmIChwcm9kdWN0aW9uICYmICFzaWxlbnQpIGNvbnNvbGUuZXJyb3IoJ1twbGF0Zm9ybV0gQ2Fubm90IGxvYWQgcmVtb3RlIGFwcCB2ZXJzaW9uLiBTa2lwcGluZyB2ZXJzaW9uIGNoZWNrJyk7XG4gICAgICB0aGlzLmNoZWNrQXBwVmVyc2lvblRpbWVyPy51bnN1YnNjcmliZSgpOyAvLyBTdG9wIHRpbWVyIGlmIGV4aXN0c1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChWZXJzaW9uVXRpbHMuaXNDb21wYXRpYmxlKHJlbW90ZVZlcnNpb24sIGFjdHVhbFZlcnNpb24pKSB7XG4gICAgICBpZiAoIXNpbGVudCkgY29uc29sZS5pbmZvKGBbcGxhdGZvcm1dIENoZWNraW5nIHJlbW90ZSBhcHAgdmVyc2lvbiBbT0tdIHtyZW1vdGU6ICcke3JlbW90ZVZlcnNpb259JywgYWN0dWFsOiAnJHthY3R1YWxWZXJzaW9ufSd9YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gSWYgbmV3ZXIgdmVyc2lvbiBleGlzdHNcbiAgICBsZXQgcmVsb2FkUGF0aCA9IGxvY2F0aW9uLmhyZWYucmVwbGFjZSgvWyY/XXZlcnNpb249W14mXSovZ2ksICcnKTsgLy8gUmVtb3ZlIG9sZCB2ZXJzaW9uIGluIHF1ZXJ5IHBhcmFtc1xuICAgIHJlbG9hZFBhdGggKz0gcmVsb2FkUGF0aC5pbmRleE9mKCc/JykgPT09IC0xID8gJz8nIDogJyYnOyAvLyBBZGQgcXVlcnkgcGFyYW0gc2VwYXJhdG9yXG4gICAgcmVsb2FkUGF0aCArPSAndmVyc2lvbj0nICsgcmVtb3RlVmVyc2lvbjsgLy8gQWRkIHZlcnNpb24gKHRvIGF2b2lkIGEgcmVsb2FkIGluZmluaXRlIGxvb3ApXG5cbiAgICAvLyBBbHJlYWR5IHRyeSB0byByZWxvYWQsIGJ1dCB2ZXJzaW9uIHN0aWxsIGJhZFxuICAgIGlmIChyZWxvYWRQYXRoID09PSBsb2NhdGlvbi5ocmVmKSB7XG4gICAgICBpZiAoY2FuQXV0b1JlbG9hZClcbiAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICBgW3BsYXRmb3JtXSBSZWxvYWRlZCBwYWdlIGZhaWxlZCwgYmVjYXVzZSB2ZXJzaW9uIHN0aWxsIG1pc21hdGNoISBQbGVhc2UgY2hlY2sgdmVyc2lvbi5hcHB1cCBmaWxlIChleHBlY3RlZCBhcHAgdmVyc2lvbjogJHthY3R1YWxWZXJzaW9ufSlgXG4gICAgICAgICk7XG4gICAgICAvLyBTdG9wIHRpbWVyLCB0byBhdm9pZCBpbmZpbml0ZSBsb29wXG4gICAgICB0aGlzLmNoZWNrQXBwVmVyc2lvblRpbWVyPy51bnN1YnNjcmliZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnNvbGUud2FybihgW3BsYXRmb3JtXSBNb3JlIHJlY2VudCB2ZXJzaW9uIGRldGVjdGVkIChyZW1vdGU6ICR7cmVtb3RlVmVyc2lvbn0sIGFjdHVhbDogJHthY3R1YWxWZXJzaW9ufWApO1xuXG4gICAgLy8gQXV0byByZWxvYWRcbiAgICBpZiAoY2FuQXV0b1JlbG9hZCkge1xuICAgICAgY29uc29sZS5pbmZvKCdbcGxhdGZvcm1dIFdpbGwgcmVsb2FkaW5nIGF0ICcgKyByZWxvYWRQYXRoKTtcbiAgICAgIGxvY2F0aW9uLmhyZWYgPSByZWxvYWRQYXRoO1xuICAgICAgLy8gQXBwIHN0b3BcbiAgICB9XG4gICAgLy8gQXNrIHVzZXIgdG8gcmVsb2FkXG4gICAgZWxzZSB7XG4gICAgICAvLyBTdG9wIHRpbWVyLCB0byBhdm9pZCBpbmZpbml0ZSBsb29wXG4gICAgICB0aGlzLmNoZWNrQXBwVmVyc2lvblRpbWVyPy51bnN1YnNjcmliZSgpO1xuXG4gICAgICAvLyBEaXNwbGF5IGEgcmVsb2FkIHRvYXN0XG4gICAgICBhd2FpdCB0aGlzLnNob3dUb2FzdCh7XG4gICAgICAgIG1lc3NhZ2U6ICdDT05GSVJNLlJFTE9BRF9BUFAnLFxuICAgICAgICBtZXNzYWdlUGFyYW1zOiB7IHZlcnNpb246IHJlbW90ZVZlcnNpb24sIG5hbWU6IHRoaXMuZW52aXJvbm1lbnQubmFtZSB9LFxuICAgICAgICB0eXBlOiAnaW5mbycsXG4gICAgICAgIGR1cmF0aW9uOiAtMSxcbiAgICAgICAgc2hvd0Nsb3NlQnV0dG9uOiB0cnVlLFxuICAgICAgICBidXR0b25zOiBbXG4gICAgICAgICAgLy8gUmVsb2FkIGJ1dHRvblxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRleHQ6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ0NPTU1PTi5CVE5fVVBEQVRFJyksXG4gICAgICAgICAgICBzaWRlOiAnZW5kJyxcbiAgICAgICAgICAgIGhhbmRsZXI6ICgpID0+IHtcbiAgICAgICAgICAgICAgbG9jYXRpb24uaHJlZiA9IHJlbG9hZFBhdGg7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIG9uU3RhcnR1cEVycm9yKGVycikge1xuICAgIGNvbnNvbGUuZXJyb3IoJ1twbGF0Zm9ybV0gRmFpbGVkIHN0YXJ0aW5nIHRoZSBwbGF0Zm9ybSEgJyArIEpTT04uc3RyaW5naWZ5KGVycikpO1xuICAgIGxldCBtZXNzYWdlID0gKGVyciAmJiBlcnIubWVzc2FnZSkgfHwgZXJyO1xuICAgIGNvbnN0IGRldGFpbHNNZXNzYWdlID0gZXJyICYmICgoZXJyLmRldGFpbHMgJiYgZXJyLmRldGFpbHMubWVzc2FnZSkgfHwgZXJyLmRldGFpbHMpO1xuICAgIC8vIFNldCBzcGVjaWZpYyBlcnJvciB3aGVuIEZpcmVmb3ggaXMgaW4gcHJpdmF0ZSBtb2RlIG9yIGhpc3RvcnkgbmV2ZXIgcmVtZW1iZXJlZCAoc2VlIE1hbnRpcyBJZnJlbWVyICM1NjQ0MSlcbiAgICBpZiAoZXJyLmNvZGUgPT09IDExICYmIHRoaXMuY2RrUGxhdGZvcm0uRklSRUZPWCkge1xuICAgICAgbWVzc2FnZSA9ICdFUlJPUi5GSVJFRk9YX05PX1NUT1JBR0UnO1xuICAgIH1cbiAgICBpZiAodGhpcy50cmFuc2xhdGUpIHtcbiAgICAgIG1lc3NhZ2UgPSBhd2FpdCB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KG1lc3NhZ2UpO1xuICAgICAgaWYgKGVyciAmJiBlcnIuY29kZSkge1xuICAgICAgICBtZXNzYWdlICs9IGAge2NvZGU6ICR7ZXJyLmNvZGV9fWA7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG1lc3NhZ2UgPSBgRmF0YWwgZXJyb3I6IFBsZWFzZSBjb250YWN0IHlvdXIgYWRtaW5pc3RyYXRvci5cXG5cXG57Y29kZTogJHsoZXJyICYmIGVyci5jb2RlKSB8fCAnbnVsbCd9LCBtZXNzYWdlOiBcIiR7bWVzc2FnZX1cIn1gO1xuICAgIH1cbiAgICBpZiAodGhpcy50b2FzdENvbnRyb2xsZXIpIHtcbiAgICAgIGlmIChkZXRhaWxzTWVzc2FnZSkge1xuICAgICAgICBtZXNzYWdlICs9IGA8YnIvPjxzbWFsbD4ke2RldGFpbHNNZXNzYWdlfTwvc21hbGw+YDtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHRoaXMuc2hvd1RvYXN0KHtcbiAgICAgICAgdHlwZTogJ2Vycm9yJyxcbiAgICAgICAgZHVyYXRpb246IC0xLFxuICAgICAgICBzaG93Q2xvc2VCdXR0b246IHRydWUsXG4gICAgICAgIG1lc3NhZ2UsXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHdpbmRvdykge1xuICAgICAgaWYgKGRldGFpbHNNZXNzYWdlKSB7XG4gICAgICAgIG1lc3NhZ2UgKz0gYFxcblxcbntjYXVzZTogXCIke2RldGFpbHNNZXNzYWdlfVwifWA7XG4gICAgICB9XG4gICAgICB3aW5kb3cuYWxlcnQobWVzc2FnZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IobWVzc2FnZSk7XG4gICAgICBpZiAoZXJyICYmIGVyci5kZXRhaWxzKSBjb25zb2xlLmVycm9yKCdjYXVzZScsIGVyci5kZXRhaWxzKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==