@witnet/ethers
Version:
Wit/Oracle Ethers Framework package for EVM-compatible projects
319 lines • 43.9 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
var __exportStar = (this && this.__exportStar) || function(m, exports) {
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.ABIs = void 0;
exports.fetchWitOracleFramework = fetchWitOracleFramework;
exports.getEvmNetworkAddresses = getEvmNetworkAddresses;
exports.getEvmNetworkByChainId = getEvmNetworkByChainId;
exports.getEvmNetworkSymbol = getEvmNetworkSymbol;
exports.getEvmNetworks = getEvmNetworks;
exports.isEvmNetworkMainnet = isEvmNetworkMainnet;
exports.isEvmNetworkSupported = isEvmNetworkSupported;
exports.abiDecodeQueryStatus = abiDecodeQueryStatus;
exports.abiEncodeDataPushReport = abiEncodeDataPushReport;
exports.abiEncodeDataPushReportMessage = abiEncodeDataPushReportMessage;
exports.abiEncodeDataPushReportDigest = abiEncodeDataPushReportDigest;
exports.abiEncodePriceFeedUpdateConditions = abiEncodePriceFeedUpdateConditions;
exports.abiEncodeWitOracleQueryParams = abiEncodeWitOracleQueryParams;
exports.abiEncodeRadonAsset = abiEncodeRadonAsset;
const sdk_1 = require("@witnet/sdk");
const solidity_1 = __importDefault(require("@witnet/solidity"));
const cbor = __importStar(require("cbor"));
const ethers_1 = require("ethers");
const lodash_merge_1 = __importDefault(require("lodash.merge"));
const wrappers_1 = require("./wrappers");
const helpers_js_1 = require("../bin/helpers.js");
__exportStar(require("@witnet/sdk/utils"), exports);
exports.ABIs = solidity_1.default.ABIs;
async function fetchWitOracleFramework(provider) {
return provider
.getNetwork()
.then(async (value) => {
const network = getEvmNetworkByChainId(Number(value.chainId));
if (network) {
const exclusions = [
"WitOracleRadonRequestFactoryModals",
"WitOracleRadonRequestFactoryTemplates",
];
const targets = [
"WitOracle",
"WitOracleRadonRegistry",
"WitOracleRadonRequestFactory",
"WitPriceFeeds",
"WitPriceFeedsLegacy",
"WitRandomnessV2",
"WitRandomnessV3",
];
const contracts = Object.fromEntries(Object.entries((0, helpers_js_1.flattenObject)((0, helpers_js_1.getNetworkArtifacts)(network)))
.map(([key, value]) => [key.split(".").pop(), value]));
let { addresses } = (0, helpers_js_1.readWitnetJsonFiles)("addresses");
addresses = (0, lodash_merge_1.default)((0, helpers_js_1.getNetworkAddresses)(network), addresses[network]);
return await Promise.all(Object.entries((0, helpers_js_1.flattenObject)(addresses))
.map(([key, address]) => [
key.split(".").pop(),
address
])
.sort(([a], [b]) => a.localeCompare(b))
.filter(([key,]) => {
const base = _findBase(contracts, key);
return (targets.includes(key)
&& !exclusions.includes(base)
&& (exports.ABIs[key] || exports.ABIs[base]));
})
.map(async ([key, address]) => {
const bytecode = await provider.getCode(address).catch(err => console.error(`Warning: ${key}: ${err}`));
if (bytecode?.length && bytecode.length > 2) {
let impl, isUpgradable = false, interfaceId, version;
const appliance = new ethers_1.Contract(address, exports.ABIs.WitAppliance, provider);
try {
impl = await appliance.class.staticCall();
}
catch {
impl = key;
}
try {
interfaceId = await appliance.specs.staticCall();
}
catch { }
const upgradable = new ethers_1.Contract(address, exports.ABIs.WitnetUpgradableBase, provider);
try {
isUpgradable = await upgradable.isUpgradable.staticCall();
}
catch {
isUpgradable = false;
}
try {
version = await upgradable.version.staticCall();
}
catch { }
return [
key,
{
abi: exports.ABIs[key] || exports.ABIs[impl],
address,
class: impl,
gitHash: _versionLastCommitOf(version),
interfaceId,
isUpgradable,
semVer: _versionTagOf(version),
version,
}
];
}
else {
return [key, undefined];
}
}))
.then(artifacts => artifacts.filter(([, artifact]) => artifact !== undefined))
.then(async (artifacts) => {
if (Object.fromEntries(artifacts).WitOracle) {
const signer = await provider.getSigner();
const witOracle = new wrappers_1.WitOracle(signer, network);
let witOracleRadonRegistry;
if (Object.fromEntries(artifacts).WitOraclRadonRegistry) {
witOracleRadonRegistry = new wrappers_1.WitOracleRadonRegistry(signer, network);
}
artifacts = await Promise.all(artifacts.map(async ([key, artifact]) => {
let wrapper;
switch (key) {
case "WitOracle":
wrapper = witOracle;
break;
case "WitOracleRadonRegistry":
wrapper = witOracleRadonRegistry;
break;
case "WitOracleRadonRequestFactory":
if (witOracleRadonRegistry) {
wrapper = await wrappers_1.WitOracleRadonRequestFactory.deployed(witOracle, witOracleRadonRegistry);
}
;
break;
case "WitPriceFeeds":
wrapper = await wrappers_1.WitPriceFeeds.at(witOracle, artifact.address);
break;
case "WitPriceFeedsLegacy":
wrapper = await wrappers_1.WitPriceFeedsLegacy.at(witOracle, artifact.address);
break;
default:
if (key.startsWith("WitRandomness") || key.startsWith("WitnetRandomness")) {
wrapper = await wrappers_1.WitRandomness.at(witOracle, artifact.address);
}
}
return [
key,
{ ...artifact, wrapper }
];
}));
}
return Object.fromEntries(artifacts);
});
}
else {
return {};
}
});
}
function _findBase(obj, value) {
return Object.entries(obj).find(([, impl]) => impl === value)?.[0] || "";
}
function _versionTagOf(version) { return version?.slice(0, 5); }
function _versionLastCommitOf(version) {
if (version) {
return version?.length >= 21 ? version?.slice(-15, -8) : "";
}
else {
return undefined;
}
}
function getEvmNetworkAddresses(network) {
return (0, helpers_js_1.getNetworkAddresses)(network);
}
function getEvmNetworkByChainId(chainId) {
const found = Object.entries(solidity_1.default.supportedNetworks()).find(([, config]) => config?.network_id.toString() === chainId.toString());
if (found)
return found[0];
else
return undefined;
}
function getEvmNetworkSymbol(network) {
const found = Object.entries(solidity_1.default.supportedNetworks()).find(([key,]) => key.toLowerCase() === network.toLowerCase());
if (found)
return found[1]?.symbol;
else
return "ETH";
}
function getEvmNetworks() {
return Object.keys(solidity_1.default.supportedNetworks());
}
function isEvmNetworkMainnet(network) {
const found = Object.entries(solidity_1.default.supportedNetworks()).find(([key,]) => key === network.toLowerCase());
return found?.[1].mainnet;
}
function isEvmNetworkSupported(network) {
return solidity_1.default.supportsNetwork(network);
}
function abiDecodeQueryStatus(status) {
switch (status) {
case 1n: return "Posted";
case 2n: return "Reported";
case 3n: return "Finalized";
case 4n: return "Delayed";
case 5n: return "Expired";
case 6n: return "Disputed";
default: return "Void";
}
}
function _intoDataPushReportSolidity(report) {
return {
drTxHash: `0x${report.hash}`,
queryParams: {
witnesses: report.query?.witnesses || 0,
unitaryReward: report.query?.unitary_reward || 0n,
resultMaxSize: 0,
},
queryRadHash: `0x${report.query?.rad_hash}`,
resultCborBytes: `0x${report.result?.cbor_bytes}`,
resultTimestamp: report.result?.timestamp || 0,
};
}
function abiEncodeDataPushReport(report) {
const internal = _intoDataPushReportSolidity(report);
return [
internal.drTxHash,
internal.queryRadHash,
abiEncodeWitOracleQueryParams(internal.queryParams),
internal.resultTimestamp,
internal.resultCborBytes,
];
}
function abiEncodeDataPushReportMessage(report) {
return ethers_1.AbiCoder.defaultAbiCoder().encode(["bytes32", "bytes32", "(uint16, uint16, uint64)", "uint64", "bytes"], abiEncodeDataPushReport(report));
}
function abiEncodeDataPushReportDigest(report) {
return (0, ethers_1.solidityPackedKeccak256)(["bytes"], [abiEncodeDataPushReportMessage(report)]);
}
function abiEncodePriceFeedUpdateConditions(conditions) {
return [
conditions.callbackGas,
conditions.computeEMA,
conditions.cooldownSecs,
conditions.heartbeatSecs,
Math.floor(conditions.maxDeviationPercentage * 10),
conditions.minWitnesses,
];
}
function abiEncodeWitOracleQueryParams(queryParams) {
return [
queryParams?.resultMaxSize || 0,
queryParams?.witnesses || 0,
queryParams?.unitaryReward || 0,
];
}
function abiEncodeRadonAsset(asset) {
if (asset instanceof sdk_1.Witnet.Radon.RadonRetrieval) {
return [
asset.method,
asset.url || "",
asset.body || "",
asset?.headers ? Object.entries(asset.headers) : [],
abiEncodeRadonAsset(asset.script) || "0x80",
];
}
else if (asset instanceof sdk_1.Witnet.Radon.types.RadonScript) {
return asset.toBytecode();
}
else if (asset instanceof sdk_1.Witnet.Radon.reducers.Class) {
return [
asset.opcode,
asset.filters?.map(filter => abiEncodeRadonAsset(filter)) || [],
];
}
else if (asset instanceof sdk_1.Witnet.Radon.filters.Class) {
return [
asset.opcode,
`0x${asset.args ? cbor.encode(asset.args).toString("hex") : ""}`
];
}
else {
throw new TypeError(`Not a Radon asset: ${asset}`);
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW1DQSwwREE2R0M7QUFjRCx3REFFQztBQUVELHdEQUlDO0FBRUQsa0RBSUM7QUFFRCx3Q0FFQztBQUVELGtEQUdDO0FBRUQsc0RBRUM7QUFFRCxvREFVQztBQTBDRCwwREFTQztBQUVELHdFQUtDO0FBRUQsc0VBS0M7QUFFRCxnRkFTQztBQUVELHNFQU1DO0FBQ0Qsa0RBNEJDO0FBdFRELHFDQUFvQztBQUNwQyxnRUFBa0M7QUFDbEMsMkNBQTRCO0FBQzVCLG1DQUFxRjtBQUNyRixnRUFBK0M7QUFFL0MseUNBT21CO0FBRW5CLGtEQU0wQjtBQVUxQixvREFBaUM7QUFFcEIsUUFBQSxJQUFJLEdBQUcsa0JBQUcsQ0FBQyxJQUFJLENBQUM7QUFFdEIsS0FBSyxVQUFVLHVCQUF1QixDQUFDLFFBQXlCO0lBQ25FLE9BQU8sUUFBUTtTQUNWLFVBQVUsRUFBRTtTQUNaLElBQUksQ0FBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEVBQUU7UUFDaEIsTUFBTSxPQUFPLEdBQUcsc0JBQXNCLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFBO1FBQzdELElBQUksT0FBTyxFQUFFLENBQUM7WUFDVixNQUFNLFVBQVUsR0FBRztnQkFDZixvQ0FBb0M7Z0JBQ3BDLHVDQUF1QzthQUMxQyxDQUFBO1lBQ0QsTUFBTSxPQUFPLEdBQUc7Z0JBQ1osV0FBVztnQkFDWCx3QkFBd0I7Z0JBQ3hCLDhCQUE4QjtnQkFDOUIsZUFBZTtnQkFDZixxQkFBcUI7Z0JBQ3JCLGlCQUFpQjtnQkFDakIsaUJBQWlCO2FBQ3BCLENBQUE7WUFDRCxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUNoQyxNQUFNLENBQUMsT0FBTyxDQUFD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QUFBO0lBRUwsQ0FBQztTQUFNLENBQUM7UUFDSixNQUFNLElBQUksU0FBUyxDQUFDLHNCQUFzQixLQUFLLEVBQUUsQ0FBQyxDQUFBO0lBQ3RELENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgV2l0bmV0IH0gZnJvbSBcIkB3aXRuZXQvc2RrXCJcclxuaW1wb3J0IFdTQiBmcm9tIFwiQHdpdG5ldC9zb2xpZGl0eVwiXHJcbmltcG9ydCAqIGFzIGNib3IgZnJvbSBcImNib3JcIlxyXG5pbXBvcnQgeyBBYmlDb2RlciwgQ29udHJhY3QsIEpzb25ScGNQcm92aWRlciwgc29saWRpdHlQYWNrZWRLZWNjYWsyNTYgfSBmcm9tIFwiZXRoZXJzXCJcclxuaW1wb3J0IHsgZGVmYXVsdCBhcyBtZXJnZSB9IGZyb20gXCJsb2Rhc2gubWVyZ2VcIlxyXG5cclxuaW1wb3J0IHtcclxuICAgIFdpdE9yYWNsZSxcclxuICAgIFdpdE9yYWNsZVJhZG9uUmVnaXN0cnksXHJcbiAgICBXaXRPcmFjbGVSYWRvblJlcXVlc3RGYWN0b3J5LFxyXG4gICAgV2l0UHJpY2VGZWVkcyxcclxuICAgIFdpdFByaWNlRmVlZHNMZWdhY3ksXHJcbiAgICBXaXRSYW5kb21uZXNzLFxyXG59IGZyb20gXCIuL3dyYXBwZXJzXCJcclxuXHJcbmltcG9ydCB7XHJcbiAgICBmbGF0dGVuT2JqZWN0LFxyXG4gICAgZ2V0TmV0d29ya0FkZHJlc3NlcyBhcyBfZ2V0TmV0d29ya0FkZHJlc3NlcyxcclxuICAgIGdldE5ldHdvcmtBcnRpZmFjdHMgYXMgX2dldE5ldHdvcmtBcnRpZmFjdHMsXHJcbiAgICBnZXROZXR3b3JrQ29uc3RydWN0b3JBcmdzIGFzIF9nZXROZXR3b3JrQ29uc3RydWN0b3JBcmdzLFxyXG4gICAgcmVhZFdpdG5ldEpzb25GaWxlc1xyXG59IGZyb20gXCIuLi9iaW4vaGVscGVycy5qc1wiXHJcblxyXG5pbXBvcnQgeyBcclxuICAgIERhdGFQdXNoUmVwb3J0LCBcclxuICAgIFByaWNlRmVlZFVwZGF0ZUNvbmRpdGlvbnMsIFxyXG4gICAgV2l0T3JhY2xlQXJ0aWZhY3QsIFxyXG4gICAgV2l0T3JhY2xlUXVlcnlQYXJhbXMsIFxyXG4gICAgV2l0T3JhY2xlUXVlcnlTdGF0dXMgXHJcbn0gZnJvbSBcIi4vdHlwZXNcIlxyXG5cclxuZXhwb3J0ICogZnJvbSBcIkB3aXRuZXQvc2RrL3V0aWxzXCJcclxuXHJcbmV4cG9ydCBjb25zdCBBQklzID0gV1NCLkFCSXM7XHJcblxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmV0Y2hXaXRPcmFjbGVGcmFtZXdvcmsocHJvdmlkZXI6IEpzb25ScGNQcm92aWRlcik6IFByb21pc2U8eyBba2V5OiBzdHJpbmddOiBXaXRPcmFjbGVBcnRpZmFjdCB9PiB7XHJcbiAgICByZXR1cm4gcHJvdmlkZXJcclxuICAgICAgICAuZ2V0TmV0d29yaygpXHJcbiAgICAgICAgLnRoZW4oYXN5bmMgdmFsdWUgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBuZXR3b3JrID0gZ2V0RXZtTmV0d29ya0J5Q2hhaW5JZChOdW1iZXIodmFsdWUuY2hhaW5JZCkpXHJcbiAgICAgICAgICAgIGlmIChuZXR3b3JrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBleGNsdXNpb25zID0gW1xyXG4gICAgICAgICAgICAgICAgICAgIFwiV2l0T3JhY2xlUmFkb25SZXF1ZXN0RmFjdG9yeU1vZGFsc1wiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwiV2l0T3JhY2xlUmFkb25SZXF1ZXN0RmFjdG9yeVRlbXBsYXRlc1wiLFxyXG4gICAgICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0cyA9IFtcclxuICAgICAgICAgICAgICAgICAgICBcIldpdE9yYWNsZVwiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwiV2l0T3JhY2xlUmFkb25SZWdpc3RyeVwiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwiV2l0T3JhY2xlUmFkb25SZXF1ZXN0RmFjdG9yeVwiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwiV2l0UHJpY2VGZWVkc1wiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwiV2l0UHJpY2VGZWVkc0xlZ2FjeVwiLFxyXG4gICAgICAgICAgICAgICAgICAgIFwiV2l0UmFuZG9tbmVzc1YyXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgXCJXaXRSYW5kb21uZXNzVjNcIixcclxuICAgICAgICAgICAgICAgIF1cclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRyYWN0cyA9IE9iamVjdC5mcm9tRW50cmllcyhcclxuICAgICAgICAgICAgICAgICAgICBPYmplY3QuZW50cmllcyhmbGF0dGVuT2JqZWN0KF9nZXROZXR3b3JrQXJ0aWZhY3RzKG5ldHdvcmspKSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBba2V5LnNwbGl0KFwiLlwiKS5wb3AoKSwgdmFsdWVdKVxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIGxldCB7IGFkZHJlc3NlcyB9ID0gcmVhZFdpdG5ldEpzb25GaWxlcyhcImFkZHJlc3Nlc1wiKVxyXG4gICAgICAgICAgICAgICAgYWRkcmVzc2VzID0gbWVyZ2UoX2dldE5ldHdvcmtBZGRyZXNzZXMobmV0d29yayksIGFkZHJlc3Nlc1tuZXR3b3JrXSlcclxuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBQcm9taXNlLmFsbChcclxuICAgICAgICAgICAgICAgICAgICBPYmplY3QuZW50cmllcyhmbGF0dGVuT2JqZWN0KGFkZHJlc3NlcykpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKFtrZXksIGFkZHJlc3NdKSA9PiBbXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkuc3BsaXQoXCIuXCIpLnBvcCgpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBdKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAuc29ydCgoW2FdLCBbYl0pID0+IChhIGFzIHN0cmluZykubG9jYWxlQ29tcGFyZShiKSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcigoW2tleSxdKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlID0gX2ZpbmRCYXNlKGNvbnRyYWN0cywga2V5KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRzLmluY2x1ZGVzKGtleSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAhZXhjbHVzaW9ucy5pbmNsdWRlcyhiYXNlKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChBQklzW2tleV0gfHwgQUJJc1tiYXNlXSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChhc3luYyAoW2tleSwgYWRkcmVzc10pID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJ5dGVjb2RlID0gYXdhaXQgcHJvdmlkZXIuZ2V0Q29kZShhZGRyZXNzKS5jYXRjaChlcnIgPT4gY29uc29sZS5lcnJvcihgV2FybmluZzogJHtrZXl9OiAke2Vycn1gKSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChieXRlY29kZT8ubGVuZ3RoICYmIGJ5dGVjb2RlLmxlbmd0aCA+IDIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW1wbCwgaXNVcGdyYWRhYmxlID0gZmFsc2UsIGludGVyZmFjZUlkLCB2ZXJzaW9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXBwbGlhbmNlID0gbmV3IENvbnRyYWN0KGFkZHJlc3MsIEFCSXMuV2l0QXBwbGlhbmNlLCBwcm92aWRlcilcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeyBpbXBsID0gYXdhaXQgYXBwbGlhbmNlLmNsYXNzLnN0YXRpY0NhbGwoKSB9IGNhdGNoIHsgaW1wbCA9IGtleSB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsgaW50ZXJmYWNlSWQgPSBhd2FpdCBhcHBsaWFuY2Uuc3BlY3Muc3RhdGljQ2FsbCgpIH0gY2F0Y2ggeyB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdXBncmFkYWJsZSA9IG5ldyBDb250cmFjdChhZGRyZXNzLCBBQklzLldpdG5ldFVwZ3JhZGFibGVCYXNlLCBwcm92aWRlcilcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeyBpc1VwZ3JhZGFibGUgPSBhd2FpdCB1cGdyYWRhYmxlLmlzVXBncmFkYWJsZS5zdGF0aWNDYWxsKCkgfSBjYXRjaCB7IGlzVXBncmFkYWJsZSA9IGZhbHNlIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeyB2ZXJzaW9uID0gYXdhaXQgdXBncmFkYWJsZS52ZXJzaW9uLnN0YXRpY0NhbGwoKSB9IGNhdGNoIHsgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJpOiBBQklzW2tleV0gfHwgQUJJc1tpbXBsXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzczogaW1wbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpdEhhc2g6IF92ZXJzaW9uTGFzdENvbW1pdE9mKHZlcnNpb24pLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1VwZ3JhZGFibGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW1WZXI6IF92ZXJzaW9uVGFnT2YodmVyc2lvbiksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGFzIFdpdE9yYWNsZUFydGlmYWN0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW2tleSwgdW5kZWZpbmVkXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICAudGhlbihhcnRpZmFjdHMgPT4gYXJ0aWZhY3RzLmZpbHRlcigoWywgYXJ0aWZhY3RdKSA9PiBhcnRpZmFjdCAhPT0gdW5kZWZpbmVkKSlcclxuICAgICAgICAgICAgICAgICAgICAudGhlbihhc3luYyBhcnRpZmFjdHMgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LmZyb21FbnRyaWVzKGFydGlmYWN0cykuV2l0T3JhY2xlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaWduZXIgPSBhd2FpdCBwcm92aWRlci5nZXRTaWduZXIoKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2l0T3JhY2xlID0gbmV3IFdpdE9yYWNsZShzaWduZXIsIG5ldHdvcmspXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgd2l0T3JhY2xlUmFkb25SZWdpc3RyeTogV2l0T3JhY2xlUmFkb25SZWdpc3RyeVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdC5mcm9tRW50cmllcyhhcnRpZmFjdHMpLldpdE9yYWNsUmFkb25SZWdpc3RyeSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdE9yYWNsZVJhZG9uUmVnaXN0cnkgPSBuZXcgV2l0T3JhY2xlUmFkb25SZWdpc3RyeShzaWduZXIsIG5ldHdvcmspO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJ0aWZhY3RzID0gYXdhaXQgUHJvbWlzZS5hbGwoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJ0aWZhY3RzLm1hcChhc3luYyAoW2tleSwgYXJ0aWZhY3RdKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB3cmFwcGVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoa2V5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiV2l0T3JhY2xlXCI6IHdyYXBwZXIgPSB3aXRPcmFjbGU7IGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcIldpdE9yYWNsZVJhZG9uUmVnaXN0cnlcIjogd3JhcHBlciA9IHdpdE9yYWNsZVJhZG9uUmVnaXN0cnk7IGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcIldpdE9yYWNsZVJhZG9uUmVxdWVzdEZhY3RvcnlcIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAod2l0T3JhY2xlUmFkb25SZWdpc3RyeSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVyID0gYXdhaXQgV2l0T3JhY2xlUmFkb25SZXF1ZXN0RmFjdG9yeS5kZXBsb3llZCh3aXRPcmFjbGUsIHdpdE9yYWNsZVJhZG9uUmVnaXN0cnkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiV2l0UHJpY2VGZWVkc1wiOiB3cmFwcGVyID0gYXdhaXQgV2l0UHJpY2VGZWVkcy5hdCh3aXRPcmFjbGUsIGFydGlmYWN0LmFkZHJlc3MpOyBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJXaXRQcmljZUZlZWRzTGVnYWN5XCI6IHdyYXBwZXIgPSBhd2FpdCBXaXRQcmljZUZlZWRzTGVnYWN5LmF0KHdpdE9yYWNsZSwgYXJ0aWZhY3QuYWRkcmVzcyk7IGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoa2V5LnN0YXJ0c1dpdGgoXCJXaXRSYW5kb21uZXNzXCIpIHx8IGtleS5zdGFydHNXaXRoKFwiV2l0bmV0UmFuZG9tbmVzc1wiKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVyID0gYXdhaXQgV2l0UmFuZG9tbmVzcy5hdCh3aXRPcmFjbGUsIGFydGlmYWN0LmFkZHJlc3MpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAuLi5hcnRpZmFjdCwgd3JhcHBlciB9IGFzIFdpdE9yYWNsZUFydGlmYWN0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKGFydGlmYWN0cylcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG5cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB7fVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIF9maW5kQmFzZShvYmo6IHsgW2s6IHN0cmluZ106IGFueTsgfSwgdmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gT2JqZWN0LmVudHJpZXMob2JqKS5maW5kKChbLCBpbXBsXSkgPT4gaW1wbCA9PT0gdmFsdWUpPy5bMF0gfHwgXCJcIlxyXG59XHJcbmZ1bmN0aW9uIF92ZXJzaW9uVGFnT2YodmVyc2lvbj86IHN0cmluZykgeyByZXR1cm4gdmVyc2lvbj8uc2xpY2UoMCwgNSkgfVxyXG5mdW5jdGlvbiBfdmVyc2lvbkxhc3RDb21taXRPZih2ZXJzaW9uPzogc3RyaW5nKSB7XHJcbiAgICBpZiAodmVyc2lvbikge1xyXG4gICAgICAgIHJldHVybiB2ZXJzaW9uPy5sZW5ndGggPj0gMjEgPyB2ZXJzaW9uPy5zbGljZSgtMTUsIC04KSA6IFwiXCJcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0RXZtTmV0d29ya0FkZHJlc3NlcyhuZXR3b3JrOiBzdHJpbmcpOiBhbnkge1xyXG4gICAgcmV0dXJuIF9nZXROZXR3b3JrQWRkcmVzc2VzKG5ldHdvcmspXHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRFdm1OZXR3b3JrQnlDaGFpbklkKGNoYWluSWQ6IG51bWJlcik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XHJcbiAgICBjb25zdCBmb3VuZCA9IE9iamVjdC5lbnRyaWVzKFdTQi5zdXBwb3J0ZWROZXR3b3JrcygpKS5maW5kKChbLCBjb25maWddOiBbc3RyaW5nLCBhbnldKSA9PiBjb25maWc/Lm5ldHdvcmtfaWQudG9TdHJpbmcoKSA9PT0gY2hhaW5JZC50b1N0cmluZygpKVxyXG4gICAgaWYgKGZvdW5kKSByZXR1cm4gZm91bmRbMF07XHJcbiAgICBlbHNlIHJldHVybiB1bmRlZmluZWQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRFdm1OZXR3b3JrU3ltYm9sKG5ldHdvcms6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBmb3VuZCA9IE9iamVjdC5lbnRyaWVzKFdTQi5zdXBwb3J0ZWROZXR3b3JrcygpKS5maW5kKChba2V5LF06IFtzdHJpbmcsIGFueV0pID0+IGtleS50b0xvd2VyQ2FzZSgpID09PSBuZXR3b3JrLnRvTG93ZXJDYXNlKCkpXHJcbiAgICBpZiAoZm91bmQpIHJldHVybiAoZm91bmRbMV0gYXMgYW55KT8uc3ltYm9sO1xyXG4gICAgZWxzZSByZXR1cm4gXCJFVEhcIlxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0RXZtTmV0d29ya3MoKTogc3RyaW5nW10ge1xyXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKFdTQi5zdXBwb3J0ZWROZXR3b3JrcygpKVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaXNFdm1OZXR3b3JrTWFpbm5ldChuZXR3b3JrOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGZvdW5kID0gT2JqZWN0LmVudHJpZXMoV1NCLnN1cHBvcnRlZE5ldHdvcmtzKCkpLmZpbmQoKFtrZXksXSkgPT4ga2V5ID09PSBuZXR3b3JrLnRvTG93ZXJDYXNlKCkpXHJcbiAgICByZXR1cm4gKGZvdW5kIGFzIGFueSk/LlsxXS5tYWlubmV0XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpc0V2bU5ldHdvcmtTdXBwb3J0ZWQobmV0d29yazogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gV1NCLnN1cHBvcnRzTmV0d29yayhuZXR3b3JrKVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYWJpRGVjb2RlUXVlcnlTdGF0dXMoc3RhdHVzOiBiaWdpbnQpOiBXaXRPcmFjbGVRdWVyeVN0YXR1cyB7XHJcbiAgICBzd2l0Y2ggKHN0YXR1cykge1xyXG4gICAgICAgIGNhc2UgMW46IHJldHVybiBcIlBvc3RlZFwiO1xyXG4gICAgICAgIGNhc2UgMm46IHJldHVybiBcIlJlcG9ydGVkXCI7XHJcbiAgICAgICAgY2FzZSAzbjogcmV0dXJuIFwiRmluYWxpemVkXCI7XHJcbiAgICAgICAgY2FzZSA0bjogcmV0dXJuIFwiRGVsYXllZFwiO1xyXG4gICAgICAgIGNhc2UgNW46IHJldHVybiBcIkV4cGlyZWRcIjtcclxuICAgICAgICBjYXNlIDZuOiByZXR1cm4gXCJEaXNwdXRlZFwiO1xyXG4gICAgICAgIGRlZmF1bHQ6IHJldHVybiBcIlZvaWRcIjtcclxuICAgIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIENvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSByZXNvbHV0aW9uIG9mIHNvbWUgRGF0YSBSZXF1ZXN0IFRyYW5zYWN0aW9uIGluIHRoZSBXaXRuZXQgYmxvY2tjaGFpbi5cclxuICovXHJcbnR5cGUgX0RhdGFQdXNoUmVwb3J0U29saWRpdHkgPSB7XHJcbiAgICAvKipcclxuICAgICAqIFVuaXF1ZSBoYXNoIG9mIHRoZSBEYXRhIFJlcXVlc3QgVHJhbnNhY3Rpb24gdGhhdCBwcm9kdWNlZCB0aGUgb3V0Y29taW5nIHJlc3VsdC4gXHJcbiAgICAgKi9cclxuICAgIGRyVHhIYXNoOiBXaXRuZXQuSGFzaCxcclxuICAgIC8qKlxyXG4gICAgICogUkFEIGhhc2ggb2YgdGhlIFJhZG9uIFJlcXVlc3QgYmVpbmcgc29sdmVkLlxyXG4gICAgICovXHJcbiAgICBxdWVyeVJhZEhhc2g6IFdpdG5ldC5IYXNoLFxyXG4gICAgLyoqXHJcbiAgICAgKiBTTEEgcGFyYW1ldGVycyByZXF1aXJlZCB0byBiZSBmdWxmaWxsZWQgYnkgdGhlIFdpdG5ldCBibG9ja2NoYWluLiBcclxuICAgICAqL1xyXG4gICAgcXVlcnlQYXJhbXM6IFdpdE9yYWNsZVF1ZXJ5UGFyYW1zLFxyXG4gICAgLyoqXHJcbiAgICAgKiBUaW1lc3RhbXAgd2hlbiB0aGUgZGF0YSBzb3VyY2VzIHdoZXJlIHF1ZXJpZWQgYW5kIHRoZSBjb250YWluZWQgcmVzdWx0IHByb2R1Y2VkLlxyXG4gICAgICovXHJcbiAgICByZXN1bHRUaW1lc3RhbXA6IG51bWJlcixcclxuICAgIC8qKlxyXG4gICAgICogQ0JPUi1lbmNvZGVkIGJ1ZmZlciBjb250YWluaW5nIHRoZSBhY3R1YWwgcmVzdWx0IGRhdGEgdG8gc29tZSBxdWVyeSBhcyBzb2x2ZWQgYnkgdGhlIFdpdG5ldCBibG9ja2NoYWluLiBcclxuICAgICAqL1xyXG4gICAgcmVzdWx0Q2JvckJ5dGVzOiBXaXRuZXQuSGV4U3RyaW5nLFxyXG59XHJcblxyXG5mdW5jdGlvbiBfaW50b0RhdGFQdXNoUmVwb3J0U29saWRpdHkocmVwb3J0OiBEYXRhUHVzaFJlcG9ydCk6IF9EYXRhUHVzaFJlcG9ydFNvbGlkaXR5IHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgZHJUeEhhc2g6IGAweCR7cmVwb3J0Lmhhc2h9YCxcclxuICAgICAgICBxdWVyeVBhcmFtczoge1xyXG4gICAgICAgICAgICB3aXRuZXNzZXM6IHJlcG9ydC5xdWVyeT8ud2l0bmVzc2VzIHx8IDAsXHJcbiAgICAgICAgICAgIHVuaXRhcnlSZXdhcmQ6IHJlcG9ydC5xdWVyeT8udW5pdGFyeV9yZXdhcmQgfHwgMG4sXHJcbiAgICAgICAgICAgIHJlc3VsdE1heFNpemU6IDAsXHJcbiAgICAgICAgfSxcclxuICAgICAgICBxdWVyeVJhZEhhc2g6IGAweCR7cmVwb3J0LnF1ZXJ5Py5yYWRfaGFzaH1gLFxyXG4gICAgICAgIHJlc3VsdENib3JCeXRlczogYDB4JHtyZXBvcnQucmVzdWx0Py5jYm9yX2J5dGVzfWAsXHJcbiAgICAgICAgcmVzdWx0VGltZXN0YW1wOiByZXBvcnQucmVzdWx0Py50aW1lc3RhbXAgfHwgMCxcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGFiaUVuY29kZURhdGFQdXNoUmVwb3J0KHJlcG9ydDogRGF0YVB1c2hSZXBvcnQpOiBhbnkge1xyXG4gICAgY29uc3QgaW50ZXJuYWwgPSBfaW50b0RhdGFQdXNoUmVwb3J0U29saWRpdHkocmVwb3J0KVxyXG4gICAgcmV0dXJuIFtcclxuICAgICAgICBpbnRlcm5hbC5kclR4SGFzaCxcclxuICAgICAgICBpbnRlcm5hbC5xdWVyeVJhZEhhc2gsXHJcbiAgICAgICAgYWJpRW5jb2RlV2l0T3JhY2xlUXVlcnlQYXJhbXMoaW50ZXJuYWwucXVlcnlQYXJhbXMpLFxyXG4gICAgICAgIGludGVybmFsLnJlc3VsdFRpbWVzdGFtcCxcclxuICAgICAgICBpbnRlcm5hbC5yZXN1bHRDYm9yQnl0ZXMsXHJcbiAgICBdXHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhYmlFbmNvZGVEYXRhUHVzaFJlcG9ydE1lc3NhZ2UocmVwb3J0OiBEYXRhUHVzaFJlcG9ydCk6IFdpdG5ldC5IZXhTdHJpbmcge1xyXG4gICAgcmV0dXJuIEFiaUNvZGVyLmRlZmF1bHRBYmlDb2RlcigpLmVuY29kZShcclxuICAgICAgICBbXCJieXRlczMyXCIsIFwiYnl0ZXMzMlwiLCBcIih1aW50MTYsIHVpbnQxNiwgdWludDY0KVwiLCBcInVpbnQ2NFwiLCBcImJ5dGVzXCJdLFxyXG4gICAgICAgIGFiaUVuY29kZURhdGFQdXNoUmVwb3J0KHJlcG9ydClcclxuICAgIClcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGFiaUVuY29kZURhdGFQdXNoUmVwb3J0RGlnZXN0KHJlcG9ydDogRGF0YVB1c2hSZXBvcnQpOiBXaXRuZXQuSGV4U3RyaW5nIHtcclxuICAgIHJldHVybiBzb2xpZGl0eVBhY2tlZEtlY2NhazI1NihcclxuICAgICAgICBbXCJieXRlc1wiXSxcclxuICAgICAgICBbYWJpRW5jb2RlRGF0YVB1c2hSZXBvcnRNZXNzYWdlKHJlcG9ydCldLFxyXG4gICAgKVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYWJpRW5jb2RlUHJpY2VGZWVkVXBkYXRlQ29uZGl0aW9ucyhjb25kaXRpb25zOiBQcmljZUZlZWRVcGRhdGVDb25kaXRpb25zKTogYW55IHtcclxuICAgIHJldHVybiBbXHJcbiAgICAgICAgY29uZGl0aW9ucy5jYWxsYmFja0dhcyxcclxuICAgICAgICBjb25kaXRpb25zLmNvbXB1dGVFTUEsXHJcbiAgICAgICAgY29uZGl0aW9ucy5jb29sZG93blNlY3MsXHJcbiAgICAgICAgY29uZGl0aW9ucy5oZWFydGJlYXRTZWNzLFxyXG4gICAgICAgIE1hdGguZmxvb3IoY29uZGl0aW9ucy5tYXhEZXZpYXRpb25QZXJjZW50YWdlICogMTApLFxyXG4gICAgICAgIGNvbmRpdGlvbnMubWluV2l0bmVzc2VzLFxyXG4gICAgXVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYWJpRW5jb2RlV2l0T3JhY2xlUXVlcnlQYXJhbXMocXVlcnlQYXJhbXM6IFdpdE9yYWNsZVF1ZXJ5UGFyYW1zKTogYW55IHtcclxuICAgIHJldHVybiBbXHJcbiAgICAgICAgcXVlcnlQYXJhbXM/LnJlc3VsdE1heFNpemUgfHwgMCxcclxuICAgICAgICBxdWVyeVBhcmFtcz8ud2l0bmVzc2VzIHx8IDAsXHJcbiAgICAgICAgcXVlcnlQYXJhbXM/LnVuaXRhcnlSZXdhcmQgfHwgMCxcclxuICAgIF1cclxufVxyXG5leHBvcnQgZnVuY3Rpb24gYWJpRW5jb2RlUmFkb25Bc3NldChhc3NldDogYW55KTogYW55IHtcclxuICAgIGlmIChhc3NldCBpbnN0YW5jZW9mIFdpdG5ldC5SYWRvbi5SYWRvblJldHJpZXZhbCkge1xyXG4gICAgICAgIHJldHVybiBbXHJcbiAgICAgICAgICAgIGFzc2V0Lm1ldGhvZCxcclxuICAgICAgICAgICAgYXNzZXQudXJsIHx8IFwiXCIsXHJcbiAgICAgICAgICAgIGFzc2V0LmJvZHkgfHwgXCJcIixcclxuICAgICAgICAgICAgYXNzZXQ/LmhlYWRlcnMgPyBPYmplY3QuZW50cmllcyhhc3NldC5oZWFkZXJzKSA6IFtdLFxyXG4gICAgICAgICAgICBhYmlFbmNvZGVSYWRvbkFzc2V0KGFzc2V0LnNjcmlwdCkgfHwgXCIweDgwXCIsXHJcbiAgICAgICAgXVxyXG5cclxuICAgIH0gZWxzZSBpZiAoYXNzZXQgaW5zdGFuY2VvZiBXaXRuZXQuUmFkb24udHlwZXMuUmFkb25TY3JpcHQpIHtcclxuICAgICAgICByZXR1cm4gYXNzZXQudG9CeXRlY29kZSgpXHJcblxyXG4gICAgfSBlbHNlIGlmIChhc3NldCBpbnN0YW5jZW9mIFdpdG5ldC5SYWRvbi5yZWR1Y2Vycy5DbGFzcykge1xyXG4gICAgICAgIHJldHVybiBbXHJcbiAgICAgICAgICAgIGFzc2V0Lm9wY29kZSxcclxuICAgICAgICAgICAgYXNzZXQuZmlsdGVycz8ubWFwKGZpbHRlciA9PiBhYmlFbmNvZGVSYWRvbkFzc2V0KGZpbHRlcikpIHx8IFtdLFxyXG4gICAgICAgIF1cclxuXHJcbiAgICB9IGVsc2UgaWYgKGFzc2V0IGluc3RhbmNlb2YgV2l0bmV0LlJhZG9uLmZpbHRlcnMuQ2xhc3MpIHtcclxuICAgICAgICByZXR1cm4gW1xyXG4gICAgICAgICAgICBhc3NldC5vcGNvZGUsXHJcbiAgICAgICAgICAgIGAweCR7YXNzZXQuYXJncyA/IGNib3IuZW5jb2RlKGFzc2V0LmFyZ3MpLnRvU3RyaW5nKFwiaGV4XCIpIDogXCJcIn1gXHJcbiAgICAgICAgXVxyXG5cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgTm90IGEgUmFkb24gYXNzZXQ6ICR7YXNzZXR9YClcclxuICAgIH1cclxufVxyXG4iXX0=