@sumaris-net/ngx-components 2.6.4-alpha3 → 2.6.4-alpha5

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 (1180) hide show
  1. package/.editorconfig +24 -0
  2. package/.eslintrc.json +74 -0
  3. package/.gitattribute +1 -0
  4. package/.github/CONTRIBUTING.md +10 -0
  5. package/.github/ISSUE_TEMPLATE.md +6 -0
  6. package/.github/PULL_REQUEST_TEMPLATE.md +10 -0
  7. package/.github/github_disclaimer.md +14 -0
  8. package/.gitlab-ci.yml +46 -0
  9. package/.graphqlconfig +15 -0
  10. package/angular.json +230 -0
  11. package/capacitor.config.json +9 -0
  12. package/ionic.config.json +7 -0
  13. package/karma.conf.js +32 -0
  14. package/ng-package.json +19 -0
  15. package/ngcc.config.js +14 -0
  16. package/package.json +137 -23
  17. package/public_api.ts +343 -0
  18. package/resources/android/build/tools/android-accept-licenses.sh +14 -0
  19. package/resources/android/icon/drawable-hdpi-icon.png +0 -0
  20. package/resources/android/icon/drawable-ldpi-icon.png +0 -0
  21. package/resources/android/icon/drawable-mdpi-icon.png +0 -0
  22. package/resources/android/icon/drawable-xhdpi-icon.png +0 -0
  23. package/resources/android/icon/drawable-xxhdpi-icon.png +0 -0
  24. package/resources/android/icon/drawable-xxxhdpi-icon.png +0 -0
  25. package/resources/android/splash/drawable-land-hdpi-screen.png +0 -0
  26. package/resources/android/splash/drawable-land-ldpi-screen.png +0 -0
  27. package/resources/android/splash/drawable-land-mdpi-screen.png +0 -0
  28. package/resources/android/splash/drawable-land-xhdpi-screen.png +0 -0
  29. package/resources/android/splash/drawable-land-xxhdpi-screen.png +0 -0
  30. package/resources/android/splash/drawable-land-xxxhdpi-screen.png +0 -0
  31. package/resources/android/splash/drawable-port-hdpi-screen.png +0 -0
  32. package/resources/android/splash/drawable-port-ldpi-screen.png +0 -0
  33. package/resources/android/splash/drawable-port-mdpi-screen.png +0 -0
  34. package/resources/android/splash/drawable-port-xhdpi-screen.png +0 -0
  35. package/resources/android/splash/drawable-port-xxhdpi-screen.png +0 -0
  36. package/resources/android/splash/drawable-port-xxxhdpi-screen.png +0 -0
  37. package/resources/android/splash/drawable-xxxhdpi-screen.png +0 -0
  38. package/resources/icon/TODO.md +11 -0
  39. package/resources/icon.png +0 -0
  40. package/resources/icon.png.md5 +1 -0
  41. package/resources/icon.xcf +0 -0
  42. package/resources/ios/icon/icon-1024.png +0 -0
  43. package/resources/ios/icon/icon-108@2x.png +0 -0
  44. package/resources/ios/icon/icon-20.png +0 -0
  45. package/resources/ios/icon/icon-20@2x.png +0 -0
  46. package/resources/ios/icon/icon-20@3x.png +0 -0
  47. package/resources/ios/icon/icon-24@2x.png +0 -0
  48. package/resources/ios/icon/icon-27.5@2x.png +0 -0
  49. package/resources/ios/icon/icon-29.png +0 -0
  50. package/resources/ios/icon/icon-29@2x.png +0 -0
  51. package/resources/ios/icon/icon-29@3x.png +0 -0
  52. package/resources/ios/icon/icon-40.png +0 -0
  53. package/resources/ios/icon/icon-40@2x.png +0 -0
  54. package/resources/ios/icon/icon-40@3x.png +0 -0
  55. package/resources/ios/icon/icon-44@2x.png +0 -0
  56. package/resources/ios/icon/icon-50.png +0 -0
  57. package/resources/ios/icon/icon-50@2x.png +0 -0
  58. package/resources/ios/icon/icon-60.png +0 -0
  59. package/resources/ios/icon/icon-60@2x.png +0 -0
  60. package/resources/ios/icon/icon-60@3x.png +0 -0
  61. package/resources/ios/icon/icon-72.png +0 -0
  62. package/resources/ios/icon/icon-72@2x.png +0 -0
  63. package/resources/ios/icon/icon-76.png +0 -0
  64. package/resources/ios/icon/icon-76@2x.png +0 -0
  65. package/resources/ios/icon/icon-83.5@2x.png +0 -0
  66. package/resources/ios/icon/icon-86@2x.png +0 -0
  67. package/resources/ios/icon/icon-98@2x.png +0 -0
  68. package/resources/ios/icon/icon-small.png +0 -0
  69. package/resources/ios/icon/icon-small@2x.png +0 -0
  70. package/resources/ios/icon/icon-small@3x.png +0 -0
  71. package/resources/ios/icon/icon.png +0 -0
  72. package/resources/ios/icon/icon@2x.png +0 -0
  73. package/resources/ios/splash/Default-1792h~iphone.png +0 -0
  74. package/resources/ios/splash/Default-2436h.png +0 -0
  75. package/resources/ios/splash/Default-2688h~iphone.png +0 -0
  76. package/resources/ios/splash/Default-568h@2x~iphone.png +0 -0
  77. package/resources/ios/splash/Default-667h.png +0 -0
  78. package/resources/ios/splash/Default-736h.png +0 -0
  79. package/resources/ios/splash/Default-Landscape-1792h~iphone.png +0 -0
  80. package/resources/ios/splash/Default-Landscape-2436h.png +0 -0
  81. package/resources/ios/splash/Default-Landscape-2688h~iphone.png +0 -0
  82. package/resources/ios/splash/Default-Landscape-736h.png +0 -0
  83. package/resources/ios/splash/Default-Landscape@2x~ipad.png +0 -0
  84. package/resources/ios/splash/Default-Landscape@~ipadpro.png +0 -0
  85. package/resources/ios/splash/Default-Landscape~ipad.png +0 -0
  86. package/resources/ios/splash/Default-Portrait@2x~ipad.png +0 -0
  87. package/resources/ios/splash/Default-Portrait@~ipadpro.png +0 -0
  88. package/resources/ios/splash/Default-Portrait~ipad.png +0 -0
  89. package/resources/ios/splash/Default@2x~iphone.png +0 -0
  90. package/resources/ios/splash/Default@2x~universal~anyany.png +0 -0
  91. package/resources/ios/splash/Default~iphone.png +0 -0
  92. package/resources/splash.png +0 -0
  93. package/resources/splash.png.md5 +1 -0
  94. package/scripts/build-android.sh +18 -0
  95. package/scripts/build-i18n.js +24 -0
  96. package/scripts/docker-start.sh +6 -0
  97. package/scripts/emulate-android.sh +17 -0
  98. package/scripts/env-android.sh +83 -0
  99. package/scripts/env-clean.sh +23 -0
  100. package/scripts/env-global.sh +156 -0
  101. package/scripts/install-android-sdk-tools.sh +73 -0
  102. package/scripts/ionic-update.sh +24 -0
  103. package/scripts/node/playground.ts +9 -0
  104. package/scripts/node/resources.js +90 -0
  105. package/scripts/release.sh +149 -0
  106. package/scripts/run-android.sh +59 -0
  107. package/scripts/test.sh +19 -0
  108. package/src/app/admin/admin-routing.module.ts +30 -0
  109. package/src/app/admin/admin.module.ts +23 -0
  110. package/src/app/admin/services/filter/person.filter.ts +77 -0
  111. package/src/app/admin/services/person.service.ts +212 -0
  112. package/src/app/admin/services/validator/person.validator.ts +37 -0
  113. package/src/app/admin/users/users.html +427 -0
  114. package/src/app/admin/users/users.module.ts +34 -0
  115. package/src/app/admin/users/users.scss +59 -0
  116. package/src/app/admin/users/users.ts +257 -0
  117. package/src/app/app-routing.module.ts +126 -0
  118. package/src/app/app.component.html +12 -0
  119. package/src/app/app.component.scss +4 -0
  120. package/src/app/app.component.ts +205 -0
  121. package/src/app/app.module.ts +326 -0
  122. package/src/app/core/about/about.modal.html +140 -0
  123. package/src/app/core/about/about.modal.scss +23 -0
  124. package/src/app/core/about/about.modal.ts +71 -0
  125. package/src/app/core/about/about.module.ts +24 -0
  126. package/src/app/core/account/account.module.ts +38 -0
  127. package/src/app/core/account/account.page.html +241 -0
  128. package/src/app/core/account/account.page.scss +21 -0
  129. package/src/app/core/account/account.page.ts +366 -0
  130. package/src/app/core/account/new-token.modal.html +120 -0
  131. package/src/app/core/account/new-token.modal.ts +138 -0
  132. package/src/app/core/account/token.table.html +177 -0
  133. package/src/app/core/account/token.table.scss +7 -0
  134. package/src/app/core/account/token.table.ts +141 -0
  135. package/src/app/core/auth/auth.form.html +77 -0
  136. package/src/app/core/auth/auth.form.scss +1 -0
  137. package/src/app/core/auth/auth.form.ts +145 -0
  138. package/src/app/core/auth/auth.modal.html +57 -0
  139. package/src/app/core/auth/auth.modal.scss +1 -0
  140. package/src/app/core/auth/auth.modal.ts +80 -0
  141. package/src/app/core/auth/auth.module.ts +33 -0
  142. package/src/app/core/core.module.ts +100 -0
  143. package/src/app/core/core.testing.module.ts +64 -0
  144. package/src/app/core/form/buttons/form-buttons-bar.component.html +59 -0
  145. package/src/app/core/form/buttons/form-buttons-bar.component.scss +14 -0
  146. package/src/app/core/form/buttons/form-buttons-bar.component.ts +70 -0
  147. package/src/app/core/form/buttons/form-buttons-bar.module.ts +24 -0
  148. package/src/app/core/form/entity/editor.class.ts +803 -0
  149. package/src/app/core/form/entity/entity-editor-modal.class.ts +537 -0
  150. package/src/app/core/form/entity/entity-editor.class.ts +885 -0
  151. package/src/app/core/form/entity/entity-metadata.component.html +53 -0
  152. package/src/app/core/form/entity/entity-metadata.component.scss +28 -0
  153. package/src/app/core/form/entity/entity-metadata.component.ts +19 -0
  154. package/src/app/core/form/entity/entity.module.ts +25 -0
  155. package/src/app/core/form/form.class.ts +401 -0
  156. package/src/app/core/form/form.module.ts +37 -0
  157. package/src/app/core/form/form.utils.ts +639 -0
  158. package/src/app/core/form/list/list.form.html +67 -0
  159. package/src/app/core/form/list/list.form.scss +40 -0
  160. package/src/app/core/form/list/list.form.ts +278 -0
  161. package/src/app/core/form/list/list.module.ts +25 -0
  162. package/src/app/core/form/properties/properties.form.html +129 -0
  163. package/src/app/core/form/properties/properties.form.ts +147 -0
  164. package/src/app/core/form/properties/properties.module.ts +30 -0
  165. package/src/app/core/form/properties/properties.table.html +219 -0
  166. package/src/app/core/form/properties/properties.table.scss +0 -0
  167. package/src/app/core/form/properties/properties.table.ts +291 -0
  168. package/src/app/core/form/properties/property.validator.ts +22 -0
  169. package/src/app/core/form/properties/testing/properties-form.test.html +21 -0
  170. package/src/app/core/form/properties/testing/properties-form.test.ts +102 -0
  171. package/src/app/core/form/properties/testing/properties-form.testing.module.ts +25 -0
  172. package/src/app/core/form/text-popover/testing/text-popover.testing.html +45 -0
  173. package/src/app/core/form/text-popover/testing/text-popover.testing.module.ts +32 -0
  174. package/src/app/core/form/text-popover/testing/text-popover.testing.ts +77 -0
  175. package/src/app/core/form/text-popover/text-form.component.html +44 -0
  176. package/src/app/core/form/text-popover/text-form.component.scss +8 -0
  177. package/src/app/core/form/text-popover/text-form.component.ts +65 -0
  178. package/src/app/core/form/text-popover/text-popover.component.html +86 -0
  179. package/src/app/core/form/text-popover/text-popover.component.scss +7 -0
  180. package/src/app/core/form/text-popover/text-popover.component.ts +165 -0
  181. package/src/app/core/form/text-popover/text-popover.module.ts +27 -0
  182. package/src/app/core/graphql/graphql.module.ts +17 -0
  183. package/src/app/core/graphql/graphql.service.ts +969 -0
  184. package/src/app/core/graphql/graphql.utils.ts +167 -0
  185. package/src/app/core/home/home.html +211 -0
  186. package/src/app/core/home/home.module.ts +32 -0
  187. package/src/app/core/home/home.scss +242 -0
  188. package/src/app/core/home/home.ts +298 -0
  189. package/src/app/core/icon/icon.component.html +15 -0
  190. package/src/app/core/icon/icon.component.ts +23 -0
  191. package/src/app/core/icon/icon.module.ts +22 -0
  192. package/src/app/core/install/install-upgrade-card.component.html +144 -0
  193. package/src/app/core/install/install-upgrade-card.component.scss +4 -0
  194. package/src/app/core/install/install-upgrade-card.component.ts +412 -0
  195. package/src/app/core/install/install-upgrade-card.module.ts +23 -0
  196. package/src/app/core/menu/menu.component.html +135 -0
  197. package/src/app/core/menu/menu.component.scss +225 -0
  198. package/src/app/core/menu/menu.component.ts +352 -0
  199. package/src/app/core/menu/menu.model.ts +64 -0
  200. package/src/app/core/menu/menu.module.ts +27 -0
  201. package/src/app/core/menu/menu.service.ts +62 -0
  202. package/src/app/core/offline/update-offline-mode-card.component.html +45 -0
  203. package/src/app/core/offline/update-offline-mode-card.component.scss +4 -0
  204. package/src/app/core/offline/update-offline-mode-card.component.ts +28 -0
  205. package/src/app/core/offline/update-offline-mode-card.module.ts +24 -0
  206. package/src/app/core/peer/select-peer.modal.html +123 -0
  207. package/src/app/core/peer/select-peer.modal.scss +20 -0
  208. package/src/app/core/peer/select-peer.modal.ts +197 -0
  209. package/src/app/core/peer/select-peer.module.ts +28 -0
  210. package/src/app/core/register/register-confirm.page.html +55 -0
  211. package/src/app/core/register/register-confirm.page.scss +121 -0
  212. package/src/app/core/register/register-confirm.page.ts +94 -0
  213. package/src/app/core/register/register.form.html +125 -0
  214. package/src/app/core/register/register.form.scss +10 -0
  215. package/src/app/core/register/register.form.ts +213 -0
  216. package/src/app/core/register/register.modal.html +70 -0
  217. package/src/app/core/register/register.modal.ts +52 -0
  218. package/src/app/core/register/register.module.ts +31 -0
  219. package/src/app/core/services/account.service.ts +1431 -0
  220. package/src/app/core/services/auth-guard.service.ts +70 -0
  221. package/src/app/core/services/base-entity-service.class.ts +598 -0
  222. package/src/app/core/services/base-graphql-service.class.ts +298 -0
  223. package/src/app/core/services/base58.ts +83 -0
  224. package/src/app/core/services/config/account.config.ts +35 -0
  225. package/src/app/core/services/config/core.config.ts +180 -0
  226. package/src/app/core/services/config.service.ts +414 -0
  227. package/src/app/core/services/crypto.service.ts +126 -0
  228. package/src/app/core/services/errors.ts +67 -0
  229. package/src/app/core/services/local-settings.service.spec.ts +32 -0
  230. package/src/app/core/services/local-settings.service.ts +548 -0
  231. package/src/app/core/services/model/account.model.ts +141 -0
  232. package/src/app/core/services/model/config.model.ts +122 -0
  233. package/src/app/core/services/model/department.model.ts +34 -0
  234. package/src/app/core/services/model/entity.decorators.ts +112 -0
  235. package/src/app/core/services/model/entity.model.ts +326 -0
  236. package/src/app/core/services/model/filter.model.ts +139 -0
  237. package/src/app/core/services/model/history.model.ts +25 -0
  238. package/src/app/core/services/model/model.enum.ts +11 -0
  239. package/src/app/core/services/model/peer.model.ts +86 -0
  240. package/src/app/core/services/model/person.model.ts +112 -0
  241. package/src/app/core/services/model/referential.model.ts +244 -0
  242. package/src/app/core/services/model/settings.model.ts +32 -0
  243. package/src/app/core/services/model/token.model.ts +54 -0
  244. package/src/app/core/services/network.service.spec.ts +49 -0
  245. package/src/app/core/services/network.service.ts +729 -0
  246. package/src/app/core/services/network.types.ts +26 -0
  247. package/src/app/core/services/network.utils.ts +57 -0
  248. package/src/app/core/services/pipes/account.pipes.ts +25 -0
  249. package/src/app/core/services/pipes/department-to-string.pipe.ts +15 -0
  250. package/src/app/core/services/pipes/person-to-string.pipe.ts +15 -0
  251. package/src/app/core/services/pipes/usage-mode.pipes.ts +26 -0
  252. package/src/app/core/services/platform.service.spec.ts +56 -0
  253. package/src/app/core/services/platform.service.ts +605 -0
  254. package/src/app/core/services/storage/entities-storage.service.ts +542 -0
  255. package/src/app/core/services/storage/entity-store.class.ts +598 -0
  256. package/src/app/core/services/testing/referential-filter.model.ts +28 -0
  257. package/src/app/core/services/testing/referential.validator.ts +57 -0
  258. package/src/app/core/services/validator/account.validator.ts +58 -0
  259. package/src/app/core/services/validator/base.validator.class.ts +54 -0
  260. package/src/app/core/services/validator/local-settings.validator.ts +72 -0
  261. package/src/app/core/services/validator/user-settings.validator.ts +25 -0
  262. package/src/app/core/services/validator/user-token.validator.ts +55 -0
  263. package/src/app/core/settings/settings.module.ts +24 -0
  264. package/src/app/core/settings/settings.page.html +264 -0
  265. package/src/app/core/settings/settings.page.ts +365 -0
  266. package/src/app/core/table/actions-column.component.html +91 -0
  267. package/src/app/core/table/actions-column.component.ts +70 -0
  268. package/src/app/core/table/async-table.class.ts +1934 -0
  269. package/src/app/core/table/entities-async-table-datasource.class.ts +482 -0
  270. package/src/app/core/table/entities-table-datasource.class.ts +496 -0
  271. package/src/app/core/table/memory-table.class.ts +65 -0
  272. package/src/app/core/table/table-select-columns.component.html +58 -0
  273. package/src/app/core/table/table-select-columns.component.ts +50 -0
  274. package/src/app/core/table/table.class.ts +1973 -0
  275. package/src/app/core/table/table.model.ts +35 -0
  276. package/src/app/core/table/table.module.ts +26 -0
  277. package/src/app/core/table/table.utils.ts +38 -0
  278. package/src/app/core/table/testing/multi-table.testing.ts +261 -0
  279. package/src/app/core/table/testing/table-validator.service.ts +25 -0
  280. package/src/app/core/table/testing/table.testing.html +396 -0
  281. package/src/app/core/table/testing/table.testing.module.ts +25 -0
  282. package/src/app/core/table/testing/table.testing.scss +23 -0
  283. package/src/app/core/table/testing/table.testing.ts +292 -0
  284. package/src/app/shared/alerts.ts +292 -0
  285. package/src/app/shared/audio/audio.testing.html +33 -0
  286. package/src/app/shared/audio/audio.testing.module.ts +32 -0
  287. package/src/app/shared/audio/audio.testing.ts +31 -0
  288. package/src/app/shared/audio/audio.ts +278 -0
  289. package/src/app/shared/base64.utils.ts +66 -0
  290. package/src/app/shared/capacitor/keyboard.ts +40 -0
  291. package/src/app/shared/capacitor/plugins.ts +12 -0
  292. package/src/app/shared/constants.ts +12 -0
  293. package/src/app/shared/dates.ts +163 -0
  294. package/src/app/shared/debug/debug-service.class.ts +8 -0
  295. package/src/app/shared/debug/debug.component.html +13 -0
  296. package/src/app/shared/debug/debug.component.scss +24 -0
  297. package/src/app/shared/debug/debug.component.spec.ts +25 -0
  298. package/src/app/shared/debug/debug.component.ts +27 -0
  299. package/src/app/shared/debug/debug.module.ts +28 -0
  300. package/src/app/shared/directives/autofocus.directive.ts +109 -0
  301. package/src/app/shared/directives/autotitle.directive.ts +24 -0
  302. package/src/app/shared/directives/directives.module.ts +29 -0
  303. package/src/app/shared/directives/drag-and-drop.directive.ts +47 -0
  304. package/src/app/shared/directives/ng-var.directive.ts +32 -0
  305. package/src/app/shared/directives/resizable/resizable.component.ts +47 -0
  306. package/src/app/shared/directives/resizable/resizable.directive.ts +43 -0
  307. package/src/app/shared/directives/resizable/resizable.module.ts +9 -0
  308. package/src/app/shared/directives/resizable/resizable.style.scss +44 -0
  309. package/src/app/shared/directives/resizable/resizable.template.html +6 -0
  310. package/src/app/shared/events.ts +96 -0
  311. package/src/app/shared/file/csv.utils.ts +94 -0
  312. package/src/app/shared/file/file.service.ts +132 -0
  313. package/src/app/shared/file/file.utils.ts +138 -0
  314. package/src/app/shared/file/images.utils.ts +198 -0
  315. package/src/app/shared/file/json.utils.ts +73 -0
  316. package/src/app/shared/file/uri.utils.ts +25 -0
  317. package/src/app/shared/focusable.ts +10 -0
  318. package/src/app/shared/form/field.component.html +261 -0
  319. package/src/app/shared/form/field.component.scss +7 -0
  320. package/src/app/shared/form/field.component.ts +318 -0
  321. package/src/app/shared/form/field.model.ts +64 -0
  322. package/src/app/shared/form/loading-spinner.ts +16 -0
  323. package/src/app/shared/forms.ts +458 -0
  324. package/src/app/shared/functions.ts +492 -0
  325. package/src/app/shared/geolocation/geolocation.utils.ts +101 -0
  326. package/src/app/shared/gesture/gesture-config.ts +45 -0
  327. package/src/app/shared/gesture/hammer.utils.ts +14 -0
  328. package/src/app/shared/graph/colors.utils.ts +74 -0
  329. package/src/app/shared/graph/graph-colors.ts +295 -0
  330. package/src/app/shared/guard/component-dirty.guard.ts +70 -0
  331. package/src/app/shared/help/help.modal.html +42 -0
  332. package/src/app/shared/help/help.modal.ts +61 -0
  333. package/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.html +11 -0
  334. package/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.scss +39 -0
  335. package/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.ts +16 -0
  336. package/src/app/shared/hotkeys/hotkeys.service.ts +89 -0
  337. package/src/app/shared/hotkeys/shared-hotkeys.module.ts +27 -0
  338. package/src/app/shared/http/http.utils.ts +89 -0
  339. package/src/app/shared/image/gallery/image-gallery.component.html +231 -0
  340. package/src/app/shared/image/gallery/image-gallery.component.scss +196 -0
  341. package/src/app/shared/image/gallery/image-gallery.component.ts +389 -0
  342. package/src/app/shared/image/gallery/image-gallery.module.ts +34 -0
  343. package/src/app/shared/image/gallery/testing/gallegry.model.testing.ts +27 -0
  344. package/src/app/shared/image/gallery/testing/gallery.service.testing.ts +102 -0
  345. package/src/app/shared/image/gallery/testing/gallery.testing.html +15 -0
  346. package/src/app/shared/image/gallery/testing/gallery.testing.module.ts +39 -0
  347. package/src/app/shared/image/gallery/testing/gallery.testing.ts +38 -0
  348. package/src/app/shared/image/image.model.ts +6 -0
  349. package/src/app/shared/image/image.module.ts +16 -0
  350. package/src/app/shared/image/image.service.ts +94 -0
  351. package/src/app/shared/image/image.testing.module.ts +23 -0
  352. package/src/app/shared/inputs.ts +282 -0
  353. package/src/app/shared/interceptors/progess.interceptor.ts +25 -0
  354. package/src/app/shared/logging/log-level.model.ts +53 -0
  355. package/src/app/shared/logging/logger.model.ts +120 -0
  356. package/src/app/shared/logging/logging-service.class.ts +134 -0
  357. package/src/app/shared/logging/logging-service.config.ts +29 -0
  358. package/src/app/shared/logging/logging-service.module.ts +22 -0
  359. package/src/app/shared/material/autocomplete/material.autocomplete.config.ts +83 -0
  360. package/src/app/shared/material/autocomplete/material.autocomplete.html +262 -0
  361. package/src/app/shared/material/autocomplete/material.autocomplete.module.ts +45 -0
  362. package/src/app/shared/material/autocomplete/material.autocomplete.scss +21 -0
  363. package/src/app/shared/material/autocomplete/material.autocomplete.ts +1022 -0
  364. package/src/app/shared/material/autocomplete/material.autocomplete.utils.ts +20 -0
  365. package/src/app/shared/material/autocomplete/testing/autocomplete.test.html +876 -0
  366. package/src/app/shared/material/autocomplete/testing/autocomplete.test.spec.ts +38 -0
  367. package/src/app/shared/material/autocomplete/testing/autocomplete.test.ts +247 -0
  368. package/src/app/shared/material/badge/badge.directive.ts +164 -0
  369. package/src/app/shared/material/badge/badge.module.ts +22 -0
  370. package/src/app/shared/material/badge/badge.test.html +261 -0
  371. package/src/app/shared/material/badge/badge.test.ts +36 -0
  372. package/src/app/shared/material/boolean/boolean.module.ts +40 -0
  373. package/src/app/shared/material/boolean/material.boolean.html +155 -0
  374. package/src/app/shared/material/boolean/material.boolean.scss +34 -0
  375. package/src/app/shared/material/boolean/material.boolean.ts +239 -0
  376. package/src/app/shared/material/chips/chips.module.ts +44 -0
  377. package/src/app/shared/material/chips/material.chips.html +146 -0
  378. package/src/app/shared/material/chips/material.chips.scss +65 -0
  379. package/src/app/shared/material/chips/material.chips.ts +768 -0
  380. package/src/app/shared/material/chips/testing/chips.test.html +137 -0
  381. package/src/app/shared/material/chips/testing/chips.test.ts +175 -0
  382. package/src/app/shared/material/datetime/datetime.module.ts +52 -0
  383. package/src/app/shared/material/datetime/material.date.html +132 -0
  384. package/src/app/shared/material/datetime/material.date.scss +17 -0
  385. package/src/app/shared/material/datetime/material.date.ts +408 -0
  386. package/src/app/shared/material/datetime/material.dateshort.html +134 -0
  387. package/src/app/shared/material/datetime/material.dateshort.scss +23 -0
  388. package/src/app/shared/material/datetime/material.dateshort.ts +422 -0
  389. package/src/app/shared/material/datetime/material.datetime.html +224 -0
  390. package/src/app/shared/material/datetime/material.datetime.scss +90 -0
  391. package/src/app/shared/material/datetime/material.datetime.ts +575 -0
  392. package/src/app/shared/material/datetime/testing/mat-date-time.test.html +354 -0
  393. package/src/app/shared/material/datetime/testing/mat-date-time.test.ts +134 -0
  394. package/src/app/shared/material/datetime/testing/mat-date.test.html +418 -0
  395. package/src/app/shared/material/datetime/testing/mat-date.test.ts +135 -0
  396. package/src/app/shared/material/datetime/testing/mat-dateshort.test.html +370 -0
  397. package/src/app/shared/material/datetime/testing/mat-dateshort.test.ts +127 -0
  398. package/src/app/shared/material/duration/duration.module.ts +39 -0
  399. package/src/app/shared/material/duration/duration.utils.ts +41 -0
  400. package/src/app/shared/material/duration/material.duration.html +44 -0
  401. package/src/app/shared/material/duration/material.duration.scss +28 -0
  402. package/src/app/shared/material/duration/material.duration.ts +294 -0
  403. package/src/app/shared/material/latlong/latlong.utils.ts +300 -0
  404. package/src/app/shared/material/latlong/material.latlong.html +127 -0
  405. package/src/app/shared/material/latlong/material.latlong.module.ts +40 -0
  406. package/src/app/shared/material/latlong/material.latlong.scss +48 -0
  407. package/src/app/shared/material/latlong/material.latlong.ts +421 -0
  408. package/src/app/shared/material/latlong/testing/latlong.test.html +341 -0
  409. package/src/app/shared/material/latlong/testing/latlong.test.ts +121 -0
  410. package/src/app/shared/material/material.animations.ts +129 -0
  411. package/src/app/shared/material/material.module.ts +94 -0
  412. package/src/app/shared/material/material.testing.module.ts +135 -0
  413. package/src/app/shared/material/memory/memory.utils.ts +54 -0
  414. package/src/app/shared/material/numpad/numpad.animation.ts +1 -0
  415. package/src/app/shared/material/numpad/numpad.append-to-input.directive.ts +109 -0
  416. package/src/app/shared/material/numpad/numpad.component.ts +78 -0
  417. package/src/app/shared/material/numpad/numpad.container.html +32 -0
  418. package/src/app/shared/material/numpad/numpad.container.scss +50 -0
  419. package/src/app/shared/material/numpad/numpad.container.ts +176 -0
  420. package/src/app/shared/material/numpad/numpad.content.html +13 -0
  421. package/src/app/shared/material/numpad/numpad.content.ts +10 -0
  422. package/src/app/shared/material/numpad/numpad.directive.ts +173 -0
  423. package/src/app/shared/material/numpad/numpad.dom-service.ts +46 -0
  424. package/src/app/shared/material/numpad/numpad.model.ts +55 -0
  425. package/src/app/shared/material/numpad/numpad.module.ts +38 -0
  426. package/src/app/shared/material/numpad/testing/numpad.test.html +146 -0
  427. package/src/app/shared/material/numpad/testing/numpad.test.ts +55 -0
  428. package/src/app/shared/material/paginator/material.paginator-i18n.ts +49 -0
  429. package/src/app/shared/material/stepper/material.stepper-i18n.ts +18 -0
  430. package/src/app/shared/material/swipe/material.swipe.html +63 -0
  431. package/src/app/shared/material/swipe/material.swipe.scss +39 -0
  432. package/src/app/shared/material/swipe/material.swipe.ts +350 -0
  433. package/src/app/shared/material/swipe/swipe.module.ts +33 -0
  434. package/src/app/shared/material/swipe/testing/swipe.test.html +128 -0
  435. package/src/app/shared/material/swipe/testing/swipe.test.ts +81 -0
  436. package/src/app/shared/modules.ts +11 -0
  437. package/src/app/shared/observables.ts +132 -0
  438. package/src/app/shared/pipes/arrays.pipe.ts +111 -0
  439. package/src/app/shared/pipes/colors.pipe.ts +19 -0
  440. package/src/app/shared/pipes/date-diff-duration.pipe.ts +48 -0
  441. package/src/app/shared/pipes/date-format.pipe.ts +78 -0
  442. package/src/app/shared/pipes/date-from-now.pipe.ts +20 -0
  443. package/src/app/shared/pipes/duration.pipe.spec.ts +51 -0
  444. package/src/app/shared/pipes/duration.pipe.ts +34 -0
  445. package/src/app/shared/pipes/file-size.pipe.ts +58 -0
  446. package/src/app/shared/pipes/form.pipes.ts +204 -0
  447. package/src/app/shared/pipes/highlight.pipe.ts +37 -0
  448. package/src/app/shared/pipes/latlong-format.pipe.ts +30 -0
  449. package/src/app/shared/pipes/maps.pipe.ts +39 -0
  450. package/src/app/shared/pipes/math.pipes.ts +39 -0
  451. package/src/app/shared/pipes/ng-init.pipe.ts +14 -0
  452. package/src/app/shared/pipes/number-format.pipe.ts +21 -0
  453. package/src/app/shared/pipes/pipes.module.ts +134 -0
  454. package/src/app/shared/pipes/property.pipes.ts +87 -0
  455. package/src/app/shared/pipes/string.pipes.ts +85 -0
  456. package/src/app/shared/pipes/translate-context.pipe.ts +33 -0
  457. package/src/app/shared/pipes/types.pipes.ts +31 -0
  458. package/src/app/shared/platforms.ts +58 -0
  459. package/src/app/shared/services/entity-service.class.ts +127 -0
  460. package/src/app/shared/services/job.utils.ts +121 -0
  461. package/src/app/shared/services/memory-entity-service.class.ts +447 -0
  462. package/src/app/shared/services/progress-bar.service.ts +42 -0
  463. package/src/app/shared/services/startable-observable-service.class.ts +137 -0
  464. package/src/app/shared/services/startable-service.class.ts +131 -0
  465. package/src/app/shared/services/storage.utils.ts +47 -0
  466. package/src/app/shared/services/translate-context.service.ts +116 -0
  467. package/src/app/shared/services/validator-service.class.ts +14 -0
  468. package/src/app/shared/services.ts +91 -0
  469. package/src/app/shared/shared-routing.module.ts +66 -0
  470. package/src/app/shared/shared.module.spec.ts +13 -0
  471. package/src/app/shared/shared.module.ts +146 -0
  472. package/src/app/shared/shared.testing.module.ts +50 -0
  473. package/src/app/shared/storage/storage-explorer.component.html +175 -0
  474. package/src/app/shared/storage/storage-explorer.component.scss +39 -0
  475. package/src/app/shared/storage/storage-explorer.component.spec.ts +24 -0
  476. package/src/app/shared/storage/storage-explorer.component.ts +292 -0
  477. package/src/app/shared/storage/storage-explorer.module.ts +44 -0
  478. package/src/app/shared/storage/storage.service.ts +133 -0
  479. package/src/app/shared/storage/storage.utils.ts +25 -0
  480. package/src/app/shared/testing/observable.test.html +53 -0
  481. package/src/app/shared/testing/observable.test.scss +3 -0
  482. package/src/app/shared/testing/observable.test.ts +117 -0
  483. package/src/app/shared/testing/tests.page.html +30 -0
  484. package/src/app/shared/testing/tests.page.ts +34 -0
  485. package/src/app/shared/toast/toast.testing.html +42 -0
  486. package/src/app/shared/toast/toast.testing.module.ts +32 -0
  487. package/src/app/shared/toast/toast.testing.ts +58 -0
  488. package/src/app/shared/toast/toasts.ts +183 -0
  489. package/src/app/shared/toolbar/modal-toolbar.html +32 -0
  490. package/src/app/shared/toolbar/modal-toolbar.scss +0 -0
  491. package/src/app/shared/toolbar/modal-toolbar.ts +63 -0
  492. package/src/app/shared/toolbar/toolbar.html +71 -0
  493. package/src/app/shared/toolbar/toolbar.module.ts +35 -0
  494. package/src/app/shared/toolbar/toolbar.scss +0 -0
  495. package/src/app/shared/toolbar/toolbar.ts +254 -0
  496. package/src/app/shared/types.ts +31 -0
  497. package/src/app/shared/upload-file/testing/upload-file.testing.html +25 -0
  498. package/src/app/shared/upload-file/testing/upload-file.testing.module.ts +32 -0
  499. package/src/app/shared/upload-file/testing/upload-file.testing.ts +68 -0
  500. package/src/app/shared/upload-file/upload-file-popover.component.html +43 -0
  501. package/src/app/shared/upload-file/upload-file-popover.component.scss +6 -0
  502. package/src/app/shared/upload-file/upload-file-popover.component.ts +115 -0
  503. package/src/app/shared/upload-file/upload-file.component.html +46 -0
  504. package/src/app/shared/upload-file/upload-file.component.scss +130 -0
  505. package/src/app/shared/upload-file/upload-file.component.ts +218 -0
  506. package/src/app/shared/upload-file/upload-file.model.ts +41 -0
  507. package/src/app/shared/validator/form-error-adapter.class.ts +123 -0
  508. package/src/app/shared/validator/validators.ts +639 -0
  509. package/src/app/shared/version/versions.ts +91 -0
  510. package/src/app/social/job/job.module.ts +26 -0
  511. package/src/app/social/job/progression/job-progression.component.html +22 -0
  512. package/src/app/social/job/progression/job-progression.component.scss +15 -0
  513. package/src/app/social/job/progression/job-progression.component.ts +17 -0
  514. package/src/app/social/job/progression/job-progression.icon.html +28 -0
  515. package/src/app/social/job/progression/job-progression.icon.scss +5 -0
  516. package/src/app/social/job/progression/job-progression.icon.ts +238 -0
  517. package/src/app/social/job/progression/job-progression.list.html +21 -0
  518. package/src/app/social/job/progression/job-progression.list.scss +17 -0
  519. package/src/app/social/job/progression/job-progression.list.ts +49 -0
  520. package/src/app/social/job/progression/job-progression.model.ts +28 -0
  521. package/src/app/social/job/progression/job-progression.service.ts +86 -0
  522. package/src/app/social/job/testing/job-progression.testing.html +20 -0
  523. package/src/app/social/job/testing/job-progression.testing.service.ts +60 -0
  524. package/src/app/social/job/testing/job-progression.testing.ts +51 -0
  525. package/src/app/social/job/testing/job.testing.module.ts +22 -0
  526. package/src/app/social/message/message.form.html +60 -0
  527. package/src/app/social/message/message.form.scss +6 -0
  528. package/src/app/social/message/message.form.ts +79 -0
  529. package/src/app/social/message/message.modal.html +65 -0
  530. package/src/app/social/message/message.modal.ts +118 -0
  531. package/src/app/social/message/message.model.ts +81 -0
  532. package/src/app/social/message/message.module.ts +22 -0
  533. package/src/app/social/message/message.service.ts +88 -0
  534. package/src/app/social/social.errors.ts +11 -0
  535. package/src/app/social/social.module.ts +36 -0
  536. package/src/app/social/social.testing.module.ts +40 -0
  537. package/src/app/social/user-event/notification/user-event-notification.icon.html +16 -0
  538. package/src/app/social/user-event/notification/user-event-notification.icon.ts +108 -0
  539. package/src/app/social/user-event/notification/user-event-notification.list.html +135 -0
  540. package/src/app/social/user-event/notification/user-event-notification.list.scss +73 -0
  541. package/src/app/social/user-event/notification/user-event-notification.list.ts +287 -0
  542. package/src/app/social/user-event/testing/user-event.testing.html +27 -0
  543. package/src/app/social/user-event/testing/user-event.testing.model.ts +146 -0
  544. package/src/app/social/user-event/testing/user-event.testing.module.ts +22 -0
  545. package/src/app/social/user-event/testing/user-event.testing.service.ts +141 -0
  546. package/src/app/social/user-event/testing/user-event.testing.ts +253 -0
  547. package/src/app/social/user-event/user-event.model.ts +73 -0
  548. package/src/app/social/user-event/user-event.module.ts +25 -0
  549. package/src/app/social/user-event/user-event.service.ts +679 -0
  550. package/src/assets/manifest.json +1 -1
  551. package/src/browserslist +9 -0
  552. package/src/environments/environment.class.ts +83 -0
  553. package/src/environments/environment.prod.ts +47 -0
  554. package/src/environments/environment.test.ts +90 -0
  555. package/src/environments/environment.ts +108 -0
  556. package/src/favicon.ico +0 -0
  557. package/src/global.scss +27 -0
  558. package/src/index.html +80 -0
  559. package/src/main.ts +17 -0
  560. package/src/polyfills.ts +68 -0
  561. package/src/schema.graphql +3112 -0
  562. package/src/service-worker.js +31 -0
  563. package/src/zone-flags.ts +31 -0
  564. package/tsconfig.app.json +15 -0
  565. package/tsconfig.json +47 -0
  566. package/tsconfig.spec.json +19 -0
  567. package/esm2020/public_api.mjs +0 -313
  568. package/esm2020/src/app/admin/admin-routing.module.mjs +0 -41
  569. package/esm2020/src/app/admin/admin.module.mjs +0 -34
  570. package/esm2020/src/app/admin/services/filter/person.filter.mjs +0 -59
  571. package/esm2020/src/app/admin/services/person.service.mjs +0 -161
  572. package/esm2020/src/app/admin/services/validator/person.validator.mjs +0 -34
  573. package/esm2020/src/app/admin/users/users.mjs +0 -234
  574. package/esm2020/src/app/admin/users/users.module.mjs +0 -54
  575. package/esm2020/src/app/core/about/about.modal.mjs +0 -71
  576. package/esm2020/src/app/core/about/about.module.mjs +0 -34
  577. package/esm2020/src/app/core/account/account.module.mjs +0 -61
  578. package/esm2020/src/app/core/account/account.page.mjs +0 -316
  579. package/esm2020/src/app/core/account/new-token.modal.mjs +0 -115
  580. package/esm2020/src/app/core/account/token.table.mjs +0 -137
  581. package/esm2020/src/app/core/auth/auth.form.mjs +0 -131
  582. package/esm2020/src/app/core/auth/auth.modal.mjs +0 -72
  583. package/esm2020/src/app/core/auth/auth.module.mjs +0 -47
  584. package/esm2020/src/app/core/core.module.mjs +0 -184
  585. package/esm2020/src/app/core/core.testing.module.mjs +0 -86
  586. package/esm2020/src/app/core/form/buttons/form-buttons-bar.component.mjs +0 -71
  587. package/esm2020/src/app/core/form/buttons/form-buttons-bar.module.mjs +0 -35
  588. package/esm2020/src/app/core/form/entity/editor.class.mjs +0 -679
  589. package/esm2020/src/app/core/form/entity/entity-editor-modal.class.mjs +0 -421
  590. package/esm2020/src/app/core/form/entity/entity-editor.class.mjs +0 -687
  591. package/esm2020/src/app/core/form/entity/entity-metadata.component.mjs +0 -25
  592. package/esm2020/src/app/core/form/entity/entity.module.mjs +0 -38
  593. package/esm2020/src/app/core/form/form.class.mjs +0 -340
  594. package/esm2020/src/app/core/form/form.module.mjs +0 -66
  595. package/esm2020/src/app/core/form/form.utils.mjs +0 -473
  596. package/esm2020/src/app/core/form/list/list.form.mjs +0 -222
  597. package/esm2020/src/app/core/form/list/list.module.mjs +0 -35
  598. package/esm2020/src/app/core/form/properties/properties.form.mjs +0 -132
  599. package/esm2020/src/app/core/form/properties/properties.module.mjs +0 -43
  600. package/esm2020/src/app/core/form/properties/properties.table.mjs +0 -264
  601. package/esm2020/src/app/core/form/properties/property.validator.mjs +0 -23
  602. package/esm2020/src/app/core/form/properties/testing/properties-form.test.mjs +0 -90
  603. package/esm2020/src/app/core/form/properties/testing/properties-form.testing.module.mjs +0 -39
  604. package/esm2020/src/app/core/form/text-popover/testing/text-popover.testing.mjs +0 -70
  605. package/esm2020/src/app/core/form/text-popover/testing/text-popover.testing.module.mjs +0 -45
  606. package/esm2020/src/app/core/form/text-popover/text-form.component.mjs +0 -89
  607. package/esm2020/src/app/core/form/text-popover/text-popover.component.mjs +0 -146
  608. package/esm2020/src/app/core/form/text-popover/text-popover.module.mjs +0 -40
  609. package/esm2020/src/app/core/graphql/graphql.module.mjs +0 -22
  610. package/esm2020/src/app/core/graphql/graphql.service.mjs +0 -762
  611. package/esm2020/src/app/core/graphql/graphql.utils.mjs +0 -117
  612. package/esm2020/src/app/core/home/home.mjs +0 -257
  613. package/esm2020/src/app/core/home/home.module.mjs +0 -48
  614. package/esm2020/src/app/core/icon/icon.component.mjs +0 -41
  615. package/esm2020/src/app/core/icon/icon.module.mjs +0 -29
  616. package/esm2020/src/app/core/install/install-upgrade-card.component.mjs +0 -343
  617. package/esm2020/src/app/core/install/install-upgrade-card.module.mjs +0 -35
  618. package/esm2020/src/app/core/menu/menu.component.mjs +0 -329
  619. package/esm2020/src/app/core/menu/menu.model.mjs +0 -35
  620. package/esm2020/src/app/core/menu/menu.module.mjs +0 -44
  621. package/esm2020/src/app/core/menu/menu.service.mjs +0 -55
  622. package/esm2020/src/app/core/offline/update-offline-mode-card.component.mjs +0 -27
  623. package/esm2020/src/app/core/offline/update-offline-mode-card.module.mjs +0 -35
  624. package/esm2020/src/app/core/peer/select-peer.modal.mjs +0 -182
  625. package/esm2020/src/app/core/peer/select-peer.module.mjs +0 -42
  626. package/esm2020/src/app/core/register/register-confirm.page.mjs +0 -81
  627. package/esm2020/src/app/core/register/register.form.mjs +0 -181
  628. package/esm2020/src/app/core/register/register.modal.mjs +0 -52
  629. package/esm2020/src/app/core/register/register.module.mjs +0 -44
  630. package/esm2020/src/app/core/services/account.service.mjs +0 -1212
  631. package/esm2020/src/app/core/services/auth-guard.service.mjs +0 -71
  632. package/esm2020/src/app/core/services/base-entity-service.class.mjs +0 -444
  633. package/esm2020/src/app/core/services/base-graphql-service.class.mjs +0 -219
  634. package/esm2020/src/app/core/services/base58.mjs +0 -78
  635. package/esm2020/src/app/core/services/config/core.config.mjs +0 -175
  636. package/esm2020/src/app/core/services/config.service.mjs +0 -354
  637. package/esm2020/src/app/core/services/crypto.service.mjs +0 -114
  638. package/esm2020/src/app/core/services/errors.mjs +0 -50
  639. package/esm2020/src/app/core/services/local-settings.service.mjs +0 -449
  640. package/esm2020/src/app/core/services/model/account.model.mjs +0 -122
  641. package/esm2020/src/app/core/services/model/config.model.mjs +0 -92
  642. package/esm2020/src/app/core/services/model/department.model.mjs +0 -30
  643. package/esm2020/src/app/core/services/model/entity.decorators.mjs +0 -97
  644. package/esm2020/src/app/core/services/model/entity.model.mjs +0 -240
  645. package/esm2020/src/app/core/services/model/filter.model.mjs +0 -111
  646. package/esm2020/src/app/core/services/model/history.model.mjs +0 -2
  647. package/esm2020/src/app/core/services/model/model.enum.mjs +0 -11
  648. package/esm2020/src/app/core/services/model/peer.model.mjs +0 -68
  649. package/esm2020/src/app/core/services/model/person.model.mjs +0 -83
  650. package/esm2020/src/app/core/services/model/referential.model.mjs +0 -164
  651. package/esm2020/src/app/core/services/model/settings.model.mjs +0 -3
  652. package/esm2020/src/app/core/services/model/token.model.mjs +0 -48
  653. package/esm2020/src/app/core/services/network.service.mjs +0 -589
  654. package/esm2020/src/app/core/services/network.types.mjs +0 -20
  655. package/esm2020/src/app/core/services/network.utils.mjs +0 -15
  656. package/esm2020/src/app/core/services/pipes/account.pipes.mjs +0 -38
  657. package/esm2020/src/app/core/services/pipes/department-to-string.pipe.mjs +0 -23
  658. package/esm2020/src/app/core/services/pipes/person-to-string.pipe.mjs +0 -23
  659. package/esm2020/src/app/core/services/pipes/usage-mode.pipes.mjs +0 -37
  660. package/esm2020/src/app/core/services/platform.service.mjs +0 -525
  661. package/esm2020/src/app/core/services/storage/entities-storage.service.mjs +0 -428
  662. package/esm2020/src/app/core/services/storage/entity-store.class.mjs +0 -449
  663. package/esm2020/src/app/core/services/testing/referential-filter.model.mjs +0 -23
  664. package/esm2020/src/app/core/services/testing/referential.validator.mjs +0 -45
  665. package/esm2020/src/app/core/services/validator/account.validator.mjs +0 -56
  666. package/esm2020/src/app/core/services/validator/base.validator.class.mjs +0 -47
  667. package/esm2020/src/app/core/services/validator/local-settings.validator.mjs +0 -66
  668. package/esm2020/src/app/core/services/validator/user-settings.validator.mjs +0 -27
  669. package/esm2020/src/app/core/services/validator/user-token.validator.mjs +0 -52
  670. package/esm2020/src/app/core/settings/settings.module.mjs +0 -34
  671. package/esm2020/src/app/core/settings/settings.page.mjs +0 -312
  672. package/esm2020/src/app/core/table/actions-column.component.mjs +0 -102
  673. package/esm2020/src/app/core/table/async-table.class.mjs +0 -1697
  674. package/esm2020/src/app/core/table/entities-async-table-datasource.class.mjs +0 -384
  675. package/esm2020/src/app/core/table/entities-table-datasource.class.mjs +0 -399
  676. package/esm2020/src/app/core/table/memory-table.class.mjs +0 -53
  677. package/esm2020/src/app/core/table/table-select-columns.component.mjs +0 -43
  678. package/esm2020/src/app/core/table/table.class.mjs +0 -1728
  679. package/esm2020/src/app/core/table/table.model.mjs +0 -12
  680. package/esm2020/src/app/core/table/table.module.mjs +0 -40
  681. package/esm2020/src/app/core/table/table.utils.mjs +0 -30
  682. package/esm2020/src/app/core/table/testing/table-validator.service.mjs +0 -27
  683. package/esm2020/src/app/core/table/testing/table.testing.mjs +0 -280
  684. package/esm2020/src/app/core/table/testing/table.testing.module.mjs +0 -38
  685. package/esm2020/src/app/shared/alerts.mjs +0 -239
  686. package/esm2020/src/app/shared/audio/audio.mjs +0 -248
  687. package/esm2020/src/app/shared/audio/audio.testing.mjs +0 -31
  688. package/esm2020/src/app/shared/audio/audio.testing.module.mjs +0 -45
  689. package/esm2020/src/app/shared/capacitor/keyboard.mjs +0 -40
  690. package/esm2020/src/app/shared/capacitor/plugins.mjs +0 -9
  691. package/esm2020/src/app/shared/constants.mjs +0 -10
  692. package/esm2020/src/app/shared/dates.mjs +0 -148
  693. package/esm2020/src/app/shared/debug/debug-service.class.mjs +0 -3
  694. package/esm2020/src/app/shared/debug/debug.component.mjs +0 -39
  695. package/esm2020/src/app/shared/debug/debug.module.mjs +0 -44
  696. package/esm2020/src/app/shared/directives/autofocus.directive.mjs +0 -92
  697. package/esm2020/src/app/shared/directives/autotitle.directive.mjs +0 -30
  698. package/esm2020/src/app/shared/directives/directives.module.mjs +0 -43
  699. package/esm2020/src/app/shared/directives/drag-and-drop.directive.mjs +0 -53
  700. package/esm2020/src/app/shared/directives/ng-var.directive.mjs +0 -31
  701. package/esm2020/src/app/shared/directives/resizable/resizable.component.mjs +0 -59
  702. package/esm2020/src/app/shared/directives/resizable/resizable.directive.mjs +0 -40
  703. package/esm2020/src/app/shared/directives/resizable/resizable.module.mjs +0 -17
  704. package/esm2020/src/app/shared/events.mjs +0 -64
  705. package/esm2020/src/app/shared/file/csv.utils.mjs +0 -74
  706. package/esm2020/src/app/shared/file/file.service.mjs +0 -117
  707. package/esm2020/src/app/shared/file/file.utils.mjs +0 -113
  708. package/esm2020/src/app/shared/file/images.utils.mjs +0 -161
  709. package/esm2020/src/app/shared/file/json.utils.mjs +0 -51
  710. package/esm2020/src/app/shared/file/uri.utils.mjs +0 -23
  711. package/esm2020/src/app/shared/focusable.mjs +0 -6
  712. package/esm2020/src/app/shared/form/field.component.mjs +0 -307
  713. package/esm2020/src/app/shared/form/field.model.mjs +0 -25
  714. package/esm2020/src/app/shared/form/loading-spinner.mjs +0 -36
  715. package/esm2020/src/app/shared/forms.mjs +0 -391
  716. package/esm2020/src/app/shared/functions.mjs +0 -477
  717. package/esm2020/src/app/shared/geolocation/geolocation.utils.mjs +0 -80
  718. package/esm2020/src/app/shared/gesture/gesture-config.mjs +0 -49
  719. package/esm2020/src/app/shared/gesture/hammer.utils.mjs +0 -2
  720. package/esm2020/src/app/shared/graph/colors.utils.mjs +0 -64
  721. package/esm2020/src/app/shared/graph/graph-colors.mjs +0 -212
  722. package/esm2020/src/app/shared/guard/component-dirty.guard.mjs +0 -57
  723. package/esm2020/src/app/shared/help/help.modal.mjs +0 -53
  724. package/esm2020/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.mjs +0 -23
  725. package/esm2020/src/app/shared/hotkeys/hotkeys.service.mjs +0 -84
  726. package/esm2020/src/app/shared/hotkeys/shared-hotkeys.module.mjs +0 -42
  727. package/esm2020/src/app/shared/http/http.utils.mjs +0 -52
  728. package/esm2020/src/app/shared/image/gallery/image-gallery.component.mjs +0 -365
  729. package/esm2020/src/app/shared/image/gallery/image-gallery.module.mjs +0 -59
  730. package/esm2020/src/app/shared/image/gallery/testing/gallegry.model.testing.mjs +0 -27
  731. package/esm2020/src/app/shared/image/gallery/testing/gallery.service.testing.mjs +0 -90
  732. package/esm2020/src/app/shared/image/gallery/testing/gallery.testing.mjs +0 -39
  733. package/esm2020/src/app/shared/image/gallery/testing/gallery.testing.module.mjs +0 -56
  734. package/esm2020/src/app/shared/image/image.model.mjs +0 -2
  735. package/esm2020/src/app/shared/image/image.module.mjs +0 -29
  736. package/esm2020/src/app/shared/image/image.service.mjs +0 -98
  737. package/esm2020/src/app/shared/inputs.mjs +0 -231
  738. package/esm2020/src/app/shared/interceptors/progess.interceptor.mjs +0 -27
  739. package/esm2020/src/app/shared/logging/log-level.model.mjs +0 -48
  740. package/esm2020/src/app/shared/logging/logger.model.mjs +0 -47
  741. package/esm2020/src/app/shared/logging/logging-service.class.mjs +0 -121
  742. package/esm2020/src/app/shared/logging/logging-service.config.mjs +0 -2
  743. package/esm2020/src/app/shared/logging/logging-service.module.mjs +0 -30
  744. package/esm2020/src/app/shared/material/autocomplete/material.autocomplete.config.mjs +0 -47
  745. package/esm2020/src/app/shared/material/autocomplete/material.autocomplete.mjs +0 -916
  746. package/esm2020/src/app/shared/material/autocomplete/material.autocomplete.module.mjs +0 -78
  747. package/esm2020/src/app/shared/material/autocomplete/material.autocomplete.utils.mjs +0 -19
  748. package/esm2020/src/app/shared/material/autocomplete/testing/autocomplete.test.mjs +0 -209
  749. package/esm2020/src/app/shared/material/badge/badge.directive.mjs +0 -194
  750. package/esm2020/src/app/shared/material/badge/badge.module.mjs +0 -32
  751. package/esm2020/src/app/shared/material/badge/badge.test.mjs +0 -41
  752. package/esm2020/src/app/shared/material/boolean/boolean.module.mjs +0 -68
  753. package/esm2020/src/app/shared/material/boolean/material.boolean.mjs +0 -253
  754. package/esm2020/src/app/shared/material/chips/chips.module.mjs +0 -76
  755. package/esm2020/src/app/shared/material/chips/material.chips.mjs +0 -697
  756. package/esm2020/src/app/shared/material/chips/testing/chips.test.mjs +0 -143
  757. package/esm2020/src/app/shared/material/datetime/datetime.module.mjs +0 -91
  758. package/esm2020/src/app/shared/material/datetime/material.date.mjs +0 -376
  759. package/esm2020/src/app/shared/material/datetime/material.dateshort.mjs +0 -385
  760. package/esm2020/src/app/shared/material/datetime/material.datetime.mjs +0 -499
  761. package/esm2020/src/app/shared/material/datetime/testing/mat-date-time.test.mjs +0 -108
  762. package/esm2020/src/app/shared/material/datetime/testing/mat-date.test.mjs +0 -110
  763. package/esm2020/src/app/shared/material/datetime/testing/mat-dateshort.test.mjs +0 -103
  764. package/esm2020/src/app/shared/material/duration/duration.module.mjs +0 -67
  765. package/esm2020/src/app/shared/material/duration/duration.utils.mjs +0 -36
  766. package/esm2020/src/app/shared/material/duration/material.duration.mjs +0 -257
  767. package/esm2020/src/app/shared/material/latlong/latlong.utils.mjs +0 -266
  768. package/esm2020/src/app/shared/material/latlong/material.latlong.mjs +0 -381
  769. package/esm2020/src/app/shared/material/latlong/material.latlong.module.mjs +0 -67
  770. package/esm2020/src/app/shared/material/latlong/testing/latlong.test.mjs +0 -102
  771. package/esm2020/src/app/shared/material/material.animations.mjs +0 -104
  772. package/esm2020/src/app/shared/material/material.module.mjs +0 -224
  773. package/esm2020/src/app/shared/material/material.testing.module.mjs +0 -168
  774. package/esm2020/src/app/shared/material/numpad/numpad.append-to-input.directive.mjs +0 -98
  775. package/esm2020/src/app/shared/material/numpad/numpad.component.mjs +0 -80
  776. package/esm2020/src/app/shared/material/numpad/numpad.container.mjs +0 -190
  777. package/esm2020/src/app/shared/material/numpad/numpad.content.mjs +0 -17
  778. package/esm2020/src/app/shared/material/numpad/numpad.directive.mjs +0 -162
  779. package/esm2020/src/app/shared/material/numpad/numpad.dom-service.mjs +0 -37
  780. package/esm2020/src/app/shared/material/numpad/numpad.model.mjs +0 -15
  781. package/esm2020/src/app/shared/material/numpad/numpad.module.mjs +0 -60
  782. package/esm2020/src/app/shared/material/numpad/testing/numpad.test.mjs +0 -46
  783. package/esm2020/src/app/shared/material/paginator/material.paginator-i18n.mjs +0 -46
  784. package/esm2020/src/app/shared/material/stepper/material.stepper-i18n.mjs +0 -22
  785. package/esm2020/src/app/shared/material/swipe/material.swipe.mjs +0 -344
  786. package/esm2020/src/app/shared/material/swipe/swipe.module.mjs +0 -52
  787. package/esm2020/src/app/shared/material/swipe/testing/swipe.test.mjs +0 -64
  788. package/esm2020/src/app/shared/modules.mjs +0 -11
  789. package/esm2020/src/app/shared/observables.mjs +0 -103
  790. package/esm2020/src/app/shared/pipes/arrays.pipe.mjs +0 -141
  791. package/esm2020/src/app/shared/pipes/colors.pipe.mjs +0 -23
  792. package/esm2020/src/app/shared/pipes/date-diff-duration.pipe.mjs +0 -48
  793. package/esm2020/src/app/shared/pipes/date-format.pipe.mjs +0 -66
  794. package/esm2020/src/app/shared/pipes/date-from-now.pipe.mjs +0 -27
  795. package/esm2020/src/app/shared/pipes/duration.pipe.mjs +0 -34
  796. package/esm2020/src/app/shared/pipes/file-size.pipe.mjs +0 -62
  797. package/esm2020/src/app/shared/pipes/form.pipes.mjs +0 -187
  798. package/esm2020/src/app/shared/pipes/highlight.pipe.mjs +0 -48
  799. package/esm2020/src/app/shared/pipes/latlong-format.pipe.mjs +0 -46
  800. package/esm2020/src/app/shared/pipes/maps.pipe.mjs +0 -63
  801. package/esm2020/src/app/shared/pipes/math.pipes.mjs +0 -59
  802. package/esm2020/src/app/shared/pipes/ng-init.pipe.mjs +0 -21
  803. package/esm2020/src/app/shared/pipes/number-format.pipe.mjs +0 -30
  804. package/esm2020/src/app/shared/pipes/pipes.module.mjs +0 -239
  805. package/esm2020/src/app/shared/pipes/property.pipes.mjs +0 -93
  806. package/esm2020/src/app/shared/pipes/string.pipes.mjs +0 -121
  807. package/esm2020/src/app/shared/pipes/translate-context.pipe.mjs +0 -43
  808. package/esm2020/src/app/shared/pipes/types.pipes.mjs +0 -45
  809. package/esm2020/src/app/shared/platforms.mjs +0 -43
  810. package/esm2020/src/app/shared/services/entity-service.class.mjs +0 -7
  811. package/esm2020/src/app/shared/services/job.utils.mjs +0 -92
  812. package/esm2020/src/app/shared/services/memory-entity-service.class.mjs +0 -337
  813. package/esm2020/src/app/shared/services/progress-bar.service.mjs +0 -33
  814. package/esm2020/src/app/shared/services/startable-observable-service.class.mjs +0 -119
  815. package/esm2020/src/app/shared/services/startable-service.class.mjs +0 -110
  816. package/esm2020/src/app/shared/services/translate-context.service.mjs +0 -105
  817. package/esm2020/src/app/shared/services/validator-service.class.mjs +0 -2
  818. package/esm2020/src/app/shared/services.mjs +0 -62
  819. package/esm2020/src/app/shared/shared-routing.module.mjs +0 -70
  820. package/esm2020/src/app/shared/shared.module.mjs +0 -208
  821. package/esm2020/src/app/shared/shared.testing.module.mjs +0 -84
  822. package/esm2020/src/app/shared/storage/storage-explorer.component.mjs +0 -268
  823. package/esm2020/src/app/shared/storage/storage-explorer.module.mjs +0 -60
  824. package/esm2020/src/app/shared/storage/storage.service.mjs +0 -132
  825. package/esm2020/src/app/shared/storage/storage.utils.mjs +0 -13
  826. package/esm2020/src/app/shared/testing/observable.test.mjs +0 -95
  827. package/esm2020/src/app/shared/testing/tests.page.mjs +0 -33
  828. package/esm2020/src/app/shared/toast/toast.testing.mjs +0 -51
  829. package/esm2020/src/app/shared/toast/toast.testing.module.mjs +0 -45
  830. package/esm2020/src/app/shared/toast/toasts.mjs +0 -144
  831. package/esm2020/src/app/shared/toolbar/modal-toolbar.mjs +0 -58
  832. package/esm2020/src/app/shared/toolbar/toolbar.mjs +0 -251
  833. package/esm2020/src/app/shared/toolbar/toolbar.module.mjs +0 -53
  834. package/esm2020/src/app/shared/types.mjs +0 -2
  835. package/esm2020/src/app/shared/upload-file/testing/upload-file.testing.mjs +0 -57
  836. package/esm2020/src/app/shared/upload-file/testing/upload-file.testing.module.mjs +0 -45
  837. package/esm2020/src/app/shared/upload-file/upload-file-popover.component.mjs +0 -97
  838. package/esm2020/src/app/shared/upload-file/upload-file.component.mjs +0 -204
  839. package/esm2020/src/app/shared/upload-file/upload-file.model.mjs +0 -20
  840. package/esm2020/src/app/shared/validator/form-error-adapter.class.mjs +0 -104
  841. package/esm2020/src/app/shared/validator/validators.mjs +0 -573
  842. package/esm2020/src/app/shared/version/versions.mjs +0 -81
  843. package/esm2020/src/app/social/job/job.module.mjs +0 -42
  844. package/esm2020/src/app/social/job/progression/job-progression.component.mjs +0 -20
  845. package/esm2020/src/app/social/job/progression/job-progression.icon.mjs +0 -216
  846. package/esm2020/src/app/social/job/progression/job-progression.list.mjs +0 -43
  847. package/esm2020/src/app/social/job/progression/job-progression.model.mjs +0 -23
  848. package/esm2020/src/app/social/job/progression/job-progression.service.mjs +0 -71
  849. package/esm2020/src/app/social/job/testing/job-progression.testing.mjs +0 -52
  850. package/esm2020/src/app/social/job/testing/job-progression.testing.service.mjs +0 -55
  851. package/esm2020/src/app/social/job/testing/job.testing.module.mjs +0 -35
  852. package/esm2020/src/app/social/message/message.form.mjs +0 -81
  853. package/esm2020/src/app/social/message/message.modal.mjs +0 -93
  854. package/esm2020/src/app/social/message/message.model.mjs +0 -65
  855. package/esm2020/src/app/social/message/message.module.mjs +0 -35
  856. package/esm2020/src/app/social/message/message.service.mjs +0 -84
  857. package/esm2020/src/app/social/social.errors.mjs +0 -10
  858. package/esm2020/src/app/social/social.module.mjs +0 -47
  859. package/esm2020/src/app/social/social.testing.module.mjs +0 -51
  860. package/esm2020/src/app/social/user-event/notification/user-event-notification.icon.mjs +0 -114
  861. package/esm2020/src/app/social/user-event/notification/user-event-notification.list.mjs +0 -246
  862. package/esm2020/src/app/social/user-event/testing/user-event.testing.mjs +0 -227
  863. package/esm2020/src/app/social/user-event/testing/user-event.testing.model.mjs +0 -112
  864. package/esm2020/src/app/social/user-event/testing/user-event.testing.module.mjs +0 -35
  865. package/esm2020/src/app/social/user-event/testing/user-event.testing.service.mjs +0 -111
  866. package/esm2020/src/app/social/user-event/user-event.model.mjs +0 -2
  867. package/esm2020/src/app/social/user-event/user-event.module.mjs +0 -39
  868. package/esm2020/src/app/social/user-event/user-event.service.mjs +0 -487
  869. package/esm2020/src/environments/environment.class.mjs +0 -5
  870. package/esm2020/src/environments/environment.mjs +0 -94
  871. package/esm2020/sumaris-net.ngx-components.mjs +0 -5
  872. package/fesm2015/sumaris-net.ngx-components.mjs +0 -38859
  873. package/fesm2015/sumaris-net.ngx-components.mjs.map +0 -1
  874. package/fesm2020/sumaris-net.ngx-components.mjs +0 -37957
  875. package/fesm2020/sumaris-net.ngx-components.mjs.map +0 -1
  876. package/index.d.ts +0 -5
  877. package/public_api.d.ts +0 -286
  878. package/src/app/admin/admin-routing.module.d.ts +0 -9
  879. package/src/app/admin/admin.module.d.ts +0 -10
  880. package/src/app/admin/services/filter/person.filter.d.ts +0 -21
  881. package/src/app/admin/services/person.service.d.ts +0 -44
  882. package/src/app/admin/services/validator/person.validator.d.ts +0 -14
  883. package/src/app/admin/users/users.d.ts +0 -44
  884. package/src/app/admin/users/users.module.d.ts +0 -13
  885. package/src/app/core/about/about.modal.d.ts +0 -32
  886. package/src/app/core/about/about.module.d.ts +0 -10
  887. package/src/app/core/account/account.module.d.ts +0 -15
  888. package/src/app/core/account/account.page.d.ts +0 -68
  889. package/src/app/core/account/new-token.modal.d.ts +0 -41
  890. package/src/app/core/account/token.table.d.ts +0 -25
  891. package/src/app/core/auth/auth.form.d.ts +0 -36
  892. package/src/app/core/auth/auth.modal.d.ts +0 -24
  893. package/src/app/core/auth/auth.module.d.ts +0 -11
  894. package/src/app/core/core.module.d.ts +0 -31
  895. package/src/app/core/core.testing.module.d.ts +0 -14
  896. package/src/app/core/form/buttons/form-buttons-bar.component.d.ts +0 -26
  897. package/src/app/core/form/buttons/form-buttons-bar.module.d.ts +0 -9
  898. package/src/app/core/form/entity/editor.class.d.ts +0 -243
  899. package/src/app/core/form/entity/entity-editor-modal.class.d.ts +0 -128
  900. package/src/app/core/form/entity/entity-editor.class.d.ts +0 -205
  901. package/src/app/core/form/entity/entity-metadata.component.d.ts +0 -13
  902. package/src/app/core/form/entity/entity.module.d.ts +0 -10
  903. package/src/app/core/form/form.class.d.ts +0 -155
  904. package/src/app/core/form/form.module.d.ts +0 -13
  905. package/src/app/core/form/form.utils.d.ts +0 -336
  906. package/src/app/core/form/list/list.form.d.ts +0 -81
  907. package/src/app/core/form/list/list.module.d.ts +0 -9
  908. package/src/app/core/form/properties/properties.form.d.ts +0 -44
  909. package/src/app/core/form/properties/properties.module.d.ts +0 -11
  910. package/src/app/core/form/properties/properties.table.d.ts +0 -78
  911. package/src/app/core/form/properties/property.validator.d.ts +0 -13
  912. package/src/app/core/form/properties/testing/properties-form.test.d.ts +0 -19
  913. package/src/app/core/form/properties/testing/properties-form.testing.module.d.ts +0 -12
  914. package/src/app/core/form/text-popover/testing/text-popover.testing.d.ts +0 -14
  915. package/src/app/core/form/text-popover/testing/text-popover.testing.module.d.ts +0 -11
  916. package/src/app/core/form/text-popover/text-form.component.d.ts +0 -32
  917. package/src/app/core/form/text-popover/text-popover.component.d.ts +0 -70
  918. package/src/app/core/form/text-popover/text-popover.module.d.ts +0 -10
  919. package/src/app/core/graphql/graphql.module.d.ts +0 -8
  920. package/src/app/core/graphql/graphql.service.d.ts +0 -148
  921. package/src/app/core/graphql/graphql.utils.d.ts +0 -42
  922. package/src/app/core/home/home.d.ts +0 -74
  923. package/src/app/core/home/home.module.d.ts +0 -12
  924. package/src/app/core/icon/icon.component.d.ts +0 -13
  925. package/src/app/core/icon/icon.module.d.ts +0 -9
  926. package/src/app/core/install/install-upgrade-card.component.d.ts +0 -63
  927. package/src/app/core/install/install-upgrade-card.module.d.ts +0 -9
  928. package/src/app/core/menu/menu.component.d.ts +0 -62
  929. package/src/app/core/menu/menu.model.d.ts +0 -28
  930. package/src/app/core/menu/menu.module.d.ts +0 -10
  931. package/src/app/core/menu/menu.service.d.ts +0 -21
  932. package/src/app/core/offline/update-offline-mode-card.component.d.ts +0 -11
  933. package/src/app/core/offline/update-offline-mode-card.module.d.ts +0 -9
  934. package/src/app/core/peer/select-peer.modal.d.ts +0 -53
  935. package/src/app/core/peer/select-peer.module.d.ts +0 -11
  936. package/src/app/core/register/register-confirm.page.d.ts +0 -24
  937. package/src/app/core/register/register.form.d.ts +0 -48
  938. package/src/app/core/register/register.modal.d.ts +0 -14
  939. package/src/app/core/register/register.module.d.ts +0 -12
  940. package/src/app/core/services/account.service.d.ts +0 -191
  941. package/src/app/core/services/auth-guard.service.d.ts +0 -17
  942. package/src/app/core/services/base-entity-service.class.d.ts +0 -104
  943. package/src/app/core/services/base-graphql-service.class.d.ts +0 -77
  944. package/src/app/core/services/base58.d.ts +0 -7
  945. package/src/app/core/services/config/core.config.d.ts +0 -29
  946. package/src/app/core/services/config.service.d.ts +0 -60
  947. package/src/app/core/services/crypto.service.d.ts +0 -44
  948. package/src/app/core/services/errors.d.ts +0 -51
  949. package/src/app/core/services/local-settings.service.d.ts +0 -90
  950. package/src/app/core/services/model/account.model.d.ts +0 -35
  951. package/src/app/core/services/model/config.model.d.ts +0 -36
  952. package/src/app/core/services/model/department.model.d.ts +0 -11
  953. package/src/app/core/services/model/entity.decorators.d.ts +0 -17
  954. package/src/app/core/services/model/entity.model.d.ts +0 -89
  955. package/src/app/core/services/model/filter.model.d.ts +0 -49
  956. package/src/app/core/services/model/history.model.d.ts +0 -20
  957. package/src/app/core/services/model/model.enum.d.ts +0 -7
  958. package/src/app/core/services/model/peer.model.d.ts +0 -29
  959. package/src/app/core/services/model/person.model.d.ts +0 -31
  960. package/src/app/core/services/model/referential.model.d.ts +0 -77
  961. package/src/app/core/services/model/settings.model.d.ts +0 -26
  962. package/src/app/core/services/model/token.model.d.ts +0 -21
  963. package/src/app/core/services/network.service.d.ts +0 -149
  964. package/src/app/core/services/network.types.d.ts +0 -5
  965. package/src/app/core/services/network.utils.d.ts +0 -31
  966. package/src/app/core/services/pipes/account.pipes.d.ts +0 -15
  967. package/src/app/core/services/pipes/department-to-string.pipe.d.ts +0 -9
  968. package/src/app/core/services/pipes/person-to-string.pipe.d.ts +0 -9
  969. package/src/app/core/services/pipes/usage-mode.pipes.d.ts +0 -15
  970. package/src/app/core/services/platform.service.d.ts +0 -96
  971. package/src/app/core/services/storage/entities-storage.service.d.ts +0 -108
  972. package/src/app/core/services/storage/entity-store.class.d.ts +0 -113
  973. package/src/app/core/services/testing/referential-filter.model.d.ts +0 -9
  974. package/src/app/core/services/testing/referential.validator.d.ts +0 -22
  975. package/src/app/core/services/validator/account.validator.d.ts +0 -17
  976. package/src/app/core/services/validator/base.validator.class.d.ts +0 -21
  977. package/src/app/core/services/validator/local-settings.validator.d.ts +0 -18
  978. package/src/app/core/services/validator/user-settings.validator.d.ts +0 -10
  979. package/src/app/core/services/validator/user-token.validator.d.ts +0 -13
  980. package/src/app/core/settings/settings.module.d.ts +0 -10
  981. package/src/app/core/settings/settings.page.d.ts +0 -68
  982. package/src/app/core/table/actions-column.component.d.ts +0 -48
  983. package/src/app/core/table/async-table.class.d.ts +0 -383
  984. package/src/app/core/table/entities-async-table-datasource.class.d.ts +0 -80
  985. package/src/app/core/table/entities-table-datasource.class.d.ts +0 -94
  986. package/src/app/core/table/memory-table.class.d.ts +0 -25
  987. package/src/app/core/table/table-select-columns.component.d.ts +0 -22
  988. package/src/app/core/table/table.class.d.ts +0 -386
  989. package/src/app/core/table/table.model.d.ts +0 -26
  990. package/src/app/core/table/table.module.d.ts +0 -10
  991. package/src/app/core/table/table.utils.d.ts +0 -11
  992. package/src/app/core/table/testing/table-validator.service.d.ts +0 -17
  993. package/src/app/core/table/testing/table.testing.d.ts +0 -53
  994. package/src/app/core/table/testing/table.testing.module.d.ts +0 -11
  995. package/src/app/shared/alerts.d.ts +0 -53
  996. package/src/app/shared/audio/audio.d.ts +0 -44
  997. package/src/app/shared/audio/audio.testing.d.ts +0 -13
  998. package/src/app/shared/audio/audio.testing.module.d.ts +0 -11
  999. package/src/app/shared/capacitor/keyboard.d.ts +0 -16
  1000. package/src/app/shared/capacitor/plugins.d.ts +0 -7
  1001. package/src/app/shared/constants.d.ts +0 -7
  1002. package/src/app/shared/dates.d.ts +0 -39
  1003. package/src/app/shared/debug/debug-service.class.d.ts +0 -5
  1004. package/src/app/shared/debug/debug.component.d.ts +0 -13
  1005. package/src/app/shared/debug/debug.module.d.ts +0 -12
  1006. package/src/app/shared/directives/autofocus.directive.d.ts +0 -19
  1007. package/src/app/shared/directives/autotitle.directive.d.ts +0 -10
  1008. package/src/app/shared/directives/directives.module.d.ts +0 -12
  1009. package/src/app/shared/directives/drag-and-drop.directive.d.ts +0 -17
  1010. package/src/app/shared/directives/ng-var.directive.d.ts +0 -12
  1011. package/src/app/shared/directives/resizable/resizable.component.d.ts +0 -21
  1012. package/src/app/shared/directives/resizable/resizable.directive.d.ts +0 -12
  1013. package/src/app/shared/directives/resizable/resizable.module.d.ts +0 -8
  1014. package/src/app/shared/events.d.ts +0 -27
  1015. package/src/app/shared/file/csv.utils.d.ts +0 -19
  1016. package/src/app/shared/file/file.service.d.ts +0 -23
  1017. package/src/app/shared/file/file.utils.d.ts +0 -20
  1018. package/src/app/shared/file/images.utils.d.ts +0 -19
  1019. package/src/app/shared/file/json.utils.d.ts +0 -16
  1020. package/src/app/shared/file/uri.utils.d.ts +0 -7
  1021. package/src/app/shared/focusable.d.ts +0 -4
  1022. package/src/app/shared/form/field.component.d.ts +0 -71
  1023. package/src/app/shared/form/field.model.d.ts +0 -37
  1024. package/src/app/shared/form/loading-spinner.d.ts +0 -8
  1025. package/src/app/shared/forms.d.ts +0 -89
  1026. package/src/app/shared/functions.d.ts +0 -132
  1027. package/src/app/shared/geolocation/geolocation.utils.d.ts +0 -19
  1028. package/src/app/shared/gesture/gesture-config.d.ts +0 -15
  1029. package/src/app/shared/gesture/hammer.utils.d.ts +0 -16
  1030. package/src/app/shared/graph/colors.utils.d.ts +0 -17
  1031. package/src/app/shared/graph/graph-colors.d.ts +0 -63
  1032. package/src/app/shared/guard/component-dirty.guard.d.ts +0 -19
  1033. package/src/app/shared/help/help.modal.d.ts +0 -33
  1034. package/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.d.ts +0 -10
  1035. package/src/app/shared/hotkeys/hotkeys.service.d.ts +0 -28
  1036. package/src/app/shared/hotkeys/shared-hotkeys.module.d.ts +0 -11
  1037. package/src/app/shared/http/http.utils.d.ts +0 -27
  1038. package/src/app/shared/image/gallery/image-gallery.component.d.ts +0 -98
  1039. package/src/app/shared/image/gallery/image-gallery.module.d.ts +0 -14
  1040. package/src/app/shared/image/gallery/testing/gallegry.model.testing.d.ts +0 -12
  1041. package/src/app/shared/image/gallery/testing/gallery.service.testing.d.ts +0 -33
  1042. package/src/app/shared/image/gallery/testing/gallery.testing.d.ts +0 -16
  1043. package/src/app/shared/image/gallery/testing/gallery.testing.module.d.ts +0 -12
  1044. package/src/app/shared/image/image.model.d.ts +0 -5
  1045. package/src/app/shared/image/image.module.d.ts +0 -8
  1046. package/src/app/shared/image/image.service.d.ts +0 -32
  1047. package/src/app/shared/inputs.d.ts +0 -32
  1048. package/src/app/shared/interceptors/progess.interceptor.d.ts +0 -8
  1049. package/src/app/shared/logging/log-level.model.d.ts +0 -38
  1050. package/src/app/shared/logging/logger.model.d.ts +0 -68
  1051. package/src/app/shared/logging/logging-service.class.d.ts +0 -39
  1052. package/src/app/shared/logging/logging-service.config.d.ts +0 -25
  1053. package/src/app/shared/logging/logging-service.module.d.ts +0 -9
  1054. package/src/app/shared/material/autocomplete/material.autocomplete.config.d.ts +0 -36
  1055. package/src/app/shared/material/autocomplete/material.autocomplete.d.ts +0 -138
  1056. package/src/app/shared/material/autocomplete/material.autocomplete.module.d.ts +0 -21
  1057. package/src/app/shared/material/autocomplete/material.autocomplete.utils.d.ts +0 -4
  1058. package/src/app/shared/material/autocomplete/testing/autocomplete.test.d.ts +0 -45
  1059. package/src/app/shared/material/badge/badge.directive.d.ts +0 -37
  1060. package/src/app/shared/material/badge/badge.module.d.ts +0 -10
  1061. package/src/app/shared/material/badge/badge.test.d.ts +0 -21
  1062. package/src/app/shared/material/boolean/boolean.module.d.ts +0 -19
  1063. package/src/app/shared/material/boolean/material.boolean.d.ts +0 -66
  1064. package/src/app/shared/material/chips/chips.module.d.ts +0 -21
  1065. package/src/app/shared/material/chips/material.chips.d.ts +0 -126
  1066. package/src/app/shared/material/chips/testing/chips.test.d.ts +0 -31
  1067. package/src/app/shared/material/datetime/datetime.module.d.ts +0 -24
  1068. package/src/app/shared/material/datetime/material.date.d.ts +0 -74
  1069. package/src/app/shared/material/datetime/material.dateshort.d.ts +0 -75
  1070. package/src/app/shared/material/datetime/material.datetime.d.ts +0 -100
  1071. package/src/app/shared/material/datetime/testing/mat-date-time.test.d.ts +0 -31
  1072. package/src/app/shared/material/datetime/testing/mat-date.test.d.ts +0 -30
  1073. package/src/app/shared/material/datetime/testing/mat-dateshort.test.d.ts +0 -29
  1074. package/src/app/shared/material/duration/duration.module.d.ts +0 -18
  1075. package/src/app/shared/material/duration/duration.utils.d.ts +0 -3
  1076. package/src/app/shared/material/duration/material.duration.d.ts +0 -57
  1077. package/src/app/shared/material/latlong/latlong.utils.d.ts +0 -13
  1078. package/src/app/shared/material/latlong/material.latlong.d.ts +0 -65
  1079. package/src/app/shared/material/latlong/material.latlong.module.d.ts +0 -19
  1080. package/src/app/shared/material/latlong/testing/latlong.test.d.ts +0 -21
  1081. package/src/app/shared/material/material.animations.d.ts +0 -4
  1082. package/src/app/shared/material/material.module.d.ts +0 -45
  1083. package/src/app/shared/material/material.testing.module.d.ts +0 -25
  1084. package/src/app/shared/material/numpad/numpad.append-to-input.directive.d.ts +0 -22
  1085. package/src/app/shared/material/numpad/numpad.component.d.ts +0 -26
  1086. package/src/app/shared/material/numpad/numpad.container.d.ts +0 -40
  1087. package/src/app/shared/material/numpad/numpad.content.d.ts +0 -7
  1088. package/src/app/shared/material/numpad/numpad.directive.d.ts +0 -35
  1089. package/src/app/shared/material/numpad/numpad.dom-service.d.ts +0 -16
  1090. package/src/app/shared/material/numpad/numpad.model.d.ts +0 -30
  1091. package/src/app/shared/material/numpad/numpad.module.d.ts +0 -16
  1092. package/src/app/shared/material/numpad/testing/numpad.test.d.ts +0 -13
  1093. package/src/app/shared/material/paginator/material.paginator-i18n.d.ts +0 -15
  1094. package/src/app/shared/material/stepper/material.stepper-i18n.d.ts +0 -10
  1095. package/src/app/shared/material/swipe/material.swipe.d.ts +0 -89
  1096. package/src/app/shared/material/swipe/swipe.module.d.ts +0 -15
  1097. package/src/app/shared/material/swipe/testing/swipe.test.d.ts +0 -22
  1098. package/src/app/shared/modules.d.ts +0 -8
  1099. package/src/app/shared/observables.d.ts +0 -29
  1100. package/src/app/shared/pipes/arrays.pipe.d.ts +0 -54
  1101. package/src/app/shared/pipes/colors.pipe.d.ts +0 -9
  1102. package/src/app/shared/pipes/date-diff-duration.pipe.d.ts +0 -23
  1103. package/src/app/shared/pipes/date-format.pipe.d.ts +0 -34
  1104. package/src/app/shared/pipes/date-from-now.pipe.d.ts +0 -12
  1105. package/src/app/shared/pipes/duration.pipe.d.ts +0 -13
  1106. package/src/app/shared/pipes/file-size.pipe.d.ts +0 -30
  1107. package/src/app/shared/pipes/form.pipes.d.ts +0 -59
  1108. package/src/app/shared/pipes/highlight.pipe.d.ts +0 -11
  1109. package/src/app/shared/pipes/latlong-format.pipe.d.ts +0 -20
  1110. package/src/app/shared/pipes/maps.pipe.d.ts +0 -22
  1111. package/src/app/shared/pipes/math.pipes.d.ts +0 -20
  1112. package/src/app/shared/pipes/ng-init.pipe.d.ts +0 -8
  1113. package/src/app/shared/pipes/number-format.pipe.d.ts +0 -10
  1114. package/src/app/shared/pipes/pipes.module.d.ts +0 -27
  1115. package/src/app/shared/pipes/property.pipes.d.ts +0 -26
  1116. package/src/app/shared/pipes/string.pipes.d.ts +0 -47
  1117. package/src/app/shared/pipes/translate-context.pipe.d.ts +0 -17
  1118. package/src/app/shared/pipes/types.pipes.d.ts +0 -18
  1119. package/src/app/shared/platforms.d.ts +0 -8
  1120. package/src/app/shared/services/entity-service.class.d.ts +0 -73
  1121. package/src/app/shared/services/job.utils.d.ts +0 -20
  1122. package/src/app/shared/services/memory-entity-service.class.d.ts +0 -71
  1123. package/src/app/shared/services/progress-bar.service.d.ts +0 -20
  1124. package/src/app/shared/services/startable-observable-service.class.d.ts +0 -33
  1125. package/src/app/shared/services/startable-service.class.d.ts +0 -34
  1126. package/src/app/shared/services/translate-context.service.d.ts +0 -29
  1127. package/src/app/shared/services/validator-service.class.d.ts +0 -10
  1128. package/src/app/shared/services.d.ts +0 -9
  1129. package/src/app/shared/shared-routing.module.d.ts +0 -22
  1130. package/src/app/shared/shared.module.d.ts +0 -31
  1131. package/src/app/shared/shared.testing.module.d.ts +0 -17
  1132. package/src/app/shared/storage/storage-explorer.component.d.ts +0 -58
  1133. package/src/app/shared/storage/storage-explorer.module.d.ts +0 -16
  1134. package/src/app/shared/storage/storage.service.d.ts +0 -23
  1135. package/src/app/shared/storage/storage.utils.d.ts +0 -19
  1136. package/src/app/shared/testing/observable.test.d.ts +0 -25
  1137. package/src/app/shared/testing/tests.page.d.ts +0 -20
  1138. package/src/app/shared/toast/toast.testing.d.ts +0 -15
  1139. package/src/app/shared/toast/toast.testing.module.d.ts +0 -11
  1140. package/src/app/shared/toast/toasts.d.ts +0 -17
  1141. package/src/app/shared/toolbar/modal-toolbar.d.ts +0 -21
  1142. package/src/app/shared/toolbar/toolbar.d.ts +0 -63
  1143. package/src/app/shared/toolbar/toolbar.module.d.ts +0 -15
  1144. package/src/app/shared/types.d.ts +0 -26
  1145. package/src/app/shared/upload-file/testing/upload-file.testing.d.ts +0 -20
  1146. package/src/app/shared/upload-file/testing/upload-file.testing.module.d.ts +0 -11
  1147. package/src/app/shared/upload-file/upload-file-popover.component.d.ts +0 -39
  1148. package/src/app/shared/upload-file/upload-file.component.d.ts +0 -48
  1149. package/src/app/shared/upload-file/upload-file.model.d.ts +0 -30
  1150. package/src/app/shared/validator/form-error-adapter.class.d.ts +0 -27
  1151. package/src/app/shared/validator/validators.d.ts +0 -115
  1152. package/src/app/shared/version/versions.d.ts +0 -26
  1153. package/src/app/social/job/job.module.d.ts +0 -12
  1154. package/src/app/social/job/progression/job-progression.component.d.ts +0 -9
  1155. package/src/app/social/job/progression/job-progression.icon.d.ts +0 -49
  1156. package/src/app/social/job/progression/job-progression.list.d.ts +0 -21
  1157. package/src/app/social/job/progression/job-progression.model.d.ts +0 -11
  1158. package/src/app/social/job/progression/job-progression.service.d.ts +0 -34
  1159. package/src/app/social/job/testing/job-progression.testing.d.ts +0 -17
  1160. package/src/app/social/job/testing/job-progression.testing.service.d.ts +0 -17
  1161. package/src/app/social/job/testing/job.testing.module.d.ts +0 -11
  1162. package/src/app/social/message/message.form.d.ts +0 -30
  1163. package/src/app/social/message/message.modal.d.ts +0 -39
  1164. package/src/app/social/message/message.model.d.ts +0 -31
  1165. package/src/app/social/message/message.module.d.ts +0 -11
  1166. package/src/app/social/message/message.service.d.ts +0 -27
  1167. package/src/app/social/social.errors.d.ts +0 -9
  1168. package/src/app/social/social.module.d.ts +0 -20
  1169. package/src/app/social/social.testing.module.d.ts +0 -13
  1170. package/src/app/social/user-event/notification/user-event-notification.icon.d.ts +0 -31
  1171. package/src/app/social/user-event/notification/user-event-notification.list.d.ts +0 -71
  1172. package/src/app/social/user-event/testing/user-event.testing.d.ts +0 -34
  1173. package/src/app/social/user-event/testing/user-event.testing.model.d.ts +0 -44
  1174. package/src/app/social/user-event/testing/user-event.testing.module.d.ts +0 -11
  1175. package/src/app/social/user-event/testing/user-event.testing.service.d.ts +0 -41
  1176. package/src/app/social/user-event/user-event.model.d.ts +0 -45
  1177. package/src/app/social/user-event/user-event.module.d.ts +0 -12
  1178. package/src/app/social/user-event/user-event.service.d.ts +0 -124
  1179. package/src/environments/environment.class.d.ts +0 -57
  1180. package/src/environments/environment.d.ts +0 -3
