@azure/msal-angular 0.0.0-alpha1

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 (55) hide show
  1. package/IMsalService.d.ts +16 -0
  2. package/IMsalService.d.ts.map +1 -0
  3. package/LICENSE +21 -0
  4. package/README.md +151 -0
  5. package/azure-msal-angular.d.ts +5 -0
  6. package/azure-msal-angular.d.ts.map +1 -0
  7. package/azure-msal-angular.metadata.json +1 -0
  8. package/bundles/azure-msal-angular.umd.js +991 -0
  9. package/bundles/azure-msal-angular.umd.js.map +1 -0
  10. package/bundles/azure-msal-angular.umd.min.js +2 -0
  11. package/bundles/azure-msal-angular.umd.min.js.map +1 -0
  12. package/constants.d.ts +6 -0
  13. package/constants.d.ts.map +1 -0
  14. package/esm2015/IMsalService.js +6 -0
  15. package/esm2015/azure-msal-angular.js +5 -0
  16. package/esm2015/constants.js +10 -0
  17. package/esm2015/msal.broadcast.config.js +6 -0
  18. package/esm2015/msal.broadcast.service.js +46 -0
  19. package/esm2015/msal.guard.config.js +6 -0
  20. package/esm2015/msal.guard.js +189 -0
  21. package/esm2015/msal.interceptor.config.js +6 -0
  22. package/esm2015/msal.interceptor.js +208 -0
  23. package/esm2015/msal.module.js +46 -0
  24. package/esm2015/msal.navigation.client.js +53 -0
  25. package/esm2015/msal.redirect.component.js +33 -0
  26. package/esm2015/msal.service.js +77 -0
  27. package/esm2015/packageMetadata.js +4 -0
  28. package/esm2015/public-api.js +18 -0
  29. package/fesm2015/azure-msal-angular.js +636 -0
  30. package/fesm2015/azure-msal-angular.js.map +1 -0
  31. package/msal.broadcast.config.d.ts +4 -0
  32. package/msal.broadcast.config.d.ts.map +1 -0
  33. package/msal.broadcast.service.d.ts +15 -0
  34. package/msal.broadcast.service.d.ts.map +1 -0
  35. package/msal.guard.config.d.ts +10 -0
  36. package/msal.guard.config.d.ts.map +1 -0
  37. package/msal.guard.d.ts +41 -0
  38. package/msal.guard.d.ts.map +1 -0
  39. package/msal.interceptor.config.d.ts +18 -0
  40. package/msal.interceptor.config.d.ts.map +1 -0
  41. package/msal.interceptor.d.ts +50 -0
  42. package/msal.interceptor.d.ts.map +1 -0
  43. package/msal.module.d.ts +8 -0
  44. package/msal.module.d.ts.map +1 -0
  45. package/msal.navigation.client.d.ts +17 -0
  46. package/msal.navigation.client.d.ts.map +1 -0
  47. package/msal.redirect.component.d.ts +13 -0
  48. package/msal.redirect.component.d.ts.map +1 -0
  49. package/msal.service.d.ts +29 -0
  50. package/msal.service.d.ts.map +1 -0
  51. package/package.json +35 -0
  52. package/packageMetadata.d.ts +3 -0
  53. package/packageMetadata.d.ts.map +1 -0
  54. package/public-api.d.ts +18 -0
  55. package/public-api.d.ts.map +1 -0
