ngx-oauth 5.0.0 → 7.0.1

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 (39) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +17 -16
  3. package/components/index.d.ts +1 -0
  4. package/components/{login/oauth-login.component.d.ts → o-auth-login.component.d.ts} +5 -6
  5. package/config/index.d.ts +17 -0
  6. package/esm2022/components/index.mjs +2 -0
  7. package/esm2022/components/o-auth-login.component.mjs +261 -0
  8. package/esm2022/config/index.mjs +32 -0
  9. package/esm2022/index.mjs +8 -0
  10. package/esm2022/models/index.mjs +16 -0
  11. package/esm2022/services/index.mjs +5 -0
  12. package/esm2022/services/o-auth-http-client.mjs +15 -0
  13. package/esm2022/services/o-auth-token.service.mjs +80 -0
  14. package/esm2022/services/o-auth.interceptor.mjs +43 -0
  15. package/esm2022/services/o-auth.service.mjs +302 -0
  16. package/fesm2022/ngx-oauth.mjs +731 -0
  17. package/fesm2022/ngx-oauth.mjs.map +1 -0
  18. package/index.d.ts +3 -5
  19. package/models/index.d.ts +3 -23
  20. package/package.json +10 -18
  21. package/services/index.d.ts +4 -0
  22. package/services/o-auth-http-client.d.ts +6 -0
  23. package/services/{token.service.d.ts → o-auth-token.service.d.ts} +5 -6
  24. package/services/o-auth.interceptor.d.ts +2 -0
  25. package/services/{oauth.service.d.ts → o-auth.service.d.ts} +5 -5
  26. package/esm2020/components/login/oauth-login.component.mjs +0 -119
  27. package/esm2020/index.mjs +0 -10
  28. package/esm2020/models/index.mjs +0 -47
  29. package/esm2020/oauth.module.mjs +0 -120
  30. package/esm2020/services/oauth.interceptor.mjs +0 -53
  31. package/esm2020/services/oauth.service.mjs +0 -300
  32. package/esm2020/services/token.service.mjs +0 -83
  33. package/fesm2015/ngx-oauth.mjs +0 -639
  34. package/fesm2015/ngx-oauth.mjs.map +0 -1
  35. package/fesm2020/ngx-oauth.mjs +0 -698
  36. package/fesm2020/ngx-oauth.mjs.map +0 -1
  37. package/oauth.module.d.ts +0 -14
  38. package/services/oauth.interceptor.d.ts +0 -13
  39. /package/{esm2020 → esm2022}/ngx-oauth.mjs +0 -0
