@nauth-toolkit/client-angular 0.1.64 → 0.1.66

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,25 +1,10 @@
1
1
  import { Injectable, Inject } from '@angular/core';
2
- import { catchError, switchMap, throwError, filter, take, BehaviorSubject, from } from 'rxjs';
3
2
  import { NAUTH_CLIENT_CONFIG } from './tokens';
3
+ import { createNAuthAuthHttpInterceptor } from '../lib/auth-interceptor.shared';
4
4
  import * as i0 from "@angular/core";
5
5
  import * as i1 from "@angular/common/http";
6
6
  import * as i2 from "./auth.service";
7
7
  import * as i3 from "@angular/router";
8
- /**
9
- * Refresh state management.
10
- */
11
- let isRefreshing = false;
12
- const refreshTokenSubject = new BehaviorSubject(null);
13
- const retriedRequests = new WeakSet();
14
- /**
15
- * Get CSRF token from cookie.
16
- */
17
- function getCsrfToken(cookieName) {
18
- if (typeof document === 'undefined')
19
- return null;
20
- const match = document.cookie.match(new RegExp(`(^| )${cookieName}=([^;]+)`));
21
- return match ? decodeURIComponent(match[2]) : null;
22
- }
23
8
  /**
24
9
  * Class-based HTTP interceptor for NgModule apps (Angular < 17).
25
10
  *
@@ -50,52 +35,14 @@ export class AuthInterceptorClass {
50
35
  this.router = router;
51
36
  }
52
37
  intercept(req, next) {
53
- const tokenDelivery = this.config.tokenDelivery;
54
- const baseUrl = this.config.baseUrl;
55
- // ============================================================================
56
- // COOKIES MODE: withCredentials + CSRF token
57
- // ============================================================================
58
- if (tokenDelivery === 'cookies') {
59
- let clonedReq = req.clone({ withCredentials: true });
60
- // Add CSRF token header if it's a mutating request
61
- if (['POST', 'PUT', 'PATCH', 'DELETE'].includes(req.method)) {
62
- const csrfToken = getCsrfToken(this.config.csrf?.cookieName || 'XSRF-TOKEN');
63
- if (csrfToken) {
64
- clonedReq = clonedReq.clone({
65
- setHeaders: { [this.config.csrf?.headerName || 'X-XSRF-TOKEN']: csrfToken },
66
- });
67
- }
68
- }
69
- return next.handle(clonedReq).pipe(catchError((error) => {
70
- if (error.status === 401 && !retriedRequests.has(req)) {
71
- retriedRequests.add(req);
72
- if (!isRefreshing) {
73
- isRefreshing = true;
74
- refreshTokenSubject.next(null);
75
- return from(this.http
76
- .post(`${baseUrl}/refresh`, {}, { withCredentials: true })
77
- .toPromise()).pipe(switchMap(() => {
78
- isRefreshing = false;
79
- refreshTokenSubject.next('refreshed');
80
- return next.handle(clonedReq);
81
- }), catchError((refreshError) => {
82
- isRefreshing = false;
83
- this.authService.logout();
84
- this.router.navigate([this.config.redirects?.sessionExpired || '/login']);
85
- return throwError(() => refreshError);
86
- }));
87
- }
88
- else {
89
- return refreshTokenSubject.pipe(filter((token) => token !== null), take(1), switchMap(() => next.handle(clonedReq)));
90
- }
91
- }
92
- return throwError(() => error);
93
- }));
94
- }
95
- // ============================================================================
96
- // JSON MODE: Delegate to SDK for token handling
97
- // ============================================================================
98
- return next.handle(req);
38
+ return createNAuthAuthHttpInterceptor({
39
+ config: this.config,
40
+ http: this.http,
41
+ authService: this.authService,
42
+ router: this.router,
43
+ req,
44
+ next: (r) => next.handle(r),
45
+ });
99
46
  }
100
47
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AuthInterceptorClass, deps: [{ token: NAUTH_CLIENT_CONFIG }, { token: i1.HttpClient }, { token: i2.AuthService }, { token: i3.Router }], target: i0.ɵɵFactoryTarget.Injectable });
101
48
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AuthInterceptorClass });
@@ -106,4 +53,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
106
53
  type: Inject,
107
54
  args: [NAUTH_CLIENT_CONFIG]
108
55
  }] }, { type: i1.HttpClient }, { type: i2.AuthService }, { type: i3.Router }] });
109
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5pbnRlcmNlcHRvci5jbGFzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9uZ21vZHVsZS9hdXRoLmludGVyY2VwdG9yLmNsYXNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBVW5ELE9BQU8sRUFBYyxVQUFVLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLGVBQWUsRUFBRSxJQUFJLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDMUcsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sVUFBVSxDQUFDOzs7OztBQUkvQzs7R0FFRztBQUNILElBQUksWUFBWSxHQUFHLEtBQUssQ0FBQztBQUN6QixNQUFNLG1CQUFtQixHQUFHLElBQUksZUFBZSxDQUFnQixJQUFJLENBQUMsQ0FBQztBQUNyRSxNQUFNLGVBQWUsR0FBRyxJQUFJLE9BQU8sRUFBd0IsQ0FBQztBQUU1RDs7R0FFRztBQUNILFNBQVMsWUFBWSxDQUFDLFVBQWtCO0lBQ3RDLElBQUksT0FBTyxRQUFRLEtBQUssV0FBVztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQ2pELE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLFFBQVEsVUFBVSxVQUFVLENBQUMsQ0FBQyxDQUFDO0lBQzlFLE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0FBQ3JELENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFFSCxNQUFNLE9BQU8sb0JBQW9CO0lBRWlCO0lBQzdCO0lBQ0E7SUFDQTtJQUpuQixZQUNnRCxNQUF5QixFQUN0RCxJQUFnQixFQUNoQixXQUF3QixFQUN4QixNQUFjO1FB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QUssSUFBSSxDQUFDLEVBQ2pDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFDUCxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUN4QyxDQUFDO29CQUNKLENBQUM7Z0JBQ0gsQ0FBQztnQkFFRCxPQUFPLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNqQyxDQUFDLENBQUMsQ0FDSCxDQUFDO1FBQ0osQ0FBQztRQUVELCtFQUErRTtRQUMvRSxnREFBZ0Q7UUFDaEQsK0VBQStFO1FBQy9FLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMxQixDQUFDO3dHQXhFVSxvQkFBb0Isa0JBRXJCLG1CQUFtQjs0R0FGbEIsb0JBQW9COzs0RkFBcEIsb0JBQW9CO2tCQURoQyxVQUFVOzswQkFHTixNQUFNOzJCQUFDLG1CQUFtQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIEluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgSHR0cEludGVyY2VwdG9yLFxuICBIdHRwUmVxdWVzdCxcbiAgSHR0cEhhbmRsZXIsXG4gIEh0dHBFdmVudCxcbiAgSHR0cENsaWVudCxcbiAgSHR0cEVycm9yUmVzcG9uc2UsXG59IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBjYXRjaEVycm9yLCBzd2l0Y2hNYXAsIHRocm93RXJyb3IsIGZpbHRlciwgdGFrZSwgQmVoYXZpb3JTdWJqZWN0LCBmcm9tIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBOQVVUSF9DTElFTlRfQ09ORklHIH0gZnJvbSAnLi90b2tlbnMnO1xuaW1wb3J0IHsgQXV0aFNlcnZpY2UgfSBmcm9tICcuL2F1dGguc2VydmljZSc7XG5pbXBvcnQgeyBOQXV0aENsaWVudENvbmZpZyB9IGZyb20gJ0BuYXV0aC10b29sa2l0L2NsaWVudCc7XG5cbi8qKlxuICogUmVmcmVzaCBzdGF0ZSBtYW5hZ2VtZW50LlxuICovXG5sZXQgaXNSZWZyZXNoaW5nID0gZmFsc2U7XG5jb25zdCByZWZyZXNoVG9rZW5TdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmcgfCBudWxsPihudWxsKTtcbmNvbnN0IHJldHJpZWRSZXF1ZXN0cyA9IG5ldyBXZWFrU2V0PEh0dHBSZXF1ZXN0PHVua25vd24+PigpO1xuXG4vKipcbiAqIEdldCBDU1JGIHRva2VuIGZyb20gY29va2llLlxuICovXG5mdW5jdGlvbiBnZXRDc3JmVG9rZW4oY29va2llTmFtZTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgbWF0Y2ggPSBkb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cChgKF58ICkke2Nvb2tpZU5hbWV9PShbXjtdKylgKSk7XG4gIHJldHVybiBtYXRjaCA/IGRlY29kZVVSSUNvbXBvbmVudChtYXRjaFsyXSkgOiBudWxsO1xufVxuXG4vKipcbiAqIENsYXNzLWJhc2VkIEhUVFAgaW50ZXJjZXB0b3IgZm9yIE5nTW9kdWxlIGFwcHMgKEFuZ3VsYXIgPCAxNykuXG4gKlxuICogRm9yIHN0YW5kYWxvbmUgY29tcG9uZW50cyAoQW5ndWxhciAxNyspLCB1c2UgdGhlIGZ1bmN0aW9uYWwgYGF1dGhJbnRlcmNlcHRvcmAgaW5zdGVhZC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gYXBwLm1vZHVsZS50c1xuICogaW1wb3J0IHsgSFRUUF9JTlRFUkNFUFRPUlMgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG4gKiBpbXBvcnQgeyBBdXRoSW50ZXJjZXB0b3JDbGFzcyB9IGZyb20gJ0BuYXV0aC10b29sa2l0L2NsaWVudC1hbmd1bGFyJztcbiAqXG4gKiBATmdNb2R1bGUoe1xuICogICBwcm92aWRlcnM6IFtcbiAqICAgICB7IHByb3ZpZGU6IEhUVFBfSU5URVJDRVBUT1JTLCB1c2VDbGFzczogQXV0aEludGVyY2VwdG9yQ2xhc3MsIG11bHRpOiB0cnVlIH1cbiAqICAgXVxuICogfSlcbiAqIGBgYFxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQXV0aEludGVyY2VwdG9yQ2xhc3MgaW1wbGVtZW50cyBIdHRwSW50ZXJjZXB0b3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KE5BVVRIX0NMSUVOVF9DT05GSUcpIHByaXZhdGUgcmVhZG9ubHkgY29uZmlnOiBOQXV0aENsaWVudENvbmZpZyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGh0dHA6IEh0dHBDbGllbnQsXG4gICAgcHJpdmF0ZSByZWFkb25seSBhdXRoU2VydmljZTogQXV0aFNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSByb3V0ZXI6IFJvdXRlcixcbiAgKSB7fVxuXG4gIGludGVyY2VwdChyZXE6IEh0dHBSZXF1ZXN0PHVua25vd24+LCBuZXh0OiBIdHRwSGFuZGxlcik6IE9ic2VydmFibGU8SHR0cEV2ZW50PHVua25vd24+PiB7XG4gICAgY29uc3QgdG9rZW5EZWxpdmVyeSA9IHRoaXMuY29uZmlnLnRva2VuRGVsaXZlcnk7XG4gICAgY29uc3QgYmFzZVVybCA9IHRoaXMuY29uZmlnLmJhc2VVcmw7XG5cbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gQ09PS0lFUyBNT0RFOiB3aXRoQ3JlZGVudGlhbHMgKyBDU1JGIHRva2VuXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIGlmICh0b2tlbkRlbGl2ZXJ5ID09PSAnY29va2llcycpIHtcbiAgICAgIGxldCBjbG9uZWRSZXEgPSByZXEuY2xvbmUoeyB3aXRoQ3JlZGVudGlhbHM6IHRydWUgfSk7XG5cbiAgICAgIC8vIEFkZCBDU1JGIHRva2VuIGhlYWRlciBpZiBpdCdzIGEgbXV0YXRpbmcgcmVxdWVzdFxuICAgICAgaWYgKFsnUE9TVCcsICdQVVQnLCAnUEFUQ0gnLCAnREVMRVRFJ10uaW5jbHVkZXMocmVxLm1ldGhvZCkpIHtcbiAgICAgICAgY29uc3QgY3NyZlRva2VuID0gZ2V0Q3NyZlRva2VuKHRoaXMuY29uZmlnLmNzcmY/LmNvb2tpZU5hbWUgfHwgJ1hTUkYtVE9LRU4nKTtcbiAgICAgICAgaWYgKGNzcmZUb2tlbikge1xuICAgICAgICAgIGNsb25lZFJlcSA9IGNsb25lZFJlcS5jbG9uZSh7XG4gICAgICAgICAgICBzZXRIZWFkZXJzOiB7IFt0aGlzLmNvbmZpZy5jc3JmPy5oZWFkZXJOYW1lIHx8ICdYLVhTUkYtVE9LRU4nXTogY3NyZlRva2VuIH0sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5leHQuaGFuZGxlKGNsb25lZFJlcSkucGlwZShcbiAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3I6IEh0dHBFcnJvclJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgaWYgKGVycm9yLnN0YXR1cyA9PT0gNDAxICYmICFyZXRyaWVkUmVxdWVzdHMuaGFzKHJlcSkpIHtcbiAgICAgICAgICAgIHJldHJpZWRSZXF1ZXN0cy5hZGQocmVxKTtcblxuICAgICAgICAgICAgaWYgKCFpc1JlZnJlc2hpbmcpIHtcbiAgICAgICAgICAgICAgaXNSZWZyZXNoaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgcmVmcmVzaFRva2VuU3ViamVjdC5uZXh0KG51bGwpO1xuXG4gICAgICAgICAgICAgIHJldHVybiBmcm9tKFxuICAgICAgICAgICAgICAgIHRoaXMuaHR0cFxuICAgICAgICAgICAgICAgICAgLnBvc3Q8eyBhY2Nlc3NUb2tlbj86IHN0cmluZyB9PihgJHtiYXNlVXJsfS9yZWZyZXNoYCwge30sIHsgd2l0aENyZWRlbnRpYWxzOiB0cnVlIH0pXG4gICAgICAgICAgICAgICAgICAudG9Qcm9taXNlKCksXG4gICAgICAgICAgICAgICkucGlwZShcbiAgICAgICAgICAgICAgICBzd2l0Y2hNYXAoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgaXNSZWZyZXNoaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICByZWZyZXNoVG9rZW5TdWJqZWN0Lm5leHQoJ3JlZnJlc2hlZCcpO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIG5leHQuaGFuZGxlKGNsb25lZFJlcSk7XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgY2F0Y2hFcnJvcigocmVmcmVzaEVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICBpc1JlZnJlc2hpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgIHRoaXMuYXV0aFNlcnZpY2UubG9nb3V0KCk7XG4gICAgICAgICAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbdGhpcy5jb25maWcucmVkaXJlY3RzPy5zZXNzaW9uRXhwaXJlZCB8fCAnL2xvZ2luJ10pO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gcmVmcmVzaEVycm9yKTtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiByZWZyZXNoVG9rZW5TdWJqZWN0LnBpcGUoXG4gICAgICAgICAgICAgICAgZmlsdGVyKCh0b2tlbikgPT4gdG9rZW4gIT09IG51bGwpLFxuICAgICAgICAgICAgICAgIHRha2UoMSksXG4gICAgICAgICAgICAgICAgc3dpdGNoTWFwKCgpID0+IG5leHQuaGFuZGxlKGNsb25lZFJlcSkpLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IGVycm9yKTtcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBKU09OIE1PREU6IERlbGVnYXRlIHRvIFNESyBmb3IgdG9rZW4gaGFuZGxpbmdcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgcmV0dXJuIG5leHQuaGFuZGxlKHJlcSk7XG4gIH1cbn1cbiJdfQ==
56
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5pbnRlcmNlcHRvci5jbGFzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9uZ21vZHVsZS9hdXRoLmludGVyY2VwdG9yLmNsYXNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBSW5ELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUcvQyxPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQzs7Ozs7QUFFaEY7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBRUgsTUFBTSxPQUFPLG9CQUFvQjtJQUVpQjtJQUM3QjtJQUNBO0lBQ0E7SUFKbkIsWUFDZ0QsTUFBeUIsRUFDdEQsSUFBZ0IsRUFDaEIsV0FBd0IsRUFDeEIsTUFBYztRQUhlLFdBQU0sR0FBTixNQUFNLENBQW1CO1FBQ3RELFNBQUksR0FBSixJQUFJLENBQVk7UUFDaEIsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDeEIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtJQUM5QixDQUFDO0lBRUosU0FBUyxDQUFDLEdBQXlCLEVBQUUsSUFBaUI7UUFDcEQsT0FBTyw4QkFBOEIsQ0FBQztZQUNwQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07WUFDbkIsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO1lBQ2YsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXO1lBQzdCLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtZQUNuQixHQUFHO1lBQ0gsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztTQUM1QixDQUFDLENBQUM7SUFDTCxDQUFDO3dHQWpCVSxvQkFBb0Isa0JBRXJCLG1CQUFtQjs0R0FGbEIsb0JBQW9COzs0RkFBcEIsb0JBQW9CO2tCQURoQyxVQUFVOzswQkFHTixNQUFNOzJCQUFDLG1CQUFtQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIEluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSHR0cEludGVyY2VwdG9yLCBIdHRwUmVxdWVzdCwgSHR0cEhhbmRsZXIsIEh0dHBFdmVudCwgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBOQVVUSF9DTElFTlRfQ09ORklHIH0gZnJvbSAnLi90b2tlbnMnO1xuaW1wb3J0IHsgQXV0aFNlcnZpY2UgfSBmcm9tICcuL2F1dGguc2VydmljZSc7XG5pbXBvcnQgeyBOQXV0aENsaWVudENvbmZpZyB9IGZyb20gJ0BuYXV0aC10b29sa2l0L2NsaWVudCc7XG5pbXBvcnQgeyBjcmVhdGVOQXV0aEF1dGhIdHRwSW50ZXJjZXB0b3IgfSBmcm9tICcuLi9saWIvYXV0aC1pbnRlcmNlcHRvci5zaGFyZWQnO1xuXG4vKipcbiAqIENsYXNzLWJhc2VkIEhUVFAgaW50ZXJjZXB0b3IgZm9yIE5nTW9kdWxlIGFwcHMgKEFuZ3VsYXIgPCAxNykuXG4gKlxuICogRm9yIHN0YW5kYWxvbmUgY29tcG9uZW50cyAoQW5ndWxhciAxNyspLCB1c2UgdGhlIGZ1bmN0aW9uYWwgYGF1dGhJbnRlcmNlcHRvcmAgaW5zdGVhZC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gYXBwLm1vZHVsZS50c1xuICogaW1wb3J0IHsgSFRUUF9JTlRFUkNFUFRPUlMgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG4gKiBpbXBvcnQgeyBBdXRoSW50ZXJjZXB0b3JDbGFzcyB9IGZyb20gJ0BuYXV0aC10b29sa2l0L2NsaWVudC1hbmd1bGFyJztcbiAqXG4gKiBATmdNb2R1bGUoe1xuICogICBwcm92aWRlcnM6IFtcbiAqICAgICB7IHByb3ZpZGU6IEhUVFBfSU5URVJDRVBUT1JTLCB1c2VDbGFzczogQXV0aEludGVyY2VwdG9yQ2xhc3MsIG11bHRpOiB0cnVlIH1cbiAqICAgXVxuICogfSlcbiAqIGBgYFxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQXV0aEludGVyY2VwdG9yQ2xhc3MgaW1wbGVtZW50cyBIdHRwSW50ZXJjZXB0b3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KE5BVVRIX0NMSUVOVF9DT05GSUcpIHByaXZhdGUgcmVhZG9ubHkgY29uZmlnOiBOQXV0aENsaWVudENvbmZpZyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGh0dHA6IEh0dHBDbGllbnQsXG4gICAgcHJpdmF0ZSByZWFkb25seSBhdXRoU2VydmljZTogQXV0aFNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSByb3V0ZXI6IFJvdXRlcixcbiAgKSB7fVxuXG4gIGludGVyY2VwdChyZXE6IEh0dHBSZXF1ZXN0PHVua25vd24+LCBuZXh0OiBIdHRwSGFuZGxlcik6IE9ic2VydmFibGU8SHR0cEV2ZW50PHVua25vd24+PiB7XG4gICAgcmV0dXJuIGNyZWF0ZU5BdXRoQXV0aEh0dHBJbnRlcmNlcHRvcih7XG4gICAgICBjb25maWc6IHRoaXMuY29uZmlnLFxuICAgICAgaHR0cDogdGhpcy5odHRwLFxuICAgICAgYXV0aFNlcnZpY2U6IHRoaXMuYXV0aFNlcnZpY2UsXG4gICAgICByb3V0ZXI6IHRoaXMucm91dGVyLFxuICAgICAgcmVxLFxuICAgICAgbmV4dDogKHIpID0+IG5leHQuaGFuZGxlKHIpLFxuICAgIH0pO1xuICB9XG59XG4iXX0=
@@ -404,7 +404,44 @@ export class AuthService {
404
404
  * ```
405
405
  */
