@osovitny/anatoly 3.17.160 → 3.19.2

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 (182) hide show
  1. package/fesm2022/osovitny-anatoly.mjs +569 -532
  2. package/fesm2022/osovitny-anatoly.mjs.map +1 -1
  3. package/lib/billing/utils.d.ts +2 -1
  4. package/lib/core/converts/convert.d.ts +1 -1
  5. package/lib/core/guid.d.ts +1 -1
  6. package/lib/core/is.d.ts +5 -5
  7. package/lib/ui/components/base/components/component.d.ts +1 -1
  8. package/lib/ui/components/base/components/edit.component.d.ts +1 -1
  9. package/lib/ui/components/base/components/enum-edit.component.d.ts +1 -1
  10. package/lib/ui/components/data-grid/control-panel.component.d.ts +6 -5
  11. package/lib/ui/components/dropdownlists/country/country.dropdownlist.d.ts +1 -3
  12. package/lib/ui/components/identity/signin-button.component.d.ts +0 -1
  13. package/lib/ui/components/identity/signout-button.component.d.ts +0 -1
  14. package/lib/ui/components/identity/signup-button.component.d.ts +0 -1
  15. package/lib/ui/directives/index.d.ts +1 -1
  16. package/lib/ui/directives/replacer/replacer.base.directive.d.ts +2 -1
  17. package/package.json +58 -60
  18. package/esm2022/lib/anatoly.module.mjs +0 -62
  19. package/esm2022/lib/billing/billing.module.mjs +0 -81
  20. package/esm2022/lib/billing/components/buttons/buyaccess-button.component.mjs +0 -104
  21. package/esm2022/lib/billing/components/buttons/subscribe-plan-button.component.mjs +0 -113
  22. package/esm2022/lib/billing/components/exports.mjs +0 -28
  23. package/esm2022/lib/billing/components/index.mjs +0 -31
  24. package/esm2022/lib/billing/components/order-summary/order-summary.component.mjs +0 -154
  25. package/esm2022/lib/billing/components/payment-methods/payment-methods.component.mjs +0 -106
  26. package/esm2022/lib/billing/components/payment-options/payment-options.component.mjs +0 -97
  27. package/esm2022/lib/billing/components/pm/braintree/braintree.component.mjs +0 -155
  28. package/esm2022/lib/billing/components/pm/paypal/paypal-button.component.mjs +0 -159
  29. package/esm2022/lib/billing/components/pm/paypal/paypal-subscribe-button.component.mjs +0 -149
  30. package/esm2022/lib/billing/components/pm/paypal/paypal.component.mjs +0 -317
  31. package/esm2022/lib/billing/components/pm/stripe/stripe.component.mjs +0 -109
  32. package/esm2022/lib/billing/exports.mjs +0 -19
  33. package/esm2022/lib/billing/models/paypal-models.mjs +0 -16
  34. package/esm2022/lib/billing/services/payments.service.mjs +0 -170
  35. package/esm2022/lib/billing/services/paypal-script.service.mjs +0 -90
  36. package/esm2022/lib/billing/utils.mjs +0 -28
  37. package/esm2022/lib/core/browser.mjs +0 -24
  38. package/esm2022/lib/core/consts/app-settings.mjs +0 -55
  39. package/esm2022/lib/core/consts/core-settings.mjs +0 -29
  40. package/esm2022/lib/core/consts/formats.mjs +0 -27
  41. package/esm2022/lib/core/consts/ga.mjs +0 -26
  42. package/esm2022/lib/core/consts/storageKeys.mjs +0 -23
  43. package/esm2022/lib/core/converts/convert.mjs +0 -103
  44. package/esm2022/lib/core/converts/dateConvert.mjs +0 -60
  45. package/esm2022/lib/core/converts/tz/tzParseTimezone.mjs +0 -122
  46. package/esm2022/lib/core/converts/tz/tzTokenizeDate.mjs +0 -101
  47. package/esm2022/lib/core/converts/xmlFormatter.mjs +0 -34
  48. package/esm2022/lib/core/core.module.mjs +0 -112
  49. package/esm2022/lib/core/dom.mjs +0 -153
  50. package/esm2022/lib/core/enums/billing.mjs +0 -56
  51. package/esm2022/lib/core/enums/enums.mjs +0 -35
  52. package/esm2022/lib/core/enums/index.mjs +0 -17
  53. package/esm2022/lib/core/exports.mjs +0 -67
  54. package/esm2022/lib/core/go/apps-go.service.mjs +0 -88
  55. package/esm2022/lib/core/go/go.service.mjs +0 -86
  56. package/esm2022/lib/core/guards/once-import.guard.mjs +0 -21
  57. package/esm2022/lib/core/guards/starter.guard.mjs +0 -46
  58. package/esm2022/lib/core/guid.mjs +0 -22
  59. package/esm2022/lib/core/interceptors/httpInterceptor.mjs +0 -161
  60. package/esm2022/lib/core/is.mjs +0 -98
  61. package/esm2022/lib/core/localization/localization.module.mjs +0 -45
  62. package/esm2022/lib/core/localization/localization.service.mjs +0 -164
  63. package/esm2022/lib/core/localization/localize.pipe.mjs +0 -83
  64. package/esm2022/lib/core/localization/settings.module.mjs +0 -103
  65. package/esm2022/lib/core/localization/utils.mjs +0 -41
  66. package/esm2022/lib/core/logging/globalErrorHandler.mjs +0 -41
  67. package/esm2022/lib/core/logging/logging.service.mjs +0 -40
  68. package/esm2022/lib/core/models/qs.mjs +0 -17
  69. package/esm2022/lib/core/notifications/alerts.mjs +0 -116
  70. package/esm2022/lib/core/notifications/interfaces/notification.mjs +0 -17
  71. package/esm2022/lib/core/notifications/services/notification-service.mjs +0 -83
  72. package/esm2022/lib/core/performance/stopwatch.mjs +0 -50
  73. package/esm2022/lib/core/services/appcontext.service.mjs +0 -186
  74. package/esm2022/lib/core/services/dm.service.mjs +0 -69
  75. package/esm2022/lib/core/services/google-analytics.service.mjs +0 -75
  76. package/esm2022/lib/core/services/idle.service.mjs +0 -77
  77. package/esm2022/lib/core/services/loading.service.mjs +0 -67
  78. package/esm2022/lib/core/services/script.service.mjs +0 -77
  79. package/esm2022/lib/core/services/starter.service.mjs +0 -85
  80. package/esm2022/lib/core/services/web-storage.service.mjs +0 -66
  81. package/esm2022/lib/core/subs.mjs +0 -31
  82. package/esm2022/lib/core/utils/qsutils.mjs +0 -84
  83. package/esm2022/lib/core/utils/utils.mjs +0 -112
  84. package/esm2022/lib/data/base/api.service.mjs +0 -94
  85. package/esm2022/lib/data/base/grid/grid-edit.service.mjs +0 -80
  86. package/esm2022/lib/data/base/grid/grid-read.service.mjs +0 -60
  87. package/esm2022/lib/data/data.module.mjs +0 -66
  88. package/esm2022/lib/data/exports.mjs +0 -29
  89. package/esm2022/lib/data/services/billing/currencies-api.service.mjs +0 -41
  90. package/esm2022/lib/data/services/billing/currencies-storage.service.mjs +0 -92
  91. package/esm2022/lib/data/services/billing/discountcodes-api.service.mjs +0 -37
  92. package/esm2022/lib/data/services/billing/payments-api.service.mjs +0 -64
  93. package/esm2022/lib/data/services/billing/subscriptions-api.service.mjs +0 -61
  94. package/esm2022/lib/data/services/billing/transactions-api.service.mjs +0 -43
  95. package/esm2022/lib/data/services/core-api.service.mjs +0 -44
  96. package/esm2022/lib/data/services/emails-api.service.mjs +0 -47
  97. package/esm2022/lib/external/fa.module.mjs +0 -45
  98. package/esm2022/lib/external/kendo.module.mjs +0 -179
  99. package/esm2022/lib/iam/b2c/b2c.mjs +0 -40
  100. package/esm2022/lib/iam/b2c/consts.mjs +0 -25
  101. package/esm2022/lib/iam/b2c/index.mjs +0 -21
  102. package/esm2022/lib/iam/configs.mjs +0 -109
  103. package/esm2022/lib/iam/consts.mjs +0 -22
  104. package/esm2022/lib/iam/exports.mjs +0 -22
  105. package/esm2022/lib/iam/guards/admin.guard.mjs +0 -46
  106. package/esm2022/lib/iam/guards/authentication.guard.mjs +0 -30
  107. package/esm2022/lib/iam/guards/index.mjs +0 -20
  108. package/esm2022/lib/iam/iam-pages.module.mjs +0 -57
  109. package/esm2022/lib/iam/iam-pages.routes.mjs +0 -45
  110. package/esm2022/lib/iam/iam.module.mjs +0 -84
  111. package/esm2022/lib/iam/pages/signin.page.mjs +0 -40
  112. package/esm2022/lib/iam/pages/signout.page.mjs +0 -40
  113. package/esm2022/lib/iam/pages/signup.page.mjs +0 -40
  114. package/esm2022/lib/iam/redirect.mjs +0 -29
  115. package/esm2022/lib/iam/services/auth.service.mjs +0 -436
  116. package/esm2022/lib/iam/storage.mjs +0 -42
  117. package/esm2022/lib/iam/utils.mjs +0 -49
  118. package/esm2022/lib/ui/components/base/components/component.mjs +0 -76
  119. package/esm2022/lib/ui/components/base/components/edit.component.mjs +0 -146
  120. package/esm2022/lib/ui/components/base/components/enum-edit.component.mjs +0 -92
  121. package/esm2022/lib/ui/components/base/dialog.mjs +0 -71
  122. package/esm2022/lib/ui/components/base/list.mjs +0 -100
  123. package/esm2022/lib/ui/components/base/pages/edit.page.mjs +0 -32
  124. package/esm2022/lib/ui/components/base/pages/page.mjs +0 -32
  125. package/esm2022/lib/ui/components/base/pages/paged.page.mjs +0 -68
  126. package/esm2022/lib/ui/components/card/card-body.component.mjs +0 -37
  127. package/esm2022/lib/ui/components/card/card-footer.component.mjs +0 -37
  128. package/esm2022/lib/ui/components/card/card-header.component.mjs +0 -51
  129. package/esm2022/lib/ui/components/card/card.component.mjs +0 -41
  130. package/esm2022/lib/ui/components/check-icon/check-icon.component.mjs +0 -43
  131. package/esm2022/lib/ui/components/copy-2-clipboard/copy-2-clipboard.component.mjs +0 -57
  132. package/esm2022/lib/ui/components/data-grid/control-panel.component.mjs +0 -201
  133. package/esm2022/lib/ui/components/datapager/datapager.component.mjs +0 -95
  134. package/esm2022/lib/ui/components/dropdownlists/country/country.dropdownlist.mjs +0 -96
  135. package/esm2022/lib/ui/components/dropdownlists/moderationstatus/moderationstatus.dropdownlist.mjs +0 -88
  136. package/esm2022/lib/ui/components/dropdownlists/publishstatus/publishstatus.dropdownlist.mjs +0 -88
  137. package/esm2022/lib/ui/components/dropdownlists/timezone/timezone.dropdownlist.mjs +0 -112
  138. package/esm2022/lib/ui/components/exports.mjs +0 -53
  139. package/esm2022/lib/ui/components/feature-will-be-ready/feature-will-be-ready.component.mjs +0 -55
  140. package/esm2022/lib/ui/components/html-editor/base-editor.component.mjs +0 -94
  141. package/esm2022/lib/ui/components/html-editor/defaultoptions.mjs +0 -87
  142. package/esm2022/lib/ui/components/html-editor/html-editor.component.mjs +0 -114
  143. package/esm2022/lib/ui/components/identity/signin-button.component.mjs +0 -105
  144. package/esm2022/lib/ui/components/identity/signout-button.component.mjs +0 -105
  145. package/esm2022/lib/ui/components/identity/signup-button.component.mjs +0 -105
  146. package/esm2022/lib/ui/components/index.mjs +0 -57
  147. package/esm2022/lib/ui/components/no-mobile-support/no-mobile-support.component.mjs +0 -45
  148. package/esm2022/lib/ui/components/nodata/nodata.component.mjs +0 -76
  149. package/esm2022/lib/ui/components/spinners/loading/loading.component.mjs +0 -53
  150. package/esm2022/lib/ui/components/spinners/pagespinner/pagespinner.component.mjs +0 -85
  151. package/esm2022/lib/ui/components/spinners/pagespinner/spinkits.mjs +0 -12
  152. package/esm2022/lib/ui/components/urlslug/urlslug.component.mjs +0 -130
  153. package/esm2022/lib/ui/components/you-agree-to-our-terms/you-agree-to-our-terms.component.mjs +0 -63
  154. package/esm2022/lib/ui/dialogs/contact-us/contact-us.dialog.mjs +0 -78
  155. package/esm2022/lib/ui/dialogs/exports.mjs +0 -16
  156. package/esm2022/lib/ui/dialogs/index.mjs +0 -19
  157. package/esm2022/lib/ui/directives/exports.mjs +0 -19
  158. package/esm2022/lib/ui/directives/hover.directive.mjs +0 -50
  159. package/esm2022/lib/ui/directives/index.mjs +0 -22
  160. package/esm2022/lib/ui/directives/native-element.directive.mjs +0 -37
  161. package/esm2022/lib/ui/directives/replacer/a-replacer.directive.mjs +0 -48
  162. package/esm2022/lib/ui/directives/replacer/image-replacer.directive.mjs +0 -44
  163. package/esm2022/lib/ui/directives/replacer/replacer.base.directive.mjs +0 -44
  164. package/esm2022/lib/ui/exports.mjs +0 -22
  165. package/esm2022/lib/ui/forms/components/address/address.component.mjs +0 -240
  166. package/esm2022/lib/ui/forms/components/company/company.component.mjs +0 -138
  167. package/esm2022/lib/ui/forms/contact-us/contact-us.mjs +0 -213
  168. package/esm2022/lib/ui/forms/exports.mjs +0 -20
  169. package/esm2022/lib/ui/forms/index.mjs +0 -21
  170. package/esm2022/lib/ui/pipes/exports.mjs +0 -19
  171. package/esm2022/lib/ui/pipes/filesize.pipe.mjs +0 -42
  172. package/esm2022/lib/ui/pipes/index.mjs +0 -22
  173. package/esm2022/lib/ui/pipes/replace-text.pipe.mjs +0 -37
  174. package/esm2022/lib/ui/pipes/safeHtml.pipe.mjs +0 -34
  175. package/esm2022/lib/ui/ui.module.mjs +0 -122
  176. package/esm2022/lib/ui/validation/exports.mjs +0 -19
  177. package/esm2022/lib/ui/validation/form-validation-summary.component.mjs +0 -90
  178. package/esm2022/lib/ui/validation/index.mjs +0 -21
  179. package/esm2022/lib/ui/validation/item-validation-summary.component.mjs +0 -53
  180. package/esm2022/lib/ui/validation/validation-summary.component.mjs +0 -124
  181. package/esm2022/osovitny-anatoly.mjs +0 -5
  182. package/esm2022/public-api.mjs +0 -22
