@bravobit/bb-foundation 0.14.3 → 0.15.2

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 (413) 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/bundles/bravobit-bb-foundation-auth.umd.js +1400 -1402
  25. package/bundles/bravobit-bb-foundation-auth.umd.js.map +1 -1
  26. package/bundles/bravobit-bb-foundation-collections.umd.js +868 -0
  27. package/bundles/bravobit-bb-foundation-collections.umd.js.map +1 -0
  28. package/bundles/bravobit-bb-foundation-dashboard.umd.js +817 -819
  29. package/bundles/bravobit-bb-foundation-dashboard.umd.js.map +1 -1
  30. package/bundles/bravobit-bb-foundation-dialog.umd.js +649 -651
  31. package/bundles/bravobit-bb-foundation-dialog.umd.js.map +1 -1
  32. package/bundles/bravobit-bb-foundation-elements.umd.js +2651 -2653
  33. package/bundles/bravobit-bb-foundation-elements.umd.js.map +1 -1
  34. package/bundles/bravobit-bb-foundation-http.umd.js +488 -490
  35. package/bundles/bravobit-bb-foundation-http.umd.js.map +1 -1
  36. package/bundles/bravobit-bb-foundation-localize.umd.js +1208 -1210
  37. package/bundles/bravobit-bb-foundation-localize.umd.js.map +1 -1
  38. package/bundles/bravobit-bb-foundation-notifications.umd.js +743 -745
  39. package/bundles/bravobit-bb-foundation-notifications.umd.js.map +1 -1
  40. package/bundles/bravobit-bb-foundation-recaptcha.umd.js +640 -642
  41. package/bundles/bravobit-bb-foundation-recaptcha.umd.js.map +1 -1
  42. package/bundles/bravobit-bb-foundation-rxjs.umd.js +13 -13
  43. package/bundles/bravobit-bb-foundation-rxjs.umd.js.map +1 -1
  44. package/bundles/bravobit-bb-foundation-storage.umd.js +756 -758
  45. package/bundles/bravobit-bb-foundation-storage.umd.js.map +1 -1
  46. package/bundles/bravobit-bb-foundation-table.umd.js +993 -995
  47. package/bundles/bravobit-bb-foundation-table.umd.js.map +1 -1
  48. package/bundles/bravobit-bb-foundation.umd.js +1332 -1334
  49. package/bundles/bravobit-bb-foundation.umd.js.map +1 -1
  50. package/collections/bravobit-bb-foundation-collections.d.ts +5 -0
  51. package/collections/lib/collection.d.ts +43 -0
  52. package/collections/lib/collections.module.d.ts +10 -0
  53. package/collections/lib/components/collections-pager/collections-pager.component.d.ts +34 -0
  54. package/collections/lib/components/collections-viewer/collections-viewer.component.d.ts +12 -0
  55. package/collections/lib/components/collections.directive.d.ts +17 -0
  56. package/collections/lib/interfaces/collection.interface.d.ts +26 -0
  57. package/collections/lib/providers/api-collection.provider.d.ts +15 -0
  58. package/collections/lib/providers/collection.provider.d.ts +6 -0
  59. package/collections/lib/providers/local-collection.provider.d.ts +8 -0
  60. package/collections/package.json +10 -0
  61. package/collections/public_api.d.ts +9 -0
  62. package/dashboard/bravobit-bb-foundation-dashboard.d.ts +5 -5
  63. package/dashboard/lib/dashboard/dashboard.component.d.ts +19 -19
  64. package/dashboard/lib/dashboard-header/dashboard-header.component.d.ts +11 -11
  65. package/dashboard/lib/dashboard-menu/dashboard-menu.component.d.ts +9 -9
  66. package/dashboard/lib/dashboard-menu-item/dashboard-menu-item.component.d.ts +11 -11
  67. package/dashboard/lib/dashboard-sidebar/dashboard-sidebar.component.d.ts +21 -21
  68. package/dashboard/lib/dashboard-sidebar-group/dashboard-sidebar-group.component.d.ts +27 -27
  69. package/dashboard/lib/dashboard-sidebar-item/dashboard-sidebar-item.component.d.ts +16 -16
  70. package/dashboard/lib/dashboard.module.d.ts +16 -16
  71. package/dashboard/public_api.d.ts +8 -8
  72. package/dialog/bravobit-bb-foundation-dialog.d.ts +5 -5
  73. package/dialog/lib/dialog-actions/dialog-actions.component.d.ts +5 -5
  74. package/dialog/lib/dialog-confirm/dialog-confirm.component.d.ts +16 -16
  75. package/dialog/lib/dialog-container/dialog-container.component.d.ts +24 -24
  76. package/dialog/lib/dialog-header/dialog-header.component.d.ts +9 -9
  77. package/dialog/lib/dialog-link/dialog-link.component.d.ts +5 -5
  78. package/dialog/lib/dialog-modal/dialog-modal.component.d.ts +12 -12
  79. package/dialog/lib/dialog-overlay/dialog-overlay.component.d.ts +22 -22
  80. package/dialog/lib/dialog.injector.d.ts +8 -8
  81. package/dialog/lib/dialog.insertion.d.ts +8 -8
  82. package/dialog/lib/dialog.interfaces.d.ts +3 -3
  83. package/dialog/lib/dialog.module.d.ts +19 -19
  84. package/dialog/lib/dialog.ref.d.ts +8 -8
  85. package/dialog/lib/dialog.service.d.ts +19 -19
  86. package/dialog/public_api.d.ts +9 -9
  87. package/elements/bravobit-bb-foundation-elements.d.ts +5 -5
  88. package/elements/lib/avatar/avatar.component.d.ts +25 -25
  89. package/elements/lib/button/button.component.d.ts +23 -23
  90. package/elements/lib/checkbox/checkbox.component.d.ts +27 -27
  91. package/elements/lib/date-picker/date-picker.component.d.ts +69 -69
  92. package/elements/lib/directives/addon.directive.d.ts +9 -9
  93. package/elements/lib/directives/autosize.directive.d.ts +18 -18
  94. package/elements/lib/directives/focus-trap.directive.d.ts +17 -17
  95. package/elements/lib/directives/focus.directive.d.ts +14 -14
  96. package/elements/lib/directives/form-submit.directive.d.ts +17 -17
  97. package/elements/lib/directives/input.directive.d.ts +38 -38
  98. package/elements/lib/directives/template.directive.d.ts +10 -10
  99. package/elements/lib/dropdown/dropdown.component.d.ts +21 -21
  100. package/elements/lib/elements.interfaces.d.ts +25 -25
  101. package/elements/lib/elements.module.d.ts +116 -116
  102. package/elements/lib/file-picker/file-picker.component.d.ts +49 -49
  103. package/elements/lib/form-control/form-control.component.d.ts +21 -21
  104. package/elements/lib/form-error/form-error.component.d.ts +29 -29
  105. package/elements/lib/form-group/form-group.component.d.ts +10 -10
  106. package/elements/lib/icon/icon.component.d.ts +22 -22
  107. package/elements/lib/image-picker/image-picker.component.d.ts +38 -38
  108. package/elements/lib/pipes/file-image.pipe.d.ts +13 -13
  109. package/elements/lib/pipes/file-size.pipe.d.ts +8 -8
  110. package/elements/lib/pipes/relative-time.pipe.d.ts +19 -19
  111. package/elements/lib/spinner/spinner.component.d.ts +12 -12
  112. package/elements/lib/tag/tag.component.d.ts +7 -7
  113. package/elements/public_api.d.ts +25 -25
  114. package/esm2015/auth/bravobit-bb-foundation-auth.js +4 -4
  115. package/esm2015/auth/lib/auth.interceptor.js +95 -95
  116. package/esm2015/auth/lib/auth.module.js +54 -54
  117. package/esm2015/auth/lib/auth.service.js +299 -299
  118. package/esm2015/auth/lib/auth.session.js +136 -136
  119. package/esm2015/auth/lib/directives/authenticated.directive.js +32 -32
  120. package/esm2015/auth/lib/directives/permission.directive.js +81 -81
  121. package/esm2015/auth/lib/directives/role.directive.js +38 -38
  122. package/esm2015/auth/lib/guards/anonymous.guard.js +35 -35
  123. package/esm2015/auth/lib/guards/authenticated.guard.js +36 -36
  124. package/esm2015/auth/lib/helpers/jwt.helper.js +69 -69
  125. package/esm2015/auth/lib/helpers/mapper.helper.js +35 -35
  126. package/esm2015/auth/lib/interfaces/config.interface.js +3 -3
  127. package/esm2015/auth/lib/interfaces/mapper.interface.js +2 -2
  128. package/esm2015/auth/lib/interfaces/provider.interface.js +2 -2
  129. package/esm2015/auth/lib/interfaces/token.interface.js +2 -2
  130. package/esm2015/auth/lib/permissions.service.js +58 -58
  131. package/esm2015/auth/lib/providers/email.provider.js +26 -26
  132. package/esm2015/auth/lib/providers/verify.provider.js +20 -20
  133. package/esm2015/auth/lib/tokens/use-authorization.token.js +3 -3
  134. package/esm2015/auth/public_api.js +19 -19
  135. package/esm2015/bravobit-bb-foundation.js +4 -4
  136. package/esm2015/collections/bravobit-bb-foundation-collections.js +5 -0
  137. package/esm2015/collections/lib/collection.js +104 -0
  138. package/esm2015/collections/lib/collections.module.js +54 -0
  139. package/esm2015/collections/lib/components/collections-pager/collections-pager.component.js +136 -0
  140. package/esm2015/collections/lib/components/collections-viewer/collections-viewer.component.js +39 -0
  141. package/esm2015/collections/lib/components/collections.directive.js +43 -0
  142. package/esm2015/collections/lib/interfaces/collection.interface.js +2 -0
  143. package/esm2015/collections/lib/providers/api-collection.provider.js +69 -0
  144. package/esm2015/collections/lib/providers/collection.provider.js +14 -0
  145. package/esm2015/collections/lib/providers/local-collection.provider.js +16 -0
  146. package/esm2015/collections/public_api.js +10 -0
  147. package/esm2015/dashboard/bravobit-bb-foundation-dashboard.js +4 -4
  148. package/esm2015/dashboard/lib/dashboard/dashboard.component.js +64 -64
  149. package/esm2015/dashboard/lib/dashboard-header/dashboard-header.component.js +41 -41
  150. package/esm2015/dashboard/lib/dashboard-menu/dashboard-menu.component.js +39 -39
  151. package/esm2015/dashboard/lib/dashboard-menu-item/dashboard-menu-item.component.js +38 -38
  152. package/esm2015/dashboard/lib/dashboard-sidebar/dashboard-sidebar.component.js +83 -83
  153. package/esm2015/dashboard/lib/dashboard-sidebar-group/dashboard-sidebar-group.component.js +110 -110
  154. package/esm2015/dashboard/lib/dashboard-sidebar-item/dashboard-sidebar-item.component.js +71 -71
  155. package/esm2015/dashboard/lib/dashboard.module.js +47 -47
  156. package/esm2015/dashboard/public_api.js +9 -9
  157. package/esm2015/dialog/bravobit-bb-foundation-dialog.js +4 -4
  158. package/esm2015/dialog/lib/dialog-actions/dialog-actions.component.js +20 -20
  159. package/esm2015/dialog/lib/dialog-confirm/dialog-confirm.component.js +45 -45
  160. package/esm2015/dialog/lib/dialog-container/dialog-container.component.js +162 -162
  161. package/esm2015/dialog/lib/dialog-header/dialog-header.component.js +33 -33
  162. package/esm2015/dialog/lib/dialog-link/dialog-link.component.js +19 -19
  163. package/esm2015/dialog/lib/dialog-modal/dialog-modal.component.js +54 -54
  164. package/esm2015/dialog/lib/dialog-overlay/dialog-overlay.component.js +143 -143
  165. package/esm2015/dialog/lib/dialog.injector.js +18 -18
  166. package/esm2015/dialog/lib/dialog.insertion.js +16 -16
  167. package/esm2015/dialog/lib/dialog.interfaces.js +3 -3
  168. package/esm2015/dialog/lib/dialog.module.js +74 -74
  169. package/esm2015/dialog/lib/dialog.ref.js +22 -22
  170. package/esm2015/dialog/lib/dialog.service.js +77 -77
  171. package/esm2015/dialog/public_api.js +10 -10
  172. package/esm2015/elements/bravobit-bb-foundation-elements.js +4 -4
  173. package/esm2015/elements/lib/avatar/avatar.component.js +151 -151
  174. package/esm2015/elements/lib/button/button.component.js +79 -79
  175. package/esm2015/elements/lib/checkbox/checkbox.component.js +83 -83
  176. package/esm2015/elements/lib/date-picker/date-picker.component.js +322 -322
  177. package/esm2015/elements/lib/directives/addon.directive.js +29 -29
  178. package/esm2015/elements/lib/directives/autosize.directive.js +74 -74
  179. package/esm2015/elements/lib/directives/focus-trap.directive.js +77 -77
  180. package/esm2015/elements/lib/directives/focus.directive.js +39 -39
  181. package/esm2015/elements/lib/directives/form-submit.directive.js +53 -53
  182. package/esm2015/elements/lib/directives/input.directive.js +139 -139
  183. package/esm2015/elements/lib/directives/template.directive.js +28 -28
  184. package/esm2015/elements/lib/dropdown/dropdown.component.js +111 -111
  185. package/esm2015/elements/lib/elements.interfaces.js +4 -4
  186. package/esm2015/elements/lib/elements.module.js +177 -177
  187. package/esm2015/elements/lib/file-picker/file-picker.component.js +247 -247
  188. package/esm2015/elements/lib/form-control/form-control.component.js +58 -58
  189. package/esm2015/elements/lib/form-error/form-error.component.js +116 -116
  190. package/esm2015/elements/lib/form-group/form-group.component.js +27 -27
  191. package/esm2015/elements/lib/icon/icon.component.js +110 -110
  192. package/esm2015/elements/lib/image-picker/image-picker.component.js +119 -119
  193. package/esm2015/elements/lib/pipes/file-image.pipe.js +45 -45
  194. package/esm2015/elements/lib/pipes/file-size.pipe.js +28 -28
  195. package/esm2015/elements/lib/pipes/relative-time.pipe.js +96 -96
  196. package/esm2015/elements/lib/spinner/spinner.component.js +34 -34
  197. package/esm2015/elements/lib/tag/tag.component.js +26 -26
  198. package/esm2015/elements/public_api.js +26 -26
  199. package/esm2015/http/bravobit-bb-foundation-http.js +4 -4
  200. package/esm2015/http/lib/classes/http.config.js +31 -31
  201. package/esm2015/http/lib/classes/http.error.js +21 -21
  202. package/esm2015/http/lib/http.interfaces.js +2 -2
  203. package/esm2015/http/lib/http.module.js +43 -43
  204. package/esm2015/http/lib/interceptors/base-url.interceptor.js +52 -52
  205. package/esm2015/http/lib/interceptors/error.interceptor.js +33 -33
  206. package/esm2015/http/public_api.js +7 -7
  207. package/esm2015/lib/core/coercions/boolean-coercion.js +4 -4
  208. package/esm2015/lib/core/miscellaneous/regex.js +5 -5
  209. package/esm2015/lib/core/miscellaneous/validator.js +86 -86
  210. package/esm2015/lib/core/mixins/can-disable.js +16 -16
  211. package/esm2015/lib/core/mixins/can-hide-errors.js +16 -16
  212. package/esm2015/lib/core/mixins/can-load.js +16 -16
  213. package/esm2015/lib/core/mixins/constructor.js +2 -2
  214. package/esm2015/lib/core/mixins/has-error.js +16 -16
  215. package/esm2015/lib/core/mixins/is-focused.js +16 -16
  216. package/esm2015/lib/core/mixins/is-grouped.js +16 -16
  217. package/esm2015/lib/core/mixins/is-readonly.js +16 -16
  218. package/esm2015/lib/core/mixins/is-required.js +16 -16
  219. package/esm2015/lib/core/services/clipboard.service.js +72 -72
  220. package/esm2015/lib/core/services/exif.service.js +168 -168
  221. package/esm2015/lib/core/services/file-loader.service.js +90 -90
  222. package/esm2015/lib/core/services/image-converter.service.js +130 -130
  223. package/esm2015/lib/core/services/languages.service.js +74 -74
  224. package/esm2015/lib/core/services/network.service.js +56 -56
  225. package/esm2015/lib/core/services/patch.service.js +65 -65
  226. package/esm2015/lib/core/services/platform.service.js +42 -42
  227. package/esm2015/lib/core/tokens/accept-language.token.js +3 -3
  228. package/esm2015/lib/core/tokens/base-url.token.js +3 -3
  229. package/esm2015/lib/core/tokens/cookie.token.js +3 -3
  230. package/esm2015/lib/core/tokens/location.token.js +6 -6
  231. package/esm2015/lib/core/tokens/navigator.token.js +6 -6
  232. package/esm2015/lib/core/tokens/window.token.js +12 -12
  233. package/esm2015/localize/bravobit-bb-foundation-localize.js +4 -4
  234. package/esm2015/localize/lib/functions/date.function.js +18 -18
  235. package/esm2015/localize/lib/functions/lowercase.function.js +13 -13
  236. package/esm2015/localize/lib/functions/uppercase.function.js +13 -13
  237. package/esm2015/localize/lib/handlers/missing.handler.js +17 -17
  238. package/esm2015/localize/lib/interfaces/config.interfaces.js +10 -10
  239. package/esm2015/localize/lib/interfaces/dictionary.interfaces.js +8 -8
  240. package/esm2015/localize/lib/interfaces/functions.interfaces.js +8 -8
  241. package/esm2015/localize/lib/interfaces/handlers.interfaces.js +2 -2
  242. package/esm2015/localize/lib/interfaces/options.interfaces.js +6 -6
  243. package/esm2015/localize/lib/localizations/dutch.localization.js +53 -53
  244. package/esm2015/localize/lib/localizations/english.localization.js +53 -53
  245. package/esm2015/localize/lib/localize.dictionary.js +137 -137
  246. package/esm2015/localize/lib/localize.module.js +69 -69
  247. package/esm2015/localize/lib/localize.pipe.js +49 -49
  248. package/esm2015/localize/lib/localize.service.js +282 -282
  249. package/esm2015/localize/lib/views/localize-string/localize-string.component.js +99 -99
  250. package/esm2015/localize/lib/views/localize-template-or-string.directive.js +28 -28
  251. package/esm2015/localize/lib/views/localize-template.directive.js +21 -21
  252. package/esm2015/localize/public_api.js +18 -18
  253. package/esm2015/notifications/bravobit-bb-foundation-notifications.js +4 -4
  254. package/esm2015/notifications/lib/notifications-item/notifications-item.component.js +108 -108
  255. package/esm2015/notifications/lib/notifications-list/notifications-list.component.js +56 -56
  256. package/esm2015/notifications/lib/notifications.animations.js +28 -28
  257. package/esm2015/notifications/lib/notifications.injector.js +18 -18
  258. package/esm2015/notifications/lib/notifications.interfaces.js +20 -20
  259. package/esm2015/notifications/lib/notifications.module.js +31 -31
  260. package/esm2015/notifications/lib/notifications.service.js +145 -145
  261. package/esm2015/notifications/public_api.js +4 -4
  262. package/esm2015/public_api.js +30 -30
  263. package/esm2015/recaptcha/bravobit-bb-foundation-recaptcha.js +4 -4
  264. package/esm2015/recaptcha/lib/recaptcha/recaptcha.component.js +199 -199
  265. package/esm2015/recaptcha/lib/recaptcha-loader.service.js +93 -93
  266. package/esm2015/recaptcha/lib/recaptcha.interface.js +3 -3
  267. package/esm2015/recaptcha/lib/recaptcha.module.js +27 -27
  268. package/esm2015/recaptcha/public_api.js +5 -5
  269. package/esm2015/rxjs/bravobit-bb-foundation-rxjs.js +4 -4
  270. package/esm2015/rxjs/lib/operators/combine-latest-map.operator.js +7 -7
  271. package/esm2015/rxjs/lib/operators/filter-nil.operator.js +5 -5
  272. package/esm2015/rxjs/public_api.js +3 -3
  273. package/esm2015/storage/bravobit-bb-foundation-storage.js +4 -4
  274. package/esm2015/storage/lib/interfaces/attributes.interface.js +2 -2
  275. package/esm2015/storage/lib/interfaces/memory.interface.js +2 -2
  276. package/esm2015/storage/lib/interfaces/strategy.interface.js +2 -2
  277. package/esm2015/storage/lib/storage.service.js +111 -111
  278. package/esm2015/storage/lib/strategies/cookie-storage.strategy.js +143 -143
  279. package/esm2015/storage/lib/strategies/memory-storage.strategy.js +56 -56
  280. package/esm2015/storage/lib/strategies/polyfill-storage.strategy.js +102 -102
  281. package/esm2015/storage/public_api.js +8 -8
  282. package/esm2015/table/bravobit-bb-foundation-table.js +4 -4
  283. package/esm2015/table/lib/components/table/table.component.js +183 -183
  284. package/esm2015/table/lib/components/table-cell/table-cell.component.js +19 -19
  285. package/esm2015/table/lib/components/table-header-cell/table-header-cell.component.js +141 -141
  286. package/esm2015/table/lib/components/table-pager/table-pager.component.js +146 -146
  287. package/esm2015/table/lib/data/datasource.data.js +32 -32
  288. package/esm2015/table/lib/data/generic.data.js +73 -73
  289. package/esm2015/table/lib/interfaces/datasource.interface.js +2 -2
  290. package/esm2015/table/lib/interfaces/table.interfaces.js +2 -2
  291. package/esm2015/table/lib/table.module.js +39 -39
  292. package/esm2015/table/public_api.js +10 -10
  293. package/fesm2015/bravobit-bb-foundation-auth.js +915 -915
  294. package/fesm2015/bravobit-bb-foundation-auth.js.map +1 -1
  295. package/fesm2015/bravobit-bb-foundation-collections.js +463 -0
  296. package/fesm2015/bravobit-bb-foundation-collections.js.map +1 -0
  297. package/fesm2015/bravobit-bb-foundation-dashboard.js +434 -434
  298. package/fesm2015/bravobit-bb-foundation-dashboard.js.map +1 -1
  299. package/fesm2015/bravobit-bb-foundation-dialog.js +603 -603
  300. package/fesm2015/bravobit-bb-foundation-dialog.js.map +1 -1
  301. package/fesm2015/bravobit-bb-foundation-elements.js +2076 -2076
  302. package/fesm2015/bravobit-bb-foundation-elements.js.map +1 -1
  303. package/fesm2015/bravobit-bb-foundation-http.js +154 -154
  304. package/fesm2015/bravobit-bb-foundation-http.js.map +1 -1
  305. package/fesm2015/bravobit-bb-foundation-localize.js +796 -796
  306. package/fesm2015/bravobit-bb-foundation-localize.js.map +1 -1
  307. package/fesm2015/bravobit-bb-foundation-notifications.js +364 -364
  308. package/fesm2015/bravobit-bb-foundation-notifications.js.map +1 -1
  309. package/fesm2015/bravobit-bb-foundation-recaptcha.js +297 -297
  310. package/fesm2015/bravobit-bb-foundation-recaptcha.js.map +1 -1
  311. package/fesm2015/bravobit-bb-foundation-rxjs.js +7 -7
  312. package/fesm2015/bravobit-bb-foundation-rxjs.js.map +1 -1
  313. package/fesm2015/bravobit-bb-foundation-storage.js +399 -399
  314. package/fesm2015/bravobit-bb-foundation-storage.js.map +1 -1
  315. package/fesm2015/bravobit-bb-foundation-table.js +578 -578
  316. package/fesm2015/bravobit-bb-foundation-table.js.map +1 -1
  317. package/fesm2015/bravobit-bb-foundation.js +851 -851
  318. package/fesm2015/bravobit-bb-foundation.js.map +1 -1
  319. package/http/bravobit-bb-foundation-http.d.ts +5 -5
  320. package/http/lib/classes/http.config.d.ts +9 -9
  321. package/http/lib/classes/http.error.d.ts +7 -7
  322. package/http/lib/http.interfaces.d.ts +12 -12
  323. package/http/lib/http.module.d.ts +15 -15
  324. package/http/lib/interceptors/base-url.interceptor.d.ts +15 -15
  325. package/http/lib/interceptors/error.interceptor.d.ts +11 -11
  326. package/http/public_api.d.ts +6 -6
  327. package/lib/core/coercions/boolean-coercion.d.ts +1 -1
  328. package/lib/core/miscellaneous/regex.d.ts +4 -4
  329. package/lib/core/miscellaneous/validator.d.ts +13 -13
  330. package/lib/core/mixins/can-disable.d.ts +6 -6
  331. package/lib/core/mixins/can-hide-errors.d.ts +6 -6
  332. package/lib/core/mixins/can-load.d.ts +6 -6
  333. package/lib/core/mixins/constructor.d.ts +1 -1
  334. package/lib/core/mixins/has-error.d.ts +6 -6
  335. package/lib/core/mixins/is-focused.d.ts +6 -6
  336. package/lib/core/mixins/is-grouped.d.ts +6 -6
  337. package/lib/core/mixins/is-readonly.d.ts +6 -6
  338. package/lib/core/mixins/is-required.d.ts +6 -6
  339. package/lib/core/services/clipboard.service.d.ts +18 -18
  340. package/lib/core/services/exif.service.d.ts +15 -15
  341. package/lib/core/services/file-loader.service.d.ts +13 -13
  342. package/lib/core/services/image-converter.service.d.ts +21 -21
  343. package/lib/core/services/languages.service.d.ts +16 -16
  344. package/lib/core/services/network.service.d.ts +14 -14
  345. package/lib/core/services/patch.service.d.ts +16 -16
  346. package/lib/core/services/platform.service.d.ts +18 -18
  347. package/lib/core/tokens/accept-language.token.d.ts +2 -2
  348. package/lib/core/tokens/base-url.token.d.ts +2 -2
  349. package/lib/core/tokens/cookie.token.d.ts +2 -2
  350. package/lib/core/tokens/location.token.d.ts +2 -2
  351. package/lib/core/tokens/navigator.token.d.ts +2 -2
  352. package/lib/core/tokens/window.token.d.ts +2 -2
  353. package/localize/bravobit-bb-foundation-localize.d.ts +5 -5
  354. package/localize/lib/functions/date.function.d.ts +5 -5
  355. package/localize/lib/functions/lowercase.function.d.ts +5 -5
  356. package/localize/lib/functions/uppercase.function.d.ts +5 -5
  357. package/localize/lib/handlers/missing.handler.d.ts +6 -6
  358. package/localize/lib/interfaces/config.interfaces.d.ts +8 -8
  359. package/localize/lib/interfaces/dictionary.interfaces.d.ts +12 -12
  360. package/localize/lib/interfaces/functions.interfaces.d.ts +9 -9
  361. package/localize/lib/interfaces/handlers.interfaces.d.ts +6 -6
  362. package/localize/lib/interfaces/options.interfaces.d.ts +10 -10
  363. package/localize/lib/localizations/dutch.localization.d.ts +51 -51
  364. package/localize/lib/localizations/english.localization.d.ts +51 -51
  365. package/localize/lib/localize.dictionary.d.ts +24 -24
  366. package/localize/lib/localize.module.d.ts +18 -18
  367. package/localize/lib/localize.pipe.d.ts +12 -12
  368. package/localize/lib/localize.service.d.ts +51 -51
  369. package/localize/lib/views/localize-string/localize-string.component.d.ts +23 -23
  370. package/localize/lib/views/localize-template-or-string.directive.d.ts +10 -10
  371. package/localize/lib/views/localize-template.directive.d.ts +9 -9
  372. package/localize/public_api.d.ts +17 -17
  373. package/notifications/bravobit-bb-foundation-notifications.d.ts +5 -5
  374. package/notifications/lib/notifications-item/notifications-item.component.d.ts +34 -34
  375. package/notifications/lib/notifications-list/notifications-list.component.d.ts +16 -16
  376. package/notifications/lib/notifications.animations.d.ts +1 -1
  377. package/notifications/lib/notifications.injector.d.ts +8 -8
  378. package/notifications/lib/notifications.interfaces.d.ts +49 -49
  379. package/notifications/lib/notifications.module.d.ts +13 -13
  380. package/notifications/lib/notifications.service.d.ts +34 -34
  381. package/notifications/public_api.d.ts +3 -3
  382. package/package.json +5 -5
  383. package/public_api.d.ts +26 -26
  384. package/recaptcha/bravobit-bb-foundation-recaptcha.d.ts +5 -5
  385. package/recaptcha/lib/recaptcha/recaptcha.component.d.ts +47 -47
  386. package/recaptcha/lib/recaptcha-loader.service.d.ts +22 -22
  387. package/recaptcha/lib/recaptcha.interface.d.ts +14 -14
  388. package/recaptcha/lib/recaptcha.module.d.ts +10 -16
  389. package/recaptcha/public_api.d.ts +4 -4
  390. package/rxjs/bravobit-bb-foundation-rxjs.d.ts +5 -5
  391. package/rxjs/lib/operators/combine-latest-map.operator.d.ts +8 -8
  392. package/rxjs/lib/operators/filter-nil.operator.d.ts +1 -1
  393. package/rxjs/public_api.d.ts +2 -2
  394. package/storage/bravobit-bb-foundation-storage.d.ts +5 -5
  395. package/storage/lib/interfaces/attributes.interface.d.ts +13 -13
  396. package/storage/lib/interfaces/memory.interface.d.ts +7 -7
  397. package/storage/lib/interfaces/strategy.interface.d.ts +17 -17
  398. package/storage/lib/storage.service.d.ts +26 -26
  399. package/storage/lib/strategies/cookie-storage.strategy.d.ts +20 -20
  400. package/storage/lib/strategies/memory-storage.strategy.d.ts +11 -11
  401. package/storage/lib/strategies/polyfill-storage.strategy.d.ts +15 -15
  402. package/storage/public_api.d.ts +7 -7
  403. package/table/bravobit-bb-foundation-table.d.ts +5 -5
  404. package/table/lib/components/table/table.component.d.ts +48 -48
  405. package/table/lib/components/table-cell/table-cell.component.d.ts +5 -5
  406. package/table/lib/components/table-header-cell/table-header-cell.component.d.ts +29 -29
  407. package/table/lib/components/table-pager/table-pager.component.d.ts +41 -41
  408. package/table/lib/data/datasource.data.d.ts +14 -14
  409. package/table/lib/data/generic.data.d.ts +23 -23
  410. package/table/lib/interfaces/datasource.interface.d.ts +17 -17
  411. package/table/lib/interfaces/table.interfaces.d.ts +1 -1
  412. package/table/lib/table.module.d.ts +14 -14
  413. package/table/public_api.d.ts +9 -9
