@softheon/armature 15.21.2 → 17.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (428) hide show
  1. package/README.md +142 -18
  2. package/assets/styles/_utility.scss +35 -0
  3. package/assets/styles/material-overrides.scss +0 -1
  4. package/assets/styles/sof-styles.scss +8 -7
  5. package/{esm2020 → esm2022}/lib/alert-banner/alert-banner-api.mjs +9 -9
  6. package/{esm2020 → esm2022}/lib/alert-banner/alert-banner.module.mjs +41 -41
  7. package/{esm2020 → esm2022}/lib/alert-banner/components/alert-banner/alert-banner.component.mjs +83 -83
  8. package/{esm2020 → esm2022}/lib/alert-banner/models/alert-banner-config.mjs +1 -1
  9. package/{esm2020 → esm2022}/lib/alert-banner/models/alert-banner-context.mjs +1 -1
  10. package/{esm2020 → esm2022}/lib/alert-banner/models/constants.mjs +15 -15
  11. package/{esm2020 → esm2022}/lib/alert-banner/services/alert-banner.service.mjs +44 -44
  12. package/esm2022/lib/armature.module.mjs +176 -0
  13. package/{esm2020 → esm2022}/lib/base-components/base-component-api.mjs +14 -14
  14. package/{esm2020 → esm2022}/lib/base-components/base-component.module.mjs +123 -123
  15. package/{esm2020 → esm2022}/lib/base-components/sof-alert/sof-alert.component.mjs +79 -79
  16. package/{esm2020 → esm2022}/lib/base-components/sof-badge/sof-badge.component.mjs +49 -49
  17. package/esm2022/lib/base-components/sof-banner/sof-banner.component.mjs +49 -0
  18. package/{esm2020 → esm2022}/lib/base-components/sof-button-toggle-group/sof-button-toggle-group.component.mjs +188 -188
  19. package/{esm2020 → esm2022}/lib/base-components/sof-confirm-address/sof-confirm-address.component.mjs +59 -59
  20. package/esm2022/lib/base-components/sof-image-checkbox/sof-image-checkbox.component.mjs +58 -0
  21. package/esm2022/lib/base-components/sof-modal/sof-modal.component.mjs +57 -0
  22. package/esm2022/lib/base-components/sof-progress-bar/sof-progress-bar.component.mjs +79 -0
  23. package/{esm2020 → esm2022}/lib/base-components/sof-radio-card/sof-radio-card.component.mjs +35 -35
  24. package/{esm2020 → esm2022}/lib/base-components/sof-simple-alert/sof-simple-alert.component.mjs +49 -49
  25. package/esm2022/lib/base-components/sof-star-rating/sof-star-rating.component.mjs +40 -0
  26. package/{esm2020 → esm2022}/lib/component-save-print/components/component-save-print/component-save-print.component.mjs +91 -91
  27. package/{esm2020 → esm2022}/lib/component-save-print/services/component-save-print.service.mjs +30 -30
  28. package/esm2022/lib/component-save-print/sof-ar-component-save-print.module.mjs +29 -0
  29. package/{esm2020 → esm2022}/lib/core/client-generated/api/session.service.mjs +242 -242
  30. package/{esm2020 → esm2022}/lib/core/client-generated/configuration.mjs +58 -58
  31. package/{esm2020 → esm2022}/lib/core/client-generated/encoder.mjs +16 -16
  32. package/{esm2020 → esm2022}/lib/core/client-generated/model/applicationUserModel.mjs +19 -19
  33. package/{esm2020 → esm2022}/lib/core/client-generated/model/assertedUserModel.mjs +1 -1
  34. package/{esm2020 → esm2022}/lib/core/client-generated/model/brandingModel.mjs +1 -1
  35. package/{esm2020 → esm2022}/lib/core/client-generated/model/errorModel.mjs +12 -12
  36. package/{esm2020 → esm2022}/lib/core/client-generated/model/folderLink.mjs +12 -12
  37. package/{esm2020 → esm2022}/lib/core/client-generated/model/identityProfile.mjs +1 -1
  38. package/{esm2020 → esm2022}/lib/core/client-generated/model/models.mjs +19 -19
  39. package/{esm2020 → esm2022}/lib/core/client-generated/model/oAuthModel.mjs +12 -12
  40. package/{esm2020 → esm2022}/lib/core/client-generated/model/preferencesRow.mjs +12 -12
  41. package/{esm2020 → esm2022}/lib/core/client-generated/model/rolesRow.mjs +12 -12
  42. package/{esm2020 → esm2022}/lib/core/client-generated/model/sessionGetResponseModel.mjs +1 -1
  43. package/{esm2020 → esm2022}/lib/core/client-generated/model/sessionPostRequestModel.mjs +1 -1
  44. package/{esm2020 → esm2022}/lib/core/client-generated/model/sessionPostResponseModel.mjs +1 -1
  45. package/{esm2020 → esm2022}/lib/core/client-generated/model/sessionPutRequestModel.mjs +1 -1
  46. package/{esm2020 → esm2022}/lib/core/client-generated/model/sessionPutResponseModel.mjs +1 -1
  47. package/{esm2020 → esm2022}/lib/core/client-generated/model/sessionResponseModel.mjs +1 -1
  48. package/{esm2020 → esm2022}/lib/core/client-generated/model/settingsProfile.mjs +1 -1
  49. package/{esm2020 → esm2022}/lib/core/client-generated/model/themePaletteColorsModel.mjs +12 -12
  50. package/{esm2020 → esm2022}/lib/core/client-generated/model/themePaletteModel.mjs +1 -1
  51. package/{esm2020 → esm2022}/lib/core/client-generated/model/trackingModel.mjs +12 -12
  52. package/{esm2020 → esm2022}/lib/core/client-generated/model/validationRecordsRow.mjs +12 -12
  53. package/{esm2020 → esm2022}/lib/core/client-generated/variables.mjs +8 -8
  54. package/{esm2020 → esm2022}/lib/core/components/app-template/app-template.component.mjs +250 -250
  55. package/{esm2020 → esm2022}/lib/core/functions/guid.mjs +10 -10
  56. package/{esm2020 → esm2022}/lib/core/functions/naming-convention.mjs +32 -32
  57. package/{esm2020 → esm2022}/lib/core/functions/route-to-pre-login-route.mjs +12 -12
  58. package/{esm2020 → esm2022}/lib/core/initializer/abstract-startup-service.mjs +3 -3
  59. package/{esm2020 → esm2022}/lib/core/initializer/initializer.service.mjs +286 -286
  60. package/{esm2020 → esm2022}/lib/core/interceptors/armature-auth-token-append.interceptor.mjs +73 -73
  61. package/{esm2020 → esm2022}/lib/core/models/base-config.mjs +1 -1
  62. package/{esm2020 → esm2022}/lib/core/models/constants.mjs +12 -12
  63. package/{esm2020 → esm2022}/lib/core/models/data-store-config.mjs +3 -3
  64. package/{esm2020 → esm2022}/lib/core/models/header-config.mjs +1 -1
  65. package/{esm2020 → esm2022}/lib/core/models/http-verbs.mjs +8 -8
  66. package/{esm2020 → esm2022}/lib/core/models/navigation-config.mjs +1 -1
  67. package/{esm2020 → esm2022}/lib/core/models/oidc-auth-settings.mjs +1 -1
  68. package/{esm2020 → esm2022}/lib/core/models/route-path.mjs +6 -6
  69. package/{esm2020 → esm2022}/lib/core/models/session-config.mjs +3 -3
  70. package/{esm2020 → esm2022}/lib/core/models/styles.mjs +1 -1
  71. package/{esm2020 → esm2022}/lib/core/models/subdomain-config.mjs +1 -1
  72. package/{esm2020 → esm2022}/lib/core/models/typed-session.mjs +3 -3
  73. package/{esm2020 → esm2022}/lib/core/models/user-entity-service-config.mjs +11 -11
  74. package/{esm2020 → esm2022}/lib/core/services/authorization.service.mjs +175 -175
  75. package/{esm2020 → esm2022}/lib/core/services/banner.service.mjs +43 -43
  76. package/{esm2020 → esm2022}/lib/core/services/base-config.service.mjs +32 -32
  77. package/{esm2020 → esm2022}/lib/core/services/custom-auth-config.service.mjs +3 -3
  78. package/{esm2020 → esm2022}/lib/core/services/default-config.service.mjs +19 -19
  79. package/{esm2020 → esm2022}/lib/core/services/session.service.mjs +385 -385
  80. package/{esm2020 → esm2022}/lib/core/services/user-entity.service.mjs +140 -140
  81. package/{esm2020 → esm2022}/lib/distributed-cache/client-generated/api/api.mjs +3 -3
  82. package/{esm2020 → esm2022}/lib/distributed-cache/client-generated/api/cache.service.mjs +213 -213
  83. package/{esm2020 → esm2022}/lib/distributed-cache/client-generated/configuration.mjs +58 -58
  84. package/{esm2020 → esm2022}/lib/distributed-cache/client-generated/encoder.mjs +16 -16
  85. package/{esm2020 → esm2022}/lib/distributed-cache/client-generated/model/cacheExpirationType.mjs +15 -15
  86. package/{esm2020 → esm2022}/lib/distributed-cache/client-generated/model/createCacheEntryRequestModel.mjs +1 -1
  87. package/{esm2020 → esm2022}/lib/distributed-cache/client-generated/model/models.mjs +4 -4
  88. package/{esm2020 → esm2022}/lib/distributed-cache/client-generated/model/retrieveCacheEntryResponseModel.mjs +12 -12
  89. package/{esm2020 → esm2022}/lib/distributed-cache/client-generated/model/updateCacheEntryRequestModel.mjs +12 -12
  90. package/{esm2020 → esm2022}/lib/distributed-cache/client-generated/variables.mjs +8 -8
  91. package/{esm2020 → esm2022}/lib/distributed-cache/distributed-cache-api.mjs +7 -7
  92. package/esm2022/lib/distributed-cache/distributed-cache.module.mjs +38 -0
  93. package/{esm2020 → esm2022}/lib/distributed-cache/models/constants.mjs +2 -2
  94. package/{esm2020 → esm2022}/lib/distributed-cache/models/policy-person.mjs +8 -8
  95. package/{esm2020 → esm2022}/lib/distributed-cache/services/server-cache.service.mjs +48 -48
  96. package/{esm2020 → esm2022}/lib/error/components/error-common/error-common.component.mjs +25 -25
  97. package/{esm2020 → esm2022}/lib/error/error-api.mjs +6 -6
  98. package/{esm2020 → esm2022}/lib/error/error.module.mjs +31 -31
  99. package/{esm2020 → esm2022}/lib/error/models/error-common-config.mjs +7 -7
  100. package/esm2022/lib/faq/components/faq/faq.component.mjs +40 -0
  101. package/{esm2020 → esm2022}/lib/faq/faq-api.mjs +7 -7
  102. package/{esm2020 → esm2022}/lib/faq/faq.module.mjs +41 -41
  103. package/{esm2020 → esm2022}/lib/faq/models/faq-config.mjs +3 -3
  104. package/{esm2020 → esm2022}/lib/faq/models/faq.mjs +7 -7
  105. package/esm2022/lib/feedback-tool/components/feedback-tool/feedback-tool.component.mjs +81 -0
  106. package/esm2022/lib/feedback-tool/feedback-tool-api.mjs +5 -0
  107. package/esm2022/lib/feedback-tool/feedback-tool.module.mjs +44 -0
  108. package/esm2022/lib/footer/components/footer/footer.component.mjs +25 -0
  109. package/{esm2020 → esm2022}/lib/footer/components/site-map/site-map.component.mjs +25 -25
  110. package/{esm2020 → esm2022}/lib/footer/footer-api.mjs +9 -9
  111. package/{esm2020 → esm2022}/lib/footer/footer.module.mjs +45 -45
  112. package/{esm2020 → esm2022}/lib/footer/models/enum/site-map-direction.mjs +14 -14
  113. package/{esm2020 → esm2022}/lib/footer/models/footer-config.mjs +3 -3
  114. package/{esm2020 → esm2022}/lib/footer/models/site-map-models.mjs +1 -1
  115. package/{esm2020 → esm2022}/lib/forms/components/sof-address/sof-address.component.mjs +110 -110
  116. package/{esm2020 → esm2022}/lib/forms/directives/alphanumeric/alphanumeric.directive.mjs +78 -78
  117. package/{esm2020 → esm2022}/lib/forms/directives/input-trim/input-trim.directive.mjs +110 -110
  118. package/{esm2020 → esm2022}/lib/forms/directives/letters-characters/letters-characters.directive.mjs +87 -87
  119. package/{esm2020 → esm2022}/lib/forms/directives/letters-only/letters-only.directive.mjs +85 -85
  120. package/{esm2020 → esm2022}/lib/forms/directives/numbers-only/numbers-only.directive.mjs +55 -55
  121. package/{esm2020 → esm2022}/lib/forms/forms-api.mjs +19 -19
  122. package/{esm2020 → esm2022}/lib/forms/forms.module.mjs +87 -87
  123. package/{esm2020 → esm2022}/lib/forms/models/address.mjs +1 -1
  124. package/esm2022/lib/forms/models/constants.mjs +10 -0
  125. package/{esm2020 → esm2022}/lib/forms/models/county.mjs +1 -1
  126. package/{esm2020 → esm2022}/lib/forms/models/enums/states.mjs +65 -65
  127. package/{esm2020 → esm2022}/lib/forms/pipes/phone-format.pipe.mjs +33 -33
  128. package/{esm2020 → esm2022}/lib/forms/services/alert.service.mjs +167 -167
  129. package/esm2022/lib/header/components/header/header.component.mjs +161 -0
  130. package/{esm2020 → esm2022}/lib/header/components/mobile-header-menu/mobile-header-menu.component.mjs +39 -39
  131. package/{esm2020 → esm2022}/lib/header/header-api.mjs +11 -11
  132. package/{esm2020 → esm2022}/lib/header/header.module.mjs +85 -85
  133. package/{esm2020 → esm2022}/lib/header/models/header-auth.settings.mjs +31 -31
  134. package/{esm2020 → esm2022}/lib/header/models/header-language.settings.mjs +1 -1
  135. package/{esm2020 → esm2022}/lib/header/models/header-theme.settings.mjs +1 -1
  136. package/{esm2020 → esm2022}/lib/header/models/header.settings.mjs +1 -1
  137. package/{esm2020 → esm2022}/lib/header/models/mobile-header-nav.settings.mjs +1 -1
  138. package/esm2022/lib/navigation/components/navigation/navigation.component.mjs +556 -0
  139. package/{esm2020 → esm2022}/lib/navigation/models/nav-theme.settings.mjs +1 -1
  140. package/{esm2020 → esm2022}/lib/navigation/models/nav.settings.mjs +1 -1
  141. package/{esm2020 → esm2022}/lib/navigation/models/navigation.mjs +1 -1
  142. package/{esm2020 → esm2022}/lib/navigation/navigation-api.mjs +8 -8
  143. package/{esm2020 → esm2022}/lib/navigation/navigation.module.mjs +126 -126
  144. package/{esm2020 → esm2022}/lib/oauth/models/constants.mjs +5 -5
  145. package/{esm2020 → esm2022}/lib/oauth/models/generated/accountManagementAssertionModel.mjs +1 -1
  146. package/{esm2020 → esm2022}/lib/oauth/models/generated/accountManagementRefreshRequestModel.mjs +1 -1
  147. package/{esm2020 → esm2022}/lib/oauth/models/generated/accountManagementResponseModel.mjs +1 -1
  148. package/{esm2020 → esm2022}/lib/oauth/models/generated/coverageDetail.mjs +18 -18
  149. package/{esm2020 → esm2022}/lib/oauth/models/generated/finance.mjs +12 -12
  150. package/{esm2020 → esm2022}/lib/oauth/models/generated/iSsoResponseModel.mjs +12 -12
  151. package/{esm2020 → esm2022}/lib/oauth/models/generated/iSsoResponseModelAccountManagementAssertionModel.mjs +1 -1
  152. package/{esm2020 → esm2022}/lib/oauth/models/generated/person.mjs +12 -12
  153. package/{esm2020 → esm2022}/lib/oauth/models/generated/policy.mjs +1 -1
  154. package/{esm2020 → esm2022}/lib/oauth/models/generated/refreshResponseModel.mjs +12 -12
  155. package/{esm2020 → esm2022}/lib/oauth/models/hybrid-saml-oauth-config.mjs +3 -3
  156. package/{esm2020 → esm2022}/lib/oauth/oauth-api.mjs +14 -14
  157. package/{esm2020 → esm2022}/lib/oauth/oauth.module.mjs +29 -29
  158. package/{esm2020 → esm2022}/lib/oauth/services/hybrid-saml-oauth.service.mjs +201 -201
  159. package/{esm2020 → esm2022}/lib/rbac/directives/rbac-action.directive.mjs +50 -50
  160. package/{esm2020 → esm2022}/lib/rbac/models/access-token-claims.mjs +22 -22
  161. package/{esm2020 → esm2022}/lib/rbac/models/constants.mjs +3 -3
  162. package/{esm2020 → esm2022}/lib/rbac/models/decoded-access-token.mjs +68 -68
  163. package/{esm2020 → esm2022}/lib/rbac/models/rbac-config.mjs +3 -3
  164. package/{esm2020 → esm2022}/lib/rbac/models/role-access.mjs +9 -9
  165. package/{esm2020 → esm2022}/lib/rbac/rbac-api.mjs +14 -14
  166. package/{esm2020 → esm2022}/lib/rbac/rbac.module.mjs +51 -51
  167. package/{esm2020 → esm2022}/lib/rbac/services/ar-role-nav.service.mjs +104 -104
  168. package/{esm2020 → esm2022}/lib/rbac/services/oauth2-role.service.mjs +114 -114
  169. package/{esm2020 → esm2022}/lib/rbac/services/role-nav.service.mjs +3 -3
  170. package/{esm2020 → esm2022}/lib/rbac/services/tokens.mjs +3 -3
  171. package/{esm2020 → esm2022}/lib/resize-panels/components/resize-panels/resize-panels.component.mjs +156 -156
  172. package/{esm2020 → esm2022}/lib/resize-panels/models/resize-event.mjs +1 -1
  173. package/{esm2020 → esm2022}/lib/resize-panels/resize-panels-api.mjs +4 -4
  174. package/{esm2020 → esm2022}/lib/resize-panels/resize-panels.module.mjs +23 -23
  175. package/{esm2020 → esm2022}/lib/rum/models/arm-error.mjs +28 -28
  176. package/{esm2020 → esm2022}/lib/rum/models/rum-config.mjs +3 -3
  177. package/{esm2020 → esm2022}/lib/rum/rum-api.mjs +9 -9
  178. package/{esm2020 → esm2022}/lib/rum/rum.module.mjs +48 -48
  179. package/{esm2020 → esm2022}/lib/rum/services/rum.service.mjs +115 -115
  180. package/{esm2020 → esm2022}/lib/rum/services/shared-error.service.mjs +45 -45
  181. package/{esm2020 → esm2022}/lib/rum/services/softheon-error-handler.service.mjs +76 -76
  182. package/{esm2020 → esm2022}/lib/saml/components/redirect-saml/redirect-saml.component.mjs +79 -79
  183. package/{esm2020 → esm2022}/lib/saml/models/i-saml-request.mjs +1 -1
  184. package/{esm2020 → esm2022}/lib/saml/models/i-saml-response.mjs +1 -1
  185. package/{esm2020 → esm2022}/lib/saml/models/redirect-saml-request.mjs +3 -3
  186. package/{esm2020 → esm2022}/lib/saml/models/sso-gateway-model.mjs +3 -3
  187. package/{esm2020 → esm2022}/lib/saml/saml-api.mjs +14 -14
  188. package/{esm2020 → esm2022}/lib/saml/saml.module.mjs +43 -43
  189. package/{esm2020 → esm2022}/lib/saml/services/entry/abstract-saml-entry.service.mjs +3 -3
  190. package/{esm2020 → esm2022}/lib/saml/services/entry/sso-gateway-entry.service.mjs +36 -36
  191. package/{esm2020 → esm2022}/lib/saml/services/send-off/abstract-saml.service.mjs +3 -3
  192. package/{esm2020 → esm2022}/lib/saml/services/send-off/saml.service.mjs +39 -39
  193. package/{esm2020 → esm2022}/lib/sof-pipe/constants/constants.mjs +16 -16
  194. package/{esm2020 → esm2022}/lib/sof-pipe/models/sof-date-pipe-format.mjs +1 -1
  195. package/{esm2020 → esm2022}/lib/sof-pipe/pipes/sof-blank/sof-blank.pipe.mjs +39 -39
  196. package/{esm2020 → esm2022}/lib/sof-pipe/pipes/sof-date/sof-date.pipe.mjs +59 -59
  197. package/{esm2020 → esm2022}/lib/sof-pipe/pipes/sof-ssn/sof-ssn.pipe.mjs +28 -28
  198. package/{esm2020 → esm2022}/lib/sof-pipe/sof-pipe.api.mjs +8 -8
  199. package/{esm2020 → esm2022}/lib/sof-pipe/sof-pipe.module.mjs +39 -39
  200. package/{esm2020 → esm2022}/lib/theming/directives/css-override.directive.mjs +69 -69
  201. package/{esm2020 → esm2022}/lib/theming/models/css-override.mjs +10 -10
  202. package/{esm2020 → esm2022}/lib/theming/services/theme.service.mjs +169 -169
  203. package/{esm2020 → esm2022}/lib/theming/theme-api.mjs +5 -5
  204. package/{esm2020 → esm2022}/lib/theming/theme.module.mjs +31 -31
  205. package/{esm2020 → esm2022}/public-api.mjs +52 -51
  206. package/{esm2020 → esm2022}/softheon-armature.mjs +4 -4
  207. package/fesm2022/softheon-armature.mjs +7439 -0
  208. package/fesm2022/softheon-armature.mjs.map +1 -0
  209. package/index.d.ts +5 -5
  210. package/lib/alert-banner/alert-banner-api.d.ts +7 -7
  211. package/lib/alert-banner/alert-banner.module.d.ts +11 -11
  212. package/lib/alert-banner/components/alert-banner/alert-banner.component.d.ts +40 -40
  213. package/lib/alert-banner/models/alert-banner-config.d.ts +20 -20
  214. package/lib/alert-banner/models/alert-banner-context.d.ts +18 -18
  215. package/lib/alert-banner/models/constants.d.ts +15 -15
  216. package/lib/alert-banner/services/alert-banner.service.d.ts +28 -28
  217. package/lib/armature.module.d.ts +46 -46
  218. package/lib/base-components/base-component-api.d.ts +13 -13
  219. package/lib/base-components/base-component.module.d.ts +35 -35
  220. package/lib/base-components/sof-alert/sof-alert.component.d.ts +40 -40
  221. package/lib/base-components/sof-badge/sof-badge.component.d.ts +26 -26
  222. package/lib/base-components/sof-banner/sof-banner.component.d.ts +34 -34
  223. package/lib/base-components/sof-button-toggle-group/sof-button-toggle-group.component.d.ts +100 -100
  224. package/lib/base-components/sof-confirm-address/sof-confirm-address.component.d.ts +61 -61
  225. package/lib/base-components/sof-image-checkbox/sof-image-checkbox.component.d.ts +28 -28
  226. package/lib/base-components/sof-modal/sof-modal.component.d.ts +51 -51
  227. package/lib/base-components/sof-progress-bar/sof-progress-bar.component.d.ts +40 -40
  228. package/lib/base-components/sof-radio-card/sof-radio-card.component.d.ts +20 -20
  229. package/lib/base-components/sof-simple-alert/sof-simple-alert.component.d.ts +29 -29
  230. package/lib/base-components/sof-star-rating/sof-star-rating.component.d.ts +25 -25
  231. package/lib/component-save-print/components/component-save-print/component-save-print.component.d.ts +46 -46
  232. package/lib/component-save-print/services/component-save-print.service.d.ts +18 -18
  233. package/lib/component-save-print/sof-ar-component-save-print.module.d.ts +9 -9
  234. package/lib/core/client-generated/api/session.service.d.ts +94 -94
  235. package/lib/core/client-generated/configuration.d.ts +48 -48
  236. package/lib/core/client-generated/encoder.d.ts +10 -10
  237. package/lib/core/client-generated/model/applicationUserModel.d.ts +54 -54
  238. package/lib/core/client-generated/model/assertedUserModel.d.ts +25 -25
  239. package/lib/core/client-generated/model/brandingModel.d.ts +33 -33
  240. package/lib/core/client-generated/model/errorModel.d.ts +24 -24
  241. package/lib/core/client-generated/model/folderLink.d.ts +34 -34
  242. package/lib/core/client-generated/model/identityProfile.d.ts +82 -82
  243. package/lib/core/client-generated/model/models.d.ts +19 -19
  244. package/lib/core/client-generated/model/oAuthModel.d.ts +28 -28
  245. package/lib/core/client-generated/model/preferencesRow.d.ts +15 -15
  246. package/lib/core/client-generated/model/rolesRow.d.ts +17 -17
  247. package/lib/core/client-generated/model/sessionGetResponseModel.d.ts +23 -23
  248. package/lib/core/client-generated/model/sessionPostRequestModel.d.ts +39 -39
  249. package/lib/core/client-generated/model/sessionPostResponseModel.d.ts +23 -23
  250. package/lib/core/client-generated/model/sessionPutRequestModel.d.ts +39 -39
  251. package/lib/core/client-generated/model/sessionPutResponseModel.d.ts +23 -23
  252. package/lib/core/client-generated/model/sessionResponseModel.d.ts +43 -43
  253. package/lib/core/client-generated/model/settingsProfile.d.ts +21 -21
  254. package/lib/core/client-generated/model/themePaletteColorsModel.d.ts +72 -72
  255. package/lib/core/client-generated/model/themePaletteModel.d.ts +65 -65
  256. package/lib/core/client-generated/model/trackingModel.d.ts +24 -24
  257. package/lib/core/client-generated/model/validationRecordsRow.d.ts +17 -17
  258. package/lib/core/client-generated/variables.d.ts +8 -8
  259. package/lib/core/components/app-template/app-template.component.d.ts +61 -61
  260. package/lib/core/functions/guid.d.ts +4 -4
  261. package/lib/core/functions/naming-convention.d.ts +6 -6
  262. package/lib/core/functions/route-to-pre-login-route.d.ts +6 -6
  263. package/lib/core/initializer/abstract-startup-service.d.ts +5 -5
  264. package/lib/core/initializer/initializer.service.d.ts +79 -79
  265. package/lib/core/interceptors/armature-auth-token-append.interceptor.d.ts +31 -31
  266. package/lib/core/models/base-config.d.ts +18 -18
  267. package/lib/core/models/constants.d.ts +13 -13
  268. package/lib/core/models/data-store-config.d.ts +27 -27
  269. package/lib/core/models/header-config.d.ts +9 -9
  270. package/lib/core/models/http-verbs.d.ts +10 -10
  271. package/lib/core/models/navigation-config.d.ts +14 -14
  272. package/lib/core/models/oidc-auth-settings.d.ts +11 -11
  273. package/lib/core/models/route-path.d.ts +5 -5
  274. package/lib/core/models/session-config.d.ts +18 -18
  275. package/lib/core/models/styles.d.ts +11 -11
  276. package/lib/core/models/subdomain-config.d.ts +7 -7
  277. package/lib/core/models/typed-session.d.ts +17 -17
  278. package/lib/core/models/user-entity-service-config.d.ts +14 -14
  279. package/lib/core/services/authorization.service.d.ts +54 -54
  280. package/lib/core/services/banner.service.d.ts +31 -31
  281. package/lib/core/services/base-config.service.d.ts +21 -21
  282. package/lib/core/services/custom-auth-config.service.d.ts +6 -6
  283. package/lib/core/services/default-config.service.d.ts +8 -8
  284. package/lib/core/services/session.service.d.ts +127 -127
  285. package/lib/core/services/user-entity.service.d.ts +47 -47
  286. package/lib/distributed-cache/client-generated/api/api.d.ts +3 -3
  287. package/lib/distributed-cache/client-generated/api/cache.service.d.ts +72 -72
  288. package/lib/distributed-cache/client-generated/configuration.d.ts +48 -48
  289. package/lib/distributed-cache/client-generated/encoder.d.ts +10 -10
  290. package/lib/distributed-cache/client-generated/model/cacheExpirationType.d.ts +19 -19
  291. package/lib/distributed-cache/client-generated/model/createCacheEntryRequestModel.d.ts +33 -33
  292. package/lib/distributed-cache/client-generated/model/models.d.ts +4 -4
  293. package/lib/distributed-cache/client-generated/model/retrieveCacheEntryResponseModel.d.ts +20 -20
  294. package/lib/distributed-cache/client-generated/model/updateCacheEntryRequestModel.d.ts +20 -20
  295. package/lib/distributed-cache/client-generated/variables.d.ts +8 -8
  296. package/lib/distributed-cache/distributed-cache-api.d.ts +7 -7
  297. package/lib/distributed-cache/distributed-cache.module.d.ts +8 -8
  298. package/lib/distributed-cache/models/constants.d.ts +2 -2
  299. package/lib/distributed-cache/models/policy-person.d.ts +19 -19
  300. package/lib/distributed-cache/services/server-cache.service.d.ts +72 -72
  301. package/lib/error/components/error-common/error-common.component.d.ts +14 -14
  302. package/lib/error/error-api.d.ts +4 -4
  303. package/lib/error/error.module.d.ts +11 -11
  304. package/lib/error/models/error-common-config.d.ts +21 -21
  305. package/lib/faq/components/faq/faq.component.d.ts +19 -19
  306. package/lib/faq/faq-api.d.ts +5 -5
  307. package/lib/faq/faq.module.d.ts +15 -15
  308. package/lib/faq/models/faq-config.d.ts +13 -13
  309. package/lib/faq/models/faq.d.ts +9 -9
  310. package/lib/feedback-tool/components/feedback-tool/feedback-tool.component.d.ts +62 -0
  311. package/lib/feedback-tool/feedback-tool-api.d.ts +3 -0
  312. package/lib/feedback-tool/feedback-tool.module.d.ts +14 -0
  313. package/lib/footer/components/footer/footer.component.d.ts +14 -14
  314. package/lib/footer/components/site-map/site-map.component.d.ts +13 -13
  315. package/lib/footer/footer-api.d.ts +7 -7
  316. package/lib/footer/footer.module.d.ts +14 -14
  317. package/lib/footer/models/enum/site-map-direction.d.ts +13 -13
  318. package/lib/footer/models/footer-config.d.ts +7 -7
  319. package/lib/footer/models/site-map-models.d.ts +41 -41
  320. package/lib/forms/components/sof-address/sof-address.component.d.ts +53 -53
  321. package/lib/forms/directives/alphanumeric/alphanumeric.directive.d.ts +31 -31
  322. package/lib/forms/directives/input-trim/input-trim.directive.d.ts +58 -58
  323. package/lib/forms/directives/letters-characters/letters-characters.directive.d.ts +27 -27
  324. package/lib/forms/directives/letters-only/letters-only.directive.d.ts +27 -27
  325. package/lib/forms/directives/numbers-only/numbers-only.directive.d.ts +22 -22
  326. package/lib/forms/forms-api.d.ts +14 -14
  327. package/lib/forms/forms.module.d.ts +21 -21
  328. package/lib/forms/models/address.d.ts +14 -14
  329. package/lib/forms/models/constants.d.ts +9 -9
  330. package/lib/forms/models/county.d.ts +13 -13
  331. package/lib/forms/models/enums/states.d.ts +64 -64
  332. package/lib/forms/pipes/phone-format.pipe.d.ts +10 -10
  333. package/lib/forms/services/alert.service.d.ts +60 -60
  334. package/lib/header/components/header/header.component.d.ts +120 -120
  335. package/lib/header/components/mobile-header-menu/mobile-header-menu.component.d.ts +26 -26
  336. package/lib/header/header-api.d.ts +9 -9
  337. package/lib/header/header.module.d.ts +20 -20
  338. package/lib/header/models/header-auth.settings.d.ts +30 -30
  339. package/lib/header/models/header-language.settings.d.ts +10 -10
  340. package/lib/header/models/header-theme.settings.d.ts +19 -19
  341. package/lib/header/models/header.settings.d.ts +53 -53
  342. package/lib/header/models/mobile-header-nav.settings.d.ts +11 -11
  343. package/lib/navigation/components/navigation/navigation.component.d.ts +200 -200
  344. package/lib/navigation/models/nav-theme.settings.d.ts +25 -25
  345. package/lib/navigation/models/nav.settings.d.ts +64 -64
  346. package/lib/navigation/models/navigation.d.ts +40 -40
  347. package/lib/navigation/navigation-api.d.ts +6 -6
  348. package/lib/navigation/navigation.module.d.ts +25 -25
  349. package/lib/oauth/models/constants.d.ts +6 -6
  350. package/lib/oauth/models/generated/accountManagementAssertionModel.d.ts +49 -49
  351. package/lib/oauth/models/generated/accountManagementRefreshRequestModel.d.ts +21 -21
  352. package/lib/oauth/models/generated/accountManagementResponseModel.d.ts +45 -45
  353. package/lib/oauth/models/generated/coverageDetail.d.ts +67 -67
  354. package/lib/oauth/models/generated/finance.d.ts +36 -36
  355. package/lib/oauth/models/generated/iSsoResponseModel.d.ts +44 -44
  356. package/lib/oauth/models/generated/iSsoResponseModelAccountManagementAssertionModel.d.ts +45 -45
  357. package/lib/oauth/models/generated/person.d.ts +53 -53
  358. package/lib/oauth/models/generated/policy.d.ts +51 -51
  359. package/lib/oauth/models/generated/refreshResponseModel.d.ts +20 -20
  360. package/lib/oauth/models/hybrid-saml-oauth-config.d.ts +14 -14
  361. package/lib/oauth/oauth-api.d.ts +12 -12
  362. package/lib/oauth/oauth.module.d.ts +9 -9
  363. package/lib/oauth/services/hybrid-saml-oauth.service.d.ts +59 -59
  364. package/lib/rbac/directives/rbac-action.directive.d.ts +27 -27
  365. package/lib/rbac/models/access-token-claims.d.ts +18 -18
  366. package/lib/rbac/models/constants.d.ts +4 -4
  367. package/lib/rbac/models/decoded-access-token.d.ts +43 -43
  368. package/lib/rbac/models/rbac-config.d.ts +15 -15
  369. package/lib/rbac/models/role-access.d.ts +7 -7
  370. package/lib/rbac/rbac-api.d.ts +11 -11
  371. package/lib/rbac/rbac.module.d.ts +19 -19
  372. package/lib/rbac/services/ar-role-nav.service.d.ts +25 -25
  373. package/lib/rbac/services/oauth2-role.service.d.ts +51 -51
  374. package/lib/rbac/services/role-nav.service.d.ts +12 -12
  375. package/lib/rbac/services/tokens.d.ts +3 -3
  376. package/lib/resize-panels/components/resize-panels/resize-panels.component.d.ts +64 -64
  377. package/lib/resize-panels/models/resize-event.d.ts +6 -6
  378. package/lib/resize-panels/resize-panels-api.d.ts +4 -4
  379. package/lib/resize-panels/resize-panels.module.d.ts +9 -9
  380. package/lib/rum/models/arm-error.d.ts +27 -27
  381. package/lib/rum/models/rum-config.d.ts +9 -9
  382. package/lib/rum/rum-api.d.ts +7 -7
  383. package/lib/rum/rum.module.d.ts +14 -14
  384. package/lib/rum/services/rum.service.d.ts +47 -47
  385. package/lib/rum/services/shared-error.service.d.ts +27 -27
  386. package/lib/rum/services/softheon-error-handler.service.d.ts +32 -32
  387. package/lib/saml/components/redirect-saml/redirect-saml.component.d.ts +41 -41
  388. package/lib/saml/models/i-saml-request.d.ts +4 -4
  389. package/lib/saml/models/i-saml-response.d.ts +4 -4
  390. package/lib/saml/models/redirect-saml-request.d.ts +24 -24
  391. package/lib/saml/models/sso-gateway-model.d.ts +17 -17
  392. package/lib/saml/saml-api.d.ts +11 -11
  393. package/lib/saml/saml.module.d.ts +9 -9
  394. package/lib/saml/services/entry/abstract-saml-entry.service.d.ts +16 -16
  395. package/lib/saml/services/entry/sso-gateway-entry.service.d.ts +22 -22
  396. package/lib/saml/services/send-off/abstract-saml.service.d.ts +20 -20
  397. package/lib/saml/services/send-off/saml.service.d.ts +32 -32
  398. package/lib/sof-pipe/constants/constants.d.ts +8 -8
  399. package/lib/sof-pipe/models/sof-date-pipe-format.d.ts +7 -7
  400. package/lib/sof-pipe/pipes/sof-blank/sof-blank.pipe.d.ts +19 -19
  401. package/lib/sof-pipe/pipes/sof-date/sof-date.pipe.d.ts +21 -21
  402. package/lib/sof-pipe/pipes/sof-ssn/sof-ssn.pipe.d.ts +12 -12
  403. package/lib/sof-pipe/sof-pipe.api.d.ts +7 -7
  404. package/lib/sof-pipe/sof-pipe.module.d.ts +10 -10
  405. package/lib/theming/directives/css-override.directive.d.ts +20 -20
  406. package/lib/theming/models/css-override.d.ts +15 -15
  407. package/lib/theming/services/theme.service.d.ts +48 -48
  408. package/lib/theming/theme-api.d.ts +5 -5
  409. package/lib/theming/theme.module.d.ts +9 -9
  410. package/package.json +17 -23
  411. package/public-api.d.ts +49 -48
  412. package/esm2020/lib/armature.module.mjs +0 -176
  413. package/esm2020/lib/base-components/sof-banner/sof-banner.component.mjs +0 -49
  414. package/esm2020/lib/base-components/sof-image-checkbox/sof-image-checkbox.component.mjs +0 -58
  415. package/esm2020/lib/base-components/sof-modal/sof-modal.component.mjs +0 -58
  416. package/esm2020/lib/base-components/sof-progress-bar/sof-progress-bar.component.mjs +0 -79
  417. package/esm2020/lib/base-components/sof-star-rating/sof-star-rating.component.mjs +0 -40
  418. package/esm2020/lib/component-save-print/sof-ar-component-save-print.module.mjs +0 -32
  419. package/esm2020/lib/distributed-cache/distributed-cache.module.mjs +0 -38
  420. package/esm2020/lib/faq/components/faq/faq.component.mjs +0 -40
  421. package/esm2020/lib/footer/components/footer/footer.component.mjs +0 -25
  422. package/esm2020/lib/forms/models/constants.mjs +0 -10
  423. package/esm2020/lib/header/components/header/header.component.mjs +0 -161
  424. package/esm2020/lib/navigation/components/navigation/navigation.component.mjs +0 -556
  425. package/fesm2015/softheon-armature.mjs +0 -7275
  426. package/fesm2015/softheon-armature.mjs.map +0 -1
  427. package/fesm2020/softheon-armature.mjs +0 -7332
  428. package/fesm2020/softheon-armature.mjs.map +0 -1
