@privateconnect/sdk 0.7.7 → 0.8.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +112 -3
- package/dist/index.js +100 -2
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -96,11 +96,77 @@ export interface Grant {
|
|
|
96
96
|
export interface GrantCreateOptions {
|
|
97
97
|
agentLabel: string;
|
|
98
98
|
resourceType: 'db' | 'api' | 'path';
|
|
99
|
-
resourceName
|
|
99
|
+
resourceName?: string;
|
|
100
|
+
groupId?: string;
|
|
100
101
|
scope?: 'read-only' | 'full';
|
|
101
102
|
/** Duration string: 60s, 5m, 1h, 1d. Omit for persistent grant. */
|
|
102
103
|
ttl?: string;
|
|
103
104
|
}
|
|
105
|
+
export interface ServiceRegisterOptions {
|
|
106
|
+
agentId: string;
|
|
107
|
+
name: string;
|
|
108
|
+
targetHost: string;
|
|
109
|
+
targetPort: number;
|
|
110
|
+
protocol?: 'auto' | 'tcp' | 'udp' | 'http' | 'https';
|
|
111
|
+
isPublic?: boolean;
|
|
112
|
+
groupId?: string;
|
|
113
|
+
}
|
|
114
|
+
export interface ProvisionOptions {
|
|
115
|
+
clientType: string;
|
|
116
|
+
label?: string;
|
|
117
|
+
name?: string;
|
|
118
|
+
ttlSeconds?: number;
|
|
119
|
+
}
|
|
120
|
+
export interface ProvisionResult {
|
|
121
|
+
agentId: string;
|
|
122
|
+
token: string;
|
|
123
|
+
expiresAt: string;
|
|
124
|
+
workspaceId: string;
|
|
125
|
+
workspaceName: string;
|
|
126
|
+
}
|
|
127
|
+
export interface ShareCreateOptions {
|
|
128
|
+
name: string;
|
|
129
|
+
description?: string;
|
|
130
|
+
expiresIn?: '1h' | '24h' | '7d' | '30d' | 'never';
|
|
131
|
+
allowedPaths?: string[];
|
|
132
|
+
allowedMethods?: ('GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE')[];
|
|
133
|
+
rateLimitPerMin?: number;
|
|
134
|
+
}
|
|
135
|
+
export interface Share {
|
|
136
|
+
id: string;
|
|
137
|
+
name: string;
|
|
138
|
+
description?: string;
|
|
139
|
+
expiresAt: string | null;
|
|
140
|
+
revokedAt: string | null;
|
|
141
|
+
createdAt: string;
|
|
142
|
+
isActive: boolean;
|
|
143
|
+
shareUrl: string;
|
|
144
|
+
tokenPreview: string;
|
|
145
|
+
}
|
|
146
|
+
export interface ServiceGroup {
|
|
147
|
+
id: string;
|
|
148
|
+
name: string;
|
|
149
|
+
metadata: Record<string, unknown> | null;
|
|
150
|
+
createdAt: string;
|
|
151
|
+
services: Array<{
|
|
152
|
+
id: string;
|
|
153
|
+
name: string;
|
|
154
|
+
status: string;
|
|
155
|
+
protocol: string;
|
|
156
|
+
}>;
|
|
157
|
+
}
|
|
158
|
+
export interface GroupCreateOptions {
|
|
159
|
+
name: string;
|
|
160
|
+
metadata?: Record<string, unknown>;
|
|
161
|
+
services?: Array<{
|
|
162
|
+
agentId: string;
|
|
163
|
+
name: string;
|
|
164
|
+
targetHost: string;
|
|
165
|
+
targetPort: number;
|
|
166
|
+
protocol?: string;
|
|
167
|
+
isPublic?: boolean;
|
|
168
|
+
}>;
|
|
169
|
+
}
|
|
104
170
|
export declare const RESOURCE_TYPES: readonly ["postgres", "mysql", "redis", "http", "generic-tcp"];
|
|
105
171
|
export type ResourceType = typeof RESOURCE_TYPES[number];
|
|
106
172
|
export declare const ACCESS_MODES: readonly ["tcp", "http"];
|
|
@@ -132,6 +198,7 @@ export interface ManifestResource {
|
|
|
132
198
|
export declare class AgentsAPI {
|
|
133
199
|
private client;
|
|
134
200
|
constructor(client: PrivateConnect);
|
|
201
|
+
provision(options: ProvisionOptions): Promise<ProvisionResult>;
|
|
135
202
|
list(options?: {
|
|
136
203
|
onlineOnly?: boolean;
|
|
137
204
|
}): Promise<Agent[]>;
|
|
@@ -161,8 +228,13 @@ export declare class AgentsAPI {
|
|
|
161
228
|
export declare class ServicesAPI {
|
|
162
229
|
private client;
|
|
163
230
|
constructor(client: PrivateConnect);
|
|
231
|
+
register(options: ServiceRegisterOptions): Promise<Service>;
|
|
164
232
|
list(): Promise<Service[]>;
|
|
165
233
|
get(name: string): Promise<Service | null>;
|
|
234
|
+
update(id: string, options: {
|
|
235
|
+
name?: string;
|
|
236
|
+
}): Promise<void>;
|
|
237
|
+
delete(id: string): Promise<void>;
|
|
166
238
|
/**
|
|
167
239
|
* Get connection details for a service.
|
|
168
240
|
*
|
|
@@ -197,16 +269,53 @@ export declare class GrantsAPI {
|
|
|
197
269
|
*/
|
|
198
270
|
validate(token: string): Promise<Grant | null>;
|
|
199
271
|
}
|
|
272
|
+
export declare class SharesAPI {
|
|
273
|
+
private client;
|
|
274
|
+
constructor(client: PrivateConnect);
|
|
275
|
+
create(serviceId: string, options: ShareCreateOptions): Promise<{
|
|
276
|
+
id: string;
|
|
277
|
+
token: string;
|
|
278
|
+
shareUrl: string;
|
|
279
|
+
expiresAt: string | null;
|
|
280
|
+
}>;
|
|
281
|
+
list(serviceId: string): Promise<Share[]>;
|
|
282
|
+
revoke(shareId: string): Promise<void>;
|
|
283
|
+
}
|
|
284
|
+
export declare class GroupsAPI {
|
|
285
|
+
private client;
|
|
286
|
+
constructor(client: PrivateConnect);
|
|
287
|
+
create(options: GroupCreateOptions): Promise<ServiceGroup>;
|
|
288
|
+
list(): Promise<ServiceGroup[]>;
|
|
289
|
+
get(id: string): Promise<ServiceGroup>;
|
|
290
|
+
addService(groupId: string, options: Omit<ServiceRegisterOptions, 'groupId'>): Promise<Service>;
|
|
291
|
+
createShares(groupId: string, options: {
|
|
292
|
+
name: string;
|
|
293
|
+
description?: string;
|
|
294
|
+
expiresIn?: string;
|
|
295
|
+
}): Promise<Array<{
|
|
296
|
+
id: string;
|
|
297
|
+
token: string;
|
|
298
|
+
serviceName: string;
|
|
299
|
+
shareUrl: string;
|
|
300
|
+
}>>;
|
|
301
|
+
delete(id: string): Promise<{
|
|
302
|
+
deletedServices: number;
|
|
303
|
+
}>;
|
|
304
|
+
}
|
|
200
305
|
export declare class PrivateConnect {
|
|
201
306
|
private config;
|
|
202
307
|
private manifest;
|
|
203
308
|
private manifestPath?;
|
|
204
|
-
/** Agents API for discovery and
|
|
309
|
+
/** Agents API for discovery, orchestration, and provisioning */
|
|
205
310
|
agents: AgentsAPI;
|
|
206
|
-
/** Services API for connecting to services */
|
|
311
|
+
/** Services API for registering, connecting to, and managing services */
|
|
207
312
|
services: ServicesAPI;
|
|
208
313
|
/** Grants API for managing scoped access tokens (time-limited or persistent) */
|
|
209
314
|
grants: GrantsAPI;
|
|
315
|
+
/** Shares API for creating and managing service share links */
|
|
316
|
+
shares: SharesAPI;
|
|
317
|
+
/** Groups API for managing service groups (per-branch, per-project environments) */
|
|
318
|
+
groups: GroupsAPI;
|
|
210
319
|
constructor(config?: PrivateConnectConfig);
|
|
211
320
|
/**
|
|
212
321
|
* Load a pconnect.yml manifest and return a configured client.
|
package/dist/index.js
CHANGED
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
* ```
|
|
30
30
|
*/
|
|
31
31
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
32
|
-
exports.PrivateConnect = exports.GrantsAPI = exports.ServicesAPI = exports.AgentsAPI = exports.TRANSPORT_MODES = exports.ACCESS_MODES = exports.RESOURCE_TYPES = void 0;
|
|
32
|
+
exports.PrivateConnect = exports.GroupsAPI = exports.SharesAPI = exports.GrantsAPI = exports.ServicesAPI = exports.AgentsAPI = exports.TRANSPORT_MODES = exports.ACCESS_MODES = exports.RESOURCE_TYPES = void 0;
|
|
33
33
|
exports.connect = connect;
|
|
34
34
|
exports.fromManifest = fromManifest;
|
|
35
35
|
const fs = require("fs");
|
|
@@ -217,6 +217,13 @@ class AgentsAPI {
|
|
|
217
217
|
constructor(client) {
|
|
218
218
|
this.client = client;
|
|
219
219
|
}
|
|
220
|
+
async provision(options) {
|
|
221
|
+
const response = await this.client.fetch('/v1/agents/provision', {
|
|
222
|
+
method: 'POST',
|
|
223
|
+
body: JSON.stringify(options),
|
|
224
|
+
});
|
|
225
|
+
return response.json();
|
|
226
|
+
}
|
|
220
227
|
async list(options) {
|
|
221
228
|
const response = await this.client.fetch('/v1/agents/orchestration');
|
|
222
229
|
const data = await response.json();
|
|
@@ -291,6 +298,14 @@ class ServicesAPI {
|
|
|
291
298
|
constructor(client) {
|
|
292
299
|
this.client = client;
|
|
293
300
|
}
|
|
301
|
+
async register(options) {
|
|
302
|
+
const response = await this.client.fetch('/v1/services/register', {
|
|
303
|
+
method: 'POST',
|
|
304
|
+
body: JSON.stringify(options),
|
|
305
|
+
});
|
|
306
|
+
const data = await response.json();
|
|
307
|
+
return data.service;
|
|
308
|
+
}
|
|
294
309
|
async list() {
|
|
295
310
|
const response = await this.client.fetch('/v1/services');
|
|
296
311
|
return response.json();
|
|
@@ -299,6 +314,15 @@ class ServicesAPI {
|
|
|
299
314
|
const services = await this.list();
|
|
300
315
|
return services.find(s => s.name.toLowerCase() === name.toLowerCase()) || null;
|
|
301
316
|
}
|
|
317
|
+
async update(id, options) {
|
|
318
|
+
await this.client.fetch(`/v1/services/${id}`, {
|
|
319
|
+
method: 'PATCH',
|
|
320
|
+
body: JSON.stringify(options),
|
|
321
|
+
});
|
|
322
|
+
}
|
|
323
|
+
async delete(id) {
|
|
324
|
+
await this.client.fetch(`/v1/services/${id}`, { method: 'DELETE' });
|
|
325
|
+
}
|
|
302
326
|
/**
|
|
303
327
|
* Get connection details for a service.
|
|
304
328
|
*
|
|
@@ -417,6 +441,78 @@ class GrantsAPI {
|
|
|
417
441
|
}
|
|
418
442
|
exports.GrantsAPI = GrantsAPI;
|
|
419
443
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
444
|
+
// Shares API
|
|
445
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
446
|
+
class SharesAPI {
|
|
447
|
+
constructor(client) {
|
|
448
|
+
this.client = client;
|
|
449
|
+
}
|
|
450
|
+
async create(serviceId, options) {
|
|
451
|
+
const response = await this.client.fetch(`/v1/services/${serviceId}/shares`, {
|
|
452
|
+
method: 'POST',
|
|
453
|
+
body: JSON.stringify(options),
|
|
454
|
+
});
|
|
455
|
+
const data = await response.json();
|
|
456
|
+
return data.share;
|
|
457
|
+
}
|
|
458
|
+
async list(serviceId) {
|
|
459
|
+
const response = await this.client.fetch(`/v1/services/${serviceId}/shares`);
|
|
460
|
+
const data = await response.json();
|
|
461
|
+
return data.shares || [];
|
|
462
|
+
}
|
|
463
|
+
async revoke(shareId) {
|
|
464
|
+
await this.client.fetch(`/v1/shares/${shareId}`, { method: 'DELETE' });
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
exports.SharesAPI = SharesAPI;
|
|
468
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
469
|
+
// Groups API
|
|
470
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
471
|
+
class GroupsAPI {
|
|
472
|
+
constructor(client) {
|
|
473
|
+
this.client = client;
|
|
474
|
+
}
|
|
475
|
+
async create(options) {
|
|
476
|
+
const response = await this.client.fetch('/v1/groups', {
|
|
477
|
+
method: 'POST',
|
|
478
|
+
body: JSON.stringify(options),
|
|
479
|
+
});
|
|
480
|
+
const data = await response.json();
|
|
481
|
+
return data.group;
|
|
482
|
+
}
|
|
483
|
+
async list() {
|
|
484
|
+
const response = await this.client.fetch('/v1/groups');
|
|
485
|
+
const data = await response.json();
|
|
486
|
+
return data.groups || [];
|
|
487
|
+
}
|
|
488
|
+
async get(id) {
|
|
489
|
+
const response = await this.client.fetch(`/v1/groups/${id}`);
|
|
490
|
+
const data = await response.json();
|
|
491
|
+
return data.group;
|
|
492
|
+
}
|
|
493
|
+
async addService(groupId, options) {
|
|
494
|
+
const response = await this.client.fetch(`/v1/groups/${groupId}/services`, {
|
|
495
|
+
method: 'POST',
|
|
496
|
+
body: JSON.stringify(options),
|
|
497
|
+
});
|
|
498
|
+
const data = await response.json();
|
|
499
|
+
return data.service;
|
|
500
|
+
}
|
|
501
|
+
async createShares(groupId, options) {
|
|
502
|
+
const response = await this.client.fetch(`/v1/groups/${groupId}/shares`, {
|
|
503
|
+
method: 'POST',
|
|
504
|
+
body: JSON.stringify(options),
|
|
505
|
+
});
|
|
506
|
+
const data = await response.json();
|
|
507
|
+
return data.shares || [];
|
|
508
|
+
}
|
|
509
|
+
async delete(id) {
|
|
510
|
+
const response = await this.client.fetch(`/v1/groups/${id}`, { method: 'DELETE' });
|
|
511
|
+
return response.json();
|
|
512
|
+
}
|
|
513
|
+
}
|
|
514
|
+
exports.GroupsAPI = GroupsAPI;
|
|
515
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
420
516
|
// Main Client
|
|
421
517
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
422
518
|
class PrivateConnect {
|
|
@@ -430,6 +526,8 @@ class PrivateConnect {
|
|
|
430
526
|
this.agents = new AgentsAPI(this);
|
|
431
527
|
this.services = new ServicesAPI(this);
|
|
432
528
|
this.grants = new GrantsAPI(this);
|
|
529
|
+
this.shares = new SharesAPI(this);
|
|
530
|
+
this.groups = new GroupsAPI(this);
|
|
433
531
|
if (!config.disableTracking) {
|
|
434
532
|
trackSdkUsage(this.config.hubUrl);
|
|
435
533
|
}
|
|
@@ -589,4 +687,4 @@ async function connect(serviceName, config) {
|
|
|
589
687
|
function fromManifest(manifestPath) {
|
|
590
688
|
return PrivateConnect.fromManifest(manifestPath);
|
|
591
689
|
}
|
|
592
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNEJHOzs7QUErdEJILDBCQVdDO0FBTUQsb0NBRUM7QUFodkJELHlCQUF5QjtBQUN6Qiw2QkFBNkI7QUFDN0IseUJBQXlCO0FBQ3pCLGdDQUFnQztBQW1GaEMsZ0ZBQWdGO0FBQ2hGLGlCQUFpQjtBQUNqQixnRkFBZ0Y7QUFFbkUsUUFBQSxjQUFjLEdBQUcsQ0FBQyxVQUFVLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsYUFBYSxDQUFVLENBQUM7QUFHaEYsUUFBQSxZQUFZLEdBQUcsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFVLENBQUM7QUFHeEMsUUFBQSxlQUFlLEdBQUcsQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFVLENBQUM7QUF3QjFELGdGQUFnRjtBQUNoRixtQkFBbUI7QUFDbkIsZ0ZBQWdGO0FBRWhGLE1BQU0sa0JBQWtCLEdBQUc7SUFDekIsY0FBYztJQUNkLGVBQWU7SUFDZixlQUFlO0lBQ2YsZUFBZTtJQUNmLGdCQUFnQjtJQUNoQixnQkFBZ0I7Q0FDakIsQ0FBQztBQUVGLE1BQU0sYUFBYSxHQUFpQztJQUNsRCxRQUFRLEVBQUUsSUFBSTtJQUNkLEtBQUssRUFBRSxJQUFJO0lBQ1gsS0FBSyxFQUFFLElBQUk7SUFDWCxJQUFJLEVBQUUsRUFBRTtJQUNSLGFBQWEsRUFBRSxDQUFDO0NBQ2pCLENBQUM7QUFFRixNQUFNLGdCQUFnQixHQUFpQztJQUNyRCxRQUFRLEVBQUUsVUFBVTtJQUNwQixLQUFLLEVBQUUsT0FBTztJQUNkLEtBQUssRUFBRSxPQUFPO0lBQ2QsSUFBSSxFQUFFLE1BQU07SUFDWixhQUFhLEVBQUUsS0FBSztDQUNyQixDQUFDO0FBRUYsTUFBTSxXQUFXLEdBQWlDO0lBQ2hELFFBQVEsRUFBRSxjQUFjO0lBQ3hCLEtB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LEVBQ25CLE1BQXVEO0lBRXZELE1BQU0sTUFBTSxHQUFHLE1BQU0sRUFBRSxNQUFNLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsQ0FBQztJQUNwRSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDWixNQUFNLElBQUksS0FBSyxDQUFDLG9FQUFvRSxDQUFDLENBQUM7SUFDeEYsQ0FBQztJQUVELE1BQU0sTUFBTSxHQUFHLElBQUksY0FBYyxDQUFDLEVBQUUsR0FBRyxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUN6RCxPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDO0FBQ3pFLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFnQixZQUFZLENBQUMsWUFBcUI7SUFDaEQsT0FBTyxjQUFjLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxDQUFDO0FBQ25ELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogUHJpdmF0ZSBDb25uZWN0IFNES1xyXG4gKlxyXG4gKiBEZWZpbmUgeW91ciBjb25uZWN0aW9ucyBpbiBwY29ubmVjdC55bWwuIEFjY2VzcyB0aGVtIGZyb20gYW55d2hlcmUuXHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYHR5cGVzY3JpcHRcclxuICogaW1wb3J0IHsgUHJpdmF0ZUNvbm5lY3QgfSBmcm9tICdAcHJpdmF0ZWNvbm5lY3Qvc2RrJztcclxuICpcclxuICogLy8gTG9hZCB5b3VyIHByb2plY3QncyBjb25uZWN0aW9uIG1hbmlmZXN0XHJcbiAqIGNvbnN0IHBjID0gUHJpdmF0ZUNvbm5lY3QuZnJvbU1hbmlmZXN0KCk7XHJcbiAqXHJcbiAqIC8vIEdldCBhIHJlc291cmNlIGRlY2xhcmVkIGluIHBjb25uZWN0LnltbFxyXG4gKiBjb25zdCBkYiA9IHBjLnJlc291cmNlKCdzdGFnaW5nLWRiJyk7XHJcbiAqIGNvbnNvbGUubG9nKGRiLmNvbm5lY3Rpb25TdHJpbmcpOyAvLyBwb3N0Z3JlczovL2ludGVybmFsLWRiOjU0MzJcclxuICogY29uc29sZS5sb2coZGIuZW52VmFyKTsgICAgICAgICAgIC8vIERBVEFCQVNFX1VSTFxyXG4gKlxyXG4gKiAvLyBXaXRoIGFuIEFQSSBrZXksIHlvdSBhbHNvIGdldCBodWIgQVBJIGFjY2Vzc1xyXG4gKiBjb25zdCBwYzIgPSBQcml2YXRlQ29ubmVjdC5mcm9tTWFuaWZlc3QoJy4vcGNvbm5lY3QueW1sJywge1xyXG4gKiAgIGFwaUtleTogcHJvY2Vzcy5lbnYuUFJJVkFURUNPTk5FQ1RfQVBJX0tFWSxcclxuICogfSk7XHJcbiAqIGNvbnN0IGdyYW50ID0gYXdhaXQgcGMyLmdyYW50cy5jcmVhdGUoe1xyXG4gKiAgIGFnZW50TGFiZWw6ICdjbGF1ZGUnLFxyXG4gKiAgIHJlc291cmNlVHlwZTogJ2RiJyxcclxuICogICByZXNvdXJjZU5hbWU6ICdwb3N0Z3JlcycsXHJcbiAqICAgdHRsOiAnNW0nLFxyXG4gKiB9KTtcclxuICogYGBgXHJcbiAqL1xyXG5cclxuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xyXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xyXG5pbXBvcnQgKiBhcyBvcyBmcm9tICdvcyc7XHJcbmltcG9ydCAqIGFzIHlhbWwgZnJvbSAnanMteWFtbCc7XHJcblxyXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuLy8gVHlwZXNcclxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFByaXZhdGVDb25uZWN0Q29uZmlnIHtcclxuICAvKiogQVBJIGtleSBmb3IgYXV0aGVudGljYXRpb24uIFJlcXVpcmVkIGZvciBodWIgQVBJIGNhbGxzOyBvcHRpb25hbCBmb3IgbWFuaWZlc3Qtb25seSB1c2FnZS4gKi9cclxuICBhcGlLZXk/OiBzdHJpbmc7XHJcbiAgLyoqIEh1YiBVUkwgKGRlZmF1bHQ6IGh0dHBzOi8vYXBpLnByaXZhdGVjb25uZWN0LmNvKSAqL1xyXG4gIGh1YlVybD86IHN0cmluZztcclxuICAvKiogQWdlbnQgSUQgKGF1dG8tZGV0ZWN0ZWQgZnJvbSBsb2NhbCBjb25maWcgaWYgbm90IHByb3ZpZGVkKSAqL1xyXG4gIGFnZW50SWQ/OiBzdHJpbmc7XHJcbiAgLyoqIERpc2FibGUgdXNhZ2UgdHJhY2tpbmcgKGRlZmF1bHQ6IGZhbHNlKSAqL1xyXG4gIGRpc2FibGVUcmFja2luZz86IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZSB7XHJcbiAgaWQ6IHN0cmluZztcclxuICBuYW1lOiBzdHJpbmc7XHJcbiAgdGFyZ2V0SG9zdDogc3RyaW5nO1xyXG4gIHRhcmdldFBvcnQ6IG51bWJlcjtcclxuICB0dW5uZWxQb3J0PzogbnVtYmVyO1xyXG4gIHByb3RvY29sOiBzdHJpbmc7XHJcbiAgc3RhdHVzOiBzdHJpbmc7XHJcbiAgYWdlbnRMYWJlbD86IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBBZ2VudCB7XHJcbiAgaWQ6IHN0cmluZztcclxuICBuYW1lPzogc3RyaW5nO1xyXG4gIGxhYmVsOiBzdHJpbmc7XHJcbiAgaXNPbmxpbmU6IGJvb2xlYW47XHJcbiAgbGFzdFNlZW5BdDogc3RyaW5nO1xyXG4gIGNhcGFiaWxpdGllczogc3RyaW5nW107XHJcbiAgc2VydmljZXM6IHN0cmluZ1tdO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIENvbm5lY3Rpb24ge1xyXG4gIHNlcnZpY2U6IHN0cmluZztcclxuICBob3N0OiBzdHJpbmc7XHJcbiAgcG9ydDogbnVtYmVyO1xyXG4gIGNvbm5lY3Rpb25TdHJpbmc6IHN0cmluZztcclxuICBlbnZWYXI6IHN0cmluZztcclxuICAvKiogUHJlc2VudCB3aGVuIHVzaW5nIGEgZ3JhbnQtYmFzZWQgY29ubmVjdGlvbiAqL1xyXG4gIGdyYW50VG9rZW4/OiBzdHJpbmc7XHJcbiAgLyoqIFByZXNlbnQgd2hlbiB1c2luZyBhIGdyYW50LWJhc2VkIGNvbm5lY3Rpb24gKi9cclxuICBncmFudEVuZHBvaW50Pzogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIE1lc3NhZ2Uge1xyXG4gIGlkOiBzdHJpbmc7XHJcbiAgZnJvbTogeyBpZDogc3RyaW5nOyBuYW1lPzogc3RyaW5nOyBsYWJlbD86IHN0cmluZyB9O1xyXG4gIGNoYW5uZWw6IHN0cmluZztcclxuICB0eXBlOiBzdHJpbmc7XHJcbiAgcGF5bG9hZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XHJcbiAgY3JlYXRlZEF0OiBzdHJpbmc7XHJcbiAgaXNSZWFkOiBib29sZWFuO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEdyYW50IHtcclxuICBpZDogc3RyaW5nO1xyXG4gIGFnZW50TGFiZWw6IHN0cmluZztcclxuICByZXNvdXJjZVR5cGU6IHN0cmluZztcclxuICByZXNvdXJjZU5hbWU6IHN0cmluZztcclxuICBzY29wZTogc3RyaW5nO1xyXG4gIHRva2VuUHJlZml4Pzogc3RyaW5nO1xyXG4gIHBlcnNpc3RlbnQ6IGJvb2xlYW47XHJcbiAgZXhwaXJlc0F0OiBzdHJpbmcgfCBudWxsO1xyXG4gIGV4cGlyZXNJbk1pbnV0ZXM/OiBudW1iZXIgfCBudWxsO1xyXG4gIHRva2VuPzogc3RyaW5nO1xyXG4gIGVuZHBvaW50Pzogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEdyYW50Q3JlYXRlT3B0aW9ucyB7XHJcbiAgYWdlbnRMYWJlbDogc3RyaW5nO1xyXG4gIHJlc291cmNlVHlwZTogJ2RiJyB8ICdhcGknIHwgJ3BhdGgnO1xyXG4gIHJlc291cmNlTmFtZTogc3RyaW5nO1xyXG4gIHNjb3BlPzogJ3JlYWQtb25seScgfCAnZnVsbCc7XHJcbiAgLyoqIER1cmF0aW9uIHN0cmluZzogNjBzLCA1bSwgMWgsIDFkLiBPbWl0IGZvciBwZXJzaXN0ZW50IGdyYW50LiAqL1xyXG4gIHR0bD86IHN0cmluZztcclxufVxyXG5cclxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcbi8vIE1hbmlmZXN0IFR5cGVzXHJcbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG5cclxuZXhwb3J0IGNvbnN0IFJFU09VUkNFX1RZUEVTID0gWydwb3N0Z3JlcycsICdteXNxbCcsICdyZWRpcycsICdodHRwJywgJ2dlbmVyaWMtdGNwJ10gYXMgY29uc3Q7XHJcbmV4cG9ydCB0eXBlIFJlc291cmNlVHlwZSA9IHR5cGVvZiBSRVNPVVJDRV9UWVBFU1tudW1iZXJdO1xyXG5cclxuZXhwb3J0IGNvbnN0IEFDQ0VTU19NT0RFUyA9IFsndGNwJywgJ2h0dHAnXSBhcyBjb25zdDtcclxuZXhwb3J0IHR5cGUgQWNjZXNzTW9kZSA9IHR5cGVvZiBBQ0NFU1NfTU9ERVNbbnVtYmVyXTtcclxuXHJcbmV4cG9ydCBjb25zdCBUUkFOU1BPUlRfTU9ERVMgPSBbJ2RpcmVjdCcsICdodWInXSBhcyBjb25zdDtcclxuZXhwb3J0IHR5cGUgVHJhbnNwb3J0VmlhID0gdHlwZW9mIFRSQU5TUE9SVF9NT0RFU1tudW1iZXJdO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBNYW5pZmVzdFJlc291cmNlQ29uZmlnIHtcclxuICB0eXBlOiBSZXNvdXJjZVR5cGU7XHJcbiAgaG9zdD86IHN0cmluZztcclxuICBwb3J0PzogbnVtYmVyO1xyXG4gIHRhcmdldEhvc3Q/OiBzdHJpbmc7XHJcbiAgdGFyZ2V0UG9ydD86IG51bWJlcjtcclxuICB1cmw/OiBzdHJpbmc7XHJcbiAgYWNjZXNzOiB7IG1vZGU6IEFjY2Vzc01vZGU7IHZpYT86IFRyYW5zcG9ydFZpYSB9O1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIE1hbmlmZXN0UmVzb3VyY2Uge1xyXG4gIG5hbWU6IHN0cmluZztcclxuICB0eXBlOiBSZXNvdXJjZVR5cGU7XHJcbiAgaG9zdDogc3RyaW5nO1xyXG4gIHBvcnQ6IG51bWJlcjtcclxuICBjb25uZWN0aW9uU3RyaW5nOiBzdHJpbmc7XHJcbiAgZW52VmFyOiBzdHJpbmc7XHJcbiAgYWNjZXNzTW9kZTogQWNjZXNzTW9kZTtcclxuICB2aWE6IFRyYW5zcG9ydFZpYTtcclxufVxyXG5cclxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcbi8vIE1hbmlmZXN0IFBhcnNpbmdcclxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcblxyXG5jb25zdCBNQU5JRkVTVF9GSUxFTkFNRVMgPSBbXHJcbiAgJ3Bjb25uZWN0LnltbCcsXHJcbiAgJ3Bjb25uZWN0LnlhbWwnLFxyXG4gICdwY29ubmVjdC5qc29uJyxcclxuICAnLnBjb25uZWN0LnltbCcsXHJcbiAgJy5wY29ubmVjdC55YW1sJyxcclxuICAnLnBjb25uZWN0Lmpzb24nLFxyXG5dO1xyXG5cclxuY29uc3QgREVGQVVMVF9QT1JUUzogUmVjb3JkPFJlc291cmNlVHlwZSwgbnVtYmVyPiA9IHtcclxuICBwb3N0Z3JlczogNTQzMixcclxuICBteXNxbDogMzMwNixcclxuICByZWRpczogNjM3OSxcclxuICBodHRwOiA4MCxcclxuICAnZ2VuZXJpYy10Y3AnOiAwLFxyXG59O1xyXG5cclxuY29uc3QgUFJPVE9DT0xfU0NIRU1FUzogUmVjb3JkPFJlc291cmNlVHlwZSwgc3RyaW5nPiA9IHtcclxuICBwb3N0Z3JlczogJ3Bvc3RncmVzJyxcclxuICBteXNxbDogJ215c3FsJyxcclxuICByZWRpczogJ3JlZGlzJyxcclxuICBodHRwOiAnaHR0cCcsXHJcbiAgJ2dlbmVyaWMtdGNwJzogJ3RjcCcsXHJcbn07XHJcblxyXG5jb25zdCBFTlZfVkFSX01BUDogUmVjb3JkPFJlc291cmNlVHlwZSwgc3RyaW5nPiA9IHtcclxuICBwb3N0Z3JlczogJ0RBVEFCQVNFX1VSTCcsXHJcbiAgbXlzcWw6ICdEQVRBQkFTRV9VUkwnLFxyXG4gIHJlZGlzOiAnUkVESVNfVVJMJyxcclxuICBodHRwOiAnQVBJX1VSTCcsXHJcbiAgJ2dlbmVyaWMtdGNwJzogJ1RDUF9VUkwnLFxyXG59O1xyXG5cclxuZnVuY3Rpb24gZmluZE1hbmlmZXN0KHN0YXJ0RGlyPzogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XHJcbiAgbGV0IGRpciA9IHN0YXJ0RGlyIHx8IHByb2Nlc3MuY3dkKCk7XHJcblxyXG4gIGZvciAobGV0IGRlcHRoID0gMDsgZGVwdGggPCA0OyBkZXB0aCsrKSB7XHJcbiAgICBmb3IgKGNvbnN0IGZpbGVuYW1lIG9mIE1BTklGRVNUX0ZJTEVOQU1FUykge1xyXG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihkaXIsIGZpbGVuYW1lKTtcclxuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpKSByZXR1cm4gZmlsZVBhdGg7XHJcbiAgICB9XHJcbiAgICBjb25zdCBwYXJlbnQgPSBwYXRoLmRpcm5hbWUoZGlyKTtcclxuICAgIGlmIChwYXJlbnQgPT09IGRpcikgYnJlYWs7XHJcbiAgICBkaXIgPSBwYXJlbnQ7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gbnVsbDtcclxufVxyXG5cclxuZnVuY3Rpb24gcGFyc2VNYW5pZmVzdEZpbGUoZmlsZVBhdGg6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIE1hbmlmZXN0UmVzb3VyY2VDb25maWc+IHtcclxuICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGZpbGVQYXRoLCAndXRmLTgnKTtcclxuICBsZXQgcmF3OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcclxuXHJcbiAgaWYgKGZpbGVQYXRoLmVuZHNXaXRoKCcuanNvbicpKSB7XHJcbiAgICByYXcgPSBKU09OLnBhcnNlKGNvbnRlbnQpO1xyXG4gIH0gZWxzZSB7XHJcbiAgICByYXcgPSB5YW1sLmxvYWQoY29udGVudCkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XHJcbiAgfVxyXG5cclxuICBpZiAoIXJhdyB8fCB0eXBlb2YgcmF3ICE9PSAnb2JqZWN0JyB8fCAhcmF3LnJlc291cmNlcyB8fCB0eXBlb2YgcmF3LnJlc291cmNlcyAhPT0gJ29iamVjdCcpIHtcclxuICAgIHJldHVybiB7fTtcclxuICB9XHJcblxyXG4gIGNvbnN0IHJlc291cmNlczogUmVjb3JkPHN0cmluZywgTWFuaWZlc3RSZXNvdXJjZUNvbmZpZz4gPSB7fTtcclxuICBjb25zdCByYXdSZXNvdXJjZXMgPSByYXcucmVzb3VyY2VzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xyXG5cclxuICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocmF3UmVzb3VyY2VzKSkge1xyXG4gICAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSBjb250aW51ZTtcclxuICAgIGNvbnN0IG9iaiA9IHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xyXG5cclxuICAgIGNvbnN0IHR5cGUgPSBvYmoudHlwZSBhcyBzdHJpbmc7XHJcbiAgICBpZiAoIVJFU09VUkNFX1RZUEVTLmluY2x1ZGVzKHR5cGUgYXMgUmVzb3VyY2VUeXBlKSkgY29udGludWU7XHJcblxyXG4gICAgY29uc3QgYWNjZXNzT2JqID0gKG9iai5hY2Nlc3MgJiYgdHlwZW9mIG9iai5hY2Nlc3MgPT09ICdvYmplY3QnKVxyXG4gICAgICA/IG9iai5hY2Nlc3MgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cclxuICAgICAgOiB7IG1vZGU6ICd0Y3AnIH07XHJcblxyXG4gICAgcmVzb3VyY2VzW25hbWVdID0ge1xyXG4gICAgICB0eXBlOiB0eXBlIGFzIFJlc291cmNlVHlwZSxcclxuICAgICAgaG9zdDogdHlwZW9mIG9iai5ob3N0ID09PSAnc3RyaW5nJyA/IG9iai5ob3N0IDogdW5kZWZpbmVkLFxyXG4gICAgICBwb3J0OiB0eXBlb2Ygb2JqLnBvcnQgPT09ICdudW1iZXInID8gb2JqLnBvcnQgOiB1bmRlZmluZWQsXHJcbiAgICAgIHRhcmdldEhvc3Q6IHR5cGVvZiBvYmoudGFyZ2V0SG9zdCA9PT0gJ3N0cmluZycgPyBvYmoudGFyZ2V0SG9zdCA6IHVuZGVmaW5lZCxcclxuICAgICAgdGFyZ2V0UG9ydDogdHlwZW9mIG9iai50YXJnZXRQb3J0ID09PSAnbnVtYmVyJyA/IG9iai50YXJnZXRQb3J0IDogdW5kZWZpbmVkLFxyXG4gICAgICB1cmw6IHR5cGVvZiBvYmoudXJsID09PSAnc3RyaW5nJyA/IG9iai51cmwgOiB1bmRlZmluZWQsXHJcbiAgICAgIGFjY2Vzczoge1xyXG4gICAgICAgIG1vZGU6IChBQ0NFU1NfTU9ERVMuaW5jbHVkZXMoYWNjZXNzT2JqLm1vZGUgYXMgQWNjZXNzTW9kZSlcclxuICAgICAgICAgID8gYWNjZXNzT2JqLm1vZGVcclxuICAgICAgICAgIDogJ3RjcCcpIGFzIEFjY2Vzc01vZGUsXHJcbiAgICAgICAgdmlhOiAoVFJBTlNQT1JUX01PREVTLmluY2x1ZGVzKGFjY2Vzc09iai52aWEgYXMgVHJhbnNwb3J0VmlhKVxyXG4gICAgICAgICAgPyBhY2Nlc3NPYmoudmlhXHJcbiAgICAgICAgICA6ICdkaXJlY3QnKSBhcyBUcmFuc3BvcnRWaWEsXHJcbiAgICAgIH0sXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHJlc291cmNlcztcclxufVxyXG5cclxuZnVuY3Rpb24gcmVzb2x2ZU1hbmlmZXN0UmVzb3VyY2UobmFtZTogc3RyaW5nLCBjb25maWc6IE1hbmlmZXN0UmVzb3VyY2VDb25maWcpOiBNYW5pZmVzdFJlc291cmNlIHtcclxuICBsZXQgaG9zdDogc3RyaW5nO1xyXG4gIGxldCBwb3J0OiBudW1iZXI7XHJcblxyXG4gIGlmIChjb25maWcudHlwZSA9PT0gJ2h0dHAnICYmIGNvbmZpZy51cmwpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHBhcnNlZCA9IG5ldyBVUkwoY29uZmlnLnVybCk7XHJcbiAgICAgIGhvc3QgPSBwYXJzZWQuaG9zdG5hbWU7XHJcbiAgICAgIHBvcnQgPSBwYXJzZWQucG9ydCA/IHBhcnNlSW50KHBhcnNlZC5wb3J0LCAxMCkgOiAocGFyc2VkLnByb3RvY29sID09PSAnaHR0cHM6JyA/IDQ0MyA6IDgwKTtcclxuICAgIH0gY2F0Y2gge1xyXG4gICAgICBob3N0ID0gY29uZmlnLmhvc3QgfHwgY29uZmlnLnRhcmdldEhvc3QgfHwgJ2xvY2FsaG9zdCc7XHJcbiAgICAgIHBvcnQgPSBjb25maWcucG9ydCB8fCBjb25maWcudGFyZ2V0UG9ydCB8fCBERUZBVUxUX1BPUlRTW2NvbmZpZy50eXBlXTtcclxuICAgIH1cclxuICB9IGVsc2Uge1xyXG4gICAgaG9zdCA9IGNvbmZpZy50YXJnZXRIb3N0IHx8IGNvbmZpZy5ob3N0IHx8ICdsb2NhbGhvc3QnO1xyXG4gICAgcG9ydCA9IGNvbmZpZy50YXJnZXRQb3J0IHx8IGNvbmZpZy5wb3J0IHx8IERFRkFVTFRfUE9SVFNbY29uZmlnLnR5cGVdO1xyXG4gIH1cclxuXHJcbiAgY29uc3Qgc2NoZW1lID0gUFJPVE9DT0xfU0NIRU1FU1tjb25maWcudHlwZV07XHJcbiAgY29uc3QgY29ubmVjdGlvblN0cmluZyA9IGAke3NjaGVtZX06Ly8ke2hvc3R9OiR7cG9ydH1gO1xyXG5cclxuICBjb25zdCBlbnZWYXIgPSBFTlZfVkFSX01BUFtjb25maWcudHlwZV1cclxuICAgIHx8IGAke25hbWUudG9VcHBlckNhc2UoKS5yZXBsYWNlKC8tL2csICdfJyl9X1VSTGA7XHJcblxyXG4gIHJldHVybiB7XHJcbiAgICBuYW1lLFxyXG4gICAgdHlwZTogY29uZmlnLnR5cGUsXHJcbiAgICBob3N0LFxyXG4gICAgcG9ydCxcclxuICAgIGNvbm5lY3Rpb25TdHJpbmcsXHJcbiAgICBlbnZWYXIsXHJcbiAgICBhY2Nlc3NNb2RlOiBjb25maWcuYWNjZXNzLm1vZGUsXHJcbiAgICB2aWE6IGNvbmZpZy5hY2Nlc3MudmlhIHx8ICdkaXJlY3QnLFxyXG4gIH07XHJcbn1cclxuXHJcbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG4vLyBUcmFja2luZ1xyXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuXHJcbmZ1bmN0aW9uIHRyYWNrU2RrVXNhZ2UoaHViVXJsOiBzdHJpbmcpOiB2b2lkIHtcclxuICBjb25zdCBkYXRhID0gSlNPTi5zdHJpbmdpZnkoe1xyXG4gICAgb3M6IHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyA/IHByb2Nlc3MucGxhdGZvcm0gOiAnYnJvd3NlcicsXHJcbiAgICBhcmNoOiB0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgPyAocHJvY2Vzcy5hcmNoID09PSAnYXJtNjQnID8gJ2FybTY0JyA6ICd4NjQnKSA6ICd1bmtub3duJyxcclxuICAgIHZlcnNpb246ICdzZGsnLFxyXG4gICAgc291cmNlOiAnc2RrJyxcclxuICB9KTtcclxuXHJcbiAgZmV0Y2goYCR7aHViVXJsfS92MS9ldmVudHMvaW5zdGFsbGAsIHtcclxuICAgIG1ldGhvZDogJ1BPU1QnLFxyXG4gICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXHJcbiAgICBib2R5OiBkYXRhLFxyXG4gIH0pLmNhdGNoKCgpID0+IHt9KTtcclxufVxyXG5cclxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcbi8vIEFnZW50IElEIERldGVjdGlvblxyXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuXHJcbmNvbnN0IENPTkZJR19QQVRIID0gcGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgJy5wcml2YXRlLWNvbm5lY3QnLCAnY29uZmlnLmpzb24nKTtcclxuXHJcbi8qKlxyXG4gKiBEZXRlY3QgdGhlIGFnZW50IElEIGZyb20gbG9jYWwgY29uZmlnIG9yIGVudmlyb25tZW50LlxyXG4gKiBSZXR1cm5zIHVuZGVmaW5lZCBpZiBubyBhZ2VudCBpcyBjb25maWd1cmVkIOKAlCBjYWxsZXJzIHRoYXQgbmVlZCBhbiBhZ2VudCBJRFxyXG4gKiBzaG91bGQgc3VyZmFjZSBhIGNsZWFyIGVycm9yIHJhdGhlciB0aGFuIHVzaW5nIGEgZmFrZSBvbmUuXHJcbiAqL1xyXG5mdW5jdGlvbiBkZXRlY3RBZ2VudElkKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XHJcbiAgLy8gMS4gRW52aXJvbm1lbnQgdmFyaWFibGVzIChoaWdoZXN0IHByaW9yaXR5IOKAlCB1c2VmdWwgaW4gQ0kpXHJcbiAgY29uc3QgZW52SWQgPSBwcm9jZXNzLmVudi5QUklWQVRFQ09OTkVDVF9BR0VOVF9JRCB8fCBwcm9jZXNzLmVudi5DT05ORUNUX0FHRU5UX0lEO1xyXG4gIGlmIChlbnZJZCkgcmV0dXJuIGVudklkO1xyXG5cclxuICAvLyAyLiBMb2NhbCBjb25maWcgZmlsZSAofi8ucHJpdmF0ZS1jb25uZWN0L2NvbmZpZy5qc29uKVxyXG4gIHRyeSB7XHJcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhDT05GSUdfUEFUSCkpIHtcclxuICAgICAgY29uc3QgcmF3ID0gZnMucmVhZEZpbGVTeW5jKENPTkZJR19QQVRILCAndXRmLTgnKTtcclxuICAgICAgY29uc3QgY29uZmlnID0gSlNPTi5wYXJzZShyYXcpO1xyXG4gICAgICBpZiAoY29uZmlnLmFnZW50SWQgJiYgdHlwZW9mIGNvbmZpZy5hZ2VudElkID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgIHJldHVybiBjb25maWcuYWdlbnRJZDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH0gY2F0Y2gge1xyXG4gICAgLy8gQ29uZmlnIHVucmVhZGFibGUgb3IgbWFsZm9ybWVkIOKAlCBmYWxsIHRocm91Z2hcclxuICB9XHJcblxyXG4gIHJldHVybiB1bmRlZmluZWQ7XHJcbn1cclxuXHJcbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG4vLyBBZ2VudHMgQVBJXHJcbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG5cclxuZXhwb3J0IGNsYXNzIEFnZW50c0FQSSB7XHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjbGllbnQ6IFByaXZhdGVDb25uZWN0KSB7fVxyXG5cclxuICBhc3luYyBsaXN0KG9wdGlvbnM/OiB7IG9ubGluZU9ubHk/OiBib29sZWFuIH0pOiBQcm9taXNlPEFnZW50W10+IHtcclxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jbGllbnQuZmV0Y2goJy92MS9hZ2VudHMvb3JjaGVzdHJhdGlvbicpO1xyXG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcclxuICAgIGxldCBhZ2VudHMgPSBkYXRhLmFnZW50cyB8fCBbXTtcclxuXHJcbiAgICBpZiAob3B0aW9ucz8ub25saW5lT25seSkge1xyXG4gICAgICBhZ2VudHMgPSBhZ2VudHMuZmlsdGVyKChhOiBhbnkpID0+IGEuaXNPbmxpbmUpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBhZ2VudHMubWFwKChhOiBhbnkpID0+ICh7XHJcbiAgICAgIGlkOiBhLmlkLFxyXG4gICAgICBuYW1lOiBhLm5hbWUsXHJcbiAgICAgIGxhYmVsOiBhLmxhYmVsLFxyXG4gICAgICBpc09ubGluZTogYS5pc09ubGluZSxcclxuICAgICAgbGFzdFNlZW5BdDogYS5sYXN0U2VlbkF0LFxyXG4gICAgICBjYXBhYmlsaXRpZXM6IGEuY2FwYWJpbGl0aWVzPy5tYXAoKGM6IGFueSkgPT4gYy5uYW1lKSB8fCBbXSxcclxuICAgICAgc2VydmljZXM6IGEuc2VydmljZXM/Lm1hcCgoczogYW55KSA9PiBzLm5hbWUpIHx8IFtdLFxyXG4gICAgfSkpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgZmluZEJ5Q2FwYWJpbGl0eShjYXBhYmlsaXR5OiBzdHJpbmcpOiBQcm9taXNlPEFnZW50W10+IHtcclxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jbGllbnQuZmV0Y2goYC92MS9hZ2VudHMvYnktY2FwYWJpbGl0eS8ke2VuY29kZVVSSUNvbXBvbmVudChjYXBhYmlsaXR5KX1gKTtcclxuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XHJcbiAgICByZXR1cm4gZGF0YS5hZ2VudHMgfHwgW107XHJcbiAgfVxyXG5cclxuICBhc3luYyByZWdpc3RlckNhcGFiaWxpdGllcyhjYXBhYmlsaXRpZXM6IEFycmF5PHsgbmFtZTogc3RyaW5nOyBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH0+KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBhZ2VudElkID0gdGhpcy5jbGllbnQucmVxdWlyZUFnZW50SWQoKTtcclxuICAgIGF3YWl0IHRoaXMuY2xpZW50LmZldGNoKGAvdjEvYWdlbnRzLyR7YWdlbnRJZH0vY2FwYWJpbGl0aWVzYCwge1xyXG4gICAgICBtZXRob2Q6ICdQT1NUJyxcclxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBjYXBhYmlsaXRpZXMgfSksXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGFzeW5jIHNlbmRNZXNzYWdlKFxyXG4gICAgdG9BZ2VudElkOiBzdHJpbmcsXHJcbiAgICBwYXlsb2FkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcclxuICAgIG9wdGlvbnM/OiB7IGNoYW5uZWw/OiBzdHJpbmc7IHR5cGU/OiAncmVxdWVzdCcgfCAncmVzcG9uc2UnIHwgJ2V2ZW50JyB9XHJcbiAgKTogUHJvbWlzZTx7IG1lc3NhZ2VJZDogc3RyaW5nIH0+IHtcclxuICAgIGNvbnN0IGFnZW50SWQgPSB0aGlzLmNsaWVudC5yZXF1aXJlQWdlbnRJZCgpO1xyXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNsaWVudC5mZXRjaChgL3YxL2FnZW50cy8ke2FnZW50SWR9L21lc3NhZ2VzL3NlbmRgLCB7XHJcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxyXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHRvQWdlbnRJZCwgcGF5bG9hZCwgLi4ub3B0aW9ucyB9KSxcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGJyb2FkY2FzdChcclxuICAgIHBheWxvYWQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxyXG4gICAgb3B0aW9ucz86IHsgY2hhbm5lbD86IHN0cmluZyB9XHJcbiAgKTogUHJvbWlzZTx7IHNlbnQ6IG51bWJlciB9PiB7XHJcbiAgICBjb25zdCBhZ2VudElkID0gdGhpcy5jbGllbnQucmVxdWlyZUFnZW50SWQoKTtcclxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jbGllbnQuZmV0Y2goYC92MS9hZ2VudHMvJHthZ2VudElkfS9tZXNzYWdlcy9icm9hZGNhc3RgLCB7XHJcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxyXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHBheWxvYWQsIC4uLm9wdGlvbnMgfSksXHJcbiAgICB9KTtcclxuICAgIHJldHVybiByZXNwb25zZS5qc29uKCk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBnZXRNZXNzYWdlcyhvcHRpb25zPzogeyBjaGFubmVsPzogc3RyaW5nOyB1bnJlYWRPbmx5PzogYm9vbGVhbjsgbGltaXQ/OiBudW1iZXIgfSk6IFByb21pc2U8TWVzc2FnZVtdPiB7XHJcbiAgICBjb25zdCBhZ2VudElkID0gdGhpcy5jbGllbnQucmVxdWlyZUFnZW50SWQoKTtcclxuICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKTtcclxuICAgIGlmIChvcHRpb25zPy5jaGFubmVsKSBwYXJhbXMuc2V0KCdjaGFubmVsJywgb3B0aW9ucy5jaGFubmVsKTtcclxuICAgIGlmIChvcHRpb25zPy51bnJlYWRPbmx5ICE9PSB1bmRlZmluZWQpIHBhcmFtcy5zZXQoJ3VucmVhZE9ubHknLCBTdHJpbmcob3B0aW9ucy51bnJlYWRPbmx5KSk7XHJcbiAgICBpZiAob3B0aW9ucz8ubGltaXQpIHBhcmFtcy5zZXQoJ2xpbWl0JywgU3RyaW5nKG9wdGlvbnMubGltaXQpKTtcclxuXHJcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuY2xpZW50LmZldGNoKGAvdjEvYWdlbnRzLyR7YWdlbnRJZH0vbWVzc2FnZXM/JHtwYXJhbXN9YCk7XHJcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xyXG4gICAgcmV0dXJuIGRhdGEubWVzc2FnZXMgfHwgW107XHJcbiAgfVxyXG5cclxuICBhc3luYyBtYXJrUmVhZChtZXNzYWdlSWRzOiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3QgYWdlbnRJZCA9IHRoaXMuY2xpZW50LnJlcXVpcmVBZ2VudElkKCk7XHJcbiAgICBhd2FpdCB0aGlzLmNsaWVudC5mZXRjaChgL3YxL2FnZW50cy8ke2FnZW50SWR9L21lc3NhZ2VzL3JlYWRgLCB7XHJcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxyXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IG1lc3NhZ2VJZHMgfSksXHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuXHJcbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG4vLyBTZXJ2aWNlcyBBUElcclxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcblxyXG5leHBvcnQgY2xhc3MgU2VydmljZXNBUEkge1xyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY2xpZW50OiBQcml2YXRlQ29ubmVjdCkge31cclxuXHJcbiAgYXN5bmMgbGlzdCgpOiBQcm9taXNlPFNlcnZpY2VbXT4ge1xyXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNsaWVudC5mZXRjaCgnL3YxL3NlcnZpY2VzJyk7XHJcbiAgICByZXR1cm4gcmVzcG9uc2UuanNvbigpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgZ2V0KG5hbWU6IHN0cmluZyk6IFByb21pc2U8U2VydmljZSB8IG51bGw+IHtcclxuICAgIGNvbnN0IHNlcnZpY2VzID0gYXdhaXQgdGhpcy5saXN0KCk7XHJcbiAgICByZXR1cm4gc2VydmljZXMuZmluZChzID0+IHMubmFtZS50b0xvd2VyQ2FzZSgpID09PSBuYW1lLnRvTG93ZXJDYXNlKCkpIHx8IG51bGw7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgY29ubmVjdGlvbiBkZXRhaWxzIGZvciBhIHNlcnZpY2UuXHJcbiAgICpcclxuICAgKiBJZiBgZ3JhbnRUb2tlbmAgaXMgcHJvdmlkZWQsIHJldHVybnMgYSBwcm94aWVkIGNvbm5lY3Rpb24gdmlhIHRoZSBodWInc1xyXG4gICAqIGdyYW50IGVuZHBvaW50IGluc3RlYWQgb2YgYXNzdW1pbmcgYSBsb2NhbCB0dW5uZWwuXHJcbiAgICovXHJcbiAgYXN5bmMgZ2V0Q29ubmVjdGlvbihzZXJ2aWNlTmFtZTogc3RyaW5nLCBvcHRpb25zPzogeyBncmFudFRva2VuPzogc3RyaW5nIH0pOiBQcm9taXNlPENvbm5lY3Rpb24+IHtcclxuICAgIGlmIChvcHRpb25zPy5ncmFudFRva2VuKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmdldEdyYW50Q29ubmVjdGlvbihzZXJ2aWNlTmFtZSwgb3B0aW9ucy5ncmFudFRva2VuKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBzZXJ2aWNlID0gYXdhaXQgdGhpcy5nZXQoc2VydmljZU5hbWUpO1xyXG4gICAgaWYgKCFzZXJ2aWNlKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihgU2VydmljZSBcIiR7c2VydmljZU5hbWV9XCIgbm90IGZvdW5kYCk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcG9ydCA9IHNlcnZpY2UudHVubmVsUG9ydCB8fCBzZXJ2aWNlLnRhcmdldFBvcnQ7XHJcbiAgICBjb25zdCBob3N0ID0gJ2xvY2FsaG9zdCc7XHJcblxyXG4gICAgbGV0IGNvbm5lY3Rpb25TdHJpbmc6IHN0cmluZztcclxuICAgIGxldCBlbnZWYXI6IHN0cmluZztcclxuXHJcbiAgICBpZiAoc2VydmljZS50YXJnZXRQb3J0ID09PSA1NDMyIHx8IHNlcnZpY2UucHJvdG9jb2wgPT09ICdwb3N0Z3JlcycpIHtcclxuICAgICAgY29ubmVjdGlvblN0cmluZyA9IGBwb3N0Z3JlczovLyR7aG9zdH06JHtwb3J0fS9wb3N0Z3Jlc2A7XHJcbiAgICAgIGVudlZhciA9ICdEQVRBQkFTRV9VUkwnO1xyXG4gICAgfSBlbHNlIGlmIChzZXJ2aWNlLnRhcmdldFBvcnQgPT09IDMzMDYgfHwgc2VydmljZS5wcm90b2NvbCA9PT0gJ215c3FsJykge1xyXG4gICAgICBjb25uZWN0aW9uU3RyaW5nID0gYG15c3FsOi8vJHtob3N0fToke3BvcnR9YDtcclxuICAgICAgZW52VmFyID0gJ0RBVEFCQVNFX1VSTCc7XHJcbiAgICB9IGVsc2UgaWYgKHNlcnZpY2UudGFyZ2V0UG9ydCA9PT0gNjM3OSB8fCBzZXJ2aWNlLnByb3RvY29sID09PSAncmVkaXMnKSB7XHJcbiAgICAgIGNvbm5lY3Rpb25TdHJpbmcgPSBgcmVkaXM6Ly8ke2hvc3R9OiR7cG9ydH1gO1xyXG4gICAgICBlbnZWYXIgPSAnUkVESVNfVVJMJztcclxuICAgIH0gZWxzZSBpZiAoc2VydmljZS50YXJnZXRQb3J0ID09PSAyNzAxNyB8fCBzZXJ2aWNlLnByb3RvY29sID09PSAnbW9uZ29kYicpIHtcclxuICAgICAgY29ubmVjdGlvblN0cmluZyA9IGBtb25nb2RiOi8vJHtob3N0fToke3BvcnR9YDtcclxuICAgICAgZW52VmFyID0gJ01PTkdPREJfVVJJJztcclxuICAgIH0gZWxzZSBpZiAoc2VydmljZS5wcm90b2NvbCA9PT0gJ2h0dHAnIHx8IHNlcnZpY2UucHJvdG9jb2wgPT09ICdodHRwcycpIHtcclxuICAgICAgY29ubmVjdGlvblN0cmluZyA9IGBodHRwOi8vJHtob3N0fToke3BvcnR9YDtcclxuICAgICAgZW52VmFyID0gJ0FQSV9VUkwnO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29ubmVjdGlvblN0cmluZyA9IGB0Y3A6Ly8ke2hvc3R9OiR7cG9ydH1gO1xyXG4gICAgICBlbnZWYXIgPSBgJHtzZXJ2aWNlTmFtZS50b1VwcGVyQ2FzZSgpLnJlcGxhY2UoLy0vZywgJ18nKX1fVVJMYDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4geyBzZXJ2aWNlOiBzZXJ2aWNlTmFtZSwgaG9zdCwgcG9ydCwgY29ubmVjdGlvblN0cmluZywgZW52VmFyIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldEdyYW50Q29ubmVjdGlvbihzZXJ2aWNlTmFtZTogc3RyaW5nLCBncmFudFRva2VuOiBzdHJpbmcpOiBDb25uZWN0aW9uIHtcclxuICAgIGNvbnN0IGh1YlVybCA9IHRoaXMuY2xpZW50Lmh1YlVybDtcclxuICAgIGNvbnN0IGdyYW50RW5kcG9pbnQgPSBgJHtodWJVcmx9L2dyYW50LyR7ZW5jb2RlVVJJQ29tcG9uZW50KHNlcnZpY2VOYW1lKX1gO1xyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIHNlcnZpY2U6IHNlcnZpY2VOYW1lLFxyXG4gICAgICBob3N0OiBuZXcgVVJMKGh1YlVybCkuaG9zdG5hbWUsXHJcbiAgICAgIHBvcnQ6IG5ldyBVUkwoaHViVXJsKS5wb3J0ID8gcGFyc2VJbnQobmV3IFVSTChodWJVcmwpLnBvcnQsIDEwKSA6IDQ0MyxcclxuICAgICAgY29ubmVjdGlvblN0cmluZzogZ3JhbnRFbmRwb2ludCxcclxuICAgICAgZW52VmFyOiAnR1JBTlRfVVJMJyxcclxuICAgICAgZ3JhbnRUb2tlbixcclxuICAgICAgZ3JhbnRFbmRwb2ludCxcclxuICAgIH07XHJcbiAgfVxyXG59XHJcblxyXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuLy8gR3JhbnRzIEFQSVxyXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuXHJcbmV4cG9ydCBjbGFzcyBHcmFudHNBUEkge1xyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY2xpZW50OiBQcml2YXRlQ29ubmVjdCkge31cclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlIGEgdGltZS1saW1pdGVkIGFjY2VzcyBncmFudCBmb3IgYW4gQUkgYWdlbnQgb3IgZXh0ZXJuYWwgY29uc3VtZXIuXHJcbiAgICovXHJcbiAgYXN5bmMgY3JlYXRlKG9wdGlvbnM6IEdyYW50Q3JlYXRlT3B0aW9ucyk6IFByb21pc2U8R3JhbnQ+IHtcclxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jbGllbnQuZmV0Y2goJy92MS9ncmFudHMnLCB7XHJcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxyXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShvcHRpb25zKSxcclxuICAgIH0pO1xyXG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcclxuICAgIHJldHVybiBkYXRhLmdyYW50O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTGlzdCBhY3RpdmUgZ3JhbnRzIGluIHRoZSB3b3Jrc3BhY2UuXHJcbiAgICovXHJcbiAgYXN5bmMgbGlzdChvcHRpb25zPzogeyBpbmNsdWRlRXhwaXJlZD86IGJvb2xlYW4gfSk6IFByb21pc2U8R3JhbnRbXT4ge1xyXG4gICAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpO1xyXG4gICAgaWYgKG9wdGlvbnM/LmluY2x1ZGVFeHBpcmVkKSBwYXJhbXMuc2V0KCdpbmNsdWRlRXhwaXJlZCcsICd0cnVlJyk7XHJcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuY2xpZW50LmZldGNoKGAvdjEvZ3JhbnRzPyR7cGFyYW1zfWApO1xyXG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcclxuICAgIHJldHVybiBkYXRhLmdyYW50cyB8fCBbXTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldm9rZSBhbiBhY3RpdmUgZ3JhbnQgaW1tZWRpYXRlbHkuXHJcbiAgICovXHJcbiAgYXN5bmMgcmV2b2tlKGdyYW50SWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgYXdhaXQgdGhpcy5jbGllbnQuZmV0Y2goYC92MS9ncmFudHMvJHtncmFudElkfWAsIHsgbWV0aG9kOiAnREVMRVRFJyB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFZhbGlkYXRlIGEgZ3JhbnQgdG9rZW4gKHB1YmxpYyBlbmRwb2ludCDigJQgbm8gQVBJIGtleSByZXF1aXJlZCkuXHJcbiAgICogUmV0dXJucyB0aGUgZ3JhbnQgaWYgdmFsaWQsIG51bGwgb3RoZXJ3aXNlLlxyXG4gICAqL1xyXG4gIGFzeW5jIHZhbGlkYXRlKHRva2VuOiBzdHJpbmcpOiBQcm9taXNlPEdyYW50IHwgbnVsbD4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgdXJsID0gYCR7dGhpcy5jbGllbnQuaHViVXJsfS92MS9ncmFudHMvdmFsaWRhdGVgO1xyXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwge1xyXG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxyXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxyXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgdG9rZW4gfSksXHJcbiAgICAgIH0pO1xyXG4gICAgICBpZiAoIXJlc3BvbnNlLm9rKSByZXR1cm4gbnVsbDtcclxuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcclxuICAgICAgcmV0dXJuIGRhdGEudmFsaWQgPyBkYXRhLmdyYW50IDogbnVsbDtcclxuICAgIH0gY2F0Y2gge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG4vLyBNYWluIENsaWVudFxyXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuXHJcbmV4cG9ydCBjbGFzcyBQcml2YXRlQ29ubmVjdCB7XHJcbiAgcHJpdmF0ZSBjb25maWc6IHsgYXBpS2V5Pzogc3RyaW5nOyBodWJVcmw6IHN0cmluZzsgYWdlbnRJZD86IHN0cmluZyB9O1xyXG4gIHByaXZhdGUgbWFuaWZlc3Q6IE1hcDxzdHJpbmcsIE1hbmlmZXN0UmVzb3VyY2U+ID0gbmV3IE1hcCgpO1xyXG4gIHByaXZhdGUgbWFuaWZlc3RQYXRoPzogc3RyaW5nO1xyXG5cclxuICAvKiogQWdlbnRzIEFQSSBmb3IgZGlzY292ZXJ5IGFuZCBvcmNoZXN0cmF0aW9uICovXHJcbiAgcHVibGljIGFnZW50czogQWdlbnRzQVBJO1xyXG5cclxuICAvKiogU2VydmljZXMgQVBJIGZvciBjb25uZWN0aW5nIHRvIHNlcnZpY2VzICovXHJcbiAgcHVibGljIHNlcnZpY2VzOiBTZXJ2aWNlc0FQSTtcclxuXHJcbiAgLyoqIEdyYW50cyBBUEkgZm9yIG1hbmFnaW5nIHNjb3BlZCBhY2Nlc3MgdG9rZW5zICh0aW1lLWxpbWl0ZWQgb3IgcGVyc2lzdGVudCkgKi9cclxuICBwdWJsaWMgZ3JhbnRzOiBHcmFudHNBUEk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogUHJpdmF0ZUNvbm5lY3RDb25maWcgPSB7fSkge1xyXG4gICAgdGhpcy5jb25maWcgPSB7XHJcbiAgICAgIGFwaUtleTogY29uZmlnLmFwaUtleSxcclxuICAgICAgaHViVXJsOiBjb25maWcuaHViVXJsIHx8ICdodHRwczovL2FwaS5wcml2YXRlY29ubmVjdC5jbycsXHJcbiAgICAgIGFnZW50SWQ6IGNvbmZpZy5hZ2VudElkIHx8IGRldGVjdEFnZW50SWQoKSxcclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5hZ2VudHMgPSBuZXcgQWdlbnRzQVBJKHRoaXMpO1xyXG4gICAgdGhpcy5zZXJ2aWNlcyA9IG5ldyBTZXJ2aWNlc0FQSSh0aGlzKTtcclxuICAgIHRoaXMuZ3JhbnRzID0gbmV3IEdyYW50c0FQSSh0aGlzKTtcclxuXHJcbiAgICBpZiAoIWNvbmZpZy5kaXNhYmxlVHJhY2tpbmcpIHtcclxuICAgICAgdHJhY2tTZGtVc2FnZSh0aGlzLmNvbmZpZy5odWJVcmwpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcbiAgLy8gTWFuaWZlc3QgQVBJIOKAlCB0aGUgcHJpbWFyeSB3YXkgdG8gdXNlIHRoZSBTREtcclxuICAvLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuXHJcbiAgLyoqXHJcbiAgICogTG9hZCBhIHBjb25uZWN0LnltbCBtYW5pZmVzdCBhbmQgcmV0dXJuIGEgY29uZmlndXJlZCBjbGllbnQuXHJcbiAgICpcclxuICAgKiBBdXRvLWRpc2NvdmVycyBwY29ubmVjdC55bWwgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IChvciBwYXJlbnRzKSBpZiBub1xyXG4gICAqIHBhdGggaXMgZ2l2ZW4uIFBhc3MgYSBjb25maWcgdG8gYWxzbyBlbmFibGUgaHViIEFQSSBhY2Nlc3MuXHJcbiAgICpcclxuICAgKiBAZXhhbXBsZVxyXG4gICAqIGBgYHR5cGVzY3JpcHRcclxuICAgKiBjb25zdCBwYyA9IFByaXZhdGVDb25uZWN0LmZyb21NYW5pZmVzdCgpO1xyXG4gICAqIGNvbnN0IGRiID0gcGMucmVzb3VyY2UoJ3N0YWdpbmctZGInKTtcclxuICAgKiBjb25zb2xlLmxvZyhkYi5jb25uZWN0aW9uU3RyaW5nKTsgLy8gcG9zdGdyZXM6Ly9pbnRlcm5hbC1kYjo1NDMyXHJcbiAgICogYGBgXHJcbiAgICovXHJcbiAgc3RhdGljIGZyb21NYW5pZmVzdChcclxuICAgIG1hbmlmZXN0UGF0aD86IHN0cmluZyxcclxuICAgIGNvbmZpZz86IFByaXZhdGVDb25uZWN0Q29uZmlnLFxyXG4gICk6IFByaXZhdGVDb25uZWN0IHtcclxuICAgIGNvbnN0IHJlc29sdmVkUGF0aCA9IG1hbmlmZXN0UGF0aFxyXG4gICAgICA/IHBhdGgucmVzb2x2ZShtYW5pZmVzdFBhdGgpXHJcbiAgICAgIDogZmluZE1hbmlmZXN0KCk7XHJcblxyXG4gICAgaWYgKCFyZXNvbHZlZFBhdGgpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxyXG4gICAgICAgICdObyBwY29ubmVjdC55bWwgZm91bmQuIENyZWF0ZSBvbmUgaW4geW91ciBwcm9qZWN0IHJvb3Q6XFxuXFxuJyArXHJcbiAgICAgICAgJyAgcmVzb3VyY2VzOlxcbicgK1xyXG4gICAgICAgICcgICAgc3RhZ2luZy1kYjpcXG4nICtcclxuICAgICAgICAnICAgICAgdHlwZTogcG9zdGdyZXNcXG4nICtcclxuICAgICAgICAnICAgICAgaG9zdDogaW50ZXJuYWwtZGJcXG4nICtcclxuICAgICAgICAnICAgICAgcG9ydDogNTQzMlxcbicgK1xyXG4gICAgICAgICcgICAgICBhY2Nlc3M6XFxuJyArXHJcbiAgICAgICAgJyAgICAgICAgbW9kZTogdGNwXFxuJ1xyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IFByaXZhdGVDb25uZWN0KGNvbmZpZyB8fCB7IGRpc2FibGVUcmFja2luZzogdHJ1ZSB9KTtcclxuICAgIGluc3RhbmNlLm1hbmlmZXN0UGF0aCA9IHJlc29sdmVkUGF0aDtcclxuXHJcbiAgICBjb25zdCByYXdSZXNvdXJjZXMgPSBwYXJzZU1hbmlmZXN0RmlsZShyZXNvbHZlZFBhdGgpO1xyXG4gICAgZm9yIChjb25zdCBbbmFtZSwgcmF3Q29uZmlnXSBvZiBPYmplY3QuZW50cmllcyhyYXdSZXNvdXJjZXMpKSB7XHJcbiAgICAgIGluc3RhbmNlLm1hbmlmZXN0LnNldChuYW1lLCByZXNvbHZlTWFuaWZlc3RSZXNvdXJjZShuYW1lLCByYXdDb25maWcpKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gaW5zdGFuY2U7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgYSByZXNvdXJjZSBkZWNsYXJlZCBpbiBwY29ubmVjdC55bWwgYnkgbmFtZS5cclxuICAgKlxyXG4gICAqIFJldHVybnMgaXRzIHR5cGUsIGhvc3QsIHBvcnQsIGNvbm5lY3Rpb24gc3RyaW5nLCBhbmQgc3VnZ2VzdGVkIGVudiB2YXIuXHJcbiAgICogV2hlbiBgY29ubmVjdCBkZXZgIGlzIHJ1bm5pbmcsIHRoZSBjb25uZWN0aW9uIHN0cmluZyBwb2ludHMgdG8gYSBsaXZlXHJcbiAgICogbG9jYWwgdHVubmVsLlxyXG4gICAqL1xyXG4gIHJlc291cmNlKG5hbWU6IHN0cmluZyk6IE1hbmlmZXN0UmVzb3VyY2Uge1xyXG4gICAgY29uc3QgciA9IHRoaXMubWFuaWZlc3QuZ2V0KG5hbWUpO1xyXG4gICAgaWYgKCFyKSB7XHJcbiAgICAgIGNvbnN0IGF2YWlsYWJsZSA9IEFycmF5LmZyb20odGhpcy5tYW5pZmVzdC5rZXlzKCkpO1xyXG4gICAgICBjb25zdCBtc2cgPSBhdmFpbGFibGUubGVuZ3RoXHJcbiAgICAgICAgPyBgQXZhaWxhYmxlOiAke2F2YWlsYWJsZS5qb2luKCcsICcpfWBcclxuICAgICAgICA6ICdObyByZXNvdXJjZXMgbG9hZGVkLiBEaWQgeW91IGNhbGwgUHJpdmF0ZUNvbm5lY3QuZnJvbU1hbmlmZXN0KCk/JztcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBSZXNvdXJjZSBcIiR7bmFtZX1cIiBub3QgZm91bmQuICR7bXNnfWApO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHI7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBMaXN0IGFsbCByZXNvdXJjZXMgZGVjbGFyZWQgaW4gdGhlIGxvYWRlZCBtYW5pZmVzdC5cclxuICAgKi9cclxuICByZXNvdXJjZXMoKTogTWFuaWZlc3RSZXNvdXJjZVtdIHtcclxuICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMubWFuaWZlc3QudmFsdWVzKCkpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2VuZXJhdGUgYSBgLmVudmAtY29tcGF0aWJsZSBibG9jayBmb3IgYWxsIG1hbmlmZXN0IHJlc291cmNlcy5cclxuICAgKlxyXG4gICAqIEBleGFtcGxlXHJcbiAgICogYGBgdHlwZXNjcmlwdFxyXG4gICAqIGNvbnN0IHBjID0gUHJpdmF0ZUNvbm5lY3QuZnJvbU1hbmlmZXN0KCk7XHJcbiAgICogY29uc29sZS5sb2cocGMuZW52QmxvY2soKSk7XHJcbiAgICogLy8gREFUQUJBU0VfVVJMPXBvc3RncmVzOi8vaW50ZXJuYWwtZGI6NTQzMlxyXG4gICAqIC8vIFJFRElTX1VSTD1yZWRpczovL3JlZGlzLmludGVybmFsOjYzNzlcclxuICAgKiBgYGBcclxuICAgKi9cclxuICBlbnZCbG9jaygpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMucmVzb3VyY2VzKClcclxuICAgICAgLm1hcChyID0+IGAke3IuZW52VmFyfT0ke3IuY29ubmVjdGlvblN0cmluZ31gKVxyXG4gICAgICAuam9pbignXFxuJyk7XHJcbiAgfVxyXG5cclxuICAvLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuICAvLyBFeGlzdGluZyBBUElzXHJcbiAgLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcblxyXG4gIC8qKiBUaGUgcmVzb2x2ZWQgYWdlbnQgSUQsIG9yIHVuZGVmaW5lZCBpZiBub3QgY29uZmlndXJlZC4gKi9cclxuICBnZXQgYWdlbnRJZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmFnZW50SWQ7XHJcbiAgfVxyXG5cclxuICAvKiogVGhlIGh1YiBVUkwgdGhpcyBjbGllbnQgaXMgY29ubmVjdGVkIHRvLiAqL1xyXG4gIGdldCBodWJVcmwoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLmNvbmZpZy5odWJVcmw7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTaG9ydGhhbmQ6IGdldCBjb25uZWN0aW9uIGRldGFpbHMgZm9yIGEgc2VydmljZS5cclxuICAgKiBQYXNzIGBncmFudFRva2VuYCB0byBjb25uZWN0IHZpYSB0aGUgZ3JhbnQgcHJveHkgaW5zdGVhZCBvZiBhIGxvY2FsIHR1bm5lbC5cclxuICAgKi9cclxuICBhc3luYyBjb25uZWN0KHNlcnZpY2VOYW1lOiBzdHJpbmcsIG9wdGlvbnM/OiB7IGdyYW50VG9rZW4/OiBzdHJpbmcgfSk6IFByb21pc2U8Q29ubmVjdGlvbj4ge1xyXG4gICAgcmV0dXJuIHRoaXMuc2VydmljZXMuZ2V0Q29ubmVjdGlvbihzZXJ2aWNlTmFtZSwgb3B0aW9ucyk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm5zIHRoZSBhZ2VudCBJRCBvciB0aHJvd3MgaWYgbm90IGNvbmZpZ3VyZWQuXHJcbiAgICogVXNlZCBieSBBUElzIHRoYXQgcmVxdWlyZSBhbiBhdXRoZW50aWNhdGVkIGFnZW50IGlkZW50aXR5LlxyXG4gICAqL1xyXG4gIHJlcXVpcmVBZ2VudElkKCk6IHN0cmluZyB7XHJcbiAgICBpZiAoIXRoaXMuY29uZmlnLmFnZW50SWQpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxyXG4gICAgICAgICdBZ2VudCBJRCBub3QgZm91bmQuIEVpdGhlcjpcXG4nICtcclxuICAgICAgICAnICAxLiBSdW4gXCJjb25uZWN0IHVwXCIgdG8gcmVnaXN0ZXIgdGhpcyBtYWNoaW5lLCBvclxcbicgK1xyXG4gICAgICAgICcgIDIuIFNldCBQUklWQVRFQ09OTkVDVF9BR0VOVF9JRCBlbnZpcm9ubWVudCB2YXJpYWJsZSwgb3JcXG4nICtcclxuICAgICAgICAnICAzLiBQYXNzIGFnZW50SWQgaW4gdGhlIFByaXZhdGVDb25uZWN0IGNvbnN0cnVjdG9yLidcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLmNvbmZpZy5hZ2VudElkO1xyXG4gIH1cclxuXHJcbiAgLyoqIFJlcXVpcmVzIGFuIEFQSSBrZXkgb3IgdGhyb3dzLiAqL1xyXG4gIHByaXZhdGUgcmVxdWlyZUFwaUtleSgpOiBzdHJpbmcge1xyXG4gICAgaWYgKCF0aGlzLmNvbmZpZy5hcGlLZXkpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxyXG4gICAgICAgICdBUEkga2V5IHJlcXVpcmVkIGZvciBodWIgQVBJIGNhbGxzLiBFaXRoZXI6XFxuJyArXHJcbiAgICAgICAgJyAgMS4gU2V0IFBSSVZBVEVDT05ORUNUX0FQSV9LRVkgZW52aXJvbm1lbnQgdmFyaWFibGUsIG9yXFxuJyArXHJcbiAgICAgICAgJyAgMi4gUGFzcyBhcGlLZXkgaW4gdGhlIGNvbmZpZy4nXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5jb25maWcuYXBpS2V5O1xyXG4gIH1cclxuXHJcbiAgLyoqIEludGVybmFsIGZldGNoIHdpdGggQVBJIGtleSBhdXRoLiAqL1xyXG4gIGFzeW5jIGZldGNoKHVybFBhdGg6IHN0cmluZywgb3B0aW9ucz86IFJlcXVlc3RJbml0KTogUHJvbWlzZTxSZXNwb25zZT4ge1xyXG4gICAgY29uc3QgYXBpS2V5ID0gdGhpcy5yZXF1aXJlQXBpS2V5KCk7XHJcbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLmNvbmZpZy5odWJVcmx9JHt1cmxQYXRofWA7XHJcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwge1xyXG4gICAgICAuLi5vcHRpb25zLFxyXG4gICAgICBoZWFkZXJzOiB7XHJcbiAgICAgICAgJ3gtYXBpLWtleSc6IGFwaUtleSxcclxuICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxyXG4gICAgICAgIC4uLm9wdGlvbnM/LmhlYWRlcnMsXHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XHJcbiAgICAgIGNvbnN0IGVycm9yID0gYXdhaXQgcmVzcG9uc2UuanNvbigpLmNhdGNoKCgpID0+ICh7IG1lc3NhZ2U6ICdVbmtub3duIGVycm9yJyB9KSk7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvci5tZXNzYWdlIHx8IGBSZXF1ZXN0IGZhaWxlZDogJHtyZXNwb25zZS5zdGF0dXN9YCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgUHJpdmF0ZUNvbm5lY3Q7XHJcblxyXG4vKiogQ29udmVuaWVuY2UgZnVuY3Rpb24gZm9yIHF1aWNrIG9uZS1vZmYgY29ubmVjdGlvbnMgdmlhIHRoZSBodWIgQVBJLiAqL1xyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY29ubmVjdChcclxuICBzZXJ2aWNlTmFtZTogc3RyaW5nLFxyXG4gIGNvbmZpZz86IFByaXZhdGVDb25uZWN0Q29uZmlnICYgeyBncmFudFRva2VuPzogc3RyaW5nIH0sXHJcbik6IFByb21pc2U8Q29ubmVjdGlvbj4ge1xyXG4gIGNvbnN0IGFwaUtleSA9IGNvbmZpZz8uYXBpS2V5IHx8IHByb2Nlc3MuZW52LlBSSVZBVEVDT05ORUNUX0FQSV9LRVk7XHJcbiAgaWYgKCFhcGlLZXkpIHtcclxuICAgIHRocm93IG5ldyBFcnJvcignQVBJIGtleSByZXF1aXJlZC4gU2V0IFBSSVZBVEVDT05ORUNUX0FQSV9LRVkgb3IgcGFzcyBjb25maWcuYXBpS2V5Jyk7XHJcbiAgfVxyXG5cclxuICBjb25zdCBjbGllbnQgPSBuZXcgUHJpdmF0ZUNvbm5lY3QoeyAuLi5jb25maWcsIGFwaUtleSB9KTtcclxuICByZXR1cm4gY2xpZW50LmNvbm5lY3Qoc2VydmljZU5hbWUsIHsgZ3JhbnRUb2tlbjogY29uZmlnPy5ncmFudFRva2VuIH0pO1xyXG59XHJcblxyXG4vKipcclxuICogTG9hZCBwY29ubmVjdC55bWwgYW5kIGdldCBhIHJlc291cmNlIGJ5IG5hbWUuXHJcbiAqIFNob3J0aGFuZCBmb3IgYFByaXZhdGVDb25uZWN0LmZyb21NYW5pZmVzdCgpLnJlc291cmNlKG5hbWUpYC5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBmcm9tTWFuaWZlc3QobWFuaWZlc3RQYXRoPzogc3RyaW5nKTogUHJpdmF0ZUNvbm5lY3Qge1xyXG4gIHJldHVybiBQcml2YXRlQ29ubmVjdC5mcm9tTWFuaWZlc3QobWFuaWZlc3RQYXRoKTtcclxufVxyXG4iXX0=
|
|
690
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNEJHOzs7QUEyNUJILDBCQVdDO0FBTUQsb0NBRUM7QUE1NkJELHlCQUF5QjtBQUN6Qiw2QkFBNkI7QUFDN0IseUJBQXlCO0FBQ3pCLGdDQUFnQztBQTRKaEMsZ0ZBQWdGO0FBQ2hGLGlCQUFpQjtBQUNqQixnRkFBZ0Y7QUFFbkUsUUFBQSxjQUFjLEdBQUcsQ0FBQyxVQUFVLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsYUFBYSxDQUFVLENBQUM7QUFHaEYsUUFBQSxZQUFZLEdBQUcsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFVLENBQUM7QUFHeEMsUUFBQSxlQUFlLEdBQUcsQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFVLENBQUM7QUF3QjFELGdGQUFnRjtBQUNoRixtQkFBbUI7QUFDbkIsZ0ZBQWdGO0FBRWhGLE1BQU0sa0JBQWtCLEdBQUc7SUFDekIsY0FBYztJQUNkLGVBQWU7SUFDZixlQUFlO0lBQ2YsZUFBZTtJQUNmLGdCQUFnQjtJQUNoQixnQkFBZ0I7Q0FDakIsQ0FBQztBQUVGLE1BQU0sYUFBYSxHQUFpQztJQUNsRCxRQUFRLEVBQUUsSUFBSTtJQUNkLEtBQUssRUFBRSxJQUFJO0lBQ1gsS0FBSyxFQUFFLElBQUk7SUFDWCxJQUFJLEVBQUUsRUFBRTtJQUNSLGFBQWEsRUFBRSxDQUFDO0NBQ2pCLENBQUM7QUFFRixNQUFNLGdCQUFnQixHQUFpQztJQUNyRCxRQUFRLEVBQUUsVUFBVTtJQUNwQixLQUFLLEVBQUUsT0FBTztJQUNkLEtBQUssRUFBRSxPQUFPO0lBQ2QsSUFBSSxFQUFFLE1BQU07SUFDWixhQUFhLEVBQUUsS0FBSztDQUNyQixDQUFDO0FBRUYsTUFBTSxXQUFXLEdBQWlDO0lBQ2hELFFBQVEsRUFBRSxjQUFjO0lBQ3hCLEtB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TSxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUM7QUFDekUsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQWdCLFlBQVksQ0FBQyxZQUFxQjtJQUNoRCxPQUFPLGNBQWMsQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLENBQUM7QUFDbkQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBQcml2YXRlIENvbm5lY3QgU0RLXHJcbiAqXHJcbiAqIERlZmluZSB5b3VyIGNvbm5lY3Rpb25zIGluIHBjb25uZWN0LnltbC4gQWNjZXNzIHRoZW0gZnJvbSBhbnl3aGVyZS5cclxuICpcclxuICogQGV4YW1wbGVcclxuICogYGBgdHlwZXNjcmlwdFxyXG4gKiBpbXBvcnQgeyBQcml2YXRlQ29ubmVjdCB9IGZyb20gJ0Bwcml2YXRlY29ubmVjdC9zZGsnO1xyXG4gKlxyXG4gKiAvLyBMb2FkIHlvdXIgcHJvamVjdCdzIGNvbm5lY3Rpb24gbWFuaWZlc3RcclxuICogY29uc3QgcGMgPSBQcml2YXRlQ29ubmVjdC5mcm9tTWFuaWZlc3QoKTtcclxuICpcclxuICogLy8gR2V0IGEgcmVzb3VyY2UgZGVjbGFyZWQgaW4gcGNvbm5lY3QueW1sXHJcbiAqIGNvbnN0IGRiID0gcGMucmVzb3VyY2UoJ3N0YWdpbmctZGInKTtcclxuICogY29uc29sZS5sb2coZGIuY29ubmVjdGlvblN0cmluZyk7IC8vIHBvc3RncmVzOi8vaW50ZXJuYWwtZGI6NTQzMlxyXG4gKiBjb25zb2xlLmxvZyhkYi5lbnZWYXIpOyAgICAgICAgICAgLy8gREFUQUJBU0VfVVJMXHJcbiAqXHJcbiAqIC8vIFdpdGggYW4gQVBJIGtleSwgeW91IGFsc28gZ2V0IGh1YiBBUEkgYWNjZXNzXHJcbiAqIGNvbnN0IHBjMiA9IFByaXZhdGVDb25uZWN0LmZyb21NYW5pZmVzdCgnLi9wY29ubmVjdC55bWwnLCB7XHJcbiAqICAgYXBpS2V5OiBwcm9jZXNzLmVudi5QUklWQVRFQ09OTkVDVF9BUElfS0VZLFxyXG4gKiB9KTtcclxuICogY29uc3QgZ3JhbnQgPSBhd2FpdCBwYzIuZ3JhbnRzLmNyZWF0ZSh7XHJcbiAqICAgYWdlbnRMYWJlbDogJ2NsYXVkZScsXHJcbiAqICAgcmVzb3VyY2VUeXBlOiAnZGInLFxyXG4gKiAgIHJlc291cmNlTmFtZTogJ3Bvc3RncmVzJyxcclxuICogICB0dGw6ICc1bScsXHJcbiAqIH0pO1xyXG4gKiBgYGBcclxuICovXHJcblxyXG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XHJcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XHJcbmltcG9ydCAqIGFzIG9zIGZyb20gJ29zJztcclxuaW1wb3J0ICogYXMgeWFtbCBmcm9tICdqcy15YW1sJztcclxuXHJcbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG4vLyBUeXBlc1xyXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgUHJpdmF0ZUNvbm5lY3RDb25maWcge1xyXG4gIC8qKiBBUEkga2V5IGZvciBhdXRoZW50aWNhdGlvbi4gUmVxdWlyZWQgZm9yIGh1YiBBUEkgY2FsbHM7IG9wdGlvbmFsIGZvciBtYW5pZmVzdC1vbmx5IHVzYWdlLiAqL1xyXG4gIGFwaUtleT86IHN0cmluZztcclxuICAvKiogSHViIFVSTCAoZGVmYXVsdDogaHR0cHM6Ly9hcGkucHJpdmF0ZWNvbm5lY3QuY28pICovXHJcbiAgaHViVXJsPzogc3RyaW5nO1xyXG4gIC8qKiBBZ2VudCBJRCAoYXV0by1kZXRlY3RlZCBmcm9tIGxvY2FsIGNvbmZpZyBpZiBub3QgcHJvdmlkZWQpICovXHJcbiAgYWdlbnRJZD86IHN0cmluZztcclxuICAvKiogRGlzYWJsZSB1c2FnZSB0cmFja2luZyAoZGVmYXVsdDogZmFsc2UpICovXHJcbiAgZGlzYWJsZVRyYWNraW5nPzogYm9vbGVhbjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlIHtcclxuICBpZDogc3RyaW5nO1xyXG4gIG5hbWU6IHN0cmluZztcclxuICB0YXJnZXRIb3N0OiBzdHJpbmc7XHJcbiAgdGFyZ2V0UG9ydDogbnVtYmVyO1xyXG4gIHR1bm5lbFBvcnQ/OiBudW1iZXI7XHJcbiAgcHJvdG9jb2w6IHN0cmluZztcclxuICBzdGF0dXM6IHN0cmluZztcclxuICBhZ2VudExhYmVsPzogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEFnZW50IHtcclxuICBpZDogc3RyaW5nO1xyXG4gIG5hbWU/OiBzdHJpbmc7XHJcbiAgbGFiZWw6IHN0cmluZztcclxuICBpc09ubGluZTogYm9vbGVhbjtcclxuICBsYXN0U2VlbkF0OiBzdHJpbmc7XHJcbiAgY2FwYWJpbGl0aWVzOiBzdHJpbmdbXTtcclxuICBzZXJ2aWNlczogc3RyaW5nW107XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQ29ubmVjdGlvbiB7XHJcbiAgc2VydmljZTogc3RyaW5nO1xyXG4gIGhvc3Q6IHN0cmluZztcclxuICBwb3J0OiBudW1iZXI7XHJcbiAgY29ubmVjdGlvblN0cmluZzogc3RyaW5nO1xyXG4gIGVudlZhcjogc3RyaW5nO1xyXG4gIC8qKiBQcmVzZW50IHdoZW4gdXNpbmcgYSBncmFudC1iYXNlZCBjb25uZWN0aW9uICovXHJcbiAgZ3JhbnRUb2tlbj86IHN0cmluZztcclxuICAvKiogUHJlc2VudCB3aGVuIHVzaW5nIGEgZ3JhbnQtYmFzZWQgY29ubmVjdGlvbiAqL1xyXG4gIGdyYW50RW5kcG9pbnQ/OiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgTWVzc2FnZSB7XHJcbiAgaWQ6IHN0cmluZztcclxuICBmcm9tOiB7IGlkOiBzdHJpbmc7IG5hbWU/OiBzdHJpbmc7IGxhYmVsPzogc3RyaW5nIH07XHJcbiAgY2hhbm5lbDogc3RyaW5nO1xyXG4gIHR5cGU6IHN0cmluZztcclxuICBwYXlsb2FkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcclxuICBjcmVhdGVkQXQ6IHN0cmluZztcclxuICBpc1JlYWQ6IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgR3JhbnQge1xyXG4gIGlkOiBzdHJpbmc7XHJcbiAgYWdlbnRMYWJlbDogc3RyaW5nO1xyXG4gIHJlc291cmNlVHlwZTogc3RyaW5nO1xyXG4gIHJlc291cmNlTmFtZTogc3RyaW5nO1xyXG4gIHNjb3BlOiBzdHJpbmc7XHJcbiAgdG9rZW5QcmVmaXg/OiBzdHJpbmc7XHJcbiAgcGVyc2lzdGVudDogYm9vbGVhbjtcclxuICBleHBpcmVzQXQ6IHN0cmluZyB8IG51bGw7XHJcbiAgZXhwaXJlc0luTWludXRlcz86IG51bWJlciB8IG51bGw7XHJcbiAgdG9rZW4/OiBzdHJpbmc7XHJcbiAgZW5kcG9pbnQ/OiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgR3JhbnRDcmVhdGVPcHRpb25zIHtcclxuICBhZ2VudExhYmVsOiBzdHJpbmc7XHJcbiAgcmVzb3VyY2VUeXBlOiAnZGInIHwgJ2FwaScgfCAncGF0aCc7XHJcbiAgcmVzb3VyY2VOYW1lPzogc3RyaW5nO1xyXG4gIGdyb3VwSWQ/OiBzdHJpbmc7XHJcbiAgc2NvcGU/OiAncmVhZC1vbmx5JyB8ICdmdWxsJztcclxuICAvKiogRHVyYXRpb24gc3RyaW5nOiA2MHMsIDVtLCAxaCwgMWQuIE9taXQgZm9yIHBlcnNpc3RlbnQgZ3JhbnQuICovXHJcbiAgdHRsPzogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VSZWdpc3Rlck9wdGlvbnMge1xyXG4gIGFnZW50SWQ6IHN0cmluZztcclxuICBuYW1lOiBzdHJpbmc7XHJcbiAgdGFyZ2V0SG9zdDogc3RyaW5nO1xyXG4gIHRhcmdldFBvcnQ6IG51bWJlcjtcclxuICBwcm90b2NvbD86ICdhdXRvJyB8ICd0Y3AnIHwgJ3VkcCcgfCAnaHR0cCcgfCAnaHR0cHMnO1xyXG4gIGlzUHVibGljPzogYm9vbGVhbjtcclxuICBncm91cElkPzogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFByb3Zpc2lvbk9wdGlvbnMge1xyXG4gIGNsaWVudFR5cGU6IHN0cmluZztcclxuICBsYWJlbD86IHN0cmluZztcclxuICBuYW1lPzogc3RyaW5nO1xyXG4gIHR0bFNlY29uZHM/OiBudW1iZXI7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgUHJvdmlzaW9uUmVzdWx0IHtcclxuICBhZ2VudElkOiBzdHJpbmc7XHJcbiAgdG9rZW46IHN0cmluZztcclxuICBleHBpcmVzQXQ6IHN0cmluZztcclxuICB3b3Jrc3BhY2VJZDogc3RyaW5nO1xyXG4gIHdvcmtzcGFjZU5hbWU6IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBTaGFyZUNyZWF0ZU9wdGlvbnMge1xyXG4gIG5hbWU6IHN0cmluZztcclxuICBkZXNjcmlwdGlvbj86IHN0cmluZztcclxuICBleHBpcmVzSW4/OiAnMWgnIHwgJzI0aCcgfCAnN2QnIHwgJzMwZCcgfCAnbmV2ZXInO1xyXG4gIGFsbG93ZWRQYXRocz86IHN0cmluZ1tdO1xyXG4gIGFsbG93ZWRNZXRob2RzPzogKCdHRVQnIHwgJ1BPU1QnIHwgJ1BVVCcgfCAnUEFUQ0gnIHwgJ0RFTEVURScpW107XHJcbiAgcmF0ZUxpbWl0UGVyTWluPzogbnVtYmVyO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFNoYXJlIHtcclxuICBpZDogc3RyaW5nO1xyXG4gIG5hbWU6IHN0cmluZztcclxuICBkZXNjcmlwdGlvbj86IHN0cmluZztcclxuICBleHBpcmVzQXQ6IHN0cmluZyB8IG51bGw7XHJcbiAgcmV2b2tlZEF0OiBzdHJpbmcgfCBudWxsO1xyXG4gIGNyZWF0ZWRBdDogc3RyaW5nO1xyXG4gIGlzQWN0aXZlOiBib29sZWFuO1xyXG4gIHNoYXJlVXJsOiBzdHJpbmc7XHJcbiAgdG9rZW5QcmV2aWV3OiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZUdyb3VwIHtcclxuICBpZDogc3RyaW5nO1xyXG4gIG5hbWU6IHN0cmluZztcclxuICBtZXRhZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCBudWxsO1xyXG4gIGNyZWF0ZWRBdDogc3RyaW5nO1xyXG4gIHNlcnZpY2VzOiBBcnJheTx7XHJcbiAgICBpZDogc3RyaW5nO1xyXG4gICAgbmFtZTogc3RyaW5nO1xyXG4gICAgc3RhdHVzOiBzdHJpbmc7XHJcbiAgICBwcm90b2NvbDogc3RyaW5nO1xyXG4gIH0+O1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEdyb3VwQ3JlYXRlT3B0aW9ucyB7XHJcbiAgbmFtZTogc3RyaW5nO1xyXG4gIG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XHJcbiAgc2VydmljZXM/OiBBcnJheTx7XHJcbiAgICBhZ2VudElkOiBzdHJpbmc7XHJcbiAgICBuYW1lOiBzdHJpbmc7XHJcbiAgICB0YXJnZXRIb3N0OiBzdHJpbmc7XHJcbiAgICB0YXJnZXRQb3J0OiBudW1iZXI7XHJcbiAgICBwcm90b2NvbD86IHN0cmluZztcclxuICAgIGlzUHVibGljPzogYm9vbGVhbjtcclxuICB9PjtcclxufVxyXG5cclxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcbi8vIE1hbmlmZXN0IFR5cGVzXHJcbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG5cclxuZXhwb3J0IGNvbnN0IFJFU09VUkNFX1RZUEVTID0gWydwb3N0Z3JlcycsICdteXNxbCcsICdyZWRpcycsICdodHRwJywgJ2dlbmVyaWMtdGNwJ10gYXMgY29uc3Q7XHJcbmV4cG9ydCB0eXBlIFJlc291cmNlVHlwZSA9IHR5cGVvZiBSRVNPVVJDRV9UWVBFU1tudW1iZXJdO1xyXG5cclxuZXhwb3J0IGNvbnN0IEFDQ0VTU19NT0RFUyA9IFsndGNwJywgJ2h0dHAnXSBhcyBjb25zdDtcclxuZXhwb3J0IHR5cGUgQWNjZXNzTW9kZSA9IHR5cGVvZiBBQ0NFU1NfTU9ERVNbbnVtYmVyXTtcclxuXHJcbmV4cG9ydCBjb25zdCBUUkFOU1BPUlRfTU9ERVMgPSBbJ2RpcmVjdCcsICdodWInXSBhcyBjb25zdDtcclxuZXhwb3J0IHR5cGUgVHJhbnNwb3J0VmlhID0gdHlwZW9mIFRSQU5TUE9SVF9NT0RFU1tudW1iZXJdO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBNYW5pZmVzdFJlc291cmNlQ29uZmlnIHtcclxuICB0eXBlOiBSZXNvdXJjZVR5cGU7XHJcbiAgaG9zdD86IHN0cmluZztcclxuICBwb3J0PzogbnVtYmVyO1xyXG4gIHRhcmdldEhvc3Q/OiBzdHJpbmc7XHJcbiAgdGFyZ2V0UG9ydD86IG51bWJlcjtcclxuICB1cmw/OiBzdHJpbmc7XHJcbiAgYWNjZXNzOiB7IG1vZGU6IEFjY2Vzc01vZGU7IHZpYT86IFRyYW5zcG9ydFZpYSB9O1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIE1hbmlmZXN0UmVzb3VyY2Uge1xyXG4gIG5hbWU6IHN0cmluZztcclxuICB0eXBlOiBSZXNvdXJjZVR5cGU7XHJcbiAgaG9zdDogc3RyaW5nO1xyXG4gIHBvcnQ6IG51bWJlcjtcclxuICBjb25uZWN0aW9uU3RyaW5nOiBzdHJpbmc7XHJcbiAgZW52VmFyOiBzdHJpbmc7XHJcbiAgYWNjZXNzTW9kZTogQWNjZXNzTW9kZTtcclxuICB2aWE6IFRyYW5zcG9ydFZpYTtcclxufVxyXG5cclxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcbi8vIE1hbmlmZXN0IFBhcnNpbmdcclxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcblxyXG5jb25zdCBNQU5JRkVTVF9GSUxFTkFNRVMgPSBbXHJcbiAgJ3Bjb25uZWN0LnltbCcsXHJcbiAgJ3Bjb25uZWN0LnlhbWwnLFxyXG4gICdwY29ubmVjdC5qc29uJyxcclxuICAnLnBjb25uZWN0LnltbCcsXHJcbiAgJy5wY29ubmVjdC55YW1sJyxcclxuICAnLnBjb25uZWN0Lmpzb24nLFxyXG5dO1xyXG5cclxuY29uc3QgREVGQVVMVF9QT1JUUzogUmVjb3JkPFJlc291cmNlVHlwZSwgbnVtYmVyPiA9IHtcclxuICBwb3N0Z3JlczogNTQzMixcclxuICBteXNxbDogMzMwNixcclxuICByZWRpczogNjM3OSxcclxuICBodHRwOiA4MCxcclxuICAnZ2VuZXJpYy10Y3AnOiAwLFxyXG59O1xyXG5cclxuY29uc3QgUFJPVE9DT0xfU0NIRU1FUzogUmVjb3JkPFJlc291cmNlVHlwZSwgc3RyaW5nPiA9IHtcclxuICBwb3N0Z3JlczogJ3Bvc3RncmVzJyxcclxuICBteXNxbDogJ215c3FsJyxcclxuICByZWRpczogJ3JlZGlzJyxcclxuICBodHRwOiAnaHR0cCcsXHJcbiAgJ2dlbmVyaWMtdGNwJzogJ3RjcCcsXHJcbn07XHJcblxyXG5jb25zdCBFTlZfVkFSX01BUDogUmVjb3JkPFJlc291cmNlVHlwZSwgc3RyaW5nPiA9IHtcclxuICBwb3N0Z3JlczogJ0RBVEFCQVNFX1VSTCcsXHJcbiAgbXlzcWw6ICdEQVRBQkFTRV9VUkwnLFxyXG4gIHJlZGlzOiAnUkVESVNfVVJMJyxcclxuICBodHRwOiAnQVBJX1VSTCcsXHJcbiAgJ2dlbmVyaWMtdGNwJzogJ1RDUF9VUkwnLFxyXG59O1xyXG5cclxuZnVuY3Rpb24gZmluZE1hbmlmZXN0KHN0YXJ0RGlyPzogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XHJcbiAgbGV0IGRpciA9IHN0YXJ0RGlyIHx8IHByb2Nlc3MuY3dkKCk7XHJcblxyXG4gIGZvciAobGV0IGRlcHRoID0gMDsgZGVwdGggPCA0OyBkZXB0aCsrKSB7XHJcbiAgICBmb3IgKGNvbnN0IGZpbGVuYW1lIG9mIE1BTklGRVNUX0ZJTEVOQU1FUykge1xyXG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihkaXIsIGZpbGVuYW1lKTtcclxuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpKSByZXR1cm4gZmlsZVBhdGg7XHJcbiAgICB9XHJcbiAgICBjb25zdCBwYXJlbnQgPSBwYXRoLmRpcm5hbWUoZGlyKTtcclxuICAgIGlmIChwYXJlbnQgPT09IGRpcikgYnJlYWs7XHJcbiAgICBkaXIgPSBwYXJlbnQ7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gbnVsbDtcclxufVxyXG5cclxuZnVuY3Rpb24gcGFyc2VNYW5pZmVzdEZpbGUoZmlsZVBhdGg6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIE1hbmlmZXN0UmVzb3VyY2VDb25maWc+IHtcclxuICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGZpbGVQYXRoLCAndXRmLTgnKTtcclxuICBsZXQgcmF3OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcclxuXHJcbiAgaWYgKGZpbGVQYXRoLmVuZHNXaXRoKCcuanNvbicpKSB7XHJcbiAgICByYXcgPSBKU09OLnBhcnNlKGNvbnRlbnQpO1xyXG4gIH0gZWxzZSB7XHJcbiAgICByYXcgPSB5YW1sLmxvYWQoY29udGVudCkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XHJcbiAgfVxyXG5cclxuICBpZiAoIXJhdyB8fCB0eXBlb2YgcmF3ICE9PSAnb2JqZWN0JyB8fCAhcmF3LnJlc291cmNlcyB8fCB0eXBlb2YgcmF3LnJlc291cmNlcyAhPT0gJ29iamVjdCcpIHtcclxuICAgIHJldHVybiB7fTtcclxuICB9XHJcblxyXG4gIGNvbnN0IHJlc291cmNlczogUmVjb3JkPHN0cmluZywgTWFuaWZlc3RSZXNvdXJjZUNvbmZpZz4gPSB7fTtcclxuICBjb25zdCByYXdSZXNvdXJjZXMgPSByYXcucmVzb3VyY2VzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xyXG5cclxuICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocmF3UmVzb3VyY2VzKSkge1xyXG4gICAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSBjb250aW51ZTtcclxuICAgIGNvbnN0IG9iaiA9IHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xyXG5cclxuICAgIGNvbnN0IHR5cGUgPSBvYmoudHlwZSBhcyBzdHJpbmc7XHJcbiAgICBpZiAoIVJFU09VUkNFX1RZUEVTLmluY2x1ZGVzKHR5cGUgYXMgUmVzb3VyY2VUeXBlKSkgY29udGludWU7XHJcblxyXG4gICAgY29uc3QgYWNjZXNzT2JqID0gKG9iai5hY2Nlc3MgJiYgdHlwZW9mIG9iai5hY2Nlc3MgPT09ICdvYmplY3QnKVxyXG4gICAgICA/IG9iai5hY2Nlc3MgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cclxuICAgICAgOiB7IG1vZGU6ICd0Y3AnIH07XHJcblxyXG4gICAgcmVzb3VyY2VzW25hbWVdID0ge1xyXG4gICAgICB0eXBlOiB0eXBlIGFzIFJlc291cmNlVHlwZSxcclxuICAgICAgaG9zdDogdHlwZW9mIG9iai5ob3N0ID09PSAnc3RyaW5nJyA/IG9iai5ob3N0IDogdW5kZWZpbmVkLFxyXG4gICAgICBwb3J0OiB0eXBlb2Ygb2JqLnBvcnQgPT09ICdudW1iZXInID8gb2JqLnBvcnQgOiB1bmRlZmluZWQsXHJcbiAgICAgIHRhcmdldEhvc3Q6IHR5cGVvZiBvYmoudGFyZ2V0SG9zdCA9PT0gJ3N0cmluZycgPyBvYmoudGFyZ2V0SG9zdCA6IHVuZGVmaW5lZCxcclxuICAgICAgdGFyZ2V0UG9ydDogdHlwZW9mIG9iai50YXJnZXRQb3J0ID09PSAnbnVtYmVyJyA/IG9iai50YXJnZXRQb3J0IDogdW5kZWZpbmVkLFxyXG4gICAgICB1cmw6IHR5cGVvZiBvYmoudXJsID09PSAnc3RyaW5nJyA/IG9iai51cmwgOiB1bmRlZmluZWQsXHJcbiAgICAgIGFjY2Vzczoge1xyXG4gICAgICAgIG1vZGU6IChBQ0NFU1NfTU9ERVMuaW5jbHVkZXMoYWNjZXNzT2JqLm1vZGUgYXMgQWNjZXNzTW9kZSlcclxuICAgICAgICAgID8gYWNjZXNzT2JqLm1vZGVcclxuICAgICAgICAgIDogJ3RjcCcpIGFzIEFjY2Vzc01vZGUsXHJcbiAgICAgICAgdmlhOiAoVFJBTlNQT1JUX01PREVTLmluY2x1ZGVzKGFjY2Vzc09iai52aWEgYXMgVHJhbnNwb3J0VmlhKVxyXG4gICAgICAgICAgPyBhY2Nlc3NPYmoudmlhXHJcbiAgICAgICAgICA6ICdkaXJlY3QnKSBhcyBUcmFuc3BvcnRWaWEsXHJcbiAgICAgIH0sXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHJlc291cmNlcztcclxufVxyXG5cclxuZnVuY3Rpb24gcmVzb2x2ZU1hbmlmZXN0UmVzb3VyY2UobmFtZTogc3RyaW5nLCBjb25maWc6IE1hbmlmZXN0UmVzb3VyY2VDb25maWcpOiBNYW5pZmVzdFJlc291cmNlIHtcclxuICBsZXQgaG9zdDogc3RyaW5nO1xyXG4gIGxldCBwb3J0OiBudW1iZXI7XHJcblxyXG4gIGlmIChjb25maWcudHlwZSA9PT0gJ2h0dHAnICYmIGNvbmZpZy51cmwpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHBhcnNlZCA9IG5ldyBVUkwoY29uZmlnLnVybCk7XHJcbiAgICAgIGhvc3QgPSBwYXJzZWQuaG9zdG5hbWU7XHJcbiAgICAgIHBvcnQgPSBwYXJzZWQucG9ydCA/IHBhcnNlSW50KHBhcnNlZC5wb3J0LCAxMCkgOiAocGFyc2VkLnByb3RvY29sID09PSAnaHR0cHM6JyA/IDQ0MyA6IDgwKTtcclxuICAgIH0gY2F0Y2gge1xyXG4gICAgICBob3N0ID0gY29uZmlnLmhvc3QgfHwgY29uZmlnLnRhcmdldEhvc3QgfHwgJ2xvY2FsaG9zdCc7XHJcbiAgICAgIHBvcnQgPSBjb25maWcucG9ydCB8fCBjb25maWcudGFyZ2V0UG9ydCB8fCBERUZBVUxUX1BPUlRTW2NvbmZpZy50eXBlXTtcclxuICAgIH1cclxuICB9IGVsc2Uge1xyXG4gICAgaG9zdCA9IGNvbmZpZy50YXJnZXRIb3N0IHx8IGNvbmZpZy5ob3N0IHx8ICdsb2NhbGhvc3QnO1xyXG4gICAgcG9ydCA9IGNvbmZpZy50YXJnZXRQb3J0IHx8IGNvbmZpZy5wb3J0IHx8IERFRkFVTFRfUE9SVFNbY29uZmlnLnR5cGVdO1xyXG4gIH1cclxuXHJcbiAgY29uc3Qgc2NoZW1lID0gUFJPVE9DT0xfU0NIRU1FU1tjb25maWcudHlwZV07XHJcbiAgY29uc3QgY29ubmVjdGlvblN0cmluZyA9IGAke3NjaGVtZX06Ly8ke2hvc3R9OiR7cG9ydH1gO1xyXG5cclxuICBjb25zdCBlbnZWYXIgPSBFTlZfVkFSX01BUFtjb25maWcudHlwZV1cclxuICAgIHx8IGAke25hbWUudG9VcHBlckNhc2UoKS5yZXBsYWNlKC8tL2csICdfJyl9X1VSTGA7XHJcblxyXG4gIHJldHVybiB7XHJcbiAgICBuYW1lLFxyXG4gICAgdHlwZTogY29uZmlnLnR5cGUsXHJcbiAgICBob3N0LFxyXG4gICAgcG9ydCxcclxuICAgIGNvbm5lY3Rpb25TdHJpbmcsXHJcbiAgICBlbnZWYXIsXHJcbiAgICBhY2Nlc3NNb2RlOiBjb25maWcuYWNjZXNzLm1vZGUsXHJcbiAgICB2aWE6IGNvbmZpZy5hY2Nlc3MudmlhIHx8ICdkaXJlY3QnLFxyXG4gIH07XHJcbn1cclxuXHJcbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG4vLyBUcmFja2luZ1xyXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuXHJcbmZ1bmN0aW9uIHRyYWNrU2RrVXNhZ2UoaHViVXJsOiBzdHJpbmcpOiB2b2lkIHtcclxuICBjb25zdCBkYXRhID0gSlNPTi5zdHJpbmdpZnkoe1xyXG4gICAgb3M6IHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyA/IHByb2Nlc3MucGxhdGZvcm0gOiAnYnJvd3NlcicsXHJcbiAgICBhcmNoOiB0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgPyAocHJvY2Vzcy5hcmNoID09PSAnYXJtNjQnID8gJ2FybTY0JyA6ICd4NjQnKSA6ICd1bmtub3duJyxcclxuICAgIHZlcnNpb246ICdzZGsnLFxyXG4gICAgc291cmNlOiAnc2RrJyxcclxuICB9KTtcclxuXHJcbiAgZmV0Y2goYCR7aHViVXJsfS92MS9ldmVudHMvaW5zdGFsbGAsIHtcclxuICAgIG1ldGhvZDogJ1BPU1QnLFxyXG4gICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXHJcbiAgICBib2R5OiBkYXRhLFxyXG4gIH0pLmNhdGNoKCgpID0+IHt9KTtcclxufVxyXG5cclxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcbi8vIEFnZW50IElEIERldGVjdGlvblxyXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuXHJcbmNvbnN0IENPTkZJR19QQVRIID0gcGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgJy5wcml2YXRlLWNvbm5lY3QnLCAnY29uZmlnLmpzb24nKTtcclxuXHJcbi8qKlxyXG4gKiBEZXRlY3QgdGhlIGFnZW50IElEIGZyb20gbG9jYWwgY29uZmlnIG9yIGVudmlyb25tZW50LlxyXG4gKiBSZXR1cm5zIHVuZGVmaW5lZCBpZiBubyBhZ2VudCBpcyBjb25maWd1cmVkIOKAlCBjYWxsZXJzIHRoYXQgbmVlZCBhbiBhZ2VudCBJRFxyXG4gKiBzaG91bGQgc3VyZmFjZSBhIGNsZWFyIGVycm9yIHJhdGhlciB0aGFuIHVzaW5nIGEgZmFrZSBvbmUuXHJcbiAqL1xyXG5mdW5jdGlvbiBkZXRlY3RBZ2VudElkKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XHJcbiAgLy8gMS4gRW52aXJvbm1lbnQgdmFyaWFibGVzIChoaWdoZXN0IHByaW9yaXR5IOKAlCB1c2VmdWwgaW4gQ0kpXHJcbiAgY29uc3QgZW52SWQgPSBwcm9jZXNzLmVudi5QUklWQVRFQ09OTkVDVF9BR0VOVF9JRCB8fCBwcm9jZXNzLmVudi5DT05ORUNUX0FHRU5UX0lEO1xyXG4gIGlmIChlbnZJZCkgcmV0dXJuIGVudklkO1xyXG5cclxuICAvLyAyLiBMb2NhbCBjb25maWcgZmlsZSAofi8ucHJpdmF0ZS1jb25uZWN0L2NvbmZpZy5qc29uKVxyXG4gIHRyeSB7XHJcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhDT05GSUdfUEFUSCkpIHtcclxuICAgICAgY29uc3QgcmF3ID0gZnMucmVhZEZpbGVTeW5jKENPTkZJR19QQVRILCAndXRmLTgnKTtcclxuICAgICAgY29uc3QgY29uZmlnID0gSlNPTi5wYXJzZShyYXcpO1xyXG4gICAgICBpZiAoY29uZmlnLmFnZW50SWQgJiYgdHlwZW9mIGNvbmZpZy5hZ2VudElkID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgIHJldHVybiBjb25maWcuYWdlbnRJZDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH0gY2F0Y2gge1xyXG4gICAgLy8gQ29uZmlnIHVucmVhZGFibGUgb3IgbWFsZm9ybWVkIOKAlCBmYWxsIHRocm91Z2hcclxuICB9XHJcblxyXG4gIHJldHVybiB1bmRlZmluZWQ7XHJcbn1cclxuXHJcbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG4vLyBBZ2VudHMgQVBJXHJcbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG5cclxuZXhwb3J0IGNsYXNzIEFnZW50c0FQSSB7XHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjbGllbnQ6IFByaXZhdGVDb25uZWN0KSB7fVxyXG5cclxuICBhc3luYyBwcm92aXNpb24ob3B0aW9uczogUHJvdmlzaW9uT3B0aW9ucyk6IFByb21pc2U8UHJvdmlzaW9uUmVzdWx0PiB7XHJcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuY2xpZW50LmZldGNoKCcvdjEvYWdlbnRzL3Byb3Zpc2lvbicsIHtcclxuICAgICAgbWV0aG9kOiAnUE9TVCcsXHJcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KG9wdGlvbnMpLFxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gcmVzcG9uc2UuanNvbigpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgbGlzdChvcHRpb25zPzogeyBvbmxpbmVPbmx5PzogYm9vbGVhbiB9KTogUHJvbWlzZTxBZ2VudFtdPiB7XHJcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuY2xpZW50LmZldGNoKCcvdjEvYWdlbnRzL29yY2hlc3RyYXRpb24nKTtcclxuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XHJcbiAgICBsZXQgYWdlbnRzID0gZGF0YS5hZ2VudHMgfHwgW107XHJcblxyXG4gICAgaWYgKG9wdGlvbnM/Lm9ubGluZU9ubHkpIHtcclxuICAgICAgYWdlbnRzID0gYWdlbnRzLmZpbHRlcigoYTogYW55KSA9PiBhLmlzT25saW5lKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gYWdlbnRzLm1hcCgoYTogYW55KSA9PiAoe1xyXG4gICAgICBpZDogYS5pZCxcclxuICAgICAgbmFtZTogYS5uYW1lLFxyXG4gICAgICBsYWJlbDogYS5sYWJlbCxcclxuICAgICAgaXNPbmxpbmU6IGEuaXNPbmxpbmUsXHJcbiAgICAgIGxhc3RTZWVuQXQ6IGEubGFzdFNlZW5BdCxcclxuICAgICAgY2FwYWJpbGl0aWVzOiBhLmNhcGFiaWxpdGllcz8ubWFwKChjOiBhbnkpID0+IGMubmFtZSkgfHwgW10sXHJcbiAgICAgIHNlcnZpY2VzOiBhLnNlcnZpY2VzPy5tYXAoKHM6IGFueSkgPT4gcy5uYW1lKSB8fCBbXSxcclxuICAgIH0pKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGZpbmRCeUNhcGFiaWxpdHkoY2FwYWJpbGl0eTogc3RyaW5nKTogUHJvbWlzZTxBZ2VudFtdPiB7XHJcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuY2xpZW50LmZldGNoKGAvdjEvYWdlbnRzL2J5LWNhcGFiaWxpdHkvJHtlbmNvZGVVUklDb21wb25lbnQoY2FwYWJpbGl0eSl9YCk7XHJcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xyXG4gICAgcmV0dXJuIGRhdGEuYWdlbnRzIHx8IFtdO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgcmVnaXN0ZXJDYXBhYmlsaXRpZXMoY2FwYWJpbGl0aWVzOiBBcnJheTx7IG5hbWU6IHN0cmluZzsgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9Pik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3QgYWdlbnRJZCA9IHRoaXMuY2xpZW50LnJlcXVpcmVBZ2VudElkKCk7XHJcbiAgICBhd2FpdCB0aGlzLmNsaWVudC5mZXRjaChgL3YxL2FnZW50cy8ke2FnZW50SWR9L2NhcGFiaWxpdGllc2AsIHtcclxuICAgICAgbWV0aG9kOiAnUE9TVCcsXHJcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgY2FwYWJpbGl0aWVzIH0pLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBzZW5kTWVzc2FnZShcclxuICAgIHRvQWdlbnRJZDogc3RyaW5nLFxyXG4gICAgcGF5bG9hZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXHJcbiAgICBvcHRpb25zPzogeyBjaGFubmVsPzogc3RyaW5nOyB0eXBlPzogJ3JlcXVlc3QnIHwgJ3Jlc3BvbnNlJyB8ICdldmVudCcgfVxyXG4gICk6IFByb21pc2U8eyBtZXNzYWdlSWQ6IHN0cmluZyB9PiB7XHJcbiAgICBjb25zdCBhZ2VudElkID0gdGhpcy5jbGllbnQucmVxdWlyZUFnZW50SWQoKTtcclxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jbGllbnQuZmV0Y2goYC92MS9hZ2VudHMvJHthZ2VudElkfS9tZXNzYWdlcy9zZW5kYCwge1xyXG4gICAgICBtZXRob2Q6ICdQT1NUJyxcclxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyB0b0FnZW50SWQsIHBheWxvYWQsIC4uLm9wdGlvbnMgfSksXHJcbiAgICB9KTtcclxuICAgIHJldHVybiByZXNwb25zZS5qc29uKCk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBicm9hZGNhc3QoXHJcbiAgICBwYXlsb2FkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcclxuICAgIG9wdGlvbnM/OiB7IGNoYW5uZWw/OiBzdHJpbmcgfVxyXG4gICk6IFByb21pc2U8eyBzZW50OiBudW1iZXIgfT4ge1xyXG4gICAgY29uc3QgYWdlbnRJZCA9IHRoaXMuY2xpZW50LnJlcXVpcmVBZ2VudElkKCk7XHJcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuY2xpZW50LmZldGNoKGAvdjEvYWdlbnRzLyR7YWdlbnRJZH0vbWVzc2FnZXMvYnJvYWRjYXN0YCwge1xyXG4gICAgICBtZXRob2Q6ICdQT1NUJyxcclxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBwYXlsb2FkLCAuLi5vcHRpb25zIH0pLFxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gcmVzcG9uc2UuanNvbigpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgZ2V0TWVzc2FnZXMob3B0aW9ucz86IHsgY2hhbm5lbD86IHN0cmluZzsgdW5yZWFkT25seT86IGJvb2xlYW47IGxpbWl0PzogbnVtYmVyIH0pOiBQcm9taXNlPE1lc3NhZ2VbXT4ge1xyXG4gICAgY29uc3QgYWdlbnRJZCA9IHRoaXMuY2xpZW50LnJlcXVpcmVBZ2VudElkKCk7XHJcbiAgICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKCk7XHJcbiAgICBpZiAob3B0aW9ucz8uY2hhbm5lbCkgcGFyYW1zLnNldCgnY2hhbm5lbCcsIG9wdGlvbnMuY2hhbm5lbCk7XHJcbiAgICBpZiAob3B0aW9ucz8udW5yZWFkT25seSAhPT0gdW5kZWZpbmVkKSBwYXJhbXMuc2V0KCd1bnJlYWRPbmx5JywgU3RyaW5nKG9wdGlvbnMudW5yZWFkT25seSkpO1xyXG4gICAgaWYgKG9wdGlvbnM/LmxpbWl0KSBwYXJhbXMuc2V0KCdsaW1pdCcsIFN0cmluZyhvcHRpb25zLmxpbWl0KSk7XHJcblxyXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNsaWVudC5mZXRjaChgL3YxL2FnZW50cy8ke2FnZW50SWR9L21lc3NhZ2VzPyR7cGFyYW1zfWApO1xyXG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcclxuICAgIHJldHVybiBkYXRhLm1lc3NhZ2VzIHx8IFtdO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgbWFya1JlYWQobWVzc2FnZUlkczogc3RyaW5nW10pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IGFnZW50SWQgPSB0aGlzLmNsaWVudC5yZXF1aXJlQWdlbnRJZCgpO1xyXG4gICAgYXdhaXQgdGhpcy5jbGllbnQuZmV0Y2goYC92MS9hZ2VudHMvJHthZ2VudElkfS9tZXNzYWdlcy9yZWFkYCwge1xyXG4gICAgICBtZXRob2Q6ICdQT1NUJyxcclxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBtZXNzYWdlSWRzIH0pLFxyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcblxyXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuLy8gU2VydmljZXMgQVBJXHJcbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG5cclxuZXhwb3J0IGNsYXNzIFNlcnZpY2VzQVBJIHtcclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNsaWVudDogUHJpdmF0ZUNvbm5lY3QpIHt9XHJcblxyXG4gIGFzeW5jIHJlZ2lzdGVyKG9wdGlvbnM6IFNlcnZpY2VSZWdpc3Rlck9wdGlvbnMpOiBQcm9taXNlPFNlcnZpY2U+IHtcclxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jbGllbnQuZmV0Y2goJy92MS9zZXJ2aWNlcy9yZWdpc3RlcicsIHtcclxuICAgICAgbWV0aG9kOiAnUE9TVCcsXHJcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KG9wdGlvbnMpLFxyXG4gICAgfSk7XHJcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xyXG4gICAgcmV0dXJuIGRhdGEuc2VydmljZTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGxpc3QoKTogUHJvbWlzZTxTZXJ2aWNlW10+IHtcclxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jbGllbnQuZmV0Y2goJy92MS9zZXJ2aWNlcycpO1xyXG4gICAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGdldChuYW1lOiBzdHJpbmcpOiBQcm9taXNlPFNlcnZpY2UgfCBudWxsPiB7XHJcbiAgICBjb25zdCBzZXJ2aWNlcyA9IGF3YWl0IHRoaXMubGlzdCgpO1xyXG4gICAgcmV0dXJuIHNlcnZpY2VzLmZpbmQocyA9PiBzLm5hbWUudG9Mb3dlckNhc2UoKSA9PT0gbmFtZS50b0xvd2VyQ2FzZSgpKSB8fCBudWxsO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgdXBkYXRlKGlkOiBzdHJpbmcsIG9wdGlvbnM6IHsgbmFtZT86IHN0cmluZyB9KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBhd2FpdCB0aGlzLmNsaWVudC5mZXRjaChgL3YxL3NlcnZpY2VzLyR7aWR9YCwge1xyXG4gICAgICBtZXRob2Q6ICdQQVRDSCcsXHJcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KG9wdGlvbnMpLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBkZWxldGUoaWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgYXdhaXQgdGhpcy5jbGllbnQuZmV0Y2goYC92MS9zZXJ2aWNlcy8ke2lkfWAsIHsgbWV0aG9kOiAnREVMRVRFJyB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBjb25uZWN0aW9uIGRldGFpbHMgZm9yIGEgc2VydmljZS5cclxuICAgKlxyXG4gICAqIElmIGBncmFudFRva2VuYCBpcyBwcm92aWRlZCwgcmV0dXJucyBhIHByb3hpZWQgY29ubmVjdGlvbiB2aWEgdGhlIGh1YidzXHJcbiAgICogZ3JhbnQgZW5kcG9pbnQgaW5zdGVhZCBvZiBhc3N1bWluZyBhIGxvY2FsIHR1bm5lbC5cclxuICAgKi9cclxuICBhc3luYyBnZXRDb25uZWN0aW9uKHNlcnZpY2VOYW1lOiBzdHJpbmcsIG9wdGlvbnM/OiB7IGdyYW50VG9rZW4/OiBzdHJpbmcgfSk6IFByb21pc2U8Q29ubmVjdGlvbj4ge1xyXG4gICAgaWYgKG9wdGlvbnM/LmdyYW50VG9rZW4pIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZ2V0R3JhbnRDb25uZWN0aW9uKHNlcnZpY2VOYW1lLCBvcHRpb25zLmdyYW50VG9rZW4pO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHNlcnZpY2UgPSBhd2FpdCB0aGlzLmdldChzZXJ2aWNlTmFtZSk7XHJcbiAgICBpZiAoIXNlcnZpY2UpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTZXJ2aWNlIFwiJHtzZXJ2aWNlTmFtZX1cIiBub3QgZm91bmRgKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBwb3J0ID0gc2VydmljZS50dW5uZWxQb3J0IHx8IHNlcnZpY2UudGFyZ2V0UG9ydDtcclxuICAgIGNvbnN0IGhvc3QgPSAnbG9jYWxob3N0JztcclxuXHJcbiAgICBsZXQgY29ubmVjdGlvblN0cmluZzogc3RyaW5nO1xyXG4gICAgbGV0IGVudlZhcjogc3RyaW5nO1xyXG5cclxuICAgIGlmIChzZXJ2aWNlLnRhcmdldFBvcnQgPT09IDU0MzIgfHwgc2VydmljZS5wcm90b2NvbCA9PT0gJ3Bvc3RncmVzJykge1xyXG4gICAgICBjb25uZWN0aW9uU3RyaW5nID0gYHBvc3RncmVzOi8vJHtob3N0fToke3BvcnR9L3Bvc3RncmVzYDtcclxuICAgICAgZW52VmFyID0gJ0RBVEFCQVNFX1VSTCc7XHJcbiAgICB9IGVsc2UgaWYgKHNlcnZpY2UudGFyZ2V0UG9ydCA9PT0gMzMwNiB8fCBzZXJ2aWNlLnByb3RvY29sID09PSAnbXlzcWwnKSB7XHJcbiAgICAgIGNvbm5lY3Rpb25TdHJpbmcgPSBgbXlzcWw6Ly8ke2hvc3R9OiR7cG9ydH1gO1xyXG4gICAgICBlbnZWYXIgPSAnREFUQUJBU0VfVVJMJztcclxuICAgIH0gZWxzZSBpZiAoc2VydmljZS50YXJnZXRQb3J0ID09PSA2Mzc5IHx8IHNlcnZpY2UucHJvdG9jb2wgPT09ICdyZWRpcycpIHtcclxuICAgICAgY29ubmVjdGlvblN0cmluZyA9IGByZWRpczovLyR7aG9zdH06JHtwb3J0fWA7XHJcbiAgICAgIGVudlZhciA9ICdSRURJU19VUkwnO1xyXG4gICAgfSBlbHNlIGlmIChzZXJ2aWNlLnRhcmdldFBvcnQgPT09IDI3MDE3IHx8IHNlcnZpY2UucHJvdG9jb2wgPT09ICdtb25nb2RiJykge1xyXG4gICAgICBjb25uZWN0aW9uU3RyaW5nID0gYG1vbmdvZGI6Ly8ke2hvc3R9OiR7cG9ydH1gO1xyXG4gICAgICBlbnZWYXIgPSAnTU9OR09EQl9VUkknO1xyXG4gICAgfSBlbHNlIGlmIChzZXJ2aWNlLnByb3RvY29sID09PSAnaHR0cCcgfHwgc2VydmljZS5wcm90b2NvbCA9PT0gJ2h0dHBzJykge1xyXG4gICAgICBjb25uZWN0aW9uU3RyaW5nID0gYGh0dHA6Ly8ke2hvc3R9OiR7cG9ydH1gO1xyXG4gICAgICBlbnZWYXIgPSAnQVBJX1VSTCc7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25uZWN0aW9uU3RyaW5nID0gYHRjcDovLyR7aG9zdH06JHtwb3J0fWA7XHJcbiAgICAgIGVudlZhciA9IGAke3NlcnZpY2VOYW1lLnRvVXBwZXJDYXNlKCkucmVwbGFjZSgvLS9nLCAnXycpfV9VUkxgO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB7IHNlcnZpY2U6IHNlcnZpY2VOYW1lLCBob3N0LCBwb3J0LCBjb25uZWN0aW9uU3RyaW5nLCBlbnZWYXIgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0R3JhbnRDb25uZWN0aW9uKHNlcnZpY2VOYW1lOiBzdHJpbmcsIGdyYW50VG9rZW46IHN0cmluZyk6IENvbm5lY3Rpb24ge1xyXG4gICAgY29uc3QgaHViVXJsID0gdGhpcy5jbGllbnQuaHViVXJsO1xyXG4gICAgY29uc3QgZ3JhbnRFbmRwb2ludCA9IGAke2h1YlVybH0vZ3JhbnQvJHtlbmNvZGVVUklDb21wb25lbnQoc2VydmljZU5hbWUpfWA7XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgc2VydmljZTogc2VydmljZU5hbWUsXHJcbiAgICAgIGhvc3Q6IG5ldyBVUkwoaHViVXJsKS5ob3N0bmFtZSxcclxuICAgICAgcG9ydDogbmV3IFVSTChodWJVcmwpLnBvcnQgPyBwYXJzZUludChuZXcgVVJMKGh1YlVybCkucG9ydCwgMTApIDogNDQzLFxyXG4gICAgICBjb25uZWN0aW9uU3RyaW5nOiBncmFudEVuZHBvaW50LFxyXG4gICAgICBlbnZWYXI6ICdHUkFOVF9VUkwnLFxyXG4gICAgICBncmFudFRva2VuLFxyXG4gICAgICBncmFudEVuZHBvaW50LFxyXG4gICAgfTtcclxuICB9XHJcbn1cclxuXHJcbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG4vLyBHcmFudHMgQVBJXHJcbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG5cclxuZXhwb3J0IGNsYXNzIEdyYW50c0FQSSB7XHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjbGllbnQ6IFByaXZhdGVDb25uZWN0KSB7fVxyXG5cclxuICAvKipcclxuICAgKiBDcmVhdGUgYSB0aW1lLWxpbWl0ZWQgYWNjZXNzIGdyYW50IGZvciBhbiBBSSBhZ2VudCBvciBleHRlcm5hbCBjb25zdW1lci5cclxuICAgKi9cclxuICBhc3luYyBjcmVhdGUob3B0aW9uczogR3JhbnRDcmVhdGVPcHRpb25zKTogUHJvbWlzZTxHcmFudD4ge1xyXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNsaWVudC5mZXRjaCgnL3YxL2dyYW50cycsIHtcclxuICAgICAgbWV0aG9kOiAnUE9TVCcsXHJcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KG9wdGlvbnMpLFxyXG4gICAgfSk7XHJcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xyXG4gICAgcmV0dXJuIGRhdGEuZ3JhbnQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBMaXN0IGFjdGl2ZSBncmFudHMgaW4gdGhlIHdvcmtzcGFjZS5cclxuICAgKi9cclxuICBhc3luYyBsaXN0KG9wdGlvbnM/OiB7IGluY2x1ZGVFeHBpcmVkPzogYm9vbGVhbiB9KTogUHJvbWlzZTxHcmFudFtdPiB7XHJcbiAgICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKCk7XHJcbiAgICBpZiAob3B0aW9ucz8uaW5jbHVkZUV4cGlyZWQpIHBhcmFtcy5zZXQoJ2luY2x1ZGVFeHBpcmVkJywgJ3RydWUnKTtcclxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jbGllbnQuZmV0Y2goYC92MS9ncmFudHM/JHtwYXJhbXN9YCk7XHJcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xyXG4gICAgcmV0dXJuIGRhdGEuZ3JhbnRzIHx8IFtdO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV2b2tlIGFuIGFjdGl2ZSBncmFudCBpbW1lZGlhdGVseS5cclxuICAgKi9cclxuICBhc3luYyByZXZva2UoZ3JhbnRJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBhd2FpdCB0aGlzLmNsaWVudC5mZXRjaChgL3YxL2dyYW50cy8ke2dyYW50SWR9YCwgeyBtZXRob2Q6ICdERUxFVEUnIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVmFsaWRhdGUgYSBncmFudCB0b2tlbiAocHVibGljIGVuZHBvaW50IOKAlCBubyBBUEkga2V5IHJlcXVpcmVkKS5cclxuICAgKiBSZXR1cm5zIHRoZSBncmFudCBpZiB2YWxpZCwgbnVsbCBvdGhlcndpc2UuXHJcbiAgICovXHJcbiAgYXN5bmMgdmFsaWRhdGUodG9rZW46IHN0cmluZyk6IFByb21pc2U8R3JhbnQgfCBudWxsPiB7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCB1cmwgPSBgJHt0aGlzLmNsaWVudC5odWJVcmx9L3YxL2dyYW50cy92YWxpZGF0ZWA7XHJcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XHJcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXHJcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXHJcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyB0b2tlbiB9KSxcclxuICAgICAgfSk7XHJcbiAgICAgIGlmICghcmVzcG9uc2Uub2spIHJldHVybiBudWxsO1xyXG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xyXG4gICAgICByZXR1cm4gZGF0YS52YWxpZCA/IGRhdGEuZ3JhbnQgOiBudWxsO1xyXG4gICAgfSBjYXRjaCB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcbi8vIFNoYXJlcyBBUElcclxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcblxyXG5leHBvcnQgY2xhc3MgU2hhcmVzQVBJIHtcclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNsaWVudDogUHJpdmF0ZUNvbm5lY3QpIHt9XHJcblxyXG4gIGFzeW5jIGNyZWF0ZShzZXJ2aWNlSWQ6IHN0cmluZywgb3B0aW9uczogU2hhcmVDcmVhdGVPcHRpb25zKTogUHJvbWlzZTx7IGlkOiBzdHJpbmc7IHRva2VuOiBzdHJpbmc7IHNoYXJlVXJsOiBzdHJpbmc7IGV4cGlyZXNBdDogc3RyaW5nIHwgbnVsbCB9PiB7XHJcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuY2xpZW50LmZldGNoKGAvdjEvc2VydmljZXMvJHtzZXJ2aWNlSWR9L3NoYXJlc2AsIHtcclxuICAgICAgbWV0aG9kOiAnUE9TVCcsXHJcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KG9wdGlvbnMpLFxyXG4gICAgfSk7XHJcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xyXG4gICAgcmV0dXJuIGRhdGEuc2hhcmU7XHJcbiAgfVxyXG5cclxuICBhc3luYyBsaXN0KHNlcnZpY2VJZDogc3RyaW5nKTogUHJvbWlzZTxTaGFyZVtdPiB7XHJcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuY2xpZW50LmZldGNoKGAvdjEvc2VydmljZXMvJHtzZXJ2aWNlSWR9L3NoYXJlc2ApO1xyXG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcclxuICAgIHJldHVybiBkYXRhLnNoYXJlcyB8fCBbXTtcclxuICB9XHJcblxyXG4gIGFzeW5jIHJldm9rZShzaGFyZUlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGF3YWl0IHRoaXMuY2xpZW50LmZldGNoKGAvdjEvc2hhcmVzLyR7c2hhcmVJZH1gLCB7IG1ldGhvZDogJ0RFTEVURScgfSk7XHJcbiAgfVxyXG59XHJcblxyXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuLy8gR3JvdXBzIEFQSVxyXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuXHJcbmV4cG9ydCBjbGFzcyBHcm91cHNBUEkge1xyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY2xpZW50OiBQcml2YXRlQ29ubmVjdCkge31cclxuXHJcbiAgYXN5bmMgY3JlYXRlKG9wdGlvbnM6IEdyb3VwQ3JlYXRlT3B0aW9ucyk6IFByb21pc2U8U2VydmljZUdyb3VwPiB7XHJcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuY2xpZW50LmZldGNoKCcvdjEvZ3JvdXBzJywge1xyXG4gICAgICBtZXRob2Q6ICdQT1NUJyxcclxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkob3B0aW9ucyksXHJcbiAgICB9KTtcclxuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XHJcbiAgICByZXR1cm4gZGF0YS5ncm91cDtcclxuICB9XHJcblxyXG4gIGFzeW5jIGxpc3QoKTogUHJvbWlzZTxTZXJ2aWNlR3JvdXBbXT4ge1xyXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNsaWVudC5mZXRjaCgnL3YxL2dyb3VwcycpO1xyXG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcclxuICAgIHJldHVybiBkYXRhLmdyb3VwcyB8fCBbXTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGdldChpZDogc3RyaW5nKTogUHJvbWlzZTxTZXJ2aWNlR3JvdXA+IHtcclxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jbGllbnQuZmV0Y2goYC92MS9ncm91cHMvJHtpZH1gKTtcclxuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XHJcbiAgICByZXR1cm4gZGF0YS5ncm91cDtcclxuICB9XHJcblxyXG4gIGFzeW5jIGFkZFNlcnZpY2UoZ3JvdXBJZDogc3RyaW5nLCBvcHRpb25zOiBPbWl0PFNlcnZpY2VSZWdpc3Rlck9wdGlvbnMsICdncm91cElkJz4pOiBQcm9taXNlPFNlcnZpY2U+IHtcclxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jbGllbnQuZmV0Y2goYC92MS9ncm91cHMvJHtncm91cElkfS9zZXJ2aWNlc2AsIHtcclxuICAgICAgbWV0aG9kOiAnUE9TVCcsXHJcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KG9wdGlvbnMpLFxyXG4gICAgfSk7XHJcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xyXG4gICAgcmV0dXJuIGRhdGEuc2VydmljZTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGNyZWF0ZVNoYXJlcyhncm91cElkOiBzdHJpbmcsIG9wdGlvbnM6IHsgbmFtZTogc3RyaW5nOyBkZXNjcmlwdGlvbj86IHN0cmluZzsgZXhwaXJlc0luPzogc3RyaW5nIH0pOiBQcm9taXNlPEFycmF5PHsgaWQ6IHN0cmluZzsgdG9rZW46IHN0cmluZzsgc2VydmljZU5hbWU6IHN0cmluZzsgc2hhcmVVcmw6IHN0cmluZyB9Pj4ge1xyXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNsaWVudC5mZXRjaChgL3YxL2dyb3Vwcy8ke2dyb3VwSWR9L3NoYXJlc2AsIHtcclxuICAgICAgbWV0aG9kOiAnUE9TVCcsXHJcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KG9wdGlvbnMpLFxyXG4gICAgfSk7XHJcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xyXG4gICAgcmV0dXJuIGRhdGEuc2hhcmVzIHx8IFtdO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgZGVsZXRlKGlkOiBzdHJpbmcpOiBQcm9taXNlPHsgZGVsZXRlZFNlcnZpY2VzOiBudW1iZXIgfT4ge1xyXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNsaWVudC5mZXRjaChgL3YxL2dyb3Vwcy8ke2lkfWAsIHsgbWV0aG9kOiAnREVMRVRFJyB9KTtcclxuICAgIHJldHVybiByZXNwb25zZS5qc29uKCk7XHJcbiAgfVxyXG59XHJcblxyXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuLy8gTWFpbiBDbGllbnRcclxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcblxyXG5leHBvcnQgY2xhc3MgUHJpdmF0ZUNvbm5lY3Qge1xyXG4gIHByaXZhdGUgY29uZmlnOiB7IGFwaUtleT86IHN0cmluZzsgaHViVXJsOiBzdHJpbmc7IGFnZW50SWQ/OiBzdHJpbmcgfTtcclxuICBwcml2YXRlIG1hbmlmZXN0OiBNYXA8c3RyaW5nLCBNYW5pZmVzdFJlc291cmNlPiA9IG5ldyBNYXAoKTtcclxuICBwcml2YXRlIG1hbmlmZXN0UGF0aD86IHN0cmluZztcclxuXHJcbiAgLyoqIEFnZW50cyBBUEkgZm9yIGRpc2NvdmVyeSwgb3JjaGVzdHJhdGlvbiwgYW5kIHByb3Zpc2lvbmluZyAqL1xyXG4gIHB1YmxpYyBhZ2VudHM6IEFnZW50c0FQSTtcclxuXHJcbiAgLyoqIFNlcnZpY2VzIEFQSSBmb3IgcmVnaXN0ZXJpbmcsIGNvbm5lY3RpbmcgdG8sIGFuZCBtYW5hZ2luZyBzZXJ2aWNlcyAqL1xyXG4gIHB1YmxpYyBzZXJ2aWNlczogU2VydmljZXNBUEk7XHJcblxyXG4gIC8qKiBHcmFudHMgQVBJIGZvciBtYW5hZ2luZyBzY29wZWQgYWNjZXNzIHRva2VucyAodGltZS1saW1pdGVkIG9yIHBlcnNpc3RlbnQpICovXHJcbiAgcHVibGljIGdyYW50czogR3JhbnRzQVBJO1xyXG5cclxuICAvKiogU2hhcmVzIEFQSSBmb3IgY3JlYXRpbmcgYW5kIG1hbmFnaW5nIHNlcnZpY2Ugc2hhcmUgbGlua3MgKi9cclxuICBwdWJsaWMgc2hhcmVzOiBTaGFyZXNBUEk7XHJcblxyXG4gIC8qKiBHcm91cHMgQVBJIGZvciBtYW5hZ2luZyBzZXJ2aWNlIGdyb3VwcyAocGVyLWJyYW5jaCwgcGVyLXByb2plY3QgZW52aXJvbm1lbnRzKSAqL1xyXG4gIHB1YmxpYyBncm91cHM6IEdyb3Vwc0FQSTtcclxuXHJcbiAgY29uc3RydWN0b3IoY29uZmlnOiBQcml2YXRlQ29ubmVjdENvbmZpZyA9IHt9KSB7XHJcbiAgICB0aGlzLmNvbmZpZyA9IHtcclxuICAgICAgYXBpS2V5OiBjb25maWcuYXBpS2V5LFxyXG4gICAgICBodWJVcmw6IGNvbmZpZy5odWJVcmwgfHwgJ2h0dHBzOi8vYXBpLnByaXZhdGVjb25uZWN0LmNvJyxcclxuICAgICAgYWdlbnRJZDogY29uZmlnLmFnZW50SWQgfHwgZGV0ZWN0QWdlbnRJZCgpLFxyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLmFnZW50cyA9IG5ldyBBZ2VudHNBUEkodGhpcyk7XHJcbiAgICB0aGlzLnNlcnZpY2VzID0gbmV3IFNlcnZpY2VzQVBJKHRoaXMpO1xyXG4gICAgdGhpcy5ncmFudHMgPSBuZXcgR3JhbnRzQVBJKHRoaXMpO1xyXG4gICAgdGhpcy5zaGFyZXMgPSBuZXcgU2hhcmVzQVBJKHRoaXMpO1xyXG4gICAgdGhpcy5ncm91cHMgPSBuZXcgR3JvdXBzQVBJKHRoaXMpO1xyXG5cclxuICAgIGlmICghY29uZmlnLmRpc2FibGVUcmFja2luZykge1xyXG4gICAgICB0cmFja1Nka1VzYWdlKHRoaXMuY29uZmlnLmh1YlVybCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuICAvLyBNYW5pZmVzdCBBUEkg4oCUIHRoZSBwcmltYXJ5IHdheSB0byB1c2UgdGhlIFNES1xyXG4gIC8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG5cclxuICAvKipcclxuICAgKiBMb2FkIGEgcGNvbm5lY3QueW1sIG1hbmlmZXN0IGFuZCByZXR1cm4gYSBjb25maWd1cmVkIGNsaWVudC5cclxuICAgKlxyXG4gICAqIEF1dG8tZGlzY292ZXJzIHBjb25uZWN0LnltbCBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkgKG9yIHBhcmVudHMpIGlmIG5vXHJcbiAgICogcGF0aCBpcyBnaXZlbi4gUGFzcyBhIGNvbmZpZyB0byBhbHNvIGVuYWJsZSBodWIgQVBJIGFjY2Vzcy5cclxuICAgKlxyXG4gICAqIEBleGFtcGxlXHJcbiAgICogYGBgdHlwZXNjcmlwdFxyXG4gICAqIGNvbnN0IHBjID0gUHJpdmF0ZUNvbm5lY3QuZnJvbU1hbmlmZXN0KCk7XHJcbiAgICogY29uc3QgZGIgPSBwYy5yZXNvdXJjZSgnc3RhZ2luZy1kYicpO1xyXG4gICAqIGNvbnNvbGUubG9nKGRiLmNvbm5lY3Rpb25TdHJpbmcpOyAvLyBwb3N0Z3JlczovL2ludGVybmFsLWRiOjU0MzJcclxuICAgKiBgYGBcclxuICAgKi9cclxuICBzdGF0aWMgZnJvbU1hbmlmZXN0KFxyXG4gICAgbWFuaWZlc3RQYXRoPzogc3RyaW5nLFxyXG4gICAgY29uZmlnPzogUHJpdmF0ZUNvbm5lY3RDb25maWcsXHJcbiAgKTogUHJpdmF0ZUNvbm5lY3Qge1xyXG4gICAgY29uc3QgcmVzb2x2ZWRQYXRoID0gbWFuaWZlc3RQYXRoXHJcbiAgICAgID8gcGF0aC5yZXNvbHZlKG1hbmlmZXN0UGF0aClcclxuICAgICAgOiBmaW5kTWFuaWZlc3QoKTtcclxuXHJcbiAgICBpZiAoIXJlc29sdmVkUGF0aCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXHJcbiAgICAgICAgJ05vIHBjb25uZWN0LnltbCBmb3VuZC4gQ3JlYXRlIG9uZSBpbiB5b3VyIHByb2plY3Qgcm9vdDpcXG5cXG4nICtcclxuICAgICAgICAnICByZXNvdXJjZXM6XFxuJyArXHJcbiAgICAgICAgJyAgICBzdGFnaW5nLWRiOlxcbicgK1xyXG4gICAgICAgICcgICAgICB0eXBlOiBwb3N0Z3Jlc1xcbicgK1xyXG4gICAgICAgICcgICAgICBob3N0OiBpbnRlcm5hbC1kYlxcbicgK1xyXG4gICAgICAgICcgICAgICBwb3J0OiA1NDMyXFxuJyArXHJcbiAgICAgICAgJyAgICAgIGFjY2VzczpcXG4nICtcclxuICAgICAgICAnICAgICAgICBtb2RlOiB0Y3BcXG4nXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgUHJpdmF0ZUNvbm5lY3QoY29uZmlnIHx8IHsgZGlzYWJsZVRyYWNraW5nOiB0cnVlIH0pO1xyXG4gICAgaW5zdGFuY2UubWFuaWZlc3RQYXRoID0gcmVzb2x2ZWRQYXRoO1xyXG5cclxuICAgIGNvbnN0IHJhd1Jlc291cmNlcyA9IHBhcnNlTWFuaWZlc3RGaWxlKHJlc29sdmVkUGF0aCk7XHJcbiAgICBmb3IgKGNvbnN0IFtuYW1lLCByYXdDb25maWddIG9mIE9iamVjdC5lbnRyaWVzKHJhd1Jlc291cmNlcykpIHtcclxuICAgICAgaW5zdGFuY2UubWFuaWZlc3Quc2V0KG5hbWUsIHJlc29sdmVNYW5pZmVzdFJlc291cmNlKG5hbWUsIHJhd0NvbmZpZykpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBpbnN0YW5jZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBhIHJlc291cmNlIGRlY2xhcmVkIGluIHBjb25uZWN0LnltbCBieSBuYW1lLlxyXG4gICAqXHJcbiAgICogUmV0dXJucyBpdHMgdHlwZSwgaG9zdCwgcG9ydCwgY29ubmVjdGlvbiBzdHJpbmcsIGFuZCBzdWdnZXN0ZWQgZW52IHZhci5cclxuICAgKiBXaGVuIGBjb25uZWN0IGRldmAgaXMgcnVubmluZywgdGhlIGNvbm5lY3Rpb24gc3RyaW5nIHBvaW50cyB0byBhIGxpdmVcclxuICAgKiBsb2NhbCB0dW5uZWwuXHJcbiAgICovXHJcbiAgcmVzb3VyY2UobmFtZTogc3RyaW5nKTogTWFuaWZlc3RSZXNvdXJjZSB7XHJcbiAgICBjb25zdCByID0gdGhpcy5tYW5pZmVzdC5nZXQobmFtZSk7XHJcbiAgICBpZiAoIXIpIHtcclxuICAgICAgY29uc3QgYXZhaWxhYmxlID0gQXJyYXkuZnJvbSh0aGlzLm1hbmlmZXN0LmtleXMoKSk7XHJcbiAgICAgIGNvbnN0IG1zZyA9IGF2YWlsYWJsZS5sZW5ndGhcclxuICAgICAgICA/IGBBdmFpbGFibGU6ICR7YXZhaWxhYmxlLmpvaW4oJywgJyl9YFxyXG4gICAgICAgIDogJ05vIHJlc291cmNlcyBsb2FkZWQuIERpZCB5b3UgY2FsbCBQcml2YXRlQ29ubmVjdC5mcm9tTWFuaWZlc3QoKT8nO1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFJlc291cmNlIFwiJHtuYW1lfVwiIG5vdCBmb3VuZC4gJHttc2d9YCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcjtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIExpc3QgYWxsIHJlc291cmNlcyBkZWNsYXJlZCBpbiB0aGUgbG9hZGVkIG1hbmlmZXN0LlxyXG4gICAqL1xyXG4gIHJlc291cmNlcygpOiBNYW5pZmVzdFJlc291cmNlW10ge1xyXG4gICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5tYW5pZmVzdC52YWx1ZXMoKSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZW5lcmF0ZSBhIGAuZW52YC1jb21wYXRpYmxlIGJsb2NrIGZvciBhbGwgbWFuaWZlc3QgcmVzb3VyY2VzLlxyXG4gICAqXHJcbiAgICogQGV4YW1wbGVcclxuICAgKiBgYGB0eXBlc2NyaXB0XHJcbiAgICogY29uc3QgcGMgPSBQcml2YXRlQ29ubmVjdC5mcm9tTWFuaWZlc3QoKTtcclxuICAgKiBjb25zb2xlLmxvZyhwYy5lbnZCbG9jaygpKTtcclxuICAgKiAvLyBEQVRBQkFTRV9VUkw9cG9zdGdyZXM6Ly9pbnRlcm5hbC1kYjo1NDMyXHJcbiAgICogLy8gUkVESVNfVVJMPXJlZGlzOi8vcmVkaXMuaW50ZXJuYWw6NjM3OVxyXG4gICAqIGBgYFxyXG4gICAqL1xyXG4gIGVudkJsb2NrKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5yZXNvdXJjZXMoKVxyXG4gICAgICAubWFwKHIgPT4gYCR7ci5lbnZWYXJ9PSR7ci5jb25uZWN0aW9uU3RyaW5nfWApXHJcbiAgICAgIC5qb2luKCdcXG4nKTtcclxuICB9XHJcblxyXG4gIC8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG4gIC8vIEV4aXN0aW5nIEFQSXNcclxuICAvLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuXHJcbiAgLyoqIFRoZSByZXNvbHZlZCBhZ2VudCBJRCwgb3IgdW5kZWZpbmVkIGlmIG5vdCBjb25maWd1cmVkLiAqL1xyXG4gIGdldCBhZ2VudElkKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XHJcbiAgICByZXR1cm4gdGhpcy5jb25maWcuYWdlbnRJZDtcclxuICB9XHJcblxyXG4gIC8qKiBUaGUgaHViIFVSTCB0aGlzIGNsaWVudCBpcyBjb25uZWN0ZWQgdG8uICovXHJcbiAgZ2V0IGh1YlVybCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmh1YlVybDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNob3J0aGFuZDogZ2V0IGNvbm5lY3Rpb24gZGV0YWlscyBmb3IgYSBzZXJ2aWNlLlxyXG4gICAqIFBhc3MgYGdyYW50VG9rZW5gIHRvIGNvbm5lY3QgdmlhIHRoZSBncmFudCBwcm94eSBpbnN0ZWFkIG9mIGEgbG9jYWwgdHVubmVsLlxyXG4gICAqL1xyXG4gIGFzeW5jIGNvbm5lY3Qoc2VydmljZU5hbWU6IHN0cmluZywgb3B0aW9ucz86IHsgZ3JhbnRUb2tlbj86IHN0cmluZyB9KTogUHJvbWlzZTxDb25uZWN0aW9uPiB7XHJcbiAgICByZXR1cm4gdGhpcy5zZXJ2aWNlcy5nZXRDb25uZWN0aW9uKHNlcnZpY2VOYW1lLCBvcHRpb25zKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIGFnZW50IElEIG9yIHRocm93cyBpZiBub3QgY29uZmlndXJlZC5cclxuICAgKiBVc2VkIGJ5IEFQSXMgdGhhdCByZXF1aXJlIGFuIGF1dGhlbnRpY2F0ZWQgYWdlbnQgaWRlbnRpdHkuXHJcbiAgICovXHJcbiAgcmVxdWlyZUFnZW50SWQoKTogc3RyaW5nIHtcclxuICAgIGlmICghdGhpcy5jb25maWcuYWdlbnRJZCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXHJcbiAgICAgICAgJ0FnZW50IElEIG5vdCBmb3VuZC4gRWl0aGVyOlxcbicgK1xyXG4gICAgICAgICcgIDEuIFJ1biBcImNvbm5lY3QgdXBcIiB0byByZWdpc3RlciB0aGlzIG1hY2hpbmUsIG9yXFxuJyArXHJcbiAgICAgICAgJyAgMi4gU2V0IFBSSVZBVEVDT05ORUNUX0FHRU5UX0lEIGVudmlyb25tZW50IHZhcmlhYmxlLCBvclxcbicgK1xyXG4gICAgICAgICcgIDMuIFBhc3MgYWdlbnRJZCBpbiB0aGUgUHJpdmF0ZUNvbm5lY3QgY29uc3RydWN0b3IuJ1xyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmFnZW50SWQ7XHJcbiAgfVxyXG5cclxuICAvKiogUmVxdWlyZXMgYW4gQVBJIGtleSBvciB0aHJvd3MuICovXHJcbiAgcHJpdmF0ZSByZXF1aXJlQXBpS2V5KCk6IHN0cmluZyB7XHJcbiAgICBpZiAoIXRoaXMuY29uZmlnLmFwaUtleSkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXHJcbiAgICAgICAgJ0FQSSBrZXkgcmVxdWlyZWQgZm9yIGh1YiBBUEkgY2FsbHMuIEVpdGhlcjpcXG4nICtcclxuICAgICAgICAnICAxLiBTZXQgUFJJVkFURUNPTk5FQ1RfQVBJX0tFWSBlbnZpcm9ubWVudCB2YXJpYWJsZSwgb3JcXG4nICtcclxuICAgICAgICAnICAyLiBQYXNzIGFwaUtleSBpbiB0aGUgY29uZmlnLidcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLmNvbmZpZy5hcGlLZXk7XHJcbiAgfVxyXG5cclxuICAvKiogSW50ZXJuYWwgZmV0Y2ggd2l0aCBBUEkga2V5IGF1dGguICovXHJcbiAgYXN5bmMgZmV0Y2godXJsUGF0aDogc3RyaW5nLCBvcHRpb25zPzogUmVxdWVzdEluaXQpOiBQcm9taXNlPFJlc3BvbnNlPiB7XHJcbiAgICBjb25zdCBhcGlLZXkgPSB0aGlzLnJlcXVpcmVBcGlLZXkoKTtcclxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMuY29uZmlnLmh1YlVybH0ke3VybFBhdGh9YDtcclxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XHJcbiAgICAgIC4uLm9wdGlvbnMsXHJcbiAgICAgIGhlYWRlcnM6IHtcclxuICAgICAgICAneC1hcGkta2V5JzogYXBpS2V5LFxyXG4gICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXHJcbiAgICAgICAgLi4ub3B0aW9ucz8uaGVhZGVycyxcclxuICAgICAgfSxcclxuICAgIH0pO1xyXG5cclxuICAgIGlmICghcmVzcG9uc2Uub2spIHtcclxuICAgICAgY29uc3QgZXJyb3IgPSBhd2FpdCByZXNwb25zZS5qc29uKCkuY2F0Y2goKCkgPT4gKHsgbWVzc2FnZTogJ1Vua25vd24gZXJyb3InIH0pKTtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yLm1lc3NhZ2UgfHwgYFJlcXVlc3QgZmFpbGVkOiAke3Jlc3BvbnNlLnN0YXR1c31gKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcmVzcG9uc2U7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBQcml2YXRlQ29ubmVjdDtcclxuXHJcbi8qKiBDb252ZW5pZW5jZSBmdW5jdGlvbiBmb3IgcXVpY2sgb25lLW9mZiBjb25uZWN0aW9ucyB2aWEgdGhlIGh1YiBBUEkuICovXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjb25uZWN0KFxyXG4gIHNlcnZpY2VOYW1lOiBzdHJpbmcsXHJcbiAgY29uZmlnPzogUHJpdmF0ZUNvbm5lY3RDb25maWcgJiB7IGdyYW50VG9rZW4/OiBzdHJpbmcgfSxcclxuKTogUHJvbWlzZTxDb25uZWN0aW9uPiB7XHJcbiAgY29uc3QgYXBpS2V5ID0gY29uZmlnPy5hcGlLZXkgfHwgcHJvY2Vzcy5lbnYuUFJJVkFURUNPTk5FQ1RfQVBJX0tFWTtcclxuICBpZiAoIWFwaUtleSkge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKCdBUEkga2V5IHJlcXVpcmVkLiBTZXQgUFJJVkFURUNPTk5FQ1RfQVBJX0tFWSBvciBwYXNzIGNvbmZpZy5hcGlLZXknKTtcclxuICB9XHJcblxyXG4gIGNvbnN0IGNsaWVudCA9IG5ldyBQcml2YXRlQ29ubmVjdCh7IC4uLmNvbmZpZywgYXBpS2V5IH0pO1xyXG4gIHJldHVybiBjbGllbnQuY29ubmVjdChzZXJ2aWNlTmFtZSwgeyBncmFudFRva2VuOiBjb25maWc/LmdyYW50VG9rZW4gfSk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBMb2FkIHBjb25uZWN0LnltbCBhbmQgZ2V0IGEgcmVzb3VyY2UgYnkgbmFtZS5cclxuICogU2hvcnRoYW5kIGZvciBgUHJpdmF0ZUNvbm5lY3QuZnJvbU1hbmlmZXN0KCkucmVzb3VyY2UobmFtZSlgLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGZyb21NYW5pZmVzdChtYW5pZmVzdFBhdGg/OiBzdHJpbmcpOiBQcml2YXRlQ29ubmVjdCB7XHJcbiAgcmV0dXJuIFByaXZhdGVDb25uZWN0LmZyb21NYW5pZmVzdChtYW5pZmVzdFBhdGgpO1xyXG59XHJcbiJdfQ==
|