@bravobit/bb-foundation 0.15.4 → 0.16.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 (377) hide show
  1. package/auth/lib/auth.interceptor.d.ts +1 -1
  2. package/auth/lib/auth.service.d.ts +1 -1
  3. package/auth/package.json +5 -5
  4. package/collections/package.json +5 -5
  5. package/controls/bravobit-bb-foundation-controls.d.ts +5 -0
  6. package/controls/lib/checkbox/checkbox.component.d.ts +27 -0
  7. package/controls/lib/checkbox/checkbox.module.d.ts +9 -0
  8. package/controls/lib/controls.module.d.ts +7 -0
  9. package/controls/package.json +10 -0
  10. package/controls/public_api.d.ts +3 -0
  11. package/dashboard/package.json +5 -5
  12. package/dialog/package.json +5 -5
  13. package/elements/package.json +5 -5
  14. package/{esm2015/auth/bravobit-bb-foundation-auth.js → esm2020/auth/bravobit-bb-foundation-auth.mjs} +0 -0
  15. package/esm2020/auth/lib/auth.interceptor.mjs +94 -0
  16. package/{esm2015/auth/lib/auth.module.js → esm2020/auth/lib/auth.module.mjs} +5 -5
  17. package/esm2020/auth/lib/auth.service.mjs +276 -0
  18. package/esm2020/auth/lib/auth.session.mjs +131 -0
  19. package/{esm2015/auth/lib/directives/authenticated.directive.js → esm2020/auth/lib/directives/authenticated.directive.mjs} +5 -6
  20. package/esm2020/auth/lib/directives/permission.directive.mjs +80 -0
  21. package/esm2020/auth/lib/directives/role.directive.mjs +37 -0
  22. package/esm2020/auth/lib/guards/anonymous.guard.mjs +34 -0
  23. package/esm2020/auth/lib/guards/authenticated.guard.mjs +35 -0
  24. package/{esm2015/auth/lib/helpers/jwt.helper.js → esm2020/auth/lib/helpers/jwt.helper.mjs} +3 -3
  25. package/{esm2015/auth/lib/helpers/mapper.helper.js → esm2020/auth/lib/helpers/mapper.helper.mjs} +4 -4
  26. package/{esm2015/auth/lib/interfaces/config.interface.js → esm2020/auth/lib/interfaces/config.interface.mjs} +0 -0
  27. package/{esm2015/auth/lib/interfaces/mapper.interface.js → esm2020/auth/lib/interfaces/mapper.interface.mjs} +0 -0
  28. package/{esm2015/auth/lib/interfaces/provider.interface.js → esm2020/auth/lib/interfaces/provider.interface.mjs} +0 -0
  29. package/{esm2015/auth/lib/interfaces/token.interface.js → esm2020/auth/lib/interfaces/token.interface.mjs} +0 -0
  30. package/esm2020/auth/lib/permissions.service.mjs +56 -0
  31. package/esm2020/auth/lib/providers/email.provider.mjs +25 -0
  32. package/esm2020/auth/lib/providers/verify.provider.mjs +19 -0
  33. package/{esm2015/auth/lib/tokens/use-authorization.token.js → esm2020/auth/lib/tokens/use-authorization.token.mjs} +0 -0
  34. package/{esm2015/auth/public_api.js → esm2020/auth/public_api.mjs} +0 -0
  35. package/{esm2015/bravobit-bb-foundation.js → esm2020/bravobit-bb-foundation.mjs} +0 -0
  36. package/{esm2015/collections/bravobit-bb-foundation-collections.js → esm2020/collections/bravobit-bb-foundation-collections.mjs} +0 -0
  37. package/esm2020/collections/lib/collection.mjs +98 -0
  38. package/{esm2015/collections/lib/collections.module.js → esm2020/collections/lib/collections.module.mjs} +5 -5
  39. package/esm2020/collections/lib/components/collections-pager/collections-pager.component.mjs +123 -0
  40. package/esm2020/collections/lib/components/collections-viewer/collections-viewer.component.mjs +31 -0
  41. package/{esm2015/collections/lib/components/collections.directive.js → esm2020/collections/lib/components/collections.directive.mjs} +13 -13
  42. package/{esm2015/collections/lib/interfaces/collection.interface.js → esm2020/collections/lib/interfaces/collection.interface.mjs} +0 -0
  43. package/esm2020/collections/lib/providers/api-collection.provider.mjs +68 -0
  44. package/esm2020/collections/lib/providers/collection.provider.mjs +13 -0
  45. package/{esm2015/collections/lib/providers/local-collection.provider.js → esm2020/collections/lib/providers/local-collection.provider.mjs} +0 -0
  46. package/{esm2015/collections/public_api.js → esm2020/collections/public_api.mjs} +0 -0
  47. package/esm2020/controls/bravobit-bb-foundation-controls.mjs +5 -0
  48. package/esm2020/controls/lib/checkbox/checkbox.component.mjs +86 -0
  49. package/esm2020/controls/lib/checkbox/checkbox.module.mjs +19 -0
  50. package/esm2020/controls/lib/controls.module.mjs +16 -0
  51. package/esm2020/controls/public_api.mjs +4 -0
  52. package/{esm2015/dashboard/bravobit-bb-foundation-dashboard.js → esm2020/dashboard/bravobit-bb-foundation-dashboard.mjs} +0 -0
  53. package/esm2020/dashboard/lib/dashboard/dashboard.component.mjs +56 -0
  54. package/esm2020/dashboard/lib/dashboard-header/dashboard-header.component.mjs +30 -0
  55. package/esm2020/dashboard/lib/dashboard-menu/dashboard-menu.component.mjs +31 -0
  56. package/esm2020/dashboard/lib/dashboard-menu-item/dashboard-menu-item.component.mjs +29 -0
  57. package/esm2020/dashboard/lib/dashboard-sidebar/dashboard-sidebar.component.mjs +75 -0
  58. package/esm2020/dashboard/lib/dashboard-sidebar-group/dashboard-sidebar-group.component.mjs +99 -0
  59. package/esm2020/dashboard/lib/dashboard-sidebar-item/dashboard-sidebar-item.component.mjs +62 -0
  60. package/{esm2015/dashboard/lib/dashboard.module.js → esm2020/dashboard/lib/dashboard.module.mjs} +5 -5
  61. package/{esm2015/dashboard/public_api.js → esm2020/dashboard/public_api.mjs} +0 -0
  62. package/{esm2015/dialog/bravobit-bb-foundation-dialog.js → esm2020/dialog/bravobit-bb-foundation-dialog.mjs} +0 -0
  63. package/esm2020/dialog/lib/dialog-actions/dialog-actions.component.mjs +12 -0
  64. package/esm2020/dialog/lib/dialog-confirm/dialog-confirm.component.mjs +37 -0
  65. package/{esm2015/dialog/lib/dialog-container/dialog-container.component.js → esm2020/dialog/lib/dialog-container/dialog-container.component.mjs} +6 -15
  66. package/esm2020/dialog/lib/dialog-header/dialog-header.component.mjs +25 -0
  67. package/esm2020/dialog/lib/dialog-link/dialog-link.component.mjs +11 -0
  68. package/esm2020/dialog/lib/dialog-modal/dialog-modal.component.mjs +46 -0
  69. package/esm2020/dialog/lib/dialog-overlay/dialog-overlay.component.mjs +134 -0
  70. package/{esm2015/dialog/lib/dialog.injector.js → esm2020/dialog/lib/dialog.injector.mjs} +0 -0
  71. package/{esm2015/dialog/lib/dialog.insertion.js → esm2020/dialog/lib/dialog.insertion.mjs} +4 -4
  72. package/{esm2015/dialog/lib/dialog.interfaces.js → esm2020/dialog/lib/dialog.interfaces.mjs} +0 -0
  73. package/{esm2015/dialog/lib/dialog.module.js → esm2020/dialog/lib/dialog.module.mjs} +5 -9
  74. package/{esm2015/dialog/lib/dialog.ref.js → esm2020/dialog/lib/dialog.ref.mjs} +0 -0
  75. package/{esm2015/dialog/lib/dialog.service.js → esm2020/dialog/lib/dialog.service.mjs} +5 -5
  76. package/{esm2015/dialog/public_api.js → esm2020/dialog/public_api.mjs} +0 -0
  77. package/{esm2015/elements/bravobit-bb-foundation-elements.js → esm2020/elements/bravobit-bb-foundation-elements.mjs} +0 -0
  78. package/esm2020/elements/lib/avatar/avatar.component.mjs +142 -0
  79. package/esm2020/elements/lib/button/button.component.mjs +61 -0
  80. package/esm2020/elements/lib/checkbox/checkbox.component.mjs +73 -0
  81. package/esm2020/elements/lib/date-picker/date-picker.component.mjs +304 -0
  82. package/{esm2015/elements/lib/directives/addon.directive.js → esm2020/elements/lib/directives/addon.directive.mjs} +7 -7
  83. package/esm2020/elements/lib/directives/autosize.directive.mjs +72 -0
  84. package/{esm2015/elements/lib/directives/focus-trap.directive.js → esm2020/elements/lib/directives/focus-trap.directive.mjs} +4 -4
  85. package/{esm2015/elements/lib/directives/focus.directive.js → esm2020/elements/lib/directives/focus.directive.mjs} +4 -4
  86. package/esm2020/elements/lib/directives/form-submit.directive.mjs +50 -0
  87. package/esm2020/elements/lib/directives/input.directive.mjs +136 -0
  88. package/{esm2015/elements/lib/directives/template.directive.js → esm2020/elements/lib/directives/template.directive.mjs} +4 -4
  89. package/esm2020/elements/lib/dropdown/dropdown.component.mjs +100 -0
  90. package/{esm2015/elements/lib/elements.interfaces.js → esm2020/elements/lib/elements.interfaces.mjs} +0 -0
  91. package/{esm2015/elements/lib/elements.module.js → esm2020/elements/lib/elements.module.mjs} +5 -5
  92. package/esm2020/elements/lib/file-picker/file-picker.component.mjs +236 -0
  93. package/esm2020/elements/lib/form-control/form-control.component.mjs +49 -0
  94. package/esm2020/elements/lib/form-error/form-error.component.mjs +108 -0
  95. package/esm2020/elements/lib/form-group/form-group.component.mjs +18 -0
  96. package/esm2020/elements/lib/icon/icon.component.mjs +102 -0
  97. package/esm2020/elements/lib/image-picker/image-picker.component.mjs +106 -0
  98. package/esm2020/elements/lib/pipes/file-image.pipe.mjs +42 -0
  99. package/{esm2015/elements/lib/pipes/file-size.pipe.js → esm2020/elements/lib/pipes/file-size.pipe.mjs} +4 -4
  100. package/esm2020/elements/lib/pipes/relative-time.pipe.mjs +94 -0
  101. package/esm2020/elements/lib/spinner/spinner.component.mjs +25 -0
  102. package/esm2020/elements/lib/tag/tag.component.mjs +18 -0
  103. package/{esm2015/elements/public_api.js → esm2020/elements/public_api.mjs} +0 -0
  104. package/{esm2015/http/bravobit-bb-foundation-http.js → esm2020/http/bravobit-bb-foundation-http.mjs} +0 -0
  105. package/esm2020/http/lib/classes/http.config.mjs +29 -0
  106. package/esm2020/http/lib/classes/http.error.mjs +20 -0
  107. package/{esm2015/http/lib/http.interfaces.js → esm2020/http/lib/http.interfaces.mjs} +0 -0
  108. package/{esm2015/http/lib/http.module.js → esm2020/http/lib/http.module.mjs} +5 -5
  109. package/esm2020/http/lib/interceptors/base-url.interceptor.mjs +50 -0
  110. package/esm2020/http/lib/interceptors/error.interceptor.mjs +32 -0
  111. package/{esm2015/http/public_api.js → esm2020/http/public_api.mjs} +0 -0
  112. package/{esm2015/lib/core/coercions/boolean-coercion.js → esm2020/lib/core/coercions/boolean-coercion.mjs} +0 -0
  113. package/{esm2015/lib/core/miscellaneous/regex.js → esm2020/lib/core/miscellaneous/regex.mjs} +0 -0
  114. package/esm2020/lib/core/miscellaneous/validator.mjs +85 -0
  115. package/{esm2015/lib/core/mixins/can-disable.js → esm2020/lib/core/mixins/can-disable.mjs} +0 -0
  116. package/{esm2015/lib/core/mixins/can-hide-errors.js → esm2020/lib/core/mixins/can-hide-errors.mjs} +0 -0
  117. package/{esm2015/lib/core/mixins/can-load.js → esm2020/lib/core/mixins/can-load.mjs} +0 -0
  118. package/{esm2015/lib/core/mixins/constructor.js → esm2020/lib/core/mixins/constructor.mjs} +0 -0
  119. package/{esm2015/lib/core/mixins/has-error.js → esm2020/lib/core/mixins/has-error.mjs} +0 -0
  120. package/{esm2015/lib/core/mixins/is-focused.js → esm2020/lib/core/mixins/is-focused.mjs} +0 -0
  121. package/{esm2015/lib/core/mixins/is-grouped.js → esm2020/lib/core/mixins/is-grouped.mjs} +0 -0
  122. package/{esm2015/lib/core/mixins/is-readonly.js → esm2020/lib/core/mixins/is-readonly.mjs} +0 -0
  123. package/{esm2015/lib/core/mixins/is-required.js → esm2020/lib/core/mixins/is-required.mjs} +0 -0
  124. package/esm2020/lib/core/services/clipboard.service.mjs +70 -0
  125. package/esm2020/lib/core/services/exif.service.mjs +163 -0
  126. package/esm2020/lib/core/services/file-loader.service.mjs +87 -0
  127. package/esm2020/lib/core/services/image-converter.service.mjs +123 -0
  128. package/{esm2015/lib/core/services/languages.service.js → esm2020/lib/core/services/languages.service.mjs} +4 -4
  129. package/{esm2015/lib/core/services/network.service.js → esm2020/lib/core/services/network.service.mjs} +5 -6
  130. package/esm2020/lib/core/services/patch.service.mjs +63 -0
  131. package/{esm2015/lib/core/services/platform.service.js → esm2020/lib/core/services/platform.service.mjs} +5 -5
  132. package/{esm2015/lib/core/tokens/accept-language.token.js → esm2020/lib/core/tokens/accept-language.token.mjs} +0 -0
  133. package/{esm2015/lib/core/tokens/base-url.token.js → esm2020/lib/core/tokens/base-url.token.mjs} +0 -0
  134. package/{esm2015/lib/core/tokens/cookie.token.js → esm2020/lib/core/tokens/cookie.token.mjs} +0 -0
  135. package/{esm2015/lib/core/tokens/location.token.js → esm2020/lib/core/tokens/location.token.mjs} +0 -0
  136. package/{esm2015/lib/core/tokens/navigator.token.js → esm2020/lib/core/tokens/navigator.token.mjs} +0 -0
  137. package/{esm2015/lib/core/tokens/window.token.js → esm2020/lib/core/tokens/window.token.mjs} +0 -0
  138. package/{esm2015/localize/bravobit-bb-foundation-localize.js → esm2020/localize/bravobit-bb-foundation-localize.mjs} +0 -0
  139. package/{esm2015/localize/lib/functions/date.function.js → esm2020/localize/lib/functions/date.function.mjs} +0 -0
  140. package/{esm2015/localize/lib/functions/lowercase.function.js → esm2020/localize/lib/functions/lowercase.function.mjs} +0 -0
  141. package/{esm2015/localize/lib/functions/uppercase.function.js → esm2020/localize/lib/functions/uppercase.function.mjs} +0 -0
  142. package/{esm2015/localize/lib/handlers/missing.handler.js → esm2020/localize/lib/handlers/missing.handler.mjs} +0 -0
  143. package/{esm2015/localize/lib/interfaces/config.interfaces.js → esm2020/localize/lib/interfaces/config.interfaces.mjs} +0 -0
  144. package/{esm2015/localize/lib/interfaces/dictionary.interfaces.js → esm2020/localize/lib/interfaces/dictionary.interfaces.mjs} +0 -0
  145. package/{esm2015/localize/lib/interfaces/functions.interfaces.js → esm2020/localize/lib/interfaces/functions.interfaces.mjs} +0 -0
  146. package/{esm2015/localize/lib/interfaces/handlers.interfaces.js → esm2020/localize/lib/interfaces/handlers.interfaces.mjs} +0 -0
  147. package/{esm2015/localize/lib/interfaces/options.interfaces.js → esm2020/localize/lib/interfaces/options.interfaces.mjs} +0 -0
  148. package/{esm2015/localize/lib/localizations/dutch.localization.js → esm2020/localize/lib/localizations/dutch.localization.mjs} +0 -0
  149. package/{esm2015/localize/lib/localizations/english.localization.js → esm2020/localize/lib/localizations/english.localization.mjs} +0 -0
  150. package/esm2020/localize/lib/localize.dictionary.mjs +135 -0
  151. package/{esm2015/localize/lib/localize.module.js → esm2020/localize/lib/localize.module.mjs} +5 -5
  152. package/{esm2015/localize/lib/localize.pipe.js → esm2020/localize/lib/localize.pipe.mjs} +5 -5
  153. package/esm2020/localize/lib/localize.service.mjs +277 -0
  154. package/esm2020/localize/lib/views/localize-string/localize-string.component.mjs +88 -0
  155. package/{esm2015/localize/lib/views/localize-template-or-string.directive.js → esm2020/localize/lib/views/localize-template-or-string.directive.mjs} +4 -4
  156. package/{esm2015/localize/lib/views/localize-template.directive.js → esm2020/localize/lib/views/localize-template.directive.mjs} +4 -4
  157. package/{esm2015/localize/public_api.js → esm2020/localize/public_api.mjs} +0 -0
  158. package/{esm2015/notifications/bravobit-bb-foundation-notifications.js → esm2020/notifications/bravobit-bb-foundation-notifications.mjs} +0 -0
  159. package/esm2020/notifications/lib/notifications-item/notifications-item.component.mjs +100 -0
  160. package/esm2020/notifications/lib/notifications-list/notifications-list.component.mjs +47 -0
  161. package/{esm2015/notifications/lib/notifications.animations.js → esm2020/notifications/lib/notifications.animations.mjs} +0 -0
  162. package/{esm2015/notifications/lib/notifications.injector.js → esm2020/notifications/lib/notifications.injector.mjs} +0 -0
  163. package/{esm2015/notifications/lib/notifications.interfaces.js → esm2020/notifications/lib/notifications.interfaces.mjs} +0 -0
  164. package/{esm2015/notifications/lib/notifications.module.js → esm2020/notifications/lib/notifications.module.mjs} +6 -7
  165. package/{esm2015/notifications/lib/notifications.service.js → esm2020/notifications/lib/notifications.service.mjs} +5 -5
  166. package/{esm2015/notifications/public_api.js → esm2020/notifications/public_api.mjs} +0 -0
  167. package/{esm2015/public_api.js → esm2020/public_api.mjs} +0 -0
  168. package/{esm2015/recaptcha/bravobit-bb-foundation-recaptcha.js → esm2020/recaptcha/bravobit-bb-foundation-recaptcha.mjs} +0 -0
  169. package/esm2020/recaptcha/lib/recaptcha/recaptcha.component.mjs +185 -0
  170. package/esm2020/recaptcha/lib/recaptcha-loader.service.mjs +90 -0
  171. package/{esm2015/recaptcha/lib/recaptcha.interface.js → esm2020/recaptcha/lib/recaptcha.interface.mjs} +0 -0
  172. package/{esm2015/recaptcha/lib/recaptcha.module.js → esm2020/recaptcha/lib/recaptcha.module.mjs} +5 -5
  173. package/{esm2015/recaptcha/public_api.js → esm2020/recaptcha/public_api.mjs} +0 -0
  174. package/{esm2015/rxjs/bravobit-bb-foundation-rxjs.js → esm2020/rxjs/bravobit-bb-foundation-rxjs.mjs} +0 -0
  175. package/esm2020/rxjs/lib/operators/combine-latest-map.operator.mjs +10 -0
  176. package/{esm2015/rxjs/lib/operators/filter-nil.operator.js → esm2020/rxjs/lib/operators/filter-nil.operator.mjs} +0 -0
  177. package/{esm2015/rxjs/public_api.js → esm2020/rxjs/public_api.mjs} +0 -0
  178. package/{esm2015/storage/bravobit-bb-foundation-storage.js → esm2020/storage/bravobit-bb-foundation-storage.mjs} +0 -0
  179. package/{esm2015/storage/lib/interfaces/attributes.interface.js → esm2020/storage/lib/interfaces/attributes.interface.mjs} +0 -0
  180. package/{esm2015/storage/lib/interfaces/memory.interface.js → esm2020/storage/lib/interfaces/memory.interface.mjs} +0 -0
  181. package/{esm2015/storage/lib/interfaces/strategy.interface.js → esm2020/storage/lib/interfaces/strategy.interface.mjs} +0 -0
  182. package/esm2020/storage/lib/storage.service.mjs +109 -0
  183. package/esm2020/storage/lib/strategies/cookie-storage.strategy.mjs +142 -0
  184. package/{esm2015/storage/lib/strategies/memory-storage.strategy.js → esm2020/storage/lib/strategies/memory-storage.strategy.mjs} +2 -2
  185. package/esm2020/storage/lib/strategies/polyfill-storage.strategy.mjs +102 -0
  186. package/{esm2015/storage/public_api.js → esm2020/storage/public_api.mjs} +0 -0
  187. package/{esm2015/table/bravobit-bb-foundation-table.js → esm2020/table/bravobit-bb-foundation-table.mjs} +0 -0
  188. package/esm2020/table/lib/components/table/table.component.mjs +191 -0
  189. package/esm2020/table/lib/components/table-cell/table-cell.component.mjs +11 -0
  190. package/esm2020/table/lib/components/table-header-cell/table-header-cell.component.mjs +131 -0
  191. package/esm2020/table/lib/components/table-pager/table-pager.component.mjs +136 -0
  192. package/esm2020/table/lib/data/datasource.data.mjs +32 -0
  193. package/esm2020/table/lib/data/generic.data.mjs +72 -0
  194. package/{esm2015/table/lib/interfaces/datasource.interface.js → esm2020/table/lib/interfaces/datasource.interface.mjs} +0 -0
  195. package/{esm2015/table/lib/interfaces/table.interfaces.js → esm2020/table/lib/interfaces/table.interfaces.mjs} +0 -0
  196. package/{esm2015/table/lib/table.module.js → esm2020/table/lib/table.module.mjs} +5 -5
  197. package/{esm2015/table/public_api.js → esm2020/table/public_api.mjs} +0 -0
  198. package/fesm2015/{bravobit-bb-foundation-auth.js → bravobit-bb-foundation-auth.mjs} +79 -68
  199. package/fesm2015/bravobit-bb-foundation-auth.mjs.map +1 -0
  200. package/fesm2015/{bravobit-bb-foundation-collections.js → bravobit-bb-foundation-collections.mjs} +33 -47
  201. package/fesm2015/bravobit-bb-foundation-collections.mjs.map +1 -0
  202. package/fesm2015/bravobit-bb-foundation-controls.mjs +123 -0
  203. package/fesm2015/bravobit-bb-foundation-controls.mjs.map +1 -0
  204. package/fesm2015/bravobit-bb-foundation-dashboard.mjs +416 -0
  205. package/fesm2015/bravobit-bb-foundation-dashboard.mjs.map +1 -0
  206. package/fesm2015/{bravobit-bb-foundation-dialog.js → bravobit-bb-foundation-dialog.mjs} +45 -106
  207. package/fesm2015/bravobit-bb-foundation-dialog.mjs.map +1 -0
  208. package/fesm2015/{bravobit-bb-foundation-elements.js → bravobit-bb-foundation-elements.mjs} +193 -302
  209. package/fesm2015/bravobit-bb-foundation-elements.mjs.map +1 -0
  210. package/fesm2015/{bravobit-bb-foundation-http.js → bravobit-bb-foundation-http.mjs} +18 -16
  211. package/fesm2015/bravobit-bb-foundation-http.mjs.map +1 -0
  212. package/fesm2015/{bravobit-bb-foundation-localize.js → bravobit-bb-foundation-localize.mjs} +63 -69
  213. package/fesm2015/bravobit-bb-foundation-localize.mjs.map +1 -0
  214. package/fesm2015/bravobit-bb-foundation-notifications.mjs +377 -0
  215. package/fesm2015/bravobit-bb-foundation-notifications.mjs.map +1 -0
  216. package/fesm2015/{bravobit-bb-foundation-recaptcha.js → bravobit-bb-foundation-recaptcha.mjs} +40 -47
  217. package/fesm2015/bravobit-bb-foundation-recaptcha.mjs.map +1 -0
  218. package/fesm2015/{bravobit-bb-foundation-rxjs.js → bravobit-bb-foundation-rxjs.mjs} +1 -1
  219. package/fesm2015/bravobit-bb-foundation-rxjs.mjs.map +1 -0
  220. package/fesm2015/{bravobit-bb-foundation-storage.js → bravobit-bb-foundation-storage.mjs} +12 -10
  221. package/fesm2015/bravobit-bb-foundation-storage.mjs.map +1 -0
  222. package/fesm2015/bravobit-bb-foundation-table.mjs +603 -0
  223. package/fesm2015/bravobit-bb-foundation-table.mjs.map +1 -0
  224. package/fesm2015/{bravobit-bb-foundation.js → bravobit-bb-foundation.mjs} +74 -64
  225. package/fesm2015/bravobit-bb-foundation.mjs.map +1 -0
  226. package/fesm2020/bravobit-bb-foundation-auth.mjs +928 -0
  227. package/fesm2020/bravobit-bb-foundation-auth.mjs.map +1 -0
  228. package/fesm2020/bravobit-bb-foundation-collections.mjs +434 -0
  229. package/fesm2020/bravobit-bb-foundation-collections.mjs.map +1 -0
  230. package/fesm2020/bravobit-bb-foundation-controls.mjs +121 -0
  231. package/fesm2020/bravobit-bb-foundation-controls.mjs.map +1 -0
  232. package/fesm2020/bravobit-bb-foundation-dashboard.mjs +404 -0
  233. package/fesm2020/bravobit-bb-foundation-dashboard.mjs.map +1 -0
  234. package/fesm2020/bravobit-bb-foundation-dialog.mjs +584 -0
  235. package/fesm2020/bravobit-bb-foundation-dialog.mjs.map +1 -0
  236. package/fesm2020/bravobit-bb-foundation-elements.mjs +1993 -0
  237. package/fesm2020/bravobit-bb-foundation-elements.mjs.map +1 -0
  238. package/fesm2020/bravobit-bb-foundation-http.mjs +168 -0
  239. package/fesm2020/bravobit-bb-foundation-http.mjs.map +1 -0
  240. package/fesm2020/bravobit-bb-foundation-localize.mjs +832 -0
  241. package/fesm2020/bravobit-bb-foundation-localize.mjs.map +1 -0
  242. package/fesm2020/bravobit-bb-foundation-notifications.mjs +375 -0
  243. package/fesm2020/bravobit-bb-foundation-notifications.mjs.map +1 -0
  244. package/fesm2020/bravobit-bb-foundation-recaptcha.mjs +300 -0
  245. package/fesm2020/bravobit-bb-foundation-recaptcha.mjs.map +1 -0
  246. package/fesm2020/bravobit-bb-foundation-rxjs.mjs +21 -0
  247. package/fesm2020/bravobit-bb-foundation-rxjs.mjs.map +1 -0
  248. package/fesm2020/bravobit-bb-foundation-storage.mjs +413 -0
  249. package/fesm2020/bravobit-bb-foundation-storage.mjs.map +1 -0
  250. package/fesm2020/bravobit-bb-foundation-table.mjs +592 -0
  251. package/fesm2020/bravobit-bb-foundation-table.mjs.map +1 -0
  252. package/fesm2020/bravobit-bb-foundation.mjs +895 -0
  253. package/fesm2020/bravobit-bb-foundation.mjs.map +1 -0
  254. package/http/package.json +5 -5
  255. package/localize/package.json +5 -5
  256. package/notifications/package.json +5 -5
  257. package/package.json +125 -8
  258. package/recaptcha/package.json +5 -5
  259. package/rxjs/package.json +5 -5
  260. package/storage/package.json +5 -5
  261. package/table/lib/components/table/table.component.d.ts +3 -0
  262. package/table/package.json +5 -5
  263. package/bundles/bravobit-bb-foundation-auth.umd.js +0 -1483
  264. package/bundles/bravobit-bb-foundation-auth.umd.js.map +0 -1
  265. package/bundles/bravobit-bb-foundation-collections.umd.js +0 -868
  266. package/bundles/bravobit-bb-foundation-collections.umd.js.map +0 -1
  267. package/bundles/bravobit-bb-foundation-dashboard.umd.js +0 -876
  268. package/bundles/bravobit-bb-foundation-dashboard.umd.js.map +0 -1
  269. package/bundles/bravobit-bb-foundation-dialog.umd.js +0 -716
  270. package/bundles/bravobit-bb-foundation-dialog.umd.js.map +0 -1
  271. package/bundles/bravobit-bb-foundation-elements.umd.js +0 -2768
  272. package/bundles/bravobit-bb-foundation-elements.umd.js.map +0 -1
  273. package/bundles/bravobit-bb-foundation-http.umd.js +0 -535
  274. package/bundles/bravobit-bb-foundation-http.umd.js.map +0 -1
  275. package/bundles/bravobit-bb-foundation-localize.umd.js +0 -1292
  276. package/bundles/bravobit-bb-foundation-localize.umd.js.map +0 -1
  277. package/bundles/bravobit-bb-foundation-notifications.umd.js +0 -794
  278. package/bundles/bravobit-bb-foundation-notifications.umd.js.map +0 -1
  279. package/bundles/bravobit-bb-foundation-recaptcha.umd.js +0 -683
  280. package/bundles/bravobit-bb-foundation-recaptcha.umd.js.map +0 -1
  281. package/bundles/bravobit-bb-foundation-rxjs.umd.js +0 -29
  282. package/bundles/bravobit-bb-foundation-rxjs.umd.js.map +0 -1
  283. package/bundles/bravobit-bb-foundation-storage.umd.js +0 -799
  284. package/bundles/bravobit-bb-foundation-storage.umd.js.map +0 -1
  285. package/bundles/bravobit-bb-foundation-table.umd.js +0 -1070
  286. package/bundles/bravobit-bb-foundation-table.umd.js.map +0 -1
  287. package/bundles/bravobit-bb-foundation.umd.js +0 -1440
  288. package/bundles/bravobit-bb-foundation.umd.js.map +0 -1
  289. package/esm2015/auth/lib/auth.interceptor.js +0 -95
  290. package/esm2015/auth/lib/auth.service.js +0 -299
  291. package/esm2015/auth/lib/auth.session.js +0 -136
  292. package/esm2015/auth/lib/directives/permission.directive.js +0 -81
  293. package/esm2015/auth/lib/directives/role.directive.js +0 -38
  294. package/esm2015/auth/lib/guards/anonymous.guard.js +0 -35
  295. package/esm2015/auth/lib/guards/authenticated.guard.js +0 -36
  296. package/esm2015/auth/lib/permissions.service.js +0 -58
  297. package/esm2015/auth/lib/providers/email.provider.js +0 -26
  298. package/esm2015/auth/lib/providers/verify.provider.js +0 -20
  299. package/esm2015/collections/lib/collection.js +0 -104
  300. package/esm2015/collections/lib/components/collections-pager/collections-pager.component.js +0 -136
  301. package/esm2015/collections/lib/components/collections-viewer/collections-viewer.component.js +0 -39
  302. package/esm2015/collections/lib/providers/api-collection.provider.js +0 -69
  303. package/esm2015/collections/lib/providers/collection.provider.js +0 -14
  304. package/esm2015/dashboard/lib/dashboard/dashboard.component.js +0 -64
  305. package/esm2015/dashboard/lib/dashboard-header/dashboard-header.component.js +0 -41
  306. package/esm2015/dashboard/lib/dashboard-menu/dashboard-menu.component.js +0 -39
  307. package/esm2015/dashboard/lib/dashboard-menu-item/dashboard-menu-item.component.js +0 -38
  308. package/esm2015/dashboard/lib/dashboard-sidebar/dashboard-sidebar.component.js +0 -83
  309. package/esm2015/dashboard/lib/dashboard-sidebar-group/dashboard-sidebar-group.component.js +0 -110
  310. package/esm2015/dashboard/lib/dashboard-sidebar-item/dashboard-sidebar-item.component.js +0 -71
  311. package/esm2015/dialog/lib/dialog-actions/dialog-actions.component.js +0 -20
  312. package/esm2015/dialog/lib/dialog-confirm/dialog-confirm.component.js +0 -45
  313. package/esm2015/dialog/lib/dialog-header/dialog-header.component.js +0 -33
  314. package/esm2015/dialog/lib/dialog-link/dialog-link.component.js +0 -19
  315. package/esm2015/dialog/lib/dialog-modal/dialog-modal.component.js +0 -54
  316. package/esm2015/dialog/lib/dialog-overlay/dialog-overlay.component.js +0 -143
  317. package/esm2015/elements/lib/avatar/avatar.component.js +0 -151
  318. package/esm2015/elements/lib/button/button.component.js +0 -79
  319. package/esm2015/elements/lib/checkbox/checkbox.component.js +0 -83
  320. package/esm2015/elements/lib/date-picker/date-picker.component.js +0 -322
  321. package/esm2015/elements/lib/directives/autosize.directive.js +0 -74
  322. package/esm2015/elements/lib/directives/form-submit.directive.js +0 -53
  323. package/esm2015/elements/lib/directives/input.directive.js +0 -139
  324. package/esm2015/elements/lib/dropdown/dropdown.component.js +0 -111
  325. package/esm2015/elements/lib/file-picker/file-picker.component.js +0 -247
  326. package/esm2015/elements/lib/form-control/form-control.component.js +0 -58
  327. package/esm2015/elements/lib/form-error/form-error.component.js +0 -116
  328. package/esm2015/elements/lib/form-group/form-group.component.js +0 -27
  329. package/esm2015/elements/lib/icon/icon.component.js +0 -110
  330. package/esm2015/elements/lib/image-picker/image-picker.component.js +0 -119
  331. package/esm2015/elements/lib/pipes/file-image.pipe.js +0 -45
  332. package/esm2015/elements/lib/pipes/relative-time.pipe.js +0 -96
  333. package/esm2015/elements/lib/spinner/spinner.component.js +0 -34
  334. package/esm2015/elements/lib/tag/tag.component.js +0 -26
  335. package/esm2015/http/lib/classes/http.config.js +0 -31
  336. package/esm2015/http/lib/classes/http.error.js +0 -21
  337. package/esm2015/http/lib/interceptors/base-url.interceptor.js +0 -52
  338. package/esm2015/http/lib/interceptors/error.interceptor.js +0 -33
  339. package/esm2015/lib/core/miscellaneous/validator.js +0 -86
  340. package/esm2015/lib/core/services/clipboard.service.js +0 -72
  341. package/esm2015/lib/core/services/exif.service.js +0 -168
  342. package/esm2015/lib/core/services/file-loader.service.js +0 -90
  343. package/esm2015/lib/core/services/image-converter.service.js +0 -130
  344. package/esm2015/lib/core/services/patch.service.js +0 -65
  345. package/esm2015/localize/lib/localize.dictionary.js +0 -137
  346. package/esm2015/localize/lib/localize.service.js +0 -282
  347. package/esm2015/localize/lib/views/localize-string/localize-string.component.js +0 -99
  348. package/esm2015/notifications/lib/notifications-item/notifications-item.component.js +0 -108
  349. package/esm2015/notifications/lib/notifications-list/notifications-list.component.js +0 -56
  350. package/esm2015/recaptcha/lib/recaptcha/recaptcha.component.js +0 -199
  351. package/esm2015/recaptcha/lib/recaptcha-loader.service.js +0 -93
  352. package/esm2015/rxjs/lib/operators/combine-latest-map.operator.js +0 -7
  353. package/esm2015/storage/lib/storage.service.js +0 -111
  354. package/esm2015/storage/lib/strategies/cookie-storage.strategy.js +0 -143
  355. package/esm2015/storage/lib/strategies/polyfill-storage.strategy.js +0 -102
  356. package/esm2015/table/lib/components/table/table.component.js +0 -196
  357. package/esm2015/table/lib/components/table-cell/table-cell.component.js +0 -19
  358. package/esm2015/table/lib/components/table-header-cell/table-header-cell.component.js +0 -141
  359. package/esm2015/table/lib/components/table-pager/table-pager.component.js +0 -146
  360. package/esm2015/table/lib/data/datasource.data.js +0 -32
  361. package/esm2015/table/lib/data/generic.data.js +0 -73
  362. package/fesm2015/bravobit-bb-foundation-auth.js.map +0 -1
  363. package/fesm2015/bravobit-bb-foundation-collections.js.map +0 -1
  364. package/fesm2015/bravobit-bb-foundation-dashboard.js +0 -468
  365. package/fesm2015/bravobit-bb-foundation-dashboard.js.map +0 -1
  366. package/fesm2015/bravobit-bb-foundation-dialog.js.map +0 -1
  367. package/fesm2015/bravobit-bb-foundation-elements.js.map +0 -1
  368. package/fesm2015/bravobit-bb-foundation-http.js.map +0 -1
  369. package/fesm2015/bravobit-bb-foundation-localize.js.map +0 -1
  370. package/fesm2015/bravobit-bb-foundation-notifications.js +0 -393
  371. package/fesm2015/bravobit-bb-foundation-notifications.js.map +0 -1
  372. package/fesm2015/bravobit-bb-foundation-recaptcha.js.map +0 -1
  373. package/fesm2015/bravobit-bb-foundation-rxjs.js.map +0 -1
  374. package/fesm2015/bravobit-bb-foundation-storage.js.map +0 -1
  375. package/fesm2015/bravobit-bb-foundation-table.js +0 -626
  376. package/fesm2015/bravobit-bb-foundation-table.js.map +0 -1
  377. package/fesm2015/bravobit-bb-foundation.js.map +0 -1
