@azure/msal-angular 3.0.22 → 3.0.24

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.
@@ -1,270 +1,270 @@
1
- /*
2
- * Copyright (c) Microsoft Corporation. All rights reserved.
3
- * Licensed under the MIT License.
4
- */
5
- import { Injectable, Inject } from "@angular/core";
6
- import { DOCUMENT } from "@angular/common";
7
- import { BrowserConfigurationAuthError, InteractionStatus, InteractionType, StringUtils, } from "@azure/msal-browser";
8
- import { EMPTY, of } from "rxjs";
9
- import { switchMap, catchError, take, filter } from "rxjs/operators";
10
- import { MSAL_INTERCEPTOR_CONFIG } from "./constants";
11
- import * as i0 from "@angular/core";
12
- import * as i1 from "./msal.service";
13
- import * as i2 from "@angular/common";
14
- import * as i3 from "./msal.broadcast.service";
15
- export class MsalInterceptor {
16
- constructor(msalInterceptorConfig, authService, location, msalBroadcastService,
17
- // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types
18
- document) {
19
- this.msalInterceptorConfig = msalInterceptorConfig;
20
- this.authService = authService;
21
- this.location = location;
22
- this.msalBroadcastService = msalBroadcastService;
23
- this._document = document;
24
- }
25
- intercept(req, // eslint-disable-line @typescript-eslint/no-explicit-any
26
- next
27
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
28
- ) {
29
- if (this.msalInterceptorConfig.interactionType !== InteractionType.Popup &&
30
- this.msalInterceptorConfig.interactionType !== InteractionType.Redirect) {
31
- throw new BrowserConfigurationAuthError("invalid_interaction_type", "Invalid interaction type provided to MSAL Interceptor. InteractionType.Popup, InteractionType.Redirect must be provided in the msalInterceptorConfiguration");
32
- }
33
- this.authService.getLogger().verbose("MSAL Interceptor activated");
34
- const scopes = this.getScopesForEndpoint(req.url, req.method);
35
- // If no scopes for endpoint, does not acquire token
36
- if (!scopes || scopes.length === 0) {
37
- this.authService
38
- .getLogger()
39
- .verbose("Interceptor - no scopes for endpoint");
40
- return next.handle(req);
41
- }
42
- // Sets account as active account or first account
43
- let account;
44
- if (!!this.authService.instance.getActiveAccount()) {
45
- this.authService
46
- .getLogger()
47
- .verbose("Interceptor - active account selected");
48
- account = this.authService.instance.getActiveAccount();
49
- }
50
- else {
51
- this.authService
52
- .getLogger()
53
- .verbose("Interceptor - no active account, fallback to first account");
54
- account = this.authService.instance.getAllAccounts()[0];
55
- }
56
- const authRequest = typeof this.msalInterceptorConfig.authRequest === "function"
57
- ? this.msalInterceptorConfig.authRequest(this.authService, req, {
58
- account: account,
59
- })
60
- : { ...this.msalInterceptorConfig.authRequest, account };
61
- this.authService
62
- .getLogger()
63
- .info(`Interceptor - ${scopes.length} scopes found for endpoint`);
64
- this.authService
65
- .getLogger()
66
- .infoPii(`Interceptor - [${scopes}] scopes found for ${req.url}`);
67
- return this.acquireToken(authRequest, scopes, account).pipe(switchMap((result) => {
68
- this.authService
69
- .getLogger()
70
- .verbose("Interceptor - setting authorization headers");
71
- const headers = req.headers.set("Authorization", `Bearer ${result.accessToken}`);
72
- const requestClone = req.clone({ headers });
73
- return next.handle(requestClone);
74
- }));
75
- }
76
- /**
77
- * Try to acquire token silently. Invoke interaction if acquireTokenSilent rejected with error or resolved with null access token
78
- * @param authRequest Request
79
- * @param scopes Array of scopes for the request
80
- * @param account Account
81
- * @returns Authentication result
82
- */
83
- acquireToken(authRequest, scopes, account) {
84
- // Note: For MSA accounts, include openid scope when calling acquireTokenSilent to return idToken
85
- return this.authService
86
- .acquireTokenSilent({ ...authRequest, scopes, account })
87
- .pipe(catchError(() => {
88
- this.authService
89
- .getLogger()
90
- .error("Interceptor - acquireTokenSilent rejected with error. Invoking interaction to resolve.");
91
- return this.msalBroadcastService.inProgress$.pipe(take(1), switchMap((status) => {
92
- if (status === InteractionStatus.None) {
93
- return this.acquireTokenInteractively(authRequest, scopes);
94
- }
95
- return this.msalBroadcastService.inProgress$.pipe(filter((status) => status === InteractionStatus.None), take(1), switchMap(() => this.acquireToken(authRequest, scopes, account)));
96
- }));
97
- }), switchMap((result) => {
98
- if (!result.accessToken) {
99
- this.authService
100
- .getLogger()
101
- .error("Interceptor - acquireTokenSilent resolved with null access token. Known issue with B2C tenants, invoking interaction to resolve.");
102
- return this.msalBroadcastService.inProgress$.pipe(filter((status) => status === InteractionStatus.None), take(1), switchMap(() => this.acquireTokenInteractively(authRequest, scopes)));
103
- }
104
- return of(result);
105
- }));
106
- }
107
- /**
108
- * Invoke interaction for the given set of scopes
109
- * @param authRequest Request
110
- * @param scopes Array of scopes for the request
111
- * @returns Result from the interactive request
112
- */
113
- acquireTokenInteractively(authRequest, scopes) {
114
- if (this.msalInterceptorConfig.interactionType === InteractionType.Popup) {
115
- this.authService
116
- .getLogger()
117
- .verbose("Interceptor - error acquiring token silently, acquiring by popup");
118
- return this.authService.acquireTokenPopup({ ...authRequest, scopes });
119
- }
120
- this.authService
121
- .getLogger()
122
- .verbose("Interceptor - error acquiring token silently, acquiring by redirect");
123
- const redirectStartPage = window.location.href;
124
- this.authService.acquireTokenRedirect({
125
- ...authRequest,
126
- scopes,
127
- redirectStartPage,
128
- });
129
- return EMPTY;
130
- }
131
- /**
132
- * Looks up the scopes for the given endpoint from the protectedResourceMap
133
- * @param endpoint Url of the request
134
- * @param httpMethod Http method of the request
135
- * @returns Array of scopes, or null if not found
136
- *
137
- */
138
- getScopesForEndpoint(endpoint, httpMethod) {
139
- this.authService
140
- .getLogger()
141
- .verbose("Interceptor - getting scopes for endpoint");
142
- // Ensures endpoints and protected resources compared are normalized
143
- const normalizedEndpoint = this.location.normalize(endpoint);
144
- const protectedResourcesArray = Array.from(this.msalInterceptorConfig.protectedResourceMap.keys());
145
- const matchingProtectedResources = this.matchResourcesToEndpoint(protectedResourcesArray, normalizedEndpoint);
146
- if (matchingProtectedResources.length > 0) {
147
- return this.matchScopesToEndpoint(this.msalInterceptorConfig.protectedResourceMap, matchingProtectedResources, httpMethod);
148
- }
149
- return null;
150
- }
151
- /**
152
- * Finds resource endpoints that match request endpoint
153
- * @param protectedResourcesEndpoints
154
- * @param endpoint
155
- * @returns
156
- */
157
- matchResourcesToEndpoint(protectedResourcesEndpoints, endpoint) {
158
- const matchingResources = [];
159
- protectedResourcesEndpoints.forEach((key) => {
160
- const normalizedKey = this.location.normalize(key);
161
- // Get url components
162
- const absoluteKey = this.getAbsoluteUrl(normalizedKey);
163
- const keyComponents = new URL(absoluteKey);
164
- const absoluteEndpoint = this.getAbsoluteUrl(endpoint);
165
- const endpointComponents = new URL(absoluteEndpoint);
166
- if (this.checkUrlComponents(keyComponents, endpointComponents)) {
167
- matchingResources.push(key);
168
- }
169
- });
170
- return matchingResources;
171
- }
172
- /**
173
- * Compares URL segments between key and endpoint
174
- * @param key
175
- * @param endpoint
176
- * @returns
177
- */
178
- checkUrlComponents(keyComponents, endpointComponents) {
179
- // URL properties from https://developer.mozilla.org/en-US/docs/Web/API/URL
180
- const urlProperties = ["protocol", "host", "pathname", "search", "hash"];
181
- for (const property of urlProperties) {
182
- if (keyComponents[property]) {
183
- const decodedInput = decodeURIComponent(keyComponents[property]);
184
- if (!StringUtils.matchPattern(decodedInput, endpointComponents[property])) {
185
- return false;
186
- }
187
- }
188
- }
189
- return true;
190
- }
191
- /**
192
- * Transforms relative urls to absolute urls
193
- * @param url
194
- * @returns
195
- */
196
- getAbsoluteUrl(url) {
197
- const link = this._document.createElement("a");
198
- link.href = url;
199
- return link.href;
200
- }
201
- /**
202
- * Finds scopes from first matching endpoint with HTTP method that matches request
203
- * @param protectedResourceMap Protected resource map
204
- * @param endpointArray Array of resources that match request endpoint
205
- * @param httpMethod Http method of the request
206
- * @returns
207
- */
208
- matchScopesToEndpoint(protectedResourceMap, endpointArray, httpMethod) {
209
- const allMatchedScopes = [];
210
- // Check each matched endpoint for matching HttpMethod and scopes
211
- endpointArray.forEach((matchedEndpoint) => {
212
- const scopesForEndpoint = [];
213
- const methodAndScopesArray = protectedResourceMap.get(matchedEndpoint);
214
- // Return if resource is unprotected
215
- if (methodAndScopesArray === null) {
216
- allMatchedScopes.push(null);
217
- return;
218
- }
219
- methodAndScopesArray.forEach((entry) => {
220
- // Entry is either array of scopes or ProtectedResourceScopes object
221
- if (typeof entry === "string") {
222
- scopesForEndpoint.push(entry);
223
- }
224
- else {
225
- // Ensure methods being compared are normalized
226
- const normalizedRequestMethod = httpMethod.toLowerCase();
227
- const normalizedResourceMethod = entry.httpMethod.toLowerCase();
228
- // Method in protectedResourceMap matches request http method
229
- if (normalizedResourceMethod === normalizedRequestMethod) {
230
- // Validate if scopes comes null to unprotect the resource in a certain http method
231
- if (entry.scopes === null) {
232
- allMatchedScopes.push(null);
233
- }
234
- else {
235
- entry.scopes.forEach((scope) => {
236
- scopesForEndpoint.push(scope);
237
- });
238
- }
239
- }
240
- }
241
- });
242
- // Only add to all scopes if scopes for endpoint and method is found
243
- if (scopesForEndpoint.length > 0) {
244
- allMatchedScopes.push(scopesForEndpoint);
245
- }
246
- });
247
- if (allMatchedScopes.length > 0) {
248
- if (allMatchedScopes.length > 1) {
249
- this.authService
250
- .getLogger()
251
- .warning("Interceptor - More than 1 matching scopes for endpoint found.");
252
- }
253
- // Returns scopes for first matching endpoint
254
- return allMatchedScopes[0];
255
- }
256
- return null;
257
- }
258
- }
259
- MsalInterceptor.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: MsalInterceptor, deps: [{ token: MSAL_INTERCEPTOR_CONFIG }, { token: i1.MsalService }, { token: i2.Location }, { token: i3.MsalBroadcastService }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Injectable });
260
- MsalInterceptor.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: MsalInterceptor });
261
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: MsalInterceptor, decorators: [{
262
- type: Injectable
263
- }], ctorParameters: function () { return [{ type: undefined, decorators: [{
264
- type: Inject,
265
- args: [MSAL_INTERCEPTOR_CONFIG]
266
- }] }, { type: i1.MsalService }, { type: i2.Location }, { type: i3.MsalBroadcastService }, { type: undefined, decorators: [{
267
- type: Inject,
268
- args: [DOCUMENT]
269
- }] }]; } });
1
+ /*
2
+ * Copyright (c) Microsoft Corporation. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+ import { Injectable, Inject } from "@angular/core";
6
+ import { DOCUMENT } from "@angular/common";
7
+ import { BrowserConfigurationAuthError, InteractionStatus, InteractionType, StringUtils, } from "@azure/msal-browser";
8
+ import { EMPTY, of } from "rxjs";
9
+ import { switchMap, catchError, take, filter } from "rxjs/operators";
10
+ import { MSAL_INTERCEPTOR_CONFIG } from "./constants";
11
+ import * as i0 from "@angular/core";
12
+ import * as i1 from "./msal.service";
13
+ import * as i2 from "@angular/common";
14
+ import * as i3 from "./msal.broadcast.service";
15
+ export class MsalInterceptor {
16
+ constructor(msalInterceptorConfig, authService, location, msalBroadcastService,
17
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types
18
+ document) {
19
+ this.msalInterceptorConfig = msalInterceptorConfig;
20
+ this.authService = authService;
21
+ this.location = location;
22
+ this.msalBroadcastService = msalBroadcastService;
23
+ this._document = document;
24
+ }
25
+ intercept(req, // eslint-disable-line @typescript-eslint/no-explicit-any
26
+ next
27
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
28
+ ) {
29
+ if (this.msalInterceptorConfig.interactionType !== InteractionType.Popup &&
30
+ this.msalInterceptorConfig.interactionType !== InteractionType.Redirect) {
31
+ throw new BrowserConfigurationAuthError("invalid_interaction_type", "Invalid interaction type provided to MSAL Interceptor. InteractionType.Popup, InteractionType.Redirect must be provided in the msalInterceptorConfiguration");
32
+ }
33
+ this.authService.getLogger().verbose("MSAL Interceptor activated");
34
+ const scopes = this.getScopesForEndpoint(req.url, req.method);
35
+ // If no scopes for endpoint, does not acquire token
36
+ if (!scopes || scopes.length === 0) {
37
+ this.authService
38
+ .getLogger()
39
+ .verbose("Interceptor - no scopes for endpoint");
40
+ return next.handle(req);
41
+ }
42
+ // Sets account as active account or first account
43
+ let account;
44
+ if (!!this.authService.instance.getActiveAccount()) {
45
+ this.authService
46
+ .getLogger()
47
+ .verbose("Interceptor - active account selected");
48
+ account = this.authService.instance.getActiveAccount();
49
+ }
50
+ else {
51
+ this.authService
52
+ .getLogger()
53
+ .verbose("Interceptor - no active account, fallback to first account");
54
+ account = this.authService.instance.getAllAccounts()[0];
55
+ }
56
+ const authRequest = typeof this.msalInterceptorConfig.authRequest === "function"
57
+ ? this.msalInterceptorConfig.authRequest(this.authService, req, {
58
+ account: account,
59
+ })
60
+ : { ...this.msalInterceptorConfig.authRequest, account };
61
+ this.authService
62
+ .getLogger()
63
+ .info(`Interceptor - ${scopes.length} scopes found for endpoint`);
64
+ this.authService
65
+ .getLogger()
66
+ .infoPii(`Interceptor - [${scopes}] scopes found for ${req.url}`);
67
+ return this.acquireToken(authRequest, scopes, account).pipe(switchMap((result) => {
68
+ this.authService
69
+ .getLogger()
70
+ .verbose("Interceptor - setting authorization headers");
71
+ const headers = req.headers.set("Authorization", `Bearer ${result.accessToken}`);
72
+ const requestClone = req.clone({ headers });
73
+ return next.handle(requestClone);
74
+ }));
75
+ }
76
+ /**
77
+ * Try to acquire token silently. Invoke interaction if acquireTokenSilent rejected with error or resolved with null access token
78
+ * @param authRequest Request
79
+ * @param scopes Array of scopes for the request
80
+ * @param account Account
81
+ * @returns Authentication result
82
+ */
83
+ acquireToken(authRequest, scopes, account) {
84
+ // Note: For MSA accounts, include openid scope when calling acquireTokenSilent to return idToken
85
+ return this.authService
86
+ .acquireTokenSilent({ ...authRequest, scopes, account })
87
+ .pipe(catchError(() => {
88
+ this.authService
89
+ .getLogger()
90
+ .error("Interceptor - acquireTokenSilent rejected with error. Invoking interaction to resolve.");
91
+ return this.msalBroadcastService.inProgress$.pipe(take(1), switchMap((status) => {
92
+ if (status === InteractionStatus.None) {
93
+ return this.acquireTokenInteractively(authRequest, scopes);
94
+ }
95
+ return this.msalBroadcastService.inProgress$.pipe(filter((status) => status === InteractionStatus.None), take(1), switchMap(() => this.acquireToken(authRequest, scopes, account)));
96
+ }));
97
+ }), switchMap((result) => {
98
+ if (!result.accessToken) {
99
+ this.authService
100
+ .getLogger()
101
+ .error("Interceptor - acquireTokenSilent resolved with null access token. Known issue with B2C tenants, invoking interaction to resolve.");
102
+ return this.msalBroadcastService.inProgress$.pipe(filter((status) => status === InteractionStatus.None), take(1), switchMap(() => this.acquireTokenInteractively(authRequest, scopes)));
103
+ }
104
+ return of(result);
105
+ }));
106
+ }
107
+ /**
108
+ * Invoke interaction for the given set of scopes
109
+ * @param authRequest Request
110
+ * @param scopes Array of scopes for the request
111
+ * @returns Result from the interactive request
112
+ */
113
+ acquireTokenInteractively(authRequest, scopes) {
114
+ if (this.msalInterceptorConfig.interactionType === InteractionType.Popup) {
115
+ this.authService
116
+ .getLogger()
117
+ .verbose("Interceptor - error acquiring token silently, acquiring by popup");
118
+ return this.authService.acquireTokenPopup({ ...authRequest, scopes });
119
+ }
120
+ this.authService
121
+ .getLogger()
122
+ .verbose("Interceptor - error acquiring token silently, acquiring by redirect");
123
+ const redirectStartPage = window.location.href;
124
+ this.authService.acquireTokenRedirect({
125
+ ...authRequest,
126
+ scopes,
127
+ redirectStartPage,
128
+ });
129
+ return EMPTY;
130
+ }
131
+ /**
132
+ * Looks up the scopes for the given endpoint from the protectedResourceMap
133
+ * @param endpoint Url of the request
134
+ * @param httpMethod Http method of the request
135
+ * @returns Array of scopes, or null if not found
136
+ *
137
+ */
138
+ getScopesForEndpoint(endpoint, httpMethod) {
139
+ this.authService
140
+ .getLogger()
141
+ .verbose("Interceptor - getting scopes for endpoint");
142
+ // Ensures endpoints and protected resources compared are normalized
143
+ const normalizedEndpoint = this.location.normalize(endpoint);
144
+ const protectedResourcesArray = Array.from(this.msalInterceptorConfig.protectedResourceMap.keys());
145
+ const matchingProtectedResources = this.matchResourcesToEndpoint(protectedResourcesArray, normalizedEndpoint);
146
+ if (matchingProtectedResources.length > 0) {
147
+ return this.matchScopesToEndpoint(this.msalInterceptorConfig.protectedResourceMap, matchingProtectedResources, httpMethod);
148
+ }
149
+ return null;
150
+ }
151
+ /**
152
+ * Finds resource endpoints that match request endpoint
153
+ * @param protectedResourcesEndpoints
154
+ * @param endpoint
155
+ * @returns
156
+ */
157
+ matchResourcesToEndpoint(protectedResourcesEndpoints, endpoint) {
158
+ const matchingResources = [];
159
+ protectedResourcesEndpoints.forEach((key) => {
160
+ const normalizedKey = this.location.normalize(key);
161
+ // Get url components
162
+ const absoluteKey = this.getAbsoluteUrl(normalizedKey);
163
+ const keyComponents = new URL(absoluteKey);
164
+ const absoluteEndpoint = this.getAbsoluteUrl(endpoint);
165
+ const endpointComponents = new URL(absoluteEndpoint);
166
+ if (this.checkUrlComponents(keyComponents, endpointComponents)) {
167
+ matchingResources.push(key);
168
+ }
169
+ });
170
+ return matchingResources;
171
+ }
172
+ /**
173
+ * Compares URL segments between key and endpoint
174
+ * @param key
175
+ * @param endpoint
176
+ * @returns
177
+ */
178
+ checkUrlComponents(keyComponents, endpointComponents) {
179
+ // URL properties from https://developer.mozilla.org/en-US/docs/Web/API/URL
180
+ const urlProperties = ["protocol", "host", "pathname", "search", "hash"];
181
+ for (const property of urlProperties) {
182
+ if (keyComponents[property]) {
183
+ const decodedInput = decodeURIComponent(keyComponents[property]);
184
+ if (!StringUtils.matchPattern(decodedInput, endpointComponents[property])) {
185
+ return false;
186
+ }
187
+ }
188
+ }
189
+ return true;
190
+ }
191
+ /**
192
+ * Transforms relative urls to absolute urls
193
+ * @param url
194
+ * @returns
195
+ */
196
+ getAbsoluteUrl(url) {
197
+ const link = this._document.createElement("a");
198
+ link.href = url;
199
+ return link.href;
200
+ }
201
+ /**
202
+ * Finds scopes from first matching endpoint with HTTP method that matches request
203
+ * @param protectedResourceMap Protected resource map
204
+ * @param endpointArray Array of resources that match request endpoint
205
+ * @param httpMethod Http method of the request
206
+ * @returns
207
+ */
208
+ matchScopesToEndpoint(protectedResourceMap, endpointArray, httpMethod) {
209
+ const allMatchedScopes = [];
210
+ // Check each matched endpoint for matching HttpMethod and scopes
211
+ endpointArray.forEach((matchedEndpoint) => {
212
+ const scopesForEndpoint = [];
213
+ const methodAndScopesArray = protectedResourceMap.get(matchedEndpoint);
214
+ // Return if resource is unprotected
215
+ if (methodAndScopesArray === null) {
216
+ allMatchedScopes.push(null);
217
+ return;
218
+ }
219
+ methodAndScopesArray.forEach((entry) => {
220
+ // Entry is either array of scopes or ProtectedResourceScopes object
221
+ if (typeof entry === "string") {
222
+ scopesForEndpoint.push(entry);
223
+ }
224
+ else {
225
+ // Ensure methods being compared are normalized
226
+ const normalizedRequestMethod = httpMethod.toLowerCase();
227
+ const normalizedResourceMethod = entry.httpMethod.toLowerCase();
228
+ // Method in protectedResourceMap matches request http method
229
+ if (normalizedResourceMethod === normalizedRequestMethod) {
230
+ // Validate if scopes comes null to unprotect the resource in a certain http method
231
+ if (entry.scopes === null) {
232
+ allMatchedScopes.push(null);
233
+ }
234
+ else {
235
+ entry.scopes.forEach((scope) => {
236
+ scopesForEndpoint.push(scope);
237
+ });
238
+ }
239
+ }
240
+ }
241
+ });
242
+ // Only add to all scopes if scopes for endpoint and method is found
243
+ if (scopesForEndpoint.length > 0) {
244
+ allMatchedScopes.push(scopesForEndpoint);
245
+ }
246
+ });
247
+ if (allMatchedScopes.length > 0) {
248
+ if (allMatchedScopes.length > 1) {
249
+ this.authService
250
+ .getLogger()
251
+ .warning("Interceptor - More than 1 matching scopes for endpoint found.");
252
+ }
253
+ // Returns scopes for first matching endpoint
254
+ return allMatchedScopes[0];
255
+ }
256
+ return null;
257
+ }
258
+ }
259
+ MsalInterceptor.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: MsalInterceptor, deps: [{ token: MSAL_INTERCEPTOR_CONFIG }, { token: i1.MsalService }, { token: i2.Location }, { token: i3.MsalBroadcastService }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Injectable });
260
+ MsalInterceptor.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: MsalInterceptor });
261
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: MsalInterceptor, decorators: [{
262
+ type: Injectable
263
+ }], ctorParameters: function () { return [{ type: undefined, decorators: [{
264
+ type: Inject,
265
+ args: [MSAL_INTERCEPTOR_CONFIG]
266
+ }] }, { type: i1.MsalService }, { type: i2.Location }, { type: i3.MsalBroadcastService }, { type: undefined, decorators: [{
267
+ type: Inject,
268
+ args: [DOCUMENT]
269
+ }] }]; } });
270
270
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXNhbC5pbnRlcmNlcHRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tc2FsLmludGVyY2VwdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQUVILE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBWSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQU9yRCxPQUFPLEVBR0wsNkJBQTZCLEVBQzdCLGlCQUFpQixFQUNqQixlQUFlLEVBQ2YsV0FBVyxHQUNaLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFjLEtBQUssRUFBRSxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDN0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBUXJFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGFBQWEsQ0FBQzs7Ozs7QUFHdEQsTUFBTSxPQUFPLGVBQWU7SUFHMUIsWUFFVSxxQkFBbUQsRUFDbkQsV0FBd0IsRUFDeEIsUUFBa0IsRUFDbEIsb0JBQTBDO0lBQ2xELGlIQUFpSDtJQUMvRixRQUFjO1FBTHhCLDBCQUFxQixHQUFyQixxQkFBcUIsQ0FBOEI7UUFDbkQsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDeEIsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUNsQix5QkFBb0IsR0FBcEIsb0JBQW9CLENBQXNCO1FBSWxELElBQUksQ0FBQyxTQUFTLEdBQUcsUUFBb0IsQ0FBQztJQUN4QyxDQUFDO0lBRUQsU0FBUyxDQUNQLEdBQXFCLEVBQUUseURBQXlEO0lBQ2hGLElBQWlCO0lBQ2pCLDhEQUE4RDs7UUFFOUQsSUFDRSxJQUFJLENBQUMscUJBQXFCLENBQUMsZUFBZSxLQUFLLGVBQWUsQ0FBQyxLQUFLO1lBQ3BFLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxlQUFlLEtBQUss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WUFDL0IsSUFBSSxnQkFBZ0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUMvQixJQUFJLENBQUMsV0FBVztxQkFDYixTQUFTLEVBQUU7cUJBQ1gsT0FBTyxDQUNOLCtEQUErRCxDQUNoRSxDQUFDO2FBQ0w7WUFDRCw2Q0FBNkM7WUFDN0MsT0FBTyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUM1QjtRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQzs7NkdBaldVLGVBQWUsa0JBSWhCLHVCQUF1QixvR0FNdkIsUUFBUTtpSEFWUCxlQUFlOzRGQUFmLGVBQWU7a0JBRDNCLFVBQVU7OzBCQUtOLE1BQU07MkJBQUMsdUJBQXVCOzswQkFNOUIsTUFBTTsyQkFBQyxRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IEluamVjdGFibGUsIEluamVjdCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBMb2NhdGlvbiwgRE9DVU1FTlQgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uXCI7XG5pbXBvcnQge1xuICBIdHRwUmVxdWVzdCxcbiAgSHR0cEhhbmRsZXIsXG4gIEh0dHBFdmVudCxcbiAgSHR0cEludGVyY2VwdG9yLFxufSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uL2h0dHBcIjsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBpbXBvcnQvbm8tdW5yZXNvbHZlZFxuaW1wb3J0IHtcbiAgQWNjb3VudEluZm8sXG4gIEF1dGhlbnRpY2F0aW9uUmVzdWx0LFxuICBCcm93c2VyQ29uZmlndXJhdGlvbkF1dGhFcnJvcixcbiAgSW50ZXJhY3Rpb25TdGF0dXMsXG4gIEludGVyYWN0aW9uVHlwZSxcbiAgU3RyaW5nVXRpbHMsXG59IGZyb20gXCJAYXp1cmUvbXNhbC1icm93c2VyXCI7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBFTVBUWSwgb2YgfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHsgc3dpdGNoTWFwLCBjYXRjaEVycm9yLCB0YWtlLCBmaWx0ZXIgfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcbmltcG9ydCB7IE1zYWxTZXJ2aWNlIH0gZnJvbSBcIi4vbXNhbC5zZXJ2aWNlXCI7XG5pbXBvcnQge1xuICBNc2FsSW50ZXJjZXB0b3JBdXRoUmVxdWVzdCxcbiAgTXNhbEludGVyY2VwdG9yQ29uZmlndXJhdGlvbixcbiAgUHJvdGVjdGVkUmVzb3VyY2VTY29wZXMsXG59IGZyb20gXCIuL21zYWwuaW50ZXJjZXB0b3IuY29uZmlnXCI7XG5pbXBvcnQgeyBNc2FsQnJvYWRjYXN0U2VydmljZSB9IGZyb20gXCIuL21zYWwuYnJvYWRjYXN0LnNlcnZpY2VcIjtcbmltcG9ydCB7IE1TQUxfSU5URVJDRVBUT1JfQ09ORklHIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBNc2FsSW50ZXJjZXB0b3IgaW1wbGVtZW50cyBIdHRwSW50ZXJjZXB0b3Ige1xuICBwcml2YXRlIF9kb2N1bWVudD86IERvY3VtZW50O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoTVNBTF9JTlRFUkNFUFRPUl9DT05GSUcpXG4gICAgcHJpdmF0ZSBtc2FsSW50ZXJjZXB0b3JDb25maWc6IE1zYWxJbnRlcmNlcHRvckNvbmZpZ3VyYXRpb24sXG4gICAgcHJpdmF0ZSBhdXRoU2VydmljZTogTXNhbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBsb2NhdGlvbjogTG9jYXRpb24sXG4gICAgcHJpdmF0ZSBtc2FsQnJvYWRjYXN0U2VydmljZTogTXNhbEJyb2FkY2FzdFNlcnZpY2UsXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnksIEB0eXBlc2NyaXB0LWVzbGludC9leHBsaWNpdC1tb2R1bGUtYm91bmRhcnktdHlwZXNcbiAgICBASW5qZWN0KERPQ1VNRU5UKSBkb2N1bWVudD86IGFueVxuICApIHtcbiAgICB0aGlzLl9kb2N1bWVudCA9IGRvY3VtZW50IGFzIERvY3VtZW50O1xuICB9XG5cbiAgaW50ZXJjZXB0KFxuICAgIHJlcTogSHR0cFJlcXVlc3Q8YW55PiwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgbmV4dDogSHR0cEhhbmRsZXJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICApOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxhbnk+PiB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5tc2FsSW50ZXJjZXB0b3JDb25maWcuaW50ZXJhY3Rpb25UeXBlICE9PSBJbnRlcmFjdGlvblR5cGUuUG9wdXAgJiZcbiAgICAgIHRoaXMubXNhbEludGVyY2VwdG9yQ29uZmlnLmludGVyYWN0aW9uVHlwZSAhPT0gSW50ZXJhY3Rpb25UeXBlLlJlZGlyZWN0XG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgQnJvd3NlckNvbmZpZ3VyYXRpb25BdXRoRXJyb3IoXG4gICAgICAgIFwiaW52YWxpZF9pbnRlcmFjdGlvbl90eXBlXCIsXG4gICAgICAgIFwiSW52YWxpZCBpbnRlcmFjdGlvbiB0eXBlIHByb3ZpZGVkIHRvIE1TQUwgSW50ZXJjZXB0b3IuIEludGVyYWN0aW9uVHlwZS5Qb3B1cCwgSW50ZXJhY3Rpb25UeXBlLlJlZGlyZWN0IG11c3QgYmUgcHJvdmlkZWQgaW4gdGhlIG1zYWxJbnRlcmNlcHRvckNvbmZpZ3VyYXRpb25cIlxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLmF1dGhTZXJ2aWNlLmdldExvZ2dlcigpLnZlcmJvc2UoXCJNU0FMIEludGVyY2VwdG9yIGFjdGl2YXRlZFwiKTtcbiAgICBjb25zdCBzY29wZXMgPSB0aGlzLmdldFNjb3Blc0ZvckVuZHBvaW50KHJlcS51cmwsIHJlcS5tZXRob2QpO1xuXG4gICAgLy8gSWYgbm8gc2NvcGVzIGZvciBlbmRwb2ludCwgZG9lcyBub3QgYWNxdWlyZSB0b2tlblxuICAgIGlmICghc2NvcGVzIHx8IHNjb3Blcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuYXV0aFNlcnZpY2VcbiAgICAgICAgLmdldExvZ2dlcigpXG4gICAgICAgIC52ZXJib3NlKFwiSW50ZXJjZXB0b3IgLSBubyBzY29wZXMgZm9yIGVuZHBvaW50XCIpO1xuICAgICAgcmV0dXJuIG5leHQuaGFuZGxlKHJlcSk7XG4gICAgfVxuXG4gICAgLy8gU2V0cyBhY2NvdW50IGFzIGFjdGl2ZSBhY2NvdW50IG9yIGZpcnN0IGFjY291bnRcbiAgICBsZXQgYWNjb3VudDogQWNjb3VudEluZm87XG4gICAgaWYgKCEhdGhpcy5hdXRoU2VydmljZS5pbnN0YW5jZS5nZXRBY3RpdmVBY2NvdW50KCkpIHtcbiAgICAgIHRoaXMuYXV0aFNlcnZpY2VcbiAgICAgICAgLmdldExvZ2dlcigpXG4gICAgICAgIC52ZXJib3NlKFwiSW50ZXJjZXB0b3IgLSBhY3RpdmUgYWNjb3VudCBzZWxlY3RlZFwiKTtcbiAgICAgIGFjY291bnQgPSB0aGlzLmF1dGhTZXJ2aWNlLmluc3RhbmNlLmdldEFjdGl2ZUFjY291bnQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hdXRoU2VydmljZVxuICAgICAgICAuZ2V0TG9nZ2VyKClcbiAgICAgICAgLnZlcmJvc2UoXCJJbnRlcmNlcHRvciAtIG5vIGFjdGl2ZSBhY2NvdW50LCBmYWxsYmFjayB0byBmaXJzdCBhY2NvdW50XCIpO1xuICAgICAgYWNjb3VudCA9IHRoaXMuYXV0aFNlcnZpY2UuaW5zdGFuY2UuZ2V0QWxsQWNjb3VudHMoKVswXTtcbiAgICB9XG5cbiAgICBjb25zdCBhdXRoUmVxdWVzdCA9XG4gICAgICB0eXBlb2YgdGhpcy5tc2FsSW50ZXJjZXB0b3JDb25maWcuYXV0aFJlcXVlc3QgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICA/IHRoaXMubXNhbEludGVyY2VwdG9yQ29uZmlnLmF1dGhSZXF1ZXN0KHRoaXMuYXV0aFNlcnZpY2UsIHJlcSwge1xuICAgICAgICAgICAgYWNjb3VudDogYWNjb3VudCxcbiAgICAgICAgICB9KVxuICAgICAgICA6IHsgLi4udGhpcy5tc2FsSW50ZXJjZXB0b3JDb25maWcuYXV0aFJlcXVlc3QsIGFjY291bnQgfTtcblxuICAgIHRoaXMuYXV0aFNlcnZpY2VcbiAgICAgIC5nZXRMb2dnZXIoKVxuICAgICAgLmluZm8oYEludGVyY2VwdG9yIC0gJHtzY29wZXMubGVuZ3RofSBzY29wZXMgZm91bmQgZm9yIGVuZHBvaW50YCk7XG4gICAgdGhpcy5hdXRoU2VydmljZVxuICAgICAgLmdldExvZ2dlcigpXG4gICAgICAuaW5mb1BpaShgSW50ZXJjZXB0b3IgLSBbJHtzY29wZXN9XSBzY29wZXMgZm91bmQgZm9yICR7cmVxLnVybH1gKTtcblxuICAgIHJldHVybiB0aGlzLmFjcXVpcmVUb2tlbihhdXRoUmVxdWVzdCwgc2NvcGVzLCBhY2NvdW50KS5waXBlKFxuICAgICAgc3dpdGNoTWFwKChyZXN1bHQ6IEF1dGhlbnRpY2F0aW9uUmVzdWx0KSA9PiB7XG4gICAgICAgIHRoaXMuYXV0aFNlcnZpY2VcbiAgICAgICAgICAuZ2V0TG9nZ2VyKClcbiAgICAgICAgICAudmVyYm9zZShcIkludGVyY2VwdG9yIC0gc2V0dGluZyBhdXRob3JpemF0aW9uIGhlYWRlcnNcIik7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSByZXEuaGVhZGVycy5zZXQoXG4gICAgICAgICAgXCJBdXRob3JpemF0aW9uXCIsXG4gICAgICAgICAgYEJlYXJlciAke3Jlc3VsdC5hY2Nlc3NUb2tlbn1gXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgcmVxdWVzdENsb25lID0gcmVxLmNsb25lKHsgaGVhZGVycyB9KTtcbiAgICAgICAgcmV0dXJuIG5leHQuaGFuZGxlKHJlcXVlc3RDbG9uZSk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogVHJ5IHRvIGFjcXVpcmUgdG9rZW4gc2lsZW50bHkuIEludm9rZSBpbnRlcmFjdGlvbiBpZiBhY3F1aXJlVG9rZW5TaWxlbnQgcmVqZWN0ZWQgd2l0aCBlcnJvciBvciByZXNvbHZlZCB3aXRoIG51bGwgYWNjZXNzIHRva2VuXG4gICAqIEBwYXJhbSBhdXRoUmVxdWVzdCBSZXF1ZXN0XG4gICAqIEBwYXJhbSBzY29wZXMgQXJyYXkgb2Ygc2NvcGVzIGZvciB0aGUgcmVxdWVzdFxuICAgKiBAcGFyYW0gYWNjb3VudCBBY2NvdW50XG4gICAqIEByZXR1cm5zIEF1dGhlbnRpY2F0aW9uIHJlc3VsdFxuICAgKi9cbiAgcHJpdmF0ZSBhY3F1aXJlVG9rZW4oXG4gICAgYXV0aFJlcXVlc3Q6IE1zYWxJbnRlcmNlcHRvckF1dGhSZXF1ZXN0LFxuICAgIHNjb3Blczogc3RyaW5nW10sXG4gICAgYWNjb3VudDogQWNjb3VudEluZm9cbiAgKTogT2JzZXJ2YWJsZTxBdXRoZW50aWNhdGlvblJlc3VsdD4ge1xuICAgIC8vIE5vdGU6IEZvciBNU0EgYWNjb3VudHMsIGluY2x1ZGUgb3BlbmlkIHNjb3BlIHdoZW4gY2FsbGluZyBhY3F1aXJlVG9rZW5TaWxlbnQgdG8gcmV0dXJuIGlkVG9rZW5cbiAgICByZXR1cm4gdGhpcy5hdXRoU2VydmljZVxuICAgICAgLmFjcXVpcmVUb2tlblNpbGVudCh7IC4uLmF1dGhSZXF1ZXN0LCBzY29wZXMsIGFjY291bnQgfSlcbiAgICAgIC5waXBlKFxuICAgICAgICBjYXRjaEVycm9yKCgpID0+IHtcbiAgICAgICAgICB0aGlzLmF1dGhTZXJ2aWNlXG4gICAgICAgICAgICAuZ2V0TG9nZ2VyKClcbiAgICAgICAgICAgIC5lcnJvcihcbiAgICAgICAgICAgICAgXCJJbnRlcmNlcHRvciAtIGFjcXVpcmVUb2tlblNpbGVudCByZWplY3RlZCB3aXRoIGVycm9yLiBJbnZva2luZyBpbnRlcmFjdGlvbiB0byByZXNvbHZlLlwiXG4gICAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiB0aGlzLm1zYWxCcm9hZGNhc3RTZXJ2aWNlLmluUHJvZ3Jlc3MkLnBpcGUoXG4gICAgICAgICAgICB0YWtlKDEpLFxuICAgICAgICAgICAgc3dpdGNoTWFwKChzdGF0dXM6IEludGVyYWN0aW9uU3RhdHVzKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChzdGF0dXMgPT09IEludGVyYWN0aW9uU3RhdHVzLk5vbmUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5hY3F1aXJlVG9rZW5JbnRlcmFjdGl2ZWx5KGF1dGhSZXF1ZXN0LCBzY29wZXMpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubXNhbEJyb2FkY2FzdFNlcnZpY2UuaW5Qcm9ncmVzcyQucGlwZShcbiAgICAgICAgICAgICAgICBmaWx0ZXIoXG4gICAgICAgICAgICAgICAgICAoc3RhdHVzOiBJbnRlcmFjdGlvblN0YXR1cykgPT5cbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzID09PSBJbnRlcmFjdGlvblN0YXR1cy5Ob25lXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICB0YWtlKDEpLFxuICAgICAgICAgICAgICAgIHN3aXRjaE1hcCgoKSA9PiB0aGlzLmFjcXVpcmVUb2tlbihhdXRoUmVxdWVzdCwgc2NvcGVzLCBhY2NvdW50KSlcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKTtcbiAgICAgICAgfSksXG4gICAgICAgIHN3aXRjaE1hcCgocmVzdWx0OiBBdXRoZW50aWNhdGlvblJlc3VsdCkgPT4ge1xuICAgICAgICAgIGlmICghcmVzdWx0LmFjY2Vzc1Rva2VuKSB7XG4gICAgICAgICAgICB0aGlzLmF1dGhTZXJ2aWNlXG4gICAgICAgICAgICAgIC5nZXRMb2dnZXIoKVxuICAgICAgICAgICAgICAuZXJyb3IoXG4gICAgICAgICAgICAgICAgXCJJbnRlcmNlcHRvciAtIGFjcXVpcmVUb2tlblNpbGVudCByZXNvbHZlZCB3aXRoIG51bGwgYWNjZXNzIHRva2VuLiBLbm93biBpc3N1ZSB3aXRoIEIyQyB0ZW5hbnRzLCBpbnZva2luZyBpbnRlcmFjdGlvbiB0byByZXNvbHZlLlwiXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5tc2FsQnJvYWRjYXN0U2VydmljZS5pblByb2dyZXNzJC5waXBlKFxuICAgICAgICAgICAgICBmaWx0ZXIoXG4gICAgICAgICAgICAgICAgKHN0YXR1czogSW50ZXJhY3Rpb25TdGF0dXMpID0+IHN0YXR1cyA9PT0gSW50ZXJhY3Rpb25TdGF0dXMuTm9uZVxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICB0YWtlKDEpLFxuICAgICAgICAgICAgICBzd2l0Y2hNYXAoKCkgPT5cbiAgICAgICAgICAgICAgICB0aGlzLmFjcXVpcmVUb2tlbkludGVyYWN0aXZlbHkoYXV0aFJlcXVlc3QsIHNjb3BlcylcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG9mKHJlc3VsdCk7XG4gICAgICAgIH0pXG4gICAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEludm9rZSBpbnRlcmFjdGlvbiBmb3IgdGhlIGdpdmVuIHNldCBvZiBzY29wZXNcbiAgICogQHBhcmFtIGF1dGhSZXF1ZXN0IFJlcXVlc3RcbiAgICogQHBhcmFtIHNjb3BlcyBBcnJheSBvZiBzY29wZXMgZm9yIHRoZSByZXF1ZXN0XG4gICAqIEByZXR1cm5zIFJlc3VsdCBmcm9tIHRoZSBpbnRlcmFjdGl2ZSByZXF1ZXN0XG4gICAqL1xuICBwcml2YXRlIGFjcXVpcmVUb2tlbkludGVyYWN0aXZlbHkoXG4gICAgYXV0aFJlcXVlc3Q6IE1zYWxJbnRlcmNlcHRvckF1dGhSZXF1ZXN0LFxuICAgIHNjb3Blczogc3RyaW5nW11cbiAgKTogT2JzZXJ2YWJsZTxBdXRoZW50aWNhdGlvblJlc3VsdD4ge1xuICAgIGlmICh0aGlzLm1zYWxJbnRlcmNlcHRvckNvbmZpZy5pbnRlcmFjdGlvblR5cGUgPT09IEludGVyYWN0aW9uVHlwZS5Qb3B1cCkge1xuICAgICAgdGhpcy5hdXRoU2VydmljZVxuICAgICAgICAuZ2V0TG9nZ2VyKClcbiAgICAgICAgLnZlcmJvc2UoXG4gICAgICAgICAgXCJJbnRlcmNlcHRvciAtIGVycm9yIGFjcXVpcmluZyB0b2tlbiBzaWxlbnRseSwgYWNxdWlyaW5nIGJ5IHBvcHVwXCJcbiAgICAgICAgKTtcbiAgICAgIHJldHVybiB0aGlzLmF1dGhTZXJ2aWNlLmFjcXVpcmVUb2tlblBvcHVwKHsgLi4uYXV0aFJlcXVlc3QsIHNjb3BlcyB9KTtcbiAgICB9XG4gICAgdGhpcy5hdXRoU2VydmljZVxuICAgICAgLmdldExvZ2dlcigpXG4gICAgICAudmVyYm9zZShcbiAgICAgICAgXCJJbnRlcmNlcHRvciAtIGVycm9yIGFjcXVpcmluZyB0b2tlbiBzaWxlbnRseSwgYWNxdWlyaW5nIGJ5IHJlZGlyZWN0XCJcbiAgICAgICk7XG4gICAgY29uc3QgcmVkaXJlY3RTdGFydFBhZ2UgPSB3aW5kb3cubG9jYXRpb24uaHJlZjtcbiAgICB0aGlzLmF1dGhTZXJ2aWNlLmFjcXVpcmVUb2tlblJlZGlyZWN0KHtcbiAgICAgIC4uLmF1dGhSZXF1ZXN0LFxuICAgICAgc2NvcGVzLFxuICAgICAgcmVkaXJlY3RTdGFydFBhZ2UsXG4gICAgfSk7XG4gICAgcmV0dXJuIEVNUFRZO1xuICB9XG5cbiAgLyoqXG4gICAqIExvb2tzIHVwIHRoZSBzY29wZXMgZm9yIHRoZSBnaXZlbiBlbmRwb2ludCBmcm9tIHRoZSBwcm90ZWN0ZWRSZXNvdXJjZU1hcFxuICAgKiBAcGFyYW0gZW5kcG9pbnQgVXJsIG9mIHRoZSByZXF1ZXN0XG4gICAqIEBwYXJhbSBodHRwTWV0aG9kIEh0dHAgbWV0aG9kIG9mIHRoZSByZXF1ZXN0XG4gICAqIEByZXR1cm5zIEFycmF5IG9mIHNjb3Blcywgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICpcbiAgICovXG4gIHByaXZhdGUgZ2V0U2NvcGVzRm9yRW5kcG9pbnQoXG4gICAgZW5kcG9pbnQ6IHN0cmluZyxcbiAgICBodHRwTWV0aG9kOiBzdHJpbmdcbiAgKTogQXJyYXk8c3RyaW5nPiB8IG51bGwge1xuICAgIHRoaXMuYXV0aFNlcnZpY2VcbiAgICAgIC5nZXRMb2dnZXIoKVxuICAgICAgLnZlcmJvc2UoXCJJbnRlcmNlcHRvciAtIGdldHRpbmcgc2NvcGVzIGZvciBlbmRwb2ludFwiKTtcblxuICAgIC8vIEVuc3VyZXMgZW5kcG9pbnRzIGFuZCBwcm90ZWN0ZWQgcmVzb3VyY2VzIGNvbXBhcmVkIGFyZSBub3JtYWxpemVkXG4gICAgY29uc3Qgbm9ybWFsaXplZEVuZHBvaW50ID0gdGhpcy5sb2NhdGlvbi5ub3JtYWxpemUoZW5kcG9pbnQpO1xuXG4gICAgY29uc3QgcHJvdGVjdGVkUmVzb3VyY2VzQXJyYXkgPSBBcnJheS5mcm9tKFxuICAgICAgdGhpcy5tc2FsSW50ZXJjZXB0b3JDb25maWcucHJvdGVjdGVkUmVzb3VyY2VNYXAua2V5cygpXG4gICAgKTtcblxuICAgIGNvbnN0IG1hdGNoaW5nUHJvdGVjdGVkUmVzb3VyY2VzID0gdGhpcy5tYXRjaFJlc291cmNlc1RvRW5kcG9pbnQoXG4gICAgICBwcm90ZWN0ZWRSZXNvdXJjZXNBcnJheSxcbiAgICAgIG5vcm1hbGl6ZWRFbmRwb2ludFxuICAgICk7XG5cbiAgICBpZiAobWF0Y2hpbmdQcm90ZWN0ZWRSZXNvdXJjZXMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIHRoaXMubWF0Y2hTY29wZXNUb0VuZHBvaW50KFxuICAgICAgICB0aGlzLm1zYWxJbnRlcmNlcHRvckNvbmZpZy5wcm90ZWN0ZWRSZXNvdXJjZU1hcCxcbiAgICAgICAgbWF0Y2hpbmdQcm90ZWN0ZWRSZXNvdXJjZXMsXG4gICAgICAgIGh0dHBNZXRob2RcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgcmVzb3VyY2UgZW5kcG9pbnRzIHRoYXQgbWF0Y2ggcmVxdWVzdCBlbmRwb2ludFxuICAgKiBAcGFyYW0gcHJvdGVjdGVkUmVzb3VyY2VzRW5kcG9pbnRzXG4gICAqIEBwYXJhbSBlbmRwb2ludFxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgcHJpdmF0ZSBtYXRjaFJlc291cmNlc1RvRW5kcG9pbnQoXG4gICAgcHJvdGVjdGVkUmVzb3VyY2VzRW5kcG9pbnRzOiBzdHJpbmdbXSxcbiAgICBlbmRwb2ludDogc3RyaW5nXG4gICk6IEFycmF5PHN0cmluZz4ge1xuICAgIGNvbnN0IG1hdGNoaW5nUmVzb3VyY2VzOiBBcnJheTxzdHJpbmc+ID0gW107XG5cbiAgICBwcm90ZWN0ZWRSZXNvdXJjZXNFbmRwb2ludHMuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICBjb25zdCBub3JtYWxpemVkS2V5ID0gdGhpcy5sb2NhdGlvbi5ub3JtYWxpemUoa2V5KTtcblxuICAgICAgLy8gR2V0IHVybCBjb21wb25lbnRzXG4gICAgICBjb25zdCBhYnNvbHV0ZUtleSA9IHRoaXMuZ2V0QWJzb2x1dGVVcmwobm9ybWFsaXplZEtleSk7XG4gICAgICBjb25zdCBrZXlDb21wb25lbnRzID0gbmV3IFVSTChhYnNvbHV0ZUtleSk7XG4gICAgICBjb25zdCBhYnNvbHV0ZUVuZHBvaW50ID0gdGhpcy5nZXRBYnNvbHV0ZVVybChlbmRwb2ludCk7XG4gICAgICBjb25zdCBlbmRwb2ludENvbXBvbmVudHMgPSBuZXcgVVJMKGFic29sdXRlRW5kcG9pbnQpO1xuXG4gICAgICBpZiAodGhpcy5jaGVja1VybENvbXBvbmVudHMoa2V5Q29tcG9uZW50cywgZW5kcG9pbnRDb21wb25lbnRzKSkge1xuICAgICAgICBtYXRjaGluZ1Jlc291cmNlcy5wdXNoKGtleSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbWF0Y2hpbmdSZXNvdXJjZXM7XG4gIH1cblxuICAvKipcbiAgICogQ29tcGFyZXMgVVJMIHNlZ21lbnRzIGJldHdlZW4ga2V5IGFuZCBlbmRwb2ludFxuICAgKiBAcGFyYW0ga2V5XG4gICAqIEBwYXJhbSBlbmRwb2ludFxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgcHJpdmF0ZSBjaGVja1VybENvbXBvbmVudHMoXG4gICAga2V5Q29tcG9uZW50czogVVJMLFxuICAgIGVuZHBvaW50Q29tcG9uZW50czogVVJMXG4gICk6IGJvb2xlYW4ge1xuICAgIC8vIFVSTCBwcm9wZXJ0aWVzIGZyb20gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1VSTFxuICAgIGNvbnN0IHVybFByb3BlcnRpZXMgPSBbXCJwcm90b2NvbFwiLCBcImhvc3RcIiwgXCJwYXRobmFtZVwiLCBcInNlYXJjaFwiLCBcImhhc2hcIl07XG5cbiAgICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIHVybFByb3BlcnRpZXMpIHtcbiAgICAgIGlmIChrZXlDb21wb25lbnRzW3Byb3BlcnR5XSkge1xuICAgICAgICBjb25zdCBkZWNvZGVkSW5wdXQgPSBkZWNvZGVVUklDb21wb25lbnQoa2V5Q29tcG9uZW50c1twcm9wZXJ0eV0pO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgIVN0cmluZ1V0aWxzLm1hdGNoUGF0dGVybihkZWNvZGVkSW5wdXQsIGVuZHBvaW50Q29tcG9uZW50c1twcm9wZXJ0eV0pXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyYW5zZm9ybXMgcmVsYXRpdmUgdXJscyB0byBhYnNvbHV0ZSB1cmxzXG4gICAqIEBwYXJhbSB1cmxcbiAgICogQHJldHVybnNcbiAgICovXG4gIHByaXZhdGUgZ2V0QWJzb2x1dGVVcmwodXJsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGxpbmsgPSB0aGlzLl9kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYVwiKTtcbiAgICBsaW5rLmhyZWYgPSB1cmw7XG4gICAgcmV0dXJuIGxpbmsuaHJlZjtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBzY29wZXMgZnJvbSBmaXJzdCBtYXRjaGluZyBlbmRwb2ludCB3aXRoIEhUVFAgbWV0aG9kIHRoYXQgbWF0Y2hlcyByZXF1ZXN0XG4gICAqIEBwYXJhbSBwcm90ZWN0ZWRSZXNvdXJjZU1hcCBQcm90ZWN0ZWQgcmVzb3VyY2UgbWFwXG4gICAqIEBwYXJhbSBlbmRwb2ludEFycmF5IEFycmF5IG9mIHJlc291cmNlcyB0aGF0IG1hdGNoIHJlcXVlc3QgZW5kcG9pbnRcbiAgICogQHBhcmFtIGh0dHBNZXRob2QgSHR0cCBtZXRob2Qgb2YgdGhlIHJlcXVlc3RcbiAgICogQHJldHVybnNcbiAgICovXG4gIHByaXZhdGUgbWF0Y2hTY29wZXNUb0VuZHBvaW50KFxuICAgIHByb3RlY3RlZFJlc291cmNlTWFwOiBNYXA8XG4gICAgICBzdHJpbmcsXG4gICAgICBBcnJheTxzdHJpbmcgfCBQcm90ZWN0ZWRSZXNvdXJjZVNjb3Blcz4gfCBudWxsXG4gICAgPixcbiAgICBlbmRwb2ludEFycmF5OiBzdHJpbmdbXSxcbiAgICBodHRwTWV0aG9kOiBzdHJpbmdcbiAgKTogQXJyYXk8c3RyaW5nPiB8IG51bGwge1xuICAgIGNvbnN0IGFsbE1hdGNoZWRTY29wZXMgPSBbXTtcblxuICAgIC8vIENoZWNrIGVhY2ggbWF0Y2hlZCBlbmRwb2ludCBmb3IgbWF0Y2hpbmcgSHR0cE1ldGhvZCBhbmQgc2NvcGVzXG4gICAgZW5kcG9pbnRBcnJheS5mb3JFYWNoKChtYXRjaGVkRW5kcG9pbnQpID0+IHtcbiAgICAgIGNvbnN0IHNjb3Blc0ZvckVuZHBvaW50ID0gW107XG4gICAgICBjb25zdCBtZXRob2RBbmRTY29wZXNBcnJheSA9IHByb3RlY3RlZFJlc291cmNlTWFwLmdldChtYXRjaGVkRW5kcG9pbnQpO1xuXG4gICAgICAvLyBSZXR1cm4gaWYgcmVzb3VyY2UgaXMgdW5wcm90ZWN0ZWRcbiAgICAgIGlmIChtZXRob2RBbmRTY29wZXNBcnJheSA9PT0gbnVsbCkge1xuICAgICAgICBhbGxNYXRjaGVkU2NvcGVzLnB1c2gobnVsbCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbWV0aG9kQW5kU2NvcGVzQXJyYXkuZm9yRWFjaCgoZW50cnkpID0+IHtcbiAgICAgICAgLy8gRW50cnkgaXMgZWl0aGVyIGFycmF5IG9mIHNjb3BlcyBvciBQcm90ZWN0ZWRSZXNvdXJjZVNjb3BlcyBvYmplY3RcbiAgICAgICAgaWYgKHR5cGVvZiBlbnRyeSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgIHNjb3Blc0ZvckVuZHBvaW50LnB1c2goZW50cnkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEVuc3VyZSBtZXRob2RzIGJlaW5nIGNvbXBhcmVkIGFyZSBub3JtYWxpemVkXG4gICAgICAgICAgY29uc3Qgbm9ybWFsaXplZFJlcXVlc3RNZXRob2QgPSBodHRwTWV0aG9kLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgY29uc3Qgbm9ybWFsaXplZFJlc291cmNlTWV0aG9kID0gZW50cnkuaHR0cE1ldGhvZC50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgIC8vIE1ldGhvZCBpbiBwcm90ZWN0ZWRSZXNvdXJjZU1hcCBtYXRjaGVzIHJlcXVlc3QgaHR0cCBtZXRob2RcbiAgICAgICAgICBpZiAobm9ybWFsaXplZFJlc291cmNlTWV0aG9kID09PSBub3JtYWxpemVkUmVxdWVzdE1ldGhvZCkge1xuICAgICAgICAgICAgLy8gVmFsaWRhdGUgaWYgc2NvcGVzIGNvbWVzIG51bGwgdG8gdW5wcm90ZWN0IHRoZSByZXNvdXJjZSBpbiBhIGNlcnRhaW4gaHR0cCBtZXRob2RcbiAgICAgICAgICAgIGlmIChlbnRyeS5zY29wZXMgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgYWxsTWF0Y2hlZFNjb3Blcy5wdXNoKG51bGwpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZW50cnkuc2NvcGVzLmZvckVhY2goKHNjb3BlKSA9PiB7XG4gICAgICAgICAgICAgICAgc2NvcGVzRm9yRW5kcG9pbnQucHVzaChzY29wZSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIE9ubHkgYWRkIHRvIGFsbCBzY29wZXMgaWYgc2NvcGVzIGZvciBlbmRwb2ludCBhbmQgbWV0aG9kIGlzIGZvdW5kXG4gICAgICBpZiAoc2NvcGVzRm9yRW5kcG9pbnQubGVuZ3RoID4gMCkge1xuICAgICAgICBhbGxNYXRjaGVkU2NvcGVzLnB1c2goc2NvcGVzRm9yRW5kcG9pbnQpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKGFsbE1hdGNoZWRTY29wZXMubGVuZ3RoID4gMCkge1xuICAgICAgaWYgKGFsbE1hdGNoZWRTY29wZXMubGVuZ3RoID4gMSkge1xuICAgICAgICB0aGlzLmF1dGhTZXJ2aWNlXG4gICAgICAgICAgLmdldExvZ2dlcigpXG4gICAgICAgICAgLndhcm5pbmcoXG4gICAgICAgICAgICBcIkludGVyY2VwdG9yIC0gTW9yZSB0aGFuIDEgbWF0Y2hpbmcgc2NvcGVzIGZvciBlbmRwb2ludCBmb3VuZC5cIlxuICAgICAgICAgICk7XG4gICAgICB9XG4gICAgICAvLyBSZXR1cm5zIHNjb3BlcyBmb3IgZmlyc3QgbWF0Y2hpbmcgZW5kcG9pbnRcbiAgICAgIHJldHVybiBhbGxNYXRjaGVkU2NvcGVzWzBdO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG59XG4iXX0=