@dbx-tools/search 0.6.108 → 0.6.112
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/README.md +96 -110
- package/index.ts +6 -2
- package/lib/index.d.ts +6 -2
- package/lib/index.js +4 -1
- package/lib/src/client.d.ts +23 -43
- package/lib/src/client.js +51 -114
- package/lib/src/lakebase-plugin.d.ts +73 -0
- package/lib/src/lakebase-plugin.js +191 -0
- package/lib/src/lakebase.d.ts +6 -4
- package/lib/src/lakebase.js +45 -13
- package/lib/src/native.d.ts +18 -0
- package/lib/src/native.js +79 -0
- package/lib/src/plugin.d.ts +31 -59
- package/lib/src/plugin.js +63 -130
- package/lib/src/query.d.ts +1 -57
- package/lib/src/query.js +2 -93
- package/lib/src/runtime.d.ts +4 -11
- package/lib/src/runtime.js +3 -7
- package/lib/src/schema.d.ts +1 -1
- package/lib/src/tool.d.ts +1 -1
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +9 -9
- package/src/client.ts +69 -137
- package/src/lakebase-plugin.ts +258 -0
- package/src/lakebase.ts +56 -15
- package/src/native.ts +117 -0
- package/src/plugin.ts +63 -148
- package/src/query.ts +1 -109
- package/src/runtime.ts +6 -16
package/lib/src/client.js
CHANGED
|
@@ -1,25 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* query_type, num_results, filters_json })` is powerful but verbose, and the
|
|
6
|
-
* response is columnar. This client hides all of that behind two objects:
|
|
7
|
-
*
|
|
8
|
-
* ```ts
|
|
9
|
-
* const client = createSearchClient();
|
|
10
|
-
* const index = client.index("main.support.docs");
|
|
11
|
-
* const { hits } = await index.search("reset my password", { limit: 5 });
|
|
12
|
-
* await index.addDocuments([{ id: "42", title: "Reset", body: "..." }]);
|
|
13
|
-
* ```
|
|
2
|
+
* Search extension client. Reads delegate to the registered AppKit-compatible
|
|
3
|
+
* `aiSearch` provider; this module owns federated fan-out and the Vector Search
|
|
4
|
+
* lifecycle APIs AppKit does not expose.
|
|
14
5
|
*
|
|
15
6
|
* `client.search(query, opts)` searches the default index; `client.index(name)`
|
|
16
7
|
* returns a handle bound to one index; `client.universalSearch(query)` fans a
|
|
17
8
|
* query across several indexes and merges the results (Meilisearch's federated
|
|
18
9
|
* / multi-search, the "universal search" the caller asked for). Everything is
|
|
19
|
-
* async and cancellable
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
10
|
+
* async and cancellable and returns the browser-safe shapes from
|
|
11
|
+
* `@dbx-tools/shared-search`. Lifecycle methods cross AppKit's explicit legacy
|
|
12
|
+
* client handoff because the public facade does not yet expose index creation,
|
|
13
|
+
* sync, or deletion.
|
|
23
14
|
*
|
|
24
15
|
* Autocomplete is just a search with a small `limit` and the raw query text -
|
|
25
16
|
* hybrid mode already prefix-matches, so no separate endpoint is needed; the
|
|
@@ -32,8 +23,7 @@ import { appkit, databricks } from "@dbx-tools/appkit";
|
|
|
32
23
|
import { invoke, resolve as modelResolve, serving } from "@dbx-tools/model";
|
|
33
24
|
import { async as sharedAsync, json, log, string } from "@dbx-tools/shared-core";
|
|
34
25
|
import { ModelClass } from "@dbx-tools/shared-model";
|
|
35
|
-
import { DEFAULT_MODE, DEFAULT_PAGE_SIZE, DEFAULT_TIMEOUT_MS,
|
|
36
|
-
import { compileFilter, toHits, toQueryType, toRequestColumns, } from "./query.js";
|
|
26
|
+
import { DEFAULT_MODE, DEFAULT_PAGE_SIZE, DEFAULT_TIMEOUT_MS, resolveIndexName, } from "./config.js";
|
|
37
27
|
const logger = log.logger("search/client");
|
|
38
28
|
/**
|
|
39
29
|
* A handle bound to one index. Modeled on Meilisearch's `client.index(uid)`:
|
|
@@ -92,7 +82,7 @@ export class SearchIndex {
|
|
|
92
82
|
export class SearchClient {
|
|
93
83
|
config;
|
|
94
84
|
workspaceClientFactory;
|
|
95
|
-
|
|
85
|
+
readBackend;
|
|
96
86
|
constructor(config = {
|
|
97
87
|
indexes: [],
|
|
98
88
|
pageSize: DEFAULT_PAGE_SIZE,
|
|
@@ -100,21 +90,10 @@ export class SearchClient {
|
|
|
100
90
|
basePath: "/api/search",
|
|
101
91
|
timeoutMs: DEFAULT_TIMEOUT_MS,
|
|
102
92
|
allowWrite: false,
|
|
103
|
-
}, workspaceClientFactory = defaultWorkspaceClient,
|
|
104
|
-
/**
|
|
105
|
-
* Optional Lakebase full-text FALLBACK backend. Present only when no Vector
|
|
106
|
-
* Search endpoint is configured but a Lakebase pool is available; when set,
|
|
107
|
-
* search / provision / write operations delegate to it and return the exact
|
|
108
|
-
* same shapes, so nothing downstream can tell which backend answered.
|
|
109
|
-
*/
|
|
110
|
-
lakebase) {
|
|
93
|
+
}, workspaceClientFactory = defaultWorkspaceClient, readBackend) {
|
|
111
94
|
this.config = config;
|
|
112
95
|
this.workspaceClientFactory = workspaceClientFactory;
|
|
113
|
-
this.
|
|
114
|
-
}
|
|
115
|
-
/** True when this client is answering out of the Lakebase fallback backend. */
|
|
116
|
-
get usesLakebase() {
|
|
117
|
-
return this.lakebase !== undefined;
|
|
96
|
+
this.readBackend = readBackend;
|
|
118
97
|
}
|
|
119
98
|
/** A handle bound to one index (by full UC name or configured alias). */
|
|
120
99
|
index(reference) {
|
|
@@ -133,58 +112,13 @@ export class SearchClient {
|
|
|
133
112
|
context: { operation: "search" },
|
|
134
113
|
});
|
|
135
114
|
}
|
|
136
|
-
if (this.
|
|
137
|
-
|
|
138
|
-
limit: options.limit ?? this.config.pageSize,
|
|
139
|
-
...(options.scoreThreshold !== undefined ? { scoreThreshold: options.scoreThreshold } : {}),
|
|
140
|
-
...(options.signal ? { signal: options.signal } : {}),
|
|
141
|
-
});
|
|
115
|
+
if (!this.readBackend) {
|
|
116
|
+
throw new ExecutionError("search: no AI Search provider registered; add aiSearch() or lakebaseAiSearch()", { context: { operation: "search" } });
|
|
142
117
|
}
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
const mode = options.mode ?? this.config.mode;
|
|
147
|
-
const limit = options.limit ?? this.config.pageSize;
|
|
148
|
-
// Databricks only manages embeddings for Delta Sync indexes, so a query
|
|
149
|
-
// against a DIRECT_ACCESS index must carry a query VECTOR, not text. Embed
|
|
150
|
-
// the query client-side in that case (the index type is cached after the
|
|
151
|
-
// first lookup so this costs one extra call per index, not per search).
|
|
152
|
-
const directAccess = await this.isDirectAccess(name, options.signal);
|
|
153
|
-
const queryVector = directAccess
|
|
154
|
-
? (await this.embed([text], this.config.embeddingModel, options.signal))[0]
|
|
155
|
-
: undefined;
|
|
156
|
-
const response = await this.withClient("search", options.signal, async (client, context) => {
|
|
157
|
-
return client.vectorSearchIndexes.queryIndex({
|
|
158
|
-
index_name: name,
|
|
159
|
-
columns,
|
|
160
|
-
...(queryVector ? { query_vector: queryVector } : { query_text: text }),
|
|
161
|
-
query_type: toQueryType(mode),
|
|
162
|
-
num_results: limit,
|
|
163
|
-
...(compileFilter(options.filter) ? { filters_json: compileFilter(options.filter) } : {}),
|
|
164
|
-
...(options.scoreThreshold !== undefined
|
|
165
|
-
? { score_threshold: options.scoreThreshold }
|
|
166
|
-
: {}),
|
|
167
|
-
}, context);
|
|
118
|
+
return this.readBackend.search(name, text, {
|
|
119
|
+
...options,
|
|
120
|
+
limit: options.limit ?? this.config.pageSize,
|
|
168
121
|
});
|
|
169
|
-
const hits = toHits(response, primaryKey);
|
|
170
|
-
return { query: text, index: name, hits, count: hits.length };
|
|
171
|
-
}
|
|
172
|
-
/** Cache of index-name -> is-DIRECT_ACCESS, so a search embeds its query only when needed. */
|
|
173
|
-
directAccessCache = new Map();
|
|
174
|
-
/** Whether an index is DIRECT_ACCESS (memoized); a lookup failure assumes Delta Sync. */
|
|
175
|
-
async isDirectAccess(name, signal) {
|
|
176
|
-
const cached = this.directAccessCache.get(name);
|
|
177
|
-
if (cached !== undefined)
|
|
178
|
-
return cached;
|
|
179
|
-
try {
|
|
180
|
-
const info = await this.getIndex(name, signal);
|
|
181
|
-
const value = info.directAccess ?? false;
|
|
182
|
-
this.directAccessCache.set(name, value);
|
|
183
|
-
return value;
|
|
184
|
-
}
|
|
185
|
-
catch {
|
|
186
|
-
return false;
|
|
187
|
-
}
|
|
188
122
|
}
|
|
189
123
|
/**
|
|
190
124
|
* Fan a query across several indexes and merge the hits, sorted by score -
|
|
@@ -232,8 +166,17 @@ export class SearchClient {
|
|
|
232
166
|
}
|
|
233
167
|
return name;
|
|
234
168
|
}
|
|
169
|
+
/** Reject Vector Search lifecycle calls against a non-Vector provider. */
|
|
170
|
+
requireLifecycle(operation) {
|
|
171
|
+
if (this.readBackend && !this.readBackend.supportsLifecycle) {
|
|
172
|
+
throw new ExecutionError(`search: the registered provider does not support ${operation}`, {
|
|
173
|
+
context: { operation },
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
}
|
|
235
177
|
/** Fetch an index's live definition. */
|
|
236
178
|
async getIndex(reference, signal) {
|
|
179
|
+
this.requireLifecycle("getIndex");
|
|
237
180
|
const name = this.requireIndexName(reference, "getIndex");
|
|
238
181
|
const index = await this.withClient("getIndex", signal, (client, context) => client.vectorSearchIndexes.getIndex({ index_name: name }, context));
|
|
239
182
|
const directAccess = index.direct_access_index_spec !== undefined;
|
|
@@ -264,18 +207,17 @@ export class SearchClient {
|
|
|
264
207
|
/** Add or update documents in a direct-access index. */
|
|
265
208
|
async addDocuments(reference, documents, signal) {
|
|
266
209
|
const name = this.requireIndexName(reference, "addDocuments");
|
|
267
|
-
if (this.
|
|
268
|
-
return this.
|
|
210
|
+
if (this.readBackend?.addDocuments) {
|
|
211
|
+
return this.readBackend.addDocuments(name, documents, signal);
|
|
269
212
|
}
|
|
213
|
+
this.requireLifecycle("addDocuments");
|
|
270
214
|
await this.withClient("addDocuments", signal, (client, context) => client.vectorSearchIndexes.upsertDataVectorIndex({ index_name: name, inputs_json: JSON.stringify(documents) }, context));
|
|
271
215
|
return { index: name, count: documents.length };
|
|
272
216
|
}
|
|
273
217
|
/** Delete documents from a direct-access index by primary key. */
|
|
274
218
|
async deleteDocuments(reference, ids, signal) {
|
|
219
|
+
this.requireLifecycle("deleteDocuments");
|
|
275
220
|
const name = this.requireIndexName(reference, "deleteDocuments");
|
|
276
|
-
if (this.lakebase) {
|
|
277
|
-
return this.lakebase.deleteDocuments(name, ids, signal);
|
|
278
|
-
}
|
|
279
221
|
await this.withClient("deleteDocuments", signal, (client, context) => client.vectorSearchIndexes.deleteDataVectorIndex({ index_name: name, primary_keys: ids.map(String) }, context));
|
|
280
222
|
return { index: name, count: ids.length };
|
|
281
223
|
}
|
|
@@ -291,14 +233,15 @@ export class SearchClient {
|
|
|
291
233
|
// A genuinely loose name (e.g. "gte large") still resolves against it.
|
|
292
234
|
if (explicit && !/\s/.test(explicit))
|
|
293
235
|
return explicit;
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
236
|
+
signal?.throwIfAborted();
|
|
237
|
+
const client = defaultAppKitWorkspaceClient();
|
|
238
|
+
const host = (await client.config.getHost()).toString();
|
|
239
|
+
const endpoints = await serving.listServingEndpoints(client, host);
|
|
240
|
+
signal?.throwIfAborted();
|
|
241
|
+
const { modelId } = modelResolve.resolveModel(endpoints, {
|
|
242
|
+
...(explicit ? { explicit } : { modelClass: ModelClass.Embedding }),
|
|
301
243
|
});
|
|
244
|
+
return string.trimToNull(modelId);
|
|
302
245
|
}
|
|
303
246
|
/**
|
|
304
247
|
* Embed text via a Databricks embedding serving endpoint, returning one
|
|
@@ -364,6 +307,7 @@ export class SearchClient {
|
|
|
364
307
|
* column (`embedding`). Returns the created index's {@link IndexInfo}.
|
|
365
308
|
*/
|
|
366
309
|
async createIndex(name, options = {}) {
|
|
310
|
+
this.requireLifecycle("createIndex");
|
|
367
311
|
const endpoint = options.endpoint ?? this.config.endpoint;
|
|
368
312
|
if (!endpoint) {
|
|
369
313
|
throw new ExecutionError("search: no Vector Search endpoint configured; pass `endpoint` or set it on the plugin", { context: { operation: "createIndex" } });
|
|
@@ -427,6 +371,7 @@ export class SearchClient {
|
|
|
427
371
|
* index is present.
|
|
428
372
|
*/
|
|
429
373
|
async ensureIndex(name, options = {}) {
|
|
374
|
+
this.requireLifecycle("ensureIndex");
|
|
430
375
|
try {
|
|
431
376
|
return await this.getIndex(name, options.signal);
|
|
432
377
|
}
|
|
@@ -446,23 +391,7 @@ export class SearchClient {
|
|
|
446
391
|
* rows and search-by-text works immediately.
|
|
447
392
|
*/
|
|
448
393
|
async provision(name, options = {}) {
|
|
449
|
-
|
|
450
|
-
// Lakebase fallback: no endpoint, no embeddings, no vectors - just a
|
|
451
|
-
// Postgres full-text table. Returns an IndexInfo-shaped result so the
|
|
452
|
-
// caller's logging + readiness handling is identical to Vector Search.
|
|
453
|
-
const rowCount = await this.lakebase.provision(name, {
|
|
454
|
-
textColumn: options.embeddingSourceColumn ?? "text",
|
|
455
|
-
...(options.seed ? { seed: options.seed } : {}),
|
|
456
|
-
...(options.signal ? { signal: options.signal } : {}),
|
|
457
|
-
});
|
|
458
|
-
return {
|
|
459
|
-
name,
|
|
460
|
-
primaryKey: options.primaryKey ?? "id",
|
|
461
|
-
columns: [],
|
|
462
|
-
ready: true,
|
|
463
|
-
rowCount,
|
|
464
|
-
};
|
|
465
|
-
}
|
|
394
|
+
this.requireLifecycle("provision");
|
|
466
395
|
const wait = options.wait ?? true;
|
|
467
396
|
const timeoutMs = options.timeoutMs ?? 20 * 60 * 1000;
|
|
468
397
|
const endpoint = options.endpoint ?? this.config.endpoint;
|
|
@@ -508,18 +437,21 @@ export class SearchClient {
|
|
|
508
437
|
}
|
|
509
438
|
/** Trigger a sync of a Delta Sync index from its source table. */
|
|
510
439
|
async syncIndex(reference, signal) {
|
|
440
|
+
this.requireLifecycle("syncIndex");
|
|
511
441
|
const name = this.requireIndexName(reference, "syncIndex");
|
|
512
442
|
await this.withClient("syncIndex", signal, (client, context) => client.vectorSearchIndexes.syncIndex({ index_name: name }, context));
|
|
513
443
|
logger.info("index-synced", { index: name });
|
|
514
444
|
}
|
|
515
445
|
/** Delete an index. */
|
|
516
446
|
async deleteIndex(reference, signal) {
|
|
447
|
+
this.requireLifecycle("deleteIndex");
|
|
517
448
|
const name = this.requireIndexName(reference, "deleteIndex");
|
|
518
449
|
await this.withClient("deleteIndex", signal, (client, context) => client.vectorSearchIndexes.deleteIndex({ index_name: name }, context));
|
|
519
450
|
logger.info("index-deleted", { index: name });
|
|
520
451
|
}
|
|
521
452
|
/** List the indexes hosted on a Vector Search endpoint (name + type only). */
|
|
522
453
|
async listIndexes(endpoint, signal) {
|
|
454
|
+
this.requireLifecycle("listIndexes");
|
|
523
455
|
const endpointName = endpoint ?? this.config.endpoint;
|
|
524
456
|
if (!endpointName) {
|
|
525
457
|
throw new ExecutionError("search: no endpoint configured to list indexes", {
|
|
@@ -540,6 +472,7 @@ export class SearchClient {
|
|
|
540
472
|
* does not. Optionally wait for it to come online. Idempotent.
|
|
541
473
|
*/
|
|
542
474
|
async ensureEndpoint(name, options = {}) {
|
|
475
|
+
this.requireLifecycle("ensureEndpoint");
|
|
543
476
|
const endpoint = name ?? this.config.endpoint;
|
|
544
477
|
if (!endpoint) {
|
|
545
478
|
throw new ExecutionError("search: no endpoint name to ensure", {
|
|
@@ -585,6 +518,10 @@ export class SearchClient {
|
|
|
585
518
|
}
|
|
586
519
|
/** The OBO workspace client from the active context, or a service-principal client. */
|
|
587
520
|
function defaultWorkspaceClient() {
|
|
521
|
+
return defaultAppKitWorkspaceClient().toLegacyWorkspaceClient();
|
|
522
|
+
}
|
|
523
|
+
/** AppKit workspace-client facade from the active request or service context. */
|
|
524
|
+
function defaultAppKitWorkspaceClient() {
|
|
588
525
|
const ctx = appkit.tryGetExecutionContext();
|
|
589
526
|
if (ctx?.client)
|
|
590
527
|
return ctx.client;
|
|
@@ -592,7 +529,7 @@ function defaultWorkspaceClient() {
|
|
|
592
529
|
return getExecutionContext().client;
|
|
593
530
|
}
|
|
594
531
|
/** Construct a {@link SearchClient} from a resolved config. */
|
|
595
|
-
export function createSearchClient(config, workspaceClientFactory,
|
|
596
|
-
return new SearchClient(config, workspaceClientFactory,
|
|
532
|
+
export function createSearchClient(config, workspaceClientFactory, readBackend) {
|
|
533
|
+
return new SearchClient(config, workspaceClientFactory, readBackend);
|
|
597
534
|
}
|
|
598
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTRCRztBQUVILE9BQU8sRUFBRSxjQUFjLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUV6RSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxJQUFJLFlBQVksRUFBRSxPQUFPLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM1RSxPQUFPLEVBQUUsS0FBSyxJQUFJLFdBQVcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2pGLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQVFyRCxPQUFPLEVBQ0wsWUFBWSxFQUNaLGlCQUFpQixFQUNqQixrQkFBa0IsRUFDbEIsY0FBYyxFQUNkLGdCQUFnQixHQUVqQixNQUFNLGFBQWEsQ0FBQztBQUVyQixPQUFPLEVBQ0wsYUFBYSxFQUNiLE1BQU0sRUFDTixXQUFXLEVBQ1gsZ0JBQWdCLEdBRWpCLE1BQU0sWUFBWSxDQUFDO0FBR3BCLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7QUE4QjNDOzs7O0dBSUc7QUFDSCxNQUFNLE9BQU8sV0FBVztJQUVYO0lBQ1E7SUFGbkIsWUFDVyxJQUFZLEVBQ0osTUFBb0I7UUFENUIsU0FBSSxHQUFKLElBQUksQ0FBUTtRQUNKLFdBQU0sR0FBTixNQUFNLENBQWM7SUFDcEMsQ0FBQztJQUVKLDBEQUEwRDtJQUMxRCxNQUFNLENBQUMsS0FBYSxFQUFFLE9BQXVCO1FBQzNDLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLEVB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Qy9DLE1BQU0sR0FBRyxDQUFDO1FBQ1osQ0FBQztnQkFBUyxDQUFDO1lBQ1QsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3RCLENBQUM7SUFDSCxDQUFDO0NBQ0Y7QUFFRCx1RkFBdUY7QUFDdkYsU0FBUyxzQkFBc0I7SUFDN0IsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLHNCQUFzQixFQUFFLENBQUM7SUFDNUMsSUFBSSxHQUFHLEVBQUUsTUFBTTtRQUFFLE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQztJQUNuQyx1RUFBdUU7SUFDdkUsT0FBTyxtQkFBbUIsRUFBRSxDQUFDLE1BQU0sQ0FBQztBQUN0QyxDQUFDO0FBRUQsK0RBQStEO0FBQy9ELE1BQU0sVUFBVSxrQkFBa0IsQ0FDaEMsTUFBNkIsRUFDN0Isc0JBQWtELEVBQ2xELFFBQWdDO0lBRWhDLE9BQU8sSUFBSSxZQUFZLENBQUMsTUFBTSxFQUFFLHNCQUFzQixFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQ3BFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEEgc21hbGwsIE1laWxpc2VhcmNoLXNoYXBlZCBjbGllbnQgb3ZlciBEYXRhYnJpY2tzIEFJIFNlYXJjaCAoVmVjdG9yXG4gKiBTZWFyY2gpLiBUaGUgd2hvbGUgcG9pbnQgb2YgdGhpcyBtb2R1bGUgaXMgZXJnb25vbWljczogdGhlIERhdGFicmlja3MgU0RLJ3NcbiAqIGB2ZWN0b3JTZWFyY2hJbmRleGVzLnF1ZXJ5SW5kZXgoeyBpbmRleF9uYW1lLCBjb2x1bW5zLCBxdWVyeV90ZXh0LFxuICogcXVlcnlfdHlwZSwgbnVtX3Jlc3VsdHMsIGZpbHRlcnNfanNvbiB9KWAgaXMgcG93ZXJmdWwgYnV0IHZlcmJvc2UsIGFuZCB0aGVcbiAqIHJlc3BvbnNlIGlzIGNvbHVtbmFyLiBUaGlzIGNsaWVudCBoaWRlcyBhbGwgb2YgdGhhdCBiZWhpbmQgdHdvIG9iamVjdHM6XG4gKlxuICogYGBgdHNcbiAqIGNvbnN0IGNsaWVudCA9IGNyZWF0ZVNlYXJjaENsaWVudCgpO1xuICogY29uc3QgaW5kZXggPSBjbGllbnQuaW5kZXgoXCJtYWluLnN1cHBvcnQuZG9jc1wiKTtcbiAqIGNvbnN0IHsgaGl0cyB9ID0gYXdhaXQgaW5kZXguc2VhcmNoKFwicmVzZXQgbXkgcGFzc3dvcmRcIiwgeyBsaW1pdDogNSB9KTtcbiAqIGF3YWl0IGluZGV4LmFkZERvY3VtZW50cyhbeyBpZDogXCI0MlwiLCB0aXRsZTogXCJSZXNldFwiLCBib2R5OiBcIi4uLlwiIH1dKTtcbiAqIGBgYFxuICpcbiAqIGBjbGllbnQuc2VhcmNoKHF1ZXJ5LCBvcHRzKWAgc2VhcmNoZXMgdGhlIGRlZmF1bHQgaW5kZXg7IGBjbGllbnQuaW5kZXgobmFtZSlgXG4gKiByZXR1cm5zIGEgaGFuZGxlIGJvdW5kIHRvIG9uZSBpbmRleDsgYGNsaWVudC51bml2ZXJzYWxTZWFyY2gocXVlcnkpYCBmYW5zIGFcbiAqIHF1ZXJ5IGFjcm9zcyBzZXZlcmFsIGluZGV4ZXMgYW5kIG1lcmdlcyB0aGUgcmVzdWx0cyAoTWVpbGlzZWFyY2gncyBmZWRlcmF0ZWRcbiAqIC8gbXVsdGktc2VhcmNoLCB0aGUgXCJ1bml2ZXJzYWwgc2VhcmNoXCIgdGhlIGNhbGxlciBhc2tlZCBmb3IpLiBFdmVyeXRoaW5nIGlzXG4gKiBhc3luYyBhbmQgY2FuY2VsbGFibGUsIHJlc29sdmVzIHRoZSBPQk8gd29ya3NwYWNlIGNsaWVudCBmcm9tIHRoZSBhY3RpdmVcbiAqIEFwcEtpdCBleGVjdXRpb24gY29udGV4dCAoZmFsbGluZyBiYWNrIHRvIGEgc2VydmljZS1wcmluY2lwYWwgY2xpZW50IG91dHNpZGVcbiAqIGEgcmVxdWVzdCksIGFuZCByZXR1cm5zIHRoZSBicm93c2VyLXNhZmUgc2hhcGVzIGZyb21cbiAqIGBAZGJ4LXRvb2xzL3NoYXJlZC1zZWFyY2hgLlxuICpcbiAqIEF1dG9jb21wbGV0ZSBpcyBqdXN0IGEgc2VhcmNoIHdpdGggYSBzbWFsbCBgbGltaXRgIGFuZCB0aGUgcmF3IHF1ZXJ5IHRleHQgLVxuICogaHlicmlkIG1vZGUgYWxyZWFkeSBwcmVmaXgtbWF0Y2hlcywgc28gbm8gc2VwYXJhdGUgZW5kcG9pbnQgaXMgbmVlZGVkOyB0aGVcbiAqIHtAbGluayBTZWFyY2hJbmRleC5hdXRvY29tcGxldGV9IGhlbHBlciBpcyBhIHRoaW4sIHNlbGYtZG9jdW1lbnRpbmcgYWxpYXMuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IEV4ZWN1dGlvbkVycm9yLCBnZXRFeGVjdXRpb25Db250ZXh0IH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHsgQ29udGV4dCB9IGZyb20gXCJAZGF0YWJyaWNrcy9zZGstZXhwZXJpbWVudGFsXCI7XG5pbXBvcnQgeyBhcHBraXQsIGRhdGFicmlja3MgfSBmcm9tIFwiQGRieC10b29scy9hcHBraXRcIjtcbmltcG9ydCB7IGludm9rZSwgcmVzb2x2ZSBhcyBtb2RlbFJlc29sdmUsIHNlcnZpbmcgfSBmcm9tIFwiQGRieC10b29scy9tb2RlbFwiO1xuaW1wb3J0IHsgYXN5bmMgYXMgc2hhcmVkQXN5bmMsIGpzb24sIGxvZywgc3RyaW5nIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7IE1vZGVsQ2xhc3MgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbW9kZWxcIjtcbmltcG9ydCB0eXBlIHtcbiAgU2VhcmNoRG9jdW1lbnQsXG4gIFNlYXJjaEhpdCxcbiAgU2VhcmNoTW9kZSxcbiAgU2VhcmNoUmVzdWx0LFxuICBVcHNlcnRSZXN1bHQsXG59IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1zZWFyY2hcIjtcbmltcG9ydCB7XG4gIERFRkFVTFRfTU9ERSxcbiAgREVGQVVMVF9QQUdFX1NJWkUsXG4gIERFRkFVTFRfVElNRU9VVF9NUyxcbiAgaW5kZXhDb25maWdGb3IsXG4gIHJlc29sdmVJbmRleE5hbWUsXG4gIHR5cGUgUmVzb2x2ZWRTZWFyY2hDb25maWcsXG59IGZyb20gXCIuL2NvbmZpZy50c1wiO1xuaW1wb3J0IHR5cGUgeyBMYWtlYmFzZVNlYXJjaEJhY2tlbmQgfSBmcm9tIFwiLi9sYWtlYmFzZS50c1wiO1xuaW1wb3J0IHtcbiAgY29tcGlsZUZpbHRlcixcbiAgdG9IaXRzLFxuICB0b1F1ZXJ5VHlwZSxcbiAgdG9SZXF1ZXN0Q29sdW1ucyxcbiAgdHlwZSBRdWVyeVJlc3BvbnNlTGlrZSxcbn0gZnJvbSBcIi4vcXVlcnkudHNcIjtcblxudHlwZSBXb3Jrc3BhY2VDbGllbnRMaWtlID0gYXBwa2l0LldvcmtzcGFjZUNsaWVudExpa2U7XG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwic2VhcmNoL2NsaWVudFwiKTtcblxuLyoqIE9wdGlvbnMgYWNjZXB0ZWQgYnkgYSBzaW5nbGUtaW5kZXggc2VhcmNoLiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZWFyY2hPcHRpb25zIHtcbiAgLyoqIE1heGltdW0gaGl0cyB0byByZXR1cm4uIERlZmF1bHRzIHRvIHRoZSBjb25maWd1cmVkIHBhZ2Ugc2l6ZS4gKi9cbiAgbGltaXQ/OiBudW1iZXI7XG4gIC8qKiBNYXRjaCBtb2RlLiBEZWZhdWx0cyB0byB0aGUgY29uZmlndXJlZCBtb2RlIChoeWJyaWQpLiAqL1xuICBtb2RlPzogU2VhcmNoTW9kZTtcbiAgLyoqIENvbHVtbnMgdG8gcmV0dXJuIHBlciBoaXQuIERlZmF1bHRzIHRvIHRoZSBpbmRleCdzIGNvbmZpZ3VyZWQgY29sdW1ucy4gKi9cbiAgY29sdW1ucz86IHJlYWRvbmx5IHN0cmluZ1tdO1xuICAvKiogQXR0cmlidXRlIGZpbHRlcnMgYXMgYHsgY29sdW1uOiB2YWx1ZSB9YCBvciBgeyBjb2x1bW46IHsgXCI+PVwiOiBuIH0gfWAuICovXG4gIGZpbHRlcj86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAvKiogRHJvcCBoaXRzIGJlbG93IHRoaXMgc2NvcmUuICovXG4gIHNjb3JlVGhyZXNob2xkPzogbnVtYmVyO1xuICAvKiogRXh0ZXJuYWwgY2FuY2VsbGF0aW9uLiAqL1xuICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbn1cblxuLyoqIE9wdGlvbnMgYWNjZXB0ZWQgYnkgYSB1bml2ZXJzYWwgKGZlZGVyYXRlZCkgc2VhcmNoLiAqL1xuZXhwb3J0IGludGVyZmFjZSBVbml2ZXJzYWxTZWFyY2hPcHRpb25zIHtcbiAgLyoqIEluZGV4ZXMgdG8gc2VhcmNoLiBEZWZhdWx0cyB0byBldmVyeSBrbm93biBpbmRleC4gKi9cbiAgaW5kZXhlcz86IHJlYWRvbmx5IHN0cmluZ1tdO1xuICAvKiogTWF4aW11bSBoaXRzIHBlciBpbmRleCBiZWZvcmUgbWVyZ2luZy4gKi9cbiAgbGltaXQ/OiBudW1iZXI7XG4gIC8qKiBNYXRjaCBtb2RlLiAqL1xuICBtb2RlPzogU2VhcmNoTW9kZTtcbiAgLyoqIEV4dGVybmFsIGNhbmNlbGxhdGlvbi4gKi9cbiAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG59XG5cbi8qKlxuICogQSBoYW5kbGUgYm91bmQgdG8gb25lIGluZGV4LiBNb2RlbGVkIG9uIE1laWxpc2VhcmNoJ3MgYGNsaWVudC5pbmRleCh1aWQpYDpcbiAqIGBzZWFyY2hgIC8gYGF1dG9jb21wbGV0ZWAgcmVhZCwgYGFkZERvY3VtZW50c2AgLyBgZGVsZXRlRG9jdW1lbnRzYCB3cml0ZSAodG9cbiAqIGEgZGlyZWN0LWFjY2VzcyBpbmRleCksIGFuZCBgaW5mb2AgZmV0Y2hlcyB0aGUgbGl2ZSBkZWZpbml0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgU2VhcmNoSW5kZXgge1xuICBjb25zdHJ1Y3RvcihcbiAgICByZWFkb25seSBuYW1lOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSByZWFkb25seSBjbGllbnQ6IFNlYXJjaENsaWVudCxcbiAgKSB7fVxuXG4gIC8qKiBTZWFyY2ggdGhpcyBpbmRleC4gU2VlIHtAbGluayBTZWFyY2hDbGllbnQuc2VhcmNofS4gKi9cbiAgc2VhcmNoKHF1ZXJ5OiBzdHJpbmcsIG9wdGlvbnM/OiBTZWFyY2hPcHRpb25zKTogUHJvbWlzZTxTZWFyY2hSZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQuc2VhcmNoKHF1ZXJ5LCB7IC4uLm9wdGlvbnMsIGluZGV4OiB0aGlzLm5hbWUgfSk7XG4gIH1cblxuICAvKipcbiAgICogQXV0b2NvbXBsZXRlIGFnYWluc3QgdGhpcyBpbmRleDogYSBzZWFyY2ggd2l0aCBhIHNtYWxsIGRlZmF1bHQgYGxpbWl0YCBhbmRcbiAgICogdGhlIHJhdyBwcmVmaXggYXMgdGhlIHF1ZXJ5LiBIeWJyaWQgbW9kZSBhbHJlYWR5IGhhbmRsZXMgcHJlZml4ZXMsIHNvIHRoaXNcbiAgICogaXMgYSBzZWxmLWRvY3VtZW50aW5nIGFsaWFzIHJhdGhlciB0aGFuIGEgc2VwYXJhdGUgY29kZSBwYXRoLlxuICAgKi9cbiAgYXV0b2NvbXBsZXRlKHByZWZpeDogc3RyaW5nLCBvcHRpb25zPzogU2VhcmNoT3B0aW9ucyk6IFByb21pc2U8U2VhcmNoUmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMuc2VhcmNoKHByZWZpeCwgeyBsaW1pdDogNSwgLi4ub3B0aW9ucyB9KTtcbiAgfVxuXG4gIC8qKiBBZGQgb3IgdXBkYXRlIGRvY3VtZW50cyBpbiB0aGlzIChkaXJlY3QtYWNjZXNzKSBpbmRleC4gKi9cbiAgYWRkRG9jdW1lbnRzKGRvY3VtZW50czogU2VhcmNoRG9jdW1lbnRbXSwgc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPFVwc2VydFJlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5hZGREb2N1bWVudHModGhpcy5uYW1lLCBkb2N1bWVudHMsIHNpZ25hbCk7XG4gIH1cblxuICAvKiogRGVsZXRlIGRvY3VtZW50cyBmcm9tIHRoaXMgKGRpcmVjdC1hY2Nlc3MpIGluZGV4IGJ5IHByaW1hcnkga2V5LiAqL1xuICBkZWxldGVEb2N1bWVudHMoaWRzOiBBcnJheTxzdHJpbmcgfCBudW1iZXI+LCBzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8VXBzZXJ0UmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmRlbGV0ZURvY3VtZW50cyh0aGlzLm5hbWUsIGlkcywgc2lnbmFsKTtcbiAgfVxuXG4gIC8qKiBGZXRjaCB0aGlzIGluZGV4J3MgbGl2ZSBkZWZpbml0aW9uIChwcmltYXJ5IGtleSwgY29sdW1ucywgcmVhZGluZXNzKS4gKi9cbiAgaW5mbyhzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8SW5kZXhJbmZvPiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmdldEluZGV4KHRoaXMubmFtZSwgc2lnbmFsKTtcbiAgfVxuXG4gIC8qKiBUcmlnZ2VyIGEgc3luYyBvZiB0aGlzIChEZWx0YSBTeW5jKSBpbmRleCBmcm9tIGl0cyBzb3VyY2UgdGFibGUuICovXG4gIHN5bmMoc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQuc3luY0luZGV4KHRoaXMubmFtZSwgc2lnbmFsKTtcbiAgfVxuXG4gIC8qKiBEZWxldGUgdGhpcyBpbmRleC4gKi9cbiAgZGVsZXRlKHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmRlbGV0ZUluZGV4KHRoaXMubmFtZSwgc2lnbmFsKTtcbiAgfVxuXG4gIC8qKiBDcmVhdGUgdGhpcyBpbmRleCBpZiBpdCBkb2VzIG5vdCBleGlzdCwgb3RoZXJ3aXNlIHJldHVybiB0aGUgZXhpc3Rpbmcgb25lLiAqL1xuICBlbnN1cmUob3B0aW9ucz86IENyZWF0ZUluZGV4T3B0aW9ucyk6IFByb21pc2U8SW5kZXhJbmZvPiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmVuc3VyZUluZGV4KHRoaXMubmFtZSwgb3B0aW9ucyk7XG4gIH1cbn1cblxuLyoqIEEgcmVzb2x2ZWQgbGl2ZSBpbmRleCBkZWZpbml0aW9uLiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmRleEluZm8ge1xuICBuYW1lOiBzdHJpbmc7XG4gIGVuZHBvaW50Pzogc3RyaW5nO1xuICBwcmltYXJ5S2V5Pzogc3RyaW5nO1xuICBjb2x1bW5zOiBzdHJpbmdbXTtcbiAgcmVhZHk6IGJvb2xlYW47XG4gIHJvd0NvdW50PzogbnVtYmVyO1xuICAvKiogVHJ1ZSBmb3IgYSBESVJFQ1RfQUNDRVNTIGluZGV4ICh5b3Ugc3VwcGx5IHZlY3RvcnM7IHF1ZXJpZXMgZW1iZWQgY2xpZW50LXNpZGUpLiAqL1xuICBkaXJlY3RBY2Nlc3M/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBTZWFyY2hDbGllbnQuY3JlYXRlSW5kZXh9IC8ge0BsaW5rIFNlYXJjaENsaWVudC5lbnN1cmVJbmRleH0uXG4gKiBUaGUgZ29hbCBpcyB0aGUgc2FtZSBhcyB0aGUgcmVzdCBvZiB0aGUgY2xpZW50OiBuYW1lIGEgc291cmNlIHRhYmxlIGFuZCBhXG4gKiB0ZXh0IGNvbHVtbiwgYW5kIGV2ZXJ5dGhpbmcgZWxzZSAtIHRoZSBlbmRwb2ludCwgdGhlIGVtYmVkZGluZyBtb2RlbCwgdGhlXG4gKiBpbmRleCB0eXBlLCB0aGUgc3luYyBtb2RlIC0gaGFzIGEgc2Vuc2libGUgZGVmYXVsdCB0aGF0IGluZmVycyBmcm9tIHRoZVxuICogd29ya3NwYWNlLCBvdmVycmlkYWJsZSB3aGVuIGEgZGVwbG95bWVudCBuZWVkcyB0byBnbyBkZWVwZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlSW5kZXhPcHRpb25zIHtcbiAgLyoqXG4gICAqIFNvdXJjZSBEZWx0YSB0YWJsZSAoY2F0YWxvZy5zY2hlbWEudGFibGUpIGZvciBhIERlbHRhIFN5bmMgaW5kZXguIFByb3ZpZGVcbiAgICogdGhpcyBmb3IgdGhlIGNvbW1vbiBjYXNlOiBEYXRhYnJpY2tzIGNvbXB1dGVzIGFuZCBzeW5jcyBlbWJlZGRpbmdzIGZyb20gaXQuXG4gICAqIE9taXQgaXQgKGFuZCBwYXNzIHtAbGluayBlbWJlZGRpbmdEaW1lbnNpb259KSB0byBjcmVhdGUgYSBkaXJlY3QtYWNjZXNzXG4gICAqIGluZGV4IHlvdSB3cml0ZSB2ZWN0b3JzIHRvIHlvdXJzZWxmLlxuICAgKi9cbiAgc291cmNlVGFibGU/OiBzdHJpbmc7XG4gIC8qKiBQcmltYXJ5LWtleSBjb2x1bW4uIERlZmF1bHRzIHRvIGBpZGAuICovXG4gIHByaW1hcnlLZXk/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgdGV4dCBjb2x1bW4gZW1iZWRkaW5ncyBhcmUgY29tcHV0ZWQgZnJvbSAoRGVsdGEgU3luYykuIERlZmF1bHRzIHRvIHRoZVxuICAgKiBmaXJzdCBvZiBgdGV4dGAgLyBgY29udGVudGAgLyBgYm9keWAgcHJlc2VudCwgZWxzZSB0aGUgY2FsbGVyIG11c3Qgc2V0IGl0LlxuICAgKi9cbiAgZW1iZWRkaW5nU291cmNlQ29sdW1uPzogc3RyaW5nO1xuICAvKipcbiAgICogRW1iZWRkaW5nIG1vZGVsIGVuZHBvaW50LiBBIGxvb3NlIG5hbWUgaXMgZnV6enktbWF0Y2hlZDsgd2hlbiBvbWl0dGVkIHRoZVxuICAgKiBiZXN0IGVtYmVkZGluZyBlbmRwb2ludCBpbiB0aGUgd29ya3NwYWNlIGlzIGNob3NlbiAoe0BsaW5rIHJlc29sdmVFbWJlZGRpbmdNb2RlbH0pLlxuICAgKi9cbiAgZW1iZWRkaW5nTW9kZWw/OiBzdHJpbmc7XG4gIC8qKiBWZWN0b3IgU2VhcmNoIGVuZHBvaW50IHRvIGhvc3QgdGhlIGluZGV4IG9uLiBEZWZhdWx0cyB0byB0aGUgcGx1Z2luJ3MgYGVuZHBvaW50YC4gKi9cbiAgZW5kcG9pbnQ/OiBzdHJpbmc7XG4gIC8qKiBGb3IgYSBkaXJlY3QtYWNjZXNzIGluZGV4OiB0aGUgZW1iZWRkaW5nIHZlY3RvciBkaW1lbnNpb24gKHNlbGYtbWFuYWdlZCB2ZWN0b3JzLCBubyBzb3VyY2UgdGFibGUpLiAqL1xuICBlbWJlZGRpbmdEaW1lbnNpb24/OiBudW1iZXI7XG4gIC8qKiBGb3IgYSBkaXJlY3QtYWNjZXNzIGluZGV4OiB0aGUgY29sdW1uIHRoZSB2ZWN0b3IgaXMgc3RvcmVkIGluLiBEZWZhdWx0cyB0byBgZW1iZWRkaW5nYC4gKi9cbiAgZW1iZWRkaW5nVmVjdG9yQ29sdW1uPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGNvbHVtbi1uYW1lIC0+IHR5cGUgbWFwIHVzZWQgdG8gYnVpbGQgYSBkaXJlY3QtYWNjZXNzIGluZGV4J3NcbiAgICogYHNjaGVtYV9qc29uYCAodHlwZXM6IGBzdHJpbmdgLCBgaW50YCwgYGxvbmdgLCBgZmxvYXRgLCBgZG91YmxlYCxcbiAgICogYGJvb2xlYW5gLCBgZGF0ZWAsIGB0aW1lc3RhbXBgKS4gTXVzdCBpbmNsdWRlIHRoZSBwcmltYXJ5IGtleSBhbmQgYW55XG4gICAqIGNvbHVtbnMgeW91IHVwc2VydC4gRGVmYXVsdHMgdG8gYHsgaWQ6IFwic3RyaW5nXCIsIHRleHQ6IFwic3RyaW5nXCIgfWAuIFRoZVxuICAgKiBlbWJlZGRpbmcgdmVjdG9yIGNvbHVtbiBpcyBhZGRlZCBhdXRvbWF0aWNhbGx5LlxuICAgKi9cbiAgc2NoZW1hPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgLyoqIFN5bmMgbW9kZSBmb3IgYSBEZWx0YSBTeW5jIGluZGV4LiBgVFJJR0dFUkVEYCAoZGVmYXVsdCkgc3luY3Mgb24gZGVtYW5kOyBgQ09OVElOVU9VU2Aga2VlcHMgZnJlc2guICovXG4gIHBpcGVsaW5lVHlwZT86IFwiVFJJR0dFUkVEXCIgfCBcIkNPTlRJTlVPVVNcIjtcbiAgLyoqIEV4dHJhIGNvbHVtbnMgdG8gc3luYyBhbG9uZ3NpZGUgdGhlIGVtYmVkZGluZyBzb3VyY2UgKERlbHRhIFN5bmMpLiAqL1xuICBjb2x1bW5zVG9TeW5jPzogc3RyaW5nW107XG4gIC8qKiBFeHRlcm5hbCBjYW5jZWxsYXRpb24uICovXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsO1xufVxuXG4vKiogT3B0aW9ucyBmb3Ige0BsaW5rIFNlYXJjaENsaWVudC5lbnN1cmVFbmRwb2ludH0uICovXG5leHBvcnQgaW50ZXJmYWNlIEVuc3VyZUVuZHBvaW50T3B0aW9ucyB7XG4gIC8qKiBXYWl0IGZvciB0aGUgZW5kcG9pbnQgdG8gY29tZSBvbmxpbmUgYmVmb3JlIHJldHVybmluZy4gRGVmYXVsdHMgdG8gZmFsc2UuICovXG4gIHdhaXQ/OiBib29sZWFuO1xuICAvKiogRXh0ZXJuYWwgY2FuY2VsbGF0aW9uLiAqL1xuICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgU2VhcmNoQ2xpZW50LnByb3Zpc2lvbn0gLSBhIG9uZS1jYWxsIFwibWFrZSB0aGlzIGluZGV4IHJlYWxcbiAqIGFuZCBzZWFyY2hhYmxlXCIgdXNlZCBhdCBib290IG9yIGluIGEgc2VlZCBzY3JpcHQuIEl0IGVuc3VyZXMgdGhlIGVuZHBvaW50LFxuICogZW5zdXJlcyB0aGUgaW5kZXgsIGFuZCAob3B0aW9uYWxseSkgc2VlZHMgZG9jdW1lbnRzIHdoZW4gdGhlIGluZGV4IGlzIGVtcHR5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb3Zpc2lvbk9wdGlvbnMgZXh0ZW5kcyBDcmVhdGVJbmRleE9wdGlvbnMge1xuICAvKiogRG9jdW1lbnRzIHRvIHNlZWQgd2hlbiB0aGUgaW5kZXggaGFzIG5vIHJvd3MgeWV0LiBTa2lwcGVkIGlmIGl0IGFscmVhZHkgaGFzIGRhdGEuICovXG4gIHNlZWQ/OiBTZWFyY2hEb2N1bWVudFtdO1xuICAvKipcbiAgICogV2FpdCBmb3IgdGhlIGVuZHBvaW50IEFORCBpbmRleCB0byBjb21lIG9ubGluZSBiZWZvcmUgcmV0dXJuaW5nIChuZWVkZWRcbiAgICogYmVmb3JlIHNlZWRpbmcpLiBEZWZhdWx0cyB0byB0cnVlLiBFbmRwb2ludCBjcmVhdGlvbiBjYW4gdGFrZSBtYW55IG1pbnV0ZXMuXG4gICAqL1xuICB3YWl0PzogYm9vbGVhbjtcbiAgLyoqIEhvdyBsb25nIHRvIHdhaXQgZm9yIHJlYWRpbmVzcyBiZWZvcmUgZ2l2aW5nIHVwLiBEZWZhdWx0cyB0byAyMCBtaW51dGVzLiAqL1xuICB0aW1lb3V0TXM/OiBudW1iZXI7XG59XG5cbi8qKlxuICogVGhlIEFJIFNlYXJjaCBjbGllbnQuIENvbnN0cnVjdCBpdCB3aXRoIHtAbGluayBjcmVhdGVTZWFyY2hDbGllbnR9ICh3aGljaFxuICogcmVhZHMgYSByZXNvbHZlZCBjb25maWcpIG9yIGRpcmVjdGx5IGZvciBvbmUtb2ZmIHVzZS4gQWxsIHJlYWRzIHJlc29sdmUgdGhlXG4gKiBPQk8gd29ya3NwYWNlIGNsaWVudCBmcm9tIHRoZSBhY3RpdmUgZXhlY3V0aW9uIGNvbnRleHQuXG4gKi9cbmV4cG9ydCBjbGFzcyBTZWFyY2hDbGllbnQge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZzogUmVzb2x2ZWRTZWFyY2hDb25maWcgPSB7XG4gICAgICBpbmRleGVzOiBbXSxcbiAgICAgIHBhZ2VTaXplOiBERUZBVUxUX1BBR0VfU0laRSxcbiAgICAgIG1vZGU6IERFRkFVTFRfTU9ERSxcbiAgICAgIGJhc2VQYXRoOiBcIi9hcGkvc2VhcmNoXCIsXG4gICAgICB0aW1lb3V0TXM6IERFRkFVTFRfVElNRU9VVF9NUyxcbiAgICAgIGFsbG93V3JpdGU6IGZhbHNlLFxuICAgIH0sXG4gICAgcHJpdmF0ZSByZWFkb25seSB3b3Jrc3BhY2VDbGllbnRGYWN0b3J5OiAoKSA9PiBXb3Jrc3BhY2VDbGllbnRMaWtlID0gZGVmYXVsdFdvcmtzcGFjZUNsaWVudCxcbiAgICAvKipcbiAgICAgKiBPcHRpb25hbCBMYWtlYmFzZSBmdWxsLXRleHQgRkFMTEJBQ0sgYmFja2VuZC4gUHJlc2VudCBvbmx5IHdoZW4gbm8gVmVjdG9yXG4gICAgICogU2VhcmNoIGVuZHBvaW50IGlzIGNvbmZpZ3VyZWQgYnV0IGEgTGFrZWJhc2UgcG9vbCBpcyBhdmFpbGFibGU7IHdoZW4gc2V0LFxuICAgICAqIHNlYXJjaCAvIHByb3Zpc2lvbiAvIHdyaXRlIG9wZXJhdGlvbnMgZGVsZWdhdGUgdG8gaXQgYW5kIHJldHVybiB0aGUgZXhhY3RcbiAgICAgKiBzYW1lIHNoYXBlcywgc28gbm90aGluZyBkb3duc3RyZWFtIGNhbiB0ZWxsIHdoaWNoIGJhY2tlbmQgYW5zd2VyZWQuXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBsYWtlYmFzZT86IExha2ViYXNlU2VhcmNoQmFja2VuZCxcbiAgKSB7fVxuXG4gIC8qKiBUcnVlIHdoZW4gdGhpcyBjbGllbnQgaXMgYW5zd2VyaW5nIG91dCBvZiB0aGUgTGFrZWJhc2UgZmFsbGJhY2sgYmFja2VuZC4gKi9cbiAgZ2V0IHVzZXNMYWtlYmFzZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5sYWtlYmFzZSAhPT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqIEEgaGFuZGxlIGJvdW5kIHRvIG9uZSBpbmRleCAoYnkgZnVsbCBVQyBuYW1lIG9yIGNvbmZpZ3VyZWQgYWxpYXMpLiAqL1xuICBpbmRleChyZWZlcmVuY2U6IHN0cmluZyk6IFNlYXJjaEluZGV4IHtcbiAgICBjb25zdCBuYW1lID0gcmVzb2x2ZUluZGV4TmFtZSh0aGlzLmNvbmZpZywgcmVmZXJlbmNlKSA/PyByZWZlcmVuY2U7XG4gICAgcmV0dXJuIG5ldyBTZWFyY2hJbmRleChuYW1lLCB0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWFyY2ggb25lIGluZGV4LiBgaW5kZXhgIG1heSBiZSBhIGZ1bGwgVUMgbmFtZSwgYSBjb25maWd1cmVkIGFsaWFzLCBvclxuICAgKiBvbWl0dGVkIHRvIHVzZSB0aGUgZGVmYXVsdCBpbmRleC4gUmV0dXJucyBoaXRzIHNvcnRlZCBtb3N0LXJlbGV2YW50LWZpcnN0LlxuICAgKi9cbiAgYXN5bmMgc2VhcmNoKFxuICAgIHF1ZXJ5OiBzdHJpbmcsXG4gICAgb3B0aW9uczogU2VhcmNoT3B0aW9ucyAmIHsgaW5kZXg/OiBzdHJpbmcgfSA9IHt9LFxuICApOiBQcm9taXNlPFNlYXJjaFJlc3VsdD4ge1xuICAgIGNvbnN0IHRleHQgPSBzdHJpbmcudHJpbVRvRW1wdHkocXVlcnkpO1xuICAgIGNvbnN0IG5hbWUgPSByZXNvbHZlSW5kZXhOYW1lKHRoaXMuY29uZmlnLCBvcHRpb25zLmluZGV4KTtcbiAgICBpZiAobmFtZSA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEV4ZWN1dGlvbkVycm9yKFwic2VhcmNoOiBubyBpbmRleCBjb25maWd1cmVkOyBzZXQgYSBkZWZhdWx0IGluZGV4IG9yIHBhc3Mgb25lXCIsIHtcbiAgICAgICAgY29udGV4dDogeyBvcGVyYXRpb246IFwic2VhcmNoXCIgfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAodGhpcy5sYWtlYmFzZSkge1xuICAgICAgcmV0dXJuIHRoaXMubGFrZWJhc2Uuc2VhcmNoKG5hbWUsIHRleHQsIHtcbiAgICAgICAgbGltaXQ6IG9wdGlvbnMubGltaXQgPz8gdGhpcy5jb25maWcucGFnZVNpemUsXG4gICAgICAgIC4uLihvcHRpb25zLnNjb3JlVGhyZXNob2xkICE9PSB1bmRlZmluZWQgPyB7IHNjb3JlVGhyZXNob2xkOiBvcHRpb25zLnNjb3JlVGhyZXNob2xkIH0gOiB7fSksXG4gICAgICAgIC4uLihvcHRpb25zLnNpZ25hbCA/IHsgc2lnbmFsOiBvcHRpb25zLnNpZ25hbCB9IDoge30pLFxuICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IGtub3duID0gaW5kZXhDb25maWdGb3IodGhpcy5jb25maWcsIG5hbWUpO1xuICAgIGNvbnN0IHByaW1hcnlLZXkgPSBrbm93bj8ucHJpbWFyeUtleTtcbiAgICBjb25zdCBjb2x1bW5zID0gdG9SZXF1ZXN0Q29sdW1ucyhcbiAgICAgIG9wdGlvbnMuY29sdW1ucyxcbiAgICAgIGtub3duPy5jb2x1bW5zID8/IHRoaXMuY29uZmlnLmNvbHVtbnMsXG4gICAgICBwcmltYXJ5S2V5LFxuICAgICk7XG4gICAgY29uc3QgbW9kZSA9IG9wdGlvbnMubW9kZSA/PyB0aGlzLmNvbmZpZy5tb2RlO1xuICAgIGNvbnN0IGxpbWl0ID0gb3B0aW9ucy5saW1pdCA/PyB0aGlzLmNvbmZpZy5wYWdlU2l6ZTtcblxuICAgIC8vIERhdGFicmlja3Mgb25seSBtYW5hZ2VzIGVtYmVkZGluZ3MgZm9yIERlbHRhIFN5bmMgaW5kZXhlcywgc28gYSBxdWVyeVxuICAgIC8vIGFnYWluc3QgYSBESVJFQ1RfQUNDRVNTIGluZGV4IG11c3QgY2FycnkgYSBxdWVyeSBWRUNUT1IsIG5vdCB0ZXh0LiBFbWJlZFxuICAgIC8vIHRoZSBxdWVyeSBjbGllbnQtc2lkZSBpbiB0aGF0IGNhc2UgKHRoZSBpbmRleCB0eXBlIGlzIGNhY2hlZCBhZnRlciB0aGVcbiAgICAvLyBmaXJzdCBsb29rdXAgc28gdGhpcyBjb3N0cyBvbmUgZXh0cmEgY2FsbCBwZXIgaW5kZXgsIG5vdCBwZXIgc2VhcmNoKS5cbiAgICBjb25zdCBkaXJlY3RBY2Nlc3MgPSBhd2FpdCB0aGlzLmlzRGlyZWN0QWNjZXNzKG5hbWUsIG9wdGlvbnMuc2lnbmFsKTtcbiAgICBjb25zdCBxdWVyeVZlY3RvciA9IGRpcmVjdEFjY2Vzc1xuICAgICAgPyAoYXdhaXQgdGhpcy5lbWJlZChbdGV4dF0sIHRoaXMuY29uZmlnLmVtYmVkZGluZ01vZGVsLCBvcHRpb25zLnNpZ25hbCkpWzBdXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy53aXRoQ2xpZW50KFwic2VhcmNoXCIsIG9wdGlvbnMuc2lnbmFsLCBhc3luYyAoY2xpZW50LCBjb250ZXh0KSA9PiB7XG4gICAgICByZXR1cm4gY2xpZW50LnZlY3RvclNlYXJjaEluZGV4ZXMucXVlcnlJbmRleChcbiAgICAgICAge1xuICAgICAgICAgIGluZGV4X25hbWU6IG5hbWUsXG4gICAgICAgICAgY29sdW1ucyxcbiAgICAgICAgICAuLi4ocXVlcnlWZWN0b3IgPyB7IHF1ZXJ5X3ZlY3RvcjogcXVlcnlWZWN0b3IgfSA6IHsgcXVlcnlfdGV4dDogdGV4dCB9KSxcbiAgICAgICAgICBxdWVyeV90eXBlOiB0b1F1ZXJ5VHlwZShtb2RlKSxcbiAgICAgICAgICBudW1fcmVzdWx0czogbGltaXQsXG4gICAgICAgICAgLi4uKGNvbXBpbGVGaWx0ZXIob3B0aW9ucy5maWx0ZXIpID8geyBmaWx0ZXJzX2pzb246IGNvbXBpbGVGaWx0ZXIob3B0aW9ucy5maWx0ZXIpIH0gOiB7fSksXG4gICAgICAgICAgLi4uKG9wdGlvbnMuc2NvcmVUaHJlc2hvbGQgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyB7IHNjb3JlX3RocmVzaG9sZDogb3B0aW9ucy5zY29yZVRocmVzaG9sZCB9XG4gICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgfSxcbiAgICAgICAgY29udGV4dCxcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBoaXRzID0gdG9IaXRzKHJlc3BvbnNlIGFzIFF1ZXJ5UmVzcG9uc2VMaWtlLCBwcmltYXJ5S2V5KTtcbiAgICByZXR1cm4geyBxdWVyeTogdGV4dCwgaW5kZXg6IG5hbWUsIGhpdHMsIGNvdW50OiBoaXRzLmxlbmd0aCB9O1xuICB9XG5cbiAgLyoqIENhY2hlIG9mIGluZGV4LW5hbWUgLT4gaXMtRElSRUNUX0FDQ0VTUywgc28gYSBzZWFyY2ggZW1iZWRzIGl0cyBxdWVyeSBvbmx5IHdoZW4gbmVlZGVkLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGRpcmVjdEFjY2Vzc0NhY2hlID0gbmV3IE1hcDxzdHJpbmcsIGJvb2xlYW4+KCk7XG5cbiAgLyoqIFdoZXRoZXIgYW4gaW5kZXggaXMgRElSRUNUX0FDQ0VTUyAobWVtb2l6ZWQpOyBhIGxvb2t1cCBmYWlsdXJlIGFzc3VtZXMgRGVsdGEgU3luYy4gKi9cbiAgcHJpdmF0ZSBhc3luYyBpc0RpcmVjdEFjY2VzcyhuYW1lOiBzdHJpbmcsIHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgY2FjaGVkID0gdGhpcy5kaXJlY3RBY2Nlc3NDYWNoZS5nZXQobmFtZSk7XG4gICAgaWYgKGNhY2hlZCAhPT0gdW5kZWZpbmVkKSByZXR1cm4gY2FjaGVkO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBpbmZvID0gYXdhaXQgdGhpcy5nZXRJbmRleChuYW1lLCBzaWduYWwpO1xuICAgICAgY29uc3QgdmFsdWUgPSBpbmZvLmRpcmVjdEFjY2VzcyA/PyBmYWxzZTtcbiAgICAgIHRoaXMuZGlyZWN0QWNjZXNzQ2FjaGUuc2V0KG5hbWUsIHZhbHVlKTtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmFuIGEgcXVlcnkgYWNyb3NzIHNldmVyYWwgaW5kZXhlcyBhbmQgbWVyZ2UgdGhlIGhpdHMsIHNvcnRlZCBieSBzY29yZSAtXG4gICAqIHRoZSBcInVuaXZlcnNhbCBzZWFyY2hcIiBhIHNpbmdsZSBib3ggb3ZlciBtYW55IGNvbGxlY3Rpb25zIG5lZWRzLiBFYWNoXG4gICAqIGluZGV4IGlzIHNlYXJjaGVkIGNvbmN1cnJlbnRseTsgYW4gaW5kZXggdGhhdCBlcnJvcnMgaXMgbG9nZ2VkIGFuZCBza2lwcGVkXG4gICAqIHNvIG9uZSBiYWQgaW5kZXggZG9lcyBub3Qgc2luayB0aGUgd2hvbGUgc2VhcmNoLlxuICAgKi9cbiAgYXN5bmMgdW5pdmVyc2FsU2VhcmNoKFxuICAgIHF1ZXJ5OiBzdHJpbmcsXG4gICAgb3B0aW9uczogVW5pdmVyc2FsU2VhcmNoT3B0aW9ucyA9IHt9LFxuICApOiBQcm9taXNlPFNlYXJjaFJlc3VsdD4ge1xuICAgIGNvbnN0IHRleHQgPSBzdHJpbmcudHJpbVRvRW1wdHkocXVlcnkpO1xuICAgIGNvbnN0IG5hbWVzID1cbiAgICAgIG9wdGlvbnMuaW5kZXhlcyAmJiBvcHRpb25zLmluZGV4ZXMubGVuZ3RoID4gMFxuICAgICAgICA/IG9wdGlvbnMuaW5kZXhlcy5tYXAoKHJlZikgPT4gcmVzb2x2ZUluZGV4TmFtZSh0aGlzLmNvbmZpZywgcmVmKSA/PyByZWYpXG4gICAgICAgIDogdGhpcy5jb25maWcuaW5kZXhlcy5tYXAoKGkpID0+IGkubmFtZSk7XG4gICAgY29uc3QgcGVySW5kZXggPSBvcHRpb25zLmxpbWl0ID8/IHRoaXMuY29uZmlnLnBhZ2VTaXplO1xuXG4gICAgY29uc3Qgc2V0dGxlZCA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChcbiAgICAgIG5hbWVzLm1hcChhc3luYyAobmFtZSkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNlYXJjaCh0ZXh0LCB7XG4gICAgICAgICAgaW5kZXg6IG5hbWUsXG4gICAgICAgICAgbGltaXQ6IHBlckluZGV4LFxuICAgICAgICAgIC4uLihvcHRpb25zLm1vZGUgPyB7IG1vZGU6IG9wdGlvbnMubW9kZSB9IDoge30pLFxuICAgICAgICAgIC4uLihvcHRpb25zLnNpZ25hbCA/IHsgc2lnbmFsOiBvcHRpb25zLnNpZ25hbCB9IDoge30pLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdC5oaXRzLm1hcCgoaGl0KTogU2VhcmNoSGl0ID0+ICh7IC4uLmhpdCwgaW5kZXg6IG5hbWUgfSkpO1xuICAgICAgfSksXG4gICAgKTtcblxuICAgIGNvbnN0IGhpdHMgPSBzZXR0bGVkXG4gICAgICAuZmxhdE1hcCgob3V0Y29tZSwgaSkgPT4ge1xuICAgICAgICBpZiAob3V0Y29tZS5zdGF0dXMgPT09IFwiZnVsZmlsbGVkXCIpIHJldHVybiBvdXRjb21lLnZhbHVlO1xuICAgICAgICBsb2dnZXIud2FybihcInVuaXZlcnNhbC1pbmRleC1mYWlsZWRcIiwgeyBpbmRleDogbmFtZXNbaV0gfSk7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH0pXG4gICAgICAuc29ydCgoYSwgYikgPT4gYi5zY29yZSAtIGEuc2NvcmUpO1xuXG4gICAgcmV0dXJuIHsgcXVlcnk6IHRleHQsIGhpdHMsIGNvdW50OiBoaXRzLmxlbmd0aCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgYW4gaW5kZXggcmVmZXJlbmNlIChmdWxsIFVDIG5hbWUgb3IgY29uZmlndXJlZCBhbGlhcykgdG8gdGhlIG5hbWVcbiAgICogdGhlIEFQSSBleHBlY3RzLCBmYWlsaW5nIGZhc3Qgd2hlbiBpdCByZXNvbHZlcyB0byBub3RoaW5nLiBXaXRob3V0IHRoaXMgYVxuICAgKiBibGFuayByZWZlcmVuY2UgLSB3aGF0IGFuIG9taXR0ZWQgYGluZGV4YCBiZWNvbWVzIHdoZW4gbm8gZGVmYXVsdCBpc1xuICAgKiBjb25maWd1cmVkIC0gcmVhY2hlcyB0aGUgU0RLIGFzIGFuIGVtcHR5IGBpbmRleF9uYW1lYCwgd2hpY2ggYnVpbGRzIGFcbiAgICogVVJMIHdpdGggdGhlIG5hbWUgc2VnbWVudCBtaXNzaW5nIGFuZCBjb21lcyBiYWNrIGFzIGEgY29uZnVzaW5nXG4gICAqIGBFTkRQT0lOVF9OT1RfRk9VTkRgIGluc3RlYWQgb2YgbmFtaW5nIHRoZSByZWFsIHByb2JsZW0uXG4gICAqL1xuICBwcml2YXRlIHJlcXVpcmVJbmRleE5hbWUocmVmZXJlbmNlOiBzdHJpbmcsIG9wZXJhdGlvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBuYW1lID0gc3RyaW5nLnRyaW1Ub051bGwocmVzb2x2ZUluZGV4TmFtZSh0aGlzLmNvbmZpZywgcmVmZXJlbmNlKSA/PyByZWZlcmVuY2UpO1xuICAgIGlmIChuYW1lID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXhlY3V0aW9uRXJyb3IoXG4gICAgICAgIGBzZWFyY2g6IG5vIGluZGV4IGNvbmZpZ3VyZWQ7IHNldCBhIGRlZmF1bHQgaW5kZXggb3IgcGFzcyBvbmUgdG8gJHtvcGVyYXRpb259YCxcbiAgICAgICAgeyBjb250ZXh0OiB7IG9wZXJhdGlvbiB9IH0sXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gbmFtZTtcbiAgfVxuXG4gIC8qKiBGZXRjaCBhbiBpbmRleCdzIGxpdmUgZGVmaW5pdGlvbi4gKi9cbiAgYXN5bmMgZ2V0SW5kZXgocmVmZXJlbmNlOiBzdHJpbmcsIHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTxJbmRleEluZm8+IHtcbiAgICBjb25zdCBuYW1lID0gdGhpcy5yZXF1aXJlSW5kZXhOYW1lKHJlZmVyZW5jZSwgXCJnZXRJbmRleFwiKTtcbiAgICBjb25zdCBpbmRleCA9IGF3YWl0IHRoaXMud2l0aENsaWVudChcImdldEluZGV4XCIsIHNpZ25hbCwgKGNsaWVudCwgY29udGV4dCkgPT5cbiAgICAgIGNsaWVudC52ZWN0b3JTZWFyY2hJbmRleGVzLmdldEluZGV4KHsgaW5kZXhfbmFtZTogbmFtZSB9LCBjb250ZXh0KSxcbiAgICApO1xuICAgIGNvbnN0IGRpcmVjdEFjY2VzcyA9IGluZGV4LmRpcmVjdF9hY2Nlc3NfaW5kZXhfc3BlYyAhPT0gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHNwZWMgPSBpbmRleC5kZWx0YV9zeW5jX2luZGV4X3NwZWMgPz8gaW5kZXguZGlyZWN0X2FjY2Vzc19pbmRleF9zcGVjO1xuICAgIC8vIERlbHRhIFN5bmMgc3VyZmFjZXMgaXRzIGVtYmVkZGluZyBzb3VyY2UgY29sdW1ucyBkaXJlY3RseTsgYSBkaXJlY3QtYWNjZXNzXG4gICAgLy8gaW5kZXggY2FycmllcyBpdHMgY29sdW1ucyBpbiBzY2hlbWFfanNvbiAobWludXMgdGhlIHZlY3RvciBjb2x1bW4pLlxuICAgIGxldCBjb2x1bW5zID0gKHNwZWM/LmVtYmVkZGluZ19zb3VyY2VfY29sdW1ucyA/PyBbXSkubWFwKChjKSA9PiBjLm5hbWUgPz8gXCJcIikuZmlsdGVyKEJvb2xlYW4pO1xuICAgIGNvbnN0IHNjaGVtYUpzb24gPSBpbmRleC5kaXJlY3RfYWNjZXNzX2luZGV4X3NwZWM/LnNjaGVtYV9qc29uO1xuICAgIGlmIChkaXJlY3RBY2Nlc3MgJiYgc2NoZW1hSnNvbikge1xuICAgICAgY29uc3Qgc2NoZW1hID0ganNvbi5wYXJzZVJlY29yZChzY2hlbWFKc29uKSA/PyB7fTtcbiAgICAgIGNvbnN0IHZlY3Rvck5hbWVzID0gbmV3IFNldChcbiAgICAgICAgKGluZGV4LmRpcmVjdF9hY2Nlc3NfaW5kZXhfc3BlYz8uZW1iZWRkaW5nX3ZlY3Rvcl9jb2x1bW5zID8/IFtdKVxuICAgICAgICAgIC5tYXAoKGMpID0+IGMubmFtZSlcbiAgICAgICAgICAuZmlsdGVyKChuKTogbiBpcyBzdHJpbmcgPT4gQm9vbGVhbihuKSksXG4gICAgICApO1xuICAgICAgY29sdW1ucyA9IE9iamVjdC5rZXlzKHNjaGVtYSkuZmlsdGVyKChjKSA9PiAhdmVjdG9yTmFtZXMuaGFzKGMpKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IGluZGV4Lm5hbWUgPz8gbmFtZSxcbiAgICAgIC4uLihpbmRleC5lbmRwb2ludF9uYW1lID8geyBlbmRwb2ludDogaW5kZXguZW5kcG9pbnRfbmFtZSB9IDoge30pLFxuICAgICAgLi4uKGluZGV4LnByaW1hcnlfa2V5ID8geyBwcmltYXJ5S2V5OiBpbmRleC5wcmltYXJ5X2tleSB9IDoge30pLFxuICAgICAgY29sdW1ucyxcbiAgICAgIHJlYWR5OiBpbmRleC5zdGF0dXM/LnJlYWR5ID8/IGZhbHNlLFxuICAgICAgLi4uKGluZGV4LnN0YXR1cz8uaW5kZXhlZF9yb3dfY291bnQgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IHsgcm93Q291bnQ6IGluZGV4LnN0YXR1cy5pbmRleGVkX3Jvd19jb3VudCB9XG4gICAgICAgIDoge30pLFxuICAgICAgLi4uKGRpcmVjdEFjY2VzcyA/IHsgZGlyZWN0QWNjZXNzOiB0cnVlIH0gOiB7fSksXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBBZGQgb3IgdXBkYXRlIGRvY3VtZW50cyBpbiBhIGRpcmVjdC1hY2Nlc3MgaW5kZXguICovXG4gIGFzeW5jIGFkZERvY3VtZW50cyhcbiAgICByZWZlcmVuY2U6IHN0cmluZyxcbiAgICBkb2N1bWVudHM6IFNlYXJjaERvY3VtZW50W10sXG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4gICk6IFByb21pc2U8VXBzZXJ0UmVzdWx0PiB7XG4gICAgY29uc3QgbmFtZSA9IHRoaXMucmVxdWlyZUluZGV4TmFtZShyZWZlcmVuY2UsIFwiYWRkRG9jdW1lbnRzXCIpO1xuICAgIGlmICh0aGlzLmxha2ViYXNlKSB7XG4gICAgICByZXR1cm4gdGhpcy5sYWtlYmFzZS5hZGREb2N1bWVudHMoXG4gICAgICAgIG5hbWUsXG4gICAgICAgIGRvY3VtZW50cyxcbiAgICAgICAgdGhpcy5jb25maWcuZW5zdXJlT25TZXR1cD8udGV4dENvbHVtbiA/PyBcInRleHRcIixcbiAgICAgICAgc2lnbmFsLFxuICAgICAgKTtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy53aXRoQ2xpZW50KFwiYWRkRG9jdW1lbnRzXCIsIHNpZ25hbCwgKGNsaWVudCwgY29udGV4dCkgPT5cbiAgICAgIGNsaWVudC52ZWN0b3JTZWFyY2hJbmRleGVzLnVwc2VydERhdGFWZWN0b3JJbmRleChcbiAgICAgICAgeyBpbmRleF9uYW1lOiBuYW1lLCBpbnB1dHNfanNvbjogSlNPTi5zdHJpbmdpZnkoZG9jdW1lbnRzKSB9LFxuICAgICAgICBjb250ZXh0LFxuICAgICAgKSxcbiAgICApO1xuICAgIHJldHVybiB7IGluZGV4OiBuYW1lLCBjb3VudDogZG9jdW1lbnRzLmxlbmd0aCB9O1xuICB9XG5cbiAgLyoqIERlbGV0ZSBkb2N1bWVudHMgZnJvbSBhIGRpcmVjdC1hY2Nlc3MgaW5kZXggYnkgcHJpbWFyeSBrZXkuICovXG4gIGFzeW5jIGRlbGV0ZURvY3VtZW50cyhcbiAgICByZWZlcmVuY2U6IHN0cmluZyxcbiAgICBpZHM6IEFycmF5PHN0cmluZyB8IG51bWJlcj4sXG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4gICk6IFByb21pc2U8VXBzZXJ0UmVzdWx0PiB7XG4gICAgY29uc3QgbmFtZSA9IHRoaXMucmVxdWlyZUluZGV4TmFtZShyZWZlcmVuY2UsIFwiZGVsZXRlRG9jdW1lbnRzXCIpO1xuICAgIGlmICh0aGlzLmxha2ViYXNlKSB7XG4gICAgICByZXR1cm4gdGhpcy5sYWtlYmFzZS5kZWxldGVEb2N1bWVudHMobmFtZSwgaWRzLCBzaWduYWwpO1xuICAgIH1cbiAgICBhd2FpdCB0aGlzLndpdGhDbGllbnQoXCJkZWxldGVEb2N1bWVudHNcIiwgc2lnbmFsLCAoY2xpZW50LCBjb250ZXh0KSA9PlxuICAgICAgY2xpZW50LnZlY3RvclNlYXJjaEluZGV4ZXMuZGVsZXRlRGF0YVZlY3RvckluZGV4KFxuICAgICAgICB7IGluZGV4X25hbWU6IG5hbWUsIHByaW1hcnlfa2V5czogaWRzLm1hcChTdHJpbmcpIH0sXG4gICAgICAgIGNvbnRleHQsXG4gICAgICApLFxuICAgICk7XG4gICAgcmV0dXJuIHsgaW5kZXg6IG5hbWUsIGNvdW50OiBpZHMubGVuZ3RoIH07XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSBhbiBlbWJlZGRpbmcgZW5kcG9pbnQgaWQgZm9yIGNyZWF0aW5nIGEgRGVsdGEgU3luYyBpbmRleC4gUmV1c2VzXG4gICAqIHRoZSBtb2RlbCByZXNvbHZlcjogYSBjb25maWd1cmVkIC8gcGFzc2VkIG5hbWUgaXMgZnV6enktbWF0Y2hlZCBhZ2FpbnN0IHRoZVxuICAgKiBsaXZlIGNhdGFsb2d1ZSwgb3RoZXJ3aXNlIHRoZSBoaWdoZXN0LXJhbmtlZCBlbWJlZGRpbmcgZW5kcG9pbnQgaXMgY2hvc2VuLlxuICAgKi9cbiAgYXN5bmMgcmVzb2x2ZUVtYmVkZGluZ01vZGVsKHJlcXVlc3RlZD86IHN0cmluZywgc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcbiAgICBjb25zdCBleHBsaWNpdCA9IHN0cmluZy50cmltVG9OdWxsKHJlcXVlc3RlZCA/PyB0aGlzLmNvbmZpZy5lbWJlZGRpbmdNb2RlbCk7XG4gICAgLy8gQW4gZXhwbGljaXQgbmFtZSB0aGF0IGFscmVhZHkgbG9va3MgbGlrZSBhbiBlbmRwb2ludCBpZCAobm8gd2hpdGVzcGFjZSlcbiAgICAvLyBpcyB1c2VkIHZlcmJhdGltIC0gbm8gbmVlZCB0byBmZXRjaCBhbmQgZnV6enktbWF0Y2ggdGhlIGxpdmUgY2F0YWxvZ3VlLlxuICAgIC8vIEEgZ2VudWluZWx5IGxvb3NlIG5hbWUgKGUuZy4gXCJndGUgbGFyZ2VcIikgc3RpbGwgcmVzb2x2ZXMgYWdhaW5zdCBpdC5cbiAgICBpZiAoZXhwbGljaXQgJiYgIS9cXHMvLnRlc3QoZXhwbGljaXQpKSByZXR1cm4gZXhwbGljaXQ7XG4gICAgcmV0dXJuIHRoaXMud2l0aENsaWVudChcInJlc29sdmVFbWJlZGRpbmdNb2RlbFwiLCBzaWduYWwsIGFzeW5jIChjbGllbnQpID0+IHtcbiAgICAgIGNvbnN0IGhvc3QgPSAoYXdhaXQgY2xpZW50LmNvbmZpZy5nZXRIb3N0KCkpLnRvU3RyaW5nKCk7XG4gICAgICBjb25zdCBlbmRwb2ludHMgPSBhd2FpdCBzZXJ2aW5nLmxpc3RTZXJ2aW5nRW5kcG9pbnRzKGNsaWVudCwgaG9zdCk7XG4gICAgICBjb25zdCB7IG1vZGVsSWQgfSA9IG1vZGVsUmVzb2x2ZS5yZXNvbHZlTW9kZWwoZW5kcG9pbnRzLCB7XG4gICAgICAgIC4uLihleHBsaWNpdCA/IHsgZXhwbGljaXQgfSA6IHsgbW9kZWxDbGFzczogTW9kZWxDbGFzcy5FbWJlZGRpbmcgfSksXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBzdHJpbmcudHJpbVRvTnVsbChtb2RlbElkKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbWJlZCB0ZXh0IHZpYSBhIERhdGFicmlja3MgZW1iZWRkaW5nIHNlcnZpbmcgZW5kcG9pbnQsIHJldHVybmluZyBvbmVcbiAgICogdmVjdG9yIHBlciBpbnB1dC4gVXNlZCB0byBzZWVkIGEgZGlyZWN0LWFjY2VzcyBpbmRleCBhbmQgdG8gdHVybiBhIHNlYXJjaFxuICAgKiBxdWVyeSBpbnRvIGEgcXVlcnkgdmVjdG9yIC0gRGF0YWJyaWNrcyBvbmx5IG1hbmFnZXMgZW1iZWRkaW5ncyBmb3IgRGVsdGFcbiAgICogU3luYyBpbmRleGVzLCBzbyBhIGRpcmVjdC1hY2Nlc3MgaW5kZXggKG5vIERlbHRhIHRhYmxlLCBubyB3YXJlaG91c2UpIG5lZWRzXG4gICAqIHRoZSBjbGllbnQgdG8gZW1iZWQgb24gd3JpdGUgYW5kIG9uIHF1ZXJ5LiBUaGUgZW5kcG9pbnQgaXMgcmVzb2x2ZWQgdGhlXG4gICAqIHNhbWUgd2F5IGFzIGZvciBpbmRleCBjcmVhdGlvbiB3aGVuIG5vdCBuYW1lZC5cbiAgICovXG4gIGFzeW5jIGVtYmVkKHRleHRzOiBzdHJpbmdbXSwgbW9kZWw/OiBzdHJpbmcsIHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTxudW1iZXJbXVtdPiB7XG4gICAgaWYgKHRleHRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IGVuZHBvaW50ID0gYXdhaXQgdGhpcy5yZXNvbHZlRW1iZWRkaW5nTW9kZWwobW9kZWwsIHNpZ25hbCk7XG4gICAgaWYgKCFlbmRwb2ludCkge1xuICAgICAgdGhyb3cgbmV3IEV4ZWN1dGlvbkVycm9yKFwic2VhcmNoOiBjb3VsZCBub3QgcmVzb2x2ZSBhbiBlbWJlZGRpbmcgbW9kZWwgdG8gZW1iZWQgdGV4dFwiLCB7XG4gICAgICAgIGNvbnRleHQ6IHsgb3BlcmF0aW9uOiBcImVtYmVkXCIgfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy53aXRoQ2xpZW50KFwiZW1iZWRcIiwgc2lnbmFsLCBhc3luYyAoY2xpZW50KSA9PiB7XG4gICAgICBjb25zdCBob3N0ID0gKGF3YWl0IGNsaWVudC5jb25maWcuZ2V0SG9zdCgpKS50b1N0cmluZygpO1xuICAgICAgY29uc3QgdXJsID0gaW52b2tlLmludm9jYXRpb25zVXJsKGhvc3QsIGVuZHBvaW50KTtcbiAgICAgIGNvbnN0IGhlYWRlcnMgPSBhd2FpdCBpbnZva2UuYXV0aEhlYWRlcnMoY2xpZW50KTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgIGhlYWRlcnM6IHsgLi4uaGVhZGVycywgXCJjb250ZW50LXR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBpbnB1dDogdGV4dHMgfSksXG4gICAgICAgIC4uLihzaWduYWwgPyB7IHNpZ25hbCB9IDoge30pLFxuICAgICAgfSk7XG4gICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgIHRocm93IG5ldyBFeGVjdXRpb25FcnJvcihcbiAgICAgICAgICBgc2VhcmNoOiBlbWJlZGRpbmcgZW5kcG9pbnQgJHtlbmRwb2ludH0gZmFpbGVkICgke3Jlc3BvbnNlLnN0YXR1c30pYCxcbiAgICAgICAgICB7IGNvbnRleHQ6IHsgb3BlcmF0aW9uOiBcImVtYmVkXCIgfSB9LFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY29uc3QgYm9keSA9IChhd2FpdCByZXNwb25zZS5qc29uKCkpIGFzIHsgZGF0YT86IEFycmF5PHsgZW1iZWRkaW5nOiBudW1iZXJbXSB9PiB9O1xuICAgICAgY29uc3QgdmVjdG9ycyA9IChib2R5LmRhdGEgPz8gW10pLm1hcCgocm93KSA9PiByb3cuZW1iZWRkaW5nKTtcbiAgICAgIGlmICh2ZWN0b3JzLmxlbmd0aCAhPT0gdGV4dHMubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IG5ldyBFeGVjdXRpb25FcnJvcihcInNlYXJjaDogZW1iZWRkaW5nIHJlc3BvbnNlIGRpZCBub3QgbWF0Y2ggdGhlIGlucHV0IGNvdW50XCIsIHtcbiAgICAgICAgICBjb250ZXh0OiB7IG9wZXJhdGlvbjogXCJlbWJlZFwiIH0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZlY3RvcnM7XG4gICAgfSk7XG4gIH1cblxuICAvKiogVGhlIHZlY3RvciBkaW1lbnNpb24gYSBtb2RlbCBwcm9kdWNlcyAoZW1iZWRzIGEgcHJvYmUgc3RyaW5nIG9uY2UpLiAqL1xuICBwcml2YXRlIGFzeW5jIGVtYmVkZGluZ0RpbWVuc2lvbihtb2RlbD86IHN0cmluZywgc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IFt2ZWN0b3JdID0gYXdhaXQgdGhpcy5lbWJlZChbXCJkaW1lbnNpb24gcHJvYmVcIl0sIG1vZGVsLCBzaWduYWwpO1xuICAgIGlmICghdmVjdG9yIHx8IHZlY3Rvci5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFeGVjdXRpb25FcnJvcihcInNlYXJjaDogY291bGQgbm90IGRldGVybWluZSB0aGUgZW1iZWRkaW5nIGRpbWVuc2lvblwiLCB7XG4gICAgICAgIGNvbnRleHQ6IHsgb3BlcmF0aW9uOiBcImNyZWF0ZUluZGV4XCIgfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdmVjdG9yLmxlbmd0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gQUkgU2VhcmNoIGluZGV4IHdpdGggYXMgbGl0dGxlIGNlcmVtb255IGFzIHBvc3NpYmxlLiBUd28gc2hhcGVzOlxuICAgKlxuICAgKiAgIC0gKipEZWx0YSBTeW5jKiogKHRoZSBkZWZhdWx0KTogcGFzcyBgc291cmNlVGFibGVgOyBEYXRhYnJpY2tzIGNvbXB1dGVzXG4gICAqICAgICBlbWJlZGRpbmdzIGZyb20gdGhlIHRleHQgY29sdW1uIGFuZCBrZWVwcyB0aGUgaW5kZXggc3luY2VkLiBUaGVcbiAgICogICAgIGVtYmVkZGluZyBtb2RlbCBpcyByZXNvbHZlZCBhdXRvbWF0aWNhbGx5IHdoZW4gbm90IG5hbWVkLlxuICAgKiAgIC0gKipEaXJlY3QgQWNjZXNzKio6IG9taXQgYHNvdXJjZVRhYmxlYCBhbmQgcGFzcyBgZW1iZWRkaW5nRGltZW5zaW9uYDtcbiAgICogICAgIHlvdSB3cml0ZSB2ZWN0b3JzIHlvdXJzZWxmIHZpYSB7QGxpbmsgYWRkRG9jdW1lbnRzfS5cbiAgICpcbiAgICogRXZlcnl0aGluZyBlbHNlIGluZmVyczogdGhlIGVuZHBvaW50IGZyb20gdGhlIHBsdWdpbiBjb25maWcsIHRoZSBwcmltYXJ5XG4gICAqIGtleSAoYGlkYCksIHRoZSB0ZXh0IGNvbHVtbiAoYHRleHRgIC8gYGNvbnRlbnRgIC8gYGJvZHlgKSwgYW5kIHRoZSB2ZWN0b3JcbiAgICogY29sdW1uIChgZW1iZWRkaW5nYCkuIFJldHVybnMgdGhlIGNyZWF0ZWQgaW5kZXgncyB7QGxpbmsgSW5kZXhJbmZvfS5cbiAgICovXG4gIGFzeW5jIGNyZWF0ZUluZGV4KG5hbWU6IHN0cmluZywgb3B0aW9uczogQ3JlYXRlSW5kZXhPcHRpb25zID0ge30pOiBQcm9taXNlPEluZGV4SW5mbz4ge1xuICAgIGNvbnN0IGVuZHBvaW50ID0gb3B0aW9ucy5lbmRwb2ludCA/PyB0aGlzLmNvbmZpZy5lbmRwb2ludDtcbiAgICBpZiAoIWVuZHBvaW50KSB7XG4gICAgICB0aHJvdyBuZXcgRXhlY3V0aW9uRXJyb3IoXG4gICAgICAgIFwic2VhcmNoOiBubyBWZWN0b3IgU2VhcmNoIGVuZHBvaW50IGNvbmZpZ3VyZWQ7IHBhc3MgYGVuZHBvaW50YCBvciBzZXQgaXQgb24gdGhlIHBsdWdpblwiLFxuICAgICAgICB7IGNvbnRleHQ6IHsgb3BlcmF0aW9uOiBcImNyZWF0ZUluZGV4XCIgfSB9LFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgcHJpbWFyeUtleSA9IG9wdGlvbnMucHJpbWFyeUtleSA/PyBcImlkXCI7XG4gICAgY29uc3QgZGlyZWN0ID0gIW9wdGlvbnMuc291cmNlVGFibGU7XG4gICAgY29uc3Qgc291cmNlQ29sdW1uID0gb3B0aW9ucy5lbWJlZGRpbmdTb3VyY2VDb2x1bW4gPz8gXCJ0ZXh0XCI7XG4gICAgY29uc3QgdmVjdG9yQ29sdW1uID0gb3B0aW9ucy5lbWJlZGRpbmdWZWN0b3JDb2x1bW4gPz8gXCJlbWJlZGRpbmdcIjtcblxuICAgIC8vIERlbHRhIFN5bmMgbGV0cyBEYXRhYnJpY2tzIGVtYmVkIGEgc291cmNlIGNvbHVtbiwgc28gaXQgbmVlZHMgYW4gZW1iZWRkaW5nXG4gICAgLy8gbW9kZWwuIEEgZGlyZWN0LWFjY2VzcyBpbmRleCBzdG9yZXMgdmVjdG9ycyBZT1Ugc3VwcGx5IChEYXRhYnJpY2tzIG9ubHlcbiAgICAvLyBzdXBwb3J0cyBtYW5hZ2VkIGVtYmVkZGluZ3Mgb24gRGVsdGEgU3luYyksIHNvIGl0IG5lZWRzIGEgZGltZW5zaW9uOyB3ZVxuICAgIC8vIHJlc29sdmUgb25lIGZyb20gdGhlIGVtYmVkZGluZyBtb2RlbCB3aGVuIG5vdCBnaXZlbiBzbyBhIGRpcmVjdC1hY2Nlc3NcbiAgICAvLyBpbmRleCBzdGlsbCB3b3JrcyB3aXRoIHplcm8gZXh0cmEgY29uZmlnIChlbWJlZCB2aWEgYGVtYmVkKClgIG9uIHNlZWQgK1xuICAgIC8vIHF1ZXJ5IC0gc2VlIGBwcm92aXNpb25gIC8gYHNlYXJjaGApLlxuICAgIGNvbnN0IGVtYmVkZGluZ01vZGVsID1cbiAgICAgIChhd2FpdCB0aGlzLnJlc29sdmVFbWJlZGRpbmdNb2RlbChvcHRpb25zLmVtYmVkZGluZ01vZGVsLCBvcHRpb25zLnNpZ25hbCkpID8/IHVuZGVmaW5lZDtcbiAgICBpZiAoIWVtYmVkZGluZ01vZGVsKSB7XG4gICAgICB0aHJvdyBuZXcgRXhlY3V0aW9uRXJyb3IoXG4gICAgICAgIFwic2VhcmNoOiBjb3VsZCBub3QgcmVzb2x2ZSBhbiBlbWJlZGRpbmcgbW9kZWw7IHBhc3MgYGVtYmVkZGluZ01vZGVsYFwiLFxuICAgICAgICB7IGNvbnRleHQ6IHsgb3BlcmF0aW9uOiBcImNyZWF0ZUluZGV4XCIgfSB9LFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgZGltZW5zaW9uID1cbiAgICAgIG9wdGlvbnMuZW1iZWRkaW5nRGltZW5zaW9uID8/IChhd2FpdCB0aGlzLmVtYmVkZGluZ0RpbWVuc2lvbihlbWJlZGRpbmdNb2RlbCwgb3B0aW9ucy5zaWduYWwpKTtcblxuICAgIGNvbnN0IHNjaGVtYSA9IHtcbiAgICAgIFtwcmltYXJ5S2V5XTogXCJzdHJpbmdcIixcbiAgICAgIFtzb3VyY2VDb2x1bW5dOiBcInN0cmluZ1wiLFxuICAgICAgLi4uKG9wdGlvbnMuc2NoZW1hID8/IHt9KSxcbiAgICB9O1xuXG4gICAgY29uc3QgZGlyZWN0U3BlYyA9IHtcbiAgICAgIGRpcmVjdF9hY2Nlc3NfaW5kZXhfc3BlYzoge1xuICAgICAgICBlbWJlZGRpbmdfdmVjdG9yX2NvbHVtbnM6IFt7IG5hbWU6IHZlY3RvckNvbHVtbiwgZW1iZWRkaW5nX2RpbWVuc2lvbjogZGltZW5zaW9uIH1dLFxuICAgICAgICBzY2hlbWFfanNvbjogSlNPTi5zdHJpbmdpZnkoeyAuLi5zY2hlbWEsIFt2ZWN0b3JDb2x1bW5dOiBgYXJyYXk8ZmxvYXQ+YCB9KSxcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIGF3YWl0IHRoaXMud2l0aENsaWVudChcImNyZWF0ZUluZGV4XCIsIG9wdGlvbnMuc2lnbmFsLCAoY2xpZW50LCBjb250ZXh0KSA9PlxuICAgICAgY2xpZW50LnZlY3RvclNlYXJjaEluZGV4ZXMuY3JlYXRlSW5kZXgoXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lLFxuICAgICAgICAgIGVuZHBvaW50X25hbWU6IGVuZHBvaW50LFxuICAgICAgICAgIHByaW1hcnlfa2V5OiBwcmltYXJ5S2V5LFxuICAgICAgICAgIGluZGV4X3R5cGU6IGRpcmVjdCA/IFwiRElSRUNUX0FDQ0VTU1wiIDogXCJERUxUQV9TWU5DXCIsXG4gICAgICAgICAgLi4uKGRpcmVjdFxuICAgICAgICAgICAgPyBkaXJlY3RTcGVjXG4gICAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgICBkZWx0YV9zeW5jX2luZGV4X3NwZWM6IHtcbiAgICAgICAgICAgICAgICAgIHNvdXJjZV90YWJsZTogb3B0aW9ucy5zb3VyY2VUYWJsZSxcbiAgICAgICAgICAgICAgICAgIHBpcGVsaW5lX3R5cGU6IG9wdGlvbnMucGlwZWxpbmVUeXBlID8/IFwiVFJJR0dFUkVEXCIsXG4gICAgICAgICAgICAgICAgICBlbWJlZGRpbmdfc291cmNlX2NvbHVtbnM6IFtcbiAgICAgICAgICAgICAgICAgICAgeyBuYW1lOiBzb3VyY2VDb2x1bW4sIGVtYmVkZGluZ19tb2RlbF9lbmRwb2ludF9uYW1lOiBlbWJlZGRpbmdNb2RlbCB9LFxuICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgIC4uLihvcHRpb25zLmNvbHVtbnNUb1N5bmMgJiYgb3B0aW9ucy5jb2x1bW5zVG9TeW5jLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICAgICAgPyB7IGNvbHVtbnNfdG9fc3luYzogb3B0aW9ucy5jb2x1bW5zVG9TeW5jIH1cbiAgICAgICAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgIH0sXG4gICAgICAgIGNvbnRleHQsXG4gICAgICApLFxuICAgICk7XG4gICAgbG9nZ2VyLmluZm8oXCJpbmRleC1jcmVhdGVkXCIsIHtcbiAgICAgIGluZGV4OiBuYW1lLFxuICAgICAgZW5kcG9pbnQsXG4gICAgICB0eXBlOiBkaXJlY3QgPyBcIkRJUkVDVF9BQ0NFU1NcIiA6IFwiREVMVEFfU1lOQ1wiLFxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzLmdldEluZGV4KG5hbWUsIG9wdGlvbnMuc2lnbmFsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgdGhlIGluZGV4IGlmIGl0IGRvZXMgbm90IGFscmVhZHkgZXhpc3QsIG90aGVyd2lzZSByZXR1cm4gdGhlXG4gICAqIGV4aXN0aW5nIG9uZS4gSWRlbXBvdGVudCAtIHNhZmUgdG8gY2FsbCBvbiBldmVyeSBib290IHRvIGd1YXJhbnRlZSBhblxuICAgKiBpbmRleCBpcyBwcmVzZW50LlxuICAgKi9cbiAgYXN5bmMgZW5zdXJlSW5kZXgobmFtZTogc3RyaW5nLCBvcHRpb25zOiBDcmVhdGVJbmRleE9wdGlvbnMgPSB7fSk6IFByb21pc2U8SW5kZXhJbmZvPiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmdldEluZGV4KG5hbWUsIG9wdGlvbnMuc2lnbmFsKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB0aGlzLmNyZWF0ZUluZGV4KG5hbWUsIG9wdGlvbnMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFbnN1cmUgYW4gaW5kZXggZXhpc3RzLCBpcyBvbmxpbmUsIGFuZCAob3B0aW9uYWxseSkgaG9sZHMgc2VlZCBkYXRhIC0gdGhlXG4gICAqIFwid2lyZSB1cCBhIHJlYWwgaW5kZXggb24gYm9vdFwiIHBhdGguIElkZW1wb3RlbnQgYW5kIGNoZWFwIHRvIGNhbGwgZXZlcnlcbiAgICogYm9vdDogaXQgY3JlYXRlcyB0aGUgZW5kcG9pbnQgYW5kIGluZGV4IG9ubHkgaWYgbWlzc2luZywgd2FpdHMgZm9yIHRoZW0gdG9cbiAgICogY29tZSBvbmxpbmUsIGFuZCBzZWVkcyBkb2N1bWVudHMgT05MWSB3aGVuIHRoZSBpbmRleCBpcyBzdGlsbCBlbXB0eS5cbiAgICpcbiAgICogRm9yIHRoZSBkZW1vL2R1bW15LWRhdGEgY2FzZSB0aGlzIG5lZWRzIG5vIERlbHRhIHRhYmxlIGFuZCBubyB3YXJlaG91c2U6XG4gICAqIHRoZSBkZWZhdWx0IGlzIGEgTUFOQUdFRCBkaXJlY3QtYWNjZXNzIGluZGV4IChEYXRhYnJpY2tzIGVtYmVkcyB0aGUgYHRleHRgXG4gICAqIGNvbHVtbiBvbiB3cml0ZSBhbmQgcXVlcnkpLCBzbyBzZWVkaW5nIGlzIGp1c3QgYW4gYGFkZERvY3VtZW50c2Agb2YgcGxhaW5cbiAgICogcm93cyBhbmQgc2VhcmNoLWJ5LXRleHQgd29ya3MgaW1tZWRpYXRlbHkuXG4gICAqL1xuICBhc3luYyBwcm92aXNpb24obmFtZTogc3RyaW5nLCBvcHRpb25zOiBQcm92aXNpb25PcHRpb25zID0ge30pOiBQcm9taXNlPEluZGV4SW5mbz4ge1xuICAgIGlmICh0aGlzLmxha2ViYXNlKSB7XG4gICAgICAvLyBMYWtlYmFzZSBmYWxsYmFjazogbm8gZW5kcG9pbnQsIG5vIGVtYmVkZGluZ3MsIG5vIHZlY3RvcnMgLSBqdXN0IGFcbiAgICAgIC8vIFBvc3RncmVzIGZ1bGwtdGV4dCB0YWJsZS4gUmV0dXJucyBhbiBJbmRleEluZm8tc2hhcGVkIHJlc3VsdCBzbyB0aGVcbiAgICAgIC8vIGNhbGxlcidzIGxvZ2dpbmcgKyByZWFkaW5lc3MgaGFuZGxpbmcgaXMgaWRlbnRpY2FsIHRvIFZlY3RvciBTZWFyY2guXG4gICAgICBjb25zdCByb3dDb3VudCA9IGF3YWl0IHRoaXMubGFrZWJhc2UucHJvdmlzaW9uKG5hbWUsIHtcbiAgICAgICAgdGV4dENvbHVtbjogb3B0aW9ucy5lbWJlZGRpbmdTb3VyY2VDb2x1bW4gPz8gXCJ0ZXh0XCIsXG4gICAgICAgIC4uLihvcHRpb25zLnNlZWQgPyB7IHNlZWQ6IG9wdGlvbnMuc2VlZCB9IDoge30pLFxuICAgICAgICAuLi4ob3B0aW9ucy5zaWduYWwgPyB7IHNpZ25hbDogb3B0aW9ucy5zaWduYWwgfSA6IHt9KSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZSxcbiAgICAgICAgcHJpbWFyeUtleTogb3B0aW9ucy5wcmltYXJ5S2V5ID8/IFwiaWRcIixcbiAgICAgICAgY29sdW1uczogW10sXG4gICAgICAgIHJlYWR5OiB0cnVlLFxuICAgICAgICByb3dDb3VudCxcbiAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IHdhaXQgPSBvcHRpb25zLndhaXQgPz8gdHJ1ZTtcbiAgICBjb25zdCB0aW1lb3V0TXMgPSBvcHRpb25zLnRpbWVvdXRNcyA/PyAyMCAqIDYwICogMTAwMDtcbiAgICBjb25zdCBlbmRwb2ludCA9IG9wdGlvbnMuZW5kcG9pbnQgPz8gdGhpcy5jb25maWcuZW5kcG9pbnQ7XG4gICAgaWYgKGVuZHBvaW50KSBhd2FpdCB0aGlzLmVuc3VyZUVuZHBvaW50KGVuZHBvaW50LCB7IHdhaXQsIHNpZ25hbDogb3B0aW9ucy5zaWduYWwgfSk7XG5cbiAgICBjb25zdCB7IHNlZWQ6IF9zZWVkLCB3YWl0OiBfd2FpdCwgdGltZW91dE1zOiBfdGltZW91dE1zLCAuLi5jcmVhdGVPcHRpb25zIH0gPSBvcHRpb25zO1xuICAgIGxldCBpbmZvID0gYXdhaXQgdGhpcy5lbnN1cmVJbmRleChuYW1lLCBjcmVhdGVPcHRpb25zKTtcblxuICAgIGlmICh3YWl0ICYmICFpbmZvLnJlYWR5KSBpbmZvID0gYXdhaXQgdGhpcy53YWl0Rm9ySW5kZXhSZWFkeShuYW1lLCB0aW1lb3V0TXMsIG9wdGlvbnMuc2lnbmFsKTtcblxuICAgIGNvbnN0IHNlZWQgPSBvcHRpb25zLnNlZWQgPz8gW107XG4gICAgaWYgKHNlZWQubGVuZ3RoID4gMCAmJiAoaW5mby5yb3dDb3VudCA/PyAwKSA9PT0gMCkge1xuICAgICAgY29uc3Qgc291cmNlQ29sdW1uID0gb3B0aW9ucy5lbWJlZGRpbmdTb3VyY2VDb2x1bW4gPz8gXCJ0ZXh0XCI7XG4gICAgICBjb25zdCB2ZWN0b3JDb2x1bW4gPSBvcHRpb25zLmVtYmVkZGluZ1ZlY3RvckNvbHVtbiA/PyBcImVtYmVkZGluZ1wiO1xuICAgICAgLy8gRGlyZWN0LWFjY2VzcyBpbmRleGVzIHN0b3JlIHZlY3RvcnMgd2Ugc3VwcGx5LCBzbyBlbWJlZCB0aGUgdGV4dCBjb2x1bW5cbiAgICAgIC8vIGZvciBhbnkgc2VlZCByb3cgdGhhdCBkaWQgbm90IGFscmVhZHkgY2FycnkgYSB2ZWN0b3IuXG4gICAgICBjb25zdCBuZWVkRW1iZWQgPSBzZWVkLnNvbWUoKGRvYykgPT4gZG9jW3ZlY3RvckNvbHVtbl0gPT09IHVuZGVmaW5lZCk7XG4gICAgICBsZXQgcm93cyA9IHNlZWQ7XG4gICAgICBpZiAobmVlZEVtYmVkKSB7XG4gICAgICAgIGNvbnN0IHRleHRzID0gc2VlZC5tYXAoKGRvYykgPT4gc3RyaW5nLnRyaW1Ub0VtcHR5KFN0cmluZyhkb2Nbc291cmNlQ29sdW1uXSA/PyBcIlwiKSkpO1xuICAgICAgICBjb25zdCB2ZWN0b3JzID0gYXdhaXQgdGhpcy5lbWJlZCh0ZXh0cywgb3B0aW9ucy5lbWJlZGRpbmdNb2RlbCwgb3B0aW9ucy5zaWduYWwpO1xuICAgICAgICByb3dzID0gc2VlZC5tYXAoKGRvYywgaSkgPT5cbiAgICAgICAgICBkb2NbdmVjdG9yQ29sdW1uXSA9PT0gdW5kZWZpbmVkID8geyAuLi5kb2MsIFt2ZWN0b3JDb2x1bW5dOiB2ZWN0b3JzW2ldIH0gOiBkb2MsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBhd2FpdCB0aGlzLmFkZERvY3VtZW50cyhuYW1lLCByb3dzLCBvcHRpb25zLnNpZ25hbCk7XG4gICAgICBsb2dnZXIuaW5mbyhcImluZGV4LXNlZWRlZFwiLCB7IGluZGV4OiBuYW1lLCBjb3VudDogcm93cy5sZW5ndGggfSk7XG4gICAgICBpbmZvID0gYXdhaXQgdGhpcy5nZXRJbmRleChuYW1lLCBvcHRpb25zLnNpZ25hbCk7XG4gICAgfVxuICAgIHJldHVybiBpbmZvO1xuICB9XG5cbiAgLyoqIFBvbGwgYW4gaW5kZXggdW50aWwgaXQgcmVwb3J0cyByZWFkeSwgb3IgdGhyb3cgYWZ0ZXIge0BsaW5rIHRpbWVvdXRNc30uICovXG4gIHByaXZhdGUgYXN5bmMgd2FpdEZvckluZGV4UmVhZHkoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHRpbWVvdXRNczogbnVtYmVyLFxuICAgIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuICApOiBQcm9taXNlPEluZGV4SW5mbz4ge1xuICAgIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIHRpbWVvdXRNcztcbiAgICBsZXQgaW5mbyA9IGF3YWl0IHRoaXMuZ2V0SW5kZXgobmFtZSwgc2lnbmFsKTtcbiAgICB3aGlsZSAoIWluZm8ucmVhZHkpIHtcbiAgICAgIGlmIChEYXRlLm5vdygpID4gZGVhZGxpbmUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEV4ZWN1dGlvbkVycm9yKGBzZWFyY2g6IGluZGV4ICR7bmFtZX0gZGlkIG5vdCBjb21lIG9ubGluZSBpbiB0aW1lYCwge1xuICAgICAgICAgIGNvbnRleHQ6IHsgb3BlcmF0aW9uOiBcInByb3Zpc2lvblwiIH0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgYXdhaXQgc2hhcmVkQXN5bmMuc2xlZXAoNTAwMCwgc2lnbmFsKTtcbiAgICAgIGluZm8gPSBhd2FpdCB0aGlzLmdldEluZGV4KG5hbWUsIHNpZ25hbCk7XG4gICAgfVxuICAgIHJldHVybiBpbmZvO1xuICB9XG5cbiAgLyoqIFRyaWdnZXIgYSBzeW5jIG9mIGEgRGVsdGEgU3luYyBpbmRleCBmcm9tIGl0cyBzb3VyY2UgdGFibGUuICovXG4gIGFzeW5jIHN5bmNJbmRleChyZWZlcmVuY2U6IHN0cmluZywgc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBuYW1lID0gdGhpcy5yZXF1aXJlSW5kZXhOYW1lKHJlZmVyZW5jZSwgXCJzeW5jSW5kZXhcIik7XG4gICAgYXdhaXQgdGhpcy53aXRoQ2xpZW50KFwic3luY0luZGV4XCIsIHNpZ25hbCwgKGNsaWVudCwgY29udGV4dCkgPT5cbiAgICAgIGNsaWVudC52ZWN0b3JTZWFyY2hJbmRleGVzLnN5bmNJbmRleCh7IGluZGV4X25hbWU6IG5hbWUgfSwgY29udGV4dCksXG4gICAgKTtcbiAgICBsb2dnZXIuaW5mbyhcImluZGV4LXN5bmNlZFwiLCB7IGluZGV4OiBuYW1lIH0pO1xuICB9XG5cbiAgLyoqIERlbGV0ZSBhbiBpbmRleC4gKi9cbiAgYXN5bmMgZGVsZXRlSW5kZXgocmVmZXJlbmNlOiBzdHJpbmcsIHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbmFtZSA9IHRoaXMucmVxdWlyZUluZGV4TmFtZShyZWZlcmVuY2UsIFwiZGVsZXRlSW5kZXhcIik7XG4gICAgYXdhaXQgdGhpcy53aXRoQ2xpZW50KFwiZGVsZXRlSW5kZXhcIiwgc2lnbmFsLCAoY2xpZW50LCBjb250ZXh0KSA9PlxuICAgICAgY2xpZW50LnZlY3RvclNlYXJjaEluZGV4ZXMuZGVsZXRlSW5kZXgoeyBpbmRleF9uYW1lOiBuYW1lIH0sIGNvbnRleHQpLFxuICAgICk7XG4gICAgbG9nZ2VyLmluZm8oXCJpbmRleC1kZWxldGVkXCIsIHsgaW5kZXg6IG5hbWUgfSk7XG4gIH1cblxuICAvKiogTGlzdCB0aGUgaW5kZXhlcyBob3N0ZWQgb24gYSBWZWN0b3IgU2VhcmNoIGVuZHBvaW50IChuYW1lICsgdHlwZSBvbmx5KS4gKi9cbiAgYXN5bmMgbGlzdEluZGV4ZXMoZW5kcG9pbnQ/OiBzdHJpbmcsIHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIGNvbnN0IGVuZHBvaW50TmFtZSA9IGVuZHBvaW50ID8/IHRoaXMuY29uZmlnLmVuZHBvaW50O1xuICAgIGlmICghZW5kcG9pbnROYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXhlY3V0aW9uRXJyb3IoXCJzZWFyY2g6IG5vIGVuZHBvaW50IGNvbmZpZ3VyZWQgdG8gbGlzdCBpbmRleGVzXCIsIHtcbiAgICAgICAgY29udGV4dDogeyBvcGVyYXRpb246IFwibGlzdEluZGV4ZXNcIiB9LFxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLndpdGhDbGllbnQoXCJsaXN0SW5kZXhlc1wiLCBzaWduYWwsIGFzeW5jIChjbGllbnQsIGNvbnRleHQpID0+IHtcbiAgICAgIGNvbnN0IG5hbWVzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgZm9yIGF3YWl0IChjb25zdCBpbmRleCBvZiBjbGllbnQudmVjdG9yU2VhcmNoSW5kZXhlcy5saXN0SW5kZXhlcyhcbiAgICAgICAgeyBlbmRwb2ludF9uYW1lOiBlbmRwb2ludE5hbWUgfSxcbiAgICAgICAgY29udGV4dCxcbiAgICAgICkpIHtcbiAgICAgICAgaWYgKGluZGV4Lm5hbWUpIG5hbWVzLnB1c2goaW5kZXgubmFtZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmFtZXM7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRW5zdXJlIGEgVmVjdG9yIFNlYXJjaCBlbmRwb2ludCBleGlzdHMsIGNyZWF0aW5nIGEgYFNUQU5EQVJEYCBvbmUgd2hlbiBpdFxuICAgKiBkb2VzIG5vdC4gT3B0aW9uYWxseSB3YWl0IGZvciBpdCB0byBjb21lIG9ubGluZS4gSWRlbXBvdGVudC5cbiAgICovXG4gIGFzeW5jIGVuc3VyZUVuZHBvaW50KG5hbWU/OiBzdHJpbmcsIG9wdGlvbnM6IEVuc3VyZUVuZHBvaW50T3B0aW9ucyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZW5kcG9pbnQgPSBuYW1lID8/IHRoaXMuY29uZmlnLmVuZHBvaW50O1xuICAgIGlmICghZW5kcG9pbnQpIHtcbiAgICAgIHRocm93IG5ldyBFeGVjdXRpb25FcnJvcihcInNlYXJjaDogbm8gZW5kcG9pbnQgbmFtZSB0byBlbnN1cmVcIiwge1xuICAgICAgICBjb250ZXh0OiB7IG9wZXJhdGlvbjogXCJlbnN1cmVFbmRwb2ludFwiIH0sXG4gICAgICB9KTtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy53aXRoQ2xpZW50KFwiZW5zdXJlRW5kcG9pbnRcIiwgb3B0aW9ucy5zaWduYWwsIGFzeW5jIChjbGllbnQsIGNvbnRleHQpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGNsaWVudC52ZWN0b3JTZWFyY2hFbmRwb2ludHMuZ2V0RW5kcG9pbnQoeyBlbmRwb2ludF9uYW1lOiBlbmRwb2ludCB9LCBjb250ZXh0KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIGNvbnN0IHdhaXRlciA9IGF3YWl0IGNsaWVudC52ZWN0b3JTZWFyY2hFbmRwb2ludHMuY3JlYXRlRW5kcG9pbnQoXG4gICAgICAgICAgeyBuYW1lOiBlbmRwb2ludCwgZW5kcG9pbnRfdHlwZTogXCJTVEFOREFSRFwiIH0sXG4gICAgICAgICAgY29udGV4dCxcbiAgICAgICAgKTtcbiAgICAgICAgbG9nZ2VyLmluZm8oXCJlbmRwb2ludC1jcmVhdGVkXCIsIHsgZW5kcG9pbnQgfSk7XG4gICAgICAgIGlmIChvcHRpb25zLndhaXQpIGF3YWl0IHdhaXRlci53YWl0KCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSB0aGUgd29ya3NwYWNlIGNsaWVudCBhbmQgcnVuIG9uZSBjYWxsIHVuZGVyIGEgYm91bmRlZCB0aW1lb3V0LiBUaGVcbiAgICogY2FsbGVyJ3Mgc2lnbmFsIChpZiBhbnkpIGFuZCBhIHRpbWVvdXQgYXJlIG1lcmdlZCBpbnRvIG9uZSBTREsgYENvbnRleHRgXG4gICAqIHZpYSB7QGxpbmsgYXBwa2l0LmRhdGFicmlja3MudG9Db250ZXh0fSwgc28gZWl0aGVyIHVud2luZHMgdGhlIHJlcXVlc3QuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHdpdGhDbGllbnQ8VD4oXG4gICAgb3BlcmF0aW9uOiBzdHJpbmcsXG4gICAgc2lnbmFsOiBBYm9ydFNpZ25hbCB8IHVuZGVmaW5lZCxcbiAgICBmbjogKGNsaWVudDogV29ya3NwYWNlQ2xpZW50TGlrZSwgY29udGV4dD86IENvbnRleHQpID0+IFByb21pc2U8VD4sXG4gICk6IFByb21pc2U8VD4ge1xuICAgIGNvbnN0IGNsaWVudCA9IHRoaXMud29ya3NwYWNlQ2xpZW50RmFjdG9yeSgpO1xuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgY29uc3QgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IGNvbnRyb2xsZXIuYWJvcnQoKSwgdGhpcy5jb25maWcudGltZW91dE1zKTtcbiAgICBjb25zdCBjb250ZXh0ID0gZGF0YWJyaWNrcy50b0NvbnRleHQoY29udHJvbGxlciwgc2lnbmFsKTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGZuKGNsaWVudCwgY29udGV4dCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAoc2lnbmFsPy5hYm9ydGVkKSB0aHJvdyBFeGVjdXRpb25FcnJvci5jYW5jZWxlZCgpO1xuICAgICAgbG9nZ2VyLndhcm4oXCJleGVjdXRpb24tZmFpbGVkXCIsIHsgb3BlcmF0aW9uIH0pO1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgIH1cbiAgfVxufVxuXG4vKiogVGhlIE9CTyB3b3Jrc3BhY2UgY2xpZW50IGZyb20gdGhlIGFjdGl2ZSBjb250ZXh0LCBvciBhIHNlcnZpY2UtcHJpbmNpcGFsIGNsaWVudC4gKi9cbmZ1bmN0aW9uIGRlZmF1bHRXb3Jrc3BhY2VDbGllbnQoKTogV29ya3NwYWNlQ2xpZW50TGlrZSB7XG4gIGNvbnN0IGN0eCA9IGFwcGtpdC50cnlHZXRFeGVjdXRpb25Db250ZXh0KCk7XG4gIGlmIChjdHg/LmNsaWVudCkgcmV0dXJuIGN0eC5jbGllbnQ7XG4gIC8vIE91dHNpZGUgYSByZXF1ZXN0IHNjb3BlIChhIHNjcmlwdCwgYSB0ZXN0KTogYSBmcmVzaCBlbnYtYXV0aCBjbGllbnQuXG4gIHJldHVybiBnZXRFeGVjdXRpb25Db250ZXh0KCkuY2xpZW50O1xufVxuXG4vKiogQ29uc3RydWN0IGEge0BsaW5rIFNlYXJjaENsaWVudH0gZnJvbSBhIHJlc29sdmVkIGNvbmZpZy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTZWFyY2hDbGllbnQoXG4gIGNvbmZpZz86IFJlc29sdmVkU2VhcmNoQ29uZmlnLFxuICB3b3Jrc3BhY2VDbGllbnRGYWN0b3J5PzogKCkgPT4gV29ya3NwYWNlQ2xpZW50TGlrZSxcbiAgbGFrZWJhc2U/OiBMYWtlYmFzZVNlYXJjaEJhY2tlbmQsXG4pOiBTZWFyY2hDbGllbnQge1xuICByZXR1cm4gbmV3IFNlYXJjaENsaWVudChjb25maWcsIHdvcmtzcGFjZUNsaWVudEZhY3RvcnksIGxha2ViYXNlKTtcbn1cbiJdfQ==
|
|
535
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQUVILE9BQU8sRUFBRSxjQUFjLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUV6RSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxJQUFJLFlBQVksRUFBRSxPQUFPLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM1RSxPQUFPLEVBQUUsS0FBSyxJQUFJLFdBQVcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2pGLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQVNyRCxPQUFPLEVBQ0wsWUFBWSxFQUNaLGlCQUFpQixFQUNqQixrQkFBa0IsRUFDbEIsZ0JBQWdCLEdBRWpCLE1BQU0sYUFBYSxDQUFDO0FBR3JCLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7QUEwQzNDOzs7O0dBSUc7QUFDSCxNQUFNLE9BQU8sV0FBVztJQUVYO0lBQ1E7SUFGbkIsWUFDVyxJQUFZLEVBQ0osTUFBb0I7UUFENUIsU0FBSSxHQUFKLElBQUksQ0FBUTtRQUNKLFdBQU0sR0FBTixNQUFNLENBQWM7SUFDcEMsQ0FBQztJQUVKLDBEQUEwRDtJQUMxRCxNQUFNLENBQUMsS0FBYSxFQUFFLE9BQXVCO1FBQzNDLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLEVBQUUsR0FBRyxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3JFLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsWUFBWSxD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Y2ggZXh0ZW5zaW9uIGNsaWVudC4gUmVhZHMgZGVsZWdhdGUgdG8gdGhlIHJlZ2lzdGVyZWQgQXBwS2l0LWNvbXBhdGlibGVcbiAqIGBhaVNlYXJjaGAgcHJvdmlkZXI7IHRoaXMgbW9kdWxlIG93bnMgZmVkZXJhdGVkIGZhbi1vdXQgYW5kIHRoZSBWZWN0b3IgU2VhcmNoXG4gKiBsaWZlY3ljbGUgQVBJcyBBcHBLaXQgZG9lcyBub3QgZXhwb3NlLlxuICpcbiAqIGBjbGllbnQuc2VhcmNoKHF1ZXJ5LCBvcHRzKWAgc2VhcmNoZXMgdGhlIGRlZmF1bHQgaW5kZXg7IGBjbGllbnQuaW5kZXgobmFtZSlgXG4gKiByZXR1cm5zIGEgaGFuZGxlIGJvdW5kIHRvIG9uZSBpbmRleDsgYGNsaWVudC51bml2ZXJzYWxTZWFyY2gocXVlcnkpYCBmYW5zIGFcbiAqIHF1ZXJ5IGFjcm9zcyBzZXZlcmFsIGluZGV4ZXMgYW5kIG1lcmdlcyB0aGUgcmVzdWx0cyAoTWVpbGlzZWFyY2gncyBmZWRlcmF0ZWRcbiAqIC8gbXVsdGktc2VhcmNoLCB0aGUgXCJ1bml2ZXJzYWwgc2VhcmNoXCIgdGhlIGNhbGxlciBhc2tlZCBmb3IpLiBFdmVyeXRoaW5nIGlzXG4gKiBhc3luYyBhbmQgY2FuY2VsbGFibGUgYW5kIHJldHVybnMgdGhlIGJyb3dzZXItc2FmZSBzaGFwZXMgZnJvbVxuICogYEBkYngtdG9vbHMvc2hhcmVkLXNlYXJjaGAuIExpZmVjeWNsZSBtZXRob2RzIGNyb3NzIEFwcEtpdCdzIGV4cGxpY2l0IGxlZ2FjeVxuICogY2xpZW50IGhhbmRvZmYgYmVjYXVzZSB0aGUgcHVibGljIGZhY2FkZSBkb2VzIG5vdCB5ZXQgZXhwb3NlIGluZGV4IGNyZWF0aW9uLFxuICogc3luYywgb3IgZGVsZXRpb24uXG4gKlxuICogQXV0b2NvbXBsZXRlIGlzIGp1c3QgYSBzZWFyY2ggd2l0aCBhIHNtYWxsIGBsaW1pdGAgYW5kIHRoZSByYXcgcXVlcnkgdGV4dCAtXG4gKiBoeWJyaWQgbW9kZSBhbHJlYWR5IHByZWZpeC1tYXRjaGVzLCBzbyBubyBzZXBhcmF0ZSBlbmRwb2ludCBpcyBuZWVkZWQ7IHRoZVxuICoge0BsaW5rIFNlYXJjaEluZGV4LmF1dG9jb21wbGV0ZX0gaGVscGVyIGlzIGEgdGhpbiwgc2VsZi1kb2N1bWVudGluZyBhbGlhcy5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgRXhlY3V0aW9uRXJyb3IsIGdldEV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQgeyBDb250ZXh0IH0gZnJvbSBcIkBkYXRhYnJpY2tzL3Nkay1leHBlcmltZW50YWxcIjtcbmltcG9ydCB7IGFwcGtpdCwgZGF0YWJyaWNrcyB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdFwiO1xuaW1wb3J0IHsgaW52b2tlLCByZXNvbHZlIGFzIG1vZGVsUmVzb2x2ZSwgc2VydmluZyB9IGZyb20gXCJAZGJ4LXRvb2xzL21vZGVsXCI7XG5pbXBvcnQgeyBhc3luYyBhcyBzaGFyZWRBc3luYywganNvbiwgbG9nLCBzdHJpbmcgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHsgTW9kZWxDbGFzcyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tb2RlbFwiO1xuaW1wb3J0IHR5cGUge1xuICBTZWFyY2hEb2N1bWVudCxcbiAgU2VhcmNoSGl0LFxuICBTZWFyY2hNb2RlLFxuICBTZWFyY2hSZXF1ZXN0LFxuICBTZWFyY2hSZXN1bHQsXG4gIFVwc2VydFJlc3VsdCxcbn0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLXNlYXJjaFwiO1xuaW1wb3J0IHtcbiAgREVGQVVMVF9NT0RFLFxuICBERUZBVUxUX1BBR0VfU0laRSxcbiAgREVGQVVMVF9USU1FT1VUX01TLFxuICByZXNvbHZlSW5kZXhOYW1lLFxuICB0eXBlIFJlc29sdmVkU2VhcmNoQ29uZmlnLFxufSBmcm9tIFwiLi9jb25maWcudHNcIjtcblxudHlwZSBXb3Jrc3BhY2VDbGllbnRMaWtlID0gUmV0dXJuVHlwZTxhcHBraXQuV29ya3NwYWNlQ2xpZW50TGlrZVtcInRvTGVnYWN5V29ya3NwYWNlQ2xpZW50XCJdPjtcbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJzZWFyY2gvY2xpZW50XCIpO1xuXG4vKiogUXVlcnkgYmFja2VuZCB1c2VkIHdoZW4gQXBwS2l0IG93bnMgdGhlIFZlY3RvciBTZWFyY2ggZXhlY3V0aW9uIHBhdGguICovXG5leHBvcnQgaW50ZXJmYWNlIFNlYXJjaFJlYWRCYWNrZW5kIHtcbiAgLyoqIFdoZXRoZXIgVmVjdG9yIFNlYXJjaCBsaWZlY3ljbGUgbWV0aG9kcyBhcmUgdmFsaWQgZm9yIHRoaXMgcHJvdmlkZXIuICovXG4gIHN1cHBvcnRzTGlmZWN5Y2xlOiBib29sZWFuO1xuICBzZWFyY2goaW5kZXg6IHN0cmluZywgcXVlcnk6IHN0cmluZywgb3B0aW9ucz86IFNlYXJjaE9wdGlvbnMpOiBQcm9taXNlPFNlYXJjaFJlc3VsdD47XG4gIGFkZERvY3VtZW50cz8oXG4gICAgaW5kZXg6IHN0cmluZyxcbiAgICBkb2N1bWVudHM6IFNlYXJjaERvY3VtZW50W10sXG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4gICk6IFByb21pc2U8VXBzZXJ0UmVzdWx0Pjtcbn1cblxuLyoqIE9wdGlvbnMgYWNjZXB0ZWQgYnkgYSBzaW5nbGUtaW5kZXggc2VhcmNoLiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZWFyY2hPcHRpb25zIHtcbiAgLyoqIE1heGltdW0gaGl0cyB0byByZXR1cm4uIERlZmF1bHRzIHRvIHRoZSBjb25maWd1cmVkIHBhZ2Ugc2l6ZS4gKi9cbiAgbGltaXQ/OiBudW1iZXI7XG4gIC8qKiBNYXRjaCBtb2RlLiBEZWZhdWx0cyB0byB0aGUgY29uZmlndXJlZCBtb2RlIChoeWJyaWQpLiAqL1xuICBtb2RlPzogU2VhcmNoTW9kZTtcbiAgLyoqIENvbHVtbnMgdG8gcmV0dXJuIHBlciBoaXQuIERlZmF1bHRzIHRvIHRoZSBpbmRleCdzIGNvbmZpZ3VyZWQgY29sdW1ucy4gKi9cbiAgY29sdW1ucz86IHJlYWRvbmx5IHN0cmluZ1tdO1xuICAvKiogQXBwS2l0IEFJIFNlYXJjaCBzY2FsYXIvYXJyYXkgZmlsdGVycy4gKi9cbiAgZmlsdGVyPzogU2VhcmNoUmVxdWVzdFtcImZpbHRlclwiXTtcbiAgLyoqIERyb3AgaGl0cyBiZWxvdyB0aGlzIHNjb3JlLiAqL1xuICBzY29yZVRocmVzaG9sZD86IG51bWJlcjtcbiAgLyoqIEV4dGVybmFsIGNhbmNlbGxhdGlvbi4gKi9cbiAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG59XG5cbi8qKiBPcHRpb25zIGFjY2VwdGVkIGJ5IGEgdW5pdmVyc2FsIChmZWRlcmF0ZWQpIHNlYXJjaC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVW5pdmVyc2FsU2VhcmNoT3B0aW9ucyB7XG4gIC8qKiBJbmRleGVzIHRvIHNlYXJjaC4gRGVmYXVsdHMgdG8gZXZlcnkga25vd24gaW5kZXguICovXG4gIGluZGV4ZXM/OiByZWFkb25seSBzdHJpbmdbXTtcbiAgLyoqIE1heGltdW0gaGl0cyBwZXIgaW5kZXggYmVmb3JlIG1lcmdpbmcuICovXG4gIGxpbWl0PzogbnVtYmVyO1xuICAvKiogTWF0Y2ggbW9kZS4gKi9cbiAgbW9kZT86IFNlYXJjaE1vZGU7XG4gIC8qKiBFeHRlcm5hbCBjYW5jZWxsYXRpb24uICovXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsO1xufVxuXG4vKipcbiAqIEEgaGFuZGxlIGJvdW5kIHRvIG9uZSBpbmRleC4gTW9kZWxlZCBvbiBNZWlsaXNlYXJjaCdzIGBjbGllbnQuaW5kZXgodWlkKWA6XG4gKiBgc2VhcmNoYCAvIGBhdXRvY29tcGxldGVgIHJlYWQsIGBhZGREb2N1bWVudHNgIC8gYGRlbGV0ZURvY3VtZW50c2Agd3JpdGUgKHRvXG4gKiBhIGRpcmVjdC1hY2Nlc3MgaW5kZXgpLCBhbmQgYGluZm9gIGZldGNoZXMgdGhlIGxpdmUgZGVmaW5pdGlvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIFNlYXJjaEluZGV4IHtcbiAgY29uc3RydWN0b3IoXG4gICAgcmVhZG9ubHkgbmFtZTogc3RyaW5nLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY2xpZW50OiBTZWFyY2hDbGllbnQsXG4gICkge31cblxuICAvKiogU2VhcmNoIHRoaXMgaW5kZXguIFNlZSB7QGxpbmsgU2VhcmNoQ2xpZW50LnNlYXJjaH0uICovXG4gIHNlYXJjaChxdWVyeTogc3RyaW5nLCBvcHRpb25zPzogU2VhcmNoT3B0aW9ucyk6IFByb21pc2U8U2VhcmNoUmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LnNlYXJjaChxdWVyeSwgeyAuLi5vcHRpb25zLCBpbmRleDogdGhpcy5uYW1lIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEF1dG9jb21wbGV0ZSBhZ2FpbnN0IHRoaXMgaW5kZXg6IGEgc2VhcmNoIHdpdGggYSBzbWFsbCBkZWZhdWx0IGBsaW1pdGAgYW5kXG4gICAqIHRoZSByYXcgcHJlZml4IGFzIHRoZSBxdWVyeS4gSHlicmlkIG1vZGUgYWxyZWFkeSBoYW5kbGVzIHByZWZpeGVzLCBzbyB0aGlzXG4gICAqIGlzIGEgc2VsZi1kb2N1bWVudGluZyBhbGlhcyByYXRoZXIgdGhhbiBhIHNlcGFyYXRlIGNvZGUgcGF0aC5cbiAgICovXG4gIGF1dG9jb21wbGV0ZShwcmVmaXg6IHN0cmluZywgb3B0aW9ucz86IFNlYXJjaE9wdGlvbnMpOiBQcm9taXNlPFNlYXJjaFJlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLnNlYXJjaChwcmVmaXgsIHsgbGltaXQ6IDUsIC4uLm9wdGlvbnMgfSk7XG4gIH1cblxuICAvKiogQWRkIG9yIHVwZGF0ZSBkb2N1bWVudHMgaW4gdGhpcyAoZGlyZWN0LWFjY2VzcykgaW5kZXguICovXG4gIGFkZERvY3VtZW50cyhkb2N1bWVudHM6IFNlYXJjaERvY3VtZW50W10sIHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTxVcHNlcnRSZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQuYWRkRG9jdW1lbnRzKHRoaXMubmFtZSwgZG9jdW1lbnRzLCBzaWduYWwpO1xuICB9XG5cbiAgLyoqIERlbGV0ZSBkb2N1bWVudHMgZnJvbSB0aGlzIChkaXJlY3QtYWNjZXNzKSBpbmRleCBieSBwcmltYXJ5IGtleS4gKi9cbiAgZGVsZXRlRG9jdW1lbnRzKGlkczogQXJyYXk8c3RyaW5nIHwgbnVtYmVyPiwgc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPFVwc2VydFJlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5kZWxldGVEb2N1bWVudHModGhpcy5uYW1lLCBpZHMsIHNpZ25hbCk7XG4gIH1cblxuICAvKiogRmV0Y2ggdGhpcyBpbmRleCdzIGxpdmUgZGVmaW5pdGlvbiAocHJpbWFyeSBrZXksIGNvbHVtbnMsIHJlYWRpbmVzcykuICovXG4gIGluZm8oc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPEluZGV4SW5mbz4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXRJbmRleCh0aGlzLm5hbWUsIHNpZ25hbCk7XG4gIH1cblxuICAvKiogVHJpZ2dlciBhIHN5bmMgb2YgdGhpcyAoRGVsdGEgU3luYykgaW5kZXggZnJvbSBpdHMgc291cmNlIHRhYmxlLiAqL1xuICBzeW5jKHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LnN5bmNJbmRleCh0aGlzLm5hbWUsIHNpZ25hbCk7XG4gIH1cblxuICAvKiogRGVsZXRlIHRoaXMgaW5kZXguICovXG4gIGRlbGV0ZShzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5kZWxldGVJbmRleCh0aGlzLm5hbWUsIHNpZ25hbCk7XG4gIH1cblxuICAvKiogQ3JlYXRlIHRoaXMgaW5kZXggaWYgaXQgZG9lcyBub3QgZXhpc3QsIG90aGVyd2lzZSByZXR1cm4gdGhlIGV4aXN0aW5nIG9uZS4gKi9cbiAgZW5zdXJlKG9wdGlvbnM/OiBDcmVhdGVJbmRleE9wdGlvbnMpOiBQcm9taXNlPEluZGV4SW5mbz4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5lbnN1cmVJbmRleCh0aGlzLm5hbWUsIG9wdGlvbnMpO1xuICB9XG59XG5cbi8qKiBBIHJlc29sdmVkIGxpdmUgaW5kZXggZGVmaW5pdGlvbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5kZXhJbmZvIHtcbiAgbmFtZTogc3RyaW5nO1xuICBlbmRwb2ludD86IHN0cmluZztcbiAgcHJpbWFyeUtleT86IHN0cmluZztcbiAgY29sdW1uczogc3RyaW5nW107XG4gIHJlYWR5OiBib29sZWFuO1xuICByb3dDb3VudD86IG51bWJlcjtcbiAgLyoqIFRydWUgZm9yIGEgRElSRUNUX0FDQ0VTUyBpbmRleCAoeW91IHN1cHBseSB2ZWN0b3JzOyBxdWVyaWVzIGVtYmVkIGNsaWVudC1zaWRlKS4gKi9cbiAgZGlyZWN0QWNjZXNzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgU2VhcmNoQ2xpZW50LmNyZWF0ZUluZGV4fSAvIHtAbGluayBTZWFyY2hDbGllbnQuZW5zdXJlSW5kZXh9LlxuICogVGhlIGdvYWwgaXMgdGhlIHNhbWUgYXMgdGhlIHJlc3Qgb2YgdGhlIGNsaWVudDogbmFtZSBhIHNvdXJjZSB0YWJsZSBhbmQgYVxuICogdGV4dCBjb2x1bW4sIGFuZCBldmVyeXRoaW5nIGVsc2UgLSB0aGUgZW5kcG9pbnQsIHRoZSBlbWJlZGRpbmcgbW9kZWwsIHRoZVxuICogaW5kZXggdHlwZSwgdGhlIHN5bmMgbW9kZSAtIGhhcyBhIHNlbnNpYmxlIGRlZmF1bHQgdGhhdCBpbmZlcnMgZnJvbSB0aGVcbiAqIHdvcmtzcGFjZSwgb3ZlcnJpZGFibGUgd2hlbiBhIGRlcGxveW1lbnQgbmVlZHMgdG8gZ28gZGVlcGVyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZUluZGV4T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBTb3VyY2UgRGVsdGEgdGFibGUgKGNhdGFsb2cuc2NoZW1hLnRhYmxlKSBmb3IgYSBEZWx0YSBTeW5jIGluZGV4LiBQcm92aWRlXG4gICAqIHRoaXMgZm9yIHRoZSBjb21tb24gY2FzZTogRGF0YWJyaWNrcyBjb21wdXRlcyBhbmQgc3luY3MgZW1iZWRkaW5ncyBmcm9tIGl0LlxuICAgKiBPbWl0IGl0IChhbmQgcGFzcyB7QGxpbmsgZW1iZWRkaW5nRGltZW5zaW9ufSkgdG8gY3JlYXRlIGEgZGlyZWN0LWFjY2Vzc1xuICAgKiBpbmRleCB5b3Ugd3JpdGUgdmVjdG9ycyB0byB5b3Vyc2VsZi5cbiAgICovXG4gIHNvdXJjZVRhYmxlPzogc3RyaW5nO1xuICAvKiogUHJpbWFyeS1rZXkgY29sdW1uLiBEZWZhdWx0cyB0byBgaWRgLiAqL1xuICBwcmltYXJ5S2V5Pzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHRleHQgY29sdW1uIGVtYmVkZGluZ3MgYXJlIGNvbXB1dGVkIGZyb20gKERlbHRhIFN5bmMpLiBEZWZhdWx0cyB0byB0aGVcbiAgICogZmlyc3Qgb2YgYHRleHRgIC8gYGNvbnRlbnRgIC8gYGJvZHlgIHByZXNlbnQsIGVsc2UgdGhlIGNhbGxlciBtdXN0IHNldCBpdC5cbiAgICovXG4gIGVtYmVkZGluZ1NvdXJjZUNvbHVtbj86IHN0cmluZztcbiAgLyoqXG4gICAqIEVtYmVkZGluZyBtb2RlbCBlbmRwb2ludC4gQSBsb29zZSBuYW1lIGlzIGZ1enp5LW1hdGNoZWQ7IHdoZW4gb21pdHRlZCB0aGVcbiAgICogYmVzdCBlbWJlZGRpbmcgZW5kcG9pbnQgaW4gdGhlIHdvcmtzcGFjZSBpcyBjaG9zZW4gKHtAbGluayByZXNvbHZlRW1iZWRkaW5nTW9kZWx9KS5cbiAgICovXG4gIGVtYmVkZGluZ01vZGVsPzogc3RyaW5nO1xuICAvKiogVmVjdG9yIFNlYXJjaCBlbmRwb2ludCB0byBob3N0IHRoZSBpbmRleCBvbi4gRGVmYXVsdHMgdG8gdGhlIHBsdWdpbidzIGBlbmRwb2ludGAuICovXG4gIGVuZHBvaW50Pzogc3RyaW5nO1xuICAvKiogRm9yIGEgZGlyZWN0LWFjY2VzcyBpbmRleDogdGhlIGVtYmVkZGluZyB2ZWN0b3IgZGltZW5zaW9uIChzZWxmLW1hbmFnZWQgdmVjdG9ycywgbm8gc291cmNlIHRhYmxlKS4gKi9cbiAgZW1iZWRkaW5nRGltZW5zaW9uPzogbnVtYmVyO1xuICAvKiogRm9yIGEgZGlyZWN0LWFjY2VzcyBpbmRleDogdGhlIGNvbHVtbiB0aGUgdmVjdG9yIGlzIHN0b3JlZCBpbi4gRGVmYXVsdHMgdG8gYGVtYmVkZGluZ2AuICovXG4gIGVtYmVkZGluZ1ZlY3RvckNvbHVtbj86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBjb2x1bW4tbmFtZSAtPiB0eXBlIG1hcCB1c2VkIHRvIGJ1aWxkIGEgZGlyZWN0LWFjY2VzcyBpbmRleCdzXG4gICAqIGBzY2hlbWFfanNvbmAgKHR5cGVzOiBgc3RyaW5nYCwgYGludGAsIGBsb25nYCwgYGZsb2F0YCwgYGRvdWJsZWAsXG4gICAqIGBib29sZWFuYCwgYGRhdGVgLCBgdGltZXN0YW1wYCkuIE11c3QgaW5jbHVkZSB0aGUgcHJpbWFyeSBrZXkgYW5kIGFueVxuICAgKiBjb2x1bW5zIHlvdSB1cHNlcnQuIERlZmF1bHRzIHRvIGB7IGlkOiBcInN0cmluZ1wiLCB0ZXh0OiBcInN0cmluZ1wiIH1gLiBUaGVcbiAgICogZW1iZWRkaW5nIHZlY3RvciBjb2x1bW4gaXMgYWRkZWQgYXV0b21hdGljYWxseS5cbiAgICovXG4gIHNjaGVtYT86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIC8qKiBTeW5jIG1vZGUgZm9yIGEgRGVsdGEgU3luYyBpbmRleC4gYFRSSUdHRVJFRGAgKGRlZmF1bHQpIHN5bmNzIG9uIGRlbWFuZDsgYENPTlRJTlVPVVNgIGtlZXBzIGZyZXNoLiAqL1xuICBwaXBlbGluZVR5cGU/OiBcIlRSSUdHRVJFRFwiIHwgXCJDT05USU5VT1VTXCI7XG4gIC8qKiBFeHRyYSBjb2x1bW5zIHRvIHN5bmMgYWxvbmdzaWRlIHRoZSBlbWJlZGRpbmcgc291cmNlIChEZWx0YSBTeW5jKS4gKi9cbiAgY29sdW1uc1RvU3luYz86IHN0cmluZ1tdO1xuICAvKiogRXh0ZXJuYWwgY2FuY2VsbGF0aW9uLiAqL1xuICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbn1cblxuLyoqIE9wdGlvbnMgZm9yIHtAbGluayBTZWFyY2hDbGllbnQuZW5zdXJlRW5kcG9pbnR9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbnN1cmVFbmRwb2ludE9wdGlvbnMge1xuICAvKiogV2FpdCBmb3IgdGhlIGVuZHBvaW50IHRvIGNvbWUgb25saW5lIGJlZm9yZSByZXR1cm5pbmcuIERlZmF1bHRzIHRvIGZhbHNlLiAqL1xuICB3YWl0PzogYm9vbGVhbjtcbiAgLyoqIEV4dGVybmFsIGNhbmNlbGxhdGlvbi4gKi9cbiAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIFNlYXJjaENsaWVudC5wcm92aXNpb259IC0gYSBvbmUtY2FsbCBcIm1ha2UgdGhpcyBpbmRleCByZWFsXG4gKiBhbmQgc2VhcmNoYWJsZVwiIHVzZWQgYXQgYm9vdCBvciBpbiBhIHNlZWQgc2NyaXB0LiBJdCBlbnN1cmVzIHRoZSBlbmRwb2ludCxcbiAqIGVuc3VyZXMgdGhlIGluZGV4LCBhbmQgKG9wdGlvbmFsbHkpIHNlZWRzIGRvY3VtZW50cyB3aGVuIHRoZSBpbmRleCBpcyBlbXB0eS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm92aXNpb25PcHRpb25zIGV4dGVuZHMgQ3JlYXRlSW5kZXhPcHRpb25zIHtcbiAgLyoqIERvY3VtZW50cyB0byBzZWVkIHdoZW4gdGhlIGluZGV4IGhhcyBubyByb3dzIHlldC4gU2tpcHBlZCBpZiBpdCBhbHJlYWR5IGhhcyBkYXRhLiAqL1xuICBzZWVkPzogU2VhcmNoRG9jdW1lbnRbXTtcbiAgLyoqXG4gICAqIFdhaXQgZm9yIHRoZSBlbmRwb2ludCBBTkQgaW5kZXggdG8gY29tZSBvbmxpbmUgYmVmb3JlIHJldHVybmluZyAobmVlZGVkXG4gICAqIGJlZm9yZSBzZWVkaW5nKS4gRGVmYXVsdHMgdG8gdHJ1ZS4gRW5kcG9pbnQgY3JlYXRpb24gY2FuIHRha2UgbWFueSBtaW51dGVzLlxuICAgKi9cbiAgd2FpdD86IGJvb2xlYW47XG4gIC8qKiBIb3cgbG9uZyB0byB3YWl0IGZvciByZWFkaW5lc3MgYmVmb3JlIGdpdmluZyB1cC4gRGVmYXVsdHMgdG8gMjAgbWludXRlcy4gKi9cbiAgdGltZW91dE1zPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIFRoZSBBSSBTZWFyY2ggY2xpZW50LiBDb25zdHJ1Y3QgaXQgd2l0aCB7QGxpbmsgY3JlYXRlU2VhcmNoQ2xpZW50fSAod2hpY2hcbiAqIHJlYWRzIGEgcmVzb2x2ZWQgY29uZmlnKSBvciBkaXJlY3RseSBmb3Igb25lLW9mZiB1c2UuIEFsbCByZWFkcyByZXNvbHZlIHRoZVxuICogT0JPIHdvcmtzcGFjZSBjbGllbnQgZnJvbSB0aGUgYWN0aXZlIGV4ZWN1dGlvbiBjb250ZXh0LlxuICovXG5leHBvcnQgY2xhc3MgU2VhcmNoQ2xpZW50IHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBjb25maWc6IFJlc29sdmVkU2VhcmNoQ29uZmlnID0ge1xuICAgICAgaW5kZXhlczogW10sXG4gICAgICBwYWdlU2l6ZTogREVGQVVMVF9QQUdFX1NJWkUsXG4gICAgICBtb2RlOiBERUZBVUxUX01PREUsXG4gICAgICBiYXNlUGF0aDogXCIvYXBpL3NlYXJjaFwiLFxuICAgICAgdGltZW91dE1zOiBERUZBVUxUX1RJTUVPVVRfTVMsXG4gICAgICBhbGxvd1dyaXRlOiBmYWxzZSxcbiAgICB9LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgd29ya3NwYWNlQ2xpZW50RmFjdG9yeTogKCkgPT4gV29ya3NwYWNlQ2xpZW50TGlrZSA9IGRlZmF1bHRXb3Jrc3BhY2VDbGllbnQsXG4gICAgcHJpdmF0ZSByZWFkb25seSByZWFkQmFja2VuZD86IFNlYXJjaFJlYWRCYWNrZW5kLFxuICApIHt9XG5cbiAgLyoqIEEgaGFuZGxlIGJvdW5kIHRvIG9uZSBpbmRleCAoYnkgZnVsbCBVQyBuYW1lIG9yIGNvbmZpZ3VyZWQgYWxpYXMpLiAqL1xuICBpbmRleChyZWZlcmVuY2U6IHN0cmluZyk6IFNlYXJjaEluZGV4IHtcbiAgICBjb25zdCBuYW1lID0gcmVzb2x2ZUluZGV4TmFtZSh0aGlzLmNvbmZpZywgcmVmZXJlbmNlKSA/PyByZWZlcmVuY2U7XG4gICAgcmV0dXJuIG5ldyBTZWFyY2hJbmRleChuYW1lLCB0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWFyY2ggb25lIGluZGV4LiBgaW5kZXhgIG1heSBiZSBhIGZ1bGwgVUMgbmFtZSwgYSBjb25maWd1cmVkIGFsaWFzLCBvclxuICAgKiBvbWl0dGVkIHRvIHVzZSB0aGUgZGVmYXVsdCBpbmRleC4gUmV0dXJucyBoaXRzIHNvcnRlZCBtb3N0LXJlbGV2YW50LWZpcnN0LlxuICAgKi9cbiAgYXN5bmMgc2VhcmNoKFxuICAgIHF1ZXJ5OiBzdHJpbmcsXG4gICAgb3B0aW9uczogU2VhcmNoT3B0aW9ucyAmIHsgaW5kZXg/OiBzdHJpbmcgfSA9IHt9LFxuICApOiBQcm9taXNlPFNlYXJjaFJlc3VsdD4ge1xuICAgIGNvbnN0IHRleHQgPSBzdHJpbmcudHJpbVRvRW1wdHkocXVlcnkpO1xuICAgIGNvbnN0IG5hbWUgPSByZXNvbHZlSW5kZXhOYW1lKHRoaXMuY29uZmlnLCBvcHRpb25zLmluZGV4KTtcbiAgICBpZiAobmFtZSA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEV4ZWN1dGlvbkVycm9yKFwic2VhcmNoOiBubyBpbmRleCBjb25maWd1cmVkOyBzZXQgYSBkZWZhdWx0IGluZGV4IG9yIHBhc3Mgb25lXCIsIHtcbiAgICAgICAgY29udGV4dDogeyBvcGVyYXRpb246IFwic2VhcmNoXCIgfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoIXRoaXMucmVhZEJhY2tlbmQpIHtcbiAgICAgIHRocm93IG5ldyBFeGVjdXRpb25FcnJvcihcbiAgICAgICAgXCJzZWFyY2g6IG5vIEFJIFNlYXJjaCBwcm92aWRlciByZWdpc3RlcmVkOyBhZGQgYWlTZWFyY2goKSBvciBsYWtlYmFzZUFpU2VhcmNoKClcIixcbiAgICAgICAgeyBjb250ZXh0OiB7IG9wZXJhdGlvbjogXCJzZWFyY2hcIiB9IH0sXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5yZWFkQmFja2VuZC5zZWFyY2gobmFtZSwgdGV4dCwge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGxpbWl0OiBvcHRpb25zLmxpbWl0ID8/IHRoaXMuY29uZmlnLnBhZ2VTaXplLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEZhbiBhIHF1ZXJ5IGFjcm9zcyBzZXZlcmFsIGluZGV4ZXMgYW5kIG1lcmdlIHRoZSBoaXRzLCBzb3J0ZWQgYnkgc2NvcmUgLVxuICAgKiB0aGUgXCJ1bml2ZXJzYWwgc2VhcmNoXCIgYSBzaW5nbGUgYm94IG92ZXIgbWFueSBjb2xsZWN0aW9ucyBuZWVkcy4gRWFjaFxuICAgKiBpbmRleCBpcyBzZWFyY2hlZCBjb25jdXJyZW50bHk7IGFuIGluZGV4IHRoYXQgZXJyb3JzIGlzIGxvZ2dlZCBhbmQgc2tpcHBlZFxuICAgKiBzbyBvbmUgYmFkIGluZGV4IGRvZXMgbm90IHNpbmsgdGhlIHdob2xlIHNlYXJjaC5cbiAgICovXG4gIGFzeW5jIHVuaXZlcnNhbFNlYXJjaChcbiAgICBxdWVyeTogc3RyaW5nLFxuICAgIG9wdGlvbnM6IFVuaXZlcnNhbFNlYXJjaE9wdGlvbnMgPSB7fSxcbiAgKTogUHJvbWlzZTxTZWFyY2hSZXN1bHQ+IHtcbiAgICBjb25zdCB0ZXh0ID0gc3RyaW5nLnRyaW1Ub0VtcHR5KHF1ZXJ5KTtcbiAgICBjb25zdCBuYW1lcyA9XG4gICAgICBvcHRpb25zLmluZGV4ZXMgJiYgb3B0aW9ucy5pbmRleGVzLmxlbmd0aCA+IDBcbiAgICAgICAgPyBvcHRpb25zLmluZGV4ZXMubWFwKChyZWYpID0+IHJlc29sdmVJbmRleE5hbWUodGhpcy5jb25maWcsIHJlZikgPz8gcmVmKVxuICAgICAgICA6IHRoaXMuY29uZmlnLmluZGV4ZXMubWFwKChpKSA9PiBpLm5hbWUpO1xuICAgIGNvbnN0IHBlckluZGV4ID0gb3B0aW9ucy5saW1pdCA/PyB0aGlzLmNvbmZpZy5wYWdlU2l6ZTtcblxuICAgIGNvbnN0IHNldHRsZWQgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoXG4gICAgICBuYW1lcy5tYXAoYXN5bmMgKG5hbWUpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zZWFyY2godGV4dCwge1xuICAgICAgICAgIGluZGV4OiBuYW1lLFxuICAgICAgICAgIGxpbWl0OiBwZXJJbmRleCxcbiAgICAgICAgICAuLi4ob3B0aW9ucy5tb2RlID8geyBtb2RlOiBvcHRpb25zLm1vZGUgfSA6IHt9KSxcbiAgICAgICAgICAuLi4ob3B0aW9ucy5zaWduYWwgPyB7IHNpZ25hbDogb3B0aW9ucy5zaWduYWwgfSA6IHt9KSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXN1bHQuaGl0cy5tYXAoKGhpdCk6IFNlYXJjaEhpdCA9PiAoeyAuLi5oaXQsIGluZGV4OiBuYW1lIH0pKTtcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICBjb25zdCBoaXRzID0gc2V0dGxlZFxuICAgICAgLmZsYXRNYXAoKG91dGNvbWUsIGkpID0+IHtcbiAgICAgICAgaWYgKG91dGNvbWUuc3RhdHVzID09PSBcImZ1bGZpbGxlZFwiKSByZXR1cm4gb3V0Y29tZS52YWx1ZTtcbiAgICAgICAgbG9nZ2VyLndhcm4oXCJ1bml2ZXJzYWwtaW5kZXgtZmFpbGVkXCIsIHsgaW5kZXg6IG5hbWVzW2ldIH0pO1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9KVxuICAgICAgLnNvcnQoKGEsIGIpID0+IGIuc2NvcmUgLSBhLnNjb3JlKTtcblxuICAgIHJldHVybiB7IHF1ZXJ5OiB0ZXh0LCBoaXRzLCBjb3VudDogaGl0cy5sZW5ndGggfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlIGFuIGluZGV4IHJlZmVyZW5jZSAoZnVsbCBVQyBuYW1lIG9yIGNvbmZpZ3VyZWQgYWxpYXMpIHRvIHRoZSBuYW1lXG4gICAqIHRoZSBBUEkgZXhwZWN0cywgZmFpbGluZyBmYXN0IHdoZW4gaXQgcmVzb2x2ZXMgdG8gbm90aGluZy4gV2l0aG91dCB0aGlzIGFcbiAgICogYmxhbmsgcmVmZXJlbmNlIC0gd2hhdCBhbiBvbWl0dGVkIGBpbmRleGAgYmVjb21lcyB3aGVuIG5vIGRlZmF1bHQgaXNcbiAgICogY29uZmlndXJlZCAtIHJlYWNoZXMgdGhlIFNESyBhcyBhbiBlbXB0eSBgaW5kZXhfbmFtZWAsIHdoaWNoIGJ1aWxkcyBhXG4gICAqIFVSTCB3aXRoIHRoZSBuYW1lIHNlZ21lbnQgbWlzc2luZyBhbmQgY29tZXMgYmFjayBhcyBhIGNvbmZ1c2luZ1xuICAgKiBgRU5EUE9JTlRfTk9UX0ZPVU5EYCBpbnN0ZWFkIG9mIG5hbWluZyB0aGUgcmVhbCBwcm9ibGVtLlxuICAgKi9cbiAgcHJpdmF0ZSByZXF1aXJlSW5kZXhOYW1lKHJlZmVyZW5jZTogc3RyaW5nLCBvcGVyYXRpb246IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgbmFtZSA9IHN0cmluZy50cmltVG9OdWxsKHJlc29sdmVJbmRleE5hbWUodGhpcy5jb25maWcsIHJlZmVyZW5jZSkgPz8gcmVmZXJlbmNlKTtcbiAgICBpZiAobmFtZSA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEV4ZWN1dGlvbkVycm9yKFxuICAgICAgICBgc2VhcmNoOiBubyBpbmRleCBjb25maWd1cmVkOyBzZXQgYSBkZWZhdWx0IGluZGV4IG9yIHBhc3Mgb25lIHRvICR7b3BlcmF0aW9ufWAsXG4gICAgICAgIHsgY29udGV4dDogeyBvcGVyYXRpb24gfSB9LFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIG5hbWU7XG4gIH1cblxuICAvKiogUmVqZWN0IFZlY3RvciBTZWFyY2ggbGlmZWN5Y2xlIGNhbGxzIGFnYWluc3QgYSBub24tVmVjdG9yIHByb3ZpZGVyLiAqL1xuICBwcml2YXRlIHJlcXVpcmVMaWZlY3ljbGUob3BlcmF0aW9uOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5yZWFkQmFja2VuZCAmJiAhdGhpcy5yZWFkQmFja2VuZC5zdXBwb3J0c0xpZmVjeWNsZSkge1xuICAgICAgdGhyb3cgbmV3IEV4ZWN1dGlvbkVycm9yKGBzZWFyY2g6IHRoZSByZWdpc3RlcmVkIHByb3ZpZGVyIGRvZXMgbm90IHN1cHBvcnQgJHtvcGVyYXRpb259YCwge1xuICAgICAgICBjb250ZXh0OiB7IG9wZXJhdGlvbiB9LFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEZldGNoIGFuIGluZGV4J3MgbGl2ZSBkZWZpbml0aW9uLiAqL1xuICBhc3luYyBnZXRJbmRleChyZWZlcmVuY2U6IHN0cmluZywgc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPEluZGV4SW5mbz4ge1xuICAgIHRoaXMucmVxdWlyZUxpZmVjeWNsZShcImdldEluZGV4XCIpO1xuICAgIGNvbnN0IG5hbWUgPSB0aGlzLnJlcXVpcmVJbmRleE5hbWUocmVmZXJlbmNlLCBcImdldEluZGV4XCIpO1xuICAgIGNvbnN0IGluZGV4ID0gYXdhaXQgdGhpcy53aXRoQ2xpZW50KFwiZ2V0SW5kZXhcIiwgc2lnbmFsLCAoY2xpZW50LCBjb250ZXh0KSA9PlxuICAgICAgY2xpZW50LnZlY3RvclNlYXJjaEluZGV4ZXMuZ2V0SW5kZXgoeyBpbmRleF9uYW1lOiBuYW1lIH0sIGNvbnRleHQpLFxuICAgICk7XG4gICAgY29uc3QgZGlyZWN0QWNjZXNzID0gaW5kZXguZGlyZWN0X2FjY2Vzc19pbmRleF9zcGVjICE9PSB1bmRlZmluZWQ7XG4gICAgY29uc3Qgc3BlYyA9IGluZGV4LmRlbHRhX3N5bmNfaW5kZXhfc3BlYyA/PyBpbmRleC5kaXJlY3RfYWNjZXNzX2luZGV4X3NwZWM7XG4gICAgLy8gRGVsdGEgU3luYyBzdXJmYWNlcyBpdHMgZW1iZWRkaW5nIHNvdXJjZSBjb2x1bW5zIGRpcmVjdGx5OyBhIGRpcmVjdC1hY2Nlc3NcbiAgICAvLyBpbmRleCBjYXJyaWVzIGl0cyBjb2x1bW5zIGluIHNjaGVtYV9qc29uIChtaW51cyB0aGUgdmVjdG9yIGNvbHVtbikuXG4gICAgbGV0IGNvbHVtbnMgPSAoc3BlYz8uZW1iZWRkaW5nX3NvdXJjZV9jb2x1bW5zID8/IFtdKS5tYXAoKGMpID0+IGMubmFtZSA/PyBcIlwiKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgY29uc3Qgc2NoZW1hSnNvbiA9IGluZGV4LmRpcmVjdF9hY2Nlc3NfaW5kZXhfc3BlYz8uc2NoZW1hX2pzb247XG4gICAgaWYgKGRpcmVjdEFjY2VzcyAmJiBzY2hlbWFKc29uKSB7XG4gICAgICBjb25zdCBzY2hlbWEgPSBqc29uLnBhcnNlUmVjb3JkKHNjaGVtYUpzb24pID8/IHt9O1xuICAgICAgY29uc3QgdmVjdG9yTmFtZXMgPSBuZXcgU2V0KFxuICAgICAgICAoaW5kZXguZGlyZWN0X2FjY2Vzc19pbmRleF9zcGVjPy5lbWJlZGRpbmdfdmVjdG9yX2NvbHVtbnMgPz8gW10pXG4gICAgICAgICAgLm1hcCgoYykgPT4gYy5uYW1lKVxuICAgICAgICAgIC5maWx0ZXIoKG4pOiBuIGlzIHN0cmluZyA9PiBCb29sZWFuKG4pKSxcbiAgICAgICk7XG4gICAgICBjb2x1bW5zID0gT2JqZWN0LmtleXMoc2NoZW1hKS5maWx0ZXIoKGMpID0+ICF2ZWN0b3JOYW1lcy5oYXMoYykpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgbmFtZTogaW5kZXgubmFtZSA/PyBuYW1lLFxuICAgICAgLi4uKGluZGV4LmVuZHBvaW50X25hbWUgPyB7IGVuZHBvaW50OiBpbmRleC5lbmRwb2ludF9uYW1lIH0gOiB7fSksXG4gICAgICAuLi4oaW5kZXgucHJpbWFyeV9rZXkgPyB7IHByaW1hcnlLZXk6IGluZGV4LnByaW1hcnlfa2V5IH0gOiB7fSksXG4gICAgICBjb2x1bW5zLFxuICAgICAgcmVhZHk6IGluZGV4LnN0YXR1cz8ucmVhZHkgPz8gZmFsc2UsXG4gICAgICAuLi4oaW5kZXguc3RhdHVzPy5pbmRleGVkX3Jvd19jb3VudCAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8geyByb3dDb3VudDogaW5kZXguc3RhdHVzLmluZGV4ZWRfcm93X2NvdW50IH1cbiAgICAgICAgOiB7fSksXG4gICAgICAuLi4oZGlyZWN0QWNjZXNzID8geyBkaXJlY3RBY2Nlc3M6IHRydWUgfSA6IHt9KSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIEFkZCBvciB1cGRhdGUgZG9jdW1lbnRzIGluIGEgZGlyZWN0LWFjY2VzcyBpbmRleC4gKi9cbiAgYXN5bmMgYWRkRG9jdW1lbnRzKFxuICAgIHJlZmVyZW5jZTogc3RyaW5nLFxuICAgIGRvY3VtZW50czogU2VhcmNoRG9jdW1lbnRbXSxcbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbiAgKTogUHJvbWlzZTxVcHNlcnRSZXN1bHQ+IHtcbiAgICBjb25zdCBuYW1lID0gdGhpcy5yZXF1aXJlSW5kZXhOYW1lKHJlZmVyZW5jZSwgXCJhZGREb2N1bWVudHNcIik7XG4gICAgaWYgKHRoaXMucmVhZEJhY2tlbmQ/LmFkZERvY3VtZW50cykge1xuICAgICAgcmV0dXJuIHRoaXMucmVhZEJhY2tlbmQuYWRkRG9jdW1lbnRzKG5hbWUsIGRvY3VtZW50cywgc2lnbmFsKTtcbiAgICB9XG4gICAgdGhpcy5yZXF1aXJlTGlmZWN5Y2xlKFwiYWRkRG9jdW1lbnRzXCIpO1xuICAgIGF3YWl0IHRoaXMud2l0aENsaWVudChcImFkZERvY3VtZW50c1wiLCBzaWduYWwsIChjbGllbnQsIGNvbnRleHQpID0+XG4gICAgICBjbGllbnQudmVjdG9yU2VhcmNoSW5kZXhlcy51cHNlcnREYXRhVmVjdG9ySW5kZXgoXG4gICAgICAgIHsgaW5kZXhfbmFtZTogbmFtZSwgaW5wdXRzX2pzb246IEpTT04uc3RyaW5naWZ5KGRvY3VtZW50cykgfSxcbiAgICAgICAgY29udGV4dCxcbiAgICAgICksXG4gICAgKTtcbiAgICByZXR1cm4geyBpbmRleDogbmFtZSwgY291bnQ6IGRvY3VtZW50cy5sZW5ndGggfTtcbiAgfVxuXG4gIC8qKiBEZWxldGUgZG9jdW1lbnRzIGZyb20gYSBkaXJlY3QtYWNjZXNzIGluZGV4IGJ5IHByaW1hcnkga2V5LiAqL1xuICBhc3luYyBkZWxldGVEb2N1bWVudHMoXG4gICAgcmVmZXJlbmNlOiBzdHJpbmcsXG4gICAgaWRzOiBBcnJheTxzdHJpbmcgfCBudW1iZXI+LFxuICAgIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuICApOiBQcm9taXNlPFVwc2VydFJlc3VsdD4ge1xuICAgIHRoaXMucmVxdWlyZUxpZmVjeWNsZShcImRlbGV0ZURvY3VtZW50c1wiKTtcbiAgICBjb25zdCBuYW1lID0gdGhpcy5yZXF1aXJlSW5kZXhOYW1lKHJlZmVyZW5jZSwgXCJkZWxldGVEb2N1bWVudHNcIik7XG4gICAgYXdhaXQgdGhpcy53aXRoQ2xpZW50KFwiZGVsZXRlRG9jdW1lbnRzXCIsIHNpZ25hbCwgKGNsaWVudCwgY29udGV4dCkgPT5cbiAgICAgIGNsaWVudC52ZWN0b3JTZWFyY2hJbmRleGVzLmRlbGV0ZURhdGFWZWN0b3JJbmRleChcbiAgICAgICAgeyBpbmRleF9uYW1lOiBuYW1lLCBwcmltYXJ5X2tleXM6IGlkcy5tYXAoU3RyaW5nKSB9LFxuICAgICAgICBjb250ZXh0LFxuICAgICAgKSxcbiAgICApO1xuICAgIHJldHVybiB7IGluZGV4OiBuYW1lLCBjb3VudDogaWRzLmxlbmd0aCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgYW4gZW1iZWRkaW5nIGVuZHBvaW50IGlkIGZvciBjcmVhdGluZyBhIERlbHRhIFN5bmMgaW5kZXguIFJldXNlc1xuICAgKiB0aGUgbW9kZWwgcmVzb2x2ZXI6IGEgY29uZmlndXJlZCAvIHBhc3NlZCBuYW1lIGlzIGZ1enp5LW1hdGNoZWQgYWdhaW5zdCB0aGVcbiAgICogbGl2ZSBjYXRhbG9ndWUsIG90aGVyd2lzZSB0aGUgaGlnaGVzdC1yYW5rZWQgZW1iZWRkaW5nIGVuZHBvaW50IGlzIGNob3Nlbi5cbiAgICovXG4gIGFzeW5jIHJlc29sdmVFbWJlZGRpbmdNb2RlbChyZXF1ZXN0ZWQ/OiBzdHJpbmcsIHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XG4gICAgY29uc3QgZXhwbGljaXQgPSBzdHJpbmcudHJpbVRvTnVsbChyZXF1ZXN0ZWQgPz8gdGhpcy5jb25maWcuZW1iZWRkaW5nTW9kZWwpO1xuICAgIC8vIEFuIGV4cGxpY2l0IG5hbWUgdGhhdCBhbHJlYWR5IGxvb2tzIGxpa2UgYW4gZW5kcG9pbnQgaWQgKG5vIHdoaXRlc3BhY2UpXG4gICAgLy8gaXMgdXNlZCB2ZXJiYXRpbSAtIG5vIG5lZWQgdG8gZmV0Y2ggYW5kIGZ1enp5LW1hdGNoIHRoZSBsaXZlIGNhdGFsb2d1ZS5cbiAgICAvLyBBIGdlbnVpbmVseSBsb29zZSBuYW1lIChlLmcuIFwiZ3RlIGxhcmdlXCIpIHN0aWxsIHJlc29sdmVzIGFnYWluc3QgaXQuXG4gICAgaWYgKGV4cGxpY2l0ICYmICEvXFxzLy50ZXN0KGV4cGxpY2l0KSkgcmV0dXJuIGV4cGxpY2l0O1xuICAgIHNpZ25hbD8udGhyb3dJZkFib3J0ZWQoKTtcbiAgICBjb25zdCBjbGllbnQgPSBkZWZhdWx0QXBwS2l0V29ya3NwYWNlQ2xpZW50KCk7XG4gICAgY29uc3QgaG9zdCA9IChhd2FpdCBjbGllbnQuY29uZmlnLmdldEhvc3QoKSkudG9TdHJpbmcoKTtcbiAgICBjb25zdCBlbmRwb2ludHMgPSBhd2FpdCBzZXJ2aW5nLmxpc3RTZXJ2aW5nRW5kcG9pbnRzKGNsaWVudCwgaG9zdCk7XG4gICAgc2lnbmFsPy50aHJvd0lmQWJvcnRlZCgpO1xuICAgIGNvbnN0IHsgbW9kZWxJZCB9ID0gbW9kZWxSZXNvbHZlLnJlc29sdmVNb2RlbChlbmRwb2ludHMsIHtcbiAgICAgIC4uLihleHBsaWNpdCA/IHsgZXhwbGljaXQgfSA6IHsgbW9kZWxDbGFzczogTW9kZWxDbGFzcy5FbWJlZGRpbmcgfSksXG4gICAgfSk7XG4gICAgcmV0dXJuIHN0cmluZy50cmltVG9OdWxsKG1vZGVsSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVtYmVkIHRleHQgdmlhIGEgRGF0YWJyaWNrcyBlbWJlZGRpbmcgc2VydmluZyBlbmRwb2ludCwgcmV0dXJuaW5nIG9uZVxuICAgKiB2ZWN0b3IgcGVyIGlucHV0LiBVc2VkIHRvIHNlZWQgYSBkaXJlY3QtYWNjZXNzIGluZGV4IGFuZCB0byB0dXJuIGEgc2VhcmNoXG4gICAqIHF1ZXJ5IGludG8gYSBxdWVyeSB2ZWN0b3IgLSBEYXRhYnJpY2tzIG9ubHkgbWFuYWdlcyBlbWJlZGRpbmdzIGZvciBEZWx0YVxuICAgKiBTeW5jIGluZGV4ZXMsIHNvIGEgZGlyZWN0LWFjY2VzcyBpbmRleCAobm8gRGVsdGEgdGFibGUsIG5vIHdhcmVob3VzZSkgbmVlZHNcbiAgICogdGhlIGNsaWVudCB0byBlbWJlZCBvbiB3cml0ZSBhbmQgb24gcXVlcnkuIFRoZSBlbmRwb2ludCBpcyByZXNvbHZlZCB0aGVcbiAgICogc2FtZSB3YXkgYXMgZm9yIGluZGV4IGNyZWF0aW9uIHdoZW4gbm90IG5hbWVkLlxuICAgKi9cbiAgYXN5bmMgZW1iZWQodGV4dHM6IHN0cmluZ1tdLCBtb2RlbD86IHN0cmluZywgc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPG51bWJlcltdW10+IHtcbiAgICBpZiAodGV4dHMubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG4gICAgY29uc3QgZW5kcG9pbnQgPSBhd2FpdCB0aGlzLnJlc29sdmVFbWJlZGRpbmdNb2RlbChtb2RlbCwgc2lnbmFsKTtcbiAgICBpZiAoIWVuZHBvaW50KSB7XG4gICAgICB0aHJvdyBuZXcgRXhlY3V0aW9uRXJyb3IoXCJzZWFyY2g6IGNvdWxkIG5vdCByZXNvbHZlIGFuIGVtYmVkZGluZyBtb2RlbCB0byBlbWJlZCB0ZXh0XCIsIHtcbiAgICAgICAgY29udGV4dDogeyBvcGVyYXRpb246IFwiZW1iZWRcIiB9LFxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLndpdGhDbGllbnQoXCJlbWJlZFwiLCBzaWduYWwsIGFzeW5jIChjbGllbnQpID0+IHtcbiAgICAgIGNvbnN0IGhvc3QgPSAoYXdhaXQgY2xpZW50LmNvbmZpZy5nZXRIb3N0KCkpLnRvU3RyaW5nKCk7XG4gICAgICBjb25zdCB1cmwgPSBpbnZva2UuaW52b2NhdGlvbnNVcmwoaG9zdCwgZW5kcG9pbnQpO1xuICAgICAgY29uc3QgaGVhZGVycyA9IGF3YWl0IGludm9rZS5hdXRoSGVhZGVycyhjbGllbnQpO1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHtcbiAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgaGVhZGVyczogeyAuLi5oZWFkZXJzLCBcImNvbnRlbnQtdHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIiB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGlucHV0OiB0ZXh0cyB9KSxcbiAgICAgICAgLi4uKHNpZ25hbCA/IHsgc2lnbmFsIH0gOiB7fSksXG4gICAgICB9KTtcbiAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgdGhyb3cgbmV3IEV4ZWN1dGlvbkVycm9yKFxuICAgICAgICAgIGBzZWFyY2g6IGVtYmVkZGluZyBlbmRwb2ludCAke2VuZHBvaW50fSBmYWlsZWQgKCR7cmVzcG9uc2Uuc3RhdHVzfSlgLFxuICAgICAgICAgIHsgY29udGV4dDogeyBvcGVyYXRpb246IFwiZW1iZWRcIiB9IH0sXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjb25zdCBib2R5ID0gKGF3YWl0IHJlc3BvbnNlLmpzb24oKSkgYXMgeyBkYXRhPzogQXJyYXk8eyBlbWJlZGRpbmc6IG51bWJlcltdIH0+IH07XG4gICAgICBjb25zdCB2ZWN0b3JzID0gKGJvZHkuZGF0YSA/PyBbXSkubWFwKChyb3cpID0+IHJvdy5lbWJlZGRpbmcpO1xuICAgICAgaWYgKHZlY3RvcnMubGVuZ3RoICE9PSB0ZXh0cy5sZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEV4ZWN1dGlvbkVycm9yKFwic2VhcmNoOiBlbWJlZGRpbmcgcmVzcG9uc2UgZGlkIG5vdCBtYXRjaCB0aGUgaW5wdXQgY291bnRcIiwge1xuICAgICAgICAgIGNvbnRleHQ6IHsgb3BlcmF0aW9uOiBcImVtYmVkXCIgfSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdmVjdG9ycztcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBUaGUgdmVjdG9yIGRpbWVuc2lvbiBhIG1vZGVsIHByb2R1Y2VzIChlbWJlZHMgYSBwcm9iZSBzdHJpbmcgb25jZSkuICovXG4gIHByaXZhdGUgYXN5bmMgZW1iZWRkaW5nRGltZW5zaW9uKG1vZGVsPzogc3RyaW5nLCBzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3QgW3ZlY3Rvcl0gPSBhd2FpdCB0aGlzLmVtYmVkKFtcImRpbWVuc2lvbiBwcm9iZVwiXSwgbW9kZWwsIHNpZ25hbCk7XG4gICAgaWYgKCF2ZWN0b3IgfHwgdmVjdG9yLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEV4ZWN1dGlvbkVycm9yKFwic2VhcmNoOiBjb3VsZCBub3QgZGV0ZXJtaW5lIHRoZSBlbWJlZGRpbmcgZGltZW5zaW9uXCIsIHtcbiAgICAgICAgY29udGV4dDogeyBvcGVyYXRpb246IFwiY3JlYXRlSW5kZXhcIiB9LFxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB2ZWN0b3IubGVuZ3RoO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhbiBBSSBTZWFyY2ggaW5kZXggd2l0aCBhcyBsaXR0bGUgY2VyZW1vbnkgYXMgcG9zc2libGUuIFR3byBzaGFwZXM6XG4gICAqXG4gICAqICAgLSAqKkRlbHRhIFN5bmMqKiAodGhlIGRlZmF1bHQpOiBwYXNzIGBzb3VyY2VUYWJsZWA7IERhdGFicmlja3MgY29tcHV0ZXNcbiAgICogICAgIGVtYmVkZGluZ3MgZnJvbSB0aGUgdGV4dCBjb2x1bW4gYW5kIGtlZXBzIHRoZSBpbmRleCBzeW5jZWQuIFRoZVxuICAgKiAgICAgZW1iZWRkaW5nIG1vZGVsIGlzIHJlc29sdmVkIGF1dG9tYXRpY2FsbHkgd2hlbiBub3QgbmFtZWQuXG4gICAqICAgLSAqKkRpcmVjdCBBY2Nlc3MqKjogb21pdCBgc291cmNlVGFibGVgIGFuZCBwYXNzIGBlbWJlZGRpbmdEaW1lbnNpb25gO1xuICAgKiAgICAgeW91IHdyaXRlIHZlY3RvcnMgeW91cnNlbGYgdmlhIHtAbGluayBhZGREb2N1bWVudHN9LlxuICAgKlxuICAgKiBFdmVyeXRoaW5nIGVsc2UgaW5mZXJzOiB0aGUgZW5kcG9pbnQgZnJvbSB0aGUgcGx1Z2luIGNvbmZpZywgdGhlIHByaW1hcnlcbiAgICoga2V5IChgaWRgKSwgdGhlIHRleHQgY29sdW1uIChgdGV4dGAgLyBgY29udGVudGAgLyBgYm9keWApLCBhbmQgdGhlIHZlY3RvclxuICAgKiBjb2x1bW4gKGBlbWJlZGRpbmdgKS4gUmV0dXJucyB0aGUgY3JlYXRlZCBpbmRleCdzIHtAbGluayBJbmRleEluZm99LlxuICAgKi9cbiAgYXN5bmMgY3JlYXRlSW5kZXgobmFtZTogc3RyaW5nLCBvcHRpb25zOiBDcmVhdGVJbmRleE9wdGlvbnMgPSB7fSk6IFByb21pc2U8SW5kZXhJbmZvPiB7XG4gICAgdGhpcy5yZXF1aXJlTGlmZWN5Y2xlKFwiY3JlYXRlSW5kZXhcIik7XG4gICAgY29uc3QgZW5kcG9pbnQgPSBvcHRpb25zLmVuZHBvaW50ID8/IHRoaXMuY29uZmlnLmVuZHBvaW50O1xuICAgIGlmICghZW5kcG9pbnQpIHtcbiAgICAgIHRocm93IG5ldyBFeGVjdXRpb25FcnJvcihcbiAgICAgICAgXCJzZWFyY2g6IG5vIFZlY3RvciBTZWFyY2ggZW5kcG9pbnQgY29uZmlndXJlZDsgcGFzcyBgZW5kcG9pbnRgIG9yIHNldCBpdCBvbiB0aGUgcGx1Z2luXCIsXG4gICAgICAgIHsgY29udGV4dDogeyBvcGVyYXRpb246IFwiY3JlYXRlSW5kZXhcIiB9IH0sXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBwcmltYXJ5S2V5ID0gb3B0aW9ucy5wcmltYXJ5S2V5ID8/IFwiaWRcIjtcbiAgICBjb25zdCBkaXJlY3QgPSAhb3B0aW9ucy5zb3VyY2VUYWJsZTtcbiAgICBjb25zdCBzb3VyY2VDb2x1bW4gPSBvcHRpb25zLmVtYmVkZGluZ1NvdXJjZUNvbHVtbiA/PyBcInRleHRcIjtcbiAgICBjb25zdCB2ZWN0b3JDb2x1bW4gPSBvcHRpb25zLmVtYmVkZGluZ1ZlY3RvckNvbHVtbiA/PyBcImVtYmVkZGluZ1wiO1xuXG4gICAgLy8gRGVsdGEgU3luYyBsZXRzIERhdGFicmlja3MgZW1iZWQgYSBzb3VyY2UgY29sdW1uLCBzbyBpdCBuZWVkcyBhbiBlbWJlZGRpbmdcbiAgICAvLyBtb2RlbC4gQSBkaXJlY3QtYWNjZXNzIGluZGV4IHN0b3JlcyB2ZWN0b3JzIFlPVSBzdXBwbHkgKERhdGFicmlja3Mgb25seVxuICAgIC8vIHN1cHBvcnRzIG1hbmFnZWQgZW1iZWRkaW5ncyBvbiBEZWx0YSBTeW5jKSwgc28gaXQgbmVlZHMgYSBkaW1lbnNpb247IHdlXG4gICAgLy8gcmVzb2x2ZSBvbmUgZnJvbSB0aGUgZW1iZWRkaW5nIG1vZGVsIHdoZW4gbm90IGdpdmVuIHNvIGEgZGlyZWN0LWFjY2Vzc1xuICAgIC8vIGluZGV4IHN0aWxsIHdvcmtzIHdpdGggemVybyBleHRyYSBjb25maWcgKGVtYmVkIHZpYSBgZW1iZWQoKWAgb24gc2VlZCArXG4gICAgLy8gcXVlcnkgLSBzZWUgYHByb3Zpc2lvbmAgLyBgc2VhcmNoYCkuXG4gICAgY29uc3QgZW1iZWRkaW5nTW9kZWwgPVxuICAgICAgKGF3YWl0IHRoaXMucmVzb2x2ZUVtYmVkZGluZ01vZGVsKG9wdGlvbnMuZW1iZWRkaW5nTW9kZWwsIG9wdGlvbnMuc2lnbmFsKSkgPz8gdW5kZWZpbmVkO1xuICAgIGlmICghZW1iZWRkaW5nTW9kZWwpIHtcbiAgICAgIHRocm93IG5ldyBFeGVjdXRpb25FcnJvcihcbiAgICAgICAgXCJzZWFyY2g6IGNvdWxkIG5vdCByZXNvbHZlIGFuIGVtYmVkZGluZyBtb2RlbDsgcGFzcyBgZW1iZWRkaW5nTW9kZWxgXCIsXG4gICAgICAgIHsgY29udGV4dDogeyBvcGVyYXRpb246IFwiY3JlYXRlSW5kZXhcIiB9IH0sXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBkaW1lbnNpb24gPVxuICAgICAgb3B0aW9ucy5lbWJlZGRpbmdEaW1lbnNpb24gPz8gKGF3YWl0IHRoaXMuZW1iZWRkaW5nRGltZW5zaW9uKGVtYmVkZGluZ01vZGVsLCBvcHRpb25zLnNpZ25hbCkpO1xuXG4gICAgY29uc3Qgc2NoZW1hID0ge1xuICAgICAgW3ByaW1hcnlLZXldOiBcInN0cmluZ1wiLFxuICAgICAgW3NvdXJjZUNvbHVtbl06IFwic3RyaW5nXCIsXG4gICAgICAuLi4ob3B0aW9ucy5zY2hlbWEgPz8ge30pLFxuICAgIH07XG5cbiAgICBjb25zdCBkaXJlY3RTcGVjID0ge1xuICAgICAgZGlyZWN0X2FjY2Vzc19pbmRleF9zcGVjOiB7XG4gICAgICAgIGVtYmVkZGluZ192ZWN0b3JfY29sdW1uczogW3sgbmFtZTogdmVjdG9yQ29sdW1uLCBlbWJlZGRpbmdfZGltZW5zaW9uOiBkaW1lbnNpb24gfV0sXG4gICAgICAgIHNjaGVtYV9qc29uOiBKU09OLnN0cmluZ2lmeSh7IC4uLnNjaGVtYSwgW3ZlY3RvckNvbHVtbl06IGBhcnJheTxmbG9hdD5gIH0pLFxuICAgICAgfSxcbiAgICB9O1xuXG4gICAgYXdhaXQgdGhpcy53aXRoQ2xpZW50KFwiY3JlYXRlSW5kZXhcIiwgb3B0aW9ucy5zaWduYWwsIChjbGllbnQsIGNvbnRleHQpID0+XG4gICAgICBjbGllbnQudmVjdG9yU2VhcmNoSW5kZXhlcy5jcmVhdGVJbmRleChcbiAgICAgICAge1xuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgZW5kcG9pbnRfbmFtZTogZW5kcG9pbnQsXG4gICAgICAgICAgcHJpbWFyeV9rZXk6IHByaW1hcnlLZXksXG4gICAgICAgICAgaW5kZXhfdHlwZTogZGlyZWN0ID8gXCJESVJFQ1RfQUNDRVNTXCIgOiBcIkRFTFRBX1NZTkNcIixcbiAgICAgICAgICAuLi4oZGlyZWN0XG4gICAgICAgICAgICA/IGRpcmVjdFNwZWNcbiAgICAgICAgICAgIDoge1xuICAgICAgICAgICAgICAgIGRlbHRhX3N5bmNfaW5kZXhfc3BlYzoge1xuICAgICAgICAgICAgICAgICAgc291cmNlX3RhYmxlOiBvcHRpb25zLnNvdXJjZVRhYmxlLFxuICAgICAgICAgICAgICAgICAgcGlwZWxpbmVfdHlwZTogb3B0aW9ucy5waXBlbGluZVR5cGUgPz8gXCJUUklHR0VSRURcIixcbiAgICAgICAgICAgICAgICAgIGVtYmVkZGluZ19zb3VyY2VfY29sdW1uczogW1xuICAgICAgICAgICAgICAgICAgICB7IG5hbWU6IHNvdXJjZUNvbHVtbiwgZW1iZWRkaW5nX21vZGVsX2VuZHBvaW50X25hbWU6IGVtYmVkZGluZ01vZGVsIH0sXG4gICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgLi4uKG9wdGlvbnMuY29sdW1uc1RvU3luYyAmJiBvcHRpb25zLmNvbHVtbnNUb1N5bmMubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgICAgICA/IHsgY29sdW1uc190b19zeW5jOiBvcHRpb25zLmNvbHVtbnNUb1N5bmMgfVxuICAgICAgICAgICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgfSxcbiAgICAgICAgY29udGV4dCxcbiAgICAgICksXG4gICAgKTtcbiAgICBsb2dnZXIuaW5mbyhcImluZGV4LWNyZWF0ZWRcIiwge1xuICAgICAgaW5kZXg6IG5hbWUsXG4gICAgICBlbmRwb2ludCxcbiAgICAgIHR5cGU6IGRpcmVjdCA/IFwiRElSRUNUX0FDQ0VTU1wiIDogXCJERUxUQV9TWU5DXCIsXG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXMuZ2V0SW5kZXgobmFtZSwgb3B0aW9ucy5zaWduYWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSB0aGUgaW5kZXggaWYgaXQgZG9lcyBub3QgYWxyZWFkeSBleGlzdCwgb3RoZXJ3aXNlIHJldHVybiB0aGVcbiAgICogZXhpc3Rpbmcgb25lLiBJZGVtcG90ZW50IC0gc2FmZSB0byBjYWxsIG9uIGV2ZXJ5IGJvb3QgdG8gZ3VhcmFudGVlIGFuXG4gICAqIGluZGV4IGlzIHByZXNlbnQuXG4gICAqL1xuICBhc3luYyBlbnN1cmVJbmRleChuYW1lOiBzdHJpbmcsIG9wdGlvbnM6IENyZWF0ZUluZGV4T3B0aW9ucyA9IHt9KTogUHJvbWlzZTxJbmRleEluZm8+IHtcbiAgICB0aGlzLnJlcXVpcmVMaWZlY3ljbGUoXCJlbnN1cmVJbmRleFwiKTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0SW5kZXgobmFtZSwgb3B0aW9ucy5zaWduYWwpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlSW5kZXgobmFtZSwgb3B0aW9ucyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEVuc3VyZSBhbiBpbmRleCBleGlzdHMsIGlzIG9ubGluZSwgYW5kIChvcHRpb25hbGx5KSBob2xkcyBzZWVkIGRhdGEgLSB0aGVcbiAgICogXCJ3aXJlIHVwIGEgcmVhbCBpbmRleCBvbiBib290XCIgcGF0aC4gSWRlbXBvdGVudCBhbmQgY2hlYXAgdG8gY2FsbCBldmVyeVxuICAgKiBib290OiBpdCBjcmVhdGVzIHRoZSBlbmRwb2ludCBhbmQgaW5kZXggb25seSBpZiBtaXNzaW5nLCB3YWl0cyBmb3IgdGhlbSB0b1xuICAgKiBjb21lIG9ubGluZSwgYW5kIHNlZWRzIGRvY3VtZW50cyBPTkxZIHdoZW4gdGhlIGluZGV4IGlzIHN0aWxsIGVtcHR5LlxuICAgKlxuICAgKiBGb3IgdGhlIGRlbW8vZHVtbXktZGF0YSBjYXNlIHRoaXMgbmVlZHMgbm8gRGVsdGEgdGFibGUgYW5kIG5vIHdhcmVob3VzZTpcbiAgICogdGhlIGRlZmF1bHQgaXMgYSBNQU5BR0VEIGRpcmVjdC1hY2Nlc3MgaW5kZXggKERhdGFicmlja3MgZW1iZWRzIHRoZSBgdGV4dGBcbiAgICogY29sdW1uIG9uIHdyaXRlIGFuZCBxdWVyeSksIHNvIHNlZWRpbmcgaXMganVzdCBhbiBgYWRkRG9jdW1lbnRzYCBvZiBwbGFpblxuICAgKiByb3dzIGFuZCBzZWFyY2gtYnktdGV4dCB3b3JrcyBpbW1lZGlhdGVseS5cbiAgICovXG4gIGFzeW5jIHByb3Zpc2lvbihuYW1lOiBzdHJpbmcsIG9wdGlvbnM6IFByb3Zpc2lvbk9wdGlvbnMgPSB7fSk6IFByb21pc2U8SW5kZXhJbmZvPiB7XG4gICAgdGhpcy5yZXF1aXJlTGlmZWN5Y2xlKFwicHJvdmlzaW9uXCIpO1xuICAgIGNvbnN0IHdhaXQgPSBvcHRpb25zLndhaXQgPz8gdHJ1ZTtcbiAgICBjb25zdCB0aW1lb3V0TXMgPSBvcHRpb25zLnRpbWVvdXRNcyA/PyAyMCAqIDYwICogMTAwMDtcbiAgICBjb25zdCBlbmRwb2ludCA9IG9wdGlvbnMuZW5kcG9pbnQgPz8gdGhpcy5jb25maWcuZW5kcG9pbnQ7XG4gICAgaWYgKGVuZHBvaW50KSBhd2FpdCB0aGlzLmVuc3VyZUVuZHBvaW50KGVuZHBvaW50LCB7IHdhaXQsIHNpZ25hbDogb3B0aW9ucy5zaWduYWwgfSk7XG5cbiAgICBjb25zdCB7IHNlZWQ6IF9zZWVkLCB3YWl0OiBfd2FpdCwgdGltZW91dE1zOiBfdGltZW91dE1zLCAuLi5jcmVhdGVPcHRpb25zIH0gPSBvcHRpb25zO1xuICAgIGxldCBpbmZvID0gYXdhaXQgdGhpcy5lbnN1cmVJbmRleChuYW1lLCBjcmVhdGVPcHRpb25zKTtcblxuICAgIGlmICh3YWl0ICYmICFpbmZvLnJlYWR5KSBpbmZvID0gYXdhaXQgdGhpcy53YWl0Rm9ySW5kZXhSZWFkeShuYW1lLCB0aW1lb3V0TXMsIG9wdGlvbnMuc2lnbmFsKTtcblxuICAgIGNvbnN0IHNlZWQgPSBvcHRpb25zLnNlZWQgPz8gW107XG4gICAgaWYgKHNlZWQubGVuZ3RoID4gMCAmJiAoaW5mby5yb3dDb3VudCA/PyAwKSA9PT0gMCkge1xuICAgICAgY29uc3Qgc291cmNlQ29sdW1uID0gb3B0aW9ucy5lbWJlZGRpbmdTb3VyY2VDb2x1bW4gPz8gXCJ0ZXh0XCI7XG4gICAgICBjb25zdCB2ZWN0b3JDb2x1bW4gPSBvcHRpb25zLmVtYmVkZGluZ1ZlY3RvckNvbHVtbiA/PyBcImVtYmVkZGluZ1wiO1xuICAgICAgLy8gRGlyZWN0LWFjY2VzcyBpbmRleGVzIHN0b3JlIHZlY3RvcnMgd2Ugc3VwcGx5LCBzbyBlbWJlZCB0aGUgdGV4dCBjb2x1bW5cbiAgICAgIC8vIGZvciBhbnkgc2VlZCByb3cgdGhhdCBkaWQgbm90IGFscmVhZHkgY2FycnkgYSB2ZWN0b3IuXG4gICAgICBjb25zdCBuZWVkRW1iZWQgPSBzZWVkLnNvbWUoKGRvYykgPT4gZG9jW3ZlY3RvckNvbHVtbl0gPT09IHVuZGVmaW5lZCk7XG4gICAgICBsZXQgcm93cyA9IHNlZWQ7XG4gICAgICBpZiAobmVlZEVtYmVkKSB7XG4gICAgICAgIGNvbnN0IHRleHRzID0gc2VlZC5tYXAoKGRvYykgPT4gc3RyaW5nLnRyaW1Ub0VtcHR5KFN0cmluZyhkb2Nbc291cmNlQ29sdW1uXSA/PyBcIlwiKSkpO1xuICAgICAgICBjb25zdCB2ZWN0b3JzID0gYXdhaXQgdGhpcy5lbWJlZCh0ZXh0cywgb3B0aW9ucy5lbWJlZGRpbmdNb2RlbCwgb3B0aW9ucy5zaWduYWwpO1xuICAgICAgICByb3dzID0gc2VlZC5tYXAoKGRvYywgaSkgPT5cbiAgICAgICAgICBkb2NbdmVjdG9yQ29sdW1uXSA9PT0gdW5kZWZpbmVkID8geyAuLi5kb2MsIFt2ZWN0b3JDb2x1bW5dOiB2ZWN0b3JzW2ldIH0gOiBkb2MsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBhd2FpdCB0aGlzLmFkZERvY3VtZW50cyhuYW1lLCByb3dzLCBvcHRpb25zLnNpZ25hbCk7XG4gICAgICBsb2dnZXIuaW5mbyhcImluZGV4LXNlZWRlZFwiLCB7IGluZGV4OiBuYW1lLCBjb3VudDogcm93cy5sZW5ndGggfSk7XG4gICAgICBpbmZvID0gYXdhaXQgdGhpcy5nZXRJbmRleChuYW1lLCBvcHRpb25zLnNpZ25hbCk7XG4gICAgfVxuICAgIHJldHVybiBpbmZvO1xuICB9XG5cbiAgLyoqIFBvbGwgYW4gaW5kZXggdW50aWwgaXQgcmVwb3J0cyByZWFkeSwgb3IgdGhyb3cgYWZ0ZXIge0BsaW5rIHRpbWVvdXRNc30uICovXG4gIHByaXZhdGUgYXN5bmMgd2FpdEZvckluZGV4UmVhZHkoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHRpbWVvdXRNczogbnVtYmVyLFxuICAgIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuICApOiBQcm9taXNlPEluZGV4SW5mbz4ge1xuICAgIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIHRpbWVvdXRNcztcbiAgICBsZXQgaW5mbyA9IGF3YWl0IHRoaXMuZ2V0SW5kZXgobmFtZSwgc2lnbmFsKTtcbiAgICB3aGlsZSAoIWluZm8ucmVhZHkpIHtcbiAgICAgIGlmIChEYXRlLm5vdygpID4gZGVhZGxpbmUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEV4ZWN1dGlvbkVycm9yKGBzZWFyY2g6IGluZGV4ICR7bmFtZX0gZGlkIG5vdCBjb21lIG9ubGluZSBpbiB0aW1lYCwge1xuICAgICAgICAgIGNvbnRleHQ6IHsgb3BlcmF0aW9uOiBcInByb3Zpc2lvblwiIH0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgYXdhaXQgc2hhcmVkQXN5bmMuc2xlZXAoNTAwMCwgc2lnbmFsKTtcbiAgICAgIGluZm8gPSBhd2FpdCB0aGlzLmdldEluZGV4KG5hbWUsIHNpZ25hbCk7XG4gICAgfVxuICAgIHJldHVybiBpbmZvO1xuICB9XG5cbiAgLyoqIFRyaWdnZXIgYSBzeW5jIG9mIGEgRGVsdGEgU3luYyBpbmRleCBmcm9tIGl0cyBzb3VyY2UgdGFibGUuICovXG4gIGFzeW5jIHN5bmNJbmRleChyZWZlcmVuY2U6IHN0cmluZywgc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnJlcXVpcmVMaWZlY3ljbGUoXCJzeW5jSW5kZXhcIik7XG4gICAgY29uc3QgbmFtZSA9IHRoaXMucmVxdWlyZUluZGV4TmFtZShyZWZlcmVuY2UsIFwic3luY0luZGV4XCIpO1xuICAgIGF3YWl0IHRoaXMud2l0aENsaWVudChcInN5bmNJbmRleFwiLCBzaWduYWwsIChjbGllbnQsIGNvbnRleHQpID0+XG4gICAgICBjbGllbnQudmVjdG9yU2VhcmNoSW5kZXhlcy5zeW5jSW5kZXgoeyBpbmRleF9uYW1lOiBuYW1lIH0sIGNvbnRleHQpLFxuICAgICk7XG4gICAgbG9nZ2VyLmluZm8oXCJpbmRleC1zeW5jZWRcIiwgeyBpbmRleDogbmFtZSB9KTtcbiAgfVxuXG4gIC8qKiBEZWxldGUgYW4gaW5kZXguICovXG4gIGFzeW5jIGRlbGV0ZUluZGV4KHJlZmVyZW5jZTogc3RyaW5nLCBzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMucmVxdWlyZUxpZmVjeWNsZShcImRlbGV0ZUluZGV4XCIpO1xuICAgIGNvbnN0IG5hbWUgPSB0aGlzLnJlcXVpcmVJbmRleE5hbWUocmVmZXJlbmNlLCBcImRlbGV0ZUluZGV4XCIpO1xuICAgIGF3YWl0IHRoaXMud2l0aENsaWVudChcImRlbGV0ZUluZGV4XCIsIHNpZ25hbCwgKGNsaWVudCwgY29udGV4dCkgPT5cbiAgICAgIGNsaWVudC52ZWN0b3JTZWFyY2hJbmRleGVzLmRlbGV0ZUluZGV4KHsgaW5kZXhfbmFtZTogbmFtZSB9LCBjb250ZXh0KSxcbiAgICApO1xuICAgIGxvZ2dlci5pbmZvKFwiaW5kZXgtZGVsZXRlZFwiLCB7IGluZGV4OiBuYW1lIH0pO1xuICB9XG5cbiAgLyoqIExpc3QgdGhlIGluZGV4ZXMgaG9zdGVkIG9uIGEgVmVjdG9yIFNlYXJjaCBlbmRwb2ludCAobmFtZSArIHR5cGUgb25seSkuICovXG4gIGFzeW5jIGxpc3RJbmRleGVzKGVuZHBvaW50Pzogc3RyaW5nLCBzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICB0aGlzLnJlcXVpcmVMaWZlY3ljbGUoXCJsaXN0SW5kZXhlc1wiKTtcbiAgICBjb25zdCBlbmRwb2ludE5hbWUgPSBlbmRwb2ludCA/PyB0aGlzLmNvbmZpZy5lbmRwb2ludDtcbiAgICBpZiAoIWVuZHBvaW50TmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEV4ZWN1dGlvbkVycm9yKFwic2VhcmNoOiBubyBlbmRwb2ludCBjb25maWd1cmVkIHRvIGxpc3QgaW5kZXhlc1wiLCB7XG4gICAgICAgIGNvbnRleHQ6IHsgb3BlcmF0aW9uOiBcImxpc3RJbmRleGVzXCIgfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy53aXRoQ2xpZW50KFwibGlzdEluZGV4ZXNcIiwgc2lnbmFsLCBhc3luYyAoY2xpZW50LCBjb250ZXh0KSA9PiB7XG4gICAgICBjb25zdCBuYW1lczogc3RyaW5nW10gPSBbXTtcbiAgICAgIGZvciBhd2FpdCAoY29uc3QgaW5kZXggb2YgY2xpZW50LnZlY3RvclNlYXJjaEluZGV4ZXMubGlzdEluZGV4ZXMoXG4gICAgICAgIHsgZW5kcG9pbnRfbmFtZTogZW5kcG9pbnROYW1lIH0sXG4gICAgICAgIGNvbnRleHQsXG4gICAgICApKSB7XG4gICAgICAgIGlmIChpbmRleC5uYW1lKSBuYW1lcy5wdXNoKGluZGV4Lm5hbWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5hbWVzO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuc3VyZSBhIFZlY3RvciBTZWFyY2ggZW5kcG9pbnQgZXhpc3RzLCBjcmVhdGluZyBhIGBTVEFOREFSRGAgb25lIHdoZW4gaXRcbiAgICogZG9lcyBub3QuIE9wdGlvbmFsbHkgd2FpdCBmb3IgaXQgdG8gY29tZSBvbmxpbmUuIElkZW1wb3RlbnQuXG4gICAqL1xuICBhc3luYyBlbnN1cmVFbmRwb2ludChuYW1lPzogc3RyaW5nLCBvcHRpb25zOiBFbnN1cmVFbmRwb2ludE9wdGlvbnMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMucmVxdWlyZUxpZmVjeWNsZShcImVuc3VyZUVuZHBvaW50XCIpO1xuICAgIGNvbnN0IGVuZHBvaW50ID0gbmFtZSA/PyB0aGlzLmNvbmZpZy5lbmRwb2ludDtcbiAgICBpZiAoIWVuZHBvaW50KSB7XG4gICAgICB0aHJvdyBuZXcgRXhlY3V0aW9uRXJyb3IoXCJzZWFyY2g6IG5vIGVuZHBvaW50IG5hbWUgdG8gZW5zdXJlXCIsIHtcbiAgICAgICAgY29udGV4dDogeyBvcGVyYXRpb246IFwiZW5zdXJlRW5kcG9pbnRcIiB9LFxuICAgICAgfSk7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMud2l0aENsaWVudChcImVuc3VyZUVuZHBvaW50XCIsIG9wdGlvbnMuc2lnbmFsLCBhc3luYyAoY2xpZW50LCBjb250ZXh0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBjbGllbnQudmVjdG9yU2VhcmNoRW5kcG9pbnRzLmdldEVuZHBvaW50KHsgZW5kcG9pbnRfbmFtZTogZW5kcG9pbnQgfSwgY29udGV4dCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBjb25zdCB3YWl0ZXIgPSBhd2FpdCBjbGllbnQudmVjdG9yU2VhcmNoRW5kcG9pbnRzLmNyZWF0ZUVuZHBvaW50KFxuICAgICAgICAgIHsgbmFtZTogZW5kcG9pbnQsIGVuZHBvaW50X3R5cGU6IFwiU1RBTkRBUkRcIiB9LFxuICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICk7XG4gICAgICAgIGxvZ2dlci5pbmZvKFwiZW5kcG9pbnQtY3JlYXRlZFwiLCB7IGVuZHBvaW50IH0pO1xuICAgICAgICBpZiAob3B0aW9ucy53YWl0KSBhd2FpdCB3YWl0ZXIud2FpdCgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgdGhlIHdvcmtzcGFjZSBjbGllbnQgYW5kIHJ1biBvbmUgY2FsbCB1bmRlciBhIGJvdW5kZWQgdGltZW91dC4gVGhlXG4gICAqIGNhbGxlcidzIHNpZ25hbCAoaWYgYW55KSBhbmQgYSB0aW1lb3V0IGFyZSBtZXJnZWQgaW50byBvbmUgU0RLIGBDb250ZXh0YFxuICAgKiB2aWEge0BsaW5rIGFwcGtpdC5kYXRhYnJpY2tzLnRvQ29udGV4dH0sIHNvIGVpdGhlciB1bndpbmRzIHRoZSByZXF1ZXN0LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB3aXRoQ2xpZW50PFQ+KFxuICAgIG9wZXJhdGlvbjogc3RyaW5nLFxuICAgIHNpZ25hbDogQWJvcnRTaWduYWwgfCB1bmRlZmluZWQsXG4gICAgZm46IChjbGllbnQ6IFdvcmtzcGFjZUNsaWVudExpa2UsIGNvbnRleHQ/OiBDb250ZXh0KSA9PiBQcm9taXNlPFQ+LFxuICApOiBQcm9taXNlPFQ+IHtcbiAgICBjb25zdCBjbGllbnQgPSB0aGlzLndvcmtzcGFjZUNsaWVudEZhY3RvcnkoKTtcbiAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgIGNvbnN0IHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiBjb250cm9sbGVyLmFib3J0KCksIHRoaXMuY29uZmlnLnRpbWVvdXRNcyk7XG4gICAgY29uc3QgY29udGV4dCA9IGRhdGFicmlja3MudG9Db250ZXh0KGNvbnRyb2xsZXIsIHNpZ25hbCk7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBmbihjbGllbnQsIGNvbnRleHQpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaWYgKHNpZ25hbD8uYWJvcnRlZCkgdGhyb3cgRXhlY3V0aW9uRXJyb3IuY2FuY2VsZWQoKTtcbiAgICAgIGxvZ2dlci53YXJuKFwiZXhlY3V0aW9uLWZhaWxlZFwiLCB7IG9wZXJhdGlvbiB9KTtcbiAgICAgIHRocm93IGVycjtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqIFRoZSBPQk8gd29ya3NwYWNlIGNsaWVudCBmcm9tIHRoZSBhY3RpdmUgY29udGV4dCwgb3IgYSBzZXJ2aWNlLXByaW5jaXBhbCBjbGllbnQuICovXG5mdW5jdGlvbiBkZWZhdWx0V29ya3NwYWNlQ2xpZW50KCk6IFdvcmtzcGFjZUNsaWVudExpa2Uge1xuICByZXR1cm4gZGVmYXVsdEFwcEtpdFdvcmtzcGFjZUNsaWVudCgpLnRvTGVnYWN5V29ya3NwYWNlQ2xpZW50KCk7XG59XG5cbi8qKiBBcHBLaXQgd29ya3NwYWNlLWNsaWVudCBmYWNhZGUgZnJvbSB0aGUgYWN0aXZlIHJlcXVlc3Qgb3Igc2VydmljZSBjb250ZXh0LiAqL1xuZnVuY3Rpb24gZGVmYXVsdEFwcEtpdFdvcmtzcGFjZUNsaWVudCgpOiBhcHBraXQuV29ya3NwYWNlQ2xpZW50TGlrZSB7XG4gIGNvbnN0IGN0eCA9IGFwcGtpdC50cnlHZXRFeGVjdXRpb25Db250ZXh0KCk7XG4gIGlmIChjdHg/LmNsaWVudCkgcmV0dXJuIGN0eC5jbGllbnQ7XG4gIC8vIE91dHNpZGUgYSByZXF1ZXN0IHNjb3BlIChhIHNjcmlwdCwgYSB0ZXN0KTogYSBmcmVzaCBlbnYtYXV0aCBjbGllbnQuXG4gIHJldHVybiBnZXRFeGVjdXRpb25Db250ZXh0KCkuY2xpZW50O1xufVxuXG4vKiogQ29uc3RydWN0IGEge0BsaW5rIFNlYXJjaENsaWVudH0gZnJvbSBhIHJlc29sdmVkIGNvbmZpZy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTZWFyY2hDbGllbnQoXG4gIGNvbmZpZz86IFJlc29sdmVkU2VhcmNoQ29uZmlnLFxuICB3b3Jrc3BhY2VDbGllbnRGYWN0b3J5PzogKCkgPT4gV29ya3NwYWNlQ2xpZW50TGlrZSxcbiAgcmVhZEJhY2tlbmQ/OiBTZWFyY2hSZWFkQmFja2VuZCxcbik6IFNlYXJjaENsaWVudCB7XG4gIHJldHVybiBuZXcgU2VhcmNoQ2xpZW50KGNvbmZpZywgd29ya3NwYWNlQ2xpZW50RmFjdG9yeSwgcmVhZEJhY2tlbmQpO1xufVxuIl19
|