@@ -0,0 +1,142 @@
1
+ export class CookieStorage {
2
+ constructor(_isBrowser, _cookieString) {
3
+ this._isBrowser = _isBrowser;
4
+ this._cookieString = _cookieString;
5
+ // State.
6
+ this._isSupported = false;
7
+ this.decode = (cookieString) => {
8
+ const result = {};
9
+ const cookies = cookieString ? cookieString.split('; ') : [];
10
+ const rdecode = /(%[0-9A-Z]{2})+/g;
11
+ for (let index = 0; index < cookies.length; index++) {
12
+ const parts = cookies[index].split('=');
13
+ let cookie = parts.slice(1).join('=');
14
+ if (cookie.charAt(0) === '"') {
15
+ cookie = cookie.slice(1, -1);
16
+ }
17
+ try {
18
+ const name = parts[0].replace(rdecode, decodeURIComponent);
19
+ const value = cookie.replace(rdecode, decodeURIComponent);
20
+ result[name] = this.jsonParse(value);
21
+ }
22
+ catch {
23
+ // Ignore cookies with an invalid name/value encoding.
24
+ }
25
+ }
26
+ return result;
27
+ };
28
+ this.jsonParse = (rawValue) => {
29
+ // Try to parse the data.
30
+ let parsedValue = undefined;
31
+ // Only parse the value when it is not null.
32
+ if (rawValue !== undefined) {
33
+ try {
34
+ parsedValue = JSON.parse(rawValue);
35
+ }
36
+ catch {
37
+ // The string could not be parsed to JSON.
38
+ }
39
+ }
40
+ // Return the parsed value.
41
+ return parsedValue;
42
+ };
43
+ this.stringifyAttribute = (token, value) => {
44
+ if (!value) {
45
+ return '';
46
+ }
47
+ const stringified = `; ${token}`;
48
+ // Boolean attributes should not have a value.
49
+ if (value === true) {
50
+ return stringified;
51
+ }
52
+ return stringified + `= ${value}`;
53
+ };
54
+ this.testIfSupported = () => {
55
+ // We are using an aggressive test here, because we cannot rely on navigator.cookieEnabled
56
+ // it does not return the correct value at all times.
57
+ const testCookieString = `bbcookietest`;
58
+ try {
59
+ document.cookie = `${testCookieString}=1`;
60
+ const result = document.cookie.indexOf(`${testCookieString}=`) !== -1;
61
+ document.cookie = `${testCookieString}=1; expires=Thu, 01-Jan-1970 00:00:01 GMT`;
62
+ return result;
63
+ }
64
+ catch {
65
+ return false;
66
+ }
67
+ };
68
+ // Check if the storage is supported.
69
+ this._isSupported = this.testIfSupported();
70
+ }
71
+ get(token) {
72
+ // Get all values and pick one out.
73
+ const values = this.all();
74
+ return values?.[token];
75
+ }
76
+ set(token, value, attributes) {
77
+ // Validate that the storage is supported.
78
+ if (!this._isSupported) {
79
+ return;
80
+ }
81
+ // Write a new cookie.
82
+ document.cookie = this.encode(token, value, { path: '/', sameSite: 'Lax', ...attributes });
83
+ }
84
+ remove(token, attributes) {
85
+ // Validate that the storage is supported.
86
+ if (!this._isSupported) {
87
+ return;
88
+ }
89
+ this.set(token, '', { ...attributes, expires: -1 });
90
+ }
91
+ clear(attributes) {
92
+ // Validate that the storage is supported.
93
+ if (!this._isSupported) {
94
+ return;
95
+ }
96
+ const items = this.all();
97
+ for (const token in items) {
98
+ this.remove(token, attributes);
99
+ }
100
+ }
101
+ isSupported() {
102
+ return this._isSupported;
103
+ }
104
+ all() {
105
+ const cookieString = this._isBrowser
106
+ ? document?.cookie
107
+ : this._cookieString;
108
+ return this.decode(cookieString);
109
+ }
110
+ encode(token, value, attributes) {
111
+ // Encode the token.
112
+ const encodedToken = encodeURIComponent(token)
113
+ .replace(/%(23|24|26|2B|5E|60|7C)/g, decodeURIComponent)
114
+ .replace(/\(/g, '%28').replace(/\)/g, '%29');
115
+ const rawValue = JSON.stringify(value);
116
+ // Encode the value.
117
+ const encodedValue = encodeURIComponent(rawValue)
118
+ .replace(/%(23|24|26|2B|3A|3C|3E|3D|2F|3F|40|5B|5D|5E|60|7B|7D|7C)/g, decodeURIComponent);
119
+ // Return the completed encoded string.
120
+ return [encodedToken, '=', encodedValue, this.stringifyCookie(attributes)].join('');
121
+ }
122
+ stringifyCookie(attributes) {
123
+ // Make sure the expires attribute is a date and not a number.
124
+ if (typeof attributes.expires === 'number') {
125
+ const expires = new Date();
126
+ expires.setMilliseconds(expires.getMilliseconds() + attributes.expires * 864e+5);
127
+ attributes.expires = expires;
128
+ }
129
+ // Force secure when sameSite=None.
130
+ if (attributes.sameSite === 'None') {
131
+ attributes.secure = true;
132
+ console?.warn?.('Cooke was forced with secure flag because sameSite=None');
133
+ }
134
+ // Stringify all attributes.
135
+ return this.stringifyAttribute('Expires', attributes.expires ? attributes.expires.toUTCString() : '')
136
+ + this.stringifyAttribute('Domain', attributes.domain)
137
+ + this.stringifyAttribute('Path', attributes.path)
138
+ + this.stringifyAttribute('Secure', attributes.secure)
139
+ + this.stringifyAttribute('SameSite', attributes.sameSite);
140
+ }
141
+ }
142
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29va2llLXN0b3JhZ2Uuc3RyYXRlZ3kuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9iYi1mb3VuZGF0aW9uL3N0b3JhZ2Uvc3JjL2xpYi9zdHJhdGVnaWVzL2Nvb2tpZS1zdG9yYWdlLnN0cmF0ZWd5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBLE1BQU0sT0FBTyxhQUFhO0lBS3RCLFlBQW9CLFVBQW1CLEVBQ25CLGFBQXNCO1FBRHRCLGVBQVUsR0FBVixVQUFVLENBQVM7UUFDbkIsa0JBQWEsR0FBYixhQUFhLENBQVM7UUFKMUMsU0FBUztRQUNRLGlCQUFZLEdBQVksS0FBSyxDQUFDO1FBMEV2QyxXQUFNLEdBQUcsQ0FBQyxZQUFvQixFQUFFLEVBQUU7WUFDdEMsTUFBTSxNQUFNLEdBQTZCLEVBQUUsQ0FBQztZQUM1QyxNQUFNLE9BQU8sR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUM3RCxNQUFNLE9BQU8sR0FBRyxrQkFBa0IsQ0FBQztZQUVuQyxLQUFLLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRSxLQUFLLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRTtnQkFDakQsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDeEMsSUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBRXRDLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLEVBQUU7b0JBQzFCLE1BQU0sR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUNo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LFVBQVUsRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDbkUsQ0FBQztDQStCSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29va2llU3RvcmFnZUF0dHJpYnV0ZXN9IGZyb20gJy4uL2ludGVyZmFjZXMvYXR0cmlidXRlcy5pbnRlcmZhY2UnO1xuaW1wb3J0IHtTdG9yYWdlU3RyYXRlZ3l9IGZyb20gJy4uL2ludGVyZmFjZXMvc3RyYXRlZ3kuaW50ZXJmYWNlJztcblxuZXhwb3J0IGNsYXNzIENvb2tpZVN0b3JhZ2UgaW1wbGVtZW50cyBTdG9yYWdlU3RyYXRlZ3kge1xuXG4gICAgLy8gU3RhdGUuXG4gICAgcHJpdmF0ZSByZWFkb25seSBfaXNTdXBwb3J0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgX2lzQnJvd3NlcjogYm9vbGVhbixcbiAgICAgICAgICAgICAgICBwcml2YXRlIF9jb29raWVTdHJpbmc/OiBzdHJpbmcpIHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHN0b3JhZ2UgaXMgc3VwcG9ydGVkLlxuICAgICAgICB0aGlzLl9pc1N1cHBvcnRlZCA9IHRoaXMudGVzdElmU3VwcG9ydGVkKCk7XG4gICAgfVxuXG4gICAgZ2V0PFQgPSBhbnk+KHRva2VuOiBzdHJpbmcpIHtcbiAgICAgICAgLy8gR2V0IGFsbCB2YWx1ZXMgYW5kIHBpY2sgb25lIG91dC5cbiAgICAgICAgY29uc3QgdmFsdWVzID0gdGhpcy5hbGwoKTtcbiAgICAgICAgcmV0dXJuIHZhbHVlcz8uW3Rva2VuXSBhcyBUO1xuICAgIH1cblxuICAgIHNldDxUID0gYW55Pih0b2tlbjogc3RyaW5nLCB2YWx1ZTogVCwgYXR0cmlidXRlcz86IENvb2tpZVN0b3JhZ2VBdHRyaWJ1dGVzKSB7XG4gICAgICAgIC8vIFZhbGlkYXRlIHRoYXQgdGhlIHN0b3JhZ2UgaXMgc3VwcG9ydGVkLlxuICAgICAgICBpZiAoIXRoaXMuX2lzU3VwcG9ydGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBXcml0ZSBhIG5ldyBjb29raWUuXG4gICAgICAgIGRvY3VtZW50LmNvb2tpZSA9IHRoaXMuZW5jb2RlKHRva2VuLCB2YWx1ZSwge3BhdGg6ICcvJywgc2FtZVNpdGU6ICdMYXgnLCAuLi5hdHRyaWJ1dGVzfSk7XG4gICAgfVxuXG4gICAgcmVtb3ZlKHRva2VuOiBzdHJpbmcsIGF0dHJpYnV0ZXM/OiBDb29raWVTdG9yYWdlQXR0cmlidXRlcykge1xuICAgICAgICAvLyBWYWxpZGF0ZSB0aGF0IHRoZSBzdG9yYWdlIGlzIHN1cHBvcnRlZC5cbiAgICAgICAgaWYgKCF0aGlzLl9pc1N1cHBvcnRlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZXQodG9rZW4sICcnLCB7Li4uYXR0cmlidXRlcywgZXhwaXJlczogLTF9KTtcbiAgICB9XG5cbiAgICBjbGVhcihhdHRyaWJ1dGVzPzogQ29va2llU3RvcmFnZUF0dHJpYnV0ZXMpIHtcbiAgICAgICAgLy8gVmFsaWRhdGUgdGhhdCB0aGUgc3RvcmFnZSBpcyBzdXBwb3J0ZWQuXG4gICAgICAgIGlmICghdGhpcy5faXNTdXBwb3J0ZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5hbGwoKTtcblxuICAgICAgICBmb3IgKGNvbnN0IHRva2VuIGluIGl0ZW1zKSB7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZSh0b2tlbiwgYXR0cmlidXRlcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpc1N1cHBvcnRlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzU3VwcG9ydGVkO1xuICAgIH1cblxuICAgIHByaXZhdGUgYWxsKCkge1xuICAgICAgICBjb25zdCBjb29raWVTdHJpbmcgPSB0aGlzLl9pc0Jyb3dzZXJcbiAgICAgICAgICAgID8gZG9jdW1lbnQ/LmNvb2tpZVxuICAgICAgICAgICAgOiB0aGlzLl9jb29raWVTdHJpbmc7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZGVjb2RlKGNvb2tpZVN0cmluZyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBlbmNvZGUodG9rZW46IHN0cmluZywgdmFsdWU6IGFueSwgYXR0cmlidXRlczogQ29va2llU3RvcmFnZUF0dHJpYnV0ZXMpIHtcbiAgICAgICAgLy8gRW5jb2RlIHRoZSB0b2tlbi5cbiAgICAgICAgY29uc3QgZW5jb2RlZFRva2VuID0gZW5jb2RlVVJJQ29tcG9uZW50KHRva2VuKVxuICAgICAgICAgICAgLnJlcGxhY2UoLyUoMjN8MjR8MjZ8MkJ8NUV8NjB8N0MpL2csIGRlY29kZVVSSUNvbXBvbmVudClcbiAgICAgICAgICAgIC5yZXBsYWNlKC9cXCgvZywgJyUyOCcpLnJlcGxhY2UoL1xcKS9nLCAnJTI5Jyk7XG5cbiAgICAgICAgY29uc3QgcmF3VmFsdWUgPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG5cbiAgICAgICAgLy8gRW5jb2RlIHRoZSB2YWx1ZS5cbiAgICAgICAgY29uc3QgZW5jb2RlZFZhbHVlID0gZW5jb2RlVVJJQ29tcG9uZW50KHJhd1ZhbHVlKVxuICAgICAgICAgICAgLnJlcGxhY2UoLyUoMjN8MjR8MjZ8MkJ8M0F8M0N8M0V8M0R8MkZ8M0Z8NDB8NUJ8NUR8NUV8NjB8N0J8N0R8N0MpL2csIGRlY29kZVVSSUNvbXBvbmVudCk7XG5cbiAgICAgICAgLy8gUmV0dXJuIHRoZSBjb21wbGV0ZWQgZW5jb2RlZCBzdHJpbmcuXG4gICAgICAgIHJldHVybiBbZW5jb2RlZFRva2VuLCAnPScsIGVuY29kZWRWYWx1ZSwgdGhpcy5zdHJpbmdpZnlDb29raWUoYXR0cmlidXRlcyldLmpvaW4oJycpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZGVjb2RlID0gKGNvb2tpZVN0cmluZzogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdDogeyBbdG9rZW46IHN0cmluZ106IGFueSB9ID0ge307XG4gICAgICAgIGNvbnN0IGNvb2tpZXMgPSBjb29raWVTdHJpbmcgPyBjb29raWVTdHJpbmcuc3BsaXQoJzsgJykgOiBbXTtcbiAgICAgICAgY29uc3QgcmRlY29kZSA9IC8oJVswLTlBLVpdezJ9KSsvZztcblxuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgY29va2llcy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcnRzID0gY29va2llc1tpbmRleF0uc3BsaXQoJz0nKTtcbiAgICAgICAgICAgIGxldCBjb29raWUgPSBwYXJ0cy5zbGljZSgxKS5qb2luKCc9Jyk7XG5cbiAgICAgICAgICAgIGlmIChjb29raWUuY2hhckF0KDApID09PSAnXCInKSB7XG4gICAgICAgICAgICAgICAgY29va2llID0gY29va2llLnNsaWNlKDEsIC0xKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCBuYW1lID0gcGFydHNbMF0ucmVwbGFjZShyZGVjb2RlLCBkZWNvZGVVUklDb21wb25lbnQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gY29va2llLnJlcGxhY2UocmRlY29kZSwgZGVjb2RlVVJJQ29tcG9uZW50KTtcbiAgICAgICAgICAgICAgICByZXN1bHRbbmFtZV0gPSB0aGlzLmpzb25QYXJzZSh2YWx1ZSk7XG4gICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAvLyBJZ25vcmUgY29va2llcyB3aXRoIGFuIGludmFsaWQgbmFtZS92YWx1ZSBlbmNvZGluZy5cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcblxuICAgIHByaXZhdGUganNvblBhcnNlID0gPFQgPSBhbnk+KHJhd1ZhbHVlOiBzdHJpbmcpID0+IHtcbiAgICAgICAgLy8gVHJ5IHRvIHBhcnNlIHRoZSBkYXRhLlxuICAgICAgICBsZXQgcGFyc2VkVmFsdWU6IFQgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgLy8gT25seSBwYXJzZSB0aGUgdmFsdWUgd2hlbiBpdCBpcyBub3QgbnVsbC5cbiAgICAgICAgaWYgKHJhd1ZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcGFyc2VkVmFsdWUgPSBKU09OLnBhcnNlKHJhd1ZhbHVlKTtcbiAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgIC8vIFRoZSBzdHJpbmcgY291bGQgbm90IGJlIHBhcnNlZCB0byBKU09OLlxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmV0dXJuIHRoZSBwYXJzZWQgdmFsdWUuXG4gICAgICAgIHJldHVybiBwYXJzZWRWYWx1ZTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBzdHJpbmdpZnlDb29raWUoYXR0cmlidXRlczogQ29va2llU3RvcmFnZUF0dHJpYnV0ZXMpIHtcbiAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBleHBpcmVzIGF0dHJpYnV0ZSBpcyBhIGRhdGUgYW5kIG5vdCBhIG51bWJlci5cbiAgICAgICAgaWYgKHR5cGVvZiBhdHRyaWJ1dGVzLmV4cGlyZXMgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICBjb25zdCBleHBpcmVzID0gbmV3IERhdGUoKTtcbiAgICAgICAgICAgIGV4cGlyZXMuc2V0TWlsbGlzZWNvbmRzKGV4cGlyZXMuZ2V0TWlsbGlzZWNvbmRzKCkgKyBhdHRyaWJ1dGVzLmV4cGlyZXMgKiA4NjRlKzUpO1xuICAgICAgICAgICAgYXR0cmlidXRlcy5leHBpcmVzID0gZXhwaXJlcztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEZvcmNlIHNlY3VyZSB3aGVuIHNhbWVTaXRlPU5vbmUuXG4gICAgICAgIGlmIChhdHRyaWJ1dGVzLnNhbWVTaXRlID09PSAnTm9uZScpIHtcbiAgICAgICAgICAgIGF0dHJpYnV0ZXMuc2VjdXJlID0gdHJ1ZTtcbiAgICAgICAgICAgIGNvbnNvbGU/Lndhcm4/LignQ29va2Ugd2FzIGZvcmNlZCB3aXRoIHNlY3VyZSBmbGFnIGJlY2F1c2Ugc2FtZVNpdGU9Tm9uZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU3RyaW5naWZ5IGFsbCBhdHRyaWJ1dGVzLlxuICAgICAgICByZXR1cm4gdGhpcy5zdHJpbmdpZnlBdHRyaWJ1dGUoJ0V4cGlyZXMnLCBhdHRyaWJ1dGVzLmV4cGlyZXMgPyBhdHRyaWJ1dGVzLmV4cGlyZXMudG9VVENTdHJpbmcoKSA6ICcnKVxuICAgICAgICAgICAgKyB0aGlzLnN0cmluZ2lmeUF0dHJpYnV0ZSgnRG9tYWluJywgYXR0cmlidXRlcy5kb21haW4pXG4gICAgICAgICAgICArIHRoaXMuc3RyaW5naWZ5QXR0cmlidXRlKCdQYXRoJywgYXR0cmlidXRlcy5wYXRoKVxuICAgICAgICAgICAgKyB0aGlzLnN0cmluZ2lmeUF0dHJpYnV0ZSgnU2VjdXJlJywgYXR0cmlidXRlcy5zZWN1cmUpXG4gICAgICAgICAgICArIHRoaXMuc3RyaW5naWZ5QXR0cmlidXRlKCdTYW1lU2l0ZScsIGF0dHJpYnV0ZXMuc2FtZVNpdGUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RyaW5naWZ5QXR0cmlidXRlID0gKHRva2VuOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcgfCBib29sZWFuIHwgdW5kZWZpbmVkKSA9PiB7XG4gICAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN0cmluZ2lmaWVkID0gYDsgJHt0b2tlbn1gO1xuXG4gICAgICAgIC8vIEJvb2xlYW4gYXR0cmlidXRlcyBzaG91bGQgbm90IGhhdmUgYSB2YWx1ZS5cbiAgICAgICAgaWYgKHZhbHVlID09PSB0cnVlKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5naWZpZWQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc3RyaW5naWZpZWQgKyBgPSAke3ZhbHVlfWA7XG4gICAgfTtcblxuICAgIHByaXZhdGUgdGVzdElmU3VwcG9ydGVkID0gKCkgPT4ge1xuICAgICAgICAvLyBXZSBhcmUgdXNpbmcgYW4gYWdncmVzc2l2ZSB0ZXN0IGhlcmUsIGJlY2F1c2Ugd2UgY2Fubm90IHJlbHkgb24gbmF2aWdhdG9yLmNvb2tpZUVuYWJsZWRcbiAgICAgICAgLy8gaXQgZG9lcyBub3QgcmV0dXJuIHRoZSBjb3JyZWN0IHZhbHVlIGF0IGFsbCB0aW1lcy5cbiAgICAgICAgY29uc3QgdGVzdENvb2tpZVN0cmluZyA9IGBiYmNvb2tpZXRlc3RgO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZG9jdW1lbnQuY29va2llID0gYCR7dGVzdENvb2tpZVN0cmluZ309MWA7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBkb2N1bWVudC5jb29raWUuaW5kZXhPZihgJHt0ZXN0Q29va2llU3RyaW5nfT1gKSAhPT0gLTE7XG4gICAgICAgICAgICBkb2N1bWVudC5jb29raWUgPSBgJHt0ZXN0Q29va2llU3RyaW5nfT0xOyBleHBpcmVzPVRodSwgMDEtSmFuLTE5NzAgMDA6MDA6MDEgR01UYDtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfTtcblxufVxuIl19
@@ -40,7 +40,7 @@ export class MemoryStorage {
40
40
  }
