UNPKG

eulith-web3js-core

Version:

Eulith core web3js SDK (code to access Eulith services via web3js)

169 lines 22.3 kB
"use strict"; 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 (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.Utils = void 0; const web3_1 = __importDefault(require("web3")); const Eulith = __importStar(require("../src/index")); var Utils; (function (Utils) { /** * note, unless you explicitly pass throwOnFailure: false, this will throw an error if the transaction fails * for any reason, making it easy to handle errors with successive transactions - just await and outer * try/catch */ function waitForTxReceipt({ logger, web3, provider, txHash, timeoutInMS, throwOnFailure }) { return __awaiter(this, void 0, void 0, function* () { const delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms)); const timeOutAt = Date.now() + (timeoutInMS !== null && timeoutInMS !== void 0 ? timeoutInMS : 30 * 1000); if (web3 === undefined) { if (provider === undefined) { throw new Error("At least one of web3 or provider needed for waitForTxReceipt"); } web3 = new Eulith.Web3({ provider }); } while (Date.now() < timeOutAt) { const txReceipt = yield web3.eth.getTransactionReceipt(txHash); if (txReceipt == null) { yield delay(1 * 1000); // don't busy wait, but maybe could use more configurable polling? } else { if (!txReceipt.status) { if (throwOnFailure !== false) { throw new Error("Transaction failed"); } } return txReceipt; } } Eulith.Exceptions.Timeout.Throw(logger, { message: "Eulith.Utils.waitForTxReceipt timed out waiting for txReceipt" }); }); } Utils.waitForTxReceipt = waitForTxReceipt; /** * Based on https://github.com/ethereum/web3.py/blob/master/web3/_utils/transactions.py#L100 because * python client used this * * But - with several changes, and maxFeePerGas/maxPriorityFeePerGas NYI * * NOTE: This requires the transaction.from (sender) field to be set properly, since it is required for most/ * many operations. * * NOTE: CONSIDER deprecating this API, in favor of UnsignedTransaction instance method canonicalize() */ function fillTransactionDefaults(transaction, provider, logger) { return __awaiter(this, void 0, void 0, function* () { // @todo Based on python library code: reference while deciding if this works adequately (probably OK but for estiate gas stuff - discuss with team) // TRANSACTION_DEFAULTS = { // "value": 0, // "data": b"", // "gas": lambda w3, tx: w3.eth.estimate_gas(tx), // "gasPrice": lambda w3, tx: w3.eth.generate_gas_price(tx), // "maxFeePerGas": ( // lambda w3, tx: w3.eth.max_priority_fee // + (2 * w3.eth.get_block("latest")["baseFeePerGas"]) // ), // "maxPriorityFeePerGas": lambda w3, tx: w3.eth.max_priority_fee, // "chainId": lambda w3, tx: w3.eth.chain_id, // } if (transaction.from == null) { throw new Error("Eulith.Utils.fillTransactionDefaults requires the from (aka sender) field to be set"); } transaction = Object.assign({}, transaction); // clone before changing (too costly to check if need to clone) if (!transaction.value) { transaction.value = 0; } if (!transaction.gas) { if (transaction.data == null) { transaction.gas = 21000; // simple transfers always 21000 (@todo add SOURCE for this logic) } else if (provider != null) { const useProvider = Eulith.Provider.ProviderOrWeb3(provider); const web3 = new Eulith.Web3({ provider: useProvider }); try { transaction.gas = yield web3.eth.estimateGas(transaction); } catch (e) { // @todo LOG } } } if (!transaction.gasPrice && provider) { const useProvider = Eulith.Provider.ProviderOrWeb3(provider); const web3 = new Eulith.Web3({ provider: useProvider }); transaction.gasPrice = web3_1.default.utils.toNumber(yield web3.eth.getGasPrice()); } if (!transaction.gas) { if (logger) { let reason = ""; if (provider == null) { reason = "no web3 argument specified"; } else { reason = "web3.eth.estimateGas failed"; } logger.log(Eulith.Logging.LogLevel.WARNING, `Unable to automatically compute gas value for tx ${JSON.stringify(transaction)}: reason: ${reason}`); } } if (!transaction.maxFeePerGas && provider) { // @todo but dont know how right now and doesn't seem critical // transaction.maxFeePerGas = w3.eth.; // maxFeePerGas:"0x23b11bc04" } if (!transaction.maxPriorityFeePerGas && provider) { // @todo but dont know how right now and doesn't seem critical // transaction.maxPriorityFeePerGas = w3.eth.max_priority_fee // maxPriorityFeePerGas:"0x9502F900", } if (!transaction.chainId && provider) { const useProvider = Eulith.Provider.ProviderOrWeb3(provider); const web3 = new Eulith.Web3({ provider: useProvider }); transaction.chainId = yield web3.eth.getChainId(); } if (transaction.from && !transaction.nonce && provider) { const useProvider = Eulith.Provider.ProviderOrWeb3(provider); const web3 = new Eulith.Web3({ provider: useProvider }); // If nonce is missing, the current value to use is the current transaction count from the chain transaction.nonce = yield web3.eth.getTransactionCount(transaction.from.toString(), "pending"); } return transaction; }); } Utils.fillTransactionDefaults = fillTransactionDefaults; })(Utils = exports.Utils || (exports.Utils = {})); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxnREFBd0I7QUFHeEIscURBQXVDO0FBRXZDLElBQWMsS0FBSyxDQTBJbEI7QUExSUQsV0FBYyxLQUFLO0lBQ2Y7Ozs7T0FJRztJQUNILFNBQXNCLGdCQUFnQixDQUFDLEVBQ25DLE1BQU0sRUFDTixJQUFJLEVBQ0osUUFBUSxFQUNSLE1BQU0sRUFDTixXQUFXLEVBQ1gsY0FBYyxFQVFqQjs7WUFDRyxNQUFNLEtBQUssR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN4RSxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxXQUFXLGFBQVgsV0FBVyxjQUFYLFdBQVcsR0FBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7WUFDMUQsSUFBSSxJQUFJLEtBQUssU0FBUyxFQUFFO2dCQUNwQixJQUFJLFFBQVEsS0FBSyxTQUFTLEVBQUU7b0JBQ3hCLE1BQU0sSUFBSSxLQUFLLENBQUMsOERBQThELENBQUMsQ0FBQztpQkFDbkY7Z0JBQ0QsSUFBSSxHQUFHLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7YUFDeEM7WUFDRCxPQUFPLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxTQUFTLEVBQUU7Z0JBQzNCLE1BQU0sU0FBUyxHQUF1QixNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ25GLElBQUksU0FBUyxJQUFJLElBQUksRUFBRTtvQkFDbkIsTUFBTSxLQUFLLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsa0VBQWtFO2lCQUM1RjtxQkFBTTtvQkFDSCxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRTt3QkFDbkIsSUFBSSxjQUFjLEtBQUssS0FBSyxFQUFFOzRCQUMxQixNQUFNLElBQUksS0FBSyxDQUFDLG9CQUFvQixDQUFDLENBQUM7eUJBQ3pDO3FCQUNKO29CQUNELE9BQU8sU0FBUyxDQUFDO2lCQUNwQjthQUNKO1lBQ0QsTUFBTSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRTtnQkFDcEMsT0FBTyxFQUFFLCtEQUErRDthQUMzRSxDQUFDLENBQUM7UUFDUCxDQUFDO0tBQUE7SUF2Q3FCLHNCQUFnQixtQkF1Q3JDLENBQUE7SUFFRDs7Ozs7Ozs7OztPQVVHO0lBQ0gsU0FBc0IsdUJBQXVCLENBQ3pDLFdBQThCLEVBQzlCLFFBQXdDLEVBQ3hDLE1BQStCOztZQUUvQixvSkFBb0o7WUFDcEosMkJBQTJCO1lBQzNCLGtCQUFrQjtZQUNsQixtQkFBbUI7WUFDbkIscURBQXFEO1lBQ3JELGdFQUFnRTtZQUNoRSx3QkFBd0I7WUFDeEIsaURBQWlEO1lBQ2pELDhEQUE4RDtZQUM5RCxTQUFTO1lBQ1Qsc0VBQXNFO1lBQ3RFLGlEQUFpRDtZQUNqRCxJQUFJO1lBQ0osSUFBSSxXQUFXLENBQUMsSUFBSSxJQUFJLElBQUksRUFBRTtnQkFDMUIsTUFBTSxJQUFJLEtBQUssQ0FBQyxxRkFBcUYsQ0FBQyxDQUFDO2FBQzFHO1lBQ0QsV0FBVyxxQkFBUSxXQUFXLENBQUUsQ0FBQyxDQUFDLCtEQUErRDtZQUNqRyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRTtnQkFDcEIsV0FBVyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7YUFDekI7WUFDRCxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRTtnQkFDbEIsSUFBSSxXQUFXLENBQUMsSUFBSSxJQUFJLElBQUksRUFBRTtvQkFDMUIsV0FBVyxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQyxrRUFBa0U7aUJBQzlGO3FCQUFNLElBQUksUUFBUSxJQUFJLElBQUksRUFBRTtvQkFDekIsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUM7b0JBQzdELE1BQU0sSUFBSSxHQUFHLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDO29CQUN4RCxJQUFJO3dCQUNBLFdBQVcsQ0FBQyxHQUFHLEdBQUcsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQztxQkFDN0Q7b0JBQUMsT0FBTyxDQUFDLEVBQUU7d0JBQ1IsWUFBWTtxQkFDZjtpQkFDSjthQUNKO1lBQ0QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLElBQUksUUFBUSxFQUFFO2dCQUNuQyxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDN0QsTUFBTSxJQUFJLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUM7Z0JBQ3hELFdBQVcsQ0FBQyxRQUFRLEdBQUcsY0FBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7YUFDNUU7WUFDRCxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRTtnQkFDbEIsSUFBSSxNQUFNLEVBQUU7b0JBQ1IsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDO29CQUNoQixJQUFJLFFBQVEsSUFBSSxJQUFJLEVBQUU7d0JBQ2xCLE1BQU0sR0FBRyw0QkFBNEIsQ0FBQztxQkFDekM7eUJBQU07d0JBQ0gsTUFBTSxHQUFHLDZCQUE2QixDQUFDO3FCQUMxQztvQkFDRCxNQUFNLENBQUMsR0FBRyxDQUNOLE1BQU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFDL0Isb0RBQW9ELElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLGFBQWEsTUFBTSxFQUFFLENBQ3ZHLENBQUM7aUJBQ0w7YUFDSjtZQUNELElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxJQUFJLFFBQVEsRUFBRTtnQkFDdkMsOERBQThEO2dCQUM5RCxzQ0FBc0M7Z0JBQ3RDLDZCQUE2QjthQUNoQztZQUNELElBQUksQ0FBQyxXQUFXLENBQUMsb0JBQW9CLElBQUksUUFBUSxFQUFFO2dCQUMvQyw4REFBOEQ7Z0JBQzlELDZEQUE2RDtnQkFDN0QscUNBQXFDO2FBQ3hDO1lBQ0QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLElBQUksUUFBUSxFQUFFO2dCQUNsQyxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDN0QsTUFBTSxJQUFJLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUM7Z0JBQ3hELFdBQVcsQ0FBQyxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxDQUFDO2FBQ3JEO1lBQ0QsSUFBSSxXQUFXLENBQUMsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssSUFBSSxRQUFRLEVBQUU7Z0JBQ3BELE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUM3RCxNQUFNLElBQUksR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQztnQkFDeEQsZ0dBQWdHO2dCQUNoRyxXQUFXLENBQUMsS0FBSyxHQUFHLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLFNBQVMsQ0FBQyxDQUFDO2FBQ2xHO1lBQ0QsT0FBTyxXQUFXLENBQUM7UUFDdkIsQ0FBQztLQUFBO0lBL0VxQiw2QkFBdUIsMEJBK0U1QyxDQUFBO0FBQ0wsQ0FBQyxFQTFJYSxLQUFLLEdBQUwsYUFBSyxLQUFMLGFBQUssUUEwSWxCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFdlYjMgZnJvbSBcIndlYjNcIjtcbmltcG9ydCB7IFRyYW5zYWN0aW9uQ29uZmlnLCBUcmFuc2FjdGlvblJlY2VpcHQgfSBmcm9tIFwid2ViMy1ldGhcIjtcblxuaW1wb3J0ICogYXMgRXVsaXRoIGZyb20gXCIuLi9zcmMvaW5kZXhcIjtcblxuZXhwb3J0IG1vZHVsZSBVdGlscyB7XG4gICAgLyoqXG4gICAgICogIG5vdGUsIHVubGVzcyB5b3UgZXhwbGljaXRseSBwYXNzIHRocm93T25GYWlsdXJlOiBmYWxzZSwgdGhpcyB3aWxsIHRocm93IGFuIGVycm9yIGlmIHRoZSB0cmFuc2FjdGlvbiBmYWlsc1xuICAgICAqICBmb3IgYW55IHJlYXNvbiwgbWFraW5nIGl0IGVhc3kgdG8gaGFuZGxlIGVycm9ycyB3aXRoIHN1Y2Nlc3NpdmUgdHJhbnNhY3Rpb25zIC0ganVzdCBhd2FpdCBhbmQgb3V0ZXJcbiAgICAgKiAgdHJ5L2NhdGNoXG4gICAgICovXG4gICAgZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdhaXRGb3JUeFJlY2VpcHQoe1xuICAgICAgICBsb2dnZXIsXG4gICAgICAgIHdlYjMsXG4gICAgICAgIHByb3ZpZGVyLFxuICAgICAgICB0eEhhc2gsXG4gICAgICAgIHRpbWVvdXRJbk1TLFxuICAgICAgICB0aHJvd09uRmFpbHVyZVxuICAgIH06IHtcbiAgICAgICAgd2ViMz86IFdlYjM7XG4gICAgICAgIHByb3ZpZGVyPzogRXVsaXRoLlByb3ZpZGVyO1xuICAgICAgICB0eEhhc2g6IHN0cmluZztcbiAgICAgICAgdGltZW91dEluTVM/OiBudW1iZXI7XG4gICAgICAgIGxvZ2dlcj86IEV1bGl0aC5Mb2dnaW5nLklMb2dnZXI7XG4gICAgICAgIHRocm93T25GYWlsdXJlPzogYm9vbGVhbjtcbiAgICB9KTogUHJvbWlzZTxUcmFuc2FjdGlvblJlY2VpcHQ+IHtcbiAgICAgICAgY29uc3QgZGVsYXkgPSAobXMpID0+IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7XG4gICAgICAgIGNvbnN0IHRpbWVPdXRBdCA9IERhdGUubm93KCkgKyAodGltZW91dEluTVMgPz8gMzAgKiAxMDAwKTtcbiAgICAgICAgaWYgKHdlYjMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaWYgKHByb3ZpZGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBdCBsZWFzdCBvbmUgb2Ygd2ViMyBvciBwcm92aWRlciBuZWVkZWQgZm9yIHdhaXRGb3JUeFJlY2VpcHRcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3ZWIzID0gbmV3IEV1bGl0aC5XZWIzKHsgcHJvdmlkZXIgfSk7XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKERhdGUubm93KCkgPCB0aW1lT3V0QXQpIHtcbiAgICAgICAgICAgIGNvbnN0IHR4UmVjZWlwdDogVHJhbnNhY3Rpb25SZWNlaXB0ID0gYXdhaXQgd2ViMy5ldGguZ2V0VHJhbnNhY3Rpb25SZWNlaXB0KHR4SGFzaCk7XG4gICAgICAgICAgICBpZiAodHhSZWNlaXB0ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBkZWxheSgxICogMTAwMCk7IC8vIGRvbid0IGJ1c3kgd2FpdCwgYnV0IG1heWJlIGNvdWxkIHVzZSBtb3JlIGNvbmZpZ3VyYWJsZSBwb2xsaW5nP1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoIXR4UmVjZWlwdC5zdGF0dXMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRocm93T25GYWlsdXJlICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVHJhbnNhY3Rpb24gZmFpbGVkXCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0eFJlY2VpcHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgRXVsaXRoLkV4Y2VwdGlvbnMuVGltZW91dC5UaHJvdyhsb2dnZXIsIHtcbiAgICAgICAgICAgIG1lc3NhZ2U6IFwiRXVsaXRoLlV0aWxzLndhaXRGb3JUeFJlY2VpcHQgdGltZWQgb3V0IHdhaXRpbmcgZm9yIHR4UmVjZWlwdFwiXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqICBCYXNlZCBvbiBodHRwczovL2dpdGh1Yi5jb20vZXRoZXJldW0vd2ViMy5weS9ibG9iL21hc3Rlci93ZWIzL191dGlscy90cmFuc2FjdGlvbnMucHkjTDEwMCBiZWNhdXNlXG4gICAgICogIHB5dGhvbiBjbGllbnQgdXNlZCB0aGlzXG4gICAgICpcbiAgICAgKiAgQnV0IC0gd2l0aCBzZXZlcmFsIGNoYW5nZXMsIGFuZCBtYXhGZWVQZXJHYXMvbWF4UHJpb3JpdHlGZWVQZXJHYXMgTllJXG4gICAgICpcbiAgICAgKiAgTk9URTogVGhpcyByZXF1aXJlcyB0aGUgdHJhbnNhY3Rpb24uZnJvbSAoc2VuZGVyKSBmaWVsZCB0byBiZSBzZXQgcHJvcGVybHksIHNpbmNlIGl0IGlzIHJlcXVpcmVkIGZvciBtb3N0L1xuICAgICAqICBtYW55IG9wZXJhdGlvbnMuXG4gICAgICpcbiAgICAgKiAgTk9URTogQ09OU0lERVIgZGVwcmVjYXRpbmcgdGhpcyBBUEksIGluIGZhdm9yIG9mIFVuc2lnbmVkVHJhbnNhY3Rpb24gaW5zdGFuY2UgbWV0aG9kIGNhbm9uaWNhbGl6ZSgpXG4gICAgICovXG4gICAgZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpbGxUcmFuc2FjdGlvbkRlZmF1bHRzKFxuICAgICAgICB0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb25Db25maWcsXG4gICAgICAgIHByb3ZpZGVyPzogRXVsaXRoLlByb3ZpZGVyIHwgRXVsaXRoLldlYjMsXG4gICAgICAgIGxvZ2dlcj86IEV1bGl0aC5Mb2dnaW5nLklMb2dnZXJcbiAgICApOiBQcm9taXNlPFRyYW5zYWN0aW9uQ29uZmlnPiB7XG4gICAgICAgIC8vIEB0b2RvIEJhc2VkIG9uIHB5dGhvbiBsaWJyYXJ5IGNvZGU6IHJlZmVyZW5jZSB3aGlsZSBkZWNpZGluZyBpZiB0aGlzIHdvcmtzIGFkZXF1YXRlbHkgKHByb2JhYmx5IE9LIGJ1dCBmb3IgZXN0aWF0ZSBnYXMgc3R1ZmYgLSBkaXNjdXNzIHdpdGggdGVhbSlcbiAgICAgICAgLy8gVFJBTlNBQ1RJT05fREVGQVVMVFMgPSB7XG4gICAgICAgIC8vICAgICBcInZhbHVlXCI6IDAsXG4gICAgICAgIC8vICAgICBcImRhdGFcIjogYlwiXCIsXG4gICAgICAgIC8vICAgICBcImdhc1wiOiBsYW1iZGEgdzMsIHR4OiB3My5ldGguZXN0aW1hdGVfZ2FzKHR4KSxcbiAgICAgICAgLy8gICAgIFwiZ2FzUHJpY2VcIjogbGFtYmRhIHczLCB0eDogdzMuZXRoLmdlbmVyYXRlX2dhc19wcmljZSh0eCksXG4gICAgICAgIC8vICAgICBcIm1heEZlZVBlckdhc1wiOiAoXG4gICAgICAgIC8vICAgICAgICAgbGFtYmRhIHczLCB0eDogdzMuZXRoLm1heF9wcmlvcml0eV9mZWVcbiAgICAgICAgLy8gICAgICAgICArICgyICogdzMuZXRoLmdldF9ibG9jayhcImxhdGVzdFwiKVtcImJhc2VGZWVQZXJHYXNcIl0pXG4gICAgICAgIC8vICAgICApLFxuICAgICAgICAvLyAgICAgXCJtYXhQcmlvcml0eUZlZVBlckdhc1wiOiBsYW1iZGEgdzMsIHR4OiB3My5ldGgubWF4X3ByaW9yaXR5X2ZlZSxcbiAgICAgICAgLy8gICAgIFwiY2hhaW5JZFwiOiBsYW1iZGEgdzMsIHR4OiB3My5ldGguY2hhaW5faWQsXG4gICAgICAgIC8vIH1cbiAgICAgICAgaWYgKHRyYW5zYWN0aW9uLmZyb20gPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRXVsaXRoLlV0aWxzLmZpbGxUcmFuc2FjdGlvbkRlZmF1bHRzIHJlcXVpcmVzIHRoZSBmcm9tIChha2Egc2VuZGVyKSBmaWVsZCB0byBiZSBzZXRcIik7XG4gICAgICAgIH1cbiAgICAgICAgdHJhbnNhY3Rpb24gPSB7IC4uLnRyYW5zYWN0aW9uIH07IC8vIGNsb25lIGJlZm9yZSBjaGFuZ2luZyAodG9vIGNvc3RseSB0byBjaGVjayBpZiBuZWVkIHRvIGNsb25lKVxuICAgICAgICBpZiAoIXRyYW5zYWN0aW9uLnZhbHVlKSB7XG4gICAgICAgICAgICB0cmFuc2FjdGlvbi52YWx1ZSA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0cmFuc2FjdGlvbi5nYXMpIHtcbiAgICAgICAgICAgIGlmICh0cmFuc2FjdGlvbi5kYXRhID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbi5nYXMgPSAyMTAwMDsgLy8gc2ltcGxlIHRyYW5zZmVycyBhbHdheXMgMjEwMDAgKEB0b2RvIGFkZCBTT1VSQ0UgZm9yIHRoaXMgbG9naWMpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHByb3ZpZGVyICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB1c2VQcm92aWRlciA9IEV1bGl0aC5Qcm92aWRlci5Qcm92aWRlck9yV2ViMyhwcm92aWRlcik7XG4gICAgICAgICAgICAgICAgY29uc3Qgd2ViMyA9IG5ldyBFdWxpdGguV2ViMyh7IHByb3ZpZGVyOiB1c2VQcm92aWRlciB9KTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbi5nYXMgPSBhd2FpdCB3ZWIzLmV0aC5lc3RpbWF0ZUdhcyh0cmFuc2FjdGlvbik7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBAdG9kbyBMT0dcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0cmFuc2FjdGlvbi5nYXNQcmljZSAmJiBwcm92aWRlcikge1xuICAgICAgICAgICAgY29uc3QgdXNlUHJvdmlkZXIgPSBFdWxpdGguUHJvdmlkZXIuUHJvdmlkZXJPcldlYjMocHJvdmlkZXIpO1xuICAgICAgICAgICAgY29uc3Qgd2ViMyA9IG5ldyBFdWxpdGguV2ViMyh7IHByb3ZpZGVyOiB1c2VQcm92aWRlciB9KTtcbiAgICAgICAgICAgIHRyYW5zYWN0aW9uLmdhc1ByaWNlID0gV2ViMy51dGlscy50b051bWJlcihhd2FpdCB3ZWIzLmV0aC5nZXRHYXNQcmljZSgpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRyYW5zYWN0aW9uLmdhcykge1xuICAgICAgICAgICAgaWYgKGxvZ2dlcikge1xuICAgICAgICAgICAgICAgIGxldCByZWFzb24gPSBcIlwiO1xuICAgICAgICAgICAgICAgIGlmIChwcm92aWRlciA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlYXNvbiA9IFwibm8gd2ViMyBhcmd1bWVudCBzcGVjaWZpZWRcIjtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZWFzb24gPSBcIndlYjMuZXRoLmVzdGltYXRlR2FzIGZhaWxlZFwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsb2dnZXIubG9nKFxuICAgICAgICAgICAgICAgICAgICBFdWxpdGguTG9nZ2luZy5Mb2dMZXZlbC5XQVJOSU5HLFxuICAgICAgICAgICAgICAgICAgICBgVW5hYmxlIHRvIGF1dG9tYXRpY2FsbHkgY29tcHV0ZSBnYXMgdmFsdWUgZm9yIHR4ICR7SlNPTi5zdHJpbmdpZnkodHJhbnNhY3Rpb24pfTogcmVhc29uOiAke3JlYXNvbn1gXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRyYW5zYWN0aW9uLm1heEZlZVBlckdhcyAmJiBwcm92aWRlcikge1xuICAgICAgICAgICAgLy8gQHRvZG8gYnV0IGRvbnQga25vdyBob3cgcmlnaHQgbm93IGFuZCBkb2Vzbid0IHNlZW0gY3JpdGljYWxcbiAgICAgICAgICAgIC8vIHRyYW5zYWN0aW9uLm1heEZlZVBlckdhcyA9IHczLmV0aC47XG4gICAgICAgICAgICAvLyBtYXhGZWVQZXJHYXM6XCIweDIzYjExYmMwNFwiXG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0cmFuc2FjdGlvbi5tYXhQcmlvcml0eUZlZVBlckdhcyAmJiBwcm92aWRlcikge1xuICAgICAgICAgICAgLy8gQHRvZG8gYnV0IGRvbnQga25vdyBob3cgcmlnaHQgbm93IGFuZCBkb2Vzbid0IHNlZW0gY3JpdGljYWxcbiAgICAgICAgICAgIC8vIHRyYW5zYWN0aW9uLm1heFByaW9yaXR5RmVlUGVyR2FzID0gdzMuZXRoLm1heF9wcmlvcml0eV9mZWVcbiAgICAgICAgICAgIC8vIG1heFByaW9yaXR5RmVlUGVyR2FzOlwiMHg5NTAyRjkwMFwiLFxuICAgICAgICB9XG4gICAgICAgIGlmICghdHJhbnNhY3Rpb24uY2hhaW5JZCAmJiBwcm92aWRlcikge1xuICAgICAgICAgICAgY29uc3QgdXNlUHJvdmlkZXIgPSBFdWxpdGguUHJvdmlkZXIuUHJvdmlkZXJPcldlYjMocHJvdmlkZXIpO1xuICAgICAgICAgICAgY29uc3Qgd2ViMyA9IG5ldyBFdWxpdGguV2ViMyh7IHByb3ZpZGVyOiB1c2VQcm92aWRlciB9KTtcbiAgICAgICAgICAgIHRyYW5zYWN0aW9uLmNoYWluSWQgPSBhd2FpdCB3ZWIzLmV0aC5nZXRDaGFpbklkKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRyYW5zYWN0aW9uLmZyb20gJiYgIXRyYW5zYWN0aW9uLm5vbmNlICYmIHByb3ZpZGVyKSB7XG4gICAgICAgICAgICBjb25zdCB1c2VQcm92aWRlciA9IEV1bGl0aC5Qcm92aWRlci5Qcm92aWRlck9yV2ViMyhwcm92aWRlcik7XG4gICAgICAgICAgICBjb25zdCB3ZWIzID0gbmV3IEV1bGl0aC5XZWIzKHsgcHJvdmlkZXI6IHVzZVByb3ZpZGVyIH0pO1xuICAgICAgICAgICAgLy8gSWYgbm9uY2UgaXMgbWlzc2luZywgdGhlIGN1cnJlbnQgdmFsdWUgdG8gdXNlIGlzIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uIGNvdW50IGZyb20gdGhlIGNoYWluXG4gICAgICAgICAgICB0cmFuc2FjdGlvbi5ub25jZSA9IGF3YWl0IHdlYjMuZXRoLmdldFRyYW5zYWN0aW9uQ291bnQodHJhbnNhY3Rpb24uZnJvbS50b1N0cmluZygpLCBcInBlbmRpbmdcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRyYW5zYWN0aW9uO1xuICAgIH1cbn1cbiJdfQ==