@sumaris-net/ngx-components 4.0.0-rc9 → 18.0.0

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 (555) hide show
  1. package/README.md +5 -3
  2. package/doc/changelog.md +522 -280
  3. package/esm2022/public_api.mjs +38 -19
  4. package/esm2022/src/app/admin/admin-routing.module.mjs +10 -17
  5. package/esm2022/src/app/admin/admin.module.mjs +7 -9
  6. package/esm2022/src/app/admin/services/filter/person.filter.mjs +3 -3
  7. package/esm2022/src/app/admin/services/person.service.mjs +31 -31
  8. package/esm2022/src/app/admin/services/validator/person.validator.mjs +10 -10
  9. package/esm2022/src/app/admin/users/users.mjs +22 -19
  10. package/esm2022/src/app/admin/users/users.module.mjs +8 -10
  11. package/esm2022/src/app/core/about/about.modal.mjs +7 -7
  12. package/esm2022/src/app/core/about/about.module.mjs +8 -21
  13. package/esm2022/src/app/core/account/account.module.mjs +28 -18
  14. package/esm2022/src/app/core/account/account.page.mjs +19 -5
  15. package/esm2022/src/app/core/account/new-token.form.mjs +106 -0
  16. package/esm2022/src/app/core/account/new-token.modal.mjs +27 -86
  17. package/esm2022/src/app/core/account/password/change-password.form.mjs +60 -0
  18. package/esm2022/src/app/core/account/password/change-password.module.mjs +22 -0
  19. package/esm2022/src/app/core/account/password/change-password.page.mjs +144 -0
  20. package/esm2022/src/app/core/account/token.table.mjs +47 -35
  21. package/esm2022/src/app/core/auth/auth.form.mjs +47 -28
  22. package/esm2022/src/app/core/auth/auth.modal.mjs +6 -6
  23. package/esm2022/src/app/core/auth/auth.module.mjs +22 -13
  24. package/esm2022/src/app/core/auth/reset-password.modal.mjs +77 -0
  25. package/esm2022/src/app/core/core.module.mjs +28 -61
  26. package/esm2022/src/app/core/core.testing.module.mjs +34 -20
  27. package/esm2022/src/app/core/form/array/form-array.mjs +325 -0
  28. package/esm2022/src/app/core/form/array/testing/form-array-test.module.mjs +23 -0
  29. package/esm2022/src/app/core/form/array/testing/form-array.test.mjs +94 -0
  30. package/esm2022/src/app/core/form/buttons/form-buttons-bar.component.mjs +24 -25
  31. package/esm2022/src/app/core/form/buttons/form-buttons-bar.module.mjs +9 -13
  32. package/esm2022/src/app/core/form/entity/editor.class.mjs +64 -517
  33. package/esm2022/src/app/core/form/entity/entity-editor-modal.class.mjs +26 -42
  34. package/esm2022/src/app/core/form/entity/entity-editor.class.mjs +42 -41
  35. package/esm2022/src/app/core/form/entity/entity-metadata.component.mjs +5 -5
  36. package/esm2022/src/app/core/form/entity/entity.module.mjs +8 -14
  37. package/esm2022/src/app/core/form/entity/tab-editor.class.mjs +194 -0
  38. package/esm2022/src/app/core/form/form-container.class.mjs +327 -0
  39. package/esm2022/src/app/core/form/form.class.mjs +39 -56
  40. package/esm2022/src/app/core/form/form.module.mjs +14 -10
  41. package/esm2022/src/app/core/form/form.utils.mjs +23 -306
  42. package/esm2022/src/app/core/form/list/list.form.mjs +16 -14
  43. package/esm2022/src/app/core/form/list/list.module.mjs +8 -12
  44. package/esm2022/src/app/core/form/properties/properties.form.mjs +139 -57
  45. package/esm2022/src/app/core/form/properties/properties.module.mjs +9 -15
  46. package/esm2022/src/app/core/form/properties/properties.table.mjs +27 -28
  47. package/esm2022/src/app/core/form/properties/properties.utils.mjs +60 -0
  48. package/esm2022/src/app/core/form/properties/property.validator.mjs +23 -9
  49. package/esm2022/src/app/core/form/properties/testing/properties-form.test.mjs +18 -18
  50. package/esm2022/src/app/core/form/properties/testing/properties-form.testing.module.mjs +8 -24
  51. package/esm2022/src/app/core/form/text-popover/testing/text-popover.testing.mjs +15 -15
  52. package/esm2022/src/app/core/form/text-popover/testing/text-popover.testing.module.mjs +10 -25
  53. package/esm2022/src/app/core/form/text-popover/text-popover.component.mjs +7 -7
  54. package/esm2022/src/app/core/form/text-popover/text-popover.module.mjs +9 -13
  55. package/esm2022/src/app/core/form/username/username.form.mjs +52 -0
  56. package/esm2022/src/app/core/form/username/username.module.mjs +20 -0
  57. package/esm2022/src/app/core/graphql/graphql.module.mjs +8 -16
  58. package/esm2022/src/app/core/graphql/graphql.service.mjs +101 -109
  59. package/esm2022/src/app/core/graphql/graphql.utils.mjs +12 -11
  60. package/esm2022/src/app/core/home/home.mjs +81 -52
  61. package/esm2022/src/app/core/home/home.module.mjs +10 -19
  62. package/esm2022/src/app/core/icon/icon.component.mjs +5 -5
  63. package/esm2022/src/app/core/icon/icon.module.mjs +8 -17
  64. package/esm2022/src/app/core/install/install-upgrade-card.component.mjs +33 -37
  65. package/esm2022/src/app/core/install/install-upgrade-card.module.mjs +9 -13
  66. package/esm2022/src/app/core/menu/menu.component.mjs +5 -6
  67. package/esm2022/src/app/core/menu/menu.model.mjs +21 -18
  68. package/esm2022/src/app/core/menu/menu.module.mjs +7 -12
  69. package/esm2022/src/app/core/menu/menu.service.mjs +44 -60
  70. package/esm2022/src/app/core/menu/sub-menu-tab.directive.mjs +4 -4
  71. package/esm2022/src/app/core/menu/testing/menu-other.testing.mjs +7 -6
  72. package/esm2022/src/app/core/menu/testing/menu.testing.mjs +43 -8
  73. package/esm2022/src/app/core/menu/testing/menu.testing.module.mjs +8 -27
  74. package/esm2022/src/app/core/offline/update-offline-mode-card.component.mjs +6 -7
  75. package/esm2022/src/app/core/offline/update-offline-mode-card.module.mjs +9 -13
  76. package/esm2022/src/app/core/peer/select-peer.modal.mjs +31 -21
  77. package/esm2022/src/app/core/peer/select-peer.module.mjs +11 -23
  78. package/esm2022/src/app/core/register/register-confirm.page.mjs +18 -16
  79. package/esm2022/src/app/core/register/register.form.mjs +7 -7
  80. package/esm2022/src/app/core/register/register.modal.mjs +6 -6
  81. package/esm2022/src/app/core/register/register.module.mjs +8 -29
  82. package/esm2022/src/app/core/services/account.service.mjs +272 -170
  83. package/esm2022/src/app/core/services/auth-guard.service.mjs +13 -15
  84. package/esm2022/src/app/core/services/base-entity-service.class.mjs +55 -64
  85. package/esm2022/src/app/core/services/base-graphql-service.class.mjs +39 -33
  86. package/esm2022/src/app/core/services/base58.mjs +8 -4
  87. package/esm2022/src/app/core/services/config/core.config.mjs +88 -37
  88. package/esm2022/src/app/core/services/config.service.mjs +81 -62
  89. package/esm2022/src/app/core/services/crypto.service.mjs +11 -11
  90. package/esm2022/src/app/core/services/errors.mjs +6 -5
  91. package/esm2022/src/app/core/services/local-settings.service.mjs +58 -44
  92. package/esm2022/src/app/core/services/model/account.model.mjs +12 -17
  93. package/esm2022/src/app/core/services/model/config.model.mjs +7 -7
  94. package/esm2022/src/app/core/services/model/department.model.mjs +3 -2
  95. package/esm2022/src/app/core/services/model/entity.decorators.mjs +6 -6
  96. package/esm2022/src/app/core/services/model/entity.model.mjs +27 -31
  97. package/esm2022/src/app/core/services/model/filter.model.mjs +12 -15
  98. package/esm2022/src/app/core/services/model/history.model.mjs +1 -1
  99. package/esm2022/src/app/core/services/model/model.enum.mjs +2 -2
  100. package/esm2022/src/app/core/services/model/peer.model.mjs +19 -9
  101. package/esm2022/src/app/core/services/model/person.model.mjs +26 -22
  102. package/esm2022/src/app/core/services/model/referential.model.mjs +36 -23
  103. package/esm2022/src/app/core/services/model/settings.model.mjs +2 -1
  104. package/esm2022/src/app/core/services/model/token.model.mjs +7 -3
  105. package/esm2022/src/app/core/services/model/tree-item-entity.model.mjs +3 -7
  106. package/esm2022/src/app/core/services/network.service.mjs +99 -76
  107. package/esm2022/src/app/core/services/network.types.mjs +1 -1
  108. package/esm2022/src/app/core/services/network.utils.mjs +3 -3
  109. package/esm2022/src/app/core/services/pipes/account.pipes.mjs +11 -11
  110. package/esm2022/src/app/core/services/pipes/department-to-string.pipe.mjs +6 -6
  111. package/esm2022/src/app/core/services/pipes/person-to-string.pipe.mjs +9 -9
  112. package/esm2022/src/app/core/services/pipes/pipes.module.mjs +54 -0
  113. package/esm2022/src/app/core/services/pipes/referential-to-string.pipe.mjs +21 -0
  114. package/esm2022/src/app/core/services/pipes/usage-mode.pipes.mjs +11 -11
  115. package/esm2022/src/app/core/services/platform.service.mjs +102 -69
  116. package/esm2022/src/app/core/services/storage/entities-storage.service.mjs +32 -39
  117. package/esm2022/src/app/core/services/storage/entity-store.class.mjs +36 -45
  118. package/esm2022/src/app/core/services/testing/referential-filter.model.mjs +1 -1
  119. package/esm2022/src/app/core/services/testing/referential.validator.mjs +14 -14
  120. package/esm2022/src/app/core/services/validator/account.validator.mjs +5 -5
  121. package/esm2022/src/app/core/services/validator/base.validator.class.mjs +5 -5
  122. package/esm2022/src/app/core/services/validator/local-settings.validator.mjs +34 -20
  123. package/esm2022/src/app/core/services/validator/user-settings.validator.mjs +5 -5
  124. package/esm2022/src/app/core/services/validator/user-token.validator.mjs +12 -9
  125. package/esm2022/src/app/core/settings/settings.module.mjs +9 -21
  126. package/esm2022/src/app/core/settings/settings.page.mjs +76 -63
  127. package/esm2022/src/app/core/table/async-table.class.mjs +219 -201
  128. package/esm2022/src/app/core/table/column/actions-column.component.mjs +127 -0
  129. package/esm2022/src/app/core/table/column/nav-actions-column.component.mjs +117 -0
  130. package/esm2022/src/app/core/table/column/row-field.component.mjs +116 -0
  131. package/esm2022/src/app/core/table/entities-async-table-datasource.class.mjs +31 -33
  132. package/esm2022/src/app/core/table/entities-table-datasource.class.mjs +36 -36
  133. package/esm2022/src/app/core/table/memory-table.class.mjs +5 -5
  134. package/esm2022/src/app/core/table/table-select-columns.component.mjs +8 -8
  135. package/esm2022/src/app/core/table/table.class.mjs +193 -152
  136. package/esm2022/src/app/core/table/table.model.mjs +1 -1
  137. package/esm2022/src/app/core/table/table.module.mjs +35 -24
  138. package/esm2022/src/app/core/table/table.pipes.mjs +77 -0
  139. package/esm2022/src/app/core/table/table.utils.mjs +2 -4
  140. package/esm2022/src/app/core/table/testing/table-validator.service.mjs +9 -5
  141. package/esm2022/src/app/core/table/testing/table.testing.mjs +116 -78
  142. package/esm2022/src/app/core/table/testing/table.testing.module.mjs +8 -33
  143. package/esm2022/src/app/core/table/testing/table2-validator.service.mjs +4 -4
  144. package/esm2022/src/app/core/table/testing/table2.testing.mjs +68 -45
  145. package/esm2022/src/app/shared/alerts.mjs +49 -45
  146. package/esm2022/src/app/shared/audio/audio.mjs +25 -27
  147. package/esm2022/src/app/shared/audio/audio.testing.mjs +5 -5
  148. package/esm2022/src/app/shared/audio/audio.testing.module.mjs +10 -25
  149. package/esm2022/src/app/shared/capacitor/keyboard.mjs +5 -5
  150. package/esm2022/src/app/shared/capacitor/plugins.mjs +1 -1
  151. package/esm2022/src/app/shared/constants.mjs +9 -4
  152. package/esm2022/src/app/shared/dates.mjs +18 -16
  153. package/esm2022/src/app/shared/debug/debug-service.class.mjs +1 -1
  154. package/esm2022/src/app/shared/debug/debug.component.mjs +5 -5
  155. package/esm2022/src/app/shared/debug/debug.module.mjs +8 -29
  156. package/esm2022/src/app/shared/directives/autofocus.directive.mjs +8 -15
  157. package/esm2022/src/app/shared/directives/autotitle.directive.mjs +4 -4
  158. package/esm2022/src/app/shared/directives/directives.module.mjs +8 -29
  159. package/esm2022/src/app/shared/directives/drag-and-drop.directive.mjs +4 -4
  160. package/esm2022/src/app/shared/directives/ng-var.directive.mjs +4 -4
  161. package/esm2022/src/app/shared/directives/resizable/resizable.component.mjs +4 -4
  162. package/esm2022/src/app/shared/directives/resizable/resizable.directive.mjs +4 -4
  163. package/esm2022/src/app/shared/directives/resizable/resizable.module.mjs +4 -4
  164. package/esm2022/src/app/shared/events.mjs +6 -8
  165. package/esm2022/src/app/shared/file/csv.utils.mjs +38 -18
  166. package/esm2022/src/app/shared/file/file.service.mjs +11 -15
  167. package/esm2022/src/app/shared/file/file.utils.mjs +13 -11
  168. package/esm2022/src/app/shared/file/images.utils.mjs +29 -4
  169. package/esm2022/src/app/shared/file/json.utils.mjs +11 -4
  170. package/esm2022/src/app/shared/file/uri.utils.mjs +1 -1
  171. package/esm2022/src/app/shared/focusable.mjs +1 -1
  172. package/esm2022/src/app/shared/form/field.component.mjs +69 -43
  173. package/esm2022/src/app/shared/form/field.model.mjs +4 -4
  174. package/esm2022/src/app/shared/form/loading-spinner.mjs +5 -5
  175. package/esm2022/src/app/shared/forms.mjs +116 -43
  176. package/esm2022/src/app/shared/functions.mjs +139 -71
  177. package/esm2022/src/app/shared/geolocation/geolocation.utils.mjs +14 -14
  178. package/esm2022/src/app/shared/gesture/gesture-config.mjs +10 -10
  179. package/esm2022/src/app/shared/gesture/hammer.utils.mjs +1 -1
  180. package/esm2022/src/app/shared/graph/colors.utils.mjs +14 -18
  181. package/esm2022/src/app/shared/graph/graph-colors.mjs +23 -29
  182. package/esm2022/src/app/shared/guard/component-dirty.guard.mjs +4 -4
  183. package/esm2022/src/app/shared/help/help.modal.mjs +6 -6
  184. package/esm2022/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.mjs +5 -5
  185. package/esm2022/src/app/shared/hotkeys/hotkeys.service.mjs +44 -17
  186. package/esm2022/src/app/shared/hotkeys/shared-hotkeys.module.mjs +9 -27
  187. package/esm2022/src/app/shared/http/http.utils.mjs +15 -11
  188. package/esm2022/src/app/shared/image/gallery/image-gallery.component.mjs +27 -27
  189. package/esm2022/src/app/shared/image/gallery/image-gallery.module.mjs +13 -10
  190. package/esm2022/src/app/shared/image/gallery/testing/gallegry.model.testing.mjs +1 -1
  191. package/esm2022/src/app/shared/image/gallery/testing/gallery.service.testing.mjs +14 -17
  192. package/esm2022/src/app/shared/image/gallery/testing/gallery.testing.mjs +9 -13
  193. package/esm2022/src/app/shared/image/gallery/testing/gallery.testing.module.mjs +14 -11
  194. package/esm2022/src/app/shared/image/image.model.mjs +1 -1
  195. package/esm2022/src/app/shared/image/image.module.mjs +8 -13
  196. package/esm2022/src/app/shared/image/image.service.mjs +14 -12
  197. package/esm2022/src/app/shared/inputs.mjs +52 -20
  198. package/esm2022/src/app/shared/interceptors/progess.interceptor.mjs +2 -3
  199. package/esm2022/src/app/shared/logging/log-level.model.mjs +1 -1
  200. package/esm2022/src/app/shared/logging/logger.model.mjs +2 -2
  201. package/esm2022/src/app/shared/logging/logging-service.class.mjs +17 -20
  202. package/esm2022/src/app/shared/logging/logging-service.module.mjs +6 -6
  203. package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.config.mjs +7 -10
  204. package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.mjs +348 -238
  205. package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.module.mjs +13 -16
  206. package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.utils.mjs +5 -4
  207. package/esm2022/src/app/shared/material/autocomplete/testing/autocomplete.test.mjs +51 -37
  208. package/esm2022/src/app/shared/material/badge/badge.directive.mjs +99 -57
  209. package/esm2022/src/app/shared/material/badge/badge.module.mjs +8 -20
  210. package/esm2022/src/app/shared/material/badge/badge.test.mjs +5 -5
  211. package/esm2022/src/app/shared/material/boolean/boolean.module.mjs +19 -20
  212. package/esm2022/src/app/shared/material/boolean/material.boolean.mjs +209 -104
  213. package/esm2022/src/app/shared/material/boolean/testing/boolean.test.page.mjs +15 -8
  214. package/esm2022/src/app/shared/material/chips/chips.module.mjs +12 -13
  215. package/esm2022/src/app/shared/material/chips/material.chips.mjs +228 -168
  216. package/esm2022/src/app/shared/material/chips/testing/chips.test.mjs +20 -21
  217. package/esm2022/src/app/shared/material/datetime/datetime.module.mjs +12 -27
  218. package/esm2022/src/app/shared/material/datetime/material.date.mjs +167 -92
  219. package/esm2022/src/app/shared/material/datetime/material.dateshort.mjs +128 -77
  220. package/esm2022/src/app/shared/material/datetime/material.datetime.mjs +297 -165
  221. package/esm2022/src/app/shared/material/datetime/testing/mat-date-time.test.mjs +34 -30
  222. package/esm2022/src/app/shared/material/datetime/testing/mat-date.test.mjs +31 -27
  223. package/esm2022/src/app/shared/material/datetime/testing/mat-dateshort.test.mjs +26 -23
  224. package/esm2022/src/app/shared/material/duration/duration.module.mjs +11 -16
  225. package/esm2022/src/app/shared/material/duration/duration.utils.mjs +3 -6
  226. package/esm2022/src/app/shared/material/duration/material.duration.mjs +35 -34
  227. package/esm2022/src/app/shared/material/duration/testing/mat-duration.test.mjs +23 -22
  228. package/esm2022/src/app/shared/material/latlong/latlong.utils.mjs +217 -170
  229. package/esm2022/src/app/shared/material/latlong/material.latlong.mjs +182 -241
  230. package/esm2022/src/app/shared/material/latlong/material.latlong.module.mjs +10 -15
  231. package/esm2022/src/app/shared/material/latlong/testing/latlong.test.mjs +19 -14
  232. package/esm2022/src/app/shared/material/material.animations.mjs +22 -22
  233. package/esm2022/src/app/shared/material/material.config.mjs +3 -0
  234. package/esm2022/src/app/shared/material/material.module.mjs +16 -16
  235. package/esm2022/src/app/shared/material/material.testing.module.mjs +50 -37
  236. package/esm2022/src/app/shared/material/paginator/material.paginator-i18n.mjs +12 -9
  237. package/esm2022/src/app/shared/material/stepper/material.stepper-i18n.mjs +4 -4
  238. package/esm2022/src/app/shared/material/swipe/material.swipe.mjs +26 -19
  239. package/esm2022/src/app/shared/material/swipe/swipe.module.mjs +7 -11
  240. package/esm2022/src/app/shared/material/swipe/testing/swipe.test.mjs +8 -8
  241. package/esm2022/src/app/shared/material/testing/common.test.mjs +30 -24
  242. package/esm2022/src/app/shared/material/text/testing/text-form.testing.mjs +30 -19
  243. package/esm2022/src/app/shared/material/text/text-form.component.mjs +128 -21
  244. package/esm2022/src/app/shared/material/text/text-form.module.mjs +8 -8
  245. package/esm2022/src/app/shared/modules.mjs +1 -1
  246. package/esm2022/src/app/shared/named-filter/named-filter-selector.component.mjs +118 -37
  247. package/esm2022/src/app/shared/named-filter/named-filter.model.mjs +1 -1
  248. package/esm2022/src/app/shared/named-filter/named-filter.module.mjs +5 -5
  249. package/esm2022/src/app/shared/named-filter/named-filter.service.mjs +8 -8
  250. package/esm2022/src/app/shared/named-filter/testing/named-filter-selector.testing.mjs +74 -0
  251. package/esm2022/src/app/shared/named-filter/testing/named-filter.testing.module.mjs +28 -0
  252. package/esm2022/src/app/shared/observables.mjs +14 -18
  253. package/esm2022/src/app/shared/pipes/arrays.pipe.mjs +53 -38
  254. package/esm2022/src/app/shared/pipes/badge.pipes.mjs +24 -0
  255. package/esm2022/src/app/shared/pipes/colors.pipe.mjs +8 -6
  256. package/esm2022/src/app/shared/pipes/date-diff-duration.pipe.mjs +8 -10
  257. package/esm2022/src/app/shared/pipes/date-format.pipe.mjs +15 -15
  258. package/esm2022/src/app/shared/pipes/date-from-now.pipe.mjs +6 -6
  259. package/esm2022/src/app/shared/pipes/duration.pipe.mjs +6 -6
  260. package/esm2022/src/app/shared/pipes/file-size.pipe.mjs +6 -13
  261. package/esm2022/src/app/shared/pipes/form.pipes.mjs +72 -47
  262. package/esm2022/src/app/shared/pipes/highlight.pipe.mjs +15 -15
  263. package/esm2022/src/app/shared/pipes/html.pipes.mjs +52 -0
  264. package/esm2022/src/app/shared/pipes/latlong-format.pipe.mjs +14 -14
  265. package/esm2022/src/app/shared/pipes/maps.pipe.mjs +17 -17
  266. package/esm2022/src/app/shared/pipes/maskito.pipe.mjs +37 -88
  267. package/esm2022/src/app/shared/pipes/math.pipes.mjs +16 -16
  268. package/esm2022/src/app/shared/pipes/ng-init.pipe.mjs +5 -5
  269. package/esm2022/src/app/shared/pipes/number-format.pipe.mjs +6 -6
  270. package/esm2022/src/app/shared/pipes/pipes.module.mjs +117 -137
  271. package/esm2022/src/app/shared/pipes/property.pipes.mjs +86 -47
  272. package/esm2022/src/app/shared/pipes/selection.pipes.mjs +179 -0
  273. package/esm2022/src/app/shared/pipes/string.pipes.mjs +50 -49
  274. package/esm2022/src/app/shared/pipes/translate-context.pipe.mjs +11 -11
  275. package/esm2022/src/app/shared/pipes/types.pipes.mjs +33 -17
  276. package/esm2022/src/app/shared/platforms.mjs +7 -5
  277. package/esm2022/src/app/shared/rx-state.module.mjs +7 -11
  278. package/esm2022/src/app/shared/services/entity-service.class.mjs +2 -2
  279. package/esm2022/src/app/shared/services/job.utils.mjs +7 -7
  280. package/esm2022/src/app/shared/services/memory-entity-service.class.mjs +43 -41
  281. package/esm2022/src/app/shared/services/progress-bar.service.mjs +4 -4
  282. package/esm2022/src/app/shared/services/startable-observable-service.class.mjs +11 -14
  283. package/esm2022/src/app/shared/services/startable-service.class.mjs +11 -17
  284. package/esm2022/src/app/shared/services/translate-context.service.mjs +18 -15
  285. package/esm2022/src/app/shared/services/validator-service.class.mjs +1 -1
  286. package/esm2022/src/app/shared/services.mjs +12 -12
  287. package/esm2022/src/app/shared/shared-routing.module.mjs +19 -18
  288. package/esm2022/src/app/shared/shared.module.mjs +29 -28
  289. package/esm2022/src/app/shared/shared.testing.module.mjs +18 -10
  290. package/esm2022/src/app/shared/storage/storage-explorer.component.mjs +39 -46
  291. package/esm2022/src/app/shared/storage/storage-explorer.module.mjs +8 -12
  292. package/esm2022/src/app/shared/storage/storage-explorer.testing-routing.module.mjs +9 -17
  293. package/esm2022/src/app/shared/storage/storage-explorer.testing.module.mjs +10 -18
  294. package/esm2022/src/app/shared/storage/storage.service.mjs +4 -4
  295. package/esm2022/src/app/shared/storage/storage.utils.mjs +2 -2
  296. package/esm2022/src/app/shared/testing/maskito.test.mjs +41 -0
  297. package/esm2022/src/app/shared/testing/observable.test.mjs +11 -13
  298. package/esm2022/src/app/shared/testing/tests.page.mjs +6 -6
  299. package/esm2022/src/app/shared/toast/toast.testing.mjs +11 -11
  300. package/esm2022/src/app/shared/toast/toast.testing.module.mjs +10 -25
  301. package/esm2022/src/app/shared/toast/toasts.mjs +9 -9
  302. package/esm2022/src/app/shared/toolbar/modal-toolbar.mjs +10 -8
  303. package/esm2022/src/app/shared/toolbar/toolbar.mjs +31 -32
  304. package/esm2022/src/app/shared/toolbar/toolbar.module.mjs +8 -39
  305. package/esm2022/src/app/shared/types.mjs +1 -1
  306. package/esm2022/src/app/shared/upload-file/testing/upload-file.testing.mjs +12 -12
  307. package/esm2022/src/app/shared/upload-file/testing/upload-file.testing.module.mjs +10 -25
  308. package/esm2022/src/app/shared/upload-file/upload-file-popover.component.mjs +7 -8
  309. package/esm2022/src/app/shared/upload-file/upload-file.component.mjs +21 -19
  310. package/esm2022/src/app/shared/upload-file/upload-file.model.mjs +2 -3
  311. package/esm2022/src/app/shared/validator/form-error-adapter.class.mjs +64 -56
  312. package/esm2022/src/app/shared/validator/validators.mjs +60 -39
  313. package/esm2022/src/app/shared/version/versions.mjs +2 -2
  314. package/esm2022/src/app/social/job/job.module.mjs +8 -27
  315. package/esm2022/src/app/social/job/progression/job-progression.component.mjs +9 -9
  316. package/esm2022/src/app/social/job/progression/job-progression.icon.mjs +49 -46
  317. package/esm2022/src/app/social/job/progression/job-progression.list.mjs +10 -13
  318. package/esm2022/src/app/social/job/progression/job-progression.model.mjs +1 -1
  319. package/esm2022/src/app/social/job/progression/job-progression.service.mjs +39 -21
  320. package/esm2022/src/app/social/job/testing/job-progression.testing.mjs +6 -11
  321. package/esm2022/src/app/social/job/testing/job-progression.testing.service.mjs +11 -30
  322. package/esm2022/src/app/social/job/testing/job.testing.module.mjs +8 -21
  323. package/esm2022/src/app/social/message/message.form.mjs +5 -5
  324. package/esm2022/src/app/social/message/message.modal.mjs +8 -8
  325. package/esm2022/src/app/social/message/message.model.mjs +8 -8
  326. package/esm2022/src/app/social/message/message.module.mjs +4 -4
  327. package/esm2022/src/app/social/message/message.service.mjs +7 -7
  328. package/esm2022/src/app/social/social.errors.mjs +2 -2
  329. package/esm2022/src/app/social/social.module.mjs +7 -32
  330. package/esm2022/src/app/social/social.testing.module.mjs +9 -20
  331. package/esm2022/src/app/social/user-event/notification/user-event-notification.icon.mjs +27 -23
  332. package/esm2022/src/app/social/user-event/notification/user-event-notification.list.mjs +19 -22
  333. package/esm2022/src/app/social/user-event/testing/user-event.testing.mjs +47 -23
  334. package/esm2022/src/app/social/user-event/testing/user-event.testing.model.mjs +8 -8
  335. package/esm2022/src/app/social/user-event/testing/user-event.testing.module.mjs +8 -21
  336. package/esm2022/src/app/social/user-event/testing/user-event.testing.service.mjs +27 -15
  337. package/esm2022/src/app/social/user-event/user-event.model.mjs +1 -1
  338. package/esm2022/src/app/social/user-event/user-event.module.mjs +8 -28
  339. package/esm2022/src/app/social/user-event/user-event.service.mjs +61 -64
  340. package/esm2022/src/environments/environment.class.mjs +9 -1
  341. package/esm2022/src/environments/environment.loader.mjs +5 -11
  342. package/esm2022/src/environments/environment.mjs +19 -11
  343. package/fesm2022/sumaris-net.ngx-components.mjs +16117 -14592
  344. package/fesm2022/sumaris-net.ngx-components.mjs.map +1 -1
  345. package/package.json +33 -18
  346. package/public_api.d.ts +30 -22
  347. package/src/app/admin/services/filter/person.filter.d.ts +1 -1
  348. package/src/app/admin/users/users.d.ts +5 -6
  349. package/src/app/core/account/account.module.d.ts +10 -8
  350. package/src/app/core/account/account.page.d.ts +25 -15
  351. package/src/app/core/account/new-token.form.d.ts +29 -0
  352. package/src/app/core/account/new-token.modal.d.ts +9 -21
  353. package/src/app/core/account/password/change-password.form.d.ts +19 -0
  354. package/src/app/core/account/password/change-password.module.d.ts +11 -0
  355. package/src/app/core/account/password/change-password.page.d.ts +36 -0
  356. package/src/app/core/account/token.table.d.ts +7 -5
  357. package/src/app/core/auth/auth.form.d.ts +11 -9
  358. package/src/app/core/auth/auth.module.d.ts +6 -4
  359. package/src/app/core/auth/reset-password.modal.d.ts +26 -0
  360. package/src/app/core/core.module.d.ts +21 -24
  361. package/src/app/core/core.testing.module.d.ts +2 -1
  362. package/src/app/core/form/array/form-array.d.ts +136 -0
  363. package/src/app/core/form/array/testing/form-array-test.module.d.ts +12 -0
  364. package/src/app/core/form/array/testing/form-array.test.d.ts +26 -0
  365. package/src/app/core/form/buttons/form-buttons-bar.component.d.ts +2 -3
  366. package/src/app/core/form/entity/editor.class.d.ts +19 -179
  367. package/src/app/core/form/entity/entity-editor-modal.class.d.ts +10 -13
  368. package/src/app/core/form/entity/entity-editor.class.d.ts +12 -17
  369. package/src/app/core/form/entity/entity-metadata.component.d.ts +1 -1
  370. package/src/app/core/form/entity/tab-editor.class.d.ts +70 -0
  371. package/src/app/core/form/form-container.class.d.ts +126 -0
  372. package/src/app/core/form/form.class.d.ts +13 -26
  373. package/src/app/core/form/form.module.d.ts +2 -1
  374. package/src/app/core/form/form.utils.d.ts +60 -145
  375. package/src/app/core/form/list/list.form.d.ts +2 -2
  376. package/src/app/core/form/properties/properties.form.d.ts +34 -12
  377. package/src/app/core/form/properties/properties.table.d.ts +2 -2
  378. package/src/app/core/form/properties/properties.utils.d.ts +27 -0
  379. package/src/app/core/form/properties/property.validator.d.ts +9 -3
  380. package/src/app/core/form/text-popover/testing/text-popover.testing.d.ts +3 -1
  381. package/src/app/core/form/username/username.form.d.ts +19 -0
  382. package/src/app/core/form/username/username.module.d.ts +9 -0
  383. package/src/app/core/graphql/graphql.module.d.ts +1 -2
  384. package/src/app/core/graphql/graphql.service.d.ts +2 -4
  385. package/src/app/core/home/home.d.ts +26 -6
  386. package/src/app/core/menu/testing/menu-other.testing.d.ts +1 -1
  387. package/src/app/core/menu/testing/menu.testing.d.ts +11 -3
  388. package/src/app/core/peer/select-peer.modal.d.ts +13 -7
  389. package/src/app/core/peer/select-peer.module.d.ts +3 -4
  390. package/src/app/core/services/account.service.d.ts +9 -0
  391. package/src/app/core/services/base-entity-service.class.d.ts +1 -1
  392. package/src/app/core/services/config/core.config.d.ts +12 -1
  393. package/src/app/core/services/config.service.d.ts +4 -3
  394. package/src/app/core/services/errors.d.ts +11 -0
  395. package/src/app/core/services/local-settings.service.d.ts +8 -4
  396. package/src/app/core/services/model/entity.model.d.ts +6 -5
  397. package/src/app/core/services/model/filter.model.d.ts +1 -1
  398. package/src/app/core/services/model/peer.model.d.ts +1 -0
  399. package/src/app/core/services/model/person.model.d.ts +6 -2
  400. package/src/app/core/services/model/referential.model.d.ts +8 -3
  401. package/src/app/core/services/model/settings.model.d.ts +4 -2
  402. package/src/app/core/services/model/token.model.d.ts +1 -0
  403. package/src/app/core/services/model/tree-item-entity.model.d.ts +1 -1
  404. package/src/app/core/services/network.service.d.ts +11 -7
  405. package/src/app/core/services/pipes/department-to-string.pipe.d.ts +1 -1
  406. package/src/app/core/services/pipes/person-to-string.pipe.d.ts +3 -1
  407. package/src/app/core/services/pipes/pipes.module.d.ts +11 -0
  408. package/src/app/core/services/pipes/referential-to-string.pipe.d.ts +13 -0
  409. package/src/app/core/services/platform.service.d.ts +8 -3
  410. package/src/app/core/services/testing/referential-filter.model.d.ts +1 -1
  411. package/src/app/core/services/validator/local-settings.validator.d.ts +6 -2
  412. package/src/app/core/settings/settings.module.d.ts +2 -1
  413. package/src/app/core/settings/settings.page.d.ts +34 -21
  414. package/src/app/core/table/async-table.class.d.ts +22 -17
  415. package/src/app/core/table/column/actions-column.component.d.ts +59 -0
  416. package/src/app/core/table/column/nav-actions-column.component.d.ts +46 -0
  417. package/src/app/core/table/column/row-field.component.d.ts +40 -0
  418. package/src/app/core/table/entities-async-table-datasource.class.d.ts +1 -0
  419. package/src/app/core/table/entities-table-datasource.class.d.ts +1 -0
  420. package/src/app/core/table/table.class.d.ts +14 -11
  421. package/src/app/core/table/table.module.d.ts +8 -4
  422. package/src/app/core/table/table.pipes.d.ts +28 -0
  423. package/src/app/core/table/testing/table.testing.d.ts +12 -13
  424. package/src/app/core/table/testing/table2.testing.d.ts +13 -10
  425. package/src/app/shared/alerts.d.ts +4 -2
  426. package/src/app/shared/constants.d.ts +5 -0
  427. package/src/app/shared/dates.d.ts +12 -5
  428. package/src/app/shared/directives/autofocus.directive.d.ts +0 -1
  429. package/src/app/shared/events.d.ts +1 -1
  430. package/src/app/shared/file/csv.utils.d.ts +5 -0
  431. package/src/app/shared/file/images.utils.d.ts +17 -0
  432. package/src/app/shared/file/json.utils.d.ts +3 -0
  433. package/src/app/shared/form/field.component.d.ts +6 -3
  434. package/src/app/shared/forms.d.ts +32 -0
  435. package/src/app/shared/functions.d.ts +27 -8
  436. package/src/app/shared/graph/graph-colors.d.ts +1 -1
  437. package/src/app/shared/guard/component-dirty.guard.d.ts +1 -6
  438. package/src/app/shared/hotkeys/hotkeys.service.d.ts +17 -3
  439. package/src/app/shared/http/http.utils.d.ts +1 -0
  440. package/src/app/shared/image/gallery/image-gallery.component.d.ts +10 -10
  441. package/src/app/shared/image/gallery/image-gallery.module.d.ts +2 -1
  442. package/src/app/shared/image/gallery/testing/gallery.service.testing.d.ts +2 -2
  443. package/src/app/shared/image/gallery/testing/gallery.testing.module.d.ts +2 -1
  444. package/src/app/shared/inputs.d.ts +7 -5
  445. package/src/app/shared/material/autocomplete/material.autocomplete.config.d.ts +20 -1
  446. package/src/app/shared/material/autocomplete/material.autocomplete.d.ts +56 -16
  447. package/src/app/shared/material/autocomplete/material.autocomplete.module.d.ts +1 -1
  448. package/src/app/shared/material/autocomplete/material.autocomplete.utils.d.ts +2 -1
  449. package/src/app/shared/material/autocomplete/testing/autocomplete.test.d.ts +3 -2
  450. package/src/app/shared/material/badge/badge.directive.d.ts +10 -4
  451. package/src/app/shared/material/boolean/boolean.module.d.ts +15 -14
  452. package/src/app/shared/material/boolean/material.boolean.d.ts +51 -25
  453. package/src/app/shared/material/boolean/testing/boolean.test.page.d.ts +1 -0
  454. package/src/app/shared/material/chips/chips.module.d.ts +2 -1
  455. package/src/app/shared/material/chips/material.chips.d.ts +46 -21
  456. package/src/app/shared/material/chips/testing/chips.test.d.ts +1 -0
  457. package/src/app/shared/material/datetime/datetime.module.d.ts +1 -1
  458. package/src/app/shared/material/datetime/material.date.d.ts +33 -18
  459. package/src/app/shared/material/datetime/material.dateshort.d.ts +29 -16
  460. package/src/app/shared/material/datetime/material.datetime.d.ts +41 -28
  461. package/src/app/shared/material/datetime/testing/mat-date-time.test.d.ts +3 -3
  462. package/src/app/shared/material/duration/duration.module.d.ts +1 -1
  463. package/src/app/shared/material/duration/material.duration.d.ts +1 -1
  464. package/src/app/shared/material/latlong/latlong.utils.d.ts +9 -1
  465. package/src/app/shared/material/latlong/material.latlong.d.ts +29 -32
  466. package/src/app/shared/material/latlong/material.latlong.module.d.ts +1 -1
  467. package/src/app/shared/material/latlong/testing/latlong.test.d.ts +5 -1
  468. package/src/app/shared/material/material.config.d.ts +3 -0
  469. package/src/app/shared/material/material.module.d.ts +5 -6
  470. package/src/app/shared/material/material.testing.module.d.ts +8 -7
  471. package/src/app/shared/material/swipe/material.swipe.d.ts +4 -3
  472. package/src/app/shared/material/text/testing/text-form.testing.d.ts +10 -4
  473. package/src/app/shared/material/text/text-form.component.d.ts +42 -8
  474. package/src/app/shared/named-filter/named-filter-selector.component.d.ts +30 -14
  475. package/src/app/shared/named-filter/named-filter.service.d.ts +12 -6
  476. package/src/app/shared/named-filter/testing/named-filter-selector.testing.d.ts +34 -0
  477. package/src/app/shared/named-filter/testing/named-filter.testing.module.d.ts +10 -0
  478. package/src/app/shared/pipes/arrays.pipe.d.ts +5 -0
  479. package/src/app/shared/pipes/badge.pipes.d.ts +7 -0
  480. package/src/app/shared/pipes/date-format.pipe.d.ts +3 -2
  481. package/src/app/shared/pipes/form.pipes.d.ts +18 -8
  482. package/src/app/shared/pipes/html.pipes.d.ts +15 -0
  483. package/src/app/shared/pipes/maps.pipe.d.ts +4 -4
  484. package/src/app/shared/pipes/maskito.pipe.d.ts +7 -9
  485. package/src/app/shared/pipes/pipes.module.d.ts +7 -4
  486. package/src/app/shared/pipes/property.pipes.d.ts +24 -3
  487. package/src/app/shared/pipes/selection.pipes.d.ts +62 -0
  488. package/src/app/shared/pipes/string.pipes.d.ts +6 -6
  489. package/src/app/shared/pipes/types.pipes.d.ts +6 -1
  490. package/src/app/shared/services/entity-service.class.d.ts +0 -2
  491. package/src/app/shared/services/memory-entity-service.class.d.ts +6 -3
  492. package/src/app/shared/services.d.ts +1 -0
  493. package/src/app/shared/shared.testing.module.d.ts +2 -1
  494. package/src/app/shared/storage/storage-explorer.component.d.ts +4 -3
  495. package/src/app/shared/testing/maskito.test.d.ts +10 -0
  496. package/src/app/shared/toolbar/toolbar.d.ts +7 -2
  497. package/src/app/shared/types.d.ts +5 -0
  498. package/src/app/shared/upload-file/upload-file.component.d.ts +1 -0
  499. package/src/app/shared/validator/form-error-adapter.class.d.ts +17 -11
  500. package/src/app/shared/validator/validators.d.ts +20 -9
  501. package/src/app/social/job/progression/job-progression.icon.d.ts +4 -5
  502. package/src/app/social/job/progression/job-progression.list.d.ts +1 -3
  503. package/src/app/social/job/progression/job-progression.service.d.ts +3 -4
  504. package/src/app/social/job/testing/job-progression.testing.d.ts +0 -1
  505. package/src/app/social/job/testing/job-progression.testing.service.d.ts +3 -11
  506. package/src/app/social/message/message.modal.d.ts +2 -2
  507. package/src/app/social/message/message.model.d.ts +1 -1
  508. package/src/app/social/user-event/notification/user-event-notification.icon.d.ts +4 -4
  509. package/src/app/social/user-event/testing/user-event.testing.d.ts +1 -0
  510. package/src/app/social/user-event/testing/user-event.testing.model.d.ts +2 -3
  511. package/src/app/social/user-event/testing/user-event.testing.service.d.ts +1 -0
  512. package/src/assets/i18n/en-US.json +48 -19
  513. package/src/assets/i18n/en.json +48 -20
  514. package/src/assets/i18n/fr.json +50 -20
  515. package/src/assets/manifest.json +1 -1
  516. package/src/environments/environment.class.d.ts +10 -0
  517. package/src/environments/environment.d.ts +0 -1
  518. package/src/environments/environment.loader.d.ts +0 -2
  519. package/src/theme/_functions.scss +15 -0
  520. package/src/theme/_icons.scss +1 -1
  521. package/src/theme/_ionic.globals.scss +8 -2
  522. package/src/theme/_ionic.scss +10 -10
  523. package/src/theme/_material.globals.scss +16 -43
  524. package/src/theme/_material.scss +45 -32
  525. package/src/theme/_mixins.scss +99 -18
  526. package/src/theme/_ngx-components.forms.scss +354 -0
  527. package/src/theme/_ngx-components.globals.scss +20 -10
  528. package/src/theme/_ngx-components.scss +194 -400
  529. package/src/theme/_ngx-components.table.scss +200 -207
  530. package/src/theme/_ngx-components.tabs.scss +54 -0
  531. package/src/theme/_responsive.scss +0 -31
  532. package/src/theme/_theme.scss +2 -0
  533. package/src/theme/_theme.variables.scss +172 -0
  534. package/esm2022/src/app/core/table/actions-column.component.mjs +0 -115
  535. package/esm2022/src/app/shared/material/boolean/material-boolean2.mjs +0 -266
  536. package/esm2022/src/app/shared/material/numpad/numpad.append-to-input.directive.mjs +0 -104
  537. package/esm2022/src/app/shared/material/numpad/numpad.component.mjs +0 -83
  538. package/esm2022/src/app/shared/material/numpad/numpad.container.mjs +0 -203
  539. package/esm2022/src/app/shared/material/numpad/numpad.content.mjs +0 -19
  540. package/esm2022/src/app/shared/material/numpad/numpad.directive.mjs +0 -168
  541. package/esm2022/src/app/shared/material/numpad/numpad.dom-service.mjs +0 -36
  542. package/esm2022/src/app/shared/material/numpad/numpad.model.mjs +0 -16
  543. package/esm2022/src/app/shared/material/numpad/numpad.module.mjs +0 -60
  544. package/esm2022/src/app/shared/material/numpad/testing/numpad.test.mjs +0 -48
  545. package/src/app/core/table/actions-column.component.d.ts +0 -48
  546. package/src/app/shared/material/boolean/material-boolean2.d.ts +0 -66
  547. package/src/app/shared/material/numpad/numpad.append-to-input.directive.d.ts +0 -22
  548. package/src/app/shared/material/numpad/numpad.component.d.ts +0 -26
  549. package/src/app/shared/material/numpad/numpad.container.d.ts +0 -40
  550. package/src/app/shared/material/numpad/numpad.content.d.ts +0 -7
  551. package/src/app/shared/material/numpad/numpad.directive.d.ts +0 -35
  552. package/src/app/shared/material/numpad/numpad.dom-service.d.ts +0 -16
  553. package/src/app/shared/material/numpad/numpad.model.d.ts +0 -30
  554. package/src/app/shared/material/numpad/numpad.module.d.ts +0 -16
  555. package/src/app/shared/material/numpad/testing/numpad.test.d.ts +0 -13