@@ -1,120 +0,0 @@
1
- import { NgModule, Optional, PLATFORM_ID } from '@angular/core';
2
- import { FormsModule } from '@angular/forms';
3
- import { HTTP_INTERCEPTORS, HttpBackend, HttpClient, HttpClientModule } from '@angular/common/http';
4
- import { RouterModule } from '@angular/router';
5
- import { LOCATION, OAUTH_HTTP_CLIENT, provideOAuthConfigFactory, SERVER_HOST, SERVER_PATH, STORAGE } from './models';
6
- import { OAuthService } from './services/oauth.service';
7
- import { OAuthLoginComponent } from './components/login/oauth-login.component';
8
- import { CommonModule, isPlatformBrowser } from '@angular/common';
9
- import { OAuthInterceptor } from './services/oauth.interceptor';
10
- import { OAuthTokenService } from './services/token.service';
11
- import * as i0 from "@angular/core";
12
- const mockLocation = (serverHost, serverPath) => {
13
- const url = new URL(serverHost && serverPath ? `${serverHost}${serverPath}` : 'http://localhost');
14
- const { href, origin, protocol, host, hostname, port, pathname, search, hash } = url;
15
- return {
16
- href, origin, protocol, host, hostname, port, pathname, search, hash,
17
- reload() {
18
- },
19
- assign(_) {
20
- },
21
- ancestorOrigins: {},
22
- replace(_) {
23
- }
24
- };
25
- };
26
- const LocationService = {
27
- provide: LOCATION,
28
- useFactory(platformId, serverHost, serverPath) {
29
- return isPlatformBrowser(platformId) ? location : mockLocation(serverHost, serverPath);
30
- },
31
- deps: [
32
- PLATFORM_ID,
33
- [new Optional(), SERVER_HOST],
34
- [new Optional(), SERVER_PATH]
35
- ]
36
- };
37
- const mockStorage = {
38
- clear() {
39
- },
40
- getItem(key) {
41
- return null;
42
- },
43
- key(index) {
44
- return null;
45
- },
46
- removeItem(key) {
47
- },
48
- setItem(key, value) {
49
- },
50
- length: 0
51
- };
52
- const StorageService = {
53
- provide: STORAGE,
54
- useFactory(platformId) {
55
- return isPlatformBrowser(platformId) ? localStorage : mockStorage;
56
- },
57
- deps: [PLATFORM_ID]
58
- };
59
- const OAuthHttpClient = {
60
- provide: OAUTH_HTTP_CLIENT,
61
- useFactory(httpBackend) {
62
- // avoid http interceptors
63
- return new HttpClient(httpBackend);
64
- },
65
- deps: [HttpBackend]
66
- };
67
- const OAuthInterceptorService = {
68
- provide: HTTP_INTERCEPTORS,
69
- useClass: OAuthInterceptor,
70
- multi: true,
71
- };
72
- const defaultConfig = (storage) => {
73
- return {
74
- storage,
75
- storageKey: 'token',
76
- ignorePaths: []
77
- };
78
- };
79
- export class OAuthModule {
80
- static forRoot(config = {}) {
81
- return {
82
- ngModule: OAuthModule,
83
- providers: [
84
- LocationService,
85
- StorageService,
86
- OAuthHttpClient,
87
- provideOAuthConfigFactory((storage) => ({
88
- ...defaultConfig(storage),
89
- ...config
90
- }), [STORAGE]),
91
- OAuthTokenService,
92
- OAuthInterceptorService,
93
- OAuthService,
94
- ]
95
- };
96
- }
97
- }
98
- OAuthModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: OAuthModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
99
- OAuthModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.0.4", ngImport: i0, type: OAuthModule, declarations: [OAuthLoginComponent], imports: [CommonModule,
100
- FormsModule,
101
- HttpClientModule,
102
- RouterModule], exports: [OAuthLoginComponent] });
103
- OAuthModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: OAuthModule, imports: [CommonModule,
104
- FormsModule,
105
- HttpClientModule,
106
- RouterModule] });
107
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: OAuthModule, decorators: [{
108
- type: NgModule,
109
- args: [{
110
- imports: [
111
- CommonModule,
112
- FormsModule,
113
- HttpClientModule,
114
- RouterModule,
115
- ],
116
- declarations: [OAuthLoginComponent],
117
- exports: [OAuthLoginComponent]
118
- }]
119
- }] });
120
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2F1dGgubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcHJvamVjdHMvbmd4LW9hdXRoL3NyYy9vYXV0aC5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFzQixRQUFRLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNuRixPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUFDLGlCQUFpQixFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsZ0JBQWdCLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRyxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDN0MsT0FBTyxFQUFDLFFBQVEsRUFBRSxpQkFBaUIsRUFBZSx5QkFBeUIsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUNoSSxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFDdEQsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sMENBQTBDLENBQUM7QUFDN0UsT0FBTyxFQUFDLFlBQVksRUFBRSxpQkFBaUIsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQ2hFLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLDhCQUE4QixDQUFDO0FBQzlELE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLDBCQUEwQixDQUFDOztBQUUzRCxNQUFNLFlBQVksR0FBRyxDQUFDLFVBQWtCLEVBQUUsVUFBa0IsRUFBWSxFQUFFO0lBQ3hFLE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDLFVBQVUsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsVUFBVSxHQUFHLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0lBQ2xHLE1BQU0sRUFBQyxJQUFJLEVBQUUsTUFBTSxF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O0lBQ0osQ0FBQzs7d0dBbEJVLFdBQVc7eUdBQVgsV0FBVyxpQkFIUCxtQkFBbUIsYUFMaEMsWUFBWTtRQUNaLFdBQVc7UUFDWCxnQkFBZ0I7UUFDaEIsWUFBWSxhQUdKLG1CQUFtQjt5R0FFbEIsV0FBVyxZQVJwQixZQUFZO1FBQ1osV0FBVztRQUNYLGdCQUFnQjtRQUNoQixZQUFZOzJGQUtILFdBQVc7a0JBVnZCLFFBQVE7bUJBQUM7b0JBQ1IsT0FBTyxFQUFFO3dCQUNQLFlBQVk7d0JBQ1osV0FBVzt3QkFDWCxnQkFBZ0I7d0JBQ2hCLFlBQVk7cUJBQ2I7b0JBQ0QsWUFBWSxFQUFFLENBQUMsbUJBQW1CLENBQUM7b0JBQ25DLE9BQU8sRUFBRSxDQUFDLG1CQUFtQixDQUFDO2lCQUMvQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7TW9kdWxlV2l0aFByb3ZpZGVycywgTmdNb2R1bGUsIE9wdGlvbmFsLCBQTEFURk9STV9JRH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0Zvcm1zTW9kdWxlfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge0hUVFBfSU5URVJDRVBUT1JTLCBIdHRwQmFja2VuZCwgSHR0cENsaWVudCwgSHR0cENsaWVudE1vZHVsZX0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHtSb3V0ZXJNb2R1bGV9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQge0xPQ0FUSU9OLCBPQVVUSF9IVFRQX0NMSUVOVCwgT0F1dGhDb25maWcsIHByb3ZpZGVPQXV0aENvbmZpZ0ZhY3RvcnksIFNFUlZFUl9IT1NULCBTRVJWRVJfUEFUSCwgU1RPUkFHRX0gZnJvbSAnLi9tb2RlbHMnO1xuaW1wb3J0IHtPQXV0aFNlcnZpY2V9IGZyb20gJy4vc2VydmljZXMvb2F1dGguc2VydmljZSc7XG5pbXBvcnQge09BdXRoTG9naW5Db21wb25lbnR9IGZyb20gJy4vY29tcG9uZW50cy9sb2dpbi9vYXV0aC1sb2dpbi5jb21wb25lbnQnO1xuaW1wb3J0IHtDb21tb25Nb2R1bGUsIGlzUGxhdGZvcm1Ccm93c2VyfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtPQXV0aEludGVyY2VwdG9yfSBmcm9tICcuL3NlcnZpY2VzL29hdXRoLmludGVyY2VwdG9yJztcbmltcG9ydCB7T0F1dGhUb2tlblNlcnZpY2V9IGZyb20gJy4vc2VydmljZXMvdG9rZW4uc2VydmljZSc7XG5cbmNvbnN0IG1vY2tMb2NhdGlvbiA9IChzZXJ2ZXJIb3N0OiBzdHJpbmcsIHNlcnZlclBhdGg6IHN0cmluZyk6IExvY2F0aW9uID0+IHtcbiAgY29uc3QgdXJsID0gbmV3IFVSTChzZXJ2ZXJIb3N0ICYmIHNlcnZlclBhdGggPyBgJHtzZXJ2ZXJIb3N0fSR7c2VydmVyUGF0aH1gIDogJ2h0dHA6Ly9sb2NhbGhvc3QnKTtcbiAgY29uc3Qge2hyZWYsIG9yaWdpbiwgcHJvdG9jb2wsIGhvc3QsIGhvc3RuYW1lLCBwb3J0LCBwYXRobmFtZSwgc2VhcmNoLCBoYXNofSA9IHVybDtcbiAgcmV0dXJuIHtcbiAgICBocmVmLCBvcmlnaW4sIHByb3RvY29sLCBob3N0LCBob3N0bmFtZSwgcG9ydCwgcGF0aG5hbWUsIHNlYXJjaCwgaGFzaCxcbiAgICByZWxvYWQoKSB7XG4gICAgfSxcbiAgICBhc3NpZ24oXzogc3RyaW5nKSB7XG4gICAgfSxcbiAgICBhbmNlc3Rvck9yaWdpbnM6IHt9IGFzIGFueSxcbiAgICByZXBsYWNlKF86IHN0cmluZykge1xuICAgIH1cbiAgfTtcbn07XG5cbmNvbnN0IExvY2F0aW9uU2VydmljZSA9IHtcbiAgcHJvdmlkZTogTE9DQVRJT04sXG4gIHVzZUZhY3RvcnkocGxhdGZvcm1JZDogT2JqZWN0LCBzZXJ2ZXJIb3N0OiBzdHJpbmcsIHNlcnZlclBhdGg6IHN0cmluZykge1xuICAgIHJldHVybiBpc1BsYXRmb3JtQnJvd3NlcihwbGF0Zm9ybUlkKSA/IGxvY2F0aW9uIDogbW9ja0xvY2F0aW9uKHNlcnZlckhvc3QsIHNlcnZlclBhdGgpO1xuICB9LFxuICBkZXBzOiBbXG4gICAgUExBVEZPUk1fSUQsXG4gICAgW25ldyBPcHRpb25hbCgpLCBTRVJWRVJfSE9TVF0sXG4gICAgW25ldyBPcHRpb25hbCgpLCBTRVJWRVJfUEFUSF1cbiAgXVxufTtcblxuY29uc3QgbW9ja1N0b3JhZ2U6IFN0b3JhZ2UgPSB7XG4gIGNsZWFyKCkge1xuICB9LFxuICBnZXRJdGVtKGtleTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH0sXG4gIGtleShpbmRleDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH0sXG4gIHJlbW92ZUl0ZW0oa2V5OiBzdHJpbmcpIHtcbiAgfSxcbiAgc2V0SXRlbShrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZykge1xuICB9LFxuICBsZW5ndGg6IDBcbn07XG5cbmNvbnN0IFN0b3JhZ2VTZXJ2aWNlID0ge1xuICBwcm92aWRlOiBTVE9SQUdFLFxuICB1c2VGYWN0b3J5KHBsYXRmb3JtSWQ6IE9iamVjdCkge1xuICAgIHJldHVybiBpc1BsYXRmb3JtQnJvd3NlcihwbGF0Zm9ybUlkKSA/IGxvY2FsU3RvcmFnZSA6IG1vY2tTdG9yYWdlO1xuICB9LFxuICBkZXBzOiBbUExBVEZPUk1fSURdXG59O1xuXG5jb25zdCBPQXV0aEh0dHBDbGllbnQgPSB7XG4gIHByb3ZpZGU6IE9BVVRIX0hUVFBfQ0xJRU5ULFxuICB1c2VGYWN0b3J5KGh0dHBCYWNrZW5kOiBIdHRwQmFja2VuZCkge1xuICAgIC8vIGF2b2lkIGh0dHAgaW50ZXJjZXB0b3JzXG4gICAgcmV0dXJuIG5ldyBIdHRwQ2xpZW50KGh0dHBCYWNrZW5kKTtcbiAgfSxcbiAgZGVwczogW0h0dHBCYWNrZW5kXVxufTtcblxuY29uc3QgT0F1dGhJbnRlcmNlcHRvclNlcnZpY2UgPSB7XG4gIHByb3ZpZGU6IEhUVFBfSU5URVJDRVBUT1JTLFxuICB1c2VDbGFzczogT0F1dGhJbnRlcmNlcHRvcixcbiAgbXVsdGk6IHRydWUsXG59O1xuXG5jb25zdCBkZWZhdWx0Q29uZmlnID0gKHN0b3JhZ2U6IFN0b3JhZ2UpID0+IHtcbiAgcmV0dXJuIHtcbiAgICBzdG9yYWdlLFxuICAgIHN0b3JhZ2VLZXk6ICd0b2tlbicsXG4gICAgaWdub3JlUGF0aHM6IFtdXG4gIH07XG59O1xuXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIEZvcm1zTW9kdWxlLFxuICAgIEh0dHBDbGllbnRNb2R1bGUsXG4gICAgUm91dGVyTW9kdWxlLFxuICBdLFxuICBkZWNsYXJhdGlvbnM6IFtPQXV0aExvZ2luQ29tcG9uZW50XSxcbiAgZXhwb3J0czogW09BdXRoTG9naW5Db21wb25lbnRdXG59KVxuZXhwb3J0IGNsYXNzIE9BdXRoTW9kdWxlIHtcblxuICBzdGF0aWMgZm9yUm9vdChjb25maWc6IE9BdXRoQ29uZmlnID0ge30pOiBNb2R1bGVXaXRoUHJvdmlkZXJzPE9BdXRoTW9kdWxlPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5nTW9kdWxlOiBPQXV0aE1vZHVsZSxcbiAgICAgIHByb3ZpZGVyczogW1xuICAgICAgICBMb2NhdGlvblNlcnZpY2UsXG4gICAgICAgIFN0b3JhZ2VTZXJ2aWNlLFxuICAgICAgICBPQXV0aEh0dHBDbGllbnQsXG4gICAgICAgIHByb3ZpZGVPQXV0aENvbmZpZ0ZhY3RvcnkoKHN0b3JhZ2U6IFN0b3JhZ2UpID0+ICh7XG4gICAgICAgICAgLi4uZGVmYXVsdENvbmZpZyhzdG9yYWdlKSxcbiAgICAgICAgICAuLi5jb25maWdcbiAgICAgICAgfSksIFtTVE9SQUdFXSksXG4gICAgICAgIE9BdXRoVG9rZW5TZXJ2aWNlLFxuICAgICAgICBPQXV0aEludGVyY2VwdG9yU2VydmljZSxcbiAgICAgICAgT0F1dGhTZXJ2aWNlLFxuICAgICAgXVxuICAgIH07XG4gIH1cbn1cbiJdfQ==
@@ -1,53 +0,0 @@
1
- import { Injectable } from '@angular/core';
2
- import { switchMap, take, throwError } from 'rxjs';
3
- import { catchError, map } from 'rxjs/operators';
4
- import * as i0 from "@angular/core";
5
- import * as i1 from "./token.service";
6
- import * as i2 from "../models";
7
- export class OAuthInterceptor {
8
- constructor(tokenService, authConfig) {
9
- this.tokenService = tokenService;
10
- this.authConfig = authConfig;
11
- }
12
- intercept(req, next) {
13
- return this.isPathExcepted(req) && next.handle(req) || this.tokenService.token$.pipe(take(1), map(token => {
14
- if (token?.access_token) {
15
- req = req.clone({
16
- setHeaders: {
17
- Authorization: `${token.token_type} ${token.access_token}`
18
- }
19
- });
20
- }
21
- return req;
22
- }), switchMap(req => next.handle(req)), catchError((err) => {
23
- if (err.status === 401) {
24
- this.tokenService.token = {
25
- error: `${err.status}`,
26
- error_description: err.message
27
- };
28
- }
29
- return throwError(() => err);
30
- }));
31
- }
32
- isPathExcepted(req) {
33
- const { ignorePaths } = this.authConfig || {};
34
- if (ignorePaths) {
35
- for (const ignorePath of ignorePaths) {
36
- try {
37
- if (req.url.match(ignorePath)) {
38
- return true;
39
- }
40
- }
41
- catch (err) {
42
- }
43
- }
44
- }
45
- return false;
46
- }
47
- }
48
- OAuthInterceptor.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: OAuthInterceptor, deps: [{ token: i1.OAuthTokenService }, { token: i2.OAuthConfig }], target: i0.ɵɵFactoryTarget.Injectable });
49
- OAuthInterceptor.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: OAuthInterceptor });
50
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: OAuthInterceptor, decorators: [{
51
- type: Injectable
52
- }], ctorParameters: function () { return [{ type: i1.OAuthTokenService }, { type: i2.OAuthConfig }]; } });
53
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2F1dGguaW50ZXJjZXB0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtb2F1dGgvc3JjL3NlcnZpY2VzL29hdXRoLmludGVyY2VwdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFFekMsT0FBTyxFQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQ2pELE9BQU8sRUFBQyxVQUFVLEVBQUUsR0FBRyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7Ozs7QUFLL0MsTUFBTSxPQUFPLGdCQUFnQjtJQUUzQixZQUFzQixZQUErQixFQUMvQixVQUF1QjtRQUR2QixpQkFBWSxHQUFaLFlBQVksQ0FBbUI7UUFDL0IsZUFBVSxHQUFWLFVBQVUsQ0FBYTtJQUM3QyxDQUFDO0lBRUQsU0FBUyxDQUFDLEdBQXFCLEVBQUUsSUFBaUI7UUFDaEQsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUNsRixJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQ1AsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ1YsSUFBSSxLQUFLLEVBQUUsWUFBWSxFQUFFO2dCQUN2QixHQUFHLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQztvQkFDZCxVQUFVLEVBQUU7d0JBQ1YsYUFBYSxFQUFFLEdBQUcsS0FBSyxDQUFDLFVBQVUsSUFBSSxLQUFLLENBQUMsWUFBWSxFQUFFO3FCQUMzRDtpQkFDRixDQUFDLENBQUM7YUFDSjtZQUNELE9BQU8sR0FBRyxDQUFDO1FBQ2IsQ0FBQyxDQUFDLEVBQ0YsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUNsQyxVQUFVLENBQUMsQ0FBQyxHQUFzQixFQUFFLEVBQUU7WUFDcEMsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLEdBQUcsRUFBRTtnQkFDdEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEdBQUc7b0JBQ3hCLEtBQUssRUFBRSxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUU7b0JBQ3RCLGlCQUFpQixFQUFFLEdBQUcsQ0FBQyxPQUFPO2lCQUMvQixDQUFDO2FBQ0g7WUFDRCxPQUFPLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMvQixDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQztJQUVPLGNBQWMsQ0FBQyxHQUFxQjtRQUMxQyxNQUFNLEVBQUMsV0FBVyxFQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsSUFBSSxFQUFFLENBQUM7UUFDNUMsSUFBSSxXQUFXLEVBQUU7WUFDZixLQUFLLE1BQU0sVUFBVSxJQUFJLFdBQVcsRUFBRTtnQkFDcEMsSUFBSTtvQkFDRixJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxFQUFFO3dCQUM3QixPQUFPLElBQUksQ0FBQztxQkFDYjtpQkFDRjtnQkFBQyxPQUFPLEdBQUcsRUFBRTtpQkFDYjthQUNGO1NBQ0Y7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7OzZHQTdDVSxnQkFBZ0I7aUhBQWhCLGdCQUFnQjsyRkFBaEIsZ0JBQWdCO2tCQUQ1QixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtJbmplY3RhYmxlfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7SHR0cEVycm9yUmVzcG9uc2UsIEh0dHBIYW5kbGVyLCBIdHRwSW50ZXJjZXB0b3IsIEh0dHBSZXF1ZXN0fSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQge3N3aXRjaE1hcCwgdGFrZSwgdGhyb3dFcnJvcn0gZnJvbSAncnhqcyc7XG5pbXBvcnQge2NhdGNoRXJyb3IsIG1hcH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtPQXV0aENvbmZpZ30gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7T0F1dGhUb2tlblNlcnZpY2V9IGZyb20gJy4vdG9rZW4uc2VydmljZSc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBPQXV0aEludGVyY2VwdG9yIGltcGxlbWVudHMgSHR0cEludGVyY2VwdG9yIHtcblxuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgdG9rZW5TZXJ2aWNlOiBPQXV0aFRva2VuU2VydmljZSxcbiAgICAgICAgICAgICAgcHJvdGVjdGVkIGF1dGhDb25maWc6IE9BdXRoQ29uZmlnKSB7XG4gIH1cblxuICBpbnRlcmNlcHQocmVxOiBIdHRwUmVxdWVzdDxhbnk+LCBuZXh0OiBIdHRwSGFuZGxlcikge1xuICAgIHJldHVybiB0aGlzLmlzUGF0aEV4Y2VwdGVkKHJlcSkgJiYgbmV4dC5oYW5kbGUocmVxKSB8fCB0aGlzLnRva2VuU2VydmljZS50b2tlbiQucGlwZShcbiAgICAgIHRha2UoMSksXG4gICAgICBtYXAodG9rZW4gPT4ge1xuICAgICAgICBpZiAodG9rZW4/LmFjY2Vzc190b2tlbikge1xuICAgICAgICAgIHJlcSA9IHJlcS5jbG9uZSh7XG4gICAgICAgICAgICBzZXRIZWFkZXJzOiB7XG4gICAgICAgICAgICAgIEF1dGhvcml6YXRpb246IGAke3Rva2VuLnRva2VuX3R5cGV9ICR7dG9rZW4uYWNjZXNzX3Rva2VufWBcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVxO1xuICAgICAgfSksXG4gICAgICBzd2l0Y2hNYXAocmVxID0+IG5leHQuaGFuZGxlKHJlcSkpLFxuICAgICAgY2F0Y2hFcnJvcigoZXJyOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4ge1xuICAgICAgICBpZiAoZXJyLnN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgdGhpcy50b2tlblNlcnZpY2UudG9rZW4gPSB7XG4gICAgICAgICAgICBlcnJvcjogYCR7ZXJyLnN0YXR1c31gLFxuICAgICAgICAgICAgZXJyb3JfZGVzY3JpcHRpb246IGVyci5tZXNzYWdlXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBlcnIpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBpc1BhdGhFeGNlcHRlZChyZXE6IEh0dHBSZXF1ZXN0PGFueT4pIHtcbiAgICBjb25zdCB7aWdub3JlUGF0aHN9ID0gdGhpcy5hdXRoQ29uZmlnIHx8IHt9O1xuICAgIGlmIChpZ25vcmVQYXRocykge1xuICAgICAgZm9yIChjb25zdCBpZ25vcmVQYXRoIG9mIGlnbm9yZVBhdGhzKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKHJlcS51cmwubWF0Y2goaWdub3JlUGF0aCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG4iXX0=
@@ -1,300 +0,0 @@
1
- import { Inject, Injectable } from '@angular/core';
2
- import { HttpParams } from '@angular/common/http';
3
- import { catchError, concatMap, delay, filter, map, shareReplay, switchMap, tap } from 'rxjs/operators';
4
- import { firstValueFrom, from, noop, of, ReplaySubject, throwError } from 'rxjs';
5
- import { HEADER_APPLICATION, LOCATION, OAuthStatus, OAuthType } from '../models';
6
- import * as i0 from "@angular/core";
7
- import * as i1 from "../models";
8
- import * as i2 from "./token.service";
9
- import * as i3 from "@angular/common/http";
10
- import * as i4 from "@angular/common";
11
- const arrToString = (buf) => buf.reduce((s, b) => s + String.fromCharCode(b), '');
12
- const base64url = (str) => btoa(str)
13
- .replace(/\+/g, '-')
14
- .replace(/\//g, '_')
15
- .replace(/=/g, '');
16
- const randomString = (length = 48) => {
17
- const buff = arrToString(crypto.getRandomValues(new Uint8Array(length * 2)));
18
- return base64url(buff).substring(0, length);
19
- };
20
- const pkce = async (value) => {
21
- const buff = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(value));
22
- return base64url(arrToString(new Uint8Array(buff)));
23
- };
24
- const parseOauthUri = (hash) => {
25
- const regex = /([^&=]+)=([^&]*)/g;
26
- const params = {};
27
- let m;
28
- // tslint:disable-next-line:no-conditional-assignment
29
- while ((m = regex.exec(hash)) !== null) {
30
- params[decodeURIComponent(m[1])] = decodeURIComponent(m[2]);
31
- }
32
- return Object.keys(params).length && params || {};
33
- };
34
- const jwt = (token) => JSON.parse(atob(token.split('.')[1]));
35
- export class OAuthService {
36
- constructor(authConfig, tokenService, http, location, locationService) {
37
- this.authConfig = authConfig;
38
- this.tokenService = tokenService;
39
- this.http = http;
40
- this.location = location;
41
- this.locationService = locationService;
42
- this.state$ = new ReplaySubject(1);
43
- this.config$ = of(this.config).pipe(filter(Boolean), filter(config => !!config?.clientId), map(config => config), switchMap(config => !config.issuerPath && of(config) || this.http.get(`${config.issuerPath}/.well-known/openid-configuration`).pipe(tap(v => this.config = {
44
- ...v.authorization_endpoint && { authorizePath: v.authorization_endpoint } || {},
45
- ...v.token_endpoint && { tokenPath: v.token_endpoint } || {},
46
- ...v.revocation_endpoint && { revokePath: v.revocation_endpoint } || {},
47
- ...v.code_challenge_methods_supported && { pkce: v.code_challenge_methods_supported.indexOf('S256') > -1 } || {},
48
- ...v.userinfo_endpoint && { userPath: v.userinfo_endpoint } || {},
49
- ...v.introspection_endpoint && { introspectionPath: v.introspection_endpoint } || {},
50
- ...v.end_session_endpoint && { logoutPath: v.end_session_endpoint } || {},
51
- ...{ scope: config.scope || 'openid' }
52
- }), map(() => this.config))), shareReplay(1));
53
- this.token$ = this.config$.pipe(tap(config => {
54
- const { hash, search, origin, pathname } = this.location;
55
- const isImplicitRedirect = hash && /(access_token=)|(error=)/.test(hash);
56
- const isAuthCodeRedirect = search && /(code=)|(error=)/.test(search) || hash && /(code=)|(error=)/.test(hash);
57
- if (isImplicitRedirect) {
58
- const parameters = parseOauthUri(hash.substring(1));
59
- this.token = {
60
- ...parameters,
61
- type: OAuthType.IMPLICIT,
62
- };
63
- this.checkResponse(this.token, parameters);
64
- }
65
- else if (isAuthCodeRedirect) {
66
- const parameters = parseOauthUri(search && search.substring(1) || hash && hash.substring(1));
67
- if (!this.checkResponse(this.token, parameters)) {
68
- this.token = parameters;
69
- }
70
- else {
71
- const newParametersString = this.getCleanedUnSearchParameters();
72
- const { clientId, clientSecret, tokenPath, scope } = config;
73
- const { codeVerifier } = this.token || {}; //should be set by authorizationUrl construction
74
- this.http.post(tokenPath, new HttpParams({
75
- fromObject: {
76
- code: parameters?.['code'],
77
- client_id: clientId,
78
- ...clientSecret && { client_secret: clientSecret } || {},
79
- redirect_uri: `${origin}${pathname}`,
80
- grant_type: 'authorization_code',
81
- ...scope && { scope } || {},
82
- ...codeVerifier && { code_verifier: codeVerifier } || {}
83
- }
84
- }), { headers: HEADER_APPLICATION }).pipe().subscribe(token => {
85
- this.token = {
86
- ...token,
87
- type: OAuthType.AUTHORIZATION_CODE
88
- };
89
- this.locationService.replaceState(`${pathname}${newParametersString}`);
90
- });
91
- }
92
- }
93
- }), switchMap(() => this.tokenService.token$), shareReplay(1));
94
- this.status$ = this.token$.pipe(map(token => token.access_token && OAuthStatus.AUTHORIZED || token.error && OAuthStatus.DENIED || OAuthStatus.NOT_AUTHORIZED), shareReplay(1));
95
- this.userInfo$ = this.status$.pipe(filter(s => s === OAuthStatus.AUTHORIZED), map(() => this.config.userPath), filter(Boolean), switchMap(path => this.getUserInfo(path)), shareReplay(1));
96
- this.type$ = this.tokenService.type$;
97
- this.ignorePaths = this.authConfig.ignorePaths || [];
98
- }
99
- get storageKey() {
100
- return this.authConfig.storageKey;
101
- }
102
- set storageKey(storageKey) {
103
- if (storageKey) {
104
- this.authConfig.storageKey = storageKey;
105
- this.tokenService.token = this.tokenService.saved;
106
- }
107
- }
108
- get token() {
109
- return this.tokenService.token;
110
- }
111
- set token(token) {
112
- this.tokenService.token = token;
113
- }
114
- get config() {
115
- return this.authConfig.config;
116
- }
117
- set config(config) {
118
- if (config) {
119
- this.authConfig.config = {
120
- ...this.authConfig.config,
121
- ...config
122
- };
123
- }
124
- }
125
- async login(parameters) {
126
- if (!!parameters && parameters.password) {
127
- await this.resourceLogin(parameters);
128
- }
129
- else if (!!parameters && parameters.redirectUri && parameters.responseType) {
130
- await this.toAuthorizationUrl(parameters);
131
- }
132
- else {
133
- await this.clientCredentialLogin();
134
- }
135
- }
136
- logout(useLogoutUrl) {
137
- this.revoke();
138
- this.token = {};
139
- const { logoutPath, logoutRedirectUri } = this.authConfig.config;
140
- if (useLogoutUrl && logoutPath) {
141
- const { origin, pathname } = this.location;
142
- const currentPath = `${origin}${pathname}`;
143
- this.location.replace(`${logoutPath}?post_logout_redirect_uri=${logoutRedirectUri || currentPath}`);
144
- }
145
- }
146
- getUserInfo(path) {
147
- const { userPath } = this.config;
148
- return this.http.get(path || userPath);
149
- }
150
- revoke() {
151
- const { revokePath, clientId, clientSecret } = this.authConfig.config;
152
- if (revokePath) {
153
- const { access_token, refresh_token } = this.token || {};
154
- const toRevoke = [];
155
- if (access_token) {
156
- toRevoke.push({
157
- ...clientId && { client_id: clientId } || {},
158
- ...clientSecret && { client_secret: clientSecret } || {},
159
- token: access_token,
160
- token_type_hint: 'access_token'
161
- });
162
- }
163
- if (refresh_token) {
164
- toRevoke.push({
165
- ...clientId && { client_id: clientId } || {},
166
- ...clientSecret && { client_secret: clientSecret } || {},
167
- token: refresh_token,
168
- token_type_hint: 'refresh_token'
169
- });
170
- }
171
- from(toRevoke).pipe(concatMap(o => of(o).pipe(delay(300))), // space request to avoid cancellation
172
- switchMap(o => this.http.post(revokePath, new HttpParams({ fromObject: o })))).subscribe(noop);
173
- }
174
- }
175
- clientCredentialLogin() {
176
- const { clientId, clientSecret, tokenPath, scope } = this.authConfig.config;
177
- return firstValueFrom(this.http.post(tokenPath, new HttpParams({
178
- fromObject: {
179
- client_id: clientId,
180
- client_secret: clientSecret,
181
- grant_type: OAuthType.CLIENT_CREDENTIAL,
182
- ...scope ? { scope } : {},
183
- }
184
- }), { headers: HEADER_APPLICATION }).pipe(catchError((err) => {
185
- this.token = err;
186
- return throwError(() => err);
187
- }), tap(params => {
188
- this.token = {
189
- ...params,
190
- type: OAuthType.CLIENT_CREDENTIAL,
191
- };
192
- })));
193
- }
194
- resourceLogin(parameters) {
195
- const { clientId, clientSecret, tokenPath, scope } = this.authConfig.config;
196
- const { username, password } = parameters;
197
- return firstValueFrom(this.http.post(tokenPath, new HttpParams({
198
- fromObject: {
199
- client_id: clientId,
200
- ...clientSecret && { client_secret: clientSecret } || {},
201
- grant_type: OAuthType.RESOURCE,
202
- ...scope && { scope } || {},
203
- username,
204
- password
205
- }
206
- }), { headers: HEADER_APPLICATION }).pipe(catchError(err => {
207
- this.token = err;
208
- return throwError(() => err);
209
- }), tap(params => {
210
- this.token = {
211
- ...params,
212
- type: OAuthType.RESOURCE,
213
- };
214
- })));
215
- }
216
- async toAuthorizationUrl(parameters) {
217
- const { config } = this.authConfig;
218
- let authorizationUrl = `${config.authorizePath}`;
219
- authorizationUrl += config.authorizePath.includes('?') && '&' || '?';
220
- authorizationUrl += `client_id=${config.clientId}`;
221
- authorizationUrl += `&redirect_uri=${encodeURIComponent(parameters.redirectUri)}`;
222
- authorizationUrl += `&response_type=${parameters.responseType}`;
223
- authorizationUrl += `&scope=${encodeURIComponent(config.scope || '')}`;
224
- authorizationUrl += `&state=${encodeURIComponent(parameters.state || '')}`;
225
- return this.location.replace(`${authorizationUrl}${this.generateNonce(config)}${await this.generateCodeChallenge(config)}`);
226
- }
227
- async generateCodeChallenge(config) {
228
- if (config.pkce) {
229
- const codeVerifier = randomString();
230
- this.token = { ...this.token, codeVerifier };
231
- return `&code_challenge=${await pkce(codeVerifier)}&code_challenge_method=S256`;
232
- }
233
- return '';
234
- }
235
- generateNonce(config) {
236
- if (config && config.scope && config.scope.indexOf('openid') > -1) {
237
- const nonce = randomString(10);
238
- this.token = { ...this.token, nonce };
239
- return `&nonce=${nonce}`;
240
- }
241
- return '';
242
- }
243
- checkResponse(token, parameters) {
244
- this.emitState(parameters);
245
- this.cleanLocationHash();
246
- if (!parameters || parameters['error']) {
247
- return false;
248
- }
249
- if (token && token.nonce && parameters['access_token']) {
250
- const jwtToken = jwt(parameters['access_token']);
251
- return token.nonce === jwtToken.nonce;
252
- }
253
- return parameters['access_token'] || parameters['code'];
254
- }
255
- getCleanedUnSearchParameters() {
256
- const { search } = this.location;
257
- let searchString = search && search.substring(1) || '';
258
- const hashKeys = ['code', 'state', 'error', 'error_description', 'session_state', 'scope', 'authuser', 'prompt'];
259
- hashKeys.forEach(hashKey => {
260
- const re = new RegExp('&' + hashKey + '(=[^&]*)?|^' + hashKey + '(=[^&]*)?&?');
261
- searchString = searchString.replace(re, '');
262
- });
263
- return searchString.length && `?${searchString}` || '';
264
- }
265
- cleanLocationHash() {
266
- const { hash } = this.location;
267
- let curHash = hash && hash.substring(1) || '';
268
- const hashKeys = [
269
- 'access_token',
270
- 'token_type',
271
- 'expires_in',
272
- 'scope',
273
- 'state',
274
- 'error',
275
- 'error_description',
276
- 'session_state',
277
- 'nonce',
278
- 'id_token',
279
- 'code'
280
- ];
281
- hashKeys.forEach(hashKey => {
282
- const re = new RegExp('&' + hashKey + '(=[^&]*)?|^' + hashKey + '(=[^&]*)?&?');
283
- curHash = curHash.replace(re, '');
284
- });
285
- this.location.hash = curHash;
286
- }
287
- emitState(parameters) {
288
- const { state } = parameters || {};
289
- state && this.state$.next(state);
290
- }
291
- }
292
- OAuthService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: OAuthService, deps: [{ token: i1.OAuthConfig }, { token: i2.OAuthTokenService }, { token: i3.HttpClient }, { token: LOCATION }, { token: i4.Location }], target: i0.ɵɵFactoryTarget.Injectable });
293
- OAuthService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: OAuthService });
294
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: OAuthService, decorators: [{
295
- type: Injectable
296
- }], ctorParameters: function () { return [{ type: i1.OAuthConfig }, { type: i2.OAuthTokenService }, { type: i3.HttpClient }, { type: Location, decorators: [{
297
- type: Inject,
298
- args: [LOCATION]
299
- }] }, { type: i4.Location }]; } });
300
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2F1dGguc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1vYXV0aC9zcmMvc2VydmljZXMvb2F1dGguc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsTUFBTSxFQUFFLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNqRCxPQUFPLEVBQWEsVUFBVSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDNUQsT0FBTyxFQUFDLFVBQVUsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0RyxPQUFPLEVBQUMsY0FBYyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLGFBQWEsRUFBRSxVQUFVLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDL0UsT0FBTyxFQUdMLGtCQUFrQixFQUNsQixRQUFRLEVBR1IsV0FBVyxFQUVYLFNBQVMsRUFNVixNQUFNLFdBQVcsQ0FBQzs7Ozs7O0FBSW5CLE1BQU0sV0FBVyxHQUFHLENBQUMsR0FBZSxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFFOUYsTUFBTSxTQUFTLEdBQUcsQ0FBQyxHQUFXLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7S0FDekMsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUM7S0FDbkIsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUM7S0FDbkIsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztBQUVyQixNQUFNLFlBQVksR0FBRyxDQUFDLFNBQWlC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SSxFQUFFLENBQUM7UUFDakMsS0FBSyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ25DLENBQUM7O3lHQWhUVSxZQUFZLHdHQW1ISCxRQUFROzZHQW5IakIsWUFBWTsyRkFBWixZQUFZO2tCQUR4QixVQUFVOzswQkFvSEksTUFBTTsyQkFBQyxRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtJbmplY3QsIEluamVjdGFibGV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtIdHRwQ2xpZW50LCBIdHRwUGFyYW1zfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQge2NhdGNoRXJyb3IsIGNvbmNhdE1hcCwgZGVsYXksIGZpbHRlciwgbWFwLCBzaGFyZVJlcGxheSwgc3dpdGNoTWFwLCB0YXB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7Zmlyc3RWYWx1ZUZyb20sIGZyb20sIG5vb3AsIG9mLCBSZXBsYXlTdWJqZWN0LCB0aHJvd0Vycm9yfSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIEF1dGhvcml6YXRpb25Db2RlQ29uZmlnLFxuICBBdXRob3JpemF0aW9uUGFyYW1ldGVycyxcbiAgSEVBREVSX0FQUExJQ0FUSU9OLFxuICBMT0NBVElPTixcbiAgT0F1dGhDb25maWcsXG4gIE9BdXRoUGFyYW1ldGVycyxcbiAgT0F1dGhTdGF0dXMsXG4gIE9BdXRoVG9rZW4sXG4gIE9BdXRoVHlwZSxcbiAgT0F1dGhUeXBlQ29uZmlnLFxuICBPcGVuSWRDb25maWcsXG4gIE9wZW5JZENvbmZpZ3VyYXRpb24sXG4gIFJlc291cmNlUGFyYW1ldGVycyxcbiAgVXNlckluZm9cbn0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7TG9jYXRpb24gYXMgTG9jYXRpb24yfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtPQXV0aFRva2VuU2VydmljZX0gZnJvbSAnLi90b2tlbi5zZXJ2aWNlJztcblxuY29uc3QgYXJyVG9TdHJpbmcgPSAoYnVmOiBVaW50OEFycmF5KSA9PiBidWYucmVkdWNlKChzLCBiKSA9PiBzICsgU3RyaW5nLmZyb21DaGFyQ29kZShiKSwgJycpO1xuXG5jb25zdCBiYXNlNjR1cmwgPSAoc3RyOiBzdHJpbmcpID0+IGJ0b2Eoc3RyKVxuICAucmVwbGFjZSgvXFwrL2csICctJylcbiAgLnJlcGxhY2UoL1xcLy9nLCAnXycpXG4gIC5yZXBsYWNlKC89L2csICcnKTtcblxuY29uc3QgcmFuZG9tU3RyaW5nID0gKGxlbmd0aDogbnVtYmVyID0gNDgpID0+IHtcbiAgY29uc3QgYnVmZiA9IGFyclRvU3RyaW5nKGNyeXB0by5nZXRSYW5kb21WYWx1ZXMobmV3IFVpbnQ4QXJyYXkobGVuZ3RoICogMikpKTtcbiAgcmV0dXJuIGJhc2U2NHVybChidWZmKS5zdWJzdHJpbmcoMCwgbGVuZ3RoKTtcbn07XG5cbmNvbnN0IHBrY2UgPSBhc3luYyAodmFsdWU6IHN0cmluZykgPT4ge1xuICBjb25zdCBidWZmID0gYXdhaXQgY3J5cHRvLnN1YnRsZS5kaWdlc3QoJ1NIQS0yNTYnLCBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUodmFsdWUpKTtcbiAgcmV0dXJuIGJhc2U2NHVybChhcnJUb1N0cmluZyhuZXcgVWludDhBcnJheShidWZmKSkpO1xufTtcblxuY29uc3QgcGFyc2VPYXV0aFVyaSA9IChoYXNoOiBzdHJpbmcpID0+IHtcbiAgY29uc3QgcmVnZXggPSAvKFteJj1dKyk9KFteJl0qKS9nO1xuICBjb25zdCBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgbGV0IG07XG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1jb25kaXRpb25hbC1hc3NpZ25tZW50XG4gIHdoaWxlICgobSA9IHJlZ2V4LmV4ZWMoaGFzaCkpICE9PSBudWxsKSB7XG4gICAgcGFyYW1zW2RlY29kZVVSSUNvbXBvbmVudChtWzFdKV0gPSBkZWNvZGVVUklDb21wb25lbnQobVsyXSk7XG4gIH1cbiAgcmV0dXJuIE9iamVjdC5rZXlzKHBhcmFtcykubGVuZ3RoICYmIHBhcmFtcyB8fCB7fTtcbn07XG5cbmNvbnN0IGp3dCA9ICh0b2tlbjogc3RyaW5nKSA9PiBKU09OLnBhcnNlKGF0b2IodG9rZW4uc3BsaXQoJy4nKVsxXSkpO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgT0F1dGhTZXJ2aWNlIHtcblxuICBzdGF0ZSQgPSBuZXcgUmVwbGF5U3ViamVjdDxzdHJpbmc+KDEpO1xuICBjb25maWckID0gb2YodGhpcy5jb25maWcpLnBpcGUoXG4gICAgZmlsdGVyKEJvb2xlYW4pLFxuICAgIGZpbHRlcihjb25maWcgPT4gISFjb25maWc/LmNsaWVudElkKSxcbiAgICBtYXAoY29uZmlnID0+IGNvbmZpZyBhcyBPcGVuSWRDb25maWcpLFxuICAgIHN3aXRjaE1hcChjb25maWcgPT4gIWNvbmZpZy5pc3N1ZXJQYXRoICYmIG9mKGNvbmZpZykgfHwgdGhpcy5odHRwLmdldDxPcGVuSWRDb25maWd1cmF0aW9uPihgJHtjb25maWcuaXNzdWVyUGF0aH0vLndlbGwta25vd24vb3BlbmlkLWNvbmZpZ3VyYXRpb25gKS5waXBlKFxuICAgICAgdGFwKHYgPT4gdGhpcy5jb25maWcgPSB7XG4gICAgICAgIC4uLnYuYXV0aG9yaXphdGlvbl9lbmRwb2ludCAmJiB7YXV0aG9yaXplUGF0aDogdi5hdXRob3JpemF0aW9uX2VuZHBvaW50fSB8fCB7fSxcbiAgICAgICAgLi4udi50b2tlbl9lbmRwb2ludCAmJiB7dG9rZW5QYXRoOiB2LnRva2VuX2VuZHBvaW50fSB8fCB7fSxcbiAgICAgICAgLi4udi5yZXZvY2F0aW9uX2VuZHBvaW50ICYmIHtyZXZva2VQYXRoOiB2LnJldm9jYXRpb25fZW5kcG9pbnR9IHx8IHt9LFxuICAgICAgICAuLi52LmNvZGVfY2hhbGxlbmdlX21ldGhvZHNfc3VwcG9ydGVkICYmIHtwa2NlOiB2LmNvZGVfY2hhbGxlbmdlX21ldGhvZHNfc3VwcG9ydGVkLmluZGV4T2YoJ1MyNTYnKSA+IC0xfSB8fCB7fSxcbiAgICAgICAgLi4udi51c2VyaW5mb19lbmRwb2ludCAmJiB7dXNlclBhdGg6IHYudXNlcmluZm9fZW5kcG9pbnR9IHx8IHt9LFxuICAgICAgICAuLi52LmludHJvc3BlY3Rpb25fZW5kcG9pbnQgJiYge2ludHJvc3BlY3Rpb25QYXRoOiB2LmludHJvc3BlY3Rpb25fZW5kcG9pbnR9IHx8IHt9LFxuICAgICAgICAuLi52LmVuZF9zZXNzaW9uX2VuZHBvaW50ICYmIHtsb2dvdXRQYXRoOiB2LmVuZF9zZXNzaW9uX2VuZHBvaW50fSB8fCB7fSxcbiAgICAgICAgLi4ue3Njb3BlOiBjb25maWcuc2NvcGUgfHwgJ29wZW5pZCd9XG4gICAgICB9IGFzIGFueSksXG4gICAgICBtYXAoKCkgPT4gdGhpcy5jb25maWcpXG4gICAgKSksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcbiAgdG9rZW4kID0gdGhpcy5jb25maWckLnBpcGUoXG4gICAgdGFwKGNvbmZpZyA9PiB7XG4gICAgICBjb25zdCB7aGFzaCwgc2VhcmNoLCBvcmlnaW4sIHBhdGhuYW1lfSA9IHRoaXMubG9jYXRpb247XG4gICAgICBjb25zdCBpc0ltcGxpY2l0UmVkaXJlY3QgPSBoYXNoICYmIC8oYWNjZXNzX3Rva2VuPSl8KGVycm9yPSkvLnRlc3QoaGFzaCk7XG4gICAgICBjb25zdCBpc0F1dGhDb2RlUmVkaXJlY3QgPSBzZWFyY2ggJiYgLyhjb2RlPSl8KGVycm9yPSkvLnRlc3Qoc2VhcmNoKSB8fCBoYXNoICYmIC8oY29kZT0pfChlcnJvcj0pLy50ZXN0KGhhc2gpO1xuICAgICAgaWYgKGlzSW1wbGljaXRSZWRpcmVjdCkge1xuICAgICAgICBjb25zdCBwYXJhbWV0ZXJzID0gcGFyc2VPYXV0aFVyaShoYXNoLnN1YnN0cmluZygxKSk7XG4gICAgICAgIHRoaXMudG9rZW4gPSB7XG4gICAgICAgICAgLi4ucGFyYW1ldGVycyxcbiAgICAgICAgICB0eXBlOiBPQXV0aFR5cGUuSU1QTElDSVQsXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuY2hlY2tSZXNwb25zZSh0aGlzLnRva2VuLCBwYXJhbWV0ZXJzKTtcbiAgICAgIH0gZWxzZSBpZiAoaXNBdXRoQ29kZVJlZGlyZWN0KSB7XG4gICAgICAgIGNvbnN0IHBhcmFtZXRlcnMgPSBwYXJzZU9hdXRoVXJpKHNlYXJjaCAmJiBzZWFyY2guc3Vic3RyaW5nKDEpIHx8IGhhc2ggJiYgaGFzaC5zdWJzdHJpbmcoMSkpO1xuICAgICAgICBpZiAoIXRoaXMuY2hlY2tSZXNwb25zZSh0aGlzLnRva2VuLCBwYXJhbWV0ZXJzKSkge1xuICAgICAgICAgIHRoaXMudG9rZW4gPSBwYXJhbWV0ZXJzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IG5ld1BhcmFtZXRlcnNTdHJpbmcgPSB0aGlzLmdldENsZWFuZWRVblNlYXJjaFBhcmFtZXRlcnMoKTtcbiAgICAgICAgICBjb25zdCB7Y2xpZW50SWQsIGNsaWVudFNlY3JldCwgdG9rZW5QYXRoLCBzY29wZX0gPSBjb25maWcgYXMgQXV0aG9yaXphdGlvbkNvZGVDb25maWc7XG4gICAgICAgICAgY29uc3Qge2NvZGVWZXJpZmllcn0gPSB0aGlzLnRva2VuIHx8IHt9OyAvL3Nob3VsZCBiZSBzZXQgYnkgYXV0aG9yaXphdGlvblVybCBjb25zdHJ1Y3Rpb25cbiAgICAgICAgICB0aGlzLmh0dHAucG9zdCh0b2tlblBhdGgsIG5ldyBIdHRwUGFyYW1zKHtcbiAgICAgICAgICAgIGZyb21PYmplY3Q6IHtcbiAgICAgICAgICAgICAgY29kZTogcGFyYW1ldGVycz8uWydjb2RlJ10sXG4gICAgICAgICAgICAgIGNsaWVudF9pZDogY2xpZW50SWQsXG4gICAgICAgICAgICAgIC4uLmNsaWVudFNlY3JldCAmJiB7Y2xpZW50X3NlY3JldDogY2xpZW50U2VjcmV0fSB8fCB7fSxcbiAgICAgICAgICAgICAgcmVkaXJlY3RfdXJpOiBgJHtvcmlnaW59JHtwYXRobmFtZX1gLFxuICAgICAgICAgICAgICBncmFudF90eXBlOiAnYXV0aG9yaXphdGlvbl9jb2RlJyxcbiAgICAgICAgICAgICAgLi4uc2NvcGUgJiYge3Njb3BlfSB8fCB7fSxcbiAgICAgICAgICAgICAgLi4uY29kZVZlcmlmaWVyICYmIHtjb2RlX3ZlcmlmaWVyOiBjb2RlVmVyaWZpZXJ9IHx8IHt9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSksIHtoZWFkZXJzOiBIRUFERVJfQVBQTElDQVRJT059KS5waXBlKFxuICAgICAgICAgICkuc3Vic2NyaWJlKHRva2VuID0+IHtcbiAgICAgICAgICAgIHRoaXMudG9rZW4gPSB7XG4gICAgICAgICAgICAgIC4uLnRva2VuLFxuICAgICAgICAgICAgICB0eXBlOiBPQXV0aFR5cGUuQVVUSE9SSVpBVElPTl9DT0RFXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5sb2NhdGlvblNlcnZpY2UucmVwbGFjZVN0YXRlKGAke3BhdGhuYW1lfSR7bmV3UGFyYW1ldGVyc1N0cmluZ31gKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pLFxuICAgIHN3aXRjaE1hcCgoKSA9PiB0aGlzLnRva2VuU2VydmljZS50b2tlbiQpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG4gIHN0YXR1cyQgPSB0aGlzLnRva2VuJC5waXBlKFxuICAgIG1hcCh0b2tlbiA9PiB0b2tlbi5hY2Nlc3NfdG9rZW4gJiYgT0F1dGhTdGF0dXMuQVVUSE9SSVpFRCB8fCB0b2tlbi5lcnJvciAmJiBPQXV0aFN0YXR1cy5ERU5JRUQgfHwgT0F1dGhTdGF0dXMuTk9UX0FVVEhPUklaRUQpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG4gIHVzZXJJbmZvJCA9IHRoaXMuc3RhdHVzJC5waXBlKFxuICAgIGZpbHRlcihzID0+IHMgPT09IE9BdXRoU3RhdHVzLkFVVEhPUklaRUQpLFxuICAgIG1hcCgoKSA9PiAodGhpcy5jb25maWcgYXMgYW55KS51c2VyUGF0aCksXG4gICAgZmlsdGVyKEJvb2xlYW4pLFxuICAgIHN3aXRjaE1hcChwYXRoID0+IHRoaXMuZ2V0VXNlckluZm8ocGF0aCkpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG4gIHR5cGUkID0gdGhpcy50b2tlblNlcnZpY2UudHlwZSQ7XG4gIGlnbm9yZVBhdGhzID0gdGhpcy5hdXRoQ29uZmlnLmlnbm9yZVBhdGhzIHx8IFtdO1xuXG4gIGdldCBzdG9yYWdlS2V5KCkge1xuICAgIHJldHVybiB0aGlzLmF1dGhDb25maWcuc3RvcmFnZUtleTtcbiAgfVxuXG4gIHNldCBzdG9yYWdlS2V5KHN0b3JhZ2VLZXkpIHtcbiAgICBpZiAoc3RvcmFnZUtleSkge1xuICAgICAgdGhpcy5hdXRoQ29uZmlnLnN0b3JhZ2VLZXkgPSBzdG9yYWdlS2V5O1xuICAgICAgdGhpcy50b2tlblNlcnZpY2UudG9rZW4gPSB0aGlzLnRva2VuU2VydmljZS5zYXZlZDtcbiAgICB9XG4gIH1cblxuICBnZXQgdG9rZW4oKSB7XG4gICAgcmV0dXJuIHRoaXMudG9rZW5TZXJ2aWNlLnRva2VuO1xuICB9XG5cbiAgc2V0IHRva2VuKHRva2VuKSB7XG4gICAgdGhpcy50b2tlblNlcnZpY2UudG9rZW4gPSB0b2tlbjtcbiAgfVxuXG4gIGdldCBjb25maWcoKSB7XG4gICAgcmV0dXJuIHRoaXMuYXV0aENvbmZpZy5jb25maWc7XG4gIH1cblxuICBzZXQgY29uZmlnKGNvbmZpZzogT0F1dGhUeXBlQ29uZmlnIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKGNvbmZpZykge1xuICAgICAgdGhpcy5hdXRoQ29uZmlnLmNvbmZpZyA9IHtcbiAgICAgICAgLi4udGhpcy5hdXRoQ29uZmlnLmNvbmZpZyxcbiAgICAgICAgLi4uY29uZmlnXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBhdXRoQ29uZmlnOiBPQXV0aENvbmZpZyxcbiAgICAgICAgICAgICAgcHJvdGVjdGVkIHRva2VuU2VydmljZTogT0F1dGhUb2tlblNlcnZpY2UsXG4gICAgICAgICAgICAgIHByb3RlY3RlZCBodHRwOiBIdHRwQ2xpZW50LFxuICAgICAgICAgICAgICBASW5qZWN0KExPQ0FUSU9OKSBwcm90ZWN0ZWQgbG9jYXRpb246IExvY2F0aW9uLFxuICAgICAgICAgICAgICBwcm90ZWN0ZWQgbG9jYXRpb25TZXJ2aWNlOiBMb2NhdGlvbjIpIHtcbiAgfVxuXG4gIGFzeW5jIGxvZ2luKHBhcmFtZXRlcnM/OiBPQXV0aFBhcmFtZXRlcnMpIHtcbiAgICBpZiAoISFwYXJhbWV0ZXJzICYmIChwYXJhbWV0ZXJzIGFzIFJlc291cmNlUGFyYW1ldGVycykucGFzc3dvcmQpIHtcbiAgICAgIGF3YWl0IHRoaXMucmVzb3VyY2VMb2dpbihwYXJhbWV0ZXJzIGFzIFJlc291cmNlUGFyYW1ldGVycyk7XG4gICAgfSBlbHNlIGlmICghIXBhcmFtZXRlcnMgJiYgKHBhcmFtZXRlcnMgYXMgQXV0aG9yaXphdGlvblBhcmFtZXRlcnMpLnJlZGlyZWN0VXJpICYmIChwYXJhbWV0ZXJzIGFzIEF1dGhvcml6YXRpb25QYXJhbWV0ZXJzKS5yZXNwb25zZVR5cGVcbiAgICApIHtcbiAgICAgIGF3YWl0IHRoaXMudG9BdXRob3JpemF0aW9uVXJsKHBhcmFtZXRlcnMgYXMgQXV0aG9yaXphdGlvblBhcmFtZXRlcnMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCB0aGlzLmNsaWVudENyZWRlbnRpYWxMb2dpbigpO1xuICAgIH1cbiAgfVxuXG4gIGxvZ291dCh1c2VMb2dvdXRVcmw/OiBib29sZWFuKSB7XG4gICAgdGhpcy5yZXZva2UoKTtcbiAgICB0aGlzLnRva2VuID0ge307XG4gICAgY29uc3Qge2xvZ291dFBhdGgsIGxvZ291dFJlZGlyZWN0VXJpfSA9IHRoaXMuYXV0aENvbmZpZy5jb25maWcgYXMgYW55O1xuICAgIGlmICh1c2VMb2dvdXRVcmwgJiYgbG9nb3V0UGF0aCkge1xuICAgICAgY29uc3Qge29yaWdpbiwgcGF0aG5hbWV9ID0gdGhpcy5sb2NhdGlvbjtcbiAgICAgIGNvbnN0IGN1cnJlbnRQYXRoID0gYCR7b3JpZ2lufSR7cGF0aG5hbWV9YDtcbiAgICAgIHRoaXMubG9jYXRpb24ucmVwbGFjZShgJHtsb2dvdXRQYXRofT9wb3N0X2xvZ291dF9yZWRpcmVjdF91cmk9JHtsb2dvdXRSZWRpcmVjdFVyaSB8fCBjdXJyZW50UGF0aH1gKTtcbiAgICB9XG4gIH1cblxuICBnZXRVc2VySW5mbyhwYXRoPzogc3RyaW5nKSB7XG4gICAgY29uc3Qge3VzZXJQYXRofSA9IHRoaXMuY29uZmlnIGFzIGFueTtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxVc2VySW5mbz4ocGF0aCB8fCB1c2VyUGF0aCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmV2b2tlKCkge1xuICAgIGNvbnN0IHtyZXZva2VQYXRoLCBjbGllbnRJZCwgY2xpZW50U2VjcmV0fSA9IHRoaXMuYXV0aENvbmZpZy5jb25maWcgYXMgYW55O1xuICAgIGlmIChyZXZva2VQYXRoKSB7XG4gICAgICBjb25zdCB7YWNjZXNzX3Rva2VuLCByZWZyZXNoX3Rva2VufSA9IHRoaXMudG9rZW4gfHwge307XG4gICAgICBjb25zdCB0b1Jldm9rZSA9IFtdO1xuICAgICAgaWYgKGFjY2Vzc190b2tlbikge1xuICAgICAgICB0b1Jldm9rZS5wdXNoKHtcbiAgICAgICAgICAuLi5jbGllbnRJZCAmJiB7Y2xpZW50X2lkOiBjbGllbnRJZH0gfHwge30sXG4gICAgICAgICAgLi4uY2xpZW50U2VjcmV0ICYmIHtjbGllbnRfc2VjcmV0OiBjbGllbnRTZWNyZXR9IHx8IHt9LFxuICAgICAgICAgIHRva2VuOiBhY2Nlc3NfdG9rZW4sXG4gICAgICAgICAgdG9rZW5fdHlwZV9oaW50OiAnYWNjZXNzX3Rva2VuJ1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChyZWZyZXNoX3Rva2VuKSB7XG4gICAgICAgIHRvUmV2b2tlLnB1c2goe1xuICAgICAgICAgIC4uLmNsaWVudElkICYmIHtjbGllbnRfaWQ6IGNsaWVudElkfSB8fCB7fSxcbiAgICAgICAgICAuLi5jbGllbnRTZWNyZXQgJiYge2NsaWVudF9zZWNyZXQ6IGNsaWVudFNlY3JldH0gfHwge30sXG4gICAgICAgICAgdG9rZW46IHJlZnJlc2hfdG9rZW4sXG4gICAgICAgICAgdG9rZW5fdHlwZV9oaW50OiAncmVmcmVzaF90b2tlbidcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBmcm9tKHRvUmV2b2tlKS5waXBlKFxuICAgICAgICBjb25jYXRNYXAobyA9PiBvZihvKS5waXBlKGRlbGF5KDMwMCkpKSwgLy8gc3BhY2UgcmVxdWVzdCB0byBhdm9pZCBjYW5jZWxsYXRpb25cbiAgICAgICAgc3dpdGNoTWFwKG8gPT4gdGhpcy5odHRwLnBvc3QocmV2b2tlUGF0aCwgbmV3IEh0dHBQYXJhbXMoe2Zyb21PYmplY3Q6IG99KSkpLFxuICAgICAgKS5zdWJzY3JpYmUobm9vcCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGNsaWVudENyZWRlbnRpYWxMb2dpbigpIHtcbiAgICBjb25zdCB7Y2xpZW50SWQsIGNsaWVudFNlY3JldCwgdG9rZW5QYXRoLCBzY29wZX0gPSB0aGlzLmF1dGhDb25maWcuY29uZmlnIGFzIGFueTtcbiAgICByZXR1cm4gZmlyc3RWYWx1ZUZyb20odGhpcy5odHRwLnBvc3QodG9rZW5QYXRoLCBuZXcgSHR0cFBhcmFtcyh7XG4gICAgICBmcm9tT2JqZWN0OiB7XG4gICAgICAgIGNsaWVudF9pZDogY2xpZW50SWQsXG4gICAgICAgIGNsaWVudF9zZWNyZXQ6IGNsaWVudFNlY3JldCxcbiAgICAgICAgZ3JhbnRfdHlwZTogT0F1dGhUeXBlLkNMSUVOVF9DUkVERU5USUFMLFxuICAgICAgICAuLi5zY29wZSA/IHtzY29wZX0gOiB7fSxcbiAgICAgIH1cbiAgICB9KSwge2hlYWRlcnM6IEhFQURFUl9BUFBMSUNBVElPTn0pLnBpcGUoXG4gICAgICBjYXRjaEVycm9yKChlcnIpID0+IHtcbiAgICAgICAgdGhpcy50b2tlbiA9IGVycjtcbiAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gZXJyKTtcbiAgICAgIH0pLFxuICAgICAgdGFwKHBhcmFtcyA9PiB7XG4gICAgICAgIHRoaXMudG9rZW4gPSB7XG4gICAgICAgICAgLi4ucGFyYW1zLFxuICAgICAgICAgIHR5cGU6IE9BdXRoVHlwZS5DTElFTlRfQ1JFREVOVElBTCxcbiAgICAgICAgfTtcbiAgICAgIH0pLFxuICAgICkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlc291cmNlTG9naW4ocGFyYW1ldGVyczogUmVzb3VyY2VQYXJhbWV0ZXJzKSB7XG4gICAgY29uc3Qge2NsaWVudElkLCBjbGllbnRTZWNyZXQsIHRva2VuUGF0aCwgc2NvcGV9ID0gdGhpcy5hdXRoQ29uZmlnLmNvbmZpZyBhcyBhbnk7XG4gICAgY29uc3Qge3VzZXJuYW1lLCBwYXNzd29yZH0gPSBwYXJhbWV0ZXJzO1xuICAgIHJldHVybiBmaXJzdFZhbHVlRnJvbSh0aGlzLmh0dHAucG9zdCh0b2tlblBhdGgsIG5ldyBIdHRwUGFyYW1zKHtcbiAgICAgIGZyb21PYmplY3Q6IHtcbiAgICAgICAgY2xpZW50X2lkOiBjbGllbnRJZCxcbiAgICAgICAgLi4uY2xpZW50U2VjcmV0ICYmIHtjbGllbnRfc2VjcmV0OiBjbGllbnRTZWNyZXR9IHx8IHt9LFxuICAgICAgICBncmFudF90eXBlOiBPQXV0aFR5cGUuUkVTT1VSQ0UsXG4gICAgICAgIC4uLnNjb3BlICYmIHtzY29wZX0gfHwge30sXG4gICAgICAgIHVzZXJuYW1lLFxuICAgICAgICBwYXNzd29yZFxuICAgICAgfVxuICAgIH0pLCB7aGVhZGVyczogSEVBREVSX0FQUExJQ0FUSU9OfSkucGlwZShcbiAgICAgIGNhdGNoRXJyb3IoZXJyID0+IHtcbiAgICAgICAgdGhpcy50b2tlbiA9IGVycjtcbiAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gZXJyKTtcbiAgICAgIH0pLFxuICAgICAgdGFwKHBhcmFtcyA9PiB7XG4gICAgICAgIHRoaXMudG9rZW4gPSB7XG4gICAgICAgICAgLi4ucGFyYW1zLFxuICAgICAgICAgIHR5cGU6IE9BdXRoVHlwZS5SRVNPVVJDRSxcbiAgICAgICAgfTtcbiAgICAgIH0pXG4gICAgKSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgdG9BdXRob3JpemF0aW9uVXJsKHBhcmFtZXRlcnM6IEF1dGhvcml6YXRpb25QYXJhbWV0ZXJzKSB7XG4gICAgY29uc3Qge2NvbmZpZ30gPSB0aGlzLmF1dGhDb25maWcgYXMgYW55O1xuICAgIGxldCBhdXRob3JpemF0aW9uVXJsID0gYCR7Y29uZmlnLmF1dGhvcml6ZVBhdGh9YDtcbiAgICBhdXRob3JpemF0aW9uVXJsICs9IGNvbmZpZy5hdXRob3JpemVQYXRoLmluY2x1ZGVzKCc/JykgJiYgJyYnIHx8ICc/JztcbiAgICBhdXRob3JpemF0aW9uVXJsICs9IGBjbGllbnRfaWQ9JHtjb25maWcuY2xpZW50SWR9YDtcbiAgICBhdXRob3JpemF0aW9uVXJsICs9IGAmcmVkaXJlY3RfdXJpPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHBhcmFtZXRlcnMucmVkaXJlY3RVcmkpfWA7XG4gICAgYXV0aG9yaXphdGlvblVybCArPSBgJnJlc3BvbnNlX3R5cGU9JHtwYXJhbWV0ZXJzLnJlc3BvbnNlVHlwZX1gO1xuICAgIGF1dGhvcml6YXRpb25VcmwgKz0gYCZzY29wZT0ke2VuY29kZVVSSUNvbXBvbmVudChjb25maWcuc2NvcGUgfHwgJycpfWA7XG4gICAgYXV0aG9yaXphdGlvblVybCArPSBgJnN0YXRlPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHBhcmFtZXRlcnMuc3RhdGUgfHwgJycpfWA7XG4gICAgcmV0dXJuIHRoaXMubG9jYXRpb24ucmVwbGFjZShgJHthdXRob3JpemF0aW9uVXJsfSR7dGhpcy5nZW5lcmF0ZU5vbmNlKGNvbmZpZyl9JHthd2FpdCB0aGlzLmdlbmVyYXRlQ29kZUNoYWxsZW5nZShjb25maWcpfWApO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGdlbmVyYXRlQ29kZUNoYWxsZW5nZShjb25maWc6IGFueSkge1xuICAgIGlmIChjb25maWcucGtjZSkge1xuICAgICAgY29uc3QgY29kZVZlcmlmaWVyID0gcmFuZG9tU3RyaW5nKCk7XG4gICAgICB0aGlzLnRva2VuID0gey4uLnRoaXMudG9rZW4sIGNvZGVWZXJpZmllcn07XG4gICAgICByZXR1cm4gYCZjb2RlX2NoYWxsZW5nZT0ke2F3YWl0IHBrY2UoY29kZVZlcmlmaWVyKX0mY29kZV9jaGFsbGVuZ2VfbWV0aG9kPVMyNTZgO1xuICAgIH1cbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2VuZXJhdGVOb25jZShjb25maWc6IGFueSkge1xuICAgIGlmIChjb25maWcgJiYgY29uZmlnLnNjb3BlICYmIGNvbmZpZy5zY29wZS5pbmRleE9mKCdvcGVuaWQnKSA+IC0xKSB7XG4gICAgICBjb25zdCBub25jZSA9IHJhbmRvbVN0cmluZygxMCk7XG4gICAgICB0aGlzLnRva2VuID0gey4uLnRoaXMudG9rZW4sIG5vbmNlfTtcbiAgICAgIHJldHVybiBgJm5vbmNlPSR7bm9uY2V9YDtcbiAgICB9XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgcHJpdmF0ZSBjaGVja1Jlc3BvbnNlKHRva2VuPzogT0F1dGhUb2tlbixcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KSB7XG4gICAgdGhpcy5lbWl0U3RhdGUocGFyYW1ldGVycyk7XG4gICAgdGhpcy5jbGVhbkxvY2F0aW9uSGFzaCgpO1xuICAgIGlmICghcGFyYW1ldGVycyB8fCBwYXJhbWV0ZXJzWydlcnJvciddKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICh0b2tlbiAmJiB0b2tlbi5ub25jZSAmJiBwYXJhbWV0ZXJzWydhY2Nlc3NfdG9rZW4nXSkge1xuICAgICAgY29uc3Qgand0VG9rZW4gPSBqd3QocGFyYW1ldGVyc1snYWNjZXNzX3Rva2VuJ10pO1xuICAgICAgcmV0dXJuIHRva2VuLm5vbmNlID09PSBqd3RUb2tlbi5ub25jZTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcmFtZXRlcnNbJ2FjY2Vzc190b2tlbiddIHx8IHBhcmFtZXRlcnNbJ2NvZGUnXTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q2xlYW5lZFVuU2VhcmNoUGFyYW1ldGVycygpIHtcbiAgICBjb25zdCB7c2VhcmNofSA9IHRoaXMubG9jYXRpb247XG4gICAgbGV0IHNlYXJjaFN0cmluZyA9IHNlYXJjaCAmJiBzZWFyY2guc3Vic3RyaW5nKDEpIHx8ICcnO1xuICAgIGNvbnN0IGhhc2hLZXlzID0gWydjb2RlJywgJ3N0YXRlJywgJ2Vycm9yJywgJ2Vycm9yX2Rlc2NyaXB0aW9uJywgJ3Nlc3Npb25fc3RhdGUnLCAnc2NvcGUnLCAnYXV0aHVzZXInLCAncHJvbXB0J107XG4gICAgaGFzaEtleXMuZm9yRWFjaChoYXNoS2V5ID0+IHtcbiAgICAgIGNvbnN0IHJlID0gbmV3IFJlZ0V4cCgnJicgKyBoYXNoS2V5ICsgJyg9W14mXSopP3xeJyArIGhhc2hLZXkgKyAnKD1bXiZdKik/Jj8nKTtcbiAgICAgIHNlYXJjaFN0cmluZyA9IHNlYXJjaFN0cmluZy5yZXBsYWNlKHJlLCAnJyk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHNlYXJjaFN0cmluZy5sZW5ndGggJiYgYD8ke3NlYXJjaFN0cmluZ31gIHx8ICcnO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhbkxvY2F0aW9uSGFzaCgpIHtcbiAgICBjb25zdCB7aGFzaH0gPSB0aGlzLmxvY2F0aW9uO1xuICAgIGxldCBjdXJIYXNoID0gaGFzaCAmJiBoYXNoLnN1YnN0cmluZygxKSB8fCAnJztcbiAgICBjb25zdCBoYXNoS2V5cyA9IFtcbiAgICAgICdhY2Nlc3NfdG9rZW4nLFxuICAgICAgJ3Rva2VuX3R5cGUnLFxuICAgICAgJ2V4cGlyZXNfaW4nLFxuICAgICAgJ3Njb3BlJyxcbiAgICAgICdzdGF0ZScsXG4gICAgICAnZXJyb3InLFxuICAgICAgJ2Vycm9yX2Rlc2NyaXB0aW9uJyxcbiAgICAgICdzZXNzaW9uX3N0YXRlJyxcbiAgICAgICdub25jZScsXG4gICAgICAnaWRfdG9rZW4nLFxuICAgICAgJ2NvZGUnXG4gICAgXTtcbiAgICBoYXNoS2V5cy5mb3JFYWNoKGhhc2hLZXkgPT4ge1xuICAgICAgY29uc3QgcmUgPSBuZXcgUmVnRXhwKCcmJyArIGhhc2hLZXkgKyAnKD1bXiZdKik/fF4nICsgaGFzaEtleSArICcoPVteJl0qKT8mPycpO1xuICAgICAgY3VySGFzaCA9IGN1ckhhc2gucmVwbGFjZShyZSwgJycpO1xuICAgIH0pO1xuICAgIHRoaXMubG9jYXRpb24uaGFzaCA9IGN1ckhhc2g7XG4gIH1cblxuICBwcml2YXRlIGVtaXRTdGF0ZShwYXJhbWV0ZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPikge1xuICAgIGNvbnN0IHtzdGF0ZX0gPSBwYXJhbWV0ZXJzIHx8IHt9O1xuICAgIHN0YXRlICYmIHRoaXMuc3RhdGUkLm5leHQoc3RhdGUpO1xuICB9XG59XG4iXX0=