@archont561/qgis-sdk 0.4.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,5 +1,4 @@
1
1
  import {
2
- STREAM_EVENT_KINDS,
3
2
  isPlainRecord,
4
3
  BRIDGE_PROTOCOL_VERSION2,
5
4
  MAX_CALL_ID_LENGTH2,
@@ -14,408 +13,57 @@ import {
14
13
  parseStreamFrame2,
15
14
  BridgeClient2
16
15
  } from "./shared/chunk-8gawbn19.js";
16
+ import {
17
+ MAX_SAFE_INTEGER2,
18
+ MIN_SAFE_INTEGER2,
19
+ PLUGIN_DESCRIPTION_SCHEMA_VERSION2,
20
+ isSafeJsonInteger2,
21
+ QgisSdkDeclarationError2,
22
+ QgisSdkValidationIssue2,
23
+ QgisSdkContractValidationError2,
24
+ parsePluginDescription2,
25
+ QgisSdkContractError2,
26
+ validateAgainstSchema2,
27
+ QgisSdkStoreError2,
28
+ OperationStore2,
29
+ stableKey2,
30
+ StreamStore2,
31
+ labelFor2,
32
+ schemaFields2,
33
+ FormStore2,
34
+ formStore2,
35
+ HostQueryStore2,
36
+ layersQuery2,
37
+ layerFieldsQuery2
38
+ } from "./shared/chunk-t1vpt5yq.js";
17
39
  import {
18
40
  HOST_OPERATIONS2,
19
41
  createHost2
20
- } from "./shared/chunk-vqyymknv.js";
42
+ } from "./shared/chunk-stre69mw.js";
21
43
  import {
22
44
  QgisSdkError2
23
45
  } from "./shared/chunk-2hwva3a3.js";