406
406
  async respondToChallenge(response) {
407
+ // #region agent log
408
+ fetch('http://127.0.0.1:7242/ingest/97f9fe53-6a8b-43e2-ae9b-4b2d0f725816', {
409
+ method: 'POST',
410
+ headers: { 'Content-Type': 'application/json' },
411
+ body: JSON.stringify({
412
+ location: 'auth.service.ts:respondToChallenge:entry',
413
+ message: 'RespondToChallenge called',
414
+ data: {
415
+ challengeType: response.type,
416
+ hasSession: !!response.session,
417
+ },
418
+ timestamp: Date.now(),
419
+ sessionId: 'debug-session',
420
+ hypothesisId: 'H7',
421
+ }),
422
+ }).catch(() => { });
423
+ // #endregion
407
424
  const res = await this.client.respondToChallenge(response);
425
+ // #region agent log
426
+ fetch('http://127.0.0.1:7242/ingest/97f9fe53-6a8b-43e2-ae9b-4b2d0f725816', {
427
+ method: 'POST',
428
+ headers: { 'Content-Type': 'application/json' },
429
+ body: JSON.stringify({
430
+ location: 'auth.service.ts:respondToChallenge:response',
431
+ message: 'RespondToChallenge response received',
432
+ data: {
433
+ hasChallengeName: !!res.challengeName,
434
+ challengeName: res.challengeName,
435
+ hasAccessToken: !!res.accessToken,
436
+ hasRefreshToken: !!res.refreshToken,
437
+ hasUser: !!res.user,
438
+ },
439
+ timestamp: Date.now(),
440
+ sessionId: 'debug-session',
441
+ hypothesisId: 'H7',
442
+ }),
443
+ }).catch(() => { });
444
+ // #endregion
408
445
  return this.updateChallengeState(res);
409
446
  }
410
447
  /**
@@ -473,6 +510,22 @@ export class AuthService {
473
510
  await this.client.clearStoredChallenge();
474
511
  this.challengeSubject.next(null);
475
512
  }
513
+ /**
514
+ * Get current access token (JSON mode only).
515
+ *
516
+ * This is primarily useful for consumers using Angular `HttpClient` directly
517
+ * (outside of the SDK methods) and relying on an interceptor to attach Bearer tokens.
518
+ *
519
+ * @returns Access token, or null if not available
520
+ *
521
+ * @example
522
+ * ```typescript
523
+ * const token = await this.auth.getAccessToken();
524
+ * ```
525
+ */
526
+ async getAccessToken() {
527
+ return await this.client.getAccessToken();
528
+ }
476
529
  // ============================================================================
477
530
  // Social Authentication
478
531
  // ============================================================================
@@ -813,4 +866,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
813
866
  type: Inject,
814
867
  args: [NAUTH_CLIENT_CONFIG]
815
868
  }] }, { type: i1.AngularHttpAdapter }] });
