@bravobit/bb-foundation 0.26.2 → 0.27.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/auth/lib/directives/authenticated.directive.d.ts +1 -1
- package/collections/lib/components/collections-pager/collections-pager.component.d.ts +1 -1
- package/collections/lib/components/collections-viewer/collections-viewer.component.d.ts +1 -1
- package/controls/lib/checkbox/checkbox/checkbox.component.d.ts +1 -1
- package/controls/lib/checkbox/checkbox-group/checkbox-group.component.d.ts +1 -1
- package/controls/lib/control-error/control-error/control-error.component.d.ts +1 -1
- package/controls/lib/form-control/form-control/form-control.component.d.ts +1 -1
- package/controls/lib/form-control/form-control-addon/form-control-addon.component.d.ts +1 -1
- package/controls/lib/form-control/form-control-input.directive.d.ts +1 -1
- package/controls/lib/radio/radio-button/radio-button.component.d.ts +1 -1
- package/controls/lib/radio/radio-group/radio-group.component.d.ts +1 -1
- package/controls/lib/toggle/toggle/toggle.component.d.ts +1 -1
- package/controls/lib/toggle/toggle-group/toggle-group.component.d.ts +1 -1
- package/dashboard/lib/dashboard/dashboard.component.d.ts +1 -1
- package/dashboard/lib/dashboard-menu/dashboard-menu.component.d.ts +1 -1
- package/dashboard/lib/dashboard-menu-item/dashboard-menu-item.component.d.ts +1 -1
- package/dashboard/lib/dashboard-sidebar-group/dashboard-sidebar-group.component.d.ts +1 -1
- package/dashboard/lib/dashboard-sidebar-item/dashboard-sidebar-item.component.d.ts +1 -1
- package/dialog/lib/dialog-modal/dialog-modal.component.d.ts +1 -1
- package/elements/lib/avatar/avatar.component.d.ts +1 -1
- package/elements/lib/button/button.component.d.ts +2 -2
- package/elements/lib/checkbox/checkbox.component.d.ts +1 -1
- package/elements/lib/date-picker/date-picker.component.d.ts +1 -1
- package/elements/lib/directives/input.directive.d.ts +2 -2
- package/elements/lib/dropdown/dropdown.component.d.ts +1 -1
- package/elements/lib/file-picker/file-picker.component.d.ts +2 -2
- package/elements/lib/form-control/form-control.component.d.ts +1 -1
- package/elements/lib/form-error/form-error.component.d.ts +1 -1
- package/elements/lib/form-group/form-group.component.d.ts +1 -1
- package/elements/lib/icon/icon.component.d.ts +1 -1
- package/elements/lib/image-picker/image-picker.component.d.ts +1 -1
- package/elements/lib/spinner/spinner.component.d.ts +1 -1
- package/esm2022/auth/lib/auth.interceptor.mjs +91 -0
- package/esm2022/auth/lib/auth.module.mjs +36 -0
- package/esm2022/auth/lib/auth.service.mjs +271 -0
- package/esm2022/auth/lib/directives/authenticated.directive.mjs +43 -0
- package/esm2022/auth/lib/guards/anonymous.guard.mjs +54 -0
- package/esm2022/auth/lib/guards/authenticated.guard.mjs +57 -0
- package/esm2022/collections/lib/collections.module.mjs +55 -0
- package/esm2022/collections/lib/components/collections-pager/collections-pager.component.mjs +124 -0
- package/esm2022/collections/lib/components/collections-viewer/collections-viewer.component.mjs +32 -0
- package/esm2022/collections/lib/components/collections.directive.mjs +47 -0
- package/esm2022/controls/lib/checkbox/checkbox/checkbox.component.mjs +179 -0
- package/esm2022/controls/lib/checkbox/checkbox-group/checkbox-group.component.mjs +69 -0
- package/esm2022/controls/lib/checkbox/checkbox.module.mjs +21 -0
- package/esm2022/controls/lib/control-error/control-error/control-error.component.mjs +64 -0
- package/esm2022/controls/lib/control-error/control-error-submit.directive.mjs +48 -0
- package/esm2022/controls/lib/control-error/control-error.module.mjs +20 -0
- package/esm2022/controls/lib/controls.module.mjs +63 -0
- package/esm2022/controls/lib/form-control/form-control/form-control.component.mjs +80 -0
- package/esm2022/controls/lib/form-control/form-control-addon/form-control-addon.component.mjs +23 -0
- package/esm2022/controls/lib/form-control/form-control-input.directive.mjs +125 -0
- package/esm2022/controls/lib/form-control/form-control.module.mjs +35 -0
- package/esm2022/controls/lib/radio/radio-button/radio-button.component.mjs +76 -0
- package/esm2022/controls/lib/radio/radio-group/radio-group.component.mjs +169 -0
- package/esm2022/controls/lib/radio/radio.module.mjs +22 -0
- package/esm2022/controls/lib/toggle/toggle/toggle.component.mjs +154 -0
- package/esm2022/controls/lib/toggle/toggle-group/toggle-group.component.mjs +63 -0
- package/esm2022/controls/lib/toggle/toggle.module.mjs +21 -0
- package/esm2022/dashboard/lib/dashboard/dashboard.component.mjs +58 -0
- package/{esm2020 → esm2022}/dashboard/lib/dashboard-header/dashboard-header.component.mjs +6 -5
- package/esm2022/dashboard/lib/dashboard-menu/dashboard-menu.component.mjs +32 -0
- package/esm2022/dashboard/lib/dashboard-menu-item/dashboard-menu-item.component.mjs +30 -0
- package/esm2022/dashboard/lib/dashboard-sidebar/dashboard-sidebar.component.mjs +76 -0
- package/esm2022/dashboard/lib/dashboard-sidebar-group/dashboard-sidebar-group.component.mjs +100 -0
- package/esm2022/dashboard/lib/dashboard-sidebar-item/dashboard-sidebar-item.component.mjs +63 -0
- package/esm2022/dashboard/lib/dashboard.module.mjs +48 -0
- package/esm2022/dialog/lib/dialog-actions/dialog-actions.component.mjs +13 -0
- package/esm2022/dialog/lib/dialog-confirm/dialog-confirm.component.mjs +47 -0
- package/esm2022/dialog/lib/dialog-container/dialog-container.component.mjs +78 -0
- package/esm2022/dialog/lib/dialog-header/dialog-header.component.mjs +19 -0
- package/esm2022/dialog/lib/dialog-link/dialog-link.component.mjs +12 -0
- package/esm2022/dialog/lib/dialog-modal/dialog-modal.component.mjs +68 -0
- package/esm2022/dialog/lib/dialog-overlay/dialog-overlay.component.mjs +80 -0
- package/esm2022/dialog/lib/dialog.insertion.mjs +17 -0
- package/esm2022/dialog/lib/dialog.module.mjs +69 -0
- package/esm2022/dialog/lib/dialog.service.mjs +69 -0
- package/esm2022/elements/lib/avatar/avatar.component.mjs +150 -0
- package/esm2022/elements/lib/button/button.component.mjs +63 -0
- package/esm2022/elements/lib/checkbox/checkbox.component.mjs +74 -0
- package/esm2022/elements/lib/date-picker/date-picker.component.mjs +308 -0
- package/esm2022/elements/lib/directives/addon.directive.mjs +31 -0
- package/esm2022/elements/lib/directives/form-submit.directive.mjs +51 -0
- package/esm2022/elements/lib/directives/form-submitter.directive.mjs +26 -0
- package/esm2022/elements/lib/directives/input.directive.mjs +138 -0
- package/esm2022/elements/lib/dropdown/dropdown.component.mjs +102 -0
- package/esm2022/elements/lib/elements.module.mjs +178 -0
- package/esm2022/elements/lib/file-picker/file-picker.component.mjs +237 -0
- package/esm2022/elements/lib/form-control/form-control.component.mjs +50 -0
- package/esm2022/elements/lib/form-error/form-error.component.mjs +124 -0
- package/esm2022/elements/lib/form-group/form-group.component.mjs +19 -0
- package/esm2022/elements/lib/icon/icon.component.mjs +103 -0
- package/esm2022/elements/lib/image-picker/image-picker.component.mjs +107 -0
- package/esm2022/elements/lib/pipes/file-image.pipe.mjs +44 -0
- package/esm2022/elements/lib/pipes/file-size.pipe.mjs +29 -0
- package/esm2022/elements/lib/pipes/relative-time.pipe.mjs +97 -0
- package/esm2022/elements/lib/spinner/spinner.component.mjs +26 -0
- package/esm2022/elements/lib/tag/tag.component.mjs +19 -0
- package/esm2022/http/lib/http.module.mjs +44 -0
- package/esm2022/http/lib/interceptors/base-url.interceptor.mjs +51 -0
- package/esm2022/http/lib/interceptors/error.interceptor.mjs +33 -0
- package/esm2022/lib/core/services/clipboard.service.mjs +71 -0
- package/esm2022/lib/core/services/exif.service.mjs +164 -0
- package/esm2022/lib/core/services/file-loader.service.mjs +88 -0
- package/esm2022/lib/core/services/image-converter.service.mjs +124 -0
- package/esm2022/lib/core/services/languages.service.mjs +75 -0
- package/esm2022/lib/core/services/network.service.mjs +56 -0
- package/esm2022/lib/core/services/patch.service.mjs +64 -0
- package/esm2022/localize/lib/localize.module.mjs +82 -0
- package/esm2022/localize/lib/localize.pipe.mjs +47 -0
- package/esm2022/localize/lib/localize.service.mjs +186 -0
- package/{esm2020 → esm2022}/localize/lib/transforms/interpolate.transform.mjs +1 -1
- package/{esm2020 → esm2022}/localize/lib/transforms/reference.transform.mjs +1 -1
- package/esm2022/localize/lib/views/localize-string/localize-string.component.mjs +89 -0
- package/esm2022/localize/lib/views/localize-template.directive.mjs +22 -0
- package/esm2022/masking/lib/directives/currency-mask.directive.mjs +36 -0
- package/esm2022/masking/lib/directives/date-mask.directive.mjs +36 -0
- package/esm2022/masking/lib/directives/input-mask.directive.mjs +119 -0
- package/esm2022/masking/lib/masking.module.mjs +31 -0
- package/esm2022/masking/lib/masking.service.mjs +104 -0
- package/esm2022/notifications/lib/notifications-item/notifications-item.component.mjs +101 -0
- package/esm2022/notifications/lib/notifications-list/notifications-list.component.mjs +48 -0
- package/esm2022/notifications/lib/notifications.module.mjs +31 -0
- package/esm2022/notifications/lib/notifications.service.mjs +142 -0
- package/esm2022/permissions/lib/directives/permission.directive.mjs +89 -0
- package/esm2022/permissions/lib/guards/permission.guard.mjs +57 -0
- package/esm2022/permissions/lib/permissions.module.mjs +40 -0
- package/esm2022/permissions/lib/permissions.service.mjs +97 -0
- package/esm2022/recaptcha/lib/recaptcha/recaptcha.component.mjs +220 -0
- package/esm2022/recaptcha/lib/recaptcha-loader.service.mjs +96 -0
- package/esm2022/recaptcha/lib/recaptcha.module.mjs +28 -0
- package/esm2022/storage/lib/storage.service.mjs +110 -0
- package/esm2022/table/lib/components/table/table.component.mjs +194 -0
- package/esm2022/table/lib/components/table-cell/table-cell.component.mjs +12 -0
- package/esm2022/table/lib/components/table-header-cell/table-header-cell.component.mjs +132 -0
- package/esm2022/table/lib/components/table-pager/table-pager.component.mjs +137 -0
- package/esm2022/table/lib/data/generic.data.mjs +82 -0
- package/esm2022/table/lib/table.module.mjs +43 -0
- package/esm2022/theming/lib/theming.directive.mjs +39 -0
- package/esm2022/theming/lib/theming.module.mjs +17 -0
- package/esm2022/tooltip/lib/tooltip-container/tooltip-container.component.mjs +32 -0
- package/esm2022/tooltip/lib/tooltip.directive.mjs +141 -0
- package/esm2022/tooltip/lib/tooltip.module.mjs +32 -0
- package/esm2022/utils/lib/directives/autosize.directive.mjs +73 -0
- package/esm2022/utils/lib/directives/focus-trap.directive.mjs +78 -0
- package/esm2022/utils/lib/directives/focus.directive.mjs +38 -0
- package/esm2022/utils/lib/directives/template.directive.mjs +29 -0
- package/esm2022/utils/lib/functions/parse-date.function.mjs +19 -0
- package/esm2022/utils/lib/utils.module.mjs +36 -0
- package/esm2022/utils/public_api.mjs +7 -0
- package/{fesm2020 → fesm2022}/bravobit-bb-foundation-auth.mjs +19 -19
- package/{fesm2020 → fesm2022}/bravobit-bb-foundation-auth.mjs.map +1 -1
- package/{fesm2020 → fesm2022}/bravobit-bb-foundation-collections.mjs +38 -38
- package/{fesm2020 → fesm2022}/bravobit-bb-foundation-collections.mjs.map +1 -1
- package/{fesm2020 → fesm2022}/bravobit-bb-foundation-controls.mjs +83 -83
- package/{fesm2020 → fesm2022}/bravobit-bb-foundation-controls.mjs.map +1 -1
- package/{fesm2020 → fesm2022}/bravobit-bb-foundation-dashboard.mjs +37 -37
- package/{fesm2020 → fesm2022}/bravobit-bb-foundation-dashboard.mjs.map +1 -1
- package/{fesm2020 → fesm2022}/bravobit-bb-foundation-dialog.mjs +46 -46
- package/{fesm2020 → fesm2022}/bravobit-bb-foundation-dialog.mjs.map +1 -1
- package/{fesm2020 → fesm2022}/bravobit-bb-foundation-elements.mjs +185 -185
- package/fesm2022/bravobit-bb-foundation-elements.mjs.map +1 -0
- package/{fesm2020 → fesm2022}/bravobit-bb-foundation-http.mjs +10 -10
- package/{fesm2020 → fesm2022}/bravobit-bb-foundation-http.mjs.map +1 -1
- package/{fesm2020 → fesm2022}/bravobit-bb-foundation-localize.mjs +20 -20
- package/{fesm2020 → fesm2022}/bravobit-bb-foundation-localize.mjs.map +1 -1
- package/{fesm2020 → fesm2022}/bravobit-bb-foundation-masking.mjs +20 -20
- package/{fesm2020 → fesm2022}/bravobit-bb-foundation-masking.mjs.map +1 -1
- package/{fesm2020 → fesm2022}/bravobit-bb-foundation-notifications.mjs +13 -13
- package/{fesm2020 → fesm2022}/bravobit-bb-foundation-notifications.mjs.map +1 -1
- package/{fesm2020 → fesm2022}/bravobit-bb-foundation-permissions.mjs +13 -13
- package/{fesm2020 → fesm2022}/bravobit-bb-foundation-permissions.mjs.map +1 -1
- package/{fesm2020 → fesm2022}/bravobit-bb-foundation-recaptcha.mjs +16 -16
- package/{fesm2015 → fesm2022}/bravobit-bb-foundation-recaptcha.mjs.map +1 -1
- package/{fesm2020 → fesm2022}/bravobit-bb-foundation-storage.mjs +3 -3
- package/{fesm2020 → fesm2022}/bravobit-bb-foundation-storage.mjs.map +1 -1
- package/{fesm2020 → fesm2022}/bravobit-bb-foundation-table.mjs +46 -36
- package/fesm2022/bravobit-bb-foundation-table.mjs.map +1 -0
- package/{fesm2020 → fesm2022}/bravobit-bb-foundation-theming.mjs +7 -7
- package/{fesm2020 → fesm2022}/bravobit-bb-foundation-theming.mjs.map +1 -1
- package/{fesm2020 → fesm2022}/bravobit-bb-foundation-tooltip.mjs +13 -13
- package/{fesm2020 → fesm2022}/bravobit-bb-foundation-tooltip.mjs.map +1 -1
- package/{fesm2020 → fesm2022}/bravobit-bb-foundation-utils.mjs +42 -23
- package/fesm2022/bravobit-bb-foundation-utils.mjs.map +1 -0
- package/{fesm2020 → fesm2022}/bravobit-bb-foundation.mjs +21 -21
- package/{fesm2020 → fesm2022}/bravobit-bb-foundation.mjs.map +1 -1
- package/localize/lib/views/localize-string/localize-string.component.d.ts +1 -1
- package/localize/lib/views/localize-template.directive.d.ts +1 -1
- package/masking/lib/directives/currency-mask.directive.d.ts +1 -1
- package/masking/lib/directives/date-mask.directive.d.ts +1 -1
- package/masking/lib/directives/input-mask.directive.d.ts +1 -1
- package/notifications/lib/notifications-item/notifications-item.component.d.ts +1 -1
- package/package.json +70 -112
- package/permissions/lib/directives/permission.directive.d.ts +1 -1
- package/recaptcha/lib/recaptcha/recaptcha.component.d.ts +1 -1
- package/table/lib/components/table/table.component.d.ts +1 -1
- package/table/lib/components/table-header-cell/table-header-cell.component.d.ts +1 -1
- package/table/lib/components/table-pager/table-pager.component.d.ts +1 -1
- package/table/lib/data/generic.data.d.ts +2 -0
- package/theming/lib/theming.directive.d.ts +1 -1
- package/tooltip/lib/tooltip.directive.d.ts +1 -1
- package/utils/lib/directives/autosize.directive.d.ts +1 -1
- package/utils/lib/directives/template.directive.d.ts +1 -1
- package/utils/lib/functions/parse-date.function.d.ts +1 -0
- package/utils/public_api.d.ts +1 -0
- package/esm2020/auth/lib/auth.interceptor.mjs +0 -90
- package/esm2020/auth/lib/auth.module.mjs +0 -35
- package/esm2020/auth/lib/auth.service.mjs +0 -270
- package/esm2020/auth/lib/directives/authenticated.directive.mjs +0 -42
- package/esm2020/auth/lib/guards/anonymous.guard.mjs +0 -53
- package/esm2020/auth/lib/guards/authenticated.guard.mjs +0 -56
- package/esm2020/collections/lib/collections.module.mjs +0 -54
- package/esm2020/collections/lib/components/collections-pager/collections-pager.component.mjs +0 -123
- package/esm2020/collections/lib/components/collections-viewer/collections-viewer.component.mjs +0 -31
- package/esm2020/collections/lib/components/collections.directive.mjs +0 -43
- package/esm2020/controls/lib/checkbox/checkbox/checkbox.component.mjs +0 -178
- package/esm2020/controls/lib/checkbox/checkbox-group/checkbox-group.component.mjs +0 -68
- package/esm2020/controls/lib/checkbox/checkbox.module.mjs +0 -20
- package/esm2020/controls/lib/control-error/control-error/control-error.component.mjs +0 -63
- package/esm2020/controls/lib/control-error/control-error-submit.directive.mjs +0 -47
- package/esm2020/controls/lib/control-error/control-error.module.mjs +0 -19
- package/esm2020/controls/lib/controls.module.mjs +0 -62
- package/esm2020/controls/lib/form-control/form-control/form-control.component.mjs +0 -79
- package/esm2020/controls/lib/form-control/form-control-addon/form-control-addon.component.mjs +0 -22
- package/esm2020/controls/lib/form-control/form-control-input.directive.mjs +0 -124
- package/esm2020/controls/lib/form-control/form-control.module.mjs +0 -34
- package/esm2020/controls/lib/radio/radio-button/radio-button.component.mjs +0 -75
- package/esm2020/controls/lib/radio/radio-group/radio-group.component.mjs +0 -168
- package/esm2020/controls/lib/radio/radio.module.mjs +0 -21
- package/esm2020/controls/lib/toggle/toggle/toggle.component.mjs +0 -153
- package/esm2020/controls/lib/toggle/toggle-group/toggle-group.component.mjs +0 -62
- package/esm2020/controls/lib/toggle/toggle.module.mjs +0 -20
- package/esm2020/dashboard/lib/dashboard/dashboard.component.mjs +0 -57
- package/esm2020/dashboard/lib/dashboard-menu/dashboard-menu.component.mjs +0 -31
- package/esm2020/dashboard/lib/dashboard-menu-item/dashboard-menu-item.component.mjs +0 -29
- package/esm2020/dashboard/lib/dashboard-sidebar/dashboard-sidebar.component.mjs +0 -75
- package/esm2020/dashboard/lib/dashboard-sidebar-group/dashboard-sidebar-group.component.mjs +0 -99
- package/esm2020/dashboard/lib/dashboard-sidebar-item/dashboard-sidebar-item.component.mjs +0 -62
- package/esm2020/dashboard/lib/dashboard.module.mjs +0 -47
- package/esm2020/dialog/lib/dialog-actions/dialog-actions.component.mjs +0 -12
- package/esm2020/dialog/lib/dialog-confirm/dialog-confirm.component.mjs +0 -46
- package/esm2020/dialog/lib/dialog-container/dialog-container.component.mjs +0 -77
- package/esm2020/dialog/lib/dialog-header/dialog-header.component.mjs +0 -18
- package/esm2020/dialog/lib/dialog-link/dialog-link.component.mjs +0 -11
- package/esm2020/dialog/lib/dialog-modal/dialog-modal.component.mjs +0 -67
- package/esm2020/dialog/lib/dialog-overlay/dialog-overlay.component.mjs +0 -79
- package/esm2020/dialog/lib/dialog.insertion.mjs +0 -16
- package/esm2020/dialog/lib/dialog.module.mjs +0 -68
- package/esm2020/dialog/lib/dialog.service.mjs +0 -68
- package/esm2020/elements/lib/avatar/avatar.component.mjs +0 -149
- package/esm2020/elements/lib/button/button.component.mjs +0 -61
- package/esm2020/elements/lib/checkbox/checkbox.component.mjs +0 -73
- package/esm2020/elements/lib/date-picker/date-picker.component.mjs +0 -307
- package/esm2020/elements/lib/directives/addon.directive.mjs +0 -29
- package/esm2020/elements/lib/directives/form-submit.directive.mjs +0 -50
- package/esm2020/elements/lib/directives/form-submitter.directive.mjs +0 -25
- package/esm2020/elements/lib/directives/input.directive.mjs +0 -136
- package/esm2020/elements/lib/dropdown/dropdown.component.mjs +0 -100
- package/esm2020/elements/lib/elements.module.mjs +0 -177
- package/esm2020/elements/lib/file-picker/file-picker.component.mjs +0 -236
- package/esm2020/elements/lib/form-control/form-control.component.mjs +0 -49
- package/esm2020/elements/lib/form-error/form-error.component.mjs +0 -123
- package/esm2020/elements/lib/form-group/form-group.component.mjs +0 -18
- package/esm2020/elements/lib/icon/icon.component.mjs +0 -102
- package/esm2020/elements/lib/image-picker/image-picker.component.mjs +0 -106
- package/esm2020/elements/lib/pipes/file-image.pipe.mjs +0 -43
- package/esm2020/elements/lib/pipes/file-size.pipe.mjs +0 -28
- package/esm2020/elements/lib/pipes/relative-time.pipe.mjs +0 -96
- package/esm2020/elements/lib/spinner/spinner.component.mjs +0 -25
- package/esm2020/elements/lib/tag/tag.component.mjs +0 -18
- package/esm2020/http/lib/http.module.mjs +0 -43
- package/esm2020/http/lib/interceptors/base-url.interceptor.mjs +0 -50
- package/esm2020/http/lib/interceptors/error.interceptor.mjs +0 -32
- package/esm2020/lib/core/services/clipboard.service.mjs +0 -70
- package/esm2020/lib/core/services/exif.service.mjs +0 -163
- package/esm2020/lib/core/services/file-loader.service.mjs +0 -87
- package/esm2020/lib/core/services/image-converter.service.mjs +0 -123
- package/esm2020/lib/core/services/languages.service.mjs +0 -74
- package/esm2020/lib/core/services/network.service.mjs +0 -55
- package/esm2020/lib/core/services/patch.service.mjs +0 -63
- package/esm2020/localize/lib/localize.module.mjs +0 -81
- package/esm2020/localize/lib/localize.pipe.mjs +0 -46
- package/esm2020/localize/lib/localize.service.mjs +0 -185
- package/esm2020/localize/lib/views/localize-string/localize-string.component.mjs +0 -88
- package/esm2020/localize/lib/views/localize-template.directive.mjs +0 -21
- package/esm2020/masking/lib/directives/currency-mask.directive.mjs +0 -35
- package/esm2020/masking/lib/directives/date-mask.directive.mjs +0 -35
- package/esm2020/masking/lib/directives/input-mask.directive.mjs +0 -118
- package/esm2020/masking/lib/masking.module.mjs +0 -30
- package/esm2020/masking/lib/masking.service.mjs +0 -103
- package/esm2020/notifications/lib/notifications-item/notifications-item.component.mjs +0 -100
- package/esm2020/notifications/lib/notifications-list/notifications-list.component.mjs +0 -47
- package/esm2020/notifications/lib/notifications.module.mjs +0 -30
- package/esm2020/notifications/lib/notifications.service.mjs +0 -141
- package/esm2020/permissions/lib/directives/permission.directive.mjs +0 -88
- package/esm2020/permissions/lib/guards/permission.guard.mjs +0 -56
- package/esm2020/permissions/lib/permissions.module.mjs +0 -39
- package/esm2020/permissions/lib/permissions.service.mjs +0 -96
- package/esm2020/recaptcha/lib/recaptcha/recaptcha.component.mjs +0 -219
- package/esm2020/recaptcha/lib/recaptcha-loader.service.mjs +0 -95
- package/esm2020/recaptcha/lib/recaptcha.module.mjs +0 -27
- package/esm2020/storage/lib/storage.service.mjs +0 -109
- package/esm2020/table/lib/components/table/table.component.mjs +0 -191
- package/esm2020/table/lib/components/table-cell/table-cell.component.mjs +0 -11
- package/esm2020/table/lib/components/table-header-cell/table-header-cell.component.mjs +0 -131
- package/esm2020/table/lib/components/table-pager/table-pager.component.mjs +0 -136
- package/esm2020/table/lib/data/generic.data.mjs +0 -72
- package/esm2020/table/lib/table.module.mjs +0 -42
- package/esm2020/theming/lib/theming.directive.mjs +0 -38
- package/esm2020/theming/lib/theming.module.mjs +0 -16
- package/esm2020/tooltip/lib/tooltip-container/tooltip-container.component.mjs +0 -31
- package/esm2020/tooltip/lib/tooltip.directive.mjs +0 -140
- package/esm2020/tooltip/lib/tooltip.module.mjs +0 -31
- package/esm2020/utils/lib/directives/autosize.directive.mjs +0 -72
- package/esm2020/utils/lib/directives/focus-trap.directive.mjs +0 -77
- package/esm2020/utils/lib/directives/focus.directive.mjs +0 -37
- package/esm2020/utils/lib/directives/template.directive.mjs +0 -28
- package/esm2020/utils/lib/utils.module.mjs +0 -35
- package/esm2020/utils/public_api.mjs +0 -6
- package/fesm2015/bravobit-bb-foundation-auth.mjs +0 -851
- package/fesm2015/bravobit-bb-foundation-auth.mjs.map +0 -1
- package/fesm2015/bravobit-bb-foundation-collections.mjs +0 -474
- package/fesm2015/bravobit-bb-foundation-collections.mjs.map +0 -1
- package/fesm2015/bravobit-bb-foundation-controls.mjs +0 -1217
- package/fesm2015/bravobit-bb-foundation-controls.mjs.map +0 -1
- package/fesm2015/bravobit-bb-foundation-dashboard.mjs +0 -417
- package/fesm2015/bravobit-bb-foundation-dashboard.mjs.map +0 -1
- package/fesm2015/bravobit-bb-foundation-dialog.mjs +0 -512
- package/fesm2015/bravobit-bb-foundation-dialog.mjs.map +0 -1
- package/fesm2015/bravobit-bb-foundation-elements.mjs +0 -1883
- package/fesm2015/bravobit-bb-foundation-elements.mjs.map +0 -1
- package/fesm2015/bravobit-bb-foundation-http.mjs +0 -176
- package/fesm2015/bravobit-bb-foundation-http.mjs.map +0 -1
- package/fesm2015/bravobit-bb-foundation-localize.mjs +0 -835
- package/fesm2015/bravobit-bb-foundation-localize.mjs.map +0 -1
- package/fesm2015/bravobit-bb-foundation-masking.mjs +0 -334
- package/fesm2015/bravobit-bb-foundation-masking.mjs.map +0 -1
- package/fesm2015/bravobit-bb-foundation-notifications.mjs +0 -357
- package/fesm2015/bravobit-bb-foundation-notifications.mjs.map +0 -1
- package/fesm2015/bravobit-bb-foundation-permissions.mjs +0 -310
- package/fesm2015/bravobit-bb-foundation-permissions.mjs.map +0 -1
- package/fesm2015/bravobit-bb-foundation-recaptcha.mjs +0 -349
- package/fesm2015/bravobit-bb-foundation-rxjs.mjs +0 -22
- package/fesm2015/bravobit-bb-foundation-rxjs.mjs.map +0 -1
- package/fesm2015/bravobit-bb-foundation-storage.mjs +0 -418
- package/fesm2015/bravobit-bb-foundation-storage.mjs.map +0 -1
- package/fesm2015/bravobit-bb-foundation-table.mjs +0 -603
- package/fesm2015/bravobit-bb-foundation-table.mjs.map +0 -1
- package/fesm2015/bravobit-bb-foundation-theming.mjs +0 -382
- package/fesm2015/bravobit-bb-foundation-theming.mjs.map +0 -1
- package/fesm2015/bravobit-bb-foundation-tooltip.mjs +0 -210
- package/fesm2015/bravobit-bb-foundation-tooltip.mjs.map +0 -1
- package/fesm2015/bravobit-bb-foundation-utils.mjs +0 -246
- package/fesm2015/bravobit-bb-foundation-utils.mjs.map +0 -1
- package/fesm2015/bravobit-bb-foundation.mjs +0 -929
- package/fesm2015/bravobit-bb-foundation.mjs.map +0 -1
- package/fesm2020/bravobit-bb-foundation-elements.mjs.map +0 -1
- package/fesm2020/bravobit-bb-foundation-recaptcha.mjs.map +0 -1
- package/fesm2020/bravobit-bb-foundation-table.mjs.map +0 -1
- package/fesm2020/bravobit-bb-foundation-utils.mjs.map +0 -1
- /package/{esm2020 → esm2022}/auth/bravobit-bb-foundation-auth.mjs +0 -0
- /package/{esm2020 → esm2022}/auth/lib/auth.session.mjs +0 -0
- /package/{esm2020 → esm2022}/auth/lib/directives/abstract.directive.mjs +0 -0
- /package/{esm2020 → esm2022}/auth/lib/helpers/jwt.helper.mjs +0 -0
- /package/{esm2020 → esm2022}/auth/lib/interfaces/config.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/auth/lib/interfaces/provider.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/auth/lib/interfaces/token.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/auth/lib/providers/email.provider.mjs +0 -0
- /package/{esm2020 → esm2022}/auth/lib/providers/verify.provider.mjs +0 -0
- /package/{esm2020 → esm2022}/auth/lib/tokens/use-authorization.token.mjs +0 -0
- /package/{esm2020 → esm2022}/auth/public_api.mjs +0 -0
- /package/{esm2020 → esm2022}/bravobit-bb-foundation.mjs +0 -0
- /package/{esm2020 → esm2022}/collections/bravobit-bb-foundation-collections.mjs +0 -0
- /package/{esm2020 → esm2022}/collections/lib/collection.mjs +0 -0
- /package/{esm2020 → esm2022}/collections/lib/interfaces/collection.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/collections/lib/providers/api-collection.provider.mjs +0 -0
- /package/{esm2020 → esm2022}/collections/lib/providers/collection.provider.mjs +0 -0
- /package/{esm2020 → esm2022}/collections/lib/providers/local-collection.provider.mjs +0 -0
- /package/{esm2020 → esm2022}/collections/public_api.mjs +0 -0
- /package/{esm2020 → esm2022}/controls/bravobit-bb-foundation-controls.mjs +0 -0
- /package/{esm2020 → esm2022}/controls/lib/control-error/control-error/control-error.animation.mjs +0 -0
- /package/{esm2020 → esm2022}/controls/lib/control-error/control-error.defaults.mjs +0 -0
- /package/{esm2020 → esm2022}/controls/lib/control-error/control-error.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/controls/lib/control-error/control-error.utils.mjs +0 -0
- /package/{esm2020 → esm2022}/controls/lib/controls.interfaces.mjs +0 -0
- /package/{esm2020 → esm2022}/controls/public_api.mjs +0 -0
- /package/{esm2020 → esm2022}/dashboard/bravobit-bb-foundation-dashboard.mjs +0 -0
- /package/{esm2020 → esm2022}/dashboard/public_api.mjs +0 -0
- /package/{esm2020 → esm2022}/dialog/bravobit-bb-foundation-dialog.mjs +0 -0
- /package/{esm2020 → esm2022}/dialog/lib/dialog-container/dialog-container.animations.mjs +0 -0
- /package/{esm2020 → esm2022}/dialog/lib/dialog-overlay/dialog-overlay.animations.mjs +0 -0
- /package/{esm2020 → esm2022}/dialog/lib/dialog.interfaces.mjs +0 -0
- /package/{esm2020 → esm2022}/dialog/lib/dialog.ref.mjs +0 -0
- /package/{esm2020 → esm2022}/dialog/public_api.mjs +0 -0
- /package/{esm2020 → esm2022}/elements/bravobit-bb-foundation-elements.mjs +0 -0
- /package/{esm2020 → esm2022}/elements/lib/elements.interfaces.mjs +0 -0
- /package/{esm2020 → esm2022}/elements/public_api.mjs +0 -0
- /package/{esm2020 → esm2022}/http/bravobit-bb-foundation-http.mjs +0 -0
- /package/{esm2020 → esm2022}/http/lib/classes/http.config.mjs +0 -0
- /package/{esm2020 → esm2022}/http/lib/classes/http.error.mjs +0 -0
- /package/{esm2020 → esm2022}/http/lib/http.interfaces.mjs +0 -0
- /package/{esm2020 → esm2022}/http/public_api.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/core/functions/date.utils.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/core/functions/password.utils.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/core/miscellaneous/regex.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/core/miscellaneous/validator.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/core/mixins/can-disable.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/core/mixins/can-hide-errors.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/core/mixins/can-load.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/core/mixins/constructor.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/core/mixins/has-error.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/core/mixins/is-focused.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/core/mixins/is-grouped.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/core/mixins/is-readonly.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/core/mixins/is-required.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/core/tokens/accept-language.token.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/core/tokens/base-url.token.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/core/tokens/cookie.token.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/core/tokens/location.token.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/core/tokens/navigator.token.mjs +0 -0
- /package/{esm2020 → esm2022}/lib/core/tokens/window.token.mjs +0 -0
- /package/{esm2020 → esm2022}/localize/bravobit-bb-foundation-localize.mjs +0 -0
- /package/{esm2020 → esm2022}/localize/lib/dictionary/dictionary.class.mjs +0 -0
- /package/{esm2020 → esm2022}/localize/lib/dictionary/dictionary.context.mjs +0 -0
- /package/{esm2020 → esm2022}/localize/lib/dictionary/dictionary.data.mjs +0 -0
- /package/{esm2020 → esm2022}/localize/lib/functions/date.function.mjs +0 -0
- /package/{esm2020 → esm2022}/localize/lib/functions/lowercase.function.mjs +0 -0
- /package/{esm2020 → esm2022}/localize/lib/functions/uppercase.function.mjs +0 -0
- /package/{esm2020 → esm2022}/localize/lib/handlers/missing.handler.mjs +0 -0
- /package/{esm2020 → esm2022}/localize/lib/interfaces/config.interfaces.mjs +0 -0
- /package/{esm2020 → esm2022}/localize/lib/interfaces/functions.interfaces.mjs +0 -0
- /package/{esm2020 → esm2022}/localize/lib/interfaces/handlers.interfaces.mjs +0 -0
- /package/{esm2020 → esm2022}/localize/lib/interfaces/options.interfaces.mjs +0 -0
- /package/{esm2020 → esm2022}/localize/lib/interfaces/transforms.interfaces.mjs +0 -0
- /package/{esm2020 → esm2022}/localize/lib/locale.token.mjs +0 -0
- /package/{esm2020 → esm2022}/localize/lib/localizations/dutch.localization.mjs +0 -0
- /package/{esm2020 → esm2022}/localize/lib/localizations/english.localization.mjs +0 -0
- /package/{esm2020 → esm2022}/localize/lib/transforms/abstract.transform.mjs +0 -0
- /package/{esm2020 → esm2022}/localize/public_api.mjs +0 -0
- /package/{esm2020 → esm2022}/masking/bravobit-bb-foundation-masking.mjs +0 -0
- /package/{esm2020 → esm2022}/masking/lib/input-mask.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/masking/public_api.mjs +0 -0
- /package/{esm2020 → esm2022}/notifications/bravobit-bb-foundation-notifications.mjs +0 -0
- /package/{esm2020 → esm2022}/notifications/lib/notifications.animations.mjs +0 -0
- /package/{esm2020 → esm2022}/notifications/lib/notifications.interfaces.mjs +0 -0
- /package/{esm2020 → esm2022}/notifications/public_api.mjs +0 -0
- /package/{esm2020 → esm2022}/permissions/bravobit-bb-foundation-permissions.mjs +0 -0
- /package/{esm2020 → esm2022}/permissions/lib/handlers/abstract.handler.mjs +0 -0
- /package/{esm2020 → esm2022}/permissions/lib/handlers/local.handler.mjs +0 -0
- /package/{esm2020 → esm2022}/permissions/lib/permissions.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/permissions/public_api.mjs +0 -0
- /package/{esm2020 → esm2022}/public_api.mjs +0 -0
- /package/{esm2020 → esm2022}/recaptcha/bravobit-bb-foundation-recaptcha.mjs +0 -0
- /package/{esm2020 → esm2022}/recaptcha/lib/recaptcha.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/recaptcha/public_api.mjs +0 -0
- /package/{esm2020 → esm2022}/rxjs/bravobit-bb-foundation-rxjs.mjs +0 -0
- /package/{esm2020 → esm2022}/rxjs/lib/observables/get-control-value.observable.mjs +0 -0
- /package/{esm2020 → esm2022}/rxjs/lib/operators/combine-latest-map.operator.mjs +0 -0
- /package/{esm2020 → esm2022}/rxjs/lib/operators/filter-nil.operator.mjs +0 -0
- /package/{esm2020 → esm2022}/rxjs/public_api.mjs +0 -0
- /package/{esm2020 → esm2022}/storage/bravobit-bb-foundation-storage.mjs +0 -0
- /package/{esm2020 → esm2022}/storage/lib/interfaces/attributes.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/storage/lib/interfaces/memory.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/storage/lib/interfaces/strategy.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/storage/lib/strategies/cookie-storage.strategy.mjs +0 -0
- /package/{esm2020 → esm2022}/storage/lib/strategies/memory-storage.strategy.mjs +0 -0
- /package/{esm2020 → esm2022}/storage/lib/strategies/polyfill-storage.strategy.mjs +0 -0
- /package/{esm2020 → esm2022}/storage/public_api.mjs +0 -0
- /package/{esm2020 → esm2022}/table/bravobit-bb-foundation-table.mjs +0 -0
- /package/{esm2020 → esm2022}/table/lib/data/datasource.data.mjs +0 -0
- /package/{esm2020 → esm2022}/table/lib/interfaces/datasource.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/table/lib/interfaces/table.interfaces.mjs +0 -0
- /package/{esm2020 → esm2022}/table/public_api.mjs +0 -0
- /package/{esm2020 → esm2022}/theming/bravobit-bb-foundation-theming.mjs +0 -0
- /package/{esm2020 → esm2022}/theming/lib/themes/checkbox-group.theme.mjs +0 -0
- /package/{esm2020 → esm2022}/theming/lib/themes/checkbox.theme.mjs +0 -0
- /package/{esm2020 → esm2022}/theming/lib/themes/control-error.theme.mjs +0 -0
- /package/{esm2020 → esm2022}/theming/lib/themes/form-control-addon.theme.mjs +0 -0
- /package/{esm2020 → esm2022}/theming/lib/themes/form-control.theme.mjs +0 -0
- /package/{esm2020 → esm2022}/theming/lib/themes/radio-button.theme.mjs +0 -0
- /package/{esm2020 → esm2022}/theming/lib/themes/radio-group.theme.mjs +0 -0
- /package/{esm2020 → esm2022}/theming/lib/themes/toggle-group.theme.mjs +0 -0
- /package/{esm2020 → esm2022}/theming/lib/themes/toggle.theme.mjs +0 -0
- /package/{esm2020 → esm2022}/theming/lib/theming.data.mjs +0 -0
- /package/{esm2020 → esm2022}/theming/lib/theming.interface.mjs +0 -0
- /package/{esm2020 → esm2022}/theming/lib/utils/theming.variable.mjs +0 -0
- /package/{esm2020 → esm2022}/theming/public_api.mjs +0 -0
- /package/{esm2020 → esm2022}/tooltip/bravobit-bb-foundation-tooltip.mjs +0 -0
- /package/{esm2020 → esm2022}/tooltip/lib/tooltip.interfaces.mjs +0 -0
- /package/{esm2020 → esm2022}/tooltip/public_api.mjs +0 -0
- /package/{esm2020 → esm2022}/utils/bravobit-bb-foundation-utils.mjs +0 -0
- /package/{fesm2020 → fesm2022}/bravobit-bb-foundation-rxjs.mjs +0 -0
- /package/{fesm2020 → fesm2022}/bravobit-bb-foundation-rxjs.mjs.map +0 -0
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
import { AUTH_REDIRECT_HANDLER } from './interfaces/config.interface';
|
|
2
|
+
import { HttpContext } from '@angular/common/http';
|
|
3
|
+
import { makeStateKey } from '@angular/platform-browser';
|
|
4
|
+
import { Inject, Injectable, Optional } from '@angular/core';
|
|
5
|
+
import { USE_AUTHORIZATION } from './tokens/use-authorization.token';
|
|
6
|
+
import { AuthVerifyProvider } from './providers/verify.provider';
|
|
7
|
+
import { AuthEmailProvider } from './providers/email.provider';
|
|
8
|
+
import { firstValueFrom, of } from 'rxjs';
|
|
9
|
+
import { AuthSession } from './auth.session';
|
|
10
|
+
import { map, tap } from 'rxjs/operators';
|
|
11
|
+
import { Router } from '@angular/router';
|
|
12
|
+
import * as i0 from "@angular/core";
|
|
13
|
+
import * as i1 from "@bravobit/bb-foundation/storage";
|
|
14
|
+
import * as i2 from "@angular/cdk/platform";
|
|
15
|
+
import * as i3 from "@angular/common/http";
|
|
16
|
+
import * as i4 from "./interfaces/config.interface";
|
|
17
|
+
import * as i5 from "@angular/platform-browser";
|
|
18
|
+
import * as i6 from "@bravobit/bb-foundation/http";
|
|
19
|
+
class Auth {
|
|
20
|
+
constructor(_storage, _injector, _platform, _httpClient, _config, _state, _httpConfig, _handler) {
|
|
21
|
+
this._storage = _storage;
|
|
22
|
+
this._injector = _injector;
|
|
23
|
+
this._platform = _platform;
|
|
24
|
+
this._httpClient = _httpClient;
|
|
25
|
+
this._config = _config;
|
|
26
|
+
this._state = _state;
|
|
27
|
+
this._httpConfig = _httpConfig;
|
|
28
|
+
this._handler = _handler;
|
|
29
|
+
// Readonly data.
|
|
30
|
+
this._authStateKey = makeStateKey(`bbAuthStateKey`);
|
|
31
|
+
this._httpAlias = this._httpConfig?.defaultAlias ?? null;
|
|
32
|
+
this._refreshHandler = null;
|
|
33
|
+
// We select a storage strategy based on the server/browser.
|
|
34
|
+
// Only cookies CAN work on the server.
|
|
35
|
+
const storageStrategy = this._platform.isBrowser
|
|
36
|
+
? this._storage.select(["cookie" /* StorageOption.Cookie */, "local" /* StorageOption.Local */])
|
|
37
|
+
: this._storage.cookie;
|
|
38
|
+
// Starting the new session.
|
|
39
|
+
this.session = new AuthSession({
|
|
40
|
+
id: this._config?.applicationId,
|
|
41
|
+
storage: storageStrategy
|
|
42
|
+
});
|
|
43
|
+
this.user = this.session.user;
|
|
44
|
+
}
|
|
45
|
+
initialize() {
|
|
46
|
+
return async () => {
|
|
47
|
+
// Check if the app should bootstrap the authentication.
|
|
48
|
+
const shouldBootstrap = this._config?.bootstrap ?? true;
|
|
49
|
+
if (!shouldBootstrap) {
|
|
50
|
+
return this.handleAutoRefreshing();
|
|
51
|
+
}
|
|
52
|
+
// Only retrieve from the server when we are actually authenticated.
|
|
53
|
+
if (!this.session.authenticated()) {
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
// Get the key from the server state.
|
|
57
|
+
if (this._state && this._state?.hasKey(this._authStateKey)) {
|
|
58
|
+
const user = this._state?.get(this._authStateKey, null) ?? null;
|
|
59
|
+
return this.session.setUser(user);
|
|
60
|
+
}
|
|
61
|
+
// Try to fetch the user from the server.
|
|
62
|
+
const user$ = this.me();
|
|
63
|
+
const user = await firstValueFrom(user$, { defaultValue: null });
|
|
64
|
+
// Set the state if exists.
|
|
65
|
+
if (this._state) {
|
|
66
|
+
this._state?.set(this._authStateKey, user ?? null);
|
|
67
|
+
}
|
|
68
|
+
// Save the user in the storage and handle auto refreshing.
|
|
69
|
+
this.session.setUser(user);
|
|
70
|
+
this.handleAutoRefreshing();
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
me() {
|
|
74
|
+
const url = this.getUrl('auth/me');
|
|
75
|
+
return this._httpClient.get(url);
|
|
76
|
+
}
|
|
77
|
+
async signIn(provider, as) {
|
|
78
|
+
const { accessToken, refreshToken, user, ...result } = await provider.authenticate(this._httpClient);
|
|
79
|
+
// Check if the role matches.
|
|
80
|
+
const role = user?.role ?? null;
|
|
81
|
+
if (as && !as.includes(role)) {
|
|
82
|
+
throw new Error('Invalid role.');
|
|
83
|
+
}
|
|
84
|
+
// Validate if the provider is one of the available
|
|
85
|
+
// providers then return the user object and the provider.
|
|
86
|
+
const apiProvider = result?.provider ?? null;
|
|
87
|
+
const apiVerifyToken = result?.verifyToken ?? null;
|
|
88
|
+
const availableProviders = this._config?.providers ?? ['email', 'sms', 'totp'];
|
|
89
|
+
if (availableProviders.includes(apiProvider)) {
|
|
90
|
+
return { user, provider: apiProvider, verifyToken: apiVerifyToken };
|
|
91
|
+
}
|
|
92
|
+
// Set the tokens in storage.
|
|
93
|
+
this.setTokens(accessToken, refreshToken);
|
|
94
|
+
// Set the user in storage.
|
|
95
|
+
this.session.setUser(user);
|
|
96
|
+
// Return the user.
|
|
97
|
+
return { user };
|
|
98
|
+
}
|
|
99
|
+
async signInWithEmail(email, password, as) {
|
|
100
|
+
const url = this.getUrl('auth/login');
|
|
101
|
+
return this.signIn(new AuthEmailProvider(email, password, url), as);
|
|
102
|
+
}
|
|
103
|
+
async signInWithVerifyCode(code, verifyToken) {
|
|
104
|
+
const url = this.getUrl('auth/verify');
|
|
105
|
+
return this.signIn(new AuthVerifyProvider(code, verifyToken, url));
|
|
106
|
+
}
|
|
107
|
+
async resendVerifyCode(verifyToken) {
|
|
108
|
+
const url = this.getUrl('auth/resend');
|
|
109
|
+
const result$ = this._httpClient.post(url, {
|
|
110
|
+
verify_token: verifyToken
|
|
111
|
+
});
|
|
112
|
+
return firstValueFrom(result$);
|
|
113
|
+
}
|
|
114
|
+
async register(data, options) {
|
|
115
|
+
// Execute API call.
|
|
116
|
+
const url = this.getUrl('auth/register');
|
|
117
|
+
const result$ = this._httpClient.post(url, data, options);
|
|
118
|
+
const result = await firstValueFrom(result$);
|
|
119
|
+
// Set the tokens in storage.
|
|
120
|
+
this.setTokens(result?.token, result?.refresh_token);
|
|
121
|
+
// Set the user in storage.
|
|
122
|
+
const user = result?.user;
|
|
123
|
+
this.session.setUser(user);
|
|
124
|
+
// Return the user.
|
|
125
|
+
return user;
|
|
126
|
+
}
|
|
127
|
+
logout() {
|
|
128
|
+
// If we don't have a refresh token just clear the session.
|
|
129
|
+
// Note: We do this because else we try to invalidate
|
|
130
|
+
// an "undefined" refresh token.
|
|
131
|
+
const refreshToken = this.session.refreshToken;
|
|
132
|
+
if (!refreshToken) {
|
|
133
|
+
return this.session.clear();
|
|
134
|
+
}
|
|
135
|
+
// We do have a refresh token, so try to
|
|
136
|
+
// invalidate it in the backend.
|
|
137
|
+
try {
|
|
138
|
+
const url = this.getUrl('auth/logout');
|
|
139
|
+
const headerName = this._config?.http?.header ?? 'Authorization';
|
|
140
|
+
const observable$ = this._httpClient.get(url, {
|
|
141
|
+
headers: { [headerName]: refreshToken }
|
|
142
|
+
});
|
|
143
|
+
firstValueFrom(observable$).then(_ => _).catch(_ => _);
|
|
144
|
+
}
|
|
145
|
+
catch {
|
|
146
|
+
// Do nothing because the tokens will be deleted anyways from the session.
|
|
147
|
+
}
|
|
148
|
+
// Delete the tokens from the session.
|
|
149
|
+
return this.session.clear();
|
|
150
|
+
}
|
|
151
|
+
refresh() {
|
|
152
|
+
// If the refresh token does
|
|
153
|
+
// not exist just return an observable of null.
|
|
154
|
+
const refreshToken = this.session.refreshToken;
|
|
155
|
+
if (!refreshToken) {
|
|
156
|
+
return of(null);
|
|
157
|
+
}
|
|
158
|
+
// Perform the refresh call.
|
|
159
|
+
const headerName = this._config?.http?.header ?? 'Authorization';
|
|
160
|
+
const scheme = this._config?.http?.scheme ?? 'Bearer';
|
|
161
|
+
const url = this.getUrl('auth/refresh');
|
|
162
|
+
const context = new HttpContext().set(USE_AUTHORIZATION, false);
|
|
163
|
+
return this._httpClient.get(url, {
|
|
164
|
+
headers: { [headerName]: `${scheme} ${refreshToken}` },
|
|
165
|
+
context: context
|
|
166
|
+
}).pipe(tap(({ token, refresh_token }) => this.setTokens(token, refresh_token)), map(({ token }) => token));
|
|
167
|
+
}
|
|
168
|
+
async requestPassword(email, extraParams = {}) {
|
|
169
|
+
const url = this.getUrl('auth/reset');
|
|
170
|
+
const observable$ = this._httpClient.post(url, { ...extraParams, email });
|
|
171
|
+
return firstValueFrom(observable$);
|
|
172
|
+
}
|
|
173
|
+
async resetPassword(token, newPassword, extraParams = {}) {
|
|
174
|
+
const url = this.getUrl('auth/reset-password');
|
|
175
|
+
const observable$ = this._httpClient.post(url, { ...extraParams, token, password: newPassword });
|
|
176
|
+
return firstValueFrom(observable$);
|
|
177
|
+
}
|
|
178
|
+
clearAndRedirect() {
|
|
179
|
+
// 1. Delete the tokens from the session.
|
|
180
|
+
this.session.clear();
|
|
181
|
+
if (this._handler) {
|
|
182
|
+
const urlTree = this._handler.onFailedAuthenticated();
|
|
183
|
+
if (!urlTree || urlTree === true) {
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
this.router.navigateByUrl(urlTree).then(_ => _);
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
// 2. Compose the route url.
|
|
190
|
+
const redirectUrl = this._config?.redirects.unauthenticated ?? null;
|
|
191
|
+
// 3. Route back if the user provided a redirect url.
|
|
192
|
+
if (this.router && redirectUrl) {
|
|
193
|
+
const commands = Array.isArray(redirectUrl) ? redirectUrl : [redirectUrl];
|
|
194
|
+
this.router.navigate(commands).then(_ => _);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
setTokens(accessToken, refreshToken) {
|
|
198
|
+
// Set the tokens in our session.
|
|
199
|
+
this.session.setTokens(accessToken, refreshToken);
|
|
200
|
+
// We need to update the auto refresh of the refresh token.
|
|
201
|
+
this.handleAutoRefreshing();
|
|
202
|
+
}
|
|
203
|
+
handleAutoRefreshing() {
|
|
204
|
+
const shouldAutoRefresh = this._config?.autoRefresh ?? false;
|
|
205
|
+
if (!shouldAutoRefresh) {
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
const expiresAt = this.session.refreshTokenPayload?.expiresAt ?? null;
|
|
209
|
+
if (expiresAt === null || !this._platform.isBrowser) {
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
const differenceInMilliseconds = expiresAt.getTime() - Date.now();
|
|
213
|
+
const offsetInMilliseconds = 10000; // 10 seconds.
|
|
214
|
+
// We want to start the refresh 10 seconds before it expires.
|
|
215
|
+
const actualTiming = differenceInMilliseconds - offsetInMilliseconds;
|
|
216
|
+
if (actualTiming <= 0) {
|
|
217
|
+
return;
|
|
218
|
+
}
|
|
219
|
+
// We need to cap the timings because if
|
|
220
|
+
// we get large numbers it might cause unwanted results.
|
|
221
|
+
const maxTiming = 1000 * 60 * 60 * 24; // 24 hours.
|
|
222
|
+
const cappedTiming = Math.max(1, Math.min(actualTiming, maxTiming));
|
|
223
|
+
try {
|
|
224
|
+
if (this._refreshHandler !== null) {
|
|
225
|
+
clearTimeout?.(this._refreshHandler);
|
|
226
|
+
this._refreshHandler = null;
|
|
227
|
+
}
|
|
228
|
+
this._refreshHandler = window?.setTimeout?.(() => this.autoRefresh(), cappedTiming);
|
|
229
|
+
}
|
|
230
|
+
catch {
|
|
231
|
+
// Just ignore it.
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
async autoRefresh() {
|
|
235
|
+
try {
|
|
236
|
+
// We just need to wait for it to refresh.
|
|
237
|
+
const refresh$ = this.refresh();
|
|
238
|
+
await firstValueFrom(refresh$);
|
|
239
|
+
}
|
|
240
|
+
catch {
|
|
241
|
+
// Something went wrong refreshing, we need to clear.
|
|
242
|
+
this.clearAndRedirect();
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
get router() {
|
|
246
|
+
return this._injector.get(Router);
|
|
247
|
+
}
|
|
248
|
+
getUrl(endpoint) {
|
|
249
|
+
return [this._httpAlias, endpoint]
|
|
250
|
+
.filter(item => !!item)
|
|
251
|
+
.join('/');
|
|
252
|
+
}
|
|
253
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: Auth, deps: [{ token: i1.Storage }, { token: i0.Injector }, { token: i2.Platform }, { token: i3.HttpClient }, { token: i4.AuthConfig, optional: true }, { token: i5.TransferState, optional: true }, { token: i6.HttpConfig, optional: true }, { token: AUTH_REDIRECT_HANDLER, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
254
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: Auth }); }
|
|
255
|
+
}
|
|
256
|
+
export { Auth };
|
|
257
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: Auth, decorators: [{
|
|
258
|
+
type: Injectable
|
|
259
|
+
}], ctorParameters: function () { return [{ type: i1.Storage }, { type: i0.Injector }, { type: i2.Platform }, { type: i3.HttpClient }, { type: i4.AuthConfig, decorators: [{
|
|
260
|
+
type: Optional
|
|
261
|
+
}] }, { type: i5.TransferState, decorators: [{
|
|
262
|
+
type: Optional
|
|
263
|
+
}] }, { type: i6.HttpConfig, decorators: [{
|
|
264
|
+
type: Optional
|
|
265
|
+
}] }, { type: undefined, decorators: [{
|
|
266
|
+
type: Optional
|
|
267
|
+
}, {
|
|
268
|
+
type: Inject,
|
|
269
|
+
args: [AUTH_REDIRECT_HANDLER]
|
|
270
|
+
}] }]; } });
|
|
271
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYmItZm91bmRhdGlvbi9hdXRoL3NyYy9saWIvYXV0aC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxxQkFBcUIsRUFBa0MsTUFBTSwrQkFBK0IsQ0FBQztBQUNyRyxPQUFPLEVBQWEsV0FBVyxFQUEwQixNQUFNLHNCQUFzQixDQUFDO0FBRXRGLE9BQU8sRUFBQyxZQUFZLEVBQTBCLE1BQU0sMkJBQTJCLENBQUM7QUFFaEYsT0FBTyxFQUFDLE1BQU0sRUFBRSxVQUFVLEVBQVksUUFBUSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3JFLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLGtDQUFrQyxDQUFDO0FBQ25FLE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLDZCQUE2QixDQUFDO0FBQy9ELE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBRTdELE9BQU8sRUFBQyxjQUFjLEVBQWMsRUFBRSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBRXBELE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQUMsR0FBRyxFQUFFLEdBQUcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3hDLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQzs7Ozs7Ozs7QUFFdkMsTUFDYSxJQUFJO0lBV2IsWUFBb0IsUUFBaUIsRUFDakIsU0FBbUIsRUFDbkIsU0FBbUIsRUFDbkIsV0FBdUIsRUFDWCxPQUFvQixFQUNwQixNQUFzQixFQUN0QixXQUF3QixFQUNPLFFBQThCO1FBUHpFLGFBQVEsR0FBUixRQUFRLENBQVM7UUFDakIsY0FBUyxHQUFULFNBQVMsQ0FBVTtRQUNuQixjQUFTLEdBQVQsU0FBUyxDQUFVO1FBQ25CLGdCQUFXLEdBQVgsV0FBVyxDQUFZO1FBQ1gsWUFBTyxHQUFQLE9BQU8sQ0FBYTtRQUNwQixXQUFNLEdBQU4sTUFBTSxDQUFnQjtRQUN0QixnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUNPLGFBQVEsR0FBUixRQUFRLENBQXNCO1FBaEI3RixpQkFBaUI7UUFDQSxrQkFBYSxHQUF5QixZQUFZLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUNyRSxlQUFVLEdBQWtCLElBQUksQ0FBQyxXQUFXLEVBQUUsWUFBWSxJQUFJLElBQUksQ0FBQztRQUs1RSxvQkFBZSxHQUFrQixJQUFJLENBQUM7UUFVMUMsNERBQTREO1FBQzVELHVDQUF1QztRQUN2QyxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVM7WUFDNUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLHdFQUEyQyxDQUFDO1lBQ25FLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUUzQiw0QkFBNEI7UUFDNUIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLFdBQVcsQ0FBQztZQUMzQixFQUFFLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxhQUFhO1lBQy9CLE9BQU8sRUFBRSxlQUFlO1NBQzNCLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7SUFDbEMsQ0FBQztJQUVELFVBQVU7UUFDTixPQUFPLEtBQUssSUFBSSxFQUFFO1lBQ2Qsd0RBQXdEO1lBQ3hELE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsU0FBUyxJQUFJLElBQUksQ0FBQztZQUN4RCxJQUFJLENBQUMsZUFBZSxFQUFFO2dCQUNsQixPQUFPLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO2FBQ3RDO1lBRUQsb0VBQW9FO1lBQ3BFLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxFQUFFO2dCQUMvQixPQUFPO2FBQ1Y7WUFFRCxxQ0FBcUM7WUFDckMsSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDeEQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUM7Z0JBQ2hFLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDckM7WUFFRCx5Q0FBeUM7WUFDekMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ3hCLE1BQU0sSUFBSSxHQUFHLE1BQU0sY0FBYyxDQUFDLEtBQUssRUFBRSxFQUFDLFlBQVksRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFDO1lBRS9ELDJCQUEyQjtZQUMzQixJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7Z0JBQ2IsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQU0sSUFBSSxDQUFDLGFBQWEsRUFBRSxJQUFJLElBQUksSUFBSSxDQUFDLENBQUM7YUFDM0Q7WUFFRCwyREFBMkQ7WUFDM0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDM0IsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDaEMsQ0FBQyxDQUFDO0lBQ04sQ0FBQztJQUVELEVBQUU7UUFDRSxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ25DLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUksR0FBRyxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVELEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBc0IsRUFBRSxFQUFhO1FBQzlDLE1BQU0sRUFBQyxXQUFXLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxHQUFHLE1BQU0sRUFBQyxHQUFHLE1BQU0sUUFBUSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFbkcsNkJBQTZCO1FBQzdCLE1BQU0sSUFBSSxHQUFHLElBQUksRUFBRSxJQUFJLElBQUksSUFBSSxDQUFDO1FBQ2hDLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUMxQixNQUFNLElBQUksS0FBSyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1NBQ3BDO1FBRUQsbURBQW1EO1FBQ25ELDBEQUEwRDtRQUMxRCxNQUFNLFdBQVcsR0FBRyxNQUFNLEVBQUUsUUFBUSxJQUFJLElBQUksQ0FBQztRQUM3QyxNQUFNLGNBQWMsR0FBRyxNQUFNLEVBQUUsV0FBVyxJQUFJLElBQUksQ0FBQztRQUNuRCxNQUFNLGtCQUFrQixHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsU0FBUyxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztRQUMvRSxJQUFJLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsRUFBRTtZQUMxQyxPQUEyQixFQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxjQUFjLEVBQUMsQ0FBQztTQUN6RjtRQUVELDZCQUE2QjtRQUM3QixJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUUxQywyQkFBMkI7UUFDM0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFM0IsbUJBQW1CO1FBQ25CLE9BQTJCLEVBQUMsSUFBSSxFQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVELEtBQUssQ0FBQyxlQUFlLENBQUMsS0FBYSxFQUFFLFFBQWdCLEVBQUUsRUFBYTtRQUNoRSxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3RDLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLGlCQUFpQixDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDeEUsQ0FBQztJQUVELEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxJQUFZLEVBQUUsV0FBbUI7UUFDeEQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUN2QyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsV0FBVyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDdkUsQ0FBQztJQUVELEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFtQjtRQUN0QyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3ZDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUN2QyxZQUFZLEVBQUUsV0FBVztTQUM1QixDQUFDLENBQUM7UUFFSCxPQUFPLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQsS0FBSyxDQUFDLFFBQVEsQ0FBVSxJQUFTLEVBQUUsT0FPbEM7UUFDRyxvQkFBb0I7UUFDcEIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUN6QyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBc0QsR0FBRyxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztRQUMvRyxNQUFNLE1BQU0sR0FBRyxNQUFNLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUU3Qyw2QkFBNkI7UUFDN0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxhQUFhLENBQUMsQ0FBQztRQUVyRCwyQkFBMkI7UUFDM0IsTUFBTSxJQUFJLEdBQUcsTUFBTSxFQUFFLElBQUksQ0FBQztRQUMxQixJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUUzQixtQkFBbUI7UUFDbkIsT0FBVSxJQUFJLENBQUM7SUFDbkIsQ0FBQztJQUVELE1BQU07UUFDRiwyREFBMkQ7UUFDM0QscURBQXFEO1FBQ3JELGdDQUFnQztRQUNoQyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQztRQUMvQyxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ2YsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO1NBQy9CO1FBRUQsd0NBQXdDO1FBQ3hDLGdDQUFnQztRQUNoQyxJQUFJO1lBQ0EsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUN2QyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLElBQUksZUFBZSxDQUFDO1lBQ2pFLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRTtnQkFDMUMsT0FBTyxFQUFFLEVBQUMsQ0FBQyxVQUFVLENBQUMsRUFBRSxZQUFZLEVBQUM7YUFDeEMsQ0FBQyxDQUFDO1lBQ0gsY0FBYyxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQzFEO1FBQUMsTUFBTTtZQUNKLDBFQUEwRTtTQUM3RTtRQUVELHNDQUFzQztRQUN0QyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDaEMsQ0FBQztJQUVELE9BQU87UUFDSCw0QkFBNEI7UUFDNUIsK0NBQStDO1FBQy9DLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDO1FBQy9DLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDZixPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNuQjtRQUVELDRCQUE0QjtRQUM1QixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLElBQUksZUFBZSxDQUFDO1FBQ2pFLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sSUFBSSxRQUFRLENBQUM7UUFFdEQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUN4QyxNQUFNLE9BQU8sR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUVoRSxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUEyQyxHQUFHLEVBQUU7WUFDdkUsT0FBTyxFQUFFLEVBQUMsQ0FBQyxVQUFVLENBQUMsRUFBRSxHQUFHLE1BQU0sSUFBSSxZQUFZLEVBQUUsRUFBQztZQUNwRCxPQUFPLEVBQUUsT0FBTztTQUNuQixDQUFDLENBQUMsSUFBSSxDQUNILEdBQUcsQ0FBQyxDQUFDLEVBQUMsS0FBSyxFQUFFLGFBQWEsRUFBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxhQUFhLENBQUMsQ0FBQyxFQUNyRSxHQUFHLENBQUMsQ0FBQyxFQUFDLEtBQUssRUFBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FDMUIsQ0FBQztJQUNOLENBQUM7SUFFRCxLQUFLLENBQUMsZUFBZSxDQUFDLEtBQWEsRUFBRSxjQUFzQyxFQUFFO1FBQ3pFLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDdEMsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUMsR0FBRyxXQUFXLEVBQUUsS0FBSyxFQUFDLENBQUMsQ0FBQztRQUN4RSxPQUFPLGNBQWMsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQsS0FBSyxDQUFDLGFBQWEsQ0FBQyxLQUFhLEVBQUUsV0FBbUIsRUFBRSxjQUFzQyxFQUFFO1FBQzVGLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUMvQyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBQyxHQUFHLFdBQVcsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBQyxDQUFDLENBQUM7UUFDL0YsT0FBTyxjQUFjLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVELGdCQUFnQjtRQUNaLHlDQUF5QztRQUN6QyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBRXJCLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNmLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMscUJBQXFCLEVBQUUsQ0FBQztZQUN0RCxJQUFJLENBQUMsT0FBTyxJQUFJLE9BQU8sS0FBSyxJQUFJLEVBQUU7Z0JBQzlCLE9BQU87YUFDVjtZQUVELElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2hELE9BQU87U0FDVjtRQUVELDRCQUE0QjtRQUM1QixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxlQUFlLElBQUksSUFBSSxDQUFDO1FBRXBFLHFEQUFxRDtRQUNyRCxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksV0FBVyxFQUFFO1lBQzVCLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUMxRSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUMvQztJQUNMLENBQUM7SUFFTyxTQUFTLENBQUMsV0FBbUIsRUFBRSxZQUFvQjtRQUN2RCxpQ0FBaUM7UUFDakMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBRWxELDJEQUEyRDtRQUMzRCxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztJQUNoQyxDQUFDO0lBRU8sb0JBQW9CO1FBQ3hCLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxXQUFXLElBQUksS0FBSyxDQUFDO1FBQzdELElBQUksQ0FBQyxpQkFBaUIsRUFBRTtZQUNwQixPQUFPO1NBQ1Y7UUFFRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLG1CQUFtQixFQUFFLFNBQVMsSUFBSSxJQUFJLENBQUM7UUFDdEUsSUFBSSxTQUFTLEtBQUssSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUU7WUFDakQsT0FBTztTQUNWO1FBRUQsTUFBTSx3QkFBd0IsR0FBRyxTQUFTLENBQUMsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ2xFLE1BQU0sb0JBQW9CLEdBQUcsS0FBTSxDQUFDLENBQUMsY0FBYztRQUVuRCw2REFBNkQ7UUFDN0QsTUFBTSxZQUFZLEdBQUcsd0JBQXdCLEdBQUcsb0JBQW9CLENBQUM7UUFDckUsSUFBSSxZQUFZLElBQUksQ0FBQyxFQUFFO1lBQ25CLE9BQU87U0FDVjtRQUVELHdDQUF3QztRQUN4Qyx3REFBd0Q7UUFDeEQsTUFBTSxTQUFTLEdBQUcsSUFBSSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsWUFBWTtRQUNuRCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBQ3BFLElBQUk7WUFDQSxJQUFJLElBQUksQ0FBQyxlQUFlLEtBQUssSUFBSSxFQUFFO2dCQUMvQixZQUFZLEVBQUUsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7Z0JBQ3JDLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO2FBQy9CO1lBQ0QsSUFBSSxDQUFDLGVBQWUsR0FBRyxNQUFNLEVBQUUsVUFBVSxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFLFlBQVksQ0FBQyxDQUFDO1NBQ3ZGO1FBQUMsTUFBTTtZQUNKLGtCQUFrQjtTQUNyQjtJQUNMLENBQUM7SUFFTyxLQUFLLENBQUMsV0FBVztRQUNyQixJQUFJO1lBQ0EsMENBQTBDO1lBQzFDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNoQyxNQUFNLGNBQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUNsQztRQUFDLE1BQU07WUFDSixxREFBcUQ7WUFDckQsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7U0FDM0I7SUFDTCxDQUFDO0lBRUQsSUFBWSxNQUFNO1FBQ2QsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRU8sTUFBTSxDQUFDLFFBQWdCO1FBQzNCLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQzthQUM3QixNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO2FBQ3RCLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNuQixDQUFDOzhHQW5TUSxJQUFJLG9QQWtCbUIscUJBQXFCO2tIQWxCNUMsSUFBSTs7U0FBSixJQUFJOzJGQUFKLElBQUk7a0JBRGhCLFVBQVU7OzBCQWdCTSxRQUFROzswQkFDUixRQUFROzswQkFDUixRQUFROzswQkFDUixRQUFROzswQkFBSSxNQUFNOzJCQUFDLHFCQUFxQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7QVVUSF9SRURJUkVDVF9IQU5ETEVSLCBBdXRoQ29uZmlnLCBBdXRoUmVkaXJlY3RIYW5kbGVyfSBmcm9tICcuL2ludGVyZmFjZXMvY29uZmlnLmludGVyZmFjZSc7XG5pbXBvcnQge0h0dHBDbGllbnQsIEh0dHBDb250ZXh0LCBIdHRwSGVhZGVycywgSHR0cFBhcmFtc30gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHtBdXRoUHJvdmlkZXIsIEF1dGhTaWduSW5SZXNwb25zZX0gZnJvbSAnLi9pbnRlcmZhY2VzL3Byb3ZpZGVyLmludGVyZmFjZSc7XG5pbXBvcnQge21ha2VTdGF0ZUtleSwgU3RhdGVLZXksIFRyYW5zZmVyU3RhdGV9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuaW1wb3J0IHtTdG9yYWdlLCBTdG9yYWdlT3B0aW9ufSBmcm9tICdAYnJhdm9iaXQvYmItZm91bmRhdGlvbi9zdG9yYWdlJztcbmltcG9ydCB7SW5qZWN0LCBJbmplY3RhYmxlLCBJbmplY3RvciwgT3B0aW9uYWx9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtVU0VfQVVUSE9SSVpBVElPTn0gZnJvbSAnLi90b2tlbnMvdXNlLWF1dGhvcml6YXRpb24udG9rZW4nO1xuaW1wb3J0IHtBdXRoVmVyaWZ5UHJvdmlkZXJ9IGZyb20gJy4vcHJvdmlkZXJzL3ZlcmlmeS5wcm92aWRlcic7XG5pbXBvcnQge0F1dGhFbWFpbFByb3ZpZGVyfSBmcm9tICcuL3Byb3ZpZGVycy9lbWFpbC5wcm92aWRlcic7XG5pbXBvcnQge0h0dHBDb25maWd9IGZyb20gJ0BicmF2b2JpdC9iYi1mb3VuZGF0aW9uL2h0dHAnO1xuaW1wb3J0IHtmaXJzdFZhbHVlRnJvbSwgT2JzZXJ2YWJsZSwgb2Z9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtQbGF0Zm9ybX0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BsYXRmb3JtJztcbmltcG9ydCB7QXV0aFNlc3Npb259IGZyb20gJy4vYXV0aC5zZXNzaW9uJztcbmltcG9ydCB7bWFwLCB0YXB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7Um91dGVyfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQXV0aCB7XG5cbiAgICAvLyBSZWFkb25seSBkYXRhLlxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2F1dGhTdGF0ZUtleTogU3RhdGVLZXk8YW55IHwgbnVsbD4gPSBtYWtlU3RhdGVLZXkoYGJiQXV0aFN0YXRlS2V5YCk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBfaHR0cEFsaWFzOiBzdHJpbmcgfCBudWxsID0gdGhpcy5faHR0cENvbmZpZz8uZGVmYXVsdEFsaWFzID8/IG51bGw7XG5cbiAgICByZWFkb25seSBzZXNzaW9uOiBBdXRoU2Vzc2lvbjtcbiAgICByZWFkb25seSB1c2VyOiBPYnNlcnZhYmxlPGFueSB8IG51bGw+O1xuXG4gICAgcHJpdmF0ZSBfcmVmcmVzaEhhbmRsZXI6IG51bWJlciB8IG51bGwgPSBudWxsO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBfc3RvcmFnZTogU3RvcmFnZSxcbiAgICAgICAgICAgICAgICBwcml2YXRlIF9pbmplY3RvcjogSW5qZWN0b3IsXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSBfcGxhdGZvcm06IFBsYXRmb3JtLFxuICAgICAgICAgICAgICAgIHByaXZhdGUgX2h0dHBDbGllbnQ6IEh0dHBDbGllbnQsXG4gICAgICAgICAgICAgICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBfY29uZmlnPzogQXV0aENvbmZpZyxcbiAgICAgICAgICAgICAgICBAT3B0aW9uYWwoKSBwcml2YXRlIF9zdGF0ZT86IFRyYW5zZmVyU3RhdGUsXG4gICAgICAgICAgICAgICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBfaHR0cENvbmZpZz86IEh0dHBDb25maWcsXG4gICAgICAgICAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChBVVRIX1JFRElSRUNUX0hBTkRMRVIpIHByaXZhdGUgX2hhbmRsZXI/OiBBdXRoUmVkaXJlY3RIYW5kbGVyKSB7XG4gICAgICAgIC8vIFdlIHNlbGVjdCBhIHN0b3JhZ2Ugc3RyYXRlZ3kgYmFzZWQgb24gdGhlIHNlcnZlci9icm93c2VyLlxuICAgICAgICAvLyBPbmx5IGNvb2tpZXMgQ0FOIHdvcmsgb24gdGhlIHNlcnZlci5cbiAgICAgICAgY29uc3Qgc3RvcmFnZVN0cmF0ZWd5ID0gdGhpcy5fcGxhdGZvcm0uaXNCcm93c2VyXG4gICAgICAgICAgICA/IHRoaXMuX3N0b3JhZ2Uuc2VsZWN0KFtTdG9yYWdlT3B0aW9uLkNvb2tpZSwgU3RvcmFnZU9wdGlvbi5Mb2NhbF0pXG4gICAgICAgICAgICA6IHRoaXMuX3N0b3JhZ2UuY29va2llO1xuXG4gICAgICAgIC8vIFN0YXJ0aW5nIHRoZSBuZXcgc2Vzc2lvbi5cbiAgICAgICAgdGhpcy5zZXNzaW9uID0gbmV3IEF1dGhTZXNzaW9uKHtcbiAgICAgICAgICAgIGlkOiB0aGlzLl9jb25maWc/LmFwcGxpY2F0aW9uSWQsXG4gICAgICAgICAgICBzdG9yYWdlOiBzdG9yYWdlU3RyYXRlZ3lcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMudXNlciA9IHRoaXMuc2Vzc2lvbi51c2VyO1xuICAgIH1cblxuICAgIGluaXRpYWxpemUoKSB7XG4gICAgICAgIHJldHVybiBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgYXBwIHNob3VsZCBib290c3RyYXAgdGhlIGF1dGhlbnRpY2F0aW9uLlxuICAgICAgICAgICAgY29uc3Qgc2hvdWxkQm9vdHN0cmFwID0gdGhpcy5fY29uZmlnPy5ib290c3RyYXAgPz8gdHJ1ZTtcbiAgICAgICAgICAgIGlmICghc2hvdWxkQm9vdHN0cmFwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlQXV0b1JlZnJlc2hpbmcoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gT25seSByZXRyaWV2ZSBmcm9tIHRoZSBzZXJ2ZXIgd2hlbiB3ZSBhcmUgYWN0dWFsbHkgYXV0aGVudGljYXRlZC5cbiAgICAgICAgICAgIGlmICghdGhpcy5zZXNzaW9uLmF1dGhlbnRpY2F0ZWQoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gR2V0IHRoZSBrZXkgZnJvbSB0aGUgc2VydmVyIHN0YXRlLlxuICAgICAgICAgICAgaWYgKHRoaXMuX3N0YXRlICYmIHRoaXMuX3N0YXRlPy5oYXNLZXkodGhpcy5fYXV0aFN0YXRlS2V5KSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHVzZXIgPSB0aGlzLl9zdGF0ZT8uZ2V0KHRoaXMuX2F1dGhTdGF0ZUtleSwgbnVsbCkgPz8gbnVsbDtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zZXNzaW9uLnNldFVzZXIodXNlcik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFRyeSB0byBmZXRjaCB0aGUgdXNlciBmcm9tIHRoZSBzZXJ2ZXIuXG4gICAgICAgICAgICBjb25zdCB1c2VyJCA9IHRoaXMubWUoKTtcbiAgICAgICAgICAgIGNvbnN0IHVzZXIgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbSh1c2VyJCwge2RlZmF1bHRWYWx1ZTogbnVsbH0pO1xuXG4gICAgICAgICAgICAvLyBTZXQgdGhlIHN0YXRlIGlmIGV4aXN0cy5cbiAgICAgICAgICAgIGlmICh0aGlzLl9zdGF0ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3N0YXRlPy5zZXQ8YW55Pih0aGlzLl9hdXRoU3RhdGVLZXksIHVzZXIgPz8gbnVsbCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFNhdmUgdGhlIHVzZXIgaW4gdGhlIHN0b3JhZ2UgYW5kIGhhbmRsZSBhdXRvIHJlZnJlc2hpbmcuXG4gICAgICAgICAgICB0aGlzLnNlc3Npb24uc2V0VXNlcih1c2VyKTtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlQXV0b1JlZnJlc2hpbmcoKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBtZTxUID0gYW55PigpIHtcbiAgICAgICAgY29uc3QgdXJsID0gdGhpcy5nZXRVcmwoJ2F1dGgvbWUnKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2h0dHBDbGllbnQuZ2V0PFQ+KHVybCk7XG4gICAgfVxuXG4gICAgYXN5bmMgc2lnbkluKHByb3ZpZGVyOiBBdXRoUHJvdmlkZXIsIGFzPzogc3RyaW5nW10pIHtcbiAgICAgICAgY29uc3Qge2FjY2Vzc1Rva2VuLCByZWZyZXNoVG9rZW4sIHVzZXIsIC4uLnJlc3VsdH0gPSBhd2FpdCBwcm92aWRlci5hdXRoZW50aWNhdGUodGhpcy5faHR0cENsaWVudCk7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHJvbGUgbWF0Y2hlcy5cbiAgICAgICAgY29uc3Qgcm9sZSA9IHVzZXI/LnJvbGUgPz8gbnVsbDtcbiAgICAgICAgaWYgKGFzICYmICFhcy5pbmNsdWRlcyhyb2xlKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHJvbGUuJyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBWYWxpZGF0ZSBpZiB0aGUgcHJvdmlkZXIgaXMgb25lIG9mIHRoZSBhdmFpbGFibGVcbiAgICAgICAgLy8gcHJvdmlkZXJzIHRoZW4gcmV0dXJuIHRoZSB1c2VyIG9iamVjdCBhbmQgdGhlIHByb3ZpZGVyLlxuICAgICAgICBjb25zdCBhcGlQcm92aWRlciA9IHJlc3VsdD8ucHJvdmlkZXIgPz8gbnVsbDtcbiAgICAgICAgY29uc3QgYXBpVmVyaWZ5VG9rZW4gPSByZXN1bHQ/LnZlcmlmeVRva2VuID8/IG51bGw7XG4gICAgICAgIGNvbnN0IGF2YWlsYWJsZVByb3ZpZGVycyA9IHRoaXMuX2NvbmZpZz8ucHJvdmlkZXJzID8/IFsnZW1haWwnLCAnc21zJywgJ3RvdHAnXTtcbiAgICAgICAgaWYgKGF2YWlsYWJsZVByb3ZpZGVycy5pbmNsdWRlcyhhcGlQcm92aWRlcikpIHtcbiAgICAgICAgICAgIHJldHVybiA8QXV0aFNpZ25JblJlc3BvbnNlPnt1c2VyLCBwcm92aWRlcjogYXBpUHJvdmlkZXIsIHZlcmlmeVRva2VuOiBhcGlWZXJpZnlUb2tlbn07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTZXQgdGhlIHRva2VucyBpbiBzdG9yYWdlLlxuICAgICAgICB0aGlzLnNldFRva2VucyhhY2Nlc3NUb2tlbiwgcmVmcmVzaFRva2VuKTtcblxuICAgICAgICAvLyBTZXQgdGhlIHVzZXIgaW4gc3RvcmFnZS5cbiAgICAgICAgdGhpcy5zZXNzaW9uLnNldFVzZXIodXNlcik7XG5cbiAgICAgICAgLy8gUmV0dXJuIHRoZSB1c2VyLlxuICAgICAgICByZXR1cm4gPEF1dGhTaWduSW5SZXNwb25zZT57dXNlcn07XG4gICAgfVxuXG4gICAgYXN5bmMgc2lnbkluV2l0aEVtYWlsKGVtYWlsOiBzdHJpbmcsIHBhc3N3b3JkOiBzdHJpbmcsIGFzPzogc3RyaW5nW10pIHtcbiAgICAgICAgY29uc3QgdXJsID0gdGhpcy5nZXRVcmwoJ2F1dGgvbG9naW4nKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2lnbkluKG5ldyBBdXRoRW1haWxQcm92aWRlcihlbWFpbCwgcGFzc3dvcmQsIHVybCksIGFzKTtcbiAgICB9XG5cbiAgICBhc3luYyBzaWduSW5XaXRoVmVyaWZ5Q29kZShjb2RlOiBzdHJpbmcsIHZlcmlmeVRva2VuOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgdXJsID0gdGhpcy5nZXRVcmwoJ2F1dGgvdmVyaWZ5Jyk7XG4gICAgICAgIHJldHVybiB0aGlzLnNpZ25JbihuZXcgQXV0aFZlcmlmeVByb3ZpZGVyKGNvZGUsIHZlcmlmeVRva2VuLCB1cmwpKTtcbiAgICB9XG5cbiAgICBhc3luYyByZXNlbmRWZXJpZnlDb2RlKHZlcmlmeVRva2VuOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgdXJsID0gdGhpcy5nZXRVcmwoJ2F1dGgvcmVzZW5kJyk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCQgPSB0aGlzLl9odHRwQ2xpZW50LnBvc3QodXJsLCB7XG4gICAgICAgICAgICB2ZXJpZnlfdG9rZW46IHZlcmlmeVRva2VuXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBmaXJzdFZhbHVlRnJvbShyZXN1bHQkKTtcbiAgICB9XG5cbiAgICBhc3luYyByZWdpc3RlcjxUID0gYW55PihkYXRhOiBhbnksIG9wdGlvbnM/OiB7XG4gICAgICAgIGhlYWRlcnM/OiBIdHRwSGVhZGVycyB8IHtcbiAgICAgICAgICAgIFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB8IHN0cmluZ1tdO1xuICAgICAgICB9O1xuICAgICAgICBwYXJhbXM/OiBIdHRwUGFyYW1zIHwge1xuICAgICAgICAgICAgW3BhcmFtOiBzdHJpbmddOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgUmVhZG9ubHlBcnJheTxzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuPjtcbiAgICAgICAgfTtcbiAgICB9KSB7XG4gICAgICAgIC8vIEV4ZWN1dGUgQVBJIGNhbGwuXG4gICAgICAgIGNvbnN0IHVybCA9IHRoaXMuZ2V0VXJsKCdhdXRoL3JlZ2lzdGVyJyk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCQgPSB0aGlzLl9odHRwQ2xpZW50LnBvc3Q8eyB0b2tlbjogc3RyaW5nLCByZWZyZXNoX3Rva2VuOiBzdHJpbmcsIHVzZXI6IGFueSB9Pih1cmwsIGRhdGEsIG9wdGlvbnMpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbShyZXN1bHQkKTtcblxuICAgICAgICAvLyBTZXQgdGhlIHRva2VucyBpbiBzdG9yYWdlLlxuICAgICAgICB0aGlzLnNldFRva2VucyhyZXN1bHQ/LnRva2VuLCByZXN1bHQ/LnJlZnJlc2hfdG9rZW4pO1xuXG4gICAgICAgIC8vIFNldCB0aGUgdXNlciBpbiBzdG9yYWdlLlxuICAgICAgICBjb25zdCB1c2VyID0gcmVzdWx0Py51c2VyO1xuICAgICAgICB0aGlzLnNlc3Npb24uc2V0VXNlcih1c2VyKTtcblxuICAgICAgICAvLyBSZXR1cm4gdGhlIHVzZXIuXG4gICAgICAgIHJldHVybiA8VD51c2VyO1xuICAgIH1cblxuICAgIGxvZ291dCgpIHtcbiAgICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhIHJlZnJlc2ggdG9rZW4ganVzdCBjbGVhciB0aGUgc2Vzc2lvbi5cbiAgICAgICAgLy8gTm90ZTogV2UgZG8gdGhpcyBiZWNhdXNlIGVsc2Ugd2UgdHJ5IHRvIGludmFsaWRhdGVcbiAgICAgICAgLy8gYW4gXCJ1bmRlZmluZWRcIiByZWZyZXNoIHRva2VuLlxuICAgICAgICBjb25zdCByZWZyZXNoVG9rZW4gPSB0aGlzLnNlc3Npb24ucmVmcmVzaFRva2VuO1xuICAgICAgICBpZiAoIXJlZnJlc2hUb2tlbikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2Vzc2lvbi5jbGVhcigpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gV2UgZG8gaGF2ZSBhIHJlZnJlc2ggdG9rZW4sIHNvIHRyeSB0b1xuICAgICAgICAvLyBpbnZhbGlkYXRlIGl0IGluIHRoZSBiYWNrZW5kLlxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgdXJsID0gdGhpcy5nZXRVcmwoJ2F1dGgvbG9nb3V0Jyk7XG4gICAgICAgICAgICBjb25zdCBoZWFkZXJOYW1lID0gdGhpcy5fY29uZmlnPy5odHRwPy5oZWFkZXIgPz8gJ0F1dGhvcml6YXRpb24nO1xuICAgICAgICAgICAgY29uc3Qgb2JzZXJ2YWJsZSQgPSB0aGlzLl9odHRwQ2xpZW50LmdldCh1cmwsIHtcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7W2hlYWRlck5hbWVdOiByZWZyZXNoVG9rZW59XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGZpcnN0VmFsdWVGcm9tKG9ic2VydmFibGUkKS50aGVuKF8gPT4gXykuY2F0Y2goXyA9PiBfKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvLyBEbyBub3RoaW5nIGJlY2F1c2UgdGhlIHRva2VucyB3aWxsIGJlIGRlbGV0ZWQgYW55d2F5cyBmcm9tIHRoZSBzZXNzaW9uLlxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGVsZXRlIHRoZSB0b2tlbnMgZnJvbSB0aGUgc2Vzc2lvbi5cbiAgICAgICAgcmV0dXJuIHRoaXMuc2Vzc2lvbi5jbGVhcigpO1xuICAgIH1cblxuICAgIHJlZnJlc2goKSB7XG4gICAgICAgIC8vIElmIHRoZSByZWZyZXNoIHRva2VuIGRvZXNcbiAgICAgICAgLy8gbm90IGV4aXN0IGp1c3QgcmV0dXJuIGFuIG9ic2VydmFibGUgb2YgbnVsbC5cbiAgICAgICAgY29uc3QgcmVmcmVzaFRva2VuID0gdGhpcy5zZXNzaW9uLnJlZnJlc2hUb2tlbjtcbiAgICAgICAgaWYgKCFyZWZyZXNoVG9rZW4pIHtcbiAgICAgICAgICAgIHJldHVybiBvZihudWxsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFBlcmZvcm0gdGhlIHJlZnJlc2ggY2FsbC5cbiAgICAgICAgY29uc3QgaGVhZGVyTmFtZSA9IHRoaXMuX2NvbmZpZz8uaHR0cD8uaGVhZGVyID8/ICdBdXRob3JpemF0aW9uJztcbiAgICAgICAgY29uc3Qgc2NoZW1lID0gdGhpcy5fY29uZmlnPy5odHRwPy5zY2hlbWUgPz8gJ0JlYXJlcic7XG5cbiAgICAgICAgY29uc3QgdXJsID0gdGhpcy5nZXRVcmwoJ2F1dGgvcmVmcmVzaCcpO1xuICAgICAgICBjb25zdCBjb250ZXh0ID0gbmV3IEh0dHBDb250ZXh0KCkuc2V0KFVTRV9BVVRIT1JJWkFUSU9OLCBmYWxzZSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2h0dHBDbGllbnQuZ2V0PHsgdG9rZW46IHN0cmluZywgcmVmcmVzaF90b2tlbjogc3RyaW5nIH0+KHVybCwge1xuICAgICAgICAgICAgaGVhZGVyczoge1toZWFkZXJOYW1lXTogYCR7c2NoZW1lfSAke3JlZnJlc2hUb2tlbn1gfSxcbiAgICAgICAgICAgIGNvbnRleHQ6IGNvbnRleHRcbiAgICAgICAgfSkucGlwZShcbiAgICAgICAgICAgIHRhcCgoe3Rva2VuLCByZWZyZXNoX3Rva2VufSkgPT4gdGhpcy5zZXRUb2tlbnModG9rZW4sIHJlZnJlc2hfdG9rZW4pKSxcbiAgICAgICAgICAgIG1hcCgoe3Rva2VufSkgPT4gdG9rZW4pXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgYXN5bmMgcmVxdWVzdFBhc3N3b3JkKGVtYWlsOiBzdHJpbmcsIGV4dHJhUGFyYW1zOiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge30pIHtcbiAgICAgICAgY29uc3QgdXJsID0gdGhpcy5nZXRVcmwoJ2F1dGgvcmVzZXQnKTtcbiAgICAgICAgY29uc3Qgb2JzZXJ2YWJsZSQgPSB0aGlzLl9odHRwQ2xpZW50LnBvc3QodXJsLCB7Li4uZXh0cmFQYXJhbXMsIGVtYWlsfSk7XG4gICAgICAgIHJldHVybiBmaXJzdFZhbHVlRnJvbShvYnNlcnZhYmxlJCk7XG4gICAgfVxuXG4gICAgYXN5bmMgcmVzZXRQYXNzd29yZCh0b2tlbjogc3RyaW5nLCBuZXdQYXNzd29yZDogc3RyaW5nLCBleHRyYVBhcmFtczogeyBba2V5OiBzdHJpbmddOiBhbnkgfSA9IHt9KSB7XG4gICAgICAgIGNvbnN0IHVybCA9IHRoaXMuZ2V0VXJsKCdhdXRoL3Jlc2V0LXBhc3N3b3JkJyk7XG4gICAgICAgIGNvbnN0IG9ic2VydmFibGUkID0gdGhpcy5faHR0cENsaWVudC5wb3N0KHVybCwgey4uLmV4dHJhUGFyYW1zLCB0b2tlbiwgcGFzc3dvcmQ6IG5ld1Bhc3N3b3JkfSk7XG4gICAgICAgIHJldHVybiBmaXJzdFZhbHVlRnJvbShvYnNlcnZhYmxlJCk7XG4gICAgfVxuXG4gICAgY2xlYXJBbmRSZWRpcmVjdCgpIHtcbiAgICAgICAgLy8gMS4gRGVsZXRlIHRoZSB0b2tlbnMgZnJvbSB0aGUgc2Vzc2lvbi5cbiAgICAgICAgdGhpcy5zZXNzaW9uLmNsZWFyKCk7XG5cbiAgICAgICAgaWYgKHRoaXMuX2hhbmRsZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IHVybFRyZWUgPSB0aGlzLl9oYW5kbGVyLm9uRmFpbGVkQXV0aGVudGljYXRlZCgpO1xuICAgICAgICAgICAgaWYgKCF1cmxUcmVlIHx8IHVybFRyZWUgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlQnlVcmwodXJsVHJlZSkudGhlbihfID0+IF8pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gMi4gQ29tcG9zZSB0aGUgcm91dGUgdXJsLlxuICAgICAgICBjb25zdCByZWRpcmVjdFVybCA9IHRoaXMuX2NvbmZpZz8ucmVkaXJlY3RzLnVuYXV0aGVudGljYXRlZCA/PyBudWxsO1xuXG4gICAgICAgIC8vIDMuIFJvdXRlIGJhY2sgaWYgdGhlIHVzZXIgcHJvdmlkZWQgYSByZWRpcmVjdCB1cmwuXG4gICAgICAgIGlmICh0aGlzLnJvdXRlciAmJiByZWRpcmVjdFVybCkge1xuICAgICAgICAgICAgY29uc3QgY29tbWFuZHMgPSBBcnJheS5pc0FycmF5KHJlZGlyZWN0VXJsKSA/IHJlZGlyZWN0VXJsIDogW3JlZGlyZWN0VXJsXTtcbiAgICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKGNvbW1hbmRzKS50aGVuKF8gPT4gXyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHNldFRva2VucyhhY2Nlc3NUb2tlbjogc3RyaW5nLCByZWZyZXNoVG9rZW46IHN0cmluZykge1xuICAgICAgICAvLyBTZXQgdGhlIHRva2VucyBpbiBvdXIgc2Vzc2lvbi5cbiAgICAgICAgdGhpcy5zZXNzaW9uLnNldFRva2VucyhhY2Nlc3NUb2tlbiwgcmVmcmVzaFRva2VuKTtcblxuICAgICAgICAvLyBXZSBuZWVkIHRvIHVwZGF0ZSB0aGUgYXV0byByZWZyZXNoIG9mIHRoZSByZWZyZXNoIHRva2VuLlxuICAgICAgICB0aGlzLmhhbmRsZUF1dG9SZWZyZXNoaW5nKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoYW5kbGVBdXRvUmVmcmVzaGluZygpIHtcbiAgICAgICAgY29uc3Qgc2hvdWxkQXV0b1JlZnJlc2ggPSB0aGlzLl9jb25maWc/LmF1dG9SZWZyZXNoID8/IGZhbHNlO1xuICAgICAgICBpZiAoIXNob3VsZEF1dG9SZWZyZXNoKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBleHBpcmVzQXQgPSB0aGlzLnNlc3Npb24ucmVmcmVzaFRva2VuUGF5bG9hZD8uZXhwaXJlc0F0ID8/IG51bGw7XG4gICAgICAgIGlmIChleHBpcmVzQXQgPT09IG51bGwgfHwgIXRoaXMuX3BsYXRmb3JtLmlzQnJvd3Nlcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGlmZmVyZW5jZUluTWlsbGlzZWNvbmRzID0gZXhwaXJlc0F0LmdldFRpbWUoKSAtIERhdGUubm93KCk7XG4gICAgICAgIGNvbnN0IG9mZnNldEluTWlsbGlzZWNvbmRzID0gMTBfMDAwOyAvLyAxMCBzZWNvbmRzLlxuXG4gICAgICAgIC8vIFdlIHdhbnQgdG8gc3RhcnQgdGhlIHJlZnJlc2ggMTAgc2Vjb25kcyBiZWZvcmUgaXQgZXhwaXJlcy5cbiAgICAgICAgY29uc3QgYWN0dWFsVGltaW5nID0gZGlmZmVyZW5jZUluTWlsbGlzZWNvbmRzIC0gb2Zmc2V0SW5NaWxsaXNlY29uZHM7XG4gICAgICAgIGlmIChhY3R1YWxUaW1pbmcgPD0gMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gV2UgbmVlZCB0byBjYXAgdGhlIHRpbWluZ3MgYmVjYXVzZSBpZlxuICAgICAgICAvLyB3ZSBnZXQgbGFyZ2UgbnVtYmVycyBpdCBtaWdodCBjYXVzZSB1bndhbnRlZCByZXN1bHRzLlxuICAgICAgICBjb25zdCBtYXhUaW1pbmcgPSAxMDAwICogNjAgKiA2MCAqIDI0OyAvLyAyNCBob3Vycy5cbiAgICAgICAgY29uc3QgY2FwcGVkVGltaW5nID0gTWF0aC5tYXgoMSwgTWF0aC5taW4oYWN0dWFsVGltaW5nLCBtYXhUaW1pbmcpKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9yZWZyZXNoSGFuZGxlciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dD8uKHRoaXMuX3JlZnJlc2hIYW5kbGVyKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZWZyZXNoSGFuZGxlciA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9yZWZyZXNoSGFuZGxlciA9IHdpbmRvdz8uc2V0VGltZW91dD8uKCgpID0+IHRoaXMuYXV0b1JlZnJlc2goKSwgY2FwcGVkVGltaW5nKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvLyBKdXN0IGlnbm9yZSBpdC5cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgYXV0b1JlZnJlc2goKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXZSBqdXN0IG5lZWQgdG8gd2FpdCBmb3IgaXQgdG8gcmVmcmVzaC5cbiAgICAgICAgICAgIGNvbnN0IHJlZnJlc2gkID0gdGhpcy5yZWZyZXNoKCk7XG4gICAgICAgICAgICBhd2FpdCBmaXJzdFZhbHVlRnJvbShyZWZyZXNoJCk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy8gU29tZXRoaW5nIHdlbnQgd3JvbmcgcmVmcmVzaGluZywgd2UgbmVlZCB0byBjbGVhci5cbiAgICAgICAgICAgIHRoaXMuY2xlYXJBbmRSZWRpcmVjdCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXQgcm91dGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faW5qZWN0b3IuZ2V0KFJvdXRlcik7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRVcmwoZW5kcG9pbnQ6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gW3RoaXMuX2h0dHBBbGlhcywgZW5kcG9pbnRdXG4gICAgICAgICAgICAuZmlsdGVyKGl0ZW0gPT4gISFpdGVtKVxuICAgICAgICAgICAgLmpvaW4oJy8nKTtcbiAgICB9XG5cbn1cbiJdfQ==
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { Directive, Input } from '@angular/core';
|
|
2
|
+
import { AbstractAuthDirective } from './abstract.directive';
|
|
3
|
+
import { distinctUntilChanged, map } from 'rxjs/operators';
|
|
4
|
+
import { Subscription } from 'rxjs';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
import * as i1 from "../auth.service";
|
|
7
|
+
class BbAuthenticated extends AbstractAuthDirective {
|
|
8
|
+
set bbAuthenticatedElse(templateRef) {
|
|
9
|
+
this.assertTemplate('bbAuthenticatedElse', templateRef);
|
|
10
|
+
this.elseTemplateRef = templateRef;
|
|
11
|
+
this.updateView();
|
|
12
|
+
}
|
|
13
|
+
constructor(_auth, _templateRef, _viewContainerRef) {
|
|
14
|
+
super(_templateRef, _viewContainerRef);
|
|
15
|
+
this._auth = _auth;
|
|
16
|
+
this._templateRef = _templateRef;
|
|
17
|
+
this._viewContainerRef = _viewContainerRef;
|
|
18
|
+
// Subscriptions.
|
|
19
|
+
this._subscription = new Subscription();
|
|
20
|
+
}
|
|
21
|
+
ngOnInit() {
|
|
22
|
+
const subscription = this._auth.user.pipe(map(user => !!user), distinctUntilChanged()).subscribe(valid => {
|
|
23
|
+
this.valid = valid;
|
|
24
|
+
this.updateView();
|
|
25
|
+
});
|
|
26
|
+
this._subscription.add(subscription);
|
|
27
|
+
}
|
|
28
|
+
ngOnDestroy() {
|
|
29
|
+
this._subscription?.unsubscribe();
|
|
30
|
+
}
|
|
31
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: BbAuthenticated, deps: [{ token: i1.Auth }, { token: i0.TemplateRef }, { token: i0.ViewContainerRef }], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
32
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.0.0", type: BbAuthenticated, selector: "[bbAuthenticated]", inputs: { bbAuthenticatedElse: "bbAuthenticatedElse" }, usesInheritance: true, ngImport: i0 }); }
|
|
33
|
+
}
|
|
34
|
+
export { BbAuthenticated };
|
|
35
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: BbAuthenticated, decorators: [{
|
|
36
|
+
type: Directive,
|
|
37
|
+
args: [{
|
|
38
|
+
selector: '[bbAuthenticated]'
|
|
39
|
+
}]
|
|
40
|
+
}], ctorParameters: function () { return [{ type: i1.Auth }, { type: i0.TemplateRef }, { type: i0.ViewContainerRef }]; }, propDecorators: { bbAuthenticatedElse: [{
|
|
41
|
+
type: Input
|
|
42
|
+
}] } });
|
|
43
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aGVudGljYXRlZC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9iYi1mb3VuZGF0aW9uL2F1dGgvc3JjL2xpYi9kaXJlY3RpdmVzL2F1dGhlbnRpY2F0ZWQuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQUUsS0FBSyxFQUFtRCxNQUFNLGVBQWUsQ0FBQztBQUNqRyxPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUMzRCxPQUFPLEVBQUMsb0JBQW9CLEVBQUUsR0FBRyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFekQsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLE1BQU0sQ0FBQzs7O0FBRWxDLE1BR2EsZUFBZ0IsU0FBUSxxQkFBcUI7SUFLdEQsSUFDSSxtQkFBbUIsQ0FBQyxXQUE2QjtRQUNqRCxJQUFJLENBQUMsY0FBYyxDQUFDLHFCQUFxQixFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQ3hELElBQUksQ0FBQyxlQUFlLEdBQUcsV0FBVyxDQUFDO1FBQ25DLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRUQsWUFBb0IsS0FBVyxFQUNYLFlBQThCLEVBQzlCLGlCQUFtQztRQUNuRCxLQUFLLENBQUMsWUFBWSxFQUFFLGlCQUFpQixDQUFDLENBQUM7UUFIdkIsVUFBSyxHQUFMLEtBQUssQ0FBTTtRQUNYLGlCQUFZLEdBQVosWUFBWSxDQUFrQjtRQUM5QixzQkFBaUIsR0FBakIsaUJBQWlCLENBQWtCO1FBWnZELGlCQUFpQjtRQUNULGtCQUFhLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztJQWEzQyxDQUFDO0lBRUQsUUFBUTtRQUNKLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FDckMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUNuQixvQkFBb0IsRUFBRSxDQUN6QixDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNoQixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztZQUNuQixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDdEIsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQsV0FBVztRQUNQLElBQUksQ0FBQyxhQUFhLEVBQUUsV0FBVyxFQUFFLENBQUM7SUFDdEMsQ0FBQzs4R0EvQlEsZUFBZTtrR0FBZixlQUFlOztTQUFmLGVBQWU7MkZBQWYsZUFBZTtrQkFIM0IsU0FBUzttQkFBQztvQkFDUCxRQUFRLEVBQUUsbUJBQW1CO2lCQUNoQztvSkFPTyxtQkFBbUI7c0JBRHRCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0RpcmVjdGl2ZSwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0LCBUZW1wbGF0ZVJlZiwgVmlld0NvbnRhaW5lclJlZn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0Fic3RyYWN0QXV0aERpcmVjdGl2ZX0gZnJvbSAnLi9hYnN0cmFjdC5kaXJlY3RpdmUnO1xuaW1wb3J0IHtkaXN0aW5jdFVudGlsQ2hhbmdlZCwgbWFwfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge0F1dGh9IGZyb20gJy4uL2F1dGguc2VydmljZSc7XG5pbXBvcnQge1N1YnNjcmlwdGlvbn0gZnJvbSAncnhqcyc7XG5cbkBEaXJlY3RpdmUoe1xuICAgIHNlbGVjdG9yOiAnW2JiQXV0aGVudGljYXRlZF0nXG59KVxuZXhwb3J0IGNsYXNzIEJiQXV0aGVudGljYXRlZCBleHRlbmRzIEFic3RyYWN0QXV0aERpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcblxuICAgIC8vIFN1YnNjcmlwdGlvbnMuXG4gICAgcHJpdmF0ZSBfc3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuXG4gICAgQElucHV0KClcbiAgICBzZXQgYmJBdXRoZW50aWNhdGVkRWxzZSh0ZW1wbGF0ZVJlZjogVGVtcGxhdGVSZWY8YW55Pikge1xuICAgICAgICB0aGlzLmFzc2VydFRlbXBsYXRlKCdiYkF1dGhlbnRpY2F0ZWRFbHNlJywgdGVtcGxhdGVSZWYpO1xuICAgICAgICB0aGlzLmVsc2VUZW1wbGF0ZVJlZiA9IHRlbXBsYXRlUmVmO1xuICAgICAgICB0aGlzLnVwZGF0ZVZpZXcoKTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9hdXRoOiBBdXRoLFxuICAgICAgICAgICAgICAgIHByaXZhdGUgX3RlbXBsYXRlUmVmOiBUZW1wbGF0ZVJlZjxhbnk+LFxuICAgICAgICAgICAgICAgIHByaXZhdGUgX3ZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWYpIHtcbiAgICAgICAgc3VwZXIoX3RlbXBsYXRlUmVmLCBfdmlld0NvbnRhaW5lclJlZik7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIGNvbnN0IHN1YnNjcmlwdGlvbiA9IHRoaXMuX2F1dGgudXNlci5waXBlKFxuICAgICAgICAgICAgbWFwKHVzZXIgPT4gISF1c2VyKSxcbiAgICAgICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKClcbiAgICAgICAgKS5zdWJzY3JpYmUodmFsaWQgPT4ge1xuICAgICAgICAgICAgdGhpcy52YWxpZCA9IHZhbGlkO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVWaWV3KCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9zdWJzY3JpcHRpb24uYWRkKHN1YnNjcmlwdGlvbik7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMuX3N1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfYmJBdXRoZW50aWNhdGVkRWxzZTogVGVtcGxhdGVSZWY8YW55PjtcblxufVxuIl19
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { AUTH_REDIRECT_HANDLER } from '../interfaces/config.interface';
|
|
2
|
+
import { Inject, Injectable, Optional } from '@angular/core';
|
|
3
|
+
import { map } from 'rxjs/operators';
|
|
4
|
+
import { first } from 'rxjs';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
import * as i1 from "../auth.service";
|
|
7
|
+
import * as i2 from "@angular/router";
|
|
8
|
+
import * as i3 from "../interfaces/config.interface";
|
|
9
|
+
class BbAnonymousGuard {
|
|
10
|
+
constructor(_auth, _router, _config, _handler) {
|
|
11
|
+
this._auth = _auth;
|
|
12
|
+
this._router = _router;
|
|
13
|
+
this._config = _config;
|
|
14
|
+
this._handler = _handler;
|
|
15
|
+
}
|
|
16
|
+
canActivate(snapshot, state) {
|
|
17
|
+
return this._auth.user.pipe(map(user => !!user), map(isAuthenticated => {
|
|
18
|
+
if (!isAuthenticated) {
|
|
19
|
+
return true;
|
|
20
|
+
}
|
|
21
|
+
if (this._handler) {
|
|
22
|
+
return this._handler.onFailedAnonymous(snapshot, state);
|
|
23
|
+
}
|
|
24
|
+
// If we don't have a URL to go to we can just say
|
|
25
|
+
// the user is not allowed in this route by returning false.
|
|
26
|
+
const nextUrl = this._config?.redirects?.authenticated ?? null;
|
|
27
|
+
if (!nextUrl) {
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
const commands = Array.isArray(nextUrl) ? nextUrl : [nextUrl];
|
|
31
|
+
return this._router.createUrlTree(commands);
|
|
32
|
+
}), first());
|
|
33
|
+
}
|
|
34
|
+
canActivateChild(childRoute, state) {
|
|
35
|
+
return this.canActivate(childRoute, state);
|
|
36
|
+
}
|
|
37
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: BbAnonymousGuard, deps: [{ token: i1.Auth }, { token: i2.Router }, { token: i3.AuthConfig, optional: true }, { token: AUTH_REDIRECT_HANDLER, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
38
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: BbAnonymousGuard, providedIn: 'root' }); }
|
|
39
|
+
}
|
|
40
|
+
export { BbAnonymousGuard };
|
|
41
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: BbAnonymousGuard, decorators: [{
|
|
42
|
+
type: Injectable,
|
|
43
|
+
args: [{
|
|
44
|
+
providedIn: 'root'
|
|
45
|
+
}]
|
|
46
|
+
}], ctorParameters: function () { return [{ type: i1.Auth }, { type: i2.Router }, { type: i3.AuthConfig, decorators: [{
|
|
47
|
+
type: Optional
|
|
48
|
+
}] }, { type: undefined, decorators: [{
|
|
49
|
+
type: Optional
|
|
50
|
+
}, {
|
|
51
|
+
type: Inject,
|
|
52
|
+
args: [AUTH_REDIRECT_HANDLER]
|
|
53
|
+
}] }]; } });
|
|
54
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5vbnltb3VzLmd1YXJkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYmItZm91bmRhdGlvbi9hdXRoL3NyYy9saWIvZ3VhcmRzL2Fub255bW91cy5ndWFyZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUMscUJBQXFCLEVBQWtDLE1BQU0sZ0NBQWdDLENBQUM7QUFDdEcsT0FBTyxFQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRTNELE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUNuQyxPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sTUFBTSxDQUFDOzs7OztBQUUzQixNQUdhLGdCQUFnQjtJQUV6QixZQUFvQixLQUFXLEVBQ1gsT0FBZSxFQUNILE9BQW9CLEVBQ1csUUFBOEI7UUFIekUsVUFBSyxHQUFMLEtBQUssQ0FBTTtRQUNYLFlBQU8sR0FBUCxPQUFPLENBQVE7UUFDSCxZQUFPLEdBQVAsT0FBTyxDQUFhO1FBQ1csYUFBUSxHQUFSLFFBQVEsQ0FBc0I7SUFDN0YsQ0FBQztJQUVELFdBQVcsQ0FBQyxRQUFnQyxFQUFFLEtBQTBCO1FBQ3BFLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUN2QixHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQ25CLEdBQUcsQ0FBQyxlQUFlLENBQUMsRUFBRTtZQUNsQixJQUFJLENBQUMsZUFBZSxFQUFFO2dCQUNsQixPQUFPLElBQUksQ0FBQzthQUNmO1lBRUQsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO2dCQUNmLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUM7YUFDM0Q7WUFFRCxrREFBa0Q7WUFDbEQsNERBQTREO1lBQzVELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLGFBQWEsSUFBSSxJQUFJLENBQUM7WUFDL0QsSUFBSSxDQUFDLE9BQU8sRUFBRTtnQkFDVixPQUFPLEtBQUssQ0FBQzthQUNoQjtZQUVELE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUM5RCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2hELENBQUMsQ0FBQyxFQUNGLEtBQUssRUFBRSxDQUNWLENBQUM7SUFDTixDQUFDO0lBRUQsZ0JBQWdCLENBQUMsVUFBa0MsRUFBRSxLQUEwQjtRQUMzRSxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQy9DLENBQUM7OEdBcENRLGdCQUFnQixzR0FLTyxxQkFBcUI7a0hBTDVDLGdCQUFnQixjQUZiLE1BQU07O1NBRVQsZ0JBQWdCOzJGQUFoQixnQkFBZ0I7a0JBSDVCLFVBQVU7bUJBQUM7b0JBQ1IsVUFBVSxFQUFFLE1BQU07aUJBQ3JCOzswQkFLZ0IsUUFBUTs7MEJBQ1IsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxxQkFBcUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0FjdGl2YXRlZFJvdXRlU25hcHNob3QsIENhbkFjdGl2YXRlLCBDYW5BY3RpdmF0ZUNoaWxkLCBSb3V0ZXIsIFJvdXRlclN0YXRlU25hcHNob3R9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQge0FVVEhfUkVESVJFQ1RfSEFORExFUiwgQXV0aENvbmZpZywgQXV0aFJlZGlyZWN0SGFuZGxlcn0gZnJvbSAnLi4vaW50ZXJmYWNlcy9jb25maWcuaW50ZXJmYWNlJztcbmltcG9ydCB7SW5qZWN0LCBJbmplY3RhYmxlLCBPcHRpb25hbH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0F1dGh9IGZyb20gJy4uL2F1dGguc2VydmljZSc7XG5pbXBvcnQge21hcH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtmaXJzdH0gZnJvbSAncnhqcyc7XG5cbkBJbmplY3RhYmxlKHtcbiAgICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgQmJBbm9ueW1vdXNHdWFyZCBpbXBsZW1lbnRzIENhbkFjdGl2YXRlLCBDYW5BY3RpdmF0ZUNoaWxkIHtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgX2F1dGg6IEF1dGgsXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSBfcm91dGVyOiBSb3V0ZXIsXG4gICAgICAgICAgICAgICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBfY29uZmlnPzogQXV0aENvbmZpZyxcbiAgICAgICAgICAgICAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEFVVEhfUkVESVJFQ1RfSEFORExFUikgcHJpdmF0ZSBfaGFuZGxlcj86IEF1dGhSZWRpcmVjdEhhbmRsZXIpIHtcbiAgICB9XG5cbiAgICBjYW5BY3RpdmF0ZShzbmFwc2hvdDogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCwgc3RhdGU6IFJvdXRlclN0YXRlU25hcHNob3QpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2F1dGgudXNlci5waXBlKFxuICAgICAgICAgICAgbWFwKHVzZXIgPT4gISF1c2VyKSxcbiAgICAgICAgICAgIG1hcChpc0F1dGhlbnRpY2F0ZWQgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghaXNBdXRoZW50aWNhdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9oYW5kbGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVyLm9uRmFpbGVkQW5vbnltb3VzKHNuYXBzaG90LCBzdGF0ZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhIFVSTCB0byBnbyB0byB3ZSBjYW4ganVzdCBzYXlcbiAgICAgICAgICAgICAgICAvLyB0aGUgdXNlciBpcyBub3QgYWxsb3dlZCBpbiB0aGlzIHJvdXRlIGJ5IHJldHVybmluZyBmYWxzZS5cbiAgICAgICAgICAgICAgICBjb25zdCBuZXh0VXJsID0gdGhpcy5fY29uZmlnPy5yZWRpcmVjdHM/LmF1dGhlbnRpY2F0ZWQgPz8gbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAoIW5leHRVcmwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbW1hbmRzID0gQXJyYXkuaXNBcnJheShuZXh0VXJsKSA/IG5leHRVcmwgOiBbbmV4dFVybF07XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JvdXRlci5jcmVhdGVVcmxUcmVlKGNvbW1hbmRzKTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgZmlyc3QoKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGNhbkFjdGl2YXRlQ2hpbGQoY2hpbGRSb3V0ZTogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCwgc3RhdGU6IFJvdXRlclN0YXRlU25hcHNob3QpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FuQWN0aXZhdGUoY2hpbGRSb3V0ZSwgc3RhdGUpO1xuICAgIH1cblxufVxuIl19
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { AUTH_REDIRECT_HANDLER } from '../interfaces/config.interface';
|
|
2
|
+
import { Inject, Injectable, Optional } from '@angular/core';
|
|
3
|
+
import { map } from 'rxjs/operators';
|
|
4
|
+
import { first } from 'rxjs';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
import * as i1 from "../auth.service";
|
|
7
|
+
import * as i2 from "@angular/router";
|
|
8
|
+
import * as i3 from "../interfaces/config.interface";
|
|
9
|
+
class BbAuthenticatedGuard {
|
|
10
|
+
constructor(_auth, _router, _config, _handler) {
|
|
11
|
+
this._auth = _auth;
|
|
12
|
+
this._router = _router;
|
|
13
|
+
this._config = _config;
|
|
14
|
+
this._handler = _handler;
|
|
15
|
+
}
|
|
16
|
+
canActivate(snapshot, state) {
|
|
17
|
+
return this._auth.user.pipe(map(user => !!user), map(isAuthenticated => {
|
|
18
|
+
if (isAuthenticated) {
|
|
19
|
+
return true;
|
|
20
|
+
}
|
|
21
|
+
if (this._handler) {
|
|
22
|
+
return this._handler.onFailedAuthenticated(snapshot, state);
|
|
23
|
+
}
|
|
24
|
+
// If we don't have a URL to go to we can just say
|
|
25
|
+
// the user is not allowed in this route by returning false.
|
|
26
|
+
const nextUrl = this._config?.redirects?.unauthenticated ?? null;
|
|
27
|
+
if (!nextUrl) {
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
const setRedirectOnFailedAuth = this._config?.setRedirectOnFailedAuth ?? true;
|
|
31
|
+
const redirectUrl = state?.url ?? null;
|
|
32
|
+
const queryParams = setRedirectOnFailedAuth && redirectUrl ? { redirectUrl } : {};
|
|
33
|
+
const commands = Array.isArray(nextUrl) ? nextUrl : [nextUrl];
|
|
34
|
+
return this._router.createUrlTree(commands, { queryParams });
|
|
35
|
+
}), first());
|
|
36
|
+
}
|
|
37
|
+
canActivateChild(childRoute, state) {
|
|
38
|
+
return this.canActivate(childRoute, state);
|
|
39
|
+
}
|
|
40
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: BbAuthenticatedGuard, deps: [{ token: i1.Auth }, { token: i2.Router }, { token: i3.AuthConfig, optional: true }, { token: AUTH_REDIRECT_HANDLER, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
41
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: BbAuthenticatedGuard, providedIn: 'root' }); }
|
|
42
|
+
}
|
|
43
|
+
export { BbAuthenticatedGuard };
|
|
44
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: BbAuthenticatedGuard, decorators: [{
|
|
45
|
+
type: Injectable,
|
|
46
|
+
args: [{
|
|
47
|
+
providedIn: 'root'
|
|
48
|
+
}]
|
|
49
|
+
}], ctorParameters: function () { return [{ type: i1.Auth }, { type: i2.Router }, { type: i3.AuthConfig, decorators: [{
|
|
50
|
+
type: Optional
|
|
51
|
+
}] }, { type: undefined, decorators: [{
|
|
52
|
+
type: Optional
|
|
53
|
+
}, {
|
|
54
|
+
type: Inject,
|
|
55
|
+
args: [AUTH_REDIRECT_HANDLER]
|
|
56
|
+
}] }]; } });
|
|
57
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aGVudGljYXRlZC5ndWFyZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2JiLWZvdW5kYXRpb24vYXV0aC9zcmMvbGliL2d1YXJkcy9hdXRoZW50aWNhdGVkLmd1YXJkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBQyxxQkFBcUIsRUFBa0MsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN0RyxPQUFPLEVBQUMsTUFBTSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFFM0QsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ25DLE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxNQUFNLENBQUM7Ozs7O0FBRTNCLE1BR2Esb0JBQW9CO0lBRTdCLFlBQW9CLEtBQVcsRUFDWCxPQUFlLEVBQ0gsT0FBb0IsRUFDVyxRQUE4QjtRQUh6RSxVQUFLLEdBQUwsS0FBSyxDQUFNO1FBQ1gsWUFBTyxHQUFQLE9BQU8sQ0FBUTtRQUNILFlBQU8sR0FBUCxPQUFPLENBQWE7UUFDVyxhQUFRLEdBQVIsUUFBUSxDQUFzQjtJQUM3RixDQUFDO0lBRUQsV0FBVyxDQUFDLFFBQWdDLEVBQUUsS0FBMEI7UUFDcEUsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQ3ZCLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFDbkIsR0FBRyxDQUFDLGVBQWUsQ0FBQyxFQUFFO1lBQ2xCLElBQUksZUFBZSxFQUFFO2dCQUNqQixPQUFPLElBQUksQ0FBQzthQUNmO1lBRUQsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO2dCQUNmLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxxQkFBcUIsQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUM7YUFDL0Q7WUFFRCxrREFBa0Q7WUFDbEQsNERBQTREO1lBQzVELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLGVBQWUsSUFBSSxJQUFJLENBQUM7WUFDakUsSUFBSSxDQUFDLE9BQU8sRUFBRTtnQkFDVixPQUFPLEtBQUssQ0FBQzthQUNoQjtZQUVELE1BQU0sdUJBQXVCLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSx1QkFBdUIsSUFBSSxJQUFJLENBQUM7WUFDOUUsTUFBTSxXQUFXLEdBQUcsS0FBSyxFQUFFLEdBQUcsSUFBSSxJQUFJLENBQUM7WUFDdkMsTUFBTSxXQUFXLEdBQUcsdUJBQXVCLElBQUksV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFDLFdBQVcsRUFBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDaEYsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzlELE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFLEVBQUMsV0FBVyxFQUFDLENBQUMsQ0FBQztRQUMvRCxDQUFDLENBQUMsRUFDRixLQUFLLEVBQUUsQ0FDVixDQUFDO0lBQ04sQ0FBQztJQUVELGdCQUFnQixDQUFDLFVBQWtDLEVBQUUsS0FBMEI7UUFDM0UsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUMvQyxDQUFDOzhHQXZDUSxvQkFBb0Isc0dBS0cscUJBQXFCO2tIQUw1QyxvQkFBb0IsY0FGakIsTUFBTTs7U0FFVCxvQkFBb0I7MkZBQXBCLG9CQUFvQjtrQkFIaEMsVUFBVTttQkFBQztvQkFDUixVQUFVLEVBQUUsTUFBTTtpQkFDckI7OzBCQUtnQixRQUFROzswQkFDUixRQUFROzswQkFBSSxNQUFNOzJCQUFDLHFCQUFxQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7QWN0aXZhdGVkUm91dGVTbmFwc2hvdCwgQ2FuQWN0aXZhdGUsIENhbkFjdGl2YXRlQ2hpbGQsIFJvdXRlciwgUm91dGVyU3RhdGVTbmFwc2hvdH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7QVVUSF9SRURJUkVDVF9IQU5ETEVSLCBBdXRoQ29uZmlnLCBBdXRoUmVkaXJlY3RIYW5kbGVyfSBmcm9tICcuLi9pbnRlcmZhY2VzL2NvbmZpZy5pbnRlcmZhY2UnO1xuaW1wb3J0IHtJbmplY3QsIEluamVjdGFibGUsIE9wdGlvbmFsfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7QXV0aH0gZnJvbSAnLi4vYXV0aC5zZXJ2aWNlJztcbmltcG9ydCB7bWFwfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge2ZpcnN0fSBmcm9tICdyeGpzJztcblxuQEluamVjdGFibGUoe1xuICAgIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBCYkF1dGhlbnRpY2F0ZWRHdWFyZCBpbXBsZW1lbnRzIENhbkFjdGl2YXRlLCBDYW5BY3RpdmF0ZUNoaWxkIHtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgX2F1dGg6IEF1dGgsXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSBfcm91dGVyOiBSb3V0ZXIsXG4gICAgICAgICAgICAgICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBfY29uZmlnPzogQXV0aENvbmZpZyxcbiAgICAgICAgICAgICAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEFVVEhfUkVESVJFQ1RfSEFORExFUikgcHJpdmF0ZSBfaGFuZGxlcj86IEF1dGhSZWRpcmVjdEhhbmRsZXIpIHtcbiAgICB9XG5cbiAgICBjYW5BY3RpdmF0ZShzbmFwc2hvdDogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCwgc3RhdGU6IFJvdXRlclN0YXRlU25hcHNob3QpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2F1dGgudXNlci5waXBlKFxuICAgICAgICAgICAgbWFwKHVzZXIgPT4gISF1c2VyKSxcbiAgICAgICAgICAgIG1hcChpc0F1dGhlbnRpY2F0ZWQgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChpc0F1dGhlbnRpY2F0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2hhbmRsZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZXIub25GYWlsZWRBdXRoZW50aWNhdGVkKHNuYXBzaG90LCBzdGF0ZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhIFVSTCB0byBnbyB0byB3ZSBjYW4ganVzdCBzYXlcbiAgICAgICAgICAgICAgICAvLyB0aGUgdXNlciBpcyBub3QgYWxsb3dlZCBpbiB0aGlzIHJvdXRlIGJ5IHJldHVybmluZyBmYWxzZS5cbiAgICAgICAgICAgICAgICBjb25zdCBuZXh0VXJsID0gdGhpcy5fY29uZmlnPy5yZWRpcmVjdHM/LnVuYXV0aGVudGljYXRlZCA/PyBudWxsO1xuICAgICAgICAgICAgICAgIGlmICghbmV4dFVybCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3Qgc2V0UmVkaXJlY3RPbkZhaWxlZEF1dGggPSB0aGlzLl9jb25maWc/LnNldFJlZGlyZWN0T25GYWlsZWRBdXRoID8/IHRydWU7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVkaXJlY3RVcmwgPSBzdGF0ZT8udXJsID8/IG51bGw7XG4gICAgICAgICAgICAgICAgY29uc3QgcXVlcnlQYXJhbXMgPSBzZXRSZWRpcmVjdE9uRmFpbGVkQXV0aCAmJiByZWRpcmVjdFVybCA/IHtyZWRpcmVjdFVybH0gOiB7fTtcbiAgICAgICAgICAgICAgICBjb25zdCBjb21tYW5kcyA9IEFycmF5LmlzQXJyYXkobmV4dFVybCkgPyBuZXh0VXJsIDogW25leHRVcmxdO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9yb3V0ZXIuY3JlYXRlVXJsVHJlZShjb21tYW5kcywge3F1ZXJ5UGFyYW1zfSk7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIGZpcnN0KClcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBjYW5BY3RpdmF0ZUNoaWxkKGNoaWxkUm91dGU6IEFjdGl2YXRlZFJvdXRlU25hcHNob3QsIHN0YXRlOiBSb3V0ZXJTdGF0ZVNuYXBzaG90KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhbkFjdGl2YXRlKGNoaWxkUm91dGUsIHN0YXRlKTtcbiAgICB9XG5cbn1cbiJdfQ==
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { BbCollectionsData, BbCollectionsEmpty, BbCollectionsError, BbCollectionsInitial } from './components/collections.directive';
|
|
2
|
+
import { BbCollectionsViewer } from './components/collections-viewer/collections-viewer.component';
|
|
3
|
+
import { BbCollectionsPager } from './components/collections-pager/collections-pager.component';
|
|
4
|
+
import { CommonModule } from '@angular/common';
|
|
5
|
+
import { NgModule } from '@angular/core';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
class CollectionsModule {
|
|
8
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: CollectionsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
9
|
+
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.0.0", ngImport: i0, type: CollectionsModule, declarations: [
|
|
10
|
+
// Components.
|
|
11
|
+
BbCollectionsViewer,
|
|
12
|
+
BbCollectionsPager,
|
|
13
|
+
// Directives.
|
|
14
|
+
BbCollectionsData,
|
|
15
|
+
BbCollectionsEmpty,
|
|
16
|
+
BbCollectionsError,
|
|
17
|
+
BbCollectionsInitial], imports: [CommonModule], exports: [
|
|
18
|
+
// Components.
|
|
19
|
+
BbCollectionsViewer,
|
|
20
|
+
BbCollectionsPager,
|
|
21
|
+
// Directives.
|
|
22
|
+
BbCollectionsData,
|
|
23
|
+
BbCollectionsEmpty,
|
|
24
|
+
BbCollectionsError,
|
|
25
|
+
BbCollectionsInitial] }); }
|
|
26
|
+
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: CollectionsModule, imports: [CommonModule] }); }
|
|
27
|
+
}
|
|
28
|
+
export { CollectionsModule };
|
|
29
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: CollectionsModule, decorators: [{
|
|
30
|
+
type: NgModule,
|
|
31
|
+
args: [{
|
|
32
|
+
imports: [CommonModule],
|
|
33
|
+
declarations: [
|
|
34
|
+
// Components.
|
|
35
|
+
BbCollectionsViewer,
|
|
36
|
+
BbCollectionsPager,
|
|
37
|
+
// Directives.
|
|
38
|
+
BbCollectionsData,
|
|
39
|
+
BbCollectionsEmpty,
|
|
40
|
+
BbCollectionsError,
|
|
41
|
+
BbCollectionsInitial
|
|
42
|
+
],
|
|
43
|
+
exports: [
|
|
44
|
+
// Components.
|
|
45
|
+
BbCollectionsViewer,
|
|
46
|
+
BbCollectionsPager,
|
|
47
|
+
// Directives.
|
|
48
|
+
BbCollectionsData,
|
|
49
|
+
BbCollectionsEmpty,
|
|
50
|
+
BbCollectionsError,
|
|
51
|
+
BbCollectionsInitial
|
|
52
|
+
]
|
|
53
|
+
}]
|
|
54
|
+
}] });
|
|
55
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGVjdGlvbnMubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYmItZm91bmRhdGlvbi9jb2xsZWN0aW9ucy9zcmMvbGliL2NvbGxlY3Rpb25zLm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsaUJBQWlCLEVBQ2pCLGtCQUFrQixFQUNsQixrQkFBa0IsRUFDbEIsb0JBQW9CLEVBQ3ZCLE1BQU0sb0NBQW9DLENBQUM7QUFDNUMsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sOERBQThELENBQUM7QUFDakcsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sNERBQTRELENBQUM7QUFDOUYsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQzdDLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxlQUFlLENBQUM7O0FBRXZDLE1BdUJhLGlCQUFpQjs4R0FBakIsaUJBQWlCOytHQUFqQixpQkFBaUI7WUFwQnRCLGNBQWM7WUFDZCxtQkFBbUI7WUFDbkIsa0JBQWtCO1lBQ2xCLGNBQWM7WUFDZCxpQkFBaUI7WUFDakIsa0JBQWtCO1lBQ2xCLGtCQUFrQjtZQUNsQixvQkFBb0IsYUFUZCxZQUFZO1lBWWxCLGNBQWM7WUFDZCxtQkFBbUI7WUFDbkIsa0JBQWtCO1lBQ2xCLGNBQWM7WUFDZCxpQkFBaUI7WUFDakIsa0JBQWtCO1lBQ2xCLGtCQUFrQjtZQUNsQixvQkFBb0I7K0dBR2YsaUJBQWlCLFlBdEJoQixZQUFZOztTQXNCYixpQkFBaUI7MkZBQWpCLGlCQUFpQjtrQkF2QjdCLFFBQVE7bUJBQUM7b0JBQ04sT0FBTyxFQUFFLENBQUMsWUFBWSxDQUFDO29CQUN2QixZQUFZLEVBQUU7d0JBQ1YsY0FBYzt3QkFDZCxtQkFBbUI7d0JBQ25CLGtCQUFrQjt3QkFDbEIsY0FBYzt3QkFDZCxpQkFBaUI7d0JBQ2pCLGtCQUFrQjt3QkFDbEIsa0JBQWtCO3dCQUNsQixvQkFBb0I7cUJBQ3ZCO29CQUNELE9BQU8sRUFBRTt3QkFDTCxjQUFjO3dCQUNkLG1CQUFtQjt3QkFDbkIsa0JBQWtCO3dCQUNsQixjQUFjO3dCQUNkLGlCQUFpQjt3QkFDakIsa0JBQWtCO3dCQUNsQixrQkFBa0I7d0JBQ2xCLG9CQUFvQjtxQkFDdkI7aUJBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIEJiQ29sbGVjdGlvbnNEYXRhLFxuICAgIEJiQ29sbGVjdGlvbnNFbXB0eSxcbiAgICBCYkNvbGxlY3Rpb25zRXJyb3IsXG4gICAgQmJDb2xsZWN0aW9uc0luaXRpYWxcbn0gZnJvbSAnLi9jb21wb25lbnRzL2NvbGxlY3Rpb25zLmRpcmVjdGl2ZSc7XG5pbXBvcnQge0JiQ29sbGVjdGlvbnNWaWV3ZXJ9IGZyb20gJy4vY29tcG9uZW50cy9jb2xsZWN0aW9ucy12aWV3ZXIvY29sbGVjdGlvbnMtdmlld2VyLmNvbXBvbmVudCc7XG5pbXBvcnQge0JiQ29sbGVjdGlvbnNQYWdlcn0gZnJvbSAnLi9jb21wb25lbnRzL2NvbGxlY3Rpb25zLXBhZ2VyL2NvbGxlY3Rpb25zLXBhZ2VyLmNvbXBvbmVudCc7XG5pbXBvcnQge0NvbW1vbk1vZHVsZX0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7TmdNb2R1bGV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5ATmdNb2R1bGUoe1xuICAgIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICAgIGRlY2xhcmF0aW9uczogW1xuICAgICAgICAvLyBDb21wb25lbnRzLlxuICAgICAgICBCYkNvbGxlY3Rpb25zVmlld2VyLFxuICAgICAgICBCYkNvbGxlY3Rpb25zUGFnZXIsXG4gICAgICAgIC8vIERpcmVjdGl2ZXMuXG4gICAgICAgIEJiQ29sbGVjdGlvbnNEYXRhLFxuICAgICAgICBCYkNvbGxlY3Rpb25zRW1wdHksXG4gICAgICAgIEJiQ29sbGVjdGlvbnNFcnJvcixcbiAgICAgICAgQmJDb2xsZWN0aW9uc0luaXRpYWxcbiAgICBdLFxuICAgIGV4cG9ydHM6IFtcbiAgICAgICAgLy8gQ29tcG9uZW50cy5cbiAgICAgICAgQmJDb2xsZWN0aW9uc1ZpZXdlcixcbiAgICAgICAgQmJDb2xsZWN0aW9uc1BhZ2VyLFxuICAgICAgICAvLyBEaXJlY3RpdmVzLlxuICAgICAgICBCYkNvbGxlY3Rpb25zRGF0YSxcbiAgICAgICAgQmJDb2xsZWN0aW9uc0VtcHR5LFxuICAgICAgICBCYkNvbGxlY3Rpb25zRXJyb3IsXG4gICAgICAgIEJiQ29sbGVjdGlvbnNJbml0aWFsXG4gICAgXVxufSlcbmV4cG9ydCBjbGFzcyBDb2xsZWN0aW9uc01vZHVsZSB7XG59XG4iXX0=
|