@dontdrinkandroot/ngx-extensions 0.3.2 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/{esm2020 → esm2022}/src/cookie/cookie.service.mjs +4 -4
- package/esm2022/src/ddr-extensions.module.mjs +67 -0
- package/{esm2020 → esm2022}/src/http/redirect-to-login-interceptor.service.mjs +4 -4
- package/{esm2020 → esm2022}/src/http/with-credentials-interceptor.service.mjs +4 -4
- package/{esm2020 → esm2022}/src/image/lazy-image.directive.mjs +4 -4
- package/{esm2020 → esm2022}/src/jwt/jwt-interceptor.service.mjs +4 -4
- package/{esm2020 → esm2022}/src/jwt/jwt-refresh-token-interceptor.service.mjs +4 -4
- package/{esm2020 → esm2022}/src/jwt/jwt.service.mjs +4 -4
- package/{esm2020 → esm2022}/src/logger/console-logger.service.mjs +4 -4
- package/{esm2020 → esm2022}/src/oauth/oauth2-access-token-interceptor.service.mjs +4 -4
- package/esm2022/src/oauth/oauth2-error.mjs +8 -0
- package/{esm2020 → esm2022}/src/oauth/oauth2-refresh-token-interceptor.service.mjs +4 -4
- package/{esm2020 → esm2022}/src/oauth/oauth2.module.mjs +5 -5
- package/esm2022/src/oauth/oauth2.service.mjs +125 -0
- package/{esm2020 → esm2022}/src/oauth/redirect-to-oauth2-login-interceptor.service.mjs +4 -4
- package/{esm2020 → esm2022}/src/scroll/bottom-hit.directive.mjs +4 -4
- package/{esm2020 → esm2022}/src/scroll/scroll.service.mjs +4 -4
- package/{esm2020 → esm2022}/src/storage/local-storage.service.mjs +4 -4
- package/{esm2020 → esm2022}/src/visibility/visibility.service.mjs +4 -4
- package/{fesm2020 → fesm2022}/dontdrinkandroot-ngx-extensions.mjs +82 -80
- package/{fesm2020 → fesm2022}/dontdrinkandroot-ngx-extensions.mjs.map +1 -1
- package/package.json +9 -15
- package/src/image/lazy-image.directive.d.ts +1 -1
- package/esm2020/src/ddr-extensions.module.mjs +0 -67
- package/esm2020/src/oauth/oauth2-error.mjs +0 -8
- package/esm2020/src/oauth/oauth2.service.mjs +0 -125
- package/fesm2015/dontdrinkandroot-ngx-extensions.mjs +0 -1132
- package/fesm2015/dontdrinkandroot-ngx-extensions.mjs.map +0 -1
- /package/{esm2020 → esm2022}/dontdrinkandroot-ngx-extensions.mjs +0 -0
- /package/{esm2020 → esm2022}/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/src/http/url-info.mjs +0 -0
- /package/{esm2020 → esm2022}/src/jwt/jwt-token-response.mjs +0 -0
- /package/{esm2020 → esm2022}/src/logger/logger.service.mjs +0 -0
- /package/{esm2020 → esm2022}/src/methoddecorator/debounce.mjs +0 -0
- /package/{esm2020 → esm2022}/src/methoddecorator/limit.mjs +0 -0
- /package/{esm2020 → esm2022}/src/oauth/json-web-token.mjs +0 -0
- /package/{esm2020 → esm2022}/src/oauth/oauth2-config.mjs +0 -0
- /package/{esm2020 → esm2022}/src/oauth/token-response.mjs +0 -0
- /package/{esm2020 → esm2022}/src/storage/storage.service.mjs +0 -0
- /package/{esm2020 → esm2022}/src/typeguard/is-non-null.mjs +0 -0
- /package/{esm2020 → esm2022}/src/util/collection-utils.mjs +0 -0
- /package/{esm2020 → esm2022}/src/util/number-utils.mjs +0 -0
- /package/{esm2020 → esm2022}/src/util/object-utils.mjs +0 -0
- /package/{esm2020 → esm2022}/src/util/string-utils.mjs +0 -0
- /package/{esm2020 → esm2022}/src/util/type-utils.mjs +0 -0
|
@@ -1,125 +0,0 @@
|
|
|
1
|
-
import { Inject, Injectable } from '@angular/core';
|
|
2
|
-
import { throwError } from 'rxjs';
|
|
3
|
-
import { HttpParams } from '@angular/common/http';
|
|
4
|
-
import { catchError, map, shareReplay } from 'rxjs/operators';
|
|
5
|
-
import { DDR_OAUTH2_CONFIG } from './oauth2-config';
|
|
6
|
-
import { OAuth2Error } from './oauth2-error';
|
|
7
|
-
import { TypeUtils } from '../util/type-utils';
|
|
8
|
-
import { StringUtils } from '../util/string-utils';
|
|
9
|
-
import * as i0 from "@angular/core";
|
|
10
|
-
import * as i1 from "@angular/router";
|
|
11
|
-
import * as i2 from "@angular/common/http";
|
|
12
|
-
import * as i3 from "../logger/logger.service";
|
|
13
|
-
import * as i4 from "./oauth2-config";
|
|
14
|
-
export class OAuth2Service {
|
|
15
|
-
constructor(route, httpClient, loggerService, config) {
|
|
16
|
-
this.route = route;
|
|
17
|
-
this.httpClient = httpClient;
|
|
18
|
-
this.loggerService = loggerService;
|
|
19
|
-
this.config = config;
|
|
20
|
-
this.accessTokenString = null;
|
|
21
|
-
this.accessToken = null;
|
|
22
|
-
this.REFRESH_MARGIN_SECONDS = 60 * 10;
|
|
23
|
-
this.refreshTokenRequest$ = null;
|
|
24
|
-
}
|
|
25
|
-
redirectToLogin() {
|
|
26
|
-
const challenge = this.createChallenge();
|
|
27
|
-
localStorage.setItem(OAuth2Service.STORAGE_KEY_CHALLENGE, challenge);
|
|
28
|
-
const params = new HttpParams()
|
|
29
|
-
.set('client_id', this.config.clientId)
|
|
30
|
-
.set('response_type', 'code')
|
|
31
|
-
.set('redirect_uri', this.config.redirectUri)
|
|
32
|
-
.set('code_challenge', challenge)
|
|
33
|
-
.set('code_challenge_method', 'plain');
|
|
34
|
-
window.location.href = this.config.authorizeUri + '?' + params.toString();
|
|
35
|
-
}
|
|
36
|
-
handleCode() {
|
|
37
|
-
if (this.route.snapshot.queryParamMap.has('error')) {
|
|
38
|
-
const error = this.route.snapshot.queryParamMap.get('error');
|
|
39
|
-
return throwError(() => new OAuth2Error(error ?? 'Unknown error'));
|
|
40
|
-
}
|
|
41
|
-
if (!this.route.snapshot.queryParamMap.has('code')) {
|
|
42
|
-
return throwError(() => new OAuth2Error(OAuth2Error.CODE_NOT_FOUND));
|
|
43
|
-
}
|
|
44
|
-
const code = TypeUtils.notNull(this.route.snapshot.queryParamMap.get('code'));
|
|
45
|
-
const params = new HttpParams()
|
|
46
|
-
.set('grant_type', 'authorization_code')
|
|
47
|
-
.set('code', code)
|
|
48
|
-
.set('redirect_uri', this.config.redirectUri)
|
|
49
|
-
.set('code_verifier', TypeUtils.notNull(localStorage.getItem(OAuth2Service.STORAGE_KEY_CHALLENGE)))
|
|
50
|
-
.set('client_id', this.config.clientId);
|
|
51
|
-
return this.httpClient.post(this.config.tokenUri, params).pipe(map(tokenResponse => this.processTokenResponse(tokenResponse)));
|
|
52
|
-
}
|
|
53
|
-
createChallenge() {
|
|
54
|
-
return StringUtils.createRandomString(64, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890-._~');
|
|
55
|
-
}
|
|
56
|
-
getRefreshToken() {
|
|
57
|
-
return localStorage.getItem(OAuth2Service.STORAGE_KEY_REFRESH_TOKEN);
|
|
58
|
-
}
|
|
59
|
-
getAccessTokenString() {
|
|
60
|
-
return this.accessTokenString;
|
|
61
|
-
}
|
|
62
|
-
isAccessTokenExpired() {
|
|
63
|
-
return (null == this.accessToken
|
|
64
|
-
|| this.accessToken.exp * 1000 < Date.now());
|
|
65
|
-
}
|
|
66
|
-
isRefreshPossibleAndRequired(req = null) {
|
|
67
|
-
return ((null == req || !req.url.endsWith(this.config.tokenUri))
|
|
68
|
-
&& null != this.getRefreshToken()
|
|
69
|
-
&& (null == this.accessToken
|
|
70
|
-
|| (this.accessToken.exp - this.REFRESH_MARGIN_SECONDS) * 1000 < Date.now()));
|
|
71
|
-
}
|
|
72
|
-
performRefresh() {
|
|
73
|
-
if (null == this.refreshTokenRequest$) {
|
|
74
|
-
this.loggerService.info('Performing token refesh');
|
|
75
|
-
const params = new HttpParams()
|
|
76
|
-
.set('grant_type', 'refresh_token')
|
|
77
|
-
.set('refresh_token', TypeUtils.notNull(this.getRefreshToken()))
|
|
78
|
-
.set('client_id', this.config.clientId);
|
|
79
|
-
this.refreshTokenRequest$ = this.httpClient.post(this.config.tokenUri, params).pipe(map(tokenResponse => {
|
|
80
|
-
const token = this.processTokenResponse(tokenResponse);
|
|
81
|
-
this.refreshTokenRequest$ = null;
|
|
82
|
-
return token;
|
|
83
|
-
}), catchError(error => {
|
|
84
|
-
this.accessTokenString = null;
|
|
85
|
-
this.accessToken = null;
|
|
86
|
-
localStorage.removeItem(OAuth2Service.STORAGE_KEY_REFRESH_TOKEN);
|
|
87
|
-
this.refreshTokenRequest$ = null;
|
|
88
|
-
return throwError(error);
|
|
89
|
-
}), shareReplay(1));
|
|
90
|
-
}
|
|
91
|
-
return this.refreshTokenRequest$;
|
|
92
|
-
}
|
|
93
|
-
processTokenResponse(tokenResponse) {
|
|
94
|
-
localStorage.removeItem(OAuth2Service.STORAGE_KEY_CHALLENGE);
|
|
95
|
-
this.accessTokenString = tokenResponse.access_token;
|
|
96
|
-
this.accessToken = JSON.parse(atob(tokenResponse.access_token.split('.')[1]));
|
|
97
|
-
this.loggerService.info('Access Token Expiry', new Date(this.accessToken.exp * 1000));
|
|
98
|
-
localStorage.setItem(OAuth2Service.STORAGE_KEY_REFRESH_TOKEN, tokenResponse.refresh_token);
|
|
99
|
-
return this.accessToken;
|
|
100
|
-
}
|
|
101
|
-
clear() {
|
|
102
|
-
this.accessToken = null;
|
|
103
|
-
this.accessTokenString = null;
|
|
104
|
-
localStorage.removeItem(OAuth2Service.STORAGE_KEY_REFRESH_TOKEN);
|
|
105
|
-
localStorage.removeItem(OAuth2Service.STORAGE_KEY_RETURN_URL);
|
|
106
|
-
}
|
|
107
|
-
setReturnUrl(url) {
|
|
108
|
-
localStorage.setItem(OAuth2Service.STORAGE_KEY_RETURN_URL, url);
|
|
109
|
-
}
|
|
110
|
-
getReturnUrl() {
|
|
111
|
-
return localStorage.getItem(OAuth2Service.STORAGE_KEY_RETURN_URL);
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
OAuth2Service.STORAGE_KEY_CHALLENGE = 'ddr_oauth2_challenge';
|
|
115
|
-
OAuth2Service.STORAGE_KEY_REFRESH_TOKEN = 'ddr_oauth2_refresh_token';
|
|
116
|
-
OAuth2Service.STORAGE_KEY_RETURN_URL = 'ddr_oauth2_return_url';
|
|
117
|
-
OAuth2Service.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.4", ngImport: i0, type: OAuth2Service, deps: [{ token: i1.ActivatedRoute }, { token: i2.HttpClient }, { token: i3.Logger }, { token: DDR_OAUTH2_CONFIG }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
118
|
-
OAuth2Service.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.4", ngImport: i0, type: OAuth2Service });
|
|
119
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.4", ngImport: i0, type: OAuth2Service, decorators: [{
|
|
120
|
-
type: Injectable
|
|
121
|
-
}], ctorParameters: function () { return [{ type: i1.ActivatedRoute }, { type: i2.HttpClient }, { type: i3.Logger }, { type: i4.OAuth2Config, decorators: [{
|
|
122
|
-
type: Inject,
|
|
123
|
-
args: [DDR_OAUTH2_CONFIG]
|
|
124
|
-
}] }]; } });
|
|
125
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2F1dGgyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvb2F1dGgvb2F1dGgyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFFakQsT0FBTyxFQUFhLFVBQVUsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUM1QyxPQUFPLEVBQWEsVUFBVSxFQUFjLE1BQU0sc0JBQXNCLENBQUM7QUFDekUsT0FBTyxFQUFDLFVBQVUsRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFHNUQsT0FBTyxFQUFDLGlCQUFpQixFQUFlLE1BQU0saUJBQWlCLENBQUM7QUFDaEUsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUM3QyxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sc0JBQXNCLENBQUM7Ozs7OztBQUlqRCxNQUFNLE9BQU8sYUFBYTtJQWdCdEIsWUFDWSxLQUFxQixFQUNyQixVQUFzQixFQUN0QixhQUFxQixFQUNNLE1BQW9CO1FBSC9DLFVBQUssR0FBTCxLQUFLLENBQWdCO1FBQ3JCLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDdEIsa0JBQWEsR0FBYixhQUFhLENBQVE7UUFDTSxXQUFNLEdBQU4sTUFBTSxDQUFjO1FBWm5ELHNCQUFpQixHQUFrQixJQUFJLENBQUM7UUFFeEMsZ0JBQVcsR0FBd0IsSUFBSSxDQUFDO1FBRS9CLDJCQUFzQixHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7UUFFMUMseUJBQW9CLEdBQW9DLElBQUksQ0FBQztJQVNyRSxDQUFDO0lBRU0sZUFBZTtRQUVsQixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDekMsWUFBWSxDQUFDLE9BQU8s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QUFJLENBQUM7UUFDeEIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztRQUM5QixZQUFZLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1FBQ2pFLFlBQVksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLHNCQUFzQixDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUVNLFlBQVksQ0FBQyxHQUFXO1FBRTNCLFlBQVksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLHNCQUFzQixFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3BFLENBQUM7SUFFTSxZQUFZO1FBRWYsT0FBTyxZQUFZLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0lBQ3RFLENBQUM7O0FBMUpjLG1DQUFxQixHQUFHLHNCQUFzQixDQUFDO0FBRS9DLHVDQUF5QixHQUFHLDBCQUEwQixDQUFDO0FBRXhELG9DQUFzQixHQUFHLHVCQUF1QixDQUFDOzBHQU50RCxhQUFhLGdHQW9CVixpQkFBaUI7OEdBcEJwQixhQUFhOzJGQUFiLGFBQWE7a0JBRHpCLFVBQVU7OzBCQXFCRixNQUFNOzJCQUFDLGlCQUFpQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SW5qZWN0LCBJbmplY3RhYmxlfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7QWN0aXZhdGVkUm91dGV9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQge09ic2VydmFibGUsIHRocm93RXJyb3J9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtIdHRwQ2xpZW50LCBIdHRwUGFyYW1zLCBIdHRwUmVxdWVzdH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHtjYXRjaEVycm9yLCBtYXAsIHNoYXJlUmVwbGF5fSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge1Rva2VuUmVzcG9uc2V9IGZyb20gJy4vdG9rZW4tcmVzcG9uc2UnO1xuaW1wb3J0IHtKc29uV2ViVG9rZW59IGZyb20gJy4vanNvbi13ZWItdG9rZW4nO1xuaW1wb3J0IHtERFJfT0FVVEgyX0NPTkZJRywgT0F1dGgyQ29uZmlnfSBmcm9tICcuL29hdXRoMi1jb25maWcnO1xuaW1wb3J0IHtPQXV0aDJFcnJvcn0gZnJvbSAnLi9vYXV0aDItZXJyb3InO1xuaW1wb3J0IHtUeXBlVXRpbHN9IGZyb20gJy4uL3V0aWwvdHlwZS11dGlscyc7XG5pbXBvcnQge1N0cmluZ1V0aWxzfSBmcm9tICcuLi91dGlsL3N0cmluZy11dGlscyc7XG5pbXBvcnQge0xvZ2dlcn0gZnJvbSAnLi4vbG9nZ2VyL2xvZ2dlci5zZXJ2aWNlJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIE9BdXRoMlNlcnZpY2VcbntcbiAgICBwcml2YXRlIHN0YXRpYyBTVE9SQUdFX0tFWV9DSEFMTEVOR0UgPSAnZGRyX29hdXRoMl9jaGFsbGVuZ2UnO1xuXG4gICAgcHJpdmF0ZSBzdGF0aWMgU1RPUkFHRV9LRVlfUkVGUkVTSF9UT0tFTiA9ICdkZHJfb2F1dGgyX3JlZnJlc2hfdG9rZW4nO1xuXG4gICAgcHVibGljIHN0YXRpYyBTVE9SQUdFX0tFWV9SRVRVUk5fVVJMID0gJ2Rkcl9vYXV0aDJfcmV0dXJuX3VybCc7XG5cbiAgICBwcml2YXRlIGFjY2Vzc1Rva2VuU3RyaW5nOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAgIHByaXZhdGUgYWNjZXNzVG9rZW46IEpzb25XZWJUb2tlbiB8IG51bGwgPSBudWxsO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBSRUZSRVNIX01BUkdJTl9TRUNPTkRTID0gNjAgKiAxMDtcblxuICAgIHByaXZhdGUgcmVmcmVzaFRva2VuUmVxdWVzdCQ6IE9ic2VydmFibGU8SnNvbldlYlRva2VuPiB8IG51bGwgPSBudWxsO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgICAgICBwcml2YXRlIGh0dHBDbGllbnQ6IEh0dHBDbGllbnQsXG4gICAgICAgIHByaXZhdGUgbG9nZ2VyU2VydmljZTogTG9nZ2VyLFxuICAgICAgICBASW5qZWN0KEREUl9PQVVUSDJfQ09ORklHKSBwcml2YXRlIGNvbmZpZzogT0F1dGgyQ29uZmlnXG4gICAgKVxuICAgIHtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVkaXJlY3RUb0xvZ2luKClcbiAgICB7XG4gICAgICAgIGNvbnN0IGNoYWxsZW5nZSA9IHRoaXMuY3JlYXRlQ2hhbGxlbmdlKCk7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKE9BdXRoMlNlcnZpY2UuU1RPUkFHRV9LRVlfQ0hBTExFTkdFLCBjaGFsbGVuZ2UpO1xuXG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKClcbiAgICAgICAgICAgIC5zZXQoJ2NsaWVudF9pZCcsIHRoaXMuY29uZmlnLmNsaWVudElkKVxuICAgICAgICAgICAgLnNldCgncmVzcG9uc2VfdHlwZScsICdjb2RlJylcbiAgICAgICAgICAgIC5zZXQoJ3JlZGlyZWN0X3VyaScsIHRoaXMuY29uZmlnLnJlZGlyZWN0VXJpKVxuICAgICAgICAgICAgLnNldCgnY29kZV9jaGFsbGVuZ2UnLCBjaGFsbGVuZ2UpXG4gICAgICAgICAgICAuc2V0KCdjb2RlX2NoYWxsZW5nZV9tZXRob2QnLCAncGxhaW4nKTtcblxuICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IHRoaXMuY29uZmlnLmF1dGhvcml6ZVVyaSArICc/JyArIHBhcmFtcy50b1N0cmluZygpO1xuICAgIH1cblxuICAgIHB1YmxpYyBoYW5kbGVDb2RlKCk6IE9ic2VydmFibGU8SnNvbldlYlRva2VuPlxuICAgIHtcbiAgICAgICAgaWYgKHRoaXMucm91dGUuc25hcHNob3QucXVlcnlQYXJhbU1hcC5oYXMoJ2Vycm9yJykpIHtcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gdGhpcy5yb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtTWFwLmdldCgnZXJyb3InKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IG5ldyBPQXV0aDJFcnJvcihlcnJvciA/PyAnVW5rbm93biBlcnJvcicpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5yb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtTWFwLmhhcygnY29kZScpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBuZXcgT0F1dGgyRXJyb3IoT0F1dGgyRXJyb3IuQ09ERV9OT1RfRk9VTkQpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvZGUgPSBUeXBlVXRpbHMubm90TnVsbCh0aGlzLnJvdXRlLnNuYXBzaG90LnF1ZXJ5UGFyYW1NYXAuZ2V0KCdjb2RlJykpO1xuICAgICAgICBjb25zdCBwYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpXG4gICAgICAgICAgICAuc2V0KCdncmFudF90eXBlJywgJ2F1dGhvcml6YXRpb25fY29kZScpXG4gICAgICAgICAgICAuc2V0KCdjb2RlJywgY29kZSlcbiAgICAgICAgICAgIC5zZXQoJ3JlZGlyZWN0X3VyaScsIHRoaXMuY29uZmlnLnJlZGlyZWN0VXJpKVxuICAgICAgICAgICAgLnNldCgnY29kZV92ZXJpZmllcicsIFR5cGVVdGlscy5ub3ROdWxsKGxvY2FsU3RvcmFnZS5nZXRJdGVtKE9BdXRoMlNlcnZpY2UuU1RPUkFHRV9LRVlfQ0hBTExFTkdFKSkpXG4gICAgICAgICAgICAuc2V0KCdjbGllbnRfaWQnLCB0aGlzLmNvbmZpZy5jbGllbnRJZCk7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucG9zdDxUb2tlblJlc3BvbnNlPih0aGlzLmNvbmZpZy50b2tlblVyaSwgcGFyYW1zKS5waXBlKFxuICAgICAgICAgICAgbWFwKHRva2VuUmVzcG9uc2UgPT4gdGhpcy5wcm9jZXNzVG9rZW5SZXNwb25zZSh0b2tlblJlc3BvbnNlKSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNyZWF0ZUNoYWxsZW5nZSgpXG4gICAge1xuICAgICAgICByZXR1cm4gU3RyaW5nVXRpbHMuY3JlYXRlUmFuZG9tU3RyaW5nKDY0LCAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoxMjM0NTY3ODkwLS5fficpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0UmVmcmVzaFRva2VuKCk6IHN0cmluZyB8IG51bGxcbiAgICB7XG4gICAgICAgIHJldHVybiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShPQXV0aDJTZXJ2aWNlLlNUT1JBR0VfS0VZX1JFRlJFU0hfVE9LRU4pO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRBY2Nlc3NUb2tlblN0cmluZygpOiBzdHJpbmcgfCBudWxsXG4gICAge1xuICAgICAgICByZXR1cm4gdGhpcy5hY2Nlc3NUb2tlblN0cmluZztcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNBY2Nlc3NUb2tlbkV4cGlyZWQoKTogYm9vbGVhblxuICAgIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIG51bGwgPT0gdGhpcy5hY2Nlc3NUb2tlblxuICAgICAgICAgICAgfHwgdGhpcy5hY2Nlc3NUb2tlbi5leHAgKiAxMDAwIDwgRGF0ZS5ub3coKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc1JlZnJlc2hQb3NzaWJsZUFuZFJlcXVpcmVkKHJlcTogSHR0cFJlcXVlc3Q8YW55PiB8IG51bGwgPSBudWxsKTogYm9vbGVhblxuICAgIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIChudWxsID09IHJlcSB8fCAhcmVxLnVybC5lbmRzV2l0aCh0aGlzLmNvbmZpZy50b2tlblVyaSkpXG4gICAgICAgICAgICAmJiBudWxsICE9IHRoaXMuZ2V0UmVmcmVzaFRva2VuKClcbiAgICAgICAgICAgICYmIChcbiAgICAgICAgICAgICAgICBudWxsID09IHRoaXMuYWNjZXNzVG9rZW5cbiAgICAgICAgICAgICAgICB8fCAodGhpcy5hY2Nlc3NUb2tlbi5leHAgLSB0aGlzLlJFRlJFU0hfTUFSR0lOX1NFQ09ORFMpICogMTAwMCA8IERhdGUubm93KClcbiAgICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcGVyZm9ybVJlZnJlc2goKTogT2JzZXJ2YWJsZTxKc29uV2ViVG9rZW4+XG4gICAge1xuICAgICAgICBpZiAobnVsbCA9PSB0aGlzLnJlZnJlc2hUb2tlblJlcXVlc3QkKSB7XG5cbiAgICAgICAgICAgIHRoaXMubG9nZ2VyU2VydmljZS5pbmZvKCdQZXJmb3JtaW5nIHRva2VuIHJlZmVzaCcpO1xuXG4gICAgICAgICAgICBjb25zdCBwYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpXG4gICAgICAgICAgICAgICAgLnNldCgnZ3JhbnRfdHlwZScsICdyZWZyZXNoX3Rva2VuJylcbiAgICAgICAgICAgICAgICAuc2V0KCdyZWZyZXNoX3Rva2VuJywgVHlwZVV0aWxzLm5vdE51bGwodGhpcy5nZXRSZWZyZXNoVG9rZW4oKSkpXG4gICAgICAgICAgICAgICAgLnNldCgnY2xpZW50X2lkJywgdGhpcy5jb25maWcuY2xpZW50SWQpO1xuXG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hUb2tlblJlcXVlc3QkID0gdGhpcy5odHRwQ2xpZW50LnBvc3Q8VG9rZW5SZXNwb25zZT4odGhpcy5jb25maWcudG9rZW5VcmksIHBhcmFtcykucGlwZShcbiAgICAgICAgICAgICAgICBtYXAodG9rZW5SZXNwb25zZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRva2VuID0gdGhpcy5wcm9jZXNzVG9rZW5SZXNwb25zZSh0b2tlblJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoVG9rZW5SZXF1ZXN0JCA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbjtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICBjYXRjaEVycm9yKGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hY2Nlc3NUb2tlblN0cmluZyA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWNjZXNzVG9rZW4gPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShPQXV0aDJTZXJ2aWNlLlNUT1JBR0VfS0VZX1JFRlJFU0hfVE9LRU4pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZnJlc2hUb2tlblJlcXVlc3QkID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIHNoYXJlUmVwbGF5KDEpXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMucmVmcmVzaFRva2VuUmVxdWVzdCQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwcm9jZXNzVG9rZW5SZXNwb25zZSh0b2tlblJlc3BvbnNlOiBUb2tlblJlc3BvbnNlKTogSnNvbldlYlRva2VuXG4gICAge1xuICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShPQXV0aDJTZXJ2aWNlLlNUT1JBR0VfS0VZX0NIQUxMRU5HRSk7XG4gICAgICAgIHRoaXMuYWNjZXNzVG9rZW5TdHJpbmcgPSB0b2tlblJlc3BvbnNlLmFjY2Vzc190b2tlbjtcbiAgICAgICAgdGhpcy5hY2Nlc3NUb2tlbiA9IEpTT04ucGFyc2UoYXRvYih0b2tlblJlc3BvbnNlLmFjY2Vzc190b2tlbi5zcGxpdCgnLicpWzFdKSk7XG4gICAgICAgIHRoaXMubG9nZ2VyU2VydmljZS5pbmZvKCdBY2Nlc3MgVG9rZW4gRXhwaXJ5JywgbmV3IERhdGUodGhpcy5hY2Nlc3NUb2tlbiEuZXhwICogMTAwMCkpO1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShPQXV0aDJTZXJ2aWNlLlNUT1JBR0VfS0VZX1JFRlJFU0hfVE9LRU4sIHRva2VuUmVzcG9uc2UucmVmcmVzaF90b2tlbik7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuYWNjZXNzVG9rZW4hO1xuICAgIH1cblxuICAgIHB1YmxpYyBjbGVhcigpXG4gICAge1xuICAgICAgICB0aGlzLmFjY2Vzc1Rva2VuID0gbnVsbDtcbiAgICAgICAgdGhpcy5hY2Nlc3NUb2tlblN0cmluZyA9IG51bGw7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKE9BdXRoMlNlcnZpY2UuU1RPUkFHRV9LRVlfUkVGUkVTSF9UT0tFTik7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKE9BdXRoMlNlcnZpY2UuU1RPUkFHRV9LRVlfUkVUVVJOX1VSTCk7XG4gICAgfVxuXG4gICAgcHVibGljIHNldFJldHVyblVybCh1cmw6IHN0cmluZylcbiAgICB7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKE9BdXRoMlNlcnZpY2UuU1RPUkFHRV9LRVlfUkVUVVJOX1VSTCwgdXJsKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0UmV0dXJuVXJsKCk6IHN0cmluZyB8IG51bGxcbiAgICB7XG4gICAgICAgIHJldHVybiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShPQXV0aDJTZXJ2aWNlLlNUT1JBR0VfS0VZX1JFVFVSTl9VUkwpO1xuICAgIH1cbn1cbiJdfQ==
|