@annalib/anna-cognito-lib 2.1.1 → 2.2.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.
@@ -3,13 +3,12 @@ import { HttpClient } from "@angular/common/http";
3
3
  import { Inject, Injectable } from "@angular/core";
4
4
  import { Router } from "@angular/router";
5
5
  // Third party import statements
6
- import { AuthenticationDetails, CognitoUser, CognitoUserPool } from "amazon-cognito-identity-js";
6
+ import { confirmResetPassword, confirmSignIn, fetchAuthSession, getCurrentUser, resetPassword, signIn, signOut } from "aws-amplify/auth";
7
7
  // User defined import statements
8
8
  import { ToastrService } from 'ngx-toastr';
9
9
  import { AUTH_SERVICE_TOKEN } from '../config/auth-service.token';
10
10
  import { CONFIG_SERVICE_TOKEN } from '../config/config-service.token';
11
11
  import { LoginConstant } from "../constants/loginConstant";
12
- import { AuthenticationData, UserPoolInformation } from "../models/auth.model";
13
12
  import { AnnaLibAclService } from './acl.service';
14
13
  import * as i0 from "@angular/core";
15
14
  import * as i1 from "@angular/router";
@@ -17,6 +16,7 @@ import * as i2 from "./acl.service";
17
16
  import * as i3 from "@angular/common/http";
18
17
  import * as i4 from "ngx-toastr";
