@thetradeengineorg1/snova-shell-module 0.0.260 → 0.0.261

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