@bravobit/bb-foundation 0.16.4 → 0.20.1

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 (426) hide show
  1. package/README.md +47 -47
  2. package/auth/bravobit-bb-foundation-auth.d.ts +5 -5
  3. package/auth/lib/auth.interceptor.d.ts +21 -21
  4. package/auth/lib/auth.module.d.ts +15 -15
  5. package/auth/lib/auth.service.d.ts +59 -59
  6. package/auth/lib/auth.session.d.ts +34 -34
  7. package/auth/lib/directives/authenticated.directive.d.ts +14 -14
  8. package/auth/lib/directives/permission.directive.d.ts +24 -24
  9. package/auth/lib/directives/role.directive.d.ts +16 -16
  10. package/auth/lib/guards/anonymous.guard.d.ts +11 -11
  11. package/auth/lib/guards/authenticated.guard.d.ts +11 -11
  12. package/auth/lib/helpers/jwt.helper.d.ts +8 -8
  13. package/auth/lib/helpers/mapper.helper.d.ts +23 -23
  14. package/auth/lib/interfaces/config.interface.d.ts +12 -12
  15. package/auth/lib/interfaces/mapper.interface.d.ts +19 -19
  16. package/auth/lib/interfaces/provider.interface.d.ts +16 -16
  17. package/auth/lib/interfaces/token.interface.d.ts +11 -11
  18. package/auth/lib/permissions.service.d.ts +14 -14
  19. package/auth/lib/providers/email.provider.d.ts +15 -15
  20. package/auth/lib/providers/verify.provider.d.ts +13 -13
  21. package/auth/lib/tokens/use-authorization.token.d.ts +2 -2
  22. package/auth/public_api.d.ts +18 -18
  23. package/bravobit-bb-foundation.d.ts +5 -5
  24. package/collections/bravobit-bb-foundation-collections.d.ts +5 -5
  25. package/collections/lib/collection.d.ts +43 -43
  26. package/collections/lib/collections.module.d.ts +10 -10
  27. package/collections/lib/components/collections-pager/collections-pager.component.d.ts +34 -34
  28. package/collections/lib/components/collections-viewer/collections-viewer.component.d.ts +12 -12
  29. package/collections/lib/components/collections.directive.d.ts +17 -17
  30. package/collections/lib/interfaces/collection.interface.d.ts +26 -26
  31. package/collections/lib/providers/api-collection.provider.d.ts +19 -15
  32. package/collections/lib/providers/collection.provider.d.ts +6 -6
  33. package/collections/lib/providers/local-collection.provider.d.ts +8 -8
  34. package/collections/public_api.d.ts +9 -9
  35. package/controls/bravobit-bb-foundation-controls.d.ts +5 -5
  36. package/controls/lib/checkbox/checkbox/checkbox.component.d.ts +47 -47
  37. package/controls/lib/checkbox/checkbox-group/checkbox-group.component.d.ts +18 -18
  38. package/controls/lib/checkbox/checkbox.module.d.ts +9 -9
  39. package/controls/lib/controls.module.d.ts +7 -7
  40. package/controls/public_api.d.ts +4 -4
  41. package/dashboard/bravobit-bb-foundation-dashboard.d.ts +5 -5
  42. package/dashboard/lib/dashboard/dashboard.component.d.ts +19 -19
  43. package/dashboard/lib/dashboard-header/dashboard-header.component.d.ts +11 -11
  44. package/dashboard/lib/dashboard-menu/dashboard-menu.component.d.ts +9 -9
  45. package/dashboard/lib/dashboard-menu-item/dashboard-menu-item.component.d.ts +11 -11
  46. package/dashboard/lib/dashboard-sidebar/dashboard-sidebar.component.d.ts +21 -21
  47. package/dashboard/lib/dashboard-sidebar-group/dashboard-sidebar-group.component.d.ts +27 -27
  48. package/dashboard/lib/dashboard-sidebar-item/dashboard-sidebar-item.component.d.ts +16 -16
  49. package/dashboard/lib/dashboard.module.d.ts +16 -16
  50. package/dashboard/public_api.d.ts +8 -8
  51. package/dialog/bravobit-bb-foundation-dialog.d.ts +5 -5
  52. package/dialog/lib/dialog-actions/dialog-actions.component.d.ts +5 -5
  53. package/dialog/lib/dialog-confirm/dialog-confirm.component.d.ts +16 -16
  54. package/dialog/lib/dialog-container/dialog-container.component.d.ts +24 -24
  55. package/dialog/lib/dialog-header/dialog-header.component.d.ts +9 -9
  56. package/dialog/lib/dialog-link/dialog-link.component.d.ts +5 -5
  57. package/dialog/lib/dialog-modal/dialog-modal.component.d.ts +12 -12
  58. package/dialog/lib/dialog-overlay/dialog-overlay.component.d.ts +22 -22
  59. package/dialog/lib/dialog.injector.d.ts +8 -8
  60. package/dialog/lib/dialog.insertion.d.ts +8 -8
  61. package/dialog/lib/dialog.interfaces.d.ts +3 -3
  62. package/dialog/lib/dialog.module.d.ts +19 -19
  63. package/dialog/lib/dialog.ref.d.ts +8 -8
  64. package/dialog/lib/dialog.service.d.ts +19 -19
  65. package/dialog/public_api.d.ts +9 -9
  66. package/elements/bravobit-bb-foundation-elements.d.ts +5 -5
  67. package/elements/lib/avatar/avatar.component.d.ts +25 -25
  68. package/elements/lib/button/button.component.d.ts +23 -23
  69. package/elements/lib/checkbox/checkbox.component.d.ts +27 -27
  70. package/elements/lib/date-picker/date-picker.component.d.ts +69 -69
  71. package/elements/lib/directives/addon.directive.d.ts +9 -9
  72. package/elements/lib/directives/autosize.directive.d.ts +18 -18
  73. package/elements/lib/directives/focus-trap.directive.d.ts +17 -17
  74. package/elements/lib/directives/focus.directive.d.ts +14 -14
  75. package/elements/lib/directives/form-submit.directive.d.ts +17 -17
  76. package/elements/lib/directives/input.directive.d.ts +38 -38
  77. package/elements/lib/directives/template.directive.d.ts +10 -10
  78. package/elements/lib/dropdown/dropdown.component.d.ts +21 -21
  79. package/elements/lib/elements.interfaces.d.ts +25 -25
  80. package/elements/lib/elements.module.d.ts +116 -116
  81. package/elements/lib/file-picker/file-picker.component.d.ts +49 -49
  82. package/elements/lib/form-control/form-control.component.d.ts +21 -21
  83. package/elements/lib/form-error/form-error.component.d.ts +29 -29
  84. package/elements/lib/form-group/form-group.component.d.ts +10 -10
  85. package/elements/lib/icon/icon.component.d.ts +22 -22
  86. package/elements/lib/image-picker/image-picker.component.d.ts +38 -38
  87. package/elements/lib/pipes/file-image.pipe.d.ts +13 -13
  88. package/elements/lib/pipes/file-size.pipe.d.ts +8 -8
  89. package/elements/lib/pipes/relative-time.pipe.d.ts +19 -19
  90. package/elements/lib/spinner/spinner.component.d.ts +12 -12
  91. package/elements/lib/tag/tag.component.d.ts +7 -7
  92. package/elements/public_api.d.ts +25 -25
  93. package/esm2020/auth/bravobit-bb-foundation-auth.mjs +4 -4
  94. package/esm2020/auth/lib/auth.interceptor.mjs +93 -94
  95. package/esm2020/auth/lib/auth.module.mjs +54 -54
  96. package/esm2020/auth/lib/auth.service.mjs +281 -276
  97. package/esm2020/auth/lib/auth.session.mjs +131 -131
  98. package/esm2020/auth/lib/directives/authenticated.directive.mjs +31 -31
  99. package/esm2020/auth/lib/directives/permission.directive.mjs +80 -80
  100. package/esm2020/auth/lib/directives/role.directive.mjs +37 -37
  101. package/esm2020/auth/lib/guards/anonymous.guard.mjs +34 -34
  102. package/esm2020/auth/lib/guards/authenticated.guard.mjs +35 -35
  103. package/esm2020/auth/lib/helpers/jwt.helper.mjs +69 -69
  104. package/esm2020/auth/lib/helpers/mapper.helper.mjs +35 -35
  105. package/esm2020/auth/lib/interfaces/config.interface.mjs +3 -3
  106. package/esm2020/auth/lib/interfaces/mapper.interface.mjs +2 -2
  107. package/esm2020/auth/lib/interfaces/provider.interface.mjs +2 -2
  108. package/esm2020/auth/lib/interfaces/token.interface.mjs +2 -2
  109. package/esm2020/auth/lib/permissions.service.mjs +56 -56
  110. package/esm2020/auth/lib/providers/email.provider.mjs +25 -25
  111. package/esm2020/auth/lib/providers/verify.provider.mjs +19 -19
  112. package/esm2020/auth/lib/tokens/use-authorization.token.mjs +3 -3
  113. package/esm2020/auth/public_api.mjs +19 -19
  114. package/esm2020/bravobit-bb-foundation.mjs +4 -4
  115. package/esm2020/collections/bravobit-bb-foundation-collections.mjs +4 -4
  116. package/esm2020/collections/lib/collection.mjs +102 -102
  117. package/esm2020/collections/lib/collections.module.mjs +54 -54
  118. package/esm2020/collections/lib/components/collections-pager/collections-pager.component.mjs +123 -123
  119. package/esm2020/collections/lib/components/collections-viewer/collections-viewer.component.mjs +31 -31
  120. package/esm2020/collections/lib/components/collections.directive.mjs +43 -43
  121. package/esm2020/collections/lib/interfaces/collection.interface.mjs +2 -2
  122. package/esm2020/collections/lib/providers/api-collection.provider.mjs +71 -71
  123. package/esm2020/collections/lib/providers/collection.provider.mjs +13 -13
  124. package/esm2020/collections/lib/providers/local-collection.provider.mjs +16 -16
  125. package/esm2020/collections/public_api.mjs +10 -10
  126. package/esm2020/controls/bravobit-bb-foundation-controls.mjs +4 -4
  127. package/esm2020/controls/lib/checkbox/checkbox/checkbox.component.mjs +153 -153
  128. package/esm2020/controls/lib/checkbox/checkbox-group/checkbox-group.component.mjs +48 -48
  129. package/esm2020/controls/lib/checkbox/checkbox.module.mjs +19 -19
  130. package/esm2020/controls/lib/controls.module.mjs +16 -16
  131. package/esm2020/controls/public_api.mjs +5 -5
  132. package/esm2020/dashboard/bravobit-bb-foundation-dashboard.mjs +4 -4
  133. package/esm2020/dashboard/lib/dashboard/dashboard.component.mjs +56 -56
  134. package/esm2020/dashboard/lib/dashboard-header/dashboard-header.component.mjs +30 -30
  135. package/esm2020/dashboard/lib/dashboard-menu/dashboard-menu.component.mjs +31 -31
  136. package/esm2020/dashboard/lib/dashboard-menu-item/dashboard-menu-item.component.mjs +29 -29
  137. package/esm2020/dashboard/lib/dashboard-sidebar/dashboard-sidebar.component.mjs +75 -75
  138. package/esm2020/dashboard/lib/dashboard-sidebar-group/dashboard-sidebar-group.component.mjs +99 -99
  139. package/esm2020/dashboard/lib/dashboard-sidebar-item/dashboard-sidebar-item.component.mjs +62 -62
  140. package/esm2020/dashboard/lib/dashboard.module.mjs +47 -47
  141. package/esm2020/dashboard/public_api.mjs +9 -9
  142. package/esm2020/dialog/bravobit-bb-foundation-dialog.mjs +4 -4
  143. package/esm2020/dialog/lib/dialog-actions/dialog-actions.component.mjs +12 -12
  144. package/esm2020/dialog/lib/dialog-confirm/dialog-confirm.component.mjs +37 -37
  145. package/esm2020/dialog/lib/dialog-container/dialog-container.component.mjs +153 -153
  146. package/esm2020/dialog/lib/dialog-header/dialog-header.component.mjs +25 -25
  147. package/esm2020/dialog/lib/dialog-link/dialog-link.component.mjs +11 -11
  148. package/esm2020/dialog/lib/dialog-modal/dialog-modal.component.mjs +46 -46
  149. package/esm2020/dialog/lib/dialog-overlay/dialog-overlay.component.mjs +134 -134
  150. package/esm2020/dialog/lib/dialog.injector.mjs +18 -18
  151. package/esm2020/dialog/lib/dialog.insertion.mjs +16 -16
  152. package/esm2020/dialog/lib/dialog.interfaces.mjs +3 -3
  153. package/esm2020/dialog/lib/dialog.module.mjs +70 -70
  154. package/esm2020/dialog/lib/dialog.ref.mjs +22 -22
  155. package/esm2020/dialog/lib/dialog.service.mjs +77 -77
  156. package/esm2020/dialog/public_api.mjs +10 -10
  157. package/esm2020/elements/bravobit-bb-foundation-elements.mjs +4 -4
  158. package/esm2020/elements/lib/avatar/avatar.component.mjs +145 -142
  159. package/esm2020/elements/lib/button/button.component.mjs +61 -61
  160. package/esm2020/elements/lib/checkbox/checkbox.component.mjs +73 -73
  161. package/esm2020/elements/lib/date-picker/date-picker.component.mjs +304 -304
  162. package/esm2020/elements/lib/directives/addon.directive.mjs +29 -29
  163. package/esm2020/elements/lib/directives/autosize.directive.mjs +72 -72
  164. package/esm2020/elements/lib/directives/focus-trap.directive.mjs +77 -77
  165. package/esm2020/elements/lib/directives/focus.directive.mjs +39 -39
  166. package/esm2020/elements/lib/directives/form-submit.directive.mjs +50 -50
  167. package/esm2020/elements/lib/directives/input.directive.mjs +136 -136
  168. package/esm2020/elements/lib/directives/template.directive.mjs +28 -28
  169. package/esm2020/elements/lib/dropdown/dropdown.component.mjs +100 -100
  170. package/esm2020/elements/lib/elements.interfaces.mjs +4 -4
  171. package/esm2020/elements/lib/elements.module.mjs +177 -177
  172. package/esm2020/elements/lib/file-picker/file-picker.component.mjs +236 -236
  173. package/esm2020/elements/lib/form-control/form-control.component.mjs +49 -49
  174. package/esm2020/elements/lib/form-error/form-error.component.mjs +108 -108
  175. package/esm2020/elements/lib/form-group/form-group.component.mjs +18 -18
  176. package/esm2020/elements/lib/icon/icon.component.mjs +102 -102
  177. package/esm2020/elements/lib/image-picker/image-picker.component.mjs +106 -106
  178. package/esm2020/elements/lib/pipes/file-image.pipe.mjs +42 -42
  179. package/esm2020/elements/lib/pipes/file-size.pipe.mjs +28 -28
  180. package/esm2020/elements/lib/pipes/relative-time.pipe.mjs +94 -94
  181. package/esm2020/elements/lib/spinner/spinner.component.mjs +25 -25
  182. package/esm2020/elements/lib/tag/tag.component.mjs +18 -18
  183. package/esm2020/elements/public_api.mjs +26 -26
  184. package/esm2020/http/bravobit-bb-foundation-http.mjs +4 -4
  185. package/esm2020/http/lib/classes/http.config.mjs +29 -29
  186. package/esm2020/http/lib/classes/http.error.mjs +20 -20
  187. package/esm2020/http/lib/http.interfaces.mjs +2 -2
  188. package/esm2020/http/lib/http.module.mjs +43 -43
  189. package/esm2020/http/lib/interceptors/base-url.interceptor.mjs +50 -50
  190. package/esm2020/http/lib/interceptors/error.interceptor.mjs +32 -32
  191. package/esm2020/http/public_api.mjs +7 -7
  192. package/esm2020/lib/core/miscellaneous/regex.mjs +5 -5
  193. package/esm2020/lib/core/miscellaneous/validator.mjs +85 -85
  194. package/esm2020/lib/core/mixins/can-disable.mjs +16 -16
  195. package/esm2020/lib/core/mixins/can-hide-errors.mjs +16 -16
  196. package/esm2020/lib/core/mixins/can-load.mjs +16 -16
  197. package/esm2020/lib/core/mixins/constructor.mjs +2 -2
  198. package/esm2020/lib/core/mixins/has-error.mjs +16 -16
  199. package/esm2020/lib/core/mixins/is-focused.mjs +16 -16
  200. package/esm2020/lib/core/mixins/is-grouped.mjs +16 -16
  201. package/esm2020/lib/core/mixins/is-readonly.mjs +16 -16
  202. package/esm2020/lib/core/mixins/is-required.mjs +16 -16
  203. package/esm2020/lib/core/services/clipboard.service.mjs +70 -70
  204. package/esm2020/lib/core/services/exif.service.mjs +163 -163
  205. package/esm2020/lib/core/services/file-loader.service.mjs +87 -87
  206. package/esm2020/lib/core/services/image-converter.service.mjs +123 -123
  207. package/esm2020/lib/core/services/languages.service.mjs +74 -74
  208. package/esm2020/lib/core/services/network.service.mjs +55 -55
  209. package/esm2020/lib/core/services/patch.service.mjs +63 -63
  210. package/esm2020/lib/core/services/platform.service.mjs +42 -42
  211. package/esm2020/lib/core/tokens/accept-language.token.mjs +3 -3
  212. package/esm2020/lib/core/tokens/base-url.token.mjs +3 -3
  213. package/esm2020/lib/core/tokens/cookie.token.mjs +3 -3
  214. package/esm2020/lib/core/tokens/location.token.mjs +6 -6
  215. package/esm2020/lib/core/tokens/navigator.token.mjs +6 -6
  216. package/esm2020/lib/core/tokens/window.token.mjs +12 -12
  217. package/esm2020/localize/bravobit-bb-foundation-localize.mjs +4 -4
  218. package/esm2020/localize/lib/functions/date.function.mjs +18 -18
  219. package/esm2020/localize/lib/functions/lowercase.function.mjs +13 -13
  220. package/esm2020/localize/lib/functions/uppercase.function.mjs +13 -13
  221. package/esm2020/localize/lib/handlers/missing.handler.mjs +15 -17
  222. package/esm2020/localize/lib/interfaces/config.interfaces.mjs +7 -10
  223. package/esm2020/localize/lib/interfaces/functions.interfaces.mjs +8 -8
  224. package/esm2020/localize/lib/interfaces/handlers.interfaces.mjs +2 -2
  225. package/esm2020/localize/lib/interfaces/options.interfaces.mjs +6 -6
  226. package/esm2020/localize/lib/localizations/dutch.localization.mjs +45 -53
  227. package/esm2020/localize/lib/localizations/english.localization.mjs +45 -53
  228. package/esm2020/localize/lib/localize.dictionary.mjs +26 -135
  229. package/esm2020/localize/lib/localize.module.mjs +71 -72
  230. package/esm2020/localize/lib/localize.pipe.mjs +49 -49
  231. package/esm2020/localize/lib/localize.service.mjs +205 -280
  232. package/esm2020/localize/lib/views/localize-string/localize-string.component.mjs +88 -88
  233. package/esm2020/localize/lib/views/localize-template-or-string.directive.mjs +28 -28
  234. package/esm2020/localize/lib/views/localize-template.directive.mjs +21 -21
  235. package/esm2020/localize/public_api.mjs +17 -18
  236. package/esm2020/notifications/bravobit-bb-foundation-notifications.mjs +4 -4
  237. package/esm2020/notifications/lib/notifications-item/notifications-item.component.mjs +100 -100
  238. package/esm2020/notifications/lib/notifications-list/notifications-list.component.mjs +47 -47
  239. package/esm2020/notifications/lib/notifications.animations.mjs +28 -28
  240. package/esm2020/notifications/lib/notifications.injector.mjs +18 -18
  241. package/esm2020/notifications/lib/notifications.interfaces.mjs +20 -20
  242. package/esm2020/notifications/lib/notifications.module.mjs +30 -30
  243. package/esm2020/notifications/lib/notifications.service.mjs +145 -145
  244. package/esm2020/notifications/public_api.mjs +4 -4
  245. package/esm2020/public_api.mjs +29 -29
  246. package/esm2020/recaptcha/bravobit-bb-foundation-recaptcha.mjs +4 -4
  247. package/esm2020/recaptcha/lib/recaptcha/recaptcha.component.mjs +185 -185
  248. package/esm2020/recaptcha/lib/recaptcha-loader.service.mjs +90 -90
  249. package/esm2020/recaptcha/lib/recaptcha.interface.mjs +3 -3
  250. package/esm2020/recaptcha/lib/recaptcha.module.mjs +27 -27
  251. package/esm2020/recaptcha/public_api.mjs +5 -5
  252. package/esm2020/rxjs/bravobit-bb-foundation-rxjs.mjs +4 -4
  253. package/esm2020/rxjs/lib/operators/combine-latest-map.operator.mjs +10 -10
  254. package/esm2020/rxjs/lib/operators/filter-nil.operator.mjs +5 -5
  255. package/esm2020/rxjs/public_api.mjs +3 -3
  256. package/esm2020/storage/bravobit-bb-foundation-storage.mjs +4 -4
  257. package/esm2020/storage/lib/interfaces/attributes.interface.mjs +2 -2
  258. package/esm2020/storage/lib/interfaces/memory.interface.mjs +2 -2
  259. package/esm2020/storage/lib/interfaces/strategy.interface.mjs +2 -2
  260. package/esm2020/storage/lib/storage.service.mjs +109 -109
  261. package/esm2020/storage/lib/strategies/cookie-storage.strategy.mjs +142 -142
  262. package/esm2020/storage/lib/strategies/memory-storage.strategy.mjs +56 -56
  263. package/esm2020/storage/lib/strategies/polyfill-storage.strategy.mjs +102 -102
  264. package/esm2020/storage/public_api.mjs +8 -8
  265. package/esm2020/table/bravobit-bb-foundation-table.mjs +4 -4
  266. package/esm2020/table/lib/components/table/table.component.mjs +191 -191
  267. package/esm2020/table/lib/components/table-cell/table-cell.component.mjs +11 -11
  268. package/esm2020/table/lib/components/table-header-cell/table-header-cell.component.mjs +131 -131
  269. package/esm2020/table/lib/components/table-pager/table-pager.component.mjs +136 -136
  270. package/esm2020/table/lib/data/datasource.data.mjs +32 -32
  271. package/esm2020/table/lib/data/generic.data.mjs +72 -72
  272. package/esm2020/table/lib/interfaces/datasource.interface.mjs +2 -2
  273. package/esm2020/table/lib/interfaces/table.interfaces.mjs +2 -2
  274. package/esm2020/table/lib/table.module.mjs +42 -42
  275. package/esm2020/table/public_api.mjs +10 -10
  276. package/fesm2015/bravobit-bb-foundation-auth.mjs +930 -926
  277. package/fesm2015/bravobit-bb-foundation-auth.mjs.map +1 -1
  278. package/fesm2015/bravobit-bb-foundation-collections.mjs +423 -423
  279. package/fesm2015/bravobit-bb-foundation-collections.mjs.map +1 -1
  280. package/fesm2015/bravobit-bb-foundation-controls.mjs +216 -216
  281. package/fesm2015/bravobit-bb-foundation-controls.mjs.map +1 -1
  282. package/fesm2015/bravobit-bb-foundation-dashboard.mjs +382 -382
  283. package/fesm2015/bravobit-bb-foundation-dashboard.mjs.map +1 -1
  284. package/fesm2015/bravobit-bb-foundation-dialog.mjs +542 -542
  285. package/fesm2015/bravobit-bb-foundation-dialog.mjs.map +1 -1
  286. package/fesm2015/bravobit-bb-foundation-elements.mjs +1971 -1968
  287. package/fesm2015/bravobit-bb-foundation-elements.mjs.map +1 -1
  288. package/fesm2015/bravobit-bb-foundation-http.mjs +156 -156
  289. package/fesm2015/bravobit-bb-foundation-http.mjs.map +1 -1
  290. package/fesm2015/bravobit-bb-foundation-localize.mjs +611 -812
  291. package/fesm2015/bravobit-bb-foundation-localize.mjs.map +1 -1
  292. package/fesm2015/bravobit-bb-foundation-notifications.mjs +348 -348
  293. package/fesm2015/bravobit-bb-foundation-notifications.mjs.map +1 -1
  294. package/fesm2015/bravobit-bb-foundation-recaptcha.mjs +290 -290
  295. package/fesm2015/bravobit-bb-foundation-recaptcha.mjs.map +1 -1
  296. package/fesm2015/bravobit-bb-foundation-rxjs.mjs +7 -7
  297. package/fesm2015/bravobit-bb-foundation-rxjs.mjs.map +1 -1
  298. package/fesm2015/bravobit-bb-foundation-storage.mjs +401 -401
  299. package/fesm2015/bravobit-bb-foundation-storage.mjs.map +1 -1
  300. package/fesm2015/bravobit-bb-foundation-table.mjs +571 -571
  301. package/fesm2015/bravobit-bb-foundation-table.mjs.map +1 -1
  302. package/fesm2015/bravobit-bb-foundation.mjs +860 -860
  303. package/fesm2015/bravobit-bb-foundation.mjs.map +1 -1
  304. package/fesm2020/bravobit-bb-foundation-auth.mjs +882 -878
  305. package/fesm2020/bravobit-bb-foundation-auth.mjs.map +1 -1
  306. package/fesm2020/bravobit-bb-foundation-collections.mjs +413 -413
  307. package/fesm2020/bravobit-bb-foundation-collections.mjs.map +1 -1
  308. package/fesm2020/bravobit-bb-foundation-controls.mjs +214 -214
  309. package/fesm2020/bravobit-bb-foundation-controls.mjs.map +1 -1
  310. package/fesm2020/bravobit-bb-foundation-dashboard.mjs +370 -370
  311. package/fesm2020/bravobit-bb-foundation-dashboard.mjs.map +1 -1
  312. package/fesm2020/bravobit-bb-foundation-dialog.mjs +541 -541
  313. package/fesm2020/bravobit-bb-foundation-dialog.mjs.map +1 -1
  314. package/fesm2020/bravobit-bb-foundation-elements.mjs +1928 -1925
  315. package/fesm2020/bravobit-bb-foundation-elements.mjs.map +1 -1
  316. package/fesm2020/bravobit-bb-foundation-http.mjs +148 -148
  317. package/fesm2020/bravobit-bb-foundation-http.mjs.map +1 -1
  318. package/fesm2020/bravobit-bb-foundation-localize.mjs +590 -798
  319. package/fesm2020/bravobit-bb-foundation-localize.mjs.map +1 -1
  320. package/fesm2020/bravobit-bb-foundation-notifications.mjs +346 -346
  321. package/fesm2020/bravobit-bb-foundation-notifications.mjs.map +1 -1
  322. package/fesm2020/bravobit-bb-foundation-recaptcha.mjs +280 -280
  323. package/fesm2020/bravobit-bb-foundation-recaptcha.mjs.map +1 -1
  324. package/fesm2020/bravobit-bb-foundation-rxjs.mjs +10 -10
  325. package/fesm2020/bravobit-bb-foundation-rxjs.mjs.map +1 -1
  326. package/fesm2020/bravobit-bb-foundation-storage.mjs +396 -396
  327. package/fesm2020/bravobit-bb-foundation-storage.mjs.map +1 -1
  328. package/fesm2020/bravobit-bb-foundation-table.mjs +560 -560
  329. package/fesm2020/bravobit-bb-foundation-table.mjs.map +1 -1
  330. package/fesm2020/bravobit-bb-foundation.mjs +832 -832
  331. package/fesm2020/bravobit-bb-foundation.mjs.map +1 -1
  332. package/http/bravobit-bb-foundation-http.d.ts +5 -5
  333. package/http/lib/classes/http.config.d.ts +9 -9
  334. package/http/lib/classes/http.error.d.ts +7 -7
  335. package/http/lib/http.interfaces.d.ts +12 -12
  336. package/http/lib/http.module.d.ts +15 -15
  337. package/http/lib/interceptors/base-url.interceptor.d.ts +15 -15
  338. package/http/lib/interceptors/error.interceptor.d.ts +11 -11
  339. package/http/public_api.d.ts +6 -6
  340. package/lib/core/miscellaneous/regex.d.ts +4 -4
  341. package/lib/core/miscellaneous/validator.d.ts +13 -13
  342. package/lib/core/mixins/can-disable.d.ts +6 -6
  343. package/lib/core/mixins/can-hide-errors.d.ts +6 -6
  344. package/lib/core/mixins/can-load.d.ts +6 -6
  345. package/lib/core/mixins/constructor.d.ts +1 -1
  346. package/lib/core/mixins/has-error.d.ts +6 -6
  347. package/lib/core/mixins/is-focused.d.ts +6 -6
  348. package/lib/core/mixins/is-grouped.d.ts +6 -6
  349. package/lib/core/mixins/is-readonly.d.ts +6 -6
  350. package/lib/core/mixins/is-required.d.ts +6 -6
  351. package/lib/core/services/clipboard.service.d.ts +18 -18
  352. package/lib/core/services/exif.service.d.ts +15 -15
  353. package/lib/core/services/file-loader.service.d.ts +13 -13
  354. package/lib/core/services/image-converter.service.d.ts +21 -21
  355. package/lib/core/services/languages.service.d.ts +16 -16
  356. package/lib/core/services/network.service.d.ts +14 -14
  357. package/lib/core/services/patch.service.d.ts +16 -16
  358. package/lib/core/services/platform.service.d.ts +18 -18
  359. package/lib/core/tokens/accept-language.token.d.ts +2 -2
  360. package/lib/core/tokens/base-url.token.d.ts +2 -2
  361. package/lib/core/tokens/cookie.token.d.ts +2 -2
  362. package/lib/core/tokens/location.token.d.ts +2 -2
  363. package/lib/core/tokens/navigator.token.d.ts +2 -2
  364. package/lib/core/tokens/window.token.d.ts +2 -2
  365. package/localize/bravobit-bb-foundation-localize.d.ts +5 -5
  366. package/localize/lib/functions/date.function.d.ts +5 -5
  367. package/localize/lib/functions/lowercase.function.d.ts +5 -5
  368. package/localize/lib/functions/uppercase.function.d.ts +5 -5
  369. package/localize/lib/handlers/missing.handler.d.ts +6 -6
  370. package/localize/lib/interfaces/config.interfaces.d.ts +18 -9
  371. package/localize/lib/interfaces/functions.interfaces.d.ts +9 -9
  372. package/localize/lib/interfaces/handlers.interfaces.d.ts +6 -6
  373. package/localize/lib/interfaces/options.interfaces.d.ts +10 -10
  374. package/localize/lib/localizations/dutch.localization.d.ts +44 -51
  375. package/localize/lib/localizations/english.localization.d.ts +44 -51
  376. package/localize/lib/localize.dictionary.d.ts +7 -24
  377. package/localize/lib/localize.module.d.ts +17 -18
  378. package/localize/lib/localize.pipe.d.ts +12 -12
  379. package/localize/lib/localize.service.d.ts +40 -52
  380. package/localize/lib/views/localize-string/localize-string.component.d.ts +23 -23
  381. package/localize/lib/views/localize-template-or-string.directive.d.ts +10 -10
  382. package/localize/lib/views/localize-template.directive.d.ts +9 -9
  383. package/localize/public_api.d.ts +16 -17
  384. package/notifications/bravobit-bb-foundation-notifications.d.ts +5 -5
  385. package/notifications/lib/notifications-item/notifications-item.component.d.ts +34 -34
  386. package/notifications/lib/notifications-list/notifications-list.component.d.ts +16 -16
  387. package/notifications/lib/notifications.animations.d.ts +1 -1
  388. package/notifications/lib/notifications.injector.d.ts +8 -8
  389. package/notifications/lib/notifications.interfaces.d.ts +49 -49
  390. package/notifications/lib/notifications.module.d.ts +13 -13
  391. package/notifications/lib/notifications.service.d.ts +34 -34
  392. package/notifications/public_api.d.ts +3 -3
  393. package/package.json +6 -6
  394. package/public_api.d.ts +25 -25
  395. package/recaptcha/bravobit-bb-foundation-recaptcha.d.ts +5 -5
  396. package/recaptcha/lib/recaptcha/recaptcha.component.d.ts +47 -47
  397. package/recaptcha/lib/recaptcha-loader.service.d.ts +22 -22
  398. package/recaptcha/lib/recaptcha.interface.d.ts +14 -14
  399. package/recaptcha/lib/recaptcha.module.d.ts +10 -10
  400. package/recaptcha/public_api.d.ts +4 -4
  401. package/rxjs/bravobit-bb-foundation-rxjs.d.ts +5 -5
  402. package/rxjs/lib/operators/combine-latest-map.operator.d.ts +8 -8
  403. package/rxjs/lib/operators/filter-nil.operator.d.ts +1 -1
  404. package/rxjs/public_api.d.ts +2 -2
  405. package/storage/bravobit-bb-foundation-storage.d.ts +5 -5
  406. package/storage/lib/interfaces/attributes.interface.d.ts +13 -13
  407. package/storage/lib/interfaces/memory.interface.d.ts +7 -7
  408. package/storage/lib/interfaces/strategy.interface.d.ts +17 -17
  409. package/storage/lib/storage.service.d.ts +26 -26
  410. package/storage/lib/strategies/cookie-storage.strategy.d.ts +20 -20
  411. package/storage/lib/strategies/memory-storage.strategy.d.ts +11 -11
  412. package/storage/lib/strategies/polyfill-storage.strategy.d.ts +15 -15
  413. package/storage/public_api.d.ts +7 -7
  414. package/table/bravobit-bb-foundation-table.d.ts +5 -5
  415. package/table/lib/components/table/table.component.d.ts +56 -56
  416. package/table/lib/components/table-cell/table-cell.component.d.ts +5 -5
  417. package/table/lib/components/table-header-cell/table-header-cell.component.d.ts +29 -29
  418. package/table/lib/components/table-pager/table-pager.component.d.ts +41 -41
  419. package/table/lib/data/datasource.data.d.ts +14 -14
  420. package/table/lib/data/generic.data.d.ts +23 -23
  421. package/table/lib/interfaces/datasource.interface.d.ts +17 -17
  422. package/table/lib/interfaces/table.interfaces.d.ts +1 -1
  423. package/table/lib/table.module.d.ts +14 -14
  424. package/table/public_api.d.ts +9 -9
  425. package/esm2020/localize/lib/interfaces/dictionary.interfaces.mjs +0 -8
  426. package/localize/lib/interfaces/dictionary.interfaces.d.ts +0 -12
