UNPKG

@coolwallet/sol

Version:
210 lines (208 loc) 29.6 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.getCreateAndTransferSPLToken = getCreateAndTransferSPLToken; exports.getDelegateAndCreateAccountArguments = getDelegateAndCreateAccountArguments; exports.getScriptSigningActions = getScriptSigningActions; exports.getScriptSigningPreActions = getScriptSigningPreActions; exports.getSignInArguments = getSignInArguments; exports.getSignMessageArguments = getSignMessageArguments; exports.getSignVersionedArguments = getSignVersionedArguments; exports.getSmartContractArguments = getSmartContractArguments; exports.getSplTokenTransferArguments = getSplTokenTransferArguments; exports.getTransferArguments = getTransferArguments; exports.getUndelegateArguments = getUndelegateArguments; exports.getWithdrawArguments = getWithdrawArguments; var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator")); var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); var _core = require("@coolwallet/core"); var _config = require("@coolwallet/core/lib/config"); var _bs = _interopRequireDefault(require("bs58")); var _signIn = require("./signIn"); /** * getTransferArguments * * @param {Transaction} rawTx transaction with extracted fields from a regular sol transaction * @param {boolean} isPartialArgs is getting full rawTx as argument or not * @returns {Promise<string>} */ function getTransferArguments(rawTx, addressIndex) { var path = _core.utils.getFullPath({ pathType: _config.PathType.SLIP0010, pathString: "44'/501'/".concat(addressIndex, "'/0'") }); var SEPath = "11".concat(path); console.debug('SEPath: ', SEPath); var compiledMessage = rawTx.compileMessage(); var header = compiledMessage.serializeHeader(); return SEPath + header + compiledMessage.serializeTransferMessage(); } function getTokenInfoArgs(tokenInfo) { var _tokenInfo$signature; var scriptTokenSymbol = tokenInfo.symbol.slice(0, 7).toUpperCase(); var tokenSignature = (_tokenInfo$signature = tokenInfo.signature) !== null && _tokenInfo$signature !== void 0 ? _tokenInfo$signature : ''; var signature = tokenSignature.slice(82).padStart(144, '0'); var tokenInfoToHex = Buffer.from([+tokenInfo.decimals, scriptTokenSymbol.length]).toString('hex'); var tokenSymbol = Buffer.from(scriptTokenSymbol).toString('hex').padEnd(14, '0'); var tokenPublicKey = Buffer.from(_bs["default"].decode(tokenInfo.address)).toString('hex'); return tokenInfoToHex + tokenSymbol + tokenPublicKey + signature; } /** * getSplTokenTransferArguments * * @param {Transaction} rawTx transaction with extracted fields from a regular sol transaction * @param {boolean} isPartialArgs is getting full rawTx as argument or not * @returns {Promise<string>} */ function getSplTokenTransferArguments(rawTx, addressIndex, tokenInfo) { var path = _core.utils.getFullPath({ pathType: _config.PathType.SLIP0010, pathString: "44'/501'/".concat(addressIndex, "'/0'") }); var SEPath = "11".concat(path); console.debug('SEPath: ', SEPath); var tokenInfoArgs = ''; if (tokenInfo) tokenInfoArgs = getTokenInfoArgs(tokenInfo); var compiledMessage = rawTx.compileMessage(); var header = compiledMessage.serializeHeader(); return SEPath + header + compiledMessage.serializeTransferMessage() + tokenInfoArgs; } function getCreateAndTransferSPLToken(rawTx, addressIndex, tokenInfo) { var path = _core.utils.getFullPath({ pathType: _config.PathType.SLIP0010, pathString: "44'/501'/".concat(addressIndex, "'/0'") }); var SEPath = "11".concat(path); console.debug('SEPath: ', SEPath); var tokenInfoArgs = ''; if (tokenInfo) tokenInfoArgs = getTokenInfoArgs(tokenInfo); var compiledMessage = rawTx.compileMessage(); var header = compiledMessage.serializeHeader(); return SEPath + header + compiledMessage.serializeCreateAndTransferSPLToken() + tokenInfoArgs; } function getUndelegateArguments(rawTx, addressIndex) { var path = _core.utils.getFullPath({ pathType: _config.PathType.SLIP0010, pathString: "44'/501'/".concat(addressIndex, "'/0'") }); var SEPath = "11".concat(path); console.debug('SEPath: ', SEPath); var compiledMessage = rawTx.compileMessage(); var header = compiledMessage.serializeHeader(); return SEPath + header + compiledMessage.serializeUndelegate(); } function getWithdrawArguments(rawTx, addressIndex) { var path = _core.utils.getFullPath({ pathType: _config.PathType.SLIP0010, pathString: "44'/501'/".concat(addressIndex, "'/0'") }); var SEPath = "11".concat(path); console.debug('SEPath: ', SEPath); var compiledMessage = rawTx.compileMessage(); var header = compiledMessage.serializeHeader(); return SEPath + header + compiledMessage.serializeWithdraw(); } function getDelegateAndCreateAccountArguments(rawTx, addressIndex) { var path = _core.utils.getFullPath({ pathType: _config.PathType.SLIP0010, pathString: "44'/501'/".concat(addressIndex, "'/0'") }); var SEPath = "11".concat(path); console.debug('SEPath: ', SEPath); var compiledMessage = rawTx.compileMessage(); var header = compiledMessage.serializeHeader(); return SEPath + header + compiledMessage.serializeDelegateAndCreateAccountWithSeed(); } function getSmartContractArguments(rawTx, addressIndex) { var path = _core.utils.getFullPath({ pathType: _config.PathType.SLIP0010, pathString: "44'/501'/".concat(addressIndex, "'/0'") }); var SEPath = "11".concat(path); console.debug('SEPath: ', SEPath); return SEPath + Buffer.from(rawTx.compileMessage().serialize()).toString('hex'); } function getSignInArguments(message, addressIndex) { var PATH_LENGTH = '11'; var path = _core.utils.getFullPath({ pathType: _config.PathType.SLIP0010, pathString: "44'/501'/".concat(addressIndex, "'/0'") }); var SEPath = "".concat(PATH_LENGTH).concat(path); console.debug('SEPath: ', SEPath); var argument = (0, _signIn.createSignInMessage)(message, path); return SEPath + argument; } function getSignMessageArguments(message, addressIndex) { var PATH_LENGTH = '11'; var path = _core.utils.getFullPath({ pathType: _config.PathType.SLIP0010, pathString: "44'/501'/".concat(addressIndex, "'/0'") }); var SEPath = "".concat(PATH_LENGTH).concat(path); console.debug('SEPath: ', SEPath); var argument = message.startsWith('0x') ? message.slice(2) : message; return SEPath + argument; } function getSignVersionedArguments(rawTx, addressIndex) { var path = _core.utils.getFullPath({ pathType: _config.PathType.SLIP0010, pathString: "44'/501'/".concat(addressIndex, "'/0'") }); var SEPath = "11".concat(path); console.debug('SEPath: ', SEPath); return SEPath + Buffer.from(rawTx.serialize()).toString('hex'); } function getScriptSigningPreActions(signData, script) { var transport = signData.transport; var preActions = []; var sendScript = /*#__PURE__*/function () { var _ref = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee() { return _regenerator["default"].wrap(function _callee$(_context) { while (1) switch (_context.prev = _context.next) { case 0: _context.next = 2; return _core.tx.command.sendScript(transport, script); case 2: case "end": return _context.stop(); } }, _callee); })); return function sendScript() { return _ref.apply(this, arguments); }; }(); preActions.push(sendScript); return { preActions: preActions }; } function getScriptSigningActions(signData) { var transport = signData.transport, appPrivateKey = signData.appPrivateKey, appId = signData.appId, addressIndex = signData.addressIndex; var versionedTxs = signData.transaction; var actions = versionedTxs.map(function (versionedTx) { return /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee2() { var argument; return _regenerator["default"].wrap(function _callee2$(_context2) { while (1) switch (_context2.prev = _context2.next) { case 0: argument = getSignVersionedArguments(versionedTx.message, addressIndex); return _context2.abrupt("return", _core.tx.command.executeScript(transport, appId, appPrivateKey, argument)); case 2: case "end": return _context2.stop(); } }, _callee2); })); }); return { actions: actions }; } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfY29yZSIsInJlcXVpcmUiLCJfY29uZmlnIiwiX2JzIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl9zaWduSW4iLCJnZXRUcmFuc2ZlckFyZ3VtZW50cyIsInJhd1R4IiwiYWRkcmVzc0luZGV4IiwicGF0aCIsInV0aWxzIiwiZ2V0RnVsbFBhdGgiLCJwYXRoVHlwZSIsIlBhdGhUeXBlIiwiU0xJUDAwMTAiLCJwYXRoU3RyaW5nIiwiY29uY2F0IiwiU0VQYXRoIiwiY29uc29sZSIsImRlYnVnIiwiY29tcGlsZWRNZXNzYWdlIiwiY29tcGlsZU1lc3NhZ2UiLCJoZWFkZXIiLCJzZXJpYWxpemVIZWFkZXIiLCJzZXJpYWxpemVUcmFuc2Zlck1lc3NhZ2UiLCJnZXRUb2tlbkluZm9BcmdzIiwidG9rZW5JbmZvIiwiX3Rva2VuSW5mbyRzaWduYXR1cmUiLCJzY3JpcHRUb2tlblN5bWJvbCIsInN5bWJvbCIsInNsaWNlIiwidG9VcHBlckNhc2UiLCJ0b2tlblNpZ25hdHVyZSIsInNpZ25hdHVyZSIsInBhZFN0YXJ0IiwidG9rZW5JbmZvVG9IZXgiLCJCdWZmZXIiLCJmcm9tIiwiZGVjaW1hbHMiLCJsZW5ndGgiLCJ0b1N0cmluZyIsInRva2VuU3ltYm9sIiwicGFkRW5kIiwidG9rZW5QdWJsaWNLZXkiLCJiYXNlNTgiLCJkZWNvZGUiLCJhZGRyZXNzIiwiZ2V0U3BsVG9rZW5UcmFuc2ZlckFyZ3VtZW50cyIsInRva2VuSW5mb0FyZ3MiLCJnZXRDcmVhdGVBbmRUcmFuc2ZlclNQTFRva2VuIiwic2VyaWFsaXplQ3JlYXRlQW5kVHJhbnNmZXJTUExUb2tlbiIsImdldFVuZGVsZWdhdGVBcmd1bWVudHMiLCJzZXJpYWxpemVVbmRlbGVnYXRlIiwiZ2V0V2l0aGRyYXdBcmd1bWVudHMiLCJzZXJpYWxpemVXaXRoZHJhdyIsImdldERlbGVnYXRlQW5kQ3JlYXRlQWNjb3VudEFyZ3VtZW50cyIsInNlcmlhbGl6ZURlbGVnYXRlQW5kQ3JlYXRlQWNjb3VudFdpdGhTZWVkIiwiZ2V0U21hcnRDb250cmFjdEFyZ3VtZW50cyIsInNlcmlhbGl6ZSIsImdldFNpZ25JbkFyZ3VtZW50cyIsIm1lc3NhZ2UiLCJQQVRIX0xFTkdUSCIsImFyZ3VtZW50IiwiY3JlYXRlU2lnbkluTWVzc2FnZSIsImdldFNpZ25NZXNzYWdlQXJndW1lbnRzIiwic3RhcnRzV2l0aCIsImdldFNpZ25WZXJzaW9uZWRBcmd1bWVudHMiLCJnZXRTY3JpcHRTaWduaW5nUHJlQWN0aW9ucyIsInNpZ25EYXRhIiwic2NyaXB0IiwidHJhbnNwb3J0IiwicHJlQWN0aW9ucyIsInNlbmRTY3JpcHQiLCJfcmVmIiwiX2FzeW5jVG9HZW5lcmF0b3IyIiwiX3JlZ2VuZXJhdG9yIiwibWFyayIsIl9jYWxsZWUiLCJ3cmFwIiwiX2NhbGxlZSQiLCJfY29udGV4dCIsInByZXYiLCJuZXh0IiwidHgiLCJjb21tYW5kIiwic3RvcCIsImFwcGx5IiwiYXJndW1lbnRzIiwicHVzaCIsImdldFNjcmlwdFNpZ25pbmdBY3Rpb25zIiwiYXBwUHJpdmF0ZUtleSIsImFwcElkIiwidmVyc2lvbmVkVHhzIiwidHJhbnNhY3Rpb24iLCJhY3Rpb25zIiwibWFwIiwidmVyc2lvbmVkVHgiLCJfY2FsbGVlMiIsIl9jYWxsZWUyJCIsIl9jb250ZXh0MiIsImFicnVwdCIsImV4ZWN1dGVTY3JpcHQiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvc2NyaXB0VXRpbC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB1dGlscyB9IGZyb20gJ0Bjb29sd2FsbGV0L2NvcmUnO1xuaW1wb3J0IHsgUGF0aFR5cGUgfSBmcm9tICdAY29vbHdhbGxldC9jb3JlL2xpYi9jb25maWcnO1xuaW1wb3J0IGJhc2U1OCBmcm9tICdiczU4JztcbmltcG9ydCAqIGFzIHR5cGVzIGZyb20gJy4uL2NvbmZpZy90eXBlcyc7XG5pbXBvcnQgeyBjcmVhdGVTaWduSW5NZXNzYWdlIH0gZnJvbSAnLi9zaWduSW4nO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb24gfSBmcm9tICcuL1RyYW5zYWN0aW9uJztcbmltcG9ydCB7IFZlcnNpb25lZE1lc3NhZ2UgfSBmcm9tICcuLi9tZXNzYWdlJztcbmltcG9ydCB7IHR4IH0gZnJvbSAnQGNvb2x3YWxsZXQvY29yZSc7XG5cbi8qKlxuICogZ2V0VHJhbnNmZXJBcmd1bWVudHNcbiAqXG4gKiBAcGFyYW0ge1RyYW5zYWN0aW9ufSByYXdUeCB0cmFuc2FjdGlvbiB3aXRoIGV4dHJhY3RlZCBmaWVsZHMgZnJvbSBhIHJlZ3VsYXIgc29sIHRyYW5zYWN0aW9uXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGlzUGFydGlhbEFyZ3MgaXMgZ2V0dGluZyBmdWxsIHJhd1R4IGFzIGFyZ3VtZW50IG9yIG5vdFxuICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn1cbiAqL1xuZnVuY3Rpb24gZ2V0VHJhbnNmZXJBcmd1bWVudHMocmF3VHg6IFRyYW5zYWN0aW9uLCBhZGRyZXNzSW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG4gIGNvbnN0IHBhdGggPSB1dGlscy5nZXRGdWxsUGF0aCh7IHBhdGhUeXBlOiBQYXRoVHlwZS5TTElQMDAxMCwgcGF0aFN0cmluZzogYDQ0Jy81MDEnLyR7YWRkcmVzc0luZGV4fScvMCdgIH0pO1xuICBjb25zdCBTRVBhdGggPSBgMTEke3BhdGh9YDtcbiAgY29uc29sZS5kZWJ1ZygnU0VQYXRoOiAnLCBTRVBhdGgpO1xuICBjb25zdCBjb21waWxlZE1lc3NhZ2UgPSByYXdUeC5jb21waWxlTWVzc2FnZSgpO1xuICBjb25zdCBoZWFkZXIgPSBjb21waWxlZE1lc3NhZ2Uuc2VyaWFsaXplSGVhZGVyKCk7XG4gIHJldHVybiBTRVBhdGggKyBoZWFkZXIgKyBjb21waWxlZE1lc3NhZ2Uuc2VyaWFsaXplVHJhbnNmZXJNZXNzYWdlKCk7XG59XG5cbmZ1bmN0aW9uIGdldFRva2VuSW5mb0FyZ3ModG9rZW5JbmZvOiB0eXBlcy5Ub2tlbkluZm8pOiBzdHJpbmcge1xuICBjb25zdCBzY3JpcHRUb2tlblN5bWJvbCA9IHRva2VuSW5mby5zeW1ib2wuc2xpY2UoMCwgNykudG9VcHBlckNhc2UoKTtcblxuICBjb25zdCB0b2tlblNpZ25hdHVyZSA9IHRva2VuSW5mby5zaWduYXR1cmUgPz8gJyc7XG4gIGNvbnN0IHNpZ25hdHVyZSA9IHRva2VuU2lnbmF0dXJlLnNsaWNlKDgyKS5wYWRTdGFydCgxNDQsICcwJyk7XG4gIGNvbnN0IHRva2VuSW5mb1RvSGV4ID0gQnVmZmVyLmZyb20oWyt0b2tlbkluZm8uZGVjaW1hbHMsIHNjcmlwdFRva2VuU3ltYm9sLmxlbmd0aF0pLnRvU3RyaW5nKCdoZXgnKTtcbiAgY29uc3QgdG9rZW5TeW1ib2wgPSBCdWZmZXIuZnJvbShzY3JpcHRUb2tlblN5bWJvbCkudG9TdHJpbmcoJ2hleCcpLnBhZEVuZCgxNCwgJzAnKTtcbiAgY29uc3QgdG9rZW5QdWJsaWNLZXkgPSBCdWZmZXIuZnJvbShiYXNlNTguZGVjb2RlKHRva2VuSW5mby5hZGRyZXNzKSkudG9TdHJpbmcoJ2hleCcpO1xuXG4gIHJldHVybiB0b2tlbkluZm9Ub0hleCArIHRva2VuU3ltYm9sICsgdG9rZW5QdWJsaWNLZXkgKyBzaWduYXR1cmU7XG59XG5cbi8qKlxuICogZ2V0U3BsVG9rZW5UcmFuc2ZlckFyZ3VtZW50c1xuICpcbiAqIEBwYXJhbSB7VHJhbnNhY3Rpb259IHJhd1R4IHRyYW5zYWN0aW9uIHdpdGggZXh0cmFjdGVkIGZpZWxkcyBmcm9tIGEgcmVndWxhciBzb2wgdHJhbnNhY3Rpb25cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNQYXJ0aWFsQXJncyBpcyBnZXR0aW5nIGZ1bGwgcmF3VHggYXMgYXJndW1lbnQgb3Igbm90XG4gKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fVxuICovXG5mdW5jdGlvbiBnZXRTcGxUb2tlblRyYW5zZmVyQXJndW1lbnRzKHJhd1R4OiBUcmFuc2FjdGlvbiwgYWRkcmVzc0luZGV4OiBudW1iZXIsIHRva2VuSW5mbz86IHR5cGVzLlRva2VuSW5mbyk6IHN0cmluZyB7XG4gIGNvbnN0IHBhdGggPSB1dGlscy5nZXRGdWxsUGF0aCh7IHBhdGhUeXBlOiBQYXRoVHlwZS5TTElQMDAxMCwgcGF0aFN0cmluZzogYDQ0Jy81MDEnLyR7YWRkcmVzc0luZGV4fScvMCdgIH0pO1xuICBjb25zdCBTRVBhdGggPSBgMTEke3BhdGh9YDtcbiAgY29uc29sZS5kZWJ1ZygnU0VQYXRoOiAnLCBTRVBhdGgpO1xuICBsZXQgdG9rZW5JbmZvQXJncyA9ICcnO1xuICBpZiAodG9rZW5JbmZvKSB0b2tlbkluZm9BcmdzID0gZ2V0VG9rZW5JbmZvQXJncyh0b2tlbkluZm8pO1xuICBjb25zdCBjb21waWxlZE1lc3NhZ2UgPSByYXdUeC5jb21waWxlTWVzc2FnZSgpO1xuICBjb25zdCBoZWFkZXIgPSBjb21waWxlZE1lc3NhZ2Uuc2VyaWFsaXplSGVhZGVyKCk7XG4gIHJldHVybiBTRVBhdGggKyBoZWFkZXIgKyBjb21waWxlZE1lc3NhZ2Uuc2VyaWFsaXplVHJhbnNmZXJNZXNzYWdlKCkgKyB0b2tlbkluZm9BcmdzO1xufVxuXG5mdW5jdGlvbiBnZXRDcmVhdGVBbmRUcmFuc2ZlclNQTFRva2VuKHJhd1R4OiBUcmFuc2FjdGlvbiwgYWRkcmVzc0luZGV4OiBudW1iZXIsIHRva2VuSW5mbz86IHR5cGVzLlRva2VuSW5mbyk6IHN0cmluZyB7XG4gIGNvbnN0IHBhdGggPSB1dGlscy5nZXRGdWxsUGF0aCh7IHBhdGhUeXBlOiBQYXRoVHlwZS5TTElQMDAxMCwgcGF0aFN0cmluZzogYDQ0Jy81MDEnLyR7YWRkcmVzc0luZGV4fScvMCdgIH0pO1xuICBjb25zdCBTRVBhdGggPSBgMTEke3BhdGh9YDtcbiAgY29uc29sZS5kZWJ1ZygnU0VQYXRoOiAnLCBTRVBhdGgpO1xuICBsZXQgdG9rZW5JbmZvQXJncyA9ICcnO1xuICBpZiAodG9rZW5JbmZvKSB0b2tlbkluZm9BcmdzID0gZ2V0VG9rZW5JbmZvQXJncyh0b2tlbkluZm8pO1xuICBjb25zdCBjb21waWxlZE1lc3NhZ2UgPSByYXdUeC5jb21waWxlTWVzc2FnZSgpO1xuICBjb25zdCBoZWFkZXIgPSBjb21waWxlZE1lc3NhZ2Uuc2VyaWFsaXplSGVhZGVyKCk7XG4gIHJldHVybiBTRVBhdGggKyBoZWFkZXIgKyBjb21waWxlZE1lc3NhZ2Uuc2VyaWFsaXplQ3JlYXRlQW5kVHJhbnNmZXJTUExUb2tlbigpICsgdG9rZW5JbmZvQXJncztcbn1cblxuZnVuY3Rpb24gZ2V0VW5kZWxlZ2F0ZUFyZ3VtZW50cyhyYXdUeDogVHJhbnNhY3Rpb24sIGFkZHJlc3NJbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgY29uc3QgcGF0aCA9IHV0aWxzLmdldEZ1bGxQYXRoKHsgcGF0aFR5cGU6IFBhdGhUeXBlLlNMSVAwMDEwLCBwYXRoU3RyaW5nOiBgNDQnLzUwMScvJHthZGRyZXNzSW5kZXh9Jy8wJ2AgfSk7XG4gIGNvbnN0IFNFUGF0aCA9IGAxMSR7cGF0aH1gO1xuICBjb25zb2xlLmRlYnVnKCdTRVBhdGg6ICcsIFNFUGF0aCk7XG4gIGNvbnN0IGNvbXBpbGVkTWVzc2FnZSA9IHJhd1R4LmNvbXBpbGVNZXNzYWdlKCk7XG4gIGNvbnN0IGhlYWRlciA9IGNvbXBpbGVkTWVzc2FnZS5zZXJpYWxpemVIZWFkZXIoKTtcbiAgcmV0dXJuIFNFUGF0aCArIGhlYWRlciArIGNvbXBpbGVkTWVzc2FnZS5zZXJpYWxpemVVbmRlbGVnYXRlKCk7XG59XG5cbmZ1bmN0aW9uIGdldFdpdGhkcmF3QXJndW1lbnRzKHJhd1R4OiBUcmFuc2FjdGlvbiwgYWRkcmVzc0luZGV4OiBudW1iZXIpOiBzdHJpbmcge1xuICBjb25zdCBwYXRoID0gdXRpbHMuZ2V0RnVsbFBhdGgoeyBwYXRoVHlwZTogUGF0aFR5cGUuU0xJUDAwMTAsIHBhdGhTdHJpbmc6IGA0NCcvNTAxJy8ke2FkZHJlc3NJbmRleH0nLzAnYCB9KTtcbiAgY29uc3QgU0VQYXRoID0gYDExJHtwYXRofWA7XG4gIGNvbnNvbGUuZGVidWcoJ1NFUGF0aDogJywgU0VQYXRoKTtcbiAgY29uc3QgY29tcGlsZWRNZXNzYWdlID0gcmF3VHguY29tcGlsZU1lc3NhZ2UoKTtcbiAgY29uc3QgaGVhZGVyID0gY29tcGlsZWRNZXNzYWdlLnNlcmlhbGl6ZUhlYWRlcigpO1xuICByZXR1cm4gU0VQYXRoICsgaGVhZGVyICsgY29tcGlsZWRNZXNzYWdlLnNlcmlhbGl6ZVdpdGhkcmF3KCk7XG59XG5cbmZ1bmN0aW9uIGdldERlbGVnYXRlQW5kQ3JlYXRlQWNjb3VudEFyZ3VtZW50cyhyYXdUeDogVHJhbnNhY3Rpb24sIGFkZHJlc3NJbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgY29uc3QgcGF0aCA9IHV0aWxzLmdldEZ1bGxQYXRoKHsgcGF0aFR5cGU6IFBhdGhUeXBlLlNMSVAwMDEwLCBwYXRoU3RyaW5nOiBgNDQnLzUwMScvJHthZGRyZXNzSW5kZXh9Jy8wJ2AgfSk7XG4gIGNvbnN0IFNFUGF0aCA9IGAxMSR7cGF0aH1gO1xuICBjb25zb2xlLmRlYnVnKCdTRVBhdGg6ICcsIFNFUGF0aCk7XG4gIGNvbnN0IGNvbXBpbGVkTWVzc2FnZSA9IHJhd1R4LmNvbXBpbGVNZXNzYWdlKCk7XG4gIGNvbnN0IGhlYWRlciA9IGNvbXBpbGVkTWVzc2FnZS5zZXJpYWxpemVIZWFkZXIoKTtcbiAgcmV0dXJuIFNFUGF0aCArIGhlYWRlciArIGNvbXBpbGVkTWVzc2FnZS5zZXJpYWxpemVEZWxlZ2F0ZUFuZENyZWF0ZUFjY291bnRXaXRoU2VlZCgpO1xufVxuXG5mdW5jdGlvbiBnZXRTbWFydENvbnRyYWN0QXJndW1lbnRzKHJhd1R4OiBUcmFuc2FjdGlvbiwgYWRkcmVzc0luZGV4OiBudW1iZXIpOiBzdHJpbmcge1xuICBjb25zdCBwYXRoID0gdXRpbHMuZ2V0RnVsbFBhdGgoeyBwYXRoVHlwZTogUGF0aFR5cGUuU0xJUDAwMTAsIHBhdGhTdHJpbmc6IGA0NCcvNTAxJy8ke2FkZHJlc3NJbmRleH0nLzAnYCB9KTtcbiAgY29uc3QgU0VQYXRoID0gYDExJHtwYXRofWA7XG4gIGNvbnNvbGUuZGVidWcoJ1NFUGF0aDogJywgU0VQYXRoKTtcblxuICByZXR1cm4gU0VQYXRoICsgQnVmZmVyLmZyb20ocmF3VHguY29tcGlsZU1lc3NhZ2UoKS5zZXJpYWxpemUoKSkudG9TdHJpbmcoJ2hleCcpO1xufVxuXG5mdW5jdGlvbiBnZXRTaWduSW5Bcmd1bWVudHMobWVzc2FnZTogdHlwZXMuU2lnbkluTWVzc2FnZSwgYWRkcmVzc0luZGV4OiBudW1iZXIpOiBzdHJpbmcge1xuICBjb25zdCBQQVRIX0xFTkdUSCA9ICcxMSc7XG4gIGNvbnN0IHBhdGggPSB1dGlscy5nZXRGdWxsUGF0aCh7IHBhdGhUeXBlOiBQYXRoVHlwZS5TTElQMDAxMCwgcGF0aFN0cmluZzogYDQ0Jy81MDEnLyR7YWRkcmVzc0luZGV4fScvMCdgIH0pO1xuICBjb25zdCBTRVBhdGggPSBgJHtQQVRIX0xFTkdUSH0ke3BhdGh9YDtcbiAgY29uc29sZS5kZWJ1ZygnU0VQYXRoOiAnLCBTRVBhdGgpO1xuICBjb25zdCBhcmd1bWVudCA9IGNyZWF0ZVNpZ25Jbk1lc3NhZ2UobWVzc2FnZSwgcGF0aCk7XG4gIHJldHVybiBTRVBhdGggKyBhcmd1bWVudDtcbn1cblxuZnVuY3Rpb24gZ2V0U2lnbk1lc3NhZ2VBcmd1bWVudHMobWVzc2FnZTogc3RyaW5nLCBhZGRyZXNzSW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG4gIGNvbnN0IFBBVEhfTEVOR1RIID0gJzExJztcbiAgY29uc3QgcGF0aCA9IHV0aWxzLmdldEZ1bGxQYXRoKHsgcGF0aFR5cGU6IFBhdGhUeXBlLlNMSVAwMDEwLCBwYXRoU3RyaW5nOiBgNDQnLzUwMScvJHthZGRyZXNzSW5kZXh9Jy8wJ2AgfSk7XG4gIGNvbnN0IFNFUGF0aCA9IGAke1BBVEhfTEVOR1RIfSR7cGF0aH1gO1xuICBjb25zb2xlLmRlYnVnKCdTRVBhdGg6ICcsIFNFUGF0aCk7XG4gIGNvbnN0IGFyZ3VtZW50ID0gbWVzc2FnZS5zdGFydHNXaXRoKCcweCcpID8gbWVzc2FnZS5zbGljZSgyKSA6IG1lc3NhZ2U7XG4gIHJldHVybiBTRVBhdGggKyBhcmd1bWVudDtcbn1cblxuZnVuY3Rpb24gZ2V0U2lnblZlcnNpb25lZEFyZ3VtZW50cyhyYXdUeDogVmVyc2lvbmVkTWVzc2FnZSwgYWRkcmVzc0luZGV4OiBudW1iZXIpOiBzdHJpbmcge1xuICBjb25zdCBwYXRoID0gdXRpbHMuZ2V0RnVsbFBhdGgoeyBwYXRoVHlwZTogUGF0aFR5cGUuU0xJUDAwMTAsIHBhdGhTdHJpbmc6IGA0NCcvNTAxJy8ke2FkZHJlc3NJbmRleH0nLzAnYCB9KTtcbiAgY29uc3QgU0VQYXRoID0gYDExJHtwYXRofWA7XG4gIGNvbnNvbGUuZGVidWcoJ1NFUGF0aDogJywgU0VQYXRoKTtcbiAgcmV0dXJuIFNFUGF0aCArIEJ1ZmZlci5mcm9tKHJhd1R4LnNlcmlhbGl6ZSgpKS50b1N0cmluZygnaGV4Jyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTY3JpcHRTaWduaW5nUHJlQWN0aW9ucyhcbiAgc2lnbkRhdGE6IHR5cGVzLnNpZ25WZXJzaW9uZWRUcmFuc2FjdGlvbnMsXG4gIHNjcmlwdDogc3RyaW5nXG4pOiB7XG4gIHByZUFjdGlvbnM6IEFycmF5PCgpID0+IFByb21pc2U8dm9pZD4+O1xufSB7XG4gIGNvbnN0IHsgdHJhbnNwb3J0IH0gPSBzaWduRGF0YTtcblxuICBjb25zdCBwcmVBY3Rpb25zID0gW107XG4gIGNvbnN0IHNlbmRTY3JpcHQgPSBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgdHguY29tbWFuZC5zZW5kU2NyaXB0KHRyYW5zcG9ydCwgc2NyaXB0KTtcbiAgfTtcbiAgcHJlQWN0aW9ucy5wdXNoKHNlbmRTY3JpcHQpO1xuXG4gIHJldHVybiB7IHByZUFjdGlvbnMgfTtcbn1cblxuZnVuY3Rpb24gZ2V0U2NyaXB0U2lnbmluZ0FjdGlvbnMoc2lnbkRhdGE6IHR5cGVzLnNpZ25WZXJzaW9uZWRUcmFuc2FjdGlvbnMpOiB7XG4gIGFjdGlvbnM6IEFycmF5PCgpID0+IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPj47XG59IHtcbiAgY29uc3QgeyB0cmFuc3BvcnQsIGFwcFByaXZhdGVLZXksIGFwcElkLCBhZGRyZXNzSW5kZXggfSA9IHNpZ25EYXRhO1xuICBjb25zdCB2ZXJzaW9uZWRUeHMgPSBzaWduRGF0YS50cmFuc2FjdGlvbjtcbiAgY29uc3QgYWN0aW9ucyA9IHZlcnNpb25lZFR4cy5tYXAoKHZlcnNpb25lZFR4KSA9PiBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYXJndW1lbnQgPSBnZXRTaWduVmVyc2lvbmVkQXJndW1lbnRzKHZlcnNpb25lZFR4Lm1lc3NhZ2UsIGFkZHJlc3NJbmRleCk7XG4gICAgcmV0dXJuIHR4LmNvbW1hbmQuZXhlY3V0ZVNjcmlwdCh0cmFuc3BvcnQsIGFwcElkLCBhcHBQcml2YXRlS2V5LCBhcmd1bWVudCk7XG4gIH0pO1xuICByZXR1cm4geyBhY3Rpb25zIH07XG59XG5cbmV4cG9ydCB7XG4gIGdldFNwbFRva2VuVHJhbnNmZXJBcmd1bWVudHMsXG4gIGdldENyZWF0ZUFuZFRyYW5zZmVyU1BMVG9rZW4sXG4gIGdldFRyYW5zZmVyQXJndW1lbnRzLFxuICBnZXRTbWFydENvbnRyYWN0QXJndW1lbnRzLFxuICBnZXRVbmRlbGVnYXRlQXJndW1lbnRzLFxuICBnZXRXaXRoZHJhd0FyZ3VtZW50cyxcbiAgZ2V0RGVsZWdhdGVBbmRDcmVhdGVBY2NvdW50QXJndW1lbnRzLFxuICBnZXRTaWduSW5Bcmd1bWVudHMsXG4gIGdldFNpZ25NZXNzYWdlQXJndW1lbnRzLFxuICBnZXRTaWduVmVyc2lvbmVkQXJndW1lbnRzLFxuICBnZXRTY3JpcHRTaWduaW5nQWN0aW9ucyxcbn07XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsSUFBQUEsS0FBQSxHQUFBQyxPQUFBO0FBQ0EsSUFBQUMsT0FBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUsR0FBQSxHQUFBQyxzQkFBQSxDQUFBSCxPQUFBO0FBRUEsSUFBQUksT0FBQSxHQUFBSixPQUFBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTSyxvQkFBb0JBLENBQUNDLEtBQWtC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