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