19
18
  export class AnnaLibAuthService {
19
+ // authIdFromOktaRedirectionUrl: string;
20
20
  constructor(router, aclService, httpClient, toastr, consumingProjectAuthService, consumingProjectConfigService) {
21
21
  this.router = router;
22
22
  this.aclService = aclService;
@@ -31,172 +31,164 @@ export class AnnaLibAuthService {
31
31
  }
32
32
  }
33
33
  ngOnInit() { }
34
- /***
35
- 1. takes user pool data (userPool ID and client ID)
36
- 2. if current user is null then it means user already logged out then simply return Promise<false>
37
- 3. if current user present check if token is valid for it.
38
- */
39
- isUserLoggedIn() {
40
- let currentUser = this.getCurrentUserDetails();
41
- if (currentUser) {
42
- return new Promise((resolve, reject) => {
43
- currentUser && currentUser.getSession((error, token) => {
44
- if (token) {
45
- this.getAllCognitoTokenAndGroups(token);
46
- resolve(true);
47
- }
48
- else {
49
- this.toastr.error(LoginConstant.sessionExpiredError);
50
- this.sessionTimeout();
51
- resolve(false);
52
- }
53
- });
54
- });
55
- }
56
- else {
57
- return new Promise((resolve) => {
58
- clearInterval(this.accessTokenTimerId);
34
+ async isUserLoggedIn() {
35
+ const session = await fetchAuthSession();
36
+ return new Promise((resolve, reject) => {
37
+ if (session?.tokens) {
38
+ this.getAllCognitoTokenAndGroups(session.tokens);
39
+ resolve(true);
40
+ }
41
+ else {
42
+ this.toastr.error(LoginConstant.sessionExpiredError);
43
+ this.sessionTimeout();
59
44
  resolve(false);
60
- });
61
- }
45
+ }
46
+ });
62
47
  }
63
48
  sessionTimeout() {
64
49
  localStorage.clear();
65
50
  clearInterval(this.accessTokenTimerId);
66
51
  this.router.navigate([LoginConstant.loginPageUrl]);
67
52
  }
68
- refreshAccessToken() {
69
- let currentUser = this.getCurrentUserDetails();
70
- let accessTokenExpiration = localStorage.getItem("accessTokenExpiration");
71
- let expTime = accessTokenExpiration ? parseInt(accessTokenExpiration) : 0;
72
- this.accessTokenTimerId = setInterval(() => {
73
- let counter = 1000;
74
- let delayFunction = setTimeout(() => {
75
- currentUser && currentUser.getSession((error, token) => {
76
- if (token) {
77
- this.getAllCognitoTokenAndGroups(token);
78
- let newExpTime = this.computeTokenExpiration(this.IdToken);
79
- if (newExpTime <= 0) {
80
- newExpTime = 1000;
81
- counter = 0;
82
- if (delayFunction) {
83
- clearInterval(delayFunction);
84
- }
85
- }
86
- expTime = newExpTime;
87
- localStorage.setItem("accessTokenExpiration", newExpTime.toString());
88
- clearInterval(this.accessTokenTimerId);
89
- this.refreshAccessToken();
90
- }
91
- else if (error.code === "NotAuthorizedException") {
92
- this.toastr.error(LoginConstant.sessionExpiredError);
93
- this.sessionTimeout();
94
- }
95
- });
96
- }, counter);
97
- }, expTime);
98
- }
99
53
  computeTokenExpiration(token) {
100
54
  let currentTime = Math.floor(Date.now() / 1000);
101
55
  let tokenTime = token.payload.exp;
102
56
  let expTime = (tokenTime - currentTime) * 1000;
103
57
  return expTime;
104
58
  }
105
- getCurrentUserDetails() {
106
- let poolData = new UserPoolInformation(this.consumingProjectConfigService.appGenericConfig.cognito.userPoolId, this.consumingProjectConfigService.appGenericConfig.cognito.clientId);
107
- let userPool = new CognitoUserPool(poolData);
108
- return userPool.getCurrentUser();
59
+ async getCurrentSession() {
60
+ return await fetchAuthSession();
109
61
  }
110
- getCognitoUserDetails(email) {
111
- this.poolData = new UserPoolInformation(this.consumingProjectConfigService.appGenericConfig.cognito.userPoolId, this.consumingProjectConfigService.appGenericConfig.cognito.clientId);
112
- this.userPool = new CognitoUserPool(this.poolData);
113
- let userData = {
114
- Username: email,
115
- Pool: this.userPool,
116
- };
117
- let cognitoUser = new CognitoUser(userData);
118
- return cognitoUser;
62
+ async handleSignIn({ username, password }) {
63
+ try {
64
+ const { isSignedIn, nextStep } = await signIn({ username, password });
65
+ switch (nextStep?.signInStep) {
66
+ case "DONE":
67
+ let session = await fetchAuthSession();
68
+ let newExpTime = this.computeTokenExpiration(session.tokens.idToken);
69
+ localStorage.setItem("accessTokenExpiration", newExpTime.toString());
70
+ this.refreshAccessToken();
71
+ this.loginErrorMessage = null;
72
+ this.getAllCognitoTokenAndGroups(session.tokens);
73
+ await this.consumingProjectAuthService.onSuccessfulAuthenticatingUser(session.tokens.idToken.payload.sub);
74
+ break;
75
+ case "CONFIRM_SIGN_IN_WITH_NEW_PASSWORD_REQUIRED":
76
+ this.consumingProjectAuthService.isLoggingIn = false;
77
+ this.userName = username;
78
+ this.router.navigate([LoginConstant.setNewPasswordUrl]);
79
+ this.setNewPasswordErrorMessage = null;
80
+ break;
81
+ case "RESET_PASSWORD":
82
+ break;
83
+ }
84
+ }
85
+ catch (error) {
86
+ this.consumingProjectAuthService.isLoggingIn = false;
87
+ if (error?.message == LoginConstant.tempPasswordExpiryError) {
88
+ this.loginErrorMessage = LoginConstant.tempPasswordOnExpiryErrorMsg;
89
+ this.consumingProjectAuthService.sendRegenerationEmail(username);
90
+ }
91
+ else if (error?.message === "Password attempts exceeded") {
92
+ this.loginErrorMessage = LoginConstant.attemptLimitExceeded;
93
+ }
94
+ else {
95
+ this.loginErrorMessage = LoginConstant.userNamePasswordIncorrect;
96
+ }
97
+ }
119
98
  }
120
- authenticate(email, password) {
121
- this.loginErrorMessage = null;
122
- let authData = new AuthenticationData(email, password);
123
- this.authenticationDetails = new AuthenticationDetails(authData);
124
- this.cognitoUser = this.getCognitoUserDetails(email);
125
- this.CognitoAuthentication(this.authenticationDetails);
99
+ async getAllCognitoTokenAndGroups(token) {
100
+ this.accessToken = token.accessToken.toString();
101
+ this.IdToken = token.idToken;
102
+ if ("cognito:groups" in token.accessToken.payload) {
103
+ let userGroupsInCognitoJWT = token.accessToken.payload["cognito:groups"];
104
+ this.aclService.userGroupsInCognitoJWT = userGroupsInCognitoJWT;
105
+ }
106
+ else {
107
+ this.aclService.userGroupsInCognitoJWT = [];
108
+ }
126
109
  }
127
- CognitoAuthentication(authenticationDetails) {
128
- this.cognitoUser.authenticateUser(authenticationDetails, {
129
- onSuccess: async (result) => {
130
- let newExpTime = this.computeTokenExpiration(result.getIdToken());
131
- localStorage.setItem("accessTokenExpiration", newExpTime.toString());
132
- this.refreshAccessToken();
133
- this.getAllCognitoTokenAndGroups(result);
134
- await this.consumingProjectAuthService.onSuccessfulAuthenticatingUser(result);
135
- },
136
- onFailure: (err) => {
137
- this.consumingProjectAuthService.isLoggingIn = false;
138
- if (err.message == LoginConstant.tempPasswordExpiryError) {
139
- this.loginErrorMessage = LoginConstant.tempPasswordOnExpiryErrorMsg;
140
- this.consumingProjectAuthService.sendRegenerationEmail(this.authenticationDetails.getUsername());
141
- }
142
- else if (err.message === "Password attempts exceeded") {
143
- this.loginErrorMessage = LoginConstant.attemptLimitExceeded;
144
- }
145
- else {
146
- this.loginErrorMessage = LoginConstant.userNamePasswordIncorrect;
147
- }
148
- },
149
- newPasswordRequired: (data) => {
150
- this.consumingProjectAuthService.isLoggingIn = false;
151
- this.userAttribute = data;
152
- this.router.navigate([LoginConstant.setNewPasswordUrl]);
153
- },
154
- });
110
+ refreshAccessToken() {
111
+ // // let currentUser = this.getCurrentUserDetails();
112
+ // let accessTokenExpiration = localStorage.getItem("accessTokenExpiration");
113
+ // let expTime = accessTokenExpiration ? parseInt(accessTokenExpiration) : 0;
114
+ // this.accessTokenTimerId = setInterval(() => {
115
+ // // let counter = 1000;
116
+ // // let delayFunction = setTimeout(() => {
117
+ // // currentUser && currentUser.getSession((error: any, token: CognitoUserSession | null) => {
118
+ // let session = await fetchAuthSession();
119
+ // if (session.tokens) {
120
+ // this.getAllCognitoTokenAndGroups(session.tokens);
121
+ // let newExpTime = this.computeTokenExpiration(this.IdToken);
122
+ // if (newExpTime <= 0) {
123
+ // newExpTime = 1000;
124
+ // counter = 0;
125
+ // if (delayFunction) {
126
+ // clearInterval(delayFunction);
127
+ // }
128
+ // }
129
+ // expTime = newExpTime;
130
+ // localStorage.setItem("accessTokenExpiration", newExpTime.toString());
131
+ // clearInterval(this.accessTokenTimerId);
132
+ // this.refreshAccessToken();
133
+ // } else if (error.code === "NotAuthorizedException") {
134
+ // this.toastr.error(LoginConstant.sessionExpiredError);
135
+ // this.sessionTimeout();
136
+ // }
137
+ // });
138
+ // // }, counter);
139
+ // // }, expTime);
155
140
  }
156
- setNewPassword(newPassword) {
157
- delete this.userAttribute.email;
158
- delete this.userAttribute.email_verified;
159
- delete this.userAttribute.phone_number_verified;
160
- this.cognitoUser.completeNewPasswordChallenge(newPassword, this.userAttribute, {
161
- onSuccess: (result) => {
162
- let username = this.cognitoUser.getUsername();
163
- this.consumingProjectAuthService.onPasswordUpdate(username);
164
- this.router.navigate([LoginConstant.loginPageUrl]);
165
- this.consumingProjectAuthService.newPasswordSetThenUpdateToBackend(username);
166
- },
167
- onFailure: (error) => {
168
- this.setNewPasswordErrorMessage = LoginConstant.sessionExpired;
169
- this.setNewPasswordButtonMessage = LoginConstant.loginAgain;
170
- },
171
- });
141
+ async changePassword(newPassword) {
142
+ try {
143
+ let session = await fetchAuthSession();
144
+ console.log(session);
145
+ let oldPassword = this.userPassword;
146
+ let inputParam = {
147
+ challengeResponse: newPassword,
148
+ options: {
149
+ email: 'email@email'
150
+ }
151
+ };
152
+ const data = await confirmSignIn(inputParam);
153
+ const { username } = await getCurrentUser();
154
+ console.log(data);
155
+ this.consumingProjectAuthService.onPasswordUpdate(username);
156
+ this.router.navigate([LoginConstant.loginPageUrl]);
157
+ this.consumingProjectAuthService.newPasswordSetThenUpdateToBackend(username);
158
+ }
159
+ catch (err) {
160
+ console.log(err);
161
+ this.setNewPasswordErrorMessage = LoginConstant.sessionExpired;
162
+ this.setNewPasswordButtonMessage = LoginConstant.loginAgain;
163
+ }
172
164
  }
173
- onForgotPasswordGenerateOTP(email) {
165
+ async onForgotPasswordGenerateOTP(email) {
166
+ let username = email;
174
167
  this.userName = email;
175
- this.cognitoUser = this.getCognitoUserDetails(email);
176
- this.cognitoUser.forgotPassword({
177
- onSuccess: (result) => {
178
- this.verifyAndSetNewPasswordMessage =
179
- LoginConstant.verifyAndSetNewPasswordMessage +
180
- result.CodeDeliveryDetails.Destination +
181
- LoginConstant.pleaseEnterItBelow;
182
- this.router.navigate([LoginConstant.verifyAndSetNewPasswordUrl]);
183
- },
184
- onFailure: (err) => { },
185
- });
168
+ try {
169
+ let result = await resetPassword({ username });
170
+ this.verifyAndSetNewPasswordMessage =
171
+ LoginConstant.verifyAndSetNewPasswordMessage +
172
+ result?.nextStep?.codeDeliveryDetails?.destination +
173
+ LoginConstant.pleaseEnterItBelow;
174
+ this.router.navigate([LoginConstant.verifyAndSetNewPasswordUrl]);
175
+ }
176
+ catch (err) {
177
+ }
186
178
  }
187
- verifyCode(verificationCode, newPassword) {
188
- this.cognitoUser.confirmPassword(verificationCode, newPassword, {
189
- onFailure: (error) => {
190
- this.noOfAttempts = this.noOfAttempts + 1;
191
- this.verifyAndSetNewPasswordErrorMessage = this.forgotPasswordError(error, this.noOfAttempts);
192
- this.forgotPasswordAndGlobalSignoutLoader = false;
193
- },
194
- onSuccess: () => {
195
- let username = this.cognitoUser.getUsername();
196
- this.consumingProjectAuthService.onPasswordUpdate(username);
197
- this.expiryAllExistingCurrentSession(newPassword);
198
- },
199
- });
179
+ async verifyCode(confirmationCode, newPassword) {
180
+ const { username } = await getCurrentUser();
181
+ try {
182
+ confirmResetPassword({ username, newPassword, confirmationCode });
183
+ this.consumingProjectAuthService.onPasswordUpdate(username);
184
+ this.expiryAllExistingCurrentSession(username, newPassword);
185
+ }
186
+ catch (err) {
187
+ console.log(err);
188
+ this.noOfAttempts = this.noOfAttempts + 1;
189
+ this.verifyAndSetNewPasswordErrorMessage = this.forgotPasswordError(err, this.noOfAttempts);
190
+ this.forgotPasswordAndGlobalSignoutLoader = false;
191
+ }
200
192
  }
201
193
  forgotPasswordError(err, noOfAttempts) {
202
194
  let errorMessage;
@@ -214,46 +206,49 @@ export class AnnaLibAuthService {
214
206
  }
215
207
  return errorMessage;
216
208
  }
217
- getAllCognitoTokenAndGroups(token) {
218
- this.accessToken = token.getAccessToken().getJwtToken();
219
- this.IdToken = token.getIdToken();
220
- if ("cognito:groups" in token.getAccessToken().payload) {
221
- this.aclService.userGroupsInCognitoJWT = token.getAccessToken().payload["cognito:groups"];
209
+ signInWithDuo() {
210
+ this.consumingProjectAuthService.signInWithDuo();
211
+ }
212
+ signInWithCognito() {
213
+ this.consumingProjectAuthService.signInWithCognito();
214
+ }
215
+ async handleSignOut() {
216
+ try {
217
+ await signOut({ global: false });
222
218
  }
223
- else {
224
- this.aclService.userGroupsInCognitoJWT = [];
219
+ catch (error) {
220
+ console.log('error signing out: ', error);
225
221
  }
226
222
  }
227
- expiryAllExistingCurrentSession(newPassword) {
228
- let username = this.cognitoUser.getUsername();
229
- this.setUserDetails(username, newPassword);
230
- this.onLoginInCogntioToGetAccessToken();
223
+ expiryAllExistingCurrentSession(username, newPassword) {
224
+ this.setUserDetails();
225
+ this.onLoginInCogntioToGetAccessToken(username, newPassword);
231
226
  }
232
- setUserDetails(username, newPassword) {
227
+ setUserDetails() {
233
228
  this.loginErrorMessage = null;
234
- let authData = new AuthenticationData(username, newPassword);
235
- this.authenticationDetails = new AuthenticationDetails(authData);
236
- this.cognitoUser = this.getCognitoUserDetails(username);
237
229
  }
238
- onLoginInCogntioToGetAccessToken() {
239
- this.cognitoUser.authenticateUser(this.authenticationDetails, {
240
- onSuccess: async (result) => {
241
- this.getAllCognitoTokenAndGroups(result);
242
- this.onCallGlobalSignout();
243
- },
244
- onFailure: (err) => { },
245
- newPasswordRequired: (data) => { },
246
- });
230
+ async onLoginInCogntioToGetAccessToken(username, password) {
231
+ try {
232
+ const { isSignedIn, nextStep } = await signIn({ username, password });
233
+ let session = await fetchAuthSession();
234
+ switch (nextStep?.signInStep) {
235
+ case "DONE":
236
+ this.getAllCognitoTokenAndGroups(session.tokens);
237
+ this.onCallGlobalSignout();
238
+ break;
239
+ }
240
+ }
241
+ catch (error) { }
247
242
  }
248
- onCallGlobalSignout() {
249
- this.cognitoUser.globalSignOut({
250
- onSuccess: (result) => {
251
- console.log(result);
252
- this.forgotPasswordAndGlobalSignoutLoader = false;
253
- this.router.navigate([LoginConstant.loginPageUrl]);
254
- },
255
- onFailure: (err) => { }
256
- });
243
+ async onCallGlobalSignout() {
244
+ try {
245
+ await signOut({ global: true });
246
+ this.forgotPasswordAndGlobalSignoutLoader = false;
247
+ this.router.navigate([LoginConstant.loginPageUrl]);
248
+ }
249
+ catch (error) {
250
+ console.log('error signing out: ', error);
251
+ }
257
252
  }
258
253
  }
259
254
  AnnaLibAuthService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: AnnaLibAuthService, deps: [{ token: i1.Router }, { token: i2.AnnaLibAclService }, { token: i3.HttpClient }, { token: i4.ToastrService }, { token: AUTH_SERVICE_TOKEN }, { token: CONFIG_SERVICE_TOKEN }], target: i0.ɵɵFactoryTarget.Injectable });
@@ -270,4 +265,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
270
265
  type: Inject,
271
266
  args: [CONFIG_SERVICE_TOKEN]
272
267
  }] }]; } });
273
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5uYS1jb2duaXRvLWxpYi9zcmMvbGliL3NlcnZpY2VzL2F1dGguc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSw0QkFBNEI7QUFDNUIsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QyxnQ0FBZ0M7QUFDaEMsT0FBTyxFQUFFLHFCQUFxQixFQUFFLFdBQVcsRUFBRSxlQUFlLEVBQXNCLE1BQU0sNEJBQTRCLENBQUM7QUFFckgsaUNBQWlDO0FBQ2pDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDM0MsT0FBTyxFQUFFLGtCQUFrQixFQUFnQixNQUFNLDhCQUE4QixDQUFDO0FBQ2hGLE9BQU8sRUFBRSxvQkFBb0IsRUFBa0IsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN0RixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGtCQUFrQixFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDL0UsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDOzs7Ozs7QUFLbEQsTUFBTSxPQUFPLGtCQUFrQjtJQXFCM0IsWUFDWSxNQUFjLEVBQ2YsVUFBNkIsRUFDN0IsVUFBcUIsRUFDcEIsTUFBcUIsRUFDTSwyQkFBeUMsRUFDdkMsNkJBQTZDO1FBTDFFLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZixlQUFVLEdBQVYsVUFBVSxDQUFtQjtRQUM3QixlQUFVLEdBQVYsVUFBVSxDQUFXO1FBQ3BCLFdBQU0sR0FBTixNQUFNLENBQWU7UUFDTSxnQ0FB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QVU7bUJBQUM7b0JBQ1IsVUFBVSxFQUFFLE1BQU07aUJBQ3JCOzswQkEyQlEsTUFBTTsyQkFBQyxrQkFBa0I7OzBCQUN6QixNQUFNOzJCQUFDLG9CQUFvQiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEFuZ3VsYXIgaW1wb3J0IHN0YXRlbWVudHNcclxuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gXCJAYW5ndWxhci9jb21tb24vaHR0cFwiO1xyXG5pbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tIFwiQGFuZ3VsYXIvcm91dGVyXCI7XHJcbi8vIFRoaXJkIHBhcnR5IGltcG9ydCBzdGF0ZW1lbnRzXHJcbmltcG9ydCB7IEF1dGhlbnRpY2F0aW9uRGV0YWlscywgQ29nbml0b1VzZXIsIENvZ25pdG9Vc2VyUG9vbCwgQ29nbml0b1VzZXJTZXNzaW9uIH0gZnJvbSBcImFtYXpvbi1jb2duaXRvLWlkZW50aXR5LWpzXCI7XHJcblxyXG4vLyBVc2VyIGRlZmluZWQgaW1wb3J0IHN0YXRlbWVudHNcclxuaW1wb3J0IHsgVG9hc3RyU2VydmljZSB9IGZyb20gJ25neC10b2FzdHInO1xyXG5pbXBvcnQgeyBBVVRIX1NFUlZJQ0VfVE9LRU4sIElBdXRoU2VydmljZSB9IGZyb20gJy4uL2NvbmZpZy9hdXRoLXNlcnZpY2UudG9rZW4nO1xyXG5pbXBvcnQgeyBDT05GSUdfU0VSVklDRV9UT0tFTiwgSUNvbmZpZ1NlcnZpY2UgfSBmcm9tICcuLi9jb25maWcvY29uZmlnLXNlcnZpY2UudG9rZW4nO1xyXG5pbXBvcnQgeyBMb2dpbkNvbnN0YW50IH0gZnJvbSBcIi4uL2NvbnN0YW50cy9sb2dpbkNvbnN0YW50XCI7XHJcbmltcG9ydCB7IEF1dGhlbnRpY2F0aW9uRGF0YSwgVXNlclBvb2xJbmZvcm1hdGlvbiB9IGZyb20gXCIuLi9tb2RlbHMvYXV0aC5tb2RlbFwiO1xyXG5pbXBvcnQgeyBBbm5hTGliQWNsU2VydmljZSB9IGZyb20gJy4vYWNsLnNlcnZpY2UnO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gICAgcHJvdmlkZWRJbjogXCJyb290XCIsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBbm5hTGliQXV0aFNlcnZpY2UgIHtcclxuICAgIHBvb2xEYXRhOiBVc2VyUG9vbEluZm9ybWF0aW9uO1xyXG4gICAgdXNlclBvb2w6IENvZ25pdG9Vc2VyUG9vbDtcclxuICAgIGNvZ25pdG9Vc2VyOiBDb2duaXRvVXNlcjtcclxuICAgIGF1dGhlbnRpY2F0aW9uRGV0YWlsczogQXV0aGVudGljYXRpb25EZXRhaWxzO1xyXG4gICAgdG9rZW5WYWxpZDogYm9vbGVhbjtcclxuICAgIGFjY2Vzc1Rva2VuOiBzdHJpbmc7XHJcbiAgICB1c2VyQXR0cmlidXRlOiBhbnk7XHJcbiAgICBsb2dpbkVycm9yTWVzc2FnZTogc3RyaW5nIHwgbnVsbDtcclxuICAgIHNldE5ld1Bhc3N3b3JkRXJyb3JNZXNzYWdlOiBzdHJpbmc7XHJcbiAgICBzZXROZXdQYXNzd29yZEJ1dHRvbk1lc3NhZ2U6IHN0cmluZztcclxuICAgIHZlcmlmeUFuZFNldE5ld1Bhc3N3b3JkRXJyb3JNZXNzYWdlOiBzdHJpbmc7XHJcbiAgICB2ZXJpZnlBbmRTZXROZXdQYXNzd29yZE1lc3NhZ2U6IHN0cmluZztcclxuICAgIHZlcmlmeUFuZFNldE5ld1Bhc3N3b3JkQnV0dG9uOiBzdHJpbmc7XHJcbiAgICBub09mQXR0ZW1wdHMgPSAwO1xyXG4gICAgc2Vzc2lvbkxvY2tlZCA9IGZhbHNlO1xyXG4gICAgdXNlck5hbWU6IGFueTtcclxuICAgIGFjY2Vzc1Rva2VuVGltZXJJZDogYW55O1xyXG4gICAgSWRUb2tlbjogYW55O1xyXG4gIGZvcmdvdFBhc3N3b3JkQW5kR2xvYmFsU2lnbm91dExvYWRlcjogYm9vbGVhbjtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxyXG4gICAgICAgIHB1YmxpYyBhY2xTZXJ2aWNlOiBBbm5hTGliQWNsU2VydmljZSxcclxuICAgICAgICBwdWJsaWMgaHR0cENsaWVudDpIdHRwQ2xpZW50LFxyXG4gICAgICAgIHByaXZhdGUgdG9hc3RyOiBUb2FzdHJTZXJ2aWNlLFxyXG4gICAgICAgIEBJbmplY3QoQVVUSF9TRVJWSUNFX1RPS0VOKSBwdWJsaWMgY29uc3VtaW5nUHJvamVjdEF1dGhTZXJ2aWNlOiBJQXV0aFNlcnZpY2UsXHJcbiAgICAgICAgQEluamVjdChDT05GSUdfU0VSVklDRV9UT0tFTikgcHVibGljIGNvbnN1bWluZ1Byb2plY3RDb25maWdTZXJ2aWNlOiBJQ29uZmlnU2VydmljZSkge1xyXG4gICAgICAgICAgaWYoIWNvbnN1bWluZ1Byb2plY3RBdXRoU2VydmljZSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBtdXN0IHByb3ZpZGUgYSBhdXRoU2VydmljZScpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICBuZ09uSW5pdCgpIHt9XHJcblxyXG4gICAgLyoqKlxyXG4gICAxLiB0YWtlcyB1c2VyIHBvb2wgZGF0YSAodXNlclBvb2wgSUQgYW5kIGNsaWVudCBJRClcclxuICAgMi4gaWYgY3VycmVudCB1c2VyIGlzIG51bGwgdGhlbiBpdCBtZWFucyB1c2VyIGFscmVhZHkgbG9nZ2VkIG91dCB0aGVuIHNpbXBseSByZXR1cm4gUHJvbWlzZTxmYWxzZT5cclxuICAgMy4gaWYgY3VycmVudCB1c2VyIHByZXNlbnQgY2hlY2sgaWYgdG9rZW4gaXMgdmFsaWQgZm9yIGl0LlxyXG4gKi9cclxuICAgIGlzVXNlckxvZ2dlZEluKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgICAgIGxldCBjdXJyZW50VXNlciA9IHRoaXMuZ2V0Q3VycmVudFVzZXJEZXRhaWxzKCk7XHJcbiAgICAgICAgaWYgKGN1cnJlbnRVc2VyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgICAgY3VycmVudFVzZXIgJiYgY3VycmVudFVzZXIuZ2V0U2Vzc2lvbigoZXJyb3I6IEVycm9yLCB0b2tlbjogQ29nbml0b1VzZXJTZXNzaW9uIHwgbnVsbCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0b2tlbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldEFsbENvZ25pdG9Ub2tlbkFuZEdyb3Vwcyh0b2tlbik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IoTG9naW5Db25zdGFudC5zZXNzaW9uRXhwaXJlZEVycm9yKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXNzaW9uVGltZW91dCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKHRoaXMuYWNjZXNzVG9rZW5UaW1lcklkKTtcclxuICAgICAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc2Vzc2lvblRpbWVvdXQoKSB7XHJcbiAgICAgICAgbG9jYWxTdG9yYWdlLmNsZWFyKCk7XHJcbiAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLmFjY2Vzc1Rva2VuVGltZXJJZCk7XHJcbiAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW0xvZ2luQ29uc3RhbnQubG9naW5QYWdlVXJsXSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVmcmVzaEFjY2Vzc1Rva2VuKCkge1xyXG4gICAgICAgIGxldCBjdXJyZW50VXNlciA9IHRoaXMuZ2V0Q3VycmVudFVzZXJEZXRhaWxzKCk7XHJcbiAgICAgICAgbGV0IGFjY2Vzc1Rva2VuRXhwaXJhdGlvbiA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiYWNjZXNzVG9rZW5FeHBpcmF0aW9uXCIpO1xyXG4gICAgICAgIGxldCBleHBUaW1lID0gYWNjZXNzVG9rZW5FeHBpcmF0aW9uID8gcGFyc2VJbnQoYWNjZXNzVG9rZW5FeHBpcmF0aW9uKSA6IDA7XHJcbiAgICAgICAgdGhpcy5hY2Nlc3NUb2tlblRpbWVySWQgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBjb3VudGVyID0gMTAwMDtcclxuICAgICAgICAgICAgbGV0IGRlbGF5RnVuY3Rpb24gPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICBjdXJyZW50VXNlciAmJiBjdXJyZW50VXNlci5nZXRTZXNzaW9uKChlcnJvcjogYW55LCB0b2tlbjogQ29nbml0b1VzZXJTZXNzaW9uIHwgbnVsbCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0b2tlbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldEFsbENvZ25pdG9Ub2tlbkFuZEdyb3Vwcyh0b2tlbik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBuZXdFeHBUaW1lID0gdGhpcy5jb21wdXRlVG9rZW5FeHBpcmF0aW9uKHRoaXMuSWRUb2tlbik7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3RXhwVGltZSA8PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdFeHBUaW1lID0gMTAwMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ZXIgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlbGF5RnVuY3Rpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKGRlbGF5RnVuY3Rpb24pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4cFRpbWUgPSBuZXdFeHBUaW1lO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcImFjY2Vzc1Rva2VuRXhwaXJhdGlvblwiLCBuZXdFeHBUaW1lLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKHRoaXMuYWNjZXNzVG9rZW5UaW1lcklkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoQWNjZXNzVG9rZW4oKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVycm9yLmNvZGUgPT09IFwiTm90QXV0aG9yaXplZEV4Y2VwdGlvblwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG9hc3RyLmVycm9yKExvZ2luQ29uc3RhbnQuc2Vzc2lvbkV4cGlyZWRFcnJvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2Vzc2lvblRpbWVvdXQoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSwgY291bnRlcik7XHJcbiAgICAgICAgfSwgZXhwVGltZSk7XHJcbiAgICB9XHJcblxyXG4gICAgY29tcHV0ZVRva2VuRXhwaXJhdGlvbih0b2tlbjogYW55KSB7XHJcbiAgICAgICAgbGV0IGN1cnJlbnRUaW1lID0gTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMCk7XHJcbiAgICAgICAgbGV0IHRva2VuVGltZSA9IHRva2VuLnBheWxvYWQuZXhwO1xyXG4gICAgICAgIGxldCBleHBUaW1lID0gKHRva2VuVGltZSAtIGN1cnJlbnRUaW1lKSAqIDEwMDA7XHJcbiAgICAgICAgcmV0dXJuIGV4cFRpbWU7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIGdldEN1cnJlbnRVc2VyRGV0YWlscygpIHtcclxuICAgICAgICBsZXQgcG9vbERhdGEgPSBuZXcgVXNlclBvb2xJbmZvcm1hdGlvbih0aGlzLmNvbnN1bWluZ1Byb2plY3RDb25maWdTZXJ2aWNlLmFwcEdlbmVyaWNDb25maWcuY29nbml0by51c2VyUG9vbElkLCB0aGlzLmNvbnN1bWluZ1Byb2plY3RDb25maWdTZXJ2aWNlLmFwcEdlbmVyaWNDb25maWcuY29nbml0by5jbGllbnRJZCk7XHJcbiAgICAgICAgbGV0IHVzZXJQb29sID0gbmV3IENvZ25pdG9Vc2VyUG9vbChwb29sRGF0YSk7XHJcbiAgICAgICAgcmV0dXJuIHVzZXJQb29sLmdldEN1cnJlbnRVc2VyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0Q29nbml0b1VzZXJEZXRhaWxzKGVtYWlsOiBzdHJpbmcpOiBDb2duaXRvVXNlciB7XHJcbiAgICAgICAgdGhpcy5wb29sRGF0YSA9IG5ldyBVc2VyUG9vbEluZm9ybWF0aW9uKHRoaXMuY29uc3VtaW5nUHJvamVjdENvbmZpZ1NlcnZpY2UuYXBwR2VuZXJpY0NvbmZpZy5jb2duaXRvLnVzZXJQb29sSWQsIHRoaXMuY29uc3VtaW5nUHJvamVjdENvbmZpZ1NlcnZpY2UuYXBwR2VuZXJpY0NvbmZpZy5jb2duaXRvLmNsaWVudElkKTtcclxuICAgICAgICB0aGlzLnVzZXJQb29sID0gbmV3IENvZ25pdG9Vc2VyUG9vbCh0aGlzLnBvb2xEYXRhKTtcclxuXHJcbiAgICAgICAgbGV0IHVzZXJEYXRhID0ge1xyXG4gICAgICAgICAgICBVc2VybmFtZTogZW1haWwsXHJcbiAgICAgICAgICAgIFBvb2w6IHRoaXMudXNlclBvb2wsXHJcbiAgICAgICAgfTtcclxuICAgICAgICBsZXQgY29nbml0b1VzZXIgPSBuZXcgQ29nbml0b1VzZXIodXNlckRhdGEpO1xyXG4gICAgICAgIHJldHVybiBjb2duaXRvVXNlcjtcclxuICAgIH1cclxuXHJcbiAgICBhdXRoZW50aWNhdGUoZW1haWw6IHN0cmluZywgcGFzc3dvcmQ6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMubG9naW5FcnJvck1lc3NhZ2UgPSBudWxsO1xyXG4gICAgICAgIGxldCBhdXRoRGF0YSA9IG5ldyBBdXRoZW50aWNhdGlvbkRhdGEoZW1haWwsIHBhc3N3b3JkKTtcclxuICAgICAgICB0aGlzLmF1dGhlbnRpY2F0aW9uRGV0YWlscyA9IG5ldyBBdXRoZW50aWNhdGlvbkRldGFpbHMoYXV0aERhdGEpO1xyXG5cclxuICAgICAgICB0aGlzLmNvZ25pdG9Vc2VyID0gdGhpcy5nZXRDb2duaXRvVXNlckRldGFpbHMoZW1haWwpO1xyXG4gICAgICAgIHRoaXMuQ29nbml0b0F1dGhlbnRpY2F0aW9uKHRoaXMuYXV0aGVudGljYXRpb25EZXRhaWxzKTtcclxuICAgIH1cclxuXHJcbiAgICBDb2duaXRvQXV0aGVudGljYXRpb24oYXV0aGVudGljYXRpb25EZXRhaWxzOiBBdXRoZW50aWNhdGlvbkRldGFpbHMpIHtcclxuICAgICAgICB0aGlzLmNvZ25pdG9Vc2VyLmF1dGhlbnRpY2F0ZVVzZXIoYXV0aGVudGljYXRpb25EZXRhaWxzLCB7XHJcbiAgICAgICAgICAgIG9uU3VjY2VzczogYXN5bmMgKHJlc3VsdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgbGV0IG5ld0V4cFRpbWUgPSB0aGlzLmNvbXB1dGVUb2tlbkV4cGlyYXRpb24ocmVzdWx0LmdldElkVG9rZW4oKSk7XHJcbiAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcImFjY2Vzc1Rva2VuRXhwaXJhdGlvblwiLCBuZXdFeHBUaW1lLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoQWNjZXNzVG9rZW4oKTtcclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgdGhpcy5nZXRBbGxDb2duaXRvVG9rZW5BbmRHcm91cHMocmVzdWx0KTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuY29uc3VtaW5nUHJvamVjdEF1dGhTZXJ2aWNlLm9uU3VjY2Vzc2Z1bEF1dGhlbnRpY2F0aW5nVXNlcihyZXN1bHQpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBvbkZhaWx1cmU6IChlcnIpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY29uc3VtaW5nUHJvamVjdEF1dGhTZXJ2aWNlLmlzTG9nZ2luZ0luID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBpZiAoZXJyLm1lc3NhZ2UgPT0gTG9naW5Db25zdGFudC50ZW1wUGFzc3dvcmRFeHBpcnlFcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9naW5FcnJvck1lc3NhZ2UgPSBMb2dpbkNvbnN0YW50LnRlbXBQYXNzd29yZE9uRXhwaXJ5RXJyb3JNc2c7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25zdW1pbmdQcm9qZWN0QXV0aFNlcnZpY2Uuc2VuZFJlZ2VuZXJhdGlvbkVtYWlsKHRoaXMuYXV0aGVudGljYXRpb25EZXRhaWxzLmdldFVzZXJuYW1lKCkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZXJyLm1lc3NhZ2UgPT09IFwiUGFzc3dvcmQgYXR0ZW1wdHMgZXhjZWVkZWRcIikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9naW5FcnJvck1lc3NhZ2UgPSBMb2dpbkNvbnN0YW50LmF0dGVtcHRMaW1pdEV4Y2VlZGVkO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2luRXJyb3JNZXNzYWdlID0gTG9naW5Db25zdGFudC51c2VyTmFtZVBhc3N3b3JkSW5jb3JyZWN0O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBuZXdQYXNzd29yZFJlcXVpcmVkOiAoZGF0YTphbnkpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY29uc3VtaW5nUHJvamVjdEF1dGhTZXJ2aWNlLmlzTG9nZ2luZ0luID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnVzZXJBdHRyaWJ1dGUgPSBkYXRhO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW0xvZ2luQ29uc3RhbnQuc2V0TmV3UGFzc3dvcmRVcmxdKTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBcclxuICAgIHNldE5ld1Bhc3N3b3JkKG5ld1Bhc3N3b3JkOiBhbnkpIHtcclxuICAgICAgICBkZWxldGUgdGhpcy51c2VyQXR0cmlidXRlLmVtYWlsO1xyXG4gICAgICAgIGRlbGV0ZSB0aGlzLnVzZXJBdHRyaWJ1dGUuZW1haWxfdmVyaWZpZWQ7XHJcbiAgICAgICAgZGVsZXRlIHRoaXMudXNlckF0dHJpYnV0ZS5waG9uZV9udW1iZXJfdmVyaWZpZWQ7XHJcbiAgICAgICAgdGhpcy5jb2duaXRvVXNlci5jb21wbGV0ZU5ld1Bhc3N3b3JkQ2hhbGxlbmdlKG5ld1Bhc3N3b3JkLCB0aGlzLnVzZXJBdHRyaWJ1dGUsIHtcclxuICAgICAgICAgICAgb25TdWNjZXNzOiAocmVzdWx0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBsZXQgdXNlcm5hbWUgPSB0aGlzLmNvZ25pdG9Vc2VyLmdldFVzZXJuYW1lKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnN1bWluZ1Byb2plY3RBdXRoU2VydmljZS5vblBhc3N3b3JkVXBkYXRlKHVzZXJuYW1lKTtcclxuICAgICAgICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtMb2dpbkNvbnN0YW50LmxvZ2luUGFnZVVybF0pO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb25zdW1pbmdQcm9qZWN0QXV0aFNlcnZpY2UubmV3UGFzc3dvcmRTZXRUaGVuVXBkYXRlVG9CYWNrZW5kKHVzZXJuYW1lKTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgb25GYWlsdXJlOiAoZXJyb3IpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0TmV3UGFzc3dvcmRFcnJvck1lc3NhZ2UgPSBMb2dpbkNvbnN0YW50LnNlc3Npb25FeHBpcmVkO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXROZXdQYXNzd29yZEJ1dHRvbk1lc3NhZ2UgPSBMb2dpbkNvbnN0YW50LmxvZ2luQWdhaW47XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgb25Gb3Jnb3RQYXNzd29yZEdlbmVyYXRlT1RQKGVtYWlsOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLnVzZXJOYW1lID0gZW1haWw7XHJcbiAgICAgICAgdGhpcy5jb2duaXRvVXNlciA9IHRoaXMuZ2V0Q29nbml0b1VzZXJEZXRhaWxzKGVtYWlsKTtcclxuICAgICAgICB0aGlzLmNvZ25pdG9Vc2VyLmZvcmdvdFBhc3N3b3JkKHtcclxuICAgICAgICAgICAgb25TdWNjZXNzOiAocmVzdWx0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnZlcmlmeUFuZFNldE5ld1Bhc3N3b3JkTWVzc2FnZSA9XHJcbiAgICAgICAgICAgICAgICAgICAgTG9naW5Db25zdGFudC52ZXJpZnlBbmRTZXROZXdQYXNzd29yZE1lc3NhZ2UgK1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5Db2RlRGVsaXZlcnlEZXRhaWxzLkRlc3RpbmF0aW9uICtcclxuICAgICAgICAgICAgICAgICAgICBMb2dpbkNvbnN0YW50LnBsZWFzZUVudGVySXRCZWxvdztcclxuICAgICAgICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtMb2dpbkNvbnN0YW50LnZlcmlmeUFuZFNldE5ld1Bhc3N3b3JkVXJsXSk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIG9uRmFpbHVyZTogKGVycikgPT4ge30sXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgdmVyaWZ5Q29kZSh2ZXJpZmljYXRpb25Db2RlOiBzdHJpbmcsIG5ld1Bhc3N3b3JkOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLmNvZ25pdG9Vc2VyLmNvbmZpcm1QYXNzd29yZCh2ZXJpZmljYXRpb25Db2RlLCBuZXdQYXNzd29yZCwge1xyXG4gICAgICAgICAgICBvbkZhaWx1cmU6IChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ub09mQXR0ZW1wdHMgPSB0aGlzLm5vT2ZBdHRlbXB0cyArIDE7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnZlcmlmeUFuZFNldE5ld1Bhc3N3b3JkRXJyb3JNZXNzYWdlID0gdGhpcy5mb3Jnb3RQYXNzd29yZEVycm9yKGVycm9yLCB0aGlzLm5vT2ZBdHRlbXB0cyk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZvcmdvdFBhc3N3b3JkQW5kR2xvYmFsU2lnbm91dExvYWRlciA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBvblN1Y2Nlc3M6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgIGxldCB1c2VybmFtZSA9IHRoaXMuY29nbml0b1VzZXIuZ2V0VXNlcm5hbWUoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY29uc3VtaW5nUHJvamVjdEF1dGhTZXJ2aWNlLm9uUGFzc3dvcmRVcGRhdGUodXNlcm5hbWUpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5leHBpcnlBbGxFeGlzdGluZ0N1cnJlbnRTZXNzaW9uKG5ld1Bhc3N3b3JkKTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBmb3Jnb3RQYXNzd29yZEVycm9yKGVycjogYW55LCBub09mQXR0ZW1wdHM6IG51bWJlcikge1xyXG4gICAgICAgIGxldCBlcnJvck1lc3NhZ2U7XHJcbiAgICAgICAgc3dpdGNoIChlcnIuY29kZSkge1xyXG4gICAgICAgICAgICBjYXNlIFwiTGltaXRFeGNlZWRlZEV4Y2VwdGlvblwiOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXNzaW9uTG9ja2VkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9IExvZ2luQ29uc3RhbnQuYXR0ZW1wdExpbWl0RXhjZWVkZWQ7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBcIkV4cGlyZWRDb2RlRXhjZXB0aW9uXCI6XHJcbiAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSBMb2dpbkNvbnN0YW50LnNlc3Npb25FeHBpcmVkO1xyXG4gICAgICAgICAgICAgICAgdGhpcy52ZXJpZnlBbmRTZXROZXdQYXNzd29yZEJ1dHRvbiA9IExvZ2luQ29uc3RhbnQucmVnZW5lcmF0ZU90cDtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gTG9naW5Db25zdGFudC5hdHRlbXB0ICsgXCIgXCIgKyBub09mQXR0ZW1wdHMgKyBMb2dpbkNvbnN0YW50LmF0dGVtcHRNZXNzYWdlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZXJyb3JNZXNzYWdlO1xyXG4gICAgfVxyXG5cclxuICAgIGdldEFsbENvZ25pdG9Ub2tlbkFuZEdyb3Vwcyh0b2tlbjogQ29nbml0b1VzZXJTZXNzaW9uKSB7XHJcbiAgICAgIHRoaXMuYWNjZXNzVG9rZW4gPSB0b2tlbi5nZXRBY2Nlc3NUb2tlbigpLmdldEp3dFRva2VuKCk7XHJcbiAgICAgIHRoaXMuSWRUb2tlbiA9IHRva2VuLmdldElkVG9rZW4oKTtcclxuICAgICAgaWYgKFwiY29nbml0bzpncm91cHNcIiBpbiB0b2tlbi5nZXRBY2Nlc3NUb2tlbigpLnBheWxvYWQpIHtcclxuICAgICAgICAgIHRoaXMuYWNsU2VydmljZS51c2VyR3JvdXBzSW5Db2duaXRvSldUID0gdG9rZW4uZ2V0QWNjZXNzVG9rZW4oKS5wYXlsb2FkW1wiY29nbml0bzpncm91cHNcIl07XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLmFjbFNlcnZpY2UudXNlckdyb3Vwc0luQ29nbml0b0pXVCA9IFtdO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZXhwaXJ5QWxsRXhpc3RpbmdDdXJyZW50U2Vzc2lvbihuZXdQYXNzd29yZDogc3RyaW5nKXtcclxuICAgICAgbGV0IHVzZXJuYW1lID0gIHRoaXMuY29nbml0b1VzZXIuZ2V0VXNlcm5hbWUoKTtcclxuICAgICAgdGhpcy5zZXRVc2VyRGV0YWlscyh1c2VybmFtZSwgbmV3UGFzc3dvcmQpO1xyXG4gICAgICB0aGlzLm9uTG9naW5JbkNvZ250aW9Ub0dldEFjY2Vzc1Rva2VuKCk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0VXNlckRldGFpbHModXNlcm5hbWU6IHN0cmluZywgbmV3UGFzc3dvcmQ6IHN0cmluZyl7XHJcbiAgICAgIHRoaXMubG9naW5FcnJvck1lc3NhZ2UgPSBudWxsO1xyXG4gICAgICBsZXQgYXV0aERhdGEgPSBuZXcgQXV0aGVudGljYXRpb25EYXRhKHVzZXJuYW1lLCBuZXdQYXNzd29yZCk7XHJcbiAgICAgIHRoaXMuYXV0aGVudGljYXRpb25EZXRhaWxzID0gbmV3IEF1dGhlbnRpY2F0aW9uRGV0YWlscyhhdXRoRGF0YSk7XHJcbiAgICAgIHRoaXMuY29nbml0b1VzZXIgPSB0aGlzLmdldENvZ25pdG9Vc2VyRGV0YWlscyh1c2VybmFtZSk7XHJcbiAgICB9XHJcblxyXG4gICAgb25Mb2dpbkluQ29nbnRpb1RvR2V0QWNjZXNzVG9rZW4oKXtcclxuICAgICAgdGhpcy5jb2duaXRvVXNlci5hdXRoZW50aWNhdGVVc2VyKHRoaXMuYXV0aGVudGljYXRpb25EZXRhaWxzLCB7XHJcbiAgICAgICAgb25TdWNjZXNzOiBhc3luYyAocmVzdWx0OiBDb2duaXRvVXNlclNlc3Npb24pID0+IHtcclxuICAgICAgICAgICAgdGhpcy5nZXRBbGxDb2duaXRvVG9rZW5BbmRHcm91cHMocmVzdWx0KTtcclxuICAgICAgICAgICAgdGhpcy5vbkNhbGxHbG9iYWxTaWdub3V0KCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBvbkZhaWx1cmU6IChlcnIpID0+IHt9LFxyXG4gICAgICAgIG5ld1Bhc3N3b3JkUmVxdWlyZWQ6IChkYXRhOmFueSkgPT4ge30sXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIG9uQ2FsbEdsb2JhbFNpZ25vdXQoKXtcclxuICAgICAgdGhpcy5jb2duaXRvVXNlci5nbG9iYWxTaWduT3V0KHtcclxuICAgICAgICBvblN1Y2Nlc3M6IChyZXN1bHQpID0+IFxyXG4gICAgICAgIHsgXHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhyZXN1bHQpOyAgIFxyXG4gICAgICAgICAgdGhpcy5mb3Jnb3RQYXNzd29yZEFuZEdsb2JhbFNpZ25vdXRMb2FkZXIgPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtMb2dpbkNvbnN0YW50LmxvZ2luUGFnZVVybF0pOyBcclxuICAgICAgICB9LFxyXG4gICAgICAgIG9uRmFpbHVyZTogKGVycikgPT4ge31cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbn1cclxuIl19
268
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5uYS1jb2duaXRvLWxpYi9zcmMvbGliL3NlcnZpY2VzL2F1dGguc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSw0QkFBNEI7QUFDNUIsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUV6QyxnQ0FBZ0M7QUFDaEMsT0FBTyxFQUEyQixvQkFBb0IsRUFBRSxhQUFhLEVBQUUsZ0JBQWdCLEVBQUUsY0FBYyxFQUFFLGFBQWEsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFrQixNQUFNLGtCQUFrQixDQUFDO0FBRWxMLGlDQUFpQztBQUNqQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxrQkFBa0IsRUFBZ0IsTUFBTSw4QkFBOEIsQ0FBQztBQUNoRixPQUFPLEVBQUUsb0JBQW9CLEVBQWtCLE1BQU0sZ0NBQWdDLENBQUM7QUFDdEYsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRTNELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7Ozs7O0FBTWxELE1BQU0sT0FBTyxrQkFBa0I7SUFlM0Isd0NBQXdDO0lBRXhDLFlBQ1ksTUFBYyxFQUNmLFVBQTZCLEVBQzdCLFVBQXNCLEVBQ3JCLE1BQXFCLEVBQ00sMkJBQXlDLEVBQ3ZDLDZCQUE2QztRQUwxRSxXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2YsZUFBVSxHQUFWLFVBQVUsQ0FBbUI7UUFDN0IsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUNyQixXQUFNLEdBQU4sTUFBTSxDQUFlO1FBQ00sZ0NBQTJC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QUFDLG9DQUFvQyxHQUFHLEtBQUssQ0FBQztZQUNsRCxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO1NBQ3REO1FBQUMsT0FBTyxLQUFLLEVBQUU7WUFDWixPQUFPLENBQUMsR0FBRyxDQUFDLHFCQUFxQixFQUFFLEtBQUssQ0FBQyxDQUFDO1NBQzdDO0lBQ0wsQ0FBQzs7K0dBclFRLGtCQUFrQixnSUFzQmYsa0JBQWtCLGFBQ2xCLG9CQUFvQjttSEF2QnZCLGtCQUFrQixjQUZmLE1BQU07MkZBRVQsa0JBQWtCO2tCQUg5QixVQUFVO21CQUFDO29CQUNSLFVBQVUsRUFBRSxNQUFNO2lCQUNyQjs7MEJBdUJRLE1BQU07MkJBQUMsa0JBQWtCOzswQkFDekIsTUFBTTsyQkFBQyxvQkFBb0IiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBBbmd1bGFyIGltcG9ydCBzdGF0ZW1lbnRzXHJcbmltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uL2h0dHBcIjtcclxuaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSBcIkBhbmd1bGFyL3JvdXRlclwiO1xyXG5cclxuLy8gVGhpcmQgcGFydHkgaW1wb3J0IHN0YXRlbWVudHNcclxuaW1wb3J0IHsgQXV0aFRva2VucywgU2lnbkluSW5wdXQsIGNvbmZpcm1SZXNldFBhc3N3b3JkLCBjb25maXJtU2lnbkluLCBmZXRjaEF1dGhTZXNzaW9uLCBnZXRDdXJyZW50VXNlciwgcmVzZXRQYXNzd29yZCwgc2lnbkluLCBzaWduT3V0LCB1cGRhdGVQYXNzd29yZCB9IGZyb20gXCJhd3MtYW1wbGlmeS9hdXRoXCI7XHJcblxyXG4vLyBVc2VyIGRlZmluZWQgaW1wb3J0IHN0YXRlbWVudHNcclxuaW1wb3J0IHsgVG9hc3RyU2VydmljZSB9IGZyb20gJ25neC10b2FzdHInO1xyXG5pbXBvcnQgeyBBVVRIX1NFUlZJQ0VfVE9LRU4sIElBdXRoU2VydmljZSB9IGZyb20gJy4uL2NvbmZpZy9hdXRoLXNlcnZpY2UudG9rZW4nO1xyXG5pbXBvcnQgeyBDT05GSUdfU0VSVklDRV9UT0tFTiwgSUNvbmZpZ1NlcnZpY2UgfSBmcm9tICcuLi9jb25maWcvY29uZmlnLXNlcnZpY2UudG9rZW4nO1xyXG5pbXBvcnQgeyBMb2dpbkNvbnN0YW50IH0gZnJvbSBcIi4uL2NvbnN0YW50cy9sb2dpbkNvbnN0YW50XCI7XHJcbmltcG9ydCB7IFVzZXJQb29sSW5mb3JtYXRpb24gfSBmcm9tIFwiLi4vbW9kZWxzL2F1dGgubW9kZWxcIjtcclxuaW1wb3J0IHsgQW5uYUxpYkFjbFNlcnZpY2UgfSBmcm9tICcuL2FjbC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgUGFzc1Rocm91Z2ggfSBmcm9tIFwic3RyZWFtXCI7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgICBwcm92aWRlZEluOiBcInJvb3RcIixcclxufSlcclxuZXhwb3J0IGNsYXNzIEFubmFMaWJBdXRoU2VydmljZSB7XHJcbiAgICBhY2Nlc3NUb2tlbjogc3RyaW5nO1xyXG4gICAgSWRUb2tlbjogYW55O1xyXG4gICAgbG9naW5FcnJvck1lc3NhZ2U6IHN0cmluZyB8IG51bGw7XHJcbiAgICBzZXROZXdQYXNzd29yZEVycm9yTWVzc2FnZTogc3RyaW5nO1xyXG4gICAgc2V0TmV3UGFzc3dvcmRCdXR0b25NZXNzYWdlOiBzdHJpbmc7XHJcbiAgICB2ZXJpZnlBbmRTZXROZXdQYXNzd29yZEVycm9yTWVzc2FnZTogc3RyaW5nO1xyXG4gICAgdmVyaWZ5QW5kU2V0TmV3UGFzc3dvcmRNZXNzYWdlOiBzdHJpbmc7XHJcbiAgICB2ZXJpZnlBbmRTZXROZXdQYXNzd29yZEJ1dHRvbjogc3RyaW5nO1xyXG4gICAgbm9PZkF0dGVtcHRzID0gMDtcclxuICAgIHNlc3Npb25Mb2NrZWQgPSBmYWxzZTtcclxuICAgIHVzZXJOYW1lOiBhbnk7XHJcbiAgICBhY2Nlc3NUb2tlblRpbWVySWQ6IGFueTtcclxuICAgIGZvcmdvdFBhc3N3b3JkQW5kR2xvYmFsU2lnbm91dExvYWRlcjogYm9vbGVhbjtcclxuICAgIHVzZXJQYXNzd29yZDogYW55O1xyXG4gICAgLy8gYXV0aElkRnJvbU9rdGFSZWRpcmVjdGlvblVybDogc3RyaW5nO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXHJcbiAgICAgICAgcHVibGljIGFjbFNlcnZpY2U6IEFubmFMaWJBY2xTZXJ2aWNlLFxyXG4gICAgICAgIHB1YmxpYyBodHRwQ2xpZW50OiBIdHRwQ2xpZW50LFxyXG4gICAgICAgIHByaXZhdGUgdG9hc3RyOiBUb2FzdHJTZXJ2aWNlLFxyXG4gICAgICAgIEBJbmplY3QoQVVUSF9TRVJWSUNFX1RPS0VOKSBwdWJsaWMgY29uc3VtaW5nUHJvamVjdEF1dGhTZXJ2aWNlOiBJQXV0aFNlcnZpY2UsXHJcbiAgICAgICAgQEluamVjdChDT05GSUdfU0VSVklDRV9UT0tFTikgcHVibGljIGNvbnN1bWluZ1Byb2plY3RDb25maWdTZXJ2aWNlOiBJQ29uZmlnU2VydmljZSkge1xyXG4gICAgICAgIGlmICghY29uc3VtaW5nUHJvamVjdEF1dGhTZXJ2aWNlKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignWW91IG11c3QgcHJvdmlkZSBhIGF1dGhTZXJ2aWNlJyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG5nT25Jbml0KCkgeyB9XHJcblxyXG4gICAgYXN5bmMgaXNVc2VyTG9nZ2VkSW4oKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICAgICAgY29uc3Qgc2Vzc2lvbjogYW55ID0gYXdhaXQgZmV0Y2hBdXRoU2Vzc2lvbigpO1xyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChzZXNzaW9uPy50b2tlbnMpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0QWxsQ29nbml0b1Rva2VuQW5kR3JvdXBzKHNlc3Npb24udG9rZW5zKTtcclxuICAgICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRvYXN0ci5lcnJvcihMb2dpbkNvbnN0YW50LnNlc3Npb25FeHBpcmVkRXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXNzaW9uVGltZW91dCgpO1xyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBzZXNzaW9uVGltZW91dCgpIHtcclxuICAgICAgICBsb2NhbFN0b3JhZ2UuY2xlYXIoKTtcclxuICAgICAgICBjbGVhckludGVydmFsKHRoaXMuYWNjZXNzVG9rZW5UaW1lcklkKTtcclxuICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbTG9naW5Db25zdGFudC5sb2dpblBhZ2VVcmxdKTtcclxuICAgIH1cclxuXHJcbiAgICBjb21wdXRlVG9rZW5FeHBpcmF0aW9uKHRva2VuOiBhbnkpIHtcclxuICAgICAgICBsZXQgY3VycmVudFRpbWUgPSBNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKTtcclxuICAgICAgICBsZXQgdG9rZW5UaW1lID0gdG9rZW4ucGF5bG9hZC5leHA7XHJcbiAgICAgICAgbGV0IGV4cFRpbWUgPSAodG9rZW5UaW1lIC0gY3VycmVudFRpbWUpICogMTAwMDtcclxuICAgICAgICByZXR1cm4gZXhwVGltZTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBnZXRDdXJyZW50U2Vzc2lvbigpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgICAgIHJldHVybiBhd2FpdCBmZXRjaEF1dGhTZXNzaW9uKCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgaGFuZGxlU2lnbkluKHsgdXNlcm5hbWUsIHBhc3N3b3JkIH06IFNpZ25JbklucHV0KSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgY29uc3QgeyBpc1NpZ25lZEluLCBuZXh0U3RlcCB9ID0gYXdhaXQgc2lnbkluKHsgdXNlcm5hbWUsIHBhc3N3b3JkIH0pO1xyXG4gICAgICAgICAgICBzd2l0Y2ggKG5leHRTdGVwPy5zaWduSW5TdGVwKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwiRE9ORVwiOlxyXG4gICAgICAgICAgICAgICAgICAgIGxldCBzZXNzaW9uID0gYXdhaXQgZmV0Y2hBdXRoU2Vzc2lvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBuZXdFeHBUaW1lID0gdGhpcy5jb21wdXRlVG9rZW5FeHBpcmF0aW9uKHNlc3Npb24udG9rZW5zLmlkVG9rZW4pO1xyXG4gICAgICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiYWNjZXNzVG9rZW5FeHBpcmF0aW9uXCIsIG5ld0V4cFRpbWUudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoQWNjZXNzVG9rZW4oKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZ2luRXJyb3JNZXNzYWdlID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdldEFsbENvZ25pdG9Ub2tlbkFuZEdyb3VwcyhzZXNzaW9uLnRva2Vucyk7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jb25zdW1pbmdQcm9qZWN0QXV0aFNlcnZpY2Uub25TdWNjZXNzZnVsQXV0aGVudGljYXRpbmdVc2VyKHNlc3Npb24udG9rZW5zLmlkVG9rZW4ucGF5bG9hZC5zdWIpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgICAgIGNhc2UgXCJDT05GSVJNX1NJR05fSU5fV0lUSF9ORVdfUEFTU1dPUkRfUkVRVUlSRURcIjpcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnN1bWluZ1Byb2plY3RBdXRoU2VydmljZS5pc0xvZ2dpbmdJbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXNlck5hbWUgPSB1c2VybmFtZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbTG9naW5Db25zdGFudC5zZXROZXdQYXNzd29yZFVybF0pO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0TmV3UGFzc3dvcmRFcnJvck1lc3NhZ2UgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgICAgIGNhc2UgXCJSRVNFVF9QQVNTV09SRFwiOlxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xyXG4gICAgICAgICAgICB0aGlzLmNvbnN1bWluZ1Byb2plY3RBdXRoU2VydmljZS5pc0xvZ2dpbmdJbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICBpZiAoZXJyb3I/Lm1lc3NhZ2UgPT0gTG9naW5Db25zdGFudC50ZW1wUGFzc3dvcmRFeHBpcnlFcnJvcikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dpbkVycm9yTWVzc2FnZSA9IExvZ2luQ29uc3RhbnQudGVtcFBhc3N3b3JkT25FeHBpcnlFcnJvck1zZztcclxuICAgICAgICAgICAgICAgIHRoaXMuY29uc3VtaW5nUHJvamVjdEF1dGhTZXJ2aWNlLnNlbmRSZWdlbmVyYXRpb25FbWFpbCh1c2VybmFtZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZXJyb3I/Lm1lc3NhZ2UgPT09IFwiUGFzc3dvcmQgYXR0ZW1wdHMgZXhjZWVkZWRcIikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2dpbkVycm9yTWVzc2FnZSA9IExvZ2luQ29uc3RhbnQuYXR0ZW1wdExpbWl0RXhjZWVkZWQ7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2luRXJyb3JNZXNzYWdlID0gTG9naW5Db25zdGFudC51c2VyTmFtZVBhc3N3b3JkSW5jb3JyZWN0O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGdldEFsbENvZ25pdG9Ub2tlbkFuZEdyb3Vwcyh0b2tlbjogQXV0aFRva2Vucykge1xyXG4gICAgICAgIHRoaXMuYWNjZXNzVG9rZW4gPSB0b2tlbi5hY2Nlc3NUb2tlbi50b1N0cmluZygpO1xyXG4gICAgICAgIHRoaXMuSWRUb2tlbiA9IHRva2VuLmlkVG9rZW47XHJcbiAgICAgICAgaWYgKFwiY29nbml0bzpncm91cHNcIiBpbiB0b2tlbi5hY2Nlc3NUb2tlbi5wYXlsb2FkKSB7XHJcbiAgICAgICAgICAgIGxldCB1c2VyR3JvdXBzSW5Db2duaXRvSldUOiBhbnkgPSB0b2tlbi5hY2Nlc3NUb2tlbi5wYXlsb2FkW1wiY29nbml0bzpncm91cHNcIl07XHJcbiAgICAgICAgICAgIHRoaXMuYWNsU2VydmljZS51c2VyR3JvdXBzSW5Db2duaXRvSldUID0gdXNlckdyb3Vwc0luQ29nbml0b0pXVDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmFjbFNlcnZpY2UudXNlckdyb3Vwc0luQ29nbml0b0pXVCA9IFtdO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZWZyZXNoQWNjZXNzVG9rZW4oKSB7XHJcbiAgICAvLyAgICAgLy8gbGV0IGN1cnJlbnRVc2VyID0gdGhpcy5nZXRDdXJyZW50VXNlckRldGFpbHMoKTtcclxuICAgIC8vICAgICBsZXQgYWNjZXNzVG9rZW5FeHBpcmF0aW9uID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJhY2Nlc3NUb2tlbkV4cGlyYXRpb25cIik7XHJcbiAgICAvLyAgICAgbGV0IGV4cFRpbWUgPSBhY2Nlc3NUb2tlbkV4cGlyYXRpb24gPyBwYXJzZUludChhY2Nlc3NUb2tlbkV4cGlyYXRpb24pIDogMDtcclxuICAgIC8vICAgICB0aGlzLmFjY2Vzc1Rva2VuVGltZXJJZCA9IHNldEludGVydmFsKCgpID0+IHtcclxuICAgIC8vICAgICAgICAgLy8gbGV0IGNvdW50ZXIgPSAxMDAwO1xyXG4gICAgLy8gICAgICAgICAvLyBsZXQgZGVsYXlGdW5jdGlvbiA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgLy8gICAgICAgICAvLyAgIGN1cnJlbnRVc2VyICYmIGN1cnJlbnRVc2VyLmdldFNlc3Npb24oKGVycm9yOiBhbnksIHRva2VuOiBDb2duaXRvVXNlclNlc3Npb24gfCBudWxsKSA9PiB7XHJcbiAgICAvLyAgICAgICAgIGxldCBzZXNzaW9uID0gYXdhaXQgZmV0Y2hBdXRoU2Vzc2lvbigpO1xyXG5cclxuICAgIC8vICAgICAgICAgaWYgKHNlc3Npb24udG9rZW5zKSB7XHJcbiAgICAvLyAgICAgICAgICAgICB0aGlzLmdldEFsbENvZ25pdG9Ub2tlbkFuZEdyb3VwcyhzZXNzaW9uLnRva2Vucyk7XHJcbiAgICAvLyAgICAgICAgICAgICBsZXQgbmV3RXhwVGltZSA9IHRoaXMuY29tcHV0ZVRva2VuRXhwaXJhdGlvbih0aGlzLklkVG9rZW4pO1xyXG5cclxuICAgIC8vICAgICAgICAgICAgIGlmIChuZXdFeHBUaW1lIDw9IDApIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICBuZXdFeHBUaW1lID0gMTAwMDtcclxuICAgIC8vICAgICAgICAgICAgICAgICBjb3VudGVyID0gMDtcclxuICAgIC8vICAgICAgICAgICAgICAgICBpZiAoZGVsYXlGdW5jdGlvbikge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKGRlbGF5RnVuY3Rpb24pO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIH1cclxuICAgIC8vICAgICAgICAgICAgIH1cclxuICAgIC8vICAgICAgICAgICAgIGV4cFRpbWUgPSBuZXdFeHBUaW1lO1xyXG4gICAgLy8gICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJhY2Nlc3NUb2tlbkV4cGlyYXRpb25cIiwgbmV3RXhwVGltZS50b1N0cmluZygpKTtcclxuICAgIC8vICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5hY2Nlc3NUb2tlblRpbWVySWQpO1xyXG4gICAgLy8gICAgICAgICAgICAgdGhpcy5yZWZyZXNoQWNjZXNzVG9rZW4oKTtcclxuICAgIC8vICAgICAgICAgfSBlbHNlIGlmIChlcnJvci5jb2RlID09PSBcIk5vdEF1dGhvcml6ZWRFeGNlcHRpb25cIikge1xyXG4gICAgLy8gICAgICAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IoTG9naW5Db25zdGFudC5zZXNzaW9uRXhwaXJlZEVycm9yKTtcclxuICAgIC8vICAgICAgICAgICAgIHRoaXMuc2Vzc2lvblRpbWVvdXQoKTtcclxuICAgIC8vICAgICAgICAgfVxyXG4gICAgLy8gICAgIH0pO1xyXG4gICAgLy8gICAgIC8vIH0sIGNvdW50ZXIpO1xyXG4gICAgLy8gICAgIC8vIH0sIGV4cFRpbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGNoYW5nZVBhc3N3b3JkKG5ld1Bhc3N3b3JkOiBzdHJpbmcpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBsZXQgc2Vzc2lvbiA9IGF3YWl0IGZldGNoQXV0aFNlc3Npb24oKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coc2Vzc2lvbilcclxuICAgICAgICAgICAgbGV0IG9sZFBhc3N3b3JkID0gdGhpcy51c2VyUGFzc3dvcmQ7XHJcbiAgICAgICAgICAgIGxldCBpbnB1dFBhcmFtID0ge1xyXG4gICAgICAgICAgICAgICAgY2hhbGxlbmdlUmVzcG9uc2U6IG5ld1Bhc3N3b3JkLFxyXG4gICAgICAgICAgICAgICAgb3B0aW9uczoge1xyXG4gICAgICAgICAgICAgICAgICAgIGVtYWlsOiAnZW1haWxAZW1haWwnXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IGNvbmZpcm1TaWduSW4oaW5wdXRQYXJhbSk7XHJcbiAgICAgICAgICAgIGNvbnN0IHsgdXNlcm5hbWUgfSA9IGF3YWl0IGdldEN1cnJlbnRVc2VyKCk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGRhdGEpO1xyXG4gICAgICAgICAgICB0aGlzLmNvbnN1bWluZ1Byb2plY3RBdXRoU2VydmljZS5vblBhc3N3b3JkVXBkYXRlKHVzZXJuYW1lKTtcclxuICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW0xvZ2luQ29uc3RhbnQubG9naW5QYWdlVXJsXSk7XHJcbiAgICAgICAgICAgIHRoaXMuY29uc3VtaW5nUHJvamVjdEF1dGhTZXJ2aWNlLm5ld1Bhc3N3b3JkU2V0VGhlblVwZGF0ZVRvQmFja2VuZCh1c2VybmFtZSk7XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycik7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0TmV3UGFzc3dvcmRFcnJvck1lc3NhZ2UgPSBMb2dpbkNvbnN0YW50LnNlc3Npb25FeHBpcmVkO1xyXG4gICAgICAgICAgICB0aGlzLnNldE5ld1Bhc3N3b3JkQnV0dG9uTWVzc2FnZSA9IExvZ2luQ29uc3RhbnQubG9naW5BZ2FpbjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgb25Gb3Jnb3RQYXNzd29yZEdlbmVyYXRlT1RQKGVtYWlsOiBzdHJpbmcpIHtcclxuICAgICAgICBsZXQgdXNlcm5hbWUgPSBlbWFpbDtcclxuICAgICAgICB0aGlzLnVzZXJOYW1lID0gZW1haWw7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgbGV0IHJlc3VsdDogYW55ID0gYXdhaXQgcmVzZXRQYXNzd29yZCh7IHVzZXJuYW1lIH0pO1xyXG4gICAgICAgICAgICB0aGlzLnZlcmlmeUFuZFNldE5ld1Bhc3N3b3JkTWVzc2FnZSA9XHJcbiAgICAgICAgICAgICAgICBMb2dpbkNvbnN0YW50LnZlcmlmeUFuZFNldE5ld1Bhc3N3b3JkTWVzc2FnZSArXHJcbiAgICAgICAgICAgICAgICByZXN1bHQ/Lm5leHRTdGVwPy5jb2RlRGVsaXZlcnlEZXRhaWxzPy5kZXN0aW5hdGlvbiArXHJcbiAgICAgICAgICAgICAgICBMb2dpbkNvbnN0YW50LnBsZWFzZUVudGVySXRCZWxvdztcclxuICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW0xvZ2luQ29uc3RhbnQudmVyaWZ5QW5kU2V0TmV3UGFzc3dvcmRVcmxdKTtcclxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgdmVyaWZ5Q29kZShjb25maXJtYXRpb25Db2RlOiBzdHJpbmcsIG5ld1Bhc3N3b3JkOiBzdHJpbmcpIHtcclxuICAgICAgICBjb25zdCB7IHVzZXJuYW1lIH0gPSBhd2FpdCBnZXRDdXJyZW50VXNlcigpO1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjb25maXJtUmVzZXRQYXNzd29yZCh7IHVzZXJuYW1lLCBuZXdQYXNzd29yZCwgY29uZmlybWF0aW9uQ29kZSB9KTtcclxuICAgICAgICAgICAgdGhpcy5jb25zdW1pbmdQcm9qZWN0QXV0aFNlcnZpY2Uub25QYXNzd29yZFVwZGF0ZSh1c2VybmFtZSk7XHJcbiAgICAgICAgICAgIHRoaXMuZXhwaXJ5QWxsRXhpc3RpbmdDdXJyZW50U2Vzc2lvbih1c2VybmFtZSwgbmV3UGFzc3dvcmQpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xyXG4gICAgICAgICAgICB0aGlzLm5vT2ZBdHRlbXB0cyA9IHRoaXMubm9PZkF0dGVtcHRzICsgMTtcclxuICAgICAgICAgICAgdGhpcy52ZXJpZnlBbmRTZXROZXdQYXNzd29yZEVycm9yTWVzc2FnZSA9IHRoaXMuZm9yZ290UGFzc3dvcmRFcnJvcihlcnIsIHRoaXMubm9PZkF0dGVtcHRzKTtcclxuICAgICAgICAgICAgdGhpcy5mb3Jnb3RQYXNzd29yZEFuZEdsb2JhbFNpZ25vdXRMb2FkZXIgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZm9yZ290UGFzc3dvcmRFcnJvcihlcnI6IGFueSwgbm9PZkF0dGVtcHRzOiBudW1iZXIpIHtcclxuICAgICAgICBsZXQgZXJyb3JNZXNzYWdlO1xyXG4gICAgICAgIHN3aXRjaCAoZXJyLmNvZGUpIHtcclxuICAgICAgICAgICAgY2FzZSBcIkxpbWl0RXhjZWVkZWRFeGNlcHRpb25cIjpcclxuICAgICAgICAgICAgICAgIHRoaXMuc2Vzc2lvbkxvY2tlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSBMb2dpbkNvbnN0YW50LmF0dGVtcHRMaW1pdEV4Y2VlZGVkO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJFeHBpcmVkQ29kZUV4Y2VwdGlvblwiOlxyXG4gICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gTG9naW5Db25zdGFudC5zZXNzaW9uRXhwaXJlZDtcclxuICAgICAgICAgICAgICAgIHRoaXMudmVyaWZ5QW5kU2V0TmV3UGFzc3dvcmRCdXR0b24gPSBMb2dpbkNvbnN0YW50LnJlZ2VuZXJhdGVPdHA7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9IExvZ2luQ29uc3RhbnQuYXR0ZW1wdCArIFwiIFwiICsgbm9PZkF0dGVtcHRzICsgTG9naW5Db25zdGFudC5hdHRlbXB0TWVzc2FnZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGVycm9yTWVzc2FnZTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgc2lnbkluV2l0aER1bygpIHtcclxuICAgICAgICB0aGlzLmNvbnN1bWluZ1Byb2plY3RBdXRoU2VydmljZS5zaWduSW5XaXRoRHVvKCk7XHJcbiAgICB9XHJcblxyXG4gICAgc2lnbkluV2l0aENvZ25pdG8oKXtcclxuICAgICAgICB0aGlzLmNvbnN1bWluZ1Byb2plY3RBdXRoU2VydmljZS5zaWduSW5XaXRoQ29nbml0bygpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGhhbmRsZVNpZ25PdXQoKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgYXdhaXQgc2lnbk91dCh7IGdsb2JhbDogZmFsc2UgfSk7XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coJ2Vycm9yIHNpZ25pbmcgb3V0OiAnLCBlcnJvcik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGV4cGlyeUFsbEV4aXN0aW5nQ3VycmVudFNlc3Npb24odXNlcm5hbWU6IHN0cmluZywgbmV3UGFzc3dvcmQ6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMuc2V0VXNlckRldGFpbHMoKTtcclxuICAgICAgICB0aGlzLm9uTG9naW5JbkNvZ250aW9Ub0dldEFjY2Vzc1Rva2VuKHVzZXJuYW1lLCBuZXdQYXNzd29yZCk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0VXNlckRldGFpbHMoKSB7XHJcbiAgICAgICAgdGhpcy5sb2dpbkVycm9yTWVzc2FnZSA9IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgb25Mb2dpbkluQ29nbnRpb1RvR2V0QWNjZXNzVG9rZW4odXNlcm5hbWU6IHN0cmluZywgcGFzc3dvcmQ6IHN0cmluZykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHsgaXNTaWduZWRJbiwgbmV4dFN0ZXAgfSA9IGF3YWl0IHNpZ25Jbih7IHVzZXJuYW1lLCBwYXNzd29yZCB9KTtcclxuICAgICAgICAgICAgbGV0IHNlc3Npb24gPSBhd2FpdCBmZXRjaEF1dGhTZXNzaW9uKCk7XHJcbiAgICAgICAgICAgIHN3aXRjaCAobmV4dFN0ZXA/LnNpZ25JblN0ZXApIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJET05FXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRBbGxDb2duaXRvVG9rZW5BbmRHcm91cHMoc2Vzc2lvbi50b2tlbnMpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25DYWxsR2xvYmFsU2lnbm91dCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkgeyB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgb25DYWxsR2xvYmFsU2lnbm91dCgpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBhd2FpdCBzaWduT3V0KHsgZ2xvYmFsOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICB0aGlzLmZvcmdvdFBhc3N3b3JkQW5kR2xvYmFsU2lnbm91dExvYWRlciA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbTG9naW5Db25zdGFudC5sb2dpblBhZ2VVcmxdKTtcclxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnZXJyb3Igc2lnbmluZyBvdXQ6ICcsIGVycm9yKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuIl19
@@ -4,6 +4,7 @@
4
4
  export * from './lib/anna-cognito-lib.module';
5
5
  //COMPONENTS
6
6
  export * from './lib/components/login/login.component';
7
+ export * from './lib/components/duo-sso-login/duo-sso-login.component';
7
8
  export * from './lib/components/forgot-password/forgot-password.component';
8
9
  export * from './lib/components/set-new-password/set-new-password.component';
9
10
  export * from './lib/components/password-matching/password-matching.component';
@@ -22,4 +23,4 @@ export * from './lib/services/config.service';
22
23
  export * from './lib/directives/spinner-button';
23
24
  //CONSTANTS
24
25
  export * from './lib/constants/loginConstant';
25
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL2FubmEtY29nbml0by1saWIvc3JjL3B1YmxpYy1hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLCtCQUErQixDQUFDO0FBRTlDLGFBQWE7QUFDYixjQUFjLHdDQUF3QyxDQUFDO0FBQ3ZELGNBQWMsNERBQTRELENBQUM7QUFDM0UsY0FBYyw4REFBOEQsQ0FBQztBQUM3RSxjQUFjLGdFQUFnRSxDQUFDO0FBQy9FLGNBQWMsb0ZBQW9GLENBQUM7QUFDbkcsY0FBYyw0RUFBNEUsQ0FBQztBQUMzRixjQUFjLDhFQUE4RSxDQUFDO0FBQzdGLGNBQWMsb0VBQW9FLENBQUM7QUFFbkYsV0FBVztBQUNYLGNBQWMsNkJBQTZCLENBQUM7QUFDNUMsY0FBYyw0QkFBNEIsQ0FBQztBQUMzQyxjQUFjLGlDQUFpQyxDQUFDO0FBQ2hELGNBQWMsZ0NBQWdDLENBQUM7QUFDL0MsY0FBYyxtQ0FBbUMsQ0FBQztBQUNsRCxjQUFjLCtCQUErQixDQUFDO0FBRTlDLGFBQWE7QUFDYixjQUFjLGlDQUFpQyxDQUFDO0FBRWhELFlBQVk7QUFDWixjQUFjLCtCQUErQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcclxuICogUHVibGljIEFQSSBTdXJmYWNlIG9mIGFubmEtY29nbml0by1saWJcclxuICovXHJcblxyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9hbm5hLWNvZ25pdG8tbGliLm1vZHVsZSc7XHJcblxyXG4vL0NPTVBPTkVOVFMgXHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbXBvbmVudHMvbG9naW4vbG9naW4uY29tcG9uZW50JztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvY29tcG9uZW50cy9mb3Jnb3QtcGFzc3dvcmQvZm9yZ290LXBhc3N3b3JkLmNvbXBvbmVudCc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbXBvbmVudHMvc2V0LW5ldy1wYXNzd29yZC9zZXQtbmV3LXBhc3N3b3JkLmNvbXBvbmVudCc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbXBvbmVudHMvcGFzc3dvcmQtbWF0Y2hpbmcvcGFzc3dvcmQtbWF0Y2hpbmcuY29tcG9uZW50JztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvY29tcG9uZW50cy92ZXJpZnktYW5kLXNldC1uZXctcGFzc3dvcmQvdmVyaWZ5LWFuZC1zZXQtbmV3LXBhc3N3b3JkLmNvbXBvbmVudCc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbXBvbmVudHMvdmVyc2lvbi1hbmQtdGVybS1wb2xpY3kvdmVyc2lvbi1hbmQtdGVybS1wb2xpY3kuY29tcG9uZW50JztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvY29tcG9uZW50cy9wb3dlcmVkLWJ5LWxvZ28tdGVtcGxhdGUvcG93ZXJlZC1ieS1sb2dvLXRlbXBsYXRlLmNvbXBvbmVudCc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbXBvbmVudHMvc3VyZXdhdmVzLXllYXItbG9nby9zdXJld2F2ZXMteWVhci1sb2dvLmNvbXBvbmVudCc7XHJcblxyXG4vL1NFUlZJQ0VTIFxyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9zZXJ2aWNlcy9hdXRoLnNlcnZpY2UnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9zZXJ2aWNlcy9hY2wuc2VydmljZSc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbmZpZy9hdXRoLXNlcnZpY2UudG9rZW4nO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb25maWcvYWNsLXNlcnZpY2UudG9rZW4nO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb25maWcvY29uZmlnLXNlcnZpY2UudG9rZW4nO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9zZXJ2aWNlcy9jb25maWcuc2VydmljZSc7XHJcblxyXG4vL0RJUkVDVElWRVMgXHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2RpcmVjdGl2ZXMvc3Bpbm5lci1idXR0b24nO1xyXG5cclxuLy9DT05TVEFOVFMgXHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbnN0YW50cy9sb2dpbkNvbnN0YW50JztcclxuXHJcblxyXG4iXX0=
26
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL2FubmEtY29nbml0by1saWIvc3JjL3B1YmxpYy1hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLCtCQUErQixDQUFDO0FBRTlDLGFBQWE7QUFDYixjQUFjLHdDQUF3QyxDQUFDO0FBQ3ZELGNBQWMsd0RBQXdELENBQUM7QUFDdkUsY0FBYyw0REFBNEQsQ0FBQztBQUMzRSxjQUFjLDhEQUE4RCxDQUFDO0FBQzdFLGNBQWMsZ0VBQWdFLENBQUM7QUFDL0UsY0FBYyxvRkFBb0YsQ0FBQztBQUNuRyxjQUFjLDRFQUE0RSxDQUFDO0FBQzNGLGNBQWMsOEVBQThFLENBQUM7QUFDN0YsY0FBYyxvRUFBb0UsQ0FBQztBQUVuRixXQUFXO0FBQ1gsY0FBYyw2QkFBNkIsQ0FBQztBQUM1QyxjQUFjLDRCQUE0QixDQUFDO0FBQzNDLGNBQWMsaUNBQWlDLENBQUM7QUFDaEQsY0FBYyxnQ0FBZ0MsQ0FBQztBQUMvQyxjQUFjLG1DQUFtQyxDQUFDO0FBQ2xELGNBQWMsK0JBQStCLENBQUM7QUFFOUMsYUFBYTtBQUNiLGNBQWMsaUNBQWlDLENBQUM7QUFFaEQsWUFBWTtBQUNaLGNBQWMsK0JBQStCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxyXG4gKiBQdWJsaWMgQVBJIFN1cmZhY2Ugb2YgYW5uYS1jb2duaXRvLWxpYlxyXG4gKi9cclxuXHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2FubmEtY29nbml0by1saWIubW9kdWxlJztcclxuXHJcbi8vQ09NUE9ORU5UUyBcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvY29tcG9uZW50cy9sb2dpbi9sb2dpbi5jb21wb25lbnQnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb21wb25lbnRzL2R1by1zc28tbG9naW4vZHVvLXNzby1sb2dpbi5jb21wb25lbnQnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb21wb25lbnRzL2ZvcmdvdC1wYXNzd29yZC9mb3Jnb3QtcGFzc3dvcmQuY29tcG9uZW50JztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvY29tcG9uZW50cy9zZXQtbmV3LXBhc3N3b3JkL3NldC1uZXctcGFzc3dvcmQuY29tcG9uZW50JztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvY29tcG9uZW50cy9wYXNzd29yZC1tYXRjaGluZy9wYXNzd29yZC1tYXRjaGluZy5jb21wb25lbnQnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb21wb25lbnRzL3ZlcmlmeS1hbmQtc2V0LW5ldy1wYXNzd29yZC92ZXJpZnktYW5kLXNldC1uZXctcGFzc3dvcmQuY29tcG9uZW50JztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvY29tcG9uZW50cy92ZXJzaW9uLWFuZC10ZXJtLXBvbGljeS92ZXJzaW9uLWFuZC10ZXJtLXBvbGljeS5jb21wb25lbnQnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb21wb25lbnRzL3Bvd2VyZWQtYnktbG9nby10ZW1wbGF0ZS9wb3dlcmVkLWJ5LWxvZ28tdGVtcGxhdGUuY29tcG9uZW50JztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvY29tcG9uZW50cy9zdXJld2F2ZXMteWVhci1sb2dvL3N1cmV3YXZlcy15ZWFyLWxvZ28uY29tcG9uZW50JztcclxuXHJcbi8vU0VSVklDRVMgXHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL3NlcnZpY2VzL2F1dGguc2VydmljZSc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL3NlcnZpY2VzL2FjbC5zZXJ2aWNlJztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvY29uZmlnL2F1dGgtc2VydmljZS50b2tlbic7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbmZpZy9hY2wtc2VydmljZS50b2tlbic7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbmZpZy9jb25maWctc2VydmljZS50b2tlbic7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL3NlcnZpY2VzL2NvbmZpZy5zZXJ2aWNlJztcclxuXHJcbi8vRElSRUNUSVZFUyBcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvZGlyZWN0aXZlcy9zcGlubmVyLWJ1dHRvbic7XHJcblxyXG4vL0NPTlNUQU5UUyBcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvY29uc3RhbnRzL2xvZ2luQ29uc3RhbnQnO1xyXG5cclxuXHJcbiJdfQ==