@@ -1,66 +1,55 @@
1
- import { ChangeDetectionStrategy, Component, ContentChild, EventEmitter, forwardRef, Inject, Input, Optional, Output, ViewChild } from '@angular/core';
1
+ import { booleanAttribute, ChangeDetectionStrategy, Component, EventEmitter, forwardRef, Inject, Input, Optional, Output, ViewChild, } from '@angular/core';
2
2
  import { NG_VALUE_ACCESSOR, Validators } from '@angular/forms';
3
3
  import { SharedValidators } from '../../validator/validators';
4
- import { formatLatitude, formatLongitude, LAT_LONG_DEFAULT_MAX_DECIMALS, parseLatitudeOrLongitude } from './latlong.utils';
5
- import { EMPTY_PLACEHOLDER_CHAR } from '../../constants';
4
+ import { formatLatLong, LAT_LONG_DEFAULT_MAX_DECIMALS, MASKS, parseLatitudeOrLongitude, } from './latlong.utils';
5
+ import { SPACE_PLACEHOLDER_CHAR } from '../../constants';
6
6
  import { filter } from 'rxjs/operators';
7
- import { isNil, isNilOrNaN, isNotNil, isNotNilOrBlank } from '../../functions';
8
- import { getCaretPosition, moveInputCaretToSeparator, selectInputContent, selectInputRange } from '../../inputs';
9
- import { merge, Subscription } from 'rxjs';
7
+ import { isNil, isNotNil, isNotNilOrBlank } from '../../functions';
8
+ import { getInputSelectionRangesFromMask } from '../../inputs';
9
+ import { Subscription } from 'rxjs';
10
10
  import { DEFAULT_MAX_DECIMALS } from '../duration/duration.utils';
11
- import { MAT_FORM_FIELD_DEFAULT_OPTIONS, MatError } from '@angular/material/form-field';
11
+ import { MAT_FORM_FIELD_DEFAULT_OPTIONS } from '@angular/material/form-field';
12
+ import { MAT_FORM_FIELD_DEFAULT_APPEARANCE, MAT_FORM_FIELD_DEFAULT_SUBSCRIPT_SIZING } from '../material.config';
13
+ import { isMobile } from '../../platforms';
12
14
  import * as i0 from "@angular/core";
13
15
  import * as i1 from "@angular/forms";
14
- import * as i2 from "@angular/common";
15
- import * as i3 from "@ionic/angular";
16
- import * as i4 from "../../directives/autofocus.directive";
17
- import * as i5 from "@angular/material/form-field";
18
- import * as i6 from "@angular/material/input";
19
- import * as i7 from "@maskito/angular";
20
- import * as i8 from "@angular/material/select";
21
- import * as i9 from "@angular/material/core";
22
- import * as i10 from "@ngx-translate/core";
16
+ import * as i2 from "@ngx-translate/core";
17
+ import * as i3 from "@angular/common";
18
+ import * as i4 from "@ionic/angular";
19
+ import * as i5 from "../../directives/autofocus.directive";
20
+ import * as i6 from "@angular/material/form-field";
21
+ import * as i7 from "@angular/material/input";
22
+ import * as i8 from "@maskito/angular";
23
+ import * as i9 from "@angular/material/select";
24
+ import * as i10 from "@angular/material/core";
23
25
  import * as i11 from "../../pipes/arrays.pipe";
24
26
  import * as i12 from "../../pipes/maps.pipe";
25
27
  import * as i13 from "../../pipes/types.pipes";
26
28
  import * as i14 from "../../pipes/maskito.pipe";