@@ -1,299 +1,299 @@
1
- import { __awaiter, __rest } from "tslib";
2
- import { HttpContext } from '@angular/common/http';
3
- import { makeStateKey } from '@angular/platform-browser';
4
- import { USE_AUTHORIZATION } from './tokens/use-authorization.token';
5
- import { AuthVerifyProvider } from './providers/verify.provider';
6
- import { Injectable, Optional } from '@angular/core';
7
- import { AuthEmailProvider } from './providers/email.provider';
8
- import { map, take, tap } from 'rxjs/operators';
9
- import { AuthSession } from './auth.session';
10
- import { Router } from '@angular/router';
11
- import { of } from 'rxjs';
12
- import * as i0 from "@angular/core";
13
- import * as i1 from "@bravobit/bb-foundation/storage";
14
- import * as i2 from "./helpers/mapper.helper";
15
- import * as i3 from "@bravobit/bb-foundation";
16
- import * as i4 from "@angular/common/http";
17
- import * as i5 from "./interfaces/config.interface";
18
- import * as i6 from "@angular/platform-browser";
19
- import * as i7 from "@bravobit/bb-foundation/http";
20
- export class Auth {
21
- constructor(_storage, _mapper, _injector, _platform, _httpClient, _config, _state, _httpConfig) {
22
- var _a, _b, _c;
23
- this._storage = _storage;
24
- this._mapper = _mapper;
25
- this._injector = _injector;
26
- this._platform = _platform;
27
- this._httpClient = _httpClient;
28
- this._config = _config;
29
- this._state = _state;
30
- this._httpConfig = _httpConfig;
31
- // Readonly data.
32
- this._authStateKey = makeStateKey(`bbAuthStateKey`);
33
- this._httpAlias = (_b = (_a = this._httpConfig) === null || _a === void 0 ? void 0 : _a.defaultAlias) !== null && _b !== void 0 ? _b : null;
34
- this._refreshHandler = null;
35
- // Starting the new session.
36
- this.session = new AuthSession({
37
- id: (_c = this._config) === null || _c === void 0 ? void 0 : _c.applicationId,
38
- storage: this._storage.select(["cookie" /* Cookie */, "local" /* Local */])
39
- });
40
- this.user = this.session.user;
41
- }
42
- initialize() {
43
- return () => __awaiter(this, void 0, void 0, function* () {
44
- var _a, _b, _c, _d, _e, _f;
45
- // Check if the app should bootstrap the authentication.
46
- const shouldBootstrap = (_b = (_a = this._config) === null || _a === void 0 ? void 0 : _a.bootstrap) !== null && _b !== void 0 ? _b : true;
47
- if (!shouldBootstrap) {
48
- return this.handleAutoRefreshing();
49
- }
50
- // Only retrieve from the server when we are actually authenticated.
51
- if (!this.session.authenticated()) {
52
- return;
53
- }
54
- // Get the key from the server state.
55
- if (this._state && ((_c = this._state) === null || _c === void 0 ? void 0 : _c.hasKey(this._authStateKey))) {
56
- const user = (_e = (_d = this._state) === null || _d === void 0 ? void 0 : _d.get(this._authStateKey, null)) !== null && _e !== void 0 ? _e : null;
57
- return this.session.setUser(user);
58
- }
59
- // Try to fetch the user from the server.
60
- const user = yield this.me().pipe(take(1)).toPromise();
61
- // Set the state if exists.
62
- if (this._state) {
63
- (_f = this._state) === null || _f === void 0 ? void 0 : _f.set(this._authStateKey, user !== null && user !== void 0 ? user : null);
64
- }
65
- // Save the user in the storage and handle auto refreshing.
66
- this.session.setUser(user);
67
- this.handleAutoRefreshing();
68
- });
69
- }
70
- me() {
71
- const url = this.getUrl('auth/me');
72
- return this._httpClient.get(url);
73
- }
74
- signIn(provider, as) {
75
- var _a, _b;
76
- return __awaiter(this, void 0, void 0, function* () {
77
- const _c = yield provider.authenticate(this._httpClient), { accessToken, refreshToken, user } = _c, result = __rest(_c, ["accessToken", "refreshToken", "user"]);
78
- // Check if the role matches.
79
- if (as && !as.includes(this._mapper.role(user))) {
80
- throw new Error('Invalid role.');
81
- }
82
- // Validate if the provider is one of the available
83
- // providers then return the user object and the provider.
84
- const apiProvider = (_a = result === null || result === void 0 ? void 0 : result.provider) !== null && _a !== void 0 ? _a : null;
85
- const apiVerifyToken = (_b = result === null || result === void 0 ? void 0 : result.verifyToken) !== null && _b !== void 0 ? _b : null;
86
- const availableProviders = ['email', 'sms', 'totp'];
87
- if (availableProviders.includes(apiProvider)) {
88
- return { user, provider: apiProvider, verifyToken: apiVerifyToken };
89
- }
90
- // Set the tokens in storage.
91
- this.setTokens(accessToken, refreshToken);
92
- // Set the user in storage.
93
- this.session.setUser(user);
94
- // Return the user.
95
- return { user };
96
- });
97
- }
98
- signInWithEmail(email, password, as) {
99
- return __awaiter(this, void 0, void 0, function* () {
100
- const url = this.getUrl('auth/login');
101
- return this.signIn(new AuthEmailProvider(email, password, url), as);
102
- });
103
- }
104
- signInWithVerifyCode(code, verifyToken) {
105
- return __awaiter(this, void 0, void 0, function* () {
106
- const url = this.getUrl('auth/verify');
107
- return this.signIn(new AuthVerifyProvider(code, verifyToken, url));
108
- });
109
- }
110
- resendVerifyCode(verifyToken) {
111
- return __awaiter(this, void 0, void 0, function* () {
112
- const url = this.getUrl('auth/resend');
113
- return yield this._httpClient.post(url, {
114
- verify_token: verifyToken
115
- }).toPromise();
116
- });
117
- }
118
- register(data, options) {
119
- return __awaiter(this, void 0, void 0, function* () {
120
- // Execute API call.
121
- const url = this.getUrl('auth/register');
122
- const result = yield this._httpClient
123
- .post(url, data, options)
124
- .toPromise();
125
- // Map to the correct response.
126
- const { accessToken, refreshToken, user } = this._mapper.toRegister(result);
127
- // Set the tokens in storage.
128
- this.setTokens(accessToken, refreshToken);
129
- // Set the user in storage.
130
- this.session.setUser(user);
131
- // Return the user.
132
- return user;
133
- });
134
- }
135
- logout() {
136
- // If we don't have a refresh token just clear the session.
137
- // Note: We do this because else we try to invalidate
138
- // an "undefined" refresh token.
139
- const refreshToken = this.session.refreshToken;
140
- if (!refreshToken) {
141
- return this.session.clear();
142
- }
143
- // We do have a refresh token, so try to
144
- // invalidate it in the backend.
145
- try {
146
- const url = this.getUrl('auth/logout');
147
- this._httpClient.get(url, {
148
- headers: { Authorization: refreshToken }
149
- }).toPromise().then(_ => _);
150
- }
151
- catch (_a) {
152
- // Do nothing because the tokens will be deleted anyways from the session.
153
- }
154
- // Delete the tokens from the session.
155
- return this.session.clear();
156
- }
157
- refresh() {
158
- var _a, _b;
159
- // If the refresh token does
160
- // not exist just return an observable of null.
161
- const refreshToken = this.session.refreshToken;
162
- if (!refreshToken) {
163
- return of(null);
164
- }
165
- // Perform the refresh call.
166
- const scheme = (_b = (_a = this._config) === null || _a === void 0 ? void 0 : _a.scheme) !== null && _b !== void 0 ? _b : 'Bearer';
167
- const url = this.getUrl('auth/refresh');
168
- const context = new HttpContext()
169
- .set(USE_AUTHORIZATION, false);
170
- return this._httpClient.get(url, {
171
- headers: { Authorization: `${scheme} ${refreshToken}` },
172
- context: context
173
- }).pipe(map(data => this._mapper.toRefresh(data)), tap(({ accessToken, refreshToken }) => this.setTokens(accessToken, refreshToken)), map(({ accessToken }) => accessToken));
174
- }
175
- requestPassword(email, extraParams = {}) {
176
- return __awaiter(this, void 0, void 0, function* () {
177
- const url = this.getUrl('auth/reset');
178
- return yield this._httpClient
179
- .post(url, Object.assign(Object.assign({}, extraParams), { email }))
180
- .toPromise();
181
- });
182
- }
183
- resetPassword(token, newPassword, extraParams = {}) {
184
- return __awaiter(this, void 0, void 0, function* () {
185
- const url = this.getUrl('auth/reset-password');
186
- return yield this._httpClient
187
- .post(url, Object.assign(Object.assign({}, extraParams), { token, password: newPassword }))
188
- .toPromise();
189
- });
190
- }
191
- guard(type, redirectUrl) {
192
- var _a, _b, _c, _d, _e, _f;
193
- let newUrl = null;
194
- // Get the correct new url.
195
- switch (type) {
196
- case 'authenticated':
197
- newUrl = (_b = (_a = this._config) === null || _a === void 0 ? void 0 : _a.loggedInUrl) !== null && _b !== void 0 ? _b : null;
198
- break;
199
- case 'unauthenticated':
200
- newUrl = (_d = (_c = this._config) === null || _c === void 0 ? void 0 : _c.redirectUrl) !== null && _d !== void 0 ? _d : null;
201
- break;
202
- }
203
- // Append a redirect url if the user is deemed
204
- // unauthenticated.
205
- if (type === 'unauthenticated') {
206
- const setRedirectOnFailedAuth = (_f = (_e = this._config) === null || _e === void 0 ? void 0 : _e.setRedirectOnFailedAuth) !== null && _f !== void 0 ? _f : true;
207
- if (setRedirectOnFailedAuth && redirectUrl && newUrl) {
208
- newUrl += `?redirectUrl=${redirectUrl}`;
209
- }
210
- }
211
- // Parse the url if it exists.
212
- if (this.router && newUrl) {
213
- return this.router.parseUrl(newUrl);
214
- }
215
- // Return false if the user is not allowed.
216
- return false;
217
- }
218
- clearAndRedirect() {
219
- var _a, _b;
220
- // 1. Delete the tokens from the session.
221
- this.session.clear();
222
- // 2. Compose the route url.
223
- const redirectUrl = (_b = (_a = this._config) === null || _a === void 0 ? void 0 : _a.redirectUrl) !== null && _b !== void 0 ? _b : null;
224
- // 3. Route back if the user provided a redirect url.
225
- if (this.router && redirectUrl) {
226
- this.router.navigate([redirectUrl]).then(_ => _);
227
- }
228
- }
229
- setTokens(accessToken, refreshToken) {
230
- // Set the tokens in our session.
231
- this.session.setTokens(accessToken, refreshToken);
232
- // We need to update the auto refresh of the refresh token.
233
- this.handleAutoRefreshing();
234
- }
235
- handleAutoRefreshing() {
236
- var _a, _b, _c, _d;
237
- const shouldAutoRefresh = (_b = (_a = this._config) === null || _a === void 0 ? void 0 : _a.autoRefresh) !== null && _b !== void 0 ? _b : false;
238
- if (!shouldAutoRefresh) {
239
- return;
240
- }
241
- const expiresAt = (_d = (_c = this.session.refreshTokenPayload) === null || _c === void 0 ? void 0 : _c.expiresAt) !== null && _d !== void 0 ? _d : null;
242
- if (expiresAt === null || !this._platform.isBrowser) {
243
- return;
244
- }
245
- const differenceInMilliseconds = expiresAt.getTime() - Date.now();
246
- const offsetInMilliseconds = 10000; // 10 seconds.
247
- // We want to start the refresh 10 seconds before it expires.
248
- const actualTiming = differenceInMilliseconds - offsetInMilliseconds;
249
- if (actualTiming <= 0) {
250
- return;
251
- }
252
- // We need to cap the timings because if
253
- // we get large numbers it might cause unwanted results.
254
- const maxTiming = 1000 * 60 * 60 * 24; // 24 hours.
255
- const cappedTiming = Math.max(1, Math.min(actualTiming, maxTiming));
256
- try {
257
- if (this._refreshHandler !== null) {
258
- clearTimeout === null || clearTimeout === void 0 ? void 0 : clearTimeout(this._refreshHandler);
259
- this._refreshHandler = null;
260
- }
261
- this._refreshHandler = setTimeout === null || setTimeout === void 0 ? void 0 : setTimeout(() => this.autoRefresh(), cappedTiming);
262
- }
263
- catch (_e) {
264
- // Just ignore it.
265
- }
266
- }
267
- autoRefresh() {
268
- return __awaiter(this, void 0, void 0, function* () {
269
- try {
270
- // We just need to wait for it to refresh.
271
- yield this.refresh().toPromise();
272
- }
273
- catch (_a) {
274
- // Something went wrong refreshing, we need to clear.
275
- this.clearAndRedirect();
276
- }
277
- });
278
- }
279
- get router() {
280
- return this._injector.get(Router);
281
- }
282
- getUrl(endpoint) {
283
- return [this._httpAlias, endpoint]
284
- .filter(item => !!item)
285
- .join('/');
286
- }
287
- }
288
- Auth.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.1", ngImport: i0, type: Auth, deps: [{ token: i1.Storage }, { token: i2.AuthMapper }, { token: i0.Injector }, { token: i3.Platform }, { token: i4.HttpClient }, { token: i5.AuthConfig, optional: true }, { token: i6.TransferState, optional: true }, { token: i7.HttpConfig, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
289
- Auth.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.1.1", ngImport: i0, type: Auth });
290
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.1", ngImport: i0, type: Auth, decorators: [{
291
- type: Injectable
292
- }], ctorParameters: function () { return [{ type: i1.Storage }, { type: i2.AuthMapper }, { type: i0.Injector }, { type: i3.Platform }, { type: i4.HttpClient }, { type: i5.AuthConfig, decorators: [{
293
- type: Optional
294
- }] }, { type: i6.TransferState, decorators: [{
295
- type: Optional
296
- }] }, { type: i7.HttpConfig, decorators: [{
297
- type: Optional
298
- }] }]; } });
299
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYmItZm91bmRhdGlvbi9hdXRoL3NyYy9saWIvYXV0aC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQWEsV0FBVyxFQUEwQixNQUFNLHNCQUFzQixDQUFDO0FBRXRGLE9BQU8sRUFBQyxZQUFZLEVBQTBCLE1BQU0sMkJBQTJCLENBQUM7QUFFaEYsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sa0NBQWtDLENBQUM7QUFDbkUsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sNkJBQTZCLENBQUM7QUFDL0QsT0FBTyxFQUFDLFVBQVUsRUFBWSxRQUFRLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDN0QsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFLN0QsT0FBTyxFQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUN2QyxPQUFPLEVBQWEsRUFBRSxFQUFDLE1BQU0sTUFBTSxDQUFDOzs7Ozs7Ozs7QUFHcEMsTUFBTSxPQUFPLElBQUk7SUFXYixZQUFvQixRQUFpQixFQUNqQixPQUFtQixFQUNuQixTQUFtQixFQUNuQixTQUFtQixFQUNuQixXQUF1QixFQUNYLE9BQW9CLEVBQ3BCLE1BQXNCLEVBQ3RCLFdBQXdCOztRQVBwQyxhQUFRLEdBQVIsUUFBUSxDQUFTO1FBQ2pCLFlBQU8sR0FBUCxPQUFPLENBQVk7UUFDbkIsY0FBUyxHQUFULFNBQVMsQ0FBVTtRQUNuQixjQUFTLEdBQVQsU0FBUyxDQUFVO1FBQ25CLGdCQUFXLEdBQVgsV0FBVyxDQUFZO1FBQ1gsWUFBTyxHQUFQLE9B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QUNwRSxJQUFJO1lBQ0EsSUFBSSxJQUFJLENBQUMsZUFBZSxLQUFLLElBQUksRUFBRTtnQkFDL0IsWUFBWSxhQUFaLFlBQVksdUJBQVosWUFBWSxDQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztnQkFDckMsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7YUFDL0I7WUFDRCxJQUFJLENBQUMsZUFBZSxHQUFHLFVBQVUsYUFBVixVQUFVLHVCQUFWLFVBQVUsQ0FBRyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUUsWUFBWSxDQUFDLENBQUM7U0FDL0U7UUFBQyxXQUFNO1lBQ0osa0JBQWtCO1NBQ3JCO0lBQ0wsQ0FBQztJQUVhLFdBQVc7O1lBQ3JCLElBQUk7Z0JBQ0EsMENBQTBDO2dCQUMxQyxNQUFNLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQzthQUNwQztZQUFDLFdBQU07Z0JBQ0oscURBQXFEO2dCQUNyRCxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQzthQUMzQjtRQUNMLENBQUM7S0FBQTtJQUVELElBQVksTUFBTTtRQUNkLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVPLE1BQU0sQ0FBQyxRQUFnQjtRQUMzQixPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUM7YUFDN0IsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQzthQUN0QixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDbkIsQ0FBQzs7aUdBbFRRLElBQUk7cUdBQUosSUFBSTsyRkFBSixJQUFJO2tCQURoQixVQUFVOzswQkFpQk0sUUFBUTs7MEJBQ1IsUUFBUTs7MEJBQ1IsUUFBUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SHR0cENsaWVudCwgSHR0cENvbnRleHQsIEh0dHBIZWFkZXJzLCBIdHRwUGFyYW1zfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7QXV0aFByb3ZpZGVyLCBBdXRoU2lnbkluUmVzcG9uc2V9IGZyb20gJy4vaW50ZXJmYWNlcy9wcm92aWRlci5pbnRlcmZhY2UnO1xyXG5pbXBvcnQge21ha2VTdGF0ZUtleSwgU3RhdGVLZXksIFRyYW5zZmVyU3RhdGV9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xyXG5pbXBvcnQge1N0b3JhZ2UsIFN0b3JhZ2VPcHRpb259IGZyb20gJ0BicmF2b2JpdC9iYi1mb3VuZGF0aW9uL3N0b3JhZ2UnO1xyXG5pbXBvcnQge1VTRV9BVVRIT1JJWkFUSU9OfSBmcm9tICcuL3Rva2Vucy91c2UtYXV0aG9yaXphdGlvbi50b2tlbic7XHJcbmltcG9ydCB7QXV0aFZlcmlmeVByb3ZpZGVyfSBmcm9tICcuL3Byb3ZpZGVycy92ZXJpZnkucHJvdmlkZXInO1xyXG5pbXBvcnQge0luamVjdGFibGUsIEluamVjdG9yLCBPcHRpb25hbH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7QXV0aEVtYWlsUHJvdmlkZXJ9IGZyb20gJy4vcHJvdmlkZXJzL2VtYWlsLnByb3ZpZGVyJztcclxuaW1wb3J0IHtBdXRoQ29uZmlnfSBmcm9tICcuL2ludGVyZmFjZXMvY29uZmlnLmludGVyZmFjZSc7XHJcbmltcG9ydCB7SHR0cENvbmZpZ30gZnJvbSAnQGJyYXZvYml0L2JiLWZvdW5kYXRpb24vaHR0cCc7XHJcbmltcG9ydCB7QXV0aE1hcHBlcn0gZnJvbSAnLi9oZWxwZXJzL21hcHBlci5oZWxwZXInO1xyXG5pbXBvcnQge1BsYXRmb3JtfSBmcm9tICdAYnJhdm9iaXQvYmItZm91bmRhdGlvbic7XHJcbmltcG9ydCB7bWFwLCB0YWtlLCB0YXB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHtBdXRoU2Vzc2lvbn0gZnJvbSAnLi9hdXRoLnNlc3Npb24nO1xyXG5pbXBvcnQge1JvdXRlcn0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuaW1wb3J0IHtPYnNlcnZhYmxlLCBvZn0gZnJvbSAncnhqcyc7XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBBdXRoIHtcclxuXHJcbiAgICAvLyBSZWFkb25seSBkYXRhLlxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfYXV0aFN0YXRlS2V5OiBTdGF0ZUtleTxhbnkgfCBudWxsPiA9IG1ha2VTdGF0ZUtleShgYmJBdXRoU3RhdGVLZXlgKTtcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2h0dHBBbGlhczogc3RyaW5nIHwgbnVsbCA9IHRoaXMuX2h0dHBDb25maWc/LmRlZmF1bHRBbGlhcyA/PyBudWxsO1xyXG5cclxuICAgIHJlYWRvbmx5IHNlc3Npb246IEF1dGhTZXNzaW9uO1xyXG4gICAgcmVhZG9ubHkgdXNlcjogT2JzZXJ2YWJsZTxhbnkgfCBudWxsPjtcclxuXHJcbiAgICBwcml2YXRlIF9yZWZyZXNoSGFuZGxlcjogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBfc3RvcmFnZTogU3RvcmFnZSxcclxuICAgICAgICAgICAgICAgIHByaXZhdGUgX21hcHBlcjogQXV0aE1hcHBlcixcclxuICAgICAgICAgICAgICAgIHByaXZhdGUgX2luamVjdG9yOiBJbmplY3RvcixcclxuICAgICAgICAgICAgICAgIHByaXZhdGUgX3BsYXRmb3JtOiBQbGF0Zm9ybSxcclxuICAgICAgICAgICAgICAgIHByaXZhdGUgX2h0dHBDbGllbnQ6IEh0dHBDbGllbnQsXHJcbiAgICAgICAgICAgICAgICBAT3B0aW9uYWwoKSBwcml2YXRlIF9jb25maWc/OiBBdXRoQ29uZmlnLFxyXG4gICAgICAgICAgICAgICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBfc3RhdGU/OiBUcmFuc2ZlclN0YXRlLFxyXG4gICAgICAgICAgICAgICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBfaHR0cENvbmZpZz86IEh0dHBDb25maWcpIHtcclxuICAgICAgICAvLyBTdGFydGluZyB0aGUgbmV3IHNlc3Npb24uXHJcbiAgICAgICAgdGhpcy5zZXNzaW9uID0gbmV3IEF1dGhTZXNzaW9uKHtcclxuICAgICAgICAgICAgaWQ6IHRoaXMuX2NvbmZpZz8uYXBwbGljYXRpb25JZCxcclxuICAgICAgICAgICAgc3RvcmFnZTogdGhpcy5fc3RvcmFnZS5zZWxlY3QoW1N0b3JhZ2VPcHRpb24uQ29va2llLCBTdG9yYWdlT3B0aW9uLkxvY2FsXSlcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLnVzZXIgPSB0aGlzLnNlc3Npb24udXNlcjtcclxuICAgIH1cclxuXHJcbiAgICBpbml0aWFsaXplKCkge1xyXG4gICAgICAgIHJldHVybiBhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBhcHAgc2hvdWxkIGJvb3RzdHJhcCB0aGUgYXV0aGVudGljYXRpb24uXHJcbiAgICAgICAgICAgIGNvbnN0IHNob3VsZEJvb3RzdHJhcCA9IHRoaXMuX2NvbmZpZz8uYm9vdHN0cmFwID8/IHRydWU7XHJcbiAgICAgICAgICAgIGlmICghc2hvdWxkQm9vdHN0cmFwKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVBdXRvUmVmcmVzaGluZygpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBPbmx5IHJldHJpZXZlIGZyb20gdGhlIHNlcnZlciB3aGVuIHdlIGFyZSBhY3R1YWxseSBhdXRoZW50aWNhdGVkLlxyXG4gICAgICAgICAgICBpZiAoIXRoaXMuc2Vzc2lvbi5hdXRoZW50aWNhdGVkKCkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gR2V0IHRoZSBrZXkgZnJvbSB0aGUgc2VydmVyIHN0YXRlLlxyXG4gICAgICAgICAgICBpZiAodGhpcy5fc3RhdGUgJiYgdGhpcy5fc3RhdGU/Lmhhc0tleSh0aGlzLl9hdXRoU3RhdGVLZXkpKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB1c2VyID0gdGhpcy5fc3RhdGU/LmdldCh0aGlzLl9hdXRoU3RhdGVLZXksIG51bGwpID8/IG51bGw7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zZXNzaW9uLnNldFVzZXIodXNlcik7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIFRyeSB0byBmZXRjaCB0aGUgdXNlciBmcm9tIHRoZSBzZXJ2ZXIuXHJcbiAgICAgICAgICAgIGNvbnN0IHVzZXIgPSBhd2FpdCB0aGlzLm1lKCkucGlwZShcclxuICAgICAgICAgICAgICAgIHRha2UoMSlcclxuICAgICAgICAgICAgKS50b1Byb21pc2UoKTtcclxuXHJcbiAgICAgICAgICAgIC8vIFNldCB0aGUgc3RhdGUgaWYgZXhpc3RzLlxyXG4gICAgICAgICAgICBpZiAodGhpcy5fc3RhdGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3N0YXRlPy5zZXQ8YW55Pih0aGlzLl9hdXRoU3RhdGVLZXksIHVzZXIgPz8gbnVsbCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIFNhdmUgdGhlIHVzZXIgaW4gdGhlIHN0b3JhZ2UgYW5kIGhhbmRsZSBhdXRvIHJlZnJlc2hpbmcuXHJcbiAgICAgICAgICAgIHRoaXMuc2Vzc2lvbi5zZXRVc2VyKHVzZXIpO1xyXG4gICAgICAgICAgICB0aGlzLmhhbmRsZUF1dG9SZWZyZXNoaW5nKCk7XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBtZTxUID0gYW55PigpIHtcclxuICAgICAgICBjb25zdCB1cmwgPSB0aGlzLmdldFVybCgnYXV0aC9tZScpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9odHRwQ2xpZW50LmdldDxUPih1cmwpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHNpZ25Jbihwcm92aWRlcjogQXV0aFByb3ZpZGVyLCBhcz86IHN0cmluZ1tdKSB7XHJcbiAgICAgICAgY29uc3Qge2FjY2Vzc1Rva2VuLCByZWZyZXNoVG9rZW4sIHVzZXIsIC4uLnJlc3VsdH0gPSBhd2FpdCBwcm92aWRlci5hdXRoZW50aWNhdGUodGhpcy5faHR0cENsaWVudCk7XHJcblxyXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSByb2xlIG1hdGNoZXMuXHJcbiAgICAgICAgaWYgKGFzICYmICFhcy5pbmNsdWRlcyh0aGlzLl9tYXBwZXIucm9sZSh1c2VyKSkpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHJvbGUuJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBWYWxpZGF0ZSBpZiB0aGUgcHJvdmlkZXIgaXMgb25lIG9mIHRoZSBhdmFpbGFibGVcclxuICAgICAgICAvLyBwcm92aWRlcnMgdGhlbiByZXR1cm4gdGhlIHVzZXIgb2JqZWN0IGFuZCB0aGUgcHJvdmlkZXIuXHJcbiAgICAgICAgY29uc3QgYXBpUHJvdmlkZXIgPSByZXN1bHQ/LnByb3ZpZGVyID8/IG51bGw7XHJcbiAgICAgICAgY29uc3QgYXBpVmVyaWZ5VG9rZW4gPSByZXN1bHQ/LnZlcmlmeVRva2VuID8/IG51bGw7XHJcbiAgICAgICAgY29uc3QgYXZhaWxhYmxlUHJvdmlkZXJzID0gWydlbWFpbCcsICdzbXMnLCAndG90cCddO1xyXG4gICAgICAgIGlmIChhdmFpbGFibGVQcm92aWRlcnMuaW5jbHVkZXMoYXBpUHJvdmlkZXIpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiA8QXV0aFNpZ25JblJlc3BvbnNlPnt1c2VyLCBwcm92aWRlcjogYXBpUHJvdmlkZXIsIHZlcmlmeVRva2VuOiBhcGlWZXJpZnlUb2tlbn07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBTZXQgdGhlIHRva2VucyBpbiBzdG9yYWdlLlxyXG4gICAgICAgIHRoaXMuc2V0VG9rZW5zKGFjY2Vzc1Rva2VuLCByZWZyZXNoVG9rZW4pO1xyXG5cclxuICAgICAgICAvLyBTZXQgdGhlIHVzZXIgaW4gc3RvcmFnZS5cclxuICAgICAgICB0aGlzLnNlc3Npb24uc2V0VXNlcih1c2VyKTtcclxuXHJcbiAgICAgICAgLy8gUmV0dXJuIHRoZSB1c2VyLlxyXG4gICAgICAgIHJldHVybiA8QXV0aFNpZ25JblJlc3BvbnNlPnt1c2VyfTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBzaWduSW5XaXRoRW1haWwoZW1haWw6IHN0cmluZywgcGFzc3dvcmQ6IHN0cmluZywgYXM/OiBzdHJpbmdbXSkge1xyXG4gICAgICAgIGNvbnN0IHVybCA9IHRoaXMuZ2V0VXJsKCdhdXRoL2xvZ2luJyk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc2lnbkluKG5ldyBBdXRoRW1haWxQcm92aWRlcihlbWFpbCwgcGFzc3dvcmQsIHVybCksIGFzKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBzaWduSW5XaXRoVmVyaWZ5Q29kZShjb2RlOiBzdHJpbmcsIHZlcmlmeVRva2VuOiBzdHJpbmcpIHtcclxuICAgICAgICBjb25zdCB1cmwgPSB0aGlzLmdldFVybCgnYXV0aC92ZXJpZnknKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5zaWduSW4obmV3IEF1dGhWZXJpZnlQcm92aWRlcihjb2RlLCB2ZXJpZnlUb2tlbiwgdXJsKSk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgcmVzZW5kVmVyaWZ5Q29kZSh2ZXJpZnlUb2tlbjogc3RyaW5nKSB7XHJcbiAgICAgICAgY29uc3QgdXJsID0gdGhpcy5nZXRVcmwoJ2F1dGgvcmVzZW5kJyk7XHJcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX2h0dHBDbGllbnQucG9zdCh1cmwsIHtcclxuICAgICAgICAgICAgdmVyaWZ5X3Rva2VuOiB2ZXJpZnlUb2tlblxyXG4gICAgICAgIH0pLnRvUHJvbWlzZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHJlZ2lzdGVyPFQgPSBhbnk+KGRhdGE6IGFueSwgb3B0aW9ucz86IHtcclxuICAgICAgICBoZWFkZXJzPzogSHR0cEhlYWRlcnMgfCB7XHJcbiAgICAgICAgICAgIFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB8IHN0cmluZ1tdO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgcGFyYW1zPzogSHR0cFBhcmFtcyB8IHtcclxuICAgICAgICAgICAgW3BhcmFtOiBzdHJpbmddOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgUmVhZG9ubHlBcnJheTxzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuPjtcclxuICAgICAgICB9O1xyXG4gICAgfSkge1xyXG4gICAgICAgIC8vIEV4ZWN1dGUgQVBJIGNhbGwuXHJcbiAgICAgICAgY29uc3QgdXJsID0gdGhpcy5nZXRVcmwoJ2F1dGgvcmVnaXN0ZXInKTtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLl9odHRwQ2xpZW50XHJcbiAgICAgICAgICAgIC5wb3N0KHVybCwgZGF0YSwgb3B0aW9ucylcclxuICAgICAgICAgICAgLnRvUHJvbWlzZSgpO1xyXG5cclxuICAgICAgICAvLyBNYXAgdG8gdGhlIGNvcnJlY3QgcmVzcG9uc2UuXHJcbiAgICAgICAgY29uc3Qge2FjY2Vzc1Rva2VuLCByZWZyZXNoVG9rZW4sIHVzZXJ9ID0gdGhpcy5fbWFwcGVyLnRvUmVnaXN0ZXIocmVzdWx0KTtcclxuXHJcbiAgICAgICAgLy8gU2V0IHRoZSB0b2tlbnMgaW4gc3RvcmFnZS5cclxuICAgICAgICB0aGlzLnNldFRva2VucyhhY2Nlc3NUb2tlbiwgcmVmcmVzaFRva2VuKTtcclxuXHJcbiAgICAgICAgLy8gU2V0IHRoZSB1c2VyIGluIHN0b3JhZ2UuXHJcbiAgICAgICAgdGhpcy5zZXNzaW9uLnNldFVzZXIodXNlcik7XHJcblxyXG4gICAgICAgIC8vIFJldHVybiB0aGUgdXNlci5cclxuICAgICAgICByZXR1cm4gPFQ+dXNlcjtcclxuICAgIH1cclxuXHJcbiAgICBsb2dvdXQoKSB7XHJcbiAgICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhIHJlZnJlc2ggdG9rZW4ganVzdCBjbGVhciB0aGUgc2Vzc2lvbi5cclxuICAgICAgICAvLyBOb3RlOiBXZSBkbyB0aGlzIGJlY2F1c2UgZWxzZSB3ZSB0cnkgdG8gaW52YWxpZGF0ZVxyXG4gICAgICAgIC8vIGFuIFwidW5kZWZpbmVkXCIgcmVmcmVzaCB0b2tlbi5cclxuICAgICAgICBjb25zdCByZWZyZXNoVG9rZW4gPSB0aGlzLnNlc3Npb24ucmVmcmVzaFRva2VuO1xyXG4gICAgICAgIGlmICghcmVmcmVzaFRva2VuKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNlc3Npb24uY2xlYXIoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIFdlIGRvIGhhdmUgYSByZWZyZXNoIHRva2VuLCBzbyB0cnkgdG9cclxuICAgICAgICAvLyBpbnZhbGlkYXRlIGl0IGluIHRoZSBiYWNrZW5kLlxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHVybCA9IHRoaXMuZ2V0VXJsKCdhdXRoL2xvZ291dCcpO1xyXG4gICAgICAgICAgICB0aGlzLl9odHRwQ2xpZW50LmdldCh1cmwsIHtcclxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtBdXRob3JpemF0aW9uOiByZWZyZXNoVG9rZW59XHJcbiAgICAgICAgICAgIH0pLnRvUHJvbWlzZSgpLnRoZW4oXyA9PiBfKTtcclxuICAgICAgICB9IGNhdGNoIHtcclxuICAgICAgICAgICAgLy8gRG8gbm90aGluZyBiZWNhdXNlIHRoZSB0b2tlbnMgd2lsbCBiZSBkZWxldGVkIGFueXdheXMgZnJvbSB0aGUgc2Vzc2lvbi5cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIERlbGV0ZSB0aGUgdG9rZW5zIGZyb20gdGhlIHNlc3Npb24uXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc2Vzc2lvbi5jbGVhcigpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlZnJlc2goKSB7XHJcbiAgICAgICAgLy8gSWYgdGhlIHJlZnJlc2ggdG9rZW4gZG9lc1xyXG4gICAgICAgIC8vIG5vdCBleGlzdCBqdXN0IHJldHVybiBhbiBvYnNlcnZhYmxlIG9mIG51bGwuXHJcbiAgICAgICAgY29uc3QgcmVmcmVzaFRva2VuID0gdGhpcy5zZXNzaW9uLnJlZnJlc2hUb2tlbjtcclxuICAgICAgICBpZiAoIXJlZnJlc2hUb2tlbikge1xyXG4gICAgICAgICAgICByZXR1cm4gb2Y8c3RyaW5nPihudWxsKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIFBlcmZvcm0gdGhlIHJlZnJlc2ggY2FsbC5cclxuICAgICAgICBjb25zdCBzY2hlbWUgPSB0aGlzLl9jb25maWc/LnNjaGVtZSA/PyAnQmVhcmVyJztcclxuXHJcbiAgICAgICAgY29uc3QgdXJsID0gdGhpcy5nZXRVcmwoJ2F1dGgvcmVmcmVzaCcpO1xyXG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSBuZXcgSHR0cENvbnRleHQoKVxyXG4gICAgICAgICAgICAuc2V0KFVTRV9BVVRIT1JJWkFUSU9OLCBmYWxzZSk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLl9odHRwQ2xpZW50LmdldCh1cmwsIHtcclxuICAgICAgICAgICAgaGVhZGVyczoge0F1dGhvcml6YXRpb246IGAke3NjaGVtZX0gJHtyZWZyZXNoVG9rZW59YH0sXHJcbiAgICAgICAgICAgIGNvbnRleHQ6IGNvbnRleHRcclxuICAgICAgICB9KS5waXBlKFxyXG4gICAgICAgICAgICBtYXAoZGF0YSA9PiB0aGlzLl9tYXBwZXIudG9SZWZyZXNoKGRhdGEpKSxcclxuICAgICAgICAgICAgdGFwKCh7YWNjZXNzVG9rZW4sIHJlZnJlc2hUb2tlbn0pID0+IHRoaXMuc2V0VG9rZW5zKGFjY2Vzc1Rva2VuLCByZWZyZXNoVG9rZW4pKSxcclxuICAgICAgICAgICAgbWFwKCh7YWNjZXNzVG9rZW59KSA9PiBhY2Nlc3NUb2tlbilcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHJlcXVlc3RQYXNzd29yZChlbWFpbDogc3RyaW5nLCBleHRyYVBhcmFtczogeyBba2V5OiBzdHJpbmddOiBhbnkgfSA9IHt9KSB7XHJcbiAgICAgICAgY29uc3QgdXJsID0gdGhpcy5nZXRVcmwoJ2F1dGgvcmVzZXQnKTtcclxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5faHR0cENsaWVudFxyXG4gICAgICAgICAgICAucG9zdCh1cmwsIHsuLi5leHRyYVBhcmFtcywgZW1haWx9KVxyXG4gICAgICAgICAgICAudG9Qcm9taXNlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgcmVzZXRQYXNzd29yZCh0b2tlbjogc3RyaW5nLCBuZXdQYXNzd29yZDogc3RyaW5nLCBleHRyYVBhcmFtczogeyBba2V5OiBzdHJpbmddOiBhbnkgfSA9IHt9KSB7XHJcbiAgICAgICAgY29uc3QgdXJsID0gdGhpcy5nZXRVcmwoJ2F1dGgvcmVzZXQtcGFzc3dvcmQnKTtcclxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5faHR0cENsaWVudFxyXG4gICAgICAgICAgICAucG9zdCh1cmwsIHsuLi5leHRyYVBhcmFtcywgdG9rZW4sIHBhc3N3b3JkOiBuZXdQYXNzd29yZH0pXHJcbiAgICAgICAgICAgIC50b1Byb21pc2UoKTtcclxuICAgIH1cclxuXHJcbiAgICBndWFyZCh0eXBlOiBzdHJpbmcsIHJlZGlyZWN0VXJsPzogc3RyaW5nKSB7XHJcbiAgICAgICAgbGV0IG5ld1VybDogc3RyaW5nID0gbnVsbDtcclxuXHJcbiAgICAgICAgLy8gR2V0IHRoZSBjb3JyZWN0IG5ldyB1cmwuXHJcbiAgICAgICAgc3dpdGNoICh0eXBlKSB7XHJcbiAgICAgICAgICAgIGNhc2UgJ2F1dGhlbnRpY2F0ZWQnOlxyXG4gICAgICAgICAgICAgICAgbmV3VXJsID0gdGhpcy5fY29uZmlnPy5sb2dnZWRJblVybCA/PyBudWxsO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgJ3VuYXV0aGVudGljYXRlZCc6XHJcbiAgICAgICAgICAgICAgICBuZXdVcmwgPSB0aGlzLl9jb25maWc/LnJlZGlyZWN0VXJsID8/IG51bGw7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIEFwcGVuZCBhIHJlZGlyZWN0IHVybCBpZiB0aGUgdXNlciBpcyBkZWVtZWRcclxuICAgICAgICAvLyB1bmF1dGhlbnRpY2F0ZWQuXHJcbiAgICAgICAgaWYgKHR5cGUgPT09ICd1bmF1dGhlbnRpY2F0ZWQnKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNldFJlZGlyZWN0T25GYWlsZWRBdXRoID0gdGhpcy5fY29uZmlnPy5zZXRSZWRpcmVjdE9uRmFpbGVkQXV0aCA/PyB0cnVlO1xyXG4gICAgICAgICAgICBpZiAoc2V0UmVkaXJlY3RPbkZhaWxlZEF1dGggJiYgcmVkaXJlY3RVcmwgJiYgbmV3VXJsKSB7XHJcbiAgICAgICAgICAgICAgICBuZXdVcmwgKz0gYD9yZWRpcmVjdFVybD0ke3JlZGlyZWN0VXJsfWA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIFBhcnNlIHRoZSB1cmwgaWYgaXQgZXhpc3RzLlxyXG4gICAgICAgIGlmICh0aGlzLnJvdXRlciAmJiBuZXdVcmwpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucm91dGVyLnBhcnNlVXJsKG5ld1VybCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBSZXR1cm4gZmFsc2UgaWYgdGhlIHVzZXIgaXMgbm90IGFsbG93ZWQuXHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGNsZWFyQW5kUmVkaXJlY3QoKSB7XHJcbiAgICAgICAgLy8gMS4gRGVsZXRlIHRoZSB0b2tlbnMgZnJvbSB0aGUgc2Vzc2lvbi5cclxuICAgICAgICB0aGlzLnNlc3Npb24uY2xlYXIoKTtcclxuXHJcbiAgICAgICAgLy8gMi4gQ29tcG9zZSB0aGUgcm91dGUgdXJsLlxyXG4gICAgICAgIGNvbnN0IHJlZGlyZWN0VXJsID0gdGhpcy5fY29uZmlnPy5yZWRpcmVjdFVybCA/PyBudWxsO1xyXG5cclxuICAgICAgICAvLyAzLiBSb3V0ZSBiYWNrIGlmIHRoZSB1c2VyIHByb3ZpZGVkIGEgcmVkaXJlY3QgdXJsLlxyXG4gICAgICAgIGlmICh0aGlzLnJvdXRlciAmJiByZWRpcmVjdFVybCkge1xyXG4gICAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbcmVkaXJlY3RVcmxdKS50aGVuKF8gPT4gXyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc2V0VG9rZW5zKGFjY2Vzc1Rva2VuOiBzdHJpbmcsIHJlZnJlc2hUb2tlbjogc3RyaW5nKSB7XHJcbiAgICAgICAgLy8gU2V0IHRoZSB0b2tlbnMgaW4gb3VyIHNlc3Npb24uXHJcbiAgICAgICAgdGhpcy5zZXNzaW9uLnNldFRva2VucyhhY2Nlc3NUb2tlbiwgcmVmcmVzaFRva2VuKTtcclxuXHJcbiAgICAgICAgLy8gV2UgbmVlZCB0byB1cGRhdGUgdGhlIGF1dG8gcmVmcmVzaCBvZiB0aGUgcmVmcmVzaCB0b2tlbi5cclxuICAgICAgICB0aGlzLmhhbmRsZUF1dG9SZWZyZXNoaW5nKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBoYW5kbGVBdXRvUmVmcmVzaGluZygpIHtcclxuICAgICAgICBjb25zdCBzaG91bGRBdXRvUmVmcmVzaCA9IHRoaXMuX2NvbmZpZz8uYXV0b1JlZnJlc2ggPz8gZmFsc2U7XHJcbiAgICAgICAgaWYgKCFzaG91bGRBdXRvUmVmcmVzaCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBleHBpcmVzQXQgPSB0aGlzLnNlc3Npb24ucmVmcmVzaFRva2VuUGF5bG9hZD8uZXhwaXJlc0F0ID8/IG51bGw7XHJcbiAgICAgICAgaWYgKGV4cGlyZXNBdCA9PT0gbnVsbCB8fCAhdGhpcy5fcGxhdGZvcm0uaXNCcm93c2VyKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGRpZmZlcmVuY2VJbk1pbGxpc2Vjb25kcyA9IGV4cGlyZXNBdC5nZXRUaW1lKCkgLSBEYXRlLm5vdygpO1xyXG4gICAgICAgIGNvbnN0IG9mZnNldEluTWlsbGlzZWNvbmRzID0gMTBfMDAwOyAvLyAxMCBzZWNvbmRzLlxyXG5cclxuICAgICAgICAvLyBXZSB3YW50IHRvIHN0YXJ0IHRoZSByZWZyZXNoIDEwIHNlY29uZHMgYmVmb3JlIGl0IGV4cGlyZXMuXHJcbiAgICAgICAgY29uc3QgYWN0dWFsVGltaW5nID0gZGlmZmVyZW5jZUluTWlsbGlzZWNvbmRzIC0gb2Zmc2V0SW5NaWxsaXNlY29uZHM7XHJcbiAgICAgICAgaWYgKGFjdHVhbFRpbWluZyA8PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIFdlIG5lZWQgdG8gY2FwIHRoZSB0aW1pbmdzIGJlY2F1c2UgaWZcclxuICAgICAgICAvLyB3ZSBnZXQgbGFyZ2UgbnVtYmVycyBpdCBtaWdodCBjYXVzZSB1bndhbnRlZCByZXN1bHRzLlxyXG4gICAgICAgIGNvbnN0IG1heFRpbWluZyA9IDEwMDAgKiA2MCAqIDYwICogMjQ7IC8vIDI0IGhvdXJzLlxyXG4gICAgICAgIGNvbnN0IGNhcHBlZFRpbWluZyA9IE1hdGgubWF4KDEsIE1hdGgubWluKGFjdHVhbFRpbWluZywgbWF4VGltaW5nKSk7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX3JlZnJlc2hIYW5kbGVyICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQ/Lih0aGlzLl9yZWZyZXNoSGFuZGxlcik7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9yZWZyZXNoSGFuZGxlciA9IG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5fcmVmcmVzaEhhbmRsZXIgPSBzZXRUaW1lb3V0Py4oKCkgPT4gdGhpcy5hdXRvUmVmcmVzaCgpLCBjYXBwZWRUaW1pbmcpO1xyXG4gICAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgICAgICAvLyBKdXN0IGlnbm9yZSBpdC5cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhc3luYyBhdXRvUmVmcmVzaCgpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAvLyBXZSBqdXN0IG5lZWQgdG8gd2FpdCBmb3IgaXQgdG8gcmVmcmVzaC5cclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5yZWZyZXNoKCkudG9Qcm9taXNlKCk7XHJcbiAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgICAgIC8vIFNvbWV0aGluZyB3ZW50IHdyb25nIHJlZnJlc2hpbmcsIHdlIG5lZWQgdG8gY2xlYXIuXHJcbiAgICAgICAgICAgIHRoaXMuY2xlYXJBbmRSZWRpcmVjdCgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldCByb3V0ZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2luamVjdG9yLmdldChSb3V0ZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0VXJsKGVuZHBvaW50OiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gW3RoaXMuX2h0dHBBbGlhcywgZW5kcG9pbnRdXHJcbiAgICAgICAgICAgIC5maWx0ZXIoaXRlbSA9PiAhIWl0ZW0pXHJcbiAgICAgICAgICAgIC5qb2luKCcvJyk7XHJcbiAgICB9XHJcblxyXG59XHJcbiJdfQ==
1
+ import { __awaiter, __rest } from "tslib";
2
+ import { HttpContext } from '@angular/common/http';
3
+ import { makeStateKey } from '@angular/platform-browser';
4
+ import { USE_AUTHORIZATION } from './tokens/use-authorization.token';
5
+ import { AuthVerifyProvider } from './providers/verify.provider';
6
+ import { Injectable, Optional } from '@angular/core';
7
+ import { AuthEmailProvider } from './providers/email.provider';
8
+ import { map, take, tap } from 'rxjs/operators';
9
+ import { AuthSession } from './auth.session';
10
+ import { Router } from '@angular/router';
11
+ import { of } from 'rxjs';
12
+ import * as i0 from "@angular/core";
13
+ import * as i1 from "@bravobit/bb-foundation/storage";
14
+ import * as i2 from "./helpers/mapper.helper";
15
+ import * as i3 from "@bravobit/bb-foundation";
16
+ import * as i4 from "@angular/common/http";
17
+ import * as i5 from "./interfaces/config.interface";
18
+ import * as i6 from "@angular/platform-browser";
19
+ import * as i7 from "@bravobit/bb-foundation/http";
20
+ export class Auth {
21
+ constructor(_storage, _mapper, _injector, _platform, _httpClient, _config, _state, _httpConfig) {
22
+ var _a, _b, _c;
23
+ this._storage = _storage;
24
+ this._mapper = _mapper;
25
+ this._injector = _injector;
26
+ this._platform = _platform;
27
+ this._httpClient = _httpClient;
28
+ this._config = _config;
29
+ this._state = _state;
30
+ this._httpConfig = _httpConfig;
31
+ // Readonly data.
32
+ this._authStateKey = makeStateKey(`bbAuthStateKey`);
33
+ this._httpAlias = (_b = (_a = this._httpConfig) === null || _a === void 0 ? void 0 : _a.defaultAlias) !== null && _b !== void 0 ? _b : null;
34
+ this._refreshHandler = null;
35
+ // Starting the new session.
36
+ this.session = new AuthSession({
37
+ id: (_c = this._config) === null || _c === void 0 ? void 0 : _c.applicationId,
38
+ storage: this._storage.select(["cookie" /* Cookie */, "local" /* Local */])
39
+ });
40
+ this.user = this.session.user;
41
+ }
42
+ initialize() {
43
+ return () => __awaiter(this, void 0, void 0, function* () {
44
+ var _a, _b, _c, _d, _e, _f;
45
+ // Check if the app should bootstrap the authentication.
46
+ const shouldBootstrap = (_b = (_a = this._config) === null || _a === void 0 ? void 0 : _a.bootstrap) !== null && _b !== void 0 ? _b : true;
47
+ if (!shouldBootstrap) {
48
+ return this.handleAutoRefreshing();
49
+ }
50
+ // Only retrieve from the server when we are actually authenticated.
51
+ if (!this.session.authenticated()) {
52
+ return;
53
+ }
54
+ // Get the key from the server state.
55
+ if (this._state && ((_c = this._state) === null || _c === void 0 ? void 0 : _c.hasKey(this._authStateKey))) {
56
+ const user = (_e = (_d = this._state) === null || _d === void 0 ? void 0 : _d.get(this._authStateKey, null)) !== null && _e !== void 0 ? _e : null;
57
+ return this.session.setUser(user);
58
+ }
59
+ // Try to fetch the user from the server.
60
+ const user = yield this.me().pipe(take(1)).toPromise();
61
+ // Set the state if exists.
62
+ if (this._state) {
63
+ (_f = this._state) === null || _f === void 0 ? void 0 : _f.set(this._authStateKey, user !== null && user !== void 0 ? user : null);
64
+ }
65
+ // Save the user in the storage and handle auto refreshing.
66
+ this.session.setUser(user);
67
+ this.handleAutoRefreshing();
68
+ });
69
+ }
70
+ me() {
71
+ const url = this.getUrl('auth/me');
72
+ return this._httpClient.get(url);
73
+ }
74
+ signIn(provider, as) {
75
+ var _a, _b;
76
+ return __awaiter(this, void 0, void 0, function* () {
77
+ const _c = yield provider.authenticate(this._httpClient), { accessToken, refreshToken, user } = _c, result = __rest(_c, ["accessToken", "refreshToken", "user"]);
78
+ // Check if the role matches.
79
+ if (as && !as.includes(this._mapper.role(user))) {
80
+ throw new Error('Invalid role.');
81
+ }
82
+ // Validate if the provider is one of the available
83
+ // providers then return the user object and the provider.
84
+ const apiProvider = (_a = result === null || result === void 0 ? void 0 : result.provider) !== null && _a !== void 0 ? _a : null;
85
+ const apiVerifyToken = (_b = result === null || result === void 0 ? void 0 : result.verifyToken) !== null && _b !== void 0 ? _b : null;
86
+ const availableProviders = ['email', 'sms', 'totp'];
87
+ if (availableProviders.includes(apiProvider)) {
88
+ return { user, provider: apiProvider, verifyToken: apiVerifyToken };
89
+ }
90
+ // Set the tokens in storage.
91
+ this.setTokens(accessToken, refreshToken);
92
+ // Set the user in storage.
93
+ this.session.setUser(user);
94
+ // Return the user.
95
+ return { user };
96
+ });
97
+ }
98
+ signInWithEmail(email, password, as) {
99
+ return __awaiter(this, void 0, void 0, function* () {
100
+ const url = this.getUrl('auth/login');
101
+ return this.signIn(new AuthEmailProvider(email, password, url), as);
102
+ });
103
+ }
104
+ signInWithVerifyCode(code, verifyToken) {
105
+ return __awaiter(this, void 0, void 0, function* () {
106
+ const url = this.getUrl('auth/verify');
107
+ return this.signIn(new AuthVerifyProvider(code, verifyToken, url));
108
+ });
109
+ }
110
+ resendVerifyCode(verifyToken) {
111
+ return __awaiter(this, void 0, void 0, function* () {
112
+ const url = this.getUrl('auth/resend');
113
+ return yield this._httpClient.post(url, {
114
+ verify_token: verifyToken
115
+ }).toPromise();
116
+ });
117
+ }
118
+ register(data, options) {
119
+ return __awaiter(this, void 0, void 0, function* () {
120
+ // Execute API call.
121
+ const url = this.getUrl('auth/register');
122
+ const result = yield this._httpClient
123
+ .post(url, data, options)
124
+ .toPromise();
125
+ // Map to the correct response.
126
+ const { accessToken, refreshToken, user } = this._mapper.toRegister(result);
127
+ // Set the tokens in storage.
128
+ this.setTokens(accessToken, refreshToken);
129
+ // Set the user in storage.
130
+ this.session.setUser(user);
131
+ // Return the user.
132
+ return user;
133
+ });
134
+ }
135
+ logout() {
136
+ // If we don't have a refresh token just clear the session.
137
+ // Note: We do this because else we try to invalidate
138
+ // an "undefined" refresh token.
139
+ const refreshToken = this.session.refreshToken;
140
+ if (!refreshToken) {
141
+ return this.session.clear();
142
+ }
143
+ // We do have a refresh token, so try to
144
+ // invalidate it in the backend.
145
+ try {
146
+ const url = this.getUrl('auth/logout');
147
+ this._httpClient.get(url, {
148
+ headers: { Authorization: refreshToken }
149
+ }).toPromise().then(_ => _);
150
+ }
151
+ catch (_a) {
152
+ // Do nothing because the tokens will be deleted anyways from the session.
153
+ }
154
+ // Delete the tokens from the session.
155
+ return this.session.clear();
156
+ }
157
+ refresh() {
158
+ var _a, _b;
159
+ // If the refresh token does
160
+ // not exist just return an observable of null.
161
+ const refreshToken = this.session.refreshToken;
162
+ if (!refreshToken) {
163
+ return of(null);
164
+ }
165
+ // Perform the refresh call.
166
+ const scheme = (_b = (_a = this._config) === null || _a === void 0 ? void 0 : _a.scheme) !== null && _b !== void 0 ? _b : 'Bearer';
167
+ const url = this.getUrl('auth/refresh');
168
+ const context = new HttpContext()
169
+ .set(USE_AUTHORIZATION, false);
170
+ return this._httpClient.get(url, {
171
+ headers: { Authorization: `${scheme} ${refreshToken}` },
172
+ context: context
173
+ }).pipe(map(data => this._mapper.toRefresh(data)), tap(({ accessToken, refreshToken }) => this.setTokens(accessToken, refreshToken)), map(({ accessToken }) => accessToken));
174
+ }
175
+ requestPassword(email, extraParams = {}) {
176
+ return __awaiter(this, void 0, void 0, function* () {
177
+ const url = this.getUrl('auth/reset');
178
+ return yield this._httpClient
179
+ .post(url, Object.assign(Object.assign({}, extraParams), { email }))
180
+ .toPromise();
181
+ });
182
+ }
183
+ resetPassword(token, newPassword, extraParams = {}) {
184
+ return __awaiter(this, void 0, void 0, function* () {
185
+ const url = this.getUrl('auth/reset-password');
186
+ return yield this._httpClient
187
+ .post(url, Object.assign(Object.assign({}, extraParams), { token, password: newPassword }))
188
+ .toPromise();
189
+ });
190
+ }
191
+ guard(type, redirectUrl) {
192
+ var _a, _b, _c, _d, _e, _f;
193
+ let newUrl = null;
194
+ // Get the correct new url.
195
+ switch (type) {
196
+ case 'authenticated':
197
+ newUrl = (_b = (_a = this._config) === null || _a === void 0 ? void 0 : _a.loggedInUrl) !== null && _b !== void 0 ? _b : null;
198
+ break;
199
+ case 'unauthenticated':
200
+ newUrl = (_d = (_c = this._config) === null || _c === void 0 ? void 0 : _c.redirectUrl) !== null && _d !== void 0 ? _d : null;
201
+ break;
202
+ }
203
+ // Append a redirect url if the user is deemed
204
+ // unauthenticated.
205
+ if (type === 'unauthenticated') {
206
+ const setRedirectOnFailedAuth = (_f = (_e = this._config) === null || _e === void 0 ? void 0 : _e.setRedirectOnFailedAuth) !== null && _f !== void 0 ? _f : true;
207
+ if (setRedirectOnFailedAuth && redirectUrl && newUrl) {
208
+ newUrl += `?redirectUrl=${redirectUrl}`;
209
+ }
210
+ }
211
+ // Parse the url if it exists.
212
+ if (this.router && newUrl) {
213
+ return this.router.parseUrl(newUrl);
214
+ }
215
+ // Return false if the user is not allowed.
216
+ return false;
217
+ }
218
+ clearAndRedirect() {
219
+ var _a, _b;
220
+ // 1. Delete the tokens from the session.
221
+ this.session.clear();
222
+ // 2. Compose the route url.
223
+ const redirectUrl = (_b = (_a = this._config) === null || _a === void 0 ? void 0 : _a.redirectUrl) !== null && _b !== void 0 ? _b : null;
224
+ // 3. Route back if the user provided a redirect url.
225
+ if (this.router && redirectUrl) {
226
+ this.router.navigate([redirectUrl]).then(_ => _);
227
+ }
228
+ }
229
+ setTokens(accessToken, refreshToken) {
230
+ // Set the tokens in our session.
231
+ this.session.setTokens(accessToken, refreshToken);
232
+ // We need to update the auto refresh of the refresh token.
233
+ this.handleAutoRefreshing();
234
+ }
235
+ handleAutoRefreshing() {
236
+ var _a, _b, _c, _d;
237
+ const shouldAutoRefresh = (_b = (_a = this._config) === null || _a === void 0 ? void 0 : _a.autoRefresh) !== null && _b !== void 0 ? _b : false;
238
+ if (!shouldAutoRefresh) {
239
+ return;
240
+ }
241
+ const expiresAt = (_d = (_c = this.session.refreshTokenPayload) === null || _c === void 0 ? void 0 : _c.expiresAt) !== null && _d !== void 0 ? _d : null;
242
+ if (expiresAt === null || !this._platform.isBrowser) {
243
+ return;
244
+ }
245
+ const differenceInMilliseconds = expiresAt.getTime() - Date.now();
246
+ const offsetInMilliseconds = 10000; // 10 seconds.
247
+ // We want to start the refresh 10 seconds before it expires.
248
+ const actualTiming = differenceInMilliseconds - offsetInMilliseconds;
249
+ if (actualTiming <= 0) {
250
+ return;
251
+ }
252
+ // We need to cap the timings because if
253
+ // we get large numbers it might cause unwanted results.
254
+ const maxTiming = 1000 * 60 * 60 * 24; // 24 hours.
255
+ const cappedTiming = Math.max(1, Math.min(actualTiming, maxTiming));
256
+ try {
257
+ if (this._refreshHandler !== null) {
258
+ clearTimeout === null || clearTimeout === void 0 ? void 0 : clearTimeout(this._refreshHandler);
259
+ this._refreshHandler = null;
260
+ }
261
+ this._refreshHandler = setTimeout === null || setTimeout === void 0 ? void 0 : setTimeout(() => this.autoRefresh(), cappedTiming);
262
+ }
263
+ catch (_e) {
264
+ // Just ignore it.
265
+ }
266
+ }
267
+ autoRefresh() {
268
+ return __awaiter(this, void 0, void 0, function* () {
269
+ try {
270
+ // We just need to wait for it to refresh.
271
+ yield this.refresh().toPromise();
272
+ }
273
+ catch (_a) {
274
+ // Something went wrong refreshing, we need to clear.
275
+ this.clearAndRedirect();
276
+ }
277
+ });
278
+ }
279
+ get router() {
280
+ return this._injector.get(Router);
281
+ }
282
+ getUrl(endpoint) {
283
+ return [this._httpAlias, endpoint]
284
+ .filter(item => !!item)
285
+ .join('/');
286
+ }
287
+ }
288
+ Auth.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0, type: Auth, deps: [{ token: i1.Storage }, { token: i2.AuthMapper }, { token: i0.Injector }, { token: i3.Platform }, { token: i4.HttpClient }, { token: i5.AuthConfig, optional: true }, { token: i6.TransferState, optional: true }, { token: i7.HttpConfig, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
289
+ Auth.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0, type: Auth });
290
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.10", ngImport: i0, type: Auth, decorators: [{
291
+ type: Injectable
292
+ }], ctorParameters: function () { return [{ type: i1.Storage }, { type: i2.AuthMapper }, { type: i0.Injector }, { type: i3.Platform }, { type: i4.HttpClient }, { type: i5.AuthConfig, decorators: [{
293
+ type: Optional
294
+ }] }, { type: i6.TransferState, decorators: [{
295
+ type: Optional
296
+ }] }, { type: i7.HttpConfig, decorators: [{
297
+ type: Optional
298
+ }] }]; } });
299
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYmItZm91bmRhdGlvbi9hdXRoL3NyYy9saWIvYXV0aC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQWEsV0FBVyxFQUEwQixNQUFNLHNCQUFzQixDQUFDO0FBRXRGLE9BQU8sRUFBQyxZQUFZLEVBQTBCLE1BQU0sMkJBQTJCLENBQUM7QUFFaEYsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sa0NBQWtDLENBQUM7QUFDbkUsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sNkJBQTZCLENBQUM7QUFDL0QsT0FBTyxFQUFDLFVBQVUsRUFBWSxRQUFRLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDN0QsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFLN0QsT0FBTyxFQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUN2QyxPQUFPLEVBQWEsRUFBRSxFQUFDLE1BQU0sTUFBTSxDQUFDOzs7Ozs7Ozs7QUFHcEMsTUFBTSxPQUFPLElBQUk7SUFXYixZQUFvQixRQUFpQixFQUNqQixPQUFtQixFQUNuQixTQUFtQixFQUNuQixTQUFtQixFQUNuQixXQUF1QixFQUNYLE9BQW9CLEVBQ3BCLE1BQXNCLEVBQ3RCLFdBQXdCOztRQVBwQyxhQUFRLEdBQVIsUUFBUSxDQUFTO1FBQ2pCLFlBQU8sR0FBUCxPQUFPLENBQVk7UUFDbkIsY0FBUyxHQUFULFNBQVMsQ0FBVTtRQUNuQixjQUFTLEdBQVQsU0FBUyxDQUFVO1FBQ25CLGdCQUFXLEdBQVgsV0FBVyxDQUFZO1FBQ1gsWUFBTyxHQUFQLE9B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QUNwRSxJQUFJO1lBQ0EsSUFBSSxJQUFJLENBQUMsZUFBZSxLQUFLLElBQUksRUFBRTtnQkFDL0IsWUFBWSxhQUFaLFlBQVksdUJBQVosWUFBWSxDQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztnQkFDckMsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7YUFDL0I7WUFDRCxJQUFJLENBQUMsZUFBZSxHQUFHLFVBQVUsYUFBVixVQUFVLHVCQUFWLFVBQVUsQ0FBRyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUUsWUFBWSxDQUFDLENBQUM7U0FDL0U7UUFBQyxXQUFNO1lBQ0osa0JBQWtCO1NBQ3JCO0lBQ0wsQ0FBQztJQUVhLFdBQVc7O1lBQ3JCLElBQUk7Z0JBQ0EsMENBQTBDO2dCQUMxQyxNQUFNLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQzthQUNwQztZQUFDLFdBQU07Z0JBQ0oscURBQXFEO2dCQUNyRCxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQzthQUMzQjtRQUNMLENBQUM7S0FBQTtJQUVELElBQVksTUFBTTtRQUNkLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVPLE1BQU0sQ0FBQyxRQUFnQjtRQUMzQixPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUM7YUFDN0IsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQzthQUN0QixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDbkIsQ0FBQzs7a0dBbFRRLElBQUk7c0dBQUosSUFBSTs0RkFBSixJQUFJO2tCQURoQixVQUFVOzswQkFpQk0sUUFBUTs7MEJBQ1IsUUFBUTs7MEJBQ1IsUUFBUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SHR0cENsaWVudCwgSHR0cENvbnRleHQsIEh0dHBIZWFkZXJzLCBIdHRwUGFyYW1zfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQge0F1dGhQcm92aWRlciwgQXV0aFNpZ25JblJlc3BvbnNlfSBmcm9tICcuL2ludGVyZmFjZXMvcHJvdmlkZXIuaW50ZXJmYWNlJztcbmltcG9ydCB7bWFrZVN0YXRlS2V5LCBTdGF0ZUtleSwgVHJhbnNmZXJTdGF0ZX0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5pbXBvcnQge1N0b3JhZ2UsIFN0b3JhZ2VPcHRpb259IGZyb20gJ0BicmF2b2JpdC9iYi1mb3VuZGF0aW9uL3N0b3JhZ2UnO1xuaW1wb3J0IHtVU0VfQVVUSE9SSVpBVElPTn0gZnJvbSAnLi90b2tlbnMvdXNlLWF1dGhvcml6YXRpb24udG9rZW4nO1xuaW1wb3J0IHtBdXRoVmVyaWZ5UHJvdmlkZXJ9IGZyb20gJy4vcHJvdmlkZXJzL3ZlcmlmeS5wcm92aWRlcic7XG5pbXBvcnQge0luamVjdGFibGUsIEluamVjdG9yLCBPcHRpb25hbH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0F1dGhFbWFpbFByb3ZpZGVyfSBmcm9tICcuL3Byb3ZpZGVycy9lbWFpbC5wcm92aWRlcic7XG5pbXBvcnQge0F1dGhDb25maWd9IGZyb20gJy4vaW50ZXJmYWNlcy9jb25maWcuaW50ZXJmYWNlJztcbmltcG9ydCB7SHR0cENvbmZpZ30gZnJvbSAnQGJyYXZvYml0L2JiLWZvdW5kYXRpb24vaHR0cCc7XG5pbXBvcnQge0F1dGhNYXBwZXJ9IGZyb20gJy4vaGVscGVycy9tYXBwZXIuaGVscGVyJztcbmltcG9ydCB7UGxhdGZvcm19IGZyb20gJ0BicmF2b2JpdC9iYi1mb3VuZGF0aW9uJztcbmltcG9ydCB7bWFwLCB0YWtlLCB0YXB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7QXV0aFNlc3Npb259IGZyb20gJy4vYXV0aC5zZXNzaW9uJztcbmltcG9ydCB7Um91dGVyfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHtPYnNlcnZhYmxlLCBvZn0gZnJvbSAncnhqcyc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBBdXRoIHtcblxuICAgIC8vIFJlYWRvbmx5IGRhdGEuXG4gICAgcHJpdmF0ZSByZWFkb25seSBfYXV0aFN0YXRlS2V5OiBTdGF0ZUtleTxhbnkgfCBudWxsPiA9IG1ha2VTdGF0ZUtleShgYmJBdXRoU3RhdGVLZXlgKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9odHRwQWxpYXM6IHN0cmluZyB8IG51bGwgPSB0aGlzLl9odHRwQ29uZmlnPy5kZWZhdWx0QWxpYXMgPz8gbnVsbDtcblxuICAgIHJlYWRvbmx5IHNlc3Npb246IEF1dGhTZXNzaW9uO1xuICAgIHJlYWRvbmx5IHVzZXI6IE9ic2VydmFibGU8YW55IHwgbnVsbD47XG5cbiAgICBwcml2YXRlIF9yZWZyZXNoSGFuZGxlcjogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9zdG9yYWdlOiBTdG9yYWdlLFxuICAgICAgICAgICAgICAgIHByaXZhdGUgX21hcHBlcjogQXV0aE1hcHBlcixcbiAgICAgICAgICAgICAgICBwcml2YXRlIF9pbmplY3RvcjogSW5qZWN0b3IsXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSBfcGxhdGZvcm06IFBsYXRmb3JtLFxuICAgICAgICAgICAgICAgIHByaXZhdGUgX2h0dHBDbGllbnQ6IEh0dHBDbGllbnQsXG4gICAgICAgICAgICAgICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBfY29uZmlnPzogQXV0aENvbmZpZyxcbiAgICAgICAgICAgICAgICBAT3B0aW9uYWwoKSBwcml2YXRlIF9zdGF0ZT86IFRyYW5zZmVyU3RhdGUsXG4gICAgICAgICAgICAgICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBfaHR0cENvbmZpZz86IEh0dHBDb25maWcpIHtcbiAgICAgICAgLy8gU3RhcnRpbmcgdGhlIG5ldyBzZXNzaW9uLlxuICAgICAgICB0aGlzLnNlc3Npb24gPSBuZXcgQXV0aFNlc3Npb24oe1xuICAgICAgICAgICAgaWQ6IHRoaXMuX2NvbmZpZz8uYXBwbGljYXRpb25JZCxcbiAgICAgICAgICAgIHN0b3JhZ2U6IHRoaXMuX3N0b3JhZ2Uuc2VsZWN0KFtTdG9yYWdlT3B0aW9uLkNvb2tpZSwgU3RvcmFnZU9wdGlvbi5Mb2NhbF0pXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnVzZXIgPSB0aGlzLnNlc3Npb24udXNlcjtcbiAgICB9XG5cbiAgICBpbml0aWFsaXplKCkge1xuICAgICAgICByZXR1cm4gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGFwcCBzaG91bGQgYm9vdHN0cmFwIHRoZSBhdXRoZW50aWNhdGlvbi5cbiAgICAgICAgICAgIGNvbnN0IHNob3VsZEJvb3RzdHJhcCA9IHRoaXMuX2NvbmZpZz8uYm9vdHN0cmFwID8/IHRydWU7XG4gICAgICAgICAgICBpZiAoIXNob3VsZEJvb3RzdHJhcCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmhhbmRsZUF1dG9SZWZyZXNoaW5nKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIE9ubHkgcmV0cmlldmUgZnJvbSB0aGUgc2VydmVyIHdoZW4gd2UgYXJlIGFjdHVhbGx5IGF1dGhlbnRpY2F0ZWQuXG4gICAgICAgICAgICBpZiAoIXRoaXMuc2Vzc2lvbi5hdXRoZW50aWNhdGVkKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEdldCB0aGUga2V5IGZyb20gdGhlIHNlcnZlciBzdGF0ZS5cbiAgICAgICAgICAgIGlmICh0aGlzLl9zdGF0ZSAmJiB0aGlzLl9zdGF0ZT8uaGFzS2V5KHRoaXMuX2F1dGhTdGF0ZUtleSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB1c2VyID0gdGhpcy5fc3RhdGU/LmdldCh0aGlzLl9hdXRoU3RhdGVLZXksIG51bGwpID8/IG51bGw7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2Vzc2lvbi5zZXRVc2VyKHVzZXIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBUcnkgdG8gZmV0Y2ggdGhlIHVzZXIgZnJvbSB0aGUgc2VydmVyLlxuICAgICAgICAgICAgY29uc3QgdXNlciA9IGF3YWl0IHRoaXMubWUoKS5waXBlKFxuICAgICAgICAgICAgICAgIHRha2UoMSlcbiAgICAgICAgICAgICkudG9Qcm9taXNlKCk7XG5cbiAgICAgICAgICAgIC8vIFNldCB0aGUgc3RhdGUgaWYgZXhpc3RzLlxuICAgICAgICAgICAgaWYgKHRoaXMuX3N0YXRlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc3RhdGU/LnNldDxhbnk+KHRoaXMuX2F1dGhTdGF0ZUtleSwgdXNlciA/PyBudWxsKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gU2F2ZSB0aGUgdXNlciBpbiB0aGUgc3RvcmFnZSBhbmQgaGFuZGxlIGF1dG8gcmVmcmVzaGluZy5cbiAgICAgICAgICAgIHRoaXMuc2Vzc2lvbi5zZXRVc2VyKHVzZXIpO1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVBdXRvUmVmcmVzaGluZygpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIG1lPFQgPSBhbnk+KCkge1xuICAgICAgICBjb25zdCB1cmwgPSB0aGlzLmdldFVybCgnYXV0aC9tZScpO1xuICAgICAgICByZXR1cm4gdGhpcy5faHR0cENsaWVudC5nZXQ8VD4odXJsKTtcbiAgICB9XG5cbiAgICBhc3luYyBzaWduSW4ocHJvdmlkZXI6IEF1dGhQcm92aWRlciwgYXM/OiBzdHJpbmdbXSkge1xuICAgICAgICBjb25zdCB7YWNjZXNzVG9rZW4sIHJlZnJlc2hUb2tlbiwgdXNlciwgLi4ucmVzdWx0fSA9IGF3YWl0IHByb3ZpZGVyLmF1dGhlbnRpY2F0ZSh0aGlzLl9odHRwQ2xpZW50KTtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgcm9sZSBtYXRjaGVzLlxuICAgICAgICBpZiAoYXMgJiYgIWFzLmluY2x1ZGVzKHRoaXMuX21hcHBlci5yb2xlKHVzZXIpKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHJvbGUuJyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBWYWxpZGF0ZSBpZiB0aGUgcHJvdmlkZXIgaXMgb25lIG9mIHRoZSBhdmFpbGFibGVcbiAgICAgICAgLy8gcHJvdmlkZXJzIHRoZW4gcmV0dXJuIHRoZSB1c2VyIG9iamVjdCBhbmQgdGhlIHByb3ZpZGVyLlxuICAgICAgICBjb25zdCBhcGlQcm92aWRlciA9IHJlc3VsdD8ucHJvdmlkZXIgPz8gbnVsbDtcbiAgICAgICAgY29uc3QgYXBpVmVyaWZ5VG9rZW4gPSByZXN1bHQ/LnZlcmlmeVRva2VuID8/IG51bGw7XG4gICAgICAgIGNvbnN0IGF2YWlsYWJsZVByb3ZpZGVycyA9IFsnZW1haWwnLCAnc21zJywgJ3RvdHAnXTtcbiAgICAgICAgaWYgKGF2YWlsYWJsZVByb3ZpZGVycy5pbmNsdWRlcyhhcGlQcm92aWRlcikpIHtcbiAgICAgICAgICAgIHJldHVybiA8QXV0aFNpZ25JblJlc3BvbnNlPnt1c2VyLCBwcm92aWRlcjogYXBpUHJvdmlkZXIsIHZlcmlmeVRva2VuOiBhcGlWZXJpZnlUb2tlbn07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTZXQgdGhlIHRva2VucyBpbiBzdG9yYWdlLlxuICAgICAgICB0aGlzLnNldFRva2VucyhhY2Nlc3NUb2tlbiwgcmVmcmVzaFRva2VuKTtcblxuICAgICAgICAvLyBTZXQgdGhlIHVzZXIgaW4gc3RvcmFnZS5cbiAgICAgICAgdGhpcy5zZXNzaW9uLnNldFVzZXIodXNlcik7XG5cbiAgICAgICAgLy8gUmV0dXJuIHRoZSB1c2VyLlxuICAgICAgICByZXR1cm4gPEF1dGhTaWduSW5SZXNwb25zZT57dXNlcn07XG4gICAgfVxuXG4gICAgYXN5bmMgc2lnbkluV2l0aEVtYWlsKGVtYWlsOiBzdHJpbmcsIHBhc3N3b3JkOiBzdHJpbmcsIGFzPzogc3RyaW5nW10pIHtcbiAgICAgICAgY29uc3QgdXJsID0gdGhpcy5nZXRVcmwoJ2F1dGgvbG9naW4nKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2lnbkluKG5ldyBBdXRoRW1haWxQcm92aWRlcihlbWFpbCwgcGFzc3dvcmQsIHVybCksIGFzKTtcbiAgICB9XG5cbiAgICBhc3luYyBzaWduSW5XaXRoVmVyaWZ5Q29kZShjb2RlOiBzdHJpbmcsIHZlcmlmeVRva2VuOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgdXJsID0gdGhpcy5nZXRVcmwoJ2F1dGgvdmVyaWZ5Jyk7XG4gICAgICAgIHJldHVybiB0aGlzLnNpZ25JbihuZXcgQXV0aFZlcmlmeVByb3ZpZGVyKGNvZGUsIHZlcmlmeVRva2VuLCB1cmwpKTtcbiAgICB9XG5cbiAgICBhc3luYyByZXNlbmRWZXJpZnlDb2RlKHZlcmlmeVRva2VuOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgdXJsID0gdGhpcy5nZXRVcmwoJ2F1dGgvcmVzZW5kJyk7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9odHRwQ2xpZW50LnBvc3QodXJsLCB7XG4gICAgICAgICAgICB2ZXJpZnlfdG9rZW46IHZlcmlmeVRva2VuXG4gICAgICAgIH0pLnRvUHJvbWlzZSgpO1xuICAgIH1cblxuICAgIGFzeW5jIHJlZ2lzdGVyPFQgPSBhbnk+KGRhdGE6IGFueSwgb3B0aW9ucz86IHtcbiAgICAgICAgaGVhZGVycz86IEh0dHBIZWFkZXJzIHwge1xuICAgICAgICAgICAgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIHwgc3RyaW5nW107XG4gICAgICAgIH07XG4gICAgICAgIHBhcmFtcz86IEh0dHBQYXJhbXMgfCB7XG4gICAgICAgICAgICBbcGFyYW06IHN0cmluZ106IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBSZWFkb25seUFycmF5PHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4+O1xuICAgICAgICB9O1xuICAgIH0pIHtcbiAgICAgICAgLy8gRXhlY3V0ZSBBUEkgY2FsbC5cbiAgICAgICAgY29uc3QgdXJsID0gdGhpcy5nZXRVcmwoJ2F1dGgvcmVnaXN0ZXInKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5faHR0cENsaWVudFxuICAgICAgICAgICAgLnBvc3QodXJsLCBkYXRhLCBvcHRpb25zKVxuICAgICAgICAgICAgLnRvUHJvbWlzZSgpO1xuXG4gICAgICAgIC8vIE1hcCB0byB0aGUgY29ycmVjdCByZXNwb25zZS5cbiAgICAgICAgY29uc3Qge2FjY2Vzc1Rva2VuLCByZWZyZXNoVG9rZW4sIHVzZXJ9ID0gdGhpcy5fbWFwcGVyLnRvUmVnaXN0ZXIocmVzdWx0KTtcblxuICAgICAgICAvLyBTZXQgdGhlIHRva2VucyBpbiBzdG9yYWdlLlxuICAgICAgICB0aGlzLnNldFRva2VucyhhY2Nlc3NUb2tlbiwgcmVmcmVzaFRva2VuKTtcblxuICAgICAgICAvLyBTZXQgdGhlIHVzZXIgaW4gc3RvcmFnZS5cbiAgICAgICAgdGhpcy5zZXNzaW9uLnNldFVzZXIodXNlcik7XG5cbiAgICAgICAgLy8gUmV0dXJuIHRoZSB1c2VyLlxuICAgICAgICByZXR1cm4gPFQ+dXNlcjtcbiAgICB9XG5cbiAgICBsb2dvdXQoKSB7XG4gICAgICAgIC8vIElmIHdlIGRvbid0IGhhdmUgYSByZWZyZXNoIHRva2VuIGp1c3QgY2xlYXIgdGhlIHNlc3Npb24uXG4gICAgICAgIC8vIE5vdGU6IFdlIGRvIHRoaXMgYmVjYXVzZSBlbHNlIHdlIHRyeSB0byBpbnZhbGlkYXRlXG4gICAgICAgIC8vIGFuIFwidW5kZWZpbmVkXCIgcmVmcmVzaCB0b2tlbi5cbiAgICAgICAgY29uc3QgcmVmcmVzaFRva2VuID0gdGhpcy5zZXNzaW9uLnJlZnJlc2hUb2tlbjtcbiAgICAgICAgaWYgKCFyZWZyZXNoVG9rZW4pIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNlc3Npb24uY2xlYXIoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFdlIGRvIGhhdmUgYSByZWZyZXNoIHRva2VuLCBzbyB0cnkgdG9cbiAgICAgICAgLy8gaW52YWxpZGF0ZSBpdCBpbiB0aGUgYmFja2VuZC5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHVybCA9IHRoaXMuZ2V0VXJsKCdhdXRoL2xvZ291dCcpO1xuICAgICAgICAgICAgdGhpcy5faHR0cENsaWVudC5nZXQodXJsLCB7XG4gICAgICAgICAgICAgICAgaGVhZGVyczoge0F1dGhvcml6YXRpb246IHJlZnJlc2hUb2tlbn1cbiAgICAgICAgICAgIH0pLnRvUHJvbWlzZSgpLnRoZW4oXyA9PiBfKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvLyBEbyBub3RoaW5nIGJlY2F1c2UgdGhlIHRva2VucyB3aWxsIGJlIGRlbGV0ZWQgYW55d2F5cyBmcm9tIHRoZSBzZXNzaW9uLlxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGVsZXRlIHRoZSB0b2tlbnMgZnJvbSB0aGUgc2Vzc2lvbi5cbiAgICAgICAgcmV0dXJuIHRoaXMuc2Vzc2lvbi5jbGVhcigpO1xuICAgIH1cblxuICAgIHJlZnJlc2goKSB7XG4gICAgICAgIC8vIElmIHRoZSByZWZyZXNoIHRva2VuIGRvZXNcbiAgICAgICAgLy8gbm90IGV4aXN0IGp1c3QgcmV0dXJuIGFuIG9ic2VydmFibGUgb2YgbnVsbC5cbiAgICAgICAgY29uc3QgcmVmcmVzaFRva2VuID0gdGhpcy5zZXNzaW9uLnJlZnJlc2hUb2tlbjtcbiAgICAgICAgaWYgKCFyZWZyZXNoVG9rZW4pIHtcbiAgICAgICAgICAgIHJldHVybiBvZjxzdHJpbmc+KG51bGwpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUGVyZm9ybSB0aGUgcmVmcmVzaCBjYWxsLlxuICAgICAgICBjb25zdCBzY2hlbWUgPSB0aGlzLl9jb25maWc/LnNjaGVtZSA/PyAnQmVhcmVyJztcblxuICAgICAgICBjb25zdCB1cmwgPSB0aGlzLmdldFVybCgnYXV0aC9yZWZyZXNoJyk7XG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSBuZXcgSHR0cENvbnRleHQoKVxuICAgICAgICAgICAgLnNldChVU0VfQVVUSE9SSVpBVElPTiwgZmFsc2UpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLl9odHRwQ2xpZW50LmdldCh1cmwsIHtcbiAgICAgICAgICAgIGhlYWRlcnM6IHtBdXRob3JpemF0aW9uOiBgJHtzY2hlbWV9ICR7cmVmcmVzaFRva2VufWB9LFxuICAgICAgICAgICAgY29udGV4dDogY29udGV4dFxuICAgICAgICB9KS5waXBlKFxuICAgICAgICAgICAgbWFwKGRhdGEgPT4gdGhpcy5fbWFwcGVyLnRvUmVmcmVzaChkYXRhKSksXG4gICAgICAgICAgICB0YXAoKHthY2Nlc3NUb2tlbiwgcmVmcmVzaFRva2VufSkgPT4gdGhpcy5zZXRUb2tlbnMoYWNjZXNzVG9rZW4sIHJlZnJlc2hUb2tlbikpLFxuICAgICAgICAgICAgbWFwKCh7YWNjZXNzVG9rZW59KSA9PiBhY2Nlc3NUb2tlbilcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBhc3luYyByZXF1ZXN0UGFzc3dvcmQoZW1haWw6IHN0cmluZywgZXh0cmFQYXJhbXM6IHsgW2tleTogc3RyaW5nXTogYW55IH0gPSB7fSkge1xuICAgICAgICBjb25zdCB1cmwgPSB0aGlzLmdldFVybCgnYXV0aC9yZXNldCcpO1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5faHR0cENsaWVudFxuICAgICAgICAgICAgLnBvc3QodXJsLCB7Li4uZXh0cmFQYXJhbXMsIGVtYWlsfSlcbiAgICAgICAgICAgIC50b1Byb21pc2UoKTtcbiAgICB9XG5cbiAgICBhc3luYyByZXNldFBhc3N3b3JkKHRva2VuOiBzdHJpbmcsIG5ld1Bhc3N3b3JkOiBzdHJpbmcsIGV4dHJhUGFyYW1zOiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge30pIHtcbiAgICAgICAgY29uc3QgdXJsID0gdGhpcy5nZXRVcmwoJ2F1dGgvcmVzZXQtcGFzc3dvcmQnKTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX2h0dHBDbGllbnRcbiAgICAgICAgICAgIC5wb3N0KHVybCwgey4uLmV4dHJhUGFyYW1zLCB0b2tlbiwgcGFzc3dvcmQ6IG5ld1Bhc3N3b3JkfSlcbiAgICAgICAgICAgIC50b1Byb21pc2UoKTtcbiAgICB9XG5cbiAgICBndWFyZCh0eXBlOiBzdHJpbmcsIHJlZGlyZWN0VXJsPzogc3RyaW5nKSB7XG4gICAgICAgIGxldCBuZXdVcmw6IHN0cmluZyA9IG51bGw7XG5cbiAgICAgICAgLy8gR2V0IHRoZSBjb3JyZWN0IG5ldyB1cmwuXG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnYXV0aGVudGljYXRlZCc6XG4gICAgICAgICAgICAgICAgbmV3VXJsID0gdGhpcy5fY29uZmlnPy5sb2dnZWRJblVybCA/PyBudWxsO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAndW5hdXRoZW50aWNhdGVkJzpcbiAgICAgICAgICAgICAgICBuZXdVcmwgPSB0aGlzLl9jb25maWc/LnJlZGlyZWN0VXJsID8/IG51bGw7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBcHBlbmQgYSByZWRpcmVjdCB1cmwgaWYgdGhlIHVzZXIgaXMgZGVlbWVkXG4gICAgICAgIC8vIHVuYXV0aGVudGljYXRlZC5cbiAgICAgICAgaWYgKHR5cGUgPT09ICd1bmF1dGhlbnRpY2F0ZWQnKSB7XG4gICAgICAgICAgICBjb25zdCBzZXRSZWRpcmVjdE9uRmFpbGVkQXV0aCA9IHRoaXMuX2NvbmZpZz8uc2V0UmVkaXJlY3RPbkZhaWxlZEF1dGggPz8gdHJ1ZTtcbiAgICAgICAgICAgIGlmIChzZXRSZWRpcmVjdE9uRmFpbGVkQXV0aCAmJiByZWRpcmVjdFVybCAmJiBuZXdVcmwpIHtcbiAgICAgICAgICAgICAgICBuZXdVcmwgKz0gYD9yZWRpcmVjdFVybD0ke3JlZGlyZWN0VXJsfWA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBQYXJzZSB0aGUgdXJsIGlmIGl0IGV4aXN0cy5cbiAgICAgICAgaWYgKHRoaXMucm91dGVyICYmIG5ld1VybCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucm91dGVyLnBhcnNlVXJsKG5ld1VybCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZXR1cm4gZmFsc2UgaWYgdGhlIHVzZXIgaXMgbm90IGFsbG93ZWQuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjbGVhckFuZFJlZGlyZWN0KCkge1xuICAgICAgICAvLyAxLiBEZWxldGUgdGhlIHRva2VucyBmcm9tIHRoZSBzZXNzaW9uLlxuICAgICAgICB0aGlzLnNlc3Npb24uY2xlYXIoKTtcblxuICAgICAgICAvLyAyLiBDb21wb3NlIHRoZSByb3V0ZSB1cmwuXG4gICAgICAgIGNvbnN0IHJlZGlyZWN0VXJsID0gdGhpcy5fY29uZmlnPy5yZWRpcmVjdFVybCA/PyBudWxsO1xuXG4gICAgICAgIC8vIDMuIFJvdXRlIGJhY2sgaWYgdGhlIHVzZXIgcHJvdmlkZWQgYSByZWRpcmVjdCB1cmwuXG4gICAgICAgIGlmICh0aGlzLnJvdXRlciAmJiByZWRpcmVjdFVybCkge1xuICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW3JlZGlyZWN0VXJsXSkudGhlbihfID0+IF8pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRUb2tlbnMoYWNjZXNzVG9rZW46IHN0cmluZywgcmVmcmVzaFRva2VuOiBzdHJpbmcpIHtcbiAgICAgICAgLy8gU2V0IHRoZSB0b2tlbnMgaW4gb3VyIHNlc3Npb24uXG4gICAgICAgIHRoaXMuc2Vzc2lvbi5zZXRUb2tlbnMoYWNjZXNzVG9rZW4sIHJlZnJlc2hUb2tlbik7XG5cbiAgICAgICAgLy8gV2UgbmVlZCB0byB1cGRhdGUgdGhlIGF1dG8gcmVmcmVzaCBvZiB0aGUgcmVmcmVzaCB0b2tlbi5cbiAgICAgICAgdGhpcy5oYW5kbGVBdXRvUmVmcmVzaGluZygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaGFuZGxlQXV0b1JlZnJlc2hpbmcoKSB7XG4gICAgICAgIGNvbnN0IHNob3VsZEF1dG9SZWZyZXNoID0gdGhpcy5fY29uZmlnPy5hdXRvUmVmcmVzaCA/PyBmYWxzZTtcbiAgICAgICAgaWYgKCFzaG91bGRBdXRvUmVmcmVzaCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZXhwaXJlc0F0ID0gdGhpcy5zZXNzaW9uLnJlZnJlc2hUb2tlblBheWxvYWQ/LmV4cGlyZXNBdCA/PyBudWxsO1xuICAgICAgICBpZiAoZXhwaXJlc0F0ID09PSBudWxsIHx8ICF0aGlzLl9wbGF0Zm9ybS5pc0Jyb3dzZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRpZmZlcmVuY2VJbk1pbGxpc2Vjb25kcyA9IGV4cGlyZXNBdC5nZXRUaW1lKCkgLSBEYXRlLm5vdygpO1xuICAgICAgICBjb25zdCBvZmZzZXRJbk1pbGxpc2Vjb25kcyA9IDEwXzAwMDsgLy8gMTAgc2Vjb25kcy5cblxuICAgICAgICAvLyBXZSB3YW50IHRvIHN0YXJ0IHRoZSByZWZyZXNoIDEwIHNlY29uZHMgYmVmb3JlIGl0IGV4cGlyZXMuXG4gICAgICAgIGNvbnN0IGFjdHVhbFRpbWluZyA9IGRpZmZlcmVuY2VJbk1pbGxpc2Vjb25kcyAtIG9mZnNldEluTWlsbGlzZWNvbmRzO1xuICAgICAgICBpZiAoYWN0dWFsVGltaW5nIDw9IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFdlIG5lZWQgdG8gY2FwIHRoZSB0aW1pbmdzIGJlY2F1c2UgaWZcbiAgICAgICAgLy8gd2UgZ2V0IGxhcmdlIG51bWJlcnMgaXQgbWlnaHQgY2F1c2UgdW53YW50ZWQgcmVzdWx0cy5cbiAgICAgICAgY29uc3QgbWF4VGltaW5nID0gMTAwMCAqIDYwICogNjAgKiAyNDsgLy8gMjQgaG91cnMuXG4gICAgICAgIGNvbnN0IGNhcHBlZFRpbWluZyA9IE1hdGgubWF4KDEsIE1hdGgubWluKGFjdHVhbFRpbWluZywgbWF4VGltaW5nKSk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fcmVmcmVzaEhhbmRsZXIgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQ/Lih0aGlzLl9yZWZyZXNoSGFuZGxlcik7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVmcmVzaEhhbmRsZXIgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fcmVmcmVzaEhhbmRsZXIgPSBzZXRUaW1lb3V0Py4oKCkgPT4gdGhpcy5hdXRvUmVmcmVzaCgpLCBjYXBwZWRUaW1pbmcpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIC8vIEp1c3QgaWdub3JlIGl0LlxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBhdXRvUmVmcmVzaCgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdlIGp1c3QgbmVlZCB0byB3YWl0IGZvciBpdCB0byByZWZyZXNoLlxuICAgICAgICAgICAgYXdhaXQgdGhpcy5yZWZyZXNoKCkudG9Qcm9taXNlKCk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy8gU29tZXRoaW5nIHdlbnQgd3JvbmcgcmVmcmVzaGluZywgd2UgbmVlZCB0byBjbGVhci5cbiAgICAgICAgICAgIHRoaXMuY2xlYXJBbmRSZWRpcmVjdCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXQgcm91dGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faW5qZWN0b3IuZ2V0KFJvdXRlcik7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRVcmwoZW5kcG9pbnQ6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gW3RoaXMuX2h0dHBBbGlhcywgZW5kcG9pbnRdXG4gICAgICAgICAgICAuZmlsdGVyKGl0ZW0gPT4gISFpdGVtKVxuICAgICAgICAgICAgLmpvaW4oJy8nKTtcbiAgICB9XG5cbn1cbiJdfQ==