@thetradeengineorg1/snova-shell-module 0.0.260 → 0.0.261
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 -24
- package/bundles/thetradeengineorg1-snova-shell-module.umd.js +18874 -18874
- package/bundles/thetradeengineorg1-snova-shell-module.umd.js.map +1 -1
- package/esm2015/lib/globaldependencies/components/avatar.component.js +33 -33
- package/esm2015/lib/globaldependencies/components/componentbase.js +538 -538
- package/esm2015/lib/globaldependencies/constants/feature-ids.js +449 -449
- package/esm2015/lib/globaldependencies/constants/localstorage-properties.js +38 -38
- package/esm2015/lib/globaldependencies/helpers/dom.helper.js +70 -70
- package/esm2015/lib/globaldependencies/helpers/fontawesome-icons.js +144 -144
- package/esm2015/lib/globaldependencies/helpers/moment-utc-date-adapter.js +37 -37
- package/esm2015/lib/globaldependencies/helpers/window.helper.js +32 -32
- package/esm2015/lib/globaldependencies/intercepter/jwt.interceptor.js +40 -40
- package/esm2015/lib/globaldependencies/pipes/fetchSizedAndCachedImage.pipe.js +36 -36
- package/esm2015/lib/globaldependencies/pipes/highLightText.pipe.js +24 -24
- package/esm2015/lib/globaldependencies/pipes/orderby-pipe.js +24 -24
- package/esm2015/lib/globaldependencies/pipes/removeSpecialCharacters.pipe.js +22 -22
- package/esm2015/lib/globaldependencies/pipes/sanitize.pipe.js +24 -24
- package/esm2015/lib/globaldependencies/pipes/softlabels.pipes.js +346 -346
- package/esm2015/lib/globaldependencies/pipes/utctolocaltime.pipe.js +23 -23
- package/esm2015/lib/globaldependencies/pipes/utctolocaltimewithdate.pipe.js +25 -25
- package/esm2015/lib/globaldependencies/pipes/workflowstatus.pipes.js +27 -27
- package/esm2015/lib/shell-components/components/Payments/account.component.js +121 -121
- package/esm2015/lib/shell-components/components/Payments/company-information.js +558 -558
- package/esm2015/lib/shell-components/components/Payments/company-plans.component.js +636 -636
- package/esm2015/lib/shell-components/components/Payments/document.component.js +129 -129
- package/esm2015/lib/shell-components/components/Payments/payment-method.component.js +90 -90
- package/esm2015/lib/shell-components/components/Payments/product-service.component.js +438 -438
- package/esm2015/lib/shell-components/components/Payments/purchase-more-licenses.js +249 -249
- package/esm2015/lib/shell-components/components/Payments/transactions.component.js +172 -172
- package/esm2015/lib/shell-components/components/admin-layout/admin-layout.component.js +350 -350
- package/esm2015/lib/shell-components/components/all-work-items-dialog/all-work-items-dialog.component.js +102 -102
- package/esm2015/lib/shell-components/components/confirmation-dialog/confirmation-dialog.component.js +126 -126
- package/esm2015/lib/shell-components/components/export-import-configuration/export-configuration.component.js +502 -502
- package/esm2015/lib/shell-components/components/feed-time/feed-time-dialog.component.js +98 -98
- package/esm2015/lib/shell-components/components/feed-time/feed-time.component.js +87 -87
- package/esm2015/lib/shell-components/components/header-side/header-side.component.js +2342 -2342
- package/esm2015/lib/shell-components/components/header-top/header-top.component.js +489 -489
- package/esm2015/lib/shell-components/components/lives/lives-welcome-page.js +55 -55
- package/esm2015/lib/shell-components/components/menu/menu.component.js +3413 -3413
- package/esm2015/lib/shell-components/components/menu/searchTask.enum.js +10 -10
- package/esm2015/lib/shell-components/components/notifications/announcement-dialog.component.js +110 -110
- package/esm2015/lib/shell-components/components/notifications/notifications.component.js +534 -534
- package/esm2015/lib/shell-components/components/sidebar-top/sidebar-top.component.js +39 -39
- package/esm2015/lib/shell-components/components/sidenav/side-bar.component.js +148 -148
- package/esm2015/lib/shell-components/components/sidenav/sidenav.component.js +439 -439
- package/esm2015/lib/shell-components/components/submit-feedback/submit-feedback.component.js +75 -75
- package/esm2015/lib/shell-components/constants/api-urls.js +1052 -1052
- package/esm2015/lib/shell-components/constants/available-languages.js +25 -25
- package/esm2015/lib/shell-components/constants/channel-names.js +38 -38
- package/esm2015/lib/shell-components/constants/menu-categories.js +6 -6
- package/esm2015/lib/shell-components/constants/notification-routes.js +6 -6
- package/esm2015/lib/shell-components/constants/notification-type-ids.js +42 -42
- package/esm2015/lib/shell-components/enum/recentSearchType.enum.js +13 -13
- package/esm2015/lib/shell-components/models/AppMenuItemModel.js +3 -3
- package/esm2015/lib/shell-components/models/AppNotification.js +17 -17
- package/esm2015/lib/shell-components/models/AssetAssignedNotificationModel.js +12 -12
- package/esm2015/lib/shell-components/models/ChannelUpdateModel.js +3 -3
- package/esm2015/lib/shell-components/models/EmployeeStatusModel.js +3 -3
- package/esm2015/lib/shell-components/models/IAdjust-screen-options.js +2 -2
- package/esm2015/lib/shell-components/models/IBadge.js +2 -2
- package/esm2015/lib/shell-components/models/IChildItem.js +2 -2
- package/esm2015/lib/shell-components/models/ILayout-change-options.js +2 -2
- package/esm2015/lib/shell-components/models/IMenuItem.js +2 -2
- package/esm2015/lib/shell-components/models/IlayoutConf.js +2 -2
- package/esm2015/lib/shell-components/models/IntroModel.js +3 -3
- package/esm2015/lib/shell-components/models/MessageDetails.js +3 -3
- package/esm2015/lib/shell-components/models/MessageTypingDetails.js +3 -3
- package/esm2015/lib/shell-components/models/NewProjectCreatedNotificationModel.js +10 -10
- package/esm2015/lib/shell-components/models/NewProjectFeatureNotificationModel.js +10 -10
- package/esm2015/lib/shell-components/models/NotificationsOutPutModel.js +22 -22
- package/esm2015/lib/shell-components/models/ProjectSearchCriteriaInputModel.js +3 -3
- package/esm2015/lib/shell-components/models/RecentSearchModel.js +5 -5
- package/esm2015/lib/shell-components/models/ReportConfigAssignedNotification.js +11 -11
- package/esm2015/lib/shell-components/models/ReportSubmittedNotification.js +12 -12
- package/esm2015/lib/shell-components/models/RoleUpdatedNotification.js +9 -9
- package/esm2015/lib/shell-components/models/UserStoryAssignedNotification.js +13 -13
- package/esm2015/lib/shell-components/models/archiveUserStoryModel.js +10 -10
- package/esm2015/lib/shell-components/models/companieslist.model.js +3 -3
- package/esm2015/lib/shell-components/models/company-model.js +7 -7
- package/esm2015/lib/shell-components/models/company-payment-model.js +3 -3
- package/esm2015/lib/shell-components/models/dragedWidget.js +3 -3
- package/esm2015/lib/shell-components/models/employee-List.js +3 -3
- package/esm2015/lib/shell-components/models/employee.js +4 -4
- package/esm2015/lib/shell-components/models/entityRoleFeature.js +3 -3
- package/esm2015/lib/shell-components/models/export-configuration-model.js +3 -3
- package/esm2015/lib/shell-components/models/export-data.module.js +8 -8
- package/esm2015/lib/shell-components/models/goalApprovedNotificationModel.js +9 -9
- package/esm2015/lib/shell-components/models/import-configuration-model.js +3 -3
- package/esm2015/lib/shell-components/models/initialStatusofUsers.js +3 -3
- package/esm2015/lib/shell-components/models/invoiceOutput-model.js +3 -3
- package/esm2015/lib/shell-components/models/leaveApplicationNotifiction.js +9 -9
- package/esm2015/lib/shell-components/models/multiChartsScheduling.js +11 -11
- package/esm2015/lib/shell-components/models/parkUserStoryInputModel.js +10 -10
- package/esm2015/lib/shell-components/models/project.js +3 -3
- package/esm2015/lib/shell-components/models/recentSearchApiModel.js +3 -3
- package/esm2015/lib/shell-components/models/searchCriteriaInputModelBase.js +3 -3
- package/esm2015/lib/shell-components/models/shellModulesInfo.js +7 -7
- package/esm2015/lib/shell-components/models/softlabels-model.js +7 -7
- package/esm2015/lib/shell-components/models/sprintReplanRequestedModel.js +9 -9
- package/esm2015/lib/shell-components/models/sprintStartedNotificationModel.js +9 -9
- package/esm2015/lib/shell-components/models/store-model.js +3 -3
- package/esm2015/lib/shell-components/models/store-search-model.js +4 -4
- package/esm2015/lib/shell-components/models/themes.model.js +3 -3
- package/esm2015/lib/shell-components/models/timesheetenabledisable.js +4 -4
- package/esm2015/lib/shell-components/models/user.js +8 -8
- package/esm2015/lib/shell-components/models/userStory.js +3 -3
- package/esm2015/lib/shell-components/models/userStoryCommentNotificationModel.js +9 -9
- package/esm2015/lib/shell-components/models/userStoryUpdateNotificationModel.js +9 -9
- package/esm2015/lib/shell-components/models/userstory-custom-fields.model.js +3 -3
- package/esm2015/lib/shell-components/models/validation.model.js +2 -2
- package/esm2015/lib/shell-components/models/widgetlist.js +6 -6
- package/esm2015/lib/shell-components/models/workspaceList.js +3 -3
- package/esm2015/lib/shell-components/services/authentication.service.js +96 -96
- package/esm2015/lib/shell-components/services/chat.service.js +67 -67
- package/esm2015/lib/shell-components/services/common-used.service.js +263 -263
- package/esm2015/lib/shell-components/services/feature.service.js +101 -101
- package/esm2015/lib/shell-components/services/google-analytics.service.js +24 -24
- package/esm2015/lib/shell-components/services/layout.service.js +68 -68
- package/esm2015/lib/shell-components/services/payment.service.js +103 -103
- package/esm2015/lib/shell-components/services/recentSearch.service.js +90 -90
- package/esm2015/lib/shell-components/services/shell.modules.service.js +24 -24
- package/esm2015/lib/shell-components/services/signalr.service.js +113 -113
- package/esm2015/lib/shell-components/services/theme.service.js +161 -161
- package/esm2015/lib/shell-components/shell.module.js +450 -450
- package/esm2015/lib/shell-components/shell.routing.js +16 -16
- package/esm2015/lib/shell-components/store/actions/authentication.actions.js +260 -260
- package/esm2015/lib/shell-components/store/actions/chat.actions.js +248 -248
- package/esm2015/lib/shell-components/store/actions/menuitems.actions.js +39 -39
- package/esm2015/lib/shell-components/store/actions/notification-validator.action.js +19 -19
- package/esm2015/lib/shell-components/store/actions/notifications.actions.js +74 -74
- package/esm2015/lib/shell-components/store/effects/authentication.effects.js +503 -503
- package/esm2015/lib/shell-components/store/effects/chat.effects.js +139 -139
- package/esm2015/lib/shell-components/store/effects/index.js +13 -13
- package/esm2015/lib/shell-components/store/effects/menuitems.effects.js +53 -53
- package/esm2015/lib/shell-components/store/effects/notification-validator.effects.js +56 -56
- package/esm2015/lib/shell-components/store/effects/notifications.effects.js +116 -116
- package/esm2015/lib/shell-components/store/reducers/authentication.reducers.js +86 -86
- package/esm2015/lib/shell-components/store/reducers/chat.reducers.js +68 -68
- package/esm2015/lib/shell-components/store/reducers/index.js +80 -80
- package/esm2015/lib/shell-components/store/reducers/menuitems.reducers.js +56 -56
- package/esm2015/lib/shell-components/store/reducers/notification-validator.reducers.js +13 -13
- package/esm2015/lib/shell-components/store/reducers/notifications.reducers.js +38 -38
- package/esm2015/public-api.js +92 -92
- package/esm2015/store/reducers/index.js +47 -47
- package/esm2015/thetradeengineorg1-snova-shell-module.js +4 -4
- package/fesm2015/thetradeengineorg1-snova-shell-module.js +16979 -16979
- package/fesm2015/thetradeengineorg1-snova-shell-module.js.map +1 -1
- package/lib/globaldependencies/components/avatar.component.d.ts +10 -10
- package/lib/globaldependencies/components/componentbase.d.ts +455 -455
- package/lib/globaldependencies/constants/feature-ids.d.ts +448 -448
- package/lib/globaldependencies/constants/localstorage-properties.d.ts +37 -37
- package/lib/globaldependencies/helpers/dom.helper.d.ts +7 -7
- package/lib/globaldependencies/helpers/fontawesome-icons.d.ts +1 -1
- package/lib/globaldependencies/helpers/moment-utc-date-adapter.d.ts +9 -9
- package/lib/globaldependencies/helpers/window.helper.d.ts +12 -12
- package/lib/globaldependencies/intercepter/jwt.interceptor.d.ts +11 -11
- package/lib/globaldependencies/pipes/fetchSizedAndCachedImage.pipe.d.ts +8 -8
- package/lib/globaldependencies/pipes/highLightText.pipe.d.ts +8 -8
- package/lib/globaldependencies/pipes/orderby-pipe.d.ts +9 -9
- package/lib/globaldependencies/pipes/removeSpecialCharacters.pipe.d.ts +8 -8
- package/lib/globaldependencies/pipes/sanitize.pipe.d.ts +11 -11
- package/lib/globaldependencies/pipes/softlabels.pipes.d.ts +8 -8
- package/lib/globaldependencies/pipes/utctolocaltime.pipe.d.ts +8 -8
- package/lib/globaldependencies/pipes/utctolocaltimewithdate.pipe.d.ts +8 -8
- package/lib/globaldependencies/pipes/workflowstatus.pipes.d.ts +8 -8
- package/lib/shell-components/components/Payments/account.component.d.ts +14 -14
- package/lib/shell-components/components/Payments/company-information.d.ts +62 -62
- package/lib/shell-components/components/Payments/company-plans.component.d.ts +47 -47
- package/lib/shell-components/components/Payments/document.component.d.ts +20 -20
- package/lib/shell-components/components/Payments/payment-method.component.d.ts +15 -15
- package/lib/shell-components/components/Payments/product-service.component.d.ts +48 -48
- package/lib/shell-components/components/Payments/purchase-more-licenses.d.ts +37 -37
- package/lib/shell-components/components/Payments/transactions.component.d.ts +28 -28
- package/lib/shell-components/components/admin-layout/admin-layout.component.d.ts +67 -67
- package/lib/shell-components/components/all-work-items-dialog/all-work-items-dialog.component.d.ts +32 -32
- package/lib/shell-components/components/confirmation-dialog/confirmation-dialog.component.d.ts +32 -32
- package/lib/shell-components/components/export-import-configuration/export-configuration.component.d.ts +60 -60
- package/lib/shell-components/components/feed-time/feed-time-dialog.component.d.ts +33 -33
- package/lib/shell-components/components/feed-time/feed-time.component.d.ts +27 -27
- package/lib/shell-components/components/header-side/header-side.component.d.ts +220 -220
- package/lib/shell-components/components/header-top/header-top.component.d.ts +40 -40
- package/lib/shell-components/components/lives/lives-welcome-page.d.ts +14 -14
- package/lib/shell-components/components/menu/menu.component.d.ts +220 -220
- package/lib/shell-components/components/menu/searchTask.enum.d.ts +8 -8
- package/lib/shell-components/components/notifications/announcement-dialog.component.d.ts +27 -27
- package/lib/shell-components/components/notifications/notifications.component.d.ts +53 -53
- package/lib/shell-components/components/sidebar-top/sidebar-top.component.d.ts +10 -10
- package/lib/shell-components/components/sidenav/side-bar.component.d.ts +23 -23
- package/lib/shell-components/components/sidenav/sidenav.component.d.ts +17 -17
- package/lib/shell-components/components/submit-feedback/submit-feedback.component.d.ts +25 -25
- package/lib/shell-components/constants/api-urls.d.ts +1051 -1051
- package/lib/shell-components/constants/available-languages.d.ts +7 -7
- package/lib/shell-components/constants/channel-names.d.ts +37 -37
- package/lib/shell-components/constants/menu-categories.d.ts +5 -5
- package/lib/shell-components/constants/notification-routes.d.ts +5 -5
- package/lib/shell-components/constants/notification-type-ids.d.ts +41 -41
- package/lib/shell-components/enum/recentSearchType.enum.d.ts +11 -11
- package/lib/shell-components/models/AppMenuItemModel.d.ts +12 -12
- package/lib/shell-components/models/AppNotification.d.ts +12 -12
- package/lib/shell-components/models/AssetAssignedNotificationModel.d.ts +10 -10
- package/lib/shell-components/models/ChannelUpdateModel.d.ts +47 -47
- package/lib/shell-components/models/EmployeeStatusModel.d.ts +11 -11
- package/lib/shell-components/models/IAdjust-screen-options.d.ts +4 -4
- package/lib/shell-components/models/IBadge.d.ts +4 -4
- package/lib/shell-components/models/IChildItem.d.ts +7 -7
- package/lib/shell-components/models/ILayout-change-options.d.ts +4 -4
- package/lib/shell-components/models/IMenuItem.d.ts +14 -14
- package/lib/shell-components/models/IlayoutConf.d.ts +10 -10
- package/lib/shell-components/models/IntroModel.d.ts +3 -3
- package/lib/shell-components/models/MessageDetails.d.ts +55 -55
- package/lib/shell-components/models/MessageTypingDetails.d.ts +9 -9
- package/lib/shell-components/models/NewProjectCreatedNotificationModel.d.ts +8 -8
- package/lib/shell-components/models/NewProjectFeatureNotificationModel.d.ts +8 -8
- package/lib/shell-components/models/NotificationsOutPutModel.d.ts +41 -41
- package/lib/shell-components/models/ProjectSearchCriteriaInputModel.d.ts +10 -10
- package/lib/shell-components/models/RecentSearchModel.d.ts +14 -14
- package/lib/shell-components/models/ReportConfigAssignedNotification.d.ts +9 -9
- package/lib/shell-components/models/ReportSubmittedNotification.d.ts +10 -10
- package/lib/shell-components/models/RoleUpdatedNotification.d.ts +7 -7
- package/lib/shell-components/models/UserStoryAssignedNotification.d.ts +8 -8
- package/lib/shell-components/models/archiveUserStoryModel.d.ts +7 -7
- package/lib/shell-components/models/companieslist.model.d.ts +8 -8
- package/lib/shell-components/models/company-model.d.ts +31 -31
- package/lib/shell-components/models/company-payment-model.d.ts +18 -18
- package/lib/shell-components/models/dragedWidget.d.ts +16 -16
- package/lib/shell-components/models/employee-List.d.ts +8 -8
- package/lib/shell-components/models/employee.d.ts +60 -60
- package/lib/shell-components/models/entityRoleFeature.d.ts +9 -9
- package/lib/shell-components/models/export-configuration-model.d.ts +8 -8
- package/lib/shell-components/models/export-data.module.d.ts +6 -6
- package/lib/shell-components/models/goalApprovedNotificationModel.d.ts +8 -8
- package/lib/shell-components/models/import-configuration-model.d.ts +3 -3
- package/lib/shell-components/models/initialStatusofUsers.d.ts +5 -5
- package/lib/shell-components/models/invoiceOutput-model.d.ts +9 -9
- package/lib/shell-components/models/leaveApplicationNotifiction.d.ts +7 -7
- package/lib/shell-components/models/multiChartsScheduling.d.ts +9 -9
- package/lib/shell-components/models/parkUserStoryInputModel.d.ts +7 -7
- package/lib/shell-components/models/project.d.ts +28 -28
- package/lib/shell-components/models/recentSearchApiModel.d.ts +6 -6
- package/lib/shell-components/models/searchCriteriaInputModelBase.d.ts +10 -10
- package/lib/shell-components/models/shellModulesInfo.d.ts +16 -16
- package/lib/shell-components/models/softlabels-model.d.ts +66 -66
- package/lib/shell-components/models/sprintReplanRequestedModel.d.ts +7 -7
- package/lib/shell-components/models/sprintStartedNotificationModel.d.ts +7 -7
- package/lib/shell-components/models/store-model.d.ts +13 -13
- package/lib/shell-components/models/store-search-model.d.ts +7 -7
- package/lib/shell-components/models/themes.model.d.ts +9 -9
- package/lib/shell-components/models/timesheetenabledisable.d.ts +16 -16
- package/lib/shell-components/models/user.d.ts +40 -40
- package/lib/shell-components/models/userStory.d.ts +188 -188
- package/lib/shell-components/models/userStoryCommentNotificationModel.d.ts +6 -6
- package/lib/shell-components/models/userStoryUpdateNotificationModel.d.ts +6 -6
- package/lib/shell-components/models/userstory-custom-fields.model.d.ts +6 -6
- package/lib/shell-components/models/validation.model.d.ts +5 -5
- package/lib/shell-components/models/widgetlist.d.ts +28 -28
- package/lib/shell-components/models/workspaceList.d.ts +19 -19
- package/lib/shell-components/services/authentication.service.d.ts +18 -18
- package/lib/shell-components/services/chat.service.d.ts +16 -16
- package/lib/shell-components/services/common-used.service.d.ts +45 -45
- package/lib/shell-components/services/feature.service.d.ts +19 -19
- package/lib/shell-components/services/google-analytics.service.d.ts +9 -9
- package/lib/shell-components/services/layout.service.d.ts +23 -23
- package/lib/shell-components/services/payment.service.d.ts +19 -19
- package/lib/shell-components/services/recentSearch.service.d.ts +16 -16
- package/lib/shell-components/services/shell.modules.service.d.ts +9 -9
- package/lib/shell-components/services/signalr.service.d.ts +25 -25
- package/lib/shell-components/services/theme.service.d.ts +14 -14
- package/lib/shell-components/shell.module.d.ts +119 -119
- package/lib/shell-components/shell.routing.d.ts +2 -2
- package/lib/shell-components/store/actions/authentication.actions.d.ts +327 -327
- package/lib/shell-components/store/actions/chat.actions.d.ts +399 -399
- package/lib/shell-components/store/actions/menuitems.actions.d.ts +51 -51
- package/lib/shell-components/store/actions/notification-validator.action.d.ts +25 -25
- package/lib/shell-components/store/actions/notifications.actions.d.ts +116 -116
- package/lib/shell-components/store/effects/authentication.effects.d.ts +54 -54
- package/lib/shell-components/store/effects/chat.effects.d.ts +30 -30
- package/lib/shell-components/store/effects/index.d.ts +1 -1
- package/lib/shell-components/store/effects/menuitems.effects.d.ts +17 -17
- package/lib/shell-components/store/effects/notification-validator.effects.d.ts +21 -21
- package/lib/shell-components/store/effects/notifications.effects.d.ts +23 -23
- package/lib/shell-components/store/reducers/authentication.reducers.d.ts +30 -30
- package/lib/shell-components/store/reducers/chat.reducers.d.ts +17 -17
- package/lib/shell-components/store/reducers/index.d.ts +59 -59
- package/lib/shell-components/store/reducers/menuitems.reducers.d.ts +11 -11
- package/lib/shell-components/store/reducers/notification-validator.reducers.d.ts +5 -5
- package/lib/shell-components/store/reducers/notifications.reducers.d.ts +10 -10
- package/package.json +1 -1
- package/public-api.d.ts +82 -82
- package/store/reducers/index.d.ts +24 -24
- package/thetradeengineorg1-snova-shell-module.d.ts +5 -5
|
@@ -1,534 +1,534 @@
|
|
|
1
|
-
import { Component, Input } from "@angular/core";
|
|
2
|
-
import { NavigationEnd } from "@angular/router";
|
|
3
|
-
import { ofType } from "@ngrx/effects";
|
|
4
|
-
import { select } from "@ngrx/store";
|
|
5
|
-
import { Subject } from "rxjs";
|
|
6
|
-
import { takeUntil, tap } from "rxjs/operators";
|
|
7
|
-
import { AuthenticationActionTypes } from "../../store/actions/authentication.actions";
|
|
8
|
-
import { ClearAllNotifications, NotificationsActionTypes, UpsertUnreadNotificationsTriggered } from "../../store/actions/notifications.actions";
|
|
9
|
-
import * as sharedModuleReducers from "../../store/reducers/index";
|
|
10
|
-
import { NotificationTypeIds } from '../../constants/notification-type-ids';
|
|
11
|
-
import { LocalStorageProperties } from '../../../globaldependencies/constants/localstorage-properties';
|
|
12
|
-
import { ChannelNames } from '../../constants/channel-names';
|
|
13
|
-
import '../../../globaldependencies/helpers/fontawesome-icons';
|
|
14
|
-
import * as _ from "underscore";
|
|
15
|
-
import * as i0 from "@angular/core";
|
|
16
|
-
import * as i1 from "@angular/router";
|
|
17
|
-
import * as i2 from "pubnub-angular2";
|
|
18
|
-
import * as i3 from "@ngrx/store";
|
|
19
|
-
import * as i4 from "@ngrx/effects";
|
|
20
|
-
import * as i5 from "ngx-cookie-service";
|
|
21
|
-
import * as i6 from "ngx-toastr";
|
|
22
|
-
import * as i7 from "@angular/material/dialog";
|
|
23
|
-
import * as i8 from "../../../globaldependencies/pipes/orderby-pipe";
|
|
24
|
-
import * as i9 from "../../services/signalr.service";
|
|
25
|
-
import * as i10 from "@angular/common";
|
|
26
|
-
import * as i11 from "@angular/material/divider";
|
|
27
|
-
import * as i12 from "@angular/material/list";
|
|
28
|
-
import * as i13 from "@angular/flex-layout/extended";
|
|
29
|
-
import * as i14 from "@ngx-translate/core";
|
|
30
|
-
import * as i15 from "../../../globaldependencies/pipes/sanitize.pipe";
|
|
31
|
-
import * as i16 from "ngx-timeago";
|
|
32
|
-
import * as i17 from "../../../globaldependencies/pipes/utctolocaltime.pipe";
|
|
33
|
-
const _c0 = function (a0, a1) { return { "notificataion-unread": a0, "notificataion-read": a1 }; };
|
|
34
|
-
function NotificationsComponent_div_4_mat_nav_list_1_Template(rf, ctx) { if (rf & 1) {
|
|
35
|
-
const _r6 = i0.ɵɵgetCurrentView();
|
|
36
|
-
i0.ɵɵelementStart(0, "mat-nav-list", 7);
|
|
37
|
-
i0.ɵɵelementStart(1, "mat-list-item", 8);
|
|
38
|
-
i0.ɵɵlistener("click", function NotificationsComponent_div_4_mat_nav_list_1_Template_mat_list_item_click_1_listener() { const restoredCtx = i0.ɵɵrestoreView(_r6); const notification_r4 = restoredCtx.$implicit; const ctx_r5 = i0.ɵɵnextContext(2); return ctx_r5.upsertReadNewNotification(notification_r4); });
|
|
39
|
-
i0.ɵɵelementStart(2, "div");
|
|
40
|
-
i0.ɵɵelementStart(3, "a");
|
|
41
|
-
i0.ɵɵelementStart(4, "div", 9);
|
|
42
|
-
i0.ɵɵelement(5, "div", 10);
|
|
43
|
-
i0.ɵɵpipe(6, "sanitizeHtml");
|
|
44
|
-
i0.ɵɵelementStart(7, "small", 11);
|
|
45
|
-
i0.ɵɵtext(8);
|
|
46
|
-
i0.ɵɵpipe(9, "timeago");
|
|
47
|
-
i0.ɵɵpipe(10, "utcToLocalTime");
|
|
48
|
-
i0.ɵɵelementEnd();
|
|
49
|
-
i0.ɵɵelementEnd();
|
|
50
|
-
i0.ɵɵelementEnd();
|
|
51
|
-
i0.ɵɵelementEnd();
|
|
52
|
-
i0.ɵɵelementEnd();
|
|
53
|
-
i0.ɵɵelementEnd();
|
|
54
|
-
} if (rf & 2) {
|
|
55
|
-
const notification_r4 = ctx.$implicit;
|
|
56
|
-
const ctx_r3 = i0.ɵɵnextContext(2);
|
|
57
|
-
i0.ɵɵadvance(1);
|
|
58
|
-
i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction2(9, _c0, !ctx_r3.notificationColor, ctx_r3.notificationColor));
|
|
59
|
-
i0.ɵɵadvance(4);
|
|
60
|
-
i0.ɵɵproperty("innerHTML", i0.ɵɵpipeBind1(6, 3, notification_r4.summary), i0.ɵɵsanitizeHtml);
|
|
61
|
-
i0.ɵɵadvance(3);
|
|
62
|
-
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(9, 5, i0.ɵɵpipeBind1(10, 7, notification_r4.createdDateTime)));
|
|
63
|
-
} }
|
|
64
|
-
function NotificationsComponent_div_4_Template(rf, ctx) { if (rf & 1) {
|
|
65
|
-
i0.ɵɵelementStart(0, "div", 5);
|
|
66
|
-
i0.ɵɵtemplate(1, NotificationsComponent_div_4_mat_nav_list_1_Template, 11, 12, "mat-nav-list", 6);
|
|
67
|
-
i0.ɵɵpipe(2, "orderBy");
|
|
68
|
-
i0.ɵɵelementEnd();
|
|
69
|
-
} if (rf & 2) {
|
|
70
|
-
const ctx_r0 = i0.ɵɵnextContext();
|
|
71
|
-
i0.ɵɵadvance(1);
|
|
72
|
-
i0.ɵɵproperty("ngForOf", i0.ɵɵpipeBind1(2, 1, ctx_r0.newNotifications));
|
|
73
|
-
} }
|
|
74
|
-
function NotificationsComponent_div_5_Template(rf, ctx) { if (rf & 1) {
|
|
75
|
-
i0.ɵɵelementStart(0, "div", 12);
|
|
76
|
-
i0.ɵɵtext(1);
|
|
77
|
-
i0.ɵɵpipe(2, "translate");
|
|
78
|
-
i0.ɵɵelementEnd();
|
|
79
|
-
} if (rf & 2) {
|
|
80
|
-
i0.ɵɵadvance(1);
|
|
81
|
-
i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(2, 1, "NOTIFICATIONS.NONOTIFICATIONSTITLE"), "");
|
|
82
|
-
} }
|
|
83
|
-
function NotificationsComponent_div_7_Template(rf, ctx) { if (rf & 1) {
|
|
84
|
-
const _r8 = i0.ɵɵgetCurrentView();
|
|
85
|
-
i0.ɵɵelementStart(0, "div", 13);
|
|
86
|
-
i0.ɵɵelementStart(1, "label", 14);
|
|
87
|
-
i0.ɵɵelementStart(2, "a", 15);
|
|
88
|
-
i0.ɵɵlistener("click", function NotificationsComponent_div_7_Template_a_click_2_listener($event) { i0.ɵɵrestoreView(_r8); const ctx_r7 = i0.ɵɵnextContext(); return ctx_r7.clearNewAll($event); });
|
|
89
|
-
i0.ɵɵtext(3);
|
|
90
|
-
i0.ɵɵpipe(4, "translate");
|
|
91
|
-
i0.ɵɵelementEnd();
|
|
92
|
-
i0.ɵɵelementEnd();
|
|
93
|
-
i0.ɵɵelementEnd();
|
|
94
|
-
} if (rf & 2) {
|
|
95
|
-
i0.ɵɵadvance(3);
|
|
96
|
-
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(4, 1, "NOTIFICATIONS.CLEARALLNOTIFICATIONS"));
|
|
97
|
-
} }
|
|
98
|
-
export class NotificationsComponent {
|
|
99
|
-
constructor(router, pubnub, store, actionUpdates$, cookieService, toastr, dialog, orderByPipe, signalr, cdRef) {
|
|
100
|
-
this.router = router;
|
|
101
|
-
this.pubnub = pubnub;
|
|
102
|
-
this.store = store;
|
|
103
|
-
this.actionUpdates$ = actionUpdates$;
|
|
104
|
-
this.cookieService = cookieService;
|
|
105
|
-
this.toastr = toastr;
|
|
106
|
-
this.dialog = dialog;
|
|
107
|
-
this.orderByPipe = orderByPipe;
|
|
108
|
-
this.signalr = signalr;
|
|
109
|
-
this.cdRef = cdRef;
|
|
110
|
-
this.ngDestroyed$ = new Subject();
|
|
111
|
-
this.constNotification_WorkItemAssignedToUser = NotificationTypeIds.Notification_WorkItemAssignedToUser;
|
|
112
|
-
this.notificationColor = false;
|
|
113
|
-
this.newNotifications = [];
|
|
114
|
-
this.actionUpdates$
|
|
115
|
-
.pipe(takeUntil(this.ngDestroyed$), ofType(AuthenticationActionTypes.UserDetailsFetchedAfterLogin), tap(() => {
|
|
116
|
-
if (this.cookieService.check(LocalStorageProperties.CurrentUserId)) {
|
|
117
|
-
const CurrentUserId = this.cookieService.get(LocalStorageProperties.CurrentUserId);
|
|
118
|
-
// Subscribe to Task Assignment Notificaitons here.
|
|
119
|
-
const taskAssignmentChannelToSubscribeInto = ChannelNames.Channel_TaskAssignments + CurrentUserId;
|
|
120
|
-
const tastatusReportSubmissionChannelToSubscribeInto = ChannelNames.Channel_StatusReportSubmission + CurrentUserId;
|
|
121
|
-
const tastatusConfigAssignChannelToSubscribeInto = ChannelNames.Channel_StatusConfigAssign + CurrentUserId;
|
|
122
|
-
const multiChartsSchedulingChannelToSubscribeInto = ChannelNames.Channel_MultiChartsScheduling + CurrentUserId;
|
|
123
|
-
const assetsAssignedChannelToSubscribeInto = ChannelNames.Channel_AssetAssignment + CurrentUserId;
|
|
124
|
-
const projectCreatedChannelToSubscribeInto = ChannelNames.Channel_NewProject + CurrentUserId;
|
|
125
|
-
const projectAccessToMemberChannelToSubscribeInto = ChannelNames.Channel_ProjectMemberRole + CurrentUserId;
|
|
126
|
-
const goalApprovedChannelToSubscribeInto = ChannelNames.Channel_GoalApprovedFromReplan + CurrentUserId;
|
|
127
|
-
const userStoryUpdateChannelToSubscribeInto = ChannelNames.Channel_UserStoryUpdateNotification + CurrentUserId;
|
|
128
|
-
const AnnouncementChannelToSubscribeInto = ChannelNames.Channel_AnnouncementNotification + CurrentUserId;
|
|
129
|
-
const ReminderChannelToSubscribeInto = ChannelNames.Channel_ReminderNotification + CurrentUserId;
|
|
130
|
-
const PerformanceChannelToSubscribeInto = ChannelNames.Channel_PeroformanceNotification + CurrentUserId;
|
|
131
|
-
const userStoryCommentChannelToSubscribeInto = ChannelNames.Channel_UserStoryComment + CurrentUserId;
|
|
132
|
-
const sprintStartedChannelToSubscribeInto = ChannelNames.Channel_SprintStarted + CurrentUserId;
|
|
133
|
-
const sprintReplanChannelToSubscribeInto = ChannelNames.Channel_SprintRequestedToReplan + CurrentUserId;
|
|
134
|
-
const leaveAppliedChannelToSubscribeInto = ChannelNames.Channel_LeaveApplied + CurrentUserId;
|
|
135
|
-
const ApproveLeaveChannelToSubscribeInto = ChannelNames.Channel_ApproveLeave + CurrentUserId;
|
|
136
|
-
const RejectLeaveChannelToSubscribeInto = ChannelNames.Channel_RejectLeave + CurrentUserId;
|
|
137
|
-
const ResignationChannelToSubscribeInto = ChannelNames.Channel_Resignation + CurrentUserId;
|
|
138
|
-
const ApproveResignationChannelToSubscribeInto = ChannelNames.Channel_ApproveResignation + CurrentUserId;
|
|
139
|
-
const RejectResignationChannelToSubscribeInto = ChannelNames.Channel_RejectResignation + CurrentUserId;
|
|
140
|
-
const AutoTImesheetSubmissionChannelToSubscribeInto = ChannelNames.Channel_AutoTimesheetSubmission + CurrentUserId;
|
|
141
|
-
const ProbationAssignNotification = ChannelNames.Channel_ProbationAssignNotification + CurrentUserId;
|
|
142
|
-
const ReviewAssignToEmployeeNotification = ChannelNames.Channel_ReviewAssignToEmployeeNotification + CurrentUserId;
|
|
143
|
-
const ReviewSubmittedByEmployeeNotification = ChannelNames.Channel_ReviewSubmittedByEmployeeNotification + CurrentUserId;
|
|
144
|
-
const ReviewInvitationNotificationModel = ChannelNames.Channel_ReviewInvitationNotificationModel + CurrentUserId;
|
|
145
|
-
const PerformanceReviewSubmittedByEmployeeNotification = ChannelNames.Channel_PerformanceReviewSubmittedByEmployeeNotification + CurrentUserId;
|
|
146
|
-
const PerformanceReviewInvitationNotificationModel = ChannelNames.Channel_PerformanceReviewInvitationNotificationModel + CurrentUserId;
|
|
147
|
-
const PerformanceReviewAssignToEmployeeNotification = ChannelNames.Channel_PerformanceReviewAssignToEmployeeNotification + CurrentUserId;
|
|
148
|
-
console.log("subscribing to " + taskAssignmentChannelToSubscribeInto);
|
|
149
|
-
console.log("subscribing to " + tastatusReportSubmissionChannelToSubscribeInto);
|
|
150
|
-
console.log("subscribing to " + tastatusConfigAssignChannelToSubscribeInto);
|
|
151
|
-
console.log("subscribing to" + assetsAssignedChannelToSubscribeInto);
|
|
152
|
-
console.log("subscribing to" + projectCreatedChannelToSubscribeInto);
|
|
153
|
-
console.log("subscribing to" + projectAccessToMemberChannelToSubscribeInto);
|
|
154
|
-
console.log("subscribing to" + goalApprovedChannelToSubscribeInto);
|
|
155
|
-
console.log("subscribing to" + userStoryUpdateChannelToSubscribeInto);
|
|
156
|
-
console.log("subscribing to" + AnnouncementChannelToSubscribeInto);
|
|
157
|
-
console.log("subscribing to" + userStoryCommentChannelToSubscribeInto);
|
|
158
|
-
console.log("subscribing to" + sprintStartedChannelToSubscribeInto);
|
|
159
|
-
console.log("subscribing to" + sprintReplanChannelToSubscribeInto);
|
|
160
|
-
console.log("subscribing to" + ReminderChannelToSubscribeInto);
|
|
161
|
-
console.log("subscribing to" + PerformanceChannelToSubscribeInto);
|
|
162
|
-
this.pubnub.subscribe({
|
|
163
|
-
channels: [taskAssignmentChannelToSubscribeInto, tastatusReportSubmissionChannelToSubscribeInto,
|
|
164
|
-
ProbationAssignNotification, ReviewAssignToEmployeeNotification, ReviewSubmittedByEmployeeNotification,
|
|
165
|
-
ReviewInvitationNotificationModel, PerformanceReviewSubmittedByEmployeeNotification, PerformanceReviewAssignToEmployeeNotification,
|
|
166
|
-
tastatusConfigAssignChannelToSubscribeInto, multiChartsSchedulingChannelToSubscribeInto, PerformanceReviewInvitationNotificationModel,
|
|
167
|
-
assetsAssignedChannelToSubscribeInto, projectCreatedChannelToSubscribeInto, ,
|
|
168
|
-
projectAccessToMemberChannelToSubscribeInto, goalApprovedChannelToSubscribeInto,
|
|
169
|
-
userStoryUpdateChannelToSubscribeInto, AnnouncementChannelToSubscribeInto, ReminderChannelToSubscribeInto, RejectResignationChannelToSubscribeInto,
|
|
170
|
-
userStoryCommentChannelToSubscribeInto, sprintStartedChannelToSubscribeInto, ResignationChannelToSubscribeInto, ApproveResignationChannelToSubscribeInto,
|
|
171
|
-
sprintReplanChannelToSubscribeInto, leaveAppliedChannelToSubscribeInto, ApproveLeaveChannelToSubscribeInto, RejectLeaveChannelToSubscribeInto,
|
|
172
|
-
PerformanceChannelToSubscribeInto, AutoTImesheetSubmissionChannelToSubscribeInto]
|
|
173
|
-
});
|
|
174
|
-
// Add other subscriptions here.
|
|
175
|
-
}
|
|
176
|
-
else {
|
|
177
|
-
console.log("User not logged in yet to be able to subscribe.");
|
|
178
|
-
}
|
|
179
|
-
}))
|
|
180
|
-
.subscribe();
|
|
181
|
-
this.actionUpdates$
|
|
182
|
-
.pipe(takeUntil(this.ngDestroyed$), ofType(AuthenticationActionTypes.UserDetailsFetchedAfterLogin), tap(() => {
|
|
183
|
-
var roleUpdatesChannelToSubscribeInto = ChannelNames.Channel_RoleUpdates + "19B6F9FC-7370-4B9C-A05C-3B8D819EEEAF";
|
|
184
|
-
console.log("subscribing to " + roleUpdatesChannelToSubscribeInto);
|
|
185
|
-
this.pubnub.subscribe({
|
|
186
|
-
channels: [roleUpdatesChannelToSubscribeInto]
|
|
187
|
-
});
|
|
188
|
-
}))
|
|
189
|
-
.subscribe();
|
|
190
|
-
this.actionUpdates$
|
|
191
|
-
.pipe(takeUntil(this.ngDestroyed$), ofType(NotificationsActionTypes.ClearAllUnreadNotificationsCompleted), tap(() => {
|
|
192
|
-
this.notifications$ = this.store.pipe(select(sharedModuleReducers.getNotificationAll));
|
|
193
|
-
this.notifications$.subscribe(x => {
|
|
194
|
-
this.notifications = x;
|
|
195
|
-
});
|
|
196
|
-
}))
|
|
197
|
-
.subscribe();
|
|
198
|
-
// const storeListner = (message) => {
|
|
199
|
-
// console.log("---------Received pubnub message---------");
|
|
200
|
-
// // this.toastr.info(message.message.Summary);
|
|
201
|
-
// try {
|
|
202
|
-
// // Receiving the User Story Assigned Notification
|
|
203
|
-
// if (message.message.NotificationTypeGuid == NotificationTypeIds.Notification_WorkItemAssignedToUser) {
|
|
204
|
-
// var userStoryAssignedNotification = new UserStoryAssignedNotification();
|
|
205
|
-
// userStoryAssignedNotification.loadFromCaseInsensitiveObject(message.message);
|
|
206
|
-
// userStoryAssignedNotification.route = ChannelRoutes.ViewWorkItem + userStoryAssignedNotification.notificationId;
|
|
207
|
-
// this.store.dispatch(new NewNotificationReceived(userStoryAssignedNotification));
|
|
208
|
-
// } else if (message.message.NotificationTypeGuid == NotificationTypeIds.Notification_RoleUpdated) {
|
|
209
|
-
// var roleUpdatedNotification = new RoleUpdatedNotification();
|
|
210
|
-
// roleUpdatedNotification.loadFromCaseInsensitiveObject(message.message);
|
|
211
|
-
// roleUpdatedNotification.route = ChannelRoutes.ViewAccount;
|
|
212
|
-
// this.store.dispatch(new NewNotificationReceived(roleUpdatedNotification));
|
|
213
|
-
// this.store.dispatch(new RolesFetchTriggered());
|
|
214
|
-
// } else if (message.message.NotificationTypeGuid == NotificationTypeIds.Status_Report_Sumitted) {
|
|
215
|
-
// var reportSubmittedNotification = new ReportSubmittedNotification();
|
|
216
|
-
// reportSubmittedNotification.loadFromCaseInsensitiveObject(message.message);
|
|
217
|
-
// reportSubmittedNotification.route = ChannelRoutes.ViewAccount;
|
|
218
|
-
// this.store.dispatch(new NewNotificationReceived(reportSubmittedNotification));
|
|
219
|
-
// this.store.dispatch(new RolesFetchTriggered());
|
|
220
|
-
// } else if (message.message.NotificationTypeGuid == NotificationTypeIds.Status_Report_Config_Created) {
|
|
221
|
-
// var reportConfigAssignedNotification = new ReportConfigAssignedNotification();
|
|
222
|
-
// reportConfigAssignedNotification.loadFromCaseInsensitiveObject(message.message);
|
|
223
|
-
// reportConfigAssignedNotification.route = ChannelRoutes.ViewAccount;
|
|
224
|
-
// this.store.dispatch(new NewNotificationReceived(reportConfigAssignedNotification));
|
|
225
|
-
// this.store.dispatch(new RolesFetchTriggered());
|
|
226
|
-
// } else if (message.message.NotificationTypeGuid == NotificationTypeIds.Multiple_Charts_Scheduling_created) {
|
|
227
|
-
// var multipleChartsScheduling = new MultipleChartsScheduling();
|
|
228
|
-
// multipleChartsScheduling.loadFromCaseInsensitiveObject(message.message);
|
|
229
|
-
// multipleChartsScheduling.route = ChannelRoutes.ViewAccount;
|
|
230
|
-
// this.store.dispatch(new NewNotificationReceived(multipleChartsScheduling));
|
|
231
|
-
// this.store.dispatch(new RolesFetchTriggered());
|
|
232
|
-
// } else if (message.message.NotificationTypeGuid == NotificationTypeIds.Assets_Assignment) {
|
|
233
|
-
// const assetAssignedNotification = new AssetAssignedNotification();
|
|
234
|
-
// assetAssignedNotification.loadFromCaseInsensitiveObject(message.message);
|
|
235
|
-
// assetAssignedNotification.route = ChannelRoutes.ViewAccount;
|
|
236
|
-
// this.store.dispatch(new NewNotificationReceived(assetAssignedNotification));
|
|
237
|
-
// this.store.dispatch(new RolesFetchTriggered());
|
|
238
|
-
// } else if (message.message.NotificationTypeGuid.toString().toLowerCase() == NotificationTypeIds.Reminder_Notification.toString().toLowerCase()) {
|
|
239
|
-
// const assetAssignedNotification = new AssetAssignedNotification();
|
|
240
|
-
// assetAssignedNotification.loadFromCaseInsensitiveObject(message.message);
|
|
241
|
-
// assetAssignedNotification.route = ChannelRoutes.ViewAccount;
|
|
242
|
-
// this.store.dispatch(new NewNotificationReceived(assetAssignedNotification));
|
|
243
|
-
// this.store.dispatch(new RolesFetchTriggered());
|
|
244
|
-
// } else if (message.message.NotificationTypeGuid.toString().toLowerCase() == NotificationTypeIds.Announcement_Received.toString().toLowerCase()) {
|
|
245
|
-
// const assetAssignedNotification = new AssetAssignedNotification();
|
|
246
|
-
// assetAssignedNotification.loadFromCaseInsensitiveObject(message.message);
|
|
247
|
-
// assetAssignedNotification.route = ChannelRoutes.ViewAccount;
|
|
248
|
-
// this.store.dispatch(new NewNotificationReceived(assetAssignedNotification));
|
|
249
|
-
// this.store.dispatch(new RolesFetchTriggered());
|
|
250
|
-
// if (message.message.Id != this.announceNotificationId) {
|
|
251
|
-
// this.announceNotificationId = message.message.Id;
|
|
252
|
-
// this.openAnnouncementDialog(message.message);
|
|
253
|
-
// }
|
|
254
|
-
// } else if (message.message.NotificationTypeGuid.toString().toLowerCase() == NotificationTypeIds.Performance_Received.toString().toLowerCase() || message.message.NotificationTypeGuid.toString().toLowerCase() == NotificationTypeIds.ProjectMemberRoleAddedNotificationId.toString().toLowerCase()) {
|
|
255
|
-
// const newProjectCreatedNotification = new NewProjectCreatedNotificationModel();
|
|
256
|
-
// newProjectCreatedNotification.loadFromCaseInsensitiveObject(message.message);
|
|
257
|
-
// newProjectCreatedNotification.route = ChannelRoutes.ViewAccount;
|
|
258
|
-
// this.store.dispatch(new NewNotificationReceived(newProjectCreatedNotification));
|
|
259
|
-
// this.store.dispatch(new RolesFetchTriggered());
|
|
260
|
-
// } else if (message.message.NotificationTypeGuid.toString().toLowerCase() == NotificationTypeIds.NewProjectCreatedNotificationId.toString().toLowerCase() || message.message.NotificationTypeGuid.toString().toLowerCase() == NotificationTypeIds.ProjectMemberRoleAddedNotificationId.toString().toLowerCase()) {
|
|
261
|
-
// const newProjectCreatedNotification = new NewProjectCreatedNotificationModel();
|
|
262
|
-
// newProjectCreatedNotification.loadFromCaseInsensitiveObject(message.message);
|
|
263
|
-
// newProjectCreatedNotification.route = ChannelRoutes.ViewAccount;
|
|
264
|
-
// this.store.dispatch(new NewNotificationReceived(newProjectCreatedNotification));
|
|
265
|
-
// this.store.dispatch(new RolesFetchTriggered());
|
|
266
|
-
// } else if (message.message.NotificationTypeGuid.toString().toLowerCase() == NotificationTypeIds.GoalApprovedFromReplan.toString().toLowerCase()) {
|
|
267
|
-
// const goalApprovedNotificationModel = new GoalApprovedNotificationModel();
|
|
268
|
-
// goalApprovedNotificationModel.loadFromCaseInsensitiveObject(message.message);
|
|
269
|
-
// goalApprovedNotificationModel.route = ChannelRoutes.ViewAccount;
|
|
270
|
-
// this.store.dispatch(new NewNotificationReceived(goalApprovedNotificationModel));
|
|
271
|
-
// this.store.dispatch(new RolesFetchTriggered());
|
|
272
|
-
// } else if (message.message.NotificationTypeGuid.toString().toLowerCase() == NotificationTypeIds.USerStoryUpdateNotificationId.toString().toLowerCase()) {
|
|
273
|
-
// const userStoryUpdateNotificationModel = new UserStoryUpdateNotificationModel();
|
|
274
|
-
// userStoryUpdateNotificationModel.loadFromCaseInsensitiveObject(message.message);
|
|
275
|
-
// userStoryUpdateNotificationModel.route = ChannelRoutes.ViewAccount;
|
|
276
|
-
// this.store.dispatch(new NewNotificationReceived(userStoryUpdateNotificationModel));
|
|
277
|
-
// this.store.dispatch(new RolesFetchTriggered());
|
|
278
|
-
// } else if (message.message.NotificationTypeGuid.toString().toLowerCase() == NotificationTypeIds.PushNotificationForUserStoryComment.toString().toLowerCase()) {
|
|
279
|
-
// const userStoryCommentNotificationModel = new UserStoryCommentNotificationModel();
|
|
280
|
-
// userStoryCommentNotificationModel.loadFromCaseInsensitiveObject(message.message);
|
|
281
|
-
// userStoryCommentNotificationModel.route = ChannelRoutes.ViewAccount;
|
|
282
|
-
// this.store.dispatch(new NewNotificationReceived(userStoryCommentNotificationModel));
|
|
283
|
-
// this.store.dispatch(new RolesFetchTriggered());
|
|
284
|
-
// } else if (message.message.NotificationTypeGuid.toString().toLowerCase() == NotificationTypeIds.SprintStarted.toString().toLowerCase()) {
|
|
285
|
-
// const sprintStartedNotificationModel = new SprintStartedNotificationModel();
|
|
286
|
-
// sprintStartedNotificationModel.loadFromCaseInsensitiveObject(message.message);
|
|
287
|
-
// sprintStartedNotificationModel.route = ChannelRoutes.ViewAccount;
|
|
288
|
-
// this.store.dispatch(new NewNotificationReceived(sprintStartedNotificationModel));
|
|
289
|
-
// this.store.dispatch(new RolesFetchTriggered());
|
|
290
|
-
// } else if (message.message.NotificationTypeGuid.toString().toLowerCase() == NotificationTypeIds.SprintRequestdForREplan.toString().toLowerCase()) {
|
|
291
|
-
// const sprintReplanStartedNotificationModel = new SprintReplanStartedNotificationModel();
|
|
292
|
-
// sprintReplanStartedNotificationModel.loadFromCaseInsensitiveObject(message.message);
|
|
293
|
-
// sprintReplanStartedNotificationModel.route = ChannelRoutes.ViewAccount;
|
|
294
|
-
// this.store.dispatch(new NewNotificationReceived(sprintReplanStartedNotificationModel));
|
|
295
|
-
// this.store.dispatch(new RolesFetchTriggered());
|
|
296
|
-
// } else {
|
|
297
|
-
// // TODO: Send these errors onto server for further processing
|
|
298
|
-
// console.log("Found undetected notification type. " + message.message.NotificationTypeGuid);
|
|
299
|
-
// }
|
|
300
|
-
// // Add other notifications here.
|
|
301
|
-
// } catch (exception) {
|
|
302
|
-
// // TODO: Send these exceptions onto server for further processing
|
|
303
|
-
// console.log("Exception Occured" + exception.message);
|
|
304
|
-
// }
|
|
305
|
-
// };
|
|
306
|
-
// this.pubnub.addListener({
|
|
307
|
-
// status: st => {
|
|
308
|
-
// if (st.category === "PNUnknownCategory") {
|
|
309
|
-
// var newState = {
|
|
310
|
-
// new: "error"
|
|
311
|
-
// };
|
|
312
|
-
// this.pubnub.setState(
|
|
313
|
-
// {
|
|
314
|
-
// state: newState
|
|
315
|
-
// }
|
|
316
|
-
// // function (status) {
|
|
317
|
-
// // console.log(st.errorData.message);
|
|
318
|
-
// // }
|
|
319
|
-
// );
|
|
320
|
-
// }
|
|
321
|
-
// },
|
|
322
|
-
// message: message => {
|
|
323
|
-
// console.log("subscribed to " + message);
|
|
324
|
-
// storeListner(message);
|
|
325
|
-
// }
|
|
326
|
-
// });
|
|
327
|
-
}
|
|
328
|
-
ngOnInit() {
|
|
329
|
-
this.router.events
|
|
330
|
-
.pipe(takeUntil(this.ngDestroyed$))
|
|
331
|
-
.subscribe((routeChange) => {
|
|
332
|
-
if (routeChange instanceof NavigationEnd) {
|
|
333
|
-
if (this.notificPanel) {
|
|
334
|
-
this.notificPanel.close();
|
|
335
|
-
}
|
|
336
|
-
}
|
|
337
|
-
});
|
|
338
|
-
this.signalr.notifications$.subscribe((data) => {
|
|
339
|
-
this.newNotifications = data && data.length > 0 ? data : [];
|
|
340
|
-
this.cdRef.detectChanges();
|
|
341
|
-
});
|
|
342
|
-
this.getSoftLabelConfigurations();
|
|
343
|
-
this.notifications$ = this.store.pipe(select(sharedModuleReducers.getNotificationAll), tap(x => console.log(x)));
|
|
344
|
-
this.authenticatedUserRecord$ = this.store.pipe(select(sharedModuleReducers.getAuthenticatedUserModel));
|
|
345
|
-
this.loadingNotifications$ = this.store.pipe(select(sharedModuleReducers.getNotificationsLoading));
|
|
346
|
-
}
|
|
347
|
-
getSoftLabelConfigurations() {
|
|
348
|
-
this.softLabels = JSON.parse(localStorage.getItem('SoftLabels'));
|
|
349
|
-
}
|
|
350
|
-
clearAll(e) {
|
|
351
|
-
const notifications = [];
|
|
352
|
-
this.notifications.forEach((element) => {
|
|
353
|
-
notifications.push(element);
|
|
354
|
-
});
|
|
355
|
-
this.store.dispatch(new ClearAllNotifications(notifications));
|
|
356
|
-
e.preventDefault();
|
|
357
|
-
this.notificationColor = !this.notificationColor;
|
|
358
|
-
}
|
|
359
|
-
// openAnnouncementDialog(announced) {
|
|
360
|
-
// this.dialog.closeAll();
|
|
361
|
-
// const dialogRef = this.dialog.open(AnnoucementDialogComponent, {
|
|
362
|
-
// minWidth: "60vw",
|
|
363
|
-
// maxWidth: "60vw",
|
|
364
|
-
// minHeight: "50vh",
|
|
365
|
-
// maxHeight: "80vh",
|
|
366
|
-
// disableClose: true,
|
|
367
|
-
// data: {
|
|
368
|
-
// announcementId: announced.AnnouncementId,
|
|
369
|
-
// announcement: announced.Announcement,
|
|
370
|
-
// announcedBy: announced.AnnouncedBy,
|
|
371
|
-
// announcedById: announced.AnnouncedById,
|
|
372
|
-
// announcedByUserImage: announced.AnnouncedByUserImage,
|
|
373
|
-
// announcedOn: announced.AnnouncedOn
|
|
374
|
-
// }
|
|
375
|
-
// });
|
|
376
|
-
// dialogRef.componentInstance.closeMatDialog.subscribe((result) => {
|
|
377
|
-
// const index = this.notifications.findIndex((p) => p.notificationId.toString().toLowerCase() == this.announceNotificationId.toString().toLowerCase());
|
|
378
|
-
// if (index > -1) {
|
|
379
|
-
// this.upsertReadNotification(this.notifications[index]);
|
|
380
|
-
// }
|
|
381
|
-
// });
|
|
382
|
-
// }
|
|
383
|
-
upsertReadNotification(selectedNotification) {
|
|
384
|
-
const notifications = [];
|
|
385
|
-
var roles = JSON.parse(localStorage.getItem(LocalStorageProperties.RoleFeatures));
|
|
386
|
-
let Feature_ApproveOrRejectLeave = '2C22916F-B80B-4C51-9534-23F698DE120B';
|
|
387
|
-
let canAccess_feature_ApproveOrRejectLeave = _.find(roles, function (role) { return role['featureId'].toLowerCase() == Feature_ApproveOrRejectLeave.toString().toLowerCase(); }) != null;
|
|
388
|
-
const CurrentUserId = this.cookieService.get(LocalStorageProperties.CurrentUserId);
|
|
389
|
-
notifications.push(selectedNotification);
|
|
390
|
-
const notiifcationmodel = JSON.parse(selectedNotification.notificationJson);
|
|
391
|
-
if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
|
|
392
|
-
NotificationTypeIds.NewProjectCreatedNotificationId.toString().toLowerCase() ||
|
|
393
|
-
selectedNotification.notificationTypeId.toString().toLowerCase() ==
|
|
394
|
-
NotificationTypeIds.ProjectMemberRoleAddedNotificationId.toString().toLowerCase()) {
|
|
395
|
-
this.router.navigate(["projects/projectstatus/" + notiifcationmodel.ProjectGuid + "/active-goals"]);
|
|
396
|
-
}
|
|
397
|
-
else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
|
|
398
|
-
NotificationTypeIds.GoalApprovedFromReplan.toString().toLowerCase()) {
|
|
399
|
-
this.router.navigate(["projects/goal/" + notiifcationmodel.GoalGuid]);
|
|
400
|
-
}
|
|
401
|
-
else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
|
|
402
|
-
NotificationTypeIds.Notification_WorkItemAssignedToUser.toString().toLowerCase()) {
|
|
403
|
-
this.router.navigate(["projects/workitem/" + notiifcationmodel.UserStoryGuid]);
|
|
404
|
-
}
|
|
405
|
-
else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
|
|
406
|
-
NotificationTypeIds.USerStoryUpdateNotificationId.toString().toLowerCase()) {
|
|
407
|
-
this.router.navigate(["projects/workitem/" + notiifcationmodel.UserStoryId]);
|
|
408
|
-
}
|
|
409
|
-
else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
|
|
410
|
-
NotificationTypeIds.SprintStarted.toString().toLowerCase()) {
|
|
411
|
-
this.router.navigate(["projects/sprint/" + notiifcationmodel.SprintGuid]);
|
|
412
|
-
}
|
|
413
|
-
else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
|
|
414
|
-
NotificationTypeIds.PushNotificationForUserStoryComment.toString().toLowerCase()) {
|
|
415
|
-
this.router.navigate(["projects/workitem/" + notiifcationmodel.UserStoryGuid]);
|
|
416
|
-
}
|
|
417
|
-
else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
|
|
418
|
-
NotificationTypeIds.GoalRequestdForREplan.toString().toLowerCase()) {
|
|
419
|
-
this.router.navigate(["projects/goal/" + notiifcationmodel.GoalGuid]);
|
|
420
|
-
}
|
|
421
|
-
else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
|
|
422
|
-
NotificationTypeIds.SprintRequestdForREplan.toString().toLowerCase()) {
|
|
423
|
-
this.router.navigate(["projects/sprint/" + notiifcationmodel.SprintGuid]);
|
|
424
|
-
}
|
|
425
|
-
else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
|
|
426
|
-
NotificationTypeIds.Notification_AdhocWorkItemAssignedToUser.toString().toLowerCase()) {
|
|
427
|
-
this.router.navigate(["dashboard/adhoc-workitem/" + notiifcationmodel.UserStoryGuid]);
|
|
428
|
-
}
|
|
429
|
-
else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
|
|
430
|
-
NotificationTypeIds.AdhocUSerStoryUpdateNotificationId.toString().toLowerCase()) {
|
|
431
|
-
this.router.navigate(["dashboard/adhoc-workitem/" + notiifcationmodel.UserStoryId]);
|
|
432
|
-
}
|
|
433
|
-
else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
|
|
434
|
-
NotificationTypeIds.LeaveApplication.toString().toLowerCase() && canAccess_feature_ApproveOrRejectLeave) {
|
|
435
|
-
this.router.navigate(["hrmanagment/leaves"]);
|
|
436
|
-
}
|
|
437
|
-
else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
|
|
438
|
-
NotificationTypeIds.ApproveLeaveApplication.toString().toLowerCase()) {
|
|
439
|
-
this.router.navigate(["dashboard/profile/" + CurrentUserId + "/leaves-permissions"]);
|
|
440
|
-
}
|
|
441
|
-
else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
|
|
442
|
-
NotificationTypeIds.RejectLeaveApplication.toString().toLowerCase()) {
|
|
443
|
-
this.router.navigate(["dashboard/profile/" + CurrentUserId + "/leaves-permissions"]);
|
|
444
|
-
}
|
|
445
|
-
else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
|
|
446
|
-
NotificationTypeIds.AutoTimeSheetSubmissionNotification.toString().toLowerCase()) {
|
|
447
|
-
this.router.navigate(["dashboard/profile/" + CurrentUserId + "/timesheetApproval"]);
|
|
448
|
-
}
|
|
449
|
-
else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
|
|
450
|
-
NotificationTypeIds.ProbationAssignNotification.toString().toLowerCase()) {
|
|
451
|
-
this.router.navigate(["dashboard/profile/" + notiifcationmodel.UserId + "/probation"]);
|
|
452
|
-
}
|
|
453
|
-
else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
|
|
454
|
-
NotificationTypeIds.ReviewAssignToEmployeeNotification.toString().toLowerCase()) {
|
|
455
|
-
this.router.navigate(["dashboard/profile/" + CurrentUserId + "/probation"]);
|
|
456
|
-
}
|
|
457
|
-
else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
|
|
458
|
-
NotificationTypeIds.ReviewSubmittedByEmployeeNotification.toString().toLowerCase()) {
|
|
459
|
-
this.router.navigate(["dashboard/profile/" + notiifcationmodel.UserId + "/probation"]);
|
|
460
|
-
}
|
|
461
|
-
else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
|
|
462
|
-
NotificationTypeIds.ReviewInvitationNotification.toString().toLowerCase()) {
|
|
463
|
-
this.router.navigate(["dashboard/profile/" + notiifcationmodel.UserId + "/probation"]);
|
|
464
|
-
}
|
|
465
|
-
else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
|
|
466
|
-
NotificationTypeIds.PerformanceReviewSubmittedByEmployeeNotification.toString().toLowerCase()) {
|
|
467
|
-
this.router.navigate(["dashboard/profile/" + notiifcationmodel.UserId + "/performance"]);
|
|
468
|
-
}
|
|
469
|
-
else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
|
|
470
|
-
NotificationTypeIds.PerformanceReviewInvitationNotificationModel.toString().toLowerCase()) {
|
|
471
|
-
this.router.navigate(["dashboard/profile/" + notiifcationmodel.UserId + "/performance"]);
|
|
472
|
-
}
|
|
473
|
-
else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
|
|
474
|
-
NotificationTypeIds.PerformanceReviewAssignToEmployeeNotification.toString().toLowerCase()) {
|
|
475
|
-
this.router.navigate(["dashboard/profile/" + CurrentUserId + "/performance"]);
|
|
476
|
-
}
|
|
477
|
-
this.store.dispatch(new UpsertUnreadNotificationsTriggered(notifications));
|
|
478
|
-
}
|
|
479
|
-
upsertReadNewNotification(notification) {
|
|
480
|
-
let notes = [notification];
|
|
481
|
-
this.signalr.upsertReadNewNotifications(notes)
|
|
482
|
-
.subscribe((res) => {
|
|
483
|
-
if (res.success) {
|
|
484
|
-
this.signalr.removeItemFromNotifications(notification.id);
|
|
485
|
-
}
|
|
486
|
-
});
|
|
487
|
-
if (notification.navigationUrl) {
|
|
488
|
-
window.open(notification.navigationUrl, "_blank");
|
|
489
|
-
}
|
|
490
|
-
}
|
|
491
|
-
clearNewAll(e) {
|
|
492
|
-
this.signalr.upsertReadNewNotifications(this.newNotifications)
|
|
493
|
-
.subscribe((res) => {
|
|
494
|
-
if (res.success) {
|
|
495
|
-
this.signalr.removeAllNotifications();
|
|
496
|
-
}
|
|
497
|
-
});
|
|
498
|
-
}
|
|
499
|
-
ngOnDestroy() {
|
|
500
|
-
this.ngDestroyed$.next();
|
|
501
|
-
}
|
|
502
|
-
}
|
|
503
|
-
NotificationsComponent.ɵfac = function NotificationsComponent_Factory(t) { return new (t || NotificationsComponent)(i0.ɵɵdirectiveInject(i1.Router), i0.ɵɵdirectiveInject(i2.PubNubAngular), i0.ɵɵdirectiveInject(i3.Store), i0.ɵɵdirectiveInject(i4.Actions), i0.ɵɵdirectiveInject(i5.CookieService), i0.ɵɵdirectiveInject(i6.ToastrService), i0.ɵɵdirectiveInject(i7.MatDialog), i0.ɵɵdirectiveInject(i8.OrderByPipe), i0.ɵɵdirectiveInject(i9.SignalrService), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
|
|
504
|
-
NotificationsComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: NotificationsComponent, selectors: [["app-notifications"]], inputs: { notificPanel: "notificPanel" }, decls: 8, vars: 7, consts: [[1, "text-center", "mat-bg-primary", "pt-1", "pb-1"], [1, "m-0"], ["id", "style-1", 4, "ngIf"], ["class", "text-center p-1", 4, "ngIf"], ["class", "text-center mt-05 mb-05", 4, "ngIf"], ["id", "style-1"], ["class", "notification-list p-0 pr-03", "role", "list", 4, "ngFor", "ngForOf"], ["role", "list", 1, "notification-list", "p-0", "pr-03"], ["role", "listitem", "routerLinkActive", "open", 1, "notific-item", "pr-03", "notification-margin", 3, "ngClass", "click"], [1, "mat-list-text", "pl-0", "pr-03", "notification-cursor", "notifications-list-item"], [1, "word-break", "display-pre-line", 2, "margin", "0px !important", 3, "innerHTML"], [1, "time", "text-muted"], [1, "text-center", "p-1"], [1, "text-center", "mt-05", "mb-05"], [1, "mb-0"], [3, "click"]], template: function NotificationsComponent_Template(rf, ctx) { if (rf & 1) {
|
|
505
|
-
i0.ɵɵelementStart(0, "div", 0);
|
|
506
|
-
i0.ɵɵelementStart(1, "h6", 1);
|
|
507
|
-
i0.ɵɵtext(2);
|
|
508
|
-
i0.ɵɵpipe(3, "translate");
|
|
509
|
-
i0.ɵɵelementEnd();
|
|
510
|
-
i0.ɵɵelementEnd();
|
|
511
|
-
i0.ɵɵtemplate(4, NotificationsComponent_div_4_Template, 3, 3, "div", 2);
|
|
512
|
-
i0.ɵɵtemplate(5, NotificationsComponent_div_5_Template, 3, 3, "div", 3);
|
|
513
|
-
i0.ɵɵelement(6, "mat-divider");
|
|
514
|
-
i0.ɵɵtemplate(7, NotificationsComponent_div_7_Template, 5, 3, "div", 4);
|
|
515
|
-
} if (rf & 2) {
|
|
516
|
-
i0.ɵɵadvance(2);
|
|
517
|
-
i0.ɵɵtextInterpolate2("", i0.ɵɵpipeBind1(3, 5, "NOTIFICATIONS.NOTIFICATIONSTITLE"), " (", ctx.newNotifications == null ? null : ctx.newNotifications.length, ")");
|
|
518
|
-
i0.ɵɵadvance(2);
|
|
519
|
-
i0.ɵɵproperty("ngIf", ctx.newNotifications.length != 0);
|
|
520
|
-
i0.ɵɵadvance(1);
|
|
521
|
-
i0.ɵɵproperty("ngIf", ctx.newNotifications.length == 0);
|
|
522
|
-
i0.ɵɵadvance(2);
|
|
523
|
-
i0.ɵɵproperty("ngIf", ctx.newNotifications.length);
|
|
524
|
-
} }, directives: [i10.NgIf, i11.MatDivider, i10.NgForOf, i12.MatNavList, i12.MatListItem, i1.RouterLinkActive, i10.NgClass, i13.DefaultClassDirective], pipes: [i14.TranslatePipe, i8.OrderByPipe, i15.SanitizeHtmlPipe, i16.TimeagoPipe, i17.UtcToLocalTimePipe], encapsulation: 2 });
|
|
525
|
-
(function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(NotificationsComponent, [{
|
|
526
|
-
type: Component,
|
|
527
|
-
args: [{
|
|
528
|
-
selector: "app-notifications",
|
|
529
|
-
templateUrl: "./notifications.component.html"
|
|
530
|
-
}]
|
|
531
|
-
}], function () { return [{ type: i1.Router }, { type: i2.PubNubAngular }, { type: i3.Store }, { type: i4.Actions }, { type: i5.CookieService }, { type: i6.ToastrService }, { type: i7.MatDialog }, { type: i8.OrderByPipe }, { type: i9.SignalrService }, { type: i0.ChangeDetectorRef }]; }, { notificPanel: [{
|
|
532
|
-
type: Input
|
|
533
|
-
}] }); })();
|
|
534
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90aWZpY2F0aW9ucy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zaGVsbC1tb2R1bGUtY29tcG9uZW50cy9zaGVsbC1jb21wb25lbnRzL3NyYy9saWIvc2hlbGwtY29tcG9uZW50cy9jb21wb25lbnRzL25vdGlmaWNhdGlvbnMvbm90aWZpY2F0aW9ucy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zaGVsbC1tb2R1bGUtY29tcG9uZW50cy9zaGVsbC1jb21wb25lbnRzL3NyYy9saWIvc2hlbGwtY29tcG9uZW50cy9jb21wb25lbnRzL25vdGlmaWNhdGlvbnMvbm90aWZpY2F0aW9ucy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQThDLFNBQVMsRUFBRSxLQUFLLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFFckcsT0FBTyxFQUFFLGFBQWEsRUFBVSxNQUFNLGlCQUFpQixDQUFDO0FBQ3hELE9BQU8sRUFBVyxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDaEQsT0FBTyxFQUFFLE1BQU0sRUFBUyxNQUFNLGFBQWEsQ0FBQztBQUk1QyxPQUFPLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEQsT0FBTyxFQUFFLHlCQUF5QixFQUF1QixNQUFNLDRDQUE0QyxDQUFDO0FBQzVHLE9BQU8sRUFBRSxxQkFBcUIsRUFBMkIsd0JBQXdCLEVBQUUsa0NBQWtDLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUV6SyxPQUFPLEtBQUssb0JBQW9CLE1BQU0sNEJBQTRCLENBQUM7QUFDbkUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFLNUUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sK0RBQStELENBQUM7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QzdDbkMsOEJBQWtEO1FBRWhELDZCQUFnQjtRQUFBLFlBQW1GOztRQUFBLGlCQUFLO1FBQzFHLGlCQUFNO1FBQ04sdUVBa0JNO1FBQ04sdUVBQzhEO1FBQzlELDhCQUEyQjtRQUMzQix1RUFHTTs7UUEzQlksZUFBbUY7UUFBbkYsaUtBQW1GO1FBRWxGLGVBQWtDO1FBQWxDLHVEQUFrQztRQW1CdkIsZUFBa0M7UUFBbEMsdURBQWtDO1FBRzFCLGVBQTZCO1FBQTdCLGtEQUE2Qjs7dUZEbUJ0RCxzQkFBc0I7Y0FMbEMsU0FBUztlQUFDO2dCQUNULFFBQVEsRUFBRSxtQkFBbUI7Z0JBQzdCLFdBQVcsRUFBRSxnQ0FBZ0M7YUFDOUM7c1NBSVUsWUFBWTtrQkFBcEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBJbnB1dCwgT25Jbml0IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgTWF0RGlhbG9nIH0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2RpYWxvZ1wiO1xyXG5pbXBvcnQgeyBOYXZpZ2F0aW9uRW5kLCBSb3V0ZXIgfSBmcm9tIFwiQGFuZ3VsYXIvcm91dGVyXCI7XHJcbmltcG9ydCB7IEFjdGlvbnMsIG9mVHlwZSB9IGZyb20gXCJAbmdyeC9lZmZlY3RzXCI7XHJcbmltcG9ydCB7IHNlbGVjdCwgU3RvcmUgfSBmcm9tIFwiQG5ncngvc3RvcmVcIjtcclxuaW1wb3J0IHsgQ29va2llU2VydmljZSB9IGZyb20gXCJuZ3gtY29va2llLXNlcnZpY2VcIjtcclxuaW1wb3J0IHsgVG9hc3RyU2VydmljZSB9IGZyb20gXCJuZ3gtdG9hc3RyXCI7XHJcbmltcG9ydCB7IFB1Yk51YkFuZ3VsYXIgfSBmcm9tIFwicHVibnViLWFuZ3VsYXIyXCI7XHJcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQgeyB0YWtlVW50aWwsIHRhcCB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xyXG5pbXBvcnQgeyBBdXRoZW50aWNhdGlvbkFjdGlvblR5cGVzLCBSb2xlc0ZldGNoVHJpZ2dlcmVkIH0gZnJvbSBcIi4uLy4uL3N0b3JlL2FjdGlvbnMvYXV0aGVudGljYXRpb24uYWN0aW9uc1wiO1xyXG5pbXBvcnQgeyBDbGVhckFsbE5vdGlmaWNhdGlvbnMsIE5ld05vdGlmaWNhdGlvblJlY2VpdmVkLCBOb3RpZmljYXRpb25zQWN0aW9uVHlwZXMsIFVwc2VydFVucmVhZE5vdGlmaWNhdGlvbnNUcmlnZ2VyZWQgfSBmcm9tIFwiLi4vLi4vc3RvcmUvYWN0aW9ucy9ub3RpZmljYXRpb25zLmFjdGlvbnNcIjtcclxuaW1wb3J0IHsgU3RhdGUgfSBmcm9tIFwiLi4vLi4vc3RvcmUvcmVkdWNlcnMvaW5kZXhcIjtcclxuaW1wb3J0ICogYXMgc2hhcmVkTW9kdWxlUmVkdWNlcnMgZnJvbSBcIi4uLy4uL3N0b3JlL3JlZHVjZXJzL2luZGV4XCI7XHJcbmltcG9ydCB7IE5vdGlmaWNhdGlvblR5cGVJZHMgfSBmcm9tICcuLi8uLi9jb25zdGFudHMvbm90aWZpY2F0aW9uLXR5cGUtaWRzJztcclxuaW1wb3J0IHsgTm90aWZpY2F0aW9uTW9kZWwsIE5vdGlmaWNhdGlvbk91dHB1dE1vZGVsLCBVc2VyTm90aWZpY2F0aW9uUmVhZE1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL05vdGlmaWNhdGlvbnNPdXRQdXRNb2RlbCc7XHJcbmltcG9ydCB7IFNvZnRMYWJlbENvbmZpZ3VyYXRpb25Nb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9zb2Z0bGFiZWxzLW1vZGVsJztcclxuaW1wb3J0IHsgVXNlck1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3VzZXInO1xyXG5pbXBvcnQgeyBPcmRlckJ5UGlwZSB9IGZyb20gJy4uLy4uLy4uL2dsb2JhbGRlcGVuZGVuY2llcy9waXBlcy9vcmRlcmJ5LXBpcGUnO1xyXG5pbXBvcnQgeyBMb2NhbFN0b3JhZ2VQcm9wZXJ0aWVzIH0gZnJvbSAnLi4vLi4vLi4vZ2xvYmFsZGVwZW5kZW5jaWVzL2NvbnN0YW50cy9sb2NhbHN0b3JhZ2UtcHJvcGVydGllcyc7XHJcbmltcG9ydCB7IENoYW5uZWxOYW1lcyB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy9jaGFubmVsLW5hbWVzJztcclxuaW1wb3J0IHsgQ2hhbm5lbFJvdXRlcyB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy9ub3RpZmljYXRpb24tcm91dGVzJztcclxuaW1wb3J0IHsgVXNlclN0b3J5QXNzaWduZWROb3RpZmljYXRpb24gfSBmcm9tICcuLi8uLi9tb2RlbHMvVXNlclN0b3J5QXNzaWduZWROb3RpZmljYXRpb24nO1xyXG5pbXBvcnQgeyBSb2xlVXBkYXRlZE5vdGlmaWNhdGlvbiB9IGZyb20gJy4uLy4uL21vZGVscy9Sb2xlVXBkYXRlZE5vdGlmaWNhdGlvbic7XHJcbmltcG9ydCB7IFJlcG9ydFN1Ym1pdHRlZE5vdGlmaWNhdGlvbiB9IGZyb20gJy4uLy4uL21vZGVscy9SZXBvcnRTdWJtaXR0ZWROb3RpZmljYXRpb24nO1xyXG5pbXBvcnQgeyBSZXBvcnRDb25maWdBc3NpZ25lZE5vdGlmaWNhdGlvbiB9IGZyb20gJy4uLy4uL21vZGVscy9SZXBvcnRDb25maWdBc3NpZ25lZE5vdGlmaWNhdGlvbic7XHJcbmltcG9ydCB7IE11bHRpcGxlQ2hhcnRzU2NoZWR1bGluZyB9IGZyb20gJy4uLy4uL21vZGVscy9tdWx0aUNoYXJ0c1NjaGVkdWxpbmcnO1xyXG5pbXBvcnQgeyBBc3NldEFzc2lnbmVkTm90aWZpY2F0aW9uIH0gZnJvbSAnLi4vLi4vbW9kZWxzL0Fzc2V0QXNzaWduZWROb3RpZmljYXRpb25Nb2RlbCc7XHJcbmltcG9ydCB7IE5ld1Byb2plY3RDcmVhdGVkTm90aWZpY2F0aW9uTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvTmV3UHJvamVjdENyZWF0ZWROb3RpZmljYXRpb25Nb2RlbCc7XHJcbmltcG9ydCB7IEdvYWxBcHByb3ZlZE5vdGlmaWNhdGlvbk1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2dvYWxBcHByb3ZlZE5vdGlmaWNhdGlvbk1vZGVsJztcclxuaW1wb3J0IHsgVXNlclN0b3J5VXBkYXRlTm90aWZpY2F0aW9uTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvdXNlclN0b3J5VXBkYXRlTm90aWZpY2F0aW9uTW9kZWwnO1xyXG5pbXBvcnQgeyBVc2VyU3RvcnlDb21tZW50Tm90aWZpY2F0aW9uTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvdXNlclN0b3J5Q29tbWVudE5vdGlmaWNhdGlvbk1vZGVsJztcclxuaW1wb3J0IHsgU3ByaW50U3RhcnRlZE5vdGlmaWNhdGlvbk1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3NwcmludFN0YXJ0ZWROb3RpZmljYXRpb25Nb2RlbCc7XHJcbmltcG9ydCB7IFNwcmludFJlcGxhblN0YXJ0ZWROb3RpZmljYXRpb25Nb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9zcHJpbnRSZXBsYW5SZXF1ZXN0ZWRNb2RlbCc7XHJcbmltcG9ydCB7IEFubm91Y2VtZW50RGlhbG9nQ29tcG9uZW50IH0gZnJvbSAnLi9hbm5vdW5jZW1lbnQtZGlhbG9nLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEd1aWQgfSBmcm9tICdndWlkLXR5cGVzY3JpcHQnO1xyXG5pbXBvcnQgJy4uLy4uLy4uL2dsb2JhbGRlcGVuZGVuY2llcy9oZWxwZXJzL2ZvbnRhd2Vzb21lLWljb25zJztcclxuaW1wb3J0ICogYXMgXyBmcm9tIFwidW5kZXJzY29yZVwiO1xyXG5pbXBvcnQgeyBTaWduYWxyU2VydmljZSB9IGZyb20gXCIuLi8uLi9zZXJ2aWNlcy9zaWduYWxyLnNlcnZpY2VcIjtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiBcImFwcC1ub3RpZmljYXRpb25zXCIsXHJcbiAgdGVtcGxhdGVVcmw6IFwiLi9ub3RpZmljYXRpb25zLmNvbXBvbmVudC5odG1sXCJcclxufSlcclxuXHJcbmV4cG9ydCBjbGFzcyBOb3RpZmljYXRpb25zQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuXHJcbiAgQElucHV0KCkgbm90aWZpY1BhbmVsO1xyXG5cclxuICBwdWJsaWMgbmdEZXN0cm95ZWQkID0gbmV3IFN1YmplY3QoKTtcclxuICBjb25zdE5vdGlmaWNhdGlvbl9Xb3JrSXRlbUFzc2lnbmVkVG9Vc2VyID0gTm90aWZpY2F0aW9uVHlwZUlkcy5Ob3RpZmljYXRpb25fV29ya0l0ZW1Bc3NpZ25lZFRvVXNlcjtcclxuICBub3RpZmljYXRpb25zJDogT2JzZXJ2YWJsZTxOb3RpZmljYXRpb25PdXRwdXRNb2RlbFtdPjtcclxuICBub3RpZmljYXRpb25zOiBOb3RpZmljYXRpb25PdXRwdXRNb2RlbFtdO1xyXG4gIHNvZnRMYWJlbHM6IFNvZnRMYWJlbENvbmZpZ3VyYXRpb25Nb2RlbFtdO1xyXG4gIGxvYWRpbmdOb3RpZmljYXRpb25zJDogT2JzZXJ2YWJsZTxib29sZWFuPjtcclxuICBzZWxlY3RlZE5vdGlmaWNhdGlvbjogVXNlck5vdGlmaWNhdGlvblJlYWRNb2RlbDtcclxuICBhbm5vdW5jZW1lbnRJZDogc3RyaW5nO1xyXG4gIGFubm91bmNlTm90aWZpY2F0aW9uSWQ6IHN0cmluZztcclxuICBub3RpZmljYXRpb25Db2xvciA9IGZhbHNlO1xyXG4gIGF1dGhlbnRpY2F0ZWRVc2VyUmVjb3JkJDogT2JzZXJ2YWJsZTxVc2VyTW9kZWw+O1xyXG4gIG5ld05vdGlmaWNhdGlvbnM6IE5vdGlmaWNhdGlvbk1vZGVsW10gPSBbXTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLCBwcml2YXRlIHB1Ym51YjogUHViTnViQW5ndWxhciwgcHJpdmF0ZSBzdG9yZTogU3RvcmU8U3RhdGU+LFxyXG4gICAgcHJpdmF0ZSBhY3Rpb25VcGRhdGVzJDogQWN0aW9ucywgcHJpdmF0ZSBjb29raWVTZXJ2aWNlOiBDb29raWVTZXJ2aWNlLCBwcml2YXRlIHRvYXN0cjogVG9hc3RyU2VydmljZSxcclxuICAgIHB1YmxpYyBkaWFsb2c6IE1hdERpYWxvZywgcHJpdmF0ZSBvcmRlckJ5UGlwZTogT3JkZXJCeVBpcGUsIHByaXZhdGUgc2lnbmFscjogU2lnbmFsclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGNkUmVmOiBDaGFuZ2VEZXRlY3RvclJlZiwpIHtcclxuICAgIHRoaXMuYWN0aW9uVXBkYXRlcyRcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgdGFrZVVudGlsKHRoaXMubmdEZXN0cm95ZWQkKSxcclxuICAgICAgICBvZlR5cGUoQXV0aGVudGljYXRpb25BY3Rpb25UeXBlcy5Vc2VyRGV0YWlsc0ZldGNoZWRBZnRlckxvZ2luKSxcclxuICAgICAgICB0YXAoKCkgPT4ge1xyXG4gICAgICAgICAgaWYgKHRoaXMuY29va2llU2VydmljZS5jaGVjayhMb2NhbFN0b3JhZ2VQcm9wZXJ0aWVzLkN1cnJlbnRVc2VySWQpKSB7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBDdXJyZW50VXNlcklkID0gdGhpcy5jb29raWVTZXJ2aWNlLmdldChMb2NhbFN0b3JhZ2VQcm9wZXJ0aWVzLkN1cnJlbnRVc2VySWQpO1xyXG4gICAgICAgICAgICAvLyBTdWJzY3JpYmUgdG8gVGFzayBBc3NpZ25tZW50IE5vdGlmaWNhaXRvbnMgaGVyZS5cclxuICAgICAgICAgICAgY29uc3QgdGFza0Fzc2lnbm1lbnRDaGFubmVsVG9TdWJzY3JpYmVJbnRvID0gQ2hhbm5lbE5hbWVzLkNoYW5uZWxfVGFza0Fzc2lnbm1lbnRzICsgQ3VycmVudFVzZXJJZDtcclxuICAgICAgICAgICAgY29uc3QgdGFzdGF0dXNSZXBvcnRTdWJtaXNzaW9uQ2hhbm5lbFRvU3Vic2NyaWJlSW50byA9IENoYW5uZWxOYW1lcy5DaGFubmVsX1N0YXR1c1JlcG9ydFN1Ym1pc3Npb24gKyBDdXJyZW50VXNlcklkO1xyXG4gICAgICAgICAgICBjb25zdCB0YXN0YXR1c0NvbmZpZ0Fzc2lnbkNoYW5uZWxUb1N1YnNjcmliZUludG8gPSBDaGFubmVsTmFtZXMuQ2hhbm5lbF9TdGF0dXNDb25maWdBc3NpZ24gKyBDdXJyZW50VXNlcklkO1xyXG4gICAgICAgICAgICBjb25zdCBtdWx0aUNoYXJ0c1NjaGVkdWxpbmdDaGFubmVsVG9TdWJzY3JpYmVJbnRvID0gQ2hhbm5lbE5hbWVzLkNoYW5uZWxfTXVsdGlDaGFydHNTY2hlZHVsaW5nICsgQ3VycmVudFVzZXJJZDtcclxuICAgICAgICAgICAgY29uc3QgYXNzZXRzQXNzaWduZWRDaGFubmVsVG9TdWJzY3JpYmVJbnRvID0gQ2hhbm5lbE5hbWVzLkNoYW5uZWxfQXNzZXRBc3NpZ25tZW50ICsgQ3VycmVudFVzZXJJZDtcclxuICAgICAgICAgICAgY29uc3QgcHJvamVjdENyZWF0ZWRDaGFubmVsVG9TdWJzY3JpYmVJbnRvID0gQ2hhbm5lbE5hbWVzLkNoYW5uZWxfTmV3UHJvamVjdCArIEN1cnJlbnRVc2VySWQ7XHJcbiAgICAgICAgICAgIGNvbnN0IHByb2plY3RBY2Nlc3NUb01lbWJlckNoYW5uZWxUb1N1YnNjcmliZUludG8gPSBDaGFubmVsTmFtZXMuQ2hhbm5lbF9Qcm9qZWN0TWVtYmVyUm9sZSArIEN1cnJlbnRVc2VySWQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGdvYWxBcHByb3ZlZENoYW5uZWxUb1N1YnNjcmliZUludG8gPSBDaGFubmVsTmFtZXMuQ2hhbm5lbF9Hb2FsQXBwcm92ZWRGcm9tUmVwbGFuICsgQ3VycmVudFVzZXJJZDtcclxuICAgICAgICAgICAgY29uc3QgdXNlclN0b3J5VXBkYXRlQ2hhbm5lbFRvU3Vic2NyaWJlSW50byA9IENoYW5uZWxOYW1lcy5DaGFubmVsX1VzZXJTdG9yeVVwZGF0ZU5vdGlmaWNhdGlvbiArIEN1cnJlbnRVc2VySWQ7XHJcbiAgICAgICAgICAgIGNvbnN0IEFubm91bmNlbWVudENoYW5uZWxUb1N1YnNjcmliZUludG8gPSBDaGFubmVsTmFtZXMuQ2hhbm5lbF9Bbm5vdW5jZW1lbnROb3RpZmljYXRpb24gKyBDdXJyZW50VXNlcklkO1xyXG4gICAgICAgICAgICBjb25zdCBSZW1pbmRlckNoYW5uZWxUb1N1YnNjcmliZUludG8gPSBDaGFubmVsTmFtZXMuQ2hhbm5lbF9SZW1pbmRlck5vdGlmaWNhdGlvbiArIEN1cnJlbnRVc2VySWQ7XHJcbiAgICAgICAgICAgIGNvbnN0IFBlcmZvcm1hbmNlQ2hhbm5lbFRvU3Vic2NyaWJlSW50byA9IENoYW5uZWxOYW1lcy5DaGFubmVsX1Blcm9mb3JtYW5jZU5vdGlmaWNhdGlvbiArIEN1cnJlbnRVc2VySWQ7XHJcbiAgICAgICAgICAgIGNvbnN0IHVzZXJTdG9yeUNvbW1lbnRDaGFubmVsVG9TdWJzY3JpYmVJbnRvID0gQ2hhbm5lbE5hbWVzLkNoYW5uZWxfVXNlclN0b3J5Q29tbWVudCArIEN1cnJlbnRVc2VySWQ7XHJcbiAgICAgICAgICAgIGNvbnN0IHNwcmludFN0YXJ0ZWRDaGFubmVsVG9TdWJzY3JpYmVJbnRvID0gQ2hhbm5lbE5hbWVzLkNoYW5uZWxfU3ByaW50U3RhcnRlZCArIEN1cnJlbnRVc2VySWQ7XHJcbiAgICAgICAgICAgIGNvbnN0IHNwcmludFJlcGxhbkNoYW5uZWxUb1N1YnNjcmliZUludG8gPSBDaGFubmVsTmFtZXMuQ2hhbm5lbF9TcHJpbnRSZXF1ZXN0ZWRUb1JlcGxhbiArIEN1cnJlbnRVc2VySWQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGxlYXZlQXBwbGllZENoYW5uZWxUb1N1YnNjcmliZUludG8gPSBDaGFubmVsTmFtZXMuQ2hhbm5lbF9MZWF2ZUFwcGxpZWQgKyBDdXJyZW50VXNlcklkO1xyXG4gICAgICAgICAgICBjb25zdCBBcHByb3ZlTGVhdmVDaGFubmVsVG9TdWJzY3JpYmVJbnRvID0gQ2hhbm5lbE5hbWVzLkNoYW5uZWxfQXBwcm92ZUxlYXZlICsgQ3VycmVudFVzZXJJZDtcclxuICAgICAgICAgICAgY29uc3QgUmVqZWN0TGVhdmVDaGFubmVsVG9TdWJzY3JpYmVJbnRvID0gQ2hhbm5lbE5hbWVzLkNoYW5uZWxfUmVqZWN0TGVhdmUgKyBDdXJyZW50VXNlcklkO1xyXG4gICAgICAgICAgICBjb25zdCBSZXNpZ25hdGlvbkNoYW5uZWxUb1N1YnNjcmliZUludG8gPSBDaGFubmVsTmFtZXMuQ2hhbm5lbF9SZXNpZ25hdGlvbiArIEN1cnJlbnRVc2VySWQ7XHJcbiAgICAgICAgICAgIGNvbnN0IEFwcHJvdmVSZXNpZ25hdGlvbkNoYW5uZWxUb1N1YnNjcmliZUludG8gPSBDaGFubmVsTmFtZXMuQ2hhbm5lbF9BcHByb3ZlUmVzaWduYXRpb24gKyBDdXJyZW50VXNlcklkO1xyXG4gICAgICAgICAgICBjb25zdCBSZWplY3RSZXNpZ25hdGlvbkNoYW5uZWxUb1N1YnNjcmliZUludG8gPSBDaGFubmVsTmFtZXMuQ2hhbm5lbF9SZWplY3RSZXNpZ25hdGlvbiArIEN1cnJlbnRVc2VySWQ7XHJcbiAgICAgICAgICAgIGNvbnN0IEF1dG9USW1lc2hlZXRTdWJtaXNzaW9uQ2hhbm5lbFRvU3Vic2NyaWJlSW50byA9IENoYW5uZWxOYW1lcy5DaGFubmVsX0F1dG9UaW1lc2hlZXRTdWJtaXNzaW9uICsgQ3VycmVudFVzZXJJZDtcclxuICAgICAgICAgICAgY29uc3QgUHJvYmF0aW9uQXNzaWduTm90aWZpY2F0aW9uID0gQ2hhbm5lbE5hbWVzLkNoYW5uZWxfUHJvYmF0aW9uQXNzaWduTm90aWZpY2F0aW9uICsgQ3VycmVudFVzZXJJZDtcclxuICAgICAgICAgICAgY29uc3QgUmV2aWV3QXNzaWduVG9FbXBsb3llZU5vdGlmaWNhdGlvbiA9IENoYW5uZWxOYW1lcy5DaGFubmVsX1Jldmlld0Fzc2lnblRvRW1wbG95ZWVOb3RpZmljYXRpb24gKyBDdXJyZW50VXNlcklkO1xyXG4gICAgICAgICAgICBjb25zdCBSZXZpZXdTdWJtaXR0ZWRCeUVtcGxveWVlTm90aWZpY2F0aW9uID0gQ2hhbm5lbE5hbWVzLkNoYW5uZWxfUmV2aWV3U3VibWl0dGVkQnlFbXBsb3llZU5vdGlmaWNhdGlvbiArIEN1cnJlbnRVc2VySWQ7XHJcbiAgICAgICAgICAgIGNvbnN0IFJldmlld0ludml0YXRpb25Ob3RpZmljYXRpb25Nb2RlbCA9IENoYW5uZWxOYW1lcy5DaGFubmVsX1Jldmlld0ludml0YXRpb25Ob3RpZmljYXRpb25Nb2RlbCArIEN1cnJlbnRVc2VySWQ7XHJcbiAgICAgICAgICAgIGNvbnN0IFBlcmZvcm1hbmNlUmV2aWV3U3VibWl0dGVkQnlFbXBsb3llZU5vdGlmaWNhdGlvbiA9IENoYW5uZWxOYW1lcy5DaGFubmVsX1BlcmZvcm1hbmNlUmV2aWV3U3VibWl0dGVkQnlFbXBsb3llZU5vdGlmaWNhdGlvbiArIEN1cnJlbnRVc2VySWQ7XHJcbiAgICAgICAgICAgIGNvbnN0IFBlcmZvcm1hbmNlUmV2aWV3SW52aXRhdGlvbk5vdGlmaWNhdGlvbk1vZGVsID0gQ2hhbm5lbE5hbWVzLkNoYW5uZWxfUGVyZm9ybWFuY2VSZXZpZXdJbnZpdGF0aW9uTm90aWZpY2F0aW9uTW9kZWwgKyBDdXJyZW50VXNlcklkO1xyXG4gICAgICAgICAgICBjb25zdCBQZXJmb3JtYW5jZVJldmlld0Fzc2lnblRvRW1wbG95ZWVOb3RpZmljYXRpb24gPSBDaGFubmVsTmFtZXMuQ2hhbm5lbF9QZXJmb3JtYW5jZVJldmlld0Fzc2lnblRvRW1wbG95ZWVOb3RpZmljYXRpb24gKyBDdXJyZW50VXNlcklkO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcInN1YnNjcmliaW5nIHRvIFwiICsgdGFza0Fzc2lnbm1lbnRDaGFubmVsVG9TdWJzY3JpYmVJbnRvKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJzdWJzY3JpYmluZyB0byBcIiArIHRhc3RhdHVzUmVwb3J0U3VibWlzc2lvbkNoYW5uZWxUb1N1YnNjcmliZUludG8pO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcInN1YnNjcmliaW5nIHRvIFwiICsgdGFzdGF0dXNDb25maWdBc3NpZ25DaGFubmVsVG9TdWJzY3JpYmVJbnRvKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJzdWJzY3JpYmluZyB0b1wiICsgYXNzZXRzQXNzaWduZWRDaGFubmVsVG9TdWJzY3JpYmVJbnRvKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJzdWJzY3JpYmluZyB0b1wiICsgcHJvamVjdENyZWF0ZWRDaGFubmVsVG9TdWJzY3JpYmVJbnRvKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJzdWJzY3JpYmluZyB0b1wiICsgcHJvamVjdEFjY2Vzc1RvTWVtYmVyQ2hhbm5lbFRvU3Vic2NyaWJlSW50byk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwic3Vic2NyaWJpbmcgdG9cIiArIGdvYWxBcHByb3ZlZENoYW5uZWxUb1N1YnNjcmliZUludG8pO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcInN1YnNjcmliaW5nIHRvXCIgKyB1c2VyU3RvcnlVcGRhdGVDaGFubmVsVG9TdWJzY3JpYmVJbnRvKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJzdWJzY3JpYmluZyB0b1wiICsgQW5ub3VuY2VtZW50Q2hhbm5lbFRvU3Vic2NyaWJlSW50byk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwic3Vic2NyaWJpbmcgdG9cIiArIHVzZXJTdG9yeUNvbW1lbnRDaGFubmVsVG9TdWJzY3JpYmVJbnRvKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJzdWJzY3JpYmluZyB0b1wiICsgc3ByaW50U3RhcnRlZENoYW5uZWxUb1N1YnNjcmliZUludG8pO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcInN1YnNjcmliaW5nIHRvXCIgKyBzcHJpbnRSZXBsYW5DaGFubmVsVG9TdWJzY3JpYmVJbnRvKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJzdWJzY3JpYmluZyB0b1wiICsgUmVtaW5kZXJDaGFubmVsVG9TdWJzY3JpYmVJbnRvKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJzdWJzY3JpYmluZyB0b1wiICsgUGVyZm9ybWFuY2VDaGFubmVsVG9TdWJzY3JpYmVJbnRvKTtcclxuICAgICAgICAgICAgdGhpcy5wdWJudWIuc3Vic2NyaWJlKHtcclxuICAgICAgICAgICAgICBjaGFubmVsczogW3Rhc2tBc3NpZ25tZW50Q2hhbm5lbFRvU3Vic2NyaWJlSW50bywgdGFzdGF0dXNSZXBvcnRTdWJtaXNzaW9uQ2hhbm5lbFRvU3Vic2NyaWJlSW50byxcclxuICAgICAgICAgICAgICAgIFByb2JhdGlvbkFzc2lnbk5vdGlmaWNhdGlvbiwgUmV2aWV3QXNzaWduVG9FbXBsb3llZU5vdGlmaWNhdGlvbiwgUmV2aWV3U3VibWl0dGVkQnlFbXBsb3llZU5vdGlmaWNhdGlvbixcclxuICAgICAgICAgICAgICAgIFJldmlld0ludml0YXRpb25Ob3RpZmljYXRpb25Nb2RlbCwgUGVyZm9ybWFuY2VSZXZpZXdTdWJtaXR0ZWRCeUVtcGxveWVlTm90aWZpY2F0aW9uLCBQZXJmb3JtYW5jZVJldmlld0Fzc2lnblRvRW1wbG95ZWVOb3RpZmljYXRpb24sXHJcbiAgICAgICAgICAgICAgICB0YXN0YXR1c0NvbmZpZ0Fzc2lnbkNoYW5uZWxUb1N1YnNjcmliZUludG8sIG11bHRpQ2hhcnRzU2NoZWR1bGluZ0NoYW5uZWxUb1N1YnNjcmliZUludG8sIFBlcmZvcm1hbmNlUmV2aWV3SW52aXRhdGlvbk5vdGlmaWNhdGlvbk1vZGVsLFxyXG4gICAgICAgICAgICAgICAgYXNzZXRzQXNzaWduZWRDaGFubmVsVG9TdWJzY3JpYmVJbnRvLCBwcm9qZWN0Q3JlYXRlZENoYW5uZWxUb1N1YnNjcmliZUludG8sICxcclxuICAgICAgICAgICAgICAgIHByb2plY3RBY2Nlc3NUb01lbWJlckNoYW5uZWxUb1N1YnNjcmliZUludG8sIGdvYWxBcHByb3ZlZENoYW5uZWxUb1N1YnNjcmliZUludG8sXHJcbiAgICAgICAgICAgICAgICB1c2VyU3RvcnlVcGRhdGVDaGFubmVsVG9TdWJzY3JpYmVJbnRvLCBBbm5vdW5jZW1lbnRDaGFubmVsVG9TdWJzY3JpYmVJbnRvLCBSZW1pbmRlckNoYW5uZWxUb1N1YnNjcmliZUludG8sIFJlamVjdFJlc2lnbmF0aW9uQ2hhbm5lbFRvU3Vic2NyaWJlSW50byxcclxuICAgICAgICAgICAgICAgIHVzZXJTdG9yeUNvbW1lbnRDaGFubmVsVG9TdWJzY3JpYmVJbnRvLCBzcHJpbnRTdGFydGVkQ2hhbm5lbFRvU3Vic2NyaWJlSW50bywgUmVzaWduYXRpb25DaGFubmVsVG9TdWJzY3JpYmVJbnRvLCBBcHByb3ZlUmVzaWduYXRpb25DaGFubmVsVG9TdWJzY3JpYmVJbnRvLFxyXG4gICAgICAgICAgICAgICAgc3ByaW50UmVwbGFuQ2hhbm5lbFRvU3Vic2NyaWJlSW50bywgbGVhdmVBcHBsaWVkQ2hhbm5lbFRvU3Vic2NyaWJlSW50bywgQXBwcm92ZUxlYXZlQ2hhbm5lbFRvU3Vic2NyaWJlSW50bywgUmVqZWN0TGVhdmVDaGFubmVsVG9TdWJzY3JpYmVJbnRvLFxyXG4gICAgICAgICAgICAgICAgUGVyZm9ybWFuY2VDaGFubmVsVG9TdWJzY3JpYmVJbnRvLCBBdXRvVEltZXNoZWV0U3VibWlzc2lvbkNoYW5uZWxUb1N1YnNjcmliZUludG9dXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAvLyBBZGQgb3RoZXIgc3Vic2NyaXB0aW9ucyBoZXJlLlxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJVc2VyIG5vdCBsb2dnZWQgaW4geWV0IHRvIGJlIGFibGUgdG8gc3Vic2NyaWJlLlwiKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgICApXHJcbiAgICAgIC5zdWJzY3JpYmUoKTtcclxuXHJcbiAgICB0aGlzLmFjdGlvblVwZGF0ZXMkXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLm5nRGVzdHJveWVkJCksXHJcbiAgICAgICAgb2ZUeXBlKEF1dGhlbnRpY2F0aW9uQWN0aW9uVHlwZXMuVXNlckRldGFpbHNGZXRjaGVkQWZ0ZXJMb2dpbiksXHJcbiAgICAgICAgdGFwKCgpID0+IHtcclxuICAgICAgICAgIHZhciByb2xlVXBkYXRlc0NoYW5uZWxUb1N1YnNjcmliZUludG8gPSBDaGFubmVsTmFtZXMuQ2hhbm5lbF9Sb2xlVXBkYXRlcyArIFwiMTlCNkY5RkMtNzM3MC00QjlDLUEwNUMtM0I4RDgxOUVFRUFGXCI7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhcInN1YnNjcmliaW5nIHRvIFwiICsgcm9sZVVwZGF0ZXNDaGFubmVsVG9TdWJzY3JpYmVJbnRvKTtcclxuICAgICAgICAgIHRoaXMucHVibnViLnN1YnNjcmliZSh7XHJcbiAgICAgICAgICAgIGNoYW5uZWxzOiBbcm9sZVVwZGF0ZXNDaGFubmVsVG9TdWJzY3JpYmVJbnRvXVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSlcclxuICAgICAgKVxyXG4gICAgICAuc3Vic2NyaWJlKCk7XHJcblxyXG4gICAgdGhpcy5hY3Rpb25VcGRhdGVzJFxyXG4gICAgICAucGlwZShcclxuICAgICAgICB0YWtlVW50aWwodGhpcy5uZ0Rlc3Ryb3llZCQpLFxyXG4gICAgICAgIG9mVHlwZShOb3RpZmljYXRpb25zQWN0aW9uVHlwZXMuQ2xlYXJBbGxVbnJlYWROb3RpZmljYXRpb25zQ29tcGxldGVkKSxcclxuICAgICAgICB0YXAoKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25zJCA9IHRoaXMuc3RvcmUucGlwZShzZWxlY3Qoc2hhcmVkTW9kdWxlUmVkdWNlcnMuZ2V0Tm90aWZpY2F0aW9uQWxsKSk7XHJcbiAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbnMkLnN1YnNjcmliZSh4ID0+IHtcclxuICAgICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25zID0geDtcclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICB9KVxyXG4gICAgICApXHJcbiAgICAgIC5zdWJzY3JpYmUoKTtcclxuXHJcbiAgICAvLyBjb25zdCBzdG9yZUxpc3RuZXIgPSAobWVzc2FnZSkgPT4ge1xyXG4gICAgLy8gICBjb25zb2xlLmxvZyhcIi0tLS0tLS0tLVJlY2VpdmVkIHB1Ym51YiBtZXNzYWdlLS0tLS0tLS0tXCIpO1xyXG4gICAgLy8gICAvLyB0aGlzLnRvYXN0ci5pbmZvKG1lc3NhZ2UubWVzc2FnZS5TdW1tYXJ5KTtcclxuICAgIC8vICAgdHJ5IHtcclxuICAgIC8vICAgICAvLyBSZWNlaXZpbmcgdGhlIFVzZXIgU3RvcnkgQXNzaWduZWQgTm90aWZpY2F0aW9uXHJcbiAgICAvLyAgICAgaWYgKG1lc3NhZ2UubWVzc2FnZS5Ob3RpZmljYXRpb25UeXBlR3VpZCA9PSBOb3RpZmljYXRpb25UeXBlSWRzLk5vdGlmaWNhdGlvbl9Xb3JrSXRlbUFzc2lnbmVkVG9Vc2VyKSB7XHJcbiAgICAvLyAgICAgICB2YXIgdXNlclN0b3J5QXNzaWduZWROb3RpZmljYXRpb24gPSBuZXcgVXNlclN0b3J5QXNzaWduZWROb3RpZmljYXRpb24oKTtcclxuICAgIC8vICAgICAgIHVzZXJTdG9yeUFzc2lnbmVkTm90aWZpY2F0aW9uLmxvYWRGcm9tQ2FzZUluc2Vuc2l0aXZlT2JqZWN0KG1lc3NhZ2UubWVzc2FnZSk7XHJcbiAgICAvLyAgICAgICB1c2VyU3RvcnlBc3NpZ25lZE5vdGlmaWNhdGlvbi5yb3V0ZSA9IENoYW5uZWxSb3V0ZXMuVmlld1dvcmtJdGVtICsgdXNlclN0b3J5QXNzaWduZWROb3RpZmljYXRpb24ubm90aWZpY2F0aW9uSWQ7XHJcbiAgICAvLyAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBOZXdOb3RpZmljYXRpb25SZWNlaXZlZCh1c2VyU3RvcnlBc3NpZ25lZE5vdGlmaWNhdGlvbikpO1xyXG4gICAgLy8gICAgIH0gZWxzZSBpZiAobWVzc2FnZS5tZXNzYWdlLk5vdGlmaWNhdGlvblR5cGVHdWlkID09IE5vdGlmaWNhdGlvblR5cGVJZHMuTm90aWZpY2F0aW9uX1JvbGVVcGRhdGVkKSB7XHJcbiAgICAvLyAgICAgICB2YXIgcm9sZVVwZGF0ZWROb3RpZmljYXRpb24gPSBuZXcgUm9sZVVwZGF0ZWROb3RpZmljYXRpb24oKTtcclxuICAgIC8vICAgICAgIHJvbGVVcGRhdGVkTm90aWZpY2F0aW9uLmxvYWRGcm9tQ2FzZUluc2Vuc2l0aXZlT2JqZWN0KG1lc3NhZ2UubWVzc2FnZSk7XHJcbiAgICAvLyAgICAgICByb2xlVXBkYXRlZE5vdGlmaWNhdGlvbi5yb3V0ZSA9IENoYW5uZWxSb3V0ZXMuVmlld0FjY291bnQ7XHJcbiAgICAvLyAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBOZXdOb3RpZmljYXRpb25SZWNlaXZlZChyb2xlVXBkYXRlZE5vdGlmaWNhdGlvbikpO1xyXG4gICAgLy8gICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgUm9sZXNGZXRjaFRyaWdnZXJlZCgpKTtcclxuICAgIC8vICAgICB9IGVsc2UgaWYgKG1lc3NhZ2UubWVzc2FnZS5Ob3RpZmljYXRpb25UeXBlR3VpZCA9PSBOb3RpZmljYXRpb25UeXBlSWRzLlN0YXR1c19SZXBvcnRfU3VtaXR0ZWQpIHtcclxuICAgIC8vICAgICAgIHZhciByZXBvcnRTdWJtaXR0ZWROb3RpZmljYXRpb24gPSBuZXcgUmVwb3J0U3VibWl0dGVkTm90aWZpY2F0aW9uKCk7XHJcbiAgICAvLyAgICAgICByZXBvcnRTdWJtaXR0ZWROb3RpZmljYXRpb24ubG9hZEZyb21DYXNlSW5zZW5zaXRpdmVPYmplY3QobWVzc2FnZS5tZXNzYWdlKTtcclxuICAgIC8vICAgICAgIHJlcG9ydFN1Ym1pdHRlZE5vdGlmaWNhdGlvbi5yb3V0ZSA9IENoYW5uZWxSb3V0ZXMuVmlld0FjY291bnQ7XHJcbiAgICAvLyAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBOZXdOb3RpZmljYXRpb25SZWNlaXZlZChyZXBvcnRTdWJtaXR0ZWROb3RpZmljYXRpb24pKTtcclxuICAgIC8vICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IFJvbGVzRmV0Y2hUcmlnZ2VyZWQoKSk7XHJcbiAgICAvLyAgICAgfSBlbHNlIGlmIChtZXNzYWdlLm1lc3NhZ2UuTm90aWZpY2F0aW9uVHlwZUd1aWQgPT0gTm90aWZpY2F0aW9uVHlwZUlkcy5TdGF0dXNfUmVwb3J0X0NvbmZpZ19DcmVhdGVkKSB7XHJcbiAgICAvLyAgICAgICB2YXIgcmVwb3J0Q29uZmlnQXNzaWduZWROb3RpZmljYXRpb24gPSBuZXcgUmVwb3J0Q29uZmlnQXNzaWduZWROb3RpZmljYXRpb24oKTtcclxuICAgIC8vICAgICAgIHJlcG9ydENvbmZpZ0Fzc2lnbmVkTm90aWZpY2F0aW9uLmxvYWRGcm9tQ2FzZUluc2Vuc2l0aXZlT2JqZWN0KG1lc3NhZ2UubWVzc2FnZSk7XHJcbiAgICAvLyAgICAgICByZXBvcnRDb25maWdBc3NpZ25lZE5vdGlmaWNhdGlvbi5yb3V0ZSA9IENoYW5uZWxSb3V0ZXMuVmlld0FjY291bnQ7XHJcbiAgICAvLyAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBOZXdOb3RpZmljYXRpb25SZWNlaXZlZChyZXBvcnRDb25maWdBc3NpZ25lZE5vdGlmaWNhdGlvbikpO1xyXG4gICAgLy8gICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgUm9sZXNGZXRjaFRyaWdnZXJlZCgpKTtcclxuICAgIC8vICAgICB9IGVsc2UgaWYgKG1lc3NhZ2UubWVzc2FnZS5Ob3RpZmljYXRpb25UeXBlR3VpZCA9PSBOb3RpZmljYXRpb25UeXBlSWRzLk11bHRpcGxlX0NoYXJ0c19TY2hlZHVsaW5nX2NyZWF0ZWQpIHtcclxuICAgIC8vICAgICAgIHZhciBtdWx0aXBsZUNoYXJ0c1NjaGVkdWxpbmcgPSBuZXcgTXVsdGlwbGVDaGFydHNTY2hlZHVsaW5nKCk7XHJcbiAgICAvLyAgICAgICBtdWx0aXBsZUNoYXJ0c1NjaGVkdWxpbmcubG9hZEZyb21DYXNlSW5zZW5zaXRpdmVPYmplY3QobWVzc2FnZS5tZXNzYWdlKTtcclxuICAgIC8vICAgICAgIG11bHRpcGxlQ2hhcnRzU2NoZWR1bGluZy5yb3V0ZSA9IENoYW5uZWxSb3V0ZXMuVmlld0FjY291bnQ7XHJcbiAgICAvLyAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBOZXdOb3RpZmljYXRpb25SZWNlaXZlZChtdWx0aXBsZUNoYXJ0c1NjaGVkdWxpbmcpKTtcclxuICAgIC8vICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IFJvbGVzRmV0Y2hUcmlnZ2VyZWQoKSk7XHJcbiAgICAvLyAgICAgfSBlbHNlIGlmIChtZXNzYWdlLm1lc3NhZ2UuTm90aWZpY2F0aW9uVHlwZUd1aWQgPT0gTm90aWZpY2F0aW9uVHlwZUlkcy5Bc3NldHNfQXNzaWdubWVudCkge1xyXG4gICAgLy8gICAgICAgY29uc3QgYXNzZXRBc3NpZ25lZE5vdGlmaWNhdGlvbiA9IG5ldyBBc3NldEFzc2lnbmVkTm90aWZpY2F0aW9uKCk7XHJcbiAgICAvLyAgICAgICBhc3NldEFzc2lnbmVkTm90aWZpY2F0aW9uLmxvYWRGcm9tQ2FzZUluc2Vuc2l0aXZlT2JqZWN0KG1lc3NhZ2UubWVzc2FnZSk7XHJcbiAgICAvLyAgICAgICBhc3NldEFzc2lnbmVkTm90aWZpY2F0aW9uLnJvdXRlID0gQ2hhbm5lbFJvdXRlcy5WaWV3QWNjb3VudDtcclxuICAgIC8vICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IE5ld05vdGlmaWNhdGlvblJlY2VpdmVkKGFzc2V0QXNzaWduZWROb3RpZmljYXRpb24pKTtcclxuICAgIC8vICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IFJvbGVzRmV0Y2hUcmlnZ2VyZWQoKSk7XHJcbiAgICAvLyAgICAgfSBlbHNlIGlmIChtZXNzYWdlLm1lc3NhZ2UuTm90aWZpY2F0aW9uVHlwZUd1aWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09IE5vdGlmaWNhdGlvblR5cGVJZHMuUmVtaW5kZXJfTm90aWZpY2F0aW9uLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgLy8gICAgICAgY29uc3QgYXNzZXRBc3NpZ25lZE5vdGlmaWNhdGlvbiA9IG5ldyBBc3NldEFzc2lnbmVkTm90aWZpY2F0aW9uKCk7XHJcbiAgICAvLyAgICAgICBhc3NldEFzc2lnbmVkTm90aWZpY2F0aW9uLmxvYWRGcm9tQ2FzZUluc2Vuc2l0aXZlT2JqZWN0KG1lc3NhZ2UubWVzc2FnZSk7XHJcbiAgICAvLyAgICAgICBhc3NldEFzc2lnbmVkTm90aWZpY2F0aW9uLnJvdXRlID0gQ2hhbm5lbFJvdXRlcy5WaWV3QWNjb3VudDtcclxuICAgIC8vICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IE5ld05vdGlmaWNhdGlvblJlY2VpdmVkKGFzc2V0QXNzaWduZWROb3RpZmljYXRpb24pKTtcclxuICAgIC8vICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IFJvbGVzRmV0Y2hUcmlnZ2VyZWQoKSk7XHJcbiAgICAvLyAgICAgfSBlbHNlIGlmIChtZXNzYWdlLm1lc3NhZ2UuTm90aWZpY2F0aW9uVHlwZUd1aWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09IE5vdGlmaWNhdGlvblR5cGVJZHMuQW5ub3VuY2VtZW50X1JlY2VpdmVkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgLy8gICAgICAgY29uc3QgYXNzZXRBc3NpZ25lZE5vdGlmaWNhdGlvbiA9IG5ldyBBc3NldEFzc2lnbmVkTm90aWZpY2F0aW9uKCk7XHJcbiAgICAvLyAgICAgICBhc3NldEFzc2lnbmVkTm90aWZpY2F0aW9uLmxvYWRGcm9tQ2FzZUluc2Vuc2l0aXZlT2JqZWN0KG1lc3NhZ2UubWVzc2FnZSk7XHJcbiAgICAvLyAgICAgICBhc3NldEFzc2lnbmVkTm90aWZpY2F0aW9uLnJvdXRlID0gQ2hhbm5lbFJvdXRlcy5WaWV3QWNjb3VudDtcclxuICAgIC8vICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IE5ld05vdGlmaWNhdGlvblJlY2VpdmVkKGFzc2V0QXNzaWduZWROb3RpZmljYXRpb24pKTtcclxuICAgIC8vICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IFJvbGVzRmV0Y2hUcmlnZ2VyZWQoKSk7XHJcbiAgICAvLyAgICAgICBpZiAobWVzc2FnZS5tZXNzYWdlLklkICE9IHRoaXMuYW5ub3VuY2VOb3RpZmljYXRpb25JZCkge1xyXG4gICAgLy8gICAgICAgICB0aGlzLmFubm91bmNlTm90aWZpY2F0aW9uSWQgPSBtZXNzYWdlLm1lc3NhZ2UuSWQ7XHJcbiAgICAvLyAgICAgICAgIHRoaXMub3BlbkFubm91bmNlbWVudERpYWxvZyhtZXNzYWdlLm1lc3NhZ2UpO1xyXG4gICAgLy8gICAgICAgfVxyXG4gICAgLy8gICAgIH0gZWxzZSBpZiAobWVzc2FnZS5tZXNzYWdlLk5vdGlmaWNhdGlvblR5cGVHdWlkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA9PSBOb3RpZmljYXRpb25UeXBlSWRzLlBlcmZvcm1hbmNlX1JlY2VpdmVkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSB8fCBtZXNzYWdlLm1lc3NhZ2UuTm90aWZpY2F0aW9uVHlwZUd1aWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09IE5vdGlmaWNhdGlvblR5cGVJZHMuUHJvamVjdE1lbWJlclJvbGVBZGRlZE5vdGlmaWNhdGlvbklkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgLy8gICAgICAgY29uc3QgbmV3UHJvamVjdENyZWF0ZWROb3RpZmljYXRpb24gPSBuZXcgTmV3UHJvamVjdENyZWF0ZWROb3RpZmljYXRpb25Nb2RlbCgpO1xyXG4gICAgLy8gICAgICAgbmV3UHJvamVjdENyZWF0ZWROb3RpZmljYXRpb24ubG9hZEZyb21DYXNlSW5zZW5zaXRpdmVPYmplY3QobWVzc2FnZS5tZXNzYWdlKTtcclxuICAgIC8vICAgICAgIG5ld1Byb2plY3RDcmVhdGVkTm90aWZpY2F0aW9uLnJvdXRlID0gQ2hhbm5lbFJvdXRlcy5WaWV3QWNjb3VudDtcclxuICAgIC8vICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IE5ld05vdGlmaWNhdGlvblJlY2VpdmVkKG5ld1Byb2plY3RDcmVhdGVkTm90aWZpY2F0aW9uKSk7XHJcbiAgICAvLyAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBSb2xlc0ZldGNoVHJpZ2dlcmVkKCkpO1xyXG4gICAgLy8gICAgIH0gZWxzZSBpZiAobWVzc2FnZS5tZXNzYWdlLk5vdGlmaWNhdGlvblR5cGVHdWlkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA9PSBOb3RpZmljYXRpb25UeXBlSWRzLk5ld1Byb2plY3RDcmVhdGVkTm90aWZpY2F0aW9uSWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpIHx8IG1lc3NhZ2UubWVzc2FnZS5Ob3RpZmljYXRpb25UeXBlR3VpZC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgPT0gTm90aWZpY2F0aW9uVHlwZUlkcy5Qcm9qZWN0TWVtYmVyUm9sZUFkZGVkTm90aWZpY2F0aW9uSWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSB7XHJcbiAgICAvLyAgICAgICBjb25zdCBuZXdQcm9qZWN0Q3JlYXRlZE5vdGlmaWNhdGlvbiA9IG5ldyBOZXdQcm9qZWN0Q3JlYXRlZE5vdGlmaWNhdGlvbk1vZGVsKCk7XHJcbiAgICAvLyAgICAgICBuZXdQcm9qZWN0Q3JlYXRlZE5vdGlmaWNhdGlvbi5sb2FkRnJvbUNhc2VJbnNlbnNpdGl2ZU9iamVjdChtZXNzYWdlLm1lc3NhZ2UpO1xyXG4gICAgLy8gICAgICAgbmV3UHJvamVjdENyZWF0ZWROb3RpZmljYXRpb24ucm91dGUgPSBDaGFubmVsUm91dGVzLlZpZXdBY2NvdW50O1xyXG4gICAgLy8gICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgTmV3Tm90aWZpY2F0aW9uUmVjZWl2ZWQobmV3UHJvamVjdENyZWF0ZWROb3RpZmljYXRpb24pKTtcclxuICAgIC8vICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IFJvbGVzRmV0Y2hUcmlnZ2VyZWQoKSk7XHJcbiAgICAvLyAgICAgfSBlbHNlIGlmIChtZXNzYWdlLm1lc3NhZ2UuTm90aWZpY2F0aW9uVHlwZUd1aWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09IE5vdGlmaWNhdGlvblR5cGVJZHMuR29hbEFwcHJvdmVkRnJvbVJlcGxhbi50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkpIHtcclxuICAgIC8vICAgICAgIGNvbnN0IGdvYWxBcHByb3ZlZE5vdGlmaWNhdGlvbk1vZGVsID0gbmV3IEdvYWxBcHByb3ZlZE5vdGlmaWNhdGlvbk1vZGVsKCk7XHJcbiAgICAvLyAgICAgICBnb2FsQXBwcm92ZWROb3RpZmljYXRpb25Nb2RlbC5sb2FkRnJvbUNhc2VJbnNlbnNpdGl2ZU9iamVjdChtZXNzYWdlLm1lc3NhZ2UpO1xyXG4gICAgLy8gICAgICAgZ29hbEFwcHJvdmVkTm90aWZpY2F0aW9uTW9kZWwucm91dGUgPSBDaGFubmVsUm91dGVzLlZpZXdBY2NvdW50O1xyXG4gICAgLy8gICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgTmV3Tm90aWZpY2F0aW9uUmVjZWl2ZWQoZ29hbEFwcHJvdmVkTm90aWZpY2F0aW9uTW9kZWwpKTtcclxuICAgIC8vICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IFJvbGVzRmV0Y2hUcmlnZ2VyZWQoKSk7XHJcbiAgICAvLyAgICAgfSBlbHNlIGlmIChtZXNzYWdlLm1lc3NhZ2UuTm90aWZpY2F0aW9uVHlwZUd1aWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09IE5vdGlmaWNhdGlvblR5cGVJZHMuVVNlclN0b3J5VXBkYXRlTm90aWZpY2F0aW9uSWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSB7XHJcbiAgICAvLyAgICAgICBjb25zdCB1c2VyU3RvcnlVcGRhdGVOb3RpZmljYXRpb25Nb2RlbCA9IG5ldyBVc2VyU3RvcnlVcGRhdGVOb3RpZmljYXRpb25Nb2RlbCgpO1xyXG4gICAgLy8gICAgICAgdXNlclN0b3J5VXBkYXRlTm90aWZpY2F0aW9uTW9kZWwubG9hZEZyb21DYXNlSW5zZW5zaXRpdmVPYmplY3QobWVzc2FnZS5tZXNzYWdlKTtcclxuICAgIC8vICAgICAgIHVzZXJTdG9yeVVwZGF0ZU5vdGlmaWNhdGlvbk1vZGVsLnJvdXRlID0gQ2hhbm5lbFJvdXRlcy5WaWV3QWNjb3VudDtcclxuICAgIC8vICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IE5ld05vdGlmaWNhdGlvblJlY2VpdmVkKHVzZXJTdG9yeVVwZGF0ZU5vdGlmaWNhdGlvbk1vZGVsKSk7XHJcbiAgICAvLyAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBSb2xlc0ZldGNoVHJpZ2dlcmVkKCkpO1xyXG4gICAgLy8gICAgIH0gZWxzZSBpZiAobWVzc2FnZS5tZXNzYWdlLk5vdGlmaWNhdGlvblR5cGVHdWlkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA9PSBOb3RpZmljYXRpb25UeXBlSWRzLlB1c2hOb3RpZmljYXRpb25Gb3JVc2VyU3RvcnlDb21tZW50LnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgLy8gICAgICAgY29uc3QgdXNlclN0b3J5Q29tbWVudE5vdGlmaWNhdGlvbk1vZGVsID0gbmV3IFVzZXJTdG9yeUNvbW1lbnROb3RpZmljYXRpb25Nb2RlbCgpO1xyXG4gICAgLy8gICAgICAgdXNlclN0b3J5Q29tbWVudE5vdGlmaWNhdGlvbk1vZGVsLmxvYWRGcm9tQ2FzZUluc2Vuc2l0aXZlT2JqZWN0KG1lc3NhZ2UubWVzc2FnZSk7XHJcbiAgICAvLyAgICAgICB1c2VyU3RvcnlDb21tZW50Tm90aWZpY2F0aW9uTW9kZWwucm91dGUgPSBDaGFubmVsUm91dGVzLlZpZXdBY2NvdW50O1xyXG4gICAgLy8gICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgTmV3Tm90aWZpY2F0aW9uUmVjZWl2ZWQodXNlclN0b3J5Q29tbWVudE5vdGlmaWNhdGlvbk1vZGVsKSk7XHJcbiAgICAvLyAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBSb2xlc0ZldGNoVHJpZ2dlcmVkKCkpO1xyXG4gICAgLy8gICAgIH0gZWxzZSBpZiAobWVzc2FnZS5tZXNzYWdlLk5vdGlmaWNhdGlvblR5cGVHdWlkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA9PSBOb3RpZmljYXRpb25UeXBlSWRzLlNwcmludFN0YXJ0ZWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSB7XHJcbiAgICAvLyAgICAgICBjb25zdCBzcHJpbnRTdGFydGVkTm90aWZpY2F0aW9uTW9kZWwgPSBuZXcgU3ByaW50U3RhcnRlZE5vdGlmaWNhdGlvbk1vZGVsKCk7XHJcbiAgICAvLyAgICAgICBzcHJpbnRTdGFydGVkTm90aWZpY2F0aW9uTW9kZWwubG9hZEZyb21DYXNlSW5zZW5zaXRpdmVPYmplY3QobWVzc2FnZS5tZXNzYWdlKTtcclxuICAgIC8vICAgICAgIHNwcmludFN0YXJ0ZWROb3RpZmljYXRpb25Nb2RlbC5yb3V0ZSA9IENoYW5uZWxSb3V0ZXMuVmlld0FjY291bnQ7XHJcbiAgICAvLyAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBOZXdOb3RpZmljYXRpb25SZWNlaXZlZChzcHJpbnRTdGFydGVkTm90aWZpY2F0aW9uTW9kZWwpKTtcclxuICAgIC8vICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IFJvbGVzRmV0Y2hUcmlnZ2VyZWQoKSk7XHJcbiAgICAvLyAgICAgfSBlbHNlIGlmIChtZXNzYWdlLm1lc3NhZ2UuTm90aWZpY2F0aW9uVHlwZUd1aWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09IE5vdGlmaWNhdGlvblR5cGVJZHMuU3ByaW50UmVxdWVzdGRGb3JSRXBsYW4udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSB7XHJcbiAgICAvLyAgICAgICBjb25zdCBzcHJpbnRSZXBsYW5TdGFydGVkTm90aWZpY2F0aW9uTW9kZWwgPSBuZXcgU3ByaW50UmVwbGFuU3RhcnRlZE5vdGlmaWNhdGlvbk1vZGVsKCk7XHJcbiAgICAvLyAgICAgICBzcHJpbnRSZXBsYW5TdGFydGVkTm90aWZpY2F0aW9uTW9kZWwubG9hZEZyb21DYXNlSW5zZW5zaXRpdmVPYmplY3QobWVzc2FnZS5tZXNzYWdlKTtcclxuICAgIC8vICAgICAgIHNwcmludFJlcGxhblN0YXJ0ZWROb3RpZmljYXRpb25Nb2RlbC5yb3V0ZSA9IENoYW5uZWxSb3V0ZXMuVmlld0FjY291bnQ7XHJcbiAgICAvLyAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBOZXdOb3RpZmljYXRpb25SZWNlaXZlZChzcHJpbnRSZXBsYW5TdGFydGVkTm90aWZpY2F0aW9uTW9kZWwpKTtcclxuICAgIC8vICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IFJvbGVzRmV0Y2hUcmlnZ2VyZWQoKSk7XHJcbiAgICAvLyAgICAgfSBlbHNlIHtcclxuICAgIC8vICAgICAgIC8vIFRPRE86IFNlbmQgdGhlc2UgZXJyb3JzIG9udG8gc2VydmVyIGZvciBmdXJ0aGVyIHByb2Nlc3NpbmdcclxuICAgIC8vICAgICAgIGNvbnNvbGUubG9nKFwiRm91bmQgdW5kZXRlY3RlZCBub3RpZmljYXRpb24gdHlwZS4gXCIgKyBtZXNzYWdlLm1lc3NhZ2UuTm90aWZpY2F0aW9uVHlwZUd1aWQpO1xyXG4gICAgLy8gICAgIH1cclxuICAgIC8vICAgICAvLyBBZGQgb3RoZXIgbm90aWZpY2F0aW9ucyBoZXJlLlxyXG5cclxuICAgIC8vICAgfSBjYXRjaCAoZXhjZXB0aW9uKSB7XHJcbiAgICAvLyAgICAgLy8gVE9ETzogU2VuZCB0aGVzZSBleGNlcHRpb25zIG9udG8gc2VydmVyIGZvciBmdXJ0aGVyIHByb2Nlc3NpbmdcclxuICAgIC8vICAgICBjb25zb2xlLmxvZyhcIkV4Y2VwdGlvbiBPY2N1cmVkXCIgKyBleGNlcHRpb24ubWVzc2FnZSk7XHJcbiAgICAvLyAgIH1cclxuICAgIC8vIH07XHJcblxyXG4gICAgLy8gdGhpcy5wdWJudWIuYWRkTGlzdGVuZXIoe1xyXG4gICAgLy8gICBzdGF0dXM6IHN0ID0+IHtcclxuICAgIC8vICAgICBpZiAoc3QuY2F0ZWdvcnkgPT09IFwiUE5Vbmtub3duQ2F0ZWdvcnlcIikge1xyXG4gICAgLy8gICAgICAgdmFyIG5ld1N0YXRlID0ge1xyXG4gICAgLy8gICAgICAgICBuZXc6IFwiZXJyb3JcIlxyXG4gICAgLy8gICAgICAgfTtcclxuICAgIC8vICAgICAgIHRoaXMucHVibnViLnNldFN0YXRlKFxyXG4gICAgLy8gICAgICAgICB7XHJcbiAgICAvLyAgICAgICAgICAgc3RhdGU6IG5ld1N0YXRlXHJcbiAgICAvLyAgICAgICAgIH1cclxuICAgIC8vICAgICAgICAgLy8gZnVuY3Rpb24gKHN0YXR1cykge1xyXG4gICAgLy8gICAgICAgICAvLyAgIGNvbnNvbGUubG9nKHN0LmVycm9yRGF0YS5tZXNzYWdlKTtcclxuICAgIC8vICAgICAgICAgLy8gfVxyXG4gICAgLy8gICAgICAgKTtcclxuICAgIC8vICAgICB9XHJcbiAgICAvLyAgIH0sXHJcbiAgICAvLyAgIG1lc3NhZ2U6IG1lc3NhZ2UgPT4ge1xyXG4gICAgLy8gICAgIGNvbnNvbGUubG9nKFwic3Vic2NyaWJlZCB0byBcIiArIG1lc3NhZ2UpO1xyXG4gICAgLy8gICAgIHN0b3JlTGlzdG5lcihtZXNzYWdlKTtcclxuICAgIC8vICAgfVxyXG4gICAgLy8gfSk7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIHRoaXMucm91dGVyLmV2ZW50c1xyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5uZ0Rlc3Ryb3llZCQpKVxyXG4gICAgICAuc3Vic2NyaWJlKChyb3V0ZUNoYW5nZSkgPT4ge1xyXG4gICAgICAgIGlmIChyb3V0ZUNoYW5nZSBpbnN0YW5jZW9mIE5hdmlnYXRpb25FbmQpIHtcclxuICAgICAgICAgIGlmICh0aGlzLm5vdGlmaWNQYW5lbCkge1xyXG4gICAgICAgICAgICB0aGlzLm5vdGlmaWNQYW5lbC5jbG9zZSgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB0aGlzLnNpZ25hbHIubm90aWZpY2F0aW9ucyQuc3Vic2NyaWJlKChkYXRhOiBhbnkpID0+IHtcclxuICAgICAgdGhpcy5uZXdOb3RpZmljYXRpb25zID0gZGF0YSAmJiBkYXRhLmxlbmd0aCA+IDAgPyBkYXRhIDogW107XHJcbiAgICAgIHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLmdldFNvZnRMYWJlbENvbmZpZ3VyYXRpb25zKCk7XHJcblxyXG4gICAgdGhpcy5ub3RpZmljYXRpb25zJCA9IHRoaXMuc3RvcmUucGlwZShzZWxlY3Qoc2hhcmVkTW9kdWxlUmVkdWNlcnMuZ2V0Tm90aWZpY2F0aW9uQWxsKSxcclxuICAgICAgdGFwKHggPT4gY29uc29sZS5sb2coeCkpXHJcbiAgICApO1xyXG5cclxuICAgIHRoaXMuYXV0aGVudGljYXRlZFVzZXJSZWNvcmQkID0gdGhpcy5zdG9yZS5waXBlKFxyXG4gICAgICBzZWxlY3Qoc2hhcmVkTW9kdWxlUmVkdWNlcnMuZ2V0QXV0aGVudGljYXRlZFVzZXJNb2RlbClcclxuICAgICk7XHJcblxyXG4gICAgdGhpcy5sb2FkaW5nTm90aWZpY2F0aW9ucyQgPSB0aGlzLnN0b3JlLnBpcGUoc2VsZWN0KHNoYXJlZE1vZHVsZVJlZHVjZXJzLmdldE5vdGlmaWNhdGlvbnNMb2FkaW5nKSk7XHJcbiAgfVxyXG5cclxuICBnZXRTb2Z0TGFiZWxDb25maWd1cmF0aW9ucygpIHtcclxuICAgIHRoaXMuc29mdExhYmVscyA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ1NvZnRMYWJlbHMnKSk7XHJcbiAgfVxyXG5cclxuICBjbGVhckFsbChlKSB7XHJcbiAgICBjb25zdCBub3RpZmljYXRpb25zID0gW107XHJcbiAgICB0aGlzLm5vdGlmaWNhdGlvbnMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xyXG4gICAgICBub3RpZmljYXRpb25zLnB1c2goZWxlbWVudCk7XHJcbiAgICB9KTtcclxuICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IENsZWFyQWxsTm90aWZpY2F0aW9ucyhub3RpZmljYXRpb25zKSk7XHJcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICB0aGlzLm5vdGlmaWNhdGlvbkNvbG9yID0gIXRoaXMubm90aWZpY2F0aW9uQ29sb3I7XHJcbiAgfVxyXG5cclxuICAvLyBvcGVuQW5ub3VuY2VtZW50RGlhbG9nKGFubm91bmNlZCkge1xyXG4gIC8vICAgdGhpcy5kaWFsb2cuY2xvc2VBbGwoKTtcclxuICAvLyAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oQW5ub3VjZW1lbnREaWFsb2dDb21wb25lbnQsIHtcclxuICAvLyAgICAgbWluV2lkdGg6IFwiNjB2d1wiLFxyXG4gIC8vICAgICBtYXhXaWR0aDogXCI2MHZ3XCIsXHJcbiAgLy8gICAgIG1pbkhlaWdodDogXCI1MHZoXCIsXHJcbiAgLy8gICAgIG1heEhlaWdodDogXCI4MHZoXCIsXHJcbiAgLy8gICAgIGRpc2FibGVDbG9zZTogdHJ1ZSxcclxuICAvLyAgICAgZGF0YToge1xyXG4gIC8vICAgICAgIGFubm91bmNlbWVudElkOiBhbm5vdW5jZWQuQW5ub3VuY2VtZW50SWQsXHJcbiAgLy8gICAgICAgYW5ub3VuY2VtZW50OiBhbm5vdW5jZWQuQW5ub3VuY2VtZW50LFxyXG4gIC8vICAgICAgIGFubm91bmNlZEJ5OiBhbm5vdW5jZWQuQW5ub3VuY2VkQnksXHJcbiAgLy8gICAgICAgYW5ub3VuY2VkQnlJZDogYW5ub3VuY2VkLkFubm91bmNlZEJ5SWQsXHJcbiAgLy8gICAgICAgYW5ub3VuY2VkQnlVc2VySW1hZ2U6IGFubm91bmNlZC5Bbm5vdW5jZWRCeVVzZXJJbWFnZSxcclxuICAvLyAgICAgICBhbm5vdW5jZWRPbjogYW5ub3VuY2VkLkFubm91bmNlZE9uXHJcbiAgLy8gICAgIH1cclxuICAvLyAgIH0pO1xyXG4gIC8vICAgZGlhbG9nUmVmLmNvbXBvbmVudEluc3RhbmNlLmNsb3NlTWF0RGlhbG9nLnN1YnNjcmliZSgocmVzdWx0KSA9PiB7XHJcbiAgLy8gICAgIGNvbnN0IGluZGV4ID0gdGhpcy5ub3RpZmljYXRpb25zLmZpbmRJbmRleCgocCkgPT4gcC5ub3RpZmljYXRpb25JZC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgPT0gdGhpcy5hbm5vdW5jZU5vdGlmaWNhdGlvbklkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSk7XHJcbiAgLy8gICAgIGlmIChpbmRleCA+IC0xKSB7XHJcbiAgLy8gICAgICAgdGhpcy51cHNlcnRSZWFkTm90aWZpY2F0aW9uKHRoaXMubm90aWZpY2F0aW9uc1tpbmRleF0pO1xyXG4gIC8vICAgICB9XHJcbiAgLy8gICB9KTtcclxuICAvLyB9XHJcblxyXG4gIHVwc2VydFJlYWROb3RpZmljYXRpb24oc2VsZWN0ZWROb3RpZmljYXRpb24pIHtcclxuICAgIGNvbnN0IG5vdGlmaWNhdGlvbnMgPSBbXTtcclxuICAgIHZhciByb2xlcyA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oTG9jYWxTdG9yYWdlUHJvcGVydGllcy5Sb2xlRmVhdHVyZXMpKTtcclxuICAgIGxldCBGZWF0dXJlX0FwcHJvdmVPclJlamVjdExlYXZlID0gJzJDMjI5MTZGLUI4MEItNEM1MS05NTM0LTIzRjY5OERFMTIwQic7XHJcbiAgICBsZXQgY2FuQWNjZXNzX2ZlYXR1cmVfQXBwcm92ZU9yUmVqZWN0TGVhdmUgPSBfLmZpbmQocm9sZXMsIGZ1bmN0aW9uIChyb2xlKSB7IHJldHVybiByb2xlWydmZWF0dXJlSWQnXS50b0xvd2VyQ2FzZSgpID09IEZlYXR1cmVfQXBwcm92ZU9yUmVqZWN0TGVhdmUudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpOyB9KSAhPSBudWxsO1xyXG4gICAgY29uc3QgQ3VycmVudFVzZXJJZCA9IHRoaXMuY29va2llU2VydmljZS5nZXQoTG9jYWxTdG9yYWdlUHJvcGVydGllcy5DdXJyZW50VXNlcklkKTtcclxuICAgIG5vdGlmaWNhdGlvbnMucHVzaChzZWxlY3RlZE5vdGlmaWNhdGlvbik7XHJcbiAgICBjb25zdCBub3RpaWZjYXRpb25tb2RlbCA9IEpTT04ucGFyc2Uoc2VsZWN0ZWROb3RpZmljYXRpb24ubm90aWZpY2F0aW9uSnNvbik7XHJcbiAgICBpZiAoc2VsZWN0ZWROb3RpZmljYXRpb24ubm90aWZpY2F0aW9uVHlwZUlkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA9PVxyXG4gICAgICBOb3RpZmljYXRpb25UeXBlSWRzLk5ld1Byb2plY3RDcmVhdGVkTm90aWZpY2F0aW9uSWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpIHx8XHJcbiAgICAgIHNlbGVjdGVkTm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvblR5cGVJZC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgPT1cclxuICAgICAgTm90aWZpY2F0aW9uVHlwZUlkcy5Qcm9qZWN0TWVtYmVyUm9sZUFkZGVkTm90aWZpY2F0aW9uSWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSB7XHJcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtcInByb2plY3RzL3Byb2plY3RzdGF0dXMvXCIgKyBub3RpaWZjYXRpb25tb2RlbC5Qcm9qZWN0R3VpZCArIFwiL2FjdGl2ZS1nb2Fsc1wiXSk7XHJcbiAgICB9IGVsc2UgaWYgKHNlbGVjdGVkTm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvblR5cGVJZC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgPT1cclxuICAgICAgTm90aWZpY2F0aW9uVHlwZUlkcy5Hb2FsQXBwcm92ZWRGcm9tUmVwbGFuLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXCJwcm9qZWN0cy9nb2FsL1wiICsgbm90aWlmY2F0aW9ubW9kZWwuR29hbEd1aWRdKTtcclxuICAgIH0gZWxzZSBpZiAoc2VsZWN0ZWROb3RpZmljYXRpb24ubm90aWZpY2F0aW9uVHlwZUlkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA9PVxyXG4gICAgICBOb3RpZmljYXRpb25UeXBlSWRzLk5vdGlmaWNhdGlvbl9Xb3JrSXRlbUFzc2lnbmVkVG9Vc2VyLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXCJwcm9qZWN0cy93b3JraXRlbS9cIiArIG5vdGlpZmNhdGlvbm1vZGVsLlVzZXJTdG9yeUd1aWRdKTtcclxuICAgIH0gZWxzZSBpZiAoc2VsZWN0ZWROb3RpZmljYXRpb24ubm90aWZpY2F0aW9uVHlwZUlkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA9PVxyXG4gICAgICBOb3RpZmljYXRpb25UeXBlSWRzLlVTZXJTdG9yeVVwZGF0ZU5vdGlmaWNhdGlvbklkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXCJwcm9qZWN0cy93b3JraXRlbS9cIiArIG5vdGlpZmNhdGlvbm1vZGVsLlVzZXJTdG9yeUlkXSk7XHJcbiAgICB9IGVsc2UgaWYgKHNlbGVjdGVkTm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvblR5cGVJZC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgPT1cclxuICAgICAgTm90aWZpY2F0aW9uVHlwZUlkcy5TcHJpbnRTdGFydGVkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXCJwcm9qZWN0cy9zcHJpbnQvXCIgKyBub3RpaWZjYXRpb25tb2RlbC5TcHJpbnRHdWlkXSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChzZWxlY3RlZE5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb25UeXBlSWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09XHJcbiAgICAgIE5vdGlmaWNhdGlvblR5cGVJZHMuUHVzaE5vdGlmaWNhdGlvbkZvclVzZXJTdG9yeUNvbW1lbnQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSB7XHJcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtcInByb2plY3RzL3dvcmtpdGVtL1wiICsgbm90aWlmY2F0aW9ubW9kZWwuVXNlclN0b3J5R3VpZF0pO1xyXG4gICAgfSBlbHNlIGlmIChzZWxlY3RlZE5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb25UeXBlSWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09XHJcbiAgICAgIE5vdGlmaWNhdGlvblR5cGVJZHMuR29hbFJlcXVlc3RkRm9yUkVwbGFuLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXCJwcm9qZWN0cy9nb2FsL1wiICsgbm90aWlmY2F0aW9ubW9kZWwuR29hbEd1aWRdKTtcclxuICAgIH0gZWxzZSBpZiAoc2VsZWN0ZWROb3RpZmljYXRpb24ubm90aWZpY2F0aW9uVHlwZUlkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA9PVxyXG4gICAgICBOb3RpZmljYXRpb25UeXBlSWRzLlNwcmludFJlcXVlc3RkRm9yUkVwbGFuLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXCJwcm9qZWN0cy9zcHJpbnQvXCIgKyBub3RpaWZjYXRpb25tb2RlbC5TcHJpbnRHdWlkXSk7XHJcbiAgICB9IGVsc2UgaWYgKHNlbGVjdGVkTm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvblR5cGVJZC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgPT1cclxuICAgICAgTm90aWZpY2F0aW9uVHlwZUlkcy5Ob3RpZmljYXRpb25fQWRob2NXb3JrSXRlbUFzc2lnbmVkVG9Vc2VyLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXCJkYXNoYm9hcmQvYWRob2Mtd29ya2l0ZW0vXCIgKyBub3RpaWZjYXRpb25tb2RlbC5Vc2VyU3RvcnlHdWlkXSk7XHJcbiAgICB9IGVsc2UgaWYgKHNlbGVjdGVkTm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvblR5cGVJZC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgPT1cclxuICAgICAgTm90aWZpY2F0aW9uVHlwZUlkcy5BZGhvY1VTZXJTdG9yeVVwZGF0ZU5vdGlmaWNhdGlvbklkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXCJkYXNoYm9hcmQvYWRob2Mtd29ya2l0ZW0vXCIgKyBub3RpaWZjYXRpb25tb2RlbC5Vc2VyU3RvcnlJZF0pO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoc2VsZWN0ZWROb3RpZmljYXRpb24ubm90aWZpY2F0aW9uVHlwZUlkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA9PVxyXG4gICAgICBOb3RpZmljYXRpb25UeXBlSWRzLkxlYXZlQXBwbGljYXRpb24udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpICYmIGNhbkFjY2Vzc19mZWF0dXJlX0FwcHJvdmVPclJlamVjdExlYXZlKSB7XHJcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtcImhybWFuYWdtZW50L2xlYXZlc1wiXSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChzZWxlY3RlZE5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb25UeXBlSWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09XHJcbiAgICAgIE5vdGlmaWNhdGlvblR5cGVJZHMuQXBwcm92ZUxlYXZlQXBwbGljYXRpb24udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSB7XHJcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtcImRhc2hib2FyZC9wcm9maWxlL1wiICsgQ3VycmVudFVzZXJJZCArIFwiL2xlYXZlcy1wZXJtaXNzaW9uc1wiXSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChzZWxlY3RlZE5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb25UeXBlSWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09XHJcbiAgICAgIE5vdGlmaWNhdGlvblR5cGVJZHMuUmVqZWN0TGVhdmVBcHBsaWNhdGlvbi50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkpIHtcclxuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW1wiZGFzaGJvYXJkL3Byb2ZpbGUvXCIgKyBDdXJyZW50VXNlcklkICsgXCIvbGVhdmVzLXBlcm1pc3Npb25zXCJdKTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHNlbGVjdGVkTm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvblR5cGVJZC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgPT1cclxuICAgICAgTm90aWZpY2F0aW9uVHlwZUlkcy5BdXRvVGltZVNoZWV0U3VibWlzc2lvbk5vdGlmaWNhdGlvbi50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkpIHtcclxuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW1wiZGFzaGJvYXJkL3Byb2ZpbGUvXCIgKyBDdXJyZW50VXNlcklkICsgXCIvdGltZXNoZWV0QXBwcm92YWxcIl0pO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoc2VsZWN0ZWROb3RpZmljYXRpb24ubm90aWZpY2F0aW9uVHlwZUlkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA9PVxyXG4gICAgICBOb3RpZmljYXRpb25UeXBlSWRzLlByb2JhdGlvbkFzc2lnbk5vdGlmaWNhdGlvbi50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkpIHtcclxuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW1wiZGFzaGJvYXJkL3Byb2ZpbGUvXCIgKyBub3RpaWZjYXRpb25tb2RlbC5Vc2VySWQgKyBcIi9wcm9iYXRpb25cIl0pO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoc2VsZWN0ZWROb3RpZmljYXRpb24ubm90aWZpY2F0aW9uVHlwZUlkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA9PVxyXG4gICAgICBOb3RpZmljYXRpb25UeXBlSWRzLlJldmlld0Fzc2lnblRvRW1wbG95ZWVOb3RpZmljYXRpb24udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSB7XHJcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtcImRhc2hib2FyZC9wcm9maWxlL1wiICsgQ3VycmVudFVzZXJJZCArIFwiL3Byb2JhdGlvblwiXSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChzZWxlY3RlZE5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb25UeXBlSWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09XHJcbiAgICAgIE5vdGlmaWNhdGlvblR5cGVJZHMuUmV2aWV3U3VibWl0dGVkQnlFbXBsb3llZU5vdGlmaWNhdGlvbi50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkpIHtcclxuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW1wiZGFzaGJvYXJkL3Byb2ZpbGUvXCIgKyBub3RpaWZjYXRpb25tb2RlbC5Vc2VySWQgKyBcIi9wcm9iYXRpb25cIl0pO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoc2VsZWN0ZWROb3RpZmljYXRpb24ubm90aWZpY2F0aW9uVHlwZUlkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA9PVxyXG4gICAgICBOb3RpZmljYXRpb25UeXBlSWRzLlJldmlld0ludml0YXRpb25Ob3RpZmljYXRpb24udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSB7XHJcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtcImRhc2hib2FyZC9wcm9maWxlL1wiICsgbm90aWlmY2F0aW9ubW9kZWwuVXNlcklkICsgXCIvcHJvYmF0aW9uXCJdKTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHNlbGVjdGVkTm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvblR5cGVJZC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgPT1cclxuICAgICAgTm90aWZpY2F0aW9uVHlwZUlkcy5QZXJmb3JtYW5jZVJldmlld1N1Ym1pdHRlZEJ5RW1wbG95ZWVOb3RpZmljYXRpb24udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSB7XHJcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtcImRhc2hib2FyZC9wcm9maWxlL1wiICsgbm90aWlmY2F0aW9ubW9kZWwuVXNlcklkICsgXCIvcGVyZm9ybWFuY2VcIl0pO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoc2VsZWN0ZWROb3RpZmljYXRpb24ubm90aWZpY2F0aW9uVHlwZUlkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA9PVxyXG4gICAgICBOb3RpZmljYXRpb25UeXBlSWRzLlBlcmZvcm1hbmNlUmV2aWV3SW52aXRhdGlvbk5vdGlmaWNhdGlvbk1vZGVsLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSkge1xyXG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXCJkYXNoYm9hcmQvcHJvZmlsZS9cIiArIG5vdGlpZmNhdGlvbm1vZGVsLlVzZXJJZCArIFwiL3BlcmZvcm1hbmNlXCJdKTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHNlbGVjdGVkTm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvblR5cGVJZC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgPT1cclxuICAgICAgTm90aWZpY2F0aW9uVHlwZUlkcy5QZXJmb3JtYW5jZVJldmlld0Fzc2lnblRvRW1wbG95ZWVOb3RpZmljYXRpb24udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSB7XHJcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtcImRhc2hib2FyZC9wcm9maWxlL1wiICsgQ3VycmVudFVzZXJJZCArIFwiL3BlcmZvcm1hbmNlXCJdKTtcclxuICAgIH1cclxuICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IFVwc2VydFVucmVhZE5vdGlmaWNhdGlvbnNUcmlnZ2VyZWQobm90aWZpY2F0aW9ucykpO1xyXG4gIH1cclxuXHJcbiAgdXBzZXJ0UmVhZE5ld05vdGlmaWNhdGlvbihub3RpZmljYXRpb24pIHtcclxuICAgIGxldCBub3RlczogTm90aWZpY2F0aW9uTW9kZWxbXSA9IFtub3RpZmljYXRpb25dO1xyXG4gICAgdGhpcy5zaWduYWxyLnVwc2VydFJlYWROZXdOb3RpZmljYXRpb25zKG5vdGVzKVxyXG4gICAgICAuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChyZXMuc3VjY2Vzcykge1xyXG4gICAgICAgICAgdGhpcy5zaWduYWxyLnJlbW92ZUl0ZW1Gcm9tTm90aWZpY2F0aW9ucyhub3RpZmljYXRpb24uaWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICBpZiAobm90aWZpY2F0aW9uLm5hdmlnYXRpb25VcmwpIHtcclxuICAgICAgd2luZG93Lm9wZW4obm90aWZpY2F0aW9uLm5hdmlnYXRpb25VcmwsIFwiX2JsYW5rXCIpO1xyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG4gIGNsZWFyTmV3QWxsKGUpIHtcclxuICAgIHRoaXMuc2lnbmFsci51cHNlcnRSZWFkTmV3Tm90aWZpY2F0aW9ucyh0aGlzLm5ld05vdGlmaWNhdGlvbnMpXHJcbiAgICAgIC5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKHJlcy5zdWNjZXNzKSB7XHJcbiAgICAgICAgICB0aGlzLnNpZ25hbHIucmVtb3ZlQWxsTm90aWZpY2F0aW9ucygpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICB0aGlzLm5nRGVzdHJveWVkJC5uZXh0KCk7XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJ0ZXh0LWNlbnRlciBtYXQtYmctcHJpbWFyeSBwdC0xIHBiLTFcIj5cclxuICA8IS0tIDxtYXQtcHJvZ3Jlc3MtYmFyICpuZ0lmPVwiKGxvYWRpbmdOb3RpZmljYXRpb25zJCB8IGFzeW5jKVwiPjwvbWF0LXByb2dyZXNzLWJhcj4gLS0+XHJcbiAgPGg2IGNsYXNzPVwibS0wXCI+e3sgJ05PVElGSUNBVElPTlMuTk9USUZJQ0FUSU9OU1RJVExFJyB8IHRyYW5zbGF0ZSB9fSAoe3tuZXdOb3RpZmljYXRpb25zPy5sZW5ndGh9fSk8L2g2PlxyXG48L2Rpdj5cclxuPGRpdiBpZD1cInN0eWxlLTFcIiAqbmdJZj1cIm5ld05vdGlmaWNhdGlvbnMubGVuZ3RoICE9IDBcIj5cclxuICA8bWF0LW5hdi1saXN0IGNsYXNzPVwibm90aWZpY2F0aW9uLWxpc3QgcC0wIHByLTAzXCIgcm9sZT1cImxpc3RcIlxyXG4gICAgKm5nRm9yPVwibGV0IG5vdGlmaWNhdGlvbiBvZiAobmV3Tm90aWZpY2F0aW9ucyB8IG9yZGVyQnkpXCIgPlxyXG4gICAgPG1hdC1saXN0LWl0ZW0gY2xhc3M9XCJub3RpZmljLWl0ZW0gIHByLTAzIG5vdGlmaWNhdGlvbi1tYXJnaW5cIiByb2xlPVwibGlzdGl0ZW1cIlxyXG4gICAgICBbbmdDbGFzc109XCJ7J25vdGlmaWNhdGFpb24tdW5yZWFkJzogIW5vdGlmaWNhdGlvbkNvbG9yICwnbm90aWZpY2F0YWlvbi1yZWFkJzogbm90aWZpY2F0aW9uQ29sb3IgfVwiXHJcbiAgICAgIHJvdXRlckxpbmtBY3RpdmU9XCJvcGVuXCIgKGNsaWNrKT1cInVwc2VydFJlYWROZXdOb3RpZmljYXRpb24obm90aWZpY2F0aW9uKVwiPlxyXG4gICAgICA8ZGl2PlxyXG4gICAgICAgIDxhPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1hdC1saXN0LXRleHQgcGwtMCBwci0wMyBub3RpZmljYXRpb24tY3Vyc29yIG5vdGlmaWNhdGlvbnMtbGlzdC1pdGVtXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3b3JkLWJyZWFrIGRpc3BsYXktcHJlLWxpbmVcIiBzdHlsZT1cIm1hcmdpbjogMHB4ICFpbXBvcnRhbnQ7XCJcclxuICAgICAgICAgICAgICBbaW5uZXJIVE1MXT1cIm5vdGlmaWNhdGlvbi5zdW1tYXJ5IHwgc2FuaXRpemVIdG1sXCI+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0aW1lIHRleHQtbXV0ZWRcIj57eyBub3RpZmljYXRpb24uY3JlYXRlZERhdGVUaW1lIHwgdXRjVG9Mb2NhbFRpbWUgfCB0aW1lYWdvIH19PC9zbWFsbD5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvYT5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L21hdC1saXN0LWl0ZW0+XHJcbiAgPC9tYXQtbmF2LWxpc3Q+XHJcbjwvZGl2PlxyXG48ZGl2IGNsYXNzPVwidGV4dC1jZW50ZXIgcC0xXCIgKm5nSWY9XCJuZXdOb3RpZmljYXRpb25zLmxlbmd0aCA9PSAwXCI+XHJcbiAge3sgJ05PVElGSUNBVElPTlMuTk9OT1RJRklDQVRJT05TVElUTEUnIHwgdHJhbnNsYXRlIH19PC9kaXY+XHJcbjxtYXQtZGl2aWRlcj48L21hdC1kaXZpZGVyPlxyXG48ZGl2IGNsYXNzPVwidGV4dC1jZW50ZXIgbXQtMDUgbWItMDVcIiAqbmdJZj1cIm5ld05vdGlmaWNhdGlvbnMubGVuZ3RoXCI+XHJcbiAgPGxhYmVsIGNsYXNzPVwibWItMFwiPjxhIChjbGljayk9XCJjbGVhck5ld0FsbCgkZXZlbnQpXCI+e3sgJ05PVElGSUNBVElPTlMuQ0xFQVJBTExOT1RJRklDQVRJT05TJyB8IHRyYW5zbGF0ZVxyXG4gICAgICB9fTwvYT48L2xhYmVsPlxyXG48L2Rpdj4iXX0=
|
|
1
|
+
import { Component, Input } from "@angular/core";
|
|
2
|
+
import { NavigationEnd } from "@angular/router";
|
|
3
|
+
import { ofType } from "@ngrx/effects";
|
|
4
|
+
import { select } from "@ngrx/store";
|
|
5
|
+
import { Subject } from "rxjs";
|
|
6
|
+
import { takeUntil, tap } from "rxjs/operators";
|
|
7
|
+
import { AuthenticationActionTypes } from "../../store/actions/authentication.actions";
|
|
8
|
+
import { ClearAllNotifications, NotificationsActionTypes, UpsertUnreadNotificationsTriggered } from "../../store/actions/notifications.actions";
|
|
9
|
+
import * as sharedModuleReducers from "../../store/reducers/index";
|
|
10
|
+
import { NotificationTypeIds } from '../../constants/notification-type-ids';
|
|
11
|
+
import { LocalStorageProperties } from '../../../globaldependencies/constants/localstorage-properties';
|
|
12
|
+
import { ChannelNames } from '../../constants/channel-names';
|
|
13
|
+
import '../../../globaldependencies/helpers/fontawesome-icons';
|
|
14
|
+
import * as _ from "underscore";
|
|
15
|
+
import * as i0 from "@angular/core";
|
|
16
|
+
import * as i1 from "@angular/router";
|
|
17
|
+
import * as i2 from "pubnub-angular2";
|
|
18
|
+
import * as i3 from "@ngrx/store";
|
|
19
|
+
import * as i4 from "@ngrx/effects";
|
|
20
|
+
import * as i5 from "ngx-cookie-service";
|
|
21
|
+
import * as i6 from "ngx-toastr";
|
|
22
|
+
import * as i7 from "@angular/material/dialog";
|
|
23
|
+
import * as i8 from "../../../globaldependencies/pipes/orderby-pipe";
|
|
24
|
+
import * as i9 from "../../services/signalr.service";
|
|
25
|
+
import * as i10 from "@angular/common";
|
|
26
|
+
import * as i11 from "@angular/material/divider";
|
|
27
|
+
import * as i12 from "@angular/material/list";
|
|
28
|
+
import * as i13 from "@angular/flex-layout/extended";
|
|
29
|
+
import * as i14 from "@ngx-translate/core";
|
|
30
|
+
import * as i15 from "../../../globaldependencies/pipes/sanitize.pipe";
|
|
31
|
+
import * as i16 from "ngx-timeago";
|
|
32
|
+
import * as i17 from "../../../globaldependencies/pipes/utctolocaltime.pipe";
|
|
33
|
+
const _c0 = function (a0, a1) { return { "notificataion-unread": a0, "notificataion-read": a1 }; };
|
|
34
|
+
function NotificationsComponent_div_4_mat_nav_list_1_Template(rf, ctx) { if (rf & 1) {
|
|
35
|
+
const _r6 = i0.ɵɵgetCurrentView();
|
|
36
|
+
i0.ɵɵelementStart(0, "mat-nav-list", 7);
|
|
37
|
+
i0.ɵɵelementStart(1, "mat-list-item", 8);
|
|
38
|
+
i0.ɵɵlistener("click", function NotificationsComponent_div_4_mat_nav_list_1_Template_mat_list_item_click_1_listener() { const restoredCtx = i0.ɵɵrestoreView(_r6); const notification_r4 = restoredCtx.$implicit; const ctx_r5 = i0.ɵɵnextContext(2); return ctx_r5.upsertReadNewNotification(notification_r4); });
|
|
39
|
+
i0.ɵɵelementStart(2, "div");
|
|
40
|
+
i0.ɵɵelementStart(3, "a");
|
|
41
|
+
i0.ɵɵelementStart(4, "div", 9);
|
|
42
|
+
i0.ɵɵelement(5, "div", 10);
|
|
43
|
+
i0.ɵɵpipe(6, "sanitizeHtml");
|
|
44
|
+
i0.ɵɵelementStart(7, "small", 11);
|
|
45
|
+
i0.ɵɵtext(8);
|
|
46
|
+
i0.ɵɵpipe(9, "timeago");
|
|
47
|
+
i0.ɵɵpipe(10, "utcToLocalTime");
|
|
48
|
+
i0.ɵɵelementEnd();
|
|
49
|
+
i0.ɵɵelementEnd();
|
|
50
|
+
i0.ɵɵelementEnd();
|
|
51
|
+
i0.ɵɵelementEnd();
|
|
52
|
+
i0.ɵɵelementEnd();
|
|
53
|
+
i0.ɵɵelementEnd();
|
|
54
|
+
} if (rf & 2) {
|
|
55
|
+
const notification_r4 = ctx.$implicit;
|
|
56
|
+
const ctx_r3 = i0.ɵɵnextContext(2);
|
|
57
|
+
i0.ɵɵadvance(1);
|
|
58
|
+
i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction2(9, _c0, !ctx_r3.notificationColor, ctx_r3.notificationColor));
|
|
59
|
+
i0.ɵɵadvance(4);
|
|
60
|
+
i0.ɵɵproperty("innerHTML", i0.ɵɵpipeBind1(6, 3, notification_r4.summary), i0.ɵɵsanitizeHtml);
|
|
61
|
+
i0.ɵɵadvance(3);
|
|
62
|
+
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(9, 5, i0.ɵɵpipeBind1(10, 7, notification_r4.createdDateTime)));
|
|
63
|
+
} }
|
|
64
|
+
function NotificationsComponent_div_4_Template(rf, ctx) { if (rf & 1) {
|
|
65
|
+
i0.ɵɵelementStart(0, "div", 5);
|
|
66
|
+
i0.ɵɵtemplate(1, NotificationsComponent_div_4_mat_nav_list_1_Template, 11, 12, "mat-nav-list", 6);
|
|
67
|
+
i0.ɵɵpipe(2, "orderBy");
|
|
68
|
+
i0.ɵɵelementEnd();
|
|
69
|
+
} if (rf & 2) {
|
|
70
|
+
const ctx_r0 = i0.ɵɵnextContext();
|
|
71
|
+
i0.ɵɵadvance(1);
|
|
72
|
+
i0.ɵɵproperty("ngForOf", i0.ɵɵpipeBind1(2, 1, ctx_r0.newNotifications));
|
|
73
|
+
} }
|
|
74
|
+
function NotificationsComponent_div_5_Template(rf, ctx) { if (rf & 1) {
|
|
75
|
+
i0.ɵɵelementStart(0, "div", 12);
|
|
76
|
+
i0.ɵɵtext(1);
|
|
77
|
+
i0.ɵɵpipe(2, "translate");
|
|
78
|
+
i0.ɵɵelementEnd();
|
|
79
|
+
} if (rf & 2) {
|
|
80
|
+
i0.ɵɵadvance(1);
|
|
81
|
+
i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(2, 1, "NOTIFICATIONS.NONOTIFICATIONSTITLE"), "");
|
|
82
|
+
} }
|
|
83
|
+
function NotificationsComponent_div_7_Template(rf, ctx) { if (rf & 1) {
|
|
84
|
+
const _r8 = i0.ɵɵgetCurrentView();
|
|
85
|
+
i0.ɵɵelementStart(0, "div", 13);
|
|
86
|
+
i0.ɵɵelementStart(1, "label", 14);
|
|
87
|
+
i0.ɵɵelementStart(2, "a", 15);
|
|
88
|
+
i0.ɵɵlistener("click", function NotificationsComponent_div_7_Template_a_click_2_listener($event) { i0.ɵɵrestoreView(_r8); const ctx_r7 = i0.ɵɵnextContext(); return ctx_r7.clearNewAll($event); });
|
|
89
|
+
i0.ɵɵtext(3);
|
|
90
|
+
i0.ɵɵpipe(4, "translate");
|
|
91
|
+
i0.ɵɵelementEnd();
|
|
92
|
+
i0.ɵɵelementEnd();
|
|
93
|
+
i0.ɵɵelementEnd();
|
|
94
|
+
} if (rf & 2) {
|
|
95
|
+
i0.ɵɵadvance(3);
|
|
96
|
+
i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(4, 1, "NOTIFICATIONS.CLEARALLNOTIFICATIONS"));
|
|
97
|
+
} }
|
|
98
|
+
export class NotificationsComponent {
|
|
99
|
+
constructor(router, pubnub, store, actionUpdates$, cookieService, toastr, dialog, orderByPipe, signalr, cdRef) {
|
|
100
|
+
this.router = router;
|
|
101
|
+
this.pubnub = pubnub;
|
|
102
|
+
this.store = store;
|
|
103
|
+
this.actionUpdates$ = actionUpdates$;
|
|
104
|
+
this.cookieService = cookieService;
|
|
105
|
+
this.toastr = toastr;
|
|
106
|
+
this.dialog = dialog;
|
|
107
|
+
this.orderByPipe = orderByPipe;
|
|
108
|
+
this.signalr = signalr;
|
|
109
|
+
this.cdRef = cdRef;
|
|
110
|
+
this.ngDestroyed$ = new Subject();
|
|
111
|
+
this.constNotification_WorkItemAssignedToUser = NotificationTypeIds.Notification_WorkItemAssignedToUser;
|
|
112
|
+
this.notificationColor = false;
|
|
113
|
+
this.newNotifications = [];
|
|
114
|
+
this.actionUpdates$
|
|
115
|
+
.pipe(takeUntil(this.ngDestroyed$), ofType(AuthenticationActionTypes.UserDetailsFetchedAfterLogin), tap(() => {
|
|
116
|
+
if (this.cookieService.check(LocalStorageProperties.CurrentUserId)) {
|
|
117
|
+
const CurrentUserId = this.cookieService.get(LocalStorageProperties.CurrentUserId);
|
|
118
|
+
// Subscribe to Task Assignment Notificaitons here.
|
|
119
|
+
const taskAssignmentChannelToSubscribeInto = ChannelNames.Channel_TaskAssignments + CurrentUserId;
|
|
120
|
+
const tastatusReportSubmissionChannelToSubscribeInto = ChannelNames.Channel_StatusReportSubmission + CurrentUserId;
|
|
121
|
+
const tastatusConfigAssignChannelToSubscribeInto = ChannelNames.Channel_StatusConfigAssign + CurrentUserId;
|
|
122
|
+
const multiChartsSchedulingChannelToSubscribeInto = ChannelNames.Channel_MultiChartsScheduling + CurrentUserId;
|
|
123
|
+
const assetsAssignedChannelToSubscribeInto = ChannelNames.Channel_AssetAssignment + CurrentUserId;
|
|
124
|
+
const projectCreatedChannelToSubscribeInto = ChannelNames.Channel_NewProject + CurrentUserId;
|
|
125
|
+
const projectAccessToMemberChannelToSubscribeInto = ChannelNames.Channel_ProjectMemberRole + CurrentUserId;
|
|
126
|
+
const goalApprovedChannelToSubscribeInto = ChannelNames.Channel_GoalApprovedFromReplan + CurrentUserId;
|
|
127
|
+
const userStoryUpdateChannelToSubscribeInto = ChannelNames.Channel_UserStoryUpdateNotification + CurrentUserId;
|
|
128
|
+
const AnnouncementChannelToSubscribeInto = ChannelNames.Channel_AnnouncementNotification + CurrentUserId;
|
|
129
|
+
const ReminderChannelToSubscribeInto = ChannelNames.Channel_ReminderNotification + CurrentUserId;
|
|
130
|
+
const PerformanceChannelToSubscribeInto = ChannelNames.Channel_PeroformanceNotification + CurrentUserId;
|
|
131
|
+
const userStoryCommentChannelToSubscribeInto = ChannelNames.Channel_UserStoryComment + CurrentUserId;
|
|
132
|
+
const sprintStartedChannelToSubscribeInto = ChannelNames.Channel_SprintStarted + CurrentUserId;
|
|
133
|
+
const sprintReplanChannelToSubscribeInto = ChannelNames.Channel_SprintRequestedToReplan + CurrentUserId;
|
|
134
|
+
const leaveAppliedChannelToSubscribeInto = ChannelNames.Channel_LeaveApplied + CurrentUserId;
|
|
135
|
+
const ApproveLeaveChannelToSubscribeInto = ChannelNames.Channel_ApproveLeave + CurrentUserId;
|
|
136
|
+
const RejectLeaveChannelToSubscribeInto = ChannelNames.Channel_RejectLeave + CurrentUserId;
|
|
137
|
+
const ResignationChannelToSubscribeInto = ChannelNames.Channel_Resignation + CurrentUserId;
|
|
138
|
+
const ApproveResignationChannelToSubscribeInto = ChannelNames.Channel_ApproveResignation + CurrentUserId;
|
|
139
|
+
const RejectResignationChannelToSubscribeInto = ChannelNames.Channel_RejectResignation + CurrentUserId;
|
|
140
|
+
const AutoTImesheetSubmissionChannelToSubscribeInto = ChannelNames.Channel_AutoTimesheetSubmission + CurrentUserId;
|
|
141
|
+
const ProbationAssignNotification = ChannelNames.Channel_ProbationAssignNotification + CurrentUserId;
|
|
142
|
+
const ReviewAssignToEmployeeNotification = ChannelNames.Channel_ReviewAssignToEmployeeNotification + CurrentUserId;
|
|
143
|
+
const ReviewSubmittedByEmployeeNotification = ChannelNames.Channel_ReviewSubmittedByEmployeeNotification + CurrentUserId;
|
|
144
|
+
const ReviewInvitationNotificationModel = ChannelNames.Channel_ReviewInvitationNotificationModel + CurrentUserId;
|
|
145
|
+
const PerformanceReviewSubmittedByEmployeeNotification = ChannelNames.Channel_PerformanceReviewSubmittedByEmployeeNotification + CurrentUserId;
|
|
146
|
+
const PerformanceReviewInvitationNotificationModel = ChannelNames.Channel_PerformanceReviewInvitationNotificationModel + CurrentUserId;
|
|
147
|
+
const PerformanceReviewAssignToEmployeeNotification = ChannelNames.Channel_PerformanceReviewAssignToEmployeeNotification + CurrentUserId;
|
|
148
|
+
console.log("subscribing to " + taskAssignmentChannelToSubscribeInto);
|
|
149
|
+
console.log("subscribing to " + tastatusReportSubmissionChannelToSubscribeInto);
|
|
150
|
+
console.log("subscribing to " + tastatusConfigAssignChannelToSubscribeInto);
|
|
151
|
+
console.log("subscribing to" + assetsAssignedChannelToSubscribeInto);
|
|
152
|
+
console.log("subscribing to" + projectCreatedChannelToSubscribeInto);
|
|
153
|
+
console.log("subscribing to" + projectAccessToMemberChannelToSubscribeInto);
|
|
154
|
+
console.log("subscribing to" + goalApprovedChannelToSubscribeInto);
|
|
155
|
+
console.log("subscribing to" + userStoryUpdateChannelToSubscribeInto);
|
|
156
|
+
console.log("subscribing to" + AnnouncementChannelToSubscribeInto);
|
|
157
|
+
console.log("subscribing to" + userStoryCommentChannelToSubscribeInto);
|
|
158
|
+
console.log("subscribing to" + sprintStartedChannelToSubscribeInto);
|
|
159
|
+
console.log("subscribing to" + sprintReplanChannelToSubscribeInto);
|
|
160
|
+
console.log("subscribing to" + ReminderChannelToSubscribeInto);
|
|
161
|
+
console.log("subscribing to" + PerformanceChannelToSubscribeInto);
|
|
162
|
+
this.pubnub.subscribe({
|
|
163
|
+
channels: [taskAssignmentChannelToSubscribeInto, tastatusReportSubmissionChannelToSubscribeInto,
|
|
164
|
+
ProbationAssignNotification, ReviewAssignToEmployeeNotification, ReviewSubmittedByEmployeeNotification,
|
|
165
|
+
ReviewInvitationNotificationModel, PerformanceReviewSubmittedByEmployeeNotification, PerformanceReviewAssignToEmployeeNotification,
|
|
166
|
+
tastatusConfigAssignChannelToSubscribeInto, multiChartsSchedulingChannelToSubscribeInto, PerformanceReviewInvitationNotificationModel,
|
|
167
|
+
assetsAssignedChannelToSubscribeInto, projectCreatedChannelToSubscribeInto, ,
|
|
168
|
+
projectAccessToMemberChannelToSubscribeInto, goalApprovedChannelToSubscribeInto,
|
|
169
|
+
userStoryUpdateChannelToSubscribeInto, AnnouncementChannelToSubscribeInto, ReminderChannelToSubscribeInto, RejectResignationChannelToSubscribeInto,
|
|
170
|
+
userStoryCommentChannelToSubscribeInto, sprintStartedChannelToSubscribeInto, ResignationChannelToSubscribeInto, ApproveResignationChannelToSubscribeInto,
|
|
171
|
+
sprintReplanChannelToSubscribeInto, leaveAppliedChannelToSubscribeInto, ApproveLeaveChannelToSubscribeInto, RejectLeaveChannelToSubscribeInto,
|
|
172
|
+
PerformanceChannelToSubscribeInto, AutoTImesheetSubmissionChannelToSubscribeInto]
|
|
173
|
+
});
|
|
174
|
+
// Add other subscriptions here.
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
console.log("User not logged in yet to be able to subscribe.");
|
|
178
|
+
}
|
|
179
|
+
}))
|
|
180
|
+
.subscribe();
|
|
181
|
+
this.actionUpdates$
|
|
182
|
+
.pipe(takeUntil(this.ngDestroyed$), ofType(AuthenticationActionTypes.UserDetailsFetchedAfterLogin), tap(() => {
|
|
183
|
+
var roleUpdatesChannelToSubscribeInto = ChannelNames.Channel_RoleUpdates + "19B6F9FC-7370-4B9C-A05C-3B8D819EEEAF";
|
|
184
|
+
console.log("subscribing to " + roleUpdatesChannelToSubscribeInto);
|
|
185
|
+
this.pubnub.subscribe({
|
|
186
|
+
channels: [roleUpdatesChannelToSubscribeInto]
|
|
187
|
+
});
|
|
188
|
+
}))
|
|
189
|
+
.subscribe();
|
|
190
|
+
this.actionUpdates$
|
|
191
|
+
.pipe(takeUntil(this.ngDestroyed$), ofType(NotificationsActionTypes.ClearAllUnreadNotificationsCompleted), tap(() => {
|
|
192
|
+
this.notifications$ = this.store.pipe(select(sharedModuleReducers.getNotificationAll));
|
|
193
|
+
this.notifications$.subscribe(x => {
|
|
194
|
+
this.notifications = x;
|
|
195
|
+
});
|
|
196
|
+
}))
|
|
197
|
+
.subscribe();
|
|
198
|
+
// const storeListner = (message) => {
|
|
199
|
+
// console.log("---------Received pubnub message---------");
|
|
200
|
+
// // this.toastr.info(message.message.Summary);
|
|
201
|
+
// try {
|
|
202
|
+
// // Receiving the User Story Assigned Notification
|
|
203
|
+
// if (message.message.NotificationTypeGuid == NotificationTypeIds.Notification_WorkItemAssignedToUser) {
|
|
204
|
+
// var userStoryAssignedNotification = new UserStoryAssignedNotification();
|
|
205
|
+
// userStoryAssignedNotification.loadFromCaseInsensitiveObject(message.message);
|
|
206
|
+
// userStoryAssignedNotification.route = ChannelRoutes.ViewWorkItem + userStoryAssignedNotification.notificationId;
|
|
207
|
+
// this.store.dispatch(new NewNotificationReceived(userStoryAssignedNotification));
|
|
208
|
+
// } else if (message.message.NotificationTypeGuid == NotificationTypeIds.Notification_RoleUpdated) {
|
|
209
|
+
// var roleUpdatedNotification = new RoleUpdatedNotification();
|
|
210
|
+
// roleUpdatedNotification.loadFromCaseInsensitiveObject(message.message);
|
|
211
|
+
// roleUpdatedNotification.route = ChannelRoutes.ViewAccount;
|
|
212
|
+
// this.store.dispatch(new NewNotificationReceived(roleUpdatedNotification));
|
|
213
|
+
// this.store.dispatch(new RolesFetchTriggered());
|
|
214
|
+
// } else if (message.message.NotificationTypeGuid == NotificationTypeIds.Status_Report_Sumitted) {
|
|
215
|
+
// var reportSubmittedNotification = new ReportSubmittedNotification();
|
|
216
|
+
// reportSubmittedNotification.loadFromCaseInsensitiveObject(message.message);
|
|
217
|
+
// reportSubmittedNotification.route = ChannelRoutes.ViewAccount;
|
|
218
|
+
// this.store.dispatch(new NewNotificationReceived(reportSubmittedNotification));
|
|
219
|
+
// this.store.dispatch(new RolesFetchTriggered());
|
|
220
|
+
// } else if (message.message.NotificationTypeGuid == NotificationTypeIds.Status_Report_Config_Created) {
|
|
221
|
+
// var reportConfigAssignedNotification = new ReportConfigAssignedNotification();
|
|
222
|
+
// reportConfigAssignedNotification.loadFromCaseInsensitiveObject(message.message);
|
|
223
|
+
// reportConfigAssignedNotification.route = ChannelRoutes.ViewAccount;
|
|
224
|
+
// this.store.dispatch(new NewNotificationReceived(reportConfigAssignedNotification));
|
|
225
|
+
// this.store.dispatch(new RolesFetchTriggered());
|
|
226
|
+
// } else if (message.message.NotificationTypeGuid == NotificationTypeIds.Multiple_Charts_Scheduling_created) {
|
|
227
|
+
// var multipleChartsScheduling = new MultipleChartsScheduling();
|
|
228
|
+
// multipleChartsScheduling.loadFromCaseInsensitiveObject(message.message);
|
|
229
|
+
// multipleChartsScheduling.route = ChannelRoutes.ViewAccount;
|
|
230
|
+
// this.store.dispatch(new NewNotificationReceived(multipleChartsScheduling));
|
|
231
|
+
// this.store.dispatch(new RolesFetchTriggered());
|
|
232
|
+
// } else if (message.message.NotificationTypeGuid == NotificationTypeIds.Assets_Assignment) {
|
|
233
|
+
// const assetAssignedNotification = new AssetAssignedNotification();
|
|
234
|
+
// assetAssignedNotification.loadFromCaseInsensitiveObject(message.message);
|
|
235
|
+
// assetAssignedNotification.route = ChannelRoutes.ViewAccount;
|
|
236
|
+
// this.store.dispatch(new NewNotificationReceived(assetAssignedNotification));
|
|
237
|
+
// this.store.dispatch(new RolesFetchTriggered());
|
|
238
|
+
// } else if (message.message.NotificationTypeGuid.toString().toLowerCase() == NotificationTypeIds.Reminder_Notification.toString().toLowerCase()) {
|
|
239
|
+
// const assetAssignedNotification = new AssetAssignedNotification();
|
|
240
|
+
// assetAssignedNotification.loadFromCaseInsensitiveObject(message.message);
|
|
241
|
+
// assetAssignedNotification.route = ChannelRoutes.ViewAccount;
|
|
242
|
+
// this.store.dispatch(new NewNotificationReceived(assetAssignedNotification));
|
|
243
|
+
// this.store.dispatch(new RolesFetchTriggered());
|
|
244
|
+
// } else if (message.message.NotificationTypeGuid.toString().toLowerCase() == NotificationTypeIds.Announcement_Received.toString().toLowerCase()) {
|
|
245
|
+
// const assetAssignedNotification = new AssetAssignedNotification();
|
|
246
|
+
// assetAssignedNotification.loadFromCaseInsensitiveObject(message.message);
|
|
247
|
+
// assetAssignedNotification.route = ChannelRoutes.ViewAccount;
|
|
248
|
+
// this.store.dispatch(new NewNotificationReceived(assetAssignedNotification));
|
|
249
|
+
// this.store.dispatch(new RolesFetchTriggered());
|
|
250
|
+
// if (message.message.Id != this.announceNotificationId) {
|
|
251
|
+
// this.announceNotificationId = message.message.Id;
|
|
252
|
+
// this.openAnnouncementDialog(message.message);
|
|
253
|
+
// }
|
|
254
|
+
// } else if (message.message.NotificationTypeGuid.toString().toLowerCase() == NotificationTypeIds.Performance_Received.toString().toLowerCase() || message.message.NotificationTypeGuid.toString().toLowerCase() == NotificationTypeIds.ProjectMemberRoleAddedNotificationId.toString().toLowerCase()) {
|
|
255
|
+
// const newProjectCreatedNotification = new NewProjectCreatedNotificationModel();
|
|
256
|
+
// newProjectCreatedNotification.loadFromCaseInsensitiveObject(message.message);
|
|
257
|
+
// newProjectCreatedNotification.route = ChannelRoutes.ViewAccount;
|
|
258
|
+
// this.store.dispatch(new NewNotificationReceived(newProjectCreatedNotification));
|
|
259
|
+
// this.store.dispatch(new RolesFetchTriggered());
|
|
260
|
+
// } else if (message.message.NotificationTypeGuid.toString().toLowerCase() == NotificationTypeIds.NewProjectCreatedNotificationId.toString().toLowerCase() || message.message.NotificationTypeGuid.toString().toLowerCase() == NotificationTypeIds.ProjectMemberRoleAddedNotificationId.toString().toLowerCase()) {
|
|
261
|
+
// const newProjectCreatedNotification = new NewProjectCreatedNotificationModel();
|
|
262
|
+
// newProjectCreatedNotification.loadFromCaseInsensitiveObject(message.message);
|
|
263
|
+
// newProjectCreatedNotification.route = ChannelRoutes.ViewAccount;
|
|
264
|
+
// this.store.dispatch(new NewNotificationReceived(newProjectCreatedNotification));
|
|
265
|
+
// this.store.dispatch(new RolesFetchTriggered());
|
|
266
|
+
// } else if (message.message.NotificationTypeGuid.toString().toLowerCase() == NotificationTypeIds.GoalApprovedFromReplan.toString().toLowerCase()) {
|
|
267
|
+
// const goalApprovedNotificationModel = new GoalApprovedNotificationModel();
|
|
268
|
+
// goalApprovedNotificationModel.loadFromCaseInsensitiveObject(message.message);
|
|
269
|
+
// goalApprovedNotificationModel.route = ChannelRoutes.ViewAccount;
|
|
270
|
+
// this.store.dispatch(new NewNotificationReceived(goalApprovedNotificationModel));
|
|
271
|
+
// this.store.dispatch(new RolesFetchTriggered());
|
|
272
|
+
// } else if (message.message.NotificationTypeGuid.toString().toLowerCase() == NotificationTypeIds.USerStoryUpdateNotificationId.toString().toLowerCase()) {
|
|
273
|
+
// const userStoryUpdateNotificationModel = new UserStoryUpdateNotificationModel();
|
|
274
|
+
// userStoryUpdateNotificationModel.loadFromCaseInsensitiveObject(message.message);
|
|
275
|
+
// userStoryUpdateNotificationModel.route = ChannelRoutes.ViewAccount;
|
|
276
|
+
// this.store.dispatch(new NewNotificationReceived(userStoryUpdateNotificationModel));
|
|
277
|
+
// this.store.dispatch(new RolesFetchTriggered());
|
|
278
|
+
// } else if (message.message.NotificationTypeGuid.toString().toLowerCase() == NotificationTypeIds.PushNotificationForUserStoryComment.toString().toLowerCase()) {
|
|
279
|
+
// const userStoryCommentNotificationModel = new UserStoryCommentNotificationModel();
|
|
280
|
+
// userStoryCommentNotificationModel.loadFromCaseInsensitiveObject(message.message);
|
|
281
|
+
// userStoryCommentNotificationModel.route = ChannelRoutes.ViewAccount;
|
|
282
|
+
// this.store.dispatch(new NewNotificationReceived(userStoryCommentNotificationModel));
|
|
283
|
+
// this.store.dispatch(new RolesFetchTriggered());
|
|
284
|
+
// } else if (message.message.NotificationTypeGuid.toString().toLowerCase() == NotificationTypeIds.SprintStarted.toString().toLowerCase()) {
|
|
285
|
+
// const sprintStartedNotificationModel = new SprintStartedNotificationModel();
|
|
286
|
+
// sprintStartedNotificationModel.loadFromCaseInsensitiveObject(message.message);
|
|
287
|
+
// sprintStartedNotificationModel.route = ChannelRoutes.ViewAccount;
|
|
288
|
+
// this.store.dispatch(new NewNotificationReceived(sprintStartedNotificationModel));
|
|
289
|
+
// this.store.dispatch(new RolesFetchTriggered());
|
|
290
|
+
// } else if (message.message.NotificationTypeGuid.toString().toLowerCase() == NotificationTypeIds.SprintRequestdForREplan.toString().toLowerCase()) {
|
|
291
|
+
// const sprintReplanStartedNotificationModel = new SprintReplanStartedNotificationModel();
|
|
292
|
+
// sprintReplanStartedNotificationModel.loadFromCaseInsensitiveObject(message.message);
|
|
293
|
+
// sprintReplanStartedNotificationModel.route = ChannelRoutes.ViewAccount;
|
|
294
|
+
// this.store.dispatch(new NewNotificationReceived(sprintReplanStartedNotificationModel));
|
|
295
|
+
// this.store.dispatch(new RolesFetchTriggered());
|
|
296
|
+
// } else {
|
|
297
|
+
// // TODO: Send these errors onto server for further processing
|
|
298
|
+
// console.log("Found undetected notification type. " + message.message.NotificationTypeGuid);
|
|
299
|
+
// }
|
|
300
|
+
// // Add other notifications here.
|
|
301
|
+
// } catch (exception) {
|
|
302
|
+
// // TODO: Send these exceptions onto server for further processing
|
|
303
|
+
// console.log("Exception Occured" + exception.message);
|
|
304
|
+
// }
|
|
305
|
+
// };
|
|
306
|
+
// this.pubnub.addListener({
|
|
307
|
+
// status: st => {
|
|
308
|
+
// if (st.category === "PNUnknownCategory") {
|
|
309
|
+
// var newState = {
|
|
310
|
+
// new: "error"
|
|
311
|
+
// };
|
|
312
|
+
// this.pubnub.setState(
|
|
313
|
+
// {
|
|
314
|
+
// state: newState
|
|
315
|
+
// }
|
|
316
|
+
// // function (status) {
|
|
317
|
+
// // console.log(st.errorData.message);
|
|
318
|
+
// // }
|
|
319
|
+
// );
|
|
320
|
+
// }
|
|
321
|
+
// },
|
|
322
|
+
// message: message => {
|
|
323
|
+
// console.log("subscribed to " + message);
|
|
324
|
+
// storeListner(message);
|
|
325
|
+
// }
|
|
326
|
+
// });
|
|
327
|
+
}
|
|
328
|
+
ngOnInit() {
|
|
329
|
+
this.router.events
|
|
330
|
+
.pipe(takeUntil(this.ngDestroyed$))
|
|
331
|
+
.subscribe((routeChange) => {
|
|
332
|
+
if (routeChange instanceof NavigationEnd) {
|
|
333
|
+
if (this.notificPanel) {
|
|
334
|
+
this.notificPanel.close();
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
});
|
|
338
|
+
this.signalr.notifications$.subscribe((data) => {
|
|
339
|
+
this.newNotifications = data && data.length > 0 ? data : [];
|
|
340
|
+
this.cdRef.detectChanges();
|
|
341
|
+
});
|
|
342
|
+
this.getSoftLabelConfigurations();
|
|
343
|
+
this.notifications$ = this.store.pipe(select(sharedModuleReducers.getNotificationAll), tap(x => console.log(x)));
|
|
344
|
+
this.authenticatedUserRecord$ = this.store.pipe(select(sharedModuleReducers.getAuthenticatedUserModel));
|
|
345
|
+
this.loadingNotifications$ = this.store.pipe(select(sharedModuleReducers.getNotificationsLoading));
|
|
346
|
+
}
|
|
347
|
+
getSoftLabelConfigurations() {
|
|
348
|
+
this.softLabels = JSON.parse(localStorage.getItem('SoftLabels'));
|
|
349
|
+
}
|
|
350
|
+
clearAll(e) {
|
|
351
|
+
const notifications = [];
|
|
352
|
+
this.notifications.forEach((element) => {
|
|
353
|
+
notifications.push(element);
|
|
354
|
+
});
|
|
355
|
+
this.store.dispatch(new ClearAllNotifications(notifications));
|
|
356
|
+
e.preventDefault();
|
|
357
|
+
this.notificationColor = !this.notificationColor;
|
|
358
|
+
}
|
|
359
|
+
// openAnnouncementDialog(announced) {
|
|
360
|
+
// this.dialog.closeAll();
|
|
361
|
+
// const dialogRef = this.dialog.open(AnnoucementDialogComponent, {
|
|
362
|
+
// minWidth: "60vw",
|
|
363
|
+
// maxWidth: "60vw",
|
|
364
|
+
// minHeight: "50vh",
|
|
365
|
+
// maxHeight: "80vh",
|
|
366
|
+
// disableClose: true,
|
|
367
|
+
// data: {
|
|
368
|
+
// announcementId: announced.AnnouncementId,
|
|
369
|
+
// announcement: announced.Announcement,
|
|
370
|
+
// announcedBy: announced.AnnouncedBy,
|
|
371
|
+
// announcedById: announced.AnnouncedById,
|
|
372
|
+
// announcedByUserImage: announced.AnnouncedByUserImage,
|
|
373
|
+
// announcedOn: announced.AnnouncedOn
|
|
374
|
+
// }
|
|
375
|
+
// });
|
|
376
|
+
// dialogRef.componentInstance.closeMatDialog.subscribe((result) => {
|
|
377
|
+
// const index = this.notifications.findIndex((p) => p.notificationId.toString().toLowerCase() == this.announceNotificationId.toString().toLowerCase());
|
|
378
|
+
// if (index > -1) {
|
|
379
|
+
// this.upsertReadNotification(this.notifications[index]);
|
|
380
|
+
// }
|
|
381
|
+
// });
|
|
382
|
+
// }
|
|
383
|
+
upsertReadNotification(selectedNotification) {
|
|
384
|
+
const notifications = [];
|
|
385
|
+
var roles = JSON.parse(localStorage.getItem(LocalStorageProperties.RoleFeatures));
|
|
386
|
+
let Feature_ApproveOrRejectLeave = '2C22916F-B80B-4C51-9534-23F698DE120B';
|
|
387
|
+
let canAccess_feature_ApproveOrRejectLeave = _.find(roles, function (role) { return role['featureId'].toLowerCase() == Feature_ApproveOrRejectLeave.toString().toLowerCase(); }) != null;
|
|
388
|
+
const CurrentUserId = this.cookieService.get(LocalStorageProperties.CurrentUserId);
|
|
389
|
+
notifications.push(selectedNotification);
|
|
390
|
+
const notiifcationmodel = JSON.parse(selectedNotification.notificationJson);
|
|
391
|
+
if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
|
|
392
|
+
NotificationTypeIds.NewProjectCreatedNotificationId.toString().toLowerCase() ||
|
|
393
|
+
selectedNotification.notificationTypeId.toString().toLowerCase() ==
|
|
394
|
+
NotificationTypeIds.ProjectMemberRoleAddedNotificationId.toString().toLowerCase()) {
|
|
395
|
+
this.router.navigate(["projects/projectstatus/" + notiifcationmodel.ProjectGuid + "/active-goals"]);
|
|
396
|
+
}
|
|
397
|
+
else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
|
|
398
|
+
NotificationTypeIds.GoalApprovedFromReplan.toString().toLowerCase()) {
|
|
399
|
+
this.router.navigate(["projects/goal/" + notiifcationmodel.GoalGuid]);
|
|
400
|
+
}
|
|
401
|
+
else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
|
|
402
|
+
NotificationTypeIds.Notification_WorkItemAssignedToUser.toString().toLowerCase()) {
|
|
403
|
+
this.router.navigate(["projects/workitem/" + notiifcationmodel.UserStoryGuid]);
|
|
404
|
+
}
|
|
405
|
+
else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
|
|
406
|
+
NotificationTypeIds.USerStoryUpdateNotificationId.toString().toLowerCase()) {
|
|
407
|
+
this.router.navigate(["projects/workitem/" + notiifcationmodel.UserStoryId]);
|
|
408
|
+
}
|
|
409
|
+
else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
|
|
410
|
+
NotificationTypeIds.SprintStarted.toString().toLowerCase()) {
|
|
411
|
+
this.router.navigate(["projects/sprint/" + notiifcationmodel.SprintGuid]);
|
|
412
|
+
}
|
|
413
|
+
else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
|
|
414
|
+
NotificationTypeIds.PushNotificationForUserStoryComment.toString().toLowerCase()) {
|
|
415
|
+
this.router.navigate(["projects/workitem/" + notiifcationmodel.UserStoryGuid]);
|
|
416
|
+
}
|
|
417
|
+
else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
|
|
418
|
+
NotificationTypeIds.GoalRequestdForREplan.toString().toLowerCase()) {
|
|
419
|
+
this.router.navigate(["projects/goal/" + notiifcationmodel.GoalGuid]);
|
|
420
|
+
}
|
|
421
|
+
else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
|
|
422
|
+
NotificationTypeIds.SprintRequestdForREplan.toString().toLowerCase()) {
|
|
423
|
+
this.router.navigate(["projects/sprint/" + notiifcationmodel.SprintGuid]);
|
|
424
|
+
}
|
|
425
|
+
else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
|
|
426
|
+
NotificationTypeIds.Notification_AdhocWorkItemAssignedToUser.toString().toLowerCase()) {
|
|
427
|
+
this.router.navigate(["dashboard/adhoc-workitem/" + notiifcationmodel.UserStoryGuid]);
|
|
428
|
+
}
|
|
429
|
+
else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
|
|
430
|
+
NotificationTypeIds.AdhocUSerStoryUpdateNotificationId.toString().toLowerCase()) {
|
|
431
|
+
this.router.navigate(["dashboard/adhoc-workitem/" + notiifcationmodel.UserStoryId]);
|
|
432
|
+
}
|
|
433
|
+
else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
|
|
434
|
+
NotificationTypeIds.LeaveApplication.toString().toLowerCase() && canAccess_feature_ApproveOrRejectLeave) {
|
|
435
|
+
this.router.navigate(["hrmanagment/leaves"]);
|
|
436
|
+
}
|
|
437
|
+
else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
|
|
438
|
+
NotificationTypeIds.ApproveLeaveApplication.toString().toLowerCase()) {
|
|
439
|
+
this.router.navigate(["dashboard/profile/" + CurrentUserId + "/leaves-permissions"]);
|
|
440
|
+
}
|
|
441
|
+
else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
|
|
442
|
+
NotificationTypeIds.RejectLeaveApplication.toString().toLowerCase()) {
|
|
443
|
+
this.router.navigate(["dashboard/profile/" + CurrentUserId + "/leaves-permissions"]);
|
|
444
|
+
}
|
|
445
|
+
else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
|
|
446
|
+
NotificationTypeIds.AutoTimeSheetSubmissionNotification.toString().toLowerCase()) {
|
|
447
|
+
this.router.navigate(["dashboard/profile/" + CurrentUserId + "/timesheetApproval"]);
|
|
448
|
+
}
|
|
449
|
+
else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
|
|
450
|
+
NotificationTypeIds.ProbationAssignNotification.toString().toLowerCase()) {
|
|
451
|
+
this.router.navigate(["dashboard/profile/" + notiifcationmodel.UserId + "/probation"]);
|
|
452
|
+
}
|
|
453
|
+
else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
|
|
454
|
+
NotificationTypeIds.ReviewAssignToEmployeeNotification.toString().toLowerCase()) {
|
|
455
|
+
this.router.navigate(["dashboard/profile/" + CurrentUserId + "/probation"]);
|
|
456
|
+
}
|
|
457
|
+
else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
|
|
458
|
+
NotificationTypeIds.ReviewSubmittedByEmployeeNotification.toString().toLowerCase()) {
|
|
459
|
+
this.router.navigate(["dashboard/profile/" + notiifcationmodel.UserId + "/probation"]);
|
|
460
|
+
}
|
|
461
|
+
else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
|
|
462
|
+
NotificationTypeIds.ReviewInvitationNotification.toString().toLowerCase()) {
|
|
463
|
+
this.router.navigate(["dashboard/profile/" + notiifcationmodel.UserId + "/probation"]);
|
|
464
|
+
}
|
|
465
|
+
else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
|
|
466
|
+
NotificationTypeIds.PerformanceReviewSubmittedByEmployeeNotification.toString().toLowerCase()) {
|
|
467
|
+
this.router.navigate(["dashboard/profile/" + notiifcationmodel.UserId + "/performance"]);
|
|
468
|
+
}
|
|
469
|
+
else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
|
|
470
|
+
NotificationTypeIds.PerformanceReviewInvitationNotificationModel.toString().toLowerCase()) {
|
|
471
|
+
this.router.navigate(["dashboard/profile/" + notiifcationmodel.UserId + "/performance"]);
|
|
472
|
+
}
|
|
473
|
+
else if (selectedNotification.notificationTypeId.toString().toLowerCase() ==
|
|
474
|
+
NotificationTypeIds.PerformanceReviewAssignToEmployeeNotification.toString().toLowerCase()) {
|
|
475
|
+
this.router.navigate(["dashboard/profile/" + CurrentUserId + "/performance"]);
|
|
476
|
+
}
|
|
477
|
+
this.store.dispatch(new UpsertUnreadNotificationsTriggered(notifications));
|
|
478
|
+
}
|
|
479
|
+
upsertReadNewNotification(notification) {
|
|
480
|
+
let notes = [notification];
|
|
481
|
+
this.signalr.upsertReadNewNotifications(notes)
|
|
482
|
+
.subscribe((res) => {
|
|
483
|
+
if (res.success) {
|
|
484
|
+
this.signalr.removeItemFromNotifications(notification.id);
|
|
485
|
+
}
|
|
486
|
+
});
|
|
487
|
+
if (notification.navigationUrl) {
|
|
488
|
+
window.open(notification.navigationUrl, "_blank");
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
clearNewAll(e) {
|
|
492
|
+
this.signalr.upsertReadNewNotifications(this.newNotifications)
|
|
493
|
+
.subscribe((res) => {
|
|
494
|
+
if (res.success) {
|
|
495
|
+
this.signalr.removeAllNotifications();
|
|
496
|
+
}
|
|
497
|
+
});
|
|
498
|
+
}
|
|
499
|
+
ngOnDestroy() {
|
|
500
|
+
this.ngDestroyed$.next();
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
NotificationsComponent.ɵfac = function NotificationsComponent_Factory(t) { return new (t || NotificationsComponent)(i0.ɵɵdirectiveInject(i1.Router), i0.ɵɵdirectiveInject(i2.PubNubAngular), i0.ɵɵdirectiveInject(i3.Store), i0.ɵɵdirectiveInject(i4.Actions), i0.ɵɵdirectiveInject(i5.CookieService), i0.ɵɵdirectiveInject(i6.ToastrService), i0.ɵɵdirectiveInject(i7.MatDialog), i0.ɵɵdirectiveInject(i8.OrderByPipe), i0.ɵɵdirectiveInject(i9.SignalrService), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
|
|
504
|
+
NotificationsComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: NotificationsComponent, selectors: [["app-notifications"]], inputs: { notificPanel: "notificPanel" }, decls: 8, vars: 7, consts: [[1, "text-center", "mat-bg-primary", "pt-1", "pb-1"], [1, "m-0"], ["id", "style-1", 4, "ngIf"], ["class", "text-center p-1", 4, "ngIf"], ["class", "text-center mt-05 mb-05", 4, "ngIf"], ["id", "style-1"], ["class", "notification-list p-0 pr-03", "role", "list", 4, "ngFor", "ngForOf"], ["role", "list", 1, "notification-list", "p-0", "pr-03"], ["role", "listitem", "routerLinkActive", "open", 1, "notific-item", "pr-03", "notification-margin", 3, "ngClass", "click"], [1, "mat-list-text", "pl-0", "pr-03", "notification-cursor", "notifications-list-item"], [1, "word-break", "display-pre-line", 2, "margin", "0px !important", 3, "innerHTML"], [1, "time", "text-muted"], [1, "text-center", "p-1"], [1, "text-center", "mt-05", "mb-05"], [1, "mb-0"], [3, "click"]], template: function NotificationsComponent_Template(rf, ctx) { if (rf & 1) {
|
|
505
|
+
i0.ɵɵelementStart(0, "div", 0);
|
|
506
|
+
i0.ɵɵelementStart(1, "h6", 1);
|
|
507
|
+
i0.ɵɵtext(2);
|
|
508
|
+
i0.ɵɵpipe(3, "translate");
|
|
509
|
+
i0.ɵɵelementEnd();
|
|
510
|
+
i0.ɵɵelementEnd();
|
|
511
|
+
i0.ɵɵtemplate(4, NotificationsComponent_div_4_Template, 3, 3, "div", 2);
|
|
512
|
+
i0.ɵɵtemplate(5, NotificationsComponent_div_5_Template, 3, 3, "div", 3);
|
|
513
|
+
i0.ɵɵelement(6, "mat-divider");
|
|
514
|
+
i0.ɵɵtemplate(7, NotificationsComponent_div_7_Template, 5, 3, "div", 4);
|
|
515
|
+
} if (rf & 2) {
|
|
516
|
+
i0.ɵɵadvance(2);
|
|
517
|
+
i0.ɵɵtextInterpolate2("", i0.ɵɵpipeBind1(3, 5, "NOTIFICATIONS.NOTIFICATIONSTITLE"), " (", ctx.newNotifications == null ? null : ctx.newNotifications.length, ")");
|
|
518
|
+
i0.ɵɵadvance(2);
|
|
519
|
+
i0.ɵɵproperty("ngIf", ctx.newNotifications.length != 0);
|
|
520
|
+
i0.ɵɵadvance(1);
|
|
521
|
+
i0.ɵɵproperty("ngIf", ctx.newNotifications.length == 0);
|
|
522
|
+
i0.ɵɵadvance(2);
|
|
523
|
+
i0.ɵɵproperty("ngIf", ctx.newNotifications.length);
|
|
524
|
+
} }, directives: [i10.NgIf, i11.MatDivider, i10.NgForOf, i12.MatNavList, i12.MatListItem, i1.RouterLinkActive, i10.NgClass, i13.DefaultClassDirective], pipes: [i14.TranslatePipe, i8.OrderByPipe, i15.SanitizeHtmlPipe, i16.TimeagoPipe, i17.UtcToLocalTimePipe], encapsulation: 2 });
|
|
525
|
+
(function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(NotificationsComponent, [{
|
|
526
|
+
type: Component,
|
|
527
|
+
args: [{
|
|
528
|
+
selector: "app-notifications",
|
|
529
|
+
templateUrl: "./notifications.component.html"
|
|
530
|
+
}]
|
|
531
|
+
}], function () { return [{ type: i1.Router }, { type: i2.PubNubAngular }, { type: i3.Store }, { type: i4.Actions }, { type: i5.CookieService }, { type: i6.ToastrService }, { type: i7.MatDialog }, { type: i8.OrderByPipe }, { type: i9.SignalrService }, { type: i0.ChangeDetectorRef }]; }, { notificPanel: [{
|
|
532
|
+
type: Input
|
|
533
|
+
}] }); })();
|
|
534
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90aWZpY2F0aW9ucy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zaGVsbC1tb2R1bGUtY29tcG9uZW50cy9zaGVsbC1jb21wb25lbnRzL3NyYy9saWIvc2hlbGwtY29tcG9uZW50cy9jb21wb25lbnRzL25vdGlmaWNhdGlvbnMvbm90aWZpY2F0aW9ucy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zaGVsbC1tb2R1bGUtY29tcG9uZW50cy9zaGVsbC1jb21wb25lbnRzL3NyYy9saWIvc2hlbGwtY29tcG9uZW50cy9jb21wb25lbnRzL25vdGlmaWNhdGlvbnMvbm90aWZpY2F0aW9ucy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQThDLFNBQVMsRUFBRSxLQUFLLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFFckcsT0FBTyxFQUFFLGFBQWEsRUFBVSxNQUFNLGlCQUFpQixDQUFDO0FBQ3hELE9BQU8sRUFBVyxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDaEQsT0FBTyxFQUFFLE1BQU0sRUFBUyxNQUFNLGFBQWEsQ0FBQztBQUk1QyxPQUFPLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEQsT0FBTyxFQUFFLHlCQUF5QixFQUF1QixNQUFNLDRDQUE0QyxDQUFDO0FBQzVHLE9BQU8sRUFBRSxxQkFBcUIsRUFBMkIsd0JBQXdCLEVBQUUsa0NBQWtDLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUV6SyxPQUFPLEtBQUssb0JBQW9CLE1BQU0sNEJBQTRCLENBQUM7QUFDbkUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFLNUUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sK0RBQStELENBQUM7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QzdDbkMsOEJBQWtEO1FBRWhELDZCQUFnQjtRQUFBLFlBQW1GOztRQUFBLGlCQUFLO1FBQzFHLGlCQUFNO1FBQ04sdUVBa0JNO1FBQ04sdUVBQzhEO1FBQzlELDhCQUEyQjtRQUMzQix1RUFHTTs7UUEzQlksZUFBbUY7UUFBbkYsaUtBQW1GO1FBRWxGLGVBQWtDO1FBQWxDLHVEQUFrQztRQW1CdkIsZUFBa0M7UUFBbEMsdURBQWtDO1FBRzFCLGVBQTZCO1FBQTdCLGtEQUE2Qjs7dUZEbUJ0RCxzQkFBc0I7Y0FMbEMsU0FBUztlQUFDO2dCQUNULFFBQVEsRUFBRSxtQkFBbUI7Z0JBQzdCLFdBQVcsRUFBRSxnQ0FBZ0M7YUFDOUM7c1NBSVUsWUFBWTtrQkFBcEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBJbnB1dCwgT25Jbml0IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IE1hdERpYWxvZyB9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2dcIjtcbmltcG9ydCB7IE5hdmlnYXRpb25FbmQsIFJvdXRlciB9IGZyb20gXCJAYW5ndWxhci9yb3V0ZXJcIjtcbmltcG9ydCB7IEFjdGlvbnMsIG9mVHlwZSB9IGZyb20gXCJAbmdyeC9lZmZlY3RzXCI7XG5pbXBvcnQgeyBzZWxlY3QsIFN0b3JlIH0gZnJvbSBcIkBuZ3J4L3N0b3JlXCI7XG5pbXBvcnQgeyBDb29raWVTZXJ2aWNlIH0gZnJvbSBcIm5neC1jb29raWUtc2VydmljZVwiO1xuaW1wb3J0IHsgVG9hc3RyU2VydmljZSB9IGZyb20gXCJuZ3gtdG9hc3RyXCI7XG5pbXBvcnQgeyBQdWJOdWJBbmd1bGFyIH0gZnJvbSBcInB1Ym51Yi1hbmd1bGFyMlwiO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyB0YWtlVW50aWwsIHRhcCB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xuaW1wb3J0IHsgQXV0aGVudGljYXRpb25BY3Rpb25UeXBlcywgUm9sZXNGZXRjaFRyaWdnZXJlZCB9IGZyb20gXCIuLi8uLi9zdG9yZS9hY3Rpb25zL2F1dGhlbnRpY2F0aW9uLmFjdGlvbnNcIjtcbmltcG9ydCB7IENsZWFyQWxsTm90aWZpY2F0aW9ucywgTmV3Tm90aWZpY2F0aW9uUmVjZWl2ZWQsIE5vdGlmaWNhdGlvbnNBY3Rpb25UeXBlcywgVXBzZXJ0VW5yZWFkTm90aWZpY2F0aW9uc1RyaWdnZXJlZCB9IGZyb20gXCIuLi8uLi9zdG9yZS9hY3Rpb25zL25vdGlmaWNhdGlvbnMuYWN0aW9uc1wiO1xuaW1wb3J0IHsgU3RhdGUgfSBmcm9tIFwiLi4vLi4vc3RvcmUvcmVkdWNlcnMvaW5kZXhcIjtcbmltcG9ydCAqIGFzIHNoYXJlZE1vZHVsZVJlZHVjZXJzIGZyb20gXCIuLi8uLi9zdG9yZS9yZWR1Y2Vycy9pbmRleFwiO1xuaW1wb3J0IHsgTm90aWZpY2F0aW9uVHlwZUlkcyB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy9ub3RpZmljYXRpb24tdHlwZS1pZHMnO1xuaW1wb3J0IHsgTm90aWZpY2F0aW9uTW9kZWwsIE5vdGlmaWNhdGlvbk91dHB1dE1vZGVsLCBVc2VyTm90aWZpY2F0aW9uUmVhZE1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL05vdGlmaWNhdGlvbnNPdXRQdXRNb2RlbCc7XG5pbXBvcnQgeyBTb2Z0TGFiZWxDb25maWd1cmF0aW9uTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvc29mdGxhYmVscy1tb2RlbCc7XG5pbXBvcnQgeyBVc2VyTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvdXNlcic7XG5pbXBvcnQgeyBPcmRlckJ5UGlwZSB9IGZyb20gJy4uLy4uLy4uL2dsb2JhbGRlcGVuZGVuY2llcy9waXBlcy9vcmRlcmJ5LXBpcGUnO1xuaW1wb3J0IHsgTG9jYWxTdG9yYWdlUHJvcGVydGllcyB9IGZyb20gJy4uLy4uLy4uL2dsb2JhbGRlcGVuZGVuY2llcy9jb25zdGFudHMvbG9jYWxzdG9yYWdlLXByb3BlcnRpZXMnO1xuaW1wb3J0IHsgQ2hhbm5lbE5hbWVzIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzL2NoYW5uZWwtbmFtZXMnO1xuaW1wb3J0IHsgQ2hhbm5lbFJvdXRlcyB9IGZyb20gJy4uLy4uL2NvbnN0YW50cy9ub3RpZmljYXRpb24tcm91dGVzJztcbmltcG9ydCB7IFVzZXJTdG9yeUFzc2lnbmVkTm90aWZpY2F0aW9uIH0gZnJvbSAnLi4vLi4vbW9kZWxzL1VzZXJTdG9yeUFzc2lnbmVkTm90aWZpY2F0aW9uJztcbmltcG9ydCB7IFJvbGVVcGRhdGVkTm90aWZpY2F0aW9uIH0gZnJvbSAnLi4vLi4vbW9kZWxzL1JvbGVVcGRhdGVkTm90aWZpY2F0aW9uJztcbmltcG9ydCB7IFJlcG9ydFN1Ym1pdHRlZE5vdGlmaWNhdGlvbiB9IGZyb20gJy4uLy4uL21vZGVscy9SZXBvcnRTdWJtaXR0ZWROb3RpZmljYXRpb24nO1xuaW1wb3J0IHsgUmVwb3J0Q29uZmlnQXNzaWduZWROb3RpZmljYXRpb24gfSBmcm9tICcuLi8uLi9tb2RlbHMvUmVwb3J0Q29uZmlnQXNzaWduZWROb3RpZmljYXRpb24nO1xuaW1wb3J0IHsgTXVsdGlwbGVDaGFydHNTY2hlZHVsaW5nIH0gZnJvbSAnLi4vLi4vbW9kZWxzL211bHRpQ2hhcnRzU2NoZWR1bGluZyc7XG5pbXBvcnQgeyBBc3NldEFzc2lnbmVkTm90aWZpY2F0aW9uIH0gZnJvbSAnLi4vLi4vbW9kZWxzL0Fzc2V0QXNzaWduZWROb3RpZmljYXRpb25Nb2RlbCc7XG5pbXBvcnQgeyBOZXdQcm9qZWN0Q3JlYXRlZE5vdGlmaWNhdGlvbk1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL05ld1Byb2plY3RDcmVhdGVkTm90aWZpY2F0aW9uTW9kZWwnO1xuaW1wb3J0IHsgR29hbEFwcHJvdmVkTm90aWZpY2F0aW9uTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvZ29hbEFwcHJvdmVkTm90aWZpY2F0aW9uTW9kZWwnO1xuaW1wb3J0IHsgVXNlclN0b3J5VXBkYXRlTm90aWZpY2F0aW9uTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvdXNlclN0b3J5VXBkYXRlTm90aWZpY2F0aW9uTW9kZWwnO1xuaW1wb3J0IHsgVXNlclN0b3J5Q29tbWVudE5vdGlmaWNhdGlvbk1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3VzZXJTdG9yeUNvbW1lbnROb3RpZmljYXRpb25Nb2RlbCc7XG5pbXBvcnQgeyBTcHJpbnRTdGFydGVkTm90aWZpY2F0aW9uTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbHMvc3ByaW50U3RhcnRlZE5vdGlmaWNhdGlvbk1vZGVsJztcbmltcG9ydCB7IFNwcmludFJlcGxhblN0YXJ0ZWROb3RpZmljYXRpb25Nb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9zcHJpbnRSZXBsYW5SZXF1ZXN0ZWRNb2RlbCc7XG5pbXBvcnQgeyBBbm5vdWNlbWVudERpYWxvZ0NvbXBvbmVudCB9IGZyb20gJy4vYW5ub3VuY2VtZW50LWRpYWxvZy5jb21wb25lbnQnO1xuaW1wb3J0IHsgR3VpZCB9IGZyb20gJ2d1aWQtdHlwZXNjcmlwdCc7XG5pbXBvcnQgJy4uLy4uLy4uL2dsb2JhbGRlcGVuZGVuY2llcy9oZWxwZXJzL2ZvbnRhd2Vzb21lLWljb25zJztcbmltcG9ydCAqIGFzIF8gZnJvbSBcInVuZGVyc2NvcmVcIjtcbmltcG9ydCB7IFNpZ25hbHJTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL3NlcnZpY2VzL3NpZ25hbHIuc2VydmljZVwiO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6IFwiYXBwLW5vdGlmaWNhdGlvbnNcIixcbiAgdGVtcGxhdGVVcmw6IFwiLi9ub3RpZmljYXRpb25zLmNvbXBvbmVudC5odG1sXCJcbn0pXG5cbmV4cG9ydCBjbGFzcyBOb3RpZmljYXRpb25zQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcblxuICBASW5wdXQoKSBub3RpZmljUGFuZWw7XG5cbiAgcHVibGljIG5nRGVzdHJveWVkJCA9IG5ldyBTdWJqZWN0KCk7XG4gIGNvbnN0Tm90aWZpY2F0aW9uX1dvcmtJdGVtQXNzaWduZWRUb1VzZXIgPSBOb3RpZmljYXRpb25UeXBlSWRzLk5vdGlmaWNhdGlvbl9Xb3JrSXRlbUFzc2lnbmVkVG9Vc2VyO1xuICBub3RpZmljYXRpb25zJDogT2JzZXJ2YWJsZTxOb3RpZmljYXRpb25PdXRwdXRNb2RlbFtdPjtcbiAgbm90aWZpY2F0aW9uczogTm90aWZpY2F0aW9uT3V0cHV0TW9kZWxbXTtcbiAgc29mdExhYmVsczogU29mdExhYmVsQ29uZmlndXJhdGlvbk1vZGVsW107XG4gIGxvYWRpbmdOb3RpZmljYXRpb25zJDogT2JzZXJ2YWJsZTxib29sZWFuPjtcbiAgc2VsZWN0ZWROb3RpZmljYXRpb246IFVzZXJOb3RpZmljYXRpb25SZWFkTW9kZWw7XG4gIGFubm91bmNlbWVudElkOiBzdHJpbmc7XG4gIGFubm91bmNlTm90aWZpY2F0aW9uSWQ6IHN0cmluZztcbiAgbm90aWZpY2F0aW9uQ29sb3IgPSBmYWxzZTtcbiAgYXV0aGVudGljYXRlZFVzZXJSZWNvcmQkOiBPYnNlcnZhYmxlPFVzZXJNb2RlbD47XG4gIG5ld05vdGlmaWNhdGlvbnM6IE5vdGlmaWNhdGlvbk1vZGVsW10gPSBbXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLCBwcml2YXRlIHB1Ym51YjogUHViTnViQW5ndWxhciwgcHJpdmF0ZSBzdG9yZTogU3RvcmU8U3RhdGU+LFxuICAgIHByaXZhdGUgYWN0aW9uVXBkYXRlcyQ6IEFjdGlvbnMsIHByaXZhdGUgY29va2llU2VydmljZTogQ29va2llU2VydmljZSwgcHJpdmF0ZSB0b2FzdHI6IFRvYXN0clNlcnZpY2UsXG4gICAgcHVibGljIGRpYWxvZzogTWF0RGlhbG9nLCBwcml2YXRlIG9yZGVyQnlQaXBlOiBPcmRlckJ5UGlwZSwgcHJpdmF0ZSBzaWduYWxyOiBTaWduYWxyU2VydmljZSxcbiAgICBwcml2YXRlIGNkUmVmOiBDaGFuZ2VEZXRlY3RvclJlZiwpIHtcbiAgICB0aGlzLmFjdGlvblVwZGF0ZXMkXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZVVudGlsKHRoaXMubmdEZXN0cm95ZWQkKSxcbiAgICAgICAgb2ZUeXBlKEF1dGhlbnRpY2F0aW9uQWN0aW9uVHlwZXMuVXNlckRldGFpbHNGZXRjaGVkQWZ0ZXJMb2dpbiksXG4gICAgICAgIHRhcCgoKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuY29va2llU2VydmljZS5jaGVjayhMb2NhbFN0b3JhZ2VQcm9wZXJ0aWVzLkN1cnJlbnRVc2VySWQpKSB7XG5cbiAgICAgICAgICAgIGNvbnN0IEN1cnJlbnRVc2VySWQgPSB0aGlzLmNvb2tpZVNlcnZpY2UuZ2V0KExvY2FsU3RvcmFnZVByb3BlcnRpZXMuQ3VycmVudFVzZXJJZCk7XG4gICAgICAgICAgICAvLyBTdWJzY3JpYmUgdG8gVGFzayBBc3NpZ25tZW50IE5vdGlmaWNhaXRvbnMgaGVyZS5cbiAgICAgICAgICAgIGNvbnN0IHRhc2tBc3NpZ25tZW50Q2hhbm5lbFRvU3Vic2NyaWJlSW50byA9IENoYW5uZWxOYW1lcy5DaGFubmVsX1Rhc2tBc3NpZ25tZW50cyArIEN1cnJlbnRVc2VySWQ7XG4gICAgICAgICAgICBjb25zdCB0YXN0YXR1c1JlcG9ydFN1Ym1pc3Npb25DaGFubmVsVG9TdWJzY3JpYmVJbnRvID0gQ2hhbm5lbE5hbWVzLkNoYW5uZWxfU3RhdHVzUmVwb3J0U3VibWlzc2lvbiArIEN1cnJlbnRVc2VySWQ7XG4gICAgICAgICAgICBjb25zdCB0YXN0YXR1c0NvbmZpZ0Fzc2lnbkNoYW5uZWxUb1N1YnNjcmliZUludG8gPSBDaGFubmVsTmFtZXMuQ2hhbm5lbF9TdGF0dXNDb25maWdBc3NpZ24gKyBDdXJyZW50VXNlcklkO1xuICAgICAgICAgICAgY29uc3QgbXVsdGlDaGFydHNTY2hlZHVsaW5nQ2hhbm5lbFRvU3Vic2NyaWJlSW50byA9IENoYW5uZWxOYW1lcy5DaGFubmVsX011bHRpQ2hhcnRzU2NoZWR1bGluZyArIEN1cnJlbnRVc2VySWQ7XG4gICAgICAgICAgICBjb25zdCBhc3NldHNBc3NpZ25lZENoYW5uZWxUb1N1YnNjcmliZUludG8gPSBDaGFubmVsTmFtZXMuQ2hhbm5lbF9Bc3NldEFzc2lnbm1lbnQgKyBDdXJyZW50VXNlcklkO1xuICAgICAgICAgICAgY29uc3QgcHJvamVjdENyZWF0ZWRDaGFubmVsVG9TdWJzY3JpYmVJbnRvID0gQ2hhbm5lbE5hbWVzLkNoYW5uZWxfTmV3UHJvamVjdCArIEN1cnJlbnRVc2VySWQ7XG4gICAgICAgICAgICBjb25zdCBwcm9qZWN0QWNjZXNzVG9NZW1iZXJDaGFubmVsVG9TdWJzY3JpYmVJbnRvID0gQ2hhbm5lbE5hbWVzLkNoYW5uZWxfUHJvamVjdE1lbWJlclJvbGUgKyBDdXJyZW50VXNlcklkO1xuICAgICAgICAgICAgY29uc3QgZ29hbEFwcHJvdmVkQ2hhbm5lbFRvU3Vic2NyaWJlSW50byA9IENoYW5uZWxOYW1lcy5DaGFubmVsX0dvYWxBcHByb3ZlZEZyb21SZXBsYW4gKyBDdXJyZW50VXNlcklkO1xuICAgICAgICAgICAgY29uc3QgdXNlclN0b3J5VXBkYXRlQ2hhbm5lbFRvU3Vic2NyaWJlSW50byA9IENoYW5uZWxOYW1lcy5DaGFubmVsX1VzZXJTdG9yeVVwZGF0ZU5vdGlmaWNhdGlvbiArIEN1cnJlbnRVc2VySWQ7XG4gICAgICAgICAgICBjb25zdCBBbm5vdW5jZW1lbnRDaGFubmVsVG9TdWJzY3JpYmVJbnRvID0gQ2hhbm5lbE5hbWVzLkNoYW5uZWxfQW5ub3VuY2VtZW50Tm90aWZpY2F0aW9uICsgQ3VycmVudFVzZXJJZDtcbiAgICAgICAgICAgIGNvbnN0IFJlbWluZGVyQ2hhbm5lbFRvU3Vic2NyaWJlSW50byA9IENoYW5uZWxOYW1lcy5DaGFubmVsX1JlbWluZGVyTm90aWZpY2F0aW9uICsgQ3VycmVudFVzZXJJZDtcbiAgICAgICAgICAgIGNvbnN0IFBlcmZvcm1hbmNlQ2hhbm5lbFRvU3Vic2NyaWJlSW50byA9IENoYW5uZWxOYW1lcy5DaGFubmVsX1Blcm9mb3JtYW5jZU5vdGlmaWNhdGlvbiArIEN1cnJlbnRVc2VySWQ7XG4gICAgICAgICAgICBjb25zdCB1c2VyU3RvcnlDb21tZW50Q2hhbm5lbFRvU3Vic2NyaWJlSW50byA9IENoYW5uZWxOYW1lcy5DaGFubmVsX1VzZXJTdG9yeUNvbW1lbnQgKyBDdXJyZW50VXNlcklkO1xuICAgICAgICAgICAgY29uc3Qgc3ByaW50U3RhcnRlZENoYW5uZWxUb1N1YnNjcmliZUludG8gPSBDaGFubmVsTmFtZXMuQ2hhbm5lbF9TcHJpbnRTdGFydGVkICsgQ3VycmVudFVzZXJJZDtcbiAgICAgICAgICAgIGNvbnN0IHNwcmludFJlcGxhbkNoYW5uZWxUb1N1YnNjcmliZUludG8gPSBDaGFubmVsTmFtZXMuQ2hhbm5lbF9TcHJpbnRSZXF1ZXN0ZWRUb1JlcGxhbiArIEN1cnJlbnRVc2VySWQ7XG4gICAgICAgICAgICBjb25zdCBsZWF2ZUFwcGxpZWRDaGFubmVsVG9TdWJzY3JpYmVJbnRvID0gQ2hhbm5lbE5hbWVzLkNoYW5uZWxfTGVhdmVBcHBsaWVkICsgQ3VycmVudFVzZXJJZDtcbiAgICAgICAgICAgIGNvbnN0IEFwcHJvdmVMZWF2ZUNoYW5uZWxUb1N1YnNjcmliZUludG8gPSBDaGFubmVsTmFtZXMuQ2hhbm5lbF9BcHByb3ZlTGVhdmUgKyBDdXJyZW50VXNlcklkO1xuICAgICAgICAgICAgY29uc3QgUmVqZWN0TGVhdmVDaGFubmVsVG9TdWJzY3JpYmVJbnRvID0gQ2hhbm5lbE5hbWVzLkNoYW5uZWxfUmVqZWN0TGVhdmUgKyBDdXJyZW50VXNlcklkO1xuICAgICAgICAgICAgY29uc3QgUmVzaWduYXRpb25DaGFubmVsVG9TdWJzY3JpYmVJbnRvID0gQ2hhbm5lbE5hbWVzLkNoYW5uZWxfUmVzaWduYXRpb24gKyBDdXJyZW50VXNlcklkO1xuICAgICAgICAgICAgY29uc3QgQXBwcm92ZVJlc2lnbmF0aW9uQ2hhbm5lbFRvU3Vic2NyaWJlSW50byA9IENoYW5uZWxOYW1lcy5DaGFubmVsX0FwcHJvdmVSZXNpZ25hdGlvbiArIEN1cnJlbnRVc2VySWQ7XG4gICAgICAgICAgICBjb25zdCBSZWplY3RSZXNpZ25hdGlvbkNoYW5uZWxUb1N1YnNjcmliZUludG8gPSBDaGFubmVsTmFtZXMuQ2hhbm5lbF9SZWplY3RSZXNpZ25hdGlvbiArIEN1cnJlbnRVc2VySWQ7XG4gICAgICAgICAgICBjb25zdCBBdXRvVEltZXNoZWV0U3VibWlzc2lvbkNoYW5uZWxUb1N1YnNjcmliZUludG8gPSBDaGFubmVsTmFtZXMuQ2hhbm5lbF9BdXRvVGltZXNoZWV0U3VibWlzc2lvbiArIEN1cnJlbnRVc2VySWQ7XG4gICAgICAgICAgICBjb25zdCBQcm9iYXRpb25Bc3NpZ25Ob3RpZmljYXRpb24gPSBDaGFubmVsTmFtZXMuQ2hhbm5lbF9Qcm9iYXRpb25Bc3NpZ25Ob3RpZmljYXRpb24gKyBDdXJyZW50VXNlcklkO1xuICAgICAgICAgICAgY29uc3QgUmV2aWV3QXNzaWduVG9FbXBsb3llZU5vdGlmaWNhdGlvbiA9IENoYW5uZWxOYW1lcy5DaGFubmVsX1Jldmlld0Fzc2lnblRvRW1wbG95ZWVOb3RpZmljYXRpb24gKyBDdXJyZW50VXNlcklkO1xuICAgICAgICAgICAgY29uc3QgUmV2aWV3U3VibWl0dGVkQnlFbXBsb3llZU5vdGlmaWNhdGlvbiA9IENoYW5uZWxOYW1lcy5DaGFubmVsX1Jldmlld1N1Ym1pdHRlZEJ5RW1wbG95ZWVOb3RpZmljYXRpb24gKyBDdXJyZW50VXNlcklkO1xuICAgICAgICAgICAgY29uc3QgUmV2aWV3SW52aXRhdGlvbk5vdGlmaWNhdGlvbk1vZGVsID0gQ2hhbm5lbE5hbWVzLkNoYW5uZWxfUmV2aWV3SW52aXRhdGlvbk5vdGlmaWNhdGlvbk1vZGVsICsgQ3VycmVudFVzZXJJZDtcbiAgICAgICAgICAgIGNvbnN0IFBlcmZvcm1hbmNlUmV2aWV3U3VibWl0dGVkQnlFbXBsb3llZU5vdGlmaWNhdGlvbiA9IENoYW5uZWxOYW1lcy5DaGFubmVsX1BlcmZvcm1hbmNlUmV2aWV3U3VibWl0dGVkQnlFbXBsb3llZU5vdGlmaWNhdGlvbiArIEN1cnJlbnRVc2VySWQ7XG4gICAgICAgICAgICBjb25zdCBQZXJmb3JtYW5jZVJldmlld0ludml0YXRpb25Ob3RpZmljYXRpb25Nb2RlbCA9IENoYW5uZWxOYW1lcy5DaGFubmVsX1BlcmZvcm1hbmNlUmV2aWV3SW52aXRhdGlvbk5vdGlmaWNhdGlvbk1vZGVsICsgQ3VycmVudFVzZXJJZDtcbiAgICAgICAgICAgIGNvbnN0IFBlcmZvcm1hbmNlUmV2aWV3QXNzaWduVG9FbXBsb3llZU5vdGlmaWNhdGlvbiA9IENoYW5uZWxOYW1lcy5DaGFubmVsX1BlcmZvcm1hbmNlUmV2aWV3QXNzaWduVG9FbXBsb3llZU5vdGlmaWNhdGlvbiArIEN1cnJlbnRVc2VySWQ7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcInN1YnNjcmliaW5nIHRvIFwiICsgdGFza0Fzc2lnbm1lbnRDaGFubmVsVG9TdWJzY3JpYmVJbnRvKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwic3Vic2NyaWJpbmcgdG8gXCIgKyB0YXN0YXR1c1JlcG9ydFN1Ym1pc3Npb25DaGFubmVsVG9TdWJzY3JpYmVJbnRvKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwic3Vic2NyaWJpbmcgdG8gXCIgKyB0YXN0YXR1c0NvbmZpZ0Fzc2lnbkNoYW5uZWxUb1N1YnNjcmliZUludG8pO1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCJzdWJzY3JpYmluZyB0b1wiICsgYXNzZXRzQXNzaWduZWRDaGFubmVsVG9TdWJzY3JpYmVJbnRvKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwic3Vic2NyaWJpbmcgdG9cIiArIHByb2plY3RDcmVhdGVkQ2hhbm5lbFRvU3Vic2NyaWJlSW50byk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcInN1YnNjcmliaW5nIHRvXCIgKyBwcm9qZWN0QWNjZXNzVG9NZW1iZXJDaGFubmVsVG9TdWJzY3JpYmVJbnRvKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwic3Vic2NyaWJpbmcgdG9cIiArIGdvYWxBcHByb3ZlZENoYW5uZWxUb1N1YnNjcmliZUludG8pO1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCJzdWJzY3JpYmluZyB0b1wiICsgdXNlclN0b3J5VXBkYXRlQ2hhbm5lbFRvU3Vic2NyaWJlSW50byk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcInN1YnNjcmliaW5nIHRvXCIgKyBBbm5vdW5jZW1lbnRDaGFubmVsVG9TdWJzY3JpYmVJbnRvKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwic3Vic2NyaWJpbmcgdG9cIiArIHVzZXJTdG9yeUNvbW1lbnRDaGFubmVsVG9TdWJzY3JpYmVJbnRvKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwic3Vic2NyaWJpbmcgdG9cIiArIHNwcmludFN0YXJ0ZWRDaGFubmVsVG9TdWJzY3JpYmVJbnRvKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwic3Vic2NyaWJpbmcgdG9cIiArIHNwcmludFJlcGxhbkNoYW5uZWxUb1N1YnNjcmliZUludG8pO1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCJzdWJzY3JpYmluZyB0b1wiICsgUmVtaW5kZXJDaGFubmVsVG9TdWJzY3JpYmVJbnRvKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwic3Vic2NyaWJpbmcgdG9cIiArIFBlcmZvcm1hbmNlQ2hhbm5lbFRvU3Vic2NyaWJlSW50byk7XG4gICAgICAgICAgICB0aGlzLnB1Ym51Yi5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgICBjaGFubmVsczogW3Rhc2tBc3NpZ25tZW50Q2hhbm5lbFRvU3Vic2NyaWJlSW50bywgdGFzdGF0dXNSZXBvcnRTdWJtaXNzaW9uQ2hhbm5lbFRvU3Vic2NyaWJlSW50byxcbiAgICAgICAgICAgICAgICBQcm9iYXRpb25Bc3NpZ25Ob3RpZmljYXRpb24sIFJldmlld0Fzc2lnblRvRW1wbG95ZWVOb3RpZmljYXRpb24sIFJldmlld1N1Ym1pdHRlZEJ5RW1wbG95ZWVOb3RpZmljYXRpb24sXG4gICAgICAgICAgICAgICAgUmV2aWV3SW52aXRhdGlvbk5vdGlmaWNhdGlvbk1vZGVsLCBQZXJmb3JtYW5jZVJldmlld1N1Ym1pdHRlZEJ5RW1wbG95ZWVOb3RpZmljYXRpb24sIFBlcmZvcm1hbmNlUmV2aWV3QXNzaWduVG9FbXBsb3llZU5vdGlmaWNhdGlvbixcbiAgICAgICAgICAgICAgICB0YXN0YXR1c0NvbmZpZ0Fzc2lnbkNoYW5uZWxUb1N1YnNjcmliZUludG8sIG11bHRpQ2hhcnRzU2NoZWR1bGluZ0NoYW5uZWxUb1N1YnNjcmliZUludG8sIFBlcmZvcm1hbmNlUmV2aWV3SW52aXRhdGlvbk5vdGlmaWNhdGlvbk1vZGVsLFxuICAgICAgICAgICAgICAgIGFzc2V0c0Fzc2lnbmVkQ2hhbm5lbFRvU3Vic2NyaWJlSW50bywgcHJvamVjdENyZWF0ZWRDaGFubmVsVG9TdWJzY3JpYmVJbnRvLCAsXG4gICAgICAgICAgICAgICAgcHJvamVjdEFjY2Vzc1RvTWVtYmVyQ2hhbm5lbFRvU3Vic2NyaWJlSW50bywgZ29hbEFwcHJvdmVkQ2hhbm5lbFRvU3Vic2NyaWJlSW50byxcbiAgICAgICAgICAgICAgICB1c2VyU3RvcnlVcGRhdGVDaGFubmVsVG9TdWJzY3JpYmVJbnRvLCBBbm5vdW5jZW1lbnRDaGFubmVsVG9TdWJzY3JpYmVJbnRvLCBSZW1pbmRlckNoYW5uZWxUb1N1YnNjcmliZUludG8sIFJlamVjdFJlc2lnbmF0aW9uQ2hhbm5lbFRvU3Vic2NyaWJlSW50byxcbiAgICAgICAgICAgICAgICB1c2VyU3RvcnlDb21tZW50Q2hhbm5lbFRvU3Vic2NyaWJlSW50bywgc3ByaW50U3RhcnRlZENoYW5uZWxUb1N1YnNjcmliZUludG8sIFJlc2lnbmF0aW9uQ2hhbm5lbFRvU3Vic2NyaWJlSW50bywgQXBwcm92ZVJlc2lnbmF0aW9uQ2hhbm5lbFRvU3Vic2NyaWJlSW50byxcbiAgICAgICAgICAgICAgICBzcHJpbnRSZXBsYW5DaGFubmVsVG9TdWJzY3JpYmVJbnRvLCBsZWF2ZUFwcGxpZWRDaGFubmVsVG9TdWJzY3JpYmVJbnRvLCBBcHByb3ZlTGVhdmVDaGFubmVsVG9TdWJzY3JpYmVJbnRvLCBSZWplY3RMZWF2ZUNoYW5uZWxUb1N1YnNjcmliZUludG8sXG4gICAgICAgICAgICAgICAgUGVyZm9ybWFuY2VDaGFubmVsVG9TdWJzY3JpYmVJbnRvLCBBdXRvVEltZXNoZWV0U3VibWlzc2lvbkNoYW5uZWxUb1N1YnNjcmliZUludG9dXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIEFkZCBvdGhlciBzdWJzY3JpcHRpb25zIGhlcmUuXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiVXNlciBub3QgbG9nZ2VkIGluIHlldCB0byBiZSBhYmxlIHRvIHN1YnNjcmliZS5cIik7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuXG4gICAgdGhpcy5hY3Rpb25VcGRhdGVzJFxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLm5nRGVzdHJveWVkJCksXG4gICAgICAgIG9mVHlwZShBdXRoZW50aWNhdGlvbkFjdGlvblR5cGVzLlVzZXJEZXRhaWxzRmV0Y2hlZEFmdGVyTG9naW4pLFxuICAgICAgICB0YXAoKCkgPT4ge1xuICAgICAgICAgIHZhciByb2xlVXBkYXRlc0NoYW5uZWxUb1N1YnNjcmliZUludG8gPSBDaGFubmVsTmFtZXMuQ2hhbm5lbF9Sb2xlVXBkYXRlcyArIFwiMTlCNkY5RkMtNzM3MC00QjlDLUEwNUMtM0I4RDgxOUVFRUFGXCI7XG4gICAgICAgICAgY29uc29sZS5sb2coXCJzdWJzY3JpYmluZyB0byBcIiArIHJvbGVVcGRhdGVzQ2hhbm5lbFRvU3Vic2NyaWJlSW50byk7XG4gICAgICAgICAgdGhpcy5wdWJudWIuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgIGNoYW5uZWxzOiBbcm9sZVVwZGF0ZXNDaGFubmVsVG9TdWJzY3JpYmVJbnRvXVxuICAgICAgICAgIH0pO1xuICAgICAgICB9KVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuXG4gICAgdGhpcy5hY3Rpb25VcGRhdGVzJFxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLm5nRGVzdHJveWVkJCksXG4gICAgICAgIG9mVHlwZShOb3RpZmljYXRpb25zQWN0aW9uVHlwZXMuQ2xlYXJBbGxVbnJlYWROb3RpZmljYXRpb25zQ29tcGxldGVkKSxcbiAgICAgICAgdGFwKCgpID0+IHtcbiAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbnMkID0gdGhpcy5zdG9yZS5waXBlKHNlbGVjdChzaGFyZWRNb2R1bGVSZWR1Y2Vycy5nZXROb3RpZmljYXRpb25BbGwpKTtcbiAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbnMkLnN1YnNjcmliZSh4ID0+IHtcbiAgICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9ucyA9IHg7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgfSlcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcblxuICAgIC8vIGNvbnN0IHN0b3JlTGlzdG5lciA9IChtZXNzYWdlKSA9PiB7XG4gICAgLy8gICBjb25zb2xlLmxvZyhcIi0tLS0tLS0tLVJlY2VpdmVkIHB1Ym51YiBtZXNzYWdlLS0tLS0tLS0tXCIpO1xuICAgIC8vICAgLy8gdGhpcy50b2FzdHIuaW5mbyhtZXNzYWdlLm1lc3NhZ2UuU3VtbWFyeSk7XG4gICAgLy8gICB0cnkge1xuICAgIC8vICAgICAvLyBSZWNlaXZpbmcgdGhlIFVzZXIgU3RvcnkgQXNzaWduZWQgTm90aWZpY2F0aW9uXG4gICAgLy8gICAgIGlmIChtZXNzYWdlLm1lc3NhZ2UuTm90aWZpY2F0aW9uVHlwZUd1aWQgPT0gTm90aWZpY2F0aW9uVHlwZUlkcy5Ob3RpZmljYXRpb25fV29ya0l0ZW1Bc3NpZ25lZFRvVXNlcikge1xuICAgIC8vICAgICAgIHZhciB1c2VyU3RvcnlBc3NpZ25lZE5vdGlmaWNhdGlvbiA9IG5ldyBVc2VyU3RvcnlBc3NpZ25lZE5vdGlmaWNhdGlvbigpO1xuICAgIC8vICAgICAgIHVzZXJTdG9yeUFzc2lnbmVkTm90aWZpY2F0aW9uLmxvYWRGcm9tQ2FzZUluc2Vuc2l0aXZlT2JqZWN0KG1lc3NhZ2UubWVzc2FnZSk7XG4gICAgLy8gICAgICAgdXNlclN0b3J5QXNzaWduZWROb3RpZmljYXRpb24ucm91dGUgPSBDaGFubmVsUm91dGVzLlZpZXdXb3JrSXRlbSArIHVzZXJTdG9yeUFzc2lnbmVkTm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbklkO1xuICAgIC8vICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IE5ld05vdGlmaWNhdGlvblJlY2VpdmVkKHVzZXJTdG9yeUFzc2lnbmVkTm90aWZpY2F0aW9uKSk7XG4gICAgLy8gICAgIH0gZWxzZSBpZiAobWVzc2FnZS5tZXNzYWdlLk5vdGlmaWNhdGlvblR5cGVHdWlkID09IE5vdGlmaWNhdGlvblR5cGVJZHMuTm90aWZpY2F0aW9uX1JvbGVVcGRhdGVkKSB7XG4gICAgLy8gICAgICAgdmFyIHJvbGVVcGRhdGVkTm90aWZpY2F0aW9uID0gbmV3IFJvbGVVcGRhdGVkTm90aWZpY2F0aW9uKCk7XG4gICAgLy8gICAgICAgcm9sZVVwZGF0ZWROb3RpZmljYXRpb24ubG9hZEZyb21DYXNlSW5zZW5zaXRpdmVPYmplY3QobWVzc2FnZS5tZXNzYWdlKTtcbiAgICAvLyAgICAgICByb2xlVXBkYXRlZE5vdGlmaWNhdGlvbi5yb3V0ZSA9IENoYW5uZWxSb3V0ZXMuVmlld0FjY291bnQ7XG4gICAgLy8gICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgTmV3Tm90aWZpY2F0aW9uUmVjZWl2ZWQocm9sZVVwZGF0ZWROb3RpZmljYXRpb24pKTtcbiAgICAvLyAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBSb2xlc0ZldGNoVHJpZ2dlcmVkKCkpO1xuICAgIC8vICAgICB9IGVsc2UgaWYgKG1lc3NhZ2UubWVzc2FnZS5Ob3RpZmljYXRpb25UeXBlR3VpZCA9PSBOb3RpZmljYXRpb25UeXBlSWRzLlN0YXR1c19SZXBvcnRfU3VtaXR0ZWQpIHtcbiAgICAvLyAgICAgICB2YXIgcmVwb3J0U3VibWl0dGVkTm90aWZpY2F0aW9uID0gbmV3IFJlcG9ydFN1Ym1pdHRlZE5vdGlmaWNhdGlvbigpO1xuICAgIC8vICAgICAgIHJlcG9ydFN1Ym1pdHRlZE5vdGlmaWNhdGlvbi5sb2FkRnJvbUNhc2VJbnNlbnNpdGl2ZU9iamVjdChtZXNzYWdlLm1lc3NhZ2UpO1xuICAgIC8vICAgICAgIHJlcG9ydFN1Ym1pdHRlZE5vdGlmaWNhdGlvbi5yb3V0ZSA9IENoYW5uZWxSb3V0ZXMuVmlld0FjY291bnQ7XG4gICAgLy8gICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgTmV3Tm90aWZpY2F0aW9uUmVjZWl2ZWQocmVwb3J0U3VibWl0dGVkTm90aWZpY2F0aW9uKSk7XG4gICAgLy8gICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgUm9sZXNGZXRjaFRyaWdnZXJlZCgpKTtcbiAgICAvLyAgICAgfSBlbHNlIGlmIChtZXNzYWdlLm1lc3NhZ2UuTm90aWZpY2F0aW9uVHlwZUd1aWQgPT0gTm90aWZpY2F0aW9uVHlwZUlkcy5TdGF0dXNfUmVwb3J0X0NvbmZpZ19DcmVhdGVkKSB7XG4gICAgLy8gICAgICAgdmFyIHJlcG9ydENvbmZpZ0Fzc2lnbmVkTm90aWZpY2F0aW9uID0gbmV3IFJlcG9ydENvbmZpZ0Fzc2lnbmVkTm90aWZpY2F0aW9uKCk7XG4gICAgLy8gICAgICAgcmVwb3J0Q29uZmlnQXNzaWduZWROb3RpZmljYXRpb24ubG9hZEZyb21DYXNlSW5zZW5zaXRpdmVPYmplY3QobWVzc2FnZS5tZXNzYWdlKTtcbiAgICAvLyAgICAgICByZXBvcnRDb25maWdBc3NpZ25lZE5vdGlmaWNhdGlvbi5yb3V0ZSA9IENoYW5uZWxSb3V0ZXMuVmlld0FjY291bnQ7XG4gICAgLy8gICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgTmV3Tm90aWZpY2F0aW9uUmVjZWl2ZWQocmVwb3J0Q29uZmlnQXNzaWduZWROb3RpZmljYXRpb24pKTtcbiAgICAvLyAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBSb2xlc0ZldGNoVHJpZ2dlcmVkKCkpO1xuICAgIC8vICAgICB9IGVsc2UgaWYgKG1lc3NhZ2UubWVzc2FnZS5Ob3RpZmljYXRpb25UeXBlR3VpZCA9PSBOb3RpZmljYXRpb25UeXBlSWRzLk11bHRpcGxlX0NoYXJ0c19TY2hlZHVsaW5nX2NyZWF0ZWQpIHtcbiAgICAvLyAgICAgICB2YXIgbXVsdGlwbGVDaGFydHNTY2hlZHVsaW5nID0gbmV3IE11bHRpcGxlQ2hhcnRzU2NoZWR1bGluZygpO1xuICAgIC8vICAgICAgIG11bHRpcGxlQ2hhcnRzU2NoZWR1bGluZy5sb2FkRnJvbUNhc2VJbnNlbnNpdGl2ZU9iamVjdChtZXNzYWdlLm1lc3NhZ2UpO1xuICAgIC8vICAgICAgIG11bHRpcGxlQ2hhcnRzU2NoZWR1bGluZy5yb3V0ZSA9IENoYW5uZWxSb3V0ZXMuVmlld0FjY291bnQ7XG4gICAgLy8gICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgTmV3Tm90aWZpY2F0aW9uUmVjZWl2ZWQobXVsdGlwbGVDaGFydHNTY2hlZHVsaW5nKSk7XG4gICAgLy8gICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgUm9sZXNGZXRjaFRyaWdnZXJlZCgpKTtcbiAgICAvLyAgICAgfSBlbHNlIGlmIChtZXNzYWdlLm1lc3NhZ2UuTm90aWZpY2F0aW9uVHlwZUd1aWQgPT0gTm90aWZpY2F0aW9uVHlwZUlkcy5Bc3NldHNfQXNzaWdubWVudCkge1xuICAgIC8vICAgICAgIGNvbnN0IGFzc2V0QXNzaWduZWROb3RpZmljYXRpb24gPSBuZXcgQXNzZXRBc3NpZ25lZE5vdGlmaWNhdGlvbigpO1xuICAgIC8vICAgICAgIGFzc2V0QXNzaWduZWROb3RpZmljYXRpb24ubG9hZEZyb21DYXNlSW5zZW5zaXRpdmVPYmplY3QobWVzc2FnZS5tZXNzYWdlKTtcbiAgICAvLyAgICAgICBhc3NldEFzc2lnbmVkTm90aWZpY2F0aW9uLnJvdXRlID0gQ2hhbm5lbFJvdXRlcy5WaWV3QWNjb3VudDtcbiAgICAvLyAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBOZXdOb3RpZmljYXRpb25SZWNlaXZlZChhc3NldEFzc2lnbmVkTm90aWZpY2F0aW9uKSk7XG4gICAgLy8gICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgUm9sZXNGZXRjaFRyaWdnZXJlZCgpKTtcbiAgICAvLyAgICAgfSBlbHNlIGlmIChtZXNzYWdlLm1lc3NhZ2UuTm90aWZpY2F0aW9uVHlwZUd1aWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09IE5vdGlmaWNhdGlvblR5cGVJZHMuUmVtaW5kZXJfTm90aWZpY2F0aW9uLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSkge1xuICAgIC8vICAgICAgIGNvbnN0IGFzc2V0QXNzaWduZWROb3RpZmljYXRpb24gPSBuZXcgQXNzZXRBc3NpZ25lZE5vdGlmaWNhdGlvbigpO1xuICAgIC8vICAgICAgIGFzc2V0QXNzaWduZWROb3RpZmljYXRpb24ubG9hZEZyb21DYXNlSW5zZW5zaXRpdmVPYmplY3QobWVzc2FnZS5tZXNzYWdlKTtcbiAgICAvLyAgICAgICBhc3NldEFzc2lnbmVkTm90aWZpY2F0aW9uLnJvdXRlID0gQ2hhbm5lbFJvdXRlcy5WaWV3QWNjb3VudDtcbiAgICAvLyAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBOZXdOb3RpZmljYXRpb25SZWNlaXZlZChhc3NldEFzc2lnbmVkTm90aWZpY2F0aW9uKSk7XG4gICAgLy8gICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgUm9sZXNGZXRjaFRyaWdnZXJlZCgpKTtcbiAgICAvLyAgICAgfSBlbHNlIGlmIChtZXNzYWdlLm1lc3NhZ2UuTm90aWZpY2F0aW9uVHlwZUd1aWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09IE5vdGlmaWNhdGlvblR5cGVJZHMuQW5ub3VuY2VtZW50X1JlY2VpdmVkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSkge1xuICAgIC8vICAgICAgIGNvbnN0IGFzc2V0QXNzaWduZWROb3RpZmljYXRpb24gPSBuZXcgQXNzZXRBc3NpZ25lZE5vdGlmaWNhdGlvbigpO1xuICAgIC8vICAgICAgIGFzc2V0QXNzaWduZWROb3RpZmljYXRpb24ubG9hZEZyb21DYXNlSW5zZW5zaXRpdmVPYmplY3QobWVzc2FnZS5tZXNzYWdlKTtcbiAgICAvLyAgICAgICBhc3NldEFzc2lnbmVkTm90aWZpY2F0aW9uLnJvdXRlID0gQ2hhbm5lbFJvdXRlcy5WaWV3QWNjb3VudDtcbiAgICAvLyAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBOZXdOb3RpZmljYXRpb25SZWNlaXZlZChhc3NldEFzc2lnbmVkTm90aWZpY2F0aW9uKSk7XG4gICAgLy8gICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgUm9sZXNGZXRjaFRyaWdnZXJlZCgpKTtcbiAgICAvLyAgICAgICBpZiAobWVzc2FnZS5tZXNzYWdlLklkICE9IHRoaXMuYW5ub3VuY2VOb3RpZmljYXRpb25JZCkge1xuICAgIC8vICAgICAgICAgdGhpcy5hbm5vdW5jZU5vdGlmaWNhdGlvbklkID0gbWVzc2FnZS5tZXNzYWdlLklkO1xuICAgIC8vICAgICAgICAgdGhpcy5vcGVuQW5ub3VuY2VtZW50RGlhbG9nKG1lc3NhZ2UubWVzc2FnZSk7XG4gICAgLy8gICAgICAgfVxuICAgIC8vICAgICB9IGVsc2UgaWYgKG1lc3NhZ2UubWVzc2FnZS5Ob3RpZmljYXRpb25UeXBlR3VpZC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgPT0gTm90aWZpY2F0aW9uVHlwZUlkcy5QZXJmb3JtYW5jZV9SZWNlaXZlZC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgfHwgbWVzc2FnZS5tZXNzYWdlLk5vdGlmaWNhdGlvblR5cGVHdWlkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA9PSBOb3RpZmljYXRpb25UeXBlSWRzLlByb2plY3RNZW1iZXJSb2xlQWRkZWROb3RpZmljYXRpb25JZC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAvLyAgICAgICBjb25zdCBuZXdQcm9qZWN0Q3JlYXRlZE5vdGlmaWNhdGlvbiA9IG5ldyBOZXdQcm9qZWN0Q3JlYXRlZE5vdGlmaWNhdGlvbk1vZGVsKCk7XG4gICAgLy8gICAgICAgbmV3UHJvamVjdENyZWF0ZWROb3RpZmljYXRpb24ubG9hZEZyb21DYXNlSW5zZW5zaXRpdmVPYmplY3QobWVzc2FnZS5tZXNzYWdlKTtcbiAgICAvLyAgICAgICBuZXdQcm9qZWN0Q3JlYXRlZE5vdGlmaWNhdGlvbi5yb3V0ZSA9IENoYW5uZWxSb3V0ZXMuVmlld0FjY291bnQ7XG4gICAgLy8gICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgTmV3Tm90aWZpY2F0aW9uUmVjZWl2ZWQobmV3UHJvamVjdENyZWF0ZWROb3RpZmljYXRpb24pKTtcbiAgICAvLyAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBSb2xlc0ZldGNoVHJpZ2dlcmVkKCkpO1xuICAgIC8vICAgICB9IGVsc2UgaWYgKG1lc3NhZ2UubWVzc2FnZS5Ob3RpZmljYXRpb25UeXBlR3VpZC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgPT0gTm90aWZpY2F0aW9uVHlwZUlkcy5OZXdQcm9qZWN0Q3JlYXRlZE5vdGlmaWNhdGlvbklkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSB8fCBtZXNzYWdlLm1lc3NhZ2UuTm90aWZpY2F0aW9uVHlwZUd1aWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09IE5vdGlmaWNhdGlvblR5cGVJZHMuUHJvamVjdE1lbWJlclJvbGVBZGRlZE5vdGlmaWNhdGlvbklkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSkge1xuICAgIC8vICAgICAgIGNvbnN0IG5ld1Byb2plY3RDcmVhdGVkTm90aWZpY2F0aW9uID0gbmV3IE5ld1Byb2plY3RDcmVhdGVkTm90aWZpY2F0aW9uTW9kZWwoKTtcbiAgICAvLyAgICAgICBuZXdQcm9qZWN0Q3JlYXRlZE5vdGlmaWNhdGlvbi5sb2FkRnJvbUNhc2VJbnNlbnNpdGl2ZU9iamVjdChtZXNzYWdlLm1lc3NhZ2UpO1xuICAgIC8vICAgICAgIG5ld1Byb2plY3RDcmVhdGVkTm90aWZpY2F0aW9uLnJvdXRlID0gQ2hhbm5lbFJvdXRlcy5WaWV3QWNjb3VudDtcbiAgICAvLyAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBOZXdOb3RpZmljYXRpb25SZWNlaXZlZChuZXdQcm9qZWN0Q3JlYXRlZE5vdGlmaWNhdGlvbikpO1xuICAgIC8vICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IFJvbGVzRmV0Y2hUcmlnZ2VyZWQoKSk7XG4gICAgLy8gICAgIH0gZWxzZSBpZiAobWVzc2FnZS5tZXNzYWdlLk5vdGlmaWNhdGlvblR5cGVHdWlkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA9PSBOb3RpZmljYXRpb25UeXBlSWRzLkdvYWxBcHByb3ZlZEZyb21SZXBsYW4udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgLy8gICAgICAgY29uc3QgZ29hbEFwcHJvdmVkTm90aWZpY2F0aW9uTW9kZWwgPSBuZXcgR29hbEFwcHJvdmVkTm90aWZpY2F0aW9uTW9kZWwoKTtcbiAgICAvLyAgICAgICBnb2FsQXBwcm92ZWROb3RpZmljYXRpb25Nb2RlbC5sb2FkRnJvbUNhc2VJbnNlbnNpdGl2ZU9iamVjdChtZXNzYWdlLm1lc3NhZ2UpO1xuICAgIC8vICAgICAgIGdvYWxBcHByb3ZlZE5vdGlmaWNhdGlvbk1vZGVsLnJvdXRlID0gQ2hhbm5lbFJvdXRlcy5WaWV3QWNjb3VudDtcbiAgICAvLyAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBOZXdOb3RpZmljYXRpb25SZWNlaXZlZChnb2FsQXBwcm92ZWROb3RpZmljYXRpb25Nb2RlbCkpO1xuICAgIC8vICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IFJvbGVzRmV0Y2hUcmlnZ2VyZWQoKSk7XG4gICAgLy8gICAgIH0gZWxzZSBpZiAobWVzc2FnZS5tZXNzYWdlLk5vdGlmaWNhdGlvblR5cGVHdWlkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA9PSBOb3RpZmljYXRpb25UeXBlSWRzLlVTZXJTdG9yeVVwZGF0ZU5vdGlmaWNhdGlvbklkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSkge1xuICAgIC8vICAgICAgIGNvbnN0IHVzZXJTdG9yeVVwZGF0ZU5vdGlmaWNhdGlvbk1vZGVsID0gbmV3IFVzZXJTdG9yeVVwZGF0ZU5vdGlmaWNhdGlvbk1vZGVsKCk7XG4gICAgLy8gICAgICAgdXNlclN0b3J5VXBkYXRlTm90aWZpY2F0aW9uTW9kZWwubG9hZEZyb21DYXNlSW5zZW5zaXRpdmVPYmplY3QobWVzc2FnZS5tZXNzYWdlKTtcbiAgICAvLyAgICAgICB1c2VyU3RvcnlVcGRhdGVOb3RpZmljYXRpb25Nb2RlbC5yb3V0ZSA9IENoYW5uZWxSb3V0ZXMuVmlld0FjY291bnQ7XG4gICAgLy8gICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgTmV3Tm90aWZpY2F0aW9uUmVjZWl2ZWQodXNlclN0b3J5VXBkYXRlTm90aWZpY2F0aW9uTW9kZWwpKTtcbiAgICAvLyAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBSb2xlc0ZldGNoVHJpZ2dlcmVkKCkpO1xuICAgIC8vICAgICB9IGVsc2UgaWYgKG1lc3NhZ2UubWVzc2FnZS5Ob3RpZmljYXRpb25UeXBlR3VpZC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgPT0gTm90aWZpY2F0aW9uVHlwZUlkcy5QdXNoTm90aWZpY2F0aW9uRm9yVXNlclN0b3J5Q29tbWVudC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAvLyAgICAgICBjb25zdCB1c2VyU3RvcnlDb21tZW50Tm90aWZpY2F0aW9uTW9kZWwgPSBuZXcgVXNlclN0b3J5Q29tbWVudE5vdGlmaWNhdGlvbk1vZGVsKCk7XG4gICAgLy8gICAgICAgdXNlclN0b3J5Q29tbWVudE5vdGlmaWNhdGlvbk1vZGVsLmxvYWRGcm9tQ2FzZUluc2Vuc2l0aXZlT2JqZWN0KG1lc3NhZ2UubWVzc2FnZSk7XG4gICAgLy8gICAgICAgdXNlclN0b3J5Q29tbWVudE5vdGlmaWNhdGlvbk1vZGVsLnJvdXRlID0gQ2hhbm5lbFJvdXRlcy5WaWV3QWNjb3VudDtcbiAgICAvLyAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBOZXdOb3RpZmljYXRpb25SZWNlaXZlZCh1c2VyU3RvcnlDb21tZW50Tm90aWZpY2F0aW9uTW9kZWwpKTtcbiAgICAvLyAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBSb2xlc0ZldGNoVHJpZ2dlcmVkKCkpO1xuICAgIC8vICAgICB9IGVsc2UgaWYgKG1lc3NhZ2UubWVzc2FnZS5Ob3RpZmljYXRpb25UeXBlR3VpZC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgPT0gTm90aWZpY2F0aW9uVHlwZUlkcy5TcHJpbnRTdGFydGVkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSkge1xuICAgIC8vICAgICAgIGNvbnN0IHNwcmludFN0YXJ0ZWROb3RpZmljYXRpb25Nb2RlbCA9IG5ldyBTcHJpbnRTdGFydGVkTm90aWZpY2F0aW9uTW9kZWwoKTtcbiAgICAvLyAgICAgICBzcHJpbnRTdGFydGVkTm90aWZpY2F0aW9uTW9kZWwubG9hZEZyb21DYXNlSW5zZW5zaXRpdmVPYmplY3QobWVzc2FnZS5tZXNzYWdlKTtcbiAgICAvLyAgICAgICBzcHJpbnRTdGFydGVkTm90aWZpY2F0aW9uTW9kZWwucm91dGUgPSBDaGFubmVsUm91dGVzLlZpZXdBY2NvdW50O1xuICAgIC8vICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IE5ld05vdGlmaWNhdGlvblJlY2VpdmVkKHNwcmludFN0YXJ0ZWROb3RpZmljYXRpb25Nb2RlbCkpO1xuICAgIC8vICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IFJvbGVzRmV0Y2hUcmlnZ2VyZWQoKSk7XG4gICAgLy8gICAgIH0gZWxzZSBpZiAobWVzc2FnZS5tZXNzYWdlLk5vdGlmaWNhdGlvblR5cGVHdWlkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA9PSBOb3RpZmljYXRpb25UeXBlSWRzLlNwcmludFJlcXVlc3RkRm9yUkVwbGFuLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSkge1xuICAgIC8vICAgICAgIGNvbnN0IHNwcmludFJlcGxhblN0YXJ0ZWROb3RpZmljYXRpb25Nb2RlbCA9IG5ldyBTcHJpbnRSZXBsYW5TdGFydGVkTm90aWZpY2F0aW9uTW9kZWwoKTtcbiAgICAvLyAgICAgICBzcHJpbnRSZXBsYW5TdGFydGVkTm90aWZpY2F0aW9uTW9kZWwubG9hZEZyb21DYXNlSW5zZW5zaXRpdmVPYmplY3QobWVzc2FnZS5tZXNzYWdlKTtcbiAgICAvLyAgICAgICBzcHJpbnRSZXBsYW5TdGFydGVkTm90aWZpY2F0aW9uTW9kZWwucm91dGUgPSBDaGFubmVsUm91dGVzLlZpZXdBY2NvdW50O1xuICAgIC8vICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IE5ld05vdGlmaWNhdGlvblJlY2VpdmVkKHNwcmludFJlcGxhblN0YXJ0ZWROb3RpZmljYXRpb25Nb2RlbCkpO1xuICAgIC8vICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IFJvbGVzRmV0Y2hUcmlnZ2VyZWQoKSk7XG4gICAgLy8gICAgIH0gZWxzZSB7XG4gICAgLy8gICAgICAgLy8gVE9ETzogU2VuZCB0aGVzZSBlcnJvcnMgb250byBzZXJ2ZXIgZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZ1xuICAgIC8vICAgICAgIGNvbnNvbGUubG9nKFwiRm91bmQgdW5kZXRlY3RlZCBub3RpZmljYXRpb24gdHlwZS4gXCIgKyBtZXNzYWdlLm1lc3NhZ2UuTm90aWZpY2F0aW9uVHlwZUd1aWQpO1xuICAgIC8vICAgICB9XG4gICAgLy8gICAgIC8vIEFkZCBvdGhlciBub3RpZmljYXRpb25zIGhlcmUuXG5cbiAgICAvLyAgIH0gY2F0Y2ggKGV4Y2VwdGlvbikge1xuICAgIC8vICAgICAvLyBUT0RPOiBTZW5kIHRoZXNlIGV4Y2VwdGlvbnMgb250byBzZXJ2ZXIgZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZ1xuICAgIC8vICAgICBjb25zb2xlLmxvZyhcIkV4Y2VwdGlvbiBPY2N1cmVkXCIgKyBleGNlcHRpb24ubWVzc2FnZSk7XG4gICAgLy8gICB9XG4gICAgLy8gfTtcblxuICAgIC8vIHRoaXMucHVibnViLmFkZExpc3RlbmVyKHtcbiAgICAvLyAgIHN0YXR1czogc3QgPT4ge1xuICAgIC8vICAgICBpZiAoc3QuY2F0ZWdvcnkgPT09IFwiUE5Vbmtub3duQ2F0ZWdvcnlcIikge1xuICAgIC8vICAgICAgIHZhciBuZXdTdGF0ZSA9IHtcbiAgICAvLyAgICAgICAgIG5ldzogXCJlcnJvclwiXG4gICAgLy8gICAgICAgfTtcbiAgICAvLyAgICAgICB0aGlzLnB1Ym51Yi5zZXRTdGF0ZShcbiAgICAvLyAgICAgICAgIHtcbiAgICAvLyAgICAgICAgICAgc3RhdGU6IG5ld1N0YXRlXG4gICAgLy8gICAgICAgICB9XG4gICAgLy8gICAgICAgICAvLyBmdW5jdGlvbiAoc3RhdHVzKSB7XG4gICAgLy8gICAgICAgICAvLyAgIGNvbnNvbGUubG9nKHN0LmVycm9yRGF0YS5tZXNzYWdlKTtcbiAgICAvLyAgICAgICAgIC8vIH1cbiAgICAvLyAgICAgICApO1xuICAgIC8vICAgICB9XG4gICAgLy8gICB9LFxuICAgIC8vICAgbWVzc2FnZTogbWVzc2FnZSA9PiB7XG4gICAgLy8gICAgIGNvbnNvbGUubG9nKFwic3Vic2NyaWJlZCB0byBcIiArIG1lc3NhZ2UpO1xuICAgIC8vICAgICBzdG9yZUxpc3RuZXIobWVzc2FnZSk7XG4gICAgLy8gICB9XG4gICAgLy8gfSk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLnJvdXRlci5ldmVudHNcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLm5nRGVzdHJveWVkJCkpXG4gICAgICAuc3Vic2NyaWJlKChyb3V0ZUNoYW5nZSkgPT4ge1xuICAgICAgICBpZiAocm91dGVDaGFuZ2UgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uRW5kKSB7XG4gICAgICAgICAgaWYgKHRoaXMubm90aWZpY1BhbmVsKSB7XG4gICAgICAgICAgICB0aGlzLm5vdGlmaWNQYW5lbC5jbG9zZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgdGhpcy5zaWduYWxyLm5vdGlmaWNhdGlvbnMkLnN1YnNjcmliZSgoZGF0YTogYW55KSA9PiB7XG4gICAgICB0aGlzLm5ld05vdGlmaWNhdGlvbnMgPSBkYXRhICYmIGRhdGEubGVuZ3RoID4gMCA/IGRhdGEgOiBbXTtcbiAgICAgIHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH0pO1xuICAgIHRoaXMuZ2V0U29mdExhYmVsQ29uZmlndXJhdGlvbnMoKTtcblxuICAgIHRoaXMubm90aWZpY2F0aW9ucyQgPSB0aGlzLnN0b3JlLnBpcGUoc2VsZWN0KHNoYXJlZE1vZHVsZVJlZHVjZXJzLmdldE5vdGlmaWNhdGlvbkFsbCksXG4gICAgICB0YXAoeCA9PiBjb25zb2xlLmxvZyh4KSlcbiAgICApO1xuXG4gICAgdGhpcy5hdXRoZW50aWNhdGVkVXNlclJlY29yZCQgPSB0aGlzLnN0b3JlLnBpcGUoXG4gICAgICBzZWxlY3Qoc2hhcmVkTW9kdWxlUmVkdWNlcnMuZ2V0QXV0aGVudGljYXRlZFVzZXJNb2RlbClcbiAgICApO1xuXG4gICAgdGhpcy5sb2FkaW5nTm90aWZpY2F0aW9ucyQgPSB0aGlzLnN0b3JlLnBpcGUoc2VsZWN0KHNoYXJlZE1vZHVsZVJlZHVjZXJzLmdldE5vdGlmaWNhdGlvbnNMb2FkaW5nKSk7XG4gIH1cblxuICBnZXRTb2Z0TGFiZWxDb25maWd1cmF0aW9ucygpIHtcbiAgICB0aGlzLnNvZnRMYWJlbHMgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdTb2Z0TGFiZWxzJykpO1xuICB9XG5cbiAgY2xlYXJBbGwoZSkge1xuICAgIGNvbnN0IG5vdGlmaWNhdGlvbnMgPSBbXTtcbiAgICB0aGlzLm5vdGlmaWNhdGlvbnMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgbm90aWZpY2F0aW9ucy5wdXNoKGVsZW1lbnQpO1xuICAgIH0pO1xuICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IENsZWFyQWxsTm90aWZpY2F0aW9ucyhub3RpZmljYXRpb25zKSk7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMubm90aWZpY2F0aW9uQ29sb3IgPSAhdGhpcy5ub3RpZmljYXRpb25Db2xvcjtcbiAgfVxuXG4gIC8vIG9wZW5Bbm5vdW5jZW1lbnREaWFsb2coYW5ub3VuY2VkKSB7XG4gIC8vICAgdGhpcy5kaWFsb2cuY2xvc2VBbGwoKTtcbiAgLy8gICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKEFubm91Y2VtZW50RGlhbG9nQ29tcG9uZW50LCB7XG4gIC8vICAgICBtaW5XaWR0aDogXCI2MHZ3XCIsXG4gIC8vICAgICBtYXhXaWR0aDogXCI2MHZ3XCIsXG4gIC8vICAgICBtaW5IZWlnaHQ6IFwiNTB2aFwiLFxuICAvLyAgICAgbWF4SGVpZ2h0OiBcIjgwdmhcIixcbiAgLy8gICAgIGRpc2FibGVDbG9zZTogdHJ1ZSxcbiAgLy8gICAgIGRhdGE6IHtcbiAgLy8gICAgICAgYW5ub3VuY2VtZW50SWQ6IGFubm91bmNlZC5Bbm5vdW5jZW1lbnRJZCxcbiAgLy8gICAgICAgYW5ub3VuY2VtZW50OiBhbm5vdW5jZWQuQW5ub3VuY2VtZW50LFxuICAvLyAgICAgICBhbm5vdW5jZWRCeTogYW5ub3VuY2VkLkFubm91bmNlZEJ5LFxuICAvLyAgICAgICBhbm5vdW5jZWRCeUlkOiBhbm5vdW5jZWQuQW5ub3VuY2VkQnlJZCxcbiAgLy8gICAgICAgYW5ub3VuY2VkQnlVc2VySW1hZ2U6IGFubm91bmNlZC5Bbm5vdW5jZWRCeVVzZXJJbWFnZSxcbiAgLy8gICAgICAgYW5ub3VuY2VkT246IGFubm91bmNlZC5Bbm5vdW5jZWRPblxuICAvLyAgICAgfVxuICAvLyAgIH0pO1xuICAvLyAgIGRpYWxvZ1JlZi5jb21wb25lbnRJbnN0YW5jZS5jbG9zZU1hdERpYWxvZy5zdWJzY3JpYmUoKHJlc3VsdCkgPT4ge1xuICAvLyAgICAgY29uc3QgaW5kZXggPSB0aGlzLm5vdGlmaWNhdGlvbnMuZmluZEluZGV4KChwKSA9PiBwLm5vdGlmaWNhdGlvbklkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA9PSB0aGlzLmFubm91bmNlTm90aWZpY2F0aW9uSWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKTtcbiAgLy8gICAgIGlmIChpbmRleCA+IC0xKSB7XG4gIC8vICAgICAgIHRoaXMudXBzZXJ0UmVhZE5vdGlmaWNhdGlvbih0aGlzLm5vdGlmaWNhdGlvbnNbaW5kZXhdKTtcbiAgLy8gICAgIH1cbiAgLy8gICB9KTtcbiAgLy8gfVxuXG4gIHVwc2VydFJlYWROb3RpZmljYXRpb24oc2VsZWN0ZWROb3RpZmljYXRpb24pIHtcbiAgICBjb25zdCBub3RpZmljYXRpb25zID0gW107XG4gICAgdmFyIHJvbGVzID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbShMb2NhbFN0b3JhZ2VQcm9wZXJ0aWVzLlJvbGVGZWF0dXJlcykpO1xuICAgIGxldCBGZWF0dXJlX0FwcHJvdmVPclJlamVjdExlYXZlID0gJzJDMjI5MTZGLUI4MEItNEM1MS05NTM0LTIzRjY5OERFMTIwQic7XG4gICAgbGV0IGNhbkFjY2Vzc19mZWF0dXJlX0FwcHJvdmVPclJlamVjdExlYXZlID0gXy5maW5kKHJvbGVzLCBmdW5jdGlvbiAocm9sZSkgeyByZXR1cm4gcm9sZVsnZmVhdHVyZUlkJ10udG9Mb3dlckNhc2UoKSA9PSBGZWF0dXJlX0FwcHJvdmVPclJlamVjdExlYXZlLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKTsgfSkgIT0gbnVsbDtcbiAgICBjb25zdCBDdXJyZW50VXNlcklkID0gdGhpcy5jb29raWVTZXJ2aWNlLmdldChMb2NhbFN0b3JhZ2VQcm9wZXJ0aWVzLkN1cnJlbnRVc2VySWQpO1xuICAgIG5vdGlmaWNhdGlvbnMucHVzaChzZWxlY3RlZE5vdGlmaWNhdGlvbik7XG4gICAgY29uc3Qgbm90aWlmY2F0aW9ubW9kZWwgPSBKU09OLnBhcnNlKHNlbGVjdGVkTm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbkpzb24pO1xuICAgIGlmIChzZWxlY3RlZE5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb25UeXBlSWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09XG4gICAgICBOb3RpZmljYXRpb25UeXBlSWRzLk5ld1Byb2plY3RDcmVhdGVkTm90aWZpY2F0aW9uSWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpIHx8XG4gICAgICBzZWxlY3RlZE5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb25UeXBlSWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09XG4gICAgICBOb3RpZmljYXRpb25UeXBlSWRzLlByb2plY3RNZW1iZXJSb2xlQWRkZWROb3RpZmljYXRpb25JZC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtcInByb2plY3RzL3Byb2plY3RzdGF0dXMvXCIgKyBub3RpaWZjYXRpb25tb2RlbC5Qcm9qZWN0R3VpZCArIFwiL2FjdGl2ZS1nb2Fsc1wiXSk7XG4gICAgfSBlbHNlIGlmIChzZWxlY3RlZE5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb25UeXBlSWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09XG4gICAgICBOb3RpZmljYXRpb25UeXBlSWRzLkdvYWxBcHByb3ZlZEZyb21SZXBsYW4udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXCJwcm9qZWN0cy9nb2FsL1wiICsgbm90aWlmY2F0aW9ubW9kZWwuR29hbEd1aWRdKTtcbiAgICB9IGVsc2UgaWYgKHNlbGVjdGVkTm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvblR5cGVJZC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgPT1cbiAgICAgIE5vdGlmaWNhdGlvblR5cGVJZHMuTm90aWZpY2F0aW9uX1dvcmtJdGVtQXNzaWduZWRUb1VzZXIudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXCJwcm9qZWN0cy93b3JraXRlbS9cIiArIG5vdGlpZmNhdGlvbm1vZGVsLlVzZXJTdG9yeUd1aWRdKTtcbiAgICB9IGVsc2UgaWYgKHNlbGVjdGVkTm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvblR5cGVJZC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgPT1cbiAgICAgIE5vdGlmaWNhdGlvblR5cGVJZHMuVVNlclN0b3J5VXBkYXRlTm90aWZpY2F0aW9uSWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXCJwcm9qZWN0cy93b3JraXRlbS9cIiArIG5vdGlpZmNhdGlvbm1vZGVsLlVzZXJTdG9yeUlkXSk7XG4gICAgfSBlbHNlIGlmIChzZWxlY3RlZE5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb25UeXBlSWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09XG4gICAgICBOb3RpZmljYXRpb25UeXBlSWRzLlNwcmludFN0YXJ0ZWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXCJwcm9qZWN0cy9zcHJpbnQvXCIgKyBub3RpaWZjYXRpb25tb2RlbC5TcHJpbnRHdWlkXSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHNlbGVjdGVkTm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvblR5cGVJZC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgPT1cbiAgICAgIE5vdGlmaWNhdGlvblR5cGVJZHMuUHVzaE5vdGlmaWNhdGlvbkZvclVzZXJTdG9yeUNvbW1lbnQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXCJwcm9qZWN0cy93b3JraXRlbS9cIiArIG5vdGlpZmNhdGlvbm1vZGVsLlVzZXJTdG9yeUd1aWRdKTtcbiAgICB9IGVsc2UgaWYgKHNlbGVjdGVkTm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvblR5cGVJZC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgPT1cbiAgICAgIE5vdGlmaWNhdGlvblR5cGVJZHMuR29hbFJlcXVlc3RkRm9yUkVwbGFuLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSkge1xuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW1wicHJvamVjdHMvZ29hbC9cIiArIG5vdGlpZmNhdGlvbm1vZGVsLkdvYWxHdWlkXSk7XG4gICAgfSBlbHNlIGlmIChzZWxlY3RlZE5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb25UeXBlSWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09XG4gICAgICBOb3RpZmljYXRpb25UeXBlSWRzLlNwcmludFJlcXVlc3RkRm9yUkVwbGFuLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSkge1xuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW1wicHJvamVjdHMvc3ByaW50L1wiICsgbm90aWlmY2F0aW9ubW9kZWwuU3ByaW50R3VpZF0pO1xuICAgIH0gZWxzZSBpZiAoc2VsZWN0ZWROb3RpZmljYXRpb24ubm90aWZpY2F0aW9uVHlwZUlkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA9PVxuICAgICAgTm90aWZpY2F0aW9uVHlwZUlkcy5Ob3RpZmljYXRpb25fQWRob2NXb3JrSXRlbUFzc2lnbmVkVG9Vc2VyLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSkge1xuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW1wiZGFzaGJvYXJkL2FkaG9jLXdvcmtpdGVtL1wiICsgbm90aWlmY2F0aW9ubW9kZWwuVXNlclN0b3J5R3VpZF0pO1xuICAgIH0gZWxzZSBpZiAoc2VsZWN0ZWROb3RpZmljYXRpb24ubm90aWZpY2F0aW9uVHlwZUlkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA9PVxuICAgICAgTm90aWZpY2F0aW9uVHlwZUlkcy5BZGhvY1VTZXJTdG9yeVVwZGF0ZU5vdGlmaWNhdGlvbklkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSkge1xuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW1wiZGFzaGJvYXJkL2FkaG9jLXdvcmtpdGVtL1wiICsgbm90aWlmY2F0aW9ubW9kZWwuVXNlclN0b3J5SWRdKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoc2VsZWN0ZWROb3RpZmljYXRpb24ubm90aWZpY2F0aW9uVHlwZUlkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA9PVxuICAgICAgTm90aWZpY2F0aW9uVHlwZUlkcy5MZWF2ZUFwcGxpY2F0aW9uLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSAmJiBjYW5BY2Nlc3NfZmVhdHVyZV9BcHByb3ZlT3JSZWplY3RMZWF2ZSkge1xuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW1wiaHJtYW5hZ21lbnQvbGVhdmVzXCJdKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoc2VsZWN0ZWROb3RpZmljYXRpb24ubm90aWZpY2F0aW9uVHlwZUlkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA9PVxuICAgICAgTm90aWZpY2F0aW9uVHlwZUlkcy5BcHByb3ZlTGVhdmVBcHBsaWNhdGlvbi50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtcImRhc2hib2FyZC9wcm9maWxlL1wiICsgQ3VycmVudFVzZXJJZCArIFwiL2xlYXZlcy1wZXJtaXNzaW9uc1wiXSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHNlbGVjdGVkTm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvblR5cGVJZC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgPT1cbiAgICAgIE5vdGlmaWNhdGlvblR5cGVJZHMuUmVqZWN0TGVhdmVBcHBsaWNhdGlvbi50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtcImRhc2hib2FyZC9wcm9maWxlL1wiICsgQ3VycmVudFVzZXJJZCArIFwiL2xlYXZlcy1wZXJtaXNzaW9uc1wiXSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHNlbGVjdGVkTm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvblR5cGVJZC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgPT1cbiAgICAgIE5vdGlmaWNhdGlvblR5cGVJZHMuQXV0b1RpbWVTaGVldFN1Ym1pc3Npb25Ob3RpZmljYXRpb24udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXCJkYXNoYm9hcmQvcHJvZmlsZS9cIiArIEN1cnJlbnRVc2VySWQgKyBcIi90aW1lc2hlZXRBcHByb3ZhbFwiXSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHNlbGVjdGVkTm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvblR5cGVJZC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgPT1cbiAgICAgIE5vdGlmaWNhdGlvblR5cGVJZHMuUHJvYmF0aW9uQXNzaWduTm90aWZpY2F0aW9uLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSkge1xuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW1wiZGFzaGJvYXJkL3Byb2ZpbGUvXCIgKyBub3RpaWZjYXRpb25tb2RlbC5Vc2VySWQgKyBcIi9wcm9iYXRpb25cIl0pO1xuICAgIH1cbiAgICBlbHNlIGlmIChzZWxlY3RlZE5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb25UeXBlSWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09XG4gICAgICBOb3RpZmljYXRpb25UeXBlSWRzLlJldmlld0Fzc2lnblRvRW1wbG95ZWVOb3RpZmljYXRpb24udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXCJkYXNoYm9hcmQvcHJvZmlsZS9cIiArIEN1cnJlbnRVc2VySWQgKyBcIi9wcm9iYXRpb25cIl0pO1xuICAgIH1cbiAgICBlbHNlIGlmIChzZWxlY3RlZE5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb25UeXBlSWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09XG4gICAgICBOb3RpZmljYXRpb25UeXBlSWRzLlJldmlld1N1Ym1pdHRlZEJ5RW1wbG95ZWVOb3RpZmljYXRpb24udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXCJkYXNoYm9hcmQvcHJvZmlsZS9cIiArIG5vdGlpZmNhdGlvbm1vZGVsLlVzZXJJZCArIFwiL3Byb2JhdGlvblwiXSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHNlbGVjdGVkTm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvblR5cGVJZC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgPT1cbiAgICAgIE5vdGlmaWNhdGlvblR5cGVJZHMuUmV2aWV3SW52aXRhdGlvbk5vdGlmaWNhdGlvbi50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtcImRhc2hib2FyZC9wcm9maWxlL1wiICsgbm90aWlmY2F0aW9ubW9kZWwuVXNlcklkICsgXCIvcHJvYmF0aW9uXCJdKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoc2VsZWN0ZWROb3RpZmljYXRpb24ubm90aWZpY2F0aW9uVHlwZUlkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA9PVxuICAgICAgTm90aWZpY2F0aW9uVHlwZUlkcy5QZXJmb3JtYW5jZVJldmlld1N1Ym1pdHRlZEJ5RW1wbG95ZWVOb3RpZmljYXRpb24udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXCJkYXNoYm9hcmQvcHJvZmlsZS9cIiArIG5vdGlpZmNhdGlvbm1vZGVsLlVzZXJJZCArIFwiL3BlcmZvcm1hbmNlXCJdKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoc2VsZWN0ZWROb3RpZmljYXRpb24ubm90aWZpY2F0aW9uVHlwZUlkLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSA9PVxuICAgICAgTm90aWZpY2F0aW9uVHlwZUlkcy5QZXJmb3JtYW5jZVJldmlld0ludml0YXRpb25Ob3RpZmljYXRpb25Nb2RlbC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtcImRhc2hib2FyZC9wcm9maWxlL1wiICsgbm90aWlmY2F0aW9ubW9kZWwuVXNlcklkICsgXCIvcGVyZm9ybWFuY2VcIl0pO1xuICAgIH1cbiAgICBlbHNlIGlmIChzZWxlY3RlZE5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb25UeXBlSWQudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpID09XG4gICAgICBOb3RpZmljYXRpb25UeXBlSWRzLlBlcmZvcm1hbmNlUmV2aWV3QXNzaWduVG9FbXBsb3llZU5vdGlmaWNhdGlvbi50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtcImRhc2hib2FyZC9wcm9maWxlL1wiICsgQ3VycmVudFVzZXJJZCArIFwiL3BlcmZvcm1hbmNlXCJdKTtcbiAgICB9XG4gICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgVXBzZXJ0VW5yZWFkTm90aWZpY2F0aW9uc1RyaWdnZXJlZChub3RpZmljYXRpb25zKSk7XG4gIH1cblxuICB1cHNlcnRSZWFkTmV3Tm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbikge1xuICAgIGxldCBub3RlczogTm90aWZpY2F0aW9uTW9kZWxbXSA9IFtub3RpZmljYXRpb25dO1xuICAgIHRoaXMuc2lnbmFsci51cHNlcnRSZWFkTmV3Tm90aWZpY2F0aW9ucyhub3RlcylcbiAgICAgIC5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XG4gICAgICAgIGlmIChyZXMuc3VjY2Vzcykge1xuICAgICAgICAgIHRoaXMuc2lnbmFsci5yZW1vdmVJdGVtRnJvbU5vdGlmaWNhdGlvbnMobm90aWZpY2F0aW9uLmlkKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgaWYgKG5vdGlmaWNhdGlvbi5uYXZpZ2F0aW9uVXJsKSB7XG4gICAgICB3aW5kb3cub3Blbihub3RpZmljYXRpb24ubmF2aWdhdGlvblVybCwgXCJfYmxhbmtcIik7XG4gICAgfVxuXG4gIH1cblxuICBjbGVhck5ld0FsbChlKSB7XG4gICAgdGhpcy5zaWduYWxyLnVwc2VydFJlYWROZXdOb3RpZmljYXRpb25zKHRoaXMubmV3Tm90aWZpY2F0aW9ucylcbiAgICAgIC5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XG4gICAgICAgIGlmIChyZXMuc3VjY2Vzcykge1xuICAgICAgICAgIHRoaXMuc2lnbmFsci5yZW1vdmVBbGxOb3RpZmljYXRpb25zKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMubmdEZXN0cm95ZWQkLm5leHQoKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cInRleHQtY2VudGVyIG1hdC1iZy1wcmltYXJ5IHB0LTEgcGItMVwiPlxuICA8IS0tIDxtYXQtcHJvZ3Jlc3MtYmFyICpuZ0lmPVwiKGxvYWRpbmdOb3RpZmljYXRpb25zJCB8IGFzeW5jKVwiPjwvbWF0LXByb2dyZXNzLWJhcj4gLS0+XG4gIDxoNiBjbGFzcz1cIm0tMFwiPnt7ICdOT1RJRklDQVRJT05TLk5PVElGSUNBVElPTlNUSVRMRScgfCB0cmFuc2xhdGUgfX0gKHt7bmV3Tm90aWZpY2F0aW9ucz8ubGVuZ3RofX0pPC9oNj5cbjwvZGl2PlxuPGRpdiBpZD1cInN0eWxlLTFcIiAqbmdJZj1cIm5ld05vdGlmaWNhdGlvbnMubGVuZ3RoICE9IDBcIj5cbiAgPG1hdC1uYXYtbGlzdCBjbGFzcz1cIm5vdGlmaWNhdGlvbi1saXN0IHAtMCBwci0wM1wiIHJvbGU9XCJsaXN0XCJcbiAgICAqbmdGb3I9XCJsZXQgbm90aWZpY2F0aW9uIG9mIChuZXdOb3RpZmljYXRpb25zIHwgb3JkZXJCeSlcIiA+XG4gICAgPG1hdC1saXN0LWl0ZW0gY2xhc3M9XCJub3RpZmljLWl0ZW0gIHByLTAzIG5vdGlmaWNhdGlvbi1tYXJnaW5cIiByb2xlPVwibGlzdGl0ZW1cIlxuICAgICAgW25nQ2xhc3NdPVwieydub3RpZmljYXRhaW9uLXVucmVhZCc6ICFub3RpZmljYXRpb25Db2xvciAsJ25vdGlmaWNhdGFpb24tcmVhZCc6IG5vdGlmaWNhdGlvbkNvbG9yIH1cIlxuICAgICAgcm91dGVyTGlua0FjdGl2ZT1cIm9wZW5cIiAoY2xpY2spPVwidXBzZXJ0UmVhZE5ld05vdGlmaWNhdGlvbihub3RpZmljYXRpb24pXCI+XG4gICAgICA8ZGl2PlxuICAgICAgICA8YT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWF0LWxpc3QtdGV4dCBwbC0wIHByLTAzIG5vdGlmaWNhdGlvbi1jdXJzb3Igbm90aWZpY2F0aW9ucy1saXN0LWl0ZW1cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3b3JkLWJyZWFrIGRpc3BsYXktcHJlLWxpbmVcIiBzdHlsZT1cIm1hcmdpbjogMHB4ICFpbXBvcnRhbnQ7XCJcbiAgICAgICAgICAgICAgW2lubmVySFRNTF09XCJub3RpZmljYXRpb24uc3VtbWFyeSB8IHNhbml0aXplSHRtbFwiPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0aW1lIHRleHQtbXV0ZWRcIj57eyBub3RpZmljYXRpb24uY3JlYXRlZERhdGVUaW1lIHwgdXRjVG9Mb2NhbFRpbWUgfCB0aW1lYWdvIH19PC9zbWFsbD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9hPlxuICAgICAgPC9kaXY+XG4gICAgPC9tYXQtbGlzdC1pdGVtPlxuICA8L21hdC1uYXYtbGlzdD5cbjwvZGl2PlxuPGRpdiBjbGFzcz1cInRleHQtY2VudGVyIHAtMVwiICpuZ0lmPVwibmV3Tm90aWZpY2F0aW9ucy5sZW5ndGggPT0gMFwiPlxuICB7eyAnTk9USUZJQ0FUSU9OUy5OT05PVElGSUNBVElPTlNUSVRMRScgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbjxtYXQtZGl2aWRlcj48L21hdC1kaXZpZGVyPlxuPGRpdiBjbGFzcz1cInRleHQtY2VudGVyIG10LTA1IG1iLTA1XCIgKm5nSWY9XCJuZXdOb3RpZmljYXRpb25zLmxlbmd0aFwiPlxuICA8bGFiZWwgY2xhc3M9XCJtYi0wXCI+PGEgKGNsaWNrKT1cImNsZWFyTmV3QWxsKCRldmVudClcIj57eyAnTk9USUZJQ0FUSU9OUy5DTEVBUkFMTE5PVElGSUNBVElPTlMnIHwgdHJhbnNsYXRlXG4gICAgICB9fTwvYT48L2xhYmVsPlxuPC9kaXY+Il19
|