@@ -1,436 +0,0 @@
1
- import { Inject, Injectable } from '@angular/core';
2
- import { Subject, catchError, filter, map, of, takeUntil } from 'rxjs';
3
- import { MSAL_GUARD_CONFIG } from '@azure/msal-angular';
4
- import { EventType, InteractionRequiredAuthError, InteractionStatus, InteractionType, PromptValue } from '@azure/msal-browser';
5
- //App
6
- import { ApiServiceBase } from '../../data/base/api.service';
7
- import { MSALRedirect } from '../redirect';
8
- import { MSALUtils } from '../utils';
9
- import { MSALB2C, PolicyType } from '../b2c';
10
- import { QSUtils } from '../../core/exports';
11
- import * as i0 from "@angular/core";
12
- import * as i1 from "@angular/common/http";
13
- import * as i2 from "@angular/router";
14
- import * as i3 from "../../core/services/appcontext.service";
15
- import * as i4 from "@azure/msal-angular";
16
- export class AuthService extends ApiServiceBase {
17
- constructor(http, router, appContext, msalGuardConfig, msalService, msalBroadcastService) {
18
- super(http);
19
- this.http = http;
20
- this.router = router;
21
- this.appContext = appContext;
22
- this.msalGuardConfig = msalGuardConfig;
23
- this.msalService = msalService;
24
- this.msalBroadcastService = msalBroadcastService;
25
- this.msalDestroying$ = new Subject();
26
- this.initialized = false;
27
- this.init();
28
- }
29
- ngOnDestroy() {
30
- this.msalDestroying$.next(undefined);
31
- this.msalDestroying$.complete();
32
- }
33
- init() {
34
- this.setDefaults();
35
- this.msalService.initialize().subscribe(() => {
36
- this.initialized = true;
37
- console.log(`msal.app: initMSAL started`);
38
- this.initMSAL();
39
- console.log(`msal.app: initMSAL finished`);
40
- });
41
- }
42
- setDefaults() {
43
- }
44
- /*
45
- https://github.com/AzureAD/microsoft-authentication-library-for-js/blob/dev/samples/msal-angular-v3-samples/angular-b2c-sample-app/src/app/app.component.ts
46
-
47
- Token Validation:
48
- https://jwt.io
49
-
50
- Token types:
51
- https://learn.microsoft.com/en-us/azure/active-directory-b2c/tokens-overview
52
- ID token - A JWT that contains claims that you can use to identify users in your application
53
- Access token - A JWT that contains claims that you can use to identify the granted permissions to your APIs.
54
- Access tokens are signed, but they aren't encrypted
55
- Refresh token - Refresh tokens are used to acquire new ID tokens and access tokens in an OAuth 2.0 flow.
56
- */
57
- initMSAL() {
58
- //B2C
59
- this.signUpSignInPolicy = MSALB2C.getPolicyByType(PolicyType.signUpSignIn);
60
- this.signUpPolicy = MSALB2C.getPolicyByType(PolicyType.signUp);
61
- this.editProfilePolicy = MSALB2C.getPolicyByType(PolicyType.editProfile);
62
- this.resetPasswordPolicy = MSALB2C.getPolicyByType(PolicyType.resetPassword);
63
- this.msalService.handleRedirectObservable().subscribe({
64
- next: (result) => {
65
- console.log(`msal.app: handleRedirectObservable`);
66
- },
67
- error: (error) => {
68
- console.log(error);
69
- }
70
- });
71
- this.msalService.instance.enableAccountStorageEvents();
72
- this.msalBroadcastService.msalSubject$.pipe(filter((msg) => msg.eventType === EventType.INITIALIZE_END ||
73
- //ACCOUNT_ADDED and ACCOUNT_REMOVED events emitted when a user logs in or out of another tab or window
74
- msg.eventType === EventType.ACCOUNT_ADDED ||
75
- msg.eventType === EventType.ACCOUNT_REMOVED ||
76
- //Login Failure
77
- msg.eventType === EventType.LOGIN_FAILURE ||
78
- msg.eventType === EventType.ACQUIRE_TOKEN_FAILURE ||
79
- //LogOut
80
- msg.eventType === EventType.LOGOUT_SUCCESS ||
81
- //LogIn
82
- msg.eventType === EventType.LOGIN_SUCCESS ||
83
- msg.eventType === EventType.ACQUIRE_TOKEN_SUCCESS ||
84
- msg.eventType === EventType.SSO_SILENT_SUCCESS), takeUntil(this.msalDestroying$))
85
- .subscribe((msg) => {
86
- switch (msg.eventType) {
87
- case EventType.INITIALIZE_END:
88
- console.log(`msal.app: INITIALIZE_END fired`);
89
- break;
90
- case EventType.ACCOUNT_ADDED:
91
- case EventType.ACCOUNT_REMOVED:
92
- if (this.msalService.instance.getAllAccounts().length === 0) {
93
- window.location.pathname = "/";
94
- }
95
- break;
96
- case EventType.LOGIN_FAILURE:
97
- case EventType.ACQUIRE_TOKEN_FAILURE:
98
- if (!MSALUtils.isB2C()) {
99
- return;
100
- }
101
- //Check for forgot password error. Learn more about AAD error codes at
102
- //https://docs.microsoft.com/en-us/azure/active-directory/develop/reference-aadsts-error-codes
103
- if (msg.error && msg.error.message.indexOf('AADB2C90118') > -1) {
104
- let resetPasswordFlowRequest = {
105
- authority: this.resetPasswordPolicy.authority,
106
- scopes: [],
107
- };
108
- this.login(resetPasswordFlowRequest);
109
- }
110
- ;
111
- break;
112
- case EventType.LOGOUT_SUCCESS:
113
- break;
114
- case EventType.LOGIN_SUCCESS:
115
- case EventType.ACQUIRE_TOKEN_SUCCESS:
116
- case EventType.SSO_SILENT_SUCCESS:
117
- let payload = msg.payload;
118
- if (!payload) {
119
- return;
120
- }
121
- if (!MSALUtils.isB2C()) {
122
- this.msalService.instance.setActiveAccount(payload.account);
123
- return;
124
- }
125
- //B2C
126
- let token = payload.idTokenClaims;
127
- /**
128
- *
129
- * signUpSignIn
130
- *
131
- */
132
- if (token.acr === this.signUpSignInPolicy.name || token.tfp === this.signUpSignInPolicy.name) {
133
- this.msalService.instance.setActiveAccount(payload.account);
134
- }
135
- /**
136
- *
137
- * signUpPolicy
138
- *
139
- */
140
- if (token.acr === this.signUpPolicy.name || token.tfp === this.signUpPolicy.name) {
141
- this.msalService.instance.setActiveAccount(payload.account);
142
- }
143
- /**
144
- *
145
- * editProfile
146
- *
147
- * For the purpose of setting an active account for UI update, we want to consider only the auth response resulting
148
- * from SUSI flow. "acr" claim in the id token tells us the policy (NOTE: newer policies may use the "tfp" claim instead).
149
- * To learn more about B2C tokens, visit https://docs.microsoft.com/en-us/azure/active-directory-b2c/tokens-overview
150
- */
151
- if (token.acr === this.editProfilePolicy.name || token.tfp === this.editProfilePolicy.name) {
152
- const signInAccount = this.msalService.instance.getAllAccounts().find((account) => account.idTokenClaims?.oid === token.oid &&
153
- account.idTokenClaims?.sub === token.sub &&
154
- (account.idTokenClaims.acr === this.signUpSignInPolicy.name ||
155
- account.idTokenClaims.tfp === this.signUpSignInPolicy.name));
156
- this.forceReauthenticate(signInAccount);
157
- }
158
- /**
159
- *
160
- * resetPassword
161
- *
162
- * Below we are checking if the user is returning from the reset password flow.
163
- * If so, we will ask the user to reauthenticate with their new password.
164
- * If you do not want this behavior and prefer your users to stay signed in instead,
165
- * you can replace the code below with the same pattern used for handling the return from
166
- * profile edit flow
167
- */
168
- if (token.acr === this.resetPasswordPolicy.name || token.tfp === this.resetPasswordPolicy.name) {
169
- this.forceReauthenticate();
170
- }
171
- break;
172
- }
173
- return msg;
174
- });
175
- this.msalBroadcastService.inProgress$.pipe(filter((status) => status === InteractionStatus.Startup ||
176
- status === InteractionStatus.None), takeUntil(this.msalDestroying$))
177
- .subscribe((status) => {
178
- switch (status) {
179
- /**
180
- * Initial status before interaction occurs
181
- */
182
- case InteractionStatus.Startup:
183
- console.log(`msal.app: InteractionStatus.Startup`);
184
- break;
185
- /**
186
- * Status set when interaction is complete
187
- */
188
- case InteractionStatus.None:
189
- console.log(`msal.app: InteractionStatus.None`);
190
- MSALRedirect.handle(this.router, 'msalBroadcastService.inProgress$ InteractionStatus.None');
191
- this.checkAndSetActiveAccount();
192
- this.appContext.updateCurrent();
193
- break;
194
- }
195
- });
196
- }
197
- checkAndSetActiveAccount() {
198
- let activeAccount = this.msalService.instance.getActiveAccount();
199
- let accounts = this.msalService.instance.getAllAccounts();
200
- if (!activeAccount && accounts.length > 0) {
201
- this.msalService.instance.setActiveAccount(accounts[0]);
202
- }
203
- }
204
- isPopup(popup) {
205
- if (typeof popup === "undefined") {
206
- return this.msalGuardConfig.interactionType === InteractionType.Popup;
207
- }
208
- return popup;
209
- }
210
- acquireToken() {
211
- let request = {
212
- scopes: MSALUtils.getApiScopes()
213
- };
214
- if (this.isPopup()) {
215
- return this.msalService.acquireTokenPopup(request).pipe(map(response => {
216
- return response ? response.accessToken : null;
217
- }));
218
- }
219
- else {
220
- return this.msalService.acquireTokenRedirect(request).pipe(map(() => {
221
- return null;
222
- }));
223
- }
224
- }
225
- // Public funcs
226
- getActiveAccount() {
227
- this.checkAndSetActiveAccount();
228
- return this.msalService.instance.getActiveAccount();
229
- }
230
- getUserEmail() {
231
- let user = this.appContext.user;
232
- let activeAccount = this.getActiveAccount();
233
- if (activeAccount) {
234
- return activeAccount.username;
235
- }
236
- return user ? user.Email : '';
237
- }
238
- getUserName() {
239
- let user = this.appContext.user;
240
- let activeAccount = this.getActiveAccount();
241
- if (activeAccount) {
242
- return activeAccount.name ? activeAccount.name : user ? user.displayNameOrFullName : '';
243
- }
244
- return user ? user.displayNameOrFullName : '';
245
- }
246
- getAccessToken() {
247
- //1. Check SSO
248
- /*
249
- https://learn.microsoft.com/en-us/entra/identity-platform/msal-js-sso
250
- */
251
- if (QSUtils.isSSOinProgress()) {
252
- let cls = QSUtils.getValueByName("cls");
253
- let login = QSUtils.getValueByName("login");
254
- let sid = QSUtils.getValueByName("sid");
255
- let ssoSilentRequest;
256
- if (login) {
257
- ssoSilentRequest = {
258
- scopes: MSALUtils.getApiScopes(),
259
- loginHint: login
260
- };
261
- }
262
- else if (sid) {
263
- ssoSilentRequest = {
264
- scopes: MSALUtils.getApiScopes(),
265
- sid: sid
266
- };
267
- }
268
- //Logging
269
- console.log("SSO in progress");
270
- if (cls) {
271
- QSUtils.clearKey("cls=1", true, true);
272
- }
273
- return this.msalService.ssoSilent(ssoSilentRequest).pipe(map(response => {
274
- QSUtils.clearSSO();
275
- //Logging
276
- console.log("SSO have been successfully done");
277
- return response.accessToken;
278
- }), catchError(error => {
279
- QSUtils.clearSSO();
280
- //Logging
281
- console.log("SSO silent token acquisition fails");
282
- console.error(error);
283
- if (error instanceof InteractionRequiredAuthError) {
284
- return this.acquireToken();
285
- }
286
- return of(null);
287
- }));
288
- }
289
- //2. if isUserAuthenticated
290
- let activeAccount = this.getActiveAccount();
291
- if (activeAccount) {
292
- let silentRequest = {
293
- scopes: MSALUtils.getApiScopes(),
294
- account: activeAccount
295
- };
296
- return this.msalService.acquireTokenSilent(silentRequest).pipe(map(response => {
297
- return response.accessToken;
298
- }), catchError(error => {
299
- console.log("Silent token acquisition fails.");
300
- if (error instanceof InteractionRequiredAuthError) {
301
- return this.acquireToken();
302
- }
303
- return of(null);
304
- }));
305
- }
306
- return of(null);
307
- }
308
- forceReauthenticate(account) {
309
- if (MSALUtils.isB2C()) {
310
- let signUpSignInFlowRequest = {
311
- authority: this.signUpSignInPolicy.authority,
312
- scopes: [],
313
- prompt: PromptValue.LOGIN, // force user to reauthenticate with their new password
314
- account: account
315
- };
316
- this.login(signUpSignInFlowRequest);
317
- }
318
- else {
319
- }
320
- }
321
- login(userFlowRequest, popup) {
322
- let authRequestCfg = this.msalGuardConfig.authRequest;
323
- let authRequest = null;
324
- if (!userFlowRequest) {
325
- let signUpSignInFlowRequest = {
326
- authority: this.signUpSignInPolicy.authority,
327
- scopes: []
328
- };
329
- userFlowRequest = signUpSignInFlowRequest;
330
- }
331
- if (authRequestCfg) {
332
- authRequest = authRequestCfg(this.msalService, this.router.routerState.snapshot);
333
- }
334
- if (this.isPopup(popup)) {
335
- if (authRequest) {
336
- this.msalService.loginPopup({ ...authRequest, ...userFlowRequest }).subscribe((response) => {
337
- this.msalService.instance.setActiveAccount(response.account);
338
- });
339
- }
340
- else {
341
- this.msalService.loginPopup(userFlowRequest).subscribe((response) => {
342
- this.msalService.instance.setActiveAccount(response.account);
343
- });
344
- }
345
- }
346
- else {
347
- if (authRequest) {
348
- this.msalService.loginRedirect({ ...authRequest, ...userFlowRequest });
349
- }
350
- else {
351
- this.msalService.loginRedirect(userFlowRequest);
352
- }
353
- }
354
- }
355
- logout(popup) {
356
- let activeAccount = this.getActiveAccount();
357
- if (this.isPopup(popup)) {
358
- if (activeAccount) {
359
- this.msalService.logoutPopup({ account: activeAccount, mainWindowRedirectUri: "/" }).subscribe(() => {
360
- });
361
- }
362
- else {
363
- this.msalService.logoutPopup({ mainWindowRedirectUri: "/" }).subscribe(() => {
364
- });
365
- }
366
- }
367
- else {
368
- if (activeAccount) {
369
- this.msalService.logoutRedirect({ account: activeAccount });
370
- }
371
- else {
372
- this.msalService.logoutRedirect();
373
- }
374
- }
375
- }
376
- //MSAL check
377
- isUserAuthenticated() {
378
- return this.msalService.instance.getActiveAccount() != null;
379
- }
380
- //MSAL + appContext check
381
- isUserSignedIn() {
382
- if (!this.isUserAuthenticated()) {
383
- return false;
384
- }
385
- if (this.appContext.current.isUserSignedIn && this.appContext.user) {
386
- return true;
387
- }
388
- return false;
389
- }
390
- isUserAdmin() {
391
- return this.isUserSignedIn() && this.appContext.current.isUserAdmin;
392
- }
393
- //B2C
394
- signUp() {
395
- if (!MSALUtils.isB2C()) {
396
- return;
397
- }
398
- let signUpFlowRequest = {
399
- authority: this.signUpPolicy.authority,
400
- scopes: []
401
- };
402
- this.login(signUpFlowRequest);
403
- }
404
- editProfile() {
405
- if (!MSALUtils.isB2C()) {
406
- return;
407
- }
408
- let editProfileFlowRequest = {
409
- authority: this.editProfilePolicy.authority,
410
- scopes: []
411
- };
412
- this.login(editProfileFlowRequest);
413
- }
414
- resetPassword() {
415
- if (!MSALUtils.isB2C()) {
416
- return;
417
- }
418
- let resetPasswordFlowRequest = {
419
- authority: this.resetPasswordPolicy.authority,
420
- scopes: []
421
- };
422
- this.login(resetPasswordFlowRequest);
423
- }
424
- static { this.ɵfac = function AuthService_Factory(t) { return new (t || AuthService)(i0.ɵɵinject(i1.HttpClient), i0.ɵɵinject(i2.Router), i0.ɵɵinject(i3.AppContextService), i0.ɵɵinject(MSAL_GUARD_CONFIG), i0.ɵɵinject(i4.MsalService), i0.ɵɵinject(i4.MsalBroadcastService)); }; }
425
- static { this.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: AuthService, factory: AuthService.ɵfac, providedIn: 'root' }); }
426
- }
427
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(AuthService, [{
428
- type: Injectable,
429
- args: [{
430
- providedIn: 'root'
431
- }]
432
- }], () => [{ type: i1.HttpClient }, { type: i2.Router }, { type: i3.AppContextService }, { type: undefined, decorators: [{
433
- type: Inject,
434
- args: [MSAL_GUARD_CONFIG]
435
- }] }, { type: i4.MsalService }, { type: i4.MsalBroadcastService }], null); })();
436
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5hdG9seS9zcmMvbGliL2lhbS9zZXJ2aWNlcy9hdXRoLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBcUJBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFhLE1BQU0sZUFBZSxDQUFDO0FBRTlELE9BQU8sRUFBYyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNuRixPQUFPLEVBQUUsaUJBQWlCLEVBQTZELE1BQU0scUJBQXFCLENBQUM7QUFDbkgsT0FBTyxFQUFtRCxTQUFTLEVBQWlCLDRCQUE0QixFQUM5RyxpQkFBaUIsRUFBRSxlQUFlLEVBQWdCLFdBQVcsRUFDOUQsTUFBTSxxQkFBcUIsQ0FBQztBQUU3QixLQUFLO0FBQ0wsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBRTdELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDM0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUNyQyxPQUFPLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUM3QyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7Ozs7OztBQVU3QyxNQUFNLE9BQU8sV0FBWSxTQUFRLGNBQWM7SUFVN0MsWUFDWSxJQUFnQixFQUNsQixNQUFjLEVBQ2QsVUFBNkIsRUFHN0IsZUFBdUMsRUFDdkMsV0FBd0IsRUFDeEIsb0JBQTBDO1FBQ2xELEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQVJGLFNBQUksR0FBSixJQUFJLENBQVk7UUFDbEIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLGVBQVUsR0FBVixVQUFVLENBQW1CO1FBRzdCLG9C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QWdCSSxNQUFNO3VCQUFDLGlCQUFpQiIsInNvdXJjZXNDb250ZW50IjpbIi8qXHJcbjxmaWxlPlxyXG4gIFByb2plY3Q6XHJcbiAgICBAb3Nvdml0bnkvYW5hdG9seVxyXG5cclxuICBBdXRob3JzOlxyXG4gICAgVmFkaW0gT3Nvdml0bnkgdmFkaW0ub3Nvdml0bnlAb3Nvdml0bnkuY29tXHJcbiAgICBBbmF0b2x5IE9zb3ZpdG55IGFuYXRvbHkub3Nvdml0bnlAb3Nvdml0bnkuY29tXHJcblxyXG4gIENyZWF0ZWQ6XHJcbiAgICA2IERlYyAyMDE4XHJcblxyXG4gIERlc2NyaXB0aW9uOlxyXG4gICAgSWRlbnRpdHkgYW5kIEFjY2VzcyBNYW5hZ2VtZW50XHJcblxyXG4gIENvcHlyaWdodCAoYykgMjAxNi0yMDI1IE9zb3ZpdG55IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuPC9maWxlPlxyXG4qL1xyXG5cclxuLy9Ob2RlXHJcbmltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QsIGNhdGNoRXJyb3IsIGZpbHRlciwgbWFwLCBvZiwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IE1TQUxfR1VBUkRfQ09ORklHLCBNc2FsQnJvYWRjYXN0U2VydmljZSwgTXNhbEd1YXJkQ29uZmlndXJhdGlvbiwgTXNhbFNlcnZpY2UgfSBmcm9tICdAYXp1cmUvbXNhbC1hbmd1bGFyJztcclxuaW1wb3J0IHsgQWNjb3VudEluZm8sIEF1dGhlbnRpY2F0aW9uUmVzdWx0LCBFdmVudE1lc3NhZ2UsIEV2ZW50VHlwZSwgSWRUb2tlbkNsYWltcywgSW50ZXJhY3Rpb25SZXF1aXJlZEF1dGhFcnJvcixcclxuICBJbnRlcmFjdGlvblN0YXR1cywgSW50ZXJhY3Rpb25UeXBlLCBQb3B1cFJlcXVlc3QsIFByb21wdFZhbHVlLCBSZWRpcmVjdFJlcXVlc3QsIFNpbGVudFJlcXVlc3QsIFNzb1NpbGVudFJlcXVlc3RcclxufSBmcm9tICdAYXp1cmUvbXNhbC1icm93c2VyJztcclxuXHJcbi8vQXBwXHJcbmltcG9ydCB7IEFwaVNlcnZpY2VCYXNlIH0gZnJvbSAnLi4vLi4vZGF0YS9iYXNlL2FwaS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQXBwQ29udGV4dFNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb3JlL3NlcnZpY2VzL2FwcGNvbnRleHQuc2VydmljZSc7XHJcbmltcG9ydCB7IE1TQUxSZWRpcmVjdCB9IGZyb20gJy4uL3JlZGlyZWN0JztcclxuaW1wb3J0IHsgTVNBTFV0aWxzIH0gZnJvbSAnLi4vdXRpbHMnO1xyXG5pbXBvcnQgeyBNU0FMQjJDLCBQb2xpY3lUeXBlIH0gZnJvbSAnLi4vYjJjJztcclxuaW1wb3J0IHsgUVNVdGlscyB9IGZyb20gJy4uLy4uL2NvcmUvZXhwb3J0cyc7XHJcblxyXG50eXBlIElkVG9rZW5DbGFpbXNXaXRoUG9saWN5SWQgPSBJZFRva2VuQ2xhaW1zICYge1xyXG4gIGFjcj86IHN0cmluZyxcclxuICB0ZnA/OiBzdHJpbmcsXHJcbn07XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBdXRoU2VydmljZSBleHRlbmRzIEFwaVNlcnZpY2VCYXNlIGltcGxlbWVudHMgT25EZXN0cm95IHtcclxuICBwcml2YXRlIHJlYWRvbmx5IG1zYWxEZXN0cm95aW5nJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcbiAgcHJpdmF0ZSBpbml0aWFsaXplZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvL0IyQyBQb2xpY2llc1xyXG4gIHByaXZhdGUgc2lnblVwU2lnbkluUG9saWN5XHJcbiAgcHJpdmF0ZSBzaWduVXBQb2xpY3k7XHJcbiAgcHJpdmF0ZSBlZGl0UHJvZmlsZVBvbGljeTtcclxuICBwcml2YXRlIHJlc2V0UGFzc3dvcmRQb2xpY3k7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJvdGVjdGVkIGh0dHA6IEh0dHBDbGllbnQsXHJcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxyXG4gICAgcHJpdmF0ZSBhcHBDb250ZXh0OiBBcHBDb250ZXh0U2VydmljZSxcclxuXHJcbiAgICBASW5qZWN0KE1TQUxfR1VBUkRfQ09ORklHKVxyXG4gICAgcHJpdmF0ZSBtc2FsR3VhcmRDb25maWc6IE1zYWxHdWFyZENvbmZpZ3VyYXRpb24sXHJcbiAgICBwcml2YXRlIG1zYWxTZXJ2aWNlOiBNc2FsU2VydmljZSxcclxuICAgIHByaXZhdGUgbXNhbEJyb2FkY2FzdFNlcnZpY2U6IE1zYWxCcm9hZGNhc3RTZXJ2aWNlKSB7XHJcbiAgICBzdXBlcihodHRwKTtcclxuICAgIHRoaXMuaW5pdCgpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICB0aGlzLm1zYWxEZXN0cm95aW5nJC5uZXh0KHVuZGVmaW5lZCk7XHJcbiAgICB0aGlzLm1zYWxEZXN0cm95aW5nJC5jb21wbGV0ZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0KCkge1xyXG4gICAgdGhpcy5zZXREZWZhdWx0cygpO1xyXG5cclxuICAgIHRoaXMubXNhbFNlcnZpY2UuaW5pdGlhbGl6ZSgpLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG5cclxuICAgICAgY29uc29sZS5sb2coYG1zYWwuYXBwOiBpbml0TVNBTCBzdGFydGVkYCk7XHJcbiAgICAgIHRoaXMuaW5pdE1TQUwoKTtcclxuICAgICAgY29uc29sZS5sb2coYG1zYWwuYXBwOiBpbml0TVNBTCBmaW5pc2hlZGApO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldERlZmF1bHRzKCkge1xyXG4gIH1cclxuXHJcbiAgLypcclxuICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9BenVyZUFEL21pY3Jvc29mdC1hdXRoZW50aWNhdGlvbi1saWJyYXJ5LWZvci1qcy9ibG9iL2Rldi9zYW1wbGVzL21zYWwtYW5ndWxhci12My1zYW1wbGVzL2FuZ3VsYXItYjJjLXNhbXBsZS1hcHAvc3JjL2FwcC9hcHAuY29tcG9uZW50LnRzXHJcblxyXG4gICAgVG9rZW4gVmFsaWRhdGlvbjpcclxuICAgICAgaHR0cHM6Ly9qd3QuaW9cclxuXHJcbiAgICBUb2tlbiB0eXBlczpcclxuICAgICAgaHR0cHM6Ly9sZWFybi5taWNyb3NvZnQuY29tL2VuLXVzL2F6dXJlL2FjdGl2ZS1kaXJlY3RvcnktYjJjL3Rva2Vucy1vdmVydmlld1xyXG4gICAgICBJRCB0b2tlbiAtIEEgSldUIHRoYXQgY29udGFpbnMgY2xhaW1zIHRoYXQgeW91IGNhbiB1c2UgdG8gaWRlbnRpZnkgdXNlcnMgaW4geW91ciBhcHBsaWNhdGlvblxyXG4gICAgICBBY2Nlc3MgdG9rZW4gLSBBIEpXVCB0aGF0IGNvbnRhaW5zIGNsYWltcyB0aGF0IHlvdSBjYW4gdXNlIHRvIGlkZW50aWZ5IHRoZSBncmFudGVkIHBlcm1pc3Npb25zIHRvIHlvdXIgQVBJcy5cclxuICAgICAgICAgICAgICAgICAgICAgQWNjZXNzIHRva2VucyBhcmUgc2lnbmVkLCBidXQgdGhleSBhcmVuJ3QgZW5jcnlwdGVkXHJcbiAgICAgIFJlZnJlc2ggdG9rZW4gLSBSZWZyZXNoIHRva2VucyBhcmUgdXNlZCB0byBhY3F1aXJlIG5ldyBJRCB0b2tlbnMgYW5kIGFjY2VzcyB0b2tlbnMgaW4gYW4gT0F1dGggMi4wIGZsb3cuXHJcbiAgKi9cclxuICBwcml2YXRlIGluaXRNU0FMKCkge1xyXG4gICAgLy9CMkNcclxuICAgIHRoaXMuc2lnblVwU2lnbkluUG9saWN5ID0gTVNBTEIyQy5nZXRQb2xpY3lCeVR5cGUoUG9saWN5VHlwZS5zaWduVXBTaWduSW4pO1xyXG4gICAgdGhpcy5zaWduVXBQb2xpY3kgPSBNU0FMQjJDLmdldFBvbGljeUJ5VHlwZShQb2xpY3lUeXBlLnNpZ25VcCk7XHJcbiAgICB0aGlzLmVkaXRQcm9maWxlUG9saWN5ID0gTVNBTEIyQy5nZXRQb2xpY3lCeVR5cGUoUG9saWN5VHlwZS5lZGl0UHJvZmlsZSk7XHJcbiAgICB0aGlzLnJlc2V0UGFzc3dvcmRQb2xpY3kgPSBNU0FMQjJDLmdldFBvbGljeUJ5VHlwZShQb2xpY3lUeXBlLnJlc2V0UGFzc3dvcmQpO1xyXG5cclxuICAgIHRoaXMubXNhbFNlcnZpY2UuaGFuZGxlUmVkaXJlY3RPYnNlcnZhYmxlKCkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHJlc3VsdDogQXV0aGVudGljYXRpb25SZXN1bHQpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZyhgbXNhbC5hcHA6IGhhbmRsZVJlZGlyZWN0T2JzZXJ2YWJsZWApO1xyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKGVycm9yKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLm1zYWxTZXJ2aWNlLmluc3RhbmNlLmVuYWJsZUFjY291bnRTdG9yYWdlRXZlbnRzKCk7XHJcbiAgICB0aGlzLm1zYWxCcm9hZGNhc3RTZXJ2aWNlLm1zYWxTdWJqZWN0JC5waXBlKFxyXG4gICAgICAgIGZpbHRlcigobXNnOiBFdmVudE1lc3NhZ2UpID0+XHJcbiAgICAgICAgICBtc2cuZXZlbnRUeXBlID09PSBFdmVudFR5cGUuSU5JVElBTElaRV9FTkQgfHxcclxuXHJcbiAgICAgICAgICAvL0FDQ09VTlRfQURERUQgYW5kIEFDQ09VTlRfUkVNT1ZFRCBldmVudHMgZW1pdHRlZCB3aGVuIGEgdXNlciBsb2dzIGluIG9yIG91dCBvZiBhbm90aGVyIHRhYiBvciB3aW5kb3dcclxuICAgICAgICAgIG1zZy5ldmVudFR5cGUgPT09IEV2ZW50VHlwZS5BQ0NPVU5UX0FEREVEIHx8XHJcbiAgICAgICAgICBtc2cuZXZlbnRUeXBlID09PSBFdmVudFR5cGUuQUNDT1VOVF9SRU1PVkVEIHx8XHJcblxyXG4gICAgICAgICAgLy9Mb2dpbiBGYWlsdXJlXHJcbiAgICAgICAgICBtc2cuZXZlbnRUeXBlID09PSBFdmVudFR5cGUuTE9HSU5fRkFJTFVSRSB8fFxyXG4gICAgICAgICAgbXNnLmV2ZW50VHlwZSA9PT0gRXZlbnRUeXBlLkFDUVVJUkVfVE9LRU5fRkFJTFVSRSB8fFxyXG5cclxuICAgICAgICAgIC8vTG9nT3V0XHJcbiAgICAgICAgICBtc2cuZXZlbnRUeXBlID09PSBFdmVudFR5cGUuTE9HT1VUX1NVQ0NFU1MgfHxcclxuXHJcbiAgICAgICAgICAvL0xvZ0luXHJcbiAgICAgICAgICBtc2cuZXZlbnRUeXBlID09PSBFdmVudFR5cGUuTE9HSU5fU1VDQ0VTUyB8fFxyXG4gICAgICAgICAgbXNnLmV2ZW50VHlwZSA9PT0gRXZlbnRUeXBlLkFDUVVJUkVfVE9LRU5fU1VDQ0VTUyB8fFxyXG4gICAgICAgICAgbXNnLmV2ZW50VHlwZSA9PT0gRXZlbnRUeXBlLlNTT19TSUxFTlRfU1VDQ0VTU1xyXG4gICAgICAgICksXHJcbiAgICAgICAgdGFrZVVudGlsKHRoaXMubXNhbERlc3Ryb3lpbmckKVxyXG4gICAgICApXHJcbiAgICAgIC5zdWJzY3JpYmUoKG1zZzogRXZlbnRNZXNzYWdlKSA9PiB7XHJcbiAgICAgICAgc3dpdGNoIChtc2cuZXZlbnRUeXBlKSB7XHJcbiAgICAgICAgICBjYXNlIEV2ZW50VHlwZS5JTklUSUFMSVpFX0VORDpcclxuICAgICAgICAgICAgY29uc29sZS5sb2coYG1zYWwuYXBwOiBJTklUSUFMSVpFX0VORCBmaXJlZGApO1xyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEV2ZW50VHlwZS5BQ0NPVU5UX0FEREVEOlxyXG4gICAgICAgICAgY2FzZSBFdmVudFR5cGUuQUNDT1VOVF9SRU1PVkVEOlxyXG4gICAgICAgICAgICBpZiAodGhpcy5tc2FsU2VydmljZS5pbnN0YW5jZS5nZXRBbGxBY2NvdW50cygpLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSA9IFwiL1wiO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgRXZlbnRUeXBlLkxPR0lOX0ZBSUxVUkU6XHJcbiAgICAgICAgICBjYXNlIEV2ZW50VHlwZS5BQ1FVSVJFX1RPS0VOX0ZBSUxVUkU6XHJcbiAgICAgICAgICAgIGlmICghTVNBTFV0aWxzLmlzQjJDKCkpIHtcclxuICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vQ2hlY2sgZm9yIGZvcmdvdCBwYXNzd29yZCBlcnJvci4gTGVhcm4gbW9yZSBhYm91dCBBQUQgZXJyb3IgY29kZXMgYXRcclxuICAgICAgICAgICAgLy9odHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9henVyZS9hY3RpdmUtZGlyZWN0b3J5L2RldmVsb3AvcmVmZXJlbmNlLWFhZHN0cy1lcnJvci1jb2Rlc1xyXG4gICAgICAgICAgICBpZiAobXNnLmVycm9yICYmIG1zZy5lcnJvci5tZXNzYWdlLmluZGV4T2YoJ0FBREIyQzkwMTE4JykgPiAtMSkge1xyXG4gICAgICAgICAgICAgIGxldCByZXNldFBhc3N3b3JkRmxvd1JlcXVlc3Q6IFJlZGlyZWN0UmVxdWVzdCB8IFBvcHVwUmVxdWVzdCAgPSB7XHJcbiAgICAgICAgICAgICAgICAgIGF1dGhvcml0eTogdGhpcy5yZXNldFBhc3N3b3JkUG9saWN5LmF1dGhvcml0eSxcclxuICAgICAgICAgICAgICAgICAgc2NvcGVzOiBbXSxcclxuICAgICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgICB0aGlzLmxvZ2luKHJlc2V0UGFzc3dvcmRGbG93UmVxdWVzdCk7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgIGNhc2UgRXZlbnRUeXBlLkxPR09VVF9TVUNDRVNTOlxyXG4gICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICBjYXNlIEV2ZW50VHlwZS5MT0dJTl9TVUNDRVNTOlxyXG4gICAgICAgICAgY2FzZSBFdmVudFR5cGUuQUNRVUlSRV9UT0tFTl9TVUNDRVNTOlxyXG4gICAgICAgICAgY2FzZSBFdmVudFR5cGUuU1NPX1NJTEVOVF9TVUNDRVNTOlxyXG4gICAgICAgICAgICBsZXQgcGF5bG9hZCA9IG1zZy5wYXlsb2FkIGFzIEF1dGhlbnRpY2F0aW9uUmVzdWx0O1xyXG4gICAgICAgICAgICBpZiAoIXBheWxvYWQpIHtcclxuICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICghTVNBTFV0aWxzLmlzQjJDKCkpIHtcclxuICAgICAgICAgICAgICB0aGlzLm1zYWxTZXJ2aWNlLmluc3RhbmNlLnNldEFjdGl2ZUFjY291bnQocGF5bG9hZC5hY2NvdW50KTtcclxuICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vQjJDXHJcbiAgICAgICAgICAgIGxldCB0b2tlbiA9IHBheWxvYWQuaWRUb2tlbkNsYWltcyBhcyBJZFRva2VuQ2xhaW1zV2l0aFBvbGljeUlkXHJcblxyXG4gICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICpcclxuICAgICAgICAgICAgICogc2lnblVwU2lnbkluXHJcbiAgICAgICAgICAgICAqXHJcbiAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICBpZiAodG9rZW4uYWNyID09PSB0aGlzLnNpZ25VcFNpZ25JblBvbGljeS5uYW1lIHx8IHRva2VuLnRmcCA9PT0gdGhpcy5zaWduVXBTaWduSW5Qb2xpY3kubmFtZSkge1xyXG4gICAgICAgICAgICAgIHRoaXMubXNhbFNlcnZpY2UuaW5zdGFuY2Uuc2V0QWN0aXZlQWNjb3VudChwYXlsb2FkLmFjY291bnQpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICpcclxuICAgICAgICAgICAgICogc2lnblVwUG9saWN5XHJcbiAgICAgICAgICAgICAqXHJcbiAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICBpZiAodG9rZW4uYWNyID09PSB0aGlzLnNpZ25VcFBvbGljeS5uYW1lIHx8IHRva2VuLnRmcCA9PT0gdGhpcy5zaWduVXBQb2xpY3kubmFtZSkge1xyXG4gICAgICAgICAgICAgIHRoaXMubXNhbFNlcnZpY2UuaW5zdGFuY2Uuc2V0QWN0aXZlQWNjb3VudChwYXlsb2FkLmFjY291bnQpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICpcclxuICAgICAgICAgICAgICogZWRpdFByb2ZpbGVcclxuICAgICAgICAgICAgICpcclxuICAgICAgICAgICAgICogRm9yIHRoZSBwdXJwb3NlIG9mIHNldHRpbmcgYW4gYWN0aXZlIGFjY291bnQgZm9yIFVJIHVwZGF0ZSwgd2Ugd2FudCB0byBjb25zaWRlciBvbmx5IHRoZSBhdXRoIHJlc3BvbnNlIHJlc3VsdGluZ1xyXG4gICAgICAgICAgICAgKiBmcm9tIFNVU0kgZmxvdy4gXCJhY3JcIiBjbGFpbSBpbiB0aGUgaWQgdG9rZW4gdGVsbHMgdXMgdGhlIHBvbGljeSAoTk9URTogbmV3ZXIgcG9saWNpZXMgbWF5IHVzZSB0aGUgXCJ0ZnBcIiBjbGFpbSBpbnN0ZWFkKS5cclxuICAgICAgICAgICAgICogVG8gbGVhcm4gbW9yZSBhYm91dCBCMkMgdG9rZW5zLCB2aXNpdCBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9henVyZS9hY3RpdmUtZGlyZWN0b3J5LWIyYy90b2tlbnMtb3ZlcnZpZXdcclxuICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgIGlmICh0b2tlbi5hY3IgPT09IHRoaXMuZWRpdFByb2ZpbGVQb2xpY3kubmFtZSB8fCB0b2tlbi50ZnAgPT09IHRoaXMuZWRpdFByb2ZpbGVQb2xpY3kubmFtZSkge1xyXG4gICAgICAgICAgICAgICBjb25zdCBzaWduSW5BY2NvdW50ID0gdGhpcy5tc2FsU2VydmljZS5pbnN0YW5jZS5nZXRBbGxBY2NvdW50cygpLmZpbmQoKGFjY291bnQ6IEFjY291bnRJbmZvKSA9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFjY291bnQuaWRUb2tlbkNsYWltcz8ub2lkID09PSB0b2tlbi5vaWQgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBhY2NvdW50LmlkVG9rZW5DbGFpbXM/LnN1YiA9PT0gdG9rZW4uc3ViICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKChhY2NvdW50LmlkVG9rZW5DbGFpbXMgYXMgSWRUb2tlbkNsYWltc1dpdGhQb2xpY3lJZCkuYWNyID09PSB0aGlzLnNpZ25VcFNpZ25JblBvbGljeS5uYW1lIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIChhY2NvdW50LmlkVG9rZW5DbGFpbXMgYXMgSWRUb2tlbkNsYWltc1dpdGhQb2xpY3lJZCkudGZwID09PSB0aGlzLnNpZ25VcFNpZ25JblBvbGljeS5uYW1lKVxyXG4gICAgICAgICAgICAgICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICAgICAgdGhpcy5mb3JjZVJlYXV0aGVudGljYXRlKHNpZ25JbkFjY291bnQpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICpcclxuICAgICAgICAgICAgICogcmVzZXRQYXNzd29yZFxyXG4gICAgICAgICAgICAgKlxyXG4gICAgICAgICAgICAgKiBCZWxvdyB3ZSBhcmUgY2hlY2tpbmcgaWYgdGhlIHVzZXIgaXMgcmV0dXJuaW5nIGZyb20gdGhlIHJlc2V0IHBhc3N3b3JkIGZsb3cuXHJcbiAgICAgICAgICAgICAqIElmIHNvLCB3ZSB3aWxsIGFzayB0aGUgdXNlciB0byByZWF1dGhlbnRpY2F0ZSB3aXRoIHRoZWlyIG5ldyBwYXNzd29yZC5cclxuICAgICAgICAgICAgICogSWYgeW91IGRvIG5vdCB3YW50IHRoaXMgYmVoYXZpb3IgYW5kIHByZWZlciB5b3VyIHVzZXJzIHRvIHN0YXkgc2lnbmVkIGluIGluc3RlYWQsXHJcbiAgICAgICAgICAgICAqIHlvdSBjYW4gcmVwbGFjZSB0aGUgY29kZSBiZWxvdyB3aXRoIHRoZSBzYW1lIHBhdHRlcm4gdXNlZCBmb3IgaGFuZGxpbmcgdGhlIHJldHVybiBmcm9tXHJcbiAgICAgICAgICAgICAqIHByb2ZpbGUgZWRpdCBmbG93XHJcbiAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICBpZiAodG9rZW4uYWNyID09PSB0aGlzLnJlc2V0UGFzc3dvcmRQb2xpY3kubmFtZSB8fCB0b2tlbi50ZnAgPT09IHRoaXMucmVzZXRQYXNzd29yZFBvbGljeS5uYW1lKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5mb3JjZVJlYXV0aGVudGljYXRlKCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIG1zZztcclxuICAgICAgfSk7XHJcblxyXG4gICAgdGhpcy5tc2FsQnJvYWRjYXN0U2VydmljZS5pblByb2dyZXNzJC5waXBlKFxyXG4gICAgICAgIGZpbHRlcigoc3RhdHVzOiBJbnRlcmFjdGlvblN0YXR1cykgPT5cclxuICAgICAgICAgIHN0YXR1cyA9PT0gSW50ZXJhY3Rpb25TdGF0dXMuU3RhcnR1cCB8fFxyXG4gICAgICAgICAgc3RhdHVzID09PSBJbnRlcmFjdGlvblN0YXR1cy5Ob25lXHJcbiAgICAgICAgKSxcclxuICAgICAgICB0YWtlVW50aWwodGhpcy5tc2FsRGVzdHJveWluZyQpXHJcbiAgICAgIClcclxuICAgICAgLnN1YnNjcmliZSgoc3RhdHVzOiBJbnRlcmFjdGlvblN0YXR1cykgPT4ge1xyXG4gICAgICAgIHN3aXRjaCAoc3RhdHVzKSB7XHJcbiAgICAgICAgICAvKipcclxuICAgICAgICAgICAqIEluaXRpYWwgc3RhdHVzIGJlZm9yZSBpbnRlcmFjdGlvbiBvY2N1cnNcclxuICAgICAgICAgICAqL1xyXG4gICAgICAgICAgY2FzZSBJbnRlcmFjdGlvblN0YXR1cy5TdGFydHVwOlxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgbXNhbC5hcHA6IEludGVyYWN0aW9uU3RhdHVzLlN0YXJ0dXBgKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgLyoqXHJcbiAgICAgICAgICAqIFN0YXR1cyBzZXQgd2hlbiBpbnRlcmFjdGlvbiBpcyBjb21wbGV0ZVxyXG4gICAgICAgICAgKi9cclxuICAgICAgICAgIGNhc2UgSW50ZXJhY3Rpb25TdGF0dXMuTm9uZTpcclxuICAgICAgICAgICAgY29uc29sZS5sb2coYG1zYWwuYXBwOiBJbnRlcmFjdGlvblN0YXR1cy5Ob25lYCk7XHJcblxyXG4gICAgICAgICAgICBNU0FMUmVkaXJlY3QuaGFuZGxlKHRoaXMucm91dGVyLCAnbXNhbEJyb2FkY2FzdFNlcnZpY2UuaW5Qcm9ncmVzcyQgSW50ZXJhY3Rpb25TdGF0dXMuTm9uZScpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5jaGVja0FuZFNldEFjdGl2ZUFjY291bnQoKTtcclxuICAgICAgICAgICAgdGhpcy5hcHBDb250ZXh0LnVwZGF0ZUN1cnJlbnQoKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2hlY2tBbmRTZXRBY3RpdmVBY2NvdW50KCkge1xyXG4gICAgbGV0IGFjdGl2ZUFjY291bnQgPSB0aGlzLm1zYWxTZXJ2aWNlLmluc3RhbmNlLmdldEFjdGl2ZUFjY291bnQoKTtcclxuICAgIGxldCBhY2NvdW50cyA9IHRoaXMubXNhbFNlcnZpY2UuaW5zdGFuY2UuZ2V0QWxsQWNjb3VudHMoKTtcclxuXHJcbiAgICBpZiAoIWFjdGl2ZUFjY291bnQgJiYgYWNjb3VudHMubGVuZ3RoID4gMCkge1xyXG4gICAgICB0aGlzLm1zYWxTZXJ2aWNlLmluc3RhbmNlLnNldEFjdGl2ZUFjY291bnQoYWNjb3VudHNbMF0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpc1BvcHVwKHBvcHVwPzogYm9vbGVhbikge1xyXG4gICAgaWYgKHR5cGVvZiBwb3B1cCA9PT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgICByZXR1cm4gdGhpcy5tc2FsR3VhcmRDb25maWcuaW50ZXJhY3Rpb25UeXBlID09PSBJbnRlcmFjdGlvblR5cGUuUG9wdXA7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHBvcHVwO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhY3F1aXJlVG9rZW4oKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcclxuICAgIGxldCByZXF1ZXN0ID0ge1xyXG4gICAgICBzY29wZXM6IE1TQUxVdGlscy5nZXRBcGlTY29wZXMoKVxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmlzUG9wdXAoKSkge1xyXG4gICAgICByZXR1cm4gdGhpcy5tc2FsU2VydmljZS5hY3F1aXJlVG9rZW5Qb3B1cChyZXF1ZXN0KS5waXBlKFxyXG4gICAgICAgIG1hcChyZXNwb25zZSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gcmVzcG9uc2UgPyByZXNwb25zZS5hY2Nlc3NUb2tlbiA6IG51bGw7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICByZXR1cm4gdGhpcy5tc2FsU2VydmljZS5hY3F1aXJlVG9rZW5SZWRpcmVjdChyZXF1ZXN0KS5waXBlKFxyXG4gICAgICAgIG1hcCgoKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gUHVibGljIGZ1bmNzXHJcbiAgZ2V0QWN0aXZlQWNjb3VudCgpOiBBY2NvdW50SW5mbyB8IG51bGwge1xyXG4gICAgdGhpcy5jaGVja0FuZFNldEFjdGl2ZUFjY291bnQoKTtcclxuICAgIHJldHVybiB0aGlzLm1zYWxTZXJ2aWNlLmluc3RhbmNlLmdldEFjdGl2ZUFjY291bnQoKTtcclxuICB9XHJcblxyXG4gIGdldFVzZXJFbWFpbCgpIHtcclxuICAgIGxldCB1c2VyID0gdGhpcy5hcHBDb250ZXh0LnVzZXI7XHJcbiAgICBsZXQgYWN0aXZlQWNjb3VudCA9IHRoaXMuZ2V0QWN0aXZlQWNjb3VudCgpO1xyXG5cclxuICAgIGlmIChhY3RpdmVBY2NvdW50KSB7XHJcbiAgICAgIHJldHVybiBhY3RpdmVBY2NvdW50LnVzZXJuYW1lO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB1c2VyID8gdXNlci5FbWFpbCA6ICcnO1xyXG4gIH1cclxuXHJcbiAgZ2V0VXNlck5hbWUoKSB7XHJcbiAgICBsZXQgdXNlciA9IHRoaXMuYXBwQ29udGV4dC51c2VyO1xyXG4gICAgbGV0IGFjdGl2ZUFjY291bnQgPSB0aGlzLmdldEFjdGl2ZUFjY291bnQoKTtcclxuXHJcbiAgICBpZiAoYWN0aXZlQWNjb3VudCkge1xyXG4gICAgICByZXR1cm4gYWN0aXZlQWNjb3VudC5uYW1lID8gYWN0aXZlQWNjb3VudC5uYW1lIDogdXNlciA/IHVzZXIuZGlzcGxheU5hbWVPckZ1bGxOYW1lIDogJyc7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHVzZXIgPyB1c2VyLmRpc3BsYXlOYW1lT3JGdWxsTmFtZSA6ICcnO1xyXG4gIH1cclxuXHJcbiAgZ2V0QWNjZXNzVG9rZW4oKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcclxuICAgIC8vMS4gQ2hlY2sgU1NPXHJcbiAgICAvKlxyXG4gICAgICBodHRwczovL2xlYXJuLm1pY3Jvc29mdC5jb20vZW4tdXMvZW50cmEvaWRlbnRpdHktcGxhdGZvcm0vbXNhbC1qcy1zc29cclxuICAgICovXHJcbiAgICBpZiAoUVNVdGlscy5pc1NTT2luUHJvZ3Jlc3MoKSkge1xyXG4gICAgICBsZXQgY2xzID0gUVNVdGlscy5nZXRWYWx1ZUJ5TmFtZShcImNsc1wiKTtcclxuICAgICAgbGV0IGxvZ2luID0gUVNVdGlscy5nZXRWYWx1ZUJ5TmFtZShcImxvZ2luXCIpO1xyXG4gICAgICBsZXQgc2lkID0gUVNVdGlscy5nZXRWYWx1ZUJ5TmFtZShcInNpZFwiKTtcclxuICAgICAgbGV0IHNzb1NpbGVudFJlcXVlc3Q6IFNzb1NpbGVudFJlcXVlc3Q7XHJcblxyXG4gICAgICBpZiAobG9naW4pIHtcclxuICAgICAgICBzc29TaWxlbnRSZXF1ZXN0ID0ge1xyXG4gICAgICAgICAgc2NvcGVzOiBNU0FMVXRpbHMuZ2V0QXBpU2NvcGVzKCksXHJcbiAgICAgICAgICBsb2dpbkhpbnQ6IGxvZ2luXHJcbiAgICAgICAgfTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmIChzaWQpIHtcclxuICAgICAgICBzc29TaWxlbnRSZXF1ZXN0ID0ge1xyXG4gICAgICAgICAgc2NvcGVzOiBNU0FMVXRpbHMuZ2V0QXBpU2NvcGVzKCksXHJcbiAgICAgICAgICBzaWQ6IHNpZFxyXG4gICAgICAgIH07XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vTG9nZ2luZ1xyXG4gICAgICBjb25zb2xlLmxvZyhcIlNTTyBpbiBwcm9ncmVzc1wiKTtcclxuICAgICAgaWYgKGNscykge1xyXG4gICAgICAgIFFTVXRpbHMuY2xlYXJLZXkoXCJjbHM9MVwiLCB0cnVlLCB0cnVlKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIHRoaXMubXNhbFNlcnZpY2Uuc3NvU2lsZW50KHNzb1NpbGVudFJlcXVlc3QpLnBpcGUoXHJcbiAgICAgICAgbWFwKHJlc3BvbnNlID0+IHtcclxuICAgICAgICAgIFFTVXRpbHMuY2xlYXJTU08oKTtcclxuXHJcbiAgICAgICAgICAvL0xvZ2dpbmdcclxuICAgICAgICAgIGNvbnNvbGUubG9nKFwiU1NPIGhhdmUgYmVlbiBzdWNjZXNzZnVsbHkgZG9uZVwiKTtcclxuXHJcbiAgICAgICAgICByZXR1cm4gcmVzcG9uc2UuYWNjZXNzVG9rZW47XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgY2F0Y2hFcnJvcihlcnJvciA9PiB7XHJcbiAgICAgICAgICBRU1V0aWxzLmNsZWFyU1NPKCk7XHJcblxyXG4gICAgICAgICAgLy9Mb2dnaW5nXHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIlNTTyBzaWxlbnQgdG9rZW4gYWNxdWlzaXRpb24gZmFpbHNcIik7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcclxuXHJcbiAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBJbnRlcmFjdGlvblJlcXVpcmVkQXV0aEVycm9yKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFjcXVpcmVUb2tlbigpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHJldHVybiBvZihudWxsKTtcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8vMi4gaWYgaXNVc2VyQXV0aGVudGljYXRlZFxyXG4gICAgbGV0IGFjdGl2ZUFjY291bnQgPSB0aGlzLmdldEFjdGl2ZUFjY291bnQoKTtcclxuICAgIGlmIChhY3RpdmVBY2NvdW50KSB7XHJcbiAgICAgIGxldCBzaWxlbnRSZXF1ZXN0OiBTaWxlbnRSZXF1ZXN0ID0ge1xyXG4gICAgICAgIHNjb3BlczogTVNBTFV0aWxzLmdldEFwaVNjb3BlcygpLFxyXG4gICAgICAgIGFjY291bnQ6IGFjdGl2ZUFjY291bnRcclxuICAgICAgfTtcclxuXHJcbiAgICAgIHJldHVybiB0aGlzLm1zYWxTZXJ2aWNlLmFjcXVpcmVUb2tlblNpbGVudChzaWxlbnRSZXF1ZXN0KS5waXBlKFxyXG4gICAgICAgIG1hcChyZXNwb25zZSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gcmVzcG9uc2UuYWNjZXNzVG9rZW47XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgY2F0Y2hFcnJvcihlcnJvciA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIlNpbGVudCB0b2tlbiBhY3F1aXNpdGlvbiBmYWlscy5cIik7XHJcblxyXG4gICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgSW50ZXJhY3Rpb25SZXF1aXJlZEF1dGhFcnJvcikge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hY3F1aXJlVG9rZW4oKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICByZXR1cm4gb2YobnVsbCk7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gb2YobnVsbCk7XHJcbiAgfVxyXG5cclxuICBmb3JjZVJlYXV0aGVudGljYXRlKGFjY291bnQ/KSB7XHJcbiAgICBpZiAoTVNBTFV0aWxzLmlzQjJDKCkpIHtcclxuICAgICAgbGV0IHNpZ25VcFNpZ25JbkZsb3dSZXF1ZXN0OiBSZWRpcmVjdFJlcXVlc3QgfCBQb3B1cFJlcXVlc3QgID0ge1xyXG4gICAgICAgIGF1dGhvcml0eTogdGhpcy5zaWduVXBTaWduSW5Qb2xpY3kuYXV0aG9yaXR5LFxyXG4gICAgICAgIHNjb3BlczogW10sXHJcbiAgICAgICAgcHJvbXB0OiBQcm9tcHRWYWx1ZS5MT0dJTiwgLy8gZm9yY2UgdXNlciB0byByZWF1dGhlbnRpY2F0ZSB3aXRoIHRoZWlyIG5ldyBwYXNzd29yZFxyXG4gICAgICAgIGFjY291bnQ6IGFjY291bnRcclxuICAgICAgfTtcclxuXHJcbiAgICAgIHRoaXMubG9naW4oc2lnblVwU2lnbkluRmxvd1JlcXVlc3QpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBsb2dpbih1c2VyRmxvd1JlcXVlc3Q/OiBSZWRpcmVjdFJlcXVlc3QgfCBQb3B1cFJlcXVlc3QsIHBvcHVwPzogYm9vbGVhbikge1xyXG4gICAgbGV0IGF1dGhSZXF1ZXN0Q2ZnOiBhbnkgPSB0aGlzLm1zYWxHdWFyZENvbmZpZy5hdXRoUmVxdWVzdDtcclxuICAgIGxldCBhdXRoUmVxdWVzdCA9IG51bGw7XHJcblxyXG4gICAgaWYgKCF1c2VyRmxvd1JlcXVlc3QpIHtcclxuICAgICAgbGV0IHNpZ25VcFNpZ25JbkZsb3dSZXF1ZXN0OiBSZWRpcmVjdFJlcXVlc3QgfCBQb3B1cFJlcXVlc3QgID0ge1xyXG4gICAgICAgIGF1dGhvcml0eTogdGhpcy5zaWduVXBTaWduSW5Qb2xpY3kuYXV0aG9yaXR5LFxyXG4gICAgICAgIHNjb3BlczogW11cclxuICAgICAgfTtcclxuXHJcbiAgICAgIHVzZXJGbG93UmVxdWVzdCA9IHNpZ25VcFNpZ25JbkZsb3dSZXF1ZXN0O1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChhdXRoUmVxdWVzdENmZykge1xyXG4gICAgICBhdXRoUmVxdWVzdCA9IGF1dGhSZXF1ZXN0Q2ZnKHRoaXMubXNhbFNlcnZpY2UsIHRoaXMucm91dGVyLnJvdXRlclN0YXRlLnNuYXBzaG90KTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5pc1BvcHVwKHBvcHVwKSkge1xyXG4gICAgICBpZiAoYXV0aFJlcXVlc3QpIHtcclxuICAgICAgICB0aGlzLm1zYWxTZXJ2aWNlLmxvZ2luUG9wdXAoeyAuLi5hdXRoUmVxdWVzdCwgLi4udXNlckZsb3dSZXF1ZXN0IH0gYXMgUG9wdXBSZXF1ZXN0KS5zdWJzY3JpYmUoKHJlc3BvbnNlOiBBdXRoZW50aWNhdGlvblJlc3VsdCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5tc2FsU2VydmljZS5pbnN0YW5jZS5zZXRBY3RpdmVBY2NvdW50KHJlc3BvbnNlLmFjY291bnQpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRoaXMubXNhbFNlcnZpY2UubG9naW5Qb3B1cCh1c2VyRmxvd1JlcXVlc3QpLnN1YnNjcmliZSgocmVzcG9uc2U6IEF1dGhlbnRpY2F0aW9uUmVzdWx0KSA9PiB7XHJcbiAgICAgICAgICB0aGlzLm1zYWxTZXJ2aWNlLmluc3RhbmNlLnNldEFjdGl2ZUFjY291bnQocmVzcG9uc2UuYWNjb3VudCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAoYXV0aFJlcXVlc3QpIHtcclxuICAgICAgICB0aGlzLm1zYWxTZXJ2aWNlLmxvZ2luUmVkaXJlY3QoeyAuLi5hdXRoUmVxdWVzdCwgLi4udXNlckZsb3dSZXF1ZXN0IH0gYXMgUmVkaXJlY3RSZXF1ZXN0KTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICB0aGlzLm1zYWxTZXJ2aWNlLmxvZ2luUmVkaXJlY3QodXNlckZsb3dSZXF1ZXN0KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbG9nb3V0KHBvcHVwPzogYm9vbGVhbikge1xyXG4gICAgbGV0IGFjdGl2ZUFjY291bnQgPSB0aGlzLmdldEFjdGl2ZUFjY291bnQoKTtcclxuXHJcbiAgICBpZiAodGhpcy5pc1BvcHVwKHBvcHVwKSkge1xyXG4gICAgICBpZiAoYWN0aXZlQWNjb3VudCkge1xyXG4gICAgICAgIHRoaXMubXNhbFNlcnZpY2UubG9nb3V0UG9wdXAoeyBhY2NvdW50OiBhY3RpdmVBY2NvdW50LCBtYWluV2luZG93UmVkaXJlY3RVcmk6IFwiL1wiIH0pLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdGhpcy5tc2FsU2VydmljZS5sb2dvdXRQb3B1cCh7IG1haW5XaW5kb3dSZWRpcmVjdFVyaTogXCIvXCIgfSkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmIChhY3RpdmVBY2NvdW50KSB7XHJcbiAgICAgICAgdGhpcy5tc2FsU2VydmljZS5sb2dvdXRSZWRpcmVjdCh7IGFjY291bnQ6IGFjdGl2ZUFjY291bnQgfSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdGhpcy5tc2FsU2VydmljZS5sb2dvdXRSZWRpcmVjdCgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvL01TQUwgY2hlY2tcclxuICBpc1VzZXJBdXRoZW50aWNhdGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMubXNhbFNlcnZpY2UuaW5zdGFuY2UuZ2V0QWN0aXZlQWNjb3VudCgpICE9IG51bGw7XHJcbiAgfVxyXG5cclxuICAvL01TQUwgKyBhcHBDb250ZXh0IGNoZWNrXHJcbiAgaXNVc2VyU2lnbmVkSW4oKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoIXRoaXMuaXNVc2VyQXV0aGVudGljYXRlZCgpKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5hcHBDb250ZXh0LmN1cnJlbnQuaXNVc2VyU2lnbmVkSW4gJiYgdGhpcy5hcHBDb250ZXh0LnVzZXIpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgaXNVc2VyQWRtaW4oKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5pc1VzZXJTaWduZWRJbigpICYmIHRoaXMuYXBwQ29udGV4dC5jdXJyZW50LmlzVXNlckFkbWluO1xyXG4gIH1cclxuXHJcbiAgLy9CMkNcclxuICBzaWduVXAoKSB7XHJcbiAgICBpZiAoIU1TQUxVdGlscy5pc0IyQygpKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgc2lnblVwRmxvd1JlcXVlc3Q6IFJlZGlyZWN0UmVxdWVzdCB8IFBvcHVwUmVxdWVzdCAgPSB7XHJcbiAgICAgIGF1dGhvcml0eTogdGhpcy5zaWduVXBQb2xpY3kuYXV0aG9yaXR5LFxyXG4gICAgICBzY29wZXM6IFtdXHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMubG9naW4oc2lnblVwRmxvd1JlcXVlc3QpO1xyXG4gIH1cclxuXHJcbiAgZWRpdFByb2ZpbGUoKSB7XHJcbiAgICBpZiAoIU1TQUxVdGlscy5pc0IyQygpKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgZWRpdFByb2ZpbGVGbG93UmVxdWVzdDogUmVkaXJlY3RSZXF1ZXN0IHwgUG9wdXBSZXF1ZXN0ICA9IHtcclxuICAgICAgYXV0aG9yaXR5OiB0aGlzLmVkaXRQcm9maWxlUG9saWN5LmF1dGhvcml0eSxcclxuICAgICAgc2NvcGVzOiBbXVxyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLmxvZ2luKGVkaXRQcm9maWxlRmxvd1JlcXVlc3QpO1xyXG4gIH1cclxuXHJcbiAgcmVzZXRQYXNzd29yZCgpIHtcclxuICAgIGlmICghTVNBTFV0aWxzLmlzQjJDKCkpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCByZXNldFBhc3N3b3JkRmxvd1JlcXVlc3Q6IFJlZGlyZWN0UmVxdWVzdCB8IFBvcHVwUmVxdWVzdCAgPSB7XHJcbiAgICAgIGF1dGhvcml0eTogdGhpcy5yZXNldFBhc3N3b3JkUG9saWN5LmF1dGhvcml0eSxcclxuICAgICAgc2NvcGVzOiBbXVxyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLmxvZ2luKHJlc2V0UGFzc3dvcmRGbG93UmVxdWVzdCk7XHJcbiAgfVxyXG59XHJcbiJdfQ==
@@ -1,42 +0,0 @@
1
- /*
2
- <file>
3
- Project:
4
- @osovitny/anatoly
5
-
6
- Authors:
7
- Vadim Osovitny vadim.osovitny@osovitny.com
8
- Anatoly Osovitny anatoly.osovitny@osovitny.com
9
-
10
- Created:
11
- 20 Sep 2023
12
-
13
- Description:
14
- Identity and Access Management
15
-
16
- Copyright (c) 2016-2025 Osovitny Inc. All rights reserved.
17
- </file>
18
- */
19
- export const MSALStorageKeys = {
20
- //LocalStorage
21
- redirectTo: 'msal.app.redirectTo'
22
- //SessionStorage
23
- };
24
- export class MSALStorage {
25
- static saveRedirectState(redirectTo, calledBy) {
26
- if (redirectTo.indexOf('iam') >= 0) {
27
- return;
28
- }
29
- localStorage.setItem(MSALStorageKeys.redirectTo, redirectTo);
30
- console.log(`msal.app: redirect state saved: ${redirectTo}. Called by: ${calledBy}`);
31
- }
32
- static getRedirectState(calledBy) {
33
- let redirectTo = localStorage.getItem(MSALStorageKeys.redirectTo);
34
- console.log(`msal.app: redirect state requested: ${redirectTo}. Called by: ${calledBy}`);
35
- return redirectTo;
36
- }
37
- static clearRedirectState(calledBy) {
38
- localStorage.removeItem(MSALStorageKeys.redirectTo);
39
- console.log(`msal.app: redirect state cleared. Called by: ${calledBy}`);
40
- }
41
- }
42
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuYXRvbHkvc3JjL2xpYi9pYW0vc3RvcmFnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7RUFpQkU7QUFFRixNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUc7SUFDN0IsY0FBYztJQUNkLFVBQVUsRUFBRSxxQkFBcUI7SUFFakMsZ0JBQWdCO0NBQ2pCLENBQUE7QUFFRCxNQUFNLE9BQU8sV0FBVztJQUNmLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxVQUFrQixFQUFFLFFBQWdCO1FBQ2xFLElBQUksVUFBVSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNuQyxPQUFPO1FBQ1QsQ0FBQztRQUVELFlBQVksQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUM3RCxPQUFPLENBQUMsR0FBRyxDQUFDLG1DQUFtQyxVQUFVLGdCQUFnQixRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZGLENBQUM7SUFFTSxNQUFNLENBQUMsZ0JBQWdCLENBQUMsUUFBZ0I7UUFDN0MsSUFBSSxVQUFVLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDbEUsT0FBTyxDQUFDLEdBQUcsQ0FBQyx1Q0FBdUMsVUFBVSxnQkFBZ0IsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUV6RixPQUFPLFVBQVUsQ0FBQztJQUNwQixDQUFDO0lBRU0sTUFBTSxDQUFDLGtCQUFrQixDQUFDLFFBQWdCO1FBQy9DLFlBQVksQ0FBQyxVQUFVLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3BELE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0RBQWdELFFBQVEsRUFBRSxDQUFDLENBQUM7SUFDMUUsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLypcclxuPGZpbGU+XHJcbiAgUHJvamVjdDpcclxuICAgIEBvc292aXRueS9hbmF0b2x5XHJcblxyXG4gIEF1dGhvcnM6XHJcbiAgICBWYWRpbSBPc292aXRueSB2YWRpbS5vc292aXRueUBvc292aXRueS5jb21cclxuICAgIEFuYXRvbHkgT3Nvdml0bnkgYW5hdG9seS5vc292aXRueUBvc292aXRueS5jb21cclxuXHJcblx0Q3JlYXRlZDpcclxuXHRcdDIwIFNlcCAyMDIzXHJcblxyXG4gIERlc2NyaXB0aW9uOlxyXG4gICAgSWRlbnRpdHkgYW5kIEFjY2VzcyBNYW5hZ2VtZW50XHJcblxyXG5cdENvcHlyaWdodCAoYykgMjAxNi0yMDI1IE9zb3ZpdG55IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cclxuPC9maWxlPlxyXG4qL1xyXG5cclxuZXhwb3J0IGNvbnN0IE1TQUxTdG9yYWdlS2V5cyA9IHtcclxuICAvL0xvY2FsU3RvcmFnZVxyXG4gIHJlZGlyZWN0VG86ICdtc2FsLmFwcC5yZWRpcmVjdFRvJ1xyXG5cclxuICAvL1Nlc3Npb25TdG9yYWdlXHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBNU0FMU3RvcmFnZSB7XHJcbiAgcHVibGljIHN0YXRpYyBzYXZlUmVkaXJlY3RTdGF0ZShyZWRpcmVjdFRvOiBzdHJpbmcsIGNhbGxlZEJ5OiBzdHJpbmcpIHtcclxuICAgIGlmIChyZWRpcmVjdFRvLmluZGV4T2YoJ2lhbScpID49IDApIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKE1TQUxTdG9yYWdlS2V5cy5yZWRpcmVjdFRvLCByZWRpcmVjdFRvKTtcclxuICAgIGNvbnNvbGUubG9nKGBtc2FsLmFwcDogcmVkaXJlY3Qgc3RhdGUgc2F2ZWQ6ICR7cmVkaXJlY3RUb30uIENhbGxlZCBieTogJHtjYWxsZWRCeX1gKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgZ2V0UmVkaXJlY3RTdGF0ZShjYWxsZWRCeTogc3RyaW5nKSB7XHJcbiAgICBsZXQgcmVkaXJlY3RUbyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKE1TQUxTdG9yYWdlS2V5cy5yZWRpcmVjdFRvKTtcclxuICAgIGNvbnNvbGUubG9nKGBtc2FsLmFwcDogcmVkaXJlY3Qgc3RhdGUgcmVxdWVzdGVkOiAke3JlZGlyZWN0VG99LiBDYWxsZWQgYnk6ICR7Y2FsbGVkQnl9YCk7XHJcblxyXG4gICAgcmV0dXJuIHJlZGlyZWN0VG87XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIGNsZWFyUmVkaXJlY3RTdGF0ZShjYWxsZWRCeTogc3RyaW5nKSB7XHJcbiAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShNU0FMU3RvcmFnZUtleXMucmVkaXJlY3RUbyk7XHJcbiAgICBjb25zb2xlLmxvZyhgbXNhbC5hcHA6IHJlZGlyZWN0IHN0YXRlIGNsZWFyZWQuIENhbGxlZCBieTogJHtjYWxsZWRCeX1gKTtcclxuICB9XHJcbn1cclxuIl19
@@ -1,49 +0,0 @@
1
- /*
2
- <file>
3
- Project:
4
- @osovitny/anatoly
5
-
6
- Authors:
7
- Vadim Osovitny vadim.osovitny@osovitny.com
8
- Anatoly Osovitny anatoly.osovitny@osovitny.com
9
-
10
- Created:
11
- 27 Nov 2023
12
-
13
- Description:
14
- Identity and Access Management
15
-
16
- Copyright (c) 2016-2025 Osovitny Inc. All rights reserved.
17
- </file>
18
- */
19
- //Node
20
- import { BrowserUtils } from '@azure/msal-browser';
21
- //App
22
- import { MSALApiConfig, MSALB2CConfig } from './consts';
23
- export class MSALUtils {
24
- static isB2C() {
25
- if (MSALB2CConfig) {
26
- return true;
27
- }
28
- return false;
29
- }
30
- // Don't perform initial navigation in iframes or popups
31
- static initialNavigation() {
32
- return !BrowserUtils.isInIframe() && !BrowserUtils.isInPopup() ? 'enabledNonBlocking' : 'disabled';
33
- }
34
- static getApi() {
35
- let map = new Map();
36
- let api = MSALApiConfig;
37
- map.set(api.uri, api.scopes);
38
- return map;
39
- }
40
- static getApiScopes() {
41
- let scopes = [];
42
- let api = MSALApiConfig;
43
- for (const scope of api.scopes) {
44
- scopes.push(scope);
45
- }
46
- return scopes;
47
- }
48
- }
49
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmF0b2x5L3NyYy9saWIvaWFtL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7OztFQWlCRTtBQUVGLE1BQU07QUFDTixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFbkQsS0FBSztBQUNMLE9BQU8sRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRXhELE1BQU0sT0FBTyxTQUFTO0lBQ2IsTUFBTSxDQUFDLEtBQUs7UUFDakIsSUFBSSxhQUFhLEVBQUUsQ0FBQztZQUNsQixPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFFRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCx3REFBd0Q7SUFDakQsTUFBTSxDQUFDLGlCQUFpQjtRQUM3QixPQUFPLENBQUMsWUFBWSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDO0lBQ3JHLENBQUM7SUFFTSxNQUFNLENBQUMsTUFBTTtRQUNsQixJQUFJLEdBQUcsR0FBRyxJQUFJLEdBQUcsRUFBeUIsQ0FBQztRQUMzQyxJQUFJLEdBQUcsR0FBRyxhQUFhLENBQUM7UUFFeEIsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM3QixPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFFTSxNQUFNLENBQUMsWUFBWTtRQUN4QixJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDaEIsSUFBSSxHQUFHLEdBQUcsYUFBYSxDQUFDO1FBRXhCLEtBQUssTUFBTSxLQUFLLElBQUksR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQy9CLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDckIsQ0FBQztRQUVELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qXHJcbjxmaWxlPlxyXG4gIFByb2plY3Q6XHJcbiAgICBAb3Nvdml0bnkvYW5hdG9seVxyXG5cclxuICBBdXRob3JzOlxyXG4gICAgVmFkaW0gT3Nvdml0bnkgdmFkaW0ub3Nvdml0bnlAb3Nvdml0bnkuY29tXHJcbiAgICBBbmF0b2x5IE9zb3ZpdG55IGFuYXRvbHkub3Nvdml0bnlAb3Nvdml0bnkuY29tXHJcblxyXG5cdENyZWF0ZWQ6XHJcblx0XHQyNyBOb3YgMjAyM1xyXG5cclxuICBEZXNjcmlwdGlvbjpcclxuICAgIElkZW50aXR5IGFuZCBBY2Nlc3MgTWFuYWdlbWVudFxyXG5cclxuXHRDb3B5cmlnaHQgKGMpIDIwMTYtMjAyNSBPc292aXRueSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbjwvZmlsZT5cclxuKi9cclxuXHJcbi8vTm9kZVxyXG5pbXBvcnQgeyBCcm93c2VyVXRpbHMgfSBmcm9tICdAYXp1cmUvbXNhbC1icm93c2VyJztcclxuXHJcbi8vQXBwXHJcbmltcG9ydCB7IE1TQUxBcGlDb25maWcsIE1TQUxCMkNDb25maWcgfSBmcm9tICcuL2NvbnN0cyc7XHJcblxyXG5leHBvcnQgY2xhc3MgTVNBTFV0aWxzIHtcclxuICBwdWJsaWMgc3RhdGljIGlzQjJDKCkge1xyXG4gICAgaWYgKE1TQUxCMkNDb25maWcpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy8gRG9uJ3QgcGVyZm9ybSBpbml0aWFsIG5hdmlnYXRpb24gaW4gaWZyYW1lcyBvciBwb3B1cHNcclxuICBwdWJsaWMgc3RhdGljIGluaXRpYWxOYXZpZ2F0aW9uKCkge1xyXG4gICAgcmV0dXJuICFCcm93c2VyVXRpbHMuaXNJbklmcmFtZSgpICYmICFCcm93c2VyVXRpbHMuaXNJblBvcHVwKCkgPyAnZW5hYmxlZE5vbkJsb2NraW5nJyA6ICdkaXNhYmxlZCc7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIGdldEFwaSgpIDogTWFwPHN0cmluZywgQXJyYXk8c3RyaW5nPj4ge1xyXG4gICAgbGV0IG1hcCA9IG5ldyBNYXA8c3RyaW5nLCBBcnJheTxzdHJpbmc+PigpO1xyXG4gICAgbGV0IGFwaSA9IE1TQUxBcGlDb25maWc7XHJcblxyXG4gICAgbWFwLnNldChhcGkudXJpLCBhcGkuc2NvcGVzKTtcclxuICAgIHJldHVybiBtYXA7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhdGljIGdldEFwaVNjb3BlcygpIDogYW55W10ge1xyXG4gICAgbGV0IHNjb3BlcyA9IFtdO1xyXG4gICAgbGV0IGFwaSA9IE1TQUxBcGlDb25maWc7XHJcblxyXG4gICAgZm9yIChjb25zdCBzY29wZSBvZiBhcGkuc2NvcGVzKSB7XHJcbiAgICAgIHNjb3Blcy5wdXNoKHNjb3BlKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gc2NvcGVzO1xyXG4gIH1cclxufVxyXG4iXX0=