@@ -0,0 +1,189 @@
1
+ /*
2
+ * Copyright (c) Microsoft Corporation. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+ import { Router } from "@angular/router";
6
+ import { MsalService } from "./msal.service";
7
+ import { Injectable, Inject, VERSION } from "@angular/core";
8
+ import { Location } from "@angular/common";
9
+ import { InteractionType, BrowserConfigurationAuthError, BrowserUtils, UrlString } from "@azure/msal-browser";
10
+ import { MSAL_GUARD_CONFIG } from "./constants";
11
+ import { concatMap, catchError, map } from "rxjs/operators";
12
+ import { of } from "rxjs";
13
+ import { MsalBroadcastService } from "./msal.broadcast.service";
14
+ export class MsalGuard {
15
+ constructor(msalGuardConfig, msalBroadcastService, authService, location, router) {
16
+ this.msalGuardConfig = msalGuardConfig;
17
+ this.msalBroadcastService = msalBroadcastService;
18
+ this.authService = authService;
19
+ this.location = location;
20
+ this.router = router;
21
+ // Subscribing so events in MsalGuard will set inProgress$ observable
22
+ this.msalBroadcastService.inProgress$.subscribe();
23
+ }
24
+ /**
25
+ * Parses url string to UrlTree
26
+ * @param url
27
+ */
28
+ parseUrl(url) {
29
+ return this.router.parseUrl(url);
30
+ }
31
+ /**
32
+ * Builds the absolute url for the destination page
33
+ * @param path Relative path of requested page
34
+ * @returns Full destination url
35
+ */
36
+ getDestinationUrl(path) {
37
+ this.authService.getLogger().verbose("Guard - getting destination url");
38
+ // Absolute base url for the application (default to origin if base element not present)
39
+ const baseElements = document.getElementsByTagName("base");
40
+ const baseUrl = this.location.normalize(baseElements.length ? baseElements[0].href : window.location.origin);
41
+ // Path of page (including hash, if using hash routing)
42
+ const pathUrl = this.location.prepareExternalUrl(path);
43
+ // Hash location strategy
44
+ if (pathUrl.startsWith("#")) {
45
+ this.authService.getLogger().verbose("Guard - destination by hash routing");
46
+ return `${baseUrl}/${pathUrl}`;
47
+ }
48
+ /*
49
+ * If using path location strategy, pathUrl will include the relative portion of the base path (e.g. /base/page).
50
+ * Since baseUrl also includes /base, can just concatentate baseUrl + path
51
+ */
52
+ return `${baseUrl}${path}`;
53
+ }
54
+ /**
55
+ * Interactively prompt the user to login
56
+ * @param url Path of the requested page
57
+ */
58
+ loginInteractively(state) {
59
+ const authRequest = typeof this.msalGuardConfig.authRequest === "function"
60
+ ? this.msalGuardConfig.authRequest(this.authService, state)
61
+ : Object.assign({}, this.msalGuardConfig.authRequest);
62
+ if (this.msalGuardConfig.interactionType === InteractionType.Popup) {
63
+ this.authService.getLogger().verbose("Guard - logging in by popup");
64
+ return this.authService.loginPopup(authRequest)
65
+ .pipe(map((response) => {
66
+ this.authService.getLogger().verbose("Guard - login by popup successful, can activate, setting active account");
67
+ this.authService.instance.setActiveAccount(response.account);
68
+ return true;
69
+ }));
70
+ }
71
+ this.authService.getLogger().verbose("Guard - logging in by redirect");
72
+ const redirectStartPage = this.getDestinationUrl(state.url);
73
+ return this.authService.loginRedirect(Object.assign({ redirectStartPage }, authRequest))
74
+ .pipe(map(() => false));
75
+ }
76
+ /**
77
+ * Helper which checks for the correct interaction type, prevents page with Guard to be set as reidrect, and calls handleRedirectObservable
78
+ * @param state
79
+ */
80
+ activateHelper(state) {
81
+ if (this.msalGuardConfig.interactionType !== InteractionType.Popup && this.msalGuardConfig.interactionType !== InteractionType.Redirect) {
82
+ throw new BrowserConfigurationAuthError("invalid_interaction_type", "Invalid interaction type provided to MSAL Guard. InteractionType.Popup or InteractionType.Redirect must be provided in the MsalGuardConfiguration");
83
+ }
84
+ this.authService.getLogger().verbose("MSAL Guard activated");
85
+ /*
86
+ * If a page with MSAL Guard is set as the redirect for acquireTokenSilent,
87
+ * short-circuit to prevent redirecting or popups.
88
+ */
89
+ if (typeof window !== "undefined") {
90
+ if (UrlString.hashContainsKnownProperties(window.location.hash) && BrowserUtils.isInIframe() && !this.authService.instance.getConfiguration().system.allowRedirectInIframe) {
91
+ this.authService.getLogger().warning("Guard - redirectUri set to page with MSAL Guard. It is recommended to not set redirectUri to a page that requires authentication.");
92
+ return of(false);
93
+ }
94
+ }
95
+ else {
96
+ this.authService.getLogger().info("Guard - window is undefined, MSAL does not support server-side token acquisition");
97
+ return of(true);
98
+ }
99
+ /**
100
+ * If a loginFailedRoute is set in the config, set this as the loginFailedRoute
101
+ */
102
+ if (this.msalGuardConfig.loginFailedRoute) {
103
+ this.loginFailedRoute = this.parseUrl(this.msalGuardConfig.loginFailedRoute);
104
+ }
105
+ // Capture current path before it gets changed by handleRedirectObservable
106
+ const currentPath = this.location.path(true);
107
+ return this.authService.handleRedirectObservable()
108
+ .pipe(concatMap(() => {
109
+ if (!this.authService.instance.getAllAccounts().length) {
110
+ if (state) {
111
+ this.authService.getLogger().verbose("Guard - no accounts retrieved, log in required to activate");
112
+ return this.loginInteractively(state);
113
+ }
114
+ this.authService.getLogger().verbose("Guard - no accounts retrieved, no state, cannot load");
115
+ return of(false);
116
+ }
117
+ this.authService.getLogger().verbose("Guard - at least 1 account exists, can activate or load");
118
+ // Prevent navigating the app to /#code= or /code=
119
+ if (state) {
120
+ /*
121
+ * Path routing:
122
+ * state.url: /#code=...
123
+ * state.root.fragment: code=...
124
+ */
125
+ /*
126
+ * Hash routing:
127
+ * state.url: /code
128
+ * state.root.fragment: null
129
+ */
130
+ const urlContainsCode = this.includesCode(state.url);
131
+ const fragmentContainsCode = !!state.root && !!state.root.fragment && this.includesCode(`#${state.root.fragment}`);
132
+ const hashRouting = this.location.prepareExternalUrl(state.url).indexOf("#") === 0;
133
+ // Ensure code parameter is in fragment (and not in query parameter), or that hash hash routing is used
134
+ if (urlContainsCode && (fragmentContainsCode || hashRouting)) {
135
+ this.authService.getLogger().info("Guard - Hash contains known code response, stopping navigation.");
136
+ // Path routing (navigate to current path without hash)
137
+ if (currentPath.indexOf("#") > -1) {
138
+ return of(this.parseUrl(this.location.path()));
139
+ }
140
+ // Hash routing (navigate to root path)
141
+ return of(this.parseUrl(""));
142
+ }
143
+ }
144
+ return of(true);
145
+ }), catchError((error) => {
146
+ this.authService.getLogger().error("Guard - error while logging in, unable to activate");
147
+ this.authService.getLogger().errorPii(`Guard - error: ${error.message}`);
148
+ /**
149
+ * If a loginFailedRoute is set, checks to see if Angular 10+ is used and state is passed in before returning route
150
+ * Apps using Angular 9 will receive of(false) in canLoad interface, as it does not support UrlTree return types
151
+ */
152
+ if (this.loginFailedRoute && parseInt(VERSION.major, 10) > 9 && state) {
153
+ this.authService.getLogger().verbose("Guard - loginFailedRoute set, redirecting");
154
+ return of(this.loginFailedRoute);
155
+ }
156
+ return of(false);
157
+ }));
158
+ }
159
+ includesCode(path) {
160
+ return (path.lastIndexOf("/code") > -1 &&
161
+ path.lastIndexOf("/code") === path.length - "/code".length) || // path.endsWith("/code")
162
+ path.indexOf("#code=") > -1 ||
163
+ path.indexOf("&code=") > -1;
164
+ }
165
+ canActivate(route, state) {
166
+ this.authService.getLogger().verbose("Guard - canActivate");
167
+ return this.activateHelper(state);
168
+ }
169
+ canActivateChild(route, state) {
170
+ this.authService.getLogger().verbose("Guard - canActivateChild");
171
+ return this.activateHelper(state);
172
+ }
173
+ canLoad() {
174
+ this.authService.getLogger().verbose("Guard - canLoad");
175
+ // @ts-ignore
176
+ return this.activateHelper();
177
+ }
178
+ }
179
+ MsalGuard.decorators = [
180
+ { type: Injectable }
181
+ ];
182
+ MsalGuard.ctorParameters = () => [
183
+ { type: undefined, decorators: [{ type: Inject, args: [MSAL_GUARD_CONFIG,] }] },
184
+ { type: MsalBroadcastService },
185
+ { type: MsalService },
186
+ { type: Location },
187
+ { type: Router }
188
+ ];
189
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXNhbC5ndWFyZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tc2FsLmd1YXJkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQUVILE9BQU8sRUFBZ0csTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdkksT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUFFLGVBQWUsRUFBRSw2QkFBNkIsRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUF1RCxNQUFNLHFCQUFxQixDQUFDO0FBRW5LLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNoRCxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM1RCxPQUFPLEVBQWMsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBR2hFLE1BQU0sT0FBTyxTQUFTO0lBR2xCLFlBQ3VDLGVBQXVDLEVBQ2xFLG9CQUEwQyxFQUMxQyxXQUF3QixFQUN4QixRQUFrQixFQUNsQixNQUFjO1FBSmEsb0JBQWUsR0FBZixlQUFlLENBQXdCO1FBQ2xFLHlCQUFvQixHQUFwQixvQkFBb0IsQ0FBc0I7UUFDMUMsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDeEIsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUNsQixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBRXRCLHFFQUFxRTtRQUNyRSxJQUFJLENBQUMsb0JBQW9CLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ3RELENBQUM7SUFFRDs7O09BR0c7SUFD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Q0FBQyxDQUFDO1lBQ2xDLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLEtBQUssSUFBSSxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUkseUJBQXlCO1lBQ3hGLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzNCLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVELFdBQVcsQ0FBQyxLQUE2QixFQUFFLEtBQTBCO1FBQ2pFLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLENBQUMsT0FBTyxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDNUQsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxLQUE2QixFQUFFLEtBQTBCO1FBQ3RFLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLENBQUMsT0FBTyxDQUFDLDBCQUEwQixDQUFDLENBQUM7UUFDakUsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRCxPQUFPO1FBQ0gsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUN4RCxhQUFhO1FBQ2IsT0FBTyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDakMsQ0FBQzs7O1lBeE1KLFVBQVU7Ozs0Q0FLRixNQUFNLFNBQUMsaUJBQWlCO1lBUHhCLG9CQUFvQjtZQVJwQixXQUFXO1lBRVgsUUFBUTtZQUhzRixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IENhbkFjdGl2YXRlLCBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LCBSb3V0ZXJTdGF0ZVNuYXBzaG90LCBDYW5BY3RpdmF0ZUNoaWxkLCBDYW5Mb2FkLCBVcmxUcmVlLCBSb3V0ZXIgfSBmcm9tIFwiQGFuZ3VsYXIvcm91dGVyXCI7XG5pbXBvcnQgeyBNc2FsU2VydmljZSB9IGZyb20gXCIuL21zYWwuc2VydmljZVwiO1xuaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0LCBWRVJTSU9OIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IExvY2F0aW9uIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb25UeXBlLCBCcm93c2VyQ29uZmlndXJhdGlvbkF1dGhFcnJvciwgQnJvd3NlclV0aWxzLCBVcmxTdHJpbmcsIFBvcHVwUmVxdWVzdCwgUmVkaXJlY3RSZXF1ZXN0LCBBdXRoZW50aWNhdGlvblJlc3VsdCB9IGZyb20gXCJAYXp1cmUvbXNhbC1icm93c2VyXCI7XG5pbXBvcnQgeyBNc2FsR3VhcmRDb25maWd1cmF0aW9uIH0gZnJvbSBcIi4vbXNhbC5ndWFyZC5jb25maWdcIjtcbmltcG9ydCB7IE1TQUxfR1VBUkRfQ09ORklHIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBjb25jYXRNYXAsIGNhdGNoRXJyb3IsIG1hcCB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgb2YgfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHsgTXNhbEJyb2FkY2FzdFNlcnZpY2UgfSBmcm9tIFwiLi9tc2FsLmJyb2FkY2FzdC5zZXJ2aWNlXCI7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBNc2FsR3VhcmQgaW1wbGVtZW50cyBDYW5BY3RpdmF0ZSwgQ2FuQWN0aXZhdGVDaGlsZCwgQ2FuTG9hZCB7XG4gICAgcHJpdmF0ZSBsb2dpbkZhaWxlZFJvdXRlPzogVXJsVHJlZTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBASW5qZWN0KE1TQUxfR1VBUkRfQ09ORklHKSBwcml2YXRlIG1zYWxHdWFyZENvbmZpZzogTXNhbEd1YXJkQ29uZmlndXJhdGlvbixcbiAgICAgICAgcHJpdmF0ZSBtc2FsQnJvYWRjYXN0U2VydmljZTogTXNhbEJyb2FkY2FzdFNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgYXV0aFNlcnZpY2U6IE1zYWxTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGxvY2F0aW9uOiBMb2NhdGlvbixcbiAgICAgICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlclxuICAgICkgeyBcbiAgICAgICAgLy8gU3Vic2NyaWJpbmcgc28gZXZlbnRzIGluIE1zYWxHdWFyZCB3aWxsIHNldCBpblByb2dyZXNzJCBvYnNlcnZhYmxlXG4gICAgICAgIHRoaXMubXNhbEJyb2FkY2FzdFNlcnZpY2UuaW5Qcm9ncmVzcyQuc3Vic2NyaWJlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGFyc2VzIHVybCBzdHJpbmcgdG8gVXJsVHJlZVxuICAgICAqIEBwYXJhbSB1cmwgXG4gICAgICovXG4gICAgcGFyc2VVcmwodXJsOiBzdHJpbmcpOiBVcmxUcmVlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucm91dGVyLnBhcnNlVXJsKHVybCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQnVpbGRzIHRoZSBhYnNvbHV0ZSB1cmwgZm9yIHRoZSBkZXN0aW5hdGlvbiBwYWdlXG4gICAgICogQHBhcmFtIHBhdGggUmVsYXRpdmUgcGF0aCBvZiByZXF1ZXN0ZWQgcGFnZVxuICAgICAqIEByZXR1cm5zIEZ1bGwgZGVzdGluYXRpb24gdXJsXG4gICAgICovXG4gICAgZ2V0RGVzdGluYXRpb25VcmwocGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgdGhpcy5hdXRoU2VydmljZS5nZXRMb2dnZXIoKS52ZXJib3NlKFwiR3VhcmQgLSBnZXR0aW5nIGRlc3RpbmF0aW9uIHVybFwiKTtcbiAgICAgICAgLy8gQWJzb2x1dGUgYmFzZSB1cmwgZm9yIHRoZSBhcHBsaWNhdGlvbiAoZGVmYXVsdCB0byBvcmlnaW4gaWYgYmFzZSBlbGVtZW50IG5vdCBwcmVzZW50KVxuICAgICAgICBjb25zdCBiYXNlRWxlbWVudHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShcImJhc2VcIik7XG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSB0aGlzLmxvY2F0aW9uLm5vcm1hbGl6ZShiYXNlRWxlbWVudHMubGVuZ3RoID8gYmFzZUVsZW1lbnRzWzBdLmhyZWYgOiB3aW5kb3cubG9jYXRpb24ub3JpZ2luKTtcblxuICAgICAgICAvLyBQYXRoIG9mIHBhZ2UgKGluY2x1ZGluZyBoYXNoLCBpZiB1c2luZyBoYXNoIHJvdXRpbmcpXG4gICAgICAgIGNvbnN0IHBhdGhVcmwgPSB0aGlzLmxvY2F0aW9uLnByZXBhcmVFeHRlcm5hbFVybChwYXRoKTtcblxuICAgICAgICAvLyBIYXNoIGxvY2F0aW9uIHN0cmF0ZWd5XG4gICAgICAgIGlmIChwYXRoVXJsLnN0YXJ0c1dpdGgoXCIjXCIpKSB7XG4gICAgICAgICAgICB0aGlzLmF1dGhTZXJ2aWNlLmdldExvZ2dlcigpLnZlcmJvc2UoXCJHdWFyZCAtIGRlc3RpbmF0aW9uIGJ5IGhhc2ggcm91dGluZ1wiKTtcbiAgICAgICAgICAgIHJldHVybiBgJHtiYXNlVXJsfS8ke3BhdGhVcmx9YDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qXG4gICAgICAgICAqIElmIHVzaW5nIHBhdGggbG9jYXRpb24gc3RyYXRlZ3ksIHBhdGhVcmwgd2lsbCBpbmNsdWRlIHRoZSByZWxhdGl2ZSBwb3J0aW9uIG9mIHRoZSBiYXNlIHBhdGggKGUuZy4gL2Jhc2UvcGFnZSkuXG4gICAgICAgICAqIFNpbmNlIGJhc2VVcmwgYWxzbyBpbmNsdWRlcyAvYmFzZSwgY2FuIGp1c3QgY29uY2F0ZW50YXRlIGJhc2VVcmwgKyBwYXRoXG4gICAgICAgICAqL1xuICAgICAgICByZXR1cm4gYCR7YmFzZVVybH0ke3BhdGh9YDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbnRlcmFjdGl2ZWx5IHByb21wdCB0aGUgdXNlciB0byBsb2dpblxuICAgICAqIEBwYXJhbSB1cmwgUGF0aCBvZiB0aGUgcmVxdWVzdGVkIHBhZ2VcbiAgICAgKi9cbiAgICBwcml2YXRlIGxvZ2luSW50ZXJhY3RpdmVseShzdGF0ZTogUm91dGVyU3RhdGVTbmFwc2hvdCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgICAgICBjb25zdCBhdXRoUmVxdWVzdCA9IHR5cGVvZiB0aGlzLm1zYWxHdWFyZENvbmZpZy5hdXRoUmVxdWVzdCA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgICA/IHRoaXMubXNhbEd1YXJkQ29uZmlnLmF1dGhSZXF1ZXN0KHRoaXMuYXV0aFNlcnZpY2UsIHN0YXRlKVxuICAgICAgICAgICAgOiB7IC4uLnRoaXMubXNhbEd1YXJkQ29uZmlnLmF1dGhSZXF1ZXN0IH07XG4gICAgICAgIGlmICh0aGlzLm1zYWxHdWFyZENvbmZpZy5pbnRlcmFjdGlvblR5cGUgPT09IEludGVyYWN0aW9uVHlwZS5Qb3B1cCkge1xuICAgICAgICAgICAgdGhpcy5hdXRoU2VydmljZS5nZXRMb2dnZXIoKS52ZXJib3NlKFwiR3VhcmQgLSBsb2dnaW5nIGluIGJ5IHBvcHVwXCIpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXV0aFNlcnZpY2UubG9naW5Qb3B1cChhdXRoUmVxdWVzdCBhcyBQb3B1cFJlcXVlc3QpXG4gICAgICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgIG1hcCgocmVzcG9uc2U6IEF1dGhlbnRpY2F0aW9uUmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmF1dGhTZXJ2aWNlLmdldExvZ2dlcigpLnZlcmJvc2UoXCJHdWFyZCAtIGxvZ2luIGJ5IHBvcHVwIHN1Y2Nlc3NmdWwsIGNhbiBhY3RpdmF0ZSwgc2V0dGluZyBhY3RpdmUgYWNjb3VudFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXV0aFNlcnZpY2UuaW5zdGFuY2Uuc2V0QWN0aXZlQWNjb3VudChyZXNwb25zZS5hY2NvdW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmF1dGhTZXJ2aWNlLmdldExvZ2dlcigpLnZlcmJvc2UoXCJHdWFyZCAtIGxvZ2dpbmcgaW4gYnkgcmVkaXJlY3RcIik7XG4gICAgICAgIGNvbnN0IHJlZGlyZWN0U3RhcnRQYWdlID0gdGhpcy5nZXREZXN0aW5hdGlvblVybChzdGF0ZS51cmwpO1xuICAgICAgICByZXR1cm4gdGhpcy5hdXRoU2VydmljZS5sb2dpblJlZGlyZWN0KHtcbiAgICAgICAgICAgIHJlZGlyZWN0U3RhcnRQYWdlLFxuICAgICAgICAgICAgLi4uYXV0aFJlcXVlc3RcbiAgICAgICAgfSBhcyBSZWRpcmVjdFJlcXVlc3QpXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBtYXAoKCkgPT4gZmFsc2UpXG4gICAgICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhlbHBlciB3aGljaCBjaGVja3MgZm9yIHRoZSBjb3JyZWN0IGludGVyYWN0aW9uIHR5cGUsIHByZXZlbnRzIHBhZ2Ugd2l0aCBHdWFyZCB0byBiZSBzZXQgYXMgcmVpZHJlY3QsIGFuZCBjYWxscyBoYW5kbGVSZWRpcmVjdE9ic2VydmFibGVcbiAgICAgKiBAcGFyYW0gc3RhdGUgXG4gICAgICovXG4gICAgcHJpdmF0ZSBhY3RpdmF0ZUhlbHBlcihzdGF0ZT86IFJvdXRlclN0YXRlU25hcHNob3QpOiBPYnNlcnZhYmxlPGJvb2xlYW58VXJsVHJlZT4ge1xuICAgICAgICBpZiAodGhpcy5tc2FsR3VhcmRDb25maWcuaW50ZXJhY3Rpb25UeXBlICE9PSBJbnRlcmFjdGlvblR5cGUuUG9wdXAgJiYgdGhpcy5tc2FsR3VhcmRDb25maWcuaW50ZXJhY3Rpb25UeXBlICE9PSBJbnRlcmFjdGlvblR5cGUuUmVkaXJlY3QpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBCcm93c2VyQ29uZmlndXJhdGlvbkF1dGhFcnJvcihcImludmFsaWRfaW50ZXJhY3Rpb25fdHlwZVwiLCBcIkludmFsaWQgaW50ZXJhY3Rpb24gdHlwZSBwcm92aWRlZCB0byBNU0FMIEd1YXJkLiBJbnRlcmFjdGlvblR5cGUuUG9wdXAgb3IgSW50ZXJhY3Rpb25UeXBlLlJlZGlyZWN0IG11c3QgYmUgcHJvdmlkZWQgaW4gdGhlIE1zYWxHdWFyZENvbmZpZ3VyYXRpb25cIik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hdXRoU2VydmljZS5nZXRMb2dnZXIoKS52ZXJib3NlKFwiTVNBTCBHdWFyZCBhY3RpdmF0ZWRcIik7XG5cbiAgICAgICAgLypcbiAgICAgICAgICogSWYgYSBwYWdlIHdpdGggTVNBTCBHdWFyZCBpcyBzZXQgYXMgdGhlIHJlZGlyZWN0IGZvciBhY3F1aXJlVG9rZW5TaWxlbnQsXG4gICAgICAgICAqIHNob3J0LWNpcmN1aXQgdG8gcHJldmVudCByZWRpcmVjdGluZyBvciBwb3B1cHMuXG4gICAgICAgICAqL1xuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgaWYgKFVybFN0cmluZy5oYXNoQ29udGFpbnNLbm93blByb3BlcnRpZXMod2luZG93LmxvY2F0aW9uLmhhc2gpICYmIEJyb3dzZXJVdGlscy5pc0luSWZyYW1lKCkgJiYgIXRoaXMuYXV0aFNlcnZpY2UuaW5zdGFuY2UuZ2V0Q29uZmlndXJhdGlvbigpLnN5c3RlbS5hbGxvd1JlZGlyZWN0SW5JZnJhbWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmF1dGhTZXJ2aWNlLmdldExvZ2dlcigpLndhcm5pbmcoXCJHdWFyZCAtIHJlZGlyZWN0VXJpIHNldCB0byBwYWdlIHdpdGggTVNBTCBHdWFyZC4gSXQgaXMgcmVjb21tZW5kZWQgdG8gbm90IHNldCByZWRpcmVjdFVyaSB0byBhIHBhZ2UgdGhhdCByZXF1aXJlcyBhdXRoZW50aWNhdGlvbi5cIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9mKGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYXV0aFNlcnZpY2UuZ2V0TG9nZ2VyKCkuaW5mbyhcIkd1YXJkIC0gd2luZG93IGlzIHVuZGVmaW5lZCwgTVNBTCBkb2VzIG5vdCBzdXBwb3J0IHNlcnZlci1zaWRlIHRva2VuIGFjcXVpc2l0aW9uXCIpO1xuICAgICAgICAgICAgcmV0dXJuIG9mKHRydWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIElmIGEgbG9naW5GYWlsZWRSb3V0ZSBpcyBzZXQgaW4gdGhlIGNvbmZpZywgc2V0IHRoaXMgYXMgdGhlIGxvZ2luRmFpbGVkUm91dGVcbiAgICAgICAgICovXG4gICAgICAgIGlmICh0aGlzLm1zYWxHdWFyZENvbmZpZy5sb2dpbkZhaWxlZFJvdXRlKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2luRmFpbGVkUm91dGUgPSB0aGlzLnBhcnNlVXJsKHRoaXMubXNhbEd1YXJkQ29uZmlnLmxvZ2luRmFpbGVkUm91dGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2FwdHVyZSBjdXJyZW50IHBhdGggYmVmb3JlIGl0IGdldHMgY2hhbmdlZCBieSBoYW5kbGVSZWRpcmVjdE9ic2VydmFibGVcbiAgICAgICAgY29uc3QgY3VycmVudFBhdGggPSB0aGlzLmxvY2F0aW9uLnBhdGgodHJ1ZSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuYXV0aFNlcnZpY2UuaGFuZGxlUmVkaXJlY3RPYnNlcnZhYmxlKClcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIGNvbmNhdE1hcCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5hdXRoU2VydmljZS5pbnN0YW5jZS5nZXRBbGxBY2NvdW50cygpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hdXRoU2VydmljZS5nZXRMb2dnZXIoKS52ZXJib3NlKFwiR3VhcmQgLSBubyBhY2NvdW50cyByZXRyaWV2ZWQsIGxvZyBpbiByZXF1aXJlZCB0byBhY3RpdmF0ZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5sb2dpbkludGVyYWN0aXZlbHkoc3RhdGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXV0aFNlcnZpY2UuZ2V0TG9nZ2VyKCkudmVyYm9zZShcIkd1YXJkIC0gbm8gYWNjb3VudHMgcmV0cmlldmVkLCBubyBzdGF0ZSwgY2Fubm90IGxvYWRcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2YoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hdXRoU2VydmljZS5nZXRMb2dnZXIoKS52ZXJib3NlKFwiR3VhcmQgLSBhdCBsZWFzdCAxIGFjY291bnQgZXhpc3RzLCBjYW4gYWN0aXZhdGUgb3IgbG9hZFwiKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBQcmV2ZW50IG5hdmlnYXRpbmcgdGhlIGFwcCB0byAvI2NvZGU9IG9yIC9jb2RlPVxuICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8qXG4gICAgICAgICAgICAgICAgICAgICAgICAgKiBQYXRoIHJvdXRpbmc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgKiBzdGF0ZS51cmw6IC8jY29kZT0uLi5cbiAgICAgICAgICAgICAgICAgICAgICAgICAqIHN0YXRlLnJvb3QuZnJhZ21lbnQ6IGNvZGU9Li4uXG4gICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuICAgICAgICAgICAgICAgICAgICAgICAgLypcbiAgICAgICAgICAgICAgICAgICAgICAgICAqIEhhc2ggcm91dGluZzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAqIHN0YXRlLnVybDogL2NvZGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAqIHN0YXRlLnJvb3QuZnJhZ21lbnQ6IG51bGxcbiAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdXJsQ29udGFpbnNDb2RlOiBib29sZWFuID0gdGhpcy5pbmNsdWRlc0NvZGUoc3RhdGUudXJsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZyYWdtZW50Q29udGFpbnNDb2RlOiBib29sZWFuID0gISFzdGF0ZS5yb290ICYmICEhc3RhdGUucm9vdC5mcmFnbWVudCAmJiB0aGlzLmluY2x1ZGVzQ29kZShgIyR7c3RhdGUucm9vdC5mcmFnbWVudH1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhc2hSb3V0aW5nOiBib29sZWFuID0gdGhpcy5sb2NhdGlvbi5wcmVwYXJlRXh0ZXJuYWxVcmwoc3RhdGUudXJsKS5pbmRleE9mKFwiI1wiKSA9PT0gMDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRW5zdXJlIGNvZGUgcGFyYW1ldGVyIGlzIGluIGZyYWdtZW50IChhbmQgbm90IGluIHF1ZXJ5IHBhcmFtZXRlciksIG9yIHRoYXQgaGFzaCBoYXNoIHJvdXRpbmcgaXMgdXNlZFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVybENvbnRhaW5zQ29kZSAmJiAoZnJhZ21lbnRDb250YWluc0NvZGUgfHwgaGFzaFJvdXRpbmcpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hdXRoU2VydmljZS5nZXRMb2dnZXIoKS5pbmZvKFwiR3VhcmQgLSBIYXNoIGNvbnRhaW5zIGtub3duIGNvZGUgcmVzcG9uc2UsIHN0b3BwaW5nIG5hdmlnYXRpb24uXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBhdGggcm91dGluZyAobmF2aWdhdGUgdG8gY3VycmVudCBwYXRoIHdpdGhvdXQgaGFzaClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudFBhdGguaW5kZXhPZihcIiNcIikgPiAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2YodGhpcy5wYXJzZVVybCh0aGlzLmxvY2F0aW9uLnBhdGgoKSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBIYXNoIHJvdXRpbmcgKG5hdmlnYXRlIHRvIHJvb3QgcGF0aClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2YodGhpcy5wYXJzZVVybChcIlwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2YodHJ1ZSk7XG5cbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICBjYXRjaEVycm9yKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hdXRoU2VydmljZS5nZXRMb2dnZXIoKS5lcnJvcihcIkd1YXJkIC0gZXJyb3Igd2hpbGUgbG9nZ2luZyBpbiwgdW5hYmxlIHRvIGFjdGl2YXRlXCIpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmF1dGhTZXJ2aWNlLmdldExvZ2dlcigpLmVycm9yUGlpKGBHdWFyZCAtIGVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAgICAgKiBJZiBhIGxvZ2luRmFpbGVkUm91dGUgaXMgc2V0LCBjaGVja3MgdG8gc2VlIGlmIEFuZ3VsYXIgMTArIGlzIHVzZWQgYW5kIHN0YXRlIGlzIHBhc3NlZCBpbiBiZWZvcmUgcmV0dXJuaW5nIHJvdXRlXG4gICAgICAgICAgICAgICAgICAgICAqIEFwcHMgdXNpbmcgQW5ndWxhciA5IHdpbGwgcmVjZWl2ZSBvZihmYWxzZSkgaW4gY2FuTG9hZCBpbnRlcmZhY2UsIGFzIGl0IGRvZXMgbm90IHN1cHBvcnQgVXJsVHJlZSByZXR1cm4gdHlwZXNcbiAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmxvZ2luRmFpbGVkUm91dGUgJiYgcGFyc2VJbnQoVkVSU0lPTi5tYWpvciwgMTApID4gOSAmJiBzdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hdXRoU2VydmljZS5nZXRMb2dnZXIoKS52ZXJib3NlKFwiR3VhcmQgLSBsb2dpbkZhaWxlZFJvdXRlIHNldCwgcmVkaXJlY3RpbmdcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2YodGhpcy5sb2dpbkZhaWxlZFJvdXRlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2YoZmFsc2UpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuICAgIH1cblxuICAgIGluY2x1ZGVzQ29kZShwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIChwYXRoLmxhc3RJbmRleE9mKFwiL2NvZGVcIikgPiAtMSAmJlxuICAgICAgICAgICAgcGF0aC5sYXN0SW5kZXhPZihcIi9jb2RlXCIpID09PSBwYXRoLmxlbmd0aCAtIFwiL2NvZGVcIi5sZW5ndGgpIHx8IC8vIHBhdGguZW5kc1dpdGgoXCIvY29kZVwiKVxuICAgICAgICAgICAgcGF0aC5pbmRleE9mKFwiI2NvZGU9XCIpID4gLTEgfHwgXG4gICAgICAgICAgICBwYXRoLmluZGV4T2YoXCImY29kZT1cIikgPiAtMTtcbiAgICB9XG5cbiAgICBjYW5BY3RpdmF0ZShyb3V0ZTogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCwgc3RhdGU6IFJvdXRlclN0YXRlU25hcHNob3QpOiBPYnNlcnZhYmxlPGJvb2xlYW58VXJsVHJlZT4ge1xuICAgICAgICB0aGlzLmF1dGhTZXJ2aWNlLmdldExvZ2dlcigpLnZlcmJvc2UoXCJHdWFyZCAtIGNhbkFjdGl2YXRlXCIpO1xuICAgICAgICByZXR1cm4gdGhpcy5hY3RpdmF0ZUhlbHBlcihzdGF0ZSk7XG4gICAgfVxuXG4gICAgY2FuQWN0aXZhdGVDaGlsZChyb3V0ZTogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCwgc3RhdGU6IFJvdXRlclN0YXRlU25hcHNob3QpOiBPYnNlcnZhYmxlPGJvb2xlYW58VXJsVHJlZT4ge1xuICAgICAgICB0aGlzLmF1dGhTZXJ2aWNlLmdldExvZ2dlcigpLnZlcmJvc2UoXCJHdWFyZCAtIGNhbkFjdGl2YXRlQ2hpbGRcIik7XG4gICAgICAgIHJldHVybiB0aGlzLmFjdGl2YXRlSGVscGVyKHN0YXRlKTtcbiAgICB9XG5cbiAgICBjYW5Mb2FkKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgICAgICB0aGlzLmF1dGhTZXJ2aWNlLmdldExvZ2dlcigpLnZlcmJvc2UoXCJHdWFyZCAtIGNhbkxvYWRcIik7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgcmV0dXJuIHRoaXMuYWN0aXZhdGVIZWxwZXIoKTtcbiAgICB9XG59XG4iXX0=
@@ -0,0 +1,6 @@
1
+ /*
2
+ * Copyright (c) Microsoft Corporation. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXNhbC5pbnRlcmNlcHRvci5jb25maWcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbXNhbC5pbnRlcmNlcHRvci5jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IEh0dHBSZXF1ZXN0IH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vbi9odHRwXCI7XG5pbXBvcnQgeyBQb3B1cFJlcXVlc3QsIFJlZGlyZWN0UmVxdWVzdCwgSW50ZXJhY3Rpb25UeXBlLCBTaWxlbnRSZXF1ZXN0IH0gZnJvbSBcIkBhenVyZS9tc2FsLWJyb3dzZXJcIjtcbmltcG9ydCB7IE1zYWxTZXJ2aWNlIH0gZnJvbSBcIi4vbXNhbC5zZXJ2aWNlXCI7XG5cbmV4cG9ydCBkZWNsYXJlIHR5cGUgTXNhbEludGVyY2VwdG9yQXV0aFJlcXVlc3QgPSBPbWl0PFBvcHVwUmVxdWVzdCwgXCJzY29wZXNcIj4gfCBPbWl0PFJlZGlyZWN0UmVxdWVzdCwgXCJzY29wZXNcIj4gfCBPbWl0PFNpbGVudFJlcXVlc3QsIFwic2NvcGVzXCI+IDtcblxuZXhwb3J0IHR5cGUgTXNhbEludGVyY2VwdG9yQ29uZmlndXJhdGlvbiA9IHtcbiAgICBpbnRlcmFjdGlvblR5cGU6IEludGVyYWN0aW9uVHlwZS5Qb3B1cCB8IEludGVyYWN0aW9uVHlwZS5SZWRpcmVjdDtcbiAgICBwcm90ZWN0ZWRSZXNvdXJjZU1hcDogTWFwPHN0cmluZywgQXJyYXk8c3RyaW5nfFByb3RlY3RlZFJlc291cmNlU2NvcGVzPiB8IG51bGw+O1xuICAgIGF1dGhSZXF1ZXN0PzogTXNhbEludGVyY2VwdG9yQXV0aFJlcXVlc3QgfCAoKG1zYWxTZXJ2aWNlOiBNc2FsU2VydmljZSwgcmVxOiBIdHRwUmVxdWVzdDx1bmtub3duPiwgb3JpZ2luYWxBdXRoUmVxdWVzdDogTXNhbEludGVyY2VwdG9yQXV0aFJlcXVlc3QpID0+IE1zYWxJbnRlcmNlcHRvckF1dGhSZXF1ZXN0KTtcbn07XG5cbmV4cG9ydCB0eXBlIFByb3RlY3RlZFJlc291cmNlU2NvcGVzID0ge1xuICAgIGh0dHBNZXRob2Q6IHN0cmluZyxcbiAgICBzY29wZXM6IEFycmF5PHN0cmluZz5cbn07XG5cbmV4cG9ydCB0eXBlIE1hdGNoaW5nUmVzb3VyY2VzID0ge1xuICAgIGFic29sdXRlUmVzb3VyY2VzOiBBcnJheTxzdHJpbmc+LFxuICAgIHJlbGF0aXZlUmVzb3VyY2VzOiBBcnJheTxzdHJpbmc+XG59O1xuIl19
@@ -0,0 +1,208 @@
1
+ /*
2
+ * Copyright (c) Microsoft Corporation. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+ import { Location, DOCUMENT } from "@angular/common";
6
+ import { EMPTY, of } from "rxjs";
7
+ import { switchMap, catchError } from "rxjs/operators";
8
+ import { MsalService } from "./msal.service";
9
+ import { BrowserConfigurationAuthError, InteractionType, StringUtils, UrlString } from "@azure/msal-browser";
10
+ import { Injectable, Inject } from "@angular/core";
11
+ import { MSAL_INTERCEPTOR_CONFIG } from "./constants";
12
+ export class MsalInterceptor {
13
+ constructor(msalInterceptorConfig, authService, location,
14
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types
15
+ document) {
16
+ this.msalInterceptorConfig = msalInterceptorConfig;
17
+ this.authService = authService;
18
+ this.location = location;
19
+ this._document = document;
20
+ }
21
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
22
+ intercept(req, next) {
23
+ if (this.msalInterceptorConfig.interactionType !== InteractionType.Popup && this.msalInterceptorConfig.interactionType !== InteractionType.Redirect) {
24
+ throw new BrowserConfigurationAuthError("invalid_interaction_type", "Invalid interaction type provided to MSAL Interceptor. InteractionType.Popup, InteractionType.Redirect must be provided in the msalInterceptorConfiguration");
25
+ }
26
+ this.authService.getLogger().verbose("MSAL Interceptor activated");
27
+ const scopes = this.getScopesForEndpoint(req.url, req.method);
28
+ // If no scopes for endpoint, does not acquire token
29
+ if (!scopes || scopes.length === 0) {
30
+ this.authService.getLogger().verbose("Interceptor - no scopes for endpoint");
31
+ return next.handle(req);
32
+ }
33
+ // Sets account as active account or first account
34
+ let account;
35
+ if (!!this.authService.instance.getActiveAccount()) {
36
+ this.authService.getLogger().verbose("Interceptor - active account selected");
37
+ account = this.authService.instance.getActiveAccount();
38
+ }
39
+ else {
40
+ this.authService.getLogger().verbose("Interceptor - no active account, fallback to first account");
41
+ account = this.authService.instance.getAllAccounts()[0];
42
+ }
43
+ const authRequest = typeof this.msalInterceptorConfig.authRequest === "function"
44
+ ? this.msalInterceptorConfig.authRequest(this.authService, req, { account: account })
45
+ : Object.assign(Object.assign({}, this.msalInterceptorConfig.authRequest), { account });
46
+ this.authService.getLogger().info(`Interceptor - ${scopes.length} scopes found for endpoint`);
47
+ this.authService.getLogger().infoPii(`Interceptor - [${scopes}] scopes found for ${req.url}`);
48
+ // Note: For MSA accounts, include openid scope when calling acquireTokenSilent to return idToken
49
+ return this.authService.acquireTokenSilent(Object.assign(Object.assign({}, authRequest), { scopes, account }))
50
+ .pipe(catchError(() => {
51
+ this.authService.getLogger().error("Interceptor - acquireTokenSilent rejected with error. Invoking interaction to resolve.");
52
+ return this.acquireTokenInteractively(authRequest, scopes);
53
+ }), switchMap((result) => {
54
+ if (!result.accessToken) {
55
+ this.authService.getLogger().error("Interceptor - acquireTokenSilent resolved with null access token. Known issue with B2C tenants, invoking interaction to resolve.");
56
+ return this.acquireTokenInteractively(authRequest, scopes);
57
+ }
58
+ return of(result);
59
+ }), switchMap((result) => {
60
+ this.authService.getLogger().verbose("Interceptor - setting authorization headers");
61
+ const headers = req.headers
62
+ .set("Authorization", `Bearer ${result.accessToken}`);
63
+ const requestClone = req.clone({ headers });
64
+ return next.handle(requestClone);
65
+ }));
66
+ }
67
+ /**
68
+ * Invoke interaction for the given set of scopes
69
+ * @param authRequest Request
70
+ * @param scopes Array of scopes for the request
71
+ * @returns Result from the interactive request
72
+ */
73
+ acquireTokenInteractively(authRequest, scopes) {
74
+ if (this.msalInterceptorConfig.interactionType === InteractionType.Popup) {
75
+ this.authService.getLogger().verbose("Interceptor - error acquiring token silently, acquiring by popup");
76
+ return this.authService.acquireTokenPopup(Object.assign(Object.assign({}, authRequest), { scopes }));
77
+ }
78
+ this.authService.getLogger().verbose("Interceptor - error acquiring token silently, acquiring by redirect");
79
+ const redirectStartPage = window.location.href;
80
+ this.authService.acquireTokenRedirect(Object.assign(Object.assign({}, authRequest), { scopes, redirectStartPage }));
81
+ return EMPTY;
82
+ }
83
+ /**
84
+ * Looks up the scopes for the given endpoint from the protectedResourceMap
85
+ * @param endpoint Url of the request
86
+ * @param httpMethod Http method of the request
87
+ * @returns Array of scopes, or null if not found
88
+ *
89
+ */
90
+ getScopesForEndpoint(endpoint, httpMethod) {
91
+ this.authService.getLogger().verbose("Interceptor - getting scopes for endpoint");
92
+ // Ensures endpoints and protected resources compared are normalized
93
+ const normalizedEndpoint = this.location.normalize(endpoint);
94
+ const protectedResourcesArray = Array.from(this.msalInterceptorConfig.protectedResourceMap.keys());
95
+ const matchingProtectedResources = this.matchResourcesToEndpoint(protectedResourcesArray, normalizedEndpoint);
96
+ // Check absolute urls of resources first before checking relative to prevent incorrect matching where multiple resources have similar relative urls
97
+ if (matchingProtectedResources.absoluteResources.length > 0) {
98
+ return this.matchScopesToEndpoint(this.msalInterceptorConfig.protectedResourceMap, matchingProtectedResources.absoluteResources, httpMethod);
99
+ }
100
+ else if (matchingProtectedResources.relativeResources.length > 0) {
101
+ return this.matchScopesToEndpoint(this.msalInterceptorConfig.protectedResourceMap, matchingProtectedResources.relativeResources, httpMethod);
102
+ }
103
+ return null;
104
+ }
105
+ /**
106
+ * Finds resource endpoints that match request endpoint
107
+ * @param protectedResourcesEndpoints
108
+ * @param endpoint
109
+ * @returns
110
+ */
111
+ matchResourcesToEndpoint(protectedResourcesEndpoints, endpoint) {
112
+ const matchingResources = { absoluteResources: [], relativeResources: [] };
113
+ protectedResourcesEndpoints.forEach(key => {
114
+ // Normalizes and adds resource to matchingResources.absoluteResources if key matches endpoint. StringUtils.matchPattern accounts for wildcards
115
+ const normalizedKey = this.location.normalize(key);
116
+ if (StringUtils.matchPattern(normalizedKey, endpoint)) {
117
+ matchingResources.absoluteResources.push(key);
118
+ }
119
+ // Get url components for relative urls
120
+ const absoluteKey = this.getAbsoluteUrl(key);
121
+ const keyComponents = new UrlString(absoluteKey).getUrlComponents();
122
+ const absoluteEndpoint = this.getAbsoluteUrl(endpoint);
123
+ const endpointComponents = new UrlString(absoluteEndpoint).getUrlComponents();
124
+ // Normalized key should include query strings if applicable
125
+ const relativeNormalizedKey = keyComponents.QueryString ? `${keyComponents.AbsolutePath}?${keyComponents.QueryString}` : this.location.normalize(keyComponents.AbsolutePath);
126
+ // Add resource to matchingResources.relativeResources if same origin, relativeKey matches endpoint, and is not empty
127
+ if (keyComponents.HostNameAndPort === endpointComponents.HostNameAndPort && StringUtils.matchPattern(relativeNormalizedKey, absoluteEndpoint) && relativeNormalizedKey !== "" && relativeNormalizedKey !== "/*") {
128
+ matchingResources.relativeResources.push(key);
129
+ }
130
+ });
131
+ return matchingResources;
132
+ }
133
+ /**
134
+ * Transforms relative urls to absolute urls
135
+ * @param url
136
+ * @returns
137
+ */
138
+ getAbsoluteUrl(url) {
139
+ const link = this._document.createElement("a");
140
+ link.href = url;
141
+ return link.href;
142
+ }
143
+ /**
144
+ * Finds scopes from first matching endpoint with HTTP method that matches request
145
+ * @param protectedResourceMap Protected resource map
146
+ * @param endpointArray Array of resources that match request endpoint
147
+ * @param httpMethod Http method of the request
148
+ * @returns
149
+ */
150
+ matchScopesToEndpoint(protectedResourceMap, endpointArray, httpMethod) {
151
+ const allMatchedScopes = [];
152
+ // Check each matched endpoint for matching HttpMethod and scopes
153
+ endpointArray.forEach(matchedEndpoint => {
154
+ const scopesForEndpoint = [];
155
+ const methodAndScopesArray = protectedResourceMap.get(matchedEndpoint);
156
+ // Return if resource is unprotected
157
+ if (methodAndScopesArray === null) {
158
+ allMatchedScopes.push(null);
159
+ return;
160
+ }
161
+ methodAndScopesArray.forEach(entry => {
162
+ // Entry is either array of scopes or ProtectedResourceScopes object
163
+ if (typeof entry === "string") {
164
+ scopesForEndpoint.push(entry);
165
+ }
166
+ else {
167
+ // Ensure methods being compared are normalized
168
+ const normalizedRequestMethod = httpMethod.toLowerCase();
169
+ const normalizedResourceMethod = entry.httpMethod.toLowerCase();
170
+ // Method in protectedResourceMap matches request http method
171
+ if (normalizedResourceMethod === normalizedRequestMethod) {
172
+ // Validate if scopes comes null to unprotect the resource in a certain http method
173
+ if (entry.scopes === null) {
174
+ allMatchedScopes.push(null);
175
+ }
176
+ else {
177
+ entry.scopes.forEach((scope) => {
178
+ scopesForEndpoint.push(scope);
179
+ });
180
+ }
181
+ }
182
+ }
183
+ });
184
+ // Only add to all scopes if scopes for endpoint and method is found
185
+ if (scopesForEndpoint.length > 0) {
186
+ allMatchedScopes.push(scopesForEndpoint);
187
+ }
188
+ });
189
+ if (allMatchedScopes.length > 0) {
190
+ if (allMatchedScopes.length > 1) {
191
+ this.authService.getLogger().warning("Interceptor - More than 1 matching scopes for endpoint found.");
192
+ }
193
+ // Returns scopes for first matching endpoint
194
+ return allMatchedScopes[0];
195
+ }
196
+ return null;
197
+ }
198
+ }
199
+ MsalInterceptor.decorators = [
200
+ { type: Injectable }
201
+ ];
202
+ MsalInterceptor.ctorParameters = () => [
203
+ { type: undefined, decorators: [{ type: Inject, args: [MSAL_INTERCEPTOR_CONFIG,] }] },
204
+ { type: MsalService },
205
+ { type: Location },
206
+ { type: undefined, decorators: [{ type: Inject, args: [DOCUMENT,] }] }
207
+ ];
208
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXNhbC5pbnRlcmNlcHRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tc2FsLmludGVyY2VwdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQVFILE9BQU8sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDckQsT0FBTyxFQUFjLEtBQUssRUFBRSxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDN0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFxQyw2QkFBNkIsRUFBRSxlQUFlLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2hKLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUl0RCxNQUFNLE9BQU8sZUFBZTtJQUd4QixZQUM2QyxxQkFBbUQsRUFDcEYsV0FBd0IsRUFDeEIsUUFBa0I7SUFDMUIsaUhBQWlIO0lBQy9GLFFBQWM7UUFKUywwQkFBcUIsR0FBckIscUJBQXFCLENBQThCO1FBQ3BGLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3hCLGFBQVEsR0FBUixRQUFRLENBQVU7UUFJMUIsSUFBSSxDQUFDLFNBQVMsR0FBRyxRQUFvQixDQUFDO0lBQzFDLENBQUM7SUFFRCw4REFBOEQ7SUFDOUQsU0FBUyxDQUFDLEdBQXFCLEVBQUUsSUFBaUI7UUFDOUMsSUFBSSxJQUFJLENBQUMscUJBQXFCLENBQUMsZUFBZSxLQUFLLGVBQWUsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLHFCQUFxQixDQUFDLGVBQWUsS0FBSyxlQUFlLENBQUMsUUFBUSxFQUFFO1lBQ2pKLE1BQU0sSUFB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SyxFQUFFLEVBQUU7Z0NBQzNCLGlCQUFpQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQzs0QkFDbEMsQ0FBQyxDQUFDLENBQUM7eUJBQ047cUJBQ0o7aUJBQ0o7WUFDTCxDQUFDLENBQUMsQ0FBQztZQUVILG9FQUFvRTtZQUNwRSxJQUFJLGlCQUFpQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQzlCLGdCQUFnQixDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO2FBQzVDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLGdCQUFnQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDN0IsSUFBSSxnQkFBZ0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUM3QixJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxDQUFDLE9BQU8sQ0FBQywrREFBK0QsQ0FBQyxDQUFDO2FBQ3pHO1lBQ0QsNkNBQTZDO1lBQzdDLE9BQU8sZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDOUI7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDOzs7WUExTkosVUFBVTs7OzRDQUtGLE1BQU0sU0FBQyx1QkFBdUI7WUFYOUIsV0FBVztZQUhYLFFBQVE7NENBa0JSLE1BQU0sU0FBQyxRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7XG4gICAgSHR0cFJlcXVlc3QsXG4gICAgSHR0cEhhbmRsZXIsXG4gICAgSHR0cEV2ZW50LFxuICAgIEh0dHBJbnRlcmNlcHRvclxufSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uL2h0dHBcIjtcbmltcG9ydCB7IExvY2F0aW9uLCBET0NVTUVOVCB9IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcbmltcG9ydCB7IE9ic2VydmFibGUsIEVNUFRZLCBvZiB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyBzd2l0Y2hNYXAsIGNhdGNoRXJyb3IgfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcbmltcG9ydCB7IE1zYWxTZXJ2aWNlIH0gZnJvbSBcIi4vbXNhbC5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBBY2NvdW50SW5mbywgQXV0aGVudGljYXRpb25SZXN1bHQsIEJyb3dzZXJDb25maWd1cmF0aW9uQXV0aEVycm9yLCBJbnRlcmFjdGlvblR5cGUsIFN0cmluZ1V0aWxzLCBVcmxTdHJpbmcgfSBmcm9tIFwiQGF6dXJlL21zYWwtYnJvd3NlclwiO1xuaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IE1TQUxfSU5URVJDRVBUT1JfQ09ORklHIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBNc2FsSW50ZXJjZXB0b3JBdXRoUmVxdWVzdCwgTXNhbEludGVyY2VwdG9yQ29uZmlndXJhdGlvbiwgUHJvdGVjdGVkUmVzb3VyY2VTY29wZXMsIE1hdGNoaW5nUmVzb3VyY2VzIH0gZnJvbSBcIi4vbXNhbC5pbnRlcmNlcHRvci5jb25maWdcIjtcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIE1zYWxJbnRlcmNlcHRvciBpbXBsZW1lbnRzIEh0dHBJbnRlcmNlcHRvciB7XG4gICAgcHJpdmF0ZSBfZG9jdW1lbnQ/OiBEb2N1bWVudDtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBASW5qZWN0KE1TQUxfSU5URVJDRVBUT1JfQ09ORklHKSBwcml2YXRlIG1zYWxJbnRlcmNlcHRvckNvbmZpZzogTXNhbEludGVyY2VwdG9yQ29uZmlndXJhdGlvbixcbiAgICAgICAgcHJpdmF0ZSBhdXRoU2VydmljZTogTXNhbFNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgbG9jYXRpb246IExvY2F0aW9uLFxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSwgQHR5cGVzY3JpcHQtZXNsaW50L2V4cGxpY2l0LW1vZHVsZS1ib3VuZGFyeS10eXBlc1xuICAgICAgICBASW5qZWN0KERPQ1VNRU5UKSBkb2N1bWVudD86IGFueVxuICAgICkge1xuICAgICAgICB0aGlzLl9kb2N1bWVudCA9IGRvY3VtZW50IGFzIERvY3VtZW50O1xuICAgIH1cblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgaW50ZXJjZXB0KHJlcTogSHR0cFJlcXVlc3Q8YW55PiwgbmV4dDogSHR0cEhhbmRsZXIpOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxhbnk+PiB7XG4gICAgICAgIGlmICh0aGlzLm1zYWxJbnRlcmNlcHRvckNvbmZpZy5pbnRlcmFjdGlvblR5cGUgIT09IEludGVyYWN0aW9uVHlwZS5Qb3B1cCAmJiB0aGlzLm1zYWxJbnRlcmNlcHRvckNvbmZpZy5pbnRlcmFjdGlvblR5cGUgIT09IEludGVyYWN0aW9uVHlwZS5SZWRpcmVjdCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEJyb3dzZXJDb25maWd1cmF0aW9uQXV0aEVycm9yKFwiaW52YWxpZF9pbnRlcmFjdGlvbl90eXBlXCIsIFwiSW52YWxpZCBpbnRlcmFjdGlvbiB0eXBlIHByb3ZpZGVkIHRvIE1TQUwgSW50ZXJjZXB0b3IuIEludGVyYWN0aW9uVHlwZS5Qb3B1cCwgSW50ZXJhY3Rpb25UeXBlLlJlZGlyZWN0IG11c3QgYmUgcHJvdmlkZWQgaW4gdGhlIG1zYWxJbnRlcmNlcHRvckNvbmZpZ3VyYXRpb25cIik7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmF1dGhTZXJ2aWNlLmdldExvZ2dlcigpLnZlcmJvc2UoXCJNU0FMIEludGVyY2VwdG9yIGFjdGl2YXRlZFwiKTtcbiAgICAgICAgY29uc3Qgc2NvcGVzID0gdGhpcy5nZXRTY29wZXNGb3JFbmRwb2ludChyZXEudXJsLCByZXEubWV0aG9kKTtcblxuICAgICAgICAvLyBJZiBubyBzY29wZXMgZm9yIGVuZHBvaW50LCBkb2VzIG5vdCBhY3F1aXJlIHRva2VuXG4gICAgICAgIGlmICghc2NvcGVzIHx8IHNjb3Blcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuYXV0aFNlcnZpY2UuZ2V0TG9nZ2VyKCkudmVyYm9zZShcIkludGVyY2VwdG9yIC0gbm8gc2NvcGVzIGZvciBlbmRwb2ludFwiKTtcbiAgICAgICAgICAgIHJldHVybiBuZXh0LmhhbmRsZShyZXEpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2V0cyBhY2NvdW50IGFzIGFjdGl2ZSBhY2NvdW50IG9yIGZpcnN0IGFjY291bnRcbiAgICAgICAgbGV0IGFjY291bnQ6IEFjY291bnRJbmZvO1xuICAgICAgICBpZiAoISF0aGlzLmF1dGhTZXJ2aWNlLmluc3RhbmNlLmdldEFjdGl2ZUFjY291bnQoKSkge1xuICAgICAgICAgICAgdGhpcy5hdXRoU2VydmljZS5nZXRMb2dnZXIoKS52ZXJib3NlKFwiSW50ZXJjZXB0b3IgLSBhY3RpdmUgYWNjb3VudCBzZWxlY3RlZFwiKTtcbiAgICAgICAgICAgIGFjY291bnQgPSB0aGlzLmF1dGhTZXJ2aWNlLmluc3RhbmNlLmdldEFjdGl2ZUFjY291bnQoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYXV0aFNlcnZpY2UuZ2V0TG9nZ2VyKCkudmVyYm9zZShcIkludGVyY2VwdG9yIC0gbm8gYWN0aXZlIGFjY291bnQsIGZhbGxiYWNrIHRvIGZpcnN0IGFjY291bnRcIik7XG4gICAgICAgICAgICBhY2NvdW50ID0gdGhpcy5hdXRoU2VydmljZS5pbnN0YW5jZS5nZXRBbGxBY2NvdW50cygpWzBdO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYXV0aFJlcXVlc3QgPSB0eXBlb2YgdGhpcy5tc2FsSW50ZXJjZXB0b3JDb25maWcuYXV0aFJlcXVlc3QgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgICAgPyB0aGlzLm1zYWxJbnRlcmNlcHRvckNvbmZpZy5hdXRoUmVxdWVzdCh0aGlzLmF1dGhTZXJ2aWNlLCByZXEsIHsgYWNjb3VudDogYWNjb3VudCB9KVxuICAgICAgICAgICAgOiB7IC4uLnRoaXMubXNhbEludGVyY2VwdG9yQ29uZmlnLmF1dGhSZXF1ZXN0LCBhY2NvdW50IH07XG5cbiAgICAgICAgdGhpcy5hdXRoU2VydmljZS5nZXRMb2dnZXIoKS5pbmZvKGBJbnRlcmNlcHRvciAtICR7c2NvcGVzLmxlbmd0aH0gc2NvcGVzIGZvdW5kIGZvciBlbmRwb2ludGApO1xuICAgICAgICB0aGlzLmF1dGhTZXJ2aWNlLmdldExvZ2dlcigpLmluZm9QaWkoYEludGVyY2VwdG9yIC0gWyR7c2NvcGVzfV0gc2NvcGVzIGZvdW5kIGZvciAke3JlcS51cmx9YCk7XG5cbiAgICAgICAgLy8gTm90ZTogRm9yIE1TQSBhY2NvdW50cywgaW5jbHVkZSBvcGVuaWQgc2NvcGUgd2hlbiBjYWxsaW5nIGFjcXVpcmVUb2tlblNpbGVudCB0byByZXR1cm4gaWRUb2tlblxuICAgICAgICByZXR1cm4gdGhpcy5hdXRoU2VydmljZS5hY3F1aXJlVG9rZW5TaWxlbnQoey4uLmF1dGhSZXF1ZXN0LCBzY29wZXMsIGFjY291bnQgfSlcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIGNhdGNoRXJyb3IoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmF1dGhTZXJ2aWNlLmdldExvZ2dlcigpLmVycm9yKFwiSW50ZXJjZXB0b3IgLSBhY3F1aXJlVG9rZW5TaWxlbnQgcmVqZWN0ZWQgd2l0aCBlcnJvci4gSW52b2tpbmcgaW50ZXJhY3Rpb24gdG8gcmVzb2x2ZS5cIik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmFjcXVpcmVUb2tlbkludGVyYWN0aXZlbHkoYXV0aFJlcXVlc3QsIHNjb3Blcyk7XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgc3dpdGNoTWFwKChyZXN1bHQ6IEF1dGhlbnRpY2F0aW9uUmVzdWx0KSAgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdC5hY2Nlc3NUb2tlbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hdXRoU2VydmljZS5nZXRMb2dnZXIoKS5lcnJvcihcIkludGVyY2VwdG9yIC0gYWNxdWlyZVRva2VuU2lsZW50IHJlc29sdmVkIHdpdGggbnVsbCBhY2Nlc3MgdG9rZW4uIEtub3duIGlzc3VlIHdpdGggQjJDIHRlbmFudHMsIGludm9raW5nIGludGVyYWN0aW9uIHRvIHJlc29sdmUuXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYWNxdWlyZVRva2VuSW50ZXJhY3RpdmVseShhdXRoUmVxdWVzdCwgc2NvcGVzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2YocmVzdWx0KTtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICBzd2l0Y2hNYXAoKHJlc3VsdDogQXV0aGVudGljYXRpb25SZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hdXRoU2VydmljZS5nZXRMb2dnZXIoKS52ZXJib3NlKFwiSW50ZXJjZXB0b3IgLSBzZXR0aW5nIGF1dGhvcml6YXRpb24gaGVhZGVyc1wiKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaGVhZGVycyA9IHJlcS5oZWFkZXJzXG4gICAgICAgICAgICAgICAgICAgICAgICAuc2V0KFwiQXV0aG9yaXphdGlvblwiLCBgQmVhcmVyICR7cmVzdWx0LmFjY2Vzc1Rva2VufWApO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RDbG9uZSA9IHJlcS5jbG9uZSh7aGVhZGVyc30pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV4dC5oYW5kbGUocmVxdWVzdENsb25lKTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbnZva2UgaW50ZXJhY3Rpb24gZm9yIHRoZSBnaXZlbiBzZXQgb2Ygc2NvcGVzXG4gICAgICogQHBhcmFtIGF1dGhSZXF1ZXN0IFJlcXVlc3RcbiAgICAgKiBAcGFyYW0gc2NvcGVzIEFycmF5IG9mIHNjb3BlcyBmb3IgdGhlIHJlcXVlc3RcbiAgICAgKiBAcmV0dXJucyBSZXN1bHQgZnJvbSB0aGUgaW50ZXJhY3RpdmUgcmVxdWVzdFxuICAgICAqL1xuICAgIHByaXZhdGUgYWNxdWlyZVRva2VuSW50ZXJhY3RpdmVseShhdXRoUmVxdWVzdDogTXNhbEludGVyY2VwdG9yQXV0aFJlcXVlc3QsIHNjb3Blczogc3RyaW5nW10pOiBPYnNlcnZhYmxlPEF1dGhlbnRpY2F0aW9uUmVzdWx0PiB7XG4gICAgICAgIGlmICh0aGlzLm1zYWxJbnRlcmNlcHRvckNvbmZpZy5pbnRlcmFjdGlvblR5cGUgPT09IEludGVyYWN0aW9uVHlwZS5Qb3B1cCkge1xuICAgICAgICAgICAgdGhpcy5hdXRoU2VydmljZS5nZXRMb2dnZXIoKS52ZXJib3NlKFwiSW50ZXJjZXB0b3IgLSBlcnJvciBhY3F1aXJpbmcgdG9rZW4gc2lsZW50bHksIGFjcXVpcmluZyBieSBwb3B1cFwiKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmF1dGhTZXJ2aWNlLmFjcXVpcmVUb2tlblBvcHVwKHsgLi4uYXV0aFJlcXVlc3QsIHNjb3BlcyB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmF1dGhTZXJ2aWNlLmdldExvZ2dlcigpLnZlcmJvc2UoXCJJbnRlcmNlcHRvciAtIGVycm9yIGFjcXVpcmluZyB0b2tlbiBzaWxlbnRseSwgYWNxdWlyaW5nIGJ5IHJlZGlyZWN0XCIpO1xuICAgICAgICBjb25zdCByZWRpcmVjdFN0YXJ0UGFnZSA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuICAgICAgICB0aGlzLmF1dGhTZXJ2aWNlLmFjcXVpcmVUb2tlblJlZGlyZWN0KHsuLi5hdXRoUmVxdWVzdCwgc2NvcGVzLCByZWRpcmVjdFN0YXJ0UGFnZSB9KTtcbiAgICAgICAgcmV0dXJuIEVNUFRZO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvb2tzIHVwIHRoZSBzY29wZXMgZm9yIHRoZSBnaXZlbiBlbmRwb2ludCBmcm9tIHRoZSBwcm90ZWN0ZWRSZXNvdXJjZU1hcFxuICAgICAqIEBwYXJhbSBlbmRwb2ludCBVcmwgb2YgdGhlIHJlcXVlc3RcbiAgICAgKiBAcGFyYW0gaHR0cE1ldGhvZCBIdHRwIG1ldGhvZCBvZiB0aGUgcmVxdWVzdFxuICAgICAqIEByZXR1cm5zIEFycmF5IG9mIHNjb3Blcywgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAgKlxuICAgICAqL1xuICAgIHByaXZhdGUgZ2V0U2NvcGVzRm9yRW5kcG9pbnQoZW5kcG9pbnQ6IHN0cmluZywgaHR0cE1ldGhvZDogc3RyaW5nKTogQXJyYXk8c3RyaW5nPnxudWxsIHtcbiAgICAgICAgdGhpcy5hdXRoU2VydmljZS5nZXRMb2dnZXIoKS52ZXJib3NlKFwiSW50ZXJjZXB0b3IgLSBnZXR0aW5nIHNjb3BlcyBmb3IgZW5kcG9pbnRcIik7XG5cbiAgICAgICAgLy8gRW5zdXJlcyBlbmRwb2ludHMgYW5kIHByb3RlY3RlZCByZXNvdXJjZXMgY29tcGFyZWQgYXJlIG5vcm1hbGl6ZWRcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZEVuZHBvaW50ID0gdGhpcy5sb2NhdGlvbi5ub3JtYWxpemUoZW5kcG9pbnQpO1xuXG4gICAgICAgIGNvbnN0IHByb3RlY3RlZFJlc291cmNlc0FycmF5ID0gQXJyYXkuZnJvbSh0aGlzLm1zYWxJbnRlcmNlcHRvckNvbmZpZy5wcm90ZWN0ZWRSZXNvdXJjZU1hcC5rZXlzKCkpO1xuXG4gICAgICAgIGNvbnN0IG1hdGNoaW5nUHJvdGVjdGVkUmVzb3VyY2VzID0gdGhpcy5tYXRjaFJlc291cmNlc1RvRW5kcG9pbnQocHJvdGVjdGVkUmVzb3VyY2VzQXJyYXksIG5vcm1hbGl6ZWRFbmRwb2ludCk7XG5cbiAgICAgICAgLy8gQ2hlY2sgYWJzb2x1dGUgdXJscyBvZiByZXNvdXJjZXMgZmlyc3QgYmVmb3JlIGNoZWNraW5nIHJlbGF0aXZlIHRvIHByZXZlbnQgaW5jb3JyZWN0IG1hdGNoaW5nIHdoZXJlIG11bHRpcGxlIHJlc291cmNlcyBoYXZlIHNpbWlsYXIgcmVsYXRpdmUgdXJsc1xuICAgICAgICBpZiAobWF0Y2hpbmdQcm90ZWN0ZWRSZXNvdXJjZXMuYWJzb2x1dGVSZXNvdXJjZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubWF0Y2hTY29wZXNUb0VuZHBvaW50KHRoaXMubXNhbEludGVyY2VwdG9yQ29uZmlnLnByb3RlY3RlZFJlc291cmNlTWFwLCBtYXRjaGluZ1Byb3RlY3RlZFJlc291cmNlcy5hYnNvbHV0ZVJlc291cmNlcywgaHR0cE1ldGhvZCk7XG4gICAgICAgIH0gZWxzZSBpZiAobWF0Y2hpbmdQcm90ZWN0ZWRSZXNvdXJjZXMucmVsYXRpdmVSZXNvdXJjZXMubGVuZ3RoID4gMCl7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5tYXRjaFNjb3Blc1RvRW5kcG9pbnQodGhpcy5tc2FsSW50ZXJjZXB0b3JDb25maWcucHJvdGVjdGVkUmVzb3VyY2VNYXAsIG1hdGNoaW5nUHJvdGVjdGVkUmVzb3VyY2VzLnJlbGF0aXZlUmVzb3VyY2VzLCBodHRwTWV0aG9kKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpbmRzIHJlc291cmNlIGVuZHBvaW50cyB0aGF0IG1hdGNoIHJlcXVlc3QgZW5kcG9pbnRcbiAgICAgKiBAcGFyYW0gcHJvdGVjdGVkUmVzb3VyY2VzRW5kcG9pbnRzXG4gICAgICogQHBhcmFtIGVuZHBvaW50IFxuICAgICAqIEByZXR1cm5zIFxuICAgICAqL1xuICAgIHByaXZhdGUgbWF0Y2hSZXNvdXJjZXNUb0VuZHBvaW50KHByb3RlY3RlZFJlc291cmNlc0VuZHBvaW50czogc3RyaW5nW10sIGVuZHBvaW50OiBzdHJpbmcpOiBNYXRjaGluZ1Jlc291cmNlcyB7XG4gICAgICAgIGNvbnN0IG1hdGNoaW5nUmVzb3VyY2VzOiBNYXRjaGluZ1Jlc291cmNlcyA9IHthYnNvbHV0ZVJlc291cmNlczogW10sIHJlbGF0aXZlUmVzb3VyY2VzOiBbXX07XG5cbiAgICAgICAgcHJvdGVjdGVkUmVzb3VyY2VzRW5kcG9pbnRzLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICAgIC8vIE5vcm1hbGl6ZXMgYW5kIGFkZHMgcmVzb3VyY2UgdG8gbWF0Y2hpbmdSZXNvdXJjZXMuYWJzb2x1dGVSZXNvdXJjZXMgaWYga2V5IG1hdGNoZXMgZW5kcG9pbnQuIFN0cmluZ1V0aWxzLm1hdGNoUGF0dGVybiBhY2NvdW50cyBmb3Igd2lsZGNhcmRzXG4gICAgICAgICAgICBjb25zdCBub3JtYWxpemVkS2V5ID0gdGhpcy5sb2NhdGlvbi5ub3JtYWxpemUoa2V5KTtcbiAgICAgICAgICAgIGlmIChTdHJpbmdVdGlscy5tYXRjaFBhdHRlcm4obm9ybWFsaXplZEtleSwgZW5kcG9pbnQpKXtcbiAgICAgICAgICAgICAgICBtYXRjaGluZ1Jlc291cmNlcy5hYnNvbHV0ZVJlc291cmNlcy5wdXNoKGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIEdldCB1cmwgY29tcG9uZW50cyBmb3IgcmVsYXRpdmUgdXJsc1xuICAgICAgICAgICAgY29uc3QgYWJzb2x1dGVLZXkgPSB0aGlzLmdldEFic29sdXRlVXJsKGtleSk7XG4gICAgICAgICAgICBjb25zdCBrZXlDb21wb25lbnRzID0gbmV3IFVybFN0cmluZyhhYnNvbHV0ZUtleSkuZ2V0VXJsQ29tcG9uZW50cygpO1xuICAgICAgICAgICAgY29uc3QgYWJzb2x1dGVFbmRwb2ludCA9IHRoaXMuZ2V0QWJzb2x1dGVVcmwoZW5kcG9pbnQpO1xuICAgICAgICAgICAgY29uc3QgZW5kcG9pbnRDb21wb25lbnRzID0gbmV3IFVybFN0cmluZyhhYnNvbHV0ZUVuZHBvaW50KS5nZXRVcmxDb21wb25lbnRzKCk7XG5cbiAgICAgICAgICAgIC8vIE5vcm1hbGl6ZWQga2V5IHNob3VsZCBpbmNsdWRlIHF1ZXJ5IHN0cmluZ3MgaWYgYXBwbGljYWJsZVxuICAgICAgICAgICAgY29uc3QgcmVsYXRpdmVOb3JtYWxpemVkS2V5ID0ga2V5Q29tcG9uZW50cy5RdWVyeVN0cmluZyA/IGAke2tleUNvbXBvbmVudHMuQWJzb2x1dGVQYXRofT8ke2tleUNvbXBvbmVudHMuUXVlcnlTdHJpbmd9YCA6IHRoaXMubG9jYXRpb24ubm9ybWFsaXplKGtleUNvbXBvbmVudHMuQWJzb2x1dGVQYXRoKTtcblxuICAgICAgICAgICAgLy8gQWRkIHJlc291cmNlIHRvIG1hdGNoaW5nUmVzb3VyY2VzLnJlbGF0aXZlUmVzb3VyY2VzIGlmIHNhbWUgb3JpZ2luLCByZWxhdGl2ZUtleSBtYXRjaGVzIGVuZHBvaW50LCBhbmQgaXMgbm90IGVtcHR5XG4gICAgICAgICAgICBpZiAoa2V5Q29tcG9uZW50cy5Ib3N0TmFtZUFuZFBvcnQgPT09IGVuZHBvaW50Q29tcG9uZW50cy5Ib3N0TmFtZUFuZFBvcnQgJiYgU3RyaW5nVXRpbHMubWF0Y2hQYXR0ZXJuKHJlbGF0aXZlTm9ybWFsaXplZEtleSwgYWJzb2x1dGVFbmRwb2ludCkgJiYgcmVsYXRpdmVOb3JtYWxpemVkS2V5ICE9PSBcIlwiICYmIHJlbGF0aXZlTm9ybWFsaXplZEtleSAhPT0gXCIvKlwiKXtcbiAgICAgICAgICAgICAgICBtYXRjaGluZ1Jlc291cmNlcy5yZWxhdGl2ZVJlc291cmNlcy5wdXNoKGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBtYXRjaGluZ1Jlc291cmNlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUcmFuc2Zvcm1zIHJlbGF0aXZlIHVybHMgdG8gYWJzb2x1dGUgdXJsc1xuICAgICAqIEBwYXJhbSB1cmwgXG4gICAgICogQHJldHVybnMgXG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXRBYnNvbHV0ZVVybCh1cmw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IGxpbmsgPSB0aGlzLl9kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYVwiKTtcbiAgICAgICAgbGluay5ocmVmID0gdXJsO1xuICAgICAgICByZXR1cm4gbGluay5ocmVmO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpbmRzIHNjb3BlcyBmcm9tIGZpcnN0IG1hdGNoaW5nIGVuZHBvaW50IHdpdGggSFRUUCBtZXRob2QgdGhhdCBtYXRjaGVzIHJlcXVlc3RcbiAgICAgKiBAcGFyYW0gcHJvdGVjdGVkUmVzb3VyY2VNYXAgUHJvdGVjdGVkIHJlc291cmNlIG1hcFxuICAgICAqIEBwYXJhbSBlbmRwb2ludEFycmF5IEFycmF5IG9mIHJlc291cmNlcyB0aGF0IG1hdGNoIHJlcXVlc3QgZW5kcG9pbnRcbiAgICAgKiBAcGFyYW0gaHR0cE1ldGhvZCBIdHRwIG1ldGhvZCBvZiB0aGUgcmVxdWVzdFxuICAgICAqIEByZXR1cm5zIFxuICAgICAqL1xuICAgIHByaXZhdGUgbWF0Y2hTY29wZXNUb0VuZHBvaW50KHByb3RlY3RlZFJlc291cmNlTWFwOiBNYXA8c3RyaW5nLCBBcnJheTxzdHJpbmd8UHJvdGVjdGVkUmVzb3VyY2VTY29wZXM+IHwgbnVsbD4sIGVuZHBvaW50QXJyYXk6IHN0cmluZ1tdLCBodHRwTWV0aG9kOiBzdHJpbmcpOiBBcnJheTxzdHJpbmc+fG51bGwge1xuICAgICAgICBjb25zdCBhbGxNYXRjaGVkU2NvcGVzID0gW107XG5cbiAgICAgICAgLy8gQ2hlY2sgZWFjaCBtYXRjaGVkIGVuZHBvaW50IGZvciBtYXRjaGluZyBIdHRwTWV0aG9kIGFuZCBzY29wZXNcbiAgICAgICAgZW5kcG9pbnRBcnJheS5mb3JFYWNoKG1hdGNoZWRFbmRwb2ludCA9PiB7XG4gICAgICAgICAgICBjb25zdCBzY29wZXNGb3JFbmRwb2ludCA9IFtdO1xuICAgICAgICAgICAgY29uc3QgbWV0aG9kQW5kU2NvcGVzQXJyYXkgPSBwcm90ZWN0ZWRSZXNvdXJjZU1hcC5nZXQobWF0Y2hlZEVuZHBvaW50KTtcblxuICAgICAgICAgICAgLy8gUmV0dXJuIGlmIHJlc291cmNlIGlzIHVucHJvdGVjdGVkXG4gICAgICAgICAgICBpZiAobWV0aG9kQW5kU2NvcGVzQXJyYXkgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBhbGxNYXRjaGVkU2NvcGVzLnB1c2gobnVsbCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBtZXRob2RBbmRTY29wZXNBcnJheS5mb3JFYWNoKGVudHJ5ID0+IHtcbiAgICAgICAgICAgICAgICAvLyBFbnRyeSBpcyBlaXRoZXIgYXJyYXkgb2Ygc2NvcGVzIG9yIFByb3RlY3RlZFJlc291cmNlU2NvcGVzIG9iamVjdFxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZW50cnkgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgc2NvcGVzRm9yRW5kcG9pbnQucHVzaChlbnRyeSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRW5zdXJlIG1ldGhvZHMgYmVpbmcgY29tcGFyZWQgYXJlIG5vcm1hbGl6ZWRcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm9ybWFsaXplZFJlcXVlc3RNZXRob2QgPSBodHRwTWV0aG9kLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRSZXNvdXJjZU1ldGhvZCA9IGVudHJ5Lmh0dHBNZXRob2QudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gTWV0aG9kIGluIHByb3RlY3RlZFJlc291cmNlTWFwIG1hdGNoZXMgcmVxdWVzdCBodHRwIG1ldGhvZFxuICAgICAgICAgICAgICAgICAgICBpZiAobm9ybWFsaXplZFJlc291cmNlTWV0aG9kID09PSBub3JtYWxpemVkUmVxdWVzdE1ldGhvZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVmFsaWRhdGUgaWYgc2NvcGVzIGNvbWVzIG51bGwgdG8gdW5wcm90ZWN0IHRoZSByZXNvdXJjZSBpbiBhIGNlcnRhaW4gaHR0cCBtZXRob2QgXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW50cnkuc2NvcGVzID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsTWF0Y2hlZFNjb3Blcy5wdXNoKG51bGwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5zY29wZXMuZm9yRWFjaCgoc2NvcGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGVzRm9yRW5kcG9pbnQucHVzaChzY29wZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8gT25seSBhZGQgdG8gYWxsIHNjb3BlcyBpZiBzY29wZXMgZm9yIGVuZHBvaW50IGFuZCBtZXRob2QgaXMgZm91bmRcbiAgICAgICAgICAgIGlmIChzY29wZXNGb3JFbmRwb2ludC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgYWxsTWF0Y2hlZFNjb3Blcy5wdXNoKHNjb3Blc0ZvckVuZHBvaW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGFsbE1hdGNoZWRTY29wZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgaWYgKGFsbE1hdGNoZWRTY29wZXMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYXV0aFNlcnZpY2UuZ2V0TG9nZ2VyKCkud2FybmluZyhcIkludGVyY2VwdG9yIC0gTW9yZSB0aGFuIDEgbWF0Y2hpbmcgc2NvcGVzIGZvciBlbmRwb2ludCBmb3VuZC5cIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBSZXR1cm5zIHNjb3BlcyBmb3IgZmlyc3QgbWF0Y2hpbmcgZW5kcG9pbnRcbiAgICAgICAgICAgIHJldHVybiBhbGxNYXRjaGVkU2NvcGVzWzBdO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG59XG4iXX0=
@@ -0,0 +1,46 @@
1
+ /*
2
+ * Copyright (c) Microsoft Corporation. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+ import { NgModule } from "@angular/core";
6
+ import { CommonModule } from "@angular/common";
7
+ import { MsalGuard } from "./msal.guard";
8
+ import { MsalBroadcastService } from "./msal.broadcast.service";
9
+ import { MsalService } from "./msal.service";
10
+ import { MSAL_INSTANCE, MSAL_GUARD_CONFIG, MSAL_INTERCEPTOR_CONFIG } from "./constants";
11
+ import { MsalRedirectComponent } from "./msal.redirect.component";
12
+ export class MsalModule {
13
+ static forRoot(msalInstance, guardConfig, interceptorConfig) {
14
+ return {
15
+ ngModule: MsalModule,
16
+ providers: [
17
+ {
18
+ provide: MSAL_INSTANCE,
19
+ useValue: msalInstance
20
+ },
21
+ {
22
+ provide: MSAL_GUARD_CONFIG,
23
+ useValue: guardConfig
24
+ },
25
+ {
26
+ provide: MSAL_INTERCEPTOR_CONFIG,
27
+ useValue: interceptorConfig
28
+ },
29
+ MsalService
30
+ ]
31
+ };
32
+ }
33
+ }
34
+ MsalModule.decorators = [
35
+ { type: NgModule, args: [{
36
+ declarations: [MsalRedirectComponent],
37
+ imports: [
38
+ CommonModule
39
+ ],
40
+ providers: [
41
+ MsalGuard,
42
+ MsalBroadcastService
43
+ ]
44
+ },] }
45
+ ];
46
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXNhbC5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbXNhbC5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBRUgsT0FBTyxFQUF1QixRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDOUQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBSS9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDekMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDaEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxhQUFhLEVBQUcsaUJBQWlCLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDekYsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFZbEUsTUFBTSxPQUFPLFVBQVU7SUFDbkIsTUFBTSxDQUFDLE9BQU8sQ0FDVixZQUFzQyxFQUN0QyxXQUFtQyxFQUNuQyxpQkFBK0M7UUFFL0MsT0FBTztZQUNILFFBQVEsRUFBRSxVQUFVO1lBQ3BCLFNBQVMsRUFBRTtnQkFDUDtvQkFDSSxPQUFPLEVBQUUsYUFBYTtvQkFDdEIsUUFBUSxFQUFFLFlBQVk7aUJBQ3pCO2dCQUNEO29CQUNJLE9BQU8sRUFBRSxpQkFBaUI7b0JBQzFCLFFBQVEsRUFBRSxXQUFXO2lCQUN4QjtnQkFDRDtvQkFDSSxPQUFPLEVBQUUsdUJBQXVCO29CQUNoQyxRQUFRLEVBQUUsaUJBQWlCO2lCQUM5QjtnQkFDRCxXQUFXO2FBQ2Q7U0FDSixDQUFDO0lBQ04sQ0FBQzs7O1lBbENKLFFBQVEsU0FBQztnQkFDTixZQUFZLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQztnQkFDckMsT0FBTyxFQUFFO29CQUNMLFlBQVk7aUJBQ2Y7Z0JBQ0QsU0FBUyxFQUFFO29CQUNQLFNBQVM7b0JBQ1Qsb0JBQW9CO2lCQUN2QjthQUNKIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IE1vZHVsZVdpdGhQcm92aWRlcnMsIE5nTW9kdWxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcbmltcG9ydCB7IElQdWJsaWNDbGllbnRBcHBsaWNhdGlvbiB9IGZyb20gXCJAYXp1cmUvbXNhbC1icm93c2VyXCI7XG5pbXBvcnQgeyBNc2FsR3VhcmRDb25maWd1cmF0aW9uIH0gZnJvbSBcIi4vbXNhbC5ndWFyZC5jb25maWdcIjtcbmltcG9ydCB7IE1zYWxJbnRlcmNlcHRvckNvbmZpZ3VyYXRpb24gfSBmcm9tIFwiLi9tc2FsLmludGVyY2VwdG9yLmNvbmZpZ1wiO1xuaW1wb3J0IHsgTXNhbEd1YXJkIH0gZnJvbSBcIi4vbXNhbC5ndWFyZFwiO1xuaW1wb3J0IHsgTXNhbEJyb2FkY2FzdFNlcnZpY2UgfSBmcm9tIFwiLi9tc2FsLmJyb2FkY2FzdC5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBNc2FsU2VydmljZSB9IGZyb20gXCIuL21zYWwuc2VydmljZVwiO1xuaW1wb3J0IHsgTVNBTF9JTlNUQU5DRSAsIE1TQUxfR1VBUkRfQ09ORklHLCBNU0FMX0lOVEVSQ0VQVE9SX0NPTkZJRyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgTXNhbFJlZGlyZWN0Q29tcG9uZW50IH0gZnJvbSBcIi4vbXNhbC5yZWRpcmVjdC5jb21wb25lbnRcIjtcblxuQE5nTW9kdWxlKHtcbiAgICBkZWNsYXJhdGlvbnM6IFtNc2FsUmVkaXJlY3RDb21wb25lbnRdLFxuICAgIGltcG9ydHM6IFtcbiAgICAgICAgQ29tbW9uTW9kdWxlXG4gICAgXSxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgTXNhbEd1YXJkLFxuICAgICAgICBNc2FsQnJvYWRjYXN0U2VydmljZVxuICAgIF1cbn0pXG5leHBvcnQgY2xhc3MgTXNhbE1vZHVsZSB7XG4gICAgc3RhdGljIGZvclJvb3QoXG4gICAgICAgIG1zYWxJbnN0YW5jZTogSVB1YmxpY0NsaWVudEFwcGxpY2F0aW9uLFxuICAgICAgICBndWFyZENvbmZpZzogTXNhbEd1YXJkQ29uZmlndXJhdGlvbixcbiAgICAgICAgaW50ZXJjZXB0b3JDb25maWc6IE1zYWxJbnRlcmNlcHRvckNvbmZpZ3VyYXRpb25cbiAgICApOiBNb2R1bGVXaXRoUHJvdmlkZXJzPE1zYWxNb2R1bGU+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5nTW9kdWxlOiBNc2FsTW9kdWxlLFxuICAgICAgICAgICAgcHJvdmlkZXJzOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBwcm92aWRlOiBNU0FMX0lOU1RBTkNFLFxuICAgICAgICAgICAgICAgICAgICB1c2VWYWx1ZTogbXNhbEluc3RhbmNlXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHByb3ZpZGU6IE1TQUxfR1VBUkRfQ09ORklHLFxuICAgICAgICAgICAgICAgICAgICB1c2VWYWx1ZTogZ3VhcmRDb25maWdcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvdmlkZTogTVNBTF9JTlRFUkNFUFRPUl9DT05GSUcsXG4gICAgICAgICAgICAgICAgICAgIHVzZVZhbHVlOiBpbnRlcmNlcHRvckNvbmZpZ1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgTXNhbFNlcnZpY2VcbiAgICAgICAgICAgIF1cbiAgICAgICAgfTtcbiAgICB9XG5cbn1cbiJdfQ==
@@ -0,0 +1,53 @@
1
+ /*
2
+ * Copyright (c) Microsoft Corporation. All rights reserved.
3
+ * Licensed under the MIT License.
4
+ */
5
+ import { __awaiter } from "tslib";
6
+ import { NavigationClient, UrlString } from "@azure/msal-browser";
7
+ import { Router } from "@angular/router";
8
+ import { Location } from "@angular/common";
9
+ import { MsalService } from "./msal.service";
10
+ import { Injectable } from "@angular/core";
11
+ /**
12
+ * Custom navigation used for Angular client-side navigation.
13
+ * See performance doc for details:
14
+ * https://github.com/AzureAD/microsoft-authentication-library-for-js/tree/dev/lib/msal-angular/docs/v2-docs/performance.md
15
+ */
16
+ export class MsalCustomNavigationClient extends NavigationClient {
17
+ constructor(authService, router, location) {
18
+ super();
19
+ this.authService = authService;
20
+ this.router = router;
21
+ this.location = location;
22
+ }
23
+ navigateInternal(url, options) {
24
+ const _super = Object.create(null, {
25
+ navigateInternal: { get: () => super.navigateInternal }
26
+ });
27
+ return __awaiter(this, void 0, void 0, function* () {
28
+ this.authService.getLogger().trace("MsalCustomNavigationClient called");
29
+ this.authService.getLogger().verbose("MsalCustomNavigationClient - navigating");
30
+ this.authService.getLogger().verbosePii(`MsalCustomNavigationClient - navigating to url: ${url}`);
31
+ // Prevent hash clearing from causing an issue with Client-side navigation after redirect is handled
32
+ if (options.noHistory) {
33
+ return _super.navigateInternal.call(this, url, options);
34
+ }
35
+ else {
36
+ // Normalizing newUrl if no query string
37
+ const urlComponents = new UrlString(url).getUrlComponents();
38
+ const newUrl = urlComponents.QueryString ? `${urlComponents.AbsolutePath}?${urlComponents.QueryString}` : this.location.normalize(urlComponents.AbsolutePath);
39
+ this.router.navigateByUrl(newUrl, { replaceUrl: options.noHistory });
40
+ }
41
+ return Promise.resolve(options.noHistory);
42
+ });
43
+ }
44
+ }
45
+ MsalCustomNavigationClient.decorators = [
46
+ { type: Injectable }
47
+ ];
48
+ MsalCustomNavigationClient.ctorParameters = () => [
49
+ { type: MsalService },
50
+ { type: Router },
51
+ { type: Location }
52
+ ];
53
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXNhbC5uYXZpZ2F0aW9uLmNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tc2FsLm5hdmlnYXRpb24uY2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRzs7QUFFSCxPQUFPLEVBQUUsZ0JBQWdCLEVBQXFCLFNBQVMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3JGLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0M7Ozs7R0FJRztBQUVILE1BQU0sT0FBTywwQkFBMkIsU0FBUSxnQkFBZ0I7SUFFNUQsWUFDWSxXQUF3QixFQUN4QixNQUFjLEVBQ2QsUUFBa0I7UUFFMUIsS0FBSyxFQUFFLENBQUM7UUFKQSxnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUN4QixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2QsYUFBUSxHQUFSLFFBQVEsQ0FBVTtJQUc5QixDQUFDO0lBRUssZ0JBQWdCLENBQUMsR0FBVSxFQUFFLE9BQTBCOzs7OztZQUN6RCxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxDQUFDLEtBQUssQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDO1lBRXhFLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLENBQUMsT0FBTyxDQUFDLHlDQUF5QyxDQUFDLENBQUM7WUFDaEYsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxVQUFVLENBQUMsbURBQW1ELEdBQUcsRUFBRSxDQUFDLENBQUM7WUFFbEcsb0dBQW9HO1lBQ3BHLElBQUksT0FBTyxDQUFDLFNBQVMsRUFBRTtnQkFDbkIsT0FBTyxPQUFNLGdCQUFnQixZQUFDLEdBQUcsRUFBRSxPQUFPLEVBQUU7YUFDL0M7aUJBQU07Z0JBQ0gsd0NBQXdDO2dCQUN4QyxNQUFNLGFBQWEsR0FBRyxJQUFJLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO2dCQUM1RCxNQUFNLE1BQU0sR0FBRyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxZQUFZLElBQUksYUFBYSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQzlKLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxFQUFFLFVBQVUsRUFBRSxPQUFPLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQzthQUN4RTtZQUNELE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDOUMsQ0FBQztLQUFBOzs7WUEzQkosVUFBVTs7O1lBUkYsV0FBVztZQUZYLE1BQU07WUFDTixRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IE5hdmlnYXRpb25DbGllbnQsIE5hdmlnYXRpb25PcHRpb25zLCBVcmxTdHJpbmcgfSBmcm9tIFwiQGF6dXJlL21zYWwtYnJvd3NlclwiO1xuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSBcIkBhbmd1bGFyL3JvdXRlclwiO1xuaW1wb3J0IHsgTG9jYXRpb24gfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uXCI7XG5pbXBvcnQgeyBNc2FsU2VydmljZSB9IGZyb20gXCIuL21zYWwuc2VydmljZVwiO1xuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5cbi8qKlxuICogQ3VzdG9tIG5hdmlnYXRpb24gdXNlZCBmb3IgQW5ndWxhciBjbGllbnQtc2lkZSBuYXZpZ2F0aW9uLlxuICogU2VlIHBlcmZvcm1hbmNlIGRvYyBmb3IgZGV0YWlsczpcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9BenVyZUFEL21pY3Jvc29mdC1hdXRoZW50aWNhdGlvbi1saWJyYXJ5LWZvci1qcy90cmVlL2Rldi9saWIvbXNhbC1hbmd1bGFyL2RvY3MvdjItZG9jcy9wZXJmb3JtYW5jZS5tZFxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgTXNhbEN1c3RvbU5hdmlnYXRpb25DbGllbnQgZXh0ZW5kcyBOYXZpZ2F0aW9uQ2xpZW50IHtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIGF1dGhTZXJ2aWNlOiBNc2FsU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlciwgXG4gICAgICAgIHByaXZhdGUgbG9jYXRpb246IExvY2F0aW9uXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuXG4gICAgYXN5bmMgbmF2aWdhdGVJbnRlcm5hbCh1cmw6c3RyaW5nLCBvcHRpb25zOiBOYXZpZ2F0aW9uT3B0aW9ucyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICB0aGlzLmF1dGhTZXJ2aWNlLmdldExvZ2dlcigpLnRyYWNlKFwiTXNhbEN1c3RvbU5hdmlnYXRpb25DbGllbnQgY2FsbGVkXCIpO1xuICAgICAgICBcbiAgICAgICAgdGhpcy5hdXRoU2VydmljZS5nZXRMb2dnZXIoKS52ZXJib3NlKFwiTXNhbEN1c3RvbU5hdmlnYXRpb25DbGllbnQgLSBuYXZpZ2F0aW5nXCIpO1xuICAgICAgICB0aGlzLmF1dGhTZXJ2aWNlLmdldExvZ2dlcigpLnZlcmJvc2VQaWkoYE1zYWxDdXN0b21OYXZpZ2F0aW9uQ2xpZW50IC0gbmF2aWdhdGluZyB0byB1cmw6ICR7dXJsfWApO1xuICAgICAgICBcbiAgICAgICAgLy8gUHJldmVudCBoYXNoIGNsZWFyaW5nIGZyb20gY2F1c2luZyBhbiBpc3N1ZSB3aXRoIENsaWVudC1zaWRlIG5hdmlnYXRpb24gYWZ0ZXIgcmVkaXJlY3QgaXMgaGFuZGxlZFxuICAgICAgICBpZiAob3B0aW9ucy5ub0hpc3RvcnkpIHtcbiAgICAgICAgICAgIHJldHVybiBzdXBlci5uYXZpZ2F0ZUludGVybmFsKHVybCwgb3B0aW9ucyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBOb3JtYWxpemluZyBuZXdVcmwgaWYgbm8gcXVlcnkgc3RyaW5nXG4gICAgICAgICAgICBjb25zdCB1cmxDb21wb25lbnRzID0gbmV3IFVybFN0cmluZyh1cmwpLmdldFVybENvbXBvbmVudHMoKTtcbiAgICAgICAgICAgIGNvbnN0IG5ld1VybCA9IHVybENvbXBvbmVudHMuUXVlcnlTdHJpbmcgPyBgJHt1cmxDb21wb25lbnRzLkFic29sdXRlUGF0aH0/JHt1cmxDb21wb25lbnRzLlF1ZXJ5U3RyaW5nfWAgOiB0aGlzLmxvY2F0aW9uLm5vcm1hbGl6ZSh1cmxDb21wb25lbnRzLkFic29sdXRlUGF0aCk7XG4gICAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZUJ5VXJsKG5ld1VybCwgeyByZXBsYWNlVXJsOiBvcHRpb25zLm5vSGlzdG9yeSB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG9wdGlvbnMubm9IaXN0b3J5KTtcbiAgICB9XG59XG4iXX0=