@@ -1,286 +1,286 @@
1
- import { Injectable, Optional, Inject } from '@angular/core';
2
- import { AuthConfig } from 'angular-oauth2-oidc';
3
- import { JwksValidationHandler } from 'angular-oauth2-oidc-jwks';
4
- import * as _ from 'lodash';
5
- import { BehaviorSubject, lastValueFrom, throwError } from 'rxjs';
6
- import { languageStorageKey, preSignInRouteStorageKey, WINDOW } from '../models/constants';
7
- import * as i0 from "@angular/core";
8
- import * as i1 from "@angular/common/http";
9
- import * as i2 from "@ngx-translate/core";
10
- import * as i3 from "../../theming/services/theme.service";
11
- import * as i4 from "../services/base-config.service";
12
- import * as i5 from "angular-oauth2-oidc";
13
- import * as i6 from "@angular/router";
14
- import * as i7 from "@angular/common";
15
- import * as i8 from "../services/custom-auth-config.service";
16
- /**
17
- * The startup service is used to call methods that should be run when initially loading the application
18
- */
19
- export class Initializer {
20
- /** Gets the configurations */
21
- get isInitialized() {
22
- return this.isInitializedBs.value;
23
- }
24
- /**
25
- * Constructs the startup service. Include any services that should be used during startup
26
- * @param http The HTTP Client
27
- * @param translateService The translate service
28
- * @param themeService The theme service
29
- * @param configService The configuration service
30
- * @param oAuthService The oidc authorization service
31
- * @param router The router
32
- * @param location The location
33
- * @param customAuthConfigService The service that will configure the auth config
34
- */
35
- constructor(http, translateService, themeService, configService, oAuthService, router, location, customAuthConfigService, _window) {
36
- this.http = http;
37
- this.translateService = translateService;
38
- this.themeService = themeService;
39
- this.configService = configService;
40
- this.oAuthService = oAuthService;
41
- this.router = router;
42
- this.location = location;
43
- this.customAuthConfigService = customAuthConfigService;
44
- this._window = _window;
45
- /** The configuration behavior subject */
46
- this.isInitializedBs = new BehaviorSubject(false);
47
- /** The example the subdomain substring */
48
- this.exampleSubdomain = 'example';
49
- /** The www substring for subdomain route finding */
50
- this.wwwSubstring = 'www';
51
- /** The lvh substring for subdomain route finding */
52
- this.lvhSubstring = 'lvh';
53
- this.isInitialized$ = this.isInitializedBs.asObservable();
54
- this.window = _window || window;
55
- }
56
- /**
57
- * Loads all data that is needed upon initial loading of the website
58
- */
59
- async initialize() {
60
- // reads the language from local storage set in the parent app
61
- // language loading
62
- // Set languages for translation service
63
- const lang = this.window.localStorage.getItem(languageStorageKey) || this.window.sessionStorage.getItem(languageStorageKey) || 'en';
64
- this.translateService.setDefaultLang(lang);
65
- this.translateService.use(lang);
66
- // Adapted from https://stackoverflow.com/a/41636880
67
- // Adapted from https://stackoverflow.com/a/41736293
68
- // A callback used to initialize the promise. This callback is passed two arguments:
69
- // a resolve callback used resolve the promise with a value or the result of another promise,
70
- // and a reject callback used to reject the promise with a provided reason or error.
71
- return new Promise(async (resolve, reject) => {
72
- // Go through all services and complete any API calls necessary.
73
- // At the end, if all works and loads as expected, resolve the promise and set startup success to true.
74
- // If an issue is encountered, you can call reject() to hit the catch() code below.
75
- // First, load the configurations
76
- let [baseConfig, overrideConfig, baseLang, overrideLang, theme] = [JSON, JSON, JSON, JSON, JSON];
77
- try {
78
- [baseConfig, overrideConfig, baseLang, overrideLang, theme] = await Promise.all([
79
- this.http.get('./assets/baseline/appsettings.json').toPromise(),
80
- this.http.get('./assets/configurations/appsettings.json').toPromise(),
81
- this.http.get(`./assets/i18n/${this.translateService.currentLang}.json`).toPromise(),
82
- this.http.get(`./assets/configurations/${this.translateService.currentLang}.json`).toPromise(),
83
- this.http.get('./assets/configurations/theme.json').toPromise()
84
- ]);
85
- this.configService.config = _.mergeWith(baseConfig, overrideConfig, this.mergeCustomizer);
86
- const mergedLanguage = _.mergeWith(baseLang, overrideLang, this.mergeCustomizer);
87
- this.translateService.setTranslation(this.translateService.currentLang, mergedLanguage);
88
- const configurePartial = (t) => {
89
- const configSnapShot = this.configService.config;
90
- configSnapShot.theme = t;
91
- this.configService.config = configSnapShot;
92
- this.themeService.initPalette(t);
93
- };
94
- const subdomain = this.getSubdomain();
95
- if (subdomain && this.configService.config.subdomain) {
96
- try {
97
- let [subdomainConfigs, subdomainLanguage, subdomainTheme] = await Promise.all([
98
- lastValueFrom(this.http.get(`./assets/configurations/${subdomain}.${this.translateService.currentLang}.json`)),
99
- lastValueFrom(this.http.get(`./assets/configurations/${subdomain}.appsettings.json`)),
100
- lastValueFrom(this.http.get(`./assets/configurations/${subdomain}.theme.json`))
101
- ]);
102
- this.configService.config = _.mergeWith(this.configService.config, subdomainConfigs, this.mergeCustomizer);
103
- this.translateService.setTranslation(this.translateService.currentLang, _.mergeWith(mergedLanguage, subdomainLanguage, this.mergeCustomizer));
104
- const mergedTheme = _.mergeWith(theme, subdomainTheme, this.mergeCustomizer);
105
- configurePartial(mergedTheme);
106
- }
107
- catch (e) {
108
- if (this.configService.config.subdomain && this.configService.config.subdomain.subdomains.length && !this.configService.config.subdomain.subdomains.includes(subdomain)) {
109
- this.router.dispose();
110
- const error = `Invalid subdomain: ${subdomain}`;
111
- console.error(error);
112
- throw new Error(error);
113
- }
114
- else if (this.configService.config.subdomain?.requireConfiguredSubdomain && this.configService.config.subdomain?.subdomains.includes(subdomain)) {
115
- this.router.dispose();
116
- const error = `Configured subdomain: ${subdomain} does not have any subdomain specific configurations`;
117
- reject(error);
118
- console.error(error);
119
- throw new Error(error);
120
- }
121
- configurePartial(theme);
122
- }
123
- }
124
- else {
125
- configurePartial(theme);
126
- }
127
- }
128
- catch (error) {
129
- // Catch any errors during the get configurations API call
130
- console.error('Error Loading Configurations or Languages');
131
- // Reject the promise
132
- reject('error');
133
- return throwError(error.error || 'Server error');
134
- }
135
- try {
136
- if (this.customAuthConfigService) {
137
- await this.customAuthConfigService.configureAuthSettings().then(authConfig => {
138
- if (authConfig) {
139
- const config = this.configService.config.oAuthSettings;
140
- return this.login(config);
141
- }
142
- else {
143
- return Promise.resolve(false);
144
- }
145
- });
146
- }
147
- else {
148
- const oAuth = await this.setUpOAuth();
149
- }
150
- }
151
- catch (error) {
152
- reject(error);
153
- return throwError(error);
154
- }
155
- // Navigate to the requested route
156
- if (this.configService.config.oAuthSettings?.preserveRoute) {
157
- this.router.navigateByUrl(this.oAuthService.state);
158
- }
159
- this.isInitializedBs.next(true);
160
- resolve(true);
161
- }).catch((error) => {
162
- // Catch the error
163
- console.error('There was an error loading the startup configurations.');
164
- });
165
- }
166
- /**
167
- * Configure implicit flow
168
- */
169
- async setUpOAuth() {
170
- if (this.configService.config?.oAuthSettings?.issuer) {
171
- const config = this.configService.config.oAuthSettings;
172
- const authConfig = new AuthConfig({
173
- clientId: config.clientId,
174
- redirectUri: config.redirectUri,
175
- issuer: config.issuer,
176
- scope: config.scope,
177
- skipIssuerCheck: config.skipIssuerCheck != undefined ? config.skipIssuerCheck : true,
178
- timeoutFactor: config.timeoutFactor || 0.75,
179
- postLogoutRedirectUri: config.postLogoutRedirectUri,
180
- loginUrl: config.loginUrl,
181
- strictDiscoveryDocumentValidation: false,
182
- responseType: config.responseType || 'code'
183
- });
184
- this.oAuthService.configure(authConfig);
185
- this.oAuthService.skipIssuerCheck = true;
186
- this.oAuthService.responseType = config.responseType || 'code';
187
- this.oAuthService.strictDiscoveryDocumentValidation = false;
188
- this.oAuthService.tokenValidationHandler = new JwksValidationHandler();
189
- this.oAuthService.timeoutFactor = 0.75;
190
- this.oAuthService.setupAutomaticSilentRefresh({}, 'access_token');
191
- // set initialized on start up to true
192
- config.authSetOnStartup = true;
193
- const parentConfig = this.configService.config;
194
- parentConfig.oAuthSettings = config;
195
- this.configService.config = parentConfig;
196
- return this.login(config);
197
- }
198
- return Promise.resolve(true);
199
- }
200
- /**
201
- * Handle Login
202
- * @param config The Oidc Auth Settings
203
- */
204
- async login(config) {
205
- const isValid = this.validateExistingTokenAgainstConfigs();
206
- const preservedRoute = this.window.sessionStorage.getItem(preSignInRouteStorageKey);
207
- if (!preservedRoute) {
208
- this.window.sessionStorage.setItem(preSignInRouteStorageKey, this.location.path());
209
- }
210
- if (config.requireLoginOnStartup || !isValid) {
211
- return this.oAuthService.loadDiscoveryDocumentAndLogin({ state: this.location.path() })
212
- // handles the case for expired access token or invalid nonce or people bookmarking the ids login page
213
- .catch(async (res) => {
214
- this.oAuthService.initLoginFlow(this.location.path());
215
- return Promise.resolve(true);
216
- });
217
- }
218
- else {
219
- return this.oAuthService.loadDiscoveryDocumentAndTryLogin()
220
- // handles the case for expired access token or invalid nonce or people bookmarking the ids login page
221
- .catch(async (res) => {
222
- this.oAuthService.initLoginFlow();
223
- return Promise.resolve(true);
224
- });
225
- }
226
- }
227
- /**
228
- * Merges the two config objects ignoring the array type
229
- * @param objValue The default config value
230
- * @param srcValue The target switchboard config value
231
- * @returns The merge of the two configs provided
232
- */
233
- mergeCustomizer(objValue, srcValue) {
234
- if (_.isArray(objValue) && srcValue) {
235
- return srcValue;
236
- }
237
- }
238
- /**
239
- * Validates the existing token against the configurations
240
- * @returns true when token is valid
241
- */
242
- validateExistingTokenAgainstConfigs() {
243
- if (this.configService.config.oAuthSettings.disableStartupTokenValidation) {
244
- return true;
245
- }
246
- if (!this.window.sessionStorage.getItem('access_token')) {
247
- return true;
248
- }
249
- const grantedScopes = this.oAuthService.getGrantedScopes();
250
- const configuredScopes = this.configService.config.oAuthSettings.scope.split(' ');
251
- const diffs = grantedScopes.filter(x => !configuredScopes.includes(x))
252
- .concat(configuredScopes.filter(x => !grantedScopes.includes(x)));
253
- if (diffs.length || this.oAuthService.getIdentityClaims()['aud'] !== this.configService.config.oAuthSettings.clientId) {
254
- this.window.sessionStorage.removeItem('access_token');
255
- return false;
256
- }
257
- return true;
258
- }
259
- /** Getting the subdomain from url */
260
- getSubdomain() {
261
- const domain = this.window.location.hostname;
262
- if (domain.indexOf('.') < 0 ||
263
- domain.split('.')[0] === this.exampleSubdomain || domain.split('.')[0] === this.lvhSubstring || domain.split('.')[0] === this.wwwSubstring) {
264
- return '';
265
- }
266
- else {
267
- return domain.split('.')[0];
268
- }
269
- }
270
- }
271
- Initializerfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.7", ngImport: i0, type: Initializer, deps: [{ token: i1.HttpClient }, { token: i2.TranslateService }, { token: i3.ThemeService }, { token: i4.BaseConfigService }, { token: i5.OAuthService }, { token: i6.Router }, { token: i7.Location }, { token: i8.CustomAuthConfigService, optional: true }, { token: WINDOW, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
272
- Initializer.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.7", ngImport: i0, type: Initializer, providedIn: 'root' });
273
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.7", ngImport: i0, type: Initializer, decorators: [{
274
- type: Injectable,
275
- args: [{
276
- providedIn: 'root'
277
- }]
278
- }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: i2.TranslateService }, { type: i3.ThemeService }, { type: i4.BaseConfigService }, { type: i5.OAuthService }, { type: i6.Router }, { type: i7.Location }, { type: i8.CustomAuthConfigService, decorators: [{
279
- type: Optional
280
- }] }, { type: undefined, decorators: [{
281
- type: Optional
282
- }, {
283
- type: Inject,
284
- args: [WINDOW]
285
- }] }]; } });
286
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5pdGlhbGl6ZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FybWF0dXJlL3NyYy9saWIvY29yZS9pbml0aWFsaXplci9pbml0aWFsaXplci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUc3RCxPQUFPLEVBQUUsVUFBVSxFQUFnQixNQUFNLHFCQUFxQixDQUFDO0FBQy9ELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ2pFLE9BQU8sS0FBSyxDQUFDLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFjLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUc5RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxFQUFFLE1BQU0scUJBQXFCLENBQUM7Ozs7Ozs7Ozs7QUFPM0Y7O0dBRUc7QUFNSCxNQUFNLE9BQU8sV0FBVztJQWlCdEIsOEJBQThCO0lBQzlCLElBQVcsYUFBYTtRQUN0QixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDO0lBQ3BDLENBQUM7SUFLRDs7Ozs7Ozs7OztPQVVHO0lBQ0gsWUFDbUIsSUFBZ0IsRUFDaEIsZ0JBQWtDLEVBQ2xDLFlBQTBCLEVBQzFCLGFBQWdDLEVBQ2hDLFlBQTBCLEVBQzFCLE1BQWMsRUFDZCxRQUFrQixFQUNOLHVCQUFnRCxFQUN4QyxPQUFZO1FBUmhDLFNBQUksR0FBSixJQUFJLENBQVk7UUFDaEIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUNsQyxpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUMxQixrQkFBYSxHQUFiLGFBQWEsQ0FBbUI7UUFDaEMsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsV0FB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QUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsZ0JBQWdCLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsWUFBWSxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLFlBQVksRUFBRTtZQUM1SSxPQUFPLEVBQUUsQ0FBQztTQUNYO2FBQU07WUFDTCxPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDN0I7SUFDSCxDQUFDOzt3R0EzUlUsV0FBVywwUUE2Q0EsTUFBTTs0R0E3Q2pCLFdBQVcsY0FIUixNQUFNOzJGQUdULFdBQVc7a0JBTHZCLFVBQVU7bUJBQ1Q7b0JBQ0UsVUFBVSxFQUFFLE1BQU07aUJBQ25COzswQkE4Q0UsUUFBUTs7MEJBQ1IsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgSW5qZWN0YWJsZSwgT3B0aW9uYWwsIEluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xyXG5pbXBvcnQgeyBBdXRoQ29uZmlnLCBPQXV0aFNlcnZpY2UgfSBmcm9tICdhbmd1bGFyLW9hdXRoMi1vaWRjJztcclxuaW1wb3J0IHsgSndrc1ZhbGlkYXRpb25IYW5kbGVyIH0gZnJvbSAnYW5ndWxhci1vYXV0aDItb2lkYy1qd2tzJztcclxuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xyXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGxhc3RWYWx1ZUZyb20sIE9ic2VydmFibGUsIHRocm93RXJyb3IgfSBmcm9tICdyeGpzJztcclxuXHJcbmltcG9ydCB7IFRoZW1lU2VydmljZSB9IGZyb20gJy4uLy4uL3RoZW1pbmcvc2VydmljZXMvdGhlbWUuc2VydmljZSc7XHJcbmltcG9ydCB7IGxhbmd1YWdlU3RvcmFnZUtleSwgcHJlU2lnbkluUm91dGVTdG9yYWdlS2V5LCBXSU5ET1cgfSBmcm9tICcuLi9tb2RlbHMvY29uc3RhbnRzJztcclxuaW1wb3J0IHsgT2lkY0F1dGhTZXR0aW5ncyB9IGZyb20gJy4uL21vZGVscy9vaWRjLWF1dGgtc2V0dGluZ3MnO1xyXG5pbXBvcnQgeyBCYXNlQ29uZmlnU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2Jhc2UtY29uZmlnLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDdXN0b21BdXRoQ29uZmlnU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2N1c3RvbS1hdXRoLWNvbmZpZy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuaW1wb3J0IHsgTG9jYXRpb24gfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5cclxuLyoqXHJcbiAqIFRoZSBzdGFydHVwIHNlcnZpY2UgaXMgdXNlZCB0byBjYWxsIG1ldGhvZHMgdGhhdCBzaG91bGQgYmUgcnVuIHdoZW4gaW5pdGlhbGx5IGxvYWRpbmcgdGhlIGFwcGxpY2F0aW9uXHJcbiAqL1xyXG5ASW5qZWN0YWJsZShcclxuICB7XHJcbiAgICBwcm92aWRlZEluOiAncm9vdCdcclxuICB9XHJcbilcclxuZXhwb3J0IGNsYXNzIEluaXRpYWxpemVyIHtcclxuXHJcbiAgLyoqIFRoZSBjb25maWd1cmF0aW9uIGJlaGF2aW9yIHN1YmplY3QgKi9cclxuICBwcml2YXRlIHJlYWRvbmx5IGlzSW5pdGlhbGl6ZWRCczogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XHJcblxyXG4gIC8qKiBUaGUgYnJvd3NlciB3aW5kb3cgKi9cclxuICBwcml2YXRlIHJlYWRvbmx5IHdpbmRvdzogV2luZG93O1xyXG5cclxuICAvKiogVGhlIGV4YW1wbGUgdGhlIHN1YmRvbWFpbiBzdWJzdHJpbmcgKi9cclxuICBwcml2YXRlIHJlYWRvbmx5IGV4YW1wbGVTdWJkb21haW46IHN0cmluZyA9ICdleGFtcGxlJztcclxuXHJcbiAgLyoqIFRoZSB3d3cgc3Vic3RyaW5nIGZvciBzdWJkb21haW4gcm91dGUgZmluZGluZyAqL1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgd3d3U3Vic3RyaW5nOiBzdHJpbmcgPSAnd3d3JztcclxuXHJcbiAgLyoqIFRoZSBsdmggc3Vic3RyaW5nIGZvciBzdWJkb21haW4gcm91dGUgZmluZGluZyAqL1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgbHZoU3Vic3RyaW5nOiBzdHJpbmcgPSAnbHZoJ1xyXG5cclxuICAvKiogR2V0cyB0aGUgY29uZmlndXJhdGlvbnMgKi9cclxuICBwdWJsaWMgZ2V0IGlzSW5pdGlhbGl6ZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5pc0luaXRpYWxpemVkQnMudmFsdWU7XHJcbiAgfVxyXG5cclxuICAvKiogVGhlIGNvbmZpZ3VyYXRpb24gb2JzZXJ2YWJsZSAqL1xyXG4gIHB1YmxpYyByZWFkb25seSBpc0luaXRpYWxpemVkJDogT2JzZXJ2YWJsZTxib29sZWFuPjtcclxuXHJcbiAgLyoqXHJcbiAgICogQ29uc3RydWN0cyB0aGUgc3RhcnR1cCBzZXJ2aWNlLiBJbmNsdWRlIGFueSBzZXJ2aWNlcyB0aGF0IHNob3VsZCBiZSB1c2VkIGR1cmluZyBzdGFydHVwXHJcbiAgICogQHBhcmFtIGh0dHAgVGhlIEhUVFAgQ2xpZW50XHJcbiAgICogQHBhcmFtIHRyYW5zbGF0ZVNlcnZpY2UgVGhlIHRyYW5zbGF0ZSBzZXJ2aWNlXHJcbiAgICogQHBhcmFtIHRoZW1lU2VydmljZSBUaGUgdGhlbWUgc2VydmljZVxyXG4gICAqIEBwYXJhbSBjb25maWdTZXJ2aWNlIFRoZSBjb25maWd1cmF0aW9uIHNlcnZpY2VcclxuICAgKiBAcGFyYW0gb0F1dGhTZXJ2aWNlIFRoZSBvaWRjIGF1dGhvcml6YXRpb24gc2VydmljZVxyXG4gICAqIEBwYXJhbSByb3V0ZXIgVGhlIHJvdXRlclxyXG4gICAqIEBwYXJhbSBsb2NhdGlvbiBUaGUgbG9jYXRpb25cclxuICAgKiBAcGFyYW0gY3VzdG9tQXV0aENvbmZpZ1NlcnZpY2UgVGhlIHNlcnZpY2UgdGhhdCB3aWxsIGNvbmZpZ3VyZSB0aGUgYXV0aCBjb25maWdcclxuICAgKi9cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgaHR0cDogSHR0cENsaWVudCxcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgdHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZSxcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgdGhlbWVTZXJ2aWNlOiBUaGVtZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZ1NlcnZpY2U6IEJhc2VDb25maWdTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBvQXV0aFNlcnZpY2U6IE9BdXRoU2VydmljZSxcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgcm91dGVyOiBSb3V0ZXIsXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGxvY2F0aW9uOiBMb2NhdGlvbixcclxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgcmVhZG9ubHkgY3VzdG9tQXV0aENvbmZpZ1NlcnZpY2U6IEN1c3RvbUF1dGhDb25maWdTZXJ2aWNlLFxyXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChXSU5ET1cpIHJlYWRvbmx5IF93aW5kb3c6IGFueVxyXG4gICkge1xyXG4gICAgdGhpcy5pc0luaXRpYWxpemVkJCA9IHRoaXMuaXNJbml0aWFsaXplZEJzLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgdGhpcy53aW5kb3cgPSBfd2luZG93IHx8IHdpbmRvdztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIExvYWRzIGFsbCBkYXRhIHRoYXQgaXMgbmVlZGVkIHVwb24gaW5pdGlhbCBsb2FkaW5nIG9mIHRoZSB3ZWJzaXRlXHJcbiAgICovXHJcbiAgcHVibGljIGFzeW5jIGluaXRpYWxpemUoKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIC8vIHJlYWRzIHRoZSBsYW5ndWFnZSBmcm9tIGxvY2FsIHN0b3JhZ2Ugc2V0IGluIHRoZSBwYXJlbnQgYXBwXHJcbiAgICAvLyBsYW5ndWFnZSBsb2FkaW5nXHJcblxyXG4gICAgLy8gU2V0IGxhbmd1YWdlcyBmb3IgdHJhbnNsYXRpb24gc2VydmljZVxyXG4gICAgY29uc3QgbGFuZyA9IHRoaXMud2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKGxhbmd1YWdlU3RvcmFnZUtleSkgfHwgdGhpcy53aW5kb3cuc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShsYW5ndWFnZVN0b3JhZ2VLZXkpIHx8ICdlbic7XHJcbiAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2Uuc2V0RGVmYXVsdExhbmcobGFuZyk7XHJcbiAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UudXNlKGxhbmcpO1xyXG5cclxuICAgIC8vIEFkYXB0ZWQgZnJvbSBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvNDE2MzY4ODBcclxuICAgIC8vIEFkYXB0ZWQgZnJvbSBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvNDE3MzYyOTNcclxuXHJcbiAgICAvLyBBIGNhbGxiYWNrIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgcHJvbWlzZS4gVGhpcyBjYWxsYmFjayBpcyBwYXNzZWQgdHdvIGFyZ3VtZW50czpcclxuICAgIC8vIGEgcmVzb2x2ZSBjYWxsYmFjayB1c2VkIHJlc29sdmUgdGhlIHByb21pc2Ugd2l0aCBhIHZhbHVlIG9yIHRoZSByZXN1bHQgb2YgYW5vdGhlciBwcm9taXNlLFxyXG4gICAgLy8gYW5kIGEgcmVqZWN0IGNhbGxiYWNrIHVzZWQgdG8gcmVqZWN0IHRoZSBwcm9taXNlIHdpdGggYSBwcm92aWRlZCByZWFzb24gb3IgZXJyb3IuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAvLyBHbyB0aHJvdWdoIGFsbCBzZXJ2aWNlcyBhbmQgY29tcGxldGUgYW55IEFQSSBjYWxscyBuZWNlc3NhcnkuXHJcbiAgICAgIC8vIEF0IHRoZSBlbmQsIGlmIGFsbCB3b3JrcyBhbmQgbG9hZHMgYXMgZXhwZWN0ZWQsIHJlc29sdmUgdGhlIHByb21pc2UgYW5kIHNldCBzdGFydHVwIHN1Y2Nlc3MgdG8gdHJ1ZS5cclxuICAgICAgLy8gSWYgYW4gaXNzdWUgaXMgZW5jb3VudGVyZWQsIHlvdSBjYW4gY2FsbCByZWplY3QoKSB0byBoaXQgdGhlIGNhdGNoKCkgY29kZSBiZWxvdy5cclxuXHJcbiAgICAgIC8vIEZpcnN0LCBsb2FkIHRoZSBjb25maWd1cmF0aW9uc1xyXG4gICAgICBsZXQgW2Jhc2VDb25maWcsIG92ZXJyaWRlQ29uZmlnLCBiYXNlTGFuZywgb3ZlcnJpZGVMYW5nLCB0aGVtZV0gPSBbSlNPTiwgSlNPTiwgSlNPTiwgSlNPTiwgSlNPTl07XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgW2Jhc2VDb25maWcsIG92ZXJyaWRlQ29uZmlnLCBiYXNlTGFuZywgb3ZlcnJpZGVMYW5nLCB0aGVtZV0gPSBhd2FpdCBQcm9taXNlLmFsbChbXHJcbiAgICAgICAgICB0aGlzLmh0dHAuZ2V0PEpTT04+KCcuL2Fzc2V0cy9iYXNlbGluZS9hcHBzZXR0aW5ncy5qc29uJykudG9Qcm9taXNlKCksXHJcbiAgICAgICAgICB0aGlzLmh0dHAuZ2V0PEpTT04+KCcuL2Fzc2V0cy9jb25maWd1cmF0aW9ucy9hcHBzZXR0aW5ncy5qc29uJykudG9Qcm9taXNlKCksXHJcbiAgICAgICAgICB0aGlzLmh0dHAuZ2V0PEpTT04+KGAuL2Fzc2V0cy9pMThuLyR7dGhpcy50cmFuc2xhdGVTZXJ2aWNlLmN1cnJlbnRMYW5nfS5qc29uYCkudG9Qcm9taXNlKCksXHJcbiAgICAgICAgICB0aGlzLmh0dHAuZ2V0PEpTT04+KGAuL2Fzc2V0cy9jb25maWd1cmF0aW9ucy8ke3RoaXMudHJhbnNsYXRlU2VydmljZS5jdXJyZW50TGFuZ30uanNvbmApLnRvUHJvbWlzZSgpLFxyXG4gICAgICAgICAgdGhpcy5odHRwLmdldDxKU09OPignLi9hc3NldHMvY29uZmlndXJhdGlvbnMvdGhlbWUuanNvbicpLnRvUHJvbWlzZSgpXHJcbiAgICAgICAgXSk7XHJcbiAgICAgICAgdGhpcy5jb25maWdTZXJ2aWNlLmNvbmZpZyA9IF8ubWVyZ2VXaXRoKGJhc2VDb25maWcsIG92ZXJyaWRlQ29uZmlnLCB0aGlzLm1lcmdlQ3VzdG9taXplcik7XHJcbiAgICAgICAgY29uc3QgbWVyZ2VkTGFuZ3VhZ2UgPSBfLm1lcmdlV2l0aChiYXNlTGFuZywgb3ZlcnJpZGVMYW5nLCB0aGlzLm1lcmdlQ3VzdG9taXplcik7XHJcbiAgICAgICAgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLnNldFRyYW5zbGF0aW9uKHRoaXMudHJhbnNsYXRlU2VydmljZS5jdXJyZW50TGFuZywgbWVyZ2VkTGFuZ3VhZ2UpO1xyXG5cclxuICAgICAgICBjb25zdCBjb25maWd1cmVQYXJ0aWFsID0gKHQpID0+IHtcclxuICAgICAgICAgIGNvbnN0IGNvbmZpZ1NuYXBTaG90ID0gdGhpcy5jb25maWdTZXJ2aWNlLmNvbmZpZztcclxuICAgICAgICAgIGNvbmZpZ1NuYXBTaG90LnRoZW1lID0gdCBhcyBhbnk7XHJcbiAgICAgICAgICB0aGlzLmNvbmZpZ1NlcnZpY2UuY29uZmlnID0gY29uZmlnU25hcFNob3Q7XHJcbiAgICAgICAgICB0aGlzLnRoZW1lU2VydmljZS5pbml0UGFsZXR0ZSh0IGFzIGFueSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHN1YmRvbWFpbiA9IHRoaXMuZ2V0U3ViZG9tYWluKCk7XHJcbiAgICAgICAgaWYgKHN1YmRvbWFpbiAmJiB0aGlzLmNvbmZpZ1NlcnZpY2UuY29uZmlnLnN1YmRvbWFpbikge1xyXG4gICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgbGV0IFtzdWJkb21haW5Db25maWdzLCBzdWJkb21haW5MYW5ndWFnZSwgc3ViZG9tYWluVGhlbWVdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xyXG4gICAgICAgICAgICAgIGxhc3RWYWx1ZUZyb20odGhpcy5odHRwLmdldDxKU09OPihgLi9hc3NldHMvY29uZmlndXJhdGlvbnMvJHtzdWJkb21haW59LiR7dGhpcy50cmFuc2xhdGVTZXJ2aWNlLmN1cnJlbnRMYW5nfS5qc29uYCkpLFxyXG4gICAgICAgICAgICAgIGxhc3RWYWx1ZUZyb20odGhpcy5odHRwLmdldDxKU09OPihgLi9hc3NldHMvY29uZmlndXJhdGlvbnMvJHtzdWJkb21haW59LmFwcHNldHRpbmdzLmpzb25gKSksXHJcbiAgICAgICAgICAgICAgbGFzdFZhbHVlRnJvbSh0aGlzLmh0dHAuZ2V0PEpTT04+KGAuL2Fzc2V0cy9jb25maWd1cmF0aW9ucy8ke3N1YmRvbWFpbn0udGhlbWUuanNvbmApKVxyXG4gICAgICAgICAgICBdKTtcclxuICAgICAgICAgICAgdGhpcy5jb25maWdTZXJ2aWNlLmNvbmZpZyA9IF8ubWVyZ2VXaXRoKHRoaXMuY29uZmlnU2VydmljZS5jb25maWcsIHN1YmRvbWFpbkNvbmZpZ3MsIHRoaXMubWVyZ2VDdXN0b21pemVyKTtcclxuICAgICAgICAgICAgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLnNldFRyYW5zbGF0aW9uKHRoaXMudHJhbnNsYXRlU2VydmljZS5jdXJyZW50TGFuZywgXy5tZXJnZVdpdGgobWVyZ2VkTGFuZ3VhZ2UsIHN1YmRvbWFpbkxhbmd1YWdlLCB0aGlzLm1lcmdlQ3VzdG9taXplcikpO1xyXG4gICAgICAgICAgICBjb25zdCBtZXJnZWRUaGVtZSA9IF8ubWVyZ2VXaXRoKHRoZW1lLCBzdWJkb21haW5UaGVtZSwgdGhpcy5tZXJnZUN1c3RvbWl6ZXIpO1xyXG4gICAgICAgICAgICBjb25maWd1cmVQYXJ0aWFsKG1lcmdlZFRoZW1lKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbmZpZ1NlcnZpY2UuY29uZmlnLnN1YmRvbWFpbiAmJiB0aGlzLmNvbmZpZ1NlcnZpY2UuY29uZmlnLnN1YmRvbWFpbi5zdWJkb21haW5zLmxlbmd0aCAmJiAhdGhpcy5jb25maWdTZXJ2aWNlLmNvbmZpZy5zdWJkb21haW4uc3ViZG9tYWlucy5pbmNsdWRlcyhzdWJkb21haW4pKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5yb3V0ZXIuZGlzcG9zZSgpO1xyXG4gICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gYEludmFsaWQgc3ViZG9tYWluOiAke3N1YmRvbWFpbn1gO1xyXG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xyXG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5jb25maWdTZXJ2aWNlLmNvbmZpZy5zdWJkb21haW4/LnJlcXVpcmVDb25maWd1cmVkU3ViZG9tYWluICYmIHRoaXMuY29uZmlnU2VydmljZS5jb25maWcuc3ViZG9tYWluPy5zdWJkb21haW5zLmluY2x1ZGVzKHN1YmRvbWFpbikpIHtcclxuICAgICAgICAgICAgICB0aGlzLnJvdXRlci5kaXNwb3NlKCk7XHJcbiAgICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBgQ29uZmlndXJlZCBzdWJkb21haW46ICR7c3ViZG9tYWlufSBkb2VzIG5vdCBoYXZlIGFueSBzdWJkb21haW4gc3BlY2lmaWMgY29uZmlndXJhdGlvbnNgO1xyXG4gICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XHJcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XHJcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25maWd1cmVQYXJ0aWFsKHRoZW1lKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBjb25maWd1cmVQYXJ0aWFsKHRoZW1lKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgLy8gQ2F0Y2ggYW55IGVycm9ycyBkdXJpbmcgdGhlIGdldCBjb25maWd1cmF0aW9ucyBBUEkgY2FsbFxyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIExvYWRpbmcgQ29uZmlndXJhdGlvbnMgb3IgTGFuZ3VhZ2VzJyk7XHJcbiAgICAgICAgLy8gUmVqZWN0IHRoZSBwcm9taXNlXHJcbiAgICAgICAgcmVqZWN0KCdlcnJvcicpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhyb3dFcnJvcihlcnJvci5lcnJvciB8fCAnU2VydmVyIGVycm9yJyk7XHJcbiAgICAgIH1cclxuICAgICAgdHJ5IHtcclxuICAgICAgICBpZiAodGhpcy5jdXN0b21BdXRoQ29uZmlnU2VydmljZSkge1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy5jdXN0b21BdXRoQ29uZmlnU2VydmljZS5jb25maWd1cmVBdXRoU2V0dGluZ3MoKS50aGVuKGF1dGhDb25maWcgPT4ge1xyXG4gICAgICAgICAgICBpZiAoYXV0aENvbmZpZykge1xyXG4gICAgICAgICAgICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuY29uZmlnU2VydmljZS5jb25maWcub0F1dGhTZXR0aW5ncztcclxuXHJcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9naW4oY29uZmlnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgY29uc3Qgb0F1dGggPSBhd2FpdCB0aGlzLnNldFVwT0F1dGgoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgcmVqZWN0KGVycm9yKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoZXJyb3IpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBOYXZpZ2F0ZSB0byB0aGUgcmVxdWVzdGVkIHJvdXRlXHJcbiAgICAgIGlmICh0aGlzLmNvbmZpZ1NlcnZpY2UuY29uZmlnLm9BdXRoU2V0dGluZ3M/LnByZXNlcnZlUm91dGUpIHtcclxuICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZUJ5VXJsKHRoaXMub0F1dGhTZXJ2aWNlLnN0YXRlKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5pc0luaXRpYWxpemVkQnMubmV4dCh0cnVlKTtcclxuICAgICAgcmVzb2x2ZSh0cnVlKTtcclxuICAgIH0pLmNhdGNoKChlcnJvcikgPT4ge1xyXG4gICAgICAvLyBDYXRjaCB0aGUgZXJyb3JcclxuICAgICAgY29uc29sZS5lcnJvcignVGhlcmUgd2FzIGFuIGVycm9yIGxvYWRpbmcgdGhlIHN0YXJ0dXAgY29uZmlndXJhdGlvbnMuJyk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENvbmZpZ3VyZSBpbXBsaWNpdCBmbG93XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhc3luYyBzZXRVcE9BdXRoKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgaWYgKHRoaXMuY29uZmlnU2VydmljZS5jb25maWc/Lm9BdXRoU2V0dGluZ3M/Lmlzc3Vlcikge1xyXG4gICAgICBjb25zdCBjb25maWcgPSB0aGlzLmNvbmZpZ1NlcnZpY2UuY29uZmlnLm9BdXRoU2V0dGluZ3M7XHJcbiAgICAgIGNvbnN0IGF1dGhDb25maWcgPSBuZXcgQXV0aENvbmZpZyh7XHJcbiAgICAgICAgY2xpZW50SWQ6IGNvbmZpZy5jbGllbnRJZCxcclxuICAgICAgICByZWRpcmVjdFVyaTogY29uZmlnLnJlZGlyZWN0VXJpLFxyXG4gICAgICAgIGlzc3VlcjogY29uZmlnLmlzc3VlcixcclxuICAgICAgICBzY29wZTogY29uZmlnLnNjb3BlLFxyXG4gICAgICAgIHNraXBJc3N1ZXJDaGVjazogY29uZmlnLnNraXBJc3N1ZXJDaGVjayAhPSB1bmRlZmluZWQgPyBjb25maWcuc2tpcElzc3VlckNoZWNrIDogdHJ1ZSxcclxuICAgICAgICB0aW1lb3V0RmFjdG9yOiBjb25maWcudGltZW91dEZhY3RvciB8fCAwLjc1LFxyXG4gICAgICAgIHBvc3RMb2dvdXRSZWRpcmVjdFVyaTogY29uZmlnLnBvc3RMb2dvdXRSZWRpcmVjdFVyaSxcclxuICAgICAgICBsb2dpblVybDogY29uZmlnLmxvZ2luVXJsLFxyXG4gICAgICAgIHN0cmljdERpc2NvdmVyeURvY3VtZW50VmFsaWRhdGlvbjogZmFsc2UsXHJcbiAgICAgICAgcmVzcG9uc2VUeXBlOiBjb25maWcucmVzcG9uc2VUeXBlIHx8ICdjb2RlJ1xyXG4gICAgICB9KTtcclxuICAgICAgdGhpcy5vQXV0aFNlcnZpY2UuY29uZmlndXJlKGF1dGhDb25maWcpO1xyXG4gICAgICB0aGlzLm9BdXRoU2VydmljZS5za2lwSXNzdWVyQ2hlY2sgPSB0cnVlO1xyXG4gICAgICB0aGlzLm9BdXRoU2VydmljZS5yZXNwb25zZVR5cGUgPSBjb25maWcucmVzcG9uc2VUeXBlIHx8ICdjb2RlJztcclxuICAgICAgdGhpcy5vQXV0aFNlcnZpY2Uuc3RyaWN0RGlzY292ZXJ5RG9jdW1lbnRWYWxpZGF0aW9uID0gZmFsc2U7XHJcbiAgICAgIHRoaXMub0F1dGhTZXJ2aWNlLnRva2VuVmFsaWRhdGlvbkhhbmRsZXIgPSBuZXcgSndrc1ZhbGlkYXRpb25IYW5kbGVyKCk7XHJcbiAgICAgIHRoaXMub0F1dGhTZXJ2aWNlLnRpbWVvdXRGYWN0b3IgPSAwLjc1O1xyXG4gICAgICB0aGlzLm9BdXRoU2VydmljZS5zZXR1cEF1dG9tYXRpY1NpbGVudFJlZnJlc2goe30sICdhY2Nlc3NfdG9rZW4nKTtcclxuXHJcbiAgICAgIC8vIHNldCBpbml0aWFsaXplZCBvbiBzdGFydCB1cCB0byB0cnVlXHJcbiAgICAgIGNvbmZpZy5hdXRoU2V0T25TdGFydHVwID0gdHJ1ZTtcclxuICAgICAgY29uc3QgcGFyZW50Q29uZmlnID0gdGhpcy5jb25maWdTZXJ2aWNlLmNvbmZpZztcclxuICAgICAgcGFyZW50Q29uZmlnLm9BdXRoU2V0dGluZ3MgPSBjb25maWc7XHJcbiAgICAgIHRoaXMuY29uZmlnU2VydmljZS5jb25maWcgPSBwYXJlbnRDb25maWc7XHJcblxyXG4gICAgICByZXR1cm4gdGhpcy5sb2dpbihjb25maWcpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodHJ1ZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBIYW5kbGUgTG9naW5cclxuICAgKiBAcGFyYW0gY29uZmlnIFRoZSBPaWRjIEF1dGggU2V0dGluZ3NcclxuICAgKi9cclxuICBwcml2YXRlIGFzeW5jIGxvZ2luKGNvbmZpZzogT2lkY0F1dGhTZXR0aW5ncyk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgY29uc3QgaXNWYWxpZCA9IHRoaXMudmFsaWRhdGVFeGlzdGluZ1Rva2VuQWdhaW5zdENvbmZpZ3MoKTtcclxuICAgIGNvbnN0IHByZXNlcnZlZFJvdXRlID0gdGhpcy53aW5kb3cuc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShwcmVTaWduSW5Sb3V0ZVN0b3JhZ2VLZXkpO1xyXG4gICAgaWYgKCFwcmVzZXJ2ZWRSb3V0ZSkge1xyXG4gICAgICB0aGlzLndpbmRvdy5zZXNzaW9uU3RvcmFnZS5zZXRJdGVtKHByZVNpZ25JblJvdXRlU3RvcmFnZUtleSwgdGhpcy5sb2NhdGlvbi5wYXRoKCkpO1xyXG4gICAgfVxyXG4gICAgaWYgKGNvbmZpZy5yZXF1aXJlTG9naW5PblN0YXJ0dXAgfHwgIWlzVmFsaWQpIHtcclxuICAgICAgcmV0dXJuIHRoaXMub0F1dGhTZXJ2aWNlLmxvYWREaXNjb3ZlcnlEb2N1bWVudEFuZExvZ2luKHtzdGF0ZTogdGhpcy5sb2NhdGlvbi5wYXRoKCl9KVxyXG4gICAgICAgIC8vIGhhbmRsZXMgdGhlIGNhc2UgZm9yIGV4cGlyZWQgYWNjZXNzIHRva2VuIG9yIGludmFsaWQgbm9uY2Ugb3IgcGVvcGxlIGJvb2ttYXJraW5nIHRoZSBpZHMgbG9naW4gcGFnZVxyXG4gICAgICAgIC5jYXRjaChhc3luYyAocmVzKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLm9BdXRoU2VydmljZS5pbml0TG9naW5GbG93KHRoaXMubG9jYXRpb24ucGF0aCgpKTtcclxuXHJcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRydWUpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHJldHVybiB0aGlzLm9BdXRoU2VydmljZS5sb2FkRGlzY292ZXJ5RG9jdW1lbnRBbmRUcnlMb2dpbigpXHJcbiAgICAgICAgLy8gaGFuZGxlcyB0aGUgY2FzZSBmb3IgZXhwaXJlZCBhY2Nlc3MgdG9rZW4gb3IgaW52YWxpZCBub25jZSBvciBwZW9wbGUgYm9va21hcmtpbmcgdGhlIGlkcyBsb2dpbiBwYWdlXHJcbiAgICAgICAgLmNhdGNoKGFzeW5jIChyZXMpID0+IHtcclxuICAgICAgICAgIHRoaXMub0F1dGhTZXJ2aWNlLmluaXRMb2dpbkZsb3coKTtcclxuXHJcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRydWUpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTWVyZ2VzIHRoZSB0d28gY29uZmlnIG9iamVjdHMgaWdub3JpbmcgdGhlIGFycmF5IHR5cGVcclxuICAgKiBAcGFyYW0gb2JqVmFsdWUgVGhlIGRlZmF1bHQgY29uZmlnIHZhbHVlXHJcbiAgICogQHBhcmFtIHNyY1ZhbHVlIFRoZSB0YXJnZXQgc3dpdGNoYm9hcmQgY29uZmlnIHZhbHVlXHJcbiAgICogQHJldHVybnMgVGhlIG1lcmdlIG9mIHRoZSB0d28gY29uZmlncyBwcm92aWRlZFxyXG4gICAqL1xyXG4gIHByaXZhdGUgbWVyZ2VDdXN0b21pemVyKG9ialZhbHVlOiBhbnksIHNyY1ZhbHVlOiBhbnkpOiBhbnkge1xyXG4gICAgaWYgKF8uaXNBcnJheShvYmpWYWx1ZSkgJiYgc3JjVmFsdWUpIHtcclxuICAgICAgcmV0dXJuIHNyY1ZhbHVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVmFsaWRhdGVzIHRoZSBleGlzdGluZyB0b2tlbiBhZ2FpbnN0IHRoZSBjb25maWd1cmF0aW9uc1xyXG4gICAqIEByZXR1cm5zIHRydWUgd2hlbiB0b2tlbiBpcyB2YWxpZFxyXG4gICAqL1xyXG4gIHByaXZhdGUgdmFsaWRhdGVFeGlzdGluZ1Rva2VuQWdhaW5zdENvbmZpZ3MoKTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcy5jb25maWdTZXJ2aWNlLmNvbmZpZy5vQXV0aFNldHRpbmdzLmRpc2FibGVTdGFydHVwVG9rZW5WYWxpZGF0aW9uKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgaWYgKCF0aGlzLndpbmRvdy5zZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCdhY2Nlc3NfdG9rZW4nKSkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIGNvbnN0IGdyYW50ZWRTY29wZXM6IEFycmF5PHN0cmluZz4gPSAgdGhpcy5vQXV0aFNlcnZpY2UuZ2V0R3JhbnRlZFNjb3BlcygpIGFzIEFycmF5PHN0cmluZz47XHJcbiAgICBjb25zdCBjb25maWd1cmVkU2NvcGVzID0gdGhpcy5jb25maWdTZXJ2aWNlLmNvbmZpZy5vQXV0aFNldHRpbmdzLnNjb3BlLnNwbGl0KCcgJyk7XHJcbiAgICBjb25zdCBkaWZmcyA9IGdyYW50ZWRTY29wZXMuZmlsdGVyKHggPT4gIWNvbmZpZ3VyZWRTY29wZXMuaW5jbHVkZXMoeCkpXHJcbiAgICAgIC5jb25jYXQoY29uZmlndXJlZFNjb3Blcy5maWx0ZXIoeCA9PiAhZ3JhbnRlZFNjb3Blcy5pbmNsdWRlcyh4KSkpO1xyXG4gICAgaWYgKGRpZmZzLmxlbmd0aCB8fCB0aGlzLm9BdXRoU2VydmljZS5nZXRJZGVudGl0eUNsYWltcygpWydhdWQnXSAhPT0gdGhpcy5jb25maWdTZXJ2aWNlLmNvbmZpZy5vQXV0aFNldHRpbmdzLmNsaWVudElkKSB7XHJcbiAgICAgIHRoaXMud2luZG93LnNlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oJ2FjY2Vzc190b2tlbicpO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8qKiBHZXR0aW5nIHRoZSBzdWJkb21haW4gZnJvbSB1cmwgKi9cclxuICBwcml2YXRlIGdldFN1YmRvbWFpbigpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgZG9tYWluID0gdGhpcy53aW5kb3cubG9jYXRpb24uaG9zdG5hbWU7XHJcbiAgICBpZiAoZG9tYWluLmluZGV4T2YoJy4nKSA8IDAgfHxcclxuICAgICAgZG9tYWluLnNwbGl0KCcuJylbMF0gPT09IHRoaXMuZXhhbXBsZVN1YmRvbWFpbiB8fCBkb21haW4uc3BsaXQoJy4nKVswXSA9PT0gdGhpcy5sdmhTdWJzdHJpbmcgfHwgZG9tYWluLnNwbGl0KCcuJylbMF0gPT09IHRoaXMud3d3U3Vic3RyaW5nKSB7XHJcbiAgICAgIHJldHVybiAnJztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBkb21haW4uc3BsaXQoJy4nKVswXTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIl19
1
+ import { Injectable, Optional, Inject } from '@angular/core';
2
+ import { AuthConfig } from 'angular-oauth2-oidc';
3
+ import { JwksValidationHandler } from 'angular-oauth2-oidc-jwks';
4
+ import * as _ from 'lodash';
5
+ import { BehaviorSubject, lastValueFrom, throwError } from 'rxjs';
6
+ import { languageStorageKey, preSignInRouteStorageKey, WINDOW } from '../models/constants';
7
+ import * as i0 from "@angular/core";
8
+ import * as i1 from "@angular/common/http";
9
+ import * as i2 from "@ngx-translate/core";
10
+ import * as i3 from "../../theming/services/theme.service";
11
+ import * as i4 from "../services/base-config.service";
12
+ import * as i5 from "angular-oauth2-oidc";
13
+ import * as i6 from "@angular/router";
14
+ import * as i7 from "@angular/common";
15
+ import * as i8 from "../services/custom-auth-config.service";
16
+ /**
17
+ * The startup service is used to call methods that should be run when initially loading the application
18
+ */
19
+ export class Initializer {
20
+ /** Gets the configurations */
21
+ get isInitialized() {
22
+ return this.isInitializedBs.value;
23
+ }
24
+ /**
25
+ * Constructs the startup service. Include any services that should be used during startup
26
+ * @param http The HTTP Client
27
+ * @param translateService The translate service
28
+ * @param themeService The theme service
29
+ * @param configService The configuration service
30
+ * @param oAuthService The oidc authorization service
31
+ * @param router The router
32
+ * @param location The location
33
+ * @param customAuthConfigService The service that will configure the auth config
34
+ */
35
+ constructor(http, translateService, themeService, configService, oAuthService, router, location, customAuthConfigService, _window) {
36
+ this.http = http;
37
+ this.translateService = translateService;
38
+ this.themeService = themeService;
39
+ this.configService = configService;
40
+ this.oAuthService = oAuthService;
41
+ this.router = router;
42
+ this.location = location;
43
+ this.customAuthConfigService = customAuthConfigService;
44
+ this._window = _window;
45
+ /** The configuration behavior subject */
46
+ this.isInitializedBs = new BehaviorSubject(false);
47
+ /** The example the subdomain substring */
48
+ this.exampleSubdomain = 'example';
49
+ /** The www substring for subdomain route finding */
50
+ this.wwwSubstring = 'www';
51
+ /** The lvh substring for subdomain route finding */
52
+ this.lvhSubstring = 'lvh';
53
+ this.isInitialized$ = this.isInitializedBs.asObservable();
54
+ this.window = _window || window;
55
+ }
56
+ /**
57
+ * Loads all data that is needed upon initial loading of the website
58
+ */
59
+ async initialize() {
60
+ // reads the language from local storage set in the parent app
61
+ // language loading
62
+ // Set languages for translation service
63
+ const lang = this.window.localStorage.getItem(languageStorageKey) || this.window.sessionStorage.getItem(languageStorageKey) || 'en';
64
+ this.translateService.setDefaultLang(lang);
65
+ this.translateService.use(lang);
66
+ // Adapted from https://stackoverflow.com/a/41636880
67
+ // Adapted from https://stackoverflow.com/a/41736293
68
+ // A callback used to initialize the promise. This callback is passed two arguments:
69
+ // a resolve callback used resolve the promise with a value or the result of another promise,
70
+ // and a reject callback used to reject the promise with a provided reason or error.
71
+ return new Promise(async (resolve, reject) => {
72
+ // Go through all services and complete any API calls necessary.
73
+ // At the end, if all works and loads as expected, resolve the promise and set startup success to true.
74
+ // If an issue is encountered, you can call reject() to hit the catch() code below.
75
+ // First, load the configurations
76
+ let [baseConfig, overrideConfig, baseLang, overrideLang, theme] = [JSON, JSON, JSON, JSON, JSON];
77
+ try {
78
+ [baseConfig, overrideConfig, baseLang, overrideLang, theme] = await Promise.all([
79
+ this.http.get('./assets/baseline/appsettings.json').toPromise(),
80
+ this.http.get('./assets/configurations/appsettings.json').toPromise(),
81
+ this.http.get(`./assets/i18n/${this.translateService.currentLang}.json`).toPromise(),
82
+ this.http.get(`./assets/configurations/${this.translateService.currentLang}.json`).toPromise(),
83
+ this.http.get('./assets/configurations/theme.json').toPromise()
84
+ ]);
85
+ this.configService.config = _.mergeWith(baseConfig, overrideConfig, this.mergeCustomizer);
86
+ const mergedLanguage = _.mergeWith(baseLang, overrideLang, this.mergeCustomizer);
87
+ this.translateService.setTranslation(this.translateService.currentLang, mergedLanguage);
88
+ const configurePartial = (t) => {
89
+ const configSnapShot = this.configService.config;
90
+ configSnapShot.theme = t;
91
+ this.configService.config = configSnapShot;
92
+ this.themeService.initPalette(t);
93
+ };
94
+ const subdomain = this.getSubdomain();
95
+ if (subdomain && this.configService.config.subdomain) {
96
+ try {
97
+ let [subdomainConfigs, subdomainLanguage, subdomainTheme] = await Promise.all([
98
+ lastValueFrom(this.http.get(`./assets/configurations/${subdomain}.${this.translateService.currentLang}.json`)),
99
+ lastValueFrom(this.http.get(`./assets/configurations/${subdomain}.appsettings.json`)),
100
+ lastValueFrom(this.http.get(`./assets/configurations/${subdomain}.theme.json`))
101
+ ]);
102
+ this.configService.config = _.mergeWith(this.configService.config, subdomainConfigs, this.mergeCustomizer);
103
+ this.translateService.setTranslation(this.translateService.currentLang, _.mergeWith(mergedLanguage, subdomainLanguage, this.mergeCustomizer));
104
+ const mergedTheme = _.mergeWith(theme, subdomainTheme, this.mergeCustomizer);
105
+ configurePartial(mergedTheme);
106
+ }
107
+ catch (e) {
108
+ if (this.configService.config.subdomain && this.configService.config.subdomain.subdomains.length && !this.configService.config.subdomain.subdomains.includes(subdomain)) {
109
+ this.router.dispose();
110
+ const error = `Invalid subdomain: ${subdomain}`;
111
+ console.error(error);
112
+ throw new Error(error);
113
+ }
114
+ else if (this.configService.config.subdomain?.requireConfiguredSubdomain && this.configService.config.subdomain?.subdomains.includes(subdomain)) {
115
+ this.router.dispose();
116
+ const error = `Configured subdomain: ${subdomain} does not have any subdomain specific configurations`;
117
+ reject(error);
118
+ console.error(error);
119
+ throw new Error(error);
120
+ }
121
+ configurePartial(theme);
122
+ }
123
+ }
124
+ else {
125
+ configurePartial(theme);
126
+ }
127
+ }
128
+ catch (error) {
129
+ // Catch any errors during the get configurations API call
130
+ console.error('Error Loading Configurations or Languages');
131
+ // Reject the promise
132
+ reject('error');
133
+ return throwError(error.error || 'Server error');
134
+ }
135
+ try {
136
+ if (this.customAuthConfigService) {
137
+ await this.customAuthConfigService.configureAuthSettings().then(authConfig => {
138
+ if (authConfig) {
139
+ const config = this.configService.config.oAuthSettings;
140
+ return this.login(config);
141
+ }
142
+ else {
143
+ return Promise.resolve(false);
144
+ }
145
+ });
146
+ }
147
+ else {
148
+ const oAuth = await this.setUpOAuth();
149
+ }
150
+ }
151
+ catch (error) {
152
+ reject(error);
153
+ return throwError(error);
154
+ }
155
+ // Navigate to the requested route
156
+ if (this.configService.config.oAuthSettings?.preserveRoute) {
157
+ this.router.navigateByUrl(this.oAuthService.state);
158
+ }
159
+ this.isInitializedBs.next(true);
160
+ resolve(true);
161
+ }).catch((error) => {
162
+ // Catch the error
163
+ console.error('There was an error loading the startup configurations.');
164
+ });
165
+ }
166
+ /**
167
+ * Configure implicit flow
168
+ */
169
+ async setUpOAuth() {
170
+ if (this.configService.config?.oAuthSettings?.issuer) {
171
+ const config = this.configService.config.oAuthSettings;
172
+ const authConfig = new AuthConfig({
173
+ clientId: config.clientId,
174
+ redirectUri: config.redirectUri,
175
+ issuer: config.issuer,
176
+ scope: config.scope,
177
+ skipIssuerCheck: config.skipIssuerCheck != undefined ? config.skipIssuerCheck : true,
178
+ timeoutFactor: config.timeoutFactor || 0.75,
179
+ postLogoutRedirectUri: config.postLogoutRedirectUri,
180
+ loginUrl: config.loginUrl,
181
+ strictDiscoveryDocumentValidation: false,
182
+ responseType: config.responseType || 'code'
183
+ });
184
+ this.oAuthService.configure(authConfig);
185
+ this.oAuthService.skipIssuerCheck = true;
186
+ this.oAuthService.responseType = config.responseType || 'code';
187
+ this.oAuthService.strictDiscoveryDocumentValidation = false;
188
+ this.oAuthService.tokenValidationHandler = new JwksValidationHandler();
189
+ this.oAuthService.timeoutFactor = 0.75;
190
+ this.oAuthService.setupAutomaticSilentRefresh({}, 'access_token');
191
+ // set initialized on start up to true
192
+ config.authSetOnStartup = true;
193
+ const parentConfig = this.configService.config;
194
+ parentConfig.oAuthSettings = config;
195
+ this.configService.config = parentConfig;
196
+ return this.login(config);
197
+ }
198
+ return Promise.resolve(true);
199
+ }
200
+ /**
201
+ * Handle Login
202
+ * @param config The Oidc Auth Settings
203
+ */
204
+ async login(config) {
205
+ const isValid = this.validateExistingTokenAgainstConfigs();
206
+ const preservedRoute = this.window.sessionStorage.getItem(preSignInRouteStorageKey);
207
+ if (!preservedRoute) {
208
+ this.window.sessionStorage.setItem(preSignInRouteStorageKey, this.location.path());
209
+ }
210
+ if (config.requireLoginOnStartup || !isValid) {
211
+ return this.oAuthService.loadDiscoveryDocumentAndLogin({ state: this.location.path() })
212
+ // handles the case for expired access token or invalid nonce or people bookmarking the ids login page
213
+ .catch(async (res) => {
214
+ this.oAuthService.initLoginFlow(this.location.path());
215
+ return Promise.resolve(true);
216
+ });
217
+ }
218
+ else {
219
+ return this.oAuthService.loadDiscoveryDocumentAndTryLogin()
220
+ // handles the case for expired access token or invalid nonce or people bookmarking the ids login page
221
+ .catch(async (res) => {
222
+ this.oAuthService.initLoginFlow();
223
+ return Promise.resolve(true);
224
+ });
225
+ }
226
+ }
227
+ /**
228
+ * Merges the two config objects ignoring the array type
229
+ * @param objValue The default config value
230
+ * @param srcValue The target switchboard config value
231
+ * @returns The merge of the two configs provided
232
+ */
233
+ mergeCustomizer(objValue, srcValue) {
234
+ if (_.isArray(objValue) && srcValue) {
235
+ return srcValue;
236
+ }
237
+ }
238
+ /**
239
+ * Validates the existing token against the configurations
240
+ * @returns true when token is valid
241
+ */
242
+ validateExistingTokenAgainstConfigs() {
243
+ if (this.configService.config.oAuthSettings.disableStartupTokenValidation) {
244
+ return true;
245
+ }
246
+ if (!this.window.sessionStorage.getItem('access_token')) {
247
+ return true;
248
+ }
249
+ const grantedScopes = this.oAuthService.getGrantedScopes();
250
+ const configuredScopes = this.configService.config.oAuthSettings.scope.split(' ');
251
+ const diffs = grantedScopes.filter(x => !configuredScopes.includes(x))
252
+ .concat(configuredScopes.filter(x => !grantedScopes.includes(x)));
253
+ if (diffs.length || this.oAuthService.getIdentityClaims()['aud'] !== this.configService.config.oAuthSettings.clientId) {
254
+ this.window.sessionStorage.removeItem('access_token');
255
+ return false;
256
+ }
257
+ return true;
258
+ }
259
+ /** Getting the subdomain from url */
260
+ getSubdomain() {
261
+ const domain = this.window.location.hostname;
262
+ if (domain.indexOf('.') < 0 ||
263
+ domain.split('.')[0] === this.exampleSubdomain || domain.split('.')[0] === this.lvhSubstring || domain.split('.')[0] === this.wwwSubstring) {
264
+ return '';
265
+ }
266
+ else {
267
+ return domain.split('.')[0];
268
+ }
269
+ }
270
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: Initializer, deps: [{ token: i1.HttpClient }, { token: i2.TranslateService }, { token: i3.ThemeService }, { token: i4.BaseConfigService }, { token: i5.OAuthService }, { token: i6.Router }, { token: i7.Location }, { token: i8.CustomAuthConfigService, optional: true }, { token: WINDOW, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
271
+ static { thisprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: Initializer, providedIn: 'root' }); }
272
+ }
273
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: Initializer, decorators: [{
274
+ type: Injectable,
275
+ args: [{
276
+ providedIn: 'root'
277
+ }]
278
+ }], ctorParameters: () => [{ type: i1.HttpClient }, { type: i2.TranslateService }, { type: i3.ThemeService }, { type: i4.BaseConfigService }, { type: i5.OAuthService }, { type: i6.Router }, { type: i7.Location }, { type: i8.CustomAuthConfigService, decorators: [{
279
+ type: Optional
280
+ }] }, { type: undefined, decorators: [{
281
+ type: Optional
282
+ }, {
283
+ type: Inject,
284
+ args: [WINDOW]
285
+ }] }] });
286
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5pdGlhbGl6ZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FybWF0dXJlL3NyYy9saWIvY29yZS9pbml0aWFsaXplci9pbml0aWFsaXplci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUc3RCxPQUFPLEVBQUUsVUFBVSxFQUFnQixNQUFNLHFCQUFxQixDQUFDO0FBQy9ELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ2pFLE9BQU8sS0FBSyxDQUFDLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFjLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUc5RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxFQUFFLE1BQU0scUJBQXFCLENBQUM7Ozs7Ozs7Ozs7QUFPM0Y7O0dBRUc7QUFNSCxNQUFNLE9BQU8sV0FBVztJQWlCdEIsOEJBQThCO0lBQzlCLElBQVcsYUFBYTtRQUN0QixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDO0lBQ3BDLENBQUM7SUFLRDs7Ozs7Ozs7OztPQVVHO0lBQ0gsWUFDbUIsSUFBZ0IsRUFDaEIsZ0JBQWtDLEVBQ2xDLFlBQTBCLEVBQzFCLGFBQWdDLEVBQ2hDLFlBQTBCLEVBQzFCLE1BQWMsRUFDZCxRQUFrQixFQUNOLHVCQUFnRCxFQUN4QyxPQUFZO1FBUmhDLFNBQUksR0FBSixJQUFJLENBQVk7UUFDaEIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUNsQyxpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUMxQixrQkFBYSxHQUFiLGFBQWEsQ0FBbUI7UUFDaEMsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsV0FB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QUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsZ0JBQWdCLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsWUFBWSxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLFlBQVksRUFBRTtZQUM1SSxPQUFPLEVBQUUsQ0FBQztTQUNYO2FBQU07WUFDTCxPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDN0I7SUFDSCxDQUFDOzhHQTNSVSxXQUFXLDBRQTZDQSxNQUFNO2tIQTdDakIsV0FBVyxjQUhSLE1BQU07OzJGQUdULFdBQVc7a0JBTHZCLFVBQVU7bUJBQ1Q7b0JBQ0UsVUFBVSxFQUFFLE1BQU07aUJBQ25COzswQkE4Q0UsUUFBUTs7MEJBQ1IsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgSW5qZWN0YWJsZSwgT3B0aW9uYWwsIEluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xyXG5pbXBvcnQgeyBBdXRoQ29uZmlnLCBPQXV0aFNlcnZpY2UgfSBmcm9tICdhbmd1bGFyLW9hdXRoMi1vaWRjJztcclxuaW1wb3J0IHsgSndrc1ZhbGlkYXRpb25IYW5kbGVyIH0gZnJvbSAnYW5ndWxhci1vYXV0aDItb2lkYy1qd2tzJztcclxuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xyXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGxhc3RWYWx1ZUZyb20sIE9ic2VydmFibGUsIHRocm93RXJyb3IgfSBmcm9tICdyeGpzJztcclxuXHJcbmltcG9ydCB7IFRoZW1lU2VydmljZSB9IGZyb20gJy4uLy4uL3RoZW1pbmcvc2VydmljZXMvdGhlbWUuc2VydmljZSc7XHJcbmltcG9ydCB7IGxhbmd1YWdlU3RvcmFnZUtleSwgcHJlU2lnbkluUm91dGVTdG9yYWdlS2V5LCBXSU5ET1cgfSBmcm9tICcuLi9tb2RlbHMvY29uc3RhbnRzJztcclxuaW1wb3J0IHsgT2lkY0F1dGhTZXR0aW5ncyB9IGZyb20gJy4uL21vZGVscy9vaWRjLWF1dGgtc2V0dGluZ3MnO1xyXG5pbXBvcnQgeyBCYXNlQ29uZmlnU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2Jhc2UtY29uZmlnLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDdXN0b21BdXRoQ29uZmlnU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2N1c3RvbS1hdXRoLWNvbmZpZy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuaW1wb3J0IHsgTG9jYXRpb24gfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5cclxuLyoqXHJcbiAqIFRoZSBzdGFydHVwIHNlcnZpY2UgaXMgdXNlZCB0byBjYWxsIG1ldGhvZHMgdGhhdCBzaG91bGQgYmUgcnVuIHdoZW4gaW5pdGlhbGx5IGxvYWRpbmcgdGhlIGFwcGxpY2F0aW9uXHJcbiAqL1xyXG5ASW5qZWN0YWJsZShcclxuICB7XHJcbiAgICBwcm92aWRlZEluOiAncm9vdCdcclxuICB9XHJcbilcclxuZXhwb3J0IGNsYXNzIEluaXRpYWxpemVyIHtcclxuXHJcbiAgLyoqIFRoZSBjb25maWd1cmF0aW9uIGJlaGF2aW9yIHN1YmplY3QgKi9cclxuICBwcml2YXRlIHJlYWRvbmx5IGlzSW5pdGlhbGl6ZWRCczogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XHJcblxyXG4gIC8qKiBUaGUgYnJvd3NlciB3aW5kb3cgKi9cclxuICBwcml2YXRlIHJlYWRvbmx5IHdpbmRvdzogV2luZG93O1xyXG5cclxuICAvKiogVGhlIGV4YW1wbGUgdGhlIHN1YmRvbWFpbiBzdWJzdHJpbmcgKi9cclxuICBwcml2YXRlIHJlYWRvbmx5IGV4YW1wbGVTdWJkb21haW46IHN0cmluZyA9ICdleGFtcGxlJztcclxuXHJcbiAgLyoqIFRoZSB3d3cgc3Vic3RyaW5nIGZvciBzdWJkb21haW4gcm91dGUgZmluZGluZyAqL1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgd3d3U3Vic3RyaW5nOiBzdHJpbmcgPSAnd3d3JztcclxuXHJcbiAgLyoqIFRoZSBsdmggc3Vic3RyaW5nIGZvciBzdWJkb21haW4gcm91dGUgZmluZGluZyAqL1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgbHZoU3Vic3RyaW5nOiBzdHJpbmcgPSAnbHZoJ1xyXG5cclxuICAvKiogR2V0cyB0aGUgY29uZmlndXJhdGlvbnMgKi9cclxuICBwdWJsaWMgZ2V0IGlzSW5pdGlhbGl6ZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5pc0luaXRpYWxpemVkQnMudmFsdWU7XHJcbiAgfVxyXG5cclxuICAvKiogVGhlIGNvbmZpZ3VyYXRpb24gb2JzZXJ2YWJsZSAqL1xyXG4gIHB1YmxpYyByZWFkb25seSBpc0luaXRpYWxpemVkJDogT2JzZXJ2YWJsZTxib29sZWFuPjtcclxuXHJcbiAgLyoqXHJcbiAgICogQ29uc3RydWN0cyB0aGUgc3RhcnR1cCBzZXJ2aWNlLiBJbmNsdWRlIGFueSBzZXJ2aWNlcyB0aGF0IHNob3VsZCBiZSB1c2VkIGR1cmluZyBzdGFydHVwXHJcbiAgICogQHBhcmFtIGh0dHAgVGhlIEhUVFAgQ2xpZW50XHJcbiAgICogQHBhcmFtIHRyYW5zbGF0ZVNlcnZpY2UgVGhlIHRyYW5zbGF0ZSBzZXJ2aWNlXHJcbiAgICogQHBhcmFtIHRoZW1lU2VydmljZSBUaGUgdGhlbWUgc2VydmljZVxyXG4gICAqIEBwYXJhbSBjb25maWdTZXJ2aWNlIFRoZSBjb25maWd1cmF0aW9uIHNlcnZpY2VcclxuICAgKiBAcGFyYW0gb0F1dGhTZXJ2aWNlIFRoZSBvaWRjIGF1dGhvcml6YXRpb24gc2VydmljZVxyXG4gICAqIEBwYXJhbSByb3V0ZXIgVGhlIHJvdXRlclxyXG4gICAqIEBwYXJhbSBsb2NhdGlvbiBUaGUgbG9jYXRpb25cclxuICAgKiBAcGFyYW0gY3VzdG9tQXV0aENvbmZpZ1NlcnZpY2UgVGhlIHNlcnZpY2UgdGhhdCB3aWxsIGNvbmZpZ3VyZSB0aGUgYXV0aCBjb25maWdcclxuICAgKi9cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgaHR0cDogSHR0cENsaWVudCxcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgdHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZSxcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgdGhlbWVTZXJ2aWNlOiBUaGVtZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZ1NlcnZpY2U6IEJhc2VDb25maWdTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBvQXV0aFNlcnZpY2U6IE9BdXRoU2VydmljZSxcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgcm91dGVyOiBSb3V0ZXIsXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGxvY2F0aW9uOiBMb2NhdGlvbixcclxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgcmVhZG9ubHkgY3VzdG9tQXV0aENvbmZpZ1NlcnZpY2U6IEN1c3RvbUF1dGhDb25maWdTZXJ2aWNlLFxyXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChXSU5ET1cpIHJlYWRvbmx5IF93aW5kb3c6IGFueVxyXG4gICkge1xyXG4gICAgdGhpcy5pc0luaXRpYWxpemVkJCA9IHRoaXMuaXNJbml0aWFsaXplZEJzLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgdGhpcy53aW5kb3cgPSBfd2luZG93IHx8IHdpbmRvdztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIExvYWRzIGFsbCBkYXRhIHRoYXQgaXMgbmVlZGVkIHVwb24gaW5pdGlhbCBsb2FkaW5nIG9mIHRoZSB3ZWJzaXRlXHJcbiAgICovXHJcbiAgcHVibGljIGFzeW5jIGluaXRpYWxpemUoKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIC8vIHJlYWRzIHRoZSBsYW5ndWFnZSBmcm9tIGxvY2FsIHN0b3JhZ2Ugc2V0IGluIHRoZSBwYXJlbnQgYXBwXHJcbiAgICAvLyBsYW5ndWFnZSBsb2FkaW5nXHJcblxyXG4gICAgLy8gU2V0IGxhbmd1YWdlcyBmb3IgdHJhbnNsYXRpb24gc2VydmljZVxyXG4gICAgY29uc3QgbGFuZyA9IHRoaXMud2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKGxhbmd1YWdlU3RvcmFnZUtleSkgfHwgdGhpcy53aW5kb3cuc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShsYW5ndWFnZVN0b3JhZ2VLZXkpIHx8ICdlbic7XHJcbiAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2Uuc2V0RGVmYXVsdExhbmcobGFuZyk7XHJcbiAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UudXNlKGxhbmcpO1xyXG5cclxuICAgIC8vIEFkYXB0ZWQgZnJvbSBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvNDE2MzY4ODBcclxuICAgIC8vIEFkYXB0ZWQgZnJvbSBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvNDE3MzYyOTNcclxuXHJcbiAgICAvLyBBIGNhbGxiYWNrIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgcHJvbWlzZS4gVGhpcyBjYWxsYmFjayBpcyBwYXNzZWQgdHdvIGFyZ3VtZW50czpcclxuICAgIC8vIGEgcmVzb2x2ZSBjYWxsYmFjayB1c2VkIHJlc29sdmUgdGhlIHByb21pc2Ugd2l0aCBhIHZhbHVlIG9yIHRoZSByZXN1bHQgb2YgYW5vdGhlciBwcm9taXNlLFxyXG4gICAgLy8gYW5kIGEgcmVqZWN0IGNhbGxiYWNrIHVzZWQgdG8gcmVqZWN0IHRoZSBwcm9taXNlIHdpdGggYSBwcm92aWRlZCByZWFzb24gb3IgZXJyb3IuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAvLyBHbyB0aHJvdWdoIGFsbCBzZXJ2aWNlcyBhbmQgY29tcGxldGUgYW55IEFQSSBjYWxscyBuZWNlc3NhcnkuXHJcbiAgICAgIC8vIEF0IHRoZSBlbmQsIGlmIGFsbCB3b3JrcyBhbmQgbG9hZHMgYXMgZXhwZWN0ZWQsIHJlc29sdmUgdGhlIHByb21pc2UgYW5kIHNldCBzdGFydHVwIHN1Y2Nlc3MgdG8gdHJ1ZS5cclxuICAgICAgLy8gSWYgYW4gaXNzdWUgaXMgZW5jb3VudGVyZWQsIHlvdSBjYW4gY2FsbCByZWplY3QoKSB0byBoaXQgdGhlIGNhdGNoKCkgY29kZSBiZWxvdy5cclxuXHJcbiAgICAgIC8vIEZpcnN0LCBsb2FkIHRoZSBjb25maWd1cmF0aW9uc1xyXG4gICAgICBsZXQgW2Jhc2VDb25maWcsIG92ZXJyaWRlQ29uZmlnLCBiYXNlTGFuZywgb3ZlcnJpZGVMYW5nLCB0aGVtZV0gPSBbSlNPTiwgSlNPTiwgSlNPTiwgSlNPTiwgSlNPTl07XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgW2Jhc2VDb25maWcsIG92ZXJyaWRlQ29uZmlnLCBiYXNlTGFuZywgb3ZlcnJpZGVMYW5nLCB0aGVtZV0gPSBhd2FpdCBQcm9taXNlLmFsbChbXHJcbiAgICAgICAgICB0aGlzLmh0dHAuZ2V0PEpTT04+KCcuL2Fzc2V0cy9iYXNlbGluZS9hcHBzZXR0aW5ncy5qc29uJykudG9Qcm9taXNlKCksXHJcbiAgICAgICAgICB0aGlzLmh0dHAuZ2V0PEpTT04+KCcuL2Fzc2V0cy9jb25maWd1cmF0aW9ucy9hcHBzZXR0aW5ncy5qc29uJykudG9Qcm9taXNlKCksXHJcbiAgICAgICAgICB0aGlzLmh0dHAuZ2V0PEpTT04+KGAuL2Fzc2V0cy9pMThuLyR7dGhpcy50cmFuc2xhdGVTZXJ2aWNlLmN1cnJlbnRMYW5nfS5qc29uYCkudG9Qcm9taXNlKCksXHJcbiAgICAgICAgICB0aGlzLmh0dHAuZ2V0PEpTT04+KGAuL2Fzc2V0cy9jb25maWd1cmF0aW9ucy8ke3RoaXMudHJhbnNsYXRlU2VydmljZS5jdXJyZW50TGFuZ30uanNvbmApLnRvUHJvbWlzZSgpLFxyXG4gICAgICAgICAgdGhpcy5odHRwLmdldDxKU09OPignLi9hc3NldHMvY29uZmlndXJhdGlvbnMvdGhlbWUuanNvbicpLnRvUHJvbWlzZSgpXHJcbiAgICAgICAgXSk7XHJcbiAgICAgICAgdGhpcy5jb25maWdTZXJ2aWNlLmNvbmZpZyA9IF8ubWVyZ2VXaXRoKGJhc2VDb25maWcsIG92ZXJyaWRlQ29uZmlnLCB0aGlzLm1lcmdlQ3VzdG9taXplcik7XHJcbiAgICAgICAgY29uc3QgbWVyZ2VkTGFuZ3VhZ2UgPSBfLm1lcmdlV2l0aChiYXNlTGFuZywgb3ZlcnJpZGVMYW5nLCB0aGlzLm1lcmdlQ3VzdG9taXplcik7XHJcbiAgICAgICAgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLnNldFRyYW5zbGF0aW9uKHRoaXMudHJhbnNsYXRlU2VydmljZS5jdXJyZW50TGFuZywgbWVyZ2VkTGFuZ3VhZ2UpO1xyXG5cclxuICAgICAgICBjb25zdCBjb25maWd1cmVQYXJ0aWFsID0gKHQpID0+IHtcclxuICAgICAgICAgIGNvbnN0IGNvbmZpZ1NuYXBTaG90ID0gdGhpcy5jb25maWdTZXJ2aWNlLmNvbmZpZztcclxuICAgICAgICAgIGNvbmZpZ1NuYXBTaG90LnRoZW1lID0gdCBhcyBhbnk7XHJcbiAgICAgICAgICB0aGlzLmNvbmZpZ1NlcnZpY2UuY29uZmlnID0gY29uZmlnU25hcFNob3Q7XHJcbiAgICAgICAgICB0aGlzLnRoZW1lU2VydmljZS5pbml0UGFsZXR0ZSh0IGFzIGFueSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHN1YmRvbWFpbiA9IHRoaXMuZ2V0U3ViZG9tYWluKCk7XHJcbiAgICAgICAgaWYgKHN1YmRvbWFpbiAmJiB0aGlzLmNvbmZpZ1NlcnZpY2UuY29uZmlnLnN1YmRvbWFpbikge1xyXG4gICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgbGV0IFtzdWJkb21haW5Db25maWdzLCBzdWJkb21haW5MYW5ndWFnZSwgc3ViZG9tYWluVGhlbWVdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xyXG4gICAgICAgICAgICAgIGxhc3RWYWx1ZUZyb20odGhpcy5odHRwLmdldDxKU09OPihgLi9hc3NldHMvY29uZmlndXJhdGlvbnMvJHtzdWJkb21haW59LiR7dGhpcy50cmFuc2xhdGVTZXJ2aWNlLmN1cnJlbnRMYW5nfS5qc29uYCkpLFxyXG4gICAgICAgICAgICAgIGxhc3RWYWx1ZUZyb20odGhpcy5odHRwLmdldDxKU09OPihgLi9hc3NldHMvY29uZmlndXJhdGlvbnMvJHtzdWJkb21haW59LmFwcHNldHRpbmdzLmpzb25gKSksXHJcbiAgICAgICAgICAgICAgbGFzdFZhbHVlRnJvbSh0aGlzLmh0dHAuZ2V0PEpTT04+KGAuL2Fzc2V0cy9jb25maWd1cmF0aW9ucy8ke3N1YmRvbWFpbn0udGhlbWUuanNvbmApKVxyXG4gICAgICAgICAgICBdKTtcclxuICAgICAgICAgICAgdGhpcy5jb25maWdTZXJ2aWNlLmNvbmZpZyA9IF8ubWVyZ2VXaXRoKHRoaXMuY29uZmlnU2VydmljZS5jb25maWcsIHN1YmRvbWFpbkNvbmZpZ3MsIHRoaXMubWVyZ2VDdXN0b21pemVyKTtcclxuICAgICAgICAgICAgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLnNldFRyYW5zbGF0aW9uKHRoaXMudHJhbnNsYXRlU2VydmljZS5jdXJyZW50TGFuZywgXy5tZXJnZVdpdGgobWVyZ2VkTGFuZ3VhZ2UsIHN1YmRvbWFpbkxhbmd1YWdlLCB0aGlzLm1lcmdlQ3VzdG9taXplcikpO1xyXG4gICAgICAgICAgICBjb25zdCBtZXJnZWRUaGVtZSA9IF8ubWVyZ2VXaXRoKHRoZW1lLCBzdWJkb21haW5UaGVtZSwgdGhpcy5tZXJnZUN1c3RvbWl6ZXIpO1xyXG4gICAgICAgICAgICBjb25maWd1cmVQYXJ0aWFsKG1lcmdlZFRoZW1lKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbmZpZ1NlcnZpY2UuY29uZmlnLnN1YmRvbWFpbiAmJiB0aGlzLmNvbmZpZ1NlcnZpY2UuY29uZmlnLnN1YmRvbWFpbi5zdWJkb21haW5zLmxlbmd0aCAmJiAhdGhpcy5jb25maWdTZXJ2aWNlLmNvbmZpZy5zdWJkb21haW4uc3ViZG9tYWlucy5pbmNsdWRlcyhzdWJkb21haW4pKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5yb3V0ZXIuZGlzcG9zZSgpO1xyXG4gICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gYEludmFsaWQgc3ViZG9tYWluOiAke3N1YmRvbWFpbn1gO1xyXG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xyXG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5jb25maWdTZXJ2aWNlLmNvbmZpZy5zdWJkb21haW4/LnJlcXVpcmVDb25maWd1cmVkU3ViZG9tYWluICYmIHRoaXMuY29uZmlnU2VydmljZS5jb25maWcuc3ViZG9tYWluPy5zdWJkb21haW5zLmluY2x1ZGVzKHN1YmRvbWFpbikpIHtcclxuICAgICAgICAgICAgICB0aGlzLnJvdXRlci5kaXNwb3NlKCk7XHJcbiAgICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBgQ29uZmlndXJlZCBzdWJkb21haW46ICR7c3ViZG9tYWlufSBkb2VzIG5vdCBoYXZlIGFueSBzdWJkb21haW4gc3BlY2lmaWMgY29uZmlndXJhdGlvbnNgO1xyXG4gICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XHJcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XHJcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25maWd1cmVQYXJ0aWFsKHRoZW1lKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBjb25maWd1cmVQYXJ0aWFsKHRoZW1lKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgLy8gQ2F0Y2ggYW55IGVycm9ycyBkdXJpbmcgdGhlIGdldCBjb25maWd1cmF0aW9ucyBBUEkgY2FsbFxyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIExvYWRpbmcgQ29uZmlndXJhdGlvbnMgb3IgTGFuZ3VhZ2VzJyk7XHJcbiAgICAgICAgLy8gUmVqZWN0IHRoZSBwcm9taXNlXHJcbiAgICAgICAgcmVqZWN0KCdlcnJvcicpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhyb3dFcnJvcihlcnJvci5lcnJvciB8fCAnU2VydmVyIGVycm9yJyk7XHJcbiAgICAgIH1cclxuICAgICAgdHJ5IHtcclxuICAgICAgICBpZiAodGhpcy5jdXN0b21BdXRoQ29uZmlnU2VydmljZSkge1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy5jdXN0b21BdXRoQ29uZmlnU2VydmljZS5jb25maWd1cmVBdXRoU2V0dGluZ3MoKS50aGVuKGF1dGhDb25maWcgPT4ge1xyXG4gICAgICAgICAgICBpZiAoYXV0aENvbmZpZykge1xyXG4gICAgICAgICAgICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuY29uZmlnU2VydmljZS5jb25maWcub0F1dGhTZXR0aW5ncztcclxuXHJcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9naW4oY29uZmlnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgY29uc3Qgb0F1dGggPSBhd2FpdCB0aGlzLnNldFVwT0F1dGgoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgcmVqZWN0KGVycm9yKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoZXJyb3IpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBOYXZpZ2F0ZSB0byB0aGUgcmVxdWVzdGVkIHJvdXRlXHJcbiAgICAgIGlmICh0aGlzLmNvbmZpZ1NlcnZpY2UuY29uZmlnLm9BdXRoU2V0dGluZ3M/LnByZXNlcnZlUm91dGUpIHtcclxuICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZUJ5VXJsKHRoaXMub0F1dGhTZXJ2aWNlLnN0YXRlKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5pc0luaXRpYWxpemVkQnMubmV4dCh0cnVlKTtcclxuICAgICAgcmVzb2x2ZSh0cnVlKTtcclxuICAgIH0pLmNhdGNoKChlcnJvcikgPT4ge1xyXG4gICAgICAvLyBDYXRjaCB0aGUgZXJyb3JcclxuICAgICAgY29uc29sZS5lcnJvcignVGhlcmUgd2FzIGFuIGVycm9yIGxvYWRpbmcgdGhlIHN0YXJ0dXAgY29uZmlndXJhdGlvbnMuJyk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENvbmZpZ3VyZSBpbXBsaWNpdCBmbG93XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhc3luYyBzZXRVcE9BdXRoKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgaWYgKHRoaXMuY29uZmlnU2VydmljZS5jb25maWc/Lm9BdXRoU2V0dGluZ3M/Lmlzc3Vlcikge1xyXG4gICAgICBjb25zdCBjb25maWcgPSB0aGlzLmNvbmZpZ1NlcnZpY2UuY29uZmlnLm9BdXRoU2V0dGluZ3M7XHJcbiAgICAgIGNvbnN0IGF1dGhDb25maWcgPSBuZXcgQXV0aENvbmZpZyh7XHJcbiAgICAgICAgY2xpZW50SWQ6IGNvbmZpZy5jbGllbnRJZCxcclxuICAgICAgICByZWRpcmVjdFVyaTogY29uZmlnLnJlZGlyZWN0VXJpLFxyXG4gICAgICAgIGlzc3VlcjogY29uZmlnLmlzc3VlcixcclxuICAgICAgICBzY29wZTogY29uZmlnLnNjb3BlLFxyXG4gICAgICAgIHNraXBJc3N1ZXJDaGVjazogY29uZmlnLnNraXBJc3N1ZXJDaGVjayAhPSB1bmRlZmluZWQgPyBjb25maWcuc2tpcElzc3VlckNoZWNrIDogdHJ1ZSxcclxuICAgICAgICB0aW1lb3V0RmFjdG9yOiBjb25maWcudGltZW91dEZhY3RvciB8fCAwLjc1LFxyXG4gICAgICAgIHBvc3RMb2dvdXRSZWRpcmVjdFVyaTogY29uZmlnLnBvc3RMb2dvdXRSZWRpcmVjdFVyaSxcclxuICAgICAgICBsb2dpblVybDogY29uZmlnLmxvZ2luVXJsLFxyXG4gICAgICAgIHN0cmljdERpc2NvdmVyeURvY3VtZW50VmFsaWRhdGlvbjogZmFsc2UsXHJcbiAgICAgICAgcmVzcG9uc2VUeXBlOiBjb25maWcucmVzcG9uc2VUeXBlIHx8ICdjb2RlJ1xyXG4gICAgICB9KTtcclxuICAgICAgdGhpcy5vQXV0aFNlcnZpY2UuY29uZmlndXJlKGF1dGhDb25maWcpO1xyXG4gICAgICB0aGlzLm9BdXRoU2VydmljZS5za2lwSXNzdWVyQ2hlY2sgPSB0cnVlO1xyXG4gICAgICB0aGlzLm9BdXRoU2VydmljZS5yZXNwb25zZVR5cGUgPSBjb25maWcucmVzcG9uc2VUeXBlIHx8ICdjb2RlJztcclxuICAgICAgdGhpcy5vQXV0aFNlcnZpY2Uuc3RyaWN0RGlzY292ZXJ5RG9jdW1lbnRWYWxpZGF0aW9uID0gZmFsc2U7XHJcbiAgICAgIHRoaXMub0F1dGhTZXJ2aWNlLnRva2VuVmFsaWRhdGlvbkhhbmRsZXIgPSBuZXcgSndrc1ZhbGlkYXRpb25IYW5kbGVyKCk7XHJcbiAgICAgIHRoaXMub0F1dGhTZXJ2aWNlLnRpbWVvdXRGYWN0b3IgPSAwLjc1O1xyXG4gICAgICB0aGlzLm9BdXRoU2VydmljZS5zZXR1cEF1dG9tYXRpY1NpbGVudFJlZnJlc2goe30sICdhY2Nlc3NfdG9rZW4nKTtcclxuXHJcbiAgICAgIC8vIHNldCBpbml0aWFsaXplZCBvbiBzdGFydCB1cCB0byB0cnVlXHJcbiAgICAgIGNvbmZpZy5hdXRoU2V0T25TdGFydHVwID0gdHJ1ZTtcclxuICAgICAgY29uc3QgcGFyZW50Q29uZmlnID0gdGhpcy5jb25maWdTZXJ2aWNlLmNvbmZpZztcclxuICAgICAgcGFyZW50Q29uZmlnLm9BdXRoU2V0dGluZ3MgPSBjb25maWc7XHJcbiAgICAgIHRoaXMuY29uZmlnU2VydmljZS5jb25maWcgPSBwYXJlbnRDb25maWc7XHJcblxyXG4gICAgICByZXR1cm4gdGhpcy5sb2dpbihjb25maWcpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodHJ1ZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBIYW5kbGUgTG9naW5cclxuICAgKiBAcGFyYW0gY29uZmlnIFRoZSBPaWRjIEF1dGggU2V0dGluZ3NcclxuICAgKi9cclxuICBwcml2YXRlIGFzeW5jIGxvZ2luKGNvbmZpZzogT2lkY0F1dGhTZXR0aW5ncyk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgY29uc3QgaXNWYWxpZCA9IHRoaXMudmFsaWRhdGVFeGlzdGluZ1Rva2VuQWdhaW5zdENvbmZpZ3MoKTtcclxuICAgIGNvbnN0IHByZXNlcnZlZFJvdXRlID0gdGhpcy53aW5kb3cuc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShwcmVTaWduSW5Sb3V0ZVN0b3JhZ2VLZXkpO1xyXG4gICAgaWYgKCFwcmVzZXJ2ZWRSb3V0ZSkge1xyXG4gICAgICB0aGlzLndpbmRvdy5zZXNzaW9uU3RvcmFnZS5zZXRJdGVtKHByZVNpZ25JblJvdXRlU3RvcmFnZUtleSwgdGhpcy5sb2NhdGlvbi5wYXRoKCkpO1xyXG4gICAgfVxyXG4gICAgaWYgKGNvbmZpZy5yZXF1aXJlTG9naW5PblN0YXJ0dXAgfHwgIWlzVmFsaWQpIHtcclxuICAgICAgcmV0dXJuIHRoaXMub0F1dGhTZXJ2aWNlLmxvYWREaXNjb3ZlcnlEb2N1bWVudEFuZExvZ2luKHtzdGF0ZTogdGhpcy5sb2NhdGlvbi5wYXRoKCl9KVxyXG4gICAgICAgIC8vIGhhbmRsZXMgdGhlIGNhc2UgZm9yIGV4cGlyZWQgYWNjZXNzIHRva2VuIG9yIGludmFsaWQgbm9uY2Ugb3IgcGVvcGxlIGJvb2ttYXJraW5nIHRoZSBpZHMgbG9naW4gcGFnZVxyXG4gICAgICAgIC5jYXRjaChhc3luYyAocmVzKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLm9BdXRoU2VydmljZS5pbml0TG9naW5GbG93KHRoaXMubG9jYXRpb24ucGF0aCgpKTtcclxuXHJcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRydWUpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHJldHVybiB0aGlzLm9BdXRoU2VydmljZS5sb2FkRGlzY292ZXJ5RG9jdW1lbnRBbmRUcnlMb2dpbigpXHJcbiAgICAgICAgLy8gaGFuZGxlcyB0aGUgY2FzZSBmb3IgZXhwaXJlZCBhY2Nlc3MgdG9rZW4gb3IgaW52YWxpZCBub25jZSBvciBwZW9wbGUgYm9va21hcmtpbmcgdGhlIGlkcyBsb2dpbiBwYWdlXHJcbiAgICAgICAgLmNhdGNoKGFzeW5jIChyZXMpID0+IHtcclxuICAgICAgICAgIHRoaXMub0F1dGhTZXJ2aWNlLmluaXRMb2dpbkZsb3coKTtcclxuXHJcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRydWUpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTWVyZ2VzIHRoZSB0d28gY29uZmlnIG9iamVjdHMgaWdub3JpbmcgdGhlIGFycmF5IHR5cGVcclxuICAgKiBAcGFyYW0gb2JqVmFsdWUgVGhlIGRlZmF1bHQgY29uZmlnIHZhbHVlXHJcbiAgICogQHBhcmFtIHNyY1ZhbHVlIFRoZSB0YXJnZXQgc3dpdGNoYm9hcmQgY29uZmlnIHZhbHVlXHJcbiAgICogQHJldHVybnMgVGhlIG1lcmdlIG9mIHRoZSB0d28gY29uZmlncyBwcm92aWRlZFxyXG4gICAqL1xyXG4gIHByaXZhdGUgbWVyZ2VDdXN0b21pemVyKG9ialZhbHVlOiBhbnksIHNyY1ZhbHVlOiBhbnkpOiBhbnkge1xyXG4gICAgaWYgKF8uaXNBcnJheShvYmpWYWx1ZSkgJiYgc3JjVmFsdWUpIHtcclxuICAgICAgcmV0dXJuIHNyY1ZhbHVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVmFsaWRhdGVzIHRoZSBleGlzdGluZyB0b2tlbiBhZ2FpbnN0IHRoZSBjb25maWd1cmF0aW9uc1xyXG4gICAqIEByZXR1cm5zIHRydWUgd2hlbiB0b2tlbiBpcyB2YWxpZFxyXG4gICAqL1xyXG4gIHByaXZhdGUgdmFsaWRhdGVFeGlzdGluZ1Rva2VuQWdhaW5zdENvbmZpZ3MoKTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcy5jb25maWdTZXJ2aWNlLmNvbmZpZy5vQXV0aFNldHRpbmdzLmRpc2FibGVTdGFydHVwVG9rZW5WYWxpZGF0aW9uKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgaWYgKCF0aGlzLndpbmRvdy5zZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCdhY2Nlc3NfdG9rZW4nKSkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIGNvbnN0IGdyYW50ZWRTY29wZXM6IEFycmF5PHN0cmluZz4gPSAgdGhpcy5vQXV0aFNlcnZpY2UuZ2V0R3JhbnRlZFNjb3BlcygpIGFzIEFycmF5PHN0cmluZz47XHJcbiAgICBjb25zdCBjb25maWd1cmVkU2NvcGVzID0gdGhpcy5jb25maWdTZXJ2aWNlLmNvbmZpZy5vQXV0aFNldHRpbmdzLnNjb3BlLnNwbGl0KCcgJyk7XHJcbiAgICBjb25zdCBkaWZmcyA9IGdyYW50ZWRTY29wZXMuZmlsdGVyKHggPT4gIWNvbmZpZ3VyZWRTY29wZXMuaW5jbHVkZXMoeCkpXHJcbiAgICAgIC5jb25jYXQoY29uZmlndXJlZFNjb3Blcy5maWx0ZXIoeCA9PiAhZ3JhbnRlZFNjb3Blcy5pbmNsdWRlcyh4KSkpO1xyXG4gICAgaWYgKGRpZmZzLmxlbmd0aCB8fCB0aGlzLm9BdXRoU2VydmljZS5nZXRJZGVudGl0eUNsYWltcygpWydhdWQnXSAhPT0gdGhpcy5jb25maWdTZXJ2aWNlLmNvbmZpZy5vQXV0aFNldHRpbmdzLmNsaWVudElkKSB7XHJcbiAgICAgIHRoaXMud2luZG93LnNlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oJ2FjY2Vzc190b2tlbicpO1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8qKiBHZXR0aW5nIHRoZSBzdWJkb21haW4gZnJvbSB1cmwgKi9cclxuICBwcml2YXRlIGdldFN1YmRvbWFpbigpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgZG9tYWluID0gdGhpcy53aW5kb3cubG9jYXRpb24uaG9zdG5hbWU7XHJcbiAgICBpZiAoZG9tYWluLmluZGV4T2YoJy4nKSA8IDAgfHxcclxuICAgICAgZG9tYWluLnNwbGl0KCcuJylbMF0gPT09IHRoaXMuZXhhbXBsZVN1YmRvbWFpbiB8fCBkb21haW4uc3BsaXQoJy4nKVswXSA9PT0gdGhpcy5sdmhTdWJzdHJpbmcgfHwgZG9tYWluLnNwbGl0KCcuJylbMF0gPT09IHRoaXMud3d3U3Vic3RyaW5nKSB7XHJcbiAgICAgIHJldHVybiAnJztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBkb21haW4uc3BsaXQoJy4nKVswXTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIl19