@archont561/qgis-sdk 0.3.0 → 0.4.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/README.md +5 -6
- package/dist/bridge.d.ts +2 -205
- package/dist/bridge.js +3 -4
- package/dist/host.d.ts +2 -157
- package/dist/host.js +48 -430
- package/dist/index.d.ts +54 -93
- package/dist/index.js +727 -26
- package/dist/react.d.ts +28 -108
- package/dist/react.js +34 -16
- package/dist/shared/chunk-2hwva3a3.js +14 -0
- package/dist/shared/chunk-8gawbn19.js +433 -0
- package/dist/shared/chunk-jjx14tgd.d.ts +55 -0
- package/dist/shared/chunk-khemhx86.d.ts +158 -0
- package/dist/shared/chunk-pdj2fxjb.d.ts +17 -0
- package/dist/shared/chunk-tmca1ynt.d.ts +87 -0
- package/dist/shared/chunk-vqyymknv.js +414 -0
- package/dist/shared/chunk-wtv4vt4q.d.ts +280 -0
- package/dist/testing.d.ts +52 -30
- package/dist/testing.js +48 -5
- package/package.json +2 -2
- package/dist/shared/chunk-0fknax6w.js +0 -207
- package/dist/shared/chunk-a7bjgeve.js +0 -422
package/dist/testing.js
CHANGED
|
@@ -1,6 +1,10 @@
|
|
|
1
|
+
import {
|
|
2
|
+
HOST_SCHEMA_VERSION2,
|
|
3
|
+
HOST_OPERATIONS2
|
|
4
|
+
} from "./shared/chunk-vqyymknv.js";
|
|
1
5
|
import {
|
|
2
6
|
QgisSdkError2
|
|
3
|
-
} from "./shared/chunk-
|
|
7
|
+
} from "./shared/chunk-2hwva3a3.js";
|
|
4
8
|
|
|
5
9
|
// src/testing.ts
|
|
6
10
|
var PROTOCOL = 1;
|
|
@@ -20,6 +24,8 @@ class QgisSdkBridgeHarnessError extends QgisSdkError2 {
|
|
|
20
24
|
}
|
|
21
25
|
|
|
22
26
|
class Harness {
|
|
27
|
+
granted;
|
|
28
|
+
plugin;
|
|
23
29
|
listenerSet = new Set;
|
|
24
30
|
expectations = [];
|
|
25
31
|
recorded = [];
|
|
@@ -29,6 +35,10 @@ class Harness {
|
|
|
29
35
|
outbox = [];
|
|
30
36
|
draining = null;
|
|
31
37
|
streamCounter = 0;
|
|
38
|
+
constructor(options, plugin) {
|
|
39
|
+
this.granted = Object.freeze([...options.granted ?? HOST_OPERATIONS2]);
|
|
40
|
+
this.plugin = plugin;
|
|
41
|
+
}
|
|
32
42
|
get calls() {
|
|
33
43
|
return [...this.recorded];
|
|
34
44
|
}
|
|
@@ -58,6 +68,10 @@ class Harness {
|
|
|
58
68
|
this.closeFromPage(envelope);
|
|
59
69
|
return;
|
|
60
70
|
}
|
|
71
|
+
if (envelope.kind === "handshake") {
|
|
72
|
+
this.answerHandshake(envelope);
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
61
75
|
const expectation = this.take(envelope.kind, envelope.operation);
|
|
62
76
|
if (expectation === undefined) {
|
|
63
77
|
this.unexpectedCalls.push(envelope);
|
|
@@ -110,6 +124,27 @@ class Harness {
|
|
|
110
124
|
throw new QgisSdkBridgeHarnessError(problems.join("; "));
|
|
111
125
|
}
|
|
112
126
|
}
|
|
127
|
+
answerHandshake(call) {
|
|
128
|
+
const declared = [
|
|
129
|
+
...(this.plugin?.actions ?? []).map((action) => action.id),
|
|
130
|
+
...(this.plugin?.streams ?? []).map((stream) => stream.id)
|
|
131
|
+
];
|
|
132
|
+
this.deliver({
|
|
133
|
+
protocol: PROTOCOL,
|
|
134
|
+
call_id: call.callId,
|
|
135
|
+
ok: true,
|
|
136
|
+
value: {
|
|
137
|
+
protocol: PROTOCOL,
|
|
138
|
+
generation: 0,
|
|
139
|
+
plugin: this.plugin,
|
|
140
|
+
host_schema_version: HOST_SCHEMA_VERSION2,
|
|
141
|
+
operations: [...declared, ...this.granted].map((id) => ({
|
|
142
|
+
id,
|
|
143
|
+
title: id
|
|
144
|
+
}))
|
|
145
|
+
}
|
|
146
|
+
});
|
|
147
|
+
}
|
|
113
148
|
answerInvoke(call, expectation) {
|
|
114
149
|
this.resolveHandler(call, () => expectation.handler(call.payload ?? {})).then((reply) => {
|
|
115
150
|
if (reply === SILENCE) {
|
|
@@ -292,6 +327,11 @@ class Harness {
|
|
|
292
327
|
this.recorded.push(call);
|
|
293
328
|
return call;
|
|
294
329
|
}
|
|
330
|
+
if (raw.kind === "handshake") {
|
|
331
|
+
const call = { callId, kind: "handshake", operation: "" };
|
|
332
|
+
this.recorded.push(call);
|
|
333
|
+
return call;
|
|
334
|
+
}
|
|
295
335
|
if (raw.kind !== "invoke" && raw.kind !== "subscribe") {
|
|
296
336
|
throw new QgisSdkBridgeHarnessError(`${callId}: ${String(raw.kind)} is not a bridge envelope kind`);
|
|
297
337
|
}
|
|
@@ -309,8 +349,11 @@ class Harness {
|
|
|
309
349
|
return call;
|
|
310
350
|
}
|
|
311
351
|
}
|
|
312
|
-
function createBridgeHarness() {
|
|
313
|
-
|
|
352
|
+
function createBridgeHarness(first = {}, second = {}) {
|
|
353
|
+
if ("schema_version" in first) {
|
|
354
|
+
return new Harness(second, first);
|
|
355
|
+
}
|
|
356
|
+
return new Harness(first, null);
|
|
314
357
|
}
|
|
315
358
|
export {
|
|
316
359
|
QgisSdkBridgeHarnessError,
|
|
@@ -319,5 +362,5 @@ export {
|
|
|
319
362
|
fault
|
|
320
363
|
};
|
|
321
364
|
|
|
322
|
-
//# debugId=
|
|
323
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL3Rlc3RpbmcudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiLyoqXG4gKiBBbiBpbmplY3RlZCBwZXItY2xpZW50IGhhcm5lc3MgZm9yIHRoZSBicmlkZ2UgKFRBU0stMTgsIGRlY2lzaW9uLTIzKS5cbiAqXG4gKiBUaGUgaGFybmVzcyBpcyBhIHtAbGluayBXaXJlVHJhbnNwb3J0fTogYSBwYWdlJ3Mgb3duIGBCcmlkZ2VDbGllbnRgIHNwZWFrcyB0b1xuICogaXQgZXhhY3RseSBhcyBpdCB3b3VsZCB0byBhIFFXZWJDaGFubmVsLCBhbmQgYSB0ZXN0IHNjcmlwdHMgd2hhdCB0aGUgaG9zdFxuICogYW5zd2VycyAtIHR5cGVkIHJlcGxpZXMsIGZhdWx0cywgc2lsZW5jZSwgc3RyZWFtIGV2ZW50cywgdGVybWluYWxzLCBnYXBzIC1cbiAqIHdpdGhvdXQgdG91Y2hpbmcgYSBicm93c2VyIGdsb2JhbCBvciBhIHJ1bm5pbmcgUUdJUy4gVHdvIGhhcm5lc3NlcyBhcmUgdHdvXG4gKiBob3N0cywgc28gaXNvbGF0aW9uIGJldHdlZW4gY2xpZW50cyBpcyBhIGZhY3QgYSB0ZXN0IGNhbiBwcm92ZS5cbiAqXG4gKiBXaGF0IGl0IHByb3ZlcyBpcyBib3VuZGVkLiBBIGdyZWVuIHRlc3QgaGVyZSBzYXlzIHRoZSBwYWdlIGhhbmRsZXMgdGhlXG4gKiBmcmFtZXMgYSBob3N0ICpjb3VsZCogc2VuZDsgaXQgc2F5cyBub3RoaW5nIGFib3V0IHdoYXQgYSBRV2ViRW5naW5lVmlldyBvclxuICogYSByZWFsIGhvc3QgZG9lcy4gVGhhdCBldmlkZW5jZSBsaXZlcyBpbiB0aGUgUHl0aG9uIHN1aXRlIGFuZCBpbiB0aGVcbiAqIHF1YWxpZmljYXRpb24gaGFybmVzc2VzIHJlY29yZGVkIGluIGRvYy0xNC4gS2VlcCB0aGUgdHdvIGFwYXJ0IGluIHJlcG9ydHMuXG4gKlxuICogRXZlcnl0aGluZyB0aGUgaGFybmVzcyBzZW5kcyBpcyBkZWxpdmVyZWQgYXN5bmNocm9ub3VzbHksIG9uZSBtZXNzYWdlIHBlclxuICogbWljcm90YXNrLCBzbyBhIHJlcGx5IG5ldmVyIHJlLWVudGVycyB0aGUgY2xpZW50IGluc2lkZSBpdHMgb3duIGBzZW5kYC5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG5cdEJyaWRnZVN0cmVhbVRlcm1pbmFsLFxuXHRTdHJlYW1FdmVudEtpbmQsXG5cdFdpcmVUcmFuc3BvcnQsXG59IGZyb20gXCIuL2JyaWRnZVwiO1xuaW1wb3J0IHsgUWdpc1Nka0Vycm9yIH0gZnJvbSBcIi4vaW5kZXhcIjtcblxuY29uc3QgUFJPVE9DT0wgPSAxO1xuY29uc3QgU1VCU0NSSVBUSU9OX0NBUEFDSVRZID0gNjQ7XG5cbi8qKiBBIHNjcmlwdGVkIGhvc3QgZmFpbHVyZSwgcmV0dXJuZWQgZnJvbSBhbiBleHBlY3RhdGlvbidzIGhhbmRsZXIuICovXG5leHBvcnQgaW50ZXJmYWNlIFNjcmlwdGVkRmF1bHQge1xuXHRyZWFkb25seSBmYXVsdDogeyByZWFkb25seSBjb2RlOiBzdHJpbmc7IHJlYWRvbmx5IG1lc3NhZ2U6IHN0cmluZyB9O1xufVxuXG4vKiogU2NyaXB0IGEgZmFpbHVyZSByZXBseSB3aXRoIHRoaXMgY29kZSBhbmQgbWVzc2FnZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmYXVsdChjb2RlOiBzdHJpbmcsIG1lc3NhZ2U6IHN0cmluZyk6IFNjcmlwdGVkRmF1bHQge1xuXHRyZXR1cm4gT2JqZWN0LmZyZWV6ZSh7IGZhdWx0OiBPYmplY3QuZnJlZXplKHsgY29kZSwgbWVzc2FnZSB9KSB9KTtcbn1cblxuZnVuY3Rpb24gaXNGYXVsdCh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFNjcmlwdGVkRmF1bHQge1xuXHRyZXR1cm4gKFxuXHRcdHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJlxuXHRcdHZhbHVlICE9PSBudWxsICYmXG5cdFx0XCJmYXVsdFwiIGluIHZhbHVlICYmXG5cdFx0dHlwZW9mICh2YWx1ZSBhcyBTY3JpcHRlZEZhdWx0KS5mYXVsdCA9PT0gXCJvYmplY3RcIlxuXHQpO1xufVxuXG4vKiogUmV0dXJuIHRoaXMgZnJvbSBhIGhhbmRsZXIgdG8gbmV2ZXIgYW5zd2VyLCBzbyB0aGUgY2xpZW50J3MgdGltZW91dCBzcGVha3MuICovXG5leHBvcnQgY29uc3QgU0lMRU5DRTogdW5pcXVlIHN5bWJvbCA9IFN5bWJvbChcInFnaXMtc2RrLWhhcm5lc3Mtc2lsZW5jZVwiKTtcblxuLyoqIEEgc3Vic2NyaXB0aW9uIHRoZSBzY3JpcHQgdHVybnMgZG93bjogYSBmYXVsdCByZXBseSwgb3Igbm8gcmVwbHkgYXQgYWxsLiAqL1xuZXhwb3J0IHR5cGUgU2NyaXB0ZWRSZWZ1c2FsID0gU2NyaXB0ZWRGYXVsdCB8IHR5cGVvZiBTSUxFTkNFO1xuXG4vKipcbiAqIEEgc3Vic2NyaWJlIGV4cGVjdGF0aW9uJ3Mgc2NyaXB0OiBlbWl0IG9uIGBzdHJlYW1gIG5vdyBvciBsYXRlciwgb3IgcmV0dXJuXG4gKiBhIHJlZnVzYWwgaW5zdGVhZCBvZiBhY2tub3dsZWRnaW5nLlxuICovXG5leHBvcnQgdHlwZSBTdWJzY3JpYmVTY3JpcHQ8UmVxIGV4dGVuZHMgb2JqZWN0PiA9IChcblx0cGF5bG9hZDogUmVxLFxuXHRzdHJlYW06IFNjcmlwdGVkU3RyZWFtLFxuXHQvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vQ29uZnVzaW5nVm9pZFR5cGU6IGEgc2NyaXB0IHRoYXQgb25seSBlbWl0cyByZXR1cm5zIG5vdGhpbmdcbikgPT4gU2NyaXB0ZWRSZWZ1c2FsIHwgdm9pZDtcblxuLyoqIFdoYXQgYW4gaW52b2tlIGV4cGVjdGF0aW9uIG1heSBhbnN3ZXIgd2l0aC4gKi9cbmV4cG9ydCB0eXBlIFNjcmlwdGVkUmVwbHk8UmVzPiA9XG5cdHwgUmVzXG5cdHwgU2NyaXB0ZWRGYXVsdFxuXHR8IHR5cGVvZiBTSUxFTkNFXG5cdHwgUHJvbWlzZTxSZXMgfCBTY3JpcHRlZEZhdWx0IHwgdHlwZW9mIFNJTEVOQ0U+O1xuXG4vKiogQSBtZXNzYWdlIHRoZSBjbGllbnQgc2VudCwgYXMgdGhlIGhhcm5lc3MgcmVjb3JkZWQgaXQuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlY29yZGVkQ2FsbCB7XG5cdHJlYWRvbmx5IGNhbGxJZDogc3RyaW5nO1xuXHRyZWFkb25seSBraW5kOiBcImludm9rZVwiIHwgXCJzdWJzY3JpYmVcIiB8IFwidW5zdWJzY3JpYmVcIjtcblx0cmVhZG9ubHkgb3BlcmF0aW9uOiBzdHJpbmc7XG5cdHJlYWRvbmx5IHBheWxvYWQ/OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj47XG5cdHJlYWRvbmx5IHN1YnNjcmlwdGlvbklkPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIE9uZSBzY3JpcHRlZCBzdWJzY3JpcHRpb24uIEZyYW1lcyBjYXJyeSB0aGUgc2VxdWVuY2UgdGhlIGtlcm5lbCBjaGVja3MsIHNvXG4gKiBgc2tpcGAgaXMgdGhlIG9uZSB3YXkgdG8gc2NyaXB0IGEgZ2FwLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNjcmlwdGVkU3RyZWFtIHtcblx0cmVhZG9ubHkgaWQ6IHN0cmluZztcblx0cmVhZG9ubHkgb3BlcmF0aW9uOiBzdHJpbmc7XG5cdC8qKiBgZmFsc2VgIG9uY2UgdGhlIGhvc3QgZW5kZWQgaXQgb3IgdGhlIHBhZ2UgY2xvc2VkIGl0LiAqL1xuXHRyZWFkb25seSBvcGVuOiBib29sZWFuO1xuXHRlbWl0KGtpbmQ6IFN0cmVhbUV2ZW50S2luZCwgcGF5bG9hZDogdW5rbm93bik6IHZvaWQ7XG5cdGVuZCh0ZXJtaW5hbDogQnJpZGdlU3RyZWFtVGVybWluYWwpOiB2b2lkO1xuXHQvKiogQWR2YW5jZSB0aGUgc2VxdWVuY2Ugd2l0aG91dCBzZW5kaW5nLCBzbyB0aGUgbmV4dCBmcmFtZSBpcyBhIGdhcC4gKi9cblx0c2tpcChmcmFtZXM6IG51bWJlcik6IHZvaWQ7XG59XG5cbi8qKiBPcHRpb25zIGZvciBhIHN1YnNjcmliZSBleHBlY3RhdGlvbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3Vic2NyaWJlT3B0aW9ucyB7XG5cdC8qKiBEZWxheSB0aGUgYWNrbm93bGVkZ2VtZW50IHVudGlsIHRoaXMgcHJvbWlzZSBzZXR0bGVzLiAqL1xuXHRyZWFkb25seSBhY2s/OiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xufVxuXG4vKipcbiAqIEEgdGVzdCdzIHNjcmlwdCB3ZW50IHdyb25nOiBhbiB1bm1ldCBvciB1bmV4cGVjdGVkIGNhbGwsIGEgbGVha2VkXG4gKiBzdWJzY3JpcHRpb24sIGEgaGFuZGxlciB0aGF0IHRocmV3LCBvciBhbiBlbnZlbG9wZSB0aGF0IGlzIG5vdCBwcm90b2NvbCAxLlxuICovXG5leHBvcnQgY2xhc3MgUWdpc1Nka0JyaWRnZUhhcm5lc3NFcnJvciBleHRlbmRzIFFnaXNTZGtFcnJvciB7XG5cdHB1YmxpYyBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcblx0XHRzdXBlcihtZXNzYWdlLCBcImhhcm5lc3NfZXJyb3JcIik7XG5cdH1cbn1cblxuaW50ZXJmYWNlIEludm9rZUV4cGVjdGF0aW9uIHtcblx0cmVhZG9ubHkga2luZDogXCJpbnZva2VcIjtcblx0cmVhZG9ubHkgb3BlcmF0aW9uOiBzdHJpbmc7XG5cdHJlYWRvbmx5IGhhbmRsZXI6IChwYXlsb2FkOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4pID0+IHVua25vd247XG59XG5cbmludGVyZmFjZSBTdWJzY3JpYmVFeHBlY3RhdGlvbiB7XG5cdHJlYWRvbmx5IGtpbmQ6IFwic3Vic2NyaWJlXCI7XG5cdHJlYWRvbmx5IG9wZXJhdGlvbjogc3RyaW5nO1xuXHRyZWFkb25seSBzY3JpcHQ6IFN1YnNjcmliZVNjcmlwdDxSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4+O1xuXHRyZWFkb25seSBvcHRpb25zOiBTdWJzY3JpYmVPcHRpb25zO1xufVxuXG50eXBlIEV4cGVjdGF0aW9uID0gSW52b2tlRXhwZWN0YXRpb24gfCBTdWJzY3JpYmVFeHBlY3RhdGlvbjtcblxuaW50ZXJmYWNlIE9wZW5TdHJlYW0ge1xuXHRyZWFkb25seSBpZDogc3RyaW5nO1xuXHRyZWFkb25seSBvcGVyYXRpb246IHN0cmluZztcblx0c2VxOiBudW1iZXI7XG5cdG9wZW46IGJvb2xlYW47XG59XG5cbi8qKiBUaGUgaGFybmVzcyBhIHRlc3QgaG9sZHM7IGFsc28gdGhlIHRyYW5zcG9ydCBpdHMgY2xpZW50IGlzIGJ1aWx0IG9uLiAqL1xuZXhwb3J0IGludGVyZmFjZSBCcmlkZ2VIYXJuZXNzPE9wIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nPlxuXHRleHRlbmRzIFdpcmVUcmFuc3BvcnQge1xuXHQvKiogRXZlcnkgbWVzc2FnZSB0aGUgY2xpZW50IHNlbnQsIGluIG9yZGVyLiAqL1xuXHRyZWFkb25seSBjYWxsczogcmVhZG9ubHkgUmVjb3JkZWRDYWxsW107XG5cdC8qKiBDYWxscyBubyBleHBlY3RhdGlvbiBjb3ZlcmVkOyBlYWNoIHdhcyBhbnN3ZXJlZCBgdW5leHBlY3RlZF9jYWxsYC4gKi9cblx0cmVhZG9ubHkgdW5leHBlY3RlZDogcmVhZG9ubHkgUmVjb3JkZWRDYWxsW107XG5cdC8qKiBTdWJzY3JpcHRpb25zIG5laXRoZXIgZW5kZWQgYnkgYSBzY3JpcHQgbm9yIGNsb3NlZCBieSB0aGUgcGFnZS4gKi9cblx0cmVhZG9ubHkgb3BlblN1YnNjcmlwdGlvbnM6IHJlYWRvbmx5IHN0cmluZ1tdO1xuXHQvKiogQ2xpZW50cyBjdXJyZW50bHkgYXR0YWNoZWQuICovXG5cdHJlYWRvbmx5IGxpc3RlbmVyczogbnVtYmVyO1xuXHQvKiogQW5zd2VyIHRoZSBuZXh0IGBvcGVyYXRpb25gIGNhbGwgd2l0aCB3aGF0IGBoYW5kbGVyYCByZXR1cm5zLiAqL1xuXHRleHBlY3RJbnZva2U8XG5cdFx0UmVxIGV4dGVuZHMgb2JqZWN0ID0gUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+LFxuXHRcdFJlcyA9IHVua25vd24sXG5cdD4ob3BlcmF0aW9uOiBPcCwgaGFuZGxlcjogKHBheWxvYWQ6IFJlcSkgPT4gU2NyaXB0ZWRSZXBseTxSZXM+KTogdm9pZDtcblx0LyoqXG5cdCAqIEFja25vd2xlZGdlIHRoZSBuZXh0IGBvcGVyYXRpb25gIHN1YnNjcmlwdGlvbiBhbmQgaGFuZCBgc2NyaXB0YCB0aGVcblx0ICogc3RyZWFtOyByZXR1cm4gYSBmYXVsdCBvciB7QGxpbmsgU0lMRU5DRX0gZnJvbSBpdCB0byByZWZ1c2UgaW5zdGVhZC5cblx0ICovXG5cdGV4cGVjdFN1YnNjcmliZTxSZXEgZXh0ZW5kcyBvYmplY3QgPSBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4+KFxuXHRcdG9wZXJhdGlvbjogT3AsXG5cdFx0c2NyaXB0OiBTdWJzY3JpYmVTY3JpcHQ8UmVxPixcblx0XHRvcHRpb25zPzogU3Vic2NyaWJlT3B0aW9ucyxcblx0KTogdm9pZDtcblx0LyoqIFB1c2ggYW55IHJhdyBtZXNzYWdlLCBmb3Igd2hhdCBubyBleHBlY3RhdGlvbiBjYW4gc2NyaXB0LiAqL1xuXHRkZWxpdmVyKHJhdzogdW5rbm93bik6IHZvaWQ7XG5cdC8qKiBSZXNvbHZlIG9uY2UgZXZlcnl0aGluZyBxdWV1ZWQgc28gZmFyIGhhcyBiZWVuIGRlbGl2ZXJlZC4gKi9cblx0c2V0dGxlZCgpOiBQcm9taXNlPHZvaWQ+O1xuXHQvKiogVGhyb3cgdW5sZXNzIGV2ZXJ5IGV4cGVjdGF0aW9uIHdhcyBtZXQgYW5kIG5vdGhpbmcgbGVha2VkLiAqL1xuXHRhc3NlcnRTYXRpc2ZpZWQoKTogdm9pZDtcbn1cblxuY2xhc3MgSGFybmVzczxPcCBleHRlbmRzIHN0cmluZz4gaW1wbGVtZW50cyBCcmlkZ2VIYXJuZXNzPE9wPiB7XG5cdHByaXZhdGUgcmVhZG9ubHkgbGlzdGVuZXJTZXQgPSBuZXcgU2V0PChtZXNzYWdlOiB1bmtub3duKSA9PiB2b2lkPigpO1xuXHRwcml2YXRlIHJlYWRvbmx5IGV4cGVjdGF0aW9uczogRXhwZWN0YXRpb25bXSA9IFtdO1xuXHRwcml2YXRlIHJlYWRvbmx5IHJlY29yZGVkOiBSZWNvcmRlZENhbGxbXSA9IFtdO1xuXHRwcml2YXRlIHJlYWRvbmx5IHVuZXhwZWN0ZWRDYWxsczogUmVjb3JkZWRDYWxsW10gPSBbXTtcblx0cHJpdmF0ZSByZWFkb25seSBzdHJlYW1zID0gbmV3IE1hcDxzdHJpbmcsIE9wZW5TdHJlYW0+KCk7XG5cdHByaXZhdGUgcmVhZG9ubHkgcHJvYmxlbXM6IHN0cmluZ1tdID0gW107XG5cdHByaXZhdGUgcmVhZG9ubHkgb3V0Ym94OiB1bmtub3duW10gPSBbXTtcblx0cHJpdmF0ZSBkcmFpbmluZzogUHJvbWlzZTx2b2lkPiB8IG51bGwgPSBudWxsO1xuXHRwcml2YXRlIHN0cmVhbUNvdW50ZXIgPSAwO1xuXG5cdHB1YmxpYyBnZXQgY2FsbHMoKTogcmVhZG9ubHkgUmVjb3JkZWRDYWxsW10ge1xuXHRcdHJldHVybiBbLi4udGhpcy5yZWNvcmRlZF07XG5cdH1cblxuXHRwdWJsaWMgZ2V0IHVuZXhwZWN0ZWQoKTogcmVhZG9ubHkgUmVjb3JkZWRDYWxsW10ge1xuXHRcdHJldHVybiBbLi4udGhpcy51bmV4cGVjdGVkQ2FsbHNdO1xuXHR9XG5cblx0cHVibGljIGdldCBvcGVuU3Vic2NyaXB0aW9ucygpOiByZWFkb25seSBzdHJpbmdbXSB7XG5cdFx0cmV0dXJuIFsuLi50aGlzLnN0cmVhbXMudmFsdWVzKCldXG5cdFx0XHQuZmlsdGVyKChzdHJlYW0pID0+IHN0cmVhbS5vcGVuKVxuXHRcdFx0Lm1hcCgoc3RyZWFtKSA9PiBzdHJlYW0uaWQpO1xuXHR9XG5cblx0cHVibGljIGdldCBsaXN0ZW5lcnMoKTogbnVtYmVyIHtcblx0XHRyZXR1cm4gdGhpcy5saXN0ZW5lclNldC5zaXplO1xuXHR9XG5cblx0cHVibGljIHN1YnNjcmliZShsaXN0ZW5lcjogKG1lc3NhZ2U6IHVua25vd24pID0+IHZvaWQpOiAoKSA9PiB2b2lkIHtcblx0XHR0aGlzLmxpc3RlbmVyU2V0LmFkZChsaXN0ZW5lcik7XG5cdFx0cmV0dXJuICgpID0+IHtcblx0XHRcdHRoaXMubGlzdGVuZXJTZXQuZGVsZXRlKGxpc3RlbmVyKTtcblx0XHRcdGlmICh0aGlzLmxpc3RlbmVyU2V0LnNpemUgPT09IDApIHtcblx0XHRcdFx0Ly8gVGhlIGxhc3QgY2xpZW50IGRldGFjaGVkOiB0aGUgdmlldyBpcyBnb25lLCBhbmQgYSBob3N0IGRpc3Bvc2VzXG5cdFx0XHRcdC8vIHRoZSBzdWJzY3JpcHRpb25zIG9mIGEgdmlldyBpdCBsb3N0IChkZWNpc2lvbi0yMyksIHNvIHRoZXkgYXJlXG5cdFx0XHRcdC8vIG5vIGxvbmdlciBsZWFrcy5cblx0XHRcdFx0Zm9yIChjb25zdCBzdHJlYW0gb2YgdGhpcy5zdHJlYW1zLnZhbHVlcygpKSB7XG5cdFx0XHRcdFx0c3RyZWFtLm9wZW4gPSBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH07XG5cdH1cblxuXHRwdWJsaWMgc2VuZChtZXNzYWdlOiB1bmtub3duKTogdm9pZCB7XG5cdFx0Y29uc3QgZW52ZWxvcGUgPSB0aGlzLnBhcnNlRW52ZWxvcGUobWVzc2FnZSk7XG5cdFx0aWYgKGVudmVsb3BlLmtpbmQgPT09IFwidW5zdWJzY3JpYmVcIikge1xuXHRcdFx0dGhpcy5jbG9zZUZyb21QYWdlKGVudmVsb3BlKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Y29uc3QgZXhwZWN0YXRpb24gPSB0aGlzLnRha2UoZW52ZWxvcGUua2luZCwgZW52ZWxvcGUub3BlcmF0aW9uKTtcblx0XHRpZiAoZXhwZWN0YXRpb24gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhpcy51bmV4cGVjdGVkQ2FsbHMucHVzaChlbnZlbG9wZSk7XG5cdFx0XHR0aGlzLmRlbGl2ZXJGYWlsdXJlKFxuXHRcdFx0XHRlbnZlbG9wZS5jYWxsSWQsXG5cdFx0XHRcdFwidW5leHBlY3RlZF9jYWxsXCIsXG5cdFx0XHRcdGBubyBleHBlY3RhdGlvbiBjb3ZlcnMgJHtlbnZlbG9wZS5raW5kfSAke0pTT04uc3RyaW5naWZ5KGVudmVsb3BlLm9wZXJhdGlvbil9YCxcblx0XHRcdCk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGlmIChleHBlY3RhdGlvbi5raW5kID09PSBcImludm9rZVwiKSB7XG5cdFx0XHR0aGlzLmFuc3dlckludm9rZShlbnZlbG9wZSwgZXhwZWN0YXRpb24pO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHR0aGlzLmFuc3dlclN1YnNjcmliZShlbnZlbG9wZSwgZXhwZWN0YXRpb24pO1xuXHR9XG5cblx0cHVibGljIGV4cGVjdEludm9rZTxSZXEgZXh0ZW5kcyBvYmplY3QsIFJlcz4oXG5cdFx0b3BlcmF0aW9uOiBPcCxcblx0XHRoYW5kbGVyOiAocGF5bG9hZDogUmVxKSA9PiBTY3JpcHRlZFJlcGx5PFJlcz4sXG5cdCk6IHZvaWQge1xuXHRcdHRoaXMuZXhwZWN0YXRpb25zLnB1c2goe1xuXHRcdFx0a2luZDogXCJpbnZva2VcIixcblx0XHRcdG9wZXJhdGlvbixcblx0XHRcdGhhbmRsZXI6IGhhbmRsZXIgYXMgSW52b2tlRXhwZWN0YXRpb25bXCJoYW5kbGVyXCJdLFxuXHRcdH0pO1xuXHR9XG5cblx0cHVibGljIGV4cGVjdFN1YnNjcmliZTxSZXEgZXh0ZW5kcyBvYmplY3Q+KFxuXHRcdG9wZXJhdGlvbjogT3AsXG5cdFx0c2NyaXB0OiBTdWJzY3JpYmVTY3JpcHQ8UmVxPixcblx0XHRvcHRpb25zOiBTdWJzY3JpYmVPcHRpb25zID0ge30sXG5cdCk6IHZvaWQge1xuXHRcdHRoaXMuZXhwZWN0YXRpb25zLnB1c2goe1xuXHRcdFx0a2luZDogXCJzdWJzY3JpYmVcIixcblx0XHRcdG9wZXJhdGlvbixcblx0XHRcdHNjcmlwdDogc2NyaXB0IGFzIFN1YnNjcmliZUV4cGVjdGF0aW9uW1wic2NyaXB0XCJdLFxuXHRcdFx0b3B0aW9ucyxcblx0XHR9KTtcblx0fVxuXG5cdHB1YmxpYyBkZWxpdmVyKHJhdzogdW5rbm93bik6IHZvaWQge1xuXHRcdHRoaXMub3V0Ym94LnB1c2gocmF3KTtcblx0XHR0aGlzLmRyYWluKCk7XG5cdH1cblxuXHRwdWJsaWMgc2V0dGxlZCgpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRyZXR1cm4gdGhpcy5kcmFpbmluZyA/PyBQcm9taXNlLnJlc29sdmUoKTtcblx0fVxuXG5cdHB1YmxpYyBhc3NlcnRTYXRpc2ZpZWQoKTogdm9pZCB7XG5cdFx0Y29uc3QgcHJvYmxlbXMgPSBbLi4udGhpcy5wcm9ibGVtc107XG5cdFx0aWYgKHRoaXMuZXhwZWN0YXRpb25zLmxlbmd0aCA+IDApIHtcblx0XHRcdGNvbnN0IHVubWV0ID0gdGhpcy5leHBlY3RhdGlvbnMubWFwKFxuXHRcdFx0XHQoZXhwZWN0YXRpb24pID0+IGAke2V4cGVjdGF0aW9uLmtpbmR9ICR7ZXhwZWN0YXRpb24ub3BlcmF0aW9ufWAsXG5cdFx0XHQpO1xuXHRcdFx0cHJvYmxlbXMucHVzaChgdW5tZXQgZXhwZWN0YXRpb25zOiAke3VubWV0LmpvaW4oXCIsIFwiKX1gKTtcblx0XHR9XG5cdFx0aWYgKHRoaXMudW5leHBlY3RlZENhbGxzLmxlbmd0aCA+IDApIHtcblx0XHRcdGNvbnN0IHVuZXhwZWN0ZWQgPSB0aGlzLnVuZXhwZWN0ZWRDYWxscy5tYXAoXG5cdFx0XHRcdChjYWxsKSA9PiBgJHtjYWxsLmtpbmR9ICR7Y2FsbC5vcGVyYXRpb259YCxcblx0XHRcdCk7XG5cdFx0XHRwcm9ibGVtcy5wdXNoKGB1bmV4cGVjdGVkIGNhbGxzOiAke3VuZXhwZWN0ZWQuam9pbihcIiwgXCIpfWApO1xuXHRcdH1cblx0XHRjb25zdCBvcGVuID0gdGhpcy5vcGVuU3Vic2NyaXB0aW9ucztcblx0XHRpZiAob3Blbi5sZW5ndGggPiAwKSB7XG5cdFx0XHRwcm9ibGVtcy5wdXNoKGBvcGVuIHN1YnNjcmlwdGlvbnM6ICR7b3Blbi5qb2luKFwiLCBcIil9YCk7XG5cdFx0fVxuXHRcdGlmIChwcm9ibGVtcy5sZW5ndGggPiAwKSB7XG5cdFx0XHR0aHJvdyBuZXcgUWdpc1Nka0JyaWRnZUhhcm5lc3NFcnJvcihwcm9ibGVtcy5qb2luKFwiOyBcIikpO1xuXHRcdH1cblx0fVxuXG5cdC8vIC0tIGFuc3dlcmluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXHRwcml2YXRlIGFuc3dlckludm9rZShcblx0XHRjYWxsOiBSZWNvcmRlZENhbGwsXG5cdFx0ZXhwZWN0YXRpb246IEludm9rZUV4cGVjdGF0aW9uLFxuXHQpOiB2b2lkIHtcblx0XHR0aGlzLnJlc29sdmVIYW5kbGVyKGNhbGwsICgpID0+XG5cdFx0XHRleHBlY3RhdGlvbi5oYW5kbGVyKGNhbGwucGF5bG9hZCA/PyB7fSksXG5cdFx0KS50aGVuKChyZXBseSkgPT4ge1xuXHRcdFx0aWYgKHJlcGx5ID09PSBTSUxFTkNFKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGlmIChpc0ZhdWx0KHJlcGx5KSkge1xuXHRcdFx0XHR0aGlzLmRlbGl2ZXJGYWlsdXJlKGNhbGwuY2FsbElkLCByZXBseS5mYXVsdC5jb2RlLCByZXBseS5mYXVsdC5tZXNzYWdlKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5kZWxpdmVyKHtcblx0XHRcdFx0cHJvdG9jb2w6IFBST1RPQ09MLFxuXHRcdFx0XHRjYWxsX2lkOiBjYWxsLmNhbGxJZCxcblx0XHRcdFx0b2s6IHRydWUsXG5cdFx0XHRcdHZhbHVlOiByZXBseSxcblx0XHRcdH0pO1xuXHRcdH0pO1xuXHR9XG5cblx0cHJpdmF0ZSBhbnN3ZXJTdWJzY3JpYmUoXG5cdFx0Y2FsbDogUmVjb3JkZWRDYWxsLFxuXHRcdGV4cGVjdGF0aW9uOiBTdWJzY3JpYmVFeHBlY3RhdGlvbixcblx0KTogdm9pZCB7XG5cdFx0dGhpcy5zdHJlYW1Db3VudGVyICs9IDE7XG5cdFx0Y29uc3Qgb3BlbjogT3BlblN0cmVhbSA9IHtcblx0XHRcdGlkOiBgcyR7dGhpcy5zdHJlYW1Db3VudGVyfWAsXG5cdFx0XHRvcGVyYXRpb246IGNhbGwub3BlcmF0aW9uLFxuXHRcdFx0c2VxOiAwLFxuXHRcdFx0b3BlbjogZmFsc2UsXG5cdFx0fTtcblx0XHQvLyBGcmFtZXMgdGhlIHNjcmlwdCBlbWl0cyBiZWZvcmUgdGhlIGFja25vd2xlZGdlbWVudCBpcyBkZWNpZGVkIGFyZSBoZWxkXG5cdFx0Ly8gYmFjazogYSByZWZ1c2VkIHN1YnNjcmlwdGlvbiBzZW5kcyBub25lLCBhbiBhY2NlcHRlZCBvbmUgc2VuZHMgdGhlbVxuXHRcdC8vIGFmdGVyIHRoZSBhY2tub3dsZWRnZW1lbnQsIHNvIHRoZSBrZXJuZWwgaGFzIHJlZ2lzdGVyZWQgdGhlXG5cdFx0Ly8gc3Vic2NyaXB0aW9uIGJ5IHRoZSB0aW1lIHRoZSBmaXJzdCBmcmFtZSByZWFjaGVzIGl0LlxuXHRcdGNvbnN0IGhlbGQ6IHVua25vd25bXSA9IFtdO1xuXHRcdGxldCBzaW5rID0gKGZyYW1lOiB1bmtub3duKTogdm9pZCA9PiB7XG5cdFx0XHRoZWxkLnB1c2goZnJhbWUpO1xuXHRcdH07XG5cdFx0Y29uc3Qgc3RyZWFtID0gdGhpcy5zY3JpcHRlZChvcGVuLCAoZnJhbWUpID0+IHNpbmsoZnJhbWUpKTtcblx0XHRjb25zdCBhY2sgPSBleHBlY3RhdGlvbi5vcHRpb25zLmFjayA/PyAoKCkgPT4gUHJvbWlzZS5yZXNvbHZlKCkpO1xuXHRcdGFjaygpXG5cdFx0XHQudGhlbigoKSA9PlxuXHRcdFx0XHR0aGlzLnJlc29sdmVIYW5kbGVyKGNhbGwsICgpID0+IHtcblx0XHRcdFx0XHRvcGVuLm9wZW4gPSB0cnVlO1xuXHRcdFx0XHRcdHJldHVybiBleHBlY3RhdGlvbi5zY3JpcHQoY2FsbC5wYXlsb2FkID8/IHt9LCBzdHJlYW0pO1xuXHRcdFx0XHR9KSxcblx0XHRcdClcblx0XHRcdC50aGVuKChvdXRjb21lKSA9PiB7XG5cdFx0XHRcdGlmIChvdXRjb21lID09PSBTSUxFTkNFIHx8IGlzRmF1bHQob3V0Y29tZSkpIHtcblx0XHRcdFx0XHRvcGVuLm9wZW4gPSBmYWxzZTtcblx0XHRcdFx0XHRoZWxkLmxlbmd0aCA9IDA7XG5cdFx0XHRcdFx0aWYgKGlzRmF1bHQob3V0Y29tZSkpIHtcblx0XHRcdFx0XHRcdHRoaXMuZGVsaXZlckZhaWx1cmUoXG5cdFx0XHRcdFx0XHRcdGNhbGwuY2FsbElkLFxuXHRcdFx0XHRcdFx0XHRvdXRjb21lLmZhdWx0LmNvZGUsXG5cdFx0XHRcdFx0XHRcdG91dGNvbWUuZmF1bHQubWVzc2FnZSxcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAodGhpcy5saXN0ZW5lclNldC5zaXplID09PSAwKSB7XG5cdFx0XHRcdFx0Ly8gVGhlIHZpZXcgZGV0YWNoZWQgd2hpbGUgdGhlIGhvc3Qgd2FzIGRlY2lkaW5nOiBub3RoaW5nIHRvXG5cdFx0XHRcdFx0Ly8gYWNrbm93bGVkZ2UgdG8sIG5vdGhpbmcgdG8ga2VlcCBvcGVuLlxuXHRcdFx0XHRcdG9wZW4ub3BlbiA9IGZhbHNlO1xuXHRcdFx0XHRcdGhlbGQubGVuZ3RoID0gMDtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhpcy5zdHJlYW1zLnNldChvcGVuLmlkLCBvcGVuKTtcblx0XHRcdFx0dGhpcy5kZWxpdmVyKHtcblx0XHRcdFx0XHRwcm90b2NvbDogUFJPVE9DT0wsXG5cdFx0XHRcdFx0Y2FsbF9pZDogY2FsbC5jYWxsSWQsXG5cdFx0XHRcdFx0b2s6IHRydWUsXG5cdFx0XHRcdFx0dmFsdWU6IHtcblx0XHRcdFx0XHRcdHN1YnNjcmlwdGlvbl9pZDogb3Blbi5pZCxcblx0XHRcdFx0XHRcdGNhcGFjaXR5OiBTVUJTQ1JJUFRJT05fQ0FQQUNJVFksXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHNpbmsgPSAoZnJhbWUpID0+IHRoaXMuZGVsaXZlcihmcmFtZSk7XG5cdFx0XHRcdGZvciAoY29uc3QgZnJhbWUgb2YgaGVsZCkge1xuXHRcdFx0XHRcdHNpbmsoZnJhbWUpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGhlbGQubGVuZ3RoID0gMDtcblx0XHRcdH0pO1xuXHR9XG5cblx0cHJpdmF0ZSByZXNvbHZlSGFuZGxlcihcblx0XHRjYWxsOiBSZWNvcmRlZENhbGwsXG5cdFx0cnVuOiAoKSA9PiB1bmtub3duLFxuXHQpOiBQcm9taXNlPHVua25vd24+IHtcblx0XHRyZXR1cm4gbmV3IFByb21pc2U8dW5rbm93bj4oKHJlc29sdmUpID0+IHtcblx0XHRcdHJlc29sdmUocnVuKCkpO1xuXHRcdH0pLmNhdGNoKChlcnJvcjogdW5rbm93bikgPT4ge1xuXHRcdFx0Y29uc3QgbWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcblx0XHRcdHRoaXMucHJvYmxlbXMucHVzaChcblx0XHRcdFx0YGhhbmRsZXIgZm9yICR7Y2FsbC5raW5kfSAke2NhbGwub3BlcmF0aW9ufSB0aHJldzogJHttZXNzYWdlfWAsXG5cdFx0XHQpO1xuXHRcdFx0cmV0dXJuIGZhdWx0KFwiaGFybmVzc19lcnJvclwiLCBtZXNzYWdlKTtcblx0XHR9KTtcblx0fVxuXG5cdHByaXZhdGUgc2NyaXB0ZWQoXG5cdFx0b3BlbjogT3BlblN0cmVhbSxcblx0XHRzaW5rOiAoZnJhbWU6IHVua25vd24pID0+IHZvaWQsXG5cdCk6IFNjcmlwdGVkU3RyZWFtIHtcblx0XHRjb25zdCByZXF1aXJlT3BlbiA9ICh2ZXJiOiBzdHJpbmcpOiB2b2lkID0+IHtcblx0XHRcdGlmICghb3Blbi5vcGVuKSB7XG5cdFx0XHRcdHRocm93IG5ldyBRZ2lzU2RrQnJpZGdlSGFybmVzc0Vycm9yKFxuXHRcdFx0XHRcdGBjYW5ub3QgJHt2ZXJifSBvbiBzdWJzY3JpcHRpb24gJHtvcGVuLmlkfTogaXQgaXMgbm90IG9wZW5gLFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH07XG5cdFx0cmV0dXJuIHtcblx0XHRcdGlkOiBvcGVuLmlkLFxuXHRcdFx0b3BlcmF0aW9uOiBvcGVuLm9wZXJhdGlvbixcblx0XHRcdGdldCBvcGVuKCk6IGJvb2xlYW4ge1xuXHRcdFx0XHRyZXR1cm4gb3Blbi5vcGVuO1xuXHRcdFx0fSxcblx0XHRcdGVtaXQ6IChraW5kLCBwYXlsb2FkKSA9PiB7XG5cdFx0XHRcdHJlcXVpcmVPcGVuKFwiZW1pdFwiKTtcblx0XHRcdFx0c2luayh7XG5cdFx0XHRcdFx0cHJvdG9jb2w6IFBST1RPQ09MLFxuXHRcdFx0XHRcdHN1YnNjcmlwdGlvbl9pZDogb3Blbi5pZCxcblx0XHRcdFx0XHRzZXE6IG9wZW4uc2VxLFxuXHRcdFx0XHRcdGV2ZW50OiB7IGtpbmQsIHBheWxvYWQgfSxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdG9wZW4uc2VxICs9IDE7XG5cdFx0XHR9LFxuXHRcdFx0ZW5kOiAodGVybWluYWwpID0+IHtcblx0XHRcdFx0cmVxdWlyZU9wZW4oXCJlbmRcIik7XG5cdFx0XHRcdG9wZW4ub3BlbiA9IGZhbHNlO1xuXHRcdFx0XHRzaW5rKHtcblx0XHRcdFx0XHRwcm90b2NvbDogUFJPVE9DT0wsXG5cdFx0XHRcdFx0c3Vic2NyaXB0aW9uX2lkOiBvcGVuLmlkLFxuXHRcdFx0XHRcdHNlcTogb3Blbi5zZXEsXG5cdFx0XHRcdFx0dGVybWluYWwsXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRvcGVuLnNlcSArPSAxO1xuXHRcdFx0fSxcblx0XHRcdHNraXA6IChmcmFtZXMpID0+IHtcblx0XHRcdFx0cmVxdWlyZU9wZW4oXCJza2lwXCIpO1xuXHRcdFx0XHRvcGVuLnNlcSArPSBmcmFtZXM7XG5cdFx0XHR9LFxuXHRcdH07XG5cdH1cblxuXHRwcml2YXRlIGNsb3NlRnJvbVBhZ2UoY2FsbDogUmVjb3JkZWRDYWxsKTogdm9pZCB7XG5cdFx0Y29uc3Qgb3BlbiA9XG5cdFx0XHRjYWxsLnN1YnNjcmlwdGlvbklkID09PSB1bmRlZmluZWRcblx0XHRcdFx0PyB1bmRlZmluZWRcblx0XHRcdFx0OiB0aGlzLnN0cmVhbXMuZ2V0KGNhbGwuc3Vic2NyaXB0aW9uSWQpO1xuXHRcdGNvbnN0IGRpc3Bvc2VkID0gb3Blbj8ub3BlbiA9PT0gdHJ1ZTtcblx0XHRpZiAob3BlbiAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRvcGVuLm9wZW4gPSBmYWxzZTtcblx0XHR9XG5cdFx0dGhpcy5kZWxpdmVyKHtcblx0XHRcdHByb3RvY29sOiBQUk9UT0NPTCxcblx0XHRcdGNhbGxfaWQ6IGNhbGwuY2FsbElkLFxuXHRcdFx0b2s6IHRydWUsXG5cdFx0XHR2YWx1ZTogeyBkaXNwb3NlZCB9LFxuXHRcdH0pO1xuXHR9XG5cblx0cHJpdmF0ZSBkZWxpdmVyRmFpbHVyZShjYWxsSWQ6IHN0cmluZywgY29kZTogc3RyaW5nLCBtZXNzYWdlOiBzdHJpbmcpOiB2b2lkIHtcblx0XHR0aGlzLmRlbGl2ZXIoe1xuXHRcdFx0cHJvdG9jb2w6IFBST1RPQ09MLFxuXHRcdFx0Y2FsbF9pZDogY2FsbElkLFxuXHRcdFx0b2s6IGZhbHNlLFxuXHRcdFx0ZXJyb3I6IHsgY29kZSwgbWVzc2FnZSB9LFxuXHRcdH0pO1xuXHR9XG5cblx0cHJpdmF0ZSBkcmFpbigpOiB2b2lkIHtcblx0XHRpZiAodGhpcy5kcmFpbmluZyAhPT0gbnVsbCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHR0aGlzLmRyYWluaW5nID0gKGFzeW5jICgpID0+IHtcblx0XHRcdHdoaWxlICh0aGlzLm91dGJveC5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdGF3YWl0IFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdFx0XHRjb25zdCBtZXNzYWdlID0gdGhpcy5vdXRib3guc2hpZnQoKTtcblx0XHRcdFx0Zm9yIChjb25zdCBsaXN0ZW5lciBvZiBbLi4udGhpcy5saXN0ZW5lclNldF0pIHtcblx0XHRcdFx0XHRsaXN0ZW5lcihtZXNzYWdlKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0dGhpcy5kcmFpbmluZyA9IG51bGw7XG5cdFx0fSkoKTtcblx0fVxuXG5cdC8vIC0tIHBhcnNpbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cdHByaXZhdGUgdGFrZShcblx0XHRraW5kOiBcImludm9rZVwiIHwgXCJzdWJzY3JpYmVcIixcblx0XHRvcGVyYXRpb246IHN0cmluZyxcblx0KTogRXhwZWN0YXRpb24gfCB1bmRlZmluZWQge1xuXHRcdGNvbnN0IGluZGV4ID0gdGhpcy5leHBlY3RhdGlvbnMuZmluZEluZGV4KFxuXHRcdFx0KGV4cGVjdGF0aW9uKSA9PlxuXHRcdFx0XHRleHBlY3RhdGlvbi5raW5kID09PSBraW5kICYmIGV4cGVjdGF0aW9uLm9wZXJhdGlvbiA9PT0gb3BlcmF0aW9uLFxuXHRcdCk7XG5cdFx0aWYgKGluZGV4ID09PSAtMSkge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMuZXhwZWN0YXRpb25zLnNwbGljZShpbmRleCwgMSlbMF07XG5cdH1cblxuXHRwcml2YXRlIHBhcnNlRW52ZWxvcGUobWVzc2FnZTogdW5rbm93bik6IFJlY29yZGVkQ2FsbCB7XG5cdFx0aWYgKHR5cGVvZiBtZXNzYWdlICE9PSBcIm9iamVjdFwiIHx8IG1lc3NhZ2UgPT09IG51bGwpIHtcblx0XHRcdHRocm93IG5ldyBRZ2lzU2RrQnJpZGdlSGFybmVzc0Vycm9yKFwidGhlIGNsaWVudCBzZW50IGEgbm9uLW9iamVjdFwiKTtcblx0XHR9XG5cdFx0Y29uc3QgcmF3ID0gbWVzc2FnZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblx0XHRpZiAocmF3LnByb3RvY29sICE9PSBQUk9UT0NPTCkge1xuXHRcdFx0dGhyb3cgbmV3IFFnaXNTZGtCcmlkZ2VIYXJuZXNzRXJyb3IoXG5cdFx0XHRcdGB0aGUgY2xpZW50IHNwZWFrcyBwcm90b2NvbCAke1N0cmluZyhyYXcucHJvdG9jb2wpfTsgdGhlIGhhcm5lc3MgZmFrZXMgJHtQUk9UT0NPTH1gLFxuXHRcdFx0KTtcblx0XHR9XG5cdFx0aWYgKHR5cGVvZiByYXcuY2FsbF9pZCAhPT0gXCJzdHJpbmdcIiB8fCByYXcuY2FsbF9pZC5sZW5ndGggPT09IDApIHtcblx0XHRcdHRocm93IG5ldyBRZ2lzU2RrQnJpZGdlSGFybmVzc0Vycm9yKFwidGhlIGNsaWVudCBzZW50IG5vIGNhbGxfaWRcIik7XG5cdFx0fVxuXHRcdGNvbnN0IGNhbGxJZCA9IHJhdy5jYWxsX2lkO1xuXHRcdGlmIChyYXcua2luZCA9PT0gXCJ1bnN1YnNjcmliZVwiKSB7XG5cdFx0XHRjb25zdCBzdWJzY3JpcHRpb25JZCA9IHJhdy5zdWJzY3JpcHRpb25faWQ7XG5cdFx0XHRpZiAodHlwZW9mIHN1YnNjcmlwdGlvbklkICE9PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRcdHRocm93IG5ldyBRZ2lzU2RrQnJpZGdlSGFybmVzc0Vycm9yKFxuXHRcdFx0XHRcdGAke2NhbGxJZH06IHVuc3Vic2NyaWJlIG5hbWVzIG5vIHN1YnNjcmlwdGlvbl9pZGAsXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBjYWxsOiBSZWNvcmRlZENhbGwgPSB7XG5cdFx0XHRcdGNhbGxJZCxcblx0XHRcdFx0a2luZDogXCJ1bnN1YnNjcmliZVwiLFxuXHRcdFx0XHRvcGVyYXRpb246IHRoaXMuc3RyZWFtcy5nZXQoc3Vic2NyaXB0aW9uSWQpPy5vcGVyYXRpb24gPz8gXCJcIixcblx0XHRcdFx0c3Vic2NyaXB0aW9uSWQsXG5cdFx0XHR9O1xuXHRcdFx0dGhpcy5yZWNvcmRlZC5wdXNoKGNhbGwpO1xuXHRcdFx0cmV0dXJuIGNhbGw7XG5cdFx0fVxuXHRcdGlmIChyYXcua2luZCAhPT0gXCJpbnZva2VcIiAmJiByYXcua2luZCAhPT0gXCJzdWJzY3JpYmVcIikge1xuXHRcdFx0dGhyb3cgbmV3IFFnaXNTZGtCcmlkZ2VIYXJuZXNzRXJyb3IoXG5cdFx0XHRcdGAke2NhbGxJZH06ICR7U3RyaW5nKHJhdy5raW5kKX0gaXMgbm90IGEgYnJpZGdlIGVudmVsb3BlIGtpbmRgLFxuXHRcdFx0KTtcblx0XHR9XG5cdFx0aWYgKHR5cGVvZiByYXcub3BlcmF0aW9uICE9PSBcInN0cmluZ1wiKSB7XG5cdFx0XHR0aHJvdyBuZXcgUWdpc1Nka0JyaWRnZUhhcm5lc3NFcnJvcihcblx0XHRcdFx0YCR7Y2FsbElkfTogb3BlcmF0aW9uIG11c3QgYmUgYSBzdHJpbmdgLFxuXHRcdFx0KTtcblx0XHR9XG5cdFx0Y29uc3QgcGF5bG9hZCA9XG5cdFx0XHR0eXBlb2YgcmF3LnBheWxvYWQgPT09IFwib2JqZWN0XCIgJiYgcmF3LnBheWxvYWQgIT09IG51bGxcblx0XHRcdFx0PyAocmF3LnBheWxvYWQgYXMgUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+KVxuXHRcdFx0XHQ6IHt9O1xuXHRcdGNvbnN0IGNhbGw6IFJlY29yZGVkQ2FsbCA9IHtcblx0XHRcdGNhbGxJZCxcblx0XHRcdGtpbmQ6IHJhdy5raW5kLFxuXHRcdFx0b3BlcmF0aW9uOiByYXcub3BlcmF0aW9uLFxuXHRcdFx0cGF5bG9hZCxcblx0XHR9O1xuXHRcdHRoaXMucmVjb3JkZWQucHVzaChjYWxsKTtcblx0XHRyZXR1cm4gY2FsbDtcblx0fVxufVxuXG4vKipcbiAqIENyZWF0ZSBhIGhhcm5lc3M7IGBPcGAgbmFycm93cyB0aGUgb3BlcmF0aW9ucyBhIHRlc3QgbWF5IGV4cGVjdCwgdHlwaWNhbGx5XG4gKiB0aGUgZ2VuZXJhdGVkIG1vZHVsZSdzIGBPcGVyYXRpb25JZGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVCcmlkZ2VIYXJuZXNzPFxuXHRPcCBleHRlbmRzIHN0cmluZyA9IHN0cmluZyxcbj4oKTogQnJpZGdlSGFybmVzczxPcD4ge1xuXHRyZXR1cm4gbmV3IEhhcm5lc3M8T3A+KCk7XG59XG4iCiAgXSwKICAibWFwcGluZ3MiOiAiOzs7OztBQXlCQSxJQUFNLFdBQVc7QUFDakIsSUFBTSx3QkFBd0I7QUFRdkIsU0FBUyxLQUFLLENBQUMsTUFBYyxTQUFnQztBQUFBLEVBQ25FLE9BQU8sT0FBTyxPQUFPLEVBQUUsT0FBTyxPQUFPLE9BQU8sRUFBRSxNQUFNLFFBQVEsQ0FBQyxFQUFFLENBQUM7QUFBQTtBQUdqRSxTQUFTLE9B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
|
|
365
|
+
//# debugId=A423121C49C80BCD64756E2164756E21
|
|
366
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL3Rlc3RpbmcudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiLyoqXG4gKiBBbiBpbmplY3RlZCBwZXItY2xpZW50IGhhcm5lc3MgZm9yIHRoZSBicmlkZ2UgKFRBU0stMTgsIGRlY2lzaW9uLTIzKS5cbiAqXG4gKiBUaGUgaGFybmVzcyBpcyBhIHtAbGluayBXaXJlVHJhbnNwb3J0fTogYSBwYWdlJ3Mgb3duIGBCcmlkZ2VDbGllbnRgIHNwZWFrcyB0b1xuICogaXQgZXhhY3RseSBhcyBpdCB3b3VsZCB0byBhIFFXZWJDaGFubmVsLCBhbmQgYSB0ZXN0IHNjcmlwdHMgd2hhdCB0aGUgaG9zdFxuICogYW5zd2VycyAtIHR5cGVkIHJlcGxpZXMsIGZhdWx0cywgc2lsZW5jZSwgc3RyZWFtIGV2ZW50cywgdGVybWluYWxzLCBnYXBzIC1cbiAqIHdpdGhvdXQgdG91Y2hpbmcgYSBicm93c2VyIGdsb2JhbCBvciBhIHJ1bm5pbmcgUUdJUy4gVHdvIGhhcm5lc3NlcyBhcmUgdHdvXG4gKiBob3N0cywgc28gaXNvbGF0aW9uIGJldHdlZW4gY2xpZW50cyBpcyBhIGZhY3QgYSB0ZXN0IGNhbiBwcm92ZS5cbiAqXG4gKiBXaGF0IGl0IHByb3ZlcyBpcyBib3VuZGVkLiBBIGdyZWVuIHRlc3QgaGVyZSBzYXlzIHRoZSBwYWdlIGhhbmRsZXMgdGhlXG4gKiBmcmFtZXMgYSBob3N0ICpjb3VsZCogc2VuZDsgaXQgc2F5cyBub3RoaW5nIGFib3V0IHdoYXQgYSBRV2ViRW5naW5lVmlldyBvclxuICogYSByZWFsIGhvc3QgZG9lcy4gVGhhdCBldmlkZW5jZSBsaXZlcyBpbiB0aGUgUHl0aG9uIHN1aXRlIGFuZCBpbiB0aGVcbiAqIHF1YWxpZmljYXRpb24gaGFybmVzc2VzIHJlY29yZGVkIGluIGRvYy0xNC4gS2VlcCB0aGUgdHdvIGFwYXJ0IGluIHJlcG9ydHMuXG4gKlxuICogRXZlcnl0aGluZyB0aGUgaGFybmVzcyBzZW5kcyBpcyBkZWxpdmVyZWQgYXN5bmNocm9ub3VzbHksIG9uZSBtZXNzYWdlIHBlclxuICogbWljcm90YXNrLCBzbyBhIHJlcGx5IG5ldmVyIHJlLWVudGVycyB0aGUgY2xpZW50IGluc2lkZSBpdHMgb3duIGBzZW5kYC5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG5cdEJyaWRnZVN0cmVhbVRlcm1pbmFsLFxuXHRTdHJlYW1FdmVudEtpbmQsXG5cdFdpcmVUcmFuc3BvcnQsXG59IGZyb20gXCIuL2JyaWRnZVwiO1xuaW1wb3J0IHsgUWdpc1Nka0Vycm9yIH0gZnJvbSBcIi4vZXJyb3JzXCI7XG5pbXBvcnQge1xuXHRIT1NUX09QRVJBVElPTlMsXG5cdEhPU1RfU0NIRU1BX1ZFUlNJT04sXG5cdHR5cGUgSG9zdE9wZXJhdGlvbklkLFxufSBmcm9tIFwiLi9nZW5lcmF0ZWQvaG9zdFwiO1xuaW1wb3J0IHR5cGUgeyBCcmlkZ2VTY2hlbWEsIE9wZXJhdGlvblNoYXBlLCBTdHJlYW1TaGFwZSB9IGZyb20gXCIuL3NjaGVtYVwiO1xuXG5jb25zdCBQUk9UT0NPTCA9IDE7XG5jb25zdCBTVUJTQ1JJUFRJT05fQ0FQQUNJVFkgPSA2NDtcblxuLyoqIEEgc2NyaXB0ZWQgaG9zdCBmYWlsdXJlLCByZXR1cm5lZCBmcm9tIGFuIGV4cGVjdGF0aW9uJ3MgaGFuZGxlci4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2NyaXB0ZWRGYXVsdCB7XG5cdHJlYWRvbmx5IGZhdWx0OiB7IHJlYWRvbmx5IGNvZGU6IHN0cmluZzsgcmVhZG9ubHkgbWVzc2FnZTogc3RyaW5nIH07XG59XG5cbi8qKiBTY3JpcHQgYSBmYWlsdXJlIHJlcGx5IHdpdGggdGhpcyBjb2RlIGFuZCBtZXNzYWdlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZhdWx0KGNvZGU6IHN0cmluZywgbWVzc2FnZTogc3RyaW5nKTogU2NyaXB0ZWRGYXVsdCB7XG5cdHJldHVybiBPYmplY3QuZnJlZXplKHsgZmF1bHQ6IE9iamVjdC5mcmVlemUoeyBjb2RlLCBtZXNzYWdlIH0pIH0pO1xufVxuXG5mdW5jdGlvbiBpc0ZhdWx0KHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgU2NyaXB0ZWRGYXVsdCB7XG5cdHJldHVybiAoXG5cdFx0dHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmXG5cdFx0dmFsdWUgIT09IG51bGwgJiZcblx0XHRcImZhdWx0XCIgaW4gdmFsdWUgJiZcblx0XHR0eXBlb2YgKHZhbHVlIGFzIFNjcmlwdGVkRmF1bHQpLmZhdWx0ID09PSBcIm9iamVjdFwiXG5cdCk7XG59XG5cbi8qKiBSZXR1cm4gdGhpcyBmcm9tIGEgaGFuZGxlciB0byBuZXZlciBhbnN3ZXIsIHNvIHRoZSBjbGllbnQncyB0aW1lb3V0IHNwZWFrcy4gKi9cbmV4cG9ydCBjb25zdCBTSUxFTkNFOiB1bmlxdWUgc3ltYm9sID0gU3ltYm9sKFwicWdpcy1zZGstaGFybmVzcy1zaWxlbmNlXCIpO1xuXG4vKiogQSBzdWJzY3JpcHRpb24gdGhlIHNjcmlwdCB0dXJucyBkb3duOiBhIGZhdWx0IHJlcGx5LCBvciBubyByZXBseSBhdCBhbGwuICovXG5leHBvcnQgdHlwZSBTY3JpcHRlZFJlZnVzYWwgPSBTY3JpcHRlZEZhdWx0IHwgdHlwZW9mIFNJTEVOQ0U7XG5cbi8qKlxuICogQSBzdWJzY3JpYmUgZXhwZWN0YXRpb24ncyBzY3JpcHQ6IGVtaXQgb24gYHN0cmVhbWAgbm93IG9yIGxhdGVyLCBvciByZXR1cm5cbiAqIGEgcmVmdXNhbCBpbnN0ZWFkIG9mIGFja25vd2xlZGdpbmcuXG4gKi9cbmV4cG9ydCB0eXBlIFN1YnNjcmliZVNjcmlwdDxSZXEgZXh0ZW5kcyBvYmplY3Q+ID0gKFxuXHRwYXlsb2FkOiBSZXEsXG5cdHN0cmVhbTogU2NyaXB0ZWRTdHJlYW0sXG5cdC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9Db25mdXNpbmdWb2lkVHlwZTogYSBzY3JpcHQgdGhhdCBvbmx5IGVtaXRzIHJldHVybnMgbm90aGluZ1xuKSA9PiBTY3JpcHRlZFJlZnVzYWwgfCB2b2lkO1xuXG4vKiogV2hhdCBhbiBpbnZva2UgZXhwZWN0YXRpb24gbWF5IGFuc3dlciB3aXRoLiAqL1xuZXhwb3J0IHR5cGUgU2NyaXB0ZWRSZXBseTxSZXM+ID1cblx0fCBSZXNcblx0fCBTY3JpcHRlZEZhdWx0XG5cdHwgdHlwZW9mIFNJTEVOQ0Vcblx0fCBQcm9taXNlPFJlcyB8IFNjcmlwdGVkRmF1bHQgfCB0eXBlb2YgU0lMRU5DRT47XG5cbi8qKiBBIG1lc3NhZ2UgdGhlIGNsaWVudCBzZW50LCBhcyB0aGUgaGFybmVzcyByZWNvcmRlZCBpdC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVjb3JkZWRDYWxsIHtcblx0cmVhZG9ubHkgY2FsbElkOiBzdHJpbmc7XG5cdHJlYWRvbmx5IGtpbmQ6IFwiaW52b2tlXCIgfCBcInN1YnNjcmliZVwiIHwgXCJ1bnN1YnNjcmliZVwiIHwgXCJoYW5kc2hha2VcIjtcblx0LyoqIEVtcHR5IGZvciBhIGhhbmRzaGFrZSwgd2hpY2ggbmFtZXMgbm8gb3BlcmF0aW9uLiAqL1xuXHRyZWFkb25seSBvcGVyYXRpb246IHN0cmluZztcblx0cmVhZG9ubHkgcGF5bG9hZD86IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+Pjtcblx0cmVhZG9ubHkgc3Vic2NyaXB0aW9uSWQ/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogT25lIHNjcmlwdGVkIHN1YnNjcmlwdGlvbi4gRnJhbWVzIGNhcnJ5IHRoZSBzZXF1ZW5jZSB0aGUga2VybmVsIGNoZWNrcywgc29cbiAqIGBza2lwYCBpcyB0aGUgb25lIHdheSB0byBzY3JpcHQgYSBnYXAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2NyaXB0ZWRTdHJlYW0ge1xuXHRyZWFkb25seSBpZDogc3RyaW5nO1xuXHRyZWFkb25seSBvcGVyYXRpb246IHN0cmluZztcblx0LyoqIGBmYWxzZWAgb25jZSB0aGUgaG9zdCBlbmRlZCBpdCBvciB0aGUgcGFnZSBjbG9zZWQgaXQuICovXG5cdHJlYWRvbmx5IG9wZW46IGJvb2xlYW47XG5cdGVtaXQoa2luZDogU3RyZWFtRXZlbnRLaW5kLCBwYXlsb2FkOiB1bmtub3duKTogdm9pZDtcblx0ZW5kKHRlcm1pbmFsOiBCcmlkZ2VTdHJlYW1UZXJtaW5hbCk6IHZvaWQ7XG5cdC8qKiBBZHZhbmNlIHRoZSBzZXF1ZW5jZSB3aXRob3V0IHNlbmRpbmcsIHNvIHRoZSBuZXh0IGZyYW1lIGlzIGEgZ2FwLiAqL1xuXHRza2lwKGZyYW1lczogbnVtYmVyKTogdm9pZDtcbn1cblxuLyoqIE9wdGlvbnMgZm9yIGEgc3Vic2NyaWJlIGV4cGVjdGF0aW9uLiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdWJzY3JpYmVPcHRpb25zIHtcblx0LyoqIERlbGF5IHRoZSBhY2tub3dsZWRnZW1lbnQgdW50aWwgdGhpcyBwcm9taXNlIHNldHRsZXMuICovXG5cdHJlYWRvbmx5IGFjaz86ICgpID0+IFByb21pc2U8dm9pZD47XG59XG5cbi8qKiBPcHRpb25zIGZvciB7QGxpbmsgY3JlYXRlQnJpZGdlSGFybmVzc30uICovXG5leHBvcnQgaW50ZXJmYWNlIEhhcm5lc3NPcHRpb25zIHtcblx0LyoqXG5cdCAqIFRoZSBob3N0IG9wZXJhdGlvbiBpZHMgdGhlIHNjcmlwdGVkIGhhbmRzaGFrZSBhZHZlcnRpc2VzOyBldmVyeSBjdXJhdGVkXG5cdCAqIGlkIGJ5IGRlZmF1bHQuIEEgbmFycm93ZWQgbGlzdCBpcyBob3cgYSB0ZXN0IHByb3ZlcyBhIHBhZ2UgcmVzcGVjdHNcblx0ICogYHFnaXMuaG9zdC5ncmFudGVkYCAoVEFTSy02NiBBQyAjNSkuIEEgY2FsbCBvdXRzaWRlIGl0IGlzIHN0aWxsIGFuc3dlcmVkXG5cdCAqIGJ5IHdoYXRldmVyIHRoZSB0ZXN0IHNjcmlwdGVkIC0gdHlwaWNhbGx5IGBmYXVsdChcIm5vdF9hdXRob3JpemVkXCIsIC4uLilgIC1cblx0ICogYmVjYXVzZSB0aGF0IHJlZnVzYWwgaXMgdGhlIGhvc3Qncywgbm90IHRoZSBoYXJuZXNzJ3MuXG5cdCAqL1xuXHRyZWFkb25seSBncmFudGVkPzogcmVhZG9ubHkgSG9zdE9wZXJhdGlvbklkW107XG59XG5cbi8qKlxuICogQSB0ZXN0J3Mgc2NyaXB0IHdlbnQgd3Jvbmc6IGFuIHVubWV0IG9yIHVuZXhwZWN0ZWQgY2FsbCwgYSBsZWFrZWRcbiAqIHN1YnNjcmlwdGlvbiwgYSBoYW5kbGVyIHRoYXQgdGhyZXcsIG9yIGFuIGVudmVsb3BlIHRoYXQgaXMgbm90IHByb3RvY29sIDEuXG4gKi9cbmV4cG9ydCBjbGFzcyBRZ2lzU2RrQnJpZGdlSGFybmVzc0Vycm9yIGV4dGVuZHMgUWdpc1Nka0Vycm9yIHtcblx0cHVibGljIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xuXHRcdHN1cGVyKG1lc3NhZ2UsIFwiaGFybmVzc19lcnJvclwiKTtcblx0fVxufVxuXG5pbnRlcmZhY2UgSW52b2tlRXhwZWN0YXRpb24ge1xuXHRyZWFkb25seSBraW5kOiBcImludm9rZVwiO1xuXHRyZWFkb25seSBvcGVyYXRpb246IHN0cmluZztcblx0cmVhZG9ubHkgaGFuZGxlcjogKHBheWxvYWQ6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PikgPT4gdW5rbm93bjtcbn1cblxuaW50ZXJmYWNlIFN1YnNjcmliZUV4cGVjdGF0aW9uIHtcblx0cmVhZG9ubHkga2luZDogXCJzdWJzY3JpYmVcIjtcblx0cmVhZG9ubHkgb3BlcmF0aW9uOiBzdHJpbmc7XG5cdHJlYWRvbmx5IHNjcmlwdDogU3Vic2NyaWJlU2NyaXB0PFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+Pj47XG5cdHJlYWRvbmx5IG9wdGlvbnM6IFN1YnNjcmliZU9wdGlvbnM7XG59XG5cbnR5cGUgRXhwZWN0YXRpb24gPSBJbnZva2VFeHBlY3RhdGlvbiB8IFN1YnNjcmliZUV4cGVjdGF0aW9uO1xuXG5pbnRlcmZhY2UgT3BlblN0cmVhbSB7XG5cdHJlYWRvbmx5IGlkOiBzdHJpbmc7XG5cdHJlYWRvbmx5IG9wZXJhdGlvbjogc3RyaW5nO1xuXHRzZXE6IG51bWJlcjtcblx0b3BlbjogYm9vbGVhbjtcbn1cblxuLyoqIFRoZSBoYXJuZXNzIGEgdGVzdCBob2xkczsgYWxzbyB0aGUgdHJhbnNwb3J0IGl0cyBjbGllbnQgaXMgYnVpbHQgb24uICovXG5leHBvcnQgaW50ZXJmYWNlIEJyaWRnZUhhcm5lc3M8T3AgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmc+XG5cdGV4dGVuZHMgV2lyZVRyYW5zcG9ydCB7XG5cdC8qKiBFdmVyeSBtZXNzYWdlIHRoZSBjbGllbnQgc2VudCwgaW4gb3JkZXIuICovXG5cdHJlYWRvbmx5IGNhbGxzOiByZWFkb25seSBSZWNvcmRlZENhbGxbXTtcblx0LyoqIENhbGxzIG5vIGV4cGVjdGF0aW9uIGNvdmVyZWQ7IGVhY2ggd2FzIGFuc3dlcmVkIGB1bmV4cGVjdGVkX2NhbGxgLiAqL1xuXHRyZWFkb25seSB1bmV4cGVjdGVkOiByZWFkb25seSBSZWNvcmRlZENhbGxbXTtcblx0LyoqIFN1YnNjcmlwdGlvbnMgbmVpdGhlciBlbmRlZCBieSBhIHNjcmlwdCBub3IgY2xvc2VkIGJ5IHRoZSBwYWdlLiAqL1xuXHRyZWFkb25seSBvcGVuU3Vic2NyaXB0aW9uczogcmVhZG9ubHkgc3RyaW5nW107XG5cdC8qKiBDbGllbnRzIGN1cnJlbnRseSBhdHRhY2hlZC4gKi9cblx0cmVhZG9ubHkgbGlzdGVuZXJzOiBudW1iZXI7XG5cdC8qKiBBbnN3ZXIgdGhlIG5leHQgYG9wZXJhdGlvbmAgY2FsbCB3aXRoIHdoYXQgYGhhbmRsZXJgIHJldHVybnMuICovXG5cdGV4cGVjdEludm9rZTxcblx0XHRSZXEgZXh0ZW5kcyBvYmplY3QgPSBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4sXG5cdFx0UmVzID0gdW5rbm93bixcblx0PihvcGVyYXRpb246IE9wLCBoYW5kbGVyOiAocGF5bG9hZDogUmVxKSA9PiBTY3JpcHRlZFJlcGx5PFJlcz4pOiB2b2lkO1xuXHQvKipcblx0ICogQWNrbm93bGVkZ2UgdGhlIG5leHQgYG9wZXJhdGlvbmAgc3Vic2NyaXB0aW9uIGFuZCBoYW5kIGBzY3JpcHRgIHRoZVxuXHQgKiBzdHJlYW07IHJldHVybiBhIGZhdWx0IG9yIHtAbGluayBTSUxFTkNFfSBmcm9tIGl0IHRvIHJlZnVzZSBpbnN0ZWFkLlxuXHQgKi9cblx0ZXhwZWN0U3Vic2NyaWJlPFJlcSBleHRlbmRzIG9iamVjdCA9IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+Pj4oXG5cdFx0b3BlcmF0aW9uOiBPcCxcblx0XHRzY3JpcHQ6IFN1YnNjcmliZVNjcmlwdDxSZXE+LFxuXHRcdG9wdGlvbnM/OiBTdWJzY3JpYmVPcHRpb25zLFxuXHQpOiB2b2lkO1xuXHQvKiogUHVzaCBhbnkgcmF3IG1lc3NhZ2UsIGZvciB3aGF0IG5vIGV4cGVjdGF0aW9uIGNhbiBzY3JpcHQuICovXG5cdGRlbGl2ZXIocmF3OiB1bmtub3duKTogdm9pZDtcblx0LyoqIFJlc29sdmUgb25jZSBldmVyeXRoaW5nIHF1ZXVlZCBzbyBmYXIgaGFzIGJlZW4gZGVsaXZlcmVkLiAqL1xuXHRzZXR0bGVkKCk6IFByb21pc2U8dm9pZD47XG5cdC8qKiBUaHJvdyB1bmxlc3MgZXZlcnkgZXhwZWN0YXRpb24gd2FzIG1ldCBhbmQgbm90aGluZyBsZWFrZWQuICovXG5cdGFzc2VydFNhdGlzZmllZCgpOiB2b2lkO1xufVxuXG4vKipcbiAqIFRoZSBoYXJuZXNzIHtAbGluayBjcmVhdGVCcmlkZ2VIYXJuZXNzfSByZXR1cm5zIGZvciBhIHNjaGVtYTogdGhlIHNhbWVcbiAqIGhhcm5lc3MsIHdpdGggYGV4cGVjdEludm9rZWAgYW5kIGBleHBlY3RTdWJzY3JpYmVgIHR5cGVkIGJ5IHRoZSBzY2hlbWEnc1xuICogYE9wZXJhdGlvbnNgIGFuZCBgU3RyZWFtc2AgLSBhIHBheWxvYWQgaXMgdGhlIGRlY2xhcmVkIHJlcXVlc3QsIGEgcmVwbHkgdGhlXG4gKiBkZWNsYXJlZCByZXN1bHQgLSBhbmQgYnkgdGhlIGN1cmF0ZWQgaG9zdCBpZHMsIHdob3NlIHNoYXBlcyB0aGUgaG9zdCBtb2R1bGVcbiAqIG93bnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2NoZW1hQnJpZGdlSGFybmVzczxPLCBTPlxuXHRleHRlbmRzIE9taXQ8XG5cdFx0QnJpZGdlSGFybmVzczxFeHRyYWN0PGtleW9mIE8gfCBrZXlvZiBTLCBzdHJpbmc+IHwgSG9zdE9wZXJhdGlvbklkPixcblx0XHRcImV4cGVjdEludm9rZVwiIHwgXCJleHBlY3RTdWJzY3JpYmVcIlxuXHQ+IHtcblx0ZXhwZWN0SW52b2tlPEsgZXh0ZW5kcyBFeHRyYWN0PGtleW9mIE8sIHN0cmluZz4+KFxuXHRcdG9wZXJhdGlvbjogSyxcblx0XHRoYW5kbGVyOiAoXG5cdFx0XHRwYXlsb2FkOiBPW0tdIGV4dGVuZHMgT3BlcmF0aW9uU2hhcGUgPyBPW0tdW1wicmVxdWVzdFwiXSA6IG5ldmVyLFxuXHRcdCkgPT4gU2NyaXB0ZWRSZXBseTxPW0tdIGV4dGVuZHMgT3BlcmF0aW9uU2hhcGUgPyBPW0tdW1wicmVzdWx0XCJdIDogbmV2ZXI+LFxuXHQpOiB2b2lkO1xuXHRleHBlY3RJbnZva2U8XG5cdFx0UmVxIGV4dGVuZHMgb2JqZWN0ID0gUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+LFxuXHRcdFJlcyA9IHVua25vd24sXG5cdD4oXG5cdFx0b3BlcmF0aW9uOiBIb3N0T3BlcmF0aW9uSWQsXG5cdFx0aGFuZGxlcjogKHBheWxvYWQ6IFJlcSkgPT4gU2NyaXB0ZWRSZXBseTxSZXM+LFxuXHQpOiB2b2lkO1xuXHRleHBlY3RTdWJzY3JpYmU8SyBleHRlbmRzIEV4dHJhY3Q8a2V5b2YgUywgc3RyaW5nPj4oXG5cdFx0b3BlcmF0aW9uOiBLLFxuXHRcdHNjcmlwdDogU3Vic2NyaWJlU2NyaXB0PFNbS10gZXh0ZW5kcyBTdHJlYW1TaGFwZSA/IFNbS11bXCJyZXF1ZXN0XCJdIDogbmV2ZXI+LFxuXHRcdG9wdGlvbnM/OiBTdWJzY3JpYmVPcHRpb25zLFxuXHQpOiB2b2lkO1xuXHRleHBlY3RTdWJzY3JpYmU8UmVxIGV4dGVuZHMgb2JqZWN0ID0gUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+Pihcblx0XHRvcGVyYXRpb246IEhvc3RPcGVyYXRpb25JZCxcblx0XHRzY3JpcHQ6IFN1YnNjcmliZVNjcmlwdDxSZXE+LFxuXHRcdG9wdGlvbnM/OiBTdWJzY3JpYmVPcHRpb25zLFxuXHQpOiB2b2lkO1xufVxuXG5jbGFzcyBIYXJuZXNzPE9wIGV4dGVuZHMgc3RyaW5nPiBpbXBsZW1lbnRzIEJyaWRnZUhhcm5lc3M8T3A+IHtcblx0cHJpdmF0ZSByZWFkb25seSBncmFudGVkOiByZWFkb25seSBIb3N0T3BlcmF0aW9uSWRbXTtcblx0cHJpdmF0ZSByZWFkb25seSBwbHVnaW46IEJyaWRnZVNjaGVtYSB8IG51bGw7XG5cdHByaXZhdGUgcmVhZG9ubHkgbGlzdGVuZXJTZXQgPSBuZXcgU2V0PChtZXNzYWdlOiB1bmtub3duKSA9PiB2b2lkPigpO1xuXHRwcml2YXRlIHJlYWRvbmx5IGV4cGVjdGF0aW9uczogRXhwZWN0YXRpb25bXSA9IFtdO1xuXHRwcml2YXRlIHJlYWRvbmx5IHJlY29yZGVkOiBSZWNvcmRlZENhbGxbXSA9IFtdO1xuXHRwcml2YXRlIHJlYWRvbmx5IHVuZXhwZWN0ZWRDYWxsczogUmVjb3JkZWRDYWxsW10gPSBbXTtcblx0cHJpdmF0ZSByZWFkb25seSBzdHJlYW1zID0gbmV3IE1hcDxzdHJpbmcsIE9wZW5TdHJlYW0+KCk7XG5cdHByaXZhdGUgcmVhZG9ubHkgcHJvYmxlbXM6IHN0cmluZ1tdID0gW107XG5cdHByaXZhdGUgcmVhZG9ubHkgb3V0Ym94OiB1bmtub3duW10gPSBbXTtcblx0cHJpdmF0ZSBkcmFpbmluZzogUHJvbWlzZTx2b2lkPiB8IG51bGwgPSBudWxsO1xuXHRwcml2YXRlIHN0cmVhbUNvdW50ZXIgPSAwO1xuXG5cdHB1YmxpYyBjb25zdHJ1Y3RvcihvcHRpb25zOiBIYXJuZXNzT3B0aW9ucywgcGx1Z2luOiBCcmlkZ2VTY2hlbWEgfCBudWxsKSB7XG5cdFx0dGhpcy5ncmFudGVkID0gT2JqZWN0LmZyZWV6ZShbLi4uKG9wdGlvbnMuZ3JhbnRlZCA/PyBIT1NUX09QRVJBVElPTlMpXSk7XG5cdFx0dGhpcy5wbHVnaW4gPSBwbHVnaW47XG5cdH1cblxuXHRwdWJsaWMgZ2V0IGNhbGxzKCk6IHJlYWRvbmx5IFJlY29yZGVkQ2FsbFtdIHtcblx0XHRyZXR1cm4gWy4uLnRoaXMucmVjb3JkZWRdO1xuXHR9XG5cblx0cHVibGljIGdldCB1bmV4cGVjdGVkKCk6IHJlYWRvbmx5IFJlY29yZGVkQ2FsbFtdIHtcblx0XHRyZXR1cm4gWy4uLnRoaXMudW5leHBlY3RlZENhbGxzXTtcblx0fVxuXG5cdHB1YmxpYyBnZXQgb3BlblN1YnNjcmlwdGlvbnMoKTogcmVhZG9ubHkgc3RyaW5nW10ge1xuXHRcdHJldHVybiBbLi4udGhpcy5zdHJlYW1zLnZhbHVlcygpXVxuXHRcdFx0LmZpbHRlcigoc3RyZWFtKSA9PiBzdHJlYW0ub3Blbilcblx0XHRcdC5tYXAoKHN0cmVhbSkgPT4gc3RyZWFtLmlkKTtcblx0fVxuXG5cdHB1YmxpYyBnZXQgbGlzdGVuZXJzKCk6IG51bWJlciB7XG5cdFx0cmV0dXJuIHRoaXMubGlzdGVuZXJTZXQuc2l6ZTtcblx0fVxuXG5cdHB1YmxpYyBzdWJzY3JpYmUobGlzdGVuZXI6IChtZXNzYWdlOiB1bmtub3duKSA9PiB2b2lkKTogKCkgPT4gdm9pZCB7XG5cdFx0dGhpcy5saXN0ZW5lclNldC5hZGQobGlzdGVuZXIpO1xuXHRcdHJldHVybiAoKSA9PiB7XG5cdFx0XHR0aGlzLmxpc3RlbmVyU2V0LmRlbGV0ZShsaXN0ZW5lcik7XG5cdFx0XHRpZiAodGhpcy5saXN0ZW5lclNldC5zaXplID09PSAwKSB7XG5cdFx0XHRcdC8vIFRoZSBsYXN0IGNsaWVudCBkZXRhY2hlZDogdGhlIHZpZXcgaXMgZ29uZSwgYW5kIGEgaG9zdCBkaXNwb3Nlc1xuXHRcdFx0XHQvLyB0aGUgc3Vic2NyaXB0aW9ucyBvZiBhIHZpZXcgaXQgbG9zdCAoZGVjaXNpb24tMjMpLCBzbyB0aGV5IGFyZVxuXHRcdFx0XHQvLyBubyBsb25nZXIgbGVha3MuXG5cdFx0XHRcdGZvciAoY29uc3Qgc3RyZWFtIG9mIHRoaXMuc3RyZWFtcy52YWx1ZXMoKSkge1xuXHRcdFx0XHRcdHN0cmVhbS5vcGVuID0gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xuXHR9XG5cblx0cHVibGljIHNlbmQobWVzc2FnZTogdW5rbm93bik6IHZvaWQge1xuXHRcdGNvbnN0IGVudmVsb3BlID0gdGhpcy5wYXJzZUVudmVsb3BlKG1lc3NhZ2UpO1xuXHRcdGlmIChlbnZlbG9wZS5raW5kID09PSBcInVuc3Vic2NyaWJlXCIpIHtcblx0XHRcdHRoaXMuY2xvc2VGcm9tUGFnZShlbnZlbG9wZSk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGlmIChlbnZlbG9wZS5raW5kID09PSBcImhhbmRzaGFrZVwiKSB7XG5cdFx0XHR0aGlzLmFuc3dlckhhbmRzaGFrZShlbnZlbG9wZSk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGNvbnN0IGV4cGVjdGF0aW9uID0gdGhpcy50YWtlKGVudmVsb3BlLmtpbmQsIGVudmVsb3BlLm9wZXJhdGlvbik7XG5cdFx0aWYgKGV4cGVjdGF0aW9uID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHRoaXMudW5leHBlY3RlZENhbGxzLnB1c2goZW52ZWxvcGUpO1xuXHRcdFx0dGhpcy5kZWxpdmVyRmFpbHVyZShcblx0XHRcdFx0ZW52ZWxvcGUuY2FsbElkLFxuXHRcdFx0XHRcInVuZXhwZWN0ZWRfY2FsbFwiLFxuXHRcdFx0XHRgbm8gZXhwZWN0YXRpb24gY292ZXJzICR7ZW52ZWxvcGUua2luZH0gJHtKU09OLnN0cmluZ2lmeShlbnZlbG9wZS5vcGVyYXRpb24pfWAsXG5cdFx0XHQpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRpZiAoZXhwZWN0YXRpb24ua2luZCA9PT0gXCJpbnZva2VcIikge1xuXHRcdFx0dGhpcy5hbnN3ZXJJbnZva2UoZW52ZWxvcGUsIGV4cGVjdGF0aW9uKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0dGhpcy5hbnN3ZXJTdWJzY3JpYmUoZW52ZWxvcGUsIGV4cGVjdGF0aW9uKTtcblx0fVxuXG5cdHB1YmxpYyBleHBlY3RJbnZva2U8UmVxIGV4dGVuZHMgb2JqZWN0LCBSZXM+KFxuXHRcdG9wZXJhdGlvbjogT3AsXG5cdFx0aGFuZGxlcjogKHBheWxvYWQ6IFJlcSkgPT4gU2NyaXB0ZWRSZXBseTxSZXM+LFxuXHQpOiB2b2lkIHtcblx0XHR0aGlzLmV4cGVjdGF0aW9ucy5wdXNoKHtcblx0XHRcdGtpbmQ6IFwiaW52b2tlXCIsXG5cdFx0XHRvcGVyYXRpb24sXG5cdFx0XHRoYW5kbGVyOiBoYW5kbGVyIGFzIEludm9rZUV4cGVjdGF0aW9uW1wiaGFuZGxlclwiXSxcblx0XHR9KTtcblx0fVxuXG5cdHB1YmxpYyBleHBlY3RTdWJzY3JpYmU8UmVxIGV4dGVuZHMgb2JqZWN0Pihcblx0XHRvcGVyYXRpb246IE9wLFxuXHRcdHNjcmlwdDogU3Vic2NyaWJlU2NyaXB0PFJlcT4sXG5cdFx0b3B0aW9uczogU3Vic2NyaWJlT3B0aW9ucyA9IHt9LFxuXHQpOiB2b2lkIHtcblx0XHR0aGlzLmV4cGVjdGF0aW9ucy5wdXNoKHtcblx0XHRcdGtpbmQ6IFwic3Vic2NyaWJlXCIsXG5cdFx0XHRvcGVyYXRpb24sXG5cdFx0XHRzY3JpcHQ6IHNjcmlwdCBhcyBTdWJzY3JpYmVFeHBlY3RhdGlvbltcInNjcmlwdFwiXSxcblx0XHRcdG9wdGlvbnMsXG5cdFx0fSk7XG5cdH1cblxuXHRwdWJsaWMgZGVsaXZlcihyYXc6IHVua25vd24pOiB2b2lkIHtcblx0XHR0aGlzLm91dGJveC5wdXNoKHJhdyk7XG5cdFx0dGhpcy5kcmFpbigpO1xuXHR9XG5cblx0cHVibGljIHNldHRsZWQoKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0cmV0dXJuIHRoaXMuZHJhaW5pbmcgPz8gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHRwdWJsaWMgYXNzZXJ0U2F0aXNmaWVkKCk6IHZvaWQge1xuXHRcdGNvbnN0IHByb2JsZW1zID0gWy4uLnRoaXMucHJvYmxlbXNdO1xuXHRcdGlmICh0aGlzLmV4cGVjdGF0aW9ucy5sZW5ndGggPiAwKSB7XG5cdFx0XHRjb25zdCB1bm1ldCA9IHRoaXMuZXhwZWN0YXRpb25zLm1hcChcblx0XHRcdFx0KGV4cGVjdGF0aW9uKSA9PiBgJHtleHBlY3RhdGlvbi5raW5kfSAke2V4cGVjdGF0aW9uLm9wZXJhdGlvbn1gLFxuXHRcdFx0KTtcblx0XHRcdHByb2JsZW1zLnB1c2goYHVubWV0IGV4cGVjdGF0aW9uczogJHt1bm1ldC5qb2luKFwiLCBcIil9YCk7XG5cdFx0fVxuXHRcdGlmICh0aGlzLnVuZXhwZWN0ZWRDYWxscy5sZW5ndGggPiAwKSB7XG5cdFx0XHRjb25zdCB1bmV4cGVjdGVkID0gdGhpcy51bmV4cGVjdGVkQ2FsbHMubWFwKFxuXHRcdFx0XHQoY2FsbCkgPT4gYCR7Y2FsbC5raW5kfSAke2NhbGwub3BlcmF0aW9ufWAsXG5cdFx0XHQpO1xuXHRcdFx0cHJvYmxlbXMucHVzaChgdW5leHBlY3RlZCBjYWxsczogJHt1bmV4cGVjdGVkLmpvaW4oXCIsIFwiKX1gKTtcblx0XHR9XG5cdFx0Y29uc3Qgb3BlbiA9IHRoaXMub3BlblN1YnNjcmlwdGlvbnM7XG5cdFx0aWYgKG9wZW4ubGVuZ3RoID4gMCkge1xuXHRcdFx0cHJvYmxlbXMucHVzaChgb3BlbiBzdWJzY3JpcHRpb25zOiAke29wZW4uam9pbihcIiwgXCIpfWApO1xuXHRcdH1cblx0XHRpZiAocHJvYmxlbXMubGVuZ3RoID4gMCkge1xuXHRcdFx0dGhyb3cgbmV3IFFnaXNTZGtCcmlkZ2VIYXJuZXNzRXJyb3IocHJvYmxlbXMuam9pbihcIjsgXCIpKTtcblx0XHR9XG5cdH1cblxuXHQvLyAtLSBhbnN3ZXJpbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblx0LyoqXG5cdCAqIEFuc3dlciB0aGUgaGFuZHNoYWtlIHRoZSB3YXkgYERpc3BhdGNoZXJgIGRvZXM6IHRoZSBwbHVnaW4gZGVzY3JpcHRpb25cblx0ICogdGhlIGhhcm5lc3Mgd2FzIGJ1aWx0IGZyb20gKG9yIG5vbmUpIGFuZCB0aGUgYWR2ZXJ0aXNlZCBvcGVyYXRpb24gaWRzIC1cblx0ICogdGhlIHBsdWdpbidzLCB0aGVuIHRoZSBncmFudGVkIGhvc3QgaWRzLiBObyBleHBlY3RhdGlvbiBpcyBjb25zdW1lZDogYVxuXHQgKiBoYW5kc2hha2UgaXMgdGhlIFNESydzIGZpcnN0IG1lc3NhZ2UsIG5vdCBzb21ldGhpbmcgYSB0ZXN0IHNjcmlwdHMuXG5cdCAqL1xuXHRwcml2YXRlIGFuc3dlckhhbmRzaGFrZShjYWxsOiBSZWNvcmRlZENhbGwpOiB2b2lkIHtcblx0XHRjb25zdCBkZWNsYXJlZCA9IFtcblx0XHRcdC4uLih0aGlzLnBsdWdpbj8uYWN0aW9ucyA/PyBbXSkubWFwKChhY3Rpb24pID0+IGFjdGlvbi5pZCksXG5cdFx0XHQuLi4odGhpcy5wbHVnaW4/LnN0cmVhbXMgPz8gW10pLm1hcCgoc3RyZWFtKSA9PiBzdHJlYW0uaWQpLFxuXHRcdF07XG5cdFx0dGhpcy5kZWxpdmVyKHtcblx0XHRcdHByb3RvY29sOiBQUk9UT0NPTCxcblx0XHRcdGNhbGxfaWQ6IGNhbGwuY2FsbElkLFxuXHRcdFx0b2s6IHRydWUsXG5cdFx0XHR2YWx1ZToge1xuXHRcdFx0XHRwcm90b2NvbDogUFJPVE9DT0wsXG5cdFx0XHRcdGdlbmVyYXRpb246IDAsXG5cdFx0XHRcdHBsdWdpbjogdGhpcy5wbHVnaW4sXG5cdFx0XHRcdGhvc3Rfc2NoZW1hX3ZlcnNpb246IEhPU1RfU0NIRU1BX1ZFUlNJT04sXG5cdFx0XHRcdG9wZXJhdGlvbnM6IFsuLi5kZWNsYXJlZCwgLi4udGhpcy5ncmFudGVkXS5tYXAoKGlkKSA9PiAoe1xuXHRcdFx0XHRcdGlkLFxuXHRcdFx0XHRcdHRpdGxlOiBpZCxcblx0XHRcdFx0fSkpLFxuXHRcdFx0fSxcblx0XHR9KTtcblx0fVxuXG5cdHByaXZhdGUgYW5zd2VySW52b2tlKFxuXHRcdGNhbGw6IFJlY29yZGVkQ2FsbCxcblx0XHRleHBlY3RhdGlvbjogSW52b2tlRXhwZWN0YXRpb24sXG5cdCk6IHZvaWQge1xuXHRcdHRoaXMucmVzb2x2ZUhhbmRsZXIoY2FsbCwgKCkgPT5cblx0XHRcdGV4cGVjdGF0aW9uLmhhbmRsZXIoY2FsbC5wYXlsb2FkID8/IHt9KSxcblx0XHQpLnRoZW4oKHJlcGx5KSA9PiB7XG5cdFx0XHRpZiAocmVwbHkgPT09IFNJTEVOQ0UpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGlzRmF1bHQocmVwbHkpKSB7XG5cdFx0XHRcdHRoaXMuZGVsaXZlckZhaWx1cmUoY2FsbC5jYWxsSWQsIHJlcGx5LmZhdWx0LmNvZGUsIHJlcGx5LmZhdWx0Lm1lc3NhZ2UpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHR0aGlzLmRlbGl2ZXIoe1xuXHRcdFx0XHRwcm90b2NvbDogUFJPVE9DT0wsXG5cdFx0XHRcdGNhbGxfaWQ6IGNhbGwuY2FsbElkLFxuXHRcdFx0XHRvazogdHJ1ZSxcblx0XHRcdFx0dmFsdWU6IHJlcGx5LFxuXHRcdFx0fSk7XG5cdFx0fSk7XG5cdH1cblxuXHRwcml2YXRlIGFuc3dlclN1YnNjcmliZShcblx0XHRjYWxsOiBSZWNvcmRlZENhbGwsXG5cdFx0ZXhwZWN0YXRpb246IFN1YnNjcmliZUV4cGVjdGF0aW9uLFxuXHQpOiB2b2lkIHtcblx0XHR0aGlzLnN0cmVhbUNvdW50ZXIgKz0gMTtcblx0XHRjb25zdCBvcGVuOiBPcGVuU3RyZWFtID0ge1xuXHRcdFx0aWQ6IGBzJHt0aGlzLnN0cmVhbUNvdW50ZXJ9YCxcblx0XHRcdG9wZXJhdGlvbjogY2FsbC5vcGVyYXRpb24sXG5cdFx0XHRzZXE6IDAsXG5cdFx0XHRvcGVuOiBmYWxzZSxcblx0XHR9O1xuXHRcdC8vIEZyYW1lcyB0aGUgc2NyaXB0IGVtaXRzIGJlZm9yZSB0aGUgYWNrbm93bGVkZ2VtZW50IGlzIGRlY2lkZWQgYXJlIGhlbGRcblx0XHQvLyBiYWNrOiBhIHJlZnVzZWQgc3Vic2NyaXB0aW9uIHNlbmRzIG5vbmUsIGFuIGFjY2VwdGVkIG9uZSBzZW5kcyB0aGVtXG5cdFx0Ly8gYWZ0ZXIgdGhlIGFja25vd2xlZGdlbWVudCwgc28gdGhlIGtlcm5lbCBoYXMgcmVnaXN0ZXJlZCB0aGVcblx0XHQvLyBzdWJzY3JpcHRpb24gYnkgdGhlIHRpbWUgdGhlIGZpcnN0IGZyYW1lIHJlYWNoZXMgaXQuXG5cdFx0Y29uc3QgaGVsZDogdW5rbm93bltdID0gW107XG5cdFx0bGV0IHNpbmsgPSAoZnJhbWU6IHVua25vd24pOiB2b2lkID0+IHtcblx0XHRcdGhlbGQucHVzaChmcmFtZSk7XG5cdFx0fTtcblx0XHRjb25zdCBzdHJlYW0gPSB0aGlzLnNjcmlwdGVkKG9wZW4sIChmcmFtZSkgPT4gc2luayhmcmFtZSkpO1xuXHRcdGNvbnN0IGFjayA9IGV4cGVjdGF0aW9uLm9wdGlvbnMuYWNrID8/ICgoKSA9PiBQcm9taXNlLnJlc29sdmUoKSk7XG5cdFx0YWNrKClcblx0XHRcdC50aGVuKCgpID0+XG5cdFx0XHRcdHRoaXMucmVzb2x2ZUhhbmRsZXIoY2FsbCwgKCkgPT4ge1xuXHRcdFx0XHRcdG9wZW4ub3BlbiA9IHRydWU7XG5cdFx0XHRcdFx0cmV0dXJuIGV4cGVjdGF0aW9uLnNjcmlwdChjYWxsLnBheWxvYWQgPz8ge30sIHN0cmVhbSk7XG5cdFx0XHRcdH0pLFxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oKG91dGNvbWUpID0+IHtcblx0XHRcdFx0aWYgKG91dGNvbWUgPT09IFNJTEVOQ0UgfHwgaXNGYXVsdChvdXRjb21lKSkge1xuXHRcdFx0XHRcdG9wZW4ub3BlbiA9IGZhbHNlO1xuXHRcdFx0XHRcdGhlbGQubGVuZ3RoID0gMDtcblx0XHRcdFx0XHRpZiAoaXNGYXVsdChvdXRjb21lKSkge1xuXHRcdFx0XHRcdFx0dGhpcy5kZWxpdmVyRmFpbHVyZShcblx0XHRcdFx0XHRcdFx0Y2FsbC5jYWxsSWQsXG5cdFx0XHRcdFx0XHRcdG91dGNvbWUuZmF1bHQuY29kZSxcblx0XHRcdFx0XHRcdFx0b3V0Y29tZS5mYXVsdC5tZXNzYWdlLFxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICh0aGlzLmxpc3RlbmVyU2V0LnNpemUgPT09IDApIHtcblx0XHRcdFx0XHQvLyBUaGUgdmlldyBkZXRhY2hlZCB3aGlsZSB0aGUgaG9zdCB3YXMgZGVjaWRpbmc6IG5vdGhpbmcgdG9cblx0XHRcdFx0XHQvLyBhY2tub3dsZWRnZSB0bywgbm90aGluZyB0byBrZWVwIG9wZW4uXG5cdFx0XHRcdFx0b3Blbi5vcGVuID0gZmFsc2U7XG5cdFx0XHRcdFx0aGVsZC5sZW5ndGggPSAwO1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0XHR0aGlzLnN0cmVhbXMuc2V0KG9wZW4uaWQsIG9wZW4pO1xuXHRcdFx0XHR0aGlzLmRlbGl2ZXIoe1xuXHRcdFx0XHRcdHByb3RvY29sOiBQUk9UT0NPTCxcblx0XHRcdFx0XHRjYWxsX2lkOiBjYWxsLmNhbGxJZCxcblx0XHRcdFx0XHRvazogdHJ1ZSxcblx0XHRcdFx0XHR2YWx1ZToge1xuXHRcdFx0XHRcdFx0c3Vic2NyaXB0aW9uX2lkOiBvcGVuLmlkLFxuXHRcdFx0XHRcdFx0Y2FwYWNpdHk6IFNVQlNDUklQVElPTl9DQVBBQ0lUWSxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0c2luayA9IChmcmFtZSkgPT4gdGhpcy5kZWxpdmVyKGZyYW1lKTtcblx0XHRcdFx0Zm9yIChjb25zdCBmcmFtZSBvZiBoZWxkKSB7XG5cdFx0XHRcdFx0c2luayhmcmFtZSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aGVsZC5sZW5ndGggPSAwO1xuXHRcdFx0fSk7XG5cdH1cblxuXHRwcml2YXRlIHJlc29sdmVIYW5kbGVyKFxuXHRcdGNhbGw6IFJlY29yZGVkQ2FsbCxcblx0XHRydW46ICgpID0+IHVua25vd24sXG5cdCk6IFByb21pc2U8dW5rbm93bj4ge1xuXHRcdHJldHVybiBuZXcgUHJvbWlzZTx1bmtub3duPigocmVzb2x2ZSkgPT4ge1xuXHRcdFx0cmVzb2x2ZShydW4oKSk7XG5cdFx0fSkuY2F0Y2goKGVycm9yOiB1bmtub3duKSA9PiB7XG5cdFx0XHRjb25zdCBtZXNzYWdlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpO1xuXHRcdFx0dGhpcy5wcm9ibGVtcy5wdXNoKFxuXHRcdFx0XHRgaGFuZGxlciBmb3IgJHtjYWxsLmtpbmR9ICR7Y2FsbC5vcGVyYXRpb259IHRocmV3OiAke21lc3NhZ2V9YCxcblx0XHRcdCk7XG5cdFx0XHRyZXR1cm4gZmF1bHQoXCJoYXJuZXNzX2Vycm9yXCIsIG1lc3NhZ2UpO1xuXHRcdH0pO1xuXHR9XG5cblx0cHJpdmF0ZSBzY3JpcHRlZChcblx0XHRvcGVuOiBPcGVuU3RyZWFtLFxuXHRcdHNpbms6IChmcmFtZTogdW5rbm93bikgPT4gdm9pZCxcblx0KTogU2NyaXB0ZWRTdHJlYW0ge1xuXHRcdGNvbnN0IHJlcXVpcmVPcGVuID0gKHZlcmI6IHN0cmluZyk6IHZvaWQgPT4ge1xuXHRcdFx0aWYgKCFvcGVuLm9wZW4pIHtcblx0XHRcdFx0dGhyb3cgbmV3IFFnaXNTZGtCcmlkZ2VIYXJuZXNzRXJyb3IoXG5cdFx0XHRcdFx0YGNhbm5vdCAke3ZlcmJ9IG9uIHN1YnNjcmlwdGlvbiAke29wZW4uaWR9OiBpdCBpcyBub3Qgb3BlbmAsXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fTtcblx0XHRyZXR1cm4ge1xuXHRcdFx0aWQ6IG9wZW4uaWQsXG5cdFx0XHRvcGVyYXRpb246IG9wZW4ub3BlcmF0aW9uLFxuXHRcdFx0Z2V0IG9wZW4oKTogYm9vbGVhbiB7XG5cdFx0XHRcdHJldHVybiBvcGVuLm9wZW47XG5cdFx0XHR9LFxuXHRcdFx0ZW1pdDogKGtpbmQsIHBheWxvYWQpID0+IHtcblx0XHRcdFx0cmVxdWlyZU9wZW4oXCJlbWl0XCIpO1xuXHRcdFx0XHRzaW5rKHtcblx0XHRcdFx0XHRwcm90b2NvbDogUFJPVE9DT0wsXG5cdFx0XHRcdFx0c3Vic2NyaXB0aW9uX2lkOiBvcGVuLmlkLFxuXHRcdFx0XHRcdHNlcTogb3Blbi5zZXEsXG5cdFx0XHRcdFx0ZXZlbnQ6IHsga2luZCwgcGF5bG9hZCB9LFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0b3Blbi5zZXEgKz0gMTtcblx0XHRcdH0sXG5cdFx0XHRlbmQ6ICh0ZXJtaW5hbCkgPT4ge1xuXHRcdFx0XHRyZXF1aXJlT3BlbihcImVuZFwiKTtcblx0XHRcdFx0b3Blbi5vcGVuID0gZmFsc2U7XG5cdFx0XHRcdHNpbmsoe1xuXHRcdFx0XHRcdHByb3RvY29sOiBQUk9UT0NPTCxcblx0XHRcdFx0XHRzdWJzY3JpcHRpb25faWQ6IG9wZW4uaWQsXG5cdFx0XHRcdFx0c2VxOiBvcGVuLnNlcSxcblx0XHRcdFx0XHR0ZXJtaW5hbCxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdG9wZW4uc2VxICs9IDE7XG5cdFx0XHR9LFxuXHRcdFx0c2tpcDogKGZyYW1lcykgPT4ge1xuXHRcdFx0XHRyZXF1aXJlT3BlbihcInNraXBcIik7XG5cdFx0XHRcdG9wZW4uc2VxICs9IGZyYW1lcztcblx0XHRcdH0sXG5cdFx0fTtcblx0fVxuXG5cdHByaXZhdGUgY2xvc2VGcm9tUGFnZShjYWxsOiBSZWNvcmRlZENhbGwpOiB2b2lkIHtcblx0XHRjb25zdCBvcGVuID1cblx0XHRcdGNhbGwuc3Vic2NyaXB0aW9uSWQgPT09IHVuZGVmaW5lZFxuXHRcdFx0XHQ/IHVuZGVmaW5lZFxuXHRcdFx0XHQ6IHRoaXMuc3RyZWFtcy5nZXQoY2FsbC5zdWJzY3JpcHRpb25JZCk7XG5cdFx0Y29uc3QgZGlzcG9zZWQgPSBvcGVuPy5vcGVuID09PSB0cnVlO1xuXHRcdGlmIChvcGVuICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdG9wZW4ub3BlbiA9IGZhbHNlO1xuXHRcdH1cblx0XHR0aGlzLmRlbGl2ZXIoe1xuXHRcdFx0cHJvdG9jb2w6IFBST1RPQ09MLFxuXHRcdFx0Y2FsbF9pZDogY2FsbC5jYWxsSWQsXG5cdFx0XHRvazogdHJ1ZSxcblx0XHRcdHZhbHVlOiB7IGRpc3Bvc2VkIH0sXG5cdFx0fSk7XG5cdH1cblxuXHRwcml2YXRlIGRlbGl2ZXJGYWlsdXJlKGNhbGxJZDogc3RyaW5nLCBjb2RlOiBzdHJpbmcsIG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQge1xuXHRcdHRoaXMuZGVsaXZlcih7XG5cdFx0XHRwcm90b2NvbDogUFJPVE9DT0wsXG5cdFx0XHRjYWxsX2lkOiBjYWxsSWQsXG5cdFx0XHRvazogZmFsc2UsXG5cdFx0XHRlcnJvcjogeyBjb2RlLCBtZXNzYWdlIH0sXG5cdFx0fSk7XG5cdH1cblxuXHRwcml2YXRlIGRyYWluKCk6IHZvaWQge1xuXHRcdGlmICh0aGlzLmRyYWluaW5nICE9PSBudWxsKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdHRoaXMuZHJhaW5pbmcgPSAoYXN5bmMgKCkgPT4ge1xuXHRcdFx0d2hpbGUgKHRoaXMub3V0Ym94Lmxlbmd0aCA+IDApIHtcblx0XHRcdFx0YXdhaXQgUHJvbWlzZS5yZXNvbHZlKCk7XG5cdFx0XHRcdGNvbnN0IG1lc3NhZ2UgPSB0aGlzLm91dGJveC5zaGlmdCgpO1xuXHRcdFx0XHRmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIFsuLi50aGlzLmxpc3RlbmVyU2V0XSkge1xuXHRcdFx0XHRcdGxpc3RlbmVyKG1lc3NhZ2UpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHR0aGlzLmRyYWluaW5nID0gbnVsbDtcblx0XHR9KSgpO1xuXHR9XG5cblx0Ly8gLS0gcGFyc2luZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblx0cHJpdmF0ZSB0YWtlKFxuXHRcdGtpbmQ6IFwiaW52b2tlXCIgfCBcInN1YnNjcmliZVwiLFxuXHRcdG9wZXJhdGlvbjogc3RyaW5nLFxuXHQpOiBFeHBlY3RhdGlvbiB8IHVuZGVmaW5lZCB7XG5cdFx0Y29uc3QgaW5kZXggPSB0aGlzLmV4cGVjdGF0aW9ucy5maW5kSW5kZXgoXG5cdFx0XHQoZXhwZWN0YXRpb24pID0+XG5cdFx0XHRcdGV4cGVjdGF0aW9uLmtpbmQgPT09IGtpbmQgJiYgZXhwZWN0YXRpb24ub3BlcmF0aW9uID09PSBvcGVyYXRpb24sXG5cdFx0KTtcblx0XHRpZiAoaW5kZXggPT09IC0xKSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5leHBlY3RhdGlvbnMuc3BsaWNlKGluZGV4LCAxKVswXTtcblx0fVxuXG5cdHByaXZhdGUgcGFyc2VFbnZlbG9wZShtZXNzYWdlOiB1bmtub3duKTogUmVjb3JkZWRDYWxsIHtcblx0XHRpZiAodHlwZW9mIG1lc3NhZ2UgIT09IFwib2JqZWN0XCIgfHwgbWVzc2FnZSA9PT0gbnVsbCkge1xuXHRcdFx0dGhyb3cgbmV3IFFnaXNTZGtCcmlkZ2VIYXJuZXNzRXJyb3IoXCJ0aGUgY2xpZW50IHNlbnQgYSBub24tb2JqZWN0XCIpO1xuXHRcdH1cblx0XHRjb25zdCByYXcgPSBtZXNzYWdlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXHRcdGlmIChyYXcucHJvdG9jb2wgIT09IFBST1RPQ09MKSB7XG5cdFx0XHR0aHJvdyBuZXcgUWdpc1Nka0JyaWRnZUhhcm5lc3NFcnJvcihcblx0XHRcdFx0YHRoZSBjbGllbnQgc3BlYWtzIHByb3RvY29sICR7U3RyaW5nKHJhdy5wcm90b2NvbCl9OyB0aGUgaGFybmVzcyBmYWtlcyAke1BST1RPQ09MfWAsXG5cdFx0XHQpO1xuXHRcdH1cblx0XHRpZiAodHlwZW9mIHJhdy5jYWxsX2lkICE9PSBcInN0cmluZ1wiIHx8IHJhdy5jYWxsX2lkLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0dGhyb3cgbmV3IFFnaXNTZGtCcmlkZ2VIYXJuZXNzRXJyb3IoXCJ0aGUgY2xpZW50IHNlbnQgbm8gY2FsbF9pZFwiKTtcblx0XHR9XG5cdFx0Y29uc3QgY2FsbElkID0gcmF3LmNhbGxfaWQ7XG5cdFx0aWYgKHJhdy5raW5kID09PSBcInVuc3Vic2NyaWJlXCIpIHtcblx0XHRcdGNvbnN0IHN1YnNjcmlwdGlvbklkID0gcmF3LnN1YnNjcmlwdGlvbl9pZDtcblx0XHRcdGlmICh0eXBlb2Ygc3Vic2NyaXB0aW9uSWQgIT09IFwic3RyaW5nXCIpIHtcblx0XHRcdFx0dGhyb3cgbmV3IFFnaXNTZGtCcmlkZ2VIYXJuZXNzRXJyb3IoXG5cdFx0XHRcdFx0YCR7Y2FsbElkfTogdW5zdWJzY3JpYmUgbmFtZXMgbm8gc3Vic2NyaXB0aW9uX2lkYCxcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHRcdGNvbnN0IGNhbGw6IFJlY29yZGVkQ2FsbCA9IHtcblx0XHRcdFx0Y2FsbElkLFxuXHRcdFx0XHRraW5kOiBcInVuc3Vic2NyaWJlXCIsXG5cdFx0XHRcdG9wZXJhdGlvbjogdGhpcy5zdHJlYW1zLmdldChzdWJzY3JpcHRpb25JZCk/Lm9wZXJhdGlvbiA/PyBcIlwiLFxuXHRcdFx0XHRzdWJzY3JpcHRpb25JZCxcblx0XHRcdH07XG5cdFx0XHR0aGlzLnJlY29yZGVkLnB1c2goY2FsbCk7XG5cdFx0XHRyZXR1cm4gY2FsbDtcblx0XHR9XG5cdFx0aWYgKHJhdy5raW5kID09PSBcImhhbmRzaGFrZVwiKSB7XG5cdFx0XHRjb25zdCBjYWxsOiBSZWNvcmRlZENhbGwgPSB7IGNhbGxJZCwga2luZDogXCJoYW5kc2hha2VcIiwgb3BlcmF0aW9uOiBcIlwiIH07XG5cdFx0XHR0aGlzLnJlY29yZGVkLnB1c2goY2FsbCk7XG5cdFx0XHRyZXR1cm4gY2FsbDtcblx0XHR9XG5cdFx0aWYgKHJhdy5raW5kICE9PSBcImludm9rZVwiICYmIHJhdy5raW5kICE9PSBcInN1YnNjcmliZVwiKSB7XG5cdFx0XHR0aHJvdyBuZXcgUWdpc1Nka0JyaWRnZUhhcm5lc3NFcnJvcihcblx0XHRcdFx0YCR7Y2FsbElkfTogJHtTdHJpbmcocmF3LmtpbmQpfSBpcyBub3QgYSBicmlkZ2UgZW52ZWxvcGUga2luZGAsXG5cdFx0XHQpO1xuXHRcdH1cblx0XHRpZiAodHlwZW9mIHJhdy5vcGVyYXRpb24gIT09IFwic3RyaW5nXCIpIHtcblx0XHRcdHRocm93IG5ldyBRZ2lzU2RrQnJpZGdlSGFybmVzc0Vycm9yKFxuXHRcdFx0XHRgJHtjYWxsSWR9OiBvcGVyYXRpb24gbXVzdCBiZSBhIHN0cmluZ2AsXG5cdFx0XHQpO1xuXHRcdH1cblx0XHRjb25zdCBwYXlsb2FkID1cblx0XHRcdHR5cGVvZiByYXcucGF5bG9hZCA9PT0gXCJvYmplY3RcIiAmJiByYXcucGF5bG9hZCAhPT0gbnVsbFxuXHRcdFx0XHQ/IChyYXcucGF5bG9hZCBhcyBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4pXG5cdFx0XHRcdDoge307XG5cdFx0Y29uc3QgY2FsbDogUmVjb3JkZWRDYWxsID0ge1xuXHRcdFx0Y2FsbElkLFxuXHRcdFx0a2luZDogcmF3LmtpbmQsXG5cdFx0XHRvcGVyYXRpb246IHJhdy5vcGVyYXRpb24sXG5cdFx0XHRwYXlsb2FkLFxuXHRcdH07XG5cdFx0dGhpcy5yZWNvcmRlZC5wdXNoKGNhbGwpO1xuXHRcdHJldHVybiBjYWxsO1xuXHR9XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgaGFybmVzcy5cbiAqXG4gKiBHaXZlbiB0aGUgZ2VuZXJhdGVkIGBicmlkZ2Uuc2NoZW1hLnRzYCBkZWZhdWx0IGV4cG9ydCwgdGhlIGhhcm5lc3MgaXMgdHlwZWRcbiAqIGJ5IGl0OiBgZXhwZWN0SW52b2tlKFwic2l0ZXMuc3VtbWFyeVwiLCAocGF5bG9hZCkgPT4gLi4uKWAgc2VlcyB0aGUgZGVjbGFyZWRcbiAqIHJlcXVlc3QgYW5kIG11c3QgYW5zd2VyIHdpdGggdGhlIGRlY2xhcmVkIHJlc3VsdCwgYW5kIHRoZSBoYW5kc2hha2UgaXRcbiAqIGFuc3dlcnMgYWR2ZXJ0aXNlcyB0aGUgc2NoZW1hJ3Mgb3BlcmF0aW9ucy4gV2l0aG91dCBvbmUsIGBPcGAgbmFycm93cyB0aGVcbiAqIG9wZXJhdGlvbnMgYSB0ZXN0IG1heSBleHBlY3QsIHR5cGljYWxseSBhIGdlbmVyYXRlZCBgT3BlcmF0aW9uSWRgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQnJpZGdlSGFybmVzczxPcCBleHRlbmRzIHN0cmluZyA9IHN0cmluZz4oXG5cdG9wdGlvbnM/OiBIYXJuZXNzT3B0aW9ucyxcbik6IEJyaWRnZUhhcm5lc3M8T3A+O1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUJyaWRnZUhhcm5lc3M8TywgUz4oXG5cdHNjaGVtYTogQnJpZGdlU2NoZW1hPE8sIFM+LFxuXHRvcHRpb25zPzogSGFybmVzc09wdGlvbnMsXG4pOiBTY2hlbWFCcmlkZ2VIYXJuZXNzPE8sIFM+O1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUJyaWRnZUhhcm5lc3MoXG5cdGZpcnN0OiBIYXJuZXNzT3B0aW9ucyB8IEJyaWRnZVNjaGVtYSA9IHt9LFxuXHRzZWNvbmQ6IEhhcm5lc3NPcHRpb25zID0ge30sXG4pOiBCcmlkZ2VIYXJuZXNzIHwgU2NoZW1hQnJpZGdlSGFybmVzczx1bmtub3duLCB1bmtub3duPiB7XG5cdGlmIChcInNjaGVtYV92ZXJzaW9uXCIgaW4gZmlyc3QpIHtcblx0XHRyZXR1cm4gbmV3IEhhcm5lc3M8c3RyaW5nPihzZWNvbmQsIGZpcnN0KSBhcyBTY2hlbWFCcmlkZ2VIYXJuZXNzPFxuXHRcdFx0dW5rbm93bixcblx0XHRcdHVua25vd25cblx0XHQ+O1xuXHR9XG5cdHJldHVybiBuZXcgSGFybmVzczxzdHJpbmc+KGZpcnN0LCBudWxsKTtcbn1cbiIKICBdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7OztBQStCQSxJQUFNLFdBQVc7QUFDakIsSUFBTSx3QkFBd0I7QUFRdkIsU0FBUyxLQUFLLENBQUMsTUFBYyxTQUFnQztBQUFBLEVBQ25FLE9BQU8sT0FBTyxPQUFPLEVBQUUsT0FBTyxPQUFPLE9BQU8sRUFBRSxNQUFNLFFBQVEsQ0FBQyxFQUFFLENBQUM7QUFBQTtBQUdqRSxTQUFTLE9BQU8sQ0FBQyxPQUF3QztBQUFBLEVBQ3hELE9BQ0Ms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
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@archont561/qgis-sdk",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"description": "TypeScript bridge contracts and error primitives for QGIS SDK WebEngine plugin interfaces.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -47,7 +47,7 @@
|
|
|
47
47
|
"access": "public"
|
|
48
48
|
},
|
|
49
49
|
"scripts": {
|
|
50
|
-
"build": "bunup",
|
|
50
|
+
"build": "bunup && tsc -p tsconfig.dist.json",
|
|
51
51
|
"test": "bun test",
|
|
52
52
|
"coverage": "bun --cwd=../.. --config=bunfig.toml test --coverage packages/qgis-sdk-typescript/tests",
|
|
53
53
|
"typecheck": "tsc --noEmit",
|
|
@@ -1,207 +0,0 @@
|
|
|
1
|
-
// src/index.ts
|
|
2
|
-
var MAX_SAFE_INTEGER2 = 9007199254740991;
|
|
3
|
-
var MIN_SAFE_INTEGER2 = -9007199254740991;
|
|
4
|
-
var PLUGIN_DESCRIPTION_SCHEMA_VERSION2 = 1;
|
|
5
|
-
var STREAM_EVENT_KINDS = [
|
|
6
|
-
"data",
|
|
7
|
-
"progress",
|
|
8
|
-
"state"
|
|
9
|
-
];
|
|
10
|
-
function isSafeJsonInteger2(value) {
|
|
11
|
-
return typeof value === "number" && Number.isSafeInteger(value);
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
class QgisSdkError2 extends Error {
|
|
15
|
-
code;
|
|
16
|
-
constructor(message, code = "sdk_error") {
|
|
17
|
-
super(message);
|
|
18
|
-
this.name = new.target.name;
|
|
19
|
-
this.code = code;
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
class QgisSdkScopeClosedError2 extends QgisSdkError2 {
|
|
24
|
-
constructor() {
|
|
25
|
-
super("This resource scope has been disposed", "scope_closed");
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
class QgisSdkUnsupportedCapabilityError2 extends QgisSdkError2 {
|
|
30
|
-
capability;
|
|
31
|
-
constructor(capability) {
|
|
32
|
-
super(`Capability ${JSON.stringify(capability)} is unavailable in this runtime`, "unsupported_capability");
|
|
33
|
-
this.capability = capability;
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
class QgisSdkDeclarationError2 extends QgisSdkError2 {
|
|
38
|
-
constructor(message) {
|
|
39
|
-
super(message, "invalid_declaration");
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
class QgisSdkValidationIssue2 {
|
|
44
|
-
path;
|
|
45
|
-
code;
|
|
46
|
-
constructor(path, code) {
|
|
47
|
-
this.path = Object.freeze([...path]);
|
|
48
|
-
this.code = code;
|
|
49
|
-
}
|
|
50
|
-
toJSON() {
|
|
51
|
-
return {
|
|
52
|
-
path: [...this.path],
|
|
53
|
-
code: this.code
|
|
54
|
-
};
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
class QgisSdkContractValidationError2 extends QgisSdkError2 {
|
|
59
|
-
direction;
|
|
60
|
-
issues;
|
|
61
|
-
constructor(direction, issues) {
|
|
62
|
-
const prefix = direction === "request" ? "Request" : "Result";
|
|
63
|
-
super(`${prefix} contract validation failed`, "contract_validation_failed");
|
|
64
|
-
this.direction = direction;
|
|
65
|
-
this.issues = Object.freeze([...issues]);
|
|
66
|
-
}
|
|
67
|
-
toJSON() {
|
|
68
|
-
return {
|
|
69
|
-
code: this.code,
|
|
70
|
-
direction: this.direction,
|
|
71
|
-
issues: this.issues.map((issue) => issue.toJSON())
|
|
72
|
-
};
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
var DECLARATION_ID_PATTERN = /^[a-zA-Z][a-zA-Z0-9_.-]*$/;
|
|
76
|
-
var PYTHON_IDENTIFIER_PATTERN = /^[a-zA-Z_][a-zA-Z0-9_]*$/;
|
|
77
|
-
function isPlainRecord2(value) {
|
|
78
|
-
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
79
|
-
}
|
|
80
|
-
function validateDeclarationId(value, label) {
|
|
81
|
-
if (typeof value !== "string" || !DECLARATION_ID_PATTERN.test(value)) {
|
|
82
|
-
throw new QgisSdkDeclarationError2(`Invalid ${label} id: expected [a-zA-Z][a-zA-Z0-9_.-]*`);
|
|
83
|
-
}
|
|
84
|
-
return value;
|
|
85
|
-
}
|
|
86
|
-
function validateNonBlankTitle(value, id) {
|
|
87
|
-
if (typeof value !== "string" || value.trim().length === 0) {
|
|
88
|
-
throw new QgisSdkDeclarationError2(`${id}: title must be a nonempty string`);
|
|
89
|
-
}
|
|
90
|
-
return value;
|
|
91
|
-
}
|
|
92
|
-
function parseOperationHead(raw, label) {
|
|
93
|
-
if (!isPlainRecord2(raw)) {
|
|
94
|
-
throw new QgisSdkDeclarationError2(`${label[0]?.toUpperCase()}${label.slice(1)} description must be an object`);
|
|
95
|
-
}
|
|
96
|
-
const id = validateDeclarationId(raw.id, label);
|
|
97
|
-
const title = validateNonBlankTitle(raw.title, id);
|
|
98
|
-
if (typeof raw.handler !== "string" || !PYTHON_IDENTIFIER_PATTERN.test(raw.handler)) {
|
|
99
|
-
throw new QgisSdkDeclarationError2(`${id}: handler must be a valid Python identifier`);
|
|
100
|
-
}
|
|
101
|
-
if (!isPlainRecord2(raw.request)) {
|
|
102
|
-
throw new QgisSdkDeclarationError2(`${id}: request schema must be an object`);
|
|
103
|
-
}
|
|
104
|
-
return {
|
|
105
|
-
raw,
|
|
106
|
-
id,
|
|
107
|
-
title,
|
|
108
|
-
handler: raw.handler,
|
|
109
|
-
request: Object.freeze({ ...raw.request })
|
|
110
|
-
};
|
|
111
|
-
}
|
|
112
|
-
function parseActionDescription(raw) {
|
|
113
|
-
const head = parseOperationHead(raw, "action");
|
|
114
|
-
if (!isPlainRecord2(head.raw.result)) {
|
|
115
|
-
throw new QgisSdkDeclarationError2(`${head.id}: result schema must be an object`);
|
|
116
|
-
}
|
|
117
|
-
return Object.freeze({
|
|
118
|
-
id: head.id,
|
|
119
|
-
title: head.title,
|
|
120
|
-
handler: head.handler,
|
|
121
|
-
request: head.request,
|
|
122
|
-
result: Object.freeze({ ...head.raw.result })
|
|
123
|
-
});
|
|
124
|
-
}
|
|
125
|
-
function parseStreamDescription(raw) {
|
|
126
|
-
const head = parseOperationHead(raw, "stream");
|
|
127
|
-
const declared = head.raw.events;
|
|
128
|
-
if (!isPlainRecord2(declared) || Object.keys(declared).length === 0) {
|
|
129
|
-
throw new QgisSdkDeclarationError2(`${head.id}: events must map at least one event kind to a schema`);
|
|
130
|
-
}
|
|
131
|
-
const events = {};
|
|
132
|
-
for (const [kind, schema] of Object.entries(declared)) {
|
|
133
|
-
if (!STREAM_EVENT_KINDS.includes(kind)) {
|
|
134
|
-
throw new QgisSdkDeclarationError2(`${head.id}: ${kind} is not a stream event kind`);
|
|
135
|
-
}
|
|
136
|
-
if (!isPlainRecord2(schema)) {
|
|
137
|
-
throw new QgisSdkDeclarationError2(`${head.id}: events.${kind} schema must be an object`);
|
|
138
|
-
}
|
|
139
|
-
events[kind] = Object.freeze({ ...schema });
|
|
140
|
-
}
|
|
141
|
-
return Object.freeze({
|
|
142
|
-
id: head.id,
|
|
143
|
-
title: head.title,
|
|
144
|
-
handler: head.handler,
|
|
145
|
-
request: head.request,
|
|
146
|
-
events: Object.freeze(events)
|
|
147
|
-
});
|
|
148
|
-
}
|
|
149
|
-
function parsePluginDescription2(input) {
|
|
150
|
-
let parsed = input;
|
|
151
|
-
if (typeof input === "string") {
|
|
152
|
-
try {
|
|
153
|
-
parsed = JSON.parse(input);
|
|
154
|
-
} catch {
|
|
155
|
-
throw new QgisSdkDeclarationError2("Plugin description is not valid JSON");
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
if (!isPlainRecord2(parsed)) {
|
|
159
|
-
throw new QgisSdkDeclarationError2("Plugin description must be an object");
|
|
160
|
-
}
|
|
161
|
-
if (parsed.schema_version !== PLUGIN_DESCRIPTION_SCHEMA_VERSION2) {
|
|
162
|
-
throw new QgisSdkDeclarationError2(`Unsupported plugin description schema_version: ${String(parsed.schema_version)}`);
|
|
163
|
-
}
|
|
164
|
-
const id = validateDeclarationId(parsed.id, "plugin");
|
|
165
|
-
const title = validateNonBlankTitle(parsed.title, id);
|
|
166
|
-
if (!Array.isArray(parsed.actions)) {
|
|
167
|
-
throw new QgisSdkDeclarationError2(`${id}: actions must be an array`);
|
|
168
|
-
}
|
|
169
|
-
const declaredStreams = parsed.streams ?? [];
|
|
170
|
-
if (!Array.isArray(declaredStreams)) {
|
|
171
|
-
throw new QgisSdkDeclarationError2(`${id}: streams must be an array`);
|
|
172
|
-
}
|
|
173
|
-
const seenIds = new Set;
|
|
174
|
-
const claim = (operationId, label) => {
|
|
175
|
-
if (seenIds.has(operationId)) {
|
|
176
|
-
throw new QgisSdkDeclarationError2(`${id}: duplicate ${label} id ${operationId}`);
|
|
177
|
-
}
|
|
178
|
-
seenIds.add(operationId);
|
|
179
|
-
};
|
|
180
|
-
const actions = [];
|
|
181
|
-
for (const item of parsed.actions) {
|
|
182
|
-
const action = parseActionDescription(item);
|
|
183
|
-
claim(action.id, "action");
|
|
184
|
-
actions.push(action);
|
|
185
|
-
}
|
|
186
|
-
const streams = [];
|
|
187
|
-
for (const item of declaredStreams) {
|
|
188
|
-
const stream = parseStreamDescription(item);
|
|
189
|
-
claim(stream.id, "stream");
|
|
190
|
-
streams.push(stream);
|
|
191
|
-
}
|
|
192
|
-
const byId = (left, right) => left.id < right.id ? -1 : 1;
|
|
193
|
-
actions.sort(byId);
|
|
194
|
-
streams.sort(byId);
|
|
195
|
-
return Object.freeze({
|
|
196
|
-
schema_version: PLUGIN_DESCRIPTION_SCHEMA_VERSION2,
|
|
197
|
-
id,
|
|
198
|
-
title,
|
|
199
|
-
actions: Object.freeze(actions),
|
|
200
|
-
streams: Object.freeze(streams)
|
|
201
|
-
});
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
export { MAX_SAFE_INTEGER2, MIN_SAFE_INTEGER2, PLUGIN_DESCRIPTION_SCHEMA_VERSION2, isSafeJsonInteger2, QgisSdkError2, QgisSdkScopeClosedError2, QgisSdkUnsupportedCapabilityError2, QgisSdkDeclarationError2, QgisSdkValidationIssue2, QgisSdkContractValidationError2, isPlainRecord2, parsePluginDescription2 };
|
|
205
|
-
|
|
206
|
-
//# debugId=BF5795AE7CCB0B5464756E2164756E21
|
|
207
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL2luZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWwogICAgIi8qKlxuICogUHVibGljIDAuMS4wIGNvbnRyYWN0LCB3aXJlLWxpbWl0LCBhbmQgZXJyb3IgcHJpbWl0aXZlcyBmb3IgdGhlIFFHSVMgU0RLIGJyaWRnZS5cbiAqXG4gKiBNaXJyb3JzIHRoZSBRR0lTLWZyZWUgYHFnaXNfc2RrLm1vZGVsc2AgYW5kIGBxZ2lzX3Nkay5kZWNsYXJhdGlvbnNgXG4gKiAoYHNjaGVtYV92ZXJzaW9uID0gMWApIGNvbnRyYWN0cyB3aXRob3V0IGltcG9ydGluZyBicm93c2VyIG9yIFF0IGdsb2JhbHMuXG4gKi9cblxuZXhwb3J0IGNvbnN0IE1BWF9TQUZFX0lOVEVHRVI6IG51bWJlciA9IDlfMDA3XzE5OV8yNTRfNzQwXzk5MTtcbmV4cG9ydCBjb25zdCBNSU5fU0FGRV9JTlRFR0VSOiBudW1iZXIgPSAtOV8wMDdfMTk5XzI1NF83NDBfOTkxO1xuZXhwb3J0IGNvbnN0IFBMVUdJTl9ERVNDUklQVElPTl9TQ0hFTUFfVkVSU0lPTjogMSA9IDE7XG5cbmV4cG9ydCB0eXBlIFZhbGlkYXRpb25EaXJlY3Rpb24gPSBcInJlcXVlc3RcIiB8IFwicmVzdWx0XCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VyaWFsaXplZFZhbGlkYXRpb25Jc3N1ZSB7XG5cdHJlYWRvbmx5IHBhdGg6IChzdHJpbmcgfCBudW1iZXIpW107XG5cdHJlYWRvbmx5IGNvZGU6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTZXJpYWxpemVkQ29udHJhY3RWYWxpZGF0aW9uRXJyb3Ige1xuXHRyZWFkb25seSBjb2RlOiBzdHJpbmc7XG5cdHJlYWRvbmx5IGRpcmVjdGlvbjogVmFsaWRhdGlvbkRpcmVjdGlvbjtcblx0cmVhZG9ubHkgaXNzdWVzOiBTZXJpYWxpemVkVmFsaWRhdGlvbklzc3VlW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWN0aW9uRGVzY3JpcHRpb24ge1xuXHRyZWFkb25seSBpZDogc3RyaW5nO1xuXHRyZWFkb25seSB0aXRsZTogc3RyaW5nO1xuXHRyZWFkb25seSBoYW5kbGVyOiBzdHJpbmc7XG5cdHJlYWRvbmx5IHJlcXVlc3Q6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+Pjtcblx0cmVhZG9ubHkgcmVzdWx0OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj47XG59XG5cbi8qKiBUaGUgZXZlbnQga2luZHMgYSBzdHJlYW0gbWF5IGRlY2xhcmU7IHRoZSBmcmFtZSBjYXJyaWVzIHRoZSBzYW1lIHRocmVlLiAqL1xuZXhwb3J0IHR5cGUgU3RyZWFtRXZlbnRLaW5kID0gXCJkYXRhXCIgfCBcInByb2dyZXNzXCIgfCBcInN0YXRlXCI7XG5cbi8qKlxuICogQSBkZWNsYXJlZCBzdHJlYW0gKGRlY2lzaW9uLTI4KTogYSByZXF1ZXN0IGluLCBvbmUgcGF5bG9hZCBzY2hlbWEgcGVyXG4gKiBkZWNsYXJlZCBldmVudCBraW5kIG91dC4gVGhlcmUgaXMgbm8gYHJlc3VsdGA6IHRoZSByZXBseSB0byBhIHN1YnNjcmlwdGlvbiBpc1xuICogdGhlIHByb3RvY29sJ3MgYWNrbm93bGVkZ2VtZW50LCBub3Qgc29tZXRoaW5nIGFuIGF1dGhvciBkZWNsYXJlcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdHJlYW1EZXNjcmlwdGlvbiB7XG5cdHJlYWRvbmx5IGlkOiBzdHJpbmc7XG5cdHJlYWRvbmx5IHRpdGxlOiBzdHJpbmc7XG5cdHJlYWRvbmx5IGhhbmRsZXI6IHN0cmluZztcblx0cmVhZG9ubHkgcmVxdWVzdDogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+O1xuXHRyZWFkb25seSBldmVudHM6IFJlYWRvbmx5PFxuXHRcdFBhcnRpYWw8UmVjb3JkPFN0cmVhbUV2ZW50S2luZCwgUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+Pj5cblx0Pjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQbHVnaW5EZXNjcmlwdGlvbiB7XG5cdHJlYWRvbmx5IHNjaGVtYV92ZXJzaW9uOiAxO1xuXHRyZWFkb25seSBpZDogc3RyaW5nO1xuXHRyZWFkb25seSB0aXRsZTogc3RyaW5nO1xuXHRyZWFkb25seSBhY3Rpb25zOiByZWFkb25seSBBY3Rpb25EZXNjcmlwdGlvbltdO1xuXHQvKiogRGVjbGFyZWQgc3RyZWFtczsgYSBkZXNjcmlwdGlvbiBmcm9tIGEgaG9zdCB0aGF0IHByZWRhdGVzIHRoZW0gaXMgZW1wdHkuICovXG5cdHJlYWRvbmx5IHN0cmVhbXM6IHJlYWRvbmx5IFN0cmVhbURlc2NyaXB0aW9uW107XG59XG5cbmNvbnN0IFNUUkVBTV9FVkVOVF9LSU5EUzogcmVhZG9ubHkgU3RyZWFtRXZlbnRLaW5kW10gPSBbXG5cdFwiZGF0YVwiLFxuXHRcInByb2dyZXNzXCIsXG5cdFwic3RhdGVcIixcbl07XG5cbi8qKlxuICogUmV0dXJuIHdoZXRoZXIgYHZhbHVlYCBpcyBhIGZpbml0ZSBpbnRlZ2VyIHdpdGhpbiB0aGUgSmF2YVNjcmlwdC1zYWZlIHdpcmUgcmFuZ2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1NhZmVKc29uSW50ZWdlcih2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIG51bWJlciB7XG5cdHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgJiYgTnVtYmVyLmlzU2FmZUludGVnZXIodmFsdWUpO1xufVxuXG4vKipcbiAqIEJhc2UgY2xhc3MgZm9yIGV4cGVjdGVkIFNESyBlcnJvcnMgYWNyb3NzIHRoZSBicmlkZ2UgYm91bmRhcnkuXG4gKi9cbmV4cG9ydCBjbGFzcyBRZ2lzU2RrRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG5cdHB1YmxpYyByZWFkb25seSBjb2RlOiBzdHJpbmc7XG5cblx0cHVibGljIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZywgY29kZTogc3RyaW5nID0gXCJzZGtfZXJyb3JcIikge1xuXHRcdHN1cGVyKG1lc3NhZ2UpO1xuXHRcdHRoaXMubmFtZSA9IG5ldy50YXJnZXQubmFtZTtcblx0XHR0aGlzLmNvZGUgPSBjb2RlO1xuXHR9XG59XG5cbi8qKlxuICogQW4gb3BlcmF0aW9uIGF0dGVtcHRlZCB0byB1c2UgYW4gYWxyZWFkeSBkaXNwb3NlZCBvd25lciBzY29wZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFFnaXNTZGtTY29wZUNsb3NlZEVycm9yIGV4dGVuZHMgUWdpc1Nka0Vycm9yIHtcblx0cHVibGljIGNvbnN0cnVjdG9yKCkge1xuXHRcdHN1cGVyKFwiVGhpcyByZXNvdXJjZSBzY29wZSBoYXMgYmVlbiBkaXNwb3NlZFwiLCBcInNjb3BlX2Nsb3NlZFwiKTtcblx0fVxufVxuXG4vKipcbiAqIFRoZSBzZWxlY3RlZCBydW50aW1lIGRvZXMgbm90IG9mZmVyIGFuIGV4cGxpY2l0bHkgcmVxdWVzdGVkIGNhcGFiaWxpdHkuXG4gKi9cbmV4cG9ydCBjbGFzcyBRZ2lzU2RrVW5zdXBwb3J0ZWRDYXBhYmlsaXR5RXJyb3IgZXh0ZW5kcyBRZ2lzU2RrRXJyb3Ige1xuXHRwdWJsaWMgcmVhZG9ubHkgY2FwYWJpbGl0eTogc3RyaW5nO1xuXG5cdHB1YmxpYyBjb25zdHJ1Y3RvcihjYXBhYmlsaXR5OiBzdHJpbmcpIHtcblx0XHRzdXBlcihcblx0XHRcdGBDYXBhYmlsaXR5ICR7SlNPTi5zdHJpbmdpZnkoY2FwYWJpbGl0eSl9IGlzIHVuYXZhaWxhYmxlIGluIHRoaXMgcnVudGltZWAsXG5cdFx0XHRcInVuc3VwcG9ydGVkX2NhcGFiaWxpdHlcIixcblx0XHQpO1xuXHRcdHRoaXMuY2FwYWJpbGl0eSA9IGNhcGFiaWxpdHk7XG5cdH1cbn1cblxuLyoqXG4gKiBBIGRlY2xhcmF0aW9uIGNhbm5vdCBiZSByZXByZXNlbnRlZCBvciBwYXJzZWQgaW4gdGhlIHZlcnNpb25lZCBjb250cmFjdC5cbiAqL1xuZXhwb3J0IGNsYXNzIFFnaXNTZGtEZWNsYXJhdGlvbkVycm9yIGV4dGVuZHMgUWdpc1Nka0Vycm9yIHtcblx0cHVibGljIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xuXHRcdHN1cGVyKG1lc3NhZ2UsIFwiaW52YWxpZF9kZWNsYXJhdGlvblwiKTtcblx0fVxufVxuXG4vKipcbiAqIFNhZmUsIHN0cnVjdHVyZWQgbG9jYXRpb24gYW5kIGNhdGVnb3J5IGZvciBhIHJlamVjdGVkIGNvbnRyYWN0IHZhbHVlLlxuICovXG5leHBvcnQgY2xhc3MgUWdpc1Nka1ZhbGlkYXRpb25Jc3N1ZSB7XG5cdHB1YmxpYyByZWFkb25seSBwYXRoOiByZWFkb25seSAoc3RyaW5nIHwgbnVtYmVyKVtdO1xuXHRwdWJsaWMgcmVhZG9ubHkgY29kZTogc3RyaW5nO1xuXG5cdHB1YmxpYyBjb25zdHJ1Y3RvcihwYXRoOiByZWFkb25seSAoc3RyaW5nIHwgbnVtYmVyKVtdLCBjb2RlOiBzdHJpbmcpIHtcblx0XHR0aGlzLnBhdGggPSBPYmplY3QuZnJlZXplKFsuLi5wYXRoXSk7XG5cdFx0dGhpcy5jb2RlID0gY29kZTtcblx0fVxuXG5cdHB1YmxpYyB0b0pTT04oKTogU2VyaWFsaXplZFZhbGlkYXRpb25Jc3N1ZSB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHBhdGg6IFsuLi50aGlzLnBhdGhdLFxuXHRcdFx0Y29kZTogdGhpcy5jb2RlLFxuXHRcdH07XG5cdH1cbn1cblxuLyoqXG4gKiBBIHJlcXVlc3Qgb3IgcmVzdWx0IGRpZCBub3Qgc2F0aXNmeSBpdHMgZGVjbGFyZWQgd2lyZSBjb250cmFjdC5cbiAqL1xuZXhwb3J0IGNsYXNzIFFnaXNTZGtDb250cmFjdFZhbGlkYXRpb25FcnJvciBleHRlbmRzIFFnaXNTZGtFcnJvciB7XG5cdHB1YmxpYyByZWFkb25seSBkaXJlY3Rpb246IFZhbGlkYXRpb25EaXJlY3Rpb247XG5cdHB1YmxpYyByZWFkb25seSBpc3N1ZXM6IHJlYWRvbmx5IFFnaXNTZGtWYWxpZGF0aW9uSXNzdWVbXTtcblxuXHRwdWJsaWMgY29uc3RydWN0b3IoXG5cdFx0ZGlyZWN0aW9uOiBWYWxpZGF0aW9uRGlyZWN0aW9uLFxuXHRcdGlzc3VlczogcmVhZG9ubHkgUWdpc1Nka1ZhbGlkYXRpb25Jc3N1ZVtdLFxuXHQpIHtcblx0XHRjb25zdCBwcmVmaXggPSBkaXJlY3Rpb24gPT09IFwicmVxdWVzdFwiID8gXCJSZXF1ZXN0XCIgOiBcIlJlc3VsdFwiO1xuXHRcdHN1cGVyKGAke3ByZWZpeH0gY29udHJhY3QgdmFsaWRhdGlvbiBmYWlsZWRgLCBcImNvbnRyYWN0X3ZhbGlkYXRpb25fZmFpbGVkXCIpO1xuXHRcdHRoaXMuZGlyZWN0aW9uID0gZGlyZWN0aW9uO1xuXHRcdHRoaXMuaXNzdWVzID0gT2JqZWN0LmZyZWV6ZShbLi4uaXNzdWVzXSk7XG5cdH1cblxuXHRwdWJsaWMgdG9KU09OKCk6IFNlcmlhbGl6ZWRDb250cmFjdFZhbGlkYXRpb25FcnJvciB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdGNvZGU6IHRoaXMuY29kZSxcblx0XHRcdGRpcmVjdGlvbjogdGhpcy5kaXJlY3Rpb24sXG5cdFx0XHRpc3N1ZXM6IHRoaXMuaXNzdWVzLm1hcCgoaXNzdWUpID0+IGlzc3VlLnRvSlNPTigpKSxcblx0XHR9O1xuXHR9XG59XG5cbmNvbnN0IERFQ0xBUkFUSU9OX0lEX1BBVFRFUk4gPSAvXlthLXpBLVpdW2EtekEtWjAtOV8uLV0qJC87XG5jb25zdCBQWVRIT05fSURFTlRJRklFUl9QQVRURVJOID0gL15bYS16QS1aX11bYS16QS1aMC05X10qJC87XG5cbi8qKlxuICogUmV0dXJuIHdoZXRoZXIgYHZhbHVlYCBpcyBhIG5vbi1udWxsLCBub24tYXJyYXkgb2JqZWN0OiB0aGUgc2hhcGUgZXZlcnkgd2lyZVxuICogZW52ZWxvcGUsIGRlc2NyaXB0aW9uIGFuZCBldmVudCBwYXlsb2FkIG11c3QgaGF2ZSBiZWZvcmUgaXRzIGZpZWxkcyBhcmUgcmVhZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUGxhaW5SZWNvcmQoXG5cdHZhbHVlOiB1bmtub3duLFxuKTogdmFsdWUgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuXHRyZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIHZhbHVlICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHZhbHVlKTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVEZWNsYXJhdGlvbklkKHZhbHVlOiB1bmtub3duLCBsYWJlbDogc3RyaW5nKTogc3RyaW5nIHtcblx0aWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJzdHJpbmdcIiB8fCAhREVDTEFSQVRJT05fSURfUEFUVEVSTi50ZXN0KHZhbHVlKSkge1xuXHRcdHRocm93IG5ldyBRZ2lzU2RrRGVjbGFyYXRpb25FcnJvcihcblx0XHRcdGBJbnZhbGlkICR7bGFiZWx9IGlkOiBleHBlY3RlZCBbYS16QS1aXVthLXpBLVowLTlfLi1dKmAsXG5cdFx0KTtcblx0fVxuXHRyZXR1cm4gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlTm9uQmxhbmtUaXRsZSh2YWx1ZTogdW5rbm93biwgaWQ6IHN0cmluZyk6IHN0cmluZyB7XG5cdGlmICh0eXBlb2YgdmFsdWUgIT09IFwic3RyaW5nXCIgfHwgdmFsdWUudHJpbSgpLmxlbmd0aCA9PT0gMCkge1xuXHRcdHRocm93IG5ldyBRZ2lzU2RrRGVjbGFyYXRpb25FcnJvcihgJHtpZH06IHRpdGxlIG11c3QgYmUgYSBub25lbXB0eSBzdHJpbmdgKTtcblx0fVxuXHRyZXR1cm4gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIHBhcnNlT3BlcmF0aW9uSGVhZChcblx0cmF3OiB1bmtub3duLFxuXHRsYWJlbDogc3RyaW5nLFxuKToge1xuXHRyZWFkb25seSByYXc6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXHRyZWFkb25seSBpZDogc3RyaW5nO1xuXHRyZWFkb25seSB0aXRsZTogc3RyaW5nO1xuXHRyZWFkb25seSBoYW5kbGVyOiBzdHJpbmc7XG5cdHJlYWRvbmx5IHJlcXVlc3Q6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+Pjtcbn0ge1xuXHRpZiAoIWlzUGxhaW5SZWNvcmQocmF3KSkge1xuXHRcdHRocm93IG5ldyBRZ2lzU2RrRGVjbGFyYXRpb25FcnJvcihcblx0XHRcdGAke2xhYmVsWzBdPy50b1VwcGVyQ2FzZSgpfSR7bGFiZWwuc2xpY2UoMSl9IGRlc2NyaXB0aW9uIG11c3QgYmUgYW4gb2JqZWN0YCxcblx0XHQpO1xuXHR9XG5cdGNvbnN0IGlkID0gdmFsaWRhdGVEZWNsYXJhdGlvbklkKHJhdy5pZCwgbGFiZWwpO1xuXHRjb25zdCB0aXRsZSA9IHZhbGlkYXRlTm9uQmxhbmtUaXRsZShyYXcudGl0bGUsIGlkKTtcblx0aWYgKFxuXHRcdHR5cGVvZiByYXcuaGFuZGxlciAhPT0gXCJzdHJpbmdcIiB8fFxuXHRcdCFQWVRIT05fSURFTlRJRklFUl9QQVRURVJOLnRlc3QocmF3LmhhbmRsZXIpXG5cdCkge1xuXHRcdHRocm93IG5ldyBRZ2lzU2RrRGVjbGFyYXRpb25FcnJvcihcblx0XHRcdGAke2lkfTogaGFuZGxlciBtdXN0IGJlIGEgdmFsaWQgUHl0aG9uIGlkZW50aWZpZXJgLFxuXHRcdCk7XG5cdH1cblx0aWYgKCFpc1BsYWluUmVjb3JkKHJhdy5yZXF1ZXN0KSkge1xuXHRcdHRocm93IG5ldyBRZ2lzU2RrRGVjbGFyYXRpb25FcnJvcihcblx0XHRcdGAke2lkfTogcmVxdWVzdCBzY2hlbWEgbXVzdCBiZSBhbiBvYmplY3RgLFxuXHRcdCk7XG5cdH1cblx0cmV0dXJuIHtcblx0XHRyYXcsXG5cdFx0aWQsXG5cdFx0dGl0bGUsXG5cdFx0aGFuZGxlcjogcmF3LmhhbmRsZXIsXG5cdFx0cmVxdWVzdDogT2JqZWN0LmZyZWV6ZSh7IC4uLnJhdy5yZXF1ZXN0IH0pLFxuXHR9O1xufVxuXG5mdW5jdGlvbiBwYXJzZUFjdGlvbkRlc2NyaXB0aW9uKHJhdzogdW5rbm93bik6IEFjdGlvbkRlc2NyaXB0aW9uIHtcblx0Y29uc3QgaGVhZCA9IHBhcnNlT3BlcmF0aW9uSGVhZChyYXcsIFwiYWN0aW9uXCIpO1xuXHRpZiAoIWlzUGxhaW5SZWNvcmQoaGVhZC5yYXcucmVzdWx0KSkge1xuXHRcdHRocm93IG5ldyBRZ2lzU2RrRGVjbGFyYXRpb25FcnJvcihcblx0XHRcdGAke2hlYWQuaWR9OiByZXN1bHQgc2NoZW1hIG11c3QgYmUgYW4gb2JqZWN0YCxcblx0XHQpO1xuXHR9XG5cdHJldHVybiBPYmplY3QuZnJlZXplKHtcblx0XHRpZDogaGVhZC5pZCxcblx0XHR0aXRsZTogaGVhZC50aXRsZSxcblx0XHRoYW5kbGVyOiBoZWFkLmhhbmRsZXIsXG5cdFx0cmVxdWVzdDogaGVhZC5yZXF1ZXN0LFxuXHRcdHJlc3VsdDogT2JqZWN0LmZyZWV6ZSh7IC4uLmhlYWQucmF3LnJlc3VsdCB9KSxcblx0fSk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlU3RyZWFtRGVzY3JpcHRpb24ocmF3OiB1bmtub3duKTogU3RyZWFtRGVzY3JpcHRpb24ge1xuXHRjb25zdCBoZWFkID0gcGFyc2VPcGVyYXRpb25IZWFkKHJhdywgXCJzdHJlYW1cIik7XG5cdGNvbnN0IGRlY2xhcmVkID0gaGVhZC5yYXcuZXZlbnRzO1xuXHRpZiAoIWlzUGxhaW5SZWNvcmQoZGVjbGFyZWQpIHx8IE9iamVjdC5rZXlzKGRlY2xhcmVkKS5sZW5ndGggPT09IDApIHtcblx0XHR0aHJvdyBuZXcgUWdpc1Nka0RlY2xhcmF0aW9uRXJyb3IoXG5cdFx0XHRgJHtoZWFkLmlkfTogZXZlbnRzIG11c3QgbWFwIGF0IGxlYXN0IG9uZSBldmVudCBraW5kIHRvIGEgc2NoZW1hYCxcblx0XHQpO1xuXHR9XG5cdGNvbnN0IGV2ZW50czogUGFydGlhbDxcblx0XHRSZWNvcmQ8U3RyZWFtRXZlbnRLaW5kLCBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4+XG5cdD4gPSB7fTtcblx0Zm9yIChjb25zdCBba2luZCwgc2NoZW1hXSBvZiBPYmplY3QuZW50cmllcyhkZWNsYXJlZCkpIHtcblx0XHRpZiAoIVNUUkVBTV9FVkVOVF9LSU5EUy5pbmNsdWRlcyhraW5kIGFzIFN0cmVhbUV2ZW50S2luZCkpIHtcblx0XHRcdHRocm93IG5ldyBRZ2lzU2RrRGVjbGFyYXRpb25FcnJvcihcblx0XHRcdFx0YCR7aGVhZC5pZH06ICR7a2luZH0gaXMgbm90IGEgc3RyZWFtIGV2ZW50IGtpbmRgLFxuXHRcdFx0KTtcblx0XHR9XG5cdFx0aWYgKCFpc1BsYWluUmVjb3JkKHNjaGVtYSkpIHtcblx0XHRcdHRocm93IG5ldyBRZ2lzU2RrRGVjbGFyYXRpb25FcnJvcihcblx0XHRcdFx0YCR7aGVhZC5pZH06IGV2ZW50cy4ke2tpbmR9IHNjaGVtYSBtdXN0IGJlIGFuIG9iamVjdGAsXG5cdFx0XHQpO1xuXHRcdH1cblx0XHRldmVudHNba2luZCBhcyBTdHJlYW1FdmVudEtpbmRdID0gT2JqZWN0LmZyZWV6ZSh7IC4uLnNjaGVtYSB9KTtcblx0fVxuXHRyZXR1cm4gT2JqZWN0LmZyZWV6ZSh7XG5cdFx0aWQ6IGhlYWQuaWQsXG5cdFx0dGl0bGU6IGhlYWQudGl0bGUsXG5cdFx0aGFuZGxlcjogaGVhZC5oYW5kbGVyLFxuXHRcdHJlcXVlc3Q6IGhlYWQucmVxdWVzdCxcblx0XHRldmVudHM6IE9iamVjdC5mcmVlemUoZXZlbnRzKSxcblx0fSk7XG59XG5cbi8qKlxuICogUGFyc2UgYW5kIHZhbGlkYXRlIGEgdmVyc2lvbiAxIGBQbHVnaW5EZXNjcmlwdGlvbmAgZW1pdHRlZCBieSBgZGVzY3JpYmVfcGx1Z2luYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUGx1Z2luRGVzY3JpcHRpb24oXG5cdGlucHV0OiBzdHJpbmcgfCBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4sXG4pOiBQbHVnaW5EZXNjcmlwdGlvbiB7XG5cdGxldCBwYXJzZWQ6IHVua25vd24gPSBpbnB1dDtcblx0aWYgKHR5cGVvZiBpbnB1dCA9PT0gXCJzdHJpbmdcIikge1xuXHRcdHRyeSB7XG5cdFx0XHRwYXJzZWQgPSBKU09OLnBhcnNlKGlucHV0KTtcblx0XHR9IGNhdGNoIHtcblx0XHRcdHRocm93IG5ldyBRZ2lzU2RrRGVjbGFyYXRpb25FcnJvcihcIlBsdWdpbiBkZXNjcmlwdGlvbiBpcyBub3QgdmFsaWQgSlNPTlwiKTtcblx0XHR9XG5cdH1cblx0aWYgKCFpc1BsYWluUmVjb3JkKHBhcnNlZCkpIHtcblx0XHR0aHJvdyBuZXcgUWdpc1Nka0RlY2xhcmF0aW9uRXJyb3IoXCJQbHVnaW4gZGVzY3JpcHRpb24gbXVzdCBiZSBhbiBvYmplY3RcIik7XG5cdH1cblx0aWYgKHBhcnNlZC5zY2hlbWFfdmVyc2lvbiAhPT0gUExVR0lOX0RFU0NSSVBUSU9OX1NDSEVNQV9WRVJTSU9OKSB7XG5cdFx0dGhyb3cgbmV3IFFnaXNTZGtEZWNsYXJhdGlvbkVycm9yKFxuXHRcdFx0YFVuc3VwcG9ydGVkIHBsdWdpbiBkZXNjcmlwdGlvbiBzY2hlbWFfdmVyc2lvbjogJHtTdHJpbmcocGFyc2VkLnNjaGVtYV92ZXJzaW9uKX1gLFxuXHRcdCk7XG5cdH1cblx0Y29uc3QgaWQgPSB2YWxpZGF0ZURlY2xhcmF0aW9uSWQocGFyc2VkLmlkLCBcInBsdWdpblwiKTtcblx0Y29uc3QgdGl0bGUgPSB2YWxpZGF0ZU5vbkJsYW5rVGl0bGUocGFyc2VkLnRpdGxlLCBpZCk7XG5cdGlmICghQXJyYXkuaXNBcnJheShwYXJzZWQuYWN0aW9ucykpIHtcblx0XHR0aHJvdyBuZXcgUWdpc1Nka0RlY2xhcmF0aW9uRXJyb3IoYCR7aWR9OiBhY3Rpb25zIG11c3QgYmUgYW4gYXJyYXlgKTtcblx0fVxuXHRjb25zdCBkZWNsYXJlZFN0cmVhbXMgPSBwYXJzZWQuc3RyZWFtcyA/PyBbXTtcblx0aWYgKCFBcnJheS5pc0FycmF5KGRlY2xhcmVkU3RyZWFtcykpIHtcblx0XHR0aHJvdyBuZXcgUWdpc1Nka0RlY2xhcmF0aW9uRXJyb3IoYCR7aWR9OiBzdHJlYW1zIG11c3QgYmUgYW4gYXJyYXlgKTtcblx0fVxuXHQvLyBBY3Rpb25zIGFuZCBzdHJlYW1zIHNoYXJlIG9uZSBpZCBuYW1lc3BhY2UgKGRlY2lzaW9uLTI4KS5cblx0Y29uc3Qgc2VlbklkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXHRjb25zdCBjbGFpbSA9IChvcGVyYXRpb25JZDogc3RyaW5nLCBsYWJlbDogc3RyaW5nKTogdm9pZCA9PiB7XG5cdFx0aWYgKHNlZW5JZHMuaGFzKG9wZXJhdGlvbklkKSkge1xuXHRcdFx0dGhyb3cgbmV3IFFnaXNTZGtEZWNsYXJhdGlvbkVycm9yKFxuXHRcdFx0XHRgJHtpZH06IGR1cGxpY2F0ZSAke2xhYmVsfSBpZCAke29wZXJhdGlvbklkfWAsXG5cdFx0XHQpO1xuXHRcdH1cblx0XHRzZWVuSWRzLmFkZChvcGVyYXRpb25JZCk7XG5cdH07XG5cdGNvbnN0IGFjdGlvbnM6IEFjdGlvbkRlc2NyaXB0aW9uW10gPSBbXTtcblx0Zm9yIChjb25zdCBpdGVtIG9mIHBhcnNlZC5hY3Rpb25zKSB7XG5cdFx0Y29uc3QgYWN0aW9uID0gcGFyc2VBY3Rpb25EZXNjcmlwdGlvbihpdGVtKTtcblx0XHRjbGFpbShhY3Rpb24uaWQsIFwiYWN0aW9uXCIpO1xuXHRcdGFjdGlvbnMucHVzaChhY3Rpb24pO1xuXHR9XG5cdGNvbnN0IHN0cmVhbXM6IFN0cmVhbURlc2NyaXB0aW9uW10gPSBbXTtcblx0Zm9yIChjb25zdCBpdGVtIG9mIGRlY2xhcmVkU3RyZWFtcykge1xuXHRcdGNvbnN0IHN0cmVhbSA9IHBhcnNlU3RyZWFtRGVzY3JpcHRpb24oaXRlbSk7XG5cdFx0Y2xhaW0oc3RyZWFtLmlkLCBcInN0cmVhbVwiKTtcblx0XHRzdHJlYW1zLnB1c2goc3RyZWFtKTtcblx0fVxuXHRjb25zdCBieUlkID0gKFxuXHRcdGxlZnQ6IHsgcmVhZG9ubHkgaWQ6IHN0cmluZyB9LFxuXHRcdHJpZ2h0OiB7IHJlYWRvbmx5IGlkOiBzdHJpbmcgfSxcblx0KTogbnVtYmVyID0+IChsZWZ0LmlkIDwgcmlnaHQuaWQgPyAtMSA6IDEpO1xuXHRhY3Rpb25zLnNvcnQoYnlJZCk7XG5cdHN0cmVhbXMuc29ydChieUlkKTtcblx0cmV0dXJuIE9iamVjdC5mcmVlemUoe1xuXHRcdHNjaGVtYV92ZXJzaW9uOiBQTFVHSU5fREVTQ1JJUFRJT05fU0NIRU1BX1ZFUlNJT04sXG5cdFx0aWQsXG5cdFx0dGl0bGUsXG5cdFx0YWN0aW9uczogT2JqZWN0LmZyZWV6ZShhY3Rpb25zKSxcblx0XHRzdHJlYW1zOiBPYmplY3QuZnJlZXplKHN0cmVhbXMpLFxuXHR9KTtcbn1cbiIKICBdLAogICJtYXBwaW5ncyI6ICI7QUFPTyxJQUFNLG9CQUEyQjtBQUNqQyxJQUFNLG9CQUEyQjtBQUNqQyxJQUFNLHFDQUF1QztBQWtEcEQsSUFBTSxxQkFBaUQ7QUFBQSxFQUN0RDtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQ0Q7QUFLTyxTQUFTLGtCQUFpQixDQUFDLE9BQWlDO0FBQUEsRUFDbEUsT0FBTyxPQUFPLFVBQVUsWUFBWSxPQUFPLGNBQWMsS0FBSztBQUFBO0FBQUE7QUFNeEQsTUFBTSxzQkFBcUIsTUFBTTtBQUFBLEVBQ3ZCO0FBQUEsRUFFVCxXQUFXLENBQUMsU0FBaUIsT0FBZSxhQUFhO0FBQUEsSUFDL0QsTUFBTSxPQUFPO0FBQUEsSUFDYixLQUFLLE9BQU8sV0FBVztBQUFBLElBQ3ZCLEtBQUssT0FBTztBQUFBO0FBRWQ7QUFBQTtBQUtPLE1BQU0saUNBQWdDLGNBQWE7QUFBQSxFQUNsRCxXQUFXLEdBQUc7QUFBQSxJQUNwQixNQUFNLHlDQUF5QyxjQUFjO0FBQUE7QUFFL0Q7QUFBQTtBQUtPLE1BQU0sMkNBQTBDLGNBQWE7QUFBQSxFQUNuRDtBQUFBLEVBRVQsV0FBVyxDQUFDLFlBQW9CO0FBQUEsSUFDdEMsTUFDQyxjQUFjLEtBQUssVUFBVSxVQUFVLG9DQUN2Qyx3QkFDRDtBQUFBLElBQ0EsS0FBSyxhQUFhO0FBQUE7QUFFcEI7QUFBQTtBQUtPLE1BQU0saUNBQWdDLGNBQWE7QUFBQSxFQUNsRCxXQUFXLENBQUMsU0FBaUI7QUFBQSxJQUNuQyxNQUFNLFNBQVMscUJBQXFCO0FBQUE7QUFFdEM7QUFBQTtBQUtPLE1BQU0sd0JBQXVCO0FBQUEsRUFDbkI7QUFBQSxFQUNBO0FBQUEsRUFFVCxXQUFXLENBQUMsTUFBb0MsTUFBYztBQUFBLElBQ3BFLEtBQUssT0FBTyxPQUFPLE9BQU8sQ0FBQyxHQUFHLElB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QUssTUFBTTtBQUFBLEVBQ3BCO0FBQUEsRUFDQSxNQUFNLFVBQStCLENBQUM7QUFBQSxFQUN0QyxXQUFXLFFBQVEsaUJBQWlCO0FBQUEsSUFDbkMsTUFBTSxTQUFTLHVCQUF1QixJQUFJO0FBQUEsSUFDMUMsTUFBTSxPQUFPLElBQUksUUFBUTtBQUFBLElBQ3pCLFFBQVEsS0FBSyxNQUFNO0FBQUEsRUFDcEI7QUFBQSxFQUNBLE1BQU0sT0FBTyxDQUNaLE1BQ0EsVUFDYSxLQUFLLEtBQUssTUFBTSxLQUFLLEtBQUs7QUFBQSxFQUN4QyxRQUFRLEtBQUssSUFBSTtBQUFBLEVBQ2pCLFFBQVEsS0FBSyxJQUFJO0FBQUEsRUFDakIsT0FBTyxPQUFPLE9BQU87QUFBQSxJQUNwQixnQkFBZ0I7QUFBQSxJQUNoQjtBQUFBLElBQ0E7QUFBQSxJQUNBLFNBQVMsT0FBTyxPQUFPLE9BQU87QUFBQSxJQUM5QixTQUFTLE9BQU8sT0FBTyxPQUFPO0FBQUEsRUFDL0IsQ0FBQztBQUFBOyIsCiAgImRlYnVnSWQiOiAiQkY1Nzk1QUU3Q0NCMEI1NDY0NzU2RTIxNjQ3NTZFMjEiLAogICJuYW1lcyI6IFtdCn0=
|