@milkio/stargate 1.1.1 → 1.1.3
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/index.js +6 -47
- package/package.json +1 -1
package/index.js
CHANGED
|
@@ -1,44 +1,7 @@
|
|
|
1
|
-
import { createRequire } from "node:module";
|
|
2
|
-
var __require = /* @__PURE__ */ createRequire(import.meta.url);
|
|
3
|
-
|
|
4
1
|
// packages/milkio-stargate/index.ts
|
|
5
2
|
async function createStargate(stargateOptions) {
|
|
6
3
|
const $fetch = stargateOptions.fetch ?? fetch;
|
|
7
4
|
const $abort = stargateOptions.abort ?? AbortController;
|
|
8
|
-
let nodeHttpRequest = null;
|
|
9
|
-
let nodeHttpAgent = null;
|
|
10
|
-
try {
|
|
11
|
-
if (typeof process !== "undefined" && typeof Bun === "undefined") {
|
|
12
|
-
const http = await import("node:http");
|
|
13
|
-
nodeHttpRequest = http.request;
|
|
14
|
-
nodeHttpAgent = new http.Agent({ keepAlive: true, maxSockets: 100 });
|
|
15
|
-
}
|
|
16
|
-
} catch {}
|
|
17
|
-
const nativeHttpPost = nodeHttpRequest ? (url, headers, body) => {
|
|
18
|
-
return new Promise((resolve, reject) => {
|
|
19
|
-
const parsedUrl = new URL(url);
|
|
20
|
-
const options = {
|
|
21
|
-
hostname: parsedUrl.hostname,
|
|
22
|
-
port: parsedUrl.port || 80,
|
|
23
|
-
path: parsedUrl.pathname + parsedUrl.search,
|
|
24
|
-
method: "POST",
|
|
25
|
-
headers: { ...headers, "Content-Length": Buffer.byteLength(body) },
|
|
26
|
-
agent: nodeHttpAgent
|
|
27
|
-
};
|
|
28
|
-
const req = nodeHttpRequest(options, (res) => {
|
|
29
|
-
let data = "";
|
|
30
|
-
res.on("data", (chunk) => {
|
|
31
|
-
data += chunk;
|
|
32
|
-
});
|
|
33
|
-
res.on("end", () => {
|
|
34
|
-
resolve(data);
|
|
35
|
-
});
|
|
36
|
-
});
|
|
37
|
-
req.on("error", reject);
|
|
38
|
-
req.write(body);
|
|
39
|
-
req.end();
|
|
40
|
-
});
|
|
41
|
-
} : null;
|
|
42
5
|
const handleError = async (error, key, handler) => {
|
|
43
6
|
if (key in error) {
|
|
44
7
|
const handled = await handler(error[key]);
|
|
@@ -138,12 +101,8 @@ async function createStargate(stargateOptions) {
|
|
|
138
101
|
const body2 = JSON.stringify(options.params) ?? "";
|
|
139
102
|
await eventManager.emit("milkio:fetchBefore", { path, options, body: body2 });
|
|
140
103
|
let text;
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
} else {
|
|
144
|
-
const response = await $fetch(url, { method: "POST", body: body2, headers: options.headers });
|
|
145
|
-
text = await response.text();
|
|
146
|
-
}
|
|
104
|
+
const response = await $fetch(url, { method: "POST", body: body2, headers: options.headers });
|
|
105
|
+
text = await response.text();
|
|
147
106
|
const parsed = reviveJSONParse(JSON.parse(text));
|
|
148
107
|
if (parsed.success !== true) {
|
|
149
108
|
const err = {};
|
|
@@ -286,7 +245,7 @@ async function createStargate(stargateOptions) {
|
|
|
286
245
|
});
|
|
287
246
|
const contentType = response.headers.get("Content-Type");
|
|
288
247
|
if (!contentType?.startsWith("text/event-stream")) {
|
|
289
|
-
throw new Error(`Expected content-type to be text/event-stream, Actual: ${contentType}`);
|
|
248
|
+
throw new Error(`Expected content-type to be ${"text/event-stream"}, Actual: ${contentType}`);
|
|
290
249
|
}
|
|
291
250
|
await getBytes(response.body, getLines(getMessages(onmessage)));
|
|
292
251
|
await iterator.return();
|
|
@@ -398,7 +357,7 @@ async function createStargate(stargateOptions) {
|
|
|
398
357
|
});
|
|
399
358
|
const contentType = response.headers.get("Content-Type");
|
|
400
359
|
if (!contentType?.startsWith("text/event-stream")) {
|
|
401
|
-
throw new Error(`Expected content-type to be text/event-stream, Actual: ${contentType}`);
|
|
360
|
+
throw new Error(`Expected content-type to be ${"text/event-stream"}, Actual: ${contentType}`);
|
|
402
361
|
}
|
|
403
362
|
await getBytes(response.body, getLines(getMessages(onmessage)));
|
|
404
363
|
await iterator.return();
|
|
@@ -748,5 +707,5 @@ export {
|
|
|
748
707
|
createDefaultCacheStorage
|
|
749
708
|
};
|
|
750
709
|
|
|
751
|
-
//# debugId=
|
|
752
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vaW5kZXgudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiZXhwb3J0IHR5cGUgTWlsa2lvU3RhcmdhdGVPcHRpb25zID0ge1xuICAgIGJhc2VVcmw6IHN0cmluZyB8ICgoKSA9PiBzdHJpbmcpIHwgKCgpID0+IFByb21pc2U8c3RyaW5nPik7XG4gICAgdGltZW91dD86IG51bWJlcjtcbiAgICBmZXRjaD86IHR5cGVvZiBmZXRjaDtcbiAgICBhYm9ydD86IHR5cGVvZiBBYm9ydENvbnRyb2xsZXI7XG4gICAgY2FjaGVTdG9yYWdlPzogQ2FjaGVTdG9yYWdlO1xuICAgIGNhY2hlRW5jcnlwdGlvbj86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgdHlwZSBNaXhpbjxULCBVPiA9IFUgJiBPbWl0PFQsIGtleW9mIFU+O1xuXG5leHBvcnQgdHlwZSBDYWNoZVN0cmF0ZWd5ID0gJ29mZicgfCAnZmFsbGJhY2snIHwgJ3Rocm90dGxlJztcblxuZXhwb3J0IHR5cGUgUmV0cnlTdHJhdGVneSA9IGJvb2xlYW4gfCBudW1iZXI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2FjaGVTdG9yYWdlIHtcbiAgICBnZXQ6IChrZXk6IHN0cmluZykgPT4gUHJvbWlzZTx7IGRhdGE6IGFueTsgdGltZXN0YW1wOiBudW1iZXIgfSB8IG51bGw+O1xuICAgIHNldDogKGtleTogc3RyaW5nLCBkYXRhOiBhbnkpID0+IFByb21pc2U8dm9pZD47XG59XG5cbmV4cG9ydCB0eXBlIEV4ZWN1dGVPcHRpb25zPFQgZXh0ZW5kcyBhbnk+ID0ge1xuICAgIHBhcmFtcz86IFJlY29yZDxhbnksIGFueT47XG4gICAgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gICAgdGltZW91dD86IG51bWJlcjtcbiAgICBiYXNlVXJsPzogc3RyaW5nIHwgKCgpID0+IHN0cmluZykgfCAoKCkgPT4gUHJvbWlzZTxzdHJpbmc+KTtcbiAgICBjYWNoZVN0cmF0ZWd5PzogQ2FjaGVTdHJhdGVneTtcbiAgICBjYWNoZVRocm90dGxlTXM/OiBudW1iZXI7XG4gICAgb25DYWNoZUhpdD86IChyZXN1bHQ6IFQpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xuICAgIHJldHJ5U3RyYXRlZ3k/OiBSZXRyeVN0cmF0ZWd5O1xufTtcblxuZXhwb3J0IHR5cGUgRXhlY3V0ZVJlc3VsdHNPcHRpb24gPSB7IGV4ZWN1dGVJZDogc3RyaW5nIH07XG5cbmV4cG9ydCB0eXBlIFBpbmcgPVxuICAgIHwgW1xuICAgICAgICB7XG4gICAgICAgICAgICBjb25uZWN0OiBmYWxzZTtcbiAgICAgICAgICAgIGRlbGF5OiBudW1iZXI7XG4gICAgICAgICAgICBlcnJvcjogYW55O1xuICAgICAgICB9LFxuICAgICAgICBudWxsLFxuICAgIF1cbiAgICB8IFtcbiAgICAgICAgbnVsbCxcbiAgICAgICAge1xuICAgICAgICAgICAgY29ubmVjdDogdHJ1ZTtcbiAgICAgICAgICAgIGRlbGF5OiBudW1iZXI7XG4gICAgICAgICAgICBzZXJ2ZXJUaW1lc3RhbXA6IG51bWJlcjtcbiAgICAgICAgfSxcbiAgICBdO1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVN0YXJnYXRlPEdlbmVyYXRlZCBleHRlbmRzIHsgcm91dGVTY2hlbWE6IGFueTsgcmVqZWN0Q29kZTogYW55IH0+KHN0YXJnYXRlT3B0aW9uczogTWlsa2lvU3RhcmdhdGVPcHRpb25zKSB7XG4gICAgY29uc3QgJGZldGNoID0gc3RhcmdhdGVPcHRpb25zLmZldGNoID8/IGZldGNoO1xuICAgIGNvbnN0ICRhYm9ydCA9IHN0YXJnYXRlT3B0aW9ucy5hYm9ydCA/PyBBYm9ydENvbnRyb2xsZXI7XG5cbiAgICAvLyBEZXRlY3QgaWYgd2UgY2FuIHVzZSBOb2RlLmpzIGh0dHAgbW9kdWxlIGZvciBuYXRpdmUgSFRUUCB0cmFuc3BvcnRcbiAgICAvLyBPbmx5IHVzZSBpbiBwdXJlIE5vZGUuanMgZW52aXJvbm1lbnQgKG5vdCBCdW4sIG5vdCBEZW5vLCBub3Qgc2VydmVybGVzcylcbiAgICBsZXQgbm9kZUh0dHBSZXF1ZXN0OiBhbnkgPSBudWxsO1xuICAgIGxldCBub2RlSHR0cEFnZW50OiBhbnkgPSBudWxsO1xuICAgIHRyeSB7XG4gICAgICAgIC8vIEJ1biBhbHNvIHN1cHBvcnRzIG5vZGU6aHR0cCwgYnV0IGl0cyBmZXRjaCBpcyBhbHJlYWR5IG9wdGltaXplZFxuICAgICAgICAvLyBPbmx5IHVzZSBuYXRpdmUgaHR0cCB3aGVuIHJ1bm5pbmcgaW4gcHVyZSBOb2RlLmpzXG4gICAgICAgIGlmICh0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIChCdW4gYXMgYW55KSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGNvbnN0IGh0dHAgPSBhd2FpdCBpbXBvcnQoJ25vZGU6aHR0cCcpO1xuICAgICAgICAgICAgbm9kZUh0dHBSZXF1ZXN0ID0gaHR0cC5yZXF1ZXN0O1xuICAgICAgICAgICAgbm9kZUh0dHBBZ2VudCA9IG5ldyBodHRwLkFnZW50KHsga2VlcEFsaXZlOiB0cnVlLCBtYXhTb2NrZXRzOiAxMDAgfSk7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gTm90IGluIE5vZGUuanMgZW52aXJvbm1lbnQgKERlbm8sIGJyb3dzZXIsIHNlcnZlcmxlc3MsIGV0Yy4pXG4gICAgfVxuXG4gICAgLy8gTmF0aXZlIEhUVFAgUE9TVCB1c2luZyBOb2RlLmpzIGh0dHAgbW9kdWxlIChieXBhc3NlcyB1bmRpY2kgb3ZlcmhlYWQpXG4gICAgLy8gRmFsbHMgYmFjayB0byBmZXRjaCBpbiBub24tTm9kZS5qcyBlbnZpcm9ubWVudHNcbiAgICBjb25zdCBuYXRpdmVIdHRwUG9zdCA9IG5vZGVIdHRwUmVxdWVzdFxuICAgICAgICA/ICh1cmw6IHN0cmluZywgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiwgYm9keTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+ID0+IHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkVXJsID0gbmV3IFVSTCh1cmwpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgICAgIGhvc3RuYW1lOiBwYXJzZWRVcmwuaG9zdG5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHBvcnQ6IHBhcnNlZFVybC5wb3J0IHx8IDgwLFxuICAgICAgICAgICAgICAgICAgICBwYXRoOiBwYXJzZWRVcmwucGF0aG5hbWUgKyBwYXJzZWRVcmwuc2VhcmNoLFxuICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogeyAuLi5oZWFkZXJzLCAnQ29udGVudC1MZW5ndGgnOiBCdWZmZXIuYnl0ZUxlbmd0aChib2R5KSB9LFxuICAgICAgICAgICAgICAgICAgICBhZ2VudDogbm9kZUh0dHBBZ2VudCxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlcSA9IG5vZGVIdHRwUmVxdWVzdChvcHRpb25zLCAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGEgPSAnJztcbiAgICAgICAgICAgICAgICAgICAgcmVzLm9uKCdkYXRhJywgKGNodW5rOiBhbnkpID0+IHsgZGF0YSArPSBjaHVuazsgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJlcy5vbignZW5kJywgKCkgPT4geyByZXNvbHZlKGRhdGEpOyB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXEub24oJ2Vycm9yJywgcmVqZWN0KTtcbiAgICAgICAgICAgICAgICByZXEud3JpdGUoYm9keSk7XG4gICAgICAgICAgICAgICAgcmVxLmVuZCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgOiBudWxsO1xuXG4gICAgdHlwZSBTdGFyZ2F0ZUV2ZW50cyA9IHtcbiAgICAgICAgJ21pbGtpbzpleGVjdXRlQmVmb3JlJzogeyBwYXRoOiBzdHJpbmc7IG9wdGlvbnM6IE1peGluPEV4ZWN1dGVPcHRpb25zPGFueT4sIHsgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjsgYmFzZVVybDogc3RyaW5nIH0+IH07XG4gICAgICAgICdtaWxraW86ZmV0Y2hCZWZvcmUnOiB7IHBhdGg6IHN0cmluZzsgb3B0aW9uczogTWl4aW48RXhlY3V0ZU9wdGlvbnM8YW55PiwgeyBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+OyBiYXNlVXJsOiBzdHJpbmcgfT47IGJvZHk6IHN0cmluZyB9O1xuICAgICAgICAnbWlsa2lvOmV4ZWN1dGVFcnJvcic6IHtcbiAgICAgICAgICAgIHBhdGg6IHN0cmluZztcbiAgICAgICAgICAgIG9wdGlvbnM6IE1peGluPEV4ZWN1dGVPcHRpb25zPGFueT4sIHsgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjsgYmFzZVVybDogc3RyaW5nIH0+O1xuICAgICAgICAgICAgZXJyb3I6IFBhcnRpYWw8R2VuZXJhdGVkWydyZWplY3RDb2RlJ10+O1xuICAgICAgICAgICAgaGFuZGxlRXJyb3I6IDxLIGV4dGVuZHMga2V5b2YgUGFydGlhbDxHZW5lcmF0ZWRbJ3JlamVjdENvZGUnXT4+KGVycm9yOiBhbnksIGtleTogSywgaGFuZGxlcjogKGVycm9yOiBQYXJ0aWFsPEdlbmVyYXRlZFsncmVqZWN0Q29kZSddW0tdPikgPT4gYm9vbGVhbiB8IFByb21pc2U8Ym9vbGVhbj4pID0+IFByb21pc2U8dm9pZD47XG4gICAgICAgIH07XG4gICAgfTtcblxuICAgIGNvbnN0IGhhbmRsZUVycm9yOiBhbnkgPSBhc3luYyAoZXJyb3I6IGFueSwga2V5OiBzdHJpbmcsIGhhbmRsZXI6IChlcnJvcjogYW55KSA9PiBib29sZWFuIHwgUHJvbWlzZTxib29sZWFuPikgPT4ge1xuICAgICAgICBpZiAoa2V5IGluIGVycm9yKSB7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVkID0gYXdhaXQgaGFuZGxlcihlcnJvcltrZXldKTtcbiAgICAgICAgICAgIGlmIChoYW5kbGVkKSBkZWxldGUgZXJyb3Jba2V5XTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBfX2luaXRFdmVudE1hbmFnZXIgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGhhbmRsZXJzID0gbmV3IE1hcDwoZXZlbnQ6IGFueSkgPT4gdm9pZCwgc3RyaW5nPigpO1xuICAgICAgICBjb25zdCBpbmRleGVkID0gbmV3IE1hcDxzdHJpbmcsIFNldDwoZXZlbnQ6IGFueSkgPT4gdm9pZD4+KCk7XG5cbiAgICAgICAgY29uc3QgZXZlbnRNYW5hZ2VyID0ge1xuICAgICAgICAgICAgb246IDxLZXkgZXh0ZW5kcyBrZXlvZiBTdGFyZ2F0ZUV2ZW50cywgSGFuZGxlciBleHRlbmRzIChldmVudDogU3RhcmdhdGVFdmVudHNbS2V5XSkgPT4gdm9pZD4oa2V5OiBLZXksIGhhbmRsZXI6IEhhbmRsZXIpID0+IHtcbiAgICAgICAgICAgICAgICBoYW5kbGVycy5zZXQoaGFuZGxlciwga2V5IGFzIHN0cmluZyk7XG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ZWQuaGFzKGtleSBhcyBzdHJpbmcpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICBpbmRleGVkLnNldChrZXkgYXMgc3RyaW5nLCBuZXcgU2V0KCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBzZXQgPSBpbmRleGVkLmdldChrZXkgYXMgc3RyaW5nKSE7XG4gICAgICAgICAgICAgICAgc2V0LmFkZChoYW5kbGVyKTtcbiAgICAgICAgICAgICAgICBoYW5kbGVycy5zZXQoaGFuZGxlciwga2V5IGFzIHN0cmluZyk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBoYW5kbGVycy5kZWxldGUoaGFuZGxlcik7XG4gICAgICAgICAgICAgICAgICAgIHNldC5kZWxldGUoaGFuZGxlcik7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvZmY6IDxLZXkgZXh0ZW5kcyBrZXlvZiBTdGFyZ2F0ZUV2ZW50cywgSGFuZGxlciBleHRlbmRzIChldmVudDogU3RhcmdhdGVFdmVudHNbS2V5XSkgPT4gdm9pZD4oa2V5OiBLZXksIGhhbmRsZXI6IEhhbmRsZXIpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBzZXQgPSBpbmRleGVkLmdldChrZXkgYXMgc3RyaW5nKTtcbiAgICAgICAgICAgICAgICBpZiAoIXNldCkgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGhhbmRsZXJzLmRlbGV0ZShoYW5kbGVyKTtcbiAgICAgICAgICAgICAgICBzZXQuZGVsZXRlKGhhbmRsZXIpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVtaXQ6IGFzeW5jIDxLZXkgZXh0ZW5kcyBrZXlvZiBTdGFyZ2F0ZUV2ZW50cywgVmFsdWUgZXh0ZW5kcyBTdGFyZ2F0ZUV2ZW50c1tLZXldPihrZXk6IEtleSwgdmFsdWU6IFZhbHVlKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaCA9IGluZGV4ZWQuZ2V0KGtleSBhcyBzdHJpbmcpO1xuICAgICAgICAgICAgICAgIGlmIChoKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaGFuZGxlciBvZiBoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBoYW5kbGVyKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIGV2ZW50TWFuYWdlcjtcbiAgICB9O1xuXG4gICAgY29uc3QgZXZlbnRNYW5hZ2VyID0gX19pbml0RXZlbnRNYW5hZ2VyKCk7XG5cbiAgICBjb25zdCBib290c3RyYXAgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgIGxldCBiYXNlVXJsID0gc3RhcmdhdGVPcHRpb25zLmJhc2VVcmw7XG4gICAgICAgIGlmICh0eXBlb2YgYmFzZVVybCA9PT0gJ2Z1bmN0aW9uJykgYmFzZVVybCA9IGF3YWl0IGJhc2VVcmwoKTtcbiAgICAgICAgaWYgKGJhc2VVcmwuZW5kc1dpdGgoJy8nKSkgYmFzZVVybCA9IGJhc2VVcmwuc2xpY2UoMCwgLTEpO1xuXG4gICAgICAgIHJldHVybiBiYXNlVXJsO1xuICAgIH07XG5cbiAgICBjb25zdCBiYXNlVXJsUHJvbWlzZTogUHJvbWlzZTxzdHJpbmc+ID0gYm9vdHN0cmFwKCk7XG4gICAgLy8gQ2FjaGUgcmVzb2x2ZWQgYmFzZVVybCB0byBhdm9pZCBhd2FpdCBvdmVyaGVhZCBvbiByZXBlYXRlZCBjYWxsc1xuICAgIGxldCByZXNvbHZlZEJhc2VVcmw6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgIC8vIENhY2hlIFVSTCBmb3IgbGFzdCBwYXRoIHRvIGF2b2lkIHN0cmluZyBjb25jYXRlbmF0aW9uIHBlciByZXF1ZXN0XG4gICAgbGV0IGNhY2hlZFVybFBhdGg6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgIGxldCBjYWNoZWRVcmw6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gICAgY29uc3Qgc3RhcmdhdGUgPSB7XG4gICAgICAgIC4uLmV2ZW50TWFuYWdlcixcbiAgICAgICAgb3B0aW9uczogc3RhcmdhdGVPcHRpb25zLFxuICAgICAgICBhc3luYyBleGVjdXRlPFBhdGggZXh0ZW5kcyBrZXlvZiBHZW5lcmF0ZWRbJ3JvdXRlU2NoZW1hJ10+KFxuICAgICAgICAgICAgcGF0aDogUGF0aCxcbiAgICAgICAgICAgIG9wdGlvbnM6IE1peGluPFxuICAgICAgICAgICAgICAgIEV4ZWN1dGVPcHRpb25zPEdlbmVyYXRlZFsncm91dGVTY2hlbWEnXVtQYXRoXVsndHlwZXMnXVsncmVzdWx0J10+LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zPzogR2VuZXJhdGVkWydyb3V0ZVNjaGVtYSddW1BhdGhdWyd0eXBlcyddWydwYXJhbXMnXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA+LFxuICAgICAgICApOiBQcm9taXNlPFxuICAgICAgICAgICAgR2VuZXJhdGVkWydyb3V0ZVNjaGVtYSddW1BhdGhdWyd0eXBlcyddWyfwn6WbJ10gZXh0ZW5kcyBib29sZWFuXG4gICAgICAgICAgICA/IC8vIGFjdGlvblxuICAgICAgICAgICAgW1BhcnRpYWw8R2VuZXJhdGVkWydyZWplY3RDb2RlJ10+LCBudWxsLCBFeGVjdXRlUmVzdWx0c09wdGlvbl0gfCBbbnVsbCwgR2VuZXJhdGVkWydyb3V0ZVNjaGVtYSddW1BhdGhdWyd0eXBlcyddWydyZXN1bHQnXSwgRXhlY3V0ZVJlc3VsdHNPcHRpb25dXG4gICAgICAgICAgICA6IC8vIHN0cmVhbVxuICAgICAgICAgICAgW1BhcnRpYWw8R2VuZXJhdGVkWydyZWplY3RDb2RlJ10+LCBudWxsLCBFeGVjdXRlUmVzdWx0c09wdGlvbl0gfCBbbnVsbCwgQXN5bmNHZW5lcmF0b3I8W1BhcnRpYWw8R2VuZXJhdGVkWydyZWplY3RDb2RlJ10+LCBudWxsXSB8IFtudWxsLCBHZW5lcmF0b3JHZW5lcmljPEdlbmVyYXRlZFsncm91dGVTY2hlbWEnXVtQYXRoXVsndHlwZXMnXVsncmVzdWx0J10+XSwgdW5kZWZpbmVkPiwgRXhlY3V0ZVJlc3VsdHNPcHRpb25dXG4gICAgICAgID4ge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMuaGVhZGVycyA9PT0gdW5kZWZpbmVkKSBvcHRpb25zLmhlYWRlcnMgPSB7fTtcblxuICAgICAgICAgICAgbGV0IHVybDogc3RyaW5nO1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMuYmFzZVVybCkge1xuICAgICAgICAgICAgICAgIGxldCBiYXNlVXJsID0gb3B0aW9ucy5iYXNlVXJsO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgYmFzZVVybCA9PT0gJ2Z1bmN0aW9uJykgYmFzZVVybCA9IGF3YWl0IGJhc2VVcmwoKTtcbiAgICAgICAgICAgICAgICBpZiAoYmFzZVVybC5lbmRzV2l0aCgnLycpKSBiYXNlVXJsID0gYmFzZVVybC5zbGljZSgwLCAtMSk7XG4gICAgICAgICAgICAgICAgdXJsID0gYmFzZVVybCArIChwYXRoIGFzIHN0cmluZyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICghcmVzb2x2ZWRCYXNlVXJsKSByZXNvbHZlZEJhc2VVcmwgPSBhd2FpdCBiYXNlVXJsUHJvbWlzZTtcbiAgICAgICAgICAgICAgICAvLyBDYWNoZSBVUkwgZm9yIHJlcGVhdGVkIHBhdGggdG8gYXZvaWQgc3RyaW5nIGNvbmNhdGVuYXRpb25cbiAgICAgICAgICAgICAgICBpZiAocGF0aCA9PT0gY2FjaGVkVXJsUGF0aCAmJiBjYWNoZWRVcmwgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdXJsID0gY2FjaGVkVXJsO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHVybCA9IHJlc29sdmVkQmFzZVVybCArIChwYXRoIGFzIHN0cmluZyk7XG4gICAgICAgICAgICAgICAgICAgIGNhY2hlZFVybFBhdGggPSBwYXRoIGFzIHN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgY2FjaGVkVXJsID0gdXJsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCEocGF0aCBhcyBzdHJpbmcpLmVuZHNXaXRoKCd+JykpIHtcbiAgICAgICAgICAgICAgICAvLyBhY3Rpb25cbiAgICAgICAgICAgICAgICAvLyBTZXQgZGVmYXVsdCBoZWFkZXJzIG9ubHkgaWYgbm90IGFscmVhZHkgcHJlc2VudFxuICAgICAgICAgICAgICAgIGNvbnN0IGggPSBvcHRpb25zLmhlYWRlcnM7XG4gICAgICAgICAgICAgICAgaWYgKGguQWNjZXB0ID09PSB1bmRlZmluZWQpIGguQWNjZXB0ID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuICAgICAgICAgICAgICAgIGlmIChoWydDb250ZW50LVR5cGUnXSA9PT0gdW5kZWZpbmVkKSBoWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgICAgIGNvbnN0IGNhY2hlU3RyYXRlZ3kgPSBvcHRpb25zLmNhY2hlU3RyYXRlZ3kgPz8gJ29mZic7XG4gICAgICAgICAgICAgICAgbGV0IHJldHJ5Q291bnQgPSAwO1xuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnJldHJ5U3RyYXRlZ3kgPT09IHRydWUgfHwgb3B0aW9ucy5yZXRyeVN0cmF0ZWd5ID09PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHJ5Q291bnQgPSAyO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIG9wdGlvbnMucmV0cnlTdHJhdGVneSA9PT0gJ251bWJlcicgJiYgb3B0aW9ucy5yZXRyeVN0cmF0ZWd5ID4gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXRyeUNvdW50ID0gb3B0aW9ucy5yZXRyeVN0cmF0ZWd5O1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIEZhc3QgcGF0aDogbm8gY2FjaGUsIG5vIHJldHJ5XG4gICAgICAgICAgICAgICAgaWYgKGNhY2hlU3RyYXRlZ3kgPT09ICdvZmYnICYmIHJldHJ5Q291bnQgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGV2ZW50TWFuYWdlci5lbWl0KCdtaWxraW86ZXhlY3V0ZUJlZm9yZScsIHsgcGF0aDogcGF0aCBhcyBzdHJpbmcsIG9wdGlvbnM6IG9wdGlvbnMgYXMgYW55IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYm9keSA9IEpTT04uc3RyaW5naWZ5KG9wdGlvbnMucGFyYW1zKSA/PyAnJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGV2ZW50TWFuYWdlci5lbWl0KCdtaWxraW86ZmV0Y2hCZWZvcmUnLCB7IHBhdGg6IHBhdGggYXMgc3RyaW5nLCBvcHRpb25zOiBvcHRpb25zIGFzIGFueSwgYm9keSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0ZXh0OiBzdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmF0aXZlSHR0cFBvc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVc2UgTm9kZS5qcyBuYXRpdmUgaHR0cCBtb2R1bGUgZm9yIFBPU1QgKGJ5cGFzc2VzIHVuZGljaSBvdmVyaGVhZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gYXdhaXQgbmF0aXZlSHR0cFBvc3QodXJsLCBvcHRpb25zLmhlYWRlcnMsIGJvZHkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0ICRmZXRjaCh1cmwsIHsgbWV0aG9kOiAnUE9TVCcsIGJvZHksIGhlYWRlcnM6IG9wdGlvbnMuaGVhZGVycyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkID0gcmV2aXZlSlNPTlBhcnNlKEpTT04ucGFyc2UodGV4dCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnNlZC5zdWNjZXNzICE9PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyOiBhbnkgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJbcGFyc2VkLmNvZGVdID0gcGFyc2VkLnJlamVjdCA/PyBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbZXJyLCBudWxsLCB7IGV4ZWN1dGVJZDogcGFyc2VkLmV4ZWN1dGVJZCB9XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbbnVsbCwgcGFyc2VkLmRhdGEsIHsgZXhlY3V0ZUlkOiBwYXJzZWQuZXhlY3V0ZUlkIH1dO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3I/LlswXT8uUkVRVUVTVF9USU1FT1VUKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtlcnJvciwgbnVsbCwgeyBleGVjdXRlSWQ6ICcnIH1dO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3JQaW5lZCA9IHsgUkVRVUVTVF9GQUlMOiBlcnJvciB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtlcnJvclBpbmVkLCBudWxsLCB7IGV4ZWN1dGVJZDogJ3Vua25vd24nIH1dO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgY2FjaGVUaHJvdHRsZU1zID0gb3B0aW9ucy5jYWNoZVRocm90dGxlTXMgPz8gMDtcbiAgICAgICAgICAgICAgICBjb25zdCBjYWNoZUtleSA9IGdlbmVyYXRlQ2FjaGVLZXkocGF0aCBhcyBzdHJpbmcsIG9wdGlvbnMucGFyYW1zKTtcblxuICAgICAgICAgICAgICAgIGxldCBjYWNoZVN0b3JhZ2UgPSBzdGFyZ2F0ZU9wdGlvbnMuY2FjaGVTdG9yYWdlO1xuICAgICAgICAgICAgICAgIGlmIChjYWNoZVN0cmF0ZWd5ICE9PSAnb2ZmJyAmJiAhY2FjaGVTdG9yYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhY2hlU3RvcmFnZSA9IGF3YWl0IGNyZWF0ZURlZmF1bHRDYWNoZVN0b3JhZ2UoeyBlbmNyeXB0aW9uOiBzdGFyZ2F0ZU9wdGlvbnMuY2FjaGVFbmNyeXB0aW9uIH0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChjYWNoZVN0cmF0ZWd5ICE9PSAnb2ZmJyAmJiBjYWNoZVN0b3JhZ2UgJiYgb3B0aW9ucy5vbkNhY2hlSGl0KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhY2hlZCA9IGF3YWl0IGNhY2hlU3RvcmFnZS5nZXQoY2FjaGVLZXkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2FjaGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IG9wdGlvbnMub25DYWNoZUhpdChjYWNoZWQuZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgb25DYWNoZUhpdCBlcnJvcnNcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChjYWNoZVN0cmF0ZWd5ID09PSAndGhyb3R0bGUnICYmIGNhY2hlU3RvcmFnZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjYWNoZWQgPSBhd2FpdCBjYWNoZVN0b3JhZ2UuZ2V0KGNhY2hlS2V5KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNhY2hlZCAmJiBEYXRlLm5vdygpIC0gY2FjaGVkLnRpbWVzdGFtcCA8IGNhY2hlVGhyb3R0bGVNcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtudWxsLCBjYWNoZWQuZGF0YSwgeyBleGVjdXRlSWQ6ICdjYWNoZWQnIH1dIGFzIGFueTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGF3YWl0IGV2ZW50TWFuYWdlci5lbWl0KCdtaWxraW86ZXhlY3V0ZUJlZm9yZScsIHsgcGF0aDogcGF0aCBhcyBzdHJpbmcsIG9wdGlvbnM6IG9wdGlvbnMgYXMgYW55IH0pO1xuICAgICAgICAgICAgICAgIGNvbnN0IGJvZHkgPSBKU09OLnN0cmluZ2lmeShvcHRpb25zLnBhcmFtcykgPz8gJyc7XG4gICAgICAgICAgICAgICAgYXdhaXQgZXZlbnRNYW5hZ2VyLmVtaXQoJ21pbGtpbzpmZXRjaEJlZm9yZScsIHsgcGF0aDogcGF0aCBhcyBzdHJpbmcsIG9wdGlvbnM6IG9wdGlvbnMgYXMgYW55LCBib2R5IH0pO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgZXhlY3V0ZVJlcXVlc3QgPSBhc3luYyAoaXNSZXRyeTogYm9vbGVhbik6IFByb21pc2U8eyByZXN1bHQ6IHsgdmFsdWU6IFJlY29yZDxhbnksIGFueT4gfSB8IG51bGw7IGVycm9yOiBhbnk7IGlzTmV0d29ya0Vycm9yOiBib29sZWFuIH0+ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgJGZldGNoKHVybCwgeyBtZXRob2Q6ICdQT1NUJywgYm9keSwgaGVhZGVyczogb3B0aW9ucy5oZWFkZXJzIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGV4dCA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UodGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyByZXN1bHQ6IHsgdmFsdWU6IHBhcnNlZCB9LCBlcnJvcjogbnVsbCwgaXNOZXR3b3JrRXJyb3I6IGZhbHNlIH07XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzTmV0d29ya0Vycm9yID0gIWVycm9yPy5bMF0/LlJFUVVFU1RfVElNRU9VVDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHJlc3VsdDogbnVsbCwgZXJyb3IsIGlzTmV0d29ya0Vycm9yIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgbGV0IHsgcmVzdWx0LCBlcnJvciwgaXNOZXR3b3JrRXJyb3IgfSA9IGF3YWl0IGV4ZWN1dGVSZXF1ZXN0KGZhbHNlKTtcblxuICAgICAgICAgICAgICAgIGZvciAobGV0IHJldHJ5SW5kZXggPSAwOyByZXRyeUluZGV4IDwgcmV0cnlDb3VudCAmJiBlcnJvciAmJiBpc05ldHdvcmtFcnJvcjsgcmV0cnlJbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXRyeUluZGV4ID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgNTAwKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmV0cnlSZXN1bHQgPSBhd2FpdCBleGVjdXRlUmVxdWVzdCh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gcmV0cnlSZXN1bHQucmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICBlcnJvciA9IHJldHJ5UmVzdWx0LmVycm9yO1xuICAgICAgICAgICAgICAgICAgICBpc05ldHdvcmtFcnJvciA9IHJldHJ5UmVzdWx0LmlzTmV0d29ya0Vycm9yO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3I/LlswXT8uUkVRVUVTVF9USU1FT1VUKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBldmVudE1hbmFnZXIuZW1pdCgnbWlsa2lvOmV4ZWN1dGVFcnJvcicsIHsgaGFuZGxlRXJyb3IsIHBhdGg6IHBhdGggYXMgc3RyaW5nLCBvcHRpb25zOiBvcHRpb25zIGFzIGFueSwgZXJyb3IgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoY2FjaGVTdHJhdGVneSAhPT0gJ29mZicgJiYgY2FjaGVTdG9yYWdlICYmIGlzTmV0d29ya0Vycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYWNoZWQgPSBhd2FpdCBjYWNoZVN0b3JhZ2UuZ2V0KGNhY2hlS2V5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYWNoZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW251bGwsIGNhY2hlZC5kYXRhLCB7IGV4ZWN1dGVJZDogJ2NhY2hlZCcgfV0gYXMgYW55O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3JQaW5lZCA9IHsgUkVRVUVTVF9GQUlMOiBlcnJvciB9O1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBldmVudE1hbmFnZXIuZW1pdCgnbWlsa2lvOmV4ZWN1dGVFcnJvcicsIHsgaGFuZGxlRXJyb3IsIHBhdGg6IHBhdGggYXMgc3RyaW5nLCBvcHRpb25zOiBvcHRpb25zIGFzIGFueSwgZXJyb3I6IGVycm9yUGluZWQgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbZXJyb3JQaW5lZCwgbnVsbCwgeyBleGVjdXRlSWQ6ICd1bmtub3duJyB9XTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0IS52YWx1ZS5zdWNjZXNzICE9PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycjogYW55ID0ge307XG4gICAgICAgICAgICAgICAgICAgIGVycltyZXN1bHQhLnZhbHVlLmNvZGVdID0gcmVzdWx0IS52YWx1ZS5yZWplY3QgPz8gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgZXZlbnRNYW5hZ2VyLmVtaXQoJ21pbGtpbzpleGVjdXRlRXJyb3InLCB7IGhhbmRsZUVycm9yLCBwYXRoOiBwYXRoIGFzIHN0cmluZywgb3B0aW9uczogb3B0aW9ucyBhcyBhbnksIGVycm9yOiBlcnIgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbZXJyLCBudWxsLCB7IGV4ZWN1dGVJZDogcmVzdWx0IS52YWx1ZS5leGVjdXRlSWQgfV07XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGNhY2hlU3RyYXRlZ3kgIT09ICdvZmYnICYmIGNhY2hlU3RvcmFnZSkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBjYWNoZVN0b3JhZ2Uuc2V0KGNhY2hlS2V5LCByZXN1bHQhLnZhbHVlLmRhdGEpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiBbbnVsbCwgcmVzdWx0IS52YWx1ZS5kYXRhLCB7IGV4ZWN1dGVJZDogcmVzdWx0IS52YWx1ZS5leGVjdXRlSWQgfV0gYXMgYW55O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBzdHJlYW1cbiAgICAgICAgICAgICAgICBvcHRpb25zLmNhY2hlU3RyYXRlZ3kgPSAnb2ZmJztcbiAgICAgICAgICAgICAgICBvcHRpb25zLm9uQ2FjaGVIaXQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5jYWNoZVRocm90dGxlTXMgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5oZWFkZXJzLkFjY2VwdCA9PT0gdW5kZWZpbmVkKSBvcHRpb25zLmhlYWRlcnMuQWNjZXB0ID0gJ3RleHQvZXZlbnQtc3RyZWFtJztcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5oZWFkZXJzWydDb250ZW50LVR5cGUnXSA9PT0gdW5kZWZpbmVkKSBvcHRpb25zLmhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhY2tzOiBNYXA8XG4gICAgICAgICAgICAgICAgICAgIG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgZG9uZTogYm9vbGVhbjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb21pc2U6IFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8YW55Pj47XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlOiAodmFsdWU6IEl0ZXJhdG9yUmVzdWx0PGFueT4pID0+IHZvaWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3Q6IChyZWFzb246IGFueSkgPT4gdm9pZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgID4gPSBuZXcgTWFwKCk7XG4gICAgICAgICAgICAgICAgbGV0IHN0YWNrc0luZGV4ID0gMDtcbiAgICAgICAgICAgICAgICBsZXQgaXRlcmF0b3JJbmRleCA9IDA7XG4gICAgICAgICAgICAgICAgbGV0IHN0cmVhbVJlc3VsdDogYW55O1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0cmVhbVJlc3VsdEZldGNoZWQgPSB3aXRoUmVzb2x2ZXJzPHVuZGVmaW5lZD4oKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHRpbWVvdXQgPSBzdGFyZ2F0ZU9wdGlvbnM/LnRpbWVvdXQgPz8gb3B0aW9ucz8udGltZW91dCA/PyA2MDAwO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbVJlc3VsdEZldGNoZWQucmVqZWN0KFt7IFJFUVVFU1RfVElNRU9VVDogeyB0aW1lb3V0LCBtZXNzYWdlOiBgRXhlY3V0ZSB0aW1lb3V0IGFmdGVyICR7dGltZW91dH1tcy5gIH0gfSwgbnVsbCwgeyBleGVjdXRlSWQ6ICd1bmtub3duJyB9XSk7XG4gICAgICAgICAgICAgICAgfSwgdGltZW91dCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBvbm1lc3NhZ2UgPSAoZXZlbnQ6IEV2ZW50U291cmNlTWVzc2FnZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQuZGF0YS5zdGFydHNXaXRoKCdAJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtUmVzdWx0ID0gcmV2aXZlSlNPTlBhcnNlKEpTT04ucGFyc2UoZXZlbnQuZGF0YS5zbGljZSgxKSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbVJlc3VsdEZldGNoZWQucmVzb2x2ZSh1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbVJlc3VsdEZldGNoZWQucmVqZWN0KFt7IFJFUVVFU1RfRkFJTDogZXJyb3IgfSwgbnVsbCwgeyBleGVjdXRlSWQ6ICd1bmtub3duJyB9XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gKytzdGFja3NJbmRleDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGFja3MuaGFzKGluZGV4KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YWNrID0gc3RhY2tzLmdldChpbmRleCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2shLmRvbmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrIS5yZXNvbHZlKHsgZG9uZTogZmFsc2UsIHZhbHVlOiByZXZpdmVKU09OUGFyc2UoSlNPTi5wYXJzZShldmVudC5kYXRhKSkgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YWNrID0gd2l0aFJlc29sdmVyczxJdGVyYXRvclJlc3VsdDxhbnk+PigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrLnJlc29sdmUoeyBkb25lOiBmYWxzZSwgdmFsdWU6IHJldml2ZUpTT05QYXJzZShKU09OLnBhcnNlKGV2ZW50LmRhdGEpKSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFja3Muc2V0KGluZGV4LCB7IC4uLnN0YWNrLCBkb25lOiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICBsZXQgY3VyUmVxdWVzdENvbnRyb2xsZXI6IEFib3J0Q29udHJvbGxlcjtcblxuICAgICAgICAgICAgICAgIGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZSgpIHtcbiAgICAgICAgICAgICAgICAgICAgY3VyUmVxdWVzdENvbnRyb2xsZXIgPSBuZXcgJGFib3J0KCk7XG4gICAgICAgICAgICAgICAgICAgIGN1clJlcXVlc3RDb250cm9sbGVyLnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yLnJldHVybigpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGV2ZW50TWFuYWdlci5lbWl0KCdtaWxraW86ZXhlY3V0ZUJlZm9yZScsIHsgcGF0aDogcGF0aCBhcyBzdHJpbmcsIG9wdGlvbnM6IG9wdGlvbnMgYXMgYW55IH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBib2R5ID0gSlNPTi5zdHJpbmdpZnkob3B0aW9ucyEucGFyYW1zKSA/PyAnJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGV2ZW50TWFuYWdlci5lbWl0KCdtaWxraW86ZmV0Y2hCZWZvcmUnLCB7IHBhdGg6IHBhdGggYXMgc3RyaW5nLCBvcHRpb25zOiBvcHRpb25zIGFzIGFueSwgYm9keSB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCAkZmV0Y2godXJsLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogb3B0aW9ucyEuaGVhZGVycyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib2R5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hbDogY3VyUmVxdWVzdENvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRUeXBlID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoJ0NvbnRlbnQtVHlwZScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjb250ZW50VHlwZT8uc3RhcnRzV2l0aCgndGV4dC9ldmVudC1zdHJlYW0nKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgY29udGVudC10eXBlIHRvIGJlICR7J3RleHQvZXZlbnQtc3RyZWFtJ30sIEFjdHVhbDogJHtjb250ZW50VHlwZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZ2V0Qnl0ZXMocmVzcG9uc2UuYm9keSEsIGdldExpbmVzKGdldE1lc3NhZ2VzKG9ubWVzc2FnZSkpKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgaXRlcmF0b3IucmV0dXJuKCk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjdXJSZXF1ZXN0Q29udHJvbGxlci5zaWduYWwuYWJvcnRlZCkgY3VyUmVxdWVzdENvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yID0geyBSRVFVRVNUX0ZBSUw6IGVyciB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZXZlbnRNYW5hZ2VyLmVtaXQoJ21pbGtpbzpleGVjdXRlRXJyb3InLCB7IGhhbmRsZUVycm9yLCBwYXRoOiBwYXRoIGFzIHN0cmluZywgb3B0aW9uczogb3B0aW9ucyBhcyBhbnksIGVycm9yIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgaXRlcmF0b3IudGhyb3coZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbVJlc3VsdEZldGNoZWQucmVqZWN0KFtlcnJvciwgbnVsbCwgeyBleGVjdXRlSWQ6ICd1bmtub3duJyB9XSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB2b2lkIGNyZWF0ZSgpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgaXRlcmF0b3IgPSB7XG4gICAgICAgICAgICAgICAgICAgIC4uLih7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXh0KCk6IFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8dW5rbm93bj4+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9ICsraXRlcmF0b3JJbmRleDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhY2tzLmhhcyhpbmRleCAtIDIpKSBzdGFja3MuZGVsZXRlKGluZGV4IC0gMik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdGFja3MuaGFzKGluZGV4KSAmJiAhY3VyUmVxdWVzdENvbnRyb2xsZXIuc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhY2sgPSB3aXRoUmVzb2x2ZXJzPEl0ZXJhdG9yUmVzdWx0PGFueT4+KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrcy5zZXQoaW5kZXgsIHsgLi4uc3RhY2ssIGRvbmU6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhY2sucHJvbWlzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdGFja3MuaGFzKGluZGV4KSAmJiBjdXJSZXF1ZXN0Q29udHJvbGxlci5zaWduYWwuYWJvcnRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFjayA9IHdpdGhSZXNvbHZlcnM8SXRlcmF0b3JSZXN1bHQ8YW55Pj4oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2sucmVzb2x2ZSh7IGRvbmU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGFjay5wcm9taXNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhY2tzLmdldChpbmRleCkhLnByb21pc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmMgcmV0dXJuKCk6IFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8dm9pZD4+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWN1clJlcXVlc3RDb250cm9sbGVyLnNpZ25hbC5hYm9ydGVkKSBjdXJSZXF1ZXN0Q29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW18sIGl0ZXJhdG9yXSBvZiBzdGFja3MpIGl0ZXJhdG9yLnJlc29sdmUoeyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGRvbmU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBhc3luYyB0aHJvdyhlcnI6IGFueSk6IFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8dm9pZD4+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1SZXN1bHQgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlSWQ6IHN0cmVhbVJlc3VsdD8uZXhlY3V0ZUlkID8/ICcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiAnTkVUV09SS19FUlJPUicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnTmV0d29yayBFcnJvcicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tQ2xpZW50OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogZXJyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBbX2luZGV4LCBzdGFja10gb2Ygc3RhY2tzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGFjay5kb25lKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2suZG9uZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrLnJlc29sdmUoeyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWN1clJlcXVlc3RDb250cm9sbGVyLnNpZ25hbC5hYm9ydGVkKSBjdXJSZXF1ZXN0Q29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW18sIGl0ZXJhdG9yXSBvZiBzdGFja3MpIGl0ZXJhdG9yLnJlc29sdmUoeyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGRvbmU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIH0gc2F0aXNmaWVzIEFzeW5jSXRlcmF0b3I8dW5rbm93bj4pLFxuICAgICAgICAgICAgICAgICAgICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHN0cmVhbVJlc3VsdEZldGNoZWQucHJvbWlzZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtudWxsLCBpdGVyYXRvciwgeyBleGVjdXRlSWQ6IHN0cmVhbVJlc3VsdC5leGVjdXRlSWQgfV0gYXMgYW55O1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnJvciBhcyBhbnk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBfX2Nvb2tib29rOiB7XG4gICAgICAgICAgICBzdWJzY3JpYmU6IGFzeW5jIChiYXNlVXJsOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBoZWFkZXJzID0ge1xuICAgICAgICAgICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgICAgICAgICBBY2NlcHQ6ICd0ZXh0L2V2ZW50LXN0cmVhbScsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJhbXMgPSB7fTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGJvZHkgPSBKU09OLnN0cmluZ2lmeShwYXJhbXMpID8/ICcnO1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0YWNrczogTWFwPFxuICAgICAgICAgICAgICAgICAgICBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmU6IGJvb2xlYW47XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlOiBQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PGFueT4+O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZTogKHZhbHVlOiBJdGVyYXRvclJlc3VsdDxhbnk+KSA9PiB2b2lkO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0OiAocmVhc29uOiBhbnkpID0+IHZvaWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA+ID0gbmV3IE1hcCgpO1xuICAgICAgICAgICAgICAgIGxldCBzdGFja3NJbmRleCA9IDA7XG4gICAgICAgICAgICAgICAgbGV0IGl0ZXJhdG9ySW5kZXggPSAwO1xuXG4gICAgICAgICAgICAgICAgY29uc3Qgb25tZXNzYWdlID0gKGV2ZW50OiBFdmVudFNvdXJjZU1lc3NhZ2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSArK3N0YWNrc0luZGV4O1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3RhY2tzLmhhcyhpbmRleCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YWNrID0gc3RhY2tzLmdldChpbmRleCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFjayEucmVzb2x2ZSh7IGRvbmU6IGZhbHNlLCB2YWx1ZTogcmV2aXZlSlNPTlBhcnNlKEpTT04ucGFyc2UoZXZlbnQuZGF0YSkpIH0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhY2sgPSB3aXRoUmVzb2x2ZXJzPEl0ZXJhdG9yUmVzdWx0PGFueT4+KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5yZXNvbHZlKHsgZG9uZTogZmFsc2UsIHZhbHVlOiByZXZpdmVKU09OUGFyc2UoSlNPTi5wYXJzZShldmVudC5kYXRhKSkgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFja3Muc2V0KGluZGV4LCB7IC4uLnN0YWNrLCBkb25lOiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICBsZXQgY3VyUmVxdWVzdENvbnRyb2xsZXI6IEFib3J0Q29udHJvbGxlcjtcblxuICAgICAgICAgICAgICAgIGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZSgpIHtcbiAgICAgICAgICAgICAgICAgICAgY3VyUmVxdWVzdENvbnRyb2xsZXIgPSBuZXcgJGFib3J0KCk7XG4gICAgICAgICAgICAgICAgICAgIGN1clJlcXVlc3RDb250cm9sbGVyLnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yLnJldHVybigpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgJGZldGNoKGAke2Jhc2VVcmx9LyRzdWJzY3JpYmVgLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVycyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib2R5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hbDogY3VyUmVxdWVzdENvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRUeXBlID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoJ0NvbnRlbnQtVHlwZScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjb250ZW50VHlwZT8uc3RhcnRzV2l0aCgndGV4dC9ldmVudC1zdHJlYW0nKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgY29udGVudC10eXBlIHRvIGJlICR7J3RleHQvZXZlbnQtc3RyZWFtJ30sIEFjdHVhbDogJHtjb250ZW50VHlwZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZ2V0Qnl0ZXMocmVzcG9uc2UuYm9keSEsIGdldExpbmVzKGdldE1lc3NhZ2VzKG9ubWVzc2FnZSkpKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgaXRlcmF0b3IucmV0dXJuKCk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjdXJSZXF1ZXN0Q29udHJvbGxlci5zaWduYWwuYWJvcnRlZCkgY3VyUmVxdWVzdENvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGl0ZXJhdG9yLnRocm93KGVycik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB2b2lkIGNyZWF0ZSgpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgaXRlcmF0b3IgPSB7XG4gICAgICAgICAgICAgICAgICAgIC4uLih7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXh0KCk6IFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8dW5rbm93bj4+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9ICsraXRlcmF0b3JJbmRleDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhY2tzLmhhcyhpbmRleCAtIDIpKSBzdGFja3MuZGVsZXRlKGluZGV4IC0gMik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdGFja3MuaGFzKGluZGV4KSAmJiAhY3VyUmVxdWVzdENvbnRyb2xsZXIuc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhY2sgPSB3aXRoUmVzb2x2ZXJzPEl0ZXJhdG9yUmVzdWx0PGFueT4+KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrcy5zZXQoaW5kZXgsIHsgLi4uc3RhY2ssIGRvbmU6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhY2sucHJvbWlzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdGFja3MuaGFzKGluZGV4KSAmJiBjdXJSZXF1ZXN0Q29udHJvbGxlci5zaWduYWwuYWJvcnRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFjayA9IHdpdGhSZXNvbHZlcnM8SXRlcmF0b3JSZXN1bHQ8YW55Pj4oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2sucmVzb2x2ZSh7IGRvbmU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGFjay5wcm9taXNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhY2tzLmdldChpbmRleCkhLnByb21pc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmMgcmV0dXJuKCk6IFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8dm9pZD4+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWN1clJlcXVlc3RDb250cm9sbGVyLnNpZ25hbC5hYm9ydGVkKSBjdXJSZXF1ZXN0Q29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW18sIGl0ZXJhdG9yXSBvZiBzdGFja3MpIGl0ZXJhdG9yLnJlc29sdmUoeyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGRvbmU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBhc3luYyB0aHJvdyhlcnI6IGFueSk6IFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8dm9pZD4+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWN1clJlcXVlc3RDb250cm9sbGVyLnNpZ25hbC5hYm9ydGVkKSBjdXJSZXF1ZXN0Q29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW18sIGl0ZXJhdG9yXSBvZiBzdGFja3MpIGl0ZXJhdG9yLnJlc29sdmUoeyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGRvbmU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIH0gc2F0aXNmaWVzIEFzeW5jSXRlcmF0b3I8dW5rbm93bj4pLFxuICAgICAgICAgICAgICAgICAgICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVyYXRvcjtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IgYXMgYW55O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIGFzeW5jIHBpbmcob3B0aW9ucz86IHsgdGltZW91dD86IG51bWJlciB9KTogUHJvbWlzZTxQaW5nPiB7XG4gICAgICAgICAgICAvLyBveGxpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYXN5bmMtcHJvbWlzZS1leGVjdXRvclxuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlPFBpbmc+KGFzeW5jIChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdXJsID0gYCR7YXdhaXQgYmFzZVVybFByb21pc2V9L2dlbmVyYXRlXzIwNGA7XG4gICAgICAgICAgICAgICAgY29uc3QgdGltZW91dCA9IHN0YXJnYXRlT3B0aW9ucz8udGltZW91dCA/PyBvcHRpb25zPy50aW1lb3V0ID8/IDYwMDA7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhcnRzVGltZSA9IERhdGUubm93KCk7XG4gICAgICAgICAgICAgICAgY29uc3QgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZW5kc1RpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKFt7IGNvbm5lY3Q6IGZhbHNlLCBkZWxheTogZW5kc1RpbWUgLSBzdGFydHNUaW1lLCBlcnJvcjogeyBSRVFVRVNUX1RJTUVPVVQ6IHsgdGltZW91dCwgbWVzc2FnZTogYEV4ZWN1dGUgdGltZW91dCBhZnRlciAke3RpbWVvdXR9bXMuYCB9IH0gfSwgbnVsbF0pO1xuICAgICAgICAgICAgICAgIH0sIHRpbWVvdXQpO1xuXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCAkZmV0Y2godXJsLCB7IG1ldGhvZDogJ0hFQUQnIH0pO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmRzVGltZSA9IERhdGUubm93KCk7XG4gICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShbeyBjb25uZWN0OiBmYWxzZSwgZGVsYXk6IGVuZHNUaW1lIC0gc3RhcnRzVGltZSwgZXJyb3I6IHsgUkVRVUVTVF9GQUlMOiB7IHJlc3BvbnNlLCBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cywgbWVzc2FnZTogJ1N0YXR1cyBjb2RlIG5vdCAyMDQnIH0gfSB9LCBudWxsXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKFtudWxsLCB7IGNvbm5lY3Q6IHRydWUsIGRlbGF5OiBlbmRzVGltZSAtIHN0YXJ0c1RpbWUsIHNlcnZlclRpbWVzdGFtcDogTnVtYmVyKHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdDb250ZW50LVR5cGUnKSEuc3Vic3RyaW5nKDE3KSkgfV0pO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZW5kc1RpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW3sgY29ubmVjdDogZmFsc2UsIGRlbGF5OiBlbmRzVGltZSAtIHN0YXJ0c1RpbWUsIGVycm9yIH0sIG51bGxdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICAkdHlwZXM6IHVuZGVmaW5lZCBhcyB1bmtub3duIGFzIHtcbiAgICAgICAgICAgIGdlbmVyYXRlZDogR2VuZXJhdGVkO1xuICAgICAgICAgICAgZXJyb3I6IEdlbmVyYXRlZFsncmVqZWN0Q29kZSddO1xuICAgICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICAgICAgW1BhdGggaW4ga2V5b2YgR2VuZXJhdGVkWydyb3V0ZVNjaGVtYSddXTogR2VuZXJhdGVkWydyb3V0ZVNjaGVtYSddW1BhdGhdWyd0eXBlcyddWydwYXJhbXMnXTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXN1bHRzOiB7XG4gICAgICAgICAgICAgICAgW1BhdGggaW4ga2V5b2YgR2VuZXJhdGVkWydyb3V0ZVNjaGVtYSddXTogR2VuZXJhdGVkWydyb3V0ZVNjaGVtYSddW1BhdGhdWyd0eXBlcyddWyfwn6WbJ10gZXh0ZW5kcyBib29sZWFuXG4gICAgICAgICAgICAgICAgPyAvLyBhY3Rpb25cbiAgICAgICAgICAgICAgICBHZW5lcmF0ZWRbJ3JvdXRlU2NoZW1hJ11bUGF0aF1bJ3R5cGVzJ11bJ3Jlc3VsdCddXG4gICAgICAgICAgICAgICAgOiAvLyBzdHJlYW1cbiAgICAgICAgICAgICAgICBBc3luY0dlbmVyYXRvcjxbUGFydGlhbDxHZW5lcmF0ZWRbJ3JlamVjdENvZGUnXT4sIG51bGxdIHwgW251bGwsIEdlbmVyYXRvckdlbmVyaWM8R2VuZXJhdGVkWydyb3V0ZVNjaGVtYSddW1BhdGhdWyd0eXBlcyddWydyZXN1bHQnXT5dLCB1bmRlZmluZWQ+O1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHN0YXJnYXRlO1xufVxuXG5jb25zdCBpc29EYXRlUGF0dGVybiA9IC9eKFxcZHs0fS1cXGR7Mn0tXFxkezJ9VFxcZHsyfTpcXGR7Mn06XFxkezJ9KD86XFwuXFxkezEsM30pPykoWnxbKy1dXFxkezJ9Oj9cXGR7Mn0pPyQvO1xuXG5leHBvcnQgZnVuY3Rpb24gcmV2aXZlSlNPTlBhcnNlPFQ+KGpzb246IFQpOiBUIHtcbiAgICBpZiAoanNvbiA9PT0gbnVsbCB8fCBqc29uID09PSB1bmRlZmluZWQpIHJldHVybiBqc29uO1xuICAgIGNvbnN0IHR5cGUgPSB0eXBlb2YganNvbjtcbiAgICBpZiAodHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgaWYgKGpzb24gaW5zdGFuY2VvZiBEYXRlKSByZXR1cm4ganNvbjtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoanNvbikpIHtcbiAgICAgICAgICAgIGNvbnN0IGxlbiA9IGpzb24ubGVuZ3RoO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHJldml2ZUpTT05QYXJzZShqc29uW2ldKTtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICE9PSBqc29uW2ldKSBqc29uW2ldID0gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGpzb247XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGpzb24gYXMgb2JqZWN0KTtcbiAgICAgICAgY29uc3Qgb2JqID0ganNvbiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBrZXkgPSBrZXlzW2ldO1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBvYmpba2V5XTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHJldml2ZUpTT05QYXJzZSh2YWx1ZSk7XG4gICAgICAgICAgICBpZiAocmVzdWx0ICE9PSB2YWx1ZSkgb2JqW2tleV0gPSByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGpzb247XG4gICAgfVxuICAgIGlmICh0eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgICBjb25zdCBzdHIgPSBqc29uIGFzIHVua25vd24gYXMgc3RyaW5nO1xuICAgICAgICAvLyBRdWljayByZWplY3Q6IElTTyBkYXRlIHN0cmluZ3MgbXVzdCBzdGFydCB3aXRoIGEgZGlnaXQgYW5kIGNvbnRhaW4gJ1QnXG4gICAgICAgIGNvbnN0IGxlbiA9IHN0ci5sZW5ndGg7XG4gICAgICAgIGlmIChsZW4gPj0gMjAgJiYgbGVuIDw9IDMyICYmIHN0ci5jaGFyQ29kZUF0KDApID49IDB4MzAgJiYgc3RyLmNoYXJDb2RlQXQoMCkgPD0gMHgzOSAmJiBzdHIuaW5kZXhPZignVCcpICE9PSAtMSkge1xuICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSBzdHIubWF0Y2goaXNvRGF0ZVBhdHRlcm4pO1xuICAgICAgICAgICAgaWYgKG1hdGNoICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoWzJdKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbG9uUG9zID0gbWF0Y2hbMl0uY2hhckNvZGVBdCgzKSA9PT0gNTggPyBtYXRjaFsxXS5sZW5ndGggKyAzIDogLTE7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb2xvblBvcyA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERhdGUoc3RyLnN1YnN0cmluZygwLCBjb2xvblBvcykgKyBzdHIuc3Vic3RyaW5nKGNvbG9uUG9zICsgMSkpIGFzIGFueTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERhdGUoc3RyKSBhcyBhbnk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZShtYXRjaFsxXSArICdaJykgYXMgYW55O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBqc29uO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV4ZWN1dGVTdHJlYW1PcHRpb25zIHtcbiAgICBoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgICB0aW1lb3V0PzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFwaVNjaGVtYUV4dGVuZCB7XG4gICAgYXBpVmFsaWRhdG9yOiB7XG4gICAgICAgIGdlbmVyYXRlZEF0OiBudW1iZXI7XG4gICAgICAgIHZhbGlkYXRlOiBSZWNvcmQ8YW55LCBhbnk+O1xuICAgIH07XG4gICAgYXBpTWV0aG9kc1NjaGVtYTogUmVjb3JkPGFueSwgYW55PjtcbiAgICBhcGlNZXRob2RzVHlwZVNjaGVtYTogUmVjb3JkPGFueSwgYW55PjtcbiAgICBhcGlUZXN0c1NjaGVtYTogUmVjb3JkPGFueSwgYW55Pjtcbn1cblxuZXhwb3J0IHR5cGUgRmFpbENvZGVFeHRlbmQgPSBSZWNvcmQ8YW55LCAoLi4uYXJnczogQXJyYXk8YW55PikgPT4gYW55PjtcblxuZXhwb3J0IHR5cGUgQm9vdHN0cmFwTWlkZGxld2FyZSA9IChkYXRhOiB7IHN0b3JhZ2U6IENsaWVudFN0b3JhZ2UgfSkgPT4gUHJvbWlzZTx2b2lkPiB8IHZvaWQ7XG5leHBvcnQgdHlwZSBCZWZvcmVFeGVjdXRlTWlkZGxld2FyZSA9IChkYXRhOiB7IHBhdGg6IHN0cmluZzsgcGFyYW1zOiBhbnk7IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47IHN0b3JhZ2U6IENsaWVudFN0b3JhZ2UgfSkgPT4gUHJvbWlzZTx2b2lkPiB8IHZvaWQ7XG5leHBvcnQgdHlwZSBBZnRlckV4ZWN1dGVNaWRkbGV3YXJlID0gKGRhdGE6IHsgcGF0aDogc3RyaW5nOyByZXN1bHQ6IHsgdmFsdWU6IGFueSB9OyBzdG9yYWdlOiBDbGllbnRTdG9yYWdlIH0pID0+IFByb21pc2U8dm9pZD4gfCB2b2lkO1xuXG5leHBvcnQgaW50ZXJmYWNlIE1pZGRsZXdhcmVPcHRpb25zIHtcbiAgICBib290c3RyYXA/OiBCb290c3RyYXBNaWRkbGV3YXJlO1xuICAgIGJlZm9yZUV4ZWN1dGU/OiBCZWZvcmVFeGVjdXRlTWlkZGxld2FyZTtcbiAgICBhZnRlckV4ZWN1dGU/OiBBZnRlckV4ZWN1dGVNaWRkbGV3YXJlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENsaWVudFN0b3JhZ2Uge1xuICAgIGdldEl0ZW06IChrZXk6IHN0cmluZykgPT4gUHJvbWlzZTxzdHJpbmcgfCBudWxsPjtcbiAgICBzZXRJdGVtOiAoa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD47XG4gICAgcmVtb3ZlSXRlbTogKGtleTogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV4ZWN1dGVSZXN1bHRTdWNjZXNzPFJlc3VsdD4ge1xuICAgIGV4ZWN1dGVJZDogc3RyaW5nO1xuICAgIHN1Y2Nlc3M6IHRydWU7XG4gICAgZGF0YTogUmVzdWx0O1xufVxuXG5leHBvcnQgdHlwZSBHZW5lcmF0b3JHZW5lcmljPFQ+ID0gVCBleHRlbmRzIEFzeW5jR2VuZXJhdG9yPGluZmVyIEk+ID8gSSA6IG5ldmVyO1xuXG5leHBvcnQgdHlwZSBGbGF0dGVuS2V5czxULCBQcmVmaXggZXh0ZW5kcyBzdHJpbmcgPSAnJz4gPSB7XG4gICAgW0sgaW4ga2V5b2YgVF06IFRbS10gZXh0ZW5kcyBvYmplY3QgPyBGbGF0dGVuS2V5czxUW0tdLCBgJHtQcmVmaXh9JHtFeGNsdWRlPEssIHN5bWJvbD59LmA+IDogYCRpbnB1dC4ke1ByZWZpeH0ke0V4Y2x1ZGU8Sywgc3ltYm9sPn1gO1xufVtrZXlvZiBUXTtcblxuLy8gKioqIFRoaXMgcGFydCBvZiB0aGUgY29kZSBpcyBiYXNlZCBvbiBgQG1pY3Jvc29mdC9mZXRjaC1ldmVudC1zb3VyY2VgIHJld3JpdGUsIHRoYW5rcyB0byB0aGUgd29yayBvZiBNaWNyb3NvZnQgKioqIC8vXG4vLyAqKiogaHR0cHM6Ly9naXRodWIuY29tL0F6dXJlL2ZldGNoLWV2ZW50LXNvdXJjZS9ibG9iL21haW4vc3JjL3BhcnNlLnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiogLy9cblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgbWVzc2FnZSBzZW50IGluIGFuIGV2ZW50IHN0cmVhbVxuICogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1NlcnZlci1zZW50X2V2ZW50cy9Vc2luZ19zZXJ2ZXItc2VudF9ldmVudHMjRXZlbnRfc3RyZWFtX2Zvcm1hdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEV2ZW50U291cmNlTWVzc2FnZSB7XG4gICAgZGF0YTogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgUmVhZGFibGVTdHJlYW0gaW50byBhIGNhbGxiYWNrIHBhdHRlcm4uXG4gKiBAcGFyYW0gc3RyZWFtIFRoZSBpbnB1dCBSZWFkYWJsZVN0cmVhbS5cbiAqIEBwYXJhbSBvbkNodW5rIEEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCBvbiBlYWNoIG5ldyBieXRlIGNodW5rIGluIHRoZSBzdHJlYW0uXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgd2lsbCBiZSByZXNvbHZlZCB3aGVuIHRoZSBzdHJlYW0gY2xvc2VzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0Qnl0ZXMoc3RyZWFtOiBSZWFkYWJsZVN0cmVhbTxVaW50OEFycmF5Piwgb25DaHVuazogKGFycjogVWludDhBcnJheSkgPT4gdm9pZCkge1xuICAgIGNvbnN0IHJlYWRlciA9IHN0cmVhbS5nZXRSZWFkZXIoKTtcbiAgICBsZXQgcmVzdWx0OiBSZWFkYWJsZVN0cmVhbVJlYWRSZXN1bHQ8VWludDhBcnJheT47XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHdoaWxlICghKHJlc3VsdCA9IGF3YWl0IHJlYWRlci5yZWFkKCkpLmRvbmUpIHtcbiAgICAgICAgb25DaHVuayhyZXN1bHQudmFsdWUpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBQYXJzZXMgYXJiaXRhcnkgYnl0ZSBjaHVua3MgaW50byBFdmVudFNvdXJjZSBsaW5lIGJ1ZmZlcnMuXG4gKiBFYWNoIGxpbmUgc2hvdWxkIGJlIG9mIHRoZSBmb3JtYXQgXCJmaWVsZDogdmFsdWVcIiBhbmQgZW5kcyB3aXRoIFxcciwgXFxuLCBvciBcXHJcXG4uXG4gKiBAcGFyYW0gb25MaW5lIEEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCBvbiBlYWNoIG5ldyBFdmVudFNvdXJjZSBsaW5lLlxuICogQHJldHVybnMgQSBmdW5jdGlvbiB0aGF0IHNob3VsZCBiZSBjYWxsZWQgZm9yIGVhY2ggaW5jb21pbmcgYnl0ZSBjaHVuay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldExpbmVzKG9uTGluZTogKGxpbmU6IFVpbnQ4QXJyYXksIGZpZWxkTGVuZ3RoOiBudW1iZXIpID0+IHZvaWQpIHtcbiAgICBsZXQgYnVmZmVyOiBVaW50OEFycmF5IHwgdW5kZWZpbmVkO1xuICAgIGxldCBwb3NpdGlvbjogbnVtYmVyOyAvLyBjdXJyZW50IHJlYWQgcG9zaXRpb25cbiAgICBsZXQgZmllbGRMZW5ndGg6IG51bWJlcjsgLy8gbGVuZ3RoIG9mIHRoZSBgZmllbGRgIHBvcnRpb24gb2YgdGhlIGxpbmVcbiAgICBsZXQgZGlzY2FyZFRyYWlsaW5nTmV3bGluZSA9IGZhbHNlO1xuXG4gICAgLy8gcmV0dXJuIGEgZnVuY3Rpb24gdGhhdCBjYW4gcHJvY2VzcyBlYWNoIGluY29taW5nIGJ5dGUgY2h1bms6XG4gICAgcmV0dXJuIGZ1bmN0aW9uIG9uQ2h1bmsoYXJyOiBVaW50OEFycmF5KSB7XG4gICAgICAgIGlmIChidWZmZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgYnVmZmVyID0gYXJyO1xuICAgICAgICAgICAgcG9zaXRpb24gPSAwO1xuICAgICAgICAgICAgZmllbGRMZW5ndGggPSAtMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIHdlJ3JlIHN0aWxsIHBhcnNpbmcgdGhlIG9sZCBsaW5lLiBBcHBlbmQgdGhlIG5ldyBieXRlcyBpbnRvIGJ1ZmZlcjpcbiAgICAgICAgICAgIGJ1ZmZlciA9IGNvbmNhdChidWZmZXIsIGFycik7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBidWZMZW5ndGggPSBidWZmZXIubGVuZ3RoO1xuICAgICAgICBsZXQgbGluZVN0YXJ0ID0gMDsgLy8gaW5kZXggd2hlcmUgdGhlIGN1cnJlbnQgbGluZSBzdGFydHNcbiAgICAgICAgd2hpbGUgKHBvc2l0aW9uIDwgYnVmTGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAoZGlzY2FyZFRyYWlsaW5nTmV3bGluZSkge1xuICAgICAgICAgICAgICAgIGlmIChidWZmZXJbcG9zaXRpb25dID09PSAxMCkge1xuICAgICAgICAgICAgICAgICAgICBsaW5lU3RhcnQgPSArK3Bvc2l0aW9uOyAvLyBza2lwIHRvIG5leHQgY2hhclxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGRpc2NhcmRUcmFpbGluZ05ld2xpbmUgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gc3RhcnQgbG9va2luZyBmb3J3YXJkIHRpbGwgdGhlIGVuZCBvZiBsaW5lOlxuICAgICAgICAgICAgbGV0IGxpbmVFbmQgPSAtMTsgLy8gaW5kZXggb2YgdGhlIFxcciBvciBcXG4gY2hhclxuICAgICAgICAgICAgZm9yICg7IHBvc2l0aW9uIDwgYnVmTGVuZ3RoICYmIGxpbmVFbmQgPT09IC0xOyArK3Bvc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChidWZmZXJbcG9zaXRpb25dKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTg6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGRMZW5ndGggPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmlyc3QgY29sb24gaW4gbGluZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkTGVuZ3RoID0gcG9zaXRpb24gLSBsaW5lU3RhcnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGlzY2FyZFRyYWlsaW5nTmV3bGluZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBsaW5lRW5kID0gcG9zaXRpb247XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgICAgICAgICAgICAgICAgbGluZUVuZCA9IHBvc2l0aW9uO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobGluZUVuZCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAvLyBXZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciBidXQgdGhlIGxpbmUgaGFzbid0IGVuZGVkLlxuICAgICAgICAgICAgICAgIC8vIFdhaXQgZm9yIHRoZSBuZXh0IGFyciBhbmQgdGhlbiBjb250aW51ZSBwYXJzaW5nOlxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyB3ZSd2ZSByZWFjaGVkIHRoZSBsaW5lIGVuZCwgc2VuZCBpdCBvdXQ6XG4gICAgICAgICAgICBvbkxpbmUoYnVmZmVyLnN1YmFycmF5KGxpbmVTdGFydCwgbGluZUVuZCksIGZpZWxkTGVuZ3RoKTtcbiAgICAgICAgICAgIGxpbmVTdGFydCA9IHBvc2l0aW9uOyAvLyB3ZSdyZSBub3cgb24gdGhlIG5leHQgbGluZVxuICAgICAgICAgICAgZmllbGRMZW5ndGggPSAtMTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChsaW5lU3RhcnQgPT09IGJ1Zkxlbmd0aCkge1xuICAgICAgICAgICAgYnVmZmVyID0gdW5kZWZpbmVkOyAvLyB3ZSd2ZSBmaW5pc2hlZCByZWFkaW5nIGl0XG4gICAgICAgIH0gZWxzZSBpZiAobGluZVN0YXJ0ICE9PSAwKSB7XG4gICAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgdmlldyBpbnRvIGJ1ZmZlciBiZWdpbm5pbmcgYXQgbGluZVN0YXJ0IHNvIHdlIGRvbid0XG4gICAgICAgICAgICAvLyBuZWVkIHRvIGNvcHkgb3ZlciB0aGUgcHJldmlvdXMgbGluZXMgd2hlbiB3ZSBnZXQgdGhlIG5ldyBhcnI6XG4gICAgICAgICAgICBidWZmZXIgPSBidWZmZXIuc3ViYXJyYXkobGluZVN0YXJ0KTtcbiAgICAgICAgICAgIHBvc2l0aW9uIC09IGxpbmVTdGFydDtcbiAgICAgICAgfVxuICAgIH07XG59XG5cbi8qKlxuICogUGFyc2VzIGxpbmUgYnVmZmVycyBpbnRvIEV2ZW50U291cmNlTWVzc2FnZXMuXG4gKiBAcGFyYW0gb25JZCBBIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQgb24gZWFjaCBgaWRgIGZpZWxkLlxuICogQHBhcmFtIG9uUmV0cnkgQSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIG9uIGVhY2ggYHJldHJ5YCBmaWVsZC5cbiAqIEBwYXJhbSBvbk1lc3NhZ2UgQSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIG9uIGVhY2ggbWVzc2FnZS5cbiAqIEByZXR1cm5zIEEgZnVuY3Rpb24gdGhhdCBzaG91bGQgYmUgY2FsbGVkIGZvciBlYWNoIGluY29taW5nIGxpbmUgYnVmZmVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWVzc2FnZXMob25NZXNzYWdlPzogKG1zZzogRXZlbnRTb3VyY2VNZXNzYWdlKSA9PiB2b2lkKSB7XG4gICAgbGV0IG1lc3NhZ2UgPSBuZXdNZXNzYWdlKCk7XG4gICAgY29uc3QgZGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpO1xuXG4gICAgLy8gcmV0dXJuIGEgZnVuY3Rpb24gdGhhdCBjYW4gcHJvY2VzcyBlYWNoIGluY29taW5nIGxpbmUgYnVmZmVyOlxuICAgIHJldHVybiBmdW5jdGlvbiBvbkxpbmUobGluZTogVWludDhBcnJheSwgZmllbGRMZW5ndGg6IG51bWJlcikge1xuICAgICAgICBpZiAobGluZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIC8vIGVtcHR5IGxpbmUgZGVub3RlcyBlbmQgb2YgbWVzc2FnZS4gVHJpZ2dlciB0aGUgY2FsbGJhY2sgYW5kIHN0YXJ0IGEgbmV3IG1lc3NhZ2U6XG4gICAgICAgICAgICBvbk1lc3NhZ2U/LihtZXNzYWdlKTtcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBuZXdNZXNzYWdlKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoZmllbGRMZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAvLyBleGNsdWRlIGNvbW1lbnRzIGFuZCBsaW5lcyB3aXRoIG5vIHZhbHVlc1xuICAgICAgICAgICAgLy8gbGluZSBpcyBvZiBmb3JtYXQgXCI8ZmllbGQ+Ojx2YWx1ZT5cIiBvciBcIjxmaWVsZD46IDx2YWx1ZT5cIlxuICAgICAgICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc2VydmVyLXNlbnQtZXZlbnRzLmh0bWwjZXZlbnQtc3RyZWFtLWludGVycHJldGF0aW9uXG4gICAgICAgICAgICBjb25zdCBmaWVsZCA9IGRlY29kZXIuZGVjb2RlKGxpbmUuc3ViYXJyYXkoMCwgZmllbGRMZW5ndGgpKTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlT2Zmc2V0ID0gZmllbGRMZW5ndGggKyAobGluZVtmaWVsZExlbmd0aCArIDFdID09PSAzMiA/IDIgOiAxKTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZGVjb2Rlci5kZWNvZGUobGluZS5zdWJhcnJheSh2YWx1ZU9mZnNldCkpO1xuXG4gICAgICAgICAgICBzd2l0Y2ggKGZpZWxkKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnZGF0YSc6XG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoaXMgbWVzc2FnZSBhbHJlYWR5IGhhcyBkYXRhLCBhcHBlbmQgdGhlIG5ldyB2YWx1ZSB0byB0aGUgb2xkLlxuICAgICAgICAgICAgICAgICAgICAvLyBvdGhlcndpc2UsIGp1c3Qgc2V0IHRvIHRoZSBuZXcgdmFsdWU6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZGF0YSA9IG1lc3NhZ2UuZGF0YSA/IGAke21lc3NhZ2UuZGF0YX1cXG4ke3ZhbHVlfWAgOiB2YWx1ZTsgLy8gb3RoZXJ3aXNlLFxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG59XG5cbmZ1bmN0aW9uIGNvbmNhdChhOiBVaW50OEFycmF5LCBiOiBVaW50OEFycmF5KSB7XG4gICAgY29uc3QgcmVzID0gbmV3IFVpbnQ4QXJyYXkoYS5sZW5ndGggKyBiLmxlbmd0aCk7XG4gICAgcmVzLnNldChhKTtcbiAgICByZXMuc2V0KGIsIGEubGVuZ3RoKTtcbiAgICByZXR1cm4gcmVzO1xufVxuXG5mdW5jdGlvbiBuZXdNZXNzYWdlKCk6IEV2ZW50U291cmNlTWVzc2FnZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZGF0YTogJycsXG4gICAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdpdGhSZXNvbHZlcnM8VCA9IGFueT4oKTogUHJvbWlzZVdpdGhSZXNvbHZlcnM8VD4ge1xuICAgIGxldCByZXNvbHZlOiBQcm9taXNlV2l0aFJlc29sdmVyczxUPlsncmVzb2x2ZSddO1xuICAgIGxldCByZWplY3Q6IFByb21pc2VXaXRoUmVzb2x2ZXJzPFQ+WydyZWplY3QnXTtcbiAgICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2U8VD4oKHJlcywgcmVqKSA9PiB7XG4gICAgICAgIHJlc29sdmUgPSByZXM7XG4gICAgICAgIHJlamVjdCA9IHJlajtcbiAgICB9KTtcbiAgICByZXR1cm4geyBwcm9taXNlLCByZXNvbHZlOiByZXNvbHZlISwgcmVqZWN0OiByZWplY3QhIH07XG59XG5cbmNvbnN0IERCX05BTUUgPSAnU3RhcmdhdGUnO1xuY29uc3QgU1RPUkVfTkFNRSA9ICdjYWNoZXMnO1xubGV0IGRiSW5zdGFuY2U6IElEQkRhdGFiYXNlIHwgbnVsbCA9IG51bGw7XG5cbmFzeW5jIGZ1bmN0aW9uIG9wZW5EQigpOiBQcm9taXNlPElEQkRhdGFiYXNlPiB7XG4gICAgaWYgKGRiSW5zdGFuY2UpIHJldHVybiBkYkluc3RhbmNlO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IGluZGV4ZWREQi5vcGVuKERCX05BTUUsIDEpO1xuICAgICAgICByZXF1ZXN0Lm9uZXJyb3IgPSAoKSA9PiByZWplY3QocmVxdWVzdC5lcnJvcik7XG4gICAgICAgIHJlcXVlc3Qub25zdWNjZXNzID0gKCkgPT4ge1xuICAgICAgICAgICAgZGJJbnN0YW5jZSA9IHJlcXVlc3QucmVzdWx0O1xuICAgICAgICAgICAgcmVzb2x2ZShkYkluc3RhbmNlKTtcbiAgICAgICAgfTtcbiAgICAgICAgcmVxdWVzdC5vbnVwZ3JhZGVuZWVkZWQgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGRiID0gKGV2ZW50LnRhcmdldCBhcyBJREJPcGVuREJSZXF1ZXN0KS5yZXN1bHQ7XG4gICAgICAgICAgICBpZiAoIWRiLm9iamVjdFN0b3JlTmFtZXMuY29udGFpbnMoU1RPUkVfTkFNRSkpIHtcbiAgICAgICAgICAgICAgICBkYi5jcmVhdGVPYmplY3RTdG9yZShTVE9SRV9OQU1FKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9KTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZURlZmF1bHRDYWNoZVN0b3JhZ2Uob3B0aW9ucz86IHsgZW5jcnlwdGlvbj86IGJvb2xlYW47IGVuY3J5cHRpb25LZXk/OiBzdHJpbmcgfSk6IFByb21pc2U8Q2FjaGVTdG9yYWdlPiB7XG4gICAgYXdhaXQgb3BlbkRCKCk7XG5cbiAgICBsZXQgZW5jcnlwdGlvbktleTogQ3J5cHRvS2V5IHwgbnVsbCA9IG51bGw7XG4gICAgY29uc3QgY291bnRlciA9IG5ldyBVaW50OEFycmF5KDE2KTtcblxuICAgIGlmIChvcHRpb25zPy5lbmNyeXB0aW9uKSB7XG4gICAgICAgIGNvbnN0IGtleVN0cmluZyA9IG9wdGlvbnMuZW5jcnlwdGlvbktleSA/PyBEQl9OQU1FO1xuICAgICAgICBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoa2V5U3RyaW5nKS5mb3JFYWNoKChieXRlLCBpKSA9PiB7XG4gICAgICAgICAgICBpZiAoaSA8IDE2KSBjb3VudGVyW2ldID0gYnl0ZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgZW5jb2RlciA9IG5ldyBUZXh0RW5jb2RlcigpO1xuICAgICAgICBjb25zdCBrZXlEYXRhID0gZW5jb2Rlci5lbmNvZGUoa2V5U3RyaW5nKTtcbiAgICAgICAgY29uc3QgaW1wb3J0ZWRLZXkgPSBhd2FpdCBjcnlwdG8uc3VidGxlLmltcG9ydEtleSgncmF3Jywga2V5RGF0YSwgeyBuYW1lOiAnUEJLREYyJyB9LCBmYWxzZSwgWydkZXJpdmVLZXknXSk7XG5cbiAgICAgICAgZW5jcnlwdGlvbktleSA9IGF3YWl0IGNyeXB0by5zdWJ0bGUuZGVyaXZlS2V5KFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdQQktERjInLFxuICAgICAgICAgICAgICAgIHNhbHQ6IGVuY29kZXIuZW5jb2RlKCdtaWxraW8tc3RhcmdhdGUtY2FjaGUnKSxcbiAgICAgICAgICAgICAgICBpdGVyYXRpb25zOiAxMDAwMDAsXG4gICAgICAgICAgICAgICAgaGFzaDogJ1NIQS0yNTYnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGltcG9ydGVkS2V5LFxuICAgICAgICAgICAgeyBuYW1lOiAnQUVTLUNUUicsIGxlbmd0aDogMjU2IH0sXG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgIFsnZW5jcnlwdCcsICdkZWNyeXB0J10sXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgZW5jcnlwdERhdGEgPSBhc3luYyAoZGF0YTogYW55KTogUHJvbWlzZTxVaW50OEFycmF5PiA9PiB7XG4gICAgICAgIGlmICghZW5jcnlwdGlvbktleSkgcmV0dXJuIGRhdGE7XG5cbiAgICAgICAgY29uc3QganNvblN0cmluZyA9IEpTT04uc3RyaW5naWZ5KGRhdGEpO1xuICAgICAgICBjb25zdCBlbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKCk7XG4gICAgICAgIGNvbnN0IGRhdGFCeXRlcyA9IGVuY29kZXIuZW5jb2RlKGpzb25TdHJpbmcpO1xuXG4gICAgICAgIGNvbnN0IGVuY3J5cHRlZEFycmF5QnVmZmVyID0gYXdhaXQgY3J5cHRvLnN1YnRsZS5lbmNyeXB0KFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdBRVMtQ1RSJyxcbiAgICAgICAgICAgICAgICBjb3VudGVyOiBjb3VudGVyLFxuICAgICAgICAgICAgICAgIGxlbmd0aDogNjQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZW5jcnlwdGlvbktleSEsXG4gICAgICAgICAgICBkYXRhQnl0ZXMsXG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGVuY3J5cHRlZEFycmF5QnVmZmVyKTtcbiAgICB9O1xuXG4gICAgY29uc3QgZGVjcnlwdERhdGEgPSBhc3luYyAoZW5jcnlwdGVkRGF0YTogQXJyYXlCdWZmZXIgfCBVaW50OEFycmF5KTogUHJvbWlzZTxhbnk+ID0+IHtcbiAgICAgICAgaWYgKCFlbmNyeXB0aW9uS2V5IHx8ICFlbmNyeXB0ZWREYXRhKSByZXR1cm4gZW5jcnlwdGVkRGF0YTtcblxuICAgICAgICBjb25zdCBhcnJheUJ1ZmZlciA9IGVuY3J5cHRlZERhdGEgaW5zdGFuY2VvZiBVaW50OEFycmF5ID8gKGVuY3J5cHRlZERhdGEuYnVmZmVyIGFzIEFycmF5QnVmZmVyKSA6IGVuY3J5cHRlZERhdGE7XG5cbiAgICAgICAgY29uc3QgZGVjcnlwdGVkQnl0ZXMgPSBhd2FpdCBjcnlwdG8uc3VidGxlLmRlY3J5cHQoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogJ0FFUy1DVFInLFxuICAgICAgICAgICAgICAgIGNvdW50ZXI6IGNvdW50ZXIsXG4gICAgICAgICAgICAgICAgbGVuZ3RoOiA2NCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlbmNyeXB0aW9uS2V5ISxcbiAgICAgICAgICAgIGFycmF5QnVmZmVyLFxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IGRlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoKTtcbiAgICAgICAgY29uc3QganNvblN0cmluZyA9IGRlY29kZXIuZGVjb2RlKGRlY3J5cHRlZEJ5dGVzKTtcbiAgICAgICAgcmV0dXJuIHJldml2ZUpTT05QYXJzZShKU09OLnBhcnNlKGpzb25TdHJpbmcpKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgYXN5bmMgZ2V0KGtleTogc3RyaW5nKTogUHJvbWlzZTx7IGRhdGE6IGFueTsgdGltZXN0YW1wOiBudW1iZXIgfSB8IG51bGw+IHtcbiAgICAgICAgICAgIGNvbnN0IGRiID0gYXdhaXQgb3BlbkRCKCk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gZGIudHJhbnNhY3Rpb24oU1RPUkVfTkFNRSwgJ3JlYWRvbmx5Jyk7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RvcmUgPSB0cmFuc2FjdGlvbi5vYmplY3RTdG9yZShTVE9SRV9OQU1FKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXF1ZXN0ID0gc3RvcmUuZ2V0KGtleSk7XG4gICAgICAgICAgICAgICAgcmVxdWVzdC5vbmVycm9yID0gKCkgPT4gcmVqZWN0KHJlcXVlc3QuZXJyb3IpO1xuICAgICAgICAgICAgICAgIHJlcXVlc3Qub25zdWNjZXNzID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSByZXF1ZXN0LnJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUobnVsbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucz8uZW5jcnlwdGlvbiAmJiAocmVzdWx0LmRhdGEgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlciB8fCByZXN1bHQuZGF0YSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkZWNyeXB0ZWREYXRhID0gYXdhaXQgZGVjcnlwdERhdGEocmVzdWx0LmRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh7IGRhdGE6IGRlY3J5cHRlZERhdGEsIHRpbWVzdGFtcDogcmVzdWx0LnRpbWVzdGFtcCB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzdWx0ID8/IG51bGwpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgYXN5bmMgc2V0KGtleTogc3RyaW5nLCBkYXRhOiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgICAgIGNvbnN0IGRiID0gYXdhaXQgb3BlbkRCKCk7XG4gICAgICAgICAgICBsZXQgZGF0YVRvU3RvcmU6IGFueSA9IGRhdGE7XG5cbiAgICAgICAgICAgIGlmIChvcHRpb25zPy5lbmNyeXB0aW9uKSB7XG4gICAgICAgICAgICAgICAgZGF0YVRvU3RvcmUgPSBhd2FpdCBlbmNyeXB0RGF0YShkYXRhKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IGRiLnRyYW5zYWN0aW9uKFNUT1JFX05BTUUsICdyZWFkd3JpdGUnKTtcbiAgICAgICAgICAgICAgICBjb25zdCBzdG9yZSA9IHRyYW5zYWN0aW9uLm9iamVjdFN0b3JlKFNUT1JFX05BTUUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlcXVlc3QgPSBzdG9yZS5wdXQoeyBkYXRhOiBkYXRhVG9TdG9yZSwgdGltZXN0YW1wOiBEYXRlLm5vdygpIH0sIGtleSk7XG4gICAgICAgICAgICAgICAgcmVxdWVzdC5vbmVycm9yID0gKCkgPT4gcmVqZWN0KHJlcXVlc3QuZXJyb3IpO1xuICAgICAgICAgICAgICAgIHJlcXVlc3Qub25zdWNjZXNzID0gKCkgPT4gcmVzb2x2ZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgfTtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVDYWNoZUtleShwYXRoOiBzdHJpbmcsIHBhcmFtczogYW55KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7cGF0aH06JHtKU09OLnN0cmluZ2lmeShwYXJhbXMgPz8ge30pfWA7XG59XG4iCiAgXSwKICAibWFwcGluZ3MiOiAiOzs7O0FBa0RBLGVBQXNCLGNBQXVFLENBQUMsaUJBQXdDO0FBQUEsRUFDbEksTUFBTSxTQUFTLGdCQUFnQixTQUFTO0FBQUEsRUFDeEMsTUFBTSxTQUFTLGdCQUFnQixTQUFTO0FBQUEsRUFJeEMsSUFBSSxrQkFBdUI7QUFBQSxFQUMzQixJQUFJLGdCQUFxQjtBQUFBLEVBQ3pCLElBQUk7QUFBQSxJQUdBLElBQUksT0FBTyxZQUFZLGVBQWUsT0FBUSxRQUFnQixhQUFhO0FBQUEsTUFDdkUsTUFBTSxPQUFPLE1BQWE7QUFBQSxNQUMxQixrQkFBa0IsS0FBSztBQUFBLE1BQ3ZCLGdCQUFnQixJQUFJLEtBQUssTUFBTSxFQUFFLFdBQVcsTUFBTSxZQUFZLElBQUksQ0FBQztBQUFBLElBQ3ZFO0FBQUEsSUFDRixNQUFNO0FBQUEsRUFNUixNQUFNLGlCQUFpQixrQkFDakIsQ0FBQyxLQUFhLFNBQWlDLFNBQWtDO0FBQUEsSUFDL0UsT0FBTyxJQUFJLFFBQVEsQ0FBQyxTQUFTLFdBQVc7QUFBQSxNQUNwQyxNQUFNLFlBQVksSUFBSSxJQUFJLEdBQUc7QUFBQSxNQUM3QixNQUFNLFVBQVU7QUFBQSxRQUNaLFVBQVUsVUFBVTtBQUFBLFFBQ3BCLE1BQU0sVUFBVSxRQUFRO0FBQUEsUUFDeEIsTUFBTSxV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QUFVO0FBQUEsUUFDekQsTUFBTSxRQUFRLFlBQVksWUFBWSxVQUFVO0FBQUEsUUFDaEQsTUFBTSxVQUFVLE1BQU0sSUFBSSxHQUFHO0FBQUEsUUFDN0IsUUFBUSxVQUFVLE1BQU0sT0FBTyxRQUFRLEtBQUs7QUFBQSxRQUM1QyxRQUFRLFlBQVksWUFBWTtBQUFBLFVBQzVCLE1BQU0sU0FBUyxRQUFRO0FBQUEsVUFDdkIsSUFBSSxDQUFDLFFBQVE7QUFBQSxZQUNULFFBQVEsSUFBSTtBQUFBLFlBQ1o7QUFBQSxVQUNKO0FBQUEsVUFFQSxJQUFJLFNBQVMsZUFBZSxPQUFPLGdCQUFnQixlQUFlLE9BQU8sZ0JBQWdCLGFBQWE7QUFBQSxZQUNsRyxNQUFNLGdCQUFnQixNQUFNLFlBQVksT0FBTyxJQUFJO0FBQUEsWUFDbkQsUUFBUSxFQUFFLE1BQU0sZUFBZSxXQUFXLE9BQU8sVUFBVSxDQUFDO0FBQUEsWUFDNUQ7QUFBQSxVQUNKO0FBQUEsVUFFQSxRQUFRLFVBQVUsSUFBSTtBQUFBO0FBQUEsT0FFN0I7QUFBQTtBQUFBLFNBRUMsSUFBRyxDQUFDLEtBQWEsTUFBMEI7QUFBQSxNQUM3QyxNQUFNLEtBQUssTUFBTSxPQUFPO0FBQUEsTUFDeEIsSUFBSSxjQUFtQjtBQUFBLE1BRXZCLElBQUksU0FBUyxZQUFZO0FBQUEsUUFDckIsY0FBYyxNQUFNLFlBQVksSUFBSTtBQUFBLE1BQ3hDO0FBQUEsTUFFQSxPQUFPLElBQUksUUFBUSxDQUFDLFNBQVMsV0FBVztBQUFBLFFBQ3BDLE1BQU0sY0FBYyxHQUFHLFlBQVksWUFBWSxXQUFXO0FBQUEsUUFDMUQsTUFBTSxRQUFRLFlBQVksWUFBWSxVQUFVO0FBQUEsUUFDaEQsTUFBTSxVQUFVLE1BQU0sSUFBSSxFQUFFLE1BQU0sYUFBYSxXQUFXLEtBQUssSUFBSSxFQUFFLEdBQUcsR0FBRztBQUFBLFFBQzNFLFFBQVEsVUFBVSxNQUFNLE9BQU8sUUFBUSxLQUFLO0FBQUEsUUFDNUMsUUFBUSxZQUFZLE1BQU0sUUFBUTtBQUFBLE9BQ3JDO0FBQUE7QUFBQSxFQUVUO0FBQUE7QUFHSixTQUFTLGdCQUFnQixDQUFDLE1BQWMsUUFBcUI7QUFBQSxFQUN6RCxPQUFPLEdBQUcsUUFBUSxLQUFLLFVBQVUsVUFBVSxDQUFDLENBQUM7QUFBQTsiLAogICJkZWJ1Z0lkIjogIjY3OEY1NDJEMkRCMkU3OUI2NDc1NkUyMTY0NzU2RTIxIiwKICAibmFtZXMiOiBbXQp9
|
|
710
|
+
//# debugId=E8853D10414D49B964756E2164756E21
|
|
711
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vaW5kZXgudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiZXhwb3J0IHR5cGUgTWlsa2lvU3RhcmdhdGVPcHRpb25zID0ge1xuICAgIGJhc2VVcmw6IHN0cmluZyB8ICgoKSA9PiBzdHJpbmcpIHwgKCgpID0+IFByb21pc2U8c3RyaW5nPik7XG4gICAgdGltZW91dD86IG51bWJlcjtcbiAgICBmZXRjaD86IHR5cGVvZiBmZXRjaDtcbiAgICBhYm9ydD86IHR5cGVvZiBBYm9ydENvbnRyb2xsZXI7XG4gICAgY2FjaGVTdG9yYWdlPzogQ2FjaGVTdG9yYWdlO1xuICAgIGNhY2hlRW5jcnlwdGlvbj86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgdHlwZSBNaXhpbjxULCBVPiA9IFUgJiBPbWl0PFQsIGtleW9mIFU+O1xuXG5leHBvcnQgdHlwZSBDYWNoZVN0cmF0ZWd5ID0gJ29mZicgfCAnZmFsbGJhY2snIHwgJ3Rocm90dGxlJztcblxuZXhwb3J0IHR5cGUgUmV0cnlTdHJhdGVneSA9IGJvb2xlYW4gfCBudW1iZXI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2FjaGVTdG9yYWdlIHtcbiAgICBnZXQ6IChrZXk6IHN0cmluZykgPT4gUHJvbWlzZTx7IGRhdGE6IGFueTsgdGltZXN0YW1wOiBudW1iZXIgfSB8IG51bGw+O1xuICAgIHNldDogKGtleTogc3RyaW5nLCBkYXRhOiBhbnkpID0+IFByb21pc2U8dm9pZD47XG59XG5cbmV4cG9ydCB0eXBlIEV4ZWN1dGVPcHRpb25zPFQgZXh0ZW5kcyBhbnk+ID0ge1xuICAgIHBhcmFtcz86IFJlY29yZDxhbnksIGFueT47XG4gICAgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gICAgdGltZW91dD86IG51bWJlcjtcbiAgICBiYXNlVXJsPzogc3RyaW5nIHwgKCgpID0+IHN0cmluZykgfCAoKCkgPT4gUHJvbWlzZTxzdHJpbmc+KTtcbiAgICBjYWNoZVN0cmF0ZWd5PzogQ2FjaGVTdHJhdGVneTtcbiAgICBjYWNoZVRocm90dGxlTXM/OiBudW1iZXI7XG4gICAgb25DYWNoZUhpdD86IChyZXN1bHQ6IFQpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xuICAgIHJldHJ5U3RyYXRlZ3k/OiBSZXRyeVN0cmF0ZWd5O1xufTtcblxuZXhwb3J0IHR5cGUgRXhlY3V0ZVJlc3VsdHNPcHRpb24gPSB7IGV4ZWN1dGVJZDogc3RyaW5nIH07XG5cbmV4cG9ydCB0eXBlIFBpbmcgPVxuICAgIHwgW1xuICAgICAgICB7XG4gICAgICAgICAgICBjb25uZWN0OiBmYWxzZTtcbiAgICAgICAgICAgIGRlbGF5OiBudW1iZXI7XG4gICAgICAgICAgICBlcnJvcjogYW55O1xuICAgICAgICB9LFxuICAgICAgICBudWxsLFxuICAgIF1cbiAgICB8IFtcbiAgICAgICAgbnVsbCxcbiAgICAgICAge1xuICAgICAgICAgICAgY29ubmVjdDogdHJ1ZTtcbiAgICAgICAgICAgIGRlbGF5OiBudW1iZXI7XG4gICAgICAgICAgICBzZXJ2ZXJUaW1lc3RhbXA6IG51bWJlcjtcbiAgICAgICAgfSxcbiAgICBdO1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVN0YXJnYXRlPEdlbmVyYXRlZCBleHRlbmRzIHsgcm91dGVTY2hlbWE6IGFueTsgcmVqZWN0Q29kZTogYW55IH0+KHN0YXJnYXRlT3B0aW9uczogTWlsa2lvU3RhcmdhdGVPcHRpb25zKSB7XG4gICAgY29uc3QgJGZldGNoID0gc3RhcmdhdGVPcHRpb25zLmZldGNoID8/IGZldGNoO1xuICAgIGNvbnN0ICRhYm9ydCA9IHN0YXJnYXRlT3B0aW9ucy5hYm9ydCA/PyBBYm9ydENvbnRyb2xsZXI7XG5cbiAgICB0eXBlIFN0YXJnYXRlRXZlbnRzID0ge1xuICAgICAgICAnbWlsa2lvOmV4ZWN1dGVCZWZvcmUnOiB7IHBhdGg6IHN0cmluZzsgb3B0aW9uczogTWl4aW48RXhlY3V0ZU9wdGlvbnM8YW55PiwgeyBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+OyBiYXNlVXJsOiBzdHJpbmcgfT4gfTtcbiAgICAgICAgJ21pbGtpbzpmZXRjaEJlZm9yZSc6IHsgcGF0aDogc3RyaW5nOyBvcHRpb25zOiBNaXhpbjxFeGVjdXRlT3B0aW9uczxhbnk+LCB7IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47IGJhc2VVcmw6IHN0cmluZyB9PjsgYm9keTogc3RyaW5nIH07XG4gICAgICAgICdtaWxraW86ZXhlY3V0ZUVycm9yJzoge1xuICAgICAgICAgICAgcGF0aDogc3RyaW5nO1xuICAgICAgICAgICAgb3B0aW9uczogTWl4aW48RXhlY3V0ZU9wdGlvbnM8YW55PiwgeyBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+OyBiYXNlVXJsOiBzdHJpbmcgfT47XG4gICAgICAgICAgICBlcnJvcjogUGFydGlhbDxHZW5lcmF0ZWRbJ3JlamVjdENvZGUnXT47XG4gICAgICAgICAgICBoYW5kbGVFcnJvcjogPEsgZXh0ZW5kcyBrZXlvZiBQYXJ0aWFsPEdlbmVyYXRlZFsncmVqZWN0Q29kZSddPj4oZXJyb3I6IGFueSwga2V5OiBLLCBoYW5kbGVyOiAoZXJyb3I6IFBhcnRpYWw8R2VuZXJhdGVkWydyZWplY3RDb2RlJ11bS10+KSA9PiBib29sZWFuIHwgUHJvbWlzZTxib29sZWFuPikgPT4gUHJvbWlzZTx2b2lkPjtcbiAgICAgICAgfTtcbiAgICB9O1xuXG4gICAgY29uc3QgaGFuZGxlRXJyb3I6IGFueSA9IGFzeW5jIChlcnJvcjogYW55LCBrZXk6IHN0cmluZywgaGFuZGxlcjogKGVycm9yOiBhbnkpID0+IGJvb2xlYW4gfCBQcm9taXNlPGJvb2xlYW4+KSA9PiB7XG4gICAgICAgIGlmIChrZXkgaW4gZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZWQgPSBhd2FpdCBoYW5kbGVyKGVycm9yW2tleV0pO1xuICAgICAgICAgICAgaWYgKGhhbmRsZWQpIGRlbGV0ZSBlcnJvcltrZXldO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IF9faW5pdEV2ZW50TWFuYWdlciA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgaGFuZGxlcnMgPSBuZXcgTWFwPChldmVudDogYW55KSA9PiB2b2lkLCBzdHJpbmc+KCk7XG4gICAgICAgIGNvbnN0IGluZGV4ZWQgPSBuZXcgTWFwPHN0cmluZywgU2V0PChldmVudDogYW55KSA9PiB2b2lkPj4oKTtcblxuICAgICAgICBjb25zdCBldmVudE1hbmFnZXIgPSB7XG4gICAgICAgICAgICBvbjogPEtleSBleHRlbmRzIGtleW9mIFN0YXJnYXRlRXZlbnRzLCBIYW5kbGVyIGV4dGVuZHMgKGV2ZW50OiBTdGFyZ2F0ZUV2ZW50c1tLZXldKSA9PiB2b2lkPihrZXk6IEtleSwgaGFuZGxlcjogSGFuZGxlcikgPT4ge1xuICAgICAgICAgICAgICAgIGhhbmRsZXJzLnNldChoYW5kbGVyLCBrZXkgYXMgc3RyaW5nKTtcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXhlZC5oYXMoa2V5IGFzIHN0cmluZykgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgIGluZGV4ZWQuc2V0KGtleSBhcyBzdHJpbmcsIG5ldyBTZXQoKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHNldCA9IGluZGV4ZWQuZ2V0KGtleSBhcyBzdHJpbmcpITtcbiAgICAgICAgICAgICAgICBzZXQuYWRkKGhhbmRsZXIpO1xuICAgICAgICAgICAgICAgIGhhbmRsZXJzLnNldChoYW5kbGVyLCBrZXkgYXMgc3RyaW5nKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZXJzLmRlbGV0ZShoYW5kbGVyKTtcbiAgICAgICAgICAgICAgICAgICAgc2V0LmRlbGV0ZShoYW5kbGVyKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9mZjogPEtleSBleHRlbmRzIGtleW9mIFN0YXJnYXRlRXZlbnRzLCBIYW5kbGVyIGV4dGVuZHMgKGV2ZW50OiBTdGFyZ2F0ZUV2ZW50c1tLZXldKSA9PiB2b2lkPihrZXk6IEtleSwgaGFuZGxlcjogSGFuZGxlcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNldCA9IGluZGV4ZWQuZ2V0KGtleSBhcyBzdHJpbmcpO1xuICAgICAgICAgICAgICAgIGlmICghc2V0KSByZXR1cm47XG4gICAgICAgICAgICAgICAgaGFuZGxlcnMuZGVsZXRlKGhhbmRsZXIpO1xuICAgICAgICAgICAgICAgIHNldC5kZWxldGUoaGFuZGxlcik7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZW1pdDogYXN5bmMgPEtleSBleHRlbmRzIGtleW9mIFN0YXJnYXRlRXZlbnRzLCBWYWx1ZSBleHRlbmRzIFN0YXJnYXRlRXZlbnRzW0tleV0+KGtleTogS2V5LCB2YWx1ZTogVmFsdWUpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBoID0gaW5kZXhlZC5nZXQoa2V5IGFzIHN0cmluZyk7XG4gICAgICAgICAgICAgICAgaWYgKGgpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBoYW5kbGVyIG9mIGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGhhbmRsZXIodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gZXZlbnRNYW5hZ2VyO1xuICAgIH07XG5cbiAgICBjb25zdCBldmVudE1hbmFnZXIgPSBfX2luaXRFdmVudE1hbmFnZXIoKTtcblxuICAgIGNvbnN0IGJvb3RzdHJhcCA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgbGV0IGJhc2VVcmwgPSBzdGFyZ2F0ZU9wdGlvbnMuYmFzZVVybDtcbiAgICAgICAgaWYgKHR5cGVvZiBiYXNlVXJsID09PSAnZnVuY3Rpb24nKSBiYXNlVXJsID0gYXdhaXQgYmFzZVVybCgpO1xuICAgICAgICBpZiAoYmFzZVVybC5lbmRzV2l0aCgnLycpKSBiYXNlVXJsID0gYmFzZVVybC5zbGljZSgwLCAtMSk7XG5cbiAgICAgICAgcmV0dXJuIGJhc2VVcmw7XG4gICAgfTtcblxuICAgIGNvbnN0IGJhc2VVcmxQcm9taXNlOiBQcm9taXNlPHN0cmluZz4gPSBib290c3RyYXAoKTtcbiAgICAvLyBDYWNoZSByZXNvbHZlZCBiYXNlVXJsIHRvIGF2b2lkIGF3YWl0IG92ZXJoZWFkIG9uIHJlcGVhdGVkIGNhbGxzXG4gICAgbGV0IHJlc29sdmVkQmFzZVVybDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgLy8gQ2FjaGUgVVJMIGZvciBsYXN0IHBhdGggdG8gYXZvaWQgc3RyaW5nIGNvbmNhdGVuYXRpb24gcGVyIHJlcXVlc3RcbiAgICBsZXQgY2FjaGVkVXJsUGF0aDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IGNhY2hlZFVybDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgICBjb25zdCBzdGFyZ2F0ZSA9IHtcbiAgICAgICAgLi4uZXZlbnRNYW5hZ2VyLFxuICAgICAgICBvcHRpb25zOiBzdGFyZ2F0ZU9wdGlvbnMsXG4gICAgICAgIGFzeW5jIGV4ZWN1dGU8UGF0aCBleHRlbmRzIGtleW9mIEdlbmVyYXRlZFsncm91dGVTY2hlbWEnXT4oXG4gICAgICAgICAgICBwYXRoOiBQYXRoLFxuICAgICAgICAgICAgb3B0aW9uczogTWl4aW48XG4gICAgICAgICAgICAgICAgRXhlY3V0ZU9wdGlvbnM8R2VuZXJhdGVkWydyb3V0ZVNjaGVtYSddW1BhdGhdWyd0eXBlcyddWydyZXN1bHQnXT4sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBwYXJhbXM/OiBHZW5lcmF0ZWRbJ3JvdXRlU2NoZW1hJ11bUGF0aF1bJ3R5cGVzJ11bJ3BhcmFtcyddO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgID4sXG4gICAgICAgICk6IFByb21pc2U8XG4gICAgICAgICAgICBHZW5lcmF0ZWRbJ3JvdXRlU2NoZW1hJ11bUGF0aF1bJ3R5cGVzJ11bJ/CfpZsnXSBleHRlbmRzIGJvb2xlYW5cbiAgICAgICAgICAgID8gLy8gYWN0aW9uXG4gICAgICAgICAgICBbUGFydGlhbDxHZW5lcmF0ZWRbJ3JlamVjdENvZGUnXT4sIG51bGwsIEV4ZWN1dGVSZXN1bHRzT3B0aW9uXSB8IFtudWxsLCBHZW5lcmF0ZWRbJ3JvdXRlU2NoZW1hJ11bUGF0aF1bJ3R5cGVzJ11bJ3Jlc3VsdCddLCBFeGVjdXRlUmVzdWx0c09wdGlvbl1cbiAgICAgICAgICAgIDogLy8gc3RyZWFtXG4gICAgICAgICAgICBbUGFydGlhbDxHZW5lcmF0ZWRbJ3JlamVjdENvZGUnXT4sIG51bGwsIEV4ZWN1dGVSZXN1bHRzT3B0aW9uXSB8IFtudWxsLCBBc3luY0dlbmVyYXRvcjxbUGFydGlhbDxHZW5lcmF0ZWRbJ3JlamVjdENvZGUnXT4sIG51bGxdIHwgW251bGwsIEdlbmVyYXRvckdlbmVyaWM8R2VuZXJhdGVkWydyb3V0ZVNjaGVtYSddW1BhdGhdWyd0eXBlcyddWydyZXN1bHQnXT5dLCB1bmRlZmluZWQ+LCBFeGVjdXRlUmVzdWx0c09wdGlvbl1cbiAgICAgICAgPiB7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5oZWFkZXJzID09PSB1bmRlZmluZWQpIG9wdGlvbnMuaGVhZGVycyA9IHt9O1xuXG4gICAgICAgICAgICBsZXQgdXJsOiBzdHJpbmc7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5iYXNlVXJsKSB7XG4gICAgICAgICAgICAgICAgbGV0IGJhc2VVcmwgPSBvcHRpb25zLmJhc2VVcmw7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBiYXNlVXJsID09PSAnZnVuY3Rpb24nKSBiYXNlVXJsID0gYXdhaXQgYmFzZVVybCgpO1xuICAgICAgICAgICAgICAgIGlmIChiYXNlVXJsLmVuZHNXaXRoKCcvJykpIGJhc2VVcmwgPSBiYXNlVXJsLnNsaWNlKDAsIC0xKTtcbiAgICAgICAgICAgICAgICB1cmwgPSBiYXNlVXJsICsgKHBhdGggYXMgc3RyaW5nKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXNvbHZlZEJhc2VVcmwpIHJlc29sdmVkQmFzZVVybCA9IGF3YWl0IGJhc2VVcmxQcm9taXNlO1xuICAgICAgICAgICAgICAgIC8vIENhY2hlIFVSTCBmb3IgcmVwZWF0ZWQgcGF0aCB0byBhdm9pZCBzdHJpbmcgY29uY2F0ZW5hdGlvblxuICAgICAgICAgICAgICAgIGlmIChwYXRoID09PSBjYWNoZWRVcmxQYXRoICYmIGNhY2hlZFVybCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB1cmwgPSBjYWNoZWRVcmw7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdXJsID0gcmVzb2x2ZWRCYXNlVXJsICsgKHBhdGggYXMgc3RyaW5nKTtcbiAgICAgICAgICAgICAgICAgICAgY2FjaGVkVXJsUGF0aCA9IHBhdGggYXMgc3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICBjYWNoZWRVcmwgPSB1cmw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIShwYXRoIGFzIHN0cmluZykuZW5kc1dpdGgoJ34nKSkge1xuICAgICAgICAgICAgICAgIC8vIGFjdGlvblxuICAgICAgICAgICAgICAgIC8vIFNldCBkZWZhdWx0IGhlYWRlcnMgb25seSBpZiBub3QgYWxyZWFkeSBwcmVzZW50XG4gICAgICAgICAgICAgICAgY29uc3QgaCA9IG9wdGlvbnMuaGVhZGVycztcbiAgICAgICAgICAgICAgICBpZiAoaC5BY2NlcHQgPT09IHVuZGVmaW5lZCkgaC5BY2NlcHQgPSAnYXBwbGljYXRpb24vanNvbic7XG4gICAgICAgICAgICAgICAgaWYgKGhbJ0NvbnRlbnQtVHlwZSddID09PSB1bmRlZmluZWQpIGhbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgY2FjaGVTdHJhdGVneSA9IG9wdGlvbnMuY2FjaGVTdHJhdGVneSA/PyAnb2ZmJztcbiAgICAgICAgICAgICAgICBsZXQgcmV0cnlDb3VudCA9IDA7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMucmV0cnlTdHJhdGVneSA9PT0gdHJ1ZSB8fCBvcHRpb25zLnJldHJ5U3RyYXRlZ3kgPT09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0cnlDb3VudCA9IDI7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygb3B0aW9ucy5yZXRyeVN0cmF0ZWd5ID09PSAnbnVtYmVyJyAmJiBvcHRpb25zLnJldHJ5U3RyYXRlZ3kgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHJ5Q291bnQgPSBvcHRpb25zLnJldHJ5U3RyYXRlZ3k7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gRmFzdCBwYXRoOiBubyBjYWNoZSwgbm8gcmV0cnlcbiAgICAgICAgICAgICAgICBpZiAoY2FjaGVTdHJhdGVneSA9PT0gJ29mZicgJiYgcmV0cnlDb3VudCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZXZlbnRNYW5hZ2VyLmVtaXQoJ21pbGtpbzpleGVjdXRlQmVmb3JlJywgeyBwYXRoOiBwYXRoIGFzIHN0cmluZywgb3B0aW9uczogb3B0aW9ucyBhcyBhbnkgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBib2R5ID0gSlNPTi5zdHJpbmdpZnkob3B0aW9ucy5wYXJhbXMpID8/ICcnO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZXZlbnRNYW5hZ2VyLmVtaXQoJ21pbGtpbzpmZXRjaEJlZm9yZScsIHsgcGF0aDogcGF0aCBhcyBzdHJpbmcsIG9wdGlvbnM6IG9wdGlvbnMgYXMgYW55LCBib2R5IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRleHQ6IHN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgJGZldGNoKHVybCwgeyBtZXRob2Q6ICdQT1NUJywgYm9keSwgaGVhZGVyczogb3B0aW9ucy5oZWFkZXJzIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZCA9IHJldml2ZUpTT05QYXJzZShKU09OLnBhcnNlKHRleHQpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJzZWQuc3VjY2VzcyAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycjogYW55ID0ge307XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyW3BhcnNlZC5jb2RlXSA9IHBhcnNlZC5yZWplY3QgPz8gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW2VyciwgbnVsbCwgeyBleGVjdXRlSWQ6IHBhcnNlZC5leGVjdXRlSWQgfV07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW251bGwsIHBhcnNlZC5kYXRhLCB7IGV4ZWN1dGVJZDogcGFyc2VkLmV4ZWN1dGVJZCB9XTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yPy5bMF0/LlJFUVVFU1RfVElNRU9VVCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbZXJyb3IsIG51bGwsIHsgZXhlY3V0ZUlkOiAnJyB9XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yUGluZWQgPSB7IFJFUVVFU1RfRkFJTDogZXJyb3IgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbZXJyb3JQaW5lZCwgbnVsbCwgeyBleGVjdXRlSWQ6ICd1bmtub3duJyB9XTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGNhY2hlVGhyb3R0bGVNcyA9IG9wdGlvbnMuY2FjaGVUaHJvdHRsZU1zID8/IDA7XG4gICAgICAgICAgICAgICAgY29uc3QgY2FjaGVLZXkgPSBnZW5lcmF0ZUNhY2hlS2V5KHBhdGggYXMgc3RyaW5nLCBvcHRpb25zLnBhcmFtcyk7XG5cbiAgICAgICAgICAgICAgICBsZXQgY2FjaGVTdG9yYWdlID0gc3RhcmdhdGVPcHRpb25zLmNhY2hlU3RvcmFnZTtcbiAgICAgICAgICAgICAgICBpZiAoY2FjaGVTdHJhdGVneSAhPT0gJ29mZicgJiYgIWNhY2hlU3RvcmFnZSkge1xuICAgICAgICAgICAgICAgICAgICBjYWNoZVN0b3JhZ2UgPSBhd2FpdCBjcmVhdGVEZWZhdWx0Q2FjaGVTdG9yYWdlKHsgZW5jcnlwdGlvbjogc3RhcmdhdGVPcHRpb25zLmNhY2hlRW5jcnlwdGlvbiB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoY2FjaGVTdHJhdGVneSAhPT0gJ29mZicgJiYgY2FjaGVTdG9yYWdlICYmIG9wdGlvbnMub25DYWNoZUhpdCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjYWNoZWQgPSBhd2FpdCBjYWNoZVN0b3JhZ2UuZ2V0KGNhY2hlS2V5KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNhY2hlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBvcHRpb25zLm9uQ2FjaGVIaXQoY2FjaGVkLmRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIG9uQ2FjaGVIaXQgZXJyb3JzXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoY2FjaGVTdHJhdGVneSA9PT0gJ3Rocm90dGxlJyAmJiBjYWNoZVN0b3JhZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FjaGVkID0gYXdhaXQgY2FjaGVTdG9yYWdlLmdldChjYWNoZUtleSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjYWNoZWQgJiYgRGF0ZS5ub3coKSAtIGNhY2hlZC50aW1lc3RhbXAgPCBjYWNoZVRocm90dGxlTXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbbnVsbCwgY2FjaGVkLmRhdGEsIHsgZXhlY3V0ZUlkOiAnY2FjaGVkJyB9XSBhcyBhbnk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBhd2FpdCBldmVudE1hbmFnZXIuZW1pdCgnbWlsa2lvOmV4ZWN1dGVCZWZvcmUnLCB7IHBhdGg6IHBhdGggYXMgc3RyaW5nLCBvcHRpb25zOiBvcHRpb25zIGFzIGFueSB9KTtcbiAgICAgICAgICAgICAgICBjb25zdCBib2R5ID0gSlNPTi5zdHJpbmdpZnkob3B0aW9ucy5wYXJhbXMpID8/ICcnO1xuICAgICAgICAgICAgICAgIGF3YWl0IGV2ZW50TWFuYWdlci5lbWl0KCdtaWxraW86ZmV0Y2hCZWZvcmUnLCB7IHBhdGg6IHBhdGggYXMgc3RyaW5nLCBvcHRpb25zOiBvcHRpb25zIGFzIGFueSwgYm9keSB9KTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGV4ZWN1dGVSZXF1ZXN0ID0gYXN5bmMgKGlzUmV0cnk6IGJvb2xlYW4pOiBQcm9taXNlPHsgcmVzdWx0OiB7IHZhbHVlOiBSZWNvcmQ8YW55LCBhbnk+IH0gfCBudWxsOyBlcnJvcjogYW55OyBpc05ldHdvcmtFcnJvcjogYm9vbGVhbiB9PiA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0ICRmZXRjaCh1cmwsIHsgbWV0aG9kOiAnUE9TVCcsIGJvZHksIGhlYWRlcnM6IG9wdGlvbnMuaGVhZGVycyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRleHQgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKHRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgcmVzdWx0OiB7IHZhbHVlOiBwYXJzZWQgfSwgZXJyb3I6IG51bGwsIGlzTmV0d29ya0Vycm9yOiBmYWxzZSB9O1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpc05ldHdvcmtFcnJvciA9ICFlcnJvcj8uWzBdPy5SRVFVRVNUX1RJTUVPVVQ7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyByZXN1bHQ6IG51bGwsIGVycm9yLCBpc05ldHdvcmtFcnJvciB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIGxldCB7IHJlc3VsdCwgZXJyb3IsIGlzTmV0d29ya0Vycm9yIH0gPSBhd2FpdCBleGVjdXRlUmVxdWVzdChmYWxzZSk7XG5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCByZXRyeUluZGV4ID0gMDsgcmV0cnlJbmRleCA8IHJldHJ5Q291bnQgJiYgZXJyb3IgJiYgaXNOZXR3b3JrRXJyb3I7IHJldHJ5SW5kZXgrKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmV0cnlJbmRleCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDUwMCkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJldHJ5UmVzdWx0ID0gYXdhaXQgZXhlY3V0ZVJlcXVlc3QodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJldHJ5UmVzdWx0LnJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSByZXRyeVJlc3VsdC5lcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgaXNOZXR3b3JrRXJyb3IgPSByZXRyeVJlc3VsdC5pc05ldHdvcmtFcnJvcjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yPy5bMF0/LlJFUVVFU1RfVElNRU9VVCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZXZlbnRNYW5hZ2VyLmVtaXQoJ21pbGtpbzpleGVjdXRlRXJyb3InLCB7IGhhbmRsZUVycm9yLCBwYXRoOiBwYXRoIGFzIHN0cmluZywgb3B0aW9uczogb3B0aW9ucyBhcyBhbnksIGVycm9yIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNhY2hlU3RyYXRlZ3kgIT09ICdvZmYnICYmIGNhY2hlU3RvcmFnZSAmJiBpc05ldHdvcmtFcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FjaGVkID0gYXdhaXQgY2FjaGVTdG9yYWdlLmdldChjYWNoZUtleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FjaGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtudWxsLCBjYWNoZWQuZGF0YSwgeyBleGVjdXRlSWQ6ICdjYWNoZWQnIH1dIGFzIGFueTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yUGluZWQgPSB7IFJFUVVFU1RfRkFJTDogZXJyb3IgfTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgZXZlbnRNYW5hZ2VyLmVtaXQoJ21pbGtpbzpleGVjdXRlRXJyb3InLCB7IGhhbmRsZUVycm9yLCBwYXRoOiBwYXRoIGFzIHN0cmluZywgb3B0aW9uczogb3B0aW9ucyBhcyBhbnksIGVycm9yOiBlcnJvclBpbmVkIH0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW2Vycm9yUGluZWQsIG51bGwsIHsgZXhlY3V0ZUlkOiAndW5rbm93bicgfV07XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCEudmFsdWUuc3VjY2VzcyAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnI6IGFueSA9IHt9O1xuICAgICAgICAgICAgICAgICAgICBlcnJbcmVzdWx0IS52YWx1ZS5jb2RlXSA9IHJlc3VsdCEudmFsdWUucmVqZWN0ID8/IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGV2ZW50TWFuYWdlci5lbWl0KCdtaWxraW86ZXhlY3V0ZUVycm9yJywgeyBoYW5kbGVFcnJvciwgcGF0aDogcGF0aCBhcyBzdHJpbmcsIG9wdGlvbnM6IG9wdGlvbnMgYXMgYW55LCBlcnJvcjogZXJyIH0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW2VyciwgbnVsbCwgeyBleGVjdXRlSWQ6IHJlc3VsdCEudmFsdWUuZXhlY3V0ZUlkIH1dO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChjYWNoZVN0cmF0ZWd5ICE9PSAnb2ZmJyAmJiBjYWNoZVN0b3JhZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgY2FjaGVTdG9yYWdlLnNldChjYWNoZUtleSwgcmVzdWx0IS52YWx1ZS5kYXRhKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gW251bGwsIHJlc3VsdCEudmFsdWUuZGF0YSwgeyBleGVjdXRlSWQ6IHJlc3VsdCEudmFsdWUuZXhlY3V0ZUlkIH1dIGFzIGFueTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gc3RyZWFtXG4gICAgICAgICAgICAgICAgb3B0aW9ucy5jYWNoZVN0cmF0ZWd5ID0gJ29mZic7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5vbkNhY2hlSGl0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIG9wdGlvbnMuY2FjaGVUaHJvdHRsZU1zID0gdW5kZWZpbmVkO1xuXG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuaGVhZGVycy5BY2NlcHQgPT09IHVuZGVmaW5lZCkgb3B0aW9ucy5oZWFkZXJzLkFjY2VwdCA9ICd0ZXh0L2V2ZW50LXN0cmVhbSc7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuaGVhZGVyc1snQ29udGVudC1UeXBlJ10gPT09IHVuZGVmaW5lZCkgb3B0aW9ucy5oZWFkZXJzWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgICAgIGNvbnN0IHN0YWNrczogTWFwPFxuICAgICAgICAgICAgICAgICAgICBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvbmU6IGJvb2xlYW47XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlOiBQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PGFueT4+O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZTogKHZhbHVlOiBJdGVyYXRvclJlc3VsdDxhbnk+KSA9PiB2b2lkO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0OiAocmVhc29uOiBhbnkpID0+IHZvaWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA+ID0gbmV3IE1hcCgpO1xuICAgICAgICAgICAgICAgIGxldCBzdGFja3NJbmRleCA9IDA7XG4gICAgICAgICAgICAgICAgbGV0IGl0ZXJhdG9ySW5kZXggPSAwO1xuICAgICAgICAgICAgICAgIGxldCBzdHJlYW1SZXN1bHQ6IGFueTtcbiAgICAgICAgICAgICAgICBjb25zdCBzdHJlYW1SZXN1bHRGZXRjaGVkID0gd2l0aFJlc29sdmVyczx1bmRlZmluZWQ+KCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCB0aW1lb3V0ID0gc3RhcmdhdGVPcHRpb25zPy50aW1lb3V0ID8/IG9wdGlvbnM/LnRpbWVvdXQgPz8gNjAwMDtcbiAgICAgICAgICAgICAgICBjb25zdCB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW1SZXN1bHRGZXRjaGVkLnJlamVjdChbeyBSRVFVRVNUX1RJTUVPVVQ6IHsgdGltZW91dCwgbWVzc2FnZTogYEV4ZWN1dGUgdGltZW91dCBhZnRlciAke3RpbWVvdXR9bXMuYCB9IH0sIG51bGwsIHsgZXhlY3V0ZUlkOiAndW5rbm93bicgfV0pO1xuICAgICAgICAgICAgICAgIH0sIHRpbWVvdXQpO1xuXG4gICAgICAgICAgICAgICAgY29uc3Qgb25tZXNzYWdlID0gKGV2ZW50OiBFdmVudFNvdXJjZU1lc3NhZ2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50LmRhdGEuc3RhcnRzV2l0aCgnQCcpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbVJlc3VsdCA9IHJldml2ZUpTT05QYXJzZShKU09OLnBhcnNlKGV2ZW50LmRhdGEuc2xpY2UoMSkpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1SZXN1bHRGZXRjaGVkLnJlc29sdmUodW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1SZXN1bHRGZXRjaGVkLnJlamVjdChbeyBSRVFVRVNUX0ZBSUw6IGVycm9yIH0sIG51bGwsIHsgZXhlY3V0ZUlkOiAndW5rbm93bicgfV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9ICsrc3RhY2tzSW5kZXg7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhY2tzLmhhcyhpbmRleCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFjayA9IHN0YWNrcy5nZXQoaW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrIS5kb25lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFjayEucmVzb2x2ZSh7IGRvbmU6IGZhbHNlLCB2YWx1ZTogcmV2aXZlSlNPTlBhcnNlKEpTT04ucGFyc2UoZXZlbnQuZGF0YSkpIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFjayA9IHdpdGhSZXNvbHZlcnM8SXRlcmF0b3JSZXN1bHQ8YW55Pj4oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5yZXNvbHZlKHsgZG9uZTogZmFsc2UsIHZhbHVlOiByZXZpdmVKU09OUGFyc2UoSlNPTi5wYXJzZShldmVudC5kYXRhKSkgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2tzLnNldChpbmRleCwgeyAuLi5zdGFjaywgZG9uZTogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgbGV0IGN1clJlcXVlc3RDb250cm9sbGVyOiBBYm9ydENvbnRyb2xsZXI7XG5cbiAgICAgICAgICAgICAgICBhc3luYyBmdW5jdGlvbiBjcmVhdGUoKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1clJlcXVlc3RDb250cm9sbGVyID0gbmV3ICRhYm9ydCgpO1xuICAgICAgICAgICAgICAgICAgICBjdXJSZXF1ZXN0Q29udHJvbGxlci5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvci5yZXR1cm4oKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBldmVudE1hbmFnZXIuZW1pdCgnbWlsa2lvOmV4ZWN1dGVCZWZvcmUnLCB7IHBhdGg6IHBhdGggYXMgc3RyaW5nLCBvcHRpb25zOiBvcHRpb25zIGFzIGFueSB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYm9keSA9IEpTT04uc3RyaW5naWZ5KG9wdGlvbnMhLnBhcmFtcykgPz8gJyc7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBldmVudE1hbmFnZXIuZW1pdCgnbWlsa2lvOmZldGNoQmVmb3JlJywgeyBwYXRoOiBwYXRoIGFzIHN0cmluZywgb3B0aW9uczogb3B0aW9ucyBhcyBhbnksIGJvZHkgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgJGZldGNoKHVybCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IG9wdGlvbnMhLmhlYWRlcnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9keSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduYWw6IGN1clJlcXVlc3RDb250cm9sbGVyLnNpZ25hbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50VHlwZSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdDb250ZW50LVR5cGUnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY29udGVudFR5cGU/LnN0YXJ0c1dpdGgoJ3RleHQvZXZlbnQtc3RyZWFtJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGNvbnRlbnQtdHlwZSB0byBiZSAkeyd0ZXh0L2V2ZW50LXN0cmVhbSd9LCBBY3R1YWw6ICR7Y29udGVudFR5cGV9YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGdldEJ5dGVzKHJlc3BvbnNlLmJvZHkhLCBnZXRMaW5lcyhnZXRNZXNzYWdlcyhvbm1lc3NhZ2UpKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGl0ZXJhdG9yLnJldHVybigpO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY3VyUmVxdWVzdENvbnRyb2xsZXIuc2lnbmFsLmFib3J0ZWQpIGN1clJlcXVlc3RDb250cm9sbGVyLmFib3J0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJvciA9IHsgUkVRVUVTVF9GQUlMOiBlcnIgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGV2ZW50TWFuYWdlci5lbWl0KCdtaWxraW86ZXhlY3V0ZUVycm9yJywgeyBoYW5kbGVFcnJvciwgcGF0aDogcGF0aCBhcyBzdHJpbmcsIG9wdGlvbnM6IG9wdGlvbnMgYXMgYW55LCBlcnJvciB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGl0ZXJhdG9yLnRocm93KGVycik7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1SZXN1bHRGZXRjaGVkLnJlamVjdChbZXJyb3IsIG51bGwsIHsgZXhlY3V0ZUlkOiAndW5rbm93bicgfV0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdm9pZCBjcmVhdGUoKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZXJhdG9yID0ge1xuICAgICAgICAgICAgICAgICAgICAuLi4oe1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCgpOiBQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PHVua25vd24+PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSArK2l0ZXJhdG9ySW5kZXg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YWNrcy5oYXMoaW5kZXggLSAyKSkgc3RhY2tzLmRlbGV0ZShpbmRleCAtIDIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RhY2tzLmhhcyhpbmRleCkgJiYgIWN1clJlcXVlc3RDb250cm9sbGVyLnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YWNrID0gd2l0aFJlc29sdmVyczxJdGVyYXRvclJlc3VsdDxhbnk+PigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFja3Muc2V0KGluZGV4LCB7IC4uLnN0YWNrLCBkb25lOiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YWNrLnByb21pc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RhY2tzLmhhcyhpbmRleCkgJiYgY3VyUmVxdWVzdENvbnRyb2xsZXIuc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhY2sgPSB3aXRoUmVzb2x2ZXJzPEl0ZXJhdG9yUmVzdWx0PGFueT4+KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrLnJlc29sdmUoeyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhY2sucHJvbWlzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YWNrcy5nZXQoaW5kZXgpIS5wcm9taXNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFzeW5jIHJldHVybigpOiBQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PHZvaWQ+PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjdXJSZXF1ZXN0Q29udHJvbGxlci5zaWduYWwuYWJvcnRlZCkgY3VyUmVxdWVzdENvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtfLCBpdGVyYXRvcl0gb2Ygc3RhY2tzKSBpdGVyYXRvci5yZXNvbHZlKHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmMgdGhyb3coZXJyOiBhbnkpOiBQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PHZvaWQ+PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtUmVzdWx0ID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUlkOiBzdHJlYW1SZXN1bHQ/LmV4ZWN1dGVJZCA/PyAnJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogJ05FVFdPUktfRVJST1InLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ05ldHdvcmsgRXJyb3InLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbUNsaWVudDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IGVycixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW19pbmRleCwgc3RhY2tdIG9mIHN0YWNrcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhY2suZG9uZSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrLmRvbmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5yZXNvbHZlKHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjdXJSZXF1ZXN0Q29udHJvbGxlci5zaWduYWwuYWJvcnRlZCkgY3VyUmVxdWVzdENvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtfLCBpdGVyYXRvcl0gb2Ygc3RhY2tzKSBpdGVyYXRvci5yZXNvbHZlKHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB9IHNhdGlzZmllcyBBc3luY0l0ZXJhdG9yPHVua25vd24+KSxcbiAgICAgICAgICAgICAgICAgICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBzdHJlYW1SZXN1bHRGZXRjaGVkLnByb21pc2U7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbbnVsbCwgaXRlcmF0b3IsIHsgZXhlY3V0ZUlkOiBzdHJlYW1SZXN1bHQuZXhlY3V0ZUlkIH1dIGFzIGFueTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3IgYXMgYW55O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgX19jb29rYm9vazoge1xuICAgICAgICAgICAgc3Vic2NyaWJlOiBhc3luYyAoYmFzZVVybDogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaGVhZGVycyA9IHtcbiAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICAgICAgICAgQWNjZXB0OiAndGV4dC9ldmVudC1zdHJlYW0nLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyYW1zID0ge307XG5cbiAgICAgICAgICAgICAgICBjb25zdCBib2R5ID0gSlNPTi5zdHJpbmdpZnkocGFyYW1zKSA/PyAnJztcbiAgICAgICAgICAgICAgICBjb25zdCBzdGFja3M6IE1hcDxcbiAgICAgICAgICAgICAgICAgICAgbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb25lOiBib29sZWFuO1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZTogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDxhbnk+PjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmU6ICh2YWx1ZTogSXRlcmF0b3JSZXN1bHQ8YW55PikgPT4gdm9pZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdDogKHJlYXNvbjogYW55KSA9PiB2b2lkO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPiA9IG5ldyBNYXAoKTtcbiAgICAgICAgICAgICAgICBsZXQgc3RhY2tzSW5kZXggPSAwO1xuICAgICAgICAgICAgICAgIGxldCBpdGVyYXRvckluZGV4ID0gMDtcblxuICAgICAgICAgICAgICAgIGNvbnN0IG9ubWVzc2FnZSA9IChldmVudDogRXZlbnRTb3VyY2VNZXNzYWdlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gKytzdGFja3NJbmRleDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YWNrcy5oYXMoaW5kZXgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFjayA9IHN0YWNrcy5nZXQoaW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2shLnJlc29sdmUoeyBkb25lOiBmYWxzZSwgdmFsdWU6IHJldml2ZUpTT05QYXJzZShKU09OLnBhcnNlKGV2ZW50LmRhdGEpKSB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YWNrID0gd2l0aFJlc29sdmVyczxJdGVyYXRvclJlc3VsdDxhbnk+PigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2sucmVzb2x2ZSh7IGRvbmU6IGZhbHNlLCB2YWx1ZTogcmV2aXZlSlNPTlBhcnNlKEpTT04ucGFyc2UoZXZlbnQuZGF0YSkpIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2tzLnNldChpbmRleCwgeyAuLi5zdGFjaywgZG9uZTogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgbGV0IGN1clJlcXVlc3RDb250cm9sbGVyOiBBYm9ydENvbnRyb2xsZXI7XG5cbiAgICAgICAgICAgICAgICBhc3luYyBmdW5jdGlvbiBjcmVhdGUoKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1clJlcXVlc3RDb250cm9sbGVyID0gbmV3ICRhYm9ydCgpO1xuICAgICAgICAgICAgICAgICAgICBjdXJSZXF1ZXN0Q29udHJvbGxlci5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvci5yZXR1cm4oKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0ICRmZXRjaChgJHtiYXNlVXJsfS8kc3Vic2NyaWJlYCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9keSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduYWw6IGN1clJlcXVlc3RDb250cm9sbGVyLnNpZ25hbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50VHlwZSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdDb250ZW50LVR5cGUnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY29udGVudFR5cGU/LnN0YXJ0c1dpdGgoJ3RleHQvZXZlbnQtc3RyZWFtJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGNvbnRlbnQtdHlwZSB0byBiZSAkeyd0ZXh0L2V2ZW50LXN0cmVhbSd9LCBBY3R1YWw6ICR7Y29udGVudFR5cGV9YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGdldEJ5dGVzKHJlc3BvbnNlLmJvZHkhLCBnZXRMaW5lcyhnZXRNZXNzYWdlcyhvbm1lc3NhZ2UpKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGl0ZXJhdG9yLnJldHVybigpO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY3VyUmVxdWVzdENvbnRyb2xsZXIuc2lnbmFsLmFib3J0ZWQpIGN1clJlcXVlc3RDb250cm9sbGVyLmFib3J0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBpdGVyYXRvci50aHJvdyhlcnIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdm9pZCBjcmVhdGUoKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZXJhdG9yID0ge1xuICAgICAgICAgICAgICAgICAgICAuLi4oe1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCgpOiBQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PHVua25vd24+PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSArK2l0ZXJhdG9ySW5kZXg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YWNrcy5oYXMoaW5kZXggLSAyKSkgc3RhY2tzLmRlbGV0ZShpbmRleCAtIDIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RhY2tzLmhhcyhpbmRleCkgJiYgIWN1clJlcXVlc3RDb250cm9sbGVyLnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YWNrID0gd2l0aFJlc29sdmVyczxJdGVyYXRvclJlc3VsdDxhbnk+PigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFja3Muc2V0KGluZGV4LCB7IC4uLnN0YWNrLCBkb25lOiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YWNrLnByb21pc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RhY2tzLmhhcyhpbmRleCkgJiYgY3VyUmVxdWVzdENvbnRyb2xsZXIuc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhY2sgPSB3aXRoUmVzb2x2ZXJzPEl0ZXJhdG9yUmVzdWx0PGFueT4+KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrLnJlc29sdmUoeyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhY2sucHJvbWlzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YWNrcy5nZXQoaW5kZXgpIS5wcm9taXNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFzeW5jIHJldHVybigpOiBQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PHZvaWQ+PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjdXJSZXF1ZXN0Q29udHJvbGxlci5zaWduYWwuYWJvcnRlZCkgY3VyUmVxdWVzdENvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtfLCBpdGVyYXRvcl0gb2Ygc3RhY2tzKSBpdGVyYXRvci5yZXNvbHZlKHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmMgdGhyb3coZXJyOiBhbnkpOiBQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PHZvaWQ+PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjdXJSZXF1ZXN0Q29udHJvbGxlci5zaWduYWwuYWJvcnRlZCkgY3VyUmVxdWVzdENvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtfLCBpdGVyYXRvcl0gb2Ygc3RhY2tzKSBpdGVyYXRvci5yZXNvbHZlKHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB9IHNhdGlzZmllcyBBc3luY0l0ZXJhdG9yPHVua25vd24+KSxcbiAgICAgICAgICAgICAgICAgICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlcmF0b3I7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yIGFzIGFueTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBhc3luYyBwaW5nKG9wdGlvbnM/OiB7IHRpbWVvdXQ/OiBudW1iZXIgfSk6IFByb21pc2U8UGluZz4ge1xuICAgICAgICAgICAgLy8gb3hsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWFzeW5jLXByb21pc2UtZXhlY3V0b3JcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZTxQaW5nPihhc3luYyAocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHVybCA9IGAke2F3YWl0IGJhc2VVcmxQcm9taXNlfS9nZW5lcmF0ZV8yMDRgO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRpbWVvdXQgPSBzdGFyZ2F0ZU9wdGlvbnM/LnRpbWVvdXQgPz8gb3B0aW9ucz8udGltZW91dCA/PyA2MDAwO1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0c1RpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZHNUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShbeyBjb25uZWN0OiBmYWxzZSwgZGVsYXk6IGVuZHNUaW1lIC0gc3RhcnRzVGltZSwgZXJyb3I6IHsgUkVRVUVTVF9USU1FT1VUOiB7IHRpbWVvdXQsIG1lc3NhZ2U6IGBFeGVjdXRlIHRpbWVvdXQgYWZ0ZXIgJHt0aW1lb3V0fW1zLmAgfSB9IH0sIG51bGxdKTtcbiAgICAgICAgICAgICAgICB9LCB0aW1lb3V0KTtcblxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgJGZldGNoKHVybCwgeyBtZXRob2Q6ICdIRUFEJyB9KTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZW5kc1RpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoW3sgY29ubmVjdDogZmFsc2UsIGRlbGF5OiBlbmRzVGltZSAtIHN0YXJ0c1RpbWUsIGVycm9yOiB7IFJFUVVFU1RfRkFJTDogeyByZXNwb25zZSwgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsIG1lc3NhZ2U6ICdTdGF0dXMgY29kZSBub3QgMjA0JyB9IH0gfSwgbnVsbF0pO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShbbnVsbCwgeyBjb25uZWN0OiB0cnVlLCBkZWxheTogZW5kc1RpbWUgLSBzdGFydHNUaW1lLCBzZXJ2ZXJUaW1lc3RhbXA6IE51bWJlcihyZXNwb25zZS5oZWFkZXJzLmdldCgnQ29udGVudC1UeXBlJykhLnN1YnN0cmluZygxNykpIH1dKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZHNUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFt7IGNvbm5lY3Q6IGZhbHNlLCBkZWxheTogZW5kc1RpbWUgLSBzdGFydHNUaW1lLCBlcnJvciB9LCBudWxsXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgJHR5cGVzOiB1bmRlZmluZWQgYXMgdW5rbm93biBhcyB7XG4gICAgICAgICAgICBnZW5lcmF0ZWQ6IEdlbmVyYXRlZDtcbiAgICAgICAgICAgIGVycm9yOiBHZW5lcmF0ZWRbJ3JlamVjdENvZGUnXTtcbiAgICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgICAgIFtQYXRoIGluIGtleW9mIEdlbmVyYXRlZFsncm91dGVTY2hlbWEnXV06IEdlbmVyYXRlZFsncm91dGVTY2hlbWEnXVtQYXRoXVsndHlwZXMnXVsncGFyYW1zJ107XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmVzdWx0czoge1xuICAgICAgICAgICAgICAgIFtQYXRoIGluIGtleW9mIEdlbmVyYXRlZFsncm91dGVTY2hlbWEnXV06IEdlbmVyYXRlZFsncm91dGVTY2hlbWEnXVtQYXRoXVsndHlwZXMnXVsn8J+lmyddIGV4dGVuZHMgYm9vbGVhblxuICAgICAgICAgICAgICAgID8gLy8gYWN0aW9uXG4gICAgICAgICAgICAgICAgR2VuZXJhdGVkWydyb3V0ZVNjaGVtYSddW1BhdGhdWyd0eXBlcyddWydyZXN1bHQnXVxuICAgICAgICAgICAgICAgIDogLy8gc3RyZWFtXG4gICAgICAgICAgICAgICAgQXN5bmNHZW5lcmF0b3I8W1BhcnRpYWw8R2VuZXJhdGVkWydyZWplY3RDb2RlJ10+LCBudWxsXSB8IFtudWxsLCBHZW5lcmF0b3JHZW5lcmljPEdlbmVyYXRlZFsncm91dGVTY2hlbWEnXVtQYXRoXVsndHlwZXMnXVsncmVzdWx0J10+XSwgdW5kZWZpbmVkPjtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgfTtcblxuICAgIHJldHVybiBzdGFyZ2F0ZTtcbn1cblxuY29uc3QgaXNvRGF0ZVBhdHRlcm4gPSAvXihcXGR7NH0tXFxkezJ9LVxcZHsyfVRcXGR7Mn06XFxkezJ9OlxcZHsyfSg/OlxcLlxcZHsxLDN9KT8pKFp8WystXVxcZHsyfTo/XFxkezJ9KT8kLztcblxuZXhwb3J0IGZ1bmN0aW9uIHJldml2ZUpTT05QYXJzZTxUPihqc29uOiBUKTogVCB7XG4gICAgaWYgKGpzb24gPT09IG51bGwgfHwganNvbiA9PT0gdW5kZWZpbmVkKSByZXR1cm4ganNvbjtcbiAgICBjb25zdCB0eXBlID0gdHlwZW9mIGpzb247XG4gICAgaWYgKHR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGlmIChqc29uIGluc3RhbmNlb2YgRGF0ZSkgcmV0dXJuIGpzb247XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGpzb24pKSB7XG4gICAgICAgICAgICBjb25zdCBsZW4gPSBqc29uLmxlbmd0aDtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSByZXZpdmVKU09OUGFyc2UoanNvbltpXSk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAhPT0ganNvbltpXSkganNvbltpXSA9IHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBqc29uO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhqc29uIGFzIG9iamVjdCk7XG4gICAgICAgIGNvbnN0IG9iaiA9IGpzb24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3Qga2V5ID0ga2V5c1tpXTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gb2JqW2tleV07XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSByZXZpdmVKU09OUGFyc2UodmFsdWUpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdCAhPT0gdmFsdWUpIG9ialtrZXldID0gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBqc29uO1xuICAgIH1cbiAgICBpZiAodHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgY29uc3Qgc3RyID0ganNvbiBhcyB1bmtub3duIGFzIHN0cmluZztcbiAgICAgICAgLy8gUXVpY2sgcmVqZWN0OiBJU08gZGF0ZSBzdHJpbmdzIG11c3Qgc3RhcnQgd2l0aCBhIGRpZ2l0IGFuZCBjb250YWluICdUJ1xuICAgICAgICBjb25zdCBsZW4gPSBzdHIubGVuZ3RoO1xuICAgICAgICBpZiAobGVuID49IDIwICYmIGxlbiA8PSAzMiAmJiBzdHIuY2hhckNvZGVBdCgwKSA+PSAweDMwICYmIHN0ci5jaGFyQ29kZUF0KDApIDw9IDB4MzkgJiYgc3RyLmluZGV4T2YoJ1QnKSAhPT0gLTEpIHtcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gc3RyLm1hdGNoKGlzb0RhdGVQYXR0ZXJuKTtcbiAgICAgICAgICAgIGlmIChtYXRjaCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGlmIChtYXRjaFsyXSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb2xvblBvcyA9IG1hdGNoWzJdLmNoYXJDb2RlQXQoMykgPT09IDU4ID8gbWF0Y2hbMV0ubGVuZ3RoICsgMyA6IC0xO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29sb25Qb3MgPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKHN0ci5zdWJzdHJpbmcoMCwgY29sb25Qb3MpICsgc3RyLnN1YnN0cmluZyhjb2xvblBvcyArIDEpKSBhcyBhbnk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKHN0cikgYXMgYW55O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERhdGUobWF0Y2hbMV0gKyAnWicpIGFzIGFueTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ganNvbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFeGVjdXRlU3RyZWFtT3B0aW9ucyB7XG4gICAgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gICAgdGltZW91dD86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBcGlTY2hlbWFFeHRlbmQge1xuICAgIGFwaVZhbGlkYXRvcjoge1xuICAgICAgICBnZW5lcmF0ZWRBdDogbnVtYmVyO1xuICAgICAgICB2YWxpZGF0ZTogUmVjb3JkPGFueSwgYW55PjtcbiAgICB9O1xuICAgIGFwaU1ldGhvZHNTY2hlbWE6IFJlY29yZDxhbnksIGFueT47XG4gICAgYXBpTWV0aG9kc1R5cGVTY2hlbWE6IFJlY29yZDxhbnksIGFueT47XG4gICAgYXBpVGVzdHNTY2hlbWE6IFJlY29yZDxhbnksIGFueT47XG59XG5cbmV4cG9ydCB0eXBlIEZhaWxDb2RlRXh0ZW5kID0gUmVjb3JkPGFueSwgKC4uLmFyZ3M6IEFycmF5PGFueT4pID0+IGFueT47XG5cbmV4cG9ydCB0eXBlIEJvb3RzdHJhcE1pZGRsZXdhcmUgPSAoZGF0YTogeyBzdG9yYWdlOiBDbGllbnRTdG9yYWdlIH0pID0+IFByb21pc2U8dm9pZD4gfCB2b2lkO1xuZXhwb3J0IHR5cGUgQmVmb3JlRXhlY3V0ZU1pZGRsZXdhcmUgPSAoZGF0YTogeyBwYXRoOiBzdHJpbmc7IHBhcmFtczogYW55OyBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+OyBzdG9yYWdlOiBDbGllbnRTdG9yYWdlIH0pID0+IFByb21pc2U8dm9pZD4gfCB2b2lkO1xuZXhwb3J0IHR5cGUgQWZ0ZXJFeGVjdXRlTWlkZGxld2FyZSA9IChkYXRhOiB7IHBhdGg6IHN0cmluZzsgcmVzdWx0OiB7IHZhbHVlOiBhbnkgfTsgc3RvcmFnZTogQ2xpZW50U3RvcmFnZSB9KSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZDtcblxuZXhwb3J0IGludGVyZmFjZSBNaWRkbGV3YXJlT3B0aW9ucyB7XG4gICAgYm9vdHN0cmFwPzogQm9vdHN0cmFwTWlkZGxld2FyZTtcbiAgICBiZWZvcmVFeGVjdXRlPzogQmVmb3JlRXhlY3V0ZU1pZGRsZXdhcmU7XG4gICAgYWZ0ZXJFeGVjdXRlPzogQWZ0ZXJFeGVjdXRlTWlkZGxld2FyZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDbGllbnRTdG9yYWdlIHtcbiAgICBnZXRJdGVtOiAoa2V5OiBzdHJpbmcpID0+IFByb21pc2U8c3RyaW5nIHwgbnVsbD47XG4gICAgc2V0SXRlbTogKGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+O1xuICAgIHJlbW92ZUl0ZW06IChrZXk6IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFeGVjdXRlUmVzdWx0U3VjY2VzczxSZXN1bHQ+IHtcbiAgICBleGVjdXRlSWQ6IHN0cmluZztcbiAgICBzdWNjZXNzOiB0cnVlO1xuICAgIGRhdGE6IFJlc3VsdDtcbn1cblxuZXhwb3J0IHR5cGUgR2VuZXJhdG9yR2VuZXJpYzxUPiA9IFQgZXh0ZW5kcyBBc3luY0dlbmVyYXRvcjxpbmZlciBJPiA/IEkgOiBuZXZlcjtcblxuZXhwb3J0IHR5cGUgRmxhdHRlbktleXM8VCwgUHJlZml4IGV4dGVuZHMgc3RyaW5nID0gJyc+ID0ge1xuICAgIFtLIGluIGtleW9mIFRdOiBUW0tdIGV4dGVuZHMgb2JqZWN0ID8gRmxhdHRlbktleXM8VFtLXSwgYCR7UHJlZml4fSR7RXhjbHVkZTxLLCBzeW1ib2w+fS5gPiA6IGAkaW5wdXQuJHtQcmVmaXh9JHtFeGNsdWRlPEssIHN5bWJvbD59YDtcbn1ba2V5b2YgVF07XG5cbi8vICoqKiBUaGlzIHBhcnQgb2YgdGhlIGNvZGUgaXMgYmFzZWQgb24gYEBtaWNyb3NvZnQvZmV0Y2gtZXZlbnQtc291cmNlYCByZXdyaXRlLCB0aGFua3MgdG8gdGhlIHdvcmsgb2YgTWljcm9zb2Z0ICoqKiAvL1xuLy8gKioqIGh0dHBzOi8vZ2l0aHViLmNvbS9BenVyZS9mZXRjaC1ldmVudC1zb3VyY2UvYmxvYi9tYWluL3NyYy9wYXJzZS50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqIC8vXG5cbi8qKlxuICogUmVwcmVzZW50cyBhIG1lc3NhZ2Ugc2VudCBpbiBhbiBldmVudCBzdHJlYW1cbiAqIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9TZXJ2ZXItc2VudF9ldmVudHMvVXNpbmdfc2VydmVyLXNlbnRfZXZlbnRzI0V2ZW50X3N0cmVhbV9mb3JtYXRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFdmVudFNvdXJjZU1lc3NhZ2Uge1xuICAgIGRhdGE6IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIFJlYWRhYmxlU3RyZWFtIGludG8gYSBjYWxsYmFjayBwYXR0ZXJuLlxuICogQHBhcmFtIHN0cmVhbSBUaGUgaW5wdXQgUmVhZGFibGVTdHJlYW0uXG4gKiBAcGFyYW0gb25DaHVuayBBIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQgb24gZWFjaCBuZXcgYnl0ZSBjaHVuayBpbiB0aGUgc3RyZWFtLlxuICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHdpbGwgYmUgcmVzb2x2ZWQgd2hlbiB0aGUgc3RyZWFtIGNsb3Nlcy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEJ5dGVzKHN0cmVhbTogUmVhZGFibGVTdHJlYW08VWludDhBcnJheT4sIG9uQ2h1bms6IChhcnI6IFVpbnQ4QXJyYXkpID0+IHZvaWQpIHtcbiAgICBjb25zdCByZWFkZXIgPSBzdHJlYW0uZ2V0UmVhZGVyKCk7XG4gICAgbGV0IHJlc3VsdDogUmVhZGFibGVTdHJlYW1SZWFkUmVzdWx0PFVpbnQ4QXJyYXk+O1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICB3aGlsZSAoIShyZXN1bHQgPSBhd2FpdCByZWFkZXIucmVhZCgpKS5kb25lKSB7XG4gICAgICAgIG9uQ2h1bmsocmVzdWx0LnZhbHVlKTtcbiAgICB9XG59XG5cbi8qKlxuICogUGFyc2VzIGFyYml0YXJ5IGJ5dGUgY2h1bmtzIGludG8gRXZlbnRTb3VyY2UgbGluZSBidWZmZXJzLlxuICogRWFjaCBsaW5lIHNob3VsZCBiZSBvZiB0aGUgZm9ybWF0IFwiZmllbGQ6IHZhbHVlXCIgYW5kIGVuZHMgd2l0aCBcXHIsIFxcbiwgb3IgXFxyXFxuLlxuICogQHBhcmFtIG9uTGluZSBBIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQgb24gZWFjaCBuZXcgRXZlbnRTb3VyY2UgbGluZS5cbiAqIEByZXR1cm5zIEEgZnVuY3Rpb24gdGhhdCBzaG91bGQgYmUgY2FsbGVkIGZvciBlYWNoIGluY29taW5nIGJ5dGUgY2h1bmsuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRMaW5lcyhvbkxpbmU6IChsaW5lOiBVaW50OEFycmF5LCBmaWVsZExlbmd0aDogbnVtYmVyKSA9PiB2b2lkKSB7XG4gICAgbGV0IGJ1ZmZlcjogVWludDhBcnJheSB8IHVuZGVmaW5lZDtcbiAgICBsZXQgcG9zaXRpb246IG51bWJlcjsgLy8gY3VycmVudCByZWFkIHBvc2l0aW9uXG4gICAgbGV0IGZpZWxkTGVuZ3RoOiBudW1iZXI7IC8vIGxlbmd0aCBvZiB0aGUgYGZpZWxkYCBwb3J0aW9uIG9mIHRoZSBsaW5lXG4gICAgbGV0IGRpc2NhcmRUcmFpbGluZ05ld2xpbmUgPSBmYWxzZTtcblxuICAgIC8vIHJldHVybiBhIGZ1bmN0aW9uIHRoYXQgY2FuIHByb2Nlc3MgZWFjaCBpbmNvbWluZyBieXRlIGNodW5rOlxuICAgIHJldHVybiBmdW5jdGlvbiBvbkNodW5rKGFycjogVWludDhBcnJheSkge1xuICAgICAgICBpZiAoYnVmZmVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGJ1ZmZlciA9IGFycjtcbiAgICAgICAgICAgIHBvc2l0aW9uID0gMDtcbiAgICAgICAgICAgIGZpZWxkTGVuZ3RoID0gLTE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyB3ZSdyZSBzdGlsbCBwYXJzaW5nIHRoZSBvbGQgbGluZS4gQXBwZW5kIHRoZSBuZXcgYnl0ZXMgaW50byBidWZmZXI6XG4gICAgICAgICAgICBidWZmZXIgPSBjb25jYXQoYnVmZmVyLCBhcnIpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYnVmTGVuZ3RoID0gYnVmZmVyLmxlbmd0aDtcbiAgICAgICAgbGV0IGxpbmVTdGFydCA9IDA7IC8vIGluZGV4IHdoZXJlIHRoZSBjdXJyZW50IGxpbmUgc3RhcnRzXG4gICAgICAgIHdoaWxlIChwb3NpdGlvbiA8IGJ1Zkxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKGRpc2NhcmRUcmFpbGluZ05ld2xpbmUpIHtcbiAgICAgICAgICAgICAgICBpZiAoYnVmZmVyW3Bvc2l0aW9uXSA9PT0gMTApIHtcbiAgICAgICAgICAgICAgICAgICAgbGluZVN0YXJ0ID0gKytwb3NpdGlvbjsgLy8gc2tpcCB0byBuZXh0IGNoYXJcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBkaXNjYXJkVHJhaWxpbmdOZXdsaW5lID0gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIHN0YXJ0IGxvb2tpbmcgZm9yd2FyZCB0aWxsIHRoZSBlbmQgb2YgbGluZTpcbiAgICAgICAgICAgIGxldCBsaW5lRW5kID0gLTE7IC8vIGluZGV4IG9mIHRoZSBcXHIgb3IgXFxuIGNoYXJcbiAgICAgICAgICAgIGZvciAoOyBwb3NpdGlvbiA8IGJ1Zkxlbmd0aCAmJiBsaW5lRW5kID09PSAtMTsgKytwb3NpdGlvbikge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoYnVmZmVyW3Bvc2l0aW9uXSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDU4OlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkTGVuZ3RoID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpcnN0IGNvbG9uIGluIGxpbmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZExlbmd0aCA9IHBvc2l0aW9uIC0gbGluZVN0YXJ0O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMTM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc2NhcmRUcmFpbGluZ05ld2xpbmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGluZUVuZCA9IHBvc2l0aW9uO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVFbmQgPSBwb3NpdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGxpbmVFbmQgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgLy8gV2UgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBidWZmZXIgYnV0IHRoZSBsaW5lIGhhc24ndCBlbmRlZC5cbiAgICAgICAgICAgICAgICAvLyBXYWl0IGZvciB0aGUgbmV4dCBhcnIgYW5kIHRoZW4gY29udGludWUgcGFyc2luZzpcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gd2UndmUgcmVhY2hlZCB0aGUgbGluZSBlbmQsIHNlbmQgaXQgb3V0OlxuICAgICAgICAgICAgb25MaW5lKGJ1ZmZlci5zdWJhcnJheShsaW5lU3RhcnQsIGxpbmVFbmQpLCBmaWVsZExlbmd0aCk7XG4gICAgICAgICAgICBsaW5lU3RhcnQgPSBwb3NpdGlvbjsgLy8gd2UncmUgbm93IG9uIHRoZSBuZXh0IGxpbmVcbiAgICAgICAgICAgIGZpZWxkTGVuZ3RoID0gLTE7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobGluZVN0YXJ0ID09PSBidWZMZW5ndGgpIHtcbiAgICAgICAgICAgIGJ1ZmZlciA9IHVuZGVmaW5lZDsgLy8gd2UndmUgZmluaXNoZWQgcmVhZGluZyBpdFxuICAgICAgICB9IGVsc2UgaWYgKGxpbmVTdGFydCAhPT0gMCkge1xuICAgICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IHZpZXcgaW50byBidWZmZXIgYmVnaW5uaW5nIGF0IGxpbmVTdGFydCBzbyB3ZSBkb24ndFxuICAgICAgICAgICAgLy8gbmVlZCB0byBjb3B5IG92ZXIgdGhlIHByZXZpb3VzIGxpbmVzIHdoZW4gd2UgZ2V0IHRoZSBuZXcgYXJyOlxuICAgICAgICAgICAgYnVmZmVyID0gYnVmZmVyLnN1YmFycmF5KGxpbmVTdGFydCk7XG4gICAgICAgICAgICBwb3NpdGlvbiAtPSBsaW5lU3RhcnQ7XG4gICAgICAgIH1cbiAgICB9O1xufVxuXG4vKipcbiAqIFBhcnNlcyBsaW5lIGJ1ZmZlcnMgaW50byBFdmVudFNvdXJjZU1lc3NhZ2VzLlxuICogQHBhcmFtIG9uSWQgQSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIG9uIGVhY2ggYGlkYCBmaWVsZC5cbiAqIEBwYXJhbSBvblJldHJ5IEEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCBvbiBlYWNoIGByZXRyeWAgZmllbGQuXG4gKiBAcGFyYW0gb25NZXNzYWdlIEEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCBvbiBlYWNoIG1lc3NhZ2UuXG4gKiBAcmV0dXJucyBBIGZ1bmN0aW9uIHRoYXQgc2hvdWxkIGJlIGNhbGxlZCBmb3IgZWFjaCBpbmNvbWluZyBsaW5lIGJ1ZmZlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE1lc3NhZ2VzKG9uTWVzc2FnZT86IChtc2c6IEV2ZW50U291cmNlTWVzc2FnZSkgPT4gdm9pZCkge1xuICAgIGxldCBtZXNzYWdlID0gbmV3TWVzc2FnZSgpO1xuICAgIGNvbnN0IGRlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoKTtcblxuICAgIC8vIHJldHVybiBhIGZ1bmN0aW9uIHRoYXQgY2FuIHByb2Nlc3MgZWFjaCBpbmNvbWluZyBsaW5lIGJ1ZmZlcjpcbiAgICByZXR1cm4gZnVuY3Rpb24gb25MaW5lKGxpbmU6IFVpbnQ4QXJyYXksIGZpZWxkTGVuZ3RoOiBudW1iZXIpIHtcbiAgICAgICAgaWYgKGxpbmUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAvLyBlbXB0eSBsaW5lIGRlbm90ZXMgZW5kIG9mIG1lc3NhZ2UuIFRyaWdnZXIgdGhlIGNhbGxiYWNrIGFuZCBzdGFydCBhIG5ldyBtZXNzYWdlOlxuICAgICAgICAgICAgb25NZXNzYWdlPy4obWVzc2FnZSk7XG4gICAgICAgICAgICBtZXNzYWdlID0gbmV3TWVzc2FnZSgpO1xuICAgICAgICB9IGVsc2UgaWYgKGZpZWxkTGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgLy8gZXhjbHVkZSBjb21tZW50cyBhbmQgbGluZXMgd2l0aCBubyB2YWx1ZXNcbiAgICAgICAgICAgIC8vIGxpbmUgaXMgb2YgZm9ybWF0IFwiPGZpZWxkPjo8dmFsdWU+XCIgb3IgXCI8ZmllbGQ+OiA8dmFsdWU+XCJcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3NlcnZlci1zZW50LWV2ZW50cy5odG1sI2V2ZW50LXN0cmVhbS1pbnRlcnByZXRhdGlvblxuICAgICAgICAgICAgY29uc3QgZmllbGQgPSBkZWNvZGVyLmRlY29kZShsaW5lLnN1YmFycmF5KDAsIGZpZWxkTGVuZ3RoKSk7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZU9mZnNldCA9IGZpZWxkTGVuZ3RoICsgKGxpbmVbZmllbGRMZW5ndGggKyAxXSA9PT0gMzIgPyAyIDogMSk7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGRlY29kZXIuZGVjb2RlKGxpbmUuc3ViYXJyYXkodmFsdWVPZmZzZXQpKTtcblxuICAgICAgICAgICAgc3dpdGNoIChmaWVsZCkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2RhdGEnOlxuICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGlzIG1lc3NhZ2UgYWxyZWFkeSBoYXMgZGF0YSwgYXBwZW5kIHRoZSBuZXcgdmFsdWUgdG8gdGhlIG9sZC5cbiAgICAgICAgICAgICAgICAgICAgLy8gb3RoZXJ3aXNlLCBqdXN0IHNldCB0byB0aGUgbmV3IHZhbHVlOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmRhdGEgPSBtZXNzYWdlLmRhdGEgPyBgJHttZXNzYWdlLmRhdGF9XFxuJHt2YWx1ZX1gIDogdmFsdWU7IC8vIG90aGVyd2lzZSxcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xufVxuXG5mdW5jdGlvbiBjb25jYXQoYTogVWludDhBcnJheSwgYjogVWludDhBcnJheSkge1xuICAgIGNvbnN0IHJlcyA9IG5ldyBVaW50OEFycmF5KGEubGVuZ3RoICsgYi5sZW5ndGgpO1xuICAgIHJlcy5zZXQoYSk7XG4gICAgcmVzLnNldChiLCBhLmxlbmd0aCk7XG4gICAgcmV0dXJuIHJlcztcbn1cblxuZnVuY3Rpb24gbmV3TWVzc2FnZSgpOiBFdmVudFNvdXJjZU1lc3NhZ2Uge1xuICAgIHJldHVybiB7XG4gICAgICAgIGRhdGE6ICcnLFxuICAgIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3aXRoUmVzb2x2ZXJzPFQgPSBhbnk+KCk6IFByb21pc2VXaXRoUmVzb2x2ZXJzPFQ+IHtcbiAgICBsZXQgcmVzb2x2ZTogUHJvbWlzZVdpdGhSZXNvbHZlcnM8VD5bJ3Jlc29sdmUnXTtcbiAgICBsZXQgcmVqZWN0OiBQcm9taXNlV2l0aFJlc29sdmVyczxUPlsncmVqZWN0J107XG4gICAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlPFQ+KChyZXMsIHJlaikgPT4ge1xuICAgICAgICByZXNvbHZlID0gcmVzO1xuICAgICAgICByZWplY3QgPSByZWo7XG4gICAgfSk7XG4gICAgcmV0dXJuIHsgcHJvbWlzZSwgcmVzb2x2ZTogcmVzb2x2ZSEsIHJlamVjdDogcmVqZWN0ISB9O1xufVxuXG5jb25zdCBEQl9OQU1FID0gJ1N0YXJnYXRlJztcbmNvbnN0IFNUT1JFX05BTUUgPSAnY2FjaGVzJztcbmxldCBkYkluc3RhbmNlOiBJREJEYXRhYmFzZSB8IG51bGwgPSBudWxsO1xuXG5hc3luYyBmdW5jdGlvbiBvcGVuREIoKTogUHJvbWlzZTxJREJEYXRhYmFzZT4ge1xuICAgIGlmIChkYkluc3RhbmNlKSByZXR1cm4gZGJJbnN0YW5jZTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSBpbmRleGVkREIub3BlbihEQl9OQU1FLCAxKTtcbiAgICAgICAgcmVxdWVzdC5vbmVycm9yID0gKCkgPT4gcmVqZWN0KHJlcXVlc3QuZXJyb3IpO1xuICAgICAgICByZXF1ZXN0Lm9uc3VjY2VzcyA9ICgpID0+IHtcbiAgICAgICAgICAgIGRiSW5zdGFuY2UgPSByZXF1ZXN0LnJlc3VsdDtcbiAgICAgICAgICAgIHJlc29sdmUoZGJJbnN0YW5jZSk7XG4gICAgICAgIH07XG4gICAgICAgIHJlcXVlc3Qub251cGdyYWRlbmVlZGVkID0gKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBkYiA9IChldmVudC50YXJnZXQgYXMgSURCT3BlbkRCUmVxdWVzdCkucmVzdWx0O1xuICAgICAgICAgICAgaWYgKCFkYi5vYmplY3RTdG9yZU5hbWVzLmNvbnRhaW5zKFNUT1JFX05BTUUpKSB7XG4gICAgICAgICAgICAgICAgZGIuY3JlYXRlT2JqZWN0U3RvcmUoU1RPUkVfTkFNRSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfSk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVEZWZhdWx0Q2FjaGVTdG9yYWdlKG9wdGlvbnM/OiB7IGVuY3J5cHRpb24/OiBib29sZWFuOyBlbmNyeXB0aW9uS2V5Pzogc3RyaW5nIH0pOiBQcm9taXNlPENhY2hlU3RvcmFnZT4ge1xuICAgIGF3YWl0IG9wZW5EQigpO1xuXG4gICAgbGV0IGVuY3J5cHRpb25LZXk6IENyeXB0b0tleSB8IG51bGwgPSBudWxsO1xuICAgIGNvbnN0IGNvdW50ZXIgPSBuZXcgVWludDhBcnJheSgxNik7XG5cbiAgICBpZiAob3B0aW9ucz8uZW5jcnlwdGlvbikge1xuICAgICAgICBjb25zdCBrZXlTdHJpbmcgPSBvcHRpb25zLmVuY3J5cHRpb25LZXkgPz8gREJfTkFNRTtcbiAgICAgICAgbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKGtleVN0cmluZykuZm9yRWFjaCgoYnl0ZSwgaSkgPT4ge1xuICAgICAgICAgICAgaWYgKGkgPCAxNikgY291bnRlcltpXSA9IGJ5dGU7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKTtcbiAgICAgICAgY29uc3Qga2V5RGF0YSA9IGVuY29kZXIuZW5jb2RlKGtleVN0cmluZyk7XG4gICAgICAgIGNvbnN0IGltcG9ydGVkS2V5ID0gYXdhaXQgY3J5cHRvLnN1YnRsZS5pbXBvcnRLZXkoJ3JhdycsIGtleURhdGEsIHsgbmFtZTogJ1BCS0RGMicgfSwgZmFsc2UsIFsnZGVyaXZlS2V5J10pO1xuXG4gICAgICAgIGVuY3J5cHRpb25LZXkgPSBhd2FpdCBjcnlwdG8uc3VidGxlLmRlcml2ZUtleShcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnUEJLREYyJyxcbiAgICAgICAgICAgICAgICBzYWx0OiBlbmNvZGVyLmVuY29kZSgnbWlsa2lvLXN0YXJnYXRlLWNhY2hlJyksXG4gICAgICAgICAgICAgICAgaXRlcmF0aW9uczogMTAwMDAwLFxuICAgICAgICAgICAgICAgIGhhc2g6ICdTSEEtMjU2JyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBpbXBvcnRlZEtleSxcbiAgICAgICAgICAgIHsgbmFtZTogJ0FFUy1DVFInLCBsZW5ndGg6IDI1NiB9LFxuICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICBbJ2VuY3J5cHQnLCAnZGVjcnlwdCddLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGVuY3J5cHREYXRhID0gYXN5bmMgKGRhdGE6IGFueSk6IFByb21pc2U8VWludDhBcnJheT4gPT4ge1xuICAgICAgICBpZiAoIWVuY3J5cHRpb25LZXkpIHJldHVybiBkYXRhO1xuXG4gICAgICAgIGNvbnN0IGpzb25TdHJpbmcgPSBKU09OLnN0cmluZ2lmeShkYXRhKTtcbiAgICAgICAgY29uc3QgZW5jb2RlciA9IG5ldyBUZXh0RW5jb2RlcigpO1xuICAgICAgICBjb25zdCBkYXRhQnl0ZXMgPSBlbmNvZGVyLmVuY29kZShqc29uU3RyaW5nKTtcblxuICAgICAgICBjb25zdCBlbmNyeXB0ZWRBcnJheUJ1ZmZlciA9IGF3YWl0IGNyeXB0by5zdWJ0bGUuZW5jcnlwdChcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnQUVTLUNUUicsXG4gICAgICAgICAgICAgICAgY291bnRlcjogY291bnRlcixcbiAgICAgICAgICAgICAgICBsZW5ndGg6IDY0LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVuY3J5cHRpb25LZXkhLFxuICAgICAgICAgICAgZGF0YUJ5dGVzLFxuICAgICAgICApO1xuXG4gICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShlbmNyeXB0ZWRBcnJheUJ1ZmZlcik7XG4gICAgfTtcblxuICAgIGNvbnN0IGRlY3J5cHREYXRhID0gYXN5bmMgKGVuY3J5cHRlZERhdGE6IEFycmF5QnVmZmVyIHwgVWludDhBcnJheSk6IFByb21pc2U8YW55PiA9PiB7XG4gICAgICAgIGlmICghZW5jcnlwdGlvbktleSB8fCAhZW5jcnlwdGVkRGF0YSkgcmV0dXJuIGVuY3J5cHRlZERhdGE7XG5cbiAgICAgICAgY29uc3QgYXJyYXlCdWZmZXIgPSBlbmNyeXB0ZWREYXRhIGluc3RhbmNlb2YgVWludDhBcnJheSA/IChlbmNyeXB0ZWREYXRhLmJ1ZmZlciBhcyBBcnJheUJ1ZmZlcikgOiBlbmNyeXB0ZWREYXRhO1xuXG4gICAgICAgIGNvbnN0IGRlY3J5cHRlZEJ5dGVzID0gYXdhaXQgY3J5cHRvLnN1YnRsZS5kZWNyeXB0KFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG5hbWU6ICdBRVMtQ1RSJyxcbiAgICAgICAgICAgICAgICBjb3VudGVyOiBjb3VudGVyLFxuICAgICAgICAgICAgICAgIGxlbmd0aDogNjQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZW5jcnlwdGlvbktleSEsXG4gICAgICAgICAgICBhcnJheUJ1ZmZlcixcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBkZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCk7XG4gICAgICAgIGNvbnN0IGpzb25TdHJpbmcgPSBkZWNvZGVyLmRlY29kZShkZWNyeXB0ZWRCeXRlcyk7XG4gICAgICAgIHJldHVybiByZXZpdmVKU09OUGFyc2UoSlNPTi5wYXJzZShqc29uU3RyaW5nKSk7XG4gICAgfTtcblxuICAgIHJldHVybiB7XG4gICAgICAgIGFzeW5jIGdldChrZXk6IHN0cmluZyk6IFByb21pc2U8eyBkYXRhOiBhbnk7IHRpbWVzdGFtcDogbnVtYmVyIH0gfCBudWxsPiB7XG4gICAgICAgICAgICBjb25zdCBkYiA9IGF3YWl0IG9wZW5EQigpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IGRiLnRyYW5zYWN0aW9uKFNUT1JFX05BTUUsICdyZWFkb25seScpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0b3JlID0gdHJhbnNhY3Rpb24ub2JqZWN0U3RvcmUoU1RPUkVfTkFNRSk7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVxdWVzdCA9IHN0b3JlLmdldChrZXkpO1xuICAgICAgICAgICAgICAgIHJlcXVlc3Qub25lcnJvciA9ICgpID0+IHJlamVjdChyZXF1ZXN0LmVycm9yKTtcbiAgICAgICAgICAgICAgICByZXF1ZXN0Lm9uc3VjY2VzcyA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gcmVxdWVzdC5yZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgIGlmICghcmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKG51bGwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnM/LmVuY3J5cHRpb24gJiYgKHJlc3VsdC5kYXRhIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIgfHwgcmVzdWx0LmRhdGEgaW5zdGFuY2VvZiBVaW50OEFycmF5KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVjcnlwdGVkRGF0YSA9IGF3YWl0IGRlY3J5cHREYXRhKHJlc3VsdC5kYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoeyBkYXRhOiBkZWNyeXB0ZWREYXRhLCB0aW1lc3RhbXA6IHJlc3VsdC50aW1lc3RhbXAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3VsdCA/PyBudWxsKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIGFzeW5jIHNldChrZXk6IHN0cmluZywgZGF0YTogYW55KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgICAgICBjb25zdCBkYiA9IGF3YWl0IG9wZW5EQigpO1xuICAgICAgICAgICAgbGV0IGRhdGFUb1N0b3JlOiBhbnkgPSBkYXRhO1xuXG4gICAgICAgICAgICBpZiAob3B0aW9ucz8uZW5jcnlwdGlvbikge1xuICAgICAgICAgICAgICAgIGRhdGFUb1N0b3JlID0gYXdhaXQgZW5jcnlwdERhdGEoZGF0YSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSBkYi50cmFuc2FjdGlvbihTVE9SRV9OQU1FLCAncmVhZHdyaXRlJyk7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RvcmUgPSB0cmFuc2FjdGlvbi5vYmplY3RTdG9yZShTVE9SRV9OQU1FKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXF1ZXN0ID0gc3RvcmUucHV0KHsgZGF0YTogZGF0YVRvU3RvcmUsIHRpbWVzdGFtcDogRGF0ZS5ub3coKSB9LCBrZXkpO1xuICAgICAgICAgICAgICAgIHJlcXVlc3Qub25lcnJvciA9ICgpID0+IHJlamVjdChyZXF1ZXN0LmVycm9yKTtcbiAgICAgICAgICAgICAgICByZXF1ZXN0Lm9uc3VjY2VzcyA9ICgpID0+IHJlc29sdmUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgIH07XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlQ2FjaGVLZXkocGF0aDogc3RyaW5nLCBwYXJhbXM6IGFueSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3BhdGh9OiR7SlNPTi5zdHJpbmdpZnkocGFyYW1zID8/IHt9KX1gO1xufVxuIgogIF0sCiAgIm1hcHBpbmdzIjogIjtBQWtEQSxlQUFzQixjQUF1RSxDQUFDLGlCQUF3QztBQUFBLEVBQ2xJLE1BQU0sU0FBUyxnQkFBZ0IsU0FBUztBQUFBLEVBQ3hDLE1BQU0sU0FBUyxnQkFBZ0Is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RyxDQUFDLEtBQWEsTUFBMEI7QUFBQSxNQUM3QyxNQUFNLEtBQUssTUFBTSxPQUFPO0FBQUEsTUFDeEIsSUFBSSxjQUFtQjtBQUFBLE1BRXZCLElBQUksU0FBUyxZQUFZO0FBQUEsUUFDckIsY0FBYyxNQUFNLFlBQVksSUFBSTtBQUFBLE1BQ3hDO0FBQUEsTUFFQSxPQUFPLElBQUksUUFBUSxDQUFDLFNBQVMsV0FBVztBQUFBLFFBQ3BDLE1BQU0sY0FBYyxHQUFHLFlBQVksWUFBWSxXQUFXO0FBQUEsUUFDMUQsTUFBTSxRQUFRLFlBQVksWUFBWSxVQUFVO0FBQUEsUUFDaEQsTUFBTSxVQUFVLE1BQU0sSUFBSSxFQUFFLE1BQU0sYUFBYSxXQUFXLEtBQUssSUFBSSxFQUFFLEdBQUcsR0FBRztBQUFBLFFBQzNFLFFBQVEsVUFBVSxNQUFNLE9BQU8sUUFBUSxLQUFLO0FBQUEsUUFDNUMsUUFBUSxZQUFZLE1BQU0sUUFBUTtBQUFBLE9BQ3JDO0FBQUE7QUFBQSxFQUVUO0FBQUE7QUFHSixTQUFTLGdCQUFnQixDQUFDLE1BQWMsUUFBcUI7QUFBQSxFQUN6RCxPQUFPLEdBQUcsUUFBUSxLQUFLLFVBQVUsVUFBVSxDQUFDLENBQUM7QUFBQTsiLAogICJkZWJ1Z0lkIjogIkU4ODUzRDEwNDE0RDQ5Qjk2NDc1NkUyMTY0NzU2RTIxIiwKICAibmFtZXMiOiBbXQp9
|