@@ -1,316 +0,0 @@
1
- import { ChangeDetectionStrategy, Component, Inject, ViewChild } from '@angular/core';
2
- import { combineLatest } from 'rxjs';
3
- import { Account } from '../services/model/account.model';
4
- import { Validators } from '@angular/forms';
5
- import { AppForm } from '../form/form.class';
6
- import { AppFormUtils } from '../form/form.utils';
7
- import { LAT_LONG_PATTERNS } from '../../shared/material/latlong/latlong.utils';
8
- import { StatusIds } from '../services/model/model.enum';
9
- import { APP_LOCALES } from '../services/model/settings.model';
10
- import { filter, map } from 'rxjs/operators';
11
- import { CORE_CONFIG_OPTIONS } from '../services/config/core.config';
12
- import { PropertyEntity } from '../form/properties/properties.table';
13
- import { isNotNil } from '../../shared/functions';
14
- import * as i0 from "@angular/core";
15
- import * as i1 from "@angular/forms";
16
- import * as i2 from "../services/account.service";
17
- import * as i3 from "../services/network.service";
18
- import * as i4 from "@ionic/angular";
19
- import * as i5 from "../services/validator/account.validator";
20
- import * as i6 from "../services/config.service";
21
- import * as i7 from "@angular/common";
22
- import * as i8 from "@ngx-translate/core";
23
- import * as i9 from "@angular/material/form-field";
24
- import * as i10 from "@angular/material/input";
25
- import * as i11 from "@angular/material/icon";
26
- import * as i12 from "@angular/material/select";
27
- import * as i13 from "@angular/material/core";
28
- import * as i14 from "@angular/material/tabs";
29
- import * as i15 from "@angular/material/tooltip";
30
- import * as i16 from "../../shared/directives/autofocus.directive";
31
- import * as i17 from "../../shared/toolbar/toolbar";
32
- import * as i18 from "../../shared/form/field.component";
33
- import * as i19 from "../form/buttons/form-buttons-bar.component";
34
- import * as i20 from "../form/properties/properties.table";
35
- import * as i21 from "./token.table";
36
- import * as i22 from "../../shared/pipes/arrays.pipe";
37
- export class AccountPage extends AppForm {
38
- constructor(injector, formBuilder, accountService, network, navController, validatorService,
39
- // protected settingsValidatorService: UserSettingsValidatorService,
40
- configService, cd, locales) {
41
- super(injector, validatorService.getFormGroup(accountService.account));
42
- this.formBuilder = formBuilder;
43
- this.accountService = accountService;
44
- this.network = network;
45
- this.navController = navController;
46
- this.validatorService = validatorService;
47
- this.configService = configService;
48
- this.cd = cd;
49
- this.selectedTabIndex = 0;
50
- this.email = {
51
- confirmed: false,
52
- notConfirmed: false,
53
- sending: false,
54
- error: undefined
55
- };
56
- this.latLongFormats = LAT_LONG_PATTERNS;
57
- this.saving = false;
58
- this.submitted = false;
59
- this.accountReadOnly = false;
60
- this.locales = locales;
61
- // Add settings fo form
62
- // this.settingsForm = settingsValidatorService.getFormGroup(accountService.account && accountService.account.settings);
63
- // this.settingsContentForm = (this.settingsForm.controls['content'] as UntypedFormGroup);
64
- // this.form.addControl('settings', this.settingsForm);
65
- this.mobile = this.settings.mobile;
66
- // By default, disable the form
67
- this.disable();
68
- }
69
- get settingsForm() {
70
- return this.form.get('settings');
71
- }
72
- get valid() {
73
- return super.valid && (this.propertiesTable?.valid || true);
74
- }
75
- ngOnInit() {
76
- super.ngOnInit();
77
- // Get user options
78
- this.optionDefinitions = this.accountService.optionDefs.slice()
79
- .filter(definition => !definition.minProfile || this.accountService.hasMinProfile(definition.minProfile));
80
- // Observed some events
81
- this.registerSubscription(this.accountService.onLogin.pipe(filter(() => !this.saving)).subscribe(account => this.onLogin(account)));
82
- this.registerSubscription(this.accountService.onLogout.subscribe(() => this.onLogout()));
83
- this.registerSubscription(this.onCancel.subscribe(() => {
84
- this.setValue(this.accountService.account);
85
- this.markAsPristine();
86
- }));
87
- this.registerSubscription(this.accountService.$additionalFields
88
- .subscribe((additionalFields) => {
89
- this.additionalFields = additionalFields.slice(); // Copy
90
- if (this.accountService.isLogin()) {
91
- this.onLogin(this.accountService.account);
92
- }
93
- else {
94
- this.markAsLoaded();
95
- }
96
- }));
97
- this.registerSubscription(this.configService.config.subscribe(value => {
98
- this.accountReadOnly = value.getPropertyAsBoolean(CORE_CONFIG_OPTIONS.ACCOUNT_READONLY);
99
- }));
100
- // Realign tab, after a delay because the tab can be disabled when component is created
101
- setTimeout(() => this.tabGroup.realignInkBar(), 500);
102
- }
103
- ngOnDestroy() {
104
- super.ngOnDestroy();
105
- this.stopListenChanges();
106
- this.networkSubscription?.unsubscribe();
107
- }
108
- onLogin(account) {
109
- console.debug('[account] Logged account: ', account);
110
- this.isLogin = true;
111
- this.setValue(account);
112
- this.email.confirmed = account && account.email && (account.statusId !== StatusIds.TEMPORARY);
113
- this.email.notConfirmed = account && account.email && (!account.statusId || account.statusId === StatusIds.TEMPORARY);
114
- this.networkSubscription?.unsubscribe();
115
- this.networkSubscription = combineLatest([
116
- this.configService.config,
117
- this.network.onNetworkStatusChanges
118
- .pipe(map(connectionType => connectionType !== 'none'))
119
- ]).subscribe(([config, online]) => {
120
- if (online) {
121
- const accountReadOnly = config.getPropertyAsBoolean(CORE_CONFIG_OPTIONS.ACCOUNT_READONLY);
122
- this.enable({ accountReadOnly });
123
- this.markAsPristine();
124
- this.startListenChanges();
125
- }
126
- else {
127
- this.disable();
128
- this.markAsPristine();
129
- this.stopListenChanges();
130
- }
131
- this.markAsLoaded();
132
- });
133
- this.markForCheck();
134
- }
135
- onLogout() {
136
- this.isLogin = false;
137
- this.email.confirmed = false;
138
- this.email.notConfirmed = false;
139
- this.email.sending = false;
140
- this.email.error = undefined;
141
- this.form.reset();
142
- this.disable();
143
- this.networkSubscription?.unsubscribe();
144
- this.stopListenChanges();
145
- // Back to home
146
- this.navController.navigateRoot('/');
147
- }
148
- async setValue(data, opts) {
149
- super.setValue(data, opts);
150
- // Set options
151
- const properties = data?.settings?.asLocalSettings()?.properties || {};
152
- const propertiesEntities = [];
153
- this.optionDefinitions
154
- .filter(definition => !definition.minProfile || this.accountService.hasMinProfile(definition.minProfile))
155
- .map(definition => definition.key).forEach(key => {
156
- if (isNotNil(properties[key])) {
157
- propertiesEntities.push(PropertyEntity.fromObject({ id: key, value: properties[key] }));
158
- }
159
- });
160
- if (this.propertiesTable) {
161
- await this.propertiesTable.ready();
162
- this.propertiesTable.value = propertiesEntities;
163
- }
164
- if (this.tokensTable) {
165
- await this.tokensTable.ready();
166
- this.tokensTable.value = data.tokens;
167
- }
168
- }
169
- async refresh(event) {
170
- this.disable();
171
- this.markAsLoading();
172
- return this.accountService.reload();
173
- }
174
- startListenChanges() {
175
- if (this.changesSubscription)
176
- return; // already started
177
- this.changesSubscription = this.accountService.listenChanges();
178
- }
179
- stopListenChanges() {
180
- if (!this.changesSubscription)
181
- return;
182
- this.changesSubscription.unsubscribe();
183
- this.changesSubscription = undefined;
184
- }
185
- async sendConfirmationEmail(event) {
186
- const json = this.form.value;
187
- json.email = this.form.controls['email'].value;
188
- if (!json.email || !this.email.notConfirmed) {
189
- event.preventDefault();
190
- return false;
191
- }
192
- this.email.sending = true;
193
- console.debug('[account] Sending confirmation email...');
194
- try {
195
- await this.accountService.sendConfirmationEmail(json.email, json.settings && json.settings.locale || this.translate.currentLang);
196
- console.debug('[account] Confirmation email sent.');
197
- this.email.sending = false;
198
- }
199
- catch (err) {
200
- this.email.sending = false;
201
- this.email.error = err && err.message || err;
202
- }
203
- }
204
- async save(event) {
205
- if (this.saving)
206
- return false;
207
- if (!this.form.valid) {
208
- await AppFormUtils.waitWhilePending(this.form);
209
- if (this.form.invalid) {
210
- AppFormUtils.logFormErrors(this.form);
211
- this.form.markAllAsTouched();
212
- return false;
213
- }
214
- }
215
- this.submitted = true;
216
- this.saving = true;
217
- this.error = undefined;
218
- const newAccount = Account.fromObject({
219
- ...(this.accountService.account.asObject()),
220
- ...(this.form.value)
221
- });
222
- if (this.propertiesTable) {
223
- // merge properties
224
- await this.propertiesTable.save();
225
- const propertyEntities = this.propertiesTable.value || [];
226
- const properties = propertyEntities.reduce((res, item) => {
227
- res[item.id] = item.value;
228
- return res;
229
- }, {});
230
- newAccount.settings.merge({ properties }, ['properties']);
231
- }
232
- if (this.tokensTable) {
233
- await this.tokensTable.save();
234
- newAccount.tokens = this.tokensTable.value;
235
- }
236
- console.debug('[account] Saving account...', newAccount);
237
- try {
238
- this.disable();
239
- await this.accountService.save(newAccount);
240
- // Reload
241
- setTimeout(() => this.onLogin(this.accountService.account), 100);
242
- this.markAsPristine();
243
- return true;
244
- }
245
- catch (err) {
246
- console.error(err);
247
- this.error = err && err.message || err;
248
- return false;
249
- }
250
- finally {
251
- this.saving = false;
252
- this.enable();
253
- }
254
- }
255
- enable(opts) {
256
- super.enable();
257
- // Some fields are always disable
258
- this.form.controls.email.disable();
259
- this.form.controls.mainProfile.disable();
260
- this.form.controls.pubkey.disable();
261
- // Disable account fields if readonly by configuration
262
- if (opts?.accountReadOnly) {
263
- this.form.controls.lastName.disable();
264
- this.form.controls.firstName.disable();
265
- }
266
- // Always disable some additional fields
267
- this.additionalFields
268
- .forEach(field => {
269
- const control = this.form.controls[field.key];
270
- if (!control)
271
- return; // Skip
272
- const disabled = field.extra?.account && field.extra.account.disabled || false;
273
- if (disabled && control.enabled) {
274
- control.disable();
275
- }
276
- const required = field.extra?.account && field.extra.account.required || false;
277
- if (!field.required && required) {
278
- control.setValidators(control.validator
279
- ? Validators.compose([control.validator, Validators.required])
280
- : Validators.required);
281
- }
282
- });
283
- this.markForCheck();
284
- }
285
- async cancel() {
286
- await super.cancel();
287
- }
288
- async close(event) {
289
- if (this.saving)
290
- return;
291
- // Back to home
292
- return this.navController.navigateRoot('/'); // back to home
293
- }
294
- markForCheck() {
295
- this.cd.markForCheck();
296
- }
297
- }
298
- AccountPage.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: AccountPage, deps: [{ token: i0.Injector }, { token: i1.UntypedFormBuilder }, { token: i2.AccountService }, { token: i3.NetworkService }, { token: i4.NavController }, { token: i5.AccountValidatorService }, { token: i6.ConfigService }, { token: i0.ChangeDetectorRef }, { token: APP_LOCALES }], target: i0.ɵɵFactoryTarget.Component });
299
- AccountPage.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: AccountPage, selector: "app-account-page", viewQueries: [{ propertyName: "tabGroup", first: true, predicate: ["tabGroup"], descendants: true, static: true }, { propertyName: "propertiesTable", first: true, predicate: ["propertiesTable"], descendants: true, static: true }, { propertyName: "tokensTable", first: true, predicate: ["tokensTable"], descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<app-toolbar [title]=\"'ACCOUNT.TITLE'|translate\" color=\"primary\"\n [hasValidate]=\"dirty && !saving\"\n [hasClose]=\"!dirty && !saving\"\n (onValidate)=\"save($event)\"\n [canGoBack]=\"false\"\n (onClose)=\"close($event)\">\n\n <ion-buttons slot=\"end\">\n <!-- loader -->\n <ion-spinner *ngIf=\"loading || saving; else endButtons\"></ion-spinner>\n\n <ng-template #endButtons>\n <!-- refresh button (if online) -->\n <ion-button [matTooltip]=\"'COMMON.BTN_REFRESH'|translate\"\n *ngIf=\"network.online\"\n (click)=\"refresh($event)\">\n <mat-icon slot=\"icon-only\">refresh</mat-icon>\n </ion-button>\n </ng-template>\n </ion-buttons>\n</app-toolbar>\n\n<ion-content>\n\n <!-- error -->\n <ion-item *ngIf=\"error && mobile\" lines=\"none\">\n <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n <ion-label color=\"danger\" class=\"error\" [innerHTML]=\"error|translate\"></ion-label>\n </ion-item>\n\n <form [formGroup]=\"form\" novalidate class=\"form-container\">\n\n <mat-tab-group #tabGroup [(selectedIndex)]=\"selectedTabIndex\" dynamicHeight>\n\n <!-- TAB: user details -->\n <mat-tab label=\"{{'ACCOUNT.USER_DETAILS.TITLE'|translate}}\" class=\"ion-padding\">\n <ng-template mat-tab-label>\n <mat-icon>\n <ion-icon matPrefix slot=\"start\" name=\"person-circle\"></ion-icon>\n </mat-icon>\n <ion-label>{{'ACCOUNT.USER_DETAILS.TITLE'|translate}}</ion-label>\n <ion-icon slot=\"end\" name=\"alert-circle\" color=\"danger\" *ngIf=\"submitted && form.invalid\"></ion-icon>\n </ng-template>\n\n <div class=\"ion-padding\">\n\n <p [innerHTML]=\"'ACCOUNT.USER_DETAILS.DESCRIPTION'|translate\"></p>\n\n <!--h1>Identit\u00E9</h1-->\n\n <!-- Email -->\n <mat-form-field>\n <input matInput [placeholder]=\"'USER.EMAIL'|translate\"\n formControlName=\"email\" autocomplete=\"section-red email\">\n <mat-error *ngIf=\"form.controls.email.hasError('required') && form.controls.email.dirty\" translate>ERROR.FIELD_REQUIRED</mat-error>\n <mat-error *ngIf=\"form.controls.email.hasError('email') && form.controls.email.dirty\">\n <span>{{'ERROR.FIELD_NOT_VALID_EMAIL' | translate }}</span>\n </mat-error>\n </mat-form-field>\n\n <ion-grid *ngIf=\"email.notConfirmed\" class=\"ion-no-padding ion-padding-bottom\">\n <ion-row>\n <ion-col color=\"danger\">\n <ion-icon slot=\"start\" color=\"danger\" name=\"alert-circle\" color=\"danger\"></ion-icon>\n <ion-text [innerHTML]=\"'ACCOUNT.EMAIL_NOT_CONFIRMED_LABEL'|translate\"></ion-text>\n </ion-col>\n </ion-row>\n\n <ion-row style=\"height: 51px;\">\n <ion-col style=\"text-align: right;\">\n <ion-text>\n <small [innerHTML]=\"'ACCOUNT.EMAIL_NOT_RECEIVED_QUESTION'|translate\"></small>\n </ion-text>\n </ion-col>\n <ion-col size=\"auto\">\n <ion-button fill=\"solid\" color=\"secondary\" *ngIf=\"!email.sending\" (click)=\"sendConfirmationEmail($event)\">\n {{'ACCOUNT.BTN_RESEND'|translate}}\n </ion-button>\n <ion-spinner class=\"ion-no-padding\" *ngIf=\"email.sending\"></ion-spinner>\n </ion-col>\n </ion-row>\n\n <ion-row *ngIf=\"email.error && !email.sending\">\n <ion-col>\n <span *ngIf=\"email.error && !email.sending\" [innerHTML]=\"email.error|translate\"></span>\n </ion-col>\n </ion-row>\n </ion-grid>\n\n <!-- Last name -->\n <mat-form-field>\n <input matInput [appAutofocus]=\"true\" [autofocusDelay]=\"500\" [placeholder]=\"'USER.LAST_NAME'|translate\"\n formControlName=\"lastName\"\n autocomplete=\"section-blue family-name\"\n required>\n <mat-error *ngIf=\"form.controls.lastName.hasError('required') && form.controls.lastName.dirty\"\n translate>ERROR.FIELD_REQUIRED\n </mat-error>\n <mat-error *ngIf=\"form.controls.lastName.hasError('minlength') && form.controls.lastName.dirty\">\n <span>{{'ERROR.FIELD_MIN_LENGTH' | translate: {minLength: 2} }}</span>\n </mat-error>\n </mat-form-field>\n\n <!-- First name -->\n <mat-form-field>\n <input matInput [placeholder]=\"'USER.FIRST_NAME'|translate\" formControlName=\"firstName\" autocomplete=\"section-blue given-name\"\n required>\n <mat-error *ngIf=\"form.controls.firstName.hasError('required') && form.controls.firstName.dirty\"\n translate>ERROR.FIELD_REQUIRED\n </mat-error>\n <mat-error *ngIf=\"form.controls.firstName.hasError('minlength') && form.controls.firstName.dirty\">\n <span>{{'ERROR.FIELD_MIN_LENGTH' | translate: {minLength: 2} }}</span>\n </mat-error>\n </mat-form-field>\n\n\n <!-- Additional fields -->\n <ng-container *ngFor=\"let definition of additionalFields\">\n <app-form-field [definition]=\"definition\"\n [formControlName]=\"definition.key\"\n [required]=\"definition.extra && definition.extra.account && definition.extra.account.required || false\">\n </app-form-field>\n </ng-container>\n\n <h3 translate>ACCOUNT.USER_DETAILS.TECHNICAL_DIVIDER</h3>\n\n <!-- profile -->\n <mat-form-field>\n <input matInput hidden readonly=\"true\" [placeholder]=\"'ACCOUNT.USER_DETAILS.PROFILE'|translate\"\n formControlName=\"mainProfile\" required>\n <span>{{'USER.PROFILE_ENUM.' + form.controls.mainProfile.value | translate}}</span>\n <mat-error *ngIf=\"form.controls.firstName.hasError('mainProfile') && form.controls.mainProfile.dirty\"\n translate>ERROR.FIELD_REQUIRED\n </mat-error>\n </mat-form-field>\n\n <!-- pubkey -->\n <mat-form-field>\n <input matInput readonly=\"true\" [placeholder]=\"'ACCOUNT.USER_DETAILS.PUBKEY'|translate\" formControlName=\"pubkey\"\n required>\n <mat-error *ngIf=\"form.controls.firstName.hasError('pubkey') && form.controls.firstName.dirty\"\n translate>ERROR.FIELD_REQUIRED\n </mat-error>\n <mat-error *ngIf=\"form.controls.firstName.hasError('pubkey') && form.controls.firstName.dirty\">\n <span translate>ERROR.FIELD_NOT_VALID_PUBKEY</span>\n </mat-error>\n </mat-form-field>\n\n </div>\n </mat-tab>\n\n <!-- TAB: settings -->\n <mat-tab label=\"{{'ACCOUNT.SETTINGS.TITLE'|translate}}\" formGroupName=\"settings\">\n <ng-template mat-tab-label>\n <mat-icon>\n <ion-icon matPrefix slot=\"start\" name=\"settings\"></ion-icon>\n </mat-icon>\n <ion-label translate>ACCOUNT.SETTINGS.TITLE</ion-label>\n </ng-template>\n\n <div class=\"ion-padding\">\n\n <p [innerHTML]=\"'ACCOUNT.SETTINGS.DESCRIPTION'|translate\"></p>\n\n <mat-form-field>\n <mat-select [placeholder]=\"'ACCOUNT.SETTINGS.LOCALE'|translate\" formControlName=\"locale\" required>\n <mat-option *ngFor=\"let item of locales\" [value]=\"item.key\">\n {{item.value}}\n </mat-option>\n </mat-select>\n <mat-error *ngIf=\"settingsForm?.controls.locale.hasError('required') && settingsForm?.controls.locale.dirty\"\n translate>ERROR.FIELD_REQUIRED\n </mat-error>\n </mat-form-field>\n\n <!-- lat/long format-->\n <mat-form-field>\n <mat-select [placeholder]=\"'ACCOUNT.SETTINGS.LAT_LONG_FORMAT'|translate\" formControlName=\"latLongFormat\"\n required>\n <mat-option *ngFor=\"let item of latLongFormats\" [value]=\"item\">\n {{'COMMON.LAT_LONG.' + item + '_PLACEHOLDER'|translate}}\n </mat-option>\n </mat-select>\n <mat-error *ngIf=\"settingsForm?.controls.latLongFormat.hasError('required') && settingsForm?.controls.latLongFormat.dirty\"\n translate>ERROR.FIELD_REQUIRED\n </mat-error>\n </mat-form-field>\n\n </div>\n\n <!-- Options table -->\n <div class=\"options-table\" [class.cdk-visually-hidden]=\"optionDefinitions | isEmptyArray\">\n <app-properties-table\n #propertiesTable\n i18nColumnPrefix=\"ACCOUNT.SETTINGS.OPTIONS.\"\n [definitions]=\"optionDefinitions\"\n [canEdit]=\"true\"\n (onDirty)=\"$event ? markAsDirty() : undefined\"\n ></app-properties-table>\n </div>\n\n </mat-tab>\n\n <!-- TAB: tokens -->\n <mat-tab label=\"{{'ACCOUNT.TOKENS.TITLE'|translate}}\" formGroupName=\"tokens\">\n <ng-template mat-tab-label>\n <mat-icon>\n <ion-icon matPrefix slot=\"start\" name=\"ticket\"></ion-icon>\n </mat-icon>\n <ion-label translate>ACCOUNT.TOKENS.TITLE</ion-label>\n </ng-template>\n\n <div class=\"ion-padding\">\n <p [innerHTML]=\"'ACCOUNT.TOKENS.DESCRIPTION'|translate\"></p>\n </div>\n\n <!-- Tokens table -->\n <div class=\"tokens-table\">\n <app-user-token-table\n #tokensTable\n [canEdit]=\"true\"\n (onDirty)=\"$event ? markAsDirty() : undefined\"\n ></app-user-token-table>\n </div>\n\n </mat-tab>\n </mat-tab-group>\n\n\n </form>\n</ion-content>\n\n<ion-footer hidden-xs hidden-sm hidden-mobile>\n <app-form-buttons-bar (onCancel)=\"cancel()\" (onSave)=\"save($event)\" [disabled]=\"!form.dirty || !valid || saving\">\n <!-- error -->\n <ion-item *ngIf=\"error && !mobile\" lines=\"none\">\n <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n <ion-label color=\"danger\" class=\"error\" [innerHTML]=\"error|translate\"></ion-label>\n </ion-item>\n </app-form-buttons-bar>\n</ion-footer>\n", styles: ["mat-tab-group .mat-tab-body-content{padding:var(--ion-grid-padding);display:grid}form{width:100%}form mat-form-field{width:100%}div.options-table{height:calc(100vh - 380px)}div.tokens-table{height:calc(100vh - 250px)}\n"], dependencies: [{ kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i4.IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: i4.IonCol, selector: "ion-col", inputs: ["offset", "offsetLg", "offsetMd", "offsetSm", "offsetXl", "offsetXs", "pull", "pullLg", "pullMd", "pullSm", "pullXl", "pullXs", "push", "pushLg", "pushMd", "pushSm", "pushXl", "pushXs", "size", "sizeLg", "sizeMd", "sizeSm", "sizeXl", "sizeXs"] }, { kind: "component", type: i4.IonContent, selector: "ion-content", inputs: ["color", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: i4.IonFooter, selector: "ion-footer", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: i4.IonGrid, selector: "ion-grid", inputs: ["fixed"] }, { kind: "component", type: i4.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i4.IonItem, selector: "ion-item", inputs: ["button", "color", "counter", "counterFormatter", "detail", "detailIcon", "disabled", "download", "fill", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "shape", "target", "type"] }, { kind: "component", type: i4.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i4.IonRow, selector: "ion-row" }, { kind: "component", type: i4.IonSpinner, selector: "ion-spinner", inputs: ["color", "duration", "name", "paused"] }, { kind: "component", type: i4.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "directive", type: i8.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i1.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i9.MatError, selector: "mat-error", inputs: ["id"] }, { kind: "component", type: i9.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i9.MatPrefix, selector: "[matPrefix]" }, { kind: "directive", type: i10.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i11.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i12.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { kind: "component", type: i13.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "component", type: i14.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "disableRipple"], exportAs: ["matTabGroup"] }, { kind: "directive", type: i14.MatTabLabel, selector: "[mat-tab-label], [matTabLabel]" }, { kind: "component", type: i14.MatTab, selector: "mat-tab", inputs: ["disabled", "label", "aria-label", "aria-labelledby", "labelClass", "bodyClass"], exportAs: ["matTab"] }, { kind: "directive", type: i15.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "directive", type: i16.AutofocusDirective, selector: "[autofocus], input[appAutofocus]", inputs: ["appAutofocus", "autofocusDelay"] }, { kind: "component", type: i17.ToolbarComponent, selector: "app-toolbar", inputs: ["progressBarMode", "title", "color", "class", "backHref", "defaultBackHref", "hasValidate", "hasClose", "hasSearch", "canGoBack", "canShowMenu"], outputs: ["onValidate", "onClose", "onValidateAndClose", "onBackClick", "onSearch"] }, { kind: "component", type: i18.AppFormField, selector: "app-form-field", inputs: ["definition", "required", "readonly", "disabled", "formControl", "formControlName", "placeholder", "compact", "floatLabel", "tabindex", "autofocus", "clearable", "chipColor", "debug", "class"], outputs: ["keyup.enter"] }, { kind: "component", type: i19.FormButtonsBarComponent, selector: "app-form-buttons-bar", inputs: ["disabled", "disabledCancel", "classList"], outputs: ["onCancel", "onSave", "onNext", "onBack"] }, { kind: "component", type: i20.AppPropertiesTable, selector: "app-properties-table", inputs: ["definitions", "showToolbar"] }, { kind: "component", type: i21.UserTokenTable, selector: "app-user-token-table", inputs: ["useSticky"] }, { kind: "pipe", type: i8.TranslatePipe, name: "translate" }, { kind: "pipe", type: i22.EmptyArrayPipe, name: "isEmptyArray" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
300
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: AccountPage, decorators: [{
301
- type: Component,
302
- args: [{ selector: 'app-account-page', changeDetection: ChangeDetectionStrategy.OnPush, template: "<app-toolbar [title]=\"'ACCOUNT.TITLE'|translate\" color=\"primary\"\n [hasValidate]=\"dirty && !saving\"\n [hasClose]=\"!dirty && !saving\"\n (onValidate)=\"save($event)\"\n [canGoBack]=\"false\"\n (onClose)=\"close($event)\">\n\n <ion-buttons slot=\"end\">\n <!-- loader -->\n <ion-spinner *ngIf=\"loading || saving; else endButtons\"></ion-spinner>\n\n <ng-template #endButtons>\n <!-- refresh button (if online) -->\n <ion-button [matTooltip]=\"'COMMON.BTN_REFRESH'|translate\"\n *ngIf=\"network.online\"\n (click)=\"refresh($event)\">\n <mat-icon slot=\"icon-only\">refresh</mat-icon>\n </ion-button>\n </ng-template>\n </ion-buttons>\n</app-toolbar>\n\n<ion-content>\n\n <!-- error -->\n <ion-item *ngIf=\"error && mobile\" lines=\"none\">\n <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n <ion-label color=\"danger\" class=\"error\" [innerHTML]=\"error|translate\"></ion-label>\n </ion-item>\n\n <form [formGroup]=\"form\" novalidate class=\"form-container\">\n\n <mat-tab-group #tabGroup [(selectedIndex)]=\"selectedTabIndex\" dynamicHeight>\n\n <!-- TAB: user details -->\n <mat-tab label=\"{{'ACCOUNT.USER_DETAILS.TITLE'|translate}}\" class=\"ion-padding\">\n <ng-template mat-tab-label>\n <mat-icon>\n <ion-icon matPrefix slot=\"start\" name=\"person-circle\"></ion-icon>\n </mat-icon>\n <ion-label>{{'ACCOUNT.USER_DETAILS.TITLE'|translate}}</ion-label>\n <ion-icon slot=\"end\" name=\"alert-circle\" color=\"danger\" *ngIf=\"submitted && form.invalid\"></ion-icon>\n </ng-template>\n\n <div class=\"ion-padding\">\n\n <p [innerHTML]=\"'ACCOUNT.USER_DETAILS.DESCRIPTION'|translate\"></p>\n\n <!--h1>Identit\u00E9</h1-->\n\n <!-- Email -->\n <mat-form-field>\n <input matInput [placeholder]=\"'USER.EMAIL'|translate\"\n formControlName=\"email\" autocomplete=\"section-red email\">\n <mat-error *ngIf=\"form.controls.email.hasError('required') && form.controls.email.dirty\" translate>ERROR.FIELD_REQUIRED</mat-error>\n <mat-error *ngIf=\"form.controls.email.hasError('email') && form.controls.email.dirty\">\n <span>{{'ERROR.FIELD_NOT_VALID_EMAIL' | translate }}</span>\n </mat-error>\n </mat-form-field>\n\n <ion-grid *ngIf=\"email.notConfirmed\" class=\"ion-no-padding ion-padding-bottom\">\n <ion-row>\n <ion-col color=\"danger\">\n <ion-icon slot=\"start\" color=\"danger\" name=\"alert-circle\" color=\"danger\"></ion-icon>\n <ion-text [innerHTML]=\"'ACCOUNT.EMAIL_NOT_CONFIRMED_LABEL'|translate\"></ion-text>\n </ion-col>\n </ion-row>\n\n <ion-row style=\"height: 51px;\">\n <ion-col style=\"text-align: right;\">\n <ion-text>\n <small [innerHTML]=\"'ACCOUNT.EMAIL_NOT_RECEIVED_QUESTION'|translate\"></small>\n </ion-text>\n </ion-col>\n <ion-col size=\"auto\">\n <ion-button fill=\"solid\" color=\"secondary\" *ngIf=\"!email.sending\" (click)=\"sendConfirmationEmail($event)\">\n {{'ACCOUNT.BTN_RESEND'|translate}}\n </ion-button>\n <ion-spinner class=\"ion-no-padding\" *ngIf=\"email.sending\"></ion-spinner>\n </ion-col>\n </ion-row>\n\n <ion-row *ngIf=\"email.error && !email.sending\">\n <ion-col>\n <span *ngIf=\"email.error && !email.sending\" [innerHTML]=\"email.error|translate\"></span>\n </ion-col>\n </ion-row>\n </ion-grid>\n\n <!-- Last name -->\n <mat-form-field>\n <input matInput [appAutofocus]=\"true\" [autofocusDelay]=\"500\" [placeholder]=\"'USER.LAST_NAME'|translate\"\n formControlName=\"lastName\"\n autocomplete=\"section-blue family-name\"\n required>\n <mat-error *ngIf=\"form.controls.lastName.hasError('required') && form.controls.lastName.dirty\"\n translate>ERROR.FIELD_REQUIRED\n </mat-error>\n <mat-error *ngIf=\"form.controls.lastName.hasError('minlength') && form.controls.lastName.dirty\">\n <span>{{'ERROR.FIELD_MIN_LENGTH' | translate: {minLength: 2} }}</span>\n </mat-error>\n </mat-form-field>\n\n <!-- First name -->\n <mat-form-field>\n <input matInput [placeholder]=\"'USER.FIRST_NAME'|translate\" formControlName=\"firstName\" autocomplete=\"section-blue given-name\"\n required>\n <mat-error *ngIf=\"form.controls.firstName.hasError('required') && form.controls.firstName.dirty\"\n translate>ERROR.FIELD_REQUIRED\n </mat-error>\n <mat-error *ngIf=\"form.controls.firstName.hasError('minlength') && form.controls.firstName.dirty\">\n <span>{{'ERROR.FIELD_MIN_LENGTH' | translate: {minLength: 2} }}</span>\n </mat-error>\n </mat-form-field>\n\n\n <!-- Additional fields -->\n <ng-container *ngFor=\"let definition of additionalFields\">\n <app-form-field [definition]=\"definition\"\n [formControlName]=\"definition.key\"\n [required]=\"definition.extra && definition.extra.account && definition.extra.account.required || false\">\n </app-form-field>\n </ng-container>\n\n <h3 translate>ACCOUNT.USER_DETAILS.TECHNICAL_DIVIDER</h3>\n\n <!-- profile -->\n <mat-form-field>\n <input matInput hidden readonly=\"true\" [placeholder]=\"'ACCOUNT.USER_DETAILS.PROFILE'|translate\"\n formControlName=\"mainProfile\" required>\n <span>{{'USER.PROFILE_ENUM.' + form.controls.mainProfile.value | translate}}</span>\n <mat-error *ngIf=\"form.controls.firstName.hasError('mainProfile') && form.controls.mainProfile.dirty\"\n translate>ERROR.FIELD_REQUIRED\n </mat-error>\n </mat-form-field>\n\n <!-- pubkey -->\n <mat-form-field>\n <input matInput readonly=\"true\" [placeholder]=\"'ACCOUNT.USER_DETAILS.PUBKEY'|translate\" formControlName=\"pubkey\"\n required>\n <mat-error *ngIf=\"form.controls.firstName.hasError('pubkey') && form.controls.firstName.dirty\"\n translate>ERROR.FIELD_REQUIRED\n </mat-error>\n <mat-error *ngIf=\"form.controls.firstName.hasError('pubkey') && form.controls.firstName.dirty\">\n <span translate>ERROR.FIELD_NOT_VALID_PUBKEY</span>\n </mat-error>\n </mat-form-field>\n\n </div>\n </mat-tab>\n\n <!-- TAB: settings -->\n <mat-tab label=\"{{'ACCOUNT.SETTINGS.TITLE'|translate}}\" formGroupName=\"settings\">\n <ng-template mat-tab-label>\n <mat-icon>\n <ion-icon matPrefix slot=\"start\" name=\"settings\"></ion-icon>\n </mat-icon>\n <ion-label translate>ACCOUNT.SETTINGS.TITLE</ion-label>\n </ng-template>\n\n <div class=\"ion-padding\">\n\n <p [innerHTML]=\"'ACCOUNT.SETTINGS.DESCRIPTION'|translate\"></p>\n\n <mat-form-field>\n <mat-select [placeholder]=\"'ACCOUNT.SETTINGS.LOCALE'|translate\" formControlName=\"locale\" required>\n <mat-option *ngFor=\"let item of locales\" [value]=\"item.key\">\n {{item.value}}\n </mat-option>\n </mat-select>\n <mat-error *ngIf=\"settingsForm?.controls.locale.hasError('required') && settingsForm?.controls.locale.dirty\"\n translate>ERROR.FIELD_REQUIRED\n </mat-error>\n </mat-form-field>\n\n <!-- lat/long format-->\n <mat-form-field>\n <mat-select [placeholder]=\"'ACCOUNT.SETTINGS.LAT_LONG_FORMAT'|translate\" formControlName=\"latLongFormat\"\n required>\n <mat-option *ngFor=\"let item of latLongFormats\" [value]=\"item\">\n {{'COMMON.LAT_LONG.' + item + '_PLACEHOLDER'|translate}}\n </mat-option>\n </mat-select>\n <mat-error *ngIf=\"settingsForm?.controls.latLongFormat.hasError('required') && settingsForm?.controls.latLongFormat.dirty\"\n translate>ERROR.FIELD_REQUIRED\n </mat-error>\n </mat-form-field>\n\n </div>\n\n <!-- Options table -->\n <div class=\"options-table\" [class.cdk-visually-hidden]=\"optionDefinitions | isEmptyArray\">\n <app-properties-table\n #propertiesTable\n i18nColumnPrefix=\"ACCOUNT.SETTINGS.OPTIONS.\"\n [definitions]=\"optionDefinitions\"\n [canEdit]=\"true\"\n (onDirty)=\"$event ? markAsDirty() : undefined\"\n ></app-properties-table>\n </div>\n\n </mat-tab>\n\n <!-- TAB: tokens -->\n <mat-tab label=\"{{'ACCOUNT.TOKENS.TITLE'|translate}}\" formGroupName=\"tokens\">\n <ng-template mat-tab-label>\n <mat-icon>\n <ion-icon matPrefix slot=\"start\" name=\"ticket\"></ion-icon>\n </mat-icon>\n <ion-label translate>ACCOUNT.TOKENS.TITLE</ion-label>\n </ng-template>\n\n <div class=\"ion-padding\">\n <p [innerHTML]=\"'ACCOUNT.TOKENS.DESCRIPTION'|translate\"></p>\n </div>\n\n <!-- Tokens table -->\n <div class=\"tokens-table\">\n <app-user-token-table\n #tokensTable\n [canEdit]=\"true\"\n (onDirty)=\"$event ? markAsDirty() : undefined\"\n ></app-user-token-table>\n </div>\n\n </mat-tab>\n </mat-tab-group>\n\n\n </form>\n</ion-content>\n\n<ion-footer hidden-xs hidden-sm hidden-mobile>\n <app-form-buttons-bar (onCancel)=\"cancel()\" (onSave)=\"save($event)\" [disabled]=\"!form.dirty || !valid || saving\">\n <!-- error -->\n <ion-item *ngIf=\"error && !mobile\" lines=\"none\">\n <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n <ion-label color=\"danger\" class=\"error\" [innerHTML]=\"error|translate\"></ion-label>\n </ion-item>\n </app-form-buttons-bar>\n</ion-footer>\n", styles: ["mat-tab-group .mat-tab-body-content{padding:var(--ion-grid-padding);display:grid}form{width:100%}form mat-form-field{width:100%}div.options-table{height:calc(100vh - 380px)}div.tokens-table{height:calc(100vh - 250px)}\n"] }]
303
- }], ctorParameters: function () { return [{ type: i0.Injector }, { type: i1.UntypedFormBuilder }, { type: i2.AccountService }, { type: i3.NetworkService }, { type: i4.NavController }, { type: i5.AccountValidatorService }, { type: i6.ConfigService }, { type: i0.ChangeDetectorRef }, { type: undefined, decorators: [{
304
- type: Inject,
305
- args: [APP_LOCALES]
306
- }] }]; }, propDecorators: { tabGroup: [{
307
- type: ViewChild,
308
- args: ['tabGroup', { static: true }]
309
- }], propertiesTable: [{
310
- type: ViewChild,
311
- args: ['propertiesTable', { static: true }]
312
- }], tokensTable: [{
313
- type: ViewChild,
314
- args: ['tokensTable', { static: true }]
315
- }] } });
316
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNjb3VudC5wYWdlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9jb3JlL2FjY291bnQvYWNjb3VudC5wYWdlLnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9jb3JlL2FjY291bnQvYWNjb3VudC5wYWdlLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLHVCQUF1QixFQUFxQixTQUFTLEVBQUUsTUFBTSxFQUErQixTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDcEksT0FBTyxFQUFDLGFBQWEsRUFBZSxNQUFNLE1BQU0sQ0FBQztBQUVqRCxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0saUNBQWlDLENBQUM7QUFDeEQsT0FBTyxFQUF1QyxVQUFVLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUVoRixPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFDM0MsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBRWhELE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLDZDQUE2QyxDQUFDO0FBQzlFLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSw4QkFBOEIsQ0FBQztBQUN2RCxPQUFPLEVBQUMsV0FBVyxFQUE4QixNQUFNLGtDQUFrQyxDQUFDO0FBSTFGLE9BQU8sRUFBQyxNQUFNLEVBQUUsR0FBRyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFHM0MsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sZ0NBQWdDLENBQUM7QUFDbkUsT0FBTyxFQUFxQixjQUFjLEVBQUMsTUFBTSxxQ0FBcUMsQ0FBQztBQUV2RixPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sd0JBQXdCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVVoRCxNQUFNLE9BQU8sV0FBWSxTQUFRLE9BQWdCO0lBa0MvQyxZQUNFLFFBQWtCLEVBQ1gsV0FBK0IsRUFDL0Is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QUFDO29CQUM5RCxDQUFDLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQzFCO1FBRUgsQ0FBQyxDQUFDLENBQUM7UUFDTCxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVELEtBQUssQ0FBQyxNQUFNO1FBQ1YsTUFBTSxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDdkIsQ0FBQztJQUVELEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBYTtRQUN2QixJQUFJLElBQUksQ0FBQyxNQUFNO1lBQUUsT0FBTztRQUV4QixlQUFlO1FBQ2YsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLGVBQWU7SUFDOUQsQ0FBQztJQUVTLFlBQVk7UUFDcEIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN6QixDQUFDOzt3R0E1VVUsV0FBVywwUUE0Q1osV0FBVzs0RkE1Q1YsV0FBVyxpYUMvQnhCLG8zVUFpUEE7MkZEbE5hLFdBQVc7a0JBTnZCLFNBQVM7K0JBQ0Usa0JBQWtCLG1CQUdYLHVCQUF1QixDQUFDLE1BQU07OzBCQThDNUMsTUFBTTsyQkFBQyxXQUFXOzRDQTNDa0IsUUFBUTtzQkFBOUMsU0FBUzt1QkFBQyxVQUFVLEVBQUUsRUFBQyxNQUFNLEVBQUUsSUFBSSxFQUFDO2dCQUNTLGVBQWU7c0JBQTVELFNBQVM7dUJBQUMsaUJBQWlCLEVBQUUsRUFBQyxNQUFNLEVBQUUsSUFBSSxFQUFDO2dCQUNGLFdBQVc7c0JBQXBELFNBQVM7dUJBQUMsYUFBYSxFQUFFLEVBQUMsTUFBTSxFQUFFLElBQUksRUFBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEluamVjdCwgSW5qZWN0b3IsIE9uRGVzdHJveSwgT25Jbml0LCBWaWV3Q2hpbGR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtjb21iaW5lTGF0ZXN0LCBTdWJzY3JpcHRpb259IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtBY2NvdW50U2VydmljZX0gZnJvbSAnLi4vc2VydmljZXMvYWNjb3VudC5zZXJ2aWNlJztcbmltcG9ydCB7QWNjb3VudH0gZnJvbSAnLi4vc2VydmljZXMvbW9kZWwvYWNjb3VudC5tb2RlbCc7XG5pbXBvcnQge1VudHlwZWRGb3JtQnVpbGRlciwgVW50eXBlZEZvcm1Hcm91cCwgVmFsaWRhdG9yc30gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtBY2NvdW50VmFsaWRhdG9yU2VydmljZX0gZnJvbSAnLi4vc2VydmljZXMvdmFsaWRhdG9yL2FjY291bnQudmFsaWRhdG9yJztcbmltcG9ydCB7QXBwRm9ybX0gZnJvbSAnLi4vZm9ybS9mb3JtLmNsYXNzJztcbmltcG9ydCB7QXBwRm9ybVV0aWxzfSBmcm9tICcuLi9mb3JtL2Zvcm0udXRpbHMnO1xuaW1wb3J0IHtGb3JtRmllbGREZWZpbml0aW9ufSBmcm9tICcuLi8uLi9zaGFyZWQvZm9ybS9maWVsZC5tb2RlbCc7XG5pbXBvcnQge0xBVF9MT05HX1BBVFRFUk5TfSBmcm9tICcuLi8uLi9zaGFyZWQvbWF0ZXJpYWwvbGF0bG9uZy9sYXRsb25nLnV0aWxzJztcbmltcG9ydCB7U3RhdHVzSWRzfSBmcm9tICcuLi9zZXJ2aWNlcy9tb2RlbC9tb2RlbC5lbnVtJztcbmltcG9ydCB7QVBQX0xPQ0FMRVMsIExvY2FsZUNvbmZpZywgTG9jYWxTZXR0aW5nc30gZnJvbSAnLi4vc2VydmljZXMvbW9kZWwvc2V0dGluZ3MubW9kZWwnO1xuaW1wb3J0IHtSb3V0ZXJ9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQge0NhbkxlYXZlfSBmcm9tICcuLi8uLi9zaGFyZWQvZ3VhcmQvY29tcG9uZW50LWRpcnR5Lmd1YXJkJztcbmltcG9ydCB7TmV0d29ya1NlcnZpY2V9IGZyb20gJy4uL3NlcnZpY2VzL25ldHdvcmsuc2VydmljZSc7XG5pbXBvcnQge2ZpbHRlciwgbWFwfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge01hdFRhYkdyb3VwfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90YWJzJztcbmltcG9ydCB7Q29uZmlnU2VydmljZX0gZnJvbSAnLi4vc2VydmljZXMvY29uZmlnLnNlcnZpY2UnO1xuaW1wb3J0IHtDT1JFX0NPTkZJR19PUFRJT05TfSBmcm9tICcuLi9zZXJ2aWNlcy9jb25maWcvY29yZS5jb25maWcnO1xuaW1wb3J0IHtBcHBQcm9wZXJ0aWVzVGFibGUsIFByb3BlcnR5RW50aXR5fSBmcm9tICcuLi9mb3JtL3Byb3BlcnRpZXMvcHJvcGVydGllcy50YWJsZSc7XG5pbXBvcnQge1Byb3BlcnRpZXNNYXB9IGZyb20gJy4uLy4uL3NoYXJlZC90eXBlcyc7XG5pbXBvcnQge2lzTm90TmlsfSBmcm9tICcuLi8uLi9zaGFyZWQvZnVuY3Rpb25zJztcbmltcG9ydCB7VXNlclRva2VuVGFibGV9IGZyb20gJy4vdG9rZW4udGFibGUnO1xuaW1wb3J0IHtOYXZDb250cm9sbGVyfSBmcm9tICdAaW9uaWMvYW5ndWxhcic7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1hY2NvdW50LXBhZ2UnLFxuICB0ZW1wbGF0ZVVybDogJ2FjY291bnQucGFnZS5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vYWNjb3VudC5wYWdlLnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgQWNjb3VudFBhZ2UgZXh0ZW5kcyBBcHBGb3JtPEFjY291bnQ+IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIENhbkxlYXZlIHtcbiAgQFZpZXdDaGlsZCgndGFiR3JvdXAnLCB7c3RhdGljOiB0cnVlfSkgdGFiR3JvdXA6IE1hdFRhYkdyb3VwO1xuICBAVmlld0NoaWxkKCdwcm9wZXJ0aWVzVGFibGUnLCB7c3RhdGljOiB0cnVlfSkgcHJvcGVydGllc1RhYmxlOiBBcHBQcm9wZXJ0aWVzVGFibGU7XG4gIEBWaWV3Q2hpbGQoJ3Rva2Vuc1RhYmxlJywge3N0YXRpYzogdHJ1ZX0pIHRva2Vuc1RhYmxlOiBVc2VyVG9rZW5UYWJsZTtcblxuICBzZWxlY3RlZFRhYkluZGV4ID0gMDtcbiAgaXNMb2dpbjogYm9vbGVhbjtcbiAgY2hhbmdlc1N1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICBuZXR3b3JrU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gIGVtYWlsOiBhbnkgPSB7XG4gICAgY29uZmlybWVkOiBmYWxzZSxcbiAgICBub3RDb25maXJtZWQ6IGZhbHNlLFxuICAgIHNlbmRpbmc6IGZhbHNlLFxuICAgIGVycm9yOiB1bmRlZmluZWRcbiAgfTtcbiAgYWRkaXRpb25hbEZpZWxkczogRm9ybUZpZWxkRGVmaW5pdGlvbltdO1xuICBvcHRpb25EZWZpbml0aW9uczogRm9ybUZpZWxkRGVmaW5pdGlvbltdO1xuXG4gIGdldCBzZXR0aW5nc0Zvcm0oKTogVW50eXBlZEZvcm1Hcm91cCB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybS5nZXQoJ3NldHRpbmdzJykgYXMgVW50eXBlZEZvcm1Hcm91cDtcbiAgfVxuXG4gIC8vIHNldHRpbmdzQ29udGVudEZvcm06IFVudHlwZWRGb3JtR3JvdXA7XG4gIGxvY2FsZXM6IExvY2FsZUNvbmZpZ1tdO1xuICBsYXRMb25nRm9ybWF0cyA9IExBVF9MT05HX1BBVFRFUk5TO1xuICBzYXZpbmcgPSBmYWxzZTtcbiAgc3VibWl0dGVkID0gZmFsc2U7XG4gIGFjY291bnRSZWFkT25seSA9IGZhbHNlO1xuICByZWFkb25seSBtb2JpbGU6IGJvb2xlYW47XG5cbiAgZ2V0IHZhbGlkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBzdXBlci52YWxpZCAmJiAodGhpcy5wcm9wZXJ0aWVzVGFibGU/LnZhbGlkIHx8IHRydWUpO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgaW5qZWN0b3I6IEluamVjdG9yLFxuICAgIHB1YmxpYyBmb3JtQnVpbGRlcjogVW50eXBlZEZvcm1CdWlsZGVyLFxuICAgIHB1YmxpYyBhY2NvdW50U2VydmljZTogQWNjb3VudFNlcnZpY2UsXG4gICAgcHVibGljIG5ldHdvcms6IE5ldHdvcmtTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCBuYXZDb250cm9sbGVyOiBOYXZDb250cm9sbGVyLFxuICAgIHByb3RlY3RlZCB2YWxpZGF0b3JTZXJ2aWNlOiBBY2NvdW50VmFsaWRhdG9yU2VydmljZSxcbiAgICAvLyBwcm90ZWN0ZWQgc2V0dGluZ3NWYWxpZGF0b3JTZXJ2aWNlOiBVc2VyU2V0dGluZ3NWYWxpZGF0b3JTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCBjb25maWdTZXJ2aWNlOiBDb25maWdTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCBjZDogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQEluamVjdChBUFBfTE9DQUxFUykgbG9jYWxlc1xuICApIHtcbiAgICBzdXBlcihpbmplY3RvciwgdmFsaWRhdG9yU2VydmljZS5nZXRGb3JtR3JvdXAoYWNjb3VudFNlcnZpY2UuYWNjb3VudCkpO1xuXG4gICAgdGhpcy5sb2NhbGVzID0gbG9jYWxlcztcblxuICAgIC8vIEFkZCBzZXR0aW5ncyBmbyBmb3JtXG4gICAgLy8gdGhpcy5zZXR0aW5nc0Zvcm0gPSBzZXR0aW5nc1ZhbGlkYXRvclNlcnZpY2UuZ2V0Rm9ybUdyb3VwKGFjY291bnRTZXJ2aWNlLmFjY291bnQgJiYgYWNjb3VudFNlcnZpY2UuYWNjb3VudC5zZXR0aW5ncyk7XG4gICAgLy8gdGhpcy5zZXR0aW5nc0NvbnRlbnRGb3JtID0gKHRoaXMuc2V0dGluZ3NGb3JtLmNvbnRyb2xzWydjb250ZW50J10gYXMgVW50eXBlZEZvcm1Hcm91cCk7XG4gICAgLy8gdGhpcy5mb3JtLmFkZENvbnRyb2woJ3NldHRpbmdzJywgdGhpcy5zZXR0aW5nc0Zvcm0pO1xuXG4gICAgdGhpcy5tb2JpbGUgPSB0aGlzLnNldHRpbmdzLm1vYmlsZTtcblxuICAgIC8vIEJ5IGRlZmF1bHQsIGRpc2FibGUgdGhlIGZvcm1cbiAgICB0aGlzLmRpc2FibGUoKTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHN1cGVyLm5nT25Jbml0KCk7XG5cbiAgICAvLyBHZXQgdXNlciBvcHRpb25zXG4gICAgdGhpcy5vcHRpb25EZWZpbml0aW9ucyA9IHRoaXMuYWNjb3VudFNlcnZpY2Uub3B0aW9uRGVmcy5zbGljZSgpXG4gICAgICAuZmlsdGVyKGRlZmluaXRpb24gPT4gIWRlZmluaXRpb24ubWluUHJvZmlsZSB8fCB0aGlzLmFjY291bnRTZXJ2aWNlLmhhc01pblByb2ZpbGUoZGVmaW5pdGlvbi5taW5Qcm9maWxlKSk7XG5cbiAgICAvLyBPYnNlcnZlZCBzb21lIGV2ZW50c1xuICAgIHRoaXMucmVnaXN0ZXJTdWJzY3JpcHRpb24odGhpcy5hY2NvdW50U2VydmljZS5vbkxvZ2luLnBpcGUoZmlsdGVyKCgpID0+ICF0aGlzLnNhdmluZykpLnN1YnNjcmliZShhY2NvdW50ID0+IHRoaXMub25Mb2dpbihhY2NvdW50KSkpO1xuICAgIHRoaXMucmVnaXN0ZXJTdWJzY3JpcHRpb24odGhpcy5hY2NvdW50U2VydmljZS5vbkxvZ291dC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5vbkxvZ291dCgpKSk7XG4gICAgdGhpcy5yZWdpc3RlclN1YnNjcmlwdGlvbih0aGlzLm9uQ2FuY2VsLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLnNldFZhbHVlKHRoaXMuYWNjb3VudFNlcnZpY2UuYWNjb3VudCk7XG4gICAgICB0aGlzLm1hcmtBc1ByaXN0aW5lKCk7XG4gICAgfSkpO1xuXG4gICAgdGhpcy5yZWdpc3RlclN1YnNjcmlwdGlvbih0aGlzLmFjY291bnRTZXJ2aWNlLiRhZGRpdGlvbmFsRmllbGRzXG4gICAgICAuc3Vic2NyaWJlKChhZGRpdGlvbmFsRmllbGRzKSA9PiB7XG4gICAgICAgIHRoaXMuYWRkaXRpb25hbEZpZWxkcyA9IGFkZGl0aW9uYWxGaWVsZHMuc2xpY2UoKTsgLy8gQ29weVxuICAgICAgICBpZiAodGhpcy5hY2NvdW50U2VydmljZS5pc0xvZ2luKCkpIHtcbiAgICAgICAgICB0aGlzLm9uTG9naW4odGhpcy5hY2NvdW50U2VydmljZS5hY2NvdW50KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLm1hcmtBc0xvYWRlZCgpO1xuICAgICAgICB9XG4gICAgICB9KSk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyU3Vic2NyaXB0aW9uKFxuICAgICAgdGhpcy5jb25maWdTZXJ2aWNlLmNvbmZpZy5zdWJzY3JpYmUodmFsdWUgPT4ge1xuICAgICAgICB0aGlzLmFjY291bnRSZWFkT25seSA9IHZhbHVlLmdldFByb3BlcnR5QXNCb29sZWFuKENPUkVfQ09ORklHX09QVElPTlMuQUNDT1VOVF9SRUFET05MWSk7XG4gICAgICB9KVxuICAgICk7XG5cbiAgICAvLyBSZWFsaWduIHRhYiwgYWZ0ZXIgYSBkZWxheSBiZWNhdXNlIHRoZSB0YWIgY2FuIGJlIGRpc2FibGVkIHdoZW4gY29tcG9uZW50IGlzIGNyZWF0ZWRcbiAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMudGFiR3JvdXAucmVhbGlnbklua0JhcigpLCA1MDApO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgc3VwZXIubmdPbkRlc3Ryb3koKTtcbiAgICB0aGlzLnN0b3BMaXN0ZW5DaGFuZ2VzKCk7XG4gICAgdGhpcy5uZXR3b3JrU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICB9XG5cbiAgb25Mb2dpbihhY2NvdW50OiBBY2NvdW50KSB7XG4gICAgY29uc29sZS5kZWJ1ZygnW2FjY291bnRdIExvZ2dlZCBhY2NvdW50OiAnLCBhY2NvdW50KTtcbiAgICB0aGlzLmlzTG9naW4gPSB0cnVlO1xuXG4gICAgdGhpcy5zZXRWYWx1ZShhY2NvdW50KTtcblxuICAgIHRoaXMuZW1haWwuY29uZmlybWVkID0gYWNjb3VudCAmJiBhY2NvdW50LmVtYWlsICYmIChhY2NvdW50LnN0YXR1c0lkICE9PSBTdGF0dXNJZHMuVEVNUE9SQVJZKTtcbiAgICB0aGlzLmVtYWlsLm5vdENvbmZpcm1lZCA9IGFjY291bnQgJiYgYWNjb3VudC5lbWFpbCAmJiAoIWFjY291bnQuc3RhdHVzSWQgfHwgYWNjb3VudC5zdGF0dXNJZCA9PT0gU3RhdHVzSWRzLlRFTVBPUkFSWSk7XG5cbiAgICB0aGlzLm5ldHdvcmtTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5uZXR3b3JrU3Vic2NyaXB0aW9uID1jb21iaW5lTGF0ZXN0KFtcbiAgICAgIHRoaXMuY29uZmlnU2VydmljZS5jb25maWcsXG4gICAgICB0aGlzLm5ldHdvcmsub25OZXR3b3JrU3RhdHVzQ2hhbmdlc1xuICAgICAgICAucGlwZShcbiAgICAgICAgICBtYXAoY29ubmVjdGlvblR5cGUgPT4gY29ubmVjdGlvblR5cGUgIT09ICdub25lJyksXG4gICAgICAgIClcbiAgICBdKS5zdWJzY3JpYmUoKFtjb25maWcsIG9ubGluZV0pID0+IHtcbiAgICAgIGlmIChvbmxpbmUpIHtcbiAgICAgICAgY29uc3QgYWNjb3VudFJlYWRPbmx5ID0gY29uZmlnLmdldFByb3BlcnR5QXNCb29sZWFuKENPUkVfQ09ORklHX09QVElPTlMuQUNDT1VOVF9SRUFET05MWSk7XG4gICAgICAgIHRoaXMuZW5hYmxlKHsgYWNjb3VudFJlYWRPbmx5IH0pO1xuICAgICAgICB0aGlzLm1hcmtBc1ByaXN0aW5lKCk7XG4gICAgICAgIHRoaXMuc3RhcnRMaXN0ZW5DaGFuZ2VzKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmRpc2FibGUoKTtcbiAgICAgICAgdGhpcy5tYXJrQXNQcmlzdGluZSgpO1xuICAgICAgICB0aGlzLnN0b3BMaXN0ZW5DaGFuZ2VzKCk7XG4gICAgICB9XG4gICAgICB0aGlzLm1hcmtBc0xvYWRlZCgpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIG9uTG9nb3V0KCkge1xuICAgIHRoaXMuaXNMb2dpbiA9IGZhbHNlO1xuICAgIHRoaXMuZW1haWwuY29uZmlybWVkID0gZmFsc2U7XG4gICAgdGhpcy5lbWFpbC5ub3RDb25maXJtZWQgPSBmYWxzZTtcbiAgICB0aGlzLmVtYWlsLnNlbmRpbmcgPSBmYWxzZTtcbiAgICB0aGlzLmVtYWlsLmVycm9yID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuZm9ybS5yZXNldCgpO1xuICAgIHRoaXMuZGlzYWJsZSgpO1xuXG4gICAgdGhpcy5uZXR3b3JrU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuXG4gICAgdGhpcy5zdG9wTGlzdGVuQ2hhbmdlcygpO1xuXG4gICAgLy8gQmFjayB0byBob21lXG4gICAgdGhpcy5uYXZDb250cm9sbGVyLm5hdmlnYXRlUm9vdCgnLycpO1xuXG4gIH1cblxuICBhc3luYyBzZXRWYWx1ZShkYXRhOiBBY2NvdW50LCBvcHRzPzogeyBlbWl0RXZlbnQ/OiBib29sZWFuOyBvbmx5U2VsZj86IGJvb2xlYW4gfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHN1cGVyLnNldFZhbHVlKGRhdGEsIG9wdHMpO1xuXG4gICAgLy8gU2V0IG9wdGlvbnNcbiAgICBjb25zdCBwcm9wZXJ0aWVzID0gZGF0YT8uc2V0dGluZ3M/LmFzTG9jYWxTZXR0aW5ncygpPy5wcm9wZXJ0aWVzIHx8IHt9O1xuICAgIGNvbnN0IHByb3BlcnRpZXNFbnRpdGllczogUHJvcGVydHlFbnRpdHlbXSA9IFtdO1xuICAgIHRoaXMub3B0aW9uRGVmaW5pdGlvbnNcbiAgICAgIC5maWx0ZXIoZGVmaW5pdGlvbiA9PiAhZGVmaW5pdGlvbi5taW5Qcm9maWxlIHx8IHRoaXMuYWNjb3VudFNlcnZpY2UuaGFzTWluUHJvZmlsZShkZWZpbml0aW9uLm1pblByb2ZpbGUpKVxuICAgICAgLm1hcChkZWZpbml0aW9uID0+IGRlZmluaXRpb24ua2V5KS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICBpZiAoaXNOb3ROaWwocHJvcGVydGllc1trZXldKSkge1xuICAgICAgICBwcm9wZXJ0aWVzRW50aXRpZXMucHVzaChQcm9wZXJ0eUVudGl0eS5mcm9tT2JqZWN0KHtpZDoga2V5LCB2YWx1ZTogcHJvcGVydGllc1trZXldfSkpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMucHJvcGVydGllc1RhYmxlKSB7XG4gICAgICBhd2FpdCB0aGlzLnByb3BlcnRpZXNUYWJsZS5yZWFkeSgpO1xuICAgICAgdGhpcy5wcm9wZXJ0aWVzVGFibGUudmFsdWUgPSBwcm9wZXJ0aWVzRW50aXRpZXM7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudG9rZW5zVGFibGUpIHtcbiAgICAgIGF3YWl0IHRoaXMudG9rZW5zVGFibGUucmVhZHkoKTtcbiAgICAgIHRoaXMudG9rZW5zVGFibGUudmFsdWUgPSBkYXRhLnRva2VucztcbiAgICB9XG5cbiAgfVxuXG4gIGFzeW5jIHJlZnJlc2goZXZlbnQ/OiBFdmVudCkge1xuXG4gICAgdGhpcy5kaXNhYmxlKCk7XG4gICAgdGhpcy5tYXJrQXNMb2FkaW5nKCk7XG5cbiAgICByZXR1cm4gdGhpcy5hY2NvdW50U2VydmljZS5yZWxvYWQoKTtcbiAgfVxuXG4gIHN0YXJ0TGlzdGVuQ2hhbmdlcygpIHtcbiAgICBpZiAodGhpcy5jaGFuZ2VzU3Vic2NyaXB0aW9uKSByZXR1cm47IC8vIGFscmVhZHkgc3RhcnRlZFxuICAgIHRoaXMuY2hhbmdlc1N1YnNjcmlwdGlvbiA9IHRoaXMuYWNjb3VudFNlcnZpY2UubGlzdGVuQ2hhbmdlcygpO1xuICB9XG5cbiAgc3RvcExpc3RlbkNoYW5nZXMoKSB7XG4gICAgaWYgKCF0aGlzLmNoYW5nZXNTdWJzY3JpcHRpb24pIHJldHVybjtcbiAgICB0aGlzLmNoYW5nZXNTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLmNoYW5nZXNTdWJzY3JpcHRpb24gPSB1bmRlZmluZWQ7XG4gIH1cblxuICBhc3luYyBzZW5kQ29uZmlybWF0aW9uRW1haWwoZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICBjb25zdCBqc29uID0gdGhpcy5mb3JtLnZhbHVlO1xuICAgIGpzb24uZW1haWwgPSB0aGlzLmZvcm0uY29udHJvbHNbJ2VtYWlsJ10udmFsdWU7XG4gICAgaWYgKCFqc29uLmVtYWlsIHx8ICF0aGlzLmVtYWlsLm5vdENvbmZpcm1lZCkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB0aGlzLmVtYWlsLnNlbmRpbmcgPSB0cnVlO1xuICAgIGNvbnNvbGUuZGVidWcoJ1thY2NvdW50XSBTZW5kaW5nIGNvbmZpcm1hdGlvbiBlbWFpbC4uLicpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmFjY291bnRTZXJ2aWNlLnNlbmRDb25maXJtYXRpb25FbWFpbChcbiAgICAgICAganNvbi5lbWFpbCxcbiAgICAgICAganNvbi5zZXR0aW5ncyAmJiBqc29uLnNldHRpbmdzLmxvY2FsZSB8fCB0aGlzLnRyYW5zbGF0ZS5jdXJyZW50TGFuZ1xuICAgICAgKTtcbiAgICAgIGNvbnNvbGUuZGVidWcoJ1thY2NvdW50XSBDb25maXJtYXRpb24gZW1haWwgc2VudC4nKTtcbiAgICAgIHRoaXMuZW1haWwuc2VuZGluZyA9IGZhbHNlO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5lbWFpbC5zZW5kaW5nID0gZmFsc2U7XG4gICAgICB0aGlzLmVtYWlsLmVycm9yID0gZXJyICYmIGVyci5tZXNzYWdlIHx8IGVycjtcbiAgICB9XG4gIH1cblxuICBhc3luYyBzYXZlKGV2ZW50KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKHRoaXMuc2F2aW5nKSByZXR1cm4gZmFsc2U7XG5cbiAgICBpZiAoIXRoaXMuZm9ybS52YWxpZCkge1xuICAgICAgYXdhaXQgQXBwRm9ybVV0aWxzLndhaXRXaGlsZVBlbmRpbmcodGhpcy5mb3JtKTtcblxuICAgICAgaWYgKHRoaXMuZm9ybS5pbnZhbGlkKSB7XG4gICAgICAgIEFwcEZvcm1VdGlscy5sb2dGb3JtRXJyb3JzKHRoaXMuZm9ybSk7XG4gICAgICAgIHRoaXMuZm9ybS5tYXJrQWxsQXNUb3VjaGVkKCk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnN1Ym1pdHRlZCA9IHRydWU7XG4gICAgdGhpcy5zYXZpbmcgPSB0cnVlO1xuICAgIHRoaXMuZXJyb3IgPSB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBuZXdBY2NvdW50ID0gQWNjb3VudC5mcm9tT2JqZWN0KHtcbiAgICAgIC4uLih0aGlzLmFjY291bnRTZXJ2aWNlLmFjY291bnQuYXNPYmplY3QoKSksXG4gICAgICAuLi4odGhpcy5mb3JtLnZhbHVlKVxuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMucHJvcGVydGllc1RhYmxlKSB7XG4gICAgICAvLyBtZXJnZSBwcm9wZXJ0aWVzXG4gICAgICBhd2FpdCB0aGlzLnByb3BlcnRpZXNUYWJsZS5zYXZlKCk7XG4gICAgICBjb25zdCBwcm9wZXJ0eUVudGl0aWVzID0gdGhpcy5wcm9wZXJ0aWVzVGFibGUudmFsdWUgfHwgW107XG4gICAgICBjb25zdCBwcm9wZXJ0aWVzOiBQcm9wZXJ0aWVzTWFwID0gcHJvcGVydHlFbnRpdGllcy5yZWR1Y2UoKHJlcywgaXRlbSkgPT4ge1xuICAgICAgICByZXNbaXRlbS5pZF0gPSBpdGVtLnZhbHVlO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfSwge30pO1xuICAgICAgbmV3QWNjb3VudC5zZXR0aW5ncy5tZXJnZSg8TG9jYWxTZXR0aW5ncz57cHJvcGVydGllc30sIFsncHJvcGVydGllcyddKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy50b2tlbnNUYWJsZSkge1xuICAgICAgYXdhaXQgdGhpcy50b2tlbnNUYWJsZS5zYXZlKCk7XG4gICAgICBuZXdBY2NvdW50LnRva2VucyA9IHRoaXMudG9rZW5zVGFibGUudmFsdWU7XG4gICAgfVxuXG4gICAgY29uc29sZS5kZWJ1ZygnW2FjY291bnRdIFNhdmluZyBhY2NvdW50Li4uJywgbmV3QWNjb3VudCk7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuZGlzYWJsZSgpO1xuXG4gICAgICBhd2FpdCB0aGlzLmFjY291bnRTZXJ2aWNlLnNhdmUobmV3QWNjb3VudCk7XG5cbiAgICAgIC8vIFJlbG9hZFxuICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLm9uTG9naW4odGhpcy5hY2NvdW50U2VydmljZS5hY2NvdW50KSwgMTAwKTtcblxuICAgICAgdGhpcy5tYXJrQXNQcmlzdGluZSgpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICB0aGlzLmVycm9yID0gZXJyICYmIGVyci5tZXNzYWdlIHx8IGVycjtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5zYXZpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMuZW5hYmxlKCk7XG4gICAgfVxuICB9XG5cbiAgZW5hYmxlKG9wdHM/OiB7XG4gICAgYWNjb3VudFJlYWRPbmx5PzogYm9vbGVhbjtcbiAgICBvbmx5U2VsZj86IGJvb2xlYW47XG4gICAgZW1pdEV2ZW50PzogYm9vbGVhbjtcbiAgfSkge1xuICAgIHN1cGVyLmVuYWJsZSgpO1xuXG4gICAgLy8gU29tZSBmaWVsZHMgYXJlIGFsd2F5cyBkaXNhYmxlXG4gICAgdGhpcy5mb3JtLmNvbnRyb2xzLmVtYWlsLmRpc2FibGUoKTtcbiAgICB0aGlzLmZvcm0uY29udHJvbHMubWFpblByb2ZpbGUuZGlzYWJsZSgpO1xuICAgIHRoaXMuZm9ybS5jb250cm9scy5wdWJrZXkuZGlzYWJsZSgpO1xuXG4gICAgLy8gRGlzYWJsZSBhY2NvdW50IGZpZWxkcyBpZiByZWFkb25seSBieSBjb25maWd1cmF0aW9uXG4gICAgaWYgKG9wdHM/LmFjY291bnRSZWFkT25seSkge1xuICAgICAgdGhpcy5mb3JtLmNvbnRyb2xzLmxhc3ROYW1lLmRpc2FibGUoKTtcbiAgICAgIHRoaXMuZm9ybS5jb250cm9scy5maXJzdE5hbWUuZGlzYWJsZSgpO1xuICAgIH1cblxuICAgIC8vIEFsd2F5cyBkaXNhYmxlIHNvbWUgYWRkaXRpb25hbCBmaWVsZHNcbiAgICB0aGlzLmFkZGl0aW9uYWxGaWVsZHNcbiAgICAgIC5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICAgICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9ybS5jb250cm9sc1tmaWVsZC5rZXldO1xuICAgICAgICBpZiAoIWNvbnRyb2wpIHJldHVybjsgLy8gU2tpcFxuXG4gICAgICAgIGNvbnN0IGRpc2FibGVkID0gZmllbGQuZXh0cmE/LmFjY291bnQgJiYgZmllbGQuZXh0cmEuYWNjb3VudC5kaXNhYmxlZCB8fCBmYWxzZTtcbiAgICAgICAgaWYgKGRpc2FibGVkICYmIGNvbnRyb2wuZW5hYmxlZCkge1xuICAgICAgICAgIGNvbnRyb2wuZGlzYWJsZSgpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlcXVpcmVkID0gZmllbGQuZXh0cmE/LmFjY291bnQgJiYgZmllbGQuZXh0cmEuYWNjb3VudC5yZXF1aXJlZCB8fCBmYWxzZTtcbiAgICAgICAgaWYgKCFmaWVsZC5yZXF1aXJlZCAmJiByZXF1aXJlZCkge1xuICAgICAgICAgIGNvbnRyb2wuc2V0VmFsaWRhdG9ycyhjb250cm9sLnZhbGlkYXRvclxuICAgICAgICAgICAgPyBWYWxpZGF0b3JzLmNvbXBvc2UoW2NvbnRyb2wudmFsaWRhdG9yLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSlcbiAgICAgICAgICAgIDogVmFsaWRhdG9ycy5yZXF1aXJlZCk7XG4gICAgICAgIH1cblxuICAgICAgfSk7XG4gICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIGFzeW5jIGNhbmNlbCgpIHtcbiAgICBhd2FpdCBzdXBlci5jYW5jZWwoKTtcbiAgfVxuXG4gIGFzeW5jIGNsb3NlKGV2ZW50PzogRXZlbnQpIHtcbiAgICBpZiAodGhpcy5zYXZpbmcpIHJldHVybjtcblxuICAgIC8vIEJhY2sgdG8gaG9tZVxuICAgIHJldHVybiB0aGlzLm5hdkNvbnRyb2xsZXIubmF2aWdhdGVSb290KCcvJyk7IC8vIGJhY2sgdG8gaG9tZVxuICB9XG5cbiAgcHJvdGVjdGVkIG1hcmtGb3JDaGVjaygpIHtcbiAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbn1cbiIsIjxhcHAtdG9vbGJhciBbdGl0bGVdPVwiJ0FDQ09VTlQuVElUTEUnfHRyYW5zbGF0ZVwiIGNvbG9yPVwicHJpbWFyeVwiXG4gICAgICAgICAgICAgW2hhc1ZhbGlkYXRlXT1cImRpcnR5ICYmICFzYXZpbmdcIlxuICAgICAgICAgICAgIFtoYXNDbG9zZV09XCIhZGlydHkgJiYgIXNhdmluZ1wiXG4gICAgICAgICAgICAgKG9uVmFsaWRhdGUpPVwic2F2ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICBbY2FuR29CYWNrXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAob25DbG9zZSk9XCJjbG9zZSgkZXZlbnQpXCI+XG5cbiAgPGlvbi1idXR0b25zIHNsb3Q9XCJlbmRcIj5cbiAgICA8IS0tIGxvYWRlciAtLT5cbiAgICA8aW9uLXNwaW5uZXIgKm5nSWY9XCJsb2FkaW5nIHx8IHNhdmluZzsgZWxzZSBlbmRCdXR0b25zXCI+PC9pb24tc3Bpbm5lcj5cblxuICAgIDxuZy10ZW1wbGF0ZSAjZW5kQnV0dG9ucz5cbiAgICAgIDwhLS0gcmVmcmVzaCBidXR0b24gKGlmIG9ubGluZSkgLS0+XG4gICAgICA8aW9uLWJ1dHRvbiBbbWF0VG9vbHRpcF09XCInQ09NTU9OLkJUTl9SRUZSRVNIJ3x0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCJuZXR3b3JrLm9ubGluZVwiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVmcmVzaCgkZXZlbnQpXCI+XG4gICAgICAgIDxtYXQtaWNvbiBzbG90PVwiaWNvbi1vbmx5XCI+cmVmcmVzaDwvbWF0LWljb24+XG4gICAgICA8L2lvbi1idXR0b24+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgPC9pb24tYnV0dG9ucz5cbjwvYXBwLXRvb2xiYXI+XG5cbjxpb24tY29udGVudD5cblxuICA8IS0tIGVycm9yIC0tPlxuICA8aW9uLWl0ZW0gKm5nSWY9XCJlcnJvciAmJiBtb2JpbGVcIiBsaW5lcz1cIm5vbmVcIj5cbiAgICA8aW9uLWljb24gY29sb3I9XCJkYW5nZXJcIiBzbG90PVwic3RhcnRcIiBuYW1lPVwiYWxlcnQtY2lyY2xlXCI+PC9pb24taWNvbj5cbiAgICA8aW9uLWxhYmVsIGNvbG9yPVwiZGFuZ2VyXCIgY2xhc3M9XCJlcnJvclwiIFtpbm5lckhUTUxdPVwiZXJyb3J8dHJhbnNsYXRlXCI+PC9pb24tbGFiZWw+XG4gIDwvaW9uLWl0ZW0+XG5cbiAgPGZvcm0gW2Zvcm1Hcm91cF09XCJmb3JtXCIgbm92YWxpZGF0ZSBjbGFzcz1cImZvcm0tY29udGFpbmVyXCI+XG5cbiAgICA8bWF0LXRhYi1ncm91cCAjdGFiR3JvdXAgWyhzZWxlY3RlZEluZGV4KV09XCJzZWxlY3RlZFRhYkluZGV4XCIgZHluYW1pY0hlaWdodD5cblxuICAgICAgPCEtLSBUQUI6IHVzZXIgZGV0YWlscyAtLT5cbiAgICAgIDxtYXQtdGFiIGxhYmVsPVwie3snQUNDT1VOVC5VU0VSX0RFVEFJTFMuVElUTEUnfHRyYW5zbGF0ZX19XCIgY2xhc3M9XCJpb24tcGFkZGluZ1wiPlxuICAgICAgICA8bmctdGVtcGxhdGUgbWF0LXRhYi1sYWJlbD5cbiAgICAgICAgICA8bWF0LWljb24+XG4gICAgICAgICAgICA8aW9uLWljb24gbWF0UHJlZml4IHNsb3Q9XCJzdGFydFwiIG5hbWU9XCJwZXJzb24tY2lyY2xlXCI+PC9pb24taWNvbj5cbiAgICAgICAgICA8L21hdC1pY29uPlxuICAgICAgICAgIDxpb24tbGFiZWw+e3snQUNDT1VOVC5VU0VSX0RFVEFJTFMuVElUTEUnfHRyYW5zbGF0ZX19PC9pb24tbGFiZWw+XG4gICAgICAgICAgPGlvbi1pY29uIHNsb3Q9XCJlbmRcIiBuYW1lPVwiYWxlcnQtY2lyY2xlXCIgY29sb3I9XCJkYW5nZXJcIiAqbmdJZj1cInN1Ym1pdHRlZCAmJiBmb3JtLmludmFsaWRcIj48L2lvbi1pY29uPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJpb24tcGFkZGluZ1wiPlxuXG4gICAgICAgICAgPHAgW2lubmVySFRNTF09XCInQUNDT1VOVC5VU0VSX0RFVEFJTFMuREVTQ1JJUFRJT04nfHRyYW5zbGF0ZVwiPjwvcD5cblxuICAgICAgICAgIDwhLS1oMT5JZGVudGl0w6k8L2gxLS0+XG5cbiAgICAgICAgICA8IS0tIEVtYWlsIC0tPlxuICAgICAgICAgIDxtYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBbcGxhY2Vob2xkZXJdPVwiJ1VTRVIuRU1BSUwnfHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiZW1haWxcIiBhdXRvY29tcGxldGU9XCJzZWN0aW9uLXJlZCBlbWFpbFwiPlxuICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cImZvcm0uY29udHJvbHMuZW1haWwuaGFzRXJyb3IoJ3JlcXVpcmVkJykgJiYgZm9ybS5jb250cm9scy5lbWFpbC5kaXJ0eVwiIHRyYW5zbGF0ZT5FUlJPUi5GSUVMRF9SRVFVSVJFRDwvbWF0LWVycm9yPlxuICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cImZvcm0uY29udHJvbHMuZW1haWwuaGFzRXJyb3IoJ2VtYWlsJykgJiYgZm9ybS5jb250cm9scy5lbWFpbC5kaXJ0eVwiPlxuICAgICAgICAgICAgICA8c3Bhbj57eydFUlJPUi5GSUVMRF9OT1RfVkFMSURfRU1BSUwnIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cblxuICAgICAgICAgIDxpb24tZ3JpZCAqbmdJZj1cImVtYWlsLm5vdENvbmZpcm1lZFwiIGNsYXNzPVwiaW9uLW5vLXBhZGRpbmcgaW9uLXBhZGRpbmctYm90dG9tXCI+XG4gICAgICAgICAgICA8aW9uLXJvdz5cbiAgICAgICAgICAgICAgPGlvbi1jb2wgY29sb3I9XCJkYW5nZXJcIj5cbiAgICAgICAgICAgICAgICA8aW9uLWljb24gc2xvdD1cInN0YXJ0XCIgY29sb3I9XCJkYW5nZXJcIiBuYW1lPVwiYWxlcnQtY2lyY2xlXCIgY29sb3I9XCJkYW5nZXJcIj48L2lvbi1pY29uPlxuICAgICAgICAgICAgICAgIDxpb24tdGV4dCBbaW5uZXJIVE1MXT1cIidBQ0NPVU5ULkVNQUlMX05PVF9DT05GSVJNRURfTEFCRUwnfHRyYW5zbGF0ZVwiPjwvaW9uLXRleHQ+XG4gICAgICAgICAgICAgIDwvaW9uLWNvbD5cbiAgICAgICAgICAgIDwvaW9uLXJvdz5cblxuICAgICAgICAgICAgPGlvbi1yb3cgc3R5bGU9XCJoZWlnaHQ6IDUxcHg7XCI+XG4gICAgICAgICAgICAgIDxpb24tY29sIHN0eWxlPVwidGV4dC1hbGlnbjogcmlnaHQ7XCI+XG4gICAgICAgICAgICAgICAgPGlvbi10ZXh0PlxuICAgICAgICAgICAgICAgICAgPHNtYWxsIFtpbm5lckhUTUxdPVwiJ0FDQ09VTlQuRU1BSUxfTk9UX1JFQ0VJVkVEX1FVRVNUSU9OJ3x0cmFuc2xhdGVcIj48L3NtYWxsPlxuICAgICAgICAgICAgICAgIDwvaW9uLXRleHQ+XG4gICAgICAgICAgICAgIDwvaW9uLWNvbD5cbiAgICAgICAgICAgICAgPGlvbi1jb2wgc2l6ZT1cImF1dG9cIj5cbiAgICAgICAgICAgICAgICA8aW9uLWJ1dHRvbiBmaWxsPVwic29saWRcIiBjb2xvcj1cInNlY29uZGFyeVwiICpuZ0lmPVwiIWVtYWlsLnNlbmRpbmdcIiAoY2xpY2spPVwic2VuZENvbmZpcm1hdGlvbkVtYWlsKCRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgIHt7J0FDQ09VTlQuQlROX1JFU0VORCd8dHJhbnNsYXRlfX1cbiAgICAgICAgICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgICAgICAgICAgPGlvbi1zcGlubmVyIGNsYXNzPVwiaW9uLW5vLXBhZGRpbmdcIiAqbmdJZj1cImVtYWlsLnNlbmRpbmdcIj48L2lvbi1zcGlubmVyPlxuICAgICAgICAgICAgICA8L2lvbi1jb2w+XG4gICAgICAgICAgICA8L2lvbi1yb3c+XG5cbiAgICAgICAgICAgIDxpb24tcm93ICpuZ0lmPVwiZW1haWwuZXJyb3IgJiYgIWVtYWlsLnNlbmRpbmdcIj5cbiAgICAgICAgICAgICAgPGlvbi1jb2w+XG4gICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJlbWFpbC5lcnJvciAmJiAhZW1haWwuc2VuZGluZ1wiIFtpbm5lckhUTUxdPVwiZW1haWwuZXJyb3J8dHJhbnNsYXRlXCI+PC9zcGFuPlxuICAgICAgICAgICAgICA8L2lvbi1jb2w+XG4gICAgICAgICAgICA8L2lvbi1yb3c+XG4gICAgICAgICAgPC9pb24tZ3JpZD5cblxuICAgICAgICAgIDwhLS0gTGFzdCBuYW1lIC0tPlxuICAgICAgICAgIDxtYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBbYXBwQXV0b2ZvY3VzXT1cInRydWVcIiBbYXV0b2ZvY3VzRGVsYXldPVwiNTAwXCIgW3BsYWNlaG9sZGVyXT1cIidVU0VSLkxBU1RfTkFNRSd8dHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJsYXN0TmFtZVwiXG4gICAgICAgICAgICAgICAgICAgYXV0b2NvbXBsZXRlPVwic2VjdGlvbi1ibHVlIGZhbWlseS1uYW1lXCJcbiAgICAgICAgICAgICAgICAgICByZXF1aXJlZD5cbiAgICAgICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJmb3JtLmNvbnRyb2xzLmxhc3ROYW1lLmhhc0Vycm9yKCdyZXF1aXJlZCcpICYmIGZvcm0uY29udHJvbHMubGFzdE5hbWUuZGlydHlcIlxuICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGU+RVJST1IuRklFTERfUkVRVUlSRURcbiAgICAgICAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cImZvcm0uY29udHJvbHMubGFzdE5hbWUuaGFzRXJyb3IoJ21pbmxlbmd0aCcpICYmIGZvcm0uY29udHJvbHMubGFzdE5hbWUuZGlydHlcIj5cbiAgICAgICAgICAgICAgPHNwYW4+e3snRVJST1IuRklFTERfTUlOX0xFTkdUSCcgfCB0cmFuc2xhdGU6IHttaW5MZW5ndGg6IDJ9IH19PC9zcGFuPlxuICAgICAgICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cblxuICAgICAgICAgIDwhLS0gRmlyc3QgbmFtZSAtLT5cbiAgICAgICAgICA8bWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgW3BsYWNlaG9sZGVyXT1cIidVU0VSLkZJUlNUX05BTUUnfHRyYW5zbGF0ZVwiIGZvcm1Db250cm9sTmFtZT1cImZpcnN0TmFtZVwiIGF1dG9jb21wbGV0ZT1cInNlY3Rpb24tYmx1ZSBnaXZlbi1uYW1lXCJcbiAgICAgICAgICAgICAgICAgICByZXF1aXJlZD5cbiAgICAgICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJmb3JtLmNvbnRyb2xzLmZpcnN0TmFtZS5oYXNFcnJvcigncmVxdWlyZWQnKSAmJiBmb3JtLmNvbnRyb2xzLmZpcnN0TmFtZS5kaXJ0eVwiXG4gICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZT5FUlJPUi5GSUVMRF9SRVFVSVJFRFxuICAgICAgICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwiZm9ybS5jb250cm9scy5maXJzdE5hbWUuaGFzRXJyb3IoJ21pbmxlbmd0aCcpICYmIGZvcm0uY29udHJvbHMuZmlyc3ROYW1lLmRpcnR5XCI+XG4gICAgICAgICAgICAgIDxzcGFuPnt7J0VSUk9SLkZJRUxEX01JTl9MRU5HVEgnIHwgdHJhbnNsYXRlOiB7bWluTGVuZ3RoOiAyfSB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG5cblxuICAgICAgICAgIDwhLS0gQWRkaXRpb25hbCBmaWVsZHMgLS0+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZGVmaW5pdGlvbiBvZiBhZGRpdGlvbmFsRmllbGRzXCI+XG4gICAgICAgICAgICA8YXBwLWZvcm0tZmllbGQgW2RlZmluaXRpb25dPVwiZGVmaW5pdGlvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJkZWZpbml0aW9uLmtleVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlcXVpcmVkXT1cImRlZmluaXRpb24uZXh0cmEgJiYgZGVmaW5pdGlvbi5leHRyYS5hY2NvdW50ICYmIGRlZmluaXRpb24uZXh0cmEuYWNjb3VudC5yZXF1aXJlZCB8fCBmYWxzZVwiPlxuICAgICAgICAgICAgPC9hcHAtZm9ybS1maWVsZD5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgIDxoMyB0cmFuc2xhdGU+QUNDT1VOVC5VU0VSX0RFVEFJTFMuVEVDSE5JQ0FMX0RJVklERVI8L2gzPlxuXG4gICAgICAgICAgPCEtLSBwcm9maWxlIC0tPlxuICAgICAgICAgIDxtYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBoaWRkZW4gcmVhZG9ubHk9XCJ0cnVlXCIgW3BsYWNlaG9sZGVyXT1cIidBQ0NPVU5ULlVTRVJfREVUQUlMUy5QUk9GSUxFJ3x0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cIm1haW5Qcm9maWxlXCIgcmVxdWlyZWQ+XG4gICAgICAgICAgICA8c3Bhbj57eydVU0VSLlBST0ZJTEVfRU5VTS4nICsgZm9ybS5jb250cm9scy5tYWluUHJvZmlsZS52YWx1ZSB8IHRyYW5zbGF0ZX19PC9zcGFuPlxuICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cImZvcm0uY29udHJvbHMuZmlyc3ROYW1lLmhhc0Vycm9yKCdtYWluUHJvZmlsZScpICYmIGZvcm0uY29udHJvbHMubWFpblByb2ZpbGUuZGlydHlcIlxuICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGU+RVJST1IuRklFTERfUkVRVUlSRURcbiAgICAgICAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG5cbiAgICAgICAgICA8IS0tIHB1YmtleSAtLT5cbiAgICAgICAgICA8bWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgcmVhZG9ubHk9XCJ0cnVlXCIgW3BsYWNlaG9sZGVyXT1cIidBQ0NPVU5ULlVTRVJfREVUQUlMUy5QVUJLRVknfHRyYW5zbGF0ZVwiIGZvcm1Db250cm9sTmFtZT1cInB1YmtleVwiXG4gICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ+XG4gICAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwiZm9ybS5jb250cm9scy5maXJzdE5hbWUuaGFzRXJyb3IoJ3B1YmtleScpICYmIGZvcm0uY29udHJvbHMuZmlyc3ROYW1lLmRpcnR5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlPkVSUk9SLkZJRUxEX1JFUVVJUkVEXG4gICAgICAgICAgICA8L21hdC1lcnJvcj5cbiAgICAgICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJmb3JtLmNvbnRyb2xzLmZpcnN0TmFtZS5oYXNFcnJvcigncHVia2V5JykgJiYgZm9ybS5jb250cm9scy5maXJzdE5hbWUuZGlydHlcIj5cbiAgICAgICAgICAgICAgPHNwYW4gdHJhbnNsYXRlPkVSUk9SLkZJRUxEX05PVF9WQUxJRF9QVUJLRVk8L3NwYW4+XG4gICAgICAgICAgICA8L21hdC1lcnJvcj5cbiAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuXG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9tYXQtdGFiPlxuXG4gICAgICA8IS0tIFRBQjogc2V0dGluZ3MgLS0+XG4gICAgICA8bWF0LXRhYiBsYWJlbD1cInt7J0FDQ09VTlQuU0VUVElOR1MuVElUTEUnfHRyYW5zbGF0ZX19XCIgZm9ybUdyb3VwTmFtZT1cInNldHRpbmdzXCI+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSBtYXQtdGFiLWxhYmVsPlxuICAgICAgICAgIDxtYXQtaWNvbj5cbiAgICAgICAgICAgIDxpb24taWNvbiBtYXRQcmVmaXggc2xvdD1cInN0YXJ0XCIgbmFtZT1cInNldHRpbmdzXCI+PC9pb24taWNvbj5cbiAgICAgICAgICA8L21hdC1pY29uPlxuICAgICAgICAgIDxpb24tbGFiZWwgdHJhbnNsYXRlPkFDQ09VTlQuU0VUVElOR1MuVElUTEU8L2lvbi1sYWJlbD5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiaW9uLXBhZGRpbmdcIj5cblxuICAgICAgICAgIDxwIFtpbm5lckhUTUxdPVwiJ0FDQ09VTlQuU0VUVElOR1MuREVTQ1JJUFRJT04nfHRyYW5zbGF0ZVwiPjwvcD5cblxuICAgICAgICAgIDxtYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgIDxtYXQtc2VsZWN0IFtwbGFjZWhvbGRlcl09XCInQUNDT1VOVC5TRVRUSU5HUy5MT0NBTEUnfHRyYW5zbGF0ZVwiIGZvcm1Db250cm9sTmFtZT1cImxvY2FsZVwiIHJlcXVpcmVkPlxuICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBsb2NhbGVzXCIgW3ZhbHVlXT1cIml0ZW0ua2V5XCI+XG4gICAgICAgICAgICAgICAge3tpdGVtLnZhbHVlfX1cbiAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cInNldHRpbmdzRm9ybT8uY29udHJvbHMubG9jYWxlLmhhc0Vycm9yKCdyZXF1aXJlZCcpICYmIHNldHRpbmdzRm9ybT8uY29udHJvbHMubG9jYWxlLmRpcnR5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlPkVSUk9SLkZJRUxEX1JFUVVJUkVEXG4gICAgICAgICAgICA8L21hdC1lcnJvcj5cbiAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuXG4gICAgICAgICAgPCEtLSBsYXQvbG9uZyBmb3JtYXQtLT5cbiAgICAgICAgICA8bWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICA8bWF0LXNlbGVjdCBbcGxhY2Vob2xkZXJdPVwiJ0FDQ09VTlQuU0VUVElOR1MuTEFUX0xPTkdfRk9STUFUJ3x0cmFuc2xhdGVcIiBmb3JtQ29udHJvbE5hbWU9XCJsYXRMb25nRm9ybWF0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkPlxuICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBsYXRMb25nRm9ybWF0c1wiIFt2YWx1ZV09XCJpdGVtXCI+XG4gICAgICAgICAgICAgICAge3snQ09NTU9OLkxBVF9MT05HLicgKyBpdGVtICsgJ19QTEFDRUhPTERFUid8dHJhbnNsYXRlfX1cbiAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cInNldHRpbmdzRm9ybT8uY29udHJvbHMubGF0TG9uZ0Zvcm1hdC5oYXNFcnJvcigncmVxdWlyZWQnKSAmJiBzZXR0aW5nc0Zvcm0/LmNvbnRyb2xzLmxhdExvbmdGb3JtYXQuZGlydHlcIlxuICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGU+RVJST1IuRklFTERfUkVRVUlSRURcbiAgICAgICAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBPcHRpb25zIHRhYmxlIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwib3B0aW9ucy10YWJsZVwiIFtjbGFzcy5jZGstdmlzdWFsbHktaGlkZGVuXT1cIm9wdGlvbkRlZmluaXRpb25zIHwgaXNFbXB0eUFycmF5XCI+XG4gICAgICAgICAgPGFwcC1wcm9wZXJ0aWVzLXRhYmxlXG4gICAgICAgICAgICAjcHJvcGVydGllc1RhYmxlXG4gICAgICAgICAgICBpMThuQ29sdW1uUHJlZml4PVwiQUNDT1VOVC5TRVRUSU5HUy5PUFRJT05TLlwiXG4gICAgICAgICAgICBbZGVmaW5pdGlvbnNdPVwib3B0aW9uRGVmaW5pdGlvbnNcIlxuICAgICAgICAgICAgW2NhbkVkaXRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAob25EaXJ0eSk9XCIkZXZlbnQgPyBtYXJrQXNEaXJ0eSgpIDogdW5kZWZpbmVkXCJcbiAgICAgICAgICA+PC9hcHAtcHJvcGVydGllcy10YWJsZT5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgIDwvbWF0LXRhYj5cblxuICAgICAgPCEtLSBUQUI6IHRva2VucyAtLT5cbiAgICAgIDxtYXQtdGFiIGxhYmVsPVwie3snQUNDT1VOVC5UT0tFTlMuVElUTEUnfHRyYW5zbGF0ZX19XCIgZm9ybUdyb3VwTmFtZT1cInRva2Vuc1wiPlxuICAgICAgICA8bmctdGVtcGxhdGUgbWF0LXRhYi1sYWJlbD5cbiAgICAgICAgICA8bWF0LWljb24+XG4gICAgICAgICAgICA8aW9uLWljb24gbWF0UHJlZml4IHNsb3Q9XCJzdGFydFwiIG5hbWU9XCJ0aWNrZXRcIj48L2lvbi1pY29uPlxuICAgICAgICAgIDwvbWF0LWljb24+XG4gICAgICAgICAgPGlvbi1sYWJlbCB0cmFuc2xhdGU+QUNDT1VOVC5UT0tFTlMuVElUTEU8L2lvbi1sYWJlbD5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiaW9uLXBhZGRpbmdcIj5cbiAgICAgICAgICA8cCBbaW5uZXJIVE1MXT1cIidBQ0NPVU5ULlRPS0VOUy5ERVNDUklQVElPTid8dHJhbnNsYXRlXCI+PC9wPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIFRva2VucyB0YWJsZSAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cInRva2Vucy10YWJsZVwiPlxuICAgICAgICAgIDxhcHAtdXNlci10b2tlbi10YWJsZVxuICAgICAgICAgICAgI3Rva2Vuc1RhYmxlXG4gICAgICAgICAgICBbY2FuRWRpdF09XCJ0cnVlXCJcbiAgICAgICAgICAgIChvbkRpcnR5KT1cIiRldmVudCA/IG1hcmtBc0RpcnR5KCkgOiB1bmRlZmluZWRcIlxuICAgICAgICAgID48L2FwcC11c2VyLXRva2VuLXRhYmxlPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgPC9tYXQtdGFiPlxuICAgIDwvbWF0LXRhYi1ncm91cD5cblxuXG4gIDwvZm9ybT5cbjwvaW9uLWNvbnRlbnQ+XG5cbjxpb24tZm9vdGVyIGhpZGRlbi14cyBoaWRkZW4tc20gaGlkZGVuLW1vYmlsZT5cbiAgPGFwcC1mb3JtLWJ1dHRvbnMtYmFyIChvbkNhbmNlbCk9XCJjYW5jZWwoKVwiIChvblNhdmUpPVwic2F2ZSgkZXZlbnQpXCIgW2Rpc2FibGVkXT1cIiFmb3JtLmRpcnR5IHx8ICF2YWxpZCB8fCBzYXZpbmdcIj5cbiAgICA8IS0tIGVycm9yIC0tPlxuICAgIDxpb24taXRlbSAqbmdJZj1cImVycm9yICYmICFtb2JpbGVcIiBsaW5lcz1cIm5vbmVcIj5cbiAgICAgIDxpb24taWNvbiBjb2xvcj1cImRhbmdlclwiIHNsb3Q9XCJzdGFydFwiIG5hbWU9XCJhbGVydC1jaXJjbGVcIj48L2lvbi1pY29uPlxuICAgICAgPGlvbi1sYWJlbCBjb2xvcj1cImRhbmdlclwiIGNsYXNzPVwiZXJyb3JcIiBbaW5uZXJIVE1MXT1cImVycm9yfHRyYW5zbGF0ZVwiPjwvaW9uLWxhYmVsPlxuICAgIDwvaW9uLWl0ZW0+XG4gIDwvYXBwLWZvcm0tYnV0dG9ucy1iYXI+XG48L2lvbi1mb290ZXI+XG4iXX0=