@witnet/sdk 1.0.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +103 -0
- package/dist/package.json +72 -0
- package/dist/src/bin/helpers.d.ts +91 -0
- package/dist/src/bin/helpers.d.ts.map +1 -0
- package/dist/src/bin/helpers.js +816 -0
- package/dist/src/index.d.ts +5 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +47 -0
- package/dist/src/lib/crypto/account.d.ts +32 -0
- package/dist/src/lib/crypto/account.d.ts.map +1 -0
- package/dist/src/lib/crypto/account.js +106 -0
- package/dist/src/lib/crypto/coinbase.d.ts +10 -0
- package/dist/src/lib/crypto/coinbase.d.ts.map +1 -0
- package/dist/src/lib/crypto/coinbase.js +28 -0
- package/dist/src/lib/crypto/index.d.ts +8 -0
- package/dist/src/lib/crypto/index.d.ts.map +1 -0
- package/dist/src/lib/crypto/index.js +30 -0
- package/dist/src/lib/crypto/interfaces.d.ts +85 -0
- package/dist/src/lib/crypto/interfaces.d.ts.map +1 -0
- package/dist/src/lib/crypto/interfaces.js +3 -0
- package/dist/src/lib/crypto/payloads/DataRequestPayload.d.ts +55 -0
- package/dist/src/lib/crypto/payloads/DataRequestPayload.d.ts.map +1 -0
- package/dist/src/lib/crypto/payloads/DataRequestPayload.js +339 -0
- package/dist/src/lib/crypto/payloads/StakePayload.d.ts +28 -0
- package/dist/src/lib/crypto/payloads/StakePayload.d.ts.map +1 -0
- package/dist/src/lib/crypto/payloads/StakePayload.js +142 -0
- package/dist/src/lib/crypto/payloads/UnstakePayload.d.ts +36 -0
- package/dist/src/lib/crypto/payloads/UnstakePayload.d.ts.map +1 -0
- package/dist/src/lib/crypto/payloads/UnstakePayload.js +154 -0
- package/dist/src/lib/crypto/payloads/ValueTransferPayload.d.ts +25 -0
- package/dist/src/lib/crypto/payloads/ValueTransferPayload.d.ts.map +1 -0
- package/dist/src/lib/crypto/payloads/ValueTransferPayload.js +128 -0
- package/dist/src/lib/crypto/payloads.d.ts +57 -0
- package/dist/src/lib/crypto/payloads.d.ts.map +1 -0
- package/dist/src/lib/crypto/payloads.js +170 -0
- package/dist/src/lib/crypto/signer.d.ts +33 -0
- package/dist/src/lib/crypto/signer.d.ts.map +1 -0
- package/dist/src/lib/crypto/signer.js +194 -0
- package/dist/src/lib/crypto/transmitters/DataRequests.d.ts +15 -0
- package/dist/src/lib/crypto/transmitters/DataRequests.d.ts.map +1 -0
- package/dist/src/lib/crypto/transmitters/DataRequests.js +23 -0
- package/dist/src/lib/crypto/transmitters/StakeDeposits.d.ts +12 -0
- package/dist/src/lib/crypto/transmitters/StakeDeposits.d.ts.map +1 -0
- package/dist/src/lib/crypto/transmitters/StakeDeposits.js +17 -0
- package/dist/src/lib/crypto/transmitters/StakeWithdrawals.d.ts +18 -0
- package/dist/src/lib/crypto/transmitters/StakeWithdrawals.d.ts.map +1 -0
- package/dist/src/lib/crypto/transmitters/StakeWithdrawals.js +53 -0
- package/dist/src/lib/crypto/transmitters/ValueTransfers.d.ts +11 -0
- package/dist/src/lib/crypto/transmitters/ValueTransfers.d.ts.map +1 -0
- package/dist/src/lib/crypto/transmitters/ValueTransfers.js +16 -0
- package/dist/src/lib/crypto/transmitters.d.ts +47 -0
- package/dist/src/lib/crypto/transmitters.d.ts.map +1 -0
- package/dist/src/lib/crypto/transmitters.js +416 -0
- package/dist/src/lib/crypto/types.d.ts +161 -0
- package/dist/src/lib/crypto/types.d.ts.map +1 -0
- package/dist/src/lib/crypto/types.js +273 -0
- package/dist/src/lib/crypto/utils.d.ts +21 -0
- package/dist/src/lib/crypto/utils.d.ts.map +1 -0
- package/dist/src/lib/crypto/utils.js +156 -0
- package/dist/src/lib/crypto/wallet.d.ts +120 -0
- package/dist/src/lib/crypto/wallet.d.ts.map +1 -0
- package/dist/src/lib/crypto/wallet.js +258 -0
- package/dist/src/lib/index.d.ts +5 -0
- package/dist/src/lib/index.d.ts.map +1 -0
- package/dist/src/lib/index.js +44 -0
- package/dist/src/lib/radon/ccdr/eth.d.ts +160 -0
- package/dist/src/lib/radon/ccdr/eth.d.ts.map +1 -0
- package/dist/src/lib/radon/ccdr/eth.js +272 -0
- package/dist/src/lib/radon/ccdr/index.d.ts +14 -0
- package/dist/src/lib/radon/ccdr/index.d.ts.map +1 -0
- package/dist/src/lib/radon/ccdr/index.js +39 -0
- package/dist/src/lib/radon/ccdr/wit.d.ts +23 -0
- package/dist/src/lib/radon/ccdr/wit.d.ts.map +1 -0
- package/dist/src/lib/radon/ccdr/wit.js +35 -0
- package/dist/src/lib/radon/filters.d.ts +14 -0
- package/dist/src/lib/radon/filters.d.ts.map +1 -0
- package/dist/src/lib/radon/filters.js +45 -0
- package/dist/src/lib/radon/index.d.ts +296 -0
- package/dist/src/lib/radon/index.d.ts.map +1 -0
- package/dist/src/lib/radon/index.js +707 -0
- package/dist/src/lib/radon/reducers.d.ts +29 -0
- package/dist/src/lib/radon/reducers.d.ts.map +1 -0
- package/dist/src/lib/radon/reducers.js +66 -0
- package/dist/src/lib/radon/types.d.ts +521 -0
- package/dist/src/lib/radon/types.d.ts.map +1 -0
- package/dist/src/lib/radon/types.js +936 -0
- package/dist/src/lib/radon/utils.d.ts +53 -0
- package/dist/src/lib/radon/utils.d.ts.map +1 -0
- package/dist/src/lib/radon/utils.js +153 -0
- package/dist/src/lib/rpc/index.d.ts +3 -0
- package/dist/src/lib/rpc/index.d.ts.map +1 -0
- package/dist/src/lib/rpc/index.js +19 -0
- package/dist/src/lib/rpc/nodes.d.ts +40 -0
- package/dist/src/lib/rpc/nodes.d.ts.map +1 -0
- package/dist/src/lib/rpc/nodes.js +293 -0
- package/dist/src/lib/rpc/provider.d.ts +88 -0
- package/dist/src/lib/rpc/provider.d.ts.map +1 -0
- package/dist/src/lib/rpc/provider.js +336 -0
- package/dist/src/lib/rpc/reporter.d.ts +18 -0
- package/dist/src/lib/rpc/reporter.d.ts.map +1 -0
- package/dist/src/lib/rpc/reporter.js +30 -0
- package/dist/src/lib/rpc/types.d.ts +409 -0
- package/dist/src/lib/rpc/types.d.ts.map +1 -0
- package/dist/src/lib/rpc/types.js +81 -0
- package/dist/src/lib/types.d.ts +18 -0
- package/dist/src/lib/types.d.ts.map +1 -0
- package/dist/src/lib/types.js +7 -0
- package/dist/src/lib/utils.d.ts +13 -0
- package/dist/src/lib/utils.d.ts.map +1 -0
- package/dist/src/lib/utils.js +97 -0
- package/dist/witnet/assets/index.d.ts +30 -0
- package/dist/witnet/assets/index.d.ts.map +1 -0
- package/dist/witnet/assets/index.js +6 -0
- package/dist/witnet/assets/modals/index.d.ts +18 -0
- package/dist/witnet/assets/modals/index.d.ts.map +1 -0
- package/dist/witnet/assets/modals/index.js +21 -0
- package/dist/witnet/assets/modals/web3/eth.d.ts +5 -0
- package/dist/witnet/assets/modals/web3/eth.d.ts.map +1 -0
- package/dist/witnet/assets/modals/web3/eth.js +26 -0
- package/dist/witnet/assets/modals/web3/wit.d.ts +4 -0
- package/dist/witnet/assets/modals/web3/wit.d.ts.map +1 -0
- package/dist/witnet/assets/modals/web3/wit.js +20 -0
- package/dist/witnet/assets/requests.d.ts +11 -0
- package/dist/witnet/assets/requests.d.ts.map +1 -0
- package/dist/witnet/assets/requests.js +88 -0
- package/dist/witnet/witnet.proto.json +1325 -0
- package/package.json +72 -0
- package/src/bin/cli/history.js +31 -0
- package/src/bin/cli/inspect.js +359 -0
- package/src/bin/cli/network.js +592 -0
- package/src/bin/cli/nodes.js +364 -0
- package/src/bin/cli/radon.js +814 -0
- package/src/bin/cli/wallet.js +1000 -0
- package/src/bin/helpers.js +829 -0
- package/src/bin/postinstall.js +9 -0
- package/src/bin/toolkit.js +294 -0
- package/witnet/assets/_index.js +8 -0
- package/witnet/assets/_requests.js +25 -0
- package/witnet/assets/_sources.js +36 -0
- package/witnet/assets/_templates.js +36 -0
- package/witnet/assets/index.js +4 -0
- package/witnet/assets/modals/index.js +25 -0
- package/witnet/assets/modals/web3/btc.js +0 -0
- package/witnet/assets/modals/web3/eth.js +29 -0
- package/witnet/assets/modals/web3/sol.js +0 -0
- package/witnet/assets/modals/web3/wit.js +23 -0
- package/witnet/assets/requests.js +94 -0
- package/witnet/witnet.proto.json +1325 -0
|
@@ -0,0 +1,816 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
const { exec } = require("child_process");
|
|
3
|
+
const moment = require("moment");
|
|
4
|
+
const net = require("net");
|
|
5
|
+
const os = require("os");
|
|
6
|
+
const readline = require("readline");
|
|
7
|
+
const colorstrip = (str) => str.replace(/[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g, "");
|
|
8
|
+
const commas = (number) => {
|
|
9
|
+
const parts = number.toString().split(".");
|
|
10
|
+
const result = parts.length <= 1
|
|
11
|
+
? `${parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ",")}`
|
|
12
|
+
: `${parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ",")}.${parts[1]}`;
|
|
13
|
+
return result;
|
|
14
|
+
};
|
|
15
|
+
function toFixedTrunc(x, n) {
|
|
16
|
+
const v = (typeof x === "string" ? x : x.toString()).split(".");
|
|
17
|
+
if (n <= 0)
|
|
18
|
+
return v[0];
|
|
19
|
+
let f = v[1] || "";
|
|
20
|
+
if (f.length > n)
|
|
21
|
+
return `${v[0]}.${f.substr(0, n)}`;
|
|
22
|
+
while (f.length < n)
|
|
23
|
+
f += "0";
|
|
24
|
+
return `${v[0]}.${f}`;
|
|
25
|
+
}
|
|
26
|
+
;
|
|
27
|
+
const whole_wits = (number, digits) => {
|
|
28
|
+
const lookup = [
|
|
29
|
+
{ value: 1n, symbol: "pedros" },
|
|
30
|
+
{ value: 10n ** 6n, symbol: "mWits" },
|
|
31
|
+
{ value: 10n ** 9n, symbol: " Wits" },
|
|
32
|
+
{ value: 10n ** 12n, symbol: "KWits" },
|
|
33
|
+
{ value: 10n ** 15n, symbol: "MWits" },
|
|
34
|
+
];
|
|
35
|
+
// const regexp = /\.0+$|(?<=\.[0-9])0+$/
|
|
36
|
+
const item = lookup.findLast(item => number >= item.value);
|
|
37
|
+
const quotient = item ? Number(BigInt(number) / item.value) : number.toString();
|
|
38
|
+
const decimals = item ? (item.value + BigInt(number) - BigInt(quotient) * item.value).toString().slice(1) : "";
|
|
39
|
+
return item ? `${commas(quotient)}${decimals !== "" ? `.${decimals.slice(0, digits)}` : ""} ${item.symbol}` : "(no coins)";
|
|
40
|
+
};
|
|
41
|
+
const bblue = (str) => `\x1b[1;98;44m${str}\x1b[0;0;0m`;
|
|
42
|
+
const bcyan = (str) => `\x1b[38;46m${str}\x1b[0;0m`;
|
|
43
|
+
const bgreen = (str) => `\x1b[30;42m${str}\x1b[0;0m`;
|
|
44
|
+
const bred = (str) => `\x1b[30;41m${str}\x1b[0;0m`;
|
|
45
|
+
const bviolet = (str) => `\x1b[30;45m${str}\x1b[0;0m`;
|
|
46
|
+
const lcyan = (str) => `\x1b[1;96m${str}\x1b[0m`;
|
|
47
|
+
const lgray = (str) => `\x1b[1;90m${str}\x1b[0m`;
|
|
48
|
+
const lgreen = (str) => `\x1b[1;92m${str}\x1b[0m`;
|
|
49
|
+
const lmagenta = (str) => `\x1b[1;95m${str}\x1b[0m`;
|
|
50
|
+
const lyellow = (str) => `\x1b[1;93m${str}\x1b[0m`;
|
|
51
|
+
const mblue = (str) => `\x1b[94m${str}\x1b[0m`;
|
|
52
|
+
const mcyan = (str) => `\x1b[96m${str}\x1b[0m`;
|
|
53
|
+
const mgreen = (str) => `\x1b[92m${str}\x1b[0m`;
|
|
54
|
+
const mmagenta = (str) => `\x1b[0;95m${str}\x1b[0m`;
|
|
55
|
+
const mred = (str) => `\x1b[91m${str}\x1b[0m`;
|
|
56
|
+
const myellow = (str) => `\x1b[93m${str}\x1b[0m`;
|
|
57
|
+
const blue = (str) => `\x1b[34m${str}\x1b[0m`;
|
|
58
|
+
const cyan = (str) => `\x1b[36m${str}\x1b[0m`;
|
|
59
|
+
const gray = (str) => `\x1b[90m${str}\x1b[0m`;
|
|
60
|
+
const green = (str) => `\x1b[32m${str}\x1b[0m`;
|
|
61
|
+
const magenta = (str) => `\x1b[0;35m${str}\x1b[0m`;
|
|
62
|
+
const normal = (str) => `\x1b[98m${str}\x1b[0m`;
|
|
63
|
+
const red = (str) => `\x1b[31m${str}\x1b[0m`;
|
|
64
|
+
const white = (str) => `\x1b[1;98m${str}\x1b[0m`;
|
|
65
|
+
const yellow = (str) => `\x1b[33m${str}\x1b[0m`;
|
|
66
|
+
function countLeaves(t, obj) {
|
|
67
|
+
if (!obj || typeof obj === "string")
|
|
68
|
+
return 0;
|
|
69
|
+
if (obj instanceof t)
|
|
70
|
+
return 1;
|
|
71
|
+
if (Array.isArray(obj))
|
|
72
|
+
return obj.reduce((sum, item) => sum + countLeaves(t, item), 0);
|
|
73
|
+
else
|
|
74
|
+
return Object.values(obj).reduce((sum, item) => sum + countLeaves(t, item), 0);
|
|
75
|
+
}
|
|
76
|
+
function deleteExtraFlags(args) {
|
|
77
|
+
return args.filter(arg => !arg.startsWith("--"));
|
|
78
|
+
}
|
|
79
|
+
function cmd(...command) {
|
|
80
|
+
return new Promise((resolve, reject) => {
|
|
81
|
+
exec(command.join(" "), { maxBuffer: 1024 * 1024 * 10 }, (error, stdout, stderr) => {
|
|
82
|
+
if (error) {
|
|
83
|
+
reject(error);
|
|
84
|
+
}
|
|
85
|
+
if (stderr) {
|
|
86
|
+
reject(stderr);
|
|
87
|
+
}
|
|
88
|
+
resolve(stdout);
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
;
|
|
93
|
+
async function execRadonBytecode(bytecode, ...flags) {
|
|
94
|
+
if (!isHexString(bytecode)) {
|
|
95
|
+
throw EvalError("invalid hex string");
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
const npx = os.type() === "Windows_NT" ? "npx.cmd" : "npx";
|
|
99
|
+
return cmd(npx, "witnet", "radon", "dryrun", bytecode, ...flags);
|
|
100
|
+
// .catch((err) => {
|
|
101
|
+
// let errorMessage = err.message.split('\n').slice(1).join('\n').trim()
|
|
102
|
+
// const errorRegex = /.*^error: (?<message>.*)$.*/gm
|
|
103
|
+
// const matched = errorRegex.exec(err.message)
|
|
104
|
+
// if (matched) {
|
|
105
|
+
// errorMessage = matched.groups.message
|
|
106
|
+
// }
|
|
107
|
+
// console.log(errorMessage || err)
|
|
108
|
+
// console.error(errorMessage || err)
|
|
109
|
+
// })
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
function extractFromArgs(args, flags) {
|
|
113
|
+
const curated = {};
|
|
114
|
+
if (args && flags) {
|
|
115
|
+
Object.keys(flags).forEach(flag => {
|
|
116
|
+
const flagIndex = args.indexOf(`--${flag}`);
|
|
117
|
+
if (flagIndex >= 0) {
|
|
118
|
+
if (flags[flag].param) {
|
|
119
|
+
curated[flag] = args[flagIndex];
|
|
120
|
+
if (!args[flagIndex + 1] || args[flagIndex + 1].startsWith("--")) {
|
|
121
|
+
throw Error(`Missing required parameter for --${flag}`);
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
curated[flag] = args[flagIndex + 1];
|
|
125
|
+
args.splice(flagIndex, 2);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
curated[flag] = true;
|
|
130
|
+
args.splice(flagIndex, 1);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
return [args, curated];
|
|
136
|
+
}
|
|
137
|
+
function fromHexString(hexString) {
|
|
138
|
+
if (hexString.startsWith("0x"))
|
|
139
|
+
hexString = hexString.slice(2);
|
|
140
|
+
return Uint8Array.from(hexString.match(/.{1,2}/g).map((byte) => parseInt(byte, 16)));
|
|
141
|
+
}
|
|
142
|
+
function ipIsPrivateOrLocalhost(ip) {
|
|
143
|
+
if (ip.substring(0, 7) === "::ffff:") {
|
|
144
|
+
ip = ip.substring(7);
|
|
145
|
+
}
|
|
146
|
+
if (net.isIPv4(ip)) {
|
|
147
|
+
// check localhost
|
|
148
|
+
if (ip === "127.0.0.1") {
|
|
149
|
+
return true;
|
|
150
|
+
}
|
|
151
|
+
// 10.0.0.0 - 10.255.255.255 || 172.16.0.0 - 172.31.255.255 || 192.168.0.0 - 192.168.255.255
|
|
152
|
+
return /^(10)\.(.*)\.(.*)\.(.*)$/.test(ip) || /^(172)\.(1[6-9]|2[0-9]|3[0-1])\.(.*)\.(.*)$/.test(ip) || /^(192)\.(168)\.(.*)\.(.*)$/.test(ip);
|
|
153
|
+
}
|
|
154
|
+
// else: ip is IPv6
|
|
155
|
+
const firstWord = ip.split(":").find(el => !!el); // get first not empty word
|
|
156
|
+
// equivalent of 127.0.0.1 in IPv6
|
|
157
|
+
if (ip === "::1")
|
|
158
|
+
return true;
|
|
159
|
+
// The original IPv6 Site Local addresses (fec0::/10) are deprecated. Range: fec0 - feff
|
|
160
|
+
else if (/^fe[c-f][0-f]$/.test(firstWord))
|
|
161
|
+
return true;
|
|
162
|
+
// These days Unique Local Addresses (ULA) are used in place of Site Local.
|
|
163
|
+
// Range: fc00 - fcff
|
|
164
|
+
else if (/^fc[0-f]{2}$/.test(firstWord))
|
|
165
|
+
return true;
|
|
166
|
+
// Range: fd00 - fcff
|
|
167
|
+
else if (/^fd[0-f]{2}$/.test(firstWord))
|
|
168
|
+
return true;
|
|
169
|
+
// Link local addresses (prefixed with fe80) are not routable
|
|
170
|
+
else if (firstWord === "fe80")
|
|
171
|
+
return true;
|
|
172
|
+
// Discard Prefix
|
|
173
|
+
else if (firstWord === "100")
|
|
174
|
+
return true;
|
|
175
|
+
// Any other IP address is not Unique Local Address (ULA)
|
|
176
|
+
return false;
|
|
177
|
+
}
|
|
178
|
+
function isHexStringOfLength(str, length) {
|
|
179
|
+
return (isHexString(str) &&
|
|
180
|
+
((str.startsWith("0x") && str.slice(2).length === length * 2) ||
|
|
181
|
+
str.length === length * 2)) || isWildcard(str);
|
|
182
|
+
}
|
|
183
|
+
function isHexString(str) {
|
|
184
|
+
return (typeof str === "string" &&
|
|
185
|
+
((str.startsWith("0x") && /^[a-fA-F0-9]+$/i.test(str.slice(2))) ||
|
|
186
|
+
/^[a-fA-F0-9]+$/i.test(str))) || isWildcard(str);
|
|
187
|
+
}
|
|
188
|
+
function toHexString(buffer, prefix0x = false) {
|
|
189
|
+
if (buffer instanceof Uint8Array)
|
|
190
|
+
buffer = Buffer.from(buffer);
|
|
191
|
+
return (prefix0x ? "0x" : "") + Array.prototype.map.call(buffer, x => ("00" + x.toString(16)).slice(-2))
|
|
192
|
+
.join("")
|
|
193
|
+
.match(/[a-fA-F0-9]{2}/g)
|
|
194
|
+
.join("");
|
|
195
|
+
}
|
|
196
|
+
function parseURL(url) {
|
|
197
|
+
try {
|
|
198
|
+
const parsedUrl = new URL(url);
|
|
199
|
+
return [
|
|
200
|
+
parsedUrl.protocol + "//",
|
|
201
|
+
parsedUrl.host,
|
|
202
|
+
parsedUrl.pathname.slice(1),
|
|
203
|
+
parsedUrl.search.slice(1),
|
|
204
|
+
];
|
|
205
|
+
}
|
|
206
|
+
catch {
|
|
207
|
+
throw new TypeError(`Invalid URL was provided: ${url}`);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
function showUsage(cmd, module) {
|
|
211
|
+
showUsageHeadline(cmd);
|
|
212
|
+
showUsageOptions({ ...module?.flags });
|
|
213
|
+
showUsageFlags({ ...module?.flags });
|
|
214
|
+
showUsageRouter({ ...module?.router });
|
|
215
|
+
showUsageEnvars({ ...module?.envars });
|
|
216
|
+
}
|
|
217
|
+
function showUsageRouter(router) {
|
|
218
|
+
const cmds = Object.entries(router);
|
|
219
|
+
if (cmds.length > 0) {
|
|
220
|
+
console.info("\nSUBCOMMANDS:");
|
|
221
|
+
const maxLength = Math.max(...cmds.map(([cmd]) => cmd.length));
|
|
222
|
+
cmds.forEach(cmd => {
|
|
223
|
+
console.info(" ", `${cmd[0]}${" ".repeat(maxLength - cmd[0].length)}`, " ", cmd[1].hint);
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
function showUsageError(cmd, subcmd, module, error, flags) {
|
|
228
|
+
showUsageSubcommand(cmd, subcmd, module, error);
|
|
229
|
+
if (error) {
|
|
230
|
+
console.info("\nERROR:");
|
|
231
|
+
if (flags?.debug) {
|
|
232
|
+
console.error(error);
|
|
233
|
+
}
|
|
234
|
+
else {
|
|
235
|
+
console.error(error?.stack?.split("\n")[0] || error);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
function showUsageEnvars(envars) {
|
|
240
|
+
if (envars) {
|
|
241
|
+
envars = Object.entries(envars);
|
|
242
|
+
if (envars.length > 0) {
|
|
243
|
+
console.info("\nENVARS:");
|
|
244
|
+
const maxWidth = Math.max(...envars.map(([envar]) => envar.length));
|
|
245
|
+
envars.forEach(([envar, hint]) => {
|
|
246
|
+
if (envar.toUpperCase().indexOf("KEY") < 0 && process.env[envar]) {
|
|
247
|
+
console.info(" ", `${yellow(envar.toUpperCase())}${" ".repeat(maxWidth - envar.length)}`, ` => Settled to "${myellow(process.env[envar])}"`);
|
|
248
|
+
}
|
|
249
|
+
else {
|
|
250
|
+
console.info(" ", `${yellow(envar.toUpperCase())}${" ".repeat(maxWidth - envar.length)}`, ` ${hint}`);
|
|
251
|
+
}
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
function showUsageFlags(flags) {
|
|
257
|
+
if (flags) {
|
|
258
|
+
flags = Object.entries(flags).filter(([, flag]) => !flag?.param).sort(([a], [b]) => {
|
|
259
|
+
if (a < b)
|
|
260
|
+
return -1;
|
|
261
|
+
else if (a > b)
|
|
262
|
+
return 1;
|
|
263
|
+
else
|
|
264
|
+
return 0;
|
|
265
|
+
});
|
|
266
|
+
if (flags.length > 0) {
|
|
267
|
+
console.info("\nFLAGS:");
|
|
268
|
+
const maxLength = Math.max(...flags.filter(([, { hint }]) => hint).map(([key, { param }]) => param ? key.length + param.length + 3 : key.length));
|
|
269
|
+
flags.forEach(flag => {
|
|
270
|
+
const str = `${flag[0]}${flag[1].param ? gray(` <${flag[1].param}>`) : ""}`;
|
|
271
|
+
if (flag[1].hint) {
|
|
272
|
+
console.info(" ", `--${str}${" ".repeat(maxLength - colorstrip(str).length)}`, " ", flag[1].hint);
|
|
273
|
+
}
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
function showUsageHeadline(cmd, subcmd, module) {
|
|
279
|
+
console.info("USAGE:");
|
|
280
|
+
if (subcmd) {
|
|
281
|
+
let params = module.router[subcmd]?.params;
|
|
282
|
+
// const options = module.router[subcmd]?.options
|
|
283
|
+
if (params) {
|
|
284
|
+
const optionalize = (str) => str.endsWith(" ...]")
|
|
285
|
+
? `[<${str.slice(1, -5)}> ...]`
|
|
286
|
+
: (str[0] === "[" ? `[<${str.slice(1, -1)}>]` : `<${str}>`);
|
|
287
|
+
if (Array.isArray(params)) {
|
|
288
|
+
params = params.map(param => optionalize(param)).join(" ") + " ";
|
|
289
|
+
}
|
|
290
|
+
else {
|
|
291
|
+
params = optionalize(params);
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
console.info(` ${white(`npx witnet ${cmd}`)} ${white(subcmd)} ${params ? green(params) + " " : ""}[OPTIONS] [FLAGS]`);
|
|
295
|
+
if (module?.router[subcmd]?.hint) {
|
|
296
|
+
console.info("\nDESCRIPTION:");
|
|
297
|
+
console.info(` ${module.router[subcmd].hint}`);
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
else {
|
|
301
|
+
console.info(` ${white(`npx witnet ${cmd}`)} <SUBCOMMAND> ... [OPTIONS] [FLAGS]`);
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
function showUsageOptions(options) {
|
|
305
|
+
options = Object.entries(options).filter(([, option]) => option?.param).sort(([a], [b]) => {
|
|
306
|
+
if (a < b)
|
|
307
|
+
return -1;
|
|
308
|
+
else if (a > b)
|
|
309
|
+
return 1;
|
|
310
|
+
else
|
|
311
|
+
return 0;
|
|
312
|
+
});
|
|
313
|
+
if (options.length > 0) {
|
|
314
|
+
console.info("\nOPTIONS:");
|
|
315
|
+
const maxLength = options
|
|
316
|
+
.map(option => option[1].param ? option[1].param.length + option[0].length + 3 : option[0].length)
|
|
317
|
+
.reduce((prev, curr) => curr > prev ? curr : prev);
|
|
318
|
+
options.forEach(option => {
|
|
319
|
+
if (option[1].hint) {
|
|
320
|
+
const str = `${option[0]}${option[1].param ? gray(` <${option[1].param}>`) : ""}`;
|
|
321
|
+
console.info(" ", `--${str}${" ".repeat(maxLength - colorstrip(str).length)}`, " ", option[1].hint);
|
|
322
|
+
}
|
|
323
|
+
});
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
function showUsageSubcommand(cmd, subcmd, module) {
|
|
327
|
+
showUsageHeadline(cmd, subcmd, module);
|
|
328
|
+
showUsageOptions({ ...module?.flags, ...module.router[subcmd]?.options });
|
|
329
|
+
showUsageFlags({ ...module?.flags, ...module.router[subcmd]?.options });
|
|
330
|
+
showUsageEnvars(module.router[subcmd]?.envars || module?.envars);
|
|
331
|
+
}
|
|
332
|
+
function showVersion() {
|
|
333
|
+
console.info(`${mcyan(`Witnet SDK v${require("../../package.json").version}`)}`);
|
|
334
|
+
}
|
|
335
|
+
function getWildcardsCountFromString(str) {
|
|
336
|
+
let maxArgsIndex = 0;
|
|
337
|
+
if (str) {
|
|
338
|
+
let match;
|
|
339
|
+
const regexp = /\\\d\\/g;
|
|
340
|
+
while ((match = regexp.exec(str)) !== null) {
|
|
341
|
+
const argsIndex = parseInt(match[0][1]) + 1;
|
|
342
|
+
if (argsIndex > maxArgsIndex)
|
|
343
|
+
maxArgsIndex = argsIndex;
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
return maxArgsIndex;
|
|
347
|
+
}
|
|
348
|
+
function checkRpcWildcards(wildcards) {
|
|
349
|
+
if (typeof wildcards === "object") {
|
|
350
|
+
Object.values(wildcards).forEach(wildcard => {
|
|
351
|
+
if (Array.isArray(wildcard))
|
|
352
|
+
wildcard.forEach(item => checkRpcWildcards(item));
|
|
353
|
+
else
|
|
354
|
+
checkRpcWildcards(wildcard);
|
|
355
|
+
});
|
|
356
|
+
}
|
|
357
|
+
else if (Array.isArray(wildcards)) {
|
|
358
|
+
wildcards.forEach(wildcard => checkRpcWildcards(wildcard));
|
|
359
|
+
}
|
|
360
|
+
else if (typeof wildcards === "string") {
|
|
361
|
+
if (isWildcard(wildcards)) {
|
|
362
|
+
const char = wildcards.charAt(1);
|
|
363
|
+
if (char < "1" || char > "9") {
|
|
364
|
+
throw Error("RPC: wildcards not in range [1 .. 9]");
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
function isWildcard(str) {
|
|
370
|
+
return str.length === 3 && /\\\d\\/g.test(str);
|
|
371
|
+
}
|
|
372
|
+
function replaceWildcards(obj, args) {
|
|
373
|
+
if (args.length > 10)
|
|
374
|
+
args = args.slice(0, 10);
|
|
375
|
+
if (obj && typeof obj === "string") {
|
|
376
|
+
for (let argIndex = 0; argIndex < args.length; argIndex++) {
|
|
377
|
+
const wildcard = `\\${argIndex}\\`;
|
|
378
|
+
obj = obj.replaceAll(wildcard, args[argIndex]);
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
else if (obj && Array.isArray(obj)) {
|
|
382
|
+
obj = obj.map(value => typeof value === "string" || Array.isArray(value)
|
|
383
|
+
? replaceWildcards(value, args)
|
|
384
|
+
: value);
|
|
385
|
+
}
|
|
386
|
+
return obj;
|
|
387
|
+
}
|
|
388
|
+
function spliceWildcard(obj, argIndex, argValue, argsCount) {
|
|
389
|
+
if (obj && typeof obj === "string") {
|
|
390
|
+
const wildcard = `\\${argIndex}\\`;
|
|
391
|
+
obj = obj.replaceAll(wildcard, argValue);
|
|
392
|
+
for (let j = argIndex + 1; j < argsCount; j++) {
|
|
393
|
+
obj = obj.replaceAll(`\\${j}\\`, `\\${j - 1}\\`);
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
else if (obj && Array.isArray(obj)) {
|
|
397
|
+
obj = obj.map(value => typeof value === "string" || Array.isArray(value)
|
|
398
|
+
? spliceWildcard(value, argIndex, argValue, argsCount)
|
|
399
|
+
: value);
|
|
400
|
+
}
|
|
401
|
+
return obj;
|
|
402
|
+
}
|
|
403
|
+
async function toolkitRun(settings, args) {
|
|
404
|
+
const cmd = `${settings.paths.toolkitBinPath} ${args.join(" ")}`;
|
|
405
|
+
return new Promise((resolve, reject) => {
|
|
406
|
+
exec(cmd, { maxBuffer: 1024 * 1024 * 10 }, (error, stdout, stderr) => {
|
|
407
|
+
if (error) {
|
|
408
|
+
reject(error);
|
|
409
|
+
}
|
|
410
|
+
if (stderr) {
|
|
411
|
+
reject(stderr);
|
|
412
|
+
}
|
|
413
|
+
resolve(stdout);
|
|
414
|
+
});
|
|
415
|
+
});
|
|
416
|
+
}
|
|
417
|
+
function toUpperCamelCase(str) {
|
|
418
|
+
return str.replace(/\b(\w)/g, function (match, capture) {
|
|
419
|
+
return capture.toUpperCase();
|
|
420
|
+
}).replace(/\s+/g, "");
|
|
421
|
+
}
|
|
422
|
+
function toUtf8Array(str) {
|
|
423
|
+
const utf8 = [];
|
|
424
|
+
for (let i = 0; i < str.length; i++) {
|
|
425
|
+
let charcode = str.charCodeAt(i);
|
|
426
|
+
if (charcode < 0x80)
|
|
427
|
+
utf8.push(charcode);
|
|
428
|
+
else if (charcode < 0x800) {
|
|
429
|
+
utf8.push(0xc0 | (charcode >> 6), 0x80 | (charcode & 0x3f));
|
|
430
|
+
}
|
|
431
|
+
else if (charcode < 0xd800 || charcode >= 0xe000) {
|
|
432
|
+
utf8.push(0xe0 | (charcode >> 12), 0x80 | ((charcode >> 6) & 0x3f), 0x80 | (charcode & 0x3f));
|
|
433
|
+
}
|
|
434
|
+
else { // surrogate pair
|
|
435
|
+
i++;
|
|
436
|
+
// UTF-16 encodes 0x10000-0x10FFFF by
|
|
437
|
+
// subtracting 0x10000 and splitting the
|
|
438
|
+
// 20 bits of 0x0-0xFFFFF into two halves
|
|
439
|
+
charcode = 0x10000 + (((charcode & 0x3ff) << 10) |
|
|
440
|
+
(str.charCodeAt(i) & 0x3ff));
|
|
441
|
+
utf8.push(0xf0 | (charcode >> 18), 0x80 | ((charcode >> 12) & 0x3f), 0x80 | ((charcode >> 6) & 0x3f), 0x80 | (charcode & 0x3f));
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
return utf8;
|
|
445
|
+
}
|
|
446
|
+
function utf8ArrayToStr(array) {
|
|
447
|
+
const len = array.length;
|
|
448
|
+
let out = "";
|
|
449
|
+
let i = 0;
|
|
450
|
+
let c;
|
|
451
|
+
let char2, char3;
|
|
452
|
+
while (i < len) {
|
|
453
|
+
c = array[i++];
|
|
454
|
+
switch (c >> 4) {
|
|
455
|
+
case 0:
|
|
456
|
+
case 1:
|
|
457
|
+
case 2:
|
|
458
|
+
case 3:
|
|
459
|
+
case 4:
|
|
460
|
+
case 5:
|
|
461
|
+
case 6:
|
|
462
|
+
case 7:
|
|
463
|
+
// 0xxxxxxx
|
|
464
|
+
out += String.fromCharCode(c);
|
|
465
|
+
break;
|
|
466
|
+
case 12:
|
|
467
|
+
case 13:
|
|
468
|
+
// 110x xxxx 10xx xxxx
|
|
469
|
+
char2 = array[i++];
|
|
470
|
+
out += String.fromCharCode(((c & 0x1F) << 6) | (char2 & 0x3F));
|
|
471
|
+
break;
|
|
472
|
+
case 14:
|
|
473
|
+
// 1110 xxxx 10xx xxxx 10xx xxxx
|
|
474
|
+
char2 = array[i++];
|
|
475
|
+
char3 = array[i++];
|
|
476
|
+
out += String.fromCharCode(((c & 0x0F) << 12) |
|
|
477
|
+
((char2 & 0x3F) << 6) |
|
|
478
|
+
((char3 & 0x3F) << 0));
|
|
479
|
+
break;
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
return out;
|
|
483
|
+
}
|
|
484
|
+
async function prompt(question) {
|
|
485
|
+
const readlineInterface = readline.createInterface({
|
|
486
|
+
input: process.stdin,
|
|
487
|
+
output: process.stdout,
|
|
488
|
+
});
|
|
489
|
+
return new Promise((resolve, reject) => {
|
|
490
|
+
readlineInterface.question(`${question} `, (response) => {
|
|
491
|
+
readlineInterface.close();
|
|
492
|
+
resolve(response.trim());
|
|
493
|
+
});
|
|
494
|
+
});
|
|
495
|
+
}
|
|
496
|
+
async function prompter(promise) {
|
|
497
|
+
const loading = (() => {
|
|
498
|
+
const h = ["|", "/", "-", "\\"];
|
|
499
|
+
let i = 0;
|
|
500
|
+
return setInterval(() => {
|
|
501
|
+
i = (i > 3) ? 0 : i;
|
|
502
|
+
process.stdout.write(`\b\b${h[i]} `);
|
|
503
|
+
i++;
|
|
504
|
+
}, 50);
|
|
505
|
+
})();
|
|
506
|
+
return promise
|
|
507
|
+
.then(result => {
|
|
508
|
+
clearInterval(loading);
|
|
509
|
+
process.stdout.write("\b\b");
|
|
510
|
+
return result;
|
|
511
|
+
});
|
|
512
|
+
}
|
|
513
|
+
function traceChecklists(checklists) {
|
|
514
|
+
if (checklists && Object.keys(checklists).length > 0) {
|
|
515
|
+
const headlines = ["NODES", ...Object.keys(checklists).map(key => `:${key}`)];
|
|
516
|
+
checklists = Object.values(checklists);
|
|
517
|
+
const urls = Object.keys(checklists[0]);
|
|
518
|
+
const records = urls.map(url => {
|
|
519
|
+
const errors = checklists.filter(checklist => checklist[url] instanceof Error).length;
|
|
520
|
+
return [
|
|
521
|
+
errors === checklists.length ? red(url) : (errors > 0 ? myellow(url) : mcyan(url)),
|
|
522
|
+
...checklists.map(checklist => checklist[url] instanceof Error
|
|
523
|
+
? red(checklist[url])
|
|
524
|
+
: (checklist[url] === true ? lcyan("Aye") : cyan("Nay"))),
|
|
525
|
+
];
|
|
526
|
+
});
|
|
527
|
+
traceTable(records, {
|
|
528
|
+
headlines,
|
|
529
|
+
maxColumnWidth: 31,
|
|
530
|
+
});
|
|
531
|
+
}
|
|
532
|
+
}
|
|
533
|
+
function traceHeader(headline, color = normal, indent = "") {
|
|
534
|
+
console.info(`${indent}┌─${"─".repeat(headline.length)}─┐`);
|
|
535
|
+
console.info(`${indent}│ ${color(headline)} │`);
|
|
536
|
+
console.info(`${indent}└─${"─".repeat(headline.length)}─┘`);
|
|
537
|
+
}
|
|
538
|
+
function traceTable(records, options) {
|
|
539
|
+
const stringify = (data, humanizers, index) => humanizers && humanizers[index] ? humanizers[index](data).toString() : data?.toString() ?? "";
|
|
540
|
+
const max = (a, b) => a > b ? a : b;
|
|
541
|
+
const reduceMax = (numbers) => numbers.reduce((curr, prev) => prev > curr ? prev : curr, 0);
|
|
542
|
+
if (!options)
|
|
543
|
+
options = {};
|
|
544
|
+
const indent = options?.indent || "";
|
|
545
|
+
const numColumns = reduceMax(records.map(record => record?.length || 1));
|
|
546
|
+
const maxColumnWidth = options?.maxColumnWidth || 80;
|
|
547
|
+
const table = transpose(records, numColumns);
|
|
548
|
+
options.widths = options?.widths || table.map((column, index) => {
|
|
549
|
+
let maxWidth = reduceMax(column.map(field => colorstrip(stringify(field, options?.humanizers, index)).length));
|
|
550
|
+
if (options?.headlines && options.headlines[index]) {
|
|
551
|
+
maxWidth = max(maxWidth, colorstrip(options.headlines[index].replaceAll(":", "")).length);
|
|
552
|
+
}
|
|
553
|
+
return Math.min(maxWidth, maxColumnWidth);
|
|
554
|
+
});
|
|
555
|
+
let headline = options.widths.map(maxWidth => "─".repeat(maxWidth));
|
|
556
|
+
console.info(`${indent}┌─${headline.join("─┬─")}─┐`);
|
|
557
|
+
if (options?.headlines) {
|
|
558
|
+
headline = options.widths.map((maxWidth, index) => {
|
|
559
|
+
const caption = options.headlines[index].replaceAll(":", "");
|
|
560
|
+
const captionLength = colorstrip(caption).length;
|
|
561
|
+
return `${white(caption)}${" ".repeat(maxWidth - captionLength)}`;
|
|
562
|
+
});
|
|
563
|
+
console.info(`${indent}│ ${headline.join(" │ ")} │`);
|
|
564
|
+
headline = options.widths.map(maxWidth => "─".repeat(maxWidth));
|
|
565
|
+
console.info(`${indent}├─${headline.join("─┼─")}─┤`);
|
|
566
|
+
}
|
|
567
|
+
for (let i = 0; i < records.length; i++) {
|
|
568
|
+
let line = "";
|
|
569
|
+
for (let j = 0; j < numColumns; j++) {
|
|
570
|
+
let data = table[j][i];
|
|
571
|
+
let color;
|
|
572
|
+
if (options?.colors && options.colors[j]) {
|
|
573
|
+
color = options.colors[j];
|
|
574
|
+
}
|
|
575
|
+
else {
|
|
576
|
+
color = typeof data === "string"
|
|
577
|
+
? green
|
|
578
|
+
: (Number(data) === data && data % 1 !== 0 // is float number?
|
|
579
|
+
? yellow
|
|
580
|
+
: (x) => x);
|
|
581
|
+
}
|
|
582
|
+
data = stringify(data, options?.humanizers, j);
|
|
583
|
+
if (colorstrip(data).length > maxColumnWidth) {
|
|
584
|
+
while (colorstrip(data).length > maxColumnWidth - 3) {
|
|
585
|
+
data = data.slice(0, -1);
|
|
586
|
+
}
|
|
587
|
+
data += "...";
|
|
588
|
+
}
|
|
589
|
+
const dataLength = colorstrip(data).length;
|
|
590
|
+
if (options?.headlines && options.headlines[j][0] === ":") {
|
|
591
|
+
data = `${color(data)}${" ".repeat(options.widths[j] - dataLength)}`;
|
|
592
|
+
}
|
|
593
|
+
else {
|
|
594
|
+
data = `${" ".repeat(options.widths[j] - dataLength)}${color(data)}`;
|
|
595
|
+
}
|
|
596
|
+
line += `│ ${data} `;
|
|
597
|
+
}
|
|
598
|
+
console.info(`${indent}${line}│`);
|
|
599
|
+
}
|
|
600
|
+
headline = options.widths.map(maxWidth => "─".repeat(maxWidth));
|
|
601
|
+
console.info(`${indent}└─${headline.join("─┴─")}─┘`);
|
|
602
|
+
}
|
|
603
|
+
function transpose(records, numColumns) {
|
|
604
|
+
const columns = [];
|
|
605
|
+
for (let index = 0; index < numColumns; index++) {
|
|
606
|
+
columns.push(records.map(row => row[index]));
|
|
607
|
+
}
|
|
608
|
+
return columns;
|
|
609
|
+
}
|
|
610
|
+
function txJsonReplacer(key, value) {
|
|
611
|
+
switch (key) {
|
|
612
|
+
case "bytes":
|
|
613
|
+
case "der":
|
|
614
|
+
return toHexString(value, true);
|
|
615
|
+
case "tx":
|
|
616
|
+
return JSON.stringify(value, txJsonReplacer);
|
|
617
|
+
case "change":
|
|
618
|
+
case "fees":
|
|
619
|
+
case "value":
|
|
620
|
+
return parseInt(value) / 10 ** 9;
|
|
621
|
+
default:
|
|
622
|
+
return value;
|
|
623
|
+
}
|
|
624
|
+
}
|
|
625
|
+
function txReceiptJsonReplacer(key, value) {
|
|
626
|
+
switch (key) {
|
|
627
|
+
case "bytes":
|
|
628
|
+
case "der":
|
|
629
|
+
return toHexString(value, true);
|
|
630
|
+
case "tx":
|
|
631
|
+
return JSON.stringify(value, txJsonReplacer);
|
|
632
|
+
case "change":
|
|
633
|
+
case "fees":
|
|
634
|
+
case "value":
|
|
635
|
+
return parseInt(value?.pedros) / 10 ** 9;
|
|
636
|
+
case "timestamp":
|
|
637
|
+
return moment.unix(value).format("MMMM Do YYYY, h:mm:ss a");
|
|
638
|
+
default:
|
|
639
|
+
return value;
|
|
640
|
+
}
|
|
641
|
+
}
|
|
642
|
+
function traceTransactionOnCheckpoint(receipt) {
|
|
643
|
+
if (receipt?.confirmations) {
|
|
644
|
+
console.info(` > Checkpoint #${commas(receipt.confirmations)}...`);
|
|
645
|
+
}
|
|
646
|
+
}
|
|
647
|
+
function traceTransactionOnStatusChange(receipt) {
|
|
648
|
+
const captions = {
|
|
649
|
+
pending: "Awaiting relay...",
|
|
650
|
+
// confirmed: "Transaction confirmed:",
|
|
651
|
+
// finalized: "Transaction finalized:",
|
|
652
|
+
relayed: "Awaiting inclusion...",
|
|
653
|
+
mined: "Awaiting confirmations...",
|
|
654
|
+
};
|
|
655
|
+
const caption = captions[receipt.status];
|
|
656
|
+
if (caption)
|
|
657
|
+
console.info(` > ${captions[receipt.status]}`);
|
|
658
|
+
if (["finalized", "confirmed"].includes(receipt.status)) {
|
|
659
|
+
console.info(` > Block hash: ${gray(receipt?.blockHash)}`);
|
|
660
|
+
console.info(` > Block miner: ${cyan(receipt?.blockMiner)}`);
|
|
661
|
+
console.info(` > Block epoch: ${white(commas(receipt?.blockEpoch))}`);
|
|
662
|
+
console.info(` > Included at: ${green(moment.unix(receipt?.blockTimestamp).format("MMMM Do YYYY, h:mm:ss a"))}`);
|
|
663
|
+
console.info(` > ${receipt.status[0].toUpperCase() + receipt.status.slice(1)} at: ${mgreen(moment.unix(receipt.timestamp).format("MMMM Do YYYY, h:mm:ss a"))}`);
|
|
664
|
+
}
|
|
665
|
+
}
|
|
666
|
+
function traceTransactionReceipt(receipt) {
|
|
667
|
+
const captions = {
|
|
668
|
+
DataRequest: " > DRT hash: ",
|
|
669
|
+
ValueTransfer: " > VTT hash: ",
|
|
670
|
+
};
|
|
671
|
+
console.info(`${captions[receipt.type] || " > TX hash: "}${white(receipt.hash)}`);
|
|
672
|
+
if (receipt?.droHash)
|
|
673
|
+
console.info(` > DRO hash: ${green(receipt.droHash)}`);
|
|
674
|
+
if (receipt?.radHash)
|
|
675
|
+
console.info(` > RAD hash: ${mgreen(receipt.radHash)}`);
|
|
676
|
+
if (receipt?.droSLA)
|
|
677
|
+
console.info(` > SLA params: ${JSON.stringify(receipt.droSLA)}`);
|
|
678
|
+
if (receipt?.withdrawer) {
|
|
679
|
+
if (receipt?.validator) {
|
|
680
|
+
console.info(` > Validator: ${mcyan(receipt.validator)}`);
|
|
681
|
+
}
|
|
682
|
+
console.info(` > Withdrawer: ${mmagenta(receipt.withdrawer)}`);
|
|
683
|
+
}
|
|
684
|
+
else {
|
|
685
|
+
const signers = Array.isArray(receipt.from) ? receipt.from : [receipt.from];
|
|
686
|
+
console.info(` > Signer/s: ${mmagenta(signers[0])}`);
|
|
687
|
+
signers.slice(1).forEach(signer => {
|
|
688
|
+
console.info(` ${mmagenta(signer)}`);
|
|
689
|
+
});
|
|
690
|
+
}
|
|
691
|
+
if (receipt?.recipients) {
|
|
692
|
+
console.info(` > Recipient/s: ${mblue(receipt.recipients.filter((pkh, index, array) => index === array.indexOf(pkh)))}`);
|
|
693
|
+
}
|
|
694
|
+
if (receipt?.fees)
|
|
695
|
+
console.info(` > Fee: ${yellow(receipt.fees.toString(2))}`);
|
|
696
|
+
if (receipt?.value)
|
|
697
|
+
console.info(` > Value: ${myellow(receipt.value.toString(2))}`);
|
|
698
|
+
if (receipt?.weight)
|
|
699
|
+
console.info(` > Weight: ${mgreen(commas(receipt.weight))}`);
|
|
700
|
+
if (receipt?.witnesses) {
|
|
701
|
+
console.info(` > Witnesses: ${receipt.witnesses}`);
|
|
702
|
+
}
|
|
703
|
+
}
|
|
704
|
+
async function traceTransaction(transmitter, options) {
|
|
705
|
+
const color = options?.color || ((x) => `\x1b[30;45m${x}\x1b[0m`);
|
|
706
|
+
let receipt = await transmitter.signTransaction(options, options?.reload);
|
|
707
|
+
if (options?.verbose) {
|
|
708
|
+
console.info(`\n${gray(JSON.stringify(receipt.tx, txJsonReplacer))}`);
|
|
709
|
+
}
|
|
710
|
+
if (options?.headline) {
|
|
711
|
+
console.info(`\n ${color(` ${options.headline} `)}\n`);
|
|
712
|
+
}
|
|
713
|
+
traceTransactionReceipt(receipt);
|
|
714
|
+
if (!options?.force) {
|
|
715
|
+
// prompt user confirmation
|
|
716
|
+
console.info();
|
|
717
|
+
const answer = await require("inquirer").createPromptModule()([{
|
|
718
|
+
message: "Send transaction?",
|
|
719
|
+
type: "confirm",
|
|
720
|
+
name: "continue",
|
|
721
|
+
default: false,
|
|
722
|
+
}]);
|
|
723
|
+
if (!answer.continue) {
|
|
724
|
+
return receipt;
|
|
725
|
+
}
|
|
726
|
+
}
|
|
727
|
+
try {
|
|
728
|
+
console.info();
|
|
729
|
+
receipt = await transmitter.sendTransaction();
|
|
730
|
+
if (options?.await || options?.confirmations !== undefined) {
|
|
731
|
+
receipt = await transmitter.confirmTransaction(receipt.hash, {
|
|
732
|
+
confirmations: options?.confirmations || 0,
|
|
733
|
+
onCheckpoint: traceTransactionOnCheckpoint,
|
|
734
|
+
onStatusChange: traceTransactionOnStatusChange,
|
|
735
|
+
});
|
|
736
|
+
}
|
|
737
|
+
else {
|
|
738
|
+
const data = { status: receipt?.status, timestamp: receipt?.timestamp || Math.floor(Date.now() / 1000) };
|
|
739
|
+
console.info(data);
|
|
740
|
+
}
|
|
741
|
+
}
|
|
742
|
+
catch (err) {
|
|
743
|
+
if (err?.inFlight && err.inFlight) {
|
|
744
|
+
console.info(`\n${gray(JSON.stringify(err.inFligt?.message, txReceiptJsonReplacer))}`);
|
|
745
|
+
}
|
|
746
|
+
throw err;
|
|
747
|
+
}
|
|
748
|
+
return receipt;
|
|
749
|
+
}
|
|
750
|
+
module.exports = {
|
|
751
|
+
colors: {
|
|
752
|
+
bblue,
|
|
753
|
+
bcyan,
|
|
754
|
+
bgreen,
|
|
755
|
+
blue,
|
|
756
|
+
bred,
|
|
757
|
+
bviolet,
|
|
758
|
+
cyan,
|
|
759
|
+
gray,
|
|
760
|
+
green,
|
|
761
|
+
magenta,
|
|
762
|
+
red,
|
|
763
|
+
white,
|
|
764
|
+
yellow,
|
|
765
|
+
normal,
|
|
766
|
+
lcyan,
|
|
767
|
+
lgray,
|
|
768
|
+
lgreen,
|
|
769
|
+
lmagenta,
|
|
770
|
+
lyellow,
|
|
771
|
+
mblue,
|
|
772
|
+
mcyan,
|
|
773
|
+
mgreen,
|
|
774
|
+
mmagenta,
|
|
775
|
+
mred,
|
|
776
|
+
myellow,
|
|
777
|
+
},
|
|
778
|
+
colorstrip,
|
|
779
|
+
commas,
|
|
780
|
+
whole_wits,
|
|
781
|
+
toFixedTrunc,
|
|
782
|
+
countLeaves,
|
|
783
|
+
execRadonBytecode,
|
|
784
|
+
deleteExtraFlags,
|
|
785
|
+
extractFromArgs,
|
|
786
|
+
fromHexString,
|
|
787
|
+
isHexString,
|
|
788
|
+
isHexStringOfLength,
|
|
789
|
+
toHexString,
|
|
790
|
+
parseURL,
|
|
791
|
+
ipIsPrivateOrLocalhost,
|
|
792
|
+
showUsage,
|
|
793
|
+
showUsageError,
|
|
794
|
+
showUsageSubcommand,
|
|
795
|
+
showVersion,
|
|
796
|
+
toolkitRun,
|
|
797
|
+
toUpperCamelCase,
|
|
798
|
+
toUtf8Array,
|
|
799
|
+
utf8ArrayToStr,
|
|
800
|
+
prompt,
|
|
801
|
+
prompter,
|
|
802
|
+
traceChecklists,
|
|
803
|
+
traceHeader,
|
|
804
|
+
traceTable,
|
|
805
|
+
traceTransaction,
|
|
806
|
+
traceTransactionOnStatusChange,
|
|
807
|
+
traceTransactionOnCheckpoint,
|
|
808
|
+
traceTransactionReceipt,
|
|
809
|
+
checkRpcWildcards,
|
|
810
|
+
isWildcard,
|
|
811
|
+
getWildcardsCountFromString,
|
|
812
|
+
replaceWildcards,
|
|
813
|
+
spliceWildcard,
|
|
814
|
+
txJsonReplacer,
|
|
815
|
+
};
|
|
816
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9iaW4vaGVscGVycy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQTtBQUN6QyxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUE7QUFDaEMsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFBO0FBQzFCLE1BQU0sRUFBRSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQTtBQUN4QixNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUE7QUFFcEMsTUFBTSxVQUFVLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQ3JDLDZFQUE2RSxFQUFFLEVBQUUsQ0FDbEYsQ0FBQTtBQUVELE1BQU0sTUFBTSxHQUFHLENBQUMsTUFBTSxFQUFFLEVBQUU7SUFDeEIsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUMxQyxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxJQUFJLENBQUM7UUFDOUIsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyx1QkFBdUIsRUFBRSxHQUFHLENBQUMsRUFBRTtRQUNyRCxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLHVCQUF1QixFQUFFLEdBQUcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFBO0lBQ25FLE9BQU8sTUFBTSxDQUFBO0FBQ2YsQ0FBQyxDQUFBO0FBRUQsU0FBUyxZQUFZLENBQUUsQ0FBQyxFQUFFLENBQUM7SUFDekIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBQy9ELElBQUksQ0FBQyxJQUFJLENBQUM7UUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUN2QixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFBO0lBQ2xCLElBQUksQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDO1FBQUUsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFBO0lBQ3BELE9BQU8sQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDO1FBQUUsQ0FBQyxJQUFJLEdBQUcsQ0FBQTtJQUM3QixPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFBO0FBQ3ZCLENBQUM7QUFBQSxDQUFDO0FBRUYsTUFBTSxVQUFVLEdBQUcsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLEVBQUU7SUFDcEMsTUFBTSxNQUFNLEdBQUc7UUFDYixFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRTtRQUMvQixFQUFFLEtBQUssRUFBRSxHQUFHLElBQUksRUFBRSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUU7UUFDckMsRUFBRSxLQUFLLEVBQUUsR0FBRyxJQUFJLEVBQUUsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFO1FBQ3JDLEVBQUUsS0FBSyxFQUFFLEdBQUcsSUFBSSxHQUFHLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRTtRQUN0QyxFQUFFLEtBQUssRUFBRSxHQUFHLElBQUksR0FBRyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUU7S0FDdkMsQ0FBQTtJQUNELHlDQUF5QztJQUN6QyxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUMxRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUE7SUFDL0UsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUE7SUFDOUcsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLFFBQVEsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFBO0FBQzVILENBQUMsQ0FBQTtBQUVELE1BQU0sS0FBSyxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxnQkFBZ0IsR0FBRyxhQUFhLENBQUE7QUFDdkQsTUFBTSxLQUFLLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLGNBQWMsR0FBRyxXQUFXLENBQUE7QUFDbkQsTUFBTSxNQUFNLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLGNBQWMsR0FBRyxXQUFXLENBQUE7QUFDcEQsTUFBTSxJQUFJLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLGNBQWMsR0FBRyxXQUFXLENBQUE7QUFDbEQsTUFBTSxPQUFPLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLGNBQWMsR0FBRyxXQUFXLENBQUE7QUFFckQsTUFBTSxLQUFLLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLGFBQWEsR0FBRyxTQUFTLENBQUE7QUFDaEQsTUFBTSxLQUFLLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLGFBQWEsR0FBRyxTQUFTLENBQUE7QUFDaEQsTUFBTSxNQUFNLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLGFBQWEsR0FBRyxTQUFTLENBQUE7QUFDakQsTUFBTSxRQUFRLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLGFBQWEsR0FBRyxTQUFTLENBQUE7QUFDbkQsTUFBTSxPQUFPLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLGFBQWEsR0FBRyxTQUFTLENBQUE7QUFDbEQsTUFBTSxLQUFLLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLFdBQVcsR0FBRyxTQUFTLENBQUE7QUFDOUMsTUFBTSxLQUFLLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLFdBQVcsR0FBRyxTQUFTLENBQUE7QUFDOUMsTUFBTSxNQUFNLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLFdBQVcsR0FBRyxTQUFTLENBQUE7QUFDL0MsTUFBTSxRQUFRLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLGFBQWEsR0FBRyxTQUFTLENBQUE7QUFDbkQsTUFBTSxJQUFJLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLFdBQVcsR0FBRyxTQUFTLENBQUE7QUFDN0MsTUFBTSxPQUFPLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLFdBQVcsR0FBRyxTQUFTLENBQUE7QUFFaEQsTUFBTSxJQUFJLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLFdBQVcsR0FBRyxTQUFTLENBQUE7QUFDN0MsTUFBTSxJQUFJLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLFdBQVcsR0FBRyxTQUFTLENBQUE7QUFDN0MsTUFBTSxJQUFJLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLFdBQVcsR0FBRyxTQUFTLENBQUE7QUFDN0MsTUFBTSxLQUFLLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLFdBQVcsR0FBRyxTQUFTLENBQUE7QUFDOUMsTUFBTSxPQUFPLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLGFBQWEsR0FBRyxTQUFTLENBQUE7QUFDbEQsTUFBTSxNQUFNLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLFdBQVcsR0FBRyxTQUFTLENBQUE7QUFDL0MsTUFBTSxHQUFHLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLFdBQVcsR0FBRyxTQUFTLENBQUE7QUFDNUMsTUFBTSxLQUFLLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLGFBQWEsR0FBRyxTQUFTLENBQUE7QUFDaEQsTUFBTSxNQUFNLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLFdBQVcsR0FBRyxTQUFTLENBQUE7QUFFL0MsU0FBUyxXQUFXLENBQUUsQ0FBQyxFQUFFLEdBQUc7SUFDMUIsSUFBSSxDQUFDLEdBQUcsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRO1FBQUUsT0FBTyxDQUFDLENBQUE7SUFDN0MsSUFBSSxHQUFHLFlBQVksQ0FBQztRQUFFLE9BQU8sQ0FBQyxDQUFBO0lBQzlCLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUM7UUFBRSxPQUFPLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUcsV0FBVyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQTs7UUFDbEYsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLEdBQUcs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QVU7SUFDVixNQUFNO0lBQ04sVUFBVTtJQUNWLFlBQVk7SUFDWixXQUFXO0lBQ1gsaUJBQWlCO0lBQ2pCLGdCQUFnQjtJQUNoQixlQUFlO0lBQ2YsYUFBYTtJQUNiLFdBQVc7SUFDWCxtQkFBbUI7SUFDbkIsV0FBVztJQUNYLFFBQVE7SUFDUixzQkFBc0I7SUFDdEIsU0FBUztJQUNULGNBQWM7SUFDZCxtQkFBbUI7SUFDbkIsV0FBVztJQUNYLFVBQVU7SUFDVixnQkFBZ0I7SUFDaEIsV0FBVztJQUNYLGNBQWM7SUFDZCxNQUFNO0lBQ04sUUFBUTtJQUNSLGVBQWU7SUFDZixXQUFXO0lBQ1gsVUFBVTtJQUNWLGdCQUFnQjtJQUNoQiw4QkFBOEI7SUFDOUIsNEJBQTRCO0lBQzVCLHVCQUF1QjtJQUN2QixpQkFBaUI7SUFDakIsVUFBVTtJQUNWLDJCQUEyQjtJQUMzQixnQkFBZ0I7SUFDaEIsY0FBYztJQUNkLGNBQWM7Q0FDZixDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgeyBleGVjIH0gPSByZXF1aXJlKFwiY2hpbGRfcHJvY2Vzc1wiKVxyXG5jb25zdCBtb21lbnQgPSByZXF1aXJlKFwibW9tZW50XCIpXHJcbmNvbnN0IG5ldCA9IHJlcXVpcmUoXCJuZXRcIilcclxuY29uc3Qgb3MgPSByZXF1aXJlKFwib3NcIilcclxuY29uc3QgcmVhZGxpbmUgPSByZXF1aXJlKFwicmVhZGxpbmVcIilcclxuXHJcbmNvbnN0IGNvbG9yc3RyaXAgPSAoc3RyKSA9PiBzdHIucmVwbGFjZShcclxuICAvW1xcdTAwMWJcXHUwMDliXVtbKCkjOz9dKig/OlswLTldezEsNH0oPzo7WzAtOV17MCw0fSkqKT9bMC05QS1PUlpjZi1ucXJ5PT48XS9nLCBcIlwiXHJcbilcclxuXHJcbmNvbnN0IGNvbW1hcyA9IChudW1iZXIpID0+IHtcclxuICBjb25zdCBwYXJ0cyA9IG51bWJlci50b1N0cmluZygpLnNwbGl0KFwiLlwiKVxyXG4gIGNvbnN0IHJlc3VsdCA9IHBhcnRzLmxlbmd0aCA8PSAxXHJcbiAgICA/IGAke3BhcnRzWzBdLnJlcGxhY2UoL1xcQig/PShcXGR7M30pKyg/IVxcZCkpL2csIFwiLFwiKX1gXHJcbiAgICA6IGAke3BhcnRzWzBdLnJlcGxhY2UoL1xcQig/PShcXGR7M30pKyg/IVxcZCkpL2csIFwiLFwiKX0uJHtwYXJ0c1sxXX1gXHJcbiAgcmV0dXJuIHJlc3VsdFxyXG59XHJcblxyXG5mdW5jdGlvbiB0b0ZpeGVkVHJ1bmMgKHgsIG4pIHtcclxuICBjb25zdCB2ID0gKHR5cGVvZiB4ID09PSBcInN0cmluZ1wiID8geCA6IHgudG9TdHJpbmcoKSkuc3BsaXQoXCIuXCIpXHJcbiAgaWYgKG4gPD0gMCkgcmV0dXJuIHZbMF1cclxuICBsZXQgZiA9IHZbMV0gfHwgXCJcIlxyXG4gIGlmIChmLmxlbmd0aCA+IG4pIHJldHVybiBgJHt2WzBdfS4ke2Yuc3Vic3RyKDAsIG4pfWBcclxuICB3aGlsZSAoZi5sZW5ndGggPCBuKSBmICs9IFwiMFwiXHJcbiAgcmV0dXJuIGAke3ZbMF19LiR7Zn1gXHJcbn07XHJcblxyXG5jb25zdCB3aG9sZV93aXRzID0gKG51bWJlciwgZGlnaXRzKSA9PiB7XHJcbiAgY29uc3QgbG9va3VwID0gW1xyXG4gICAgeyB2YWx1ZTogMW4sIHN5bWJvbDogXCJwZWRyb3NcIiB9LFxyXG4gICAgeyB2YWx1ZTogMTBuICoqIDZuLCBzeW1ib2w6IFwibVdpdHNcIiB9LFxyXG4gICAgeyB2YWx1ZTogMTBuICoqIDluLCBzeW1ib2w6IFwiIFdpdHNcIiB9LFxyXG4gICAgeyB2YWx1ZTogMTBuICoqIDEybiwgc3ltYm9sOiBcIktXaXRzXCIgfSxcclxuICAgIHsgdmFsdWU6IDEwbiAqKiAxNW4sIHN5bWJvbDogXCJNV2l0c1wiIH0sXHJcbiAgXVxyXG4gIC8vIGNvbnN0IHJlZ2V4cCA9IC9cXC4wKyR8KD88PVxcLlswLTldKTArJC9cclxuICBjb25zdCBpdGVtID0gbG9va3VwLmZpbmRMYXN0KGl0ZW0gPT4gbnVtYmVyID49IGl0ZW0udmFsdWUpXHJcbiAgY29uc3QgcXVvdGllbnQgPSBpdGVtID8gTnVtYmVyKEJpZ0ludChudW1iZXIpIC8gaXRlbS52YWx1ZSkgOiBudW1iZXIudG9TdHJpbmcoKVxyXG4gIGNvbnN0IGRlY2ltYWxzID0gaXRlbSA/IChpdGVtLnZhbHVlICsgQmlnSW50KG51bWJlcikgLSBCaWdJbnQocXVvdGllbnQpICogaXRlbS52YWx1ZSkudG9TdHJpbmcoKS5zbGljZSgxKSA6IFwiXCJcclxuICByZXR1cm4gaXRlbSA/IGAke2NvbW1hcyhxdW90aWVudCl9JHtkZWNpbWFscyAhPT0gXCJcIiA/IGAuJHtkZWNpbWFscy5zbGljZSgwLCBkaWdpdHMpfWAgOiBcIlwifSAke2l0ZW0uc3ltYm9sfWAgOiBcIihubyBjb2lucylcIlxyXG59XHJcblxyXG5jb25zdCBiYmx1ZSA9IChzdHIpID0+IGBcXHgxYlsxOzk4OzQ0bSR7c3RyfVxceDFiWzA7MDswbWBcclxuY29uc3QgYmN5YW4gPSAoc3RyKSA9PiBgXFx4MWJbMzg7NDZtJHtzdHJ9XFx4MWJbMDswbWBcclxuY29uc3QgYmdyZWVuID0gKHN0cikgPT4gYFxceDFiWzMwOzQybSR7c3RyfVxceDFiWzA7MG1gXHJcbmNvbnN0IGJyZWQgPSAoc3RyKSA9PiBgXFx4MWJbMzA7NDFtJHtzdHJ9XFx4MWJbMDswbWBcclxuY29uc3QgYnZpb2xldCA9IChzdHIpID0+IGBcXHgxYlszMDs0NW0ke3N0cn1cXHgxYlswOzBtYFxyXG5cclxuY29uc3QgbGN5YW4gPSAoc3RyKSA9PiBgXFx4MWJbMTs5Nm0ke3N0cn1cXHgxYlswbWBcclxuY29uc3QgbGdyYXkgPSAoc3RyKSA9PiBgXFx4MWJbMTs5MG0ke3N0cn1cXHgxYlswbWBcclxuY29uc3QgbGdyZWVuID0gKHN0cikgPT4gYFxceDFiWzE7OTJtJHtzdHJ9XFx4MWJbMG1gXHJcbmNvbnN0IGxtYWdlbnRhID0gKHN0cikgPT4gYFxceDFiWzE7OTVtJHtzdHJ9XFx4MWJbMG1gXHJcbmNvbnN0IGx5ZWxsb3cgPSAoc3RyKSA9PiBgXFx4MWJbMTs5M20ke3N0cn1cXHgxYlswbWBcclxuY29uc3QgbWJsdWUgPSAoc3RyKSA9PiBgXFx4MWJbOTRtJHtzdHJ9XFx4MWJbMG1gXHJcbmNvbnN0IG1jeWFuID0gKHN0cikgPT4gYFxceDFiWzk2bSR7c3RyfVxceDFiWzBtYFxyXG5jb25zdCBtZ3JlZW4gPSAoc3RyKSA9PiBgXFx4MWJbOTJtJHtzdHJ9XFx4MWJbMG1gXHJcbmNvbnN0IG1tYWdlbnRhID0gKHN0cikgPT4gYFxceDFiWzA7OTVtJHtzdHJ9XFx4MWJbMG1gXHJcbmNvbnN0IG1yZWQgPSAoc3RyKSA9PiBgXFx4MWJbOTFtJHtzdHJ9XFx4MWJbMG1gXHJcbmNvbnN0IG15ZWxsb3cgPSAoc3RyKSA9PiBgXFx4MWJbOTNtJHtzdHJ9XFx4MWJbMG1gXHJcblxyXG5jb25zdCBibHVlID0gKHN0cikgPT4gYFxceDFiWzM0bSR7c3RyfVxceDFiWzBtYFxyXG5jb25zdCBjeWFuID0gKHN0cikgPT4gYFxceDFiWzM2bSR7c3RyfVxceDFiWzBtYFxyXG5jb25zdCBncmF5ID0gKHN0cikgPT4gYFxceDFiWzkwbSR7c3RyfVxceDFiWzBtYFxyXG5jb25zdCBncmVlbiA9IChzdHIpID0+IGBcXHgxYlszMm0ke3N0cn1cXHgxYlswbWBcclxuY29uc3QgbWFnZW50YSA9IChzdHIpID0+IGBcXHgxYlswOzM1bSR7c3RyfVxceDFiWzBtYFxyXG5jb25zdCBub3JtYWwgPSAoc3RyKSA9PiBgXFx4MWJbOThtJHtzdHJ9XFx4MWJbMG1gXHJcbmNvbnN0IHJlZCA9IChzdHIpID0+IGBcXHgxYlszMW0ke3N0cn1cXHgxYlswbWBcclxuY29uc3Qgd2hpdGUgPSAoc3RyKSA9PiBgXFx4MWJbMTs5OG0ke3N0cn1cXHgxYlswbWBcclxuY29uc3QgeWVsbG93ID0gKHN0cikgPT4gYFxceDFiWzMzbSR7c3RyfVxceDFiWzBtYFxyXG5cclxuZnVuY3Rpb24gY291bnRMZWF2ZXMgKHQsIG9iaikge1xyXG4gIGlmICghb2JqIHx8IHR5cGVvZiBvYmogPT09IFwic3RyaW5nXCIpIHJldHVybiAwXHJcbiAgaWYgKG9iaiBpbnN0YW5jZW9mIHQpIHJldHVybiAxXHJcbiAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkgcmV0dXJuIG9iai5yZWR1Y2UoKHN1bSwgaXRlbSkgPT4gc3VtICsgY291bnRMZWF2ZXModCwgaXRlbSksIDApXHJcbiAgZWxzZSByZXR1cm4gT2JqZWN0LnZhbHVlcyhvYmopLnJlZHVjZSgoc3VtLCBpdGVtKSA9PiBzdW0gKyBjb3VudExlYXZlcyh0LCBpdGVtKSwgMClcclxufVxyXG5cclxuZnVuY3Rpb24gZGVsZXRlRXh0cmFGbGFncyAoYXJncykge1xyXG4gIHJldHVybiBhcmdzLmZpbHRlcihhcmcgPT4gIWFyZy5zdGFydHNXaXRoKFwiLS1cIikpXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNtZCAoLi4uY29tbWFuZCkge1xyXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICBleGVjKGNvbW1hbmQuam9pbihcIiBcIiksIHsgbWF4QnVmZmVyOiAxMDI0ICogMTAyNCAqIDEwIH0sIChlcnJvciwgc3Rkb3V0LCBzdGRlcnIpID0+IHtcclxuICAgICAgaWYgKGVycm9yKSB7XHJcbiAgICAgICAgcmVqZWN0KGVycm9yKVxyXG4gICAgICB9XHJcbiAgICAgIGlmIChzdGRlcnIpIHtcclxuICAgICAgICByZWplY3Qoc3RkZXJyKVxyXG4gICAgICB9XHJcbiAgICAgIHJlc29sdmUoc3Rkb3V0KVxyXG4gICAgfSlcclxuICB9KVxyXG59O1xyXG5cclxuYXN5bmMgZnVuY3Rpb24gZXhlY1JhZG9uQnl0ZWNvZGUgKGJ5dGVjb2RlLCAuLi5mbGFncykge1xyXG4gIGlmICghaXNIZXhTdHJpbmcoYnl0ZWNvZGUpKSB7XHJcbiAgICB0aHJvdyBFdmFsRXJyb3IoXCJpbnZhbGlkIGhleCBzdHJpbmdcIilcclxuICB9IGVsc2Uge1xyXG4gICAgY29uc3QgbnB4ID0gb3MudHlwZSgpID09PSBcIldpbmRvd3NfTlRcIiA/IFwibnB4LmNtZFwiIDogXCJucHhcIlxyXG4gICAgcmV0dXJuIGNtZChucHgsIFwid2l0bmV0XCIsIFwicmFkb25cIiwgXCJkcnlydW5cIiwgYnl0ZWNvZGUsIC4uLmZsYWdzKVxyXG4gICAgLy8gLmNhdGNoKChlcnIpID0+IHtcclxuICAgIC8vICAgICBsZXQgZXJyb3JNZXNzYWdlID0gZXJyLm1lc3NhZ2Uuc3BsaXQoJ1xcbicpLnNsaWNlKDEpLmpvaW4oJ1xcbicpLnRyaW0oKVxyXG4gICAgLy8gICAgIGNvbnN0IGVycm9yUmVnZXggPSAvLipeZXJyb3I6ICg/PG1lc3NhZ2U+LiopJC4qL2dtXHJcbiAgICAvLyAgICAgY29uc3QgbWF0Y2hlZCA9IGVycm9yUmVnZXguZXhlYyhlcnIubWVzc2FnZSlcclxuICAgIC8vICAgICBpZiAobWF0Y2hlZCkge1xyXG4gICAgLy8gICAgICAgICBlcnJvck1lc3NhZ2UgPSBtYXRjaGVkLmdyb3Vwcy5tZXNzYWdlXHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gICAgIGNvbnNvbGUubG9nKGVycm9yTWVzc2FnZSB8fCBlcnIpXHJcbiAgICAvLyAgICAgY29uc29sZS5lcnJvcihlcnJvck1lc3NhZ2UgfHwgZXJyKVxyXG4gICAgLy8gfSlcclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGV4dHJhY3RGcm9tQXJncyAoYXJncywgZmxhZ3MpIHtcclxuICBjb25zdCBjdXJhdGVkID0ge31cclxuICBpZiAoYXJncyAmJiBmbGFncykge1xyXG4gICAgT2JqZWN0LmtleXMoZmxhZ3MpLmZvckVhY2goZmxhZyA9PiB7XHJcbiAgICAgIGNvbnN0IGZsYWdJbmRleCA9IGFyZ3MuaW5kZXhPZihgLS0ke2ZsYWd9YClcclxuICAgICAgaWYgKGZsYWdJbmRleCA+PSAwKSB7XHJcbiAgICAgICAgaWYgKGZsYWdzW2ZsYWddLnBhcmFtKSB7XHJcbiAgICAgICAgICBjdXJhdGVkW2ZsYWddID0gYXJnc1tmbGFnSW5kZXhdXHJcbiAgICAgICAgICBpZiAoIWFyZ3NbZmxhZ0luZGV4ICsgMV0gfHwgYXJnc1tmbGFnSW5kZXggKyAxXS5zdGFydHNXaXRoKFwiLS1cIikpIHtcclxuICAgICAgICAgICAgdGhyb3cgRXJyb3IoYE1pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyIGZvciAtLSR7ZmxhZ31gKVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY3VyYXRlZFtmbGFnXSA9IGFyZ3NbZmxhZ0luZGV4ICsgMV1cclxuICAgICAgICAgICAgYXJncy5zcGxpY2UoZmxhZ0luZGV4LCAyKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjdXJhdGVkW2ZsYWddID0gdHJ1ZVxyXG4gICAgICAgICAgYXJncy5zcGxpY2UoZmxhZ0luZGV4LCAxKVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcbiAgcmV0dXJuIFthcmdzLCBjdXJhdGVkXVxyXG59XHJcblxyXG5mdW5jdGlvbiBmcm9tSGV4U3RyaW5nIChoZXhTdHJpbmcpIHtcclxuICBpZiAoaGV4U3RyaW5nLnN0YXJ0c1dpdGgoXCIweFwiKSkgaGV4U3RyaW5nID0gaGV4U3RyaW5nLnNsaWNlKDIpXHJcbiAgcmV0dXJuIFVpbnQ4QXJyYXkuZnJvbShoZXhTdHJpbmcubWF0Y2goLy57MSwyfS9nKS5tYXAoKGJ5dGUpID0+IHBhcnNlSW50KGJ5dGUsIDE2KSkpXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGlwSXNQcml2YXRlT3JMb2NhbGhvc3QgKGlwKSB7XHJcbiAgaWYgKGlwLnN1YnN0cmluZygwLCA3KSA9PT0gXCI6OmZmZmY6XCIpIHsgaXAgPSBpcC5zdWJzdHJpbmcoNykgfVxyXG5cclxuICBpZiAobmV0LmlzSVB2NChpcCkpIHtcclxuICAgIC8vIGNoZWNrIGxvY2FsaG9zdFxyXG4gICAgaWYgKGlwID09PSBcIjEyNy4wLjAuMVwiKSB7IHJldHVybiB0cnVlIH1cclxuXHJcbiAgICAvLyAgICAgICAgIDEwLjAuMC4wIC0gMTAuMjU1LjI1NS4yNTUgICAgICAgIHx8ICAgMTcyLjE2LjAuMCAtIDE3Mi4zMS4yNTUuMjU1ICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAgICAxOTIuMTY4LjAuMCAtIDE5Mi4xNjguMjU1LjI1NVxyXG4gICAgcmV0dXJuIC9eKDEwKVxcLiguKilcXC4oLiopXFwuKC4qKSQvLnRlc3QoaXApIHx8IC9eKDE3MilcXC4oMVs2LTldfDJbMC05XXwzWzAtMV0pXFwuKC4qKVxcLiguKikkLy50ZXN0KGlwKSB8fCAvXigxOTIpXFwuKDE2OClcXC4oLiopXFwuKC4qKSQvLnRlc3QoaXApXHJcbiAgfVxyXG5cclxuICAvLyBlbHNlOiBpcCBpcyBJUHY2XHJcbiAgY29uc3QgZmlyc3RXb3JkID0gaXAuc3BsaXQoXCI6XCIpLmZpbmQoZWwgPT4gISFlbCkgLy8gZ2V0IGZpcnN0IG5vdCBlbXB0eSB3b3JkXHJcblxyXG4gIC8vIGVxdWl2YWxlbnQgb2YgMTI3LjAuMC4xIGluIElQdjZcclxuICBpZiAoaXAgPT09IFwiOjoxXCIpIHJldHVybiB0cnVlXHJcblxyXG4gIC8vIFRoZSBvcmlnaW5hbCBJUHY2IFNpdGUgTG9jYWwgYWRkcmVzc2VzIChmZWMwOjovMTApIGFyZSBkZXByZWNhdGVkLiBSYW5nZTogZmVjMCAtIGZlZmZcclxuICBlbHNlIGlmICgvXmZlW2MtZl1bMC1mXSQvLnRlc3QoZmlyc3RXb3JkKSkgcmV0dXJuIHRydWVcclxuXHJcbiAgLy8gVGhlc2UgZGF5cyBVbmlxdWUgTG9jYWwgQWRkcmVzc2VzIChVTEEpIGFyZSB1c2VkIGluIHBsYWNlIG9mIFNpdGUgTG9jYWwuXHJcbiAgLy8gUmFuZ2U6IGZjMDAgLSBmY2ZmXHJcbiAgZWxzZSBpZiAoL15mY1swLWZdezJ9JC8udGVzdChmaXJzdFdvcmQpKSByZXR1cm4gdHJ1ZVxyXG5cclxuICAvLyBSYW5nZTogZmQwMCAtIGZjZmZcclxuICBlbHNlIGlmICgvXmZkWzAtZl17Mn0kLy50ZXN0KGZpcnN0V29yZCkpIHJldHVybiB0cnVlXHJcblxyXG4gIC8vIExpbmsgbG9jYWwgYWRkcmVzc2VzIChwcmVmaXhlZCB3aXRoIGZlODApIGFyZSBub3Qgcm91dGFibGVcclxuICBlbHNlIGlmIChmaXJzdFdvcmQgPT09IFwiZmU4MFwiKSByZXR1cm4gdHJ1ZVxyXG5cclxuICAvLyBEaXNjYXJkIFByZWZpeFxyXG4gIGVsc2UgaWYgKGZpcnN0V29yZCA9PT0gXCIxMDBcIikgcmV0dXJuIHRydWVcclxuXHJcbiAgLy8gQW55IG90aGVyIElQIGFkZHJlc3MgaXMgbm90IFVuaXF1ZSBMb2NhbCBBZGRyZXNzIChVTEEpXHJcbiAgcmV0dXJuIGZhbHNlXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGlzSGV4U3RyaW5nT2ZMZW5ndGggKHN0ciwgbGVuZ3RoKSB7XHJcbiAgcmV0dXJuIChpc0hleFN0cmluZyhzdHIpICYmXHJcbiAgICAgICAgKFxyXG4gICAgICAgICAgKHN0ci5zdGFydHNXaXRoKFwiMHhcIikgJiYgc3RyLnNsaWNlKDIpLmxlbmd0aCA9PT0gbGVuZ3RoICogMikgfHxcclxuICAgICAgICAgICAgc3RyLmxlbmd0aCA9PT0gbGVuZ3RoICogMlxyXG4gICAgICAgIClcclxuICApIHx8IGlzV2lsZGNhcmQoc3RyKVxyXG59XHJcblxyXG5mdW5jdGlvbiBpc0hleFN0cmluZyAoc3RyKSB7XHJcbiAgcmV0dXJuIChcclxuICAgIHR5cGVvZiBzdHIgPT09IFwic3RyaW5nXCIgJiZcclxuICAgICAgICAoXHJcbiAgICAgICAgICAoc3RyLnN0YXJ0c1dpdGgoXCIweFwiKSAmJiAvXlthLWZBLUYwLTldKyQvaS50ZXN0KHN0ci5zbGljZSgyKSkpIHx8XHJcbiAgICAgICAgICAgIC9eW2EtZkEtRjAtOV0rJC9pLnRlc3Qoc3RyKVxyXG4gICAgICAgIClcclxuICApIHx8IGlzV2lsZGNhcmQoc3RyKVxyXG59XHJcblxyXG5mdW5jdGlvbiB0b0hleFN0cmluZyAoYnVmZmVyLCBwcmVmaXgweCA9IGZhbHNlKSB7XHJcbiAgaWYgKGJ1ZmZlciBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIGJ1ZmZlciA9IEJ1ZmZlci5mcm9tKGJ1ZmZlcilcclxuICByZXR1cm4gKHByZWZpeDB4ID8gXCIweFwiIDogXCJcIikgKyBBcnJheS5wcm90b3R5cGUubWFwLmNhbGwoYnVmZmVyLCB4ID0+IChcIjAwXCIgKyB4LnRvU3RyaW5nKDE2KSkuc2xpY2UoLTIpKVxyXG4gICAgLmpvaW4oXCJcIilcclxuICAgIC5tYXRjaCgvW2EtZkEtRjAtOV17Mn0vZylcclxuICAgIC5qb2luKFwiXCIpXHJcbn1cclxuXHJcbmZ1bmN0aW9uIHBhcnNlVVJMICh1cmwpIHtcclxuICB0cnkge1xyXG4gICAgY29uc3QgcGFyc2VkVXJsID0gbmV3IFVSTCh1cmwpXHJcbiAgICByZXR1cm4gW1xyXG4gICAgICBwYXJzZWRVcmwucHJvdG9jb2wgKyBcIi8vXCIsXHJcbiAgICAgIHBhcnNlZFVybC5ob3N0LFxyXG4gICAgICBwYXJzZWRVcmwucGF0aG5hbWUuc2xpY2UoMSksXHJcbiAgICAgIHBhcnNlZFVybC5zZWFyY2guc2xpY2UoMSksXHJcbiAgICBdXHJcbiAgfSBjYXRjaCB7XHJcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIFVSTCB3YXMgcHJvdmlkZWQ6ICR7dXJsfWApXHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBzaG93VXNhZ2UgKGNtZCwgbW9kdWxlKSB7XHJcbiAgc2hvd1VzYWdlSGVhZGxpbmUoY21kKVxyXG4gIHNob3dVc2FnZU9wdGlvbnMoeyAuLi5tb2R1bGU/LmZsYWdzIH0pXHJcbiAgc2hvd1VzYWdlRmxhZ3MoeyAuLi5tb2R1bGU/LmZsYWdzIH0pXHJcbiAgc2hvd1VzYWdlUm91dGVyKHsgLi4ubW9kdWxlPy5yb3V0ZXIgfSlcclxuICBzaG93VXNhZ2VFbnZhcnMoeyAuLi5tb2R1bGU/LmVudmFycyB9KVxyXG59XHJcblxyXG5mdW5jdGlvbiBzaG93VXNhZ2VSb3V0ZXIgKHJvdXRlcikge1xyXG4gIGNvbnN0IGNtZHMgPSBPYmplY3QuZW50cmllcyhyb3V0ZXIpXHJcbiAgaWYgKGNtZHMubGVuZ3RoID4gMCkge1xyXG4gICAgY29uc29sZS5pbmZvKFwiXFxuU1VCQ09NTUFORFM6XCIpXHJcbiAgICBjb25zdCBtYXhMZW5ndGggPSBNYXRoLm1heCguLi5jbWRzLm1hcCgoW2NtZF0pID0+IGNtZC5sZW5ndGgpKVxyXG4gICAgY21kcy5mb3JFYWNoKGNtZCA9PiB7XHJcbiAgICAgIGNvbnNvbGUuaW5mbyhcIiAgXCIsIGAke2NtZFswXX0ke1wiIFwiLnJlcGVhdChtYXhMZW5ndGggLSBjbWRbMF0ubGVuZ3RoKX1gLCBcIiAgXCIsIGNtZFsxXS5oaW50KVxyXG4gICAgfSlcclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHNob3dVc2FnZUVycm9yIChjbWQsIHN1YmNtZCwgbW9kdWxlLCBlcnJvciwgZmxhZ3MpIHtcclxuICBzaG93VXNhZ2VTdWJjb21tYW5kKGNtZCwgc3ViY21kLCBtb2R1bGUsIGVycm9yKVxyXG4gIGlmIChlcnJvcikge1xyXG4gICAgY29uc29sZS5pbmZvKFwiXFxuRVJST1I6XCIpXHJcbiAgICBpZiAoZmxhZ3M/LmRlYnVnKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yPy5zdGFjaz8uc3BsaXQoXCJcXG5cIilbMF0gfHwgZXJyb3IpXHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBzaG93VXNhZ2VFbnZhcnMgKGVudmFycykge1xyXG4gIGlmIChlbnZhcnMpIHtcclxuICAgIGVudmFycyA9IE9iamVjdC5lbnRyaWVzKGVudmFycylcclxuICAgIGlmIChlbnZhcnMubGVuZ3RoID4gMCkge1xyXG4gICAgICBjb25zb2xlLmluZm8oXCJcXG5FTlZBUlM6XCIpXHJcbiAgICAgIGNvbnN0IG1heFdpZHRoID0gTWF0aC5tYXgoLi4uZW52YXJzLm1hcCgoW2VudmFyXSkgPT4gZW52YXIubGVuZ3RoKSlcclxuICAgICAgZW52YXJzLmZvckVhY2goKFtlbnZhciwgaGludF0pID0+IHtcclxuICAgICAgICBpZiAoZW52YXIudG9VcHBlckNhc2UoKS5pbmRleE9mKFwiS0VZXCIpIDwgMCAmJiBwcm9jZXNzLmVudltlbnZhcl0pIHtcclxuICAgICAgICAgIGNvbnNvbGUuaW5mbyhcIiAgXCIsIGAke3llbGxvdyhlbnZhci50b1VwcGVyQ2FzZSgpKX0ke1wiIFwiLnJlcGVhdChtYXhXaWR0aCAtIGVudmFyLmxlbmd0aCl9YCwgYCA9PiBTZXR0bGVkIHRvIFwiJHtteWVsbG93KHByb2Nlc3MuZW52W2VudmFyXSl9XCJgKVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjb25zb2xlLmluZm8oXCIgIFwiLCBgJHt5ZWxsb3coZW52YXIudG9VcHBlckNhc2UoKSl9JHtcIiBcIi5yZXBlYXQobWF4V2lkdGggLSBlbnZhci5sZW5ndGgpfWAsIGAgJHtoaW50fWApXHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gc2hvd1VzYWdlRmxhZ3MgKGZsYWdzKSB7XHJcbiAgaWYgKGZsYWdzKSB7XHJcbiAgICBmbGFncyA9IE9iamVjdC5lbnRyaWVzKGZsYWdzKS5maWx0ZXIoKFssIGZsYWddKSA9PiAhZmxhZz8ucGFyYW0pLnNvcnQoKFthXSwgW2JdKSA9PiB7XHJcbiAgICAgIGlmIChhIDwgYikgcmV0dXJuIC0xXHJcbiAgICAgIGVsc2UgaWYgKGEgPiBiKSByZXR1cm4gMVxyXG4gICAgICBlbHNlIHJldHVybiAwXHJcbiAgICB9KVxyXG4gICAgaWYgKGZsYWdzLmxlbmd0aCA+IDApIHtcclxuICAgICAgY29uc29sZS5pbmZvKFwiXFxuRkxBR1M6XCIpXHJcbiAgICAgIGNvbnN0IG1heExlbmd0aCA9IE1hdGgubWF4KC4uLmZsYWdzLmZpbHRlcigoWywgeyBoaW50IH1dKSA9PiBoaW50KS5tYXAoKFtrZXksIHsgcGFyYW0gfV0pID0+IHBhcmFtID8ga2V5Lmxlbmd0aCArIHBhcmFtLmxlbmd0aCArIDMgOiBrZXkubGVuZ3RoKSlcclxuICAgICAgZmxhZ3MuZm9yRWFjaChmbGFnID0+IHtcclxuICAgICAgICBjb25zdCBzdHIgPSBgJHtmbGFnWzBdfSR7ZmxhZ1sxXS5wYXJhbSA/IGdyYXkoYCA8JHtmbGFnWzFdLnBhcmFtfT5gKSA6IFwiXCJ9YFxyXG4gICAgICAgIGlmIChmbGFnWzFdLmhpbnQpIHtcclxuICAgICAgICAgIGNvbnNvbGUuaW5mbyhcIiAgXCIsIGAtLSR7c3RyfSR7XCIgXCIucmVwZWF0KG1heExlbmd0aCAtIGNvbG9yc3RyaXAoc3RyKS5sZW5ndGgpfWAsIFwiICBcIiwgZmxhZ1sxXS5oaW50KVxyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHNob3dVc2FnZUhlYWRsaW5lIChjbWQsIHN1YmNtZCwgbW9kdWxlKSB7XHJcbiAgY29uc29sZS5pbmZvKFwiVVNBR0U6XCIpXHJcbiAgaWYgKHN1YmNtZCkge1xyXG4gICAgbGV0IHBhcmFtcyA9IG1vZHVsZS5yb3V0ZXJbc3ViY21kXT8ucGFyYW1zXHJcbiAgICAvLyBjb25zdCBvcHRpb25zID0gbW9kdWxlLnJvdXRlcltzdWJjbWRdPy5vcHRpb25zXHJcbiAgICBpZiAocGFyYW1zKSB7XHJcbiAgICAgIGNvbnN0IG9wdGlvbmFsaXplID0gKHN0cikgPT4gc3RyLmVuZHNXaXRoKFwiIC4uLl1cIilcclxuICAgICAgICA/IGBbPCR7c3RyLnNsaWNlKDEsIC01KX0+IC4uLl1gXHJcbiAgICAgICAgOiAoXHJcbiAgICAgICAgICBzdHJbMF0gPT09IFwiW1wiID8gYFs8JHtzdHIuc2xpY2UoMSwgLTEpfT5dYCA6IGA8JHtzdHJ9PmBcclxuICAgICAgICApXHJcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHBhcmFtcykpIHtcclxuICAgICAgICBwYXJhbXMgPSBwYXJhbXMubWFwKHBhcmFtID0+IG9wdGlvbmFsaXplKHBhcmFtKSkuam9pbihcIiBcIikgKyBcIiBcIlxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHBhcmFtcyA9IG9wdGlvbmFsaXplKHBhcmFtcylcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgY29uc29sZS5pbmZvKGAgICAke3doaXRlKGBucHggd2l0bmV0ICR7Y21kfWApfSAke3doaXRlKHN1YmNtZCl9ICR7cGFyYW1zID8gZ3JlZW4ocGFyYW1zKSArIFwiIFwiIDogXCJcIn1bT1BUSU9OU10gW0ZMQUdTXWApXHJcbiAgICBpZiAobW9kdWxlPy5yb3V0ZXJbc3ViY21kXT8uaGludCkge1xyXG4gICAgICBjb25zb2xlLmluZm8oXCJcXG5ERVNDUklQVElPTjpcIilcclxuICAgICAgY29uc29sZS5pbmZvKGAgICAke21vZHVsZS5yb3V0ZXJbc3ViY21kXS5oaW50fWApXHJcbiAgICB9XHJcbiAgfSBlbHNlIHtcclxuICAgIGNvbnNvbGUuaW5mbyhgICAgJHt3aGl0ZShgbnB4IHdpdG5ldCAke2NtZH1gKX0gPFNVQkNPTU1BTkQ+IC4uLiBbT1BUSU9OU10gW0ZMQUdTXWApXHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBzaG93VXNhZ2VPcHRpb25zIChvcHRpb25zKSB7XHJcbiAgb3B0aW9ucyA9IE9iamVjdC5lbnRyaWVzKG9wdGlvbnMpLmZpbHRlcigoWywgb3B0aW9uXSkgPT4gb3B0aW9uPy5wYXJhbSkuc29ydCgoW2FdLCBbYl0pID0+IHtcclxuICAgIGlmIChhIDwgYikgcmV0dXJuIC0xXHJcbiAgICBlbHNlIGlmIChhID4gYikgcmV0dXJuIDFcclxuICAgIGVsc2UgcmV0dXJuIDBcclxuICB9KVxyXG4gIGlmIChvcHRpb25zLmxlbmd0aCA+IDApIHtcclxuICAgIGNvbnNvbGUuaW5mbyhcIlxcbk9QVElPTlM6XCIpXHJcbiAgICBjb25zdCBtYXhMZW5ndGggPSBvcHRpb25zXHJcbiAgICAgIC5tYXAob3B0aW9uID0+IG9wdGlvblsxXS5wYXJhbSA/IG9wdGlvblsxXS5wYXJhbS5sZW5ndGggKyBvcHRpb25bMF0ubGVuZ3RoICsgMyA6IG9wdGlvblswXS5sZW5ndGgpXHJcbiAgICAgIC5yZWR1Y2UoKHByZXYsIGN1cnIpID0+IGN1cnIgPiBwcmV2ID8gY3VyciA6IHByZXYpXHJcbiAgICBvcHRpb25zLmZvckVhY2gob3B0aW9uID0+IHtcclxuICAgICAgaWYgKG9wdGlvblsxXS5oaW50KSB7XHJcbiAgICAgICAgY29uc3Qgc3RyID0gYCR7b3B0aW9uWzBdfSR7b3B0aW9uWzFdLnBhcmFtID8gZ3JheShgIDwke29wdGlvblsxXS5wYXJhbX0+YCkgOiBcIlwifWBcclxuICAgICAgICBjb25zb2xlLmluZm8oXCIgIFwiLCBgLS0ke3N0cn0ke1wiIFwiLnJlcGVhdChtYXhMZW5ndGggLSBjb2xvcnN0cmlwKHN0cikubGVuZ3RoKX1gLCBcIiAgXCIsIG9wdGlvblsxXS5oaW50KVxyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gc2hvd1VzYWdlU3ViY29tbWFuZCAoY21kLCBzdWJjbWQsIG1vZHVsZSkge1xyXG4gIHNob3dVc2FnZUhlYWRsaW5lKGNtZCwgc3ViY21kLCBtb2R1bGUpXHJcbiAgc2hvd1VzYWdlT3B0aW9ucyh7IC4uLm1vZHVsZT8uZmxhZ3MsIC4uLm1vZHVsZS5yb3V0ZXJbc3ViY21kXT8ub3B0aW9ucyB9KVxyXG4gIHNob3dVc2FnZUZsYWdzKHsgLi4ubW9kdWxlPy5mbGFncywgLi4ubW9kdWxlLnJvdXRlcltzdWJjbWRdPy5vcHRpb25zIH0pXHJcbiAgc2hvd1VzYWdlRW52YXJzKG1vZHVsZS5yb3V0ZXJbc3ViY21kXT8uZW52YXJzIHx8IG1vZHVsZT8uZW52YXJzKVxyXG59XHJcblxyXG5mdW5jdGlvbiBzaG93VmVyc2lvbiAoKSB7XHJcbiAgY29uc29sZS5pbmZvKGAke21jeWFuKGBXaXRuZXQgU0RLIHYke3JlcXVpcmUoXCIuLi8uLi9wYWNrYWdlLmpzb25cIikudmVyc2lvbn1gKX1gKVxyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRXaWxkY2FyZHNDb3VudEZyb21TdHJpbmcgKHN0cikge1xyXG4gIGxldCBtYXhBcmdzSW5kZXggPSAwXHJcbiAgaWYgKHN0cikge1xyXG4gICAgbGV0IG1hdGNoXHJcbiAgICBjb25zdCByZWdleHAgPSAvXFxcXFxcZFxcXFwvZ1xyXG4gICAgd2hpbGUgKChtYXRjaCA9IHJlZ2V4cC5leGVjKHN0cikpICE9PSBudWxsKSB7XHJcbiAgICAgIGNvbnN0IGFyZ3NJbmRleCA9IHBhcnNlSW50KG1hdGNoWzBdWzFdKSArIDFcclxuICAgICAgaWYgKGFyZ3NJbmRleCA+IG1heEFyZ3NJbmRleCkgbWF4QXJnc0luZGV4ID0gYXJnc0luZGV4XHJcbiAgICB9XHJcbiAgfVxyXG4gIHJldHVybiBtYXhBcmdzSW5kZXhcclxufVxyXG5cclxuZnVuY3Rpb24gY2hlY2tScGNXaWxkY2FyZHMgKHdpbGRjYXJkcykge1xyXG4gIGlmICh0eXBlb2Ygd2lsZGNhcmRzID09PSBcIm9iamVjdFwiKSB7XHJcbiAgICBPYmplY3QudmFsdWVzKHdpbGRjYXJkcykuZm9yRWFjaCh3aWxkY2FyZCA9PiB7XHJcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHdpbGRjYXJkKSkgd2lsZGNhcmQuZm9yRWFjaChpdGVtID0+IGNoZWNrUnBjV2lsZGNhcmRzKGl0ZW0pKVxyXG4gICAgICBlbHNlIGNoZWNrUnBjV2lsZGNhcmRzKHdpbGRjYXJkKVxyXG4gICAgfSlcclxuICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkod2lsZGNhcmRzKSkge1xyXG4gICAgd2lsZGNhcmRzLmZvckVhY2god2lsZGNhcmQgPT4gY2hlY2tScGNXaWxkY2FyZHMod2lsZGNhcmQpKVxyXG4gIH0gZWxzZSBpZiAodHlwZW9mIHdpbGRjYXJkcyA9PT0gXCJzdHJpbmdcIikge1xyXG4gICAgaWYgKGlzV2lsZGNhcmQod2lsZGNhcmRzKSkge1xyXG4gICAgICBjb25zdCBjaGFyID0gd2lsZGNhcmRzLmNoYXJBdCgxKVxyXG4gICAgICBpZiAoY2hhciA8IFwiMVwiIHx8IGNoYXIgPiBcIjlcIikge1xyXG4gICAgICAgIHRocm93IEVycm9yKFwiUlBDOiB3aWxkY2FyZHMgbm90IGluIHJhbmdlIFsxIC4uIDldXCIpXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGlzV2lsZGNhcmQgKHN0cikge1xyXG4gIHJldHVybiBzdHIubGVuZ3RoID09PSAzICYmIC9cXFxcXFxkXFxcXC9nLnRlc3Qoc3RyKVxyXG59XHJcblxyXG5mdW5jdGlvbiByZXBsYWNlV2lsZGNhcmRzIChvYmosIGFyZ3MpIHtcclxuICBpZiAoYXJncy5sZW5ndGggPiAxMCkgYXJncyA9IGFyZ3Muc2xpY2UoMCwgMTApXHJcbiAgaWYgKG9iaiAmJiB0eXBlb2Ygb2JqID09PSBcInN0cmluZ1wiKSB7XHJcbiAgICBmb3IgKGxldCBhcmdJbmRleCA9IDA7IGFyZ0luZGV4IDwgYXJncy5sZW5ndGg7IGFyZ0luZGV4KyspIHtcclxuICAgICAgY29uc3Qgd2lsZGNhcmQgPSBgXFxcXCR7YXJnSW5kZXh9XFxcXGBcclxuICAgICAgb2JqID0gb2JqLnJlcGxhY2VBbGwod2lsZGNhcmQsIGFyZ3NbYXJnSW5kZXhdKVxyXG4gICAgfVxyXG4gIH0gZWxzZSBpZiAob2JqICYmIEFycmF5LmlzQXJyYXkob2JqKSkge1xyXG4gICAgb2JqID0gb2JqLm1hcCh2YWx1ZSA9PiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgfHwgQXJyYXkuaXNBcnJheSh2YWx1ZSlcclxuICAgICAgPyByZXBsYWNlV2lsZGNhcmRzKHZhbHVlLCBhcmdzKVxyXG4gICAgICA6IHZhbHVlXHJcbiAgICApXHJcbiAgfVxyXG4gIHJldHVybiBvYmpcclxufVxyXG5cclxuZnVuY3Rpb24gc3BsaWNlV2lsZGNhcmQgKG9iaiwgYXJnSW5kZXgsIGFyZ1ZhbHVlLCBhcmdzQ291bnQpIHtcclxuICBpZiAob2JqICYmIHR5cGVvZiBvYmogPT09IFwic3RyaW5nXCIpIHtcclxuICAgIGNvbnN0IHdpbGRjYXJkID0gYFxcXFwke2FyZ0luZGV4fVxcXFxgXHJcbiAgICBvYmogPSBvYmoucmVwbGFjZUFsbCh3aWxkY2FyZCwgYXJnVmFsdWUpXHJcbiAgICBmb3IgKGxldCBqID0gYXJnSW5kZXggKyAxOyBqIDwgYXJnc0NvdW50OyBqKyspIHtcclxuICAgICAgb2JqID0gb2JqLnJlcGxhY2VBbGwoYFxcXFwke2p9XFxcXGAsIGBcXFxcJHtqIC0gMX1cXFxcYClcclxuICAgIH1cclxuICB9IGVsc2UgaWYgKG9iaiAmJiBBcnJheS5pc0FycmF5KG9iaikpIHtcclxuICAgIG9iaiA9IG9iai5tYXAodmFsdWUgPT4gdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiIHx8IEFycmF5LmlzQXJyYXkodmFsdWUpXHJcbiAgICAgID8gc3BsaWNlV2lsZGNhcmQodmFsdWUsIGFyZ0luZGV4LCBhcmdWYWx1ZSwgYXJnc0NvdW50KVxyXG4gICAgICA6IHZhbHVlXHJcbiAgICApXHJcbiAgfVxyXG4gIHJldHVybiBvYmpcclxufVxyXG5cclxuYXN5bmMgZnVuY3Rpb24gdG9vbGtpdFJ1biAoc2V0dGluZ3MsIGFyZ3MpIHtcclxuICBjb25zdCBjbWQgPSBgJHtzZXR0aW5ncy5wYXRocy50b29sa2l0QmluUGF0aH0gJHthcmdzLmpvaW4oXCIgXCIpfWBcclxuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgZXhlYyhjbWQsIHsgbWF4QnVmZmVyOiAxMDI0ICogMTAyNCAqIDEwIH0sIChlcnJvciwgc3Rkb3V0LCBzdGRlcnIpID0+IHtcclxuICAgICAgaWYgKGVycm9yKSB7XHJcbiAgICAgICAgcmVqZWN0KGVycm9yKVxyXG4gICAgICB9XHJcbiAgICAgIGlmIChzdGRlcnIpIHtcclxuICAgICAgICByZWplY3Qoc3RkZXJyKVxyXG4gICAgICB9XHJcbiAgICAgIHJlc29sdmUoc3Rkb3V0KVxyXG4gICAgfSlcclxuICB9KVxyXG59XHJcblxyXG5mdW5jdGlvbiB0b1VwcGVyQ2FtZWxDYXNlIChzdHIpIHtcclxuICByZXR1cm4gc3RyLnJlcGxhY2UoL1xcYihcXHcpL2csIGZ1bmN0aW9uIChtYXRjaCwgY2FwdHVyZSkge1xyXG4gICAgcmV0dXJuIGNhcHR1cmUudG9VcHBlckNhc2UoKVxyXG4gIH0pLnJlcGxhY2UoL1xccysvZywgXCJcIilcclxufVxyXG5cclxuZnVuY3Rpb24gdG9VdGY4QXJyYXkgKHN0cikge1xyXG4gIGNvbnN0IHV0ZjggPSBbXVxyXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7XHJcbiAgICBsZXQgY2hhcmNvZGUgPSBzdHIuY2hhckNvZGVBdChpKVxyXG4gICAgaWYgKGNoYXJjb2RlIDwgMHg4MCkgdXRmOC5wdXNoKGNoYXJjb2RlKVxyXG4gICAgZWxzZSBpZiAoY2hhcmNvZGUgPCAweDgwMCkge1xyXG4gICAgICB1dGY4LnB1c2goMHhjMCB8IChjaGFyY29kZSA+PiA2KSxcclxuICAgICAgICAweDgwIHwgKGNoYXJjb2RlICYgMHgzZikpXHJcbiAgICB9IGVsc2UgaWYgKGNoYXJjb2RlIDwgMHhkODAwIHx8IGNoYXJjb2RlID49IDB4ZTAwMCkge1xyXG4gICAgICB1dGY4LnB1c2goMHhlMCB8IChjaGFyY29kZSA+PiAxMiksXHJcbiAgICAgICAgMHg4MCB8ICgoY2hhcmNvZGUgPj4gNikgJiAweDNmKSxcclxuICAgICAgICAweDgwIHwgKGNoYXJjb2RlICYgMHgzZikpXHJcbiAgICB9IGVsc2UgeyAvLyBzdXJyb2dhdGUgcGFpclxyXG4gICAgICBpKytcclxuICAgICAgLy8gVVRGLTE2IGVuY29kZXMgMHgxMDAwMC0weDEwRkZGRiBieVxyXG4gICAgICAvLyBzdWJ0cmFjdGluZyAweDEwMDAwIGFuZCBzcGxpdHRpbmcgdGhlXHJcbiAgICAgIC8vIDIwIGJpdHMgb2YgMHgwLTB4RkZGRkYgaW50byB0d28gaGFsdmVzXHJcbiAgICAgIGNoYXJjb2RlID0gMHgxMDAwMCArICgoKGNoYXJjb2RlICYgMHgzZmYpIDw8IDEwKSB8XHJcbiAgICAgICAgICAgICAgICAoc3RyLmNoYXJDb2RlQXQoaSkgJiAweDNmZikpXHJcbiAgICAgIHV0ZjgucHVzaCgweGYwIHwgKGNoYXJjb2RlID4+IDE4KSxcclxuICAgICAgICAweDgwIHwgKChjaGFyY29kZSA+PiAxMikgJiAweDNmKSxcclxuICAgICAgICAweDgwIHwgKChjaGFyY29kZSA+PiA2KSAmIDB4M2YpLFxyXG4gICAgICAgIDB4ODAgfCAoY2hhcmNvZGUgJiAweDNmKSlcclxuICAgIH1cclxuICB9XHJcbiAgcmV0dXJuIHV0ZjhcclxufVxyXG5cclxuZnVuY3Rpb24gdXRmOEFycmF5VG9TdHIgKGFycmF5KSB7XHJcbiAgY29uc3QgbGVuID0gYXJyYXkubGVuZ3RoXHJcbiAgbGV0IG91dCA9IFwiXCI7IGxldCBpID0gMDsgbGV0IGNcclxuICBsZXQgY2hhcjIsIGNoYXIzXHJcbiAgd2hpbGUgKGkgPCBsZW4pIHtcclxuICAgIGMgPSBhcnJheVtpKytdXHJcbiAgICBzd2l0Y2ggKGMgPj4gNCkge1xyXG4gICAgICBjYXNlIDA6IGNhc2UgMTogY2FzZSAyOiBjYXNlIDM6IGNhc2UgNDogY2FzZSA1OiBjYXNlIDY6IGNhc2UgNzpcclxuICAgICAgICAvLyAweHh4eHh4eFxyXG4gICAgICAgIG91dCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGMpXHJcbiAgICAgICAgYnJlYWtcclxuICAgICAgY2FzZSAxMjogY2FzZSAxMzpcclxuICAgICAgICAvLyAxMTB4IHh4eHggICAxMHh4IHh4eHhcclxuICAgICAgICBjaGFyMiA9IGFycmF5W2krK11cclxuICAgICAgICBvdXQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgoKGMgJiAweDFGKSA8PCA2KSB8IChjaGFyMiAmIDB4M0YpKVxyXG4gICAgICAgIGJyZWFrXHJcbiAgICAgIGNhc2UgMTQ6XHJcbiAgICAgICAgLy8gMTExMCB4eHh4ICAxMHh4IHh4eHggIDEweHggeHh4eFxyXG4gICAgICAgIGNoYXIyID0gYXJyYXlbaSsrXVxyXG4gICAgICAgIGNoYXIzID0gYXJyYXlbaSsrXVxyXG4gICAgICAgIG91dCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKCgoYyAmIDB4MEYpIDw8IDEyKSB8XHJcbiAgICAgICAgICAgICAgICAgICAgKChjaGFyMiAmIDB4M0YpIDw8IDYpIHxcclxuICAgICAgICAgICAgICAgICAgICAoKGNoYXIzICYgMHgzRikgPDwgMCkpXHJcbiAgICAgICAgYnJlYWtcclxuICAgIH1cclxuICB9XHJcbiAgcmV0dXJuIG91dFxyXG59XHJcblxyXG5hc3luYyBmdW5jdGlvbiBwcm9tcHQgKHF1ZXN0aW9uKSB7XHJcbiAgY29uc3QgcmVhZGxpbmVJbnRlcmZhY2UgPSByZWFkbGluZS5jcmVhdGVJbnRlcmZhY2Uoe1xyXG4gICAgaW5wdXQ6IHByb2Nlc3Muc3RkaW4sXHJcbiAgICBvdXRwdXQ6IHByb2Nlc3Muc3Rkb3V0LFxyXG4gIH0pXHJcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgIHJlYWRsaW5lSW50ZXJmYWNlLnF1ZXN0aW9uKGAke3F1ZXN0aW9ufSBgLCAocmVzcG9uc2UpID0+IHtcclxuICAgICAgcmVhZGxpbmVJbnRlcmZhY2UuY2xvc2UoKVxyXG4gICAgICByZXNvbHZlKHJlc3BvbnNlLnRyaW0oKSlcclxuICAgIH0pXHJcbiAgfSlcclxufVxyXG5cclxuYXN5bmMgZnVuY3Rpb24gcHJvbXB0ZXIgKHByb21pc2UpIHtcclxuICBjb25zdCBsb2FkaW5nID0gKCgpID0+IHtcclxuICAgIGNvbnN0IGggPSBbXCJ8XCIsIFwiL1wiLCBcIi1cIiwgXCJcXFxcXCJdXHJcbiAgICBsZXQgaSA9IDBcclxuICAgIHJldHVybiBzZXRJbnRlcnZhbCgoKSA9PiB7XHJcbiAgICAgIGkgPSAoaSA+IDMpID8gMCA6IGlcclxuICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoYFxcYlxcYiR7aFtpXX0gYClcclxuICAgICAgaSsrXHJcbiAgICB9LCA1MClcclxuICB9KSgpXHJcbiAgcmV0dXJuIHByb21pc2VcclxuICAgIC50aGVuKHJlc3VsdCA9PiB7XHJcbiAgICAgIGNsZWFySW50ZXJ2YWwobG9hZGluZylcclxuICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoXCJcXGJcXGJcIilcclxuICAgICAgcmV0dXJuIHJlc3VsdFxyXG4gICAgfSlcclxufVxyXG5cclxuZnVuY3Rpb24gdHJhY2VDaGVja2xpc3RzIChjaGVja2xpc3RzKSB7XHJcbiAgaWYgKGNoZWNrbGlzdHMgJiYgT2JqZWN0LmtleXMoY2hlY2tsaXN0cykubGVuZ3RoID4gMCkge1xyXG4gICAgY29uc3QgaGVhZGxpbmVzID0gW1wiTk9ERVNcIiwgLi4uT2JqZWN0LmtleXMoY2hlY2tsaXN0cykubWFwKGtleSA9PiBgOiR7a2V5fWApXVxyXG4gICAgY2hlY2tsaXN0cyA9IE9iamVjdC52YWx1ZXMoY2hlY2tsaXN0cylcclxuICAgIGNvbnN0IHVybHMgPSBPYmplY3Qua2V5cyhjaGVja2xpc3RzWzBdKVxyXG4gICAgY29uc3QgcmVjb3JkcyA9IHVybHMubWFwKHVybCA9PiB7XHJcbiAgICAgIGNvbnN0IGVycm9ycyA9IGNoZWNrbGlzdHMuZmlsdGVyKGNoZWNrbGlzdCA9PiBjaGVja2xpc3RbdXJsXSBpbnN0YW5jZW9mIEVycm9yKS5sZW5ndGhcclxuICAgICAgcmV0dXJuIFtcclxuICAgICAgICBlcnJvcnMgPT09IGNoZWNrbGlzdHMubGVuZ3RoID8gcmVkKHVybCkgOiAoZXJyb3JzID4gMCA/IG15ZWxsb3codXJsKSA6IG1jeWFuKHVybCkpLFxyXG4gICAgICAgIC4uLmNoZWNrbGlzdHMubWFwKGNoZWNrbGlzdCA9PiBjaGVja2xpc3RbdXJsXSBpbnN0YW5jZW9mIEVycm9yXHJcbiAgICAgICAgICA/IHJlZChjaGVja2xpc3RbdXJsXSlcclxuICAgICAgICAgIDogKGNoZWNrbGlzdFt1cmxdID09PSB0cnVlID8gbGN5YW4oXCJBeWVcIikgOiBjeWFuKFwiTmF5XCIpKVxyXG4gICAgICAgICksXHJcbiAgICAgIF1cclxuICAgIH0pXHJcbiAgICB0cmFjZVRhYmxlKHJlY29yZHMsIHtcclxuICAgICAgaGVhZGxpbmVzLFxyXG4gICAgICBtYXhDb2x1bW5XaWR0aDogMzEsXHJcbiAgICB9KVxyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gdHJhY2VIZWFkZXIgKGhlYWRsaW5lLCBjb2xvciA9IG5vcm1hbCwgaW5kZW50ID0gXCJcIiwpIHtcclxuICBjb25zb2xlLmluZm8oYCR7aW5kZW50feKUjOKUgCR7XCLilIBcIi5yZXBlYXQoaGVhZGxpbmUubGVuZ3RoKX3ilIDilJBgKVxyXG4gIGNvbnNvbGUuaW5mbyhgJHtpbmRlbnR94pSCICR7Y29sb3IoaGVhZGxpbmUpfSDilIJgKVxyXG4gIGNvbnNvbGUuaW5mbyhgJHtpbmRlbnR94pSU4pSAJHtcIuKUgFwiLnJlcGVhdChoZWFkbGluZS5sZW5ndGgpfeKUgOKUmGApXHJcbn1cclxuXHJcbmZ1bmN0aW9uIHRyYWNlVGFibGUgKHJlY29yZHMsIG9wdGlvbnMpIHtcclxuICBjb25zdCBzdHJpbmdpZnkgPSAoZGF0YSwgaHVtYW5pemVycywgaW5kZXgpID0+IGh1bWFuaXplcnMgJiYgaHVtYW5pemVyc1tpbmRleF0gPyBodW1hbml6ZXJzW2luZGV4XShkYXRhKS50b1N0cmluZygpIDogZGF0YT8udG9TdHJpbmcoKSA/PyBcIlwiXHJcbiAgY29uc3QgbWF4ID0gKGEsIGIpID0+IGEgPiBiID8gYSA6IGJcclxuICBjb25zdCByZWR1Y2VNYXggPSAobnVtYmVycykgPT4gbnVtYmVycy5yZWR1Y2UoKGN1cnIsIHByZXYpID0+IHByZXYgPiBjdXJyID8gcHJldiA6IGN1cnIsIDApXHJcbiAgaWYgKCFvcHRpb25zKSBvcHRpb25zID0ge31cclxuICBjb25zdCBpbmRlbnQgPSBvcHRpb25zPy5pbmRlbnQgfHwgXCJcIlxyXG4gIGNvbnN0IG51bUNvbHVtbnMgPSByZWR1Y2VNYXgocmVjb3Jkcy5tYXAocmVjb3JkID0+IHJlY29yZD8ubGVuZ3RoIHx8IDEpKVxyXG4gIGNvbnN0IG1heENvbHVtbldpZHRoID0gb3B0aW9ucz8ubWF4Q29sdW1uV2lkdGggfHwgODBcclxuICBjb25zdCB0YWJsZSA9IHRyYW5zcG9zZShyZWNvcmRzLCBudW1Db2x1bW5zKVxyXG4gIG9wdGlvbnMud2lkdGhzID0gb3B0aW9ucz8ud2lkdGhzIHx8IHRhYmxlLm1hcCgoY29sdW1uLCBpbmRleCkgPT4ge1xyXG4gICAgbGV0IG1heFdpZHRoID0gcmVkdWNlTWF4KGNvbHVtbi5tYXAoZmllbGQgPT4gY29sb3JzdHJpcChzdHJpbmdpZnkoZmllbGQsIG9wdGlvbnM/Lmh1bWFuaXplcnMsIGluZGV4KSkubGVuZ3RoKSlcclxuICAgIGlmIChvcHRpb25zPy5oZWFkbGluZXMgJiYgb3B0aW9ucy5oZWFkbGluZXNbaW5kZXhdKSB7XHJcbiAgICAgIG1heFdpZHRoID0gbWF4KG1heFdpZHRoLCBjb2xvcnN0cmlwKG9wdGlvbnMuaGVhZGxpbmVzW2luZGV4XS5yZXBsYWNlQWxsKFwiOlwiLCBcIlwiKSkubGVuZ3RoKVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIE1hdGgubWluKG1heFdpZHRoLCBtYXhDb2x1bW5XaWR0aClcclxuICB9KVxyXG4gIGxldCBoZWFkbGluZSA9IG9wdGlvbnMud2lkdGhzLm1hcChtYXhXaWR0aCA9PiBcIuKUgFwiLnJlcGVhdChtYXhXaWR0aCkpXHJcbiAgY29uc29sZS5pbmZvKGAke2luZGVudH3ilIzilIAke2hlYWRsaW5lLmpvaW4oXCLilIDilKzilIBcIil94pSA4pSQYClcclxuICBpZiAob3B0aW9ucz8uaGVhZGxpbmVzKSB7XHJcbiAgICBoZWFkbGluZSA9IG9wdGlvbnMud2lkdGhzLm1hcCgobWF4V2lkdGgsIGluZGV4KSA9PiB7XHJcbiAgICAgIGNvbnN0IGNhcHRpb24gPSBvcHRpb25zLmhlYWRsaW5lc1tpbmRleF0ucmVwbGFjZUFsbChcIjpcIiwgXCJcIilcclxuICAgICAgY29uc3QgY2FwdGlvbkxlbmd0aCA9IGNvbG9yc3RyaXAoY2FwdGlvbikubGVuZ3RoXHJcbiAgICAgIHJldHVybiBgJHt3aGl0ZShjYXB0aW9uKX0ke1wiIFwiLnJlcGVhdChtYXhXaWR0aCAtIGNhcHRpb25MZW5ndGgpfWBcclxuICAgIH0pXHJcbiAgICBjb25zb2xlLmluZm8oYCR7aW5kZW50feKUgiAke2hlYWRsaW5lLmpvaW4oXCIg4pSCIFwiKX0g4pSCYClcclxuICAgIGhlYWRsaW5lID0gb3B0aW9ucy53aWR0aHMubWFwKG1heFdpZHRoID0+IFwi4pSAXCIucmVwZWF0KG1heFdpZHRoKSlcclxuICAgIGNvbnNvbGUuaW5mbyhgJHtpbmRlbnR94pSc4pSAJHtoZWFkbGluZS5qb2luKFwi4pSA4pS84pSAXCIpfeKUgOKUpGApXHJcbiAgfVxyXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcmVjb3Jkcy5sZW5ndGg7IGkrKykge1xyXG4gICAgbGV0IGxpbmUgPSBcIlwiXHJcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IG51bUNvbHVtbnM7IGorKykge1xyXG4gICAgICBsZXQgZGF0YSA9IHRhYmxlW2pdW2ldXHJcbiAgICAgIGxldCBjb2xvclxyXG4gICAgICBpZiAob3B0aW9ucz8uY29sb3JzICYmIG9wdGlvbnMuY29sb3JzW2pdKSB7XHJcbiAgICAgICAgY29sb3IgPSBvcHRpb25zLmNvbG9yc1tqXVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbG9yID0gdHlwZW9mIGRhdGEgPT09IFwic3RyaW5nXCJcclxuICAgICAgICAgID8gZ3JlZW5cclxuICAgICAgICAgIDogKE51bWJlcihkYXRhKSA9PT0gZGF0YSAmJiBkYXRhICUgMSAhPT0gMCAvLyBpcyBmbG9hdCBudW1iZXI/XHJcbiAgICAgICAgICAgID8geWVsbG93XHJcbiAgICAgICAgICAgIDogKHgpID0+IHhcclxuICAgICAgICAgIClcclxuICAgICAgfVxyXG4gICAgICBkYXRhID0gc3RyaW5naWZ5KGRhdGEsIG9wdGlvbnM/Lmh1bWFuaXplcnMsIGopXHJcbiAgICAgIGlmIChjb2xvcnN0cmlwKGRhdGEpLmxlbmd0aCA+IG1heENvbHVtbldpZHRoKSB7XHJcbiAgICAgICAgd2hpbGUgKGNvbG9yc3RyaXAoZGF0YSkubGVuZ3RoID4gbWF4Q29sdW1uV2lkdGggLSAzKSB7XHJcbiAgICAgICAgICBkYXRhID0gZGF0YS5zbGljZSgwLCAtMSlcclxuICAgICAgICB9XHJcbiAgICAgICAgZGF0YSArPSBcIi4uLlwiXHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgZGF0YUxlbmd0aCA9IGNvbG9yc3RyaXAoZGF0YSkubGVuZ3RoXHJcbiAgICAgIGlmIChvcHRpb25zPy5oZWFkbGluZXMgJiYgb3B0aW9ucy5oZWFkbGluZXNbal1bMF0gPT09IFwiOlwiKSB7XHJcbiAgICAgICAgZGF0YSA9IGAke2NvbG9yKGRhdGEpfSR7XCIgXCIucmVwZWF0KG9wdGlvbnMud2lkdGhzW2pdIC0gZGF0YUxlbmd0aCl9YFxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGRhdGEgPSBgJHtcIiBcIi5yZXBlYXQob3B0aW9ucy53aWR0aHNbal0gLSBkYXRhTGVuZ3RoKX0ke2NvbG9yKGRhdGEpfWBcclxuICAgICAgfVxyXG4gICAgICBsaW5lICs9IGDilIIgJHtkYXRhfSBgXHJcbiAgICB9XHJcbiAgICBjb25zb2xlLmluZm8oYCR7aW5kZW50fSR7bGluZX3ilIJgKVxyXG4gIH1cclxuICBoZWFkbGluZSA9IG9wdGlvbnMud2lkdGhzLm1hcChtYXhXaWR0aCA9PiBcIuKUgFwiLnJlcGVhdChtYXhXaWR0aCkpXHJcbiAgY29uc29sZS5pbmZvKGAke2luZGVudH3ilJTilIAke2hlYWRsaW5lLmpvaW4oXCLilIDilLTilIBcIil94pSA4pSYYClcclxufVxyXG5cclxuZnVuY3Rpb24gdHJhbnNwb3NlIChyZWNvcmRzLCBudW1Db2x1bW5zKSB7XHJcbiAgY29uc3QgY29sdW1ucyA9IFtdXHJcbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IG51bUNvbHVtbnM7IGluZGV4KyspIHtcclxuICAgIGNvbHVtbnMucHVzaChyZWNvcmRzLm1hcChyb3cgPT4gcm93W2luZGV4XSkpXHJcbiAgfVxyXG4gIHJldHVybiBjb2x1bW5zXHJcbn1cclxuXHJcbmZ1bmN0aW9uIHR4SnNvblJlcGxhY2VyIChrZXksIHZhbHVlKSB7XHJcbiAgc3dpdGNoIChrZXkpIHtcclxuICAgIGNhc2UgXCJieXRlc1wiOlxyXG4gICAgY2FzZSBcImRlclwiOlxyXG4gICAgICByZXR1cm4gdG9IZXhTdHJpbmcodmFsdWUsIHRydWUpXHJcbiAgICBjYXNlIFwidHhcIjpcclxuICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlLCB0eEpzb25SZXBsYWNlcilcclxuICAgIGNhc2UgXCJjaGFuZ2VcIjpcclxuICAgIGNhc2UgXCJmZWVzXCI6XHJcbiAgICBjYXNlIFwidmFsdWVcIjpcclxuICAgICAgcmV0dXJuIHBhcnNlSW50KHZhbHVlKSAvIDEwICoqIDlcclxuICAgIGRlZmF1bHQ6XHJcbiAgICAgIHJldHVybiB2YWx1ZVxyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gdHhSZWNlaXB0SnNvblJlcGxhY2VyIChrZXksIHZhbHVlKSB7XHJcbiAgc3dpdGNoIChrZXkpIHtcclxuICAgIGNhc2UgXCJieXRlc1wiOlxyXG4gICAgY2FzZSBcImRlclwiOlxyXG4gICAgICByZXR1cm4gdG9IZXhTdHJpbmcodmFsdWUsIHRydWUpXHJcbiAgICBjYXNlIFwidHhcIjpcclxuICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlLCB0eEpzb25SZXBsYWNlcilcclxuICAgIGNhc2UgXCJjaGFuZ2VcIjpcclxuICAgIGNhc2UgXCJmZWVzXCI6XHJcbiAgICBjYXNlIFwidmFsdWVcIjpcclxuICAgICAgcmV0dXJuIHBhcnNlSW50KHZhbHVlPy5wZWRyb3MpIC8gMTAgKiogOVxyXG4gICAgY2FzZSBcInRpbWVzdGFtcFwiOlxyXG4gICAgICByZXR1cm4gbW9tZW50LnVuaXgodmFsdWUpLmZvcm1hdChcIk1NTU0gRG8gWVlZWSwgaDptbTpzcyBhXCIpXHJcbiAgICBkZWZhdWx0OlxyXG4gICAgICByZXR1cm4gdmFsdWVcclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHRyYWNlVHJhbnNhY3Rpb25PbkNoZWNrcG9pbnQgKHJlY2VpcHQpIHtcclxuICBpZiAocmVjZWlwdD8uY29uZmlybWF0aW9ucykge1xyXG4gICAgY29uc29sZS5pbmZvKGAgPiBDaGVja3BvaW50ICMke2NvbW1hcyhyZWNlaXB0LmNvbmZpcm1hdGlvbnMpfS4uLmApXHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiB0cmFjZVRyYW5zYWN0aW9uT25TdGF0dXNDaGFuZ2UgKHJlY2VpcHQpIHtcclxuICBjb25zdCBjYXB0aW9ucyA9IHtcclxuICAgIHBlbmRpbmc6IFwiQXdhaXRpbmcgcmVsYXkuLi5cIixcclxuICAgIC8vIGNvbmZpcm1lZDogXCJUcmFuc2FjdGlvbiBjb25maXJtZWQ6XCIsXHJcbiAgICAvLyBmaW5hbGl6ZWQ6IFwiVHJhbnNhY3Rpb24gZmluYWxpemVkOlwiLFxyXG4gICAgcmVsYXllZDogXCJBd2FpdGluZyBpbmNsdXNpb24uLi5cIixcclxuICAgIG1pbmVkOiBcIkF3YWl0aW5nIGNvbmZpcm1hdGlvbnMuLi5cIixcclxuICB9XHJcbiAgY29uc3QgY2FwdGlvbiA9IGNhcHRpb25zW3JlY2VpcHQuc3RhdHVzXVxyXG4gIGlmIChjYXB0aW9uKSBjb25zb2xlLmluZm8oYCA+ICR7Y2FwdGlvbnNbcmVjZWlwdC5zdGF0dXNdfWApXHJcbiAgaWYgKFtcImZpbmFsaXplZFwiLCBcImNvbmZpcm1lZFwiXS5pbmNsdWRlcyhyZWNlaXB0LnN0YXR1cykpIHtcclxuICAgIGNvbnNvbGUuaW5mbyhgID4gQmxvY2sgaGFzaDogICAke2dyYXkocmVjZWlwdD8uYmxvY2tIYXNoKX1gKVxyXG4gICAgY29uc29sZS5pbmZvKGAgPiBCbG9jayBtaW5lcjogICR7Y3lhbihyZWNlaXB0Py5ibG9ja01pbmVyKX1gKTtcclxuICAgIGNvbnNvbGUuaW5mbyhgID4gQmxvY2sgZXBvY2g6ICAke3doaXRlKGNvbW1hcyhyZWNlaXB0Py5ibG9ja0Vwb2NoKSl9YClcclxuICAgIGNvbnNvbGUuaW5mbyhgID4gSW5jbHVkZWQgYXQ6ICAke2dyZWVuKG1vbWVudC51bml4KHJlY2VpcHQ/LmJsb2NrVGltZXN0YW1wKS5mb3JtYXQoXCJNTU1NIERvIFlZWVksIGg6bW06c3MgYVwiKSl9YClcclxuICAgIGNvbnNvbGUuaW5mbyhgID4gJHtyZWNlaXB0LnN0YXR1c1swXS50b1VwcGVyQ2FzZSgpICsgcmVjZWlwdC5zdGF0dXMuc2xpY2UoMSl9IGF0OiAke21ncmVlbihtb21lbnQudW5peChyZWNlaXB0LnRpbWVzdGFtcCkuZm9ybWF0KFwiTU1NTSBEbyBZWVlZLCBoOm1tOnNzIGFcIikpfWApXHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiB0cmFjZVRyYW5zYWN0aW9uUmVjZWlwdCAocmVjZWlwdCkge1xyXG4gIGNvbnN0IGNhcHRpb25zID0ge1xyXG4gICAgRGF0YVJlcXVlc3Q6IFwiID4gRFJUIGhhc2g6ICAgICBcIixcclxuICAgIFZhbHVlVHJhbnNmZXI6IFwiID4gVlRUIGhhc2g6ICAgICBcIixcclxuICB9XHJcbiAgY29uc29sZS5pbmZvKGAke2NhcHRpb25zW3JlY2VpcHQudHlwZV0gfHwgXCIgPiBUWCBoYXNoOiAgICAgIFwifSR7d2hpdGUocmVjZWlwdC5oYXNoKX1gKVxyXG4gIGlmIChyZWNlaXB0Py5kcm9IYXNoKSBjb25zb2xlLmluZm8oYCA+IERSTyBoYXNoOiAgICAgJHtncmVlbihyZWNlaXB0LmRyb0hhc2gpfWApXHJcbiAgaWYgKHJlY2VpcHQ/LnJhZEhhc2gpIGNvbnNvbGUuaW5mbyhgID4gUkFEIGhhc2g6ICAgICAke21ncmVlbihyZWNlaXB0LnJhZEhhc2gpfWApXHJcbiAgaWYgKHJlY2VpcHQ/LmRyb1NMQSkgY29uc29sZS5pbmZvKGAgPiBTTEEgcGFyYW1zOiAgICR7SlNPTi5zdHJpbmdpZnkocmVjZWlwdC5kcm9TTEEpfWApXHJcbiAgaWYgKHJlY2VpcHQ/LndpdGhkcmF3ZXIpIHtcclxuICAgIGlmIChyZWNlaXB0Py52YWxpZGF0b3IpIHtcclxuICAgICAgY29uc29sZS5pbmZvKGAgPiBWYWxpZGF0b3I6ICAgICR7bWN5YW4ocmVjZWlwdC52YWxpZGF0b3IpfWApXHJcbiAgICB9XHJcbiAgICBjb25zb2xlLmluZm8oYCA+IFdpdGhkcmF3ZXI6ICAgJHttbWFnZW50YShyZWNlaXB0LndpdGhkcmF3ZXIpfWApXHJcbiAgfSBlbHNlIHtcclxuICAgIGNvbnN0IHNpZ25lcnMgPSBBcnJheS5pc0FycmF5KHJlY2VpcHQuZnJvbSkgPyByZWNlaXB0LmZyb20gOiBbcmVjZWlwdC5mcm9tXVxyXG4gICAgY29uc29sZS5pbmZvKGAgPiBTaWduZXIvczogICAgICR7bW1hZ2VudGEoc2lnbmVyc1swXSl9YClcclxuICAgIHNpZ25lcnMuc2xpY2UoMSkuZm9yRWFjaChzaWduZXIgPT4ge1xyXG4gICAgICBjb25zb2xlLmluZm8oYCAgICAgICAgICAgICAgICAgJHttbWFnZW50YShzaWduZXIpfWApXHJcbiAgICB9KVxyXG4gIH1cclxuICBpZiAocmVjZWlwdD8ucmVjaXBpZW50cykge1xyXG4gICAgY29uc29sZS5pbmZvKGAgPiBSZWNpcGllbnQvczogICR7XHJcbiAgICAgIG1ibHVlKHJlY2VpcHQucmVjaXBpZW50cy5maWx0ZXIoKHBraCwgaW5kZXgsIGFycmF5KSA9PiBpbmRleCA9PT0gYXJyYXkuaW5kZXhPZihwa2gpKSlcclxuICAgIH1gKVxyXG4gIH1cclxuICBpZiAocmVjZWlwdD8uZmVlcykgY29uc29sZS5pbmZvKGAgPiBGZWU6ICAgICAgICAgICR7eWVsbG93KHJlY2VpcHQuZmVlcy50b1N0cmluZygyKSl9YClcclxuICBpZiAocmVjZWlwdD8udmFsdWUpIGNvbnNvbGUuaW5mbyhgID4gVmFsdWU6ICAgICAgICAke215ZWxsb3cocmVjZWlwdC52YWx1ZS50b1N0cmluZygyKSl9YClcclxuICBpZiAocmVjZWlwdD8ud2VpZ2h0KSBjb25zb2xlLmluZm8oYCA+IFdlaWdodDogICAgICAgJHttZ3JlZW4oY29tbWFzKHJlY2VpcHQud2VpZ2h0KSl9YClcclxuICBpZiAocmVjZWlwdD8ud2l0bmVzc2VzKSB7XHJcbiAgICBjb25zb2xlLmluZm8oYCA+IFdpdG5lc3NlczogICAgJHtyZWNlaXB0LndpdG5lc3Nlc31gKVxyXG4gIH1cclxufVxyXG5cclxuYXN5bmMgZnVuY3Rpb24gdHJhY2VUcmFuc2FjdGlvbiAodHJhbnNtaXR0ZXIsIG9wdGlvbnMpIHtcclxuICBjb25zdCBjb2xvciA9IG9wdGlvbnM/LmNvbG9yIHx8ICgoeCkgPT4gYFxceDFiWzMwOzQ1bSR7eH1cXHgxYlswbWApXHJcbiAgbGV0IHJlY2VpcHQgPSBhd2FpdCB0cmFuc21pdHRlci5zaWduVHJhbnNhY3Rpb24ob3B0aW9ucywgb3B0aW9ucz8ucmVsb2FkKVxyXG4gIGlmIChvcHRpb25zPy52ZXJib3NlKSB7XHJcbiAgICBjb25zb2xlLmluZm8oXHJcbiAgICAgIGBcXG4ke2dyYXkoSlNPTi5zdHJpbmdpZnkocmVjZWlwdC50eCwgdHhKc29uUmVwbGFjZXIpKX1gXHJcbiAgICApXHJcbiAgfVxyXG4gIGlmIChvcHRpb25zPy5oZWFkbGluZSkge1xyXG4gICAgY29uc29sZS5pbmZvKGBcXG4gJHtjb2xvcihgICAke29wdGlvbnMuaGVhZGxpbmV9ICBgKX1cXG5gKVxyXG4gIH1cclxuICB0cmFjZVRyYW5zYWN0aW9uUmVjZWlwdChyZWNlaXB0KVxyXG4gIGlmICghb3B0aW9ucz8uZm9yY2UpIHtcclxuICAgIC8vIHByb21wdCB1c2VyIGNvbmZpcm1hdGlvblxyXG4gICAgY29uc29sZS5pbmZvKClcclxuICAgIGNvbnN0IGFuc3dlciA9IGF3YWl0IHJlcXVpcmUoXCJpbnF1aXJlclwiKS5jcmVhdGVQcm9tcHRNb2R1bGUoKShbe1xyXG4gICAgICBtZXNzYWdlOiBcIlNlbmQgdHJhbnNhY3Rpb24/XCIsXHJcbiAgICAgIHR5cGU6IFwiY29uZmlybVwiLFxyXG4gICAgICBuYW1lOiBcImNvbnRpbnVlXCIsXHJcbiAgICAgIGRlZmF1bHQ6IGZhbHNlLFxyXG4gICAgfV0pXHJcbiAgICBpZiAoIWFuc3dlci5jb250aW51ZSkge1xyXG4gICAgICByZXR1cm4gcmVjZWlwdFxyXG4gICAgfVxyXG4gIH1cclxuICB0cnkge1xyXG4gICAgY29uc29sZS5pbmZvKClcclxuICAgIHJlY2VpcHQgPSBhd2FpdCB0cmFuc21pdHRlci5zZW5kVHJhbnNhY3Rpb24oKVxyXG4gICAgaWYgKG9wdGlvbnM/LmF3YWl0IHx8IG9wdGlvbnM/LmNvbmZpcm1hdGlvbnMgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICByZWNlaXB0ID0gYXdhaXQgdHJhbnNtaXR0ZXIuY29uZmlybVRyYW5zYWN0aW9uKHJlY2VpcHQuaGFzaCwge1xyXG4gICAgICAgIGNvbmZpcm1hdGlvbnM6IG9wdGlvbnM/LmNvbmZpcm1hdGlvbnMgfHwgMCxcclxuICAgICAgICBvbkNoZWNrcG9pbnQ6IHRyYWNlVHJhbnNhY3Rpb25PbkNoZWNrcG9pbnQsXHJcbiAgICAgICAgb25TdGF0dXNDaGFuZ2U6IHRyYWNlVHJhbnNhY3Rpb25PblN0YXR1c0NoYW5nZSxcclxuICAgICAgfSlcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IGRhdGEgPSB7IHN0YXR1czogcmVjZWlwdD8uc3RhdHVzLCB0aW1lc3RhbXA6IHJlY2VpcHQ/LnRpbWVzdGFtcCB8fCBNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKSB9XHJcbiAgICAgIGNvbnNvbGUuaW5mbyhkYXRhKVxyXG4gICAgfVxyXG4gIH0gY2F0Y2ggKGVycikge1xyXG4gICAgaWYgKGVycj8uaW5GbGlnaHQgJiYgZXJyLmluRmxpZ2h0KSB7XHJcbiAgICAgIGNvbnNvbGUuaW5mbyhgXFxuJHtncmF5KEpTT04uc3RyaW5naWZ5KGVyci5pbkZsaWd0Py5tZXNzYWdlLCB0eFJlY2VpcHRKc29uUmVwbGFjZXIpKX1gKVxyXG4gICAgfVxyXG4gICAgdGhyb3cgZXJyXHJcbiAgfVxyXG4gIHJldHVybiByZWNlaXB0XHJcbn1cclxuXHJcbm1vZHVsZS5leHBvcnRzID0ge1xyXG4gIGNvbG9yczoge1xyXG4gICAgYmJsdWUsXHJcbiAgICBiY3lhbixcclxuICAgIGJncmVlbixcclxuICAgIGJsdWUsXHJcbiAgICBicmVkLFxyXG4gICAgYnZpb2xldCxcclxuICAgIGN5YW4sXHJcbiAgICBncmF5LFxyXG4gICAgZ3JlZW4sXHJcbiAgICBtYWdlbnRhLFxyXG4gICAgcmVkLFxyXG4gICAgd2hpdGUsXHJcbiAgICB5ZWxsb3csXHJcbiAgICBub3JtYWwsXHJcbiAgICBsY3lhbixcclxuICAgIGxncmF5LFxyXG4gICAgbGdyZWVuLFxyXG4gICAgbG1hZ2VudGEsXHJcbiAgICBseWVsbG93LFxyXG4gICAgbWJsdWUsXHJcbiAgICBtY3lhbixcclxuICAgIG1ncmVlbixcclxuICAgIG1tYWdlbnRhLFxyXG4gICAgbXJlZCxcclxuICAgIG15ZWxsb3csXHJcbiAgfSxcclxuICBjb2xvcnN0cmlwLFxyXG4gIGNvbW1hcyxcclxuICB3aG9sZV93aXRzLFxyXG4gIHRvRml4ZWRUcnVuYyxcclxuICBjb3VudExlYXZlcyxcclxuICBleGVjUmFkb25CeXRlY29kZSxcclxuICBkZWxldGVFeHRyYUZsYWdzLFxyXG4gIGV4dHJhY3RGcm9tQXJncyxcclxuICBmcm9tSGV4U3RyaW5nLFxyXG4gIGlzSGV4U3RyaW5nLFxyXG4gIGlzSGV4U3RyaW5nT2ZMZW5ndGgsXHJcbiAgdG9IZXhTdHJpbmcsXHJcbiAgcGFyc2VVUkwsXHJcbiAgaXBJc1ByaXZhdGVPckxvY2FsaG9zdCxcclxuICBzaG93VXNhZ2UsXHJcbiAgc2hvd1VzYWdlRXJyb3IsXHJcbiAgc2hvd1VzYWdlU3ViY29tbWFuZCxcclxuICBzaG93VmVyc2lvbixcclxuICB0b29sa2l0UnVuLFxyXG4gIHRvVXBwZXJDYW1lbENhc2UsXHJcbiAgdG9VdGY4QXJyYXksXHJcbiAgdXRmOEFycmF5VG9TdHIsXHJcbiAgcHJvbXB0LFxyXG4gIHByb21wdGVyLFxyXG4gIHRyYWNlQ2hlY2tsaXN0cyxcclxuICB0cmFjZUhlYWRlcixcclxuICB0cmFjZVRhYmxlLFxyXG4gIHRyYWNlVHJhbnNhY3Rpb24sXHJcbiAgdHJhY2VUcmFuc2FjdGlvbk9uU3RhdHVzQ2hhbmdlLFxyXG4gIHRyYWNlVHJhbnNhY3Rpb25PbkNoZWNrcG9pbnQsXHJcbiAgdHJhY2VUcmFuc2FjdGlvblJlY2VpcHQsXHJcbiAgY2hlY2tScGNXaWxkY2FyZHMsXHJcbiAgaXNXaWxkY2FyZCxcclxuICBnZXRXaWxkY2FyZHNDb3VudEZyb21TdHJpbmcsXHJcbiAgcmVwbGFjZVdpbGRjYXJkcyxcclxuICBzcGxpY2VXaWxkY2FyZCxcclxuICB0eEpzb25SZXBsYWNlcixcclxufVxyXG4iXX0=
|