27
- const DEFAULT_SUBSCRIPT_SIZING = 'fixed';
28
- const D = /\d|\uFEFF/;
29
- const M = /\d|\uFEFF/;
30
- const S = /\d|\uFEFF/;
31
- const MASKS = {
32
- latitude: {
33
- DDMMSS: [D, D, '°', ' ', M, M, '\'', ' ', S, S, '.', S, S, '"'],
34
- DDMM: [D, D, '°', ' ', M, M, '.', M, M, M, '\''],
35
- DD: [/[+]|-/, ' ', D, D, '.', D, D, D, D, D, D, D, '°']
36
- },
37
- longitude: {
38
- DDMMSS: [D, D, D, '°', ' ', M, M, '\'', ' ', S, S, '.', S, S, '"'],
39
- DDMM: [D, D, D, '°', ' ', M, M, '.', M, M, M, '\''],
40
- DD: [/[+-]/, D, D, D, '.', D, D, D, D, D, D, D, '°']
41
- }
42
- };
43
- const noop = () => {
44
- };
29
+ const noop = () => { };
45
30
  export class MatLatLongField {
46
31
  formBuilder;
47
32
  cd;
33
+ translate;
48
34
  formGroupDir;
49
- _defaults;
50
35
  _onChangeCallback = noop;
51
36
  _onTouchedCallback = noop;
52
37
  _subscription = new Subscription();
53
38
  _formatOptions;
54
39
  _disabling = false;
55
40
  _writing = false;
41
+ _appearance = null;
56
42
  _subscriptSizing = null;
43
+ _defaultAppearance;
44
+ _defaultSubscriptSizing;
57
45
  _readonly = false;
58
- _formatFn;
59
46
  textFormControl;
60
47
  signFormControl;
61
48
  mask;
62
- inputPlaceholder;
49
+ inputPlaceHolderI18nKey;
63
50
  showSignControl;
51
+ maskitoPlaceholder;
52
+ hasFocus = false;
64
53
  get disabled() {
65
54
  return this.readonly || this.formControl.disabled;
66
55
  }
@@ -70,13 +59,19 @@ export class MatLatLongField {
70
59
  pattern;
71
60
  required = false;
72
61
  floatLabel = 'auto';
73
- appearance;
74
62
  placeholder;
75
63
  tabindex;
76
64
  defaultSign;
77
65
  maxDecimals = LAT_LONG_DEFAULT_MAX_DECIMALS;
78
- placeholderChar = EMPTY_PLACEHOLDER_CHAR;
66
+ placeholderChar;
79
67
  autofocus = false;
68
+ mobile;
69
+ set appearance(value) {
70
+ this._appearance = value;
71
+ }
72
+ get appearance() {
73
+ return this._appearance || this._defaultAppearance;
74
+ }
80
75
  set readonly(value) {
81
76
  this._readonly = value;
82
77
  this.markForCheck();
@@ -84,46 +79,53 @@ export class MatLatLongField {
84
79
  get readonly() {
85
80
  return this._readonly;
86
81
  }
87
- get subscriptSizing() {
88
- return this._subscriptSizing || this._defaults?.subscriptSizing;
89
- }
90
82
  set subscriptSizing(value) {
91
- this._subscriptSizing = value || this._defaults?.subscriptSizing || DEFAULT_SUBSCRIPT_SIZING;
83
+ this._subscriptSizing = value;
84
+ }
85
+ get subscriptSizing() {
86
+ return this._subscriptSizing || this._defaultSubscriptSizing;
92
87
  }
93
88
  onBlur = new EventEmitter();
94
89
  onFocus = new EventEmitter();
95
90
  inputElement;
96
- matError;
97
- constructor(formBuilder, cd, formGroupDir, _defaults) {
91
+ constructor(formBuilder, cd, translate, formGroupDir, defaultOptions) {
98
92
  this.formBuilder = formBuilder;
99
93
  this.cd = cd;
94
+ this.translate = translate;
100
95
  this.formGroupDir = formGroupDir;
101
- this._defaults = _defaults;
96
+ this._defaultSubscriptSizing = defaultOptions?.subscriptSizing || MAT_FORM_FIELD_DEFAULT_SUBSCRIPT_SIZING;
97
+ this._defaultAppearance = defaultOptions?.appearance || MAT_FORM_FIELD_DEFAULT_APPEARANCE;
102
98
  }
103
99
  ngOnInit() {
100
+ this.mobile = this.mobile ?? isMobile(window);
101
+ if (isNil(this.placeholderChar)) {
102
+ this.placeholderChar = this.mobile ? SPACE_PLACEHOLDER_CHAR : '';
103
+ }
104
104
  this.type = this.type || 'latitude';
105
105
  this.pattern = this.pattern || 'DDMM';
106
- this.mask = MASKS[this.type] && MASKS[this.type][this.pattern];
106
+ this.mask = MASKS[this.type]?.[this.pattern];
107
107
  if (!this.mask) {
108
- console.error('Invalid attribute value. Expected: type: \'latitude|longitude\' and latlongPattern: \'DD|DDMM|DDMMSS\'');
108
+ console.error("Invalid attribute value. Expected: type: 'latitude|longitude' and latlongPattern: 'DD|DDMM|DDMMSS'");
109
109
  this.type = 'latitude';
110
110
  this.pattern = 'DDMM';
111
111
  this.mask = MASKS[this.type][this.pattern];
112
112
  }
113
- // Remove max decimals in the DDMMSS format
113
+ // Ensure maxDecimals has correct value depending on pattern and it's own value
114
114
  if (this.pattern === 'DD') {
115
- console.warn(`Invalid attribute 'maxDecimals' - Must be '0' when using the 'DDMMSS' pattern.`);
115
+ if (this.maxDecimals != 7)
116
+ console.warn(`Force 'maxDecimals' to be '7' when using the 'DD' pattern.`);
116
117
  this.maxDecimals = 7;
117
118
  }
118
- else if (this.pattern === 'DDMMSS') {
119
- console.warn(`Invalid attribute 'maxDecimals' - Must be '0' when using the 'DDMMSS' pattern.`);
120
- this.maxDecimals = 0;
119
+ else if (this.pattern === 'DDMM') {
120
+ if (this.maxDecimals != 2)
121
+ console.warn(`Force 'maxDecimals' to be '2' when using the 'DDMMSS' pattern.`);
122
+ this.maxDecimals = 3;
121
123
  }
122
124
  else if (isNil(this.maxDecimals)) {
123
125
  this.maxDecimals = DEFAULT_MAX_DECIMALS;
124
126
  }
125
127
  else if (this.maxDecimals < 0) {
126
- console.error('Invalid attribute \'maxDecimals\'. Must a positive value.');
128
+ console.error("Invalid attribute 'maxDecimals'. Must a positive value.");
127
129
  this.maxDecimals = DEFAULT_MAX_DECIMALS;
128
130
  }
129
131
  else if (this.maxDecimals !== DEFAULT_MAX_DECIMALS) {
@@ -131,36 +133,41 @@ export class MatLatLongField {
131
133
  this.maxDecimals = DEFAULT_MAX_DECIMALS;
132
134
  }
133
135
  this.showSignControl = this.pattern !== 'DD';
134
- this._formatFn = this.type === 'latitude' ? formatLatitude : formatLongitude;
135
- this._formatOptions = { pattern: this.pattern, maxDecimals: this.maxDecimals, hideSign: this.showSignControl };
136
- this.inputPlaceholder = 'COMMON.LAT_LONG.' + (this.type === 'longitude' && 'D' || '') + this.pattern + '_PLACEHOLDER';
136
+ this._formatOptions = {
137
+ pattern: this.pattern,
138
+ maxDecimals: this.maxDecimals,
139
+ hideSign: this.showSignControl,
140
+ inputSelectionRanges: getInputSelectionRangesFromMask(this.mask),
141
+ placeholderChar: this.placeholderChar,
142
+ };
143
+ this.inputPlaceHolderI18nKey = 'COMMON.LAT_LONG.' + ((this.type === 'longitude' && 'D') || '') + this.pattern + '_PLACEHOLDER';
137
144
  this.textFormControl = this.formBuilder.control(this.required ? [null, Validators.required] : [null]);
138
145
  this.signFormControl = this.formBuilder.control(this.required ? [null, Validators.required] : [null]);
139
- this.formControl = this.formControl || this.formControlName && this.formGroupDir && this.formGroupDir.form.get(this.formControlName);
146
+ this.formControl =
147
+ this.formControl || (this.formControlName && this.formGroupDir && this.formGroupDir.form.get(this.formControlName));
140
148
  if (!this.formControl)
141
- throw new Error('Missing mandatory attribute \'formControl\' or \'formControlName\' in <mat-latlong-field>.');
149
+ throw new Error("Missing mandatory attribute 'formControl' or 'formControlName' in <mat-latlong-field>.");
142
150
  const existingValidators = this.formControl.validator;
143
151
  if (existingValidators) {
144
- this.formControl.setValidators([
145
- existingValidators,
146
- this.type === 'latitude' ? SharedValidators.latitude : SharedValidators.longitude
147
- ]);
152
+ this.formControl.setValidators([existingValidators, this.type === 'latitude' ? SharedValidators.latitude : SharedValidators.longitude]);
148
153
  }
149
154
  else {
150
155
  this.formControl.setValidators(this.type === 'latitude' ? SharedValidators.latitude : SharedValidators.longitude);
151
156
  }
152
- this._subscription.add(merge(this.textFormControl.valueChanges, this.signFormControl.valueChanges)
153
- .subscribe((_) => this.onFormChange()));
157
+ this._subscription.add(this.signFormControl.valueChanges.subscribe(() => {
158
+ const strValue = this.textFormControl.value;
159
+ const parsedValue = this.parseValue(strValue);
160
+ // TODO Need to check this or delegate the work on validator
161
+ // if (this.formControl.valid) {
162
+ // }
163
+ this.formControl.patchValue(parsedValue, { emitEvent: false });
164
+ }));
154
165
  // Listen status changes (when done outside the component - e.g. when setErrors() is calling on the formControl)
155
166
  this._subscription.add(this.formControl.statusChanges
156
- .pipe(filter((_) => !this.readonly && !this._writing && !this._disabling) // Skip
167
+ .pipe(filter(() => !this.readonly && !this._writing && !this._disabling) // Skip
157
168
  )
158
- .subscribe((_) => this.markForCheck()));
159
- }
160
- _getDisplayedMessages() {
161
- return (this.formControl.touched && this.formControl.invalid && this.formControl.errors) || this.matError
162
- ? 'error'
163
- : 'hint';
169
+ .subscribe(() => this.markForCheck()));
170
+ this._subscription.add(this.translate.get(this.inputPlaceHolderI18nKey).subscribe((translation) => this.updateTranslations(translation)));
164
171
  }
165
172
  ngOnDestroy() {
166
173
  this._subscription.unsubscribe();
@@ -168,17 +175,28 @@ export class MatLatLongField {
168
175
  writeValue(obj) {
169
176
  if (this._writing)
170
177
  return;
171
- const value = (typeof obj === 'string') ? parseFloat(obj.replace(/,/g, '.')) : obj;
172
178
  this._writing = true;
173
- const strValue = this._formatFn(value, { ...this._formatOptions, placeholderChar: this.placeholderChar });
174
- const sign = isNotNil(value) ? (value < 0 ? -1 : 1) :
175
- // Use default sign, if any
176
- (this.defaultSign ? (this.defaultSign === '-' ? -1 : 1) : null);
177
- // DEBUG
178
- // console.debug("strValue: " + strValue)
179
- // console.debug("sign: " + sign)
180
- this.textFormControl.patchValue(strValue, { emitEvent: false });
179
+ const value = typeof obj === 'string' ? parseFloat(obj.replace(/,/g, '.')) : obj;
180
+ const fixLatLong = this.formControl.valid;
181
+ const strValue = this._format(value, { fixLatLong });
182
+ const sign = isNotNil(value)
183
+ ? value < 0
184
+ ? -1
185
+ : 1
186
+ : // Use default sign, if any
187
+ this.defaultSign
188
+ ? this.defaultSign === '-'
189
+ ? -1
190
+ : 1
191
+ : null;
181
192
  this.signFormControl.patchValue(sign, { emitEvent: false });
193
+ if (value === null) {
194
+ // Reset the field
195
+ this.textFormControl.patchValue(null, { emitEvent: false });
196
+ }
197
+ else {
198
+ this.textFormControl.patchValue(strValue, { emitEvent: false });
199
+ }
182
200
  this._writing = false;
183
201
  this.markForCheck();
184
202
  }
@@ -203,194 +221,117 @@ export class MatLatLongField {
203
221
  this._disabling = false;
204
222
  this.markForCheck();
205
223
  }
206
- /**
207
- * Format value to display as string (no placeholder char, and show sign)
208
- *
209
- * @param value
210
- * @param opts
211
- */
212
- _format(value, opts) {
213
- return this._formatFn(value, {
214
- ...this._formatOptions, hideSign: false, placeholderChar: ''
215
- });
216
- }
217
224
  _onFocus(event) {
218
- // Apply the default sign, when pattern is DD and field is empty
219
- const value = this.formControl.value;
220
- if (isNilOrNaN(value)) {
221
- if (this.defaultSign) {
222
- // Compute the text value, using the default sign
223
- const defaultSign = this.defaultSign === '-' ? -1 : 1;
224
- if (this.pattern === 'DD') {
225
- let valueStr = this._formatFn(defaultSign, { ...this._formatOptions, placeholderChar: this.placeholderChar });
226
- // Keep only the sign ('+' or '-') and placeholder chars, but NOT the '1'
227
- valueStr = valueStr && valueStr.replace('1', this.placeholderChar);
228
- // Wait end of focus animation (label should move to top)
229
- setTimeout(() => {
230
- // Set the value
231
- this.inputElement.nativeElement.value = valueStr;
232
- // Move cursor after the sign
233
- const caretIndex = (this.type === 'latitude') ? 2 : 1;
234
- selectInputRange(event.target, caretIndex);
235
- }, 250);
236
- }
237
- else {
238
- this.signFormControl.setValue(defaultSign);
239
- }
225
+ this.hasFocus = true;
226
+ const fixLatLong = this.formControl.valid;
227
+ let strValue = formatLatLong(this.formControl.value, this.type, { ...this._formatOptions, placeholderChar: '0', fixLatLong }) ?? this.maskitoPlaceholder;
228
+ if (strValue.startsWith('±')) {
229
+ strValue = strValue.replace('±', this.defaultSign);
230
+ if (this.type === 'latitude') {
231
+ this.textFormControl.setValue(strValue + ' ');
232
+ }
233
+ else {
234
+ this.textFormControl.setValue(strValue);
240
235
  }
241
236
  }
242
- // Select the content (if there is a value)
243
- else {
244
- selectInputContent(event);
245
- }
237
+ this.textFormControl.setValue(strValue);
246
238
  this.onFocus.emit(event);
247
239
  return true;
248
240
  }
249
241
  _onBlur(event) {
250
- const touched = this.checkIfTouched();
251
- if (touched && isNil(this.formControl?.value)) {
252
- this.inputElement.nativeElement.value = '';
242
+ this.hasFocus = false;
243
+ let strValue = this.textFormControl.value;
244
+ // Reset mask if value is empty
245
+ if (!/\d/.test(strValue)) {
246
+ strValue = null;
253
247
  }
248
+ const parsedValue = this.parseValue(strValue);
249
+ this.formControl.markAsTouched();
250
+ this.formControl.patchValue(parsedValue, { emitEvent: false });
254
251
  this.onBlur.emit(event);
255
252
  }
256
- moveCaretToSeparator(event, forward) {
257
- // Move to the space separator
258
- return moveInputCaretToSeparator(event, ' ', forward);
253
+ _format(value, opts = {}) {
254
+ return formatLatLong(value, this.type, { ...this._formatOptions, ...opts }) ?? this.maskitoPlaceholder;
259
255
  }
260
- onKeypress(event) {
261
- // Number entered or one of the 4 direction up, down, left and right
262
- if ((event.which >= 48 && event.which <= 57) || (event.which >= 37 && event.which <= 40)) {
263
- //console.debug('input number entered :' + event.which + ' ' + event.keyCode + ' ' + event.charCode);
264
- // OK
265
- }
266
- // Decimal separator entered
267
- else if (event.key === '.' || event.key === ',') {
268
- // DEBUG
269
- // console.debug('input decimal separator entered :' + event.code);
270
- // Move caret after point
271
- moveInputCaretToSeparator(event, '.');
272
- // OK
273
- }
274
- else {
275
- // Command entered (delete, backspace or one of the 4 direction up, down, left and right)
276
- if ((event.keyCode >= 37 && event.keyCode <= 40) || event.keyCode === 46 || event.which === 8 || event.keyCode === 9) {
277
- // DEBUG
278
- //console.debug('input command entered:' + event.which + ' ' + event.keyCode + ' ' + event.charCode);
279
- // OK
280
- }
281
- // Sign entered ('+' or '-')
282
- else if (event.keyCode === 43 || event.keyCode === 45) {
283
- // DEBUG
284
- // console.debug('input sign entered:' + event.which + ' ' + event.keyCode + ' ' + event.charCode);
285
- const caretPosition = getCaretPosition(event.target);
286
- if (this.pattern === 'DD' && caretPosition > 0) {
287
- const sign = event.key;
288
- // Wait key apply
289
- const value = this.inputElement.nativeElement.value;
290
- if (value && !value.startsWith(sign)) {
291
- const newValue = sign + (value.length > 1 ? value.substr(1) : '');
292
- // DEBUG
293
- // console.debug("sign entered. Updating input value to:", newValue);
294
- this.inputElement.nativeElement.value = newValue;
295
- selectInputRange(this.inputElement.nativeElement, caretPosition);
256
+ /* -- private method -- */
257
+ updateTranslations(translation) {
258
+ // No change
259
+ if (this.maskitoPlaceholder === translation)
260
+ return;
261
+ // Translation fallback
262
+ if (this.inputPlaceHolderI18nKey === translation) {
263
+ switch (this.pattern) {
264
+ case 'DD':
265
+ if (this.type === 'longitude') {
266
+ this.maskitoPlaceholder = '±DDD.DDDDDDD°';
296
267
  }
297
- event.preventDefault();
298
- }
299
- // OK
300
- }
301
- // Direction char (capitalized)
302
- else if (event.key === 'N' || event.key === 'S' || event.key === 'E' || event.key === 'W') {
303
- // DEBUG
304
- // console.debug('input direction entered:' + event.which + ' ' + event.keyCode + ' ' + event.charCode);
305
- // OK
306
- }
307
- // Direction char
308
- else if (event.key === 'n' || event.key === 's' || event.key === 'e' || event.key === 'w') {
309
- // DEBUG
310
- // console.debug('input direction entered:' + event.which + ' ' + event.keyCode + ' ' + event.charCode);
311
- // Capitalize (with a delay, to be sure the key has been applied to input text)
312
- setTimeout(() => {
313
- this.inputElement.nativeElement.value = this.inputElement.nativeElement.value.toUpperCase();
314
- }, 10);
315
- // OK
316
- }
317
- // Any other keyboard events
318
- else {
319
- // DEBUG
320
- //console.debug('input not number entered :' + event.which + ' ' + event.keyCode + ' ' + event.charCode + ' ' + event.code );
321
- // KO: cancel the event
322
- event.preventDefault();
268
+ else {
269
+ this.maskitoPlaceholder = '± DD.DDDDDDD°';
270
+ }
271
+ break;
272
+ case 'DDMM':
273
+ if (this.type === 'longitude') {
274
+ this.maskitoPlaceholder = "DDD° MM.MMM'";
275
+ }
276
+ else {
277
+ this.maskitoPlaceholder = "DD° MM.MMM'";
278
+ }
279
+ break;
280
+ case 'DDMMSS':
281
+ if (this.type === 'longitude') {
282
+ this.maskitoPlaceholder = 'DDD° MM\' SS.SS"';
283
+ }
284
+ else {
285
+ this.maskitoPlaceholder = 'DD° MM\' SS.SS"';
286
+ }
287
+ break;
323
288
  }
289
+ return;
324
290
  }
291
+ this.maskitoPlaceholder = translation;
325
292
  }
326
- onFormChange() {
327
- if (this._writing)
328
- return; // Skip if call by self
329
- this._writing = true;
330
- let strValue = this.textFormControl.value;
331
- if (this.textFormControl.invalid || this.signFormControl.invalid) {
332
- this.formControl.markAsPending();
333
- this.formControl.setErrors({
334
- ...this.formControl.errors,
335
- ...this.textFormControl.errors,
336
- ...this.signFormControl.errors
337
- });
338
- if (this.textFormControl.dirty || this.signFormControl.dirty) {
339
- this.formControl.markAsDirty();
293
+ parseValue(strValue) {
294
+ let parsedValue;
295
+ if (isNotNilOrBlank(strValue)) {
296
+ if (this.pattern === 'DD') {
297
+ parsedValue = parseLatitudeOrLongitude(strValue, this.pattern, 7);
298
+ }
299
+ else {
300
+ const sign = this.signFormControl.value || this.defaultSign === '-' ? -1 : 1;
301
+ parsedValue = sign * parseLatitudeOrLongitude(strValue, this.pattern, 7);
340
302
  }
341
- this._writing = false;
342
- return;
343
303
  }
344
- const parsedValue = isNotNilOrBlank(strValue) ? parseLatitudeOrLongitude(strValue, this.pattern, 7 /*=precision of the converted double value */, this.placeholderChar) : null;
345
- // DEBUG
346
- //console.debug('parsedValue=', parsedValue);
347
- if (isNaN(parsedValue)) {
348
- this.formControl.markAsPending();
349
- this.formControl.setErrors(this.type === 'latitude' ? { latitude: true } : { longitude: true });
350
- // TODO Dirty fix : treat this error with a validator
351
- this.textFormControl.setErrors(this.type === 'latitude' ? { latitude: true } : { longitude: true });
352
- this._writing = false;
353
- return;
304
+ else {
305
+ parsedValue = null;
354
306
  }
355
- const sign = (this.pattern === 'DD') ? 1 /*ignore sign*/ : (this.signFormControl.value || 1);
356
- const value = isNotNil(parsedValue) ? sign * parsedValue : null;
357
- // Get the model value
358
- //console.debug("[mat-latlon] Setting value {" + value + "} parsed from {" + strValue + "}");
359
- this.formControl.patchValue(value, { emitEvent: false });
360
- this._writing = false;
361
- this.markForCheck();
362
- this._onChangeCallback(value);
363
- }
364
- checkIfTouched() {
365
- if (this.formControl.touched || this.textFormControl.touched) {
366
- this.markForCheck();
367
- this._onTouchedCallback();
368
- return true;
307
+ if (this.pattern !== 'DD' && parsedValue !== null) {
308
+ const sign = this.signFormControl.value;
309
+ parsedValue = sign * Math.abs(parsedValue);
369
310
  }
370
- return false;
311
+ return parsedValue;
371
312
  }
372
313
  markForCheck() {
373
314
  this.cd.markForCheck();
374
315
  }
375
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: MatLatLongField, deps: [{ token: i1.UntypedFormBuilder }, { token: i0.ChangeDetectorRef }, { token: i1.FormGroupDirective, optional: true }, { token: MAT_FORM_FIELD_DEFAULT_OPTIONS }], target: i0.ɵɵFactoryTarget.Component });
376
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.6", type: MatLatLongField, selector: "mat-latlong-field", inputs: { formControl: "formControl", formControlName: "formControlName", type: "type", pattern: ["latLongPattern", "pattern"], required: "required", floatLabel: "floatLabel", appearance: "appearance", placeholder: "placeholder", tabindex: "tabindex", defaultSign: "defaultSign", maxDecimals: "maxDecimals", placeholderChar: "placeholderChar", autofocus: "autofocus", readonly: "readonly", subscriptSizing: "subscriptSizing" }, outputs: { onBlur: "onBlur", onFocus: "onFocus" }, providers: [
316
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: MatLatLongField, deps: [{ token: i1.UntypedFormBuilder }, { token: i0.ChangeDetectorRef }, { token: i2.TranslateService }, { token: i1.FormGroupDirective, optional: true }, { token: MAT_FORM_FIELD_DEFAULT_OPTIONS }], target: i0.ɵɵFactoryTarget.Component });
317
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.8", type: MatLatLongField, selector: "mat-latlong-field", inputs: { formControl: "formControl", formControlName: "formControlName", type: "type", pattern: ["latLongPattern", "pattern"], required: "required", floatLabel: "floatLabel", placeholder: "placeholder", tabindex: "tabindex", defaultSign: "defaultSign", maxDecimals: "maxDecimals", placeholderChar: "placeholderChar", autofocus: "autofocus", mobile: ["mobile", "mobile", booleanAttribute], appearance: "appearance", readonly: "readonly", subscriptSizing: "subscriptSizing" }, outputs: { onBlur: "onBlur", onFocus: "onFocus" }, providers: [
377
318
  {
378
319
  provide: NG_VALUE_ACCESSOR,
379
320
  multi: true,
380
321
  useExisting: forwardRef(() => MatLatLongField),
381
- }
382
- ], queries: [{ propertyName: "matError", first: true, predicate: MatError, descendants: true }], viewQueries: [{ propertyName: "inputElement", first: true, predicate: ["inputElement"], descendants: true }], ngImport: i0, template: "<!-- readonly -->\n<mat-form-field *ngIf=\"readonly; else writable\"\n [floatLabel]=\"floatLabel | asFloatLabelType\"\n [appearance]=\"appearance\"\n class=\"mat-form-field-disabled\">\n\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n\n <mat-label *ngIf=\"floatLabel !== 'never' && !!placeholder\">{{placeholder}}</mat-label>\n\n <input matInput hidden type=\"text\"\n readonly\n [formControl]=\"formControl\">\n <ion-text>{{_format(formControl.value) }}</ion-text>\n\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n</mat-form-field>\n\n<!-- writable -->\n<ng-template #writable>\n\n <ion-grid class=\"ion-no-padding\" [class.fill]=\"appearance !== 'outline'\">\n <ion-row class=\"ion-no-padding no-wrap\">\n\n <ion-col class=\"text ion-no-padding\">\n <mat-form-field [floatLabel]=\"floatLabel | asFloatLabelType\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"'dynamic'\"\n [class.mdc-text-field--invalid]=\"formControl.touched && (signFormControl.invalid || formControl.invalid)\">\n\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n\n <mat-label *ngIf=\"floatLabel !== 'never' && !!placeholder\">{{placeholder}}</mat-label>\n\n <!--\n // TODO Normally, this is no longer required since we started using maskito\n (focus)=\"_onFocus($event)\"\n (keydown.tab)=\"moveCaretToSeparator($event, true)\"\n (keydown.shift.tab)=\"moveCaretToSeparator($event, false)\"\n -->\n <input matInput #inputElement\n [maskito]=\"inputPlaceholder|translate|maskitoPlaceholder:mask:(!showSignControl && defaultSign)\"\n type=\"text\"\n autocomplete=\"off\"\n [placeholder]=\"inputPlaceholder|translate\"\n (blur)=\"_onBlur($event)\"\n [formControl]=\"textFormControl\"\n [required]=\"required\"\n [tabindex]=\"tabindex\"\n [appAutofocus]=\"autofocus\">\n\n <div matSuffix *ngIf=\"!showSignControl\">\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n\n </mat-form-field>\n </ion-col>\n\n <!-- sign -->\n <ion-col class=\"sign ion-no-padding\" [ngSwitch]=\"type\" *ngIf=\"showSignControl\">\n\n <!-- sign on latitude -->\n <mat-form-field *ngSwitchCase=\"'latitude'\"\n [floatLabel]=\"floatLabel | asFloatLabelType\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"'dynamic'\"\n [class.mdc-text-field--invalid]=\"formControl.touched && signFormControl.invalid\">\n <mat-label *ngIf=\"placeholder && floatLabel !== 'never'\" translate>COMMON.LAT_LONG.LAT_SIGN_PLACEHOLDER</mat-label>\n\n <mat-select [formControl]=\"signFormControl\"\n [tabindex]=\"tabindex !== undefined ? tabindex+1 : undefined\">\n <mat-option [value]=\"1\">{{'COMMON.LAT_LONG.LAT_SIGN_N'|translate}}</mat-option>\n <mat-option [value]=\"-1\" >{{'COMMON.LAT_LONG.LAT_SIGN_S'|translate}}</mat-option>\n </mat-select>\n\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n </mat-form-field>\n\n <!-- sign on longitude -->\n <mat-form-field *ngSwitchCase=\"'longitude'\"\n [floatLabel]=\"floatLabel | asFloatLabelType\"\n [appearance]=\"appearance\"\n [class.mdc-text-field--invalid]=\"formControl.touched && signFormControl.invalid\">\n <mat-label *ngIf=\"placeholder && floatLabel !== 'never'\" translate>COMMON.LAT_LONG.LONG_SIGN_PLACEHOLDER</mat-label>\n\n <mat-select [formControl]=\"signFormControl\"\n [tabindex]=\"tabindex !== undefined ? tabindex+1 : undefined\">\n <mat-option [value]=\"1\" translate>{{'COMMON.LAT_LONG.LONG_SIGN_E'|translate}}</mat-option>\n <mat-option [value]=\"-1\" translate>{{'COMMON.LAT_LONG.LONG_SIGN_W'|translate}}</mat-option>\n </mat-select>\n\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n </mat-form-field>\n </ion-col>\n </ion-row>\n </ion-grid>\n\n <!-- Do the same as MatFromField since angular 15 (see component source)-->\n <div class=\"mat-mdc-form-field-subscript-wrapper mat-mdc-form-field-bottom-align\"\n [class.mat-mdc-form-field-subscript-dynamic-size]=\"subscriptSizing === 'dynamic'\"\n [ngSwitch]=\"_getDisplayedMessages()\">\n <div class=\"mat-mdc-form-field-error-wrapper\"\n *ngSwitchCase=\"'error'\">\n <!-- errors -->\n <mat-error *ngIf=\"formControl.touched && formControl.invalid && formControl.errors|mapKeys|arrayFirst; let errorKey ; else parentError\"\n [ngSwitch]=\"errorKey\">\n <span *ngSwitchCase=\"'required'\" translate>ERROR.FIELD_REQUIRED</span>\n <span *ngSwitchCase=\"'latitude'\" translate>ERROR.FIELD_NOT_VALID_LATITUDE</span>\n <span *ngSwitchCase=\"'longitude'\" translate>ERROR.FIELD_NOT_VALID_LONGITUDE</span>\n <span *ngSwitchCase=\"'min'\">{{'ERROR.FIELD_MIN_COMPACT'|translate: {min: _format(formControl.errors.min.min) } }}</span>\n <span *ngSwitchCase=\"'max'\">{{'ERROR.FIELD_MAX_COMPACT'|translate: {max: _format(formControl.errors.max.max) } }}</span>\n <span *ngSwitchCase=\"'msg'\">{{(formControl.errors.msg?.key || formControl.errors.msg) | translate: formControl.errors.msg?.params}}</span>\n </mat-error>\n <ng-template #parentError>\n <ng-content select=\"mat-error\"></ng-content>\n </ng-template>\n </div>\n <div class=\"mat-mdc-form-field-hint-wrapper\" *ngSwitchCase=\"'hint'\">\n <ng-content select=\"mat-hint:not([align='end'])\"></ng-content>\n <div class=\"mat-mdc-form-field-hint-spacer\"></div>\n <ng-content select=\"mat-hint[align='end']\"></ng-content>\n </div>\n </div>\n\n</ng-template>\n\n<ng-template #matPrefixTemplate>\n <ng-content select=\"[matPrefix]\"></ng-content>\n</ng-template>\n\n\n<ng-template #matSuffixTemplate>\n <ng-content select=\"[matSuffix]\"></ng-content>\n</ng-template>\n", styles: [":host{display:inline-block;width:100%;min-width:140px;position:relative;--ion-grid-column-padding: 0}mat-form-field .datetime-md{padding:0!important}ion-row.no-wrap{flex-wrap:nowrap}ion-grid.fill ion-col.text{min-width:185px}ion-grid.fill ion-col.sign{min-width:85px;max-width:85px}mat-form-field{width:100%}.sign mat-form-field.mat-mdc-form-field-should-float .mat-mdc-form-field-placeholder{max-width:inherit}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i2.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "component", type: i3.IonCol, selector: "ion-col", inputs: ["offset", "offsetLg", "offsetMd", "offsetSm", "offsetXl", "offsetXs", "pull", "pullLg", "pullMd", "pullSm", "pullXl", "pullXs", "push", "pushLg", "pushMd", "pushSm", "pushXl", "pushXs", "size", "sizeLg", "sizeMd", "sizeSm", "sizeXl", "sizeXs"] }, { kind: "component", type: i3.IonGrid, selector: "ion-grid", inputs: ["fixed"] }, { kind: "component", type: i3.IonRow, selector: "ion-row" }, { kind: "component", type: i3.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i4.AutofocusDirective, selector: "[autofocus], input[appAutofocus]", inputs: ["appAutofocus", "autofocusDelay"] }, { kind: "component", type: i5.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i5.MatLabel, selector: "mat-label" }, { kind: "directive", type: i5.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i5.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i5.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i6.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: "directive", type: i7.MaskitoDirective, selector: "[maskito]", inputs: ["maskito", "maskitoElement"] }, { kind: "directive", type: i7.MaskitoCva, selector: "input[maskito], textarea[maskito]", inputs: ["maskito"] }, { kind: "component", type: i8.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex", "aria-describedby", "panelClass", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i9.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "directive", type: i10.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "pipe", type: i11.ArrayFirstPipe, name: "arrayFirst" }, { kind: "pipe", type: i12.MapKeysPipe, name: "mapKeys" }, { kind: "pipe", type: i13.AsFloatLabelTypePipe, name: "asFloatLabelType" }, { kind: "pipe", type: i14.MaskitoPlaceholderPipe, name: "maskitoPlaceholder" }, { kind: "pipe", type: i10.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
322
+ },
323
+ ], viewQueries: [{ propertyName: "inputElement", first: true, predicate: ["inputElement"], descendants: true }], ngImport: i0, template: "<!-- readonly -->\n<mat-form-field\n *ngIf=\"readonly; else writable\"\n [floatLabel]=\"floatLabel | asFloatLabelType\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"subscriptSizing\"\n class=\"mat-form-field-disabled\"\n>\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n\n @if (floatLabel !== 'never' && !!placeholder) {\n <mat-label>{{ placeholder }}</mat-label>\n }\n\n <input matInput hidden type=\"text\" readonly [formControl]=\"formControl\" />\n <ion-text>{{ _format(formControl.value) }}</ion-text>\n\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n\n <!-- hints -->\n <mat-hint [class.cdk-visually-hidden]=\"formControl.invalid\">\n <ng-container *ngTemplateOutlet=\"matHintTemplate\"></ng-container>\n </mat-hint>\n</mat-form-field>\n\n<!-- writable -->\n<ng-template #writable>\n <ion-grid class=\"ion-no-padding {{ appearance }}\">\n <ion-row class=\"ion-no-padding no-wrap\">\n <ion-col class=\"text ion-no-padding\">\n <mat-form-field\n [floatLabel]=\"floatLabel | asFloatLabelType\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"'dynamic'\"\n [class.mdc-text-field--invalid]=\"formControl.touched && (signFormControl.invalid || formControl.invalid)\"\n >\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n\n <mat-label *ngIf=\"floatLabel !== 'never' && !!placeholder\">{{ placeholder }}</mat-label>\n\n <input\n matInput\n #inputElement\n [maskito]=\"maskitoPlaceholder | maskitoPlaceholder: mask\"\n type=\"text\"\n autocomplete=\"off\"\n [placeholder]=\"placeholder\"\n (blur)=\"_onBlur($event)\"\n (focus)=\"_onFocus($event)\"\n [formControl]=\"textFormControl\"\n [required]=\"required\"\n [tabindex]=\"tabindex\"\n [appAutofocus]=\"autofocus\"\n />\n\n @if (!showSignControl) {\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n }\n </mat-form-field>\n </ion-col>\n\n <!-- sign -->\n @if (showSignControl) {\n <ion-col class=\"sign ion-no-padding {{ type }}\">\n @switch (type) {\n @case ('latitude') {\n <!-- sign on latitude -->\n <mat-form-field\n [appearance]=\"appearance\"\n [subscriptSizing]=\"'dynamic'\"\n [class.mdc-text-field--invalid]=\"formControl.touched && signFormControl.invalid\"\n >\n <mat-select\n [formControl]=\"signFormControl\"\n [placeholder]=\"'COMMON.LAT_LONG.LAT_SIGN_PLACEHOLDER' | translate\"\n [tabindex]=\"tabindex !== undefined ? tabindex + 1 : undefined\"\n >\n <mat-option [value]=\"1\">{{ 'COMMON.LAT_LONG.LAT_SIGN_N' | translate }}</mat-option>\n <mat-option [value]=\"-1\">{{ 'COMMON.LAT_LONG.LAT_SIGN_S' | translate }}</mat-option>\n </mat-select>\n\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n </mat-form-field>\n }\n @case ('longitude') {\n <!-- sign on longitude -->\n <mat-form-field\n [appearance]=\"appearance\"\n [subscriptSizing]=\"'dynamic'\"\n [class.mdc-text-field--invalid]=\"formControl.touched && signFormControl.invalid\"\n >\n <mat-select\n [formControl]=\"signFormControl\"\n [placeholder]=\"'COMMON.LAT_LONG.LONG_SIGN_PLACEHOLDER' | translate\"\n [tabindex]=\"tabindex !== undefined ? tabindex + 1 : undefined\"\n >\n <mat-option [value]=\"1\" translate>{{ 'COMMON.LAT_LONG.LONG_SIGN_E' | translate }}</mat-option>\n <mat-option [value]=\"-1\" translate>{{ 'COMMON.LAT_LONG.LONG_SIGN_W' | translate }}</mat-option>\n </mat-select>\n\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n </mat-form-field>\n }\n }\n </ion-col>\n }\n </ion-row>\n </ion-grid>\n\n <!-- Do the same as MatFromField since angular 15 (see component source)-->\n <div\n class=\"mat-mdc-form-field-subscript-wrapper\"\n [class.mat-mdc-form-field-bottom-align]=\"subscriptSizing === 'fixed'\"\n [class.mat-mdc-form-field-subscript-dynamic-size]=\"subscriptSizing === 'dynamic'\"\n >\n @if (formControl.touched && formControl.invalid) {\n <!-- errors -->\n <div class=\"mat-mdc-form-field-error-wrapper\">\n @if (formControl.errors | mapKeys | arrayFirst; as errorKey) {\n @switch (errorKey) {\n @case ('required') {\n <mat-error translate>ERROR.FIELD_REQUIRED</mat-error>\n }\n @case ('latitude') {\n <mat-error translate>ERROR.FIELD_NOT_VALID_LATITUDE</mat-error>\n }\n @case ('longitude') {\n <mat-error translate>ERROR.FIELD_NOT_VALID_LONGITUDE</mat-error>\n }\n @case ('min') {\n <mat-error>\n {{ 'ERROR.FIELD_MIN_COMPACT' | translate: { min: _format(formControl.errors.min.min) } }}\n </mat-error>\n }\n @case ('max') {\n <mat-error>\n {{ 'ERROR.FIELD_MAX_COMPACT' | translate: { max: _format(formControl.errors.max.max) } }}\n </mat-error>\n }\n @case ('msg') {\n <mat-error>\n {{ formControl.errors.msg?.key || formControl.errors.msg | translate: formControl.errors.msg?.params }}\n </mat-error>\n }\n @default {\n <ng-container *ngTemplateOutlet=\"matErrorTemplate\"></ng-container>\n }\n }\n } @else {\n <ng-container *ngTemplateOutlet=\"matErrorTemplate\"></ng-container>\n }\n </div>\n } @else {\n <!-- hints -->\n <mat-hint>\n <ng-container *ngTemplateOutlet=\"matHintTemplate\"></ng-container>\n </mat-hint>\n }\n </div>\n</ng-template>\n\n<ng-template #matPrefixTemplate>\n <ng-content select=\"[matPrefix]\"></ng-content>\n</ng-template>\n\n<ng-template #matSuffixTemplate>\n <ng-content select=\"[matSuffix]\"></ng-content>\n</ng-template>\n\n<ng-template #matErrorTemplate>\n <ng-content select=\"mat-error,[matError]\"></ng-content>\n</ng-template>\n\n<ng-template #matHintTemplate>\n <div class=\"mat-mdc-form-field-hint-wrapper\">\n <ng-content select=\"mat-hint:not([align='end']),[matHint]\"></ng-content>\n <div class=\"mat-mdc-form-field-hint-spacer\"></div>\n <ng-content select=\"mat-hint[align='end']\"></ng-content>\n </div>\n</ng-template>\n", styles: [":host{display:inline-block;width:100%;min-width:140px;position:relative;--ion-grid-column-padding: 0}mat-form-field{width:100%}mat-form-field .datetime-md{padding:0!important}.sign mat-form-field.mat-mdc-form-field-should-float .mat-mdc-form-field-placeholder{max-width:inherit}ion-row.no-wrap{flex-wrap:nowrap}ion-grid ion-col.text{--min-width: 100px;min-width:var(--min-width)}ion-grid ion-col.sign{--min-width: 58px;--max-width: 65px;min-width:var(--min-width);max-width:var(--max-width)}\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i4.IonCol, selector: "ion-col", inputs: ["offset", "offsetLg", "offsetMd", "offsetSm", "offsetXl", "offsetXs", "pull", "pullLg", "pullMd", "pullSm", "pullXl", "pullXs", "push", "pushLg", "pushMd", "pushSm", "pushXl", "pushXs", "size", "sizeLg", "sizeMd", "sizeSm", "sizeXl", "sizeXs"] }, { kind: "component", type: i4.IonGrid, selector: "ion-grid", inputs: ["fixed"] }, { kind: "component", type: i4.IonRow, selector: "ion-row" }, { kind: "component", type: i4.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i5.AutofocusDirective, selector: "[autofocus], input[appAutofocus]", inputs: ["appAutofocus", "autofocusDelay"] }, { kind: "component", type: i6.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i6.MatLabel, selector: "mat-label" }, { kind: "directive", type: i6.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i6.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i6.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i6.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { 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: "directive", type: i8.MaskitoDirective, selector: "[maskito]", inputs: ["maskito", "maskitoElement"] }, { kind: "component", type: i9.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i10.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "directive", type: i2.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "pipe", type: i11.ArrayFirstPipe, name: "arrayFirst" }, { kind: "pipe", type: i12.MapKeysPipe, name: "mapKeys" }, { kind: "pipe", type: i13.AsFloatLabelTypePipe, name: "asFloatLabelType" }, { kind: "pipe", type: i14.MaskitoPlaceholderPipe, name: "maskitoPlaceholder" }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
383
324
  }
384
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: MatLatLongField, decorators: [{
325
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: MatLatLongField, decorators: [{
385
326
  type: Component,
386
327
  args: [{ selector: 'mat-latlong-field', providers: [
387
328
  {
388
329
  provide: NG_VALUE_ACCESSOR,
389
330
  multi: true,
390
331
  useExisting: forwardRef(() => MatLatLongField),
391
- }
392
- ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<!-- readonly -->\n<mat-form-field *ngIf=\"readonly; else writable\"\n [floatLabel]=\"floatLabel | asFloatLabelType\"\n [appearance]=\"appearance\"\n class=\"mat-form-field-disabled\">\n\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n\n <mat-label *ngIf=\"floatLabel !== 'never' && !!placeholder\">{{placeholder}}</mat-label>\n\n <input matInput hidden type=\"text\"\n readonly\n [formControl]=\"formControl\">\n <ion-text>{{_format(formControl.value) }}</ion-text>\n\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n</mat-form-field>\n\n<!-- writable -->\n<ng-template #writable>\n\n <ion-grid class=\"ion-no-padding\" [class.fill]=\"appearance !== 'outline'\">\n <ion-row class=\"ion-no-padding no-wrap\">\n\n <ion-col class=\"text ion-no-padding\">\n <mat-form-field [floatLabel]=\"floatLabel | asFloatLabelType\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"'dynamic'\"\n [class.mdc-text-field--invalid]=\"formControl.touched && (signFormControl.invalid || formControl.invalid)\">\n\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n\n <mat-label *ngIf=\"floatLabel !== 'never' && !!placeholder\">{{placeholder}}</mat-label>\n\n <!--\n // TODO Normally, this is no longer required since we started using maskito\n (focus)=\"_onFocus($event)\"\n (keydown.tab)=\"moveCaretToSeparator($event, true)\"\n (keydown.shift.tab)=\"moveCaretToSeparator($event, false)\"\n -->\n <input matInput #inputElement\n [maskito]=\"inputPlaceholder|translate|maskitoPlaceholder:mask:(!showSignControl && defaultSign)\"\n type=\"text\"\n autocomplete=\"off\"\n [placeholder]=\"inputPlaceholder|translate\"\n (blur)=\"_onBlur($event)\"\n [formControl]=\"textFormControl\"\n [required]=\"required\"\n [tabindex]=\"tabindex\"\n [appAutofocus]=\"autofocus\">\n\n <div matSuffix *ngIf=\"!showSignControl\">\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n\n </mat-form-field>\n </ion-col>\n\n <!-- sign -->\n <ion-col class=\"sign ion-no-padding\" [ngSwitch]=\"type\" *ngIf=\"showSignControl\">\n\n <!-- sign on latitude -->\n <mat-form-field *ngSwitchCase=\"'latitude'\"\n [floatLabel]=\"floatLabel | asFloatLabelType\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"'dynamic'\"\n [class.mdc-text-field--invalid]=\"formControl.touched && signFormControl.invalid\">\n <mat-label *ngIf=\"placeholder && floatLabel !== 'never'\" translate>COMMON.LAT_LONG.LAT_SIGN_PLACEHOLDER</mat-label>\n\n <mat-select [formControl]=\"signFormControl\"\n [tabindex]=\"tabindex !== undefined ? tabindex+1 : undefined\">\n <mat-option [value]=\"1\">{{'COMMON.LAT_LONG.LAT_SIGN_N'|translate}}</mat-option>\n <mat-option [value]=\"-1\" >{{'COMMON.LAT_LONG.LAT_SIGN_S'|translate}}</mat-option>\n </mat-select>\n\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n </mat-form-field>\n\n <!-- sign on longitude -->\n <mat-form-field *ngSwitchCase=\"'longitude'\"\n [floatLabel]=\"floatLabel | asFloatLabelType\"\n [appearance]=\"appearance\"\n [class.mdc-text-field--invalid]=\"formControl.touched && signFormControl.invalid\">\n <mat-label *ngIf=\"placeholder && floatLabel !== 'never'\" translate>COMMON.LAT_LONG.LONG_SIGN_PLACEHOLDER</mat-label>\n\n <mat-select [formControl]=\"signFormControl\"\n [tabindex]=\"tabindex !== undefined ? tabindex+1 : undefined\">\n <mat-option [value]=\"1\" translate>{{'COMMON.LAT_LONG.LONG_SIGN_E'|translate}}</mat-option>\n <mat-option [value]=\"-1\" translate>{{'COMMON.LAT_LONG.LONG_SIGN_W'|translate}}</mat-option>\n </mat-select>\n\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n </mat-form-field>\n </ion-col>\n </ion-row>\n </ion-grid>\n\n <!-- Do the same as MatFromField since angular 15 (see component source)-->\n <div class=\"mat-mdc-form-field-subscript-wrapper mat-mdc-form-field-bottom-align\"\n [class.mat-mdc-form-field-subscript-dynamic-size]=\"subscriptSizing === 'dynamic'\"\n [ngSwitch]=\"_getDisplayedMessages()\">\n <div class=\"mat-mdc-form-field-error-wrapper\"\n *ngSwitchCase=\"'error'\">\n <!-- errors -->\n <mat-error *ngIf=\"formControl.touched && formControl.invalid && formControl.errors|mapKeys|arrayFirst; let errorKey ; else parentError\"\n [ngSwitch]=\"errorKey\">\n <span *ngSwitchCase=\"'required'\" translate>ERROR.FIELD_REQUIRED</span>\n <span *ngSwitchCase=\"'latitude'\" translate>ERROR.FIELD_NOT_VALID_LATITUDE</span>\n <span *ngSwitchCase=\"'longitude'\" translate>ERROR.FIELD_NOT_VALID_LONGITUDE</span>\n <span *ngSwitchCase=\"'min'\">{{'ERROR.FIELD_MIN_COMPACT'|translate: {min: _format(formControl.errors.min.min) } }}</span>\n <span *ngSwitchCase=\"'max'\">{{'ERROR.FIELD_MAX_COMPACT'|translate: {max: _format(formControl.errors.max.max) } }}</span>\n <span *ngSwitchCase=\"'msg'\">{{(formControl.errors.msg?.key || formControl.errors.msg) | translate: formControl.errors.msg?.params}}</span>\n </mat-error>\n <ng-template #parentError>\n <ng-content select=\"mat-error\"></ng-content>\n </ng-template>\n </div>\n <div class=\"mat-mdc-form-field-hint-wrapper\" *ngSwitchCase=\"'hint'\">\n <ng-content select=\"mat-hint:not([align='end'])\"></ng-content>\n <div class=\"mat-mdc-form-field-hint-spacer\"></div>\n <ng-content select=\"mat-hint[align='end']\"></ng-content>\n </div>\n </div>\n\n</ng-template>\n\n<ng-template #matPrefixTemplate>\n <ng-content select=\"[matPrefix]\"></ng-content>\n</ng-template>\n\n\n<ng-template #matSuffixTemplate>\n <ng-content select=\"[matSuffix]\"></ng-content>\n</ng-template>\n", styles: [":host{display:inline-block;width:100%;min-width:140px;position:relative;--ion-grid-column-padding: 0}mat-form-field .datetime-md{padding:0!important}ion-row.no-wrap{flex-wrap:nowrap}ion-grid.fill ion-col.text{min-width:185px}ion-grid.fill ion-col.sign{min-width:85px;max-width:85px}mat-form-field{width:100%}.sign mat-form-field.mat-mdc-form-field-should-float .mat-mdc-form-field-placeholder{max-width:inherit}\n"] }]
393
- }], ctorParameters: () => [{ type: i1.UntypedFormBuilder }, { type: i0.ChangeDetectorRef }, { type: i1.FormGroupDirective, decorators: [{
332
+ },
333
+ ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<!-- readonly -->\n<mat-form-field\n *ngIf=\"readonly; else writable\"\n [floatLabel]=\"floatLabel | asFloatLabelType\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"subscriptSizing\"\n class=\"mat-form-field-disabled\"\n>\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n\n @if (floatLabel !== 'never' && !!placeholder) {\n <mat-label>{{ placeholder }}</mat-label>\n }\n\n <input matInput hidden type=\"text\" readonly [formControl]=\"formControl\" />\n <ion-text>{{ _format(formControl.value) }}</ion-text>\n\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n\n <!-- hints -->\n <mat-hint [class.cdk-visually-hidden]=\"formControl.invalid\">\n <ng-container *ngTemplateOutlet=\"matHintTemplate\"></ng-container>\n </mat-hint>\n</mat-form-field>\n\n<!-- writable -->\n<ng-template #writable>\n <ion-grid class=\"ion-no-padding {{ appearance }}\">\n <ion-row class=\"ion-no-padding no-wrap\">\n <ion-col class=\"text ion-no-padding\">\n <mat-form-field\n [floatLabel]=\"floatLabel | asFloatLabelType\"\n [appearance]=\"appearance\"\n [subscriptSizing]=\"'dynamic'\"\n [class.mdc-text-field--invalid]=\"formControl.touched && (signFormControl.invalid || formControl.invalid)\"\n >\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n\n <mat-label *ngIf=\"floatLabel !== 'never' && !!placeholder\">{{ placeholder }}</mat-label>\n\n <input\n matInput\n #inputElement\n [maskito]=\"maskitoPlaceholder | maskitoPlaceholder: mask\"\n type=\"text\"\n autocomplete=\"off\"\n [placeholder]=\"placeholder\"\n (blur)=\"_onBlur($event)\"\n (focus)=\"_onFocus($event)\"\n [formControl]=\"textFormControl\"\n [required]=\"required\"\n [tabindex]=\"tabindex\"\n [appAutofocus]=\"autofocus\"\n />\n\n @if (!showSignControl) {\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n }\n </mat-form-field>\n </ion-col>\n\n <!-- sign -->\n @if (showSignControl) {\n <ion-col class=\"sign ion-no-padding {{ type }}\">\n @switch (type) {\n @case ('latitude') {\n <!-- sign on latitude -->\n <mat-form-field\n [appearance]=\"appearance\"\n [subscriptSizing]=\"'dynamic'\"\n [class.mdc-text-field--invalid]=\"formControl.touched && signFormControl.invalid\"\n >\n <mat-select\n [formControl]=\"signFormControl\"\n [placeholder]=\"'COMMON.LAT_LONG.LAT_SIGN_PLACEHOLDER' | translate\"\n [tabindex]=\"tabindex !== undefined ? tabindex + 1 : undefined\"\n >\n <mat-option [value]=\"1\">{{ 'COMMON.LAT_LONG.LAT_SIGN_N' | translate }}</mat-option>\n <mat-option [value]=\"-1\">{{ 'COMMON.LAT_LONG.LAT_SIGN_S' | translate }}</mat-option>\n </mat-select>\n\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n </mat-form-field>\n }\n @case ('longitude') {\n <!-- sign on longitude -->\n <mat-form-field\n [appearance]=\"appearance\"\n [subscriptSizing]=\"'dynamic'\"\n [class.mdc-text-field--invalid]=\"formControl.touched && signFormControl.invalid\"\n >\n <mat-select\n [formControl]=\"signFormControl\"\n [placeholder]=\"'COMMON.LAT_LONG.LONG_SIGN_PLACEHOLDER' | translate\"\n [tabindex]=\"tabindex !== undefined ? tabindex + 1 : undefined\"\n >\n <mat-option [value]=\"1\" translate>{{ 'COMMON.LAT_LONG.LONG_SIGN_E' | translate }}</mat-option>\n <mat-option [value]=\"-1\" translate>{{ 'COMMON.LAT_LONG.LONG_SIGN_W' | translate }}</mat-option>\n </mat-select>\n\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n </mat-form-field>\n }\n }\n </ion-col>\n }\n </ion-row>\n </ion-grid>\n\n <!-- Do the same as MatFromField since angular 15 (see component source)-->\n <div\n class=\"mat-mdc-form-field-subscript-wrapper\"\n [class.mat-mdc-form-field-bottom-align]=\"subscriptSizing === 'fixed'\"\n [class.mat-mdc-form-field-subscript-dynamic-size]=\"subscriptSizing === 'dynamic'\"\n >\n @if (formControl.touched && formControl.invalid) {\n <!-- errors -->\n <div class=\"mat-mdc-form-field-error-wrapper\">\n @if (formControl.errors | mapKeys | arrayFirst; as errorKey) {\n @switch (errorKey) {\n @case ('required') {\n <mat-error translate>ERROR.FIELD_REQUIRED</mat-error>\n }\n @case ('latitude') {\n <mat-error translate>ERROR.FIELD_NOT_VALID_LATITUDE</mat-error>\n }\n @case ('longitude') {\n <mat-error translate>ERROR.FIELD_NOT_VALID_LONGITUDE</mat-error>\n }\n @case ('min') {\n <mat-error>\n {{ 'ERROR.FIELD_MIN_COMPACT' | translate: { min: _format(formControl.errors.min.min) } }}\n </mat-error>\n }\n @case ('max') {\n <mat-error>\n {{ 'ERROR.FIELD_MAX_COMPACT' | translate: { max: _format(formControl.errors.max.max) } }}\n </mat-error>\n }\n @case ('msg') {\n <mat-error>\n {{ formControl.errors.msg?.key || formControl.errors.msg | translate: formControl.errors.msg?.params }}\n </mat-error>\n }\n @default {\n <ng-container *ngTemplateOutlet=\"matErrorTemplate\"></ng-container>\n }\n }\n } @else {\n <ng-container *ngTemplateOutlet=\"matErrorTemplate\"></ng-container>\n }\n </div>\n } @else {\n <!-- hints -->\n <mat-hint>\n <ng-container *ngTemplateOutlet=\"matHintTemplate\"></ng-container>\n </mat-hint>\n }\n </div>\n</ng-template>\n\n<ng-template #matPrefixTemplate>\n <ng-content select=\"[matPrefix]\"></ng-content>\n</ng-template>\n\n<ng-template #matSuffixTemplate>\n <ng-content select=\"[matSuffix]\"></ng-content>\n</ng-template>\n\n<ng-template #matErrorTemplate>\n <ng-content select=\"mat-error,[matError]\"></ng-content>\n</ng-template>\n\n<ng-template #matHintTemplate>\n <div class=\"mat-mdc-form-field-hint-wrapper\">\n <ng-content select=\"mat-hint:not([align='end']),[matHint]\"></ng-content>\n <div class=\"mat-mdc-form-field-hint-spacer\"></div>\n <ng-content select=\"mat-hint[align='end']\"></ng-content>\n </div>\n</ng-template>\n", styles: [":host{display:inline-block;width:100%;min-width:140px;position:relative;--ion-grid-column-padding: 0}mat-form-field{width:100%}mat-form-field .datetime-md{padding:0!important}.sign mat-form-field.mat-mdc-form-field-should-float .mat-mdc-form-field-placeholder{max-width:inherit}ion-row.no-wrap{flex-wrap:nowrap}ion-grid ion-col.text{--min-width: 100px;min-width:var(--min-width)}ion-grid ion-col.sign{--min-width: 58px;--max-width: 65px;min-width:var(--min-width);max-width:var(--max-width)}\n"] }]
334
+ }], ctorParameters: () => [{ type: i1.UntypedFormBuilder }, { type: i0.ChangeDetectorRef }, { type: i2.TranslateService }, { type: i1.FormGroupDirective, decorators: [{
394
335
  type: Optional
395
336
  }] }, { type: undefined, decorators: [{
396
337
  type: Inject,
@@ -408,8 +349,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.6", ngImpor
408
349
  type: Input
409
350
  }], floatLabel: [{
410
351
  type: Input
411
- }], appearance: [{
412
- type: Input
413
352
  }], placeholder: [{
414
353
  type: Input
415
354
  }], tabindex: [{
@@ -422,6 +361,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.6", ngImpor
422
361
  type: Input
423
362
  }], autofocus: [{
424
363
  type: Input
364
+ }], mobile: [{
365
+ type: Input,
366
+ args: [{ transform: booleanAttribute }]
367
+ }], appearance: [{
368
+ type: Input
425
369
  }], readonly: [{
426
370
  type: Input
427
371
  }], subscriptSizing: [{
@@ -433,8 +377,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.6", ngImpor
433
377
  }], inputElement: [{
434
378
  type: ViewChild,
435
379
  args: ['inputElement']
436
- }], matError: [{
437
- type: ContentChild,
438
- args: [MatError]
439
380
  }] } });
440
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0ZXJpYWwubGF0bG9uZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvc2hhcmVkL21hdGVyaWFsL2xhdGxvbmcvbWF0ZXJpYWwubGF0bG9uZy50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvc2hhcmVkL21hdGVyaWFsL2xhdGxvbmcvbWF0ZXJpYWwubGF0bG9uZy5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyx1QkFBdUIsRUFBcUIsU0FBUyxFQUFFLFlBQVksRUFBYyxZQUFZLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQXFCLFFBQVEsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3ZNLE9BQU8sRUFBMkMsaUJBQWlCLEVBQTBDLFVBQVUsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQy9JLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBQzVELE9BQU8sRUFBQyxjQUFjLEVBQUUsZUFBZSxFQUFFLDZCQUE2QixFQUF5RCx3QkFBd0IsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQ2hMLE9BQU8sRUFBQyxzQkFBc0IsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQ3ZELE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0QyxPQUFPLEVBQUMsS0FBSyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsZUFBZSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDN0UsT0FBTyxFQUFDLGdCQUFnQixFQUFFLHlCQUF5QixFQUFFLGtCQUFrQixFQUFFLGdCQUFnQixFQUFDLE1BQU0sY0FBYyxDQUFDO0FBQy9HLE9BQU8sRUFBQyxLQUFLLEVBQUUsWUFBWSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQ3pDLE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBQ2hF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LE9BQU87c0JBQS9CLEtBQUs7dUJBQUMsZ0JBQWdCO2dCQUNkLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUVPLFFBQVE7c0JBQXBCLEtBQUs7Z0JBVUYsZUFBZTtzQkFEbEIsS0FBSztnQkFTSSxNQUFNO3NCQUFmLE1BQU07Z0JBQ0csT0FBTztzQkFBaEIsTUFBTTtnQkFFb0IsWUFBWTtzQkFBdEMsU0FBUzt1QkFBQyxjQUFjO2dCQUNELFFBQVE7c0JBQS9CLFlBQVk7dUJBQUMsUUFBUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIENvbnRlbnRDaGlsZCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBmb3J3YXJkUmVmLCBJbmplY3QsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3B0aW9uYWwsIE91dHB1dCwgVmlld0NoaWxkfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7Q29udHJvbFZhbHVlQWNjZXNzb3IsIEZvcm1Hcm91cERpcmVjdGl2ZSwgTkdfVkFMVUVfQUNDRVNTT1IsIFVudHlwZWRGb3JtQnVpbGRlciwgVW50eXBlZEZvcm1Db250cm9sLCBWYWxpZGF0b3JzfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge1NoYXJlZFZhbGlkYXRvcnN9IGZyb20gJy4uLy4uL3ZhbGlkYXRvci92YWxpZGF0b3JzJztcbmltcG9ydCB7Zm9ybWF0TGF0aXR1ZGUsIGZvcm1hdExvbmdpdHVkZSwgTEFUX0xPTkdfREVGQVVMVF9NQVhfREVDSU1BTFMsIExhdExvbmdGb3JtYXRGbiwgTGF0TG9uZ0Zvcm1hdE9wdGlvbnMsIExhdExvbmdQYXR0ZXJuLCBwYXJzZUxhdGl0dWRlT3JMb25naXR1ZGV9IGZyb20gJy4vbGF0bG9uZy51dGlscyc7XG5pbXBvcnQge0VNUFRZX1BMQUNFSE9MREVSX0NIQVJ9IGZyb20gJy4uLy4uL2NvbnN0YW50cyc7XG5pbXBvcnQge2ZpbHRlcn0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtpc05pbCwgaXNOaWxPck5hTiwgaXNOb3ROaWwsIGlzTm90TmlsT3JCbGFua30gZnJvbSAnLi4vLi4vZnVuY3Rpb25zJztcbmltcG9ydCB7Z2V0Q2FyZXRQb3NpdGlvbiwgbW92ZUlucHV0Q2FyZXRUb1NlcGFyYXRvciwgc2VsZWN0SW5wdXRDb250ZW50LCBzZWxlY3RJbnB1dFJhbmdlfSBmcm9tICcuLi8uLi9pbnB1dHMnO1xuaW1wb3J0IHttZXJnZSwgU3Vic2NyaXB0aW9ufSBmcm9tICdyeGpzJztcbmltcG9ydCB7REVGQVVMVF9NQVhfREVDSU1BTFN9IGZyb20gJy4uL2R1cmF0aW9uL2R1cmF0aW9uLnV0aWxzJztcbmltcG9ydCB7TUFUX0ZPUk1fRklFTERfREVGQVVMVF9PUFRJT05TLCBNYXRFcnJvciwgTWF0Rm9ybUZpZWxkQXBwZWFyYW5jZSwgTWF0Rm9ybUZpZWxkRGVmYXVsdE9wdGlvbnMsIFN1YnNjcmlwdFNpemluZ30gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZCc7XG5pbXBvcnQge0FwcEZsb2F0TGFiZWxUeXBlfSBmcm9tICcuLi8uLi9mb3JtL2ZpZWxkLm1vZGVsJztcbmltcG9ydCB7TWFza2l0b01hc2t9IGZyb20gJ0BtYXNraXRvL2NvcmUvbGliL3R5cGVzL21hc2snO1xuXG5jb25zdCBERUZBVUxUX1NVQlNDUklQVF9TSVpJTkc6IFN1YnNjcmlwdFNpemluZyA9ICAnZml4ZWQnO1xuXG5jb25zdCBEID0gL1xcZHxcXHVGRUZGLztcbmNvbnN0IE0gPSAvXFxkfFxcdUZFRkYvO1xuY29uc3QgUyA9IC9cXGR8XFx1RkVGRi87XG5jb25zdCBNQVNLUzoge1xuICBba2V5OiBzdHJpbmddOiB7XG4gICAgW3BhdHRlcm46IHN0cmluZ106IEFycmF5PHN0cmluZ3xSZWdFeHA+IHwgUmVnRXhwO1xuICB9O1xufSA9IHtcbiAgbGF0aXR1ZGU6IHtcbiAgICBERE1NU1M6IFtELCBELCAnwrAnLCAnICcsIE0sIE0sICdcXCcnLCAnICcsIFMsIFMsICcuJywgUywgUywgJ1wiJ10sXG4gICAgRERNTTogW0QsIEQsICfCsCcsICcgJywgTSwgTSwgJy4nLCBNLCBNLCBNLCAnXFwnJ10sXG4gICAgREQ6IFsvWytdfC0vLCAnICcsIEQsIEQsICcuJywgRCwgRCwgRCwgRCwgRCwgRCwgRCwgJ8KwJ11cbiAgfSxcbiAgbG9uZ2l0dWRlOiB7XG4gICAgRERNTVNTOiBbRCwgRCwgRCwgJ8KwJywgJyAnLCBNLCBNLCAnXFwnJywgJyAnLCBTLCBTLCAnLicsIFMsIFMsICdcIiddLFxuICAgIERETU06IFtELCBELCBELCAnwrAnLCAnICcsIE0sIE0sICcuJywgTSwgTSwgTSwgJ1xcJyddLFxuICAgIEREOiBbL1srLV0vLCBELCBELCBELCAnLicsIEQsIEQsIEQsIEQsIEQsIEQsIEQsICfCsCddXG4gIH1cbn07XG5cbmNvbnN0IG5vb3AgPSAoKSA9PiB7XG59O1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdtYXQtbGF0bG9uZy1maWVsZCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9tYXRlcmlhbC5sYXRsb25nLmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9tYXRlcmlhbC5sYXRsb25nLnNjc3MnXSxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICBtdWx0aTogdHJ1ZSxcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE1hdExhdExvbmdGaWVsZCksXG4gICAgfVxuICBdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBNYXRMYXRMb25nRmllbGQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xuICBwcml2YXRlIF9vbkNoYW5nZUNhbGxiYWNrOiAoXzogYW55KSA9PiB2b2lkID0gbm9vcDtcbiAgcHJpdmF0ZSBfb25Ub3VjaGVkQ2FsbGJhY2s6ICgpID0+IHZvaWQgPSBub29wO1xuICBwcml2YXRlIF9zdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG4gIHByaXZhdGUgX2Zvcm1hdE9wdGlvbnM6IExhdExvbmdGb3JtYXRPcHRpb25zO1xuICBwcml2YXRlIF9kaXNhYmxpbmcgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfd3JpdGluZyA9IGZhbHNlO1xuICBwcm90ZWN0ZWQgX3N1YnNjcmlwdFNpemluZzogU3Vic2NyaXB0U2l6aW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgX3JlYWRvbmx5ID0gZmFsc2U7XG4gIF9mb3JtYXRGbjogTGF0TG9uZ0Zvcm1hdEZuO1xuICB0ZXh0Rm9ybUNvbnRyb2w6IFVudHlwZWRGb3JtQ29udHJvbDtcbiAgc2lnbkZvcm1Db250cm9sOiBVbnR5cGVkRm9ybUNvbnRyb2w7XG4gIG1hc2s6IE1hc2tpdG9NYXNrO1xuICBpbnB1dFBsYWNlaG9sZGVyOiBzdHJpbmc7XG4gIHNob3dTaWduQ29udHJvbDogYm9vbGVhbjtcblxuICBnZXQgZGlzYWJsZWQoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5yZWFkb25seSB8fCB0aGlzLmZvcm1Db250cm9sLmRpc2FibGVkO1xuICB9XG5cbiAgQElucHV0KCkgZm9ybUNvbnRyb2w6IFVudHlwZWRGb3JtQ29udHJvbDtcbiAgQElucHV0KCkgZm9ybUNvbnRyb2xOYW1lOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHR5cGU6ICdsYXRpdHVkZScgfCAnbG9uZ2l0dWRlJztcbiAgQElucHV0KCdsYXRMb25nUGF0dGVybicpIHBhdHRlcm46IExhdExvbmdQYXR0ZXJuO1xuICBASW5wdXQoKSByZXF1aXJlZCA9IGZhbHNlO1xuICBASW5wdXQoKSBmbG9hdExhYmVsOiBBcHBGbG9hdExhYmVsVHlwZSA9ICdhdXRvJztcbiAgQElucHV0KCkgYXBwZWFyYW5jZTogTWF0Rm9ybUZpZWxkQXBwZWFyYW5jZTtcbiAgQElucHV0KCkgcGxhY2Vob2xkZXI6IHN0cmluZztcbiAgQElucHV0KCkgdGFiaW5kZXg6IG51bWJlcjtcbiAgQElucHV0KCkgZGVmYXVsdFNpZ246ICctJyB8ICcrJyB8ICcrICcgfCAnLSAnO1xuICBASW5wdXQoKSBtYXhEZWNpbWFsczogbnVtYmVyID0gTEFUX0xPTkdfREVGQVVMVF9NQVhfREVDSU1BTFM7XG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyQ2hhcjogc3RyaW5nID0gRU1QVFlfUExBQ0VIT0xERVJfQ0hBUjtcbiAgQElucHV0KCkgYXV0b2ZvY3VzID0gZmFsc2U7XG5cbiAgQElucHV0KCkgc2V0IHJlYWRvbmx5KHZhbHVlOiBib29sZWFuKXtcbiAgICB0aGlzLl9yZWFkb25seSA9IHZhbHVlO1xuICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBnZXQgcmVhZG9ubHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3JlYWRvbmx5O1xuICB9XG5cbiAgQElucHV0KClcbiAgZ2V0IHN1YnNjcmlwdFNpemluZygpOiBTdWJzY3JpcHRTaXppbmcge1xuICAgIHJldHVybiB0aGlzLl9zdWJzY3JpcHRTaXppbmcgfHwgdGhpcy5fZGVmYXVsdHM/LnN1YnNjcmlwdFNpemluZztcbiAgfVxuICBzZXQgc3Vic2NyaXB0U2l6aW5nKHZhbHVlOiBTdWJzY3JpcHRTaXppbmcpIHtcbiAgICB0aGlzLl9zdWJzY3JpcHRTaXppbmcgPSB2YWx1ZSB8fCB0aGlzLl9kZWZhdWx0cz8uc3Vic2NyaXB0U2l6aW5nIHx8IERFRkFVTFRfU1VCU0NSSVBUX1NJWklORztcbiAgfVxuXG5cbiAgQE91dHB1dCgpIG9uQmx1ciA9IG5ldyBFdmVudEVtaXR0ZXI8Rm9jdXNFdmVudD4oKTtcbiAgQE91dHB1dCgpIG9uRm9jdXMgPSBuZXcgRXZlbnRFbWl0dGVyPEZvY3VzRXZlbnQ+KCk7XG5cbiAgQFZpZXdDaGlsZCgnaW5wdXRFbGVtZW50JykgaW5wdXRFbGVtZW50OiBFbGVtZW50UmVmO1xuICBAQ29udGVudENoaWxkKE1hdEVycm9yKSBtYXRFcnJvcjogTWF0RXJyb3I7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBmb3JtQnVpbGRlcjogVW50eXBlZEZvcm1CdWlsZGVyLFxuICAgIHByaXZhdGUgY2Q6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgZm9ybUdyb3VwRGlyOiBGb3JtR3JvdXBEaXJlY3RpdmUsXG4gICAgQEluamVjdChNQVRfRk9STV9GSUVMRF9ERUZBVUxUX09QVElPTlMpIHByaXZhdGUgX2RlZmF1bHRzPzogTWF0Rm9ybUZpZWxkRGVmYXVsdE9wdGlvbnMsXG4gICkge1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy50eXBlID0gdGhpcy50eXBlIHx8ICdsYXRpdHVkZSc7XG4gICAgdGhpcy5wYXR0ZXJuID0gdGhpcy5wYXR0ZXJuIHx8ICdERE1NJztcbiAgICB0aGlzLm1hc2sgPSBNQVNLU1t0aGlzLnR5cGVdICYmIE1BU0tTW3RoaXMudHlwZV1bdGhpcy5wYXR0ZXJuXTtcbiAgICBpZiAoIXRoaXMubWFzaykge1xuICAgICAgY29uc29sZS5lcnJvcignSW52YWxpZCBhdHRyaWJ1dGUgdmFsdWUuIEV4cGVjdGVkOiB0eXBlOiBcXCdsYXRpdHVkZXxsb25naXR1ZGVcXCcgYW5kIGxhdGxvbmdQYXR0ZXJuOiBcXCdERHxERE1NfERETU1TU1xcJycpO1xuICAgICAgdGhpcy50eXBlID0gJ2xhdGl0dWRlJztcbiAgICAgIHRoaXMucGF0dGVybiA9ICdERE1NJztcbiAgICAgIHRoaXMubWFzayA9IE1BU0tTW3RoaXMudHlwZV1bdGhpcy5wYXR0ZXJuXTtcbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgbWF4IGRlY2ltYWxzIGluIHRoZSBERE1NU1MgZm9ybWF0XG4gICAgaWYgKHRoaXMucGF0dGVybiA9PT0gJ0REJykge1xuICAgICAgY29uc29sZS53YXJuKGBJbnZhbGlkIGF0dHJpYnV0ZSAnbWF4RGVjaW1hbHMnIC0gTXVzdCBiZSAnMCcgd2hlbiB1c2luZyB0aGUgJ0RETU1TUycgcGF0dGVybi5gKTtcbiAgICAgIHRoaXMubWF4RGVjaW1hbHMgPSA3O1xuICAgIH1cbiAgICBlbHNlIGlmICh0aGlzLnBhdHRlcm4gPT09ICdERE1NU1MnKSB7XG4gICAgICBjb25zb2xlLndhcm4oYEludmFsaWQgYXR0cmlidXRlICdtYXhEZWNpbWFscycgLSBNdXN0IGJlICcwJyB3aGVuIHVzaW5nIHRoZSAnRERNTVNTJyBwYXR0ZXJuLmApO1xuICAgICAgdGhpcy5tYXhEZWNpbWFscyA9IDA7XG4gICAgfVxuICAgIGVsc2UgaWYgKGlzTmlsKHRoaXMubWF4RGVjaW1hbHMpKSB7XG4gICAgICB0aGlzLm1heERlY2ltYWxzID0gREVGQVVMVF9NQVhfREVDSU1BTFM7XG4gICAgfVxuICAgIGVsc2UgaWYgKHRoaXMubWF4RGVjaW1hbHMgPCAwKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdJbnZhbGlkIGF0dHJpYnV0ZSBcXCdtYXhEZWNpbWFsc1xcJy4gTXVzdCBhIHBvc2l0aXZlIHZhbHVlLicpO1xuICAgICAgdGhpcy5tYXhEZWNpbWFscyA9IERFRkFVTFRfTUFYX0RFQ0lNQUxTO1xuICAgIH1cbiAgICBlbHNlIGlmICh0aGlzLm1heERlY2ltYWxzICE9PSBERUZBVUxUX01BWF9ERUNJTUFMUykge1xuICAgICAgY29uc29sZS53YXJuKGBJbnZhbGlkIGF0dHJpYnV0ZSAnbWF4RGVjaW1hbHMnIC0gRXhwZWN0ZWQgdmFsdWU6ICR7REVGQVVMVF9NQVhfREVDSU1BTFN9IGJ1dCBnZXQ6ICR7dGhpcy5tYXhEZWNpbWFsc30uIE90aGVyIHZhbHVlIG5vdCBpbXBsZW1lbnRlZC5gKTtcbiAgICAgIHRoaXMubWF4RGVjaW1hbHMgPSBERUZBVUxUX01BWF9ERUNJTUFMUztcbiAgICB9XG5cbiAgICB0aGlzLnNob3dTaWduQ29udHJvbCA9IHRoaXMucGF0dGVybiAhPT0gJ0REJztcblxuICAgIHRoaXMuX2Zvcm1hdEZuID0gdGhpcy50eXBlID09PSAnbGF0aXR1ZGUnID8gZm9ybWF0TGF0aXR1ZGUgOiBmb3JtYXRMb25naXR1ZGU7XG4gICAgdGhpcy5fZm9ybWF0T3B0aW9ucyA9IHtwYXR0ZXJuOiB0aGlzLnBhdHRlcm4sIG1heERlY2ltYWxzOiB0aGlzLm1heERlY2ltYWxzLCBoaWRlU2lnbjogdGhpcy5zaG93U2lnbkNvbnRyb2x9O1xuXG4gICAgdGhpcy5pbnB1dFBsYWNlaG9sZGVyID0gJ0NPTU1PTi5MQVRfTE9ORy4nICsgKHRoaXMudHlwZSA9PT0gJ2xvbmdpdHVkZScgJiYgJ0QnIHx8ICcnKSArIHRoaXMucGF0dGVybiArICdfUExBQ0VIT0xERVInO1xuXG4gICAgdGhpcy50ZXh0Rm9ybUNvbnRyb2wgPSB0aGlzLmZvcm1CdWlsZGVyLmNvbnRyb2woXG4gICAgICB0aGlzLnJlcXVpcmVkID8gW251bGwsIFZhbGlkYXRvcnMucmVxdWlyZWRdIDogW251bGxdXG4gICAgKTtcblxuXG4gICAgdGhpcy5zaWduRm9ybUNvbnRyb2wgPSB0aGlzLmZvcm1CdWlsZGVyLmNvbnRyb2woXG4gICAgICB0aGlzLnJlcXVpcmVkID8gW251bGwsIFZhbGlkYXRvcnMucmVxdWlyZWRdIDogW251bGxdXG4gICAgKTtcblxuICAgIHRoaXMuZm9ybUNvbnRyb2wgPSB0aGlzLmZvcm1Db250cm9sIHx8IHRoaXMuZm9ybUNvbnRyb2xOYW1lICYmIHRoaXMuZm9ybUdyb3VwRGlyICYmIHRoaXMuZm9ybUdyb3VwRGlyLmZvcm0uZ2V0KHRoaXMuZm9ybUNvbnRyb2xOYW1lKSBhcyBVbnR5cGVkRm9ybUNvbnRyb2w7XG4gICAgaWYgKCF0aGlzLmZvcm1Db250cm9sKSB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgbWFuZGF0b3J5IGF0dHJpYnV0ZSBcXCdmb3JtQ29udHJvbFxcJyBvciBcXCdmb3JtQ29udHJvbE5hbWVcXCcgaW4gPG1hdC1sYXRsb25nLWZpZWxkPi4nKTtcblxuICAgIGNvbnN0IGV4aXN0aW5nVmFsaWRhdG9ycyA9IHRoaXMuZm9ybUNvbnRyb2wudmFsaWRhdG9yO1xuICAgIGlmIChleGlzdGluZ1ZhbGlkYXRvcnMpIHtcbiAgICAgIHRoaXMuZm9ybUNvbnRyb2wuc2V0VmFsaWRhdG9ycyhbXG4gICAgICAgIGV4aXN0aW5nVmFsaWRhdG9ycyxcbiAgICAgICAgdGhpcy50eXBlID09PSAnbGF0aXR1ZGUnID8gU2hhcmVkVmFsaWRhdG9ycy5sYXRpdHVkZSA6IFNoYXJlZFZhbGlkYXRvcnMubG9uZ2l0dWRlXG4gICAgICBdKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmZvcm1Db250cm9sLnNldFZhbGlkYXRvcnModGhpcy50eXBlID09PSAnbGF0aXR1ZGUnID8gU2hhcmVkVmFsaWRhdG9ycy5sYXRpdHVkZSA6IFNoYXJlZFZhbGlkYXRvcnMubG9uZ2l0dWRlKTtcbiAgICB9XG5cbiAgICB0aGlzLl9zdWJzY3JpcHRpb24uYWRkKFxuICAgICAgbWVyZ2UoXG4gICAgICAgIHRoaXMudGV4dEZvcm1Db250cm9sLnZhbHVlQ2hhbmdlcyxcbiAgICAgICAgdGhpcy5zaWduRm9ybUNvbnRyb2wudmFsdWVDaGFuZ2VzXG4gICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKF8pID0+IHRoaXMub25Gb3JtQ2hhbmdlKCkpXG4gICAgKTtcblxuICAgIC8vIExpc3RlbiBzdGF0dXMgY2hhbmdlcyAod2hlbiBkb25lIG91dHNpZGUgdGhlIGNvbXBvbmVudCAgLSBlLmcuIHdoZW4gc2V0RXJyb3JzKCkgaXMgY2FsbGluZyBvbiB0aGUgZm9ybUNvbnRyb2wpXG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uLmFkZChcbiAgICAgIHRoaXMuZm9ybUNvbnRyb2wuc3RhdHVzQ2hhbmdlc1xuICAgICAgICAucGlwZShcbiAgICAgICAgICBmaWx0ZXIoKF8pID0+ICF0aGlzLnJlYWRvbmx5ICYmICF0aGlzLl93cml0aW5nICYmICF0aGlzLl9kaXNhYmxpbmcpIC8vIFNraXBcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKChfKSA9PiB0aGlzLm1hcmtGb3JDaGVjaygpKVxuICAgICk7XG4gIH1cblxuICBfZ2V0RGlzcGxheWVkTWVzc2FnZXMoKTogJ2Vycm9yJyB8ICdoaW50JyB7XG4gICAgcmV0dXJuICh0aGlzLmZvcm1Db250cm9sLnRvdWNoZWQgJiYgdGhpcy5mb3JtQ29udHJvbC5pbnZhbGlkICYmIHRoaXMuZm9ybUNvbnRyb2wuZXJyb3JzKSB8fCB0aGlzLm1hdEVycm9yXG4gICAgICA/ICdlcnJvcidcbiAgICAgIDogJ2hpbnQnO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICB3cml0ZVZhbHVlKG9iajogYW55KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX3dyaXRpbmcpIHJldHVybjtcbiAgICBjb25zdCB2YWx1ZSA9ICh0eXBlb2Ygb2JqID09PSAnc3RyaW5nJykgPyBwYXJzZUZsb2F0KG9iai5yZXBsYWNlKC8sL2csICcuJykpIDogb2JqO1xuICAgIHRoaXMuX3dyaXRpbmcgPSB0cnVlO1xuICAgIGNvbnN0IHN0clZhbHVlID0gdGhpcy5fZm9ybWF0Rm4odmFsdWUsIHsuLi50aGlzLl9mb3JtYXRPcHRpb25zLCBwbGFjZWhvbGRlckNoYXI6IHRoaXMucGxhY2Vob2xkZXJDaGFyfSk7XG4gICAgY29uc3Qgc2lnbiA9IGlzTm90TmlsKHZhbHVlKSA/ICh2YWx1ZSA8IDAgPyAtMSA6IDEpIDpcbiAgICAgIC8vIFVzZSBkZWZhdWx0IHNpZ24sIGlmIGFueVxuICAgICAgKHRoaXMuZGVmYXVsdFNpZ24gPyAodGhpcy5kZWZhdWx0U2lnbiA9PT0gJy0nID8gLTEgOiAxKSA6IG51bGwpO1xuXG4gICAgLy8gREVCVUdcbiAgICAvLyBjb25zb2xlLmRlYnVnKFwic3RyVmFsdWU6IFwiICsgc3RyVmFsdWUpXG4gICAgLy8gY29uc29sZS5kZWJ1ZyhcInNpZ246IFwiICsgc2lnbilcblxuICAgIHRoaXMudGV4dEZvcm1Db250cm9sLnBhdGNoVmFsdWUoc3RyVmFsdWUsIHtlbWl0RXZlbnQ6IGZhbHNlfSk7XG4gICAgdGhpcy5zaWduRm9ybUNvbnRyb2wucGF0Y2hWYWx1ZShzaWduLCB7ZW1pdEV2ZW50OiBmYWxzZX0pO1xuICAgIHRoaXMuX3dyaXRpbmcgPSBmYWxzZTtcbiAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XG4gICAgdGhpcy5fb25DaGFuZ2VDYWxsYmFjayA9IGZuO1xuICB9XG5cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMuX29uVG91Y2hlZENhbGxiYWNrID0gZm47XG4gIH1cblxuICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fZGlzYWJsaW5nKSByZXR1cm47XG5cbiAgICB0aGlzLl9kaXNhYmxpbmcgPSB0cnVlO1xuICAgIGlmIChpc0Rpc2FibGVkKSB7XG4gICAgICB0aGlzLnRleHRGb3JtQ29udHJvbC5kaXNhYmxlKHtvbmx5U2VsZjogdHJ1ZSwgZW1pdEV2ZW50OiBmYWxzZX0pO1xuICAgICAgdGhpcy5zaWduRm9ybUNvbnRyb2wuZGlzYWJsZSh7b25seVNlbGY6IHRydWUsIGVtaXRFdmVudDogZmFsc2V9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50ZXh0Rm9ybUNvbnRyb2wuZW5hYmxlKHtvbmx5U2VsZjogdHJ1ZSwgZW1pdEV2ZW50OiBmYWxzZX0pO1xuICAgICAgdGhpcy5zaWduRm9ybUNvbnRyb2wuZW5hYmxlKHtvbmx5U2VsZjogdHJ1ZSwgZW1pdEV2ZW50OiBmYWxzZX0pO1xuICAgIH1cbiAgICB0aGlzLl9kaXNhYmxpbmcgPSBmYWxzZTtcbiAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdCB2YWx1ZSB0byBkaXNwbGF5IGFzIHN0cmluZyAobm8gcGxhY2Vob2xkZXIgY2hhciwgYW5kIHNob3cgc2lnbilcbiAgICpcbiAgICogQHBhcmFtIHZhbHVlXG4gICAqIEBwYXJhbSBvcHRzXG4gICAqL1xuICBfZm9ybWF0KHZhbHVlOiBudW1iZXIsIG9wdHM/OiBQYXJ0aWFsPExhdExvbmdGb3JtYXRPcHRpb25zPikge1xuICAgIHJldHVybiB0aGlzLl9mb3JtYXRGbih2YWx1ZSwge1xuICAgICAgLi4udGhpcy5fZm9ybWF0T3B0aW9ucywgaGlkZVNpZ246IGZhbHNlLCBwbGFjZWhvbGRlckNoYXI6ICcnXG4gICAgfSk7XG4gIH1cblxuICBfb25Gb2N1cyhldmVudDogRm9jdXNFdmVudCkge1xuXG4gICAgLy8gQXBwbHkgdGhlIGRlZmF1bHQgc2lnbiwgd2hlbiBwYXR0ZXJuIGlzIEREIGFuZCBmaWVsZCBpcyBlbXB0eVxuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5mb3JtQ29udHJvbC52YWx1ZTtcbiAgICBpZiAoaXNOaWxPck5hTih2YWx1ZSkpIHtcbiAgICAgIGlmICh0aGlzLmRlZmF1bHRTaWduKSB7XG4gICAgICAgIC8vIENvbXB1dGUgdGhlIHRleHQgdmFsdWUsIHVzaW5nIHRoZSBkZWZhdWx0IHNpZ25cbiAgICAgICAgY29uc3QgZGVmYXVsdFNpZ24gPSB0aGlzLmRlZmF1bHRTaWduID09PSAnLScgPyAtMSA6IDE7XG5cbiAgICAgICAgaWYgKHRoaXMucGF0dGVybiA9PT0gJ0REJykge1xuICAgICAgICAgIGxldCB2YWx1ZVN0ciA9IHRoaXMuX2Zvcm1hdEZuKGRlZmF1bHRTaWduLCB7Li4udGhpcy5fZm9ybWF0T3B0aW9ucywgcGxhY2Vob2xkZXJDaGFyOiB0aGlzLnBsYWNlaG9sZGVyQ2hhcn0pO1xuICAgICAgICAgIC8vIEtlZXAgb25seSB0aGUgc2lnbiAoJysnIG9yICctJykgYW5kIHBsYWNlaG9sZGVyIGNoYXJzLCBidXQgTk9UIHRoZSAnMSdcbiAgICAgICAgICB2YWx1ZVN0ciA9IHZhbHVlU3RyICYmIHZhbHVlU3RyLnJlcGxhY2UoJzEnLCB0aGlzLnBsYWNlaG9sZGVyQ2hhcik7XG5cbiAgICAgICAgICAvLyBXYWl0IGVuZCBvZiBmb2N1cyBhbmltYXRpb24gKGxhYmVsIHNob3VsZCBtb3ZlIHRvIHRvcClcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIC8vIFNldCB0aGUgdmFsdWVcbiAgICAgICAgICAgIHRoaXMuaW5wdXRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQudmFsdWUgPSB2YWx1ZVN0cjtcblxuICAgICAgICAgICAgLy8gTW92ZSBjdXJzb3IgYWZ0ZXIgdGhlIHNpZ25cbiAgICAgICAgICAgIGNvbnN0IGNhcmV0SW5kZXggPSAodGhpcy50eXBlID09PSAnbGF0aXR1ZGUnKSA/IDIgOiAxO1xuICAgICAgICAgICAgc2VsZWN0SW5wdXRSYW5nZShldmVudC50YXJnZXQsIGNhcmV0SW5kZXgpO1xuICAgICAgICAgIH0sIDI1MCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgdGhpcy5zaWduRm9ybUNvbnRyb2wuc2V0VmFsdWUoZGVmYXVsdFNpZ24pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gU2VsZWN0IHRoZSBjb250ZW50IChpZiB0aGVyZSBpcyBhIHZhbHVlKVxuICAgIGVsc2Uge1xuICAgICAgc2VsZWN0SW5wdXRDb250ZW50KGV2ZW50KTtcbiAgICB9XG5cbiAgICB0aGlzLm9uRm9jdXMuZW1pdChldmVudCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBfb25CbHVyKGV2ZW50OiBGb2N1c0V2ZW50KSB7XG4gICAgY29uc3QgdG91Y2hlZCA9IHRoaXMuY2hlY2tJZlRvdWNoZWQoKTtcbiAgICBpZiAodG91Y2hlZCAmJiBpc05pbCh0aGlzLmZvcm1Db250cm9sPy52YWx1ZSkpIHtcbiAgICAgIHRoaXMuaW5wdXRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQudmFsdWUgPSAnJztcbiAgICB9XG4gICAgdGhpcy5vbkJsdXIuZW1pdChldmVudCk7XG4gIH1cblxuICBtb3ZlQ2FyZXRUb1NlcGFyYXRvcihldmVudDogYW55LCBmb3J3YXJkOiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgLy8gTW92ZSB0byB0aGUgc3BhY2Ugc2VwYXJhdG9yXG4gICAgcmV0dXJuIG1vdmVJbnB1dENhcmV0VG9TZXBhcmF0b3IoZXZlbnQsICcgJywgZm9yd2FyZCk7XG4gIH1cblxuICBvbktleXByZXNzKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgLy8gTnVtYmVyIGVudGVyZWQgb3Igb25lIG9mIHRoZSA0IGRpcmVjdGlvbiB1cCwgZG93biwgbGVmdCBhbmQgcmlnaHRcbiAgICBpZiAoKGV2ZW50LndoaWNoID49IDQ4ICYmIGV2ZW50LndoaWNoIDw9IDU3KSB8fCAoZXZlbnQud2hpY2ggPj0gMzcgJiYgZXZlbnQud2hpY2ggPD0gNDApKSB7XG4gICAgICAvL2NvbnNvbGUuZGVidWcoJ2lucHV0IG51bWJlciBlbnRlcmVkIDonICsgZXZlbnQud2hpY2ggKyAnICcgKyBldmVudC5rZXlDb2RlICsgJyAnICsgZXZlbnQuY2hhckNvZGUpO1xuICAgICAgLy8gT0tcbiAgICB9XG4gICAgLy8gRGVjaW1hbCBzZXBhcmF0b3IgZW50ZXJlZFxuICAgIGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gJy4nIHx8IGV2ZW50LmtleSA9PT0gJywnKSB7XG4gICAgICAvLyBERUJVR1xuICAgICAgLy8gY29uc29sZS5kZWJ1ZygnaW5wdXQgZGVjaW1hbCBzZXBhcmF0b3IgZW50ZXJlZCA6JyArIGV2ZW50LmNvZGUpO1xuXG4gICAgICAvLyBNb3ZlIGNhcmV0IGFmdGVyIHBvaW50XG4gICAgICBtb3ZlSW5wdXRDYXJldFRvU2VwYXJhdG9yKGV2ZW50LCAnLicpO1xuXG4gICAgICAvLyBPS1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBDb21tYW5kIGVudGVyZWQgKGRlbGV0ZSwgYmFja3NwYWNlIG9yIG9uZSBvZiB0aGUgNCBkaXJlY3Rpb24gdXAsIGRvd24sIGxlZnQgYW5kIHJpZ2h0KVxuICAgICAgaWYgKChldmVudC5rZXlDb2RlID49IDM3ICYmIGV2ZW50LmtleUNvZGUgPD0gNDApIHx8IGV2ZW50LmtleUNvZGUgPT09IDQ2IHx8IGV2ZW50LndoaWNoID09PSA4IHx8IGV2ZW50LmtleUNvZGUgPT09IDkpIHtcbiAgICAgICAgLy8gREVCVUdcbiAgICAgICAgLy9jb25zb2xlLmRlYnVnKCdpbnB1dCBjb21tYW5kIGVudGVyZWQ6JyArIGV2ZW50LndoaWNoICsgJyAnICsgZXZlbnQua2V5Q29kZSArICcgJyArIGV2ZW50LmNoYXJDb2RlKTtcblxuICAgICAgICAvLyBPS1xuICAgICAgfVxuICAgICAgLy8gU2lnbiBlbnRlcmVkICgnKycgb3IgJy0nKVxuICAgICAgZWxzZSBpZiAoZXZlbnQua2V5Q29kZSA9PT0gNDMgfHwgZXZlbnQua2V5Q29kZSA9PT0gNDUpIHtcbiAgICAgICAgLy8gREVCVUdcbiAgICAgICAgLy8gY29uc29sZS5kZWJ1ZygnaW5wdXQgc2lnbiBlbnRlcmVkOicgKyBldmVudC53aGljaCArICcgJyArIGV2ZW50LmtleUNvZGUgKyAnICcgKyBldmVudC5jaGFyQ29kZSk7XG4gICAgICAgIGNvbnN0IGNhcmV0UG9zaXRpb24gPSBnZXRDYXJldFBvc2l0aW9uKGV2ZW50LnRhcmdldCk7XG4gICAgICAgIGlmICh0aGlzLnBhdHRlcm4gPT09ICdERCcgJiYgY2FyZXRQb3NpdGlvbiA+IDApIHtcbiAgICAgICAgICBjb25zdCBzaWduID0gZXZlbnQua2V5O1xuICAgICAgICAgIC8vIFdhaXQga2V5IGFwcGx5XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmlucHV0RWxlbWVudC5uYXRpdmVFbGVtZW50LnZhbHVlO1xuICAgICAgICAgIGlmICh2YWx1ZSAmJiAhdmFsdWUuc3RhcnRzV2l0aChzaWduKSkge1xuICAgICAgICAgICAgY29uc3QgbmV3VmFsdWUgPSBzaWduICsgKHZhbHVlLmxlbmd0aCA+IDEgPyB2YWx1ZS5zdWJzdHIoMSkgOiAnJyk7XG5cbiAgICAgICAgICAgIC8vIERFQlVHXG4gICAgICAgICAgICAvLyBjb25zb2xlLmRlYnVnKFwic2lnbiBlbnRlcmVkLiBVcGRhdGluZyBpbnB1dCB2YWx1ZSB0bzpcIiwgbmV3VmFsdWUpO1xuXG4gICAgICAgICAgICB0aGlzLmlucHV0RWxlbWVudC5uYXRpdmVFbGVtZW50LnZhbHVlID0gbmV3VmFsdWU7XG4gICAgICAgICAgICBzZWxlY3RJbnB1dFJhbmdlKHRoaXMuaW5wdXRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQsIGNhcmV0UG9zaXRpb24pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gT0tcbiAgICAgIH1cbiAgICAgIC8vIERpcmVjdGlvbiBjaGFyIChjYXBpdGFsaXplZClcbiAgICAgIGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gJ04nIHx8IGV2ZW50LmtleSA9PT0gJ1MnIHx8IGV2ZW50LmtleSA9PT0gJ0UnIHx8IGV2ZW50LmtleSA9PT0gJ1cnKSB7XG4gICAgICAgIC8vIERFQlVHXG4gICAgICAgIC8vIGNvbnNvbGUuZGVidWcoJ2lucHV0IGRpcmVjdGlvbiBlbnRlcmVkOicgKyBldmVudC53aGljaCArICcgJyArIGV2ZW50LmtleUNvZGUgKyAnICcgKyBldmVudC5jaGFyQ29kZSk7XG5cbiAgICAgICAgLy8gT0tcbiAgICAgIH1cbiAgICAgIC8vIERpcmVjdGlvbiBjaGFyXG4gICAgICBlbHNlIGlmIChldmVudC5rZXkgPT09ICduJyB8fCBldmVudC5rZXkgPT09ICdzJyB8fCBldmVudC5rZXkgPT09ICdlJyB8fCBldmVudC5rZXkgPT09ICd3Jykge1xuICAgICAgICAvLyBERUJVR1xuICAgICAgICAvLyBjb25zb2xlLmRlYnVnKCdpbnB1dCBkaXJlY3Rpb24gZW50ZXJlZDonICsgZXZlbnQud2hpY2ggKyAnICcgKyBldmVudC5rZXlDb2RlICsgJyAnICsgZXZlbnQuY2hhckNvZGUpO1xuXG4gICAgICAgIC8vIENhcGl0YWxpemUgKHdpdGggYSBkZWxheSwgdG8gYmUgc3VyZSB0aGUga2V5IGhhcyBiZWVuIGFwcGxpZWQgdG8gaW5wdXQgdGV4dClcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5pbnB1dEVsZW1lbnQubmF0aXZlRWxlbWVudC52YWx1ZSA9IHRoaXMuaW5wdXRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQudmFsdWUudG9VcHBlckNhc2UoKTtcbiAgICAgICAgfSwgMTApO1xuXG4gICAgICAgIC8vIE9LXG4gICAgICB9XG5cbiAgICAgIC8vIEFueSBvdGhlciBrZXlib2FyZCBldmVudHNcbiAgICAgIGVsc2Uge1xuICAgICAgICAvLyBERUJVR1xuICAgICAgICAvL2NvbnNvbGUuZGVidWcoJ2lucHV0IG5vdCBudW1iZXIgZW50ZXJlZCA6JyArIGV2ZW50LndoaWNoICsgJyAnICsgZXZlbnQua2V5Q29kZSArICcgJyArIGV2ZW50LmNoYXJDb2RlICsgJyAnICsgZXZlbnQuY29kZSApO1xuXG4gICAgICAgIC8vIEtPOiBjYW5jZWwgdGhlIGV2ZW50XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cblxuICBwcml2YXRlIG9uRm9ybUNoYW5nZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fd3JpdGluZykgcmV0dXJuOyAvLyBTa2lwIGlmIGNhbGwgYnkgc2VsZlxuICAgIHRoaXMuX3dyaXRpbmcgPSB0cnVlO1xuXG4gICAgbGV0IHN0clZhbHVlID0gdGhpcy50ZXh0Rm9ybUNvbnRyb2wudmFsdWU7XG5cbiAgICBpZiAodGhpcy50ZXh0Rm9ybUNvbnRyb2wuaW52YWxpZCB8fCB0aGlzLnNpZ25Gb3JtQ29udHJvbC5pbnZhbGlkKSB7XG4gICAgICB0aGlzLmZvcm1Db250cm9sLm1hcmtBc1BlbmRpbmcoKTtcbiAgICAgIHRoaXMuZm9ybUNvbnRyb2wuc2V0RXJyb3JzKHtcbiAgICAgICAgLi4udGhpcy5mb3JtQ29udHJvbC5lcnJvcnMsXG4gICAgICAgIC4uLnRoaXMudGV4dEZvcm1Db250cm9sLmVycm9ycyxcbiAgICAgICAgLi4udGhpcy5zaWduRm9ybUNvbnRyb2wuZXJyb3JzXG4gICAgICB9KTtcbiAgICAgIGlmICh0aGlzLnRleHRGb3JtQ29udHJvbC5kaXJ0eSB8fCB0aGlzLnNpZ25Gb3JtQ29udHJvbC5kaXJ0eSkge1xuICAgICAgICB0aGlzLmZvcm1Db250cm9sLm1hcmtBc0RpcnR5KCk7XG4gICAgICB9XG4gICAgICB0aGlzLl93cml0aW5nID0gZmFsc2U7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcGFyc2VkVmFsdWUgPSBpc05vdE5pbE9yQmxhbmsoc3RyVmFsdWUpID8gcGFyc2VMYXRpdHVkZU9yTG9uZ2l0dWRlKHN0clZhbHVlLCB0aGlzLnBhdHRlcm4sIDcgLyo9cHJlY2lzaW9uIG9mIHRoZSBjb252ZXJ0ZWQgZG91YmxlIHZhbHVlICovLCB0aGlzLnBsYWNlaG9sZGVyQ2hhcikgOiBudWxsO1xuXG4gICAgLy8gREVCVUdcbiAgICAvL2NvbnNvbGUuZGVidWcoJ3BhcnNlZFZhbHVlPScsIHBhcnNlZFZhbHVlKTtcblxuICAgIGlmIChpc05hTihwYXJzZWRWYWx1ZSkpIHtcbiAgICAgIHRoaXMuZm9ybUNvbnRyb2wubWFya0FzUGVuZGluZygpO1xuICAgICAgdGhpcy5mb3JtQ29udHJvbC5zZXRFcnJvcnModGhpcy50eXBlID09PSAnbGF0aXR1ZGUnID8ge2xhdGl0dWRlOiB0cnVlfSA6IHtsb25naXR1ZGU6IHRydWV9KVxuICAgICAgLy8gVE9ETyBEaXJ0eSBmaXggOiB0cmVhdCB0aGlzIGVycm9yIHdpdGggYSB2YWxpZGF0b3JcbiAgICAgIHRoaXMudGV4dEZvcm1Db250cm9sLnNldEVycm9ycyh0aGlzLnR5cGUgPT09ICdsYXRpdHVkZScgPyB7bGF0aXR1ZGU6IHRydWV9IDoge2xvbmdpdHVkZTogdHJ1ZX0pO1xuICAgICAgdGhpcy5fd3JpdGluZyA9IGZhbHNlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzaWduID0gKHRoaXMucGF0dGVybiA9PT0gJ0REJykgPyAxIC8qaWdub3JlIHNpZ24qLyA6ICh0aGlzLnNpZ25Gb3JtQ29udHJvbC52YWx1ZSB8fCAxKTtcbiAgICBjb25zdCB2YWx1ZSA9IGlzTm90TmlsKHBhcnNlZFZhbHVlKSA/IHNpZ24gKiBwYXJzZWRWYWx1ZSA6IG51bGw7XG5cbiAgICAvLyBHZXQgdGhlIG1vZGVsIHZhbHVlXG4gICAgLy9jb25zb2xlLmRlYnVnKFwiW21hdC1sYXRsb25dIFNldHRpbmcgdmFsdWUge1wiICsgdmFsdWUgKyBcIn0gcGFyc2VkIGZyb20ge1wiICsgc3RyVmFsdWUgKyBcIn1cIik7XG4gICAgdGhpcy5mb3JtQ29udHJvbC5wYXRjaFZhbHVlKHZhbHVlLCB7ZW1pdEV2ZW50OiBmYWxzZX0pO1xuICAgIHRoaXMuX3dyaXRpbmcgPSBmYWxzZTtcbiAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuXG4gICAgdGhpcy5fb25DaGFuZ2VDYWxsYmFjayh2YWx1ZSk7XG4gIH1cblxuICBwcml2YXRlIGNoZWNrSWZUb3VjaGVkKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmZvcm1Db250cm9sLnRvdWNoZWQgfHwgdGhpcy50ZXh0Rm9ybUNvbnRyb2wudG91Y2hlZCkge1xuICAgICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIHRoaXMuX29uVG91Y2hlZENhbGxiYWNrKCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBtYXJrRm9yQ2hlY2soKSB7XG4gICAgdGhpcy5jZC5tYXJrRm9yQ2hlY2soKTtcbiAgfVxufVxuXG4iLCI8IS0tIHJlYWRvbmx5IC0tPlxuPG1hdC1mb3JtLWZpZWxkICpuZ0lmPVwicmVhZG9ubHk7IGVsc2Ugd3JpdGFibGVcIlxuICAgICAgICAgICAgICAgIFtmbG9hdExhYmVsXT1cImZsb2F0TGFiZWwgfCBhc0Zsb2F0TGFiZWxUeXBlXCJcbiAgICAgICAgICAgICAgICBbYXBwZWFyYW5jZV09XCJhcHBlYXJhbmNlXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cIm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkXCI+XG5cbiAgPGRpdiBtYXRQcmVmaXg+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm1hdFByZWZpeFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxuXG4gIDxtYXQtbGFiZWwgKm5nSWY9XCJmbG9hdExhYmVsICE9PSAnbmV2ZXInICYmICEhcGxhY2Vob2xkZXJcIj57e3BsYWNlaG9sZGVyfX08L21hdC1sYWJlbD5cblxuICA8aW5wdXQgbWF0SW5wdXQgaGlkZGVuIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgIHJlYWRvbmx5XG4gICAgICAgICBbZm9ybUNvbnRyb2xdPVwiZm9ybUNvbnRyb2xcIj5cbiAgPGlvbi10ZXh0Pnt7X2Zvcm1hdChmb3JtQ29udHJvbC52YWx1ZSkgfX08L2lvbi10ZXh0PlxuXG4gIDxkaXYgbWF0U3VmZml4PlxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJtYXRTdWZmaXhUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICA8L2Rpdj5cbjwvbWF0LWZvcm0tZmllbGQ+XG5cbjwhLS0gd3JpdGFibGUgLS0+XG48bmctdGVtcGxhdGUgI3dyaXRhYmxlPlxuXG4gIDxpb24tZ3JpZCBjbGFzcz1cImlvbi1uby1wYWRkaW5nXCIgW2NsYXNzLmZpbGxdPVwiYXBwZWFyYW5jZSAhPT0gJ291dGxpbmUnXCI+XG4gICAgPGlvbi1yb3cgY2xhc3M9XCJpb24tbm8tcGFkZGluZyBuby13cmFwXCI+XG5cbiAgICAgIDxpb24tY29sIGNsYXNzPVwidGV4dCBpb24tbm8tcGFkZGluZ1wiPlxuICAgICAgICA8bWF0LWZvcm0tZmllbGQgW2Zsb2F0TGFiZWxdPVwiZmxvYXRMYWJlbCB8IGFzRmxvYXRMYWJlbFR5cGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2FwcGVhcmFuY2VdPVwiYXBwZWFyYW5jZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbc3Vic2NyaXB0U2l6aW5nXT1cIidkeW5hbWljJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubWRjLXRleHQtZmllbGQtLWludmFsaWRdPVwiZm9ybUNvbnRyb2wudG91Y2hlZCAmJiAoc2lnbkZvcm1Db250cm9sLmludmFsaWQgfHwgZm9ybUNvbnRyb2wuaW52YWxpZClcIj5cblxuICAgICAgICAgIDxkaXYgbWF0UHJlZml4PlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm1hdFByZWZpeFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxtYXQtbGFiZWwgKm5nSWY9XCJmbG9hdExhYmVsICE9PSAnbmV2ZXInICYmICEhcGxhY2Vob2xkZXJcIj57e3BsYWNlaG9sZGVyfX08L21hdC1sYWJlbD5cblxuICAgICAgICAgIDwhLS1cbiAgICAgICAgICAgIC8vIFRPRE8gTm9ybWFsbHksIHRoaXMgaXMgbm8gbG9uZ2VyIHJlcXVpcmVkIHNpbmNlIHdlIHN0YXJ0ZWQgdXNpbmcgbWFza2l0b1xuICAgICAgICAgICAgKGZvY3VzKT1cIl9vbkZvY3VzKCRldmVudClcIlxuICAgICAgICAgICAgKGtleWRvd24udGFiKT1cIm1vdmVDYXJldFRvU2VwYXJhdG9yKCRldmVudCwgdHJ1ZSlcIlxuICAgICAgICAgICAgKGtleWRvd24uc2hpZnQudGFiKT1cIm1vdmVDYXJldFRvU2VwYXJhdG9yKCRldmVudCwgZmFsc2UpXCJcbiAgICAgICAgICAtLT5cbiAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgI2lucHV0RWxlbWVudFxuICAgICAgICAgICAgICAgICBbbWFza2l0b109XCJpbnB1dFBsYWNlaG9sZGVyfHRyYW5zbGF0ZXxtYXNraXRvUGxhY2Vob2xkZXI6bWFzazooIXNob3dTaWduQ29udHJvbCAmJiBkZWZhdWx0U2lnbilcIlxuICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJpbnB1dFBsYWNlaG9sZGVyfHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgIChibHVyKT1cIl9vbkJsdXIoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJ0ZXh0Rm9ybUNvbnRyb2xcIlxuICAgICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwicmVxdWlyZWRcIlxuICAgICAgICAgICAgICAgICBbdGFiaW5kZXhdPVwidGFiaW5kZXhcIlxuICAgICAgICAgICAgICAgICBbYXBwQXV0b2ZvY3VzXT1cImF1dG9mb2N1c1wiPlxuXG4gICAgICAgICAgPGRpdiBtYXRTdWZmaXggKm5nSWY9XCIhc2hvd1NpZ25Db250cm9sXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibWF0U3VmZml4VGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgPC9pb24tY29sPlxuXG4gICAgICA8IS0tIHNpZ24gLS0+XG4gICAgICA8aW9uLWNvbCBjbGFzcz1cInNpZ24gaW9uLW5vLXBhZGRpbmdcIiBbbmdTd2l0Y2hdPVwidHlwZVwiICpuZ0lmPVwic2hvd1NpZ25Db250cm9sXCI+XG5cbiAgICAgICAgICA8IS0tIHNpZ24gb24gbGF0aXR1ZGUgLS0+XG4gICAgICAgICAgPG1hdC1mb3JtLWZpZWxkICpuZ1N3aXRjaENhc2U9XCInbGF0aXR1ZGUnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zsb2F0TGFiZWxdPVwiZmxvYXRMYWJlbCB8IGFzRmxvYXRMYWJlbFR5cGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbYXBwZWFyYW5jZV09XCJhcHBlYXJhbmNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3N1YnNjcmlwdFNpemluZ109XCInZHluYW1pYydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubWRjLXRleHQtZmllbGQtLWludmFsaWRdPVwiZm9ybUNvbnRyb2wudG91Y2hlZCAmJiBzaWduRm9ybUNvbnRyb2wuaW52YWxpZFwiPlxuICAgICAgICAgICAgPG1hdC1sYWJlbCAqbmdJZj1cInBsYWNlaG9sZGVyICYmIGZsb2F0TGFiZWwgIT09ICduZXZlcidcIiB0cmFuc2xhdGU+Q09NTU9OLkxBVF9MT05HLkxBVF9TSUdOX1BMQUNFSE9MREVSPC9tYXQtbGFiZWw+XG5cbiAgICAgICAgICAgIDxtYXQtc2VsZWN0IFtmb3JtQ29udHJvbF09XCJzaWduRm9ybUNvbnRyb2xcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3RhYmluZGV4XT1cInRhYmluZGV4ICE9PSB1bmRlZmluZWQgPyB0YWJpbmRleCsxIDogdW5kZWZpbmVkXCI+XG4gICAgICAgICAgICAgIDxtYXQtb3B0aW9uIFt2YWx1ZV09XCIxXCI+e3snQ09NTU9OLkxBVF9MT05HLkxBVF9TSUdOX04nfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwiLTFcIiA+e3snQ09NTU9OLkxBVF9MT05HLkxBVF9TSUdOX1MnfHRyYW5zbGF0ZX19PC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxuXG4gICAgICAgICAgICA8ZGl2IG1hdFN1ZmZpeD5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm1hdFN1ZmZpeFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuXG4gICAgICAgICAgPCEtLSBzaWduIG9uIGxvbmdpdHVkZSAtLT5cbiAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgKm5nU3dpdGNoQ2FzZT1cIidsb25naXR1ZGUnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zsb2F0TGFiZWxdPVwiZmxvYXRMYWJlbCB8IGFzRmxvYXRMYWJlbFR5cGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbYXBwZWFyYW5jZV09XCJhcHBlYXJhbmNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm1kYy10ZXh0LWZpZWxkLS1pbnZhbGlkXT1cImZvcm1Db250cm9sLnRvdWNoZWQgJiYgc2lnbkZvcm1Db250cm9sLmludmFsaWRcIj5cbiAgICAgICAgICAgIDxtYXQtbGFiZWwgKm5nSWY9XCJwbGFjZWhvbGRlciAmJiBmbG9hdExhYmVsICE9PSAnbmV2ZXInXCIgdHJhbnNsYXRlPkNPTU1PTi5MQVRfTE9ORy5MT05HX1NJR05fUExBQ0VIT0xERVI8L21hdC1sYWJlbD5cblxuICAgICAgICAgICAgPG1hdC1zZWxlY3QgW2Zvcm1Db250cm9sXT1cInNpZ25Gb3JtQ29udHJvbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbdGFiaW5kZXhdPVwidGFiaW5kZXggIT09IHVuZGVmaW5lZCA/IHRhYmluZGV4KzEgOiB1bmRlZmluZWRcIj5cbiAgICAgICAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cIjFcIiB0cmFuc2xhdGU+e3snQ09NTU9OLkxBVF9MT05HLkxPTkdfU0lHTl9FJ3x0cmFuc2xhdGV9fTwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cIi0xXCIgdHJhbnNsYXRlPnt7J0NPTU1PTi5MQVRfTE9ORy5MT05HX1NJR05fVyd8dHJhbnNsYXRlfX08L21hdC1vcHRpb24+XG4gICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG5cbiAgICAgICAgICAgIDxkaXYgbWF0U3VmZml4PlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibWF0U3VmZml4VGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICA8L2lvbi1jb2w+XG4gICAgPC9pb24tcm93PlxuICA8L2lvbi1ncmlkPlxuXG4gIDwhLS0gRG8gdGhlIHNhbWUgYXMgTWF0RnJvbUZpZWxkIHNpbmNlIGFuZ3VsYXIgMTUgKHNlZSBjb21wb25lbnQgc291cmNlKS0tPlxuICA8ZGl2IGNsYXNzPVwibWF0LW1kYy1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyIG1hdC1tZGMtZm9ybS1maWVsZC1ib3R0b20tYWxpZ25cIlxuICAgICAgIFtjbGFzcy5tYXQtbWRjLWZvcm0tZmllbGQtc3Vic2NyaXB0LWR5bmFtaWMtc2l6ZV09XCJzdWJzY3JpcHRTaXppbmcgPT09ICdkeW5hbWljJ1wiXG4gICAgICAgW25nU3dpdGNoXT1cIl9nZXREaXNwbGF5ZWRNZXNzYWdlcygpXCI+XG4gICAgPGRpdiBjbGFzcz1cIm1hdC1tZGMtZm9ybS1maWVsZC1lcnJvci13cmFwcGVyXCJcbiAgICAgICAgICpuZ1N3aXRjaENhc2U9XCInZXJyb3InXCI+XG4gICAgICA8IS0tIGVycm9ycyAtLT5cbiAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJmb3JtQ29udHJvbC50b3VjaGVkICYmIGZvcm1Db250cm9sLmludmFsaWQgJiYgZm9ybUNvbnRyb2wuZXJyb3JzfG1hcEtleXN8YXJyYXlGaXJzdDsgbGV0IGVycm9yS2V5IDsgZWxzZSBwYXJlbnRFcnJvclwiXG4gICAgICAgICAgICAgICAgIFtuZ1N3aXRjaF09XCJlcnJvcktleVwiPlxuICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ3JlcXVpcmVkJ1wiIHRyYW5zbGF0ZT5FUlJPUi5GSUVMRF9SRVFVSVJFRDwvc3Bhbj5cbiAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIidsYXRpdHVkZSdcIiB0cmFuc2xhdGU+RVJST1IuRklFTERfTk9UX1ZBTElEX0xBVElUVURFPC9zcGFuPlxuICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ2xvbmdpdHVkZSdcIiB0cmFuc2xhdGU+RVJST1IuRklFTERfTk9UX1ZBTElEX0xPTkdJVFVERTwvc3Bhbj5cbiAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIidtaW4nXCI+e3snRVJST1IuRklFTERfTUlOX0NPTVBBQ1QnfHRyYW5zbGF0ZToge21pbjogX2Zvcm1hdChmb3JtQ29udHJvbC5lcnJvcnMubWluLm1pbikgfSB9fTwvc3Bhbj5cbiAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIidtYXgnXCI+e3snRVJST1IuRklFTERfTUFYX0NPTVBBQ1QnfHRyYW5zbGF0ZToge21heDogX2Zvcm1hdChmb3JtQ29udHJvbC5lcnJvcnMubWF4Lm1heCkgfSB9fTwvc3Bhbj5cbiAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIidtc2cnXCI+e3soZm9ybUNvbnRyb2wuZXJyb3JzLm1zZz8ua2V5IHx8IGZvcm1Db250cm9sLmVycm9ycy5tc2cpIHwgdHJhbnNsYXRlOiBmb3JtQ29udHJvbC5lcnJvcnMubXNnPy5wYXJhbXN9fTwvc3Bhbj5cbiAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgPG5nLXRlbXBsYXRlICNwYXJlbnRFcnJvcj5cbiAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwibWF0LWVycm9yXCI+PC9uZy1jb250ZW50PlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwibWF0LW1kYy1mb3JtLWZpZWxkLWhpbnQtd3JhcHBlclwiICpuZ1N3aXRjaENhc2U9XCInaGludCdcIj5cbiAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIm1hdC1oaW50Om5vdChbYWxpZ249J2VuZCddKVwiPjwvbmctY29udGVudD5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYXQtbWRjLWZvcm0tZmllbGQtaGludC1zcGFjZXJcIj48L2Rpdj5cbiAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIm1hdC1oaW50W2FsaWduPSdlbmQnXVwiPjwvbmctY29udGVudD5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjbWF0UHJlZml4VGVtcGxhdGU+XG4gIDxuZy1jb250ZW50IHNlbGVjdD1cIlttYXRQcmVmaXhdXCI+PC9uZy1jb250ZW50PlxuPC9uZy10ZW1wbGF0ZT5cblxuXG48bmctdGVtcGxhdGUgI21hdFN1ZmZpeFRlbXBsYXRlPlxuICA8bmctY29udGVudCBzZWxlY3Q9XCJbbWF0U3VmZml4XVwiPjwvbmctY29udGVudD5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
381
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0ZXJpYWwubGF0bG9uZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvc2hhcmVkL21hdGVyaWFsL2xhdGxvbmcvbWF0ZXJpYWwubGF0bG9uZy50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvc2hhcmVkL21hdGVyaWFsL2xhdGxvbmcvbWF0ZXJpYWwubGF0bG9uZy5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxnQkFBZ0IsRUFDaEIsdUJBQXVCLEVBRXZCLFNBQVMsRUFFVCxZQUFZLEVBQ1osVUFBVSxFQUNWLE1BQU0sRUFDTixLQUFLLEVBR0wsUUFBUSxFQUNSLE1BQU0sRUFDTixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUE0QyxpQkFBaUIsRUFBMEMsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDakosT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDOUQsT0FBTyxFQUNMLGFBQWEsRUFDYiw2QkFBNkIsRUFJN0IsS0FBSyxFQUNMLHdCQUF3QixHQUN6QixNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QyxPQUFPLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxlQUFlLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsK0JBQStCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDL0QsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNwQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsOEJBQThCLEVBQXVFLE1BQU0sOEJBQThCLENBQUM7QUFFbkosT0FBTyxF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UUFBUTtzQkFBaEIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNrQyxNQUFNO3NCQUE3QyxLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFO2dCQUdsQyxVQUFVO3NCQURiLEtBQUs7Z0JBUU8sUUFBUTtzQkFBcEIsS0FBSztnQkFVRixlQUFlO3NCQURsQixLQUFLO2dCQVFJLE1BQU07c0JBQWYsTUFBTTtnQkFDRyxPQUFPO3NCQUFoQixNQUFNO2dCQUVvQixZQUFZO3NCQUF0QyxTQUFTO3VCQUFDLGNBQWMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBib29sZWFuQXR0cmlidXRlLFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBmb3J3YXJkUmVmLFxuICBJbmplY3QsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3B0aW9uYWwsXG4gIE91dHB1dCxcbiAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBGb3JtR3JvdXBEaXJlY3RpdmUsIE5HX1ZBTFVFX0FDQ0VTU09SLCBVbnR5cGVkRm9ybUJ1aWxkZXIsIFVudHlwZWRGb3JtQ29udHJvbCwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFNoYXJlZFZhbGlkYXRvcnMgfSBmcm9tICcuLi8uLi92YWxpZGF0b3IvdmFsaWRhdG9ycyc7XG5pbXBvcnQge1xuICBmb3JtYXRMYXRMb25nLFxuICBMQVRfTE9OR19ERUZBVUxUX01BWF9ERUNJTUFMUyxcbiAgTGF0TG9uZ0Zvcm1hdE9wdGlvbnMsXG4gIExhdExvbmdQYXR0ZXJuLFxuICBMYXRMb25nVHlwZSxcbiAgTUFTS1MsXG4gIHBhcnNlTGF0aXR1ZGVPckxvbmdpdHVkZSxcbn0gZnJvbSAnLi9sYXRsb25nLnV0aWxzJztcbmltcG9ydCB7IFNQQUNFX1BMQUNFSE9MREVSX0NIQVIgfSBmcm9tICcuLi8uLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgZmlsdGVyIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgaXNOaWwsIGlzTm90TmlsLCBpc05vdE5pbE9yQmxhbmsgfSBmcm9tICcuLi8uLi9mdW5jdGlvbnMnO1xuaW1wb3J0IHsgZ2V0SW5wdXRTZWxlY3Rpb25SYW5nZXNGcm9tTWFzayB9IGZyb20gJy4uLy4uL2lucHV0cyc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IERFRkFVTFRfTUFYX0RFQ0lNQUxTIH0gZnJvbSAnLi4vZHVyYXRpb24vZHVyYXRpb24udXRpbHMnO1xuaW1wb3J0IHsgTUFUX0ZPUk1fRklFTERfREVGQVVMVF9PUFRJT05TLCBNYXRGb3JtRmllbGRBcHBlYXJhbmNlLCBNYXRGb3JtRmllbGREZWZhdWx0T3B0aW9ucywgU3Vic2NyaXB0U2l6aW5nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZCc7XG5pbXBvcnQgeyBBcHBGbG9hdExhYmVsVHlwZSB9IGZyb20gJy4uLy4uL2Zvcm0vZmllbGQubW9kZWwnO1xuaW1wb3J0IHsgTUFUX0ZPUk1fRklFTERfREVGQVVMVF9BUFBFQVJBTkNFLCBNQVRfRk9STV9GSUVMRF9ERUZBVUxUX1NVQlNDUklQVF9TSVpJTkcgfSBmcm9tICcuLi9tYXRlcmlhbC5jb25maWcnO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgaXNNb2JpbGUgfSBmcm9tICcuLi8uLi9wbGF0Zm9ybXMnO1xuXG5jb25zdCBub29wID0gKCkgPT4ge307XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ21hdC1sYXRsb25nLWZpZWxkJyxcbiAgdGVtcGxhdGVVcmw6ICcuL21hdGVyaWFsLmxhdGxvbmcuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL21hdGVyaWFsLmxhdGxvbmcuc2NzcyddLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTWF0TGF0TG9uZ0ZpZWxkKSxcbiAgICB9LFxuICBdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgTWF0TGF0TG9uZ0ZpZWxkIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcbiAgcHJpdmF0ZSBfb25DaGFuZ2VDYWxsYmFjazogKF86IGFueSkgPT4gdm9pZCA9IG5vb3A7XG4gIHByaXZhdGUgX29uVG91Y2hlZENhbGxiYWNrOiAoKSA9PiB2b2lkID0gbm9vcDtcbiAgcHJpdmF0ZSBfc3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuICBwcml2YXRlIF9mb3JtYXRPcHRpb25zOiBMYXRMb25nRm9ybWF0T3B0aW9ucztcbiAgcHJpdmF0ZSBfZGlzYWJsaW5nID0gZmFsc2U7XG4gIHByaXZhdGUgX3dyaXRpbmcgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfYXBwZWFyYW5jZTogTWF0Rm9ybUZpZWxkQXBwZWFyYW5jZSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIF9zdWJzY3JpcHRTaXppbmc6IFN1YnNjcmlwdFNpemluZyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IF9kZWZhdWx0QXBwZWFyYW5jZTogTWF0Rm9ybUZpZWxkQXBwZWFyYW5jZTtcbiAgcHJpdmF0ZSByZWFkb25seSBfZGVmYXVsdFN1YnNjcmlwdFNpemluZzogU3Vic2NyaXB0U2l6aW5nO1xuXG4gIHByb3RlY3RlZCBfcmVhZG9ubHkgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIHRleHRGb3JtQ29udHJvbDogVW50eXBlZEZvcm1Db250cm9sO1xuICBwcm90ZWN0ZWQgc2lnbkZvcm1Db250cm9sOiBVbnR5cGVkRm9ybUNvbnRyb2w7XG4gIHByb3RlY3RlZCBtYXNrOiAoc3RyaW5nIHwgUmVnRXhwKVtdO1xuICBwcm90ZWN0ZWQgaW5wdXRQbGFjZUhvbGRlckkxOG5LZXk6IHN0cmluZztcbiAgcHJvdGVjdGVkIHNob3dTaWduQ29udHJvbDogYm9vbGVhbjtcbiAgcHJvdGVjdGVkIG1hc2tpdG9QbGFjZWhvbGRlcjogc3RyaW5nO1xuICBwcm90ZWN0ZWQgaGFzRm9jdXM6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBnZXQgZGlzYWJsZWQoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5yZWFkb25seSB8fCB0aGlzLmZvcm1Db250cm9sLmRpc2FibGVkO1xuICB9XG5cbiAgQElucHV0KCkgZm9ybUNvbnRyb2w6IFVudHlwZWRGb3JtQ29udHJvbDtcbiAgQElucHV0KCkgZm9ybUNvbnRyb2xOYW1lOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHR5cGU6IExhdExvbmdUeXBlO1xuICBASW5wdXQoJ2xhdExvbmdQYXR0ZXJuJykgcGF0dGVybjogTGF0TG9uZ1BhdHRlcm47XG4gIEBJbnB1dCgpIHJlcXVpcmVkID0gZmFsc2U7XG4gIEBJbnB1dCgpIGZsb2F0TGFiZWw6IEFwcEZsb2F0TGFiZWxUeXBlID0gJ2F1dG8nO1xuICBASW5wdXQoKSBwbGFjZWhvbGRlcjogc3RyaW5nO1xuICBASW5wdXQoKSB0YWJpbmRleDogbnVtYmVyO1xuICBASW5wdXQoKSBkZWZhdWx0U2lnbjogJy0nIHwgJysnO1xuICBASW5wdXQoKSBtYXhEZWNpbWFsczogbnVtYmVyID0gTEFUX0xPTkdfREVGQVVMVF9NQVhfREVDSU1BTFM7XG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyQ2hhcjogc3RyaW5nO1xuICBASW5wdXQoKSBhdXRvZm9jdXMgPSBmYWxzZTtcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIG1vYmlsZTogYm9vbGVhbjtcblxuICBASW5wdXQoKVxuICBzZXQgYXBwZWFyYW5jZSh2YWx1ZTogTWF0Rm9ybUZpZWxkQXBwZWFyYW5jZSkge1xuICAgIHRoaXMuX2FwcGVhcmFuY2UgPSB2YWx1ZTtcbiAgfVxuICBnZXQgYXBwZWFyYW5jZSgpOiBNYXRGb3JtRmllbGRBcHBlYXJhbmNlIHtcbiAgICByZXR1cm4gdGhpcy5fYXBwZWFyYW5jZSB8fCB0aGlzLl9kZWZhdWx0QXBwZWFyYW5jZTtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCByZWFkb25seSh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX3JlYWRvbmx5ID0gdmFsdWU7XG4gICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIGdldCByZWFkb25seSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fcmVhZG9ubHk7XG4gIH1cblxuICBASW5wdXQoKVxuICBzZXQgc3Vic2NyaXB0U2l6aW5nKHZhbHVlOiBTdWJzY3JpcHRTaXppbmcpIHtcbiAgICB0aGlzLl9zdWJzY3JpcHRTaXppbmcgPSB2YWx1ZTtcbiAgfVxuICBnZXQgc3Vic2NyaXB0U2l6aW5nKCk6IFN1YnNjcmlwdFNpemluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3N1YnNjcmlwdFNpemluZyB8fCB0aGlzLl9kZWZhdWx0U3Vic2NyaXB0U2l6aW5nO1xuICB9XG5cbiAgQE91dHB1dCgpIG9uQmx1ciA9IG5ldyBFdmVudEVtaXR0ZXI8Rm9jdXNFdmVudD4oKTtcbiAgQE91dHB1dCgpIG9uRm9jdXMgPSBuZXcgRXZlbnRFbWl0dGVyPEZvY3VzRXZlbnQ+KCk7XG5cbiAgQFZpZXdDaGlsZCgnaW5wdXRFbGVtZW50JykgaW5wdXRFbGVtZW50OiBFbGVtZW50UmVmO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgZm9ybUJ1aWxkZXI6IFVudHlwZWRGb3JtQnVpbGRlcixcbiAgICBwcml2YXRlIGNkOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcml2YXRlIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIGZvcm1Hcm91cERpcjogRm9ybUdyb3VwRGlyZWN0aXZlLFxuICAgIEBJbmplY3QoTUFUX0ZPUk1fRklFTERfREVGQVVMVF9PUFRJT05TKSBkZWZhdWx0T3B0aW9ucz86IE1hdEZvcm1GaWVsZERlZmF1bHRPcHRpb25zXG4gICkge1xuICAgIHRoaXMuX2RlZmF1bHRTdWJzY3JpcHRTaXppbmcgPSBkZWZhdWx0T3B0aW9ucz8uc3Vic2NyaXB0U2l6aW5nIHx8IE1BVF9GT1JNX0ZJRUxEX0RFRkFVTFRfU1VCU0NSSVBUX1NJWklORztcbiAgICB0aGlzLl9kZWZhdWx0QXBwZWFyYW5jZSA9IGRlZmF1bHRPcHRpb25zPy5hcHBlYXJhbmNlIHx8IE1BVF9GT1JNX0ZJRUxEX0RFRkFVTFRfQVBQRUFSQU5DRTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMubW9iaWxlID0gdGhpcy5tb2JpbGUgPz8gaXNNb2JpbGUod2luZG93KTtcblxuICAgIGlmIChpc05pbCh0aGlzLnBsYWNlaG9sZGVyQ2hhcikpIHtcbiAgICAgIHRoaXMucGxhY2Vob2xkZXJDaGFyID0gdGhpcy5tb2JpbGUgPyBTUEFDRV9QTEFDRUhPTERFUl9DSEFSIDogJyc7XG4gICAgfVxuXG4gICAgdGhpcy50eXBlID0gdGhpcy50eXBlIHx8ICdsYXRpdHVkZSc7XG4gICAgdGhpcy5wYXR0ZXJuID0gdGhpcy5wYXR0ZXJuIHx8ICdERE1NJztcbiAgICB0aGlzLm1hc2sgPSBNQVNLU1t0aGlzLnR5cGVdPy5bdGhpcy5wYXR0ZXJuXTtcbiAgICBpZiAoIXRoaXMubWFzaykge1xuICAgICAgY29uc29sZS5lcnJvcihcIkludmFsaWQgYXR0cmlidXRlIHZhbHVlLiBFeHBlY3RlZDogdHlwZTogJ2xhdGl0dWRlfGxvbmdpdHVkZScgYW5kIGxhdGxvbmdQYXR0ZXJuOiAnRER8RERNTXxERE1NU1MnXCIpO1xuICAgICAgdGhpcy50eXBlID0gJ2xhdGl0dWRlJztcbiAgICAgIHRoaXMucGF0dGVybiA9ICdERE1NJztcbiAgICAgIHRoaXMubWFzayA9IE1BU0tTW3RoaXMudHlwZV1bdGhpcy5wYXR0ZXJuXTtcbiAgICB9XG5cbiAgICAvLyBFbnN1cmUgbWF4RGVjaW1hbHMgaGFzIGNvcnJlY3QgdmFsdWUgZGVwZW5kaW5nIG9uIHBhdHRlcm4gYW5kIGl0J3Mgb3duIHZhbHVlXG4gICAgaWYgKHRoaXMucGF0dGVybiA9PT0gJ0REJykge1xuICAgICAgaWYgKHRoaXMubWF4RGVjaW1hbHMgIT0gNykgY29uc29sZS53YXJuKGBGb3JjZSAnbWF4RGVjaW1hbHMnIHRvIGJlICc3JyB3aGVuIHVzaW5nIHRoZSAnREQnIHBhdHRlcm4uYCk7XG4gICAgICB0aGlzLm1heERlY2ltYWxzID0gNztcbiAgICB9IGVsc2UgaWYgKHRoaXMucGF0dGVybiA9PT0gJ0RETU0nKSB7XG4gICAgICBpZiAodGhpcy5tYXhEZWNpbWFscyAhPSAyKSBjb25zb2xlLndhcm4oYEZvcmNlICdtYXhEZWNpbWFscycgdG8gYmUgJzInIHdoZW4gdXNpbmcgdGhlICdERE1NU1MnIHBhdHRlcm4uYCk7XG4gICAgICB0aGlzLm1heERlY2ltYWxzID0gMztcbiAgICB9IGVsc2UgaWYgKGlzTmlsKHRoaXMubWF4RGVjaW1hbHMpKSB7XG4gICAgICB0aGlzLm1heERlY2ltYWxzID0gREVGQVVMVF9NQVhfREVDSU1BTFM7XG4gICAgfSBlbHNlIGlmICh0aGlzLm1heERlY2ltYWxzIDwgMCkge1xuICAgICAgY29uc29sZS5lcnJvcihcIkludmFsaWQgYXR0cmlidXRlICdtYXhEZWNpbWFscycuIE11c3QgYSBwb3NpdGl2ZSB2YWx1ZS5cIik7XG4gICAgICB0aGlzLm1heERlY2ltYWxzID0gREVGQVVMVF9NQVhfREVDSU1BTFM7XG4gICAgfSBlbHNlIGlmICh0aGlzLm1heERlY2ltYWxzICE9PSBERUZBVUxUX01BWF9ERUNJTUFMUykge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgSW52YWxpZCBhdHRyaWJ1dGUgJ21heERlY2ltYWxzJyAtIEV4cGVjdGVkIHZhbHVlOiAke0RFRkFVTFRfTUFYX0RFQ0lNQUxTfSBidXQgZ2V0OiAke3RoaXMubWF4RGVjaW1hbHN9LiBPdGhlciB2YWx1ZSBub3QgaW1wbGVtZW50ZWQuYFxuICAgICAgKTtcbiAgICAgIHRoaXMubWF4RGVjaW1hbHMgPSBERUZBVUxUX01BWF9ERUNJTUFMUztcbiAgICB9XG5cbiAgICB0aGlzLnNob3dTaWduQ29udHJvbCA9IHRoaXMucGF0dGVybiAhPT0gJ0REJztcblxuICAgIHRoaXMuX2Zvcm1hdE9wdGlvbnMgPSB7XG4gICAgICBwYXR0ZXJuOiB0aGlzLnBhdHRlcm4sXG4gICAgICBtYXhEZWNpbWFsczogdGhpcy5tYXhEZWNpbWFscyxcbiAgICAgIGhpZGVTaWduOiB0aGlzLnNob3dTaWduQ29udHJvbCxcbiAgICAgIGlucHV0U2VsZWN0aW9uUmFuZ2VzOiBnZXRJbnB1dFNlbGVjdGlvblJhbmdlc0Zyb21NYXNrKHRoaXMubWFzayksXG4gICAgICBwbGFjZWhvbGRlckNoYXI6IHRoaXMucGxhY2Vob2xkZXJDaGFyLFxuICAgIH07XG5cbiAgICB0aGlzLmlucHV0UGxhY2VIb2xkZXJJMThuS2V5ID0gJ0NPTU1PTi5MQVRfTE9ORy4nICsgKCh0aGlzLnR5cGUgPT09ICdsb25naXR1ZGUnICYmICdEJykgfHwgJycpICsgdGhpcy5wYXR0ZXJuICsgJ19QTEFDRUhPTERFUic7XG5cbiAgICB0aGlzLnRleHRGb3JtQ29udHJvbCA9IHRoaXMuZm9ybUJ1aWxkZXIuY29udHJvbCh0aGlzLnJlcXVpcmVkID8gW251bGwsIFZhbGlkYXRvcnMucmVxdWlyZWRdIDogW251bGxdKTtcblxuICAgIHRoaXMuc2lnbkZvcm1Db250cm9sID0gdGhpcy5mb3JtQnVpbGRlci5jb250cm9sKHRoaXMucmVxdWlyZWQgPyBbbnVsbCwgVmFsaWRhdG9ycy5yZXF1aXJlZF0gOiBbbnVsbF0pO1xuXG4gICAgdGhpcy5mb3JtQ29udHJvbCA9XG4gICAgICB0aGlzLmZvcm1Db250cm9sIHx8ICh0aGlzLmZvcm1Db250cm9sTmFtZSAmJiB0aGlzLmZvcm1Hcm91cERpciAmJiAodGhpcy5mb3JtR3JvdXBEaXIuZm9ybS5nZXQodGhpcy5mb3JtQ29udHJvbE5hbWUpIGFzIFVudHlwZWRGb3JtQ29udHJvbCkpO1xuICAgIGlmICghdGhpcy5mb3JtQ29udHJvbCkgdGhyb3cgbmV3IEVycm9yKFwiTWlzc2luZyBtYW5kYXRvcnkgYXR0cmlidXRlICdmb3JtQ29udHJvbCcgb3IgJ2Zvcm1Db250cm9sTmFtZScgaW4gPG1hdC1sYXRsb25nLWZpZWxkPi5cIik7XG5cbiAgICBjb25zdCBleGlzdGluZ1ZhbGlkYXRvcnMgPSB0aGlzLmZvcm1Db250cm9sLnZhbGlkYXRvcjtcbiAgICBpZiAoZXhpc3RpbmdWYWxpZGF0b3JzKSB7XG4gICAgICB0aGlzLmZvcm1Db250cm9sLnNldFZhbGlkYXRvcnMoW2V4aXN0aW5nVmFsaWRhdG9ycywgdGhpcy50eXBlID09PSAnbGF0aXR1ZGUnID8gU2hhcmVkVmFsaWRhdG9ycy5sYXRpdHVkZSA6IFNoYXJlZFZhbGlkYXRvcnMubG9uZ2l0dWRlXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZm9ybUNvbnRyb2wuc2V0VmFsaWRhdG9ycyh0aGlzLnR5cGUgPT09ICdsYXRpdHVkZScgPyBTaGFyZWRWYWxpZGF0b3JzLmxhdGl0dWRlIDogU2hhcmVkVmFsaWRhdG9ycy5sb25naXR1ZGUpO1xuICAgIH1cblxuICAgIHRoaXMuX3N1YnNjcmlwdGlvbi5hZGQoXG4gICAgICB0aGlzLnNpZ25Gb3JtQ29udHJvbC52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgY29uc3Qgc3RyVmFsdWUgPSB0aGlzLnRleHRGb3JtQ29udHJvbC52YWx1ZTtcbiAgICAgICAgY29uc3QgcGFyc2VkVmFsdWUgPSB0aGlzLnBhcnNlVmFsdWUoc3RyVmFsdWUpO1xuICAgICAgICAvLyBUT0RPIE5lZWQgdG8gY2hlY2sgdGhpcyBvciBkZWxlZ2F0ZSB0aGUgd29yayBvbiB2YWxpZGF0b3JcbiAgICAgICAgLy8gaWYgKHRoaXMuZm9ybUNvbnRyb2wudmFsaWQpIHtcbiAgICAgICAgLy8gfVxuICAgICAgICB0aGlzLmZvcm1Db250cm9sLnBhdGNoVmFsdWUocGFyc2VkVmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIC8vIExpc3RlbiBzdGF0dXMgY2hhbmdlcyAod2hlbiBkb25lIG91dHNpZGUgdGhlIGNvbXBvbmVudCAgLSBlLmcuIHdoZW4gc2V0RXJyb3JzKCkgaXMgY2FsbGluZyBvbiB0aGUgZm9ybUNvbnRyb2wpXG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uLmFkZChcbiAgICAgIHRoaXMuZm9ybUNvbnRyb2wuc3RhdHVzQ2hhbmdlc1xuICAgICAgICAucGlwZShcbiAgICAgICAgICBmaWx0ZXIoKCkgPT4gIXRoaXMucmVhZG9ubHkgJiYgIXRoaXMuX3dyaXRpbmcgJiYgIXRoaXMuX2Rpc2FibGluZykgLy8gU2tpcFxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5tYXJrRm9yQ2hlY2soKSlcbiAgICApO1xuXG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uLmFkZCh0aGlzLnRyYW5zbGF0ZS5nZXQodGhpcy5pbnB1dFBsYWNlSG9sZGVySTE4bktleSkuc3Vic2NyaWJlKCh0cmFuc2xhdGlvbikgPT4gdGhpcy51cGRhdGVUcmFuc2xhdGlvbnModHJhbnNsYXRpb24pKSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLl9zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIHdyaXRlVmFsdWUob2JqOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fd3JpdGluZykgcmV0dXJuO1xuICAgIHRoaXMuX3dyaXRpbmcgPSB0cnVlO1xuXG4gICAgY29uc3QgdmFsdWUgPSB0eXBlb2Ygb2JqID09PSAnc3RyaW5nJyA/IHBhcnNlRmxvYXQob2JqLnJlcGxhY2UoLywvZywgJy4nKSkgOiBvYmo7XG4gICAgY29uc3QgZml4TGF0TG9uZyA9IHRoaXMuZm9ybUNvbnRyb2wudmFsaWQ7XG4gICAgY29uc3Qgc3RyVmFsdWUgPSB0aGlzLl9mb3JtYXQodmFsdWUsIHsgZml4TGF0TG9uZyB9KTtcblxuICAgIGNvbnN0IHNpZ24gPSBpc05vdE5pbCh2YWx1ZSlcbiAgICAgID8gdmFsdWUgPCAwXG4gICAgICAgID8gLTFcbiAgICAgICAgOiAxXG4gICAgICA6IC8vIFVzZSBkZWZhdWx0IHNpZ24sIGlmIGFueVxuICAgICAgICB0aGlzLmRlZmF1bHRTaWduXG4gICAgICAgID8gdGhpcy5kZWZhdWx0U2lnbiA9PT0gJy0nXG4gICAgICAgICAgPyAtMVxuICAgICAgICAgIDogMVxuICAgICAgICA6IG51bGw7XG5cbiAgICB0aGlzLnNpZ25Gb3JtQ29udHJvbC5wYXRjaFZhbHVlKHNpZ24sIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgIC8vIFJlc2V0IHRoZSBmaWVsZFxuICAgICAgdGhpcy50ZXh0Rm9ybUNvbnRyb2wucGF0Y2hWYWx1ZShudWxsLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudGV4dEZvcm1Db250cm9sLnBhdGNoVmFsdWUoc3RyVmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB9XG5cbiAgICB0aGlzLl93cml0aW5nID0gZmFsc2U7XG4gICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2sgPSBmbjtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLl9vblRvdWNoZWRDYWxsYmFjayA9IGZuO1xuICB9XG5cbiAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2Rpc2FibGluZykgcmV0dXJuO1xuXG4gICAgdGhpcy5fZGlzYWJsaW5nID0gdHJ1ZTtcbiAgICBpZiAoaXNEaXNhYmxlZCkge1xuICAgICAgdGhpcy50ZXh0Rm9ybUNvbnRyb2wuZGlzYWJsZSh7IG9ubHlTZWxmOiB0cnVlLCBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgdGhpcy5zaWduRm9ybUNvbnRyb2wuZGlzYWJsZSh7IG9ubHlTZWxmOiB0cnVlLCBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnRleHRGb3JtQ29udHJvbC5lbmFibGUoeyBvbmx5U2VsZjogdHJ1ZSwgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgIHRoaXMuc2lnbkZvcm1Db250cm9sLmVuYWJsZSh7IG9ubHlTZWxmOiB0cnVlLCBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIH1cbiAgICB0aGlzLl9kaXNhYmxpbmcgPSBmYWxzZTtcbiAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgX29uRm9jdXMoZXZlbnQ6IEZvY3VzRXZlbnQpIHtcbiAgICB0aGlzLmhhc0ZvY3VzID0gdHJ1ZTtcbiAgICBjb25zdCBmaXhMYXRMb25nID0gdGhpcy5mb3JtQ29udHJvbC52YWxpZDtcblxuICAgIGxldCBzdHJWYWx1ZSA9XG4gICAgICBmb3JtYXRMYXRMb25nKHRoaXMuZm9ybUNvbnRyb2wudmFsdWUsIHRoaXMudHlwZSwgeyAuLi50aGlzLl9mb3JtYXRPcHRpb25zLCBwbGFjZWhvbGRlckNoYXI6ICcwJywgZml4TGF0TG9uZyB9KSA/PyB0aGlzLm1hc2tpdG9QbGFjZWhvbGRlcjtcblxuICAgIGlmIChzdHJWYWx1ZS5zdGFydHNXaXRoKCfCsScpKSB7XG4gICAgICBzdHJWYWx1ZSA9IHN0clZhbHVlLnJlcGxhY2UoJ8KxJywgdGhpcy5kZWZhdWx0U2lnbik7XG4gICAgICBpZiAodGhpcy50eXBlID09PSAnbGF0aXR1ZGUnKSB7XG4gICAgICAgIHRoaXMudGV4dEZvcm1Db250cm9sLnNldFZhbHVlKHN0clZhbHVlICsgJyAnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudGV4dEZvcm1Db250cm9sLnNldFZhbHVlKHN0clZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnRleHRGb3JtQ29udHJvbC5zZXRWYWx1ZShzdHJWYWx1ZSk7XG5cbiAgICB0aGlzLm9uRm9jdXMuZW1pdChldmVudCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBfb25CbHVyKGV2ZW50OiBGb2N1c0V2ZW50KSB7XG4gICAgdGhpcy5oYXNGb2N1cyA9IGZhbHNlO1xuICAgIGxldCBzdHJWYWx1ZSA9IHRoaXMudGV4dEZvcm1Db250cm9sLnZhbHVlO1xuXG4gICAgLy8gUmVzZXQgbWFzayBpZiB2YWx1ZSBpcyBlbXB0eVxuICAgIGlmICghL1xcZC8udGVzdChzdHJWYWx1ZSkpIHtcbiAgICAgIHN0clZhbHVlID0gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJzZWRWYWx1ZSA9IHRoaXMucGFyc2VWYWx1ZShzdHJWYWx1ZSk7XG4gICAgdGhpcy5mb3JtQ29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XG4gICAgdGhpcy5mb3JtQ29udHJvbC5wYXRjaFZhbHVlKHBhcnNlZFZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG5cbiAgICB0aGlzLm9uQmx1ci5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBfZm9ybWF0KHZhbHVlOiBudW1iZXIsIG9wdHM6IFBhcnRpYWw8TGF0TG9uZ0Zvcm1hdE9wdGlvbnM+ID0ge30pOiBzdHJpbmcge1xuICAgIHJldHVybiBmb3JtYXRMYXRMb25nKHZhbHVlLCB0aGlzLnR5cGUsIHsgLi4udGhpcy5fZm9ybWF0T3B0aW9ucywgLi4ub3B0cyB9KSA/PyB0aGlzLm1hc2tpdG9QbGFjZWhvbGRlcjtcbiAgfVxuICAvKiAtLSBwcml2YXRlIG1ldGhvZCAtLSAqL1xuXG4gIHByaXZhdGUgdXBkYXRlVHJhbnNsYXRpb25zKHRyYW5zbGF0aW9uOiBzdHJpbmcpIHtcbiAgICAvLyBObyBjaGFuZ2VcbiAgICBpZiAodGhpcy5tYXNraXRvUGxhY2Vob2xkZXIgPT09IHRyYW5zbGF0aW9uKSByZXR1cm47XG4gICAgLy8gVHJhbnNsYXRpb24gZmFsbGJhY2tcbiAgICBpZiAodGhpcy5pbnB1dFBsYWNlSG9sZGVySTE4bktleSA9PT0gdHJhbnNsYXRpb24pIHtcbiAgICAgIHN3aXRjaCAodGhpcy5wYXR0ZXJuKSB7XG4gICAgICAgIGNhc2UgJ0REJzpcbiAgICAgICAgICBpZiAodGhpcy50eXBlID09PSAnbG9uZ2l0dWRlJykge1xuICAgICAgICAgICAgdGhpcy5tYXNraXRvUGxhY2Vob2xkZXIgPSAnwrFEREQuRERERERERMKwJztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5tYXNraXRvUGxhY2Vob2xkZXIgPSAnwrEgREQuRERERERERMKwJztcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ0RETU0nOlxuICAgICAgICAgIGlmICh0aGlzLnR5cGUgPT09ICdsb25naXR1ZGUnKSB7XG4gICAgICAgICAgICB0aGlzLm1hc2tpdG9QbGFjZWhvbGRlciA9IFwiREREwrAgTU0uTU1NJ1wiO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm1hc2tpdG9QbGFjZWhvbGRlciA9IFwiRETCsCBNTS5NTU0nXCI7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdERE1NU1MnOlxuICAgICAgICAgIGlmICh0aGlzLnR5cGUgPT09ICdsb25naXR1ZGUnKSB7XG4gICAgICAgICAgICB0aGlzLm1hc2tpdG9QbGFjZWhvbGRlciA9ICdERETCsCBNTVxcJyBTUy5TU1wiJztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5tYXNraXRvUGxhY2Vob2xkZXIgPSAnRETCsCBNTVxcJyBTUy5TU1wiJztcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMubWFza2l0b1BsYWNlaG9sZGVyID0gdHJhbnNsYXRpb247XG4gIH1cblxuICBwcml2YXRlIHBhcnNlVmFsdWUoc3RyVmFsdWU6IHN0cmluZyk6IG51bWJlciB7XG4gICAgbGV0IHBhcnNlZFZhbHVlOiBudW1iZXI7XG4gICAgaWYgKGlzTm90TmlsT3JCbGFuayhzdHJWYWx1ZSkpIHtcbiAgICAgIGlmICh0aGlzLnBhdHRlcm4gPT09ICdERCcpIHtcbiAgICAgICAgcGFyc2VkVmFsdWUgPSBwYXJzZUxhdGl0dWRlT3JMb25naXR1ZGUoc3RyVmFsdWUsIHRoaXMucGF0dGVybiwgNyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBzaWduID0gdGhpcy5zaWduRm9ybUNvbnRyb2wudmFsdWUgfHwgdGhpcy5kZWZhdWx0U2lnbiA9PT0gJy0nID8gLTEgOiAxO1xuICAgICAgICBwYXJzZWRWYWx1ZSA9IHNpZ24gKiBwYXJzZUxhdGl0dWRlT3JMb25naXR1ZGUoc3RyVmFsdWUsIHRoaXMucGF0dGVybiwgNyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhcnNlZFZhbHVlID0gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5wYXR0ZXJuICE9PSAnREQnICYmIHBhcnNlZFZhbHVlICE9PSBudWxsKSB7XG4gICAgICBjb25zdCBzaWduID0gdGhpcy5zaWduRm9ybUNvbnRyb2wudmFsdWU7XG4gICAgICBwYXJzZWRWYWx1ZSA9IHNpZ24gKiBNYXRoLmFicyhwYXJzZWRWYWx1ZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcnNlZFZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSBtYXJrRm9yQ2hlY2soKSB7XG4gICAgdGhpcy5jZC5tYXJrRm9yQ2hlY2soKTtcbiAgfVxufVxuIiwiPCEtLSByZWFkb25seSAtLT5cbjxtYXQtZm9ybS1maWVsZFxuICAqbmdJZj1cInJlYWRvbmx5OyBlbHNlIHdyaXRhYmxlXCJcbiAgW2Zsb2F0TGFiZWxdPVwiZmxvYXRMYWJlbCB8IGFzRmxvYXRMYWJlbFR5cGVcIlxuICBbYXBwZWFyYW5jZV09XCJhcHBlYXJhbmNlXCJcbiAgW3N1YnNjcmlwdFNpemluZ109XCJzdWJzY3JpcHRTaXppbmdcIlxuICBjbGFzcz1cIm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkXCJcbj5cbiAgPGRpdiBtYXRQcmVmaXg+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm1hdFByZWZpeFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxuXG4gIEBpZiAoZmxvYXRMYWJlbCAhPT0gJ25ldmVyJyAmJiAhIXBsYWNlaG9sZGVyKSB7XG4gICAgPG1hdC1sYWJlbD57eyBwbGFjZWhvbGRlciB9fTwvbWF0LWxhYmVsPlxuICB9XG5cbiAgPGlucHV0IG1hdElucHV0IGhpZGRlbiB0eXBlPVwidGV4dFwiIHJlYWRvbmx5IFtmb3JtQ29udHJvbF09XCJmb3JtQ29udHJvbFwiIC8+XG4gIDxpb24tdGV4dD57eyBfZm9ybWF0KGZvcm1Db250cm9sLnZhbHVlKSB9fTwvaW9uLXRleHQ+XG5cbiAgPGRpdiBtYXRTdWZmaXg+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm1hdFN1ZmZpeFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxuXG4gIDwhLS0gaGludHMgLS0+XG4gIDxtYXQtaGludCBbY2xhc3MuY2RrLXZpc3VhbGx5LWhpZGRlbl09XCJmb3JtQ29udHJvbC5pbnZhbGlkXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm1hdEhpbnRUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICA8L21hdC1oaW50PlxuPC9tYXQtZm9ybS1maWVsZD5cblxuPCEtLSB3cml0YWJsZSAtLT5cbjxuZy10ZW1wbGF0ZSAjd3JpdGFibGU+XG4gIDxpb24tZ3JpZCBjbGFzcz1cImlvbi1uby1wYWRkaW5nIHt7IGFwcGVhcmFuY2UgfX1cIj5cbiAgICA8aW9uLXJvdyBjbGFzcz1cImlvbi1uby1wYWRkaW5nIG5vLXdyYXBcIj5cbiAgICAgIDxpb24tY29sIGNsYXNzPVwidGV4dCBpb24tbm8tcGFkZGluZ1wiPlxuICAgICAgICA8bWF0LWZvcm0tZmllbGRcbiAgICAgICAgICBbZmxvYXRMYWJlbF09XCJmbG9hdExhYmVsIHwgYXNGbG9hdExhYmVsVHlwZVwiXG4gICAgICAgICAgW2FwcGVhcmFuY2VdPVwiYXBwZWFyYW5jZVwiXG4gICAgICAgICAgW3N1YnNjcmlwdFNpemluZ109XCInZHluYW1pYydcIlxuICAgICAgICAgIFtjbGFzcy5tZGMtdGV4dC1maWVsZC0taW52YWxpZF09XCJmb3JtQ29udHJvbC50b3VjaGVkICYmIChzaWduRm9ybUNvbnRyb2wuaW52YWxpZCB8fCBmb3JtQ29udHJvbC5pbnZhbGlkKVwiXG4gICAgICAgID5cbiAgICAgICAgICA8ZGl2IG1hdFByZWZpeD5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJtYXRQcmVmaXhUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPG1hdC1sYWJlbCAqbmdJZj1cImZsb2F0TGFiZWwgIT09ICduZXZlcicgJiYgISFwbGFjZWhvbGRlclwiPnt7IHBsYWNlaG9sZGVyIH19PC9tYXQtbGFiZWw+XG5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAjaW5wdXRFbGVtZW50XG4gICAgICAgICAgICBbbWFza2l0b109XCJtYXNraXRvUGxhY2Vob2xkZXIgfCBtYXNraXRvUGxhY2Vob2xkZXI6IG1hc2tcIlxuICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCJcbiAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlclwiXG4gICAgICAgICAgICAoYmx1cik9XCJfb25CbHVyKCRldmVudClcIlxuICAgICAgICAgICAgKGZvY3VzKT1cIl9vbkZvY3VzKCRldmVudClcIlxuICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cInRleHRGb3JtQ29udHJvbFwiXG4gICAgICAgICAgICBbcmVxdWlyZWRdPVwicmVxdWlyZWRcIlxuICAgICAgICAgICAgW3RhYmluZGV4XT1cInRhYmluZGV4XCJcbiAgICAgICAgICAgIFthcHBBdXRvZm9jdXNdPVwiYXV0b2ZvY3VzXCJcbiAgICAgICAgICAvPlxuXG4gICAgICAgICAgQGlmICghc2hvd1NpZ25Db250cm9sKSB7XG4gICAgICAgICAgICA8ZGl2IG1hdFN1ZmZpeD5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm1hdFN1ZmZpeFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICA8L2lvbi1jb2w+XG5cbiAgICAgIDwhLS0gc2lnbiAtLT5cbiAgICAgIEBpZiAoc2hvd1NpZ25Db250cm9sKSB7XG4gICAgICAgIDxpb24tY29sIGNsYXNzPVwic2lnbiBpb24tbm8tcGFkZGluZyB7eyB0eXBlIH19XCI+XG4gICAgICAgICAgQHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgQGNhc2UgKCdsYXRpdHVkZScpIHtcbiAgICAgICAgICAgICAgPCEtLSBzaWduIG9uIGxhdGl0dWRlIC0tPlxuICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGRcbiAgICAgICAgICAgICAgICBbYXBwZWFyYW5jZV09XCJhcHBlYXJhbmNlXCJcbiAgICAgICAgICAgICAgICBbc3Vic2NyaXB0U2l6aW5nXT1cIidkeW5hbWljJ1wiXG4gICAgICAgICAgICAgICAgW2NsYXNzLm1kYy10ZXh0LWZpZWxkLS1pbnZhbGlkXT1cImZvcm1Db250cm9sLnRvdWNoZWQgJiYgc2lnbkZvcm1Db250cm9sLmludmFsaWRcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPG1hdC1zZWxlY3RcbiAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJzaWduRm9ybUNvbnRyb2xcIlxuICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidDT01NT04uTEFUX0xPTkcuTEFUX1NJR05fUExBQ0VIT0xERVInIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgIFt0YWJpbmRleF09XCJ0YWJpbmRleCAhPT0gdW5kZWZpbmVkID8gdGFiaW5kZXggKyAxIDogdW5kZWZpbmVkXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwiMVwiPnt7ICdDT01NT04uTEFUX0xPTkcuTEFUX1NJR05fTicgfCB0cmFuc2xhdGUgfX08L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwiLTFcIj57eyAnQ09NTU9OLkxBVF9MT05HLkxBVF9TSUdOX1MnIHwgdHJhbnNsYXRlIH19PC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cblxuICAgICAgICAgICAgICAgIDxkaXYgbWF0U3VmZml4PlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm1hdFN1ZmZpeFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAY2FzZSAoJ2xvbmdpdHVkZScpIHtcbiAgICAgICAgICAgICAgPCEtLSBzaWduIG9uIGxvbmdpdHVkZSAtLT5cbiAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkXG4gICAgICAgICAgICAgICAgW2FwcGVhcmFuY2VdPVwiYXBwZWFyYW5jZVwiXG4gICAgICAgICAgICAgICAgW3N1YnNjcmlwdFNpemluZ109XCInZHluYW1pYydcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5tZGMtdGV4dC1maWVsZC0taW52YWxpZF09XCJmb3JtQ29udHJvbC50b3VjaGVkICYmIHNpZ25Gb3JtQ29udHJvbC5pbnZhbGlkXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxtYXQtc2VsZWN0XG4gICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwic2lnbkZvcm1Db250cm9sXCJcbiAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCInQ09NTU9OLkxBVF9MT05HLkxPTkdfU0lHTl9QTEFDRUhPTERFUicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgW3RhYmluZGV4XT1cInRhYmluZGV4ICE9PSB1bmRlZmluZWQgPyB0YWJpbmRleCArIDEgOiB1bmRlZmluZWRcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIFt2YWx1ZV09XCIxXCIgdHJhbnNsYXRlPnt7ICdDT01NT04uTEFUX0xPTkcuTE9OR19TSUdOX0UnIHwgdHJhbnNsYXRlIH19PC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cIi0xXCIgdHJhbnNsYXRlPnt7ICdDT01NT04uTEFUX0xPTkcuTE9OR19TSUdOX1cnIHwgdHJhbnNsYXRlIH19PC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cblxuICAgICAgICAgICAgICAgIDxkaXYgbWF0U3VmZml4PlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm1hdFN1ZmZpeFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICA8L2lvbi1jb2w+XG4gICAgICB9XG4gICAgPC9pb24tcm93PlxuICA8L2lvbi1ncmlkPlxuXG4gIDwhLS0gRG8gdGhlIHNhbWUgYXMgTWF0RnJvbUZpZWxkIHNpbmNlIGFuZ3VsYXIgMTUgKHNlZSBjb21wb25lbnQgc291cmNlKS0tPlxuICA8ZGl2XG4gICAgY2xhc3M9XCJtYXQtbWRjLWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJcIlxuICAgIFtjbGFzcy5tYXQtbWRjLWZvcm0tZmllbGQtYm90dG9tLWFsaWduXT1cInN1YnNjcmlwdFNpemluZyA9PT0gJ2ZpeGVkJ1wiXG4gICAgW2NsYXNzLm1hdC1tZGMtZm9ybS1maWVsZC1zdWJzY3JpcHQtZHluYW1pYy1zaXplXT1cInN1YnNjcmlwdFNpemluZyA9PT0gJ2R5bmFtaWMnXCJcbiAgPlxuICAgIEBpZiAoZm9ybUNvbnRyb2wudG91Y2hlZCAmJiBmb3JtQ29udHJvbC5pbnZhbGlkKSB7XG4gICAgICA8IS0tIGVycm9ycyAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYXQtbWRjLWZvcm0tZmllbGQtZXJyb3Itd3JhcHBlclwiPlxuICAgICAgICBAaWYgKGZvcm1Db250cm9sLmVycm9ycyB8IG1hcEtleXMgfCBhcnJheUZpcnN0OyBhcyBlcnJvcktleSkge1xuICAgICAgICAgIEBzd2l0Y2ggKGVycm9yS2V5KSB7XG4gICAgICAgICAgICBAY2FzZSAoJ3JlcXVpcmVkJykge1xuICAgICAgICAgICAgICA8bWF0LWVycm9yIHRyYW5zbGF0ZT5FUlJPUi5GSUVMRF9SRVFVSVJFRDwvbWF0LWVycm9yPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGNhc2UgKCdsYXRpdHVkZScpIHtcbiAgICAgICAgICAgICAgPG1hdC1lcnJvciB0cmFuc2xhdGU+RVJST1IuRklFTERfTk9UX1ZBTElEX0xBVElUVURFPC9tYXQtZXJyb3I+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAY2FzZSAoJ2xvbmdpdHVkZScpIHtcbiAgICAgICAgICAgICAgPG1hdC1lcnJvciB0cmFuc2xhdGU+RVJST1IuRklFTERfTk9UX1ZBTElEX0xPTkdJVFVERTwvbWF0LWVycm9yPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGNhc2UgKCdtaW4nKSB7XG4gICAgICAgICAgICAgIDxtYXQtZXJyb3I+XG4gICAgICAgICAgICAgICAge3sgJ0VSUk9SLkZJRUxEX01JTl9DT01QQUNUJyB8IHRyYW5zbGF0ZTogeyBtaW46IF9mb3JtYXQoZm9ybUNvbnRyb2wuZXJyb3JzLm1pbi5taW4pIH0gfX1cbiAgICAgICAgICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAY2FzZSAoJ21heCcpIHtcbiAgICAgICAgICAgICAgPG1hdC1lcnJvcj5cbiAgICAgICAgICAgICAgICB7eyAnRVJST1IuRklFTERfTUFYX0NPTVBBQ1QnIHwgdHJhbnNsYXRlOiB7IG1heDogX2Zvcm1hdChmb3JtQ29udHJvbC5lcnJvcnMubWF4Lm1heCkgfSB9fVxuICAgICAgICAgICAgICA8L21hdC1lcnJvcj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBjYXNlICgnbXNnJykge1xuICAgICAgICAgICAgICA8bWF0LWVycm9yPlxuICAgICAgICAgICAgICAgIHt7IGZvcm1Db250cm9sLmVycm9ycy5tc2c/LmtleSB8fCBmb3JtQ29udHJvbC5lcnJvcnMubXNnIHwgdHJhbnNsYXRlOiBmb3JtQ29udHJvbC5lcnJvcnMubXNnPy5wYXJhbXMgfX1cbiAgICAgICAgICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAZGVmYXVsdCB7XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJtYXRFcnJvclRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibWF0RXJyb3JUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICB9IEBlbHNlIHtcbiAgICAgIDwhLS0gaGludHMgLS0+XG4gICAgICA8bWF0LWhpbnQ+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJtYXRIaW50VGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbWF0LWhpbnQ+XG4gICAgfVxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjbWF0UHJlZml4VGVtcGxhdGU+XG4gIDxuZy1jb250ZW50IHNlbGVjdD1cIlttYXRQcmVmaXhdXCI+PC9uZy1jb250ZW50PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNtYXRTdWZmaXhUZW1wbGF0ZT5cbiAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW21hdFN1ZmZpeF1cIj48L25nLWNvbnRlbnQ+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI21hdEVycm9yVGVtcGxhdGU+XG4gIDxuZy1jb250ZW50IHNlbGVjdD1cIm1hdC1lcnJvcixbbWF0RXJyb3JdXCI+PC9uZy1jb250ZW50PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNtYXRIaW50VGVtcGxhdGU+XG4gIDxkaXYgY2xhc3M9XCJtYXQtbWRjLWZvcm0tZmllbGQtaGludC13cmFwcGVyXCI+XG4gICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwibWF0LWhpbnQ6bm90KFthbGlnbj0nZW5kJ10pLFttYXRIaW50XVwiPjwvbmctY29udGVudD5cbiAgICA8ZGl2IGNsYXNzPVwibWF0LW1kYy1mb3JtLWZpZWxkLWhpbnQtc3BhY2VyXCI+PC9kaXY+XG4gICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwibWF0LWhpbnRbYWxpZ249J2VuZCddXCI+PC9uZy1jb250ZW50PlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=