816
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL25nbW9kdWxlL2F1dGguc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBWSxNQUFNLGVBQWUsQ0FBQztBQUM3RCxPQUFPLEVBQUUsZUFBZSxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM1RCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRS9DLE9BQU8sRUFDTCxXQUFXLEdBb0JaLE1BQU0sdUJBQXVCLENBQUM7OztBQUUvQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQStCRztBQUVILE1BQU0sT0FBTyxXQUFXO0lBQ0wsTUFBTSxDQUFjO0lBQ3BCLE1BQU0sQ0FBb0I7SUFDMUIsa0JBQWtCLEdBQUcsSUFBSSxlQUFlLENBQWtCLElBQUksQ0FBQyxDQUFDO0lBQ2hFLHNCQUFzQixHQUFHLElBQUksZUFBZSxDQUFVLEtBQUssQ0FBQyxDQUFDO0lBQzdELGdCQUFnQixHQUFHLElBQUksZUFBZSxDQUFzQixJQUFJLENBQUMsQ0FBQztJQUNsRSxpQkFBaUIsR0FBRyxJQUFJLE9BQU8sRUFBYSxDQUFDO0lBQ3RELFdBQVcsR0FBRyxLQUFLLENBQUM7SUFFNUI7OztPQUdHO0lBQ0gsWUFBeUMsTUFBeUIsRUFBRSxXQUErQjtRQUNqRyxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUVyQixxREFBcUQ7UUFDckQsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLFdBQVcsSUFBSSxXQUFXLENBQUM7UUFDbEQsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2IsTUFBTSxJQUFJLEtBQUssQ0FDYiw2R0FBNkcsQ0FDOUcsQ0FBQztRQUNKLENBQUM7UUFFRCxJQUFJ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Q1QsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNuQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pDLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxvQkFBb0IsQ0FBQyxRQUFzQjtRQUNqRCxJQUFJLFFBQVEsQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUMzQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3ZDLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNuQyxDQUFDO1FBQ0QsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQzt3R0E3MEJVLFdBQVcsa0JBYUYsbUJBQW1COzRHQWI1QixXQUFXOzs0RkFBWCxXQUFXO2tCQUR2QixVQUFVOzswQkFjSSxNQUFNOzJCQUFDLG1CQUFtQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgT3B0aW9uYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZmlsdGVyIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgTkFVVEhfQ0xJRU5UX0NPTkZJRyB9IGZyb20gJy4vdG9rZW5zJztcbmltcG9ydCB7IEFuZ3VsYXJIdHRwQWRhcHRlciB9IGZyb20gJy4vaHR0cC1hZGFwdGVyJztcbmltcG9ydCB7XG4gIE5BdXRoQ2xpZW50LFxuICBOQXV0aENsaWVudENvbmZpZyxcbiAgQ2hhbGxlbmdlUmVzcG9uc2UsXG4gIEF1dGhSZXNwb25zZSxcbiAgVG9rZW5SZXNwb25zZSxcbiAgQXV0aFVzZXIsXG4gIENvbmZpcm1Gb3Jnb3RQYXNzd29yZFJlc3BvbnNlLFxuICBGb3Jnb3RQYXNzd29yZFJlc3BvbnNlLFxuICBSZXNldFBhc3N3b3JkV2l0aENvZGVSZXNwb25zZSxcbiAgVXBkYXRlUHJvZmlsZVJlcXVlc3QsXG4gIEdldENoYWxsZW5nZURhdGFSZXNwb25zZSxcbiAgR2V0U2V0dXBEYXRhUmVzcG9uc2UsXG4gIE1GQVN0YXR1cyxcbiAgTUZBRGV2aWNlLFxuICBBdXRoRXZlbnQsXG4gIFNvY2lhbFByb3ZpZGVyLFxuICBTb2NpYWxMb2dpbk9wdGlvbnMsXG4gIExpbmtlZEFjY291bnRzUmVzcG9uc2UsXG4gIFNvY2lhbFZlcmlmeVJlcXVlc3QsXG4gIEF1ZGl0SGlzdG9yeVJlc3BvbnNlLFxufSBmcm9tICdAbmF1dGgtdG9vbGtpdC9jbGllbnQnO1xuXG4vKipcbiAqIEFuZ3VsYXIgd3JhcHBlciBhcm91bmQgTkF1dGhDbGllbnQgdGhhdCBwcm92aWRlcyBwcm9taXNlLWJhc2VkIGF1dGggbWV0aG9kcyBhbmQgcmVhY3RpdmUgc3RhdGUuXG4gKlxuICogVGhpcyBzZXJ2aWNlIHByb3ZpZGVzOlxuICogLSBSZWFjdGl2ZSBzdGF0ZSAoY3VycmVudFVzZXIkLCBpc0F1dGhlbnRpY2F0ZWQkLCBjaGFsbGVuZ2UkKVxuICogLSBBbGwgY29yZSBhdXRoIG1ldGhvZHMgYXMgUHJvbWlzZXMgKGxvZ2luLCBzaWdudXAsIGxvZ291dCwgcmVmcmVzaClcbiAqIC0gUHJvZmlsZSBtYW5hZ2VtZW50IChnZXRQcm9maWxlLCB1cGRhdGVQcm9maWxlLCBjaGFuZ2VQYXNzd29yZClcbiAqIC0gQ2hhbGxlbmdlIGZsb3cgbWV0aG9kcyAocmVzcG9uZFRvQ2hhbGxlbmdlLCByZXNlbmRDb2RlKVxuICogLSBNRkEgbWFuYWdlbWVudCAoZ2V0TWZhU3RhdHVzLCBzZXR1cE1mYURldmljZSwgZXRjLilcbiAqIC0gU29jaWFsIGF1dGhlbnRpY2F0aW9uIGFuZCBhY2NvdW50IGxpbmtpbmdcbiAqIC0gRGV2aWNlIHRydXN0IG1hbmFnZW1lbnRcbiAqIC0gQXVkaXQgaGlzdG9yeVxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdHJ1Y3Rvcihwcml2YXRlIGF1dGg6IEF1dGhTZXJ2aWNlKSB7fVxuICpcbiAqIC8vIFJlYWN0aXZlIHN0YXRlXG4gKiB0aGlzLmF1dGguY3VycmVudFVzZXIkLnN1YnNjcmliZSh1c2VyID0+IC4uLik7XG4gKiB0aGlzLmF1dGguaXNBdXRoZW50aWNhdGVkJC5zdWJzY3JpYmUoaXNBdXRoID0+IC4uLik7XG4gKlxuICogLy8gQXV0aCBvcGVyYXRpb25zIHdpdGggYXN5bmMvYXdhaXRcbiAqIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5hdXRoLmxvZ2luKGVtYWlsLCBwYXNzd29yZCk7XG4gKlxuICogLy8gUHJvZmlsZSBtYW5hZ2VtZW50XG4gKiBhd2FpdCB0aGlzLmF1dGguY2hhbmdlUGFzc3dvcmQob2xkUGFzc3dvcmQsIG5ld1Bhc3N3b3JkKTtcbiAqIGNvbnN0IHVzZXIgPSBhd2FpdCB0aGlzLmF1dGgudXBkYXRlUHJvZmlsZSh7IGZpcnN0TmFtZTogJ0pvaG4nIH0pO1xuICpcbiAqIC8vIE1GQSBvcGVyYXRpb25zXG4gKiBjb25zdCBzdGF0dXMgPSBhd2FpdCB0aGlzLmF1dGguZ2V0TWZhU3RhdHVzKCk7XG4gKiBgYGBcbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEF1dGhTZXJ2aWNlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBjbGllbnQ6IE5BdXRoQ2xpZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZzogTkF1dGhDbGllbnRDb25maWc7XG4gIHByaXZhdGUgcmVhZG9ubHkgY3VycmVudFVzZXJTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxBdXRoVXNlciB8IG51bGw+KG51bGwpO1xuICBwcml2YXRlIHJlYWRvbmx5IGlzQXV0aGVudGljYXRlZFN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBjaGFsbGVuZ2VTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxBdXRoUmVzcG9uc2UgfCBudWxsPihudWxsKTtcbiAgcHJpdmF0ZSByZWFkb25seSBhdXRoRXZlbnRzU3ViamVjdCA9IG5ldyBTdWJqZWN0PEF1dGhFdmVudD4oKTtcbiAgcHJpdmF0ZSBpbml0aWFsaXplZCA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gY29uZmlnIC0gSW5qZWN0ZWQgY2xpZW50IGNvbmZpZ3VyYXRpb24gKHJlcXVpcmVkKVxuICAgKiBAcGFyYW0gaHR0cEFkYXB0ZXIgLSBBbmd1bGFyIEhUVFAgYWRhcHRlciBmb3IgbWFraW5nIHJlcXVlc3RzIChyZXF1aXJlZClcbiAgICovXG4gIGNvbnN0cnVjdG9yKEBJbmplY3QoTkFVVEhfQ0xJRU5UX0NPTkZJRykgY29uZmlnOiBOQXV0aENsaWVudENvbmZpZywgaHR0cEFkYXB0ZXI6IEFuZ3VsYXJIdHRwQWRhcHRlcikge1xuICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuXG4gICAgLy8gVXNlIHByb3ZpZGVkIGh0dHBBZGFwdGVyIChmcm9tIGNvbmZpZyBvciBpbmplY3RlZClcbiAgICBjb25zdCBhZGFwdGVyID0gY29uZmlnLmh0dHBBZGFwdGVyID8/IGh0dHBBZGFwdGVyO1xuICAgIGlmICghYWRhcHRlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnSHR0cEFkYXB0ZXIgbm90IGZvdW5kLiBFaXRoZXIgcHJvdmlkZSBodHRwQWRhcHRlciBpbiBOQVVUSF9DTElFTlRfQ09ORklHIG9yIGVuc3VyZSBIdHRwQ2xpZW50IGlzIGF2YWlsYWJsZS4nLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLmNsaWVudCA9IG5ldyBOQXV0aENsaWVudCh7XG4gICAgICAuLi5jb25maWcsXG4gICAgICBodHRwQWRhcHRlcjogYWRhcHRlcixcbiAgICAgIG9uQXV0aFN0YXRlQ2hhbmdlOiAodXNlcikgPT4ge1xuICAgICAgICB0aGlzLmN1cnJlbnRVc2VyU3ViamVjdC5uZXh0KHVzZXIpO1xuICAgICAgICB0aGlzLmlzQXV0aGVudGljYXRlZFN1YmplY3QubmV4dChCb29sZWFuKHVzZXIpKTtcbiAgICAgICAgY29uZmlnLm9uQXV0aFN0YXRlQ2hhbmdlPy4odXNlcik7XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8gRm9yd2FyZCBhbGwgY2xpZW50IGV2ZW50cyB0byBPYnNlcnZhYmxlIHN0cmVhbVxuICAgIHRoaXMuY2xpZW50Lm9uKCcqJywgKGV2ZW50KSA9PiB7XG4gICAgICB0aGlzLmF1dGhFdmVudHNTdWJqZWN0Lm5leHQoZXZlbnQpO1xuICAgIH0pO1xuXG4gICAgLy8gQXV0by1pbml0aWFsaXplIG9uIGNvbnN0cnVjdGlvbiAoaHlkcmF0ZSBmcm9tIHN0b3JhZ2UpXG4gICAgdGhpcy5pbml0aWFsaXplKCk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFJlYWN0aXZlIFN0YXRlIE9ic2VydmFibGVzXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogQ3VycmVudCB1c2VyIG9ic2VydmFibGUuXG4gICAqL1xuICBnZXQgY3VycmVudFVzZXIkKCk6IE9ic2VydmFibGU8QXV0aFVzZXIgfCBudWxsPiB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFVzZXJTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEF1dGhlbnRpY2F0ZWQgc3RhdGUgb2JzZXJ2YWJsZS5cbiAgICovXG4gIGdldCBpc0F1dGhlbnRpY2F0ZWQkKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLmlzQXV0aGVudGljYXRlZFN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICAvKipcbiAgICogQ3VycmVudCBjaGFsbGVuZ2Ugb2JzZXJ2YWJsZSAoZm9yIHJlYWN0aXZlIGNoYWxsZW5nZSBuYXZpZ2F0aW9uKS5cbiAgICovXG4gIGdldCBjaGFsbGVuZ2UkKCk6IE9ic2VydmFibGU8QXV0aFJlc3BvbnNlIHwgbnVsbD4ge1xuICAgIHJldHVybiB0aGlzLmNoYWxsZW5nZVN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICAvKipcbiAgICogQXV0aGVudGljYXRpb24gZXZlbnRzIHN0cmVhbS5cbiAgICogRW1pdHMgYWxsIGF1dGggbGlmZWN5Y2xlIGV2ZW50cyBmb3IgY3VzdG9tIGxvZ2ljLCBhbmFseXRpY3MsIG9yIFVJIHVwZGF0ZXMuXG4gICAqL1xuICBnZXQgYXV0aEV2ZW50cyQoKTogT2JzZXJ2YWJsZTxBdXRoRXZlbnQ+IHtcbiAgICByZXR1cm4gdGhpcy5hdXRoRXZlbnRzU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWNjZXNzZnVsIGF1dGhlbnRpY2F0aW9uIGV2ZW50cyBzdHJlYW0uXG4gICAqIEVtaXRzIHdoZW4gdXNlciBzdWNjZXNzZnVsbHkgYXV0aGVudGljYXRlcyAobG9naW4sIHNpZ251cCwgc29jaWFsIGF1dGgpLlxuICAgKi9cbiAgZ2V0IGF1dGhTdWNjZXNzJCgpOiBPYnNlcnZhYmxlPEF1dGhFdmVudD4ge1xuICAgIHJldHVybiB0aGlzLmF1dGhFdmVudHNTdWJqZWN0LnBpcGUoZmlsdGVyKChlKSA9PiBlLnR5cGUgPT09ICdhdXRoOnN1Y2Nlc3MnKSk7XG4gIH1cblxuICAvKipcbiAgICogQXV0aGVudGljYXRpb24gZXJyb3IgZXZlbnRzIHN0cmVhbS5cbiAgICogRW1pdHMgd2hlbiBhdXRoZW50aWNhdGlvbiBmYWlscyAobG9naW4gZXJyb3IsIE9BdXRoIGVycm9yLCBldGMuKS5cbiAgICovXG4gIGdldCBhdXRoRXJyb3IkKCk6IE9ic2VydmFibGU8QXV0aEV2ZW50PiB7XG4gICAgcmV0dXJuIHRoaXMuYXV0aEV2ZW50c1N1YmplY3QucGlwZShmaWx0ZXIoKGUpID0+IGUudHlwZSA9PT0gJ2F1dGg6ZXJyb3InIHx8IGUudHlwZSA9PT0gJ29hdXRoOmVycm9yJykpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBTeW5jIFN0YXRlIEFjY2Vzc29ycyAoZm9yIGd1YXJkcywgdGVtcGxhdGVzKVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGF1dGhlbnRpY2F0ZWQgKHN5bmMsIHVzZXMgY2FjaGVkIHN0YXRlKS5cbiAgICovXG4gIGlzQXV0aGVudGljYXRlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQuaXNBdXRoZW50aWNhdGVkU3luYygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjdXJyZW50IHVzZXIgKHN5bmMsIHVzZXMgY2FjaGVkIHN0YXRlKS5cbiAgICovXG4gIGdldEN1cnJlbnRVc2VyKCk6IEF1dGhVc2VyIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmdldEN1cnJlbnRVc2VyKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGN1cnJlbnQgY2hhbGxlbmdlIChzeW5jKS5cbiAgICovXG4gIGdldEN1cnJlbnRDaGFsbGVuZ2UoKTogQXV0aFJlc3BvbnNlIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuY2hhbGxlbmdlU3ViamVjdC52YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY2hhbGxlbmdlIHJvdXRlciBmb3IgbWFudWFsIG5hdmlnYXRpb24gY29udHJvbC5cbiAgICogVXNlZnVsIGZvciBndWFyZHMgdGhhdCBuZWVkIHRvIGhhbmRsZSBlcnJvcnMgb3IgYnVpbGQgY3VzdG9tIFVSTHMuXG4gICAqXG4gICAqIEByZXR1cm5zIENoYWxsZW5nZVJvdXRlciBpbnN0YW5jZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHJvdXRlciA9IHRoaXMuYXV0aC5nZXRDaGFsbGVuZ2VSb3V0ZXIoKTtcbiAgICogYXdhaXQgcm91dGVyLm5hdmlnYXRlVG9FcnJvcignb2F1dGgnKTtcbiAgICogYGBgXG4gICAqL1xuICBnZXRDaGFsbGVuZ2VSb3V0ZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmdldENoYWxsZW5nZVJvdXRlcigpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBDb3JlIEF1dGggTWV0aG9kc1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIExvZ2luIHdpdGggaWRlbnRpZmllciBhbmQgcGFzc3dvcmQuXG4gICAqXG4gICAqIEBwYXJhbSBpZGVudGlmaWVyIC0gVXNlciBlbWFpbCBvciB1c2VybmFtZVxuICAgKiBAcGFyYW0gcGFzc3dvcmQgLSBVc2VyIHBhc3N3b3JkXG4gICAqIEByZXR1cm5zIFByb21pc2Ugd2l0aCBhdXRoIHJlc3BvbnNlIG9yIGNoYWxsZW5nZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5hdXRoLmxvZ2luKCd1c2VyQGV4YW1wbGUuY29tJywgJ3Bhc3N3b3JkJyk7XG4gICAqIGlmIChyZXNwb25zZS5jaGFsbGVuZ2VOYW1lKSB7XG4gICAqICAgLy8gSGFuZGxlIGNoYWxsZW5nZVxuICAgKiB9IGVsc2Uge1xuICAgKiAgIC8vIExvZ2luIHN1Y2Nlc3NmdWxcbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGxvZ2luKGlkZW50aWZpZXI6IHN0cmluZywgcGFzc3dvcmQ6IHN0cmluZyk6IFByb21pc2U8QXV0aFJlc3BvbnNlPiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5jbGllbnQubG9naW4oaWRlbnRpZmllciwgcGFzc3dvcmQpO1xuICAgIHJldHVybiB0aGlzLnVwZGF0ZUNoYWxsZW5nZVN0YXRlKHJlcyk7XG4gIH1cblxuICAvKipcbiAgICogU2lnbnVwIHdpdGggY3JlZGVudGlhbHMuXG4gICAqXG4gICAqIEBwYXJhbSBwYXlsb2FkIC0gU2lnbnVwIHJlcXVlc3QgcGF5bG9hZFxuICAgKiBAcmV0dXJucyBQcm9taXNlIHdpdGggYXV0aCByZXNwb25zZSBvciBjaGFsbGVuZ2VcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuYXV0aC5zaWdudXAoe1xuICAgKiAgIGVtYWlsOiAnbmV3QGV4YW1wbGUuY29tJyxcbiAgICogICBwYXNzd29yZDogJ1NlY3VyZVBhc3MxMjMhJyxcbiAgICogICBmaXJzdE5hbWU6ICdKb2huJyxcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgc2lnbnVwKHBheWxvYWQ6IFBhcmFtZXRlcnM8TkF1dGhDbGllbnRbJ3NpZ251cCddPlswXSk6IFByb21pc2U8QXV0aFJlc3BvbnNlPiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5jbGllbnQuc2lnbnVwKHBheWxvYWQpO1xuICAgIHJldHVybiB0aGlzLnVwZGF0ZUNoYWxsZW5nZVN0YXRlKHJlcyk7XG4gIH1cblxuICAvKipcbiAgICogTG9nb3V0IGN1cnJlbnQgc2Vzc2lvbi5cbiAgICpcbiAgICogQHBhcmFtIGZvcmdldERldmljZSAtIElmIHRydWUsIHJlbW92ZXMgZGV2aWNlIHRydXN0XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogYXdhaXQgdGhpcy5hdXRoLmxvZ291dCgpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGxvZ291dChmb3JnZXREZXZpY2U/OiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5jbGllbnQubG9nb3V0KGZvcmdldERldmljZSk7XG4gICAgdGhpcy5jaGFsbGVuZ2VTdWJqZWN0Lm5leHQobnVsbCk7XG4gICAgLy8gRXhwbGljaXRseSB1cGRhdGUgYXV0aCBzdGF0ZSBhZnRlciBsb2dvdXRcbiAgICB0aGlzLmN1cnJlbnRVc2VyU3ViamVjdC5uZXh0KG51bGwpO1xuICAgIHRoaXMuaXNBdXRoZW50aWNhdGVkU3ViamVjdC5uZXh0KGZhbHNlKTtcblxuICAgIC8vIENsZWFyIENTUkYgdG9rZW4gY29va2llIGlmIGluIGNvb2tpZXMgbW9kZVxuICAgIC8vIE5vdGU6IEJhY2tlbmQgc2hvdWxkIGNsZWFyIGh0dHBPbmx5IGNvb2tpZXMsIGJ1dCB3ZSBjbGVhciBub24taHR0cE9ubHkgb25lc1xuICAgIGlmICh0aGlzLmNvbmZpZy50b2tlbkRlbGl2ZXJ5ID09PSAnY29va2llcycgJiYgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgY29uc3QgY3NyZkNvb2tpZU5hbWUgPSB0aGlzLmNvbmZpZy5jc3JmPy5jb29raWVOYW1lID8/ICduYXV0aF9jc3JmX3Rva2VuJztcbiAgICAgIC8vIEV4dHJhY3QgZG9tYWluIGZyb20gYmFzZVVybCBpZiBwb3NzaWJsZVxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdXJsID0gbmV3IFVSTCh0aGlzLmNvbmZpZy5iYXNlVXJsKTtcbiAgICAgICAgZG9jdW1lbnQuY29va2llID0gYCR7Y3NyZkNvb2tpZU5hbWV9PTsgZXhwaXJlcz1UaHUsIDAxIEphbiAxOTcwIDAwOjAwOjAwIFVUQzsgcGF0aD0vOyBkb21haW49JHt1cmwuaG9zdG5hbWV9YDtcbiAgICAgICAgLy8gQWxzbyB0cnkgd2l0aG91dCBkb21haW4gKGZvciBsb2NhbGhvc3QpXG4gICAgICAgIGRvY3VtZW50LmNvb2tpZSA9IGAke2NzcmZDb29raWVOYW1lfT07IGV4cGlyZXM9VGh1LCAwMSBKYW4gMTk3MCAwMDowMDowMCBVVEM7IHBhdGg9L2A7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gRmFsbGJhY2sgaWYgYmFzZVVybCBwYXJzaW5nIGZhaWxzXG4gICAgICAgIGRvY3VtZW50LmNvb2tpZSA9IGAke2NzcmZDb29raWVOYW1lfT07IGV4cGlyZXM9VGh1LCAwMSBKYW4gMTk3MCAwMDowMDowMCBVVEM7IHBhdGg9L2A7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIExvZ291dCBhbGwgc2Vzc2lvbnMuXG4gICAqXG4gICAqIFJldm9rZXMgYWxsIGFjdGl2ZSBzZXNzaW9ucyBmb3IgdGhlIGN1cnJlbnQgdXNlciBhY3Jvc3MgYWxsIGRldmljZXMuXG4gICAqIE9wdGlvbmFsbHkgcmV2b2tlcyBhbGwgdHJ1c3RlZCBkZXZpY2VzIGlmIGZvcmdldERldmljZXMgaXMgdHJ1ZS5cbiAgICpcbiAgICogQHBhcmFtIGZvcmdldERldmljZXMgLSBJZiB0cnVlLCBhbHNvIHJldm9rZXMgYWxsIHRydXN0ZWQgZGV2aWNlcyAoZGVmYXVsdDogZmFsc2UpXG4gICAqIEByZXR1cm5zIFByb21pc2Ugd2l0aCBudW1iZXIgb2Ygc2Vzc2lvbnMgcmV2b2tlZFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYXV0aC5sb2dvdXRBbGwoKTtcbiAgICogY29uc29sZS5sb2coYFJldm9rZWQgJHtyZXN1bHQucmV2b2tlZENvdW50fSBzZXNzaW9uc2ApO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGxvZ291dEFsbChmb3JnZXREZXZpY2VzPzogYm9vbGVhbik6IFByb21pc2U8eyByZXZva2VkQ291bnQ6IG51bWJlciB9PiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5jbGllbnQubG9nb3V0QWxsKGZvcmdldERldmljZXMpO1xuICAgIHRoaXMuY2hhbGxlbmdlU3ViamVjdC5uZXh0KG51bGwpO1xuICAgIC8vIEV4cGxpY2l0bHkgdXBkYXRlIGF1dGggc3RhdGUgYWZ0ZXIgbG9nb3V0XG4gICAgdGhpcy5jdXJyZW50VXNlclN1YmplY3QubmV4dChudWxsKTtcbiAgICB0aGlzLmlzQXV0aGVudGljYXRlZFN1YmplY3QubmV4dChmYWxzZSk7XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWZyZXNoIHRva2Vucy5cbiAgICpcbiAgICogQHJldHVybnMgUHJvbWlzZSB3aXRoIG5ldyB0b2tlbnNcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCB0b2tlbnMgPSBhd2FpdCB0aGlzLmF1dGgucmVmcmVzaCgpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIHJlZnJlc2goKTogUHJvbWlzZTxUb2tlblJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LnJlZnJlc2hUb2tlbnMoKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQWNjb3VudCBSZWNvdmVyeSAoRm9yZ290IFBhc3N3b3JkKVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIFJlcXVlc3QgYSBwYXNzd29yZCByZXNldCBjb2RlIChmb3Jnb3QgcGFzc3dvcmQpLlxuICAgKlxuICAgKiBAcGFyYW0gaWRlbnRpZmllciAtIFVzZXIgZW1haWwsIHVzZXJuYW1lLCBvciBwaG9uZVxuICAgKiBAcmV0dXJucyBQcm9taXNlIHdpdGggcGFzc3dvcmQgcmVzZXQgcmVzcG9uc2VcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBhd2FpdCB0aGlzLmF1dGguZm9yZ290UGFzc3dvcmQoJ3VzZXJAZXhhbXBsZS5jb20nKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBmb3Jnb3RQYXNzd29yZChpZGVudGlmaWVyOiBzdHJpbmcpOiBQcm9taXNlPEZvcmdvdFBhc3N3b3JkUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQuZm9yZ290UGFzc3dvcmQoaWRlbnRpZmllcik7XG4gIH1cblxuICAvKipcbiAgICogQ29uZmlybSBhIHBhc3N3b3JkIHJlc2V0IGNvZGUgYW5kIHNldCBhIG5ldyBwYXNzd29yZC5cbiAgICpcbiAgICogQHBhcmFtIGlkZW50aWZpZXIgLSBVc2VyIGVtYWlsLCB1c2VybmFtZSwgb3IgcGhvbmVcbiAgICogQHBhcmFtIGNvZGUgLSBPbmUtdGltZSByZXNldCBjb2RlXG4gICAqIEBwYXJhbSBuZXdQYXNzd29yZCAtIE5ldyBwYXNzd29yZFxuICAgKiBAcmV0dXJucyBQcm9taXNlIHdpdGggY29uZmlybWF0aW9uIHJlc3BvbnNlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogYXdhaXQgdGhpcy5hdXRoLmNvbmZpcm1Gb3Jnb3RQYXNzd29yZCgndXNlckBleGFtcGxlLmNvbScsICcxMjM0NTYnLCAnTmV3UGFzczEyMyEnKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBjb25maXJtRm9yZ290UGFzc3dvcmQoXG4gICAgaWRlbnRpZmllcjogc3RyaW5nLFxuICAgIGNvZGU6IHN0cmluZyxcbiAgICBuZXdQYXNzd29yZDogc3RyaW5nLFxuICApOiBQcm9taXNlPENvbmZpcm1Gb3Jnb3RQYXNzd29yZFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmNvbmZpcm1Gb3Jnb3RQYXNzd29yZChpZGVudGlmaWVyLCBjb2RlLCBuZXdQYXNzd29yZCk7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgcGFzc3dvcmQgd2l0aCBjb2RlIG9yIHRva2VuIChnZW5lcmljIG1ldGhvZCBmb3IgYm90aCBhZG1pbiBhbmQgdXNlci1pbml0aWF0ZWQgcmVzZXRzKS5cbiAgICpcbiAgICogQWNjZXB0cyBlaXRoZXI6XG4gICAqIC0gY29kZTogU2hvcnQgbnVtZXJpYyBjb2RlIGZyb20gZW1haWwvU01TICg2LTEwIGRpZ2l0cylcbiAgICogLSB0b2tlbjogTG9uZyBoZXggdG9rZW4gZnJvbSByZXNldCBsaW5rICg2NCBjaGFycylcbiAgICpcbiAgICogQHBhcmFtIGlkZW50aWZpZXIgLSBVc2VyIGlkZW50aWZpZXIgKGVtYWlsLCB1c2VybmFtZSwgcGhvbmUpXG4gICAqIEBwYXJhbSBjb2RlT3JUb2tlbiAtIFZlcmlmaWNhdGlvbiBjb2RlIE9SIHRva2VuIGZyb20gbGlua1xuICAgKiBAcGFyYW0gbmV3UGFzc3dvcmQgLSBOZXcgcGFzc3dvcmRcbiAgICogQHJldHVybnMgUHJvbWlzZSB3aXRoIHN1Y2Nlc3MgcmVzcG9uc2VcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiAvLyBXaXRoIGNvZGUgZnJvbSBlbWFpbFxuICAgKiBhd2FpdCB0aGlzLmF1dGgucmVzZXRQYXNzd29yZFdpdGhDb2RlKCd1c2VyQGV4YW1wbGUuY29tJywgJzEyMzQ1NicsICdOZXdQYXNzMTIzIScpO1xuICAgKlxuICAgKiAvLyBXaXRoIHRva2VuIGZyb20gbGlua1xuICAgKiBhd2FpdCB0aGlzLmF1dGgucmVzZXRQYXNzd29yZFdpdGhDb2RlKCd1c2VyQGV4YW1wbGUuY29tJywgJzY0LWNoYXItdG9rZW4nLCAnTmV3UGFzczEyMyEnKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyByZXNldFBhc3N3b3JkV2l0aENvZGUoXG4gICAgaWRlbnRpZmllcjogc3RyaW5nLFxuICAgIGNvZGVPclRva2VuOiBzdHJpbmcsXG4gICAgbmV3UGFzc3dvcmQ6IHN0cmluZyxcbiAgKTogUHJvbWlzZTxSZXNldFBhc3N3b3JkV2l0aENvZGVSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5yZXNldFBhc3N3b3JkV2l0aENvZGUoaWRlbnRpZmllciwgY29kZU9yVG9rZW4sIG5ld1Bhc3N3b3JkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGFuZ2UgdXNlciBwYXNzd29yZCAocmVxdWlyZXMgY3VycmVudCBwYXNzd29yZCkuXG4gICAqXG4gICAqIEBwYXJhbSBvbGRQYXNzd29yZCAtIEN1cnJlbnQgcGFzc3dvcmRcbiAgICogQHBhcmFtIG5ld1Bhc3N3b3JkIC0gTmV3IHBhc3N3b3JkIChtdXN0IG1lZXQgcmVxdWlyZW1lbnRzKVxuICAgKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBwYXNzd29yZCBpcyBjaGFuZ2VkXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogYXdhaXQgdGhpcy5hdXRoLmNoYW5nZVBhc3N3b3JkKCdvbGRQYXNzd29yZDEyMycsICduZXdTZWN1cmVQYXNzd29yZDQ1NiEnKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBjaGFuZ2VQYXNzd29yZChvbGRQYXNzd29yZDogc3RyaW5nLCBuZXdQYXNzd29yZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmNoYW5nZVBhc3N3b3JkKG9sZFBhc3N3b3JkLCBuZXdQYXNzd29yZCk7XG4gIH1cblxuICAvKipcbiAgICogUmVxdWVzdCBwYXNzd29yZCBjaGFuZ2UgKG11c3QgY2hhbmdlIG9uIG5leHQgbG9naW4pLlxuICAgKlxuICAgKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiByZXF1ZXN0IGlzIHNlbnRcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBhd2FpdCB0aGlzLmF1dGgucmVxdWVzdFBhc3N3b3JkQ2hhbmdlKCk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgcmVxdWVzdFBhc3N3b3JkQ2hhbmdlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5yZXF1ZXN0UGFzc3dvcmRDaGFuZ2UoKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gUHJvZmlsZSBNYW5hZ2VtZW50XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogR2V0IGN1cnJlbnQgdXNlciBwcm9maWxlLlxuICAgKlxuICAgKiBAcmV0dXJucyBQcm9taXNlIG9mIGN1cnJlbnQgdXNlciBwcm9maWxlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgdXNlciA9IGF3YWl0IHRoaXMuYXV0aC5nZXRQcm9maWxlKCk7XG4gICAqIGNvbnNvbGUubG9nKCdVc2VyIHByb2ZpbGU6JywgdXNlcik7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgZ2V0UHJvZmlsZSgpOiBQcm9taXNlPEF1dGhVc2VyPiB7XG4gICAgY29uc3QgdXNlciA9IGF3YWl0IHRoaXMuY2xpZW50LmdldFByb2ZpbGUoKTtcbiAgICAvLyBVcGRhdGUgbG9jYWwgc3RhdGUgd2hlbiBwcm9maWxlIGlzIGZldGNoZWRcbiAgICB0aGlzLmN1cnJlbnRVc2VyU3ViamVjdC5uZXh0KHVzZXIpO1xuICAgIHJldHVybiB1c2VyO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSB1c2VyIHByb2ZpbGUuXG4gICAqXG4gICAqIEBwYXJhbSB1cGRhdGVzIC0gUHJvZmlsZSBmaWVsZHMgdG8gdXBkYXRlXG4gICAqIEByZXR1cm5zIFByb21pc2Ugb2YgdXBkYXRlZCB1c2VyIHByb2ZpbGVcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCB1c2VyID0gYXdhaXQgdGhpcy5hdXRoLnVwZGF0ZVByb2ZpbGUoeyBmaXJzdE5hbWU6ICdKb2huJywgbGFzdE5hbWU6ICdEb2UnIH0pO1xuICAgKiBjb25zb2xlLmxvZygnUHJvZmlsZSB1cGRhdGVkOicsIHVzZXIpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIHVwZGF0ZVByb2ZpbGUodXBkYXRlczogVXBkYXRlUHJvZmlsZVJlcXVlc3QpOiBQcm9taXNlPEF1dGhVc2VyPiB7XG4gICAgY29uc3QgdXNlciA9IGF3YWl0IHRoaXMuY2xpZW50LnVwZGF0ZVByb2ZpbGUodXBkYXRlcyk7XG4gICAgLy8gVXBkYXRlIGxvY2FsIHN0YXRlIHdoZW4gcHJvZmlsZSBpcyB1cGRhdGVkXG4gICAgdGhpcy5jdXJyZW50VXNlclN1YmplY3QubmV4dCh1c2VyKTtcbiAgICByZXR1cm4gdXNlcjtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQ2hhbGxlbmdlIEZsb3cgTWV0aG9kcyAoRXNzZW50aWFsIGZvciBhbnkgYXV0aCBmbG93KVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIFJlc3BvbmQgdG8gYSBjaGFsbGVuZ2UgKFZFUklGWV9FTUFJTCwgVkVSSUZZX1BIT05FLCBNRkFfUkVRVUlSRUQsIGV0Yy4pLlxuICAgKlxuICAgKiBAcGFyYW0gcmVzcG9uc2UgLSBDaGFsbGVuZ2UgcmVzcG9uc2UgZGF0YVxuICAgKiBAcmV0dXJucyBQcm9taXNlIHdpdGggYXV0aCByZXNwb25zZSBvciBuZXh0IGNoYWxsZW5nZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYXV0aC5yZXNwb25kVG9DaGFsbGVuZ2Uoe1xuICAgKiAgIHNlc3Npb246IGNoYWxsZW5nZVNlc3Npb24sXG4gICAqICAgdHlwZTogJ1ZFUklGWV9FTUFJTCcsXG4gICAqICAgY29kZTogJzEyMzQ1NicsXG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIHJlc3BvbmRUb0NoYWxsZW5nZShyZXNwb25zZTogQ2hhbGxlbmdlUmVzcG9uc2UpOiBQcm9taXNlPEF1dGhSZXNwb25zZT4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuY2xpZW50LnJlc3BvbmRUb0NoYWxsZW5nZShyZXNwb25zZSk7XG4gICAgcmV0dXJuIHRoaXMudXBkYXRlQ2hhbGxlbmdlU3RhdGUocmVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNlbmQgY2hhbGxlbmdlIGNvZGUuXG4gICAqXG4gICAqIEBwYXJhbSBzZXNzaW9uIC0gQ2hhbGxlbmdlIHNlc3Npb24gdG9rZW5cbiAgICogQHJldHVybnMgUHJvbWlzZSB3aXRoIGRlc3RpbmF0aW9uIGluZm9ybWF0aW9uXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5hdXRoLnJlc2VuZENvZGUoc2Vzc2lvbik7XG4gICAqIGNvbnNvbGUubG9nKCdDb2RlIHNlbnQgdG86JywgcmVzdWx0LmRlc3RpbmF0aW9uKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyByZXNlbmRDb2RlKHNlc3Npb246IHN0cmluZyk6IFByb21pc2U8eyBkZXN0aW5hdGlvbjogc3RyaW5nIH0+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQucmVzZW5kQ29kZShzZXNzaW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgTUZBIHNldHVwIGRhdGEgKGZvciBNRkFfU0VUVVBfUkVRVUlSRUQgY2hhbGxlbmdlKS5cbiAgICpcbiAgICogUmV0dXJucyBtZXRob2Qtc3BlY2lmaWMgc2V0dXAgaW5mb3JtYXRpb246XG4gICAqIC0gVE9UUDogeyBzZWNyZXQsIHFyQ29kZSwgbWFudWFsRW50cnlLZXkgfVxuICAgKiAtIFNNUzogeyBtYXNrZWRQaG9uZSB9XG4gICAqIC0gRW1haWw6IHsgbWFza2VkRW1haWwgfVxuICAgKiAtIFBhc3NrZXk6IFdlYkF1dGhuIHJlZ2lzdHJhdGlvbiBvcHRpb25zXG4gICAqXG4gICAqIEBwYXJhbSBzZXNzaW9uIC0gQ2hhbGxlbmdlIHNlc3Npb24gdG9rZW5cbiAgICogQHBhcmFtIG1ldGhvZCAtIE1GQSBtZXRob2QgdG8gc2V0IHVwXG4gICAqIEByZXR1cm5zIFByb21pc2Ugb2Ygc2V0dXAgZGF0YSByZXNwb25zZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHNldHVwRGF0YSA9IGF3YWl0IHRoaXMuYXV0aC5nZXRTZXR1cERhdGEoc2Vzc2lvbiwgJ3RvdHAnKTtcbiAgICogY29uc29sZS5sb2coJ1FSIENvZGU6Jywgc2V0dXBEYXRhLnNldHVwRGF0YS5xckNvZGUpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGdldFNldHVwRGF0YShzZXNzaW9uOiBzdHJpbmcsIG1ldGhvZDogc3RyaW5nKTogUHJvbWlzZTxHZXRTZXR1cERhdGFSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXRTZXR1cERhdGEoc2Vzc2lvbiwgbWV0aG9kIGFzIFBhcmFtZXRlcnM8TkF1dGhDbGllbnRbJ2dldFNldHVwRGF0YSddPlsxXSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IE1GQSBjaGFsbGVuZ2UgZGF0YSAoZm9yIE1GQV9SRVFVSVJFRCBjaGFsbGVuZ2UgLSBlLmcuLCBwYXNza2V5IG9wdGlvbnMpLlxuICAgKlxuICAgKiBAcGFyYW0gc2Vzc2lvbiAtIENoYWxsZW5nZSBzZXNzaW9uIHRva2VuXG4gICAqIEBwYXJhbSBtZXRob2QgLSBDaGFsbGVuZ2UgbWV0aG9kXG4gICAqIEByZXR1cm5zIFByb21pc2Ugb2YgY2hhbGxlbmdlIGRhdGEgcmVzcG9uc2VcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBjaGFsbGVuZ2VEYXRhID0gYXdhaXQgdGhpcy5hdXRoLmdldENoYWxsZW5nZURhdGEoc2Vzc2lvbiwgJ3Bhc3NrZXknKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBnZXRDaGFsbGVuZ2VEYXRhKHNlc3Npb246IHN0cmluZywgbWV0aG9kOiBzdHJpbmcpOiBQcm9taXNlPEdldENoYWxsZW5nZURhdGFSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXRDaGFsbGVuZ2VEYXRhKHNlc3Npb24sIG1ldGhvZCBhcyBQYXJhbWV0ZXJzPE5BdXRoQ2xpZW50WydnZXRDaGFsbGVuZ2VEYXRhJ10+WzFdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciBzdG9yZWQgY2hhbGxlbmdlICh3aGVuIG5hdmlnYXRpbmcgYXdheSBmcm9tIGNoYWxsZW5nZSBmbG93KS5cbiAgICpcbiAgICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gY2hhbGxlbmdlIGlzIGNsZWFyZWRcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBhd2FpdCB0aGlzLmF1dGguY2xlYXJDaGFsbGVuZ2UoKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBjbGVhckNoYWxsZW5nZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmNsaWVudC5jbGVhclN0b3JlZENoYWxsZW5nZSgpO1xuICAgIHRoaXMuY2hhbGxlbmdlU3ViamVjdC5uZXh0KG51bGwpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBTb2NpYWwgQXV0aGVudGljYXRpb25cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBJbml0aWF0ZSBzb2NpYWwgT0F1dGggbG9naW4gZmxvdy5cbiAgICogUmVkaXJlY3RzIHRoZSBicm93c2VyIHRvIGJhY2tlbmQgYC9hdXRoL3NvY2lhbC86cHJvdmlkZXIvcmVkaXJlY3RgLlxuICAgKlxuICAgKiBAcGFyYW0gcHJvdmlkZXIgLSBTb2NpYWwgcHJvdmlkZXIgKCdnb29nbGUnLCAnYXBwbGUnLCAnZmFjZWJvb2snKVxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIHJlZGlyZWN0IG9wdGlvbnNcbiAgICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gcmVkaXJlY3Qgc3RhcnRzXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogYXdhaXQgdGhpcy5hdXRoLmxvZ2luV2l0aFNvY2lhbCgnZ29vZ2xlJywgeyByZXR1cm5UbzogJy9hdXRoL2NhbGxiYWNrJyB9KTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBsb2dpbldpdGhTb2NpYWwocHJvdmlkZXI6IFNvY2lhbFByb3ZpZGVyLCBvcHRpb25zPzogU29jaWFsTG9naW5PcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmxvZ2luV2l0aFNvY2lhbChwcm92aWRlciwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogRXhjaGFuZ2UgYW4gZXhjaGFuZ2VUb2tlbiAoZnJvbSByZWRpcmVjdCBjYWxsYmFjayBVUkwpIGludG8gYW4gQXV0aFJlc3BvbnNlLlxuICAgKlxuICAgKiBVc2VkIGZvciBgdG9rZW5EZWxpdmVyeTogJ2pzb24nYCBvciBoeWJyaWQgZmxvd3Mgd2hlcmUgdGhlIGJhY2tlbmQgcmVkaXJlY3RzIGJhY2tcbiAgICogd2l0aCBgZXhjaGFuZ2VUb2tlbmAgaW5zdGVhZCBvZiBzZXR0aW5nIGNvb2tpZXMuXG4gICAqXG4gICAqIEBwYXJhbSBleGNoYW5nZVRva2VuIC0gT25lLXRpbWUgZXhjaGFuZ2UgdG9rZW4gZnJvbSB0aGUgY2FsbGJhY2sgVVJMXG4gICAqIEByZXR1cm5zIFByb21pc2Ugb2YgQXV0aFJlc3BvbnNlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmF1dGguZXhjaGFuZ2VTb2NpYWxSZWRpcmVjdChleGNoYW5nZVRva2VuKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBleGNoYW5nZVNvY2lhbFJlZGlyZWN0KGV4Y2hhbmdlVG9rZW46IHN0cmluZyk6IFByb21pc2U8QXV0aFJlc3BvbnNlPiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5jbGllbnQuZXhjaGFuZ2VTb2NpYWxSZWRpcmVjdChleGNoYW5nZVRva2VuKTtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVDaGFsbGVuZ2VTdGF0ZShyZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmeSBuYXRpdmUgc29jaWFsIHRva2VuIChtb2JpbGUpLlxuICAgKlxuICAgKiBAcGFyYW0gcmVxdWVzdCAtIFNvY2lhbCB2ZXJpZmljYXRpb24gcmVxdWVzdCB3aXRoIHByb3ZpZGVyIGFuZCB0b2tlblxuICAgKiBAcmV0dXJucyBQcm9taXNlIG9mIEF1dGhSZXNwb25zZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYXV0aC52ZXJpZnlOYXRpdmVTb2NpYWwoe1xuICAgKiAgIHByb3ZpZGVyOiAnZ29vZ2xlJyxcbiAgICogICBpZFRva2VuOiBuYXRpdmVJZFRva2VuLFxuICAgKiB9KTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyB2ZXJpZnlOYXRpdmVTb2NpYWwocmVxdWVzdDogU29jaWFsVmVyaWZ5UmVxdWVzdCk6IFByb21pc2U8QXV0aFJlc3BvbnNlPiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5jbGllbnQudmVyaWZ5TmF0aXZlU29jaWFsKHJlcXVlc3QpO1xuICAgIHJldHVybiB0aGlzLnVwZGF0ZUNoYWxsZW5nZVN0YXRlKHJlcyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGxpbmtlZCBzb2NpYWwgYWNjb3VudHMuXG4gICAqXG4gICAqIEByZXR1cm5zIFByb21pc2Ugb2YgbGlua2VkIGFjY291bnRzIHJlc3BvbnNlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgYWNjb3VudHMgPSBhd2FpdCB0aGlzLmF1dGguZ2V0TGlua2VkQWNjb3VudHMoKTtcbiAgICogY29uc29sZS5sb2coJ0xpbmtlZCBwcm92aWRlcnM6JywgYWNjb3VudHMucHJvdmlkZXJzKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBnZXRMaW5rZWRBY2NvdW50cygpOiBQcm9taXNlPExpbmtlZEFjY291bnRzUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQuZ2V0TGlua2VkQWNjb3VudHMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaW5rIHNvY2lhbCBhY2NvdW50LlxuICAgKlxuICAgKiBAcGFyYW0gcHJvdmlkZXIgLSBTb2NpYWwgcHJvdmlkZXIgdG8gbGlua1xuICAgKiBAcGFyYW0gY29kZSAtIE9BdXRoIGF1dGhvcml6YXRpb24gY29kZVxuICAgKiBAcGFyYW0gc3RhdGUgLSBPQXV0aCBzdGF0ZSBwYXJhbWV0ZXJcbiAgICogQHJldHVybnMgUHJvbWlzZSB3aXRoIHN1Y2Nlc3MgbWVzc2FnZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGF3YWl0IHRoaXMuYXV0aC5saW5rU29jaWFsQWNjb3VudCgnZ29vZ2xlJywgY29kZSwgc3RhdGUpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGxpbmtTb2NpYWxBY2NvdW50KHByb3ZpZGVyOiBzdHJpbmcsIGNvZGU6IHN0cmluZywgc3RhdGU6IHN0cmluZyk6IFByb21pc2U8eyBtZXNzYWdlOiBzdHJpbmcgfT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5saW5rU29jaWFsQWNjb3VudChwcm92aWRlciwgY29kZSwgc3RhdGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVubGluayBzb2NpYWwgYWNjb3VudC5cbiAgICpcbiAgICogQHBhcmFtIHByb3ZpZGVyIC0gU29jaWFsIHByb3ZpZGVyIHRvIHVubGlua1xuICAgKiBAcmV0dXJucyBQcm9taXNlIHdpdGggc3VjY2VzcyBtZXNzYWdlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogYXdhaXQgdGhpcy5hdXRoLnVubGlua1NvY2lhbEFjY291bnQoJ2dvb2dsZScpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIHVubGlua1NvY2lhbEFjY291bnQocHJvdmlkZXI6IHN0cmluZyk6IFByb21pc2U8eyBtZXNzYWdlOiBzdHJpbmcgfT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC51bmxpbmtTb2NpYWxBY2NvdW50KHByb3ZpZGVyKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gTUZBIE1hbmFnZW1lbnRcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBHZXQgTUZBIHN0YXR1cyBmb3IgdGhlIGN1cnJlbnQgdXNlci5cbiAgICpcbiAgICogQHJldHVybnMgUHJvbWlzZSBvZiBNRkEgc3RhdHVzXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3Qgc3RhdHVzID0gYXdhaXQgdGhpcy5hdXRoLmdldE1mYVN0YXR1cygpO1xuICAgKiBjb25zb2xlLmxvZygnTUZBIGVuYWJsZWQ6Jywgc3RhdHVzLmVuYWJsZWQpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGdldE1mYVN0YXR1cygpOiBQcm9taXNlPE1GQVN0YXR1cz4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXRNZmFTdGF0dXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgTUZBIGRldmljZXMgZm9yIHRoZSBjdXJyZW50IHVzZXIuXG4gICAqXG4gICAqIEByZXR1cm5zIFByb21pc2Ugb2YgTUZBIGRldmljZXMgYXJyYXlcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBkZXZpY2VzID0gYXdhaXQgdGhpcy5hdXRoLmdldE1mYURldmljZXMoKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBnZXRNZmFEZXZpY2VzKCk6IFByb21pc2U8TUZBRGV2aWNlW10+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQuZ2V0TWZhRGV2aWNlcygpIGFzIFByb21pc2U8TUZBRGV2aWNlW10+O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHVwIE1GQSBkZXZpY2UgKGF1dGhlbnRpY2F0ZWQgdXNlcikuXG4gICAqXG4gICAqIEBwYXJhbSBtZXRob2QgLSBNRkEgbWV0aG9kIHRvIHNldCB1cFxuICAgKiBAcmV0dXJucyBQcm9taXNlIG9mIHNldHVwIGRhdGFcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBzZXR1cERhdGEgPSBhd2FpdCB0aGlzLmF1dGguc2V0dXBNZmFEZXZpY2UoJ3RvdHAnKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBzZXR1cE1mYURldmljZShtZXRob2Q6IHN0cmluZyk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5zZXR1cE1mYURldmljZShtZXRob2QpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmeSBNRkEgc2V0dXAgKGF1dGhlbnRpY2F0ZWQgdXNlcikuXG4gICAqXG4gICAqIEBwYXJhbSBtZXRob2QgLSBNRkEgbWV0aG9kXG4gICAqIEBwYXJhbSBzZXR1cERhdGEgLSBTZXR1cCBkYXRhIGZyb20gc2V0dXBNZmFEZXZpY2VcbiAgICogQHBhcmFtIGRldmljZU5hbWUgLSBPcHRpb25hbCBkZXZpY2UgbmFtZVxuICAgKiBAcmV0dXJucyBQcm9taXNlIHdpdGggZGV2aWNlIElEXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5hdXRoLnZlcmlmeU1mYVNldHVwKCd0b3RwJywgeyBjb2RlOiAnMTIzNDU2JyB9LCAnTXkgUGhvbmUnKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyB2ZXJpZnlNZmFTZXR1cChcbiAgICBtZXRob2Q6IHN0cmluZyxcbiAgICBzZXR1cERhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIGRldmljZU5hbWU/OiBzdHJpbmcsXG4gICk6IFByb21pc2U8eyBkZXZpY2VJZDogbnVtYmVyIH0+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQudmVyaWZ5TWZhU2V0dXAobWV0aG9kLCBzZXR1cERhdGEsIGRldmljZU5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBNRkEgZGV2aWNlLlxuICAgKlxuICAgKiBAcGFyYW0gbWV0aG9kIC0gTUZBIG1ldGhvZCB0byByZW1vdmVcbiAgICogQHJldHVybnMgUHJvbWlzZSB3aXRoIHN1Y2Nlc3MgbWVzc2FnZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGF3YWl0IHRoaXMuYXV0aC5yZW1vdmVNZmFEZXZpY2UoJ3NtcycpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIHJlbW92ZU1mYURldmljZShtZXRob2Q6IHN0cmluZyk6IFByb21pc2U8eyBtZXNzYWdlOiBzdHJpbmcgfT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5yZW1vdmVNZmFEZXZpY2UobWV0aG9kKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgcHJlZmVycmVkIE1GQSBtZXRob2QuXG4gICAqXG4gICAqIEBwYXJhbSBtZXRob2QgLSBEZXZpY2UgbWV0aG9kIHRvIHNldCBhcyBwcmVmZXJyZWQgKCd0b3RwJywgJ3NtcycsICdlbWFpbCcsIG9yICdwYXNza2V5JylcbiAgICogQHJldHVybnMgUHJvbWlzZSB3aXRoIHN1Y2Nlc3MgbWVzc2FnZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGF3YWl0IHRoaXMuYXV0aC5zZXRQcmVmZXJyZWRNZmFNZXRob2QoJ3RvdHAnKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBzZXRQcmVmZXJyZWRNZmFNZXRob2QobWV0aG9kOiAndG90cCcgfCAnc21zJyB8ICdlbWFpbCcgfCAncGFzc2tleScpOiBQcm9taXNlPHsgbWVzc2FnZTogc3RyaW5nIH0+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQuc2V0UHJlZmVycmVkTWZhTWV0aG9kKG1ldGhvZCk7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgYmFja3VwIGNvZGVzLlxuICAgKlxuICAgKiBAcmV0dXJucyBQcm9taXNlIG9mIGJhY2t1cCBjb2RlcyBhcnJheVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IGNvZGVzID0gYXdhaXQgdGhpcy5hdXRoLmdlbmVyYXRlQmFja3VwQ29kZXMoKTtcbiAgICogY29uc29sZS5sb2coJ0JhY2t1cCBjb2RlczonLCBjb2Rlcyk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgZ2VuZXJhdGVCYWNrdXBDb2RlcygpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmdlbmVyYXRlQmFja3VwQ29kZXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgTUZBIGV4ZW1wdGlvbiAoYWRtaW4vdGVzdCBzY2VuYXJpb3MpLlxuICAgKlxuICAgKiBAcGFyYW0gZXhlbXB0IC0gV2hldGhlciB0byBleGVtcHQgdXNlciBmcm9tIE1GQVxuICAgKiBAcGFyYW0gcmVhc29uIC0gT3B0aW9uYWwgcmVhc29uIGZvciBleGVtcHRpb25cbiAgICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gZXhlbXB0aW9uIGlzIHNldFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGF3YWl0IHRoaXMuYXV0aC5zZXRNZmFFeGVtcHRpb24odHJ1ZSwgJ1Rlc3QgYWNjb3VudCcpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIHNldE1mYUV4ZW1wdGlvbihleGVtcHQ6IGJvb2xlYW4sIHJlYXNvbj86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5zZXRNZmFFeGVtcHRpb24oZXhlbXB0LCByZWFzb24pO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBEZXZpY2UgVHJ1c3RcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBUcnVzdCBjdXJyZW50IGRldmljZS5cbiAgICpcbiAgICogQHJldHVybnMgUHJvbWlzZSB3aXRoIGRldmljZSB0b2tlblxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYXV0aC50cnVzdERldmljZSgpO1xuICAgKiBjb25zb2xlLmxvZygnRGV2aWNlIHRydXN0ZWQ6JywgcmVzdWx0LmRldmljZVRva2VuKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyB0cnVzdERldmljZSgpOiBQcm9taXNlPHsgZGV2aWNlVG9rZW46IHN0cmluZyB9PiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LnRydXN0RGV2aWNlKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdGhlIGN1cnJlbnQgZGV2aWNlIGlzIHRydXN0ZWQuXG4gICAqXG4gICAqIEByZXR1cm5zIFByb21pc2Ugd2l0aCB0cnVzdGVkIHN0YXR1c1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYXV0aC5pc1RydXN0ZWREZXZpY2UoKTtcbiAgICogaWYgKHJlc3VsdC50cnVzdGVkKSB7XG4gICAqICAgY29uc29sZS5sb2coJ1RoaXMgZGV2aWNlIGlzIHRydXN0ZWQnKTtcbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGlzVHJ1c3RlZERldmljZSgpOiBQcm9taXNlPHsgdHJ1c3RlZDogYm9vbGVhbiB9PiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmlzVHJ1c3RlZERldmljZSgpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBBdWRpdCBIaXN0b3J5XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogR2V0IHBhZ2luYXRlZCBhdWRpdCBoaXN0b3J5IGZvciB0aGUgY3VycmVudCB1c2VyLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gUXVlcnkgcGFyYW1ldGVycyBmb3IgZmlsdGVyaW5nIGFuZCBwYWdpbmF0aW9uXG4gICAqIEByZXR1cm5zIFByb21pc2Ugb2YgYXVkaXQgaGlzdG9yeSByZXNwb25zZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IGhpc3RvcnkgPSBhd2FpdCB0aGlzLmF1dGguZ2V0QXVkaXRIaXN0b3J5KHtcbiAgICogICBwYWdlOiAxLFxuICAgKiAgIGxpbWl0OiAyMCxcbiAgICogICBldmVudFR5cGU6ICdMT0dJTl9TVUNDRVNTJ1xuICAgKiB9KTtcbiAgICogY29uc29sZS5sb2coJ0F1ZGl0IGhpc3Rvcnk6JywgaGlzdG9yeSk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgZ2V0QXVkaXRIaXN0b3J5KHBhcmFtcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4+KTogUHJvbWlzZTxBdWRpdEhpc3RvcnlSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXRBdWRpdEhpc3RvcnkocGFyYW1zKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gRXNjYXBlIEhhdGNoXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogRXhwb3NlIHVuZGVybHlpbmcgTkF1dGhDbGllbnQgZm9yIGFkdmFuY2VkIHNjZW5hcmlvcy5cbiAgICpcbiAgICogQGRlcHJlY2F0ZWQgQWxsIGNvcmUgZnVuY3Rpb25hbGl0eSBpcyBub3cgZXhwb3NlZCBkaXJlY3RseSBvbiBBdXRoU2VydmljZSBhcyBQcm9taXNlcy5cbiAgICogVXNlIHRoZSBkaXJlY3QgbWV0aG9kcyBvbiBBdXRoU2VydmljZSBpbnN0ZWFkIChlLmcuLCBgYXV0aC5jaGFuZ2VQYXNzd29yZCgpYCBpbnN0ZWFkIG9mIGBhdXRoLmdldENsaWVudCgpLmNoYW5nZVBhc3N3b3JkKClgKS5cbiAgICogVGhpcyBtZXRob2QgaXMga2VwdCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBvbmx5IGFuZCBtYXkgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSB2ZXJzaW9uLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgdW5kZXJseWluZyBOQXV0aENsaWVudCBpbnN0YW5jZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIC8vIERlcHJlY2F0ZWQgLSB1c2UgZGlyZWN0IG1ldGhvZHMgaW5zdGVhZFxuICAgKiBjb25zdCBzdGF0dXMgPSBhd2FpdCB0aGlzLmF1dGguZ2V0Q2xpZW50KCkuZ2V0TWZhU3RhdHVzKCk7XG4gICAqXG4gICAqIC8vIFByZWZlcnJlZCAtIHVzZSBkaXJlY3QgbWV0aG9kc1xuICAgKiBjb25zdCBzdGF0dXMgPSBhd2FpdCB0aGlzLmF1dGguZ2V0TWZhU3RhdHVzKCk7XG4gICAqIGBgYFxuICAgKi9cbiAgZ2V0Q2xpZW50KCk6IE5BdXRoQ2xpZW50IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQ7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEludGVybmFsIE1ldGhvZHNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIGJ5IGh5ZHJhdGluZyBzdGF0ZSBmcm9tIHN0b3JhZ2UuXG4gICAqIENhbGxlZCBhdXRvbWF0aWNhbGx5IG9uIGNvbnN0cnVjdGlvbi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgaW5pdGlhbGl6ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5pbml0aWFsaXplZCkgcmV0dXJuO1xuICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSB0cnVlO1xuXG4gICAgYXdhaXQgdGhpcy5jbGllbnQuaW5pdGlhbGl6ZSgpO1xuXG4gICAgLy8gSHlkcmF0ZSBjaGFsbGVuZ2Ugc3RhdGVcbiAgICBjb25zdCBzdG9yZWRDaGFsbGVuZ2UgPSBhd2FpdCB0aGlzLmNsaWVudC5nZXRTdG9yZWRDaGFsbGVuZ2UoKTtcbiAgICBpZiAoc3RvcmVkQ2hhbGxlbmdlKSB7XG4gICAgICB0aGlzLmNoYWxsZW5nZVN1YmplY3QubmV4dChzdG9yZWRDaGFsbGVuZ2UpO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBzdWJqZWN0cyBmcm9tIGNsaWVudCBzdGF0ZVxuICAgIGNvbnN0IHVzZXIgPSB0aGlzLmNsaWVudC5nZXRDdXJyZW50VXNlcigpO1xuICAgIGlmICh1c2VyKSB7XG4gICAgICB0aGlzLmN1cnJlbnRVc2VyU3ViamVjdC5uZXh0KHVzZXIpO1xuICAgICAgdGhpcy5pc0F1dGhlbnRpY2F0ZWRTdWJqZWN0Lm5leHQodHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBjaGFsbGVuZ2Ugc3RhdGUgYWZ0ZXIgYXV0aCByZXNwb25zZS5cbiAgICovXG4gIHByaXZhdGUgdXBkYXRlQ2hhbGxlbmdlU3RhdGUocmVzcG9uc2U6IEF1dGhSZXNwb25zZSk6IEF1dGhSZXNwb25zZSB7XG4gICAgaWYgKHJlc3BvbnNlLmNoYWxsZW5nZU5hbWUpIHtcbiAgICAgIHRoaXMuY2hhbGxlbmdlU3ViamVjdC5uZXh0KHJlc3BvbnNlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jaGFsbGVuZ2VTdWJqZWN0Lm5leHQobnVsbCk7XG4gICAgfVxuICAgIHJldHVybiByZXNwb25zZTtcbiAgfVxufVxuIl19
869
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL25nbW9kdWxlL2F1dGguc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsZUFBZSxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM1RCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRS9DLE9BQU8sRUFDTCxXQUFXLEdBb0JaLE1BQU0sdUJBQXVCLENBQUM7OztBQUUvQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQStCRztBQUVILE1BQU0sT0FBTyxXQUFXO0lBQ0wsTUFBTSxDQUFjO0lBQ3BCLE1BQU0sQ0FBb0I7SUFDMUIsa0JBQWtCLEdBQUcsSUFBSSxlQUFlLENBQWtCLElBQUksQ0FBQyxDQUFDO0lBQ2hFLHNCQUFzQixHQUFHLElBQUksZUFBZSxDQUFVLEtBQUssQ0FBQyxDQUFDO0lBQzdELGdCQUFnQixHQUFHLElBQUksZUFBZSxDQUFzQixJQUFJLENBQUMsQ0FBQztJQUNsRSxpQkFBaUIsR0FBRyxJQUFJLE9BQU8sRUFBYSxDQUFDO0lBQ3RELFdBQVcsR0FBRyxLQUFLLENBQUM7SUFFNUI7OztPQUdHO0lBQ0gsWUFBeUMsTUFBeUIsRUFBRSxXQUErQjtRQUNqRyxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUVyQixxREFBcUQ7UUFDckQsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLFdBQVcsSUFBSSxXQUFXLENBQUM7UUFDbEQsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2IsTUFBTSxJQUFJLEtBQUssQ0FDYiw2R0FBNkcsQ0FDOUcsQ0FBQztRQUNKLENBQUM7UUFFRCxJQUFJ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TUFBTSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDL0QsSUFBSSxlQUFlLEVBQUUsQ0FBQztZQUNwQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQzlDLENBQUM7UUFFRCxvQ0FBb0M7UUFDcEMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUMxQyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ1QsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNuQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pDLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxvQkFBb0IsQ0FBQyxRQUFzQjtRQUNqRCxJQUFJLFFBQVEsQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUMzQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3ZDLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNuQyxDQUFDO1FBQ0QsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQzt3R0FuNEJVLFdBQVcsa0JBYUYsbUJBQW1COzRHQWI1QixXQUFXOzs0RkFBWCxXQUFXO2tCQUR2QixVQUFVOzswQkFjSSxNQUFNOzJCQUFDLG1CQUFtQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaWx0ZXIgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBOQVVUSF9DTElFTlRfQ09ORklHIH0gZnJvbSAnLi90b2tlbnMnO1xuaW1wb3J0IHsgQW5ndWxhckh0dHBBZGFwdGVyIH0gZnJvbSAnLi9odHRwLWFkYXB0ZXInO1xuaW1wb3J0IHtcbiAgTkF1dGhDbGllbnQsXG4gIE5BdXRoQ2xpZW50Q29uZmlnLFxuICBDaGFsbGVuZ2VSZXNwb25zZSxcbiAgQXV0aFJlc3BvbnNlLFxuICBUb2tlblJlc3BvbnNlLFxuICBBdXRoVXNlcixcbiAgQ29uZmlybUZvcmdvdFBhc3N3b3JkUmVzcG9uc2UsXG4gIEZvcmdvdFBhc3N3b3JkUmVzcG9uc2UsXG4gIFJlc2V0UGFzc3dvcmRXaXRoQ29kZVJlc3BvbnNlLFxuICBVcGRhdGVQcm9maWxlUmVxdWVzdCxcbiAgR2V0Q2hhbGxlbmdlRGF0YVJlc3BvbnNlLFxuICBHZXRTZXR1cERhdGFSZXNwb25zZSxcbiAgTUZBU3RhdHVzLFxuICBNRkFEZXZpY2UsXG4gIEF1dGhFdmVudCxcbiAgU29jaWFsUHJvdmlkZXIsXG4gIFNvY2lhbExvZ2luT3B0aW9ucyxcbiAgTGlua2VkQWNjb3VudHNSZXNwb25zZSxcbiAgU29jaWFsVmVyaWZ5UmVxdWVzdCxcbiAgQXVkaXRIaXN0b3J5UmVzcG9uc2UsXG59IGZyb20gJ0BuYXV0aC10b29sa2l0L2NsaWVudCc7XG5cbi8qKlxuICogQW5ndWxhciB3cmFwcGVyIGFyb3VuZCBOQXV0aENsaWVudCB0aGF0IHByb3ZpZGVzIHByb21pc2UtYmFzZWQgYXV0aCBtZXRob2RzIGFuZCByZWFjdGl2ZSBzdGF0ZS5cbiAqXG4gKiBUaGlzIHNlcnZpY2UgcHJvdmlkZXM6XG4gKiAtIFJlYWN0aXZlIHN0YXRlIChjdXJyZW50VXNlciQsIGlzQXV0aGVudGljYXRlZCQsIGNoYWxsZW5nZSQpXG4gKiAtIEFsbCBjb3JlIGF1dGggbWV0aG9kcyBhcyBQcm9taXNlcyAobG9naW4sIHNpZ251cCwgbG9nb3V0LCByZWZyZXNoKVxuICogLSBQcm9maWxlIG1hbmFnZW1lbnQgKGdldFByb2ZpbGUsIHVwZGF0ZVByb2ZpbGUsIGNoYW5nZVBhc3N3b3JkKVxuICogLSBDaGFsbGVuZ2UgZmxvdyBtZXRob2RzIChyZXNwb25kVG9DaGFsbGVuZ2UsIHJlc2VuZENvZGUpXG4gKiAtIE1GQSBtYW5hZ2VtZW50IChnZXRNZmFTdGF0dXMsIHNldHVwTWZhRGV2aWNlLCBldGMuKVxuICogLSBTb2NpYWwgYXV0aGVudGljYXRpb24gYW5kIGFjY291bnQgbGlua2luZ1xuICogLSBEZXZpY2UgdHJ1c3QgbWFuYWdlbWVudFxuICogLSBBdWRpdCBoaXN0b3J5XG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0cnVjdG9yKHByaXZhdGUgYXV0aDogQXV0aFNlcnZpY2UpIHt9XG4gKlxuICogLy8gUmVhY3RpdmUgc3RhdGVcbiAqIHRoaXMuYXV0aC5jdXJyZW50VXNlciQuc3Vic2NyaWJlKHVzZXIgPT4gLi4uKTtcbiAqIHRoaXMuYXV0aC5pc0F1dGhlbnRpY2F0ZWQkLnN1YnNjcmliZShpc0F1dGggPT4gLi4uKTtcbiAqXG4gKiAvLyBBdXRoIG9wZXJhdGlvbnMgd2l0aCBhc3luYy9hd2FpdFxuICogY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmF1dGgubG9naW4oZW1haWwsIHBhc3N3b3JkKTtcbiAqXG4gKiAvLyBQcm9maWxlIG1hbmFnZW1lbnRcbiAqIGF3YWl0IHRoaXMuYXV0aC5jaGFuZ2VQYXNzd29yZChvbGRQYXNzd29yZCwgbmV3UGFzc3dvcmQpO1xuICogY29uc3QgdXNlciA9IGF3YWl0IHRoaXMuYXV0aC51cGRhdGVQcm9maWxlKHsgZmlyc3ROYW1lOiAnSm9obicgfSk7XG4gKlxuICogLy8gTUZBIG9wZXJhdGlvbnNcbiAqIGNvbnN0IHN0YXR1cyA9IGF3YWl0IHRoaXMuYXV0aC5nZXRNZmFTdGF0dXMoKTtcbiAqIGBgYFxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQXV0aFNlcnZpY2Uge1xuICBwcml2YXRlIHJlYWRvbmx5IGNsaWVudDogTkF1dGhDbGllbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgY29uZmlnOiBOQXV0aENsaWVudENvbmZpZztcbiAgcHJpdmF0ZSByZWFkb25seSBjdXJyZW50VXNlclN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEF1dGhVc2VyIHwgbnVsbD4obnVsbCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgaXNBdXRoZW50aWNhdGVkU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IGNoYWxsZW5nZVN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEF1dGhSZXNwb25zZSB8IG51bGw+KG51bGwpO1xuICBwcml2YXRlIHJlYWRvbmx5IGF1dGhFdmVudHNTdWJqZWN0ID0gbmV3IFN1YmplY3Q8QXV0aEV2ZW50PigpO1xuICBwcml2YXRlIGluaXRpYWxpemVkID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBjb25maWcgLSBJbmplY3RlZCBjbGllbnQgY29uZmlndXJhdGlvbiAocmVxdWlyZWQpXG4gICAqIEBwYXJhbSBodHRwQWRhcHRlciAtIEFuZ3VsYXIgSFRUUCBhZGFwdGVyIGZvciBtYWtpbmcgcmVxdWVzdHMgKHJlcXVpcmVkKVxuICAgKi9cbiAgY29uc3RydWN0b3IoQEluamVjdChOQVVUSF9DTElFTlRfQ09ORklHKSBjb25maWc6IE5BdXRoQ2xpZW50Q29uZmlnLCBodHRwQWRhcHRlcjogQW5ndWxhckh0dHBBZGFwdGVyKSB7XG4gICAgdGhpcy5jb25maWcgPSBjb25maWc7XG5cbiAgICAvLyBVc2UgcHJvdmlkZWQgaHR0cEFkYXB0ZXIgKGZyb20gY29uZmlnIG9yIGluamVjdGVkKVxuICAgIGNvbnN0IGFkYXB0ZXIgPSBjb25maWcuaHR0cEFkYXB0ZXIgPz8gaHR0cEFkYXB0ZXI7XG4gICAgaWYgKCFhZGFwdGVyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdIdHRwQWRhcHRlciBub3QgZm91bmQuIEVpdGhlciBwcm92aWRlIGh0dHBBZGFwdGVyIGluIE5BVVRIX0NMSUVOVF9DT05GSUcgb3IgZW5zdXJlIEh0dHBDbGllbnQgaXMgYXZhaWxhYmxlLicsXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuY2xpZW50ID0gbmV3IE5BdXRoQ2xpZW50KHtcbiAgICAgIC4uLmNvbmZpZyxcbiAgICAgIGh0dHBBZGFwdGVyOiBhZGFwdGVyLFxuICAgICAgb25BdXRoU3RhdGVDaGFuZ2U6ICh1c2VyKSA9PiB7XG4gICAgICAgIHRoaXMuY3VycmVudFVzZXJTdWJqZWN0Lm5leHQodXNlcik7XG4gICAgICAgIHRoaXMuaXNBdXRoZW50aWNhdGVkU3ViamVjdC5uZXh0KEJvb2xlYW4odXNlcikpO1xuICAgICAgICBjb25maWcub25BdXRoU3RhdGVDaGFuZ2U/Lih1c2VyKTtcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyBGb3J3YXJkIGFsbCBjbGllbnQgZXZlbnRzIHRvIE9ic2VydmFibGUgc3RyZWFtXG4gICAgdGhpcy5jbGllbnQub24oJyonLCAoZXZlbnQpID0+IHtcbiAgICAgIHRoaXMuYXV0aEV2ZW50c1N1YmplY3QubmV4dChldmVudCk7XG4gICAgfSk7XG5cbiAgICAvLyBBdXRvLWluaXRpYWxpemUgb24gY29uc3RydWN0aW9uIChoeWRyYXRlIGZyb20gc3RvcmFnZSlcbiAgICB0aGlzLmluaXRpYWxpemUoKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gUmVhY3RpdmUgU3RhdGUgT2JzZXJ2YWJsZXNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBDdXJyZW50IHVzZXIgb2JzZXJ2YWJsZS5cbiAgICovXG4gIGdldCBjdXJyZW50VXNlciQoKTogT2JzZXJ2YWJsZTxBdXRoVXNlciB8IG51bGw+IHtcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50VXNlclN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICAvKipcbiAgICogQXV0aGVudGljYXRlZCBzdGF0ZSBvYnNlcnZhYmxlLlxuICAgKi9cbiAgZ2V0IGlzQXV0aGVudGljYXRlZCQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuaXNBdXRoZW50aWNhdGVkU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDdXJyZW50IGNoYWxsZW5nZSBvYnNlcnZhYmxlIChmb3IgcmVhY3RpdmUgY2hhbGxlbmdlIG5hdmlnYXRpb24pLlxuICAgKi9cbiAgZ2V0IGNoYWxsZW5nZSQoKTogT2JzZXJ2YWJsZTxBdXRoUmVzcG9uc2UgfCBudWxsPiB7XG4gICAgcmV0dXJuIHRoaXMuY2hhbGxlbmdlU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdXRoZW50aWNhdGlvbiBldmVudHMgc3RyZWFtLlxuICAgKiBFbWl0cyBhbGwgYXV0aCBsaWZlY3ljbGUgZXZlbnRzIGZvciBjdXN0b20gbG9naWMsIGFuYWx5dGljcywgb3IgVUkgdXBkYXRlcy5cbiAgICovXG4gIGdldCBhdXRoRXZlbnRzJCgpOiBPYnNlcnZhYmxlPEF1dGhFdmVudD4ge1xuICAgIHJldHVybiB0aGlzLmF1dGhFdmVudHNTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN1Y2Nlc3NmdWwgYXV0aGVudGljYXRpb24gZXZlbnRzIHN0cmVhbS5cbiAgICogRW1pdHMgd2hlbiB1c2VyIHN1Y2Nlc3NmdWxseSBhdXRoZW50aWNhdGVzIChsb2dpbiwgc2lnbnVwLCBzb2NpYWwgYXV0aCkuXG4gICAqL1xuICBnZXQgYXV0aFN1Y2Nlc3MkKCk6IE9ic2VydmFibGU8QXV0aEV2ZW50PiB7XG4gICAgcmV0dXJuIHRoaXMuYXV0aEV2ZW50c1N1YmplY3QucGlwZShmaWx0ZXIoKGUpID0+IGUudHlwZSA9PT0gJ2F1dGg6c3VjY2VzcycpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdXRoZW50aWNhdGlvbiBlcnJvciBldmVudHMgc3RyZWFtLlxuICAgKiBFbWl0cyB3aGVuIGF1dGhlbnRpY2F0aW9uIGZhaWxzIChsb2dpbiBlcnJvciwgT0F1dGggZXJyb3IsIGV0Yy4pLlxuICAgKi9cbiAgZ2V0IGF1dGhFcnJvciQoKTogT2JzZXJ2YWJsZTxBdXRoRXZlbnQ+IHtcbiAgICByZXR1cm4gdGhpcy5hdXRoRXZlbnRzU3ViamVjdC5waXBlKGZpbHRlcigoZSkgPT4gZS50eXBlID09PSAnYXV0aDplcnJvcicgfHwgZS50eXBlID09PSAnb2F1dGg6ZXJyb3InKSk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFN5bmMgU3RhdGUgQWNjZXNzb3JzIChmb3IgZ3VhcmRzLCB0ZW1wbGF0ZXMpXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYXV0aGVudGljYXRlZCAoc3luYywgdXNlcyBjYWNoZWQgc3RhdGUpLlxuICAgKi9cbiAgaXNBdXRoZW50aWNhdGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5pc0F1dGhlbnRpY2F0ZWRTeW5jKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGN1cnJlbnQgdXNlciAoc3luYywgdXNlcyBjYWNoZWQgc3RhdGUpLlxuICAgKi9cbiAgZ2V0Q3VycmVudFVzZXIoKTogQXV0aFVzZXIgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQuZ2V0Q3VycmVudFVzZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY3VycmVudCBjaGFsbGVuZ2UgKHN5bmMpLlxuICAgKi9cbiAgZ2V0Q3VycmVudENoYWxsZW5nZSgpOiBBdXRoUmVzcG9uc2UgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5jaGFsbGVuZ2VTdWJqZWN0LnZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjaGFsbGVuZ2Ugcm91dGVyIGZvciBtYW51YWwgbmF2aWdhdGlvbiBjb250cm9sLlxuICAgKiBVc2VmdWwgZm9yIGd1YXJkcyB0aGF0IG5lZWQgdG8gaGFuZGxlIGVycm9ycyBvciBidWlsZCBjdXN0b20gVVJMcy5cbiAgICpcbiAgICogQHJldHVybnMgQ2hhbGxlbmdlUm91dGVyIGluc3RhbmNlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3Qgcm91dGVyID0gdGhpcy5hdXRoLmdldENoYWxsZW5nZVJvdXRlcigpO1xuICAgKiBhd2FpdCByb3V0ZXIubmF2aWdhdGVUb0Vycm9yKCdvYXV0aCcpO1xuICAgKiBgYGBcbiAgICovXG4gIGdldENoYWxsZW5nZVJvdXRlcigpIHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQuZ2V0Q2hhbGxlbmdlUm91dGVyKCk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIENvcmUgQXV0aCBNZXRob2RzXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogTG9naW4gd2l0aCBpZGVudGlmaWVyIGFuZCBwYXNzd29yZC5cbiAgICpcbiAgICogQHBhcmFtIGlkZW50aWZpZXIgLSBVc2VyIGVtYWlsIG9yIHVzZXJuYW1lXG4gICAqIEBwYXJhbSBwYXNzd29yZCAtIFVzZXIgcGFzc3dvcmRcbiAgICogQHJldHVybnMgUHJvbWlzZSB3aXRoIGF1dGggcmVzcG9uc2Ugb3IgY2hhbGxlbmdlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmF1dGgubG9naW4oJ3VzZXJAZXhhbXBsZS5jb20nLCAncGFzc3dvcmQnKTtcbiAgICogaWYgKHJlc3BvbnNlLmNoYWxsZW5nZU5hbWUpIHtcbiAgICogICAvLyBIYW5kbGUgY2hhbGxlbmdlXG4gICAqIH0gZWxzZSB7XG4gICAqICAgLy8gTG9naW4gc3VjY2Vzc2Z1bFxuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgbG9naW4oaWRlbnRpZmllcjogc3RyaW5nLCBwYXNzd29yZDogc3RyaW5nKTogUHJvbWlzZTxBdXRoUmVzcG9uc2U+IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmNsaWVudC5sb2dpbihpZGVudGlmaWVyLCBwYXNzd29yZCk7XG4gICAgcmV0dXJuIHRoaXMudXBkYXRlQ2hhbGxlbmdlU3RhdGUocmVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaWdudXAgd2l0aCBjcmVkZW50aWFscy5cbiAgICpcbiAgICogQHBhcmFtIHBheWxvYWQgLSBTaWdudXAgcmVxdWVzdCBwYXlsb2FkXG4gICAqIEByZXR1cm5zIFByb21pc2Ugd2l0aCBhdXRoIHJlc3BvbnNlIG9yIGNoYWxsZW5nZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5hdXRoLnNpZ251cCh7XG4gICAqICAgZW1haWw6ICduZXdAZXhhbXBsZS5jb20nLFxuICAgKiAgIHBhc3N3b3JkOiAnU2VjdXJlUGFzczEyMyEnLFxuICAgKiAgIGZpcnN0TmFtZTogJ0pvaG4nLFxuICAgKiB9KTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBzaWdudXAocGF5bG9hZDogUGFyYW1ldGVyczxOQXV0aENsaWVudFsnc2lnbnVwJ10+WzBdKTogUHJvbWlzZTxBdXRoUmVzcG9uc2U+IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmNsaWVudC5zaWdudXAocGF5bG9hZCk7XG4gICAgcmV0dXJuIHRoaXMudXBkYXRlQ2hhbGxlbmdlU3RhdGUocmVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2dvdXQgY3VycmVudCBzZXNzaW9uLlxuICAgKlxuICAgKiBAcGFyYW0gZm9yZ2V0RGV2aWNlIC0gSWYgdHJ1ZSwgcmVtb3ZlcyBkZXZpY2UgdHJ1c3RcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBhd2FpdCB0aGlzLmF1dGgubG9nb3V0KCk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgbG9nb3V0KGZvcmdldERldmljZT86IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmNsaWVudC5sb2dvdXQoZm9yZ2V0RGV2aWNlKTtcbiAgICB0aGlzLmNoYWxsZW5nZVN1YmplY3QubmV4dChudWxsKTtcbiAgICAvLyBFeHBsaWNpdGx5IHVwZGF0ZSBhdXRoIHN0YXRlIGFmdGVyIGxvZ291dFxuICAgIHRoaXMuY3VycmVudFVzZXJTdWJqZWN0Lm5leHQobnVsbCk7XG4gICAgdGhpcy5pc0F1dGhlbnRpY2F0ZWRTdWJqZWN0Lm5leHQoZmFsc2UpO1xuXG4gICAgLy8gQ2xlYXIgQ1NSRiB0b2tlbiBjb29raWUgaWYgaW4gY29va2llcyBtb2RlXG4gICAgLy8gTm90ZTogQmFja2VuZCBzaG91bGQgY2xlYXIgaHR0cE9ubHkgY29va2llcywgYnV0IHdlIGNsZWFyIG5vbi1odHRwT25seSBvbmVzXG4gICAgaWYgKHRoaXMuY29uZmlnLnRva2VuRGVsaXZlcnkgPT09ICdjb29raWVzJyAmJiB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBjb25zdCBjc3JmQ29va2llTmFtZSA9IHRoaXMuY29uZmlnLmNzcmY/LmNvb2tpZU5hbWUgPz8gJ25hdXRoX2NzcmZfdG9rZW4nO1xuICAgICAgLy8gRXh0cmFjdCBkb21haW4gZnJvbSBiYXNlVXJsIGlmIHBvc3NpYmxlXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHRoaXMuY29uZmlnLmJhc2VVcmwpO1xuICAgICAgICBkb2N1bWVudC5jb29raWUgPSBgJHtjc3JmQ29va2llTmFtZX09OyBleHBpcmVzPVRodSwgMDEgSmFuIDE5NzAgMDA6MDA6MDAgVVRDOyBwYXRoPS87IGRvbWFpbj0ke3VybC5ob3N0bmFtZX1gO1xuICAgICAgICAvLyBBbHNvIHRyeSB3aXRob3V0IGRvbWFpbiAoZm9yIGxvY2FsaG9zdClcbiAgICAgICAgZG9jdW1lbnQuY29va2llID0gYCR7Y3NyZkNvb2tpZU5hbWV9PTsgZXhwaXJlcz1UaHUsIDAxIEphbiAxOTcwIDAwOjAwOjAwIFVUQzsgcGF0aD0vYDtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBGYWxsYmFjayBpZiBiYXNlVXJsIHBhcnNpbmcgZmFpbHNcbiAgICAgICAgZG9jdW1lbnQuY29va2llID0gYCR7Y3NyZkNvb2tpZU5hbWV9PTsgZXhwaXJlcz1UaHUsIDAxIEphbiAxOTcwIDAwOjAwOjAwIFVUQzsgcGF0aD0vYDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTG9nb3V0IGFsbCBzZXNzaW9ucy5cbiAgICpcbiAgICogUmV2b2tlcyBhbGwgYWN0aXZlIHNlc3Npb25zIGZvciB0aGUgY3VycmVudCB1c2VyIGFjcm9zcyBhbGwgZGV2aWNlcy5cbiAgICogT3B0aW9uYWxseSByZXZva2VzIGFsbCB0cnVzdGVkIGRldmljZXMgaWYgZm9yZ2V0RGV2aWNlcyBpcyB0cnVlLlxuICAgKlxuICAgKiBAcGFyYW0gZm9yZ2V0RGV2aWNlcyAtIElmIHRydWUsIGFsc28gcmV2b2tlcyBhbGwgdHJ1c3RlZCBkZXZpY2VzIChkZWZhdWx0OiBmYWxzZSlcbiAgICogQHJldHVybnMgUHJvbWlzZSB3aXRoIG51bWJlciBvZiBzZXNzaW9ucyByZXZva2VkXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5hdXRoLmxvZ291dEFsbCgpO1xuICAgKiBjb25zb2xlLmxvZyhgUmV2b2tlZCAke3Jlc3VsdC5yZXZva2VkQ291bnR9IHNlc3Npb25zYCk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgbG9nb3V0QWxsKGZvcmdldERldmljZXM/OiBib29sZWFuKTogUHJvbWlzZTx7IHJldm9rZWRDb3VudDogbnVtYmVyIH0+IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmNsaWVudC5sb2dvdXRBbGwoZm9yZ2V0RGV2aWNlcyk7XG4gICAgdGhpcy5jaGFsbGVuZ2VTdWJqZWN0Lm5leHQobnVsbCk7XG4gICAgLy8gRXhwbGljaXRseSB1cGRhdGUgYXV0aCBzdGF0ZSBhZnRlciBsb2dvdXRcbiAgICB0aGlzLmN1cnJlbnRVc2VyU3ViamVjdC5uZXh0KG51bGwpO1xuICAgIHRoaXMuaXNBdXRoZW50aWNhdGVkU3ViamVjdC5uZXh0KGZhbHNlKTtcbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZnJlc2ggdG9rZW5zLlxuICAgKlxuICAgKiBAcmV0dXJucyBQcm9taXNlIHdpdGggbmV3IHRva2Vuc1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHRva2VucyA9IGF3YWl0IHRoaXMuYXV0aC5yZWZyZXNoKCk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgcmVmcmVzaCgpOiBQcm9taXNlPFRva2VuUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQucmVmcmVzaFRva2VucygpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBBY2NvdW50IFJlY292ZXJ5IChGb3Jnb3QgUGFzc3dvcmQpXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogUmVxdWVzdCBhIHBhc3N3b3JkIHJlc2V0IGNvZGUgKGZvcmdvdCBwYXNzd29yZCkuXG4gICAqXG4gICAqIEBwYXJhbSBpZGVudGlmaWVyIC0gVXNlciBlbWFpbCwgdXNlcm5hbWUsIG9yIHBob25lXG4gICAqIEByZXR1cm5zIFByb21pc2Ugd2l0aCBwYXNzd29yZCByZXNldCByZXNwb25zZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGF3YWl0IHRoaXMuYXV0aC5mb3Jnb3RQYXNzd29yZCgndXNlckBleGFtcGxlLmNvbScpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGZvcmdvdFBhc3N3b3JkKGlkZW50aWZpZXI6IHN0cmluZyk6IFByb21pc2U8Rm9yZ290UGFzc3dvcmRSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5mb3Jnb3RQYXNzd29yZChpZGVudGlmaWVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25maXJtIGEgcGFzc3dvcmQgcmVzZXQgY29kZSBhbmQgc2V0IGEgbmV3IHBhc3N3b3JkLlxuICAgKlxuICAgKiBAcGFyYW0gaWRlbnRpZmllciAtIFVzZXIgZW1haWwsIHVzZXJuYW1lLCBvciBwaG9uZVxuICAgKiBAcGFyYW0gY29kZSAtIE9uZS10aW1lIHJlc2V0IGNvZGVcbiAgICogQHBhcmFtIG5ld1Bhc3N3b3JkIC0gTmV3IHBhc3N3b3JkXG4gICAqIEByZXR1cm5zIFByb21pc2Ugd2l0aCBjb25maXJtYXRpb24gcmVzcG9uc2VcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBhd2FpdCB0aGlzLmF1dGguY29uZmlybUZvcmdvdFBhc3N3b3JkKCd1c2VyQGV4YW1wbGUuY29tJywgJzEyMzQ1NicsICdOZXdQYXNzMTIzIScpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGNvbmZpcm1Gb3Jnb3RQYXNzd29yZChcbiAgICBpZGVudGlmaWVyOiBzdHJpbmcsXG4gICAgY29kZTogc3RyaW5nLFxuICAgIG5ld1Bhc3N3b3JkOiBzdHJpbmcsXG4gICk6IFByb21pc2U8Q29uZmlybUZvcmdvdFBhc3N3b3JkUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQuY29uZmlybUZvcmdvdFBhc3N3b3JkKGlkZW50aWZpZXIsIGNvZGUsIG5ld1Bhc3N3b3JkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCBwYXNzd29yZCB3aXRoIGNvZGUgb3IgdG9rZW4gKGdlbmVyaWMgbWV0aG9kIGZvciBib3RoIGFkbWluIGFuZCB1c2VyLWluaXRpYXRlZCByZXNldHMpLlxuICAgKlxuICAgKiBBY2NlcHRzIGVpdGhlcjpcbiAgICogLSBjb2RlOiBTaG9ydCBudW1lcmljIGNvZGUgZnJvbSBlbWFpbC9TTVMgKDYtMTAgZGlnaXRzKVxuICAgKiAtIHRva2VuOiBMb25nIGhleCB0b2tlbiBmcm9tIHJlc2V0IGxpbmsgKDY0IGNoYXJzKVxuICAgKlxuICAgKiBAcGFyYW0gaWRlbnRpZmllciAtIFVzZXIgaWRlbnRpZmllciAoZW1haWwsIHVzZXJuYW1lLCBwaG9uZSlcbiAgICogQHBhcmFtIGNvZGVPclRva2VuIC0gVmVyaWZpY2F0aW9uIGNvZGUgT1IgdG9rZW4gZnJvbSBsaW5rXG4gICAqIEBwYXJhbSBuZXdQYXNzd29yZCAtIE5ldyBwYXNzd29yZFxuICAgKiBAcmV0dXJucyBQcm9taXNlIHdpdGggc3VjY2VzcyByZXNwb25zZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIC8vIFdpdGggY29kZSBmcm9tIGVtYWlsXG4gICAqIGF3YWl0IHRoaXMuYXV0aC5yZXNldFBhc3N3b3JkV2l0aENvZGUoJ3VzZXJAZXhhbXBsZS5jb20nLCAnMTIzNDU2JywgJ05ld1Bhc3MxMjMhJyk7XG4gICAqXG4gICAqIC8vIFdpdGggdG9rZW4gZnJvbSBsaW5rXG4gICAqIGF3YWl0IHRoaXMuYXV0aC5yZXNldFBhc3N3b3JkV2l0aENvZGUoJ3VzZXJAZXhhbXBsZS5jb20nLCAnNjQtY2hhci10b2tlbicsICdOZXdQYXNzMTIzIScpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIHJlc2V0UGFzc3dvcmRXaXRoQ29kZShcbiAgICBpZGVudGlmaWVyOiBzdHJpbmcsXG4gICAgY29kZU9yVG9rZW46IHN0cmluZyxcbiAgICBuZXdQYXNzd29yZDogc3RyaW5nLFxuICApOiBQcm9taXNlPFJlc2V0UGFzc3dvcmRXaXRoQ29kZVJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LnJlc2V0UGFzc3dvcmRXaXRoQ29kZShpZGVudGlmaWVyLCBjb2RlT3JUb2tlbiwgbmV3UGFzc3dvcmQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoYW5nZSB1c2VyIHBhc3N3b3JkIChyZXF1aXJlcyBjdXJyZW50IHBhc3N3b3JkKS5cbiAgICpcbiAgICogQHBhcmFtIG9sZFBhc3N3b3JkIC0gQ3VycmVudCBwYXNzd29yZFxuICAgKiBAcGFyYW0gbmV3UGFzc3dvcmQgLSBOZXcgcGFzc3dvcmQgKG11c3QgbWVldCByZXF1aXJlbWVudHMpXG4gICAqIEByZXR1cm5zIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHBhc3N3b3JkIGlzIGNoYW5nZWRcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBhd2FpdCB0aGlzLmF1dGguY2hhbmdlUGFzc3dvcmQoJ29sZFBhc3N3b3JkMTIzJywgJ25ld1NlY3VyZVBhc3N3b3JkNDU2IScpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGNoYW5nZVBhc3N3b3JkKG9sZFBhc3N3b3JkOiBzdHJpbmcsIG5ld1Bhc3N3b3JkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQuY2hhbmdlUGFzc3dvcmQob2xkUGFzc3dvcmQsIG5ld1Bhc3N3b3JkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXF1ZXN0IHBhc3N3b3JkIGNoYW5nZSAobXVzdCBjaGFuZ2Ugb24gbmV4dCBsb2dpbikuXG4gICAqXG4gICAqIEByZXR1cm5zIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHJlcXVlc3QgaXMgc2VudFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGF3YWl0IHRoaXMuYXV0aC5yZXF1ZXN0UGFzc3dvcmRDaGFuZ2UoKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyByZXF1ZXN0UGFzc3dvcmRDaGFuZ2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LnJlcXVlc3RQYXNzd29yZENoYW5nZSgpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBQcm9maWxlIE1hbmFnZW1lbnRcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBHZXQgY3VycmVudCB1c2VyIHByb2ZpbGUuXG4gICAqXG4gICAqIEByZXR1cm5zIFByb21pc2Ugb2YgY3VycmVudCB1c2VyIHByb2ZpbGVcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCB1c2VyID0gYXdhaXQgdGhpcy5hdXRoLmdldFByb2ZpbGUoKTtcbiAgICogY29uc29sZS5sb2coJ1VzZXIgcHJvZmlsZTonLCB1c2VyKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBnZXRQcm9maWxlKCk6IFByb21pc2U8QXV0aFVzZXI+IHtcbiAgICBjb25zdCB1c2VyID0gYXdhaXQgdGhpcy5jbGllbnQuZ2V0UHJvZmlsZSgpO1xuICAgIC8vIFVwZGF0ZSBsb2NhbCBzdGF0ZSB3aGVuIHByb2ZpbGUgaXMgZmV0Y2hlZFxuICAgIHRoaXMuY3VycmVudFVzZXJTdWJqZWN0Lm5leHQodXNlcik7XG4gICAgcmV0dXJuIHVzZXI7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIHVzZXIgcHJvZmlsZS5cbiAgICpcbiAgICogQHBhcmFtIHVwZGF0ZXMgLSBQcm9maWxlIGZpZWxkcyB0byB1cGRhdGVcbiAgICogQHJldHVybnMgUHJvbWlzZSBvZiB1cGRhdGVkIHVzZXIgcHJvZmlsZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHVzZXIgPSBhd2FpdCB0aGlzLmF1dGgudXBkYXRlUHJvZmlsZSh7IGZpcnN0TmFtZTogJ0pvaG4nLCBsYXN0TmFtZTogJ0RvZScgfSk7XG4gICAqIGNvbnNvbGUubG9nKCdQcm9maWxlIHVwZGF0ZWQ6JywgdXNlcik7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgdXBkYXRlUHJvZmlsZSh1cGRhdGVzOiBVcGRhdGVQcm9maWxlUmVxdWVzdCk6IFByb21pc2U8QXV0aFVzZXI+IHtcbiAgICBjb25zdCB1c2VyID0gYXdhaXQgdGhpcy5jbGllbnQudXBkYXRlUHJvZmlsZSh1cGRhdGVzKTtcbiAgICAvLyBVcGRhdGUgbG9jYWwgc3RhdGUgd2hlbiBwcm9maWxlIGlzIHVwZGF0ZWRcbiAgICB0aGlzLmN1cnJlbnRVc2VyU3ViamVjdC5uZXh0KHVzZXIpO1xuICAgIHJldHVybiB1c2VyO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBDaGFsbGVuZ2UgRmxvdyBNZXRob2RzIChFc3NlbnRpYWwgZm9yIGFueSBhdXRoIGZsb3cpXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogUmVzcG9uZCB0byBhIGNoYWxsZW5nZSAoVkVSSUZZX0VNQUlMLCBWRVJJRllfUEhPTkUsIE1GQV9SRVFVSVJFRCwgZXRjLikuXG4gICAqXG4gICAqIEBwYXJhbSByZXNwb25zZSAtIENoYWxsZW5nZSByZXNwb25zZSBkYXRhXG4gICAqIEByZXR1cm5zIFByb21pc2Ugd2l0aCBhdXRoIHJlc3BvbnNlIG9yIG5leHQgY2hhbGxlbmdlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5hdXRoLnJlc3BvbmRUb0NoYWxsZW5nZSh7XG4gICAqICAgc2Vzc2lvbjogY2hhbGxlbmdlU2Vzc2lvbixcbiAgICogICB0eXBlOiAnVkVSSUZZX0VNQUlMJyxcbiAgICogICBjb2RlOiAnMTIzNDU2JyxcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgcmVzcG9uZFRvQ2hhbGxlbmdlKHJlc3BvbnNlOiBDaGFsbGVuZ2VSZXNwb25zZSk6IFByb21pc2U8QXV0aFJlc3BvbnNlPiB7XG4gICAgLy8gI3JlZ2lvbiBhZ2VudCBsb2dcbiAgICBmZXRjaCgnaHR0cDovLzEyNy4wLjAuMTo3MjQyL2luZ2VzdC85N2Y5ZmU1My02YThiLTQzZTItYWU5Yi00YjJkMGY3MjU4MTYnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBsb2NhdGlvbjogJ2F1dGguc2VydmljZS50czpyZXNwb25kVG9DaGFsbGVuZ2U6ZW50cnknLFxuICAgICAgICBtZXNzYWdlOiAnUmVzcG9uZFRvQ2hhbGxlbmdlIGNhbGxlZCcsXG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICBjaGFsbGVuZ2VUeXBlOiByZXNwb25zZS50eXBlLFxuICAgICAgICAgIGhhc1Nlc3Npb246ICEhcmVzcG9uc2Uuc2Vzc2lvbixcbiAgICAgICAgfSxcbiAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICBzZXNzaW9uSWQ6ICdkZWJ1Zy1zZXNzaW9uJyxcbiAgICAgICAgaHlwb3RoZXNpc0lkOiAnSDcnLFxuICAgICAgfSksXG4gICAgfSkuY2F0Y2goKCkgPT4ge30pO1xuICAgIC8vICNlbmRyZWdpb25cbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmNsaWVudC5yZXNwb25kVG9DaGFsbGVuZ2UocmVzcG9uc2UpO1xuICAgIC8vICNyZWdpb24gYWdlbnQgbG9nXG4gICAgZmV0Y2goJ2h0dHA6Ly8xMjcuMC4wLjE6NzI0Mi9pbmdlc3QvOTdmOWZlNTMtNmE4Yi00M2UyLWFlOWItNGIyZDBmNzI1ODE2Jywge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgbG9jYXRpb246ICdhdXRoLnNlcnZpY2UudHM6cmVzcG9uZFRvQ2hhbGxlbmdlOnJlc3BvbnNlJyxcbiAgICAgICAgbWVzc2FnZTogJ1Jlc3BvbmRUb0NoYWxsZW5nZSByZXNwb25zZSByZWNlaXZlZCcsXG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICBoYXNDaGFsbGVuZ2VOYW1lOiAhIXJlcy5jaGFsbGVuZ2VOYW1lLFxuICAgICAgICAgIGNoYWxsZW5nZU5hbWU6IHJlcy5jaGFsbGVuZ2VOYW1lLFxuICAgICAgICAgIGhhc0FjY2Vzc1Rva2VuOiAhIXJlcy5hY2Nlc3NUb2tlbixcbiAgICAgICAgICBoYXNSZWZyZXNoVG9rZW46ICEhcmVzLnJlZnJlc2hUb2tlbixcbiAgICAgICAgICBoYXNVc2VyOiAhIXJlcy51c2VyLFxuICAgICAgICB9LFxuICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICAgIHNlc3Npb25JZDogJ2RlYnVnLXNlc3Npb24nLFxuICAgICAgICBoeXBvdGhlc2lzSWQ6ICdINycsXG4gICAgICB9KSxcbiAgICB9KS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgLy8gI2VuZHJlZ2lvblxuICAgIHJldHVybiB0aGlzLnVwZGF0ZUNoYWxsZW5nZVN0YXRlKHJlcyk7XG4gIH1cblxuICAvKipcbiAgICogUmVzZW5kIGNoYWxsZW5nZSBjb2RlLlxuICAgKlxuICAgKiBAcGFyYW0gc2Vzc2lvbiAtIENoYWxsZW5nZSBzZXNzaW9uIHRva2VuXG4gICAqIEByZXR1cm5zIFByb21pc2Ugd2l0aCBkZXN0aW5hdGlvbiBpbmZvcm1hdGlvblxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYXV0aC5yZXNlbmRDb2RlKHNlc3Npb24pO1xuICAgKiBjb25zb2xlLmxvZygnQ29kZSBzZW50IHRvOicsIHJlc3VsdC5kZXN0aW5hdGlvbik7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgcmVzZW5kQ29kZShzZXNzaW9uOiBzdHJpbmcpOiBQcm9taXNlPHsgZGVzdGluYXRpb246IHN0cmluZyB9PiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LnJlc2VuZENvZGUoc2Vzc2lvbik7XG4gIH1cblxuICAvKipcbiAgICogR2V0IE1GQSBzZXR1cCBkYXRhIChmb3IgTUZBX1NFVFVQX1JFUVVJUkVEIGNoYWxsZW5nZSkuXG4gICAqXG4gICAqIFJldHVybnMgbWV0aG9kLXNwZWNpZmljIHNldHVwIGluZm9ybWF0aW9uOlxuICAgKiAtIFRPVFA6IHsgc2VjcmV0LCBxckNvZGUsIG1hbnVhbEVudHJ5S2V5IH1cbiAgICogLSBTTVM6IHsgbWFza2VkUGhvbmUgfVxuICAgKiAtIEVtYWlsOiB7IG1hc2tlZEVtYWlsIH1cbiAgICogLSBQYXNza2V5OiBXZWJBdXRobiByZWdpc3RyYXRpb24gb3B0aW9uc1xuICAgKlxuICAgKiBAcGFyYW0gc2Vzc2lvbiAtIENoYWxsZW5nZSBzZXNzaW9uIHRva2VuXG4gICAqIEBwYXJhbSBtZXRob2QgLSBNRkEgbWV0aG9kIHRvIHNldCB1cFxuICAgKiBAcmV0dXJucyBQcm9taXNlIG9mIHNldHVwIGRhdGEgcmVzcG9uc2VcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBzZXR1cERhdGEgPSBhd2FpdCB0aGlzLmF1dGguZ2V0U2V0dXBEYXRhKHNlc3Npb24sICd0b3RwJyk7XG4gICAqIGNvbnNvbGUubG9nKCdRUiBDb2RlOicsIHNldHVwRGF0YS5zZXR1cERhdGEucXJDb2RlKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBnZXRTZXR1cERhdGEoc2Vzc2lvbjogc3RyaW5nLCBtZXRob2Q6IHN0cmluZyk6IFByb21pc2U8R2V0U2V0dXBEYXRhUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQuZ2V0U2V0dXBEYXRhKHNlc3Npb24sIG1ldGhvZCBhcyBQYXJhbWV0ZXJzPE5BdXRoQ2xpZW50WydnZXRTZXR1cERhdGEnXT5bMV0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBNRkEgY2hhbGxlbmdlIGRhdGEgKGZvciBNRkFfUkVRVUlSRUQgY2hhbGxlbmdlIC0gZS5nLiwgcGFzc2tleSBvcHRpb25zKS5cbiAgICpcbiAgICogQHBhcmFtIHNlc3Npb24gLSBDaGFsbGVuZ2Ugc2Vzc2lvbiB0b2tlblxuICAgKiBAcGFyYW0gbWV0aG9kIC0gQ2hhbGxlbmdlIG1ldGhvZFxuICAgKiBAcmV0dXJucyBQcm9taXNlIG9mIGNoYWxsZW5nZSBkYXRhIHJlc3BvbnNlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgY2hhbGxlbmdlRGF0YSA9IGF3YWl0IHRoaXMuYXV0aC5nZXRDaGFsbGVuZ2VEYXRhKHNlc3Npb24sICdwYXNza2V5Jyk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgZ2V0Q2hhbGxlbmdlRGF0YShzZXNzaW9uOiBzdHJpbmcsIG1ldGhvZDogc3RyaW5nKTogUHJvbWlzZTxHZXRDaGFsbGVuZ2VEYXRhUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQuZ2V0Q2hhbGxlbmdlRGF0YShzZXNzaW9uLCBtZXRob2QgYXMgUGFyYW1ldGVyczxOQXV0aENsaWVudFsnZ2V0Q2hhbGxlbmdlRGF0YSddPlsxXSk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgc3RvcmVkIGNoYWxsZW5nZSAod2hlbiBuYXZpZ2F0aW5nIGF3YXkgZnJvbSBjaGFsbGVuZ2UgZmxvdykuXG4gICAqXG4gICAqIEByZXR1cm5zIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGNoYWxsZW5nZSBpcyBjbGVhcmVkXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogYXdhaXQgdGhpcy5hdXRoLmNsZWFyQ2hhbGxlbmdlKCk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgY2xlYXJDaGFsbGVuZ2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5jbGllbnQuY2xlYXJTdG9yZWRDaGFsbGVuZ2UoKTtcbiAgICB0aGlzLmNoYWxsZW5nZVN1YmplY3QubmV4dChudWxsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY3VycmVudCBhY2Nlc3MgdG9rZW4gKEpTT04gbW9kZSBvbmx5KS5cbiAgICpcbiAgICogVGhpcyBpcyBwcmltYXJpbHkgdXNlZnVsIGZvciBjb25zdW1lcnMgdXNpbmcgQW5ndWxhciBgSHR0cENsaWVudGAgZGlyZWN0bHlcbiAgICogKG91dHNpZGUgb2YgdGhlIFNESyBtZXRob2RzKSBhbmQgcmVseWluZyBvbiBhbiBpbnRlcmNlcHRvciB0byBhdHRhY2ggQmVhcmVyIHRva2Vucy5cbiAgICpcbiAgICogQHJldHVybnMgQWNjZXNzIHRva2VuLCBvciBudWxsIGlmIG5vdCBhdmFpbGFibGVcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCB0b2tlbiA9IGF3YWl0IHRoaXMuYXV0aC5nZXRBY2Nlc3NUb2tlbigpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGdldEFjY2Vzc1Rva2VuKCk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5nZXRBY2Nlc3NUb2tlbigpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBTb2NpYWwgQXV0aGVudGljYXRpb25cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBJbml0aWF0ZSBzb2NpYWwgT0F1dGggbG9naW4gZmxvdy5cbiAgICogUmVkaXJlY3RzIHRoZSBicm93c2VyIHRvIGJhY2tlbmQgYC9hdXRoL3NvY2lhbC86cHJvdmlkZXIvcmVkaXJlY3RgLlxuICAgKlxuICAgKiBAcGFyYW0gcHJvdmlkZXIgLSBTb2NpYWwgcHJvdmlkZXIgKCdnb29nbGUnLCAnYXBwbGUnLCAnZmFjZWJvb2snKVxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIHJlZGlyZWN0IG9wdGlvbnNcbiAgICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gcmVkaXJlY3Qgc3RhcnRzXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogYXdhaXQgdGhpcy5hdXRoLmxvZ2luV2l0aFNvY2lhbCgnZ29vZ2xlJywgeyByZXR1cm5UbzogJy9hdXRoL2NhbGxiYWNrJyB9KTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBsb2dpbldpdGhTb2NpYWwocHJvdmlkZXI6IFNvY2lhbFByb3ZpZGVyLCBvcHRpb25zPzogU29jaWFsTG9naW5PcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmxvZ2luV2l0aFNvY2lhbChwcm92aWRlciwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogRXhjaGFuZ2UgYW4gZXhjaGFuZ2VUb2tlbiAoZnJvbSByZWRpcmVjdCBjYWxsYmFjayBVUkwpIGludG8gYW4gQXV0aFJlc3BvbnNlLlxuICAgKlxuICAgKiBVc2VkIGZvciBgdG9rZW5EZWxpdmVyeTogJ2pzb24nYCBvciBoeWJyaWQgZmxvd3Mgd2hlcmUgdGhlIGJhY2tlbmQgcmVkaXJlY3RzIGJhY2tcbiAgICogd2l0aCBgZXhjaGFuZ2VUb2tlbmAgaW5zdGVhZCBvZiBzZXR0aW5nIGNvb2tpZXMuXG4gICAqXG4gICAqIEBwYXJhbSBleGNoYW5nZVRva2VuIC0gT25lLXRpbWUgZXhjaGFuZ2UgdG9rZW4gZnJvbSB0aGUgY2FsbGJhY2sgVVJMXG4gICAqIEByZXR1cm5zIFByb21pc2Ugb2YgQXV0aFJlc3BvbnNlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmF1dGguZXhjaGFuZ2VTb2NpYWxSZWRpcmVjdChleGNoYW5nZVRva2VuKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBleGNoYW5nZVNvY2lhbFJlZGlyZWN0KGV4Y2hhbmdlVG9rZW46IHN0cmluZyk6IFByb21pc2U8QXV0aFJlc3BvbnNlPiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5jbGllbnQuZXhjaGFuZ2VTb2NpYWxSZWRpcmVjdChleGNoYW5nZVRva2VuKTtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVDaGFsbGVuZ2VTdGF0ZShyZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmeSBuYXRpdmUgc29jaWFsIHRva2VuIChtb2JpbGUpLlxuICAgKlxuICAgKiBAcGFyYW0gcmVxdWVzdCAtIFNvY2lhbCB2ZXJpZmljYXRpb24gcmVxdWVzdCB3aXRoIHByb3ZpZGVyIGFuZCB0b2tlblxuICAgKiBAcmV0dXJucyBQcm9taXNlIG9mIEF1dGhSZXNwb25zZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYXV0aC52ZXJpZnlOYXRpdmVTb2NpYWwoe1xuICAgKiAgIHByb3ZpZGVyOiAnZ29vZ2xlJyxcbiAgICogICBpZFRva2VuOiBuYXRpdmVJZFRva2VuLFxuICAgKiB9KTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyB2ZXJpZnlOYXRpdmVTb2NpYWwocmVxdWVzdDogU29jaWFsVmVyaWZ5UmVxdWVzdCk6IFByb21pc2U8QXV0aFJlc3BvbnNlPiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5jbGllbnQudmVyaWZ5TmF0aXZlU29jaWFsKHJlcXVlc3QpO1xuICAgIHJldHVybiB0aGlzLnVwZGF0ZUNoYWxsZW5nZVN0YXRlKHJlcyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGxpbmtlZCBzb2NpYWwgYWNjb3VudHMuXG4gICAqXG4gICAqIEByZXR1cm5zIFByb21pc2Ugb2YgbGlua2VkIGFjY291bnRzIHJlc3BvbnNlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgYWNjb3VudHMgPSBhd2FpdCB0aGlzLmF1dGguZ2V0TGlua2VkQWNjb3VudHMoKTtcbiAgICogY29uc29sZS5sb2coJ0xpbmtlZCBwcm92aWRlcnM6JywgYWNjb3VudHMucHJvdmlkZXJzKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBnZXRMaW5rZWRBY2NvdW50cygpOiBQcm9taXNlPExpbmtlZEFjY291bnRzUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQuZ2V0TGlua2VkQWNjb3VudHMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaW5rIHNvY2lhbCBhY2NvdW50LlxuICAgKlxuICAgKiBAcGFyYW0gcHJvdmlkZXIgLSBTb2NpYWwgcHJvdmlkZXIgdG8gbGlua1xuICAgKiBAcGFyYW0gY29kZSAtIE9BdXRoIGF1dGhvcml6YXRpb24gY29kZVxuICAgKiBAcGFyYW0gc3RhdGUgLSBPQXV0aCBzdGF0ZSBwYXJhbWV0ZXJcbiAgICogQHJldHVybnMgUHJvbWlzZSB3aXRoIHN1Y2Nlc3MgbWVzc2FnZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGF3YWl0IHRoaXMuYXV0aC5saW5rU29jaWFsQWNjb3VudCgnZ29vZ2xlJywgY29kZSwgc3RhdGUpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGxpbmtTb2NpYWxBY2NvdW50KHByb3ZpZGVyOiBzdHJpbmcsIGNvZGU6IHN0cmluZywgc3RhdGU6IHN0cmluZyk6IFByb21pc2U8eyBtZXNzYWdlOiBzdHJpbmcgfT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5saW5rU29jaWFsQWNjb3VudChwcm92aWRlciwgY29kZSwgc3RhdGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVubGluayBzb2NpYWwgYWNjb3VudC5cbiAgICpcbiAgICogQHBhcmFtIHByb3ZpZGVyIC0gU29jaWFsIHByb3ZpZGVyIHRvIHVubGlua1xuICAgKiBAcmV0dXJucyBQcm9taXNlIHdpdGggc3VjY2VzcyBtZXNzYWdlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogYXdhaXQgdGhpcy5hdXRoLnVubGlua1NvY2lhbEFjY291bnQoJ2dvb2dsZScpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIHVubGlua1NvY2lhbEFjY291bnQocHJvdmlkZXI6IHN0cmluZyk6IFByb21pc2U8eyBtZXNzYWdlOiBzdHJpbmcgfT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC51bmxpbmtTb2NpYWxBY2NvdW50KHByb3ZpZGVyKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gTUZBIE1hbmFnZW1lbnRcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBHZXQgTUZBIHN0YXR1cyBmb3IgdGhlIGN1cnJlbnQgdXNlci5cbiAgICpcbiAgICogQHJldHVybnMgUHJvbWlzZSBvZiBNRkEgc3RhdHVzXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3Qgc3RhdHVzID0gYXdhaXQgdGhpcy5hdXRoLmdldE1mYVN0YXR1cygpO1xuICAgKiBjb25zb2xlLmxvZygnTUZBIGVuYWJsZWQ6Jywgc3RhdHVzLmVuYWJsZWQpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGdldE1mYVN0YXR1cygpOiBQcm9taXNlPE1GQVN0YXR1cz4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXRNZmFTdGF0dXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgTUZBIGRldmljZXMgZm9yIHRoZSBjdXJyZW50IHVzZXIuXG4gICAqXG4gICAqIEByZXR1cm5zIFByb21pc2Ugb2YgTUZBIGRldmljZXMgYXJyYXlcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBkZXZpY2VzID0gYXdhaXQgdGhpcy5hdXRoLmdldE1mYURldmljZXMoKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBnZXRNZmFEZXZpY2VzKCk6IFByb21pc2U8TUZBRGV2aWNlW10+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQuZ2V0TWZhRGV2aWNlcygpIGFzIFByb21pc2U8TUZBRGV2aWNlW10+O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHVwIE1GQSBkZXZpY2UgKGF1dGhlbnRpY2F0ZWQgdXNlcikuXG4gICAqXG4gICAqIEBwYXJhbSBtZXRob2QgLSBNRkEgbWV0aG9kIHRvIHNldCB1cFxuICAgKiBAcmV0dXJucyBQcm9taXNlIG9mIHNldHVwIGRhdGFcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBzZXR1cERhdGEgPSBhd2FpdCB0aGlzLmF1dGguc2V0dXBNZmFEZXZpY2UoJ3RvdHAnKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBzZXR1cE1mYURldmljZShtZXRob2Q6IHN0cmluZyk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5zZXR1cE1mYURldmljZShtZXRob2QpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmeSBNRkEgc2V0dXAgKGF1dGhlbnRpY2F0ZWQgdXNlcikuXG4gICAqXG4gICAqIEBwYXJhbSBtZXRob2QgLSBNRkEgbWV0aG9kXG4gICAqIEBwYXJhbSBzZXR1cERhdGEgLSBTZXR1cCBkYXRhIGZyb20gc2V0dXBNZmFEZXZpY2VcbiAgICogQHBhcmFtIGRldmljZU5hbWUgLSBPcHRpb25hbCBkZXZpY2UgbmFtZVxuICAgKiBAcmV0dXJucyBQcm9taXNlIHdpdGggZGV2aWNlIElEXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5hdXRoLnZlcmlmeU1mYVNldHVwKCd0b3RwJywgeyBjb2RlOiAnMTIzNDU2JyB9LCAnTXkgUGhvbmUnKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyB2ZXJpZnlNZmFTZXR1cChcbiAgICBtZXRob2Q6IHN0cmluZyxcbiAgICBzZXR1cERhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIGRldmljZU5hbWU/OiBzdHJpbmcsXG4gICk6IFByb21pc2U8eyBkZXZpY2VJZDogbnVtYmVyIH0+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQudmVyaWZ5TWZhU2V0dXAobWV0aG9kLCBzZXR1cERhdGEsIGRldmljZU5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBNRkEgZGV2aWNlLlxuICAgKlxuICAgKiBAcGFyYW0gbWV0aG9kIC0gTUZBIG1ldGhvZCB0byByZW1vdmVcbiAgICogQHJldHVybnMgUHJvbWlzZSB3aXRoIHN1Y2Nlc3MgbWVzc2FnZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGF3YWl0IHRoaXMuYXV0aC5yZW1vdmVNZmFEZXZpY2UoJ3NtcycpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIHJlbW92ZU1mYURldmljZShtZXRob2Q6IHN0cmluZyk6IFByb21pc2U8eyBtZXNzYWdlOiBzdHJpbmcgfT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5yZW1vdmVNZmFEZXZpY2UobWV0aG9kKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgcHJlZmVycmVkIE1GQSBtZXRob2QuXG4gICAqXG4gICAqIEBwYXJhbSBtZXRob2QgLSBEZXZpY2UgbWV0aG9kIHRvIHNldCBhcyBwcmVmZXJyZWQgKCd0b3RwJywgJ3NtcycsICdlbWFpbCcsIG9yICdwYXNza2V5JylcbiAgICogQHJldHVybnMgUHJvbWlzZSB3aXRoIHN1Y2Nlc3MgbWVzc2FnZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGF3YWl0IHRoaXMuYXV0aC5zZXRQcmVmZXJyZWRNZmFNZXRob2QoJ3RvdHAnKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBzZXRQcmVmZXJyZWRNZmFNZXRob2QobWV0aG9kOiAndG90cCcgfCAnc21zJyB8ICdlbWFpbCcgfCAncGFzc2tleScpOiBQcm9taXNlPHsgbWVzc2FnZTogc3RyaW5nIH0+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQuc2V0UHJlZmVycmVkTWZhTWV0aG9kKG1ldGhvZCk7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgYmFja3VwIGNvZGVzLlxuICAgKlxuICAgKiBAcmV0dXJucyBQcm9taXNlIG9mIGJhY2t1cCBjb2RlcyBhcnJheVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IGNvZGVzID0gYXdhaXQgdGhpcy5hdXRoLmdlbmVyYXRlQmFja3VwQ29kZXMoKTtcbiAgICogY29uc29sZS5sb2coJ0JhY2t1cCBjb2RlczonLCBjb2Rlcyk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgZ2VuZXJhdGVCYWNrdXBDb2RlcygpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmdlbmVyYXRlQmFja3VwQ29kZXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgTUZBIGV4ZW1wdGlvbiAoYWRtaW4vdGVzdCBzY2VuYXJpb3MpLlxuICAgKlxuICAgKiBAcGFyYW0gZXhlbXB0IC0gV2hldGhlciB0byBleGVtcHQgdXNlciBmcm9tIE1GQVxuICAgKiBAcGFyYW0gcmVhc29uIC0gT3B0aW9uYWwgcmVhc29uIGZvciBleGVtcHRpb25cbiAgICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gZXhlbXB0aW9uIGlzIHNldFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGF3YWl0IHRoaXMuYXV0aC5zZXRNZmFFeGVtcHRpb24odHJ1ZSwgJ1Rlc3QgYWNjb3VudCcpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIHNldE1mYUV4ZW1wdGlvbihleGVtcHQ6IGJvb2xlYW4sIHJlYXNvbj86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5zZXRNZmFFeGVtcHRpb24oZXhlbXB0LCByZWFzb24pO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBEZXZpY2UgVHJ1c3RcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBUcnVzdCBjdXJyZW50IGRldmljZS5cbiAgICpcbiAgICogQHJldHVybnMgUHJvbWlzZSB3aXRoIGRldmljZSB0b2tlblxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYXV0aC50cnVzdERldmljZSgpO1xuICAgKiBjb25zb2xlLmxvZygnRGV2aWNlIHRydXN0ZWQ6JywgcmVzdWx0LmRldmljZVRva2VuKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyB0cnVzdERldmljZSgpOiBQcm9taXNlPHsgZGV2aWNlVG9rZW46IHN0cmluZyB9PiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LnRydXN0RGV2aWNlKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdGhlIGN1cnJlbnQgZGV2aWNlIGlzIHRydXN0ZWQuXG4gICAqXG4gICAqIEByZXR1cm5zIFByb21pc2Ugd2l0aCB0cnVzdGVkIHN0YXR1c1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYXV0aC5pc1RydXN0ZWREZXZpY2UoKTtcbiAgICogaWYgKHJlc3VsdC50cnVzdGVkKSB7XG4gICAqICAgY29uc29sZS5sb2coJ1RoaXMgZGV2aWNlIGlzIHRydXN0ZWQnKTtcbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGlzVHJ1c3RlZERldmljZSgpOiBQcm9taXNlPHsgdHJ1c3RlZDogYm9vbGVhbiB9PiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmlzVHJ1c3RlZERldmljZSgpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBBdWRpdCBIaXN0b3J5XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogR2V0IHBhZ2luYXRlZCBhdWRpdCBoaXN0b3J5IGZvciB0aGUgY3VycmVudCB1c2VyLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gUXVlcnkgcGFyYW1ldGVycyBmb3IgZmlsdGVyaW5nIGFuZCBwYWdpbmF0aW9uXG4gICAqIEByZXR1cm5zIFByb21pc2Ugb2YgYXVkaXQgaGlzdG9yeSByZXNwb25zZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IGhpc3RvcnkgPSBhd2FpdCB0aGlzLmF1dGguZ2V0QXVkaXRIaXN0b3J5KHtcbiAgICogICBwYWdlOiAxLFxuICAgKiAgIGxpbWl0OiAyMCxcbiAgICogICBldmVudFR5cGU6ICdMT0dJTl9TVUNDRVNTJ1xuICAgKiB9KTtcbiAgICogY29uc29sZS5sb2coJ0F1ZGl0IGhpc3Rvcnk6JywgaGlzdG9yeSk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgZ2V0QXVkaXRIaXN0b3J5KHBhcmFtcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4+KTogUHJvbWlzZTxBdWRpdEhpc3RvcnlSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXRBdWRpdEhpc3RvcnkocGFyYW1zKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gRXNjYXBlIEhhdGNoXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogRXhwb3NlIHVuZGVybHlpbmcgTkF1dGhDbGllbnQgZm9yIGFkdmFuY2VkIHNjZW5hcmlvcy5cbiAgICpcbiAgICogQGRlcHJlY2F0ZWQgQWxsIGNvcmUgZnVuY3Rpb25hbGl0eSBpcyBub3cgZXhwb3NlZCBkaXJlY3RseSBvbiBBdXRoU2VydmljZSBhcyBQcm9taXNlcy5cbiAgICogVXNlIHRoZSBkaXJlY3QgbWV0aG9kcyBvbiBBdXRoU2VydmljZSBpbnN0ZWFkIChlLmcuLCBgYXV0aC5jaGFuZ2VQYXNzd29yZCgpYCBpbnN0ZWFkIG9mIGBhdXRoLmdldENsaWVudCgpLmNoYW5nZVBhc3N3b3JkKClgKS5cbiAgICogVGhpcyBtZXRob2QgaXMga2VwdCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBvbmx5IGFuZCBtYXkgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSB2ZXJzaW9uLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgdW5kZXJseWluZyBOQXV0aENsaWVudCBpbnN0YW5jZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIC8vIERlcHJlY2F0ZWQgLSB1c2UgZGlyZWN0IG1ldGhvZHMgaW5zdGVhZFxuICAgKiBjb25zdCBzdGF0dXMgPSBhd2FpdCB0aGlzLmF1dGguZ2V0Q2xpZW50KCkuZ2V0TWZhU3RhdHVzKCk7XG4gICAqXG4gICAqIC8vIFByZWZlcnJlZCAtIHVzZSBkaXJlY3QgbWV0aG9kc1xuICAgKiBjb25zdCBzdGF0dXMgPSBhd2FpdCB0aGlzLmF1dGguZ2V0TWZhU3RhdHVzKCk7XG4gICAqIGBgYFxuICAgKi9cbiAgZ2V0Q2xpZW50KCk6IE5BdXRoQ2xpZW50IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQ7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEludGVybmFsIE1ldGhvZHNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIGJ5IGh5ZHJhdGluZyBzdGF0ZSBmcm9tIHN0b3JhZ2UuXG4gICAqIENhbGxlZCBhdXRvbWF0aWNhbGx5IG9uIGNvbnN0cnVjdGlvbi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgaW5pdGlhbGl6ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5pbml0aWFsaXplZCkgcmV0dXJuO1xuICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSB0cnVlO1xuXG4gICAgYXdhaXQgdGhpcy5jbGllbnQuaW5pdGlhbGl6ZSgpO1xuXG4gICAgLy8gSHlkcmF0ZSBjaGFsbGVuZ2Ugc3RhdGVcbiAgICBjb25zdCBzdG9yZWRDaGFsbGVuZ2UgPSBhd2FpdCB0aGlzLmNsaWVudC5nZXRTdG9yZWRDaGFsbGVuZ2UoKTtcbiAgICBpZiAoc3RvcmVkQ2hhbGxlbmdlKSB7XG4gICAgICB0aGlzLmNoYWxsZW5nZVN1YmplY3QubmV4dChzdG9yZWRDaGFsbGVuZ2UpO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBzdWJqZWN0cyBmcm9tIGNsaWVudCBzdGF0ZVxuICAgIGNvbnN0IHVzZXIgPSB0aGlzLmNsaWVudC5nZXRDdXJyZW50VXNlcigpO1xuICAgIGlmICh1c2VyKSB7XG4gICAgICB0aGlzLmN1cnJlbnRVc2VyU3ViamVjdC5uZXh0KHVzZXIpO1xuICAgICAgdGhpcy5pc0F1dGhlbnRpY2F0ZWRTdWJqZWN0Lm5leHQodHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBjaGFsbGVuZ2Ugc3RhdGUgYWZ0ZXIgYXV0aCByZXNwb25zZS5cbiAgICovXG4gIHByaXZhdGUgdXBkYXRlQ2hhbGxlbmdlU3RhdGUocmVzcG9uc2U6IEF1dGhSZXNwb25zZSk6IEF1dGhSZXNwb25zZSB7XG4gICAgaWYgKHJlc3BvbnNlLmNoYWxsZW5nZU5hbWUpIHtcbiAgICAgIHRoaXMuY2hhbGxlbmdlU3ViamVjdC5uZXh0KHJlc3BvbnNlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jaGFsbGVuZ2VTdWJqZWN0Lm5leHQobnVsbCk7XG4gICAgfVxuICAgIHJldHVybiByZXNwb25zZTtcbiAgfVxufVxuIl19