41
41
  set(token, value, attributes) {
42
42
  // Save the encoded value with the attributes.
43
- this._storage[token] = this.encode(value, Object.assign({}, attributes));
43
+ this._storage[token] = this.encode(value, { ...attributes });
44
44
  }
45
45
  remove(token) {
46
46
  delete this._storage[token];
@@ -53,4 +53,4 @@ export class MemoryStorage {
53
53
  return true;
54
54
  }
55
55
  }
56
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVtb3J5LXN0b3JhZ2Uuc3RyYXRlZ3kuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9iYi1mb3VuZGF0aW9uL3N0b3JhZ2Uvc3JjL2xpYi9zdHJhdGVnaWVzL21lbW9yeS1zdG9yYWdlLnN0cmF0ZWd5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUlBLE1BQU0sT0FBTyxhQUFhO0lBQTFCO1FBRUksU0FBUztRQUNELGFBQVEsR0FBc0IsRUFBRSxDQUFDO1FBZ0RqQyxXQUFNLEdBQUcsQ0FBSSxLQUFRLEVBQUUsVUFBbUMsRUFBRSxFQUFFO1lBQ2xFLE1BQU0sSUFBSSxHQUFHLEVBQUMsS0FBSyxFQUFDLENBQUM7WUFFckIsMENBQTBDO1lBQzFDLElBQUksT0FBTyxVQUFVLENBQUMsT0FBTyxLQUFLLFFBQVEsRUFBRTtnQkFDeEMsVUFBVSxDQUFDLE9BQU8sR0FBRyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7YUFDckQ7WUFFRCxxQ0FBcUM7WUFDckMsSUFBSSxVQUFVLENBQUMsT0FBTyxFQUFFO2dCQUNwQixJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQzthQUN4QztZQUVELDJCQUEyQjtZQUMzQixPQUFPLElBQUksQ0FBQztRQUNoQixDQUFDLENBQUM7SUFFTixDQUFDO0lBL0RHLEdBQUcsQ0FBVSxLQUFhO1FBQ3RCLHlDQUF5QztRQUN6QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXBDLDRCQUE0QjtRQUM1QixJQUFJLE1BQU0sS0FBSyxTQUFTLEVBQUU7WUFDdEIsT0FBTyxTQUFTLENBQUM7U0FDcEI7UUFFRCxxQ0FBcUM7UUFDckMsTUFBTSxFQUFDLEtBQUssRUFBRSxPQUFPLEVBQUMsR0FBRyxNQUFNLENBQUM7UUFFaEMscUNBQXFDO1FBQ3JDLElBQUksT0FBTyxLQUFLLFNBQVMsRUFBRTtZQUN2QixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDdkIsTUFBTSxVQUFVLEdBQUcsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7WUFFL0MscUNBQXFDO1lBQ3JDLElBQUksVUFBVSxJQUFJLEdBQUcsRUFBRTtnQkFDbkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDbkIsT0FBTyxTQUFTLENBQUM7YUFDcEI7U0FDSjtRQUVELG9CQUFvQjtRQUNwQixPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBRUQsR0FBRyxDQUFVLEtBQWEsRUFBRSxLQUFRLEVBQUUsVUFBb0M7UUFDdEUsOENBQThDO1FBQzlDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBSSxLQUFLLG9CQUFNLFVBQVUsRUFBRSxDQUFDO0lBQ2xFLENBQUM7SUFFRCxNQUFNLENBQUMsS0FBYTtRQUNoQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVELEtBQUs7UUFDRCxJQUFJLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBRUQsV0FBVztRQUNQLDBDQUEwQztRQUMxQyxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0NBbUJKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtNZW1vcnlTdG9yYWdlQXR0cmlidXRlc30gZnJvbSAnLi4vaW50ZXJmYWNlcy9hdHRyaWJ1dGVzLmludGVyZmFjZSc7XG5pbXBvcnQge01lbW9yeVN0b3JhZ2VEYXRhfSBmcm9tICcuLi9pbnRlcmZhY2VzL21lbW9yeS5pbnRlcmZhY2UnO1xuaW1wb3J0IHtTdG9yYWdlU3RyYXRlZ3l9IGZyb20gJy4uL2ludGVyZmFjZXMvc3RyYXRlZ3kuaW50ZXJmYWNlJztcblxuZXhwb3J0IGNsYXNzIE1lbW9yeVN0b3JhZ2UgaW1wbGVtZW50cyBTdG9yYWdlU3RyYXRlZ3kge1xuXG4gICAgLy8gU3RhdGUuXG4gICAgcHJpdmF0ZSBfc3RvcmFnZTogTWVtb3J5U3RvcmFnZURhdGEgPSB7fTtcblxuICAgIGdldDxUID0gYW55Pih0b2tlbjogc3RyaW5nKTogVCB7XG4gICAgICAgIC8vIEdyYWIgdGhlIGRhdGEgZnJvbSB0aGUgbWVtb3J5IHN0b3JhZ2UuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuX3N0b3JhZ2VbdG9rZW5dO1xuXG4gICAgICAgIC8vIFZhbGlkYXRlIHRoZSBkYXRhIGV4aXN0cy5cbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRXh0cmFjdCB0aGUgdmFsdWUgYW5kIGV4cGlyZSBkYXRlLlxuICAgICAgICBjb25zdCB7dmFsdWUsIGV4cGlyZXN9ID0gcmVzdWx0O1xuXG4gICAgICAgIC8vIFZhbGlkYXRlIHRoZSB2YWx1ZSBpcyBzdGlsbCB2YWxpZC5cbiAgICAgICAgaWYgKGV4cGlyZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgIGNvbnN0IGV4cGlyZURhdGUgPSBuZXcgRGF0ZShleHBpcmVzKS5nZXRUaW1lKCk7XG5cbiAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgdmFsdWUgaWYgaXQgaXMgZXhwaXJlZC5cbiAgICAgICAgICAgIGlmIChleHBpcmVEYXRlIDw9IG5vdykge1xuICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlKHRva2VuKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmV0dXJuIHRoZSB2YWx1ZS5cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIHNldDxUID0gYW55Pih0b2tlbjogc3RyaW5nLCB2YWx1ZTogVCwgYXR0cmlidXRlcz86IE1lbW9yeVN0b3JhZ2VBdHRyaWJ1dGVzKSB7XG4gICAgICAgIC8vIFNhdmUgdGhlIGVuY29kZWQgdmFsdWUgd2l0aCB0aGUgYXR0cmlidXRlcy5cbiAgICAgICAgdGhpcy5fc3RvcmFnZVt0b2tlbl0gPSB0aGlzLmVuY29kZTxUPih2YWx1ZSwgey4uLmF0dHJpYnV0ZXN9KTtcbiAgICB9XG5cbiAgICByZW1vdmUodG9rZW46IHN0cmluZykge1xuICAgICAgICBkZWxldGUgdGhpcy5fc3RvcmFnZVt0b2tlbl07XG4gICAgfVxuXG4gICAgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMuX3N0b3JhZ2UgPSB7fTtcbiAgICB9XG5cbiAgICBpc1N1cHBvcnRlZCgpIHtcbiAgICAgICAgLy8gVGhlIG1lbW9yeSBzdG9yYWdlIGlzIGFsd2F5cyBzdXBwb3J0ZWQuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgZW5jb2RlID0gPFQ+KHZhbHVlOiBULCBhdHRyaWJ1dGVzOiBNZW1vcnlTdG9yYWdlQXR0cmlidXRlcykgPT4ge1xuICAgICAgICBjb25zdCBkYXRhID0ge3ZhbHVlfTtcblxuICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIGV4cGlyZXMgaXMgYSBkYXRlIG9iamVjdC5cbiAgICAgICAgaWYgKHR5cGVvZiBhdHRyaWJ1dGVzLmV4cGlyZXMgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICBhdHRyaWJ1dGVzLmV4cGlyZXMgPSBuZXcgRGF0ZShhdHRyaWJ1dGVzLmV4cGlyZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWRkIHRoZSBleHBpcmUgZGF0ZSBpZiBpdCB3YXMgc2V0LlxuICAgICAgICBpZiAoYXR0cmlidXRlcy5leHBpcmVzKSB7XG4gICAgICAgICAgICBkYXRhWydleHBpcmVzJ10gPSBhdHRyaWJ1dGVzLmV4cGlyZXM7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZXR1cm4gdGhlIGVuY29kZWQgZGF0YS5cbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfTtcblxufVxuIl19
56
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVtb3J5LXN0b3JhZ2Uuc3RyYXRlZ3kuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9iYi1mb3VuZGF0aW9uL3N0b3JhZ2Uvc3JjL2xpYi9zdHJhdGVnaWVzL21lbW9yeS1zdG9yYWdlLnN0cmF0ZWd5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUlBLE1BQU0sT0FBTyxhQUFhO0lBQTFCO1FBRUksU0FBUztRQUNELGFBQVEsR0FBc0IsRUFBRSxDQUFDO1FBZ0RqQyxXQUFNLEdBQUcsQ0FBSSxLQUFRLEVBQUUsVUFBbUMsRUFBRSxFQUFFO1lBQ2xFLE1BQU0sSUFBSSxHQUFHLEVBQUMsS0FBSyxFQUFDLENBQUM7WUFFckIsMENBQTBDO1lBQzFDLElBQUksT0FBTyxVQUFVLENBQUMsT0FBTyxLQUFLLFFBQVEsRUFBRTtnQkFDeEMsVUFBVSxDQUFDLE9BQU8sR0FBRyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7YUFDckQ7WUFFRCxxQ0FBcUM7WUFDckMsSUFBSSxVQUFVLENBQUMsT0FBTyxFQUFFO2dCQUNwQixJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQzthQUN4QztZQUVELDJCQUEyQjtZQUMzQixPQUFPLElBQUksQ0FBQztRQUNoQixDQUFDLENBQUM7SUFFTixDQUFDO0lBL0RHLEdBQUcsQ0FBVSxLQUFhO1FBQ3RCLHlDQUF5QztRQUN6QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXBDLDRCQUE0QjtRQUM1QixJQUFJLE1BQU0sS0FBSyxTQUFTLEVBQUU7WUFDdEIsT0FBTyxTQUFTLENBQUM7U0FDcEI7UUFFRCxxQ0FBcUM7UUFDckMsTUFBTSxFQUFDLEtBQUssRUFBRSxPQUFPLEVBQUMsR0FBRyxNQUFNLENBQUM7UUFFaEMscUNBQXFDO1FBQ3JDLElBQUksT0FBTyxLQUFLLFNBQVMsRUFBRTtZQUN2QixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDdkIsTUFBTSxVQUFVLEdBQUcsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7WUFFL0MscUNBQXFDO1lBQ3JDLElBQUksVUFBVSxJQUFJLEdBQUcsRUFBRTtnQkFDbkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDbkIsT0FBTyxTQUFTLENBQUM7YUFDcEI7U0FDSjtRQUVELG9CQUFvQjtRQUNwQixPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBRUQsR0FBRyxDQUFVLEtBQWEsRUFBRSxLQUFRLEVBQUUsVUFBb0M7UUFDdEUsOENBQThDO1FBQzlDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBSSxLQUFLLEVBQUUsRUFBQyxHQUFHLFVBQVUsRUFBQyxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUVELE1BQU0sQ0FBQyxLQUFhO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRUQsS0FBSztRQUNELElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxXQUFXO1FBQ1AsMENBQTBDO1FBQzFDLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7Q0FtQkoiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge01lbW9yeVN0b3JhZ2VBdHRyaWJ1dGVzfSBmcm9tICcuLi9pbnRlcmZhY2VzL2F0dHJpYnV0ZXMuaW50ZXJmYWNlJztcbmltcG9ydCB7TWVtb3J5U3RvcmFnZURhdGF9IGZyb20gJy4uL2ludGVyZmFjZXMvbWVtb3J5LmludGVyZmFjZSc7XG5pbXBvcnQge1N0b3JhZ2VTdHJhdGVneX0gZnJvbSAnLi4vaW50ZXJmYWNlcy9zdHJhdGVneS5pbnRlcmZhY2UnO1xuXG5leHBvcnQgY2xhc3MgTWVtb3J5U3RvcmFnZSBpbXBsZW1lbnRzIFN0b3JhZ2VTdHJhdGVneSB7XG5cbiAgICAvLyBTdGF0ZS5cbiAgICBwcml2YXRlIF9zdG9yYWdlOiBNZW1vcnlTdG9yYWdlRGF0YSA9IHt9O1xuXG4gICAgZ2V0PFQgPSBhbnk+KHRva2VuOiBzdHJpbmcpOiBUIHtcbiAgICAgICAgLy8gR3JhYiB0aGUgZGF0YSBmcm9tIHRoZSBtZW1vcnkgc3RvcmFnZS5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5fc3RvcmFnZVt0b2tlbl07XG5cbiAgICAgICAgLy8gVmFsaWRhdGUgdGhlIGRhdGEgZXhpc3RzLlxuICAgICAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFeHRyYWN0IHRoZSB2YWx1ZSBhbmQgZXhwaXJlIGRhdGUuXG4gICAgICAgIGNvbnN0IHt2YWx1ZSwgZXhwaXJlc30gPSByZXN1bHQ7XG5cbiAgICAgICAgLy8gVmFsaWRhdGUgdGhlIHZhbHVlIGlzIHN0aWxsIHZhbGlkLlxuICAgICAgICBpZiAoZXhwaXJlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgY29uc3QgZXhwaXJlRGF0ZSA9IG5ldyBEYXRlKGV4cGlyZXMpLmdldFRpbWUoKTtcblxuICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSB2YWx1ZSBpZiBpdCBpcyBleHBpcmVkLlxuICAgICAgICAgICAgaWYgKGV4cGlyZURhdGUgPD0gbm93KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW1vdmUodG9rZW4pO1xuICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZXR1cm4gdGhlIHZhbHVlLlxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgc2V0PFQgPSBhbnk+KHRva2VuOiBzdHJpbmcsIHZhbHVlOiBULCBhdHRyaWJ1dGVzPzogTWVtb3J5U3RvcmFnZUF0dHJpYnV0ZXMpIHtcbiAgICAgICAgLy8gU2F2ZSB0aGUgZW5jb2RlZCB2YWx1ZSB3aXRoIHRoZSBhdHRyaWJ1dGVzLlxuICAgICAgICB0aGlzLl9zdG9yYWdlW3Rva2VuXSA9IHRoaXMuZW5jb2RlPFQ+KHZhbHVlLCB7Li4uYXR0cmlidXRlc30pO1xuICAgIH1cblxuICAgIHJlbW92ZSh0b2tlbjogc3RyaW5nKSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLl9zdG9yYWdlW3Rva2VuXTtcbiAgICB9XG5cbiAgICBjbGVhcigpIHtcbiAgICAgICAgdGhpcy5fc3RvcmFnZSA9IHt9O1xuICAgIH1cblxuICAgIGlzU3VwcG9ydGVkKCkge1xuICAgICAgICAvLyBUaGUgbWVtb3J5IHN0b3JhZ2UgaXMgYWx3YXlzIHN1cHBvcnRlZC5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBlbmNvZGUgPSA8VD4odmFsdWU6IFQsIGF0dHJpYnV0ZXM6IE1lbW9yeVN0b3JhZ2VBdHRyaWJ1dGVzKSA9PiB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB7dmFsdWV9O1xuXG4gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgZXhwaXJlcyBpcyBhIGRhdGUgb2JqZWN0LlxuICAgICAgICBpZiAodHlwZW9mIGF0dHJpYnV0ZXMuZXhwaXJlcyA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIGF0dHJpYnV0ZXMuZXhwaXJlcyA9IG5ldyBEYXRlKGF0dHJpYnV0ZXMuZXhwaXJlcyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBZGQgdGhlIGV4cGlyZSBkYXRlIGlmIGl0IHdhcyBzZXQuXG4gICAgICAgIGlmIChhdHRyaWJ1dGVzLmV4cGlyZXMpIHtcbiAgICAgICAgICAgIGRhdGFbJ2V4cGlyZXMnXSA9IGF0dHJpYnV0ZXMuZXhwaXJlcztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJldHVybiB0aGUgZW5jb2RlZCBkYXRhLlxuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICB9O1xuXG59XG4iXX0=
@@ -0,0 +1,102 @@
1
+ export class PolyfillStorage {
2
+ constructor(_storage) {
3
+ this._storage = _storage;
4
+ // State.
5
+ this._isSupported = false;
6
+ this.encode = (value, attributes) => {
7
+ // Make sure the expires attribute is a date and not a number.
8
+ const data = { value };
9
+ if (typeof attributes.expires === 'number') {
10
+ attributes.expires = new Date(attributes.expires);
11
+ }
12
+ if (attributes.expires) {
13
+ data['expires'] = attributes.expires;
14
+ }
15
+ return JSON.stringify(data);
16
+ };
17
+ this.testIfSupported = () => {
18
+ if (typeof this._storage === 'undefined') {
19
+ return false;
20
+ }
21
+ try {
22
+ const x = '__storage_test__';
23
+ this._storage.setItem(x, x);
24
+ this._storage.removeItem(x);
25
+ return true;
26
+ }
27
+ catch (error) {
28
+ return error instanceof DOMException
29
+ && (error.code === 22 ||
30
+ error.code === 1014 ||
31
+ error.name === 'QuotaExceededError' ||
32
+ error.name === 'NS_ERROR_DOM_QUOTA_REACHED')
33
+ && (this._storage && this._storage.length !== 0);
34
+ }
35
+ };
36
+ // Check if the storage is supported.
37
+ this._isSupported = this.testIfSupported();
38
+ }
39
+ get(token) {
40
+ // Validate that the storage is supported.
41
+ if (!this._isSupported) {
42
+ return undefined;
43
+ }
44
+ return this.decode(token);
45
+ }
46
+ set(token, value, attributes) {
47
+ // Validate that the storage is supported.
48
+ if (!this._isSupported) {
49
+ return;
50
+ }
51
+ // Stringify the data.
52
+ const rawData = this.encode(value, { ...attributes });
53
+ // Set the raw data in the storage.
54
+ this._storage.setItem(token, rawData);
55
+ }
56
+ remove(token) {
57
+ // Validate that the storage is supported.
58
+ if (!this._isSupported) {
59
+ return;
60
+ }
61
+ // Remove the item in the storage.
62
+ this._storage.removeItem(token);
63
+ }
64
+ clear() {
65
+ // Validate that the storage is supported.
66
+ if (!this._isSupported) {
67
+ return;
68
+ }
69
+ // Clear the storage.
70
+ this._storage.clear();
71
+ }
72
+ isSupported() {
73
+ return this._isSupported;
74
+ }
75
+ decode(token) {
76
+ // Retrieve the raw data from the storage.
77
+ const rawData = this._storage.getItem(token);
78
+ // Try to parse the data.
79
+ let parsedData = undefined;
80
+ // Only parse the data when it is not null.
81
+ if (rawData !== null) {
82
+ try {
83
+ const { value, expires } = JSON.parse(rawData);
84
+ if (expires !== undefined) {
85
+ const now = Date.now();
86
+ const expireDate = new Date(expires).getTime();
87
+ if (expireDate <= now) {
88
+ this.remove(token);
89
+ return undefined;
90
+ }
91
+ }
92
+ parsedData = value;
93
+ }
94
+ catch {
95
+ // We dont do anything with failed parsing.
96
+ }
97
+ }
98
+ // Return the parsed data.
99
+ return parsedData;
100
+ }
101
+ }
102
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9seWZpbGwtc3RvcmFnZS5zdHJhdGVneS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2JiLWZvdW5kYXRpb24vc3RvcmFnZS9zcmMvbGliL3N0cmF0ZWdpZXMvcG9seWZpbGwtc3RvcmFnZS5zdHJhdGVneS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQSxNQUFNLE9BQU8sZUFBZTtJQUt4QixZQUFvQixRQUFrQjtRQUFsQixhQUFRLEdBQVIsUUFBUSxDQUFVO1FBSHRDLFNBQVM7UUFDUSxpQkFBWSxHQUFZLEtBQUssQ0FBQztRQXFGdkMsV0FBTSxHQUFHLENBQUksS0FBUSxFQUFFLFVBQXFDLEVBQUUsRUFBRTtZQUNwRSw4REFBOEQ7WUFDOUQsTUFBTSxJQUFJLEdBQUcsRUFBQyxLQUFLLEVBQUMsQ0FBQztZQUVyQixJQUFJLE9BQU8sVUFBVSxDQUFDLE9BQU8sS0FBSyxRQUFRLEVBQUU7Z0JBQ3hDLFVBQVUsQ0FBQyxPQUFPLEdBQUcsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2FBQ3JEO1lBRUQsSUFBSSxVQUFVLENBQUMsT0FBTyxFQUFFO2dCQUNwQixJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQzthQUN4QztZQUVELE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoQyxDQUFDLENBQUM7UUFFTSxvQkFBZSxHQUFHLEdBQUcsRUFBRTtZQUMzQixJQUFJLE9BQU8sSUFBSSxDQUFDLFFBQVEsS0FBSyxXQUFXLEVBQUU7Z0JBQ3RDLE9BQU8sS0FBSyxDQUFDO2FBQ2hCO1lBRUQsSUFBSTtnQkFDQSxNQUFNLENBQUMsR0FBRyxrQkFBa0IsQ0FBQztnQkFDN0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUM1QixJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDNUIsT0FBTyxJQUFJLENBQUM7YUFDZjtZQUFDLE9BQU8sS0FBSyxFQUFFO2dCQUNaLE9BQU8sS0FBSyxZQUFZLFlBQVk7dUJBQzdCLENBQ0MsS0FBSyxDQUFDLElBQUksS0FBSyxFQUFFO3dCQUNqQixLQUFLLENBQUMsSUFBSSxLQUFLLElBQUk7d0JBQ25CLEtBQUssQ0FBQyxJQUFJLEtBQUssb0JBQW9CO3dCQUNuQyxLQUFLLENBQUMsSUFBSSxLQUFLLDRCQUE0QixDQUM5Qzt1QkFDRSxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUM7YUFDeEQ7UUFDTCxDQUFDLENBQUM7UUFySEUscUNBQXFDO1FBQ3JDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQy9DLENBQUM7SUFFRCxHQUFHLENBQVUsS0FBYTtRQUN0QiwwQ0FBMEM7UUFDMUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDcEIsT0FBTyxTQUFTLENBQUM7U0FDcEI7UUFFRCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUksS0FBSyxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUVELEdBQUcsQ0FBVSxLQUFhLEVBQUUsS0FBUSxFQUFFLFVBQXNDO1FBQ3hFLDBDQUEwQztRQUMxQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNwQixPQUFPO1NBQ1Y7UUFFRCxzQkFBc0I7UUFDdEIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBSSxLQUFLLEVBQUUsRUFBQyxHQUFHLFVBQVUsRUFBQyxDQUFDLENBQUM7UUFFdkQsbUNBQW1DO1FBQ25DLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQsTUFBTSxDQUFDLEtBQWE7UUFDaEIsMENBQTBDO1FBQzFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3BCLE9BQU87U0FDVjtRQUVELGtDQUFrQztRQUNsQyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRUQsS0FBSztRQUNELDBDQUEwQztRQUMxQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNwQixPQUFPO1NBQ1Y7UUFFRCxxQkFBcUI7UUFDckIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRUQsV0FBVztRQUNQLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQztJQUM3QixDQUFDO0lBRU8sTUFBTSxDQUFJLEtBQWE7UUFDM0IsMENBQTBDO1FBQzFDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRTdDLHlCQUF5QjtRQUN6QixJQUFJLFVBQVUsR0FBa0IsU0FBUyxDQUFDO1FBRTFDLDJDQUEyQztRQUMzQyxJQUFJLE9BQU8sS0FBSyxJQUFJLEVBQUU7WUFDbEIsSUFBSTtnQkFDQSxNQUFNLEVBQUMsS0FBSyxFQUFFLE9BQU8sRUFBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBRTdDLElBQUksT0FBTyxLQUFLLFNBQVMsRUFBRTtvQkFDdkIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO29CQUN2QixNQUFNLFVBQVUsR0FBRyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztvQkFFL0MsSUFBSSxVQUFVLElBQUksR0FBRyxFQUFFO3dCQUNuQixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO3dCQUNuQixPQUFPLFNBQVMsQ0FBQztxQkFDcEI7aUJBQ0o7Z0JBRUQsVUFBVSxHQUFHLEtBQUssQ0FBQzthQUN0QjtZQUFDLE1BQU07Z0JBQ0osMkNBQTJDO2FBQzlDO1NBQ0o7UUFFRCwwQkFBMEI7UUFDMUIsT0FBTyxVQUFVLENBQUM7SUFDdEIsQ0FBQztDQXVDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7UG9seWZpbGxTdG9yYWdlQXR0cmlidXRlc30gZnJvbSAnLi4vaW50ZXJmYWNlcy9hdHRyaWJ1dGVzLmludGVyZmFjZSc7XG5pbXBvcnQge1N0b3JhZ2VTdHJhdGVneX0gZnJvbSAnLi4vaW50ZXJmYWNlcy9zdHJhdGVneS5pbnRlcmZhY2UnO1xuXG5leHBvcnQgY2xhc3MgUG9seWZpbGxTdG9yYWdlIGltcGxlbWVudHMgU3RvcmFnZVN0cmF0ZWd5IHtcblxuICAgIC8vIFN0YXRlLlxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2lzU3VwcG9ydGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9zdG9yYWdlPzogU3RvcmFnZSkge1xuICAgICAgICAvLyBDaGVjayBpZiB0aGUgc3RvcmFnZSBpcyBzdXBwb3J0ZWQuXG4gICAgICAgIHRoaXMuX2lzU3VwcG9ydGVkID0gdGhpcy50ZXN0SWZTdXBwb3J0ZWQoKTtcbiAgICB9XG5cbiAgICBnZXQ8VCA9IGFueT4odG9rZW46IHN0cmluZykge1xuICAgICAgICAvLyBWYWxpZGF0ZSB0aGF0IHRoZSBzdG9yYWdlIGlzIHN1cHBvcnRlZC5cbiAgICAgICAgaWYgKCF0aGlzLl9pc1N1cHBvcnRlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmRlY29kZTxUPih0b2tlbik7XG4gICAgfVxuXG4gICAgc2V0PFQgPSBhbnk+KHRva2VuOiBzdHJpbmcsIHZhbHVlOiBULCBhdHRyaWJ1dGVzPzogUG9seWZpbGxTdG9yYWdlQXR0cmlidXRlcykge1xuICAgICAgICAvLyBWYWxpZGF0ZSB0aGF0IHRoZSBzdG9yYWdlIGlzIHN1cHBvcnRlZC5cbiAgICAgICAgaWYgKCF0aGlzLl9pc1N1cHBvcnRlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU3RyaW5naWZ5IHRoZSBkYXRhLlxuICAgICAgICBjb25zdCByYXdEYXRhID0gdGhpcy5lbmNvZGU8VD4odmFsdWUsIHsuLi5hdHRyaWJ1dGVzfSk7XG5cbiAgICAgICAgLy8gU2V0IHRoZSByYXcgZGF0YSBpbiB0aGUgc3RvcmFnZS5cbiAgICAgICAgdGhpcy5fc3RvcmFnZS5zZXRJdGVtKHRva2VuLCByYXdEYXRhKTtcbiAgICB9XG5cbiAgICByZW1vdmUodG9rZW46IHN0cmluZykge1xuICAgICAgICAvLyBWYWxpZGF0ZSB0aGF0IHRoZSBzdG9yYWdlIGlzIHN1cHBvcnRlZC5cbiAgICAgICAgaWYgKCF0aGlzLl9pc1N1cHBvcnRlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVtb3ZlIHRoZSBpdGVtIGluIHRoZSBzdG9yYWdlLlxuICAgICAgICB0aGlzLl9zdG9yYWdlLnJlbW92ZUl0ZW0odG9rZW4pO1xuICAgIH1cblxuICAgIGNsZWFyKCkge1xuICAgICAgICAvLyBWYWxpZGF0ZSB0aGF0IHRoZSBzdG9yYWdlIGlzIHN1cHBvcnRlZC5cbiAgICAgICAgaWYgKCF0aGlzLl9pc1N1cHBvcnRlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2xlYXIgdGhlIHN0b3JhZ2UuXG4gICAgICAgIHRoaXMuX3N0b3JhZ2UuY2xlYXIoKTtcbiAgICB9XG5cbiAgICBpc1N1cHBvcnRlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzU3VwcG9ydGVkO1xuICAgIH1cblxuICAgIHByaXZhdGUgZGVjb2RlPFQ+KHRva2VuOiBzdHJpbmcpIHtcbiAgICAgICAgLy8gUmV0cmlldmUgdGhlIHJhdyBkYXRhIGZyb20gdGhlIHN0b3JhZ2UuXG4gICAgICAgIGNvbnN0IHJhd0RhdGEgPSB0aGlzLl9zdG9yYWdlLmdldEl0ZW0odG9rZW4pO1xuXG4gICAgICAgIC8vIFRyeSB0byBwYXJzZSB0aGUgZGF0YS5cbiAgICAgICAgbGV0IHBhcnNlZERhdGE6IFQgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgLy8gT25seSBwYXJzZSB0aGUgZGF0YSB3aGVuIGl0IGlzIG5vdCBudWxsLlxuICAgICAgICBpZiAocmF3RGF0YSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCB7dmFsdWUsIGV4cGlyZXN9ID0gSlNPTi5wYXJzZShyYXdEYXRhKTtcblxuICAgICAgICAgICAgICAgIGlmIChleHBpcmVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXhwaXJlRGF0ZSA9IG5ldyBEYXRlKGV4cGlyZXMpLmdldFRpbWUoKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoZXhwaXJlRGF0ZSA8PSBub3cpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlKHRva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBwYXJzZWREYXRhID0gdmFsdWU7XG4gICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAvLyBXZSBkb250IGRvIGFueXRoaW5nIHdpdGggZmFpbGVkIHBhcnNpbmcuXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZXR1cm4gdGhlIHBhcnNlZCBkYXRhLlxuICAgICAgICByZXR1cm4gcGFyc2VkRGF0YTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGVuY29kZSA9IDxUPih2YWx1ZTogVCwgYXR0cmlidXRlczogUG9seWZpbGxTdG9yYWdlQXR0cmlidXRlcykgPT4ge1xuICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIGV4cGlyZXMgYXR0cmlidXRlIGlzIGEgZGF0ZSBhbmQgbm90IGEgbnVtYmVyLlxuICAgICAgICBjb25zdCBkYXRhID0ge3ZhbHVlfTtcblxuICAgICAgICBpZiAodHlwZW9mIGF0dHJpYnV0ZXMuZXhwaXJlcyA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIGF0dHJpYnV0ZXMuZXhwaXJlcyA9IG5ldyBEYXRlKGF0dHJpYnV0ZXMuZXhwaXJlcyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYXR0cmlidXRlcy5leHBpcmVzKSB7XG4gICAgICAgICAgICBkYXRhWydleHBpcmVzJ10gPSBhdHRyaWJ1dGVzLmV4cGlyZXM7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoZGF0YSk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgdGVzdElmU3VwcG9ydGVkID0gKCkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuX3N0b3JhZ2UgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgeCA9ICdfX3N0b3JhZ2VfdGVzdF9fJztcbiAgICAgICAgICAgIHRoaXMuX3N0b3JhZ2Uuc2V0SXRlbSh4LCB4KTtcbiAgICAgICAgICAgIHRoaXMuX3N0b3JhZ2UucmVtb3ZlSXRlbSh4KTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGVycm9yIGluc3RhbmNlb2YgRE9NRXhjZXB0aW9uXG4gICAgICAgICAgICAgICAgJiYgKFxuICAgICAgICAgICAgICAgICAgICBlcnJvci5jb2RlID09PSAyMiB8fFxuICAgICAgICAgICAgICAgICAgICBlcnJvci5jb2RlID09PSAxMDE0IHx8XG4gICAgICAgICAgICAgICAgICAgIGVycm9yLm5hbWUgPT09ICdRdW90YUV4Y2VlZGVkRXJyb3InIHx8XG4gICAgICAgICAgICAgICAgICAgIGVycm9yLm5hbWUgPT09ICdOU19FUlJPUl9ET01fUVVPVEFfUkVBQ0hFRCdcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgJiYgKHRoaXMuX3N0b3JhZ2UgJiYgdGhpcy5fc3RvcmFnZS5sZW5ndGggIT09IDApO1xuICAgICAgICB9XG4gICAgfTtcblxufVxuIl19
@@ -0,0 +1,191 @@
1
+ import { ChangeDetectionStrategy, Component, ContentChild, ContentChildren, Directive, Input, TemplateRef, ViewEncapsulation } from '@angular/core';
2
+ import { catchError, debounceTime, distinctUntilChanged, map, startWith, tap } from 'rxjs/operators';
3
+ import { DataSourceRequest } from '../../data/datasource.data';
4
+ import { combineLatest, of } from 'rxjs';
5
+ import { FormControl, FormGroup } from '@angular/forms';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "@bravobit/bb-foundation/elements";
8
+ import * as i2 from "../table-pager/table-pager.component";
9
+ import * as i3 from "@angular/common";
10
+ import * as i4 from "@angular/forms";
11
+ import * as i5 from "@bravobit/bb-foundation/localize";
12
+ export class BbTableColumnDef {
13
+ }
14
+ BbTableColumnDef.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: BbTableColumnDef, deps: [], target: i0.ɵɵFactoryTarget.Directive });
15
+ BbTableColumnDef.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.1.0", type: BbTableColumnDef, selector: "[bbTableColumnDef]", ngImport: i0 });
16
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: BbTableColumnDef, decorators: [{
17
+ type: Directive,
18
+ args: [{
19
+ selector: '[bbTableColumnDef]'
20
+ }]
21
+ }] });
22
+ export class BbTableRowDef {
23
+ }
24
+ BbTableRowDef.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: BbTableRowDef, deps: [], target: i0.ɵɵFactoryTarget.Directive });
25
+ BbTableRowDef.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.1.0", type: BbTableRowDef, selector: "[bbTableRowDef]", ngImport: i0 });
26
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: BbTableRowDef, decorators: [{
27
+ type: Directive,
28
+ args: [{
29
+ selector: '[bbTableRowDef]'
30
+ }]
31
+ }] });
32
+ export class BbTable {
33
+ constructor() {
34
+ // Inputs.
35
+ this.identifier = null;
36
+ this.queryFields = [];
37
+ this.sortingStrategy = 'single';
38
+ this.header = true;
39
+ this.footer = true;
40
+ // Sizes.
41
+ this._sizes = [25, 50, 75, 100];
42
+ // Optimizations.
43
+ this.trackByFn = (index, item) => this.identifier ? item[this.identifier] : index;
44
+ this.trackByValue = (_, item) => item;
45
+ this.queryControl = new FormControl('');
46
+ // State.
47
+ this._headerCount = 0;
48
+ }
49
+ get sizes() {
50
+ return this._sizes;
51
+ }
52
+ set sizes(newValue) {
53
+ this.updateSizes(newValue);
54
+ }
55
+ ngOnInit() {
56
+ this.composeForm();
57
+ this.watchDataChanges();
58
+ }
59
+ ngOnDestroy() {
60
+ this._subscription?.unsubscribe();
61
+ }
62
+ get headerCount() {
63
+ return this._headerCount;
64
+ }
65
+ get sortControl() {
66
+ return this.form?.get('sort');
67
+ }
68
+ get pageNumberControl() {
69
+ return this.form?.get('pageNumber');
70
+ }
71
+ get pageSizeControl() {
72
+ return this.form?.get('pageSize');
73
+ }
74
+ refresh() {
75
+ return this.request.update();
76
+ }
77
+ setHeaderCount(amount) {
78
+ this._headerCount += amount;
79
+ }
80
+ updateSizes(newValue) {
81
+ // Validate the sizes has at least one value.
82
+ if (newValue.length <= 0) {
83
+ throw new Error('Cannot set an empty array as the sizes.');
84
+ }
85
+ // Set the new size.
86
+ this._sizes = newValue;
87
+ // Validate that the form exists already.
88
+ if (!this.form) {
89
+ return;
90
+ }
91
+ // Check if the current selected value is
92
+ // in the new sizes array.
93
+ const pageSizeControl = this.form.get('pageSize');
94
+ if (this._sizes.includes(pageSizeControl.value)) {
95
+ return;
96
+ }
97
+ // Set the first value in the array as
98
+ // the new value.
99
+ const firstValue = this._sizes[0];
100
+ pageSizeControl.setValue(firstValue);
101
+ }
102
+ composeForm() {
103
+ // Setup the form.
104
+ this.form = new FormGroup({
105
+ pageSize: new FormControl(this._sizes[0]),
106
+ pageNumber: new FormControl(1),
107
+ sort: new FormGroup({})
108
+ });
109
+ }
110
+ watchDataChanges() {
111
+ // Create a new request.
112
+ this.request = new DataSourceRequest();
113
+ this.isLoading$ = this.request.loading;
114
+ if (!this.dataSource) {
115
+ this.data$ = of({ state: 'error_datasource' }).pipe(tap(() => this.request.stopLoading()));
116
+ return;
117
+ }
118
+ // Pass the request to the data source.
119
+ this.data$ = this.dataSource.handle(this.request).pipe(tap(() => this.request.stopLoading()), map(result => {
120
+ const count = (result && result.data && result.data.length) || 0;
121
+ if (count <= 0) {
122
+ return { state: 'empty', result };
123
+ }
124
+ return { state: 'success', result };
125
+ }), catchError(error => {
126
+ this.request.stopLoading();
127
+ const statusCode = error?.status ?? null;
128
+ const states = {
129
+ 0: 'error_down',
130
+ 401: 'error_unauthorized',
131
+ 403: 'error_forbidden',
132
+ 404: 'error_not_found',
133
+ 500: 'error_server'
134
+ };
135
+ return of({ state: states?.[statusCode] ?? 'error_unknown', statusCode: statusCode });
136
+ }));
137
+ // Subscribe to the data changes.
138
+ this.subscribeToChanges();
139
+ }
140
+ subscribeToChanges() {
141
+ const form$ = this.getFormChanges();
142
+ const query$ = this.getQueryChanges();
143
+ this._subscription = combineLatest([form$, query$]).subscribe(([form, query]) => {
144
+ const { pageNumber, pageSize } = form;
145
+ const sort = Object.keys(form.sort)
146
+ .map(name => ({ name, direction: form.sort[name] }))
147
+ .filter(item => ['asc', 'desc'].includes(item.direction));
148
+ this.request.startLoading();
149
+ return this.request.update({
150
+ sort,
151
+ query,
152
+ pageSize,
153
+ pageNumber,
154
+ queryFields: this.queryFields
155
+ });
156
+ });
157
+ }
158
+ getQueryChanges() {
159
+ return this.queryControl.valueChanges.pipe(debounceTime(400), distinctUntilChanged(), startWith(this.queryControl.value));
160
+ }
161
+ getFormChanges() {
162
+ return this.form.valueChanges.pipe(startWith(this.form.value));
163
+ }
164
+ }
165
+ BbTable.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: BbTable, deps: [], target: i0.ɵɵFactoryTarget.Component });
166
+ BbTable.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.0", type: BbTable, selector: "bb-table", inputs: { identifier: "identifier", dataSource: "dataSource", queryFields: "queryFields", sortingStrategy: "sortingStrategy", header: "header", footer: "footer", sizes: "sizes" }, host: { classAttribute: "bb-table" }, queries: [{ propertyName: "tableRowTemplate", first: true, predicate: BbTableRowDef, descendants: true, read: TemplateRef }, { propertyName: "tableColumnTemplates", predicate: BbTableColumnDef, read: TemplateRef }], ngImport: i0, template: "<!--\n This is the header of the table. It can be a user\n defined custom header or just the default header.\n-->\n\n<header *ngIf=\"(header === true ? headerTemplate : header) as template\"\n class=\"bb-table-top-actions\">\n <ng-container *ngTemplateOutlet=\"template\"></ng-container>\n</header>\n\n<!--\n This is the table that contains the\n rows and columns.\n-->\n\n<div class=\"bb-table-wrapper\">\n <div *ngIf=\"isLoading$ | async\"\n class=\"bb-table-progress\">\n <div class=\"bb-table-indeterminate\"></div>\n </div>\n <table class=\"bb-table-container\">\n <thead>\n <tr>\n <ng-content select=\"bb-table-header-cell\"></ng-content>\n </tr>\n </thead>\n <tbody *ngIf=\"data$ | async as data; else isLoadingTemplate\"\n [ngSwitch]=\"data?.state\">\n <ng-container *ngSwitchCase=\"'success'\">\n <ng-container *ngIf=\"!!tableRowTemplate; else tableCellsTemplates\">\n <ng-container\n *ngTemplateOutlet=\"tableRowTemplate; context: {data: data?.result?.data || []}\"></ng-container>\n </ng-container>\n\n <ng-template #tableCellsTemplates>\n <tr *ngFor=\"let item of data?.result?.data; trackBy: trackByFn\">\n <ng-container *ngFor=\"let template of tableColumnTemplates\">\n <ng-container *ngTemplateOutlet=\"template; context: {item: item}\"></ng-container>\n </ng-container>\n </tr>\n </ng-template>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'empty'\">\n <ng-container\n *ngTemplateOutlet=\"errorTemplate; context: data\"></ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'error_datasource'\">\n <ng-container\n *ngTemplateOutlet=\"errorTemplate; context: data\"></ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'error_not_found'\">\n <ng-container\n *ngTemplateOutlet=\"errorTemplate; context: data\"></ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'error_server'\">\n <ng-container\n *ngTemplateOutlet=\"errorTemplate; context: data\"></ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'error_down'\">\n <ng-container\n *ngTemplateOutlet=\"errorTemplate; context: data\"></ng-container>\n </ng-container>\n\n <ng-container *ngSwitchDefault>\n <ng-container\n *ngTemplateOutlet=\"errorTemplate; context: data\"></ng-container>\n </ng-container>\n </tbody>\n </table>\n</div>\n\n<footer *ngIf=\"(footer === true ? footerTemplate : footer) as template\"\n class=\"bb-table-bottom-actions\">\n <ng-container *ngTemplateOutlet=\"template\"></ng-container>\n</footer>\n\n<ng-template #isLoadingTemplate>\n <tr>\n <td [attr.colspan]=\"headerCount\"\n class=\"bb-table-template\">\n <div class=\"bb-table-template-content\">\n {{ 'tables.loading' | bbLocalize }}\n </div>\n </td>\n </tr>\n</ng-template>\n\n<!--\n This is the template that will be used when the user has not\n supplied a custom header template.\n-->\n\n<ng-template #headerTemplate>\n <ng-content></ng-content>\n <bb-form-control>\n <input [formControl]=\"queryControl\"\n [placeholder]=\"'tables.search' | bbLocalize\"\n bbInput\n autocomplete=\"off\">\n <bb-icon *ngIf=\"queryControl?.value?.length <= 0; else closeButtonTemplate\"\n bbSuffix\n src=\"material:search\">\n </bb-icon>\n </bb-form-control>\n</ng-template>\n\n<!--\n This is the template that will be used when the user has not\n supplied a custom footer template.\n-->\n\n<ng-template #footerTemplate>\n <bb-form-control *ngIf=\"sizes?.length > 1\">\n <select [formControl]=\"pageSizeControl\"\n bbInput\n title=\"Sizes\">\n <option *ngFor=\"let item of sizes; trackBy: trackByValue\"\n [ngValue]=\"item\">\n {{ item }} / {{ 'tables.page' | bbLocalize }}\n </option>\n </select>\n </bb-form-control>\n\n <bb-table-pager [totalPages]=\"(data$ | async)?.result?.totalPages\"\n [formControl]=\"pageNumberControl\">\n </bb-table-pager>\n</ng-template>\n\n<!--\n This the template that will be used when the user\n has filled in some data in the query control.\n-->\n\n<ng-template #closeButtonTemplate>\n <button bbSuffix\n (click)=\"queryControl?.patchValue('')\"\n type=\"button\"\n class=\"bb-table-progress-close-query\">\n <bb-icon src=\"material:close\"></bb-icon>\n </button>\n</ng-template>\n\n<ng-template #errorTemplate let-state=\"state\" let-status=\"statusCode\">\n <tr>\n <td [attr.colspan]=\"headerCount\"\n class=\"bb-table-template\">\n <div class=\"bb-table-template-content\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"64\" height=\"41\">\n <g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(0 1)\">\n <ellipse cx=\"32\" cy=\"33\" fill=\"#F5F5F5\" rx=\"32\" ry=\"7\"></ellipse>\n <g fill-rule=\"nonzero\" stroke=\"#D9D9D9\">\n <path\n d=\"M55 12.7605604L44.8543047 1.25739633C44.3674414.47382661 43.6558789 0 42.9067617 0H21.0932383c-.7491172 0-1.4606797.47395025-1.947543 1.25739633L9 12.7605604V22h46v-9.2394396z\"></path>\n <path fill=\"#FAFAFA\"\n d=\"M41.6132813 15.9315c0-1.6056489.9936718-2.931266 2.2264179-2.9315H55v18.1371277C55 33.2589574 53.6793867 35 52.0504297 35H11.94957031C10.32052344 35 9 33.2588404 9 31.1371277V13h11.1603008c1.2327461 0 2.226418 1.3228085 2.226418 2.9284574v.0211809c0 1.6056489 1.0049921 2.9015426 2.2377382 2.9015426h14.751086c1.2327461 0 2.2377383-1.3078298 2.2377383-2.9134788V15.9315z\"></path>\n </g>\n </g>\n </svg>\n <span *ngIf=\"state as stateLabel\">{{ ('tables.' + stateLabel) | bbLocalize }}</span>\n <span *ngIf=\"status as statusCode\"\n class=\"bb-table-template-content-code\">(HTTP {{ statusCode }})</span>\n </div>\n </td>\n </tr>\n</ng-template>\n", styles: [".bb-table{width:100%;display:block;box-shadow:0 6px 6px -6px #0000001a}.bb-table.plain{box-shadow:none}.bb-table.plain>.bb-table-wrapper{border-top-left-radius:0;border-top-right-radius:0}.bb-table-wrapper{overflow-x:auto;position:relative;background-color:#fff;border-top-left-radius:4px;border-top-right-radius:4px}.bb-table-container{width:100%}.bb-table-container td{border-bottom:1px solid #d8d8d8}.bb-table-top-actions{display:flex;flex-wrap:wrap;flex-direction:column;padding:20px 20px 10px;background-color:#fff;justify-content:flex-end;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom:1px solid #d8d8d8}.bb-table-top-actions>*{margin-left:0;margin-bottom:10px}.bb-table-top-actions+.bb-table-wrapper{border-radius:0}.bb-table-bottom-actions{height:60px;display:flex;padding:0 20px;overflow-x:auto;align-items:center;background-color:#fff;border-bottom-left-radius:4px;border-bottom-right-radius:4px}.bb-table-template{border:none;background-color:#f5f5f5;border-bottom:1px solid #d8d8d8}.bb-table-template-content{padding:20px;display:flex;color:#3d464d;font-size:14px;line-height:1.2;font-weight:400;min-height:140px;text-align:center;align-items:center;flex-direction:column;justify-content:center}.bb-table-template-content>svg{margin-bottom:12px}.bb-table-template-content-code{opacity:.5;margin-top:5px;display:inline-block}.bb-table-progress{top:0;left:0;right:0;opacity:0;width:100%;height:4px;display:block;overflow:hidden;position:absolute;background-color:#2f408b4d;animation:fadeIn .25s cubic-bezier(0,0,.2,1) .1s forwards}.bb-table-progress .bb-table-indeterminate{background-color:#2f408b}.bb-table-progress .bb-table-indeterminate:before{top:0;left:0;bottom:0;content:\"\";position:absolute;will-change:left,right;background-color:inherit;animation:indeterminate 2.1s cubic-bezier(.65,.815,.735,.395) infinite}.bb-table-progress .bb-table-indeterminate:after{top:0;left:0;bottom:0;content:\"\";position:absolute;animation-delay:1.15s;will-change:left,right;background-color:inherit;animation:indeterminate-short 2.1s cubic-bezier(.165,.84,.44,1) infinite}.bb-table-progress-close-query{padding:0;border:none;border-radius:4px;background-color:transparent;transition:background-color .25s cubic-bezier(0,0,.2,1)}.bb-table-progress-close-query:hover{background-color:#00000014}.bb-table-progress-close-query:focus{background-color:#0000001f}.bb-table-progress-close-query:active{background-color:#00000029}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}@keyframes indeterminate{0%{left:-35%;right:100%}60%{left:100%;right:-90%}to{left:100%;right:-90%}}@keyframes indeterminate-short{0%{left:-200%;right:100%}60%{left:107%;right:-8%}to{left:107%;right:-8%}}@media only screen and (min-width: 768px){.bb-table-top-actions{flex-direction:row}.bb-table-top-actions>*:not(:first-child){margin-left:10px;margin-bottom:10px}}\n"], components: [{ type: i1.BbFormControl, selector: "bb-form-control", inputs: ["grouped", "hideErrors", "label", "hint"] }, { type: i1.BbIcon, selector: "bb-icon", inputs: ["alt", "size", "src", "ariaHidden"] }, { type: i2.BbTablePager, selector: "bb-table-pager", inputs: ["disabled", "amountOfButtons", "showArrowButtons", "pageNumber", "totalPages"] }], directives: [{ type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i3.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i3.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i3.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { type: i1.BbInput, selector: "input[bbInput], textarea[bbInput]", inputs: ["readonly"] }, { type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i4.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { type: i1.BbSuffix, selector: "[bbSuffix]" }, { type: i1.BbSelect, selector: "select[bbInput]", inputs: ["disabled", "required"] }, { type: i4.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { type: i4.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i4.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }], pipes: { "async": i3.AsyncPipe, "bbLocalize": i5.BbLocalize }, changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
167
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: BbTable, decorators: [{
168
+ type: Component,
169
+ args: [{ selector: 'bb-table', host: { 'class': 'bb-table' }, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, preserveWhitespaces: false, template: "<!--\n This is the header of the table. It can be a user\n defined custom header or just the default header.\n-->\n\n<header *ngIf=\"(header === true ? headerTemplate : header) as template\"\n class=\"bb-table-top-actions\">\n <ng-container *ngTemplateOutlet=\"template\"></ng-container>\n</header>\n\n<!--\n This is the table that contains the\n rows and columns.\n-->\n\n<div class=\"bb-table-wrapper\">\n <div *ngIf=\"isLoading$ | async\"\n class=\"bb-table-progress\">\n <div class=\"bb-table-indeterminate\"></div>\n </div>\n <table class=\"bb-table-container\">\n <thead>\n <tr>\n <ng-content select=\"bb-table-header-cell\"></ng-content>\n </tr>\n </thead>\n <tbody *ngIf=\"data$ | async as data; else isLoadingTemplate\"\n [ngSwitch]=\"data?.state\">\n <ng-container *ngSwitchCase=\"'success'\">\n <ng-container *ngIf=\"!!tableRowTemplate; else tableCellsTemplates\">\n <ng-container\n *ngTemplateOutlet=\"tableRowTemplate; context: {data: data?.result?.data || []}\"></ng-container>\n </ng-container>\n\n <ng-template #tableCellsTemplates>\n <tr *ngFor=\"let item of data?.result?.data; trackBy: trackByFn\">\n <ng-container *ngFor=\"let template of tableColumnTemplates\">\n <ng-container *ngTemplateOutlet=\"template; context: {item: item}\"></ng-container>\n </ng-container>\n </tr>\n </ng-template>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'empty'\">\n <ng-container\n *ngTemplateOutlet=\"errorTemplate; context: data\"></ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'error_datasource'\">\n <ng-container\n *ngTemplateOutlet=\"errorTemplate; context: data\"></ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'error_not_found'\">\n <ng-container\n *ngTemplateOutlet=\"errorTemplate; context: data\"></ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'error_server'\">\n <ng-container\n *ngTemplateOutlet=\"errorTemplate; context: data\"></ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'error_down'\">\n <ng-container\n *ngTemplateOutlet=\"errorTemplate; context: data\"></ng-container>\n </ng-container>\n\n <ng-container *ngSwitchDefault>\n <ng-container\n *ngTemplateOutlet=\"errorTemplate; context: data\"></ng-container>\n </ng-container>\n </tbody>\n </table>\n</div>\n\n<footer *ngIf=\"(footer === true ? footerTemplate : footer) as template\"\n class=\"bb-table-bottom-actions\">\n <ng-container *ngTemplateOutlet=\"template\"></ng-container>\n</footer>\n\n<ng-template #isLoadingTemplate>\n <tr>\n <td [attr.colspan]=\"headerCount\"\n class=\"bb-table-template\">\n <div class=\"bb-table-template-content\">\n {{ 'tables.loading' | bbLocalize }}\n </div>\n </td>\n </tr>\n</ng-template>\n\n<!--\n This is the template that will be used when the user has not\n supplied a custom header template.\n-->\n\n<ng-template #headerTemplate>\n <ng-content></ng-content>\n <bb-form-control>\n <input [formControl]=\"queryControl\"\n [placeholder]=\"'tables.search' | bbLocalize\"\n bbInput\n autocomplete=\"off\">\n <bb-icon *ngIf=\"queryControl?.value?.length <= 0; else closeButtonTemplate\"\n bbSuffix\n src=\"material:search\">\n </bb-icon>\n </bb-form-control>\n</ng-template>\n\n<!--\n This is the template that will be used when the user has not\n supplied a custom footer template.\n-->\n\n<ng-template #footerTemplate>\n <bb-form-control *ngIf=\"sizes?.length > 1\">\n <select [formControl]=\"pageSizeControl\"\n bbInput\n title=\"Sizes\">\n <option *ngFor=\"let item of sizes; trackBy: trackByValue\"\n [ngValue]=\"item\">\n {{ item }} / {{ 'tables.page' | bbLocalize }}\n </option>\n </select>\n </bb-form-control>\n\n <bb-table-pager [totalPages]=\"(data$ | async)?.result?.totalPages\"\n [formControl]=\"pageNumberControl\">\n </bb-table-pager>\n</ng-template>\n\n<!--\n This the template that will be used when the user\n has filled in some data in the query control.\n-->\n\n<ng-template #closeButtonTemplate>\n <button bbSuffix\n (click)=\"queryControl?.patchValue('')\"\n type=\"button\"\n class=\"bb-table-progress-close-query\">\n <bb-icon src=\"material:close\"></bb-icon>\n </button>\n</ng-template>\n\n<ng-template #errorTemplate let-state=\"state\" let-status=\"statusCode\">\n <tr>\n <td [attr.colspan]=\"headerCount\"\n class=\"bb-table-template\">\n <div class=\"bb-table-template-content\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"64\" height=\"41\">\n <g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(0 1)\">\n <ellipse cx=\"32\" cy=\"33\" fill=\"#F5F5F5\" rx=\"32\" ry=\"7\"></ellipse>\n <g fill-rule=\"nonzero\" stroke=\"#D9D9D9\">\n <path\n d=\"M55 12.7605604L44.8543047 1.25739633C44.3674414.47382661 43.6558789 0 42.9067617 0H21.0932383c-.7491172 0-1.4606797.47395025-1.947543 1.25739633L9 12.7605604V22h46v-9.2394396z\"></path>\n <path fill=\"#FAFAFA\"\n d=\"M41.6132813 15.9315c0-1.6056489.9936718-2.931266 2.2264179-2.9315H55v18.1371277C55 33.2589574 53.6793867 35 52.0504297 35H11.94957031C10.32052344 35 9 33.2588404 9 31.1371277V13h11.1603008c1.2327461 0 2.226418 1.3228085 2.226418 2.9284574v.0211809c0 1.6056489 1.0049921 2.9015426 2.2377382 2.9015426h14.751086c1.2327461 0 2.2377383-1.3078298 2.2377383-2.9134788V15.9315z\"></path>\n </g>\n </g>\n </svg>\n <span *ngIf=\"state as stateLabel\">{{ ('tables.' + stateLabel) | bbLocalize }}</span>\n <span *ngIf=\"status as statusCode\"\n class=\"bb-table-template-content-code\">(HTTP {{ statusCode }})</span>\n </div>\n </td>\n </tr>\n</ng-template>\n", styles: [".bb-table{width:100%;display:block;box-shadow:0 6px 6px -6px #0000001a}.bb-table.plain{box-shadow:none}.bb-table.plain>.bb-table-wrapper{border-top-left-radius:0;border-top-right-radius:0}.bb-table-wrapper{overflow-x:auto;position:relative;background-color:#fff;border-top-left-radius:4px;border-top-right-radius:4px}.bb-table-container{width:100%}.bb-table-container td{border-bottom:1px solid #d8d8d8}.bb-table-top-actions{display:flex;flex-wrap:wrap;flex-direction:column;padding:20px 20px 10px;background-color:#fff;justify-content:flex-end;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom:1px solid #d8d8d8}.bb-table-top-actions>*{margin-left:0;margin-bottom:10px}.bb-table-top-actions+.bb-table-wrapper{border-radius:0}.bb-table-bottom-actions{height:60px;display:flex;padding:0 20px;overflow-x:auto;align-items:center;background-color:#fff;border-bottom-left-radius:4px;border-bottom-right-radius:4px}.bb-table-template{border:none;background-color:#f5f5f5;border-bottom:1px solid #d8d8d8}.bb-table-template-content{padding:20px;display:flex;color:#3d464d;font-size:14px;line-height:1.2;font-weight:400;min-height:140px;text-align:center;align-items:center;flex-direction:column;justify-content:center}.bb-table-template-content>svg{margin-bottom:12px}.bb-table-template-content-code{opacity:.5;margin-top:5px;display:inline-block}.bb-table-progress{top:0;left:0;right:0;opacity:0;width:100%;height:4px;display:block;overflow:hidden;position:absolute;background-color:#2f408b4d;animation:fadeIn .25s cubic-bezier(0,0,.2,1) .1s forwards}.bb-table-progress .bb-table-indeterminate{background-color:#2f408b}.bb-table-progress .bb-table-indeterminate:before{top:0;left:0;bottom:0;content:\"\";position:absolute;will-change:left,right;background-color:inherit;animation:indeterminate 2.1s cubic-bezier(.65,.815,.735,.395) infinite}.bb-table-progress .bb-table-indeterminate:after{top:0;left:0;bottom:0;content:\"\";position:absolute;animation-delay:1.15s;will-change:left,right;background-color:inherit;animation:indeterminate-short 2.1s cubic-bezier(.165,.84,.44,1) infinite}.bb-table-progress-close-query{padding:0;border:none;border-radius:4px;background-color:transparent;transition:background-color .25s cubic-bezier(0,0,.2,1)}.bb-table-progress-close-query:hover{background-color:#00000014}.bb-table-progress-close-query:focus{background-color:#0000001f}.bb-table-progress-close-query:active{background-color:#00000029}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}@keyframes indeterminate{0%{left:-35%;right:100%}60%{left:100%;right:-90%}to{left:100%;right:-90%}}@keyframes indeterminate-short{0%{left:-200%;right:100%}60%{left:107%;right:-8%}to{left:107%;right:-8%}}@media only screen and (min-width: 768px){.bb-table-top-actions{flex-direction:row}.bb-table-top-actions>*:not(:first-child){margin-left:10px;margin-bottom:10px}}\n"] }]
170
+ }], propDecorators: { tableColumnTemplates: [{
171
+ type: ContentChildren,
172
+ args: [BbTableColumnDef, { read: TemplateRef }]
173
+ }], tableRowTemplate: [{
174
+ type: ContentChild,
175
+ args: [BbTableRowDef, { read: TemplateRef, static: false }]
176
+ }], identifier: [{
177
+ type: Input
178
+ }], dataSource: [{
179
+ type: Input
180
+ }], queryFields: [{
181
+ type: Input
182
+ }], sortingStrategy: [{
183
+ type: Input
184
+ }], header: [{
185
+ type: Input
186
+ }], footer: [{
187
+ type: Input
188
+ }], sizes: [{
189
+ type: Input
190
+ }] } });
191
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYmItZm91bmRhdGlvbi90YWJsZS9zcmMvbGliL2NvbXBvbmVudHMvdGFibGUvdGFibGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYmItZm91bmRhdGlvbi90YWJsZS9zcmMvbGliL2NvbXBvbmVudHMvdGFibGUvdGFibGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILHVCQUF1QixFQUN2QixTQUFTLEVBQUUsWUFBWSxFQUN2QixlQUFlLEVBQ2YsU0FBUyxFQUNULEtBQUssRUFJTCxXQUFXLEVBQ1gsaUJBQWlCLEVBQ3BCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBQyxVQUFVLEVBQUUsWUFBWSxFQUFFLG9CQUFvQixFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFbkcsT0FBTyxFQUFhLGlCQUFpQixFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFDekUsT0FBTyxFQUFDLGFBQWEsRUFBYyxFQUFFLEVBQWUsTUFBTSxNQUFNLENBQUM7QUFDakUsT0FBTyxFQUFDLFdBQVcsRUFBRSxTQUFTLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7OztBQUt0RCxNQUFNLE9BQU8sZ0JBQWdCOzs2R0FBaEIsZ0JBQWdCO2lHQUFoQixnQkFBZ0I7MkZBQWhCLGdCQUFnQjtrQkFINUIsU0FBUzttQkFBQztvQkFDUCxRQUFRLEVBQUUsb0JBQW9CO2lCQUNqQzs7QUFPRCxNQUFNLE9BQU8sYUFBYTs7MEdBQWIsYUFBYTs4RkFBYixhQUFhOzJGQUFiLGFBQWE7a0JBSHpCLFNBQVM7bUJBQUM7b0JBQ1AsUUFBUSxFQUFFLGlCQUFpQjtpQkFDOUI7O0FBYUQsTUFBTSxPQUFPLE9BQU87SUFUcEI7UUFl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QUksdUJBQ2hCLEtBQUs7OEJBSzhCLG9CQUFvQjtzQkFBM0UsZUFBZTt1QkFBQyxnQkFBZ0IsRUFBRSxFQUFDLElBQUksRUFBRSxXQUFXLEVBQUM7Z0JBQ1csZ0JBQWdCO3NCQUFoRixZQUFZO3VCQUFDLGFBQWEsRUFBRSxFQUFDLElBQUksRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBQztnQkFHdEQsVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQVVGLEtBQUs7c0JBRFIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gICAgQ29tcG9uZW50LCBDb250ZW50Q2hpbGQsXG4gICAgQ29udGVudENoaWxkcmVuLFxuICAgIERpcmVjdGl2ZSxcbiAgICBJbnB1dCxcbiAgICBPbkRlc3Ryb3ksXG4gICAgT25Jbml0LFxuICAgIFF1ZXJ5TGlzdCxcbiAgICBUZW1wbGF0ZVJlZixcbiAgICBWaWV3RW5jYXBzdWxhdGlvblxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7Y2F0Y2hFcnJvciwgZGVib3VuY2VUaW1lLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgbWFwLCBzdGFydFdpdGgsIHRhcH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtEYXRhU291cmNlUGFnZVJlc3BvbnNlfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL2RhdGFzb3VyY2UuaW50ZXJmYWNlJztcbmltcG9ydCB7RGF0YVNvdXJjZSwgRGF0YVNvdXJjZVJlcXVlc3R9IGZyb20gJy4uLy4uL2RhdGEvZGF0YXNvdXJjZS5kYXRhJztcbmltcG9ydCB7Y29tYmluZUxhdGVzdCwgT2JzZXJ2YWJsZSwgb2YsIFN1YnNjcmlwdGlvbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQge0Zvcm1Db250cm9sLCBGb3JtR3JvdXB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuQERpcmVjdGl2ZSh7XG4gICAgc2VsZWN0b3I6ICdbYmJUYWJsZUNvbHVtbkRlZl0nXG59KVxuZXhwb3J0IGNsYXNzIEJiVGFibGVDb2x1bW5EZWYge1xufVxuXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogJ1tiYlRhYmxlUm93RGVmXSdcbn0pXG5leHBvcnQgY2xhc3MgQmJUYWJsZVJvd0RlZiB7XG59XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnYmItdGFibGUnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi90YWJsZS5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vdGFibGUuY29tcG9uZW50LnNjc3MnXSxcbiAgICBob3N0OiB7J2NsYXNzJzogJ2JiLXRhYmxlJ30sXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgICBwcmVzZXJ2ZVdoaXRlc3BhY2VzOiBmYWxzZVxufSlcbmV4cG9ydCBjbGFzcyBCYlRhYmxlIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuXG4gICAgLy8gQ29udGVudC5cbiAgICBAQ29udGVudENoaWxkcmVuKEJiVGFibGVDb2x1bW5EZWYsIHtyZWFkOiBUZW1wbGF0ZVJlZn0pIHRhYmxlQ29sdW1uVGVtcGxhdGVzOiBRdWVyeUxpc3Q8VGVtcGxhdGVSZWY8YW55Pj47XG4gICAgQENvbnRlbnRDaGlsZChCYlRhYmxlUm93RGVmLCB7cmVhZDogVGVtcGxhdGVSZWYsIHN0YXRpYzogZmFsc2V9KSB0YWJsZVJvd1RlbXBsYXRlPzogVGVtcGxhdGVSZWY8YW55PjtcblxuICAgIC8vIElucHV0cy5cbiAgICBASW5wdXQoKSBpZGVudGlmaWVyOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICBASW5wdXQoKSBkYXRhU291cmNlOiBEYXRhU291cmNlO1xuICAgIEBJbnB1dCgpIHF1ZXJ5RmllbGRzOiBzdHJpbmdbXSA9IFtdO1xuICAgIEBJbnB1dCgpIHNvcnRpbmdTdHJhdGVneTogJ3NpbmdsZScgfCAnbXVsdGlwbGUnID0gJ3NpbmdsZSc7XG4gICAgQElucHV0KCkgaGVhZGVyOiBUZW1wbGF0ZVJlZjxhbnk+IHwgYm9vbGVhbiA9IHRydWU7XG4gICAgQElucHV0KCkgZm9vdGVyOiBUZW1wbGF0ZVJlZjxhbnk+IHwgYm9vbGVhbiA9IHRydWU7XG5cbiAgICAvLyBTaXplcy5cbiAgICBwcml2YXRlIF9zaXplczogbnVtYmVyW10gPSBbMjUsIDUwLCA3NSwgMTAwXTtcblxuICAgIGdldCBzaXplcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NpemVzO1xuICAgIH1cblxuICAgIEBJbnB1dCgpXG4gICAgc2V0IHNpemVzKG5ld1ZhbHVlOiBudW1iZXJbXSkge1xuICAgICAgICB0aGlzLnVwZGF0ZVNpemVzKG5ld1ZhbHVlKTtcbiAgICB9XG5cbiAgICAvLyBPcHRpbWl6YXRpb25zLlxuICAgIHRyYWNrQnlGbiA9IChpbmRleCwgaXRlbSkgPT4gdGhpcy5pZGVudGlmaWVyID8gaXRlbVt0aGlzLmlkZW50aWZpZXJdIDogaW5kZXg7XG4gICAgdHJhY2tCeVZhbHVlID0gKF8sIGl0ZW0pID0+IGl0ZW07XG5cbiAgICAvLyBEYXRhLlxuICAgIHJlcXVlc3Q6IERhdGFTb3VyY2VSZXF1ZXN0O1xuICAgIGRhdGEkOiBPYnNlcnZhYmxlPHsgc3RhdGU6IHN0cmluZywgc3RhdHVzQ29kZT86IG51bWJlciwgcmVzdWx0PzogRGF0YVNvdXJjZVBhZ2VSZXNwb25zZSB9PjtcbiAgICBpc0xvYWRpbmckOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuXG4gICAgLy8gRm9ybS5cbiAgICBmb3JtOiBGb3JtR3JvdXA7XG4gICAgcXVlcnlDb250cm9sID0gbmV3IEZvcm1Db250cm9sKCcnKTtcblxuICAgIC8vIFN0YXRlLlxuICAgIHByaXZhdGUgX2hlYWRlckNvdW50OiBudW1iZXIgPSAwO1xuXG4gICAgLy8gU3Vic2NyaXB0aW9ucy5cbiAgICBwcml2YXRlIF9zdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLmNvbXBvc2VGb3JtKCk7XG4gICAgICAgIHRoaXMud2F0Y2hEYXRhQ2hhbmdlcygpO1xuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICB0aGlzLl9zdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuXG4gICAgZ2V0IGhlYWRlckNvdW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faGVhZGVyQ291bnQ7XG4gICAgfVxuXG4gICAgZ2V0IHNvcnRDb250cm9sKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5mb3JtPy5nZXQoJ3NvcnQnKSBhcyBGb3JtR3JvdXA7XG4gICAgfVxuXG4gICAgZ2V0IHBhZ2VOdW1iZXJDb250cm9sKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5mb3JtPy5nZXQoJ3BhZ2VOdW1iZXInKSBhcyBGb3JtQ29udHJvbDtcbiAgICB9XG5cbiAgICBnZXQgcGFnZVNpemVDb250cm9sKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5mb3JtPy5nZXQoJ3BhZ2VTaXplJykgYXMgRm9ybUNvbnRyb2w7XG4gICAgfVxuXG4gICAgcmVmcmVzaCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVxdWVzdC51cGRhdGUoKTtcbiAgICB9XG5cbiAgICBzZXRIZWFkZXJDb3VudChhbW91bnQ6IC0xIHwgMSkge1xuICAgICAgICB0aGlzLl9oZWFkZXJDb3VudCArPSBhbW91bnQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVTaXplcyhuZXdWYWx1ZTogbnVtYmVyW10pIHtcbiAgICAgICAgLy8gVmFsaWRhdGUgdGhlIHNpemVzIGhhcyBhdCBsZWFzdCBvbmUgdmFsdWUuXG4gICAgICAgIGlmIChuZXdWYWx1ZS5sZW5ndGggPD0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3Qgc2V0IGFuIGVtcHR5IGFycmF5IGFzIHRoZSBzaXplcy4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNldCB0aGUgbmV3IHNpemUuXG4gICAgICAgIHRoaXMuX3NpemVzID0gbmV3VmFsdWU7XG5cbiAgICAgICAgLy8gVmFsaWRhdGUgdGhhdCB0aGUgZm9ybSBleGlzdHMgYWxyZWFkeS5cbiAgICAgICAgaWYgKCF0aGlzLmZvcm0pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBjdXJyZW50IHNlbGVjdGVkIHZhbHVlIGlzXG4gICAgICAgIC8vIGluIHRoZSBuZXcgc2l6ZXMgYXJyYXkuXG4gICAgICAgIGNvbnN0IHBhZ2VTaXplQ29udHJvbCA9IHRoaXMuZm9ybS5nZXQoJ3BhZ2VTaXplJyk7XG4gICAgICAgIGlmICh0aGlzLl9zaXplcy5pbmNsdWRlcyhwYWdlU2l6ZUNvbnRyb2wudmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTZXQgdGhlIGZpcnN0IHZhbHVlIGluIHRoZSBhcnJheSBhc1xuICAgICAgICAvLyB0aGUgbmV3IHZhbHVlLlxuICAgICAgICBjb25zdCBmaXJzdFZhbHVlID0gdGhpcy5fc2l6ZXNbMF07XG4gICAgICAgIHBhZ2VTaXplQ29udHJvbC5zZXRWYWx1ZShmaXJzdFZhbHVlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNvbXBvc2VGb3JtKCkge1xuICAgICAgICAvLyBTZXR1cCB0aGUgZm9ybS5cbiAgICAgICAgdGhpcy5mb3JtID0gbmV3IEZvcm1Hcm91cCh7XG4gICAgICAgICAgICBwYWdlU2l6ZTogbmV3IEZvcm1Db250cm9sKHRoaXMuX3NpemVzWzBdKSxcbiAgICAgICAgICAgIHBhZ2VOdW1iZXI6IG5ldyBGb3JtQ29udHJvbCgxKSxcbiAgICAgICAgICAgIHNvcnQ6IG5ldyBGb3JtR3JvdXAoe30pXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgd2F0Y2hEYXRhQ2hhbmdlcygpIHtcbiAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IHJlcXVlc3QuXG4gICAgICAgIHRoaXMucmVxdWVzdCA9IG5ldyBEYXRhU291cmNlUmVxdWVzdCgpO1xuICAgICAgICB0aGlzLmlzTG9hZGluZyQgPSB0aGlzLnJlcXVlc3QubG9hZGluZztcblxuICAgICAgICBpZiAoIXRoaXMuZGF0YVNvdXJjZSkge1xuICAgICAgICAgICAgdGhpcy5kYXRhJCA9IG9mKHtzdGF0ZTogJ2Vycm9yX2RhdGFzb3VyY2UnfSkucGlwZShcbiAgICAgICAgICAgICAgICB0YXAoKCkgPT4gdGhpcy5yZXF1ZXN0LnN0b3BMb2FkaW5nKCkpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUGFzcyB0aGUgcmVxdWVzdCB0byB0aGUgZGF0YSBzb3VyY2UuXG4gICAgICAgIHRoaXMuZGF0YSQgPSB0aGlzLmRhdGFTb3VyY2UuaGFuZGxlKHRoaXMucmVxdWVzdCkucGlwZShcbiAgICAgICAgICAgIHRhcCgoKSA9PiB0aGlzLnJlcXVlc3Quc3RvcExvYWRpbmcoKSksXG4gICAgICAgICAgICBtYXAocmVzdWx0ID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb3VudCA9IChyZXN1bHQgJiYgcmVzdWx0LmRhdGEgJiYgcmVzdWx0LmRhdGEubGVuZ3RoKSB8fCAwO1xuICAgICAgICAgICAgICAgIGlmIChjb3VudCA8PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7c3RhdGU6ICdlbXB0eScsIHJlc3VsdH07XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtzdGF0ZTogJ3N1Y2Nlc3MnLCByZXN1bHR9O1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBjYXRjaEVycm9yKGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlcXVlc3Quc3RvcExvYWRpbmcoKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHN0YXR1c0NvZGUgPSBlcnJvcj8uc3RhdHVzID8/IG51bGw7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhdGVzID0ge1xuICAgICAgICAgICAgICAgICAgICAwOiAnZXJyb3JfZG93bicsXG4gICAgICAgICAgICAgICAgICAgIDQwMTogJ2Vycm9yX3VuYXV0aG9yaXplZCcsXG4gICAgICAgICAgICAgICAgICAgIDQwMzogJ2Vycm9yX2ZvcmJpZGRlbicsXG4gICAgICAgICAgICAgICAgICAgIDQwNDogJ2Vycm9yX25vdF9mb3VuZCcsXG4gICAgICAgICAgICAgICAgICAgIDUwMDogJ2Vycm9yX3NlcnZlcidcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9mKHtzdGF0ZTogc3RhdGVzPy5bc3RhdHVzQ29kZV0gPz8gJ2Vycm9yX3Vua25vd24nLCBzdGF0dXNDb2RlOiBzdGF0dXNDb2RlfSk7XG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuXG4gICAgICAgIC8vIFN1YnNjcmliZSB0byB0aGUgZGF0YSBjaGFuZ2VzLlxuICAgICAgICB0aGlzLnN1YnNjcmliZVRvQ2hhbmdlcygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3Vic2NyaWJlVG9DaGFuZ2VzKCkge1xuICAgICAgICBjb25zdCBmb3JtJCA9IHRoaXMuZ2V0Rm9ybUNoYW5nZXMoKTtcbiAgICAgICAgY29uc3QgcXVlcnkkID0gdGhpcy5nZXRRdWVyeUNoYW5nZXMoKTtcblxuICAgICAgICB0aGlzLl9zdWJzY3JpcHRpb24gPSBjb21iaW5lTGF0ZXN0KFtmb3JtJCwgcXVlcnkkXSkuc3Vic2NyaWJlKChbZm9ybSwgcXVlcnldKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7cGFnZU51bWJlciwgcGFnZVNpemV9ID0gZm9ybTtcbiAgICAgICAgICAgIGNvbnN0IHNvcnQgPSBPYmplY3Qua2V5cyhmb3JtLnNvcnQpXG4gICAgICAgICAgICAgICAgLm1hcChuYW1lID0+ICh7bmFtZSwgZGlyZWN0aW9uOiBmb3JtLnNvcnRbbmFtZV19KSlcbiAgICAgICAgICAgICAgICAuZmlsdGVyKGl0ZW0gPT4gWydhc2MnLCAnZGVzYyddLmluY2x1ZGVzKGl0ZW0uZGlyZWN0aW9uKSk7XG5cbiAgICAgICAgICAgIHRoaXMucmVxdWVzdC5zdGFydExvYWRpbmcoKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3QudXBkYXRlKHtcbiAgICAgICAgICAgICAgICBzb3J0LFxuICAgICAgICAgICAgICAgIHF1ZXJ5LFxuICAgICAgICAgICAgICAgIHBhZ2VTaXplLFxuICAgICAgICAgICAgICAgIHBhZ2VOdW1iZXIsXG4gICAgICAgICAgICAgICAgcXVlcnlGaWVsZHM6IHRoaXMucXVlcnlGaWVsZHNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFF1ZXJ5Q2hhbmdlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucXVlcnlDb250cm9sLnZhbHVlQ2hhbmdlcy5waXBlKFxuICAgICAgICAgICAgZGVib3VuY2VUaW1lKDQwMCksXG4gICAgICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICAgICAgICAgc3RhcnRXaXRoKHRoaXMucXVlcnlDb250cm9sLnZhbHVlIGFzIHN0cmluZylcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEZvcm1DaGFuZ2VzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5mb3JtLnZhbHVlQ2hhbmdlcy5waXBlKFxuICAgICAgICAgICAgc3RhcnRXaXRoKHRoaXMuZm9ybS52YWx1ZSBhcyBvYmplY3QpXG4gICAgICAgICk7XG4gICAgfVxuXG59XG4iLCI8IS0tXG4gICAgVGhpcyBpcyB0aGUgaGVhZGVyIG9mIHRoZSB0YWJsZS4gSXQgY2FuIGJlIGEgdXNlclxuICAgIGRlZmluZWQgY3VzdG9tIGhlYWRlciBvciBqdXN0IHRoZSBkZWZhdWx0IGhlYWRlci5cbi0tPlxuXG48aGVhZGVyICpuZ0lmPVwiKGhlYWRlciA9PT0gdHJ1ZSA/IGhlYWRlclRlbXBsYXRlIDogaGVhZGVyKSBhcyB0ZW1wbGF0ZVwiXG4gICAgICAgIGNsYXNzPVwiYmItdGFibGUtdG9wLWFjdGlvbnNcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbjwvaGVhZGVyPlxuXG48IS0tXG4gICAgVGhpcyBpcyB0aGUgdGFibGUgdGhhdCBjb250YWlucyB0aGVcbiAgICByb3dzIGFuZCBjb2x1bW5zLlxuLS0+XG5cbjxkaXYgY2xhc3M9XCJiYi10YWJsZS13cmFwcGVyXCI+XG4gICAgPGRpdiAqbmdJZj1cImlzTG9hZGluZyQgfCBhc3luY1wiXG4gICAgICAgICBjbGFzcz1cImJiLXRhYmxlLXByb2dyZXNzXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJiYi10YWJsZS1pbmRldGVybWluYXRlXCI+PC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPHRhYmxlIGNsYXNzPVwiYmItdGFibGUtY29udGFpbmVyXCI+XG4gICAgICAgIDx0aGVhZD5cbiAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJiYi10YWJsZS1oZWFkZXItY2VsbFwiPjwvbmctY29udGVudD5cbiAgICAgICAgICAgIDwvdHI+XG4gICAgICAgIDwvdGhlYWQ+XG4gICAgICAgIDx0Ym9keSAqbmdJZj1cImRhdGEkIHwgYXN5bmMgYXMgZGF0YTsgZWxzZSBpc0xvYWRpbmdUZW1wbGF0ZVwiXG4gICAgICAgICAgICAgICBbbmdTd2l0Y2hdPVwiZGF0YT8uc3RhdGVcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidzdWNjZXNzJ1wiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhIXRhYmxlUm93VGVtcGxhdGU7IGVsc2UgdGFibGVDZWxsc1RlbXBsYXRlc1wiPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cInRhYmxlUm93VGVtcGxhdGU7IGNvbnRleHQ6IHtkYXRhOiBkYXRhPy5yZXN1bHQ/LmRhdGEgfHwgW119XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3RhYmxlQ2VsbHNUZW1wbGF0ZXM+XG4gICAgICAgICAgICAgICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBkYXRhPy5yZXN1bHQ/LmRhdGE7IHRyYWNrQnk6IHRyYWNrQnlGblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgdGVtcGxhdGUgb2YgdGFibGVDb2x1bW5UZW1wbGF0ZXNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGVtcGxhdGU7IGNvbnRleHQ6IHtpdGVtOiBpdGVtfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInZW1wdHknXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cImVycm9yVGVtcGxhdGU7IGNvbnRleHQ6IGRhdGFcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInZXJyb3JfZGF0YXNvdXJjZSdcIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiZXJyb3JUZW1wbGF0ZTsgY29udGV4dDogZGF0YVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidlcnJvcl9ub3RfZm91bmQnXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cImVycm9yVGVtcGxhdGU7IGNvbnRleHQ6IGRhdGFcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInZXJyb3Jfc2VydmVyJ1wiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJlcnJvclRlbXBsYXRlOyBjb250ZXh0OiBkYXRhXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2Vycm9yX2Rvd24nXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cImVycm9yVGVtcGxhdGU7IGNvbnRleHQ6IGRhdGFcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaERlZmF1bHQ+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cImVycm9yVGVtcGxhdGU7IGNvbnRleHQ6IGRhdGFcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L3Rib2R5PlxuICAgIDwvdGFibGU+XG48L2Rpdj5cblxuPGZvb3RlciAqbmdJZj1cIihmb290ZXIgPT09IHRydWUgPyBmb290ZXJUZW1wbGF0ZSA6IGZvb3RlcikgYXMgdGVtcGxhdGVcIlxuICAgICAgICBjbGFzcz1cImJiLXRhYmxlLWJvdHRvbS1hY3Rpb25zXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG48L2Zvb3Rlcj5cblxuPG5nLXRlbXBsYXRlICNpc0xvYWRpbmdUZW1wbGF0ZT5cbiAgICA8dHI+XG4gICAgICAgIDx0ZCBbYXR0ci5jb2xzcGFuXT1cImhlYWRlckNvdW50XCJcbiAgICAgICAgICAgIGNsYXNzPVwiYmItdGFibGUtdGVtcGxhdGVcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYi10YWJsZS10ZW1wbGF0ZS1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAge3sgJ3RhYmxlcy5sb2FkaW5nJyB8IGJiTG9jYWxpemUgfX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L3RkPlxuICAgIDwvdHI+XG48L25nLXRlbXBsYXRlPlxuXG48IS0tXG4gICAgVGhpcyBpcyB0aGUgdGVtcGxhdGUgdGhhdCB3aWxsIGJlIHVzZWQgd2hlbiB0aGUgdXNlciBoYXMgbm90XG4gICAgc3VwcGxpZWQgYSBjdXN0b20gaGVhZGVyIHRlbXBsYXRlLlxuLS0+XG5cbjxuZy10ZW1wbGF0ZSAjaGVhZGVyVGVtcGxhdGU+XG4gICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgIDxiYi1mb3JtLWNvbnRyb2w+XG4gICAgICAgIDxpbnB1dCBbZm9ybUNvbnRyb2xdPVwicXVlcnlDb250cm9sXCJcbiAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCIndGFibGVzLnNlYXJjaCcgfCBiYkxvY2FsaXplXCJcbiAgICAgICAgICAgICAgIGJiSW5wdXRcbiAgICAgICAgICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiPlxuICAgICAgICA8YmItaWNvbiAqbmdJZj1cInF1ZXJ5Q29udHJvbD8udmFsdWU/Lmxlbmd0aCA8PSAwOyBlbHNlIGNsb3NlQnV0dG9uVGVtcGxhdGVcIlxuICAgICAgICAgICAgICAgICBiYlN1ZmZpeFxuICAgICAgICAgICAgICAgICBzcmM9XCJtYXRlcmlhbDpzZWFyY2hcIj5cbiAgICAgICAgPC9iYi1pY29uPlxuICAgIDwvYmItZm9ybS1jb250cm9sPlxuPC9uZy10ZW1wbGF0ZT5cblxuPCEtLVxuICAgIFRoaXMgaXMgdGhlIHRlbXBsYXRlIHRoYXQgd2lsbCBiZSB1c2VkIHdoZW4gdGhlIHVzZXIgaGFzIG5vdFxuICAgIHN1cHBsaWVkIGEgY3VzdG9tIGZvb3RlciB0ZW1wbGF0ZS5cbi0tPlxuXG48bmctdGVtcGxhdGUgI2Zvb3RlclRlbXBsYXRlPlxuICAgIDxiYi1mb3JtLWNvbnRyb2wgKm5nSWY9XCJzaXplcz8ubGVuZ3RoID4gMVwiPlxuICAgICAgICA8c2VsZWN0IFtmb3JtQ29udHJvbF09XCJwYWdlU2l6ZUNvbnRyb2xcIlxuICAgICAgICAgICAgICAgIGJiSW5wdXRcbiAgICAgICAgICAgICAgICB0aXRsZT1cIlNpemVzXCI+XG4gICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBpdGVtIG9mIHNpemVzOyB0cmFja0J5OiB0cmFja0J5VmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICBbbmdWYWx1ZV09XCJpdGVtXCI+XG4gICAgICAgICAgICAgICAge3sgaXRlbSB9fSAvIHt7ICd0YWJsZXMucGFnZScgfCBiYkxvY2FsaXplIH19XG4gICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgPC9zZWxlY3Q+XG4gICAgPC9iYi1mb3JtLWNvbnRyb2w+XG5cbiAgICA8YmItdGFibGUtcGFnZXIgW3RvdGFsUGFnZXNdPVwiKGRhdGEkIHwgYXN5bmMpPy5yZXN1bHQ/LnRvdGFsUGFnZXNcIlxuICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwicGFnZU51bWJlckNvbnRyb2xcIj5cbiAgICA8L2JiLXRhYmxlLXBhZ2VyPlxuPC9uZy10ZW1wbGF0ZT5cblxuPCEtLVxuICAgIFRoaXMgdGhlIHRlbXBsYXRlIHRoYXQgd2lsbCBiZSB1c2VkIHdoZW4gdGhlIHVzZXJcbiAgICBoYXMgZmlsbGVkIGluIHNvbWUgZGF0YSBpbiB0aGUgcXVlcnkgY29udHJvbC5cbi0tPlxuXG48bmctdGVtcGxhdGUgI2Nsb3NlQnV0dG9uVGVtcGxhdGU+XG4gICAgPGJ1dHRvbiBiYlN1ZmZpeFxuICAgICAgICAgICAgKGNsaWNrKT1cInF1ZXJ5Q29udHJvbD8ucGF0Y2hWYWx1ZSgnJylcIlxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cImJiLXRhYmxlLXByb2dyZXNzLWNsb3NlLXF1ZXJ5XCI+XG4gICAgICAgIDxiYi1pY29uIHNyYz1cIm1hdGVyaWFsOmNsb3NlXCI+PC9iYi1pY29uPlxuICAgIDwvYnV0dG9uPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNlcnJvclRlbXBsYXRlIGxldC1zdGF0ZT1cInN0YXRlXCIgbGV0LXN0YXR1cz1cInN0YXR1c0NvZGVcIj5cbiAgICA8dHI+XG4gICAgICAgIDx0ZCBbYXR0ci5jb2xzcGFuXT1cImhlYWRlckNvdW50XCJcbiAgICAgICAgICAgIGNsYXNzPVwiYmItdGFibGUtdGVtcGxhdGVcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYi10YWJsZS10ZW1wbGF0ZS1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCI2NFwiIGhlaWdodD1cIjQxXCI+XG4gICAgICAgICAgICAgICAgICAgIDxnIGZpbGw9XCJub25lXCIgZmlsbC1ydWxlPVwiZXZlbm9kZFwiIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgwIDEpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZWxsaXBzZSBjeD1cIjMyXCIgY3k9XCIzM1wiIGZpbGw9XCIjRjVGNUY1XCIgcng9XCIzMlwiIHJ5PVwiN1wiPjwvZWxsaXBzZT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxnIGZpbGwtcnVsZT1cIm5vbnplcm9cIiBzdHJva2U9XCIjRDlEOUQ5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk01NSAxMi43NjA1NjA0TDQ0Ljg1NDMwNDcgMS4yNTczOTYzM0M0NC4zNjc0NDE0LjQ3MzgyNjYxIDQzLjY1NTg3ODkgMCA0Mi45MDY3NjE3IDBIMjEuMDkzMjM4M2MtLjc0OTExNzIgMC0xLjQ2MDY3OTcuNDczOTUwMjUtMS45NDc1NDMgMS4yNTczOTYzM0w5IDEyLjc2MDU2MDRWMjJoNDZ2LTkuMjM5NDM5NnpcIj48L3BhdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZmlsbD1cIiNGQUZBRkFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNNDEuNjEzMjgxMyAxNS45MzE1YzAtMS42MDU2NDg5Ljk5MzY3MTgtMi45MzEyNjYgMi4yMjY0MTc5LTIuOTMxNUg1NXYxOC4xMzcxMjc3QzU1IDMzLjI1ODk1NzQgNTMuNjc5Mzg2NyAzNSA1Mi4wNTA0Mjk3IDM1SDExLjk0OTU3MDMxQzEwLjMyMDUyMzQ0IDM1IDkgMzMuMjU4ODQwNCA5IDMxLjEzNzEyNzdWMTNoMTEuMTYwMzAwOGMxLjIzMjc0NjEgMCAyLjIyNjQxOCAxLjMyMjgwODUgMi4yMjY0MTggMi45Mjg0NTc0di4wMjExODA5YzAgMS42MDU2NDg5IDEuMDA0OTkyMSAyLjkwMTU0MjYgMi4yMzc3MzgyIDIuOTAxNTQyNmgxNC43NTEwODZjMS4yMzI3NDYxIDAgMi4yMzc3MzgzLTEuMzA3ODI5OCAyLjIzNzczODMtMi45MTM0Nzg4VjE1LjkzMTV6XCI+PC9wYXRoPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9nPlxuICAgICAgICAgICAgICAgICAgICA8L2c+XG4gICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJzdGF0ZSBhcyBzdGF0ZUxhYmVsXCI+e3sgKCd0YWJsZXMuJyArIHN0YXRlTGFiZWwpIHwgYmJMb2NhbGl6ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInN0YXR1cyBhcyBzdGF0dXNDb2RlXCJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJiLXRhYmxlLXRlbXBsYXRlLWNvbnRlbnQtY29kZVwiPihIVFRQIHt7IHN0YXR1c0NvZGUgfX0pPC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvdGQ+XG4gICAgPC90cj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=