24
- // src/declarations.ts
25
- var MAX_SAFE_INTEGER = 9007199254740991;
26
- var MIN_SAFE_INTEGER = -9007199254740991;
27
- var PLUGIN_DESCRIPTION_SCHEMA_VERSION = 1;
28
- function isSafeJsonInteger(value) {
29
- return typeof value === "number" && Number.isSafeInteger(value);
30
- }
31
-
32
- class QgisSdkDeclarationError extends QgisSdkError2 {
33
- constructor(message) {
34
- super(message, "invalid_declaration");
35
- }
36
- }
37
-
38
- class QgisSdkValidationIssue {
39
- path;
40
- code;
41
- constructor(path, code) {
42
- this.path = Object.freeze([...path]);
43
- this.code = code;
44
- }
45
- toJSON() {
46
- return {
47
- path: [...this.path],
48
- code: this.code
49
- };
50
- }
51
- }
52
-
53
- class QgisSdkContractValidationError extends QgisSdkError2 {
54
- direction;
55
- issues;
56
- constructor(direction, issues) {
57
- const prefix = direction === "request" ? "Request" : "Result";
58
- super(`${prefix} contract validation failed`, "contract_validation_failed");
59
- this.direction = direction;
60
- this.issues = Object.freeze([...issues]);
61
- }
62
- toJSON() {
63
- return {
64
- code: this.code,
65
- direction: this.direction,
66
- issues: this.issues.map((issue) => issue.toJSON())
67
- };
68
- }
69
- }
70
- var DECLARATION_ID_PATTERN = /^[a-zA-Z][a-zA-Z0-9_.-]*$/;
71
- var PYTHON_IDENTIFIER_PATTERN = /^[a-zA-Z_][a-zA-Z0-9_]*$/;
72
- function validateDeclarationId(value, label) {
73
- if (typeof value !== "string" || !DECLARATION_ID_PATTERN.test(value)) {
74
- throw new QgisSdkDeclarationError(`Invalid ${label} id: expected [a-zA-Z][a-zA-Z0-9_.-]*`);
75
- }
76
- return value;
77
- }
78
- function validateNonBlankTitle(value, id) {
79
- if (typeof value !== "string" || value.trim().length === 0) {
80
- throw new QgisSdkDeclarationError(`${id}: title must be a nonempty string`);
81
- }
82
- return value;
83
- }
84
- function parseOperationHead(raw, label) {
85
- if (!isPlainRecord(raw)) {
86
- throw new QgisSdkDeclarationError(`${label[0]?.toUpperCase()}${label.slice(1)} description must be an object`);
87
- }
88
- const id = validateDeclarationId(raw.id, label);
89
- const title = validateNonBlankTitle(raw.title, id);
90
- if (typeof raw.handler !== "string" || !PYTHON_IDENTIFIER_PATTERN.test(raw.handler)) {
91
- throw new QgisSdkDeclarationError(`${id}: handler must be a valid Python identifier`);
92
- }
93
- if (!isPlainRecord(raw.request)) {
94
- throw new QgisSdkDeclarationError(`${id}: request schema must be an object`);
95
- }
46
+ // src/processing.ts
47
+ async function runAlgorithm(qgis, id, params, options) {
48
+ const raw = await qgis.host.algorithms.run({ algorithm_id: id, params }, options);
96
49
  return {
97
- raw,
98
- id,
99
- title,
100
- handler: raw.handler,
101
- request: Object.freeze({ ...raw.request })
102
- };
103
- }
104
- function parseActionDescription(raw) {
105
- const head = parseOperationHead(raw, "action");
106
- if (!isPlainRecord(head.raw.result)) {
107
- throw new QgisSdkDeclarationError(`${head.id}: result schema must be an object`);
108
- }
109
- return Object.freeze({
110
- id: head.id,
111
- title: head.title,
112
- handler: head.handler,
113
- request: head.request,
114
- result: Object.freeze({ ...head.raw.result })
115
- });
116
- }
117
- function parseStreamDescription(raw) {
118
- const head = parseOperationHead(raw, "stream");
119
- const declared = head.raw.events;
120
- if (!isPlainRecord(declared) || Object.keys(declared).length === 0) {
121
- throw new QgisSdkDeclarationError(`${head.id}: events must map at least one event kind to a schema`);
122
- }
123
- const events = {};
124
- for (const [kind, schema] of Object.entries(declared)) {
125
- if (!STREAM_EVENT_KINDS.includes(kind)) {
126
- throw new QgisSdkDeclarationError(`${head.id}: ${kind} is not a stream event kind`);
127
- }
128
- if (!isPlainRecord(schema)) {
129
- throw new QgisSdkDeclarationError(`${head.id}: events.${kind} schema must be an object`);
130
- }
131
- events[kind] = Object.freeze({ ...schema });
132
- }
133
- return Object.freeze({
134
- id: head.id,
135
- title: head.title,
136
- handler: head.handler,
137
- request: head.request,
138
- events: Object.freeze(events)
139
- });
140
- }
141
- function parsePluginDescription(input) {
142
- let parsed = input;
143
- if (typeof input === "string") {
144
- try {
145
- parsed = JSON.parse(input);
146
- } catch {
147
- throw new QgisSdkDeclarationError("Plugin description is not valid JSON");
148
- }
149
- }
150
- if (!isPlainRecord(parsed)) {
151
- throw new QgisSdkDeclarationError("Plugin description must be an object");
152
- }
153
- if (parsed.schema_version !== PLUGIN_DESCRIPTION_SCHEMA_VERSION) {
154
- throw new QgisSdkDeclarationError(`Unsupported plugin description schema_version: ${String(parsed.schema_version)}`);
155
- }
156
- const id = validateDeclarationId(parsed.id, "plugin");
157
- const title = validateNonBlankTitle(parsed.title, id);
158
- if (!Array.isArray(parsed.actions)) {
159
- throw new QgisSdkDeclarationError(`${id}: actions must be an array`);
160
- }
161
- const declaredStreams = parsed.streams ?? [];
162
- if (!Array.isArray(declaredStreams)) {
163
- throw new QgisSdkDeclarationError(`${id}: streams must be an array`);
164
- }
165
- const seenIds = new Set;
166
- const claim = (operationId, label) => {
167
- if (seenIds.has(operationId)) {
168
- throw new QgisSdkDeclarationError(`${id}: duplicate ${label} id ${operationId}`);
169
- }
170
- seenIds.add(operationId);
50
+ algorithm: raw.algorithm,
51
+ outputs: outputsByName(raw.outputs),
52
+ raw
171
53
  };
172
- const actions = [];
173
- for (const item of parsed.actions) {
174
- const action = parseActionDescription(item);
175
- claim(action.id, "action");
176
- actions.push(action);
177
- }
178
- const streams = [];
179
- for (const item of declaredStreams) {
180
- const stream = parseStreamDescription(item);
181
- claim(stream.id, "stream");
182
- streams.push(stream);
183
- }
184
- const byId = (left, right) => left.id < right.id ? -1 : 1;
185
- actions.sort(byId);
186
- streams.sort(byId);
187
- return Object.freeze({
188
- schema_version: PLUGIN_DESCRIPTION_SCHEMA_VERSION,
189
- id,
190
- title,
191
- actions: Object.freeze(actions),
192
- streams: Object.freeze(streams)
193
- });
194
- }
195
- // src/validate.ts
196
- class QgisSdkContractError extends QgisSdkError2 {
197
- operation;
198
- direction;
199
- issues;
200
- constructor(operation, direction, issues) {
201
- const detail = issues[0] === undefined ? "" : `: ${describe(issues[0])}`;
202
- super(`${operation}: the ${direction} does not match the declared contract${detail}`, "contract_validation_failed");
203
- this.operation = operation;
204
- this.direction = direction;
205
- this.issues = Object.freeze([...issues]);
206
- }
207
- toJSON() {
208
- return {
209
- code: this.code,
210
- operation: this.operation,
211
- direction: this.direction,
212
- issues: this.issues.map((issue) => issue.toJSON())
213
- };
214
- }
215
- }
216
- function describe(issue) {
217
- const where = issue.path.length === 0 ? "value" : issue.path.join(".");
218
- return `${where} ${issue.code}`;
219
- }
220
- var PRIMITIVES = new Set([
221
- "string",
222
- "boolean",
223
- "integer",
224
- "number",
225
- "null",
226
- "array",
227
- "object"
228
- ]);
229
- var KNOWN_KEYWORDS = new Set([
230
- "type",
231
- "properties",
232
- "required",
233
- "additionalProperties",
234
- "items",
235
- "anyOf",
236
- "enum",
237
- "minimum",
238
- "maximum",
239
- "pattern",
240
- "title",
241
- "description"
242
- ]);
243
- function validateAgainstSchema(value, schema, options = {}) {
244
- const issues = [];
245
- check(value, schema, options.path ?? [], options.allowUnknown === true, issues);
246
- return issues;
247
- }
248
- function check(value, schema, path, allowUnknown, issues) {
249
- if (!isPlainRecord(schema)) {
250
- throw new QgisSdkDeclarationError(`${where(path)}: a schema must be an object`);
251
- }
252
- const unknown = Object.keys(schema).filter((key) => !KNOWN_KEYWORDS.has(key));
253
- if (unknown.length > 0) {
254
- throw new QgisSdkDeclarationError(`${where(path)}: unsupported schema keyword(s) ${unknown.sort().join(", ")}`);
255
- }
256
- if ("anyOf" in schema) {
257
- const branches = schema.anyOf;
258
- if (!Array.isArray(branches) || branches.length === 0) {
259
- throw new QgisSdkDeclarationError(`${where(path)}: anyOf must be a nonempty list`);
260
- }
261
- for (const branch of branches) {
262
- const attempt = [];
263
- check(value, branch, path, allowUnknown, attempt);
264
- if (attempt.length === 0) {
265
- return;
266
- }
267
- }
268
- issues.push(new QgisSdkValidationIssue([...path], "any_of"));
269
- return;
270
- }
271
- if ("enum" in schema) {
272
- const choices = schema.enum;
273
- if (!Array.isArray(choices)) {
274
- throw new QgisSdkDeclarationError(`${where(path)}: enum must be a list`);
275
- }
276
- if (!choices.some((choice) => sameJson(choice, value))) {
277
- issues.push(new QgisSdkValidationIssue([...path], "enum"));
278
- }
279
- return;
280
- }
281
- const declared = schema.type;
282
- if (declared === undefined) {
283
- throw new QgisSdkDeclarationError(`${where(path)}: a schema needs a type, anyOf or enum`);
284
- }
285
- if (typeof declared !== "string" || !PRIMITIVES.has(declared)) {
286
- throw new QgisSdkDeclarationError(`${where(path)}: unsupported type ${JSON.stringify(declared)}`);
287
- }
288
- switch (declared) {
289
- case "string":
290
- checkString(value, schema, path, issues);
291
- return;
292
- case "boolean":
293
- if (typeof value !== "boolean") {
294
- issues.push(new QgisSdkValidationIssue([...path], "type"));
295
- }
296
- return;
297
- case "integer":
298
- if (typeof value !== "number" || !Number.isInteger(value)) {
299
- issues.push(new QgisSdkValidationIssue([...path], "type"));
300
- return;
301
- }
302
- checkBounds(value, schema, path, issues);
303
- return;
304
- case "number":
305
- if (typeof value !== "number") {
306
- issues.push(new QgisSdkValidationIssue([...path], "type"));
307
- return;
308
- }
309
- if (!Number.isFinite(value)) {
310
- issues.push(new QgisSdkValidationIssue([...path], "not_finite"));
311
- return;
312
- }
313
- checkBounds(value, schema, path, issues);
314
- return;
315
- case "null":
316
- if (value !== null) {
317
- issues.push(new QgisSdkValidationIssue([...path], "type"));
318
- }
319
- return;
320
- case "array":
321
- checkArray(value, schema, path, allowUnknown, issues);
322
- return;
323
- default:
324
- checkObject(value, schema, path, allowUnknown, issues);
325
- }
326
- }
327
- function checkString(value, schema, path, issues) {
328
- if (typeof value !== "string") {
329
- issues.push(new QgisSdkValidationIssue([...path], "type"));
330
- return;
331
- }
332
- const pattern = schema.pattern;
333
- if (pattern === undefined || pattern === null) {
334
- return;
335
- }
336
- if (typeof pattern !== "string") {
337
- throw new QgisSdkDeclarationError(`${where(path)}: pattern must be a string`);
338
- }
339
- let expression;
340
- try {
341
- expression = new RegExp(`^(?:${pattern})$`, "u");
342
- } catch (error) {
343
- throw new QgisSdkDeclarationError(`${where(path)}: pattern ${JSON.stringify(pattern)} is unusable: ${String(error)}`);
344
- }
345
- if (!expression.test(value)) {
346
- issues.push(new QgisSdkValidationIssue([...path], "pattern"));
347
- }
348
- }
349
- function checkBounds(value, schema, path, issues) {
350
- const minimum = schema.minimum;
351
- if (typeof minimum === "number" && value < minimum) {
352
- issues.push(new QgisSdkValidationIssue([...path], "minimum"));
353
- }
354
- const maximum = schema.maximum;
355
- if (typeof maximum === "number" && value > maximum) {
356
- issues.push(new QgisSdkValidationIssue([...path], "maximum"));
357
- }
358
- }
359
- function checkArray(value, schema, path, allowUnknown, issues) {
360
- if (!Array.isArray(value)) {
361
- issues.push(new QgisSdkValidationIssue([...path], "type"));
362
- return;
363
- }
364
- const items = schema.items;
365
- if (items === undefined || items === null) {
366
- return;
367
- }
368
- value.forEach((item, index) => {
369
- check(item, items, [...path, index], allowUnknown, issues);
370
- });
371
- }
372
- function checkObject(value, schema, path, allowUnknown, issues) {
373
- if (!isPlainRecord(value)) {
374
- issues.push(new QgisSdkValidationIssue([...path], "type"));
375
- return;
376
- }
377
- const properties = schema.properties ?? {};
378
- if (!isPlainRecord(properties)) {
379
- throw new QgisSdkDeclarationError(`${where(path)}: properties must be an object`);
380
- }
381
- const required = schema.required ?? [];
382
- if (!Array.isArray(required)) {
383
- throw new QgisSdkDeclarationError(`${where(path)}: required must be a list`);
384
- }
385
- for (const key of required) {
386
- if (typeof key === "string" && !(key in value)) {
387
- issues.push(new QgisSdkValidationIssue([...path, key], "required"));
388
- }
389
- }
390
- const strict = schema.additionalProperties === false && !allowUnknown;
391
- for (const [key, item] of Object.entries(value)) {
392
- if (Object.hasOwn(properties, key)) {
393
- check(item, properties[key], [...path, key], allowUnknown, issues);
394
- } else if (strict) {
395
- issues.push(new QgisSdkValidationIssue([...path, key], "unknown_property"));
396
- }
397
- }
398
54
  }
399
- function sameJson(a, b) {
400
- if (a === b) {
401
- return true;
402
- }
403
- if (typeof a !== typeof b || a === null || b === null) {
404
- return false;
405
- }
406
- if (Array.isArray(a)) {
407
- return Array.isArray(b) && a.length === b.length && a.every((item, index) => sameJson(item, b[index]));
408
- }
409
- if (isPlainRecord(a) && isPlainRecord(b)) {
410
- const keys = Object.keys(a);
411
- return keys.length === Object.keys(b).length && keys.every((key) => Object.hasOwn(b, key) && sameJson(a[key], b[key]));
55
+ function outputsByName(outputs) {
56
+ const result = {};
57
+ for (const output of outputs) {
58
+ if (output.kind === "vector")
59
+ result[output.name] = output.layer;
60
+ else if (output.kind === "file")
61
+ result[output.name] = output.file;
62
+ else
63
+ result[output.name] = output.value;
412
64
  }
413
- return false;
65
+ return result;
414
66
  }
415
- function where(path) {
416
- return path.length === 0 ? "value" : path.join(".");
417
- }
418
-
419
67
  // src/webchannel.ts
420
68
  class QgisSdkWebChannelError extends QgisSdkError2 {
421
69
  constructor(message) {
@@ -529,24 +177,43 @@ function parseHandshake(value) {
529
177
  operations.push(operation.id);
530
178
  }
531
179
  }
532
- return { operations };
180
+ return {
181
+ operations,
182
+ granted: Object.freeze(operations.filter((id) => HOST_IDS.has(id))),
183
+ theme: parseTheme(value.theme)
184
+ };
185
+ }
186
+ function parseTheme(value) {
187
+ if (!isPlainRecord(value) || !isPlainRecord(value.palette)) {
188
+ return null;
189
+ }
190
+ const palette = {};
191
+ for (const [role, colour] of Object.entries(value.palette)) {
192
+ if (typeof colour === "string") {
193
+ palette[role] = colour;
194
+ }
195
+ }
196
+ return Object.freeze({
197
+ palette: Object.freeze(palette),
198
+ dark: value.dark === true
199
+ });
533
200
  }
534
201
  function unwrapRequest(operation, request) {
535
202
  if (request === undefined) {
536
203
  return {};
537
204
  }
538
205
  if (!isPlainRecord(request)) {
539
- throw new QgisSdkContractError(operation, "request", [
540
- ...validateAgainstSchema(request, { type: "object" })
206
+ throw new QgisSdkContractError2(operation, "request", [
207
+ ...validateAgainstSchema2(request, { type: "object" })
541
208
  ]);
542
209
  }
543
210
  return request;
544
211
  }
545
212
  function checkedRequest(description, request) {
546
213
  const payload = unwrapRequest(description.id, request);
547
- const issues = validateAgainstSchema(payload, description.request);
214
+ const issues = validateAgainstSchema2(payload, description.request);
548
215
  if (issues.length > 0) {
549
- throw new QgisSdkContractError(description.id, "request", issues);
216
+ throw new QgisSdkContractError2(description.id, "request", issues);
550
217
  }
551
218
  return payload;
552
219
  }
@@ -554,11 +221,11 @@ function operationMethod(client, action) {
554
221
  return async (request, options) => {
555
222
  const payload = checkedRequest(action, request);
556
223
  const value = await client.invoke(action.id, payload, options);
557
- const issues = validateAgainstSchema(value, action.result, {
224
+ const issues = validateAgainstSchema2(value, action.result, {
558
225
  allowUnknown: true
559
226
  });
560
227
  if (issues.length > 0) {
561
- throw new QgisSdkContractError(action.id, "result", issues);
228
+ throw new QgisSdkContractError2(action.id, "result", issues);
562
229
  }
563
230
  return value;
564
231
  };
@@ -582,7 +249,7 @@ function streamMethod(client, stream) {
582
249
  return;
583
250
  }
584
251
  const declared = stream.events[event.kind];
585
- const issues = declared === undefined ? undefined : validateAgainstSchema(event.payload, declared, {
252
+ const issues = declared === undefined ? undefined : validateAgainstSchema2(event.payload, declared, {
586
253
  allowUnknown: true,
587
254
  path: ["payload"]
588
255
  });
@@ -590,7 +257,7 @@ function streamMethod(client, stream) {
590
257
  handlers.onEvent?.(event);
591
258
  return;
592
259
  }
593
- const error = new QgisSdkContractError(stream.id, "event", issues ?? []);
260
+ const error = new QgisSdkContractError2(stream.id, "event", issues ?? []);
594
261
  end({ kind: "error", message: error.message });
595
262
  if (handle === null) {
596
263
  violated = true;
@@ -606,26 +273,32 @@ function streamMethod(client, stream) {
606
273
  return handle;
607
274
  };
608
275
  }
609
- function buildHost(client, granted) {
276
+ function buildHost(client, handshake) {
610
277
  const host = createHost2(client);
611
278
  return Object.freeze({
612
279
  ...host,
613
280
  get granted() {
614
- return granted();
281
+ return granted(handshake());
282
+ },
283
+ get theme() {
284
+ return handshake()?.theme ?? null;
615
285
  }
616
286
  });
617
287
  }
288
+ var NO_GRANTS = Object.freeze([]);
289
+ function granted(handshake) {
290
+ return handshake === null ? NO_GRANTS : handshake.granted;
291
+ }
618
292
  function build(schema, options) {
619
293
  if (options.client !== undefined && options.transport !== undefined) {
620
- throw new QgisSdkDeclarationError("QgisSdk.fromBridgeSchema takes a client or a transport, not both");
294
+ throw new QgisSdkDeclarationError2("QgisSdk.fromBridgeSchema takes a client or a transport, not both");
621
295
  }
622
296
  const owned = options.client === undefined;
623
297
  const transport = options.transport ?? (options.client === undefined ? createWebChannelTransport(options.channelObject ?? "bridge") : undefined);
624
298
  const client = options.client ?? new BridgeClient2(transport, options.timeoutMs === undefined ? {} : { timeoutMs: options.timeoutMs });
625
- let granted = Object.freeze([]);
299
+ let handshake = null;
626
300
  const ready = client.handshake().then((value) => {
627
- const handshake = parseHandshake(value);
628
- granted = Object.freeze(handshake.operations.filter((id) => HOST_IDS.has(id)));
301
+ handshake = parseHandshake(value);
629
302
  });
630
303
  ready.catch(() => {
631
304
  return;
@@ -633,7 +306,7 @@ function build(schema, options) {
633
306
  const members = {
634
307
  schema,
635
308
  client,
636
- host: buildHost(client, () => granted),
309
+ host: buildHost(client, () => handshake),
637
310
  ready,
638
311
  close: () => {
639
312
  if (owned) {
@@ -656,11 +329,11 @@ function build(schema, options) {
656
329
  function place(members, namespaces, id, method) {
657
330
  const segments = id.split(".");
658
331
  if (segments.some((segment) => segment === "")) {
659
- throw new QgisSdkDeclarationError(`${id}: an operation id may not have an empty segment`);
332
+ throw new QgisSdkDeclarationError2(`${id}: an operation id may not have an empty segment`);
660
333
  }
661
334
  const head = segments[0];
662
335
  if (QGIS_SDK_MEMBERS.includes(head)) {
663
- throw new QgisSdkDeclarationError(`${id}: an operation id may not start with a QgisSdk member (${QGIS_SDK_MEMBERS.join(", ")})`);
336
+ throw new QgisSdkDeclarationError2(`${id}: an operation id may not start with a QgisSdk member (${QGIS_SDK_MEMBERS.join(", ")})`);
664
337
  }
665
338
  let node = members;
666
339
  for (const [index, segment] of segments.entries()) {
@@ -668,7 +341,7 @@ function place(members, namespaces, id, method) {
668
341
  const existing = node[segment];
669
342
  if (index === segments.length - 1) {
670
343
  if (existing !== undefined) {
671
- throw new QgisSdkDeclarationError(typeof existing === "function" ? `${id}: duplicate operation id` : `${id}: an operation id may not be a prefix of another declared id`);
344
+ throw new QgisSdkDeclarationError2(typeof existing === "function" ? `${id}: duplicate operation id` : `${id}: an operation id may not be a prefix of another declared id`);
672
345
  }
673
346
  node[segment] = method;
674
347
  return;
@@ -679,7 +352,7 @@ function place(members, namespaces, id, method) {
679
352
  node[segment] = namespace;
680
353
  node = namespace;
681
354
  } else if (typeof existing === "function") {
682
- throw new QgisSdkDeclarationError(`${id}: ${prefix} is already an operation id; an id may not extend another`);
355
+ throw new QgisSdkDeclarationError2(`${id}: ${prefix} is already an operation id; an id may not extend another`);
683
356
  } else {
684
357
  node = existing;
685
358
  }
@@ -694,15 +367,18 @@ var QgisSdk;
694
367
  })(QgisSdk ||= {});
695
368
  // src/schema.ts
696
369
  function defineBridgeSchema(input) {
697
- return parsePluginDescription(input);
370
+ return parsePluginDescription2(input);
698
371
  }
699
372
  export {
700
373
  BRIDGE_PROTOCOL_VERSION2 as BRIDGE_PROTOCOL_VERSION,
701
374
  BridgeClient2 as BridgeClient,
375
+ FormStore2 as FormStore,
376
+ HostQueryStore2 as HostQueryStore,
702
377
  MAX_CALL_ID_LENGTH2 as MAX_CALL_ID_LENGTH,
703
- MAX_SAFE_INTEGER,
704
- MIN_SAFE_INTEGER,
705
- PLUGIN_DESCRIPTION_SCHEMA_VERSION,
378
+ MAX_SAFE_INTEGER2 as MAX_SAFE_INTEGER,
379
+ MIN_SAFE_INTEGER2 as MIN_SAFE_INTEGER,
380
+ OperationStore2 as OperationStore,
381
+ PLUGIN_DESCRIPTION_SCHEMA_VERSION2 as PLUGIN_DESCRIPTION_SCHEMA_VERSION,
706
382
  QGIS_SDK_MEMBERS,
707
383
  QgisSdk,
708
384
  QgisSdkBridgeAbortedError2 as QgisSdkBridgeAbortedError,
@@ -712,21 +388,31 @@ export {
712
388
  QgisSdkBridgeSequenceError2 as QgisSdkBridgeSequenceError,
713
389
  QgisSdkBridgeStreamEndedError2 as QgisSdkBridgeStreamEndedError,
714
390
  QgisSdkBridgeTimeoutError2 as QgisSdkBridgeTimeoutError,
715
- QgisSdkContractError,
716
- QgisSdkContractValidationError,
717
- QgisSdkDeclarationError,
391
+ QgisSdkContractError2 as QgisSdkContractError,
392
+ QgisSdkContractValidationError2 as QgisSdkContractValidationError,
393
+ QgisSdkDeclarationError2 as QgisSdkDeclarationError,
718
394
  QgisSdkError2 as QgisSdkError,
719
- QgisSdkValidationIssue,
395
+ QgisSdkStoreError2 as QgisSdkStoreError,
396
+ QgisSdkValidationIssue2 as QgisSdkValidationIssue,
720
397
  QgisSdkWebChannelError,
398
+ StreamStore2 as StreamStore,
721
399
  createWebChannelTransport,
722
400
  defineBridgeSchema,
401
+ formStore2 as formStore,
723
402
  insideQgis,
724
- isSafeJsonInteger,
403
+ isSafeJsonInteger2 as isSafeJsonInteger,
404
+ labelFor2 as labelFor,
405
+ layerFieldsQuery2 as layerFieldsQuery,
406
+ layersQuery2 as layersQuery,
407
+ outputsByName,
725
408
  parseInvokeReply2 as parseInvokeReply,
726
- parsePluginDescription,
409
+ parsePluginDescription2 as parsePluginDescription,
727
410
  parseStreamFrame2 as parseStreamFrame,
728
- validateAgainstSchema
411
+ runAlgorithm,
412
+ schemaFields2 as schemaFields,
413
+ stableKey2 as stableKey,
414
+ validateAgainstSchema2 as validateAgainstSchema
729
415
  };
730
416
 
731
- //# debugId=7555C93DA5D57B1A64756E2164756E21
732
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL2RlY2xhcmF0aW9ucy50cyIsICJzcmMvdmFsaWRhdGUudHMiLCAic3JjL3dlYmNoYW5uZWwudHMiLCAic3JjL3FnaXMtc2RrLnRzIiwgInNyYy9zY2hlbWEudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiLyoqXG4gKiBUaGUgdmVyc2lvbiAxIHBsdWdpbi1kZXNjcmlwdGlvbiBjb250cmFjdCBhbmQgaXRzIHdpcmUgbGltaXRzLlxuICpcbiAqIE1pcnJvcnMgdGhlIFFHSVMtZnJlZSBgcWdpc19zZGsubW9kZWxzYCBhbmQgYHFnaXNfc2RrLmRlY2xhcmF0aW9uc2BcbiAqIChgc2NoZW1hX3ZlcnNpb24gPSAxYCkgY29udHJhY3RzIHdpdGhvdXQgaW1wb3J0aW5nIGJyb3dzZXIgb3IgUXQgZ2xvYmFscy5cbiAqIGBwYXJzZVBsdWdpbkRlc2NyaXB0aW9uYCBpcyB0aGUgYnJvd3Nlci1zaWRlIHJlYWRlciBvZiB3aGF0XG4gKiBgZGVzY3JpYmVfcGx1Z2luKGNscykudG9fanNvbigpYCBlbWl0czsgYHFnaXMtc2RrIGJyaWRnZSBnZW5lcmF0ZWAgaXMgdGhlXG4gKiBidWlsZC10aW1lIG9uZS5cbiAqL1xuXG5pbXBvcnQgeyBRZ2lzU2RrRXJyb3IgfSBmcm9tIFwiLi9lcnJvcnNcIjtcbmltcG9ydCB7IGlzUGxhaW5SZWNvcmQsIFNUUkVBTV9FVkVOVF9LSU5EUyB9IGZyb20gXCIuL2ludGVybmFsXCI7XG5cbmV4cG9ydCBjb25zdCBNQVhfU0FGRV9JTlRFR0VSOiBudW1iZXIgPSA5XzAwN18xOTlfMjU0Xzc0MF85OTE7XG5leHBvcnQgY29uc3QgTUlOX1NBRkVfSU5URUdFUjogbnVtYmVyID0gLTlfMDA3XzE5OV8yNTRfNzQwXzk5MTtcbmV4cG9ydCBjb25zdCBQTFVHSU5fREVTQ1JJUFRJT05fU0NIRU1BX1ZFUlNJT046IDEgPSAxO1xuXG5leHBvcnQgdHlwZSBWYWxpZGF0aW9uRGlyZWN0aW9uID0gXCJyZXF1ZXN0XCIgfCBcInJlc3VsdFwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNlcmlhbGl6ZWRWYWxpZGF0aW9uSXNzdWUge1xuXHRyZWFkb25seSBwYXRoOiAoc3RyaW5nIHwgbnVtYmVyKVtdO1xuXHRyZWFkb25seSBjb2RlOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VyaWFsaXplZENvbnRyYWN0VmFsaWRhdGlvbkVycm9yIHtcblx0cmVhZG9ubHkgY29kZTogc3RyaW5nO1xuXHRyZWFkb25seSBkaXJlY3Rpb246IFZhbGlkYXRpb25EaXJlY3Rpb247XG5cdHJlYWRvbmx5IGlzc3VlczogU2VyaWFsaXplZFZhbGlkYXRpb25Jc3N1ZVtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFjdGlvbkRlc2NyaXB0aW9uIHtcblx0cmVhZG9ubHkgaWQ6IHN0cmluZztcblx0cmVhZG9ubHkgdGl0bGU6IHN0cmluZztcblx0cmVhZG9ubHkgaGFuZGxlcjogc3RyaW5nO1xuXHRyZWFkb25seSByZXF1ZXN0OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj47XG5cdHJlYWRvbmx5IHJlc3VsdDogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+O1xufVxuXG4vKiogVGhlIGV2ZW50IGtpbmRzIGEgc3RyZWFtIG1heSBkZWNsYXJlOyB0aGUgZnJhbWUgY2FycmllcyB0aGUgc2FtZSB0aHJlZS4gKi9cbmV4cG9ydCB0eXBlIFN0cmVhbUV2ZW50S2luZCA9IFwiZGF0YVwiIHwgXCJwcm9ncmVzc1wiIHwgXCJzdGF0ZVwiO1xuXG4vKipcbiAqIEEgZGVjbGFyZWQgc3RyZWFtIChkZWNpc2lvbi0yOCk6IGEgcmVxdWVzdCBpbiwgb25lIHBheWxvYWQgc2NoZW1hIHBlclxuICogZGVjbGFyZWQgZXZlbnQga2luZCBvdXQuIFRoZXJlIGlzIG5vIGByZXN1bHRgOiB0aGUgcmVwbHkgdG8gYSBzdWJzY3JpcHRpb24gaXNcbiAqIHRoZSBwcm90b2NvbCdzIGFja25vd2xlZGdlbWVudCwgbm90IHNvbWV0aGluZyBhbiBhdXRob3IgZGVjbGFyZXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RyZWFtRGVzY3JpcHRpb24ge1xuXHRyZWFkb25seSBpZDogc3RyaW5nO1xuXHRyZWFkb25seSB0aXRsZTogc3RyaW5nO1xuXHRyZWFkb25seSBoYW5kbGVyOiBzdHJpbmc7XG5cdHJlYWRvbmx5IHJlcXVlc3Q6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+Pjtcblx0cmVhZG9ubHkgZXZlbnRzOiBSZWFkb25seTxcblx0XHRQYXJ0aWFsPFJlY29yZDxTdHJlYW1FdmVudEtpbmQsIFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+Pj4+XG5cdD47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luRGVzY3JpcHRpb24ge1xuXHRyZWFkb25seSBzY2hlbWFfdmVyc2lvbjogMTtcblx0cmVhZG9ubHkgaWQ6IHN0cmluZztcblx0cmVhZG9ubHkgdGl0bGU6IHN0cmluZztcblx0cmVhZG9ubHkgYWN0aW9uczogcmVhZG9ubHkgQWN0aW9uRGVzY3JpcHRpb25bXTtcblx0LyoqIERlY2xhcmVkIHN0cmVhbXM7IGEgZGVzY3JpcHRpb24gZnJvbSBhIGhvc3QgdGhhdCBwcmVkYXRlcyB0aGVtIGlzIGVtcHR5LiAqL1xuXHRyZWFkb25seSBzdHJlYW1zOiByZWFkb25seSBTdHJlYW1EZXNjcmlwdGlvbltdO1xufVxuXG4vKipcbiAqIFJldHVybiB3aGV0aGVyIGB2YWx1ZWAgaXMgYSBmaW5pdGUgaW50ZWdlciB3aXRoaW4gdGhlIEphdmFTY3JpcHQtc2FmZSB3aXJlIHJhbmdlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNTYWZlSnNvbkludGVnZXIodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBudW1iZXIge1xuXHRyZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiICYmIE51bWJlci5pc1NhZmVJbnRlZ2VyKHZhbHVlKTtcbn1cblxuLyoqXG4gKiBBIGRlY2xhcmF0aW9uIGNhbm5vdCBiZSByZXByZXNlbnRlZCBvciBwYXJzZWQgaW4gdGhlIHZlcnNpb25lZCBjb250cmFjdC5cbiAqL1xuZXhwb3J0IGNsYXNzIFFnaXNTZGtEZWNsYXJhdGlvbkVycm9yIGV4dGVuZHMgUWdpc1Nka0Vycm9yIHtcblx0cHVibGljIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xuXHRcdHN1cGVyKG1lc3NhZ2UsIFwiaW52YWxpZF9kZWNsYXJhdGlvblwiKTtcblx0fVxufVxuXG4vKipcbiAqIFNhZmUsIHN0cnVjdHVyZWQgbG9jYXRpb24gYW5kIGNhdGVnb3J5IGZvciBhIHJlamVjdGVkIGNvbnRyYWN0IHZhbHVlLlxuICovXG5leHBvcnQgY2xhc3MgUWdpc1Nka1ZhbGlkYXRpb25Jc3N1ZSB7XG5cdHB1YmxpYyByZWFkb25seSBwYXRoOiByZWFkb25seSAoc3RyaW5nIHwgbnVtYmVyKVtdO1xuXHRwdWJsaWMgcmVhZG9ubHkgY29kZTogc3RyaW5nO1xuXG5cdHB1YmxpYyBjb25zdHJ1Y3RvcihwYXRoOiByZWFkb25seSAoc3RyaW5nIHwgbnVtYmVyKVtdLCBjb2RlOiBzdHJpbmcpIHtcblx0XHR0aGlzLnBhdGggPSBPYmplY3QuZnJlZXplKFsuLi5wYXRoXSk7XG5cdFx0dGhpcy5jb2RlID0gY29kZTtcblx0fVxuXG5cdHB1YmxpYyB0b0pTT04oKTogU2VyaWFsaXplZFZhbGlkYXRpb25Jc3N1ZSB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHBhdGg6IFsuLi50aGlzLnBhdGhdLFxuXHRcdFx0Y29kZTogdGhpcy5jb2RlLFxuXHRcdH07XG5cdH1cbn1cblxuLyoqXG4gKiBBIHJlcXVlc3Qgb3IgcmVzdWx0IGRpZCBub3Qgc2F0aXNmeSBpdHMgZGVjbGFyZWQgd2lyZSBjb250cmFjdC5cbiAqL1xuZXhwb3J0IGNsYXNzIFFnaXNTZGtDb250cmFjdFZhbGlkYXRpb25FcnJvciBleHRlbmRzIFFnaXNTZGtFcnJvciB7XG5cdHB1YmxpYyByZWFkb25seSBkaXJlY3Rpb246IFZhbGlkYXRpb25EaXJlY3Rpb247XG5cdHB1YmxpYyByZWFkb25seSBpc3N1ZXM6IHJlYWRvbmx5IFFnaXNTZGtWYWxpZGF0aW9uSXNzdWVbXTtcblxuXHRwdWJsaWMgY29uc3RydWN0b3IoXG5cdFx0ZGlyZWN0aW9uOiBWYWxpZGF0aW9uRGlyZWN0aW9uLFxuXHRcdGlzc3VlczogcmVhZG9ubHkgUWdpc1Nka1ZhbGlkYXRpb25Jc3N1ZVtdLFxuXHQpIHtcblx0XHRjb25zdCBwcmVmaXggPSBkaXJlY3Rpb24gPT09IFwicmVxdWVzdFwiID8gXCJSZXF1ZXN0XCIgOiBcIlJlc3VsdFwiO1xuXHRcdHN1cGVyKGAke3ByZWZpeH0gY29udHJhY3QgdmFsaWRhdGlvbiBmYWlsZWRgLCBcImNvbnRyYWN0X3ZhbGlkYXRpb25fZmFpbGVkXCIpO1xuXHRcdHRoaXMuZGlyZWN0aW9uID0gZGlyZWN0aW9uO1xuXHRcdHRoaXMuaXNzdWVzID0gT2JqZWN0LmZyZWV6ZShbLi4uaXNzdWVzXSk7XG5cdH1cblxuXHRwdWJsaWMgdG9KU09OKCk6IFNlcmlhbGl6ZWRDb250cmFjdFZhbGlkYXRpb25FcnJvciB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdGNvZGU6IHRoaXMuY29kZSxcblx0XHRcdGRpcmVjdGlvbjogdGhpcy5kaXJlY3Rpb24sXG5cdFx0XHRpc3N1ZXM6IHRoaXMuaXNzdWVzLm1hcCgoaXNzdWUpID0+IGlzc3VlLnRvSlNPTigpKSxcblx0XHR9O1xuXHR9XG59XG5cbmNvbnN0IERFQ0xBUkFUSU9OX0lEX1BBVFRFUk4gPSAvXlthLXpBLVpdW2EtekEtWjAtOV8uLV0qJC87XG5jb25zdCBQWVRIT05fSURFTlRJRklFUl9QQVRURVJOID0gL15bYS16QS1aX11bYS16QS1aMC05X10qJC87XG5cbmZ1bmN0aW9uIHZhbGlkYXRlRGVjbGFyYXRpb25JZCh2YWx1ZTogdW5rbm93biwgbGFiZWw6IHN0cmluZyk6IHN0cmluZyB7XG5cdGlmICh0eXBlb2YgdmFsdWUgIT09IFwic3RyaW5nXCIgfHwgIURFQ0xBUkFUSU9OX0lEX1BBVFRFUk4udGVzdCh2YWx1ZSkpIHtcblx0XHR0aHJvdyBuZXcgUWdpc1Nka0RlY2xhcmF0aW9uRXJyb3IoXG5cdFx0XHRgSW52YWxpZCAke2xhYmVsfSBpZDogZXhwZWN0ZWQgW2EtekEtWl1bYS16QS1aMC05Xy4tXSpgLFxuXHRcdCk7XG5cdH1cblx0cmV0dXJuIHZhbHVlO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZU5vbkJsYW5rVGl0bGUodmFsdWU6IHVua25vd24sIGlkOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRpZiAodHlwZW9mIHZhbHVlICE9PSBcInN0cmluZ1wiIHx8IHZhbHVlLnRyaW0oKS5sZW5ndGggPT09IDApIHtcblx0XHR0aHJvdyBuZXcgUWdpc1Nka0RlY2xhcmF0aW9uRXJyb3IoYCR7aWR9OiB0aXRsZSBtdXN0IGJlIGEgbm9uZW1wdHkgc3RyaW5nYCk7XG5cdH1cblx0cmV0dXJuIHZhbHVlO1xufVxuXG5mdW5jdGlvbiBwYXJzZU9wZXJhdGlvbkhlYWQoXG5cdHJhdzogdW5rbm93bixcblx0bGFiZWw6IHN0cmluZyxcbik6IHtcblx0cmVhZG9ubHkgcmF3OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblx0cmVhZG9ubHkgaWQ6IHN0cmluZztcblx0cmVhZG9ubHkgdGl0bGU6IHN0cmluZztcblx0cmVhZG9ubHkgaGFuZGxlcjogc3RyaW5nO1xuXHRyZWFkb25seSByZXF1ZXN0OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj47XG59IHtcblx0aWYgKCFpc1BsYWluUmVjb3JkKHJhdykpIHtcblx0XHR0aHJvdyBuZXcgUWdpc1Nka0RlY2xhcmF0aW9uRXJyb3IoXG5cdFx0XHRgJHtsYWJlbFswXT8udG9VcHBlckNhc2UoKX0ke2xhYmVsLnNsaWNlKDEpfSBkZXNjcmlwdGlvbiBtdXN0IGJlIGFuIG9iamVjdGAsXG5cdFx0KTtcblx0fVxuXHRjb25zdCBpZCA9IHZhbGlkYXRlRGVjbGFyYXRpb25JZChyYXcuaWQsIGxhYmVsKTtcblx0Y29uc3QgdGl0bGUgPSB2YWxpZGF0ZU5vbkJsYW5rVGl0bGUocmF3LnRpdGxlLCBpZCk7XG5cdGlmIChcblx0XHR0eXBlb2YgcmF3LmhhbmRsZXIgIT09IFwic3RyaW5nXCIgfHxcblx0XHQhUFlUSE9OX0lERU5USUZJRVJfUEFUVEVSTi50ZXN0KHJhdy5oYW5kbGVyKVxuXHQpIHtcblx0XHR0aHJvdyBuZXcgUWdpc1Nka0RlY2xhcmF0aW9uRXJyb3IoXG5cdFx0XHRgJHtpZH06IGhhbmRsZXIgbXVzdCBiZSBhIHZhbGlkIFB5dGhvbiBpZGVudGlmaWVyYCxcblx0XHQpO1xuXHR9XG5cdGlmICghaXNQbGFpblJlY29yZChyYXcucmVxdWVzdCkpIHtcblx0XHR0aHJvdyBuZXcgUWdpc1Nka0RlY2xhcmF0aW9uRXJyb3IoXG5cdFx0XHRgJHtpZH06IHJlcXVlc3Qgc2NoZW1hIG11c3QgYmUgYW4gb2JqZWN0YCxcblx0XHQpO1xuXHR9XG5cdHJldHVybiB7XG5cdFx0cmF3LFxuXHRcdGlkLFxuXHRcdHRpdGxlLFxuXHRcdGhhbmRsZXI6IHJhdy5oYW5kbGVyLFxuXHRcdHJlcXVlc3Q6IE9iamVjdC5mcmVlemUoeyAuLi5yYXcucmVxdWVzdCB9KSxcblx0fTtcbn1cblxuZnVuY3Rpb24gcGFyc2VBY3Rpb25EZXNjcmlwdGlvbihyYXc6IHVua25vd24pOiBBY3Rpb25EZXNjcmlwdGlvbiB7XG5cdGNvbnN0IGhlYWQgPSBwYXJzZU9wZXJhdGlvbkhlYWQocmF3LCBcImFjdGlvblwiKTtcblx0aWYgKCFpc1BsYWluUmVjb3JkKGhlYWQucmF3LnJlc3VsdCkpIHtcblx0XHR0aHJvdyBuZXcgUWdpc1Nka0RlY2xhcmF0aW9uRXJyb3IoXG5cdFx0XHRgJHtoZWFkLmlkfTogcmVzdWx0IHNjaGVtYSBtdXN0IGJlIGFuIG9iamVjdGAsXG5cdFx0KTtcblx0fVxuXHRyZXR1cm4gT2JqZWN0LmZyZWV6ZSh7XG5cdFx0aWQ6IGhlYWQuaWQsXG5cdFx0dGl0bGU6IGhlYWQudGl0bGUsXG5cdFx0aGFuZGxlcjogaGVhZC5oYW5kbGVyLFxuXHRcdHJlcXVlc3Q6IGhlYWQucmVxdWVzdCxcblx0XHRyZXN1bHQ6IE9iamVjdC5mcmVlemUoeyAuLi5oZWFkLnJhdy5yZXN1bHQgfSksXG5cdH0pO1xufVxuXG5mdW5jdGlvbiBwYXJzZVN0cmVhbURlc2NyaXB0aW9uKHJhdzogdW5rbm93bik6IFN0cmVhbURlc2NyaXB0aW9uIHtcblx0Y29uc3QgaGVhZCA9IHBhcnNlT3BlcmF0aW9uSGVhZChyYXcsIFwic3RyZWFtXCIpO1xuXHRjb25zdCBkZWNsYXJlZCA9IGhlYWQucmF3LmV2ZW50cztcblx0aWYgKCFpc1BsYWluUmVjb3JkKGRlY2xhcmVkKSB8fCBPYmplY3Qua2V5cyhkZWNsYXJlZCkubGVuZ3RoID09PSAwKSB7XG5cdFx0dGhyb3cgbmV3IFFnaXNTZGtEZWNsYXJhdGlvbkVycm9yKFxuXHRcdFx0YCR7aGVhZC5pZH06IGV2ZW50cyBtdXN0IG1hcCBhdCBsZWFzdCBvbmUgZXZlbnQga2luZCB0byBhIHNjaGVtYWAsXG5cdFx0KTtcblx0fVxuXHRjb25zdCBldmVudHM6IFBhcnRpYWw8XG5cdFx0UmVjb3JkPFN0cmVhbUV2ZW50S2luZCwgUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+PlxuXHQ+ID0ge307XG5cdGZvciAoY29uc3QgW2tpbmQsIHNjaGVtYV0gb2YgT2JqZWN0LmVudHJpZXMoZGVjbGFyZWQpKSB7XG5cdFx0aWYgKCFTVFJFQU1fRVZFTlRfS0lORFMuaW5jbHVkZXMoa2luZCBhcyBTdHJlYW1FdmVudEtpbmQpKSB7XG5cdFx0XHR0aHJvdyBuZXcgUWdpc1Nka0RlY2xhcmF0aW9uRXJyb3IoXG5cdFx0XHRcdGAke2hlYWQuaWR9OiAke2tpbmR9IGlzIG5vdCBhIHN0cmVhbSBldmVudCBraW5kYCxcblx0XHRcdCk7XG5cdFx0fVxuXHRcdGlmICghaXNQbGFpblJlY29yZChzY2hlbWEpKSB7XG5cdFx0XHR0aHJvdyBuZXcgUWdpc1Nka0RlY2xhcmF0aW9uRXJyb3IoXG5cdFx0XHRcdGAke2hlYWQuaWR9OiBldmVudHMuJHtraW5kfSBzY2hlbWEgbXVzdCBiZSBhbiBvYmplY3RgLFxuXHRcdFx0KTtcblx0XHR9XG5cdFx0ZXZlbnRzW2tpbmQgYXMgU3RyZWFtRXZlbnRLaW5kXSA9IE9iamVjdC5mcmVlemUoeyAuLi5zY2hlbWEgfSk7XG5cdH1cblx0cmV0dXJuIE9iamVjdC5mcmVlemUoe1xuXHRcdGlkOiBoZWFkLmlkLFxuXHRcdHRpdGxlOiBoZWFkLnRpdGxlLFxuXHRcdGhhbmRsZXI6IGhlYWQuaGFuZGxlcixcblx0XHRyZXF1ZXN0OiBoZWFkLnJlcXVlc3QsXG5cdFx0ZXZlbnRzOiBPYmplY3QuZnJlZXplKGV2ZW50cyksXG5cdH0pO1xufVxuXG4vKipcbiAqIFBhcnNlIGFuZCB2YWxpZGF0ZSBhIHZlcnNpb24gMSBgUGx1Z2luRGVzY3JpcHRpb25gIGVtaXR0ZWQgYnkgYGRlc2NyaWJlX3BsdWdpbmAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVBsdWdpbkRlc2NyaXB0aW9uKFxuXHRpbnB1dDogc3RyaW5nIHwgUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+LFxuKTogUGx1Z2luRGVzY3JpcHRpb24ge1xuXHRsZXQgcGFyc2VkOiB1bmtub3duID0gaW5wdXQ7XG5cdGlmICh0eXBlb2YgaW5wdXQgPT09IFwic3RyaW5nXCIpIHtcblx0XHR0cnkge1xuXHRcdFx0cGFyc2VkID0gSlNPTi5wYXJzZShpbnB1dCk7XG5cdFx0fSBjYXRjaCB7XG5cdFx0XHR0aHJvdyBuZXcgUWdpc1Nka0RlY2xhcmF0aW9uRXJyb3IoXCJQbHVnaW4gZGVzY3JpcHRpb24gaXMgbm90IHZhbGlkIEpTT05cIik7XG5cdFx0fVxuXHR9XG5cdGlmICghaXNQbGFpblJlY29yZChwYXJzZWQpKSB7XG5cdFx0dGhyb3cgbmV3IFFnaXNTZGtEZWNsYXJhdGlvbkVycm9yKFwiUGx1Z2luIGRlc2NyaXB0aW9uIG11c3QgYmUgYW4gb2JqZWN0XCIpO1xuXHR9XG5cdGlmIChwYXJzZWQuc2NoZW1hX3ZlcnNpb24gIT09IFBMVUdJTl9ERVNDUklQVElPTl9TQ0hFTUFfVkVSU0lPTikge1xuXHRcdHRocm93IG5ldyBRZ2lzU2RrRGVjbGFyYXRpb25FcnJvcihcblx0XHRcdGBVbnN1cHBvcnRlZCBwbHVnaW4gZGVzY3JpcHRpb24gc2NoZW1hX3ZlcnNpb246ICR7U3RyaW5nKHBhcnNlZC5zY2hlbWFfdmVyc2lvbil9YCxcblx0XHQpO1xuXHR9XG5cdGNvbnN0IGlkID0gdmFsaWRhdGVEZWNsYXJhdGlvbklkKHBhcnNlZC5pZCwgXCJwbHVnaW5cIik7XG5cdGNvbnN0IHRpdGxlID0gdmFsaWRhdGVOb25CbGFua1RpdGxlKHBhcnNlZC50aXRsZSwgaWQpO1xuXHRpZiAoIUFycmF5LmlzQXJyYXkocGFyc2VkLmFjdGlvbnMpKSB7XG5cdFx0dGhyb3cgbmV3IFFnaXNTZGtEZWNsYXJhdGlvbkVycm9yKGAke2lkfTogYWN0aW9ucyBtdXN0IGJlIGFuIGFycmF5YCk7XG5cdH1cblx0Y29uc3QgZGVjbGFyZWRTdHJlYW1zID0gcGFyc2VkLnN0cmVhbXMgPz8gW107XG5cdGlmICghQXJyYXkuaXNBcnJheShkZWNsYXJlZFN0cmVhbXMpKSB7XG5cdFx0dGhyb3cgbmV3IFFnaXNTZGtEZWNsYXJhdGlvbkVycm9yKGAke2lkfTogc3RyZWFtcyBtdXN0IGJlIGFuIGFycmF5YCk7XG5cdH1cblx0Ly8gQWN0aW9ucyBhbmQgc3RyZWFtcyBzaGFyZSBvbmUgaWQgbmFtZXNwYWNlIChkZWNpc2lvbi0yOCkuXG5cdGNvbnN0IHNlZW5JZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblx0Y29uc3QgY2xhaW0gPSAob3BlcmF0aW9uSWQ6IHN0cmluZywgbGFiZWw6IHN0cmluZyk6IHZvaWQgPT4ge1xuXHRcdGlmIChzZWVuSWRzLmhhcyhvcGVyYXRpb25JZCkpIHtcblx0XHRcdHRocm93IG5ldyBRZ2lzU2RrRGVjbGFyYXRpb25FcnJvcihcblx0XHRcdFx0YCR7aWR9OiBkdXBsaWNhdGUgJHtsYWJlbH0gaWQgJHtvcGVyYXRpb25JZH1gLFxuXHRcdFx0KTtcblx0XHR9XG5cdFx0c2Vlbklkcy5hZGQob3BlcmF0aW9uSWQpO1xuXHR9O1xuXHRjb25zdCBhY3Rpb25zOiBBY3Rpb25EZXNjcmlwdGlvbltdID0gW107XG5cdGZvciAoY29uc3QgaXRlbSBvZiBwYXJzZWQuYWN0aW9ucykge1xuXHRcdGNvbnN0IGFjdGlvbiA9IHBhcnNlQWN0aW9uRGVzY3JpcHRpb24oaXRlbSk7XG5cdFx0Y2xhaW0oYWN0aW9uLmlkLCBcImFjdGlvblwiKTtcblx0XHRhY3Rpb25zLnB1c2goYWN0aW9uKTtcblx0fVxuXHRjb25zdCBzdHJlYW1zOiBTdHJlYW1EZXNjcmlwdGlvbltdID0gW107XG5cdGZvciAoY29uc3QgaXRlbSBvZiBkZWNsYXJlZFN0cmVhbXMpIHtcblx0XHRjb25zdCBzdHJlYW0gPSBwYXJzZVN0cmVhbURlc2NyaXB0aW9uKGl0ZW0pO1xuXHRcdGNsYWltKHN0cmVhbS5pZCwgXCJzdHJlYW1cIik7XG5cdFx0c3RyZWFtcy5wdXNoKHN0cmVhbSk7XG5cdH1cblx0Y29uc3QgYnlJZCA9IChcblx0XHRsZWZ0OiB7IHJlYWRvbmx5IGlkOiBzdHJpbmcgfSxcblx0XHRyaWdodDogeyByZWFkb25seSBpZDogc3RyaW5nIH0sXG5cdCk6IG51bWJlciA9PiAobGVmdC5pZCA8IHJpZ2h0LmlkID8gLTEgOiAxKTtcblx0YWN0aW9ucy5zb3J0KGJ5SWQpO1xuXHRzdHJlYW1zLnNvcnQoYnlJZCk7XG5cdHJldHVybiBPYmplY3QuZnJlZXplKHtcblx0XHRzY2hlbWFfdmVyc2lvbjogUExVR0lOX0RFU0NSSVBUSU9OX1NDSEVNQV9WRVJTSU9OLFxuXHRcdGlkLFxuXHRcdHRpdGxlLFxuXHRcdGFjdGlvbnM6IE9iamVjdC5mcmVlemUoYWN0aW9ucyksXG5cdFx0c3RyZWFtczogT2JqZWN0LmZyZWV6ZShzdHJlYW1zKSxcblx0fSk7XG59XG4iLAogICAgIi8qKlxuICogVmFsaWRhdGUgYSB2YWx1ZSBhZ2FpbnN0IHRoZSBzY2hlbWEgc3Vic2V0IGBkZXNjcmliZV9wbHVnaW5gIGVtaXRzLlxuICpcbiAqIFRoaXMgaXMgdGhlIFR5cGVTY3JpcHQgc2lkZSBvZiBgcWdpc19zZGsuYnJpZGdlLnNjaGVtYWA6IHRoZSBzYW1lIGNsb3NlZFxuICogZGlhbGVjdCAob2JqZWN0cyB3aXRoIGBwcm9wZXJ0aWVzYC9gcmVxdWlyZWRgL2BhZGRpdGlvbmFsUHJvcGVydGllc2AsIGFycmF5c1xuICogd2l0aCBgaXRlbXNgLCB0aGUgZml2ZSBKU09OIHByaW1pdGl2ZXMsIGBhbnlPZmAgYW5kIGBlbnVtYCwgdGhlIGludGVnZXJcbiAqIGJvdW5kcyBhbmQgYHBhdHRlcm5gKSBjaGVja2VkIHRoZSBzYW1lIHdheSwgc28gYFFnaXNTZGtgIHJlZnVzZXMgb24gdGhlIHBhZ2VcbiAqIGV4YWN0bHkgd2hhdCB0aGUgaG9zdCB3b3VsZCByZWZ1c2UgYSBtZXNzYWdlIGxhdGVyLiBBbnl0aGluZyBvdXRzaWRlIHRoZVxuICogZGlhbGVjdCBpcyBhIGRlY2xhcmF0aW9uIGZhdWx0IGFuZCB0aHJvd3M7IGEgdmFsdWUgdGhhdCBkb2VzIG5vdCBmaXQgaXMgYW5cbiAqIGlzc3VlIHRoZSBjYWxsZXIgcmVwb3J0cy5cbiAqXG4gKiBUaGUgdHdvIGFzeW1tZXRyaWVzIG9mIGRlY2lzaW9uLTIyIGhvbGQgaGVyZSB0b286IGEgcmVxdWVzdCBpcyBjaGVja2VkXG4gKiBzdHJpY3RseSAoYW4gdW5rbm93biBwcm9wZXJ0eSBpcyBhbiBpc3N1ZSB3aGVuIHRoZSBzY2hlbWEgY2xvc2VzIHRoZVxuICogb2JqZWN0KSwgYSByZXN1bHQgb3IgYW4gZXZlbnQgbGVuaWVudGx5IChgYWxsb3dVbmtub3duYCksIHNvIGEgaG9zdCBtYXkgYWRkXG4gKiBhIGZpZWxkIHdpdGhvdXQgYnJlYWtpbmcgYW4gb2xkZXIgcGFnZSB3aGlsZSBhIG1pc3Npbmcgb3IgbWlzdHlwZWQgZmllbGQgaXNcbiAqIHN0aWxsIGNhdWdodC5cbiAqL1xuXG5pbXBvcnQge1xuXHRRZ2lzU2RrRGVjbGFyYXRpb25FcnJvcixcblx0UWdpc1Nka1ZhbGlkYXRpb25Jc3N1ZSxcblx0dHlwZSBTZXJpYWxpemVkVmFsaWRhdGlvbklzc3VlLFxufSBmcm9tIFwiLi9kZWNsYXJhdGlvbnNcIjtcbmltcG9ydCB7IFFnaXNTZGtFcnJvciB9IGZyb20gXCIuL2Vycm9yc1wiO1xuaW1wb3J0IHsgaXNQbGFpblJlY29yZCB9IGZyb20gXCIuL2ludGVybmFsXCI7XG5cbi8qKiBPbmUgc2NoZW1hIG9mIHRoZSBkZWNsYXJlZCBkaWFsZWN0LCBhcyB0aGUgZGVzY3JpcHRpb24gY2FycmllcyBpdC4gKi9cbmV4cG9ydCB0eXBlIERlY2xhcmVkU2NoZW1hID0gUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+O1xuXG4vKiogT3B0aW9ucyBmb3Ige0BsaW5rIHZhbGlkYXRlQWdhaW5zdFNjaGVtYX0uICovXG5leHBvcnQgaW50ZXJmYWNlIFZhbGlkYXRlT3B0aW9ucyB7XG5cdC8qKiBJZ25vcmUgcHJvcGVydGllcyB0aGUgc2NoZW1hIGRvZXMgbm90IG5hbWUgKHJlc3VsdHMgYW5kIGV2ZW50cykuICovXG5cdHJlYWRvbmx5IGFsbG93VW5rbm93bj86IGJvb2xlYW47XG5cdC8qKiBXaGVyZSB0aGUgdmFsdWUgc2l0cywgcHJlZml4ZWQgdG8gZXZlcnkgaXNzdWUncyBwYXRoLiAqL1xuXHRyZWFkb25seSBwYXRoPzogcmVhZG9ubHkgKHN0cmluZyB8IG51bWJlcilbXTtcbn1cblxuLyoqIFdoaWNoIHNpZGUgb2YgYSBjYWxsIGEgY29udHJhY3QgaXNzdWUgYmVsb25ncyB0by4gKi9cbmV4cG9ydCB0eXBlIENvbnRyYWN0RGlyZWN0aW9uID0gXCJyZXF1ZXN0XCIgfCBcInJlc3VsdFwiIHwgXCJldmVudFwiO1xuXG4vKiogVGhlIEpTT04gZm9ybSBvZiB7QGxpbmsgUWdpc1Nka0NvbnRyYWN0RXJyb3J9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJpYWxpemVkQ29udHJhY3RFcnJvciB7XG5cdHJlYWRvbmx5IGNvZGU6IHN0cmluZztcblx0cmVhZG9ubHkgb3BlcmF0aW9uOiBzdHJpbmc7XG5cdHJlYWRvbmx5IGRpcmVjdGlvbjogQ29udHJhY3REaXJlY3Rpb247XG5cdHJlYWRvbmx5IGlzc3VlczogU2VyaWFsaXplZFZhbGlkYXRpb25Jc3N1ZVtdO1xufVxuXG4vKipcbiAqIEFuIGFyZ3VtZW50LCBhIHJlcGx5IG9yIGFuIGV2ZW50IGRvZXMgbm90IG1hdGNoIHRoZSBkZWNsYXJlZCBjb250cmFjdC5cbiAqXG4gKiBUaGUgY29kZSBpcyB0aGUgb25lIGJvdGggbGFuZ3VhZ2VzIHVzZSBmb3IgdGhpcyBjYXRlZ29yeSwgc28gYSBwYWdlIHRoYXRcbiAqIGFscmVhZHkgbWF0Y2hlcyBgY29udHJhY3RfdmFsaWRhdGlvbl9mYWlsZWRgIG5lZWRzIG5vIHNlY29uZCBicmFuY2guXG4gKi9cbmV4cG9ydCBjbGFzcyBRZ2lzU2RrQ29udHJhY3RFcnJvciBleHRlbmRzIFFnaXNTZGtFcnJvciB7XG5cdHB1YmxpYyByZWFkb25seSBvcGVyYXRpb246IHN0cmluZztcblx0cHVibGljIHJlYWRvbmx5IGRpcmVjdGlvbjogQ29udHJhY3REaXJlY3Rpb247XG5cdHB1YmxpYyByZWFkb25seSBpc3N1ZXM6IHJlYWRvbmx5IFFnaXNTZGtWYWxpZGF0aW9uSXNzdWVbXTtcblxuXHRwdWJsaWMgY29uc3RydWN0b3IoXG5cdFx0b3BlcmF0aW9uOiBzdHJpbmcsXG5cdFx0ZGlyZWN0aW9uOiBDb250cmFjdERpcmVjdGlvbixcblx0XHRpc3N1ZXM6IHJlYWRvbmx5IFFnaXNTZGtWYWxpZGF0aW9uSXNzdWVbXSxcblx0KSB7XG5cdFx0Y29uc3QgZGV0YWlsID0gaXNzdWVzWzBdID09PSB1bmRlZmluZWQgPyBcIlwiIDogYDogJHtkZXNjcmliZShpc3N1ZXNbMF0pfWA7XG5cdFx0c3VwZXIoXG5cdFx0XHRgJHtvcGVyYXRpb259OiB0aGUgJHtkaXJlY3Rpb259IGRvZXMgbm90IG1hdGNoIHRoZSBkZWNsYXJlZCBjb250cmFjdCR7ZGV0YWlsfWAsXG5cdFx0XHRcImNvbnRyYWN0X3ZhbGlkYXRpb25fZmFpbGVkXCIsXG5cdFx0KTtcblx0XHR0aGlzLm9wZXJhdGlvbiA9IG9wZXJhdGlvbjtcblx0XHR0aGlzLmRpcmVjdGlvbiA9IGRpcmVjdGlvbjtcblx0XHR0aGlzLmlzc3VlcyA9IE9iamVjdC5mcmVlemUoWy4uLmlzc3Vlc10pO1xuXHR9XG5cblx0cHVibGljIHRvSlNPTigpOiBTZXJpYWxpemVkQ29udHJhY3RFcnJvciB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdGNvZGU6IHRoaXMuY29kZSxcblx0XHRcdG9wZXJhdGlvbjogdGhpcy5vcGVyYXRpb24sXG5cdFx0XHRkaXJlY3Rpb246IHRoaXMuZGlyZWN0aW9uLFxuXHRcdFx0aXNzdWVzOiB0aGlzLmlzc3Vlcy5tYXAoKGlzc3VlKSA9PiBpc3N1ZS50b0pTT04oKSksXG5cdFx0fTtcblx0fVxufVxuXG5mdW5jdGlvbiBkZXNjcmliZShpc3N1ZTogUWdpc1Nka1ZhbGlkYXRpb25Jc3N1ZSk6IHN0cmluZyB7XG5cdGNvbnN0IHdoZXJlID0gaXNzdWUucGF0aC5sZW5ndGggPT09IDAgPyBcInZhbHVlXCIgOiBpc3N1ZS5wYXRoLmpvaW4oXCIuXCIpO1xuXHRyZXR1cm4gYCR7d2hlcmV9ICR7aXNzdWUuY29kZX1gO1xufVxuXG5jb25zdCBQUklNSVRJVkVTOiBSZWFkb25seVNldDxzdHJpbmc+ID0gbmV3IFNldChbXG5cdFwic3RyaW5nXCIsXG5cdFwiYm9vbGVhblwiLFxuXHRcImludGVnZXJcIixcblx0XCJudW1iZXJcIixcblx0XCJudWxsXCIsXG5cdFwiYXJyYXlcIixcblx0XCJvYmplY3RcIixcbl0pO1xuXG5jb25zdCBLTk9XTl9LRVlXT1JEUzogUmVhZG9ubHlTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoW1xuXHRcInR5cGVcIixcblx0XCJwcm9wZXJ0aWVzXCIsXG5cdFwicmVxdWlyZWRcIixcblx0XCJhZGRpdGlvbmFsUHJvcGVydGllc1wiLFxuXHRcIml0ZW1zXCIsXG5cdFwiYW55T2ZcIixcblx0XCJlbnVtXCIsXG5cdFwibWluaW11bVwiLFxuXHRcIm1heGltdW1cIixcblx0XCJwYXR0ZXJuXCIsXG5cdFwidGl0bGVcIixcblx0XCJkZXNjcmlwdGlvblwiLFxuXSk7XG5cbnR5cGUgUGF0aCA9IHJlYWRvbmx5IChzdHJpbmcgfCBudW1iZXIpW107XG5cbi8qKlxuICogUmV0dXJuIGV2ZXJ5IGlzc3VlIGB2YWx1ZWAgaGFzIGFnYWluc3QgYHNjaGVtYWA7IGFuIGVtcHR5IGFycmF5IGlzIGEgbWF0Y2guXG4gKlxuICogVGhyb3dzIHtAbGluayBRZ2lzU2RrRGVjbGFyYXRpb25FcnJvcn0gd2hlbiBgc2NoZW1hYCBsZWF2ZXMgdGhlIGRlY2xhcmVkXG4gKiBkaWFsZWN0LCBiZWNhdXNlIHRoYXQgaXMgYSBmYXVsdCBpbiB0aGUgZGVjbGFyYXRpb24sIG5ldmVyIGluIHRoZSB2YWx1ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlQWdhaW5zdFNjaGVtYShcblx0dmFsdWU6IHVua25vd24sXG5cdHNjaGVtYTogRGVjbGFyZWRTY2hlbWEsXG5cdG9wdGlvbnM6IFZhbGlkYXRlT3B0aW9ucyA9IHt9LFxuKTogUWdpc1Nka1ZhbGlkYXRpb25Jc3N1ZVtdIHtcblx0Y29uc3QgaXNzdWVzOiBRZ2lzU2RrVmFsaWRhdGlvbklzc3VlW10gPSBbXTtcblx0Y2hlY2soXG5cdFx0dmFsdWUsXG5cdFx0c2NoZW1hLFxuXHRcdG9wdGlvbnMucGF0aCA/PyBbXSxcblx0XHRvcHRpb25zLmFsbG93VW5rbm93biA9PT0gdHJ1ZSxcblx0XHRpc3N1ZXMsXG5cdCk7XG5cdHJldHVybiBpc3N1ZXM7XG59XG5cbmZ1bmN0aW9uIGNoZWNrKFxuXHR2YWx1ZTogdW5rbm93bixcblx0c2NoZW1hOiB1bmtub3duLFxuXHRwYXRoOiBQYXRoLFxuXHRhbGxvd1Vua25vd246IGJvb2xlYW4sXG5cdGlzc3VlczogUWdpc1Nka1ZhbGlkYXRpb25Jc3N1ZVtdLFxuKTogdm9pZCB7XG5cdGlmICghaXNQbGFpblJlY29yZChzY2hlbWEpKSB7XG5cdFx0dGhyb3cgbmV3IFFnaXNTZGtEZWNsYXJhdGlvbkVycm9yKFxuXHRcdFx0YCR7d2hlcmUocGF0aCl9OiBhIHNjaGVtYSBtdXN0IGJlIGFuIG9iamVjdGAsXG5cdFx0KTtcblx0fVxuXHRjb25zdCB1bmtub3duID0gT2JqZWN0LmtleXMoc2NoZW1hKS5maWx0ZXIoKGtleSkgPT4gIUtOT1dOX0tFWVdPUkRTLmhhcyhrZXkpKTtcblx0aWYgKHVua25vd24ubGVuZ3RoID4gMCkge1xuXHRcdHRocm93IG5ldyBRZ2lzU2RrRGVjbGFyYXRpb25FcnJvcihcblx0XHRcdGAke3doZXJlKHBhdGgpfTogdW5zdXBwb3J0ZWQgc2NoZW1hIGtleXdvcmQocykgJHt1bmtub3duLnNvcnQoKS5qb2luKFwiLCBcIil9YCxcblx0XHQpO1xuXHR9XG5cdGlmIChcImFueU9mXCIgaW4gc2NoZW1hKSB7XG5cdFx0Y29uc3QgYnJhbmNoZXMgPSBzY2hlbWEuYW55T2Y7XG5cdFx0aWYgKCFBcnJheS5pc0FycmF5KGJyYW5jaGVzKSB8fCBicmFuY2hlcy5sZW5ndGggPT09IDApIHtcblx0XHRcdHRocm93IG5ldyBRZ2lzU2RrRGVjbGFyYXRpb25FcnJvcihcblx0XHRcdFx0YCR7d2hlcmUocGF0aCl9OiBhbnlPZiBtdXN0IGJlIGEgbm9uZW1wdHkgbGlzdGAsXG5cdFx0XHQpO1xuXHRcdH1cblx0XHRmb3IgKGNvbnN0IGJyYW5jaCBvZiBicmFuY2hlcykge1xuXHRcdFx0Y29uc3QgYXR0ZW1wdDogUWdpc1Nka1ZhbGlkYXRpb25Jc3N1ZVtdID0gW107XG5cdFx0XHRjaGVjayh2YWx1ZSwgYnJhbmNoLCBwYXRoLCBhbGxvd1Vua25vd24sIGF0dGVtcHQpO1xuXHRcdFx0aWYgKGF0dGVtcHQubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHR9XG5cdFx0aXNzdWVzLnB1c2gobmV3IFFnaXNTZGtWYWxpZGF0aW9uSXNzdWUoWy4uLnBhdGhdLCBcImFueV9vZlwiKSk7XG5cdFx0cmV0dXJuO1xuXHR9XG5cdGlmIChcImVudW1cIiBpbiBzY2hlbWEpIHtcblx0XHRjb25zdCBjaG9pY2VzID0gc2NoZW1hLmVudW07XG5cdFx0aWYgKCFBcnJheS5pc0FycmF5KGNob2ljZXMpKSB7XG5cdFx0XHR0aHJvdyBuZXcgUWdpc1Nka0RlY2xhcmF0aW9uRXJyb3IoYCR7d2hlcmUocGF0aCl9OiBlbnVtIG11c3QgYmUgYSBsaXN0YCk7XG5cdFx0fVxuXHRcdGlmICghY2hvaWNlcy5zb21lKChjaG9pY2UpID0+IHNhbWVKc29uKGNob2ljZSwgdmFsdWUpKSkge1xuXHRcdFx0aXNzdWVzLnB1c2gobmV3IFFnaXNTZGtWYWxpZGF0aW9uSXNzdWUoWy4uLnBhdGhdLCBcImVudW1cIikpO1xuXHRcdH1cblx0XHRyZXR1cm47XG5cdH1cblx0Y29uc3QgZGVjbGFyZWQgPSBzY2hlbWEudHlwZTtcblx0aWYgKGRlY2xhcmVkID09PSB1bmRlZmluZWQpIHtcblx0XHR0aHJvdyBuZXcgUWdpc1Nka0RlY2xhcmF0aW9uRXJyb3IoXG5cdFx0XHRgJHt3aGVyZShwYXRoKX06IGEgc2NoZW1hIG5lZWRzIGEgdHlwZSwgYW55T2Ygb3IgZW51bWAsXG5cdFx0KTtcblx0fVxuXHRpZiAodHlwZW9mIGRlY2xhcmVkICE9PSBcInN0cmluZ1wiIHx8ICFQUklNSVRJVkVTLmhhcyhkZWNsYXJlZCkpIHtcblx0XHR0aHJvdyBuZXcgUWdpc1Nka0RlY2xhcmF0aW9uRXJyb3IoXG5cdFx0XHRgJHt3aGVyZShwYXRoKX06IHVuc3VwcG9ydGVkIHR5cGUgJHtKU09OLnN0cmluZ2lmeShkZWNsYXJlZCl9YCxcblx0XHQpO1xuXHR9XG5cdHN3aXRjaCAoZGVjbGFyZWQpIHtcblx0XHRjYXNlIFwic3RyaW5nXCI6XG5cdFx0XHRjaGVja1N0cmluZyh2YWx1ZSwgc2NoZW1hLCBwYXRoLCBpc3N1ZXMpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdGNhc2UgXCJib29sZWFuXCI6XG5cdFx0XHRpZiAodHlwZW9mIHZhbHVlICE9PSBcImJvb2xlYW5cIikge1xuXHRcdFx0XHRpc3N1ZXMucHVzaChuZXcgUWdpc1Nka1ZhbGlkYXRpb25Jc3N1ZShbLi4ucGF0aF0sIFwidHlwZVwiKSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm47XG5cdFx0Y2FzZSBcImludGVnZXJcIjpcblx0XHRcdGlmICh0eXBlb2YgdmFsdWUgIT09IFwibnVtYmVyXCIgfHwgIU51bWJlci5pc0ludGVnZXIodmFsdWUpKSB7XG5cdFx0XHRcdGlzc3Vlcy5wdXNoKG5ldyBRZ2lzU2RrVmFsaWRhdGlvbklzc3VlKFsuLi5wYXRoXSwgXCJ0eXBlXCIpKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0Y2hlY2tCb3VuZHModmFsdWUsIHNjaGVtYSwgcGF0aCwgaXNzdWVzKTtcblx0XHRcdHJldHVybjtcblx0XHRjYXNlIFwibnVtYmVyXCI6XG5cdFx0XHRpZiAodHlwZW9mIHZhbHVlICE9PSBcIm51bWJlclwiKSB7XG5cdFx0XHRcdGlzc3Vlcy5wdXNoKG5ldyBRZ2lzU2RrVmFsaWRhdGlvbklzc3VlKFsuLi5wYXRoXSwgXCJ0eXBlXCIpKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCFOdW1iZXIuaXNGaW5pdGUodmFsdWUpKSB7XG5cdFx0XHRcdGlzc3Vlcy5wdXNoKG5ldyBRZ2lzU2RrVmFsaWRhdGlvbklzc3VlKFsuLi5wYXRoXSwgXCJub3RfZmluaXRlXCIpKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0Y2hlY2tCb3VuZHModmFsdWUsIHNjaGVtYSwgcGF0aCwgaXNzdWVzKTtcblx0XHRcdHJldHVybjtcblx0XHRjYXNlIFwibnVsbFwiOlxuXHRcdFx0aWYgKHZhbHVlICE9PSBudWxsKSB7XG5cdFx0XHRcdGlzc3Vlcy5wdXNoKG5ldyBRZ2lzU2RrVmFsaWRhdGlvbklzc3VlKFsuLi5wYXRoXSwgXCJ0eXBlXCIpKTtcblx0XHRcdH1cblx0XHRcdHJldHVybjtcblx0XHRjYXNlIFwiYXJyYXlcIjpcblx0XHRcdGNoZWNrQXJyYXkodmFsdWUsIHNjaGVtYSwgcGF0aCwgYWxsb3dVbmtub3duLCBpc3N1ZXMpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdGRlZmF1bHQ6XG5cdFx0XHRjaGVja09iamVjdCh2YWx1ZSwgc2NoZW1hLCBwYXRoLCBhbGxvd1Vua25vd24sIGlzc3Vlcyk7XG5cdH1cbn1cblxuZnVuY3Rpb24gY2hlY2tTdHJpbmcoXG5cdHZhbHVlOiB1bmtub3duLFxuXHRzY2hlbWE6IERlY2xhcmVkU2NoZW1hLFxuXHRwYXRoOiBQYXRoLFxuXHRpc3N1ZXM6IFFnaXNTZGtWYWxpZGF0aW9uSXNzdWVbXSxcbik6IHZvaWQge1xuXHRpZiAodHlwZW9mIHZhbHVlICE9PSBcInN0cmluZ1wiKSB7XG5cdFx0aXNzdWVzLnB1c2gobmV3IFFnaXNTZGtWYWxpZGF0aW9uSXNzdWUoWy4uLnBhdGhdLCBcInR5cGVcIikpO1xuXHRcdHJldHVybjtcblx0fVxuXHRjb25zdCBwYXR0ZXJuID0gc2NoZW1hLnBhdHRlcm47XG5cdGlmIChwYXR0ZXJuID09PSB1bmRlZmluZWQgfHwgcGF0dGVybiA9PT0gbnVsbCkge1xuXHRcdHJldHVybjtcblx0fVxuXHRpZiAodHlwZW9mIHBhdHRlcm4gIT09IFwic3RyaW5nXCIpIHtcblx0XHR0aHJvdyBuZXcgUWdpc1Nka0RlY2xhcmF0aW9uRXJyb3IoXG5cdFx0XHRgJHt3aGVyZShwYXRoKX06IHBhdHRlcm4gbXVzdCBiZSBhIHN0cmluZ2AsXG5cdFx0KTtcblx0fVxuXHRsZXQgZXhwcmVzc2lvbjogUmVnRXhwO1xuXHR0cnkge1xuXHRcdC8vIFB5dGhvbidzIHJlLmZ1bGxtYXRjaDogdGhlIHdob2xlIHN0cmluZywgd2l0aCB0aGUgdW5pY29kZSBmbGFnIHRoZVxuXHRcdC8vIGRlY2xhcmF0aW9uIHNpZGUgYWxyZWFkeSBhc3N1bWVzLlxuXHRcdGV4cHJlc3Npb24gPSBuZXcgUmVnRXhwKGBeKD86JHtwYXR0ZXJufSkkYCwgXCJ1XCIpO1xuXHR9IGNhdGNoIChlcnJvcikge1xuXHRcdHRocm93IG5ldyBRZ2lzU2RrRGVjbGFyYXRpb25FcnJvcihcblx0XHRcdGAke3doZXJlKHBhdGgpfTogcGF0dGVybiAke0pTT04uc3RyaW5naWZ5KHBhdHRlcm4pfSBpcyB1bnVzYWJsZTogJHtTdHJpbmcoZXJyb3IpfWAsXG5cdFx0KTtcblx0fVxuXHRpZiAoIWV4cHJlc3Npb24udGVzdCh2YWx1ZSkpIHtcblx0XHRpc3N1ZXMucHVzaChuZXcgUWdpc1Nka1ZhbGlkYXRpb25Jc3N1ZShbLi4ucGF0aF0sIFwicGF0dGVyblwiKSk7XG5cdH1cbn1cblxuZnVuY3Rpb24gY2hlY2tCb3VuZHMoXG5cdHZhbHVlOiBudW1iZXIsXG5cdHNjaGVtYTogRGVjbGFyZWRTY2hlbWEsXG5cdHBhdGg6IFBhdGgsXG5cdGlzc3VlczogUWdpc1Nka1ZhbGlkYXRpb25Jc3N1ZVtdLFxuKTogdm9pZCB7XG5cdGNvbnN0IG1pbmltdW0gPSBzY2hlbWEubWluaW11bTtcblx0aWYgKHR5cGVvZiBtaW5pbXVtID09PSBcIm51bWJlclwiICYmIHZhbHVlIDwgbWluaW11bSkge1xuXHRcdGlzc3Vlcy5wdXNoKG5ldyBRZ2lzU2RrVmFsaWRhdGlvbklzc3VlKFsuLi5wYXRoXSwgXCJtaW5pbXVtXCIpKTtcblx0fVxuXHRjb25zdCBtYXhpbXVtID0gc2NoZW1hLm1heGltdW07XG5cdGlmICh0eXBlb2YgbWF4aW11bSA9PT0gXCJudW1iZXJcIiAmJiB2YWx1ZSA+IG1heGltdW0pIHtcblx0XHRpc3N1ZXMucHVzaChuZXcgUWdpc1Nka1ZhbGlkYXRpb25Jc3N1ZShbLi4ucGF0aF0sIFwibWF4aW11bVwiKSk7XG5cdH1cbn1cblxuZnVuY3Rpb24gY2hlY2tBcnJheShcblx0dmFsdWU6IHVua25vd24sXG5cdHNjaGVtYTogRGVjbGFyZWRTY2hlbWEsXG5cdHBhdGg6IFBhdGgsXG5cdGFsbG93VW5rbm93bjogYm9vbGVhbixcblx0aXNzdWVzOiBRZ2lzU2RrVmFsaWRhdGlvbklzc3VlW10sXG4pOiB2b2lkIHtcblx0aWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuXHRcdGlzc3Vlcy5wdXNoKG5ldyBRZ2lzU2RrVmFsaWRhdGlvbklzc3VlKFsuLi5wYXRoXSwgXCJ0eXBlXCIpKTtcblx0XHRyZXR1cm47XG5cdH1cblx0Y29uc3QgaXRlbXMgPSBzY2hlbWEuaXRlbXM7XG5cdGlmIChpdGVtcyA9PT0gdW5kZWZpbmVkIHx8IGl0ZW1zID09PSBudWxsKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cdHZhbHVlLmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7XG5cdFx0Y2hlY2soaXRlbSwgaXRlbXMsIFsuLi5wYXRoLCBpbmRleF0sIGFsbG93VW5rbm93biwgaXNzdWVzKTtcblx0fSk7XG59XG5cbmZ1bmN0aW9uIGNoZWNrT2JqZWN0KFxuXHR2YWx1ZTogdW5rbm93bixcblx0c2NoZW1hOiBEZWNsYXJlZFNjaGVtYSxcblx0cGF0aDogUGF0aCxcblx0YWxsb3dVbmtub3duOiBib29sZWFuLFxuXHRpc3N1ZXM6IFFnaXNTZGtWYWxpZGF0aW9uSXNzdWVbXSxcbik6IHZvaWQge1xuXHRpZiAoIWlzUGxhaW5SZWNvcmQodmFsdWUpKSB7XG5cdFx0aXNzdWVzLnB1c2gobmV3IFFnaXNTZGtWYWxpZGF0aW9uSXNzdWUoWy4uLnBhdGhdLCBcInR5cGVcIikpO1xuXHRcdHJldHVybjtcblx0fVxuXHRjb25zdCBwcm9wZXJ0aWVzID0gc2NoZW1hLnByb3BlcnRpZXMgPz8ge307XG5cdGlmICghaXNQbGFpblJlY29yZChwcm9wZXJ0aWVzKSkge1xuXHRcdHRocm93IG5ldyBRZ2lzU2RrRGVjbGFyYXRpb25FcnJvcihcblx0XHRcdGAke3doZXJlKHBhdGgpfTogcHJvcGVydGllcyBtdXN0IGJlIGFuIG9iamVjdGAsXG5cdFx0KTtcblx0fVxuXHRjb25zdCByZXF1aXJlZCA9IHNjaGVtYS5yZXF1aXJlZCA/PyBbXTtcblx0aWYgKCFBcnJheS5pc0FycmF5KHJlcXVpcmVkKSkge1xuXHRcdHRocm93IG5ldyBRZ2lzU2RrRGVjbGFyYXRpb25FcnJvcihcblx0XHRcdGAke3doZXJlKHBhdGgpfTogcmVxdWlyZWQgbXVzdCBiZSBhIGxpc3RgLFxuXHRcdCk7XG5cdH1cblx0Zm9yIChjb25zdCBrZXkgb2YgcmVxdWlyZWQpIHtcblx0XHRpZiAodHlwZW9mIGtleSA9PT0gXCJzdHJpbmdcIiAmJiAhKGtleSBpbiB2YWx1ZSkpIHtcblx0XHRcdGlzc3Vlcy5wdXNoKG5ldyBRZ2lzU2RrVmFsaWRhdGlvbklzc3VlKFsuLi5wYXRoLCBrZXldLCBcInJlcXVpcmVkXCIpKTtcblx0XHR9XG5cdH1cblx0Y29uc3Qgc3RyaWN0ID0gc2NoZW1hLmFkZGl0aW9uYWxQcm9wZXJ0aWVzID09PSBmYWxzZSAmJiAhYWxsb3dVbmtub3duO1xuXHRmb3IgKGNvbnN0IFtrZXksIGl0ZW1dIG9mIE9iamVjdC5lbnRyaWVzKHZhbHVlKSkge1xuXHRcdGlmIChPYmplY3QuaGFzT3duKHByb3BlcnRpZXMsIGtleSkpIHtcblx0XHRcdGNoZWNrKGl0ZW0sIHByb3BlcnRpZXNba2V5XSwgWy4uLnBhdGgsIGtleV0sIGFsbG93VW5rbm93biwgaXNzdWVzKTtcblx0XHR9IGVsc2UgaWYgKHN0cmljdCkge1xuXHRcdFx0aXNzdWVzLnB1c2goXG5cdFx0XHRcdG5ldyBRZ2lzU2RrVmFsaWRhdGlvbklzc3VlKFsuLi5wYXRoLCBrZXldLCBcInVua25vd25fcHJvcGVydHlcIiksXG5cdFx0XHQpO1xuXHRcdH1cblx0fVxufVxuXG4vKiogSlNPTiBlcXVhbGl0eTogYHRydWVgIGlzIG5vdCBgMWAsIGFuZCBgMWAgaXMgYDEuMGAuICovXG5mdW5jdGlvbiBzYW1lSnNvbihhOiB1bmtub3duLCBiOiB1bmtub3duKTogYm9vbGVhbiB7XG5cdGlmIChhID09PSBiKSB7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblx0aWYgKHR5cGVvZiBhICE9PSB0eXBlb2YgYiB8fCBhID09PSBudWxsIHx8IGIgPT09IG51bGwpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblx0aWYgKEFycmF5LmlzQXJyYXkoYSkpIHtcblx0XHRyZXR1cm4gKFxuXHRcdFx0QXJyYXkuaXNBcnJheShiKSAmJlxuXHRcdFx0YS5sZW5ndGggPT09IGIubGVuZ3RoICYmXG5cdFx0XHRhLmV2ZXJ5KChpdGVtLCBpbmRleCkgPT4gc2FtZUpzb24oaXRlbSwgYltpbmRleF0pKVxuXHRcdCk7XG5cdH1cblx0aWYgKGlzUGxhaW5SZWNvcmQoYSkgJiYgaXNQbGFpblJlY29yZChiKSkge1xuXHRcdGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhhKTtcblx0XHRyZXR1cm4gKFxuXHRcdFx0a2V5cy5sZW5ndGggPT09IE9iamVjdC5rZXlzKGIpLmxlbmd0aCAmJlxuXHRcdFx0a2V5cy5ldmVyeSgoa2V5KSA9PiBPYmplY3QuaGFzT3duKGIsIGtleSkgJiYgc2FtZUpzb24oYVtrZXldLCBiW2tleV0pKVxuXHRcdCk7XG5cdH1cblx0cmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiB3aGVyZShwYXRoOiBQYXRoKTogc3RyaW5nIHtcblx0cmV0dXJuIHBhdGgubGVuZ3RoID09PSAwID8gXCJ2YWx1ZVwiIDogcGF0aC5qb2luKFwiLlwiKTtcbn1cbiIsCiAgICAiLyoqXG4gKiBUaGUgZGVmYXVsdCB0cmFuc3BvcnQ6IFF0J3MgV2ViQ2hhbm5lbCwgYXMgYSBRR0lTIHdlYiB2aWV3IGluamVjdHMgaXQuXG4gKlxuICogUUdJUyByZWdpc3RlcnMgb25lIG9iamVjdCBvbiB0aGUgY2hhbm5lbCAodGhlIGV4YW1wbGUgbmFtZXMgaXQgXCJicmlkZ2VcIjtcbiAqIHNlZSBgY3JlYXRlX2NoYW5uZWxfb2JqZWN0YCBpbiB0aGUgUHl0aG9uIHJ1bnRpbWUpLiBJdHMgYHJlY2VpdmVgIHNsb3QgdGFrZXNcbiAqIGEgSlNPTiBlbnZlbG9wZSBhbmQgaXRzIGBtZXNzYWdlYCBzaWduYWwgY2FycmllcyBldmVyeSByZXBseSBhbmQgc3RyZWFtXG4gKiBmcmFtZSBiYWNrLiBUaGUgY2hhbm5lbCBiZWNvbWVzIHJlYWR5IG9uIGEgbGF0ZXIgdHVybiwgc28gdGhpcyB0cmFuc3BvcnRcbiAqIGlzIGxhenk6IGEgYFFnaXNTZGtgIGJ1aWx0IGluIHRoZSBmaXJzdCBzdGF0ZW1lbnQgb2YgYSBwYWdlIGNhbiBzZW5kIGF0XG4gKiBvbmNlLCBhbmQgd2hhdCBpdCBzZW50IGlzIGRlbGl2ZXJlZCB3aGVuIHRoZSBjaGFubmVsIHJlcG9ydHMgcmVhZHkuXG4gKlxuICogVGhpcyBpcyB0aGUgb25lIG1vZHVsZSBvZiB0aGUgcm9vdCBlbnRyeSBwb2ludCB0aGF0IHJlYWRzIGEgYnJvd3NlciBnbG9iYWwsXG4gKiBhbmQgaXQgb25seSBkb2VzIHNvIHdoZW4gY2FsbGVkOiBpbXBvcnRpbmcgaXQgdG91Y2hlcyBub3RoaW5nLCBhbmQgYSBwYWdlXG4gKiB0aGF0IGlzIG5vdCBpbnNpZGUgUUdJUyBnZXRzIGEgc3luY2hyb25vdXMsIG5hbWVkIHJlZnVzYWwgaW5zdGVhZCBvZiBhIGhhbmcuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBXaXJlVHJhbnNwb3J0IH0gZnJvbSBcIi4vYnJpZGdlXCI7XG5pbXBvcnQgeyBRZ2lzU2RrRXJyb3IgfSBmcm9tIFwiLi9lcnJvcnNcIjtcblxuaW50ZXJmYWNlIENoYW5uZWxPYmplY3Qge1xuXHRyZWNlaXZlKHRleHQ6IHN0cmluZyk6IHZvaWQ7XG5cdHJlYWRvbmx5IG1lc3NhZ2U6IHtcblx0XHRjb25uZWN0KGxpc3RlbmVyOiAodGV4dDogc3RyaW5nKSA9PiB2b2lkKTogdm9pZDtcblx0XHRkaXNjb25uZWN0KGxpc3RlbmVyOiAodGV4dDogc3RyaW5nKSA9PiB2b2lkKTogdm9pZDtcblx0fTtcbn1cblxuaW50ZXJmYWNlIENoYW5uZWwge1xuXHRyZWFkb25seSBvYmplY3RzOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBDaGFubmVsT2JqZWN0IHwgdW5kZWZpbmVkPj47XG59XG5cbmludGVyZmFjZSBRdFNjb3BlIHtcblx0cmVhZG9ubHkgcXQ/OiB7IHJlYWRvbmx5IHdlYkNoYW5uZWxUcmFuc3BvcnQ6IHVua25vd24gfTtcblx0cmVhZG9ubHkgUVdlYkNoYW5uZWw/OiBuZXcgKFxuXHRcdHRyYW5zcG9ydDogdW5rbm93bixcblx0XHRyZWFkeTogKGNoYW5uZWw6IENoYW5uZWwpID0+IHZvaWQsXG5cdCkgPT4gdW5rbm93bjtcbn1cblxuLyoqIFRoZSB3ZWIgdmlldyBkaWQgbm90IHByb3ZpZGUgYSB1c2FibGUgY2hhbm5lbC4gKi9cbmV4cG9ydCBjbGFzcyBRZ2lzU2RrV2ViQ2hhbm5lbEVycm9yIGV4dGVuZHMgUWdpc1Nka0Vycm9yIHtcblx0cHVibGljIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xuXHRcdHN1cGVyKG1lc3NhZ2UsIFwibm9fd2ViX2NoYW5uZWxcIik7XG5cdH1cbn1cblxuLyoqIFRoZSB0cmFuc3BvcnQge0BsaW5rIGNyZWF0ZVdlYkNoYW5uZWxUcmFuc3BvcnR9IHJldHVybnMuICovXG5leHBvcnQgaW50ZXJmYWNlIFdlYkNoYW5uZWxUcmFuc3BvcnQgZXh0ZW5kcyBXaXJlVHJhbnNwb3J0IHtcblx0LyoqIFJlc29sdmVzIG9uY2UgdGhlIGNoYW5uZWwgb2JqZWN0IGFuc3dlcmVkOyByZWplY3RzIHdoZW4gaXQgbmV2ZXIgd2lsbC4gKi9cblx0cmVhZG9ubHkgcmVhZHk6IFByb21pc2U8dm9pZD47XG5cdC8qKiBTdG9wIGZvcndhcmRpbmcgbWVzc2FnZXM7IHNlbmRzIGFmdGVyIHRoaXMgdGhyb3cuICovXG5cdGNsb3NlKCk6IHZvaWQ7XG59XG5cbmZ1bmN0aW9uIHNjb3BlKCk6IFF0U2NvcGUge1xuXHRyZXR1cm4gZ2xvYmFsVGhpcyBhcyB1bmtub3duIGFzIFF0U2NvcGU7XG59XG5cbi8qKiBUcnVlIGluc2lkZSBhIFFHSVMgd2ViIHZpZXcsIHdoZXJlIFF0IGluamVjdGVkIGl0cyB0cmFuc3BvcnQgYW5kIHNjcmlwdC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnNpZGVRZ2lzKCk6IGJvb2xlYW4ge1xuXHRjb25zdCBwYWdlID0gc2NvcGUoKTtcblx0cmV0dXJuIHBhZ2UucXQgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgcGFnZS5RV2ViQ2hhbm5lbCA9PT0gXCJmdW5jdGlvblwiO1xufVxuXG4vKipcbiAqIENvbm5lY3QgdG8gdGhlIGNoYW5uZWwgb2JqZWN0IGBvYmplY3ROYW1lYCBhbmQgcmV0dXJuIGEgdHJhbnNwb3J0IG9uIGl0LlxuICpcbiAqIFRocm93cyB7QGxpbmsgUWdpc1Nka1dlYkNoYW5uZWxFcnJvcn0gc3luY2hyb25vdXNseSBvdXRzaWRlIGEgUUdJUyB3ZWIgdmlldyxcbiAqIHNvIGEgcGFnZSBsZWFybnMgaW4gaXRzIGZpcnN0IHN0YXRlbWVudCB0aGF0IGl0IGhhcyBubyBob3N0IHRvIHRhbGsgdG8uXG4gKiBJbnNpZGUgb25lLCBtZXNzYWdlcyBzZW50IGJlZm9yZSB0aGUgY2hhbm5lbCBpcyByZWFkeSBhcmUgcXVldWVkIGFuZFxuICogZGVsaXZlcmVkIGluIG9yZGVyIG9uY2UgaXQgaXM7IGByZWFkeWAgcmVqZWN0cyAoYW5kIHF1ZXVlZCBzZW5kcyBhcmVcbiAqIGRyb3BwZWQpIHdoZW4gdGhlIGhvc3QgcmVnaXN0ZXJlZCBubyBvYmplY3QgdW5kZXIgdGhhdCBuYW1lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlV2ViQ2hhbm5lbFRyYW5zcG9ydChcblx0b2JqZWN0TmFtZSA9IFwiYnJpZGdlXCIsXG4pOiBXZWJDaGFubmVsVHJhbnNwb3J0IHtcblx0Y29uc3QgcGFnZSA9IHNjb3BlKCk7XG5cdGNvbnN0IHF0ID0gcGFnZS5xdDtcblx0Y29uc3QgUVdlYkNoYW5uZWwgPSBwYWdlLlFXZWJDaGFubmVsO1xuXHRpZiAocXQgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgUVdlYkNoYW5uZWwgIT09IFwiZnVuY3Rpb25cIikge1xuXHRcdHRocm93IG5ldyBRZ2lzU2RrV2ViQ2hhbm5lbEVycm9yKFxuXHRcdFx0XCJub3QgaW5zaWRlIGEgUUdJUyB3ZWIgdmlldzogd2luZG93LnF0IGlzIG1pc3NpbmdcIixcblx0XHQpO1xuXHR9XG5cdGNvbnN0IGxpc3RlbmVycyA9IG5ldyBTZXQ8KG1lc3NhZ2U6IHVua25vd24pID0+IHZvaWQ+KCk7XG5cdGNvbnN0IHF1ZXVlOiBzdHJpbmdbXSA9IFtdO1xuXHRsZXQgb2JqZWN0OiBDaGFubmVsT2JqZWN0IHwgbnVsbCA9IG51bGw7XG5cdGxldCBmYWlsdXJlOiBRZ2lzU2RrV2ViQ2hhbm5lbEVycm9yIHwgbnVsbCA9IG51bGw7XG5cdGxldCBjbG9zZWQgPSBmYWxzZTtcblx0Y29uc3QgZm9yd2FyZCA9ICh0ZXh0OiBzdHJpbmcpOiB2b2lkID0+IHtcblx0XHRpZiAoY2xvc2VkKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGxldCBwYXJzZWQ6IHVua25vd247XG5cdFx0dHJ5IHtcblx0XHRcdHBhcnNlZCA9IEpTT04ucGFyc2UodGV4dCk7XG5cdFx0fSBjYXRjaCB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGZvciAoY29uc3QgbGlzdGVuZXIgb2YgWy4uLmxpc3RlbmVyc10pIHtcblx0XHRcdGxpc3RlbmVyKHBhcnNlZCk7XG5cdFx0fVxuXHR9O1xuXHRjb25zdCByZWFkeSA9IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRuZXcgUVdlYkNoYW5uZWwocXQud2ViQ2hhbm5lbFRyYW5zcG9ydCwgKGNoYW5uZWwpID0+IHtcblx0XHRcdGNvbnN0IGZvdW5kID0gY2hhbm5lbC5vYmplY3RzW29iamVjdE5hbWVdO1xuXHRcdFx0aWYgKGZvdW5kID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0ZmFpbHVyZSA9IG5ldyBRZ2lzU2RrV2ViQ2hhbm5lbEVycm9yKFxuXHRcdFx0XHRcdGB0aGUgaG9zdCByZWdpc3RlcmVkIG5vICR7SlNPTi5zdHJpbmdpZnkob2JqZWN0TmFtZSl9IGNoYW5uZWwgb2JqZWN0YCxcblx0XHRcdFx0KTtcblx0XHRcdFx0cXVldWUubGVuZ3RoID0gMDtcblx0XHRcdFx0cmVqZWN0KGZhaWx1cmUpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRpZiAoY2xvc2VkKSB7XG5cdFx0XHRcdHJlc29sdmUoKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0b2JqZWN0ID0gZm91bmQ7XG5cdFx0XHRmb3VuZC5tZXNzYWdlLmNvbm5lY3QoZm9yd2FyZCk7XG5cdFx0XHRmb3IgKGNvbnN0IHRleHQgb2YgcXVldWUuc3BsaWNlKDApKSB7XG5cdFx0XHRcdGZvdW5kLnJlY2VpdmUodGV4dCk7XG5cdFx0XHR9XG5cdFx0XHRyZXNvbHZlKCk7XG5cdFx0fSk7XG5cdH0pO1xuXHRyZXR1cm4ge1xuXHRcdHJlYWR5LFxuXHRcdHNlbmQobWVzc2FnZTogdW5rbm93bik6IHZvaWQge1xuXHRcdFx0aWYgKGNsb3NlZCkge1xuXHRcdFx0XHR0aHJvdyBuZXcgUWdpc1Nka1dlYkNoYW5uZWxFcnJvcihcInRoZSB3ZWIgY2hhbm5lbCB0cmFuc3BvcnQgaXMgY2xvc2VkXCIpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGZhaWx1cmUgIT09IG51bGwpIHtcblx0XHRcdFx0dGhyb3cgZmFpbHVyZTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IHRleHQgPSBKU09OLnN0cmluZ2lmeShtZXNzYWdlKTtcblx0XHRcdGlmIChvYmplY3QgPT09IG51bGwpIHtcblx0XHRcdFx0cXVldWUucHVzaCh0ZXh0KTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0b2JqZWN0LnJlY2VpdmUodGV4dCk7XG5cdFx0fSxcblx0XHRzdWJzY3JpYmUobGlzdGVuZXI6IChtZXNzYWdlOiB1bmtub3duKSA9PiB2b2lkKTogKCkgPT4gdm9pZCB7XG5cdFx0XHRsaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTtcblx0XHRcdHJldHVybiAoKSA9PiB7XG5cdFx0XHRcdGxpc3RlbmVycy5kZWxldGUobGlzdGVuZXIpO1xuXHRcdFx0fTtcblx0XHR9LFxuXHRcdGNsb3NlKCk6IHZvaWQge1xuXHRcdFx0aWYgKGNsb3NlZCkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRjbG9zZWQgPSB0cnVlO1xuXHRcdFx0cXVldWUubGVuZ3RoID0gMDtcblx0XHRcdGxpc3RlbmVycy5jbGVhcigpO1xuXHRcdFx0b2JqZWN0Py5tZXNzYWdlLmRpc2Nvbm5lY3QoZm9yd2FyZCk7XG5cdFx0fSxcblx0fTtcbn1cbiIsCiAgICAiLyoqXG4gKiBgUWdpc1Nka2A6IHRoZSBwYWdlLXNpZGUgb2JqZWN0IGEgcGx1Z2luJ3Mgd2ViIHZpZXcgdGFsa3MgdG8gUUdJUyB0aHJvdWdoLlxuICpcbiAqIFRocmVlIHN0YXRlbWVudHMgY29ubmVjdCBhIHBhZ2UgKGRlY2lzaW9uLTQ0KTpcbiAqXG4gKiBgYGB0c1xuICogaW1wb3J0IHNjaGVtYSBmcm9tIFwiLi9icmlkZ2Uuc2NoZW1hXCI7XG4gKiBjb25zdCBxZ2lzID0gUWdpc1Nkay5mcm9tQnJpZGdlU2NoZW1hKHNjaGVtYSk7XG4gKiBhd2FpdCBxZ2lzLnNpdGVzLnN1bW1hcnkoeyBsYXllcl9pZCB9KTtcbiAqIGBgYFxuICpcbiAqIFRoZSBzY2hlbWEgaXMgdGhlIGdlbmVyYXRlZCBgYnJpZGdlLnNjaGVtYS50c2A6IHRoZSBwbHVnaW4gZGVzY3JpcHRpb24gcGx1c1xuICogaXRzIGBPcGVyYXRpb25zYCBhbmQgYFN0cmVhbXNgIHR5cGVzLiBGcm9tIHRoZSBkZXNjcmlwdGlvbiB0aGUgU0RLIGJ1aWxkc1xuICogb25lIG1ldGhvZCBwZXIgZGVjbGFyZWQgYWN0aW9uIGFuZCBzdHJlYW0sIG5lc3RlZCB1bmRlciB0aGUgc2VnbWVudHMgb2YgaXRzXG4gKiBpZCAoYHNpdGVzLnN1bW1hcnlgIGlzIGBxZ2lzLnNpdGVzLnN1bW1hcnlgLCBgYnVmZmVyYCBpcyBgcWdpcy5idWZmZXJgKSxcbiAqIGFuZCBjaGVja3MgZXZlcnkgYXJndW1lbnQsIHJlcGx5IGFuZCBldmVudCBhZ2FpbnN0IHRoZSBkZWNsYXJlZCBzY2hlbWFzXG4gKiB3aXRoIHRoZSBzYW1lIHJ1bGVzIHRoZSBob3N0IGFwcGxpZXMgKGB2YWxpZGF0ZS50c2ApLiBGcm9tIHRoZSB0eXBlcyBpdCBnaXZlcyB0aG9zZVxuICogbWV0aG9kcyB0aGVpciBzaWduYXR1cmVzLCBzbyBhIHdyb25nIGFyZ3VtZW50IHNoYXBlIG9yIGFuIHVua25vd24gb3BlcmF0aW9uXG4gKiBpcyBhIGNvbXBpbGUgZXJyb3IgYW5kIGEgdmFsdWUgb3V0c2lkZSB0aGUgc2NoZW1hIGF0IHJ1biB0aW1lIGlzIGFcbiAqIHtAbGluayBRZ2lzU2RrQ29udHJhY3RFcnJvcn0uXG4gKlxuICogYGhvc3RgIGlzIHRoZSBjdXJhdGVkIGhvc3Qgc3VyZmFjZSBvZiBkZWNpc2lvbi0yNywgYnVpbHQgb24gdGhlIHNhbWUgY2xpZW50LFxuICogcGx1cyBgZ3JhbnRlZGA6IHRoZSBob3N0IG9wZXJhdGlvbiBpZHMgdGhlIGhhbmRzaGFrZSBhZHZlcnRpc2VkIGZvciB0aGlzXG4gKiB2aWV3LiBBIGNhbGwgb3V0c2lkZSB0aGUgZ3JhbnRzIGlzIG5vdCByZWZ1c2VkIGhlcmUgLSB0aGUgaG9zdCByZWZ1c2VzIGl0LFxuICogYW5kIHRoZSBwYWdlIHNlZXMgdGhlIGhvc3QncyBgbm90X2F1dGhvcml6ZWRgIC0gYnV0IGEgcGFnZSBjYW4gcmVhZCBgZ3JhbnRlZGBcbiAqIGFmdGVyIGByZWFkeWAgdG8gaGlkZSB3aGF0IGl0IG1heSBub3QgdXNlLlxuICovXG5cbmltcG9ydCB7XG5cdEJyaWRnZUNsaWVudCxcblx0dHlwZSBCcmlkZ2VTdHJlYW1UZXJtaW5hbCxcblx0dHlwZSBCcmlkZ2VTdWJzY3JpcHRpb24sXG5cdHR5cGUgSW52b2tlT3B0aW9ucyxcblx0UWdpc1Nka0JyaWRnZVByb3RvY29sRXJyb3IsXG5cdHR5cGUgV2lyZVRyYW5zcG9ydCxcbn0gZnJvbSBcIi4vYnJpZGdlXCI7XG5pbXBvcnQge1xuXHR0eXBlIEFjdGlvbkRlc2NyaXB0aW9uLFxuXHRRZ2lzU2RrRGVjbGFyYXRpb25FcnJvcixcblx0dHlwZSBTdHJlYW1EZXNjcmlwdGlvbixcbn0gZnJvbSBcIi4vZGVjbGFyYXRpb25zXCI7XG5pbXBvcnQge1xuXHRjcmVhdGVIb3N0LFxuXHRIT1NUX09QRVJBVElPTlMsXG5cdHR5cGUgSG9zdE9wZXJhdGlvbklkLFxuXHR0eXBlIEhvc3RPcGVyYXRpb25zLFxufSBmcm9tIFwiLi9nZW5lcmF0ZWQvaG9zdFwiO1xuaW1wb3J0IHsgaXNQbGFpblJlY29yZCB9IGZyb20gXCIuL2ludGVybmFsXCI7XG5pbXBvcnQgdHlwZSB7XG5cdEJyaWRnZVNjaGVtYSxcblx0T3BlcmF0aW9uTWFwLFxuXHRPcGVyYXRpb25TaGFwZSxcblx0U3RyZWFtTWFwLFxuXHRTdHJlYW1TaGFwZSxcbn0gZnJvbSBcIi4vc2NoZW1hXCI7XG5pbXBvcnQgeyBRZ2lzU2RrQ29udHJhY3RFcnJvciwgdmFsaWRhdGVBZ2FpbnN0U2NoZW1hIH0gZnJvbSBcIi4vdmFsaWRhdGVcIjtcbmltcG9ydCB7IGNyZWF0ZVdlYkNoYW5uZWxUcmFuc3BvcnQgfSBmcm9tIFwiLi93ZWJjaGFubmVsXCI7XG5cbi8qKiBPcHRpb25zIGZvciB7QGxpbmsgUWdpc1Nkay5mcm9tQnJpZGdlU2NoZW1hfS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUWdpc1Nka09wdGlvbnMge1xuXHQvKiogQSB0cmFuc3BvcnQgdG8gc3BlYWsgdGhyb3VnaDsgZGVmYXVsdHMgdG8gdGhlIHBhZ2UncyBRV2ViQ2hhbm5lbC4gKi9cblx0cmVhZG9ubHkgdHJhbnNwb3J0PzogV2lyZVRyYW5zcG9ydDtcblx0LyoqIEEgY2xpZW50IHRoZSBjYWxsZXIgb3duczsgYGNsb3NlKClgIGxlYXZlcyBpdCBvcGVuLiBFeGNsdWRlcyBgdHJhbnNwb3J0YC4gKi9cblx0cmVhZG9ubHkgY2xpZW50PzogQnJpZGdlQ2xpZW50O1xuXHQvKiogUGVyLWNhbGwgdGltZW91dCBmb3IgYW4gb3duZWQgY2xpZW50LiAqL1xuXHRyZWFkb25seSB0aW1lb3V0TXM/OiBudW1iZXI7XG5cdC8qKiBUaGUgY2hhbm5lbCBvYmplY3QncyBuYW1lIHdoZW4gdGhlIGRlZmF1bHQgdHJhbnNwb3J0IGlzIHVzZWQuICovXG5cdHJlYWRvbmx5IGNoYW5uZWxPYmplY3Q/OiBzdHJpbmc7XG59XG5cbi8qKiBIYW5kbGVycyBmb3IgYSB0eXBlZCBzdHJlYW06IGV2ZW50cyBhcyBkZWNsYXJlZCwgdGhlbiBleGFjdGx5IG9uZSBlbmQuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0cmVhbUhhbmRsZXJzPEU+IHtcblx0cmVhZG9ubHkgb25FdmVudD86IChldmVudDogRSkgPT4gdm9pZDtcblx0cmVhZG9ubHkgb25UZXJtaW5hbD86ICh0ZXJtaW5hbDogQnJpZGdlU3RyZWFtVGVybWluYWwpID0+IHZvaWQ7XG59XG5cbi8qKiBBIGxpdmUgc3RyZWFtLCBhcyB0aGUgY2FsbGVyIGhvbGRzIGl0LiAqL1xuZXhwb3J0IHR5cGUgU3RyZWFtSGFuZGxlID0gQnJpZGdlU3Vic2NyaXB0aW9uO1xuXG4vKiogVGhlIG1ldGhvZCBvbmUgZGVjbGFyZWQgYWN0aW9uIGJlY29tZXM7IGFuIGVtcHR5IHJlcXVlc3QgbWF5IGJlIG9taXR0ZWQuICovXG5leHBvcnQgdHlwZSBPcGVyYXRpb25NZXRob2Q8T3AgZXh0ZW5kcyBPcGVyYXRpb25TaGFwZT4gPVxuXHQvLyBiaW9tZS1pZ25vcmUgbGludC9jb21wbGV4aXR5L25vQmFubmVkVHlwZXM6IGB7fWAgaXMgdGhlIHRlc3QgZm9yIFwibm90aGluZyByZXF1aXJlZFwiXG5cdHt9IGV4dGVuZHMgT3BbXCJyZXF1ZXN0XCJdXG5cdFx0PyAoXG5cdFx0XHRcdHJlcXVlc3Q/OiBPcFtcInJlcXVlc3RcIl0sXG5cdFx0XHRcdG9wdGlvbnM/OiBJbnZva2VPcHRpb25zLFxuXHRcdFx0KSA9PiBQcm9taXNlPE9wW1wicmVzdWx0XCJdPlxuXHRcdDogKFxuXHRcdFx0XHRyZXF1ZXN0OiBPcFtcInJlcXVlc3RcIl0sXG5cdFx0XHRcdG9wdGlvbnM/OiBJbnZva2VPcHRpb25zLFxuXHRcdFx0KSA9PiBQcm9taXNlPE9wW1wicmVzdWx0XCJdPjtcblxuLyoqIFRoZSBtZXRob2Qgb25lIGRlY2xhcmVkIHN0cmVhbSBiZWNvbWVzLiAqL1xuZXhwb3J0IHR5cGUgU3RyZWFtTWV0aG9kPFN0IGV4dGVuZHMgU3RyZWFtU2hhcGU+ID0gKFxuXHRyZXF1ZXN0OiBTdFtcInJlcXVlc3RcIl0sXG5cdGhhbmRsZXJzOiBTdHJlYW1IYW5kbGVyczxTdFtcImV2ZW50XCJdPixcblx0b3B0aW9ucz86IEludm9rZU9wdGlvbnMsXG4pID0+IFByb21pc2U8U3RyZWFtSGFuZGxlPjtcblxuLyoqIFdoYXQgdGhlIGhhbmRzaGFrZSB0b2xkIHRoaXMgcGFnZSBhYm91dCB0aGUgaG9zdCAoZGVjaXNpb24tMjcpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBRZ2lzU2RrSG9zdCBleHRlbmRzIEhvc3RPcGVyYXRpb25zIHtcblx0LyoqXG5cdCAqIFRoZSBob3N0IG9wZXJhdGlvbiBpZHMgdGhlIGhhbmRzaGFrZSBhZHZlcnRpc2VkIGZvciB0aGlzIHZpZXc7IGVtcHR5XG5cdCAqIHVudGlsIHtAbGluayBRZ2lzU2RrQ29yZS5yZWFkeX0gaGFzIHJlc29sdmVkLlxuXHQgKi9cblx0cmVhZG9ubHkgZ3JhbnRlZDogcmVhZG9ubHkgSG9zdE9wZXJhdGlvbklkW107XG59XG5cbi8qKiBUaGUgbWVtYmVycyBldmVyeSBgUWdpc1Nka2AgaGFzLCB3aGF0ZXZlciBpdHMgc2NoZW1hIGRlY2xhcmVzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBRZ2lzU2RrQ29yZTxPID0gT3BlcmF0aW9uTWFwLCBTID0gU3RyZWFtTWFwPiB7XG5cdC8qKiBUaGUgc2NoZW1hIHRoaXMgaW5zdGFuY2Ugd2FzIGJ1aWx0IGZyb20uICovXG5cdHJlYWRvbmx5IHNjaGVtYTogQnJpZGdlU2NoZW1hPE8sIFM+O1xuXHQvKiogVGhlIGNsaWVudCB1bmRlciB0aGUgbWV0aG9kcywgZm9yIHdoYXQgYSBtZXRob2QgZG9lcyBub3QgY292ZXIuICovXG5cdHJlYWRvbmx5IGNsaWVudDogQnJpZGdlQ2xpZW50O1xuXHQvKiogVGhlIGN1cmF0ZWQgaG9zdCBzdXJmYWNlLCBhbmQgd2hhdCB0aGlzIHZpZXcgd2FzIGdyYW50ZWQgb2YgaXQuICovXG5cdHJlYWRvbmx5IGhvc3Q6IFFnaXNTZGtIb3N0O1xuXHQvKiogUmVzb2x2ZXMgb25jZSB0aGUgaGFuZHNoYWtlIGFuc3dlcmVkOyByZWplY3RzIHdoZW4gdGhlIGhvc3QgcmVmdXNlZCBpdC4gKi9cblx0cmVhZG9ubHkgcmVhZHk6IFByb21pc2U8dm9pZD47XG5cdC8qKiBDbG9zZSBhbiBvd25lZCBjbGllbnQ7IGEgY2xpZW50IHRoZSBjYWxsZXIgcGFzc2VkIGluIGlzIGxlZnQgYWxvbmUuICovXG5cdGNsb3NlKCk6IHZvaWQ7XG59XG5cbi8qKiBUaGUgZmlyc3Qgc2VnbWVudCBvZiBhIGRvdHRlZCBpZCwgb3IgdGhlIHdob2xlIGlkIHdoZW4gaXQgaGFzIG5vbmUuICovXG50eXBlIEhlYWQ8SyBleHRlbmRzIHN0cmluZz4gPSBLIGV4dGVuZHMgYCR7aW5mZXIgSH0uJHtzdHJpbmd9YCA/IEggOiBLO1xuXG4vKiogVGhlIG1lbWJlcnMgb2YgYE1gIHVuZGVyIG9uZSBoZWFkLCBrZXllZCBieSB0aGUgcmVzdCBvZiB0aGVpciBpZHMuICovXG50eXBlIFVuZGVyPE0sIEggZXh0ZW5kcyBzdHJpbmc+ID0ge1xuXHRbSyBpbiBrZXlvZiBNICYgc3RyaW5nIGFzIEsgZXh0ZW5kcyBgJHtIfS4ke2luZmVyIFJlc3R9YFxuXHRcdD8gUmVzdFxuXHRcdDogbmV2ZXJdOiBNW0tdO1xufTtcblxuLyoqXG4gKiBUaGUgZGVjbGFyZWQgYWN0aW9ucyBhcyBhIHRyZWU6IGEgcGxhaW4gaWQgaXMgYSBtZXRob2QsIGEgZG90dGVkIGlkIG5lc3RzXG4gKiBvbmUgb2JqZWN0IHBlciBzZWdtZW50LiBBbiBpZCB0aGF0IGlzIGJvdGggYSBsZWFmIGFuZCBhIHByZWZpeCBvZiBhbm90aGVyXG4gKiBpcyByZWZ1c2VkIGF0IHJ1biB0aW1lLCBzbyB0aGUgdHlwZSBuZWVkIG5vdCBzYXkgd2hhdCBpdCB3b3VsZCBtZWFuLlxuICovXG5leHBvcnQgdHlwZSBPcGVyYXRpb25UcmVlPE8+ID0ge1xuXHRyZWFkb25seSBbSCBpbiBIZWFkPGtleW9mIE8gJiBzdHJpbmc+XTogSCBleHRlbmRzIGtleW9mIE9cblx0XHQ/IE9bSF0gZXh0ZW5kcyBPcGVyYXRpb25TaGFwZVxuXHRcdFx0PyBPcGVyYXRpb25NZXRob2Q8T1tIXT5cblx0XHRcdDogbmV2ZXJcblx0XHQ6IE9wZXJhdGlvblRyZWU8VW5kZXI8TywgSD4+O1xufTtcblxuLyoqIFRoZSBkZWNsYXJlZCBzdHJlYW1zIGFzIHRoZSBzYW1lIHRyZWUsIHdpdGggYSBzdHJlYW0gbWV0aG9kIGF0IGVhY2ggbGVhZi4gKi9cbmV4cG9ydCB0eXBlIFN0cmVhbVRyZWU8Uz4gPSB7XG5cdHJlYWRvbmx5IFtIIGluIEhlYWQ8a2V5b2YgUyAmIHN0cmluZz5dOiBIIGV4dGVuZHMga2V5b2YgU1xuXHRcdD8gU1tIXSBleHRlbmRzIFN0cmVhbVNoYXBlXG5cdFx0XHQ/IFN0cmVhbU1ldGhvZDxTW0hdPlxuXHRcdFx0OiBuZXZlclxuXHRcdDogU3RyZWFtVHJlZTxVbmRlcjxTLCBIPj47XG59O1xuXG4vKipcbiAqIEEgcGFnZSdzIGhhbmRsZSBvbiBRR0lTOiB0aGUgY29yZSwgcGx1cyBvbmUgbWV0aG9kIHBlciBkZWNsYXJlZCBvcGVyYXRpb25cbiAqIG5lc3RlZCB1bmRlciB0aGUgc2VnbWVudHMgb2YgaXRzIGlkLlxuICovXG5leHBvcnQgdHlwZSBRZ2lzU2RrPE8gPSBPcGVyYXRpb25NYXAsIFMgPSBTdHJlYW1NYXA+ID0gUWdpc1Nka0NvcmU8TywgUz4gJlxuXHRPcGVyYXRpb25UcmVlPE8+ICZcblx0U3RyZWFtVHJlZTxTPjtcblxuLyoqIE5hbWVzIHtAbGluayBRZ2lzU2RrQ29yZX0ga2VlcHM7IGEgZGVjbGFyZWQgaWQgbWF5IG5vdCBzdGFydCB3aXRoIG9uZS4gKi9cbmV4cG9ydCBjb25zdCBRR0lTX1NES19NRU1CRVJTOiByZWFkb25seSBzdHJpbmdbXSA9IE9iamVjdC5mcmVlemUoW1xuXHRcImNsaWVudFwiLFxuXHRcImhvc3RcIixcblx0XCJzY2hlbWFcIixcblx0XCJyZWFkeVwiLFxuXHRcImNsb3NlXCIsXG5dKTtcblxuY29uc3QgSE9TVF9JRFM6IFJlYWRvbmx5U2V0PHN0cmluZz4gPSBuZXcgU2V0PHN0cmluZz4oSE9TVF9PUEVSQVRJT05TKTtcblxuLyoqIFRoZSBoYW5kc2hha2UsIGFzIGZhciBhcyB0aGlzIG1vZHVsZSByZWFkcyBpdC4gKi9cbmludGVyZmFjZSBIYW5kc2hha2Uge1xuXHRyZWFkb25seSBvcGVyYXRpb25zOiByZWFkb25seSBzdHJpbmdbXTtcbn1cblxuZnVuY3Rpb24gcGFyc2VIYW5kc2hha2UodmFsdWU6IHVua25vd24pOiBIYW5kc2hha2Uge1xuXHRpZiAoIWlzUGxhaW5SZWNvcmQodmFsdWUpIHx8ICFBcnJheS5pc0FycmF5KHZhbHVlLm9wZXJhdGlvbnMpKSB7XG5cdFx0dGhyb3cgbmV3IFFnaXNTZGtCcmlkZ2VQcm90b2NvbEVycm9yKFxuXHRcdFx0XCJUaGUgaGFuZHNoYWtlIHJlcGx5IGNhcnJpZXMgbm8gb3BlcmF0aW9ucyBsaXN0XCIsXG5cdFx0KTtcblx0fVxuXHRjb25zdCBvcGVyYXRpb25zOiBzdHJpbmdbXSA9IFtdO1xuXHRmb3IgKGNvbnN0IG9wZXJhdGlvbiBvZiB2YWx1ZS5vcGVyYXRpb25zKSB7XG5cdFx0aWYgKGlzUGxhaW5SZWNvcmQob3BlcmF0aW9uKSAmJiB0eXBlb2Ygb3BlcmF0aW9uLmlkID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRvcGVyYXRpb25zLnB1c2gob3BlcmF0aW9uLmlkKTtcblx0XHR9XG5cdH1cblx0cmV0dXJuIHsgb3BlcmF0aW9ucyB9O1xufVxuXG5mdW5jdGlvbiB1bndyYXBSZXF1ZXN0KFxuXHRvcGVyYXRpb246IHN0cmluZyxcblx0cmVxdWVzdDogdW5rbm93bixcbik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcblx0aWYgKHJlcXVlc3QgPT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiB7fTtcblx0fVxuXHRpZiAoIWlzUGxhaW5SZWNvcmQocmVxdWVzdCkpIHtcblx0XHR0aHJvdyBuZXcgUWdpc1Nka0NvbnRyYWN0RXJyb3Iob3BlcmF0aW9uLCBcInJlcXVlc3RcIiwgW1xuXHRcdFx0Li4udmFsaWRhdGVBZ2FpbnN0U2NoZW1hKHJlcXVlc3QsIHsgdHlwZTogXCJvYmplY3RcIiB9KSxcblx0XHRdKTtcblx0fVxuXHRyZXR1cm4gcmVxdWVzdDtcbn1cblxuZnVuY3Rpb24gY2hlY2tlZFJlcXVlc3QoXG5cdGRlc2NyaXB0aW9uOiBBY3Rpb25EZXNjcmlwdGlvbiB8IFN0cmVhbURlc2NyaXB0aW9uLFxuXHRyZXF1ZXN0OiB1bmtub3duLFxuKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuXHRjb25zdCBwYXlsb2FkID0gdW53cmFwUmVxdWVzdChkZXNjcmlwdGlvbi5pZCwgcmVxdWVzdCk7XG5cdGNvbnN0IGlzc3VlcyA9IHZhbGlkYXRlQWdhaW5zdFNjaGVtYShwYXlsb2FkLCBkZXNjcmlwdGlvbi5yZXF1ZXN0KTtcblx0aWYgKGlzc3Vlcy5sZW5ndGggPiAwKSB7XG5cdFx0dGhyb3cgbmV3IFFnaXNTZGtDb250cmFjdEVycm9yKGRlc2NyaXB0aW9uLmlkLCBcInJlcXVlc3RcIiwgaXNzdWVzKTtcblx0fVxuXHRyZXR1cm4gcGF5bG9hZDtcbn1cblxuZnVuY3Rpb24gb3BlcmF0aW9uTWV0aG9kKFxuXHRjbGllbnQ6IEJyaWRnZUNsaWVudCxcblx0YWN0aW9uOiBBY3Rpb25EZXNjcmlwdGlvbixcbik6IChyZXF1ZXN0PzogdW5rbm93biwgb3B0aW9ucz86IEludm9rZU9wdGlvbnMpID0+IFByb21pc2U8dW5rbm93bj4ge1xuXHRyZXR1cm4gYXN5bmMgKHJlcXVlc3QsIG9wdGlvbnMpID0+IHtcblx0XHRjb25zdCBwYXlsb2FkID0gY2hlY2tlZFJlcXVlc3QoYWN0aW9uLCByZXF1ZXN0KTtcblx0XHRjb25zdCB2YWx1ZSA9IGF3YWl0IGNsaWVudC5pbnZva2UoYWN0aW9uLmlkLCBwYXlsb2FkLCBvcHRpb25zKTtcblx0XHRjb25zdCBpc3N1ZXMgPSB2YWxpZGF0ZUFnYWluc3RTY2hlbWEodmFsdWUsIGFjdGlvbi5yZXN1bHQsIHtcblx0XHRcdGFsbG93VW5rbm93bjogdHJ1ZSxcblx0XHR9KTtcblx0XHRpZiAoaXNzdWVzLmxlbmd0aCA+IDApIHtcblx0XHRcdHRocm93IG5ldyBRZ2lzU2RrQ29udHJhY3RFcnJvcihhY3Rpb24uaWQsIFwicmVzdWx0XCIsIGlzc3Vlcyk7XG5cdFx0fVxuXHRcdHJldHVybiB2YWx1ZTtcblx0fTtcbn1cblxuZnVuY3Rpb24gc3RyZWFtTWV0aG9kKFxuXHRjbGllbnQ6IEJyaWRnZUNsaWVudCxcblx0c3RyZWFtOiBTdHJlYW1EZXNjcmlwdGlvbixcbik6IChcblx0cmVxdWVzdDogdW5rbm93bixcblx0aGFuZGxlcnM6IFN0cmVhbUhhbmRsZXJzPHVua25vd24+LFxuXHRvcHRpb25zPzogSW52b2tlT3B0aW9ucyxcbikgPT4gUHJvbWlzZTxTdHJlYW1IYW5kbGU+IHtcblx0cmV0dXJuIGFzeW5jIChyZXF1ZXN0LCBoYW5kbGVycywgb3B0aW9ucykgPT4ge1xuXHRcdGNvbnN0IHBheWxvYWQgPSBjaGVja2VkUmVxdWVzdChzdHJlYW0sIHJlcXVlc3QpO1xuXHRcdC8vIFRoZSB0eXBlZCBzdHJlYW0gZW5kcyBleGFjdGx5IG9uY2UsIGxpa2UgdGhlIHN1YnNjcmlwdGlvbiB1bmRlciBpdDogYVxuXHRcdC8vIGNvbnRyYWN0IHZpb2xhdGlvbiBlbmRzIGl0IGhlcmUsIGNsb3NlcyB0aGUgc3Vic2NyaXB0aW9uLCBhbmQgdGhlXG5cdFx0Ly8gYGRpc3Bvc2VkYCB0aGUgY2xpZW50IHRoZW4gcmVwb3J0cyBpcyBub3QgZGVsaXZlcmVkIGEgc2Vjb25kIHRpbWUuXG5cdFx0bGV0IGVuZGVkID0gZmFsc2U7XG5cdFx0bGV0IHZpb2xhdGVkID0gZmFsc2U7XG5cdFx0bGV0IGhhbmRsZTogU3RyZWFtSGFuZGxlIHwgbnVsbCA9IG51bGw7XG5cdFx0Y29uc3QgZW5kID0gKHRlcm1pbmFsOiBCcmlkZ2VTdHJlYW1UZXJtaW5hbCk6IHZvaWQgPT4ge1xuXHRcdFx0aWYgKGVuZGVkKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGVuZGVkID0gdHJ1ZTtcblx0XHRcdGhhbmRsZXJzLm9uVGVybWluYWw/Lih0ZXJtaW5hbCk7XG5cdFx0fTtcblx0XHRoYW5kbGUgPSBhd2FpdCBjbGllbnQuc3Vic2NyaWJlKFxuXHRcdFx0c3RyZWFtLmlkLFxuXHRcdFx0cGF5bG9hZCxcblx0XHRcdHtcblx0XHRcdFx0b25FdmVudDogKGV2ZW50KSA9PiB7XG5cdFx0XHRcdFx0aWYgKGVuZGVkKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGNvbnN0IGRlY2xhcmVkID0gc3RyZWFtLmV2ZW50c1tldmVudC5raW5kXTtcblx0XHRcdFx0XHRjb25zdCBpc3N1ZXMgPVxuXHRcdFx0XHRcdFx0ZGVjbGFyZWQgPT09IHVuZGVmaW5lZFxuXHRcdFx0XHRcdFx0XHQ/IHVuZGVmaW5lZFxuXHRcdFx0XHRcdFx0XHQ6IHZhbGlkYXRlQWdhaW5zdFNjaGVtYShldmVudC5wYXlsb2FkLCBkZWNsYXJlZCwge1xuXHRcdFx0XHRcdFx0XHRcdFx0YWxsb3dVbmtub3duOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRcdFx0cGF0aDogW1wicGF5bG9hZFwiXSxcblx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRpZiAoaXNzdWVzICE9PSB1bmRlZmluZWQgJiYgaXNzdWVzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHRcdFx0aGFuZGxlcnMub25FdmVudD8uKGV2ZW50KTtcblx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Y29uc3QgZXJyb3IgPSBuZXcgUWdpc1Nka0NvbnRyYWN0RXJyb3IoXG5cdFx0XHRcdFx0XHRzdHJlYW0uaWQsXG5cdFx0XHRcdFx0XHRcImV2ZW50XCIsXG5cdFx0XHRcdFx0XHRpc3N1ZXMgPz8gW10sXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRlbmQoeyBraW5kOiBcImVycm9yXCIsIG1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UgfSk7XG5cdFx0XHRcdFx0aWYgKGhhbmRsZSA9PT0gbnVsbCkge1xuXHRcdFx0XHRcdFx0dmlvbGF0ZWQgPSB0cnVlO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRoYW5kbGUuY2xvc2UoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sXG5cdFx0XHRcdG9uVGVybWluYWw6IGVuZCxcblx0XHRcdH0sXG5cdFx0XHRvcHRpb25zLFxuXHRcdCk7XG5cdFx0aWYgKHZpb2xhdGVkKSB7XG5cdFx0XHRoYW5kbGUuY2xvc2UoKTtcblx0XHR9XG5cdFx0cmV0dXJuIGhhbmRsZTtcblx0fTtcbn1cblxuZnVuY3Rpb24gYnVpbGRIb3N0KFxuXHRjbGllbnQ6IEJyaWRnZUNsaWVudCxcblx0Z3JhbnRlZDogKCkgPT4gcmVhZG9ubHkgSG9zdE9wZXJhdGlvbklkW10sXG4pOiBRZ2lzU2RrSG9zdCB7XG5cdGNvbnN0IGhvc3QgPSBjcmVhdGVIb3N0KGNsaWVudCk7XG5cdHJldHVybiBPYmplY3QuZnJlZXplKHtcblx0XHQuLi5ob3N0LFxuXHRcdGdldCBncmFudGVkKCk6IHJlYWRvbmx5IEhvc3RPcGVyYXRpb25JZFtdIHtcblx0XHRcdHJldHVybiBncmFudGVkKCk7XG5cdFx0fSxcblx0fSk7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkPE8sIFM+KFxuXHRzY2hlbWE6IEJyaWRnZVNjaGVtYTxPLCBTPixcblx0b3B0aW9uczogUWdpc1Nka09wdGlvbnMsXG4pOiBRZ2lzU2RrPE8sIFM+IHtcblx0aWYgKG9wdGlvbnMuY2xpZW50ICE9PSB1bmRlZmluZWQgJiYgb3B0aW9ucy50cmFuc3BvcnQgIT09IHVuZGVmaW5lZCkge1xuXHRcdHRocm93IG5ldyBRZ2lzU2RrRGVjbGFyYXRpb25FcnJvcihcblx0XHRcdFwiUWdpc1Nkay5mcm9tQnJpZGdlU2NoZW1hIHRha2VzIGEgY2xpZW50IG9yIGEgdHJhbnNwb3J0LCBub3QgYm90aFwiLFxuXHRcdCk7XG5cdH1cblx0Y29uc3Qgb3duZWQgPSBvcHRpb25zLmNsaWVudCA9PT0gdW5kZWZpbmVkO1xuXHRjb25zdCB0cmFuc3BvcnQgPVxuXHRcdG9wdGlvbnMudHJhbnNwb3J0ID8/XG5cdFx0KG9wdGlvbnMuY2xpZW50ID09PSB1bmRlZmluZWRcblx0XHRcdD8gY3JlYXRlV2ViQ2hhbm5lbFRyYW5zcG9ydChvcHRpb25zLmNoYW5uZWxPYmplY3QgPz8gXCJicmlkZ2VcIilcblx0XHRcdDogdW5kZWZpbmVkKTtcblx0Y29uc3QgY2xpZW50ID1cblx0XHRvcHRpb25zLmNsaWVudCA/P1xuXHRcdG5ldyBCcmlkZ2VDbGllbnQoXG5cdFx0XHR0cmFuc3BvcnQgYXMgV2lyZVRyYW5zcG9ydCxcblx0XHRcdG9wdGlvbnMudGltZW91dE1zID09PSB1bmRlZmluZWQgPyB7fSA6IHsgdGltZW91dE1zOiBvcHRpb25zLnRpbWVvdXRNcyB9LFxuXHRcdCk7XG5cdGxldCBncmFudGVkOiByZWFkb25seSBIb3N0T3BlcmF0aW9uSWRbXSA9IE9iamVjdC5mcmVlemUoW10pO1xuXHRjb25zdCByZWFkeSA9IGNsaWVudC5oYW5kc2hha2UoKS50aGVuKCh2YWx1ZSkgPT4ge1xuXHRcdGNvbnN0IGhhbmRzaGFrZSA9IHBhcnNlSGFuZHNoYWtlKHZhbHVlKTtcblx0XHRncmFudGVkID0gT2JqZWN0LmZyZWV6ZShcblx0XHRcdGhhbmRzaGFrZS5vcGVyYXRpb25zLmZpbHRlcigoaWQpOiBpZCBpcyBIb3N0T3BlcmF0aW9uSWQgPT5cblx0XHRcdFx0SE9TVF9JRFMuaGFzKGlkKSxcblx0XHRcdCksXG5cdFx0KTtcblx0fSk7XG5cdC8vIEEgcGFnZSB0aGF0IG5ldmVyIGF3YWl0cyBgcmVhZHlgIHN0aWxsIHNlZXMgZXZlcnkgY2FsbCBmYWlsIG9uIGl0cyBvd247XG5cdC8vIHRoZSByZWplY3Rpb24gaXMgbm90IGxlZnQgdW5vYnNlcnZlZCBvbiB0b3Agb2YgdGhhdC5cblx0cmVhZHkuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcblx0Y29uc3QgbWVtYmVyczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7XG5cdFx0c2NoZW1hLFxuXHRcdGNsaWVudCxcblx0XHRob3N0OiBidWlsZEhvc3QoY2xpZW50LCAoKSA9PiBncmFudGVkKSxcblx0XHRyZWFkeSxcblx0XHRjbG9zZTogKCk6IHZvaWQgPT4ge1xuXHRcdFx0aWYgKG93bmVkKSB7XG5cdFx0XHRcdGNsaWVudC5jbG9zZSgpO1xuXHRcdFx0fVxuXHRcdH0sXG5cdH07XG5cdGNvbnN0IG5hbWVzcGFjZXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+W10gPSBbXTtcblx0Zm9yIChjb25zdCBhY3Rpb24gb2Ygc2NoZW1hLmFjdGlvbnMpIHtcblx0XHRwbGFjZShtZW1iZXJzLCBuYW1lc3BhY2VzLCBhY3Rpb24uaWQsIG9wZXJhdGlvbk1ldGhvZChjbGllbnQsIGFjdGlvbikpO1xuXHR9XG5cdGZvciAoY29uc3Qgc3RyZWFtIG9mIHNjaGVtYS5zdHJlYW1zKSB7XG5cdFx0cGxhY2UobWVtYmVycywgbmFtZXNwYWNlcywgc3RyZWFtLmlkLCBzdHJlYW1NZXRob2QoY2xpZW50LCBzdHJlYW0pKTtcblx0fVxuXHRmb3IgKGNvbnN0IG5hbWVzcGFjZSBvZiBuYW1lc3BhY2VzKSB7XG5cdFx0T2JqZWN0LmZyZWV6ZShuYW1lc3BhY2UpO1xuXHR9XG5cdHJldHVybiBPYmplY3QuZnJlZXplKG1lbWJlcnMpIGFzIHVua25vd24gYXMgUWdpc1NkazxPLCBTPjtcbn1cblxuLyoqXG4gKiBQdXQgb25lIG1ldGhvZCB3aGVyZSBpdHMgaWQgc2F5czogYGEuYi5jYCBiZWNvbWVzIGBtZW1iZXJzLmEuYi5jYCwgYnVpbGRpbmdcbiAqIHRoZSBvYmplY3RzIG9uIHRoZSB3YXkuIFR3byBpZHMgY2Fubm90IGJvdGggYmUgaG9uZXN0IHdoZW4gb25lIGlzIGEgcHJlZml4XG4gKiBvZiB0aGUgb3RoZXIgLSBgc2l0ZXNgIGNhbm5vdCBiZSBhIG1ldGhvZCBhbmQgaG9sZCBgc2l0ZXMuc3VtbWFyeWAgLSBhbmQgYVxuICogZmlyc3Qgc2VnbWVudCB0aGF0IGlzIGEgY29yZSBtZW1iZXIgd291bGQgaGlkZSBpdCwgc28gYm90aCBhcmUgcmVmdXNlZC5cbiAqL1xuZnVuY3Rpb24gcGxhY2UoXG5cdG1lbWJlcnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuXHRuYW1lc3BhY2VzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdLFxuXHRpZDogc3RyaW5nLFxuXHRtZXRob2Q6IHVua25vd24sXG4pOiB2b2lkIHtcblx0Y29uc3Qgc2VnbWVudHMgPSBpZC5zcGxpdChcIi5cIik7XG5cdGlmIChzZWdtZW50cy5zb21lKChzZWdtZW50KSA9PiBzZWdtZW50ID09PSBcIlwiKSkge1xuXHRcdHRocm93IG5ldyBRZ2lzU2RrRGVjbGFyYXRpb25FcnJvcihcblx0XHRcdGAke2lkfTogYW4gb3BlcmF0aW9uIGlkIG1heSBub3QgaGF2ZSBhbiBlbXB0eSBzZWdtZW50YCxcblx0XHQpO1xuXHR9XG5cdGNvbnN0IGhlYWQgPSBzZWdtZW50c1swXSBhcyBzdHJpbmc7XG5cdGlmIChRR0lTX1NES19NRU1CRVJTLmluY2x1ZGVzKGhlYWQpKSB7XG5cdFx0dGhyb3cgbmV3IFFnaXNTZGtEZWNsYXJhdGlvbkVycm9yKFxuXHRcdFx0YCR7aWR9OiBhbiBvcGVyYXRpb24gaWQgbWF5IG5vdCBzdGFydCB3aXRoIGEgUWdpc1NkayBtZW1iZXIgKCR7UUdJU19TREtfTUVNQkVSUy5qb2luKFwiLCBcIil9KWAsXG5cdFx0KTtcblx0fVxuXHRsZXQgbm9kZSA9IG1lbWJlcnM7XG5cdGZvciAoY29uc3QgW2luZGV4LCBzZWdtZW50XSBvZiBzZWdtZW50cy5lbnRyaWVzKCkpIHtcblx0XHRjb25zdCBwcmVmaXggPSBzZWdtZW50cy5zbGljZSgwLCBpbmRleCArIDEpLmpvaW4oXCIuXCIpO1xuXHRcdGNvbnN0IGV4aXN0aW5nID0gbm9kZVtzZWdtZW50XTtcblx0XHRpZiAoaW5kZXggPT09IHNlZ21lbnRzLmxlbmd0aCAtIDEpIHtcblx0XHRcdGlmIChleGlzdGluZyAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHRocm93IG5ldyBRZ2lzU2RrRGVjbGFyYXRpb25FcnJvcihcblx0XHRcdFx0XHR0eXBlb2YgZXhpc3RpbmcgPT09IFwiZnVuY3Rpb25cIlxuXHRcdFx0XHRcdFx0PyBgJHtpZH06IGR1cGxpY2F0ZSBvcGVyYXRpb24gaWRgXG5cdFx0XHRcdFx0XHQ6IGAke2lkfTogYW4gb3BlcmF0aW9uIGlkIG1heSBub3QgYmUgYSBwcmVmaXggb2YgYW5vdGhlciBkZWNsYXJlZCBpZGAsXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0XHRub2RlW3NlZ21lbnRdID0gbWV0aG9kO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRpZiAoZXhpc3RpbmcgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Y29uc3QgbmFtZXNwYWNlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuXHRcdFx0bmFtZXNwYWNlcy5wdXNoKG5hbWVzcGFjZSk7XG5cdFx0XHRub2RlW3NlZ21lbnRdID0gbmFtZXNwYWNlO1xuXHRcdFx0bm9kZSA9IG5hbWVzcGFjZTtcblx0XHR9IGVsc2UgaWYgKHR5cGVvZiBleGlzdGluZyA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0XHR0aHJvdyBuZXcgUWdpc1Nka0RlY2xhcmF0aW9uRXJyb3IoXG5cdFx0XHRcdGAke2lkfTogJHtwcmVmaXh9IGlzIGFscmVhZHkgYW4gb3BlcmF0aW9uIGlkOyBhbiBpZCBtYXkgbm90IGV4dGVuZCBhbm90aGVyYCxcblx0XHRcdCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG5vZGUgPSBleGlzdGluZyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblx0XHR9XG5cdH1cbn1cblxuLyoqXG4gKiBUaGUgZW50cnkgcG9pbnQ6IGBRZ2lzU2RrLmZyb21CcmlkZ2VTY2hlbWEoc2NoZW1hKWAuXG4gKlxuICogQSBuYW1lc3BhY2UgcmF0aGVyIHRoYW4gYSBjb25zdGFudCBzbyB0aGUgdmFsdWUgYW5kIHRoZSBpbnN0YW5jZSB0eXBlIHNoYXJlXG4gKiBvbmUgbmFtZSB0aHJvdWdoIGV2ZXJ5IGRlY2xhcmF0aW9uIGJ1bmRsZXIuXG4gKi9cbmV4cG9ydCBuYW1lc3BhY2UgUWdpc1NkayB7XG5cdC8qKlxuXHQgKiBCdWlsZCBhIGBRZ2lzU2RrYCBvbiBhIGdlbmVyYXRlZCBzY2hlbWEuXG5cdCAqXG5cdCAqIFdpdGhvdXQgb3B0aW9ucyBpdCBjb25uZWN0cyB0byB0aGUgcGFnZSdzIFFXZWJDaGFubmVsIG9iamVjdCBuYW1lZFxuXHQgKiBcImJyaWRnZVwiLCB3aGljaCBpcyB3aGF0IHRoZSBQeXRob24gcnVudGltZSByZWdpc3RlcnM7IGEgdGVzdCBwYXNzZXMgdGhlXG5cdCAqIGhhcm5lc3MgZnJvbSBgQGFyY2hvbnQ1NjEvcWdpcy1zZGsvdGVzdGluZ2AgYXMgYHRyYW5zcG9ydGAgaW5zdGVhZC5cblx0ICovXG5cdGV4cG9ydCBmdW5jdGlvbiBmcm9tQnJpZGdlU2NoZW1hPFxuXHRcdE8gZXh0ZW5kcyBSZWNvcmQ8a2V5b2YgTywgT3BlcmF0aW9uU2hhcGU+LFxuXHRcdFMgZXh0ZW5kcyBSZWNvcmQ8a2V5b2YgUywgU3RyZWFtU2hhcGU+LFxuXHQ+KHNjaGVtYTogQnJpZGdlU2NoZW1hPE8sIFM+LCBvcHRpb25zOiBRZ2lzU2RrT3B0aW9ucyA9IHt9KTogUWdpc1NkazxPLCBTPiB7XG5cdFx0cmV0dXJuIGJ1aWxkKHNjaGVtYSwgb3B0aW9ucyk7XG5cdH1cbn1cbiIsCiAgICAiLyoqXG4gKiBUaGUgYnJpZGdlIHNjaGVtYTogYSBwbHVnaW4gZGVzY3JpcHRpb24gdGhhdCBhbHNvIGNhcnJpZXMgaXRzIHR5cGVzLlxuICpcbiAqIGBxZ2lzLXNkayBicmlkZ2UgZ2VuZXJhdGVgIHdyaXRlcyBvbmUgYGJyaWRnZS5zY2hlbWEudHNgIHBlciBwbHVnaW5cbiAqIChkZWNpc2lvbi00NCkuIFRoYXQgbW9kdWxlIGhhcyBubyBjb2RlIG9mIGl0cyBvd246IGl0IGRlY2xhcmVzIHRoZSB2YWx1ZVxuICogaW50ZXJmYWNlcywgdHdvIG1hcHMgLSBgT3BlcmF0aW9uc2AgYW5kIGBTdHJlYW1zYCwga2V5ZWQgYnkgb3BlcmF0aW9uIGlkIC1cbiAqIGFuZCBlbmRzIGluIGBkZWZpbmVCcmlkZ2VTY2hlbWE8T3BlcmF0aW9ucywgU3RyZWFtcz4oeyAuLi5kZXNjcmlwdGlvbiB9KWAuXG4gKiBUaGUgdHdvIHR5cGUgcGFyYW1ldGVycyBuZXZlciBleGlzdCBhdCBydW4gdGltZTsgdGhleSByaWRlIG9uIHRoZSByZXR1cm5lZFxuICogb2JqZWN0IHNvIGBRZ2lzU2RrLmZyb21CcmlkZ2VTY2hlbWEoc2NoZW1hKWAgY2FuIGluZmVyIHRoZW0sIGFuZCB0aGVcbiAqIGRlc2NyaXB0aW9uIGl0c2VsZiBpcyB3aGF0IHRoZSBTREsgdmFsaWRhdGVzIGFnYWluc3QuXG4gKi9cblxuaW1wb3J0IHsgdHlwZSBQbHVnaW5EZXNjcmlwdGlvbiwgcGFyc2VQbHVnaW5EZXNjcmlwdGlvbiB9IGZyb20gXCIuL2RlY2xhcmF0aW9uc1wiO1xuXG4vKiogV2hhdCBvbmUgZGVjbGFyZWQgYWN0aW9uIHByb21pc2VzOiBhbiBvYmplY3QgaW4sIGEgdmFsdWUgb3V0LiAqL1xuZXhwb3J0IGludGVyZmFjZSBPcGVyYXRpb25TaGFwZSB7XG5cdHJlYWRvbmx5IHJlcXVlc3Q6IG9iamVjdDtcblx0cmVhZG9ubHkgcmVzdWx0OiB1bmtub3duO1xufVxuXG4vKiogV2hhdCBvbmUgZGVjbGFyZWQgc3RyZWFtIHByb21pc2VzOiBhbiBvYmplY3QgaW4sIGRpc2NyaW1pbmF0ZWQgZXZlbnRzIG91dC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RyZWFtU2hhcGUge1xuXHRyZWFkb25seSByZXF1ZXN0OiBvYmplY3Q7XG5cdHJlYWRvbmx5IGV2ZW50OiB7IHJlYWRvbmx5IGtpbmQ6IHN0cmluZzsgcmVhZG9ubHkgcGF5bG9hZDogdW5rbm93biB9O1xufVxuXG4vKiogVGhlIGRlZmF1bHQsIHVudHlwZWQgbWFwOiBhbnkgaWQsIGFueSBzaGFwZS4gKi9cbmV4cG9ydCB0eXBlIE9wZXJhdGlvbk1hcCA9IHsgcmVhZG9ubHkgW2lkOiBzdHJpbmddOiBPcGVyYXRpb25TaGFwZSB9O1xuXG4vKiogVGhlIGRlZmF1bHQsIHVudHlwZWQgbWFwOiBhbnkgaWQsIGFueSBzaGFwZS4gKi9cbmV4cG9ydCB0eXBlIFN0cmVhbU1hcCA9IHsgcmVhZG9ubHkgW2lkOiBzdHJpbmddOiBTdHJlYW1TaGFwZSB9O1xuXG4vKipcbiAqIEEgcGFyc2VkIHBsdWdpbiBkZXNjcmlwdGlvbiBjYXJyeWluZyBpdHMgYE9wZXJhdGlvbnNgIGFuZCBgU3RyZWFtc2AgdHlwZXMuXG4gKlxuICogVGhlIGBcIn50eXBlc1wiYCBtZW1iZXIgaXMgY29tcGlsZS10aW1lIG9ubHk6IGl0IGlzIG5ldmVyIHNldCwgYW5kIGEgc2NoZW1hIGlzXG4gKiBhIGZyb3plbiB7QGxpbmsgUGx1Z2luRGVzY3JpcHRpb259IGFuZCBub3RoaW5nIG1vcmUgYXQgcnVuIHRpbWUuIEl0IGlzIGFcbiAqIHN0cmluZyBrZXksIG5vdCBhIHVuaXF1ZSBzeW1ib2wsIHNvIHRoZSB0eXBlIHN0YXlzIHN0cnVjdHVyYWxseSB0aGUgc2FtZVxuICogYWNyb3NzIHRoZSBwYWNrYWdlJ3MgZW50cnkgcG9pbnRzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJyaWRnZVNjaGVtYTxPID0gT3BlcmF0aW9uTWFwLCBTID0gU3RyZWFtTWFwPlxuXHRleHRlbmRzIFBsdWdpbkRlc2NyaXB0aW9uIHtcblx0cmVhZG9ubHkgXCJ+dHlwZXNcIj86IHtcblx0XHRyZWFkb25seSBvcGVyYXRpb25zOiBPO1xuXHRcdHJlYWRvbmx5IHN0cmVhbXM6IFM7XG5cdH07XG59XG5cbi8qKiBUaGUgYE9wZXJhdGlvbnNgIG1hcCBhIHNjaGVtYSBjYXJyaWVzLiAqL1xuZXhwb3J0IHR5cGUgT3BlcmF0aW9uc09mPFNjaGVtYT4gPVxuXHRTY2hlbWEgZXh0ZW5kcyBCcmlkZ2VTY2hlbWE8aW5mZXIgTywgdW5rbm93bj4gPyBPIDogbmV2ZXI7XG5cbi8qKiBUaGUgYFN0cmVhbXNgIG1hcCBhIHNjaGVtYSBjYXJyaWVzLiAqL1xuZXhwb3J0IHR5cGUgU3RyZWFtc09mPFNjaGVtYT4gPVxuXHRTY2hlbWEgZXh0ZW5kcyBCcmlkZ2VTY2hlbWE8dW5rbm93biwgaW5mZXIgUz4gPyBTIDogbmV2ZXI7XG5cbi8qKlxuICogUGFyc2UgYSBkZXNjcmlwdGlvbiBhbmQgdHlwZSBpdDsgdGhlIGdlbmVyYXRlZCBtb2R1bGUgaXMgdGhlIG9ubHkgY2FsbGVyLlxuICpcbiAqIFRoZSBkZXNjcmlwdGlvbiBpcyBjaGVja2VkIHRoZSB3YXkgYW55IGRlc2NyaXB0aW9uIGlzIChgc2NoZW1hX3ZlcnNpb25gLFxuICogaWRzLCBoYW5kbGVycywgZGVjbGFyZWQgc3RyZWFtcyksIHNvIGEgaGFuZC1lZGl0ZWQgb3Igc3RhbGUgbW9kdWxlIGZhaWxzXG4gKiBoZXJlLCBhdCBpbXBvcnQsIHJhdGhlciB0aGFuIG9uIHRoZSBmaXJzdCBjYWxsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lQnJpZGdlU2NoZW1hPFxuXHRPIGV4dGVuZHMgUmVjb3JkPGtleW9mIE8sIE9wZXJhdGlvblNoYXBlPixcblx0UyBleHRlbmRzIFJlY29yZDxrZXlvZiBTLCBTdHJlYW1TaGFwZT4sXG4+KGlucHV0OiBzdHJpbmcgfCBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4pOiBCcmlkZ2VTY2hlbWE8TywgUz4ge1xuXHRyZXR1cm4gcGFyc2VQbHVnaW5EZXNjcmlwdGlvbihpbnB1dCkgYXMgQnJpZGdlU2NoZW1hPE8sIFM+O1xufVxuIgogIF0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBYU8sSUFBTSxtQkFBMkI7QUFDakMsSUFBTSxtQkFBMkI7QUFDakMsSUFBTSxvQ0FBdUM7QUFxRDdDLFNBQVMsaUJBQWlCLENBQUMsT0FBaUM7QUFBQSxFQUNsRSxPQUFPLE9BQU8sVUFBVSxZQUFZLE9BQU8sY0FBYyxLQUFLO0FBQUE7QUFBQTtBQU14RCxNQUFNLGdDQUFnQyxjQUFhO0FBQUEsRUFDbEQsV0FBVyxDQUFDLFNBQWlCO0FBQUEsSUFDbkMsTUFBTSxTQUFTLHFCQUFxQjtBQUFBO0FBRXRDO0FBQUE7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Q3BDLE1BQU0sU0FBUyxZQUFZLE9BQU8sSUFBSSxhQUFhLFFBQVEsTUFBTSxDQUFDO0FBQUEsRUFDbkU7QUFBQSxFQUNBLFdBQVcsYUFBYSxZQUFZO0FBQUEsSUFDbkMsT0FBTyxPQUFPLFNBQVM7QUFBQSxFQUN4QjtBQUFBLEVBQ0EsT0FBTyxPQUFPLE9BQU8sT0FBTztBQUFBO0FBUzdCLFNBQVMsS0FBSyxDQUNiLFNBQ0EsWUFDQSxJQUNBLFFBQ087QUFBQSxFQUNQLE1BQU0sV0FBVyxHQUFHLE1BQU0sR0FBRztBQUFBLEVBQzdCLElBQUksU0FBUyxLQUFLLENBQUMsWUFBWSxZQUFZLEVBQUUsR0FBRztBQUFBLElBQy9DLE1BQU0sSUFBSSx3QkFDVCxHQUFHLG1EQUNKO0FBQUEsRUFDRDtBQUFBLEVBQ0EsTUFBTSxPQUFPLFNBQVM7QUFBQSxFQUN0QixJQUFJLGlCQUFpQixTQUFTLElBQUksR0FBRztBQUFBLElBQ3BDLE1BQU0sSUFBSSx3QkFDVCxHQUFHLDREQUE0RCxpQkFBaUIsS0FBSyxJQUFJLElBQzFGO0FBQUEsRUFDRDtBQUFBLEVBQ0EsSUFBSSxPQUFPO0FBQUEsRUFDWCxZQUFZLE9BQU8sWUFBWSxTQUFTLFFBQVEsR0FBRztBQUFBLElBQ2xELE1BQU0sU0FBUyxTQUFTLE1BQU0sR0FBRyxRQUFRLENBQUMsRUFBRSxLQUFLLEdBQUc7QUFBQSxJQUNwRCxNQUFNLFdBQVcsS0FBSztBQUFBLElBQ3RCLElBQUksVUFBVSxTQUFTLFNBQVMsR0FBRztBQUFBLE1BQ2xDLElBQUksYUFBYSxXQUFXO0FBQUEsUUFDM0IsTUFBTSxJQUFJLHdCQUNULE9BQU8sYUFBYSxhQUNqQixHQUFHLCtCQUNILEdBQUcsZ0VBQ1A7QUFBQSxNQUNEO0FBQUEsTUFDQSxLQUFLLFdBQVc7QUFBQSxNQUNoQjtBQUFBLElBQ0Q7QUFBQSxJQUNBLElBQUksYUFBYSxXQUFXO0FBQUEsTUFDM0IsTUFBTSxZQUFxQyxDQUFDO0FBQUEsTUFDNUMsV0FBVyxLQUFLLFNBQVM7QUFBQSxNQUN6QixLQUFLLFdBQVc7QUFBQSxNQUNoQixPQUFPO0FBQUEsSUFDUixFQUFPLFNBQUksT0FBTyxhQUFhLFlBQVk7QUFBQSxNQUMxQyxNQUFNLElBQUksd0JBQ1QsR0FBRyxPQUFPLGlFQUNYO0FBQUEsSUFDRCxFQUFPO0FBQUEsTUFDTixPQUFPO0FBQUE7QUFBQSxFQUVUO0FBQUE7QUFTTSxJQUFVO0FBQUEsQ0FBVixDQUFVLFlBQVY7QUFBQSxFQVFDLFNBQVMsZ0JBR2YsQ0FBQyxRQUE0QixVQUEwQixDQUFDLEdBQWtCO0FBQUEsSUFDMUUsT0FBTyxNQUFNLFFBQVEsT0FBTztBQUFBO0FBQUEsRUFKdEIsUUFBUztBQUFBLEdBUkE7O0FDbFhWLFNBQVMsa0JBR2YsQ0FBQyxPQUF1RTtBQUFBLEVBQ3hFLE9BQU8sdUJBQXVCLEtBQUs7QUFBQTsiLAogICJkZWJ1Z0lkIjogIjc1NTVDOTNEQTVENTdCMUE2NDc1NkUyMTY0NzU2RTIxIiwKICAibmFtZXMiOiBbXQp9
417
+ //# debugId=507C47A54A87BD1B64756E2164756E21
418
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL3Byb2Nlc3NpbmcudHMiLCAic3JjL3dlYmNoYW5uZWwudHMiLCAic3JjL3FnaXMtc2RrLnRzIiwgInNyYy9zY2hlbWEudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiLyoqXG4gKiBQcm9jZXNzaW5nIGZyb20gYSBwYWdlIChkZWNpc2lvbi02NCk6IHRoZSB2YWx1ZSBhbGlhc2VzIGEgZ2VuZXJhdGVkXG4gKiBgcHJvY2Vzc2luZy5zY2hlbWEudHNgIGFubm90YXRlcyB3aXRoLCBhbmQgYHJ1bkFsZ29yaXRobWAsIHdoaWNoIHNlbmRzIG9uZVxuICogYGFsZ29yaXRobXMucnVuYCBhbmQgcmVzaGFwZXMgdGhlIHRhZ2dlZCBvdXRwdXRzIGludG8gdGhlIHJlc3VsdCBvYmplY3QgdGhlXG4gKiBnZW5lcmF0ZWQgYDxQcm92aWRlcj48QWxnb3JpdGhtPlJlc3VsdGAgdHlwZSBzcGVsbHMuXG4gKlxuICogVGhlIHR5cGluZyBsaXZlcyBpbiB0aGUgZ2VuZXJhdGVkIG1vZHVsZSwgbm90IGhlcmU6IGBxZ2lzLXNkayBwcm9jZXNzaW5nXG4gKiBnZW5lcmF0ZWAgZW1pdHMgYW4gYEFsZ29yaXRobVJlZ2lzdHJ5YCBmb3IgdGhlIHByb3ZpZGVycyB0aGUgcHJvamVjdCBhc2tlZFxuICogZm9yIGFuZCBhIGBydW5BbGdvcml0aG1gIGJvdW5kIHRvIGl0LiBUaGlzIG1vZHVsZSBpcyBnZW5lcmljIG92ZXIgYW55IHN1Y2hcbiAqIHJlZ2lzdHJ5IHNvIHRoZSBicmlkZ2UgaXRzZWxmIHNoaXBzIG5vIGNhdGFsb2d1ZSAoZGVjaXNpb24tNDc6IHplcm8gcnVudGltZVxuICogZGF0YSB0aGF0IGdvZXMgc3RhbGUgd2l0aCBhIFFHSVMgcmVsZWFzZSkuXG4gKlxuICogVGhlIGhvc3QgdmFsaWRhdGVzIHRoZSBwYXJhbWV0ZXJzIGFnYWluc3QgdGhlIGFsZ29yaXRobSdzIG93biBkZXNjcmlwdGlvblxuICogYmVmb3JlIGFueXRoaW5nIHJ1bnM7IGEgbGF5ZXIgaW5wdXQgaXMgYW4gb3duZWQgbGF5ZXIgaWQsIGEgZmlsZSBpbnB1dCBpcyBhXG4gKiByZWYgdGhlIGhvc3QgbWludGVkIGZvciB0aGlzIHZpZXcsIGFuZCBhbiBvbWl0dGVkIGRlc3RpbmF0aW9uIGNvbWVzIGJhY2sgYXNcbiAqIGFuIG93bmVkIGxheWVyIG9yIGEgcmVhZGFibGUgcmVmLlxuICovXG5cbmltcG9ydCB0eXBlIHtcblx0RmlsZVJlZixcblx0SG9zdEludm9rZU9wdGlvbnMsXG5cdEhvc3RPcGVyYXRpb25zLFxuXHRSdW5PdXRwdXQsXG5cdFJ1blJlc3VsdCxcblx0VmVjdG9yTGF5ZXJJbmZvLFxufSBmcm9tIFwiLi9nZW5lcmF0ZWQvaG9zdFwiO1xuXG5leHBvcnQgdHlwZSB7XG5cdEFsZ29yaXRobUluZm8sXG5cdEFsZ29yaXRobVN1bW1hcnksXG5cdEZpbGVSZWYsXG5cdEhvc3RJbnZva2VPcHRpb25zLFxuXHRPdXRwdXRJbmZvLFxuXHRQYXJhbWV0ZXJJbmZvLFxuXHRQcm92aWRlckluZm8sXG5cdFJ1bk91dHB1dCxcblx0UnVuUmVzdWx0LFxuXHRWZWN0b3JMYXllckluZm8sXG59IGZyb20gXCIuL2dlbmVyYXRlZC9ob3N0XCI7XG5cbi8qKiBBIGxheWVyIGlucHV0OiB0aGUgaWQgb2YgYSBsYXllciB0aGUgaG9zdCBvd25zLCBvciBhIHJlZiB0aGUgdmlldyBob2xkcy4gKi9cbmV4cG9ydCB0eXBlIExheWVyUmVmID0gc3RyaW5nIHwgRmlsZVJlZjtcbi8qKiBXaGVyZSBhbiBvdXRwdXQgZ29lczogYSB3cml0YWJsZSByZWYsIG9yIGBudWxsYCB0byBsZXQgdGhlIGhvc3QgYWxsb2NhdGUgb25lLiAqL1xuZXhwb3J0IHR5cGUgRGVzdGluYXRpb24gPSBGaWxlUmVmIHwgbnVsbDtcbi8qKiBgXCJ4bWluLHhtYXgseW1pbix5bWF4IFtjcnNdXCJgIGFzIFFHSVMgd3JpdGVzIGl0LCBvciB0aGUgZm91ciBudW1iZXJzLiAqL1xuZXhwb3J0IHR5cGUgRXh0ZW50ID0gc3RyaW5nIHwgcmVhZG9ubHkgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl07XG4vKiogYFwieCx5IFtjcnNdXCJgIG9yIHRoZSB0d28gbnVtYmVycy4gKi9cbmV4cG9ydCB0eXBlIFBvaW50VmFsdWUgPSBzdHJpbmcgfCByZWFkb25seSBbbnVtYmVyLCBudW1iZXJdO1xuLyoqIGBbbG93ZXIsIHVwcGVyXWAuICovXG5leHBvcnQgdHlwZSBSYW5nZVZhbHVlID0gcmVhZG9ubHkgW251bWJlciwgbnVtYmVyXTtcblxuLyoqXG4gKiBXaGF0IGEgZ2VuZXJhdGVkIGBBbGdvcml0aG1SZWdpc3RyeWAgaXM6IHBhcmFtcyBhbmQgcmVzdWx0IHBlciBhbGdvcml0aG0gaWQuXG4gKiBTcGVsbGVkIGFzIGEgbWFwcGVkIGNvbnN0cmFpbnQgb3ZlciB0aGUgcmVnaXN0cnkgaXRzZWxmIHNvIGFuIGBpbnRlcmZhY2VgXG4gKiAod2hpY2ggaGFzIG5vIGltcGxpY2l0IGluZGV4IHNpZ25hdHVyZSkgc2F0aXNmaWVzIGl0LlxuICovXG5leHBvcnQgdHlwZSBBbGdvcml0aG1SZWdpc3RyeUxpa2U8Uj4gPSB7XG5cdHJlYWRvbmx5IFtLIGluIGtleW9mIFJdOiB7IHJlYWRvbmx5IHBhcmFtczogb2JqZWN0OyByZWFkb25seSByZXN1bHQ6IG9iamVjdCB9O1xufTtcblxuLyoqIFRoZSBwYXJ0IG9mIGEgYFFnaXNTZGtgIChvciBhbnl0aGluZyBlbHNlKSBgcnVuQWxnb3JpdGhtYCBuZWVkcy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWxnb3JpdGhtSG9zdCB7XG5cdHJlYWRvbmx5IGhvc3Q6IFBpY2s8SG9zdE9wZXJhdGlvbnMsIFwiYWxnb3JpdGhtc1wiPjtcbn1cblxuLyoqIE9uZSBydW4gYXMgdGhlIHBhZ2Ugc2VlcyBpdDogdGhlIG91dHB1dHMgYnkgbmFtZSwgcGx1cyB0aGUgcmVwbHkgYXMgaXQgY3Jvc3NlZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWxnb3JpdGhtUnVuPFJlc3VsdCBleHRlbmRzIG9iamVjdD4ge1xuXHRyZWFkb25seSBhbGdvcml0aG06IHN0cmluZztcblx0cmVhZG9ubHkgb3V0cHV0czogUmVzdWx0O1xuXHRyZWFkb25seSByYXc6IFJ1blJlc3VsdDtcbn1cblxuLyoqXG4gKiBSdW4gYGlkYCB3aXRoIGBwYXJhbXNgIHRocm91Z2ggYHFnaXMuaG9zdC5hbGdvcml0aG1zLnJ1bmAgYW5kIHJlc2hhcGUgdGhlXG4gKiByZXBseTogYSBgdmVjdG9yYCBvdXRwdXQgYmVjb21lcyBpdHMgYFZlY3RvckxheWVySW5mb2AsIGEgYGZpbGVgIG91dHB1dCBpdHNcbiAqIGBGaWxlUmVmYCwgYSBgdmFsdWVgIG91dHB1dCB0aGUgc2NhbGFyIC0ga2V5ZWQgYnkgb3V0cHV0IG5hbWUsIHdoaWNoIGlzIHdoYXRcbiAqIHRoZSBnZW5lcmF0ZWQgYC4uLlJlc3VsdGAgaW50ZXJmYWNlcyBkZWNsYXJlLlxuICpcbiAqIEJvdGggdHlwZSBwYXJhbWV0ZXJzIGFyZSBtZWFudCB0byBiZSBib3VuZCBieSB0aGUgZ2VuZXJhdGVkIG1vZHVsZSdzIG93blxuICogYHJ1bkFsZ29yaXRobWA7IGNhbGxpbmcgdGhpcyBvbmUgZGlyZWN0bHkgbmVlZHMgdGhlbSBzcGVsbGVkIG91dC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bkFsZ29yaXRobTxcblx0UiBleHRlbmRzIEFsZ29yaXRobVJlZ2lzdHJ5TGlrZTxSPixcblx0SyBleHRlbmRzIGtleW9mIFIgJiBzdHJpbmcsXG4+KFxuXHRxZ2lzOiBBbGdvcml0aG1Ib3N0LFxuXHRpZDogSyxcblx0cGFyYW1zOiBSW0tdW1wicGFyYW1zXCJdLFxuXHRvcHRpb25zPzogSG9zdEludm9rZU9wdGlvbnMsXG4pOiBQcm9taXNlPEFsZ29yaXRobVJ1bjxSW0tdW1wicmVzdWx0XCJdPj4ge1xuXHRjb25zdCByYXcgPSBhd2FpdCBxZ2lzLmhvc3QuYWxnb3JpdGhtcy5ydW4oXG5cdFx0eyBhbGdvcml0aG1faWQ6IGlkLCBwYXJhbXM6IHBhcmFtcyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9LFxuXHRcdG9wdGlvbnMsXG5cdCk7XG5cdHJldHVybiB7XG5cdFx0YWxnb3JpdGhtOiByYXcuYWxnb3JpdGhtLFxuXHRcdG91dHB1dHM6IG91dHB1dHNCeU5hbWUocmF3Lm91dHB1dHMpIGFzIFJbS11bXCJyZXN1bHRcIl0sXG5cdFx0cmF3LFxuXHR9O1xufVxuXG4vKiogVW53cmFwIGEgdGFnZ2VkIG91dHB1dCBsaXN0IGludG8gYHsgW25hbWVdOiBsYXllciB8IHJlZiB8IHZhbHVlIH1gLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG91dHB1dHNCeU5hbWUoXG5cdG91dHB1dHM6IHJlYWRvbmx5IFJ1bk91dHB1dFtdLFxuKTogUmVjb3JkPFxuXHRzdHJpbmcsXG5cdFZlY3RvckxheWVySW5mbyB8IEZpbGVSZWYgfCBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgbnVsbCB8IHVuZGVmaW5lZFxuPiB7XG5cdGNvbnN0IHJlc3VsdDogUmVjb3JkPFxuXHRcdHN0cmluZyxcblx0XHRWZWN0b3JMYXllckluZm8gfCBGaWxlUmVmIHwgc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWRcblx0PiA9IHt9O1xuXHRmb3IgKGNvbnN0IG91dHB1dCBvZiBvdXRwdXRzKSB7XG5cdFx0aWYgKG91dHB1dC5raW5kID09PSBcInZlY3RvclwiKSByZXN1bHRbb3V0cHV0Lm5hbWVdID0gb3V0cHV0LmxheWVyO1xuXHRcdGVsc2UgaWYgKG91dHB1dC5raW5kID09PSBcImZpbGVcIikgcmVzdWx0W291dHB1dC5uYW1lXSA9IG91dHB1dC5maWxlO1xuXHRcdGVsc2UgcmVzdWx0W291dHB1dC5uYW1lXSA9IG91dHB1dC52YWx1ZTtcblx0fVxuXHRyZXR1cm4gcmVzdWx0O1xufVxuIiwKICAgICIvKipcbiAqIFRoZSBkZWZhdWx0IHRyYW5zcG9ydDogUXQncyBXZWJDaGFubmVsLCBhcyBhIFFHSVMgd2ViIHZpZXcgaW5qZWN0cyBpdC5cbiAqXG4gKiBRR0lTIHJlZ2lzdGVycyBvbmUgb2JqZWN0IG9uIHRoZSBjaGFubmVsICh0aGUgZXhhbXBsZSBuYW1lcyBpdCBcImJyaWRnZVwiO1xuICogc2VlIGBjcmVhdGVfY2hhbm5lbF9vYmplY3RgIGluIHRoZSBQeXRob24gcnVudGltZSkuIEl0cyBgcmVjZWl2ZWAgc2xvdCB0YWtlc1xuICogYSBKU09OIGVudmVsb3BlIGFuZCBpdHMgYG1lc3NhZ2VgIHNpZ25hbCBjYXJyaWVzIGV2ZXJ5IHJlcGx5IGFuZCBzdHJlYW1cbiAqIGZyYW1lIGJhY2suIFRoZSBjaGFubmVsIGJlY29tZXMgcmVhZHkgb24gYSBsYXRlciB0dXJuLCBzbyB0aGlzIHRyYW5zcG9ydFxuICogaXMgbGF6eTogYSBgUWdpc1Nka2AgYnVpbHQgaW4gdGhlIGZpcnN0IHN0YXRlbWVudCBvZiBhIHBhZ2UgY2FuIHNlbmQgYXRcbiAqIG9uY2UsIGFuZCB3aGF0IGl0IHNlbnQgaXMgZGVsaXZlcmVkIHdoZW4gdGhlIGNoYW5uZWwgcmVwb3J0cyByZWFkeS5cbiAqXG4gKiBUaGlzIGlzIHRoZSBvbmUgbW9kdWxlIG9mIHRoZSByb290IGVudHJ5IHBvaW50IHRoYXQgcmVhZHMgYSBicm93c2VyIGdsb2JhbCxcbiAqIGFuZCBpdCBvbmx5IGRvZXMgc28gd2hlbiBjYWxsZWQ6IGltcG9ydGluZyBpdCB0b3VjaGVzIG5vdGhpbmcsIGFuZCBhIHBhZ2VcbiAqIHRoYXQgaXMgbm90IGluc2lkZSBRR0lTIGdldHMgYSBzeW5jaHJvbm91cywgbmFtZWQgcmVmdXNhbCBpbnN0ZWFkIG9mIGEgaGFuZy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFdpcmVUcmFuc3BvcnQgfSBmcm9tIFwiLi9icmlkZ2VcIjtcbmltcG9ydCB7IFFnaXNTZGtFcnJvciB9IGZyb20gXCIuL2Vycm9yc1wiO1xuXG5pbnRlcmZhY2UgQ2hhbm5lbE9iamVjdCB7XG5cdHJlY2VpdmUodGV4dDogc3RyaW5nKTogdm9pZDtcblx0cmVhZG9ubHkgbWVzc2FnZToge1xuXHRcdGNvbm5lY3QobGlzdGVuZXI6ICh0ZXh0OiBzdHJpbmcpID0+IHZvaWQpOiB2b2lkO1xuXHRcdGRpc2Nvbm5lY3QobGlzdGVuZXI6ICh0ZXh0OiBzdHJpbmcpID0+IHZvaWQpOiB2b2lkO1xuXHR9O1xufVxuXG5pbnRlcmZhY2UgQ2hhbm5lbCB7XG5cdHJlYWRvbmx5IG9iamVjdHM6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIENoYW5uZWxPYmplY3QgfCB1bmRlZmluZWQ+Pjtcbn1cblxuaW50ZXJmYWNlIFF0U2NvcGUge1xuXHRyZWFkb25seSBxdD86IHsgcmVhZG9ubHkgd2ViQ2hhbm5lbFRyYW5zcG9ydDogdW5rbm93biB9O1xuXHRyZWFkb25seSBRV2ViQ2hhbm5lbD86IG5ldyAoXG5cdFx0dHJhbnNwb3J0OiB1bmtub3duLFxuXHRcdHJlYWR5OiAoY2hhbm5lbDogQ2hhbm5lbCkgPT4gdm9pZCxcblx0KSA9PiB1bmtub3duO1xufVxuXG4vKiogVGhlIHdlYiB2aWV3IGRpZCBub3QgcHJvdmlkZSBhIHVzYWJsZSBjaGFubmVsLiAqL1xuZXhwb3J0IGNsYXNzIFFnaXNTZGtXZWJDaGFubmVsRXJyb3IgZXh0ZW5kcyBRZ2lzU2RrRXJyb3Ige1xuXHRwdWJsaWMgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nKSB7XG5cdFx0c3VwZXIobWVzc2FnZSwgXCJub193ZWJfY2hhbm5lbFwiKTtcblx0fVxufVxuXG4vKiogVGhlIHRyYW5zcG9ydCB7QGxpbmsgY3JlYXRlV2ViQ2hhbm5lbFRyYW5zcG9ydH0gcmV0dXJucy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2ViQ2hhbm5lbFRyYW5zcG9ydCBleHRlbmRzIFdpcmVUcmFuc3BvcnQge1xuXHQvKiogUmVzb2x2ZXMgb25jZSB0aGUgY2hhbm5lbCBvYmplY3QgYW5zd2VyZWQ7IHJlamVjdHMgd2hlbiBpdCBuZXZlciB3aWxsLiAqL1xuXHRyZWFkb25seSByZWFkeTogUHJvbWlzZTx2b2lkPjtcblx0LyoqIFN0b3AgZm9yd2FyZGluZyBtZXNzYWdlczsgc2VuZHMgYWZ0ZXIgdGhpcyB0aHJvdy4gKi9cblx0Y2xvc2UoKTogdm9pZDtcbn1cblxuZnVuY3Rpb24gc2NvcGUoKTogUXRTY29wZSB7XG5cdHJldHVybiBnbG9iYWxUaGlzIGFzIHVua25vd24gYXMgUXRTY29wZTtcbn1cblxuLyoqIFRydWUgaW5zaWRlIGEgUUdJUyB3ZWIgdmlldywgd2hlcmUgUXQgaW5qZWN0ZWQgaXRzIHRyYW5zcG9ydCBhbmQgc2NyaXB0LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluc2lkZVFnaXMoKTogYm9vbGVhbiB7XG5cdGNvbnN0IHBhZ2UgPSBzY29wZSgpO1xuXHRyZXR1cm4gcGFnZS5xdCAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBwYWdlLlFXZWJDaGFubmVsID09PSBcImZ1bmN0aW9uXCI7XG59XG5cbi8qKlxuICogQ29ubmVjdCB0byB0aGUgY2hhbm5lbCBvYmplY3QgYG9iamVjdE5hbWVgIGFuZCByZXR1cm4gYSB0cmFuc3BvcnQgb24gaXQuXG4gKlxuICogVGhyb3dzIHtAbGluayBRZ2lzU2RrV2ViQ2hhbm5lbEVycm9yfSBzeW5jaHJvbm91c2x5IG91dHNpZGUgYSBRR0lTIHdlYiB2aWV3LFxuICogc28gYSBwYWdlIGxlYXJucyBpbiBpdHMgZmlyc3Qgc3RhdGVtZW50IHRoYXQgaXQgaGFzIG5vIGhvc3QgdG8gdGFsayB0by5cbiAqIEluc2lkZSBvbmUsIG1lc3NhZ2VzIHNlbnQgYmVmb3JlIHRoZSBjaGFubmVsIGlzIHJlYWR5IGFyZSBxdWV1ZWQgYW5kXG4gKiBkZWxpdmVyZWQgaW4gb3JkZXIgb25jZSBpdCBpczsgYHJlYWR5YCByZWplY3RzIChhbmQgcXVldWVkIHNlbmRzIGFyZVxuICogZHJvcHBlZCkgd2hlbiB0aGUgaG9zdCByZWdpc3RlcmVkIG5vIG9iamVjdCB1bmRlciB0aGF0IG5hbWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVXZWJDaGFubmVsVHJhbnNwb3J0KFxuXHRvYmplY3ROYW1lID0gXCJicmlkZ2VcIixcbik6IFdlYkNoYW5uZWxUcmFuc3BvcnQge1xuXHRjb25zdCBwYWdlID0gc2NvcGUoKTtcblx0Y29uc3QgcXQgPSBwYWdlLnF0O1xuXHRjb25zdCBRV2ViQ2hhbm5lbCA9IHBhZ2UuUVdlYkNoYW5uZWw7XG5cdGlmIChxdCA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBRV2ViQ2hhbm5lbCAhPT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0dGhyb3cgbmV3IFFnaXNTZGtXZWJDaGFubmVsRXJyb3IoXG5cdFx0XHRcIm5vdCBpbnNpZGUgYSBRR0lTIHdlYiB2aWV3OiB3aW5kb3cucXQgaXMgbWlzc2luZ1wiLFxuXHRcdCk7XG5cdH1cblx0Y29uc3QgbGlzdGVuZXJzID0gbmV3IFNldDwobWVzc2FnZTogdW5rbm93bikgPT4gdm9pZD4oKTtcblx0Y29uc3QgcXVldWU6IHN0cmluZ1tdID0gW107XG5cdGxldCBvYmplY3Q6IENoYW5uZWxPYmplY3QgfCBudWxsID0gbnVsbDtcblx0bGV0IGZhaWx1cmU6IFFnaXNTZGtXZWJDaGFubmVsRXJyb3IgfCBudWxsID0gbnVsbDtcblx0bGV0IGNsb3NlZCA9IGZhbHNlO1xuXHRjb25zdCBmb3J3YXJkID0gKHRleHQ6IHN0cmluZyk6IHZvaWQgPT4ge1xuXHRcdGlmIChjbG9zZWQpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0bGV0IHBhcnNlZDogdW5rbm93bjtcblx0XHR0cnkge1xuXHRcdFx0cGFyc2VkID0gSlNPTi5wYXJzZSh0ZXh0KTtcblx0XHR9IGNhdGNoIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Zm9yIChjb25zdCBsaXN0ZW5lciBvZiBbLi4ubGlzdGVuZXJzXSkge1xuXHRcdFx0bGlzdGVuZXIocGFyc2VkKTtcblx0XHR9XG5cdH07XG5cdGNvbnN0IHJlYWR5ID0gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdG5ldyBRV2ViQ2hhbm5lbChxdC53ZWJDaGFubmVsVHJhbnNwb3J0LCAoY2hhbm5lbCkgPT4ge1xuXHRcdFx0Y29uc3QgZm91bmQgPSBjaGFubmVsLm9iamVjdHNbb2JqZWN0TmFtZV07XG5cdFx0XHRpZiAoZm91bmQgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRmYWlsdXJlID0gbmV3IFFnaXNTZGtXZWJDaGFubmVsRXJyb3IoXG5cdFx0XHRcdFx0YHRoZSBob3N0IHJlZ2lzdGVyZWQgbm8gJHtKU09OLnN0cmluZ2lmeShvYmplY3ROYW1lKX0gY2hhbm5lbCBvYmplY3RgLFxuXHRcdFx0XHQpO1xuXHRcdFx0XHRxdWV1ZS5sZW5ndGggPSAwO1xuXHRcdFx0XHRyZWplY3QoZmFpbHVyZSk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGlmIChjbG9zZWQpIHtcblx0XHRcdFx0cmVzb2x2ZSgpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRvYmplY3QgPSBmb3VuZDtcblx0XHRcdGZvdW5kLm1lc3NhZ2UuY29ubmVjdChmb3J3YXJkKTtcblx0XHRcdGZvciAoY29uc3QgdGV4dCBvZiBxdWV1ZS5zcGxpY2UoMCkpIHtcblx0XHRcdFx0Zm91bmQucmVjZWl2ZSh0ZXh0KTtcblx0XHRcdH1cblx0XHRcdHJlc29sdmUoKTtcblx0XHR9KTtcblx0fSk7XG5cdHJldHVybiB7XG5cdFx0cmVhZHksXG5cdFx0c2VuZChtZXNzYWdlOiB1bmtub3duKTogdm9pZCB7XG5cdFx0XHRpZiAoY2xvc2VkKSB7XG5cdFx0XHRcdHRocm93IG5ldyBRZ2lzU2RrV2ViQ2hhbm5lbEVycm9yKFwidGhlIHdlYiBjaGFubmVsIHRyYW5zcG9ydCBpcyBjbG9zZWRcIik7XG5cdFx0XHR9XG5cdFx0XHRpZiAoZmFpbHVyZSAhPT0gbnVsbCkge1xuXHRcdFx0XHR0aHJvdyBmYWlsdXJlO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgdGV4dCA9IEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpO1xuXHRcdFx0aWYgKG9iamVjdCA9PT0gbnVsbCkge1xuXHRcdFx0XHRxdWV1ZS5wdXNoKHRleHQpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRvYmplY3QucmVjZWl2ZSh0ZXh0KTtcblx0XHR9LFxuXHRcdHN1YnNjcmliZShsaXN0ZW5lcjogKG1lc3NhZ2U6IHVua25vd24pID0+IHZvaWQpOiAoKSA9PiB2b2lkIHtcblx0XHRcdGxpc3RlbmVycy5hZGQobGlzdGVuZXIpO1xuXHRcdFx0cmV0dXJuICgpID0+IHtcblx0XHRcdFx0bGlzdGVuZXJzLmRlbGV0ZShsaXN0ZW5lcik7XG5cdFx0XHR9O1xuXHRcdH0sXG5cdFx0Y2xvc2UoKTogdm9pZCB7XG5cdFx0XHRpZiAoY2xvc2VkKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGNsb3NlZCA9IHRydWU7XG5cdFx0XHRxdWV1ZS5sZW5ndGggPSAwO1xuXHRcdFx0bGlzdGVuZXJzLmNsZWFyKCk7XG5cdFx0XHRvYmplY3Q/Lm1lc3NhZ2UuZGlzY29ubmVjdChmb3J3YXJkKTtcblx0XHR9LFxuXHR9O1xufVxuIiwKICAgICIvKipcbiAqIGBRZ2lzU2RrYDogdGhlIHBhZ2Utc2lkZSBvYmplY3QgYSBwbHVnaW4ncyB3ZWIgdmlldyB0YWxrcyB0byBRR0lTIHRocm91Z2guXG4gKlxuICogVGhyZWUgc3RhdGVtZW50cyBjb25uZWN0IGEgcGFnZSAoZGVjaXNpb24tNDQpOlxuICpcbiAqIGBgYHRzXG4gKiBpbXBvcnQgc2NoZW1hIGZyb20gXCIuL2JyaWRnZS5zY2hlbWFcIjtcbiAqIGNvbnN0IHFnaXMgPSBRZ2lzU2RrLmZyb21CcmlkZ2VTY2hlbWEoc2NoZW1hKTtcbiAqIGF3YWl0IHFnaXMuc2l0ZXMuc3VtbWFyeSh7IGxheWVyX2lkIH0pO1xuICogYGBgXG4gKlxuICogVGhlIHNjaGVtYSBpcyB0aGUgZ2VuZXJhdGVkIGBicmlkZ2Uuc2NoZW1hLnRzYDogdGhlIHBsdWdpbiBkZXNjcmlwdGlvbiBwbHVzXG4gKiBpdHMgYE9wZXJhdGlvbnNgIGFuZCBgU3RyZWFtc2AgdHlwZXMuIEZyb20gdGhlIGRlc2NyaXB0aW9uIHRoZSBTREsgYnVpbGRzXG4gKiBvbmUgbWV0aG9kIHBlciBkZWNsYXJlZCBhY3Rpb24gYW5kIHN0cmVhbSwgbmVzdGVkIHVuZGVyIHRoZSBzZWdtZW50cyBvZiBpdHNcbiAqIGlkIChgc2l0ZXMuc3VtbWFyeWAgaXMgYHFnaXMuc2l0ZXMuc3VtbWFyeWAsIGBidWZmZXJgIGlzIGBxZ2lzLmJ1ZmZlcmApLFxuICogYW5kIGNoZWNrcyBldmVyeSBhcmd1bWVudCwgcmVwbHkgYW5kIGV2ZW50IGFnYWluc3QgdGhlIGRlY2xhcmVkIHNjaGVtYXNcbiAqIHdpdGggdGhlIHNhbWUgcnVsZXMgdGhlIGhvc3QgYXBwbGllcyAoYHZhbGlkYXRlLnRzYCkuIEZyb20gdGhlIHR5cGVzIGl0IGdpdmVzIHRob3NlXG4gKiBtZXRob2RzIHRoZWlyIHNpZ25hdHVyZXMsIHNvIGEgd3JvbmcgYXJndW1lbnQgc2hhcGUgb3IgYW4gdW5rbm93biBvcGVyYXRpb25cbiAqIGlzIGEgY29tcGlsZSBlcnJvciBhbmQgYSB2YWx1ZSBvdXRzaWRlIHRoZSBzY2hlbWEgYXQgcnVuIHRpbWUgaXMgYVxuICoge0BsaW5rIFFnaXNTZGtDb250cmFjdEVycm9yfS5cbiAqXG4gKiBgaG9zdGAgaXMgdGhlIGN1cmF0ZWQgaG9zdCBzdXJmYWNlIG9mIGRlY2lzaW9uLTI3LCBidWlsdCBvbiB0aGUgc2FtZSBjbGllbnQsXG4gKiBwbHVzIGBncmFudGVkYDogdGhlIGhvc3Qgb3BlcmF0aW9uIGlkcyB0aGUgaGFuZHNoYWtlIGFkdmVydGlzZWQgZm9yIHRoaXNcbiAqIHZpZXcuIEEgY2FsbCBvdXRzaWRlIHRoZSBncmFudHMgaXMgbm90IHJlZnVzZWQgaGVyZSAtIHRoZSBob3N0IHJlZnVzZXMgaXQsXG4gKiBhbmQgdGhlIHBhZ2Ugc2VlcyB0aGUgaG9zdCdzIGBub3RfYXV0aG9yaXplZGAgLSBidXQgYSBwYWdlIGNhbiByZWFkIGBncmFudGVkYFxuICogYWZ0ZXIgYHJlYWR5YCB0byBoaWRlIHdoYXQgaXQgbWF5IG5vdCB1c2UuXG4gKi9cblxuaW1wb3J0IHtcblx0QnJpZGdlQ2xpZW50LFxuXHR0eXBlIEJyaWRnZVN0cmVhbVRlcm1pbmFsLFxuXHR0eXBlIEJyaWRnZVN1YnNjcmlwdGlvbixcblx0dHlwZSBJbnZva2VPcHRpb25zLFxuXHRRZ2lzU2RrQnJpZGdlUHJvdG9jb2xFcnJvcixcblx0dHlwZSBXaXJlVHJhbnNwb3J0LFxufSBmcm9tIFwiLi9icmlkZ2VcIjtcbmltcG9ydCB7XG5cdHR5cGUgQWN0aW9uRGVzY3JpcHRpb24sXG5cdFFnaXNTZGtEZWNsYXJhdGlvbkVycm9yLFxuXHR0eXBlIFN0cmVhbURlc2NyaXB0aW9uLFxufSBmcm9tIFwiLi9kZWNsYXJhdGlvbnNcIjtcbmltcG9ydCB7XG5cdGNyZWF0ZUhvc3QsXG5cdEhPU1RfT1BFUkFUSU9OUyxcblx0dHlwZSBIb3N0T3BlcmF0aW9uSWQsXG5cdHR5cGUgSG9zdE9wZXJhdGlvbnMsXG59IGZyb20gXCIuL2dlbmVyYXRlZC9ob3N0XCI7XG5pbXBvcnQgeyBpc1BsYWluUmVjb3JkIH0gZnJvbSBcIi4vaW50ZXJuYWxcIjtcbmltcG9ydCB0eXBlIHtcblx0QnJpZGdlU2NoZW1hLFxuXHRPcGVyYXRpb25NYXAsXG5cdE9wZXJhdGlvblNoYXBlLFxuXHRTdHJlYW1NYXAsXG5cdFN0cmVhbVNoYXBlLFxufSBmcm9tIFwiLi9zY2hlbWFcIjtcbmltcG9ydCB7IFFnaXNTZGtDb250cmFjdEVycm9yLCB2YWxpZGF0ZUFnYWluc3RTY2hlbWEgfSBmcm9tIFwiLi92YWxpZGF0ZVwiO1xuaW1wb3J0IHsgY3JlYXRlV2ViQ2hhbm5lbFRyYW5zcG9ydCB9IGZyb20gXCIuL3dlYmNoYW5uZWxcIjtcblxuLyoqIE9wdGlvbnMgZm9yIHtAbGluayBRZ2lzU2RrLmZyb21CcmlkZ2VTY2hlbWF9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBRZ2lzU2RrT3B0aW9ucyB7XG5cdC8qKiBBIHRyYW5zcG9ydCB0byBzcGVhayB0aHJvdWdoOyBkZWZhdWx0cyB0byB0aGUgcGFnZSdzIFFXZWJDaGFubmVsLiAqL1xuXHRyZWFkb25seSB0cmFuc3BvcnQ/OiBXaXJlVHJhbnNwb3J0O1xuXHQvKiogQSBjbGllbnQgdGhlIGNhbGxlciBvd25zOyBgY2xvc2UoKWAgbGVhdmVzIGl0IG9wZW4uIEV4Y2x1ZGVzIGB0cmFuc3BvcnRgLiAqL1xuXHRyZWFkb25seSBjbGllbnQ/OiBCcmlkZ2VDbGllbnQ7XG5cdC8qKiBQZXItY2FsbCB0aW1lb3V0IGZvciBhbiBvd25lZCBjbGllbnQuICovXG5cdHJlYWRvbmx5IHRpbWVvdXRNcz86IG51bWJlcjtcblx0LyoqIFRoZSBjaGFubmVsIG9iamVjdCdzIG5hbWUgd2hlbiB0aGUgZGVmYXVsdCB0cmFuc3BvcnQgaXMgdXNlZC4gKi9cblx0cmVhZG9ubHkgY2hhbm5lbE9iamVjdD86IHN0cmluZztcbn1cblxuLyoqIEhhbmRsZXJzIGZvciBhIHR5cGVkIHN0cmVhbTogZXZlbnRzIGFzIGRlY2xhcmVkLCB0aGVuIGV4YWN0bHkgb25lIGVuZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RyZWFtSGFuZGxlcnM8RT4ge1xuXHRyZWFkb25seSBvbkV2ZW50PzogKGV2ZW50OiBFKSA9PiB2b2lkO1xuXHRyZWFkb25seSBvblRlcm1pbmFsPzogKHRlcm1pbmFsOiBCcmlkZ2VTdHJlYW1UZXJtaW5hbCkgPT4gdm9pZDtcbn1cblxuLyoqIEEgbGl2ZSBzdHJlYW0sIGFzIHRoZSBjYWxsZXIgaG9sZHMgaXQuICovXG5leHBvcnQgdHlwZSBTdHJlYW1IYW5kbGUgPSBCcmlkZ2VTdWJzY3JpcHRpb247XG5cbi8qKiBUaGUgbWV0aG9kIG9uZSBkZWNsYXJlZCBhY3Rpb24gYmVjb21lczsgYW4gZW1wdHkgcmVxdWVzdCBtYXkgYmUgb21pdHRlZC4gKi9cbmV4cG9ydCB0eXBlIE9wZXJhdGlvbk1ldGhvZDxPcCBleHRlbmRzIE9wZXJhdGlvblNoYXBlPiA9XG5cdC8vIGJpb21lLWlnbm9yZSBsaW50L2NvbXBsZXhpdHkvbm9CYW5uZWRUeXBlczogYHt9YCBpcyB0aGUgdGVzdCBmb3IgXCJub3RoaW5nIHJlcXVpcmVkXCJcblx0e30gZXh0ZW5kcyBPcFtcInJlcXVlc3RcIl1cblx0XHQ/IChcblx0XHRcdFx0cmVxdWVzdD86IE9wW1wicmVxdWVzdFwiXSxcblx0XHRcdFx0b3B0aW9ucz86IEludm9rZU9wdGlvbnMsXG5cdFx0XHQpID0+IFByb21pc2U8T3BbXCJyZXN1bHRcIl0+XG5cdFx0OiAoXG5cdFx0XHRcdHJlcXVlc3Q6IE9wW1wicmVxdWVzdFwiXSxcblx0XHRcdFx0b3B0aW9ucz86IEludm9rZU9wdGlvbnMsXG5cdFx0XHQpID0+IFByb21pc2U8T3BbXCJyZXN1bHRcIl0+O1xuXG4vKiogVGhlIG1ldGhvZCBvbmUgZGVjbGFyZWQgc3RyZWFtIGJlY29tZXMuICovXG5leHBvcnQgdHlwZSBTdHJlYW1NZXRob2Q8U3QgZXh0ZW5kcyBTdHJlYW1TaGFwZT4gPSAoXG5cdHJlcXVlc3Q6IFN0W1wicmVxdWVzdFwiXSxcblx0aGFuZGxlcnM6IFN0cmVhbUhhbmRsZXJzPFN0W1wiZXZlbnRcIl0+LFxuXHRvcHRpb25zPzogSW52b2tlT3B0aW9ucyxcbikgPT4gUHJvbWlzZTxTdHJlYW1IYW5kbGU+O1xuXG4vKipcbiAqIFRoZSBydW5uaW5nIHBhbGV0dGUsIHdoZW4gdGhlIGhhbmRzaGFrZSBjYXJyaWVkIG9uZSAoZGVjaXNpb24tMTYpOiB0aGVcbiAqIGBRUGFsZXR0ZWAgY29sb3VyIHJvbGVzIHRoZSBob3N0IHJlYWQsIGFzIENTUyBoZXggKGAjcnJnZ2JiYCBvclxuICogYCNycmdnYmJhYWApIGJ5IHRoZWlyIGNhbWVsLWNhc2VkIHJvbGUgbmFtZSwgYW5kIHdoZXRoZXIgdGhlIHdpbmRvdyBjb2xvdXJcbiAqIGlzIGRhcmsuIGBxZ2lzLXNkay11aWAgdHVybnMgaXQgaW50byB0aGUgYC0tcWdpcy1zZGstKmAgY3VzdG9tIHByb3BlcnRpZXM7XG4gKiBhIHBhZ2Ugb3V0c2lkZSBRR0lTIHNlZXMgYG51bGxgIGFuZCBrZWVwcyB0aGUgZG9jdW1lbnRlZCBkZWZhdWx0cy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBRZ2lzU2RrSG9zdFRoZW1lIHtcblx0cmVhZG9ubHkgcGFsZXR0ZTogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nPj47XG5cdHJlYWRvbmx5IGRhcms6IGJvb2xlYW47XG59XG5cbi8qKiBXaGF0IHRoZSBoYW5kc2hha2UgdG9sZCB0aGlzIHBhZ2UgYWJvdXQgdGhlIGhvc3QgKGRlY2lzaW9uLTI3KS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUWdpc1Nka0hvc3QgZXh0ZW5kcyBIb3N0T3BlcmF0aW9ucyB7XG5cdC8qKlxuXHQgKiBUaGUgaG9zdCBvcGVyYXRpb24gaWRzIHRoZSBoYW5kc2hha2UgYWR2ZXJ0aXNlZCBmb3IgdGhpcyB2aWV3OyBlbXB0eVxuXHQgKiB1bnRpbCB7QGxpbmsgUWdpc1Nka0NvcmUucmVhZHl9IGhhcyByZXNvbHZlZC5cblx0ICovXG5cdHJlYWRvbmx5IGdyYW50ZWQ6IHJlYWRvbmx5IEhvc3RPcGVyYXRpb25JZFtdO1xuXHQvKipcblx0ICogVGhlIGhvc3QncyBwYWxldHRlLCBgbnVsbGAgdW50aWwge0BsaW5rIFFnaXNTZGtDb3JlLnJlYWR5fSBoYXMgcmVzb2x2ZWRcblx0ICogYW5kIHdoZW4gdGhlIGhvc3Qgc2VudCBub25lLlxuXHQgKi9cblx0cmVhZG9ubHkgdGhlbWU6IFFnaXNTZGtIb3N0VGhlbWUgfCBudWxsO1xufVxuXG4vKiogVGhlIG1lbWJlcnMgZXZlcnkgYFFnaXNTZGtgIGhhcywgd2hhdGV2ZXIgaXRzIHNjaGVtYSBkZWNsYXJlcy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUWdpc1Nka0NvcmU8TyA9IE9wZXJhdGlvbk1hcCwgUyA9IFN0cmVhbU1hcD4ge1xuXHQvKiogVGhlIHNjaGVtYSB0aGlzIGluc3RhbmNlIHdhcyBidWlsdCBmcm9tLiAqL1xuXHRyZWFkb25seSBzY2hlbWE6IEJyaWRnZVNjaGVtYTxPLCBTPjtcblx0LyoqIFRoZSBjbGllbnQgdW5kZXIgdGhlIG1ldGhvZHMsIGZvciB3aGF0IGEgbWV0aG9kIGRvZXMgbm90IGNvdmVyLiAqL1xuXHRyZWFkb25seSBjbGllbnQ6IEJyaWRnZUNsaWVudDtcblx0LyoqIFRoZSBjdXJhdGVkIGhvc3Qgc3VyZmFjZSwgYW5kIHdoYXQgdGhpcyB2aWV3IHdhcyBncmFudGVkIG9mIGl0LiAqL1xuXHRyZWFkb25seSBob3N0OiBRZ2lzU2RrSG9zdDtcblx0LyoqIFJlc29sdmVzIG9uY2UgdGhlIGhhbmRzaGFrZSBhbnN3ZXJlZDsgcmVqZWN0cyB3aGVuIHRoZSBob3N0IHJlZnVzZWQgaXQuICovXG5cdHJlYWRvbmx5IHJlYWR5OiBQcm9taXNlPHZvaWQ+O1xuXHQvKiogQ2xvc2UgYW4gb3duZWQgY2xpZW50OyBhIGNsaWVudCB0aGUgY2FsbGVyIHBhc3NlZCBpbiBpcyBsZWZ0IGFsb25lLiAqL1xuXHRjbG9zZSgpOiB2b2lkO1xufVxuXG4vKiogVGhlIGZpcnN0IHNlZ21lbnQgb2YgYSBkb3R0ZWQgaWQsIG9yIHRoZSB3aG9sZSBpZCB3aGVuIGl0IGhhcyBub25lLiAqL1xudHlwZSBIZWFkPEsgZXh0ZW5kcyBzdHJpbmc+ID0gSyBleHRlbmRzIGAke2luZmVyIEh9LiR7c3RyaW5nfWAgPyBIIDogSztcblxuLyoqIFRoZSBtZW1iZXJzIG9mIGBNYCB1bmRlciBvbmUgaGVhZCwga2V5ZWQgYnkgdGhlIHJlc3Qgb2YgdGhlaXIgaWRzLiAqL1xudHlwZSBVbmRlcjxNLCBIIGV4dGVuZHMgc3RyaW5nPiA9IHtcblx0W0sgaW4ga2V5b2YgTSAmIHN0cmluZyBhcyBLIGV4dGVuZHMgYCR7SH0uJHtpbmZlciBSZXN0fWBcblx0XHQ/IFJlc3Rcblx0XHQ6IG5ldmVyXTogTVtLXTtcbn07XG5cbi8qKlxuICogVGhlIGRlY2xhcmVkIGFjdGlvbnMgYXMgYSB0cmVlOiBhIHBsYWluIGlkIGlzIGEgbWV0aG9kLCBhIGRvdHRlZCBpZCBuZXN0c1xuICogb25lIG9iamVjdCBwZXIgc2VnbWVudC4gQW4gaWQgdGhhdCBpcyBib3RoIGEgbGVhZiBhbmQgYSBwcmVmaXggb2YgYW5vdGhlclxuICogaXMgcmVmdXNlZCBhdCBydW4gdGltZSwgc28gdGhlIHR5cGUgbmVlZCBub3Qgc2F5IHdoYXQgaXQgd291bGQgbWVhbi5cbiAqL1xuZXhwb3J0IHR5cGUgT3BlcmF0aW9uVHJlZTxPPiA9IHtcblx0cmVhZG9ubHkgW0ggaW4gSGVhZDxrZXlvZiBPICYgc3RyaW5nPl06IEggZXh0ZW5kcyBrZXlvZiBPXG5cdFx0PyBPW0hdIGV4dGVuZHMgT3BlcmF0aW9uU2hhcGVcblx0XHRcdD8gT3BlcmF0aW9uTWV0aG9kPE9bSF0+XG5cdFx0XHQ6IG5ldmVyXG5cdFx0OiBPcGVyYXRpb25UcmVlPFVuZGVyPE8sIEg+Pjtcbn07XG5cbi8qKiBUaGUgZGVjbGFyZWQgc3RyZWFtcyBhcyB0aGUgc2FtZSB0cmVlLCB3aXRoIGEgc3RyZWFtIG1ldGhvZCBhdCBlYWNoIGxlYWYuICovXG5leHBvcnQgdHlwZSBTdHJlYW1UcmVlPFM+ID0ge1xuXHRyZWFkb25seSBbSCBpbiBIZWFkPGtleW9mIFMgJiBzdHJpbmc+XTogSCBleHRlbmRzIGtleW9mIFNcblx0XHQ/IFNbSF0gZXh0ZW5kcyBTdHJlYW1TaGFwZVxuXHRcdFx0PyBTdHJlYW1NZXRob2Q8U1tIXT5cblx0XHRcdDogbmV2ZXJcblx0XHQ6IFN0cmVhbVRyZWU8VW5kZXI8UywgSD4+O1xufTtcblxuLyoqXG4gKiBBIHBhZ2UncyBoYW5kbGUgb24gUUdJUzogdGhlIGNvcmUsIHBsdXMgb25lIG1ldGhvZCBwZXIgZGVjbGFyZWQgb3BlcmF0aW9uXG4gKiBuZXN0ZWQgdW5kZXIgdGhlIHNlZ21lbnRzIG9mIGl0cyBpZC5cbiAqL1xuZXhwb3J0IHR5cGUgUWdpc1NkazxPID0gT3BlcmF0aW9uTWFwLCBTID0gU3RyZWFtTWFwPiA9IFFnaXNTZGtDb3JlPE8sIFM+ICZcblx0T3BlcmF0aW9uVHJlZTxPPiAmXG5cdFN0cmVhbVRyZWU8Uz47XG5cbi8qKiBOYW1lcyB7QGxpbmsgUWdpc1Nka0NvcmV9IGtlZXBzOyBhIGRlY2xhcmVkIGlkIG1heSBub3Qgc3RhcnQgd2l0aCBvbmUuICovXG5leHBvcnQgY29uc3QgUUdJU19TREtfTUVNQkVSUzogcmVhZG9ubHkgc3RyaW5nW10gPSBPYmplY3QuZnJlZXplKFtcblx0XCJjbGllbnRcIixcblx0XCJob3N0XCIsXG5cdFwic2NoZW1hXCIsXG5cdFwicmVhZHlcIixcblx0XCJjbG9zZVwiLFxuXSk7XG5cbmNvbnN0IEhPU1RfSURTOiBSZWFkb25seVNldDxzdHJpbmc+ID0gbmV3IFNldDxzdHJpbmc+KEhPU1RfT1BFUkFUSU9OUyk7XG5cbi8qKiBUaGUgaGFuZHNoYWtlLCBhcyBmYXIgYXMgdGhpcyBtb2R1bGUgcmVhZHMgaXQuICovXG5pbnRlcmZhY2UgSGFuZHNoYWtlIHtcblx0cmVhZG9ubHkgb3BlcmF0aW9uczogcmVhZG9ubHkgc3RyaW5nW107XG5cdHJlYWRvbmx5IGdyYW50ZWQ6IHJlYWRvbmx5IEhvc3RPcGVyYXRpb25JZFtdO1xuXHRyZWFkb25seSB0aGVtZTogUWdpc1Nka0hvc3RUaGVtZSB8IG51bGw7XG59XG5cbmZ1bmN0aW9uIHBhcnNlSGFuZHNoYWtlKHZhbHVlOiB1bmtub3duKTogSGFuZHNoYWtlIHtcblx0aWYgKCFpc1BsYWluUmVjb3JkKHZhbHVlKSB8fCAhQXJyYXkuaXNBcnJheSh2YWx1ZS5vcGVyYXRpb25zKSkge1xuXHRcdHRocm93IG5ldyBRZ2lzU2RrQnJpZGdlUHJvdG9jb2xFcnJvcihcblx0XHRcdFwiVGhlIGhhbmRzaGFrZSByZXBseSBjYXJyaWVzIG5vIG9wZXJhdGlvbnMgbGlzdFwiLFxuXHRcdCk7XG5cdH1cblx0Y29uc3Qgb3BlcmF0aW9uczogc3RyaW5nW10gPSBbXTtcblx0Zm9yIChjb25zdCBvcGVyYXRpb24gb2YgdmFsdWUub3BlcmF0aW9ucykge1xuXHRcdGlmIChpc1BsYWluUmVjb3JkKG9wZXJhdGlvbikgJiYgdHlwZW9mIG9wZXJhdGlvbi5pZCA9PT0gXCJzdHJpbmdcIikge1xuXHRcdFx0b3BlcmF0aW9ucy5wdXNoKG9wZXJhdGlvbi5pZCk7XG5cdFx0fVxuXHR9XG5cdHJldHVybiB7XG5cdFx0b3BlcmF0aW9ucyxcblx0XHRncmFudGVkOiBPYmplY3QuZnJlZXplKFxuXHRcdFx0b3BlcmF0aW9ucy5maWx0ZXIoKGlkKTogaWQgaXMgSG9zdE9wZXJhdGlvbklkID0+IEhPU1RfSURTLmhhcyhpZCkpLFxuXHRcdCksXG5cdFx0dGhlbWU6IHBhcnNlVGhlbWUodmFsdWUudGhlbWUpLFxuXHR9O1xufVxuXG4vKipcbiAqIFRoZSBgdGhlbWVgIG9mIGEgaGFuZHNoYWtlLCBvciBgbnVsbGAgd2hlbiBhYnNlbnQgb3IgbWFsZm9ybWVkOiBhIHBhbGV0dGVcbiAqIHRoYXQgY2Fubm90IGJlIHJlYWQgaXMgbm8gcmVhc29uIHRvIHJlZnVzZSB0aGUgaG9zdCwgdGhlIHBhZ2UganVzdCBrZWVwc1xuICogaXRzIGRlZmF1bHRzLiBPbmx5IHN0cmluZyBjb2xvdXJzIGFyZSBrZXB0LlxuICovXG5mdW5jdGlvbiBwYXJzZVRoZW1lKHZhbHVlOiB1bmtub3duKTogUWdpc1Nka0hvc3RUaGVtZSB8IG51bGwge1xuXHRpZiAoIWlzUGxhaW5SZWNvcmQodmFsdWUpIHx8ICFpc1BsYWluUmVjb3JkKHZhbHVlLnBhbGV0dGUpKSB7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblx0Y29uc3QgcGFsZXR0ZTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXHRmb3IgKGNvbnN0IFtyb2xlLCBjb2xvdXJdIG9mIE9iamVjdC5lbnRyaWVzKHZhbHVlLnBhbGV0dGUpKSB7XG5cdFx0aWYgKHR5cGVvZiBjb2xvdXIgPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdHBhbGV0dGVbcm9sZV0gPSBjb2xvdXI7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBPYmplY3QuZnJlZXplKHtcblx0XHRwYWxldHRlOiBPYmplY3QuZnJlZXplKHBhbGV0dGUpLFxuXHRcdGRhcms6IHZhbHVlLmRhcmsgPT09IHRydWUsXG5cdH0pO1xufVxuXG5mdW5jdGlvbiB1bndyYXBSZXF1ZXN0KFxuXHRvcGVyYXRpb246IHN0cmluZyxcblx0cmVxdWVzdDogdW5rbm93bixcbik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcblx0aWYgKHJlcXVlc3QgPT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiB7fTtcblx0fVxuXHRpZiAoIWlzUGxhaW5SZWNvcmQocmVxdWVzdCkpIHtcblx0XHR0aHJvdyBuZXcgUWdpc1Nka0NvbnRyYWN0RXJyb3Iob3BlcmF0aW9uLCBcInJlcXVlc3RcIiwgW1xuXHRcdFx0Li4udmFsaWRhdGVBZ2FpbnN0U2NoZW1hKHJlcXVlc3QsIHsgdHlwZTogXCJvYmplY3RcIiB9KSxcblx0XHRdKTtcblx0fVxuXHRyZXR1cm4gcmVxdWVzdDtcbn1cblxuZnVuY3Rpb24gY2hlY2tlZFJlcXVlc3QoXG5cdGRlc2NyaXB0aW9uOiBBY3Rpb25EZXNjcmlwdGlvbiB8IFN0cmVhbURlc2NyaXB0aW9uLFxuXHRyZXF1ZXN0OiB1bmtub3duLFxuKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuXHRjb25zdCBwYXlsb2FkID0gdW53cmFwUmVxdWVzdChkZXNjcmlwdGlvbi5pZCwgcmVxdWVzdCk7XG5cdGNvbnN0IGlzc3VlcyA9IHZhbGlkYXRlQWdhaW5zdFNjaGVtYShwYXlsb2FkLCBkZXNjcmlwdGlvbi5yZXF1ZXN0KTtcblx0aWYgKGlzc3Vlcy5sZW5ndGggPiAwKSB7XG5cdFx0dGhyb3cgbmV3IFFnaXNTZGtDb250cmFjdEVycm9yKGRlc2NyaXB0aW9uLmlkLCBcInJlcXVlc3RcIiwgaXNzdWVzKTtcblx0fVxuXHRyZXR1cm4gcGF5bG9hZDtcbn1cblxuZnVuY3Rpb24gb3BlcmF0aW9uTWV0aG9kKFxuXHRjbGllbnQ6IEJyaWRnZUNsaWVudCxcblx0YWN0aW9uOiBBY3Rpb25EZXNjcmlwdGlvbixcbik6IChyZXF1ZXN0PzogdW5rbm93biwgb3B0aW9ucz86IEludm9rZU9wdGlvbnMpID0+IFByb21pc2U8dW5rbm93bj4ge1xuXHRyZXR1cm4gYXN5bmMgKHJlcXVlc3QsIG9wdGlvbnMpID0+IHtcblx0XHRjb25zdCBwYXlsb2FkID0gY2hlY2tlZFJlcXVlc3QoYWN0aW9uLCByZXF1ZXN0KTtcblx0XHRjb25zdCB2YWx1ZSA9IGF3YWl0IGNsaWVudC5pbnZva2UoYWN0aW9uLmlkLCBwYXlsb2FkLCBvcHRpb25zKTtcblx0XHRjb25zdCBpc3N1ZXMgPSB2YWxpZGF0ZUFnYWluc3RTY2hlbWEodmFsdWUsIGFjdGlvbi5yZXN1bHQsIHtcblx0XHRcdGFsbG93VW5rbm93bjogdHJ1ZSxcblx0XHR9KTtcblx0XHRpZiAoaXNzdWVzLmxlbmd0aCA+IDApIHtcblx0XHRcdHRocm93IG5ldyBRZ2lzU2RrQ29udHJhY3RFcnJvcihhY3Rpb24uaWQsIFwicmVzdWx0XCIsIGlzc3Vlcyk7XG5cdFx0fVxuXHRcdHJldHVybiB2YWx1ZTtcblx0fTtcbn1cblxuZnVuY3Rpb24gc3RyZWFtTWV0aG9kKFxuXHRjbGllbnQ6IEJyaWRnZUNsaWVudCxcblx0c3RyZWFtOiBTdHJlYW1EZXNjcmlwdGlvbixcbik6IChcblx0cmVxdWVzdDogdW5rbm93bixcblx0aGFuZGxlcnM6IFN0cmVhbUhhbmRsZXJzPHVua25vd24+LFxuXHRvcHRpb25zPzogSW52b2tlT3B0aW9ucyxcbikgPT4gUHJvbWlzZTxTdHJlYW1IYW5kbGU+IHtcblx0cmV0dXJuIGFzeW5jIChyZXF1ZXN0LCBoYW5kbGVycywgb3B0aW9ucykgPT4ge1xuXHRcdGNvbnN0IHBheWxvYWQgPSBjaGVja2VkUmVxdWVzdChzdHJlYW0sIHJlcXVlc3QpO1xuXHRcdC8vIFRoZSB0eXBlZCBzdHJlYW0gZW5kcyBleGFjdGx5IG9uY2UsIGxpa2UgdGhlIHN1YnNjcmlwdGlvbiB1bmRlciBpdDogYVxuXHRcdC8vIGNvbnRyYWN0IHZpb2xhdGlvbiBlbmRzIGl0IGhlcmUsIGNsb3NlcyB0aGUgc3Vic2NyaXB0aW9uLCBhbmQgdGhlXG5cdFx0Ly8gYGRpc3Bvc2VkYCB0aGUgY2xpZW50IHRoZW4gcmVwb3J0cyBpcyBub3QgZGVsaXZlcmVkIGEgc2Vjb25kIHRpbWUuXG5cdFx0bGV0IGVuZGVkID0gZmFsc2U7XG5cdFx0bGV0IHZpb2xhdGVkID0gZmFsc2U7XG5cdFx0bGV0IGhhbmRsZTogU3RyZWFtSGFuZGxlIHwgbnVsbCA9IG51bGw7XG5cdFx0Y29uc3QgZW5kID0gKHRlcm1pbmFsOiBCcmlkZ2VTdHJlYW1UZXJtaW5hbCk6IHZvaWQgPT4ge1xuXHRcdFx0aWYgKGVuZGVkKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGVuZGVkID0gdHJ1ZTtcblx0XHRcdGhhbmRsZXJzLm9uVGVybWluYWw/Lih0ZXJtaW5hbCk7XG5cdFx0fTtcblx0XHRoYW5kbGUgPSBhd2FpdCBjbGllbnQuc3Vic2NyaWJlKFxuXHRcdFx0c3RyZWFtLmlkLFxuXHRcdFx0cGF5bG9hZCxcblx0XHRcdHtcblx0XHRcdFx0b25FdmVudDogKGV2ZW50KSA9PiB7XG5cdFx0XHRcdFx0aWYgKGVuZGVkKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGNvbnN0IGRlY2xhcmVkID0gc3RyZWFtLmV2ZW50c1tldmVudC5raW5kXTtcblx0XHRcdFx0XHRjb25zdCBpc3N1ZXMgPVxuXHRcdFx0XHRcdFx0ZGVjbGFyZWQgPT09IHVuZGVmaW5lZFxuXHRcdFx0XHRcdFx0XHQ/IHVuZGVmaW5lZFxuXHRcdFx0XHRcdFx0XHQ6IHZhbGlkYXRlQWdhaW5zdFNjaGVtYShldmVudC5wYXlsb2FkLCBkZWNsYXJlZCwge1xuXHRcdFx0XHRcdFx0XHRcdFx0YWxsb3dVbmtub3duOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRcdFx0cGF0aDogW1wicGF5bG9hZFwiXSxcblx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRpZiAoaXNzdWVzICE9PSB1bmRlZmluZWQgJiYgaXNzdWVzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHRcdFx0aGFuZGxlcnMub25FdmVudD8uKGV2ZW50KTtcblx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Y29uc3QgZXJyb3IgPSBuZXcgUWdpc1Nka0NvbnRyYWN0RXJyb3IoXG5cdFx0XHRcdFx0XHRzdHJlYW0uaWQsXG5cdFx0XHRcdFx0XHRcImV2ZW50XCIsXG5cdFx0XHRcdFx0XHRpc3N1ZXMgPz8gW10sXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRlbmQoeyBraW5kOiBcImVycm9yXCIsIG1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UgfSk7XG5cdFx0XHRcdFx0aWYgKGhhbmRsZSA9PT0gbnVsbCkge1xuXHRcdFx0XHRcdFx0dmlvbGF0ZWQgPSB0cnVlO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRoYW5kbGUuY2xvc2UoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sXG5cdFx0XHRcdG9uVGVybWluYWw6IGVuZCxcblx0XHRcdH0sXG5cdFx0XHRvcHRpb25zLFxuXHRcdCk7XG5cdFx0aWYgKHZpb2xhdGVkKSB7XG5cdFx0XHRoYW5kbGUuY2xvc2UoKTtcblx0XHR9XG5cdFx0cmV0dXJuIGhhbmRsZTtcblx0fTtcbn1cblxuZnVuY3Rpb24gYnVpbGRIb3N0KFxuXHRjbGllbnQ6IEJyaWRnZUNsaWVudCxcblx0aGFuZHNoYWtlOiAoKSA9PiBIYW5kc2hha2UgfCBudWxsLFxuKTogUWdpc1Nka0hvc3Qge1xuXHRjb25zdCBob3N0ID0gY3JlYXRlSG9zdChjbGllbnQpO1xuXHRyZXR1cm4gT2JqZWN0LmZyZWV6ZSh7XG5cdFx0Li4uaG9zdCxcblx0XHRnZXQgZ3JhbnRlZCgpOiByZWFkb25seSBIb3N0T3BlcmF0aW9uSWRbXSB7XG5cdFx0XHRyZXR1cm4gZ3JhbnRlZChoYW5kc2hha2UoKSk7XG5cdFx0fSxcblx0XHRnZXQgdGhlbWUoKTogUWdpc1Nka0hvc3RUaGVtZSB8IG51bGwge1xuXHRcdFx0cmV0dXJuIGhhbmRzaGFrZSgpPy50aGVtZSA/PyBudWxsO1xuXHRcdH0sXG5cdH0pO1xufVxuXG5jb25zdCBOT19HUkFOVFM6IHJlYWRvbmx5IEhvc3RPcGVyYXRpb25JZFtdID0gT2JqZWN0LmZyZWV6ZShbXSk7XG5cbmZ1bmN0aW9uIGdyYW50ZWQoaGFuZHNoYWtlOiBIYW5kc2hha2UgfCBudWxsKTogcmVhZG9ubHkgSG9zdE9wZXJhdGlvbklkW10ge1xuXHRyZXR1cm4gaGFuZHNoYWtlID09PSBudWxsID8gTk9fR1JBTlRTIDogaGFuZHNoYWtlLmdyYW50ZWQ7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkPE8sIFM+KFxuXHRzY2hlbWE6IEJyaWRnZVNjaGVtYTxPLCBTPixcblx0b3B0aW9uczogUWdpc1Nka09wdGlvbnMsXG4pOiBRZ2lzU2RrPE8sIFM+IHtcblx0aWYgKG9wdGlvbnMuY2xpZW50ICE9PSB1bmRlZmluZWQgJiYgb3B0aW9ucy50cmFuc3BvcnQgIT09IHVuZGVmaW5lZCkge1xuXHRcdHRocm93IG5ldyBRZ2lzU2RrRGVjbGFyYXRpb25FcnJvcihcblx0XHRcdFwiUWdpc1Nkay5mcm9tQnJpZGdlU2NoZW1hIHRha2VzIGEgY2xpZW50IG9yIGEgdHJhbnNwb3J0LCBub3QgYm90aFwiLFxuXHRcdCk7XG5cdH1cblx0Y29uc3Qgb3duZWQgPSBvcHRpb25zLmNsaWVudCA9PT0gdW5kZWZpbmVkO1xuXHRjb25zdCB0cmFuc3BvcnQgPVxuXHRcdG9wdGlvbnMudHJhbnNwb3J0ID8/XG5cdFx0KG9wdGlvbnMuY2xpZW50ID09PSB1bmRlZmluZWRcblx0XHRcdD8gY3JlYXRlV2ViQ2hhbm5lbFRyYW5zcG9ydChvcHRpb25zLmNoYW5uZWxPYmplY3QgPz8gXCJicmlkZ2VcIilcblx0XHRcdDogdW5kZWZpbmVkKTtcblx0Y29uc3QgY2xpZW50ID1cblx0XHRvcHRpb25zLmNsaWVudCA/P1xuXHRcdG5ldyBCcmlkZ2VDbGllbnQoXG5cdFx0XHR0cmFuc3BvcnQgYXMgV2lyZVRyYW5zcG9ydCxcblx0XHRcdG9wdGlvbnMudGltZW91dE1zID09PSB1bmRlZmluZWQgPyB7fSA6IHsgdGltZW91dE1zOiBvcHRpb25zLnRpbWVvdXRNcyB9LFxuXHRcdCk7XG5cdGxldCBoYW5kc2hha2U6IEhhbmRzaGFrZSB8IG51bGwgPSBudWxsO1xuXHRjb25zdCByZWFkeSA9IGNsaWVudC5oYW5kc2hha2UoKS50aGVuKCh2YWx1ZSkgPT4ge1xuXHRcdGhhbmRzaGFrZSA9IHBhcnNlSGFuZHNoYWtlKHZhbHVlKTtcblx0fSk7XG5cdC8vIEEgcGFnZSB0aGF0IG5ldmVyIGF3YWl0cyBgcmVhZHlgIHN0aWxsIHNlZXMgZXZlcnkgY2FsbCBmYWlsIG9uIGl0cyBvd247XG5cdC8vIHRoZSByZWplY3Rpb24gaXMgbm90IGxlZnQgdW5vYnNlcnZlZCBvbiB0b3Agb2YgdGhhdC5cblx0cmVhZHkuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcblx0Y29uc3QgbWVtYmVyczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7XG5cdFx0c2NoZW1hLFxuXHRcdGNsaWVudCxcblx0XHRob3N0OiBidWlsZEhvc3QoY2xpZW50LCAoKSA9PiBoYW5kc2hha2UpLFxuXHRcdHJlYWR5LFxuXHRcdGNsb3NlOiAoKTogdm9pZCA9PiB7XG5cdFx0XHRpZiAob3duZWQpIHtcblx0XHRcdFx0Y2xpZW50LmNsb3NlKCk7XG5cdFx0XHR9XG5cdFx0fSxcblx0fTtcblx0Y29uc3QgbmFtZXNwYWNlczogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSA9IFtdO1xuXHRmb3IgKGNvbnN0IGFjdGlvbiBvZiBzY2hlbWEuYWN0aW9ucykge1xuXHRcdHBsYWNlKG1lbWJlcnMsIG5hbWVzcGFjZXMsIGFjdGlvbi5pZCwgb3BlcmF0aW9uTWV0aG9kKGNsaWVudCwgYWN0aW9uKSk7XG5cdH1cblx0Zm9yIChjb25zdCBzdHJlYW0gb2Ygc2NoZW1hLnN0cmVhbXMpIHtcblx0XHRwbGFjZShtZW1iZXJzLCBuYW1lc3BhY2VzLCBzdHJlYW0uaWQsIHN0cmVhbU1ldGhvZChjbGllbnQsIHN0cmVhbSkpO1xuXHR9XG5cdGZvciAoY29uc3QgbmFtZXNwYWNlIG9mIG5hbWVzcGFjZXMpIHtcblx0XHRPYmplY3QuZnJlZXplKG5hbWVzcGFjZSk7XG5cdH1cblx0cmV0dXJuIE9iamVjdC5mcmVlemUobWVtYmVycykgYXMgdW5rbm93biBhcyBRZ2lzU2RrPE8sIFM+O1xufVxuXG4vKipcbiAqIFB1dCBvbmUgbWV0aG9kIHdoZXJlIGl0cyBpZCBzYXlzOiBgYS5iLmNgIGJlY29tZXMgYG1lbWJlcnMuYS5iLmNgLCBidWlsZGluZ1xuICogdGhlIG9iamVjdHMgb24gdGhlIHdheS4gVHdvIGlkcyBjYW5ub3QgYm90aCBiZSBob25lc3Qgd2hlbiBvbmUgaXMgYSBwcmVmaXhcbiAqIG9mIHRoZSBvdGhlciAtIGBzaXRlc2AgY2Fubm90IGJlIGEgbWV0aG9kIGFuZCBob2xkIGBzaXRlcy5zdW1tYXJ5YCAtIGFuZCBhXG4gKiBmaXJzdCBzZWdtZW50IHRoYXQgaXMgYSBjb3JlIG1lbWJlciB3b3VsZCBoaWRlIGl0LCBzbyBib3RoIGFyZSByZWZ1c2VkLlxuICovXG5mdW5jdGlvbiBwbGFjZShcblx0bWVtYmVyczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG5cdG5hbWVzcGFjZXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+W10sXG5cdGlkOiBzdHJpbmcsXG5cdG1ldGhvZDogdW5rbm93bixcbik6IHZvaWQge1xuXHRjb25zdCBzZWdtZW50cyA9IGlkLnNwbGl0KFwiLlwiKTtcblx0aWYgKHNlZ21lbnRzLnNvbWUoKHNlZ21lbnQpID0+IHNlZ21lbnQgPT09IFwiXCIpKSB7XG5cdFx0dGhyb3cgbmV3IFFnaXNTZGtEZWNsYXJhdGlvbkVycm9yKFxuXHRcdFx0YCR7aWR9OiBhbiBvcGVyYXRpb24gaWQgbWF5IG5vdCBoYXZlIGFuIGVtcHR5IHNlZ21lbnRgLFxuXHRcdCk7XG5cdH1cblx0Y29uc3QgaGVhZCA9IHNlZ21lbnRzWzBdIGFzIHN0cmluZztcblx0aWYgKFFHSVNfU0RLX01FTUJFUlMuaW5jbHVkZXMoaGVhZCkpIHtcblx0XHR0aHJvdyBuZXcgUWdpc1Nka0RlY2xhcmF0aW9uRXJyb3IoXG5cdFx0XHRgJHtpZH06IGFuIG9wZXJhdGlvbiBpZCBtYXkgbm90IHN0YXJ0IHdpdGggYSBRZ2lzU2RrIG1lbWJlciAoJHtRR0lTX1NES19NRU1CRVJTLmpvaW4oXCIsIFwiKX0pYCxcblx0XHQpO1xuXHR9XG5cdGxldCBub2RlID0gbWVtYmVycztcblx0Zm9yIChjb25zdCBbaW5kZXgsIHNlZ21lbnRdIG9mIHNlZ21lbnRzLmVudHJpZXMoKSkge1xuXHRcdGNvbnN0IHByZWZpeCA9IHNlZ21lbnRzLnNsaWNlKDAsIGluZGV4ICsgMSkuam9pbihcIi5cIik7XG5cdFx0Y29uc3QgZXhpc3RpbmcgPSBub2RlW3NlZ21lbnRdO1xuXHRcdGlmIChpbmRleCA9PT0gc2VnbWVudHMubGVuZ3RoIC0gMSkge1xuXHRcdFx0aWYgKGV4aXN0aW5nICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0dGhyb3cgbmV3IFFnaXNTZGtEZWNsYXJhdGlvbkVycm9yKFxuXHRcdFx0XHRcdHR5cGVvZiBleGlzdGluZyA9PT0gXCJmdW5jdGlvblwiXG5cdFx0XHRcdFx0XHQ/IGAke2lkfTogZHVwbGljYXRlIG9wZXJhdGlvbiBpZGBcblx0XHRcdFx0XHRcdDogYCR7aWR9OiBhbiBvcGVyYXRpb24gaWQgbWF5IG5vdCBiZSBhIHByZWZpeCBvZiBhbm90aGVyIGRlY2xhcmVkIGlkYCxcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHRcdG5vZGVbc2VnbWVudF0gPSBtZXRob2Q7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGlmIChleGlzdGluZyA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRjb25zdCBuYW1lc3BhY2U6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG5cdFx0XHRuYW1lc3BhY2VzLnB1c2gobmFtZXNwYWNlKTtcblx0XHRcdG5vZGVbc2VnbWVudF0gPSBuYW1lc3BhY2U7XG5cdFx0XHRub2RlID0gbmFtZXNwYWNlO1xuXHRcdH0gZWxzZSBpZiAodHlwZW9mIGV4aXN0aW5nID09PSBcImZ1bmN0aW9uXCIpIHtcblx0XHRcdHRocm93IG5ldyBRZ2lzU2RrRGVjbGFyYXRpb25FcnJvcihcblx0XHRcdFx0YCR7aWR9OiAke3ByZWZpeH0gaXMgYWxyZWFkeSBhbiBvcGVyYXRpb24gaWQ7IGFuIGlkIG1heSBub3QgZXh0ZW5kIGFub3RoZXJgLFxuXHRcdFx0KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bm9kZSA9IGV4aXN0aW5nIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXHRcdH1cblx0fVxufVxuXG4vKipcbiAqIFRoZSBlbnRyeSBwb2ludDogYFFnaXNTZGsuZnJvbUJyaWRnZVNjaGVtYShzY2hlbWEpYC5cbiAqXG4gKiBBIG5hbWVzcGFjZSByYXRoZXIgdGhhbiBhIGNvbnN0YW50IHNvIHRoZSB2YWx1ZSBhbmQgdGhlIGluc3RhbmNlIHR5cGUgc2hhcmVcbiAqIG9uZSBuYW1lIHRocm91Z2ggZXZlcnkgZGVjbGFyYXRpb24gYnVuZGxlci5cbiAqL1xuZXhwb3J0IG5hbWVzcGFjZSBRZ2lzU2RrIHtcblx0LyoqXG5cdCAqIEJ1aWxkIGEgYFFnaXNTZGtgIG9uIGEgZ2VuZXJhdGVkIHNjaGVtYS5cblx0ICpcblx0ICogV2l0aG91dCBvcHRpb25zIGl0IGNvbm5lY3RzIHRvIHRoZSBwYWdlJ3MgUVdlYkNoYW5uZWwgb2JqZWN0IG5hbWVkXG5cdCAqIFwiYnJpZGdlXCIsIHdoaWNoIGlzIHdoYXQgdGhlIFB5dGhvbiBydW50aW1lIHJlZ2lzdGVyczsgYSB0ZXN0IHBhc3NlcyB0aGVcblx0ICogaGFybmVzcyBmcm9tIGBAYXJjaG9udDU2MS9xZ2lzLXNkay90ZXN0aW5nYCBhcyBgdHJhbnNwb3J0YCBpbnN0ZWFkLlxuXHQgKi9cblx0ZXhwb3J0IGZ1bmN0aW9uIGZyb21CcmlkZ2VTY2hlbWE8XG5cdFx0TyBleHRlbmRzIFJlY29yZDxrZXlvZiBPLCBPcGVyYXRpb25TaGFwZT4sXG5cdFx0UyBleHRlbmRzIFJlY29yZDxrZXlvZiBTLCBTdHJlYW1TaGFwZT4sXG5cdD4oc2NoZW1hOiBCcmlkZ2VTY2hlbWE8TywgUz4sIG9wdGlvbnM6IFFnaXNTZGtPcHRpb25zID0ge30pOiBRZ2lzU2RrPE8sIFM+IHtcblx0XHRyZXR1cm4gYnVpbGQoc2NoZW1hLCBvcHRpb25zKTtcblx0fVxufVxuIiwKICAgICIvKipcbiAqIFRoZSBicmlkZ2Ugc2NoZW1hOiBhIHBsdWdpbiBkZXNjcmlwdGlvbiB0aGF0IGFsc28gY2FycmllcyBpdHMgdHlwZXMuXG4gKlxuICogYHFnaXMtc2RrIGJyaWRnZSBnZW5lcmF0ZWAgd3JpdGVzIG9uZSBgYnJpZGdlLnNjaGVtYS50c2AgcGVyIHBsdWdpblxuICogKGRlY2lzaW9uLTQ0KS4gVGhhdCBtb2R1bGUgaGFzIG5vIGNvZGUgb2YgaXRzIG93bjogaXQgZGVjbGFyZXMgdGhlIHZhbHVlXG4gKiBpbnRlcmZhY2VzLCB0d28gbWFwcyAtIGBPcGVyYXRpb25zYCBhbmQgYFN0cmVhbXNgLCBrZXllZCBieSBvcGVyYXRpb24gaWQgLVxuICogYW5kIGVuZHMgaW4gYGRlZmluZUJyaWRnZVNjaGVtYTxPcGVyYXRpb25zLCBTdHJlYW1zPih7IC4uLmRlc2NyaXB0aW9uIH0pYC5cbiAqIFRoZSB0d28gdHlwZSBwYXJhbWV0ZXJzIG5ldmVyIGV4aXN0IGF0IHJ1biB0aW1lOyB0aGV5IHJpZGUgb24gdGhlIHJldHVybmVkXG4gKiBvYmplY3Qgc28gYFFnaXNTZGsuZnJvbUJyaWRnZVNjaGVtYShzY2hlbWEpYCBjYW4gaW5mZXIgdGhlbSwgYW5kIHRoZVxuICogZGVzY3JpcHRpb24gaXRzZWxmIGlzIHdoYXQgdGhlIFNESyB2YWxpZGF0ZXMgYWdhaW5zdC5cbiAqL1xuXG5pbXBvcnQgeyB0eXBlIFBsdWdpbkRlc2NyaXB0aW9uLCBwYXJzZVBsdWdpbkRlc2NyaXB0aW9uIH0gZnJvbSBcIi4vZGVjbGFyYXRpb25zXCI7XG5cbi8qKiBXaGF0IG9uZSBkZWNsYXJlZCBhY3Rpb24gcHJvbWlzZXM6IGFuIG9iamVjdCBpbiwgYSB2YWx1ZSBvdXQuICovXG5leHBvcnQgaW50ZXJmYWNlIE9wZXJhdGlvblNoYXBlIHtcblx0cmVhZG9ubHkgcmVxdWVzdDogb2JqZWN0O1xuXHRyZWFkb25seSByZXN1bHQ6IHVua25vd247XG59XG5cbi8qKiBXaGF0IG9uZSBkZWNsYXJlZCBzdHJlYW0gcHJvbWlzZXM6IGFuIG9iamVjdCBpbiwgZGlzY3JpbWluYXRlZCBldmVudHMgb3V0LiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdHJlYW1TaGFwZSB7XG5cdHJlYWRvbmx5IHJlcXVlc3Q6IG9iamVjdDtcblx0cmVhZG9ubHkgZXZlbnQ6IHsgcmVhZG9ubHkga2luZDogc3RyaW5nOyByZWFkb25seSBwYXlsb2FkOiB1bmtub3duIH07XG59XG5cbi8qKiBUaGUgZGVmYXVsdCwgdW50eXBlZCBtYXA6IGFueSBpZCwgYW55IHNoYXBlLiAqL1xuZXhwb3J0IHR5cGUgT3BlcmF0aW9uTWFwID0geyByZWFkb25seSBbaWQ6IHN0cmluZ106IE9wZXJhdGlvblNoYXBlIH07XG5cbi8qKiBUaGUgZGVmYXVsdCwgdW50eXBlZCBtYXA6IGFueSBpZCwgYW55IHNoYXBlLiAqL1xuZXhwb3J0IHR5cGUgU3RyZWFtTWFwID0geyByZWFkb25seSBbaWQ6IHN0cmluZ106IFN0cmVhbVNoYXBlIH07XG5cbi8qKlxuICogQSBwYXJzZWQgcGx1Z2luIGRlc2NyaXB0aW9uIGNhcnJ5aW5nIGl0cyBgT3BlcmF0aW9uc2AgYW5kIGBTdHJlYW1zYCB0eXBlcy5cbiAqXG4gKiBUaGUgYFwifnR5cGVzXCJgIG1lbWJlciBpcyBjb21waWxlLXRpbWUgb25seTogaXQgaXMgbmV2ZXIgc2V0LCBhbmQgYSBzY2hlbWEgaXNcbiAqIGEgZnJvemVuIHtAbGluayBQbHVnaW5EZXNjcmlwdGlvbn0gYW5kIG5vdGhpbmcgbW9yZSBhdCBydW4gdGltZS4gSXQgaXMgYVxuICogc3RyaW5nIGtleSwgbm90IGEgdW5pcXVlIHN5bWJvbCwgc28gdGhlIHR5cGUgc3RheXMgc3RydWN0dXJhbGx5IHRoZSBzYW1lXG4gKiBhY3Jvc3MgdGhlIHBhY2thZ2UncyBlbnRyeSBwb2ludHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnJpZGdlU2NoZW1hPE8gPSBPcGVyYXRpb25NYXAsIFMgPSBTdHJlYW1NYXA+XG5cdGV4dGVuZHMgUGx1Z2luRGVzY3JpcHRpb24ge1xuXHRyZWFkb25seSBcIn50eXBlc1wiPzoge1xuXHRcdHJlYWRvbmx5IG9wZXJhdGlvbnM6IE87XG5cdFx0cmVhZG9ubHkgc3RyZWFtczogUztcblx0fTtcbn1cblxuLyoqIFRoZSBgT3BlcmF0aW9uc2AgbWFwIGEgc2NoZW1hIGNhcnJpZXMuICovXG5leHBvcnQgdHlwZSBPcGVyYXRpb25zT2Y8U2NoZW1hPiA9XG5cdFNjaGVtYSBleHRlbmRzIEJyaWRnZVNjaGVtYTxpbmZlciBPLCB1bmtub3duPiA/IE8gOiBuZXZlcjtcblxuLyoqIFRoZSBgU3RyZWFtc2AgbWFwIGEgc2NoZW1hIGNhcnJpZXMuICovXG5leHBvcnQgdHlwZSBTdHJlYW1zT2Y8U2NoZW1hPiA9XG5cdFNjaGVtYSBleHRlbmRzIEJyaWRnZVNjaGVtYTx1bmtub3duLCBpbmZlciBTPiA/IFMgOiBuZXZlcjtcblxuLyoqXG4gKiBQYXJzZSBhIGRlc2NyaXB0aW9uIGFuZCB0eXBlIGl0OyB0aGUgZ2VuZXJhdGVkIG1vZHVsZSBpcyB0aGUgb25seSBjYWxsZXIuXG4gKlxuICogVGhlIGRlc2NyaXB0aW9uIGlzIGNoZWNrZWQgdGhlIHdheSBhbnkgZGVzY3JpcHRpb24gaXMgKGBzY2hlbWFfdmVyc2lvbmAsXG4gKiBpZHMsIGhhbmRsZXJzLCBkZWNsYXJlZCBzdHJlYW1zKSwgc28gYSBoYW5kLWVkaXRlZCBvciBzdGFsZSBtb2R1bGUgZmFpbHNcbiAqIGhlcmUsIGF0IGltcG9ydCwgcmF0aGVyIHRoYW4gb24gdGhlIGZpcnN0IGNhbGwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmVCcmlkZ2VTY2hlbWE8XG5cdE8gZXh0ZW5kcyBSZWNvcmQ8a2V5b2YgTywgT3BlcmF0aW9uU2hhcGU+LFxuXHRTIGV4dGVuZHMgUmVjb3JkPGtleW9mIFMsIFN0cmVhbVNoYXBlPixcbj4oaW5wdXQ6IHN0cmluZyB8IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+Pik6IEJyaWRnZVNjaGVtYTxPLCBTPiB7XG5cdHJldHVybiBwYXJzZVBsdWdpbkRlc2NyaXB0aW9uKGlucHV0KSBhcyBCcmlkZ2VT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RUFDbkU7QUFBQSxFQUNBLFdBQVcsYUFBYSxZQUFZO0FBQUEsSUFDbkMsT0FBTyxPQUFPLFNBQVM7QUFBQSxFQUN4QjtBQUFBLEVBQ0EsT0FBTyxPQUFPLE9BQU8sT0FBTztBQUFBO0FBUzdCLFNBQVMsS0FBSyxDQUNiLFNBQ0EsWUFDQSxJQUNBLFFBQ087QUFBQSxFQUNQLE1BQU0sV0FBVyxHQUFHLE1BQU0sR0FBRztBQUFBLEVBQzdCLElBQUksU0FBUyxLQUFLLENBQUMsWUFBWSxZQUFZLEVBQUUsR0FBRztBQUFBLElBQy9DLE1BQU0sSUFBSSx5QkFDVCxHQUFHLG1EQUNKO0FBQUEsRUFDRDtBQUFBLEVBQ0EsTUFBTSxPQUFPLFNBQVM7QUFBQSxFQUN0QixJQUFJLGlCQUFpQixTQUFTLElBQUksR0FBRztBQUFBLElBQ3BDLE1BQU0sSUFBSSx5QkFDVCxHQUFHLDREQUE0RCxpQkFBaUIsS0FBSyxJQUFJLElBQzFGO0FBQUEsRUFDRDtBQUFBLEVBQ0EsSUFBSSxPQUFPO0FBQUEsRUFDWCxZQUFZLE9BQU8sWUFBWSxTQUFTLFFBQVEsR0FBRztBQUFBLElBQ2xELE1BQU0sU0FBUyxTQUFTLE1BQU0sR0FBRyxRQUFRLENBQUMsRUFBRSxLQUFLLEdBQUc7QUFBQSxJQUNwRCxNQUFNLFdBQVcsS0FBSztBQUFBLElBQ3RCLElBQUksVUFBVSxTQUFTLFNBQVMsR0FBRztBQUFBLE1BQ2xDLElBQUksYUFBYSxXQUFXO0FBQUEsUUFDM0IsTUFBTSxJQUFJLHlCQUNULE9BQU8sYUFBYSxhQUNqQixHQUFHLCtCQUNILEdBQUcsZ0VBQ1A7QUFBQSxNQUNEO0FBQUEsTUFDQSxLQUFLLFdBQVc7QUFBQSxNQUNoQjtBQUFBLElBQ0Q7QUFBQSxJQUNBLElBQUksYUFBYSxXQUFXO0FBQUEsTUFDM0IsTUFBTSxZQUFxQyxDQUFDO0FBQUEsTUFDNUMsV0FBVyxLQUFLLFNBQVM7QUFBQSxNQUN6QixLQUFLLFdBQVc7QUFBQSxNQUNoQixPQUFPO0FBQUEsSUFDUixFQUFPLFNBQUksT0FBTyxhQUFhLFlBQVk7QUFBQSxNQUMxQyxNQUFNLElBQUkseUJBQ1QsR0FBRyxPQUFPLGlFQUNYO0FBQUEsSUFDRCxFQUFPO0FBQUEsTUFDTixPQUFPO0FBQUE7QUFBQSxFQUVUO0FBQUE7QUFTTSxJQUFVO0FBQUEsQ0FBVixDQUFVLFlBQVY7QUFBQSxFQVFDLFNBQVMsZ0JBR2YsQ0FBQyxRQUE0QixVQUEwQixDQUFDLEdBQWtCO0FBQUEsSUFDMUUsT0FBTyxNQUFNLFFBQVEsT0FBTztBQUFBO0FBQUEsRUFKdEIsUUFBUztBQUFBLEdBUkE7O0FDcGFWLFNBQVMsa0JBR2YsQ0FBQyxPQUF1RTtBQUFBLEVBQ3hFLE9BQU8sd0JBQXVCLEtBQUs7QUFBQTsiLAogICJkZWJ1Z0lkIjogIjUwN0M0N0E1NEE4N0JEMUI2NDc1NkUyMTY0NzU2RTIxIiwKICAibmFtZXMiOiBbXQp9