@thetradeengineorg1/snova-shell-module 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -0
- package/bundles/thetradeengineorg1-snova-shell-module.umd.js +13896 -0
- package/bundles/thetradeengineorg1-snova-shell-module.umd.js.map +1 -0
- package/esm2015/lib/globaldependencies/components/componentbase.js +538 -0
- package/esm2015/lib/globaldependencies/constants/feature-ids.js +449 -0
- package/esm2015/lib/globaldependencies/constants/localstorage-properties.js +38 -0
- package/esm2015/lib/globaldependencies/helpers/dom.helper.js +70 -0
- package/esm2015/lib/globaldependencies/helpers/fontawesome-icons.js +144 -0
- package/esm2015/lib/globaldependencies/helpers/moment-utc-date-adapter.js +37 -0
- package/esm2015/lib/globaldependencies/helpers/window.helper.js +32 -0
- package/esm2015/lib/globaldependencies/intercepter/jwt.interceptor.js +40 -0
- package/esm2015/lib/globaldependencies/pipes/fetchSizedAndCachedImage.pipe.js +36 -0
- package/esm2015/lib/globaldependencies/pipes/highLightText.pipe.js +24 -0
- package/esm2015/lib/globaldependencies/pipes/orderby-pipe.js +24 -0
- package/esm2015/lib/globaldependencies/pipes/removeSpecialCharacters.pipe.js +22 -0
- package/esm2015/lib/globaldependencies/pipes/sanitize.pipe.js +24 -0
- package/esm2015/lib/globaldependencies/pipes/softlabels.pipes.js +346 -0
- package/esm2015/lib/globaldependencies/pipes/utctolocaltime.pipe.js +23 -0
- package/esm2015/lib/globaldependencies/pipes/utctolocaltimewithdate.pipe.js +25 -0
- package/esm2015/lib/globaldependencies/pipes/workflowstatus.pipes.js +27 -0
- package/esm2015/lib/shell-components/components/Payments/account.component.js +50 -0
- package/esm2015/lib/shell-components/components/Payments/company-information.js +262 -0
- package/esm2015/lib/shell-components/components/Payments/company-plans.component.js +138 -0
- package/esm2015/lib/shell-components/components/Payments/document.component.js +57 -0
- package/esm2015/lib/shell-components/components/Payments/payment-method.component.js +32 -0
- package/esm2015/lib/shell-components/components/Payments/product-service.component.js +143 -0
- package/esm2015/lib/shell-components/components/Payments/purchase-more-licenses.js +152 -0
- package/esm2015/lib/shell-components/components/Payments/transactions.component.js +60 -0
- package/esm2015/lib/shell-components/components/admin-layout/admin-layout.component.js +250 -0
- package/esm2015/lib/shell-components/components/all-work-items-dialog/all-work-items-dialog.component.js +89 -0
- package/esm2015/lib/shell-components/components/confirmation-dialog/confirmation-dialog.component.js +90 -0
- package/esm2015/lib/shell-components/components/export-import-configuration/export-configuration.component.js +357 -0
- package/esm2015/lib/shell-components/components/feed-time/feed-time-dialog.component.js +85 -0
- package/esm2015/lib/shell-components/components/feed-time/feed-time.component.js +83 -0
- package/esm2015/lib/shell-components/components/header-side/header-side.component.js +1642 -0
- package/esm2015/lib/shell-components/components/header-top/header-top.component.js +93 -0
- package/esm2015/lib/shell-components/components/lives/lives-welcome-page.js +26 -0
- package/esm2015/lib/shell-components/components/menu/menu.component.js +2478 -0
- package/esm2015/lib/shell-components/components/menu/searchTask.enum.js +10 -0
- package/esm2015/lib/shell-components/components/notifications/announcement-dialog.component.js +73 -0
- package/esm2015/lib/shell-components/components/notifications/notifications.component.js +449 -0
- package/esm2015/lib/shell-components/components/sidebar-top/sidebar-top.component.js +33 -0
- package/esm2015/lib/shell-components/components/sidenav/side-bar.component.js +81 -0
- package/esm2015/lib/shell-components/components/sidenav/sidenav.component.js +43 -0
- package/esm2015/lib/shell-components/components/submit-feedback/submit-feedback.component.js +71 -0
- package/esm2015/lib/shell-components/constants/api-urls.js +1052 -0
- package/esm2015/lib/shell-components/constants/available-languages.js +25 -0
- package/esm2015/lib/shell-components/constants/channel-names.js +38 -0
- package/esm2015/lib/shell-components/constants/menu-categories.js +6 -0
- package/esm2015/lib/shell-components/constants/notification-routes.js +6 -0
- package/esm2015/lib/shell-components/constants/notification-type-ids.js +42 -0
- package/esm2015/lib/shell-components/enum/recentSearchType.enum.js +13 -0
- package/esm2015/lib/shell-components/models/AppMenuItemModel.js +3 -0
- package/esm2015/lib/shell-components/models/AppNotification.js +17 -0
- package/esm2015/lib/shell-components/models/AssetAssignedNotificationModel.js +12 -0
- package/esm2015/lib/shell-components/models/ChannelUpdateModel.js +3 -0
- package/esm2015/lib/shell-components/models/EmployeeStatusModel.js +3 -0
- package/esm2015/lib/shell-components/models/IAdjust-screen-options.js +2 -0
- package/esm2015/lib/shell-components/models/IBadge.js +2 -0
- package/esm2015/lib/shell-components/models/IChildItem.js +2 -0
- package/esm2015/lib/shell-components/models/ILayout-change-options.js +2 -0
- package/esm2015/lib/shell-components/models/IMenuItem.js +2 -0
- package/esm2015/lib/shell-components/models/IlayoutConf.js +2 -0
- package/esm2015/lib/shell-components/models/IntroModel.js +3 -0
- package/esm2015/lib/shell-components/models/MessageDetails.js +3 -0
- package/esm2015/lib/shell-components/models/MessageTypingDetails.js +3 -0
- package/esm2015/lib/shell-components/models/NewProjectCreatedNotificationModel.js +10 -0
- package/esm2015/lib/shell-components/models/NewProjectFeatureNotificationModel.js +10 -0
- package/esm2015/lib/shell-components/models/NotificationsOutPutModel.js +22 -0
- package/esm2015/lib/shell-components/models/ProjectSearchCriteriaInputModel.js +3 -0
- package/esm2015/lib/shell-components/models/RecentSearchModel.js +5 -0
- package/esm2015/lib/shell-components/models/ReportConfigAssignedNotification.js +11 -0
- package/esm2015/lib/shell-components/models/ReportSubmittedNotification.js +12 -0
- package/esm2015/lib/shell-components/models/RoleUpdatedNotification.js +9 -0
- package/esm2015/lib/shell-components/models/UserStoryAssignedNotification.js +13 -0
- package/esm2015/lib/shell-components/models/archiveUserStoryModel.js +10 -0
- package/esm2015/lib/shell-components/models/companieslist.model.js +3 -0
- package/esm2015/lib/shell-components/models/company-model.js +7 -0
- package/esm2015/lib/shell-components/models/company-payment-model.js +3 -0
- package/esm2015/lib/shell-components/models/dragedWidget.js +3 -0
- package/esm2015/lib/shell-components/models/employee-List.js +3 -0
- package/esm2015/lib/shell-components/models/employee.js +4 -0
- package/esm2015/lib/shell-components/models/entityRoleFeature.js +3 -0
- package/esm2015/lib/shell-components/models/export-configuration-model.js +3 -0
- package/esm2015/lib/shell-components/models/export-data.module.js +8 -0
- package/esm2015/lib/shell-components/models/goalApprovedNotificationModel.js +9 -0
- package/esm2015/lib/shell-components/models/import-configuration-model.js +3 -0
- package/esm2015/lib/shell-components/models/initialStatusofUsers.js +3 -0
- package/esm2015/lib/shell-components/models/invoiceOutput-model.js +3 -0
- package/esm2015/lib/shell-components/models/leaveApplicationNotifiction.js +9 -0
- package/esm2015/lib/shell-components/models/multiChartsScheduling.js +11 -0
- package/esm2015/lib/shell-components/models/parkUserStoryInputModel.js +10 -0
- package/esm2015/lib/shell-components/models/project.js +3 -0
- package/esm2015/lib/shell-components/models/recentSearchApiModel.js +3 -0
- package/esm2015/lib/shell-components/models/searchCriteriaInputModelBase.js +3 -0
- package/esm2015/lib/shell-components/models/shellModulesInfo.js +7 -0
- package/esm2015/lib/shell-components/models/softlabels-model.js +7 -0
- package/esm2015/lib/shell-components/models/sprintReplanRequestedModel.js +9 -0
- package/esm2015/lib/shell-components/models/sprintStartedNotificationModel.js +9 -0
- package/esm2015/lib/shell-components/models/store-model.js +3 -0
- package/esm2015/lib/shell-components/models/store-search-model.js +4 -0
- package/esm2015/lib/shell-components/models/themes.model.js +3 -0
- package/esm2015/lib/shell-components/models/timesheetenabledisable.js +4 -0
- package/esm2015/lib/shell-components/models/user.js +8 -0
- package/esm2015/lib/shell-components/models/userStory.js +3 -0
- package/esm2015/lib/shell-components/models/userStoryCommentNotificationModel.js +9 -0
- package/esm2015/lib/shell-components/models/userStoryUpdateNotificationModel.js +9 -0
- package/esm2015/lib/shell-components/models/userstory-custom-fields.model.js +3 -0
- package/esm2015/lib/shell-components/models/validation.model.js +2 -0
- package/esm2015/lib/shell-components/models/widgetlist.js +6 -0
- package/esm2015/lib/shell-components/models/workspaceList.js +3 -0
- package/esm2015/lib/shell-components/services/authentication.service.js +96 -0
- package/esm2015/lib/shell-components/services/chat.service.js +67 -0
- package/esm2015/lib/shell-components/services/common-used.service.js +263 -0
- package/esm2015/lib/shell-components/services/feature.service.js +101 -0
- package/esm2015/lib/shell-components/services/google-analytics.service.js +24 -0
- package/esm2015/lib/shell-components/services/layout.service.js +68 -0
- package/esm2015/lib/shell-components/services/payment.service.js +103 -0
- package/esm2015/lib/shell-components/services/recentSearch.service.js +90 -0
- package/esm2015/lib/shell-components/services/shell.modules.service.js +24 -0
- package/esm2015/lib/shell-components/services/signalr.service.js +113 -0
- package/esm2015/lib/shell-components/services/theme.service.js +161 -0
- package/esm2015/lib/shell-components/shell.module.js +436 -0
- package/esm2015/lib/shell-components/shell.routing.js +16 -0
- package/esm2015/lib/shell-components/store/actions/authentication.actions.js +260 -0
- package/esm2015/lib/shell-components/store/actions/chat.actions.js +248 -0
- package/esm2015/lib/shell-components/store/actions/menuitems.actions.js +39 -0
- package/esm2015/lib/shell-components/store/actions/notification-validator.action.js +19 -0
- package/esm2015/lib/shell-components/store/actions/notifications.actions.js +74 -0
- package/esm2015/lib/shell-components/store/effects/authentication.effects.js +503 -0
- package/esm2015/lib/shell-components/store/effects/chat.effects.js +139 -0
- package/esm2015/lib/shell-components/store/effects/index.js +13 -0
- package/esm2015/lib/shell-components/store/effects/menuitems.effects.js +53 -0
- package/esm2015/lib/shell-components/store/effects/notification-validator.effects.js +56 -0
- package/esm2015/lib/shell-components/store/effects/notifications.effects.js +116 -0
- package/esm2015/lib/shell-components/store/reducers/authentication.reducers.js +86 -0
- package/esm2015/lib/shell-components/store/reducers/chat.reducers.js +68 -0
- package/esm2015/lib/shell-components/store/reducers/index.js +80 -0
- package/esm2015/lib/shell-components/store/reducers/menuitems.reducers.js +56 -0
- package/esm2015/lib/shell-components/store/reducers/notification-validator.reducers.js +13 -0
- package/esm2015/lib/shell-components/store/reducers/notifications.reducers.js +38 -0
- package/esm2015/public-api.js +90 -0
- package/esm2015/store/reducers/index.js +47 -0
- package/esm2015/thetradeengineorg1-snova-shell-module.js +5 -0
- package/fesm2015/thetradeengineorg1-snova-shell-module.js +12808 -0
- package/fesm2015/thetradeengineorg1-snova-shell-module.js.map +1 -0
- package/lib/globaldependencies/components/componentbase.d.ts +455 -0
- package/lib/globaldependencies/constants/feature-ids.d.ts +448 -0
- package/lib/globaldependencies/constants/localstorage-properties.d.ts +37 -0
- package/lib/globaldependencies/helpers/dom.helper.d.ts +7 -0
- package/lib/globaldependencies/helpers/fontawesome-icons.d.ts +1 -0
- package/lib/globaldependencies/helpers/moment-utc-date-adapter.d.ts +9 -0
- package/lib/globaldependencies/helpers/window.helper.d.ts +12 -0
- package/lib/globaldependencies/intercepter/jwt.interceptor.d.ts +11 -0
- package/lib/globaldependencies/pipes/fetchSizedAndCachedImage.pipe.d.ts +8 -0
- package/lib/globaldependencies/pipes/highLightText.pipe.d.ts +8 -0
- package/lib/globaldependencies/pipes/orderby-pipe.d.ts +9 -0
- package/lib/globaldependencies/pipes/removeSpecialCharacters.pipe.d.ts +8 -0
- package/lib/globaldependencies/pipes/sanitize.pipe.d.ts +11 -0
- package/lib/globaldependencies/pipes/softlabels.pipes.d.ts +8 -0
- package/lib/globaldependencies/pipes/utctolocaltime.pipe.d.ts +8 -0
- package/lib/globaldependencies/pipes/utctolocaltimewithdate.pipe.d.ts +8 -0
- package/lib/globaldependencies/pipes/workflowstatus.pipes.d.ts +8 -0
- package/lib/shell-components/components/Payments/account.component.d.ts +14 -0
- package/lib/shell-components/components/Payments/company-information.d.ts +62 -0
- package/lib/shell-components/components/Payments/company-plans.component.d.ts +47 -0
- package/lib/shell-components/components/Payments/document.component.d.ts +20 -0
- package/lib/shell-components/components/Payments/payment-method.component.d.ts +15 -0
- package/lib/shell-components/components/Payments/product-service.component.d.ts +48 -0
- package/lib/shell-components/components/Payments/purchase-more-licenses.d.ts +37 -0
- package/lib/shell-components/components/Payments/transactions.component.d.ts +28 -0
- package/lib/shell-components/components/admin-layout/admin-layout.component.d.ts +67 -0
- package/lib/shell-components/components/all-work-items-dialog/all-work-items-dialog.component.d.ts +32 -0
- package/lib/shell-components/components/confirmation-dialog/confirmation-dialog.component.d.ts +32 -0
- package/lib/shell-components/components/export-import-configuration/export-configuration.component.d.ts +60 -0
- package/lib/shell-components/components/feed-time/feed-time-dialog.component.d.ts +33 -0
- package/lib/shell-components/components/feed-time/feed-time.component.d.ts +27 -0
- package/lib/shell-components/components/header-side/header-side.component.d.ts +216 -0
- package/lib/shell-components/components/header-top/header-top.component.d.ts +40 -0
- package/lib/shell-components/components/lives/lives-welcome-page.d.ts +14 -0
- package/lib/shell-components/components/menu/menu.component.d.ts +220 -0
- package/lib/shell-components/components/menu/searchTask.enum.d.ts +8 -0
- package/lib/shell-components/components/notifications/announcement-dialog.component.d.ts +27 -0
- package/lib/shell-components/components/notifications/notifications.component.d.ts +53 -0
- package/lib/shell-components/components/sidebar-top/sidebar-top.component.d.ts +10 -0
- package/lib/shell-components/components/sidenav/side-bar.component.d.ts +23 -0
- package/lib/shell-components/components/sidenav/sidenav.component.d.ts +17 -0
- package/lib/shell-components/components/submit-feedback/submit-feedback.component.d.ts +25 -0
- package/lib/shell-components/constants/api-urls.d.ts +1051 -0
- package/lib/shell-components/constants/available-languages.d.ts +7 -0
- package/lib/shell-components/constants/channel-names.d.ts +37 -0
- package/lib/shell-components/constants/menu-categories.d.ts +5 -0
- package/lib/shell-components/constants/notification-routes.d.ts +5 -0
- package/lib/shell-components/constants/notification-type-ids.d.ts +41 -0
- package/lib/shell-components/enum/recentSearchType.enum.d.ts +11 -0
- package/lib/shell-components/models/AppMenuItemModel.d.ts +12 -0
- package/lib/shell-components/models/AppNotification.d.ts +12 -0
- package/lib/shell-components/models/AssetAssignedNotificationModel.d.ts +10 -0
- package/lib/shell-components/models/ChannelUpdateModel.d.ts +47 -0
- package/lib/shell-components/models/EmployeeStatusModel.d.ts +11 -0
- package/lib/shell-components/models/IAdjust-screen-options.d.ts +4 -0
- package/lib/shell-components/models/IBadge.d.ts +4 -0
- package/lib/shell-components/models/IChildItem.d.ts +7 -0
- package/lib/shell-components/models/ILayout-change-options.d.ts +4 -0
- package/lib/shell-components/models/IMenuItem.d.ts +14 -0
- package/lib/shell-components/models/IlayoutConf.d.ts +10 -0
- package/lib/shell-components/models/IntroModel.d.ts +3 -0
- package/lib/shell-components/models/MessageDetails.d.ts +55 -0
- package/lib/shell-components/models/MessageTypingDetails.d.ts +9 -0
- package/lib/shell-components/models/NewProjectCreatedNotificationModel.d.ts +8 -0
- package/lib/shell-components/models/NewProjectFeatureNotificationModel.d.ts +8 -0
- package/lib/shell-components/models/NotificationsOutPutModel.d.ts +41 -0
- package/lib/shell-components/models/ProjectSearchCriteriaInputModel.d.ts +10 -0
- package/lib/shell-components/models/RecentSearchModel.d.ts +14 -0
- package/lib/shell-components/models/ReportConfigAssignedNotification.d.ts +9 -0
- package/lib/shell-components/models/ReportSubmittedNotification.d.ts +10 -0
- package/lib/shell-components/models/RoleUpdatedNotification.d.ts +7 -0
- package/lib/shell-components/models/UserStoryAssignedNotification.d.ts +8 -0
- package/lib/shell-components/models/archiveUserStoryModel.d.ts +7 -0
- package/lib/shell-components/models/companieslist.model.d.ts +8 -0
- package/lib/shell-components/models/company-model.d.ts +31 -0
- package/lib/shell-components/models/company-payment-model.d.ts +18 -0
- package/lib/shell-components/models/dragedWidget.d.ts +16 -0
- package/lib/shell-components/models/employee-List.d.ts +8 -0
- package/lib/shell-components/models/employee.d.ts +60 -0
- package/lib/shell-components/models/entityRoleFeature.d.ts +9 -0
- package/lib/shell-components/models/export-configuration-model.d.ts +8 -0
- package/lib/shell-components/models/export-data.module.d.ts +6 -0
- package/lib/shell-components/models/goalApprovedNotificationModel.d.ts +8 -0
- package/lib/shell-components/models/import-configuration-model.d.ts +3 -0
- package/lib/shell-components/models/initialStatusofUsers.d.ts +5 -0
- package/lib/shell-components/models/invoiceOutput-model.d.ts +9 -0
- package/lib/shell-components/models/leaveApplicationNotifiction.d.ts +7 -0
- package/lib/shell-components/models/multiChartsScheduling.d.ts +9 -0
- package/lib/shell-components/models/parkUserStoryInputModel.d.ts +7 -0
- package/lib/shell-components/models/project.d.ts +28 -0
- package/lib/shell-components/models/recentSearchApiModel.d.ts +6 -0
- package/lib/shell-components/models/searchCriteriaInputModelBase.d.ts +10 -0
- package/lib/shell-components/models/shellModulesInfo.d.ts +16 -0
- package/lib/shell-components/models/softlabels-model.d.ts +66 -0
- package/lib/shell-components/models/sprintReplanRequestedModel.d.ts +7 -0
- package/lib/shell-components/models/sprintStartedNotificationModel.d.ts +7 -0
- package/lib/shell-components/models/store-model.d.ts +13 -0
- package/lib/shell-components/models/store-search-model.d.ts +7 -0
- package/lib/shell-components/models/themes.model.d.ts +9 -0
- package/lib/shell-components/models/timesheetenabledisable.d.ts +16 -0
- package/lib/shell-components/models/user.d.ts +40 -0
- package/lib/shell-components/models/userStory.d.ts +188 -0
- package/lib/shell-components/models/userStoryCommentNotificationModel.d.ts +6 -0
- package/lib/shell-components/models/userStoryUpdateNotificationModel.d.ts +6 -0
- package/lib/shell-components/models/userstory-custom-fields.model.d.ts +6 -0
- package/lib/shell-components/models/validation.model.d.ts +5 -0
- package/lib/shell-components/models/widgetlist.d.ts +28 -0
- package/lib/shell-components/models/workspaceList.d.ts +19 -0
- package/lib/shell-components/services/authentication.service.d.ts +18 -0
- package/lib/shell-components/services/chat.service.d.ts +16 -0
- package/lib/shell-components/services/common-used.service.d.ts +45 -0
- package/lib/shell-components/services/feature.service.d.ts +19 -0
- package/lib/shell-components/services/google-analytics.service.d.ts +9 -0
- package/lib/shell-components/services/layout.service.d.ts +23 -0
- package/lib/shell-components/services/payment.service.d.ts +19 -0
- package/lib/shell-components/services/recentSearch.service.d.ts +16 -0
- package/lib/shell-components/services/shell.modules.service.d.ts +9 -0
- package/lib/shell-components/services/signalr.service.d.ts +25 -0
- package/lib/shell-components/services/theme.service.d.ts +14 -0
- package/lib/shell-components/shell.module.d.ts +117 -0
- package/lib/shell-components/shell.routing.d.ts +2 -0
- package/lib/shell-components/store/actions/authentication.actions.d.ts +327 -0
- package/lib/shell-components/store/actions/chat.actions.d.ts +399 -0
- package/lib/shell-components/store/actions/menuitems.actions.d.ts +51 -0
- package/lib/shell-components/store/actions/notification-validator.action.d.ts +25 -0
- package/lib/shell-components/store/actions/notifications.actions.d.ts +116 -0
- package/lib/shell-components/store/effects/authentication.effects.d.ts +54 -0
- package/lib/shell-components/store/effects/chat.effects.d.ts +30 -0
- package/lib/shell-components/store/effects/index.d.ts +1 -0
- package/lib/shell-components/store/effects/menuitems.effects.d.ts +17 -0
- package/lib/shell-components/store/effects/notification-validator.effects.d.ts +21 -0
- package/lib/shell-components/store/effects/notifications.effects.d.ts +23 -0
- package/lib/shell-components/store/reducers/authentication.reducers.d.ts +30 -0
- package/lib/shell-components/store/reducers/chat.reducers.d.ts +17 -0
- package/lib/shell-components/store/reducers/index.d.ts +59 -0
- package/lib/shell-components/store/reducers/menuitems.reducers.d.ts +11 -0
- package/lib/shell-components/store/reducers/notification-validator.reducers.d.ts +5 -0
- package/lib/shell-components/store/reducers/notifications.reducers.d.ts +10 -0
- package/package.json +22 -0
- package/public-api.d.ts +80 -0
- package/store/reducers/index.d.ts +24 -0
- package/thetradeengineorg1-snova-shell-module.d.ts +5 -0
|
@@ -0,0 +1,503 @@
|
|
|
1
|
+
import { __decorate } from "tslib";
|
|
2
|
+
import { Inject, Injectable } from "@angular/core";
|
|
3
|
+
import { Effect, ofType } from "@ngrx/effects";
|
|
4
|
+
import { of, pipe } from "rxjs";
|
|
5
|
+
import { catchError, map, switchMap, tap } from "rxjs/operators";
|
|
6
|
+
import { AuthenticationActionTypes, CompanyWorkItemStartFunctionalityRequiredSuccess, AuthenticationFailed, ClearDemoDataCompleted, ClearDemoDataFailed, EntityReolesByUserIdFetchCompleted, EntityRoleDetailsFetched, EntityRolesByUserIdFetchFailed, EntityRolesByUserIdFetchTriggered, GetCompanyThemeCompleted, GetCompanyThemeFailed, InitializeAfterLoginData, RoleDetailsFetched, RolesFetchFailed, UserDetailsFetched, GetUserStoreIdCompleted, GetUserStoreIdFailed, ExceptionHandled, GetCompanySettingsTriggered, GetCompanySettingsCompleted, GetCompanySettingsFailed, UserDetailsFetchedAfterLogin, UserInitialDetailsFetchedCompleted } from "../actions/authentication.actions";
|
|
7
|
+
import { ShowExceptionMessages, ShowValidationMessages } from "../actions/notification-validator.action";
|
|
8
|
+
import { WINDOW } from '../../../globaldependencies/helpers/window.helper';
|
|
9
|
+
import { LocalStorageProperties } from '../../../globaldependencies/constants/localstorage-properties';
|
|
10
|
+
import { CompanysettingsModel } from '../../models/company-model';
|
|
11
|
+
import * as i0 from "@angular/core";
|
|
12
|
+
import * as i1 from "@ngrx/effects";
|
|
13
|
+
import * as i2 from "../../services/authentication.service";
|
|
14
|
+
import * as i3 from "../../services/common-used.service";
|
|
15
|
+
import * as i4 from "../../services/feature.service";
|
|
16
|
+
import * as i5 from "ngx-cookie-service";
|
|
17
|
+
import * as i6 from "ngx-toastr";
|
|
18
|
+
/** @dynamic */
|
|
19
|
+
export class AuthenticationEffects {
|
|
20
|
+
constructor(actions$, authenticationService, userService, commonService, featureService, cookieService, toastr, window) {
|
|
21
|
+
this.actions$ = actions$;
|
|
22
|
+
this.authenticationService = authenticationService;
|
|
23
|
+
this.userService = userService;
|
|
24
|
+
this.commonService = commonService;
|
|
25
|
+
this.featureService = featureService;
|
|
26
|
+
this.cookieService = cookieService;
|
|
27
|
+
this.toastr = toastr;
|
|
28
|
+
this.window = window;
|
|
29
|
+
this.authenticate$ = this.actions$.pipe(ofType(AuthenticationActionTypes.AuthenticateUser), switchMap((action) => {
|
|
30
|
+
return this.authenticationService
|
|
31
|
+
.login(action.userName, action.password)
|
|
32
|
+
.pipe(map((userToken) => {
|
|
33
|
+
this.logInData = userToken.data;
|
|
34
|
+
console.log(this.window.location.hostname);
|
|
35
|
+
let environment = JSON.parse(localStorage.getItem(LocalStorageProperties.Environment));
|
|
36
|
+
this.cookieService.set(LocalStorageProperties.CurrentUser, userToken.data.authToken, null, environment.cookiePath, this.window.location.hostname, false, "Strict");
|
|
37
|
+
// this.cookieService.set(LocalStorageProperties.DefaultDashboard, JSON.stringify(userToken.data.defaultDashboardId), null, environment.cookiePath, this.window.location.hostname, false, "Strict");
|
|
38
|
+
this.cookieService.set(LocalStorageProperties.CompanyDetails, JSON.stringify(userToken.data.companyDetails), null, environment.cookiePath, this.window.location.hostname, false, "Strict");
|
|
39
|
+
localStorage.setItem(LocalStorageProperties.RoleFeatures, JSON.stringify(userToken.data.roleFeatures));
|
|
40
|
+
localStorage.setItem(LocalStorageProperties.SoftLabels, JSON.stringify(userToken.data.softLabels));
|
|
41
|
+
this.cookieService.set(LocalStorageProperties.FromLogIn, JSON.stringify(true), null, environment.cookiePath, this.window.location.hostname, false, "Strict");
|
|
42
|
+
// return new Authenticated(
|
|
43
|
+
// action.userName,
|
|
44
|
+
// JSON.stringify(userToken.data.authToken)
|
|
45
|
+
// );
|
|
46
|
+
this.cookieService.set(LocalStorageProperties.CurrentUserId, userToken.data.usersModel.id, null, environment.cookiePath, this.window.location.hostname, false, "Strict");
|
|
47
|
+
this.cookieService.set(LocalStorageProperties.CompanyName, userToken.data.usersModel.companyName, null, environment.cookiePath, this.window.location.hostname, false, "Strict");
|
|
48
|
+
this.cookieService.set(LocalStorageProperties.CompanyId, userToken.data.usersModel.companyId, null, environment.cookiePath, this.window.location.hostname, false, "Strict");
|
|
49
|
+
return new UserDetailsFetched(userToken.data.usersModel);
|
|
50
|
+
}), catchError((error) => of(new AuthenticationFailed(error))));
|
|
51
|
+
}));
|
|
52
|
+
this.authenticateNewUser$ = this.actions$.pipe(ofType(AuthenticationActionTypes.AuthenticateNewUser), switchMap((action) => {
|
|
53
|
+
return this.authenticationService
|
|
54
|
+
.loginNewUser(action.userName)
|
|
55
|
+
.pipe(map((userToken) => {
|
|
56
|
+
this.logInData = userToken.data;
|
|
57
|
+
console.log(this.window.location.hostname);
|
|
58
|
+
let environment = JSON.parse(localStorage.getItem(LocalStorageProperties.Environment));
|
|
59
|
+
this.cookieService.set(LocalStorageProperties.CurrentUser, userToken.data.authToken, null, environment.cookiePath, this.window.location.hostname, false, "Strict");
|
|
60
|
+
this.cookieService.set(LocalStorageProperties.DefaultDashboard, JSON.stringify(userToken.data.defaultDashboardId), null, environment.cookiePath, this.window.location.hostname, false, "Strict");
|
|
61
|
+
this.cookieService.set(LocalStorageProperties.CompanyDetails, JSON.stringify(userToken.data.companyDetails), null, environment.cookiePath, this.window.location.hostname, false, "Strict");
|
|
62
|
+
localStorage.setItem(LocalStorageProperties.RoleFeatures, JSON.stringify(userToken.data.roleFeatures));
|
|
63
|
+
localStorage.setItem(LocalStorageProperties.SoftLabels, JSON.stringify(userToken.data.softLabels));
|
|
64
|
+
this.cookieService.set(LocalStorageProperties.FromLogIn, JSON.stringify(true), null, environment.cookiePath, this.window.location.hostname, false, "Strict");
|
|
65
|
+
// return new Authenticated(
|
|
66
|
+
// action.userName,
|
|
67
|
+
// JSON.stringify(userToken.data.authToken)
|
|
68
|
+
// );
|
|
69
|
+
this.cookieService.set(LocalStorageProperties.CurrentUserId, userToken.data.usersModel.id, null, environment.cookiePath, this.window.location.hostname, false, "Strict");
|
|
70
|
+
this.cookieService.set(LocalStorageProperties.CompanyName, userToken.data.usersModel.companyName, null, environment.cookiePath, this.window.location.hostname, false, "Strict");
|
|
71
|
+
this.cookieService.set(LocalStorageProperties.CompanyId, userToken.data.usersModel.companyId, null, environment.cookiePath, this.window.location.hostname, false, "Strict");
|
|
72
|
+
return new UserDetailsFetched(userToken.data.usersModel);
|
|
73
|
+
}), catchError((error) => of(new AuthenticationFailed(error))));
|
|
74
|
+
}));
|
|
75
|
+
this.authenticated$ = this.actions$.pipe(ofType(AuthenticationActionTypes.Authenticated), switchMap((action) => {
|
|
76
|
+
return this.userService.getLoggedInUser().pipe(map((userRecord) => {
|
|
77
|
+
console.log(this.window.location.hostname);
|
|
78
|
+
let environment = JSON.parse(localStorage.getItem(LocalStorageProperties.Environment));
|
|
79
|
+
this.cookieService.set(LocalStorageProperties.CurrentUserId, userRecord.data.id, null, environment.cookiePath, this.window.location.hostname, false, "Strict");
|
|
80
|
+
this.cookieService.set(LocalStorageProperties.CompanyName, userRecord.data.companyName, null, environment.cookiePath, this.window.location.hostname, false, "Strict");
|
|
81
|
+
this.cookieService.set(LocalStorageProperties.CompanyId, userRecord.data.companyId, null, environment.cookiePath, this.window.location.hostname, false, "Strict");
|
|
82
|
+
return new UserDetailsFetched(userRecord.data);
|
|
83
|
+
}));
|
|
84
|
+
}));
|
|
85
|
+
this.companyWorkItemStartFunctionalityRequired$ = this.actions$.pipe(ofType(AuthenticationActionTypes.CompanyWorkItemStartFunctionalityRequired), switchMap((action) => {
|
|
86
|
+
return this.userService.getCompanyWorkItemStartFunctionalityRequired().pipe(map((record) => {
|
|
87
|
+
console.log(this.window.location.hostname);
|
|
88
|
+
return new CompanyWorkItemStartFunctionalityRequiredSuccess(record.data);
|
|
89
|
+
}));
|
|
90
|
+
}));
|
|
91
|
+
// @Effect()
|
|
92
|
+
// UserDetailsFetching$: Observable<Action> = this.actions$.pipe(
|
|
93
|
+
// ofType<UserDetailsFetching>(AuthenticationActionTypes.UserDetailsFetching),
|
|
94
|
+
// pipe(
|
|
95
|
+
// map((action: any) => {
|
|
96
|
+
// //var configurations = new SoftLabelConfigurationModel();
|
|
97
|
+
// //return new GetsoftLabelsTriggered(configurations);
|
|
98
|
+
// return new UserDetailsFetched(action.loginData.UsersModel);
|
|
99
|
+
// })
|
|
100
|
+
// )
|
|
101
|
+
// );
|
|
102
|
+
this.authenticateSignedOff$ = this.actions$.pipe(ofType(AuthenticationActionTypes.SignedOff), tap((action) => {
|
|
103
|
+
this.cookieService.delete(LocalStorageProperties.CurrentUser);
|
|
104
|
+
}));
|
|
105
|
+
this.initializeRolesAfterLoginData$ = this.actions$.pipe(ofType(AuthenticationActionTypes.UserDetailsFetched), pipe(map(() => {
|
|
106
|
+
var roles = JSON.parse(localStorage.getItem(LocalStorageProperties.RoleFeatures));
|
|
107
|
+
return new RoleDetailsFetched(roles);
|
|
108
|
+
})));
|
|
109
|
+
// @Effect()
|
|
110
|
+
// initializeSoftLabelsAfterLoginData$: Observable<Action> = this.actions$.pipe(
|
|
111
|
+
// ofType<UserDetailsFetched>(
|
|
112
|
+
// AuthenticationActionTypes.UserDetailsFetched
|
|
113
|
+
// ),
|
|
114
|
+
// pipe(
|
|
115
|
+
// map(() => {
|
|
116
|
+
// var softLabels = JSON.parse(localStorage.getItem(LocalStorageProperties.SoftLabels));
|
|
117
|
+
// return new GetsoftLabelsCompleted(softLabels);
|
|
118
|
+
// })
|
|
119
|
+
// )
|
|
120
|
+
// );
|
|
121
|
+
this.initializeRolesAfterLoginDataForUser$ = this.actions$.pipe(ofType(AuthenticationActionTypes.UserDetailsFetchedAfterLogin), pipe(map(() => {
|
|
122
|
+
var roles = JSON.parse(localStorage.getItem(LocalStorageProperties.RoleFeatures));
|
|
123
|
+
return new RoleDetailsFetched(roles);
|
|
124
|
+
})));
|
|
125
|
+
this.initializeLoginDataForUserCompany$ = this.actions$.pipe(ofType(AuthenticationActionTypes.UserDetailsFetchedAfterCompanyLogin), pipe(map((action) => {
|
|
126
|
+
return new UserDetailsFetchedAfterLogin(action.userModel);
|
|
127
|
+
})));
|
|
128
|
+
this.initializeLoginDataForUser$ = this.actions$.pipe(ofType(AuthenticationActionTypes.UserDetailsFetchedAfterLogin), switchMap(() => {
|
|
129
|
+
return this.commonService.getUserInitialData()
|
|
130
|
+
.pipe(map((res) => {
|
|
131
|
+
console.log(res.data);
|
|
132
|
+
let environment = JSON.parse(localStorage.getItem(LocalStorageProperties.Environment));
|
|
133
|
+
let data = res.data;
|
|
134
|
+
localStorage.setItem(LocalStorageProperties.UserRoleFeatures, JSON.stringify(data.entityFeatures));
|
|
135
|
+
this.cookieService.set(LocalStorageProperties.AddOrEditCustomAppIsRequired, data.addOrEditCustomAppIsRequired, null, environment.cookiePath, this.window.location.hostname, false, "Strict");
|
|
136
|
+
return new UserInitialDetailsFetchedCompleted(res.data.timeSheetButtonDetails);
|
|
137
|
+
}));
|
|
138
|
+
}));
|
|
139
|
+
this.fetchUserTimeSheetButtonDetails$ = this.actions$.pipe(ofType(AuthenticationActionTypes.FetchTimeSheetButtonDetails), switchMap(() => {
|
|
140
|
+
return this.commonService.getTimeSheetEnabledInformation()
|
|
141
|
+
.pipe(map((res) => {
|
|
142
|
+
return new UserInitialDetailsFetchedCompleted(res);
|
|
143
|
+
}));
|
|
144
|
+
}));
|
|
145
|
+
// @Effect()
|
|
146
|
+
// initializeCompanySettingsLoginDataForUserCompleted: Observable<Action> = this.actions$.pipe(
|
|
147
|
+
// ofType<UserInitialDetailsFetchedCompleted>(
|
|
148
|
+
// AuthenticationActionTypes.UserInitialDetailsFetchedCompleted
|
|
149
|
+
// ),
|
|
150
|
+
// pipe(
|
|
151
|
+
// map((res: any) => {
|
|
152
|
+
// return new GetCompanySettingsCompleted(res.companySettings);
|
|
153
|
+
// })
|
|
154
|
+
// )
|
|
155
|
+
// );
|
|
156
|
+
// @Effect()
|
|
157
|
+
// initializeEntityRoleFeaturesLoginDataForUserCompleted: Observable<Action> = this.actions$.pipe(
|
|
158
|
+
// ofType<UserInitialDetailsFetchedCompleted>(
|
|
159
|
+
// AuthenticationActionTypes.UserInitialDetailsFetchedCompleted
|
|
160
|
+
// ),
|
|
161
|
+
// pipe(
|
|
162
|
+
// map((res: any) => {
|
|
163
|
+
// return new EntityReolesByUserIdFetchCompleted(res.entityFeatures);
|
|
164
|
+
// })
|
|
165
|
+
// )
|
|
166
|
+
// );
|
|
167
|
+
// @Effect()
|
|
168
|
+
// initializeSoftLabelsAfterLoginDataForUser$: Observable<Action> = this.actions$.pipe(
|
|
169
|
+
// ofType<UserDetailsFetchedAfterLogin>(
|
|
170
|
+
// AuthenticationActionTypes.UserDetailsFetchedAfterLogin
|
|
171
|
+
// ),
|
|
172
|
+
// pipe(
|
|
173
|
+
// map(() => {
|
|
174
|
+
// var softLabels = JSON.parse(localStorage.getItem(LocalStorageProperties.SoftLabels));
|
|
175
|
+
// return new GetsoftLabelsCompleted(softLabels);
|
|
176
|
+
// })
|
|
177
|
+
// )
|
|
178
|
+
// );
|
|
179
|
+
// @Effect()
|
|
180
|
+
// initializeAfterGettingSoftLabels$: Observable<Action> = this.actions$.pipe(
|
|
181
|
+
// ofType<UserDetailsFetched>(
|
|
182
|
+
// AuthenticationActionTypes.UserDetailsFetched
|
|
183
|
+
// ),
|
|
184
|
+
// pipe(
|
|
185
|
+
// map((action: any) => {
|
|
186
|
+
// var fromLogIn = JSON.parse(localStorage.getItem('FromLogIn'));
|
|
187
|
+
// if(fromLogIn) {
|
|
188
|
+
// return new GetsoftLabelsCompleted(this.logInData.softLabels);
|
|
189
|
+
// } else {
|
|
190
|
+
// var configurations = new SoftLabelConfigurationModel();
|
|
191
|
+
// return new GetsoftLabelsTriggered(configurations);
|
|
192
|
+
// }
|
|
193
|
+
// })
|
|
194
|
+
// )
|
|
195
|
+
// );
|
|
196
|
+
// @Effect()
|
|
197
|
+
// initializeAfterGettingRoleFeatures$: Observable<Action> = this.actions$.pipe(
|
|
198
|
+
// ofType<UserDetailsFetching>(
|
|
199
|
+
// AuthenticationActionTypes.UserDetailsFetched
|
|
200
|
+
// ),
|
|
201
|
+
// pipe(
|
|
202
|
+
// map((action: any) => {
|
|
203
|
+
// // var roles = localStorage.getItem('Roles');
|
|
204
|
+
// var fromLogIn = JSON.parse(localStorage.getItem('FromLogIn'));
|
|
205
|
+
// if(fromLogIn) {
|
|
206
|
+
// return new RoleDetailsFetched(this.logInData.roleFeatures);
|
|
207
|
+
// } else {
|
|
208
|
+
// return new RoleDetailsFetchOnReload();
|
|
209
|
+
// }
|
|
210
|
+
// })
|
|
211
|
+
// )
|
|
212
|
+
// );
|
|
213
|
+
// @Effect()
|
|
214
|
+
// initializeThemeAfterLogin$: Observable<Action> = this.actions$.pipe(
|
|
215
|
+
// ofType<UserDetailsFetched>(
|
|
216
|
+
// AuthenticationActionTypes.UserDetailsFetched
|
|
217
|
+
// ),
|
|
218
|
+
// pipe(
|
|
219
|
+
// map(() => {
|
|
220
|
+
// return new GetCompanyThemeTriggered();
|
|
221
|
+
// })
|
|
222
|
+
// )
|
|
223
|
+
// );
|
|
224
|
+
this.gettingRoleDetailsAfterInitializeLoginData$ = this.actions$.pipe(ofType(AuthenticationActionTypes.EntityRolesFetchTriggered), switchMap((action) => {
|
|
225
|
+
return this.featureService.getAllPermittedEntityRoleFeatures(action.projectId).pipe(map((roleFeatures) => {
|
|
226
|
+
if (roleFeatures.success) {
|
|
227
|
+
localStorage.setItem(LocalStorageProperties.EntityRoleFeatures, JSON.stringify(roleFeatures.data));
|
|
228
|
+
return new EntityRoleDetailsFetched(roleFeatures.data);
|
|
229
|
+
}
|
|
230
|
+
else {
|
|
231
|
+
this.validationMessages = roleFeatures.apiResponseMessages;
|
|
232
|
+
return new RolesFetchFailed(roleFeatures.apiResponseMessages);
|
|
233
|
+
}
|
|
234
|
+
}));
|
|
235
|
+
}));
|
|
236
|
+
this.companySettingsTriggered$ = this.actions$.pipe(ofType(AuthenticationActionTypes.UserDetailsFetched), pipe(map(() => {
|
|
237
|
+
var companySettingsModel = new CompanysettingsModel();
|
|
238
|
+
companySettingsModel.isArchived = false;
|
|
239
|
+
return new GetCompanySettingsTriggered(companySettingsModel);
|
|
240
|
+
})));
|
|
241
|
+
this.entityRolesTRiggered$ = this.actions$.pipe(ofType(AuthenticationActionTypes.UserDetailsFetched), pipe(map(() => {
|
|
242
|
+
return new EntityRolesByUserIdFetchTriggered("null", "null", false);
|
|
243
|
+
})));
|
|
244
|
+
// @Effect()
|
|
245
|
+
// companySettingsTriggeredAfterLogin$: Observable<Action> = this.actions$.pipe(
|
|
246
|
+
// ofType<UserDetailsFetchedAfterLogin>(
|
|
247
|
+
// AuthenticationActionTypes.UserDetailsFetchedAfterLogin
|
|
248
|
+
// ),
|
|
249
|
+
// pipe(
|
|
250
|
+
// map(() => {
|
|
251
|
+
// var companySettingsModel = new CompanysettingsModel();
|
|
252
|
+
// companySettingsModel.isArchived = false;
|
|
253
|
+
// return new GetCompanySettingsTriggered(companySettingsModel);
|
|
254
|
+
// })
|
|
255
|
+
// )
|
|
256
|
+
// );
|
|
257
|
+
// @Effect()
|
|
258
|
+
// entityRolesTRiggeredAfterLogin$: Observable<Action> = this.actions$.pipe(
|
|
259
|
+
// ofType<UserDetailsFetchedAfterLogin>(
|
|
260
|
+
// AuthenticationActionTypes.UserDetailsFetchedAfterLogin
|
|
261
|
+
// ),
|
|
262
|
+
// pipe(
|
|
263
|
+
// map(() => {
|
|
264
|
+
// return new EntityRolesByUserIdFetchTriggered("null", "null", false);
|
|
265
|
+
// })
|
|
266
|
+
// )
|
|
267
|
+
// );
|
|
268
|
+
this.loadCompanySettings$ = this.actions$.pipe(ofType(AuthenticationActionTypes.GetCompanySettingsTriggered), switchMap((action) => {
|
|
269
|
+
return this.userService.getAllCompanySettingsDetails(action.companySettingsModel).pipe(map((roleFeatures) => {
|
|
270
|
+
if (roleFeatures.success) {
|
|
271
|
+
localStorage.setItem(LocalStorageProperties.CompanySettings, JSON.stringify(roleFeatures.data));
|
|
272
|
+
return new GetCompanySettingsCompleted(roleFeatures.data);
|
|
273
|
+
}
|
|
274
|
+
else {
|
|
275
|
+
return new GetCompanySettingsFailed(roleFeatures.apiResponseMessages);
|
|
276
|
+
}
|
|
277
|
+
}));
|
|
278
|
+
}));
|
|
279
|
+
this.gettingRoleDetailsByUserIdAfterInitializeLoginData$ = this.actions$.pipe(ofType(AuthenticationActionTypes.EntityRolesByUserIdFetchTriggered), switchMap(action => {
|
|
280
|
+
if (action.requiredType == 'goal') {
|
|
281
|
+
this.goalId = action.projectId;
|
|
282
|
+
this.userStoryId = null;
|
|
283
|
+
this.sprintId = null;
|
|
284
|
+
}
|
|
285
|
+
else if (action.requiredType == 'userStory') {
|
|
286
|
+
this.userStoryId = action.projectId;
|
|
287
|
+
this.goalId = null;
|
|
288
|
+
this.sprintId = null;
|
|
289
|
+
}
|
|
290
|
+
else if (action.requiredType == 'sprint') {
|
|
291
|
+
this.sprintId = action.projectId;
|
|
292
|
+
this.goalId = null;
|
|
293
|
+
this.userStoryId = null;
|
|
294
|
+
}
|
|
295
|
+
else {
|
|
296
|
+
this.userStoryId = null;
|
|
297
|
+
this.goalId = null;
|
|
298
|
+
this.sprintId = null;
|
|
299
|
+
}
|
|
300
|
+
this.isSprintType = action.isSprintType;
|
|
301
|
+
return this.featureService.getAllPermittedEntityRoleFeaturesByUserId().pipe(map((roleFeatures) => {
|
|
302
|
+
if (roleFeatures.success) {
|
|
303
|
+
localStorage.setItem(LocalStorageProperties.UserRoleFeatures, JSON.stringify(roleFeatures.data));
|
|
304
|
+
return new EntityReolesByUserIdFetchCompleted(roleFeatures.data);
|
|
305
|
+
}
|
|
306
|
+
else {
|
|
307
|
+
this.validationMessages = roleFeatures.apiResponseMessages;
|
|
308
|
+
return new EntityRolesByUserIdFetchFailed(roleFeatures.apiResponseMessages);
|
|
309
|
+
}
|
|
310
|
+
}), catchError(err => {
|
|
311
|
+
return of(new ExceptionHandled(err));
|
|
312
|
+
}));
|
|
313
|
+
}));
|
|
314
|
+
this.initializeAfterLoginData2$ = this.actions$.pipe(ofType(AuthenticationActionTypes.InitializeAfterLoginData), switchMap((action) => {
|
|
315
|
+
return this.userService.getLoggedInUser().pipe(map((userRecord) => {
|
|
316
|
+
console.log(this.window.location.hostname);
|
|
317
|
+
let environment = JSON.parse(localStorage.getItem(LocalStorageProperties.Environment));
|
|
318
|
+
this.cookieService.set(LocalStorageProperties.CurrentUserId, userRecord.data.id, null, environment.cookiePath, this.window.location.hostname, false, "Strict");
|
|
319
|
+
this.cookieService.set(LocalStorageProperties.CompanyName, userRecord.data.companyName, null, environment.cookiePath, this.window.location.hostname, false, "Strict");
|
|
320
|
+
this.cookieService.set(LocalStorageProperties.CompanyId, userRecord.data.companyId, null, environment.cookiePath, this.window.location.hostname, false, "Strict");
|
|
321
|
+
return new UserDetailsFetched(userRecord.data);
|
|
322
|
+
}));
|
|
323
|
+
}));
|
|
324
|
+
this.showValidationMessagesFoRoleFeatures$ = this.actions$.pipe(ofType(AuthenticationActionTypes.RolesFetchFailed), pipe(map(() => {
|
|
325
|
+
for (let i = 0; i < this.validationMessages.length; i++) {
|
|
326
|
+
return new ShowExceptionMessages({
|
|
327
|
+
message: this.validationMessages[i].message // TODO: Change to proper toast message
|
|
328
|
+
});
|
|
329
|
+
}
|
|
330
|
+
})));
|
|
331
|
+
this.showValidationMessagesForEntityRoles$ = this.actions$.pipe(ofType(AuthenticationActionTypes.EntityRolesByUserIdFetchFailed), switchMap((searchAction) => {
|
|
332
|
+
return of(new ShowValidationMessages({
|
|
333
|
+
validationMessages: searchAction.validationMessages
|
|
334
|
+
}));
|
|
335
|
+
}));
|
|
336
|
+
this.showValidationMessagesForCompanySettings$ = this.actions$.pipe(ofType(AuthenticationActionTypes.GetCompanySettingsFailed), switchMap((searchAction) => {
|
|
337
|
+
return of(new ShowValidationMessages({
|
|
338
|
+
validationMessages: searchAction.validationMessages
|
|
339
|
+
}));
|
|
340
|
+
}));
|
|
341
|
+
this.demoDataClearEventTriggred$ = this.actions$.pipe(ofType(AuthenticationActionTypes.ClearDemoDataTriggred), switchMap((action) => {
|
|
342
|
+
return this.featureService.clearDemoData().pipe(map((response) => {
|
|
343
|
+
if (response.success) {
|
|
344
|
+
this.toastr.success("Demo data cleared successfully");
|
|
345
|
+
return new ClearDemoDataCompleted(response.data);
|
|
346
|
+
}
|
|
347
|
+
else {
|
|
348
|
+
this.validationMessages = response.apiResponseMessages;
|
|
349
|
+
this.toastr.error(this.validationMessages[0].message);
|
|
350
|
+
return new ClearDemoDataFailed(response.apiResponseMessages);
|
|
351
|
+
}
|
|
352
|
+
}));
|
|
353
|
+
}));
|
|
354
|
+
this.getThemeColor$ = this.actions$.pipe(ofType(AuthenticationActionTypes.GetCompanyThemeTriggered), switchMap(action => {
|
|
355
|
+
return this.authenticationService.getThemes().pipe(map((response) => {
|
|
356
|
+
if (response.success) {
|
|
357
|
+
let environment = JSON.parse(localStorage.getItem(LocalStorageProperties.Environment));
|
|
358
|
+
this.cookieService.set(LocalStorageProperties.CompanyTheme, JSON.stringify(response.data), null, environment.cookiePath, this.window.location.hostname, false, "Strict");
|
|
359
|
+
return new GetCompanyThemeCompleted(response.data);
|
|
360
|
+
}
|
|
361
|
+
else {
|
|
362
|
+
return new GetCompanyThemeFailed(response.apiResponseMessages);
|
|
363
|
+
}
|
|
364
|
+
}));
|
|
365
|
+
}));
|
|
366
|
+
this.demoDataClearEventSuccessful$ = this.actions$.pipe(ofType(AuthenticationActionTypes.ClearDemoDataCompleted), pipe(map(() => {
|
|
367
|
+
return new InitializeAfterLoginData();
|
|
368
|
+
})));
|
|
369
|
+
// @Effect()
|
|
370
|
+
// loadGoalAndUserStoryData$: Observable<
|
|
371
|
+
// Action
|
|
372
|
+
// > = this.actions$.pipe(
|
|
373
|
+
// ofType<EntityReolesByUserIdFetchCompleted>(
|
|
374
|
+
// AuthenticationActionTypes.EntityReolesByUserIdFetchCompleted
|
|
375
|
+
// ),
|
|
376
|
+
// pipe(
|
|
377
|
+
// map(() => {
|
|
378
|
+
// if (this.goalId) {
|
|
379
|
+
// return new GetUniqueGoalByIdTriggered(this.goalId);
|
|
380
|
+
// }
|
|
381
|
+
// else if (this.userStoryId) {
|
|
382
|
+
// if (this.isSprintType) {
|
|
383
|
+
// return new GetUniqueSprintWorkItemByIdTriggered(this.userStoryId);
|
|
384
|
+
// } else {
|
|
385
|
+
// return new GetUniqueUserStoryByIdTriggered(this.userStoryId);
|
|
386
|
+
// }
|
|
387
|
+
// } else if (this.sprintId) {
|
|
388
|
+
// return new GetUniqueSprintsByIdTriggered(this.sprintId);
|
|
389
|
+
// }
|
|
390
|
+
// else {
|
|
391
|
+
// return new ArchiveUnArchiveGoalCompleted();
|
|
392
|
+
// }
|
|
393
|
+
// })
|
|
394
|
+
// )
|
|
395
|
+
// );
|
|
396
|
+
this.getUserStoreIdDetails$ = this.actions$.pipe(ofType(AuthenticationActionTypes.GetUserStoreIdTriggered), switchMap(searchAction => {
|
|
397
|
+
return this.userService
|
|
398
|
+
.getStores(searchAction.searchUserStoreDetailsModel)
|
|
399
|
+
.pipe(map((storeData) => {
|
|
400
|
+
if (storeData.success === true)
|
|
401
|
+
return new GetUserStoreIdCompleted(storeData.data[0]);
|
|
402
|
+
else
|
|
403
|
+
return new GetUserStoreIdFailed(storeData.apiResponseMessages);
|
|
404
|
+
}), catchError(error => {
|
|
405
|
+
return of(new ExceptionHandled(error));
|
|
406
|
+
}));
|
|
407
|
+
}));
|
|
408
|
+
this.showValidationMessagesForGetUserStoreId$ = this.actions$.pipe(ofType(AuthenticationActionTypes.GetUserStoreIdFailed), switchMap(searchAction => {
|
|
409
|
+
return of(new ShowValidationMessages({
|
|
410
|
+
validationMessages: searchAction.validationMessages,
|
|
411
|
+
}));
|
|
412
|
+
}));
|
|
413
|
+
this.exceptionHandled$ = this.actions$.pipe(ofType(AuthenticationActionTypes.ExceptionHandled), switchMap(searchAction => {
|
|
414
|
+
return of(new ShowExceptionMessages({
|
|
415
|
+
message: searchAction.errorMessage, // TODO: Change to proper toast message
|
|
416
|
+
}));
|
|
417
|
+
}));
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
AuthenticationEffects.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.1", ngImport: i0, type: AuthenticationEffects, deps: [{ token: i1.Actions }, { token: i2.AuthenticationService }, { token: i3.CommonService }, { token: i3.CommonService }, { token: i4.MenuItemService }, { token: i5.CookieService }, { token: i6.ToastrService }, { token: WINDOW }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
421
|
+
AuthenticationEffects.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.1.1", ngImport: i0, type: AuthenticationEffects });
|
|
422
|
+
__decorate([
|
|
423
|
+
Effect()
|
|
424
|
+
], AuthenticationEffects.prototype, "authenticate$", void 0);
|
|
425
|
+
__decorate([
|
|
426
|
+
Effect()
|
|
427
|
+
], AuthenticationEffects.prototype, "authenticateNewUser$", void 0);
|
|
428
|
+
__decorate([
|
|
429
|
+
Effect()
|
|
430
|
+
], AuthenticationEffects.prototype, "authenticated$", void 0);
|
|
431
|
+
__decorate([
|
|
432
|
+
Effect()
|
|
433
|
+
], AuthenticationEffects.prototype, "companyWorkItemStartFunctionalityRequired$", void 0);
|
|
434
|
+
__decorate([
|
|
435
|
+
Effect({ dispatch: false })
|
|
436
|
+
], AuthenticationEffects.prototype, "authenticateSignedOff$", void 0);
|
|
437
|
+
__decorate([
|
|
438
|
+
Effect()
|
|
439
|
+
], AuthenticationEffects.prototype, "initializeRolesAfterLoginData$", void 0);
|
|
440
|
+
__decorate([
|
|
441
|
+
Effect()
|
|
442
|
+
], AuthenticationEffects.prototype, "initializeRolesAfterLoginDataForUser$", void 0);
|
|
443
|
+
__decorate([
|
|
444
|
+
Effect()
|
|
445
|
+
], AuthenticationEffects.prototype, "initializeLoginDataForUserCompany$", void 0);
|
|
446
|
+
__decorate([
|
|
447
|
+
Effect()
|
|
448
|
+
], AuthenticationEffects.prototype, "initializeLoginDataForUser$", void 0);
|
|
449
|
+
__decorate([
|
|
450
|
+
Effect()
|
|
451
|
+
], AuthenticationEffects.prototype, "fetchUserTimeSheetButtonDetails$", void 0);
|
|
452
|
+
__decorate([
|
|
453
|
+
Effect()
|
|
454
|
+
], AuthenticationEffects.prototype, "gettingRoleDetailsAfterInitializeLoginData$", void 0);
|
|
455
|
+
__decorate([
|
|
456
|
+
Effect()
|
|
457
|
+
], AuthenticationEffects.prototype, "companySettingsTriggered$", void 0);
|
|
458
|
+
__decorate([
|
|
459
|
+
Effect()
|
|
460
|
+
], AuthenticationEffects.prototype, "entityRolesTRiggered$", void 0);
|
|
461
|
+
__decorate([
|
|
462
|
+
Effect()
|
|
463
|
+
], AuthenticationEffects.prototype, "loadCompanySettings$", void 0);
|
|
464
|
+
__decorate([
|
|
465
|
+
Effect()
|
|
466
|
+
], AuthenticationEffects.prototype, "gettingRoleDetailsByUserIdAfterInitializeLoginData$", void 0);
|
|
467
|
+
__decorate([
|
|
468
|
+
Effect()
|
|
469
|
+
], AuthenticationEffects.prototype, "initializeAfterLoginData2$", void 0);
|
|
470
|
+
__decorate([
|
|
471
|
+
Effect()
|
|
472
|
+
], AuthenticationEffects.prototype, "showValidationMessagesFoRoleFeatures$", void 0);
|
|
473
|
+
__decorate([
|
|
474
|
+
Effect()
|
|
475
|
+
], AuthenticationEffects.prototype, "showValidationMessagesForEntityRoles$", void 0);
|
|
476
|
+
__decorate([
|
|
477
|
+
Effect()
|
|
478
|
+
], AuthenticationEffects.prototype, "showValidationMessagesForCompanySettings$", void 0);
|
|
479
|
+
__decorate([
|
|
480
|
+
Effect()
|
|
481
|
+
], AuthenticationEffects.prototype, "demoDataClearEventTriggred$", void 0);
|
|
482
|
+
__decorate([
|
|
483
|
+
Effect()
|
|
484
|
+
], AuthenticationEffects.prototype, "getThemeColor$", void 0);
|
|
485
|
+
__decorate([
|
|
486
|
+
Effect()
|
|
487
|
+
], AuthenticationEffects.prototype, "demoDataClearEventSuccessful$", void 0);
|
|
488
|
+
__decorate([
|
|
489
|
+
Effect()
|
|
490
|
+
], AuthenticationEffects.prototype, "getUserStoreIdDetails$", void 0);
|
|
491
|
+
__decorate([
|
|
492
|
+
Effect()
|
|
493
|
+
], AuthenticationEffects.prototype, "showValidationMessagesForGetUserStoreId$", void 0);
|
|
494
|
+
__decorate([
|
|
495
|
+
Effect()
|
|
496
|
+
], AuthenticationEffects.prototype, "exceptionHandled$", void 0);
|
|
497
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.1", ngImport: i0, type: AuthenticationEffects, decorators: [{
|
|
498
|
+
type: Injectable
|
|
499
|
+
}], ctorParameters: function () { return [{ type: i1.Actions }, { type: i2.AuthenticationService }, { type: i3.CommonService }, { type: i3.CommonService }, { type: i4.MenuItemService }, { type: i5.CookieService }, { type: i6.ToastrService }, { type: Window, decorators: [{
|
|
500
|
+
type: Inject,
|
|
501
|
+
args: [WINDOW]
|
|
502
|
+
}] }]; }, propDecorators: { authenticate$: [], authenticateNewUser$: [], authenticated$: [], companyWorkItemStartFunctionalityRequired$: [], authenticateSignedOff$: [], initializeRolesAfterLoginData$: [], initializeRolesAfterLoginDataForUser$: [], initializeLoginDataForUserCompany$: [], initializeLoginDataForUser$: [], fetchUserTimeSheetButtonDetails$: [], gettingRoleDetailsAfterInitializeLoginData$: [], companySettingsTriggered$: [], entityRolesTRiggered$: [], loadCompanySettings$: [], gettingRoleDetailsByUserIdAfterInitializeLoginData$: [], initializeAfterLoginData2$: [], showValidationMessagesFoRoleFeatures$: [], showValidationMessagesForEntityRoles$: [], showValidationMessagesForCompanySettings$: [], demoDataClearEventTriggred$: [], getThemeColor$: [], demoDataClearEventSuccessful$: [], getUserStoreIdDetails$: [], showValidationMessagesForGetUserStoreId$: [], exceptionHandled$: [] } });
|
|
503
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aGVudGljYXRpb24uZWZmZWN0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NoZWxsLW1vZHVsZS1jb21wb25lbnRzL3NoZWxsLWNvbXBvbmVudHMvc3JjL2xpYi9zaGVsbC1jb21wb25lbnRzL3N0b3JlL2VmZmVjdHMvYXV0aGVudGljYXRpb24uZWZmZWN0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFXLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFeEQsT0FBTyxFQUFjLEVBQUUsRUFBRSxJQUFJLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDNUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2pFLE9BQU8sRUFHTCx5QkFBeUIsRUFFekIsZ0RBQWdELEVBQ2hELG9CQUFvQixFQUNwQixzQkFBc0IsRUFDdEIsbUJBQW1CLEVBRW5CLGtDQUFrQyxFQUNsQyx3QkFBd0IsRUFDeEIsOEJBQThCLEVBQzlCLGlDQUFpQyxFQUVqQyx3QkFBd0IsRUFDeEIscUJBQXFCLEVBRXJCLHdCQUF3QixFQUN4QixrQkFBa0IsRUFFbEIsZ0JBQWdCLEVBR2hCLGtCQUFrQixFQUVsQix1QkFBdUIsRUFDdkIsb0JBQW9CLEVBQ3BCLGdCQUFnQixFQUVoQiwyQkFBMkIsRUFDM0IsMkJBQTJCLEVBQzNCLHdCQUF3QixFQUN4Qiw0QkFBNEIsRUFHNUIsa0NBQWtDLEVBRW5DLE1BQU0sbUNBQW1DLENBQUM7QUFJM0MsT0FBTyxFQUFFLHFCQUFxQixFQUFFLHNCQUFzQixFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFFekcsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG1EQUFtRCxDQUFDO0FBQzNFLE9BQU8sRUFB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R0Y7SUFEQyxNQUFNLEVBQUU7b0ZBYVA7QUFHRjtJQURDLE1BQU0sRUFBRTt3RkFhUDtBQUdGO0lBREMsTUFBTSxFQUFFOzBFQW1CUDtBQUdGO0lBREMsTUFBTSxFQUFFOzZEQW1CUDtBQUdGO0lBREMsTUFBTSxFQUFFOzRFQVlQO0FBZ0NGO0lBREMsTUFBTSxFQUFFO3FFQWlCUDtBQUdGO0lBREMsTUFBTSxFQUFFO3VGQVNQO0FBR0Y7SUFEQyxNQUFNLEVBQUU7Z0VBU1A7MkZBNW1CUyxxQkFBcUI7a0JBRmpDLFVBQVU7a1FBd25CeUIsTUFBTTswQkFBckMsTUFBTTsyQkFBQyxNQUFNOzRDQTltQmhCLGFBQWEsTUErQmIsb0JBQW9CLE1BK0JwQixjQUFjLE1BaUJkLDBDQUEwQyxNQTBCMUMsc0JBQXNCLE1BUXRCLDhCQUE4QixNQTBCOUIscUNBQXFDLE1BY3JDLGtDQUFrQyxNQVlsQywyQkFBMkIsTUFtQjNCLGdDQUFnQyxNQW9HaEMsMkNBQTJDLE1Bb0IzQyx5QkFBeUIsTUFjekIscUJBQXFCLE1Bc0NyQixvQkFBb0IsTUFtQnBCLG1EQUFtRCxNQTJDbkQsMEJBQTBCLE1Bb0IxQixxQ0FBcUMsTUFxQnJDLHFDQUFxQyxNQWVyQyx5Q0FBeUMsTUFlekMsMkJBQTJCLE1BcUIzQixjQUFjLE1BcUJkLDZCQUE2QixNQTJDN0Isc0JBQXNCLE1BbUJ0Qix3Q0FBd0MsTUFXeEMsaUJBQWlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgQWN0aW9ucywgRWZmZWN0LCBvZlR5cGUgfSBmcm9tIFwiQG5ncngvZWZmZWN0c1wiO1xyXG5pbXBvcnQgeyBBY3Rpb24gfSBmcm9tIFwiQG5ncngvc3RvcmVcIjtcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgb2YsIHBpcGUgfSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQgeyBjYXRjaEVycm9yLCBtYXAsIHN3aXRjaE1hcCwgdGFwIH0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XHJcbmltcG9ydCB7XHJcbiAgQXV0aGVudGljYXRlZCxcclxuICBBdXRoZW50aWNhdGVVc2VyLFxyXG4gIEF1dGhlbnRpY2F0aW9uQWN0aW9uVHlwZXMsXHJcbiAgQ29tcGFueVdvcmtJdGVtU3RhcnRGdW5jdGlvbmFsaXR5UmVxdWlyZWQsXHJcbiAgQ29tcGFueVdvcmtJdGVtU3RhcnRGdW5jdGlvbmFsaXR5UmVxdWlyZWRTdWNjZXNzLFxyXG4gIEF1dGhlbnRpY2F0aW9uRmFpbGVkLFxyXG4gIENsZWFyRGVtb0RhdGFDb21wbGV0ZWQsXHJcbiAgQ2xlYXJEZW1vRGF0YUZhaWxlZCxcclxuICBDbGVhckRlbW9EYXRhVHJpZ2dyZWQsXHJcbiAgRW50aXR5UmVvbGVzQnlVc2VySWRGZXRjaENvbXBsZXRlZCxcclxuICBFbnRpdHlSb2xlRGV0YWlsc0ZldGNoZWQsXHJcbiAgRW50aXR5Um9sZXNCeVVzZXJJZEZldGNoRmFpbGVkLFxyXG4gIEVudGl0eVJvbGVzQnlVc2VySWRGZXRjaFRyaWdnZXJlZCxcclxuICBFbnRpdHlSb2xlc0ZldGNoVHJpZ2dlcmVkLFxyXG4gIEdldENvbXBhbnlUaGVtZUNvbXBsZXRlZCxcclxuICBHZXRDb21wYW55VGhlbWVGYWlsZWQsXHJcbiAgR2V0Q29tcGFueVRoZW1lVHJpZ2dlcmVkLFxyXG4gIEluaXRpYWxpemVBZnRlckxvZ2luRGF0YSxcclxuICBSb2xlRGV0YWlsc0ZldGNoZWQsXHJcbiAgUm9sZURldGFpbHNGZXRjaE9uUmVsb2FkLFxyXG4gIFJvbGVzRmV0Y2hGYWlsZWQsXHJcbiAgU2lnbmVkT2ZmLFxyXG4gIFVzZXJEZXRhaWxzRmV0Y2hpbmcsXHJcbiAgVXNlckRldGFpbHNGZXRjaGVkLFxyXG4gIEdldFVzZXJTdG9yZUlkVHJpZ2dlcmVkLFxyXG4gIEdldFVzZXJTdG9yZUlkQ29tcGxldGVkLFxyXG4gIEdldFVzZXJTdG9yZUlkRmFpbGVkLFxyXG4gIEV4Y2VwdGlvbkhhbmRsZWQsXHJcbiAgQXV0aGVudGljYXRlTmV3VXNlcixcclxuICBHZXRDb21wYW55U2V0dGluZ3NUcmlnZ2VyZWQsXHJcbiAgR2V0Q29tcGFueVNldHRpbmdzQ29tcGxldGVkLFxyXG4gIEdldENvbXBhbnlTZXR0aW5nc0ZhaWxlZCxcclxuICBVc2VyRGV0YWlsc0ZldGNoZWRBZnRlckxvZ2luLFxyXG4gIFVzZXJEZXRhaWxzRmV0Y2hlZEFmdGVyQ29tcGFueUxvZ2luLFxyXG4gIFVzZXJJbml0aWFsRGV0YWlsc0ZldGNoZWQsXHJcbiAgVXNlckluaXRpYWxEZXRhaWxzRmV0Y2hlZENvbXBsZXRlZCxcclxuICBGZXRjaFRpbWVTaGVldEJ1dHRvbkRldGFpbHNcclxufSBmcm9tIFwiLi4vYWN0aW9ucy9hdXRoZW50aWNhdGlvbi5hY3Rpb25zXCI7XHJcbmltcG9ydCB7IEF1dGhlbnRpY2F0aW9uU2VydmljZSB9IGZyb20gXCIuLi8uLi9zZXJ2aWNlcy9hdXRoZW50aWNhdGlvbi5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IE1lbnVJdGVtU2VydmljZSB9IGZyb20gXCIuLi8uLi9zZXJ2aWNlcy9mZWF0dXJlLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgQ29va2llU2VydmljZSB9IGZyb20gXCJuZ3gtY29va2llLXNlcnZpY2VcIjtcclxuaW1wb3J0IHsgU2hvd0V4Y2VwdGlvbk1lc3NhZ2VzLCBTaG93VmFsaWRhdGlvbk1lc3NhZ2VzIH0gZnJvbSBcIi4uL2FjdGlvbnMvbm90aWZpY2F0aW9uLXZhbGlkYXRvci5hY3Rpb25cIjtcclxuaW1wb3J0IHsgVG9hc3RyU2VydmljZSB9IGZyb20gXCJuZ3gtdG9hc3RyXCI7XHJcbmltcG9ydCB7IFdJTkRPVyB9IGZyb20gJy4uLy4uLy4uL2dsb2JhbGRlcGVuZGVuY2llcy9oZWxwZXJzL3dpbmRvdy5oZWxwZXInO1xyXG5pbXBvcnQgeyBMb2NhbFN0b3JhZ2VQcm9wZXJ0aWVzIH0gZnJvbSAnLi4vLi4vLi4vZ2xvYmFsZGVwZW5kZW5jaWVzL2NvbnN0YW50cy9sb2NhbHN0b3JhZ2UtcHJvcGVydGllcyc7XHJcbmltcG9ydCB7IENvbW1vblNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9jb21tb24tdXNlZC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ29tcGFueXNldHRpbmdzTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvY29tcGFueS1tb2RlbCc7XHJcblxyXG4vKiogQGR5bmFtaWMgKi9cclxuXHJcbkBJbmplY3RhYmxlKClcclxuXHJcbmV4cG9ydCBjbGFzcyBBdXRoZW50aWNhdGlvbkVmZmVjdHMge1xyXG4gIHZhbGlkYXRpb25NZXNzYWdlczogYW55W107XHJcbiAgZ29hbElkOiBzdHJpbmc7XHJcbiAgdXNlclN0b3J5SWQ6IHN0cmluZztcclxuICBzcHJpbnRJZDogc3RyaW5nO1xyXG4gIGlzU3ByaW50VHlwZTogYm9vbGVhbjtcclxuICBsb2dJbkRhdGE6IGFueTtcclxuICBARWZmZWN0KClcclxuICBhdXRoZW50aWNhdGUkOiBPYnNlcnZhYmxlPEFjdGlvbj4gPSB0aGlzLmFjdGlvbnMkLnBpcGUoXHJcbiAgICBvZlR5cGU8QXV0aGVudGljYXRlVXNlcj4oQXV0aGVudGljYXRpb25BY3Rpb25UeXBlcy5BdXRoZW50aWNhdGVVc2VyKSxcclxuICAgIHN3aXRjaE1hcCgoYWN0aW9uKSA9PiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmF1dGhlbnRpY2F0aW9uU2VydmljZVxyXG4gICAgICAgIC5sb2dpbihhY3Rpb24udXNlck5hbWUsIGFjdGlvbi5wYXNzd29yZClcclxuICAgICAgICAucGlwZShcclxuICAgICAgICAgIG1hcCgodXNlclRva2VuOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5sb2dJbkRhdGEgPSB1c2VyVG9rZW4uZGF0YTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2codGhpcy53aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO1xyXG4gICAgICAgICAgICBsZXQgZW52aXJvbm1lbnQgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKExvY2FsU3RvcmFnZVByb3BlcnRpZXMuRW52aXJvbm1lbnQpKTtcclxuICAgICAgICAgICAgdGhpcy5jb29raWVTZXJ2aWNlLnNldChMb2NhbFN0b3JhZ2VQcm9wZXJ0aWVzLkN1cnJlbnRVc2VyLCB1c2VyVG9rZW4uZGF0YS5hdXRoVG9rZW4sIG51bGwsIGVudmlyb25tZW50LmNvb2tpZVBhdGgsIHRoaXMud2luZG93LmxvY2F0aW9uLmhvc3RuYW1lLCBmYWxzZSwgXCJTdHJpY3RcIik7XHJcbiAgICAgICAgICAgIC8vIHRoaXMuY29va2llU2VydmljZS5zZXQoTG9jYWxTdG9yYWdlUHJvcGVydGllcy5EZWZhdWx0RGFzaGJvYXJkLCBKU09OLnN0cmluZ2lmeSh1c2VyVG9rZW4uZGF0YS5kZWZhdWx0RGFzaGJvYXJkSWQpLCBudWxsLCBlbnZpcm9ubWVudC5jb29raWVQYXRoLCB0aGlzLndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSwgZmFsc2UsIFwiU3RyaWN0XCIpO1xyXG4gICAgICAgICAgICB0aGlzLmNvb2tpZVNlcnZpY2Uuc2V0KExvY2FsU3RvcmFnZVByb3BlcnRpZXMuQ29tcGFueURldGFpbHMsIEpTT04uc3RyaW5naWZ5KHVzZXJUb2tlbi5kYXRhLmNvbXBhbnlEZXRhaWxzKSwgbnVsbCwgZW52aXJvbm1lbnQuY29va2llUGF0aCwgdGhpcy53aW5kb3cubG9jYXRpb24uaG9zdG5hbWUsIGZhbHNlLCBcIlN0cmljdFwiKTtcclxuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oTG9jYWxTdG9yYWdlUHJvcGVydGllcy5Sb2xlRmVhdHVyZXMsIEpTT04uc3RyaW5naWZ5KHVzZXJUb2tlbi5kYXRhLnJvbGVGZWF0dXJlcykpO1xyXG4gICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShMb2NhbFN0b3JhZ2VQcm9wZXJ0aWVzLlNvZnRMYWJlbHMsIEpTT04uc3RyaW5naWZ5KHVzZXJUb2tlbi5kYXRhLnNvZnRMYWJlbHMpKTtcclxuICAgICAgICAgICAgdGhpcy5jb29raWVTZXJ2aWNlLnNldChMb2NhbFN0b3JhZ2VQcm9wZXJ0aWVzLkZyb21Mb2dJbiwgSlNPTi5zdHJpbmdpZnkodHJ1ZSksIG51bGwsIGVudmlyb25tZW50LmNvb2tpZVBhdGgsIHRoaXMud2luZG93LmxvY2F0aW9uLmhvc3RuYW1lLCBmYWxzZSwgXCJTdHJpY3RcIik7XHJcbiAgICAgICAgICAgIC8vIHJldHVybiBuZXcgQXV0aGVudGljYXRlZChcclxuICAgICAgICAgICAgLy8gICBhY3Rpb24udXNlck5hbWUsXHJcbiAgICAgICAgICAgIC8vICAgSlNPTi5zdHJpbmdpZnkodXNlclRva2VuLmRhdGEuYXV0aFRva2VuKVxyXG4gICAgICAgICAgICAvLyApO1xyXG4gICAgICAgICAgICB0aGlzLmNvb2tpZVNlcnZpY2Uuc2V0KExvY2FsU3RvcmFnZVByb3BlcnRpZXMuQ3VycmVudFVzZXJJZCwgdXNlclRva2VuLmRhdGEudXNlcnNNb2RlbC5pZCwgbnVsbCwgZW52aXJvbm1lbnQuY29va2llUGF0aCwgdGhpcy53aW5kb3cubG9jYXRpb24uaG9zdG5hbWUsIGZhbHNlLCBcIlN0cmljdFwiKTtcclxuICAgICAgICAgICAgdGhpcy5jb29raWVTZXJ2aWNlLnNldChMb2NhbFN0b3JhZ2VQcm9wZXJ0aWVzLkNvbXBhbnlOYW1lLCB1c2VyVG9rZW4uZGF0YS51c2Vyc01vZGVsLmNvbXBhbnlOYW1lLCBudWxsLCBlbnZpcm9ubWVudC5jb29raWVQYXRoLCB0aGlzLndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSwgZmFsc2UsIFwiU3RyaWN0XCIpO1xyXG4gICAgICAgICAgICB0aGlzLmNvb2tpZVNlcnZpY2Uuc2V0KExvY2FsU3RvcmFnZVByb3BlcnRpZXMuQ29tcGFueUlkLCB1c2VyVG9rZW4uZGF0YS51c2Vyc01vZGVsLmNvbXBhbnlJZCwgbnVsbCwgZW52aXJvbm1lbnQuY29va2llUGF0aCwgdGhpcy53aW5kb3cubG9jYXRpb24uaG9zdG5hbWUsIGZhbHNlLCBcIlN0cmljdFwiKTtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBVc2VyRGV0YWlsc0ZldGNoZWQodXNlclRva2VuLmRhdGEudXNlcnNNb2RlbCk7XHJcbiAgICAgICAgICB9KSxcclxuICAgICAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiBvZihuZXcgQXV0aGVudGljYXRpb25GYWlsZWQoZXJyb3IpKSlcclxuICAgICAgICApO1xyXG4gICAgfSlcclxuICApO1xyXG5cclxuICBARWZmZWN0KClcclxuICBhdXRoZW50aWNhdGVOZXdVc2VyJDogT2JzZXJ2YWJsZTxBY3Rpb24+ID0gdGhpcy5hY3Rpb25zJC5waXBlKFxyXG4gICAgb2ZUeXBlPEF1dGhlbnRpY2F0ZU5ld1VzZXI+KEF1dGhlbnRpY2F0aW9uQWN0aW9uVHlwZXMuQXV0aGVudGljYXRlTmV3VXNlciksXHJcbiAgICBzd2l0Y2hNYXAoKGFjdGlvbikgPT4ge1xyXG4gICAgICByZXR1cm4gdGhpcy5hdXRoZW50aWNhdGlvblNlcnZpY2VcclxuICAgICAgICAubG9naW5OZXdVc2VyKGFjdGlvbi51c2VyTmFtZSlcclxuICAgICAgICAucGlwZShcclxuICAgICAgICAgIG1hcCgodXNlclRva2VuOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5sb2dJbkRhdGEgPSB1c2VyVG9rZW4uZGF0YTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2codGhpcy53aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO1xyXG4gICAgICAgICAgICBsZXQgZW52aXJvbm1lbnQgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKExvY2FsU3RvcmFnZVByb3BlcnRpZXMuRW52aXJvbm1lbnQpKTtcclxuICAgICAgICAgICAgdGhpcy5jb29raWVTZXJ2aWNlLnNldChMb2NhbFN0b3JhZ2VQcm9wZXJ0aWVzLkN1cnJlbnRVc2VyLCB1c2VyVG9rZW4uZGF0YS5hdXRoVG9rZW4sIG51bGwsIGVudmlyb25tZW50LmNvb2tpZVBhdGgsIHRoaXMud2luZG93LmxvY2F0aW9uLmhvc3RuYW1lLCBmYWxzZSwgXCJTdHJpY3RcIik7XHJcbiAgICAgICAgICAgIHRoaXMuY29va2llU2VydmljZS5zZXQoTG9jYWxTdG9yYWdlUHJvcGVydGllcy5EZWZhdWx0RGFzaGJvYXJkLCBKU09OLnN0cmluZ2lmeSh1c2VyVG9rZW4uZGF0YS5kZWZhdWx0RGFzaGJvYXJkSWQpLCBudWxsLCBlbnZpcm9ubWVudC5jb29raWVQYXRoLCB0aGlzLndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSwgZmFsc2UsIFwiU3RyaWN0XCIpO1xyXG4gICAgICAgICAgICB0aGlzLmNvb2tpZVNlcnZpY2Uuc2V0KExvY2FsU3RvcmFnZVByb3BlcnRpZXMuQ29tcGFueURldGFpbHMsIEpTT04uc3RyaW5naWZ5KHVzZXJUb2tlbi5kYXRhLmNvbXBhbnlEZXRhaWxzKSwgbnVsbCwgZW52aXJvbm1lbnQuY29va2llUGF0aCwgdGhpcy53aW5kb3cubG9jYXRpb24uaG9zdG5hbWUsIGZhbHNlLCBcIlN0cmljdFwiKTtcclxuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oTG9jYWxTdG9yYWdlUHJvcGVydGllcy5Sb2xlRmVhdHVyZXMsIEpTT04uc3RyaW5naWZ5KHVzZXJUb2tlbi5kYXRhLnJvbGVGZWF0dXJlcykpO1xyXG4gICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShMb2NhbFN0b3JhZ2VQcm9wZXJ0aWVzLlNvZnRMYWJlbHMsIEpTT04uc3RyaW5naWZ5KHVzZXJUb2tlbi5kYXRhLnNvZnRMYWJlbHMpKTtcclxuICAgICAgICAgICAgdGhpcy5jb29raWVTZXJ2aWNlLnNldChMb2NhbFN0b3JhZ2VQcm9wZXJ0aWVzLkZyb21Mb2dJbiwgSlNPTi5zdHJpbmdpZnkodHJ1ZSksIG51bGwsIGVudmlyb25tZW50LmNvb2tpZVBhdGgsIHRoaXMud2luZG93LmxvY2F0aW9uLmhvc3RuYW1lLCBmYWxzZSwgXCJTdHJpY3RcIik7XHJcbiAgICAgICAgICAgIC8vIHJldHVybiBuZXcgQXV0aGVudGljYXRlZChcclxuICAgICAgICAgICAgLy8gICBhY3Rpb24udXNlck5hbWUsXHJcbiAgICAgICAgICAgIC8vICAgSlNPTi5zdHJpbmdpZnkodXNlclRva2VuLmRhdGEuYXV0aFRva2VuKVxyXG4gICAgICAgICAgICAvLyApO1xyXG4gICAgICAgICAgICB0aGlzLmNvb2tpZVNlcnZpY2Uuc2V0KExvY2FsU3RvcmFnZVByb3BlcnRpZXMuQ3VycmVudFVzZXJJZCwgdXNlclRva2VuLmRhdGEudXNlcnNNb2RlbC5pZCwgbnVsbCwgZW52aXJvbm1lbnQuY29va2llUGF0aCwgdGhpcy53aW5kb3cubG9jYXRpb24uaG9zdG5hbWUsIGZhbHNlLCBcIlN0cmljdFwiKTtcclxuICAgICAgICAgICAgdGhpcy5jb29raWVTZXJ2aWNlLnNldChMb2NhbFN0b3JhZ2VQcm9wZXJ0aWVzLkNvbXBhbnlOYW1lLCB1c2VyVG9rZW4uZGF0YS51c2Vyc01vZGVsLmNvbXBhbnlOYW1lLCBudWxsLCBlbnZpcm9ubWVudC5jb29raWVQYXRoLCB0aGlzLndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSwgZmFsc2UsIFwiU3RyaWN0XCIpO1xyXG4gICAgICAgICAgICB0aGlzLmNvb2tpZVNlcnZpY2Uuc2V0KExvY2FsU3RvcmFnZVByb3BlcnRpZXMuQ29tcGFueUlkLCB1c2VyVG9rZW4uZGF0YS51c2Vyc01vZGVsLmNvbXBhbnlJZCwgbnVsbCwgZW52aXJvbm1lbnQuY29va2llUGF0aCwgdGhpcy53aW5kb3cubG9jYXRpb24uaG9zdG5hbWUsIGZhbHNlLCBcIlN0cmljdFwiKTtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBVc2VyRGV0YWlsc0ZldGNoZWQodXNlclRva2VuLmRhdGEudXNlcnNNb2RlbCk7XHJcbiAgICAgICAgICB9KSxcclxuICAgICAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiBvZihuZXcgQXV0aGVudGljYXRpb25GYWlsZWQoZXJyb3IpKSlcclxuICAgICAgICApO1xyXG4gICAgfSlcclxuICApO1xyXG5cclxuICBARWZmZWN0KClcclxuICBhdXRoZW50aWNhdGVkJDogT2JzZXJ2YWJsZTxBY3Rpb24+ID0gdGhpcy5hY3Rpb25zJC5waXBlKFxyXG4gICAgb2ZUeXBlPEF1dGhlbnRpY2F0ZWQ+KEF1dGhlbnRpY2F0aW9uQWN0aW9uVHlwZXMuQXV0aGVudGljYXRlZCksXHJcbiAgICBzd2l0Y2hNYXAoKGFjdGlvbikgPT4ge1xyXG4gICAgICByZXR1cm4gdGhpcy51c2VyU2VydmljZS5nZXRMb2dnZWRJblVzZXIoKS5waXBlKFxyXG4gICAgICAgIG1hcCgodXNlclJlY29yZDogYW55KSA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyh0aGlzLndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSk7XHJcbiAgICAgICAgICBsZXQgZW52aXJvbm1lbnQgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKExvY2FsU3RvcmFnZVByb3BlcnRpZXMuRW52aXJvbm1lbnQpKTtcclxuICAgICAgICAgIHRoaXMuY29va2llU2VydmljZS5zZXQoTG9jYWxTdG9yYWdlUHJvcGVydGllcy5DdXJyZW50VXNlcklkLCB1c2VyUmVjb3JkLmRhdGEuaWQsIG51bGwsIGVudmlyb25tZW50LmNvb2tpZVBhdGgsIHRoaXMud2luZG93LmxvY2F0aW9uLmhvc3RuYW1lLCBmYWxzZSwgXCJTdHJpY3RcIik7XHJcbiAgICAgICAgICB0aGlzLmNvb2tpZVNlcnZpY2Uuc2V0KExvY2FsU3RvcmFnZVByb3BlcnRpZXMuQ29tcGFueU5hbWUsIHVzZXJSZWNvcmQuZGF0YS5jb21wYW55TmFtZSwgbnVsbCwgZW52aXJvbm1lbnQuY29va2llUGF0aCwgdGhpcy53aW5kb3cubG9jYXRpb24uaG9zdG5hbWUsIGZhbHNlLCBcIlN0cmljdFwiKTtcclxuICAgICAgICAgIHRoaXMuY29va2llU2VydmljZS5zZXQoTG9jYWxTdG9yYWdlUHJvcGVydGllcy5Db21wYW55SWQsIHVzZXJSZWNvcmQuZGF0YS5jb21wYW55SWQsIG51bGwsIGVudmlyb25tZW50LmNvb2tpZVBhdGgsIHRoaXMud2luZG93LmxvY2F0aW9uLmhvc3RuYW1lLCBmYWxzZSwgXCJTdHJpY3RcIik7XHJcbiAgICAgICAgICByZXR1cm4gbmV3IFVzZXJEZXRhaWxzRmV0Y2hlZCh1c2VyUmVjb3JkLmRhdGEpO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgICB9KVxyXG4gICk7XHJcblxyXG4gIEBFZmZlY3QoKVxyXG4gIGNvbXBhbnlXb3JrSXRlbVN0YXJ0RnVuY3Rpb25hbGl0eVJlcXVpcmVkJDogT2JzZXJ2YWJsZTxBY3Rpb24+ID0gdGhpcy5hY3Rpb25zJC5waXBlKFxyXG4gICAgb2ZUeXBlPENvbXBhbnlXb3JrSXRlbVN0YXJ0RnVuY3Rpb25hbGl0eVJlcXVpcmVkPihBdXRoZW50aWNhdGlvbkFjdGlvblR5cGVzLkNvbXBhbnlXb3JrSXRlbVN0YXJ0RnVuY3Rpb25hbGl0eVJlcXVpcmVkKSxcclxuICAgIHN3aXRjaE1hcCgoYWN0aW9uKSA9PiB7XHJcbiAgICAgIHJldHVybiB0aGlzLnVzZXJTZXJ2aWNlLmdldENvbXBhbnlXb3JrSXRlbVN0YXJ0RnVuY3Rpb25hbGl0eVJlcXVpcmVkKCkucGlwZShcclxuICAgICAgICBtYXAoKHJlY29yZDogYW55KSA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyh0aGlzLndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSk7XHJcbiAgICAgICAgICByZXR1cm4gbmV3IENvbXBhbnlXb3JrSXRlbVN0YXJ0RnVuY3Rpb25hbGl0eVJlcXVpcmVkU3VjY2VzcyhyZWNvcmQuZGF0YSk7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICAgIH0pXHJcbiAgKTtcclxuICBcclxuXHJcbiAgLy8gQEVmZmVjdCgpXHJcbiAgLy8gVXNlckRldGFpbHNGZXRjaGluZyQ6IE9ic2VydmFibGU8QWN0aW9uPiA9IHRoaXMuYWN0aW9ucyQucGlwZShcclxuICAvLyAgIG9mVHlwZTxVc2VyRGV0YWlsc0ZldGNoaW5nPihBdXRoZW50aWNhdGlvbkFjdGlvblR5cGVzLlVzZXJEZXRhaWxzRmV0Y2hpbmcpLFxyXG4gIC8vICAgcGlwZShcclxuICAvLyAgICAgbWFwKChhY3Rpb246IGFueSkgPT4ge1xyXG4gIC8vICAgICAgIC8vdmFyIGNvbmZpZ3VyYXRpb25zID0gbmV3IFNvZnRMYWJlbENvbmZpZ3VyYXRpb25Nb2RlbCgpO1xyXG4gIC8vICAgICAgIC8vcmV0dXJuIG5ldyBHZXRzb2Z0TGFiZWxzVHJpZ2dlcmVkKGNvbmZpZ3VyYXRpb25zKTtcclxuICAvLyAgICAgICByZXR1cm4gbmV3IFVzZXJEZXRhaWxzRmV0Y2hlZChhY3Rpb24ubG9naW5EYXRhLlVzZXJzTW9kZWwpO1xyXG4gIC8vICAgICB9KVxyXG4gIC8vICAgKVxyXG4gIC8vICk7XHJcblxyXG4gIEBFZmZlY3QoeyBkaXNwYXRjaDogZmFsc2UgfSlcclxuICBhdXRoZW50aWNhdGVTaWduZWRPZmYkOiBPYnNlcnZhYmxlPEFjdGlvbj4gPSB0aGlzLmFjdGlvbnMkLnBpcGUoXHJcbiAgICBvZlR5cGU8U2lnbmVkT2ZmPihBdXRoZW50aWNhdGlvbkFjdGlvblR5cGVzLlNpZ25lZE9mZiksXHJcbiAgICB0YXAoKGFjdGlvbikgPT4ge1xyXG4gICAgICB0aGlzLmNvb2tpZVNlcnZpY2UuZGVsZXRlKExvY2FsU3RvcmFnZVByb3BlcnRpZXMuQ3VycmVudFVzZXIpO1xyXG4gICAgfSlcclxuICApO1xyXG5cclxuICBARWZmZWN0KClcclxuICBpbml0aWFsaXplUm9sZXNBZnRlckxvZ2luRGF0YSQ6IE9ic2VydmFibGU8QWN0aW9uPiA9IHRoaXMuYWN0aW9ucyQucGlwZShcclxuICAgIG9mVHlwZTxVc2VyRGV0YWlsc0ZldGNoZWQ+KFxyXG4gICAgICBBdXRoZW50aWNhdGlvbkFjdGlvblR5cGVzLlVzZXJEZXRhaWxzRmV0Y2hlZFxyXG4gICAgKSxcclxuICAgIHBpcGUoXHJcbiAgICAgIG1hcCgoKSA9PiB7XHJcbiAgICAgICAgdmFyIHJvbGVzID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbShMb2NhbFN0b3JhZ2VQcm9wZXJ0aWVzLlJvbGVGZWF0dXJlcykpO1xyXG4gICAgICAgIHJldHVybiBuZXcgUm9sZURldGFpbHNGZXRjaGVkKHJvbGVzKTtcclxuICAgICAgfSlcclxuICAgIClcclxuICApO1xyXG5cclxuICAvLyBARWZmZWN0KClcclxuICAvLyBpbml0aWFsaXplU29mdExhYmVsc0FmdGVyTG9naW5EYXRhJDogT2JzZXJ2YWJsZTxBY3Rpb24+ID0gdGhpcy5hY3Rpb25zJC5waXBlKFxyXG4gIC8vICAgb2ZUeXBlPFVzZXJEZXRhaWxzRmV0Y2hlZD4oXHJcbiAgLy8gICAgIEF1dGhlbnRpY2F0aW9uQWN0aW9uVHlwZXMuVXNlckRldGFpbHNGZXRjaGVkXHJcbiAgLy8gICApLFxyXG4gIC8vICAgcGlwZShcclxuICAvLyAgICAgbWFwKCgpID0+IHtcclxuICAvLyAgICAgICB2YXIgc29mdExhYmVscyA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oTG9jYWxTdG9yYWdlUHJvcGVydGllcy5Tb2Z0TGFiZWxzKSk7XHJcbiAgLy8gICAgICAgcmV0dXJuIG5ldyBHZXRzb2Z0TGFiZWxzQ29tcGxldGVkKHNvZnRMYWJlbHMpO1xyXG4gIC8vICAgICB9KVxyXG4gIC8vICAgKVxyXG4gIC8vICk7XHJcblxyXG4gIEBFZmZlY3QoKVxyXG4gIGluaXRpYWxpemVSb2xlc0FmdGVyTG9naW5EYXRhRm9yVXNlciQ6IE9ic2VydmFibGU8QWN0aW9uPiA9IHRoaXMuYWN0aW9ucyQucGlwZShcclxuICAgIG9mVHlwZTxVc2VyRGV0YWlsc0ZldGNoZWRBZnRlckxvZ2luPihcclxuICAgICAgQXV0aGVudGljYXRpb25BY3Rpb25UeXBlcy5Vc2VyRGV0YWlsc0ZldGNoZWRBZnRlckxvZ2luXHJcbiAgICApLFxyXG4gICAgcGlwZShcclxuICAgICAgbWFwKCgpID0+IHtcclxuICAgICAgICB2YXIgcm9sZXMgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKExvY2FsU3RvcmFnZVByb3BlcnRpZXMuUm9sZUZlYXR1cmVzKSk7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBSb2xlRGV0YWlsc0ZldGNoZWQocm9sZXMpO1xyXG4gICAgICB9KVxyXG4gICAgKVxyXG4gICk7XHJcblxyXG5cclxuICBARWZmZWN0KClcclxuICBpbml0aWFsaXplTG9naW5EYXRhRm9yVXNlckNvbXBhbnkkOiBPYnNlcnZhYmxlPEFjdGlvbj4gPSB0aGlzLmFjdGlvbnMkLnBpcGUoXHJcbiAgICBvZlR5cGU8VXNlckRldGFpbHNGZXRjaGVkQWZ0ZXJDb21wYW55TG9naW4+KFxyXG4gICAgICBBdXRoZW50aWNhdGlvbkFjdGlvblR5cGVzLlVzZXJEZXRhaWxzRmV0Y2hlZEFmdGVyQ29tcGFueUxvZ2luXHJcbiAgICApLFxyXG4gICAgcGlwZShcclxuICAgICAgbWFwKChhY3Rpb24pID0+IHtcclxuICAgICAgICByZXR1cm4gbmV3IFVzZXJEZXRhaWxzRmV0Y2hlZEFmdGVyTG9naW4oYWN0aW9uLnVzZXJNb2RlbCk7XHJcbiAgICAgIH0pXHJcbiAgICApXHJcbiAgKTtcclxuICBcclxuICBARWZmZWN0KClcclxuICBpbml0aWFsaXplTG9naW5EYXRhRm9yVXNlciQ6IE9ic2VydmFibGU8QWN0aW9uPiA9IHRoaXMuYWN0aW9ucyQucGlwZShcclxuICAgIG9mVHlwZTxVc2VyRGV0YWlsc0ZldGNoZWRBZnRlckxvZ2luPihcclxuICAgICAgQXV0aGVudGljYXRpb25BY3Rpb25UeXBlcy5Vc2VyRGV0YWlsc0ZldGNoZWRBZnRlckxvZ2luXHJcbiAgICApLFxyXG4gICAgc3dpdGNoTWFwKCgpID0+IHtcclxuICAgICAgcmV0dXJuIHRoaXMuY29tbW9uU2VydmljZS5nZXRVc2VySW5pdGlhbERhdGEoKVxyXG4gICAgICAgIC5waXBlKG1hcCgocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKHJlcy5kYXRhKTtcclxuICAgICAgICAgIGxldCBlbnZpcm9ubWVudCA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oTG9jYWxTdG9yYWdlUHJvcGVydGllcy5FbnZpcm9ubWVudCkpO1xyXG4gICAgICAgICAgbGV0IGRhdGEgPSByZXMuZGF0YTtcclxuICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKExvY2FsU3RvcmFnZVByb3BlcnRpZXMuVXNlclJvbGVGZWF0dXJlcywgSlNPTi5zdHJpbmdpZnkoZGF0YS5lbnRpdHlGZWF0dXJlcykpO1xyXG4gICAgICAgICAgdGhpcy5jb29raWVTZXJ2aWNlLnNldChMb2NhbFN0b3JhZ2VQcm9wZXJ0aWVzLkFkZE9yRWRpdEN1c3RvbUFwcElzUmVxdWlyZWQsIGRhdGEuYWRkT3JFZGl0Q3VzdG9tQXBwSXNSZXF1aXJlZCwgbnVsbCwgZW52aXJvbm1lbnQuY29va2llUGF0aCwgdGhpcy53aW5kb3cubG9jYXRpb24uaG9zdG5hbWUsIGZhbHNlLCBcIlN0cmljdFwiKTtcclxuICAgICAgICAgIHJldHVybiBuZXcgVXNlckluaXRpYWxEZXRhaWxzRmV0Y2hlZENvbXBsZXRlZChyZXMuZGF0YS50aW1lU2hlZXRCdXR0b25EZXRhaWxzKTtcclxuICAgICAgICB9KVxyXG4gICAgICAgIClcclxuICAgIH0pXHJcbiAgKTtcclxuXHJcbiAgQEVmZmVjdCgpXHJcbiAgZmV0Y2hVc2VyVGltZVNoZWV0QnV0dG9uRGV0YWlscyQ6IE9ic2VydmFibGU8QWN0aW9uPiA9IHRoaXMuYWN0aW9ucyQucGlwZShcclxuICAgIG9mVHlwZTxGZXRjaFRpbWVTaGVldEJ1dHRvbkRldGFpbHM+KFxyXG4gICAgICBBdXRoZW50aWNhdGlvbkFjdGlvblR5cGVzLkZldGNoVGltZVNoZWV0QnV0dG9uRGV0YWlsc1xyXG4gICAgKSxcclxuICAgIHN3aXRjaE1hcCgoKSA9PiB7XHJcbiAgICAgIHJldHVybiAgdGhpcy5jb21tb25TZXJ2aWNlLmdldFRpbWVTaGVldEVuYWJsZWRJbmZvcm1hdGlvbigpXHJcbiAgICAgICAgLnBpcGUobWFwKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IFVzZXJJbml0aWFsRGV0YWlsc0ZldGNoZWRDb21wbGV0ZWQocmVzKTtcclxuICAgICAgICB9KVxyXG4gICAgICAgIClcclxuICAgIH0pXHJcbiAgKTtcclxuXHJcbiAgLy8gQEVmZmVjdCgpXHJcbiAgLy8gaW5pdGlhbGl6ZUNvbXBhbnlTZXR0aW5nc0xvZ2luRGF0YUZvclVzZXJDb21wbGV0ZWQ6IE9ic2VydmFibGU8QWN0aW9uPiA9IHRoaXMuYWN0aW9ucyQucGlwZShcclxuICAvLyAgIG9mVHlwZTxVc2VySW5pdGlhbERldGFpbHNGZXRjaGVkQ29tcGxldGVkPihcclxuICAvLyAgICAgQXV0aGVudGljYXRpb25BY3Rpb25UeXBlcy5Vc2VySW5pdGlhbERldGFpbHNGZXRjaGVkQ29tcGxldGVkXHJcbiAgLy8gICApLFxyXG4gIC8vICAgcGlwZShcclxuICAvLyAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xyXG4gIC8vICAgICAgIHJldHVybiBuZXcgR2V0Q29tcGFueVNldHRpbmdzQ29tcGxldGVkKHJlcy5jb21wYW55U2V0dGluZ3MpO1xyXG4gIC8vICAgICB9KVxyXG4gIC8vICAgKVxyXG4gIC8vICk7XHJcblxyXG4gIC8vIEBFZmZlY3QoKVxyXG4gIC8vIGluaXRpYWxpemVFbnRpdHlSb2xlRmVhdHVyZXNMb2dpbkRhdGFGb3JVc2VyQ29tcGxldGVkOiBPYnNlcnZhYmxlPEFjdGlvbj4gPSB0aGlzLmFjdGlvbnMkLnBpcGUoXHJcbiAgLy8gICBvZlR5cGU8VXNlckluaXRpYWxEZXRhaWxzRmV0Y2hlZENvbXBsZXRlZD4oXHJcbiAgLy8gICAgIEF1dGhlbnRpY2F0aW9uQWN0aW9uVHlwZXMuVXNlckluaXRpYWxEZXRhaWxzRmV0Y2hlZENvbXBsZXRlZFxyXG4gIC8vICAgKSxcclxuICAvLyAgIHBpcGUoXHJcbiAgLy8gICAgIG1hcCgocmVzOiBhbnkpID0+IHtcclxuICAvLyAgICAgICByZXR1cm4gbmV3IEVudGl0eVJlb2xlc0J5VXNlcklkRmV0Y2hDb21wbGV0ZWQocmVzLmVudGl0eUZlYXR1cmVzKTtcclxuICAvLyAgICAgfSlcclxuICAvLyAgIClcclxuICAvLyApO1xyXG5cclxuXHJcbiAgLy8gQEVmZmVjdCgpXHJcbiAgLy8gaW5pdGlhbGl6ZVNvZnRMYWJlbHNBZnRlckxvZ2luRGF0YUZvclVzZXIkOiBPYnNlcnZhYmxlPEFjdGlvbj4gPSB0aGlzLmFjdGlvbnMkLnBpcGUoXHJcbiAgLy8gICBvZlR5cGU8VXNlckRldGFpbHNGZXRjaGVkQWZ0ZXJMb2dpbj4oXHJcbiAgLy8gICAgIEF1dGhlbnRpY2F0aW9uQWN0aW9uVHlwZXMuVXNlckRldGFpbHNGZXRjaGVkQWZ0ZXJMb2dpblxyXG4gIC8vICAgKSxcclxuICAvLyAgIHBpcGUoXHJcbiAgLy8gICAgIG1hcCgoKSA9PiB7XHJcbiAgLy8gICAgICAgdmFyIHNvZnRMYWJlbHMgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKExvY2FsU3RvcmFnZVByb3BlcnRpZXMuU29mdExhYmVscykpO1xyXG4gIC8vICAgICAgIHJldHVybiBuZXcgR2V0c29mdExhYmVsc0NvbXBsZXRlZChzb2Z0TGFiZWxzKTtcclxuICAvLyAgICAgfSlcclxuICAvLyAgIClcclxuICAvLyApO1xyXG5cclxuICAvLyBARWZmZWN0KClcclxuICAvLyBpbml0aWFsaXplQWZ0ZXJHZXR0aW5nU29mdExhYmVscyQ6IE9ic2VydmFibGU8QWN0aW9uPiA9IHRoaXMuYWN0aW9ucyQucGlwZShcclxuICAvLyAgIG9mVHlwZTxVc2VyRGV0YWlsc0ZldGNoZWQ+KFxyXG4gIC8vICAgICBBdXRoZW50aWNhdGlvbkFjdGlvblR5cGVzLlVzZXJEZXRhaWxzRmV0Y2hlZFxyXG4gIC8vICAgKSxcclxuICAvLyAgIHBpcGUoXHJcbiAgLy8gICAgIG1hcCgoYWN0aW9uOiBhbnkpID0+IHsgICAgICAgIFxyXG4gIC8vICAgICAgIHZhciBmcm9tTG9nSW4gPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdGcm9tTG9nSW4nKSk7XHJcbiAgLy8gICAgICAgaWYoZnJvbUxvZ0luKSB7XHJcbiAgLy8gICAgICAgICByZXR1cm4gbmV3IEdldHNvZnRMYWJlbHNDb21wbGV0ZWQodGhpcy5sb2dJbkRhdGEuc29mdExhYmVscyk7XHJcbiAgLy8gICAgICAgfSBlbHNlIHtcclxuICAvLyAgICAgICAgIHZhciBjb25maWd1cmF0aW9ucyA9IG5ldyBTb2Z0TGFiZWxDb25maWd1cmF0aW9uTW9kZWwoKTtcclxuICAvLyAgICAgICAgICByZXR1cm4gbmV3IEdldHNvZnRMYWJlbHNUcmlnZ2VyZWQoY29uZmlndXJhdGlvbnMpO1xyXG4gIC8vICAgICAgIH0gICAgICAgIFxyXG4gIC8vICAgICB9KVxyXG4gIC8vICAgKVxyXG4gIC8vICk7XHJcblxyXG4gIC8vIEBFZmZlY3QoKVxyXG4gIC8vIGluaXRpYWxpemVBZnRlckdldHRpbmdSb2xlRmVhdHVyZXMkOiBPYnNlcnZhYmxlPEFjdGlvbj4gPSB0aGlzLmFjdGlvbnMkLnBpcGUoXHJcbiAgLy8gICBvZlR5cGU8VXNlckRldGFpbHNGZXRjaGluZz4oXHJcbiAgLy8gICAgIEF1dGhlbnRpY2F0aW9uQWN0aW9uVHlwZXMuVXNlckRldGFpbHNGZXRjaGVkXHJcbiAgLy8gICApLFxyXG4gIC8vICAgcGlwZShcclxuICAvLyAgICAgbWFwKChhY3Rpb246IGFueSkgPT4ge1xyXG4gIC8vICAgICAgLy8gdmFyIHJvbGVzID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ1JvbGVzJyk7XHJcbiAgLy8gICAgICB2YXIgZnJvbUxvZ0luID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnRnJvbUxvZ0luJykpO1xyXG4gIC8vICAgICAgIGlmKGZyb21Mb2dJbikge1xyXG4gIC8vICAgICAgIHJldHVybiBuZXcgUm9sZURldGFpbHNGZXRjaGVkKHRoaXMubG9nSW5EYXRhLnJvbGVGZWF0dXJlcyk7XHJcbiAgLy8gICAgICAgfSBlbHNlIHtcclxuICAvLyAgICAgICAgIHJldHVybiBuZXcgUm9sZURldGFpbHNGZXRjaE9uUmVsb2FkKCk7XHJcbiAgLy8gICAgICAgfVxyXG4gIC8vICAgICB9KVxyXG4gIC8vICAgKVxyXG4gIC8vICk7XHJcblxyXG4gIC8vIEBFZmZlY3QoKVxyXG4gIC8vIGluaXRpYWxpemVUaGVtZUFmdGVyTG9naW4kOiBPYnNlcnZhYmxlPEFjdGlvbj4gPSB0aGlzLmFjdGlvbnMkLnBpcGUoXHJcbiAgLy8gICBvZlR5cGU8VXNlckRldGFpbHNGZXRjaGVkPihcclxuICAvLyAgICAgQXV0aGVudGljYXRpb25BY3Rpb25UeXBlcy5Vc2VyRGV0YWlsc0ZldGNoZWRcclxuICAvLyAgICksXHJcbiAgLy8gICBwaXBlKFxyXG4gIC8vICAgICBtYXAoKCkgPT4ge1xyXG4gIC8vICAgICAgIHJldHVybiBuZXcgR2V0Q29tcGFueVRoZW1lVHJpZ2dlcmVkKCk7XHJcbiAgLy8gICAgIH0pXHJcbiAgLy8gICApXHJcbiAgLy8gKTtcclxuXHJcbiAgQEVmZmVjdCgpXHJcbiAgZ2V0dGluZ1JvbGVEZXRhaWxzQWZ0ZXJJbml0aWFsaXplTG9naW5EYXRhJDogT2JzZXJ2YWJsZTxBY3Rpb24+ID0gdGhpcy5hY3Rpb25zJC5waXBlKFxyXG4gICAgb2ZUeXBlPEVudGl0eVJvbGVzRmV0Y2hUcmlnZ2VyZWQ+KFxyXG4gICAgICBBdXRoZW50aWNhdGlvbkFjdGlvblR5cGVzLkVudGl0eVJvbGVzRmV0Y2hUcmlnZ2VyZWRcclxuICAgICksXHJcbiAgICBzd2l0Y2hNYXAoKGFjdGlvbikgPT4ge1xyXG4gICAgICByZXR1cm4gdGhpcy5mZWF0dXJlU2VydmljZS5nZXRBbGxQZXJtaXR0ZWRFbnRpdHlSb2xlRmVhdHVyZXMoYWN0aW9uLnByb2plY3RJZCkucGlwZShcclxuICAgICAgICBtYXAoKHJvbGVGZWF0dXJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAocm9sZUZlYXR1cmVzLnN1Y2Nlc3MpIHtcclxuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oTG9jYWxTdG9yYWdlUHJvcGVydGllcy5FbnRpdHlSb2xlRmVhdHVyZXMsIEpTT04uc3RyaW5naWZ5KHJvbGVGZWF0dXJlcy5kYXRhKSk7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgRW50aXR5Um9sZURldGFpbHNGZXRjaGVkKHJvbGVGZWF0dXJlcy5kYXRhKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VzID0gcm9sZUZlYXR1cmVzLmFwaVJlc3BvbnNlTWVzc2FnZXM7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgUm9sZXNGZXRjaEZhaWxlZChyb2xlRmVhdHVyZXMuYXBpUmVzcG9uc2VNZXNzYWdlcyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICAgIH0pXHJcbiAgKTtcclxuXHJcbiAgQEVmZmVjdCgpXHJcbiAgY29tcGFueVNldHRpbmdzVHJpZ2dlcmVkJDogT2JzZXJ2YWJsZTxBY3Rpb24+ID0gdGhpcy5hY3Rpb25zJC5waXBlKFxyXG4gICAgb2ZUeXBlPFVzZXJEZXRhaWxzRmV0Y2hlZD4oXHJcbiAgICAgIEF1dGhlbnRpY2F0aW9uQWN0aW9uVHlwZXMuVXNlckRldGFpbHNGZXRjaGVkXHJcbiAgICApLFxyXG4gICAgcGlwZShcclxuICAgICAgbWFwKCgpID0+IHtcclxuICAgICAgICB2YXIgY29tcGFueVNldHRpbmdzTW9kZWwgPSBuZXcgQ29tcGFueXNldHRpbmdzTW9kZWwoKTtcclxuICAgICAgICBjb21wYW55U2V0dGluZ3NNb2RlbC5pc0FyY2hpdmVkID0gZmFsc2U7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBHZXRDb21wYW55U2V0dGluZ3NUcmlnZ2VyZWQoY29tcGFueVNldHRpbmdzTW9kZWwpO1xyXG4gICAgICB9KVxyXG4gICAgKVxyXG4gICk7XHJcblxyXG4gIEBFZmZlY3QoKVxyXG4gIGVudGl0eVJvbGVzVFJpZ2dlcmVkJDogT2JzZXJ2YWJsZTxBY3Rpb24+ID0gdGhpcy5hY3Rpb25zJC5waXBlKFxyXG4gICAgb2ZUeXBlPFVzZXJEZXRhaWxzRmV0Y2hlZD4oXHJcbiAgICAgIEF1dGhlbnRpY2F0aW9uQWN0aW9uVHlwZXMuVXNlckRldGFpbHNGZXRjaGVkXHJcbiAgICApLFxyXG4gICAgcGlwZShcclxuICAgICAgbWFwKCgpID0+IHtcclxuICAgICAgICByZXR1cm4gbmV3IEVudGl0eVJvbGVzQnlVc2VySWRGZXRjaFRyaWdnZXJlZChcIm51bGxcIiwgXCJudWxsXCIsIGZhbHNlKTtcclxuICAgICAgfSlcclxuICAgIClcclxuICApO1xyXG5cclxuICAvLyBARWZmZWN0KClcclxuICAvLyBjb21wYW55U2V0dGluZ3NUcmlnZ2VyZWRBZnRlckxvZ2luJDogT2JzZXJ2YWJsZTxBY3Rpb24+ID0gdGhpcy5hY3Rpb25zJC5waXBlKFxyXG4gIC8vICAgb2ZUeXBlPFVzZXJEZXRhaWxzRmV0Y2hlZEFmdGVyTG9naW4+KFxyXG4gIC8vICAgICBBdXRoZW50aWNhdGlvbkFjdGlvblR5cGVzLlVzZXJEZXRhaWxzRmV0Y2hlZEFmdGVyTG9naW5cclxuICAvLyAgICksXHJcbiAgLy8gICBwaXBlKFxyXG4gIC8vICAgICBtYXAoKCkgPT4ge1xyXG4gIC8vICAgICAgIHZhciBjb21wYW55U2V0dGluZ3NNb2RlbCA9IG5ldyBDb21wYW55c2V0dGluZ3NNb2RlbCgpO1xyXG4gIC8vICAgICAgIGNvbXBhbnlTZXR0aW5nc01vZGVsLmlzQXJjaGl2ZWQgPSBmYWxzZTtcclxuICAvLyAgICAgICByZXR1cm4gbmV3IEdldENvbXBhbnlTZXR0aW5nc1RyaWdnZXJlZChjb21wYW55U2V0dGluZ3NNb2RlbCk7XHJcbiAgLy8gICAgIH0pXHJcbiAgLy8gICApXHJcbiAgLy8gKTtcclxuXHJcbiAgLy8gQEVmZmVjdCgpXHJcbiAgLy8gZW50aXR5Um9sZXNUUmlnZ2VyZWRBZnRlckxvZ2luJDogT2JzZXJ2YWJsZTxBY3Rpb24+ID0gdGhpcy5hY3Rpb25zJC5waXBlKFxyXG4gIC8vICAgb2ZUeXBlPFVzZXJEZXRhaWxzRmV0Y2hlZEFmdGVyTG9naW4+KFxyXG4gIC8vICAgICBBdXRoZW50aWNhdGlvbkFjdGlvblR5cGVzLlVzZXJEZXRhaWxzRmV0Y2hlZEFmdGVyTG9naW5cclxuICAvLyAgICksXHJcbiAgLy8gICBwaXBlKFxyXG4gIC8vICAgICBtYXAoKCkgPT4ge1xyXG4gIC8vICAgICAgIHJldHVybiBuZXcgRW50aXR5Um9sZXNCeVVzZXJJZEZldGNoVHJpZ2dlcmVkKFwibnVsbFwiLCBcIm51bGxcIiwgZmFsc2UpO1xyXG4gIC8vICAgICB9KVxyXG4gIC8vICAgKVxyXG4gIC8vICk7XHJcblxyXG4gIEBFZmZlY3QoKVxyXG4gIGxvYWRDb21wYW55U2V0dGluZ3MkOiBPYnNlcnZhYmxlPEFjdGlvbj4gPSB0aGlzLmFjdGlvbnMkLnBpcGUoXHJcbiAgICBvZlR5cGU8R2V0Q29tcGFueVNldHRpbmdzVHJpZ2dlcmVkPihcclxuICAgICAgQXV0aGVudGljYXRpb25BY3Rpb25UeXBlcy5HZXRDb21wYW55U2V0dGluZ3NUcmlnZ2VyZWRcclxuICAgICksXHJcbiAgICBzd2l0Y2hNYXAoKGFjdGlvbikgPT4ge1xyXG4gICAgICByZXR1cm4gdGhpcy51c2VyU2VydmljZS5nZXRBbGxDb21wYW55U2V0dGluZ3NEZXRhaWxzKGFjdGlvbi5jb21wYW55U2V0dGluZ3NNb2RlbCkucGlwZShcclxuICAgICAgICBtYXAoKHJvbGVGZWF0dXJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAocm9sZUZlYXR1cmVzLnN1Y2Nlc3MpIHtcclxuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oTG9jYWxTdG9yYWdlUHJvcGVydGllcy5Db21wYW55U2V0dGluZ3MsIEpTT04uc3RyaW5naWZ5KHJvbGVGZWF0dXJlcy5kYXRhKSk7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgR2V0Q29tcGFueVNldHRpbmdzQ29tcGxldGVkKHJvbGVGZWF0dXJlcy5kYXRhKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgR2V0Q29tcGFueVNldHRpbmdzRmFpbGVkKHJvbGVGZWF0dXJlcy5hcGlSZXNwb25zZU1lc3NhZ2VzKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gICAgfSlcclxuICApO1xyXG5cclxuICBARWZmZWN0KClcclxuICBnZXR0aW5nUm9sZURldGFpbHNCeVVzZXJJZEFmdGVySW5pdGlhbGl6ZUxvZ2luRGF0YSQ6IE9ic2VydmFibGU8QWN0aW9uPiA9IHRoaXMuYWN0aW9ucyQucGlwZShcclxuICAgIG9mVHlwZTxFbnRpdHlSb2xlc0J5VXNlcklkRmV0Y2hUcmlnZ2VyZWQ+KFxyXG4gICAgICBBdXRoZW50aWNhdGlvbkFjdGlvblR5cGVzLkVudGl0eVJvbGVzQnlVc2VySWRGZXRjaFRyaWdnZXJlZFxyXG4gICAgKSxcclxuICAgIHN3aXRjaE1hcChhY3Rpb24gPT4ge1xyXG4gICAgICBpZiAoYWN0aW9uLnJlcXVpcmVkVHlwZSA9PSAnZ29hbCcpIHtcclxuICAgICAgICB0aGlzLmdvYWxJZCA9IGFjdGlvbi5wcm9qZWN0SWQ7XHJcbiAgICAgICAgdGhpcy51c2VyU3RvcnlJZCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5zcHJpbnRJZCA9IG51bGw7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAoYWN0aW9uLnJlcXVpcmVkVHlwZSA9PSAndXNlclN0b3J5Jykge1xyXG4gICAgICAgIHRoaXMudXNlclN0b3J5SWQgPSBhY3Rpb24ucHJvamVjdElkO1xyXG4gICAgICAgIHRoaXMuZ29hbElkID0gbnVsbDtcclxuICAgICAgICB0aGlzLnNwcmludElkID0gbnVsbDtcclxuICAgICAgfSBlbHNlIGlmIChhY3Rpb24ucmVxdWlyZWRUeXBlID09ICdzcHJpbnQnKSB7XHJcbiAgICAgICAgdGhpcy5zcHJpbnRJZCA9IGFjdGlvbi5wcm9qZWN0SWQ7XHJcbiAgICAgICAgdGhpcy5nb2FsSWQgPSBudWxsO1xyXG4gICAgICAgIHRoaXMudXNlclN0b3J5SWQgPSBudWxsO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRoaXMudXNlclN0b3J5SWQgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuZ29hbElkID0gbnVsbDtcclxuICAgICAgICB0aGlzLnNwcmludElkID0gbnVsbDtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmlzU3ByaW50VHlwZSA9IGFjdGlvbi5pc1NwcmludFR5cGU7XHJcbiAgICAgIHJldHVybiB0aGlzLmZlYXR1cmVTZXJ2aWNlLmdldEFsbFBlcm1pdHRlZEVudGl0eVJvbGVGZWF0dXJlc0J5VXNlcklkKCkucGlwZShcclxuICAgICAgICBtYXAoKHJvbGVGZWF0dXJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAocm9sZUZlYXR1cmVzLnN1Y2Nlc3MpIHtcclxuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oTG9jYWxTdG9yYWdlUHJvcGVydGllcy5Vc2VyUm9sZUZlYXR1cmVzLCBKU09OLnN0cmluZ2lmeShyb2xlRmVhdHVyZXMuZGF0YSkpO1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IEVudGl0eVJlb2xlc0J5VXNlcklkRmV0Y2hDb21wbGV0ZWQocm9sZUZlYXR1cmVzLmRhdGEpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy52YWxpZGF0aW9uTWVzc2FnZXMgPSByb2xlRmVhdHVyZXMuYXBpUmVzcG9uc2VNZXNzYWdlcztcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBFbnRpdHlSb2xlc0J5VXNlcklkRmV0Y2hGYWlsZWQocm9sZUZlYXR1cmVzLmFwaVJlc3BvbnNlTWVzc2FnZXMpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIGNhdGNoRXJyb3IoZXJyID0+IHtcclxuICAgICAgICAgIHJldHVybiBvZihuZXcgRXhjZXB0aW9uSGFuZGxlZChlcnIpKTtcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gICAgfSlcclxuICApO1xyXG5cclxuICBARWZmZWN0KClcclxuICBpbml0aWFsaXplQWZ0ZXJMb2dpbkRhdGEyJDogT2JzZXJ2YWJsZTxBY3Rpb24+ID0gdGhpcy5hY3Rpb25zJC5waXBlKFxyXG4gICAgb2ZUeXBlPEluaXRpYWxpemVBZnRlckxvZ2luRGF0YT4oXHJcbiAgICAgIEF1dGhlbnRpY2F0aW9uQWN0aW9uVHlwZXMuSW5pdGlhbGl6ZUFmdGVyTG9naW5EYXRhXHJcbiAgICApLFxyXG4gICAgc3dpdGNoTWFwKChhY3Rpb24pID0+IHtcclxuICAgICAgcmV0dXJuIHRoaXMudXNlclNlcnZpY2UuZ2V0TG9nZ2VkSW5Vc2VyKCkucGlwZShcclxuICAgICAgICBtYXAoKHVzZXJSZWNvcmQ6IGFueSkgPT4ge1xyXG4gICAgICAgICAgY29uc29sZS5sb2codGhpcy53aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO1xyXG4gICAgICAgICAgbGV0IGVudmlyb25tZW50ID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbShMb2NhbFN0b3JhZ2VQcm9wZXJ0aWVzLkVudmlyb25tZW50KSk7XHJcbiAgICAgICAgICB0aGlzLmNvb2tpZVNlcnZpY2Uuc2V0KExvY2FsU3RvcmFnZVByb3BlcnRpZXMuQ3VycmVudFVzZXJJZCwgdXNlclJlY29yZC5kYXRhLmlkLCBudWxsLFxyXG4gICAgICAgICAgICBlbnZpcm9ubWVudC5jb29raWVQYXRoLCB0aGlzLndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSwgZmFsc2UsIFwiU3RyaWN0XCIpO1xyXG4gICAgICAgICAgdGhpcy5jb29raWVTZXJ2aWNlLnNldChMb2NhbFN0b3JhZ2VQcm9wZXJ0aWVzLkNvbXBhbnlOYW1lLCB1c2VyUmVjb3JkLmRhdGEuY29tcGFueU5hbWUsIG51bGwsIGVudmlyb25tZW50LmNvb2tpZVBhdGgsIHRoaXMud2luZG93LmxvY2F0aW9uLmhvc3RuYW1lLCBmYWxzZSwgXCJTdHJpY3RcIik7XHJcbiAgICAgICAgICB0aGlzLmNvb2tpZVNlcnZpY2Uuc2V0KExvY2FsU3RvcmFnZVByb3BlcnRpZXMuQ29tcGFueUlkLCB1c2VyUmVjb3JkLmRhdGEuY29tcGFueUlkLCBudWxsLCBlbnZpcm9ubWVudC5jb29raWVQYXRoLCB0aGlzLndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSwgZmFsc2UsIFwiU3RyaWN0XCIpO1xyXG4gICAgICAgICAgcmV0dXJuIG5ldyBVc2VyRGV0YWlsc0ZldGNoZWQodXNlclJlY29yZC5kYXRhKTtcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gICAgfSlcclxuICApO1xyXG5cclxuICBARWZmZWN0KClcclxuICBzaG93VmFsaWRhdGlvbk1lc3NhZ2VzRm9Sb2xlRmVhdHVyZXMkOiBPYnNlcnZhYmxlPFxyXG4gICAgQWN0aW9uXHJcbiAgPiA9IHRoaXMuYWN0aW9ucyQucGlwZShcclxuICAgIG9mVHlwZTxSb2xlc0ZldGNoRmFpbGVkPihcclxuICAgICAgQXV0aGVudGljYXRpb25BY3Rpb25UeXBlcy5Sb2xlc0ZldGNoRmFpbGVkXHJcbiAgICApLFxyXG4gICAgcGlwZShcclxuICAgICAgbWFwKFxyXG4gICAgICAgICgpID0+IHtcclxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy52YWxpZGF0aW9uTWVzc2FnZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBTaG93RXhjZXB0aW9uTWVzc2FnZXMoe1xyXG4gICAgICAgICAgICAgIG1lc3NhZ2U6IHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VzW2ldLm1lc3NhZ2UgLy8gVE9ETzogQ2hhbmdlIHRvIHByb3BlciB0b2FzdCBtZXNzYWdlXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgKVxyXG4gICAgKVxyXG4gICk7XHJcblxyXG4gIEBFZmZlY3QoKVxyXG4gIHNob3dWYWxpZGF0aW9uTWVzc2FnZXNGb3JFbnRpdHlSb2xlcyQ6IE9ic2VydmFibGU8XHJcbiAgICBBY3Rpb25cclxuICA+ID0gdGhpcy5hY3Rpb25zJC5waXBlKFxyXG4gICAgb2ZUeXBlPEVudGl0eVJvbGVzQnlVc2VySWRGZXRjaEZhaWxlZD4oXHJcbiAgICAgIEF1dGhlbnRpY2F0aW9uQWN0aW9uVHlwZXMuRW50aXR5Um9sZXNCeVVzZXJJZEZldGNoRmFpbGVkXHJcbiAgICApLFxyXG4gICAgc3dpdGNoTWFwKChzZWFyY2hBY3Rpb24pID0+IHtcclxuICAgICAgcmV0dXJuIG9mKG5ldyBTaG93VmFsaWRhdGlvbk1lc3NhZ2VzKHtcclxuICAgICAgICB2YWxpZGF0aW9uTWVzc2FnZXM6IHNlYXJjaEFjdGlvbi52YWxpZGF0aW9uTWVzc2FnZXNcclxuICAgICAgfSlcclxuICAgICAgKVxyXG4gICAgfSlcclxuICApO1xyXG5cclxuICBARWZmZWN0KClcclxuICBzaG93VmFsaWRhdGlvbk1lc3NhZ2VzRm9yQ29tcGFueVNldHRpbmdzJDogT2JzZXJ2YWJsZTxcclxuICAgIEFjdGlvblxyXG4gID4gPSB0aGlzLmFjdGlvbnMkLnBpcGUoXHJcbiAgICBvZlR5cGU8R2V0Q29tcGFueVNldHRpbmdzRmFpbGVkPihcclxuICAgICAgQXV0aGVudGljYXRpb25BY3Rpb25UeXBlcy5HZXRDb21wYW55U2V0dGluZ3NGYWlsZWRcclxuICAgICksXHJcbiAgICBzd2l0Y2hNYXAoKHNlYXJjaEFjdGlvbikgPT4ge1xyXG4gICAgICByZXR1cm4gb2YobmV3IFNob3dWYWxpZGF0aW9uTWVzc2FnZXMoe1xyXG4gICAgICAgIHZhbGlkYXRpb25NZXNzYWdlczogc2VhcmNoQWN0aW9uLnZhbGlkYXRpb25NZXNzYWdlc1xyXG4gICAgICB9KVxyXG4gICAgICApXHJcbiAgICB9KVxyXG4gICk7XHJcblxyXG4gIEBFZmZlY3QoKVxyXG4gIGRlbW9EYXRhQ2xlYXJFdmVudFRyaWdncmVkJDogT2JzZXJ2YWJsZTxBY3Rpb24+ID0gdGhpcy5hY3Rpb25zJC5waXBlKFxyXG4gICAgb2ZUeXBlPENsZWFyRGVtb0RhdGFUcmlnZ3JlZD4oXHJcbiAgICAgIEF1dGhlbnRpY2F0aW9uQWN0aW9uVHlwZXMuQ2xlYXJEZW1vRGF0YVRyaWdncmVkXHJcbiAgICApLFxyXG4gICAgc3dpdGNoTWFwKChhY3Rpb24pID0+IHtcclxuICAgICAgcmV0dXJuIHRoaXMuZmVhdHVyZVNlcnZpY2UuY2xlYXJEZW1vRGF0YSgpLnBpcGUoXHJcbiAgICAgICAgbWFwKChyZXNwb25zZTogYW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzcG9uc2Uuc3VjY2Vzcykge1xyXG4gICAgICAgICAgICB0aGlzLnRvYXN0ci5zdWNjZXNzKFwiRGVtbyBkYXRhIGNsZWFyZWQgc3VjY2Vzc2Z1bGx5XCIpO1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IENsZWFyRGVtb0RhdGFDb21wbGV0ZWQocmVzcG9uc2UuZGF0YSk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlcyA9IHJlc3BvbnNlLmFwaVJlc3BvbnNlTWVzc2FnZXM7XHJcbiAgICAgICAgICAgIHRoaXMudG9hc3RyLmVycm9yKHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VzWzBdLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IENsZWFyRGVtb0RhdGFGYWlsZWQocmVzcG9uc2UuYXBpUmVzcG9uc2VNZXNzYWdlcyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICAgIH0pXHJcbiAgKTtcclxuXHJcbiAgQEVmZmVjdCgpXHJcbiAgZ2V0VGhlbWVDb2xvciQ6IE9ic2VydmFibGU8QWN0aW9uPiA9IHRoaXMuYWN0aW9ucyQucGlwZShcclxuICAgIG9mVHlwZTxHZXRDb21wYW55VGhlbWVUcmlnZ2VyZWQ+KFxyXG4gICAgICBBdXRoZW50aWNhdGlvbkFjdGlvblR5cGVzLkdldENvbXBhbnlUaGVtZVRyaWdnZXJlZCxcclxuICAgICksXHJcbiAgICBzd2l0Y2hNYXAoYWN0aW9uID0+IHtcclxuICAgICAgcmV0dXJuIHRoaXMuYXV0aGVudGljYXRpb25TZXJ2aWNlLmdldFRoZW1lcygpLnBpcGUoXHJcbiAgICAgICAgbWFwKChyZXNwb25zZTogYW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAocmVzcG9uc2Uuc3VjY2Vzcykge1xyXG4gICAgICAgICAgICBsZXQgZW52aXJvbm1lbnQgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKExvY2FsU3RvcmFnZVByb3BlcnRpZXMuRW52aXJvbm1lbnQpKTtcclxuICAgICAgICAgICAgdGhpcy5jb29raWVTZXJ2aWNlLnNldChMb2NhbFN0b3JhZ2VQcm9wZXJ0aWVzLkNvbXBhbnlUaGVtZSwgSlNPTi5zdHJpbmdpZnkocmVzcG9uc2UuZGF0YSksIG51bGwsIGVudmlyb25tZW50LmNvb2tpZVBhdGgsIHRoaXMud2luZG93LmxvY2F0aW9uLmhvc3RuYW1lLCBmYWxzZSwgXCJTdHJpY3RcIik7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgR2V0Q29tcGFueVRoZW1lQ29tcGxldGVkKHJlc3BvbnNlLmRhdGEpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgR2V0Q29tcGFueVRoZW1lRmFpbGVkKHJlc3BvbnNlLmFwaVJlc3BvbnNlTWVzc2FnZXMpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgICB9KVxyXG4gICk7XHJcblxyXG4gIEBFZmZlY3QoKVxyXG4gIGRlbW9EYXRhQ2xlYXJFdmVudFN1Y2Nlc3NmdWwkOiBPYnNlcnZhYmxlPFxyXG4gICAgQWN0aW9uXHJcbiAgPiA9IHRoaXMuYWN0aW9ucyQucGlwZShcclxuICAgIG9mVHlwZTxDbGVhckRlbW9EYXRhQ29tcGxldGVkPihcclxuICAgICAgQXV0aGVudGljYXRpb25BY3Rpb25UeXBlcy5DbGVhckRlbW9EYXRhQ29tcGxldGVkXHJcbiAgICApLFxyXG4gICAgcGlwZShcclxuICAgICAgbWFwKCgpID0+IHtcclxuICAgICAgICByZXR1cm4gbmV3IEluaXRpYWxpemVBZnRlckxvZ2luRGF0YSgpO1xyXG4gICAgICB9KVxyXG4gICAgKVxyXG4gICk7XHJcblxyXG4gIC8vIEBFZmZlY3QoKVxyXG4gIC8vIGxvYWRHb2FsQW5kVXNlclN0b3J5RGF0YSQ6IE9ic2VydmFibGU8XHJcbiAgLy8gICBBY3Rpb25cclxuICAvLyA+ID0gdGhpcy5hY3Rpb25zJC5waXBlKFxyXG4gIC8vICAgb2ZUeXBlPEVudGl0eVJlb2xlc0J5VXNlcklkRmV0Y2hDb21wbGV0ZWQ+KFxyXG4gIC8vICAgICBBdXRoZW50aWNhdGlvbkFjdGlvblR5cGVzLkVudGl0eVJlb2xlc0J5VXNlcklkRmV0Y2hDb21wbGV0ZWRcclxuICAvLyAgICksXHJcbiAgLy8gICBwaXBlKFxyXG4gIC8vICAgICBtYXAoKCkgPT4ge1xyXG4gIC8vICAgICAgIGlmICh0aGlzLmdvYWxJZCkge1xyXG4gIC8vICAgICAgICAgcmV0dXJuIG5ldyBHZXRVbmlxdWVHb2FsQnlJZFRyaWdnZXJlZCh0aGlzLmdvYWxJZCk7XHJcbiAgLy8gICAgICAgfVxyXG4gIC8vICAgICAgIGVsc2UgaWYgKHRoaXMudXNlclN0b3J5SWQpIHtcclxuICAvLyAgICAgICAgIGlmICh0aGlzLmlzU3ByaW50VHlwZSkge1xyXG4gIC8vICAgICAgICAgICByZXR1cm4gbmV3IEdldFVuaXF1ZVNwcmludFdvcmtJdGVtQnlJZFRyaWdnZXJlZCh0aGlzLnVzZXJTdG9yeUlkKTtcclxuICAvLyAgICAgICAgIH0gZWxzZSB7XHJcbiAgLy8gICAgICAgICAgIHJldHVybiBuZXcgR2V0VW5pcXVlVXNlclN0b3J5QnlJZFRyaWdnZXJlZCh0aGlzLnVzZXJTdG9yeUlkKTtcclxuICAvLyAgICAgICAgIH1cclxuICAvLyAgICAgICB9IGVsc2UgaWYgKHRoaXMuc3ByaW50SWQpIHtcclxuICAvLyAgICAgICAgIHJldHVybiBuZXcgR2V0VW5pcXVlU3ByaW50c0J5SWRUcmlnZ2VyZWQodGhpcy5zcHJpbnRJZCk7XHJcbiAgLy8gICAgICAgfVxyXG4gIC8vICAgICAgIGVsc2Uge1xyXG4gIC8vICAgICAgICAgcmV0dXJuIG5ldyBBcmNoaXZlVW5BcmNoaXZlR29hbENvbXBsZXRlZCgpO1xyXG4gIC8vICAgICAgIH1cclxuXHJcbiAgLy8gICAgIH0pXHJcbiAgLy8gICApXHJcbiAgLy8gKTtcclxuXHJcbiAgQEVmZmVjdCgpXHJcbiAgZ2V0VXNlclN0b3JlSWREZXRhaWxzJDogT2JzZXJ2YWJsZTxBY3Rpb24+ID0gdGhpcy5hY3Rpb25zJC5waXBlKFxyXG4gICAgb2ZUeXBlPEdldFVzZXJTdG9yZUlkVHJpZ2dlcmVkPihBdXRoZW50aWNhdGlvbkFjdGlvblR5cGVzLkdldFVzZXJTdG9yZUlkVHJpZ2dlcmVkKSxcclxuICAgIHN3aXRjaE1hcChzZWFyY2hBY3Rpb24gPT4ge1xyXG4gICAgICByZXR1cm4gdGhpcy51c2VyU2VydmljZVxyXG4gICAgICAgIC5nZXRTdG9yZXMoc2VhcmNoQWN0aW9uLnNlYXJjaFVzZXJTdG9yZURldGFpbHNNb2RlbClcclxuICAgICAgICAucGlwZShtYXAoKHN0b3JlRGF0YTogYW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAoc3RvcmVEYXRhLnN1Y2Nlc3MgPT09IHRydWUpXHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgR2V0VXNlclN0b3JlSWRDb21wbGV0ZWQoc3RvcmVEYXRhLmRhdGFbMF0pO1xyXG4gICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICByZXR1cm4gbmV3IEdldFVzZXJTdG9yZUlkRmFpbGVkKHN0b3JlRGF0YS5hcGlSZXNwb25zZU1lc3NhZ2VzKTtcclxuICAgICAgICB9KSxcclxuICAgICAgICAgIGNhdGNoRXJyb3IoZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gb2YobmV3IEV4Y2VwdGlvbkhhbmRsZWQoZXJyb3IpKTtcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgKTtcclxuICAgIH0pXHJcbiAgKTtcclxuXHJcbiAgQEVmZmVjdCgpXHJcbiAgc2hvd1ZhbGlkYXRpb25NZXNzYWdlc0ZvckdldFVzZXJTdG9yZUlkJDogT2JzZXJ2YWJsZTxBY3Rpb24+ID0gdGhpcy5hY3Rpb25zJC5waXBlKFxyXG4gICAgb2ZUeXBlPEdldFVzZXJTdG9yZUlkRmFpbGVkPihBdXRoZW50aWNhdGlvbkFjdGlvblR5cGVzLkdldFVzZXJTdG9yZUlkRmFpbGVkKSxcclxuICAgIHN3aXRjaE1hcChzZWFyY2hBY3Rpb24gPT4ge1xyXG4gICAgICByZXR1cm4gb2YobmV3IFNob3dWYWxpZGF0aW9uTWVzc2FnZXMoe1xyXG4gICAgICAgIHZhbGlkYXRpb25NZXNzYWdlczogc2VhcmNoQWN0aW9uLnZhbGlkYXRpb25NZXNzYWdlcyxcclxuICAgICAgfSlcclxuICAgICAgKVxyXG4gICAgfSlcclxuICApO1xyXG5cclxuICBARWZmZWN0KClcclxuICBleGNlcHRpb25IYW5kbGVkJDogT2JzZXJ2YWJsZTxBY3Rpb24+ID0gdGhpcy5hY3Rpb25zJC5waXBlKFxyXG4gICAgb2ZUeXBlPEV4Y2VwdGlvbkhhbmRsZWQ+KEF1dGhlbnRpY2F0aW9uQWN0aW9uVHlwZXMuRXhjZXB0aW9uSGFuZGxlZCksXHJcbiAgICBzd2l0Y2hNYXAoc2VhcmNoQWN0aW9uID0+IHtcclxuICAgICAgcmV0dXJuIG9mKG5ldyBTaG93RXhjZXB0aW9uTWVzc2FnZXMoe1xyXG4gICAgICAgIG1lc3NhZ2U6IHNlYXJjaEFjdGlvbi5lcnJvck1lc3NhZ2UsIC8vIFRPRE86IENoYW5nZSB0byBwcm9wZXIgdG9hc3QgbWVzc2FnZVxyXG4gICAgICB9KVxyXG4gICAgICApXHJcbiAgICB9KVxyXG4gICk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBhY3Rpb25zJDogQWN0aW9ucyxcclxuICAgIHByaXZhdGUgYXV0aGVudGljYXRpb25TZXJ2aWNlOiBBdXRoZW50aWNhdGlvblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHVzZXJTZXJ2aWNlOiBDb21tb25TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBjb21tb25TZXJ2aWNlOiBDb21tb25TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBmZWF0dXJlU2VydmljZTogTWVudUl0ZW1TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBjb29raWVTZXJ2aWNlOiBDb29raWVTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB0b2FzdHI6IFRvYXN0clNlcnZpY2UsXHJcbiAgICBASW5qZWN0KFdJTkRPVykgcHJpdmF0ZSB3aW5kb3c6IFdpbmRvd1xyXG4gICkgeyB9XHJcbn1cclxuIl19
|