@sumaris-net/ngx-components 1.23.8 → 2.0.0-rc1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (714) hide show
  1. package/doc/build.md +2 -2
  2. package/esm2020/public_api.mjs +274 -0
  3. package/esm2020/public_test_api.mjs +46 -0
  4. package/esm2020/src/app/admin/admin-routing.module.mjs +41 -0
  5. package/esm2020/src/app/admin/admin.module.mjs +49 -0
  6. package/esm2020/src/app/admin/services/filter/person.filter.mjs +59 -0
  7. package/esm2020/src/app/admin/services/person.service.mjs +161 -0
  8. package/esm2020/src/app/admin/services/validator/person.validator.mjs +34 -0
  9. package/esm2020/src/app/admin/users/list/users.mjs +227 -0
  10. package/esm2020/src/app/core/about/modal-about.mjs +71 -0
  11. package/esm2020/src/app/core/account/account.mjs +230 -0
  12. package/esm2020/src/app/core/auth/form/form-auth.mjs +131 -0
  13. package/esm2020/src/app/core/auth/modal/modal-auth.mjs +72 -0
  14. package/esm2020/src/app/core/core.module.mjs +223 -0
  15. package/esm2020/src/app/core/core.testing.module.mjs +72 -0
  16. package/esm2020/src/app/core/form/editor.class.mjs +608 -0
  17. package/esm2020/src/app/core/form/entity-editor-modal.class.mjs +406 -0
  18. package/esm2020/src/app/core/form/entity-editor.class.mjs +669 -0
  19. package/esm2020/src/app/core/form/entity-metadata.component.mjs +25 -0
  20. package/esm2020/src/app/core/form/form-buttons-bar.component.mjs +71 -0
  21. package/esm2020/src/app/core/form/form.class.mjs +334 -0
  22. package/esm2020/src/app/core/form/form.utils.mjs +264 -0
  23. package/esm2020/src/app/core/form/list.form.mjs +221 -0
  24. package/esm2020/src/app/core/form/properties.form.mjs +126 -0
  25. package/esm2020/src/app/core/graphql/graphql.module.mjs +22 -0
  26. package/esm2020/src/app/core/graphql/graphql.service.mjs +730 -0
  27. package/esm2020/src/app/core/graphql/graphql.utils.mjs +117 -0
  28. package/esm2020/src/app/core/home/home.mjs +257 -0
  29. package/esm2020/src/app/core/icon/icon.component.mjs +41 -0
  30. package/esm2020/src/app/core/icon/icon.module.mjs +29 -0
  31. package/esm2020/src/app/core/install/install-upgrade-card.component.mjs +337 -0
  32. package/esm2020/src/app/core/install/install-upgrade-card.module.mjs +33 -0
  33. package/esm2020/src/app/core/menu/menu.component.mjs +317 -0
  34. package/{esm2015/src/app/core/menu/menu.model.js → esm2020/src/app/core/menu/menu.model.mjs} +0 -0
  35. package/esm2020/src/app/core/menu/menu.module.mjs +45 -0
  36. package/{esm2015/src/app/core/menu/menu.service.js → esm2020/src/app/core/menu/menu.service.mjs} +9 -7
  37. package/esm2020/src/app/core/offline/update-offline-mode-card.component.mjs +27 -0
  38. package/esm2020/src/app/core/peer/select-peer.modal.mjs +130 -0
  39. package/esm2020/src/app/core/peer/select-peer.module.mjs +35 -0
  40. package/esm2020/src/app/core/register/confirm/confirm.mjs +81 -0
  41. package/esm2020/src/app/core/register/form/form-register.mjs +181 -0
  42. package/esm2020/src/app/core/register/modal/modal-register.mjs +52 -0
  43. package/esm2020/src/app/core/register/register.module.mjs +42 -0
  44. package/esm2020/src/app/core/services/account.service.mjs +1112 -0
  45. package/esm2020/src/app/core/services/auth-guard.service.mjs +71 -0
  46. package/esm2020/src/app/core/services/base-entity-service.class.mjs +433 -0
  47. package/esm2020/src/app/core/services/base-graphql-service.class.mjs +219 -0
  48. package/{esm2015/src/app/core/services/base58.js → esm2020/src/app/core/services/base58.mjs} +0 -0
  49. package/{esm2015/src/app/core/services/config/core.config.js → esm2020/src/app/core/services/config/core.config.mjs} +0 -0
  50. package/esm2020/src/app/core/services/config.service.mjs +354 -0
  51. package/{esm2015/src/app/core/services/crypto.service.js → esm2020/src/app/core/services/crypto.service.mjs} +7 -5
  52. package/{esm2015/src/app/core/services/errors.js → esm2020/src/app/core/services/errors.mjs} +0 -0
  53. package/esm2020/src/app/core/services/local-settings.service.mjs +442 -0
  54. package/esm2020/src/app/core/services/model/account.model.mjs +50 -0
  55. package/esm2020/src/app/core/services/model/config.model.mjs +89 -0
  56. package/esm2020/src/app/core/services/model/department.model.mjs +30 -0
  57. package/esm2020/src/app/core/services/model/entity.decorators.mjs +107 -0
  58. package/esm2020/src/app/core/services/model/entity.model.mjs +242 -0
  59. package/{esm2015/src/app/core/services/model/filter.model.js → esm2020/src/app/core/services/model/filter.model.mjs} +0 -0
  60. package/{esm2015/src/app/core/services/model/history.model.js → esm2020/src/app/core/services/model/history.model.mjs} +0 -0
  61. package/{esm2015/src/app/core/services/model/model.enum.js → esm2020/src/app/core/services/model/model.enum.mjs} +0 -0
  62. package/esm2020/src/app/core/services/model/peer.model.mjs +68 -0
  63. package/esm2020/src/app/core/services/model/person.model.mjs +83 -0
  64. package/esm2020/src/app/core/services/model/referential.model.mjs +145 -0
  65. package/esm2020/src/app/core/services/model/settings.model.mjs +75 -0
  66. package/esm2020/src/app/core/services/network.service.mjs +602 -0
  67. package/esm2020/src/app/core/services/network.utils.mjs +16 -0
  68. package/esm2020/src/app/core/services/pipes/account.pipes.mjs +38 -0
  69. package/esm2020/src/app/core/services/pipes/department-to-string.pipe.mjs +23 -0
  70. package/esm2020/src/app/core/services/pipes/person-to-string.pipe.mjs +23 -0
  71. package/esm2020/src/app/core/services/pipes/usage-mode.pipes.mjs +37 -0
  72. package/esm2020/src/app/core/services/platform.service.mjs +476 -0
  73. package/esm2020/src/app/core/services/storage/entities-storage.service.mjs +422 -0
  74. package/esm2020/src/app/core/services/storage/entity-store.class.mjs +449 -0
  75. package/esm2020/src/app/core/services/testing/referential-filter.model.mjs +23 -0
  76. package/esm2020/src/app/core/services/testing/referential.validator.mjs +45 -0
  77. package/esm2020/src/app/core/services/validator/account.validator.mjs +52 -0
  78. package/esm2020/src/app/core/services/validator/base.validator.class.mjs +47 -0
  79. package/esm2020/src/app/core/services/validator/local-settings.validator.mjs +66 -0
  80. package/esm2020/src/app/core/services/validator/user-settings.validator.mjs +29 -0
  81. package/esm2020/src/app/core/settings/settings.page.mjs +290 -0
  82. package/esm2020/src/app/core/table/actions-column.component.mjs +96 -0
  83. package/esm2020/src/app/core/table/entities-table-datasource.class.mjs +385 -0
  84. package/esm2020/src/app/core/table/memory-table.class.mjs +53 -0
  85. package/esm2020/src/app/core/table/table-select-columns.component.mjs +43 -0
  86. package/esm2020/src/app/core/table/table.class.mjs +1654 -0
  87. package/{esm2015/src/app/core/table/table.utils.js → esm2020/src/app/core/table/table.utils.mjs} +0 -0
  88. package/esm2020/src/app/core/table/testing/table.testing.mjs +264 -0
  89. package/esm2020/src/app/core/table/testing/table.testing.module.mjs +38 -0
  90. package/esm2020/src/app/core/text-popover/testing/text-popover.testing.mjs +37 -0
  91. package/esm2020/src/app/core/text-popover/testing/text-popover.testing.module.mjs +45 -0
  92. package/esm2020/src/app/core/text-popover/text-form.component.mjs +84 -0
  93. package/esm2020/src/app/core/text-popover/text-popover.component.mjs +92 -0
  94. package/esm2020/src/app/shared/alerts.mjs +238 -0
  95. package/esm2020/src/app/shared/audio/audio.mjs +201 -0
  96. package/esm2020/src/app/shared/audio/audio.testing.mjs +31 -0
  97. package/esm2020/src/app/shared/audio/audio.testing.module.mjs +45 -0
  98. package/esm2020/src/app/shared/capacitor/keyboard.mjs +40 -0
  99. package/esm2020/src/app/shared/capacitor/plugins.mjs +9 -0
  100. package/{esm2015/src/app/shared/constants.js → esm2020/src/app/shared/constants.mjs} +2 -1
  101. package/esm2020/src/app/shared/dates.mjs +134 -0
  102. package/esm2020/src/app/shared/directives/autofocus.directive.mjs +92 -0
  103. package/esm2020/src/app/shared/directives/autotitle.directive.mjs +30 -0
  104. package/esm2020/src/app/shared/directives/directives.module.mjs +43 -0
  105. package/esm2020/src/app/shared/directives/drag-and-drop.directive.mjs +53 -0
  106. package/esm2020/src/app/shared/directives/ng-var.directive.mjs +31 -0
  107. package/esm2020/src/app/shared/directives/resizable/resizable.component.mjs +59 -0
  108. package/esm2020/src/app/shared/directives/resizable/resizable.directive.mjs +40 -0
  109. package/esm2020/src/app/shared/directives/resizable/resizable.module.mjs +17 -0
  110. package/esm2020/src/app/shared/events.mjs +64 -0
  111. package/esm2020/src/app/shared/file/csv.utils.mjs +74 -0
  112. package/esm2020/src/app/shared/file/file.service.mjs +117 -0
  113. package/esm2020/src/app/shared/file/file.utils.mjs +113 -0
  114. package/esm2020/src/app/shared/file/images.utils.mjs +161 -0
  115. package/{esm2015/src/app/shared/file/uri.utils.js → esm2020/src/app/shared/file/uri.utils.mjs} +0 -0
  116. package/{esm2015/src/app/shared/focusable.js → esm2020/src/app/shared/focusable.mjs} +0 -0
  117. package/esm2020/src/app/shared/form/field.component.mjs +241 -0
  118. package/{esm2015/src/app/shared/form/field.model.js → esm2020/src/app/shared/form/field.model.mjs} +1 -1
  119. package/esm2020/src/app/shared/form/loading-spinner.mjs +36 -0
  120. package/esm2020/src/app/shared/forms.mjs +355 -0
  121. package/esm2020/src/app/shared/functions.mjs +417 -0
  122. package/{esm2015/src/app/shared/gesture/gesture-config.js → esm2020/src/app/shared/gesture/gesture-config.mjs} +7 -5
  123. package/esm2020/src/app/shared/gesture/hammer.utils.mjs +2 -0
  124. package/{esm2015/src/app/shared/graph/colors.utils.js → esm2020/src/app/shared/graph/colors.utils.mjs} +0 -0
  125. package/esm2020/src/app/shared/graph/graph-colors.mjs +254 -0
  126. package/esm2020/src/app/shared/guard/component-dirty.guard.mjs +57 -0
  127. package/esm2020/src/app/shared/help/help.modal.mjs +53 -0
  128. package/esm2020/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.mjs +23 -0
  129. package/esm2020/src/app/shared/hotkeys/hotkeys.service.mjs +84 -0
  130. package/esm2020/src/app/shared/hotkeys/shared-hotkeys.module.mjs +42 -0
  131. package/esm2020/src/app/shared/http/http.utils.mjs +52 -0
  132. package/esm2020/src/app/shared/image/gallery/image-gallery.component.mjs +279 -0
  133. package/esm2020/src/app/shared/image/gallery/image-gallery.module.mjs +46 -0
  134. package/esm2020/src/app/shared/image/gallery/testing/gallegry.model.testing.mjs +27 -0
  135. package/esm2020/src/app/shared/image/gallery/testing/gallery.service.testing.mjs +89 -0
  136. package/esm2020/src/app/shared/image/gallery/testing/gallery.testing.mjs +33 -0
  137. package/esm2020/src/app/shared/image/gallery/testing/gallery.testing.module.mjs +56 -0
  138. package/esm2020/src/app/shared/image/image.model.mjs +2 -0
  139. package/esm2020/src/app/shared/image/image.module.mjs +29 -0
  140. package/esm2020/src/app/shared/image/image.service.mjs +99 -0
  141. package/{esm2015/src/app/shared/inputs.js → esm2020/src/app/shared/inputs.mjs} +4 -4
  142. package/{esm2015/src/app/shared/interceptors/progess.interceptor.js → esm2020/src/app/shared/interceptors/progess.interceptor.mjs} +0 -0
  143. package/esm2020/src/app/shared/material/autocomplete/material.autocomplete.config.mjs +47 -0
  144. package/esm2020/src/app/shared/material/autocomplete/material.autocomplete.mjs +836 -0
  145. package/esm2020/src/app/shared/material/autocomplete/material.autocomplete.module.mjs +78 -0
  146. package/esm2020/src/app/shared/material/autocomplete/material.autocomplete.utils.mjs +19 -0
  147. package/esm2020/src/app/shared/material/autocomplete/testing/autocomplete.test.mjs +205 -0
  148. package/esm2020/src/app/shared/material/badge/badge-icon.directive.mjs +143 -0
  149. package/esm2020/src/app/shared/material/badge/badge-icon.module.mjs +32 -0
  150. package/esm2020/src/app/shared/material/badge/badge-icon.test.mjs +27 -0
  151. package/esm2020/src/app/shared/material/boolean/boolean.module.mjs +68 -0
  152. package/esm2020/src/app/shared/material/boolean/material.boolean.mjs +253 -0
  153. package/esm2020/src/app/shared/material/chips/chips.module.mjs +76 -0
  154. package/esm2020/src/app/shared/material/chips/material.chips.mjs +692 -0
  155. package/esm2020/src/app/shared/material/chips/testing/chips.test.mjs +136 -0
  156. package/esm2020/src/app/shared/material/datetime/datetime.module.mjs +91 -0
  157. package/esm2020/src/app/shared/material/datetime/material.date.mjs +392 -0
  158. package/esm2020/src/app/shared/material/datetime/material.dateshort.mjs +327 -0
  159. package/esm2020/src/app/shared/material/datetime/material.datetime.mjs +416 -0
  160. package/esm2020/src/app/shared/material/datetime/testing/mat-date-time.test.mjs +110 -0
  161. package/esm2020/src/app/shared/material/datetime/testing/mat-date.test.mjs +111 -0
  162. package/esm2020/src/app/shared/material/duration/duration.module.mjs +67 -0
  163. package/{esm2015/src/app/shared/material/duration/duration.utils.js → esm2020/src/app/shared/material/duration/duration.utils.mjs} +0 -0
  164. package/esm2020/src/app/shared/material/duration/material.duration.mjs +257 -0
  165. package/esm2020/src/app/shared/material/latlong/latlong.utils.mjs +266 -0
  166. package/esm2020/src/app/shared/material/latlong/material.latlong.mjs +381 -0
  167. package/esm2020/src/app/shared/material/latlong/material.latlong.module.mjs +67 -0
  168. package/esm2020/src/app/shared/material/latlong/testing/latlong.test.mjs +74 -0
  169. package/{esm2015/src/app/shared/material/material.animations.js → esm2020/src/app/shared/material/material.animations.mjs} +0 -0
  170. package/esm2020/src/app/shared/material/material.module.mjs +224 -0
  171. package/{esm2015/src/app/shared/material/material.testing.module.js → esm2020/src/app/shared/material/material.testing.module.mjs} +68 -34
  172. package/esm2020/src/app/shared/material/numpad/numpad.append-to-input.directive.mjs +98 -0
  173. package/esm2020/src/app/shared/material/numpad/numpad.component.mjs +80 -0
  174. package/esm2020/src/app/shared/material/numpad/numpad.container.mjs +190 -0
  175. package/esm2020/src/app/shared/material/numpad/numpad.content.mjs +17 -0
  176. package/esm2020/src/app/shared/material/numpad/numpad.directive.mjs +162 -0
  177. package/esm2020/src/app/shared/material/numpad/numpad.dom-service.mjs +37 -0
  178. package/{esm2015/src/app/shared/material/numpad/numpad.model.js → esm2020/src/app/shared/material/numpad/numpad.model.mjs} +1 -1
  179. package/esm2020/src/app/shared/material/numpad/numpad.module.mjs +60 -0
  180. package/esm2020/src/app/shared/material/numpad/testing/numpad.test.mjs +46 -0
  181. package/esm2020/src/app/shared/material/paginator/material.paginator-i18n.mjs +42 -0
  182. package/esm2020/src/app/shared/material/stepper/material.stepper-i18n.mjs +22 -0
  183. package/esm2020/src/app/shared/material/swipe/material.swipe.mjs +334 -0
  184. package/esm2020/src/app/shared/material/swipe/swipe.module.mjs +51 -0
  185. package/esm2020/src/app/shared/material/swipe/testing/swipe.test.mjs +65 -0
  186. package/esm2020/src/app/shared/observables.mjs +96 -0
  187. package/esm2020/src/app/shared/pipes/arrays.pipe.mjs +114 -0
  188. package/esm2020/src/app/shared/pipes/colors.pipe.mjs +23 -0
  189. package/esm2020/src/app/shared/pipes/date-diff-duration.pipe.mjs +49 -0
  190. package/esm2020/src/app/shared/pipes/date-format.pipe.mjs +42 -0
  191. package/{esm2015/src/app/shared/pipes/date-from-now.pipe.js → esm2020/src/app/shared/pipes/date-from-now.pipe.mjs} +13 -12
  192. package/{esm2015/src/app/shared/pipes/duration.pipe.js → esm2020/src/app/shared/pipes/duration.pipe.mjs} +13 -12
  193. package/esm2020/src/app/shared/pipes/file-size.pipe.mjs +62 -0
  194. package/esm2020/src/app/shared/pipes/form.pipes.mjs +187 -0
  195. package/esm2020/src/app/shared/pipes/highlight.pipe.mjs +48 -0
  196. package/esm2020/src/app/shared/pipes/latlong-format.pipe.mjs +46 -0
  197. package/esm2020/src/app/shared/pipes/maps.pipe.mjs +63 -0
  198. package/esm2020/src/app/shared/pipes/math.pipes.mjs +59 -0
  199. package/esm2020/src/app/shared/pipes/ng-init.pipe.mjs +21 -0
  200. package/{esm2015/src/app/shared/pipes/number-format.pipe.js → esm2020/src/app/shared/pipes/number-format.pipe.mjs} +14 -9
  201. package/esm2020/src/app/shared/pipes/pipes.module.mjs +206 -0
  202. package/esm2020/src/app/shared/pipes/property.pipes.mjs +96 -0
  203. package/esm2020/src/app/shared/pipes/string.pipes.mjs +69 -0
  204. package/esm2020/src/app/shared/pipes/translate-context.pipe.mjs +43 -0
  205. package/esm2020/src/app/shared/platforms.mjs +49 -0
  206. package/esm2020/src/app/shared/services/entity-service.class.mjs +19 -0
  207. package/esm2020/src/app/shared/services/job.utils.mjs +92 -0
  208. package/esm2020/src/app/shared/services/memory-entity-service.class.mjs +253 -0
  209. package/esm2020/src/app/shared/services/progress-bar.service.mjs +32 -0
  210. package/esm2020/src/app/shared/services/startable-service.class.mjs +94 -0
  211. package/esm2020/src/app/shared/services/storage/storage.service.mjs +132 -0
  212. package/esm2020/src/app/shared/services/storage/storage.utils.mjs +13 -0
  213. package/esm2020/src/app/shared/services/translate-context.service.mjs +81 -0
  214. package/esm2020/src/app/shared/services/validator-service.class.mjs +2 -0
  215. package/esm2020/src/app/shared/services.mjs +62 -0
  216. package/esm2020/src/app/shared/shared-routing.module.mjs +63 -0
  217. package/esm2020/src/app/shared/shared.module.mjs +208 -0
  218. package/esm2020/src/app/shared/shared.testing.module.mjs +76 -0
  219. package/esm2020/src/app/shared/testing/tests.page.mjs +33 -0
  220. package/esm2020/src/app/shared/toast/toast.testing.mjs +52 -0
  221. package/esm2020/src/app/shared/toast/toast.testing.module.mjs +45 -0
  222. package/esm2020/src/app/shared/toast/toasts.mjs +121 -0
  223. package/esm2020/src/app/shared/toolbar/modal-toolbar.mjs +58 -0
  224. package/esm2020/src/app/shared/toolbar/toolbar.mjs +226 -0
  225. package/esm2020/src/app/shared/toolbar/toolbar.module.mjs +53 -0
  226. package/{esm2015/src/app/shared/types.js → esm2020/src/app/shared/types.mjs} +0 -0
  227. package/esm2020/src/app/shared/upload-file/testing/upload-file.testing.mjs +57 -0
  228. package/esm2020/src/app/shared/upload-file/testing/upload-file.testing.module.mjs +45 -0
  229. package/esm2020/src/app/shared/upload-file/upload-file-popover.component.mjs +97 -0
  230. package/esm2020/src/app/shared/upload-file/upload-file.component.mjs +204 -0
  231. package/esm2020/src/app/shared/upload-file/upload-file.model.mjs +20 -0
  232. package/esm2020/src/app/shared/validator/form-error-adapter.class.mjs +104 -0
  233. package/esm2020/src/app/shared/validator/validators.mjs +544 -0
  234. package/{esm2015/src/app/shared/version/versions.js → esm2020/src/app/shared/version/versions.mjs} +0 -0
  235. package/esm2020/src/app/social/job/job.model.mjs +26 -0
  236. package/esm2020/src/app/social/job/job.module.mjs +35 -0
  237. package/esm2020/src/app/social/job/job.service.mjs +59 -0
  238. package/esm2020/src/app/social/job/progression/job-progression.component.mjs +201 -0
  239. package/esm2020/src/app/social/job/progression/job-progression.list.mjs +22 -0
  240. package/esm2020/src/app/social/job/testing/job-progression.testing.mjs +51 -0
  241. package/esm2020/src/app/social/job/testing/job-progression.testing.service.mjs +33 -0
  242. package/esm2020/src/app/social/job/testing/job.testing.module.mjs +35 -0
  243. package/esm2020/src/app/social/message/message.form.mjs +81 -0
  244. package/esm2020/src/app/social/message/message.modal.mjs +93 -0
  245. package/esm2020/src/app/social/message/message.model.mjs +65 -0
  246. package/esm2020/src/app/social/message/message.module.mjs +35 -0
  247. package/esm2020/src/app/social/message/message.service.mjs +84 -0
  248. package/{esm2015/src/app/social/social.errors.js → esm2020/src/app/social/social.errors.mjs} +0 -0
  249. package/esm2020/src/app/social/social.module.mjs +47 -0
  250. package/esm2020/src/app/social/social.testing.module.mjs +51 -0
  251. package/esm2020/src/app/social/user-event/notification/user-event-notification.icon.mjs +97 -0
  252. package/esm2020/src/app/social/user-event/notification/user-event-notification.list.mjs +212 -0
  253. package/esm2020/src/app/social/user-event/testing/user-event.testing.mjs +228 -0
  254. package/esm2020/src/app/social/user-event/testing/user-event.testing.model.mjs +107 -0
  255. package/esm2020/src/app/social/user-event/testing/user-event.testing.module.mjs +35 -0
  256. package/esm2020/src/app/social/user-event/testing/user-event.testing.service.mjs +111 -0
  257. package/esm2020/src/app/social/user-event/user-event.model.mjs +2 -0
  258. package/esm2020/src/app/social/user-event/user-event.module.mjs +39 -0
  259. package/esm2020/src/app/social/user-event/user-event.service.mjs +486 -0
  260. package/{esm2015/src/app/vendor.js → esm2020/src/app/vendor.mjs} +1 -1
  261. package/esm2020/src/environments/environment.class.mjs +5 -0
  262. package/esm2020/src/environments/environment.mjs +86 -0
  263. package/esm2020/sumaris-net.ngx-components.mjs +5 -0
  264. package/fesm2015/sumaris-net.ngx-components.mjs +32493 -0
  265. package/fesm2015/sumaris-net.ngx-components.mjs.map +1 -0
  266. package/fesm2020/sumaris-net.ngx-components.mjs +31739 -0
  267. package/fesm2020/sumaris-net.ngx-components.mjs.map +1 -0
  268. package/index.d.ts +5 -0
  269. package/package.json +25 -34
  270. package/public_api.d.ts +23 -28
  271. package/public_test_api.d.ts +37 -0
  272. package/resources/README.md +8 -0
  273. package/src/app/admin/admin-routing.module.d.ts +7 -0
  274. package/src/app/admin/admin.module.d.ts +11 -0
  275. package/src/app/admin/services/person.service.d.ts +3 -0
  276. package/src/app/admin/services/validator/person.validator.d.ts +8 -5
  277. package/src/app/admin/users/list/users.d.ts +10 -7
  278. package/src/app/core/about/modal-about.d.ts +3 -0
  279. package/src/app/core/account/account.d.ts +11 -8
  280. package/src/app/core/auth/form/form-auth.d.ts +6 -3
  281. package/src/app/core/auth/modal/modal-auth.d.ts +3 -0
  282. package/src/app/core/core.module.d.ts +36 -0
  283. package/src/app/core/core.testing.module.d.ts +9 -0
  284. package/src/app/core/form/editor.class.d.ts +7 -2
  285. package/src/app/core/form/entity-editor-modal.class.d.ts +7 -4
  286. package/src/app/core/form/entity-editor.class.d.ts +4 -1
  287. package/src/app/core/form/entity-metadata.component.d.ts +3 -0
  288. package/src/app/core/form/form-buttons-bar.component.d.ts +3 -0
  289. package/src/app/core/form/form.class.d.ts +12 -9
  290. package/src/app/core/form/form.utils.d.ts +4 -4
  291. package/src/app/core/form/list.form.d.ts +10 -7
  292. package/src/app/core/form/properties.form.d.ts +10 -7
  293. package/src/app/core/graphql/graphql.module.d.ts +5 -0
  294. package/src/app/core/graphql/graphql.service.d.ts +9 -2
  295. package/src/app/core/graphql/graphql.utils.d.ts +8 -0
  296. package/src/app/core/home/home.d.ts +4 -1
  297. package/src/app/core/icon/icon.component.d.ts +5 -2
  298. package/src/app/core/icon/icon.module.d.ts +7 -0
  299. package/src/app/core/install/install-upgrade-card.component.d.ts +5 -2
  300. package/src/app/core/install/install-upgrade-card.module.d.ts +10 -0
  301. package/src/app/core/menu/menu.component.d.ts +7 -5
  302. package/src/app/core/menu/menu.module.d.ts +8 -0
  303. package/src/app/core/menu/menu.service.d.ts +3 -0
  304. package/src/app/core/offline/update-offline-mode-card.component.d.ts +3 -0
  305. package/src/app/core/peer/select-peer.modal.d.ts +7 -4
  306. package/src/app/core/peer/select-peer.module.d.ts +9 -0
  307. package/src/app/core/register/confirm/confirm.d.ts +3 -0
  308. package/src/app/core/register/form/form-register.d.ts +10 -7
  309. package/src/app/core/register/modal/modal-register.d.ts +3 -0
  310. package/src/app/core/register/register.module.d.ts +12 -0
  311. package/src/app/core/services/account.service.d.ts +5 -2
  312. package/src/app/core/services/auth-guard.service.d.ts +3 -0
  313. package/src/app/core/services/base-entity-service.class.d.ts +3 -0
  314. package/src/app/core/services/base-graphql-service.class.d.ts +3 -0
  315. package/src/app/core/services/config.service.d.ts +4 -1
  316. package/src/app/core/services/crypto.service.d.ts +3 -0
  317. package/src/app/core/services/local-settings.service.d.ts +5 -1
  318. package/src/app/core/services/model/referential.model.d.ts +1 -1
  319. package/src/app/core/services/network.service.d.ts +6 -5
  320. package/src/app/core/services/pipes/account.pipes.d.ts +7 -0
  321. package/src/app/core/services/pipes/department-to-string.pipe.d.ts +4 -0
  322. package/src/app/core/services/pipes/person-to-string.pipe.d.ts +4 -0
  323. package/src/app/core/services/pipes/usage-mode.pipes.d.ts +7 -0
  324. package/src/app/core/services/platform.service.d.ts +22 -21
  325. package/src/app/core/services/storage/entities-storage.service.d.ts +5 -2
  326. package/src/app/core/services/storage/entity-store.class.d.ts +3 -3
  327. package/src/app/core/services/testing/referential.validator.d.ts +8 -5
  328. package/src/app/core/services/validator/account.validator.d.ts +6 -3
  329. package/src/app/core/services/validator/base.validator.class.d.ts +8 -5
  330. package/src/app/core/services/validator/local-settings.validator.d.ts +8 -5
  331. package/src/app/core/services/validator/user-settings.validator.d.ts +6 -3
  332. package/src/app/core/settings/settings.page.d.ts +8 -5
  333. package/src/app/core/table/actions-column.component.d.ts +3 -0
  334. package/src/app/core/table/entities-table-datasource.class.d.ts +11 -9
  335. package/src/app/core/table/memory-table.class.d.ts +3 -0
  336. package/src/app/core/table/table-select-columns.component.d.ts +4 -5
  337. package/src/app/core/table/table.class.d.ts +53 -34
  338. package/src/app/core/table/testing/table.testing.d.ts +13 -15
  339. package/src/app/core/table/testing/table.testing.module.d.ts +9 -0
  340. package/src/app/core/text-popover/testing/text-popover.testing.d.ts +4 -1
  341. package/src/app/core/text-popover/testing/text-popover.testing.module.d.ts +9 -0
  342. package/src/app/core/text-popover/text-form.component.d.ts +7 -4
  343. package/src/app/core/text-popover/text-popover.component.d.ts +3 -0
  344. package/src/app/shared/alerts.d.ts +4 -4
  345. package/src/app/shared/audio/audio.d.ts +20 -11
  346. package/src/app/shared/audio/audio.testing.d.ts +13 -0
  347. package/src/app/shared/audio/audio.testing.module.d.ts +11 -0
  348. package/src/app/shared/capacitor/keyboard.d.ts +16 -0
  349. package/src/app/shared/capacitor/plugins.d.ts +7 -0
  350. package/src/app/shared/constants.d.ts +1 -0
  351. package/src/app/shared/directives/autofocus.directive.d.ts +9 -7
  352. package/src/app/shared/directives/autotitle.directive.d.ts +3 -0
  353. package/src/app/shared/directives/directives.module.d.ts +10 -0
  354. package/src/app/shared/directives/drag-and-drop.directive.d.ts +3 -0
  355. package/src/app/shared/directives/ng-var.directive.d.ts +3 -0
  356. package/src/app/shared/directives/resizable/resizable.component.d.ts +3 -0
  357. package/src/app/shared/directives/resizable/resizable.directive.d.ts +3 -0
  358. package/src/app/shared/directives/resizable/resizable.module.d.ts +6 -0
  359. package/src/app/shared/file/file.service.d.ts +3 -0
  360. package/src/app/shared/file/file.utils.d.ts +1 -1
  361. package/src/app/shared/form/field.component.d.ts +9 -3
  362. package/src/app/shared/form/field.model.d.ts +2 -2
  363. package/src/app/shared/form/loading-spinner.d.ts +3 -0
  364. package/src/app/shared/forms.d.ts +12 -12
  365. package/src/app/shared/gesture/gesture-config.d.ts +3 -0
  366. package/src/app/shared/gesture/hammer.utils.d.ts +11 -11
  367. package/src/app/shared/guard/component-dirty.guard.d.ts +3 -0
  368. package/src/app/shared/help/help.modal.d.ts +4 -1
  369. package/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.d.ts +3 -0
  370. package/src/app/shared/hotkeys/hotkeys.service.d.ts +4 -1
  371. package/src/app/shared/hotkeys/shared-hotkeys.module.d.ts +9 -0
  372. package/src/app/shared/image/gallery/image-gallery.component.d.ts +77 -0
  373. package/src/app/shared/image/gallery/image-gallery.module.d.ts +12 -0
  374. package/src/app/shared/image/gallery/testing/gallegry.model.testing.d.ts +12 -0
  375. package/src/app/shared/image/gallery/testing/gallery.service.testing.d.ts +33 -0
  376. package/src/app/shared/image/gallery/testing/gallery.testing.d.ts +15 -0
  377. package/src/app/shared/image/gallery/testing/gallery.testing.module.d.ts +12 -0
  378. package/src/app/shared/image/image.model.d.ts +5 -0
  379. package/src/app/shared/image/image.module.d.ts +8 -0
  380. package/src/app/shared/image/image.service.d.ts +32 -0
  381. package/src/app/shared/inputs.d.ts +3 -3
  382. package/src/app/shared/material/autocomplete/material.autocomplete.config.d.ts +36 -0
  383. package/src/app/shared/material/autocomplete/material.autocomplete.d.ts +11 -40
  384. package/src/app/shared/material/autocomplete/material.autocomplete.module.d.ts +19 -0
  385. package/src/app/shared/material/autocomplete/material.autocomplete.utils.d.ts +4 -0
  386. package/src/app/shared/material/autocomplete/testing/autocomplete.test.d.ts +12 -9
  387. package/src/app/shared/material/badge/badge-icon.directive.d.ts +6 -4
  388. package/src/app/shared/material/badge/badge-icon.module.d.ts +8 -0
  389. package/src/app/shared/material/badge/badge-icon.test.d.ts +4 -1
  390. package/src/app/shared/material/boolean/boolean.module.d.ts +17 -0
  391. package/src/app/shared/material/boolean/material.boolean.d.ts +7 -4
  392. package/src/app/shared/material/chips/chips.module.d.ts +19 -0
  393. package/src/app/shared/material/chips/material.chips.d.ts +11 -8
  394. package/src/app/shared/material/chips/testing/chips.test.d.ts +8 -5
  395. package/src/app/shared/material/datetime/datetime.module.d.ts +22 -0
  396. package/src/app/shared/material/datetime/material.date.d.ts +11 -9
  397. package/src/app/shared/material/datetime/material.dateshort.d.ts +10 -9
  398. package/src/app/shared/material/datetime/material.datetime.d.ts +13 -12
  399. package/src/app/shared/material/datetime/testing/mat-date-time.test.d.ts +11 -9
  400. package/src/app/shared/material/datetime/testing/mat-date.test.d.ts +11 -9
  401. package/src/app/shared/material/duration/duration.module.d.ts +16 -0
  402. package/src/app/shared/material/duration/material.duration.d.ts +8 -5
  403. package/src/app/shared/material/latlong/material.latlong.d.ts +8 -5
  404. package/src/app/shared/material/latlong/material.latlong.module.d.ts +17 -0
  405. package/src/app/shared/material/latlong/testing/latlong.test.d.ts +10 -7
  406. package/src/app/shared/material/material.module.d.ts +43 -0
  407. package/src/app/shared/material/material.testing.module.d.ts +19 -0
  408. package/src/app/shared/material/numpad/numpad.append-to-input.directive.d.ts +3 -0
  409. package/src/app/shared/material/numpad/numpad.component.d.ts +4 -1
  410. package/src/app/shared/material/numpad/numpad.container.d.ts +5 -2
  411. package/src/app/shared/material/numpad/numpad.content.d.ts +3 -0
  412. package/src/app/shared/material/numpad/numpad.directive.d.ts +4 -1
  413. package/src/app/shared/material/numpad/numpad.dom-service.d.ts +3 -0
  414. package/src/app/shared/material/numpad/numpad.model.d.ts +1 -1
  415. package/src/app/shared/material/numpad/numpad.module.d.ts +14 -0
  416. package/src/app/shared/material/numpad/testing/numpad.test.d.ts +7 -4
  417. package/src/app/shared/material/paginator/material.paginator-i18n.d.ts +3 -0
  418. package/src/app/shared/material/stepper/material.stepper-i18n.d.ts +3 -0
  419. package/src/app/shared/material/swipe/material.swipe.d.ts +6 -3
  420. package/src/app/shared/material/swipe/swipe.module.d.ts +13 -0
  421. package/src/app/shared/material/swipe/testing/swipe.test.d.ts +7 -4
  422. package/src/app/shared/pipes/arrays.pipe.d.ts +15 -0
  423. package/src/app/shared/pipes/colors.pipe.d.ts +9 -0
  424. package/src/app/shared/pipes/date-diff-duration.pipe.d.ts +4 -0
  425. package/src/app/shared/pipes/date-format.pipe.d.ts +4 -0
  426. package/src/app/shared/pipes/date-from-now.pipe.d.ts +4 -0
  427. package/src/app/shared/pipes/duration.pipe.d.ts +4 -0
  428. package/src/app/shared/pipes/file-size.pipe.d.ts +3 -0
  429. package/src/app/shared/pipes/form.pipes.d.ts +18 -5
  430. package/src/app/shared/pipes/highlight.pipe.d.ts +4 -0
  431. package/src/app/shared/pipes/latlong-format.pipe.d.ts +7 -0
  432. package/src/app/shared/pipes/maps.pipe.d.ts +10 -0
  433. package/src/app/shared/pipes/math.pipes.d.ts +10 -0
  434. package/src/app/shared/pipes/ng-init.pipe.d.ts +3 -0
  435. package/src/app/shared/pipes/number-format.pipe.d.ts +4 -0
  436. package/src/app/shared/pipes/pipes.module.d.ts +24 -0
  437. package/src/app/shared/pipes/property.pipes.d.ts +6 -0
  438. package/src/app/shared/pipes/string.pipes.d.ts +11 -0
  439. package/src/app/shared/pipes/translate-context.pipe.d.ts +7 -0
  440. package/src/app/shared/platforms.d.ts +1 -0
  441. package/src/app/shared/services/entity-service.class.d.ts +3 -0
  442. package/src/app/shared/services/memory-entity-service.class.d.ts +3 -0
  443. package/src/app/shared/services/progress-bar.service.d.ts +4 -1
  444. package/src/app/shared/services/storage/storage.service.d.ts +23 -0
  445. package/src/app/shared/services/storage/storage.utils.d.ts +19 -0
  446. package/src/app/shared/services/translate-context.service.d.ts +3 -0
  447. package/src/app/shared/services/validator-service.class.d.ts +2 -2
  448. package/src/app/shared/shared-routing.module.d.ts +7 -0
  449. package/src/app/shared/shared.module.d.ts +23 -0
  450. package/src/app/shared/shared.testing.module.d.ts +12 -0
  451. package/src/app/shared/testing/tests.page.d.ts +3 -0
  452. package/src/app/shared/toast/toast.testing.d.ts +3 -0
  453. package/src/app/shared/toast/toast.testing.module.d.ts +9 -0
  454. package/src/app/shared/toolbar/modal-toolbar.d.ts +5 -2
  455. package/src/app/shared/toolbar/toolbar.d.ts +9 -5
  456. package/src/app/shared/toolbar/toolbar.module.d.ts +15 -0
  457. package/src/app/shared/upload-file/testing/upload-file.testing.d.ts +4 -1
  458. package/src/app/shared/upload-file/testing/upload-file.testing.module.d.ts +9 -0
  459. package/src/app/shared/upload-file/upload-file-popover.component.d.ts +3 -0
  460. package/src/app/shared/upload-file/upload-file.component.d.ts +3 -0
  461. package/src/app/shared/validator/form-error-adapter.class.d.ts +3 -0
  462. package/src/app/shared/validator/validators.d.ts +9 -9
  463. package/src/app/social/job/job.module.d.ts +9 -0
  464. package/src/app/social/job/job.service.d.ts +3 -0
  465. package/src/app/social/job/progression/job-progression.component.d.ts +4 -1
  466. package/src/app/social/job/progression/job-progression.list.d.ts +3 -0
  467. package/src/app/social/job/testing/job-progression.testing.d.ts +3 -0
  468. package/src/app/social/job/testing/job-progression.testing.service.d.ts +3 -0
  469. package/src/app/social/job/testing/job.testing.module.d.ts +9 -0
  470. package/src/app/social/message/message.form.d.ts +5 -2
  471. package/src/app/social/message/message.modal.d.ts +5 -2
  472. package/src/app/social/message/message.module.d.ts +9 -0
  473. package/src/app/social/message/message.service.d.ts +3 -0
  474. package/src/app/social/social.module.d.ts +10 -0
  475. package/src/app/social/social.testing.module.d.ts +9 -0
  476. package/src/app/social/user-event/notification/user-event-notification.icon.d.ts +4 -1
  477. package/src/app/social/user-event/notification/user-event-notification.list.d.ts +7 -4
  478. package/src/app/social/user-event/testing/user-event.testing.d.ts +3 -0
  479. package/src/app/social/user-event/testing/user-event.testing.model.d.ts +1 -0
  480. package/src/app/social/user-event/testing/user-event.testing.module.d.ts +9 -0
  481. package/src/app/social/user-event/testing/user-event.testing.service.d.ts +5 -1
  482. package/src/app/social/user-event/user-event.model.d.ts +3 -2
  483. package/src/app/social/user-event/user-event.module.d.ts +10 -0
  484. package/src/app/social/user-event/user-event.service.d.ts +16 -11
  485. package/src/assets/audio/beep-notification.mp3 +0 -0
  486. package/src/assets/i18n/fr.json +9 -2
  487. package/src/environments/environment.class.d.ts +2 -0
  488. package/src/environments/environment.d.ts +1 -1
  489. package/src/theme/_icons.scss +1 -1
  490. package/src/theme/_material.globals.scss +29 -31
  491. package/src/theme/_material.scss +3 -2
  492. package/src/theme/_mixins.scss +4 -4
  493. package/src/theme/_ngx-components.scss +6 -0
  494. package/src/theme/_print.scss +24 -0
  495. package/bundles/sumaris-net.ngx-components.umd.js +0 -35297
  496. package/bundles/sumaris-net.ngx-components.umd.js.map +0 -1
  497. package/bundles/sumaris-net.ngx-components.umd.min.js +0 -25
  498. package/bundles/sumaris-net.ngx-components.umd.min.js.map +0 -1
  499. package/esm2015/public_api.js +0 -244
  500. package/esm2015/src/app/admin/admin-routing.module.js +0 -34
  501. package/esm2015/src/app/admin/admin.module.js +0 -34
  502. package/esm2015/src/app/admin/services/filter/person.filter.js +0 -59
  503. package/esm2015/src/app/admin/services/person.service.js +0 -175
  504. package/esm2015/src/app/admin/services/validator/person.validator.js +0 -37
  505. package/esm2015/src/app/admin/users/list/users.js +0 -216
  506. package/esm2015/src/app/core/about/modal-about.js +0 -63
  507. package/esm2015/src/app/core/account/account.js +0 -240
  508. package/esm2015/src/app/core/auth/form/form-auth.js +0 -134
  509. package/esm2015/src/app/core/auth/modal/modal-auth.js +0 -78
  510. package/esm2015/src/app/core/core.module.js +0 -127
  511. package/esm2015/src/app/core/core.testing.module.js +0 -51
  512. package/esm2015/src/app/core/form/editor.class.js +0 -632
  513. package/esm2015/src/app/core/form/entity-editor-modal.class.js +0 -421
  514. package/esm2015/src/app/core/form/entity-editor.class.js +0 -696
  515. package/esm2015/src/app/core/form/entity-metadata.component.js +0 -22
  516. package/esm2015/src/app/core/form/form-buttons-bar.component.js +0 -63
  517. package/esm2015/src/app/core/form/form.class.js +0 -338
  518. package/esm2015/src/app/core/form/form.utils.js +0 -264
  519. package/esm2015/src/app/core/form/list.form.js +0 -219
  520. package/esm2015/src/app/core/form/properties.form.js +0 -119
  521. package/esm2015/src/app/core/graphql/graphql.module.js +0 -18
  522. package/esm2015/src/app/core/graphql/graphql.service.js +0 -734
  523. package/esm2015/src/app/core/graphql/graphql.utils.js +0 -107
  524. package/esm2015/src/app/core/home/home.js +0 -265
  525. package/esm2015/src/app/core/icon/icon.component.js +0 -32
  526. package/esm2015/src/app/core/icon/icon.module.js +0 -26
  527. package/esm2015/src/app/core/install/install-upgrade-card.component.js +0 -358
  528. package/esm2015/src/app/core/menu/menu.component.js +0 -329
  529. package/esm2015/src/app/core/menu/menu.module.js +0 -28
  530. package/esm2015/src/app/core/offline/update-offline-mode-card.component.js +0 -26
  531. package/esm2015/src/app/core/peer/select-peer.modal.js +0 -134
  532. package/esm2015/src/app/core/register/confirm/confirm.js +0 -86
  533. package/esm2015/src/app/core/register/form/form-register.js +0 -172
  534. package/esm2015/src/app/core/register/modal/modal-register.js +0 -55
  535. package/esm2015/src/app/core/services/account.service.js +0 -1165
  536. package/esm2015/src/app/core/services/auth-guard.service.js +0 -77
  537. package/esm2015/src/app/core/services/base-entity-service.class.js +0 -455
  538. package/esm2015/src/app/core/services/base-graphql-service.class.js +0 -221
  539. package/esm2015/src/app/core/services/config.service.js +0 -385
  540. package/esm2015/src/app/core/services/local-settings.service.js +0 -460
  541. package/esm2015/src/app/core/services/model/account.model.js +0 -50
  542. package/esm2015/src/app/core/services/model/config.model.js +0 -89
  543. package/esm2015/src/app/core/services/model/department.model.js +0 -30
  544. package/esm2015/src/app/core/services/model/entity.decorators.js +0 -104
  545. package/esm2015/src/app/core/services/model/entity.model.js +0 -245
  546. package/esm2015/src/app/core/services/model/peer.model.js +0 -68
  547. package/esm2015/src/app/core/services/model/person.model.js +0 -83
  548. package/esm2015/src/app/core/services/model/referential.model.js +0 -147
  549. package/esm2015/src/app/core/services/model/settings.model.js +0 -75
  550. package/esm2015/src/app/core/services/network.service.js +0 -639
  551. package/esm2015/src/app/core/services/network.utils.js +0 -19
  552. package/esm2015/src/app/core/services/pipes/account.pipes.js +0 -28
  553. package/esm2015/src/app/core/services/pipes/department-to-string.pipe.js +0 -18
  554. package/esm2015/src/app/core/services/pipes/person-to-string.pipe.js +0 -18
  555. package/esm2015/src/app/core/services/pipes/usage-mode.pipes.js +0 -27
  556. package/esm2015/src/app/core/services/platform.service.js +0 -549
  557. package/esm2015/src/app/core/services/storage/entities-storage.service.js +0 -452
  558. package/esm2015/src/app/core/services/storage/entity-store.class.js +0 -461
  559. package/esm2015/src/app/core/services/testing/referential-filter.model.js +0 -23
  560. package/esm2015/src/app/core/services/testing/referential.validator.js +0 -44
  561. package/esm2015/src/app/core/services/validator/account.validator.js +0 -55
  562. package/esm2015/src/app/core/services/validator/base.validator.class.js +0 -48
  563. package/esm2015/src/app/core/services/validator/local-settings.validator.js +0 -72
  564. package/esm2015/src/app/core/services/validator/user-settings.validator.js +0 -30
  565. package/esm2015/src/app/core/settings/settings.page.js +0 -305
  566. package/esm2015/src/app/core/table/actions-column.component.js +0 -74
  567. package/esm2015/src/app/core/table/entities-table-datasource.class.js +0 -389
  568. package/esm2015/src/app/core/table/memory-table.class.js +0 -59
  569. package/esm2015/src/app/core/table/table-select-columns.component.js +0 -44
  570. package/esm2015/src/app/core/table/table.class.js +0 -1651
  571. package/esm2015/src/app/core/table/testing/table.testing.js +0 -241
  572. package/esm2015/src/app/core/table/testing/table.testing.module.js +0 -26
  573. package/esm2015/src/app/core/text-popover/testing/text-popover.testing.js +0 -37
  574. package/esm2015/src/app/core/text-popover/testing/text-popover.testing.module.js +0 -33
  575. package/esm2015/src/app/core/text-popover/text-form.component.js +0 -72
  576. package/esm2015/src/app/core/text-popover/text-popover.component.js +0 -90
  577. package/esm2015/src/app/shared/alerts.js +0 -251
  578. package/esm2015/src/app/shared/audio/audio.js +0 -178
  579. package/esm2015/src/app/shared/dates.js +0 -134
  580. package/esm2015/src/app/shared/directives/autofocus.directive.js +0 -90
  581. package/esm2015/src/app/shared/directives/autotitle.directive.js +0 -27
  582. package/esm2015/src/app/shared/directives/directives.module.js +0 -30
  583. package/esm2015/src/app/shared/directives/drag-and-drop.directive.js +0 -43
  584. package/esm2015/src/app/shared/directives/ng-var.directive.js +0 -32
  585. package/esm2015/src/app/shared/directives/resizable/resizable.component.js +0 -54
  586. package/esm2015/src/app/shared/directives/resizable/resizable.directive.js +0 -34
  587. package/esm2015/src/app/shared/directives/resizable/resizable.module.js +0 -12
  588. package/esm2015/src/app/shared/events.js +0 -61
  589. package/esm2015/src/app/shared/file/csv.utils.js +0 -70
  590. package/esm2015/src/app/shared/file/file.service.js +0 -121
  591. package/esm2015/src/app/shared/file/file.utils.js +0 -116
  592. package/esm2015/src/app/shared/file/images.utils.js +0 -166
  593. package/esm2015/src/app/shared/form/field.component.js +0 -206
  594. package/esm2015/src/app/shared/form/loading-spinner.js +0 -24
  595. package/esm2015/src/app/shared/forms.js +0 -339
  596. package/esm2015/src/app/shared/functions.js +0 -418
  597. package/esm2015/src/app/shared/gesture/hammer.utils.js +0 -2
  598. package/esm2015/src/app/shared/graph/graph-colors.js +0 -256
  599. package/esm2015/src/app/shared/guard/component-dirty.guard.js +0 -61
  600. package/esm2015/src/app/shared/help/help.modal.js +0 -56
  601. package/esm2015/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.js +0 -20
  602. package/esm2015/src/app/shared/hotkeys/hotkeys.service.js +0 -91
  603. package/esm2015/src/app/shared/hotkeys/shared-hotkeys.module.js +0 -29
  604. package/esm2015/src/app/shared/http/http.utils.js +0 -57
  605. package/esm2015/src/app/shared/material/autocomplete/material.autocomplete.js +0 -825
  606. package/esm2015/src/app/shared/material/autocomplete/material.autocomplete.module.js +0 -46
  607. package/esm2015/src/app/shared/material/autocomplete/testing/autocomplete.test.js +0 -200
  608. package/esm2015/src/app/shared/material/badge/badge-icon.directive.js +0 -135
  609. package/esm2015/src/app/shared/material/badge/badge-icon.module.js +0 -23
  610. package/esm2015/src/app/shared/material/badge/badge-icon.test.js +0 -17
  611. package/esm2015/src/app/shared/material/boolean/boolean.module.js +0 -41
  612. package/esm2015/src/app/shared/material/boolean/material.boolean.js +0 -223
  613. package/esm2015/src/app/shared/material/chips/chips.module.js +0 -45
  614. package/esm2015/src/app/shared/material/chips/material.chips.js +0 -636
  615. package/esm2015/src/app/shared/material/chips/testing/chips.test.js +0 -138
  616. package/esm2015/src/app/shared/material/datetime/datetime.module.js +0 -54
  617. package/esm2015/src/app/shared/material/datetime/material.date.js +0 -375
  618. package/esm2015/src/app/shared/material/datetime/material.dateshort.js +0 -316
  619. package/esm2015/src/app/shared/material/datetime/material.datetime.js +0 -398
  620. package/esm2015/src/app/shared/material/datetime/testing/mat-date-time.test.js +0 -110
  621. package/esm2015/src/app/shared/material/datetime/testing/mat-date.test.js +0 -108
  622. package/esm2015/src/app/shared/material/duration/duration.module.js +0 -40
  623. package/esm2015/src/app/shared/material/duration/material.duration.js +0 -246
  624. package/esm2015/src/app/shared/material/latlong/latlong.utils.js +0 -249
  625. package/esm2015/src/app/shared/material/latlong/material.latlong.js +0 -350
  626. package/esm2015/src/app/shared/material/latlong/material.latlong.module.js +0 -41
  627. package/esm2015/src/app/shared/material/latlong/testing/latlong.test.js +0 -70
  628. package/esm2015/src/app/shared/material/material.module.js +0 -93
  629. package/esm2015/src/app/shared/material/numpad/numpad.append-to-input.directive.js +0 -96
  630. package/esm2015/src/app/shared/material/numpad/numpad.component.js +0 -73
  631. package/esm2015/src/app/shared/material/numpad/numpad.container.js +0 -149
  632. package/esm2015/src/app/shared/material/numpad/numpad.content.js +0 -14
  633. package/esm2015/src/app/shared/material/numpad/numpad.directive.js +0 -148
  634. package/esm2015/src/app/shared/material/numpad/numpad.dom-service.js +0 -37
  635. package/esm2015/src/app/shared/material/numpad/numpad.module.js +0 -39
  636. package/esm2015/src/app/shared/material/numpad/testing/numpad.test.js +0 -44
  637. package/esm2015/src/app/shared/material/paginator/material.paginator-i18n.js +0 -44
  638. package/esm2015/src/app/shared/material/stepper/material.stepper-i18n.js +0 -24
  639. package/esm2015/src/app/shared/material/swipe/material.swipe.js +0 -308
  640. package/esm2015/src/app/shared/material/swipe/swipe.module.js +0 -33
  641. package/esm2015/src/app/shared/material/swipe/testing/swipe.test.js +0 -68
  642. package/esm2015/src/app/shared/observables.js +0 -99
  643. package/esm2015/src/app/shared/pipes/arrays.pipe.js +0 -92
  644. package/esm2015/src/app/shared/pipes/date-diff-duration.pipe.js +0 -50
  645. package/esm2015/src/app/shared/pipes/date-format.pipe.js +0 -43
  646. package/esm2015/src/app/shared/pipes/file-size.pipe.js +0 -58
  647. package/esm2015/src/app/shared/pipes/form.pipes.js +0 -177
  648. package/esm2015/src/app/shared/pipes/highlight.pipe.js +0 -43
  649. package/esm2015/src/app/shared/pipes/latlong-format.pipe.js +0 -36
  650. package/esm2015/src/app/shared/pipes/maps.pipe.js +0 -48
  651. package/esm2015/src/app/shared/pipes/math.pipes.js +0 -44
  652. package/esm2015/src/app/shared/pipes/ng-init.pipe.js +0 -18
  653. package/esm2015/src/app/shared/pipes/pipes.module.js +0 -115
  654. package/esm2015/src/app/shared/pipes/property.pipes.js +0 -98
  655. package/esm2015/src/app/shared/pipes/string.pipes.js +0 -53
  656. package/esm2015/src/app/shared/pipes/translate-context.pipe.js +0 -36
  657. package/esm2015/src/app/shared/platforms.js +0 -45
  658. package/esm2015/src/app/shared/services/entity-service.class.js +0 -17
  659. package/esm2015/src/app/shared/services/job.utils.js +0 -96
  660. package/esm2015/src/app/shared/services/memory-entity-service.class.js +0 -260
  661. package/esm2015/src/app/shared/services/progress-bar.service.js +0 -30
  662. package/esm2015/src/app/shared/services/startable-service.class.js +0 -98
  663. package/esm2015/src/app/shared/services/storage.utils.js +0 -41
  664. package/esm2015/src/app/shared/services/translate-context.service.js +0 -83
  665. package/esm2015/src/app/shared/services/validator-service.class.js +0 -2
  666. package/esm2015/src/app/shared/services.js +0 -61
  667. package/esm2015/src/app/shared/shared-routing.module.js +0 -54
  668. package/esm2015/src/app/shared/shared.module.js +0 -135
  669. package/esm2015/src/app/shared/shared.testing.module.js +0 -33
  670. package/esm2015/src/app/shared/testing/tests.page.js +0 -34
  671. package/esm2015/src/app/shared/toast/toast.testing.js +0 -39
  672. package/esm2015/src/app/shared/toast/toast.testing.module.js +0 -33
  673. package/esm2015/src/app/shared/toast/toasts.js +0 -119
  674. package/esm2015/src/app/shared/toolbar/modal-toolbar.js +0 -53
  675. package/esm2015/src/app/shared/toolbar/toolbar.js +0 -213
  676. package/esm2015/src/app/shared/upload-file/testing/upload-file.testing.js +0 -59
  677. package/esm2015/src/app/shared/upload-file/testing/upload-file.testing.module.js +0 -33
  678. package/esm2015/src/app/shared/upload-file/upload-file-popover.component.js +0 -98
  679. package/esm2015/src/app/shared/upload-file/upload-file.component.js +0 -202
  680. package/esm2015/src/app/shared/upload-file/upload-file.model.js +0 -20
  681. package/esm2015/src/app/shared/validator/form-error-adapter.class.js +0 -99
  682. package/esm2015/src/app/shared/validator/validators.js +0 -537
  683. package/esm2015/src/app/social/job/job.model.js +0 -26
  684. package/esm2015/src/app/social/job/job.module.js +0 -25
  685. package/esm2015/src/app/social/job/job.service.js +0 -54
  686. package/esm2015/src/app/social/job/progression/job-progression.component.js +0 -200
  687. package/esm2015/src/app/social/job/progression/job-progression.list.js +0 -20
  688. package/esm2015/src/app/social/job/testing/job-progression.testing.js +0 -48
  689. package/esm2015/src/app/social/job/testing/job-progression.testing.service.js +0 -30
  690. package/esm2015/src/app/social/job/testing/job.testing.module.js +0 -25
  691. package/esm2015/src/app/social/message/message.form.js +0 -73
  692. package/esm2015/src/app/social/message/message.modal.js +0 -96
  693. package/esm2015/src/app/social/message/message.model.js +0 -65
  694. package/esm2015/src/app/social/message/message.module.js +0 -25
  695. package/esm2015/src/app/social/message/message.service.js +0 -87
  696. package/esm2015/src/app/social/social.module.js +0 -28
  697. package/esm2015/src/app/social/social.testing.module.js +0 -39
  698. package/esm2015/src/app/social/user-event/notification/user-event-notification.icon.js +0 -95
  699. package/esm2015/src/app/social/user-event/notification/user-event-notification.list.js +0 -203
  700. package/esm2015/src/app/social/user-event/testing/user-event.testing.js +0 -230
  701. package/esm2015/src/app/social/user-event/testing/user-event.testing.model.js +0 -103
  702. package/esm2015/src/app/social/user-event/testing/user-event.testing.module.js +0 -25
  703. package/esm2015/src/app/social/user-event/testing/user-event.testing.service.js +0 -117
  704. package/esm2015/src/app/social/user-event/user-event.model.js +0 -2
  705. package/esm2015/src/app/social/user-event/user-event.module.js +0 -27
  706. package/esm2015/src/app/social/user-event/user-event.service.js +0 -509
  707. package/esm2015/src/environments/environment.class.js +0 -5
  708. package/esm2015/src/environments/environment.js +0 -81
  709. package/esm2015/sumaris-net.ngx-components.js +0 -21
  710. package/fesm2015/sumaris-net.ngx-components.js +0 -29932
  711. package/fesm2015/sumaris-net.ngx-components.js.map +0 -1
  712. package/src/app/shared/services/storage.utils.d.ts +0 -13
  713. package/sumaris-net.ngx-components.d.ts +0 -20
  714. package/sumaris-net.ngx-components.metadata.json +0 -1