@@ -1,280 +1,205 @@
1
- import { LOCALIZE_FUNCTION } from './interfaces/functions.interfaces';
2
- import { LOCALIZE_EXTRA_DICTIONARY } from './interfaces/dictionary.interfaces';
3
- import { BASE_URL, LOCATION } from '@bravobit/bb-foundation';
4
- import { Inject, Injectable, Optional } from '@angular/core';
5
- import { LocalizeDictionary } from './localize.dictionary';
6
- import { DOCUMENT } from '@angular/common';
7
- import * as i0 from "@angular/core";
8
- import * as i1 from "@angular/common/http";
9
- import * as i2 from "@bravobit/bb-foundation/storage";
10
- import * as i3 from "@bravobit/bb-foundation";
11
- import * as i4 from "@angular/platform-browser";
12
- import * as i5 from "./interfaces/config.interfaces";
13
- import * as i6 from "./handlers/missing.handler";
14
- export class Localize {
15
- constructor(_http, _storage, _platform, _languages, _state, _config, _missingHandler, _document, _location, _baseUrl, _functions, _extras) {
16
- this._http = _http;
17
- this._storage = _storage;
18
- this._platform = _platform;
19
- this._languages = _languages;
20
- this._state = _state;
21
- this._config = _config;
22
- this._missingHandler = _missingHandler;
23
- this._document = _document;
24
- this._location = _location;
25
- this._baseUrl = _baseUrl;
26
- this._functions = _functions;
27
- this._extras = _extras;
28
- this._storageToken = 'bb-language-dictionary-id';
29
- this.convertToParams = (tokenOrParams) => {
30
- if (typeof tokenOrParams !== 'string') {
31
- // Destruct the params from the object.
32
- const { token, optional, data } = tokenOrParams;
33
- // Make sure all parameters are valid
34
- // by type safe adding them.
35
- return { token: token, optional: optional || false, data: data || {} };
36
- }
37
- // If the parameter is a string fill in the blanks.
38
- return { token: tokenOrParams, optional: false, data: {} };
39
- };
40
- this.getMatches = (value, substitutions) => {
41
- // Get the matching substitutions.
42
- const { start, end } = substitutions;
43
- // Compose a regex that will find the matches.
44
- const regex = new RegExp(`${start}([^${end}]+)${end}`, 'g');
45
- // Execute the regex to find matches.
46
- let match = regex.exec(value);
47
- const matches = [];
48
- while (match !== null) {
49
- // Push a new match.
50
- matches.push({
51
- match: match[0],
52
- token: match[1]
53
- });
54
- // Try to find more matches.
55
- match = regex.exec(value);
56
- }
57
- // Return the processed value.
58
- return matches.filter(item => !!item);
59
- };
60
- this.reload = () => this._location?.reload();
61
- // Check if at least one language was passed in the config.
62
- if (this._config.dictionary.length < 1) {
63
- throw new Error('Localize: one or more languages should be supplied.');
64
- }
65
- // Gather the dictionaries.
66
- this._dictionaries = this._config.dictionary.map(item => {
67
- return new LocalizeDictionary(item, this._baseUrl, this._http);
68
- });
69
- // Save the best matching current dictionary.
70
- this._currentDictionary = this.retrieveBestMatchingDictionary();
71
- // Gather all the localize functions.
72
- this._functionMiddleware = this._functions.reduce((previous, current) => {
73
- previous[current.keyword()] = current;
74
- return previous;
75
- }, {});
76
- this.renderDocumentLanguage();
77
- }
78
- get dictionaries() {
79
- return this._dictionaries;
80
- }
81
- get current() {
82
- return this._currentDictionary;
83
- }
84
- get locale() {
85
- return this._currentDictionary.locale;
86
- }
87
- async load(dictionary) {
88
- const data = this._state?.hasKey(dictionary.stateKey)
89
- ? this._state?.get(dictionary.stateKey, {})
90
- : null;
91
- // Try to load the dictionary data.
92
- const loaded = await dictionary.load(data);
93
- // Verify the data was loaded.
94
- if (!loaded) {
95
- throw new Error(`Localize: Could not correctly fetch the data from: "${dictionary.id}"`);
96
- }
97
- if (!this._platform.isBrowser && this._state) {
98
- this._state?.set(dictionary?.stateKey, dictionary?.data ?? {});
99
- }
100
- // Combine the extra dictionary data.
101
- (this._extras || []).forEach(extraDictionary => dictionary.combine(extraDictionary));
102
- // Return the dictionary.
103
- return dictionary;
104
- }
105
- set(dictionary) {
106
- this._currentDictionary = dictionary;
107
- }
108
- initialize() {
109
- return async () => this.load(this._currentDictionary);
110
- }
111
- change(id, reload = true) {
112
- // Try to fetch the dictionary.
113
- const dictionary = this._dictionaries.find(item => item.id === id);
114
- // Validate the dictionary exists.
115
- if (!dictionary) {
116
- throw new Error(`Localize: Could not find dictionary with id: "${id}"`);
117
- }
118
- // Save the language in the storage.
119
- this._storage.cookie.set(this._storageToken, dictionary.id, {});
120
- // Just quit if we don't need to reload.
121
- if (!reload) {
122
- return;
123
- }
124
- // We need to reload the application for the translations.
125
- return this.reload();
126
- }
127
- clear(reload = true) {
128
- // Remove the language in the local storage.
129
- this._storage.cookie.remove(this._storageToken);
130
- // Just quit if we don't need to reload.
131
- if (!reload) {
132
- return;
133
- }
134
- // We need to reload the application for the translations.
135
- return this.reload();
136
- }
137
- translate(tokenOrParams) {
138
- // 1. Convert to the params.
139
- const params = this.convertToParams(tokenOrParams);
140
- // 2. Try to find the translation in the dictionary.
141
- const searchResult = this._currentDictionary.search(params.token);
142
- // 3. Verify the translation was found.
143
- if (!searchResult) {
144
- return this._missingHandler.handle(params);
145
- }
146
- // 4. Find references in the translation that need to be translated as well.
147
- const processResult = this.findReferencesInTranslation(searchResult);
148
- // 5. Parse the interpolation data.
149
- return this.parseInterpolationData(processResult, params.data);
150
- }
151
- parseInterpolationData(value, data) {
152
- // Get the interpolation substitutions.
153
- const substitutions = this.getSubstitutions('interpolation', ['{{', '}}']);
154
- // Get all matches in the value.
155
- const matches = this.getMatches(value, substitutions);
156
- // Replace all matches with the parsed value.
157
- return matches.reduce((previous, current) => {
158
- // Try to parse the token.
159
- const interpolatedToken = this.interpolateFunctionData(current.token, data);
160
- // Replace the match with the parsed token.
161
- return previous.replace(current.match, interpolatedToken);
162
- }, `${value}`);
163
- }
164
- interpolateFunctionData(value, interpolationData) {
165
- // Get the token and the methods by splitting
166
- // on the pipe symbol.
167
- const [token, ...methods] = value.split('|').map(item => item.trim());
168
- // Get the value for the token from
169
- // the interpolation data.
170
- const interpolationValue = interpolationData[token] || token;
171
- // Loop through all the middleware methods and try to
172
- // conform the string to the given parameters.
173
- return methods.reduce((string, middlewareName) => {
174
- // Try to retrieve the middleware from the collection.
175
- const middleware = this._functionMiddleware[middlewareName];
176
- // If the middleware is missing return an error
177
- // so that the user knows it was not found.
178
- if (!middleware) {
179
- return string;
180
- }
181
- // Execute the middleware function with the string.
182
- return middleware.transform(string, this.locale);
183
- }, `${interpolationValue}`);
184
- }
185
- findReferencesInTranslation(value) {
186
- // Get the reference substitutions.
187
- const substitutions = this.getSubstitutions('references', ['#(', ')']);
188
- // Get all matches in the value.
189
- const matches = this.getMatches(value, substitutions);
190
- // Replace all matches with the translated value.
191
- return matches.reduce((previous, current) => {
192
- // Try to translate the token.
193
- const translatedToken = this.translate(current.token);
194
- // Replace the match with the translated token.
195
- return previous.replace(current.match, translatedToken);
196
- }, value);
197
- }
198
- getSubstitutions(type, defaultValue) {
199
- const substitutions = (this._config
200
- && this._config.substitutions
201
- && this._config.substitutions[type]);
202
- // Get the substitutions.
203
- const value = (!substitutions || substitutions.length !== 2)
204
- ? defaultValue
205
- : substitutions;
206
- // Escape both substitutions so that they
207
- // can be used.
208
- const escape = /[.*+?^${}()|[\]\\]/g;
209
- const start = value[0].replace(escape, '\\$&');
210
- const end = value[1].replace(escape, '\\$&');
211
- // Return the substitutions.
212
- return { start, end };
213
- }
214
- retrieveBestMatchingDictionary() {
215
- // Get the dictionary based on storage.
216
- const storageDictionary = this.getDictionaryFromStorage();
217
- // Get the dictionary based on the supported language.
218
- const browserDictionary = this.getBestBrowserMatchDictionary();
219
- // Get the dictionary based on the first index.
220
- const firstDictionary = this._dictionaries[0];
221
- // Return the best matching dictionary.
222
- return storageDictionary || browserDictionary || firstDictionary;
223
- }
224
- getDictionaryFromStorage() {
225
- // Get dictionary id from the storage..
226
- const dictionaryId = this._storage.cookie.get(this._storageToken);
227
- // Return the dictionary based on the storage dictionary id.
228
- return this._dictionaries.find(item => item.id === dictionaryId);
229
- }
230
- getBestBrowserMatchDictionary() {
231
- // Loop through all browser languages and return the
232
- // best matching dictionary.
233
- return this._languages.all.map(({ code, region }) => {
234
- const languageCode = [code, region].filter(data => !!data).join('-');
235
- return this._dictionaries.find(item => item.supportedLanguages.includes(languageCode));
236
- }).filter(item => !!item).find((_, index) => index === 0);
237
- }
238
- renderDocumentLanguage() {
239
- const element = this._document?.documentElement;
240
- if (!element) {
241
- return;
242
- }
243
- element.lang = this._currentDictionary?.supportedLanguages?.[0] ?? this._currentDictionary?.locale;
244
- }
245
- }
246
- Localize.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: Localize, deps: [{ token: i1.HttpClient }, { token: i2.Storage }, { token: i3.Platform }, { token: i3.Languages }, { token: i4.TransferState, optional: true }, { token: i5.LocalizeConfig, optional: true }, { token: i6.LocalizeMissingHandler }, { token: DOCUMENT, optional: true }, { token: LOCATION, optional: true }, { token: BASE_URL, optional: true }, { token: LOCALIZE_FUNCTION, optional: true }, { token: LOCALIZE_EXTRA_DICTIONARY, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
247
- Localize.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: Localize });
248
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: Localize, decorators: [{
249
- type: Injectable
250
- }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: i2.Storage }, { type: i3.Platform }, { type: i3.Languages }, { type: i4.TransferState, decorators: [{
251
- type: Optional
252
- }] }, { type: i5.LocalizeConfig, decorators: [{
253
- type: Optional
254
- }] }, { type: i6.LocalizeMissingHandler }, { type: undefined, decorators: [{
255
- type: Optional
256
- }, {
257
- type: Inject,
258
- args: [DOCUMENT]
259
- }] }, { type: undefined, decorators: [{
260
- type: Optional
261
- }, {
262
- type: Inject,
263
- args: [LOCATION]
264
- }] }, { type: undefined, decorators: [{
265
- type: Optional
266
- }, {
267
- type: Inject,
268
- args: [BASE_URL]
269
- }] }, { type: undefined, decorators: [{
270
- type: Optional
271
- }, {
272
- type: Inject,
273
- args: [LOCALIZE_FUNCTION]
274
- }] }, { type: undefined, decorators: [{
275
- type: Optional
276
- }, {
277
- type: Inject,
278
- args: [LOCALIZE_EXTRA_DICTIONARY]
279
- }] }]; } });
280
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYWxpemUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2JiLWZvdW5kYXRpb24vbG9jYWxpemUvc3JjL2xpYi9sb2NhbGl6ZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxpQkFBaUIsRUFBd0MsTUFBTSxtQ0FBbUMsQ0FBQztBQUMzRyxPQUFPLEVBQUMseUJBQXlCLEVBQTBCLE1BQU0sb0NBQW9DLENBQUM7QUFFdEcsT0FBTyxFQUFDLFFBQVEsRUFBYSxRQUFRLEVBQVcsTUFBTSx5QkFBeUIsQ0FBQztBQUdoRixPQUFPLEVBQUMsTUFBTSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDM0QsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFJekQsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGlCQUFpQixDQUFDOzs7Ozs7OztBQUd6QyxNQUFNLE9BQU8sUUFBUTtJQVNqQixZQUFvQixLQUFpQixFQUNqQixRQUFpQixFQUNqQixTQUFtQixFQUNuQixVQUFxQixFQUNULE1BQXFCLEVBQ3JCLE9BQXVCLEVBQ25DLGVBQXVDLEVBQ1QsU0FBZSxFQUNmLFNBQWUsRUFDZixRQUFpQixFQUNSLFVBQStCLEVBQ3ZCLE9BQW1DO1FBWGxGLFVBQUssR0FBTCxLQUFLLENBQVk7UUFDakIsYUFBUSxHQUFSLFFBQVEsQ0FBUztRQUNqQixjQUFTLEdBQVQsU0FBUyxDQUFVO1FBQ25CLGVBQVUsR0FBVixVQUFVLENBQVc7UUFDVCxXQUFNLEdBQU4sTUFBTSxDQUFlO1FBQ3JCLFlBQU8sR0FBUCxPQUFPLENBQWdCO1FBQ25DLG9CQUFlLEdBQWYsZUFBZSxDQUF3QjtRQUNULGNBQVMsR0FBVCxTQUFTLENBQU07UUFDZixjQUFTLEdBQVQsU0FBUyxDQUFNO1FBQ2YsYUFBUSxHQUFSLFFBQVEsQ0FBUztRQUNSLGVB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QUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBZ0JPLHNCQUFzQjtRQUMxQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLGVBQWUsQ0FBQztRQUNoRCxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ1YsT0FBTztTQUNWO1FBRUQsT0FBTyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsTUFBTSxDQUFDO0lBQ3ZHLENBQUM7O3FHQWpSUSxRQUFRLHFQQWdCZSxRQUFRLDZCQUNSLFFBQVEsNkJBQ1IsUUFBUSw2QkFDUixpQkFBaUIsNkJBQ2pCLHlCQUF5Qjt5R0FwQmhELFFBQVE7MkZBQVIsUUFBUTtrQkFEcEIsVUFBVTs7MEJBY00sUUFBUTs7MEJBQ1IsUUFBUTs7MEJBRVIsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxRQUFROzswQkFDM0IsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxRQUFROzswQkFDM0IsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxRQUFROzswQkFDM0IsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxpQkFBaUI7OzBCQUNwQyxRQUFROzswQkFBSSxNQUFNOzJCQUFDLHlCQUF5QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7TE9DQUxJWkVfRlVOQ1RJT04sIExvY2FsaXplRnVuY3Rpb24sIExvY2FsaXplRnVuY3Rpb25NYXB9IGZyb20gJy4vaW50ZXJmYWNlcy9mdW5jdGlvbnMuaW50ZXJmYWNlcyc7XG5pbXBvcnQge0xPQ0FMSVpFX0VYVFJBX0RJQ1RJT05BUlksIExvY2FsaXplRXh0cmFEaWN0aW9uYXJ5fSBmcm9tICcuL2ludGVyZmFjZXMvZGljdGlvbmFyeS5pbnRlcmZhY2VzJztcbmltcG9ydCB7TG9jYWxpemVPcHRpb25zRGF0YSwgTG9jYWxpemVQYXJhbXN9IGZyb20gJy4vaW50ZXJmYWNlcy9vcHRpb25zLmludGVyZmFjZXMnO1xuaW1wb3J0IHtCQVNFX1VSTCwgTGFuZ3VhZ2VzLCBMT0NBVElPTiwgUGxhdGZvcm19IGZyb20gJ0BicmF2b2JpdC9iYi1mb3VuZGF0aW9uJztcbmltcG9ydCB7TG9jYWxpemVNaXNzaW5nSGFuZGxlcn0gZnJvbSAnLi9oYW5kbGVycy9taXNzaW5nLmhhbmRsZXInO1xuaW1wb3J0IHtMb2NhbGl6ZUNvbmZpZ30gZnJvbSAnLi9pbnRlcmZhY2VzL2NvbmZpZy5pbnRlcmZhY2VzJztcbmltcG9ydCB7SW5qZWN0LCBJbmplY3RhYmxlLCBPcHRpb25hbH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0xvY2FsaXplRGljdGlvbmFyeX0gZnJvbSAnLi9sb2NhbGl6ZS5kaWN0aW9uYXJ5JztcbmltcG9ydCB7U3RvcmFnZX0gZnJvbSAnQGJyYXZvYml0L2JiLWZvdW5kYXRpb24vc3RvcmFnZSc7XG5pbXBvcnQge1RyYW5zZmVyU3RhdGV9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuaW1wb3J0IHtIdHRwQ2xpZW50fSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQge0RPQ1VNRU5UfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgTG9jYWxpemUge1xuXG4gICAgLy8gUmVhZG9ubHkgZGF0YS5cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9kaWN0aW9uYXJpZXM6IExvY2FsaXplRGljdGlvbmFyeVtdO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX2Z1bmN0aW9uTWlkZGxld2FyZTogTG9jYWxpemVGdW5jdGlvbk1hcDtcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9zdG9yYWdlVG9rZW46IHN0cmluZyA9ICdiYi1sYW5ndWFnZS1kaWN0aW9uYXJ5LWlkJztcblxuICAgIHByaXZhdGUgX2N1cnJlbnREaWN0aW9uYXJ5OiBMb2NhbGl6ZURpY3Rpb25hcnk7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9odHRwOiBIdHRwQ2xpZW50LFxuICAgICAgICAgICAgICAgIHByaXZhdGUgX3N0b3JhZ2U6IFN0b3JhZ2UsXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSBfcGxhdGZvcm06IFBsYXRmb3JtLFxuICAgICAgICAgICAgICAgIHByaXZhdGUgX2xhbmd1YWdlczogTGFuZ3VhZ2VzLFxuICAgICAgICAgICAgICAgIEBPcHRpb25hbCgpIHByaXZhdGUgX3N0YXRlOiBUcmFuc2ZlclN0YXRlLFxuICAgICAgICAgICAgICAgIEBPcHRpb25hbCgpIHByaXZhdGUgX2NvbmZpZzogTG9jYWxpemVDb25maWcsXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSBfbWlzc2luZ0hhbmRsZXI6IExvY2FsaXplTWlzc2luZ0hhbmRsZXIsXG4gICAgICAgICAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChET0NVTUVOVCkgcHJpdmF0ZSBfZG9jdW1lbnQ/OiBhbnksXG4gICAgICAgICAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChMT0NBVElPTikgcHJpdmF0ZSBfbG9jYXRpb24/OiBhbnksXG4gICAgICAgICAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChCQVNFX1VSTCkgcHJpdmF0ZSBfYmFzZVVybD86IHN0cmluZyxcbiAgICAgICAgICAgICAgICBAT3B0aW9uYWwoKSBASW5qZWN0KExPQ0FMSVpFX0ZVTkNUSU9OKSBwcml2YXRlIF9mdW5jdGlvbnM/OiBMb2NhbGl6ZUZ1bmN0aW9uW10sXG4gICAgICAgICAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChMT0NBTElaRV9FWFRSQV9ESUNUSU9OQVJZKSBwcml2YXRlIF9leHRyYXM/OiBMb2NhbGl6ZUV4dHJhRGljdGlvbmFyeVtdKSB7XG4gICAgICAgIC8vIENoZWNrIGlmIGF0IGxlYXN0IG9uZSBsYW5ndWFnZSB3YXMgcGFzc2VkIGluIHRoZSBjb25maWcuXG4gICAgICAgIGlmICh0aGlzLl9jb25maWcuZGljdGlvbmFyeS5sZW5ndGggPCAxKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0xvY2FsaXplOiBvbmUgb3IgbW9yZSBsYW5ndWFnZXMgc2hvdWxkIGJlIHN1cHBsaWVkLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gR2F0aGVyIHRoZSBkaWN0aW9uYXJpZXMuXG4gICAgICAgIHRoaXMuX2RpY3Rpb25hcmllcyA9IHRoaXMuX2NvbmZpZy5kaWN0aW9uYXJ5Lm1hcChpdGVtID0+IHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgTG9jYWxpemVEaWN0aW9uYXJ5KGl0ZW0sIHRoaXMuX2Jhc2VVcmwsIHRoaXMuX2h0dHApO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBTYXZlIHRoZSBiZXN0IG1hdGNoaW5nIGN1cnJlbnQgZGljdGlvbmFyeS5cbiAgICAgICAgdGhpcy5fY3VycmVudERpY3Rpb25hcnkgPSB0aGlzLnJldHJpZXZlQmVzdE1hdGNoaW5nRGljdGlvbmFyeSgpO1xuXG4gICAgICAgIC8vIEdhdGhlciBhbGwgdGhlIGxvY2FsaXplIGZ1bmN0aW9ucy5cbiAgICAgICAgdGhpcy5fZnVuY3Rpb25NaWRkbGV3YXJlID0gdGhpcy5fZnVuY3Rpb25zLnJlZHVjZSgocHJldmlvdXMsIGN1cnJlbnQpID0+IHtcbiAgICAgICAgICAgIHByZXZpb3VzW2N1cnJlbnQua2V5d29yZCgpXSA9IGN1cnJlbnQ7XG4gICAgICAgICAgICByZXR1cm4gcHJldmlvdXM7XG4gICAgICAgIH0sIHt9KTtcblxuICAgICAgICB0aGlzLnJlbmRlckRvY3VtZW50TGFuZ3VhZ2UoKTtcbiAgICB9XG5cbiAgICBnZXQgZGljdGlvbmFyaWVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGljdGlvbmFyaWVzO1xuICAgIH1cblxuICAgIGdldCBjdXJyZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY3VycmVudERpY3Rpb25hcnk7XG4gICAgfVxuXG4gICAgZ2V0IGxvY2FsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2N1cnJlbnREaWN0aW9uYXJ5LmxvY2FsZTtcbiAgICB9XG5cbiAgICBhc3luYyBsb2FkKGRpY3Rpb25hcnk6IExvY2FsaXplRGljdGlvbmFyeSkge1xuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5fc3RhdGU/Lmhhc0tleShkaWN0aW9uYXJ5LnN0YXRlS2V5KVxuICAgICAgICAgICAgPyB0aGlzLl9zdGF0ZT8uZ2V0KGRpY3Rpb25hcnkuc3RhdGVLZXksIHt9KVxuICAgICAgICAgICAgOiBudWxsO1xuXG4gICAgICAgIC8vIFRyeSB0byBsb2FkIHRoZSBkaWN0aW9uYXJ5IGRhdGEuXG4gICAgICAgIGNvbnN0IGxvYWRlZCA9IGF3YWl0IGRpY3Rpb25hcnkubG9hZChkYXRhKTtcblxuICAgICAgICAvLyBWZXJpZnkgdGhlIGRhdGEgd2FzIGxvYWRlZC5cbiAgICAgICAgaWYgKCFsb2FkZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTG9jYWxpemU6IENvdWxkIG5vdCBjb3JyZWN0bHkgZmV0Y2ggdGhlIGRhdGEgZnJvbTogXCIke2RpY3Rpb25hcnkuaWR9XCJgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5fcGxhdGZvcm0uaXNCcm93c2VyICYmIHRoaXMuX3N0YXRlKSB7XG4gICAgICAgICAgICB0aGlzLl9zdGF0ZT8uc2V0PG9iamVjdD4oZGljdGlvbmFyeT8uc3RhdGVLZXksIGRpY3Rpb25hcnk/LmRhdGEgPz8ge30pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ29tYmluZSB0aGUgZXh0cmEgZGljdGlvbmFyeSBkYXRhLlxuICAgICAgICAodGhpcy5fZXh0cmFzIHx8IFtdKS5mb3JFYWNoKGV4dHJhRGljdGlvbmFyeSA9PiBkaWN0aW9uYXJ5LmNvbWJpbmUoZXh0cmFEaWN0aW9uYXJ5KSk7XG5cbiAgICAgICAgLy8gUmV0dXJuIHRoZSBkaWN0aW9uYXJ5LlxuICAgICAgICByZXR1cm4gZGljdGlvbmFyeTtcbiAgICB9XG5cbiAgICBzZXQoZGljdGlvbmFyeTogTG9jYWxpemVEaWN0aW9uYXJ5KSB7XG4gICAgICAgIHRoaXMuX2N1cnJlbnREaWN0aW9uYXJ5ID0gZGljdGlvbmFyeTtcbiAgICB9XG5cbiAgICBpbml0aWFsaXplKCkge1xuICAgICAgICByZXR1cm4gYXN5bmMgKCkgPT4gdGhpcy5sb2FkKHRoaXMuX2N1cnJlbnREaWN0aW9uYXJ5KTtcbiAgICB9XG5cbiAgICBjaGFuZ2UoaWQ6IHN0cmluZywgcmVsb2FkOiBib29sZWFuID0gdHJ1ZSkge1xuICAgICAgICAvLyBUcnkgdG8gZmV0Y2ggdGhlIGRpY3Rpb25hcnkuXG4gICAgICAgIGNvbnN0IGRpY3Rpb25hcnkgPSB0aGlzLl9kaWN0aW9uYXJpZXMuZmluZChpdGVtID0+IGl0ZW0uaWQgPT09IGlkKTtcblxuICAgICAgICAvLyBWYWxpZGF0ZSB0aGUgZGljdGlvbmFyeSBleGlzdHMuXG4gICAgICAgIGlmICghZGljdGlvbmFyeSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBMb2NhbGl6ZTogQ291bGQgbm90IGZpbmQgZGljdGlvbmFyeSB3aXRoIGlkOiBcIiR7aWR9XCJgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNhdmUgdGhlIGxhbmd1YWdlIGluIHRoZSBzdG9yYWdlLlxuICAgICAgICB0aGlzLl9zdG9yYWdlLmNvb2tpZS5zZXQ8c3RyaW5nPih0aGlzLl9zdG9yYWdlVG9rZW4sIGRpY3Rpb25hcnkuaWQsIHt9KTtcblxuICAgICAgICAvLyBKdXN0IHF1aXQgaWYgd2UgZG9uJ3QgbmVlZCB0byByZWxvYWQuXG4gICAgICAgIGlmICghcmVsb2FkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBXZSBuZWVkIHRvIHJlbG9hZCB0aGUgYXBwbGljYXRpb24gZm9yIHRoZSB0cmFuc2xhdGlvbnMuXG4gICAgICAgIHJldHVybiB0aGlzLnJlbG9hZCgpO1xuICAgIH1cblxuICAgIGNsZWFyKHJlbG9hZDogYm9vbGVhbiA9IHRydWUpIHtcbiAgICAgICAgLy8gUmVtb3ZlIHRoZSBsYW5ndWFnZSBpbiB0aGUgbG9jYWwgc3RvcmFnZS5cbiAgICAgICAgdGhpcy5fc3RvcmFnZS5jb29raWUucmVtb3ZlKHRoaXMuX3N0b3JhZ2VUb2tlbik7XG5cbiAgICAgICAgLy8gSnVzdCBxdWl0IGlmIHdlIGRvbid0IG5lZWQgdG8gcmVsb2FkLlxuICAgICAgICBpZiAoIXJlbG9hZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gV2UgbmVlZCB0byByZWxvYWQgdGhlIGFwcGxpY2F0aW9uIGZvciB0aGUgdHJhbnNsYXRpb25zLlxuICAgICAgICByZXR1cm4gdGhpcy5yZWxvYWQoKTtcbiAgICB9XG5cbiAgICB0cmFuc2xhdGUodG9rZW5PclBhcmFtczogc3RyaW5nIHwgTG9jYWxpemVQYXJhbXMpIHtcbiAgICAgICAgLy8gMS4gQ29udmVydCB0byB0aGUgcGFyYW1zLlxuICAgICAgICBjb25zdCBwYXJhbXMgPSB0aGlzLmNvbnZlcnRUb1BhcmFtcyh0b2tlbk9yUGFyYW1zKTtcblxuICAgICAgICAvLyAyLiBUcnkgdG8gZmluZCB0aGUgdHJhbnNsYXRpb24gaW4gdGhlIGRpY3Rpb25hcnkuXG4gICAgICAgIGNvbnN0IHNlYXJjaFJlc3VsdCA9IHRoaXMuX2N1cnJlbnREaWN0aW9uYXJ5LnNlYXJjaChwYXJhbXMudG9rZW4pO1xuXG4gICAgICAgIC8vIDMuIFZlcmlmeSB0aGUgdHJhbnNsYXRpb24gd2FzIGZvdW5kLlxuICAgICAgICBpZiAoIXNlYXJjaFJlc3VsdCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21pc3NpbmdIYW5kbGVyLmhhbmRsZShwYXJhbXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gNC4gRmluZCByZWZlcmVuY2VzIGluIHRoZSB0cmFuc2xhdGlvbiB0aGF0IG5lZWQgdG8gYmUgdHJhbnNsYXRlZCBhcyB3ZWxsLlxuICAgICAgICBjb25zdCBwcm9jZXNzUmVzdWx0ID0gdGhpcy5maW5kUmVmZXJlbmNlc0luVHJhbnNsYXRpb24oc2VhcmNoUmVzdWx0KTtcblxuICAgICAgICAvLyA1LiBQYXJzZSB0aGUgaW50ZXJwb2xhdGlvbiBkYXRhLlxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZUludGVycG9sYXRpb25EYXRhKHByb2Nlc3NSZXN1bHQsIHBhcmFtcy5kYXRhKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHBhcnNlSW50ZXJwb2xhdGlvbkRhdGEodmFsdWU6IHN0cmluZywgZGF0YTogTG9jYWxpemVPcHRpb25zRGF0YSkge1xuICAgICAgICAvLyBHZXQgdGhlIGludGVycG9sYXRpb24gc3Vic3RpdHV0aW9ucy5cbiAgICAgICAgY29uc3Qgc3Vic3RpdHV0aW9ucyA9IHRoaXMuZ2V0U3Vic3RpdHV0aW9ucygnaW50ZXJwb2xhdGlvbicsIFsne3snLCAnfX0nXSk7XG5cbiAgICAgICAgLy8gR2V0IGFsbCBtYXRjaGVzIGluIHRoZSB2YWx1ZS5cbiAgICAgICAgY29uc3QgbWF0Y2hlcyA9IHRoaXMuZ2V0TWF0Y2hlcyh2YWx1ZSwgc3Vic3RpdHV0aW9ucyk7XG5cbiAgICAgICAgLy8gUmVwbGFjZSBhbGwgbWF0Y2hlcyB3aXRoIHRoZSBwYXJzZWQgdmFsdWUuXG4gICAgICAgIHJldHVybiBtYXRjaGVzLnJlZHVjZSgocHJldmlvdXMsIGN1cnJlbnQpID0+IHtcbiAgICAgICAgICAgIC8vIFRyeSB0byBwYXJzZSB0aGUgdG9rZW4uXG4gICAgICAgICAgICBjb25zdCBpbnRlcnBvbGF0ZWRUb2tlbiA9IHRoaXMuaW50ZXJwb2xhdGVGdW5jdGlvbkRhdGEoY3VycmVudC50b2tlbiwgZGF0YSk7XG5cbiAgICAgICAgICAgIC8vIFJlcGxhY2UgdGhlIG1hdGNoIHdpdGggdGhlIHBhcnNlZCB0b2tlbi5cbiAgICAgICAgICAgIHJldHVybiBwcmV2aW91cy5yZXBsYWNlKGN1cnJlbnQubWF0Y2gsIGludGVycG9sYXRlZFRva2VuKTtcbiAgICAgICAgfSwgYCR7dmFsdWV9YCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbnRlcnBvbGF0ZUZ1bmN0aW9uRGF0YSh2YWx1ZTogc3RyaW5nLCBpbnRlcnBvbGF0aW9uRGF0YTogTG9jYWxpemVPcHRpb25zRGF0YSkge1xuICAgICAgICAvLyBHZXQgdGhlIHRva2VuIGFuZCB0aGUgbWV0aG9kcyBieSBzcGxpdHRpbmdcbiAgICAgICAgLy8gb24gdGhlIHBpcGUgc3ltYm9sLlxuICAgICAgICBjb25zdCBbdG9rZW4sIC4uLm1ldGhvZHNdID0gdmFsdWUuc3BsaXQoJ3wnKS5tYXAoaXRlbSA9PiBpdGVtLnRyaW0oKSk7XG5cbiAgICAgICAgLy8gR2V0IHRoZSB2YWx1ZSBmb3IgdGhlIHRva2VuIGZyb21cbiAgICAgICAgLy8gdGhlIGludGVycG9sYXRpb24gZGF0YS5cbiAgICAgICAgY29uc3QgaW50ZXJwb2xhdGlvblZhbHVlID0gaW50ZXJwb2xhdGlvbkRhdGFbdG9rZW5dIHx8IHRva2VuO1xuXG4gICAgICAgIC8vIExvb3AgdGhyb3VnaCBhbGwgdGhlIG1pZGRsZXdhcmUgbWV0aG9kcyBhbmQgdHJ5IHRvXG4gICAgICAgIC8vIGNvbmZvcm0gdGhlIHN0cmluZyB0byB0aGUgZ2l2ZW4gcGFyYW1ldGVycy5cbiAgICAgICAgcmV0dXJuIG1ldGhvZHMucmVkdWNlKChzdHJpbmcsIG1pZGRsZXdhcmVOYW1lKSA9PiB7XG4gICAgICAgICAgICAvLyBUcnkgdG8gcmV0cmlldmUgdGhlIG1pZGRsZXdhcmUgZnJvbSB0aGUgY29sbGVjdGlvbi5cbiAgICAgICAgICAgIGNvbnN0IG1pZGRsZXdhcmUgPSB0aGlzLl9mdW5jdGlvbk1pZGRsZXdhcmVbbWlkZGxld2FyZU5hbWVdO1xuXG4gICAgICAgICAgICAvLyBJZiB0aGUgbWlkZGxld2FyZSBpcyBtaXNzaW5nIHJldHVybiBhbiBlcnJvclxuICAgICAgICAgICAgLy8gc28gdGhhdCB0aGUgdXNlciBrbm93cyBpdCB3YXMgbm90IGZvdW5kLlxuICAgICAgICAgICAgaWYgKCFtaWRkbGV3YXJlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0cmluZztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRXhlY3V0ZSB0aGUgbWlkZGxld2FyZSBmdW5jdGlvbiB3aXRoIHRoZSBzdHJpbmcuXG4gICAgICAgICAgICByZXR1cm4gbWlkZGxld2FyZS50cmFuc2Zvcm0oc3RyaW5nLCB0aGlzLmxvY2FsZSk7XG4gICAgICAgIH0sIGAke2ludGVycG9sYXRpb25WYWx1ZX1gKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZpbmRSZWZlcmVuY2VzSW5UcmFuc2xhdGlvbih2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIC8vIEdldCB0aGUgcmVmZXJlbmNlIHN1YnN0aXR1dGlvbnMuXG4gICAgICAgIGNvbnN0IHN1YnN0aXR1dGlvbnMgPSB0aGlzLmdldFN1YnN0aXR1dGlvbnMoJ3JlZmVyZW5jZXMnLCBbJyMoJywgJyknXSk7XG5cbiAgICAgICAgLy8gR2V0IGFsbCBtYXRjaGVzIGluIHRoZSB2YWx1ZS5cbiAgICAgICAgY29uc3QgbWF0Y2hlcyA9IHRoaXMuZ2V0TWF0Y2hlcyh2YWx1ZSwgc3Vic3RpdHV0aW9ucyk7XG5cbiAgICAgICAgLy8gUmVwbGFjZSBhbGwgbWF0Y2hlcyB3aXRoIHRoZSB0cmFuc2xhdGVkIHZhbHVlLlxuICAgICAgICByZXR1cm4gbWF0Y2hlcy5yZWR1Y2UoKHByZXZpb3VzLCBjdXJyZW50KSA9PiB7XG4gICAgICAgICAgICAvLyBUcnkgdG8gdHJhbnNsYXRlIHRoZSB0b2tlbi5cbiAgICAgICAgICAgIGNvbnN0IHRyYW5zbGF0ZWRUb2tlbiA9IHRoaXMudHJhbnNsYXRlKGN1cnJlbnQudG9rZW4pO1xuXG4gICAgICAgICAgICAvLyBSZXBsYWNlIHRoZSBtYXRjaCB3aXRoIHRoZSB0cmFuc2xhdGVkIHRva2VuLlxuICAgICAgICAgICAgcmV0dXJuIHByZXZpb3VzLnJlcGxhY2UoY3VycmVudC5tYXRjaCwgdHJhbnNsYXRlZFRva2VuKTtcbiAgICAgICAgfSwgdmFsdWUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0U3Vic3RpdHV0aW9ucyh0eXBlOiBzdHJpbmcsIGRlZmF1bHRWYWx1ZTogc3RyaW5nW10pIHtcbiAgICAgICAgY29uc3Qgc3Vic3RpdHV0aW9ucyA9ICh0aGlzLl9jb25maWdcbiAgICAgICAgICAgICYmIHRoaXMuX2NvbmZpZy5zdWJzdGl0dXRpb25zXG4gICAgICAgICAgICAmJiB0aGlzLl9jb25maWcuc3Vic3RpdHV0aW9uc1t0eXBlXSk7XG5cbiAgICAgICAgLy8gR2V0IHRoZSBzdWJzdGl0dXRpb25zLlxuICAgICAgICBjb25zdCB2YWx1ZSA9ICghc3Vic3RpdHV0aW9ucyB8fCBzdWJzdGl0dXRpb25zLmxlbmd0aCAhPT0gMilcbiAgICAgICAgICAgID8gZGVmYXVsdFZhbHVlXG4gICAgICAgICAgICA6IHN1YnN0aXR1dGlvbnM7XG5cbiAgICAgICAgLy8gRXNjYXBlIGJvdGggc3Vic3RpdHV0aW9ucyBzbyB0aGF0IHRoZXlcbiAgICAgICAgLy8gY2FuIGJlIHVzZWQuXG4gICAgICAgIGNvbnN0IGVzY2FwZSA9IC9bLiorP14ke30oKXxbXFxdXFxcXF0vZztcbiAgICAgICAgY29uc3Qgc3RhcnQgPSB2YWx1ZVswXS5yZXBsYWNlKGVzY2FwZSwgJ1xcXFwkJicpO1xuICAgICAgICBjb25zdCBlbmQgPSB2YWx1ZVsxXS5yZXBsYWNlKGVzY2FwZSwgJ1xcXFwkJicpO1xuXG4gICAgICAgIC8vIFJldHVybiB0aGUgc3Vic3RpdHV0aW9ucy5cbiAgICAgICAgcmV0dXJuIHtzdGFydCwgZW5kfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJldHJpZXZlQmVzdE1hdGNoaW5nRGljdGlvbmFyeSgpIHtcbiAgICAgICAgLy8gR2V0IHRoZSBkaWN0aW9uYXJ5IGJhc2VkIG9uIHN0b3JhZ2UuXG4gICAgICAgIGNvbnN0IHN0b3JhZ2VEaWN0aW9uYXJ5ID0gdGhpcy5nZXREaWN0aW9uYXJ5RnJvbVN0b3JhZ2UoKTtcblxuICAgICAgICAvLyBHZXQgdGhlIGRpY3Rpb25hcnkgYmFzZWQgb24gdGhlIHN1cHBvcnRlZCBsYW5ndWFnZS5cbiAgICAgICAgY29uc3QgYnJvd3NlckRpY3Rpb25hcnkgPSB0aGlzLmdldEJlc3RCcm93c2VyTWF0Y2hEaWN0aW9uYXJ5KCk7XG5cbiAgICAgICAgLy8gR2V0IHRoZSBkaWN0aW9uYXJ5IGJhc2VkIG9uIHRoZSBmaXJzdCBpbmRleC5cbiAgICAgICAgY29uc3QgZmlyc3REaWN0aW9uYXJ5ID0gdGhpcy5fZGljdGlvbmFyaWVzWzBdO1xuXG4gICAgICAgIC8vIFJldHVybiB0aGUgYmVzdCBtYXRjaGluZyBkaWN0aW9uYXJ5LlxuICAgICAgICByZXR1cm4gc3RvcmFnZURpY3Rpb25hcnkgfHwgYnJvd3NlckRpY3Rpb25hcnkgfHwgZmlyc3REaWN0aW9uYXJ5O1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0RGljdGlvbmFyeUZyb21TdG9yYWdlKCkge1xuICAgICAgICAvLyBHZXQgZGljdGlvbmFyeSBpZCBmcm9tIHRoZSBzdG9yYWdlLi5cbiAgICAgICAgY29uc3QgZGljdGlvbmFyeUlkID0gdGhpcy5fc3RvcmFnZS5jb29raWUuZ2V0PHN0cmluZz4odGhpcy5fc3RvcmFnZVRva2VuKTtcblxuICAgICAgICAvLyBSZXR1cm4gdGhlIGRpY3Rpb25hcnkgYmFzZWQgb24gdGhlIHN0b3JhZ2UgZGljdGlvbmFyeSBpZC5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2RpY3Rpb25hcmllcy5maW5kKGl0ZW0gPT4gaXRlbS5pZCA9PT0gZGljdGlvbmFyeUlkKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEJlc3RCcm93c2VyTWF0Y2hEaWN0aW9uYXJ5KCkge1xuICAgICAgICAvLyBMb29wIHRocm91Z2ggYWxsIGJyb3dzZXIgbGFuZ3VhZ2VzIGFuZCByZXR1cm4gdGhlXG4gICAgICAgIC8vIGJlc3QgbWF0Y2hpbmcgZGljdGlvbmFyeS5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2xhbmd1YWdlcy5hbGwubWFwKCh7Y29kZSwgcmVnaW9ufSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgbGFuZ3VhZ2VDb2RlID0gW2NvZGUsIHJlZ2lvbl0uZmlsdGVyKGRhdGEgPT4gISFkYXRhKS5qb2luKCctJyk7XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9kaWN0aW9uYXJpZXMuZmluZChpdGVtID0+IGl0ZW0uc3VwcG9ydGVkTGFuZ3VhZ2VzLmluY2x1ZGVzKGxhbmd1YWdlQ29kZSkpO1xuICAgICAgICB9KS5maWx0ZXIoaXRlbSA9PiAhIWl0ZW0pLmZpbmQoKF8sIGluZGV4KSA9PiBpbmRleCA9PT0gMCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjb252ZXJ0VG9QYXJhbXMgPSAodG9rZW5PclBhcmFtczogc3RyaW5nIHwgTG9jYWxpemVQYXJhbXMpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiB0b2tlbk9yUGFyYW1zICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgLy8gRGVzdHJ1Y3QgdGhlIHBhcmFtcyBmcm9tIHRoZSBvYmplY3QuXG4gICAgICAgICAgICBjb25zdCB7dG9rZW4sIG9wdGlvbmFsLCBkYXRhfSA9IHRva2VuT3JQYXJhbXM7XG5cbiAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBhbGwgcGFyYW1ldGVycyBhcmUgdmFsaWRcbiAgICAgICAgICAgIC8vIGJ5IHR5cGUgc2FmZSBhZGRpbmcgdGhlbS5cbiAgICAgICAgICAgIHJldHVybiB7dG9rZW46IHRva2VuLCBvcHRpb25hbDogb3B0aW9uYWwgfHwgZmFsc2UsIGRhdGE6IGRhdGEgfHwge319O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgdGhlIHBhcmFtZXRlciBpcyBhIHN0cmluZyBmaWxsIGluIHRoZSBibGFua3MuXG4gICAgICAgIHJldHVybiB7dG9rZW46IHRva2VuT3JQYXJhbXMsIG9wdGlvbmFsOiBmYWxzZSwgZGF0YToge319O1xuICAgIH07XG5cbiAgICBwcml2YXRlIHJlbmRlckRvY3VtZW50TGFuZ3VhZ2UoKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLl9kb2N1bWVudD8uZG9jdW1lbnRFbGVtZW50O1xuICAgICAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGVsZW1lbnQubGFuZyA9IHRoaXMuX2N1cnJlbnREaWN0aW9uYXJ5Py5zdXBwb3J0ZWRMYW5ndWFnZXM/LlswXSA/PyB0aGlzLl9jdXJyZW50RGljdGlvbmFyeT8ubG9jYWxlO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0TWF0Y2hlcyA9ICh2YWx1ZTogc3RyaW5nLCBzdWJzdGl0dXRpb25zOiB7IHN0YXJ0OiBzdHJpbmcsIGVuZDogc3RyaW5nIH0pID0+IHtcbiAgICAgICAgLy8gR2V0IHRoZSBtYXRjaGluZyBzdWJzdGl0dXRpb25zLlxuICAgICAgICBjb25zdCB7c3RhcnQsIGVuZH0gPSBzdWJzdGl0dXRpb25zO1xuXG4gICAgICAgIC8vIENvbXBvc2UgYSByZWdleCB0aGF0IHdpbGwgZmluZCB0aGUgbWF0Y2hlcy5cbiAgICAgICAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKGAke3N0YXJ0fShbXiR7ZW5kfV0rKSR7ZW5kfWAsICdnJyk7XG5cbiAgICAgICAgLy8gRXhlY3V0ZSB0aGUgcmVnZXggdG8gZmluZCBtYXRjaGVzLlxuICAgICAgICBsZXQgbWF0Y2ggPSByZWdleC5leGVjKHZhbHVlKTtcbiAgICAgICAgY29uc3QgbWF0Y2hlcyA9IFtdO1xuXG4gICAgICAgIHdoaWxlIChtYXRjaCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gUHVzaCBhIG5ldyBtYXRjaC5cbiAgICAgICAgICAgIG1hdGNoZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgbWF0Y2g6IG1hdGNoWzBdLFxuICAgICAgICAgICAgICAgIHRva2VuOiBtYXRjaFsxXVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8vIFRyeSB0byBmaW5kIG1vcmUgbWF0Y2hlcy5cbiAgICAgICAgICAgIG1hdGNoID0gcmVnZXguZXhlYyh2YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZXR1cm4gdGhlIHByb2Nlc3NlZCB2YWx1ZS5cbiAgICAgICAgcmV0dXJuIG1hdGNoZXMuZmlsdGVyKGl0ZW0gPT4gISFpdGVtKTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSByZWxvYWQgPSAoKSA9PiB0aGlzLl9sb2NhdGlvbj8ucmVsb2FkKCk7XG5cbn1cbiJdfQ==
1
+ import { LOCALIZE_FUNCTION } from './interfaces/functions.interfaces';
2
+ import { Inject, Injectable, Optional } from '@angular/core';
3
+ import { DOCUMENT } from '@angular/common';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "@bravobit/bb-foundation/storage";
6
+ import * as i2 from "@bravobit/bb-foundation";
7
+ import * as i3 from "./interfaces/config.interfaces";
8
+ import * as i4 from "./handlers/missing.handler";
9
+ export class Localize {
10
+ constructor(_storage, _languages, _config, _missingHandler, _document, _functions) {
11
+ this._storage = _storage;
12
+ this._languages = _languages;
13
+ this._config = _config;
14
+ this._missingHandler = _missingHandler;
15
+ this._document = _document;
16
+ this._functions = _functions;
17
+ this._storageToken = 'bb-language-dictionary-id';
18
+ // Current language dictionary.
19
+ this._currentLanguage = null;
20
+ this._currentDictionary = null;
21
+ this.convertToParams = (tokenOrParams) => {
22
+ if (typeof tokenOrParams !== 'string') {
23
+ // Destruct the params from the object.
24
+ const { token, optional, data } = tokenOrParams;
25
+ // Make sure all parameters are valid
26
+ // by type safe adding them.
27
+ return { token: token, optional: optional ?? false, data: data ?? {} };
28
+ }
29
+ // If the parameter is a string fill in the blanks.
30
+ return { token: tokenOrParams, optional: false, data: {} };
31
+ };
32
+ this.getMatches = (value, substitutions) => {
33
+ // Get the matching substitutions.
34
+ const { start, end } = substitutions;
35
+ // Compose a regex that will find the matches.
36
+ const regex = new RegExp(`${start}([^${end}]+)${end}`, 'g');
37
+ // Execute the regex to find matches.
38
+ let match = regex.exec(value);
39
+ const matches = [];
40
+ while (match !== null) {
41
+ matches.push({ match: match[0], token: match[1] });
42
+ match = regex.exec(value);
43
+ }
44
+ // Return the processed value.
45
+ return matches.filter(item => !!item);
46
+ };
47
+ // Check if at least one language was passed in the config.
48
+ this._availableLanguages = this._config.languages;
49
+ if (this._availableLanguages.length < 1) {
50
+ throw new Error('Localize: one or more languages should be supplied.');
51
+ }
52
+ // Gather all the localize functions.
53
+ this._functionMiddleware = this._functions.reduce((previous, current) => {
54
+ previous[current.keyword()] = current;
55
+ return previous;
56
+ }, {});
57
+ // Save the best matching current dictionary.
58
+ this._bestMatchingLanguage = this.retrieveBestMatchingLanguage();
59
+ this.renderDocumentLanguage();
60
+ }
61
+ get languages() {
62
+ return this._availableLanguages ?? [];
63
+ }
64
+ get current() {
65
+ return this._currentLanguage;
66
+ }
67
+ async set(language, cache = true) {
68
+ // Await the language data and set the current
69
+ // dictionary to the loaded data.
70
+ this._currentLanguage = language;
71
+ this._currentDictionary = await language.data();
72
+ // Save the selected language in the storage.
73
+ if (cache) {
74
+ this._storage.cookie.set(this._storageToken, this._currentLanguage?.id, {});
75
+ }
76
+ }
77
+ initialize() {
78
+ return async () => this.set(this._bestMatchingLanguage, false);
79
+ }
80
+ clear() {
81
+ this._storage.cookie.remove(this._storageToken);
82
+ }
83
+ translate(tokenOrParams) {
84
+ // 1. Convert to the params.
85
+ const params = this.convertToParams(tokenOrParams);
86
+ // 2. Try to find the translation in the dictionary.
87
+ const searchResult = this._currentDictionary.get(params?.token);
88
+ // 3. Verify the translation was found.
89
+ if (!searchResult) {
90
+ return this._missingHandler.handle(params);
91
+ }
92
+ // 4. Find references in the translation that need to be translated as well.
93
+ const processResult = this.findReferencesInTranslation(searchResult);
94
+ // 5. Parse the interpolation data.
95
+ return this.parseInterpolationData(processResult, params?.data);
96
+ }
97
+ parseInterpolationData(value, data) {
98
+ // Get the interpolation substitutions.
99
+ const substitutions = this.getSubstitutions('interpolation', ['{{', '}}']);
100
+ // Get all matches in the value.
101
+ const matches = this.getMatches(value, substitutions);
102
+ // Replace all matches with the parsed value.
103
+ return matches.reduce((previous, current) => {
104
+ // Try to parse the token.
105
+ const interpolatedToken = this.interpolateFunctionData(current?.token, data);
106
+ // Replace the match with the parsed token.
107
+ return previous.replace(current?.match, interpolatedToken);
108
+ }, `${value}`);
109
+ }
110
+ interpolateFunctionData(value, interpolationData) {
111
+ // Get the token and the methods by splitting
112
+ // on the pipe symbol.
113
+ const [token, ...methods] = value.split('|').map(item => item.trim());
114
+ // Get the value for the token from
115
+ // the interpolation data.
116
+ const interpolationValue = interpolationData?.[token] ?? token;
117
+ // Loop through all the middleware methods and try to
118
+ // conform the string to the given parameters.
119
+ return methods.reduce((string, middlewareName) => {
120
+ // Try to retrieve the middleware from the collection.
121
+ const middleware = this._functionMiddleware[middlewareName];
122
+ // If the middleware is missing return an error
123
+ // so that the user knows it was not found.
124
+ if (!middleware) {
125
+ return string;
126
+ }
127
+ // Execute the middleware function with the string.
128
+ return middleware.transform(string, this.current?.locale);
129
+ }, `${interpolationValue}`);
130
+ }
131
+ findReferencesInTranslation(value) {
132
+ // Get the reference substitutions.
133
+ const substitutions = this.getSubstitutions('references', ['#(', ')']);
134
+ // Get all matches in the value.
135
+ const matches = this.getMatches(value, substitutions);
136
+ // Replace all matches with the translated value.
137
+ return matches.reduce((previous, current) => {
138
+ // Try to translate the token.
139
+ const translatedToken = this.translate(current?.token);
140
+ // Replace the match with the translated token.
141
+ return previous.replace(current?.match, translatedToken);
142
+ }, value);
143
+ }
144
+ getSubstitutions(type, defaultValue) {
145
+ // Get the substitutions.
146
+ const substitutions = this._config?.substitutions?.[type] ?? null;
147
+ const value = (!substitutions || substitutions.length !== 2)
148
+ ? defaultValue
149
+ : substitutions;
150
+ // Escape both substitutions so that they
151
+ // can be used.
152
+ const escape = /[.*+?^${}()|[\]\\]/g;
153
+ const start = value[0].replace(escape, '\\$&');
154
+ const end = value[1].replace(escape, '\\$&');
155
+ // Return the substitutions.
156
+ return { start, end };
157
+ }
158
+ retrieveBestMatchingLanguage() {
159
+ // Get the language based on storage.
160
+ const storageLanguage = this.getLanguageFromStorage();
161
+ // Get the language based on the supported languages of the browser.
162
+ const browserLanguage = this.getBestBrowserMatchLanguage();
163
+ // Return the best matching language.
164
+ return storageLanguage ?? browserLanguage ?? this._languages?.[0];
165
+ }
166
+ getLanguageFromStorage() {
167
+ // Get id from the storage.
168
+ const id = this._storage.cookie.get(this._storageToken);
169
+ // Return the language based on the storage id.
170
+ return this._availableLanguages.find(item => item?.id === id);
171
+ }
172
+ getBestBrowserMatchLanguage() {
173
+ // Loop through all browser languages and return the
174
+ // best matching language.
175
+ return this._languages.all.map(({ code, region }) => {
176
+ const languageCode = [code, region].filter(data => !!data).join('-');
177
+ return this._availableLanguages.find(item => item?.supported?.includes(languageCode));
178
+ }).filter(item => !!item).find((_, index) => index === 0);
179
+ }
180
+ renderDocumentLanguage() {
181
+ const element = this._document?.documentElement;
182
+ if (!element) {
183
+ return;
184
+ }
185
+ element.lang = this._bestMatchingLanguage?.supported?.[0] ?? this._bestMatchingLanguage?.locale;
186
+ }
187
+ }
188
+ Localize.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.6", ngImport: i0, type: Localize, deps: [{ token: i1.Storage }, { token: i2.Languages }, { token: i3.LocalizeConfig, optional: true }, { token: i4.LocalizeMissingHandler }, { token: DOCUMENT, optional: true }, { token: LOCALIZE_FUNCTION, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
189
+ Localize.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.6", ngImport: i0, type: Localize });
190
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.6", ngImport: i0, type: Localize, decorators: [{
191
+ type: Injectable
192
+ }], ctorParameters: function () { return [{ type: i1.Storage }, { type: i2.Languages }, { type: i3.LocalizeConfig, decorators: [{
193
+ type: Optional
194
+ }] }, { type: i4.LocalizeMissingHandler }, { type: undefined, decorators: [{
195
+ type: Optional
196
+ }, {
197
+ type: Inject,
198
+ args: [DOCUMENT]
199
+ }] }, { type: undefined, decorators: [{
200
+ type: Optional
201
+ }, {
202
+ type: Inject,
203
+ args: [LOCALIZE_FUNCTION]
204
+ }] }]; } });
205
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYWxpemUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2JiLWZvdW5kYXRpb24vbG9jYWxpemUvc3JjL2xpYi9sb2NhbGl6ZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxpQkFBaUIsRUFBd0MsTUFBTSxtQ0FBbUMsQ0FBQztBQUkzRyxPQUFPLEVBQUMsTUFBTSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFJM0QsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGlCQUFpQixDQUFDOzs7Ozs7QUFHekMsTUFBTSxPQUFPLFFBQVE7SUFhakIsWUFBb0IsUUFBaUIsRUFDakIsVUFBcUIsRUFDVCxPQUF1QixFQUNuQyxlQUF1QyxFQUNULFNBQWUsRUFDTixVQUErQjtRQUx0RSxhQUFRLEdBQVIsUUFBUSxDQUFTO1FBQ2pCLGVBQVUsR0FBVixVQUFVLENBQVc7UUFDVCxZQUFPLEdBQVAsT0FBTyxDQUFnQjtRQUNuQyxvQkFBZSxHQUFmLGVBQWUsQ0FBd0I7UUFDVCxjQUFTLEdBQVQsU0FBUyxDQUFNO1FBQ04sZUFBVSxHQUFWLFVBQVUsQ0FBcUI7UUFYekUsa0JBQWEsR0FBVywyQkFBMkIsQ0FBQztRQUVyRSwrQkFBK0I7UUFDdkIscUJBQWdCLEdBQWtDLElBQUksQ0FBQztRQUN2RCx1QkFBa0IsR0FBOEIsSUFBSSxDQUFDO1FBbUxyRCxvQkFBZSxHQUFHLENBQUMsYUFBc0MsRUFBRSxFQUFFO1lBQ2pFLElBQUksT0FBTyxhQUFhLEtBQUssUUFBUSxFQUFFO2dCQUNuQyx1Q0FBdUM7Z0JBQ3ZDLE1BQU0sRUFBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBQyxHQUFHLGFBQWEsQ0FBQztnQkFFOUMscUNBQXFDO2dCQUNyQyw0QkFBNEI7Z0JBQzVCLE9BQU8sRUFBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxRQUFRLElBQUksS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLElBQUksRUFBRSxFQUFDLENBQUM7YUFDeEU7WUFFRCxtREFBbUQ7WUFDbkQsT0FBTyxFQUFDLEtBQUssRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFDLENBQUM7UUFDN0QsQ0FBQyxDQUFDO1FBV00sZUFBVSxHQUFHLENBQUMsS0FBYSxFQUFFLGFBQTZDLEVBQUUsRUFBRTtZQUNsRixrQ0FBa0M7WUFDbEMsTUFBTSxFQUFDLEtBQUssRUFBRSxHQUFHLEVBQUMsR0FBRyxhQUFhLENBQUM7WUFFbkMsOENBQThDO1lBQzlDLE1BQU0sS0FBSyxHQUFHLElBQUksTUFBTSxDQUFDLEdBQUcsS0FBSyxNQUFNLEdBQUcsTUFBTSxHQUFHLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUU1RCxxQ0FBcUM7WUFDckMsSUFBSSxLQUFLLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM5QixNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUM7WUFFbkIsT0FBTyxLQUFLLEtBQUssSUFBSSxFQUFFO2dCQUNuQixPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQztnQkFDakQsS0FBSyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDN0I7WUFFRCw4QkFBOEI7WUFDOUIsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzFDLENBQUMsQ0FBQztRQXBORSwyREFBMkQ7UUFDM0QsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDO1FBQ2xELElBQUksSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDckMsTUFBTSxJQUFJLEtBQUssQ0FBQyxxREFBcUQsQ0FBQyxDQUFDO1NBQzFFO1FBRUQscUNBQXFDO1FBQ3JDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsRUFBRTtZQUNwRSxRQUFRLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDO1lBQ3RDLE9BQU8sUUFBUSxDQUFDO1FBQ3BCLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVQLDZDQUE2QztRQUM3QyxJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDLDRCQUE0QixFQUFFLENBQUM7UUFFakUsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7SUFDbEMsQ0FBQztJQUVELElBQUksU0FBUztRQUNULE9BQU8sSUFBSSxDQUFDLG1CQUFtQixJQUFJLEVBQUUsQ0FBQztJQUMxQyxDQUFDO0lBRUQsSUFBSSxPQUFPO1FBQ1AsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7SUFDakMsQ0FBQztJQUVELEtBQUssQ0FBQyxHQUFHLENBQUMsUUFBZ0MsRUFBRSxRQUFpQixJQUFJO1FBQzdELDhDQUE4QztRQUM5QyxpQ0FBaUM7UUFDakMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLFFBQVEsQ0FBQztRQUNqQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsTUFBTSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7UUFFaEQsNkNBQTZDO1FBQzdDLElBQUksS0FBSyxFQUFFO1lBQ1AsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFTLElBQUksQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztTQUN2RjtJQUNMLENBQUM7SUFFRCxVQUFVO1FBQ04sT0FBTyxLQUFLLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLHFCQUFxQixFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ25FLENBQUM7SUFFRCxLQUFLO1FBQ0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRUQsU0FBUyxDQUFDLGFBQXNDO1FBQzVDLDRCQUE0QjtRQUM1QixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBRW5ELG9EQUFvRDtRQUNwRCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztRQUVoRSx1Q0FBdUM7UUFDdkMsSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNmLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDOUM7UUFFRCw0RUFBNEU7UUFDNUUsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLDJCQUEyQixDQUFDLFlBQVksQ0FBQyxDQUFDO1FBRXJFLG1DQUFtQztRQUNuQyxPQUFPLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxhQUFhLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3BFLENBQUM7SUFFTyxzQkFBc0IsQ0FBQyxLQUFhLEVBQUUsSUFBeUI7UUFDbkUsdUNBQXVDO1FBQ3ZDLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUUzRSxnQ0FBZ0M7UUFDaEMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFFdEQsNkNBQTZDO1FBQzdDLE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsRUFBRTtZQUN4QywwQkFBMEI7WUFDMUIsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztZQUU3RSwyQ0FBMkM7WUFDM0MsT0FBTyxRQUFRLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztRQUMvRCxDQUFDLEVBQUUsR0FBRyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ25CLENBQUM7SUFFTyx1QkFBdUIsQ0FBQyxLQUFhLEVBQUUsaUJBQXNDO1FBQ2pGLDZDQUE2QztRQUM3QyxzQkFBc0I7UUFDdEIsTUFBTSxDQUFDLEtBQUssRUFBRSxHQUFHLE9BQU8sQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFFdEUsbUNBQW1DO1FBQ25DLDBCQUEwQjtRQUMxQixNQUFNLGtCQUFrQixHQUFHLGlCQUFpQixFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDO1FBRS9ELHFEQUFxRDtRQUNyRCw4Q0FBOEM7UUFDOUMsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLGNBQWMsRUFBRSxFQUFFO1lBQzdDLHNEQUFzRDtZQUN0RCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsY0FBYyxDQUFDLENBQUM7WUFFNUQsK0NBQStDO1lBQy9DLDJDQUEyQztZQUMzQyxJQUFJLENBQUMsVUFBVSxFQUFFO2dCQUNiLE9BQU8sTUFBTSxDQUFDO2FBQ2pCO1lBRUQsbURBQW1EO1lBQ25ELE9BQU8sVUFBVSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztRQUM5RCxDQUFDLEVBQUUsR0FBRyxrQkFBa0IsRUFBRSxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVPLDJCQUEyQixDQUFDLEtBQWE7UUFDN0MsbUNBQW1DO1FBQ25DLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUV2RSxnQ0FBZ0M7UUFDaEMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFFdEQsaURBQWlEO1FBQ2pELE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsRUFBRTtZQUN4Qyw4QkFBOEI7WUFDOUIsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFFdkQsK0NBQStDO1lBQy9DLE9BQU8sUUFBUSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLGVBQWUsQ0FBQyxDQUFDO1FBQzdELENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNkLENBQUM7SUFFTyxnQkFBZ0IsQ0FBQyxJQUFvQyxFQUFFLFlBQXNCO1FBQ2pGLHlCQUF5QjtRQUN6QixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQztRQUNsRSxNQUFNLEtBQUssR0FBRyxDQUFDLENBQUMsYUFBYSxJQUFJLGFBQWEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDO1lBQ3hELENBQUMsQ0FBQyxZQUFZO1lBQ2QsQ0FBQyxDQUFDLGFBQWEsQ0FBQztRQUVwQix5Q0FBeUM7UUFDekMsZUFBZTtRQUNmLE1BQU0sTUFBTSxHQUFHLHFCQUFxQixDQUFDO1FBQ3JDLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQy9DLE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBRTdDLDRCQUE0QjtRQUM1QixPQUFPLEVBQUMsS0FBSyxFQUFFLEdBQUcsRUFBQyxDQUFDO0lBQ3hCLENBQUM7SUFFTyw0QkFBNEI7UUFDaEMscUNBQXFDO1FBQ3JDLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBRXRELG9FQUFvRTtRQUNwRSxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsMkJBQTJCLEVBQUUsQ0FBQztRQUUzRCxxQ0FBcUM7UUFDckMsT0FBTyxlQUFlLElBQUksZUFBZSxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN0RSxDQUFDO0lBRU8sc0JBQXNCO1FBQzFCLDJCQUEyQjtRQUMzQixNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQVMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBRWhFLCtDQUErQztRQUMvQyxPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ2xFLENBQUM7SUFFTywyQkFBMkI7UUFDL0Isb0RBQW9EO1FBQ3BELDBCQUEwQjtRQUMxQixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUMsSUFBSSxFQUFFLE1BQU0sRUFBQyxFQUFFLEVBQUU7WUFDOUMsTUFBTSxZQUFZLEdBQUcsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUVyRSxPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO1FBQzFGLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQWdCTyxzQkFBc0I7UUFDMUIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxlQUFlLENBQUM7UUFDaEQsSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNWLE9BQU87U0FDVjtRQUVELE9BQU8sQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxNQUFNLENBQUM7SUFDcEcsQ0FBQzs7cUdBbk5RLFFBQVEsc0pBaUJlLFFBQVEsNkJBQ1IsaUJBQWlCO3lHQWxCeEMsUUFBUTsyRkFBUixRQUFRO2tCQURwQixVQUFVOzswQkFnQk0sUUFBUTs7MEJBRVIsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxRQUFROzswQkFDM0IsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxpQkFBaUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0xPQ0FMSVpFX0ZVTkNUSU9OLCBMb2NhbGl6ZUZ1bmN0aW9uLCBMb2NhbGl6ZUZ1bmN0aW9uTWFwfSBmcm9tICcuL2ludGVyZmFjZXMvZnVuY3Rpb25zLmludGVyZmFjZXMnO1xyXG5pbXBvcnQge0xvY2FsaXplQ29uZmlnLCBMb2NhbGl6ZUNvbmZpZ0xhbmd1YWdlfSBmcm9tICcuL2ludGVyZmFjZXMvY29uZmlnLmludGVyZmFjZXMnO1xyXG5pbXBvcnQge0xvY2FsaXplT3B0aW9uc0RhdGEsIExvY2FsaXplUGFyYW1zfSBmcm9tICcuL2ludGVyZmFjZXMvb3B0aW9ucy5pbnRlcmZhY2VzJztcclxuaW1wb3J0IHtMb2NhbGl6ZU1pc3NpbmdIYW5kbGVyfSBmcm9tICcuL2hhbmRsZXJzL21pc3NpbmcuaGFuZGxlcic7XHJcbmltcG9ydCB7SW5qZWN0LCBJbmplY3RhYmxlLCBPcHRpb25hbH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7TG9jYWxpemVEaWN0aW9uYXJ5fSBmcm9tICcuL2xvY2FsaXplLmRpY3Rpb25hcnknO1xyXG5pbXBvcnQge1N0b3JhZ2V9IGZyb20gJ0BicmF2b2JpdC9iYi1mb3VuZGF0aW9uL3N0b3JhZ2UnO1xyXG5pbXBvcnQge0xhbmd1YWdlc30gZnJvbSAnQGJyYXZvYml0L2JiLWZvdW5kYXRpb24nO1xyXG5pbXBvcnQge0RPQ1VNRU5UfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgTG9jYWxpemUge1xyXG5cclxuICAgIC8vIFJlYWRvbmx5IGRhdGEuXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9hdmFpbGFibGVMYW5ndWFnZXM6IExvY2FsaXplQ29uZmlnTGFuZ3VhZ2VbXTtcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2Jlc3RNYXRjaGluZ0xhbmd1YWdlOiBMb2NhbGl6ZUNvbmZpZ0xhbmd1YWdlO1xyXG5cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2Z1bmN0aW9uTWlkZGxld2FyZTogTG9jYWxpemVGdW5jdGlvbk1hcDtcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3N0b3JhZ2VUb2tlbjogc3RyaW5nID0gJ2JiLWxhbmd1YWdlLWRpY3Rpb25hcnktaWQnO1xyXG5cclxuICAgIC8vIEN1cnJlbnQgbGFuZ3VhZ2UgZGljdGlvbmFyeS5cclxuICAgIHByaXZhdGUgX2N1cnJlbnRMYW5ndWFnZTogTG9jYWxpemVDb25maWdMYW5ndWFnZSB8IG51bGwgPSBudWxsO1xyXG4gICAgcHJpdmF0ZSBfY3VycmVudERpY3Rpb25hcnk6IExvY2FsaXplRGljdGlvbmFyeSB8IG51bGwgPSBudWxsO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgX3N0b3JhZ2U6IFN0b3JhZ2UsXHJcbiAgICAgICAgICAgICAgICBwcml2YXRlIF9sYW5ndWFnZXM6IExhbmd1YWdlcyxcclxuICAgICAgICAgICAgICAgIEBPcHRpb25hbCgpIHByaXZhdGUgX2NvbmZpZzogTG9jYWxpemVDb25maWcsXHJcbiAgICAgICAgICAgICAgICBwcml2YXRlIF9taXNzaW5nSGFuZGxlcjogTG9jYWxpemVNaXNzaW5nSGFuZGxlcixcclxuICAgICAgICAgICAgICAgIEBPcHRpb25hbCgpIEBJbmplY3QoRE9DVU1FTlQpIHByaXZhdGUgX2RvY3VtZW50PzogYW55LFxyXG4gICAgICAgICAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChMT0NBTElaRV9GVU5DVElPTikgcHJpdmF0ZSBfZnVuY3Rpb25zPzogTG9jYWxpemVGdW5jdGlvbltdKSB7XHJcbiAgICAgICAgLy8gQ2hlY2sgaWYgYXQgbGVhc3Qgb25lIGxhbmd1YWdlIHdhcyBwYXNzZWQgaW4gdGhlIGNvbmZpZy5cclxuICAgICAgICB0aGlzLl9hdmFpbGFibGVMYW5ndWFnZXMgPSB0aGlzLl9jb25maWcubGFuZ3VhZ2VzO1xyXG4gICAgICAgIGlmICh0aGlzLl9hdmFpbGFibGVMYW5ndWFnZXMubGVuZ3RoIDwgMSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0xvY2FsaXplOiBvbmUgb3IgbW9yZSBsYW5ndWFnZXMgc2hvdWxkIGJlIHN1cHBsaWVkLicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gR2F0aGVyIGFsbCB0aGUgbG9jYWxpemUgZnVuY3Rpb25zLlxyXG4gICAgICAgIHRoaXMuX2Z1bmN0aW9uTWlkZGxld2FyZSA9IHRoaXMuX2Z1bmN0aW9ucy5yZWR1Y2UoKHByZXZpb3VzLCBjdXJyZW50KSA9PiB7XHJcbiAgICAgICAgICAgIHByZXZpb3VzW2N1cnJlbnQua2V5d29yZCgpXSA9IGN1cnJlbnQ7XHJcbiAgICAgICAgICAgIHJldHVybiBwcmV2aW91cztcclxuICAgICAgICB9LCB7fSk7XHJcblxyXG4gICAgICAgIC8vIFNhdmUgdGhlIGJlc3QgbWF0Y2hpbmcgY3VycmVudCBkaWN0aW9uYXJ5LlxyXG4gICAgICAgIHRoaXMuX2Jlc3RNYXRjaGluZ0xhbmd1YWdlID0gdGhpcy5yZXRyaWV2ZUJlc3RNYXRjaGluZ0xhbmd1YWdlKCk7XHJcblxyXG4gICAgICAgIHRoaXMucmVuZGVyRG9jdW1lbnRMYW5ndWFnZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBsYW5ndWFnZXMoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2F2YWlsYWJsZUxhbmd1YWdlcyA/PyBbXTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgY3VycmVudCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fY3VycmVudExhbmd1YWdlO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHNldChsYW5ndWFnZTogTG9jYWxpemVDb25maWdMYW5ndWFnZSwgY2FjaGU6IGJvb2xlYW4gPSB0cnVlKSB7XHJcbiAgICAgICAgLy8gQXdhaXQgdGhlIGxhbmd1YWdlIGRhdGEgYW5kIHNldCB0aGUgY3VycmVudFxyXG4gICAgICAgIC8vIGRpY3Rpb25hcnkgdG8gdGhlIGxvYWRlZCBkYXRhLlxyXG4gICAgICAgIHRoaXMuX2N1cnJlbnRMYW5ndWFnZSA9IGxhbmd1YWdlO1xyXG4gICAgICAgIHRoaXMuX2N1cnJlbnREaWN0aW9uYXJ5ID0gYXdhaXQgbGFuZ3VhZ2UuZGF0YSgpO1xyXG5cclxuICAgICAgICAvLyBTYXZlIHRoZSBzZWxlY3RlZCBsYW5ndWFnZSBpbiB0aGUgc3RvcmFnZS5cclxuICAgICAgICBpZiAoY2FjaGUpIHtcclxuICAgICAgICAgICAgdGhpcy5fc3RvcmFnZS5jb29raWUuc2V0PHN0cmluZz4odGhpcy5fc3RvcmFnZVRva2VuLCB0aGlzLl9jdXJyZW50TGFuZ3VhZ2U/LmlkLCB7fSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGluaXRpYWxpemUoKSB7XHJcbiAgICAgICAgcmV0dXJuIGFzeW5jICgpID0+IHRoaXMuc2V0KHRoaXMuX2Jlc3RNYXRjaGluZ0xhbmd1YWdlLCBmYWxzZSk7XHJcbiAgICB9XHJcblxyXG4gICAgY2xlYXIoKSB7XHJcbiAgICAgICAgdGhpcy5fc3RvcmFnZS5jb29raWUucmVtb3ZlKHRoaXMuX3N0b3JhZ2VUb2tlbik7XHJcbiAgICB9XHJcblxyXG4gICAgdHJhbnNsYXRlKHRva2VuT3JQYXJhbXM6IHN0cmluZyB8IExvY2FsaXplUGFyYW1zKSB7XHJcbiAgICAgICAgLy8gMS4gQ29udmVydCB0byB0aGUgcGFyYW1zLlxyXG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IHRoaXMuY29udmVydFRvUGFyYW1zKHRva2VuT3JQYXJhbXMpO1xyXG5cclxuICAgICAgICAvLyAyLiBUcnkgdG8gZmluZCB0aGUgdHJhbnNsYXRpb24gaW4gdGhlIGRpY3Rpb25hcnkuXHJcbiAgICAgICAgY29uc3Qgc2VhcmNoUmVzdWx0ID0gdGhpcy5fY3VycmVudERpY3Rpb25hcnkuZ2V0KHBhcmFtcz8udG9rZW4pO1xyXG5cclxuICAgICAgICAvLyAzLiBWZXJpZnkgdGhlIHRyYW5zbGF0aW9uIHdhcyBmb3VuZC5cclxuICAgICAgICBpZiAoIXNlYXJjaFJlc3VsdCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fbWlzc2luZ0hhbmRsZXIuaGFuZGxlKHBhcmFtcyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyA0LiBGaW5kIHJlZmVyZW5jZXMgaW4gdGhlIHRyYW5zbGF0aW9uIHRoYXQgbmVlZCB0byBiZSB0cmFuc2xhdGVkIGFzIHdlbGwuXHJcbiAgICAgICAgY29uc3QgcHJvY2Vzc1Jlc3VsdCA9IHRoaXMuZmluZFJlZmVyZW5jZXNJblRyYW5zbGF0aW9uKHNlYXJjaFJlc3VsdCk7XHJcblxyXG4gICAgICAgIC8vIDUuIFBhcnNlIHRoZSBpbnRlcnBvbGF0aW9uIGRhdGEuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VJbnRlcnBvbGF0aW9uRGF0YShwcm9jZXNzUmVzdWx0LCBwYXJhbXM/LmRhdGEpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgcGFyc2VJbnRlcnBvbGF0aW9uRGF0YSh2YWx1ZTogc3RyaW5nLCBkYXRhOiBMb2NhbGl6ZU9wdGlvbnNEYXRhKSB7XHJcbiAgICAgICAgLy8gR2V0IHRoZSBpbnRlcnBvbGF0aW9uIHN1YnN0aXR1dGlvbnMuXHJcbiAgICAgICAgY29uc3Qgc3Vic3RpdHV0aW9ucyA9IHRoaXMuZ2V0U3Vic3RpdHV0aW9ucygnaW50ZXJwb2xhdGlvbicsIFsne3snLCAnfX0nXSk7XHJcblxyXG4gICAgICAgIC8vIEdldCBhbGwgbWF0Y2hlcyBpbiB0aGUgdmFsdWUuXHJcbiAgICAgICAgY29uc3QgbWF0Y2hlcyA9IHRoaXMuZ2V0TWF0Y2hlcyh2YWx1ZSwgc3Vic3RpdHV0aW9ucyk7XHJcblxyXG4gICAgICAgIC8vIFJlcGxhY2UgYWxsIG1hdGNoZXMgd2l0aCB0aGUgcGFyc2VkIHZhbHVlLlxyXG4gICAgICAgIHJldHVybiBtYXRjaGVzLnJlZHVjZSgocHJldmlvdXMsIGN1cnJlbnQpID0+IHtcclxuICAgICAgICAgICAgLy8gVHJ5IHRvIHBhcnNlIHRoZSB0b2tlbi5cclxuICAgICAgICAgICAgY29uc3QgaW50ZXJwb2xhdGVkVG9rZW4gPSB0aGlzLmludGVycG9sYXRlRnVuY3Rpb25EYXRhKGN1cnJlbnQ/LnRva2VuLCBkYXRhKTtcclxuXHJcbiAgICAgICAgICAgIC8vIFJlcGxhY2UgdGhlIG1hdGNoIHdpdGggdGhlIHBhcnNlZCB0b2tlbi5cclxuICAgICAgICAgICAgcmV0dXJuIHByZXZpb3VzLnJlcGxhY2UoY3VycmVudD8ubWF0Y2gsIGludGVycG9sYXRlZFRva2VuKTtcclxuICAgICAgICB9LCBgJHt2YWx1ZX1gKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGludGVycG9sYXRlRnVuY3Rpb25EYXRhKHZhbHVlOiBzdHJpbmcsIGludGVycG9sYXRpb25EYXRhOiBMb2NhbGl6ZU9wdGlvbnNEYXRhKSB7XHJcbiAgICAgICAgLy8gR2V0IHRoZSB0b2tlbiBhbmQgdGhlIG1ldGhvZHMgYnkgc3BsaXR0aW5nXHJcbiAgICAgICAgLy8gb24gdGhlIHBpcGUgc3ltYm9sLlxyXG4gICAgICAgIGNvbnN0IFt0b2tlbiwgLi4ubWV0aG9kc10gPSB2YWx1ZS5zcGxpdCgnfCcpLm1hcChpdGVtID0+IGl0ZW0udHJpbSgpKTtcclxuXHJcbiAgICAgICAgLy8gR2V0IHRoZSB2YWx1ZSBmb3IgdGhlIHRva2VuIGZyb21cclxuICAgICAgICAvLyB0aGUgaW50ZXJwb2xhdGlvbiBkYXRhLlxyXG4gICAgICAgIGNvbnN0IGludGVycG9sYXRpb25WYWx1ZSA9IGludGVycG9sYXRpb25EYXRhPy5bdG9rZW5dID8/IHRva2VuO1xyXG5cclxuICAgICAgICAvLyBMb29wIHRocm91Z2ggYWxsIHRoZSBtaWRkbGV3YXJlIG1ldGhvZHMgYW5kIHRyeSB0b1xyXG4gICAgICAgIC8vIGNvbmZvcm0gdGhlIHN0cmluZyB0byB0aGUgZ2l2ZW4gcGFyYW1ldGVycy5cclxuICAgICAgICByZXR1cm4gbWV0aG9kcy5yZWR1Y2UoKHN0cmluZywgbWlkZGxld2FyZU5hbWUpID0+IHtcclxuICAgICAgICAgICAgLy8gVHJ5IHRvIHJldHJpZXZlIHRoZSBtaWRkbGV3YXJlIGZyb20gdGhlIGNvbGxlY3Rpb24uXHJcbiAgICAgICAgICAgIGNvbnN0IG1pZGRsZXdhcmUgPSB0aGlzLl9mdW5jdGlvbk1pZGRsZXdhcmVbbWlkZGxld2FyZU5hbWVdO1xyXG5cclxuICAgICAgICAgICAgLy8gSWYgdGhlIG1pZGRsZXdhcmUgaXMgbWlzc2luZyByZXR1cm4gYW4gZXJyb3JcclxuICAgICAgICAgICAgLy8gc28gdGhhdCB0aGUgdXNlciBrbm93cyBpdCB3YXMgbm90IGZvdW5kLlxyXG4gICAgICAgICAgICBpZiAoIW1pZGRsZXdhcmUpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBzdHJpbmc7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIEV4ZWN1dGUgdGhlIG1pZGRsZXdhcmUgZnVuY3Rpb24gd2l0aCB0aGUgc3RyaW5nLlxyXG4gICAgICAgICAgICByZXR1cm4gbWlkZGxld2FyZS50cmFuc2Zvcm0oc3RyaW5nLCB0aGlzLmN1cnJlbnQ/LmxvY2FsZSk7XHJcbiAgICAgICAgfSwgYCR7aW50ZXJwb2xhdGlvblZhbHVlfWApO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZmluZFJlZmVyZW5jZXNJblRyYW5zbGF0aW9uKHZhbHVlOiBzdHJpbmcpIHtcclxuICAgICAgICAvLyBHZXQgdGhlIHJlZmVyZW5jZSBzdWJzdGl0dXRpb25zLlxyXG4gICAgICAgIGNvbnN0IHN1YnN0aXR1dGlvbnMgPSB0aGlzLmdldFN1YnN0aXR1dGlvbnMoJ3JlZmVyZW5jZXMnLCBbJyMoJywgJyknXSk7XHJcblxyXG4gICAgICAgIC8vIEdldCBhbGwgbWF0Y2hlcyBpbiB0aGUgdmFsdWUuXHJcbiAgICAgICAgY29uc3QgbWF0Y2hlcyA9IHRoaXMuZ2V0TWF0Y2hlcyh2YWx1ZSwgc3Vic3RpdHV0aW9ucyk7XHJcblxyXG4gICAgICAgIC8vIFJlcGxhY2UgYWxsIG1hdGNoZXMgd2l0aCB0aGUgdHJhbnNsYXRlZCB2YWx1ZS5cclxuICAgICAgICByZXR1cm4gbWF0Y2hlcy5yZWR1Y2UoKHByZXZpb3VzLCBjdXJyZW50KSA9PiB7XHJcbiAgICAgICAgICAgIC8vIFRyeSB0byB0cmFuc2xhdGUgdGhlIHRva2VuLlxyXG4gICAgICAgICAgICBjb25zdCB0cmFuc2xhdGVkVG9rZW4gPSB0aGlzLnRyYW5zbGF0ZShjdXJyZW50Py50b2tlbik7XHJcblxyXG4gICAgICAgICAgICAvLyBSZXBsYWNlIHRoZSBtYXRjaCB3aXRoIHRoZSB0cmFuc2xhdGVkIHRva2VuLlxyXG4gICAgICAgICAgICByZXR1cm4gcHJldmlvdXMucmVwbGFjZShjdXJyZW50Py5tYXRjaCwgdHJhbnNsYXRlZFRva2VuKTtcclxuICAgICAgICB9LCB2YWx1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRTdWJzdGl0dXRpb25zKHR5cGU6ICdyZWZlcmVuY2VzJyB8ICdpbnRlcnBvbGF0aW9uJywgZGVmYXVsdFZhbHVlOiBzdHJpbmdbXSkge1xyXG4gICAgICAgIC8vIEdldCB0aGUgc3Vic3RpdHV0aW9ucy5cclxuICAgICAgICBjb25zdCBzdWJzdGl0dXRpb25zID0gdGhpcy5fY29uZmlnPy5zdWJzdGl0dXRpb25zPy5bdHlwZV0gPz8gbnVsbDtcclxuICAgICAgICBjb25zdCB2YWx1ZSA9ICghc3Vic3RpdHV0aW9ucyB8fCBzdWJzdGl0dXRpb25zLmxlbmd0aCAhPT0gMilcclxuICAgICAgICAgICAgPyBkZWZhdWx0VmFsdWVcclxuICAgICAgICAgICAgOiBzdWJzdGl0dXRpb25zO1xyXG5cclxuICAgICAgICAvLyBFc2NhcGUgYm90aCBzdWJzdGl0dXRpb25zIHNvIHRoYXQgdGhleVxyXG4gICAgICAgIC8vIGNhbiBiZSB1c2VkLlxyXG4gICAgICAgIGNvbnN0IGVzY2FwZSA9IC9bLiorP14ke30oKXxbXFxdXFxcXF0vZztcclxuICAgICAgICBjb25zdCBzdGFydCA9IHZhbHVlWzBdLnJlcGxhY2UoZXNjYXBlLCAnXFxcXCQmJyk7XHJcbiAgICAgICAgY29uc3QgZW5kID0gdmFsdWVbMV0ucmVwbGFjZShlc2NhcGUsICdcXFxcJCYnKTtcclxuXHJcbiAgICAgICAgLy8gUmV0dXJuIHRoZSBzdWJzdGl0dXRpb25zLlxyXG4gICAgICAgIHJldHVybiB7c3RhcnQsIGVuZH07XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSByZXRyaWV2ZUJlc3RNYXRjaGluZ0xhbmd1YWdlKCkge1xyXG4gICAgICAgIC8vIEdldCB0aGUgbGFuZ3VhZ2UgYmFzZWQgb24gc3RvcmFnZS5cclxuICAgICAgICBjb25zdCBzdG9yYWdlTGFuZ3VhZ2UgPSB0aGlzLmdldExhbmd1YWdlRnJvbVN0b3JhZ2UoKTtcclxuXHJcbiAgICAgICAgLy8gR2V0IHRoZSBsYW5ndWFnZSBiYXNlZCBvbiB0aGUgc3VwcG9ydGVkIGxhbmd1YWdlcyBvZiB0aGUgYnJvd3Nlci5cclxuICAgICAgICBjb25zdCBicm93c2VyTGFuZ3VhZ2UgPSB0aGlzLmdldEJlc3RCcm93c2VyTWF0Y2hMYW5ndWFnZSgpO1xyXG5cclxuICAgICAgICAvLyBSZXR1cm4gdGhlIGJlc3QgbWF0Y2hpbmcgbGFuZ3VhZ2UuXHJcbiAgICAgICAgcmV0dXJuIHN0b3JhZ2VMYW5ndWFnZSA/PyBicm93c2VyTGFuZ3VhZ2UgPz8gdGhpcy5fbGFuZ3VhZ2VzPy5bMF07XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRMYW5ndWFnZUZyb21TdG9yYWdlKCkge1xyXG4gICAgICAgIC8vIEdldCBpZCBmcm9tIHRoZSBzdG9yYWdlLlxyXG4gICAgICAgIGNvbnN0IGlkID0gdGhpcy5fc3RvcmFnZS5jb29raWUuZ2V0PHN0cmluZz4odGhpcy5fc3RvcmFnZVRva2VuKTtcclxuXHJcbiAgICAgICAgLy8gUmV0dXJuIHRoZSBsYW5ndWFnZSBiYXNlZCBvbiB0aGUgc3RvcmFnZSBpZC5cclxuICAgICAgICByZXR1cm4gdGhpcy5fYXZhaWxhYmxlTGFuZ3VhZ2VzLmZpbmQoaXRlbSA9PiBpdGVtPy5pZCA9PT0gaWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0QmVzdEJyb3dzZXJNYXRjaExhbmd1YWdlKCkge1xyXG4gICAgICAgIC8vIExvb3AgdGhyb3VnaCBhbGwgYnJvd3NlciBsYW5ndWFnZXMgYW5kIHJldHVybiB0aGVcclxuICAgICAgICAvLyBiZXN0IG1hdGNoaW5nIGxhbmd1YWdlLlxyXG4gICAgICAgIHJldHVybiB0aGlzLl9sYW5ndWFnZXMuYWxsLm1hcCgoe2NvZGUsIHJlZ2lvbn0pID0+IHtcclxuICAgICAgICAgICAgY29uc3QgbGFuZ3VhZ2VDb2RlID0gW2NvZGUsIHJlZ2lvbl0uZmlsdGVyKGRhdGEgPT4gISFkYXRhKS5qb2luKCctJyk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fYXZhaWxhYmxlTGFuZ3VhZ2VzLmZpbmQoaXRlbSA9PiBpdGVtPy5zdXBwb3J0ZWQ/LmluY2x1ZGVzKGxhbmd1YWdlQ29kZSkpO1xyXG4gICAgICAgIH0pLmZpbHRlcihpdGVtID0+ICEhaXRlbSkuZmluZCgoXywgaW5kZXgpID0+IGluZGV4ID09PSAwKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNvbnZlcnRUb1BhcmFtcyA9ICh0b2tlbk9yUGFyYW1zOiBzdHJpbmcgfCBMb2NhbGl6ZVBhcmFtcykgPT4ge1xyXG4gICAgICAgIGlmICh0eXBlb2YgdG9rZW5PclBhcmFtcyAhPT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgLy8gRGVzdHJ1Y3QgdGhlIHBhcmFtcyBmcm9tIHRoZSBvYmplY3QuXHJcbiAgICAgICAgICAgIGNvbnN0IHt0b2tlbiwgb3B0aW9uYWwsIGRhdGF9ID0gdG9rZW5PclBhcmFtcztcclxuXHJcbiAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBhbGwgcGFyYW1ldGVycyBhcmUgdmFsaWRcclxuICAgICAgICAgICAgLy8gYnkgdHlwZSBzYWZlIGFkZGluZyB0aGVtLlxyXG4gICAgICAgICAgICByZXR1cm4ge3Rva2VuOiB0b2tlbiwgb3B0aW9uYWw6IG9wdGlvbmFsID8/IGZhbHNlLCBkYXRhOiBkYXRhID8/IHt9fTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIElmIHRoZSBwYXJhbWV0ZXIgaXMgYSBzdHJpbmcgZmlsbCBpbiB0aGUgYmxhbmtzLlxyXG4gICAgICAgIHJldHVybiB7dG9rZW46IHRva2VuT3JQYXJhbXMsIG9wdGlvbmFsOiBmYWxzZSwgZGF0YToge319O1xyXG4gICAgfTtcclxuXHJcbiAgICBwcml2YXRlIHJlbmRlckRvY3VtZW50TGFuZ3VhZ2UoKSB7XHJcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuX2RvY3VtZW50Py5kb2N1bWVudEVsZW1lbnQ7XHJcbiAgICAgICAgaWYgKCFlbGVtZW50KSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGVsZW1lbnQubGFuZyA9IHRoaXMuX2Jlc3RNYXRjaGluZ0xhbmd1YWdlPy5zdXBwb3J0ZWQ/LlswXSA/PyB0aGlzLl9iZXN0TWF0Y2hpbmdMYW5ndWFnZT8ubG9jYWxlO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0TWF0Y2hlcyA9ICh2YWx1ZTogc3RyaW5nLCBzdWJzdGl0dXRpb25zOiB7IHN0YXJ0OiBzdHJpbmcsIGVuZDogc3RyaW5nIH0pID0+IHtcclxuICAgICAgICAvLyBHZXQgdGhlIG1hdGNoaW5nIHN1YnN0aXR1dGlvbnMuXHJcbiAgICAgICAgY29uc3Qge3N0YXJ0LCBlbmR9ID0gc3Vic3RpdHV0aW9ucztcclxuXHJcbiAgICAgICAgLy8gQ29tcG9zZSBhIHJlZ2V4IHRoYXQgd2lsbCBmaW5kIHRoZSBtYXRjaGVzLlxyXG4gICAgICAgIGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cChgJHtzdGFydH0oW14ke2VuZH1dKykke2VuZH1gLCAnZycpO1xyXG5cclxuICAgICAgICAvLyBFeGVjdXRlIHRoZSByZWdleCB0byBmaW5kIG1hdGNoZXMuXHJcbiAgICAgICAgbGV0IG1hdGNoID0gcmVnZXguZXhlYyh2YWx1ZSk7XHJcbiAgICAgICAgY29uc3QgbWF0Y2hlcyA9IFtdO1xyXG5cclxuICAgICAgICB3aGlsZSAobWF0Y2ggIT09IG51bGwpIHtcclxuICAgICAgICAgICAgbWF0Y2hlcy5wdXNoKHttYXRjaDogbWF0Y2hbMF0sIHRva2VuOiBtYXRjaFsxXX0pO1xyXG4gICAgICAgICAgICBtYXRjaCA9IHJlZ2V4LmV4ZWModmFsdWUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gUmV0dXJuIHRoZSBwcm9jZXNzZWQgdmFsdWUuXHJcbiAgICAgICAgcmV0dXJuIG1hdGNoZXMuZmlsdGVyKGl0ZW0gPT4gISFpdGVtKTtcclxuICAgIH07XHJcblxyXG59XHJcbiJdfQ==