@@ -0,0 +1,392 @@
1
+ import { ChangeDetectionStrategy, Component, forwardRef, Input, Optional, ViewChild, ViewChildren } from '@angular/core';
2
+ import { NG_VALUE_ACCESSOR, Validators } from '@angular/forms';
3
+ import { isMoment } from 'moment';
4
+ import { DEFAULT_PLACEHOLDER_CHAR, KEYBOARD_HIDE_DELAY_MS } from '../../constants';
5
+ import { SharedValidators } from '../../validator/validators';
6
+ import { isBlankString, isNil, isNotNil, isNotNilBoolean, isNotNilOrBlank, sleep } from '../../functions';
7
+ import { filter } from 'rxjs/operators';
8
+ import { setTabIndex } from '../../inputs';
9
+ import { Subscription } from 'rxjs';
10
+ import { isFocusableElement } from '../../focusable';
11
+ import { fromDateISOString, toDateISOString } from '../../dates';
12
+ import { isMobile } from '../../platforms';
13
+ import { Keyboard } from '@capacitor/keyboard';
14
+ import { Capacitor } from '@capacitor/core';
15
+ import * as i0 from "@angular/core";
16
+ import * as i1 from "@angular/material-moment-adapter";
17
+ import * as i2 from "@ngx-translate/core";
18
+ import * as i3 from "@angular/forms";
19
+ import * as i4 from "@angular/common";
20
+ import * as i5 from "@ionic/angular";
21
+ import * as i6 from "@angular/material/form-field";
22
+ import * as i7 from "@angular/material/input";
23
+ import * as i8 from "@angular/material/icon";
24
+ import * as i9 from "@angular/material/button";
25
+ import * as i10 from "@angular/material/datepicker";
26
+ import * as i11 from "angular2-text-mask";
27
+ import * as i12 from "../../directives/autofocus.directive";
28
+ import * as i13 from "../../pipes/date-format.pipe";
29
+ import * as i14 from "../../pipes/arrays.pipe";
30
+ import * as i15 from "../../pipes/maps.pipe";
31
+ const DEFAULT_VALUE_ACCESSOR = {
32
+ provide: NG_VALUE_ACCESSOR,
33
+ useExisting: forwardRef(() => MatDate),
34
+ multi: true
35
+ };
36
+ const TEXT_MASK = [/\d/, /\d/, '/', /\d/, /\d/, '/', /\d/, /\d/, /\d/, /\d/];
37
+ const noop = () => { };
38
+ export class MatDate {
39
+ constructor(dateAdapter, translate, formBuilder, cd, formGroupDir) {
40
+ this.dateAdapter = dateAdapter;
41
+ this.translate = translate;
42
+ this.formBuilder = formBuilder;
43
+ this.cd = cd;
44
+ this.formGroupDir = formGroupDir;
45
+ this._onChangeCallback = noop;
46
+ this._onTouchedCallback = noop;
47
+ this._subscription = new Subscription();
48
+ this._writing = true;
49
+ this._disabling = false;
50
+ this._readonly = false;
51
+ this.mask = TEXT_MASK;
52
+ this.floatLabel = 'auto';
53
+ this.compact = false;
54
+ this.placeholderChar = DEFAULT_PLACEHOLDER_CHAR;
55
+ this.autofocus = false;
56
+ this.startDate = null;
57
+ this.clearable = false;
58
+ this.timezone = null;
59
+ this.locale = (translate.currentLang || translate.defaultLang).substring(0, 2);
60
+ }
61
+ set readonly(value) {
62
+ this._readonly = value;
63
+ this.markForCheck();
64
+ }
65
+ get readonly() {
66
+ return this._readonly;
67
+ }
68
+ set tabindex(value) {
69
+ if (this._tabindex !== value) {
70
+ this._tabindex = value;
71
+ if (!this._writing)
72
+ this.updateTabIndex();
73
+ }
74
+ }
75
+ get tabindex() {
76
+ return this._tabindex;
77
+ }
78
+ get value() {
79
+ return this.formControl.value;
80
+ }
81
+ ngOnInit() {
82
+ this.formControl = this.formControl || this.formControlName && this.formGroupDir && this.formGroupDir.form.get(this.formControlName);
83
+ if (!this.formControl)
84
+ throw new Error('Missing mandatory attribute \'formControl\' or \'formControlName\' in <mat-date-field>.');
85
+ this.mobile = isNotNil(this.mobile) ? this.mobile : isMobile(window);
86
+ // Workaround because ion-datetime has issue (do not returned a ISO date)
87
+ this._keyboardHideDelay = this.mobile && KEYBOARD_HIDE_DELAY_MS || 0;
88
+ this._hasKeyboardPlugin = this.mobile && Capacitor.isPluginAvailable('Keyboard');
89
+ this.required = isNotNilBoolean(this.required) ? this.required : (this.formControl.validator === Validators.required || isBlankString(this.required));
90
+ // Add 'validDate' validator (when existing validator are null or required, to be sure to keep it)
91
+ if (!this.formControl.validator || this.formControl.validator === Validators.required) {
92
+ this.formControl.setValidators(this.required ? [Validators.required, SharedValidators.validDate] : SharedValidators.validDate);
93
+ }
94
+ else {
95
+ this.formControl.setValidators(this.required ? [this.formControl.validator, Validators.required, SharedValidators.validDate] :
96
+ [this.formControl.validator, SharedValidators.validDate]);
97
+ }
98
+ // Create the text control
99
+ this.textControl = this.formBuilder.control(null,
100
+ // Important: should copy errors from the model formControl
101
+ () => this.formControl.errors);
102
+ // Get patterns to display date
103
+ this.updatePattern(this.translate.instant('COMMON.DATE_PATTERN'));
104
+ this._subscription.add(this.translate.get('COMMON.DATE_PATTERN')
105
+ .subscribe((pattern) => this.updatePattern(pattern)));
106
+ this._subscription.add(this.textControl.valueChanges
107
+ .subscribe((value) => this.onFormChange(value)));
108
+ // Listen status changes (when done outside the component - e.g. when setErrors() is calling on the formControl)
109
+ this._subscription.add(this.formControl.statusChanges
110
+ .pipe(filter((_) => !this.readonly && !this._writing && !this._disabling) // Skip
111
+ )
112
+ .subscribe(() => {
113
+ this.textControl.updateValueAndValidity({ emitEvent: false });
114
+ if (this.formControl.touched && !this.textControl.touched) {
115
+ this.textControl.markAsTouched();
116
+ }
117
+ this.markForCheck();
118
+ }));
119
+ this.updateTabIndex();
120
+ this._writing = false;
121
+ }
122
+ ngOnDestroy() {
123
+ this._subscription.unsubscribe();
124
+ }
125
+ writeValue(value) {
126
+ if (this._writing)
127
+ return; // Skip
128
+ this._writing = true;
129
+ // DEBUG
130
+ //console.debug("[mat-date] writeValue() with:", value);
131
+ // Convert into date
132
+ // Important: do a clone()
133
+ let date = isMoment(value) ? value.clone() : fromDateISOString(value);
134
+ if (!date || !date.isValid()) {
135
+ this.textControl.patchValue(null, { emitEvent: false });
136
+ if (this.formControl.value) {
137
+ this.formControl.patchValue(null, { emitEvent: false });
138
+ this._onChangeCallback(null);
139
+ }
140
+ }
141
+ else {
142
+ // Move to the expected TZ (keeping local hour - e.g. midnight)
143
+ date = (this.timezone && date.tz(this.timezone) || date)
144
+ // Reset hour
145
+ .startOf('day');
146
+ const dayStr = this.dateAdapter.format(date, this.datePattern);
147
+ if (this.textControl.value !== dayStr) {
148
+ // Update day control
149
+ this.textControl.patchValue(dayStr, { emitEvent: false });
150
+ }
151
+ }
152
+ this._writing = false;
153
+ this.markForCheck();
154
+ }
155
+ registerOnChange(fn) {
156
+ this._onChangeCallback = fn;
157
+ }
158
+ registerOnTouched(fn) {
159
+ this._onTouchedCallback = fn;
160
+ }
161
+ setDisabledState(isDisabled) {
162
+ if (this._disabling)
163
+ return;
164
+ this._disabling = true;
165
+ if (isDisabled) {
166
+ this.textControl.disable({ emitEvent: false });
167
+ }
168
+ else {
169
+ this.textControl.enable({ emitEvent: false });
170
+ }
171
+ this._disabling = false;
172
+ this.markForCheck();
173
+ }
174
+ onDatePickerChange(event) {
175
+ // Make sure event is valid
176
+ if (!event || (event.value !== null && !isMoment(event.value))) {
177
+ console.warn('Invalid MatDatepicker event. Skipping', event);
178
+ return; // Skip
179
+ }
180
+ let dateStr = null;
181
+ if (event.value) {
182
+ let date = event.value
183
+ .locale(this.locale) // set as time as locale time
184
+ .minute(0).seconds(0).millisecond(0) // Reset hour
185
+ .utc(true);
186
+ dateStr = this.dateAdapter.format(date, this.datePattern) || null;
187
+ }
188
+ if (this.textControl.value !== dateStr) {
189
+ // DEBUG
190
+ //console.debug("[mat-date] onDatePickerChange() new value:", dateStr);
191
+ this.textControl.setValue(dateStr, {
192
+ emitEvent: true // Will call onFormChange
193
+ });
194
+ }
195
+ }
196
+ async openDatePickerIfMobile(event, datePicker) {
197
+ if (!this.mobile || event.defaultPrevented)
198
+ return;
199
+ this.preventEvent(event);
200
+ // Make sure the keyboard is closed
201
+ await this.waitKeyboardHide(false);
202
+ // Open the picker
203
+ this.openDatePicker(null, datePicker);
204
+ }
205
+ openDatePicker(event, datePicker) {
206
+ datePicker = datePicker || this.datePicker;
207
+ if (datePicker) {
208
+ if (event)
209
+ this.preventEvent(event);
210
+ if (!datePicker.opened) {
211
+ datePicker.open();
212
+ }
213
+ }
214
+ }
215
+ preventEvent(event) {
216
+ if (!event)
217
+ return;
218
+ event.preventDefault();
219
+ if (event.stopPropagation)
220
+ event.stopPropagation();
221
+ event.returnValue = false;
222
+ }
223
+ focus() {
224
+ if (!this.matInputs.length)
225
+ return;
226
+ setTimeout(() => {
227
+ const elementRef = this.matInputs[0]; // get the first element
228
+ if (isFocusableElement(elementRef)) {
229
+ elementRef.focus();
230
+ }
231
+ });
232
+ }
233
+ clear() {
234
+ this.textControl.patchValue(null, { emitEvent: false });
235
+ this.formControl.setValue(null, { emitEvent: false });
236
+ this._onChangeCallback(null);
237
+ this.markAsTouched();
238
+ this.markAsDirty();
239
+ }
240
+ /* -- private method -- */
241
+ updatePattern(pattern) {
242
+ pattern = pattern !== 'COMMON.DATE_PATTERN' ? pattern : 'L';
243
+ if (this.datePattern !== pattern) {
244
+ this.datePattern = pattern;
245
+ this.markForCheck();
246
+ }
247
+ }
248
+ checkIfTouched(opts) {
249
+ if (this.textControl.touched) {
250
+ this._onTouchedCallback();
251
+ if (!opts || opts.emitEvent !== false) {
252
+ this.markForCheck();
253
+ }
254
+ }
255
+ }
256
+ onFormChange(value) {
257
+ if (this._writing)
258
+ return; // Skip if call by self
259
+ this._writing = true;
260
+ // DEBUG
261
+ //console.debug(`[mat-date-time] onFormChange() from event: ${event} - controls values: `, [dayStr, time]);
262
+ /*if (this.dayControl.invalid) {
263
+ this.formControl.markAsPending({onlySelf: true});
264
+ this.formControl.setErrors({
265
+ ...this.formControl.errors,
266
+ ...this.dayControl.errors
267
+ });
268
+ this.formControl.markAsDirty();
269
+ this._writing = false;
270
+ return;
271
+ }*/
272
+ if (value) {
273
+ // Make to remove placeholder chars
274
+ while (value.indexOf(this.placeholderChar) !== -1) {
275
+ value = value.replace(this.placeholderChar, '');
276
+ }
277
+ // Force '0' for empty month (otherwise moment will use the current month)
278
+ value = value.replace('//', '/0/')
279
+ // Force '0' for empty year (otherwise moment will use the current year)
280
+ .replace(/\/$/, '/0');
281
+ }
282
+ // Parse date (strict = false)
283
+ let date = isNotNilOrBlank(value) && this.dateAdapter.parse(value, this.datePattern) || null;
284
+ // Move to the expected TZ, and keep the local hour (= midnight) to have midnight at local time
285
+ date = date && (this.timezone ? date.tz(this.timezone, true) : date) || null;
286
+ date = date && date
287
+ .startOf('day') // Reset hour
288
+ .utc() // Convert to UTC (avoid TZ offset in final string)
289
+ || null;
290
+ // Convert to model value (ISO date string)
291
+ // IMPORTANT: If date is invalid, then keep the invalid string value
292
+ // to allow SharedValidators.validDate() to raise an error
293
+ const formControlValue = date && date.isValid() ? toDateISOString(date) : (value || null);
294
+ if (this.formControl.value !== formControlValue) {
295
+ // DEBUG
296
+ //console.debug('[mat-date] Emit new value: ' + dateStr);
297
+ // Apply to form control. => Will call writeValue()
298
+ // NOT NEED, because a formControl should NOT be used by multiple fields
299
+ //this.formControl.setValue(dateStr, {emitEvent: false})
300
+ // Changes comes from inside function: use the callback
301
+ this._onChangeCallback(formControlValue);
302
+ // Check if need to update controls
303
+ this.checkIfTouched();
304
+ }
305
+ // Force the day control to update its validity (same errors as formControl - see ngOnInit())
306
+ this.textControl.updateValueAndValidity();
307
+ this._writing = false;
308
+ }
309
+ async waitKeyboardHide(waitKeyboardDelay) {
310
+ if (!this._hasKeyboardPlugin)
311
+ return;
312
+ // Force keyboard to be hide
313
+ await Keyboard.hide();
314
+ // Wait an additional delay if need (depending on the OS)
315
+ if (this._keyboardHideDelay > 0 && waitKeyboardDelay) {
316
+ await sleep(this._keyboardHideDelay);
317
+ }
318
+ }
319
+ updateTabIndex() {
320
+ if (isNil(this._tabindex) || this._tabindex === -1)
321
+ return; // skip
322
+ // Focus to first input
323
+ setTimeout(() => {
324
+ this.matInputs.forEach((elementRef, index) => {
325
+ setTabIndex(elementRef, this._tabindex + index);
326
+ });
327
+ this.markForCheck();
328
+ });
329
+ }
330
+ markAsTouched(opts) {
331
+ this.textControl.markAsTouched(opts);
332
+ this._onTouchedCallback();
333
+ this.markForCheck();
334
+ }
335
+ markAsDirty(opts) {
336
+ this.formControl.markAsDirty(opts);
337
+ }
338
+ markForCheck() {
339
+ this.cd.markForCheck();
340
+ }
341
+ }
342
+ MatDate.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.1", ngImport: i0, type: MatDate, deps: [{ token: i1.MomentDateAdapter }, { token: i2.TranslateService }, { token: i3.UntypedFormBuilder }, { token: i0.ChangeDetectorRef }, { token: i3.FormGroupDirective, optional: true }], target: i0.ɵɵFactoryTarget.Component });
343
+ MatDate.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.1", type: MatDate, selector: "mat-date-field", inputs: { mobile: "mobile", formControl: "formControl", formControlName: "formControlName", placeholder: "placeholder", floatLabel: "floatLabel", appearance: "appearance", required: "required", compact: "compact", placeholderChar: "placeholderChar", autofocus: "autofocus", startDate: "startDate", clearable: "clearable", timezone: "timezone", datePickerFilter: "datePickerFilter", readonly: "readonly", tabindex: "tabindex" }, providers: [
344
+ DEFAULT_VALUE_ACCESSOR,
345
+ ], viewQueries: [{ propertyName: "datePicker", first: true, predicate: ["datePicker"], descendants: true }, { propertyName: "matInputs", predicate: ["matInput"], descendants: true }], ngImport: i0, template: "<!-- readonly -->\n<mat-form-field *ngIf=\"readonly; else writable\"\n [floatLabel]=\"floatLabel\"\n [appearance]=\"appearance\"\n class=\"mat-form-field-disabled\">\n\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n\n <input matInput hidden type=\"text\"\n readonly\n [placeholder]=\"placeholder\"\n [formControl]=\"formControl\">\n <ion-text>{{formControl.value|dateFormat: {pattern: datePattern} }}</ion-text>\n</mat-form-field>\n\n<!-- writable -->\n<ng-template #writable>\n <mat-form-field [floatLabel]=\"floatLabel\"\n [appearance]=\"appearance\">\n\n <mat-label>{{placeholder}}</mat-label>\n\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n\n <input matInput #matInput autocomplete=\"off\" type=\"text\"\n *ngIf=\"!mobile\"\n [formControl]=\"textControl\"\n [textMask]=\"{mask: mask, keepCharPositions: true, placeholderChar: placeholderChar}\"\n [placeholder]=\"'COMMON.DATE_PLACEHOLDER'|translate\"\n (blur)=\"checkIfTouched()\"\n (keyup.arrowDown)=\"openDatePicker($event, datePicker)\"\n (keyup.escape)=\"preventEvent($event)\"\n [required]=\"required\"\n [tabindex]=\"tabindex\"\n [appAutofocus]=\"autofocus\">\n <input matInput #matInput autocomplete=\"off\" type=\"text\"\n *ngIf=\"mobile\"\n [formControl]=\"textControl\"\n (click)=\"openDatePickerIfMobile($event, datePicker)\"\n [required]=\"required\"\n [tabindex]=\"tabindex\"\n readonly>\n\n <!-- Hide the final input -->\n <input matInput type=\"text\" [formControl]=\"formControl\"\n hidden\n [matDatepicker]=\"datePicker\"\n [matDatepickerFilter]=\"datePickerFilter\"\n (dateChange)=\"onDatePickerChange($event)\">\n\n <button type=\"button\" mat-icon-button tabindex=\"-1\" matSuffix\n (click)=\"openDatePicker($event, datePicker)\"\n [disabled]=\"formControl.disabled\">\n <mat-icon>{{mobile?'date_range':'keyboard_arrow_down'}}</mat-icon>\n </button>\n\n <mat-datepicker #datePicker\n [touchUi]=\"mobile\"\n [disabled]=\"formControl.disabled\"\n [startAt]=\"startDate\"\n ></mat-datepicker>\n <button matSuffix mat-icon-button tabindex=\"-1\"\n type=\"button\"\n *ngIf=\"clearable\"\n (click)=\"clear()\"\n [hidden]=\"formControl.disabled || !formControl.value\">\n <mat-icon>close</mat-icon>\n </button>\n\n <!-- errors -->\n <mat-error *ngIf=\"formControl.touched && formControl.errors|mapKeys|arrayFirst; let errorKey\" [ngSwitch]=\"errorKey\">\n <span *ngSwitchCase=\"'required'\" translate>ERROR.FIELD_REQUIRED</span>\n <span *ngSwitchCase=\"'validDate'\" translate>ERROR.FIELD_NOT_VALID_DATE</span>\n <span *ngSwitchCase=\"'dateIsAfter'\">{{'ERROR.FIELD_NOT_VALID_DATE_AFTER' | translate: formControl.errors.dateIsAfter }}</span>\n <span *ngSwitchCase=\"'dateIsBefore'\">{{'ERROR.FIELD_NOT_VALID_DATE_BEFORE' | translate: formControl.errors.dateIsBefore }}</span>\n <span *ngSwitchCase=\"'dateRange'\" translate>ERROR.FIELD_NOT_VALID_DATE_RANGE</span>\n <span *ngSwitchCase=\"'dateMaxDuration'\" translate>ERROR.FIELD_NOT_VALID_DATE_MAX_DURATION</span>\n <span *ngSwitchCase=\"'dateMinDuration'\" translate>ERROR.FIELD_NOT_VALID_DATE_MIN_DURATION</span>\n <span *ngSwitchCase=\"'msg'\">{{(formControl.errors.msg?.key || formControl.errors.msg) | translate: formControl.errors.msg?.params}}</span>\n </mat-error>\n <ng-content select=\"mat-error\"></ng-content>\n\n <!-- mat hint -->\n <div class=\"mat-form-field-hint-wrapper\" [class.cdk-visually-hidden]=\"formControl.invalid\">\n <div class=\"mat-form-field-hint-spacer\"></div>\n <ng-content select=\"mat-hint\"></ng-content>\n </div>\n </mat-form-field>\n\n\n\n</ng-template>\n\n<ng-template #iconDesktop>\n <mat-icon>keyboard_arrow_down</mat-icon>\n</ng-template>\n\n<ng-template #iconDate>\n <mat-icon>date_range</mat-icon>\n</ng-template>\n\n<ng-template #matPrefixTemplate>\n <ng-content select=\"[matPrefix]\"></ng-content>\n</ng-template>\n", styles: [":host{display:inline-block;width:100%;position:relative}:host [no-padding]{--ion-grid-column-padding: 0}:host [nowrap]{flex-wrap:nowrap}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}input[readonly]{-webkit-user-select:none;user-select:none}mat-form-field .datetime-md{padding:0!important}mat-form-field ion-datetime{padding:0!important}ion-col.day{min-width:100px}ion-col.day .mat-form-field-subscript-wrapper{overflow:visible;right:-64px;width:calc(100% + 64px)}ion-col.day .mat-form-field-subscript-wrapper .mat-form-field-hint-wrapper{display:flex}ion-col.day .mat-form-field-subscript-wrapper .mat-form-field-hint-wrapper .mat-form-field-hint-spacer{flex:1 0 1em}ion-col.hour{min-width:55px;max-width:65px}ion-col.hour mat-form-field{width:100%}ion-col.hour mat-form-field mat-label,ion-col.hour mat-form-field input[type=text]{text-align:left;min-width:50px}mat-form-field.mat-form-field-disabled ion-col.day{min-width:100px}.hour .mat-form-field-label{max-width:40px}.hour mat-form-field.mat-form-field-should-float .mat-form-field-placeholder{max-width:inherit}mat-error{text-align:right;width:100%}\n"], dependencies: [{ kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i4.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i4.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "component", type: i5.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "directive", type: i3.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: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i3.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i6.MatError, selector: "mat-error", inputs: ["id"] }, { kind: "component", type: i6.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i6.MatLabel, selector: "mat-label" }, { kind: "directive", type: i6.MatPrefix, selector: "[matPrefix]" }, { kind: "directive", type: i6.MatSuffix, selector: "[matSuffix]" }, { kind: "directive", type: i7.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: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i9.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i10.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i10.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "directive", type: i11.MaskedInputDirective, selector: "[textMask]", inputs: ["textMask"], exportAs: ["textMask"] }, { kind: "directive", type: i2.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "directive", type: i12.AutofocusDirective, selector: "[autofocus], input[appAutofocus]", inputs: ["appAutofocus", "autofocusDelay"] }, { kind: "pipe", type: i13.DateFormatPipe, name: "dateFormat" }, { kind: "pipe", type: i14.ArrayFirstPipe, name: "arrayFirst" }, { kind: "pipe", type: i15.MapKeysPipe, name: "mapKeys" }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
346
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.1", ngImport: i0, type: MatDate, decorators: [{
347
+ type: Component,
348
+ args: [{ selector: 'mat-date-field', providers: [
349
+ DEFAULT_VALUE_ACCESSOR,
350
+ ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<!-- readonly -->\n<mat-form-field *ngIf=\"readonly; else writable\"\n [floatLabel]=\"floatLabel\"\n [appearance]=\"appearance\"\n class=\"mat-form-field-disabled\">\n\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n\n <input matInput hidden type=\"text\"\n readonly\n [placeholder]=\"placeholder\"\n [formControl]=\"formControl\">\n <ion-text>{{formControl.value|dateFormat: {pattern: datePattern} }}</ion-text>\n</mat-form-field>\n\n<!-- writable -->\n<ng-template #writable>\n <mat-form-field [floatLabel]=\"floatLabel\"\n [appearance]=\"appearance\">\n\n <mat-label>{{placeholder}}</mat-label>\n\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n\n <input matInput #matInput autocomplete=\"off\" type=\"text\"\n *ngIf=\"!mobile\"\n [formControl]=\"textControl\"\n [textMask]=\"{mask: mask, keepCharPositions: true, placeholderChar: placeholderChar}\"\n [placeholder]=\"'COMMON.DATE_PLACEHOLDER'|translate\"\n (blur)=\"checkIfTouched()\"\n (keyup.arrowDown)=\"openDatePicker($event, datePicker)\"\n (keyup.escape)=\"preventEvent($event)\"\n [required]=\"required\"\n [tabindex]=\"tabindex\"\n [appAutofocus]=\"autofocus\">\n <input matInput #matInput autocomplete=\"off\" type=\"text\"\n *ngIf=\"mobile\"\n [formControl]=\"textControl\"\n (click)=\"openDatePickerIfMobile($event, datePicker)\"\n [required]=\"required\"\n [tabindex]=\"tabindex\"\n readonly>\n\n <!-- Hide the final input -->\n <input matInput type=\"text\" [formControl]=\"formControl\"\n hidden\n [matDatepicker]=\"datePicker\"\n [matDatepickerFilter]=\"datePickerFilter\"\n (dateChange)=\"onDatePickerChange($event)\">\n\n <button type=\"button\" mat-icon-button tabindex=\"-1\" matSuffix\n (click)=\"openDatePicker($event, datePicker)\"\n [disabled]=\"formControl.disabled\">\n <mat-icon>{{mobile?'date_range':'keyboard_arrow_down'}}</mat-icon>\n </button>\n\n <mat-datepicker #datePicker\n [touchUi]=\"mobile\"\n [disabled]=\"formControl.disabled\"\n [startAt]=\"startDate\"\n ></mat-datepicker>\n <button matSuffix mat-icon-button tabindex=\"-1\"\n type=\"button\"\n *ngIf=\"clearable\"\n (click)=\"clear()\"\n [hidden]=\"formControl.disabled || !formControl.value\">\n <mat-icon>close</mat-icon>\n </button>\n\n <!-- errors -->\n <mat-error *ngIf=\"formControl.touched && formControl.errors|mapKeys|arrayFirst; let errorKey\" [ngSwitch]=\"errorKey\">\n <span *ngSwitchCase=\"'required'\" translate>ERROR.FIELD_REQUIRED</span>\n <span *ngSwitchCase=\"'validDate'\" translate>ERROR.FIELD_NOT_VALID_DATE</span>\n <span *ngSwitchCase=\"'dateIsAfter'\">{{'ERROR.FIELD_NOT_VALID_DATE_AFTER' | translate: formControl.errors.dateIsAfter }}</span>\n <span *ngSwitchCase=\"'dateIsBefore'\">{{'ERROR.FIELD_NOT_VALID_DATE_BEFORE' | translate: formControl.errors.dateIsBefore }}</span>\n <span *ngSwitchCase=\"'dateRange'\" translate>ERROR.FIELD_NOT_VALID_DATE_RANGE</span>\n <span *ngSwitchCase=\"'dateMaxDuration'\" translate>ERROR.FIELD_NOT_VALID_DATE_MAX_DURATION</span>\n <span *ngSwitchCase=\"'dateMinDuration'\" translate>ERROR.FIELD_NOT_VALID_DATE_MIN_DURATION</span>\n <span *ngSwitchCase=\"'msg'\">{{(formControl.errors.msg?.key || formControl.errors.msg) | translate: formControl.errors.msg?.params}}</span>\n </mat-error>\n <ng-content select=\"mat-error\"></ng-content>\n\n <!-- mat hint -->\n <div class=\"mat-form-field-hint-wrapper\" [class.cdk-visually-hidden]=\"formControl.invalid\">\n <div class=\"mat-form-field-hint-spacer\"></div>\n <ng-content select=\"mat-hint\"></ng-content>\n </div>\n </mat-form-field>\n\n\n\n</ng-template>\n\n<ng-template #iconDesktop>\n <mat-icon>keyboard_arrow_down</mat-icon>\n</ng-template>\n\n<ng-template #iconDate>\n <mat-icon>date_range</mat-icon>\n</ng-template>\n\n<ng-template #matPrefixTemplate>\n <ng-content select=\"[matPrefix]\"></ng-content>\n</ng-template>\n", styles: [":host{display:inline-block;width:100%;position:relative}:host [no-padding]{--ion-grid-column-padding: 0}:host [nowrap]{flex-wrap:nowrap}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}input[readonly]{-webkit-user-select:none;user-select:none}mat-form-field .datetime-md{padding:0!important}mat-form-field ion-datetime{padding:0!important}ion-col.day{min-width:100px}ion-col.day .mat-form-field-subscript-wrapper{overflow:visible;right:-64px;width:calc(100% + 64px)}ion-col.day .mat-form-field-subscript-wrapper .mat-form-field-hint-wrapper{display:flex}ion-col.day .mat-form-field-subscript-wrapper .mat-form-field-hint-wrapper .mat-form-field-hint-spacer{flex:1 0 1em}ion-col.hour{min-width:55px;max-width:65px}ion-col.hour mat-form-field{width:100%}ion-col.hour mat-form-field mat-label,ion-col.hour mat-form-field input[type=text]{text-align:left;min-width:50px}mat-form-field.mat-form-field-disabled ion-col.day{min-width:100px}.hour .mat-form-field-label{max-width:40px}.hour mat-form-field.mat-form-field-should-float .mat-form-field-placeholder{max-width:inherit}mat-error{text-align:right;width:100%}\n"] }]
351
+ }], ctorParameters: function () { return [{ type: i1.MomentDateAdapter }, { type: i2.TranslateService }, { type: i3.UntypedFormBuilder }, { type: i0.ChangeDetectorRef }, { type: i3.FormGroupDirective, decorators: [{
352
+ type: Optional
353
+ }] }]; }, propDecorators: { mobile: [{
354
+ type: Input
355
+ }], formControl: [{
356
+ type: Input
357
+ }], formControlName: [{
358
+ type: Input
359
+ }], placeholder: [{
360
+ type: Input
361
+ }], floatLabel: [{
362
+ type: Input
363
+ }], appearance: [{
364
+ type: Input
365
+ }], required: [{
366
+ type: Input
367
+ }], compact: [{
368
+ type: Input
369
+ }], placeholderChar: [{
370
+ type: Input
371
+ }], autofocus: [{
372
+ type: Input
373
+ }], startDate: [{
374
+ type: Input
375
+ }], clearable: [{
376
+ type: Input
377
+ }], timezone: [{
378
+ type: Input
379
+ }], datePickerFilter: [{
380
+ type: Input
381
+ }], readonly: [{
382
+ type: Input
383
+ }], tabindex: [{
384
+ type: Input
385
+ }], datePicker: [{
386
+ type: ViewChild,
387
+ args: ['datePicker']
388
+ }], matInputs: [{
389
+ type: ViewChildren,
390
+ args: ['matInput']
391
+ }] } });
392
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0ZXJpYWwuZGF0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvc2hhcmVkL21hdGVyaWFsL2RhdGV0aW1lL21hdGVyaWFsLmRhdGUudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3NoYXJlZC9tYXRlcmlhbC9kYXRldGltZS9tYXRlcmlhbC5kYXRlLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLHVCQUF1QixFQUFxQixTQUFTLEVBQWMsVUFBVSxFQUFFLEtBQUssRUFBcUIsUUFBUSxFQUF1QixTQUFTLEVBQUUsWUFBWSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQzlMLE9BQU8sRUFBMkMsaUJBQWlCLEVBQTBDLFVBQVUsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRS9JLE9BQU8sRUFBQyxRQUFRLEVBQVMsTUFBTSxRQUFRLENBQUM7QUFDeEMsT0FBTyxFQUFDLHdCQUF3QixFQUFFLHNCQUFzQixFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDakYsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFDNUQsT0FBTyxFQUFDLGFBQWEsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLGVBQWUsRUFBRSxlQUFlLEVBQUUsS0FBSyxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDeEcsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3RDLE9BQU8sRUFBZSxXQUFXLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFDdkQsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUdsQyxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUNuRCxPQUFPLEVBQUMsaUJBQWlCLEVBQUUsZUFBZSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQy9ELE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxpQkFBaUIsQ0FB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QVNPLFFBQVE7c0JBQXBCLEtBQUs7Z0JBZW1CLFVBQVU7c0JBQWxDLFNBQVM7dUJBQUMsWUFBWTtnQkFDRyxTQUFTO3NCQUFsQyxZQUFZO3VCQUFDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBmb3J3YXJkUmVmLCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIE9wdGlvbmFsLCBQcm92aWRlciwgUXVlcnlMaXN0LCBWaWV3Q2hpbGQsIFZpZXdDaGlsZHJlbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0NvbnRyb2xWYWx1ZUFjY2Vzc29yLCBGb3JtR3JvdXBEaXJlY3RpdmUsIE5HX1ZBTFVFX0FDQ0VTU09SLCBVbnR5cGVkRm9ybUJ1aWxkZXIsIFVudHlwZWRGb3JtQ29udHJvbCwgVmFsaWRhdG9yc30gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtUcmFuc2xhdGVTZXJ2aWNlfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7aXNNb21lbnQsIE1vbWVudH0gZnJvbSAnbW9tZW50JztcbmltcG9ydCB7REVGQVVMVF9QTEFDRUhPTERFUl9DSEFSLCBLRVlCT0FSRF9ISURFX0RFTEFZX01TfSBmcm9tICcuLi8uLi9jb25zdGFudHMnO1xuaW1wb3J0IHtTaGFyZWRWYWxpZGF0b3JzfSBmcm9tICcuLi8uLi92YWxpZGF0b3IvdmFsaWRhdG9ycyc7XG5pbXBvcnQge2lzQmxhbmtTdHJpbmcsIGlzTmlsLCBpc05vdE5pbCwgaXNOb3ROaWxCb29sZWFuLCBpc05vdE5pbE9yQmxhbmssIHNsZWVwfSBmcm9tICcuLi8uLi9mdW5jdGlvbnMnO1xuaW1wb3J0IHtmaWx0ZXJ9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7SW5wdXRFbGVtZW50LCBzZXRUYWJJbmRleH0gZnJvbSAnLi4vLi4vaW5wdXRzJztcbmltcG9ydCB7U3Vic2NyaXB0aW9ufSBmcm9tICdyeGpzJztcbmltcG9ydCB7RmxvYXRMYWJlbFR5cGUsIE1hdEZvcm1GaWVsZEFwcGVhcmFuY2V9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGQnO1xuaW1wb3J0IHtEYXRlRmlsdGVyRm4sIE1hdERhdGVwaWNrZXIsIE1hdERhdGVwaWNrZXJJbnB1dEV2ZW50fSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kYXRlcGlja2VyJztcbmltcG9ydCB7aXNGb2N1c2FibGVFbGVtZW50fSBmcm9tICcuLi8uLi9mb2N1c2FibGUnO1xuaW1wb3J0IHtmcm9tRGF0ZUlTT1N0cmluZywgdG9EYXRlSVNPU3RyaW5nfSBmcm9tICcuLi8uLi9kYXRlcyc7XG5pbXBvcnQge2lzTW9iaWxlfSBmcm9tICcuLi8uLi9wbGF0Zm9ybXMnO1xuaW1wb3J0IHtNb21lbnREYXRlQWRhcHRlcn0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwtbW9tZW50LWFkYXB0ZXInO1xuaW1wb3J0IHtLZXlib2FyZH0gZnJvbSAnQGNhcGFjaXRvci9rZXlib2FyZCc7XG5pbXBvcnQge0NhcGFjaXRvcn0gZnJvbSAnQGNhcGFjaXRvci9jb3JlJztcblxuY29uc3QgREVGQVVMVF9WQUxVRV9BQ0NFU1NPUjogUHJvdmlkZXIgPSB7XG4gIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBNYXREYXRlKSxcbiAgbXVsdGk6IHRydWVcbn07XG5cbmNvbnN0IFRFWFRfTUFTSyA9IFsvXFxkLywgL1xcZC8sICcvJywgL1xcZC8sIC9cXGQvLCAnLycsIC9cXGQvLCAvXFxkLywgL1xcZC8sIC9cXGQvXTtcblxuY29uc3Qgbm9vcCA9ICgpID0+IHt9O1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdtYXQtZGF0ZS1maWVsZCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9tYXRlcmlhbC5kYXRlLmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9tYXRlcmlhbC5kYXRlLnNjc3MnXSxcbiAgcHJvdmlkZXJzOiBbXG4gICAgREVGQVVMVF9WQUxVRV9BQ0NFU1NPUixcbiAgXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgTWF0RGF0ZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBDb250cm9sVmFsdWVBY2Nlc3NvciwgSW5wdXRFbGVtZW50IHtcbiAgcHJpdmF0ZSBfb25DaGFuZ2VDYWxsYmFjazogKF86IGFueSkgPT4gdm9pZCA9IG5vb3A7XG4gIHByaXZhdGUgX29uVG91Y2hlZENhbGxiYWNrOiAoKSA9PiB2b2lkID0gbm9vcDtcbiAgcHJpdmF0ZSBfc3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuICBwcml2YXRlIF93cml0aW5nID0gdHJ1ZTtcbiAgcHJpdmF0ZSBfZGlzYWJsaW5nID0gZmFsc2U7XG4gIHByaXZhdGUgX3RhYmluZGV4OiBudW1iZXI7XG4gIHByaXZhdGUgX2hhc0tleWJvYXJkUGx1Z2luOiBib29sZWFuO1xuICBwcml2YXRlIF9rZXlib2FyZEhpZGVEZWxheTogbnVtYmVyO1xuXG4gIF9yZWFkb25seSA9IGZhbHNlO1xuICB0ZXh0Q29udHJvbDogVW50eXBlZEZvcm1Db250cm9sO1xuICBkYXRlUGF0dGVybjogc3RyaW5nO1xuICBsb2NhbGU6IHN0cmluZztcbiAgcmVhZG9ubHkgbWFzayA9IFRFWFRfTUFTSztcblxuICBASW5wdXQoKSBtb2JpbGU6IGJvb2xlYW47XG4gIEBJbnB1dCgpIGZvcm1Db250cm9sOiBVbnR5cGVkRm9ybUNvbnRyb2w7XG4gIEBJbnB1dCgpIGZvcm1Db250cm9sTmFtZTogc3RyaW5nO1xuICBASW5wdXQoKSBwbGFjZWhvbGRlcjogc3RyaW5nO1xuICBASW5wdXQoKSBmbG9hdExhYmVsOiBGbG9hdExhYmVsVHlwZSA9ICdhdXRvJztcbiAgQElucHV0KCkgYXBwZWFyYW5jZTogTWF0Rm9ybUZpZWxkQXBwZWFyYW5jZTtcbiAgQElucHV0KCkgcmVxdWlyZWQ6IGJvb2xlYW47XG4gIEBJbnB1dCgpIGNvbXBhY3QgPSBmYWxzZTtcbiAgQElucHV0KCkgcGxhY2Vob2xkZXJDaGFyOiBzdHJpbmcgPSBERUZBVUxUX1BMQUNFSE9MREVSX0NIQVI7XG4gIEBJbnB1dCgpIGF1dG9mb2N1cyA9IGZhbHNlO1xuICBASW5wdXQoKSBzdGFydERhdGU6IE1vbWVudCB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBjbGVhcmFibGUgPSBmYWxzZTtcbiAgQElucHV0KCkgdGltZXpvbmU6IHN0cmluZyA9IG51bGw7XG4gIEBJbnB1dCgpIGRhdGVQaWNrZXJGaWx0ZXI6IERhdGVGaWx0ZXJGbjxNb21lbnQ+O1xuXG4gIEBJbnB1dCgpIHNldCByZWFkb25seSh2YWx1ZTogYm9vbGVhbil7XG4gICAgdGhpcy5fcmVhZG9ubHkgPSB2YWx1ZTtcbiAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgZ2V0IHJlYWRvbmx5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9yZWFkb25seTtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCB0YWJpbmRleCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgaWYgKHRoaXMuX3RhYmluZGV4ICE9PSB2YWx1ZSkge1xuICAgICAgdGhpcy5fdGFiaW5kZXggPSB2YWx1ZTtcbiAgICAgIGlmICghdGhpcy5fd3JpdGluZykgdGhpcy51cGRhdGVUYWJJbmRleCgpO1xuICAgIH1cbiAgfVxuXG4gIGdldCB0YWJpbmRleCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl90YWJpbmRleDtcbiAgfVxuXG4gIGdldCB2YWx1ZSgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmZvcm1Db250cm9sLnZhbHVlO1xuICB9XG5cbiAgQFZpZXdDaGlsZCgnZGF0ZVBpY2tlcicpIGRhdGVQaWNrZXI6IE1hdERhdGVwaWNrZXI8TW9tZW50PjtcbiAgQFZpZXdDaGlsZHJlbignbWF0SW5wdXQnKSBtYXRJbnB1dHM6IFF1ZXJ5TGlzdDxFbGVtZW50UmVmPjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGRhdGVBZGFwdGVyOiBNb21lbnREYXRlQWRhcHRlcixcbiAgICBwcml2YXRlIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICBwcml2YXRlIGZvcm1CdWlsZGVyOiBVbnR5cGVkRm9ybUJ1aWxkZXIsXG4gICAgcHJpdmF0ZSBjZDogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBmb3JtR3JvdXBEaXI6IEZvcm1Hcm91cERpcmVjdGl2ZSxcbiAgKSB7XG4gICAgdGhpcy5sb2NhbGUgPSAodHJhbnNsYXRlLmN1cnJlbnRMYW5nIHx8IHRyYW5zbGF0ZS5kZWZhdWx0TGFuZykuc3Vic3RyaW5nKDAsIDIpO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5mb3JtQ29udHJvbCA9IHRoaXMuZm9ybUNvbnRyb2wgfHwgdGhpcy5mb3JtQ29udHJvbE5hbWUgJiYgdGhpcy5mb3JtR3JvdXBEaXIgJiYgdGhpcy5mb3JtR3JvdXBEaXIuZm9ybS5nZXQodGhpcy5mb3JtQ29udHJvbE5hbWUpIGFzIFVudHlwZWRGb3JtQ29udHJvbDtcbiAgICBpZiAoIXRoaXMuZm9ybUNvbnRyb2wpIHRocm93IG5ldyBFcnJvcignTWlzc2luZyBtYW5kYXRvcnkgYXR0cmlidXRlIFxcJ2Zvcm1Db250cm9sXFwnIG9yIFxcJ2Zvcm1Db250cm9sTmFtZVxcJyBpbiA8bWF0LWRhdGUtZmllbGQ+LicpO1xuXG4gICAgdGhpcy5tb2JpbGUgPSBpc05vdE5pbCh0aGlzLm1vYmlsZSkgPyB0aGlzLm1vYmlsZSA6IGlzTW9iaWxlKHdpbmRvdyk7XG4gICAgLy8gV29ya2Fyb3VuZCBiZWNhdXNlIGlvbi1kYXRldGltZSBoYXMgaXNzdWUgKGRvIG5vdCByZXR1cm5lZCBhIElTTyBkYXRlKVxuICAgIHRoaXMuX2tleWJvYXJkSGlkZURlbGF5ID0gdGhpcy5tb2JpbGUgJiYgS0VZQk9BUkRfSElERV9ERUxBWV9NUyB8fCAwO1xuICAgIHRoaXMuX2hhc0tleWJvYXJkUGx1Z2luID0gdGhpcy5tb2JpbGUgJiYgQ2FwYWNpdG9yLmlzUGx1Z2luQXZhaWxhYmxlKCdLZXlib2FyZCcpO1xuXG4gICAgdGhpcy5yZXF1aXJlZCA9IGlzTm90TmlsQm9vbGVhbih0aGlzLnJlcXVpcmVkKSA/IHRoaXMucmVxdWlyZWQgOiAodGhpcy5mb3JtQ29udHJvbC52YWxpZGF0b3IgPT09IFZhbGlkYXRvcnMucmVxdWlyZWQgfHwgaXNCbGFua1N0cmluZyh0aGlzLnJlcXVpcmVkKSk7XG5cbiAgICAvLyBBZGQgJ3ZhbGlkRGF0ZScgdmFsaWRhdG9yICh3aGVuIGV4aXN0aW5nIHZhbGlkYXRvciBhcmUgbnVsbCBvciByZXF1aXJlZCwgdG8gYmUgc3VyZSB0byBrZWVwIGl0KVxuICAgIGlmICghdGhpcy5mb3JtQ29udHJvbC52YWxpZGF0b3IgfHwgdGhpcy5mb3JtQ29udHJvbC52YWxpZGF0b3IgPT09IFZhbGlkYXRvcnMucmVxdWlyZWQpIHtcbiAgICAgIHRoaXMuZm9ybUNvbnRyb2wuc2V0VmFsaWRhdG9ycyh0aGlzLnJlcXVpcmVkID8gW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFNoYXJlZFZhbGlkYXRvcnMudmFsaWREYXRlXSA6IFNoYXJlZFZhbGlkYXRvcnMudmFsaWREYXRlKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmZvcm1Db250cm9sLnNldFZhbGlkYXRvcnModGhpcy5yZXF1aXJlZCA/IFt0aGlzLmZvcm1Db250cm9sLnZhbGlkYXRvciwgVmFsaWRhdG9ycy5yZXF1aXJlZCwgU2hhcmVkVmFsaWRhdG9ycy52YWxpZERhdGVdIDpcbiAgICAgICAgW3RoaXMuZm9ybUNvbnRyb2wudmFsaWRhdG9yLCBTaGFyZWRWYWxpZGF0b3JzLnZhbGlkRGF0ZV0pO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSB0aGUgdGV4dCBjb250cm9sXG4gICAgdGhpcy50ZXh0Q29udHJvbCA9IHRoaXMuZm9ybUJ1aWxkZXIuY29udHJvbChudWxsLFxuICAgICAgLy8gSW1wb3J0YW50OiBzaG91bGQgY29weSBlcnJvcnMgZnJvbSB0aGUgbW9kZWwgZm9ybUNvbnRyb2xcbiAgICAgICgpID0+IHRoaXMuZm9ybUNvbnRyb2wuZXJyb3JzXG4gICAgKTtcblxuICAgIC8vIEdldCBwYXR0ZXJucyB0byBkaXNwbGF5IGRhdGVcbiAgICB0aGlzLnVwZGF0ZVBhdHRlcm4odGhpcy50cmFuc2xhdGUuaW5zdGFudCgnQ09NTU9OLkRBVEVfUEFUVEVSTicpKTtcbiAgICB0aGlzLl9zdWJzY3JpcHRpb24uYWRkKFxuICAgICAgdGhpcy50cmFuc2xhdGUuZ2V0KCdDT01NT04uREFURV9QQVRURVJOJylcbiAgICAgICAgLnN1YnNjcmliZSgocGF0dGVybikgPT4gdGhpcy51cGRhdGVQYXR0ZXJuKHBhdHRlcm4pKVxuICAgICk7XG5cbiAgICB0aGlzLl9zdWJzY3JpcHRpb24uYWRkKFxuICAgICAgdGhpcy50ZXh0Q29udHJvbC52YWx1ZUNoYW5nZXNcbiAgICAgICAuc3Vic2NyaWJlKCh2YWx1ZSkgPT4gdGhpcy5vbkZvcm1DaGFuZ2UodmFsdWUpKSk7XG5cbiAgICAvLyBMaXN0ZW4gc3RhdHVzIGNoYW5nZXMgKHdoZW4gZG9uZSBvdXRzaWRlIHRoZSBjb21wb25lbnQgIC0gZS5nLiB3aGVuIHNldEVycm9ycygpIGlzIGNhbGxpbmcgb24gdGhlIGZvcm1Db250cm9sKVxuICAgIHRoaXMuX3N1YnNjcmlwdGlvbi5hZGQoXG4gICAgICB0aGlzLmZvcm1Db250cm9sLnN0YXR1c0NoYW5nZXNcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgZmlsdGVyKChfKSA9PiAhdGhpcy5yZWFkb25seSAmJiAhdGhpcy5fd3JpdGluZyAmJiAhdGhpcy5fZGlzYWJsaW5nKSAvLyBTa2lwXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgdGhpcy50ZXh0Q29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHtlbWl0RXZlbnQ6IGZhbHNlfSk7XG4gICAgICAgICAgaWYgKHRoaXMuZm9ybUNvbnRyb2wudG91Y2hlZCAmJiAhdGhpcy50ZXh0Q29udHJvbC50b3VjaGVkKSB7XG4gICAgICAgICAgICB0aGlzLnRleHRDb250cm9sLm1hcmtBc1RvdWNoZWQoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgfSlcbiAgICApO1xuXG4gICAgdGhpcy51cGRhdGVUYWJJbmRleCgpO1xuXG4gICAgdGhpcy5fd3JpdGluZyA9IGZhbHNlO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fd3JpdGluZykgcmV0dXJuOyAvLyBTa2lwXG4gICAgdGhpcy5fd3JpdGluZyA9IHRydWU7XG5cbiAgICAvLyBERUJVR1xuICAgIC8vY29uc29sZS5kZWJ1ZyhcIlttYXQtZGF0ZV0gd3JpdGVWYWx1ZSgpIHdpdGg6XCIsIHZhbHVlKTtcblxuICAgIC8vIENvbnZlcnQgaW50byBkYXRlXG4gICAgLy8gSW1wb3J0YW50OiBkbyBhIGNsb25lKClcbiAgICBsZXQgZGF0ZSA9IGlzTW9tZW50KHZhbHVlKSA/IHZhbHVlLmNsb25lKCkgOiBmcm9tRGF0ZUlTT1N0cmluZyh2YWx1ZSk7XG5cbiAgICBpZiAoIWRhdGUgfHwgIWRhdGUuaXNWYWxpZCgpKSB7XG4gICAgICB0aGlzLnRleHRDb250cm9sLnBhdGNoVmFsdWUobnVsbCwge2VtaXRFdmVudDogZmFsc2V9KTtcbiAgICAgIGlmICh0aGlzLmZvcm1Db250cm9sLnZhbHVlKSB7XG4gICAgICAgIHRoaXMuZm9ybUNvbnRyb2wucGF0Y2hWYWx1ZShudWxsLCB7ZW1pdEV2ZW50OiBmYWxzZX0pO1xuICAgICAgICB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKG51bGwpO1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIC8vIE1vdmUgdG8gdGhlIGV4cGVjdGVkIFRaIChrZWVwaW5nIGxvY2FsIGhvdXIgLSBlLmcuIG1pZG5pZ2h0KVxuICAgICAgZGF0ZSA9ICh0aGlzLnRpbWV6b25lICYmIGRhdGUudHoodGhpcy50aW1lem9uZSkgfHwgZGF0ZSlcbiAgICAgICAgLy8gUmVzZXQgaG91clxuICAgICAgICAuc3RhcnRPZignZGF5Jyk7XG5cbiAgICAgIGNvbnN0IGRheVN0ciA9IHRoaXMuZGF0ZUFkYXB0ZXIuZm9ybWF0KGRhdGUsIHRoaXMuZGF0ZVBhdHRlcm4pO1xuXG4gICAgICBpZiAodGhpcy50ZXh0Q29udHJvbC52YWx1ZSAhPT0gZGF5U3RyKSB7XG4gICAgICAgIC8vIFVwZGF0ZSBkYXkgY29udHJvbFxuICAgICAgICB0aGlzLnRleHRDb250cm9sLnBhdGNoVmFsdWUoZGF5U3RyLCB7ZW1pdEV2ZW50OiBmYWxzZX0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX3dyaXRpbmcgPSBmYWxzZTtcbiAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XG4gICAgdGhpcy5fb25DaGFuZ2VDYWxsYmFjayA9IGZuO1xuICB9XG5cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMuX29uVG91Y2hlZENhbGxiYWNrID0gZm47XG4gIH1cblxuICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fZGlzYWJsaW5nKSByZXR1cm47XG5cbiAgICB0aGlzLl9kaXNhYmxpbmcgPSB0cnVlO1xuICAgIGlmIChpc0Rpc2FibGVkKSB7XG4gICAgICB0aGlzLnRleHRDb250cm9sLmRpc2FibGUoe2VtaXRFdmVudDogZmFsc2V9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50ZXh0Q29udHJvbC5lbmFibGUoe2VtaXRFdmVudDogZmFsc2V9KTtcbiAgICB9XG4gICAgdGhpcy5fZGlzYWJsaW5nID0gZmFsc2U7XG5cbiAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgb25EYXRlUGlja2VyQ2hhbmdlKGV2ZW50OiBNYXREYXRlcGlja2VySW5wdXRFdmVudDxNb21lbnQ+KTogdm9pZCB7XG4gICAgLy8gTWFrZSBzdXJlIGV2ZW50IGlzIHZhbGlkXG4gICAgaWYgKCFldmVudCB8fCAoZXZlbnQudmFsdWUgIT09IG51bGwgJiYgIWlzTW9tZW50KGV2ZW50LnZhbHVlKSkpIHtcbiAgICAgIGNvbnNvbGUud2FybignSW52YWxpZCBNYXREYXRlcGlja2VyIGV2ZW50LiBTa2lwcGluZycsIGV2ZW50KTtcbiAgICAgIHJldHVybjsgLy8gU2tpcFxuICAgIH1cblxuICAgIGxldCBkYXRlU3RyID0gbnVsbDtcbiAgICBpZiAoZXZlbnQudmFsdWUpIHtcbiAgICAgIGxldCBkYXRlID0gZXZlbnQudmFsdWVcbiAgICAgICAgLmxvY2FsZSh0aGlzLmxvY2FsZSkgLy8gc2V0IGFzIHRpbWUgYXMgbG9jYWxlIHRpbWVcbiAgICAgICAgLm1pbnV0ZSgwKS5zZWNvbmRzKDApLm1pbGxpc2Vjb25kKDApIC8vIFJlc2V0IGhvdXJcbiAgICAgICAgLnV0Yyh0cnVlKTtcblxuICAgICAgZGF0ZVN0ciA9IHRoaXMuZGF0ZUFkYXB0ZXIuZm9ybWF0KGRhdGUsIHRoaXMuZGF0ZVBhdHRlcm4pIHx8wqBudWxsO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnRleHRDb250cm9sLnZhbHVlICE9PSBkYXRlU3RyKSB7XG4gICAgICAvLyBERUJVR1xuICAgICAgLy9jb25zb2xlLmRlYnVnKFwiW21hdC1kYXRlXSBvbkRhdGVQaWNrZXJDaGFuZ2UoKSBuZXcgdmFsdWU6XCIsIGRhdGVTdHIpO1xuXG4gICAgICB0aGlzLnRleHRDb250cm9sLnNldFZhbHVlKGRhdGVTdHIsIHtcbiAgICAgICAgZW1pdEV2ZW50OiB0cnVlIC8vIFdpbGwgY2FsbCBvbkZvcm1DaGFuZ2VcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIG9wZW5EYXRlUGlja2VySWZNb2JpbGUoZXZlbnQ6IEV2ZW50LCBkYXRlUGlja2VyPzogTWF0RGF0ZXBpY2tlcjxhbnk+KSB7XG4gICAgaWYgKCF0aGlzLm1vYmlsZSB8fCBldmVudC5kZWZhdWx0UHJldmVudGVkKSByZXR1cm47XG5cbiAgICB0aGlzLnByZXZlbnRFdmVudChldmVudCk7XG5cbiAgICAvLyBNYWtlIHN1cmUgdGhlIGtleWJvYXJkIGlzIGNsb3NlZFxuICAgIGF3YWl0IHRoaXMud2FpdEtleWJvYXJkSGlkZShmYWxzZSk7XG5cbiAgICAvLyBPcGVuIHRoZSBwaWNrZXJcbiAgICB0aGlzLm9wZW5EYXRlUGlja2VyKG51bGwsIGRhdGVQaWNrZXIpO1xuICB9XG5cbiAgcHVibGljIG9wZW5EYXRlUGlja2VyKGV2ZW50PzogRXZlbnQsIGRhdGVQaWNrZXI/OiBNYXREYXRlcGlja2VyPGFueT4pIHtcbiAgICBkYXRlUGlja2VyID0gZGF0ZVBpY2tlciB8fCB0aGlzLmRhdGVQaWNrZXI7XG4gICAgaWYgKGRhdGVQaWNrZXIpIHtcblxuICAgICAgaWYgKGV2ZW50KSB0aGlzLnByZXZlbnRFdmVudChldmVudCk7XG5cbiAgICAgIGlmICghZGF0ZVBpY2tlci5vcGVuZWQpIHtcbiAgICAgICAgZGF0ZVBpY2tlci5vcGVuKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJldmVudEV2ZW50KGV2ZW50OiBFdmVudCkge1xuICAgIGlmICghZXZlbnQpIHJldHVybjtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGlmIChldmVudC5zdG9wUHJvcGFnYXRpb24pIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGV2ZW50LnJldHVyblZhbHVlID0gZmFsc2U7XG4gIH1cblxuICBmb2N1cygpIHtcbiAgICBpZiAoIXRoaXMubWF0SW5wdXRzLmxlbmd0aCkgcmV0dXJuO1xuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBjb25zdCBlbGVtZW50UmVmID0gdGhpcy5tYXRJbnB1dHNbMF07IC8vIGdldCB0aGUgZmlyc3QgZWxlbWVudFxuICAgICAgaWYgKGlzRm9jdXNhYmxlRWxlbWVudChlbGVtZW50UmVmKSkge1xuICAgICAgICBlbGVtZW50UmVmLmZvY3VzKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBjbGVhcigpIHtcbiAgICB0aGlzLnRleHRDb250cm9sLnBhdGNoVmFsdWUobnVsbCwge2VtaXRFdmVudDogZmFsc2V9KTtcbiAgICB0aGlzLmZvcm1Db250cm9sLnNldFZhbHVlKG51bGwsIHtlbWl0RXZlbnQ6IGZhbHNlfSk7XG4gICAgdGhpcy5fb25DaGFuZ2VDYWxsYmFjayhudWxsKTtcbiAgICB0aGlzLm1hcmtBc1RvdWNoZWQoKTtcbiAgICB0aGlzLm1hcmtBc0RpcnR5KCk7XG4gIH1cblxuICAvKiAtLSBwcml2YXRlIG1ldGhvZCAtLSAqL1xuXG4gIHByaXZhdGUgdXBkYXRlUGF0dGVybihwYXR0ZXJuOiBzdHJpbmcpIHtcbiAgICBwYXR0ZXJuID0gcGF0dGVybiAhPT0gJ0NPTU1PTi5EQVRFX1BBVFRFUk4nID8gcGF0dGVybiA6ICdMJztcbiAgICBpZiAodGhpcy5kYXRlUGF0dGVybiAhPT0gcGF0dGVybikge1xuICAgICAgdGhpcy5kYXRlUGF0dGVybiA9IHBhdHRlcm47XG4gICAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIGNoZWNrSWZUb3VjaGVkKG9wdHM/OiB7ZW1pdEV2ZW50PzogYm9vbGVhbn0pIHtcbiAgICBpZiAodGhpcy50ZXh0Q29udHJvbC50b3VjaGVkKSB7XG4gICAgICB0aGlzLl9vblRvdWNoZWRDYWxsYmFjaygpO1xuXG4gICAgICBpZiAoIW9wdHMgfHwgb3B0cy5lbWl0RXZlbnQgIT09IGZhbHNlKSB7XG4gICAgICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBvbkZvcm1DaGFuZ2UodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0aGlzLl93cml0aW5nKSByZXR1cm47IC8vIFNraXAgaWYgY2FsbCBieSBzZWxmXG4gICAgdGhpcy5fd3JpdGluZyA9IHRydWU7XG5cbiAgICAvLyBERUJVR1xuICAgIC8vY29uc29sZS5kZWJ1ZyhgW21hdC1kYXRlLXRpbWVdIG9uRm9ybUNoYW5nZSgpIGZyb20gZXZlbnQ6ICR7ZXZlbnR9IC0gY29udHJvbHMgdmFsdWVzOiBgLCBbZGF5U3RyLCB0aW1lXSk7XG5cbiAgICAvKmlmICh0aGlzLmRheUNvbnRyb2wuaW52YWxpZCkge1xuICAgICAgdGhpcy5mb3JtQ29udHJvbC5tYXJrQXNQZW5kaW5nKHtvbmx5U2VsZjogdHJ1ZX0pO1xuICAgICAgdGhpcy5mb3JtQ29udHJvbC5zZXRFcnJvcnMoe1xuICAgICAgICAuLi50aGlzLmZvcm1Db250cm9sLmVycm9ycyxcbiAgICAgICAgLi4udGhpcy5kYXlDb250cm9sLmVycm9yc1xuICAgICAgfSk7XG4gICAgICB0aGlzLmZvcm1Db250cm9sLm1hcmtBc0RpcnR5KCk7XG4gICAgICB0aGlzLl93cml0aW5nID0gZmFsc2U7XG4gICAgICByZXR1cm47XG4gICAgfSovXG5cbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIC8vIE1ha2UgdG8gcmVtb3ZlIHBsYWNlaG9sZGVyIGNoYXJzXG4gICAgICB3aGlsZSAodmFsdWUuaW5kZXhPZih0aGlzLnBsYWNlaG9sZGVyQ2hhcikgIT09IC0xKSB7XG4gICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSh0aGlzLnBsYWNlaG9sZGVyQ2hhciwgJycpO1xuICAgICAgfVxuXG4gICAgICAvLyBGb3JjZSAnMCcgZm9yIGVtcHR5IG1vbnRoIChvdGhlcndpc2UgbW9tZW50IHdpbGwgdXNlIHRoZSBjdXJyZW50IG1vbnRoKVxuICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKCcvLycsICcvMC8nKVxuICAgICAgICAvLyBGb3JjZSAnMCcgZm9yIGVtcHR5IHllYXIgKG90aGVyd2lzZSBtb21lbnQgd2lsbCB1c2UgdGhlIGN1cnJlbnQgeWVhcilcbiAgICAgICAgLnJlcGxhY2UoL1xcLyQvLCAnLzAnKTtcbiAgICB9XG5cbiAgICAvLyBQYXJzZSBkYXRlIChzdHJpY3QgPSBmYWxzZSlcbiAgICBsZXQgZGF0ZTogTW9tZW50ID0gaXNOb3ROaWxPckJsYW5rKHZhbHVlKSAmJiB0aGlzLmRhdGVBZGFwdGVyLnBhcnNlKHZhbHVlLCB0aGlzLmRhdGVQYXR0ZXJuKSB8fCBudWxsO1xuXG4gICAgLy8gTW92ZSB0byB0aGUgZXhwZWN0ZWQgVFosIGFuZCBrZWVwIHRoZSBsb2NhbCBob3VyICg9IG1pZG5pZ2h0KSB0byBoYXZlIG1pZG5pZ2h0IGF0IGxvY2FsIHRpbWVcbiAgICBkYXRlID0gZGF0ZSAmJiAodGhpcy50aW1lem9uZSA/IGRhdGUudHoodGhpcy50aW1lem9uZSwgdHJ1ZSkgOiBkYXRlKSB8fCBudWxsO1xuXG4gICAgZGF0ZSA9IGRhdGUgJiYgZGF0ZVxuICAgICAgLnN0YXJ0T2YoJ2RheScpIC8vIFJlc2V0IGhvdXJcbiAgICAgIC51dGMoKSAvLyBDb252ZXJ0IHRvIFVUQyAoYXZvaWQgVFogb2Zmc2V0IGluIGZpbmFsIHN0cmluZylcbiAgICAgIHx8IG51bGw7XG5cbiAgICAvLyBDb252ZXJ0IHRvIG1vZGVsIHZhbHVlIChJU08gZGF0ZSBzdHJpbmcpXG4gICAgLy8gSU1QT1JUQU5UOiBJZiBkYXRlIGlzIGludmFsaWQsIHRoZW4ga2VlcCB0aGUgaW52YWxpZCBzdHJpbmcgdmFsdWVcbiAgICAvLyB0byBhbGxvdyBTaGFyZWRWYWxpZGF0b3JzLnZhbGlkRGF0ZSgpIHRvIHJhaXNlIGFuIGVycm9yXG4gICAgY29uc3QgZm9ybUNvbnRyb2xWYWx1ZSA9IGRhdGUgJiYgZGF0ZS5pc1ZhbGlkKCkgPyB0b0RhdGVJU09TdHJpbmcoZGF0ZSkgOiAodmFsdWUgfHwgbnVsbCk7XG5cbiAgICBpZiAodGhpcy5mb3JtQ29udHJvbC52YWx1ZSAhPT0gZm9ybUNvbnRyb2xWYWx1ZSkge1xuXG4gICAgICAvLyBERUJVR1xuICAgICAgLy9jb25zb2xlLmRlYnVnKCdbbWF0LWRhdGVdIEVtaXQgbmV3IHZhbHVlOiAnICsgZGF0ZVN0cik7XG5cbiAgICAgIC8vIEFwcGx5IHRvIGZvcm0gY29udHJvbC4gPT4gV2lsbCBjYWxsIHdyaXRlVmFsdWUoKVxuICAgICAgLy8gTk9UIE5FRUQsIGJlY2F1c2UgYSBmb3JtQ29udHJvbCBzaG91bGQgTk9UIGJlIHVzZWQgYnkgbXVsdGlwbGUgZmllbGRzXG4gICAgICAvL3RoaXMuZm9ybUNvbnRyb2wuc2V0VmFsdWUoZGF0ZVN0ciwge2VtaXRFdmVudDogZmFsc2V9KVxuXG4gICAgICAvLyBDaGFuZ2VzIGNvbWVzIGZyb20gaW5zaWRlIGZ1bmN0aW9uOiB1c2UgdGhlIGNhbGxiYWNrXG4gICAgICB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKGZvcm1Db250cm9sVmFsdWUpO1xuXG4gICAgICAvLyBDaGVjayBpZiBuZWVkIHRvIHVwZGF0ZSBjb250cm9sc1xuICAgICAgdGhpcy5jaGVja0lmVG91Y2hlZCgpO1xuICAgIH1cblxuICAgIC8vIEZvcmNlIHRoZSBkYXkgY29udHJvbCB0byB1cGRhdGUgaXRzIHZhbGlkaXR5IChzYW1lIGVycm9ycyBhcyBmb3JtQ29udHJvbCAtIHNlZSBuZ09uSW5pdCgpKVxuICAgIHRoaXMudGV4dENvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuXG4gICAgdGhpcy5fd3JpdGluZyA9IGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB3YWl0S2V5Ym9hcmRIaWRlKHdhaXRLZXlib2FyZERlbGF5OiBib29sZWFuKSB7XG4gICAgaWYgKCF0aGlzLl9oYXNLZXlib2FyZFBsdWdpbikgcmV0dXJuO1xuXG4gICAgLy8gRm9yY2Uga2V5Ym9hcmQgdG8gYmUgaGlkZVxuICAgIGF3YWl0IEtleWJvYXJkLmhpZGUoKTtcblxuICAgIC8vIFdhaXQgYW4gYWRkaXRpb25hbCBkZWxheSBpZiBuZWVkIChkZXBlbmRpbmcgb24gdGhlIE9TKVxuICAgIGlmICh0aGlzLl9rZXlib2FyZEhpZGVEZWxheSA+IDAgJiYgd2FpdEtleWJvYXJkRGVsYXkpIHtcbiAgICAgIGF3YWl0IHNsZWVwKHRoaXMuX2tleWJvYXJkSGlkZURlbGF5KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVRhYkluZGV4KCkge1xuICAgIGlmIChpc05pbCh0aGlzLl90YWJpbmRleCkgfHwgdGhpcy5fdGFiaW5kZXggPT09IC0xKSByZXR1cm47IC8vIHNraXBcblxuICAgIC8vIEZvY3VzIHRvIGZpcnN0IGlucHV0XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLm1hdElucHV0cy5mb3JFYWNoKChlbGVtZW50UmVmLCBpbmRleCkgPT4ge1xuICAgICAgICBzZXRUYWJJbmRleChlbGVtZW50UmVmLCB0aGlzLl90YWJpbmRleCArIGluZGV4KTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgbWFya0FzVG91Y2hlZChvcHRzPzoge29ubHlTZWxmPzogYm9vbGVhbn0pIHtcbiAgICB0aGlzLnRleHRDb250cm9sLm1hcmtBc1RvdWNoZWQob3B0cyk7XG4gICAgdGhpcy5fb25Ub3VjaGVkQ2FsbGJhY2soKTtcbiAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBtYXJrQXNEaXJ0eShvcHRzPzogYW55KSB7XG4gICAgdGhpcy5mb3JtQ29udHJvbC5tYXJrQXNEaXJ0eShvcHRzKTtcbiAgfVxuXG4gIHByaXZhdGUgbWFya0ZvckNoZWNrKCkge1xuICAgIHRoaXMuY2QubWFya0ZvckNoZWNrKCk7XG4gIH1cbn1cblxuIiwiPCEtLSByZWFkb25seSAtLT5cbjxtYXQtZm9ybS1maWVsZCAqbmdJZj1cInJlYWRvbmx5OyBlbHNlIHdyaXRhYmxlXCJcbiAgICAgICAgICAgICAgICBbZmxvYXRMYWJlbF09XCJmbG9hdExhYmVsXCJcbiAgICAgICAgICAgICAgICBbYXBwZWFyYW5jZV09XCJhcHBlYXJhbmNlXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cIm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkXCI+XG5cbiAgPGRpdiBtYXRQcmVmaXg+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm1hdFByZWZpeFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxuXG4gIDxpbnB1dCBtYXRJbnB1dCBoaWRkZW4gdHlwZT1cInRleHRcIlxuICAgICAgICAgcmVhZG9ubHlcbiAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlclwiXG4gICAgICAgICBbZm9ybUNvbnRyb2xdPVwiZm9ybUNvbnRyb2xcIj5cbiAgPGlvbi10ZXh0Pnt7Zm9ybUNvbnRyb2wudmFsdWV8ZGF0ZUZvcm1hdDoge3BhdHRlcm46IGRhdGVQYXR0ZXJufSB9fTwvaW9uLXRleHQ+XG48L21hdC1mb3JtLWZpZWxkPlxuXG48IS0tIHdyaXRhYmxlIC0tPlxuPG5nLXRlbXBsYXRlICN3cml0YWJsZT5cbiAgPG1hdC1mb3JtLWZpZWxkIFtmbG9hdExhYmVsXT1cImZsb2F0TGFiZWxcIlxuICAgICAgICAgICAgICAgICAgW2FwcGVhcmFuY2VdPVwiYXBwZWFyYW5jZVwiPlxuXG4gICAgPG1hdC1sYWJlbD57e3BsYWNlaG9sZGVyfX08L21hdC1sYWJlbD5cblxuICAgIDxkaXYgbWF0UHJlZml4PlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm1hdFByZWZpeFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG5cbiAgICA8aW5wdXQgbWF0SW5wdXQgI21hdElucHV0IGF1dG9jb21wbGV0ZT1cIm9mZlwiIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgKm5nSWY9XCIhbW9iaWxlXCJcbiAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cInRleHRDb250cm9sXCJcbiAgICAgICAgICAgW3RleHRNYXNrXT1cInttYXNrOiBtYXNrLCBrZWVwQ2hhclBvc2l0aW9uczogdHJ1ZSwgcGxhY2Vob2xkZXJDaGFyOiBwbGFjZWhvbGRlckNoYXJ9XCJcbiAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidDT01NT04uREFURV9QTEFDRUhPTERFUid8dHJhbnNsYXRlXCJcbiAgICAgICAgICAgKGJsdXIpPVwiY2hlY2tJZlRvdWNoZWQoKVwiXG4gICAgICAgICAgIChrZXl1cC5hcnJvd0Rvd24pPVwib3BlbkRhdGVQaWNrZXIoJGV2ZW50LCBkYXRlUGlja2VyKVwiXG4gICAgICAgICAgIChrZXl1cC5lc2NhcGUpPVwicHJldmVudEV2ZW50KCRldmVudClcIlxuICAgICAgICAgICBbcmVxdWlyZWRdPVwicmVxdWlyZWRcIlxuICAgICAgICAgICBbdGFiaW5kZXhdPVwidGFiaW5kZXhcIlxuICAgICAgICAgICBbYXBwQXV0b2ZvY3VzXT1cImF1dG9mb2N1c1wiPlxuICAgIDxpbnB1dCBtYXRJbnB1dCAjbWF0SW5wdXQgYXV0b2NvbXBsZXRlPVwib2ZmXCIgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAqbmdJZj1cIm1vYmlsZVwiXG4gICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJ0ZXh0Q29udHJvbFwiXG4gICAgICAgICAgIChjbGljayk9XCJvcGVuRGF0ZVBpY2tlcklmTW9iaWxlKCRldmVudCwgZGF0ZVBpY2tlcilcIlxuICAgICAgICAgICBbcmVxdWlyZWRdPVwicmVxdWlyZWRcIlxuICAgICAgICAgICBbdGFiaW5kZXhdPVwidGFiaW5kZXhcIlxuICAgICAgICAgICByZWFkb25seT5cblxuICAgIDwhLS0gSGlkZSB0aGUgZmluYWwgaW5wdXQgLS0+XG4gICAgPGlucHV0IG1hdElucHV0IHR5cGU9XCJ0ZXh0XCIgW2Zvcm1Db250cm9sXT1cImZvcm1Db250cm9sXCJcbiAgICAgICAgICAgaGlkZGVuXG4gICAgICAgICAgIFttYXREYXRlcGlja2VyXT1cImRhdGVQaWNrZXJcIlxuICAgICAgICAgICBbbWF0RGF0ZXBpY2tlckZpbHRlcl09XCJkYXRlUGlja2VyRmlsdGVyXCJcbiAgICAgICAgICAgKGRhdGVDaGFuZ2UpPVwib25EYXRlUGlja2VyQ2hhbmdlKCRldmVudClcIj5cblxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIG1hdC1pY29uLWJ1dHRvbiB0YWJpbmRleD1cIi0xXCIgbWF0U3VmZml4XG4gICAgICAgICAgICAoY2xpY2spPVwib3BlbkRhdGVQaWNrZXIoJGV2ZW50LCBkYXRlUGlja2VyKVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiZm9ybUNvbnRyb2wuZGlzYWJsZWRcIj5cbiAgICAgIDxtYXQtaWNvbj57e21vYmlsZT8nZGF0ZV9yYW5nZSc6J2tleWJvYXJkX2Fycm93X2Rvd24nfX08L21hdC1pY29uPlxuICAgIDwvYnV0dG9uPlxuXG4gICAgPG1hdC1kYXRlcGlja2VyICNkYXRlUGlja2VyXG4gICAgICAgICAgICAgICAgICAgIFt0b3VjaFVpXT1cIm1vYmlsZVwiXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJmb3JtQ29udHJvbC5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgIFtzdGFydEF0XT1cInN0YXJ0RGF0ZVwiXG4gICAgPjwvbWF0LWRhdGVwaWNrZXI+XG4gICAgPGJ1dHRvbiBtYXRTdWZmaXggbWF0LWljb24tYnV0dG9uIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAqbmdJZj1cImNsZWFyYWJsZVwiXG4gICAgICAgICAgICAoY2xpY2spPVwiY2xlYXIoKVwiXG4gICAgICAgICAgICBbaGlkZGVuXT1cImZvcm1Db250cm9sLmRpc2FibGVkIHx8ICFmb3JtQ29udHJvbC52YWx1ZVwiPlxuICAgICAgPG1hdC1pY29uPmNsb3NlPC9tYXQtaWNvbj5cbiAgICA8L2J1dHRvbj5cblxuICAgIDwhLS0gZXJyb3JzIC0tPlxuICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJmb3JtQ29udHJvbC50b3VjaGVkICYmIGZvcm1Db250cm9sLmVycm9yc3xtYXBLZXlzfGFycmF5Rmlyc3Q7IGxldCBlcnJvcktleVwiIFtuZ1N3aXRjaF09XCJlcnJvcktleVwiPlxuICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIidyZXF1aXJlZCdcIiB0cmFuc2xhdGU+RVJST1IuRklFTERfUkVRVUlSRUQ8L3NwYW4+XG4gICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ3ZhbGlkRGF0ZSdcIiB0cmFuc2xhdGU+RVJST1IuRklFTERfTk9UX1ZBTElEX0RBVEU8L3NwYW4+XG4gICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ2RhdGVJc0FmdGVyJ1wiPnt7J0VSUk9SLkZJRUxEX05PVF9WQUxJRF9EQVRFX0FGVEVSJyB8IHRyYW5zbGF0ZTogZm9ybUNvbnRyb2wuZXJyb3JzLmRhdGVJc0FmdGVyIH19PC9zcGFuPlxuICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIidkYXRlSXNCZWZvcmUnXCI+e3snRVJST1IuRklFTERfTk9UX1ZBTElEX0RBVEVfQkVGT1JFJyB8IHRyYW5zbGF0ZTogZm9ybUNvbnRyb2wuZXJyb3JzLmRhdGVJc0JlZm9yZSB9fTwvc3Bhbj5cbiAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCInZGF0ZVJhbmdlJ1wiIHRyYW5zbGF0ZT5FUlJPUi5GSUVMRF9OT1RfVkFMSURfREFURV9SQU5HRTwvc3Bhbj5cbiAgICAgIDxzcGFuICpuZ1N3aXRjaENhc2U9XCInZGF0ZU1heER1cmF0aW9uJ1wiIHRyYW5zbGF0ZT5FUlJPUi5GSUVMRF9OT1RfVkFMSURfREFURV9NQVhfRFVSQVRJT048L3NwYW4+XG4gICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ2RhdGVNaW5EdXJhdGlvbidcIiB0cmFuc2xhdGU+RVJST1IuRklFTERfTk9UX1ZBTElEX0RBVEVfTUlOX0RVUkFUSU9OPC9zcGFuPlxuICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIidtc2cnXCI+e3soZm9ybUNvbnRyb2wuZXJyb3JzLm1zZz8ua2V5IHx8IGZvcm1Db250cm9sLmVycm9ycy5tc2cpIHwgdHJhbnNsYXRlOiBmb3JtQ29udHJvbC5lcnJvcnMubXNnPy5wYXJhbXN9fTwvc3Bhbj5cbiAgICA8L21hdC1lcnJvcj5cbiAgICA8bmctY29udGVudCBzZWxlY3Q9XCJtYXQtZXJyb3JcIj48L25nLWNvbnRlbnQ+XG5cbiAgICA8IS0tIG1hdCBoaW50IC0tPlxuICAgIDxkaXYgY2xhc3M9XCJtYXQtZm9ybS1maWVsZC1oaW50LXdyYXBwZXJcIiBbY2xhc3MuY2RrLXZpc3VhbGx5LWhpZGRlbl09XCJmb3JtQ29udHJvbC5pbnZhbGlkXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibWF0LWZvcm0tZmllbGQtaGludC1zcGFjZXJcIj48L2Rpdj5cbiAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIm1hdC1oaW50XCI+PC9uZy1jb250ZW50PlxuICAgIDwvZGl2PlxuICA8L21hdC1mb3JtLWZpZWxkPlxuXG5cblxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNpY29uRGVza3RvcD5cbiAgPG1hdC1pY29uPmtleWJvYXJkX2Fycm93X2Rvd248L21hdC1pY29uPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNpY29uRGF0ZT5cbiAgPG1hdC1pY29uPmRhdGVfcmFuZ2U8L21hdC1pY29uPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNtYXRQcmVmaXhUZW1wbGF0ZT5cbiAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW21hdFByZWZpeF1cIj48L25nLWNvbnRlbnQ+XG48L25nLXRlbXBsYXRlPlxuIl19